summaryrefslogtreecommitdiff
path: root/indra
diff options
context:
space:
mode:
Diffstat (limited to 'indra')
-rw-r--r--indra/CMakeLists.txt5
-rw-r--r--indra/cmake/00-Common.cmake4
-rw-r--r--indra/cmake/FindGLH.cmake30
-rw-r--r--indra/cmake/GLH.cmake11
-rw-r--r--indra/cmake/LLRender.cmake2
-rw-r--r--indra/cmake/LLSharedLibs.cmake24
-rw-r--r--indra/cmake/LLTestCommand.cmake3
-rw-r--r--indra/cmake/Linking.cmake29
-rw-r--r--indra/cmake/OpenSSL.cmake2
-rw-r--r--indra/cmake/run_build_test.py30
-rw-r--r--indra/integration_tests/llui_libtest/CMakeLists.txt3
-rw-r--r--indra/lib/python/indra/util/llmanifest.py33
-rw-r--r--indra/linux_crash_logger/CMakeLists.txt1
-rw-r--r--indra/linux_crash_logger/llcrashloggerlinux.cpp6
-rw-r--r--indra/linux_crash_logger/llcrashloggerlinux.h1
-rw-r--r--indra/linux_updater/CMakeLists.txt6
-rw-r--r--indra/llaudio/llaudioengine.cpp23
-rw-r--r--indra/llaudio/llaudioengine.h1
-rw-r--r--indra/llaudio/llaudioengine_fmod.cpp2
-rw-r--r--indra/llaudio/llvorbisencode.cpp9
-rw-r--r--indra/llcharacter/llbvhloader.cpp3
-rw-r--r--indra/llcharacter/llkeyframemotionparam.cpp3
-rw-r--r--indra/llcharacter/llstatemachine.cpp3
-rw-r--r--indra/llcommon/CMakeLists.txt26
-rw-r--r--indra/llcommon/llapp.cpp4
-rw-r--r--indra/llcommon/llapr.cpp445
-rw-r--r--indra/llcommon/llapr.h107
-rw-r--r--indra/llcommon/llaprpool.cpp202
-rw-r--r--indra/llcommon/llaprpool.h256
-rw-r--r--indra/llcommon/llassettype.cpp3
-rw-r--r--indra/llcommon/llassettype.h8
-rw-r--r--indra/llcommon/llcommon.cpp13
-rw-r--r--indra/llcommon/llcommon.h2
-rw-r--r--indra/llcommon/llerror.cpp15
-rw-r--r--indra/llcommon/llerror.h1
-rw-r--r--indra/llcommon/llerrorcontrol.h4
-rw-r--r--indra/llcommon/llerrorthread.cpp7
-rw-r--r--indra/llcommon/lleventapi.cpp30
-rw-r--r--indra/llcommon/lleventapi.h83
-rw-r--r--indra/llcommon/llevents.cpp11
-rw-r--r--indra/llcommon/llfixedbuffer.cpp3
-rw-r--r--indra/llcommon/llinitparam.cpp469
-rw-r--r--indra/llcommon/llinitparam.h2295
-rw-r--r--indra/llcommon/llinstancetracker.h31
-rw-r--r--indra/llcommon/llleap.cpp459
-rw-r--r--indra/llcommon/llleap.h80
-rw-r--r--indra/llcommon/llleaplistener.cpp287
-rw-r--r--indra/llcommon/llleaplistener.h73
-rw-r--r--indra/llcommon/llmemory.cpp151
-rw-r--r--indra/llcommon/llmemory.h20
-rw-r--r--indra/llcommon/llpreprocessor.h1
-rw-r--r--indra/llcommon/llprocess.cpp1295
-rw-r--r--indra/llcommon/llprocess.h546
-rw-r--r--indra/llcommon/llprocesslauncher.cpp357
-rw-r--r--indra/llcommon/llprocesslauncher.h90
-rw-r--r--indra/llcommon/llqueuedthread.cpp11
-rw-r--r--indra/llcommon/llqueuedthread.h6
-rw-r--r--indra/llcommon/llregistry.h370
-rw-r--r--indra/llcommon/llscopedvolatileaprpool.h52
-rw-r--r--indra/llcommon/llsd.cpp212
-rw-r--r--indra/llcommon/llsd.h130
-rw-r--r--indra/llcommon/llsdparam.cpp342
-rw-r--r--indra/llcommon/llsdparam.h126
-rw-r--r--indra/llcommon/llsdserialize_xml.cpp3
-rw-r--r--indra/llcommon/llsortedvector.h152
-rw-r--r--indra/llcommon/llstreamqueue.cpp24
-rw-r--r--indra/llcommon/llstreamqueue.h240
-rw-r--r--indra/llcommon/llstring.cpp16
-rw-r--r--indra/llcommon/llstring.h593
-rw-r--r--indra/llcommon/llsys.cpp19
-rw-r--r--indra/llcommon/llthread.cpp244
-rw-r--r--indra/llcommon/llthread.h142
-rw-r--r--indra/llcommon/llthreadsafequeue.cpp15
-rw-r--r--indra/llcommon/llthreadsafequeue.h16
-rw-r--r--indra/llcommon/lltypeinfolookup.h112
-rw-r--r--indra/llcommon/llversionviewer.h4
-rw-r--r--indra/llcommon/llworkerthread.cpp14
-rw-r--r--indra/llcommon/llworkerthread.h7
-rw-r--r--indra/llcommon/stdenums.h5
-rw-r--r--indra/llcommon/tests/StringVec.h37
-rw-r--r--indra/llcommon/tests/listener.h21
-rw-r--r--indra/llcommon/tests/llinstancetracker_test.cpp69
-rw-r--r--indra/llcommon/tests/llleap_test.cpp694
-rw-r--r--indra/llcommon/tests/llprocess_test.cpp1262
-rw-r--r--indra/llcommon/tests/llsdserialize_test.cpp274
-rw-r--r--indra/llcommon/tests/llstreamqueue_test.cpp197
-rw-r--r--indra/llcommon/tests/llstring_test.cpp118
-rw-r--r--indra/llcommon/tests/setpython.py19
-rw-r--r--indra/llcommon/tests/wrapllerrs.h93
-rw-r--r--indra/llcrashlogger/llcrashlogger.cpp10
-rw-r--r--indra/llcrashlogger/llcrashlogger.h3
-rw-r--r--indra/llimage/llimage.cpp10
-rw-r--r--indra/llimage/llimagedimensionsinfo.cpp2
-rw-r--r--indra/llimage/llimagedxt.cpp1
-rw-r--r--indra/llimage/llimagej2c.cpp4
-rw-r--r--indra/llimage/llimageworker.cpp10
-rw-r--r--indra/llimage/llimageworker.h4
-rw-r--r--indra/llinventory/lleconomy.cpp27
-rw-r--r--indra/llinventory/lleconomy.h16
-rw-r--r--indra/llinventory/llinventorytype.cpp5
-rw-r--r--indra/llinventory/llinventorytype.h3
-rw-r--r--indra/llmath/CMakeLists.txt4
-rw-r--r--indra/llmath/lloctree.h38
-rw-r--r--indra/llmath/llv4math.h141
-rw-r--r--indra/llmath/llv4matrix3.h220
-rw-r--r--indra/llmath/llv4matrix4.h249
-rw-r--r--indra/llmath/llv4vector3.h80
-rw-r--r--indra/llmath/llvolume.cpp102
-rw-r--r--indra/llmath/llvolume.h4
-rw-r--r--indra/llmath/llvolumemgr.cpp4
-rw-r--r--indra/llmessage/llares.cpp17
-rw-r--r--indra/llmessage/llassetstorage.cpp30
-rw-r--r--indra/llmessage/llbuffer.cpp90
-rw-r--r--indra/llmessage/llbuffer.h25
-rw-r--r--indra/llmessage/llbufferstream.cpp8
-rw-r--r--indra/llmessage/llcurl.cpp688
-rw-r--r--[-rwxr-xr-x]indra/llmessage/llcurl.h137
-rw-r--r--indra/llmessage/llhttpassetstorage.cpp10
-rw-r--r--indra/llmessage/llhttpclient.cpp12
-rw-r--r--indra/llmessage/lliohttpserver.cpp14
-rw-r--r--indra/llmessage/lliohttpserver.h2
-rw-r--r--indra/llmessage/lliopipe.cpp6
-rw-r--r--indra/llmessage/lliopipe.h2
-rw-r--r--indra/llmessage/lliosocket.cpp102
-rw-r--r--indra/llmessage/lliosocket.h37
-rw-r--r--indra/llmessage/llmail.cpp17
-rw-r--r--indra/llmessage/llmail.h4
-rw-r--r--indra/llmessage/llproxy.cpp4
-rw-r--r--indra/llmessage/llpumpio.cpp121
-rw-r--r--indra/llmessage/llpumpio.h44
-rw-r--r--indra/llmessage/llsdmessagereader.cpp3
-rw-r--r--indra/llmessage/llsdrpcclient.h22
-rw-r--r--indra/llmessage/llurlrequest.cpp61
-rw-r--r--indra/llmessage/llurlrequest.h2
-rw-r--r--indra/llmessage/message.cpp17
-rw-r--r--indra/llmessage/tests/llsdmessage_test.cpp36
-rw-r--r--indra/llmessage/tests/networkio.h9
-rw-r--r--indra/llplugin/llpluginclassmedia.cpp8
-rw-r--r--indra/llplugin/llpluginclassmedia.h5
-rw-r--r--indra/llplugin/llplugininstance.cpp6
-rw-r--r--indra/llplugin/llplugininstance.h4
-rw-r--r--indra/llplugin/llpluginmessagepipe.cpp53
-rw-r--r--indra/llplugin/llpluginmessagepipe.h3
-rw-r--r--indra/llplugin/llpluginprocesschild.cpp2
-rw-r--r--indra/llplugin/llpluginprocessparent.cpp104
-rw-r--r--indra/llplugin/llpluginprocessparent.h24
-rw-r--r--indra/llplugin/llpluginsharedmemory.cpp9
-rw-r--r--indra/llplugin/llpluginsharedmemory.h3
-rw-r--r--indra/llplugin/slplugin/slplugin.cpp4
-rw-r--r--indra/llprimitive/llmaterialtable.cpp2
-rw-r--r--indra/llprimitive/llmodel.cpp9
-rw-r--r--indra/llprimitive/lltextureanim.cpp4
-rw-r--r--indra/llprimitive/llvolumexml.cpp19
-rw-r--r--indra/llprimitive/llvolumexml.h6
-rw-r--r--indra/llrender/llcubemap.cpp25
-rw-r--r--indra/llrender/llfontfreetype.cpp7
-rw-r--r--indra/llrender/llfontgl.cpp12
-rw-r--r--indra/llrender/llgl.cpp334
-rw-r--r--indra/llrender/llgl.h15
-rw-r--r--indra/llrender/llglheaders.h52
-rw-r--r--indra/llrender/llglslshader.cpp64
-rw-r--r--indra/llrender/llglslshader.h11
-rw-r--r--indra/llrender/llimagegl.cpp112
-rw-r--r--indra/llrender/llpostprocess.cpp22
-rw-r--r--indra/llrender/llrender.cpp765
-rw-r--r--indra/llrender/llrender.h62
-rw-r--r--indra/llrender/llrendersphere.cpp98
-rw-r--r--indra/llrender/llrendersphere.h5
-rw-r--r--indra/llrender/llrendertarget.cpp115
-rw-r--r--indra/llrender/llrendertarget.h2
-rw-r--r--indra/llrender/llshadermgr.cpp377
-rw-r--r--indra/llrender/llshadermgr.h128
-rw-r--r--indra/llrender/llvertexbuffer.cpp1549
-rw-r--r--indra/llrender/llvertexbuffer.h133
-rw-r--r--indra/llui/CMakeLists.txt19
-rw-r--r--indra/llui/llaccordionctrltab.cpp2
-rw-r--r--indra/llui/llbutton.cpp176
-rw-r--r--indra/llui/llbutton.h47
-rw-r--r--indra/llui/llclipboard.cpp6
-rw-r--r--indra/llui/llclipboard.h9
-rw-r--r--indra/llui/llcommandmanager.cpp172
-rw-r--r--indra/llui/llcommandmanager.h202
-rw-r--r--indra/llui/lldockablefloater.cpp24
-rw-r--r--indra/llui/lldockablefloater.h4
-rw-r--r--indra/llui/lldockcontrol.cpp67
-rw-r--r--indra/llui/lldockcontrol.h4
-rw-r--r--indra/llui/llfloater.cpp370
-rw-r--r--indra/llui/llfloater.h90
-rw-r--r--indra/llui/llfloaterreg.cpp189
-rw-r--r--indra/llui/llfloaterreg.h9
-rw-r--r--indra/llui/llhandle.h67
-rw-r--r--indra/llui/llhelp.h1
-rw-r--r--indra/llui/llkeywords.cpp81
-rw-r--r--indra/llui/llkeywords.h33
-rw-r--r--indra/llui/lllayoutstack.cpp902
-rw-r--r--indra/llui/lllayoutstack.h125
-rw-r--r--indra/llui/lllineeditor.cpp1
-rw-r--r--indra/llui/lllineeditor.h2
-rw-r--r--indra/llui/llloadingindicator.cpp7
-rw-r--r--indra/llui/llloadingindicator.h4
-rw-r--r--indra/llui/llmenugl.cpp14
-rw-r--r--indra/llui/llmenugl.h6
-rw-r--r--indra/llui/llnotifications.cpp74
-rw-r--r--indra/llui/llnotifications.h4
-rw-r--r--indra/llui/llnotificationtemplate.h6
-rw-r--r--indra/llui/llnotificationvisibilityrule.h2
-rw-r--r--indra/llui/llpanel.cpp2
-rw-r--r--indra/llui/llpanel.h8
-rw-r--r--indra/llui/llresizebar.cpp4
-rw-r--r--indra/llui/llresizebar.h1
-rw-r--r--indra/llui/llresizehandle.h2
-rw-r--r--indra/llui/llscrollcontainer.cpp108
-rw-r--r--indra/llui/llscrollcontainer.h1
-rw-r--r--indra/llui/llscrolllistcolumn.h4
-rw-r--r--indra/llui/llscrolllistctrl.cpp8
-rw-r--r--indra/llui/llscrolllistctrl.h2
-rw-r--r--indra/llui/llsdparam.cpp314
-rw-r--r--indra/llui/llsdparam.h113
-rw-r--r--indra/llui/llspinctrl.h3
-rw-r--r--indra/llui/lltabcontainer.cpp212
-rw-r--r--indra/llui/lltabcontainer.h6
-rw-r--r--indra/llui/lltextbase.cpp48
-rw-r--r--indra/llui/lltextbase.h6
-rw-r--r--indra/llui/lltexteditor.cpp26
-rw-r--r--indra/llui/lltexteditor.h5
-rw-r--r--indra/llui/lltextparser.cpp2
-rw-r--r--indra/llui/lltoolbar.cpp1230
-rw-r--r--indra/llui/lltoolbar.h290
-rw-r--r--indra/llui/lltooltip.cpp2
-rw-r--r--indra/llui/lltrans.cpp (renamed from indra/llxuixml/lltrans.cpp)0
-rw-r--r--indra/llui/lltrans.h (renamed from indra/llxuixml/lltrans.h)0
-rw-r--r--indra/llui/llui.cpp82
-rw-r--r--indra/llui/llui.h119
-rw-r--r--indra/llui/lluicolor.cpp (renamed from indra/llxuixml/lluicolor.cpp)0
-rw-r--r--indra/llui/lluicolor.h (renamed from indra/llxuixml/lluicolor.h)0
-rw-r--r--indra/llui/lluicolortable.h2
-rw-r--r--indra/llui/lluictrl.cpp27
-rw-r--r--indra/llui/lluictrl.h14
-rw-r--r--indra/llui/lluictrlfactory.h4
-rw-r--r--indra/llui/llurlaction.cpp28
-rw-r--r--indra/llui/llurlaction.h21
-rw-r--r--indra/llui/llview.cpp683
-rw-r--r--indra/llui/llview.h96
-rw-r--r--indra/llui/llviewinject.cpp49
-rw-r--r--indra/llui/llviewinject.h56
-rw-r--r--indra/llui/llwindowshade.cpp210
-rw-r--r--indra/llui/llwindowshade.h16
-rw-r--r--indra/llui/llxuiparser.cpp1756
-rw-r--r--indra/llui/llxuiparser.h242
-rw-r--r--indra/llui/tests/llurlentry_stub.cpp25
-rw-r--r--indra/llui/tests/llurlentry_test.cpp16
-rw-r--r--indra/llui/tests/llurlmatch_test.cpp41
-rw-r--r--indra/llvfs/lllfsthread.cpp10
-rw-r--r--indra/llvfs/llvfs.cpp5
-rw-r--r--indra/llwindow/CMakeLists.txt2
-rw-r--r--indra/llwindow/llmousehandler.h2
-rw-r--r--indra/llwindow/llwindow.cpp42
-rw-r--r--indra/llwindow/llwindow.h13
-rw-r--r--indra/llwindow/llwindowheadless.h4
-rw-r--r--indra/llwindow/llwindowlistener.cpp307
-rw-r--r--indra/llwindow/llwindowlistener.h55
-rw-r--r--indra/llwindow/llwindowmacosx.cpp231
-rw-r--r--indra/llwindow/llwindowmacosx.h4
-rw-r--r--indra/llwindow/llwindowmesaheadless.h4
-rw-r--r--indra/llwindow/llwindowsdl.cpp48
-rw-r--r--indra/llwindow/llwindowsdl.h5
-rw-r--r--indra/llwindow/llwindowwin32.cpp119
-rw-r--r--indra/llwindow/llwindowwin32.h4
-rw-r--r--indra/llxml/llcontrol.h3
-rw-r--r--indra/llxml/llxmlnode.cpp10
-rw-r--r--indra/llxuixml/CMakeLists.txt45
-rw-r--r--indra/llxuixml/llinitparam.cpp490
-rw-r--r--indra/llxuixml/llinitparam.h1913
-rw-r--r--indra/llxuixml/llregistry.h351
-rw-r--r--indra/llxuixml/llxuiparser.cpp1503
-rw-r--r--indra/llxuixml/llxuiparser.h244
-rw-r--r--indra/mac_crash_logger/llcrashloggermac.cpp1
-rw-r--r--indra/media_plugins/gstreamer010/llmediaimplgstreamer.h1
-rw-r--r--indra/media_plugins/gstreamer010/llmediaimplgstreamer_syms.cpp15
-rw-r--r--indra/media_plugins/webkit/linux_volume_catcher.cpp14
-rw-r--r--indra/media_plugins/webkit/media_plugin_webkit.cpp48
-rw-r--r--indra/newview/CMakeLists.txt92
-rw-r--r--indra/newview/app_settings/cmd_line.xml384
-rw-r--r--indra/newview/app_settings/commands.xml250
-rw-r--r--indra/newview/app_settings/keywords.ini86
-rw-r--r--indra/newview/app_settings/logcontrol.xml2
-rw-r--r--[-rwxr-xr-x]indra/newview/app_settings/settings.xml837
-rw-r--r--indra/newview/app_settings/settings_minimal.xml475
-rw-r--r--indra/newview/app_settings/settings_per_account.xml11
-rw-r--r--indra/newview/app_settings/shaders/class1/avatar/avatarSkinV.glsl3
-rw-r--r--indra/newview/app_settings/shaders/class1/avatar/avatarV.glsl37
-rw-r--r--indra/newview/app_settings/shaders/class1/avatar/eyeballV.glsl26
-rw-r--r--indra/newview/app_settings/shaders/class1/avatar/objectSkinV.glsl6
-rw-r--r--indra/newview/app_settings/shaders/class1/avatar/pickAvatarF.glsl9
-rw-r--r--indra/newview/app_settings/shaders/class1/avatar/pickAvatarV.glsl23
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl39
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/alphaNonIndexedF.glsl22
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/alphaNonIndexedNoColorF.glsl84
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/alphaSkinnedV.glsl77
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/alphaV.glsl88
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/attachmentShadowF.glsl8
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/attachmentShadowV.glsl18
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/avatarAlphaV.glsl79
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/avatarEyesV.glsl21
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/avatarF.glsl9
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/avatarShadowF.glsl7
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/avatarShadowV.glsl27
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/avatarV.glsl29
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/blurLightF.glsl32
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/blurLightMSF.glsl131
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/blurLightV.glsl10
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/bumpF.glsl21
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/bumpSkinnedV.glsl30
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/bumpV.glsl28
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/cloudsF.glsl22
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/cloudsV.glsl40
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/cofF.glsl88
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/diffuseAlphaMaskF.glsl16
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/diffuseAlphaMaskIndexedF.glsl16
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/diffuseAlphaMaskNoColorF.glsl52
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/diffuseF.glsl14
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/diffuseIndexedF.glsl16
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/diffuseNoColorV.glsl45
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/diffuseSkinnedV.glsl25
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/diffuseV.glsl27
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/dofCombineF.glsl67
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/emissiveF.glsl50
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/emissiveV.glsl63
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/fullbrightF.glsl9
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/fullbrightV.glsl30
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/fxaaF.glsl2118
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/giF.glsl10
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/giV.glsl18
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/impostorF.glsl17
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/impostorV.glsl14
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/luminanceF.glsl10
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/luminanceV.glsl16
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/multiPointLightF.glsl12
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/multiPointLightMSF.glsl155
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/multiPointLightV.glsl7
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/multiSpotLightF.glsl26
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/multiSpotLightMSF.glsl250
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/normgenF.glsl56
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/normgenV.glsl36
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/pointLightF.glsl25
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/pointLightMSF.glsl126
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/pointLightV.glsl14
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/postDeferredF.glsl123
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/postDeferredMSF.glsl151
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/postDeferredNoDoFF.glsl11
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/postDeferredNoDoFMSF.glsl55
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/postDeferredV.glsl15
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/postgiF.glsl12
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/postgiV.glsl9
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/shadowAlphaMaskF.glsl15
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/shadowAlphaMaskV.glsl22
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/shadowF.glsl6
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/shadowV.glsl8
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/skyF.glsl6
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/skyV.glsl16
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl34
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/softenLightMSF.glsl342
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/softenLightV.glsl16
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/spotLightF.glsl28
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/spotLightMSF.glsl252
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/starsF.glsl9
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/starsV.glsl15
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/sunLightF.glsl6
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/sunLightMSF.glsl35
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/sunLightSSAOF.glsl8
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/sunLightSSAOMSF.glsl140
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/sunLightV.glsl18
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/terrainF.glsl24
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/terrainV.glsl32
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/treeF.glsl19
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/treeShadowF.glsl49
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/treeShadowV.glsl45
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/treeV.glsl20
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/waterF.glsl14
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/waterV.glsl39
-rw-r--r--indra/newview/app_settings/shaders/class1/effects/glowExtractF.glsl12
-rw-r--r--indra/newview/app_settings/shaders/class1/effects/glowExtractMSF.glsl56
-rw-r--r--indra/newview/app_settings/shaders/class1/effects/glowExtractV.glsl9
-rw-r--r--indra/newview/app_settings/shaders/class1/effects/glowF.glsl25
-rw-r--r--indra/newview/app_settings/shaders/class1/effects/glowV.glsl26
-rw-r--r--indra/newview/app_settings/shaders/class1/environment/terrainF.glsl45
-rw-r--r--indra/newview/app_settings/shaders/class1/environment/terrainV.glsl51
-rw-r--r--indra/newview/app_settings/shaders/class1/environment/terrainWaterF.glsl48
-rw-r--r--indra/newview/app_settings/shaders/class1/environment/underWaterF.glsl83
-rw-r--r--indra/newview/app_settings/shaders/class1/environment/waterF.glsl90
-rw-r--r--indra/newview/app_settings/shaders/class1/environment/waterFogF.glsl50
-rw-r--r--indra/newview/app_settings/shaders/class1/environment/waterV.glsl30
-rw-r--r--indra/newview/app_settings/shaders/class1/interface/alphamaskF.glsl46
-rw-r--r--indra/newview/app_settings/shaders/class1/interface/alphamaskV.glsl42
-rw-r--r--indra/newview/app_settings/shaders/class1/interface/customalphaF.glsl11
-rw-r--r--indra/newview/app_settings/shaders/class1/interface/customalphaV.glsl15
-rw-r--r--indra/newview/app_settings/shaders/class1/interface/debugF.glsl35
-rw-r--r--indra/newview/app_settings/shaders/class1/interface/debugV.glsl34
-rw-r--r--indra/newview/app_settings/shaders/class1/interface/glowcombineF.glsl13
-rw-r--r--indra/newview/app_settings/shaders/class1/interface/glowcombineFXAAF.glsl42
-rw-r--r--indra/newview/app_settings/shaders/class1/interface/glowcombineFXAAV.glsl39
-rw-r--r--indra/newview/app_settings/shaders/class1/interface/glowcombineV.glsl16
-rw-r--r--indra/newview/app_settings/shaders/class1/interface/highlightF.glsl9
-rw-r--r--indra/newview/app_settings/shaders/class1/interface/highlightV.glsl23
-rw-r--r--indra/newview/app_settings/shaders/class1/interface/occlusionF.glsl4
-rw-r--r--indra/newview/app_settings/shaders/class1/interface/occlusionV.glsl6
-rw-r--r--indra/newview/app_settings/shaders/class1/interface/onetexturenocolorF.glsl37
-rw-r--r--indra/newview/app_settings/shaders/class1/interface/onetexturenocolorV.glsl38
-rw-r--r--indra/newview/app_settings/shaders/class1/interface/solidcolorF.glsl13
-rw-r--r--indra/newview/app_settings/shaders/class1/interface/solidcolorV.glsl13
-rw-r--r--indra/newview/app_settings/shaders/class1/interface/splattexturerectF.glsl40
-rw-r--r--indra/newview/app_settings/shaders/class1/interface/splattexturerectV.glsl41
-rw-r--r--indra/newview/app_settings/shaders/class1/interface/twotextureaddF.glsl11
-rw-r--r--indra/newview/app_settings/shaders/class1/interface/twotextureaddV.glsl13
-rw-r--r--indra/newview/app_settings/shaders/class1/interface/uiF.glsl11
-rw-r--r--indra/newview/app_settings/shaders/class1/interface/uiV.glsl16
-rw-r--r--indra/newview/app_settings/shaders/class1/lighting/lightAlphaMaskF.glsl53
-rw-r--r--indra/newview/app_settings/shaders/class1/lighting/lightAlphaMaskNonIndexedF.glsl55
-rw-r--r--indra/newview/app_settings/shaders/class1/lighting/lightF.glsl17
-rw-r--r--indra/newview/app_settings/shaders/class1/lighting/lightFullbrightAlphaMaskF.glsl53
-rw-r--r--indra/newview/app_settings/shaders/class1/lighting/lightFullbrightF.glsl17
-rw-r--r--indra/newview/app_settings/shaders/class1/lighting/lightFullbrightNonIndexedAlphaMaskF.glsl55
-rw-r--r--indra/newview/app_settings/shaders/class1/lighting/lightFullbrightNonIndexedF.glsl48
-rw-r--r--indra/newview/app_settings/shaders/class1/lighting/lightFullbrightShinyF.glsl28
-rw-r--r--indra/newview/app_settings/shaders/class1/lighting/lightFullbrightShinyNonIndexedF.glsl56
-rw-r--r--indra/newview/app_settings/shaders/class1/lighting/lightFullbrightShinyWaterF.glsl27
-rw-r--r--indra/newview/app_settings/shaders/class1/lighting/lightFullbrightShinyWaterNonIndexedF.glsl54
-rw-r--r--indra/newview/app_settings/shaders/class1/lighting/lightFullbrightWaterAlphaMaskF.glsl53
-rw-r--r--indra/newview/app_settings/shaders/class1/lighting/lightFullbrightWaterF.glsl17
-rw-r--r--indra/newview/app_settings/shaders/class1/lighting/lightFullbrightWaterNonIndexedAlphaMaskF.glsl53
-rw-r--r--indra/newview/app_settings/shaders/class1/lighting/lightFullbrightWaterNonIndexedF.glsl46
-rw-r--r--indra/newview/app_settings/shaders/class1/lighting/lightNonIndexedF.glsl48
-rw-r--r--indra/newview/app_settings/shaders/class1/lighting/lightShinyF.glsl25
-rw-r--r--indra/newview/app_settings/shaders/class1/lighting/lightShinyNonIndexedF.glsl55
-rw-r--r--indra/newview/app_settings/shaders/class1/lighting/lightShinyWaterF.glsl24
-rw-r--r--indra/newview/app_settings/shaders/class1/lighting/lightShinyWaterNonIndexedF.glsl52
-rw-r--r--indra/newview/app_settings/shaders/class1/lighting/lightSpecularV.glsl20
-rw-r--r--indra/newview/app_settings/shaders/class1/lighting/lightV.glsl16
-rw-r--r--indra/newview/app_settings/shaders/class1/lighting/lightWaterAlphaMaskF.glsl51
-rw-r--r--indra/newview/app_settings/shaders/class1/lighting/lightWaterAlphaMaskNonIndexedF.glsl55
-rw-r--r--indra/newview/app_settings/shaders/class1/lighting/lightWaterF.glsl19
-rw-r--r--indra/newview/app_settings/shaders/class1/lighting/lightWaterNonIndexedF.glsl46
-rw-r--r--indra/newview/app_settings/shaders/class1/lighting/sumLightsSpecularV.glsl13
-rw-r--r--indra/newview/app_settings/shaders/class1/lighting/sumLightsV.glsl7
-rw-r--r--indra/newview/app_settings/shaders/class1/objects/bumpF.glsl13
-rw-r--r--indra/newview/app_settings/shaders/class1/objects/bumpV.glsl18
-rw-r--r--indra/newview/app_settings/shaders/class1/objects/emissiveSkinnedV.glsl58
-rw-r--r--indra/newview/app_settings/shaders/class1/objects/emissiveV.glsl56
-rw-r--r--indra/newview/app_settings/shaders/class1/objects/fullbrightF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/objects/fullbrightNoColorV.glsl53
-rw-r--r--indra/newview/app_settings/shaders/class1/objects/fullbrightShinySkinnedV.glsl31
-rw-r--r--indra/newview/app_settings/shaders/class1/objects/fullbrightShinyV.glsl36
-rw-r--r--indra/newview/app_settings/shaders/class1/objects/fullbrightSkinnedV.glsl27
-rw-r--r--indra/newview/app_settings/shaders/class1/objects/fullbrightV.glsl27
-rw-r--r--indra/newview/app_settings/shaders/class1/objects/impostorF.glsl16
-rw-r--r--indra/newview/app_settings/shaders/class1/objects/impostorV.glsl18
-rw-r--r--indra/newview/app_settings/shaders/class1/objects/indexedTextureF.glsl33
-rw-r--r--indra/newview/app_settings/shaders/class1/objects/indexedTextureV.glsl34
-rw-r--r--indra/newview/app_settings/shaders/class1/objects/nonindexedTextureV.glsl31
-rw-r--r--indra/newview/app_settings/shaders/class1/objects/previewV.glsl57
-rw-r--r--indra/newview/app_settings/shaders/class1/objects/shinySimpleSkinnedV.glsl30
-rw-r--r--indra/newview/app_settings/shaders/class1/objects/shinyV.glsl45
-rw-r--r--indra/newview/app_settings/shaders/class1/objects/simpleNoColorV.glsl59
-rw-r--r--indra/newview/app_settings/shaders/class1/objects/simpleNonIndexedV.glsl61
-rw-r--r--indra/newview/app_settings/shaders/class1/objects/simpleSkinnedV.glsl29
-rw-r--r--indra/newview/app_settings/shaders/class1/objects/simpleTexGenV.glsl77
-rw-r--r--indra/newview/app_settings/shaders/class1/objects/simpleV.glsl33
-rw-r--r--indra/newview/app_settings/shaders/class1/objects/treeV.glsl60
-rw-r--r--indra/newview/app_settings/shaders/class1/windlight/atmosphericsHelpersV.glsl9
-rw-r--r--indra/newview/app_settings/shaders/class1/windlight/atmosphericsVarsF.glsl5
-rw-r--r--indra/newview/app_settings/shaders/class1/windlight/atmosphericsVarsV.glsl7
-rw-r--r--indra/newview/app_settings/shaders/class1/windlight/atmosphericsVarsWaterF.glsl33
-rw-r--r--indra/newview/app_settings/shaders/class1/windlight/atmosphericsVarsWaterV.glsl37
-rw-r--r--indra/newview/app_settings/shaders/class2/avatar/eyeballV.glsl30
-rw-r--r--indra/newview/app_settings/shaders/class2/deferred/alphaF.glsl40
-rw-r--r--indra/newview/app_settings/shaders/class2/deferred/alphaNonIndexedF.glsl28
-rw-r--r--indra/newview/app_settings/shaders/class2/deferred/alphaNonIndexedNoColorF.glsl142
-rw-r--r--indra/newview/app_settings/shaders/class2/deferred/alphaSkinnedV.glsl85
-rw-r--r--indra/newview/app_settings/shaders/class2/deferred/alphaV.glsl90
-rw-r--r--indra/newview/app_settings/shaders/class2/deferred/avatarAlphaV.glsl80
-rw-r--r--indra/newview/app_settings/shaders/class2/deferred/edgeF.glsl81
-rw-r--r--indra/newview/app_settings/shaders/class2/deferred/edgeMSF.glsl92
-rw-r--r--indra/newview/app_settings/shaders/class2/deferred/edgeV.glsl37
-rw-r--r--indra/newview/app_settings/shaders/class2/deferred/multiSpotLightF.glsl28
-rw-r--r--indra/newview/app_settings/shaders/class2/deferred/multiSpotLightMSF.glsl262
-rw-r--r--indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl32
-rw-r--r--indra/newview/app_settings/shaders/class2/deferred/softenLightMSF.glsl337
-rw-r--r--indra/newview/app_settings/shaders/class2/deferred/softenLightV.glsl18
-rw-r--r--indra/newview/app_settings/shaders/class2/deferred/spotLightF.glsl19
-rw-r--r--indra/newview/app_settings/shaders/class2/deferred/spotLightMSF.glsl263
-rw-r--r--indra/newview/app_settings/shaders/class2/deferred/sunLightF.glsl14
-rw-r--r--indra/newview/app_settings/shaders/class2/deferred/sunLightMSF.glsl220
-rw-r--r--indra/newview/app_settings/shaders/class2/deferred/sunLightSSAOF.glsl55
-rw-r--r--indra/newview/app_settings/shaders/class2/deferred/sunLightSSAOMSF.glsl258
-rw-r--r--indra/newview/app_settings/shaders/class2/deferred/sunLightV.glsl20
-rw-r--r--indra/newview/app_settings/shaders/class2/effects/blurF.glsl51
-rw-r--r--indra/newview/app_settings/shaders/class2/effects/blurV.glsl55
-rw-r--r--indra/newview/app_settings/shaders/class2/effects/colorFilterF.glsl51
-rw-r--r--indra/newview/app_settings/shaders/class2/effects/drawQuadV.glsl34
-rw-r--r--indra/newview/app_settings/shaders/class2/effects/extractF.glsl42
-rw-r--r--indra/newview/app_settings/shaders/class2/effects/nightVisionF.glsl62
-rw-r--r--indra/newview/app_settings/shaders/class2/effects/simpleF.glsl34
-rw-r--r--indra/newview/app_settings/shaders/class2/environment/terrainF.glsl58
-rw-r--r--indra/newview/app_settings/shaders/class2/environment/terrainV.glsl72
-rw-r--r--indra/newview/app_settings/shaders/class2/environment/terrainWaterF.glsl59
-rw-r--r--indra/newview/app_settings/shaders/class2/environment/underWaterF.glsl108
-rw-r--r--indra/newview/app_settings/shaders/class2/environment/waterF.glsl137
-rw-r--r--indra/newview/app_settings/shaders/class2/environment/waterFogF.glsl74
-rw-r--r--indra/newview/app_settings/shaders/class2/lighting/lightAlphaMaskF.glsl48
-rw-r--r--indra/newview/app_settings/shaders/class2/lighting/lightAlphaMaskNonIndexedF.glsl51
-rw-r--r--indra/newview/app_settings/shaders/class2/lighting/lightF.glsl41
-rw-r--r--indra/newview/app_settings/shaders/class2/lighting/lightFullbrightAlphaMaskF.glsl47
-rw-r--r--indra/newview/app_settings/shaders/class2/lighting/lightFullbrightF.glsl41
-rw-r--r--indra/newview/app_settings/shaders/class2/lighting/lightFullbrightNonIndexedAlphaMaskF.glsl49
-rw-r--r--indra/newview/app_settings/shaders/class2/lighting/lightFullbrightNonIndexedF.glsl43
-rw-r--r--indra/newview/app_settings/shaders/class2/lighting/lightFullbrightShinyF.glsl49
-rw-r--r--indra/newview/app_settings/shaders/class2/lighting/lightFullbrightShinyNonIndexedF.glsl50
-rw-r--r--indra/newview/app_settings/shaders/class2/lighting/lightFullbrightShinyWaterF.glsl48
-rw-r--r--indra/newview/app_settings/shaders/class2/lighting/lightFullbrightShinyWaterNonIndexedF.glsl49
-rw-r--r--indra/newview/app_settings/shaders/class2/lighting/lightFullbrightWaterAlphaMaskF.glsl47
-rw-r--r--indra/newview/app_settings/shaders/class2/lighting/lightFullbrightWaterF.glsl41
-rw-r--r--indra/newview/app_settings/shaders/class2/lighting/lightFullbrightWaterNonIndexedAlphaMaskF.glsl47
-rw-r--r--indra/newview/app_settings/shaders/class2/lighting/lightFullbrightWaterNonIndexedF.glsl41
-rw-r--r--indra/newview/app_settings/shaders/class2/lighting/lightNonIndexedF.glsl43
-rw-r--r--indra/newview/app_settings/shaders/class2/lighting/lightShinyF.glsl49
-rw-r--r--indra/newview/app_settings/shaders/class2/lighting/lightShinyNonIndexedF.glsl50
-rw-r--r--indra/newview/app_settings/shaders/class2/lighting/lightShinyWaterF.glsl46
-rw-r--r--indra/newview/app_settings/shaders/class2/lighting/lightShinyWaterNonIndexedF.glsl47
-rw-r--r--indra/newview/app_settings/shaders/class2/lighting/lightSpecularV.glsl36
-rw-r--r--indra/newview/app_settings/shaders/class2/lighting/lightV.glsl36
-rw-r--r--indra/newview/app_settings/shaders/class2/lighting/lightWaterAlphaMaskF.glsl45
-rw-r--r--indra/newview/app_settings/shaders/class2/lighting/lightWaterAlphaMaskNonIndexedF.glsl49
-rw-r--r--indra/newview/app_settings/shaders/class2/lighting/lightWaterF.glsl39
-rw-r--r--indra/newview/app_settings/shaders/class2/lighting/lightWaterNonIndexedF.glsl41
-rw-r--r--indra/newview/app_settings/shaders/class2/lighting/sumLightsSpecularV.glsl13
-rw-r--r--indra/newview/app_settings/shaders/class2/lighting/sumLightsV.glsl17
-rw-r--r--indra/newview/app_settings/shaders/class2/objects/fullbrightShinyV.glsl53
-rw-r--r--indra/newview/app_settings/shaders/class2/objects/fullbrightV.glsl47
-rw-r--r--indra/newview/app_settings/shaders/class2/objects/shinyV.glsl55
-rw-r--r--indra/newview/app_settings/shaders/class2/objects/simpleV.glsl51
-rw-r--r--indra/newview/app_settings/shaders/class2/windlight/atmosphericsV.glsl6
-rw-r--r--indra/newview/app_settings/shaders/class2/windlight/atmosphericsVarsF.glsl20
-rw-r--r--indra/newview/app_settings/shaders/class2/windlight/atmosphericsVarsV.glsl38
-rw-r--r--indra/newview/app_settings/shaders/class2/windlight/atmosphericsVarsWaterF.glsl50
-rw-r--r--indra/newview/app_settings/shaders/class2/windlight/atmosphericsVarsWaterV.glsl81
-rw-r--r--indra/newview/app_settings/shaders/class2/windlight/cloudsF.glsl22
-rw-r--r--indra/newview/app_settings/shaders/class2/windlight/cloudsV.glsl39
-rw-r--r--indra/newview/app_settings/shaders/class2/windlight/skyF.glsl6
-rw-r--r--indra/newview/app_settings/shaders/class2/windlight/skyV.glsl11
-rw-r--r--indra/newview/app_settings/shaders/class3/avatar/avatarV.glsl40
-rw-r--r--indra/newview/app_settings/shaders/class3/deferred/giDownsampleF.glsl106
-rw-r--r--indra/newview/app_settings/shaders/class3/deferred/giDownsampleV.glsl37
-rw-r--r--indra/newview/app_settings/shaders/class3/deferred/giF.glsl211
-rw-r--r--indra/newview/app_settings/shaders/class3/deferred/giFinalF.glsl45
-rw-r--r--indra/newview/app_settings/shaders/class3/deferred/giFinalV.glsl37
-rw-r--r--indra/newview/app_settings/shaders/class3/deferred/giV.glsl42
-rw-r--r--indra/newview/app_settings/shaders/class3/deferred/luminanceF.glsl39
-rw-r--r--indra/newview/app_settings/shaders/class3/deferred/luminanceV.glsl40
-rw-r--r--indra/newview/app_settings/shaders/class3/deferred/postDeferredF.glsl100
-rw-r--r--indra/newview/app_settings/shaders/class3/deferred/postDeferredV.glsl37
-rw-r--r--indra/newview/app_settings/shaders/class3/deferred/postgiF.glsl89
-rw-r--r--indra/newview/app_settings/shaders/class3/deferred/postgiV.glsl37
-rw-r--r--indra/newview/app_settings/shaders/class3/deferred/softenLightF.glsl335
-rw-r--r--indra/newview/app_settings/shaders/class3/deferred/softenLightV.glsl44
-rw-r--r--indra/newview/app_settings/shaders/class3/deferred/treeF.glsl39
-rw-r--r--indra/newview/app_settings/shaders/class3/lighting/sumLightsSpecularV.glsl22
-rw-r--r--indra/newview/app_settings/shaders/class3/lighting/sumLightsV.glsl24
-rw-r--r--indra/newview/app_settings/toolbars.xml25
-rw-r--r--indra/newview/character/avatar_lad.xml21
-rw-r--r--[-rwxr-xr-x]indra/newview/featuretable.txt11
-rw-r--r--indra/newview/featuretable_linux.txt9
-rw-r--r--indra/newview/featuretable_mac.txt21
-rw-r--r--indra/newview/featuretable_solaris.txt4
-rw-r--r--indra/newview/featuretable_xp.txt10
-rw-r--r--indra/newview/gpu_table.txt736
-rw-r--r--[-rwxr-xr-x]indra/newview/installers/darwin/fix_application_icon_position.sh0
-rw-r--r--[-rwxr-xr-x]indra/newview/installers/windows/installer_template.nsi107
-rw-r--r--indra/newview/installers/windows/lang_ko.nsibin6200 -> 0 bytes
-rw-r--r--indra/newview/installers/windows/lang_nl.nsibin7414 -> 0 bytes
-rw-r--r--indra/newview/installers/windows/lang_ru.nsibin0 -> 7598 bytes
-rw-r--r--indra/newview/installers/windows/lang_tr.nsibin0 -> 7722 bytes
-rw-r--r--indra/newview/installers/windows/lang_zh.nsibin5554 -> 5824 bytes
-rw-r--r--indra/newview/installers/windows/language_menu.nsibin1444 -> 1448 bytes
-rwxr-xr-xindra/newview/linux_tools/wrapper.sh42
-rwxr-xr-xindra/newview/llagent.cpp118
-rw-r--r--indra/newview/llagent.h26
-rw-r--r--indra/newview/llagentcamera.cpp5
-rw-r--r--indra/newview/llagentwearables.cpp22
-rw-r--r--indra/newview/llagentwearables.h2
-rw-r--r--indra/newview/llagentwearablesfetch.cpp14
-rw-r--r--indra/newview/llagentwearablesfetch.h2
-rw-r--r--indra/newview/llappearancemgr.cpp108
-rw-r--r--indra/newview/llappearancemgr.h3
-rw-r--r--indra/newview/llappviewer.cpp463
-rw-r--r--indra/newview/llappviewer.h6
-rw-r--r--indra/newview/llappviewerlinux.cpp1
-rw-r--r--indra/newview/llappviewerlinux_api_dbus.cpp14
-rw-r--r--indra/newview/llappviewermacosx.cpp1
-rw-r--r--indra/newview/llappviewerwin32.cpp4
-rw-r--r--indra/newview/llassetuploadresponders.cpp15
-rwxr-xr-xindra/newview/llavataractions.cpp63
-rw-r--r--indra/newview/llavataractions.h3
-rwxr-xr-x[-rw-r--r--]indra/newview/llavatariconctrl.cpp3
-rw-r--r--indra/newview/llbottomtray.cpp1991
-rw-r--r--indra/newview/llbottomtray.h564
-rw-r--r--indra/newview/llcallfloater.cpp20
-rw-r--r--indra/newview/llchannelmanager.cpp51
-rw-r--r--indra/newview/llchannelmanager.h26
-rw-r--r--indra/newview/llchatbar.cpp3
-rw-r--r--indra/newview/llchathistory.cpp6
-rw-r--r--indra/newview/llchatitemscontainerctrl.cpp5
-rw-r--r--indra/newview/llchiclet.cpp25
-rw-r--r--indra/newview/llchicletbar.cpp345
-rw-r--r--indra/newview/llchicletbar.h105
-rw-r--r--indra/newview/llcofwearables.cpp27
-rw-r--r--indra/newview/llcofwearables.h2
-rw-r--r--indra/newview/llcommandlineparser.cpp9
-rw-r--r--indra/newview/llcylinder.cpp260
-rw-r--r--indra/newview/llcylinder.h33
-rw-r--r--indra/newview/lldebugview.cpp38
-rw-r--r--indra/newview/lldebugview.h5
-rw-r--r--indra/newview/lldirpicker.cpp4
-rw-r--r--indra/newview/lldndbutton.cpp9
-rw-r--r--indra/newview/lldndbutton.h5
-rw-r--r--indra/newview/lldrawable.cpp10
-rw-r--r--indra/newview/lldrawpool.cpp16
-rw-r--r--indra/newview/lldrawpool.h2
-rw-r--r--indra/newview/lldrawpoolalpha.cpp55
-rw-r--r--indra/newview/lldrawpoolalpha.h1
-rw-r--r--indra/newview/lldrawpoolavatar.cpp268
-rw-r--r--indra/newview/lldrawpoolavatar.h3
-rw-r--r--indra/newview/lldrawpoolbump.cpp330
-rw-r--r--indra/newview/lldrawpoolground.cpp6
-rw-r--r--indra/newview/lldrawpoolsimple.cpp47
-rw-r--r--indra/newview/lldrawpoolsimple.h5
-rw-r--r--indra/newview/lldrawpoolsky.cpp21
-rw-r--r--indra/newview/lldrawpoolterrain.cpp230
-rw-r--r--indra/newview/lldrawpoolterrain.h3
-rw-r--r--indra/newview/lldrawpooltree.cpp170
-rw-r--r--indra/newview/lldrawpooltree.h3
-rw-r--r--indra/newview/lldrawpoolwater.cpp69
-rw-r--r--indra/newview/lldrawpoolwater.h1
-rw-r--r--indra/newview/lldrawpoolwlsky.cpp44
-rw-r--r--indra/newview/lldriverparam.cpp2
-rw-r--r--indra/newview/lldynamictexture.cpp4
-rw-r--r--indra/newview/llexternaleditor.cpp73
-rw-r--r--indra/newview/llexternaleditor.h6
-rw-r--r--indra/newview/llface.cpp293
-rw-r--r--indra/newview/llface.h6
-rw-r--r--indra/newview/llfasttimerview.cpp12
-rw-r--r--indra/newview/llfavoritesbar.cpp376
-rw-r--r--indra/newview/llfavoritesbar.h20
-rw-r--r--indra/newview/llfeaturemanager.cpp10
-rw-r--r--indra/newview/llfilepicker.cpp61
-rw-r--r--indra/newview/llfilepicker.h2
-rw-r--r--indra/newview/llfloaterabout.cpp234
-rw-r--r--indra/newview/llfloateranimpreview.cpp22
-rw-r--r--indra/newview/llfloateravatar.cpp54
-rw-r--r--indra/newview/llfloateravatar.h43
-rw-r--r--indra/newview/llfloatercamera.cpp40
-rw-r--r--indra/newview/llfloatercamera.h8
-rw-r--r--indra/newview/llfloaterchat.cpp485
-rw-r--r--indra/newview/llfloaterchat.h78
-rw-r--r--indra/newview/llfloaterchatterbox.cpp344
-rw-r--r--indra/newview/llfloaterchatterbox.h80
-rw-r--r--indra/newview/llfloatercolorpicker.cpp2
-rw-r--r--indra/newview/llfloaterdestinations.cpp54
-rw-r--r--indra/newview/llfloaterdestinations.h43
-rw-r--r--indra/newview/llfloaterfriends.cpp807
-rw-r--r--indra/newview/llfloaterfriends.h140
-rw-r--r--indra/newview/llfloaterhardwaresettings.cpp38
-rw-r--r--indra/newview/llfloaterhelpbrowser.cpp17
-rw-r--r--indra/newview/llfloaterhelpbrowser.h4
-rw-r--r--indra/newview/llfloaterhud.cpp8
-rw-r--r--indra/newview/llfloaterimagepreview.cpp80
-rw-r--r--indra/newview/llfloaterinspect.cpp39
-rw-r--r--indra/newview/llfloaterinspect.h4
-rw-r--r--indra/newview/llfloaterinventory.cpp9
-rw-r--r--indra/newview/llfloaterinventory.h1
-rw-r--r--indra/newview/llfloaterland.cpp49
-rw-r--r--indra/newview/llfloaterland.h1
-rw-r--r--indra/newview/llfloatermap.cpp49
-rw-r--r--indra/newview/llfloatermap.h6
-rw-r--r--indra/newview/llfloatermediabrowser.cpp462
-rw-r--r--indra/newview/llfloatermediabrowser.h86
-rw-r--r--indra/newview/llfloatermediasettings.cpp11
-rwxr-xr-x[-rw-r--r--]indra/newview/llfloatermodelpreview.cpp173
-rw-r--r--indra/newview/llfloatermodelpreview.h3
-rw-r--r--indra/newview/llfloaternamedesc.cpp21
-rw-r--r--indra/newview/llfloaternamedesc.h10
-rw-r--r--indra/newview/llfloaternotificationsconsole.cpp2
-rw-r--r--indra/newview/llfloateropenobject.cpp60
-rw-r--r--indra/newview/llfloateropenobject.h11
-rw-r--r--indra/newview/llfloateroutbox.cpp567
-rw-r--r--indra/newview/llfloateroutbox.h114
-rw-r--r--indra/newview/llfloaterpostcard.cpp384
-rw-r--r--indra/newview/llfloaterpostcard.h79
-rwxr-xr-xindra/newview/llfloaterpreference.cpp109
-rw-r--r--indra/newview/llfloaterpreference.h20
-rw-r--r--indra/newview/llfloatersidepanelcontainer.cpp111
-rw-r--r--indra/newview/llfloatersidepanelcontainer.h81
-rw-r--r--indra/newview/llfloatersidetraytab.cpp52
-rw-r--r--indra/newview/llfloatersidetraytab.h49
-rw-r--r--indra/newview/llfloatersnapshot.cpp1432
-rw-r--r--indra/newview/llfloatersnapshot.h31
-rw-r--r--indra/newview/llfloatersounddevices.cpp7
-rw-r--r--indra/newview/llfloatertools.cpp4
-rw-r--r--indra/newview/llfloatertoybox.cpp191
-rw-r--r--indra/newview/llfloatertoybox.h62
-rw-r--r--indra/newview/llfloatertranslationsettings.cpp298
-rw-r--r--indra/newview/llfloatertranslationsettings.h76
-rw-r--r--indra/newview/llfloateruipreview.cpp6
-rw-r--r--indra/newview/llfloaterwebcontent.cpp163
-rw-r--r--indra/newview/llfloaterwebcontent.h26
-rw-r--r--indra/newview/llfloaterwebprofile.cpp79
-rw-r--r--indra/newview/llfloaterwebprofile.h59
-rw-r--r--indra/newview/llfloaterwindowsize.cpp35
-rw-r--r--indra/newview/llfloaterwindowsize.h22
-rw-r--r--indra/newview/llfolderview.cpp47
-rw-r--r--indra/newview/llfolderview.h7
-rw-r--r--indra/newview/llfolderviewitem.cpp444
-rw-r--r--indra/newview/llfolderviewitem.h31
-rw-r--r--indra/newview/llglsandbox.cpp42
-rw-r--r--indra/newview/llgroupactions.cpp16
-rw-r--r--indra/newview/llgrouplist.cpp2
-rw-r--r--indra/newview/llhudeffectbeam.cpp12
-rw-r--r--indra/newview/llhudeffectblob.cpp8
-rw-r--r--indra/newview/llhudeffectblob.h2
-rw-r--r--indra/newview/llhudeffectlookat.cpp4
-rw-r--r--indra/newview/llhudeffectpointat.cpp2
-rw-r--r--indra/newview/llhudrender.cpp26
-rw-r--r--indra/newview/llimfloater.cpp66
-rw-r--r--indra/newview/llimfloater.h6
-rw-r--r--indra/newview/llimfloatercontainer.cpp3
-rw-r--r--indra/newview/llimfloatercontainer.h2
-rw-r--r--indra/newview/llimpanel.cpp1
-rw-r--r--indra/newview/llimview.cpp106
-rw-r--r--indra/newview/llimview.h11
-rw-r--r--indra/newview/llinspectobject.cpp4
-rw-r--r--indra/newview/llinspectremoteobject.cpp24
-rw-r--r--indra/newview/llinventorybridge.cpp977
-rw-r--r--indra/newview/llinventorybridge.h20
-rw-r--r--indra/newview/llinventoryfilter.cpp25
-rw-r--r--indra/newview/llinventoryfilter.h4
-rw-r--r--indra/newview/llinventoryfunctions.cpp148
-rw-r--r--indra/newview/llinventoryfunctions.h5
-rw-r--r--indra/newview/llinventorymodel.cpp179
-rw-r--r--indra/newview/llinventorymodel.h21
-rw-r--r--indra/newview/llinventoryobserver.cpp19
-rw-r--r--indra/newview/llinventorypanel.cpp142
-rw-r--r--indra/newview/llinventorypanel.h5
-rw-r--r--indra/newview/lllandmarkactions.cpp2
-rw-r--r--indra/newview/lllocationinputctrl.cpp14
-rw-r--r--indra/newview/lllogininstance.cpp10
-rw-r--r--indra/newview/llmainlooprepeater.cpp2
-rw-r--r--indra/newview/llmanip.cpp28
-rw-r--r--indra/newview/llmaniprotate.cpp120
-rw-r--r--indra/newview/llmanipscale.cpp42
-rw-r--r--indra/newview/llmaniptranslate.cpp43
-rw-r--r--indra/newview/llmarketplacefunctions.cpp478
-rw-r--r--indra/newview/llmarketplacefunctions.h94
-rw-r--r--indra/newview/llmarketplacenotifications.cpp90
-rw-r--r--indra/newview/llmarketplacenotifications.h57
-rw-r--r--indra/newview/llmediactrl.cpp118
-rw-r--r--indra/newview/llmediactrl.h45
-rw-r--r--indra/newview/llmenucommands.cpp94
-rw-r--r--indra/newview/llmenucommands.h37
-rwxr-xr-x[-rw-r--r--]indra/newview/llmeshrepository.cpp162
-rw-r--r--indra/newview/llmeshrepository.h6
-rw-r--r--indra/newview/llmoveview.cpp83
-rw-r--r--indra/newview/llmoveview.h6
-rw-r--r--indra/newview/llnamelistctrl.h2
-rw-r--r--indra/newview/llnavigationbar.cpp190
-rw-r--r--indra/newview/llnavigationbar.h7
-rw-r--r--indra/newview/llnearbychat.cpp100
-rw-r--r--indra/newview/llnearbychat.h19
-rw-r--r--indra/newview/llnearbychatbar.cpp476
-rw-r--r--indra/newview/llnearbychatbar.h84
-rw-r--r--indra/newview/llnearbychathandler.cpp123
-rw-r--r--indra/newview/llnetmap.cpp10
-rw-r--r--indra/newview/llnotificationalerthandler.cpp4
-rw-r--r--indra/newview/llnotificationhandler.h10
-rw-r--r--indra/newview/llnotificationhandlerutil.cpp2
-rw-r--r--indra/newview/llnotificationmanager.cpp2
-rw-r--r--indra/newview/llnotificationtiphandler.cpp7
-rw-r--r--indra/newview/lloutfitslist.cpp4
-rw-r--r--indra/newview/lloverlaybar.cpp378
-rw-r--r--indra/newview/lloverlaybar.h95
-rw-r--r--indra/newview/llpanelavatar.cpp709
-rw-r--r--indra/newview/llpanelavatar.h191
-rw-r--r--indra/newview/llpanelblockedlist.cpp4
-rw-r--r--indra/newview/llpaneleditwearable.cpp6
-rw-r--r--indra/newview/llpanelgroup.cpp6
-rw-r--r--indra/newview/llpanelgrouplandmoney.cpp13
-rw-r--r--indra/newview/llpanelimcontrolpanel.cpp1
-rw-r--r--indra/newview/llpanellandmarks.cpp18
-rw-r--r--indra/newview/llpanellogin.cpp38
-rw-r--r--indra/newview/llpanellogin.h2
-rw-r--r--indra/newview/llpanelmaininventory.cpp26
-rw-r--r--indra/newview/llpanelmarketplaceinbox.cpp58
-rw-r--r--indra/newview/llpanelmarketplaceinbox.h11
-rw-r--r--indra/newview/llpanelmarketplaceinboxinventory.cpp122
-rw-r--r--indra/newview/llpanelmarketplaceinboxinventory.h37
-rw-r--r--indra/newview/llpanelmarketplaceoutbox.cpp359
-rw-r--r--indra/newview/llpanelmarketplaceoutbox.h90
-rw-r--r--indra/newview/llpanelmarketplaceoutboxinventory.cpp133
-rw-r--r--indra/newview/llpanelmarketplaceoutboxinventory.h27
-rw-r--r--indra/newview/llpanelme.cpp345
-rw-r--r--indra/newview/llpanelme.h66
-rw-r--r--indra/newview/llpanelnearbymedia.cpp42
-rw-r--r--indra/newview/llpanelnearbymedia.h1
-rw-r--r--indra/newview/llpanelobjectinventory.cpp1
-rw-r--r--indra/newview/llpaneloutfitsinventory.cpp9
-rw-r--r--indra/newview/llpanelpeople.cpp26
-rwxr-xr-xindra/newview/llpanelpicks.cpp61
-rwxr-xr-xindra/newview/llpanelpicks.h6
-rw-r--r--indra/newview/llpanelplaces.cpp182
-rw-r--r--indra/newview/llpanelplaces.h7
-rw-r--r--indra/newview/llpanelprimmediacontrols.cpp3
-rwxr-xr-xindra/newview/llpanelprofile.cpp56
-rwxr-xr-xindra/newview/llpanelprofile.h6
-rw-r--r--indra/newview/llpanelprofileview.cpp247
-rw-r--r--indra/newview/llpanelprofileview.h108
-rw-r--r--indra/newview/llpanelsnapshot.cpp201
-rw-r--r--indra/newview/llpanelsnapshot.h71
-rw-r--r--indra/newview/llpanelsnapshotinventory.cpp109
-rw-r--r--indra/newview/llpanelsnapshotlocal.cpp168
-rw-r--r--indra/newview/llpanelsnapshotoptions.cpp120
-rw-r--r--indra/newview/llpanelsnapshotpostcard.cpp270
-rw-r--r--indra/newview/llpanelsnapshotprofile.cpp101
-rw-r--r--indra/newview/llpanelteleporthistory.cpp81
-rw-r--r--indra/newview/llpanelteleporthistory.h2
-rw-r--r--indra/newview/llpaneltopinfobar.cpp27
-rw-r--r--indra/newview/llpaneltopinfobar.h8
-rw-r--r--indra/newview/llpanelwearing.cpp4
-rw-r--r--indra/newview/llparticipantlist.cpp9
-rw-r--r--indra/newview/llparticipantlist.h2
-rw-r--r--indra/newview/llpostcard.cpp155
-rw-r--r--indra/newview/llpostcard.h48
-rw-r--r--indra/newview/llpreview.cpp6
-rw-r--r--indra/newview/llpreviewscript.cpp91
-rw-r--r--indra/newview/llpreviewscript.h6
-rw-r--r--indra/newview/llpreviewtexture.cpp2
-rw-r--r--indra/newview/llprogressview.cpp12
-rw-r--r--indra/newview/llscreenchannel.cpp257
-rw-r--r--indra/newview/llscreenchannel.h48
-rw-r--r--indra/newview/llscriptfloater.cpp40
-rw-r--r--indra/newview/llscriptfloater.h2
-rw-r--r--indra/newview/llselectmgr.cpp153
-rw-r--r--indra/newview/llselectmgr.h2
-rw-r--r--indra/newview/llsidepanelappearance.cpp5
-rw-r--r--indra/newview/llsidepanelinventory.cpp399
-rw-r--r--indra/newview/llsidepanelinventory.h28
-rw-r--r--indra/newview/llsidepaneltaskinfo.cpp159
-rw-r--r--indra/newview/llsidepaneltaskinfo.h40
-rw-r--r--indra/newview/llsidetray.cpp1488
-rw-r--r--indra/newview/llsidetray.h260
-rw-r--r--indra/newview/llsidetraylistener.cpp179
-rw-r--r--indra/newview/llsidetraylistener.h53
-rw-r--r--indra/newview/llsidetraypanelcontainer.cpp7
-rw-r--r--indra/newview/llsidetraypanelcontainer.h5
-rw-r--r--indra/newview/llspatialpartition.cpp372
-rw-r--r--indra/newview/llspatialpartition.h21
-rw-r--r--indra/newview/llspeakbutton.cpp165
-rw-r--r--indra/newview/llspeakbutton.h88
-rw-r--r--indra/newview/llsprite.cpp2
-rw-r--r--indra/newview/llstartup.cpp271
-rw-r--r--indra/newview/llstartup.h2
-rw-r--r--indra/newview/llstatusbar.cpp43
-rw-r--r--indra/newview/llstatusbar.h5
-rw-r--r--indra/newview/llsyswellwindow.cpp36
-rw-r--r--indra/newview/llsyswellwindow.h6
-rw-r--r--indra/newview/llteleporthistory.cpp9
-rw-r--r--indra/newview/llteleporthistory.h3
-rw-r--r--indra/newview/llteleporthistorystorage.cpp1
-rw-r--r--indra/newview/llteleporthistorystorage.h6
-rw-r--r--indra/newview/lltexlayer.cpp122
-rw-r--r--indra/newview/lltexlayer.h2
-rw-r--r--indra/newview/lltexturecache.cpp71
-rw-r--r--indra/newview/lltexturecache.h5
-rw-r--r--indra/newview/lltexturefetch.cpp7
-rw-r--r--indra/newview/lltexturefetch.h2
-rw-r--r--indra/newview/lltextureview.cpp7
-rw-r--r--indra/newview/lltoast.cpp137
-rw-r--r--indra/newview/lltoast.h20
-rw-r--r--indra/newview/lltoastnotifypanel.cpp2
-rw-r--r--indra/newview/lltool.h2
-rw-r--r--indra/newview/lltoolbar.cpp365
-rw-r--r--indra/newview/lltoolbar.h82
-rw-r--r--indra/newview/lltoolbarview.cpp697
-rw-r--r--indra/newview/lltoolbarview.h137
-rw-r--r--indra/newview/lltoolbrush.cpp8
-rw-r--r--indra/newview/lltooldraganddrop.cpp58
-rw-r--r--indra/newview/lltooldraganddrop.h8
-rw-r--r--indra/newview/lltoolgun.cpp4
-rw-r--r--indra/newview/lltoolmgr.cpp42
-rw-r--r--indra/newview/lltoolmorph.cpp19
-rw-r--r--indra/newview/lltoolpie.cpp38
-rw-r--r--indra/newview/lltoolpie.h1
-rw-r--r--indra/newview/lltracker.cpp16
-rw-r--r--indra/newview/lltransientfloatermgr.cpp43
-rw-r--r--indra/newview/lltransientfloatermgr.h9
-rwxr-xr-x[-rw-r--r--]indra/newview/lltranslate.cpp375
-rwxr-xr-x[-rw-r--r--]indra/newview/lltranslate.h316
-rw-r--r--indra/newview/llurldispatcher.cpp8
-rw-r--r--indra/newview/llviewerassetstorage.cpp8
-rw-r--r--indra/newview/llviewerassettype.cpp4
-rw-r--r--indra/newview/llvieweraudio.cpp238
-rw-r--r--indra/newview/llvieweraudio.h47
-rw-r--r--indra/newview/llviewercamera.cpp68
-rw-r--r--indra/newview/llviewercontrol.cpp50
-rw-r--r--indra/newview/llviewercontrollistener.cpp231
-rw-r--r--indra/newview/llviewercontrollistener.h10
-rw-r--r--indra/newview/llviewerdisplay.cpp170
-rw-r--r--indra/newview/llviewerfloaterreg.cpp41
-rw-r--r--indra/newview/llviewerfoldertype.cpp71
-rw-r--r--indra/newview/llviewerfoldertype.h1
-rw-r--r--indra/newview/llviewerhelp.cpp38
-rw-r--r--indra/newview/llviewerhelp.h6
-rw-r--r--indra/newview/llviewerinventory.cpp29
-rw-r--r--indra/newview/llviewerinventory.h5
-rw-r--r--indra/newview/llviewerjoint.cpp18
-rw-r--r--indra/newview/llviewerjointmesh.cpp230
-rw-r--r--indra/newview/llviewerjointmesh.h19
-rw-r--r--indra/newview/llviewerjointmesh_sse.cpp114
-rw-r--r--indra/newview/llviewerjointmesh_sse2.cpp121
-rw-r--r--indra/newview/llviewerjointmesh_vec.cpp97
-rw-r--r--indra/newview/llviewermedia.cpp526
-rw-r--r--indra/newview/llviewermedia.h4
-rw-r--r--indra/newview/llviewermenu.cpp416
-rw-r--r--indra/newview/llviewermenu.h2
-rw-r--r--indra/newview/llviewermenufile.cpp23
-rwxr-xr-x[-rw-r--r--]indra/newview/llviewermessage.cpp96
-rw-r--r--[-rwxr-xr-x]indra/newview/llviewerobject.cpp9
-rw-r--r--indra/newview/llviewerobject.h8
-rw-r--r--indra/newview/llviewerparcelmgr.cpp172
-rw-r--r--indra/newview/llviewerparcelmgr.h2
-rw-r--r--indra/newview/llviewerparceloverlay.cpp10
-rw-r--r--indra/newview/llviewerprecompiledheaders.h3
-rw-r--r--indra/newview/llviewerregion.cpp1
-rw-r--r--indra/newview/llviewershadermgr.cpp976
-rw-r--r--indra/newview/llviewershadermgr.h123
-rw-r--r--indra/newview/llviewerstats.cpp2
-rw-r--r--indra/newview/llviewertexteditor.cpp23
-rw-r--r--indra/newview/llviewertexture.cpp111
-rw-r--r--indra/newview/llviewertexture.h1
-rw-r--r--indra/newview/llviewertexturelist.cpp141
-rw-r--r--indra/newview/llviewertexturelist.h7
-rw-r--r--indra/newview/llviewerwindow.cpp453
-rw-r--r--indra/newview/llviewerwindow.h42
-rw-r--r--indra/newview/llvoavatar.cpp63
-rw-r--r--indra/newview/llvoavatar.h10
-rw-r--r--indra/newview/llvoavatarself.cpp111
-rw-r--r--indra/newview/llvoavatarself.h8
-rw-r--r--indra/newview/llvocache.cpp16
-rw-r--r--indra/newview/llvocache.h1
-rw-r--r--indra/newview/llvograss.cpp22
-rw-r--r--indra/newview/llvograss.h2
-rw-r--r--indra/newview/llvoground.cpp2
-rw-r--r--indra/newview/llvoicevivox.cpp159
-rw-r--r--indra/newview/llvopartgroup.cpp96
-rw-r--r--indra/newview/llvopartgroup.h2
-rw-r--r--indra/newview/llvosky.cpp54
-rw-r--r--indra/newview/llvosurfacepatch.cpp52
-rw-r--r--indra/newview/llvosurfacepatch.h7
-rw-r--r--indra/newview/llvotextbubble.cpp272
-rw-r--r--indra/newview/llvotextbubble.h66
-rw-r--r--indra/newview/llvotree.cpp125
-rw-r--r--indra/newview/llvotree.h1
-rw-r--r--[-rwxr-xr-x]indra/newview/llvovolume.cpp155
-rw-r--r--indra/newview/llvovolume.h5
-rw-r--r--indra/newview/llvowater.cpp6
-rw-r--r--indra/newview/llvowlsky.cpp30
-rw-r--r--indra/newview/llwatchdog.cpp4
-rw-r--r--indra/newview/llwaterparammanager.cpp1
-rw-r--r--indra/newview/llwearable.cpp10
-rw-r--r--indra/newview/llwearablelist.cpp2
-rw-r--r--indra/newview/llweb.cpp39
-rw-r--r--indra/newview/llweb.h18
-rw-r--r--indra/newview/llwebprofile.cpp305
-rw-r--r--indra/newview/llwebprofile.h69
-rw-r--r--indra/newview/llwind.cpp115
-rw-r--r--indra/newview/llwind.h7
-rw-r--r--indra/newview/llwindowlistener.cpp505
-rw-r--r--indra/newview/llwindowlistener.h57
-rw-r--r--indra/newview/llwlparamset.cpp14
-rw-r--r--indra/newview/llworld.cpp52
-rw-r--r--indra/newview/llworldmapmessage.cpp5
-rw-r--r--indra/newview/llworldmapview.cpp6
-rw-r--r--indra/newview/llworldview.cpp61
-rw-r--r--indra/newview/llxmlrpctransaction.cpp35
-rw-r--r--indra/newview/pipeline.cpp2808
-rw-r--r--indra/newview/pipeline.h152
-rw-r--r--indra/newview/skins/default/colors.xml4
-rw-r--r--indra/newview/skins/default/textures/arrow_keys.pngbin6558 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/bottomtray/Cam_Pan_Over.pngbin275 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/bottomtray/CameraView_Press.pngbin489 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/bottomtray/PanOrbit_Disabled.pngbin50975 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/bottomtray/PanOrbit_Over.pngbin54713 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/bottomtray/PanOrbit_Press.pngbin51053 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/bottomtray/VoicePTT_Lvl1_Dark.pngbin0 -> 602 bytes
-rw-r--r--indra/newview/skins/default/textures/bottomtray/VoicePTT_Lvl2_Dark.pngbin0 -> 669 bytes
-rw-r--r--indra/newview/skins/default/textures/bottomtray/VoicePTT_Lvl3_Dark.pngbin0 -> 639 bytes
-rw-r--r--indra/newview/skins/default/textures/bottomtray/VoicePTT_Off_Dark.pngbin0 -> 547 bytes
-rw-r--r--indra/newview/skins/default/textures/bottomtray/VoicePTT_On_Dark.pngbin0 -> 526 bytes
-rw-r--r--indra/newview/skins/default/textures/checkerboard_transparency_bg.pngbin1110 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/circle.tgabin1068 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/containers/Accordion_ArrowClosed_Over.pngbin170 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/containers/Accordion_ArrowOpened_Over.pngbin162 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/containers/TabTop_Left_Over.pngbin337 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/containers/TabTop_Middle_Over.pngbin285 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/containers/TabTop_Right_Over.pngbin362 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/icn_label_web.tgabin4140 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/icn_media.tgabin4140 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/icn_voice-groupfocus.tgabin1068 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/icn_voice-localchat.tgabin1068 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/icn_voice-pvtfocus.tgabin1068 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/icon_day_cycle.tgabin25682 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/icon_event_adult.tgabin1006 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/icon_lock.tgabin1030 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/AddItem_Over.pngbin165 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/BackArrow_Over.pngbin214 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/DragHandle.pngbin163 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Generic_Object.pngbin366 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Inv_Gift.pngbin1335 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/OptionsMenu_Over.pngbin277 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/OutboxPush_On_Selected.pngbin1912 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Parcel_Damage_Light_Alt.pngbin285 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Parcel_NoScripts_Light.pngbin620 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/TrashItem_Over.pngbin201 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/parcel_color_EVRY.pngbin393 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/parcel_color_EXP.pngbin272 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/parcel_color_M.pngbin306 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/image_edit_icon.tgabin3116 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/inv_folder_animation.tgabin1068 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/inv_folder_inbox.tgabin2085 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/map_avatar_above_8.tgabin300 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/map_avatar_below_8.tgabin300 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/map_event_adult.tgabin1006 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/map_event_mature.tgabin1068 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/map_track_8.tgabin300 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/model_wizard/divider_line.pngbin2815 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/mute_icon.tgabin1042 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/navbar/Arrow_Left_Over.pngbin381 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/navbar/Arrow_Right_Over.pngbin379 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/navbar/Help_Over.pngbin348 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/navbar/Home_Over.pngbin330 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/navbar/separator.pngbin0 -> 2826 bytes
-rw-r--r--indra/newview/skins/default/textures/places_rating_adult.tgabin648 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/places_rating_mature.tgabin1068 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/places_rating_pg.tgabin1068 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/propertyline.tgabin2092 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/quick_tips/avatar_free_mode.pngbin1447 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/quick_tips/camera_free_mode.pngbin2267 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/quick_tips/camera_orbit_mode.pngbin2381 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/quick_tips/camera_pan_mode.pngbin2418 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/quick_tips/camera_preset_front_view.pngbin2365 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/quick_tips/camera_preset_group_view.pngbin2595 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/quick_tips/camera_preset_rear_view.pngbin2221 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/quick_tips/move_fly_first.pngbin1528 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/quick_tips/move_fly_second.pngbin2128 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/quick_tips/move_run_first.pngbin1554 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/quick_tips/move_run_second.pngbin2534 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/quick_tips/move_walk_first.pngbin2106 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/quick_tips/move_walk_second.pngbin3108 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/show_btn.tgabin3884 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/show_btn_selected.tgabin3884 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/smicon_warn.tgabin1068 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/snapshot_download.pngbin0 -> 1226 bytes
-rw-r--r--indra/newview/skins/default/textures/snapshot_email.pngbin0 -> 1231 bytes
-rw-r--r--indra/newview/skins/default/textures/spacer35.tgabin3404 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/square_btn_32x128.tgabin6292 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/square_btn_selected_32x128.tgabin6983 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/startup_logo.j2cbin69118 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/status_busy.tgabin4140 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/taskpanel/TabIcon_Appearance_Off.pngbin273 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/taskpanel/TabIcon_Appearance_Selected.pngbin349 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/taskpanel/TabIcon_Home_Off.pngbin749 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/taskpanel/TabIcon_Me_Selected.pngbin359 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/taskpanel/TabIcon_People_Selected.pngbin536 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/taskpanel/TabIcon_Places_Large.pngbin709 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/taskpanel/TabIcon_Places_Selected.pngbin653 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/taskpanel/TabIcon_Things_Selected.pngbin297 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/textures.xml92
-rw-r--r--indra/newview/skins/default/textures/toolbar_icons/appearance.pngbin0 -> 1205 bytes
-rw-r--r--indra/newview/skins/default/textures/toolbar_icons/avatars.pngbin0 -> 1432 bytes
-rw-r--r--indra/newview/skins/default/textures/toolbar_icons/build.pngbin0 -> 1246 bytes
-rw-r--r--indra/newview/skins/default/textures/toolbar_icons/caret_bottom.pngbin0 -> 195 bytes
-rw-r--r--indra/newview/skins/default/textures/toolbar_icons/caret_left.pngbin0 -> 948 bytes
-rw-r--r--indra/newview/skins/default/textures/toolbar_icons/caret_right.pngbin0 -> 949 bytes
-rw-r--r--indra/newview/skins/default/textures/toolbar_icons/chat.pngbin0 -> 1277 bytes
-rw-r--r--indra/newview/skins/default/textures/toolbar_icons/destinations.pngbin0 -> 1297 bytes
-rw-r--r--indra/newview/skins/default/textures/toolbar_icons/gestures.pngbin0 -> 1675 bytes
-rw-r--r--indra/newview/skins/default/textures/toolbar_icons/howto.pngbin0 -> 1306 bytes
-rw-r--r--indra/newview/skins/default/textures/toolbar_icons/inventory.pngbin0 -> 1114 bytes
-rw-r--r--indra/newview/skins/default/textures/toolbar_icons/land.pngbin0 -> 1123 bytes
-rw-r--r--indra/newview/skins/default/textures/toolbar_icons/map.pngbin0 -> 1206 bytes
-rw-r--r--indra/newview/skins/default/textures/toolbar_icons/marketplace.pngbin0 -> 1311 bytes
-rw-r--r--indra/newview/skins/default/textures/toolbar_icons/mini_cart.pngbin0 -> 2987 bytes
-rw-r--r--indra/newview/skins/default/textures/toolbar_icons/mini_map.pngbin0 -> 1766 bytes
-rw-r--r--indra/newview/skins/default/textures/toolbar_icons/move.pngbin0 -> 1328 bytes
-rw-r--r--indra/newview/skins/default/textures/toolbar_icons/nearbyvoice.pngbin0 -> 1479 bytes
-rw-r--r--indra/newview/skins/default/textures/toolbar_icons/outbox.pngbin0 -> 1521 bytes
-rw-r--r--indra/newview/skins/default/textures/toolbar_icons/people.pngbin0 -> 1313 bytes
-rw-r--r--indra/newview/skins/default/textures/toolbar_icons/picks.pngbin0 -> 1396 bytes
-rw-r--r--indra/newview/skins/default/textures/toolbar_icons/places.pngbin0 -> 1391 bytes
-rw-r--r--indra/newview/skins/default/textures/toolbar_icons/preferences.pngbin0 -> 1587 bytes
-rw-r--r--indra/newview/skins/default/textures/toolbar_icons/profile.pngbin0 -> 1180 bytes
-rw-r--r--indra/newview/skins/default/textures/toolbar_icons/search.pngbin0 -> 1406 bytes
-rw-r--r--indra/newview/skins/default/textures/toolbar_icons/snapshot.pngbin0 -> 1142 bytes
-rw-r--r--indra/newview/skins/default/textures/toolbar_icons/speak.pngbin0 -> 1253 bytes
-rw-r--r--indra/newview/skins/default/textures/toolbar_icons/view.pngbin0 -> 1487 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/Checkbox_On_Over.pngbin547 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/Checkbox_Over.pngbin318 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/ComboButton_Up_On_Selected.pngbin482 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/DisclosureArrow_Closed_Over.pngbin164 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/DisclosureArrow_Opened_Over.pngbin165 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/PushButton_On_Over.pngbin498 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/PushButton_Selected_Over.pngbin498 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/RadioButton_On_Over.pngbin635 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/RadioButton_Over.pngbin575 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/ScrollArrow_Down_Over.pngbin257 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/ScrollArrow_Left_Over.pngbin295 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/ScrollArrow_Right_Over.pngbin283 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/ScrollArrow_Up_Over.pngbin276 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/ScrollThumb_Horiz_Over.pngbin311 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/ScrollThumb_Vert_Over.pngbin311 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_On.pngbin404 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_On_Disabled.pngbin404 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_On_Over.pngbin394 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_On_Selected.pngbin495 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_On.pngbin308 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_On_Over.pngbin300 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_On_Press.pngbin393 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_Over.pngbin286 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_Selected_Over.pngbin300 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_On.pngbin420 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_On_Over.pngbin416 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_Selected_Over.pngbin416 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/SliderThumb_Over.pngbin482 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/Stepper_Down_Over.pngbin310 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/Stepper_Up_Over.pngbin314 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/windows/Flyout.pngbin820 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/windows/Flyout_Left.pngbin0 -> 271 bytes
-rw-r--r--indra/newview/skins/default/textures/windows/Flyout_Pointer_Up.pngbin260 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/windows/Flyout_Right.pngbin0 -> 280 bytes
-rw-r--r--indra/newview/skins/default/textures/windows/Icon_Gear_Over.pngbin293 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/windows/Icon_Undock_Press.pngbin267 -> 0 bytes
-rw-r--r--indra/newview/skins/default/xui/da/floater_about.xml2
-rw-r--r--indra/newview/skins/default/xui/da/floater_buy_currency.xml2
-rw-r--r--indra/newview/skins/default/xui/da/floater_camera.xml9
-rw-r--r--indra/newview/skins/default/xui/da/floater_nearby_chat.xml2
-rw-r--r--indra/newview/skins/default/xui/da/menu_viewer.xml69
-rw-r--r--indra/newview/skins/default/xui/da/notifications.xml10
-rw-r--r--indra/newview/skins/default/xui/da/panel_my_profile.xml31
-rw-r--r--indra/newview/skins/default/xui/da/panel_notes.xml35
-rw-r--r--indra/newview/skins/default/xui/da/panel_preferences_chat.xml4
-rw-r--r--indra/newview/skins/default/xui/da/panel_profile.xml59
-rw-r--r--indra/newview/skins/default/xui/da/panel_profile_view.xml20
-rw-r--r--indra/newview/skins/default/xui/da/strings.xml3
-rw-r--r--indra/newview/skins/default/xui/da/teleport_strings.xml4
-rw-r--r--indra/newview/skins/default/xui/de/floater_about.xml53
-rw-r--r--indra/newview/skins/default/xui/de/floater_about_land.xml23
-rw-r--r--indra/newview/skins/default/xui/de/floater_avatar.xml2
-rw-r--r--indra/newview/skins/default/xui/de/floater_buy_currency.xml2
-rw-r--r--indra/newview/skins/default/xui/de/floater_camera.xml11
-rw-r--r--indra/newview/skins/default/xui/de/floater_chat_bar.xml7
-rw-r--r--indra/newview/skins/default/xui/de/floater_destinations.xml2
-rw-r--r--indra/newview/skins/default/xui/de/floater_fast_timers.xml10
-rw-r--r--indra/newview/skins/default/xui/de/floater_hardware_settings.xml2
-rw-r--r--indra/newview/skins/default/xui/de/floater_how_to.xml2
-rw-r--r--indra/newview/skins/default/xui/de/floater_map.xml4
-rw-r--r--indra/newview/skins/default/xui/de/floater_model_preview.xml379
-rw-r--r--indra/newview/skins/default/xui/de/floater_model_wizard.xml121
-rw-r--r--indra/newview/skins/default/xui/de/floater_moveview.xml6
-rw-r--r--indra/newview/skins/default/xui/de/floater_my_appearance.xml4
-rw-r--r--indra/newview/skins/default/xui/de/floater_my_inventory.xml2
-rw-r--r--indra/newview/skins/default/xui/de/floater_nearby_chat.xml2
-rw-r--r--indra/newview/skins/default/xui/de/floater_object_weights.xml28
-rw-r--r--indra/newview/skins/default/xui/de/floater_outfit_save_as.xml2
-rw-r--r--indra/newview/skins/default/xui/de/floater_people.xml7
-rw-r--r--indra/newview/skins/default/xui/de/floater_picks.xml2
-rw-r--r--indra/newview/skins/default/xui/de/floater_places.xml4
-rw-r--r--indra/newview/skins/default/xui/de/floater_snapshot.xml122
-rw-r--r--indra/newview/skins/default/xui/de/floater_sound_devices.xml2
-rw-r--r--indra/newview/skins/default/xui/de/floater_stats.xml14
-rw-r--r--indra/newview/skins/default/xui/de/floater_tools.xml11
-rw-r--r--indra/newview/skins/default/xui/de/floater_toybox.xml11
-rw-r--r--indra/newview/skins/default/xui/de/floater_translation_settings.xml58
-rw-r--r--indra/newview/skins/default/xui/de/floater_voice_controls.xml10
-rw-r--r--indra/newview/skins/default/xui/de/inspect_group.xml2
-rw-r--r--indra/newview/skins/default/xui/de/menu_bottomtray.xml2
-rw-r--r--indra/newview/skins/default/xui/de/menu_hide_navbar.xml2
-rw-r--r--indra/newview/skins/default/xui/de/menu_login.xml2
-rw-r--r--indra/newview/skins/default/xui/de/menu_toolbars.xml7
-rw-r--r--indra/newview/skins/default/xui/de/menu_viewer.xml76
-rw-r--r--indra/newview/skins/default/xui/de/notifications.xml58
-rw-r--r--indra/newview/skins/default/xui/de/panel_chiclet_bar.xml15
-rw-r--r--indra/newview/skins/default/xui/de/panel_edit_skin.xml6
-rw-r--r--indra/newview/skins/default/xui/de/panel_me.xml5
-rw-r--r--indra/newview/skins/default/xui/de/panel_my_profile.xml42
-rw-r--r--indra/newview/skins/default/xui/de/panel_navigation_bar.xml35
-rw-r--r--indra/newview/skins/default/xui/de/panel_nearby_chat.xml4
-rw-r--r--indra/newview/skins/default/xui/de/panel_notes.xml35
-rw-r--r--indra/newview/skins/default/xui/de/panel_postcard_message.xml21
-rw-r--r--indra/newview/skins/default/xui/de/panel_postcard_settings.xml23
-rw-r--r--indra/newview/skins/default/xui/de/panel_preferences_chat.xml27
-rw-r--r--indra/newview/skins/default/xui/de/panel_preferences_general.xml5
-rw-r--r--indra/newview/skins/default/xui/de/panel_preferences_move.xml31
-rw-r--r--indra/newview/skins/default/xui/de/panel_preferences_setup.xml2
-rw-r--r--indra/newview/skins/default/xui/de/panel_profile.xml74
-rw-r--r--indra/newview/skins/default/xui/de/panel_profile_view.xml20
-rw-r--r--indra/newview/skins/default/xui/de/panel_snapshot_inventory.xml21
-rw-r--r--indra/newview/skins/default/xui/de/panel_snapshot_local.xml39
-rw-r--r--indra/newview/skins/default/xui/de/panel_snapshot_options.xml7
-rw-r--r--indra/newview/skins/default/xui/de/panel_snapshot_postcard.xml17
-rw-r--r--indra/newview/skins/default/xui/de/panel_snapshot_profile.xml28
-rw-r--r--indra/newview/skins/default/xui/de/panel_status_bar.xml5
-rw-r--r--indra/newview/skins/default/xui/de/strings.xml228
-rw-r--r--indra/newview/skins/default/xui/de/teleport_strings.xml4
-rw-r--r--indra/newview/skins/default/xui/en/floater_about.xml59
-rw-r--r--indra/newview/skins/default/xui/en/floater_about_land.xml164
-rw-r--r--indra/newview/skins/default/xui/en/floater_activeim.xml3
-rw-r--r--indra/newview/skins/default/xui/en/floater_avatar.xml27
-rw-r--r--indra/newview/skins/default/xui/en/floater_avatar_picker.xml1
-rw-r--r--indra/newview/skins/default/xui/en/floater_build_options.xml3
-rw-r--r--indra/newview/skins/default/xui/en/floater_buy_currency.xml2
-rw-r--r--indra/newview/skins/default/xui/en/floater_buy_currency_html.xml1
-rw-r--r--indra/newview/skins/default/xui/en/floater_camera.xml28
-rw-r--r--indra/newview/skins/default/xui/en/floater_chat_bar.xml84
-rw-r--r--indra/newview/skins/default/xui/en/floater_color_picker.xml1
-rw-r--r--indra/newview/skins/default/xui/en/floater_critical.xml2
-rw-r--r--indra/newview/skins/default/xui/en/floater_destinations.xml28
-rw-r--r--indra/newview/skins/default/xui/en/floater_event.xml1
-rw-r--r--indra/newview/skins/default/xui/en/floater_gesture.xml3
-rw-r--r--indra/newview/skins/default/xui/en/floater_hardware_settings.xml2
-rw-r--r--indra/newview/skins/default/xui/en/floater_help_browser.xml4
-rw-r--r--indra/newview/skins/default/xui/en/floater_how_to.xml18
-rw-r--r--indra/newview/skins/default/xui/en/floater_hud.xml1
-rw-r--r--indra/newview/skins/default/xui/en/floater_im_session.xml11
-rw-r--r--indra/newview/skins/default/xui/en/floater_inventory.xml28
-rw-r--r--indra/newview/skins/default/xui/en/floater_inventory_item_properties.xml1
-rw-r--r--indra/newview/skins/default/xui/en/floater_land_holdings.xml1
-rw-r--r--indra/newview/skins/default/xui/en/floater_live_lsleditor.xml1
-rw-r--r--indra/newview/skins/default/xui/en/floater_lsl_guide.xml1
-rw-r--r--indra/newview/skins/default/xui/en/floater_map.xml33
-rw-r--r--indra/newview/skins/default/xui/en/floater_media_browser.xml5
-rw-r--r--indra/newview/skins/default/xui/en/floater_media_settings.xml1
-rw-r--r--indra/newview/skins/default/xui/en/floater_mem_leaking.xml1
-rw-r--r--indra/newview/skins/default/xui/en/floater_merchant_outbox.xml152
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/en/floater_model_preview.xml7
-rw-r--r--indra/newview/skins/default/xui/en/floater_model_wizard.xml34
-rw-r--r--indra/newview/skins/default/xui/en/floater_moveview.xml12
-rw-r--r--indra/newview/skins/default/xui/en/floater_my_appearance.xml25
-rw-r--r--indra/newview/skins/default/xui/en/floater_my_inventory.xml22
-rw-r--r--indra/newview/skins/default/xui/en/floater_my_web_profile.xml9
-rw-r--r--indra/newview/skins/default/xui/en/floater_nearby_chat.xml50
-rw-r--r--indra/newview/skins/default/xui/en/floater_outfit_save_as.xml2
-rw-r--r--indra/newview/skins/default/xui/en/floater_outgoing_call.xml1
-rw-r--r--indra/newview/skins/default/xui/en/floater_people.xml41
-rw-r--r--indra/newview/skins/default/xui/en/floater_picks.xml21
-rw-r--r--indra/newview/skins/default/xui/en/floater_places.xml24
-rw-r--r--indra/newview/skins/default/xui/en/floater_postcard.xml150
-rw-r--r--indra/newview/skins/default/xui/en/floater_preferences.xml3
-rw-r--r--indra/newview/skins/default/xui/en/floater_preview_animation.xml1
-rw-r--r--indra/newview/skins/default/xui/en/floater_preview_gesture.xml3
-rw-r--r--indra/newview/skins/default/xui/en/floater_preview_notecard.xml2
-rw-r--r--indra/newview/skins/default/xui/en/floater_preview_sound.xml1
-rw-r--r--indra/newview/skins/default/xui/en/floater_preview_texture.xml2
-rw-r--r--indra/newview/skins/default/xui/en/floater_publish_classified.xml2
-rw-r--r--indra/newview/skins/default/xui/en/floater_script.xml3
-rw-r--r--indra/newview/skins/default/xui/en/floater_script_debug_panel.xml1
-rw-r--r--indra/newview/skins/default/xui/en/floater_script_preview.xml1
-rw-r--r--indra/newview/skins/default/xui/en/floater_script_queue.xml1
-rw-r--r--indra/newview/skins/default/xui/en/floater_search.xml18
-rw-r--r--indra/newview/skins/default/xui/en/floater_snapshot.xml730
-rw-r--r--indra/newview/skins/default/xui/en/floater_sound_devices.xml3
-rw-r--r--indra/newview/skins/default/xui/en/floater_stats.xml340
-rw-r--r--indra/newview/skins/default/xui/en/floater_sys_well.xml4
-rw-r--r--indra/newview/skins/default/xui/en/floater_telehub.xml1
-rw-r--r--indra/newview/skins/default/xui/en/floater_test_button.xml1
-rw-r--r--indra/newview/skins/default/xui/en/floater_test_layout_stacks.xml206
-rw-r--r--indra/newview/skins/default/xui/en/floater_test_toolbar.xml62
-rw-r--r--indra/newview/skins/default/xui/en/floater_tools.xml6
-rw-r--r--indra/newview/skins/default/xui/en/floater_toybox.xml114
-rw-r--r--indra/newview/skins/default/xui/en/floater_translation_settings.xml244
-rw-r--r--indra/newview/skins/default/xui/en/floater_ui_preview.xml2
-rw-r--r--indra/newview/skins/default/xui/en/floater_voice_controls.xml21
-rw-r--r--indra/newview/skins/default/xui/en/floater_voice_effect.xml1
-rw-r--r--indra/newview/skins/default/xui/en/floater_web_content.xml6
-rw-r--r--indra/newview/skins/default/xui/en/floater_web_profile.xml6
-rw-r--r--indra/newview/skins/default/xui/en/floater_world_map.xml4
-rw-r--r--indra/newview/skins/default/xui/en/inspect_remote_object.xml2
-rw-r--r--indra/newview/skins/default/xui/en/main_view.xml200
-rw-r--r--indra/newview/skins/default/xui/en/menu_bottomtray.xml163
-rw-r--r--indra/newview/skins/default/xui/en/menu_edit.xml3
-rw-r--r--indra/newview/skins/default/xui/en/menu_hide_navbar.xml13
-rw-r--r--indra/newview/skins/default/xui/en/menu_inspect_object_gear.xml9
-rw-r--r--indra/newview/skins/default/xui/en/menu_inventory.xml6
-rw-r--r--indra/newview/skins/default/xui/en/menu_inventory_add.xml1
-rw-r--r--indra/newview/skins/default/xui/en/menu_login.xml70
-rw-r--r--indra/newview/skins/default/xui/en/menu_mode_change.xml24
-rw-r--r--indra/newview/skins/default/xui/en/menu_people_friends_view_sort.xml2
-rw-r--r--indra/newview/skins/default/xui/en/menu_people_nearby_view_sort.xml2
-rw-r--r--indra/newview/skins/default/xui/en/menu_people_recent_view_sort.xml2
-rw-r--r--indra/newview/skins/default/xui/en/menu_toolbars.xml35
-rw-r--r--indra/newview/skins/default/xui/en/menu_viewer.xml813
-rw-r--r--indra/newview/skins/default/xui/en/notifications.xml373
-rw-r--r--indra/newview/skins/default/xui/en/outfit_accordion_tab.xml2
-rw-r--r--indra/newview/skins/default/xui/en/panel_adhoc_control_panel.xml12
-rw-r--r--indra/newview/skins/default/xui/en/panel_bottomtray.xml530
-rw-r--r--indra/newview/skins/default/xui/en/panel_bottomtray_lite.xml8
-rw-r--r--indra/newview/skins/default/xui/en/panel_chat_item.xml3
-rw-r--r--indra/newview/skins/default/xui/en/panel_chiclet_bar.xml173
-rw-r--r--indra/newview/skins/default/xui/en/panel_classified_info.xml12
-rw-r--r--indra/newview/skins/default/xui/en/panel_cof_wearables.xml1
-rw-r--r--indra/newview/skins/default/xui/en/panel_edit_classified.xml2
-rw-r--r--indra/newview/skins/default/xui/en/panel_edit_jacket.xml2
-rw-r--r--indra/newview/skins/default/xui/en/panel_edit_pick.xml2
-rw-r--r--indra/newview/skins/default/xui/en/panel_edit_profile.xml2
-rw-r--r--indra/newview/skins/default/xui/en/panel_edit_skin.xml12
-rw-r--r--indra/newview/skins/default/xui/en/panel_edit_wearable.xml2
-rw-r--r--indra/newview/skins/default/xui/en/panel_group_control_panel.xml11
-rw-r--r--indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml5
-rw-r--r--indra/newview/skins/default/xui/en/panel_group_land_money.xml1
-rw-r--r--indra/newview/skins/default/xui/en/panel_im_control_panel.xml23
-rw-r--r--indra/newview/skins/default/xui/en/panel_landmarks.xml4
-rw-r--r--indra/newview/skins/default/xui/en/panel_login.xml51
-rw-r--r--indra/newview/skins/default/xui/en/panel_main_inventory.xml11
-rw-r--r--indra/newview/skins/default/xui/en/panel_me.xml45
-rw-r--r--indra/newview/skins/default/xui/en/panel_my_profile.xml146
-rw-r--r--indra/newview/skins/default/xui/en/panel_navigation_bar.xml309
-rw-r--r--indra/newview/skins/default/xui/en/panel_nearby_chat.xml35
-rw-r--r--indra/newview/skins/default/xui/en/panel_nearby_media.xml10
-rw-r--r--indra/newview/skins/default/xui/en/panel_notes.xml236
-rw-r--r--indra/newview/skins/default/xui/en/panel_notification.xml2
-rw-r--r--indra/newview/skins/default/xui/en/panel_outbox_inventory.xml1
-rw-r--r--indra/newview/skins/default/xui/en/panel_outfit_edit.xml6
-rw-r--r--indra/newview/skins/default/xui/en/panel_outfits_inventory.xml2
-rw-r--r--indra/newview/skins/default/xui/en/panel_people.xml12
-rw-r--r--indra/newview/skins/default/xui/en/panel_pick_info.xml5
-rw-r--r--indra/newview/skins/default/xui/en/panel_picks.xml22
-rw-r--r--indra/newview/skins/default/xui/en/panel_place_profile.xml2
-rw-r--r--indra/newview/skins/default/xui/en/panel_places.xml14
-rw-r--r--indra/newview/skins/default/xui/en/panel_postcard_message.xml125
-rw-r--r--indra/newview/skins/default/xui/en/panel_postcard_settings.xml135
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_chat.xml127
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_general.xml22
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_move.xml172
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_privacy.xml1
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_setup.xml2
-rw-r--r--indra/newview/skins/default/xui/en/panel_prim_media_controls.xml35
-rw-r--r--indra/newview/skins/default/xui/en/panel_profile.xml458
-rw-r--r--indra/newview/skins/default/xui/en/panel_profile_view.xml162
-rw-r--r--indra/newview/skins/default/xui/en/panel_progress.xml33
-rw-r--r--indra/newview/skins/default/xui/en/panel_region_covenant.xml12
-rw-r--r--indra/newview/skins/default/xui/en/panel_region_debug.xml24
-rw-r--r--indra/newview/skins/default/xui/en/panel_region_estate.xml10
-rw-r--r--indra/newview/skins/default/xui/en/panel_script_ed.xml22
-rw-r--r--indra/newview/skins/default/xui/en/panel_side_tray.xml174
-rw-r--r--indra/newview/skins/default/xui/en/panel_snapshot_inventory.xml147
-rw-r--r--indra/newview/skins/default/xui/en/panel_snapshot_local.xml234
-rw-r--r--indra/newview/skins/default/xui/en/panel_snapshot_options.xml84
-rw-r--r--indra/newview/skins/default/xui/en/panel_snapshot_postcard.xml99
-rw-r--r--indra/newview/skins/default/xui/en/panel_snapshot_profile.xml198
-rw-r--r--indra/newview/skins/default/xui/en/panel_status_bar.xml68
-rw-r--r--indra/newview/skins/default/xui/en/panel_toast.xml2
-rw-r--r--indra/newview/skins/default/xui/en/panel_toolbar_view.xml159
-rw-r--r--indra/newview/skins/default/xui/en/panel_topinfo_bar.xml2
-rw-r--r--indra/newview/skins/default/xui/en/sidepanel_inventory.xml197
-rw-r--r--indra/newview/skins/default/xui/en/sidepanel_task_info.xml2
-rw-r--r--indra/newview/skins/default/xui/en/strings.xml219
-rw-r--r--indra/newview/skins/default/xui/en/teleport_strings.xml4
-rw-r--r--indra/newview/skins/default/xui/en/widgets/button.xml7
-rw-r--r--indra/newview/skins/default/xui/en/widgets/chiclet_im_adhoc.xml21
-rw-r--r--indra/newview/skins/default/xui/en/widgets/chiclet_im_group.xml21
-rw-r--r--indra/newview/skins/default/xui/en/widgets/chiclet_im_p2p.xml21
-rw-r--r--indra/newview/skins/default/xui/en/widgets/floater.xml4
-rw-r--r--indra/newview/skins/default/xui/en/widgets/inbox_folder_view_item.xml19
-rw-r--r--indra/newview/skins/default/xui/en/widgets/joystick_rotate.xml7
-rw-r--r--indra/newview/skins/default/xui/en/widgets/outbox_folder_view_folder.xml10
-rw-r--r--indra/newview/skins/default/xui/en/widgets/outbox_inventory_panel.xml2
-rw-r--r--indra/newview/skins/default/xui/en/widgets/toolbar.xml57
-rw-r--r--indra/newview/skins/default/xui/en/widgets/window_shade.xml2
-rw-r--r--indra/newview/skins/default/xui/es/floater_about.xml53
-rw-r--r--indra/newview/skins/default/xui/es/floater_about_land.xml23
-rw-r--r--indra/newview/skins/default/xui/es/floater_avatar.xml2
-rw-r--r--indra/newview/skins/default/xui/es/floater_buy_currency.xml2
-rw-r--r--indra/newview/skins/default/xui/es/floater_buy_land.xml2
-rw-r--r--indra/newview/skins/default/xui/es/floater_camera.xml11
-rw-r--r--indra/newview/skins/default/xui/es/floater_chat_bar.xml7
-rw-r--r--indra/newview/skins/default/xui/es/floater_destinations.xml2
-rw-r--r--indra/newview/skins/default/xui/es/floater_fast_timers.xml10
-rw-r--r--indra/newview/skins/default/xui/es/floater_hardware_settings.xml2
-rw-r--r--indra/newview/skins/default/xui/es/floater_how_to.xml2
-rw-r--r--indra/newview/skins/default/xui/es/floater_map.xml4
-rw-r--r--indra/newview/skins/default/xui/es/floater_model_preview.xml379
-rw-r--r--indra/newview/skins/default/xui/es/floater_model_wizard.xml121
-rw-r--r--indra/newview/skins/default/xui/es/floater_moveview.xml6
-rw-r--r--indra/newview/skins/default/xui/es/floater_my_appearance.xml4
-rw-r--r--indra/newview/skins/default/xui/es/floater_my_inventory.xml2
-rw-r--r--indra/newview/skins/default/xui/es/floater_nearby_chat.xml2
-rw-r--r--indra/newview/skins/default/xui/es/floater_object_weights.xml28
-rw-r--r--indra/newview/skins/default/xui/es/floater_outfit_save_as.xml2
-rw-r--r--indra/newview/skins/default/xui/es/floater_people.xml7
-rw-r--r--indra/newview/skins/default/xui/es/floater_picks.xml2
-rw-r--r--indra/newview/skins/default/xui/es/floater_places.xml4
-rw-r--r--indra/newview/skins/default/xui/es/floater_snapshot.xml122
-rw-r--r--indra/newview/skins/default/xui/es/floater_sound_devices.xml2
-rw-r--r--indra/newview/skins/default/xui/es/floater_stats.xml24
-rw-r--r--indra/newview/skins/default/xui/es/floater_tools.xml11
-rw-r--r--indra/newview/skins/default/xui/es/floater_toybox.xml11
-rw-r--r--indra/newview/skins/default/xui/es/floater_translation_settings.xml58
-rw-r--r--indra/newview/skins/default/xui/es/floater_voice_controls.xml10
-rw-r--r--indra/newview/skins/default/xui/es/menu_hide_navbar.xml2
-rw-r--r--indra/newview/skins/default/xui/es/menu_login.xml2
-rw-r--r--indra/newview/skins/default/xui/es/menu_toolbars.xml7
-rw-r--r--indra/newview/skins/default/xui/es/menu_viewer.xml76
-rw-r--r--indra/newview/skins/default/xui/es/notifications.xml58
-rw-r--r--indra/newview/skins/default/xui/es/panel_chiclet_bar.xml15
-rw-r--r--indra/newview/skins/default/xui/es/panel_edit_skin.xml6
-rw-r--r--indra/newview/skins/default/xui/es/panel_me.xml5
-rw-r--r--indra/newview/skins/default/xui/es/panel_my_profile.xml31
-rw-r--r--indra/newview/skins/default/xui/es/panel_navigation_bar.xml35
-rw-r--r--indra/newview/skins/default/xui/es/panel_nearby_chat.xml4
-rw-r--r--indra/newview/skins/default/xui/es/panel_notes.xml35
-rw-r--r--indra/newview/skins/default/xui/es/panel_people.xml2
-rw-r--r--indra/newview/skins/default/xui/es/panel_pick_info.xml2
-rw-r--r--indra/newview/skins/default/xui/es/panel_postcard_message.xml21
-rw-r--r--indra/newview/skins/default/xui/es/panel_postcard_settings.xml23
-rw-r--r--indra/newview/skins/default/xui/es/panel_preferences_chat.xml27
-rw-r--r--indra/newview/skins/default/xui/es/panel_preferences_general.xml5
-rw-r--r--indra/newview/skins/default/xui/es/panel_preferences_move.xml31
-rw-r--r--indra/newview/skins/default/xui/es/panel_preferences_setup.xml2
-rw-r--r--indra/newview/skins/default/xui/es/panel_profile.xml70
-rw-r--r--indra/newview/skins/default/xui/es/panel_profile_view.xml20
-rw-r--r--indra/newview/skins/default/xui/es/panel_region_estate.xml4
-rw-r--r--indra/newview/skins/default/xui/es/panel_snapshot_inventory.xml21
-rw-r--r--indra/newview/skins/default/xui/es/panel_snapshot_local.xml39
-rw-r--r--indra/newview/skins/default/xui/es/panel_snapshot_options.xml7
-rw-r--r--indra/newview/skins/default/xui/es/panel_snapshot_postcard.xml17
-rw-r--r--indra/newview/skins/default/xui/es/panel_snapshot_profile.xml28
-rw-r--r--indra/newview/skins/default/xui/es/panel_status_bar.xml7
-rw-r--r--indra/newview/skins/default/xui/es/sidepanel_inventory.xml2
-rw-r--r--indra/newview/skins/default/xui/es/strings.xml239
-rw-r--r--indra/newview/skins/default/xui/es/teleport_strings.xml4
-rw-r--r--indra/newview/skins/default/xui/fr/floater_about.xml55
-rw-r--r--indra/newview/skins/default/xui/fr/floater_about_land.xml23
-rw-r--r--indra/newview/skins/default/xui/fr/floater_avatar.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/floater_buy_currency.xml8
-rw-r--r--indra/newview/skins/default/xui/fr/floater_camera.xml11
-rw-r--r--indra/newview/skins/default/xui/fr/floater_chat_bar.xml7
-rw-r--r--indra/newview/skins/default/xui/fr/floater_destinations.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/floater_fast_timers.xml10
-rw-r--r--indra/newview/skins/default/xui/fr/floater_hardware_settings.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/floater_how_to.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/floater_map.xml4
-rw-r--r--indra/newview/skins/default/xui/fr/floater_model_preview.xml379
-rw-r--r--indra/newview/skins/default/xui/fr/floater_model_wizard.xml121
-rw-r--r--indra/newview/skins/default/xui/fr/floater_moveview.xml6
-rw-r--r--indra/newview/skins/default/xui/fr/floater_my_appearance.xml4
-rw-r--r--indra/newview/skins/default/xui/fr/floater_my_inventory.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/floater_nearby_chat.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/floater_object_weights.xml28
-rw-r--r--indra/newview/skins/default/xui/fr/floater_outfit_save_as.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/floater_people.xml7
-rw-r--r--indra/newview/skins/default/xui/fr/floater_picks.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/floater_places.xml4
-rw-r--r--indra/newview/skins/default/xui/fr/floater_preview_animation.xml4
-rw-r--r--indra/newview/skins/default/xui/fr/floater_snapshot.xml124
-rw-r--r--indra/newview/skins/default/xui/fr/floater_sound_devices.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/floater_stats.xml30
-rw-r--r--indra/newview/skins/default/xui/fr/floater_tools.xml11
-rw-r--r--indra/newview/skins/default/xui/fr/floater_toybox.xml11
-rw-r--r--indra/newview/skins/default/xui/fr/floater_translation_settings.xml58
-rw-r--r--indra/newview/skins/default/xui/fr/floater_voice_controls.xml10
-rw-r--r--indra/newview/skins/default/xui/fr/menu_group_plus.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/menu_hide_navbar.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/menu_inventory.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/menu_login.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/menu_people_nearby_view_sort.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/menu_toolbars.xml7
-rw-r--r--indra/newview/skins/default/xui/fr/menu_viewer.xml82
-rw-r--r--indra/newview/skins/default/xui/fr/notifications.xml62
-rw-r--r--indra/newview/skins/default/xui/fr/panel_chiclet_bar.xml15
-rw-r--r--indra/newview/skins/default/xui/fr/panel_edit_skin.xml6
-rw-r--r--indra/newview/skins/default/xui/fr/panel_me.xml5
-rw-r--r--indra/newview/skins/default/xui/fr/panel_my_profile.xml42
-rw-r--r--indra/newview/skins/default/xui/fr/panel_navigation_bar.xml35
-rw-r--r--indra/newview/skins/default/xui/fr/panel_nearby_chat.xml4
-rw-r--r--indra/newview/skins/default/xui/fr/panel_notes.xml35
-rw-r--r--indra/newview/skins/default/xui/fr/panel_postcard_message.xml21
-rw-r--r--indra/newview/skins/default/xui/fr/panel_postcard_settings.xml23
-rw-r--r--indra/newview/skins/default/xui/fr/panel_preferences_chat.xml29
-rw-r--r--indra/newview/skins/default/xui/fr/panel_preferences_general.xml5
-rw-r--r--indra/newview/skins/default/xui/fr/panel_preferences_graphics1.xml6
-rw-r--r--indra/newview/skins/default/xui/fr/panel_preferences_move.xml31
-rw-r--r--indra/newview/skins/default/xui/fr/panel_preferences_privacy.xml6
-rw-r--r--indra/newview/skins/default/xui/fr/panel_preferences_setup.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/panel_preferences_sound.xml6
-rw-r--r--indra/newview/skins/default/xui/fr/panel_prim_media_controls.xml8
-rw-r--r--indra/newview/skins/default/xui/fr/panel_profile.xml74
-rw-r--r--indra/newview/skins/default/xui/fr/panel_profile_view.xml20
-rw-r--r--indra/newview/skins/default/xui/fr/panel_region_debug.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/panel_snapshot_inventory.xml21
-rw-r--r--indra/newview/skins/default/xui/fr/panel_snapshot_local.xml39
-rw-r--r--indra/newview/skins/default/xui/fr/panel_snapshot_options.xml7
-rw-r--r--indra/newview/skins/default/xui/fr/panel_snapshot_postcard.xml17
-rw-r--r--indra/newview/skins/default/xui/fr/panel_snapshot_profile.xml28
-rw-r--r--indra/newview/skins/default/xui/fr/panel_status_bar.xml11
-rw-r--r--indra/newview/skins/default/xui/fr/strings.xml238
-rw-r--r--indra/newview/skins/default/xui/fr/teleport_strings.xml4
-rw-r--r--indra/newview/skins/default/xui/it/floater_about.xml55
-rw-r--r--indra/newview/skins/default/xui/it/floater_about_land.xml23
-rw-r--r--indra/newview/skins/default/xui/it/floater_avatar.xml2
-rw-r--r--indra/newview/skins/default/xui/it/floater_buy_currency.xml2
-rw-r--r--indra/newview/skins/default/xui/it/floater_camera.xml11
-rw-r--r--indra/newview/skins/default/xui/it/floater_chat_bar.xml7
-rw-r--r--indra/newview/skins/default/xui/it/floater_destinations.xml2
-rw-r--r--indra/newview/skins/default/xui/it/floater_fast_timers.xml10
-rw-r--r--indra/newview/skins/default/xui/it/floater_hardware_settings.xml2
-rw-r--r--indra/newview/skins/default/xui/it/floater_how_to.xml2
-rw-r--r--indra/newview/skins/default/xui/it/floater_map.xml4
-rw-r--r--indra/newview/skins/default/xui/it/floater_model_preview.xml379
-rw-r--r--indra/newview/skins/default/xui/it/floater_model_wizard.xml121
-rw-r--r--indra/newview/skins/default/xui/it/floater_moveview.xml6
-rw-r--r--indra/newview/skins/default/xui/it/floater_my_appearance.xml4
-rw-r--r--indra/newview/skins/default/xui/it/floater_my_inventory.xml2
-rw-r--r--indra/newview/skins/default/xui/it/floater_nearby_chat.xml2
-rw-r--r--indra/newview/skins/default/xui/it/floater_object_weights.xml28
-rw-r--r--indra/newview/skins/default/xui/it/floater_outfit_save_as.xml2
-rw-r--r--indra/newview/skins/default/xui/it/floater_people.xml7
-rw-r--r--indra/newview/skins/default/xui/it/floater_picks.xml2
-rw-r--r--indra/newview/skins/default/xui/it/floater_places.xml4
-rw-r--r--indra/newview/skins/default/xui/it/floater_snapshot.xml124
-rw-r--r--indra/newview/skins/default/xui/it/floater_sound_devices.xml2
-rw-r--r--indra/newview/skins/default/xui/it/floater_stats.xml26
-rw-r--r--indra/newview/skins/default/xui/it/floater_tools.xml11
-rw-r--r--indra/newview/skins/default/xui/it/floater_toybox.xml11
-rw-r--r--indra/newview/skins/default/xui/it/floater_translation_settings.xml58
-rw-r--r--indra/newview/skins/default/xui/it/floater_voice_controls.xml10
-rw-r--r--indra/newview/skins/default/xui/it/menu_hide_navbar.xml2
-rw-r--r--indra/newview/skins/default/xui/it/menu_login.xml2
-rw-r--r--indra/newview/skins/default/xui/it/menu_toolbars.xml7
-rw-r--r--indra/newview/skins/default/xui/it/menu_viewer.xml84
-rw-r--r--indra/newview/skins/default/xui/it/notifications.xml62
-rw-r--r--indra/newview/skins/default/xui/it/panel_chiclet_bar.xml15
-rw-r--r--indra/newview/skins/default/xui/it/panel_edit_skin.xml6
-rw-r--r--indra/newview/skins/default/xui/it/panel_me.xml5
-rw-r--r--indra/newview/skins/default/xui/it/panel_my_profile.xml31
-rw-r--r--indra/newview/skins/default/xui/it/panel_navigation_bar.xml35
-rw-r--r--indra/newview/skins/default/xui/it/panel_nearby_chat.xml4
-rw-r--r--indra/newview/skins/default/xui/it/panel_notes.xml35
-rw-r--r--indra/newview/skins/default/xui/it/panel_postcard_message.xml21
-rw-r--r--indra/newview/skins/default/xui/it/panel_postcard_settings.xml23
-rw-r--r--indra/newview/skins/default/xui/it/panel_preferences_chat.xml27
-rw-r--r--indra/newview/skins/default/xui/it/panel_preferences_general.xml5
-rw-r--r--indra/newview/skins/default/xui/it/panel_preferences_move.xml31
-rw-r--r--indra/newview/skins/default/xui/it/panel_preferences_setup.xml2
-rw-r--r--indra/newview/skins/default/xui/it/panel_profile.xml70
-rw-r--r--indra/newview/skins/default/xui/it/panel_profile_view.xml22
-rw-r--r--indra/newview/skins/default/xui/it/panel_snapshot_inventory.xml21
-rw-r--r--indra/newview/skins/default/xui/it/panel_snapshot_local.xml39
-rw-r--r--indra/newview/skins/default/xui/it/panel_snapshot_options.xml7
-rw-r--r--indra/newview/skins/default/xui/it/panel_snapshot_postcard.xml17
-rw-r--r--indra/newview/skins/default/xui/it/panel_snapshot_profile.xml28
-rw-r--r--indra/newview/skins/default/xui/it/panel_status_bar.xml7
-rw-r--r--indra/newview/skins/default/xui/it/sidepanel_inventory.xml2
-rw-r--r--indra/newview/skins/default/xui/it/strings.xml234
-rw-r--r--indra/newview/skins/default/xui/it/teleport_strings.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/floater_about.xml7
-rw-r--r--indra/newview/skins/default/xui/ja/floater_about_land.xml23
-rw-r--r--indra/newview/skins/default/xui/ja/floater_avatar.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/floater_buy_currency.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/floater_camera.xml11
-rw-r--r--indra/newview/skins/default/xui/ja/floater_chat_bar.xml7
-rw-r--r--indra/newview/skins/default/xui/ja/floater_destinations.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/floater_fast_timers.xml10
-rw-r--r--indra/newview/skins/default/xui/ja/floater_hardware_settings.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/floater_how_to.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/floater_map.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/floater_model_preview.xml379
-rw-r--r--indra/newview/skins/default/xui/ja/floater_model_wizard.xml121
-rw-r--r--indra/newview/skins/default/xui/ja/floater_moveview.xml6
-rw-r--r--indra/newview/skins/default/xui/ja/floater_my_appearance.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/floater_my_inventory.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/floater_nearby_chat.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/floater_object_weights.xml28
-rw-r--r--indra/newview/skins/default/xui/ja/floater_people.xml7
-rw-r--r--indra/newview/skins/default/xui/ja/floater_picks.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/floater_places.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/floater_snapshot.xml122
-rw-r--r--indra/newview/skins/default/xui/ja/floater_stats.xml12
-rw-r--r--indra/newview/skins/default/xui/ja/floater_tools.xml11
-rw-r--r--indra/newview/skins/default/xui/ja/floater_toybox.xml11
-rw-r--r--indra/newview/skins/default/xui/ja/floater_translation_settings.xml58
-rw-r--r--indra/newview/skins/default/xui/ja/floater_voice_controls.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/menu_hide_navbar.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/menu_login.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/menu_toolbars.xml7
-rw-r--r--indra/newview/skins/default/xui/ja/menu_viewer.xml74
-rw-r--r--indra/newview/skins/default/xui/ja/notifications.xml56
-rw-r--r--indra/newview/skins/default/xui/ja/panel_chiclet_bar.xml15
-rw-r--r--indra/newview/skins/default/xui/ja/panel_edit_skin.xml6
-rw-r--r--indra/newview/skins/default/xui/ja/panel_me.xml5
-rw-r--r--indra/newview/skins/default/xui/ja/panel_my_profile.xml42
-rw-r--r--indra/newview/skins/default/xui/ja/panel_navigation_bar.xml35
-rw-r--r--indra/newview/skins/default/xui/ja/panel_nearby_chat.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/panel_notes.xml35
-rw-r--r--indra/newview/skins/default/xui/ja/panel_postcard_message.xml21
-rw-r--r--indra/newview/skins/default/xui/ja/panel_postcard_settings.xml23
-rw-r--r--indra/newview/skins/default/xui/ja/panel_preferences_chat.xml27
-rw-r--r--indra/newview/skins/default/xui/ja/panel_preferences_general.xml5
-rw-r--r--indra/newview/skins/default/xui/ja/panel_preferences_move.xml31
-rw-r--r--indra/newview/skins/default/xui/ja/panel_preferences_setup.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/panel_profile.xml74
-rw-r--r--indra/newview/skins/default/xui/ja/panel_profile_view.xml22
-rw-r--r--indra/newview/skins/default/xui/ja/panel_snapshot_inventory.xml21
-rw-r--r--indra/newview/skins/default/xui/ja/panel_snapshot_local.xml39
-rw-r--r--indra/newview/skins/default/xui/ja/panel_snapshot_options.xml7
-rw-r--r--indra/newview/skins/default/xui/ja/panel_snapshot_postcard.xml17
-rw-r--r--indra/newview/skins/default/xui/ja/panel_snapshot_profile.xml28
-rw-r--r--indra/newview/skins/default/xui/ja/panel_status_bar.xml5
-rw-r--r--indra/newview/skins/default/xui/ja/strings.xml234
-rw-r--r--indra/newview/skins/default/xui/ja/teleport_strings.xml4
-rw-r--r--indra/newview/skins/default/xui/nl/floater_about.xml81
-rw-r--r--indra/newview/skins/default/xui/nl/floater_about_land.xml488
-rw-r--r--indra/newview/skins/default/xui/nl/floater_animation_preview.xml85
-rw-r--r--indra/newview/skins/default/xui/nl/floater_auction.xml9
-rw-r--r--indra/newview/skins/default/xui/nl/floater_avatar_picker.xml42
-rw-r--r--indra/newview/skins/default/xui/nl/floater_avatar_textures.xml30
-rw-r--r--indra/newview/skins/default/xui/nl/floater_beacons.xml15
-rw-r--r--indra/newview/skins/default/xui/nl/floater_build_options.xml8
-rw-r--r--indra/newview/skins/default/xui/nl/floater_bulk_perms.xml44
-rw-r--r--indra/newview/skins/default/xui/nl/floater_bumps.xml21
-rw-r--r--indra/newview/skins/default/xui/nl/floater_buy_contents.xml21
-rw-r--r--indra/newview/skins/default/xui/nl/floater_buy_currency.xml68
-rw-r--r--indra/newview/skins/default/xui/nl/floater_buy_land.xml235
-rw-r--r--indra/newview/skins/default/xui/nl/floater_buy_object.xml26
-rw-r--r--indra/newview/skins/default/xui/nl/floater_camera.xml16
-rw-r--r--indra/newview/skins/default/xui/nl/floater_choose_group.xml8
-rw-r--r--indra/newview/skins/default/xui/nl/floater_color_picker.xml31
-rw-r--r--indra/newview/skins/default/xui/nl/floater_critical.xml11
-rw-r--r--indra/newview/skins/default/xui/nl/floater_event.xml40
-rw-r--r--indra/newview/skins/default/xui/nl/floater_font_test.xml6
-rw-r--r--indra/newview/skins/default/xui/nl/floater_gesture.xml15
-rw-r--r--indra/newview/skins/default/xui/nl/floater_hardware_settings.xml28
-rw-r--r--indra/newview/skins/default/xui/nl/floater_hud.xml2
-rw-r--r--indra/newview/skins/default/xui/nl/floater_image_preview.xml33
-rw-r--r--indra/newview/skins/default/xui/nl/floater_inspect.xml11
-rw-r--r--indra/newview/skins/default/xui/nl/floater_inventory.xml47
-rw-r--r--indra/newview/skins/default/xui/nl/floater_inventory_item_properties.xml75
-rw-r--r--indra/newview/skins/default/xui/nl/floater_inventory_view_finder.xml24
-rw-r--r--indra/newview/skins/default/xui/nl/floater_joystick.xml80
-rw-r--r--indra/newview/skins/default/xui/nl/floater_lagmeter.xml152
-rw-r--r--indra/newview/skins/default/xui/nl/floater_land_holdings.xml39
-rw-r--r--indra/newview/skins/default/xui/nl/floater_live_lsleditor.xml12
-rw-r--r--indra/newview/skins/default/xui/nl/floater_lsl_guide.xml7
-rw-r--r--indra/newview/skins/default/xui/nl/floater_map.xml51
-rw-r--r--indra/newview/skins/default/xui/nl/floater_media_browser.xml19
-rw-r--r--indra/newview/skins/default/xui/nl/floater_mem_leaking.xml18
-rw-r--r--indra/newview/skins/default/xui/nl/floater_moveview.xml13
-rw-r--r--indra/newview/skins/default/xui/nl/floater_mute_object.xml14
-rw-r--r--indra/newview/skins/default/xui/nl/floater_openobject.xml8
-rw-r--r--indra/newview/skins/default/xui/nl/floater_pay.xml21
-rw-r--r--indra/newview/skins/default/xui/nl/floater_pay_object.xml30
-rw-r--r--indra/newview/skins/default/xui/nl/floater_perm_prefs.xml16
-rw-r--r--indra/newview/skins/default/xui/nl/floater_post_process.xml53
-rw-r--r--indra/newview/skins/default/xui/nl/floater_postcard.xml36
-rw-r--r--indra/newview/skins/default/xui/nl/floater_preferences.xml8
-rw-r--r--indra/newview/skins/default/xui/nl/floater_preview_animation.xml8
-rw-r--r--indra/newview/skins/default/xui/nl/floater_preview_gesture.xml58
-rw-r--r--indra/newview/skins/default/xui/nl/floater_preview_notecard.xml16
-rw-r--r--indra/newview/skins/default/xui/nl/floater_preview_sound.xml8
-rw-r--r--indra/newview/skins/default/xui/nl/floater_preview_texture.xml9
-rw-r--r--indra/newview/skins/default/xui/nl/floater_region_info.xml2
-rw-r--r--indra/newview/skins/default/xui/nl/floater_report_abuse.xml103
-rw-r--r--indra/newview/skins/default/xui/nl/floater_script_debug.xml6
-rw-r--r--indra/newview/skins/default/xui/nl/floater_script_preview.xml6
-rw-r--r--indra/newview/skins/default/xui/nl/floater_script_queue.xml4
-rw-r--r--indra/newview/skins/default/xui/nl/floater_script_search.xml15
-rw-r--r--indra/newview/skins/default/xui/nl/floater_select_key.xml7
-rw-r--r--indra/newview/skins/default/xui/nl/floater_sell_land.xml65
-rw-r--r--indra/newview/skins/default/xui/nl/floater_settings_debug.xml13
-rw-r--r--indra/newview/skins/default/xui/nl/floater_snapshot.xml79
-rw-r--r--indra/newview/skins/default/xui/nl/floater_sound_preview.xml11
-rw-r--r--indra/newview/skins/default/xui/nl/floater_stats.xml71
-rw-r--r--indra/newview/skins/default/xui/nl/floater_telehub.xml33
-rw-r--r--indra/newview/skins/default/xui/nl/floater_texture_ctrl.xml23
-rw-r--r--indra/newview/skins/default/xui/nl/floater_tools.xml567
-rw-r--r--indra/newview/skins/default/xui/nl/floater_top_objects.xml55
-rw-r--r--indra/newview/skins/default/xui/nl/floater_tos.xml16
-rw-r--r--indra/newview/skins/default/xui/nl/floater_url_entry.xml12
-rw-r--r--indra/newview/skins/default/xui/nl/floater_world_map.xml54
-rw-r--r--indra/newview/skins/default/xui/nl/language_settings.xml57
-rw-r--r--indra/newview/skins/default/xui/nl/menu_inventory.xml82
-rw-r--r--indra/newview/skins/default/xui/nl/menu_inventory_add.xml32
-rw-r--r--indra/newview/skins/default/xui/nl/menu_login.xml13
-rw-r--r--indra/newview/skins/default/xui/nl/menu_mini_map.xml8
-rw-r--r--indra/newview/skins/default/xui/nl/menu_picks.xml8
-rw-r--r--indra/newview/skins/default/xui/nl/menu_places_gear_landmark.xml18
-rw-r--r--indra/newview/skins/default/xui/nl/menu_slurl.xml6
-rw-r--r--indra/newview/skins/default/xui/nl/menu_viewer.xml207
-rw-r--r--indra/newview/skins/default/xui/nl/mime_types.xml230
-rw-r--r--indra/newview/skins/default/xui/nl/notifications.xml3044
-rw-r--r--indra/newview/skins/default/xui/nl/panel_block_list_sidetray.xml10
-rw-r--r--indra/newview/skins/default/xui/nl/panel_edit_profile.xml45
-rw-r--r--indra/newview/skins/default/xui/nl/panel_group_general.xml72
-rw-r--r--indra/newview/skins/default/xui/nl/panel_group_invite.xml24
-rw-r--r--indra/newview/skins/default/xui/nl/panel_group_land_money.xml84
-rw-r--r--indra/newview/skins/default/xui/nl/panel_group_notices.xml62
-rw-r--r--indra/newview/skins/default/xui/nl/panel_group_roles.xml101
-rw-r--r--indra/newview/skins/default/xui/nl/panel_login.xml41
-rw-r--r--indra/newview/skins/default/xui/nl/panel_main_inventory.xml64
-rw-r--r--indra/newview/skins/default/xui/nl/panel_preferences_advanced.xml48
-rw-r--r--indra/newview/skins/default/xui/nl/panel_preferences_alerts.xml14
-rw-r--r--indra/newview/skins/default/xui/nl/panel_preferences_chat.xml42
-rw-r--r--indra/newview/skins/default/xui/nl/panel_preferences_general.xml90
-rw-r--r--indra/newview/skins/default/xui/nl/panel_preferences_graphics1.xml145
-rw-r--r--indra/newview/skins/default/xui/nl/panel_preferences_privacy.xml32
-rw-r--r--indra/newview/skins/default/xui/nl/panel_preferences_setup.xml31
-rw-r--r--indra/newview/skins/default/xui/nl/panel_preferences_sound.xml39
-rw-r--r--indra/newview/skins/default/xui/nl/panel_region_covenant.xml84
-rw-r--r--indra/newview/skins/default/xui/nl/panel_region_debug.xml40
-rw-r--r--indra/newview/skins/default/xui/nl/panel_region_estate.xml70
-rw-r--r--indra/newview/skins/default/xui/nl/panel_region_general.xml53
-rw-r--r--indra/newview/skins/default/xui/nl/panel_region_terrain.xml27
-rw-r--r--indra/newview/skins/default/xui/nl/panel_region_texture.xml57
-rw-r--r--indra/newview/skins/default/xui/nl/panel_scrolling_param.xml10
-rw-r--r--indra/newview/skins/default/xui/nl/panel_status_bar.xml38
-rw-r--r--indra/newview/skins/default/xui/nl/panel_world_map.xml57
-rw-r--r--indra/newview/skins/default/xui/nl/role_actions.xml76
-rw-r--r--indra/newview/skins/default/xui/nl/strings.xml3247
-rw-r--r--indra/newview/skins/default/xui/nl/teleport_strings.xml75
-rw-r--r--indra/newview/skins/default/xui/pl/floater_about.xml2
-rw-r--r--indra/newview/skins/default/xui/pl/floater_buy_currency.xml2
-rw-r--r--indra/newview/skins/default/xui/pl/floater_camera.xml9
-rw-r--r--indra/newview/skins/default/xui/pl/floater_nearby_chat.xml2
-rw-r--r--indra/newview/skins/default/xui/pl/menu_viewer.xml69
-rw-r--r--indra/newview/skins/default/xui/pl/notifications.xml12
-rw-r--r--indra/newview/skins/default/xui/pl/panel_my_profile.xml31
-rw-r--r--indra/newview/skins/default/xui/pl/panel_notes.xml35
-rw-r--r--indra/newview/skins/default/xui/pl/panel_preferences_chat.xml4
-rw-r--r--indra/newview/skins/default/xui/pl/panel_preferences_general.xml1
-rw-r--r--indra/newview/skins/default/xui/pl/panel_profile.xml59
-rw-r--r--indra/newview/skins/default/xui/pl/panel_profile_view.xml20
-rw-r--r--indra/newview/skins/default/xui/pl/strings.xml3
-rw-r--r--indra/newview/skins/default/xui/pl/teleport_strings.xml4
-rw-r--r--indra/newview/skins/default/xui/pt/floater_about.xml37
-rw-r--r--indra/newview/skins/default/xui/pt/floater_about_land.xml23
-rw-r--r--indra/newview/skins/default/xui/pt/floater_avatar.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/floater_buy_currency.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/floater_camera.xml11
-rw-r--r--indra/newview/skins/default/xui/pt/floater_chat_bar.xml7
-rw-r--r--indra/newview/skins/default/xui/pt/floater_destinations.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/floater_fast_timers.xml10
-rw-r--r--indra/newview/skins/default/xui/pt/floater_hardware_settings.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/floater_how_to.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/floater_map.xml4
-rw-r--r--indra/newview/skins/default/xui/pt/floater_model_preview.xml379
-rw-r--r--indra/newview/skins/default/xui/pt/floater_model_wizard.xml121
-rw-r--r--indra/newview/skins/default/xui/pt/floater_moveview.xml6
-rw-r--r--indra/newview/skins/default/xui/pt/floater_my_appearance.xml4
-rw-r--r--indra/newview/skins/default/xui/pt/floater_my_inventory.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/floater_nearby_chat.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/floater_object_weights.xml28
-rw-r--r--indra/newview/skins/default/xui/pt/floater_outfit_save_as.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/floater_people.xml7
-rw-r--r--indra/newview/skins/default/xui/pt/floater_picks.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/floater_places.xml4
-rw-r--r--indra/newview/skins/default/xui/pt/floater_snapshot.xml122
-rw-r--r--indra/newview/skins/default/xui/pt/floater_sound_devices.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/floater_stats.xml26
-rw-r--r--indra/newview/skins/default/xui/pt/floater_tools.xml11
-rw-r--r--indra/newview/skins/default/xui/pt/floater_toybox.xml11
-rw-r--r--indra/newview/skins/default/xui/pt/floater_translation_settings.xml58
-rw-r--r--indra/newview/skins/default/xui/pt/floater_voice_controls.xml10
-rw-r--r--indra/newview/skins/default/xui/pt/inspect_avatar.xml4
-rw-r--r--indra/newview/skins/default/xui/pt/menu_bottomtray.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/menu_hide_navbar.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/menu_login.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/menu_toolbars.xml7
-rw-r--r--indra/newview/skins/default/xui/pt/menu_viewer.xml112
-rw-r--r--indra/newview/skins/default/xui/pt/notifications.xml58
-rw-r--r--indra/newview/skins/default/xui/pt/panel_chiclet_bar.xml15
-rw-r--r--indra/newview/skins/default/xui/pt/panel_edit_skin.xml6
-rw-r--r--indra/newview/skins/default/xui/pt/panel_me.xml5
-rw-r--r--indra/newview/skins/default/xui/pt/panel_my_profile.xml31
-rw-r--r--indra/newview/skins/default/xui/pt/panel_navigation_bar.xml35
-rw-r--r--indra/newview/skins/default/xui/pt/panel_nearby_chat.xml4
-rw-r--r--indra/newview/skins/default/xui/pt/panel_notes.xml35
-rw-r--r--indra/newview/skins/default/xui/pt/panel_postcard_message.xml21
-rw-r--r--indra/newview/skins/default/xui/pt/panel_postcard_settings.xml23
-rw-r--r--indra/newview/skins/default/xui/pt/panel_preferences_chat.xml27
-rw-r--r--indra/newview/skins/default/xui/pt/panel_preferences_general.xml5
-rw-r--r--indra/newview/skins/default/xui/pt/panel_preferences_move.xml31
-rw-r--r--indra/newview/skins/default/xui/pt/panel_preferences_setup.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/panel_profile.xml70
-rw-r--r--indra/newview/skins/default/xui/pt/panel_profile_view.xml20
-rw-r--r--indra/newview/skins/default/xui/pt/panel_snapshot_inventory.xml21
-rw-r--r--indra/newview/skins/default/xui/pt/panel_snapshot_local.xml39
-rw-r--r--indra/newview/skins/default/xui/pt/panel_snapshot_options.xml7
-rw-r--r--indra/newview/skins/default/xui/pt/panel_snapshot_postcard.xml17
-rw-r--r--indra/newview/skins/default/xui/pt/panel_snapshot_profile.xml28
-rw-r--r--indra/newview/skins/default/xui/pt/panel_status_bar.xml5
-rw-r--r--indra/newview/skins/default/xui/pt/strings.xml240
-rw-r--r--indra/newview/skins/default/xui/pt/teleport_strings.xml4
-rw-r--r--indra/newview/skins/default/xui/ru/floater_aaa.xml9
-rw-r--r--indra/newview/skins/default/xui/ru/floater_about.xml97
-rw-r--r--indra/newview/skins/default/xui/ru/floater_about_land.xml489
-rw-r--r--indra/newview/skins/default/xui/ru/floater_activeim.xml2
-rw-r--r--indra/newview/skins/default/xui/ru/floater_animation_preview.xml183
-rw-r--r--indra/newview/skins/default/xui/ru/floater_auction.xml11
-rw-r--r--indra/newview/skins/default/xui/ru/floater_avatar.xml2
-rw-r--r--indra/newview/skins/default/xui/ru/floater_avatar_picker.xml53
-rw-r--r--indra/newview/skins/default/xui/ru/floater_avatar_textures.xml50
-rw-r--r--indra/newview/skins/default/xui/ru/floater_beacons.xml22
-rw-r--r--indra/newview/skins/default/xui/ru/floater_build_options.xml33
-rw-r--r--indra/newview/skins/default/xui/ru/floater_bulk_perms.xml45
-rw-r--r--indra/newview/skins/default/xui/ru/floater_bumps.xml24
-rw-r--r--indra/newview/skins/default/xui/ru/floater_buy_contents.xml21
-rw-r--r--indra/newview/skins/default/xui/ru/floater_buy_currency.xml66
-rw-r--r--indra/newview/skins/default/xui/ru/floater_buy_currency_html.xml2
-rw-r--r--indra/newview/skins/default/xui/ru/floater_buy_land.xml233
-rw-r--r--indra/newview/skins/default/xui/ru/floater_buy_object.xml29
-rw-r--r--indra/newview/skins/default/xui/ru/floater_camera.xml56
-rw-r--r--indra/newview/skins/default/xui/ru/floater_chat_bar.xml7
-rw-r--r--indra/newview/skins/default/xui/ru/floater_choose_group.xml8
-rw-r--r--indra/newview/skins/default/xui/ru/floater_color_picker.xml30
-rw-r--r--indra/newview/skins/default/xui/ru/floater_critical.xml10
-rw-r--r--indra/newview/skins/default/xui/ru/floater_delete_env_preset.xml35
-rw-r--r--indra/newview/skins/default/xui/ru/floater_destinations.xml2
-rw-r--r--indra/newview/skins/default/xui/ru/floater_display_name.xml18
-rw-r--r--indra/newview/skins/default/xui/ru/floater_edit_day_cycle.xml104
-rw-r--r--indra/newview/skins/default/xui/ru/floater_edit_sky_preset.xml143
-rw-r--r--indra/newview/skins/default/xui/ru/floater_edit_water_preset.xml72
-rw-r--r--indra/newview/skins/default/xui/ru/floater_env_settings.xml25
-rw-r--r--indra/newview/skins/default/xui/ru/floater_environment_settings.xml36
-rw-r--r--indra/newview/skins/default/xui/ru/floater_event.xml9
-rw-r--r--indra/newview/skins/default/xui/ru/floater_fast_timers.xml10
-rw-r--r--indra/newview/skins/default/xui/ru/floater_font_test.xml2
-rw-r--r--indra/newview/skins/default/xui/ru/floater_gesture.xml26
-rw-r--r--indra/newview/skins/default/xui/ru/floater_god_tools.xml96
-rw-r--r--indra/newview/skins/default/xui/ru/floater_hardware_settings.xml31
-rw-r--r--indra/newview/skins/default/xui/ru/floater_help_browser.xml6
-rw-r--r--indra/newview/skins/default/xui/ru/floater_how_to.xml2
-rw-r--r--indra/newview/skins/default/xui/ru/floater_hud.xml2
-rw-r--r--indra/newview/skins/default/xui/ru/floater_im_container.xml2
-rw-r--r--indra/newview/skins/default/xui/ru/floater_im_session.xml8
-rw-r--r--indra/newview/skins/default/xui/ru/floater_image_preview.xml31
-rw-r--r--indra/newview/skins/default/xui/ru/floater_import_collada.xml23
-rw-r--r--indra/newview/skins/default/xui/ru/floater_incoming_call.xml33
-rw-r--r--indra/newview/skins/default/xui/ru/floater_inspect.xml14
-rw-r--r--indra/newview/skins/default/xui/ru/floater_inventory.xml4
-rw-r--r--indra/newview/skins/default/xui/ru/floater_inventory_item_properties.xml67
-rw-r--r--indra/newview/skins/default/xui/ru/floater_inventory_view_finder.xml25
-rw-r--r--indra/newview/skins/default/xui/ru/floater_joystick.xml79
-rw-r--r--indra/newview/skins/default/xui/ru/floater_lagmeter.xml151
-rw-r--r--indra/newview/skins/default/xui/ru/floater_land_holdings.xml39
-rw-r--r--indra/newview/skins/default/xui/ru/floater_live_lsleditor.xml15
-rw-r--r--indra/newview/skins/default/xui/ru/floater_lsl_guide.xml7
-rw-r--r--indra/newview/skins/default/xui/ru/floater_map.xml36
-rw-r--r--indra/newview/skins/default/xui/ru/floater_media_browser.xml30
-rw-r--r--indra/newview/skins/default/xui/ru/floater_media_settings.xml6
-rw-r--r--indra/newview/skins/default/xui/ru/floater_mem_leaking.xml18
-rw-r--r--indra/newview/skins/default/xui/ru/floater_model_preview.xml277
-rw-r--r--indra/newview/skins/default/xui/ru/floater_model_wizard.xml208
-rw-r--r--indra/newview/skins/default/xui/ru/floater_moveview.xml75
-rw-r--r--indra/newview/skins/default/xui/ru/floater_mute_object.xml14
-rw-r--r--indra/newview/skins/default/xui/ru/floater_my_appearance.xml4
-rw-r--r--indra/newview/skins/default/xui/ru/floater_my_inventory.xml2
-rw-r--r--indra/newview/skins/default/xui/ru/floater_nearby_chat.xml4
-rw-r--r--indra/newview/skins/default/xui/ru/floater_notification.xml7
-rw-r--r--indra/newview/skins/default/xui/ru/floater_notifications_console.xml5
-rw-r--r--indra/newview/skins/default/xui/ru/floater_object_weights.xml28
-rw-r--r--indra/newview/skins/default/xui/ru/floater_openobject.xml8
-rw-r--r--indra/newview/skins/default/xui/ru/floater_outfit_save_as.xml12
-rw-r--r--indra/newview/skins/default/xui/ru/floater_outgoing_call.xml40
-rw-r--r--indra/newview/skins/default/xui/ru/floater_pay.xml21
-rw-r--r--indra/newview/skins/default/xui/ru/floater_pay_object.xml28
-rw-r--r--indra/newview/skins/default/xui/ru/floater_people.xml7
-rw-r--r--indra/newview/skins/default/xui/ru/floater_perm_prefs.xml15
-rw-r--r--indra/newview/skins/default/xui/ru/floater_picks.xml2
-rw-r--r--indra/newview/skins/default/xui/ru/floater_places.xml4
-rw-r--r--indra/newview/skins/default/xui/ru/floater_post_process.xml53
-rw-r--r--indra/newview/skins/default/xui/ru/floater_postcard.xml33
-rw-r--r--indra/newview/skins/default/xui/ru/floater_preferences.xml17
-rw-r--r--indra/newview/skins/default/xui/ru/floater_preferences_proxy.xml40
-rw-r--r--indra/newview/skins/default/xui/ru/floater_preview_animation.xml11
-rw-r--r--indra/newview/skins/default/xui/ru/floater_preview_gesture.xml73
-rw-r--r--indra/newview/skins/default/xui/ru/floater_preview_notecard.xml20
-rw-r--r--indra/newview/skins/default/xui/ru/floater_preview_sound.xml11
-rw-r--r--indra/newview/skins/default/xui/ru/floater_preview_texture.xml47
-rw-r--r--indra/newview/skins/default/xui/ru/floater_price_for_listing.xml18
-rw-r--r--indra/newview/skins/default/xui/ru/floater_publish_classified.xml11
-rw-r--r--indra/newview/skins/default/xui/ru/floater_region_debug_console.xml2
-rw-r--r--indra/newview/skins/default/xui/ru/floater_region_info.xml2
-rw-r--r--indra/newview/skins/default/xui/ru/floater_report_abuse.xml94
-rw-r--r--indra/newview/skins/default/xui/ru/floater_script_debug.xml2
-rw-r--r--indra/newview/skins/default/xui/ru/floater_script_debug_panel.xml2
-rw-r--r--indra/newview/skins/default/xui/ru/floater_script_limits.xml2
-rw-r--r--indra/newview/skins/default/xui/ru/floater_script_preview.xml9
-rw-r--r--indra/newview/skins/default/xui/ru/floater_script_queue.xml19
-rw-r--r--indra/newview/skins/default/xui/ru/floater_script_search.xml13
-rw-r--r--indra/newview/skins/default/xui/ru/floater_search.xml16
-rw-r--r--indra/newview/skins/default/xui/ru/floater_select_key.xml7
-rw-r--r--indra/newview/skins/default/xui/ru/floater_sell_land.xml65
-rw-r--r--indra/newview/skins/default/xui/ru/floater_settings_debug.xml13
-rw-r--r--indra/newview/skins/default/xui/ru/floater_snapshot.xml65
-rw-r--r--indra/newview/skins/default/xui/ru/floater_sound_devices.xml7
-rw-r--r--indra/newview/skins/default/xui/ru/floater_sound_preview.xml11
-rw-r--r--indra/newview/skins/default/xui/ru/floater_stats.xml79
-rw-r--r--indra/newview/skins/default/xui/ru/floater_sys_well.xml9
-rw-r--r--indra/newview/skins/default/xui/ru/floater_telehub.xml29
-rw-r--r--indra/newview/skins/default/xui/ru/floater_texture_ctrl.xml23
-rw-r--r--indra/newview/skins/default/xui/ru/floater_tools.xml491
-rw-r--r--indra/newview/skins/default/xui/ru/floater_top_objects.xml55
-rw-r--r--indra/newview/skins/default/xui/ru/floater_tos.xml15
-rw-r--r--indra/newview/skins/default/xui/ru/floater_toybox.xml11
-rw-r--r--indra/newview/skins/default/xui/ru/floater_translation_settings.xml58
-rw-r--r--indra/newview/skins/default/xui/ru/floater_url_entry.xml12
-rw-r--r--indra/newview/skins/default/xui/ru/floater_voice_controls.xml30
-rw-r--r--indra/newview/skins/default/xui/ru/floater_voice_effect.xml138
-rw-r--r--indra/newview/skins/default/xui/ru/floater_water.xml70
-rw-r--r--indra/newview/skins/default/xui/ru/floater_web_content.xml14
-rw-r--r--indra/newview/skins/default/xui/ru/floater_whitelist_entry.xml9
-rw-r--r--indra/newview/skins/default/xui/ru/floater_windlight_options.xml167
-rw-r--r--indra/newview/skins/default/xui/ru/floater_window_size.xml17
-rw-r--r--indra/newview/skins/default/xui/ru/floater_world_map.xml73
-rw-r--r--indra/newview/skins/default/xui/ru/inspect_avatar.xml25
-rw-r--r--indra/newview/skins/default/xui/ru/inspect_group.xml32
-rw-r--r--indra/newview/skins/default/xui/ru/inspect_object.xml44
-rw-r--r--indra/newview/skins/default/xui/ru/inspect_remote_object.xml22
-rw-r--r--indra/newview/skins/default/xui/ru/menu_add_wearable_gear.xml6
-rw-r--r--indra/newview/skins/default/xui/ru/menu_attachment_other.xml17
-rw-r--r--indra/newview/skins/default/xui/ru/menu_attachment_self.xml16
-rw-r--r--indra/newview/skins/default/xui/ru/menu_avatar_icon.xml7
-rw-r--r--indra/newview/skins/default/xui/ru/menu_avatar_other.xml16
-rw-r--r--indra/newview/skins/default/xui/ru/menu_avatar_self.xml32
-rw-r--r--indra/newview/skins/default/xui/ru/menu_bottomtray.xml17
-rw-r--r--indra/newview/skins/default/xui/ru/menu_cof_attachment.xml4
-rw-r--r--indra/newview/skins/default/xui/ru/menu_cof_body_part.xml5
-rw-r--r--indra/newview/skins/default/xui/ru/menu_cof_clothing.xml6
-rw-r--r--indra/newview/skins/default/xui/ru/menu_cof_gear.xml5
-rw-r--r--indra/newview/skins/default/xui/ru/menu_edit.xml12
-rw-r--r--indra/newview/skins/default/xui/ru/menu_favorites.xml10
-rw-r--r--indra/newview/skins/default/xui/ru/menu_gesture_gear.xml9
-rw-r--r--indra/newview/skins/default/xui/ru/menu_group_plus.xml5
-rw-r--r--indra/newview/skins/default/xui/ru/menu_hide_navbar.xml6
-rw-r--r--indra/newview/skins/default/xui/ru/menu_im_well_button.xml4
-rw-r--r--indra/newview/skins/default/xui/ru/menu_imchiclet_adhoc.xml4
-rw-r--r--indra/newview/skins/default/xui/ru/menu_imchiclet_group.xml6
-rw-r--r--indra/newview/skins/default/xui/ru/menu_imchiclet_p2p.xml7
-rw-r--r--indra/newview/skins/default/xui/ru/menu_inspect_avatar_gear.xml21
-rw-r--r--indra/newview/skins/default/xui/ru/menu_inspect_object_gear.xml18
-rw-r--r--indra/newview/skins/default/xui/ru/menu_inspect_self_gear.xml31
-rw-r--r--indra/newview/skins/default/xui/ru/menu_inv_offer_chiclet.xml4
-rw-r--r--indra/newview/skins/default/xui/ru/menu_inventory.xml89
-rw-r--r--indra/newview/skins/default/xui/ru/menu_inventory_add.xml36
-rw-r--r--indra/newview/skins/default/xui/ru/menu_inventory_gear_default.xml17
-rw-r--r--indra/newview/skins/default/xui/ru/menu_land.xml9
-rw-r--r--indra/newview/skins/default/xui/ru/menu_landmark.xml7
-rw-r--r--indra/newview/skins/default/xui/ru/menu_login.xml25
-rw-r--r--indra/newview/skins/default/xui/ru/menu_media_ctrl.xml7
-rw-r--r--indra/newview/skins/default/xui/ru/menu_mini_map.xml11
-rw-r--r--indra/newview/skins/default/xui/ru/menu_mode_change.xml5
-rw-r--r--indra/newview/skins/default/xui/ru/menu_model_import_gear_default.xml8
-rw-r--r--indra/newview/skins/default/xui/ru/menu_navbar.xml11
-rw-r--r--indra/newview/skins/default/xui/ru/menu_nearby_chat.xml9
-rw-r--r--indra/newview/skins/default/xui/ru/menu_notification_well_button.xml4
-rw-r--r--indra/newview/skins/default/xui/ru/menu_object.xml27
-rw-r--r--indra/newview/skins/default/xui/ru/menu_object_icon.xml5
-rw-r--r--indra/newview/skins/default/xui/ru/menu_outfit_gear.xml28
-rw-r--r--indra/newview/skins/default/xui/ru/menu_outfit_tab.xml9
-rw-r--r--indra/newview/skins/default/xui/ru/menu_participant_list.xml21
-rw-r--r--indra/newview/skins/default/xui/ru/menu_people_friends_view_sort.xml8
-rw-r--r--indra/newview/skins/default/xui/ru/menu_people_groups.xml8
-rw-r--r--indra/newview/skins/default/xui/ru/menu_people_groups_view_sort.xml5
-rw-r--r--indra/newview/skins/default/xui/ru/menu_people_nearby.xml13
-rw-r--r--indra/newview/skins/default/xui/ru/menu_people_nearby_multiselect.xml10
-rw-r--r--indra/newview/skins/default/xui/ru/menu_people_nearby_view_sort.xml9
-rw-r--r--indra/newview/skins/default/xui/ru/menu_people_recent_view_sort.xml7
-rw-r--r--indra/newview/skins/default/xui/ru/menu_picks.xml8
-rw-r--r--indra/newview/skins/default/xui/ru/menu_picks_plus.xml5
-rw-r--r--indra/newview/skins/default/xui/ru/menu_place.xml5
-rw-r--r--indra/newview/skins/default/xui/ru/menu_place_add_button.xml5
-rw-r--r--indra/newview/skins/default/xui/ru/menu_places_gear_folder.xml16
-rw-r--r--indra/newview/skins/default/xui/ru/menu_places_gear_landmark.xml19
-rw-r--r--indra/newview/skins/default/xui/ru/menu_profile_overflow.xml12
-rw-r--r--indra/newview/skins/default/xui/ru/menu_save_outfit.xml5
-rw-r--r--indra/newview/skins/default/xui/ru/menu_script_chiclet.xml4
-rw-r--r--indra/newview/skins/default/xui/ru/menu_slurl.xml6
-rw-r--r--indra/newview/skins/default/xui/ru/menu_teleport_history_gear.xml6
-rw-r--r--indra/newview/skins/default/xui/ru/menu_teleport_history_item.xml6
-rw-r--r--indra/newview/skins/default/xui/ru/menu_teleport_history_tab.xml5
-rw-r--r--indra/newview/skins/default/xui/ru/menu_text_editor.xml8
-rw-r--r--indra/newview/skins/default/xui/ru/menu_toolbars.xml7
-rw-r--r--indra/newview/skins/default/xui/ru/menu_topinfobar.xml7
-rw-r--r--indra/newview/skins/default/xui/ru/menu_url_agent.xml6
-rw-r--r--indra/newview/skins/default/xui/ru/menu_url_group.xml6
-rw-r--r--indra/newview/skins/default/xui/ru/menu_url_http.xml7
-rw-r--r--indra/newview/skins/default/xui/ru/menu_url_inventory.xml6
-rw-r--r--indra/newview/skins/default/xui/ru/menu_url_map.xml6
-rw-r--r--indra/newview/skins/default/xui/ru/menu_url_objectim.xml8
-rw-r--r--indra/newview/skins/default/xui/ru/menu_url_parcel.xml6
-rw-r--r--indra/newview/skins/default/xui/ru/menu_url_slapp.xml5
-rw-r--r--indra/newview/skins/default/xui/ru/menu_url_slurl.xml7
-rw-r--r--indra/newview/skins/default/xui/ru/menu_url_teleport.xml6
-rw-r--r--indra/newview/skins/default/xui/ru/menu_viewer.xml460
-rw-r--r--indra/newview/skins/default/xui/ru/menu_wearable_list_item.xml14
-rw-r--r--indra/newview/skins/default/xui/ru/menu_wearing_gear.xml6
-rw-r--r--indra/newview/skins/default/xui/ru/menu_wearing_tab.xml6
-rw-r--r--indra/newview/skins/default/xui/ru/mime_types.xml217
-rw-r--r--indra/newview/skins/default/xui/ru/mime_types_linux.xml217
-rw-r--r--indra/newview/skins/default/xui/ru/mime_types_mac.xml217
-rw-r--r--indra/newview/skins/default/xui/ru/notifications.xml3092
-rw-r--r--indra/newview/skins/default/xui/ru/panel_active_object_row.xml6
-rw-r--r--indra/newview/skins/default/xui/ru/panel_adhoc_control_panel.xml14
-rw-r--r--indra/newview/skins/default/xui/ru/panel_avatar_list_item.xml31
-rw-r--r--indra/newview/skins/default/xui/ru/panel_avatar_tag.xml12
-rw-r--r--indra/newview/skins/default/xui/ru/panel_block_list_sidetray.xml10
-rw-r--r--indra/newview/skins/default/xui/ru/panel_body_parts_list_item.xml8
-rw-r--r--indra/newview/skins/default/xui/ru/panel_bodyparts_list_button_bar.xml4
-rw-r--r--indra/newview/skins/default/xui/ru/panel_bottomtray.xml47
-rw-r--r--indra/newview/skins/default/xui/ru/panel_bottomtray_lite.xml8
-rw-r--r--indra/newview/skins/default/xui/ru/panel_chat_header.xml4
-rw-r--r--indra/newview/skins/default/xui/ru/panel_chiclet_bar.xml15
-rw-r--r--indra/newview/skins/default/xui/ru/panel_classified_info.xml67
-rw-r--r--indra/newview/skins/default/xui/ru/panel_clothing_list_button_bar.xml4
-rw-r--r--indra/newview/skins/default/xui/ru/panel_clothing_list_item.xml9
-rw-r--r--indra/newview/skins/default/xui/ru/panel_cof_wearables.xml8
-rw-r--r--indra/newview/skins/default/xui/ru/panel_deletable_wearable_list_item.xml5
-rw-r--r--indra/newview/skins/default/xui/ru/panel_dummy_clothing_list_item.xml7
-rw-r--r--indra/newview/skins/default/xui/ru/panel_edit_alpha.xml12
-rw-r--r--indra/newview/skins/default/xui/ru/panel_edit_classified.xml54
-rw-r--r--indra/newview/skins/default/xui/ru/panel_edit_eyes.xml11
-rw-r--r--indra/newview/skins/default/xui/ru/panel_edit_gloves.xml12
-rw-r--r--indra/newview/skins/default/xui/ru/panel_edit_hair.xml14
-rw-r--r--indra/newview/skins/default/xui/ru/panel_edit_jacket.xml13
-rw-r--r--indra/newview/skins/default/xui/ru/panel_edit_pants.xml12
-rw-r--r--indra/newview/skins/default/xui/ru/panel_edit_physics.xml14
-rw-r--r--indra/newview/skins/default/xui/ru/panel_edit_pick.xml37
-rw-r--r--indra/newview/skins/default/xui/ru/panel_edit_profile.xml68
-rw-r--r--indra/newview/skins/default/xui/ru/panel_edit_shape.xml25
-rw-r--r--indra/newview/skins/default/xui/ru/panel_edit_shirt.xml12
-rw-r--r--indra/newview/skins/default/xui/ru/panel_edit_shoes.xml12
-rw-r--r--indra/newview/skins/default/xui/ru/panel_edit_skin.xml16
-rw-r--r--indra/newview/skins/default/xui/ru/panel_edit_skirt.xml12
-rw-r--r--indra/newview/skins/default/xui/ru/panel_edit_socks.xml12
-rw-r--r--indra/newview/skins/default/xui/ru/panel_edit_tattoo.xml9
-rw-r--r--indra/newview/skins/default/xui/ru/panel_edit_underpants.xml12
-rw-r--r--indra/newview/skins/default/xui/ru/panel_edit_undershirt.xml12
-rw-r--r--indra/newview/skins/default/xui/ru/panel_edit_wearable.xml120
-rw-r--r--indra/newview/skins/default/xui/ru/panel_group_control_panel.xml17
-rw-r--r--indra/newview/skins/default/xui/ru/panel_group_general.xml56
-rw-r--r--indra/newview/skins/default/xui/ru/panel_group_info_sidetray.xml41
-rw-r--r--indra/newview/skins/default/xui/ru/panel_group_invite.xml27
-rw-r--r--indra/newview/skins/default/xui/ru/panel_group_land_money.xml85
-rw-r--r--indra/newview/skins/default/xui/ru/panel_group_list_item.xml5
-rw-r--r--indra/newview/skins/default/xui/ru/panel_group_notices.xml61
-rw-r--r--indra/newview/skins/default/xui/ru/panel_group_notify.xml12
-rw-r--r--indra/newview/skins/default/xui/ru/panel_group_roles.xml95
-rw-r--r--indra/newview/skins/default/xui/ru/panel_im_control_panel.xml29
-rw-r--r--indra/newview/skins/default/xui/ru/panel_instant_message.xml9
-rw-r--r--indra/newview/skins/default/xui/ru/panel_inventory_item.xml4
-rw-r--r--indra/newview/skins/default/xui/ru/panel_landmark_info.xml41
-rw-r--r--indra/newview/skins/default/xui/ru/panel_landmarks.xml22
-rw-r--r--indra/newview/skins/default/xui/ru/panel_login.xml48
-rw-r--r--indra/newview/skins/default/xui/ru/panel_main_inventory.xml28
-rw-r--r--indra/newview/skins/default/xui/ru/panel_me.xml4
-rw-r--r--indra/newview/skins/default/xui/ru/panel_media_settings_general.xml32
-rw-r--r--indra/newview/skins/default/xui/ru/panel_media_settings_permissions.xml29
-rw-r--r--indra/newview/skins/default/xui/ru/panel_media_settings_security.xml12
-rw-r--r--indra/newview/skins/default/xui/ru/panel_navigation_bar.xml23
-rw-r--r--indra/newview/skins/default/xui/ru/panel_nearby_chat.xml4
-rw-r--r--indra/newview/skins/default/xui/ru/panel_nearby_chat_bar.xml5
-rw-r--r--indra/newview/skins/default/xui/ru/panel_nearby_media.xml70
-rw-r--r--indra/newview/skins/default/xui/ru/panel_notify_textbox.xml11
-rw-r--r--indra/newview/skins/default/xui/ru/panel_online_status_toast.xml2
-rw-r--r--indra/newview/skins/default/xui/ru/panel_outbox_inventory.xml2
-rw-r--r--indra/newview/skins/default/xui/ru/panel_outfit_edit.xml57
-rw-r--r--indra/newview/skins/default/xui/ru/panel_outfits_inventory.xml23
-rw-r--r--indra/newview/skins/default/xui/ru/panel_outfits_inventory_gear_default.xml8
-rw-r--r--indra/newview/skins/default/xui/ru/panel_outfits_list.xml11
-rw-r--r--indra/newview/skins/default/xui/ru/panel_outfits_wearing.xml6
-rw-r--r--indra/newview/skins/default/xui/ru/panel_people.xml94
-rw-r--r--indra/newview/skins/default/xui/ru/panel_pick_info.xml24
-rw-r--r--indra/newview/skins/default/xui/ru/panel_picks.xml29
-rw-r--r--indra/newview/skins/default/xui/ru/panel_place_profile.xml118
-rw-r--r--indra/newview/skins/default/xui/ru/panel_places.xml48
-rw-r--r--indra/newview/skins/default/xui/ru/panel_postcard_message.xml21
-rw-r--r--indra/newview/skins/default/xui/ru/panel_postcard_settings.xml23
-rw-r--r--indra/newview/skins/default/xui/ru/panel_preferences_advanced.xml31
-rw-r--r--indra/newview/skins/default/xui/ru/panel_preferences_alerts.xml14
-rw-r--r--indra/newview/skins/default/xui/ru/panel_preferences_chat.xml33
-rw-r--r--indra/newview/skins/default/xui/ru/panel_preferences_colors.xml44
-rw-r--r--indra/newview/skins/default/xui/ru/panel_preferences_general.xml76
-rw-r--r--indra/newview/skins/default/xui/ru/panel_preferences_graphics1.xml114
-rw-r--r--indra/newview/skins/default/xui/ru/panel_preferences_move.xml39
-rw-r--r--indra/newview/skins/default/xui/ru/panel_preferences_privacy.xml30
-rw-r--r--indra/newview/skins/default/xui/ru/panel_preferences_setup.xml36
-rw-r--r--indra/newview/skins/default/xui/ru/panel_preferences_sound.xml40
-rw-r--r--indra/newview/skins/default/xui/ru/panel_prim_media_controls.xml91
-rw-r--r--indra/newview/skins/default/xui/ru/panel_region_covenant.xml79
-rw-r--r--indra/newview/skins/default/xui/ru/panel_region_debug.xml34
-rw-r--r--indra/newview/skins/default/xui/ru/panel_region_environment.xml33
-rw-r--r--indra/newview/skins/default/xui/ru/panel_region_estate.xml52
-rw-r--r--indra/newview/skins/default/xui/ru/panel_region_general.xml44
-rw-r--r--indra/newview/skins/default/xui/ru/panel_region_terrain.xml60
-rw-r--r--indra/newview/skins/default/xui/ru/panel_region_texture.xml54
-rw-r--r--indra/newview/skins/default/xui/ru/panel_script_ed.xml47
-rw-r--r--indra/newview/skins/default/xui/ru/panel_script_limits_my_avatar.xml16
-rw-r--r--indra/newview/skins/default/xui/ru/panel_script_limits_region_memory.xml20
-rw-r--r--indra/newview/skins/default/xui/ru/panel_scrolling_param.xml10
-rw-r--r--indra/newview/skins/default/xui/ru/panel_scrolling_param_base.xml4
-rw-r--r--indra/newview/skins/default/xui/ru/panel_side_tray.xml29
-rw-r--r--indra/newview/skins/default/xui/ru/panel_side_tray_tab_caption.xml7
-rw-r--r--indra/newview/skins/default/xui/ru/panel_snapshot_inventory.xml21
-rw-r--r--indra/newview/skins/default/xui/ru/panel_snapshot_local.xml39
-rw-r--r--indra/newview/skins/default/xui/ru/panel_snapshot_options.xml7
-rw-r--r--indra/newview/skins/default/xui/ru/panel_snapshot_postcard.xml17
-rw-r--r--indra/newview/skins/default/xui/ru/panel_snapshot_profile.xml28
-rw-r--r--indra/newview/skins/default/xui/ru/panel_sound_devices.xml25
-rw-r--r--indra/newview/skins/default/xui/ru/panel_stand_stop_flying.xml6
-rw-r--r--indra/newview/skins/default/xui/ru/panel_status_bar.xml28
-rw-r--r--indra/newview/skins/default/xui/ru/panel_teleport_history.xml19
-rw-r--r--indra/newview/skins/default/xui/ru/panel_teleport_history_item.xml5
-rw-r--r--indra/newview/skins/default/xui/ru/panel_voice_effect.xml15
-rw-r--r--indra/newview/skins/default/xui/ru/panel_world_map.xml63
-rw-r--r--indra/newview/skins/default/xui/ru/role_actions.xml73
-rw-r--r--indra/newview/skins/default/xui/ru/sidepanel_appearance.xml19
-rw-r--r--indra/newview/skins/default/xui/ru/sidepanel_inventory.xml65
-rw-r--r--indra/newview/skins/default/xui/ru/sidepanel_item_info.xml76
-rw-r--r--indra/newview/skins/default/xui/ru/sidepanel_task_info.xml123
-rw-r--r--indra/newview/skins/default/xui/ru/strings.xml4997
-rw-r--r--indra/newview/skins/default/xui/ru/teleport_strings.xml84
-rw-r--r--indra/newview/skins/default/xui/tr/floater_aaa.xml9
-rw-r--r--indra/newview/skins/default/xui/tr/floater_about.xml98
-rw-r--r--indra/newview/skins/default/xui/tr/floater_about_land.xml489
-rw-r--r--indra/newview/skins/default/xui/tr/floater_activeim.xml2
-rw-r--r--indra/newview/skins/default/xui/tr/floater_animation_preview.xml186
-rw-r--r--indra/newview/skins/default/xui/tr/floater_auction.xml11
-rw-r--r--indra/newview/skins/default/xui/tr/floater_avatar.xml2
-rw-r--r--indra/newview/skins/default/xui/tr/floater_avatar_picker.xml53
-rw-r--r--indra/newview/skins/default/xui/tr/floater_avatar_textures.xml50
-rw-r--r--indra/newview/skins/default/xui/tr/floater_beacons.xml22
-rw-r--r--indra/newview/skins/default/xui/tr/floater_build_options.xml33
-rw-r--r--indra/newview/skins/default/xui/tr/floater_bulk_perms.xml45
-rw-r--r--indra/newview/skins/default/xui/tr/floater_bumps.xml24
-rw-r--r--indra/newview/skins/default/xui/tr/floater_buy_contents.xml21
-rw-r--r--indra/newview/skins/default/xui/tr/floater_buy_currency.xml66
-rw-r--r--indra/newview/skins/default/xui/tr/floater_buy_currency_html.xml2
-rw-r--r--indra/newview/skins/default/xui/tr/floater_buy_land.xml233
-rw-r--r--indra/newview/skins/default/xui/tr/floater_buy_object.xml29
-rw-r--r--indra/newview/skins/default/xui/tr/floater_camera.xml56
-rw-r--r--indra/newview/skins/default/xui/tr/floater_chat_bar.xml7
-rw-r--r--indra/newview/skins/default/xui/tr/floater_choose_group.xml8
-rw-r--r--indra/newview/skins/default/xui/tr/floater_color_picker.xml30
-rw-r--r--indra/newview/skins/default/xui/tr/floater_critical.xml10
-rw-r--r--indra/newview/skins/default/xui/tr/floater_delete_env_preset.xml35
-rw-r--r--indra/newview/skins/default/xui/tr/floater_destinations.xml2
-rw-r--r--indra/newview/skins/default/xui/tr/floater_display_name.xml18
-rw-r--r--indra/newview/skins/default/xui/tr/floater_edit_day_cycle.xml104
-rw-r--r--indra/newview/skins/default/xui/tr/floater_edit_sky_preset.xml143
-rw-r--r--indra/newview/skins/default/xui/tr/floater_edit_water_preset.xml72
-rw-r--r--indra/newview/skins/default/xui/tr/floater_env_settings.xml25
-rw-r--r--indra/newview/skins/default/xui/tr/floater_environment_settings.xml36
-rw-r--r--indra/newview/skins/default/xui/tr/floater_event.xml9
-rw-r--r--indra/newview/skins/default/xui/tr/floater_fast_timers.xml10
-rw-r--r--indra/newview/skins/default/xui/tr/floater_font_test.xml2
-rw-r--r--indra/newview/skins/default/xui/tr/floater_gesture.xml26
-rw-r--r--indra/newview/skins/default/xui/tr/floater_god_tools.xml96
-rw-r--r--indra/newview/skins/default/xui/tr/floater_hardware_settings.xml31
-rw-r--r--indra/newview/skins/default/xui/tr/floater_help_browser.xml6
-rw-r--r--indra/newview/skins/default/xui/tr/floater_how_to.xml2
-rw-r--r--indra/newview/skins/default/xui/tr/floater_hud.xml2
-rw-r--r--indra/newview/skins/default/xui/tr/floater_im_container.xml2
-rw-r--r--indra/newview/skins/default/xui/tr/floater_im_session.xml8
-rw-r--r--indra/newview/skins/default/xui/tr/floater_image_preview.xml32
-rw-r--r--indra/newview/skins/default/xui/tr/floater_import_collada.xml23
-rw-r--r--indra/newview/skins/default/xui/tr/floater_incoming_call.xml33
-rw-r--r--indra/newview/skins/default/xui/tr/floater_inspect.xml14
-rw-r--r--indra/newview/skins/default/xui/tr/floater_inventory.xml4
-rw-r--r--indra/newview/skins/default/xui/tr/floater_inventory_item_properties.xml67
-rw-r--r--indra/newview/skins/default/xui/tr/floater_inventory_view_finder.xml25
-rw-r--r--indra/newview/skins/default/xui/tr/floater_joystick.xml79
-rw-r--r--indra/newview/skins/default/xui/tr/floater_lagmeter.xml151
-rw-r--r--indra/newview/skins/default/xui/tr/floater_land_holdings.xml39
-rw-r--r--indra/newview/skins/default/xui/tr/floater_live_lsleditor.xml15
-rw-r--r--indra/newview/skins/default/xui/tr/floater_lsl_guide.xml7
-rw-r--r--indra/newview/skins/default/xui/tr/floater_map.xml36
-rw-r--r--indra/newview/skins/default/xui/tr/floater_media_browser.xml30
-rw-r--r--indra/newview/skins/default/xui/tr/floater_media_settings.xml6
-rw-r--r--indra/newview/skins/default/xui/tr/floater_mem_leaking.xml18
-rw-r--r--indra/newview/skins/default/xui/tr/floater_model_preview.xml277
-rw-r--r--indra/newview/skins/default/xui/tr/floater_model_wizard.xml208
-rw-r--r--indra/newview/skins/default/xui/tr/floater_moveview.xml75
-rw-r--r--indra/newview/skins/default/xui/tr/floater_mute_object.xml14
-rw-r--r--indra/newview/skins/default/xui/tr/floater_my_appearance.xml4
-rw-r--r--indra/newview/skins/default/xui/tr/floater_my_inventory.xml2
-rw-r--r--indra/newview/skins/default/xui/tr/floater_nearby_chat.xml4
-rw-r--r--indra/newview/skins/default/xui/tr/floater_notification.xml7
-rw-r--r--indra/newview/skins/default/xui/tr/floater_notifications_console.xml5
-rw-r--r--indra/newview/skins/default/xui/tr/floater_object_weights.xml28
-rw-r--r--indra/newview/skins/default/xui/tr/floater_openobject.xml8
-rw-r--r--indra/newview/skins/default/xui/tr/floater_outfit_save_as.xml12
-rw-r--r--indra/newview/skins/default/xui/tr/floater_outgoing_call.xml40
-rw-r--r--indra/newview/skins/default/xui/tr/floater_pay.xml21
-rw-r--r--indra/newview/skins/default/xui/tr/floater_pay_object.xml28
-rw-r--r--indra/newview/skins/default/xui/tr/floater_people.xml7
-rw-r--r--indra/newview/skins/default/xui/tr/floater_perm_prefs.xml15
-rw-r--r--indra/newview/skins/default/xui/tr/floater_picks.xml2
-rw-r--r--indra/newview/skins/default/xui/tr/floater_places.xml4
-rw-r--r--indra/newview/skins/default/xui/tr/floater_post_process.xml53
-rw-r--r--indra/newview/skins/default/xui/tr/floater_postcard.xml33
-rw-r--r--indra/newview/skins/default/xui/tr/floater_preferences.xml17
-rw-r--r--indra/newview/skins/default/xui/tr/floater_preferences_proxy.xml40
-rw-r--r--indra/newview/skins/default/xui/tr/floater_preview_animation.xml11
-rw-r--r--indra/newview/skins/default/xui/tr/floater_preview_gesture.xml73
-rw-r--r--indra/newview/skins/default/xui/tr/floater_preview_notecard.xml20
-rw-r--r--indra/newview/skins/default/xui/tr/floater_preview_sound.xml11
-rw-r--r--indra/newview/skins/default/xui/tr/floater_preview_texture.xml47
-rw-r--r--indra/newview/skins/default/xui/tr/floater_price_for_listing.xml18
-rw-r--r--indra/newview/skins/default/xui/tr/floater_publish_classified.xml11
-rw-r--r--indra/newview/skins/default/xui/tr/floater_region_debug_console.xml2
-rw-r--r--indra/newview/skins/default/xui/tr/floater_region_info.xml2
-rw-r--r--indra/newview/skins/default/xui/tr/floater_report_abuse.xml94
-rw-r--r--indra/newview/skins/default/xui/tr/floater_script_debug.xml2
-rw-r--r--indra/newview/skins/default/xui/tr/floater_script_debug_panel.xml2
-rw-r--r--indra/newview/skins/default/xui/tr/floater_script_limits.xml2
-rw-r--r--indra/newview/skins/default/xui/tr/floater_script_preview.xml9
-rw-r--r--indra/newview/skins/default/xui/tr/floater_script_queue.xml19
-rw-r--r--indra/newview/skins/default/xui/tr/floater_script_search.xml13
-rw-r--r--indra/newview/skins/default/xui/tr/floater_search.xml16
-rw-r--r--indra/newview/skins/default/xui/tr/floater_select_key.xml7
-rw-r--r--indra/newview/skins/default/xui/tr/floater_sell_land.xml65
-rw-r--r--indra/newview/skins/default/xui/tr/floater_settings_debug.xml13
-rw-r--r--indra/newview/skins/default/xui/tr/floater_snapshot.xml65
-rw-r--r--indra/newview/skins/default/xui/tr/floater_sound_devices.xml7
-rw-r--r--indra/newview/skins/default/xui/tr/floater_sound_preview.xml11
-rw-r--r--indra/newview/skins/default/xui/tr/floater_stats.xml79
-rw-r--r--indra/newview/skins/default/xui/tr/floater_sys_well.xml9
-rw-r--r--indra/newview/skins/default/xui/tr/floater_telehub.xml29
-rw-r--r--indra/newview/skins/default/xui/tr/floater_texture_ctrl.xml23
-rw-r--r--indra/newview/skins/default/xui/tr/floater_tools.xml491
-rw-r--r--indra/newview/skins/default/xui/tr/floater_top_objects.xml55
-rw-r--r--indra/newview/skins/default/xui/tr/floater_tos.xml15
-rw-r--r--indra/newview/skins/default/xui/tr/floater_toybox.xml11
-rw-r--r--indra/newview/skins/default/xui/tr/floater_translation_settings.xml58
-rw-r--r--indra/newview/skins/default/xui/tr/floater_url_entry.xml12
-rw-r--r--indra/newview/skins/default/xui/tr/floater_voice_controls.xml30
-rw-r--r--indra/newview/skins/default/xui/tr/floater_voice_effect.xml138
-rw-r--r--indra/newview/skins/default/xui/tr/floater_water.xml70
-rw-r--r--indra/newview/skins/default/xui/tr/floater_web_content.xml14
-rw-r--r--indra/newview/skins/default/xui/tr/floater_whitelist_entry.xml9
-rw-r--r--indra/newview/skins/default/xui/tr/floater_windlight_options.xml167
-rw-r--r--indra/newview/skins/default/xui/tr/floater_window_size.xml17
-rw-r--r--indra/newview/skins/default/xui/tr/floater_world_map.xml73
-rw-r--r--indra/newview/skins/default/xui/tr/inspect_avatar.xml25
-rw-r--r--indra/newview/skins/default/xui/tr/inspect_group.xml32
-rw-r--r--indra/newview/skins/default/xui/tr/inspect_object.xml44
-rw-r--r--indra/newview/skins/default/xui/tr/inspect_remote_object.xml22
-rw-r--r--indra/newview/skins/default/xui/tr/menu_add_wearable_gear.xml6
-rw-r--r--indra/newview/skins/default/xui/tr/menu_attachment_other.xml17
-rw-r--r--indra/newview/skins/default/xui/tr/menu_attachment_self.xml16
-rw-r--r--indra/newview/skins/default/xui/tr/menu_avatar_icon.xml7
-rw-r--r--indra/newview/skins/default/xui/tr/menu_avatar_other.xml16
-rw-r--r--indra/newview/skins/default/xui/tr/menu_avatar_self.xml32
-rw-r--r--indra/newview/skins/default/xui/tr/menu_bottomtray.xml17
-rw-r--r--indra/newview/skins/default/xui/tr/menu_cof_attachment.xml4
-rw-r--r--indra/newview/skins/default/xui/tr/menu_cof_body_part.xml5
-rw-r--r--indra/newview/skins/default/xui/tr/menu_cof_clothing.xml6
-rw-r--r--indra/newview/skins/default/xui/tr/menu_cof_gear.xml5
-rw-r--r--indra/newview/skins/default/xui/tr/menu_edit.xml12
-rw-r--r--indra/newview/skins/default/xui/tr/menu_favorites.xml10
-rw-r--r--indra/newview/skins/default/xui/tr/menu_gesture_gear.xml9
-rw-r--r--indra/newview/skins/default/xui/tr/menu_group_plus.xml5
-rw-r--r--indra/newview/skins/default/xui/tr/menu_hide_navbar.xml6
-rw-r--r--indra/newview/skins/default/xui/tr/menu_im_well_button.xml4
-rw-r--r--indra/newview/skins/default/xui/tr/menu_imchiclet_adhoc.xml4
-rw-r--r--indra/newview/skins/default/xui/tr/menu_imchiclet_group.xml6
-rw-r--r--indra/newview/skins/default/xui/tr/menu_imchiclet_p2p.xml7
-rw-r--r--indra/newview/skins/default/xui/tr/menu_inspect_avatar_gear.xml21
-rw-r--r--indra/newview/skins/default/xui/tr/menu_inspect_object_gear.xml18
-rw-r--r--indra/newview/skins/default/xui/tr/menu_inspect_self_gear.xml31
-rw-r--r--indra/newview/skins/default/xui/tr/menu_inv_offer_chiclet.xml4
-rw-r--r--indra/newview/skins/default/xui/tr/menu_inventory.xml89
-rw-r--r--indra/newview/skins/default/xui/tr/menu_inventory_add.xml36
-rw-r--r--indra/newview/skins/default/xui/tr/menu_inventory_gear_default.xml17
-rw-r--r--indra/newview/skins/default/xui/tr/menu_land.xml9
-rw-r--r--indra/newview/skins/default/xui/tr/menu_landmark.xml7
-rw-r--r--indra/newview/skins/default/xui/tr/menu_login.xml25
-rw-r--r--indra/newview/skins/default/xui/tr/menu_media_ctrl.xml7
-rw-r--r--indra/newview/skins/default/xui/tr/menu_mini_map.xml11
-rw-r--r--indra/newview/skins/default/xui/tr/menu_mode_change.xml5
-rw-r--r--indra/newview/skins/default/xui/tr/menu_model_import_gear_default.xml8
-rw-r--r--indra/newview/skins/default/xui/tr/menu_navbar.xml11
-rw-r--r--indra/newview/skins/default/xui/tr/menu_nearby_chat.xml9
-rw-r--r--indra/newview/skins/default/xui/tr/menu_notification_well_button.xml4
-rw-r--r--indra/newview/skins/default/xui/tr/menu_object.xml27
-rw-r--r--indra/newview/skins/default/xui/tr/menu_object_icon.xml5
-rw-r--r--indra/newview/skins/default/xui/tr/menu_outfit_gear.xml28
-rw-r--r--indra/newview/skins/default/xui/tr/menu_outfit_tab.xml9
-rw-r--r--indra/newview/skins/default/xui/tr/menu_participant_list.xml21
-rw-r--r--indra/newview/skins/default/xui/tr/menu_people_friends_view_sort.xml8
-rw-r--r--indra/newview/skins/default/xui/tr/menu_people_groups.xml8
-rw-r--r--indra/newview/skins/default/xui/tr/menu_people_groups_view_sort.xml5
-rw-r--r--indra/newview/skins/default/xui/tr/menu_people_nearby.xml13
-rw-r--r--indra/newview/skins/default/xui/tr/menu_people_nearby_multiselect.xml10
-rw-r--r--indra/newview/skins/default/xui/tr/menu_people_nearby_view_sort.xml9
-rw-r--r--indra/newview/skins/default/xui/tr/menu_people_recent_view_sort.xml7
-rw-r--r--indra/newview/skins/default/xui/tr/menu_picks.xml8
-rw-r--r--indra/newview/skins/default/xui/tr/menu_picks_plus.xml5
-rw-r--r--indra/newview/skins/default/xui/tr/menu_place.xml5
-rw-r--r--indra/newview/skins/default/xui/tr/menu_place_add_button.xml5
-rw-r--r--indra/newview/skins/default/xui/tr/menu_places_gear_folder.xml16
-rw-r--r--indra/newview/skins/default/xui/tr/menu_places_gear_landmark.xml19
-rw-r--r--indra/newview/skins/default/xui/tr/menu_profile_overflow.xml12
-rw-r--r--indra/newview/skins/default/xui/tr/menu_save_outfit.xml5
-rw-r--r--indra/newview/skins/default/xui/tr/menu_script_chiclet.xml4
-rw-r--r--indra/newview/skins/default/xui/tr/menu_slurl.xml6
-rw-r--r--indra/newview/skins/default/xui/tr/menu_teleport_history_gear.xml6
-rw-r--r--indra/newview/skins/default/xui/tr/menu_teleport_history_item.xml6
-rw-r--r--indra/newview/skins/default/xui/tr/menu_teleport_history_tab.xml5
-rw-r--r--indra/newview/skins/default/xui/tr/menu_text_editor.xml8
-rw-r--r--indra/newview/skins/default/xui/tr/menu_toolbars.xml7
-rw-r--r--indra/newview/skins/default/xui/tr/menu_topinfobar.xml7
-rw-r--r--indra/newview/skins/default/xui/tr/menu_url_agent.xml6
-rw-r--r--indra/newview/skins/default/xui/tr/menu_url_group.xml6
-rw-r--r--indra/newview/skins/default/xui/tr/menu_url_http.xml7
-rw-r--r--indra/newview/skins/default/xui/tr/menu_url_inventory.xml6
-rw-r--r--indra/newview/skins/default/xui/tr/menu_url_map.xml6
-rw-r--r--indra/newview/skins/default/xui/tr/menu_url_objectim.xml8
-rw-r--r--indra/newview/skins/default/xui/tr/menu_url_parcel.xml6
-rw-r--r--indra/newview/skins/default/xui/tr/menu_url_slapp.xml5
-rw-r--r--indra/newview/skins/default/xui/tr/menu_url_slurl.xml7
-rw-r--r--indra/newview/skins/default/xui/tr/menu_url_teleport.xml6
-rw-r--r--indra/newview/skins/default/xui/tr/menu_viewer.xml460
-rw-r--r--indra/newview/skins/default/xui/tr/menu_wearable_list_item.xml14
-rw-r--r--indra/newview/skins/default/xui/tr/menu_wearing_gear.xml6
-rw-r--r--indra/newview/skins/default/xui/tr/menu_wearing_tab.xml6
-rw-r--r--indra/newview/skins/default/xui/tr/mime_types.xml217
-rw-r--r--indra/newview/skins/default/xui/tr/mime_types_linux.xml217
-rw-r--r--indra/newview/skins/default/xui/tr/mime_types_mac.xml217
-rw-r--r--indra/newview/skins/default/xui/tr/notifications.xml3092
-rw-r--r--indra/newview/skins/default/xui/tr/panel_active_object_row.xml6
-rw-r--r--indra/newview/skins/default/xui/tr/panel_adhoc_control_panel.xml14
-rw-r--r--indra/newview/skins/default/xui/tr/panel_avatar_list_item.xml31
-rw-r--r--indra/newview/skins/default/xui/tr/panel_avatar_tag.xml12
-rw-r--r--indra/newview/skins/default/xui/tr/panel_block_list_sidetray.xml10
-rw-r--r--indra/newview/skins/default/xui/tr/panel_body_parts_list_item.xml8
-rw-r--r--indra/newview/skins/default/xui/tr/panel_bodyparts_list_button_bar.xml4
-rw-r--r--indra/newview/skins/default/xui/tr/panel_bottomtray.xml47
-rw-r--r--indra/newview/skins/default/xui/tr/panel_bottomtray_lite.xml8
-rw-r--r--indra/newview/skins/default/xui/tr/panel_chat_header.xml4
-rw-r--r--indra/newview/skins/default/xui/tr/panel_chiclet_bar.xml15
-rw-r--r--indra/newview/skins/default/xui/tr/panel_classified_info.xml67
-rw-r--r--indra/newview/skins/default/xui/tr/panel_clothing_list_button_bar.xml4
-rw-r--r--indra/newview/skins/default/xui/tr/panel_clothing_list_item.xml9
-rw-r--r--indra/newview/skins/default/xui/tr/panel_cof_wearables.xml8
-rw-r--r--indra/newview/skins/default/xui/tr/panel_deletable_wearable_list_item.xml5
-rw-r--r--indra/newview/skins/default/xui/tr/panel_dummy_clothing_list_item.xml7
-rw-r--r--indra/newview/skins/default/xui/tr/panel_edit_alpha.xml12
-rw-r--r--indra/newview/skins/default/xui/tr/panel_edit_classified.xml54
-rw-r--r--indra/newview/skins/default/xui/tr/panel_edit_eyes.xml11
-rw-r--r--indra/newview/skins/default/xui/tr/panel_edit_gloves.xml12
-rw-r--r--indra/newview/skins/default/xui/tr/panel_edit_hair.xml14
-rw-r--r--indra/newview/skins/default/xui/tr/panel_edit_jacket.xml13
-rw-r--r--indra/newview/skins/default/xui/tr/panel_edit_pants.xml12
-rw-r--r--indra/newview/skins/default/xui/tr/panel_edit_physics.xml14
-rw-r--r--indra/newview/skins/default/xui/tr/panel_edit_pick.xml37
-rw-r--r--indra/newview/skins/default/xui/tr/panel_edit_profile.xml68
-rw-r--r--indra/newview/skins/default/xui/tr/panel_edit_shape.xml25
-rw-r--r--indra/newview/skins/default/xui/tr/panel_edit_shirt.xml12
-rw-r--r--indra/newview/skins/default/xui/tr/panel_edit_shoes.xml12
-rw-r--r--indra/newview/skins/default/xui/tr/panel_edit_skin.xml16
-rw-r--r--indra/newview/skins/default/xui/tr/panel_edit_skirt.xml12
-rw-r--r--indra/newview/skins/default/xui/tr/panel_edit_socks.xml12
-rw-r--r--indra/newview/skins/default/xui/tr/panel_edit_tattoo.xml9
-rw-r--r--indra/newview/skins/default/xui/tr/panel_edit_underpants.xml12
-rw-r--r--indra/newview/skins/default/xui/tr/panel_edit_undershirt.xml12
-rw-r--r--indra/newview/skins/default/xui/tr/panel_edit_wearable.xml120
-rw-r--r--indra/newview/skins/default/xui/tr/panel_group_control_panel.xml17
-rw-r--r--indra/newview/skins/default/xui/tr/panel_group_general.xml57
-rw-r--r--indra/newview/skins/default/xui/tr/panel_group_info_sidetray.xml41
-rw-r--r--indra/newview/skins/default/xui/tr/panel_group_invite.xml27
-rw-r--r--indra/newview/skins/default/xui/tr/panel_group_land_money.xml85
-rw-r--r--indra/newview/skins/default/xui/tr/panel_group_list_item.xml5
-rw-r--r--indra/newview/skins/default/xui/tr/panel_group_notices.xml61
-rw-r--r--indra/newview/skins/default/xui/tr/panel_group_notify.xml12
-rw-r--r--indra/newview/skins/default/xui/tr/panel_group_roles.xml93
-rw-r--r--indra/newview/skins/default/xui/tr/panel_im_control_panel.xml29
-rw-r--r--indra/newview/skins/default/xui/tr/panel_instant_message.xml9
-rw-r--r--indra/newview/skins/default/xui/tr/panel_inventory_item.xml4
-rw-r--r--indra/newview/skins/default/xui/tr/panel_landmark_info.xml41
-rw-r--r--indra/newview/skins/default/xui/tr/panel_landmarks.xml22
-rw-r--r--indra/newview/skins/default/xui/tr/panel_login.xml48
-rw-r--r--indra/newview/skins/default/xui/tr/panel_main_inventory.xml28
-rw-r--r--indra/newview/skins/default/xui/tr/panel_me.xml4
-rw-r--r--indra/newview/skins/default/xui/tr/panel_media_settings_general.xml32
-rw-r--r--indra/newview/skins/default/xui/tr/panel_media_settings_permissions.xml29
-rw-r--r--indra/newview/skins/default/xui/tr/panel_media_settings_security.xml12
-rw-r--r--indra/newview/skins/default/xui/tr/panel_navigation_bar.xml23
-rw-r--r--indra/newview/skins/default/xui/tr/panel_nearby_chat.xml4
-rw-r--r--indra/newview/skins/default/xui/tr/panel_nearby_chat_bar.xml5
-rw-r--r--indra/newview/skins/default/xui/tr/panel_nearby_media.xml70
-rw-r--r--indra/newview/skins/default/xui/tr/panel_notify_textbox.xml11
-rw-r--r--indra/newview/skins/default/xui/tr/panel_online_status_toast.xml2
-rw-r--r--indra/newview/skins/default/xui/tr/panel_outbox_inventory.xml2
-rw-r--r--indra/newview/skins/default/xui/tr/panel_outfit_edit.xml57
-rw-r--r--indra/newview/skins/default/xui/tr/panel_outfits_inventory.xml23
-rw-r--r--indra/newview/skins/default/xui/tr/panel_outfits_inventory_gear_default.xml8
-rw-r--r--indra/newview/skins/default/xui/tr/panel_outfits_list.xml11
-rw-r--r--indra/newview/skins/default/xui/tr/panel_outfits_wearing.xml6
-rw-r--r--indra/newview/skins/default/xui/tr/panel_people.xml94
-rw-r--r--indra/newview/skins/default/xui/tr/panel_pick_info.xml24
-rw-r--r--indra/newview/skins/default/xui/tr/panel_picks.xml29
-rw-r--r--indra/newview/skins/default/xui/tr/panel_place_profile.xml118
-rw-r--r--indra/newview/skins/default/xui/tr/panel_places.xml48
-rw-r--r--indra/newview/skins/default/xui/tr/panel_postcard_message.xml21
-rw-r--r--indra/newview/skins/default/xui/tr/panel_postcard_settings.xml23
-rw-r--r--indra/newview/skins/default/xui/tr/panel_preferences_advanced.xml31
-rw-r--r--indra/newview/skins/default/xui/tr/panel_preferences_alerts.xml14
-rw-r--r--indra/newview/skins/default/xui/tr/panel_preferences_chat.xml33
-rw-r--r--indra/newview/skins/default/xui/tr/panel_preferences_colors.xml44
-rw-r--r--indra/newview/skins/default/xui/tr/panel_preferences_general.xml76
-rw-r--r--indra/newview/skins/default/xui/tr/panel_preferences_graphics1.xml114
-rw-r--r--indra/newview/skins/default/xui/tr/panel_preferences_move.xml39
-rw-r--r--indra/newview/skins/default/xui/tr/panel_preferences_privacy.xml30
-rw-r--r--indra/newview/skins/default/xui/tr/panel_preferences_setup.xml36
-rw-r--r--indra/newview/skins/default/xui/tr/panel_preferences_sound.xml40
-rw-r--r--indra/newview/skins/default/xui/tr/panel_prim_media_controls.xml91
-rw-r--r--indra/newview/skins/default/xui/tr/panel_region_covenant.xml79
-rw-r--r--indra/newview/skins/default/xui/tr/panel_region_debug.xml34
-rw-r--r--indra/newview/skins/default/xui/tr/panel_region_environment.xml33
-rw-r--r--indra/newview/skins/default/xui/tr/panel_region_estate.xml52
-rw-r--r--indra/newview/skins/default/xui/tr/panel_region_general.xml44
-rw-r--r--indra/newview/skins/default/xui/tr/panel_region_terrain.xml60
-rw-r--r--indra/newview/skins/default/xui/tr/panel_region_texture.xml54
-rw-r--r--indra/newview/skins/default/xui/tr/panel_script_ed.xml47
-rw-r--r--indra/newview/skins/default/xui/tr/panel_script_limits_my_avatar.xml16
-rw-r--r--indra/newview/skins/default/xui/tr/panel_script_limits_region_memory.xml20
-rw-r--r--indra/newview/skins/default/xui/tr/panel_scrolling_param.xml10
-rw-r--r--indra/newview/skins/default/xui/tr/panel_scrolling_param_base.xml4
-rw-r--r--indra/newview/skins/default/xui/tr/panel_side_tray.xml29
-rw-r--r--indra/newview/skins/default/xui/tr/panel_side_tray_tab_caption.xml7
-rw-r--r--indra/newview/skins/default/xui/tr/panel_snapshot_inventory.xml21
-rw-r--r--indra/newview/skins/default/xui/tr/panel_snapshot_local.xml39
-rw-r--r--indra/newview/skins/default/xui/tr/panel_snapshot_options.xml7
-rw-r--r--indra/newview/skins/default/xui/tr/panel_snapshot_postcard.xml17
-rw-r--r--indra/newview/skins/default/xui/tr/panel_snapshot_profile.xml28
-rw-r--r--indra/newview/skins/default/xui/tr/panel_sound_devices.xml25
-rw-r--r--indra/newview/skins/default/xui/tr/panel_stand_stop_flying.xml6
-rw-r--r--indra/newview/skins/default/xui/tr/panel_status_bar.xml28
-rw-r--r--indra/newview/skins/default/xui/tr/panel_teleport_history.xml19
-rw-r--r--indra/newview/skins/default/xui/tr/panel_teleport_history_item.xml5
-rw-r--r--indra/newview/skins/default/xui/tr/panel_voice_effect.xml15
-rw-r--r--indra/newview/skins/default/xui/tr/panel_world_map.xml63
-rw-r--r--indra/newview/skins/default/xui/tr/role_actions.xml73
-rw-r--r--indra/newview/skins/default/xui/tr/sidepanel_appearance.xml19
-rw-r--r--indra/newview/skins/default/xui/tr/sidepanel_inventory.xml65
-rw-r--r--indra/newview/skins/default/xui/tr/sidepanel_item_info.xml76
-rw-r--r--indra/newview/skins/default/xui/tr/sidepanel_task_info.xml123
-rw-r--r--indra/newview/skins/default/xui/tr/strings.xml5001
-rw-r--r--indra/newview/skins/default/xui/tr/teleport_strings.xml84
-rw-r--r--indra/newview/skins/default/xui/zh/floater_about.xml2
-rw-r--r--indra/newview/skins/default/xui/zh/floater_about_land.xml80
-rw-r--r--indra/newview/skins/default/xui/zh/floater_animation_preview.xml4
-rw-r--r--indra/newview/skins/default/xui/zh/floater_build_options.xml4
-rw-r--r--indra/newview/skins/default/xui/zh/floater_bumps.xml2
-rw-r--r--indra/newview/skins/default/xui/zh/floater_buy_currency.xml4
-rw-r--r--indra/newview/skins/default/xui/zh/floater_buy_land.xml6
-rw-r--r--indra/newview/skins/default/xui/zh/floater_camera.xml9
-rw-r--r--indra/newview/skins/default/xui/zh/floater_critical.xml2
-rw-r--r--indra/newview/skins/default/xui/zh/floater_day_cycle_options.xml95
-rw-r--r--indra/newview/skins/default/xui/zh/floater_display_name.xml6
-rw-r--r--indra/newview/skins/default/xui/zh/floater_image_preview.xml14
-rw-r--r--indra/newview/skins/default/xui/zh/floater_incoming_call.xml4
-rw-r--r--indra/newview/skins/default/xui/zh/floater_inspect.xml6
-rw-r--r--indra/newview/skins/default/xui/zh/floater_inventory_view_finder.xml2
-rw-r--r--indra/newview/skins/default/xui/zh/floater_nearby_chat.xml2
-rw-r--r--indra/newview/skins/default/xui/zh/floater_outgoing_call.xml6
-rw-r--r--indra/newview/skins/default/xui/zh/floater_preview_animation.xml4
-rw-r--r--indra/newview/skins/default/xui/zh/floater_preview_sound.xml4
-rw-r--r--indra/newview/skins/default/xui/zh/floater_texture_ctrl.xml2
-rw-r--r--indra/newview/skins/default/xui/zh/floater_tools.xml52
-rw-r--r--indra/newview/skins/default/xui/zh/floater_url_entry.xml2
-rw-r--r--indra/newview/skins/default/xui/zh/floater_voice_controls.xml6
-rw-r--r--indra/newview/skins/default/xui/zh/menu_inventory.xml28
-rw-r--r--indra/newview/skins/default/xui/zh/menu_inventory_gear_default.xml2
-rw-r--r--indra/newview/skins/default/xui/zh/menu_viewer.xml147
-rw-r--r--indra/newview/skins/default/xui/zh/mime_types.xml8
-rw-r--r--indra/newview/skins/default/xui/zh/mime_types_linux.xml8
-rw-r--r--indra/newview/skins/default/xui/zh/mime_types_mac.xml4
-rw-r--r--indra/newview/skins/default/xui/zh/notifications.xml202
-rw-r--r--indra/newview/skins/default/xui/zh/panel_bottomtray.xml2
-rw-r--r--indra/newview/skins/default/xui/zh/panel_edit_alpha.xml10
-rw-r--r--indra/newview/skins/default/xui/zh/panel_edit_eyes.xml2
-rw-r--r--indra/newview/skins/default/xui/zh/panel_edit_gloves.xml2
-rw-r--r--indra/newview/skins/default/xui/zh/panel_edit_hair.xml2
-rw-r--r--indra/newview/skins/default/xui/zh/panel_edit_jacket.xml4
-rw-r--r--indra/newview/skins/default/xui/zh/panel_edit_pants.xml2
-rw-r--r--indra/newview/skins/default/xui/zh/panel_edit_profile.xml4
-rw-r--r--indra/newview/skins/default/xui/zh/panel_edit_shirt.xml2
-rw-r--r--indra/newview/skins/default/xui/zh/panel_edit_shoes.xml2
-rw-r--r--indra/newview/skins/default/xui/zh/panel_edit_skin.xml6
-rw-r--r--indra/newview/skins/default/xui/zh/panel_edit_skirt.xml2
-rw-r--r--indra/newview/skins/default/xui/zh/panel_edit_socks.xml2
-rw-r--r--indra/newview/skins/default/xui/zh/panel_edit_tattoo.xml4
-rw-r--r--indra/newview/skins/default/xui/zh/panel_edit_underpants.xml2
-rw-r--r--indra/newview/skins/default/xui/zh/panel_edit_undershirt.xml2
-rw-r--r--indra/newview/skins/default/xui/zh/panel_group_general.xml4
-rw-r--r--indra/newview/skins/default/xui/zh/panel_group_land_money.xml6
-rw-r--r--indra/newview/skins/default/xui/zh/panel_main_inventory.xml2
-rw-r--r--indra/newview/skins/default/xui/zh/panel_media_settings_general.xml4
-rw-r--r--indra/newview/skins/default/xui/zh/panel_media_settings_permissions.xml6
-rw-r--r--indra/newview/skins/default/xui/zh/panel_my_profile.xml42
-rw-r--r--indra/newview/skins/default/xui/zh/panel_notes.xml35
-rw-r--r--indra/newview/skins/default/xui/zh/panel_outfits_inventory.xml2
-rw-r--r--indra/newview/skins/default/xui/zh/panel_people.xml2
-rw-r--r--indra/newview/skins/default/xui/zh/panel_place_profile.xml6
-rw-r--r--indra/newview/skins/default/xui/zh/panel_preferences_chat.xml4
-rw-r--r--indra/newview/skins/default/xui/zh/panel_preferences_general.xml19
-rw-r--r--indra/newview/skins/default/xui/zh/panel_preferences_graphics1.xml4
-rw-r--r--indra/newview/skins/default/xui/zh/panel_preferences_move.xml2
-rw-r--r--indra/newview/skins/default/xui/zh/panel_preferences_privacy.xml2
-rw-r--r--indra/newview/skins/default/xui/zh/panel_prim_media_controls.xml14
-rw-r--r--indra/newview/skins/default/xui/zh/panel_profile.xml67
-rw-r--r--indra/newview/skins/default/xui/zh/panel_profile_view.xml20
-rw-r--r--indra/newview/skins/default/xui/zh/panel_region_general.xml2
-rw-r--r--indra/newview/skins/default/xui/zh/panel_region_terrain.xml14
-rw-r--r--indra/newview/skins/default/xui/zh/panel_script_ed.xml2
-rw-r--r--indra/newview/skins/default/xui/zh/panel_side_tray.xml2
-rw-r--r--indra/newview/skins/default/xui/zh/role_actions.xml4
-rw-r--r--indra/newview/skins/default/xui/zh/sidepanel_inventory.xml6
-rw-r--r--indra/newview/skins/default/xui/zh/sidepanel_task_info.xml16
-rw-r--r--indra/newview/skins/default/xui/zh/strings.xml140
-rw-r--r--indra/newview/skins/default/xui/zh/teleport_strings.xml4
-rw-r--r--indra/newview/skins/minimal/colors.xml6
-rw-r--r--indra/newview/skins/minimal/textures/arrow_keys.pngbin6558 -> 0 bytes
-rw-r--r--indra/newview/skins/minimal/textures/bottomtray/Speak_Btn_Off.pngbin993 -> 0 bytes
-rw-r--r--indra/newview/skins/minimal/textures/bottomtray/Speak_Btn_Selected_Press.pngbin1217 -> 0 bytes
-rw-r--r--indra/newview/skins/minimal/textures/bottomtray/button_separator.pngbin153 -> 0 bytes
-rw-r--r--indra/newview/skins/minimal/textures/bottomtray/close_off.pngbin3184 -> 0 bytes
-rw-r--r--indra/newview/skins/minimal/textures/bottomtray/close_over.pngbin3173 -> 0 bytes
-rw-r--r--indra/newview/skins/minimal/textures/bottomtray/close_press.pngbin3259 -> 0 bytes
-rw-r--r--indra/newview/skins/minimal/textures/click_to_move.pngbin8188 -> 0 bytes
-rw-r--r--indra/newview/skins/minimal/textures/textures.xml11
-rw-r--r--indra/newview/skins/minimal/xui/da/floater_camera.xml65
-rw-r--r--indra/newview/skins/minimal/xui/da/floater_help_browser.xml9
-rw-r--r--indra/newview/skins/minimal/xui/da/floater_media_browser.xml30
-rw-r--r--indra/newview/skins/minimal/xui/da/floater_nearby_chat.xml4
-rw-r--r--indra/newview/skins/minimal/xui/da/floater_web_content.xml14
-rw-r--r--indra/newview/skins/minimal/xui/da/inspect_avatar.xml24
-rw-r--r--indra/newview/skins/minimal/xui/da/inspect_object.xml41
-rw-r--r--indra/newview/skins/minimal/xui/da/menu_add_wearable_gear.xml6
-rw-r--r--indra/newview/skins/minimal/xui/da/menu_attachment_other.xml17
-rw-r--r--indra/newview/skins/minimal/xui/da/menu_attachment_self.xml16
-rw-r--r--indra/newview/skins/minimal/xui/da/menu_avatar_icon.xml7
-rw-r--r--indra/newview/skins/minimal/xui/da/menu_avatar_other.xml16
-rw-r--r--indra/newview/skins/minimal/xui/da/menu_avatar_self.xml31
-rw-r--r--indra/newview/skins/minimal/xui/da/menu_bottomtray.xml17
-rw-r--r--indra/newview/skins/minimal/xui/da/menu_cof_attachment.xml4
-rw-r--r--indra/newview/skins/minimal/xui/da/menu_cof_body_part.xml5
-rw-r--r--indra/newview/skins/minimal/xui/da/menu_cof_clothing.xml6
-rw-r--r--indra/newview/skins/minimal/xui/da/menu_cof_gear.xml5
-rw-r--r--indra/newview/skins/minimal/xui/da/menu_edit.xml12
-rw-r--r--indra/newview/skins/minimal/xui/da/menu_favorites.xml10
-rw-r--r--indra/newview/skins/minimal/xui/da/menu_gesture_gear.xml10
-rw-r--r--indra/newview/skins/minimal/xui/da/menu_group_plus.xml5
-rw-r--r--indra/newview/skins/minimal/xui/da/menu_hide_navbar.xml6
-rw-r--r--indra/newview/skins/minimal/xui/da/menu_im_well_button.xml4
-rw-r--r--indra/newview/skins/minimal/xui/da/menu_imchiclet_adhoc.xml4
-rw-r--r--indra/newview/skins/minimal/xui/da/menu_imchiclet_group.xml6
-rw-r--r--indra/newview/skins/minimal/xui/da/menu_imchiclet_p2p.xml7
-rw-r--r--indra/newview/skins/minimal/xui/da/menu_inspect_avatar_gear.xml21
-rw-r--r--indra/newview/skins/minimal/xui/da/menu_inspect_object_gear.xml18
-rw-r--r--indra/newview/skins/minimal/xui/da/menu_inspect_self_gear.xml31
-rw-r--r--indra/newview/skins/minimal/xui/da/menu_inv_offer_chiclet.xml4
-rw-r--r--indra/newview/skins/minimal/xui/da/menu_inventory.xml84
-rw-r--r--indra/newview/skins/minimal/xui/da/menu_inventory_add.xml33
-rw-r--r--indra/newview/skins/minimal/xui/da/menu_inventory_gear_default.xml17
-rw-r--r--indra/newview/skins/minimal/xui/da/menu_land.xml9
-rw-r--r--indra/newview/skins/minimal/xui/da/menu_landmark.xml7
-rw-r--r--indra/newview/skins/minimal/xui/da/menu_login.xml24
-rw-r--r--indra/newview/skins/minimal/xui/da/menu_mini_map.xml11
-rw-r--r--indra/newview/skins/minimal/xui/da/menu_navbar.xml11
-rw-r--r--indra/newview/skins/minimal/xui/da/menu_nearby_chat.xml9
-rw-r--r--indra/newview/skins/minimal/xui/da/menu_notification_well_button.xml4
-rw-r--r--indra/newview/skins/minimal/xui/da/menu_object.xml29
-rw-r--r--indra/newview/skins/minimal/xui/da/menu_object_icon.xml5
-rw-r--r--indra/newview/skins/minimal/xui/da/menu_outfit_gear.xml27
-rw-r--r--indra/newview/skins/minimal/xui/da/menu_outfit_tab.xml9
-rw-r--r--indra/newview/skins/minimal/xui/da/menu_participant_list.xml21
-rw-r--r--indra/newview/skins/minimal/xui/da/menu_people_friends_view_sort.xml8
-rw-r--r--indra/newview/skins/minimal/xui/da/menu_people_groups.xml8
-rw-r--r--indra/newview/skins/minimal/xui/da/menu_people_groups_view_sort.xml5
-rw-r--r--indra/newview/skins/minimal/xui/da/menu_people_nearby.xml13
-rw-r--r--indra/newview/skins/minimal/xui/da/menu_people_nearby_multiselect.xml10
-rw-r--r--indra/newview/skins/minimal/xui/da/menu_people_nearby_view_sort.xml8
-rw-r--r--indra/newview/skins/minimal/xui/da/menu_people_recent_view_sort.xml7
-rw-r--r--indra/newview/skins/minimal/xui/da/menu_picks.xml8
-rw-r--r--indra/newview/skins/minimal/xui/da/menu_picks_plus.xml5
-rw-r--r--indra/newview/skins/minimal/xui/da/menu_place.xml7
-rw-r--r--indra/newview/skins/minimal/xui/da/menu_place_add_button.xml5
-rw-r--r--indra/newview/skins/minimal/xui/da/menu_places_gear_folder.xml16
-rw-r--r--indra/newview/skins/minimal/xui/da/menu_places_gear_landmark.xml19
-rw-r--r--indra/newview/skins/minimal/xui/da/menu_profile_overflow.xml12
-rw-r--r--indra/newview/skins/minimal/xui/da/menu_save_outfit.xml5
-rw-r--r--indra/newview/skins/minimal/xui/da/menu_script_chiclet.xml4
-rw-r--r--indra/newview/skins/minimal/xui/da/menu_slurl.xml6
-rw-r--r--indra/newview/skins/minimal/xui/da/menu_teleport_history_gear.xml6
-rw-r--r--indra/newview/skins/minimal/xui/da/menu_teleport_history_item.xml6
-rw-r--r--indra/newview/skins/minimal/xui/da/menu_teleport_history_tab.xml5
-rw-r--r--indra/newview/skins/minimal/xui/da/menu_text_editor.xml8
-rw-r--r--indra/newview/skins/minimal/xui/da/menu_topinfobar.xml7
-rw-r--r--indra/newview/skins/minimal/xui/da/menu_url_agent.xml6
-rw-r--r--indra/newview/skins/minimal/xui/da/menu_url_group.xml6
-rw-r--r--indra/newview/skins/minimal/xui/da/menu_url_http.xml7
-rw-r--r--indra/newview/skins/minimal/xui/da/menu_url_inventory.xml6
-rw-r--r--indra/newview/skins/minimal/xui/da/menu_url_map.xml6
-rw-r--r--indra/newview/skins/minimal/xui/da/menu_url_objectim.xml8
-rw-r--r--indra/newview/skins/minimal/xui/da/menu_url_parcel.xml6
-rw-r--r--indra/newview/skins/minimal/xui/da/menu_url_slapp.xml5
-rw-r--r--indra/newview/skins/minimal/xui/da/menu_url_slurl.xml7
-rw-r--r--indra/newview/skins/minimal/xui/da/menu_url_teleport.xml6
-rw-r--r--indra/newview/skins/minimal/xui/da/menu_viewer.xml14
-rw-r--r--indra/newview/skins/minimal/xui/da/menu_wearable_list_item.xml14
-rw-r--r--indra/newview/skins/minimal/xui/da/menu_wearing_gear.xml5
-rw-r--r--indra/newview/skins/minimal/xui/da/menu_wearing_tab.xml6
-rw-r--r--indra/newview/skins/minimal/xui/da/notifications.xml1831
-rw-r--r--indra/newview/skins/minimal/xui/da/panel_adhoc_control_panel.xml14
-rw-r--r--indra/newview/skins/minimal/xui/da/panel_bottomtray.xml45
-rw-r--r--indra/newview/skins/minimal/xui/da/panel_group_control_panel.xml17
-rw-r--r--indra/newview/skins/minimal/xui/da/panel_im_control_panel.xml29
-rw-r--r--indra/newview/skins/minimal/xui/da/panel_login.xml48
-rw-r--r--indra/newview/skins/minimal/xui/da/panel_navigation_bar.xml18
-rw-r--r--indra/newview/skins/minimal/xui/da/panel_people.xml94
-rw-r--r--indra/newview/skins/minimal/xui/da/panel_side_tray_tab_caption.xml7
-rw-r--r--indra/newview/skins/minimal/xui/da/panel_status_bar.xml33
-rw-r--r--indra/newview/skins/minimal/xui/de/floater_camera.xml65
-rw-r--r--indra/newview/skins/minimal/xui/de/floater_help_browser.xml9
-rw-r--r--indra/newview/skins/minimal/xui/de/floater_media_browser.xml30
-rw-r--r--indra/newview/skins/minimal/xui/de/floater_nearby_chat.xml4
-rw-r--r--indra/newview/skins/minimal/xui/de/floater_web_content.xml14
-rw-r--r--indra/newview/skins/minimal/xui/de/inspect_avatar.xml25
-rw-r--r--indra/newview/skins/minimal/xui/de/inspect_object.xml48
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_add_wearable_gear.xml6
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_attachment_other.xml17
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_attachment_self.xml16
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_avatar_icon.xml7
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_avatar_other.xml16
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_avatar_self.xml31
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_bottomtray.xml17
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_cof_attachment.xml4
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_cof_body_part.xml5
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_cof_clothing.xml8
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_cof_gear.xml5
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_edit.xml12
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_favorites.xml10
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_gesture_gear.xml10
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_group_plus.xml5
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_hide_navbar.xml6
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_im_well_button.xml4
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_imchiclet_adhoc.xml4
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_imchiclet_group.xml6
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_imchiclet_p2p.xml7
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_inspect_avatar_gear.xml18
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_inspect_object_gear.xml18
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_inspect_self_gear.xml8
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_inv_offer_chiclet.xml4
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_inventory.xml86
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_inventory_add.xml33
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_inventory_gear_default.xml16
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_land.xml9
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_landmark.xml7
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_login.xml25
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_mini_map.xml11
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_navbar.xml11
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_nearby_chat.xml9
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_notification_well_button.xml4
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_object.xml29
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_object_icon.xml5
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_outfit_gear.xml27
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_outfit_tab.xml9
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_participant_list.xml21
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_people_friends_view_sort.xml8
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_people_groups.xml8
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_people_groups_view_sort.xml5
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_people_nearby.xml13
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_people_nearby_multiselect.xml10
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_people_nearby_view_sort.xml8
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_people_recent_view_sort.xml7
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_picks.xml8
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_picks_plus.xml5
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_place.xml7
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_place_add_button.xml5
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_places_gear_folder.xml15
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_places_gear_landmark.xml18
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_profile_overflow.xml12
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_save_outfit.xml5
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_script_chiclet.xml4
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_slurl.xml6
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_teleport_history_gear.xml6
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_teleport_history_item.xml6
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_teleport_history_tab.xml5
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_text_editor.xml8
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_topinfobar.xml7
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_url_agent.xml6
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_url_group.xml6
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_url_http.xml7
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_url_inventory.xml6
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_url_map.xml6
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_url_objectim.xml8
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_url_parcel.xml6
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_url_slapp.xml5
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_url_slurl.xml7
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_url_teleport.xml6
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_viewer.xml14
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_wearable_list_item.xml14
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_wearing_gear.xml5
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_wearing_tab.xml6
-rw-r--r--indra/newview/skins/minimal/xui/de/notifications.xml19
-rw-r--r--indra/newview/skins/minimal/xui/de/panel_adhoc_control_panel.xml11
-rw-r--r--indra/newview/skins/minimal/xui/de/panel_bottomtray.xml45
-rw-r--r--indra/newview/skins/minimal/xui/de/panel_group_control_panel.xml11
-rw-r--r--indra/newview/skins/minimal/xui/de/panel_im_control_panel.xml29
-rw-r--r--indra/newview/skins/minimal/xui/de/panel_login.xml40
-rw-r--r--indra/newview/skins/minimal/xui/de/panel_navigation_bar.xml18
-rw-r--r--indra/newview/skins/minimal/xui/de/panel_people.xml73
-rw-r--r--indra/newview/skins/minimal/xui/de/panel_side_tray_tab_caption.xml7
-rw-r--r--indra/newview/skins/minimal/xui/de/panel_status_bar.xml24
-rw-r--r--indra/newview/skins/minimal/xui/en/floater_camera.xml284
-rw-r--r--indra/newview/skins/minimal/xui/en/floater_help_browser.xml51
-rw-r--r--indra/newview/skins/minimal/xui/en/floater_media_browser.xml242
-rw-r--r--indra/newview/skins/minimal/xui/en/floater_nearby_chat.xml52
-rw-r--r--indra/newview/skins/minimal/xui/en/floater_side_bar_tab.xml10
-rw-r--r--indra/newview/skins/minimal/xui/en/floater_web_content.xml196
-rw-r--r--indra/newview/skins/minimal/xui/en/inspect_avatar.xml206
-rw-r--r--indra/newview/skins/minimal/xui/en/inspect_object.xml144
-rw-r--r--indra/newview/skins/minimal/xui/en/main_view.xml269
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_add_wearable_gear.xml2
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_attachment_other.xml84
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_attachment_self.xml26
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_avatar_icon.xml2
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_avatar_other.xml83
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_avatar_self.xml2
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_bottomtray.xml2
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_cof_attachment.xml2
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_cof_body_part.xml2
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_cof_clothing.xml2
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_cof_gear.xml2
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_edit.xml90
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_favorites.xml2
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_gesture_gear.xml2
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_group_plus.xml2
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_hide_navbar.xml2
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_im_well_button.xml2
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_imchiclet_adhoc.xml2
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_imchiclet_group.xml2
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_imchiclet_p2p.xml2
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_inspect_avatar_gear.xml125
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_inspect_object_gear.xml50
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_inspect_self_gear.xml49
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_inv_offer_chiclet.xml2
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_inventory.xml2
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_inventory_add.xml2
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_inventory_gear_default.xml2
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_land.xml2
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_landmark.xml2
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_login.xml2
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_mini_map.xml2
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_navbar.xml2
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_nearby_chat.xml2
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_notification_well_button.xml2
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_object.xml40
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_object_icon.xml2
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_outfit_gear.xml2
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_outfit_tab.xml2
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_participant_list.xml2
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_people_friends_view_sort.xml2
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_people_groups.xml2
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_people_groups_view_sort.xml2
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_people_nearby.xml71
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_people_nearby_multiselect.xml2
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_people_nearby_view_sort.xml2
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_people_recent_view_sort.xml2
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_picks.xml2
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_picks_plus.xml2
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_place.xml2
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_place_add_button.xml2
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_places_gear_folder.xml2
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_places_gear_landmark.xml2
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_profile_overflow.xml2
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_save_outfit.xml2
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_script_chiclet.xml2
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_slurl.xml2
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_teleport_history_gear.xml2
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_teleport_history_item.xml2
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_teleport_history_tab.xml2
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_text_editor.xml2
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_topinfobar.xml2
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_url_agent.xml2
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_url_group.xml2
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_url_http.xml2
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_url_inventory.xml2
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_url_map.xml2
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_url_objectim.xml2
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_url_parcel.xml2
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_url_slapp.xml2
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_url_slurl.xml2
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_url_teleport.xml2
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_viewer.xml71
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_wearable_list_item.xml2
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_wearing_gear.xml2
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_wearing_tab.xml2
-rw-r--r--indra/newview/skins/minimal/xui/en/notification_visibility.xml27
-rw-r--r--indra/newview/skins/minimal/xui/en/notifications.xml44
-rw-r--r--indra/newview/skins/minimal/xui/en/panel_adhoc_control_panel.xml81
-rw-r--r--indra/newview/skins/minimal/xui/en/panel_bottomtray.xml557
-rw-r--r--indra/newview/skins/minimal/xui/en/panel_group_control_panel.xml79
-rw-r--r--indra/newview/skins/minimal/xui/en/panel_im_control_panel.xml194
-rw-r--r--indra/newview/skins/minimal/xui/en/panel_login.xml205
-rw-r--r--indra/newview/skins/minimal/xui/en/panel_navigation_bar.xml76
-rw-r--r--indra/newview/skins/minimal/xui/en/panel_people.xml571
-rw-r--r--indra/newview/skins/minimal/xui/en/panel_side_tray_tab_caption.xml11
-rw-r--r--indra/newview/skins/minimal/xui/en/panel_status_bar.xml83
-rw-r--r--indra/newview/skins/minimal/xui/en/panel_volume_pulldown.xml34
-rw-r--r--indra/newview/skins/minimal/xui/en/widgets/location_input.xml139
-rw-r--r--indra/newview/skins/minimal/xui/es/floater_camera.xml65
-rw-r--r--indra/newview/skins/minimal/xui/es/floater_help_browser.xml9
-rw-r--r--indra/newview/skins/minimal/xui/es/floater_media_browser.xml30
-rw-r--r--indra/newview/skins/minimal/xui/es/floater_nearby_chat.xml4
-rw-r--r--indra/newview/skins/minimal/xui/es/floater_web_content.xml14
-rw-r--r--indra/newview/skins/minimal/xui/es/inspect_avatar.xml24
-rw-r--r--indra/newview/skins/minimal/xui/es/inspect_object.xml41
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_add_wearable_gear.xml6
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_attachment_other.xml17
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_attachment_self.xml16
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_avatar_icon.xml7
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_avatar_other.xml16
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_avatar_self.xml31
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_bottomtray.xml17
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_cof_attachment.xml4
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_cof_body_part.xml5
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_cof_clothing.xml6
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_cof_gear.xml5
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_edit.xml12
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_favorites.xml10
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_gesture_gear.xml10
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_group_plus.xml5
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_hide_navbar.xml6
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_im_well_button.xml4
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_imchiclet_adhoc.xml4
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_imchiclet_group.xml6
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_imchiclet_p2p.xml7
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_inspect_avatar_gear.xml18
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_inspect_object_gear.xml18
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_inspect_self_gear.xml8
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_inv_offer_chiclet.xml4
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_inventory.xml86
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_inventory_add.xml33
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_inventory_gear_default.xml16
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_land.xml9
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_landmark.xml7
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_login.xml24
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_mini_map.xml11
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_navbar.xml11
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_nearby_chat.xml9
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_notification_well_button.xml4
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_object.xml29
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_object_icon.xml5
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_outfit_gear.xml27
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_outfit_tab.xml9
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_participant_list.xml21
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_people_friends_view_sort.xml8
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_people_groups.xml8
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_people_groups_view_sort.xml5
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_people_nearby.xml13
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_people_nearby_multiselect.xml10
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_people_nearby_view_sort.xml8
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_people_recent_view_sort.xml7
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_picks.xml8
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_picks_plus.xml5
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_place.xml7
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_place_add_button.xml5
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_places_gear_folder.xml15
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_places_gear_landmark.xml18
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_profile_overflow.xml12
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_save_outfit.xml5
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_script_chiclet.xml4
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_slurl.xml6
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_teleport_history_gear.xml6
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_teleport_history_item.xml6
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_teleport_history_tab.xml5
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_text_editor.xml8
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_topinfobar.xml7
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_url_agent.xml6
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_url_group.xml6
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_url_http.xml7
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_url_inventory.xml6
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_url_map.xml6
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_url_objectim.xml8
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_url_parcel.xml6
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_url_slapp.xml5
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_url_slurl.xml7
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_url_teleport.xml6
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_viewer.xml14
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_wearable_list_item.xml14
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_wearing_gear.xml5
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_wearing_tab.xml6
-rw-r--r--indra/newview/skins/minimal/xui/es/notifications.xml19
-rw-r--r--indra/newview/skins/minimal/xui/es/panel_adhoc_control_panel.xml11
-rw-r--r--indra/newview/skins/minimal/xui/es/panel_bottomtray.xml45
-rw-r--r--indra/newview/skins/minimal/xui/es/panel_group_control_panel.xml11
-rw-r--r--indra/newview/skins/minimal/xui/es/panel_im_control_panel.xml29
-rw-r--r--indra/newview/skins/minimal/xui/es/panel_login.xml40
-rw-r--r--indra/newview/skins/minimal/xui/es/panel_navigation_bar.xml18
-rw-r--r--indra/newview/skins/minimal/xui/es/panel_people.xml74
-rw-r--r--indra/newview/skins/minimal/xui/es/panel_side_tray_tab_caption.xml7
-rw-r--r--indra/newview/skins/minimal/xui/es/panel_status_bar.xml24
-rw-r--r--indra/newview/skins/minimal/xui/fr/floater_camera.xml65
-rw-r--r--indra/newview/skins/minimal/xui/fr/floater_help_browser.xml9
-rw-r--r--indra/newview/skins/minimal/xui/fr/floater_media_browser.xml30
-rw-r--r--indra/newview/skins/minimal/xui/fr/floater_nearby_chat.xml4
-rw-r--r--indra/newview/skins/minimal/xui/fr/floater_web_content.xml14
-rw-r--r--indra/newview/skins/minimal/xui/fr/inspect_avatar.xml25
-rw-r--r--indra/newview/skins/minimal/xui/fr/inspect_object.xml48
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_add_wearable_gear.xml6
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_attachment_other.xml17
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_attachment_self.xml16
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_avatar_icon.xml7
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_avatar_other.xml16
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_avatar_self.xml31
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_bottomtray.xml17
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_cof_attachment.xml4
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_cof_body_part.xml5
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_cof_clothing.xml6
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_cof_gear.xml5
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_edit.xml12
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_favorites.xml10
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_gesture_gear.xml10
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_group_plus.xml5
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_hide_navbar.xml6
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_im_well_button.xml4
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_imchiclet_adhoc.xml4
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_imchiclet_group.xml6
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_imchiclet_p2p.xml7
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_inspect_avatar_gear.xml18
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_inspect_object_gear.xml18
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_inspect_self_gear.xml8
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_inv_offer_chiclet.xml4
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_inventory.xml86
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_inventory_add.xml33
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_inventory_gear_default.xml16
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_land.xml9
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_landmark.xml7
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_login.xml25
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_mini_map.xml11
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_navbar.xml11
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_nearby_chat.xml9
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_notification_well_button.xml4
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_object.xml29
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_object_icon.xml5
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_outfit_gear.xml27
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_outfit_tab.xml9
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_participant_list.xml21
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_people_friends_view_sort.xml8
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_people_groups.xml8
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_people_groups_view_sort.xml5
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_people_nearby.xml13
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_people_nearby_multiselect.xml10
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_people_nearby_view_sort.xml8
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_people_recent_view_sort.xml7
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_picks.xml8
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_picks_plus.xml5
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_place.xml7
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_place_add_button.xml5
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_places_gear_folder.xml15
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_places_gear_landmark.xml18
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_profile_overflow.xml12
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_save_outfit.xml5
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_script_chiclet.xml4
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_slurl.xml6
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_teleport_history_gear.xml6
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_teleport_history_item.xml6
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_teleport_history_tab.xml5
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_text_editor.xml8
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_topinfobar.xml7
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_url_agent.xml6
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_url_group.xml6
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_url_http.xml7
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_url_inventory.xml6
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_url_map.xml6
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_url_objectim.xml8
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_url_parcel.xml6
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_url_slapp.xml5
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_url_slurl.xml7
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_url_teleport.xml6
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_viewer.xml14
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_wearable_list_item.xml14
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_wearing_gear.xml5
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_wearing_tab.xml6
-rw-r--r--indra/newview/skins/minimal/xui/fr/notifications.xml19
-rw-r--r--indra/newview/skins/minimal/xui/fr/panel_adhoc_control_panel.xml11
-rw-r--r--indra/newview/skins/minimal/xui/fr/panel_bottomtray.xml45
-rw-r--r--indra/newview/skins/minimal/xui/fr/panel_group_control_panel.xml11
-rw-r--r--indra/newview/skins/minimal/xui/fr/panel_im_control_panel.xml29
-rw-r--r--indra/newview/skins/minimal/xui/fr/panel_login.xml40
-rw-r--r--indra/newview/skins/minimal/xui/fr/panel_navigation_bar.xml18
-rw-r--r--indra/newview/skins/minimal/xui/fr/panel_people.xml74
-rw-r--r--indra/newview/skins/minimal/xui/fr/panel_side_tray_tab_caption.xml7
-rw-r--r--indra/newview/skins/minimal/xui/fr/panel_status_bar.xml24
-rw-r--r--indra/newview/skins/minimal/xui/it/floater_camera.xml65
-rw-r--r--indra/newview/skins/minimal/xui/it/floater_help_browser.xml9
-rw-r--r--indra/newview/skins/minimal/xui/it/floater_media_browser.xml31
-rw-r--r--indra/newview/skins/minimal/xui/it/floater_nearby_chat.xml4
-rw-r--r--indra/newview/skins/minimal/xui/it/floater_web_content.xml14
-rw-r--r--indra/newview/skins/minimal/xui/it/inspect_avatar.xml26
-rw-r--r--indra/newview/skins/minimal/xui/it/inspect_object.xml41
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_add_wearable_gear.xml6
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_attachment_other.xml17
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_attachment_self.xml16
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_avatar_icon.xml7
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_avatar_other.xml16
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_avatar_self.xml32
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_bottomtray.xml17
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_cof_attachment.xml4
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_cof_body_part.xml5
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_cof_clothing.xml6
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_cof_gear.xml5
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_edit.xml12
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_favorites.xml10
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_gesture_gear.xml10
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_group_plus.xml5
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_hide_navbar.xml6
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_im_well_button.xml4
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_imchiclet_adhoc.xml4
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_imchiclet_group.xml6
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_imchiclet_p2p.xml7
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_inspect_avatar_gear.xml21
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_inspect_object_gear.xml18
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_inspect_self_gear.xml31
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_inv_offer_chiclet.xml4
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_inventory.xml87
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_inventory_add.xml34
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_inventory_gear_default.xml17
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_land.xml9
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_landmark.xml7
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_login.xml24
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_mini_map.xml11
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_navbar.xml11
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_nearby_chat.xml9
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_notification_well_button.xml4
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_object.xml29
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_object_icon.xml5
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_outfit_gear.xml28
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_outfit_tab.xml9
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_participant_list.xml21
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_people_friends_view_sort.xml8
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_people_groups.xml8
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_people_groups_view_sort.xml5
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_people_nearby.xml13
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_people_nearby_multiselect.xml10
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_people_nearby_view_sort.xml8
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_people_recent_view_sort.xml7
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_picks.xml8
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_picks_plus.xml5
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_place.xml7
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_place_add_button.xml5
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_places_gear_folder.xml16
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_places_gear_landmark.xml19
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_profile_overflow.xml12
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_save_outfit.xml5
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_script_chiclet.xml4
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_slurl.xml6
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_teleport_history_gear.xml6
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_teleport_history_item.xml6
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_teleport_history_tab.xml5
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_text_editor.xml8
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_topinfobar.xml7
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_url_agent.xml6
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_url_group.xml6
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_url_http.xml7
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_url_inventory.xml6
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_url_map.xml6
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_url_objectim.xml8
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_url_parcel.xml6
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_url_slapp.xml5
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_url_slurl.xml7
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_url_teleport.xml6
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_viewer.xml14
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_wearable_list_item.xml14
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_wearing_gear.xml5
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_wearing_tab.xml6
-rw-r--r--indra/newview/skins/minimal/xui/it/notifications.xml2951
-rw-r--r--indra/newview/skins/minimal/xui/it/panel_adhoc_control_panel.xml14
-rw-r--r--indra/newview/skins/minimal/xui/it/panel_bottomtray.xml45
-rw-r--r--indra/newview/skins/minimal/xui/it/panel_group_control_panel.xml17
-rw-r--r--indra/newview/skins/minimal/xui/it/panel_im_control_panel.xml29
-rw-r--r--indra/newview/skins/minimal/xui/it/panel_login.xml48
-rw-r--r--indra/newview/skins/minimal/xui/it/panel_navigation_bar.xml18
-rw-r--r--indra/newview/skins/minimal/xui/it/panel_people.xml94
-rw-r--r--indra/newview/skins/minimal/xui/it/panel_side_tray_tab_caption.xml7
-rw-r--r--indra/newview/skins/minimal/xui/it/panel_status_bar.xml24
-rw-r--r--indra/newview/skins/minimal/xui/ja/floater_camera.xml65
-rw-r--r--indra/newview/skins/minimal/xui/ja/floater_help_browser.xml9
-rw-r--r--indra/newview/skins/minimal/xui/ja/floater_media_browser.xml30
-rw-r--r--indra/newview/skins/minimal/xui/ja/floater_nearby_chat.xml4
-rw-r--r--indra/newview/skins/minimal/xui/ja/floater_web_content.xml14
-rw-r--r--indra/newview/skins/minimal/xui/ja/inspect_avatar.xml27
-rw-r--r--indra/newview/skins/minimal/xui/ja/inspect_object.xml48
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_add_wearable_gear.xml6
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_attachment_other.xml17
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_attachment_self.xml16
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_avatar_icon.xml7
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_avatar_other.xml16
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_avatar_self.xml32
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_bottomtray.xml17
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_cof_attachment.xml4
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_cof_body_part.xml5
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_cof_clothing.xml6
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_cof_gear.xml5
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_edit.xml12
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_favorites.xml10
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_gesture_gear.xml10
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_group_plus.xml5
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_hide_navbar.xml6
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_im_well_button.xml4
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_imchiclet_adhoc.xml4
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_imchiclet_group.xml6
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_imchiclet_p2p.xml7
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_inspect_avatar_gear.xml21
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_inspect_object_gear.xml18
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_inspect_self_gear.xml31
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_inv_offer_chiclet.xml4
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_inventory.xml87
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_inventory_add.xml34
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_inventory_gear_default.xml17
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_land.xml9
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_landmark.xml7
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_login.xml25
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_mini_map.xml11
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_navbar.xml11
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_nearby_chat.xml9
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_notification_well_button.xml4
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_object.xml29
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_object_icon.xml5
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_outfit_gear.xml28
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_outfit_tab.xml9
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_participant_list.xml21
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_people_friends_view_sort.xml8
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_people_groups.xml8
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_people_groups_view_sort.xml5
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_people_nearby.xml13
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_people_nearby_multiselect.xml10
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_people_nearby_view_sort.xml8
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_people_recent_view_sort.xml7
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_picks.xml8
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_picks_plus.xml5
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_place.xml7
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_place_add_button.xml5
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_places_gear_folder.xml16
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_places_gear_landmark.xml19
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_profile_overflow.xml12
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_save_outfit.xml5
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_script_chiclet.xml4
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_slurl.xml6
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_teleport_history_gear.xml6
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_teleport_history_item.xml6
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_teleport_history_tab.xml5
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_text_editor.xml8
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_topinfobar.xml7
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_url_agent.xml6
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_url_group.xml6
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_url_http.xml7
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_url_inventory.xml6
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_url_map.xml6
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_url_objectim.xml8
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_url_parcel.xml6
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_url_slapp.xml5
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_url_slurl.xml7
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_url_teleport.xml6
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_viewer.xml14
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_wearable_list_item.xml14
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_wearing_gear.xml5
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_wearing_tab.xml6
-rw-r--r--indra/newview/skins/minimal/xui/ja/notifications.xml2995
-rw-r--r--indra/newview/skins/minimal/xui/ja/panel_adhoc_control_panel.xml14
-rw-r--r--indra/newview/skins/minimal/xui/ja/panel_bottomtray.xml45
-rw-r--r--indra/newview/skins/minimal/xui/ja/panel_group_control_panel.xml17
-rw-r--r--indra/newview/skins/minimal/xui/ja/panel_im_control_panel.xml29
-rw-r--r--indra/newview/skins/minimal/xui/ja/panel_login.xml48
-rw-r--r--indra/newview/skins/minimal/xui/ja/panel_navigation_bar.xml18
-rw-r--r--indra/newview/skins/minimal/xui/ja/panel_people.xml94
-rw-r--r--indra/newview/skins/minimal/xui/ja/panel_side_tray_tab_caption.xml7
-rw-r--r--indra/newview/skins/minimal/xui/ja/panel_status_bar.xml24
-rw-r--r--indra/newview/skins/minimal/xui/pl/floater_camera.xml65
-rw-r--r--indra/newview/skins/minimal/xui/pl/floater_help_browser.xml9
-rw-r--r--indra/newview/skins/minimal/xui/pl/floater_media_browser.xml30
-rw-r--r--indra/newview/skins/minimal/xui/pl/floater_nearby_chat.xml4
-rw-r--r--indra/newview/skins/minimal/xui/pl/floater_web_content.xml14
-rw-r--r--indra/newview/skins/minimal/xui/pl/inspect_avatar.xml24
-rw-r--r--indra/newview/skins/minimal/xui/pl/inspect_object.xml41
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_add_wearable_gear.xml6
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_attachment_other.xml17
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_attachment_self.xml16
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_avatar_icon.xml7
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_avatar_other.xml16
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_avatar_self.xml31
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_bottomtray.xml17
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_cof_attachment.xml4
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_cof_body_part.xml5
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_cof_clothing.xml6
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_cof_gear.xml5
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_edit.xml12
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_favorites.xml10
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_gesture_gear.xml10
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_group_plus.xml5
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_hide_navbar.xml6
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_im_well_button.xml4
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_imchiclet_adhoc.xml4
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_imchiclet_group.xml6
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_imchiclet_p2p.xml7
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_inspect_avatar_gear.xml21
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_inspect_object_gear.xml18
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_inspect_self_gear.xml31
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_inv_offer_chiclet.xml4
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_inventory.xml84
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_inventory_add.xml33
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_inventory_gear_default.xml17
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_land.xml9
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_landmark.xml7
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_login.xml24
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_mini_map.xml11
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_navbar.xml11
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_nearby_chat.xml9
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_notification_well_button.xml4
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_object.xml29
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_object_icon.xml5
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_outfit_gear.xml27
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_outfit_tab.xml9
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_participant_list.xml21
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_people_friends_view_sort.xml8
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_people_groups.xml8
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_people_groups_view_sort.xml5
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_people_nearby.xml13
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_people_nearby_multiselect.xml10
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_people_nearby_view_sort.xml8
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_people_recent_view_sort.xml7
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_picks.xml8
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_picks_plus.xml5
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_place.xml7
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_place_add_button.xml5
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_places_gear_folder.xml16
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_places_gear_landmark.xml19
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_profile_overflow.xml12
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_save_outfit.xml5
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_script_chiclet.xml4
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_slurl.xml6
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_teleport_history_gear.xml6
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_teleport_history_item.xml6
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_teleport_history_tab.xml5
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_text_editor.xml8
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_topinfobar.xml7
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_url_agent.xml6
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_url_group.xml6
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_url_http.xml7
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_url_inventory.xml6
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_url_map.xml6
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_url_objectim.xml8
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_url_parcel.xml6
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_url_slapp.xml5
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_url_slurl.xml7
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_url_teleport.xml6
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_viewer.xml14
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_wearable_list_item.xml14
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_wearing_gear.xml5
-rw-r--r--indra/newview/skins/minimal/xui/pl/menu_wearing_tab.xml6
-rw-r--r--indra/newview/skins/minimal/xui/pl/notifications.xml2907
-rw-r--r--indra/newview/skins/minimal/xui/pl/panel_adhoc_control_panel.xml14
-rw-r--r--indra/newview/skins/minimal/xui/pl/panel_bottomtray.xml39
-rw-r--r--indra/newview/skins/minimal/xui/pl/panel_group_control_panel.xml17
-rw-r--r--indra/newview/skins/minimal/xui/pl/panel_im_control_panel.xml29
-rw-r--r--indra/newview/skins/minimal/xui/pl/panel_login.xml45
-rw-r--r--indra/newview/skins/minimal/xui/pl/panel_navigation_bar.xml18
-rw-r--r--indra/newview/skins/minimal/xui/pl/panel_people.xml94
-rw-r--r--indra/newview/skins/minimal/xui/pl/panel_side_tray_tab_caption.xml7
-rw-r--r--indra/newview/skins/minimal/xui/pl/panel_status_bar.xml33
-rw-r--r--indra/newview/skins/minimal/xui/pt/floater_camera.xml65
-rw-r--r--indra/newview/skins/minimal/xui/pt/floater_help_browser.xml9
-rw-r--r--indra/newview/skins/minimal/xui/pt/floater_media_browser.xml30
-rw-r--r--indra/newview/skins/minimal/xui/pt/floater_nearby_chat.xml4
-rw-r--r--indra/newview/skins/minimal/xui/pt/floater_web_content.xml14
-rw-r--r--indra/newview/skins/minimal/xui/pt/inspect_avatar.xml24
-rw-r--r--indra/newview/skins/minimal/xui/pt/inspect_object.xml41
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_add_wearable_gear.xml6
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_attachment_other.xml17
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_attachment_self.xml16
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_avatar_icon.xml7
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_avatar_other.xml16
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_avatar_self.xml31
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_bottomtray.xml17
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_cof_attachment.xml4
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_cof_body_part.xml5
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_cof_clothing.xml6
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_cof_gear.xml5
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_edit.xml12
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_favorites.xml10
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_gesture_gear.xml10
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_group_plus.xml5
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_hide_navbar.xml6
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_im_well_button.xml4
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_imchiclet_adhoc.xml4
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_imchiclet_group.xml6
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_imchiclet_p2p.xml7
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_inspect_avatar_gear.xml18
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_inspect_object_gear.xml18
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_inspect_self_gear.xml8
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_inv_offer_chiclet.xml4
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_inventory.xml86
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_inventory_add.xml33
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_inventory_gear_default.xml16
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_land.xml9
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_landmark.xml7
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_login.xml24
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_mini_map.xml11
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_navbar.xml11
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_nearby_chat.xml9
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_notification_well_button.xml4
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_object.xml29
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_object_icon.xml5
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_outfit_gear.xml27
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_outfit_tab.xml9
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_participant_list.xml21
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_people_friends_view_sort.xml8
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_people_groups.xml8
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_people_groups_view_sort.xml5
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_people_nearby.xml13
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_people_nearby_multiselect.xml10
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_people_nearby_view_sort.xml8
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_people_recent_view_sort.xml7
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_picks.xml8
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_picks_plus.xml5
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_place.xml7
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_place_add_button.xml5
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_places_gear_folder.xml15
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_places_gear_landmark.xml18
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_profile_overflow.xml12
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_save_outfit.xml5
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_script_chiclet.xml4
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_slurl.xml6
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_teleport_history_gear.xml6
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_teleport_history_item.xml6
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_teleport_history_tab.xml5
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_text_editor.xml8
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_topinfobar.xml7
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_url_agent.xml6
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_url_group.xml6
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_url_http.xml7
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_url_inventory.xml6
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_url_map.xml6
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_url_objectim.xml8
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_url_parcel.xml6
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_url_slapp.xml5
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_url_slurl.xml7
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_url_teleport.xml6
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_viewer.xml14
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_wearable_list_item.xml14
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_wearing_gear.xml5
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_wearing_tab.xml6
-rw-r--r--indra/newview/skins/minimal/xui/pt/notifications.xml19
-rw-r--r--indra/newview/skins/minimal/xui/pt/panel_adhoc_control_panel.xml14
-rw-r--r--indra/newview/skins/minimal/xui/pt/panel_bottomtray.xml45
-rw-r--r--indra/newview/skins/minimal/xui/pt/panel_group_control_panel.xml11
-rw-r--r--indra/newview/skins/minimal/xui/pt/panel_im_control_panel.xml29
-rw-r--r--indra/newview/skins/minimal/xui/pt/panel_login.xml40
-rw-r--r--indra/newview/skins/minimal/xui/pt/panel_navigation_bar.xml18
-rw-r--r--indra/newview/skins/minimal/xui/pt/panel_people.xml74
-rw-r--r--indra/newview/skins/minimal/xui/pt/panel_side_tray_tab_caption.xml7
-rw-r--r--indra/newview/skins/minimal/xui/pt/panel_status_bar.xml24
-rw-r--r--indra/newview/skins/paths.xml2
-rw-r--r--indra/newview/tests/gpus_results.txt845
-rw-r--r--indra/newview/tests/gpus_seen.txt829
-rw-r--r--indra/newview/tests/lltranslate_test.cpp345
-rw-r--r--indra/newview/tests/llworldmap_test.cpp1
-rw-r--r--[-rwxr-xr-x]indra/newview/viewer_manifest.py0
-rw-r--r--indra/test/CMakeLists.txt54
-rw-r--r--indra/test/catch_and_store_what_in.h86
-rw-r--r--indra/test/io.cpp2
-rw-r--r--indra/test/llapp_tut.cpp162
-rw-r--r--indra/test/llevents_tut.cpp1276
-rw-r--r--indra/test/llhttpclient_tut.cpp5
-rw-r--r--indra/test/llsd_new_tut.cpp116
-rw-r--r--indra/test/llsdmessagebuilder_tut.cpp7
-rw-r--r--indra/test/lltemplatemessagebuilder_tut.cpp57
-rw-r--r--indra/test/lltut.cpp5
-rw-r--r--indra/test/manageapr.h46
-rw-r--r--indra/test/message_tut.cpp2
-rw-r--r--indra/test/namedtempfile.h205
-rw-r--r--indra/test/test.cpp330
-rw-r--r--indra/test_apps/llplugintest/llmediaplugintest.cpp4
-rw-r--r--indra/viewer_components/updater/llupdatedownloader.cpp23
-rw-r--r--indra/viewer_components/updater/llupdateinstaller.cpp24
-rw-r--r--[-rwxr-xr-x]indra/viewer_components/updater/scripts/darwin/update_install0
-rw-r--r--[-rwxr-xr-x]indra/viewer_components/updater/scripts/linux/update_install0
-rw-r--r--indra/win_crash_logger/StdAfx.h1
-rw-r--r--indra/win_crash_logger/llcrashloggerwindows.cpp1
3408 files changed, 103461 insertions, 92292 deletions
diff --git a/indra/CMakeLists.txt b/indra/CMakeLists.txt
index d1042d6e86..1cebb53a07 100644
--- a/indra/CMakeLists.txt
+++ b/indra/CMakeLists.txt
@@ -1,4 +1,3 @@
-
# -*- cmake -*-
# cmake_minimum_required should appear before any
@@ -67,9 +66,11 @@ if (VIEWER)
add_subdirectory(${LIBS_OPEN_PREFIX}llcrashlogger)
add_subdirectory(${LIBS_OPEN_PREFIX}llplugin)
add_subdirectory(${LIBS_OPEN_PREFIX}llui)
- add_subdirectory(${LIBS_OPEN_PREFIX}llxuixml)
add_subdirectory(${LIBS_OPEN_PREFIX}viewer_components)
+ # Legacy C++ tests. Build always, run if LL_TESTS is true.
+ add_subdirectory(${VIEWER_PREFIX}test)
+
# viewer media plugins
add_subdirectory(${LIBS_OPEN_PREFIX}media_plugins)
diff --git a/indra/cmake/00-Common.cmake b/indra/cmake/00-Common.cmake
index 0266239454..98eeed09b3 100644
--- a/indra/cmake/00-Common.cmake
+++ b/indra/cmake/00-Common.cmake
@@ -46,7 +46,7 @@ if (WINDOWS)
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /Od /Zi /MDd /MP -D_SCL_SECURE_NO_WARNINGS=1"
CACHE STRING "C++ compiler debug options" FORCE)
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO
- "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} /Od /Zi /MD /MP /Ob2 -D_SECURE_STL=0"
+ "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} /Od /Zi /MD /MP /Ob0 -D_SECURE_STL=0"
CACHE STRING "C++ compiler release-with-debug options" FORCE)
set(CMAKE_CXX_FLAGS_RELEASE
"${CMAKE_CXX_FLAGS_RELEASE} ${LL_CXX_FLAGS} /O2 /Zi /MD /MP /Ob2 -D_SECURE_STL=0 -D_HAS_ITERATOR_DEBUGGING=0"
@@ -62,7 +62,7 @@ if (WINDOWS)
/D_UNICODE
/GS
/TP
- /W2
+ /W3
/c
/Zc:forScope
/nologo
diff --git a/indra/cmake/FindGLH.cmake b/indra/cmake/FindGLH.cmake
new file mode 100644
index 0000000000..3d16adaf03
--- /dev/null
+++ b/indra/cmake/FindGLH.cmake
@@ -0,0 +1,30 @@
+# -*- cmake -*-
+
+# - Find GLH
+# Find the Graphic Library Helper includes.
+# This module defines
+# GLH_INCLUDE_DIR, where to find glh/glh_linear.h.
+# GLH_FOUND, If false, do not try to use GLH.
+
+find_path(GLH_INCLUDE_DIR glh/glh_linear.h
+ NO_SYSTEM_ENVIRONMENT_PATH
+ )
+
+if (GLH_INCLUDE_DIR)
+ set(GLH_FOUND "YES")
+else (GLH_INCLUDE_DIR)
+ set(GLH_FOUND "NO")
+endif (GLH_INCLUDE_DIR)
+
+if (GLH_FOUND)
+ if (NOT GLH_FIND_QUIETLY)
+ message(STATUS "Found GLH: ${GLH_INCLUDE_DIR}")
+ set(GLH_FIND_QUIETLY TRUE) # Only alert us the first time
+ endif (NOT GLH_FIND_QUIETLY)
+else (GLH_FOUND)
+ if (GLH_FIND_REQUIRED)
+ message(FATAL_ERROR "Could not find GLH")
+ endif (GLH_FIND_REQUIRED)
+endif (GLH_FOUND)
+
+mark_as_advanced(GLH_INCLUDE_DIR)
diff --git a/indra/cmake/GLH.cmake b/indra/cmake/GLH.cmake
new file mode 100644
index 0000000000..911dbe4017
--- /dev/null
+++ b/indra/cmake/GLH.cmake
@@ -0,0 +1,11 @@
+# -*- cmake -*-
+include(Prebuilt)
+
+set(GLH_FIND_REQUIRED TRUE)
+set(GLH_FIND_QUIETLY TRUE)
+
+if (STANDALONE)
+ include(FindGLH)
+else (STANDALONE)
+ use_prebuilt_binary(glh_linear)
+endif (STANDALONE)
diff --git a/indra/cmake/LLRender.cmake b/indra/cmake/LLRender.cmake
index c47e8878e9..8427928151 100644
--- a/indra/cmake/LLRender.cmake
+++ b/indra/cmake/LLRender.cmake
@@ -1,9 +1,11 @@
# -*- cmake -*-
include(FreeType)
+include(GLH)
set(LLRENDER_INCLUDE_DIRS
${LIBS_OPEN_DIR}/llrender
+ ${GLH_INCLUDE_DIR}
)
if (SERVER AND LINUX)
diff --git a/indra/cmake/LLSharedLibs.cmake b/indra/cmake/LLSharedLibs.cmake
index e29076c738..14dd67f32f 100644
--- a/indra/cmake/LLSharedLibs.cmake
+++ b/indra/cmake/LLSharedLibs.cmake
@@ -38,18 +38,17 @@ endmacro(ll_deploy_sharedlibs_command)
# ll_stage_sharedlib
# Performs config and adds a copy command for a sharedlib target.
macro(ll_stage_sharedlib DSO_TARGET)
- if(SHARED_LIB_STAGING_DIR)
- # target gets written to the DLL staging directory.
- # Also this directory is shared with RunBuildTest.cmake, y'know, for the tests.
- set_target_properties(${DSO_TARGET} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${SHARED_LIB_STAGING_DIR})
- if(NOT WINDOWS)
- get_target_property(DSO_PATH ${DSO_TARGET} LOCATION)
- get_filename_component(DSO_FILE ${DSO_PATH} NAME)
- if(DARWIN)
- set(SHARED_LIB_STAGING_DIR_CONFIG ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/Resources)
- else(DARWIN)
- set(SHARED_LIB_STAGING_DIR_CONFIG ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR})
- endif(DARWIN)
+ # target gets written to the DLL staging directory.
+ # Also this directory is shared with RunBuildTest.cmake, y'know, for the tests.
+ set_target_properties(${DSO_TARGET} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${SHARED_LIB_STAGING_DIR})
+ if(NOT WINDOWS)
+ get_target_property(DSO_PATH ${DSO_TARGET} LOCATION)
+ get_filename_component(DSO_FILE ${DSO_PATH} NAME)
+ if(DARWIN)
+ set(SHARED_LIB_STAGING_DIR_CONFIG ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/Resources)
+ else(DARWIN)
+ set(SHARED_LIB_STAGING_DIR_CONFIG ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR})
+ endif(DARWIN)
# *TODO - maybe make this a symbolic link? -brad
add_custom_command(
@@ -63,7 +62,6 @@ macro(ll_stage_sharedlib DSO_TARGET)
COMMENT "Copying llcommon to the staging folder."
)
endif(NOT WINDOWS)
- endif(SHARED_LIB_STAGING_DIR)
if (DARWIN)
set_target_properties(${DSO_TARGET} PROPERTIES
diff --git a/indra/cmake/LLTestCommand.cmake b/indra/cmake/LLTestCommand.cmake
index b5a0580a90..f75c23a5de 100644
--- a/indra/cmake/LLTestCommand.cmake
+++ b/indra/cmake/LLTestCommand.cmake
@@ -9,6 +9,9 @@ MACRO(LL_TEST_COMMAND OUTVAR LD_LIBRARY_PATH)
FOREACH(dir ${LD_LIBRARY_PATH})
LIST(APPEND value "-l${dir}")
ENDFOREACH(dir)
+ # Enough different tests want to be able to find CMake's PYTHON_EXECUTABLE
+ # that we should just pop it into the environment for everybody.
+ LIST(APPEND value "-DPYTHON=${PYTHON_EXECUTABLE}")
LIST(APPEND value ${ARGN})
SET(${OUTVAR} ${value})
##IF(LL_TEST_VERBOSE)
diff --git a/indra/cmake/Linking.cmake b/indra/cmake/Linking.cmake
index 07db6ab257..c5f9e2c579 100644
--- a/indra/cmake/Linking.cmake
+++ b/indra/cmake/Linking.cmake
@@ -2,22 +2,19 @@
include(Variables)
-
-if (NOT STANDALONE)
- set(ARCH_PREBUILT_DIRS ${AUTOBUILD_INSTALL_DIR}/lib)
- set(ARCH_PREBUILT_DIRS_RELEASE ${AUTOBUILD_INSTALL_DIR}/lib/release)
- set(ARCH_PREBUILT_DIRS_DEBUG ${AUTOBUILD_INSTALL_DIR}/lib/debug)
- if (WINDOWS)
- set(SHARED_LIB_STAGING_DIR ${CMAKE_BINARY_DIR}/sharedlibs)
- set(EXE_STAGING_DIR ${CMAKE_BINARY_DIR}/sharedlibs)
- elseif (LINUX)
- set(SHARED_LIB_STAGING_DIR ${CMAKE_BINARY_DIR}/sharedlibs/lib)
- set(EXE_STAGING_DIR ${CMAKE_BINARY_DIR}/sharedlibs/bin)
- elseif (DARWIN)
- set(SHARED_LIB_STAGING_DIR ${CMAKE_BINARY_DIR}/sharedlibs)
- set(EXE_STAGING_DIR "${CMAKE_BINARY_DIR}/sharedlibs/\$(CONFIGURATION)")
- endif (WINDOWS)
-endif (NOT STANDALONE)
+set(ARCH_PREBUILT_DIRS ${AUTOBUILD_INSTALL_DIR}/lib)
+set(ARCH_PREBUILT_DIRS_RELEASE ${AUTOBUILD_INSTALL_DIR}/lib/release)
+set(ARCH_PREBUILT_DIRS_DEBUG ${AUTOBUILD_INSTALL_DIR}/lib/debug)
+if (WINDOWS)
+ set(SHARED_LIB_STAGING_DIR ${CMAKE_BINARY_DIR}/sharedlibs)
+ set(EXE_STAGING_DIR ${CMAKE_BINARY_DIR}/sharedlibs)
+elseif (LINUX)
+ set(SHARED_LIB_STAGING_DIR ${CMAKE_BINARY_DIR}/sharedlibs/lib)
+ set(EXE_STAGING_DIR ${CMAKE_BINARY_DIR}/sharedlibs/bin)
+elseif (DARWIN)
+ set(SHARED_LIB_STAGING_DIR ${CMAKE_BINARY_DIR}/sharedlibs)
+ set(EXE_STAGING_DIR "${CMAKE_BINARY_DIR}/sharedlibs/\$(CONFIGURATION)")
+endif (WINDOWS)
# Autobuild packages must provide 'release' versions of libraries, but may provide versions for
# specific build types. AUTOBUILD_LIBS_INSTALL_DIRS lists first the build type directory and then
diff --git a/indra/cmake/OpenSSL.cmake b/indra/cmake/OpenSSL.cmake
index 5982ee9a49..2704912eb5 100644
--- a/indra/cmake/OpenSSL.cmake
+++ b/indra/cmake/OpenSSL.cmake
@@ -11,7 +11,7 @@ else (STANDALONE)
if (WINDOWS)
set(OPENSSL_LIBRARIES ssleay32 libeay32)
else (WINDOWS)
- set(OPENSSL_LIBRARIES ssl)
+ set(OPENSSL_LIBRARIES ssl crypto)
endif (WINDOWS)
set(OPENSSL_INCLUDE_DIRS ${LIBS_PREBUILT_DIR}/include)
endif (STANDALONE)
diff --git a/indra/cmake/run_build_test.py b/indra/cmake/run_build_test.py
index ce2d1e0386..a2ef61c8fd 100644
--- a/indra/cmake/run_build_test.py
+++ b/indra/cmake/run_build_test.py
@@ -46,6 +46,7 @@ $/LicenseInfo$
import os
import sys
+import signal
import subprocess
def main(command, libpath=[], vars={}):
@@ -113,6 +114,33 @@ def main(command, libpath=[], vars={}):
sys.stdout.flush()
return subprocess.call(command)
+# swiped from vita, sigh, seems like a Bad Idea to introduce dependency
+def translate_rc(rc):
+ """
+ Accept an rc encoded as for subprocess.Popen.returncode:
+ None means still running
+ int >= 0 means terminated voluntarily with specified rc
+ int < 0 means terminated by signal (-rc)
+
+ Return a string explaining the outcome. In case of a signal, try to
+ name the corresponding symbol from the 'signal' module.
+ """
+ if rc is None:
+ return "still running"
+
+ if rc >= 0:
+ return "terminated with rc %s" % rc
+
+ # Negative rc means the child was terminated by signal -rc.
+ rc = -rc
+ for attr in dir(signal):
+ if attr.startswith('SIG') and getattr(signal, attr) == rc:
+ strc = attr
+ break
+ else:
+ strc = str(rc)
+ return "terminated by signal %s" % strc
+
if __name__ == "__main__":
from optparse import OptionParser
parser = OptionParser(usage="usage: %prog [options] command args...")
@@ -140,5 +168,5 @@ if __name__ == "__main__":
vars=dict([(pair.split('=', 1) + [""])[:2] for pair in opts.vars]))
if rc not in (None, 0):
print >>sys.stderr, "Failure running: %s" % " ".join(args)
- print >>sys.stderr, "Error: %s" % rc
+ print >>sys.stderr, "Error %s: %s" % (rc, translate_rc(rc))
sys.exit((rc < 0) and 255 or rc)
diff --git a/indra/integration_tests/llui_libtest/CMakeLists.txt b/indra/integration_tests/llui_libtest/CMakeLists.txt
index df47167154..633ad84159 100644
--- a/indra/integration_tests/llui_libtest/CMakeLists.txt
+++ b/indra/integration_tests/llui_libtest/CMakeLists.txt
@@ -18,7 +18,6 @@ include(LLWindow)
include(LLUI)
include(LLVFS) # ugh, needed for LLDir
include(LLXML)
-include(LLXUIXML)
include(Linking)
# include(Tut)
@@ -32,7 +31,6 @@ include_directories(
${LLVFS_INCLUDE_DIRS}
${LLWINDOW_INCLUDE_DIRS}
${LLXML_INCLUDE_DIRS}
- ${LLXUIXML_INCLUDE_DIRS}
)
set(llui_libtest_SOURCE_FILES
@@ -71,6 +69,7 @@ endif (DARWIN)
# Sort by high-level to low-level
target_link_libraries(llui_libtest
llui
+ llinventory
llmessage
${LLRENDER_LIBRARIES}
${LLIMAGE_LIBRARIES}
diff --git a/indra/lib/python/indra/util/llmanifest.py b/indra/lib/python/indra/util/llmanifest.py
index 237153b756..a4fb77357c 100644
--- a/indra/lib/python/indra/util/llmanifest.py
+++ b/indra/lib/python/indra/util/llmanifest.py
@@ -42,6 +42,11 @@ import errno
import subprocess
class ManifestError(RuntimeError):
+ """Use an exception more specific than generic Python RuntimeError"""
+ pass
+
+class MissingError(ManifestError):
+ """You specified a file that doesn't exist"""
pass
def path_ancestors(path):
@@ -604,16 +609,12 @@ class LLManifest(object):
def check_file_exists(self, path):
if not os.path.exists(path) and not os.path.islink(path):
- raise ManifestError("Path %s doesn't exist" % (os.path.abspath(path),))
+ raise MissingError("Path %s doesn't exist" % (os.path.abspath(path),))
wildcard_pattern = re.compile(r'\*')
def expand_globs(self, src, dst):
src_list = glob.glob(src)
- # Assume that if caller specifies a wildcard, s/he wants it to match
- # at least one file...
- if not src_list:
- raise ManifestError("Path %s doesn't exist" % (os.path.abspath(src),))
src_re, d_template = self.wildcard_regex(src.replace('\\', '/'),
dst.replace('\\', '/'))
for s in src_list:
@@ -646,13 +647,23 @@ class LLManifest(object):
else:
count += self.process_file(src, dst)
return count
- try:
- count = try_path(os.path.join(self.get_src_prefix(), src))
- except ManifestError:
+
+ for pfx in self.get_src_prefix(), self.get_artwork_prefix(), self.get_build_prefix():
try:
- count = try_path(os.path.join(self.get_artwork_prefix(), src))
- except ManifestError:
- count = try_path(os.path.join(self.get_build_prefix(), src))
+ count = try_path(os.path.join(pfx, src))
+ except MissingError:
+ # If src isn't a wildcard, and if that file doesn't exist in
+ # this pfx, try next pfx.
+ count = 0
+ continue
+
+ # Here try_path() didn't raise MissingError. Did it process any files?
+ if count:
+ break
+ # Even though try_path() didn't raise MissingError, it returned 0
+ # files. src is probably a wildcard meant for some other pfx. Loop
+ # back to try the next.
+
print "%d files" % count
def do(self, *actions):
diff --git a/indra/linux_crash_logger/CMakeLists.txt b/indra/linux_crash_logger/CMakeLists.txt
index ab62a0d0af..98ebdc7487 100644
--- a/indra/linux_crash_logger/CMakeLists.txt
+++ b/indra/linux_crash_logger/CMakeLists.txt
@@ -3,6 +3,7 @@
project(linux_crash_logger)
include(00-Common)
+include(GLH)
include(LLCommon)
include(LLCrashLogger)
include(LLMath)
diff --git a/indra/linux_crash_logger/llcrashloggerlinux.cpp b/indra/linux_crash_logger/llcrashloggerlinux.cpp
index 7316717193..62465f9937 100644
--- a/indra/linux_crash_logger/llcrashloggerlinux.cpp
+++ b/indra/linux_crash_logger/llcrashloggerlinux.cpp
@@ -133,6 +133,12 @@ bool LLCrashLoggerLinux::mainLoop()
return true;
}
+bool LLCrashLoggerLinux::cleanup()
+{
+ commonCleanup();
+ return true;
+}
+
void LLCrashLoggerLinux::updateApplication(const std::string& message)
{
LLCrashLogger::updateApplication(message);
diff --git a/indra/linux_crash_logger/llcrashloggerlinux.h b/indra/linux_crash_logger/llcrashloggerlinux.h
index 65d5e4e653..dae6c46651 100644
--- a/indra/linux_crash_logger/llcrashloggerlinux.h
+++ b/indra/linux_crash_logger/llcrashloggerlinux.h
@@ -39,6 +39,7 @@ public:
virtual bool mainLoop();
virtual void updateApplication(const std::string& = LLStringUtil::null);
virtual void gatherPlatformSpecificFiles();
+ virtual bool cleanup();
};
#endif
diff --git a/indra/linux_updater/CMakeLists.txt b/indra/linux_updater/CMakeLists.txt
index 00a78b2a8f..4377a6333c 100644
--- a/indra/linux_updater/CMakeLists.txt
+++ b/indra/linux_updater/CMakeLists.txt
@@ -10,14 +10,14 @@ include(UI)
include(LLCommon)
include(LLVFS)
include(LLXML)
-include(LLXUIXML)
+include(LLUI)
include(Linking)
include_directories(
${LLCOMMON_INCLUDE_DIRS}
${LLVFS_INCLUDE_DIRS}
${LLXML_INCLUDE_DIRS}
- ${LLXUIXML_INCLUDE_DIRS}
+ ${LLUI_INCLUDE_DIRS}
${CURL_INCLUDE_DIRS}
${CARES_INCLUDE_DIRS}
${OPENSSL_INCLUDE_DIRS}
@@ -42,7 +42,7 @@ target_link_libraries(linux-updater
${CRYPTO_LIBRARIES}
${UI_LIBRARIES}
${LLXML_LIBRARIES}
- ${LLXUIXML_LIBRARIES}
+ ${LLUI_LIBRARIES}
${LLVFS_LIBRARIES}
${LLCOMMON_LIBRARIES}
)
diff --git a/indra/llaudio/llaudioengine.cpp b/indra/llaudio/llaudioengine.cpp
index 5e540ad8c5..5fa28cb902 100644
--- a/indra/llaudio/llaudioengine.cpp
+++ b/indra/llaudio/llaudioengine.cpp
@@ -1264,6 +1264,7 @@ LLAudioSource::LLAudioSource(const LLUUID& id, const LLUUID& owner_id, const F32
mSyncSlave(false),
mQueueSounds(false),
mPlayedOnce(false),
+ mCorrupted(false),
mType(type),
mChannelp(NULL),
mCurrentDatap(NULL),
@@ -1296,16 +1297,25 @@ void LLAudioSource::setChannel(LLAudioChannel *channelp)
void LLAudioSource::update()
{
+ if(mCorrupted)
+ {
+ return ; //no need to update
+ }
+
if (!getCurrentBuffer())
{
if (getCurrentData())
{
// Hack - try and load the sound. Will do this as a callback
// on decode later.
- if (getCurrentData()->load())
+ if (getCurrentData()->load() && getCurrentData()->getBuffer())
{
play(getCurrentData()->getID());
- }
+ }
+ else
+ {
+ mCorrupted = true ;
+ }
}
}
}
@@ -1421,6 +1431,11 @@ bool LLAudioSource::play(const LLUUID &audio_uuid)
bool LLAudioSource::isDone() const
{
+ if(mCorrupted)
+ {
+ return true ;
+ }
+
const F32 MAX_AGE = 60.f;
const F32 MAX_UNPLAYED_AGE = 15.f;
const F32 MAX_MUTED_AGE = 11.f;
@@ -1736,7 +1751,7 @@ LLAudioData::LLAudioData(const LLUUID &uuid) :
}
}
-
+//return false when the audio file is corrupted.
bool LLAudioData::load()
{
// For now, just assume we're going to use one buffer per audiodata.
@@ -1752,7 +1767,7 @@ bool LLAudioData::load()
{
// No free buffers, abort.
llinfos << "Not able to allocate a new audio buffer, aborting." << llendl;
- return false;
+ return true;
}
std::string uuid_str;
diff --git a/indra/llaudio/llaudioengine.h b/indra/llaudio/llaudioengine.h
index 30d2490635..a47ee7ca7c 100644
--- a/indra/llaudio/llaudioengine.h
+++ b/indra/llaudio/llaudioengine.h
@@ -334,6 +334,7 @@ protected:
bool mSyncSlave;
bool mQueueSounds;
bool mPlayedOnce;
+ bool mCorrupted;
S32 mType;
LLVector3d mPositionGlobal;
LLVector3 mVelocity;
diff --git a/indra/llaudio/llaudioengine_fmod.cpp b/indra/llaudio/llaudioengine_fmod.cpp
index 88dfdb9c24..a40de9fa68 100644
--- a/indra/llaudio/llaudioengine_fmod.cpp
+++ b/indra/llaudio/llaudioengine_fmod.cpp
@@ -673,7 +673,7 @@ bool LLAudioBufferFMOD::loadWAV(const std::string& filename)
return false;
}
- if (!LLAPRFile::isExist(filename, LL_APR_RPB))
+ if (!LLAPRFile::isExist(filename, NULL, LL_APR_RPB))
{
// File not found, abort.
return false;
diff --git a/indra/llaudio/llvorbisencode.cpp b/indra/llaudio/llvorbisencode.cpp
index 44eeea0ca4..0e0c80a456 100644
--- a/indra/llaudio/llvorbisencode.cpp
+++ b/indra/llaudio/llvorbisencode.cpp
@@ -82,7 +82,8 @@ S32 check_for_invalid_wav_formats(const std::string& in_fname, std::string& erro
error_msg.clear();
//********************************
- LLAPRFile infile(in_fname, LL_APR_RB);
+ LLAPRFile infile ;
+ infile.open(in_fname,LL_APR_RB);
//********************************
if (!infile.getFileHandle())
{
@@ -232,7 +233,8 @@ S32 encode_vorbis_file(const std::string& in_fname, const std::string& out_fname
S32 data_left = 0;
- LLAPRFile infile(in_fname,LL_APR_RB);
+ LLAPRFile infile ;
+ infile.open(in_fname,LL_APR_RB);
if (!infile.getFileHandle())
{
llwarns << "Couldn't open temporary ogg file for writing: " << in_fname
@@ -240,7 +242,8 @@ S32 encode_vorbis_file(const std::string& in_fname, const std::string& out_fname
return(LLVORBISENC_SOURCE_OPEN_ERR);
}
- LLAPRFile outfile(out_fname, LL_APR_WPB);
+ LLAPRFile outfile ;
+ outfile.open(out_fname,LL_APR_WPB);
if (!outfile.getFileHandle())
{
llwarns << "Couldn't open upload sound file for reading: " << in_fname
diff --git a/indra/llcharacter/llbvhloader.cpp b/indra/llcharacter/llbvhloader.cpp
index c3c7f03247..f3cf950afa 100644
--- a/indra/llcharacter/llbvhloader.cpp
+++ b/indra/llcharacter/llbvhloader.cpp
@@ -219,7 +219,8 @@ ELoadStatus LLBVHLoader::loadTranslationTable(const char *fileName)
//--------------------------------------------------------------------
std::string path = gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS,fileName);
- LLAPRFile infile(path, LL_APR_R);
+ LLAPRFile infile ;
+ infile.open(path, LL_APR_R);
apr_file_t *fp = infile.getFileHandle();
if (!fp)
return E_ST_NO_XLT_FILE;
diff --git a/indra/llcharacter/llkeyframemotionparam.cpp b/indra/llcharacter/llkeyframemotionparam.cpp
index c3d5dec875..82fe8971f5 100644
--- a/indra/llcharacter/llkeyframemotionparam.cpp
+++ b/indra/llcharacter/llkeyframemotionparam.cpp
@@ -351,7 +351,8 @@ BOOL LLKeyframeMotionParam::loadMotions()
// open the file
//-------------------------------------------------------------------------
S32 fileSize = 0;
- LLAPRFile infile(path, LL_APR_R, &fileSize);
+ LLAPRFile infile ;
+ infile.open(path, LL_APR_R, NULL, &fileSize);
apr_file_t* fp = infile.getFileHandle() ;
if (!fp || fileSize == 0)
{
diff --git a/indra/llcharacter/llstatemachine.cpp b/indra/llcharacter/llstatemachine.cpp
index dcc4ff5f0e..e0454131a5 100644
--- a/indra/llcharacter/llstatemachine.cpp
+++ b/indra/llcharacter/llstatemachine.cpp
@@ -204,7 +204,8 @@ LLFSMState* LLStateDiagram::getState(U32 state_id)
BOOL LLStateDiagram::saveDotFile(const std::string& filename)
{
- LLAPRFile outfile(filename, LL_APR_W);
+ LLAPRFile outfile ;
+ outfile.open(filename, LL_APR_W);
apr_file_t* dot_file = outfile.getFileHandle() ;
if (!dot_file)
diff --git a/indra/llcommon/CMakeLists.txt b/indra/llcommon/CMakeLists.txt
index 6f39aba976..dd7b8c6eb8 100644
--- a/indra/llcommon/CMakeLists.txt
+++ b/indra/llcommon/CMakeLists.txt
@@ -31,7 +31,6 @@ set(llcommon_SOURCE_FILES
llallocator_heap_profile.cpp
llapp.cpp
llapr.cpp
- llaprpool.cpp
llassettype.cpp
llavatarname.cpp
llbase32.cpp
@@ -62,7 +61,10 @@ set(llcommon_SOURCE_FILES
llformat.cpp
llframetimer.cpp
llheartbeat.cpp
+ llinitparam.cpp
llinstancetracker.cpp
+ llleap.cpp
+ llleaplistener.cpp
llliveappconfig.cpp
lllivefile.cpp
lllog.cpp
@@ -75,14 +77,14 @@ set(llcommon_SOURCE_FILES
llmortician.cpp
lloptioninterface.cpp
llptrto.cpp
- llprocesslauncher.cpp
+ llprocess.cpp
llprocessor.cpp
llqueuedthread.cpp
llrand.cpp
llrefcount.cpp
llrun.cpp
- llscopedvolatileaprpool.h
llsd.cpp
+ llsdparam.cpp
llsdserialize.cpp
llsdserialize_xml.cpp
llsdutil.cpp
@@ -90,6 +92,7 @@ set(llcommon_SOURCE_FILES
llsingleton.cpp
llstat.cpp
llstacktrace.cpp
+ llstreamqueue.cpp
llstreamtools.cpp
llstring.cpp
llstringtable.cpp
@@ -124,7 +127,6 @@ set(llcommon_HEADER_FILES
llavatarname.h
llapp.h
llapr.h
- llaprpool.h
llassettype.h
llassoclist.h
llavatarconstants.h
@@ -176,9 +178,12 @@ set(llcommon_HEADER_FILES
llheartbeat.h
llhttpstatuscodes.h
llindexedqueue.h
+ llinitparam.h
llinstancetracker.h
llkeythrottle.h
lllazy.h
+ llleap.h
+ llleaplistener.h
lllistenerwrapper.h
lllinkedqueue.h
llliveappconfig.h
@@ -199,7 +204,7 @@ set(llcommon_HEADER_FILES
llpointer.h
llpreprocessor.h
llpriqueuemap.h
- llprocesslauncher.h
+ llprocess.h
llprocessor.h
llptrskiplist.h
llptrskipmap.h
@@ -207,10 +212,12 @@ set(llcommon_HEADER_FILES
llqueuedthread.h
llrand.h
llrefcount.h
+ llregistry.h
llrun.h
llrefcount.h
llsafehandle.h
llsd.h
+ llsdparam.h
llsdserialize.h
llsdserialize_xml.h
llsdutil.h
@@ -219,11 +226,13 @@ set(llcommon_HEADER_FILES
llsingleton.h
llskiplist.h
llskipmap.h
+ llsortedvector.h
llstack.h
llstacktrace.h
llstat.h
llstatenums.h
llstl.h
+ llstreamqueue.h
llstreamtools.h
llstrider.h
llstring.h
@@ -233,6 +242,7 @@ set(llcommon_HEADER_FILES
llthreadsafequeue.h
lltimer.h
lltreeiterators.h
+ lltypeinfolookup.h
lluri.h
lluuid.h
lluuidhashmap.h
@@ -320,8 +330,7 @@ if (LL_TESTS)
LL_ADD_INTEGRATION_TEST(lllazy "" "${test_libs}")
LL_ADD_INTEGRATION_TEST(llprocessor "" "${test_libs}")
LL_ADD_INTEGRATION_TEST(llrand "" "${test_libs}")
- LL_ADD_INTEGRATION_TEST(llsdserialize "" "${test_libs}"
- "${PYTHON_EXECUTABLE}" "${CMAKE_CURRENT_SOURCE_DIR}/tests/setpython.py")
+ LL_ADD_INTEGRATION_TEST(llsdserialize "" "${test_libs}")
LL_ADD_INTEGRATION_TEST(llsingleton "" "${test_libs}")
LL_ADD_INTEGRATION_TEST(llstring "" "${test_libs}")
LL_ADD_INTEGRATION_TEST(lltreeiterators "" "${test_libs}")
@@ -329,6 +338,9 @@ if (LL_TESTS)
LL_ADD_INTEGRATION_TEST(reflection "" "${test_libs}")
LL_ADD_INTEGRATION_TEST(stringize "" "${test_libs}")
LL_ADD_INTEGRATION_TEST(lleventdispatcher "" "${test_libs}")
+ LL_ADD_INTEGRATION_TEST(llprocess "" "${test_libs}")
+ LL_ADD_INTEGRATION_TEST(llleap "" "${test_libs}")
+ LL_ADD_INTEGRATION_TEST(llstreamqueue "" "${test_libs}")
# *TODO - reenable these once tcmalloc libs no longer break the build.
#ADD_BUILD_TEST(llallocator llcommon)
diff --git a/indra/llcommon/llapp.cpp b/indra/llcommon/llapp.cpp
index a8b7106078..ed192a9975 100644
--- a/indra/llcommon/llapp.cpp
+++ b/indra/llcommon/llapp.cpp
@@ -137,6 +137,10 @@ void LLApp::commonCtor()
mOptions.append(sd);
}
+ // Make sure we clean up APR when we exit
+ // Don't need to do this if we're cleaning up APR in the destructor
+ //atexit(ll_cleanup_apr);
+
// Set the application to this instance.
sApplication = this;
diff --git a/indra/llcommon/llapr.cpp b/indra/llcommon/llapr.cpp
index 1e4a51102e..d1c44c9403 100644
--- a/indra/llcommon/llapr.cpp
+++ b/indra/llcommon/llapr.cpp
@@ -29,8 +29,212 @@
#include "linden_common.h"
#include "llapr.h"
#include "apr_dso.h"
-#include "llscopedvolatileaprpool.h"
+apr_pool_t *gAPRPoolp = NULL; // Global APR memory pool
+LLVolatileAPRPool *LLAPRFile::sAPRFilePoolp = NULL ; //global volatile APR memory pool.
+apr_thread_mutex_t *gLogMutexp = NULL;
+apr_thread_mutex_t *gCallStacksLogMutexp = NULL;
+
+const S32 FULL_VOLATILE_APR_POOL = 1024 ; //number of references to LLVolatileAPRPool
+
+void ll_init_apr()
+{
+ if (!gAPRPoolp)
+ {
+ // Initialize APR and create the global pool
+ apr_initialize();
+ apr_pool_create(&gAPRPoolp, NULL);
+
+ // Initialize the logging mutex
+ apr_thread_mutex_create(&gLogMutexp, APR_THREAD_MUTEX_UNNESTED, gAPRPoolp);
+ apr_thread_mutex_create(&gCallStacksLogMutexp, APR_THREAD_MUTEX_UNNESTED, gAPRPoolp);
+ }
+
+ if(!LLAPRFile::sAPRFilePoolp)
+ {
+ LLAPRFile::sAPRFilePoolp = new LLVolatileAPRPool(FALSE) ;
+ }
+}
+
+
+void ll_cleanup_apr()
+{
+ LL_INFOS("APR") << "Cleaning up APR" << LL_ENDL;
+
+ if (gLogMutexp)
+ {
+ // Clean up the logging mutex
+
+ // All other threads NEED to be done before we clean up APR, so this is okay.
+ apr_thread_mutex_destroy(gLogMutexp);
+ gLogMutexp = NULL;
+ }
+ if (gCallStacksLogMutexp)
+ {
+ // Clean up the logging mutex
+
+ // All other threads NEED to be done before we clean up APR, so this is okay.
+ apr_thread_mutex_destroy(gCallStacksLogMutexp);
+ gCallStacksLogMutexp = NULL;
+ }
+ if (gAPRPoolp)
+ {
+ apr_pool_destroy(gAPRPoolp);
+ gAPRPoolp = NULL;
+ }
+ if (LLAPRFile::sAPRFilePoolp)
+ {
+ delete LLAPRFile::sAPRFilePoolp ;
+ LLAPRFile::sAPRFilePoolp = NULL ;
+ }
+ apr_terminate();
+}
+
+//
+//
+//LLAPRPool
+//
+LLAPRPool::LLAPRPool(apr_pool_t *parent, apr_size_t size, BOOL releasePoolFlag)
+ : mParent(parent),
+ mReleasePoolFlag(releasePoolFlag),
+ mMaxSize(size),
+ mPool(NULL)
+{
+ createAPRPool() ;
+}
+
+LLAPRPool::~LLAPRPool()
+{
+ releaseAPRPool() ;
+}
+
+void LLAPRPool::createAPRPool()
+{
+ if(mPool)
+ {
+ return ;
+ }
+
+ mStatus = apr_pool_create(&mPool, mParent);
+ ll_apr_warn_status(mStatus) ;
+
+ if(mMaxSize > 0) //size is the number of blocks (which is usually 4K), NOT bytes.
+ {
+ apr_allocator_t *allocator = apr_pool_allocator_get(mPool);
+ if (allocator)
+ {
+ apr_allocator_max_free_set(allocator, mMaxSize) ;
+ }
+ }
+}
+
+void LLAPRPool::releaseAPRPool()
+{
+ if(!mPool)
+ {
+ return ;
+ }
+
+ if(!mParent || mReleasePoolFlag)
+ {
+ apr_pool_destroy(mPool) ;
+ mPool = NULL ;
+ }
+}
+
+//virtual
+apr_pool_t* LLAPRPool::getAPRPool()
+{
+ return mPool ;
+}
+
+LLVolatileAPRPool::LLVolatileAPRPool(BOOL is_local, apr_pool_t *parent, apr_size_t size, BOOL releasePoolFlag)
+ : LLAPRPool(parent, size, releasePoolFlag),
+ mNumActiveRef(0),
+ mNumTotalRef(0),
+ mMutexPool(NULL),
+ mMutexp(NULL)
+{
+ //create mutex
+ if(!is_local) //not a local apr_pool, that is: shared by multiple threads.
+ {
+ apr_pool_create(&mMutexPool, NULL); // Create a pool for mutex
+ apr_thread_mutex_create(&mMutexp, APR_THREAD_MUTEX_UNNESTED, mMutexPool);
+ }
+}
+
+LLVolatileAPRPool::~LLVolatileAPRPool()
+{
+ //delete mutex
+ if(mMutexp)
+ {
+ apr_thread_mutex_destroy(mMutexp);
+ apr_pool_destroy(mMutexPool);
+ }
+}
+
+//
+//define this virtual function to avoid any mistakenly calling LLAPRPool::getAPRPool().
+//
+//virtual
+apr_pool_t* LLVolatileAPRPool::getAPRPool()
+{
+ return LLVolatileAPRPool::getVolatileAPRPool() ;
+}
+
+apr_pool_t* LLVolatileAPRPool::getVolatileAPRPool()
+{
+ LLScopedLock lock(mMutexp) ;
+
+ mNumTotalRef++ ;
+ mNumActiveRef++ ;
+
+ if(!mPool)
+ {
+ createAPRPool() ;
+ }
+
+ return mPool ;
+}
+
+void LLVolatileAPRPool::clearVolatileAPRPool()
+{
+ LLScopedLock lock(mMutexp) ;
+
+ if(mNumActiveRef > 0)
+ {
+ mNumActiveRef--;
+ if(mNumActiveRef < 1)
+ {
+ if(isFull())
+ {
+ mNumTotalRef = 0 ;
+
+ //destroy the apr_pool.
+ releaseAPRPool() ;
+ }
+ else
+ {
+ //This does not actually free the memory,
+ //it just allows the pool to re-use this memory for the next allocation.
+ apr_pool_clear(mPool) ;
+ }
+ }
+ }
+ else
+ {
+ llassert_always(mNumActiveRef > 0) ;
+ }
+
+ //paranoia check if the pool is jammed.
+ //will remove the check before going to release.
+ llassert_always(mNumTotalRef < (FULL_VOLATILE_APR_POOL << 2)) ;
+}
+
+BOOL LLVolatileAPRPool::isFull()
+{
+ return mNumTotalRef > FULL_VOLATILE_APR_POOL ;
+}
//---------------------------------------------------------------------
//
// LLScopedLock
@@ -109,17 +313,15 @@ void ll_apr_assert_status(apr_status_t status, apr_dso_handle_t *handle)
//
LLAPRFile::LLAPRFile()
: mFile(NULL),
- mVolatileFilePoolp(NULL),
- mRegularFilePoolp(NULL)
+ mCurrentFilePoolp(NULL)
{
}
-LLAPRFile::LLAPRFile(std::string const& filename, apr_int32_t flags, S32* sizep, access_t access_type)
+LLAPRFile::LLAPRFile(const std::string& filename, apr_int32_t flags, LLVolatileAPRPool* pool)
: mFile(NULL),
- mVolatileFilePoolp(NULL),
- mRegularFilePoolp(NULL)
+ mCurrentFilePoolp(NULL)
{
- open(filename, flags, access_type, sizep);
+ open(filename, flags, pool);
}
LLAPRFile::~LLAPRFile()
@@ -136,58 +338,36 @@ apr_status_t LLAPRFile::close()
mFile = NULL ;
}
- if (mVolatileFilePoolp)
+ if(mCurrentFilePoolp)
{
- mVolatileFilePoolp->clearVolatileAPRPool() ;
- mVolatileFilePoolp = NULL ;
- }
-
- if (mRegularFilePoolp)
- {
- delete mRegularFilePoolp;
- mRegularFilePoolp = NULL;
+ mCurrentFilePoolp->clearVolatileAPRPool() ;
+ mCurrentFilePoolp = NULL ;
}
return ret ;
}
-apr_status_t LLAPRFile::open(std::string const& filename, apr_int32_t flags, access_t access_type, S32* sizep)
+apr_status_t LLAPRFile::open(const std::string& filename, apr_int32_t flags, LLVolatileAPRPool* pool, S32* sizep)
{
- llassert_always(!mFile);
- llassert_always(!mVolatileFilePoolp && !mRegularFilePoolp);
+ apr_status_t s ;
- apr_status_t status;
- {
- apr_pool_t* apr_file_open_pool; // The use of apr_pool_t is OK here.
- // This is a temporary variable for a pool that is passed directly to apr_file_open below.
- if (access_type == short_lived)
- {
- // Use a "volatile" thread-local pool.
- mVolatileFilePoolp = &LLThreadLocalData::tldata().mVolatileAPRPool;
- // Access the pool and increment its reference count.
- // The reference count of LLVolatileAPRPool objects will be decremented
- // again in LLAPRFile::close by calling mVolatileFilePoolp->clearVolatileAPRPool().
- apr_file_open_pool = mVolatileFilePoolp->getVolatileAPRPool();
- }
- else
- {
- mRegularFilePoolp = new LLAPRPool(LLThreadLocalData::tldata().mRootPool);
- apr_file_open_pool = (*mRegularFilePoolp)();
- }
- status = apr_file_open(&mFile, filename.c_str(), flags, APR_OS_DEFAULT, apr_file_open_pool);
- }
- if (status != APR_SUCCESS || !mFile)
+ //check if already open some file
+ llassert_always(!mFile) ;
+ llassert_always(!mCurrentFilePoolp) ;
+
+ apr_pool_t* apr_pool = pool ? pool->getVolatileAPRPool() : NULL ;
+ s = apr_file_open(&mFile, filename.c_str(), flags, APR_OS_DEFAULT, getAPRFilePool(apr_pool));
+
+ if (s != APR_SUCCESS || !mFile)
{
mFile = NULL ;
- close() ;
+
if (sizep)
{
*sizep = 0;
}
- return status;
}
-
- if (sizep)
+ else if (sizep)
{
S32 file_size = 0;
apr_off_t offset = 0;
@@ -201,7 +381,49 @@ apr_status_t LLAPRFile::open(std::string const& filename, apr_int32_t flags, acc
*sizep = file_size;
}
- return status;
+ if(!mCurrentFilePoolp)
+ {
+ mCurrentFilePoolp = pool ;
+
+ if(!mFile)
+ {
+ close() ;
+ }
+ }
+
+ return s ;
+}
+
+//use gAPRPoolp.
+apr_status_t LLAPRFile::open(const std::string& filename, apr_int32_t flags, BOOL use_global_pool)
+{
+ apr_status_t s;
+
+ //check if already open some file
+ llassert_always(!mFile) ;
+ llassert_always(!mCurrentFilePoolp) ;
+ llassert_always(use_global_pool) ; //be aware of using gAPRPoolp.
+
+ s = apr_file_open(&mFile, filename.c_str(), flags, APR_OS_DEFAULT, gAPRPoolp);
+ if (s != APR_SUCCESS || !mFile)
+ {
+ mFile = NULL ;
+ close() ;
+ return s;
+ }
+
+ return s;
+}
+
+apr_pool_t* LLAPRFile::getAPRFilePool(apr_pool_t* pool)
+{
+ if(!pool)
+ {
+ mCurrentFilePoolp = sAPRFilePoolp ;
+ return mCurrentFilePoolp->getVolatileAPRPool() ;
+ }
+
+ return pool ;
}
// File I/O
@@ -260,6 +482,45 @@ S32 LLAPRFile::seek(apr_seek_where_t where, S32 offset)
//
//static
+apr_status_t LLAPRFile::close(apr_file_t* file_handle, LLVolatileAPRPool* pool)
+{
+ apr_status_t ret = APR_SUCCESS ;
+ if(file_handle)
+ {
+ ret = apr_file_close(file_handle);
+ file_handle = NULL ;
+ }
+
+ if(pool)
+ {
+ pool->clearVolatileAPRPool() ;
+ }
+
+ return ret ;
+}
+
+//static
+apr_file_t* LLAPRFile::open(const std::string& filename, LLVolatileAPRPool* pool, apr_int32_t flags)
+{
+ apr_status_t s;
+ apr_file_t* file_handle ;
+
+ pool = pool ? pool : LLAPRFile::sAPRFilePoolp ;
+
+ s = apr_file_open(&file_handle, filename.c_str(), flags, APR_OS_DEFAULT, pool->getVolatileAPRPool());
+ if (s != APR_SUCCESS || !file_handle)
+ {
+ ll_apr_warn_status(s);
+ LL_WARNS("APR") << " Attempting to open filename: " << filename << LL_ENDL;
+ file_handle = NULL ;
+ close(file_handle, pool) ;
+ return NULL;
+ }
+
+ return file_handle ;
+}
+
+//static
S32 LLAPRFile::seek(apr_file_t* file_handle, apr_seek_where_t where, S32 offset)
{
if(!file_handle)
@@ -292,15 +553,13 @@ S32 LLAPRFile::seek(apr_file_t* file_handle, apr_seek_where_t where, S32 offset)
}
//static
-S32 LLAPRFile::readEx(const std::string& filename, void *buf, S32 offset, S32 nbytes)
+S32 LLAPRFile::readEx(const std::string& filename, void *buf, S32 offset, S32 nbytes, LLVolatileAPRPool* pool)
{
- apr_file_t* file_handle;
- LLScopedVolatileAPRPool pool;
- apr_status_t s = apr_file_open(&file_handle, filename.c_str(), APR_READ|APR_BINARY, APR_OS_DEFAULT, pool);
- if (s != APR_SUCCESS || !file_handle)
+ //*****************************************
+ apr_file_t* file_handle = open(filename, pool, APR_READ|APR_BINARY);
+ //*****************************************
+ if (!file_handle)
{
- ll_apr_warn_status(s);
- LL_WARNS("APR") << " while attempting to open file \"" << filename << '"' << LL_ENDL;
return 0;
}
@@ -330,13 +589,14 @@ S32 LLAPRFile::readEx(const std::string& filename, void *buf, S32 offset, S32 nb
}
}
- apr_file_close(file_handle);
-
+ //*****************************************
+ close(file_handle, pool) ;
+ //*****************************************
return (S32)bytes_read;
}
//static
-S32 LLAPRFile::writeEx(const std::string& filename, void *buf, S32 offset, S32 nbytes)
+S32 LLAPRFile::writeEx(const std::string& filename, void *buf, S32 offset, S32 nbytes, LLVolatileAPRPool* pool)
{
apr_int32_t flags = APR_CREATE|APR_WRITE|APR_BINARY;
if (offset < 0)
@@ -345,13 +605,11 @@ S32 LLAPRFile::writeEx(const std::string& filename, void *buf, S32 offset, S32 n
offset = 0;
}
- apr_file_t* file_handle;
- LLScopedVolatileAPRPool pool;
- apr_status_t s = apr_file_open(&file_handle, filename.c_str(), flags, APR_OS_DEFAULT, pool);
- if (s != APR_SUCCESS || !file_handle)
+ //*****************************************
+ apr_file_t* file_handle = open(filename, pool, flags);
+ //*****************************************
+ if (!file_handle)
{
- ll_apr_warn_status(s);
- LL_WARNS("APR") << " while attempting to open file \"" << filename << '"' << LL_ENDL;
return 0;
}
@@ -381,18 +639,21 @@ S32 LLAPRFile::writeEx(const std::string& filename, void *buf, S32 offset, S32 n
}
}
- apr_file_close(file_handle);
+ //*****************************************
+ LLAPRFile::close(file_handle, pool);
+ //*****************************************
return (S32)bytes_written;
}
//static
-bool LLAPRFile::remove(const std::string& filename)
+bool LLAPRFile::remove(const std::string& filename, LLVolatileAPRPool* pool)
{
apr_status_t s;
- LLScopedVolatileAPRPool pool;
- s = apr_file_remove(filename.c_str(), pool);
+ pool = pool ? pool : LLAPRFile::sAPRFilePoolp ;
+ s = apr_file_remove(filename.c_str(), pool->getVolatileAPRPool());
+ pool->clearVolatileAPRPool() ;
if (s != APR_SUCCESS)
{
@@ -404,12 +665,13 @@ bool LLAPRFile::remove(const std::string& filename)
}
//static
-bool LLAPRFile::rename(const std::string& filename, const std::string& newname)
+bool LLAPRFile::rename(const std::string& filename, const std::string& newname, LLVolatileAPRPool* pool)
{
apr_status_t s;
- LLScopedVolatileAPRPool pool;
- s = apr_file_rename(filename.c_str(), newname.c_str(), pool);
+ pool = pool ? pool : LLAPRFile::sAPRFilePoolp ;
+ s = apr_file_rename(filename.c_str(), newname.c_str(), pool->getVolatileAPRPool());
+ pool->clearVolatileAPRPool() ;
if (s != APR_SUCCESS)
{
@@ -421,44 +683,49 @@ bool LLAPRFile::rename(const std::string& filename, const std::string& newname)
}
//static
-bool LLAPRFile::isExist(const std::string& filename, apr_int32_t flags)
+bool LLAPRFile::isExist(const std::string& filename, LLVolatileAPRPool* pool, apr_int32_t flags)
{
- apr_file_t* file_handle;
+ apr_file_t* apr_file;
apr_status_t s;
- LLScopedVolatileAPRPool pool;
- s = apr_file_open(&file_handle, filename.c_str(), flags, APR_OS_DEFAULT, pool);
+ pool = pool ? pool : LLAPRFile::sAPRFilePoolp ;
+ s = apr_file_open(&apr_file, filename.c_str(), flags, APR_OS_DEFAULT, pool->getVolatileAPRPool());
- if (s != APR_SUCCESS || !file_handle)
+ if (s != APR_SUCCESS || !apr_file)
{
+ pool->clearVolatileAPRPool() ;
return false;
}
else
{
- apr_file_close(file_handle);
+ apr_file_close(apr_file) ;
+ pool->clearVolatileAPRPool() ;
return true;
}
}
//static
-S32 LLAPRFile::size(const std::string& filename)
+S32 LLAPRFile::size(const std::string& filename, LLVolatileAPRPool* pool)
{
- apr_file_t* file_handle;
+ apr_file_t* apr_file;
apr_finfo_t info;
apr_status_t s;
- LLScopedVolatileAPRPool pool;
- s = apr_file_open(&file_handle, filename.c_str(), APR_READ, APR_OS_DEFAULT, pool);
+ pool = pool ? pool : LLAPRFile::sAPRFilePoolp ;
+ s = apr_file_open(&apr_file, filename.c_str(), APR_READ, APR_OS_DEFAULT, pool->getVolatileAPRPool());
- if (s != APR_SUCCESS || !file_handle)
+ if (s != APR_SUCCESS || !apr_file)
{
+ pool->clearVolatileAPRPool() ;
+
return 0;
}
else
{
- apr_status_t s = apr_file_info_get(&info, APR_FINFO_SIZE, file_handle);
+ apr_status_t s = apr_file_info_get(&info, APR_FINFO_SIZE, apr_file);
- apr_file_close(file_handle) ;
+ apr_file_close(apr_file) ;
+ pool->clearVolatileAPRPool() ;
if (s == APR_SUCCESS)
{
@@ -472,29 +739,31 @@ S32 LLAPRFile::size(const std::string& filename)
}
//static
-bool LLAPRFile::makeDir(const std::string& dirname)
+bool LLAPRFile::makeDir(const std::string& dirname, LLVolatileAPRPool* pool)
{
apr_status_t s;
- LLScopedVolatileAPRPool pool;
- s = apr_dir_make(dirname.c_str(), APR_FPROT_OS_DEFAULT, pool);
+ pool = pool ? pool : LLAPRFile::sAPRFilePoolp ;
+ s = apr_dir_make(dirname.c_str(), APR_FPROT_OS_DEFAULT, pool->getVolatileAPRPool());
+ pool->clearVolatileAPRPool() ;
if (s != APR_SUCCESS)
{
ll_apr_warn_status(s);
- LL_WARNS("APR") << " while attempting to make directory: " << dirname << LL_ENDL;
+ LL_WARNS("APR") << " Attempting to make directory: " << dirname << LL_ENDL;
return false;
}
return true;
}
//static
-bool LLAPRFile::removeDir(const std::string& dirname)
+bool LLAPRFile::removeDir(const std::string& dirname, LLVolatileAPRPool* pool)
{
apr_status_t s;
- LLScopedVolatileAPRPool pool;
- s = apr_file_remove(dirname.c_str(), pool);
+ pool = pool ? pool : LLAPRFile::sAPRFilePoolp ;
+ s = apr_file_remove(dirname.c_str(), pool->getVolatileAPRPool());
+ pool->clearVolatileAPRPool() ;
if (s != APR_SUCCESS)
{
diff --git a/indra/llcommon/llapr.h b/indra/llcommon/llapr.h
index 3f846f1314..af33ce666f 100644
--- a/indra/llcommon/llapr.h
+++ b/indra/llcommon/llapr.h
@@ -50,9 +50,71 @@
#include "apr_atomic.h"
#include "llstring.h"
+extern LL_COMMON_API apr_thread_mutex_t* gLogMutexp;
+extern apr_thread_mutex_t* gCallStacksLogMutexp;
+
struct apr_dso_handle_t;
-class LLAPRPool;
-class LLVolatileAPRPool;
+
+/**
+ * @brief initialize the common apr constructs -- apr itself, the
+ * global pool, and a mutex.
+ */
+void LL_COMMON_API ll_init_apr();
+
+/**
+ * @brief Cleanup those common apr constructs.
+ */
+void LL_COMMON_API ll_cleanup_apr();
+
+//
+//LL apr_pool
+//manage apr_pool_t, destroy allocated apr_pool in the destruction function.
+//
+class LL_COMMON_API LLAPRPool
+{
+public:
+ LLAPRPool(apr_pool_t *parent = NULL, apr_size_t size = 0, BOOL releasePoolFlag = TRUE) ;
+ virtual ~LLAPRPool() ;
+
+ virtual apr_pool_t* getAPRPool() ;
+ apr_status_t getStatus() {return mStatus ; }
+
+protected:
+ void releaseAPRPool() ;
+ void createAPRPool() ;
+
+protected:
+ apr_pool_t* mPool ; //pointing to an apr_pool
+ apr_pool_t* mParent ; //parent pool
+ apr_size_t mMaxSize ; //max size of mPool, mPool should return memory to system if allocated memory beyond this limit. However it seems not to work.
+ apr_status_t mStatus ; //status when creating the pool
+ BOOL mReleasePoolFlag ; //if set, mPool is destroyed when LLAPRPool is deleted. default value is true.
+};
+
+//
+//volatile LL apr_pool
+//which clears memory automatically.
+//so it can not hold static data or data after memory is cleared
+//
+class LL_COMMON_API LLVolatileAPRPool : public LLAPRPool
+{
+public:
+ LLVolatileAPRPool(BOOL is_local = TRUE, apr_pool_t *parent = NULL, apr_size_t size = 0, BOOL releasePoolFlag = TRUE);
+ virtual ~LLVolatileAPRPool();
+
+ /*virtual*/ apr_pool_t* getAPRPool() ; //define this virtual function to avoid any mistakenly calling LLAPRPool::getAPRPool().
+ apr_pool_t* getVolatileAPRPool() ;
+ void clearVolatileAPRPool() ;
+
+ BOOL isFull() ;
+
+private:
+ S32 mNumActiveRef ; //number of active pointers pointing to the apr_pool.
+ S32 mNumTotalRef ; //number of total pointers pointing to the apr_pool since last creating.
+
+ apr_thread_mutex_t *mMutexp;
+ apr_pool_t *mMutexPool;
+} ;
/**
* @class LLScopedLock
@@ -143,20 +205,15 @@ class LL_COMMON_API LLAPRFile : boost::noncopyable
// make this non copyable since a copy closes the file
private:
apr_file_t* mFile ;
- LLVolatileAPRPool* mVolatileFilePoolp; // (Thread local) APR pool currently in use.
- LLAPRPool* mRegularFilePoolp; // ...or a regular pool.
+ LLVolatileAPRPool *mCurrentFilePoolp ; //currently in use apr_pool, could be one of them: sAPRFilePoolp, or a temp pool.
public:
- enum access_t {
- long_lived, // Use a global pool for long-lived file accesses.
- short_lived // Use a volatile pool for short-lived file accesses.
- };
-
LLAPRFile() ;
- LLAPRFile(std::string const& filename, apr_int32_t flags, S32* sizep = NULL, access_t access_type = short_lived);
+ LLAPRFile(const std::string& filename, apr_int32_t flags, LLVolatileAPRPool* pool = NULL);
~LLAPRFile() ;
-
- apr_status_t open(const std::string& filename, apr_int32_t flags, access_t access_type, S32* sizep = NULL);
+
+ apr_status_t open(const std::string& filename, apr_int32_t flags, LLVolatileAPRPool* pool = NULL, S32* sizep = NULL);
+ apr_status_t open(const std::string& filename, apr_int32_t flags, BOOL use_global_pool); //use gAPRPoolp.
apr_status_t close() ;
// Returns actual offset, -1 if seek fails
@@ -169,24 +226,32 @@ public:
apr_file_t* getFileHandle() {return mFile;}
+private:
+ apr_pool_t* getAPRFilePool(apr_pool_t* pool) ;
+
//
//*******************************************************************************************************************************
//static components
//
+public:
+ static LLVolatileAPRPool *sAPRFilePoolp ; //a global apr_pool for APRFile, which is used only when local pool does not exist.
+
private:
+ static apr_file_t* open(const std::string& filename, LLVolatileAPRPool* pool, apr_int32_t flags);
+ static apr_status_t close(apr_file_t* file, LLVolatileAPRPool* pool) ;
static S32 seek(apr_file_t* file, apr_seek_where_t where, S32 offset);
public:
// returns false if failure:
- static bool remove(const std::string& filename);
- static bool rename(const std::string& filename, const std::string& newname);
- static bool isExist(const std::string& filename, apr_int32_t flags = APR_READ);
- static S32 size(const std::string& filename);
- static bool makeDir(const std::string& dirname);
- static bool removeDir(const std::string& dirname);
+ static bool remove(const std::string& filename, LLVolatileAPRPool* pool = NULL);
+ static bool rename(const std::string& filename, const std::string& newname, LLVolatileAPRPool* pool = NULL);
+ static bool isExist(const std::string& filename, LLVolatileAPRPool* pool = NULL, apr_int32_t flags = APR_READ);
+ static S32 size(const std::string& filename, LLVolatileAPRPool* pool = NULL);
+ static bool makeDir(const std::string& dirname, LLVolatileAPRPool* pool = NULL);
+ static bool removeDir(const std::string& dirname, LLVolatileAPRPool* pool = NULL);
// Returns bytes read/written, 0 if read/write fails:
- static S32 readEx(const std::string& filename, void *buf, S32 offset, S32 nbytes);
- static S32 writeEx(const std::string& filename, void *buf, S32 offset, S32 nbytes); // offset<0 means append
+ static S32 readEx(const std::string& filename, void *buf, S32 offset, S32 nbytes, LLVolatileAPRPool* pool = NULL);
+ static S32 writeEx(const std::string& filename, void *buf, S32 offset, S32 nbytes, LLVolatileAPRPool* pool = NULL); // offset<0 means append
//*******************************************************************************************************************************
};
@@ -202,4 +267,6 @@ bool LL_COMMON_API ll_apr_warn_status(apr_status_t status, apr_dso_handle_t* han
void LL_COMMON_API ll_apr_assert_status(apr_status_t status);
void LL_COMMON_API ll_apr_assert_status(apr_status_t status, apr_dso_handle_t* handle);
+extern "C" LL_COMMON_API apr_pool_t* gAPRPoolp; // Global APR memory pool
+
#endif // LL_LLAPR_H
diff --git a/indra/llcommon/llaprpool.cpp b/indra/llcommon/llaprpool.cpp
deleted file mode 100644
index 6f21b61b65..0000000000
--- a/indra/llcommon/llaprpool.cpp
+++ /dev/null
@@ -1,202 +0,0 @@
-/**
- * @file llaprpool.cpp
- *
- * $LicenseInfo:firstyear=2011&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2011, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- *
- * CHANGELOG
- * and additional copyright holders.
- *
- * 04/04/2010
- * - Initial version, written by Aleric Inglewood @ SL
- *
- * 10/11/2010
- * - Added APR_HAS_THREADS #if's to allow creation and destruction
- * of subpools by threads other than the parent pool owner.
- */
-
-#include "linden_common.h"
-
-#include "llerror.h"
-#include "llaprpool.h"
-#include "llthread.h"
-
-// Create a subpool from parent.
-void LLAPRPool::create(LLAPRPool& parent)
-{
- llassert(!mPool); // Must be non-initialized.
- mParent = &parent;
- if (!mParent) // Using the default parameter?
- {
- // By default use the root pool of the current thread.
- mParent = &LLThreadLocalData::tldata().mRootPool;
- }
- llassert(mParent->mPool); // Parent must be initialized.
-#if APR_HAS_THREADS
- // As per the documentation of APR (ie http://apr.apache.org/docs/apr/1.4/apr__pools_8h.html):
- //
- // Note that most operations on pools are not thread-safe: a single pool should only be
- // accessed by a single thread at any given time. The one exception to this rule is creating
- // a subpool of a given pool: one or more threads can safely create subpools at the same
- // time that another thread accesses the parent pool.
- //
- // In other words, it's safe for any thread to create a (sub)pool, independent of who
- // owns the parent pool.
- mOwner = apr_os_thread_current();
-#else
- mOwner = mParent->mOwner;
- llassert(apr_os_thread_equal(mOwner, apr_os_thread_current()));
-#endif
- apr_status_t const apr_pool_create_status = apr_pool_create(&mPool, mParent->mPool);
- llassert_always(apr_pool_create_status == APR_SUCCESS);
- llassert(mPool); // Initialized.
- apr_pool_cleanup_register(mPool, this, &s_plain_cleanup, &apr_pool_cleanup_null);
-}
-
-// Destroy the (sub)pool, if any.
-void LLAPRPool::destroy(void)
-{
- // Only do anything if we are not already (being) destroyed.
- if (mPool)
- {
-#if !APR_HAS_THREADS
- // If we are a root pool, then every thread may destruct us: in that case
- // we have to assume that no other thread will use this pool concurrently,
- // of course. Otherwise, if we are a subpool, only the thread that owns
- // the parent may destruct us, since that is the pool that is still alive,
- // possibly being used by others and being altered here.
- llassert(!mParent || apr_os_thread_equal(mParent->mOwner, apr_os_thread_current()));
-#endif
- apr_pool_t* pool = mPool; // The use of apr_pool_t is OK here.
- // Temporary store before destroying the pool.
- mPool = NULL; // Mark that we are BEING destructed.
- apr_pool_cleanup_kill(pool, this, &s_plain_cleanup);
- apr_pool_destroy(pool);
- }
-}
-
-bool LLAPRPool::parent_is_being_destructed(void)
-{
- return mParent && (!mParent->mPool || mParent->parent_is_being_destructed());
-}
-
-LLAPRInitialization::LLAPRInitialization(void)
-{
- static bool apr_initialized = false;
-
- if (!apr_initialized)
- {
- apr_initialize();
- }
-
- apr_initialized = true;
-}
-
-bool LLAPRRootPool::sCountInitialized = false;
-apr_uint32_t volatile LLAPRRootPool::sCount;
-
-apr_thread_mutex_t* gLogMutexp;
-apr_thread_mutex_t* gCallStacksLogMutexp;
-
-LLAPRRootPool::LLAPRRootPool(void) : LLAPRInitialization(), LLAPRPool(0)
-{
- // sCountInitialized don't need locking because when we get here there is still only a single thread.
- if (!sCountInitialized)
- {
- // Initialize the logging mutex
- apr_thread_mutex_create(&gLogMutexp, APR_THREAD_MUTEX_UNNESTED, mPool);
- apr_thread_mutex_create(&gCallStacksLogMutexp, APR_THREAD_MUTEX_UNNESTED, mPool);
-
- apr_status_t status = apr_atomic_init(mPool);
- llassert_always(status == APR_SUCCESS);
- apr_atomic_set32(&sCount, 1); // Set to 1 to account for the global root pool.
- sCountInitialized = true;
-
- // Initialize thread-local APR pool support.
- // Because this recursively calls LLAPRRootPool::LLAPRRootPool(void)
- // it must be done last, so that sCount is already initialized.
- LLThreadLocalData::init();
- }
- apr_atomic_inc32(&sCount);
-}
-
-LLAPRRootPool::~LLAPRRootPool()
-{
- if (!apr_atomic_dec32(&sCount))
- {
- // The last pool was destructed. Cleanup remainder of APR.
- LL_INFOS("APR") << "Cleaning up APR" << LL_ENDL;
-
- if (gLogMutexp)
- {
- // Clean up the logging mutex
-
- // All other threads NEED to be done before we clean up APR, so this is okay.
- apr_thread_mutex_destroy(gLogMutexp);
- gLogMutexp = NULL;
- }
- if (gCallStacksLogMutexp)
- {
- // Clean up the logging mutex
-
- // All other threads NEED to be done before we clean up APR, so this is okay.
- apr_thread_mutex_destroy(gCallStacksLogMutexp);
- gCallStacksLogMutexp = NULL;
- }
-
- // Must destroy ALL, and therefore this last LLAPRRootPool, before terminating APR.
- static_cast<LLAPRRootPool*>(this)->destroy();
-
- apr_terminate();
- }
-}
-
-//static
-// Return a global root pool that is independent of LLThreadLocalData.
-// Normally you should NOT use this. Only use for early initialization
-// (before main) and deinitialization (after main).
-LLAPRRootPool& LLAPRRootPool::get(void)
-{
- static LLAPRRootPool global_APRpool(0);
- return global_APRpool;
-}
-
-void LLVolatileAPRPool::clearVolatileAPRPool()
-{
- llassert_always(mNumActiveRef > 0);
- if (--mNumActiveRef == 0)
- {
- if (isOld())
- {
- destroy();
- mNumTotalRef = 0 ;
- }
- else
- {
- // This does not actually free the memory,
- // it just allows the pool to re-use this memory for the next allocation.
- clear();
- }
- }
-
- // Paranoia check if the pool is jammed.
- llassert(mNumTotalRef < (FULL_VOLATILE_APR_POOL << 2)) ;
-}
diff --git a/indra/llcommon/llaprpool.h b/indra/llcommon/llaprpool.h
deleted file mode 100644
index bf4102c584..0000000000
--- a/indra/llcommon/llaprpool.h
+++ /dev/null
@@ -1,256 +0,0 @@
-/**
- * @file llaprpool.h
- * @brief Implementation of LLAPRPool
- *
- * $LicenseInfo:firstyear=2011&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2011, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- *
- * CHANGELOG
- * and additional copyright holders.
- *
- * 04/04/2010
- * - Initial version, written by Aleric Inglewood @ SL
- *
- * 10/11/2010
- * - Added APR_HAS_THREADS #if's to allow creation and destruction
- * of subpools by threads other than the parent pool owner.
- *
- * 05/02/2011
- * - Fixed compilation on windows: Suppress compile warning 4996
- * and include <winsock2.h> before including <ws2tcpip.h>,
- * by Merov Linden @ SL.
- */
-
-#ifndef LL_LLAPRPOOL_H
-#define LL_LLAPRPOOL_H
-
-#ifdef LL_WINDOWS
-#pragma warning(push)
-#pragma warning(disable:4996)
-#include <winsock2.h>
-#include <ws2tcpip.h> // Needed before including apr_portable.h
-#pragma warning(pop)
-#endif
-
-#include "apr_portable.h"
-#include "apr_pools.h"
-#include "llerror.h"
-
-extern void ll_init_apr();
-
-/**
- * @brief A wrapper around the APR memory pool API.
- *
- * Usage of this class should be restricted to passing it to libapr-1 function calls that need it.
- *
- */
-class LL_COMMON_API LLAPRPool
-{
-protected:
- //! Pointer to the underlaying pool. NULL if not initialized.
- apr_pool_t* mPool; // The use of apr_pool_t is OK here.
- // This is the wrapped pointer that it is all about!
- //! Pointer to the parent pool, if any. Only valid when mPool is non-zero.
- LLAPRPool* mParent;
- //! The thread that owns this memory pool. Only valid when mPool is non-zero.
- apr_os_thread_t mOwner;
-
-public:
- /// Construct an uninitialized (destructed) pool.
- LLAPRPool(void) : mPool(NULL) { }
-
- /// Construct a subpool from an existing pool.
- /// This is not a copy-constructor, this class doesn't have one!
- LLAPRPool(LLAPRPool& parent) : mPool(NULL) { create(parent); }
-
- /// Destruct the memory pool (free all of its subpools and allocated memory).
- ~LLAPRPool() { destroy(); }
-
-protected:
- /// Create a pool that is allocated from the Operating System. Only used by LLAPRRootPool.
- LLAPRPool(int) : mPool(NULL), mParent(NULL), mOwner(apr_os_thread_current())
- {
- apr_status_t const apr_pool_create_status = apr_pool_create(&mPool, NULL);
- llassert_always(apr_pool_create_status == APR_SUCCESS);
- llassert(mPool);
- apr_pool_cleanup_register(mPool, this, &s_plain_cleanup, &apr_pool_cleanup_null);
- }
-
-public:
- /// Create a subpool from parent. May only be called for an uninitialized/destroyed pool.
- /// The default parameter causes the root pool of the current thread to be used.
- void create(LLAPRPool& parent = *static_cast<LLAPRPool*>(NULL));
-
- /// Destroy the (sub)pool, if any.
- void destroy(void);
-
- // Use some safebool idiom (http://www.artima.com/cppsource/safebool.html) rather than operator bool.
- typedef LLAPRPool* const LLAPRPool::* const bool_type;
- /// Return true if the pool is initialized.
- operator bool_type() const { return mPool ? &LLAPRPool::mParent : 0; }
-
- /// Painful, but we have to either provide access to this, or wrap
- /// every APR function call that needs an apr pool as argument.
- /// NEVER destroy a pool that is returned by this function!
- apr_pool_t* operator()(void) const // The use of apr_pool_t is OK here.
- // This is the accessor for passing the pool to libapr-1 functions.
- {
- llassert(mPool);
- llassert(apr_os_thread_equal(mOwner, apr_os_thread_current()));
- return mPool;
- }
-
- /// Free all memory without destructing the pool.
- void clear(void)
- {
- llassert(mPool);
- llassert(apr_os_thread_equal(mOwner, apr_os_thread_current()));
- apr_pool_clear(mPool);
- }
-
-// These methods would make this class 'complete' (as wrapper around the libapr
-// pool functions), but we don't use memory pools in the viewer (only when
-// we are forced to pass one to a libapr call), so don't define them in order
-// not to encourage people to use them.
-#if 0
- void* palloc(size_t size)
- {
- llassert(mPool);
- llassert(apr_os_thread_equal(mOwner, apr_os_thread_current()));
- return apr_palloc(mPool, size);
- }
- void* pcalloc(size_t size)
- {
- llassert(mPool);
- llassert(apr_os_thread_equal(mOwner, apr_os_thread_current()));
- return apr_pcalloc(mPool, size);
- }
-#endif
-
-private:
- bool parent_is_being_destructed(void);
- static apr_status_t s_plain_cleanup(void* userdata) { return static_cast<LLAPRPool*>(userdata)->plain_cleanup(); }
-
- apr_status_t plain_cleanup(void)
- {
- if (mPool && // We are not being destructed,
- parent_is_being_destructed()) // but our parent is.
- // This means the pool is being destructed recursively by libapr
- // because one of its parents is being destructed.
- {
- mPool = NULL; // Stop destroy() from destructing the pool again.
- }
- return APR_SUCCESS;
- }
-};
-
-class LLAPRInitialization
-{
-public:
- LLAPRInitialization(void);
-};
-
-/**
- * @brief Root memory pool (allocates memory from the operating system).
- *
- * This class should only be used by LLThreadLocalData
- * (and LLMutexRootPool when APR_HAS_THREADS isn't defined).
- */
-class LL_COMMON_API LLAPRRootPool : public LLAPRInitialization, public LLAPRPool
-{
-private:
- /// Construct a root memory pool. Should only be used by LLThreadLocalData and LLMutexRootPool.
- friend class LLThreadLocalData;
-#if !APR_HAS_THREADS
- friend class LLMutexRootPool;
-#endif
- /// Construct a root memory pool.
- /// Should only be used by LLThreadLocalData.
- LLAPRRootPool(void);
- ~LLAPRRootPool();
-
-private:
- // Keep track of how many root pools exist and when the last one is destructed.
- static bool sCountInitialized;
- static apr_uint32_t volatile sCount;
-
-public:
- // Return a global root pool that is independent of LLThreadLocalData.
- // Normally you should not use this. Only use for early initialization
- // (before main) and deinitialization (after main).
- static LLAPRRootPool& get(void);
-
-#if APR_POOL_DEBUG
- void grab_ownership(void)
- {
- // You need a patched libapr to use this.
- // See http://web.archiveorange.com/archive/v/5XO9y2zoxUOMt6Gmi1OI
- apr_pool_owner_set(mPool);
- }
-#endif
-
-private:
- // Used for constructing the Special Global Root Pool (returned by LLAPRRootPool::get).
- // It is the same as the default constructor but omits to increment sCount. As a result,
- // we must be sure that at least one other LLAPRRootPool is created before termination
- // of the application (which is the case: we create one LLAPRRootPool per thread).
- LLAPRRootPool(int) : LLAPRInitialization(), LLAPRPool(0) { }
-};
-
-/** Volatile memory pool
- *
- * 'Volatile' APR memory pool which normally only clears memory,
- * and does not destroy the pool (the same pool is reused) for
- * greater efficiency. However, as a safe guard the apr pool
- * is destructed every FULL_VOLATILE_APR_POOL uses to allow
- * the system memory to be allocated more efficiently and not
- * get scattered through RAM.
- */
-class LL_COMMON_API LLVolatileAPRPool : protected LLAPRPool
-{
-public:
- LLVolatileAPRPool(void) : mNumActiveRef(0), mNumTotalRef(0) { }
-
- void clearVolatileAPRPool(void);
-
- bool isOld(void) const { return mNumTotalRef > FULL_VOLATILE_APR_POOL; }
- bool isUnused() const { return mNumActiveRef == 0; }
-
-private:
- friend class LLScopedVolatileAPRPool;
- friend class LLAPRFile;
- apr_pool_t* getVolatileAPRPool(void) // The use of apr_pool_t is OK here.
- {
- if (!mPool) create();
- ++mNumActiveRef;
- ++mNumTotalRef;
- return LLAPRPool::operator()();
- }
-
-private:
- S32 mNumActiveRef; // Number of active uses of the pool.
- S32 mNumTotalRef; // Number of total uses of the pool since last creation.
-
- // Maximum number of references to LLVolatileAPRPool until the pool is recreated.
- static S32 const FULL_VOLATILE_APR_POOL = 1024;
-};
-
-#endif // LL_LLAPRPOOL_H
diff --git a/indra/llcommon/llassettype.cpp b/indra/llcommon/llassettype.cpp
index 145dddd543..5e566d6c7c 100644
--- a/indra/llcommon/llassettype.cpp
+++ b/indra/llcommon/llassettype.cpp
@@ -93,7 +93,8 @@ LLAssetDictionary::LLAssetDictionary()
addEntry(LLAssetType::AT_LINK, new AssetEntry("LINK", "link", "sym link", false, false, true));
addEntry(LLAssetType::AT_LINK_FOLDER, new AssetEntry("FOLDER_LINK", "link_f", "sym folder link", false, false, true));
- addEntry(LLAssetType::AT_MESH, new AssetEntry("MESH", "mesh", "mesh", false, false, false));
+ addEntry(LLAssetType::AT_MESH, new AssetEntry("MESH", "mesh", "mesh", false, false, false));
+ addEntry(LLAssetType::AT_WIDGET, new AssetEntry("WIDGET", "widget", "widget", false, false, false));
addEntry(LLAssetType::AT_NONE, new AssetEntry("NONE", "-1", NULL, FALSE, FALSE, FALSE));
};
diff --git a/indra/llcommon/llassettype.h b/indra/llcommon/llassettype.h
index 74ccd00324..d538accbf7 100644
--- a/indra/llcommon/llassettype.h
+++ b/indra/llcommon/llassettype.h
@@ -108,9 +108,13 @@ public:
AT_LINK_FOLDER = 25,
// Inventory folder link
+
+ AT_WIDGET = 40,
+ // UI Widget: this is *not* an inventory asset type, only a viewer side asset (e.g. button, other ui items...)
+
AT_MESH = 49,
- // Mesh data in our proprietary SLM format
-
+ // Mesh data in our proprietary SLM format
+
AT_COUNT = 50,
// +*********************************************************+
diff --git a/indra/llcommon/llcommon.cpp b/indra/llcommon/llcommon.cpp
index b8a7394852..8be9e4f4de 100644
--- a/indra/llcommon/llcommon.cpp
+++ b/indra/llcommon/llcommon.cpp
@@ -31,9 +31,17 @@
#include "llthread.h"
//static
+BOOL LLCommon::sAprInitialized = FALSE;
+
+//static
void LLCommon::initClass()
{
LLMemory::initClass();
+ if (!sAprInitialized)
+ {
+ ll_init_apr();
+ sAprInitialized = TRUE;
+ }
LLTimer::initClass();
LLThreadSafeRefCount::initThreadSafeRefCount();
// LLWorkerThread::initClass();
@@ -47,5 +55,10 @@ void LLCommon::cleanupClass()
// LLWorkerThread::cleanupClass();
LLThreadSafeRefCount::cleanupThreadSafeRefCount();
LLTimer::cleanupClass();
+ if (sAprInitialized)
+ {
+ ll_cleanup_apr();
+ sAprInitialized = FALSE;
+ }
LLMemory::cleanupClass();
}
diff --git a/indra/llcommon/llcommon.h b/indra/llcommon/llcommon.h
index 171590f3d8..ca9cad5d05 100644
--- a/indra/llcommon/llcommon.h
+++ b/indra/llcommon/llcommon.h
@@ -35,6 +35,8 @@ class LL_COMMON_API LLCommon
public:
static void initClass();
static void cleanupClass();
+private:
+ static BOOL sAprInitialized;
};
#endif
diff --git a/indra/llcommon/llerror.cpp b/indra/llcommon/llerror.cpp
index bda9d7c177..7e6eee0f3c 100644
--- a/indra/llcommon/llerror.cpp
+++ b/indra/llcommon/llerror.cpp
@@ -617,6 +617,12 @@ namespace LLError
s.defaultLevel = level;
}
+ ELevel getDefaultLevel()
+ {
+ Settings& s = Settings::get();
+ return s.defaultLevel;
+ }
+
void setFunctionLevel(const std::string& function_name, ELevel level)
{
Globals& g = Globals::get();
@@ -648,9 +654,7 @@ namespace LLError
g.invalidateCallSites();
s.tagLevelMap[tag_name] = level;
}
-}
-namespace {
LLError::ELevel decodeLevel(std::string name)
{
static LevelMap level_names;
@@ -675,7 +679,9 @@ namespace {
return i->second;
}
-
+}
+
+namespace {
void setLevels(LevelMap& map, const LLSD& list, LLError::ELevel level)
{
LLSD::array_const_iterator i, end;
@@ -866,9 +872,6 @@ You get:
*/
-extern apr_thread_mutex_t* gLogMutexp;
-extern apr_thread_mutex_t* gCallStacksLogMutexp;
-
namespace {
bool checkLevelMap(const LevelMap& map, const std::string& key,
LLError::ELevel& level)
diff --git a/indra/llcommon/llerror.h b/indra/llcommon/llerror.h
index 369f2a7a97..b3e604f8e8 100644
--- a/indra/llcommon/llerror.h
+++ b/indra/llcommon/llerror.h
@@ -296,4 +296,5 @@ typedef LLError::NoClassInfo _LL_CLASS_TO_LOG;
Such computation is done iff the message will be logged.
*/
+
#endif // LL_LLERROR_H
diff --git a/indra/llcommon/llerrorcontrol.h b/indra/llcommon/llerrorcontrol.h
index fb75d45e2c..1be49cebc8 100644
--- a/indra/llcommon/llerrorcontrol.h
+++ b/indra/llcommon/llerrorcontrol.h
@@ -75,11 +75,13 @@ namespace LLError
LL_COMMON_API void setPrintLocation(bool);
LL_COMMON_API void setDefaultLevel(LLError::ELevel);
+ LL_COMMON_API ELevel getDefaultLevel();
LL_COMMON_API void setFunctionLevel(const std::string& function_name, LLError::ELevel);
LL_COMMON_API void setClassLevel(const std::string& class_name, LLError::ELevel);
LL_COMMON_API void setFileLevel(const std::string& file_name, LLError::ELevel);
LL_COMMON_API void setTagLevel(const std::string& file_name, LLError::ELevel);
-
+
+ LL_COMMON_API LLError::ELevel decodeLevel(std::string name);
LL_COMMON_API void configure(const LLSD&);
// the LLSD can configure all of the settings
// usually read automatically from the live errorlog.xml file
diff --git a/indra/llcommon/llerrorthread.cpp b/indra/llcommon/llerrorthread.cpp
index 902eaa3b72..950fcd6e83 100644
--- a/indra/llcommon/llerrorthread.cpp
+++ b/indra/llcommon/llerrorthread.cpp
@@ -112,13 +112,8 @@ void LLErrorThread::run()
#if !LL_WINDOWS
U32 last_sig_child_count = 0;
#endif
- while (1)
+ while (! (LLApp::isError() || LLApp::isStopped()))
{
- if (LLApp::isError() || LLApp::isStopped())
- {
- // The application has stopped running, time to take action (maybe)
- break;
- }
#if !LL_WINDOWS
// Check whether or not the main thread had a sig child we haven't handled.
U32 current_sig_child_count = LLApp::getSigChildCount();
diff --git a/indra/llcommon/lleventapi.cpp b/indra/llcommon/lleventapi.cpp
index 4270c8b511..ff5459c1eb 100644
--- a/indra/llcommon/lleventapi.cpp
+++ b/indra/llcommon/lleventapi.cpp
@@ -34,6 +34,7 @@
// std headers
// external library headers
// other Linden headers
+#include "llerror.h"
LLEventAPI::LLEventAPI(const std::string& name, const std::string& desc, const std::string& field):
lbase(name, field),
@@ -45,3 +46,32 @@ LLEventAPI::LLEventAPI(const std::string& name, const std::string& desc, const s
LLEventAPI::~LLEventAPI()
{
}
+
+LLEventAPI::Response::Response(const LLSD& seed, const LLSD& request, const LLSD::String& replyKey):
+ mResp(seed),
+ mReq(request),
+ mKey(replyKey)
+{}
+
+LLEventAPI::Response::~Response()
+{
+ // When you instantiate a stack Response object, if the original
+ // request requested a reply, send it when we leave this block, no
+ // matter how.
+ sendReply(mResp, mReq, mKey);
+}
+
+void LLEventAPI::Response::warn(const std::string& warning)
+{
+ LL_WARNS("LLEventAPI::Response") << warning << LL_ENDL;
+ mResp["warnings"].append(warning);
+}
+
+void LLEventAPI::Response::error(const std::string& error)
+{
+ // Use LL_WARNS rather than LL_ERROR: we don't want the viewer to shut
+ // down altogether.
+ LL_WARNS("LLEventAPI::Response") << error << LL_ENDL;
+
+ mResp["error"] = error;
+}
diff --git a/indra/llcommon/lleventapi.h b/indra/llcommon/lleventapi.h
index d75d521e8e..1a37d780b6 100644
--- a/indra/llcommon/lleventapi.h
+++ b/indra/llcommon/lleventapi.h
@@ -76,6 +76,89 @@ public:
LLEventDispatcher::add(name, desc, callable, required);
}
+ /**
+ * Instantiate a Response object in any LLEventAPI subclass method that
+ * wants to guarantee a reply (if requested) will be sent on exit from the
+ * method. The reply will be sent if request.has(@a replyKey), default
+ * "reply". If specified, the value of request[replyKey] is the name of
+ * the LLEventPump on which to send the reply. Conventionally you might
+ * code something like:
+ *
+ * @code
+ * void MyEventAPI::someMethod(const LLSD& request)
+ * {
+ * // Send a reply event as long as request.has("reply")
+ * Response response(LLSD(), request);
+ * // ...
+ * // will be sent in reply event
+ * response["somekey"] = some_data;
+ * }
+ * @endcode
+ */
+ class LL_COMMON_API Response
+ {
+ public:
+ /**
+ * Instantiating a Response object in an LLEventAPI subclass method
+ * ensures that, if desired, a reply event will be sent.
+ *
+ * @a seed is the initial reply LLSD that will be further decorated before
+ * being sent as the reply
+ *
+ * @a request is the incoming request LLSD; we particularly care about
+ * [replyKey] and ["reqid"]
+ *
+ * @a replyKey [default "reply"] is the string name of the LLEventPump
+ * on which the caller wants a reply. If <tt>(!
+ * request.has(replyKey))</tt>, no reply will be sent.
+ */
+ Response(const LLSD& seed, const LLSD& request, const LLSD::String& replyKey="reply");
+ ~Response();
+
+ /**
+ * @code
+ * if (some condition)
+ * {
+ * response.warn("warnings are logged and collected in [\"warnings\"]");
+ * }
+ * @endcode
+ */
+ void warn(const std::string& warning);
+ /**
+ * @code
+ * if (some condition isn't met)
+ * {
+ * // In a function returning void, you can validly 'return
+ * // expression' if the expression is itself of type void. But
+ * // returning is up to you; response.error() has no effect on
+ * // flow of control.
+ * return response.error("error message, logged and also sent as [\"error\"]");
+ * }
+ * @endcode
+ */
+ void error(const std::string& error);
+
+ /**
+ * set other keys...
+ *
+ * @code
+ * // set any attributes you want to be sent in the reply
+ * response["info"] = some_value;
+ * // ...
+ * response["ok"] = went_well;
+ * @endcode
+ */
+ LLSD& operator[](const LLSD::String& key) { return mResp[key]; }
+
+ /**
+ * set the response to the given data
+ */
+ void setResponse(LLSD const & response){ mResp = response; }
+
+ LLSD mResp, mReq;
+ LLSD::String mKey;
+ };
+
private:
std::string mDesc;
};
diff --git a/indra/llcommon/llevents.cpp b/indra/llcommon/llevents.cpp
index ff03506e84..db1ea4792b 100644
--- a/indra/llcommon/llevents.cpp
+++ b/indra/llcommon/llevents.cpp
@@ -591,6 +591,17 @@ void LLReqID::stamp(LLSD& response) const
bool sendReply(const LLSD& reply, const LLSD& request, const std::string& replyKey)
{
+ // If the original request has no value for replyKey, it's pointless to
+ // construct or send a reply event: on which LLEventPump should we send
+ // it? Allow that to be optional: if the caller wants to require replyKey,
+ // it can so specify when registering the operation method.
+ if (! request.has(replyKey))
+ {
+ return false;
+ }
+
+ // Here the request definitely contains replyKey; reasonable to proceed.
+
// Copy 'reply' to modify it.
LLSD newreply(reply);
// Get the ["reqid"] element from request
diff --git a/indra/llcommon/llfixedbuffer.cpp b/indra/llcommon/llfixedbuffer.cpp
index 4b5cdbe288..d394f179fb 100644
--- a/indra/llcommon/llfixedbuffer.cpp
+++ b/indra/llcommon/llfixedbuffer.cpp
@@ -30,7 +30,8 @@
LLFixedBuffer::LLFixedBuffer(const U32 max_lines)
: LLLineBuffer(),
- mMaxLines(max_lines)
+ mMaxLines(max_lines),
+ mMutex(NULL)
{
mTimer.reset();
}
diff --git a/indra/llcommon/llinitparam.cpp b/indra/llcommon/llinitparam.cpp
new file mode 100644
index 0000000000..db72aa19b9
--- /dev/null
+++ b/indra/llcommon/llinitparam.cpp
@@ -0,0 +1,469 @@
+/**
+ * @file llinitparam.cpp
+ * @brief parameter block abstraction for creating complex objects and
+ * parsing construction parameters from xml and LLSD
+ *
+ * $LicenseInfo:firstyear=2008&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "linden_common.h"
+
+#include "llinitparam.h"
+
+
+namespace LLInitParam
+{
+ //
+ // Param
+ //
+ Param::Param(BaseBlock* enclosing_block)
+ : mIsProvided(false)
+ {
+ const U8* my_addr = reinterpret_cast<const U8*>(this);
+ const U8* block_addr = reinterpret_cast<const U8*>(enclosing_block);
+ mEnclosingBlockOffset = 0x7FFFffff & (U32)(my_addr - block_addr);
+ }
+
+ //
+ // ParamDescriptor
+ //
+ ParamDescriptor::ParamDescriptor(param_handle_t p,
+ merge_func_t merge_func,
+ deserialize_func_t deserialize_func,
+ serialize_func_t serialize_func,
+ validation_func_t validation_func,
+ inspect_func_t inspect_func,
+ S32 min_count,
+ S32 max_count)
+ : mParamHandle(p),
+ mMergeFunc(merge_func),
+ mDeserializeFunc(deserialize_func),
+ mSerializeFunc(serialize_func),
+ mValidationFunc(validation_func),
+ mInspectFunc(inspect_func),
+ mMinCount(min_count),
+ mMaxCount(max_count),
+ mUserData(NULL)
+ {}
+
+ ParamDescriptor::ParamDescriptor()
+ : mParamHandle(0),
+ mMergeFunc(NULL),
+ mDeserializeFunc(NULL),
+ mSerializeFunc(NULL),
+ mValidationFunc(NULL),
+ mInspectFunc(NULL),
+ mMinCount(0),
+ mMaxCount(0),
+ mUserData(NULL)
+ {}
+
+ ParamDescriptor::~ParamDescriptor()
+ {
+ delete mUserData;
+ }
+
+ //
+ // Parser
+ //
+ Parser::~Parser()
+ {}
+
+ void Parser::parserWarning(const std::string& message)
+ {
+ if (mParseSilently) return;
+ llwarns << message << llendl;
+ }
+
+ void Parser::parserError(const std::string& message)
+ {
+ if (mParseSilently) return;
+ llerrs << message << llendl;
+ }
+
+
+ //
+ // BlockDescriptor
+ //
+ void BlockDescriptor::aggregateBlockData(BlockDescriptor& src_block_data)
+ {
+ mNamedParams.insert(src_block_data.mNamedParams.begin(), src_block_data.mNamedParams.end());
+ std::copy(src_block_data.mUnnamedParams.begin(), src_block_data.mUnnamedParams.end(), std::back_inserter(mUnnamedParams));
+ std::copy(src_block_data.mValidationList.begin(), src_block_data.mValidationList.end(), std::back_inserter(mValidationList));
+ std::copy(src_block_data.mAllParams.begin(), src_block_data.mAllParams.end(), std::back_inserter(mAllParams));
+ }
+
+ BlockDescriptor::BlockDescriptor()
+ : mMaxParamOffset(0),
+ mInitializationState(UNINITIALIZED),
+ mCurrentBlockPtr(NULL)
+ {}
+
+ // called by each derived class in least to most derived order
+ void BaseBlock::init(BlockDescriptor& descriptor, BlockDescriptor& base_descriptor, size_t block_size)
+ {
+ descriptor.mCurrentBlockPtr = this;
+ descriptor.mMaxParamOffset = block_size;
+
+ switch(descriptor.mInitializationState)
+ {
+ case BlockDescriptor::UNINITIALIZED:
+ // copy params from base class here
+ descriptor.aggregateBlockData(base_descriptor);
+
+ descriptor.mInitializationState = BlockDescriptor::INITIALIZING;
+ break;
+ case BlockDescriptor::INITIALIZING:
+ descriptor.mInitializationState = BlockDescriptor::INITIALIZED;
+ break;
+ case BlockDescriptor::INITIALIZED:
+ // nothing to do
+ break;
+ }
+ }
+
+ param_handle_t BaseBlock::getHandleFromParam(const Param* param) const
+ {
+ const U8* param_address = reinterpret_cast<const U8*>(param);
+ const U8* baseblock_address = reinterpret_cast<const U8*>(this);
+ return (param_address - baseblock_address);
+ }
+
+ bool BaseBlock::submitValue(Parser::name_stack_t& name_stack, Parser& p, bool silent)
+ {
+ if (!deserializeBlock(p, std::make_pair(name_stack.begin(), name_stack.end()), true))
+ {
+ if (!silent)
+ {
+ p.parserWarning(llformat("Failed to parse parameter \"%s\"", p.getCurrentElementName().c_str()));
+ }
+ return false;
+ }
+ return true;
+ }
+
+
+ bool BaseBlock::validateBlock(bool emit_errors) const
+ {
+ const BlockDescriptor& block_data = mostDerivedBlockDescriptor();
+ for (BlockDescriptor::param_validation_list_t::const_iterator it = block_data.mValidationList.begin(); it != block_data.mValidationList.end(); ++it)
+ {
+ const Param* param = getParamFromHandle(it->first);
+ if (!it->second(param))
+ {
+ if (emit_errors)
+ {
+ llwarns << "Invalid param \"" << getParamName(block_data, param) << "\"" << llendl;
+ }
+ return false;
+ }
+ }
+ return true;
+ }
+
+ void BaseBlock::serializeBlock(Parser& parser, Parser::name_stack_t& name_stack, const LLInitParam::BaseBlock* diff_block) const
+ {
+ // named param is one like LLView::Params::follows
+ // unnamed param is like LLView::Params::rect - implicit
+ const BlockDescriptor& block_data = mostDerivedBlockDescriptor();
+
+ for (BlockDescriptor::param_list_t::const_iterator it = block_data.mUnnamedParams.begin();
+ it != block_data.mUnnamedParams.end();
+ ++it)
+ {
+ param_handle_t param_handle = (*it)->mParamHandle;
+ const Param* param = getParamFromHandle(param_handle);
+ ParamDescriptor::serialize_func_t serialize_func = (*it)->mSerializeFunc;
+ if (serialize_func)
+ {
+ const Param* diff_param = diff_block ? diff_block->getParamFromHandle(param_handle) : NULL;
+ // each param descriptor remembers its serial number
+ // so we can inspect the same param under different names
+ // and see that it has the same number
+ name_stack.push_back(std::make_pair("", true));
+ serialize_func(*param, parser, name_stack, diff_param);
+ name_stack.pop_back();
+ }
+ }
+
+ for(BlockDescriptor::param_map_t::const_iterator it = block_data.mNamedParams.begin();
+ it != block_data.mNamedParams.end();
+ ++it)
+ {
+ param_handle_t param_handle = it->second->mParamHandle;
+ const Param* param = getParamFromHandle(param_handle);
+ ParamDescriptor::serialize_func_t serialize_func = it->second->mSerializeFunc;
+ if (serialize_func && param->anyProvided())
+ {
+ // Ensure this param has not already been serialized
+ // Prevents <rect> from being serialized as its own tag.
+ bool duplicate = false;
+ for (BlockDescriptor::param_list_t::const_iterator it2 = block_data.mUnnamedParams.begin();
+ it2 != block_data.mUnnamedParams.end();
+ ++it2)
+ {
+ if (param_handle == (*it2)->mParamHandle)
+ {
+ duplicate = true;
+ break;
+ }
+ }
+
+ //FIXME: for now, don't attempt to serialize values under synonyms, as current parsers
+ // don't know how to detect them
+ if (duplicate)
+ {
+ continue;
+ }
+
+ name_stack.push_back(std::make_pair(it->first, !duplicate));
+ const Param* diff_param = diff_block ? diff_block->getParamFromHandle(param_handle) : NULL;
+ serialize_func(*param, parser, name_stack, diff_param);
+ name_stack.pop_back();
+ }
+ }
+ }
+
+ bool BaseBlock::inspectBlock(Parser& parser, Parser::name_stack_t name_stack, S32 min_count, S32 max_count) const
+ {
+ // named param is one like LLView::Params::follows
+ // unnamed param is like LLView::Params::rect - implicit
+ const BlockDescriptor& block_data = mostDerivedBlockDescriptor();
+
+ for (BlockDescriptor::param_list_t::const_iterator it = block_data.mUnnamedParams.begin();
+ it != block_data.mUnnamedParams.end();
+ ++it)
+ {
+ param_handle_t param_handle = (*it)->mParamHandle;
+ const Param* param = getParamFromHandle(param_handle);
+ ParamDescriptor::inspect_func_t inspect_func = (*it)->mInspectFunc;
+ if (inspect_func)
+ {
+ name_stack.push_back(std::make_pair("", true));
+ inspect_func(*param, parser, name_stack, (*it)->mMinCount, (*it)->mMaxCount);
+ name_stack.pop_back();
+ }
+ }
+
+ for(BlockDescriptor::param_map_t::const_iterator it = block_data.mNamedParams.begin();
+ it != block_data.mNamedParams.end();
+ ++it)
+ {
+ param_handle_t param_handle = it->second->mParamHandle;
+ const Param* param = getParamFromHandle(param_handle);
+ ParamDescriptor::inspect_func_t inspect_func = it->second->mInspectFunc;
+ if (inspect_func)
+ {
+ // Ensure this param has not already been inspected
+ bool duplicate = false;
+ for (BlockDescriptor::param_list_t::const_iterator it2 = block_data.mUnnamedParams.begin();
+ it2 != block_data.mUnnamedParams.end();
+ ++it2)
+ {
+ if (param_handle == (*it2)->mParamHandle)
+ {
+ duplicate = true;
+ break;
+ }
+ }
+
+ name_stack.push_back(std::make_pair(it->first, !duplicate));
+ inspect_func(*param, parser, name_stack, it->second->mMinCount, it->second->mMaxCount);
+ name_stack.pop_back();
+ }
+ }
+
+ return true;
+ }
+
+ bool BaseBlock::deserializeBlock(Parser& p, Parser::name_stack_range_t name_stack_range, bool ignored)
+ {
+ BlockDescriptor& block_data = mostDerivedBlockDescriptor();
+ bool names_left = name_stack_range.first != name_stack_range.second;
+
+ bool new_name = names_left
+ ? name_stack_range.first->second
+ : true;
+
+ if (names_left)
+ {
+ const std::string& top_name = name_stack_range.first->first;
+
+ ParamDescriptor::deserialize_func_t deserialize_func = NULL;
+ Param* paramp = NULL;
+
+ BlockDescriptor::param_map_t::iterator found_it = block_data.mNamedParams.find(top_name);
+ if (found_it != block_data.mNamedParams.end())
+ {
+ // find pointer to member parameter from offset table
+ paramp = getParamFromHandle(found_it->second->mParamHandle);
+ deserialize_func = found_it->second->mDeserializeFunc;
+
+ Parser::name_stack_range_t new_name_stack(name_stack_range.first, name_stack_range.second);
+ ++new_name_stack.first;
+ if (deserialize_func(*paramp, p, new_name_stack, new_name))
+ {
+ // value is no longer new, we know about it now
+ name_stack_range.first->second = false;
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+ }
+ }
+
+ // try to parse unnamed parameters, in declaration order
+ for ( BlockDescriptor::param_list_t::iterator it = block_data.mUnnamedParams.begin();
+ it != block_data.mUnnamedParams.end();
+ ++it)
+ {
+ Param* paramp = getParamFromHandle((*it)->mParamHandle);
+ ParamDescriptor::deserialize_func_t deserialize_func = (*it)->mDeserializeFunc;
+
+ if (deserialize_func && deserialize_func(*paramp, p, name_stack_range, new_name))
+ {
+ return true;
+ }
+ }
+
+ // if no match, and no names left on stack, this is just an existence assertion of this block
+ // verify by calling readValue with NoParamValue type, an inherently unparseable type
+ if (!names_left)
+ {
+ Flag no_value;
+ return p.readValue(no_value);
+ }
+
+ return false;
+ }
+
+ //static
+ void BaseBlock::addParam(BlockDescriptor& block_data, const ParamDescriptorPtr in_param, const char* char_name)
+ {
+ // create a copy of the param descriptor in mAllParams
+ // so other data structures can store a pointer to it
+ block_data.mAllParams.push_back(in_param);
+ ParamDescriptorPtr param(block_data.mAllParams.back());
+
+ std::string name(char_name);
+ if ((size_t)param->mParamHandle > block_data.mMaxParamOffset)
+ {
+ llerrs << "Attempted to register param with block defined for parent class, make sure to derive from LLInitParam::Block<YOUR_CLASS, PARAM_BLOCK_BASE_CLASS>" << llendl;
+ }
+
+ if (name.empty())
+ {
+ block_data.mUnnamedParams.push_back(param);
+ }
+ else
+ {
+ // don't use insert, since we want to overwrite existing entries
+ block_data.mNamedParams[name] = param;
+ }
+
+ if (param->mValidationFunc)
+ {
+ block_data.mValidationList.push_back(std::make_pair(param->mParamHandle, param->mValidationFunc));
+ }
+ }
+
+ void BaseBlock::addSynonym(Param& param, const std::string& synonym)
+ {
+ BlockDescriptor& block_data = mostDerivedBlockDescriptor();
+ if (block_data.mInitializationState == BlockDescriptor::INITIALIZING)
+ {
+ param_handle_t handle = getHandleFromParam(&param);
+
+ // check for invalid derivation from a paramblock (i.e. without using
+ // Block<T, Base_Class>
+ if ((size_t)handle > block_data.mMaxParamOffset)
+ {
+ llerrs << "Attempted to register param with block defined for parent class, make sure to derive from LLInitParam::Block<YOUR_CLASS, PARAM_BLOCK_BASE_CLASS>" << llendl;
+ }
+
+ ParamDescriptorPtr param_descriptor = findParamDescriptor(param);
+ if (param_descriptor)
+ {
+ if (synonym.empty())
+ {
+ block_data.mUnnamedParams.push_back(param_descriptor);
+ }
+ else
+ {
+ block_data.mNamedParams[synonym] = param_descriptor;
+ }
+ }
+ }
+ }
+
+ const std::string& BaseBlock::getParamName(const BlockDescriptor& block_data, const Param* paramp) const
+ {
+ param_handle_t handle = getHandleFromParam(paramp);
+ for (BlockDescriptor::param_map_t::const_iterator it = block_data.mNamedParams.begin(); it != block_data.mNamedParams.end(); ++it)
+ {
+ if (it->second->mParamHandle == handle)
+ {
+ return it->first;
+ }
+ }
+
+ return LLStringUtil::null;
+ }
+
+ ParamDescriptorPtr BaseBlock::findParamDescriptor(const Param& param)
+ {
+ param_handle_t handle = getHandleFromParam(&param);
+ BlockDescriptor& descriptor = mostDerivedBlockDescriptor();
+ BlockDescriptor::all_params_list_t::iterator end_it = descriptor.mAllParams.end();
+ for (BlockDescriptor::all_params_list_t::iterator it = descriptor.mAllParams.begin();
+ it != end_it;
+ ++it)
+ {
+ if ((*it)->mParamHandle == handle) return *it;
+ }
+ return ParamDescriptorPtr();
+ }
+
+ // take all provided params from other and apply to self
+ // NOTE: this requires that "other" is of the same derived type as this
+ bool BaseBlock::mergeBlock(BlockDescriptor& block_data, const BaseBlock& other, bool overwrite)
+ {
+ bool some_param_changed = false;
+ BlockDescriptor::all_params_list_t::const_iterator end_it = block_data.mAllParams.end();
+ for (BlockDescriptor::all_params_list_t::const_iterator it = block_data.mAllParams.begin();
+ it != end_it;
+ ++it)
+ {
+ const Param* other_paramp = other.getParamFromHandle((*it)->mParamHandle);
+ ParamDescriptor::merge_func_t merge_func = (*it)->mMergeFunc;
+ if (merge_func)
+ {
+ Param* paramp = getParamFromHandle((*it)->mParamHandle);
+ llassert(paramp->mEnclosingBlockOffset == (*it)->mParamHandle);
+ some_param_changed |= merge_func(*paramp, *other_paramp, overwrite);
+ }
+ }
+ return some_param_changed;
+ }
+}
diff --git a/indra/llcommon/llinitparam.h b/indra/llcommon/llinitparam.h
new file mode 100644
index 0000000000..ef6c6335d1
--- /dev/null
+++ b/indra/llcommon/llinitparam.h
@@ -0,0 +1,2295 @@
+/**
+ * @file llinitparam.h
+ * @brief parameter block abstraction for creating complex objects and
+ * parsing construction parameters from xml and LLSD
+ *
+ * $LicenseInfo:firstyear=2008&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLPARAM_H
+#define LL_LLPARAM_H
+
+#include <vector>
+#include <boost/function.hpp>
+#include <boost/type_traits/is_convertible.hpp>
+#include <boost/unordered_map.hpp>
+#include <boost/shared_ptr.hpp>
+
+#include "llerror.h"
+#include "lltypeinfolookup.h"
+
+namespace LLInitParam
+{
+ // used to indicate no matching value to a given name when parsing
+ struct Flag{};
+
+ template<typename T> const T& defaultValue() { static T value; return value; }
+
+ template <typename T, bool IS_BOOST_FUNCTION = boost::is_convertible<T, boost::function_base>::value >
+ struct ParamCompare
+ {
+ static bool equals(const T &a, const T &b)
+ {
+ return a == b;
+ }
+ };
+
+ // boost function types are not comparable
+ template<typename T>
+ struct ParamCompare<T, true>
+ {
+ static bool equals(const T&a, const T &b)
+ {
+ return false;
+ }
+ };
+
+ template<>
+ struct ParamCompare<LLSD, false>
+ {
+ static bool equals(const LLSD &a, const LLSD &b) { return false; }
+ };
+
+ template<>
+ struct ParamCompare<Flag, false>
+ {
+ static bool equals(const Flag& a, const Flag& b) { return false; }
+ };
+
+
+ // helper functions and classes
+ typedef ptrdiff_t param_handle_t;
+
+ // empty default implementation of key cache
+ // leverages empty base class optimization
+ template <typename T>
+ class TypeValues
+ {
+ private:
+ struct Inaccessable{};
+ public:
+ typedef std::map<std::string, T> value_name_map_t;
+ typedef Inaccessable name_t;
+
+ void setValueName(const std::string& key) {}
+ std::string getValueName() const { return ""; }
+ std::string calcValueName(const T& value) const { return ""; }
+ void clearValueName() const {}
+
+ static bool getValueFromName(const std::string& name, T& value)
+ {
+ return false;
+ }
+
+ static bool valueNamesExist()
+ {
+ return false;
+ }
+
+ static std::vector<std::string>* getPossibleValues()
+ {
+ return NULL;
+ }
+
+ static value_name_map_t* getValueNames() {return NULL;}
+ };
+
+ template <typename T, typename DERIVED_TYPE = TypeValues<T> >
+ class TypeValuesHelper
+ {
+ public:
+ typedef typename std::map<std::string, T> value_name_map_t;
+ typedef std::string name_t;
+
+ //TODO: cache key by index to save on param block size
+ void setValueName(const std::string& value_name)
+ {
+ mValueName = value_name;
+ }
+
+ std::string getValueName() const
+ {
+ return mValueName;
+ }
+
+ std::string calcValueName(const T& value) const
+ {
+ value_name_map_t* map = getValueNames();
+ for (typename value_name_map_t::iterator it = map->begin(), end_it = map->end();
+ it != end_it;
+ ++it)
+ {
+ if (ParamCompare<T>::equals(it->second, value))
+ {
+ return it->first;
+ }
+ }
+
+ return "";
+ }
+
+ void clearValueName() const
+ {
+ mValueName.clear();
+ }
+
+ static bool getValueFromName(const std::string& name, T& value)
+ {
+ value_name_map_t* map = getValueNames();
+ typename value_name_map_t::iterator found_it = map->find(name);
+ if (found_it == map->end()) return false;
+
+ value = found_it->second;
+ return true;
+ }
+
+ static bool valueNamesExist()
+ {
+ return !getValueNames()->empty();
+ }
+
+ static value_name_map_t* getValueNames()
+ {
+ static value_name_map_t sMap;
+ static bool sInitialized = false;
+
+ if (!sInitialized)
+ {
+ sInitialized = true;
+ DERIVED_TYPE::declareValues();
+ }
+ return &sMap;
+ }
+
+ static std::vector<std::string>* getPossibleValues()
+ {
+ static std::vector<std::string> sValues;
+
+ value_name_map_t* map = getValueNames();
+ for (typename value_name_map_t::iterator it = map->begin(), end_it = map->end();
+ it != end_it;
+ ++it)
+ {
+ sValues.push_back(it->first);
+ }
+ return &sValues;
+ }
+
+ static void declare(const std::string& name, const T& value)
+ {
+ (*getValueNames())[name] = value;
+ }
+
+ protected:
+ static void getName(const std::string& name, const T& value)
+ {}
+
+ mutable std::string mValueName;
+ };
+
+ class LL_COMMON_API Parser
+ {
+ LOG_CLASS(Parser);
+
+ public:
+
+ struct CompareTypeID
+ {
+ bool operator()(const std::type_info* lhs, const std::type_info* rhs) const
+ {
+ return lhs->before(*rhs);
+ }
+ };
+
+ typedef std::vector<std::pair<std::string, bool> > name_stack_t;
+ typedef std::pair<name_stack_t::iterator, name_stack_t::iterator> name_stack_range_t;
+ typedef std::vector<std::string> possible_values_t;
+
+ typedef bool (*parser_read_func_t)(Parser& parser, void* output);
+ typedef bool (*parser_write_func_t)(Parser& parser, const void*, name_stack_t&);
+ typedef boost::function<void (name_stack_t&, S32, S32, const possible_values_t*)> parser_inspect_func_t;
+
+ typedef LLTypeInfoLookup<parser_read_func_t> parser_read_func_map_t;
+ typedef LLTypeInfoLookup<parser_write_func_t> parser_write_func_map_t;
+ typedef LLTypeInfoLookup<parser_inspect_func_t> parser_inspect_func_map_t;
+
+ Parser(parser_read_func_map_t& read_map, parser_write_func_map_t& write_map, parser_inspect_func_map_t& inspect_map)
+ : mParseSilently(false),
+ mParserReadFuncs(&read_map),
+ mParserWriteFuncs(&write_map),
+ mParserInspectFuncs(&inspect_map)
+ {}
+ virtual ~Parser();
+
+ template <typename T> bool readValue(T& param)
+ {
+ parser_read_func_map_t::iterator found_it = mParserReadFuncs->find(&typeid(T));
+ if (found_it != mParserReadFuncs->end())
+ {
+ return found_it->second(*this, (void*)&param);
+ }
+ return false;
+ }
+
+ template <typename T> bool writeValue(const T& param, name_stack_t& name_stack)
+ {
+ parser_write_func_map_t::iterator found_it = mParserWriteFuncs->find(&typeid(T));
+ if (found_it != mParserWriteFuncs->end())
+ {
+ return found_it->second(*this, (const void*)&param, name_stack);
+ }
+ return false;
+ }
+
+ // dispatch inspection to registered inspection functions, for each parameter in a param block
+ template <typename T> bool inspectValue(name_stack_t& name_stack, S32 min_count, S32 max_count, const possible_values_t* possible_values)
+ {
+ parser_inspect_func_map_t::iterator found_it = mParserInspectFuncs->find(&typeid(T));
+ if (found_it != mParserInspectFuncs->end())
+ {
+ found_it->second(name_stack, min_count, max_count, possible_values);
+ return true;
+ }
+ return false;
+ }
+
+ virtual std::string getCurrentElementName() = 0;
+ virtual void parserWarning(const std::string& message);
+ virtual void parserError(const std::string& message);
+ void setParseSilently(bool silent) { mParseSilently = silent; }
+
+ protected:
+ template <typename T>
+ void registerParserFuncs(parser_read_func_t read_func, parser_write_func_t write_func = NULL)
+ {
+ mParserReadFuncs->insert(std::make_pair(&typeid(T), read_func));
+ mParserWriteFuncs->insert(std::make_pair(&typeid(T), write_func));
+ }
+
+ template <typename T>
+ void registerInspectFunc(parser_inspect_func_t inspect_func)
+ {
+ mParserInspectFuncs->insert(std::make_pair(&typeid(T), inspect_func));
+ }
+
+ bool mParseSilently;
+
+ private:
+ parser_read_func_map_t* mParserReadFuncs;
+ parser_write_func_map_t* mParserWriteFuncs;
+ parser_inspect_func_map_t* mParserInspectFuncs;
+ };
+
+ class Param;
+
+ // various callbacks and constraints associated with an individual param
+ struct LL_COMMON_API ParamDescriptor
+ {
+ struct UserData
+ {
+ virtual ~UserData() {}
+ };
+
+ typedef bool(*merge_func_t)(Param&, const Param&, bool);
+ typedef bool(*deserialize_func_t)(Param&, Parser&, const Parser::name_stack_range_t&, bool);
+ typedef void(*serialize_func_t)(const Param&, Parser&, Parser::name_stack_t&, const Param* diff_param);
+ typedef void(*inspect_func_t)(const Param&, Parser&, Parser::name_stack_t&, S32 min_count, S32 max_count);
+ typedef bool(*validation_func_t)(const Param*);
+
+ ParamDescriptor(param_handle_t p,
+ merge_func_t merge_func,
+ deserialize_func_t deserialize_func,
+ serialize_func_t serialize_func,
+ validation_func_t validation_func,
+ inspect_func_t inspect_func,
+ S32 min_count,
+ S32 max_count);
+
+ ParamDescriptor();
+ ~ParamDescriptor();
+
+ param_handle_t mParamHandle;
+ merge_func_t mMergeFunc;
+ deserialize_func_t mDeserializeFunc;
+ serialize_func_t mSerializeFunc;
+ inspect_func_t mInspectFunc;
+ validation_func_t mValidationFunc;
+ S32 mMinCount;
+ S32 mMaxCount;
+ S32 mNumRefs;
+ UserData* mUserData;
+ };
+
+ typedef boost::shared_ptr<ParamDescriptor> ParamDescriptorPtr;
+
+ // each derived Block class keeps a static data structure maintaining offsets to various params
+ class LL_COMMON_API BlockDescriptor
+ {
+ public:
+ BlockDescriptor();
+
+ typedef enum e_initialization_state
+ {
+ UNINITIALIZED,
+ INITIALIZING,
+ INITIALIZED
+ } EInitializationState;
+
+ void aggregateBlockData(BlockDescriptor& src_block_data);
+
+ typedef boost::unordered_map<const std::string, ParamDescriptorPtr> param_map_t;
+ typedef std::vector<ParamDescriptorPtr> param_list_t;
+ typedef std::list<ParamDescriptorPtr> all_params_list_t;
+ typedef std::vector<std::pair<param_handle_t, ParamDescriptor::validation_func_t> > param_validation_list_t;
+
+ param_map_t mNamedParams; // parameters with associated names
+ param_list_t mUnnamedParams; // parameters with_out_ associated names
+ param_validation_list_t mValidationList; // parameters that must be validated
+ all_params_list_t mAllParams; // all parameters, owns descriptors
+ size_t mMaxParamOffset;
+ EInitializationState mInitializationState; // whether or not static block data has been initialized
+ class BaseBlock* mCurrentBlockPtr; // pointer to block currently being constructed
+ };
+
+ class LL_COMMON_API BaseBlock
+ {
+ public:
+ //TODO: implement in terms of owned_ptr
+ template<typename T>
+ class Lazy
+ {
+ public:
+ Lazy()
+ : mPtr(NULL)
+ {}
+
+ ~Lazy()
+ {
+ delete mPtr;
+ }
+
+ Lazy(const Lazy& other)
+ {
+ if (other.mPtr)
+ {
+ mPtr = new T(*other.mPtr);
+ }
+ else
+ {
+ mPtr = NULL;
+ }
+ }
+
+ Lazy<T>& operator = (const Lazy<T>& other)
+ {
+ if (other.mPtr)
+ {
+ mPtr = new T(*other.mPtr);
+ }
+ else
+ {
+ mPtr = NULL;
+ }
+ return *this;
+ }
+
+ bool empty() const
+ {
+ return mPtr == NULL;
+ }
+
+ void set(const T& other)
+ {
+ delete mPtr;
+ mPtr = new T(other);
+ }
+
+ const T& get() const
+ {
+ return ensureInstance();
+ }
+
+ T& get()
+ {
+ return ensureInstance();
+ }
+
+ private:
+ // lazily allocate an instance of T
+ T* ensureInstance() const
+ {
+ if (mPtr == NULL)
+ {
+ mPtr = new T();
+ }
+ return mPtr;
+ }
+
+ private:
+ // if you get a compilation error with this, that means you are using a forward declared struct for T
+ // unfortunately, the type traits we rely on don't work with forward declared typed
+ //static const int dummy = sizeof(T);
+
+ mutable T* mPtr;
+ };
+
+ // "Multiple" constraint types, put here in root class to avoid ambiguity during use
+ struct AnyAmount
+ {
+ enum { minCount = 0 };
+ enum { maxCount = U32_MAX };
+ };
+
+ template<U32 MIN_AMOUNT>
+ struct AtLeast
+ {
+ enum { minCount = MIN_AMOUNT };
+ enum { maxCount = U32_MAX };
+ };
+
+ template<U32 MAX_AMOUNT>
+ struct AtMost
+ {
+ enum { minCount = 0 };
+ enum { maxCount = MAX_AMOUNT };
+ };
+
+ template<U32 MIN_AMOUNT, U32 MAX_AMOUNT>
+ struct Between
+ {
+ enum { minCount = MIN_AMOUNT };
+ enum { maxCount = MAX_AMOUNT };
+ };
+
+ template<U32 EXACT_COUNT>
+ struct Exactly
+ {
+ enum { minCount = EXACT_COUNT };
+ enum { maxCount = EXACT_COUNT };
+ };
+
+ // this typedef identifies derived classes as being blocks
+ typedef void baseblock_base_class_t;
+ LOG_CLASS(BaseBlock);
+ friend class Param;
+
+ virtual ~BaseBlock() {}
+ bool submitValue(Parser::name_stack_t& name_stack, Parser& p, bool silent=false);
+
+ param_handle_t getHandleFromParam(const Param* param) const;
+ bool validateBlock(bool emit_errors = true) const;
+
+ Param* getParamFromHandle(const param_handle_t param_handle)
+ {
+ if (param_handle == 0) return NULL;
+
+ U8* baseblock_address = reinterpret_cast<U8*>(this);
+ return reinterpret_cast<Param*>(baseblock_address + param_handle);
+ }
+
+ const Param* getParamFromHandle(const param_handle_t param_handle) const
+ {
+ const U8* baseblock_address = reinterpret_cast<const U8*>(this);
+ return reinterpret_cast<const Param*>(baseblock_address + param_handle);
+ }
+
+ void addSynonym(Param& param, const std::string& synonym);
+
+ // Blocks can override this to do custom tracking of changes
+ virtual void paramChanged(const Param& changed_param, bool user_provided) {}
+
+ bool deserializeBlock(Parser& p, Parser::name_stack_range_t name_stack_range, bool new_name);
+ void serializeBlock(Parser& p, Parser::name_stack_t& name_stack, const BaseBlock* diff_block = NULL) const;
+ bool inspectBlock(Parser& p, Parser::name_stack_t name_stack = Parser::name_stack_t(), S32 min_count = 0, S32 max_count = S32_MAX) const;
+
+ virtual const BlockDescriptor& mostDerivedBlockDescriptor() const { return selfBlockDescriptor(); }
+ virtual BlockDescriptor& mostDerivedBlockDescriptor() { return selfBlockDescriptor(); }
+
+ // take all provided params from other and apply to self
+ bool overwriteFrom(const BaseBlock& other)
+ {
+ return false;
+ }
+
+ // take all provided params that are not already provided, and apply to self
+ bool fillFrom(const BaseBlock& other)
+ {
+ return false;
+ }
+
+ static void addParam(BlockDescriptor& block_data, ParamDescriptorPtr param, const char* name);
+
+ ParamDescriptorPtr findParamDescriptor(const Param& param);
+
+ protected:
+ void init(BlockDescriptor& descriptor, BlockDescriptor& base_descriptor, size_t block_size);
+
+
+ bool mergeBlockParam(bool source_provided, bool dst_provided, BlockDescriptor& block_data, const BaseBlock& source, bool overwrite)
+ {
+ return mergeBlock(block_data, source, overwrite);
+ }
+ // take all provided params from other and apply to self
+ bool mergeBlock(BlockDescriptor& block_data, const BaseBlock& other, bool overwrite);
+
+ static BlockDescriptor& selfBlockDescriptor()
+ {
+ static BlockDescriptor sBlockDescriptor;
+ return sBlockDescriptor;
+ }
+
+ private:
+ const std::string& getParamName(const BlockDescriptor& block_data, const Param* paramp) const;
+ };
+
+ template<typename T>
+ struct ParamCompare<BaseBlock::Lazy<T>, false >
+ {
+ static bool equals(const BaseBlock::Lazy<T>& a, const BaseBlock::Lazy<T>& b) { return !a.empty() || !b.empty(); }
+ };
+
+ class LL_COMMON_API Param
+ {
+ public:
+ void setProvided(bool is_provided = true)
+ {
+ mIsProvided = is_provided;
+ enclosingBlock().paramChanged(*this, is_provided);
+ }
+
+ Param& operator =(const Param& other)
+ {
+ mIsProvided = other.mIsProvided;
+ // don't change mEnclosingblockoffset
+ return *this;
+ }
+ protected:
+
+ bool anyProvided() const { return mIsProvided; }
+
+ Param(BaseBlock* enclosing_block);
+
+ // store pointer to enclosing block as offset to reduce space and allow for quick copying
+ BaseBlock& enclosingBlock() const
+ {
+ const U8* my_addr = reinterpret_cast<const U8*>(this);
+ // get address of enclosing BLOCK class using stored offset to enclosing BaseBlock class
+ return *const_cast<BaseBlock*>
+ (reinterpret_cast<const BaseBlock*>
+ (my_addr - (ptrdiff_t)(S32)mEnclosingBlockOffset));
+ }
+
+ private:
+ friend class BaseBlock;
+
+ U32 mEnclosingBlockOffset:31;
+ U32 mIsProvided:1;
+
+ };
+
+ // these templates allow us to distinguish between template parameters
+ // that derive from BaseBlock and those that don't
+ template<typename T, typename Void = void>
+ struct IsBlock
+ {
+ static const bool value = false;
+ struct EmptyBase {};
+ typedef EmptyBase base_class_t;
+ };
+
+ template<typename T>
+ struct IsBlock<T, typename T::baseblock_base_class_t>
+ {
+ static const bool value = true;
+ typedef BaseBlock base_class_t;
+ };
+
+ template<typename T>
+ struct IsBlock<BaseBlock::Lazy<T>, typename T::baseblock_base_class_t >
+ {
+ static const bool value = true;
+ typedef BaseBlock base_class_t;
+ };
+
+ template<typename T, typename NAME_VALUE_LOOKUP, bool VALUE_IS_BLOCK = IsBlock<T>::value>
+ class ParamValue : public NAME_VALUE_LOOKUP
+ {
+ public:
+ typedef const T& value_assignment_t;
+ typedef T value_t;
+ typedef ParamValue<T, NAME_VALUE_LOOKUP, VALUE_IS_BLOCK> self_t;
+
+ ParamValue(): mValue() {}
+ ParamValue(value_assignment_t other) : mValue(other) {}
+
+ void setValue(value_assignment_t val)
+ {
+ mValue = val;
+ }
+
+ value_assignment_t getValue() const
+ {
+ return mValue;
+ }
+
+ T& getValue()
+ {
+ return mValue;
+ }
+
+ operator value_assignment_t() const
+ {
+ return mValue;
+ }
+
+ value_assignment_t operator()() const
+ {
+ return mValue;
+ }
+
+ void operator ()(const typename NAME_VALUE_LOOKUP::name_t& name)
+ {
+ *this = name;
+ }
+
+ self_t& operator =(const typename NAME_VALUE_LOOKUP::name_t& name)
+ {
+ if (NAME_VALUE_LOOKUP::getValueFromName(name, mValue))
+ {
+ setValueName(name);
+ }
+
+ return *this;
+ }
+
+ protected:
+ T mValue;
+ };
+
+ template<typename T, typename NAME_VALUE_LOOKUP>
+ class ParamValue<T, NAME_VALUE_LOOKUP, true>
+ : public T,
+ public NAME_VALUE_LOOKUP
+ {
+ public:
+ typedef const T& value_assignment_t;
+ typedef T value_t;
+ typedef ParamValue<T, NAME_VALUE_LOOKUP, true> self_t;
+
+ ParamValue()
+ : T(),
+ mValidated(false)
+ {}
+
+ ParamValue(value_assignment_t other)
+ : T(other),
+ mValidated(false)
+ {}
+
+ void setValue(value_assignment_t val)
+ {
+ *this = val;
+ }
+
+ value_assignment_t getValue() const
+ {
+ return *this;
+ }
+
+ T& getValue()
+ {
+ return *this;
+ }
+
+ operator value_assignment_t() const
+ {
+ return *this;
+ }
+
+ value_assignment_t operator()() const
+ {
+ return *this;
+ }
+
+ void operator ()(const typename NAME_VALUE_LOOKUP::name_t& name)
+ {
+ *this = name;
+ }
+
+ self_t& operator =(const typename NAME_VALUE_LOOKUP::name_t& name)
+ {
+ if (NAME_VALUE_LOOKUP::getValueFromName(name, *this))
+ {
+ setValueName(name);
+ }
+
+ return *this;
+ }
+
+ protected:
+ mutable bool mValidated; // lazy validation flag
+ };
+
+ template<typename NAME_VALUE_LOOKUP>
+ class ParamValue<std::string, NAME_VALUE_LOOKUP, false>
+ : public NAME_VALUE_LOOKUP
+ {
+ public:
+ typedef const std::string& value_assignment_t;
+ typedef std::string value_t;
+ typedef ParamValue<std::string, NAME_VALUE_LOOKUP, false> self_t;
+
+ ParamValue(): mValue() {}
+ ParamValue(value_assignment_t other) : mValue(other) {}
+
+ void setValue(value_assignment_t val)
+ {
+ if (NAME_VALUE_LOOKUP::getValueFromName(val, mValue))
+ {
+ NAME_VALUE_LOOKUP::setValueName(val);
+ }
+ else
+ {
+ mValue = val;
+ }
+ }
+
+ value_assignment_t getValue() const
+ {
+ return mValue;
+ }
+
+ std::string& getValue()
+ {
+ return mValue;
+ }
+
+ operator value_assignment_t() const
+ {
+ return mValue;
+ }
+
+ value_assignment_t operator()() const
+ {
+ return mValue;
+ }
+
+ protected:
+ std::string mValue;
+ };
+
+
+ template<typename T, typename NAME_VALUE_LOOKUP = TypeValues<T> >
+ struct ParamIterator
+ {
+ typedef typename std::vector<ParamValue<T, NAME_VALUE_LOOKUP> >::const_iterator const_iterator;
+ typedef typename std::vector<ParamValue<T, NAME_VALUE_LOOKUP> >::iterator iterator;
+ };
+
+ // specialize for custom parsing/decomposition of specific classes
+ // e.g. TypedParam<LLRect> has left, top, right, bottom, etc...
+ template<typename T,
+ typename NAME_VALUE_LOOKUP = TypeValues<T>,
+ bool HAS_MULTIPLE_VALUES = false,
+ bool VALUE_IS_BLOCK = IsBlock<ParamValue<T, NAME_VALUE_LOOKUP> >::value>
+ class TypedParam
+ : public Param,
+ public ParamValue<T, NAME_VALUE_LOOKUP>
+ {
+ public:
+ typedef TypedParam<T, NAME_VALUE_LOOKUP, HAS_MULTIPLE_VALUES, VALUE_IS_BLOCK> self_t;
+ typedef ParamValue<T, NAME_VALUE_LOOKUP> param_value_t;
+ typedef typename param_value_t::value_assignment_t value_assignment_t;
+ typedef NAME_VALUE_LOOKUP name_value_lookup_t;
+
+ using param_value_t::operator();
+
+ TypedParam(BlockDescriptor& block_descriptor, const char* name, value_assignment_t value, ParamDescriptor::validation_func_t validate_func, S32 min_count, S32 max_count)
+ : Param(block_descriptor.mCurrentBlockPtr)
+ {
+ if (LL_UNLIKELY(block_descriptor.mInitializationState == BlockDescriptor::INITIALIZING))
+ {
+ ParamDescriptorPtr param_descriptor = ParamDescriptorPtr(new ParamDescriptor(
+ block_descriptor.mCurrentBlockPtr->getHandleFromParam(this),
+ &mergeWith,
+ &deserializeParam,
+ &serializeParam,
+ validate_func,
+ &inspectParam,
+ min_count, max_count));
+ BaseBlock::addParam(block_descriptor, param_descriptor, name);
+ }
+
+ setValue(value);
+ }
+
+ bool isProvided() const { return Param::anyProvided(); }
+
+ static bool deserializeParam(Param& param, Parser& parser, const Parser::name_stack_range_t& name_stack_range, bool new_name)
+ {
+ self_t& typed_param = static_cast<self_t&>(param);
+ // no further names in stack, attempt to parse value now
+ if (name_stack_range.first == name_stack_range.second)
+ {
+ if (parser.readValue(typed_param.getValue()))
+ {
+ typed_param.clearValueName();
+ typed_param.setProvided();
+ return true;
+ }
+
+ // try to parse a known named value
+ if(name_value_lookup_t::valueNamesExist())
+ {
+ // try to parse a known named value
+ std::string name;
+ if (parser.readValue(name))
+ {
+ // try to parse a per type named value
+ if (name_value_lookup_t::getValueFromName(name, typed_param.getValue()))
+ {
+ typed_param.setValueName(name);
+ typed_param.setProvided();
+ return true;
+ }
+
+ }
+ }
+ }
+ return false;
+ }
+
+ static void serializeParam(const Param& param, Parser& parser, Parser::name_stack_t& name_stack, const Param* diff_param)
+ {
+ const self_t& typed_param = static_cast<const self_t&>(param);
+ if (!typed_param.isProvided()) return;
+
+ if (!name_stack.empty())
+ {
+ name_stack.back().second = true;
+ }
+
+ std::string key = typed_param.getValueName();
+
+ // first try to write out name of name/value pair
+
+ if (!key.empty())
+ {
+ if (!diff_param || !ParamCompare<std::string>::equals(static_cast<const self_t*>(diff_param)->getValueName(), key))
+ {
+ parser.writeValue(key, name_stack);
+ }
+ }
+ // then try to serialize value directly
+ else if (!diff_param || !ParamCompare<T>::equals(typed_param.getValue(), static_cast<const self_t*>(diff_param)->getValue()))
+ {
+ if (!parser.writeValue(typed_param.getValue(), name_stack))
+ {
+ std::string calculated_key = typed_param.calcValueName(typed_param.getValue());
+ if (!diff_param || !ParamCompare<std::string>::equals(static_cast<const self_t*>(diff_param)->getValueName(), calculated_key))
+ {
+ parser.writeValue(calculated_key, name_stack);
+ }
+ }
+ }
+ }
+
+ static void inspectParam(const Param& param, Parser& parser, Parser::name_stack_t& name_stack, S32 min_count, S32 max_count)
+ {
+ // tell parser about our actual type
+ parser.inspectValue<T>(name_stack, min_count, max_count, NULL);
+ // then tell it about string-based alternatives ("red", "blue", etc. for LLColor4)
+ if (name_value_lookup_t::getPossibleValues())
+ {
+ parser.inspectValue<std::string>(name_stack, min_count, max_count, name_value_lookup_t::getPossibleValues());
+ }
+ }
+
+ void set(value_assignment_t val, bool flag_as_provided = true)
+ {
+ param_value_t::clearValueName();
+ setValue(val);
+ setProvided(flag_as_provided);
+ }
+
+ self_t& operator =(const typename NAME_VALUE_LOOKUP::name_t& name)
+ {
+ return static_cast<self_t&>(param_value_t::operator =(name));
+ }
+
+ protected:
+
+ self_t& operator =(const self_t& other)
+ {
+ param_value_t::operator =(other);
+ Param::operator =(other);
+ return *this;
+ }
+
+ static bool mergeWith(Param& dst, const Param& src, bool overwrite)
+ {
+ const self_t& src_typed_param = static_cast<const self_t&>(src);
+ self_t& dst_typed_param = static_cast<self_t&>(dst);
+
+ if (src_typed_param.isProvided()
+ && (overwrite || !dst_typed_param.isProvided()))
+ {
+ dst_typed_param.set(src_typed_param.getValue());
+ return true;
+ }
+ return false;
+ }
+ };
+
+ // parameter that is a block
+ template <typename T, typename NAME_VALUE_LOOKUP>
+ class TypedParam<T, NAME_VALUE_LOOKUP, false, true>
+ : public Param,
+ public ParamValue<T, NAME_VALUE_LOOKUP>
+ {
+ public:
+ typedef ParamValue<T, NAME_VALUE_LOOKUP> param_value_t;
+ typedef typename param_value_t::value_assignment_t value_assignment_t;
+ typedef TypedParam<T, NAME_VALUE_LOOKUP, false, true> self_t;
+ typedef NAME_VALUE_LOOKUP name_value_lookup_t;
+
+ using param_value_t::operator();
+
+ TypedParam(BlockDescriptor& block_descriptor, const char* name, value_assignment_t value, ParamDescriptor::validation_func_t validate_func, S32 min_count, S32 max_count)
+ : Param(block_descriptor.mCurrentBlockPtr),
+ param_value_t(value)
+ {
+ if (LL_UNLIKELY(block_descriptor.mInitializationState == BlockDescriptor::INITIALIZING))
+ {
+ ParamDescriptorPtr param_descriptor = ParamDescriptorPtr(new ParamDescriptor(
+ block_descriptor.mCurrentBlockPtr->getHandleFromParam(this),
+ &mergeWith,
+ &deserializeParam,
+ &serializeParam,
+ validate_func,
+ &inspectParam,
+ min_count, max_count));
+ BaseBlock::addParam(block_descriptor, param_descriptor, name);
+ }
+ }
+
+ static bool deserializeParam(Param& param, Parser& parser, const Parser::name_stack_range_t& name_stack_range, bool new_name)
+ {
+ self_t& typed_param = static_cast<self_t&>(param);
+ // attempt to parse block...
+ if(typed_param.deserializeBlock(parser, name_stack_range, new_name))
+ {
+ typed_param.clearValueName();
+ typed_param.setProvided();
+ return true;
+ }
+
+ if(name_value_lookup_t::valueNamesExist())
+ {
+ // try to parse a known named value
+ std::string name;
+ if (parser.readValue(name))
+ {
+ // try to parse a per type named value
+ if (name_value_lookup_t::getValueFromName(name, typed_param.getValue()))
+ {
+ typed_param.setValueName(name);
+ typed_param.setProvided();
+ return true;
+ }
+
+ }
+ }
+ return false;
+ }
+
+ static void serializeParam(const Param& param, Parser& parser, Parser::name_stack_t& name_stack, const Param* diff_param)
+ {
+ const self_t& typed_param = static_cast<const self_t&>(param);
+ if (!typed_param.isProvided()) return;
+
+ if (!name_stack.empty())
+ {
+ name_stack.back().second = true;
+ }
+
+ std::string key = typed_param.getValueName();
+ if (!key.empty())
+ {
+ if (!parser.writeValue(key, name_stack))
+ {
+ return;
+ }
+ }
+ else
+ {
+ typed_param.serializeBlock(parser, name_stack, static_cast<const self_t*>(diff_param));
+ }
+ }
+
+ static void inspectParam(const Param& param, Parser& parser, Parser::name_stack_t& name_stack, S32 min_count, S32 max_count)
+ {
+ // I am a param that is also a block, so just recurse into my contents
+ const self_t& typed_param = static_cast<const self_t&>(param);
+ typed_param.inspectBlock(parser, name_stack, min_count, max_count);
+ }
+
+ // a param-that-is-a-block is provided when the user has set one of its child params
+ // *and* the block as a whole validates
+ bool isProvided() const
+ {
+ // only validate block when it hasn't already passed validation with current data
+ if (Param::anyProvided() && !param_value_t::mValidated)
+ {
+ // a sub-block is "provided" when it has been filled in enough to be valid
+ param_value_t::mValidated = param_value_t::validateBlock(false);
+ }
+ return Param::anyProvided() && param_value_t::mValidated;
+ }
+
+ // assign block contents to this param-that-is-a-block
+ void set(value_assignment_t val, bool flag_as_provided = true)
+ {
+ setValue(val);
+ param_value_t::clearValueName();
+ // force revalidation of block
+ // next call to isProvided() will update provision status based on validity
+ param_value_t::mValidated = false;
+ setProvided(flag_as_provided);
+ }
+
+ self_t& operator =(const typename NAME_VALUE_LOOKUP::name_t& name)
+ {
+ return static_cast<self_t&>(param_value_t::operator =(name));
+ }
+
+ // propagate changed status up to enclosing block
+ /*virtual*/ void paramChanged(const Param& changed_param, bool user_provided)
+ {
+ param_value_t::paramChanged(changed_param, user_provided);
+ if (user_provided)
+ {
+ // a child param has been explicitly changed
+ // so *some* aspect of this block is now provided
+ param_value_t::mValidated = false;
+ setProvided();
+ param_value_t::clearValueName();
+ }
+ else
+ {
+ Param::enclosingBlock().paramChanged(*this, user_provided);
+ }
+ }
+
+ protected:
+
+ self_t& operator =(const self_t& other)
+ {
+ param_value_t::operator =(other);
+ Param::operator =(other);
+ return *this;
+ }
+
+ static bool mergeWith(Param& dst, const Param& src, bool overwrite)
+ {
+ const self_t& src_typed_param = static_cast<const self_t&>(src);
+ self_t& dst_typed_param = static_cast<self_t&>(dst);
+
+ if (src_typed_param.anyProvided())
+ {
+ if (dst_typed_param.mergeBlockParam(src_typed_param.isProvided(), dst_typed_param.isProvided(), param_value_t::selfBlockDescriptor(), src_typed_param, overwrite))
+ {
+ dst_typed_param.clearValueName();
+ dst_typed_param.setProvided(true);
+ return true;
+ }
+ }
+ return false;
+ }
+ };
+
+ // container of non-block parameters
+ template <typename VALUE_TYPE, typename NAME_VALUE_LOOKUP>
+ class TypedParam<VALUE_TYPE, NAME_VALUE_LOOKUP, true, false>
+ : public Param
+ {
+ public:
+ typedef TypedParam<VALUE_TYPE, NAME_VALUE_LOOKUP, true, false> self_t;
+ typedef ParamValue<VALUE_TYPE, NAME_VALUE_LOOKUP> param_value_t;
+ typedef typename std::vector<param_value_t> container_t;
+ typedef const container_t& value_assignment_t;
+
+ typedef typename param_value_t::value_t value_t;
+ typedef NAME_VALUE_LOOKUP name_value_lookup_t;
+
+ TypedParam(BlockDescriptor& block_descriptor, const char* name, value_assignment_t value, ParamDescriptor::validation_func_t validate_func, S32 min_count, S32 max_count)
+ : Param(block_descriptor.mCurrentBlockPtr)
+ {
+ std::copy(value.begin(), value.end(), std::back_inserter(mValues));
+
+ if (LL_UNLIKELY(block_descriptor.mInitializationState == BlockDescriptor::INITIALIZING))
+ {
+ ParamDescriptorPtr param_descriptor = ParamDescriptorPtr(new ParamDescriptor(
+ block_descriptor.mCurrentBlockPtr->getHandleFromParam(this),
+ &mergeWith,
+ &deserializeParam,
+ &serializeParam,
+ validate_func,
+ &inspectParam,
+ min_count, max_count));
+ BaseBlock::addParam(block_descriptor, param_descriptor, name);
+ }
+ }
+
+ bool isProvided() const { return Param::anyProvided(); }
+
+ static bool deserializeParam(Param& param, Parser& parser, const Parser::name_stack_range_t& name_stack_range, bool new_name)
+ {
+ self_t& typed_param = static_cast<self_t&>(param);
+ value_t value;
+ // no further names in stack, attempt to parse value now
+ if (name_stack_range.first == name_stack_range.second)
+ {
+ // attempt to read value directly
+ if (parser.readValue(value))
+ {
+ typed_param.add(value);
+ return true;
+ }
+
+ // try to parse a known named value
+ if(name_value_lookup_t::valueNamesExist())
+ {
+ // try to parse a known named value
+ std::string name;
+ if (parser.readValue(name))
+ {
+ // try to parse a per type named value
+ if (name_value_lookup_t::getValueFromName(name, value))
+ {
+ typed_param.add(value);
+ typed_param.mValues.back().setValueName(name);
+ return true;
+ }
+
+ }
+ }
+ }
+ return false;
+ }
+
+ static void serializeParam(const Param& param, Parser& parser, Parser::name_stack_t& name_stack, const Param* diff_param)
+ {
+ const self_t& typed_param = static_cast<const self_t&>(param);
+ if (!typed_param.isProvided() || name_stack.empty()) return;
+
+ for (const_iterator it = typed_param.mValues.begin(), end_it = typed_param.mValues.end();
+ it != end_it;
+ ++it)
+ {
+ std::string key = it->getValueName();
+ name_stack.back().second = true;
+
+ if(key.empty())
+ // not parsed via name values, write out value directly
+ {
+ bool value_written = parser.writeValue(*it, name_stack);
+ if (!value_written)
+ {
+ std::string calculated_key = it->calcValueName(it->getValue());
+ if (!parser.writeValue(calculated_key, name_stack))
+ {
+ break;
+ }
+ }
+ }
+ else
+ {
+ if(!parser.writeValue(key, name_stack))
+ {
+ break;
+ }
+ }
+ }
+ }
+
+ static void inspectParam(const Param& param, Parser& parser, Parser::name_stack_t& name_stack, S32 min_count, S32 max_count)
+ {
+ parser.inspectValue<VALUE_TYPE>(name_stack, min_count, max_count, NULL);
+ if (name_value_lookup_t::getPossibleValues())
+ {
+ parser.inspectValue<std::string>(name_stack, min_count, max_count, name_value_lookup_t::getPossibleValues());
+ }
+ }
+
+ void set(value_assignment_t val, bool flag_as_provided = true)
+ {
+ mValues = val;
+ setProvided(flag_as_provided);
+ }
+
+ param_value_t& add()
+ {
+ mValues.push_back(param_value_t(value_t()));
+ Param::setProvided();
+ return mValues.back();
+ }
+
+ void add(const value_t& item)
+ {
+ param_value_t param_value;
+ param_value.setValue(item);
+ mValues.push_back(param_value);
+ setProvided();
+ }
+
+ void add(const typename name_value_lookup_t::name_t& name)
+ {
+ value_t value;
+
+ // try to parse a per type named value
+ if (name_value_lookup_t::getValueFromName(name, value))
+ {
+ add(value);
+ mValues.back().setValueName(name);
+ }
+ }
+
+ // implicit conversion
+ operator value_assignment_t() const { return mValues; }
+ // explicit conversion
+ value_assignment_t operator()() const { return mValues; }
+
+ typedef typename container_t::iterator iterator;
+ typedef typename container_t::const_iterator const_iterator;
+ iterator begin() { return mValues.begin(); }
+ iterator end() { return mValues.end(); }
+ const_iterator begin() const { return mValues.begin(); }
+ const_iterator end() const { return mValues.end(); }
+ bool empty() const { return mValues.empty(); }
+ size_t size() const { return mValues.size(); }
+
+ U32 numValidElements() const
+ {
+ return mValues.size();
+ }
+
+ protected:
+ static bool mergeWith(Param& dst, const Param& src, bool overwrite)
+ {
+ const self_t& src_typed_param = static_cast<const self_t&>(src);
+ self_t& dst_typed_param = static_cast<self_t&>(dst);
+
+ if (overwrite)
+ {
+ std::copy(src_typed_param.begin(), src_typed_param.end(), std::back_inserter(dst_typed_param.mValues));
+ }
+ else
+ {
+ container_t new_values(src_typed_param.mValues);
+ std::copy(dst_typed_param.begin(), dst_typed_param.end(), std::back_inserter(new_values));
+ std::swap(dst_typed_param.mValues, new_values);
+ }
+
+ if (src_typed_param.begin() != src_typed_param.end())
+ {
+ dst_typed_param.setProvided();
+ }
+ return true;
+ }
+
+ container_t mValues;
+ };
+
+ // container of block parameters
+ template <typename VALUE_TYPE, typename NAME_VALUE_LOOKUP>
+ class TypedParam<VALUE_TYPE, NAME_VALUE_LOOKUP, true, true>
+ : public Param
+ {
+ public:
+ typedef TypedParam<VALUE_TYPE, NAME_VALUE_LOOKUP, true, true> self_t;
+ typedef ParamValue<VALUE_TYPE, NAME_VALUE_LOOKUP> param_value_t;
+ typedef typename std::vector<param_value_t> container_t;
+ typedef const container_t& value_assignment_t;
+ typedef typename param_value_t::value_t value_t;
+ typedef NAME_VALUE_LOOKUP name_value_lookup_t;
+
+ TypedParam(BlockDescriptor& block_descriptor, const char* name, value_assignment_t value, ParamDescriptor::validation_func_t validate_func, S32 min_count, S32 max_count)
+ : Param(block_descriptor.mCurrentBlockPtr)
+ {
+ std::copy(value.begin(), value.end(), back_inserter(mValues));
+
+ if (LL_UNLIKELY(block_descriptor.mInitializationState == BlockDescriptor::INITIALIZING))
+ {
+ ParamDescriptorPtr param_descriptor = ParamDescriptorPtr(new ParamDescriptor(
+ block_descriptor.mCurrentBlockPtr->getHandleFromParam(this),
+ &mergeWith,
+ &deserializeParam,
+ &serializeParam,
+ validate_func,
+ &inspectParam,
+ min_count, max_count));
+ BaseBlock::addParam(block_descriptor, param_descriptor, name);
+ }
+ }
+
+ bool isProvided() const { return Param::anyProvided(); }
+
+ static bool deserializeParam(Param& param, Parser& parser, const Parser::name_stack_range_t& name_stack_range, bool new_name)
+ {
+ self_t& typed_param = static_cast<self_t&>(param);
+ bool new_value = false;
+
+ if (new_name || typed_param.mValues.empty())
+ {
+ new_value = true;
+ typed_param.mValues.push_back(value_t());
+ }
+
+ param_value_t& value = typed_param.mValues.back();
+
+ // attempt to parse block...
+ if(value.deserializeBlock(parser, name_stack_range, new_name))
+ {
+ typed_param.setProvided();
+ return true;
+ }
+ else if(name_value_lookup_t::valueNamesExist())
+ {
+ // try to parse a known named value
+ std::string name;
+ if (parser.readValue(name))
+ {
+ // try to parse a per type named value
+ if (name_value_lookup_t::getValueFromName(name, value.getValue()))
+ {
+ typed_param.mValues.back().setValueName(name);
+ typed_param.setProvided();
+ return true;
+ }
+
+ }
+ }
+
+ if (new_value)
+ { // failed to parse new value, pop it off
+ typed_param.mValues.pop_back();
+ }
+
+ return false;
+ }
+
+ static void serializeParam(const Param& param, Parser& parser, Parser::name_stack_t& name_stack, const Param* diff_param)
+ {
+ const self_t& typed_param = static_cast<const self_t&>(param);
+ if (!typed_param.isProvided() || name_stack.empty()) return;
+
+ for (const_iterator it = typed_param.mValues.begin(), end_it = typed_param.mValues.end();
+ it != end_it;
+ ++it)
+ {
+ name_stack.back().second = true;
+
+ std::string key = it->getValueName();
+ if (!key.empty())
+ {
+ parser.writeValue(key, name_stack);
+ }
+ // Not parsed via named values, write out value directly
+ // NOTE: currently we don't worry about removing default values in Multiple
+ else
+ {
+ it->serializeBlock(parser, name_stack, NULL);
+ }
+ }
+ }
+
+ static void inspectParam(const Param& param, Parser& parser, Parser::name_stack_t& name_stack, S32 min_count, S32 max_count)
+ {
+ // I am a vector of blocks, so describe my contents recursively
+ param_value_t(value_t()).inspectBlock(parser, name_stack, min_count, max_count);
+ }
+
+ void set(value_assignment_t val, bool flag_as_provided = true)
+ {
+ mValues = val;
+ setProvided(flag_as_provided);
+ }
+
+ param_value_t& add()
+ {
+ mValues.push_back(value_t());
+ setProvided();
+ return mValues.back();
+ }
+
+ void add(const value_t& item)
+ {
+ mValues.push_back(item);
+ setProvided();
+ }
+
+ void add(const typename name_value_lookup_t::name_t& name)
+ {
+ value_t value;
+
+ // try to parse a per type named value
+ if (name_value_lookup_t::getValueFromName(name, value))
+ {
+ add(value);
+ mValues.back().setValueName(name);
+ }
+ }
+
+ // implicit conversion
+ operator value_assignment_t() const { return mValues; }
+ // explicit conversion
+ value_assignment_t operator()() const { return mValues; }
+
+ typedef typename container_t::iterator iterator;
+ typedef typename container_t::const_iterator const_iterator;
+ iterator begin() { return mValues.begin(); }
+ iterator end() { return mValues.end(); }
+ const_iterator begin() const { return mValues.begin(); }
+ const_iterator end() const { return mValues.end(); }
+ bool empty() const { return mValues.empty(); }
+ size_t size() const { return mValues.size(); }
+
+ U32 numValidElements() const
+ {
+ U32 count = 0;
+ for (const_iterator it = mValues.begin(), end_it = mValues.end();
+ it != end_it;
+ ++it)
+ {
+ if(it->validateBlock(false)) count++;
+ }
+ return count;
+ }
+
+ protected:
+
+ static bool mergeWith(Param& dst, const Param& src, bool overwrite)
+ {
+ const self_t& src_typed_param = static_cast<const self_t&>(src);
+ self_t& dst_typed_param = static_cast<self_t&>(dst);
+
+ if (overwrite)
+ {
+ std::copy(src_typed_param.begin(), src_typed_param.end(), std::back_inserter(dst_typed_param.mValues));
+ }
+ else
+ {
+ container_t new_values(src_typed_param.mValues);
+ std::copy(dst_typed_param.begin(), dst_typed_param.end(), std::back_inserter(new_values));
+ std::swap(dst_typed_param.mValues, new_values);
+ }
+
+ if (src_typed_param.begin() != src_typed_param.end())
+ {
+ dst_typed_param.setProvided();
+ }
+
+ return true;
+ }
+
+ container_t mValues;
+ };
+
+ template <typename DERIVED_BLOCK, typename BASE_BLOCK = BaseBlock>
+ class ChoiceBlock : public BASE_BLOCK
+ {
+ typedef ChoiceBlock<DERIVED_BLOCK, BASE_BLOCK> self_t;
+ typedef ChoiceBlock<DERIVED_BLOCK, BASE_BLOCK> enclosing_block_t;
+ typedef BASE_BLOCK base_block_t;
+
+ LOG_CLASS(self_t);
+ public:
+ // take all provided params from other and apply to self
+ bool overwriteFrom(const self_t& other)
+ {
+ return static_cast<DERIVED_BLOCK*>(this)->mergeBlock(selfBlockDescriptor(), other, true);
+ }
+
+ // take all provided params that are not already provided, and apply to self
+ bool fillFrom(const self_t& other)
+ {
+ return static_cast<DERIVED_BLOCK*>(this)->mergeBlock(selfBlockDescriptor(), other, false);
+ }
+
+ bool mergeBlockParam(bool source_provided, bool dest_provided, BlockDescriptor& block_data, const self_t& source, bool overwrite)
+ {
+ bool source_override = source_provided && (overwrite || !dest_provided);
+
+ if (source_override || source.mCurChoice == mCurChoice)
+ {
+ return mergeBlock(block_data, source, overwrite);
+ }
+ return false;
+ }
+
+ // merge with other block
+ bool mergeBlock(BlockDescriptor& block_data, const self_t& other, bool overwrite)
+ {
+ mCurChoice = other.mCurChoice;
+ return base_block_t::mergeBlock(selfBlockDescriptor(), other, overwrite);
+ }
+
+ // clear out old choice when param has changed
+ /*virtual*/ void paramChanged(const Param& changed_param, bool user_provided)
+ {
+ param_handle_t changed_param_handle = base_block_t::getHandleFromParam(&changed_param);
+ // if we have a new choice...
+ if (changed_param_handle != mCurChoice)
+ {
+ // clear provided flag on previous choice
+ Param* previous_choice = base_block_t::getParamFromHandle(mCurChoice);
+ if (previous_choice)
+ {
+ previous_choice->setProvided(false);
+ }
+ mCurChoice = changed_param_handle;
+ }
+ base_block_t::paramChanged(changed_param, user_provided);
+ }
+
+ virtual const BlockDescriptor& mostDerivedBlockDescriptor() const { return selfBlockDescriptor(); }
+ virtual BlockDescriptor& mostDerivedBlockDescriptor() { return selfBlockDescriptor(); }
+
+ protected:
+ ChoiceBlock()
+ : mCurChoice(0)
+ {
+ BaseBlock::init(selfBlockDescriptor(), base_block_t::selfBlockDescriptor(), sizeof(DERIVED_BLOCK));
+ }
+
+ // Alternatives are mutually exclusive wrt other Alternatives in the same block.
+ // One alternative in a block will always have isChosen() == true.
+ // At most one alternative in a block will have isProvided() == true.
+ template <typename T, typename NAME_VALUE_LOOKUP = TypeValues<T> >
+ class Alternative : public TypedParam<T, NAME_VALUE_LOOKUP, false>
+ {
+ public:
+ friend class ChoiceBlock<DERIVED_BLOCK>;
+
+ typedef Alternative<T, NAME_VALUE_LOOKUP> self_t;
+ typedef TypedParam<T, NAME_VALUE_LOOKUP, false, IsBlock<ParamValue<T, NAME_VALUE_LOOKUP> >::value> super_t;
+ typedef typename super_t::value_assignment_t value_assignment_t;
+
+ using super_t::operator =;
+
+ explicit Alternative(const char* name = "", value_assignment_t val = defaultValue<T>())
+ : super_t(DERIVED_BLOCK::selfBlockDescriptor(), name, val, NULL, 0, 1),
+ mOriginalValue(val)
+ {
+ // assign initial choice to first declared option
+ DERIVED_BLOCK* blockp = ((DERIVED_BLOCK*)DERIVED_BLOCK::selfBlockDescriptor().mCurrentBlockPtr);
+ if (LL_UNLIKELY(DERIVED_BLOCK::selfBlockDescriptor().mInitializationState == BlockDescriptor::INITIALIZING))
+ {
+ if(blockp->mCurChoice == 0)
+ {
+ blockp->mCurChoice = Param::enclosingBlock().getHandleFromParam(this);
+ }
+ }
+ }
+
+ void choose()
+ {
+ static_cast<enclosing_block_t&>(Param::enclosingBlock()).paramChanged(*this, true);
+ }
+
+ void chooseAs(value_assignment_t val)
+ {
+ super_t::set(val);
+ }
+
+ void operator =(value_assignment_t val)
+ {
+ super_t::set(val);
+ }
+
+ void operator()(typename super_t::value_assignment_t val)
+ {
+ super_t::set(val);
+ }
+
+ operator value_assignment_t() const
+ {
+ return (*this)();
+ }
+
+ value_assignment_t operator()() const
+ {
+ if (static_cast<enclosing_block_t&>(Param::enclosingBlock()).getCurrentChoice() == this)
+ {
+ return super_t::getValue();
+ }
+ return mOriginalValue;
+ }
+
+ bool isChosen() const
+ {
+ return static_cast<enclosing_block_t&>(Param::enclosingBlock()).getCurrentChoice() == this;
+ }
+
+ private:
+ T mOriginalValue;
+ };
+
+ protected:
+ static BlockDescriptor& selfBlockDescriptor()
+ {
+ static BlockDescriptor sBlockDescriptor;
+ return sBlockDescriptor;
+ }
+
+ private:
+ param_handle_t mCurChoice;
+
+ const Param* getCurrentChoice() const
+ {
+ return base_block_t::getParamFromHandle(mCurChoice);
+ }
+ };
+
+ template <typename DERIVED_BLOCK, typename BASE_BLOCK = BaseBlock>
+ class Block
+ : public BASE_BLOCK
+ {
+ typedef Block<DERIVED_BLOCK, BASE_BLOCK> self_t;
+ typedef Block<DERIVED_BLOCK, BASE_BLOCK> block_t;
+
+ public:
+ typedef BASE_BLOCK base_block_t;
+
+ // take all provided params from other and apply to self
+ bool overwriteFrom(const self_t& other)
+ {
+ return static_cast<DERIVED_BLOCK*>(this)->mergeBlock(selfBlockDescriptor(), other, true);
+ }
+
+ // take all provided params that are not already provided, and apply to self
+ bool fillFrom(const self_t& other)
+ {
+ return static_cast<DERIVED_BLOCK*>(this)->mergeBlock(selfBlockDescriptor(), other, false);
+ }
+
+ virtual const BlockDescriptor& mostDerivedBlockDescriptor() const { return selfBlockDescriptor(); }
+ virtual BlockDescriptor& mostDerivedBlockDescriptor() { return selfBlockDescriptor(); }
+
+ protected:
+ Block()
+ {
+ //#pragma message("Parsing LLInitParam::Block")
+ BaseBlock::init(selfBlockDescriptor(), BASE_BLOCK::selfBlockDescriptor(), sizeof(DERIVED_BLOCK));
+ }
+
+ //
+ // Nested classes for declaring parameters
+ //
+ template <typename T, typename NAME_VALUE_LOOKUP = TypeValues<T> >
+ class Optional : public TypedParam<T, NAME_VALUE_LOOKUP, false>
+ {
+ public:
+ typedef TypedParam<T, NAME_VALUE_LOOKUP, false, IsBlock<ParamValue<T, NAME_VALUE_LOOKUP> >::value> super_t;
+ typedef typename super_t::value_assignment_t value_assignment_t;
+
+ using super_t::operator();
+ using super_t::operator =;
+
+ explicit Optional(const char* name = "", value_assignment_t val = defaultValue<T>())
+ : super_t(DERIVED_BLOCK::selfBlockDescriptor(), name, val, NULL, 0, 1)
+ {
+ //#pragma message("Parsing LLInitParam::Block::Optional")
+ }
+
+ Optional& operator =(value_assignment_t val)
+ {
+ set(val);
+ return *this;
+ }
+
+ DERIVED_BLOCK& operator()(value_assignment_t val)
+ {
+ super_t::set(val);
+ return static_cast<DERIVED_BLOCK&>(Param::enclosingBlock());
+ }
+ };
+
+ template <typename T, typename NAME_VALUE_LOOKUP = TypeValues<T> >
+ class Mandatory : public TypedParam<T, NAME_VALUE_LOOKUP, false>
+ {
+ public:
+ typedef TypedParam<T, NAME_VALUE_LOOKUP, false, IsBlock<ParamValue<T, NAME_VALUE_LOOKUP> >::value> super_t;
+ typedef Mandatory<T, NAME_VALUE_LOOKUP> self_t;
+ typedef typename super_t::value_assignment_t value_assignment_t;
+
+ using super_t::operator();
+ using super_t::operator =;
+
+ // mandatory parameters require a name to be parseable
+ explicit Mandatory(const char* name = "", value_assignment_t val = defaultValue<T>())
+ : super_t(DERIVED_BLOCK::selfBlockDescriptor(), name, val, &validate, 1, 1)
+ {}
+
+ Mandatory& operator =(value_assignment_t val)
+ {
+ set(val);
+ return *this;
+ }
+
+ DERIVED_BLOCK& operator()(typename super_t::value_assignment_t val)
+ {
+ super_t::set(val);
+ return static_cast<DERIVED_BLOCK&>(Param::enclosingBlock());
+ }
+
+ static bool validate(const Param* p)
+ {
+ // valid only if provided
+ return static_cast<const self_t*>(p)->isProvided();
+ }
+
+ };
+
+ template <typename T, typename RANGE = BaseBlock::AnyAmount, typename NAME_VALUE_LOOKUP = TypeValues<T> >
+ class Multiple : public TypedParam<T, NAME_VALUE_LOOKUP, true>
+ {
+ public:
+ typedef TypedParam<T, NAME_VALUE_LOOKUP, true, IsBlock<ParamValue<T, NAME_VALUE_LOOKUP> >::value> super_t;
+ typedef Multiple<T, RANGE, NAME_VALUE_LOOKUP> self_t;
+ typedef typename super_t::container_t container_t;
+ typedef typename super_t::value_assignment_t value_assignment_t;
+ typedef typename super_t::iterator iterator;
+ typedef typename super_t::const_iterator const_iterator;
+
+ explicit Multiple(const char* name = "")
+ : super_t(DERIVED_BLOCK::selfBlockDescriptor(), name, container_t(), &validate, RANGE::minCount, RANGE::maxCount)
+ {}
+
+ Multiple& operator =(value_assignment_t val)
+ {
+ set(val);
+ return *this;
+ }
+
+ DERIVED_BLOCK& operator()(typename super_t::value_assignment_t val)
+ {
+ super_t::set(val);
+ return static_cast<DERIVED_BLOCK&>(Param::enclosingBlock());
+ }
+
+ static bool validate(const Param* paramp)
+ {
+ U32 num_valid = ((super_t*)paramp)->numValidElements();
+ return RANGE::minCount <= num_valid && num_valid <= RANGE::maxCount;
+ }
+ };
+
+ class Deprecated : public Param
+ {
+ public:
+ explicit Deprecated(const char* name)
+ : Param(DERIVED_BLOCK::selfBlockDescriptor().mCurrentBlockPtr)
+ {
+ BlockDescriptor& block_descriptor = DERIVED_BLOCK::selfBlockDescriptor();
+ if (LL_UNLIKELY(block_descriptor.mInitializationState == BlockDescriptor::INITIALIZING))
+ {
+ ParamDescriptorPtr param_descriptor = ParamDescriptorPtr(new ParamDescriptor(
+ block_descriptor.mCurrentBlockPtr->getHandleFromParam(this),
+ NULL,
+ &deserializeParam,
+ NULL,
+ NULL,
+ NULL,
+ 0, S32_MAX));
+ BaseBlock::addParam(block_descriptor, param_descriptor, name);
+ }
+ }
+
+ static bool deserializeParam(Param& param, Parser& parser, const Parser::name_stack_range_t& name_stack_range, bool new_name)
+ {
+ if (name_stack_range.first == name_stack_range.second)
+ {
+ //std::string message = llformat("Deprecated value %s ignored", getName().c_str());
+ //parser.parserWarning(message);
+ return true;
+ }
+
+ return false;
+ }
+ };
+
+ // different semantics for documentation purposes, but functionally identical
+ typedef Deprecated Ignored;
+
+ protected:
+ static BlockDescriptor& selfBlockDescriptor()
+ {
+ static BlockDescriptor sBlockDescriptor;
+ return sBlockDescriptor;
+ }
+
+ template <typename T, typename NAME_VALUE_LOOKUP, bool multiple, bool is_block>
+ void changeDefault(TypedParam<T, NAME_VALUE_LOOKUP, multiple, is_block>& param,
+ typename TypedParam<T, NAME_VALUE_LOOKUP, multiple, is_block>::value_assignment_t value)
+ {
+ if (!param.isProvided())
+ {
+ param.set(value, false);
+ }
+ }
+
+ };
+
+ template <typename DERIVED_BLOCK, typename BASE_BLOCK = BaseBlock>
+ class BatchBlock
+ : public Block<DERIVED_BLOCK, BASE_BLOCK>
+ {
+ public:
+ typedef BatchBlock<DERIVED_BLOCK, BASE_BLOCK> self_t;
+ typedef Block<DERIVED_BLOCK, BASE_BLOCK> super_t;
+
+ BatchBlock()
+ {}
+
+ bool deserializeBlock(Parser& p, Parser::name_stack_range_t name_stack_range, bool new_name)
+ {
+ if (new_name)
+ {
+ // reset block
+ *static_cast<DERIVED_BLOCK*>(this) = defaultBatchValue();
+ }
+ return super_t::deserializeBlock(p, name_stack_range, new_name);
+ }
+
+ bool mergeBlock(BlockDescriptor& block_data, const BaseBlock& other, bool overwrite)
+ {
+ if (overwrite)
+ {
+ *static_cast<DERIVED_BLOCK*>(this) = defaultBatchValue();
+ // merge individual parameters into destination
+ return super_t::mergeBlock(super_t::selfBlockDescriptor(), other, overwrite);
+ }
+ return false;
+ }
+ protected:
+ static const DERIVED_BLOCK& defaultBatchValue()
+ {
+ static DERIVED_BLOCK default_value;
+ return default_value;
+ }
+ };
+
+ // FIXME: this specialization is not currently used, as it only matches against the BatchBlock base class
+ // and not the derived class with the actual params
+ template<typename DERIVED_BLOCK,
+ typename BASE_BLOCK,
+ typename NAME_VALUE_LOOKUP>
+ class ParamValue <BatchBlock<DERIVED_BLOCK, BASE_BLOCK>,
+ NAME_VALUE_LOOKUP,
+ true>
+ : public NAME_VALUE_LOOKUP,
+ protected BatchBlock<DERIVED_BLOCK, BASE_BLOCK>
+ {
+ public:
+ typedef BatchBlock<DERIVED_BLOCK, BASE_BLOCK> block_t;
+ typedef const BatchBlock<DERIVED_BLOCK, BASE_BLOCK>& value_assignment_t;
+ typedef block_t value_t;
+
+ ParamValue()
+ : block_t(),
+ mValidated(false)
+ {}
+
+ ParamValue(value_assignment_t other)
+ : block_t(other),
+ mValidated(false)
+ {
+ }
+
+ void setValue(value_assignment_t val)
+ {
+ *this = val;
+ }
+
+ value_assignment_t getValue() const
+ {
+ return *this;
+ }
+
+ BatchBlock<DERIVED_BLOCK, BASE_BLOCK>& getValue()
+ {
+ return *this;
+ }
+
+ operator value_assignment_t() const
+ {
+ return *this;
+ }
+
+ value_assignment_t operator()() const
+ {
+ return *this;
+ }
+
+ protected:
+ mutable bool mValidated; // lazy validation flag
+ };
+
+ template<typename T, bool IS_BLOCK>
+ class ParamValue <BaseBlock::Lazy<T>,
+ TypeValues<T>,
+ IS_BLOCK>
+ : public IsBlock<T>::base_class_t
+ {
+ public:
+ typedef ParamValue <BaseBlock::Lazy<T>, TypeValues<T>, false> self_t;
+ typedef const T& value_assignment_t;
+ typedef T value_t;
+
+ ParamValue()
+ : mValue(),
+ mValidated(false)
+ {}
+
+ ParamValue(value_assignment_t other)
+ : mValue(other),
+ mValidated(false)
+ {}
+
+ void setValue(value_assignment_t val)
+ {
+ mValue.set(val);
+ }
+
+ value_assignment_t getValue() const
+ {
+ return mValue.get();
+ }
+
+ T& getValue()
+ {
+ return mValue.get();
+ }
+
+ operator value_assignment_t() const
+ {
+ return mValue.get();
+ }
+
+ value_assignment_t operator()() const
+ {
+ return mValue.get();
+ }
+
+ bool deserializeBlock(Parser& p, Parser::name_stack_range_t name_stack_range, bool new_name)
+ {
+ return mValue.get().deserializeBlock(p, name_stack_range, new_name);
+ }
+
+ void serializeBlock(Parser& p, Parser::name_stack_t& name_stack, const BaseBlock* diff_block = NULL) const
+ {
+ if (mValue.empty()) return;
+
+ mValue.get().serializeBlock(p, name_stack, diff_block);
+ }
+
+ bool inspectBlock(Parser& p, Parser::name_stack_t name_stack = Parser::name_stack_t(), S32 min_count = 0, S32 max_count = S32_MAX) const
+ {
+ if (mValue.empty()) return false;
+
+ return mValue.get().inspectBlock(p, name_stack, min_count, max_count);
+ }
+
+ protected:
+ mutable bool mValidated; // lazy validation flag
+
+ private:
+ BaseBlock::Lazy<T> mValue;
+ };
+
+ template <>
+ class ParamValue <LLSD,
+ TypeValues<LLSD>,
+ false>
+ : public TypeValues<LLSD>,
+ public BaseBlock
+ {
+ public:
+ typedef ParamValue<LLSD, TypeValues<LLSD>, false> self_t;
+ typedef const LLSD& value_assignment_t;
+
+ ParamValue()
+ : mValidated(false)
+ {}
+
+ ParamValue(value_assignment_t other)
+ : mValue(other),
+ mValidated(false)
+ {}
+
+ void setValue(value_assignment_t val) { mValue = val; }
+
+ value_assignment_t getValue() const { return mValue; }
+ LLSD& getValue() { return mValue; }
+
+ operator value_assignment_t() const { return mValue; }
+ value_assignment_t operator()() const { return mValue; }
+
+
+ // block param interface
+ LL_COMMON_API bool deserializeBlock(Parser& p, Parser::name_stack_range_t name_stack_range, bool new_name);
+ LL_COMMON_API void serializeBlock(Parser& p, Parser::name_stack_t& name_stack, const BaseBlock* diff_block = NULL) const;
+ bool inspectBlock(Parser& p, Parser::name_stack_t name_stack = Parser::name_stack_t(), S32 min_count = 0, S32 max_count = S32_MAX) const
+ {
+ //TODO: implement LLSD params as schema type Any
+ return true;
+ }
+
+ protected:
+ mutable bool mValidated; // lazy validation flag
+
+ private:
+ static void serializeElement(Parser& p, const LLSD& sd, Parser::name_stack_t& name_stack);
+
+ LLSD mValue;
+ };
+
+ template<typename T>
+ class CustomParamValue
+ : public Block<ParamValue<T, TypeValues<T> > >,
+ public TypeValues<T>
+ {
+ public:
+ typedef enum e_value_age
+ {
+ VALUE_NEEDS_UPDATE, // mValue needs to be refreshed from the block parameters
+ VALUE_AUTHORITATIVE, // mValue holds the authoritative value (which has been replicated to the block parameters via updateBlockFromValue)
+ BLOCK_AUTHORITATIVE // mValue is derived from the block parameters, which are authoritative
+ } EValueAge;
+
+ typedef ParamValue<T, TypeValues<T> > derived_t;
+ typedef CustomParamValue<T> self_t;
+ typedef Block<derived_t> block_t;
+ typedef const T& value_assignment_t;
+ typedef T value_t;
+
+
+ CustomParamValue(const T& value = T())
+ : mValue(value),
+ mValueAge(VALUE_AUTHORITATIVE),
+ mValidated(false)
+ {}
+
+ bool deserializeBlock(Parser& parser, Parser::name_stack_range_t name_stack_range, bool new_name)
+ {
+ derived_t& typed_param = static_cast<derived_t&>(*this);
+ // try to parse direct value T
+ if (name_stack_range.first == name_stack_range.second)
+ {
+ if(parser.readValue(typed_param.mValue))
+ {
+ typed_param.mValueAge = VALUE_AUTHORITATIVE;
+ typed_param.updateBlockFromValue(false);
+
+ typed_param.clearValueName();
+
+ return true;
+ }
+ }
+
+ // fall back on parsing block components for T
+ return typed_param.BaseBlock::deserializeBlock(parser, name_stack_range, new_name);
+ }
+
+ void serializeBlock(Parser& parser, Parser::name_stack_t& name_stack, const BaseBlock* diff_block = NULL) const
+ {
+ const derived_t& typed_param = static_cast<const derived_t&>(*this);
+ const derived_t* diff_param = static_cast<const derived_t*>(diff_block);
+
+ std::string key = typed_param.getValueName();
+
+ // first try to write out name of name/value pair
+ if (!key.empty())
+ {
+ if (!diff_param || !ParamCompare<std::string>::equals(diff_param->getValueName(), key))
+ {
+ parser.writeValue(key, name_stack);
+ }
+ }
+ // then try to serialize value directly
+ else if (!diff_param || !ParamCompare<T>::equals(typed_param.getValue(), diff_param->getValue()))
+ {
+
+ if (!parser.writeValue(typed_param.getValue(), name_stack))
+ {
+ //RN: *always* serialize provided components of BlockValue (don't pass diff_param on),
+ // since these tend to be viewed as the constructor arguments for the value T. It seems
+ // cleaner to treat the uniqueness of a BlockValue according to the generated value, and
+ // not the individual components. This way <color red="0" green="1" blue="0"/> will not
+ // be exported as <color green="1"/>, since it was probably the intent of the user to
+ // be specific about the RGB color values. This also fixes an issue where we distinguish
+ // between rect.left not being provided and rect.left being explicitly set to 0 (same as default)
+
+ if (typed_param.mValueAge == VALUE_AUTHORITATIVE)
+ {
+ // if the value is authoritative but the parser doesn't accept the value type
+ // go ahead and make a copy, and splat the value out to its component params
+ // and serialize those params
+ derived_t copy(typed_param);
+ copy.updateBlockFromValue(true);
+ copy.block_t::serializeBlock(parser, name_stack, NULL);
+ }
+ else
+ {
+ block_t::serializeBlock(parser, name_stack, NULL);
+ }
+ }
+ }
+ }
+
+ bool inspectBlock(Parser& parser, Parser::name_stack_t name_stack = Parser::name_stack_t(), S32 min_count = 0, S32 max_count = S32_MAX) const
+ {
+ // first, inspect with actual type...
+ parser.inspectValue<T>(name_stack, min_count, max_count, NULL);
+ if (TypeValues<T>::getPossibleValues())
+ {
+ //...then inspect with possible string values...
+ parser.inspectValue<std::string>(name_stack, min_count, max_count, TypeValues<T>::getPossibleValues());
+ }
+ // then recursively inspect contents...
+ return block_t::inspectBlock(parser, name_stack, min_count, max_count);
+ }
+
+ bool validateBlock(bool emit_errors = true) const
+ {
+ if (mValueAge == VALUE_NEEDS_UPDATE)
+ {
+ if (block_t::validateBlock(emit_errors))
+ {
+ // clear stale keyword associated with old value
+ TypeValues<T>::clearValueName();
+ mValueAge = BLOCK_AUTHORITATIVE;
+ static_cast<derived_t*>(const_cast<self_t*>(this))->updateValueFromBlock();
+ return true;
+ }
+ else
+ {
+ //block value incomplete, so not considered provided
+ // will attempt to revalidate on next call to isProvided()
+ return false;
+ }
+ }
+ else
+ {
+ // we have a valid value in hand
+ return true;
+ }
+ }
+
+ // propagate change status up to enclosing block
+ /*virtual*/ void paramChanged(const Param& changed_param, bool user_provided)
+ {
+ BaseBlock::paramChanged(changed_param, user_provided);
+ if (user_provided)
+ {
+ // a parameter changed, so our value is out of date
+ mValueAge = VALUE_NEEDS_UPDATE;
+ }
+ }
+
+ void setValue(value_assignment_t val)
+ {
+ derived_t& typed_param = static_cast<derived_t&>(*this);
+ // set param version number to be up to date, so we ignore block contents
+ mValueAge = VALUE_AUTHORITATIVE;
+ mValue = val;
+ typed_param.clearValueName();
+ static_cast<derived_t*>(this)->updateBlockFromValue(false);
+ }
+
+ value_assignment_t getValue() const
+ {
+ validateBlock(true);
+ return mValue;
+ }
+
+ T& getValue()
+ {
+ validateBlock(true);
+ return mValue;
+ }
+
+ operator value_assignment_t() const
+ {
+ return getValue();
+ }
+
+ value_assignment_t operator()() const
+ {
+ return getValue();
+ }
+
+ protected:
+
+ // use this from within updateValueFromBlock() to set the value without making it authoritative
+ void updateValue(value_assignment_t value)
+ {
+ mValue = value;
+ }
+
+ bool mergeBlockParam(bool source_provided, bool dst_provided, BlockDescriptor& block_data, const BaseBlock& source, bool overwrite)
+ {
+ bool source_override = source_provided && (overwrite || !dst_provided);
+
+ const derived_t& src_typed_param = static_cast<const derived_t&>(source);
+
+ if (source_override && src_typed_param.mValueAge == VALUE_AUTHORITATIVE)
+ {
+ // copy value over
+ setValue(src_typed_param.getValue());
+ return true;
+ }
+ // merge individual parameters into destination
+ if (mValueAge == VALUE_AUTHORITATIVE)
+ {
+ static_cast<derived_t*>(this)->updateBlockFromValue(dst_provided);
+ }
+ return mergeBlock(block_data, source, overwrite);
+ }
+
+ bool mergeBlock(BlockDescriptor& block_data, const BaseBlock& source, bool overwrite)
+ {
+ return block_t::mergeBlock(block_data, source, overwrite);
+ }
+
+ mutable bool mValidated; // lazy validation flag
+
+ private:
+ mutable T mValue;
+ mutable EValueAge mValueAge;
+ };
+}
+
+
+#endif // LL_LLPARAM_H
diff --git a/indra/llcommon/llinstancetracker.h b/indra/llcommon/llinstancetracker.h
index 5a3990a8df..403df08990 100644
--- a/indra/llcommon/llinstancetracker.h
+++ b/indra/llcommon/llinstancetracker.h
@@ -167,8 +167,9 @@ public:
static T* getInstance(const KEY& k)
{
- typename InstanceMap::const_iterator found = getMap_().find(k);
- return (found == getMap_().end()) ? NULL : found->second;
+ const InstanceMap& map(getMap_());
+ typename InstanceMap::const_iterator found = map.find(k);
+ return (found == map.end()) ? NULL : found->second;
}
static instance_iter beginInstances()
@@ -193,7 +194,12 @@ public:
}
protected:
- LLInstanceTracker(KEY key) { add_(key); }
+ LLInstanceTracker(KEY key)
+ {
+ // make sure static data outlives all instances
+ getStatic();
+ add_(key);
+ }
virtual ~LLInstanceTracker()
{
// it's unsafe to delete instances of this type while all instances are being iterated over.
@@ -234,8 +240,20 @@ class LLInstanceTracker<T, T*> : public LLInstanceTrackerBase
public:
- /// for completeness of analogy with the generic implementation
- static T* getInstance(T* k) { return k; }
+ /**
+ * Does a particular instance still exist? Of course, if you already have
+ * a T* in hand, you need not call getInstance() to @em locate the
+ * instance -- unlike the case where getInstance() accepts some kind of
+ * key. Nonetheless this method is still useful to @em validate a
+ * particular T*, since each instance's destructor removes itself from the
+ * underlying set.
+ */
+ static T* getInstance(T* k)
+ {
+ const InstanceSet& set(getSet_());
+ typename InstanceSet::const_iterator found = set.find(k);
+ return (found == set.end())? NULL : *found;
+ }
static S32 instanceCount() { return getSet_().size(); }
class instance_iter : public boost::iterator_facade<instance_iter, T, boost::forward_traversal_tag>
@@ -281,7 +299,8 @@ public:
protected:
LLInstanceTracker()
{
- // it's safe but unpredictable to create instances of this type while all instances are being iterated over. I hate unpredictable. This assert will probably be turned on early in the next development cycle.
+ // make sure static data outlives all instances
+ getStatic();
getSet_().insert(static_cast<T*>(this));
}
virtual ~LLInstanceTracker()
diff --git a/indra/llcommon/llleap.cpp b/indra/llcommon/llleap.cpp
new file mode 100644
index 0000000000..0a57ef1c48
--- /dev/null
+++ b/indra/llcommon/llleap.cpp
@@ -0,0 +1,459 @@
+/**
+ * @file llleap.cpp
+ * @author Nat Goodspeed
+ * @date 2012-02-20
+ * @brief Implementation for llleap.
+ *
+ * $LicenseInfo:firstyear=2012&license=viewerlgpl$
+ * Copyright (c) 2012, Linden Research, Inc.
+ * $/LicenseInfo$
+ */
+
+// Precompiled header
+#include "linden_common.h"
+// associated header
+#include "llleap.h"
+// STL headers
+#include <sstream>
+#include <algorithm>
+// std headers
+// external library headers
+#include <boost/bind.hpp>
+#include <boost/scoped_ptr.hpp>
+#include <boost/tokenizer.hpp>
+// other Linden headers
+#include "llerror.h"
+#include "llstring.h"
+#include "llprocess.h"
+#include "llevents.h"
+#include "stringize.h"
+#include "llsdutil.h"
+#include "llsdserialize.h"
+#include "llerrorcontrol.h"
+#include "lltimer.h"
+#include "lluuid.h"
+#include "llleaplistener.h"
+
+#if LL_MSVC
+#pragma warning (disable : 4355) // 'this' used in initializer list: yes, intentionally
+#endif
+
+LLLeap::LLLeap() {}
+LLLeap::~LLLeap() {}
+
+class LLLeapImpl: public LLLeap
+{
+ LOG_CLASS(LLLeap);
+public:
+ // Called only by LLLeap::create()
+ LLLeapImpl(const std::string& desc, const std::vector<std::string>& plugin):
+ // We might reassign mDesc in the constructor body if it's empty here.
+ mDesc(desc),
+ // We expect multiple LLLeapImpl instances. Definitely tweak
+ // mDonePump's name for uniqueness.
+ mDonePump("LLLeap", true),
+ // Troubling thought: what if one plugin intentionally messes with
+ // another plugin? LLEventPump names are in a single global namespace.
+ // Try to make that more difficult by generating a UUID for the reply-
+ // pump name -- so it should NOT need tweaking for uniqueness.
+ mReplyPump(LLUUID::generateNewID().asString()),
+ mExpect(0),
+ mPrevFatalFunction(LLError::getFatalFunction()),
+ // Instantiate a distinct LLLeapListener for this plugin. (Every
+ // plugin will want its own collection of managed listeners, etc.)
+ // Pass it a callback to our connect() method, so it can send events
+ // from a particular LLEventPump to the plugin without having to know
+ // this class or method name.
+ mListener(new LLLeapListener(boost::bind(&LLLeapImpl::connect, this, _1, _2)))
+ {
+ // Rule out empty vector
+ if (plugin.empty())
+ {
+ throw Error("no plugin command");
+ }
+
+ // Don't leave desc empty either, but in this case, if we weren't
+ // given one, we'll fake one.
+ if (desc.empty())
+ {
+ mDesc = LLProcess::basename(plugin[0]);
+ // how about a toLower() variant that returns the transformed string?!
+ std::string desclower(mDesc);
+ LLStringUtil::toLower(desclower);
+ // If we're running a Python script, use the script name for the
+ // desc instead of just 'python'. Arguably we should check for
+ // more different interpreters as well, but there's a reason to
+ // notice Python specially: we provide Python LLSD serialization
+ // support, so there's a pretty good reason to implement plugins
+ // in that language.
+ if (plugin.size() >= 2 && (desclower == "python" || desclower == "python.exe"))
+ {
+ mDesc = LLProcess::basename(plugin[1]);
+ }
+ }
+
+ // Listen for child "termination" right away to catch launch errors.
+ mDonePump.listen("LLLeap", boost::bind(&LLLeapImpl::bad_launch, this, _1));
+
+ // Okay, launch child.
+ LLProcess::Params params;
+ params.desc = mDesc;
+ std::vector<std::string>::const_iterator pi(plugin.begin()), pend(plugin.end());
+ params.executable = *pi++;
+ for ( ; pi != pend; ++pi)
+ {
+ params.args.add(*pi);
+ }
+ params.files.add(LLProcess::FileParam("pipe")); // stdin
+ params.files.add(LLProcess::FileParam("pipe")); // stdout
+ params.files.add(LLProcess::FileParam("pipe")); // stderr
+ params.postend = mDonePump.getName();
+ mChild = LLProcess::create(params);
+ // If that didn't work, no point in keeping this LLLeap object.
+ if (! mChild)
+ {
+ throw Error(STRINGIZE("failed to run " << mDesc));
+ }
+
+ // Okay, launch apparently worked. Change our mDonePump listener.
+ mDonePump.stopListening("LLLeap");
+ mDonePump.listen("LLLeap", boost::bind(&LLLeapImpl::done, this, _1));
+
+ // Child might pump large volumes of data through either stdout or
+ // stderr. Don't bother copying all that data into notification event.
+ LLProcess::ReadPipe
+ &childout(mChild->getReadPipe(LLProcess::STDOUT)),
+ &childerr(mChild->getReadPipe(LLProcess::STDERR));
+ childout.setLimit(20);
+ childerr.setLimit(20);
+
+ // Serialize any event received on mReplyPump to our child's stdin.
+ mStdinConnection = connect(mReplyPump, "LLLeap");
+
+ // Listening on stdout is stateful. In general, we're either waiting
+ // for the length prefix or waiting for the specified length of data.
+ // We address that with two different listener methods -- one of which
+ // is blocked at any given time.
+ mStdoutConnection = childout.getPump()
+ .listen("prefix", boost::bind(&LLLeapImpl::rstdout, this, _1));
+ mStdoutDataConnection = childout.getPump()
+ .listen("data", boost::bind(&LLLeapImpl::rstdoutData, this, _1));
+ mBlocker.reset(new LLEventPump::Blocker(mStdoutDataConnection));
+
+ // Log anything sent up through stderr. When a typical program
+ // encounters an error, it writes its error message to stderr and
+ // terminates with nonzero exit code. In particular, the Python
+ // interpreter behaves that way. More generally, though, a plugin
+ // author can log whatever s/he wants to the viewer log using stderr.
+ mStderrConnection = childerr.getPump()
+ .listen("LLLeap", boost::bind(&LLLeapImpl::rstderr, this, _1));
+
+ // For our lifespan, intercept any LL_ERRS so we can notify plugin
+ LLError::setFatalFunction(boost::bind(&LLLeapImpl::fatalFunction, this, _1));
+
+ // Send child a preliminary event reporting our own reply-pump name --
+ // which would otherwise be pretty tricky to guess!
+ wstdin(mReplyPump.getName(),
+ LLSDMap
+ ("command", mListener->getName())
+ // Include LLLeap features -- this may be important for child to
+ // construct (or recognize) current protocol.
+ ("features", LLLeapListener::getFeatures()));
+ }
+
+ // Normally we'd expect to arrive here only via done()
+ virtual ~LLLeapImpl()
+ {
+ LL_DEBUGS("LLLeap") << "destroying LLLeap(\"" << mDesc << "\")" << LL_ENDL;
+ // Restore original FatalFunction
+ LLError::setFatalFunction(mPrevFatalFunction);
+ }
+
+ // Listener for failed launch attempt
+ bool bad_launch(const LLSD& data)
+ {
+ LL_WARNS("LLLeap") << data["string"].asString() << LL_ENDL;
+ return false;
+ }
+
+ // Listener for child-process termination
+ bool done(const LLSD& data)
+ {
+ // Log the termination
+ LL_INFOS("LLLeap") << data["string"].asString() << LL_ENDL;
+
+ // Any leftover data at this moment are because protocol was not
+ // satisfied. Possibly the child was interrupted in the middle of
+ // sending a message, possibly the child didn't flush stdout before
+ // terminating, possibly it's just garbage. Log its existence but
+ // discard it.
+ LLProcess::ReadPipe& childout(mChild->getReadPipe(LLProcess::STDOUT));
+ if (childout.size())
+ {
+ LLProcess::ReadPipe::size_type
+ peeklen((std::min)(LLProcess::ReadPipe::size_type(50), childout.size()));
+ LL_WARNS("LLLeap") << "Discarding final " << childout.size() << " bytes: "
+ << childout.peek(0, peeklen) << "..." << LL_ENDL;
+ }
+
+ // Kill this instance. MUST BE LAST before return!
+ delete this;
+ return false;
+ }
+
+ // Listener for events on mReplyPump: send to child stdin
+ bool wstdin(const std::string& pump, const LLSD& data)
+ {
+ LLSD packet(LLSDMap("pump", pump)("data", data));
+
+ std::ostringstream buffer;
+ buffer << LLSDNotationStreamer(packet);
+
+/*==========================================================================*|
+ // DEBUGGING ONLY: don't copy str() if we can avoid it.
+ std::string strdata(buffer.str());
+ if (std::size_t(buffer.tellp()) != strdata.length())
+ {
+ LL_ERRS("LLLeap") << "tellp() -> " << buffer.tellp() << " != "
+ << "str().length() -> " << strdata.length() << LL_ENDL;
+ }
+ // DEBUGGING ONLY: reading back is terribly inefficient.
+ std::istringstream readback(strdata);
+ LLSD echo;
+ LLPointer<LLSDParser> parser(new LLSDNotationParser());
+ S32 parse_status(parser->parse(readback, echo, strdata.length()));
+ if (parse_status == LLSDParser::PARSE_FAILURE)
+ {
+ LL_ERRS("LLLeap") << "LLSDNotationParser() cannot parse output of "
+ << "LLSDNotationStreamer()" << LL_ENDL;
+ }
+ if (! llsd_equals(echo, packet))
+ {
+ LL_ERRS("LLLeap") << "LLSDNotationParser() produced different LLSD "
+ << "than passed to LLSDNotationStreamer()" << LL_ENDL;
+ }
+|*==========================================================================*/
+
+ LL_DEBUGS("EventHost") << "Sending: " << buffer.tellp() << ':';
+ std::string::size_type truncate(80);
+ if (buffer.tellp() <= truncate)
+ {
+ LL_CONT << buffer.str();
+ }
+ else
+ {
+ LL_CONT << buffer.str().substr(0, truncate) << "...";
+ }
+ LL_CONT << LL_ENDL;
+
+ LLProcess::WritePipe& childin(mChild->getWritePipe(LLProcess::STDIN));
+ childin.get_ostream() << buffer.tellp() << ':' << buffer.str() << std::flush;
+ return false;
+ }
+
+ // Initial state of stateful listening on child stdout: wait for a length
+ // prefix, followed by ':'.
+ bool rstdout(const LLSD& data)
+ {
+ LLProcess::ReadPipe& childout(mChild->getReadPipe(LLProcess::STDOUT));
+ // It's possible we got notified of a couple digit characters without
+ // seeing the ':' -- unlikely, but still. Until we see ':', keep
+ // waiting.
+ if (childout.contains(':'))
+ {
+ std::istream& childstream(childout.get_istream());
+ // Saw ':', read length prefix and store in mExpect.
+ size_t expect;
+ childstream >> expect;
+ int colon(childstream.get());
+ if (colon != ':')
+ {
+ // Protocol failure. Clear out the rest of the pending data in
+ // childout (well, up to a max length) to log what was wrong.
+ LLProcess::ReadPipe::size_type
+ readlen((std::min)(childout.size(), LLProcess::ReadPipe::size_type(80)));
+ bad_protocol(STRINGIZE(expect << char(colon) << childout.read(readlen)));
+ }
+ else
+ {
+ // Saw length prefix, saw colon, life is good. Now wait for
+ // that length of data to arrive.
+ mExpect = expect;
+ LL_DEBUGS("LLLeap") << "got length, waiting for "
+ << mExpect << " bytes of data" << LL_ENDL;
+ // Block calls to this method; resetting mBlocker unblocks
+ // calls to the other method.
+ mBlocker.reset(new LLEventPump::Blocker(mStdoutConnection));
+ // Go check if we've already received all the advertised data.
+ if (childout.size())
+ {
+ LLSD updata(data);
+ updata["len"] = LLSD::Integer(childout.size());
+ rstdoutData(updata);
+ }
+ }
+ }
+ else if (childout.contains('\n'))
+ {
+ // Since this is the initial listening state, this is where we'd
+ // arrive if the child isn't following protocol at all -- say
+ // because the user specified 'ls' or some darn thing.
+ bad_protocol(childout.getline());
+ }
+ return false;
+ }
+
+ // State in which we listen on stdout for the specified length of data to
+ // arrive.
+ bool rstdoutData(const LLSD& data)
+ {
+ LLProcess::ReadPipe& childout(mChild->getReadPipe(LLProcess::STDOUT));
+ // Until we've accumulated the promised length of data, keep waiting.
+ if (childout.size() >= mExpect)
+ {
+ // Ready to rock and roll.
+ LL_DEBUGS("LLLeap") << "needed " << mExpect << " bytes, got "
+ << childout.size() << ", parsing LLSD" << LL_ENDL;
+ LLSD data;
+ LLPointer<LLSDParser> parser(new LLSDNotationParser());
+ S32 parse_status(parser->parse(childout.get_istream(), data, mExpect));
+ if (parse_status == LLSDParser::PARSE_FAILURE)
+ {
+ bad_protocol("unparseable LLSD data");
+ }
+ else if (! (data.isMap() && data["pump"].isString() && data.has("data")))
+ {
+ // we got an LLSD object, but it lacks required keys
+ bad_protocol("missing 'pump' or 'data'");
+ }
+ else
+ {
+ // The LLSD object we got from our stream contains the keys we
+ // need.
+ LLEventPumps::instance().obtain(data["pump"]).post(data["data"]);
+ // Block calls to this method; resetting mBlocker unblocks calls
+ // to the other method.
+ mBlocker.reset(new LLEventPump::Blocker(mStdoutDataConnection));
+ // Go check for any more pending events in the buffer.
+ if (childout.size())
+ {
+ LLSD updata(data);
+ data["len"] = LLSD::Integer(childout.size());
+ rstdout(updata);
+ }
+ }
+ }
+ return false;
+ }
+
+ void bad_protocol(const std::string& data)
+ {
+ LL_WARNS("LLLeap") << mDesc << ": invalid protocol: " << data << LL_ENDL;
+ // No point in continuing to run this child.
+ mChild->kill();
+ }
+
+ // Listen on child stderr and log everything that arrives
+ bool rstderr(const LLSD& data)
+ {
+ LLProcess::ReadPipe& childerr(mChild->getReadPipe(LLProcess::STDERR));
+ // We might have gotten a notification involving only a partial line
+ // -- or multiple lines. Read all complete lines; stop when there's
+ // only a partial line left.
+ while (childerr.contains('\n'))
+ {
+ // DO NOT make calls with side effects in a logging statement! If
+ // that log level is suppressed, your side effects WON'T HAPPEN.
+ std::string line(childerr.getline());
+ // Log the received line. Prefix it with the desc so we know which
+ // plugin it's from. This method name rstderr() is intentionally
+ // chosen to further qualify the log output.
+ LL_INFOS("LLLeap") << mDesc << ": " << line << LL_ENDL;
+ }
+ // What if child writes a final partial line to stderr?
+ if (data["eof"].asBoolean() && childerr.size())
+ {
+ std::string rest(childerr.read(childerr.size()));
+ // Read all remaining bytes and log.
+ LL_INFOS("LLLeap") << mDesc << ": " << rest << LL_ENDL;
+ }
+ return false;
+ }
+
+ void fatalFunction(const std::string& error)
+ {
+ // Notify plugin
+ LLSD event;
+ event["type"] = "error";
+ event["error"] = error;
+ mReplyPump.post(event);
+
+ // All the above really accomplished was to buffer the serialized
+ // event in our WritePipe. Have to pump mainloop a couple times to
+ // really write it out there... but time out in case we can't write.
+ LLProcess::WritePipe& childin(mChild->getWritePipe(LLProcess::STDIN));
+ LLEventPump& mainloop(LLEventPumps::instance().obtain("mainloop"));
+ LLSD nop;
+ F64 until(LLTimer::getElapsedSeconds() + 2);
+ while (childin.size() && LLTimer::getElapsedSeconds() < until)
+ {
+ mainloop.post(nop);
+ }
+
+ // forward the call to the previous FatalFunction
+ mPrevFatalFunction(error);
+ }
+
+private:
+ /// We always want to listen on mReplyPump with wstdin(); under some
+ /// circumstances we'll also echo other LLEventPumps to the plugin.
+ LLBoundListener connect(LLEventPump& pump, const std::string& listener)
+ {
+ // Serialize any event received on the specified LLEventPump to our
+ // child's stdin, suitably enriched with the pump name on which it was
+ // received.
+ return pump.listen(listener,
+ boost::bind(&LLLeapImpl::wstdin, this, pump.getName(), _1));
+ }
+
+ std::string mDesc;
+ LLEventStream mDonePump;
+ LLEventStream mReplyPump;
+ LLProcessPtr mChild;
+ LLTempBoundListener
+ mStdinConnection, mStdoutConnection, mStdoutDataConnection, mStderrConnection;
+ boost::scoped_ptr<LLEventPump::Blocker> mBlocker;
+ LLProcess::ReadPipe::size_type mExpect;
+ LLError::FatalFunction mPrevFatalFunction;
+ boost::scoped_ptr<LLLeapListener> mListener;
+};
+
+// This must follow the declaration of LLLeapImpl, so it may as well be last.
+LLLeap* LLLeap::create(const std::string& desc, const std::vector<std::string>& plugin, bool exc)
+{
+ // If caller is willing to permit exceptions, just instantiate.
+ if (exc)
+ return new LLLeapImpl(desc, plugin);
+
+ // Caller insists on suppressing LLLeap::Error. Very well, catch it.
+ try
+ {
+ return new LLLeapImpl(desc, plugin);
+ }
+ catch (const LLLeap::Error&)
+ {
+ return NULL;
+ }
+}
+
+LLLeap* LLLeap::create(const std::string& desc, const std::string& plugin, bool exc)
+{
+ // Use LLStringUtil::getTokens() to parse the command line
+ return create(desc,
+ LLStringUtil::getTokens(plugin,
+ " \t\r\n", // drop_delims
+ "", // no keep_delims
+ "\"'", // either kind of quotes
+ "\\"), // backslash escape
+ exc);
+}
diff --git a/indra/llcommon/llleap.h b/indra/llcommon/llleap.h
new file mode 100644
index 0000000000..1a1ad23d39
--- /dev/null
+++ b/indra/llcommon/llleap.h
@@ -0,0 +1,80 @@
+/**
+ * @file llleap.h
+ * @author Nat Goodspeed
+ * @date 2012-02-20
+ * @brief Class that implements "LLSD Event API Plugin"
+ *
+ * $LicenseInfo:firstyear=2012&license=viewerlgpl$
+ * Copyright (c) 2012, Linden Research, Inc.
+ * $/LicenseInfo$
+ */
+
+#if ! defined(LL_LLLEAP_H)
+#define LL_LLLEAP_H
+
+#include "llinstancetracker.h"
+#include <string>
+#include <vector>
+#include <stdexcept>
+
+/**
+ * LLSD Event API Plugin class. Because instances are managed by
+ * LLInstanceTracker, you can instantiate LLLeap and forget the instance
+ * unless you need it later. Each instance manages an LLProcess; when the
+ * child process terminates, LLLeap deletes itself. We don't require a unique
+ * LLInstanceTracker key.
+ *
+ * The fact that a given LLLeap instance vanishes when its child process
+ * terminates makes it problematic to store an LLLeap* anywhere. Any stored
+ * LLLeap* pointer should be validated before use by
+ * LLLeap::getInstance(LLLeap*) (see LLInstanceTracker).
+ */
+class LL_COMMON_API LLLeap: public LLInstanceTracker<LLLeap>
+{
+public:
+ /**
+ * Pass a brief string description, mostly for logging purposes. The desc
+ * need not be unique, but obviously the clearer we can make it, the
+ * easier these things will be to debug. The strings are the command line
+ * used to launch the desired plugin process.
+ *
+ * Pass exc=false to suppress LLLeap::Error exception. Obviously in that
+ * case the caller cannot discover the nature of the error, merely that an
+ * error of some kind occurred (because create() returned NULL). Either
+ * way, the error is logged.
+ */
+ static LLLeap* create(const std::string& desc, const std::vector<std::string>& plugin,
+ bool exc=true);
+
+ /**
+ * Pass a brief string description, mostly for logging purposes. The desc
+ * need not be unique, but obviously the clearer we can make it, the
+ * easier these things will be to debug. Pass a command-line string
+ * to launch the desired plugin process.
+ *
+ * Pass exc=false to suppress LLLeap::Error exception. Obviously in that
+ * case the caller cannot discover the nature of the error, merely that an
+ * error of some kind occurred (because create() returned NULL). Either
+ * way, the error is logged.
+ */
+ static LLLeap* create(const std::string& desc, const std::string& plugin,
+ bool exc=true);
+
+ /**
+ * Exception thrown for invalid create() arguments, e.g. no plugin
+ * program. This is more resiliant than an LL_ERRS failure, because the
+ * string(s) passed to create() might come from an external source. This
+ * way the caller can catch LLLeap::Error and try to recover.
+ */
+ struct Error: public std::runtime_error
+ {
+ Error(const std::string& what): std::runtime_error(what) {}
+ };
+
+ virtual ~LLLeap();
+
+protected:
+ LLLeap();
+};
+
+#endif /* ! defined(LL_LLLEAP_H) */
diff --git a/indra/llcommon/llleaplistener.cpp b/indra/llcommon/llleaplistener.cpp
new file mode 100644
index 0000000000..fa5730f112
--- /dev/null
+++ b/indra/llcommon/llleaplistener.cpp
@@ -0,0 +1,287 @@
+/**
+ * @file llleaplistener.cpp
+ * @author Nat Goodspeed
+ * @date 2012-03-16
+ * @brief Implementation for llleaplistener.
+ *
+ * $LicenseInfo:firstyear=2012&license=viewerlgpl$
+ * Copyright (c) 2012, Linden Research, Inc.
+ * $/LicenseInfo$
+ */
+
+// Precompiled header
+#include "linden_common.h"
+// associated header
+#include "llleaplistener.h"
+// STL headers
+// std headers
+// external library headers
+#include <boost/foreach.hpp>
+// other Linden headers
+#include "lluuid.h"
+#include "llsdutil.h"
+#include "stringize.h"
+
+/*****************************************************************************
+* LEAP FEATURE STRINGS
+*****************************************************************************/
+/**
+ * Implement "getFeatures" command. The LLSD map thus obtained is intended to
+ * be machine-readable (read: easily-parsed, if parsing be necessary) and to
+ * highlight the differences between this version of the LEAP protocol and
+ * the baseline version. A client may thus determine whether or not the
+ * running viewer supports some recent feature of interest.
+ *
+ * This method is defined at the top of this implementation file so it's easy
+ * to find, easy to spot, easy to update as we enhance the LEAP protocol.
+ */
+/*static*/ LLSD LLLeapListener::getFeatures()
+{
+ static LLSD features;
+ if (features.isUndefined())
+ {
+ features = LLSD::emptyMap();
+
+ // This initial implementation IS the baseline LEAP protocol; thus the
+ // set of differences is empty; thus features is initially empty.
+// features["featurename"] = "value";
+ }
+
+ return features;
+}
+
+LLLeapListener::LLLeapListener(const ConnectFunc& connect):
+ // Each LEAP plugin has an instance of this listener. Make the command
+ // pump name difficult for other such plugins to guess.
+ LLEventAPI(LLUUID::generateNewID().asString(),
+ "Operations relating to the LLSD Event API Plugin (LEAP) protocol"),
+ mConnect(connect)
+{
+ LLSD need_name(LLSDMap("name", LLSD()));
+ add("newpump",
+ "Instantiate a new LLEventPump named like [\"name\"] and listen to it.\n"
+ "If [\"type\"] == \"LLEventQueue\", make LLEventQueue, else LLEventStream.\n"
+ "Events sent through new LLEventPump will be decorated with [\"pump\"]=name.\n"
+ "Returns actual name in [\"name\"] (may be different if collision).",
+ &LLLeapListener::newpump,
+ need_name);
+ add("killpump",
+ "Delete LLEventPump [\"name\"] created by \"newpump\".\n"
+ "Returns [\"status\"] boolean indicating whether such a pump existed.",
+ &LLLeapListener::killpump,
+ need_name);
+ LLSD need_source_listener(LLSDMap("source", LLSD())("listener", LLSD()));
+ add("listen",
+ "Listen to an existing LLEventPump named [\"source\"], with listener name\n"
+ "[\"listener\"].\n"
+ "By default, send events on [\"source\"] to the plugin, decorated\n"
+ "with [\"pump\"]=[\"source\"].\n"
+ "If [\"dest\"] specified, send undecorated events on [\"source\"] to the\n"
+ "LLEventPump named [\"dest\"].\n"
+ "Returns [\"status\"] boolean indicating whether the connection was made.",
+ &LLLeapListener::listen,
+ need_source_listener);
+ add("stoplistening",
+ "Disconnect a connection previously established by \"listen\".\n"
+ "Pass same [\"source\"] and [\"listener\"] arguments.\n"
+ "Returns [\"status\"] boolean indicating whether such a listener existed.",
+ &LLLeapListener::stoplistening,
+ need_source_listener);
+ add("ping",
+ "No arguments, just a round-trip sanity check.",
+ &LLLeapListener::ping);
+ add("getAPIs",
+ "Enumerate all LLEventAPI instances by name and description.",
+ &LLLeapListener::getAPIs);
+ add("getAPI",
+ "Get name, description, dispatch key and operations for LLEventAPI [\"api\"].",
+ &LLLeapListener::getAPI,
+ LLSD().with("api", LLSD()));
+ add("getFeatures",
+ "Return an LLSD map of feature strings (deltas from baseline LEAP protocol)",
+ static_cast<void (LLLeapListener::*)(const LLSD&) const>(&LLLeapListener::getFeatures));
+ add("getFeature",
+ "Return the feature value with key [\"feature\"]",
+ &LLLeapListener::getFeature,
+ LLSD().with("feature", LLSD()));
+}
+
+LLLeapListener::~LLLeapListener()
+{
+ // We'd have stored a map of LLTempBoundListener instances, save that the
+ // operation of inserting into a std::map necessarily copies the
+ // value_type, and Bad Things would happen if you copied an
+ // LLTempBoundListener. (Destruction of the original would disconnect the
+ // listener, invalidating every stored connection.)
+ BOOST_FOREACH(ListenersMap::value_type& pair, mListeners)
+ {
+ pair.second.disconnect();
+ }
+}
+
+void LLLeapListener::newpump(const LLSD& request)
+{
+ Response reply(LLSD(), request);
+
+ std::string name = request["name"];
+ LLSD const & type = request["type"];
+
+ LLEventPump * new_pump = NULL;
+ if (type.asString() == "LLEventQueue")
+ {
+ new_pump = new LLEventQueue(name, true); // tweak name for uniqueness
+ }
+ else
+ {
+ if (! (type.isUndefined() || type.asString() == "LLEventStream"))
+ {
+ reply.warn(STRINGIZE("unknown 'type' " << type << ", using LLEventStream"));
+ }
+ new_pump = new LLEventStream(name, true); // tweak name for uniqueness
+ }
+
+ name = new_pump->getName();
+
+ mEventPumps.insert(name, new_pump);
+
+ // Now listen on this new pump with our plugin listener
+ std::string myname("llleap");
+ saveListener(name, myname, mConnect(*new_pump, myname));
+
+ reply["name"] = name;
+}
+
+void LLLeapListener::killpump(const LLSD& request)
+{
+ Response reply(LLSD(), request);
+
+ std::string name = request["name"];
+ // success == (nonzero number of entries were erased)
+ reply["status"] = bool(mEventPumps.erase(name));
+}
+
+void LLLeapListener::listen(const LLSD& request)
+{
+ Response reply(LLSD(), request);
+
+ std::string source_name = request["source"];
+ std::string dest_name = request["dest"];
+ std::string listener_name = request["listener"];
+
+ LLEventPump & source = LLEventPumps::instance().obtain(source_name);
+
+ reply["status"] = false;
+ if (mListeners.find(ListenersMap::key_type(source_name, listener_name)) == mListeners.end())
+ {
+ try
+ {
+ if (request["dest"].isDefined())
+ {
+ // If we're asked to connect the "source" pump to a
+ // specific "dest" pump, find dest pump and connect it.
+ LLEventPump & dest = LLEventPumps::instance().obtain(dest_name);
+ saveListener(source_name, listener_name,
+ source.listen(listener_name,
+ boost::bind(&LLEventPump::post, &dest, _1)));
+ }
+ else
+ {
+ // "dest" unspecified means to direct events on "source"
+ // to our plugin listener.
+ saveListener(source_name, listener_name, mConnect(source, listener_name));
+ }
+ reply["status"] = true;
+ }
+ catch (const LLEventPump::DupListenerName &)
+ {
+ // pass - status already set to false
+ }
+ }
+}
+
+void LLLeapListener::stoplistening(const LLSD& request)
+{
+ Response reply(LLSD(), request);
+
+ std::string source_name = request["source"];
+ std::string listener_name = request["listener"];
+
+ ListenersMap::iterator finder =
+ mListeners.find(ListenersMap::key_type(source_name, listener_name));
+
+ reply["status"] = false;
+ if(finder != mListeners.end())
+ {
+ reply["status"] = true;
+ finder->second.disconnect();
+ mListeners.erase(finder);
+ }
+}
+
+void LLLeapListener::ping(const LLSD& request) const
+{
+ // do nothing, default reply suffices
+ Response(LLSD(), request);
+}
+
+void LLLeapListener::getAPIs(const LLSD& request) const
+{
+ Response reply(LLSD(), request);
+
+ for (LLEventAPI::instance_iter eai(LLEventAPI::beginInstances()),
+ eaend(LLEventAPI::endInstances());
+ eai != eaend; ++eai)
+ {
+ LLSD info;
+ info["desc"] = eai->getDesc();
+ reply[eai->getName()] = info;
+ }
+}
+
+void LLLeapListener::getAPI(const LLSD& request) const
+{
+ Response reply(LLSD(), request);
+
+ LLEventAPI* found = LLEventAPI::getInstance(request["api"]);
+ if (found)
+ {
+ reply["name"] = found->getName();
+ reply["desc"] = found->getDesc();
+ reply["key"] = found->getDispatchKey();
+ LLSD ops;
+ for (LLEventAPI::const_iterator oi(found->begin()), oend(found->end());
+ oi != oend; ++oi)
+ {
+ ops.append(found->getMetadata(oi->first));
+ }
+ reply["ops"] = ops;
+ }
+}
+
+void LLLeapListener::getFeatures(const LLSD& request) const
+{
+ // Merely constructing and destroying a Response object suffices here.
+ // Giving it a name would only produce fatal 'unreferenced variable'
+ // warnings.
+ Response(getFeatures(), request);
+}
+
+void LLLeapListener::getFeature(const LLSD& request) const
+{
+ Response reply(LLSD(), request);
+
+ LLSD::String feature_name(request["feature"]);
+ LLSD features(getFeatures());
+ if (features[feature_name].isDefined())
+ {
+ reply["feature"] = features[feature_name];
+ }
+}
+
+void LLLeapListener::saveListener(const std::string& pump_name,
+ const std::string& listener_name,
+ const LLBoundListener& listener)
+{
+ mListeners.insert(ListenersMap::value_type(ListenersMap::key_type(pump_name, listener_name),
+ listener));
+}
diff --git a/indra/llcommon/llleaplistener.h b/indra/llcommon/llleaplistener.h
new file mode 100644
index 0000000000..2193d81b9e
--- /dev/null
+++ b/indra/llcommon/llleaplistener.h
@@ -0,0 +1,73 @@
+/**
+ * @file llleaplistener.h
+ * @author Nat Goodspeed
+ * @date 2012-03-16
+ * @brief LLEventAPI supporting LEAP plugins
+ *
+ * $LicenseInfo:firstyear=2012&license=viewerlgpl$
+ * Copyright (c) 2012, Linden Research, Inc.
+ * $/LicenseInfo$
+ */
+
+#if ! defined(LL_LLLEAPLISTENER_H)
+#define LL_LLLEAPLISTENER_H
+
+#include "lleventapi.h"
+#include <map>
+#include <string>
+#include <boost/function.hpp>
+#include <boost/ptr_container/ptr_map.hpp>
+
+/// Listener class implementing LLLeap query/control operations.
+/// See https://jira.lindenlab.com/jira/browse/DEV-31978.
+class LLLeapListener: public LLEventAPI
+{
+public:
+ /**
+ * Decouple LLLeap by dependency injection. Certain LLLeapListener
+ * operations must be able to cause LLLeap to listen on a specified
+ * LLEventPump with the LLLeap listener that wraps incoming events in an
+ * outer (pump=, data=) map and forwards them to the plugin. Very well,
+ * define the signature for a function that will perform that, and make
+ * our constructor accept such a function.
+ */
+ typedef boost::function<LLBoundListener(LLEventPump&, const std::string& listener)>
+ ConnectFunc;
+ LLLeapListener(const ConnectFunc& connect);
+ ~LLLeapListener();
+
+ static LLSD getFeatures();
+
+private:
+ void newpump(const LLSD&);
+ void killpump(const LLSD&);
+ void listen(const LLSD&);
+ void stoplistening(const LLSD&);
+ void ping(const LLSD&) const;
+ void getAPIs(const LLSD&) const;
+ void getAPI(const LLSD&) const;
+ void getFeatures(const LLSD&) const;
+ void getFeature(const LLSD&) const;
+
+ void saveListener(const std::string& pump_name, const std::string& listener_name,
+ const LLBoundListener& listener);
+
+ ConnectFunc mConnect;
+
+ // In theory, listen() could simply call the relevant LLEventPump's
+ // listen() method, stoplistening() likewise. Lifespan issues make us
+ // capture the LLBoundListener objects: when this object goes away, all
+ // those listeners should be disconnected. But what if the client listens,
+ // stops, listens again on the same LLEventPump with the same listener
+ // name? Merely collecting LLBoundListeners wouldn't adequately track
+ // that. So capture the latest LLBoundListener for this LLEventPump name
+ // and listener name.
+ typedef std::map<std::pair<std::string, std::string>, LLBoundListener> ListenersMap;
+ ListenersMap mListeners;
+ // Similar lifespan reasoning applies to LLEventPumps instantiated by
+ // newpump() operations.
+ typedef boost::ptr_map<std::string, LLEventPump> EventPumpsMap;
+ EventPumpsMap mEventPumps;
+};
+
+#endif /* ! defined(LL_LLLEAPLISTENER_H) */
diff --git a/indra/llcommon/llmemory.cpp b/indra/llcommon/llmemory.cpp
index 8c02ad8290..3b9758f996 100644
--- a/indra/llcommon/llmemory.cpp
+++ b/indra/llcommon/llmemory.cpp
@@ -159,39 +159,67 @@ void LLMemory::logMemoryInfo(BOOL update)
if(update)
{
updateMemoryInfo() ;
+ LLPrivateMemoryPoolManager::getInstance()->updateStatistics() ;
}
llinfos << "Current allocated physical memory(KB): " << sAllocatedMemInKB << llendl ;
llinfos << "Current allocated page size (KB): " << sAllocatedPageSizeInKB << llendl ;
llinfos << "Current availabe physical memory(KB): " << sAvailPhysicalMemInKB << llendl ;
llinfos << "Current max usable memory(KB): " << sMaxPhysicalMemInKB << llendl ;
+
+ llinfos << "--- private pool information -- " << llendl ;
+ llinfos << "Total reserved (KB): " << LLPrivateMemoryPoolManager::getInstance()->mTotalReservedSize / 1024 << llendl ;
+ llinfos << "Total allocated (KB): " << LLPrivateMemoryPoolManager::getInstance()->mTotalAllocatedSize / 1024 << llendl ;
}
//return 0: everything is normal;
//return 1: the memory pool is low, but not in danger;
//return -1: the memory pool is in danger, is about to crash.
//static
-S32 LLMemory::isMemoryPoolLow()
+bool LLMemory::isMemoryPoolLow()
{
static const U32 LOW_MEMEOY_POOL_THRESHOLD_KB = 64 * 1024 ; //64 MB for emergency use
+ const static U32 MAX_SIZE_CHECKED_MEMORY_BLOCK = 64 * 1024 * 1024 ; //64 MB
+ static void* last_reserved_address = NULL ;
if(!sEnableMemoryFailurePrevention)
{
- return 0 ; //no memory failure prevention.
+ return false ; //no memory failure prevention.
}
if(sAvailPhysicalMemInKB < (LOW_MEMEOY_POOL_THRESHOLD_KB >> 2)) //out of physical memory
{
- return -1 ;
+ return true ;
}
if(sAllocatedPageSizeInKB + (LOW_MEMEOY_POOL_THRESHOLD_KB >> 2) > sMaxHeapSizeInKB) //out of virtual address space.
{
- return -1 ;
+ return true ;
}
- return (S32)(sAvailPhysicalMemInKB < LOW_MEMEOY_POOL_THRESHOLD_KB ||
+ bool is_low = (S32)(sAvailPhysicalMemInKB < LOW_MEMEOY_POOL_THRESHOLD_KB ||
sAllocatedPageSizeInKB + LOW_MEMEOY_POOL_THRESHOLD_KB > sMaxHeapSizeInKB) ;
+
+ //check the virtual address space fragmentation
+ if(!is_low)
+ {
+ if(!last_reserved_address)
+ {
+ last_reserved_address = LLMemory::tryToAlloc(last_reserved_address, MAX_SIZE_CHECKED_MEMORY_BLOCK) ;
+ }
+ else
+ {
+ last_reserved_address = LLMemory::tryToAlloc(last_reserved_address, MAX_SIZE_CHECKED_MEMORY_BLOCK) ;
+ if(!last_reserved_address) //failed, try once more
+ {
+ last_reserved_address = LLMemory::tryToAlloc(last_reserved_address, MAX_SIZE_CHECKED_MEMORY_BLOCK) ;
+ }
+ }
+
+ is_low = !last_reserved_address ; //allocation failed
+ }
+
+ return is_low ;
}
//static
@@ -1289,18 +1317,16 @@ U16 LLPrivateMemoryPool::LLMemoryChunk::getPageLevel(U32 size)
//--------------------------------------------------------------------
const U32 CHUNK_SIZE = 4 << 20 ; //4 MB
const U32 LARGE_CHUNK_SIZE = 4 * CHUNK_SIZE ; //16 MB
-LLPrivateMemoryPool::LLPrivateMemoryPool(S32 type) :
+LLPrivateMemoryPool::LLPrivateMemoryPool(S32 type, U32 max_pool_size) :
mMutexp(NULL),
mReservedPoolSize(0),
mHashFactor(1),
- mType(type)
+ mType(type),
+ mMaxPoolSize(max_pool_size)
{
- const U32 MAX_POOL_SIZE = 256 * 1024 * 1024 ; //256 MB
-
- mMaxPoolSize = MAX_POOL_SIZE ;
if(type == STATIC_THREADED || type == VOLATILE_THREADED)
{
- mMutexp = new LLMutex ;
+ mMutexp = new LLMutex(NULL) ;
}
for(S32 i = 0 ; i < SUPER_ALLOCATION ; i++)
@@ -1362,16 +1388,31 @@ char* LLPrivateMemoryPool::allocate(U32 size)
chunk = chunk->mNext ;
}
}
-
- chunk = addChunk(chunk_idx) ;
- if(chunk)
+ else
{
- p = chunk->allocate(size) ;
+ chunk = addChunk(chunk_idx) ;
+ if(chunk)
+ {
+ p = chunk->allocate(size) ;
+ }
}
}
unlock() ;
+ if(!p) //to get memory from the private pool failed, try the heap directly
+ {
+ static bool to_log = true ;
+
+ if(to_log)
+ {
+ llwarns << "The memory pool overflows, now using heap directly!" << llendl ;
+ to_log = false ;
+ }
+
+ return (char*)malloc(size) ;
+ }
+
return p ;
}
@@ -1472,7 +1513,7 @@ void LLPrivateMemoryPool::destroyPool()
unlock() ;
}
-void LLPrivateMemoryPool::checkSize(U32 asked_size)
+bool LLPrivateMemoryPool::checkSize(U32 asked_size)
{
if(mReservedPoolSize + asked_size > mMaxPoolSize)
{
@@ -1480,8 +1521,12 @@ void LLPrivateMemoryPool::checkSize(U32 asked_size)
llinfos << "Total reserved size: " << mReservedPoolSize + asked_size << llendl ;
llinfos << "Total_allocated Size: " << getTotalAllocatedSize() << llendl ;
- llerrs << "The pool is overflowing..." << llendl ;
+ //llerrs << "The pool is overflowing..." << llendl ;
+
+ return false ;
}
+
+ return true ;
}
LLPrivateMemoryPool::LLMemoryChunk* LLPrivateMemoryPool::addChunk(S32 chunk_index)
@@ -1501,7 +1546,11 @@ LLPrivateMemoryPool::LLMemoryChunk* LLPrivateMemoryPool::addChunk(S32 chunk_inde
MAX_SLOT_SIZES[chunk_index], MIN_BLOCK_SIZES[chunk_index], MAX_BLOCK_SIZES[chunk_index]) ;
}
- checkSize(preferred_size + overhead) ;
+ if(!checkSize(preferred_size + overhead))
+ {
+ return NULL ;
+ }
+
mReservedPoolSize += preferred_size + overhead ;
char* buffer = (char*)malloc(preferred_size + overhead) ;
@@ -1593,7 +1642,7 @@ LLPrivateMemoryPool::LLMemoryChunk* LLPrivateMemoryPool::findChunk(const char* a
void LLPrivateMemoryPool::addToHashTable(LLMemoryChunk* chunk)
{
- static const U16 HASH_FACTORS[] = {41, 83, 193, 317, 419, 523, 0xFFFF};
+ static const U16 HASH_FACTORS[] = {41, 83, 193, 317, 419, 523, 719, 997, 1523, 0xFFFF};
U16 i ;
if(mChunkHashList.empty())
@@ -1773,8 +1822,10 @@ void LLPrivateMemoryPool::LLChunkHashElement::remove(LLPrivateMemoryPool::LLMemo
//class LLPrivateMemoryPoolManager
//--------------------------------------------------------------------
LLPrivateMemoryPoolManager* LLPrivateMemoryPoolManager::sInstance = NULL ;
+BOOL LLPrivateMemoryPoolManager::sPrivatePoolEnabled = FALSE ;
+std::vector<LLPrivateMemoryPool*> LLPrivateMemoryPoolManager::sDanglingPoolList ;
-LLPrivateMemoryPoolManager::LLPrivateMemoryPoolManager(BOOL enabled)
+LLPrivateMemoryPoolManager::LLPrivateMemoryPoolManager(BOOL enabled, U32 max_pool_size)
{
mPoolList.resize(LLPrivateMemoryPool::MAX_TYPES) ;
@@ -1783,7 +1834,10 @@ LLPrivateMemoryPoolManager::LLPrivateMemoryPoolManager(BOOL enabled)
mPoolList[i] = NULL ;
}
- mPrivatePoolEnabled = enabled ;
+ sPrivatePoolEnabled = enabled ;
+
+ const U32 MAX_POOL_SIZE = 256 * 1024 * 1024 ; //256 MB
+ mMaxPrivatePoolSize = llmax(max_pool_size, MAX_POOL_SIZE) ;
}
LLPrivateMemoryPoolManager::~LLPrivateMemoryPoolManager()
@@ -1797,7 +1851,7 @@ LLPrivateMemoryPoolManager::~LLPrivateMemoryPoolManager()
S32 k = 0 ;
for(mem_allocation_info_t::iterator iter = sMemAllocationTracker.begin() ; iter != sMemAllocationTracker.end() ; ++iter)
{
- llinfos << k++ << ", " << iter->second << llendl ;
+ llinfos << k++ << ", " << (U32)iter->first << " : " << iter->second << llendl ;
}
sMemAllocationTracker.clear() ;
}
@@ -1817,7 +1871,17 @@ LLPrivateMemoryPoolManager::~LLPrivateMemoryPoolManager()
{
if(mPoolList[i])
{
- delete mPoolList[i] ;
+ if(mPoolList[i]->isEmpty())
+ {
+ delete mPoolList[i] ;
+ }
+ else
+ {
+ //can not delete this pool because it has alloacted memory to be freed.
+ //move it to the dangling list.
+ sDanglingPoolList.push_back(mPoolList[i]) ;
+ }
+
mPoolList[i] = NULL ;
}
}
@@ -1826,11 +1890,11 @@ LLPrivateMemoryPoolManager::~LLPrivateMemoryPoolManager()
}
//static
-void LLPrivateMemoryPoolManager::initClass(BOOL enabled)
+void LLPrivateMemoryPoolManager::initClass(BOOL enabled, U32 max_pool_size)
{
llassert_always(!sInstance) ;
- sInstance = new LLPrivateMemoryPoolManager(enabled) ;
+ sInstance = new LLPrivateMemoryPoolManager(enabled, max_pool_size) ;
}
//static
@@ -1855,14 +1919,14 @@ void LLPrivateMemoryPoolManager::destroyClass()
LLPrivateMemoryPool* LLPrivateMemoryPoolManager::newPool(S32 type)
{
- if(!mPrivatePoolEnabled)
+ if(!sPrivatePoolEnabled)
{
return NULL ;
}
if(!mPoolList[type])
{
- mPoolList[type] = new LLPrivateMemoryPool(type) ;
+ mPoolList[type] = new LLPrivateMemoryPool(type, mMaxPrivatePoolSize) ;
}
return mPoolList[type] ;
@@ -1953,7 +2017,38 @@ void LLPrivateMemoryPoolManager::freeMem(LLPrivateMemoryPool* poolp, void* addr
}
else
{
- free(addr) ;
+ if(!sPrivatePoolEnabled)
+ {
+ free(addr) ; //private pool is disabled.
+ }
+ else if(!sInstance) //the private memory manager is destroyed, try the dangling list
+ {
+ for(S32 i = 0 ; i < sDanglingPoolList.size(); i++)
+ {
+ if(sDanglingPoolList[i]->findChunk((char*)addr))
+ {
+ sDanglingPoolList[i]->freeMem(addr) ;
+ if(sDanglingPoolList[i]->isEmpty())
+ {
+ delete sDanglingPoolList[i] ;
+
+ if(i < sDanglingPoolList.size() - 1)
+ {
+ sDanglingPoolList[i] = sDanglingPoolList[sDanglingPoolList.size() - 1] ;
+ }
+ sDanglingPoolList.pop_back() ;
+ }
+
+ addr = NULL ;
+ break ;
+ }
+ }
+ llassert_always(!addr) ; //addr should be release before hitting here!
+ }
+ else
+ {
+ llerrs << "private pool is used before initialized.!" << llendl ;
+ }
}
}
diff --git a/indra/llcommon/llmemory.h b/indra/llcommon/llmemory.h
index db753f0d8b..bbbdaa6497 100644
--- a/indra/llcommon/llmemory.h
+++ b/indra/llcommon/llmemory.h
@@ -122,7 +122,7 @@ public:
static void initMaxHeapSizeGB(F32 max_heap_size_gb, BOOL prevent_heap_failure);
static void updateMemoryInfo() ;
static void logMemoryInfo(BOOL update = FALSE);
- static S32 isMemoryPoolLow();
+ static bool isMemoryPoolLow();
static U32 getAvailableMemKB() ;
static U32 getMaxMemKB() ;
@@ -303,7 +303,7 @@ public:
} ;
private:
- LLPrivateMemoryPool(S32 type) ;
+ LLPrivateMemoryPool(S32 type, U32 max_pool_size) ;
~LLPrivateMemoryPool() ;
char *allocate(U32 size) ;
@@ -320,7 +320,7 @@ private:
void unlock() ;
S32 getChunkIndex(U32 size) ;
LLMemoryChunk* addChunk(S32 chunk_index) ;
- void checkSize(U32 asked_size) ;
+ bool checkSize(U32 asked_size) ;
void removeChunk(LLMemoryChunk* chunk) ;
U16 findHashKey(const char* addr);
void addToHashTable(LLMemoryChunk* chunk) ;
@@ -383,22 +383,24 @@ private:
class LL_COMMON_API LLPrivateMemoryPoolManager
{
private:
- LLPrivateMemoryPoolManager(BOOL enabled) ;
+ LLPrivateMemoryPoolManager(BOOL enabled, U32 max_pool_size) ;
~LLPrivateMemoryPoolManager() ;
public:
static LLPrivateMemoryPoolManager* getInstance() ;
- static void initClass(BOOL enabled) ;
+ static void initClass(BOOL enabled, U32 pool_size) ;
static void destroyClass() ;
LLPrivateMemoryPool* newPool(S32 type) ;
void deletePool(LLPrivateMemoryPool* pool) ;
-private:
- static LLPrivateMemoryPoolManager* sInstance ;
- std::vector<LLPrivateMemoryPool*> mPoolList ;
- BOOL mPrivatePoolEnabled;
+private:
+ std::vector<LLPrivateMemoryPool*> mPoolList ;
+ U32 mMaxPrivatePoolSize;
+ static LLPrivateMemoryPoolManager* sInstance ;
+ static BOOL sPrivatePoolEnabled;
+ static std::vector<LLPrivateMemoryPool*> sDanglingPoolList ;
public:
//debug and statistics info.
void updateStatistics() ;
diff --git a/indra/llcommon/llpreprocessor.h b/indra/llcommon/llpreprocessor.h
index 17a4287538..31d5f3d2c7 100644
--- a/indra/llcommon/llpreprocessor.h
+++ b/indra/llcommon/llpreprocessor.h
@@ -151,6 +151,7 @@
#pragma warning (disable : 4251) // member needs to have dll-interface to be used by clients of class
#pragma warning (disable : 4275) // non dll-interface class used as base for dll-interface class
+#pragma warning (disable : 4018) // '<' : signed/unsigned mismatch
#endif // LL_MSVC
#if LL_WINDOWS
diff --git a/indra/llcommon/llprocess.cpp b/indra/llcommon/llprocess.cpp
new file mode 100644
index 0000000000..d4786035ce
--- /dev/null
+++ b/indra/llcommon/llprocess.cpp
@@ -0,0 +1,1295 @@
+/**
+ * @file llprocess.cpp
+ * @brief Utility class for launching, terminating, and tracking the state of processes.
+ *
+ * $LicenseInfo:firstyear=2008&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "linden_common.h"
+#include "llprocess.h"
+#include "llsdutil.h"
+#include "llsdserialize.h"
+#include "llsingleton.h"
+#include "llstring.h"
+#include "stringize.h"
+#include "llapr.h"
+#include "apr_signal.h"
+#include "llevents.h"
+
+#include <boost/foreach.hpp>
+#include <boost/bind.hpp>
+#include <boost/asio/streambuf.hpp>
+#include <boost/asio/buffers_iterator.hpp>
+#include <iostream>
+#include <stdexcept>
+#include <limits>
+#include <algorithm>
+#include <vector>
+#include <typeinfo>
+#include <utility>
+
+/*****************************************************************************
+* Helpers
+*****************************************************************************/
+static const char* whichfile_[] = { "stdin", "stdout", "stderr" };
+static std::string empty;
+static LLProcess::Status interpret_status(int status);
+static std::string getDesc(const LLProcess::Params& params);
+
+static std::string whichfile(LLProcess::FILESLOT index)
+{
+ if (index < LL_ARRAY_SIZE(whichfile_))
+ return whichfile_[index];
+ return STRINGIZE("file slot " << index);
+}
+
+/**
+ * Ref-counted "mainloop" listener. As long as there are still outstanding
+ * LLProcess objects, keep listening on "mainloop" so we can keep polling APR
+ * for process status.
+ */
+class LLProcessListener
+{
+ LOG_CLASS(LLProcessListener);
+public:
+ LLProcessListener():
+ mCount(0)
+ {}
+
+ void addPoll(const LLProcess&)
+ {
+ // Unconditionally increment mCount. If it was zero before
+ // incrementing, listen on "mainloop".
+ if (mCount++ == 0)
+ {
+ LL_DEBUGS("LLProcess") << "listening on \"mainloop\"" << LL_ENDL;
+ mConnection = LLEventPumps::instance().obtain("mainloop")
+ .listen("LLProcessListener", boost::bind(&LLProcessListener::tick, this, _1));
+ }
+ }
+
+ void dropPoll(const LLProcess&)
+ {
+ // Unconditionally decrement mCount. If it's zero after decrementing,
+ // stop listening on "mainloop".
+ if (--mCount == 0)
+ {
+ LL_DEBUGS("LLProcess") << "disconnecting from \"mainloop\"" << LL_ENDL;
+ mConnection.disconnect();
+ }
+ }
+
+private:
+ /// called once per frame by the "mainloop" LLEventPump
+ bool tick(const LLSD&)
+ {
+ // Tell APR to sense whether each registered LLProcess is still
+ // running and call handle_status() appropriately. We should be able
+ // to get the same info from an apr_proc_wait(APR_NOWAIT) call; but at
+ // least in APR 1.4.2, testing suggests that even with APR_NOWAIT,
+ // apr_proc_wait() blocks the caller. We can't have that in the
+ // viewer. Hence the callback rigmarole. (Once we update APR, it's
+ // probably worth testing again.) Also -- although there's an
+ // apr_proc_other_child_refresh() call, i.e. get that information for
+ // one specific child, it accepts an 'apr_other_child_rec_t*' that's
+ // mentioned NOWHERE else in the documentation or header files! I
+ // would use the specific call in LLProcess::getStatus() if I knew
+ // how. As it is, each call to apr_proc_other_child_refresh_all() will
+ // call callbacks for ALL still-running child processes. That's why we
+ // centralize such calls, using "mainloop" to ensure it happens once
+ // per frame, and refcounting running LLProcess objects to remain
+ // registered only while needed.
+ LL_DEBUGS("LLProcess") << "calling apr_proc_other_child_refresh_all()" << LL_ENDL;
+ apr_proc_other_child_refresh_all(APR_OC_REASON_RUNNING);
+ return false;
+ }
+
+ /// If this object is destroyed before mCount goes to zero, stop
+ /// listening on "mainloop" anyway.
+ LLTempBoundListener mConnection;
+ unsigned mCount;
+};
+static LLProcessListener sProcessListener;
+
+/*****************************************************************************
+* WritePipe and ReadPipe
+*****************************************************************************/
+LLProcess::BasePipe::~BasePipe() {}
+const LLProcess::BasePipe::size_type
+ // use funky syntax to call max() to avoid blighted max() macros
+ LLProcess::BasePipe::npos((std::numeric_limits<LLProcess::BasePipe::size_type>::max)());
+
+class WritePipeImpl: public LLProcess::WritePipe
+{
+ LOG_CLASS(WritePipeImpl);
+public:
+ WritePipeImpl(const std::string& desc, apr_file_t* pipe):
+ mDesc(desc),
+ mPipe(pipe),
+ // Essential to initialize our std::ostream with our special streambuf!
+ mStream(&mStreambuf)
+ {
+ mConnection = LLEventPumps::instance().obtain("mainloop")
+ .listen(LLEventPump::inventName("WritePipe"),
+ boost::bind(&WritePipeImpl::tick, this, _1));
+
+#if ! LL_WINDOWS
+ // We can't count on every child process reading everything we try to
+ // write to it. And if the child terminates with WritePipe data still
+ // pending, unless we explicitly suppress it, Posix will hit us with
+ // SIGPIPE. That would terminate the viewer, boom. "Ignoring" it means
+ // APR gets the correct errno, passes it back to us, we log it, etc.
+ signal(SIGPIPE, SIG_IGN);
+#endif
+ }
+
+ virtual std::ostream& get_ostream() { return mStream; }
+ virtual size_type size() const { return mStreambuf.size(); }
+
+ bool tick(const LLSD&)
+ {
+ typedef boost::asio::streambuf::const_buffers_type const_buffer_sequence;
+ // If there's anything to send, try to send it.
+ std::size_t total(mStreambuf.size()), consumed(0);
+ if (total)
+ {
+ const_buffer_sequence bufs = mStreambuf.data();
+ // In general, our streambuf might contain a number of different
+ // physical buffers; iterate over those.
+ bool keepwriting = true;
+ for (const_buffer_sequence::const_iterator bufi(bufs.begin()), bufend(bufs.end());
+ bufi != bufend && keepwriting; ++bufi)
+ {
+ // http://www.boost.org/doc/libs/1_49_0_beta1/doc/html/boost_asio/reference/buffer.html#boost_asio.reference.buffer.accessing_buffer_contents
+ // Although apr_file_write() accepts const void*, we
+ // manipulate const char* so we can increment the pointer.
+ const char* remainptr = boost::asio::buffer_cast<const char*>(*bufi);
+ std::size_t remainlen = boost::asio::buffer_size(*bufi);
+ while (remainlen)
+ {
+ // Tackle the current buffer in discrete chunks. On
+ // Windows, we've observed strange failures when trying to
+ // write big lengths (~1 MB) in a single operation. Even a
+ // 32K chunk seems too large. At some point along the way
+ // apr_file_write() returns 11 (Resource temporarily
+ // unavailable, i.e. EAGAIN) and says it wrote 0 bytes --
+ // even though it did write the chunk! Our next write
+ // attempt retries with the same chunk, resulting in the
+ // chunk being duplicated at the child end. Using smaller
+ // chunks is empirically more reliable.
+ std::size_t towrite((std::min)(remainlen, std::size_t(4*1024)));
+ apr_size_t written(towrite);
+ apr_status_t err = apr_file_write(mPipe, remainptr, &written);
+ // EAGAIN is exactly what we want from a nonblocking pipe.
+ // Rather than waiting for data, it should return immediately.
+ if (! (err == APR_SUCCESS || APR_STATUS_IS_EAGAIN(err)))
+ {
+ LL_WARNS("LLProcess") << "apr_file_write(" << towrite << ") on " << mDesc
+ << " got " << err << ":" << LL_ENDL;
+ ll_apr_warn_status(err);
+ }
+
+ // 'written' is modified to reflect the number of bytes actually
+ // written. Make sure we consume those later. (Don't consume them
+ // now, that would invalidate the buffer iterator sequence!)
+ consumed += written;
+ // don't forget to advance to next chunk of current buffer
+ remainptr += written;
+ remainlen -= written;
+
+ char msgbuf[512];
+ LL_DEBUGS("LLProcess") << "wrote " << written << " of " << towrite
+ << " bytes to " << mDesc
+ << " (original " << total << "),"
+ << " code " << err << ": "
+ << apr_strerror(err, msgbuf, sizeof(msgbuf))
+ << LL_ENDL;
+
+ // The parent end of this pipe is nonblocking. If we weren't able
+ // to write everything we wanted, don't keep banging on it -- that
+ // won't change until the child reads some. Wait for next tick().
+ if (written < towrite)
+ {
+ keepwriting = false; // break outer loop over buffers too
+ break;
+ }
+ } // next chunk of current buffer
+ } // next buffer
+ // In all, we managed to write 'consumed' bytes. Remove them from the
+ // streambuf so we don't keep trying to send them. This could be
+ // anywhere from 0 up to mStreambuf.size(); anything we haven't yet
+ // sent, we'll try again later.
+ mStreambuf.consume(consumed);
+ }
+
+ return false;
+ }
+
+private:
+ std::string mDesc;
+ apr_file_t* mPipe;
+ LLTempBoundListener mConnection;
+ boost::asio::streambuf mStreambuf;
+ std::ostream mStream;
+};
+
+class ReadPipeImpl: public LLProcess::ReadPipe
+{
+ LOG_CLASS(ReadPipeImpl);
+public:
+ ReadPipeImpl(const std::string& desc, apr_file_t* pipe, LLProcess::FILESLOT index):
+ mDesc(desc),
+ mPipe(pipe),
+ mIndex(index),
+ // Essential to initialize our std::istream with our special streambuf!
+ mStream(&mStreambuf),
+ mPump("ReadPipe", true), // tweak name as needed to avoid collisions
+ mLimit(0),
+ mEOF(false)
+ {
+ mConnection = LLEventPumps::instance().obtain("mainloop")
+ .listen(LLEventPump::inventName("ReadPipe"),
+ boost::bind(&ReadPipeImpl::tick, this, _1));
+ }
+
+ // Much of the implementation is simply connecting the abstract virtual
+ // methods with implementation data concealed from the base class.
+ virtual std::istream& get_istream() { return mStream; }
+ virtual std::string getline() { return LLProcess::getline(mStream); }
+ virtual LLEventPump& getPump() { return mPump; }
+ virtual void setLimit(size_type limit) { mLimit = limit; }
+ virtual size_type getLimit() const { return mLimit; }
+ virtual size_type size() const { return mStreambuf.size(); }
+
+ virtual std::string read(size_type len)
+ {
+ // Read specified number of bytes into a buffer. Make a buffer big
+ // enough.
+ size_type readlen((std::min)(size(), len));
+ std::vector<char> buffer(readlen);
+ mStream.read(&buffer[0], readlen);
+ // Since we've already clamped 'readlen', we can think of no reason
+ // why mStream.read() should read fewer than 'readlen' bytes.
+ // Nonetheless, use the actual retrieved length.
+ return std::string(&buffer[0], mStream.gcount());
+ }
+
+ virtual std::string peek(size_type offset=0, size_type len=npos) const
+ {
+ // Constrain caller's offset and len to overlap actual buffer content.
+ std::size_t real_offset = (std::min)(mStreambuf.size(), std::size_t(offset));
+ size_type want_end = (len == npos)? npos : (real_offset + len);
+ std::size_t real_end = (std::min)(mStreambuf.size(), std::size_t(want_end));
+ boost::asio::streambuf::const_buffers_type cbufs = mStreambuf.data();
+ return std::string(boost::asio::buffers_begin(cbufs) + real_offset,
+ boost::asio::buffers_begin(cbufs) + real_end);
+ }
+
+ virtual size_type find(const std::string& seek, size_type offset=0) const
+ {
+ // If we're passing a string of length 1, use find(char), which can
+ // use an O(n) std::find() rather than the O(n^2) std::search().
+ if (seek.length() == 1)
+ {
+ return find(seek[0], offset);
+ }
+
+ // If offset is beyond the whole buffer, can't even construct a valid
+ // iterator range; can't possibly find the string we seek.
+ if (offset > mStreambuf.size())
+ {
+ return npos;
+ }
+
+ boost::asio::streambuf::const_buffers_type cbufs = mStreambuf.data();
+ boost::asio::buffers_iterator<boost::asio::streambuf::const_buffers_type>
+ begin(boost::asio::buffers_begin(cbufs)),
+ end (boost::asio::buffers_end(cbufs)),
+ found(std::search(begin + offset, end, seek.begin(), seek.end()));
+ return (found == end)? npos : (found - begin);
+ }
+
+ virtual size_type find(char seek, size_type offset=0) const
+ {
+ // If offset is beyond the whole buffer, can't even construct a valid
+ // iterator range; can't possibly find the char we seek.
+ if (offset > mStreambuf.size())
+ {
+ return npos;
+ }
+
+ boost::asio::streambuf::const_buffers_type cbufs = mStreambuf.data();
+ boost::asio::buffers_iterator<boost::asio::streambuf::const_buffers_type>
+ begin(boost::asio::buffers_begin(cbufs)),
+ end (boost::asio::buffers_end(cbufs)),
+ found(std::find(begin + offset, end, seek));
+ return (found == end)? npos : (found - begin);
+ }
+
+ bool tick(const LLSD&)
+ {
+ // Once we've hit EOF, skip all the rest of this.
+ if (mEOF)
+ return false;
+
+ typedef boost::asio::streambuf::mutable_buffers_type mutable_buffer_sequence;
+ // Try, every time, to read into our streambuf. In fact, we have no
+ // idea how much data the child might be trying to send: keep trying
+ // until we're convinced we've temporarily exhausted the pipe.
+ enum PipeState { RETRY, EXHAUSTED, CLOSED };
+ PipeState state = RETRY;
+ std::size_t committed(0);
+ do
+ {
+ // attempt to read an arbitrary size
+ mutable_buffer_sequence bufs = mStreambuf.prepare(4096);
+ // In general, the mutable_buffer_sequence returned by prepare() might
+ // contain a number of different physical buffers; iterate over those.
+ std::size_t tocommit(0);
+ for (mutable_buffer_sequence::const_iterator bufi(bufs.begin()), bufend(bufs.end());
+ bufi != bufend; ++bufi)
+ {
+ // http://www.boost.org/doc/libs/1_49_0_beta1/doc/html/boost_asio/reference/buffer.html#boost_asio.reference.buffer.accessing_buffer_contents
+ std::size_t toread(boost::asio::buffer_size(*bufi));
+ apr_size_t gotten(toread);
+ apr_status_t err = apr_file_read(mPipe,
+ boost::asio::buffer_cast<void*>(*bufi),
+ &gotten);
+ // EAGAIN is exactly what we want from a nonblocking pipe.
+ // Rather than waiting for data, it should return immediately.
+ if (! (err == APR_SUCCESS || APR_STATUS_IS_EAGAIN(err)))
+ {
+ // Handle EOF specially: it's part of normal-case processing.
+ if (err == APR_EOF)
+ {
+ LL_DEBUGS("LLProcess") << "EOF on " << mDesc << LL_ENDL;
+ }
+ else
+ {
+ LL_WARNS("LLProcess") << "apr_file_read(" << toread << ") on " << mDesc
+ << " got " << err << ":" << LL_ENDL;
+ ll_apr_warn_status(err);
+ }
+ // Either way, though, we won't need any more tick() calls.
+ mConnection.disconnect();
+ // Ignore any subsequent calls we might get anyway.
+ mEOF = true;
+ state = CLOSED; // also break outer retry loop
+ break;
+ }
+
+ // 'gotten' was modified to reflect the number of bytes actually
+ // received. Make sure we commit those later. (Don't commit them
+ // now, that would invalidate the buffer iterator sequence!)
+ tocommit += gotten;
+ LL_DEBUGS("LLProcess") << "filled " << gotten << " of " << toread
+ << " bytes from " << mDesc << LL_ENDL;
+
+ // The parent end of this pipe is nonblocking. If we weren't even
+ // able to fill this buffer, don't loop to try to fill the next --
+ // that won't change until the child writes more. Wait for next
+ // tick().
+ if (gotten < toread)
+ {
+ // break outer retry loop too
+ state = EXHAUSTED;
+ break;
+ }
+ }
+
+ // Don't forget to "commit" the data!
+ mStreambuf.commit(tocommit);
+ committed += tocommit;
+
+ // state is changed from RETRY when we can't fill any one buffer
+ // of the mutable_buffer_sequence established by the current
+ // prepare() call -- whether due to error or not enough bytes.
+ // That is, if state is still RETRY, we've filled every physical
+ // buffer in the mutable_buffer_sequence. In that case, for all we
+ // know, the child might have still more data pending -- go for it!
+ } while (state == RETRY);
+
+ // Once we recognize that the pipe is closed, make one more call to
+ // listener. The listener might be waiting for a particular substring
+ // to arrive, or a particular length of data or something. The event
+ // with "eof" == true announces that nothing further will arrive, so
+ // use it or lose it.
+ if (committed || state == CLOSED)
+ {
+ // If we actually received new data, publish it on our LLEventPump
+ // as advertised. Constrain it by mLimit. But show listener the
+ // actual accumulated buffer size, regardless of mLimit.
+ size_type datasize((std::min)(mLimit, size_type(mStreambuf.size())));
+ mPump.post(LLSDMap
+ ("data", peek(0, datasize))
+ ("len", LLSD::Integer(mStreambuf.size()))
+ ("slot", LLSD::Integer(mIndex))
+ ("name", whichfile(mIndex))
+ ("desc", mDesc)
+ ("eof", state == CLOSED));
+ }
+
+ return false;
+ }
+
+private:
+ std::string mDesc;
+ apr_file_t* mPipe;
+ LLProcess::FILESLOT mIndex;
+ LLTempBoundListener mConnection;
+ boost::asio::streambuf mStreambuf;
+ std::istream mStream;
+ LLEventStream mPump;
+ size_type mLimit;
+ bool mEOF;
+};
+
+/*****************************************************************************
+* LLProcess itself
+*****************************************************************************/
+/// Need an exception to avoid constructing an invalid LLProcess object, but
+/// internal use only
+struct LLProcessError: public std::runtime_error
+{
+ LLProcessError(const std::string& msg): std::runtime_error(msg) {}
+};
+
+LLProcessPtr LLProcess::create(const LLSDOrParams& params)
+{
+ try
+ {
+ return LLProcessPtr(new LLProcess(params));
+ }
+ catch (const LLProcessError& e)
+ {
+ LL_WARNS("LLProcess") << e.what() << LL_ENDL;
+
+ // If caller is requesting an event on process termination, send one
+ // indicating bad launch. This may prevent someone waiting forever for
+ // a termination post that can't arrive because the child never
+ // started.
+ if (params.postend.isProvided())
+ {
+ LLEventPumps::instance().obtain(params.postend)
+ .post(LLSDMap
+ // no "id"
+ ("desc", getDesc(params))
+ ("state", LLProcess::UNSTARTED)
+ // no "data"
+ ("string", e.what())
+ );
+ }
+
+ return LLProcessPtr();
+ }
+}
+
+/// Call an apr function returning apr_status_t. On failure, log warning and
+/// throw LLProcessError mentioning the function call that produced that
+/// result.
+#define chkapr(func) \
+ if (ll_apr_warn_status(func)) \
+ throw LLProcessError(#func " failed")
+
+LLProcess::LLProcess(const LLSDOrParams& params):
+ mAutokill(params.autokill),
+ mPipes(NSLOTS)
+{
+ // Hmm, when you construct a ptr_vector with a size, it merely reserves
+ // space, it doesn't actually make it that big. Explicitly make it bigger.
+ // Because of ptr_vector's odd semantics, have to push_back(0) the right
+ // number of times! resize() wants to default-construct new BasePipe
+ // instances, which fails because it's pure virtual. But because of the
+ // constructor call, these push_back() calls should require no new
+ // allocation.
+ for (size_t i = 0; i < mPipes.capacity(); ++i)
+ mPipes.push_back(0);
+
+ if (! params.validateBlock(true))
+ {
+ throw LLProcessError(STRINGIZE("not launched: failed parameter validation\n"
+ << LLSDNotationStreamer(params)));
+ }
+
+ mPostend = params.postend;
+
+ apr_procattr_t *procattr = NULL;
+ chkapr(apr_procattr_create(&procattr, gAPRPoolp));
+
+ // For which of stdin, stdout, stderr should we create a pipe to the
+ // child? In the viewer, there are only a couple viable
+ // apr_procattr_io_set() alternatives: inherit the viewer's own stdxxx
+ // handle (APR_NO_PIPE, e.g. for stdout, stderr), or create a pipe that's
+ // blocking on the child end but nonblocking at the viewer end
+ // (APR_CHILD_BLOCK).
+ // Other major options could include explicitly creating a single APR pipe
+ // and passing it as both stdout and stderr (apr_procattr_child_out_set(),
+ // apr_procattr_child_err_set()), or accepting a filename, opening it and
+ // passing that apr_file_t (simple <, >, 2> redirect emulation).
+ std::vector<apr_int32_t> select;
+ BOOST_FOREACH(const FileParam& fparam, params.files)
+ {
+ // Every iteration, we're going to append an item to 'select'. At the
+ // top of the loop, its size() is, in effect, an index. Use that to
+ // pick a string description for messages.
+ std::string which(whichfile(FILESLOT(select.size())));
+ if (fparam.type().empty()) // inherit our file descriptor
+ {
+ select.push_back(APR_NO_PIPE);
+ }
+ else if (fparam.type() == "pipe") // anonymous pipe
+ {
+ if (! fparam.name().empty())
+ {
+ LL_WARNS("LLProcess") << "For " << params.executable()
+ << ": internal names for reusing pipes ('"
+ << fparam.name() << "' for " << which
+ << ") are not yet supported -- creating distinct pipe"
+ << LL_ENDL;
+ }
+ // The viewer can't block for anything: the parent end MUST be
+ // nonblocking. As the APR documentation itself points out, it
+ // makes very little sense to set nonblocking I/O for the child
+ // end of a pipe: only a specially-written child could deal with
+ // that.
+ select.push_back(APR_CHILD_BLOCK);
+ }
+ else
+ {
+ throw LLProcessError(STRINGIZE("For " << params.executable()
+ << ": unsupported FileParam for " << which
+ << ": type='" << fparam.type()
+ << "', name='" << fparam.name() << "'"));
+ }
+ }
+ // By default, pass APR_NO_PIPE for unspecified slots.
+ while (select.size() < NSLOTS)
+ {
+ select.push_back(APR_NO_PIPE);
+ }
+ chkapr(apr_procattr_io_set(procattr, select[STDIN], select[STDOUT], select[STDERR]));
+
+ // Thumbs down on implicitly invoking the shell to invoke the child. From
+ // our point of view, the other major alternative to APR_PROGRAM_PATH
+ // would be APR_PROGRAM_ENV: still copy environment, but require full
+ // executable pathname. I don't see a downside to searching the PATH,
+ // though: if our caller wants (e.g.) a specific Python interpreter, s/he
+ // can still pass the full pathname.
+ chkapr(apr_procattr_cmdtype_set(procattr, APR_PROGRAM_PATH));
+ // YES, do extra work if necessary to report child exec() failures back to
+ // parent process.
+ chkapr(apr_procattr_error_check_set(procattr, 1));
+ // Do not start a non-autokill child in detached state. On Posix
+ // platforms, this setting attempts to daemonize the new child, closing
+ // std handles and the like, and that's a bit more detachment than we
+ // want. autokill=false just means not to implicitly kill the child when
+ // the parent terminates!
+// chkapr(apr_procattr_detach_set(procattr, params.autokill? 0 : 1));
+
+ if (params.autokill)
+ {
+#if defined(APR_HAS_PROCATTR_AUTOKILL_SET)
+ apr_status_t ok = apr_procattr_autokill_set(procattr, 1);
+# if LL_WINDOWS
+ // As of 2012-02-02, we only expect this to be implemented on Windows.
+ // Avoid spamming the log with warnings we fully expect.
+ ll_apr_warn_status(ok);
+#else // ! LL_WINDOWS
+ (void)ok; // suppress 'unused' warning
+# endif // ! LL_WINDOWS
+#else
+ LL_WARNS("LLProcess") << "This version of APR lacks Linden apr_procattr_autokill_set() extension" << LL_ENDL;
+#endif
+ }
+
+ // In preparation for calling apr_proc_create(), we collect a number of
+ // const char* pointers obtained from std::string::c_str(). Turns out
+ // LLInitParam::Block's helpers Optional, Mandatory, Multiple et al.
+ // guarantee that converting to the wrapped type (std::string in our
+ // case), e.g. by calling operator(), returns a reference to *the same
+ // instance* of the wrapped type that's stored in our Block subclass.
+ // That's important! We know 'params' persists throughout this method
+ // call; but without that guarantee, we'd have to assume that converting
+ // one of its members to std::string might return a different (temp)
+ // instance. Capturing the c_str() from a temporary std::string is Bad Bad
+ // Bad. But armed with this knowledge, when you see params.cwd().c_str(),
+ // grit your teeth and smile and carry on.
+
+ if (params.cwd.isProvided())
+ {
+ chkapr(apr_procattr_dir_set(procattr, params.cwd().c_str()));
+ }
+
+ // create an argv vector for the child process
+ std::vector<const char*> argv;
+
+ // Add the executable path. See above remarks about c_str().
+ argv.push_back(params.executable().c_str());
+
+ // Add arguments. See above remarks about c_str().
+ BOOST_FOREACH(const std::string& arg, params.args)
+ {
+ argv.push_back(arg.c_str());
+ }
+
+ // terminate with a null pointer
+ argv.push_back(NULL);
+
+ // Launch! The NULL would be the environment block, if we were passing
+ // one. Hand-expand chkapr() macro so we can fill in the actual command
+ // string instead of the variable names.
+ if (ll_apr_warn_status(apr_proc_create(&mProcess, argv[0], &argv[0], NULL, procattr,
+ gAPRPoolp)))
+ {
+ throw LLProcessError(STRINGIZE(params << " failed"));
+ }
+
+ // arrange to call status_callback()
+ apr_proc_other_child_register(&mProcess, &LLProcess::status_callback, this, mProcess.in,
+ gAPRPoolp);
+ // and make sure we poll it once per "mainloop" tick
+ sProcessListener.addPoll(*this);
+ mStatus.mState = RUNNING;
+
+ mDesc = STRINGIZE(getDesc(params) << " (" << mProcess.pid << ')');
+ LL_INFOS("LLProcess") << mDesc << ": launched " << params << LL_ENDL;
+
+ // Unless caller explicitly turned off autokill (child should persist),
+ // take steps to terminate the child. This is all suspenders-and-belt: in
+ // theory our destructor should kill an autokill child, but in practice
+ // that doesn't always work (e.g. VWR-21538).
+ if (params.autokill)
+ {
+/*==========================================================================*|
+ // NO: There may be an APR bug, not sure -- but at least on Mac, when
+ // gAPRPoolp is destroyed, OUR process receives SIGTERM! Apparently
+ // either our own PID is getting into the list of processes to kill()
+ // (unlikely), or somehow one of those PIDs is getting zeroed first,
+ // so that kill() sends SIGTERM to the whole process group -- this
+ // process included. I'd have to build and link with a debug version
+ // of APR to know for sure. It's too bad: this mechanism would be just
+ // right for dealing with static autokill LLProcessPtr variables,
+ // which aren't destroyed until after APR is no longer available.
+
+ // Tie the lifespan of this child process to the lifespan of our APR
+ // pool: on destruction of the pool, forcibly kill the process. Tell
+ // APR to try SIGTERM and wait 3 seconds. If that didn't work, use
+ // SIGKILL.
+ apr_pool_note_subprocess(gAPRPoolp, &mProcess, APR_KILL_AFTER_TIMEOUT);
+|*==========================================================================*/
+
+ // On Windows, associate the new child process with our Job Object.
+ autokill();
+ }
+
+ // Instantiate the proper pipe I/O machinery
+ // want to be able to point to apr_proc_t::in, out, err by index
+ typedef apr_file_t* apr_proc_t::*apr_proc_file_ptr;
+ static apr_proc_file_ptr members[] =
+ { &apr_proc_t::in, &apr_proc_t::out, &apr_proc_t::err };
+ for (size_t i = 0; i < NSLOTS; ++i)
+ {
+ if (select[i] != APR_CHILD_BLOCK)
+ continue;
+ std::string desc(STRINGIZE(mDesc << ' ' << whichfile(FILESLOT(i))));
+ apr_file_t* pipe(mProcess.*(members[i]));
+ if (i == STDIN)
+ {
+ mPipes.replace(i, new WritePipeImpl(desc, pipe));
+ }
+ else
+ {
+ mPipes.replace(i, new ReadPipeImpl(desc, pipe, FILESLOT(i)));
+ }
+ LL_DEBUGS("LLProcess") << "Instantiating " << typeid(mPipes[i]).name()
+ << "('" << desc << "')" << LL_ENDL;
+ }
+}
+
+// Helper to obtain a description string, given a Params block
+static std::string getDesc(const LLProcess::Params& params)
+{
+ // If caller specified a description string, by all means use it.
+ if (params.desc.isProvided())
+ return params.desc;
+
+ // Caller didn't say. Use the executable name -- but use just the filename
+ // part. On Mac, for instance, full pathnames get cumbersome.
+ return LLProcess::basename(params.executable);
+}
+
+//static
+std::string LLProcess::basename(const std::string& path)
+{
+ // If there are Linden utility functions to manipulate pathnames, I
+ // haven't found them -- and for this usage, Boost.Filesystem seems kind
+ // of heavyweight.
+ std::string::size_type delim = path.find_last_of("\\/");
+ // If path contains no pathname delimiters, return the whole thing.
+ if (delim == std::string::npos)
+ return path;
+
+ // Return just the part beyond the last delimiter.
+ return path.substr(delim + 1);
+}
+
+LLProcess::~LLProcess()
+{
+ // In the Linden viewer, there's at least one static LLProcessPtr. Its
+ // destructor will be called *after* ll_cleanup_apr(). In such a case,
+ // unregistering is pointless (and fatal!) -- and kill(), which also
+ // relies on APR, is impossible.
+ if (! gAPRPoolp)
+ return;
+
+ // Only in state RUNNING are we registered for callback. In UNSTARTED we
+ // haven't yet registered. And since receiving the callback is the only
+ // way we detect child termination, we only change from state RUNNING at
+ // the same time we unregister.
+ if (mStatus.mState == RUNNING)
+ {
+ // We're still registered for a callback: unregister. Do it before
+ // we even issue the kill(): even if kill() somehow prompted an
+ // instantaneous callback (unlikely), this object is going away! Any
+ // information updated in this object by such a callback is no longer
+ // available to any consumer anyway.
+ apr_proc_other_child_unregister(this);
+ // One less LLProcess to poll for
+ sProcessListener.dropPoll(*this);
+ }
+
+ if (mAutokill)
+ {
+ kill("destructor");
+ }
+}
+
+bool LLProcess::kill(const std::string& who)
+{
+ if (isRunning())
+ {
+ LL_INFOS("LLProcess") << who << " killing " << mDesc << LL_ENDL;
+
+#if LL_WINDOWS
+ int sig = -1;
+#else // Posix
+ int sig = SIGTERM;
+#endif
+
+ ll_apr_warn_status(apr_proc_kill(&mProcess, sig));
+ }
+
+ return ! isRunning();
+}
+
+bool LLProcess::isRunning() const
+{
+ return getStatus().mState == RUNNING;
+}
+
+LLProcess::Status LLProcess::getStatus() const
+{
+ return mStatus;
+}
+
+std::string LLProcess::getStatusString() const
+{
+ return getStatusString(getStatus());
+}
+
+std::string LLProcess::getStatusString(const Status& status) const
+{
+ return getStatusString(mDesc, status);
+}
+
+//static
+std::string LLProcess::getStatusString(const std::string& desc, const Status& status)
+{
+ if (status.mState == UNSTARTED)
+ return desc + " was never launched";
+
+ if (status.mState == RUNNING)
+ return desc + " running";
+
+ if (status.mState == EXITED)
+ return STRINGIZE(desc << " exited with code " << status.mData);
+
+ if (status.mState == KILLED)
+#if LL_WINDOWS
+ return STRINGIZE(desc << " killed with exception " << std::hex << status.mData);
+#else
+ return STRINGIZE(desc << " killed by signal " << status.mData
+ << " (" << apr_signal_description_get(status.mData) << ")");
+#endif
+
+ return STRINGIZE(desc << " in unknown state " << status.mState << " (" << status.mData << ")");
+}
+
+// Classic-C-style APR callback
+void LLProcess::status_callback(int reason, void* data, int status)
+{
+ // Our only role is to bounce this static method call back into object
+ // space.
+ static_cast<LLProcess*>(data)->handle_status(reason, status);
+}
+
+#define tabent(symbol) { symbol, #symbol }
+static struct ReasonCode
+{
+ int code;
+ const char* name;
+} reasons[] =
+{
+ tabent(APR_OC_REASON_DEATH),
+ tabent(APR_OC_REASON_UNWRITABLE),
+ tabent(APR_OC_REASON_RESTART),
+ tabent(APR_OC_REASON_UNREGISTER),
+ tabent(APR_OC_REASON_LOST),
+ tabent(APR_OC_REASON_RUNNING)
+};
+#undef tabent
+
+// Object-oriented callback
+void LLProcess::handle_status(int reason, int status)
+{
+ {
+ // This odd appearance of LL_DEBUGS is just to bracket a lookup that will
+ // only be performed if in fact we're going to produce the log message.
+ LL_DEBUGS("LLProcess") << empty;
+ std::string reason_str;
+ BOOST_FOREACH(const ReasonCode& rcp, reasons)
+ {
+ if (reason == rcp.code)
+ {
+ reason_str = rcp.name;
+ break;
+ }
+ }
+ if (reason_str.empty())
+ {
+ reason_str = STRINGIZE("unknown reason " << reason);
+ }
+ LL_CONT << mDesc << ": handle_status(" << reason_str << ", " << status << ")" << LL_ENDL;
+ }
+
+ if (! (reason == APR_OC_REASON_DEATH || reason == APR_OC_REASON_LOST))
+ {
+ // We're only interested in the call when the child terminates.
+ return;
+ }
+
+ // Somewhat oddly, APR requires that you explicitly unregister even when
+ // it already knows the child has terminated. We must pass the same 'data'
+ // pointer as for the register() call, which was our 'this'.
+ apr_proc_other_child_unregister(this);
+ // don't keep polling for a terminated process
+ sProcessListener.dropPoll(*this);
+ // We overload mStatus.mState to indicate whether the child is registered
+ // for APR callback: only RUNNING means registered. Track that we've
+ // unregistered. We know the child has terminated; might be EXITED or
+ // KILLED; refine below.
+ mStatus.mState = EXITED;
+
+ // Make last-gasp calls for each of the ReadPipes we have on hand. Since
+ // they're listening on "mainloop", we can be sure they'll eventually
+ // collect all pending data from the child. But we want to be able to
+ // guarantee to our consumer that by the time we post on the "postend"
+ // LLEventPump, our ReadPipes are already buffering all the data there
+ // will ever be from the child. That lets the "postend" listener decide
+ // what to do with that final data.
+ for (size_t i = 0; i < mPipes.size(); ++i)
+ {
+ std::string error;
+ ReadPipeImpl* ppipe = getPipePtr<ReadPipeImpl>(error, FILESLOT(i));
+ if (ppipe)
+ {
+ static LLSD trivial;
+ ppipe->tick(trivial);
+ }
+ }
+
+// wi->rv = apr_proc_wait(wi->child, &wi->rc, &wi->why, APR_NOWAIT);
+ // It's just wrong to call apr_proc_wait() here. The only way APR knows to
+ // call us with APR_OC_REASON_DEATH is that it's already reaped this child
+ // process, so calling wait() will only produce "huh?" from the OS. We
+ // must rely on the status param passed in, which unfortunately comes
+ // straight from the OS wait() call, which means we have to decode it by
+ // hand.
+ mStatus = interpret_status(status);
+ LL_INFOS("LLProcess") << getStatusString() << LL_ENDL;
+
+ // If caller requested notification on child termination, send it.
+ if (! mPostend.empty())
+ {
+ LLEventPumps::instance().obtain(mPostend)
+ .post(LLSDMap
+ ("id", getProcessID())
+ ("desc", mDesc)
+ ("state", mStatus.mState)
+ ("data", mStatus.mData)
+ ("string", getStatusString())
+ );
+ }
+}
+
+LLProcess::id LLProcess::getProcessID() const
+{
+ return mProcess.pid;
+}
+
+LLProcess::handle LLProcess::getProcessHandle() const
+{
+#if LL_WINDOWS
+ return mProcess.hproc;
+#else
+ return mProcess.pid;
+#endif
+}
+
+std::string LLProcess::getPipeName(FILESLOT) const
+{
+ // LLProcess::FileParam::type "npipe" is not yet implemented
+ return "";
+}
+
+template<class PIPETYPE>
+PIPETYPE* LLProcess::getPipePtr(std::string& error, FILESLOT slot)
+{
+ if (slot >= NSLOTS)
+ {
+ error = STRINGIZE(mDesc << " has no slot " << slot);
+ return NULL;
+ }
+ if (mPipes.is_null(slot))
+ {
+ error = STRINGIZE(mDesc << ' ' << whichfile(slot) << " not a monitored pipe");
+ return NULL;
+ }
+ // Make sure we dynamic_cast in pointer domain so we can test, rather than
+ // accepting runtime's exception.
+ PIPETYPE* ppipe = dynamic_cast<PIPETYPE*>(&mPipes[slot]);
+ if (! ppipe)
+ {
+ error = STRINGIZE(mDesc << ' ' << whichfile(slot) << " not a " << typeid(PIPETYPE).name());
+ return NULL;
+ }
+
+ error.clear();
+ return ppipe;
+}
+
+template <class PIPETYPE>
+PIPETYPE& LLProcess::getPipe(FILESLOT slot)
+{
+ std::string error;
+ PIPETYPE* wp = getPipePtr<PIPETYPE>(error, slot);
+ if (! wp)
+ {
+ throw NoPipe(error);
+ }
+ return *wp;
+}
+
+template <class PIPETYPE>
+boost::optional<PIPETYPE&> LLProcess::getOptPipe(FILESLOT slot)
+{
+ std::string error;
+ PIPETYPE* wp = getPipePtr<PIPETYPE>(error, slot);
+ if (! wp)
+ {
+ LL_DEBUGS("LLProcess") << error << LL_ENDL;
+ return boost::optional<PIPETYPE&>();
+ }
+ return *wp;
+}
+
+LLProcess::WritePipe& LLProcess::getWritePipe(FILESLOT slot)
+{
+ return getPipe<WritePipe>(slot);
+}
+
+boost::optional<LLProcess::WritePipe&> LLProcess::getOptWritePipe(FILESLOT slot)
+{
+ return getOptPipe<WritePipe>(slot);
+}
+
+LLProcess::ReadPipe& LLProcess::getReadPipe(FILESLOT slot)
+{
+ return getPipe<ReadPipe>(slot);
+}
+
+boost::optional<LLProcess::ReadPipe&> LLProcess::getOptReadPipe(FILESLOT slot)
+{
+ return getOptPipe<ReadPipe>(slot);
+}
+
+//static
+std::string LLProcess::getline(std::istream& in)
+{
+ std::string line;
+ std::getline(in, line);
+ // Blur the distinction between "\r\n" and plain "\n". std::getline() will
+ // have eaten the "\n", but we could still end up with a trailing "\r".
+ std::string::size_type lastpos = line.find_last_not_of("\r");
+ if (lastpos != std::string::npos)
+ {
+ // Found at least one character that's not a trailing '\r'. SKIP OVER
+ // IT and erase the rest of the line.
+ line.erase(lastpos+1);
+ }
+ return line;
+}
+
+std::ostream& operator<<(std::ostream& out, const LLProcess::Params& params)
+{
+ if (params.cwd.isProvided())
+ {
+ out << "cd " << LLStringUtil::quote(params.cwd) << ": ";
+ }
+ out << LLStringUtil::quote(params.executable);
+ BOOST_FOREACH(const std::string& arg, params.args)
+ {
+ out << ' ' << LLStringUtil::quote(arg);
+ }
+ return out;
+}
+
+/*****************************************************************************
+* Windows specific
+*****************************************************************************/
+#if LL_WINDOWS
+
+static std::string WindowsErrorString(const std::string& operation);
+
+void LLProcess::autokill()
+{
+ // hopefully now handled by apr_procattr_autokill_set()
+}
+
+LLProcess::handle LLProcess::isRunning(handle h, const std::string& desc)
+{
+ // This direct Windows implementation is because we have no access to the
+ // apr_proc_t struct: we expect it's been destroyed.
+ if (! h)
+ return 0;
+
+ DWORD waitresult = WaitForSingleObject(h, 0);
+ if(waitresult == WAIT_OBJECT_0)
+ {
+ // the process has completed.
+ if (! desc.empty())
+ {
+ DWORD status = 0;
+ if (! GetExitCodeProcess(h, &status))
+ {
+ LL_WARNS("LLProcess") << desc << " terminated, but "
+ << WindowsErrorString("GetExitCodeProcess()") << LL_ENDL;
+ }
+ {
+ LL_INFOS("LLProcess") << getStatusString(desc, interpret_status(status))
+ << LL_ENDL;
+ }
+ }
+ CloseHandle(h);
+ return 0;
+ }
+
+ return h;
+}
+
+static LLProcess::Status interpret_status(int status)
+{
+ LLProcess::Status result;
+
+ // This bit of code is cribbed from apr/threadproc/win32/proc.c, a
+ // function (unfortunately static) called why_from_exit_code():
+ /* See WinNT.h STATUS_ACCESS_VIOLATION and family for how
+ * this class of failures was determined
+ */
+ if ((status & 0xFFFF0000) == 0xC0000000)
+ {
+ result.mState = LLProcess::KILLED;
+ }
+ else
+ {
+ result.mState = LLProcess::EXITED;
+ }
+ result.mData = status;
+
+ return result;
+}
+
+/// GetLastError()/FormatMessage() boilerplate
+static std::string WindowsErrorString(const std::string& operation)
+{
+ int result = GetLastError();
+
+ LPTSTR error_str = 0;
+ if (FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
+ NULL,
+ result,
+ 0,
+ (LPTSTR)&error_str,
+ 0,
+ NULL)
+ != 0)
+ {
+ // convert from wide-char string to multi-byte string
+ char message[256];
+ wcstombs(message, error_str, sizeof(message));
+ message[sizeof(message)-1] = 0;
+ LocalFree(error_str);
+ // convert to std::string to trim trailing whitespace
+ std::string mbsstr(message);
+ mbsstr.erase(mbsstr.find_last_not_of(" \t\r\n"));
+ return STRINGIZE(operation << " failed (" << result << "): " << mbsstr);
+ }
+ return STRINGIZE(operation << " failed (" << result
+ << "), but FormatMessage() did not explain");
+}
+
+/*****************************************************************************
+* Posix specific
+*****************************************************************************/
+#else // Mac and linux
+
+#include <signal.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <sys/wait.h>
+
+void LLProcess::autokill()
+{
+ // What we ought to do here is to:
+ // 1. create a unique process group and run all autokill children in that
+ // group (see https://jira.secondlife.com/browse/SWAT-563);
+ // 2. figure out a way to intercept control when the viewer exits --
+ // gracefully or not;
+ // 3. when the viewer exits, kill off the aforementioned process group.
+
+ // It's point 2 that's troublesome. Although I've seen some signal-
+ // handling logic in the Posix viewer code, I haven't yet found any bit of
+ // code that's run no matter how the viewer exits (a try/finally for the
+ // whole process, as it were).
+}
+
+// Attempt to reap a process ID -- returns true if the process has exited and been reaped, false otherwise.
+static bool reap_pid(pid_t pid, LLProcess::Status* pstatus=NULL)
+{
+ LLProcess::Status dummy;
+ if (! pstatus)
+ {
+ // If caller doesn't want to see Status, give us a target anyway so we
+ // don't have to have a bunch of conditionals.
+ pstatus = &dummy;
+ }
+
+ int status = 0;
+ pid_t wait_result = ::waitpid(pid, &status, WNOHANG);
+ if (wait_result == pid)
+ {
+ *pstatus = interpret_status(status);
+ return true;
+ }
+ if (wait_result == 0)
+ {
+ pstatus->mState = LLProcess::RUNNING;
+ pstatus->mData = 0;
+ return false;
+ }
+
+ // Clear caller's Status block; caller must interpret UNSTARTED to mean
+ // "if this PID was ever valid, it no longer is."
+ *pstatus = LLProcess::Status();
+
+ // We've dealt with the success cases: we were able to reap the child
+ // (wait_result == pid) or it's still running (wait_result == 0). It may
+ // be that the child terminated but didn't hang around long enough for us
+ // to reap. In that case we still have no Status to report, but we can at
+ // least state that it's not running.
+ if (wait_result == -1 && errno == ECHILD)
+ {
+ // No such process -- this may mean we're ignoring SIGCHILD.
+ return true;
+ }
+
+ // Uh, should never happen?!
+ LL_WARNS("LLProcess") << "LLProcess::reap_pid(): waitpid(" << pid << ") returned "
+ << wait_result << "; not meaningful?" << LL_ENDL;
+ // If caller is looping until this pid terminates, and if we can't find
+ // out, better to break the loop than to claim it's still running.
+ return true;
+}
+
+LLProcess::id LLProcess::isRunning(id pid, const std::string& desc)
+{
+ // This direct Posix implementation is because we have no access to the
+ // apr_proc_t struct: we expect it's been destroyed.
+ if (! pid)
+ return 0;
+
+ // Check whether the process has exited, and reap it if it has.
+ LLProcess::Status status;
+ if(reap_pid(pid, &status))
+ {
+ // the process has exited.
+ if (! desc.empty())
+ {
+ std::string statstr(desc + " apparently terminated: no status available");
+ // We don't just pass UNSTARTED to getStatusString() because, in
+ // the context of reap_pid(), that state has special meaning.
+ if (status.mState != UNSTARTED)
+ {
+ statstr = getStatusString(desc, status);
+ }
+ LL_INFOS("LLProcess") << statstr << LL_ENDL;
+ }
+ return 0;
+ }
+
+ return pid;
+}
+
+static LLProcess::Status interpret_status(int status)
+{
+ LLProcess::Status result;
+
+ if (WIFEXITED(status))
+ {
+ result.mState = LLProcess::EXITED;
+ result.mData = WEXITSTATUS(status);
+ }
+ else if (WIFSIGNALED(status))
+ {
+ result.mState = LLProcess::KILLED;
+ result.mData = WTERMSIG(status);
+ }
+ else // uh, shouldn't happen?
+ {
+ result.mState = LLProcess::EXITED;
+ result.mData = status; // someone else will have to decode
+ }
+
+ return result;
+}
+
+#endif // Posix
diff --git a/indra/llcommon/llprocess.h b/indra/llcommon/llprocess.h
new file mode 100644
index 0000000000..51010966f9
--- /dev/null
+++ b/indra/llcommon/llprocess.h
@@ -0,0 +1,546 @@
+/**
+ * @file llprocess.h
+ * @brief Utility class for launching, terminating, and tracking child processes.
+ *
+ * $LicenseInfo:firstyear=2008&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLPROCESS_H
+#define LL_LLPROCESS_H
+
+#include "llinitparam.h"
+#include "llsdparam.h"
+#include "apr_thread_proc.h"
+#include <boost/shared_ptr.hpp>
+#include <boost/ptr_container/ptr_vector.hpp>
+#include <boost/optional.hpp>
+#include <boost/noncopyable.hpp>
+#include <iosfwd> // std::ostream
+#include <stdexcept>
+
+#if LL_WINDOWS
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h> // HANDLE (eye roll)
+#elif LL_LINUX
+#if defined(Status)
+#undef Status
+#endif
+#endif
+
+class LLEventPump;
+
+class LLProcess;
+/// LLProcess instances are created on the heap by static factory methods and
+/// managed by ref-counted pointers.
+typedef boost::shared_ptr<LLProcess> LLProcessPtr;
+
+/**
+ * LLProcess handles launching an external process with specified command line
+ * arguments. It also keeps track of whether the process is still running, and
+ * can kill it if required.
+ *
+ * In discussing LLProcess, we use the term "parent" to refer to this process
+ * (the process invoking LLProcess), versus "child" to refer to the process
+ * spawned by LLProcess.
+ *
+ * LLProcess relies on periodic post() calls on the "mainloop" LLEventPump: an
+ * LLProcess object's Status won't update until the next "mainloop" tick. For
+ * instance, the Second Life viewer's main loop already posts to an
+ * LLEventPump by that name once per iteration. See
+ * indra/llcommon/tests/llprocess_test.cpp for an example of waiting for
+ * child-process termination in a standalone test context.
+ */
+class LL_COMMON_API LLProcess: public boost::noncopyable
+{
+ LOG_CLASS(LLProcess);
+public:
+ /**
+ * Specify what to pass for each of child stdin, stdout, stderr.
+ * @see LLProcess::Params::files.
+ */
+ struct FileParam: public LLInitParam::Block<FileParam>
+ {
+ /**
+ * type of file handle to pass to child process
+ *
+ * - "" (default): let the child inherit the same file handle used by
+ * this process. For instance, if passed as stdout, child stdout
+ * will be interleaved with stdout from this process. In this case,
+ * @a name is moot and should be left "".
+ *
+ * - "file": open an OS filesystem file with the specified @a name.
+ * <i>Not yet implemented.</i>
+ *
+ * - "pipe" or "tpipe" or "npipe": depends on @a name
+ *
+ * - @a name.empty(): construct an OS pipe used only for this slot
+ * of the forthcoming child process.
+ *
+ * - ! @a name.empty(): in a global registry, find or create (using
+ * the specified @a name) an OS pipe. The point of the (purely
+ * internal) @a name is that passing the same @a name in more than
+ * one slot for a given LLProcess -- or for slots in different
+ * LLProcess instances -- means the same pipe. For example, you
+ * might pass the same @a name value as both stdout and stderr to
+ * make the child process produce both on the same actual pipe. Or
+ * you might pass the same @a name as the stdout for one LLProcess
+ * and the stdin for another to connect the two child processes.
+ * Use LLProcess::getPipeName() to generate a unique name
+ * guaranteed not to already exist in the registry. <i>Not yet
+ * implemented.</i>
+ *
+ * The difference between "pipe", "tpipe" and "npipe" is as follows.
+ *
+ * - "pipe": direct LLProcess to monitor the parent end of the pipe,
+ * pumping nonblocking I/O every frame. The expectation (at least
+ * for stdout or stderr) is that the caller will listen for
+ * incoming data and consume it as it arrives. It's important not
+ * to neglect such a pipe, because it's buffered in memory. If you
+ * suspect the child may produce a great volume of output between
+ * frames, consider directing the child to write to a filesystem
+ * file instead, then read the file later.
+ *
+ * - "tpipe": do not engage LLProcess machinery to monitor the
+ * parent end of the pipe. A "tpipe" is used only to connect
+ * different child processes. As such, it makes little sense to
+ * pass an empty @a name. <i>Not yet implemented.</i>
+ *
+ * - "npipe": like "tpipe", but use an OS named pipe with a
+ * generated name. Note that @a name is the @em internal name of
+ * the pipe in our global registry -- it doesn't necessarily have
+ * anything to do with the pipe's name in the OS filesystem. Use
+ * LLProcess::getPipeName() to obtain the named pipe's OS
+ * filesystem name, e.g. to pass it as the @a name to another
+ * LLProcess instance using @a type "file". This supports usage
+ * like bash's &lt;(subcommand...) or &gt;(subcommand...)
+ * constructs. <i>Not yet implemented.</i>
+ *
+ * In all cases the open mode (read, write) is determined by the child
+ * slot you're filling. Child stdin means select the "read" end of a
+ * pipe, or open a filesystem file for reading; child stdout or stderr
+ * means select the "write" end of a pipe, or open a filesystem file
+ * for writing.
+ *
+ * Confusion such as passing the same pipe as the stdin of two
+ * processes (rather than stdout for one and stdin for the other) is
+ * explicitly permitted: it's up to the caller to construct meaningful
+ * LLProcess pipe graphs.
+ */
+ Optional<std::string> type;
+ Optional<std::string> name;
+
+ FileParam(const std::string& tp="", const std::string& nm=""):
+ type("type"),
+ name("name")
+ {
+ // If caller wants to specify values, use explicit assignment to
+ // set them rather than initialization.
+ if (! tp.empty()) type = tp;
+ if (! nm.empty()) name = nm;
+ }
+ };
+
+ /// Param block definition
+ struct Params: public LLInitParam::Block<Params>
+ {
+ Params():
+ executable("executable"),
+ args("args"),
+ cwd("cwd"),
+ autokill("autokill", true),
+ files("files"),
+ postend("postend"),
+ desc("desc")
+ {}
+
+ /// pathname of executable
+ Mandatory<std::string> executable;
+ /**
+ * zero or more additional command-line arguments. Arguments are
+ * passed through as exactly as we can manage, whitespace and all.
+ * @note On Windows we manage this by implicitly double-quoting each
+ * argument while assembling the command line.
+ */
+ Multiple<std::string> args;
+ /// current working directory, if need it changed
+ Optional<std::string> cwd;
+ /// implicitly kill process on destruction of LLProcess object
+ /// (default true)
+ Optional<bool> autokill;
+ /**
+ * Up to three FileParam items: for child stdin, stdout, stderr.
+ * Passing two FileParam entries means default treatment for stderr,
+ * and so forth.
+ *
+ * @note LLInitParam::Block permits usage like this:
+ * @code
+ * LLProcess::Params params;
+ * ...
+ * params.files
+ * .add(LLProcess::FileParam()) // stdin
+ * .add(LLProcess::FileParam().type("pipe") // stdout
+ * .add(LLProcess::FileParam().type("file").name("error.log"));
+ * @endcode
+ *
+ * @note While it's theoretically plausible to pass additional open
+ * file handles to a child specifically written to expect them, our
+ * underlying implementation doesn't yet support that.
+ */
+ Multiple<FileParam, AtMost<3> > files;
+ /**
+ * On child-process termination, if this LLProcess object still
+ * exists, post LLSD event to LLEventPump with specified name (default
+ * no event). Event contains at least:
+ *
+ * - "id" as obtained from getProcessID()
+ * - "desc" short string description of child (executable + pid)
+ * - "state" @c state enum value, from Status.mState
+ * - "data" if "state" is EXITED, exit code; if KILLED, on Posix,
+ * signal number
+ * - "string" English text describing "state" and "data" (e.g. "exited
+ * with code 0")
+ */
+ Optional<std::string> postend;
+ /**
+ * Description of child process for logging purposes. It need not be
+ * unique; the logged description string will contain the PID as well.
+ * If this is omitted, a description will be derived from the
+ * executable name.
+ */
+ Optional<std::string> desc;
+ };
+ typedef LLSDParamAdapter<Params> LLSDOrParams;
+
+ /**
+ * Factory accepting either plain LLSD::Map or Params block.
+ * MAY RETURN DEFAULT-CONSTRUCTED LLProcessPtr if params invalid!
+ */
+ static LLProcessPtr create(const LLSDOrParams& params);
+ virtual ~LLProcess();
+
+ /// Is child process still running?
+ bool isRunning() const;
+
+ /**
+ * State of child process
+ */
+ enum state
+ {
+ UNSTARTED, ///< initial value, invisible to consumer
+ RUNNING, ///< child process launched
+ EXITED, ///< child process terminated voluntarily
+ KILLED ///< child process terminated involuntarily
+ };
+
+ /**
+ * Status info
+ */
+ struct Status
+ {
+ Status():
+ mState(UNSTARTED),
+ mData(0)
+ {}
+
+ state mState; ///< @see state
+ /**
+ * - for mState == EXITED: mData is exit() code
+ * - for mState == KILLED: mData is signal number (Posix)
+ * - otherwise: mData is undefined
+ */
+ int mData;
+ };
+
+ /// Status query
+ Status getStatus() const;
+ /// English Status string query, for logging etc.
+ std::string getStatusString() const;
+ /// English Status string query for previously-captured Status
+ std::string getStatusString(const Status& status) const;
+ /// static English Status string query
+ static std::string getStatusString(const std::string& desc, const Status& status);
+
+ // Attempt to kill the process -- returns true if the process is no longer running when it returns.
+ // Note that even if this returns false, the process may exit some time after it's called.
+ bool kill(const std::string& who="");
+
+#if LL_WINDOWS
+ typedef int id; ///< as returned by getProcessID()
+ typedef HANDLE handle; ///< as returned by getProcessHandle()
+#else
+ typedef pid_t id;
+ typedef pid_t handle;
+#endif
+ /**
+ * Get an int-like id value. This is primarily intended for a human reader
+ * to differentiate processes.
+ */
+ id getProcessID() const;
+ /**
+ * Get a "handle" of a kind that you might pass to platform-specific API
+ * functions to engage features not directly supported by LLProcess.
+ */
+ handle getProcessHandle() const;
+
+ /**
+ * Test if a process (@c handle obtained from getProcessHandle()) is still
+ * running. Return same nonzero @c handle value if still running, else
+ * zero, so you can test it like a bool. But if you want to update a
+ * stored variable as a side effect, you can write code like this:
+ * @code
+ * hchild = LLProcess::isRunning(hchild);
+ * @endcode
+ * @note This method is intended as a unit-test hook, not as the first of
+ * a whole set of operations supported on freestanding @c handle values.
+ * New functionality should be added as nonstatic members operating on
+ * the same data as getProcessHandle().
+ *
+ * In particular, if child termination is detected by static isRunning()
+ * rather than by nonstatic isRunning(), the LLProcess object won't be
+ * aware of the child's changed status and may encounter OS errors trying
+ * to obtain it. static isRunning() is only intended for after the
+ * launching LLProcess object has been destroyed.
+ */
+ static handle isRunning(handle, const std::string& desc="");
+
+ /// Provide symbolic access to child's file slots
+ enum FILESLOT { STDIN=0, STDOUT=1, STDERR=2, NSLOTS=3 };
+
+ /**
+ * For a pipe constructed with @a type "npipe", obtain the generated OS
+ * filesystem name for the specified pipe. Otherwise returns the empty
+ * string. @see LLProcess::FileParam::type
+ */
+ std::string getPipeName(FILESLOT) const;
+
+ /// base of ReadPipe, WritePipe
+ class LL_COMMON_API BasePipe
+ {
+ public:
+ virtual ~BasePipe() = 0;
+
+ typedef std::size_t size_type;
+ static const size_type npos;
+
+ /**
+ * Get accumulated buffer length.
+ *
+ * For WritePipe, is there still pending data to send to child?
+ *
+ * For ReadPipe, we often need to refrain from actually reading the
+ * std::istream returned by get_istream() until we've accumulated
+ * enough data to make it worthwhile. For instance, if we're expecting
+ * a number from the child, but the child happens to flush "12" before
+ * emitting "3\n", get_istream() >> myint could return 12 rather than
+ * 123!
+ */
+ virtual size_type size() const = 0;
+ };
+
+ /// As returned by getWritePipe() or getOptWritePipe()
+ class WritePipe: public BasePipe
+ {
+ public:
+ /**
+ * Get ostream& on which to write to child's stdin.
+ *
+ * @usage
+ * @code
+ * myProcess->getWritePipe().get_ostream() << "Hello, child!" << std::endl;
+ * @endcode
+ */
+ virtual std::ostream& get_ostream() = 0;
+ };
+
+ /// As returned by getReadPipe() or getOptReadPipe()
+ class ReadPipe: public BasePipe
+ {
+ public:
+ /**
+ * Get istream& on which to read from child's stdout or stderr.
+ *
+ * @usage
+ * @code
+ * std::string stuff;
+ * myProcess->getReadPipe().get_istream() >> stuff;
+ * @endcode
+ *
+ * You should be sure in advance that the ReadPipe in question can
+ * fill the request. @see getPump()
+ */
+ virtual std::istream& get_istream() = 0;
+
+ /**
+ * Like std::getline(get_istream(), line), but trims off trailing '\r'
+ * to make calling code less platform-sensitive.
+ */
+ virtual std::string getline() = 0;
+
+ /**
+ * Like get_istream().read(buffer, n), but returns std::string rather
+ * than requiring caller to construct a buffer, etc.
+ */
+ virtual std::string read(size_type len) = 0;
+
+ /**
+ * Peek at accumulated buffer data without consuming it. Optional
+ * parameters give you substr() functionality.
+ *
+ * @note You can discard buffer data using get_istream().ignore(n).
+ */
+ virtual std::string peek(size_type offset=0, size_type len=npos) const = 0;
+
+ /**
+ * Detect presence of a substring (or char) in accumulated buffer data
+ * without retrieving it. Optional offset allows you to search from
+ * specified position.
+ */
+ template <typename SEEK>
+ bool contains(SEEK seek, size_type offset=0) const
+ { return find(seek, offset) != npos; }
+
+ /**
+ * Search for a substring in accumulated buffer data without
+ * retrieving it. Returns size_type position at which found, or npos
+ * meaning not found. Optional offset allows you to search from
+ * specified position.
+ */
+ virtual size_type find(const std::string& seek, size_type offset=0) const = 0;
+
+ /**
+ * Search for a char in accumulated buffer data without retrieving it.
+ * Returns size_type position at which found, or npos meaning not
+ * found. Optional offset allows you to search from specified
+ * position.
+ */
+ virtual size_type find(char seek, size_type offset=0) const = 0;
+
+ /**
+ * Get LLEventPump& on which to listen for incoming data. The posted
+ * LLSD::Map event will contain:
+ *
+ * - "data" part of pending data; see setLimit()
+ * - "len" entire length of pending data, regardless of setLimit()
+ * - "slot" this ReadPipe's FILESLOT, e.g. LLProcess::STDOUT
+ * - "name" e.g. "stdout"
+ * - "desc" e.g. "SLPlugin (pid) stdout"
+ * - "eof" @c true means there no more data will arrive on this pipe,
+ * therefore no more events on this pump
+ *
+ * If the child sends "abc", and this ReadPipe posts "data"="abc", but
+ * you don't consume it by reading the std::istream returned by
+ * get_istream(), and the child next sends "def", ReadPipe will post
+ * "data"="abcdef".
+ */
+ virtual LLEventPump& getPump() = 0;
+
+ /**
+ * Set maximum length of buffer data that will be posted in the LLSD
+ * announcing arrival of new data from the child. If you call
+ * setLimit(5), and the child sends "abcdef", the LLSD event will
+ * contain "data"="abcde". However, you may still read the entire
+ * "abcdef" from get_istream(): this limit affects only the size of
+ * the data posted with the LLSD event. If you don't call this method,
+ * @em no data will be posted: the default is 0 bytes.
+ */
+ virtual void setLimit(size_type limit) = 0;
+
+ /**
+ * Query the current setLimit() limit.
+ */
+ virtual size_type getLimit() const = 0;
+ };
+
+ /// Exception thrown by getWritePipe(), getReadPipe() if you didn't ask to
+ /// create a pipe at the corresponding FILESLOT.
+ struct NoPipe: public std::runtime_error
+ {
+ NoPipe(const std::string& what): std::runtime_error(what) {}
+ };
+
+ /**
+ * Get a reference to the (only) WritePipe for this LLProcess. @a slot, if
+ * specified, must be STDIN. Throws NoPipe if you did not request a "pipe"
+ * for child stdin. Use this method when you know how you created the
+ * LLProcess in hand.
+ */
+ WritePipe& getWritePipe(FILESLOT slot=STDIN);
+
+ /**
+ * Get a boost::optional<WritePipe&> to the (only) WritePipe for this
+ * LLProcess. @a slot, if specified, must be STDIN. The return value is
+ * empty if you did not request a "pipe" for child stdin. Use this method
+ * for inspecting an LLProcess you did not create.
+ */
+ boost::optional<WritePipe&> getOptWritePipe(FILESLOT slot=STDIN);
+
+ /**
+ * Get a reference to one of the ReadPipes for this LLProcess. @a slot, if
+ * specified, must be STDOUT or STDERR. Throws NoPipe if you did not
+ * request a "pipe" for child stdout or stderr. Use this method when you
+ * know how you created the LLProcess in hand.
+ */
+ ReadPipe& getReadPipe(FILESLOT slot);
+
+ /**
+ * Get a boost::optional<ReadPipe&> to one of the ReadPipes for this
+ * LLProcess. @a slot, if specified, must be STDOUT or STDERR. The return
+ * value is empty if you did not request a "pipe" for child stdout or
+ * stderr. Use this method for inspecting an LLProcess you did not create.
+ */
+ boost::optional<ReadPipe&> getOptReadPipe(FILESLOT slot);
+
+ /// little utilities that really should already be somewhere else in the
+ /// code base
+ static std::string basename(const std::string& path);
+ static std::string getline(std::istream&);
+
+private:
+ /// constructor is private: use create() instead
+ LLProcess(const LLSDOrParams& params);
+ void autokill();
+ // Classic-C-style APR callback
+ static void status_callback(int reason, void* data, int status);
+ // Object-oriented callback
+ void handle_status(int reason, int status);
+ // implementation for get[Opt][Read|Write]Pipe()
+ template <class PIPETYPE>
+ PIPETYPE& getPipe(FILESLOT slot);
+ template <class PIPETYPE>
+ boost::optional<PIPETYPE&> getOptPipe(FILESLOT slot);
+ template <class PIPETYPE>
+ PIPETYPE* getPipePtr(std::string& error, FILESLOT slot);
+
+ std::string mDesc;
+ std::string mPostend;
+ apr_proc_t mProcess;
+ bool mAutokill;
+ Status mStatus;
+ // explicitly want this ptr_vector to be able to store NULLs
+ typedef boost::ptr_vector< boost::nullable<BasePipe> > PipeVector;
+ PipeVector mPipes;
+};
+
+/// for logging
+LL_COMMON_API std::ostream& operator<<(std::ostream&, const LLProcess::Params&);
+
+#endif // LL_LLPROCESS_H
diff --git a/indra/llcommon/llprocesslauncher.cpp b/indra/llcommon/llprocesslauncher.cpp
deleted file mode 100644
index 10950181fd..0000000000
--- a/indra/llcommon/llprocesslauncher.cpp
+++ /dev/null
@@ -1,357 +0,0 @@
-/**
- * @file llprocesslauncher.cpp
- * @brief Utility class for launching, terminating, and tracking the state of processes.
- *
- * $LicenseInfo:firstyear=2008&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-#include "linden_common.h"
-
-#include "llprocesslauncher.h"
-
-#include <iostream>
-#if LL_DARWIN || LL_LINUX
-// not required or present on Win32
-#include <sys/wait.h>
-#endif
-
-LLProcessLauncher::LLProcessLauncher()
-{
-#if LL_WINDOWS
- mProcessHandle = 0;
-#else
- mProcessID = 0;
-#endif
-}
-
-LLProcessLauncher::~LLProcessLauncher()
-{
- kill();
-}
-
-void LLProcessLauncher::setExecutable(const std::string &executable)
-{
- mExecutable = executable;
-}
-
-void LLProcessLauncher::setWorkingDirectory(const std::string &dir)
-{
- mWorkingDir = dir;
-}
-
-const std::string& LLProcessLauncher::getExecutable() const
-{
- return mExecutable;
-}
-
-void LLProcessLauncher::clearArguments()
-{
- mLaunchArguments.clear();
-}
-
-void LLProcessLauncher::addArgument(const std::string &arg)
-{
- mLaunchArguments.push_back(arg);
-}
-
-void LLProcessLauncher::addArgument(const char *arg)
-{
- mLaunchArguments.push_back(std::string(arg));
-}
-
-#if LL_WINDOWS
-
-int LLProcessLauncher::launch(void)
-{
- // If there was already a process associated with this object, kill it.
- kill();
- orphan();
-
- int result = 0;
-
- PROCESS_INFORMATION pinfo;
- STARTUPINFOA sinfo;
- memset(&sinfo, 0, sizeof(sinfo));
-
- std::string args = mExecutable;
- for(int i = 0; i < (int)mLaunchArguments.size(); i++)
- {
- args += " ";
- args += mLaunchArguments[i];
- }
-
- // So retarded. Windows requires that the second parameter to CreateProcessA be a writable (non-const) string...
- char *args2 = new char[args.size() + 1];
- strcpy(args2, args.c_str());
-
- const char * working_directory = 0;
- if(!mWorkingDir.empty()) working_directory = mWorkingDir.c_str();
- if( ! CreateProcessA( NULL, args2, NULL, NULL, FALSE, 0, NULL, working_directory, &sinfo, &pinfo ) )
- {
- result = GetLastError();
-
- LPTSTR error_str = 0;
- if(
- FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
- NULL,
- result,
- 0,
- (LPTSTR)&error_str,
- 0,
- NULL)
- != 0)
- {
- char message[256];
- wcstombs(message, error_str, 256);
- message[255] = 0;
- llwarns << "CreateProcessA failed: " << message << llendl;
- LocalFree(error_str);
- }
-
- if(result == 0)
- {
- // Make absolutely certain we return a non-zero value on failure.
- result = -1;
- }
- }
- else
- {
- // foo = pinfo.dwProcessId; // get your pid here if you want to use it later on
- // CloseHandle(pinfo.hProcess); // stops leaks - nothing else
- mProcessHandle = pinfo.hProcess;
- CloseHandle(pinfo.hThread); // stops leaks - nothing else
- }
-
- delete[] args2;
-
- return result;
-}
-
-bool LLProcessLauncher::isRunning(void)
-{
- if(mProcessHandle != 0)
- {
- DWORD waitresult = WaitForSingleObject(mProcessHandle, 0);
- if(waitresult == WAIT_OBJECT_0)
- {
- // the process has completed.
- mProcessHandle = 0;
- }
- }
-
- return (mProcessHandle != 0);
-}
-bool LLProcessLauncher::kill(void)
-{
- bool result = true;
-
- if(mProcessHandle != 0)
- {
- TerminateProcess(mProcessHandle,0);
-
- if(isRunning())
- {
- result = false;
- }
- }
-
- return result;
-}
-
-void LLProcessLauncher::orphan(void)
-{
- // Forget about the process
- mProcessHandle = 0;
-}
-
-// static
-void LLProcessLauncher::reap(void)
-{
- // No actions necessary on Windows.
-}
-
-#else // Mac and linux
-
-#include <signal.h>
-#include <fcntl.h>
-#include <errno.h>
-
-static std::list<pid_t> sZombies;
-
-// Attempt to reap a process ID -- returns true if the process has exited and been reaped, false otherwise.
-static bool reap_pid(pid_t pid)
-{
- bool result = false;
-
- pid_t wait_result = ::waitpid(pid, NULL, WNOHANG);
- if(wait_result == pid)
- {
- result = true;
- }
- else if(wait_result == -1)
- {
- if(errno == ECHILD)
- {
- // No such process -- this may mean we're ignoring SIGCHILD.
- result = true;
- }
- }
-
- return result;
-}
-
-int LLProcessLauncher::launch(void)
-{
- // If there was already a process associated with this object, kill it.
- kill();
- orphan();
-
- int result = 0;
- int current_wd = -1;
-
- // create an argv vector for the child process
- const char ** fake_argv = new const char *[mLaunchArguments.size() + 2]; // 1 for the executable path, 1 for the NULL terminator
-
- int i = 0;
-
- // add the executable path
- fake_argv[i++] = mExecutable.c_str();
-
- // and any arguments
- for(int j=0; j < mLaunchArguments.size(); j++)
- fake_argv[i++] = mLaunchArguments[j].c_str();
-
- // terminate with a null pointer
- fake_argv[i] = NULL;
-
- if(!mWorkingDir.empty())
- {
- // save the current working directory
- current_wd = ::open(".", O_RDONLY);
-
- // and change to the one the child will be executed in
- if (::chdir(mWorkingDir.c_str()))
- {
- // chdir failed
- }
- }
-
- // flush all buffers before the child inherits them
- ::fflush(NULL);
-
- pid_t id = vfork();
- if(id == 0)
- {
- // child process
-
- ::execv(mExecutable.c_str(), (char * const *)fake_argv);
-
- // If we reach this point, the exec failed.
- // Use _exit() instead of exit() per the vfork man page.
- _exit(0);
- }
-
- // parent process
-
- if(current_wd >= 0)
- {
- // restore the previous working directory
- if (::fchdir(current_wd))
- {
- // chdir failed
- }
- ::close(current_wd);
- }
-
- delete[] fake_argv;
-
- mProcessID = id;
-
- return result;
-}
-
-bool LLProcessLauncher::isRunning(void)
-{
- if(mProcessID != 0)
- {
- // Check whether the process has exited, and reap it if it has.
- if(reap_pid(mProcessID))
- {
- // the process has exited.
- mProcessID = 0;
- }
- }
-
- return (mProcessID != 0);
-}
-
-bool LLProcessLauncher::kill(void)
-{
- bool result = true;
-
- if(mProcessID != 0)
- {
- // Try to kill the process. We'll do approximately the same thing whether the kill returns an error or not, so we ignore the result.
- (void)::kill(mProcessID, SIGTERM);
-
- // This will have the side-effect of reaping the zombie if the process has exited.
- if(isRunning())
- {
- result = false;
- }
- }
-
- return result;
-}
-
-void LLProcessLauncher::orphan(void)
-{
- // Disassociate the process from this object
- if(mProcessID != 0)
- {
- // We may still need to reap the process's zombie eventually
- sZombies.push_back(mProcessID);
-
- mProcessID = 0;
- }
-}
-
-// static
-void LLProcessLauncher::reap(void)
-{
- // Attempt to real all saved process ID's.
-
- std::list<pid_t>::iterator iter = sZombies.begin();
- while(iter != sZombies.end())
- {
- if(reap_pid(*iter))
- {
- iter = sZombies.erase(iter);
- }
- else
- {
- iter++;
- }
- }
-}
-
-#endif
diff --git a/indra/llcommon/llprocesslauncher.h b/indra/llcommon/llprocesslauncher.h
deleted file mode 100644
index 954c249147..0000000000
--- a/indra/llcommon/llprocesslauncher.h
+++ /dev/null
@@ -1,90 +0,0 @@
-/**
- * @file llprocesslauncher.h
- * @brief Utility class for launching, terminating, and tracking the state of processes.
- *
- * $LicenseInfo:firstyear=2008&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-#ifndef LL_LLPROCESSLAUNCHER_H
-#define LL_LLPROCESSLAUNCHER_H
-
-#if LL_WINDOWS
-#include <windows.h>
-#endif
-
-
-/*
- LLProcessLauncher handles launching external processes with specified command line arguments.
- It also keeps track of whether the process is still running, and can kill it if required.
-*/
-
-class LL_COMMON_API LLProcessLauncher
-{
- LOG_CLASS(LLProcessLauncher);
-public:
- LLProcessLauncher();
- virtual ~LLProcessLauncher();
-
- void setExecutable(const std::string &executable);
- void setWorkingDirectory(const std::string &dir);
-
- const std::string& getExecutable() const;
-
- void clearArguments();
- void addArgument(const std::string &arg);
- void addArgument(const char *arg);
-
- int launch(void);
- bool isRunning(void);
-
- // Attempt to kill the process -- returns true if the process is no longer running when it returns.
- // Note that even if this returns false, the process may exit some time after it's called.
- bool kill(void);
-
- // Use this if you want the external process to continue execution after the LLProcessLauncher instance controlling it is deleted.
- // Normally, the destructor will attempt to kill the process and wait for termination.
- // This should only be used if the viewer is about to exit -- otherwise, the child process will become a zombie after it exits.
- void orphan(void);
-
- // This needs to be called periodically on Mac/Linux to clean up zombie processes.
- static void reap(void);
-
- // Accessors for platform-specific process ID
-#if LL_WINDOWS
- HANDLE getProcessHandle() { return mProcessHandle; };
-#else
- pid_t getProcessID() { return mProcessID; };
-#endif
-
-private:
- std::string mExecutable;
- std::string mWorkingDir;
- std::vector<std::string> mLaunchArguments;
-
-#if LL_WINDOWS
- HANDLE mProcessHandle;
-#else
- pid_t mProcessID;
-#endif
-};
-
-#endif // LL_LLPROCESSLAUNCHER_H
diff --git a/indra/llcommon/llqueuedthread.cpp b/indra/llcommon/llqueuedthread.cpp
index efd9c4b68f..1738c16dea 100644
--- a/indra/llcommon/llqueuedthread.cpp
+++ b/indra/llcommon/llqueuedthread.cpp
@@ -32,7 +32,7 @@
//============================================================================
// MAIN THREAD
-LLQueuedThread::LLQueuedThread(const std::string& name, bool threaded) :
+LLQueuedThread::LLQueuedThread(const std::string& name, bool threaded, bool should_pause) :
LLThread(name),
mThreaded(threaded),
mIdleThread(TRUE),
@@ -41,6 +41,11 @@ LLQueuedThread::LLQueuedThread(const std::string& name, bool threaded) :
{
if (mThreaded)
{
+ if(should_pause)
+ {
+ pause() ; //call this before start the thread.
+ }
+
start();
}
}
@@ -104,7 +109,7 @@ void LLQueuedThread::shutdown()
// MAIN THREAD
// virtual
-S32 LLQueuedThread::update(U32 max_time_ms)
+S32 LLQueuedThread::update(F32 max_time_ms)
{
if (!mStarted)
{
@@ -117,7 +122,7 @@ S32 LLQueuedThread::update(U32 max_time_ms)
return updateQueue(max_time_ms);
}
-S32 LLQueuedThread::updateQueue(U32 max_time_ms)
+S32 LLQueuedThread::updateQueue(F32 max_time_ms)
{
F64 max_time = (F64)max_time_ms * .001;
LLTimer timer;
diff --git a/indra/llcommon/llqueuedthread.h b/indra/llcommon/llqueuedthread.h
index a53b22f6fc..d3704b0fe2 100644
--- a/indra/llcommon/llqueuedthread.h
+++ b/indra/llcommon/llqueuedthread.h
@@ -149,7 +149,7 @@ public:
static handle_t nullHandle() { return handle_t(0); }
public:
- LLQueuedThread(const std::string& name, bool threaded = true);
+ LLQueuedThread(const std::string& name, bool threaded = true, bool should_pause = false);
virtual ~LLQueuedThread();
virtual void shutdown();
@@ -173,8 +173,8 @@ protected:
public:
bool waitForResult(handle_t handle, bool auto_complete = true);
- virtual S32 update(U32 max_time_ms);
- S32 updateQueue(U32 max_time_ms);
+ virtual S32 update(F32 max_time_ms);
+ S32 updateQueue(F32 max_time_ms);
void waitOnPending();
void printQueueStats();
diff --git a/indra/llcommon/llregistry.h b/indra/llcommon/llregistry.h
new file mode 100644
index 0000000000..36d7f7a44c
--- /dev/null
+++ b/indra/llcommon/llregistry.h
@@ -0,0 +1,370 @@
+/**
+ * @file llregistry.h
+ * @brief template classes for registering name, value pairs in nested scopes, statically, etc.
+ *
+ * $LicenseInfo:firstyear=2001&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLREGISTRY_H
+#define LL_LLREGISTRY_H
+
+#include <list>
+
+#include <boost/type_traits.hpp>
+#include "llsingleton.h"
+#include "lltypeinfolookup.h"
+
+template <typename T>
+class LLRegistryDefaultComparator
+{
+ bool operator()(const T& lhs, const T& rhs) { return lhs < rhs; }
+};
+
+template <typename KEY, typename VALUE>
+struct LLRegistryMapSelector
+{
+ typedef std::map<KEY, VALUE> type;
+};
+
+template <typename VALUE>
+struct LLRegistryMapSelector<std::type_info*, VALUE>
+{
+ typedef LLTypeInfoLookup<VALUE> type;
+};
+
+template <typename VALUE>
+struct LLRegistryMapSelector<const std::type_info*, VALUE>
+{
+ typedef LLTypeInfoLookup<VALUE> type;
+};
+
+template <typename KEY, typename VALUE, typename COMPARATOR = LLRegistryDefaultComparator<KEY> >
+class LLRegistry
+{
+public:
+ typedef LLRegistry<KEY, VALUE, COMPARATOR> registry_t;
+ typedef typename boost::add_reference<typename boost::add_const<KEY>::type>::type ref_const_key_t;
+ typedef typename boost::add_reference<typename boost::add_const<VALUE>::type>::type ref_const_value_t;
+ typedef typename boost::add_reference<VALUE>::type ref_value_t;
+ typedef typename boost::add_pointer<typename boost::add_const<VALUE>::type>::type ptr_const_value_t;
+ typedef typename boost::add_pointer<VALUE>::type ptr_value_t;
+
+ class Registrar
+ {
+ friend class LLRegistry<KEY, VALUE, COMPARATOR>;
+ public:
+ typedef typename LLRegistryMapSelector<KEY, VALUE>::type registry_map_t;
+
+ bool add(ref_const_key_t key, ref_const_value_t value)
+ {
+ if (mMap.insert(std::make_pair(key, value)).second == false)
+ {
+ llwarns << "Tried to register " << key << " but it was already registered!" << llendl;
+ return false;
+ }
+ return true;
+ }
+
+ void remove(ref_const_key_t key)
+ {
+ mMap.erase(key);
+ }
+
+ void replace(ref_const_key_t key, ref_const_value_t value)
+ {
+ mMap[key] = value;
+ }
+
+ typename registry_map_t::const_iterator beginItems() const
+ {
+ return mMap.begin();
+ }
+
+ typename registry_map_t::const_iterator endItems() const
+ {
+ return mMap.end();
+ }
+
+ protected:
+ ptr_value_t getValue(ref_const_key_t key)
+ {
+ typename registry_map_t::iterator found_it = mMap.find(key);
+ if (found_it != mMap.end())
+ {
+ return &(found_it->second);
+ }
+ return NULL;
+ }
+
+ ptr_const_value_t getValue(ref_const_key_t key) const
+ {
+ typename registry_map_t::const_iterator found_it = mMap.find(key);
+ if (found_it != mMap.end())
+ {
+ return &(found_it->second);
+ }
+ return NULL;
+ }
+
+ // if the registry is used to store pointers, and null values are valid entries
+ // then use this function to check the existence of an entry
+ bool exists(ref_const_key_t key) const
+ {
+ return mMap.find(key) != mMap.end();
+ }
+
+ bool empty() const
+ {
+ return mMap.empty();
+ }
+
+ protected:
+ // use currentRegistrar() or defaultRegistrar()
+ Registrar() {}
+ ~Registrar() {}
+
+ private:
+ registry_map_t mMap;
+ };
+
+ typedef typename std::list<Registrar*> scope_list_t;
+ typedef typename std::list<Registrar*>::iterator scope_list_iterator_t;
+ typedef typename std::list<Registrar*>::const_iterator scope_list_const_iterator_t;
+
+ LLRegistry()
+ {}
+
+ ~LLRegistry() {}
+
+ ptr_value_t getValue(ref_const_key_t key)
+ {
+ for(scope_list_iterator_t it = mActiveScopes.begin();
+ it != mActiveScopes.end();
+ ++it)
+ {
+ ptr_value_t valuep = (*it)->getValue(key);
+ if (valuep != NULL) return valuep;
+ }
+ return mDefaultRegistrar.getValue(key);
+ }
+
+ ptr_const_value_t getValue(ref_const_key_t key) const
+ {
+ for(scope_list_const_iterator_t it = mActiveScopes.begin();
+ it != mActiveScopes.end();
+ ++it)
+ {
+ ptr_value_t valuep = (*it)->getValue(key);
+ if (valuep != NULL) return valuep;
+ }
+ return mDefaultRegistrar.getValue(key);
+ }
+
+ bool exists(ref_const_key_t key) const
+ {
+ for(scope_list_const_iterator_t it = mActiveScopes.begin();
+ it != mActiveScopes.end();
+ ++it)
+ {
+ if ((*it)->exists(key)) return true;
+ }
+
+ return mDefaultRegistrar.exists(key);
+ }
+
+ bool empty() const
+ {
+ for(scope_list_const_iterator_t it = mActiveScopes.begin();
+ it != mActiveScopes.end();
+ ++it)
+ {
+ if (!(*it)->empty()) return false;
+ }
+
+ return mDefaultRegistrar.empty();
+ }
+
+
+ Registrar& defaultRegistrar()
+ {
+ return mDefaultRegistrar;
+ }
+
+ const Registrar& defaultRegistrar() const
+ {
+ return mDefaultRegistrar;
+ }
+
+
+ Registrar& currentRegistrar()
+ {
+ if (!mActiveScopes.empty())
+ {
+ return *mActiveScopes.front();
+ }
+
+ return mDefaultRegistrar;
+ }
+
+ const Registrar& currentRegistrar() const
+ {
+ if (!mActiveScopes.empty())
+ {
+ return *mActiveScopes.front();
+ }
+
+ return mDefaultRegistrar;
+ }
+
+
+protected:
+ void addScope(Registrar* scope)
+ {
+ // newer scopes go up front
+ mActiveScopes.insert(mActiveScopes.begin(), scope);
+ }
+
+ void removeScope(Registrar* scope)
+ {
+ // O(N) but should be near the beggining and N should be small and this is safer than storing iterators
+ scope_list_iterator_t iter = std::find(mActiveScopes.begin(), mActiveScopes.end(), scope);
+ if (iter != mActiveScopes.end())
+ {
+ mActiveScopes.erase(iter);
+ }
+ }
+
+private:
+ scope_list_t mActiveScopes;
+ Registrar mDefaultRegistrar;
+};
+
+template <typename KEY, typename VALUE, typename DERIVED_TYPE, typename COMPARATOR = LLRegistryDefaultComparator<KEY> >
+class LLRegistrySingleton
+ : public LLRegistry<KEY, VALUE, COMPARATOR>,
+ public LLSingleton<DERIVED_TYPE>
+{
+ friend class LLSingleton<DERIVED_TYPE>;
+public:
+ typedef LLRegistry<KEY, VALUE, COMPARATOR> registry_t;
+ typedef const KEY& ref_const_key_t;
+ typedef const VALUE& ref_const_value_t;
+ typedef VALUE* ptr_value_t;
+ typedef const VALUE* ptr_const_value_t;
+ typedef LLSingleton<DERIVED_TYPE> singleton_t;
+
+ class ScopedRegistrar : public registry_t::Registrar
+ {
+ public:
+ ScopedRegistrar(bool push_scope = true)
+ {
+ if (push_scope)
+ {
+ pushScope();
+ }
+ }
+
+ ~ScopedRegistrar()
+ {
+ if (!singleton_t::destroyed())
+ {
+ popScope();
+ }
+ }
+
+ void pushScope()
+ {
+ singleton_t::instance().addScope(this);
+ }
+
+ void popScope()
+ {
+ singleton_t::instance().removeScope(this);
+ }
+
+ ptr_value_t getValueFromScope(ref_const_key_t key)
+ {
+ return getValue(key);
+ }
+
+ ptr_const_value_t getValueFromScope(ref_const_key_t key) const
+ {
+ return getValue(key);
+ }
+
+ private:
+ typename std::list<typename registry_t::Registrar*>::iterator mListIt;
+ };
+
+ class StaticRegistrar : public registry_t::Registrar
+ {
+ public:
+ virtual ~StaticRegistrar() {}
+ StaticRegistrar(ref_const_key_t key, ref_const_value_t value)
+ {
+ singleton_t::instance().mStaticScope->add(key, value);
+ }
+ };
+
+ // convenience functions
+ typedef typename LLRegistry<KEY, VALUE, COMPARATOR>::Registrar& ref_registrar_t;
+ static ref_registrar_t currentRegistrar()
+ {
+ return singleton_t::instance().registry_t::currentRegistrar();
+ }
+
+ static ref_registrar_t defaultRegistrar()
+ {
+ return singleton_t::instance().registry_t::defaultRegistrar();
+ }
+
+ static ptr_value_t getValue(ref_const_key_t key)
+ {
+ return singleton_t::instance().registry_t::getValue(key);
+ }
+
+protected:
+ // DERIVED_TYPE needs to derive from LLRegistrySingleton
+ LLRegistrySingleton()
+ : mStaticScope(NULL)
+ {}
+
+ virtual void initSingleton()
+ {
+ mStaticScope = new ScopedRegistrar();
+ }
+
+ virtual ~LLRegistrySingleton()
+ {
+ delete mStaticScope;
+ }
+
+private:
+ ScopedRegistrar* mStaticScope;
+};
+
+// helper macro for doing static registration
+#define GLUED_TOKEN(x, y) x ## y
+#define GLUE_TOKENS(x, y) GLUED_TOKEN(x, y)
+#define LLREGISTER_STATIC(REGISTRY, KEY, VALUE) static REGISTRY::StaticRegistrar GLUE_TOKENS(reg, __LINE__)(KEY, VALUE);
+
+#endif
diff --git a/indra/llcommon/llscopedvolatileaprpool.h b/indra/llcommon/llscopedvolatileaprpool.h
deleted file mode 100644
index dbaf4edcad..0000000000
--- a/indra/llcommon/llscopedvolatileaprpool.h
+++ /dev/null
@@ -1,52 +0,0 @@
-/**
- * @file llscopedvolatileaprpool.h
- * @brief Implementation of LLScopedVolatileAPRPool
- *
- * $LicenseInfo:firstyear=2010&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2011, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-#ifndef LL_LLSCOPEDVOLATILEAPRPOOL_H
-#define LL_LLSCOPEDVOLATILEAPRPOOL_H
-
-#include "llthread.h"
-
-/** Scoped volatile memory pool.
- *
- * As the LLVolatileAPRPool should never keep allocations very
- * long, its most common use is for allocations with a lifetime
- * equal to it's scope.
- *
- * This is a convenience class that makes just a little easier to type.
- */
-class LL_COMMON_API LLScopedVolatileAPRPool
-{
-private:
- LLVolatileAPRPool& mPool;
- apr_pool_t* mScopedAPRpool; // The use of apr_pool_t is OK here.
-public:
- LLScopedVolatileAPRPool() : mPool(LLThreadLocalData::tldata().mVolatileAPRPool), mScopedAPRpool(mPool.getVolatileAPRPool()) { }
- ~LLScopedVolatileAPRPool() { mPool.clearVolatileAPRPool(); }
- //! @attention Only use this to pass the underlaying pointer to a libapr-1 function that requires it.
- operator apr_pool_t*() const { return mScopedAPRpool; } // The use of apr_pool_t is OK here.
-};
-
-#endif
diff --git a/indra/llcommon/llsd.cpp b/indra/llcommon/llsd.cpp
index 6ca0737445..e295e3c621 100644
--- a/indra/llcommon/llsd.cpp
+++ b/indra/llcommon/llsd.cpp
@@ -24,6 +24,9 @@
* $/LicenseInfo$
*/
+// Must turn on conditional declarations in header file so definitions end up
+// with proper linkage.
+#define LLSD_DEBUG_INFO
#include "linden_common.h"
#include "llsd.h"
@@ -31,6 +34,7 @@
#include "../llmath/llmath.h"
#include "llformat.h"
#include "llsdserialize.h"
+#include "stringize.h"
#ifndef LL_RELEASE_FOR_DOWNLOAD
#define NAME_UNNAMED_NAMESPACE
@@ -50,6 +54,18 @@ namespace
using namespace LLSDUnnamedNamespace;
#endif
+namespace llsd
+{
+
+// statics
+S32 sLLSDAllocationCount = 0;
+S32 sLLSDNetObjects = 0;
+
+} // namespace llsd
+
+#define ALLOC_LLSD_OBJECT { llsd::sLLSDNetObjects++; llsd::sLLSDAllocationCount++; }
+#define FREE_LLSD_OBJECT { llsd::sLLSDNetObjects--; }
+
class LLSD::Impl
/**< This class is the abstract base class of the implementation of LLSD
It provides the reference counting implementation, and the default
@@ -58,13 +74,10 @@ class LLSD::Impl
*/
{
-private:
- U32 mUseCount;
-
protected:
Impl();
- enum StaticAllocationMarker { STATIC };
+ enum StaticAllocationMarker { STATIC_USAGE_COUNT = 0xFFFFFFFF };
Impl(StaticAllocationMarker);
///< This constructor is used for static objects and causes the
// suppresses adjusting the debugging counters when they are
@@ -72,8 +85,10 @@ protected:
virtual ~Impl();
- bool shared() const { return mUseCount > 1; }
+ bool shared() const { return (mUseCount > 1) && (mUseCount != STATIC_USAGE_COUNT); }
+ U32 mUseCount;
+
public:
static void reset(Impl*& var, Impl* impl);
///< safely set var to refer to the new impl (possibly shared)
@@ -128,6 +143,18 @@ public:
virtual LLSD::array_const_iterator beginArray() const { return endArray(); }
virtual LLSD::array_const_iterator endArray() const { static const std::vector<LLSD> empty; return empty.end(); }
+ virtual void dumpStats() const;
+ virtual void calcStats(S32 type_counts[], S32 share_counts[]) const;
+ // Container subclasses contain LLSD objects, rather than directly
+ // containing Impl objects. This helper forwards through LLSD.
+ void calcStats(const LLSD& llsd, S32 type_counts[], S32 share_counts[]) const
+ {
+ safe(llsd.impl).calcStats(type_counts, share_counts);
+ }
+
+ static const Impl& getImpl(const LLSD& llsd) { return safe(llsd.impl); }
+ static Impl& getImpl(LLSD& llsd) { return safe(llsd.impl); }
+
static const LLSD& undef();
static U32 sAllocationCount;
@@ -360,6 +387,9 @@ namespace
LLSD::map_iterator endMap() { return mData.end(); }
virtual LLSD::map_const_iterator beginMap() const { return mData.begin(); }
virtual LLSD::map_const_iterator endMap() const { return mData.end(); }
+
+ virtual void dumpStats() const;
+ virtual void calcStats(S32 type_counts[], S32 share_counts[]) const;
};
ImplMap& ImplMap::makeMap(LLSD::Impl*& var)
@@ -414,6 +444,34 @@ namespace
return i->second;
}
+ void ImplMap::dumpStats() const
+ {
+ std::cout << "Map size: " << mData.size() << std::endl;
+
+ std::cout << "LLSD Net Objects: " << llsd::sLLSDNetObjects << std::endl;
+ std::cout << "LLSD allocations: " << llsd::sLLSDAllocationCount << std::endl;
+
+ std::cout << "LLSD::Impl Net Objects: " << sOutstandingCount << std::endl;
+ std::cout << "LLSD::Impl allocations: " << sAllocationCount << std::endl;
+
+ Impl::dumpStats();
+ }
+
+ void ImplMap::calcStats(S32 type_counts[], S32 share_counts[]) const
+ {
+ LLSD::map_const_iterator iter = beginMap();
+ while (iter != endMap())
+ {
+ //std::cout << " " << (*iter).first << ": " << (*iter).second << std::endl;
+ Impl::calcStats((*iter).second, type_counts, share_counts);
+ iter++;
+ }
+
+ // Add in the values for this map
+ Impl::calcStats(type_counts, share_counts);
+ }
+
+
class ImplArray : public LLSD::Impl
{
private:
@@ -449,6 +507,8 @@ namespace
LLSD::array_iterator endArray() { return mData.end(); }
virtual LLSD::array_const_iterator beginArray() const { return mData.begin(); }
virtual LLSD::array_const_iterator endArray() const { return mData.end(); }
+
+ virtual void calcStats(S32 type_counts[], S32 share_counts[]) const;
};
ImplArray& ImplArray::makeArray(Impl*& var)
@@ -490,12 +550,13 @@ namespace
void ImplArray::insert(LLSD::Integer i, const LLSD& v)
{
- if (i < 0) {
+ if (i < 0)
+ {
return;
}
DataVector::size_type index = i;
- if (index >= mData.size())
+ if (index >= mData.size()) // tbd - sanity check limit for index ?
{
mData.resize(index + 1);
}
@@ -543,6 +604,19 @@ namespace
return mData[index];
}
+
+ void ImplArray::calcStats(S32 type_counts[], S32 share_counts[]) const
+ {
+ LLSD::array_const_iterator iter = beginArray();
+ while (iter != endArray())
+ { // Add values for all items held in the array
+ Impl::calcStats((*iter), type_counts, share_counts);
+ iter++;
+ }
+
+ // Add in the values for this array
+ Impl::calcStats(type_counts, share_counts);
+ }
}
LLSD::Impl::Impl()
@@ -564,8 +638,11 @@ LLSD::Impl::~Impl()
void LLSD::Impl::reset(Impl*& var, Impl* impl)
{
- if (impl) ++impl->mUseCount;
- if (var && --var->mUseCount == 0)
+ if (impl && impl->mUseCount != STATIC_USAGE_COUNT)
+ {
+ ++impl->mUseCount;
+ }
+ if (var && var->mUseCount != STATIC_USAGE_COUNT && --var->mUseCount == 0)
{
delete var;
}
@@ -574,13 +651,13 @@ void LLSD::Impl::reset(Impl*& var, Impl* impl)
LLSD::Impl& LLSD::Impl::safe(Impl* impl)
{
- static Impl theUndefined(STATIC);
+ static Impl theUndefined(STATIC_USAGE_COUNT);
return impl ? *impl : theUndefined;
}
const LLSD::Impl& LLSD::Impl::safe(const Impl* impl)
{
- static Impl theUndefined(STATIC);
+ static Impl theUndefined(STATIC_USAGE_COUNT);
return impl ? *impl : theUndefined;
}
@@ -656,6 +733,43 @@ const LLSD& LLSD::Impl::undef()
return immutableUndefined;
}
+void LLSD::Impl::dumpStats() const
+{
+ S32 type_counts[LLSD::TypeLLSDNumTypes + 1];
+ memset(&type_counts, 0, sizeof(type_counts));
+
+ S32 share_counts[LLSD::TypeLLSDNumTypes + 1];
+ memset(&share_counts, 0, sizeof(share_counts));
+
+ // Add info from all the values this object has
+ calcStats(type_counts, share_counts);
+
+ S32 type_index = LLSD::TypeLLSDTypeBegin;
+ while (type_index != LLSD::TypeLLSDTypeEnd)
+ {
+ std::cout << LLSD::typeString((LLSD::Type)type_index) << " type "
+ << type_counts[type_index] << " objects, "
+ << share_counts[type_index] << " shared"
+ << std::endl;
+ type_index++;
+ }
+}
+
+
+void LLSD::Impl::calcStats(S32 type_counts[], S32 share_counts[]) const
+{
+ S32 tp = S32(type());
+ if (0 <= tp && tp < LLSD::TypeLLSDNumTypes)
+ {
+ type_counts[tp]++;
+ if (shared())
+ {
+ share_counts[tp]++;
+ }
+ }
+}
+
+
U32 LLSD::Impl::sAllocationCount = 0;
U32 LLSD::Impl::sOutstandingCount = 0;
@@ -681,10 +795,10 @@ namespace
}
-LLSD::LLSD() : impl(0) { }
-LLSD::~LLSD() { Impl::reset(impl, 0); }
+LLSD::LLSD() : impl(0) { ALLOC_LLSD_OBJECT; }
+LLSD::~LLSD() { FREE_LLSD_OBJECT; Impl::reset(impl, 0); }
-LLSD::LLSD(const LLSD& other) : impl(0) { assign(other); }
+LLSD::LLSD(const LLSD& other) : impl(0) { ALLOC_LLSD_OBJECT; assign(other); }
void LLSD::assign(const LLSD& other) { Impl::assign(impl, other.impl); }
@@ -692,18 +806,18 @@ void LLSD::clear() { Impl::assignUndefined(impl); }
LLSD::Type LLSD::type() const { return safe(impl).type(); }
-// Scaler Constructors
-LLSD::LLSD(Boolean v) : impl(0) { assign(v); }
-LLSD::LLSD(Integer v) : impl(0) { assign(v); }
-LLSD::LLSD(Real v) : impl(0) { assign(v); }
-LLSD::LLSD(const UUID& v) : impl(0) { assign(v); }
-LLSD::LLSD(const String& v) : impl(0) { assign(v); }
-LLSD::LLSD(const Date& v) : impl(0) { assign(v); }
-LLSD::LLSD(const URI& v) : impl(0) { assign(v); }
-LLSD::LLSD(const Binary& v) : impl(0) { assign(v); }
+// Scalar Constructors
+LLSD::LLSD(Boolean v) : impl(0) { ALLOC_LLSD_OBJECT; assign(v); }
+LLSD::LLSD(Integer v) : impl(0) { ALLOC_LLSD_OBJECT; assign(v); }
+LLSD::LLSD(Real v) : impl(0) { ALLOC_LLSD_OBJECT; assign(v); }
+LLSD::LLSD(const UUID& v) : impl(0) { ALLOC_LLSD_OBJECT; assign(v); }
+LLSD::LLSD(const String& v) : impl(0) { ALLOC_LLSD_OBJECT; assign(v); }
+LLSD::LLSD(const Date& v) : impl(0) { ALLOC_LLSD_OBJECT; assign(v); }
+LLSD::LLSD(const URI& v) : impl(0) { ALLOC_LLSD_OBJECT; assign(v); }
+LLSD::LLSD(const Binary& v) : impl(0) { ALLOC_LLSD_OBJECT; assign(v); }
// Convenience Constructors
-LLSD::LLSD(F32 v) : impl(0) { assign((Real)v); }
+LLSD::LLSD(F32 v) : impl(0) { ALLOC_LLSD_OBJECT; assign((Real)v); }
// Scalar Assignment
void LLSD::assign(Boolean v) { safe(impl).assign(impl, v); }
@@ -726,7 +840,7 @@ LLSD::URI LLSD::asURI() const { return safe(impl).asURI(); }
LLSD::Binary LLSD::asBinary() const { return safe(impl).asBinary(); }
// const char * helpers
-LLSD::LLSD(const char* v) : impl(0) { assign(v); }
+LLSD::LLSD(const char* v) : impl(0) { ALLOC_LLSD_OBJECT; assign(v); }
void LLSD::assign(const char* v)
{
if(v) assign(std::string(v));
@@ -784,9 +898,6 @@ LLSD& LLSD::operator[](Integer i)
const LLSD& LLSD::operator[](Integer i) const
{ return safe(impl).ref(i); }
-U32 LLSD::allocationCount() { return Impl::sAllocationCount; }
-U32 LLSD::outstandingCount() { return Impl::sOutstandingCount; }
-
static const char *llsd_dump(const LLSD &llsd, bool useXMLFormat)
{
// sStorage is used to hold the string representation of the llsd last
@@ -801,15 +912,9 @@ static const char *llsd_dump(const LLSD &llsd, bool useXMLFormat)
{
std::ostringstream out;
if (useXMLFormat)
- {
- LLSDXMLStreamer xml_streamer(llsd);
- out << xml_streamer;
- }
+ out << LLSDXMLStreamer(llsd);
else
- {
- LLSDNotationStreamer notation_streamer(llsd);
- out << notation_streamer;
- }
+ out << LLSDNotationStreamer(llsd);
out_string = out.str();
}
int len = out_string.length();
@@ -840,3 +945,38 @@ LLSD::array_iterator LLSD::beginArray() { return makeArray(impl).beginArray();
LLSD::array_iterator LLSD::endArray() { return makeArray(impl).endArray(); }
LLSD::array_const_iterator LLSD::beginArray() const{ return safe(impl).beginArray(); }
LLSD::array_const_iterator LLSD::endArray() const { return safe(impl).endArray(); }
+
+namespace llsd
+{
+
+U32 allocationCount() { return LLSD::Impl::sAllocationCount; }
+U32 outstandingCount() { return LLSD::Impl::sOutstandingCount; }
+
+// Diagnostic dump of contents in an LLSD object
+void dumpStats(const LLSD& llsd) { LLSD::Impl::getImpl(llsd).dumpStats(); }
+
+} // namespace llsd
+
+// static
+std::string LLSD::typeString(Type type)
+{
+ static const char * sTypeNameArray[] = {
+ "Undefined",
+ "Boolean",
+ "Integer",
+ "Real",
+ "String",
+ "UUID",
+ "Date",
+ "URI",
+ "Binary",
+ "Map",
+ "Array"
+ };
+
+ if (0 <= type && type < LL_ARRAY_SIZE(sTypeNameArray))
+ {
+ return sTypeNameArray[type];
+ }
+ return STRINGIZE("** invalid type value " << type);
+}
diff --git a/indra/llcommon/llsd.h b/indra/llcommon/llsd.h
index 90d0f97873..5eb69059ac 100644
--- a/indra/llcommon/llsd.h
+++ b/indra/llcommon/llsd.h
@@ -40,10 +40,10 @@
/**
LLSD provides a flexible data system similar to the data facilities of
dynamic languages like Perl and Python. It is created to support exchange
- of structured data between loosly coupled systems. (Here, "loosly coupled"
+ of structured data between loosely coupled systems. (Here, "loosely coupled"
means not compiled together into the same module.)
- Data in such exchanges must be highly tollerant of changes on either side
+ Data in such exchanges must be highly tolerant of changes on either side
such as:
- recompilation
- implementation in a different langauge
@@ -51,19 +51,19 @@
- execution of older versions (with fewer parameters)
To this aim, the C++ API of LLSD strives to be very easy to use, and to
- default to "the right thing" whereever possible. It is extremely tollerant
+ default to "the right thing" wherever possible. It is extremely tolerant
of errors and unexpected situations.
- The fundimental class is LLSD. LLSD is a value holding object. It holds
+ The fundamental class is LLSD. LLSD is a value holding object. It holds
one value that is either undefined, one of the scalar types, or a map or an
array. LLSD objects have value semantics (copying them copies the value,
- though it can be considered efficient, due to shareing.), and mutable.
+ though it can be considered efficient, due to sharing), and mutable.
Undefined is the singular value given to LLSD objects that are not
initialized with any data. It is also used as the return value for
- operations that return an LLSD,
+ operations that return an LLSD.
- The sclar data types are:
+ The scalar data types are:
- Boolean - true or false
- Integer - a 32 bit signed integer
- Real - a 64 IEEE 754 floating point value
@@ -80,9 +80,73 @@
An array is a sequence of zero or more LLSD values.
+ Thread Safety
+
+ In general, these LLSD classes offer *less* safety than STL container
+ classes. Implementations prior to this one were unsafe even when
+ completely unrelated LLSD trees were in two threads due to reference
+ sharing of special 'undefined' values that participated in the reference
+ counting mechanism.
+
+ The dereference-before-refcount and aggressive tree sharing also make
+ it impractical to share an LLSD across threads. A strategy of passing
+ ownership or a copy to another thread is still difficult due to a lack
+ of a cloning interface but it can be done with some care.
+
+ One way of transferring ownership is as follows:
+
+ void method(const LLSD input) {
+ ...
+ LLSD * xfer_tree = new LLSD();
+ {
+ // Top-level values
+ (* xfer_tree)['label'] = "Some text";
+ (* xfer_tree)['mode'] = APP_MODE_CONSTANT;
+
+ // There will be a second-level
+ LLSD subtree(LLSD::emptyMap());
+ (* xfer_tree)['subtree'] = subtree;
+
+ // Do *not* copy from LLSD objects via LLSD
+ // intermediaries. Only use plain-old-data
+ // types as intermediaries to prevent reference
+ // sharing.
+ subtree['value1'] = input['value1'].asInteger();
+ subtree['value2'] = input['value2'].asString();
+
+ // Close scope and drop 'subtree's reference.
+ // Only xfer_tree has a reference to the second
+ // level data.
+ }
+ ...
+ // Transfer the LLSD pointer to another thread. Ownership
+ // transfers, this thread no longer has a reference to any
+ // part of the xfer_tree and there's nothing to free or
+ // release here. Receiving thread does need to delete the
+ // pointer when it is done with the LLSD. Transfer
+ // mechanism must perform correct data ordering operations
+ // as dictated by architecture.
+ other_thread.sendMessageAndPointer("Take This", xfer_tree);
+ xfer_tree = NULL;
+
+
+ Avoid this pattern which provides half of a race condition:
+
+ void method(const LLSD input) {
+ ...
+ LLSD xfer_tree(LLSD::emptyMap());
+ xfer_tree['label'] = "Some text";
+ xfer_tree['mode'] = APP_MODE_CONSTANT;
+ ...
+ other_thread.sendMessageAndPointer("Take This", xfer_tree);
+
+
@nosubgrouping
*/
+// Normally undefined, used for diagnostics
+//#define LLSD_DEBUG_INFO 1
+
class LL_COMMON_API LLSD
{
public:
@@ -202,7 +266,7 @@ public:
//@}
/** @name Character Pointer Helpers
- These are helper routines to make working with char* the same as easy as
+ These are helper routines to make working with char* as easy as
working with strings.
*/
//@{
@@ -266,7 +330,7 @@ public:
/** @name Type Testing */
//@{
enum Type {
- TypeUndefined,
+ TypeUndefined = 0,
TypeBoolean,
TypeInteger,
TypeReal,
@@ -276,7 +340,10 @@ public:
TypeURI,
TypeBinary,
TypeMap,
- TypeArray
+ TypeArray,
+ TypeLLSDTypeEnd,
+ TypeLLSDTypeBegin = TypeUndefined,
+ TypeLLSDNumTypes = (TypeLLSDTypeEnd - TypeLLSDTypeBegin)
};
Type type() const;
@@ -302,7 +369,7 @@ public:
If you get a linker error about these being missing, you have made
mistake in your code. DO NOT IMPLEMENT THESE FUNCTIONS as a fix.
- All of thse problems stem from trying to support char* in LLSD or in
+ All of these problems stem from trying to support char* in LLSD or in
std::string. There are too many automatic casts that will lead to
using an arbitrary pointer or scalar type to std::string.
*/
@@ -311,7 +378,7 @@ public:
void assign(const void*); ///< assign from arbitrary pointers
LLSD& operator=(const void*); ///< assign from arbitrary pointers
- bool has(Integer) const; ///< has only works for Maps
+ bool has(Integer) const; ///< has() only works for Maps
//@}
/** @name Implementation */
@@ -320,13 +387,7 @@ public:
class Impl;
private:
Impl* impl;
- //@}
-
- /** @name Unit Testing Interface */
- //@{
-public:
- static U32 allocationCount(); ///< how many Impls have been made
- static U32 outstandingCount(); ///< how many Impls are still alive
+ friend class LLSD::Impl;
//@}
private:
@@ -338,6 +399,10 @@ private:
/// Returns Notation version of llsd -- only to be called from debugger
static const char *dump(const LLSD &llsd);
//@}
+
+public:
+
+ static std::string typeString(Type type); // Return human-readable type as a string
};
struct llsd_select_bool : public std::unary_function<LLSD, LLSD::Boolean>
@@ -385,9 +450,32 @@ struct llsd_select_string : public std::unary_function<LLSD, LLSD::String>
LL_COMMON_API std::ostream& operator<<(std::ostream& s, const LLSD& llsd);
+namespace llsd
+{
+
+#ifdef LLSD_DEBUG_INFO
+/** @name Unit Testing Interface */
+//@{
+ LL_COMMON_API void dumpStats(const LLSD&); ///< Output information on object and usage
+
+ /// @warn THE FOLLOWING COUNTS WILL NOT BE ACCURATE IN A MULTI-THREADED
+ /// ENVIRONMENT.
+ ///
+ /// These counts track LLSD::Impl (hidden) objects.
+ LL_COMMON_API U32 allocationCount(); ///< how many Impls have been made
+ LL_COMMON_API U32 outstandingCount(); ///< how many Impls are still alive
+
+ /// These counts track LLSD (public) objects.
+ LL_COMMON_API extern S32 sLLSDAllocationCount; ///< Number of LLSD objects ever created
+ LL_COMMON_API extern S32 sLLSDNetObjects; ///< Number of LLSD objects that exist
+#endif
+//@}
+
+} // namespace llsd
+
/** QUESTIONS & TO DOS
- - Would Binary be more convenient as usigned char* buffer semantics?
- - Should Binary be convertable to/from String, and if so how?
+ - Would Binary be more convenient as unsigned char* buffer semantics?
+ - Should Binary be convertible to/from String, and if so how?
- as UTF8 encoded strings (making not like UUID<->String)
- as Base64 or Base96 encoded (making like UUID<->String)
- Conversions to std::string and LLUUID do not result in easy assignment
diff --git a/indra/llcommon/llsdparam.cpp b/indra/llcommon/llsdparam.cpp
new file mode 100644
index 0000000000..0e29873bb0
--- /dev/null
+++ b/indra/llcommon/llsdparam.cpp
@@ -0,0 +1,342 @@
+/**
+ * @file llsdparam.cpp
+ * @brief parameter block abstraction for creating complex objects and
+ * parsing construction parameters from xml and LLSD
+ *
+ * $LicenseInfo:firstyear=2008&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "linden_common.h"
+
+// Project includes
+#include "llsdparam.h"
+#include "llsdutil.h"
+
+static LLInitParam::Parser::parser_read_func_map_t sReadFuncs;
+static LLInitParam::Parser::parser_write_func_map_t sWriteFuncs;
+static LLInitParam::Parser::parser_inspect_func_map_t sInspectFuncs;
+static const LLSD NO_VALUE_MARKER;
+
+LLFastTimer::DeclareTimer FTM_SD_PARAM_ADAPTOR("LLSD to LLInitParam conversion");
+
+//
+// LLParamSDParser
+//
+LLParamSDParser::LLParamSDParser()
+: Parser(sReadFuncs, sWriteFuncs, sInspectFuncs)
+{
+ using boost::bind;
+
+ if (sReadFuncs.empty())
+ {
+ registerParserFuncs<LLInitParam::Flag>(readFlag, &LLParamSDParser::writeFlag);
+ registerParserFuncs<S32>(readS32, &LLParamSDParser::writeTypedValue<S32>);
+ registerParserFuncs<U32>(readU32, &LLParamSDParser::writeU32Param);
+ registerParserFuncs<F32>(readF32, &LLParamSDParser::writeTypedValue<F32>);
+ registerParserFuncs<F64>(readF64, &LLParamSDParser::writeTypedValue<F64>);
+ registerParserFuncs<bool>(readBool, &LLParamSDParser::writeTypedValue<bool>);
+ registerParserFuncs<std::string>(readString, &LLParamSDParser::writeTypedValue<std::string>);
+ registerParserFuncs<LLUUID>(readUUID, &LLParamSDParser::writeTypedValue<LLUUID>);
+ registerParserFuncs<LLDate>(readDate, &LLParamSDParser::writeTypedValue<LLDate>);
+ registerParserFuncs<LLURI>(readURI, &LLParamSDParser::writeTypedValue<LLURI>);
+ registerParserFuncs<LLSD>(readSD, &LLParamSDParser::writeTypedValue<LLSD>);
+ }
+}
+
+// special case handling of U32 due to ambiguous LLSD::assign overload
+bool LLParamSDParser::writeU32Param(LLParamSDParser::parser_t& parser, const void* val_ptr, parser_t::name_stack_t& name_stack)
+{
+ LLParamSDParser& sdparser = static_cast<LLParamSDParser&>(parser);
+ if (!sdparser.mWriteRootSD) return false;
+
+ parser_t::name_stack_range_t range(name_stack.begin(), name_stack.end());
+ LLSD& sd_to_write = LLParamSDParserUtilities::getSDWriteNode(*sdparser.mWriteRootSD, range);
+ sd_to_write.assign((S32)*((const U32*)val_ptr));
+
+ return true;
+}
+
+bool LLParamSDParser::writeFlag(LLParamSDParser::parser_t& parser, const void* val_ptr, parser_t::name_stack_t& name_stack)
+{
+ LLParamSDParser& sdparser = static_cast<LLParamSDParser&>(parser);
+ if (!sdparser.mWriteRootSD) return false;
+
+ parser_t::name_stack_range_t range(name_stack.begin(), name_stack.end());
+ LLParamSDParserUtilities::getSDWriteNode(*sdparser.mWriteRootSD, range);
+
+ return true;
+}
+
+void LLParamSDParser::submit(LLInitParam::BaseBlock& block, const LLSD& sd, LLInitParam::Parser::name_stack_t& name_stack)
+{
+ mCurReadSD = &sd;
+ block.submitValue(name_stack, *this);
+}
+
+void LLParamSDParser::readSD(const LLSD& sd, LLInitParam::BaseBlock& block, bool silent)
+{
+ mCurReadSD = NULL;
+ mNameStack.clear();
+ setParseSilently(silent);
+
+ LLParamSDParserUtilities::readSDValues(boost::bind(&LLParamSDParser::submit, this, boost::ref(block), _1, _2), sd, mNameStack);
+ //readSDValues(sd, block);
+}
+
+void LLParamSDParser::writeSD(LLSD& sd, const LLInitParam::BaseBlock& block)
+{
+ mNameStack.clear();
+ mWriteRootSD = &sd;
+
+ name_stack_t name_stack;
+ block.serializeBlock(*this, name_stack);
+}
+
+/*virtual*/ std::string LLParamSDParser::getCurrentElementName()
+{
+ std::string full_name = "sd";
+ for (name_stack_t::iterator it = mNameStack.begin();
+ it != mNameStack.end();
+ ++it)
+ {
+ full_name += llformat("[%s]", it->first.c_str());
+ }
+
+ return full_name;
+}
+
+
+bool LLParamSDParser::readFlag(Parser& parser, void* val_ptr)
+{
+ LLParamSDParser& self = static_cast<LLParamSDParser&>(parser);
+ return self.mCurReadSD == &NO_VALUE_MARKER;
+}
+
+
+bool LLParamSDParser::readS32(Parser& parser, void* val_ptr)
+{
+ LLParamSDParser& self = static_cast<LLParamSDParser&>(parser);
+
+ *((S32*)val_ptr) = self.mCurReadSD->asInteger();
+ return true;
+}
+
+bool LLParamSDParser::readU32(Parser& parser, void* val_ptr)
+{
+ LLParamSDParser& self = static_cast<LLParamSDParser&>(parser);
+
+ *((U32*)val_ptr) = self.mCurReadSD->asInteger();
+ return true;
+}
+
+bool LLParamSDParser::readF32(Parser& parser, void* val_ptr)
+{
+ LLParamSDParser& self = static_cast<LLParamSDParser&>(parser);
+
+ *((F32*)val_ptr) = self.mCurReadSD->asReal();
+ return true;
+}
+
+bool LLParamSDParser::readF64(Parser& parser, void* val_ptr)
+{
+ LLParamSDParser& self = static_cast<LLParamSDParser&>(parser);
+
+ *((F64*)val_ptr) = self.mCurReadSD->asReal();
+ return true;
+}
+
+bool LLParamSDParser::readBool(Parser& parser, void* val_ptr)
+{
+ LLParamSDParser& self = static_cast<LLParamSDParser&>(parser);
+
+ *((bool*)val_ptr) = self.mCurReadSD->asBoolean();
+ return true;
+}
+
+bool LLParamSDParser::readString(Parser& parser, void* val_ptr)
+{
+ LLParamSDParser& self = static_cast<LLParamSDParser&>(parser);
+
+ *((std::string*)val_ptr) = self.mCurReadSD->asString();
+ return true;
+}
+
+bool LLParamSDParser::readUUID(Parser& parser, void* val_ptr)
+{
+ LLParamSDParser& self = static_cast<LLParamSDParser&>(parser);
+
+ *((LLUUID*)val_ptr) = self.mCurReadSD->asUUID();
+ return true;
+}
+
+bool LLParamSDParser::readDate(Parser& parser, void* val_ptr)
+{
+ LLParamSDParser& self = static_cast<LLParamSDParser&>(parser);
+
+ *((LLDate*)val_ptr) = self.mCurReadSD->asDate();
+ return true;
+}
+
+bool LLParamSDParser::readURI(Parser& parser, void* val_ptr)
+{
+ LLParamSDParser& self = static_cast<LLParamSDParser&>(parser);
+
+ *((LLURI*)val_ptr) = self.mCurReadSD->asURI();
+ return true;
+}
+
+bool LLParamSDParser::readSD(Parser& parser, void* val_ptr)
+{
+ LLParamSDParser& self = static_cast<LLParamSDParser&>(parser);
+
+ *((LLSD*)val_ptr) = *self.mCurReadSD;
+ return true;
+}
+
+// static
+LLSD& LLParamSDParserUtilities::getSDWriteNode(LLSD& input, LLInitParam::Parser::name_stack_range_t& name_stack_range)
+{
+ LLSD* sd_to_write = &input;
+
+ for (LLInitParam::Parser::name_stack_t::iterator it = name_stack_range.first;
+ it != name_stack_range.second;
+ ++it)
+ {
+ bool new_traversal = it->second;
+
+ LLSD* child_sd = it->first.empty() ? sd_to_write : &(*sd_to_write)[it->first];
+
+ if (child_sd->isArray())
+ {
+ if (new_traversal)
+ {
+ // write to new element at end
+ sd_to_write = &(*child_sd)[child_sd->size()];
+ }
+ else
+ {
+ // write to last of existing elements, or first element if empty
+ sd_to_write = &(*child_sd)[llmax(0, child_sd->size() - 1)];
+ }
+ }
+ else
+ {
+ if (new_traversal
+ && child_sd->isDefined()
+ && !child_sd->isArray())
+ {
+ // copy child contents into first element of an array
+ LLSD new_array = LLSD::emptyArray();
+ new_array.append(*child_sd);
+ // assign array to slot that previously held the single value
+ *child_sd = new_array;
+ // return next element in that array
+ sd_to_write = &((*child_sd)[1]);
+ }
+ else
+ {
+ sd_to_write = child_sd;
+ }
+ }
+ it->second = false;
+ }
+
+ return *sd_to_write;
+}
+
+//static
+void LLParamSDParserUtilities::readSDValues(read_sd_cb_t cb, const LLSD& sd, LLInitParam::Parser::name_stack_t& stack)
+{
+ if (sd.isMap())
+ {
+ for (LLSD::map_const_iterator it = sd.beginMap();
+ it != sd.endMap();
+ ++it)
+ {
+ stack.push_back(make_pair(it->first, true));
+ readSDValues(cb, it->second, stack);
+ stack.pop_back();
+ }
+ }
+ else if (sd.isArray())
+ {
+ for (LLSD::array_const_iterator it = sd.beginArray();
+ it != sd.endArray();
+ ++it)
+ {
+ stack.back().second = true;
+ readSDValues(cb, *it, stack);
+ }
+ }
+ else if (sd.isUndefined())
+ {
+ if (!cb.empty())
+ {
+ cb(NO_VALUE_MARKER, stack);
+ }
+ }
+ else
+ {
+ if (!cb.empty())
+ {
+ cb(sd, stack);
+ }
+ }
+}
+
+//static
+void LLParamSDParserUtilities::readSDValues(read_sd_cb_t cb, const LLSD& sd)
+{
+ LLInitParam::Parser::name_stack_t stack = LLInitParam::Parser::name_stack_t();
+ readSDValues(cb, sd, stack);
+}
+namespace LLInitParam
+{
+ // LLSD specialization
+ // block param interface
+ bool ParamValue<LLSD, TypeValues<LLSD>, false>::deserializeBlock(Parser& p, Parser::name_stack_range_t name_stack, bool new_name)
+ {
+ LLSD& sd = LLParamSDParserUtilities::getSDWriteNode(mValue, name_stack);
+
+ LLSD::String string;
+
+ if (p.readValue<LLSD::String>(string))
+ {
+ sd = string;
+ return true;
+ }
+ return false;
+ }
+
+ //static
+ void ParamValue<LLSD, TypeValues<LLSD>, false>::serializeElement(Parser& p, const LLSD& sd, Parser::name_stack_t& name_stack)
+ {
+ p.writeValue<LLSD::String>(sd.asString(), name_stack);
+ }
+
+ void ParamValue<LLSD, TypeValues<LLSD>, false>::serializeBlock(Parser& p, Parser::name_stack_t& name_stack, const BaseBlock* diff_block) const
+ {
+ // read from LLSD value and serialize out to parser (which could be LLSD, XUI, etc)
+ Parser::name_stack_t stack;
+ LLParamSDParserUtilities::readSDValues(boost::bind(&serializeElement, boost::ref(p), _1, _2), mValue, stack);
+ }
+}
diff --git a/indra/llcommon/llsdparam.h b/indra/llcommon/llsdparam.h
new file mode 100644
index 0000000000..6ef5debd7b
--- /dev/null
+++ b/indra/llcommon/llsdparam.h
@@ -0,0 +1,126 @@
+/**
+ * @file llsdparam.h
+ * @brief parameter block abstraction for creating complex objects and
+ * parsing construction parameters from xml and LLSD
+ *
+ * $LicenseInfo:firstyear=2008&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLSDPARAM_H
+#define LL_LLSDPARAM_H
+
+#include "llinitparam.h"
+#include "boost/function.hpp"
+
+struct LL_COMMON_API LLParamSDParserUtilities
+{
+ static LLSD& getSDWriteNode(LLSD& input, LLInitParam::Parser::name_stack_range_t& name_stack_range);
+
+ typedef boost::function<void (const LLSD&, LLInitParam::Parser::name_stack_t&)> read_sd_cb_t;
+ static void readSDValues(read_sd_cb_t cb, const LLSD& sd, LLInitParam::Parser::name_stack_t& stack);
+ static void readSDValues(read_sd_cb_t cb, const LLSD& sd);
+};
+
+class LL_COMMON_API LLParamSDParser
+: public LLInitParam::Parser
+{
+LOG_CLASS(LLParamSDParser);
+
+typedef LLInitParam::Parser parser_t;
+
+public:
+ LLParamSDParser();
+ void readSD(const LLSD& sd, LLInitParam::BaseBlock& block, bool silent = false);
+ void writeSD(LLSD& sd, const LLInitParam::BaseBlock& block);
+
+ /*virtual*/ std::string getCurrentElementName();
+
+private:
+ void submit(LLInitParam::BaseBlock& block, const LLSD& sd, LLInitParam::Parser::name_stack_t& name_stack);
+
+ template<typename T>
+ static bool writeTypedValue(Parser& parser, const void* val_ptr, parser_t::name_stack_t& name_stack)
+ {
+ LLParamSDParser& sdparser = static_cast<LLParamSDParser&>(parser);
+ if (!sdparser.mWriteRootSD) return false;
+
+ LLInitParam::Parser::name_stack_range_t range(name_stack.begin(), name_stack.end());
+ LLSD& sd_to_write = LLParamSDParserUtilities::getSDWriteNode(*sdparser.mWriteRootSD, range);
+
+ sd_to_write.assign(*((const T*)val_ptr));
+ return true;
+ }
+
+ static bool writeU32Param(Parser& parser, const void* value_ptr, parser_t::name_stack_t& name_stack);
+ static bool writeFlag(Parser& parser, const void* value_ptr, parser_t::name_stack_t& name_stack);
+
+ static bool readFlag(Parser& parser, void* val_ptr);
+ static bool readS32(Parser& parser, void* val_ptr);
+ static bool readU32(Parser& parser, void* val_ptr);
+ static bool readF32(Parser& parser, void* val_ptr);
+ static bool readF64(Parser& parser, void* val_ptr);
+ static bool readBool(Parser& parser, void* val_ptr);
+ static bool readString(Parser& parser, void* val_ptr);
+ static bool readUUID(Parser& parser, void* val_ptr);
+ static bool readDate(Parser& parser, void* val_ptr);
+ static bool readURI(Parser& parser, void* val_ptr);
+ static bool readSD(Parser& parser, void* val_ptr);
+
+ Parser::name_stack_t mNameStack;
+ const LLSD* mCurReadSD;
+ LLSD* mWriteRootSD;
+ LLSD* mCurWriteSD;
+};
+
+
+extern LL_COMMON_API LLFastTimer::DeclareTimer FTM_SD_PARAM_ADAPTOR;
+template<typename T>
+class LLSDParamAdapter : public T
+{
+public:
+ LLSDParamAdapter() {}
+ LLSDParamAdapter(const LLSD& sd)
+ {
+ LLFastTimer _(FTM_SD_PARAM_ADAPTOR);
+ LLParamSDParser parser;
+ // don't spam for implicit parsing of LLSD, as we want to allow arbitrary freeform data and ignore most of it
+ bool parse_silently = true;
+ parser.readSD(sd, *this, parse_silently);
+ }
+
+ operator LLSD() const
+ {
+ LLParamSDParser parser;
+ LLSD sd;
+ parser.writeSD(sd, *this);
+ return sd;
+ }
+
+ LLSDParamAdapter(const T& val)
+ : T(val)
+ {
+ T::operator=(val);
+ }
+};
+
+#endif // LL_LLSDPARAM_H
+
diff --git a/indra/llcommon/llsdserialize_xml.cpp b/indra/llcommon/llsdserialize_xml.cpp
index bf216d41bf..be9db53906 100644
--- a/indra/llcommon/llsdserialize_xml.cpp
+++ b/indra/llcommon/llsdserialize_xml.cpp
@@ -354,7 +354,6 @@ static unsigned get_till_eol(std::istream& input, char *buf, unsigned bufsize)
return count;
}
-LLFastTimer::DeclareTimer FTM_SD_PARSE_READ_STREAM("LLSD Read Stream");
S32 LLSDXMLParser::Impl::parse(std::istream& input, LLSD& data)
{
XML_Status status;
@@ -374,7 +373,7 @@ S32 LLSDXMLParser::Impl::parse(std::istream& input, LLSD& data)
{
break;
}
- { LLFastTimer _(FTM_SD_PARSE_READ_STREAM);
+ {
count = get_till_eol(input, (char *)buffer, BUFFER_SIZE);
if (!count)
diff --git a/indra/llcommon/llsortedvector.h b/indra/llcommon/llsortedvector.h
new file mode 100644
index 0000000000..391b82ee44
--- /dev/null
+++ b/indra/llcommon/llsortedvector.h
@@ -0,0 +1,152 @@
+/**
+ * @file llsortedvector.h
+ * @author Nat Goodspeed
+ * @date 2012-04-08
+ * @brief LLSortedVector class wraps a vector that we maintain in sorted
+ * order so we can perform binary-search lookups.
+ *
+ * $LicenseInfo:firstyear=2012&license=viewerlgpl$
+ * Copyright (c) 2012, Linden Research, Inc.
+ * $/LicenseInfo$
+ */
+
+#if ! defined(LL_LLSORTEDVECTOR_H)
+#define LL_LLSORTEDVECTOR_H
+
+#include <vector>
+#include <algorithm>
+
+/**
+ * LLSortedVector contains a std::vector<std::pair> that we keep sorted on the
+ * first of the pair. This makes insertion somewhat more expensive than simple
+ * std::vector::push_back(), but allows us to use binary search for lookups.
+ * It's intended for small aggregates where lookup is far more performance-
+ * critical than insertion; in such cases a binary search on a small, sorted
+ * std::vector can be more performant than a std::map lookup.
+ */
+template <typename KEY, typename VALUE>
+class LLSortedVector
+{
+public:
+ typedef LLSortedVector<KEY, VALUE> self;
+ typedef KEY key_type;
+ typedef VALUE mapped_type;
+ typedef std::pair<key_type, mapped_type> value_type;
+ typedef std::vector<value_type> PairVector;
+ typedef typename PairVector::iterator iterator;
+ typedef typename PairVector::const_iterator const_iterator;
+
+ /// Empty
+ LLSortedVector() {}
+
+ /// Fixed initial size
+ LLSortedVector(std::size_t size):
+ mVector(size)
+ {}
+
+ /// Bulk load
+ template <typename ITER>
+ LLSortedVector(ITER begin, ITER end):
+ mVector(begin, end)
+ {
+ // Allow caller to dump in a bunch of (pairs convertible to)
+ // value_type if desired, but make sure we sort afterwards.
+ std::sort(mVector.begin(), mVector.end());
+ }
+
+ /// insert(key, value)
+ std::pair<iterator, bool> insert(const key_type& key, const mapped_type& value)
+ {
+ return insert(value_type(key, value));
+ }
+
+ /// insert(value_type)
+ std::pair<iterator, bool> insert(const value_type& pair)
+ {
+ typedef std::pair<iterator, bool> iterbool;
+ iterator found = std::lower_bound(mVector.begin(), mVector.end(), pair,
+ less<value_type>());
+ // have to check for end() before it's even valid to dereference
+ if (found == mVector.end())
+ {
+ std::size_t index(mVector.size());
+ mVector.push_back(pair);
+ // don't forget that push_back() invalidates 'found'
+ return iterbool(mVector.begin() + index, true);
+ }
+ if (found->first == pair.first)
+ {
+ return iterbool(found, false);
+ }
+ // remember that insert() invalidates 'found' -- save index
+ std::size_t index(found - mVector.begin());
+ mVector.insert(found, pair);
+ // okay, convert from index back to iterator
+ return iterbool(mVector.begin() + index, true);
+ }
+
+ iterator begin() { return mVector.begin(); }
+ iterator end() { return mVector.end(); }
+ const_iterator begin() const { return mVector.begin(); }
+ const_iterator end() const { return mVector.end(); }
+
+ bool empty() const { return mVector.empty(); }
+ std::size_t size() const { return mVector.size(); }
+
+ /// find
+ iterator find(const key_type& key)
+ {
+ iterator found = std::lower_bound(mVector.begin(), mVector.end(),
+ value_type(key, mapped_type()),
+ less<value_type>());
+ if (found == mVector.end() || found->first != key)
+ return mVector.end();
+ return found;
+ }
+
+ const_iterator find(const key_type& key) const
+ {
+ return const_cast<self*>(this)->find(key);
+ }
+
+private:
+ // Define our own 'less' comparator so we can specialize without messing
+ // with std::less.
+ template <typename T>
+ struct less: public std::less<T> {};
+
+ // Specialize 'less' for an LLSortedVector::value_type involving
+ // std::type_info*. This is one of LLSortedVector's foremost use cases. We
+ // specialize 'less' rather than just defining a specific comparator
+ // because LLSortedVector should be usable for other key_types as well.
+ template <typename T>
+ struct less< std::pair<std::type_info*, T> >:
+ public std::binary_function<std::pair<std::type_info*, T>,
+ std::pair<std::type_info*, T>,
+ bool>
+ {
+ bool operator()(const std::pair<std::type_info*, T>& lhs,
+ const std::pair<std::type_info*, T>& rhs) const
+ {
+ return lhs.first->before(*rhs.first);
+ }
+ };
+
+ // Same as above, but with const std::type_info*.
+ template <typename T>
+ struct less< std::pair<const std::type_info*, T> >:
+ public std::binary_function<std::pair<const std::type_info*, T>,
+ std::pair<const std::type_info*, T>,
+ bool>
+ {
+ bool operator()(const std::pair<const std::type_info*, T>& lhs,
+ const std::pair<const std::type_info*, T>& rhs) const
+ {
+ return lhs.first->before(*rhs.first);
+ }
+ };
+
+ PairVector mVector;
+};
+
+#endif /* ! defined(LL_LLSORTEDVECTOR_H) */
diff --git a/indra/llcommon/llstreamqueue.cpp b/indra/llcommon/llstreamqueue.cpp
new file mode 100644
index 0000000000..1116a2b6a2
--- /dev/null
+++ b/indra/llcommon/llstreamqueue.cpp
@@ -0,0 +1,24 @@
+/**
+ * @file llstreamqueue.cpp
+ * @author Nat Goodspeed
+ * @date 2012-01-05
+ * @brief Implementation for llstreamqueue.
+ *
+ * $LicenseInfo:firstyear=2012&license=viewerlgpl$
+ * Copyright (c) 2012, Linden Research, Inc.
+ * $/LicenseInfo$
+ */
+
+// Precompiled header
+#include "linden_common.h"
+// associated header
+#include "llstreamqueue.h"
+// STL headers
+// std headers
+// external library headers
+// other Linden headers
+
+// As of this writing, llstreamqueue.h is entirely template-based, therefore
+// we don't strictly need a corresponding .cpp file. However, our CMake test
+// macro assumes one. Here it is.
+bool llstreamqueue_cpp_ignored = true;
diff --git a/indra/llcommon/llstreamqueue.h b/indra/llcommon/llstreamqueue.h
new file mode 100644
index 0000000000..0726bad175
--- /dev/null
+++ b/indra/llcommon/llstreamqueue.h
@@ -0,0 +1,240 @@
+/**
+ * @file llstreamqueue.h
+ * @author Nat Goodspeed
+ * @date 2012-01-04
+ * @brief Definition of LLStreamQueue
+ *
+ * $LicenseInfo:firstyear=2012&license=viewerlgpl$
+ * Copyright (c) 2012, Linden Research, Inc.
+ * $/LicenseInfo$
+ */
+
+#if ! defined(LL_LLSTREAMQUEUE_H)
+#define LL_LLSTREAMQUEUE_H
+
+#include <string>
+#include <list>
+#include <iosfwd> // std::streamsize
+#include <boost/iostreams/categories.hpp>
+
+/**
+ * This class is a growable buffer between a producer and consumer. It serves
+ * as a queue usable with Boost.Iostreams -- hence, a "stream queue."
+ *
+ * This is especially useful for buffering nonblocking I/O. For instance, we
+ * want application logic to be able to serialize LLSD to a std::ostream. We
+ * may write more data than the destination pipe can handle all at once, but
+ * it's imperative NOT to block the application-level serialization call. So
+ * we buffer it instead. Successive frames can try nonblocking writes to the
+ * destination pipe until all buffered data has been sent.
+ *
+ * Similarly, we want application logic be able to deserialize LLSD from a
+ * std::istream. Again, we must not block that deserialize call waiting for
+ * more data to arrive from the input pipe! Instead we build up a buffer over
+ * a number of frames, using successive nonblocking reads, until we have
+ * "enough" data to be able to present it through a std::istream.
+ *
+ * @note The use cases for this class overlap somewhat with those for the
+ * LLIOPipe/LLPumpIO hierarchies, and indeed we considered using those. This
+ * class has two virtues over the older machinery:
+ *
+ * # It's vastly simpler -- way fewer concepts. It's not clear to me whether
+ * there were ever LLIOPipe/etc. use cases that demanded all the fanciness
+ * rolled in, or whether they were simply overdesigned. In any case, no
+ * remaining Lindens will admit to familiarity with those classes -- and
+ * they're sufficiently obtuse that it would take considerable learning
+ * curve to figure out how to use them properly. The bottom line is that
+ * current management is not keen on any more engineers climbing that curve.
+ * # This class is designed around available components such as std::string,
+ * std::list, Boost.Iostreams. There's less proprietary code.
+ */
+template <typename Ch>
+class LLGenericStreamQueue
+{
+public:
+ LLGenericStreamQueue():
+ mSize(0),
+ mClosed(false)
+ {}
+
+ /**
+ * Boost.Iostreams Source Device facade for use with other Boost.Iostreams
+ * functionality. LLGenericStreamQueue doesn't quite fit any of the Boost
+ * 1.48 Iostreams concepts; instead it behaves as both a Sink and a
+ * Source. This is its Source facade.
+ */
+ struct Source
+ {
+ typedef Ch char_type;
+ typedef boost::iostreams::source_tag category;
+
+ /// Bind the underlying LLGenericStreamQueue
+ Source(LLGenericStreamQueue& sq):
+ mStreamQueue(sq)
+ {}
+
+ // Read up to n characters from the underlying data source into the
+ // buffer s, returning the number of characters read; return -1 to
+ // indicate EOF
+ std::streamsize read(Ch* s, std::streamsize n)
+ {
+ return mStreamQueue.read(s, n);
+ }
+
+ LLGenericStreamQueue& mStreamQueue;
+ };
+
+ /**
+ * Boost.Iostreams Sink Device facade for use with other Boost.Iostreams
+ * functionality. LLGenericStreamQueue doesn't quite fit any of the Boost
+ * 1.48 Iostreams concepts; instead it behaves as both a Sink and a
+ * Source. This is its Sink facade.
+ */
+ struct Sink
+ {
+ typedef Ch char_type;
+ typedef boost::iostreams::sink_tag category;
+
+ /// Bind the underlying LLGenericStreamQueue
+ Sink(LLGenericStreamQueue& sq):
+ mStreamQueue(sq)
+ {}
+
+ /// Write up to n characters from the buffer s to the output sequence,
+ /// returning the number of characters written
+ std::streamsize write(const Ch* s, std::streamsize n)
+ {
+ return mStreamQueue.write(s, n);
+ }
+
+ /// Send EOF to consumer
+ void close()
+ {
+ mStreamQueue.close();
+ }
+
+ LLGenericStreamQueue& mStreamQueue;
+ };
+
+ /// Present Boost.Iostreams Source facade
+ Source asSource() { return Source(*this); }
+ /// Present Boost.Iostreams Sink facade
+ Sink asSink() { return Sink(*this); }
+
+ /// append data to buffer
+ std::streamsize write(const Ch* s, std::streamsize n)
+ {
+ // Unclear how often we might be asked to write 0 bytes -- perhaps a
+ // naive caller responding to an unready nonblocking read. But if we
+ // do get such a call, don't add a completely empty BufferList entry.
+ if (n == 0)
+ return n;
+ // We could implement this using a single std::string object, a la
+ // ostringstream. But the trouble with appending to a string is that
+ // you might have to recopy all previous contents to grow its size. If
+ // we want this to scale to large data volumes, better to allocate
+ // individual pieces.
+ mBuffer.push_back(string(s, n));
+ mSize += n;
+ return n;
+ }
+
+ /**
+ * Inform this LLGenericStreamQueue that no further data are forthcoming.
+ * For our purposes, close() is strictly a producer-side operation;
+ * there's little point in closing the consumer side.
+ */
+ void close()
+ {
+ mClosed = true;
+ }
+
+ /// consume data from buffer
+ std::streamsize read(Ch* s, std::streamsize n)
+ {
+ // read() is actually a convenience method for peek() followed by
+ // skip().
+ std::streamsize got(peek(s, n));
+ // We can only skip() as many characters as we can peek(); ignore
+ // skip() return here.
+ skip(n);
+ return got;
+ }
+
+ /// Retrieve data from buffer without consuming. Like read(), return -1 on
+ /// EOF.
+ std::streamsize peek(Ch* s, std::streamsize n) const;
+
+ /// Consume data from buffer without retrieving. Unlike read() and peek(),
+ /// at EOF we simply skip 0 characters.
+ std::streamsize skip(std::streamsize n);
+
+ /// How many characters do we currently have buffered?
+ std::streamsize size() const
+ {
+ return mSize;
+ }
+
+private:
+ typedef std::basic_string<Ch> string;
+ typedef std::list<string> BufferList;
+ BufferList mBuffer;
+ std::streamsize mSize;
+ bool mClosed;
+};
+
+template <typename Ch>
+std::streamsize LLGenericStreamQueue<Ch>::peek(Ch* s, std::streamsize n) const
+{
+ // Here we may have to build up 'n' characters from an arbitrary
+ // number of individual BufferList entries.
+ typename BufferList::const_iterator bli(mBuffer.begin()), blend(mBuffer.end());
+ // Indicate EOF if producer has closed the pipe AND we've exhausted
+ // all previously-buffered data.
+ if (mClosed && bli == blend)
+ {
+ return -1;
+ }
+ // Here either producer hasn't yet closed, or we haven't yet exhausted
+ // remaining data.
+ std::streamsize needed(n), got(0);
+ // Loop until either we run out of BufferList entries or we've
+ // completely satisfied the request.
+ for ( ; bli != blend && needed; ++bli)
+ {
+ std::streamsize chunk(std::min(needed, std::streamsize(bli->length())));
+ std::copy(bli->begin(), bli->begin() + chunk, s);
+ needed -= chunk;
+ s += chunk;
+ got += chunk;
+ }
+ return got;
+}
+
+template <typename Ch>
+std::streamsize LLGenericStreamQueue<Ch>::skip(std::streamsize n)
+{
+ typename BufferList::iterator bli(mBuffer.begin()), blend(mBuffer.end());
+ std::streamsize toskip(n), skipped(0);
+ while (bli != blend && toskip >= bli->length())
+ {
+ std::streamsize chunk(bli->length());
+ typename BufferList::iterator zap(bli++);
+ mBuffer.erase(zap);
+ mSize -= chunk;
+ toskip -= chunk;
+ skipped += chunk;
+ }
+ if (bli != blend && toskip)
+ {
+ bli->erase(bli->begin(), bli->begin() + toskip);
+ mSize -= toskip;
+ skipped += toskip;
+ }
+ return skipped;
+}
+
+typedef LLGenericStreamQueue<char> LLStreamQueue;
+typedef LLGenericStreamQueue<wchar_t> LLWStreamQueue;
+
+#endif /* ! defined(LL_LLSTREAMQUEUE_H) */
diff --git a/indra/llcommon/llstring.cpp b/indra/llcommon/llstring.cpp
index e7fe656808..fa0eb9f72c 100644
--- a/indra/llcommon/llstring.cpp
+++ b/indra/llcommon/llstring.cpp
@@ -912,22 +912,24 @@ S32 LLStringUtil::format(std::string& s, const format_map_t& substitutions);
template<>
void LLStringUtil::getTokens(const std::string& instr, std::vector<std::string >& tokens, const std::string& delims)
{
- std::string currToken;
- std::string::size_type begIdx, endIdx;
-
- begIdx = instr.find_first_not_of (delims);
- while (begIdx != std::string::npos)
+ // Starting at offset 0, scan forward for the next non-delimiter. We're
+ // done when the only characters left in 'instr' are delimiters.
+ for (std::string::size_type begIdx, endIdx = 0;
+ (begIdx = instr.find_first_not_of (delims, endIdx)) != std::string::npos; )
{
+ // Found a non-delimiter. After that, find the next delimiter.
endIdx = instr.find_first_of (delims, begIdx);
if (endIdx == std::string::npos)
{
+ // No more delimiters: this token extends to the end of the string.
endIdx = instr.length();
}
- currToken = instr.substr(begIdx, endIdx - begIdx);
+ // extract the token between begIdx and endIdx; substr() needs length
+ std::string currToken(instr.substr(begIdx, endIdx - begIdx));
LLStringUtil::trim (currToken);
tokens.push_back(currToken);
- begIdx = instr.find_first_not_of (delims, endIdx);
+ // next scan past delimiters starts at endIdx
}
}
diff --git a/indra/llcommon/llstring.h b/indra/llcommon/llstring.h
index 7e41e787b5..09733e8e2a 100644
--- a/indra/llcommon/llstring.h
+++ b/indra/llcommon/llstring.h
@@ -40,6 +40,7 @@
#endif
#include <string.h>
+#include <boost/scoped_ptr.hpp>
#if LL_SOLARIS
// stricmp and strnicmp do not exist on Solaris:
@@ -237,40 +238,77 @@ private:
static std::string sLocale;
public:
- typedef typename std::basic_string<T>::size_type size_type;
+ typedef std::basic_string<T> string_type;
+ typedef typename string_type::size_type size_type;
public:
/////////////////////////////////////////////////////////////////////////////////////////
// Static Utility functions that operate on std::strings
- static const std::basic_string<T> null;
+ static const string_type null;
typedef std::map<LLFormatMapString, LLFormatMapString> format_map_t;
- LL_COMMON_API static void getTokens(const std::basic_string<T>& instr, std::vector<std::basic_string<T> >& tokens, const std::basic_string<T>& delims);
- LL_COMMON_API static void formatNumber(std::basic_string<T>& numStr, std::basic_string<T> decimals);
- LL_COMMON_API static bool formatDatetime(std::basic_string<T>& replacement, std::basic_string<T> token, std::basic_string<T> param, S32 secFromEpoch);
- LL_COMMON_API static S32 format(std::basic_string<T>& s, const format_map_t& substitutions);
- LL_COMMON_API static S32 format(std::basic_string<T>& s, const LLSD& substitutions);
- LL_COMMON_API static bool simpleReplacement(std::basic_string<T>& replacement, std::basic_string<T> token, const format_map_t& substitutions);
- LL_COMMON_API static bool simpleReplacement(std::basic_string<T>& replacement, std::basic_string<T> token, const LLSD& substitutions);
+ /// considers any sequence of delims as a single field separator
+ LL_COMMON_API static void getTokens(const string_type& instr,
+ std::vector<string_type >& tokens,
+ const string_type& delims);
+ /// like simple scan overload, but returns scanned vector
+ static std::vector<string_type> getTokens(const string_type& instr,
+ const string_type& delims);
+ /// add support for keep_delims and quotes (either could be empty string)
+ static void getTokens(const string_type& instr,
+ std::vector<string_type>& tokens,
+ const string_type& drop_delims,
+ const string_type& keep_delims,
+ const string_type& quotes=string_type());
+ /// like keep_delims-and-quotes overload, but returns scanned vector
+ static std::vector<string_type> getTokens(const string_type& instr,
+ const string_type& drop_delims,
+ const string_type& keep_delims,
+ const string_type& quotes=string_type());
+ /// add support for escapes (could be empty string)
+ static void getTokens(const string_type& instr,
+ std::vector<string_type>& tokens,
+ const string_type& drop_delims,
+ const string_type& keep_delims,
+ const string_type& quotes,
+ const string_type& escapes);
+ /// like escapes overload, but returns scanned vector
+ static std::vector<string_type> getTokens(const string_type& instr,
+ const string_type& drop_delims,
+ const string_type& keep_delims,
+ const string_type& quotes,
+ const string_type& escapes);
+
+ LL_COMMON_API static void formatNumber(string_type& numStr, string_type decimals);
+ LL_COMMON_API static bool formatDatetime(string_type& replacement, string_type token, string_type param, S32 secFromEpoch);
+ LL_COMMON_API static S32 format(string_type& s, const format_map_t& substitutions);
+ LL_COMMON_API static S32 format(string_type& s, const LLSD& substitutions);
+ LL_COMMON_API static bool simpleReplacement(string_type& replacement, string_type token, const format_map_t& substitutions);
+ LL_COMMON_API static bool simpleReplacement(string_type& replacement, string_type token, const LLSD& substitutions);
LL_COMMON_API static void setLocale (std::string inLocale);
LL_COMMON_API static std::string getLocale (void);
- static bool isValidIndex(const std::basic_string<T>& string, size_type i)
+ static bool isValidIndex(const string_type& string, size_type i)
{
return !string.empty() && (0 <= i) && (i <= string.size());
}
- static void trimHead(std::basic_string<T>& string);
- static void trimTail(std::basic_string<T>& string);
- static void trim(std::basic_string<T>& string) { trimHead(string); trimTail(string); }
- static void truncate(std::basic_string<T>& string, size_type count);
+ static bool contains(const string_type& string, T c, size_type i=0)
+ {
+ return string.find(c, i) != string_type::npos;
+ }
- static void toUpper(std::basic_string<T>& string);
- static void toLower(std::basic_string<T>& string);
+ static void trimHead(string_type& string);
+ static void trimTail(string_type& string);
+ static void trim(string_type& string) { trimHead(string); trimTail(string); }
+ static void truncate(string_type& string, size_type count);
+
+ static void toUpper(string_type& string);
+ static void toLower(string_type& string);
// True if this is the head of s.
- static BOOL isHead( const std::basic_string<T>& string, const T* s );
+ static BOOL isHead( const string_type& string, const T* s );
/**
* @brief Returns true if string starts with substr
@@ -278,8 +316,8 @@ public:
* If etither string or substr are empty, this method returns false.
*/
static bool startsWith(
- const std::basic_string<T>& string,
- const std::basic_string<T>& substr);
+ const string_type& string,
+ const string_type& substr);
/**
* @brief Returns true if string ends in substr
@@ -287,19 +325,32 @@ public:
* If etither string or substr are empty, this method returns false.
*/
static bool endsWith(
- const std::basic_string<T>& string,
- const std::basic_string<T>& substr);
+ const string_type& string,
+ const string_type& substr);
- static void addCRLF(std::basic_string<T>& string);
- static void removeCRLF(std::basic_string<T>& string);
+ static void addCRLF(string_type& string);
+ static void removeCRLF(string_type& string);
- static void replaceTabsWithSpaces( std::basic_string<T>& string, size_type spaces_per_tab );
- static void replaceNonstandardASCII( std::basic_string<T>& string, T replacement );
- static void replaceChar( std::basic_string<T>& string, T target, T replacement );
- static void replaceString( std::basic_string<T>& string, std::basic_string<T> target, std::basic_string<T> replacement );
+ static void replaceTabsWithSpaces( string_type& string, size_type spaces_per_tab );
+ static void replaceNonstandardASCII( string_type& string, T replacement );
+ static void replaceChar( string_type& string, T target, T replacement );
+ static void replaceString( string_type& string, string_type target, string_type replacement );
- static BOOL containsNonprintable(const std::basic_string<T>& string);
- static void stripNonprintable(std::basic_string<T>& string);
+ static BOOL containsNonprintable(const string_type& string);
+ static void stripNonprintable(string_type& string);
+
+ /**
+ * Double-quote an argument string if needed, unless it's already
+ * double-quoted. Decide whether it's needed based on the presence of any
+ * character in @a triggers (default space or double-quote). If we quote
+ * it, escape any embedded double-quote with the @a escape string (default
+ * backslash).
+ *
+ * Passing triggers="" means always quote, unless it's already double-quoted.
+ */
+ static string_type quote(const string_type& str,
+ const string_type& triggers=" \"",
+ const string_type& escape="\\");
/**
* @brief Unsafe way to make ascii characters. You should probably
@@ -308,18 +359,18 @@ public:
* The 2 and 4 byte std::string probably work, so LLWStringUtil::_makeASCII
* should work.
*/
- static void _makeASCII(std::basic_string<T>& string);
+ static void _makeASCII(string_type& string);
// Conversion to other data types
- static BOOL convertToBOOL(const std::basic_string<T>& string, BOOL& value);
- static BOOL convertToU8(const std::basic_string<T>& string, U8& value);
- static BOOL convertToS8(const std::basic_string<T>& string, S8& value);
- static BOOL convertToS16(const std::basic_string<T>& string, S16& value);
- static BOOL convertToU16(const std::basic_string<T>& string, U16& value);
- static BOOL convertToU32(const std::basic_string<T>& string, U32& value);
- static BOOL convertToS32(const std::basic_string<T>& string, S32& value);
- static BOOL convertToF32(const std::basic_string<T>& string, F32& value);
- static BOOL convertToF64(const std::basic_string<T>& string, F64& value);
+ static BOOL convertToBOOL(const string_type& string, BOOL& value);
+ static BOOL convertToU8(const string_type& string, U8& value);
+ static BOOL convertToS8(const string_type& string, S8& value);
+ static BOOL convertToS16(const string_type& string, S16& value);
+ static BOOL convertToU16(const string_type& string, U16& value);
+ static BOOL convertToU32(const string_type& string, U32& value);
+ static BOOL convertToS32(const string_type& string, S32& value);
+ static BOOL convertToF32(const string_type& string, F32& value);
+ static BOOL convertToF64(const string_type& string, F64& value);
/////////////////////////////////////////////////////////////////////////////////////////
// Utility functions for working with char*'s and strings
@@ -327,24 +378,24 @@ public:
// Like strcmp but also handles empty strings. Uses
// current locale.
static S32 compareStrings(const T* lhs, const T* rhs);
- static S32 compareStrings(const std::basic_string<T>& lhs, const std::basic_string<T>& rhs);
+ static S32 compareStrings(const string_type& lhs, const string_type& rhs);
// case insensitive version of above. Uses current locale on
// Win32, and falls back to a non-locale aware comparison on
// Linux.
static S32 compareInsensitive(const T* lhs, const T* rhs);
- static S32 compareInsensitive(const std::basic_string<T>& lhs, const std::basic_string<T>& rhs);
+ static S32 compareInsensitive(const string_type& lhs, const string_type& rhs);
// Case sensitive comparison with good handling of numbers. Does not use current locale.
// a.k.a. strdictcmp()
- static S32 compareDict(const std::basic_string<T>& a, const std::basic_string<T>& b);
+ static S32 compareDict(const string_type& a, const string_type& b);
// Case *in*sensitive comparison with good handling of numbers. Does not use current locale.
// a.k.a. strdictcmp()
- static S32 compareDictInsensitive(const std::basic_string<T>& a, const std::basic_string<T>& b);
+ static S32 compareDictInsensitive(const string_type& a, const string_type& b);
// Puts compareDict() in a form appropriate for LL container classes to use for sorting.
- static BOOL precedesDict( const std::basic_string<T>& a, const std::basic_string<T>& b );
+ static BOOL precedesDict( const string_type& a, const string_type& b );
// A replacement for strncpy.
// If the dst buffer is dst_size bytes long or more, ensures that dst is null terminated and holds
@@ -352,7 +403,7 @@ public:
static void copy(T* dst, const T* src, size_type dst_size);
// Copies src into dst at a given offset.
- static void copyInto(std::basic_string<T>& dst, const std::basic_string<T>& src, size_type offset);
+ static void copyInto(string_type& dst, const string_type& src, size_type offset);
static bool isPartOfWord(T c) { return (c == (T)'_') || LLStringOps::isAlnum(c); }
@@ -362,7 +413,7 @@ public:
#endif
private:
- LL_COMMON_API static size_type getSubstitution(const std::basic_string<T>& instr, size_type& start, std::vector<std::basic_string<T> >& tokens);
+ LL_COMMON_API static size_type getSubstitution(const string_type& instr, size_type& start, std::vector<string_type >& tokens);
};
template<class T> const std::basic_string<T> LLStringUtilBase<T>::null;
@@ -636,10 +687,325 @@ namespace LLStringFn
////////////////////////////////////////////////////////////
// NOTE: LLStringUtil::format, getTokens, and support functions moved to llstring.cpp.
// There is no LLWStringUtil::format implementation currently.
-// Calling thse for anything other than LLStringUtil will produce link errors.
+// Calling these for anything other than LLStringUtil will produce link errors.
////////////////////////////////////////////////////////////
+// static
+template <class T>
+std::vector<typename LLStringUtilBase<T>::string_type>
+LLStringUtilBase<T>::getTokens(const string_type& instr, const string_type& delims)
+{
+ std::vector<string_type> tokens;
+ getTokens(instr, tokens, delims);
+ return tokens;
+}
+
+// static
+template <class T>
+std::vector<typename LLStringUtilBase<T>::string_type>
+LLStringUtilBase<T>::getTokens(const string_type& instr,
+ const string_type& drop_delims,
+ const string_type& keep_delims,
+ const string_type& quotes)
+{
+ std::vector<string_type> tokens;
+ getTokens(instr, tokens, drop_delims, keep_delims, quotes);
+ return tokens;
+}
+
+// static
+template <class T>
+std::vector<typename LLStringUtilBase<T>::string_type>
+LLStringUtilBase<T>::getTokens(const string_type& instr,
+ const string_type& drop_delims,
+ const string_type& keep_delims,
+ const string_type& quotes,
+ const string_type& escapes)
+{
+ std::vector<string_type> tokens;
+ getTokens(instr, tokens, drop_delims, keep_delims, quotes, escapes);
+ return tokens;
+}
+
+namespace LLStringUtilBaseImpl
+{
+
+/**
+ * Input string scanner helper for getTokens(), or really any other
+ * character-parsing routine that may have to deal with escape characters.
+ * This implementation defines the concept (also an interface, should you
+ * choose to implement the concept by subclassing) and provides trivial
+ * implementations for a string @em without escape processing.
+ */
+template <class T>
+struct InString
+{
+ typedef std::basic_string<T> string_type;
+ typedef typename string_type::const_iterator const_iterator;
+
+ InString(const_iterator b, const_iterator e):
+ mIter(b),
+ mEnd(e)
+ {}
+ virtual ~InString() {}
+
+ bool done() const { return mIter == mEnd; }
+ /// Is the current character (*mIter) escaped? This implementation can
+ /// answer trivially because it doesn't support escapes.
+ virtual bool escaped() const { return false; }
+ /// Obtain the current character and advance @c mIter.
+ virtual T next() { return *mIter++; }
+ /// Does the current character match specified character?
+ virtual bool is(T ch) const { return (! done()) && *mIter == ch; }
+ /// Is the current character any one of the specified characters?
+ virtual bool oneof(const string_type& delims) const
+ {
+ return (! done()) && LLStringUtilBase<T>::contains(delims, *mIter);
+ }
+
+ /**
+ * Scan forward from @from until either @a delim or end. This is primarily
+ * useful for processing quoted substrings.
+ *
+ * If we do see @a delim, append everything from @from until (excluding)
+ * @a delim to @a into, advance @c mIter to skip @a delim, and return @c
+ * true.
+ *
+ * If we do not see @a delim, do not alter @a into or @c mIter and return
+ * @c false. Do not pass GO, do not collect $200.
+ *
+ * @note The @c false case described above implements normal getTokens()
+ * treatment of an unmatched open quote: treat the quote character as if
+ * escaped, that is, simply collect it as part of the current token. Other
+ * plausible behaviors directly affect the way getTokens() deals with an
+ * unmatched quote: e.g. throwing an exception to treat it as an error, or
+ * assuming a close quote beyond end of string (in which case return @c
+ * true).
+ */
+ virtual bool collect_until(string_type& into, const_iterator from, T delim)
+ {
+ const_iterator found = std::find(from, mEnd, delim);
+ // If we didn't find delim, change nothing, just tell caller.
+ if (found == mEnd)
+ return false;
+ // Found delim! Append everything between from and found.
+ into.append(from, found);
+ // advance past delim in input
+ mIter = found + 1;
+ return true;
+ }
+
+ const_iterator mIter, mEnd;
+};
+
+/// InString subclass that handles escape characters
+template <class T>
+class InEscString: public InString<T>
+{
+public:
+ typedef InString<T> super;
+ typedef typename super::string_type string_type;
+ typedef typename super::const_iterator const_iterator;
+ using super::done;
+ using super::mIter;
+ using super::mEnd;
+
+ InEscString(const_iterator b, const_iterator e, const string_type& escapes):
+ super(b, e),
+ mEscapes(escapes)
+ {
+ // Even though we've already initialized 'mIter' via our base-class
+ // constructor, set it again to check for initial escape char.
+ setiter(b);
+ }
+
+ /// This implementation uses the answer cached by setiter().
+ virtual bool escaped() const { return mIsEsc; }
+ virtual T next()
+ {
+ // If we're looking at the escape character of an escape sequence,
+ // skip that character. This is the one time we can modify 'mIter'
+ // without using setiter: for this one case we DO NOT CARE if the
+ // escaped character is itself an escape.
+ if (mIsEsc)
+ ++mIter;
+ // If we were looking at an escape character, this is the escaped
+ // character; otherwise it's just the next character.
+ T result(*mIter);
+ // Advance mIter, checking for escape sequence.
+ setiter(mIter + 1);
+ return result;
+ }
+
+ virtual bool is(T ch) const
+ {
+ // Like base-class is(), except that an escaped character matches
+ // nothing.
+ return (! done()) && (! mIsEsc) && *mIter == ch;
+ }
+
+ virtual bool oneof(const string_type& delims) const
+ {
+ // Like base-class oneof(), except that an escaped character matches
+ // nothing.
+ return (! done()) && (! mIsEsc) && LLStringUtilBase<T>::contains(delims, *mIter);
+ }
+
+ virtual bool collect_until(string_type& into, const_iterator from, T delim)
+ {
+ // Deal with escapes in the characters we collect; that is, an escaped
+ // character must become just that character without the preceding
+ // escape. Collect characters in a separate string rather than
+ // directly appending to 'into' in case we do not find delim, in which
+ // case we're supposed to leave 'into' unmodified.
+ string_type collected;
+ // For scanning purposes, we're going to work directly with 'mIter'.
+ // Save its current value in case we fail to see delim.
+ const_iterator save_iter(mIter);
+ // Okay, set 'mIter', checking for escape.
+ setiter(from);
+ while (! done())
+ {
+ // If we see an unescaped delim, stop and report success.
+ if ((! mIsEsc) && *mIter == delim)
+ {
+ // Append collected chars to 'into'.
+ into.append(collected);
+ // Don't forget to advance 'mIter' past delim.
+ setiter(mIter + 1);
+ return true;
+ }
+ // We're not at end, and either we're not looking at delim or it's
+ // escaped. Collect this character and keep going.
+ collected.push_back(next());
+ }
+ // Here we hit 'mEnd' without ever seeing delim. Restore mIter and tell
+ // caller.
+ setiter(save_iter);
+ return false;
+ }
+
+private:
+ void setiter(const_iterator i)
+ {
+ mIter = i;
+
+ // Every time we change 'mIter', set 'mIsEsc' to be able to repetitively
+ // answer escaped() without having to rescan 'mEscapes'. mIsEsc caches
+ // contains(mEscapes, *mIter).
+
+ // We're looking at an escaped char if we're not already at end (that
+ // is, *mIter is even meaningful); if *mIter is in fact one of the
+ // specified escape characters; and if there's one more character
+ // following it. That is, if an escape character is the very last
+ // character of the input string, it loses its special meaning.
+ mIsEsc = (! done()) &&
+ LLStringUtilBase<T>::contains(mEscapes, *mIter) &&
+ (mIter+1) != mEnd;
+ }
+
+ const string_type mEscapes;
+ bool mIsEsc;
+};
+
+/// getTokens() implementation based on InString concept
+template <typename INSTRING, typename string_type>
+void getTokens(INSTRING& instr, std::vector<string_type>& tokens,
+ const string_type& drop_delims, const string_type& keep_delims,
+ const string_type& quotes)
+{
+ // There are times when we want to match either drop_delims or
+ // keep_delims. Concatenate them up front to speed things up.
+ string_type all_delims(drop_delims + keep_delims);
+ // no tokens yet
+ tokens.clear();
+
+ // try for another token
+ while (! instr.done())
+ {
+ // scan past any drop_delims
+ while (instr.oneof(drop_delims))
+ {
+ // skip this drop_delim
+ instr.next();
+ // but if that was the end of the string, done
+ if (instr.done())
+ return;
+ }
+ // found the start of another token: make a slot for it
+ tokens.push_back(string_type());
+ if (instr.oneof(keep_delims))
+ {
+ // *iter is a keep_delim, a token of exactly 1 character. Append
+ // that character to the new token and proceed.
+ tokens.back().push_back(instr.next());
+ continue;
+ }
+ // Here we have a non-delimiter token, which might consist of a mix of
+ // quoted and unquoted parts. Use bash rules for quoting: you can
+ // embed a quoted substring in the midst of an unquoted token (e.g.
+ // ~/"sub dir"/myfile.txt); you can ram two quoted substrings together
+ // to make a single token (e.g. 'He said, "'"Don't."'"'). We diverge
+ // from bash in that bash considers an unmatched quote an error. Our
+ // param signature doesn't allow for errors, so just pretend it's not
+ // a quote and embed it.
+ // At this level, keep scanning until we hit the next delimiter of
+ // either type (drop_delims or keep_delims).
+ while (! instr.oneof(all_delims))
+ {
+ // If we're looking at an open quote, search forward for
+ // a close quote, collecting characters along the way.
+ if (instr.oneof(quotes) &&
+ instr.collect_until(tokens.back(), instr.mIter+1, *instr.mIter))
+ {
+ // collect_until is cleverly designed to do exactly what we
+ // need here. No further action needed if it returns true.
+ }
+ else
+ {
+ // Either *iter isn't a quote, or there's no matching close
+ // quote: in other words, just an ordinary char. Append it to
+ // current token.
+ tokens.back().push_back(instr.next());
+ }
+ // having scanned that segment of this token, if we've reached the
+ // end of the string, we're done
+ if (instr.done())
+ return;
+ }
+ }
+}
+
+} // namespace LLStringUtilBaseImpl
+
+// static
+template <class T>
+void LLStringUtilBase<T>::getTokens(const string_type& string, std::vector<string_type>& tokens,
+ const string_type& drop_delims, const string_type& keep_delims,
+ const string_type& quotes)
+{
+ // Because this overload doesn't support escapes, use simple InString to
+ // manage input range.
+ LLStringUtilBaseImpl::InString<T> instring(string.begin(), string.end());
+ LLStringUtilBaseImpl::getTokens(instring, tokens, drop_delims, keep_delims, quotes);
+}
+
+// static
+template <class T>
+void LLStringUtilBase<T>::getTokens(const string_type& string, std::vector<string_type>& tokens,
+ const string_type& drop_delims, const string_type& keep_delims,
+ const string_type& quotes, const string_type& escapes)
+{
+ // This overload must deal with escapes. Delegate that to InEscString
+ // (unless there ARE no escapes).
+ boost::scoped_ptr< LLStringUtilBaseImpl::InString<T> > instrp;
+ if (escapes.empty())
+ instrp.reset(new LLStringUtilBaseImpl::InString<T>(string.begin(), string.end()));
+ else
+ instrp.reset(new LLStringUtilBaseImpl::InEscString<T>(string.begin(), string.end(), escapes));
+ LLStringUtilBaseImpl::getTokens(*instrp, tokens, drop_delims, keep_delims, quotes);
+}
// static
template<class T>
@@ -669,7 +1035,7 @@ S32 LLStringUtilBase<T>::compareStrings(const T* lhs, const T* rhs)
//static
template<class T>
-S32 LLStringUtilBase<T>::compareStrings(const std::basic_string<T>& lhs, const std::basic_string<T>& rhs)
+S32 LLStringUtilBase<T>::compareStrings(const string_type& lhs, const string_type& rhs)
{
return LLStringOps::collate(lhs.c_str(), rhs.c_str());
}
@@ -695,8 +1061,8 @@ S32 LLStringUtilBase<T>::compareInsensitive(const T* lhs, const T* rhs )
}
else
{
- std::basic_string<T> lhs_string(lhs);
- std::basic_string<T> rhs_string(rhs);
+ string_type lhs_string(lhs);
+ string_type rhs_string(rhs);
LLStringUtilBase<T>::toUpper(lhs_string);
LLStringUtilBase<T>::toUpper(rhs_string);
result = LLStringOps::collate(lhs_string.c_str(), rhs_string.c_str());
@@ -706,10 +1072,10 @@ S32 LLStringUtilBase<T>::compareInsensitive(const T* lhs, const T* rhs )
//static
template<class T>
-S32 LLStringUtilBase<T>::compareInsensitive(const std::basic_string<T>& lhs, const std::basic_string<T>& rhs)
+S32 LLStringUtilBase<T>::compareInsensitive(const string_type& lhs, const string_type& rhs)
{
- std::basic_string<T> lhs_string(lhs);
- std::basic_string<T> rhs_string(rhs);
+ string_type lhs_string(lhs);
+ string_type rhs_string(rhs);
LLStringUtilBase<T>::toUpper(lhs_string);
LLStringUtilBase<T>::toUpper(rhs_string);
return LLStringOps::collate(lhs_string.c_str(), rhs_string.c_str());
@@ -720,7 +1086,7 @@ S32 LLStringUtilBase<T>::compareInsensitive(const std::basic_string<T>& lhs, con
//static
template<class T>
-S32 LLStringUtilBase<T>::compareDict(const std::basic_string<T>& astr, const std::basic_string<T>& bstr)
+S32 LLStringUtilBase<T>::compareDict(const string_type& astr, const string_type& bstr)
{
const T* a = astr.c_str();
const T* b = bstr.c_str();
@@ -761,7 +1127,7 @@ S32 LLStringUtilBase<T>::compareDict(const std::basic_string<T>& astr, const std
// static
template<class T>
-S32 LLStringUtilBase<T>::compareDictInsensitive(const std::basic_string<T>& astr, const std::basic_string<T>& bstr)
+S32 LLStringUtilBase<T>::compareDictInsensitive(const string_type& astr, const string_type& bstr)
{
const T* a = astr.c_str();
const T* b = bstr.c_str();
@@ -796,7 +1162,7 @@ S32 LLStringUtilBase<T>::compareDictInsensitive(const std::basic_string<T>& astr
// Puts compareDict() in a form appropriate for LL container classes to use for sorting.
// static
template<class T>
-BOOL LLStringUtilBase<T>::precedesDict( const std::basic_string<T>& a, const std::basic_string<T>& b )
+BOOL LLStringUtilBase<T>::precedesDict( const string_type& a, const string_type& b )
{
if( a.size() && b.size() )
{
@@ -810,7 +1176,7 @@ BOOL LLStringUtilBase<T>::precedesDict( const std::basic_string<T>& a, const std
//static
template<class T>
-void LLStringUtilBase<T>::toUpper(std::basic_string<T>& string)
+void LLStringUtilBase<T>::toUpper(string_type& string)
{
if( !string.empty() )
{
@@ -824,7 +1190,7 @@ void LLStringUtilBase<T>::toUpper(std::basic_string<T>& string)
//static
template<class T>
-void LLStringUtilBase<T>::toLower(std::basic_string<T>& string)
+void LLStringUtilBase<T>::toLower(string_type& string)
{
if( !string.empty() )
{
@@ -838,7 +1204,7 @@ void LLStringUtilBase<T>::toLower(std::basic_string<T>& string)
//static
template<class T>
-void LLStringUtilBase<T>::trimHead(std::basic_string<T>& string)
+void LLStringUtilBase<T>::trimHead(string_type& string)
{
if( !string.empty() )
{
@@ -853,7 +1219,7 @@ void LLStringUtilBase<T>::trimHead(std::basic_string<T>& string)
//static
template<class T>
-void LLStringUtilBase<T>::trimTail(std::basic_string<T>& string)
+void LLStringUtilBase<T>::trimTail(string_type& string)
{
if( string.size() )
{
@@ -872,7 +1238,7 @@ void LLStringUtilBase<T>::trimTail(std::basic_string<T>& string)
// Replace line feeds with carriage return-line feed pairs.
//static
template<class T>
-void LLStringUtilBase<T>::addCRLF(std::basic_string<T>& string)
+void LLStringUtilBase<T>::addCRLF(string_type& string)
{
const T LF = 10;
const T CR = 13;
@@ -914,7 +1280,7 @@ void LLStringUtilBase<T>::addCRLF(std::basic_string<T>& string)
// Remove all carriage returns
//static
template<class T>
-void LLStringUtilBase<T>::removeCRLF(std::basic_string<T>& string)
+void LLStringUtilBase<T>::removeCRLF(string_type& string)
{
const T CR = 13;
@@ -935,10 +1301,10 @@ void LLStringUtilBase<T>::removeCRLF(std::basic_string<T>& string)
//static
template<class T>
-void LLStringUtilBase<T>::replaceChar( std::basic_string<T>& string, T target, T replacement )
+void LLStringUtilBase<T>::replaceChar( string_type& string, T target, T replacement )
{
size_type found_pos = 0;
- while( (found_pos = string.find(target, found_pos)) != std::basic_string<T>::npos )
+ while( (found_pos = string.find(target, found_pos)) != string_type::npos )
{
string[found_pos] = replacement;
found_pos++; // avoid infinite defeat if target == replacement
@@ -947,10 +1313,10 @@ void LLStringUtilBase<T>::replaceChar( std::basic_string<T>& string, T target, T
//static
template<class T>
-void LLStringUtilBase<T>::replaceString( std::basic_string<T>& string, std::basic_string<T> target, std::basic_string<T> replacement )
+void LLStringUtilBase<T>::replaceString( string_type& string, string_type target, string_type replacement )
{
size_type found_pos = 0;
- while( (found_pos = string.find(target, found_pos)) != std::basic_string<T>::npos )
+ while( (found_pos = string.find(target, found_pos)) != string_type::npos )
{
string.replace( found_pos, target.length(), replacement );
found_pos += replacement.length(); // avoid infinite defeat if replacement contains target
@@ -959,7 +1325,7 @@ void LLStringUtilBase<T>::replaceString( std::basic_string<T>& string, std::basi
//static
template<class T>
-void LLStringUtilBase<T>::replaceNonstandardASCII( std::basic_string<T>& string, T replacement )
+void LLStringUtilBase<T>::replaceNonstandardASCII( string_type& string, T replacement )
{
const char LF = 10;
const S8 MIN = 32;
@@ -979,12 +1345,12 @@ void LLStringUtilBase<T>::replaceNonstandardASCII( std::basic_string<T>& string,
//static
template<class T>
-void LLStringUtilBase<T>::replaceTabsWithSpaces( std::basic_string<T>& str, size_type spaces_per_tab )
+void LLStringUtilBase<T>::replaceTabsWithSpaces( string_type& str, size_type spaces_per_tab )
{
const T TAB = '\t';
const T SPACE = ' ';
- std::basic_string<T> out_str;
+ string_type out_str;
// Replace tabs with spaces
for (size_type i = 0; i < str.length(); i++)
{
@@ -1003,7 +1369,7 @@ void LLStringUtilBase<T>::replaceTabsWithSpaces( std::basic_string<T>& str, size
//static
template<class T>
-BOOL LLStringUtilBase<T>::containsNonprintable(const std::basic_string<T>& string)
+BOOL LLStringUtilBase<T>::containsNonprintable(const string_type& string)
{
const char MIN = 32;
BOOL rv = FALSE;
@@ -1020,7 +1386,7 @@ BOOL LLStringUtilBase<T>::containsNonprintable(const std::basic_string<T>& strin
//static
template<class T>
-void LLStringUtilBase<T>::stripNonprintable(std::basic_string<T>& string)
+void LLStringUtilBase<T>::stripNonprintable(string_type& string)
{
const char MIN = 32;
size_type j = 0;
@@ -1051,8 +1417,43 @@ void LLStringUtilBase<T>::stripNonprintable(std::basic_string<T>& string)
delete []c_string;
}
+template<class T>
+std::basic_string<T> LLStringUtilBase<T>::quote(const string_type& str,
+ const string_type& triggers,
+ const string_type& escape)
+{
+ size_type len(str.length());
+ // If the string is already quoted, assume user knows what s/he's doing.
+ if (len >= 2 && str[0] == '"' && str[len-1] == '"')
+ {
+ return str;
+ }
+
+ // Not already quoted: do we need to? triggers.empty() is a special case
+ // meaning "always quote."
+ if ((! triggers.empty()) && str.find_first_of(triggers) == string_type::npos)
+ {
+ // no trigger characters, don't bother quoting
+ return str;
+ }
+
+ // For whatever reason, we must quote this string.
+ string_type result;
+ result.push_back('"');
+ for (typename string_type::const_iterator ci(str.begin()), cend(str.end()); ci != cend; ++ci)
+ {
+ if (*ci == '"')
+ {
+ result.append(escape);
+ }
+ result.push_back(*ci);
+ }
+ result.push_back('"');
+ return result;
+}
+
template<class T>
-void LLStringUtilBase<T>::_makeASCII(std::basic_string<T>& string)
+void LLStringUtilBase<T>::_makeASCII(string_type& string)
{
// Replace non-ASCII chars with LL_UNKNOWN_CHAR
for (size_type i = 0; i < string.length(); i++)
@@ -1082,7 +1483,7 @@ void LLStringUtilBase<T>::copy( T* dst, const T* src, size_type dst_size )
// static
template<class T>
-void LLStringUtilBase<T>::copyInto(std::basic_string<T>& dst, const std::basic_string<T>& src, size_type offset)
+void LLStringUtilBase<T>::copyInto(string_type& dst, const string_type& src, size_type offset)
{
if ( offset == dst.length() )
{
@@ -1092,7 +1493,7 @@ void LLStringUtilBase<T>::copyInto(std::basic_string<T>& dst, const std::basic_s
}
else
{
- std::basic_string<T> tail = dst.substr(offset);
+ string_type tail = dst.substr(offset);
dst = dst.substr(0, offset);
dst += src;
@@ -1103,7 +1504,7 @@ void LLStringUtilBase<T>::copyInto(std::basic_string<T>& dst, const std::basic_s
// True if this is the head of s.
//static
template<class T>
-BOOL LLStringUtilBase<T>::isHead( const std::basic_string<T>& string, const T* s )
+BOOL LLStringUtilBase<T>::isHead( const string_type& string, const T* s )
{
if( string.empty() )
{
@@ -1119,8 +1520,8 @@ BOOL LLStringUtilBase<T>::isHead( const std::basic_string<T>& string, const T* s
// static
template<class T>
bool LLStringUtilBase<T>::startsWith(
- const std::basic_string<T>& string,
- const std::basic_string<T>& substr)
+ const string_type& string,
+ const string_type& substr)
{
if(string.empty() || (substr.empty())) return false;
if(0 == string.find(substr)) return true;
@@ -1130,8 +1531,8 @@ bool LLStringUtilBase<T>::startsWith(
// static
template<class T>
bool LLStringUtilBase<T>::endsWith(
- const std::basic_string<T>& string,
- const std::basic_string<T>& substr)
+ const string_type& string,
+ const string_type& substr)
{
if(string.empty() || (substr.empty())) return false;
std::string::size_type idx = string.rfind(substr);
@@ -1141,14 +1542,14 @@ bool LLStringUtilBase<T>::endsWith(
template<class T>
-BOOL LLStringUtilBase<T>::convertToBOOL(const std::basic_string<T>& string, BOOL& value)
+BOOL LLStringUtilBase<T>::convertToBOOL(const string_type& string, BOOL& value)
{
if( string.empty() )
{
return FALSE;
}
- std::basic_string<T> temp( string );
+ string_type temp( string );
trim(temp);
if(
(temp == "1") ||
@@ -1178,7 +1579,7 @@ BOOL LLStringUtilBase<T>::convertToBOOL(const std::basic_string<T>& string, BOOL
}
template<class T>
-BOOL LLStringUtilBase<T>::convertToU8(const std::basic_string<T>& string, U8& value)
+BOOL LLStringUtilBase<T>::convertToU8(const string_type& string, U8& value)
{
S32 value32 = 0;
BOOL success = convertToS32(string, value32);
@@ -1191,7 +1592,7 @@ BOOL LLStringUtilBase<T>::convertToU8(const std::basic_string<T>& string, U8& va
}
template<class T>
-BOOL LLStringUtilBase<T>::convertToS8(const std::basic_string<T>& string, S8& value)
+BOOL LLStringUtilBase<T>::convertToS8(const string_type& string, S8& value)
{
S32 value32 = 0;
BOOL success = convertToS32(string, value32);
@@ -1204,7 +1605,7 @@ BOOL LLStringUtilBase<T>::convertToS8(const std::basic_string<T>& string, S8& va
}
template<class T>
-BOOL LLStringUtilBase<T>::convertToS16(const std::basic_string<T>& string, S16& value)
+BOOL LLStringUtilBase<T>::convertToS16(const string_type& string, S16& value)
{
S32 value32 = 0;
BOOL success = convertToS32(string, value32);
@@ -1217,7 +1618,7 @@ BOOL LLStringUtilBase<T>::convertToS16(const std::basic_string<T>& string, S16&
}
template<class T>
-BOOL LLStringUtilBase<T>::convertToU16(const std::basic_string<T>& string, U16& value)
+BOOL LLStringUtilBase<T>::convertToU16(const string_type& string, U16& value)
{
S32 value32 = 0;
BOOL success = convertToS32(string, value32);
@@ -1230,17 +1631,17 @@ BOOL LLStringUtilBase<T>::convertToU16(const std::basic_string<T>& string, U16&
}
template<class T>
-BOOL LLStringUtilBase<T>::convertToU32(const std::basic_string<T>& string, U32& value)
+BOOL LLStringUtilBase<T>::convertToU32(const string_type& string, U32& value)
{
if( string.empty() )
{
return FALSE;
}
- std::basic_string<T> temp( string );
+ string_type temp( string );
trim(temp);
U32 v;
- std::basic_istringstream<T> i_stream((std::basic_string<T>)temp);
+ std::basic_istringstream<T> i_stream((string_type)temp);
if(i_stream >> v)
{
value = v;
@@ -1250,17 +1651,17 @@ BOOL LLStringUtilBase<T>::convertToU32(const std::basic_string<T>& string, U32&
}
template<class T>
-BOOL LLStringUtilBase<T>::convertToS32(const std::basic_string<T>& string, S32& value)
+BOOL LLStringUtilBase<T>::convertToS32(const string_type& string, S32& value)
{
if( string.empty() )
{
return FALSE;
}
- std::basic_string<T> temp( string );
+ string_type temp( string );
trim(temp);
S32 v;
- std::basic_istringstream<T> i_stream((std::basic_string<T>)temp);
+ std::basic_istringstream<T> i_stream((string_type)temp);
if(i_stream >> v)
{
//TODO: figure out overflow and underflow reporting here
@@ -1277,7 +1678,7 @@ BOOL LLStringUtilBase<T>::convertToS32(const std::basic_string<T>& string, S32&
}
template<class T>
-BOOL LLStringUtilBase<T>::convertToF32(const std::basic_string<T>& string, F32& value)
+BOOL LLStringUtilBase<T>::convertToF32(const string_type& string, F32& value)
{
F64 value64 = 0.0;
BOOL success = convertToF64(string, value64);
@@ -1290,17 +1691,17 @@ BOOL LLStringUtilBase<T>::convertToF32(const std::basic_string<T>& string, F32&
}
template<class T>
-BOOL LLStringUtilBase<T>::convertToF64(const std::basic_string<T>& string, F64& value)
+BOOL LLStringUtilBase<T>::convertToF64(const string_type& string, F64& value)
{
if( string.empty() )
{
return FALSE;
}
- std::basic_string<T> temp( string );
+ string_type temp( string );
trim(temp);
F64 v;
- std::basic_istringstream<T> i_stream((std::basic_string<T>)temp);
+ std::basic_istringstream<T> i_stream((string_type)temp);
if(i_stream >> v)
{
//TODO: figure out overflow and underflow reporting here
@@ -1317,7 +1718,7 @@ BOOL LLStringUtilBase<T>::convertToF64(const std::basic_string<T>& string, F64&
}
template<class T>
-void LLStringUtilBase<T>::truncate(std::basic_string<T>& string, size_type count)
+void LLStringUtilBase<T>::truncate(string_type& string, size_type count)
{
size_type cur_size = string.size();
string.resize(count < cur_size ? count : cur_size);
diff --git a/indra/llcommon/llsys.cpp b/indra/llcommon/llsys.cpp
index d781687175..6073bcd0a6 100644
--- a/indra/llcommon/llsys.cpp
+++ b/indra/llcommon/llsys.cpp
@@ -608,6 +608,7 @@ LLCPUInfo::LLCPUInfo()
out << " (" << mCPUMHz << " MHz)";
}
mCPUString = out.str();
+ LLStringUtil::trim(mCPUString);
}
bool LLCPUInfo::hasAltivec() const
@@ -1363,11 +1364,21 @@ BOOL gzip_file(const std::string& srcfile, const std::string& dstfile)
src = LLFile::fopen(srcfile, "rb"); /* Flawfinder: ignore */
if (! src) goto err;
- do
+ while ((bytes = (S32)fread(buffer, sizeof(U8), COMPRESS_BUFFER_SIZE, src)) > 0)
{
- bytes = (S32)fread(buffer, sizeof(U8), COMPRESS_BUFFER_SIZE,src);
- gzwrite(dst, buffer, bytes);
- } while(feof(src) == 0);
+ if (gzwrite(dst, buffer, bytes) <= 0)
+ {
+ llwarns << "gzwrite failed: " << gzerror(dst, NULL) << llendl;
+ goto err;
+ }
+ }
+
+ if (ferror(src))
+ {
+ llwarns << "Error reading " << srcfile << llendl;
+ goto err;
+ }
+
gzclose(dst);
dst = NULL;
#if LL_WINDOWS
diff --git a/indra/llcommon/llthread.cpp b/indra/llcommon/llthread.cpp
index bdde1b5c48..a6ad6b125c 100644
--- a/indra/llcommon/llthread.cpp
+++ b/indra/llcommon/llthread.cpp
@@ -36,12 +36,6 @@
#include <sched.h>
#endif
-#if !LL_DARWIN
-U32 ll_thread_local local_thread_ID = 0;
-#endif
-
-U32 LLThread::sIDIter = 0;
-
//----------------------------------------------------------------------------
// Usage:
// void run_func(LLThread* thread)
@@ -62,6 +56,12 @@ U32 LLThread::sIDIter = 0;
//
//----------------------------------------------------------------------------
+#if !LL_DARWIN
+U32 ll_thread_local sThreadID = 0;
+#endif
+
+U32 LLThread::sIDIter = 0;
+
LL_COMMON_API void assert_main_thread()
{
static U32 s_thread_id = LLThread::currentID();
@@ -79,12 +79,9 @@ void *APR_THREAD_FUNC LLThread::staticRun(apr_thread_t *apr_threadp, void *datap
LLThread *threadp = (LLThread *)datap;
#if !LL_DARWIN
- local_thread_ID = threadp->mID;
+ sThreadID = threadp->mID;
#endif
- // Create a thread local data.
- LLThreadLocalData::create(threadp);
-
// Run the user supplied function
threadp->run();
@@ -97,22 +94,40 @@ void *APR_THREAD_FUNC LLThread::staticRun(apr_thread_t *apr_threadp, void *datap
}
-LLThread::LLThread(std::string const& name) :
- mPaused(false),
+LLThread::LLThread(const std::string& name, apr_pool_t *poolp) :
+ mPaused(FALSE),
mName(name),
mAPRThreadp(NULL),
- mStatus(STOPPED),
- mThreadLocalData(NULL)
+ mStatus(STOPPED)
{
- mID = ++sIDIter; //flaw: assume this is called only in the main thread!
+ mID = ++sIDIter;
- mRunCondition = new LLCondition;
+ // Thread creation probably CAN be paranoid about APR being initialized, if necessary
+ if (poolp)
+ {
+ mIsLocalPool = FALSE;
+ mAPRPoolp = poolp;
+ }
+ else
+ {
+ mIsLocalPool = TRUE;
+ apr_pool_create(&mAPRPoolp, NULL); // Create a subpool for this thread
+ }
+ mRunCondition = new LLCondition(mAPRPoolp);
+
+ mLocalAPRFilePoolp = NULL ;
}
LLThread::~LLThread()
{
shutdown();
+
+ if(mLocalAPRFilePoolp)
+ {
+ delete mLocalAPRFilePoolp ;
+ mLocalAPRFilePoolp = NULL ;
+ }
}
void LLThread::shutdown()
@@ -149,7 +164,7 @@ void LLThread::shutdown()
if (!isStopped())
{
// This thread just wouldn't stop, even though we gave it time
- //llwarns << "LLThread::shutdown() exiting thread before clean exit!" << llendl;
+ //llwarns << "LLThread::~LLThread() exiting thread before clean exit!" << llendl;
// Put a stake in its heart.
apr_thread_exit(mAPRThreadp, -1);
return;
@@ -159,8 +174,15 @@ void LLThread::shutdown()
delete mRunCondition;
mRunCondition = 0;
+
+ if (mIsLocalPool && mAPRPoolp)
+ {
+ apr_pool_destroy(mAPRPoolp);
+ mAPRPoolp = 0;
+ }
}
+
void LLThread::start()
{
llassert(isStopped());
@@ -169,7 +191,7 @@ void LLThread::start()
mStatus = RUNNING;
apr_status_t status =
- apr_thread_create(&mAPRThreadp, NULL, staticRun, (void *)this, tldata().mRootPool());
+ apr_thread_create(&mAPRThreadp, NULL, staticRun, (void *)this, mAPRPoolp);
if(status == APR_SUCCESS)
{
@@ -194,7 +216,7 @@ void LLThread::pause()
if (!mPaused)
{
// this will cause the thread to stop execution as soon as checkPause() is called
- mPaused = true; // Does not need to be atomic since this is only set/unset from the main thread
+ mPaused = 1; // Does not need to be atomic since this is only set/unset from the main thread
}
}
@@ -202,7 +224,7 @@ void LLThread::unpause()
{
if (mPaused)
{
- mPaused = false;
+ mPaused = 0;
}
wake(); // wake up the thread if necessary
@@ -279,76 +301,121 @@ void LLThread::wakeLocked()
}
}
-#ifdef SHOW_ASSERT
-// This allows the use of llassert(is_main_thread()) to assure the current thread is the main thread.
-static apr_os_thread_t main_thread_id;
-LL_COMMON_API bool is_main_thread(void) { return apr_os_thread_equal(main_thread_id, apr_os_thread_current()); }
-#endif
+//============================================================================
-// The thread private handle to access the LLThreadLocalData instance.
-apr_threadkey_t* LLThreadLocalData::sThreadLocalDataKey;
+LLMutex::LLMutex(apr_pool_t *poolp) :
+ mAPRMutexp(NULL), mCount(0), mLockingThread(NO_THREAD)
+{
+ //if (poolp)
+ //{
+ // mIsLocalPool = FALSE;
+ // mAPRPoolp = poolp;
+ //}
+ //else
+ {
+ mIsLocalPool = TRUE;
+ apr_pool_create(&mAPRPoolp, NULL); // Create a subpool for this thread
+ }
+ apr_thread_mutex_create(&mAPRMutexp, APR_THREAD_MUTEX_UNNESTED, mAPRPoolp);
+}
-//static
-void LLThreadLocalData::init(void)
+
+LLMutex::~LLMutex()
{
- // Only do this once.
- if (sThreadLocalDataKey)
+#if MUTEX_DEBUG
+ //bad assertion, the subclass LLSignal might be "locked", and that's OK
+ //llassert_always(!isLocked()); // better not be locked!
+#endif
+ apr_thread_mutex_destroy(mAPRMutexp);
+ mAPRMutexp = NULL;
+ if (mIsLocalPool)
{
- return;
+ apr_pool_destroy(mAPRPoolp);
}
+}
- apr_status_t status = apr_threadkey_private_create(&sThreadLocalDataKey, &LLThreadLocalData::destroy, LLAPRRootPool::get()());
- ll_apr_assert_status(status); // Or out of memory, or system-imposed limit on the
- // total number of keys per process {PTHREAD_KEYS_MAX}
- // has been exceeded.
- // Create the thread-local data for the main thread (this function is called by the main thread).
- LLThreadLocalData::create(NULL);
+void LLMutex::lock()
+{
+ if(isSelfLocked())
+ { //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();
+ if (mIsLocked[id] != FALSE)
+ llerrs << "Already locked in Thread: " << id << llendl;
+ mIsLocked[id] = TRUE;
+#endif
-#ifdef SHOW_ASSERT
- // This function is called by the main thread.
- main_thread_id = apr_os_thread_current();
+#if LL_DARWIN
+ mLockingThread = LLThread::currentID();
+#else
+ mLockingThread = sThreadID;
#endif
}
-// This is called once for every thread when the thread is destructed.
-//static
-void LLThreadLocalData::destroy(void* thread_local_data)
+void LLMutex::unlock()
{
- delete static_cast<LLThreadLocalData*>(thread_local_data);
+ 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();
+ if (mIsLocked[id] != TRUE)
+ llerrs << "Not locked in Thread: " << id << llendl;
+ mIsLocked[id] = FALSE;
+#endif
+
+ mLockingThread = NO_THREAD;
+ apr_thread_mutex_unlock(mAPRMutexp);
}
-//static
-void LLThreadLocalData::create(LLThread* threadp)
+bool LLMutex::isLocked()
{
- LLThreadLocalData* new_tld = new LLThreadLocalData;
- if (threadp)
+ apr_status_t status = apr_thread_mutex_trylock(mAPRMutexp);
+ if (APR_STATUS_IS_EBUSY(status))
{
- threadp->mThreadLocalData = new_tld;
+ return true;
+ }
+ else
+ {
+ apr_thread_mutex_unlock(mAPRMutexp);
+ return false;
}
- apr_status_t status = apr_threadkey_private_set(new_tld, sThreadLocalDataKey);
- llassert_always(status == APR_SUCCESS);
}
-//static
-LLThreadLocalData& LLThreadLocalData::tldata(void)
+bool LLMutex::isSelfLocked()
{
- if (!sThreadLocalDataKey)
- {
- LLThreadLocalData::init();
- }
+#if LL_DARWIN
+ return mLockingThread == LLThread::currentID();
+#else
+ return mLockingThread == sThreadID;
+#endif
+}
- void* data;
- apr_status_t status = apr_threadkey_private_get(&data, sThreadLocalDataKey);
- llassert_always(status == APR_SUCCESS);
- return *static_cast<LLThreadLocalData*>(data);
+U32 LLMutex::lockingThread() const
+{
+ return mLockingThread;
}
//============================================================================
-LLCondition::LLCondition(LLAPRPool& parent) : LLMutex(parent)
+LLCondition::LLCondition(apr_pool_t *poolp) :
+ LLMutex(poolp)
{
- apr_thread_cond_create(&mAPRCondp, mPool());
+ // base class (LLMutex) has already ensured that mAPRPoolp is set up.
+
+ apr_thread_cond_create(&mAPRCondp, mAPRPoolp);
}
@@ -361,6 +428,15 @@ LLCondition::~LLCondition()
void LLCondition::wait()
{
+ if (!isLocked())
+ { //mAPRMutexp MUST be locked before calling apr_thread_cond_wait
+ apr_thread_mutex_lock(mAPRMutexp);
+#if MUTEX_DEBUG
+ // avoid asserts on destruction in non-release builds
+ U32 id = LLThread::currentID();
+ mIsLocked[id] = TRUE;
+#endif
+ }
apr_thread_cond_wait(mAPRCondp, mAPRMutexp);
}
@@ -375,44 +451,6 @@ void LLCondition::broadcast()
}
//============================================================================
-LLMutexBase::LLMutexBase() :
- mLockingThread(NO_THREAD),
- mCount(0)
-{
-}
-
-void LLMutexBase::lock()
-{
-#if LL_DARWIN
- if (mLockingThread == LLThread::currentID())
-#else
- if (mLockingThread == local_thread_ID)
-#endif
- { //redundant lock
- mCount++;
- return;
- }
-
- apr_thread_mutex_lock(mAPRMutexp);
-
-#if LL_DARWIN
- mLockingThread = LLThread::currentID();
-#else
- mLockingThread = local_thread_ID;
-#endif
-}
-
-void LLMutexBase::unlock()
-{
- if (mCount > 0)
- { //not the root unlock
- mCount--;
- return;
- }
- mLockingThread = NO_THREAD;
-
- apr_thread_mutex_unlock(mAPRMutexp);
-}
//----------------------------------------------------------------------------
@@ -424,7 +462,7 @@ void LLThreadSafeRefCount::initThreadSafeRefCount()
{
if (!sMutex)
{
- sMutex = new LLMutex;
+ sMutex = new LLMutex(0);
}
}
diff --git a/indra/llcommon/llthread.h b/indra/llcommon/llthread.h
index b631b96252..b52e70ab2e 100644
--- a/indra/llcommon/llthread.h
+++ b/indra/llcommon/llthread.h
@@ -29,13 +29,7 @@
#include "llapp.h"
#include "llapr.h"
-#include "llmemory.h"
#include "apr_thread_cond.h"
-#include "llaprpool.h"
-
-#ifdef SHOW_ASSERT
-extern LL_COMMON_API bool is_main_thread(void);
-#endif
class LLThread;
class LLMutex;
@@ -47,22 +41,6 @@ class LLCondition;
#define ll_thread_local __thread
#endif
-class LL_COMMON_API LLThreadLocalData
-{
-private:
- static apr_threadkey_t* sThreadLocalDataKey;
-
-public:
- // Thread-local memory pools.
- LLAPRRootPool mRootPool;
- LLVolatileAPRPool mVolatileAPRPool;
-
- static void init(void);
- static void destroy(void* thread_local_data);
- static void create(LLThread* pthread);
- static LLThreadLocalData& tldata(void);
-};
-
class LL_COMMON_API LLThread
{
private:
@@ -76,7 +54,7 @@ public:
QUITTING= 2 // Someone wants this thread to quit
} EThreadStatus;
- LLThread(std::string const& name);
+ 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
@@ -91,7 +69,7 @@ public:
// Called from MAIN THREAD.
void pause();
void unpause();
- bool isPaused() { return isStopped() || mPaused; }
+ bool isPaused() { return isStopped() || mPaused == TRUE; }
// Cause the thread to wake up and check its condition
void wake();
@@ -105,11 +83,13 @@ public:
// this kicks off the apr thread
void start(void);
- // Return thread-local data for the current thread.
- static LLThreadLocalData& tldata(void) { return LLThreadLocalData::tldata(); }
+ apr_pool_t *getAPRPool() { return mAPRPoolp; }
+ LLVolatileAPRPool* getLocalAPRFilePool() { return mLocalAPRFilePoolp ; }
+
+ U32 getID() const { return mID; }
private:
- bool mPaused;
+ BOOL mPaused;
// static function passed to APR thread creation routine
static void *APR_THREAD_FUNC staticRun(apr_thread_t *apr_threadp, void *datap);
@@ -119,11 +99,15 @@ protected:
LLCondition* mRunCondition;
apr_thread_t *mAPRThreadp;
+ apr_pool_t *mAPRPoolp;
+ BOOL mIsLocalPool;
EThreadStatus mStatus;
U32 mID;
-
- friend void LLThreadLocalData::create(LLThread* threadp);
- LLThreadLocalData* mThreadLocalData;
+
+ //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();
@@ -153,15 +137,7 @@ protected:
#define MUTEX_DEBUG (LL_DEBUG || LL_RELEASE_WITH_DEBUG_INFO)
-#ifdef MUTEX_DEBUG
-// We really shouldn't be using recursive locks. Make sure of that in debug mode.
-#define MUTEX_FLAG APR_THREAD_MUTEX_UNNESTED
-#else
-// Use the fastest platform-optimal lock behavior (can be recursive or non-recursive).
-#define MUTEX_FLAG APR_THREAD_MUTEX_DEFAULT
-#endif
-
-class LL_COMMON_API LLMutexBase
+class LL_COMMON_API LLMutex
{
public:
typedef enum
@@ -169,74 +145,33 @@ public:
NO_THREAD = 0xFFFFFFFF
} e_locking_thread;
- LLMutexBase() ;
-
- void lock() ;
- void unlock() ;
- // Returns true if lock was obtained successfully.
- bool trylock() { return !APR_STATUS_IS_EBUSY(apr_thread_mutex_trylock(mAPRMutexp)); }
-
- // non-blocking, but does do a lock/unlock so not free
- bool isLocked() { bool is_not_locked = trylock(); if (is_not_locked) unlock(); return !is_not_locked; }
-
+ LLMutex(apr_pool_t *apr_poolp); // NULL pool constructs a new pool for the mutex
+ virtual ~LLMutex();
+
+ void lock(); // blocks
+ void unlock();
+ bool isLocked(); // non-blocking, but does do a lock/unlock so not free
+ bool isSelfLocked(); //return true if locked in a same thread
+ U32 lockingThread() const; //get ID of locking thread
+
protected:
- // mAPRMutexp is initialized and uninitialized in the derived class.
- apr_thread_mutex_t* mAPRMutexp;
+ apr_thread_mutex_t *mAPRMutexp;
mutable U32 mCount;
mutable U32 mLockingThread;
-};
-
-class LL_COMMON_API LLMutex : public LLMutexBase
-{
-public:
- LLMutex(LLAPRPool& parent = LLThread::tldata().mRootPool) : mPool(parent)
- {
- apr_thread_mutex_create(&mAPRMutexp, MUTEX_FLAG, mPool());
- }
- ~LLMutex()
- {
- //this assertion erroneously triggers whenever an LLCondition is destroyed
- //llassert(!isLocked()); // better not be locked!
- apr_thread_mutex_destroy(mAPRMutexp);
- mAPRMutexp = NULL;
- }
-
-protected:
- LLAPRPool mPool;
-};
-
-#if APR_HAS_THREADS
-// No need to use a root pool in this case.
-typedef LLMutex LLMutexRootPool;
-#else // APR_HAS_THREADS
-class LL_COMMON_API LLMutexRootPool : public LLMutexBase
-{
-public:
- LLMutexRootPool(void)
- {
- apr_thread_mutex_create(&mAPRMutexp, MUTEX_FLAG, mRootPool());
- }
- ~LLMutexRootPool()
- {
-#if APR_POOL_DEBUG
- // It is allowed to destruct root pools from a different thread.
- mRootPool.grab_ownership();
+
+ apr_pool_t *mAPRPoolp;
+ BOOL mIsLocalPool;
+
+#if MUTEX_DEBUG
+ std::map<U32, BOOL> mIsLocked;
#endif
- llassert(!isLocked());
- apr_thread_mutex_destroy(mAPRMutexp);
- mAPRMutexp = NULL;
- }
-
-protected:
- LLAPRRootPool mRootPool;
};
-#endif // APR_HAS_THREADS
// Actually a condition/mutex pair (since each condition needs to be associated with a mutex).
class LL_COMMON_API LLCondition : public LLMutex
{
public:
- LLCondition(LLAPRPool& parent = LLThread::tldata().mRootPool);
+ LLCondition(apr_pool_t *apr_poolp); // Defaults to global pool, could use the thread pool as well.
~LLCondition();
void wait(); // blocks
@@ -247,20 +182,23 @@ protected:
apr_thread_cond_t *mAPRCondp;
};
-class LL_COMMON_API LLMutexLock
+class LLMutexLock
{
public:
- LLMutexLock(LLMutexBase* mutex)
+ LLMutexLock(LLMutex* mutex)
{
mMutex = mutex;
- mMutex->lock();
+
+ if(mMutex)
+ mMutex->lock();
}
~LLMutexLock()
{
- mMutex->unlock();
+ if(mMutex)
+ mMutex->unlock();
}
private:
- LLMutexBase* mMutex;
+ LLMutex* mMutex;
};
//============================================================================
diff --git a/indra/llcommon/llthreadsafequeue.cpp b/indra/llcommon/llthreadsafequeue.cpp
index 05d24944f3..8a73e632a9 100644
--- a/indra/llcommon/llthreadsafequeue.cpp
+++ b/indra/llcommon/llthreadsafequeue.cpp
@@ -34,11 +34,19 @@
//-----------------------------------------------------------------------------
-LLThreadSafeQueueImplementation::LLThreadSafeQueueImplementation(unsigned int capacity):
+LLThreadSafeQueueImplementation::LLThreadSafeQueueImplementation(apr_pool_t * pool, unsigned int capacity):
+ mOwnsPool(pool == 0),
+ mPool(pool),
mQueue(0)
{
- mPool.create();
- apr_status_t status = apr_queue_create(&mQueue, capacity, mPool());
+ if(mOwnsPool) {
+ apr_status_t status = apr_pool_create(&mPool, 0);
+ if(status != APR_SUCCESS) throw LLThreadSafeQueueError("failed to allocate pool");
+ } else {
+ ; // No op.
+ }
+
+ apr_status_t status = apr_queue_create(&mQueue, capacity, mPool);
if(status != APR_SUCCESS) throw LLThreadSafeQueueError("failed to allocate queue");
}
@@ -51,6 +59,7 @@ LLThreadSafeQueueImplementation::~LLThreadSafeQueueImplementation()
" elements;" << "memory will be leaked" << LL_ENDL;
apr_queue_term(mQueue);
}
+ if(mOwnsPool && (mPool != 0)) apr_pool_destroy(mPool);
}
diff --git a/indra/llcommon/llthreadsafequeue.h b/indra/llcommon/llthreadsafequeue.h
index 43d0b396f2..58cac38769 100644
--- a/indra/llcommon/llthreadsafequeue.h
+++ b/indra/llcommon/llthreadsafequeue.h
@@ -30,9 +30,9 @@
#include <string>
#include <stdexcept>
-#include "llaprpool.h"
+struct apr_pool_t; // From apr_pools.h
class LLThreadSafeQueueImplementation; // See below.
@@ -75,7 +75,7 @@ struct apr_queue_t; // From apr_queue.h
class LL_COMMON_API LLThreadSafeQueueImplementation
{
public:
- LLThreadSafeQueueImplementation(unsigned int capacity);
+ LLThreadSafeQueueImplementation(apr_pool_t * pool, unsigned int capacity);
~LLThreadSafeQueueImplementation();
void pushFront(void * element);
bool tryPushFront(void * element);
@@ -84,7 +84,8 @@ public:
size_t size();
private:
- LLAPRPool mPool; // The pool used for mQueue.
+ bool mOwnsPool;
+ apr_pool_t * mPool;
apr_queue_t * mQueue;
};
@@ -98,8 +99,9 @@ class LLThreadSafeQueue
public:
typedef ElementT value_type;
- // Constructor.
- LLThreadSafeQueue(unsigned int capacity = 1024);
+ // If the pool is set to NULL one will be allocated and managed by this
+ // queue.
+ LLThreadSafeQueue(apr_pool_t * pool = 0, unsigned int capacity = 1024);
// Add an element to the front of queue (will block if the queue has
// reached capacity).
@@ -137,8 +139,8 @@ private:
template<typename ElementT>
-LLThreadSafeQueue<ElementT>::LLThreadSafeQueue(unsigned int capacity) :
- mImplementation(capacity)
+LLThreadSafeQueue<ElementT>::LLThreadSafeQueue(apr_pool_t * pool, unsigned int capacity):
+ mImplementation(pool, capacity)
{
; // No op.
}
diff --git a/indra/llcommon/lltypeinfolookup.h b/indra/llcommon/lltypeinfolookup.h
new file mode 100644
index 0000000000..fc99f7ff33
--- /dev/null
+++ b/indra/llcommon/lltypeinfolookup.h
@@ -0,0 +1,112 @@
+/**
+ * @file lltypeinfolookup.h
+ * @author Nat Goodspeed
+ * @date 2012-04-08
+ * @brief Template data structure like std::map<std::type_info*, T>
+ *
+ * $LicenseInfo:firstyear=2012&license=viewerlgpl$
+ * Copyright (c) 2012, Linden Research, Inc.
+ * $/LicenseInfo$
+ */
+
+#if ! defined(LL_LLTYPEINFOLOOKUP_H)
+#define LL_LLTYPEINFOLOOKUP_H
+
+#include "llsortedvector.h"
+#include <typeinfo>
+
+/**
+ * LLTypeInfoLookup is specifically designed for use cases for which you might
+ * consider std::map<std::type_info*, VALUE>. We have several such data
+ * structures in the viewer. The trouble with them is that at least on Linux,
+ * you can't rely on always getting the same std::type_info* for a given type:
+ * different load modules will produce different std::type_info*.
+ * LLTypeInfoLookup contains a workaround to address this issue.
+ *
+ * Specifically, when we don't find the passed std::type_info*,
+ * LLTypeInfoLookup performs a linear search over registered entries to
+ * compare name() strings. Presuming that this succeeds, we cache the new
+ * (previously unrecognized) std::type_info* to speed future lookups.
+ *
+ * This worst-case fallback search (linear search with string comparison)
+ * should only happen the first time we look up a given type from a particular
+ * load module other than the one from which we initially registered types.
+ * (However, a lookup which wouldn't succeed anyway will always have
+ * worst-case performance.) This class is probably best used with less than a
+ * few dozen different types.
+ */
+template <typename VALUE>
+class LLTypeInfoLookup
+{
+public:
+ typedef LLTypeInfoLookup<VALUE> self;
+ typedef LLSortedVector<const std::type_info*, VALUE> vector_type;
+ typedef typename vector_type::key_type key_type;
+ typedef typename vector_type::mapped_type mapped_type;
+ typedef typename vector_type::value_type value_type;
+ typedef typename vector_type::iterator iterator;
+ typedef typename vector_type::const_iterator const_iterator;
+
+ LLTypeInfoLookup() {}
+
+ iterator begin() { return mVector.begin(); }
+ iterator end() { return mVector.end(); }
+ const_iterator begin() const { return mVector.begin(); }
+ const_iterator end() const { return mVector.end(); }
+ bool empty() const { return mVector.empty(); }
+ std::size_t size() const { return mVector.size(); }
+
+ std::pair<iterator, bool> insert(const std::type_info* key, const VALUE& value)
+ {
+ return insert(value_type(key, value));
+ }
+
+ std::pair<iterator, bool> insert(const value_type& pair)
+ {
+ return mVector.insert(pair);
+ }
+
+ const_iterator find(const std::type_info* key) const
+ {
+ return const_cast<self*>(this)->find(key);
+ }
+
+ iterator find(const std::type_info* key)
+ {
+ iterator found = mVector.find(key);
+ if (found != mVector.end())
+ {
+ // If LLSortedVector::find() found, great, we're done.
+ return found;
+ }
+ // Here we didn't find the passed type_info*. On Linux, though, even
+ // for the same type, typeid(sametype) produces a different type_info*
+ // when used in different load modules. So the fact that we didn't
+ // find the type_info* we seek doesn't mean this type isn't
+ // registered. Scan for matching name() string.
+ for (typename vector_type::iterator ti(mVector.begin()), tend(mVector.end());
+ ti != tend; ++ti)
+ {
+ if (std::string(ti->first->name()) == key->name())
+ {
+ // This unrecognized 'key' is for the same type as ti->first.
+ // To speed future lookups, insert a new entry that lets us
+ // look up ti->second using this same 'key'.
+ return insert(key, ti->second).first;
+ }
+ }
+ // We simply have never seen a type with this type_info* from any load
+ // module.
+ return mVector.end();
+ }
+
+private:
+ /// Our LLSortedVector is mutable so that if we're passed an unrecognized
+ /// std::type_info* for a registered type (which we can identify by
+ /// searching for the name() string), we can cache the new std::type_info*
+ /// to speed future lookups -- even when the containing LLTypeInfoLookup
+ /// is const.
+ vector_type mVector;
+};
+
+#endif /* ! defined(LL_LLTYPEINFOLOOKUP_H) */
diff --git a/indra/llcommon/llversionviewer.h b/indra/llcommon/llversionviewer.h
index a4b2e06908..a869c74189 100644
--- a/indra/llcommon/llversionviewer.h
+++ b/indra/llcommon/llversionviewer.h
@@ -28,8 +28,8 @@
#define LL_LLVERSIONVIEWER_H
const S32 LL_VERSION_MAJOR = 3;
-const S32 LL_VERSION_MINOR = 0;
-const S32 LL_VERSION_PATCH = 6;
+const S32 LL_VERSION_MINOR = 3;
+const S32 LL_VERSION_PATCH = 0;
const S32 LL_VERSION_BUILD = 0;
const char * const LL_CHANNEL = "Second Life Developer";
diff --git a/indra/llcommon/llworkerthread.cpp b/indra/llcommon/llworkerthread.cpp
index 6b308bb917..3d05a30ac2 100644
--- a/indra/llcommon/llworkerthread.cpp
+++ b/indra/llcommon/llworkerthread.cpp
@@ -34,10 +34,15 @@
//============================================================================
// Run on MAIN thread
-LLWorkerThread::LLWorkerThread(const std::string& name, bool threaded) :
- LLQueuedThread(name, threaded)
+LLWorkerThread::LLWorkerThread(const std::string& name, bool threaded, bool should_pause) :
+ LLQueuedThread(name, threaded, should_pause)
{
- mDeleteMutex = new LLMutex;
+ mDeleteMutex = new LLMutex(NULL);
+
+ if(!mLocalAPRFilePoolp)
+ {
+ mLocalAPRFilePoolp = new LLVolatileAPRPool() ;
+ }
}
LLWorkerThread::~LLWorkerThread()
@@ -76,7 +81,7 @@ void LLWorkerThread::clearDeleteList()
}
// virtual
-S32 LLWorkerThread::update(U32 max_time_ms)
+S32 LLWorkerThread::update(F32 max_time_ms)
{
S32 res = LLQueuedThread::update(max_time_ms);
// Delete scheduled workers
@@ -199,6 +204,7 @@ LLWorkerClass::LLWorkerClass(LLWorkerThread* workerthread, const std::string& na
mWorkerClassName(name),
mRequestHandle(LLWorkerThread::nullHandle()),
mRequestPriority(LLWorkerThread::PRIORITY_NORMAL),
+ mMutex(NULL),
mWorkFlags(0)
{
if (!mWorkerThread)
diff --git a/indra/llcommon/llworkerthread.h b/indra/llcommon/llworkerthread.h
index bef5ef53fe..be46394d6e 100644
--- a/indra/llcommon/llworkerthread.h
+++ b/indra/llcommon/llworkerthread.h
@@ -83,10 +83,10 @@ private:
LLMutex* mDeleteMutex;
public:
- LLWorkerThread(const std::string& name, bool threaded = true);
+ LLWorkerThread(const std::string& name, bool threaded = true, bool should_pause = false);
~LLWorkerThread();
- /*virtual*/ S32 update(U32 max_time_ms);
+ /*virtual*/ S32 update(F32 max_time_ms);
handle_t addWorkRequest(LLWorkerClass* workerclass, S32 param, U32 priority = PRIORITY_NORMAL);
@@ -94,6 +94,7 @@ public:
private:
void deleteWorker(LLWorkerClass* workerclass); // schedule for deletion
+
};
//============================================================================
@@ -193,7 +194,7 @@ protected:
U32 mRequestPriority; // last priority set
private:
- LLMutexRootPool mMutex; // Use LLMutexRootPool since this object is created and destructed by multiple threads.
+ LLMutex mMutex;
LLAtomicU32 mWorkFlags;
};
diff --git a/indra/llcommon/stdenums.h b/indra/llcommon/stdenums.h
index 556eff8370..40b3364b36 100644
--- a/indra/llcommon/stdenums.h
+++ b/indra/llcommon/stdenums.h
@@ -49,8 +49,9 @@ enum EDragAndDropType
DAD_ANIMATION = 12,
DAD_GESTURE = 13,
DAD_LINK = 14,
- DAD_MESH = 15,
- DAD_COUNT = 16, // number of types in this enum
+ DAD_MESH = 15,
+ DAD_WIDGET = 16,
+ DAD_COUNT = 17, // number of types in this enum
};
// Reasons for drags to be denied.
diff --git a/indra/llcommon/tests/StringVec.h b/indra/llcommon/tests/StringVec.h
new file mode 100644
index 0000000000..a380b00a05
--- /dev/null
+++ b/indra/llcommon/tests/StringVec.h
@@ -0,0 +1,37 @@
+/**
+ * @file StringVec.h
+ * @author Nat Goodspeed
+ * @date 2012-02-24
+ * @brief Extend TUT ensure_equals() to handle std::vector<std::string>
+ *
+ * $LicenseInfo:firstyear=2012&license=viewerlgpl$
+ * Copyright (c) 2012, Linden Research, Inc.
+ * $/LicenseInfo$
+ */
+
+#if ! defined(LL_STRINGVEC_H)
+#define LL_STRINGVEC_H
+
+#include <vector>
+#include <string>
+#include <iostream>
+
+typedef std::vector<std::string> StringVec;
+
+std::ostream& operator<<(std::ostream& out, const StringVec& strings)
+{
+ out << '(';
+ StringVec::const_iterator begin(strings.begin()), end(strings.end());
+ if (begin != end)
+ {
+ out << '"' << *begin << '"';
+ while (++begin != end)
+ {
+ out << ", \"" << *begin << '"';
+ }
+ }
+ out << ')';
+ return out;
+}
+
+#endif /* ! defined(LL_STRINGVEC_H) */
diff --git a/indra/llcommon/tests/listener.h b/indra/llcommon/tests/listener.h
index dcdb2412be..9c5c18a150 100644
--- a/indra/llcommon/tests/listener.h
+++ b/indra/llcommon/tests/listener.h
@@ -30,6 +30,8 @@
#define LL_LISTENER_H
#include "llsd.h"
+#include "llevents.h"
+#include "tests/StringVec.h"
#include <iostream>
/*****************************************************************************
@@ -133,24 +135,7 @@ struct Collect
return false;
}
void clear() { result.clear(); }
- typedef std::vector<std::string> StringList;
- StringList result;
+ StringVec result;
};
-std::ostream& operator<<(std::ostream& out, const Collect::StringList& strings)
-{
- out << '(';
- Collect::StringList::const_iterator begin(strings.begin()), end(strings.end());
- if (begin != end)
- {
- out << '"' << *begin << '"';
- while (++begin != end)
- {
- out << ", \"" << *begin << '"';
- }
- }
- out << ')';
- return out;
-}
-
#endif /* ! defined(LL_LISTENER_H) */
diff --git a/indra/llcommon/tests/llinstancetracker_test.cpp b/indra/llcommon/tests/llinstancetracker_test.cpp
index b34d1c5fd3..454695ff9f 100644
--- a/indra/llcommon/tests/llinstancetracker_test.cpp
+++ b/indra/llcommon/tests/llinstancetracker_test.cpp
@@ -35,6 +35,7 @@
#include <vector>
#include <set>
#include <algorithm> // std::sort()
+#include <stdexcept>
// std headers
// external library headers
#include <boost/scoped_ptr.hpp>
@@ -42,6 +43,11 @@
#include "../test/lltut.h"
#include "wrapllerrs.h"
+struct Badness: public std::runtime_error
+{
+ Badness(const std::string& what): std::runtime_error(what) {}
+};
+
struct Keyed: public LLInstanceTracker<Keyed, std::string>
{
Keyed(const std::string& name):
@@ -53,6 +59,17 @@ struct Keyed: public LLInstanceTracker<Keyed, std::string>
struct Unkeyed: public LLInstanceTracker<Unkeyed>
{
+ Unkeyed(const std::string& thrw="")
+ {
+ // LLInstanceTracker should respond appropriately if a subclass
+ // constructor throws an exception. Specifically, it should run
+ // LLInstanceTracker's destructor and remove itself from the
+ // underlying container.
+ if (! thrw.empty())
+ {
+ throw Badness(thrw);
+ }
+ }
};
/*****************************************************************************
@@ -95,6 +112,7 @@ namespace tut
void object::test<2>()
{
ensure_equals(Unkeyed::instanceCount(), 0);
+ Unkeyed* dangling = NULL;
{
Unkeyed one;
ensure_equals(Unkeyed::instanceCount(), 1);
@@ -107,7 +125,11 @@ namespace tut
ensure_equals(found, two.get());
}
ensure_equals(Unkeyed::instanceCount(), 1);
- }
+ // store an unwise pointer to a temp Unkeyed instance
+ dangling = &one;
+ } // make that instance vanish
+ // check the now-invalid pointer to the destroyed instance
+ ensure("getInstance(T*) failed to track destruction", ! Unkeyed::getInstance(dangling));
ensure_equals(Unkeyed::instanceCount(), 0);
}
@@ -229,4 +251,49 @@ namespace tut
}
ensure(! what.empty());
}
+
+ template<> template<>
+ void object::test<8>()
+ {
+ set_test_name("exception in subclass ctor");
+ typedef std::set<Unkeyed*> InstanceSet;
+ InstanceSet existing;
+ // We can't use the iterator-range InstanceSet constructor because
+ // beginInstances() returns an iterator that dereferences to an
+ // Unkeyed&, not an Unkeyed*.
+ for (Unkeyed::instance_iter uki(Unkeyed::beginInstances()),
+ ukend(Unkeyed::endInstances());
+ uki != ukend; ++uki)
+ {
+ existing.insert(&*uki);
+ }
+ Unkeyed* puk = NULL;
+ try
+ {
+ // We don't expect the assignment to take place because we expect
+ // Unkeyed to respond to the non-empty string param by throwing.
+ // We know the LLInstanceTracker base-class constructor will have
+ // run before Unkeyed's constructor, therefore the new instance
+ // will have added itself to the underlying set. The whole
+ // question is, when Unkeyed's constructor throws, will
+ // LLInstanceTracker's destructor remove it from the set? I
+ // realize we're testing the C++ implementation more than
+ // Unkeyed's implementation, but this seems an important point to
+ // nail down.
+ puk = new Unkeyed("throw");
+ }
+ catch (const Badness&)
+ {
+ }
+ // Ensure that every member of the new, updated set of Unkeyed
+ // instances was also present in the original set. If that's not true,
+ // it's because our new Unkeyed ended up in the updated set despite
+ // its constructor exception.
+ for (Unkeyed::instance_iter uki(Unkeyed::beginInstances()),
+ ukend(Unkeyed::endInstances());
+ uki != ukend; ++uki)
+ {
+ ensure("failed to remove instance", existing.find(&*uki) != existing.end());
+ }
+ }
} // namespace tut
diff --git a/indra/llcommon/tests/llleap_test.cpp b/indra/llcommon/tests/llleap_test.cpp
new file mode 100644
index 0000000000..9b755e9ca5
--- /dev/null
+++ b/indra/llcommon/tests/llleap_test.cpp
@@ -0,0 +1,694 @@
+/**
+ * @file llleap_test.cpp
+ * @author Nat Goodspeed
+ * @date 2012-02-21
+ * @brief Test for llleap.
+ *
+ * $LicenseInfo:firstyear=2012&license=viewerlgpl$
+ * Copyright (c) 2012, Linden Research, Inc.
+ * $/LicenseInfo$
+ */
+
+// Precompiled header
+#include "linden_common.h"
+// associated header
+#include "llleap.h"
+// STL headers
+// std headers
+// external library headers
+#include <boost/assign/list_of.hpp>
+#include <boost/lambda/lambda.hpp>
+#include <boost/foreach.hpp>
+// other Linden headers
+#include "../test/lltut.h"
+#include "../test/namedtempfile.h"
+#include "../test/manageapr.h"
+#include "../test/catch_and_store_what_in.h"
+#include "wrapllerrs.h"
+#include "llevents.h"
+#include "llprocess.h"
+#include "stringize.h"
+#include "StringVec.h"
+#include <functional>
+
+using boost::assign::list_of;
+
+static ManageAPR manager;
+
+StringVec sv(const StringVec& listof) { return listof; }
+
+#if defined(LL_WINDOWS)
+#define sleep(secs) _sleep((secs) * 1000)
+#endif
+
+#if ! LL_WINDOWS
+const size_t BUFFERED_LENGTH = 1023*1024; // try wrangling just under a megabyte of data
+#else
+// "Then there's Windows... sigh." The "very large message" test is flaky in a
+// way that seems to point to either the OS (nonblocking writes to pipes) or
+// possibly the apr_file_write() function. Poring over log messages reveals
+// that at some point along the way apr_file_write() returns 11 (Resource
+// temporarily unavailable, i.e. EAGAIN) and says it wrote 0 bytes -- even
+// though it did write the chunk! Our next write attempt retries the same
+// chunk, resulting in the chunk being duplicated at the child end, corrupting
+// the data stream. Much as I would love to be able to fix it for real, such a
+// fix would appear to require distinguishing bogus EAGAIN returns from real
+// ones -- how?? Empirically this behavior is only observed when writing a
+// "very large message". To be able to move forward at all, try to bypass this
+// particular failure by adjusting the size of a "very large message" on
+// Windows.
+const size_t BUFFERED_LENGTH = 65336;
+#endif // LL_WINDOWS
+
+void waitfor(const std::vector<LLLeap*>& instances, int timeout=60)
+{
+ int i;
+ for (i = 0; i < timeout; ++i)
+ {
+ // Every iteration, test whether any of the passed LLLeap instances
+ // still exist (are still running).
+ std::vector<LLLeap*>::const_iterator vli(instances.begin()), vlend(instances.end());
+ for ( ; vli != vlend; ++vli)
+ {
+ // getInstance() returns NULL if it's terminated/gone, non-NULL if
+ // it's still running
+ if (LLLeap::getInstance(*vli))
+ break;
+ }
+ // If we made it through all of 'instances' without finding one that's
+ // still running, we're done.
+ if (vli == vlend)
+ {
+/*==========================================================================*|
+ std::cout << instances.size() << " LLLeap instances terminated in "
+ << i << " seconds, proceeding" << std::endl;
+|*==========================================================================*/
+ return;
+ }
+ // Found an instance that's still running. Wait and pump LLProcess.
+ sleep(1);
+ LLEventPumps::instance().obtain("mainloop").post(LLSD());
+ }
+ tut::ensure(STRINGIZE("at least 1 of " << instances.size()
+ << " LLLeap instances timed out ("
+ << timeout << " seconds) without terminating"),
+ i < timeout);
+}
+
+void waitfor(LLLeap* instance, int timeout=60)
+{
+ std::vector<LLLeap*> instances;
+ instances.push_back(instance);
+ waitfor(instances, timeout);
+}
+
+/*****************************************************************************
+* TUT
+*****************************************************************************/
+namespace tut
+{
+ struct llleap_data
+ {
+ llleap_data():
+ reader(".py",
+ // This logic is adapted from vita.viewerclient.receiveEvent()
+ boost::lambda::_1 <<
+ "import re\n"
+ "import os\n"
+ "import sys\n"
+ "\n"
+ // Don't forget that this Python script is written to some
+ // temp directory somewhere! Its __file__ is useless in
+ // finding indra/lib/python. Use our __FILE__, with
+ // raw-string syntax to deal with Windows pathnames.
+ "mydir = os.path.dirname(r'" << __FILE__ << "')\n"
+ "try:\n"
+ " from llbase import llsd\n"
+ "except ImportError:\n"
+ // We expect mydir to be .../indra/llcommon/tests.
+ " sys.path.insert(0,\n"
+ " os.path.join(mydir, os.pardir, os.pardir, 'lib', 'python'))\n"
+ " from indra.base import llsd\n"
+ "\n"
+ "class ProtocolError(Exception):\n"
+ " def __init__(self, msg, data):\n"
+ " Exception.__init__(self, msg)\n"
+ " self.data = data\n"
+ "\n"
+ "class ParseError(ProtocolError):\n"
+ " pass\n"
+ "\n"
+ "def get():\n"
+ " hdr = ''\n"
+ " while ':' not in hdr and len(hdr) < 20:\n"
+ " hdr += sys.stdin.read(1)\n"
+ " if not hdr:\n"
+ " sys.exit(0)\n"
+ " if not hdr.endswith(':'):\n"
+ " raise ProtocolError('Expected len:data, got %r' % hdr, hdr)\n"
+ " try:\n"
+ " length = int(hdr[:-1])\n"
+ " except ValueError:\n"
+ " raise ProtocolError('Non-numeric len %r' % hdr[:-1], hdr[:-1])\n"
+ " parts = []\n"
+ " received = 0\n"
+ " while received < length:\n"
+ " parts.append(sys.stdin.read(length - received))\n"
+ " received += len(parts[-1])\n"
+ " data = ''.join(parts)\n"
+ " assert len(data) == length\n"
+ " try:\n"
+ " return llsd.parse(data)\n"
+ // Seems the old indra.base.llsd module didn't properly
+ // convert IndexError (from running off end of string) to
+ // LLSDParseError.
+ " except (IndexError, llsd.LLSDParseError), e:\n"
+ " msg = 'Bad received packet (%s)' % e\n"
+ " print >>sys.stderr, '%s, %s bytes:' % (msg, len(data))\n"
+ " showmax = 40\n"
+ // We've observed failures with very large packets;
+ // dumping the entire packet wastes time and space.
+ // But if the error states a particular byte offset,
+ // truncate to (near) that offset when dumping data.
+ " location = re.search(r' at (byte|index) ([0-9]+)', str(e))\n"
+ " if not location:\n"
+ " # didn't find offset, dump whole thing, no ellipsis\n"
+ " ellipsis = ''\n"
+ " else:\n"
+ " # found offset within error message\n"
+ " trunc = int(location.group(2)) + showmax\n"
+ " data = data[:trunc]\n"
+ " ellipsis = '... (%s more)' % (length - trunc)\n"
+ " offset = -showmax\n"
+ " for offset in xrange(0, len(data)-showmax, showmax):\n"
+ " print >>sys.stderr, '%04d: %r +' % \\\n"
+ " (offset, data[offset:offset+showmax])\n"
+ " offset += showmax\n"
+ " print >>sys.stderr, '%04d: %r%s' % \\\n"
+ " (offset, data[offset:], ellipsis)\n"
+ " raise ParseError(msg, data)\n"
+ "\n"
+ "# deal with initial stdin message\n"
+ // this will throw if the initial write to stdin doesn't
+ // follow len:data protocol, or if we couldn't find 'pump'
+ // in the dict
+ "_reply = get()['pump']\n"
+ "\n"
+ "def replypump():\n"
+ " return _reply\n"
+ "\n"
+ "def put(req):\n"
+ " sys.stdout.write(':'.join((str(len(req)), req)))\n"
+ " sys.stdout.flush()\n"
+ "\n"
+ "def send(pump, data):\n"
+ " put(llsd.format_notation(dict(pump=pump, data=data)))\n"
+ "\n"
+ "def request(pump, data):\n"
+ " # we expect 'data' is a dict\n"
+ " data['reply'] = _reply\n"
+ " send(pump, data)\n"),
+ // Get the actual pathname of the NamedExtTempFile and trim off
+ // the ".py" extension. (We could cache reader.getName() in a
+ // separate member variable, but I happen to know getName() just
+ // returns a NamedExtTempFile member rather than performing any
+ // computation, so I don't mind calling it twice.) Then take the
+ // basename.
+ reader_module(LLProcess::basename(
+ reader.getName().substr(0, reader.getName().length()-3))),
+ pPYTHON(getenv("PYTHON")),
+ PYTHON(pPYTHON? pPYTHON : "")
+ {
+ ensure("Set PYTHON to interpreter pathname", pPYTHON);
+ }
+ NamedExtTempFile reader;
+ const std::string reader_module;
+ const char* pPYTHON;
+ const std::string PYTHON;
+ };
+ typedef test_group<llleap_data> llleap_group;
+ typedef llleap_group::object object;
+ llleap_group llleapgrp("llleap");
+
+ template<> template<>
+ void object::test<1>()
+ {
+ set_test_name("multiple LLLeap instances");
+ NamedTempFile script("py",
+ "import time\n"
+ "time.sleep(1)\n");
+ std::vector<LLLeap*> instances;
+ instances.push_back(LLLeap::create(get_test_name(),
+ sv(list_of(PYTHON)(script.getName()))));
+ instances.push_back(LLLeap::create(get_test_name(),
+ sv(list_of(PYTHON)(script.getName()))));
+ // In this case we're simply establishing that two LLLeap instances
+ // can coexist without throwing exceptions or bombing in any other
+ // way. Wait for them to terminate.
+ waitfor(instances);
+ }
+
+ template<> template<>
+ void object::test<2>()
+ {
+ set_test_name("stderr to log");
+ NamedTempFile script("py",
+ "import sys\n"
+ "sys.stderr.write('''Hello from Python!\n"
+ "note partial line''')\n");
+ CaptureLog log(LLError::LEVEL_INFO);
+ waitfor(LLLeap::create(get_test_name(),
+ sv(list_of(PYTHON)(script.getName()))));
+ log.messageWith("Hello from Python!");
+ log.messageWith("note partial line");
+ }
+
+ template<> template<>
+ void object::test<3>()
+ {
+ set_test_name("bad stdout protocol");
+ NamedTempFile script("py",
+ "print 'Hello from Python!'\n");
+ CaptureLog log(LLError::LEVEL_WARN);
+ waitfor(LLLeap::create(get_test_name(),
+ sv(list_of(PYTHON)(script.getName()))));
+ ensure_contains("error log line",
+ log.messageWith("invalid protocol"), "Hello from Python!");
+ }
+
+ template<> template<>
+ void object::test<4>()
+ {
+ set_test_name("leftover stdout");
+ NamedTempFile script("py",
+ "import sys\n"
+ // note lack of newline
+ "sys.stdout.write('Hello from Python!')\n");
+ CaptureLog log(LLError::LEVEL_WARN);
+ waitfor(LLLeap::create(get_test_name(),
+ sv(list_of(PYTHON)(script.getName()))));
+ ensure_contains("error log line",
+ log.messageWith("Discarding"), "Hello from Python!");
+ }
+
+ template<> template<>
+ void object::test<5>()
+ {
+ set_test_name("bad stdout len prefix");
+ NamedTempFile script("py",
+ "import sys\n"
+ "sys.stdout.write('5a2:something')\n");
+ CaptureLog log(LLError::LEVEL_WARN);
+ waitfor(LLLeap::create(get_test_name(),
+ sv(list_of(PYTHON)(script.getName()))));
+ ensure_contains("error log line",
+ log.messageWith("invalid protocol"), "5a2:");
+ }
+
+ template<> template<>
+ void object::test<6>()
+ {
+ set_test_name("empty plugin vector");
+ std::string threw;
+ try
+ {
+ LLLeap::create("empty", StringVec());
+ }
+ CATCH_AND_STORE_WHAT_IN(threw, LLLeap::Error)
+ ensure_contains("LLLeap::Error", threw, "no plugin");
+ // try the suppress-exception variant
+ ensure("bad launch returned non-NULL", ! LLLeap::create("empty", StringVec(), false));
+ }
+
+ template<> template<>
+ void object::test<7>()
+ {
+ set_test_name("bad launch");
+ // Synthesize bogus executable name
+ std::string BADPYTHON(PYTHON.substr(0, PYTHON.length()-1) + "x");
+ CaptureLog log;
+ std::string threw;
+ try
+ {
+ LLLeap::create("bad exe", BADPYTHON);
+ }
+ CATCH_AND_STORE_WHAT_IN(threw, LLLeap::Error)
+ ensure_contains("LLLeap::create() didn't throw", threw, "failed");
+ log.messageWith("failed");
+ log.messageWith(BADPYTHON);
+ // try the suppress-exception variant
+ ensure("bad launch returned non-NULL", ! LLLeap::create("bad exe", BADPYTHON, false));
+ }
+
+ // Generic self-contained listener: derive from this and override its
+ // call() method, then tell somebody to post on the pump named getName().
+ // Control will reach your call() override.
+ struct ListenerBase
+ {
+ // Pass the pump name you want; will tweak for uniqueness.
+ ListenerBase(const std::string& name):
+ mPump(name, true)
+ {
+ mPump.listen(name, boost::bind(&ListenerBase::call, this, _1));
+ }
+
+ virtual ~ListenerBase() {} // pacify MSVC
+
+ virtual bool call(const LLSD& request)
+ {
+ return false;
+ }
+
+ LLEventPump& getPump() { return mPump; }
+ const LLEventPump& getPump() const { return mPump; }
+
+ std::string getName() const { return mPump.getName(); }
+ void post(const LLSD& data) { mPump.post(data); }
+
+ LLEventStream mPump;
+ };
+
+ // Mimic a dummy little LLEventAPI that merely sends a reply back to its
+ // requester on the "reply" pump.
+ struct AckAPI: public ListenerBase
+ {
+ AckAPI(): ListenerBase("AckAPI") {}
+
+ virtual bool call(const LLSD& request)
+ {
+ LLEventPumps::instance().obtain(request["reply"]).post("ack");
+ return false;
+ }
+ };
+
+ // Give LLLeap script a way to post success/failure.
+ struct Result: public ListenerBase
+ {
+ Result(): ListenerBase("Result") {}
+
+ virtual bool call(const LLSD& request)
+ {
+ mData = request;
+ return false;
+ }
+
+ void ensure() const
+ {
+ tut::ensure(std::string("never posted to ") + getName(), mData.isDefined());
+ // Post an empty string for success, non-empty string is failure message.
+ tut::ensure(mData, mData.asString().empty());
+ }
+
+ LLSD mData;
+ };
+
+ template<> template<>
+ void object::test<8>()
+ {
+ set_test_name("round trip");
+ AckAPI api;
+ Result result;
+ NamedTempFile script("py",
+ boost::lambda::_1 <<
+ "from " << reader_module << " import *\n"
+ // make a request on our little API
+ "request(pump='" << api.getName() << "', data={})\n"
+ // wait for its response
+ "resp = get()\n"
+ "result = '' if resp == dict(pump=replypump(), data='ack')\\\n"
+ " else 'bad: ' + str(resp)\n"
+ "send(pump='" << result.getName() << "', data=result)\n");
+ waitfor(LLLeap::create(get_test_name(), sv(list_of(PYTHON)(script.getName()))));
+ result.ensure();
+ }
+
+ struct ReqIDAPI: public ListenerBase
+ {
+ ReqIDAPI(): ListenerBase("ReqIDAPI") {}
+
+ virtual bool call(const LLSD& request)
+ {
+ // free function from llevents.h
+ sendReply(LLSD(), request);
+ return false;
+ }
+ };
+
+ template<> template<>
+ void object::test<9>()
+ {
+ set_test_name("many small messages");
+ // It's not clear to me whether there's value in iterating many times
+ // over a send/receive loop -- I don't think that will exercise any
+ // interesting corner cases. This test first sends a large number of
+ // messages, then receives all the responses. The intent is to ensure
+ // that some of that data stream crosses buffer boundaries, loop
+ // iterations etc. in OS pipes and the LLLeap/LLProcess implementation.
+ ReqIDAPI api;
+ Result result;
+ NamedTempFile script("py",
+ boost::lambda::_1 <<
+ "import sys\n"
+ "from " << reader_module << " import *\n"
+ // Note that since reader imports llsd, this
+ // 'import *' gets us llsd too.
+ "sample = llsd.format_notation(dict(pump='" <<
+ api.getName() << "', data=dict(reqid=999999, reply=replypump())))\n"
+ // The whole packet has length prefix too: "len:data"
+ "samplen = len(str(len(sample))) + 1 + len(sample)\n"
+ // guess how many messages it will take to
+ // accumulate BUFFERED_LENGTH
+ "count = int(" << BUFFERED_LENGTH << "/samplen)\n"
+ "print >>sys.stderr, 'Sending %s requests' % count\n"
+ "for i in xrange(count):\n"
+ " request('" << api.getName() << "', dict(reqid=i))\n"
+ // The assumption in this specific test that
+ // replies will arrive in the same order as
+ // requests is ONLY valid because the API we're
+ // invoking sends replies instantly. If the API
+ // had to wait for some external event before
+ // sending its reply, replies could arrive in
+ // arbitrary order, and we'd have to tick them
+ // off from a set.
+ "result = ''\n"
+ "for i in xrange(count):\n"
+ " resp = get()\n"
+ " if resp['data']['reqid'] != i:\n"
+ " result = 'expected reqid=%s in %s' % (i, resp)\n"
+ " break\n"
+ "send(pump='" << result.getName() << "', data=result)\n");
+ waitfor(LLLeap::create(get_test_name(), sv(list_of(PYTHON)(script.getName()))),
+ 300); // needs more realtime than most tests
+ result.ensure();
+ }
+
+ // This is the body of test<10>, extracted so we can run it over a number
+ // of large-message sizes.
+ void test_large_message(const std::string& PYTHON, const std::string& reader_module,
+ const std::string& test_name, size_t size)
+ {
+ ReqIDAPI api;
+ Result result;
+ NamedTempFile script("py",
+ boost::lambda::_1 <<
+ "import sys\n"
+ "from " << reader_module << " import *\n"
+ // Generate a very large string value.
+ "desired = int(sys.argv[1])\n"
+ // 7 chars per item: 6 digits, 1 comma
+ "count = int((desired - 50)/7)\n"
+ "large = ''.join('%06d,' % i for i in xrange(count))\n"
+ // Pass 'large' as reqid because we know the API
+ // will echo reqid, and we want to receive it back.
+ "request('" << api.getName() << "', dict(reqid=large))\n"
+ "try:\n"
+ " resp = get()\n"
+ "except ParseError, e:\n"
+ " # try to find where e.data diverges from expectation\n"
+ // Normally we'd expect a 'pump' key in there,
+ // too, with value replypump(). But Python
+ // serializes keys in a different order than C++,
+ // so incoming data start with 'data'.
+ // Truthfully, though, if we get as far as 'pump'
+ // before we find a difference, something's very
+ // strange.
+ " expect = llsd.format_notation(dict(data=dict(reqid=large)))\n"
+ " chunk = 40\n"
+ " for offset in xrange(0, max(len(e.data), len(expect)), chunk):\n"
+ " if e.data[offset:offset+chunk] != \\\n"
+ " expect[offset:offset+chunk]:\n"
+ " print >>sys.stderr, 'Offset %06d: expect %r,\\n'\\\n"
+ " ' get %r' %\\\n"
+ " (offset,\n"
+ " expect[offset:offset+chunk],\n"
+ " e.data[offset:offset+chunk])\n"
+ " break\n"
+ " else:\n"
+ " print >>sys.stderr, 'incoming data matches expect?!'\n"
+ " send('" << result.getName() << "', '%s: %s' % (e.__class__.__name__, e))\n"
+ " sys.exit(1)\n"
+ "\n"
+ "echoed = resp['data']['reqid']\n"
+ "if echoed == large:\n"
+ " send('" << result.getName() << "', '')\n"
+ " sys.exit(0)\n"
+ // Here we know echoed did NOT match; try to find where
+ "for i in xrange(count):\n"
+ " start = 7*i\n"
+ " end = 7*(i+1)\n"
+ " if end > len(echoed)\\\n"
+ " or echoed[start:end] != large[start:end]:\n"
+ " send('" << result.getName() << "',\n"
+ " 'at offset %s, expected %r but got %r' %\n"
+ " (start, large[start:end], echoed[start:end]))\n"
+ "sys.exit(1)\n");
+ waitfor(LLLeap::create(test_name,
+ sv(list_of
+ (PYTHON)
+ (script.getName())
+ (stringize(size)))),
+ 180); // try a longer timeout
+ result.ensure();
+ }
+
+ struct TestLargeMessage: public std::binary_function<size_t, size_t, bool>
+ {
+ TestLargeMessage(const std::string& PYTHON_, const std::string& reader_module_,
+ const std::string& test_name_):
+ PYTHON(PYTHON_),
+ reader_module(reader_module_),
+ test_name(test_name_)
+ {}
+
+ bool operator()(size_t left, size_t right) const
+ {
+ // We don't know whether upper_bound is going to pass the "sought
+ // value" as the left or the right operand. We pass 0 as the
+ // "sought value" so we can distinguish it. Of course that means
+ // the sequence we're searching must not itself contain 0!
+ size_t size;
+ bool success;
+ if (left)
+ {
+ size = left;
+ // Consider our return value carefully. Normal binary_search
+ // (or, in our case, upper_bound) expects a container sorted
+ // in ascending order, and defaults to the std::less
+ // comparator. Our container is in fact in ascending order, so
+ // return consistently with std::less. Here we were called as
+ // compare(item, sought). If std::less were called that way,
+ // 'true' would mean to move right (to higher numbers) within
+ // the sequence: the item being considered is less than the
+ // sought value. For us, that means that test_large_message()
+ // success should return 'true'.
+ success = true;
+ }
+ else
+ {
+ size = right;
+ // Here we were called as compare(sought, item). If std::less
+ // were called that way, 'true' would mean to move left (to
+ // lower numbers) within the sequence: the sought value is
+ // less than the item being considered. For us, that means
+ // test_large_message() FAILURE should return 'true', hence
+ // test_large_message() success should return 'false'.
+ success = false;
+ }
+
+ try
+ {
+ test_large_message(PYTHON, reader_module, test_name, size);
+ std::cout << "test_large_message(" << size << ") succeeded" << std::endl;
+ return success;
+ }
+ catch (const failure& e)
+ {
+ std::cout << "test_large_message(" << size << ") failed: " << e.what() << std::endl;
+ return ! success;
+ }
+ }
+
+ const std::string PYTHON, reader_module, test_name;
+ };
+
+ // The point of this function is to try to find a size at which
+ // test_large_message() can succeed. We still want the overall test to
+ // fail; otherwise we won't get the coder's attention -- but if
+ // test_large_message() fails, try to find a plausible size at which it
+ // DOES work.
+ void test_or_split(const std::string& PYTHON, const std::string& reader_module,
+ const std::string& test_name, size_t size)
+ {
+ try
+ {
+ test_large_message(PYTHON, reader_module, test_name, size);
+ }
+ catch (const failure& e)
+ {
+ std::cout << "test_large_message(" << size << ") failed: " << e.what() << std::endl;
+ // If it still fails below 4K, give up: subdividing any further is
+ // pointless.
+ if (size >= 4096)
+ {
+ try
+ {
+ // Recur with half the size
+ size_t smaller(size/2);
+ test_or_split(PYTHON, reader_module, test_name, smaller);
+ // Recursive call will throw if test_large_message()
+ // failed, therefore we only reach the line below if it
+ // succeeded.
+ std::cout << "but test_large_message(" << smaller << ") succeeded" << std::endl;
+
+ // Binary search for largest size that works. But since
+ // std::binary_search() only returns bool, actually use
+ // std::upper_bound(), consistent with our desire to find
+ // the LARGEST size that works. First generate a sorted
+ // container of all the sizes we intend to try, from
+ // 'smaller' (known to work) to 'size' (known to fail). We
+ // could whomp up magic iterators to do this dynamically,
+ // without actually instantiating a vector, but for a test
+ // program this will do. At least preallocate the vector.
+ // Per TestLargeMessage comments, it's important that this
+ // vector not contain 0.
+ std::vector<size_t> sizes;
+ sizes.reserve((size - smaller)/4096 + 1);
+ for (size_t sz(smaller), szend(size); sz < szend; sz += 4096)
+ sizes.push_back(sz);
+ // our comparator
+ TestLargeMessage tester(PYTHON, reader_module, test_name);
+ // Per TestLargeMessage comments, pass 0 as the sought value.
+ std::vector<size_t>::const_iterator found =
+ std::upper_bound(sizes.begin(), sizes.end(), 0, tester);
+ if (found != sizes.end() && found != sizes.begin())
+ {
+ std::cout << "test_large_message(" << *(found - 1)
+ << ") is largest that succeeds" << std::endl;
+ }
+ else
+ {
+ std::cout << "cannot determine largest test_large_message(size) "
+ << "that succeeds" << std::endl;
+ }
+ }
+ catch (const failure&)
+ {
+ // The recursive test_or_split() call above has already
+ // handled the exception. We don't want our caller to see
+ // innermost exception; propagate outermost (below).
+ }
+ }
+ // In any case, because we reached here through failure of
+ // our original test_large_message(size) call, ensure failure
+ // propagates.
+ throw e;
+ }
+ }
+
+ template<> template<>
+ void object::test<10>()
+ {
+ set_test_name("very large message");
+ test_or_split(PYTHON, reader_module, get_test_name(), BUFFERED_LENGTH);
+ }
+} // namespace tut
diff --git a/indra/llcommon/tests/llprocess_test.cpp b/indra/llcommon/tests/llprocess_test.cpp
new file mode 100644
index 0000000000..99186ed434
--- /dev/null
+++ b/indra/llcommon/tests/llprocess_test.cpp
@@ -0,0 +1,1262 @@
+/**
+ * @file llprocess_test.cpp
+ * @author Nat Goodspeed
+ * @date 2011-12-19
+ * @brief Test for llprocess.
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Copyright (c) 2011, Linden Research, Inc.
+ * $/LicenseInfo$
+ */
+
+// Precompiled header
+#include "linden_common.h"
+// associated header
+#include "llprocess.h"
+// STL headers
+#include <vector>
+#include <list>
+// std headers
+#include <fstream>
+// external library headers
+#include "llapr.h"
+#include "apr_thread_proc.h"
+#include <boost/foreach.hpp>
+#include <boost/function.hpp>
+#include <boost/algorithm/string/find_iterator.hpp>
+#include <boost/algorithm/string/finder.hpp>
+//#include <boost/lambda/lambda.hpp>
+//#include <boost/lambda/bind.hpp>
+// other Linden headers
+#include "../test/lltut.h"
+#include "../test/manageapr.h"
+#include "../test/namedtempfile.h"
+#include "../test/catch_and_store_what_in.h"
+#include "stringize.h"
+#include "llsdutil.h"
+#include "llevents.h"
+#include "wrapllerrs.h"
+
+#if defined(LL_WINDOWS)
+#define sleep(secs) _sleep((secs) * 1000)
+#define EOL "\r\n"
+#else
+#define EOL "\n"
+#include <sys/wait.h>
+#endif
+
+//namespace lambda = boost::lambda;
+
+// static instance of this manages APR init/cleanup
+static ManageAPR manager;
+
+/*****************************************************************************
+* Helpers
+*****************************************************************************/
+
+#define ensure_equals_(left, right) \
+ ensure_equals(STRINGIZE(#left << " != " << #right), (left), (right))
+
+#define aprchk(expr) aprchk_(#expr, (expr))
+static void aprchk_(const char* call, apr_status_t rv, apr_status_t expected=APR_SUCCESS)
+{
+ tut::ensure_equals(STRINGIZE(call << " => " << rv << ": " << manager.strerror(rv)),
+ rv, expected);
+}
+
+/**
+ * Read specified file using std::getline(). It is assumed to be an error if
+ * the file is empty: don't use this function if that's an acceptable case.
+ * Last line will not end with '\n'; this is to facilitate the usual case of
+ * string compares with a single line of output.
+ * @param pathname The file to read.
+ * @param desc Optional description of the file for error message;
+ * defaults to "in <pathname>"
+ */
+static std::string readfile(const std::string& pathname, const std::string& desc="")
+{
+ std::string use_desc(desc);
+ if (use_desc.empty())
+ {
+ use_desc = STRINGIZE("in " << pathname);
+ }
+ std::ifstream inf(pathname.c_str());
+ std::string output;
+ tut::ensure(STRINGIZE("No output " << use_desc), std::getline(inf, output));
+ std::string more;
+ while (std::getline(inf, more))
+ {
+ output += '\n' + more;
+ }
+ return output;
+}
+
+/// Looping on LLProcess::isRunning() must now be accompanied by pumping
+/// "mainloop" -- otherwise the status won't update and you get an infinite
+/// loop.
+void yield(int seconds=1)
+{
+ // This function simulates waiting for another viewer frame
+ sleep(seconds);
+ LLEventPumps::instance().obtain("mainloop").post(LLSD());
+}
+
+void waitfor(LLProcess& proc, int timeout=60)
+{
+ int i = 0;
+ for ( ; i < timeout && proc.isRunning(); ++i)
+ {
+ yield();
+ }
+ tut::ensure(STRINGIZE("process took longer than " << timeout << " seconds to terminate"),
+ i < timeout);
+}
+
+void waitfor(LLProcess::handle h, const std::string& desc, int timeout=60)
+{
+ int i = 0;
+ for ( ; i < timeout && LLProcess::isRunning(h, desc); ++i)
+ {
+ yield();
+ }
+ tut::ensure(STRINGIZE("process took longer than " << timeout << " seconds to terminate"),
+ i < timeout);
+}
+
+/**
+ * Construct an LLProcess to run a Python script.
+ */
+struct PythonProcessLauncher
+{
+ /**
+ * @param desc Arbitrary description for error messages
+ * @param script Python script, any form acceptable to NamedTempFile,
+ * typically either a std::string or an expression of the form
+ * (lambda::_1 << "script content with " << variable_data)
+ */
+ template <typename CONTENT>
+ PythonProcessLauncher(const std::string& desc, const CONTENT& script):
+ mDesc(desc),
+ mScript("py", script)
+ {
+ const char* PYTHON(getenv("PYTHON"));
+ tut::ensure("Set $PYTHON to the Python interpreter", PYTHON);
+
+ mParams.desc = desc + " script";
+ mParams.executable = PYTHON;
+ mParams.args.add(mScript.getName());
+ }
+
+ /// Launch Python script; verify that it launched
+ void launch()
+ {
+ mPy = LLProcess::create(mParams);
+ tut::ensure(STRINGIZE("Couldn't launch " << mDesc << " script"), mPy);
+ }
+
+ /// Run Python script and wait for it to complete.
+ void run()
+ {
+ launch();
+ // One of the irritating things about LLProcess is that
+ // there's no API to wait for the child to terminate -- but given
+ // its use in our graphics-intensive interactive viewer, it's
+ // understandable.
+ waitfor(*mPy);
+ }
+
+ /**
+ * Run a Python script using LLProcess, expecting that it will
+ * write to the file passed as its sys.argv[1]. Retrieve that output.
+ *
+ * Until January 2012, LLProcess provided distressingly few
+ * mechanisms for a child process to communicate back to its caller --
+ * not even its return code. We've introduced a convention by which we
+ * create an empty temp file, pass the name of that file to our child
+ * as sys.argv[1] and expect the script to write its output to that
+ * file. This function implements the C++ (parent process) side of
+ * that convention.
+ */
+ std::string run_read()
+ {
+ NamedTempFile out("out", ""); // placeholder
+ // pass name of this temporary file to the script
+ mParams.args.add(out.getName());
+ run();
+ // assuming the script wrote to that file, read it
+ return readfile(out.getName(), STRINGIZE("from " << mDesc << " script"));
+ }
+
+ LLProcess::Params mParams;
+ LLProcessPtr mPy;
+ std::string mDesc;
+ NamedTempFile mScript;
+};
+
+/// convenience function for PythonProcessLauncher::run()
+template <typename CONTENT>
+static void python(const std::string& desc, const CONTENT& script)
+{
+ PythonProcessLauncher py(desc, script);
+ py.run();
+}
+
+/// convenience function for PythonProcessLauncher::run_read()
+template <typename CONTENT>
+static std::string python_out(const std::string& desc, const CONTENT& script)
+{
+ PythonProcessLauncher py(desc, script);
+ return py.run_read();
+}
+
+/// Create a temporary directory and clean it up later.
+class NamedTempDir: public boost::noncopyable
+{
+public:
+ // Use python() function to create a temp directory: I've found
+ // nothing in either Boost.Filesystem or APR quite like Python's
+ // tempfile.mkdtemp().
+ // Special extra bonus: on Mac, mkdtemp() reports a pathname
+ // starting with /var/folders/something, whereas that's really a
+ // symlink to /private/var/folders/something. Have to use
+ // realpath() to compare properly.
+ NamedTempDir():
+ mPath(python_out("mkdtemp()",
+ "from __future__ import with_statement\n"
+ "import os.path, sys, tempfile\n"
+ "with open(sys.argv[1], 'w') as f:\n"
+ " f.write(os.path.normcase(os.path.normpath(os.path.realpath(tempfile.mkdtemp()))))\n"))
+ {}
+
+ ~NamedTempDir()
+ {
+ aprchk(apr_dir_remove(mPath.c_str(), gAPRPoolp));
+ }
+
+ std::string getName() const { return mPath; }
+
+private:
+ std::string mPath;
+};
+
+/*****************************************************************************
+* TUT
+*****************************************************************************/
+namespace tut
+{
+ struct llprocess_data
+ {
+ LLAPRPool pool;
+ };
+ typedef test_group<llprocess_data> llprocess_group;
+ typedef llprocess_group::object object;
+ llprocess_group llprocessgrp("llprocess");
+
+ struct Item
+ {
+ Item(): tries(0) {}
+ unsigned tries;
+ std::string which;
+ std::string what;
+ };
+
+/*==========================================================================*|
+#define tabent(symbol) { symbol, #symbol }
+ static struct ReasonCode
+ {
+ int code;
+ const char* name;
+ } reasons[] =
+ {
+ tabent(APR_OC_REASON_DEATH),
+ tabent(APR_OC_REASON_UNWRITABLE),
+ tabent(APR_OC_REASON_RESTART),
+ tabent(APR_OC_REASON_UNREGISTER),
+ tabent(APR_OC_REASON_LOST),
+ tabent(APR_OC_REASON_RUNNING)
+ };
+#undef tabent
+|*==========================================================================*/
+
+ struct WaitInfo
+ {
+ WaitInfo(apr_proc_t* child_):
+ child(child_),
+ rv(-1), // we haven't yet called apr_proc_wait()
+ rc(0),
+ why(apr_exit_why_e(0))
+ {}
+ apr_proc_t* child; // which subprocess
+ apr_status_t rv; // return from apr_proc_wait()
+ int rc; // child's exit code
+ apr_exit_why_e why; // APR_PROC_EXIT, APR_PROC_SIGNAL, APR_PROC_SIGNAL_CORE
+ };
+
+ void child_status_callback(int reason, void* data, int status)
+ {
+/*==========================================================================*|
+ std::string reason_str;
+ BOOST_FOREACH(const ReasonCode& rcp, reasons)
+ {
+ if (reason == rcp.code)
+ {
+ reason_str = rcp.name;
+ break;
+ }
+ }
+ if (reason_str.empty())
+ {
+ reason_str = STRINGIZE("unknown reason " << reason);
+ }
+ std::cout << "child_status_callback(" << reason_str << ")\n";
+|*==========================================================================*/
+
+ if (reason == APR_OC_REASON_DEATH || reason == APR_OC_REASON_LOST)
+ {
+ // Somewhat oddly, APR requires that you explicitly unregister
+ // even when it already knows the child has terminated.
+ apr_proc_other_child_unregister(data);
+
+ WaitInfo* wi(static_cast<WaitInfo*>(data));
+ // It's just wrong to call apr_proc_wait() here. The only way APR
+ // knows to call us with APR_OC_REASON_DEATH is that it's already
+ // reaped this child process, so calling wait() will only produce
+ // "huh?" from the OS. We must rely on the status param passed in,
+ // which unfortunately comes straight from the OS wait() call.
+// wi->rv = apr_proc_wait(wi->child, &wi->rc, &wi->why, APR_NOWAIT);
+ wi->rv = APR_CHILD_DONE; // fake apr_proc_wait() results
+#if defined(LL_WINDOWS)
+ wi->why = APR_PROC_EXIT;
+ wi->rc = status; // no encoding on Windows (no signals)
+#else // Posix
+ if (WIFEXITED(status))
+ {
+ wi->why = APR_PROC_EXIT;
+ wi->rc = WEXITSTATUS(status);
+ }
+ else if (WIFSIGNALED(status))
+ {
+ wi->why = APR_PROC_SIGNAL;
+ wi->rc = WTERMSIG(status);
+ }
+ else // uh, shouldn't happen?
+ {
+ wi->why = APR_PROC_EXIT;
+ wi->rc = status; // someone else will have to decode
+ }
+#endif // Posix
+ }
+ }
+
+ template<> template<>
+ void object::test<1>()
+ {
+ set_test_name("raw APR nonblocking I/O");
+
+ // Create a script file in a temporary place.
+ NamedTempFile script("py",
+ "import sys" EOL
+ "import time" EOL
+ EOL
+ "time.sleep(2)" EOL
+ "print >>sys.stdout, 'stdout after wait'" EOL
+ "sys.stdout.flush()" EOL
+ "time.sleep(2)" EOL
+ "print >>sys.stderr, 'stderr after wait'" EOL
+ "sys.stderr.flush()" EOL
+ );
+
+ // Arrange to track the history of our interaction with child: what we
+ // fetched, which pipe it came from, how many tries it took before we
+ // got it.
+ std::vector<Item> history;
+ history.push_back(Item());
+
+ // Run the child process.
+ apr_procattr_t *procattr = NULL;
+ aprchk(apr_procattr_create(&procattr, pool.getAPRPool()));
+ aprchk(apr_procattr_io_set(procattr, APR_CHILD_BLOCK, APR_CHILD_BLOCK, APR_CHILD_BLOCK));
+ aprchk(apr_procattr_cmdtype_set(procattr, APR_PROGRAM_PATH));
+
+ std::vector<const char*> argv;
+ apr_proc_t child;
+ argv.push_back("python");
+ // Have to have a named copy of this std::string so its c_str() value
+ // will persist.
+ std::string scriptname(script.getName());
+ argv.push_back(scriptname.c_str());
+ argv.push_back(NULL);
+
+ aprchk(apr_proc_create(&child, argv[0],
+ &argv[0],
+ NULL, // if we wanted to pass explicit environment
+ procattr,
+ pool.getAPRPool()));
+
+ // We do not want this child process to outlive our APR pool. On
+ // destruction of the pool, forcibly kill the process. Tell APR to try
+ // SIGTERM and wait 3 seconds. If that didn't work, use SIGKILL.
+ apr_pool_note_subprocess(pool.getAPRPool(), &child, APR_KILL_AFTER_TIMEOUT);
+
+ // arrange to call child_status_callback()
+ WaitInfo wi(&child);
+ apr_proc_other_child_register(&child, child_status_callback, &wi, child.in, pool.getAPRPool());
+
+ // TODO:
+ // Stuff child.in until it (would) block to verify EWOULDBLOCK/EAGAIN.
+ // Have child script clear it later, then write one more line to prove
+ // that it gets through.
+
+ // Monitor two different output pipes. Because one will be closed
+ // before the other, keep them in a list so we can drop whichever of
+ // them is closed first.
+ typedef std::pair<std::string, apr_file_t*> DescFile;
+ typedef std::list<DescFile> DescFileList;
+ DescFileList outfiles;
+ outfiles.push_back(DescFile("out", child.out));
+ outfiles.push_back(DescFile("err", child.err));
+
+ while (! outfiles.empty())
+ {
+ // This peculiar for loop is designed to let us erase(dfli). With
+ // a list, that invalidates only dfli itself -- but even so, we
+ // lose the ability to increment it for the next item. So at the
+ // top of every loop, while dfli is still valid, increment
+ // dflnext. Then before the next iteration, set dfli to dflnext.
+ for (DescFileList::iterator
+ dfli(outfiles.begin()), dflnext(outfiles.begin()), dflend(outfiles.end());
+ dfli != dflend; dfli = dflnext)
+ {
+ // Only valid to increment dflnext once we're sure it's not
+ // already at dflend.
+ ++dflnext;
+
+ char buf[4096];
+
+ apr_status_t rv = apr_file_gets(buf, sizeof(buf), dfli->second);
+ if (APR_STATUS_IS_EOF(rv))
+ {
+// std::cout << "(EOF on " << dfli->first << ")\n";
+// history.back().which = dfli->first;
+// history.back().what = "*eof*";
+// history.push_back(Item());
+ outfiles.erase(dfli);
+ continue;
+ }
+ if (rv == EWOULDBLOCK || rv == EAGAIN)
+ {
+// std::cout << "(waiting; apr_file_gets(" << dfli->first << ") => " << rv << ": " << manager.strerror(rv) << ")\n";
+ ++history.back().tries;
+ continue;
+ }
+ aprchk_("apr_file_gets(buf, sizeof(buf), dfli->second)", rv);
+ // Is it even possible to get APR_SUCCESS but read 0 bytes?
+ // Hope not, but defend against that anyway.
+ if (buf[0])
+ {
+// std::cout << dfli->first << ": " << buf;
+ history.back().which = dfli->first;
+ history.back().what.append(buf);
+ if (buf[strlen(buf) - 1] == '\n')
+ history.push_back(Item());
+ else
+ {
+ // Just for pretty output... if we only read a partial
+ // line, terminate it.
+// std::cout << "...\n";
+ }
+ }
+ }
+ // Do this once per tick, as we expect the viewer will
+ apr_proc_other_child_refresh_all(APR_OC_REASON_RUNNING);
+ sleep(1);
+ }
+ apr_file_close(child.in);
+ apr_file_close(child.out);
+ apr_file_close(child.err);
+
+ // Okay, we've broken the loop because our pipes are all closed. If we
+ // haven't yet called wait, give the callback one more chance. This
+ // models the fact that unlike this small test program, the viewer
+ // will still be running.
+ if (wi.rv == -1)
+ {
+ std::cout << "last gasp apr_proc_other_child_refresh_all()\n";
+ apr_proc_other_child_refresh_all(APR_OC_REASON_RUNNING);
+ }
+
+ if (wi.rv == -1)
+ {
+ std::cout << "child_status_callback(APR_OC_REASON_DEATH) wasn't called" << std::endl;
+ wi.rv = apr_proc_wait(wi.child, &wi.rc, &wi.why, APR_NOWAIT);
+ }
+// std::cout << "child done: rv = " << rv << " (" << manager.strerror(rv) << "), why = " << why << ", rc = " << rc << '\n';
+ aprchk_("apr_proc_wait(wi->child, &wi->rc, &wi->why, APR_NOWAIT)", wi.rv, APR_CHILD_DONE);
+ ensure_equals_(wi.why, APR_PROC_EXIT);
+ ensure_equals_(wi.rc, 0);
+
+ // Beyond merely executing all the above successfully, verify that we
+ // obtained expected output -- and that we duly got control while
+ // waiting, proving the non-blocking nature of these pipes.
+ try
+ {
+ unsigned i = 0;
+ ensure("blocking I/O on child pipe (0)", history[i].tries);
+ ensure_equals_(history[i].which, "out");
+ ensure_equals_(history[i].what, "stdout after wait" EOL);
+// ++i;
+// ensure_equals_(history[i].which, "out");
+// ensure_equals_(history[i].what, "*eof*");
+ ++i;
+ ensure("blocking I/O on child pipe (1)", history[i].tries);
+ ensure_equals_(history[i].which, "err");
+ ensure_equals_(history[i].what, "stderr after wait" EOL);
+// ++i;
+// ensure_equals_(history[i].which, "err");
+// ensure_equals_(history[i].what, "*eof*");
+ }
+ catch (const failure&)
+ {
+ std::cout << "History:\n";
+ BOOST_FOREACH(const Item& item, history)
+ {
+ std::string what(item.what);
+ if ((! what.empty()) && what[what.length() - 1] == '\n')
+ {
+ what.erase(what.length() - 1);
+ if ((! what.empty()) && what[what.length() - 1] == '\r')
+ {
+ what.erase(what.length() - 1);
+ what.append("\\r");
+ }
+ what.append("\\n");
+ }
+ std::cout << " " << item.which << ": '" << what << "' ("
+ << item.tries << " tries)\n";
+ }
+ std::cout << std::flush;
+ // re-raise same error; just want to enrich the output
+ throw;
+ }
+ }
+
+ template<> template<>
+ void object::test<2>()
+ {
+ set_test_name("setWorkingDirectory()");
+ // We want to test setWorkingDirectory(). But what directory is
+ // guaranteed to exist on every machine, under every OS? Have to
+ // create one. Naturally, ensure we clean it up when done.
+ NamedTempDir tempdir;
+ PythonProcessLauncher py(get_test_name(),
+ "from __future__ import with_statement\n"
+ "import os, sys\n"
+ "with open(sys.argv[1], 'w') as f:\n"
+ " f.write(os.path.normcase(os.path.normpath(os.getcwd())))\n");
+ // Before running, call setWorkingDirectory()
+ py.mParams.cwd = tempdir.getName();
+ ensure_equals("os.getcwd()", py.run_read(), tempdir.getName());
+ }
+
+ template<> template<>
+ void object::test<3>()
+ {
+ set_test_name("arguments");
+ PythonProcessLauncher py(get_test_name(),
+ "from __future__ import with_statement\n"
+ "import sys\n"
+ // note nonstandard output-file arg!
+ "with open(sys.argv[3], 'w') as f:\n"
+ " for arg in sys.argv[1:]:\n"
+ " print >>f, arg\n");
+ // We expect that PythonProcessLauncher has already appended
+ // its own NamedTempFile to mParams.args (sys.argv[0]).
+ py.mParams.args.add("first arg"); // sys.argv[1]
+ py.mParams.args.add("second arg"); // sys.argv[2]
+ // run_read() appends() one more argument, hence [3]
+ std::string output(py.run_read());
+ boost::split_iterator<std::string::const_iterator>
+ li(output, boost::first_finder("\n")), lend;
+ ensure("didn't get first arg", li != lend);
+ std::string arg(li->begin(), li->end());
+ ensure_equals(arg, "first arg");
+ ++li;
+ ensure("didn't get second arg", li != lend);
+ arg.assign(li->begin(), li->end());
+ ensure_equals(arg, "second arg");
+ ++li;
+ ensure("didn't get output filename?!", li != lend);
+ arg.assign(li->begin(), li->end());
+ ensure("output filename empty?!", ! arg.empty());
+ ++li;
+ ensure("too many args", li == lend);
+ }
+
+ template<> template<>
+ void object::test<4>()
+ {
+ set_test_name("exit(0)");
+ PythonProcessLauncher py(get_test_name(),
+ "import sys\n"
+ "sys.exit(0)\n");
+ py.run();
+ ensure_equals("Status.mState", py.mPy->getStatus().mState, LLProcess::EXITED);
+ ensure_equals("Status.mData", py.mPy->getStatus().mData, 0);
+ }
+
+ template<> template<>
+ void object::test<5>()
+ {
+ set_test_name("exit(2)");
+ PythonProcessLauncher py(get_test_name(),
+ "import sys\n"
+ "sys.exit(2)\n");
+ py.run();
+ ensure_equals("Status.mState", py.mPy->getStatus().mState, LLProcess::EXITED);
+ ensure_equals("Status.mData", py.mPy->getStatus().mData, 2);
+ }
+
+ template<> template<>
+ void object::test<6>()
+ {
+ set_test_name("syntax_error:");
+ PythonProcessLauncher py(get_test_name(),
+ "syntax_error:\n");
+ py.mParams.files.add(LLProcess::FileParam()); // inherit stdin
+ py.mParams.files.add(LLProcess::FileParam()); // inherit stdout
+ py.mParams.files.add(LLProcess::FileParam().type("pipe")); // pipe for stderr
+ py.run();
+ ensure_equals("Status.mState", py.mPy->getStatus().mState, LLProcess::EXITED);
+ ensure_equals("Status.mData", py.mPy->getStatus().mData, 1);
+ std::istream& rpipe(py.mPy->getReadPipe(LLProcess::STDERR).get_istream());
+ std::vector<char> buffer(4096);
+ rpipe.read(&buffer[0], buffer.size());
+ std::streamsize got(rpipe.gcount());
+ ensure("Nothing read from stderr pipe", got);
+ std::string data(&buffer[0], got);
+ ensure("Didn't find 'SyntaxError:'", data.find("\nSyntaxError:") != std::string::npos);
+ }
+
+ template<> template<>
+ void object::test<7>()
+ {
+ set_test_name("explicit kill()");
+ PythonProcessLauncher py(get_test_name(),
+ "from __future__ import with_statement\n"
+ "import sys, time\n"
+ "with open(sys.argv[1], 'w') as f:\n"
+ " f.write('ok')\n"
+ "# now sleep; expect caller to kill\n"
+ "time.sleep(120)\n"
+ "# if caller hasn't managed to kill by now, bad\n"
+ "with open(sys.argv[1], 'w') as f:\n"
+ " f.write('bad')\n");
+ NamedTempFile out("out", "not started");
+ py.mParams.args.add(out.getName());
+ py.launch();
+ // Wait for the script to wake up and do its first write
+ int i = 0, timeout = 60;
+ for ( ; i < timeout; ++i)
+ {
+ yield();
+ if (readfile(out.getName(), "from kill() script") == "ok")
+ break;
+ }
+ // If we broke this loop because of the counter, something's wrong
+ ensure("script never started", i < timeout);
+ // script has performed its first write and should now be sleeping.
+ py.mPy->kill();
+ // wait for the script to terminate... one way or another.
+ waitfor(*py.mPy);
+#if LL_WINDOWS
+ ensure_equals("Status.mState", py.mPy->getStatus().mState, LLProcess::EXITED);
+ ensure_equals("Status.mData", py.mPy->getStatus().mData, -1);
+#else
+ ensure_equals("Status.mState", py.mPy->getStatus().mState, LLProcess::KILLED);
+ ensure_equals("Status.mData", py.mPy->getStatus().mData, SIGTERM);
+#endif
+ // If kill() failed, the script would have woken up on its own and
+ // overwritten the file with 'bad'. But if kill() succeeded, it should
+ // not have had that chance.
+ ensure_equals(get_test_name() + " script output", readfile(out.getName()), "ok");
+ }
+
+ template<> template<>
+ void object::test<8>()
+ {
+ set_test_name("implicit kill()");
+ NamedTempFile out("out", "not started");
+ LLProcess::handle phandle(0);
+ {
+ PythonProcessLauncher py(get_test_name(),
+ "from __future__ import with_statement\n"
+ "import sys, time\n"
+ "with open(sys.argv[1], 'w') as f:\n"
+ " f.write('ok')\n"
+ "# now sleep; expect caller to kill\n"
+ "time.sleep(120)\n"
+ "# if caller hasn't managed to kill by now, bad\n"
+ "with open(sys.argv[1], 'w') as f:\n"
+ " f.write('bad')\n");
+ py.mParams.args.add(out.getName());
+ py.launch();
+ // Capture handle for later
+ phandle = py.mPy->getProcessHandle();
+ // Wait for the script to wake up and do its first write
+ int i = 0, timeout = 60;
+ for ( ; i < timeout; ++i)
+ {
+ yield();
+ if (readfile(out.getName(), "from kill() script") == "ok")
+ break;
+ }
+ // If we broke this loop because of the counter, something's wrong
+ ensure("script never started", i < timeout);
+ // Script has performed its first write and should now be sleeping.
+ // Destroy the LLProcess, which should kill the child.
+ }
+ // wait for the script to terminate... one way or another.
+ waitfor(phandle, "kill() script");
+ // If kill() failed, the script would have woken up on its own and
+ // overwritten the file with 'bad'. But if kill() succeeded, it should
+ // not have had that chance.
+ ensure_equals(get_test_name() + " script output", readfile(out.getName()), "ok");
+ }
+
+ template<> template<>
+ void object::test<9>()
+ {
+ set_test_name("autokill=false");
+ NamedTempFile from("from", "not started");
+ NamedTempFile to("to", "");
+ LLProcess::handle phandle(0);
+ {
+ PythonProcessLauncher py(get_test_name(),
+ "from __future__ import with_statement\n"
+ "import sys, time\n"
+ "with open(sys.argv[1], 'w') as f:\n"
+ " f.write('ok')\n"
+ "# wait for 'go' from test program\n"
+ "for i in xrange(60):\n"
+ " time.sleep(1)\n"
+ " with open(sys.argv[2]) as f:\n"
+ " go = f.read()\n"
+ " if go == 'go':\n"
+ " break\n"
+ "else:\n"
+ " with open(sys.argv[1], 'w') as f:\n"
+ " f.write('never saw go')\n"
+ " sys.exit(1)\n"
+ "# okay, saw 'go', write 'ack'\n"
+ "with open(sys.argv[1], 'w') as f:\n"
+ " f.write('ack')\n");
+ py.mParams.args.add(from.getName());
+ py.mParams.args.add(to.getName());
+ py.mParams.autokill = false;
+ py.launch();
+ // Capture handle for later
+ phandle = py.mPy->getProcessHandle();
+ // Wait for the script to wake up and do its first write
+ int i = 0, timeout = 60;
+ for ( ; i < timeout; ++i)
+ {
+ yield();
+ if (readfile(from.getName(), "from autokill script") == "ok")
+ break;
+ }
+ // If we broke this loop because of the counter, something's wrong
+ ensure("script never started", i < timeout);
+ // Now destroy the LLProcess, which should NOT kill the child!
+ }
+ // If the destructor killed the child anyway, give it time to die
+ yield(2);
+ // How do we know it's not terminated? By making it respond to
+ // a specific stimulus in a specific way.
+ {
+ std::ofstream outf(to.getName().c_str());
+ outf << "go";
+ } // flush and close.
+ // now wait for the script to terminate... one way or another.
+ waitfor(phandle, "autokill script");
+ // If the LLProcess destructor implicitly called kill(), the
+ // script could not have written 'ack' as we expect.
+ ensure_equals(get_test_name() + " script output", readfile(from.getName()), "ack");
+ }
+
+ template<> template<>
+ void object::test<10>()
+ {
+ set_test_name("'bogus' test");
+ CaptureLog recorder;
+ PythonProcessLauncher py(get_test_name(),
+ "print 'Hello world'\n");
+ py.mParams.files.add(LLProcess::FileParam("bogus"));
+ py.mPy = LLProcess::create(py.mParams);
+ ensure("should have rejected 'bogus'", ! py.mPy);
+ std::string message(recorder.messageWith("bogus"));
+ ensure_contains("did not name 'stdin'", message, "stdin");
+ }
+
+ template<> template<>
+ void object::test<11>()
+ {
+ set_test_name("'file' test");
+ // Replace this test with one or more real 'file' tests when we
+ // implement 'file' support
+ PythonProcessLauncher py(get_test_name(),
+ "print 'Hello world'\n");
+ py.mParams.files.add(LLProcess::FileParam());
+ py.mParams.files.add(LLProcess::FileParam("file"));
+ py.mPy = LLProcess::create(py.mParams);
+ ensure("should have rejected 'file'", ! py.mPy);
+ }
+
+ template<> template<>
+ void object::test<12>()
+ {
+ set_test_name("'tpipe' test");
+ // Replace this test with one or more real 'tpipe' tests when we
+ // implement 'tpipe' support
+ CaptureLog recorder;
+ PythonProcessLauncher py(get_test_name(),
+ "print 'Hello world'\n");
+ py.mParams.files.add(LLProcess::FileParam());
+ py.mParams.files.add(LLProcess::FileParam("tpipe"));
+ py.mPy = LLProcess::create(py.mParams);
+ ensure("should have rejected 'tpipe'", ! py.mPy);
+ std::string message(recorder.messageWith("tpipe"));
+ ensure_contains("did not name 'stdout'", message, "stdout");
+ }
+
+ template<> template<>
+ void object::test<13>()
+ {
+ set_test_name("'npipe' test");
+ // Replace this test with one or more real 'npipe' tests when we
+ // implement 'npipe' support
+ CaptureLog recorder;
+ PythonProcessLauncher py(get_test_name(),
+ "print 'Hello world'\n");
+ py.mParams.files.add(LLProcess::FileParam());
+ py.mParams.files.add(LLProcess::FileParam());
+ py.mParams.files.add(LLProcess::FileParam("npipe"));
+ py.mPy = LLProcess::create(py.mParams);
+ ensure("should have rejected 'npipe'", ! py.mPy);
+ std::string message(recorder.messageWith("npipe"));
+ ensure_contains("did not name 'stderr'", message, "stderr");
+ }
+
+ template<> template<>
+ void object::test<14>()
+ {
+ set_test_name("internal pipe name warning");
+ CaptureLog recorder;
+ PythonProcessLauncher py(get_test_name(),
+ "import sys\n"
+ "sys.exit(7)\n");
+ py.mParams.files.add(LLProcess::FileParam("pipe", "somename"));
+ py.run(); // verify that it did launch anyway
+ ensure_equals("Status.mState", py.mPy->getStatus().mState, LLProcess::EXITED);
+ ensure_equals("Status.mData", py.mPy->getStatus().mData, 7);
+ std::string message(recorder.messageWith("not yet supported"));
+ ensure_contains("log message did not mention internal pipe name",
+ message, "somename");
+ }
+
+ /*-------------- support for "get*Pipe() validation" test --------------*/
+#define TEST_getPipe(PROCESS, GETPIPE, GETOPTPIPE, VALID, NOPIPE, BADPIPE) \
+ do \
+ { \
+ std::string threw; \
+ /* Both the following calls should work. */ \
+ (PROCESS).GETPIPE(VALID); \
+ ensure(#GETOPTPIPE "(" #VALID ") failed", (PROCESS).GETOPTPIPE(VALID)); \
+ /* pass obviously bogus PIPESLOT */ \
+ CATCH_IN(threw, LLProcess::NoPipe, (PROCESS).GETPIPE(LLProcess::FILESLOT(4))); \
+ ensure_contains("didn't reject bad slot", threw, "no slot"); \
+ ensure_contains("didn't mention bad slot num", threw, "4"); \
+ EXPECT_FAIL_WITH_LOG(threw, (PROCESS).GETOPTPIPE(LLProcess::FILESLOT(4))); \
+ /* pass NOPIPE */ \
+ CATCH_IN(threw, LLProcess::NoPipe, (PROCESS).GETPIPE(NOPIPE)); \
+ ensure_contains("didn't reject non-pipe", threw, "not a monitored"); \
+ EXPECT_FAIL_WITH_LOG(threw, (PROCESS).GETOPTPIPE(NOPIPE)); \
+ /* pass BADPIPE: FILESLOT isn't empty but wrong direction */ \
+ CATCH_IN(threw, LLProcess::NoPipe, (PROCESS).GETPIPE(BADPIPE)); \
+ /* sneaky: GETPIPE is getReadPipe or getWritePipe */ \
+ /* so skip "get" to obtain ReadPipe or WritePipe :-P */ \
+ ensure_contains("didn't reject wrong pipe", threw, (#GETPIPE)+3); \
+ EXPECT_FAIL_WITH_LOG(threw, (PROCESS).GETOPTPIPE(BADPIPE)); \
+ } while (0)
+
+/// For expecting exceptions. Execute CODE, catch EXCEPTION, store its what()
+/// in std::string THREW, ensure it's not empty (i.e. EXCEPTION did happen).
+#define CATCH_IN(THREW, EXCEPTION, CODE) \
+ do \
+ { \
+ (THREW).clear(); \
+ try \
+ { \
+ CODE; \
+ } \
+ CATCH_AND_STORE_WHAT_IN(THREW, EXCEPTION) \
+ ensure("failed to throw " #EXCEPTION ": " #CODE, ! (THREW).empty()); \
+ } while (0)
+
+#define EXPECT_FAIL_WITH_LOG(EXPECT, CODE) \
+ do \
+ { \
+ CaptureLog recorder; \
+ ensure(#CODE " succeeded", ! (CODE)); \
+ recorder.messageWith(EXPECT); \
+ } while (0)
+
+ template<> template<>
+ void object::test<15>()
+ {
+ set_test_name("get*Pipe() validation");
+ PythonProcessLauncher py(get_test_name(),
+ "print 'this output is expected'\n");
+ py.mParams.files.add(LLProcess::FileParam("pipe")); // pipe for stdin
+ py.mParams.files.add(LLProcess::FileParam()); // inherit stdout
+ py.mParams.files.add(LLProcess::FileParam("pipe")); // pipe for stderr
+ py.run();
+ TEST_getPipe(*py.mPy, getWritePipe, getOptWritePipe,
+ LLProcess::STDIN, // VALID
+ LLProcess::STDOUT, // NOPIPE
+ LLProcess::STDERR); // BADPIPE
+ TEST_getPipe(*py.mPy, getReadPipe, getOptReadPipe,
+ LLProcess::STDERR, // VALID
+ LLProcess::STDOUT, // NOPIPE
+ LLProcess::STDIN); // BADPIPE
+ }
+
+ template<> template<>
+ void object::test<16>()
+ {
+ set_test_name("talk to stdin/stdout");
+ PythonProcessLauncher py(get_test_name(),
+ "import sys, time\n"
+ "print 'ok'\n"
+ "sys.stdout.flush()\n"
+ "# wait for 'go' from test program\n"
+ "go = sys.stdin.readline()\n"
+ "if go != 'go\\n':\n"
+ " sys.exit('expected \"go\", saw %r' % go)\n"
+ "print 'ack'\n");
+ py.mParams.files.add(LLProcess::FileParam("pipe")); // stdin
+ py.mParams.files.add(LLProcess::FileParam("pipe")); // stdout
+ py.launch();
+ LLProcess::ReadPipe& childout(py.mPy->getReadPipe(LLProcess::STDOUT));
+ int i, timeout = 60;
+ for (i = 0; i < timeout && py.mPy->isRunning() && childout.size() < 3; ++i)
+ {
+ yield();
+ }
+ ensure("script never started", i < timeout);
+ ensure_equals("bad wakeup from stdin/stdout script",
+ childout.getline(), "ok");
+ // important to get the implicit flush from std::endl
+ py.mPy->getWritePipe().get_ostream() << "go" << std::endl;
+ for (i = 0; i < timeout && py.mPy->isRunning() && ! childout.contains("\n"); ++i)
+ {
+ yield();
+ }
+ ensure("script never replied", childout.contains("\n"));
+ ensure_equals("child didn't ack", childout.getline(), "ack");
+ ensure_equals("bad child termination", py.mPy->getStatus().mState, LLProcess::EXITED);
+ ensure_equals("bad child exit code", py.mPy->getStatus().mData, 0);
+ }
+
+ struct EventListener: public boost::noncopyable
+ {
+ EventListener(LLEventPump& pump)
+ {
+ mConnection =
+ pump.listen("EventListener", boost::bind(&EventListener::tick, this, _1));
+ }
+
+ bool tick(const LLSD& data)
+ {
+ mHistory.push_back(data);
+ return false;
+ }
+
+ std::list<LLSD> mHistory;
+ LLTempBoundListener mConnection;
+ };
+
+ static bool ack(std::ostream& out, const LLSD& data)
+ {
+ out << "continue" << std::endl;
+ return false;
+ }
+
+ template<> template<>
+ void object::test<17>()
+ {
+ set_test_name("listen for ReadPipe events");
+ PythonProcessLauncher py(get_test_name(),
+ "import sys\n"
+ "sys.stdout.write('abc')\n"
+ "sys.stdout.flush()\n"
+ "sys.stdin.readline()\n"
+ "sys.stdout.write('def')\n"
+ "sys.stdout.flush()\n"
+ "sys.stdin.readline()\n"
+ "sys.stdout.write('ghi\\n')\n"
+ "sys.stdout.flush()\n"
+ "sys.stdin.readline()\n"
+ "sys.stdout.write('second line\\n')\n");
+ py.mParams.files.add(LLProcess::FileParam("pipe")); // stdin
+ py.mParams.files.add(LLProcess::FileParam("pipe")); // stdout
+ py.launch();
+ std::ostream& childin(py.mPy->getWritePipe(LLProcess::STDIN).get_ostream());
+ LLProcess::ReadPipe& childout(py.mPy->getReadPipe(LLProcess::STDOUT));
+ // lift the default limit; allow event to carry (some of) the actual data
+ childout.setLimit(20);
+ // listen for incoming data on childout
+ EventListener listener(childout.getPump());
+ // also listen with a function that prompts the child to continue
+ // every time we see output
+ LLTempBoundListener connection(
+ childout.getPump().listen("ack", boost::bind(ack, boost::ref(childin), _1)));
+ int i, timeout = 60;
+ // wait through stuttering first line
+ for (i = 0; i < timeout && py.mPy->isRunning() && ! childout.contains("\n"); ++i)
+ {
+ yield();
+ }
+ ensure("couldn't get first line", i < timeout);
+ // disconnect from listener
+ listener.mConnection.disconnect();
+ // finish out the run
+ waitfor(*py.mPy);
+ // now verify history
+ std::list<LLSD>::const_iterator li(listener.mHistory.begin()),
+ lend(listener.mHistory.end());
+ ensure("no events", li != lend);
+ ensure_equals("history[0]", (*li)["data"].asString(), "abc");
+ ensure_equals("history[0] len", (*li)["len"].asInteger(), 3);
+ ++li;
+ ensure("only 1 event", li != lend);
+ ensure_equals("history[1]", (*li)["data"].asString(), "abcdef");
+ ensure_equals("history[0] len", (*li)["len"].asInteger(), 6);
+ ++li;
+ ensure("only 2 events", li != lend);
+ ensure_equals("history[2]", (*li)["data"].asString(), "abcdefghi" EOL);
+ ensure_equals("history[0] len", (*li)["len"].asInteger(), 9 + sizeof(EOL) - 1);
+ ++li;
+ // We DO NOT expect a whole new event for the second line because we
+ // disconnected.
+ ensure("more than 3 events", li == lend);
+ }
+
+ template<> template<>
+ void object::test<18>()
+ {
+ set_test_name("ReadPipe \"eof\" event");
+ PythonProcessLauncher py(get_test_name(),
+ "print 'Hello from Python!'\n");
+ py.mParams.files.add(LLProcess::FileParam()); // stdin
+ py.mParams.files.add(LLProcess::FileParam("pipe")); // stdout
+ py.launch();
+ LLProcess::ReadPipe& childout(py.mPy->getReadPipe(LLProcess::STDOUT));
+ EventListener listener(childout.getPump());
+ waitfor(*py.mPy);
+ // We can't be positive there will only be a single event, if the OS
+ // (or any other intervening layer) does crazy buffering. What we want
+ // to ensure is that there was exactly ONE event with "eof" true, and
+ // that it was the LAST event.
+ std::list<LLSD>::const_reverse_iterator rli(listener.mHistory.rbegin()),
+ rlend(listener.mHistory.rend());
+ ensure("no events", rli != rlend);
+ ensure("last event not \"eof\"", (*rli)["eof"].asBoolean());
+ while (++rli != rlend)
+ {
+ ensure("\"eof\" event not last", ! (*rli)["eof"].asBoolean());
+ }
+ }
+
+ template<> template<>
+ void object::test<19>()
+ {
+ set_test_name("setLimit()");
+ PythonProcessLauncher py(get_test_name(),
+ "import sys\n"
+ "sys.stdout.write(sys.argv[1])\n");
+ std::string abc("abcdefghijklmnopqrstuvwxyz");
+ py.mParams.args.add(abc);
+ py.mParams.files.add(LLProcess::FileParam()); // stdin
+ py.mParams.files.add(LLProcess::FileParam("pipe")); // stdout
+ py.launch();
+ LLProcess::ReadPipe& childout(py.mPy->getReadPipe(LLProcess::STDOUT));
+ // listen for incoming data on childout
+ EventListener listener(childout.getPump());
+ // but set limit
+ childout.setLimit(10);
+ ensure_equals("getLimit() after setlimit(10)", childout.getLimit(), 10);
+ // okay, pump I/O to pick up output from child
+ waitfor(*py.mPy);
+ ensure("no events", ! listener.mHistory.empty());
+ // For all we know, that data could have arrived in several different
+ // bursts... probably not, but anyway, only check the last one.
+ ensure_equals("event[\"len\"]",
+ listener.mHistory.back()["len"].asInteger(), abc.length());
+ ensure_equals("length of setLimit(10) data",
+ listener.mHistory.back()["data"].asString().length(), 10);
+ }
+
+ template<> template<>
+ void object::test<20>()
+ {
+ set_test_name("peek() ReadPipe data");
+ PythonProcessLauncher py(get_test_name(),
+ "import sys\n"
+ "sys.stdout.write(sys.argv[1])\n");
+ std::string abc("abcdefghijklmnopqrstuvwxyz");
+ py.mParams.args.add(abc);
+ py.mParams.files.add(LLProcess::FileParam()); // stdin
+ py.mParams.files.add(LLProcess::FileParam("pipe")); // stdout
+ py.launch();
+ LLProcess::ReadPipe& childout(py.mPy->getReadPipe(LLProcess::STDOUT));
+ // okay, pump I/O to pick up output from child
+ waitfor(*py.mPy);
+ // peek() with substr args
+ ensure_equals("peek()", childout.peek(), abc);
+ ensure_equals("peek(23)", childout.peek(23), abc.substr(23));
+ ensure_equals("peek(5, 3)", childout.peek(5, 3), abc.substr(5, 3));
+ ensure_equals("peek(27, 2)", childout.peek(27, 2), "");
+ ensure_equals("peek(23, 5)", childout.peek(23, 5), "xyz");
+ // contains() -- we don't exercise as thoroughly as find() because the
+ // contains() implementation is trivially (and visibly) based on find()
+ ensure("contains(\":\")", ! childout.contains(":"));
+ ensure("contains(':')", ! childout.contains(':'));
+ ensure("contains(\"d\")", childout.contains("d"));
+ ensure("contains('d')", childout.contains('d'));
+ ensure("contains(\"klm\")", childout.contains("klm"));
+ ensure("contains(\"klx\")", ! childout.contains("klx"));
+ // find()
+ ensure("find(\":\")", childout.find(":") == LLProcess::ReadPipe::npos);
+ ensure("find(':')", childout.find(':') == LLProcess::ReadPipe::npos);
+ ensure_equals("find(\"d\")", childout.find("d"), 3);
+ ensure_equals("find('d')", childout.find('d'), 3);
+ ensure_equals("find(\"d\", 3)", childout.find("d", 3), 3);
+ ensure_equals("find('d', 3)", childout.find('d', 3), 3);
+ ensure("find(\"d\", 4)", childout.find("d", 4) == LLProcess::ReadPipe::npos);
+ ensure("find('d', 4)", childout.find('d', 4) == LLProcess::ReadPipe::npos);
+ // The case of offset == end and offset > end are different. In the
+ // first case, we can form a valid (albeit empty) iterator range and
+ // search that. In the second, guard logic in the implementation must
+ // realize we can't form a valid iterator range.
+ ensure("find(\"d\", 26)", childout.find("d", 26) == LLProcess::ReadPipe::npos);
+ ensure("find('d', 26)", childout.find('d', 26) == LLProcess::ReadPipe::npos);
+ ensure("find(\"d\", 27)", childout.find("d", 27) == LLProcess::ReadPipe::npos);
+ ensure("find('d', 27)", childout.find('d', 27) == LLProcess::ReadPipe::npos);
+ ensure_equals("find(\"ghi\")", childout.find("ghi"), 6);
+ ensure_equals("find(\"ghi\", 6)", childout.find("ghi"), 6);
+ ensure("find(\"ghi\", 7)", childout.find("ghi", 7) == LLProcess::ReadPipe::npos);
+ ensure("find(\"ghi\", 26)", childout.find("ghi", 26) == LLProcess::ReadPipe::npos);
+ ensure("find(\"ghi\", 27)", childout.find("ghi", 27) == LLProcess::ReadPipe::npos);
+ }
+
+ template<> template<>
+ void object::test<21>()
+ {
+ set_test_name("bad postend");
+ std::string pumpname("postend");
+ EventListener listener(LLEventPumps::instance().obtain(pumpname));
+ LLProcess::Params params;
+ params.desc = get_test_name();
+ params.postend = pumpname;
+ LLProcessPtr child = LLProcess::create(params);
+ ensure("shouldn't have launched", ! child);
+ ensure_equals("number of postend events", listener.mHistory.size(), 1);
+ LLSD postend(listener.mHistory.front());
+ ensure("has id", ! postend.has("id"));
+ ensure_equals("desc", postend["desc"].asString(), std::string(params.desc));
+ ensure_equals("state", postend["state"].asInteger(), LLProcess::UNSTARTED);
+ ensure("has data", ! postend.has("data"));
+ std::string error(postend["string"]);
+ // All we get from canned parameter validation is a bool, so the
+ // "validation failed" message we ourselves generate can't mention
+ // "executable" by name. Just check that it's nonempty.
+ //ensure_contains("error", error, "executable");
+ ensure("string", ! error.empty());
+ }
+
+ template<> template<>
+ void object::test<22>()
+ {
+ set_test_name("good postend");
+ PythonProcessLauncher py(get_test_name(),
+ "import sys\n"
+ "sys.exit(35)\n");
+ std::string pumpname("postend");
+ EventListener listener(LLEventPumps::instance().obtain(pumpname));
+ py.mParams.postend = pumpname;
+ py.launch();
+ LLProcess::id childid(py.mPy->getProcessID());
+ // Don't use waitfor(), which calls isRunning(); instead wait for an
+ // event on pumpname.
+ int i, timeout = 60;
+ for (i = 0; i < timeout && listener.mHistory.empty(); ++i)
+ {
+ yield();
+ }
+ ensure("no postend event", i < timeout);
+ ensure_equals("number of postend events", listener.mHistory.size(), 1);
+ LLSD postend(listener.mHistory.front());
+ ensure_equals("id", postend["id"].asInteger(), childid);
+ ensure("desc empty", ! postend["desc"].asString().empty());
+ ensure_equals("state", postend["state"].asInteger(), LLProcess::EXITED);
+ ensure_equals("data", postend["data"].asInteger(), 35);
+ std::string str(postend["string"]);
+ ensure_contains("string", str, "exited");
+ ensure_contains("string", str, "35");
+ }
+
+ struct PostendListener
+ {
+ PostendListener(LLProcess::ReadPipe& rpipe,
+ const std::string& pumpname,
+ const std::string& expect):
+ mReadPipe(rpipe),
+ mExpect(expect),
+ mTriggered(false)
+ {
+ LLEventPumps::instance().obtain(pumpname)
+ .listen("PostendListener", boost::bind(&PostendListener::postend, this, _1));
+ }
+
+ bool postend(const LLSD&)
+ {
+ mTriggered = true;
+ ensure_equals("postend listener", mReadPipe.read(mReadPipe.size()), mExpect);
+ return false;
+ }
+
+ LLProcess::ReadPipe& mReadPipe;
+ std::string mExpect;
+ bool mTriggered;
+ };
+
+ template<> template<>
+ void object::test<23>()
+ {
+ set_test_name("all data visible at postend");
+ PythonProcessLauncher py(get_test_name(),
+ "import sys\n"
+ // note, no '\n' in written data
+ "sys.stdout.write('partial line')\n");
+ std::string pumpname("postend");
+ py.mParams.files.add(LLProcess::FileParam()); // stdin
+ py.mParams.files.add(LLProcess::FileParam("pipe")); // stdout
+ py.mParams.postend = pumpname;
+ py.launch();
+ PostendListener listener(py.mPy->getReadPipe(LLProcess::STDOUT),
+ pumpname,
+ "partial line");
+ waitfor(*py.mPy);
+ ensure("postend never triggered", listener.mTriggered);
+ }
+} // namespace tut
diff --git a/indra/llcommon/tests/llsdserialize_test.cpp b/indra/llcommon/tests/llsdserialize_test.cpp
index 72322c3b72..e625545763 100644
--- a/indra/llcommon/tests/llsdserialize_test.cpp
+++ b/indra/llcommon/tests/llsdserialize_test.cpp
@@ -40,41 +40,15 @@ typedef U32 uint32_t;
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/wait.h>
-#include "llprocesslauncher.h"
+#include "llprocess.h"
#endif
-#include <sstream>
-
-/*==========================================================================*|
-// Whoops, seems Linden's Boost package and the viewer are built with
-// different settings of VC's /Zc:wchar_t switch! Using Boost.Filesystem
-// pathname operations produces Windows link errors:
-// unresolved external symbol "private: static class std::codecvt<unsigned short,
-// char,int> const * & __cdecl boost::filesystem3::path::wchar_t_codecvt_facet()"
-// unresolved external symbol "void __cdecl boost::filesystem3::path_traits::convert()"
-// See:
-// http://boost.2283326.n4.nabble.com/filesystem-v3-unicode-and-std-codecvt-linker-error-td3455549.html
-// which points to:
-// http://msdn.microsoft.com/en-us/library/dh8che7s%28v=VS.100%29.aspx
-
-// As we're not trying to preserve compatibility with old Boost.Filesystem
-// code, but rather writing brand-new code, use the newest available
-// Filesystem API.
-#define BOOST_FILESYSTEM_VERSION 3
-#include "boost/filesystem.hpp"
-#include "boost/filesystem/v3/fstream.hpp"
-|*==========================================================================*/
#include "boost/range.hpp"
#include "boost/foreach.hpp"
#include "boost/function.hpp"
#include "boost/lambda/lambda.hpp"
#include "boost/lambda/bind.hpp"
namespace lambda = boost::lambda;
-/*==========================================================================*|
-// Aaaarrgh, Linden's Boost package doesn't even include Boost.Iostreams!
-#include "boost/iostreams/stream.hpp"
-#include "boost/iostreams/device/file_descriptor.hpp"
-|*==========================================================================*/
#include "../llsd.h"
#include "../llsdserialize.h"
@@ -82,236 +56,17 @@ namespace lambda = boost::lambda;
#include "../llformat.h"
#include "../test/lltut.h"
+#include "../test/manageapr.h"
+#include "../test/namedtempfile.h"
#include "stringize.h"
+static ManageAPR manager;
+
std::vector<U8> string_to_vector(const std::string& str)
{
return std::vector<U8>(str.begin(), str.end());
}
-#if ! LL_WINDOWS
-// We want to call strerror_r(), but alarmingly, there are two different
-// variants. The one that returns int always populates the passed buffer
-// (except in case of error), whereas the other one always returns a valid
-// char* but might or might not populate the passed buffer. How do we know
-// which one we're getting? Define adapters for each and let the compiler
-// select the applicable adapter.
-
-// strerror_r() returns char*
-std::string message_from(int /*orig_errno*/, const char* /*buffer*/, const char* strerror_ret)
-{
- return strerror_ret;
-}
-
-// strerror_r() returns int
-std::string message_from(int orig_errno, const char* buffer, int strerror_ret)
-{
- if (strerror_ret == 0)
- {
- return buffer;
- }
- // Here strerror_r() has set errno. Since strerror_r() has already failed,
- // seems like a poor bet to call it again to diagnose its own error...
- int stre_errno = errno;
- if (stre_errno == ERANGE)
- {
- return STRINGIZE("strerror_r() can't explain errno " << orig_errno
- << " (buffer too small)");
- }
- if (stre_errno == EINVAL)
- {
- return STRINGIZE("unknown errno " << orig_errno);
- }
- // Here we don't even understand the errno from strerror_r()!
- return STRINGIZE("strerror_r() can't explain errno " << orig_errno
- << " (error " << stre_errno << ')');
-}
-#endif // ! LL_WINDOWS
-
-// boost::filesystem::temp_directory_path() isn't yet in Boost 1.45! :-(
-std::string temp_directory_path()
-{
-#if LL_WINDOWS
- char buffer[4096];
- GetTempPathA(sizeof(buffer), buffer);
- return buffer;
-
-#else // LL_DARWIN, LL_LINUX
- static const char* vars[] = { "TMPDIR", "TMP", "TEMP", "TEMPDIR" };
- BOOST_FOREACH(const char* var, vars)
- {
- const char* found = getenv(var);
- if (found)
- return found;
- }
- return "/tmp";
-#endif // LL_DARWIN, LL_LINUX
-}
-
-// Windows presents a kinda sorta compatibility layer. Code to the yucky
-// Windows names because they're less likely than the Posix names to collide
-// with any other names in this source.
-#if LL_WINDOWS
-#define _remove DeleteFileA
-#else // ! LL_WINDOWS
-#define _open open
-#define _write write
-#define _close close
-#define _remove remove
-#endif // ! LL_WINDOWS
-
-// Create a text file with specified content "somewhere in the
-// filesystem," cleaning up when it goes out of scope.
-class NamedTempFile
-{
-public:
- // Function that accepts an ostream ref and (presumably) writes stuff to
- // it, e.g.:
- // (lambda::_1 << "the value is " << 17 << '\n')
- typedef boost::function<void(std::ostream&)> Streamer;
-
- NamedTempFile(const std::string& ext, const std::string& content):
- mPath(temp_directory_path())
- {
- createFile(ext, lambda::_1 << content);
- }
-
- // Disambiguate when passing string literal
- NamedTempFile(const std::string& ext, const char* content):
- mPath(temp_directory_path())
- {
- createFile(ext, lambda::_1 << content);
- }
-
- NamedTempFile(const std::string& ext, const Streamer& func):
- mPath(temp_directory_path())
- {
- createFile(ext, func);
- }
-
- ~NamedTempFile()
- {
- _remove(mPath.c_str());
- }
-
- std::string getName() const { return mPath; }
-
-private:
- void createFile(const std::string& ext, const Streamer& func)
- {
- // Silly maybe, but use 'ext' as the name prefix. Strip off a leading
- // '.' if present.
- int pfx_offset = ((! ext.empty()) && ext[0] == '.')? 1 : 0;
-
-#if ! LL_WINDOWS
- // Make sure mPath ends with a directory separator, if it doesn't already.
- if (mPath.empty() ||
- ! (mPath[mPath.length() - 1] == '\\' || mPath[mPath.length() - 1] == '/'))
- {
- mPath.append("/");
- }
-
- // mkstemp() accepts and modifies a char* template string. Generate
- // the template string, then copy to modifiable storage.
- // mkstemp() requires its template string to end in six X's.
- mPath += ext.substr(pfx_offset) + "XXXXXX";
- // Copy to vector<char>
- std::vector<char> pathtemplate(mPath.begin(), mPath.end());
- // append a nul byte for classic-C semantics
- pathtemplate.push_back('\0');
- // std::vector promises that a pointer to the 0th element is the same
- // as a pointer to a contiguous classic-C array
- int fd(mkstemp(&pathtemplate[0]));
- if (fd == -1)
- {
- // The documented errno values (http://linux.die.net/man/3/mkstemp)
- // are used in a somewhat unusual way, so provide context-specific
- // errors.
- if (errno == EEXIST)
- {
- LL_ERRS("NamedTempFile") << "mkstemp(\"" << mPath
- << "\") could not create unique file " << LL_ENDL;
- }
- if (errno == EINVAL)
- {
- LL_ERRS("NamedTempFile") << "bad mkstemp() file path template '"
- << mPath << "'" << LL_ENDL;
- }
- // Shrug, something else
- int mkst_errno = errno;
- char buffer[256];
- LL_ERRS("NamedTempFile") << "mkstemp(\"" << mPath << "\") failed: "
- << message_from(mkst_errno, buffer,
- strerror_r(mkst_errno, buffer, sizeof(buffer)))
- << LL_ENDL;
- }
- // mkstemp() seems to have worked! Capture the modified filename.
- // Avoid the nul byte we appended.
- mPath.assign(pathtemplate.begin(), (pathtemplate.end()-1));
-
-/*==========================================================================*|
- // Define an ostream on the open fd. Tell it to close fd on destruction.
- boost::iostreams::stream<boost::iostreams::file_descriptor_sink>
- out(fd, boost::iostreams::close_handle);
-|*==========================================================================*/
-
- // Write desired content.
- std::ostringstream out;
- // Stream stuff to it.
- func(out);
-
- std::string data(out.str());
- int written(_write(fd, data.c_str(), data.length()));
- int closed(_close(fd));
- llassert_always(written == data.length() && closed == 0);
-
-#else // LL_WINDOWS
- // GetTempFileName() is documented to require a MAX_PATH buffer.
- char tempname[MAX_PATH];
- // Use 'ext' as filename prefix, but skip leading '.' if any.
- // The 0 param is very important: requests iterating until we get a
- // unique name.
- if (0 == GetTempFileNameA(mPath.c_str(), ext.c_str() + pfx_offset, 0, tempname))
- {
- // I always have to look up this call... :-P
- LPSTR msgptr;
- FormatMessageA(
- FORMAT_MESSAGE_ALLOCATE_BUFFER |
- FORMAT_MESSAGE_FROM_SYSTEM |
- FORMAT_MESSAGE_IGNORE_INSERTS,
- NULL,
- GetLastError(),
- MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
- LPSTR(&msgptr), // have to cast (char**) to (char*)
- 0, NULL );
- LL_ERRS("NamedTempFile") << "GetTempFileName(\"" << mPath << "\", \""
- << (ext.c_str() + pfx_offset) << "\") failed: "
- << msgptr << LL_ENDL;
- LocalFree(msgptr);
- }
- // GetTempFileName() appears to have worked! Capture the actual
- // filename.
- mPath = tempname;
- // Open the file and stream content to it. Destructor will close.
- std::ofstream out(tempname);
- func(out);
-
-#endif // LL_WINDOWS
- }
-
- void peep()
- {
- std::cout << "File '" << mPath << "' contains:\n";
- std::ifstream reader(mPath.c_str());
- std::string line;
- while (std::getline(reader, line))
- std::cout << line << '\n';
- std::cout << "---\n";
- }
-
- std::string mPath;
-};
-
namespace tut
{
struct sd_xml_data
@@ -1783,7 +1538,7 @@ namespace tut
const char* PYTHON(getenv("PYTHON"));
ensure("Set $PYTHON to the Python interpreter", PYTHON);
- NamedTempFile scriptfile(".py", script);
+ NamedTempFile scriptfile("py", script);
#if LL_WINDOWS
std::string q("\"");
@@ -1802,14 +1557,15 @@ namespace tut
}
#else // LL_DARWIN, LL_LINUX
- LLProcessLauncher py;
- py.setExecutable(PYTHON);
- py.addArgument(scriptfile.getName());
- ensure_equals(STRINGIZE("Couldn't launch " << desc << " script"), py.launch(), 0);
+ LLProcess::Params params;
+ params.executable = PYTHON;
+ params.args.add(scriptfile.getName());
+ LLProcessPtr py(LLProcess::create(params));
+ ensure(STRINGIZE("Couldn't launch " << desc << " script"), py);
// Implementing timeout would mean messing with alarm() and
// catching SIGALRM... later maybe...
int status(0);
- if (waitpid(py.getProcessID(), &status, 0) == -1)
+ if (waitpid(py->getProcessID(), &status, 0) == -1)
{
int waitpid_errno(errno);
ensure_equals(STRINGIZE("Couldn't retrieve rc from " << desc << " script: "
@@ -1888,12 +1644,12 @@ namespace tut
" else:\n"
" assert False, 'Too many data items'\n";
- // Create a something.llsd file containing 'data' serialized to
+ // Create an llsdXXXXXX file containing 'data' serialized to
// notation. It's important to separate with newlines because Python's
// llsd module doesn't support parsing from a file stream, only from a
// string, so we have to know how much of the file to read into a
// string.
- NamedTempFile file(".llsd",
+ NamedTempFile file("llsd",
// NamedTempFile's boost::function constructor
// takes a callable. To this callable it passes the
// std::ostream with which it's writing the
@@ -1926,7 +1682,7 @@ namespace tut
// Create an empty data file. This is just a placeholder for our
// script to write into. Create it to establish a unique name that
// we know.
- NamedTempFile file(".llsd", "");
+ NamedTempFile file("llsd", "");
python("write Python notation",
lambda::_1 <<
diff --git a/indra/llcommon/tests/llstreamqueue_test.cpp b/indra/llcommon/tests/llstreamqueue_test.cpp
new file mode 100644
index 0000000000..050ad5c5bf
--- /dev/null
+++ b/indra/llcommon/tests/llstreamqueue_test.cpp
@@ -0,0 +1,197 @@
+/**
+ * @file llstreamqueue_test.cpp
+ * @author Nat Goodspeed
+ * @date 2012-01-05
+ * @brief Test for llstreamqueue.
+ *
+ * $LicenseInfo:firstyear=2012&license=viewerlgpl$
+ * Copyright (c) 2012, Linden Research, Inc.
+ * $/LicenseInfo$
+ */
+
+// Precompiled header
+#include "linden_common.h"
+// associated header
+#include "llstreamqueue.h"
+// STL headers
+#include <vector>
+// std headers
+// external library headers
+#include <boost/foreach.hpp>
+// other Linden headers
+#include "../test/lltut.h"
+#include "stringize.h"
+
+/*****************************************************************************
+* TUT
+*****************************************************************************/
+namespace tut
+{
+ struct llstreamqueue_data
+ {
+ llstreamqueue_data():
+ // we want a buffer with actual bytes in it, not an empty vector
+ buffer(10)
+ {}
+ // As LLStreamQueue is merely a typedef for
+ // LLGenericStreamQueue<char>, and no logic in LLGenericStreamQueue is
+ // specific to the <char> instantiation, we're comfortable for now
+ // testing only the narrow-char version.
+ LLStreamQueue strq;
+ // buffer for use in multiple tests
+ std::vector<char> buffer;
+ };
+ typedef test_group<llstreamqueue_data> llstreamqueue_group;
+ typedef llstreamqueue_group::object object;
+ llstreamqueue_group llstreamqueuegrp("llstreamqueue");
+
+ template<> template<>
+ void object::test<1>()
+ {
+ set_test_name("empty LLStreamQueue");
+ ensure_equals("brand-new LLStreamQueue isn't empty",
+ strq.size(), 0);
+ ensure_equals("brand-new LLStreamQueue returns data",
+ strq.asSource().read(&buffer[0], buffer.size()), 0);
+ strq.asSink().close();
+ ensure_equals("closed empty LLStreamQueue not at EOF",
+ strq.asSource().read(&buffer[0], buffer.size()), -1);
+ }
+
+ template<> template<>
+ void object::test<2>()
+ {
+ set_test_name("one internal block, one buffer");
+ LLStreamQueue::Sink sink(strq.asSink());
+ ensure_equals("write(\"\")", sink.write("", 0), 0);
+ ensure_equals("0 write should leave LLStreamQueue empty (size())",
+ strq.size(), 0);
+ ensure_equals("0 write should leave LLStreamQueue empty (peek())",
+ strq.peek(&buffer[0], buffer.size()), 0);
+ // The meaning of "atomic" is that it must be smaller than our buffer.
+ std::string atomic("atomic");
+ ensure("test data exceeds buffer", atomic.length() < buffer.size());
+ ensure_equals(STRINGIZE("write(\"" << atomic << "\")"),
+ sink.write(&atomic[0], atomic.length()), atomic.length());
+ ensure_equals("size() after write()", strq.size(), atomic.length());
+ size_t peeklen(strq.peek(&buffer[0], buffer.size()));
+ ensure_equals(STRINGIZE("peek(\"" << atomic << "\")"),
+ peeklen, atomic.length());
+ ensure_equals(STRINGIZE("peek(\"" << atomic << "\") result"),
+ std::string(buffer.begin(), buffer.begin() + peeklen), atomic);
+ ensure_equals("size() after peek()", strq.size(), atomic.length());
+ // peek() should not consume. Use a different buffer to prove it isn't
+ // just leftover data from the first peek().
+ std::vector<char> again(buffer.size());
+ peeklen = size_t(strq.peek(&again[0], again.size()));
+ ensure_equals(STRINGIZE("peek(\"" << atomic << "\") again"),
+ peeklen, atomic.length());
+ ensure_equals(STRINGIZE("peek(\"" << atomic << "\") again result"),
+ std::string(again.begin(), again.begin() + peeklen), atomic);
+ // now consume.
+ std::vector<char> third(buffer.size());
+ size_t readlen(strq.read(&third[0], third.size()));
+ ensure_equals(STRINGIZE("read(\"" << atomic << "\")"),
+ readlen, atomic.length());
+ ensure_equals(STRINGIZE("read(\"" << atomic << "\") result"),
+ std::string(third.begin(), third.begin() + readlen), atomic);
+ ensure_equals("peek() after read()", strq.peek(&buffer[0], buffer.size()), 0);
+ ensure_equals("size() after read()", strq.size(), 0);
+ }
+
+ template<> template<>
+ void object::test<3>()
+ {
+ set_test_name("basic skip()");
+ std::string lovecraft("lovecraft");
+ ensure("test data exceeds buffer", lovecraft.length() < buffer.size());
+ ensure_equals(STRINGIZE("write(\"" << lovecraft << "\")"),
+ strq.write(&lovecraft[0], lovecraft.length()), lovecraft.length());
+ size_t peeklen(strq.peek(&buffer[0], buffer.size()));
+ ensure_equals(STRINGIZE("peek(\"" << lovecraft << "\")"),
+ peeklen, lovecraft.length());
+ ensure_equals(STRINGIZE("peek(\"" << lovecraft << "\") result"),
+ std::string(buffer.begin(), buffer.begin() + peeklen), lovecraft);
+ std::streamsize skip1(4);
+ ensure_equals(STRINGIZE("skip(" << skip1 << ")"), strq.skip(skip1), skip1);
+ ensure_equals("size() after skip()", strq.size(), lovecraft.length() - skip1);
+ size_t readlen(strq.read(&buffer[0], buffer.size()));
+ ensure_equals(STRINGIZE("read(\"" << lovecraft.substr(skip1) << "\")"),
+ readlen, lovecraft.length() - skip1);
+ ensure_equals(STRINGIZE("read(\"" << lovecraft.substr(skip1) << "\") result"),
+ std::string(buffer.begin(), buffer.begin() + readlen),
+ lovecraft.substr(skip1));
+ ensure_equals("unconsumed", strq.read(&buffer[0], buffer.size()), 0);
+ }
+
+ template<> template<>
+ void object::test<4>()
+ {
+ set_test_name("skip() multiple blocks");
+ std::string blocks[] = { "books of ", "H.P. ", "Lovecraft" };
+ std::streamsize total(blocks[0].length() + blocks[1].length() + blocks[2].length());
+ std::streamsize leave(5); // len("craft") above
+ std::streamsize skip(total - leave);
+ std::streamsize written(0);
+ BOOST_FOREACH(const std::string& block, blocks)
+ {
+ written += strq.write(&block[0], block.length());
+ ensure_equals("size() after write()", strq.size(), written);
+ }
+ std::streamsize skiplen(strq.skip(skip));
+ ensure_equals(STRINGIZE("skip(" << skip << ")"), skiplen, skip);
+ ensure_equals("size() after skip()", strq.size(), leave);
+ size_t readlen(strq.read(&buffer[0], buffer.size()));
+ ensure_equals("read(\"craft\")", readlen, leave);
+ ensure_equals("read(\"craft\") result",
+ std::string(buffer.begin(), buffer.begin() + readlen), "craft");
+ }
+
+ template<> template<>
+ void object::test<5>()
+ {
+ set_test_name("concatenate blocks");
+ std::string blocks[] = { "abcd", "efghij", "klmnopqrs" };
+ BOOST_FOREACH(const std::string& block, blocks)
+ {
+ strq.write(&block[0], block.length());
+ }
+ std::vector<char> longbuffer(30);
+ std::streamsize readlen(strq.read(&longbuffer[0], longbuffer.size()));
+ ensure_equals("read() multiple blocks",
+ readlen, blocks[0].length() + blocks[1].length() + blocks[2].length());
+ ensure_equals("read() multiple blocks result",
+ std::string(longbuffer.begin(), longbuffer.begin() + readlen),
+ blocks[0] + blocks[1] + blocks[2]);
+ }
+
+ template<> template<>
+ void object::test<6>()
+ {
+ set_test_name("split blocks");
+ std::string blocks[] = { "abcdefghijklm", "nopqrstuvwxyz" };
+ BOOST_FOREACH(const std::string& block, blocks)
+ {
+ strq.write(&block[0], block.length());
+ }
+ strq.close();
+ // We've already verified what strq.size() should be at this point;
+ // see above test named "skip() multiple blocks"
+ std::streamsize chksize(strq.size());
+ std::streamsize readlen(strq.read(&buffer[0], buffer.size()));
+ ensure_equals("read() 0", readlen, buffer.size());
+ ensure_equals("read() 0 result", std::string(buffer.begin(), buffer.end()), "abcdefghij");
+ chksize -= readlen;
+ ensure_equals("size() after read() 0", strq.size(), chksize);
+ readlen = strq.read(&buffer[0], buffer.size());
+ ensure_equals("read() 1", readlen, buffer.size());
+ ensure_equals("read() 1 result", std::string(buffer.begin(), buffer.end()), "klmnopqrst");
+ chksize -= readlen;
+ ensure_equals("size() after read() 1", strq.size(), chksize);
+ readlen = strq.read(&buffer[0], buffer.size());
+ ensure_equals("read() 2", readlen, chksize);
+ ensure_equals("read() 2 result",
+ std::string(buffer.begin(), buffer.begin() + readlen), "uvwxyz");
+ ensure_equals("read() 3", strq.read(&buffer[0], buffer.size()), -1);
+ }
+} // namespace tut
diff --git a/indra/llcommon/tests/llstring_test.cpp b/indra/llcommon/tests/llstring_test.cpp
index 6a1cbf652a..93d3968dbf 100644
--- a/indra/llcommon/tests/llstring_test.cpp
+++ b/indra/llcommon/tests/llstring_test.cpp
@@ -29,7 +29,11 @@
#include "linden_common.h"
#include "../test/lltut.h"
+#include <boost/assign/list_of.hpp>
#include "../llstring.h"
+#include "StringVec.h"
+
+using boost::assign::list_of;
namespace tut
{
@@ -750,4 +754,118 @@ namespace tut
ensure("empty substr.", !LLStringUtil::endsWith(empty, value));
ensure("empty everything.", !LLStringUtil::endsWith(empty, empty));
}
+
+ template<> template<>
+ void string_index_object_t::test<41>()
+ {
+ set_test_name("getTokens(\"delims\")");
+ ensure_equals("empty string", LLStringUtil::getTokens("", " "), StringVec());
+ ensure_equals("only delims",
+ LLStringUtil::getTokens(" \r\n ", " \r\n"), StringVec());
+ ensure_equals("sequence of delims",
+ LLStringUtil::getTokens(",,, one ,,,", ","), list_of("one"));
+ // nat considers this a dubious implementation side effect, but I'd
+ // hate to change it now...
+ ensure_equals("noncontiguous tokens",
+ LLStringUtil::getTokens(", ,, , one ,,,", ","), list_of("")("")("one"));
+ ensure_equals("space-padded tokens",
+ LLStringUtil::getTokens(", one , two ,", ","), list_of("one")("two"));
+ ensure_equals("no delims", LLStringUtil::getTokens("one", ","), list_of("one"));
+ }
+
+ // Shorthand for verifying that getTokens() behaves the same when you
+ // don't pass a string of escape characters, when you pass an empty string
+ // (different overloads), and when you pass a string of characters that
+ // aren't actually present.
+ void ensure_getTokens(const std::string& desc,
+ const std::string& string,
+ const std::string& drop_delims,
+ const std::string& keep_delims,
+ const std::string& quotes,
+ const std::vector<std::string>& expect)
+ {
+ ensure_equals(desc + " - no esc",
+ LLStringUtil::getTokens(string, drop_delims, keep_delims, quotes),
+ expect);
+ ensure_equals(desc + " - empty esc",
+ LLStringUtil::getTokens(string, drop_delims, keep_delims, quotes, ""),
+ expect);
+ ensure_equals(desc + " - unused esc",
+ LLStringUtil::getTokens(string, drop_delims, keep_delims, quotes, "!"),
+ expect);
+ }
+
+ void ensure_getTokens(const std::string& desc,
+ const std::string& string,
+ const std::string& drop_delims,
+ const std::string& keep_delims,
+ const std::vector<std::string>& expect)
+ {
+ ensure_getTokens(desc, string, drop_delims, keep_delims, "", expect);
+ }
+
+ template<> template<>
+ void string_index_object_t::test<42>()
+ {
+ set_test_name("getTokens(\"delims\", etc.)");
+ // Signatures to test in this method:
+ // getTokens(string, drop_delims, keep_delims [, quotes [, escapes]])
+ // If you omit keep_delims, you get the older function (test above).
+
+ // cases like the getTokens(string, delims) tests above
+ ensure_getTokens("empty string", "", " ", "", StringVec());
+ ensure_getTokens("only delims",
+ " \r\n ", " \r\n", "", StringVec());
+ ensure_getTokens("sequence of delims",
+ ",,, one ,,,", ", ", "", list_of("one"));
+ // Note contrast with the case in the previous method
+ ensure_getTokens("noncontiguous tokens",
+ ", ,, , one ,,,", ", ", "", list_of("one"));
+ ensure_getTokens("space-padded tokens",
+ ", one , two ,", ", ", "",
+ list_of("one")("two"));
+ ensure_getTokens("no delims", "one", ",", "", list_of("one"));
+
+ // drop_delims vs. keep_delims
+ ensure_getTokens("arithmetic",
+ " ab+def / xx* yy ", " ", "+-*/",
+ list_of("ab")("+")("def")("/")("xx")("*")("yy"));
+
+ // quotes
+ ensure_getTokens("no quotes",
+ "She said, \"Don't go.\"", " ", ",", "",
+ list_of("She")("said")(",")("\"Don't")("go.\""));
+ ensure_getTokens("quotes",
+ "She said, \"Don't go.\"", " ", ",", "\"",
+ list_of("She")("said")(",")("Don't go."));
+ ensure_getTokens("quotes and delims",
+ "run c:/'Documents and Settings'/someone", " ", "", "'",
+ list_of("run")("c:/Documents and Settings/someone"));
+ ensure_getTokens("unmatched quote",
+ "baby don't leave", " ", "", "'",
+ list_of("baby")("don't")("leave"));
+ ensure_getTokens("adjacent quoted",
+ "abc'def \"ghi'\"jkl' mno\"pqr", " ", "", "\"'",
+ list_of("abcdef \"ghijkl' mnopqr"));
+ ensure_getTokens("quoted empty string",
+ "--set SomeVar ''", " ", "", "'",
+ list_of("--set")("SomeVar")(""));
+
+ // escapes
+ // Don't use backslash as an escape for these tests -- you'll go nuts
+ // between the C++ string scanner and getTokens() escapes. Test with
+ // something else!
+ ensure_equals("escaped delims",
+ LLStringUtil::getTokens("^ a - dog^-gone^ phrase", " ", "-", "", "^"),
+ list_of(" a")("-")("dog-gone phrase"));
+ ensure_equals("escaped quotes",
+ LLStringUtil::getTokens("say: 'this isn^'t w^orking'.", " ", "", "'", "^"),
+ list_of("say:")("this isn't working."));
+ ensure_equals("escaped escape",
+ LLStringUtil::getTokens("want x^^2", " ", "", "", "^"),
+ list_of("want")("x^2"));
+ ensure_equals("escape at end",
+ LLStringUtil::getTokens("it's^ up there^", " ", "", "'", "^"),
+ list_of("it's up")("there^"));
+ }
}
diff --git a/indra/llcommon/tests/setpython.py b/indra/llcommon/tests/setpython.py
deleted file mode 100644
index df7b90428e..0000000000
--- a/indra/llcommon/tests/setpython.py
+++ /dev/null
@@ -1,19 +0,0 @@
-#!/usr/bin/python
-"""\
-@file setpython.py
-@author Nat Goodspeed
-@date 2011-07-13
-@brief Set PYTHON environment variable for tests that care.
-
-$LicenseInfo:firstyear=2011&license=viewerlgpl$
-Copyright (c) 2011, Linden Research, Inc.
-$/LicenseInfo$
-"""
-
-import os
-import sys
-import subprocess
-
-if __name__ == "__main__":
- os.environ["PYTHON"] = sys.executable
- sys.exit(subprocess.call(sys.argv[1:]))
diff --git a/indra/llcommon/tests/wrapllerrs.h b/indra/llcommon/tests/wrapllerrs.h
index ffda84729b..f79acacb22 100644
--- a/indra/llcommon/tests/wrapllerrs.h
+++ b/indra/llcommon/tests/wrapllerrs.h
@@ -29,7 +29,17 @@
#if ! defined(LL_WRAPLLERRS_H)
#define LL_WRAPLLERRS_H
+#include <tut/tut.hpp>
#include "llerrorcontrol.h"
+#include "stringize.h"
+#include <boost/bind.hpp>
+#include <list>
+#include <string>
+#include <stdexcept>
+
+// statically reference the function in test.cpp... it's short, we could
+// replicate, but better to reuse
+extern void wouldHaveCrashed(const std::string& message);
struct WrapLL_ERRS
{
@@ -70,4 +80,87 @@ struct WrapLL_ERRS
LLError::FatalFunction mPriorFatal;
};
+/**
+ * Capture log messages. This is adapted (simplified) from the one in
+ * llerror_test.cpp.
+ */
+class CaptureLog : public LLError::Recorder
+{
+public:
+ CaptureLog(LLError::ELevel level=LLError::LEVEL_DEBUG):
+ // Mostly what we're trying to accomplish by saving and resetting
+ // LLError::Settings is to bypass the default RecordToStderr and
+ // RecordToWinDebug Recorders. As these are visible only inside
+ // llerror.cpp, we can't just call LLError::removeRecorder() with
+ // each. For certain tests we need to produce, capture and examine
+ // DEBUG log messages -- but we don't want to spam the user's console
+ // with that output. If it turns out that saveAndResetSettings() has
+ // some bad effect, give up and just let the DEBUG level log messages
+ // display.
+ mOldSettings(LLError::saveAndResetSettings())
+ {
+ LLError::setFatalFunction(wouldHaveCrashed);
+ LLError::setDefaultLevel(level);
+ LLError::addRecorder(this);
+ }
+
+ ~CaptureLog()
+ {
+ LLError::removeRecorder(this);
+ LLError::restoreSettings(mOldSettings);
+ }
+
+ void recordMessage(LLError::ELevel level,
+ const std::string& message)
+ {
+ mMessages.push_back(message);
+ }
+
+ /// Don't assume the message we want is necessarily the LAST log message
+ /// emitted by the underlying code; search backwards through all messages
+ /// for the sought string.
+ std::string messageWith(const std::string& search, bool required=true)
+ {
+ for (MessageList::const_reverse_iterator rmi(mMessages.rbegin()), rmend(mMessages.rend());
+ rmi != rmend; ++rmi)
+ {
+ if (rmi->find(search) != std::string::npos)
+ return *rmi;
+ }
+ // failed to find any such message
+ if (! required)
+ return std::string();
+
+ throw tut::failure(STRINGIZE("failed to find '" << search
+ << "' in captured log messages:\n"
+ << *this));
+ }
+
+ std::ostream& streamto(std::ostream& out) const
+ {
+ MessageList::const_iterator mi(mMessages.begin()), mend(mMessages.end());
+ if (mi != mend)
+ {
+ // handle first message separately: it doesn't get a newline
+ out << *mi++;
+ for ( ; mi != mend; ++mi)
+ {
+ // every subsequent message gets a newline
+ out << '\n' << *mi;
+ }
+ }
+ return out;
+ }
+
+ typedef std::list<std::string> MessageList;
+ MessageList mMessages;
+ LLError::Settings* mOldSettings;
+};
+
+inline
+std::ostream& operator<<(std::ostream& out, const CaptureLog& log)
+{
+ return log.streamto(out);
+}
+
#endif /* ! defined(LL_WRAPLLERRS_H) */
diff --git a/indra/llcrashlogger/llcrashlogger.cpp b/indra/llcrashlogger/llcrashlogger.cpp
index 514ef6011f..3461aa3e6c 100644
--- a/indra/llcrashlogger/llcrashlogger.cpp
+++ b/indra/llcrashlogger/llcrashlogger.cpp
@@ -42,6 +42,7 @@
#include "llpumpio.h"
#include "llhttpclient.h"
#include "llsdserialize.h"
+#include "llproxy.h"
LLPumpIO* gServicePump;
BOOL gBreak = false;
@@ -414,7 +415,8 @@ bool LLCrashLogger::init()
return false;
}
- gServicePump = new LLPumpIO;
+ gServicePump = new LLPumpIO(gAPRPoolp);
+ gServicePump->prime(gAPRPoolp);
LLHTTPClient::setPump(*gServicePump);
//If we've opened the crash logger, assume we can delete the marker file if it exists
@@ -427,3 +429,9 @@ bool LLCrashLogger::init()
return true;
}
+
+// For cleanup code common to all platforms.
+void LLCrashLogger::commonCleanup()
+{
+ LLProxy::cleanupClass();
+}
diff --git a/indra/llcrashlogger/llcrashlogger.h b/indra/llcrashlogger/llcrashlogger.h
index 5d0cb5931c..1510d7e0b3 100644
--- a/indra/llcrashlogger/llcrashlogger.h
+++ b/indra/llcrashlogger/llcrashlogger.h
@@ -48,7 +48,8 @@ public:
virtual void updateApplication(const std::string& message = LLStringUtil::null);
virtual bool init();
virtual bool mainLoop() = 0;
- virtual bool cleanup() { return true; }
+ virtual bool cleanup() = 0;
+ void commonCleanup();
void setUserText(const std::string& text) { mCrashInfo["UserNotes"] = text; }
S32 getCrashBehavior() { return mCrashBehavior; }
bool runCrashLogPost(std::string host, LLSD data, std::string msg, int retries, int timeout);
diff --git a/indra/llimage/llimage.cpp b/indra/llimage/llimage.cpp
index 23adbf68c8..56e01ac851 100644
--- a/indra/llimage/llimage.cpp
+++ b/indra/llimage/llimage.cpp
@@ -53,7 +53,7 @@ LLPrivateMemoryPool* LLImageBase::sPrivatePoolp = NULL ;
//static
void LLImage::initClass()
{
- sMutex = new LLMutex;
+ sMutex = new LLMutex(NULL);
LLImageBase::createPrivatePool() ;
}
@@ -195,7 +195,7 @@ U8* LLImageBase::allocateData(S32 size)
mData = (U8*)ALLOCATE_MEM(sPrivatePoolp, size);
if (!mData)
{
- llwarns << "allocate image data: " << size << llendl;
+ llwarns << "Failed to allocate image data size [" << size << "]" << llendl;
size = 0 ;
mWidth = mHeight = 0 ;
mBadBufferAllocation = true ;
@@ -1566,7 +1566,8 @@ BOOL LLImageFormatted::load(const std::string &filename)
resetLastError();
S32 file_size = 0;
- LLAPRFile infile(filename, LL_APR_RB, &file_size);
+ LLAPRFile infile ;
+ infile.open(filename, LL_APR_RB, NULL, &file_size);
apr_file_t* apr_file = infile.getFileHandle();
if (!apr_file)
{
@@ -1601,7 +1602,8 @@ BOOL LLImageFormatted::save(const std::string &filename)
{
resetLastError();
- LLAPRFile outfile(filename, LL_APR_WB);
+ LLAPRFile outfile ;
+ outfile.open(filename, LL_APR_WB);
if (!outfile.getFileHandle())
{
setLastError("Unable to open file for writing", filename);
diff --git a/indra/llimage/llimagedimensionsinfo.cpp b/indra/llimage/llimagedimensionsinfo.cpp
index 926c749145..c6bfa50b40 100644
--- a/indra/llimage/llimagedimensionsinfo.cpp
+++ b/indra/llimage/llimagedimensionsinfo.cpp
@@ -40,7 +40,7 @@ bool LLImageDimensionsInfo::load(const std::string& src_filename,U32 codec)
mSrcFilename = src_filename;
S32 file_size = 0;
- apr_status_t s = mInfile.open(src_filename, LL_APR_RB, LLAPRFile::long_lived, &file_size);
+ apr_status_t s = mInfile.open(src_filename, LL_APR_RB, NULL, &file_size);
if (s != APR_SUCCESS)
{
diff --git a/indra/llimage/llimagedxt.cpp b/indra/llimage/llimagedxt.cpp
index 2867f5e6f0..34c6793522 100644
--- a/indra/llimage/llimagedxt.cpp
+++ b/indra/llimage/llimagedxt.cpp
@@ -26,6 +26,7 @@
#include "linden_common.h"
#include "llimagedxt.h"
+#include "llmemory.h"
//static
void LLImageDXT::checkMinWidthHeight(EFileFormat format, S32& width, S32& height)
diff --git a/indra/llimage/llimagej2c.cpp b/indra/llimage/llimagej2c.cpp
index 8c5dc63e9d..cc8cb66d73 100644
--- a/indra/llimage/llimagej2c.cpp
+++ b/indra/llimage/llimagej2c.cpp
@@ -29,6 +29,7 @@
#include "llmemtype.h"
#include "lltimer.h"
#include "llmath.h"
+#include "llmemory.h"
typedef LLImageJ2CImpl* (*CreateLLImageJ2CFunction)();
typedef void (*DestroyLLImageJ2CFunction)(LLImageJ2CImpl*);
@@ -370,7 +371,8 @@ BOOL LLImageJ2C::loadAndValidate(const std::string &filename)
resetLastError();
S32 file_size = 0;
- LLAPRFile infile(filename, LL_APR_RB, &file_size);
+ LLAPRFile infile ;
+ infile.open(filename, LL_APR_RB, NULL, &file_size);
apr_file_t* apr_file = infile.getFileHandle() ;
if (!apr_file)
{
diff --git a/indra/llimage/llimageworker.cpp b/indra/llimage/llimageworker.cpp
index 2c6d6f31ea..ad2eb0f69c 100644
--- a/indra/llimage/llimageworker.cpp
+++ b/indra/llimage/llimageworker.cpp
@@ -35,18 +35,20 @@
LLImageDecodeThread::LLImageDecodeThread(bool threaded)
: LLQueuedThread("imagedecode", threaded)
{
+ mCreationMutex = new LLMutex(getAPRPool());
}
//virtual
LLImageDecodeThread::~LLImageDecodeThread()
{
+ delete mCreationMutex ;
}
// MAIN THREAD
// virtual
-S32 LLImageDecodeThread::update(U32 max_time_ms)
+S32 LLImageDecodeThread::update(F32 max_time_ms)
{
- LLMutexLock lock(&mCreationMutex);
+ LLMutexLock lock(mCreationMutex);
for (creation_list_t::iterator iter = mCreationList.begin();
iter != mCreationList.end(); ++iter)
{
@@ -69,7 +71,7 @@ S32 LLImageDecodeThread::update(U32 max_time_ms)
LLImageDecodeThread::handle_t LLImageDecodeThread::decodeImage(LLImageFormatted* image,
U32 priority, S32 discard, BOOL needs_aux, Responder* responder)
{
- LLMutexLock lock(&mCreationMutex);
+ LLMutexLock lock(mCreationMutex);
handle_t handle = generateHandle();
mCreationList.push_back(creation_info(handle, image, priority, discard, needs_aux, responder));
return handle;
@@ -79,7 +81,7 @@ LLImageDecodeThread::handle_t LLImageDecodeThread::decodeImage(LLImageFormatted*
// Returns the size of the mutex guarded list as an indication of sanity
S32 LLImageDecodeThread::tut_size()
{
- LLMutexLock lock(&mCreationMutex);
+ LLMutexLock lock(mCreationMutex);
S32 res = mCreationList.size();
return res;
}
diff --git a/indra/llimage/llimageworker.h b/indra/llimage/llimageworker.h
index 6a24b7522a..1bfb0ddfd3 100644
--- a/indra/llimage/llimageworker.h
+++ b/indra/llimage/llimageworker.h
@@ -78,7 +78,7 @@ public:
handle_t decodeImage(LLImageFormatted* image,
U32 priority, S32 discard, BOOL needs_aux,
Responder* responder);
- S32 update(U32 max_time_ms);
+ S32 update(F32 max_time_ms);
// Used by unit tests to check the consistency of the thread instance
S32 tut_size();
@@ -98,7 +98,7 @@ private:
};
typedef std::list<creation_info> creation_list_t;
creation_list_t mCreationList;
- LLMutex mCreationMutex;
+ LLMutex* mCreationMutex;
};
#endif
diff --git a/indra/llinventory/lleconomy.cpp b/indra/llinventory/lleconomy.cpp
index c6eaa6d3e1..d643ea6ed9 100644
--- a/indra/llinventory/lleconomy.cpp
+++ b/indra/llinventory/lleconomy.cpp
@@ -48,6 +48,31 @@ LLGlobalEconomy::LLGlobalEconomy()
LLGlobalEconomy::~LLGlobalEconomy()
{ }
+void LLGlobalEconomy::addObserver(LLEconomyObserver* observer)
+{
+ mObservers.push_back(observer);
+}
+
+void LLGlobalEconomy::removeObserver(LLEconomyObserver* observer)
+{
+ std::list<LLEconomyObserver*>::iterator it =
+ std::find(mObservers.begin(), mObservers.end(), observer);
+ if (it != mObservers.end())
+ {
+ mObservers.erase(it);
+ }
+}
+
+void LLGlobalEconomy::notifyObservers()
+{
+ for (std::list<LLEconomyObserver*>::iterator it = mObservers.begin();
+ it != mObservers.end();
+ ++it)
+ {
+ (*it)->onEconomyDataChange();
+ }
+}
+
// static
void LLGlobalEconomy::processEconomyData(LLMessageSystem *msg, LLGlobalEconomy* econ_data)
{
@@ -88,6 +113,8 @@ void LLGlobalEconomy::processEconomyData(LLMessageSystem *msg, LLGlobalEconomy*
econ_data->setTeleportPriceExponent(f);
msg->getS32Fast(_PREHASH_Info, _PREHASH_PriceGroupCreate, i);
econ_data->setPriceGroupCreate(i);
+
+ econ_data->notifyObservers();
}
S32 LLGlobalEconomy::calculateTeleportCost(F32 distance) const
diff --git a/indra/llinventory/lleconomy.h b/indra/llinventory/lleconomy.h
index cc6643f955..eb2ecf71ba 100644
--- a/indra/llinventory/lleconomy.h
+++ b/indra/llinventory/lleconomy.h
@@ -31,6 +31,16 @@
class LLMessageSystem;
class LLVector3;
+/**
+ * Register an observer to be notified of economy data updates coming from server.
+ */
+class LLEconomyObserver
+{
+public:
+ virtual ~LLEconomyObserver() {}
+ virtual void onEconomyDataChange() = 0;
+};
+
class LLGlobalEconomy
{
public:
@@ -46,6 +56,10 @@ public:
virtual void print();
+ void addObserver(LLEconomyObserver* observer);
+ void removeObserver(LLEconomyObserver* observer);
+ void notifyObservers();
+
static void processEconomyData(LLMessageSystem *msg, LLGlobalEconomy* econ_data);
S32 calculateTeleportCost(F32 distance) const;
@@ -89,6 +103,8 @@ private:
S32 mTeleportMinPrice;
F32 mTeleportPriceExponent;
S32 mPriceGroupCreate;
+
+ std::list<LLEconomyObserver*> mObservers;
};
diff --git a/indra/llinventory/llinventorytype.cpp b/indra/llinventory/llinventorytype.cpp
index d2bba21648..8282d79b67 100644
--- a/indra/llinventory/llinventorytype.cpp
+++ b/indra/llinventory/llinventorytype.cpp
@@ -84,6 +84,7 @@ LLInventoryDictionary::LLInventoryDictionary()
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));
+ addEntry(LLInventoryType::IT_WIDGET, new InventoryEntry("widget", "widget", 1, LLAssetType::AT_WIDGET));
}
@@ -134,7 +135,7 @@ DEFAULT_ASSET_FOR_INV_TYPE[LLAssetType::AT_COUNT] =
LLInventoryType::IT_NONE, // 37 AT_NONE
LLInventoryType::IT_NONE, // 38 AT_NONE
LLInventoryType::IT_NONE, // 39 AT_NONE
- LLInventoryType::IT_NONE, // 40 AT_NONE
+ LLInventoryType::IT_WIDGET, // 40 AT_WIDGET
LLInventoryType::IT_NONE, // 41 AT_NONE
LLInventoryType::IT_NONE, // 42 AT_NONE
LLInventoryType::IT_NONE, // 43 AT_NONE
@@ -143,7 +144,7 @@ DEFAULT_ASSET_FOR_INV_TYPE[LLAssetType::AT_COUNT] =
LLInventoryType::IT_NONE, // 46 AT_NONE
LLInventoryType::IT_NONE, // 47 AT_NONE
LLInventoryType::IT_NONE, // 48 AT_NONE
- LLInventoryType::IT_MESH // 49 AT_MESH
+ LLInventoryType::IT_MESH, // 49 AT_MESH
};
// static
diff --git a/indra/llinventory/llinventorytype.h b/indra/llinventory/llinventorytype.h
index 1a24e351ad..4d1e0db040 100644
--- a/indra/llinventory/llinventorytype.h
+++ b/indra/llinventory/llinventorytype.h
@@ -62,7 +62,8 @@ public:
IT_ANIMATION = 19,
IT_GESTURE = 20,
IT_MESH = 22,
- IT_COUNT = 23,
+ IT_WIDGET = 23,
+ IT_COUNT = 24,
IT_NONE = -1
};
diff --git a/indra/llmath/CMakeLists.txt b/indra/llmath/CMakeLists.txt
index cd100cdf9f..b5e59c1ca3 100644
--- a/indra/llmath/CMakeLists.txt
+++ b/indra/llmath/CMakeLists.txt
@@ -75,10 +75,6 @@ set(llmath_HEADER_FILES
llvector4a.h
llvector4a.inl
llvector4logical.h
- llv4math.h
- llv4matrix3.h
- llv4matrix4.h
- llv4vector3.h
llvolume.h
llvolumemgr.h
llvolumeoctree.h
diff --git a/indra/llmath/lloctree.h b/indra/llmath/lloctree.h
index e5ca47da69..1b11e83b4a 100644
--- a/indra/llmath/lloctree.h
+++ b/indra/llmath/lloctree.h
@@ -80,8 +80,8 @@ public:
typedef LLOctreeTraveler<T> oct_traveler;
typedef LLTreeTraveler<T> tree_traveler;
typedef typename std::set<LLPointer<T> > element_list;
- typedef typename std::set<LLPointer<T> >::iterator element_iter;
- typedef typename std::set<LLPointer<T> >::const_iterator const_element_iter;
+ typedef typename element_list::iterator element_iter;
+ typedef typename element_list::const_iterator const_element_iter;
typedef typename std::vector<LLTreeListener<T>*>::iterator tree_listener_iter;
typedef typename std::vector<LLOctreeNode<T>* > child_list;
typedef LLTreeNode<T> BaseType;
@@ -114,6 +114,8 @@ public:
mOctant = ((oct_node*) mParent)->getOctant(mCenter);
}
+ mElementCount = 0;
+
clearChildren();
}
@@ -219,11 +221,11 @@ public:
void accept(oct_traveler* visitor) { visitor->visit(this); }
virtual bool isLeaf() const { return mChild.empty(); }
- U32 getElementCount() const { return mData.size(); }
+ U32 getElementCount() const { return mElementCount; }
element_list& getData() { return mData; }
const element_list& getData() const { return mData; }
- U32 getChildCount() const { return mChild.size(); }
+ U32 getChildCount() const { return mChildCount; }
oct_node* getChild(U32 index) { return mChild[index]; }
const oct_node* getChild(U32 index) const { return mChild[index]; }
child_list& getChildren() { return mChild; }
@@ -300,17 +302,13 @@ public:
if ((getElementCount() < gOctreeMaxCapacity && contains(data->getBinRadius()) ||
(data->getBinRadius() > getSize()[0] && parent && parent->getElementCount() >= gOctreeMaxCapacity)))
{ //it belongs here
-#if LL_OCTREE_PARANOIA_CHECK
//if this is a redundant insertion, error out (should never happen)
- if (mData.find(data) != mData.end())
- {
- llwarns << "Redundant octree insertion detected. " << data << llendl;
- return false;
- }
-#endif
+ llassert(mData.find(data) == mData.end());
mData.insert(data);
BaseType::insert(data);
+
+ mElementCount = mData.size();
return true;
}
else
@@ -346,6 +344,8 @@ public:
{
mData.insert(data);
BaseType::insert(data);
+
+ mElementCount = mData.size();
return true;
}
@@ -399,6 +399,7 @@ public:
if (mData.find(data) != mData.end())
{ //we have data
mData.erase(data);
+ mElementCount = mData.size();
notifyRemoval(data);
checkAlive();
return true;
@@ -436,6 +437,7 @@ public:
if (mData.find(data) != mData.end())
{
mData.erase(data);
+ mElementCount = mData.size();
notifyRemoval(data);
llwarns << "FOUND!" << llendl;
checkAlive();
@@ -452,7 +454,7 @@ public:
void clearChildren()
{
mChild.clear();
-
+ mChildCount = 0;
U32* foo = (U32*) mChildMap;
foo[0] = foo[1] = 0xFFFFFFFF;
}
@@ -512,9 +514,10 @@ public:
}
#endif
- mChildMap[child->getOctant()] = (U8) mChild.size();
+ mChildMap[child->getOctant()] = mChildCount;
mChild.push_back(child);
+ ++mChildCount;
child->setParent(this);
if (!silent)
@@ -534,21 +537,20 @@ public:
oct_listener* listener = getOctListener(i);
listener->handleChildRemoval(this, getChild(index));
}
-
-
if (destroy)
{
mChild[index]->destroy();
delete mChild[index];
}
mChild.erase(mChild.begin() + index);
+ --mChildCount;
//rebuild child map
U32* foo = (U32*) mChildMap;
foo[0] = foo[1] = 0xFFFFFFFF;
- for (U32 i = 0; i < mChild.size(); ++i)
+ for (U32 i = 0; i < mChildCount; ++i)
{
mChildMap[mChild[i]->getOctant()] = i;
}
@@ -601,8 +603,10 @@ protected:
child_list mChild;
U8 mChildMap[8];
+ U32 mChildCount;
element_list mData;
+ U32 mElementCount;
};
@@ -681,7 +685,7 @@ public:
if (lt != 0x7)
{
- OCT_ERRS << "!!! ELEMENT EXCEEDS RANGE OF SPATIAL PARTITION !!!" << llendl;
+ //OCT_ERRS << "!!! ELEMENT EXCEEDS RANGE OF SPATIAL PARTITION !!!" << llendl;
return false;
}
diff --git a/indra/llmath/llv4math.h b/indra/llmath/llv4math.h
deleted file mode 100644
index 5f403ba526..0000000000
--- a/indra/llmath/llv4math.h
+++ /dev/null
@@ -1,141 +0,0 @@
-/**
- * @file llv4math.h
- * @brief LLV4* class header file - vector processor enabled math
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-#ifndef LL_LLV4MATH_H
-#define LL_LLV4MATH_H
-
-// *NOTE: We do not support SSE acceleration on Windows builds.
-// Our minimum specification for the viewer includes 1 GHz Athlon processors,
-// which covers the Athlon Thunderbird series that does not support SSE.
-//
-// Our header files include statements like this
-// const F32 HAVOK_TIMESTEP = 1.f / 45.f;
-// This creates "globals" that are included in each .obj file. If a single
-// .cpp file has SSE code generation turned on (eg, llviewerjointmesh_sse.cpp)
-// these globals will be initialized using SSE instructions. This causes SL
-// to crash before main() on processors without SSE. Untangling all these
-// headers/variables is too much work for the small performance gains of
-// vectorization.
-//
-// Therefore we only support vectorization on builds where the everything is
-// built with SSE or Altivec. See https://jira.secondlife.com/browse/VWR-1610
-// and https://jira.lindenlab.com/browse/SL-47720 for details.
-//
-// Sorry the code is such a mess. JC
-
-//-----------------------------------------------------------------------------
-//-----------------------------------------------------------------------------
-// LLV4MATH - GNUC
-//-----------------------------------------------------------------------------
-//-----------------------------------------------------------------------------
-
-#if LL_GNUC && __GNUC__ >= 4 && __SSE__
-
-#define LL_VECTORIZE 1
-
-#if LL_DARWIN
-
-#include <Accelerate/Accelerate.h>
-#include <xmmintrin.h>
-typedef vFloat V4F32;
-
-#else
-
-#include <xmmintrin.h>
-typedef float V4F32 __attribute__((vector_size(16)));
-
-#endif
-
-#endif
-#if LL_GNUC
-
-#define LL_LLV4MATH_ALIGN_PREFIX
-#define LL_LLV4MATH_ALIGN_POSTFIX __attribute__((aligned(16)))
-
-#endif
-
-//-----------------------------------------------------------------------------
-//-----------------------------------------------------------------------------
-// LLV4MATH - MSVC
-//-----------------------------------------------------------------------------
-//-----------------------------------------------------------------------------
-
-// Only vectorize if the entire Windows build uses SSE.
-// _M_IX86_FP is set when SSE code generation is turned on, and I have
-// confirmed this in VS2003, VS2003 SP1, and VS2005. JC
-#if LL_MSVC && _M_IX86_FP
-
-#define LL_VECTORIZE 1
-
-#include <xmmintrin.h>
-
-typedef __m128 V4F32;
-
-#endif
-#if LL_MSVC
-
-#define LL_LLV4MATH_ALIGN_PREFIX __declspec(align(16))
-#define LL_LLV4MATH_ALIGN_POSTFIX
-
-#endif
-
-//-----------------------------------------------------------------------------
-//-----------------------------------------------------------------------------
-// LLV4MATH - default - no vectorization
-//-----------------------------------------------------------------------------
-//-----------------------------------------------------------------------------
-
-#if !LL_VECTORIZE
-
-#define LL_VECTORIZE 0
-
-struct V4F32 { F32 __pad__[4]; };
-
-inline F32 llv4lerp(F32 a, F32 b, F32 w) { return ( b - a ) * w + a; }
-
-#endif
-
-#ifndef LL_LLV4MATH_ALIGN_PREFIX
-# define LL_LLV4MATH_ALIGN_PREFIX
-#endif
-#ifndef LL_LLV4MATH_ALIGN_POSTFIX
-# define LL_LLV4MATH_ALIGN_POSTFIX
-#endif
-
-//-----------------------------------------------------------------------------
-//-----------------------------------------------------------------------------
-// LLV4MATH
-//-----------------------------------------------------------------------------
-//-----------------------------------------------------------------------------
-
-
-#define LLV4_NUM_AXIS 4
-
-class LLV4Vector3;
-class LLV4Matrix3;
-class LLV4Matrix4;
-
-#endif
diff --git a/indra/llmath/llv4matrix3.h b/indra/llmath/llv4matrix3.h
deleted file mode 100644
index 270f5d7dae..0000000000
--- a/indra/llmath/llv4matrix3.h
+++ /dev/null
@@ -1,220 +0,0 @@
-/**
- * @file llviewerjointmesh.cpp
- * @brief LLV4* class header file - vector processor enabled math
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-#ifndef LL_LLV4MATRIX3_H
-#define LL_LLV4MATRIX3_H
-
-#include "llv4math.h"
-#include "llv4vector3.h"
-#include "m3math.h" // for operator LLMatrix3()
-
-//-----------------------------------------------------------------------------
-//-----------------------------------------------------------------------------
-// LLV4Matrix3
-//-----------------------------------------------------------------------------
-//-----------------------------------------------------------------------------
-
-LL_LLV4MATH_ALIGN_PREFIX
-
-class LLV4Matrix3
-{
-public:
- union {
- F32 mMatrix[LLV4_NUM_AXIS][LLV4_NUM_AXIS];
- V4F32 mV[LLV4_NUM_AXIS];
- };
-
- void lerp(const LLV4Matrix3 &a, const LLV4Matrix3 &b, const F32 &w);
- void multiply(const LLVector3 &a, LLVector3& out) const;
- void multiply(const LLVector4 &a, LLV4Vector3& out) const;
- void multiply(const LLVector3 &a, LLV4Vector3& out) const;
-
- const LLV4Matrix3& transpose();
- const LLV4Matrix3& operator=(const LLMatrix3& a);
-
- operator LLMatrix3() const { return (reinterpret_cast<const LLMatrix4*>(const_cast<const F32*>(&mMatrix[0][0])))->getMat3(); }
-
- friend LLVector3 operator*(const LLVector3& a, const LLV4Matrix3& b);
-}
-
-LL_LLV4MATH_ALIGN_POSTFIX;
-
-
-
-//-----------------------------------------------------------------------------
-//-----------------------------------------------------------------------------
-// LLV4Matrix3 - SSE
-//-----------------------------------------------------------------------------
-//-----------------------------------------------------------------------------
-
-#if LL_VECTORIZE
-
-inline void LLV4Matrix3::lerp(const LLV4Matrix3 &a, const LLV4Matrix3 &b, const F32 &w)
-{
- __m128 vw = _mm_set1_ps(w);
- mV[VX] = _mm_add_ps(_mm_mul_ps(_mm_sub_ps(b.mV[VX], a.mV[VX]), vw), a.mV[VX]); // ( b - a ) * w + a
- mV[VY] = _mm_add_ps(_mm_mul_ps(_mm_sub_ps(b.mV[VY], a.mV[VY]), vw), a.mV[VY]);
- mV[VZ] = _mm_add_ps(_mm_mul_ps(_mm_sub_ps(b.mV[VZ], a.mV[VZ]), vw), a.mV[VZ]);
-}
-
-inline void LLV4Matrix3::multiply(const LLVector3 &a, LLVector3& o) const
-{
- LLV4Vector3 j;
- j.v = _mm_mul_ps(_mm_set1_ps(a.mV[VX]), mV[VX]); // ( ax * vx ) + ...
- j.v = _mm_add_ps(j.v , _mm_mul_ps(_mm_set1_ps(a.mV[VY]), mV[VY]));
- j.v = _mm_add_ps(j.v , _mm_mul_ps(_mm_set1_ps(a.mV[VZ]), mV[VZ]));
- o.setVec(j.mV);
-}
-
-inline void LLV4Matrix3::multiply(const LLVector4 &a, LLV4Vector3& o) const
-{
- o.v = _mm_mul_ps(_mm_set1_ps(a.mV[VX]), mV[VX]); // ( ax * vx ) + ...
- o.v = _mm_add_ps(o.v , _mm_mul_ps(_mm_set1_ps(a.mV[VY]), mV[VY]));
- o.v = _mm_add_ps(o.v , _mm_mul_ps(_mm_set1_ps(a.mV[VZ]), mV[VZ]));
-}
-
-inline void LLV4Matrix3::multiply(const LLVector3 &a, LLV4Vector3& o) const
-{
- o.v = _mm_mul_ps(_mm_set1_ps(a.mV[VX]), mV[VX]); // ( ax * vx ) + ...
- o.v = _mm_add_ps(o.v , _mm_mul_ps(_mm_set1_ps(a.mV[VY]), mV[VY]));
- o.v = _mm_add_ps(o.v , _mm_mul_ps(_mm_set1_ps(a.mV[VZ]), mV[VZ]));
-}
-
-//-----------------------------------------------------------------------------
-//-----------------------------------------------------------------------------
-// LLV4Matrix3
-//-----------------------------------------------------------------------------
-//-----------------------------------------------------------------------------
-
-#else
-
-inline void LLV4Matrix3::lerp(const LLV4Matrix3 &a, const LLV4Matrix3 &b, const F32 &w)
-{
- mMatrix[VX][VX] = llv4lerp(a.mMatrix[VX][VX], b.mMatrix[VX][VX], w);
- mMatrix[VX][VY] = llv4lerp(a.mMatrix[VX][VY], b.mMatrix[VX][VY], w);
- mMatrix[VX][VZ] = llv4lerp(a.mMatrix[VX][VZ], b.mMatrix[VX][VZ], w);
-
- mMatrix[VY][VX] = llv4lerp(a.mMatrix[VY][VX], b.mMatrix[VY][VX], w);
- mMatrix[VY][VY] = llv4lerp(a.mMatrix[VY][VY], b.mMatrix[VY][VY], w);
- mMatrix[VY][VZ] = llv4lerp(a.mMatrix[VY][VZ], b.mMatrix[VY][VZ], w);
-
- mMatrix[VZ][VX] = llv4lerp(a.mMatrix[VZ][VX], b.mMatrix[VZ][VX], w);
- mMatrix[VZ][VY] = llv4lerp(a.mMatrix[VZ][VY], b.mMatrix[VZ][VY], w);
- mMatrix[VZ][VZ] = llv4lerp(a.mMatrix[VZ][VZ], b.mMatrix[VZ][VZ], w);
-}
-
-inline void LLV4Matrix3::multiply(const LLVector3 &a, LLVector3& o) const
-{
- o.setVec( a.mV[VX] * mMatrix[VX][VX] +
- a.mV[VY] * mMatrix[VY][VX] +
- a.mV[VZ] * mMatrix[VZ][VX],
-
- a.mV[VX] * mMatrix[VX][VY] +
- a.mV[VY] * mMatrix[VY][VY] +
- a.mV[VZ] * mMatrix[VZ][VY],
-
- a.mV[VX] * mMatrix[VX][VZ] +
- a.mV[VY] * mMatrix[VY][VZ] +
- a.mV[VZ] * mMatrix[VZ][VZ]);
-}
-
-inline void LLV4Matrix3::multiply(const LLVector4 &a, LLV4Vector3& o) const
-{
- o.setVec( a.mV[VX] * mMatrix[VX][VX] +
- a.mV[VY] * mMatrix[VY][VX] +
- a.mV[VZ] * mMatrix[VZ][VX],
-
- a.mV[VX] * mMatrix[VX][VY] +
- a.mV[VY] * mMatrix[VY][VY] +
- a.mV[VZ] * mMatrix[VZ][VY],
-
- a.mV[VX] * mMatrix[VX][VZ] +
- a.mV[VY] * mMatrix[VY][VZ] +
- a.mV[VZ] * mMatrix[VZ][VZ]);
-}
-
-inline void LLV4Matrix3::multiply(const LLVector3 &a, LLV4Vector3& o) const
-{
- o.setVec( a.mV[VX] * mMatrix[VX][VX] +
- a.mV[VY] * mMatrix[VY][VX] +
- a.mV[VZ] * mMatrix[VZ][VX],
-
- a.mV[VX] * mMatrix[VX][VY] +
- a.mV[VY] * mMatrix[VY][VY] +
- a.mV[VZ] * mMatrix[VZ][VY],
-
- a.mV[VX] * mMatrix[VX][VZ] +
- a.mV[VY] * mMatrix[VY][VZ] +
- a.mV[VZ] * mMatrix[VZ][VZ]);
-}
-
-//-----------------------------------------------------------------------------
-//-----------------------------------------------------------------------------
-// LLV4Matrix3
-//-----------------------------------------------------------------------------
-//-----------------------------------------------------------------------------
-
-#endif
-
-inline const LLV4Matrix3& LLV4Matrix3::transpose()
-{
-#if LL_VECTORIZE && defined(_MM_TRANSPOSE4_PS)
- _MM_TRANSPOSE4_PS(mV[VX], mV[VY], mV[VZ], mV[VW]);
- return *this;
-#else
- F32 temp;
- temp = mMatrix[VX][VY]; mMatrix[VX][VY] = mMatrix[VY][VX]; mMatrix[VY][VX] = temp;
- temp = mMatrix[VX][VZ]; mMatrix[VX][VZ] = mMatrix[VZ][VX]; mMatrix[VZ][VX] = temp;
- temp = mMatrix[VY][VZ]; mMatrix[VY][VZ] = mMatrix[VZ][VY]; mMatrix[VZ][VY] = temp;
-#endif
- return *this;
-}
-
-inline const LLV4Matrix3& LLV4Matrix3::operator=(const LLMatrix3& a)
-{
- memcpy(mMatrix[VX], a.mMatrix[VX], sizeof(F32) * 3 );
- memcpy(mMatrix[VY], a.mMatrix[VY], sizeof(F32) * 3 );
- memcpy(mMatrix[VZ], a.mMatrix[VZ], sizeof(F32) * 3 );
- return *this;
-}
-
-inline LLVector3 operator*(const LLVector3& a, const LLV4Matrix3& b)
-{
- return LLVector3(
- a.mV[VX] * b.mMatrix[VX][VX] +
- a.mV[VY] * b.mMatrix[VY][VX] +
- a.mV[VZ] * b.mMatrix[VZ][VX],
-
- a.mV[VX] * b.mMatrix[VX][VY] +
- a.mV[VY] * b.mMatrix[VY][VY] +
- a.mV[VZ] * b.mMatrix[VZ][VY],
-
- a.mV[VX] * b.mMatrix[VX][VZ] +
- a.mV[VY] * b.mMatrix[VY][VZ] +
- a.mV[VZ] * b.mMatrix[VZ][VZ] );
-}
-
-#endif
diff --git a/indra/llmath/llv4matrix4.h b/indra/llmath/llv4matrix4.h
deleted file mode 100644
index 2eb49d9294..0000000000
--- a/indra/llmath/llv4matrix4.h
+++ /dev/null
@@ -1,249 +0,0 @@
-/**
- * @file llviewerjointmesh.cpp
- * @brief LLV4* class header file - vector processor enabled math
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-#ifndef LL_LLV4MATRIX4_H
-#define LL_LLV4MATRIX4_H
-
-#include "llv4math.h"
-#include "llv4matrix3.h" // just for operator LLV4Matrix3()
-#include "llv4vector3.h"
-
-//-----------------------------------------------------------------------------
-//-----------------------------------------------------------------------------
-// LLV4Matrix4
-//-----------------------------------------------------------------------------
-//-----------------------------------------------------------------------------
-
-LL_LLV4MATH_ALIGN_PREFIX
-
-class LLV4Matrix4
-{
-public:
- union {
- F32 mMatrix[LLV4_NUM_AXIS][LLV4_NUM_AXIS];
- V4F32 mV[LLV4_NUM_AXIS];
- };
-
- void lerp(const LLV4Matrix4 &a, const LLV4Matrix4 &b, const F32 &w);
- void multiply(const LLVector3 &a, LLVector3& o) const;
- void multiply(const LLVector3 &a, LLV4Vector3& o) const;
-
- const LLV4Matrix4& transpose();
- const LLV4Matrix4& translate(const LLVector3 &vec);
- const LLV4Matrix4& translate(const LLV4Vector3 &vec);
- const LLV4Matrix4& operator=(const LLMatrix4& a);
-
- operator LLMatrix4() const { return *(reinterpret_cast<const LLMatrix4*>(const_cast<const F32*>(&mMatrix[0][0]))); }
- operator LLV4Matrix3() const { return *(reinterpret_cast<const LLV4Matrix3*>(const_cast<const F32*>(&mMatrix[0][0]))); }
-
- friend LLVector3 operator*(const LLVector3 &a, const LLV4Matrix4 &b);
-}
-
-LL_LLV4MATH_ALIGN_POSTFIX;
-
-//-----------------------------------------------------------------------------
-//-----------------------------------------------------------------------------
-// LLV4Matrix4 - SSE
-//-----------------------------------------------------------------------------
-//-----------------------------------------------------------------------------
-
-#if LL_VECTORIZE
-
-inline void LLV4Matrix4::lerp(const LLV4Matrix4 &a, const LLV4Matrix4 &b, const F32 &w)
-{
- __m128 vw = _mm_set1_ps(w);
- mV[VX] = _mm_add_ps(_mm_mul_ps(_mm_sub_ps(b.mV[VX], a.mV[VX]), vw), a.mV[VX]); // ( b - a ) * w + a
- mV[VY] = _mm_add_ps(_mm_mul_ps(_mm_sub_ps(b.mV[VY], a.mV[VY]), vw), a.mV[VY]);
- mV[VZ] = _mm_add_ps(_mm_mul_ps(_mm_sub_ps(b.mV[VZ], a.mV[VZ]), vw), a.mV[VZ]);
- mV[VW] = _mm_add_ps(_mm_mul_ps(_mm_sub_ps(b.mV[VW], a.mV[VW]), vw), a.mV[VW]);
-}
-
-inline void LLV4Matrix4::multiply(const LLVector3 &a, LLVector3& o) const
-{
- LLV4Vector3 j;
- j.v = _mm_add_ps(mV[VW], _mm_mul_ps(_mm_set1_ps(a.mV[VX]), mV[VX])); // ( ax * vx ) + vw
- j.v = _mm_add_ps(j.v , _mm_mul_ps(_mm_set1_ps(a.mV[VY]), mV[VY]));
- j.v = _mm_add_ps(j.v , _mm_mul_ps(_mm_set1_ps(a.mV[VZ]), mV[VZ]));
- o.setVec(j.mV);
-}
-
-inline void LLV4Matrix4::multiply(const LLVector3 &a, LLV4Vector3& o) const
-{
- o.v = _mm_add_ps(mV[VW], _mm_mul_ps(_mm_set1_ps(a.mV[VX]), mV[VX])); // ( ax * vx ) + vw
- o.v = _mm_add_ps(o.v , _mm_mul_ps(_mm_set1_ps(a.mV[VY]), mV[VY]));
- o.v = _mm_add_ps(o.v , _mm_mul_ps(_mm_set1_ps(a.mV[VZ]), mV[VZ]));
-}
-
-inline const LLV4Matrix4& LLV4Matrix4::translate(const LLV4Vector3 &vec)
-{
- mV[VW] = _mm_add_ps(mV[VW], vec.v);
- return (*this);
-}
-
-//-----------------------------------------------------------------------------
-//-----------------------------------------------------------------------------
-// LLV4Matrix4
-//-----------------------------------------------------------------------------
-//-----------------------------------------------------------------------------
-
-#else
-
-inline void LLV4Matrix4::lerp(const LLV4Matrix4 &a, const LLV4Matrix4 &b, const F32 &w)
-{
- mMatrix[VX][VX] = llv4lerp(a.mMatrix[VX][VX], b.mMatrix[VX][VX], w);
- mMatrix[VX][VY] = llv4lerp(a.mMatrix[VX][VY], b.mMatrix[VX][VY], w);
- mMatrix[VX][VZ] = llv4lerp(a.mMatrix[VX][VZ], b.mMatrix[VX][VZ], w);
-
- mMatrix[VY][VX] = llv4lerp(a.mMatrix[VY][VX], b.mMatrix[VY][VX], w);
- mMatrix[VY][VY] = llv4lerp(a.mMatrix[VY][VY], b.mMatrix[VY][VY], w);
- mMatrix[VY][VZ] = llv4lerp(a.mMatrix[VY][VZ], b.mMatrix[VY][VZ], w);
-
- mMatrix[VZ][VX] = llv4lerp(a.mMatrix[VZ][VX], b.mMatrix[VZ][VX], w);
- mMatrix[VZ][VY] = llv4lerp(a.mMatrix[VZ][VY], b.mMatrix[VZ][VY], w);
- mMatrix[VZ][VZ] = llv4lerp(a.mMatrix[VZ][VZ], b.mMatrix[VZ][VZ], w);
-
- mMatrix[VW][VX] = llv4lerp(a.mMatrix[VW][VX], b.mMatrix[VW][VX], w);
- mMatrix[VW][VY] = llv4lerp(a.mMatrix[VW][VY], b.mMatrix[VW][VY], w);
- mMatrix[VW][VZ] = llv4lerp(a.mMatrix[VW][VZ], b.mMatrix[VW][VZ], w);
-}
-
-inline void LLV4Matrix4::multiply(const LLVector3 &a, LLVector3& o) const
-{
- o.setVec( a.mV[VX] * mMatrix[VX][VX] +
- a.mV[VY] * mMatrix[VY][VX] +
- a.mV[VZ] * mMatrix[VZ][VX] +
- mMatrix[VW][VX],
-
- a.mV[VX] * mMatrix[VX][VY] +
- a.mV[VY] * mMatrix[VY][VY] +
- a.mV[VZ] * mMatrix[VZ][VY] +
- mMatrix[VW][VY],
-
- a.mV[VX] * mMatrix[VX][VZ] +
- a.mV[VY] * mMatrix[VY][VZ] +
- a.mV[VZ] * mMatrix[VZ][VZ] +
- mMatrix[VW][VZ]);
-}
-
-inline void LLV4Matrix4::multiply(const LLVector3 &a, LLV4Vector3& o) const
-{
- o.setVec( a.mV[VX] * mMatrix[VX][VX] +
- a.mV[VY] * mMatrix[VY][VX] +
- a.mV[VZ] * mMatrix[VZ][VX] +
- mMatrix[VW][VX],
-
- a.mV[VX] * mMatrix[VX][VY] +
- a.mV[VY] * mMatrix[VY][VY] +
- a.mV[VZ] * mMatrix[VZ][VY] +
- mMatrix[VW][VY],
-
- a.mV[VX] * mMatrix[VX][VZ] +
- a.mV[VY] * mMatrix[VY][VZ] +
- a.mV[VZ] * mMatrix[VZ][VZ] +
- mMatrix[VW][VZ]);
-}
-
-inline const LLV4Matrix4& LLV4Matrix4::translate(const LLV4Vector3 &vec)
-{
- mMatrix[3][0] += vec.mV[0];
- mMatrix[3][1] += vec.mV[1];
- mMatrix[3][2] += vec.mV[2];
- return (*this);
-}
-
-//-----------------------------------------------------------------------------
-//-----------------------------------------------------------------------------
-// LLV4Matrix4
-//-----------------------------------------------------------------------------
-//-----------------------------------------------------------------------------
-
-#endif
-
-inline const LLV4Matrix4& LLV4Matrix4::operator=(const LLMatrix4& a)
-{
- memcpy(mMatrix, a.mMatrix, sizeof(F32) * 16 );
- return *this;
-}
-
-inline const LLV4Matrix4& LLV4Matrix4::transpose()
-{
-#if LL_VECTORIZE && defined(_MM_TRANSPOSE4_PS)
- _MM_TRANSPOSE4_PS(mV[VX], mV[VY], mV[VZ], mV[VW]);
-#else
- LLV4Matrix4 mat;
- mat.mMatrix[0][0] = mMatrix[0][0];
- mat.mMatrix[1][0] = mMatrix[0][1];
- mat.mMatrix[2][0] = mMatrix[0][2];
- mat.mMatrix[3][0] = mMatrix[0][3];
-
- mat.mMatrix[0][1] = mMatrix[1][0];
- mat.mMatrix[1][1] = mMatrix[1][1];
- mat.mMatrix[2][1] = mMatrix[1][2];
- mat.mMatrix[3][1] = mMatrix[1][3];
-
- mat.mMatrix[0][2] = mMatrix[2][0];
- mat.mMatrix[1][2] = mMatrix[2][1];
- mat.mMatrix[2][2] = mMatrix[2][2];
- mat.mMatrix[3][2] = mMatrix[2][3];
-
- mat.mMatrix[0][3] = mMatrix[3][0];
- mat.mMatrix[1][3] = mMatrix[3][1];
- mat.mMatrix[2][3] = mMatrix[3][2];
- mat.mMatrix[3][3] = mMatrix[3][3];
-
- *this = mat;
-#endif
- return *this;
-}
-
-inline const LLV4Matrix4& LLV4Matrix4::translate(const LLVector3 &vec)
-{
- mMatrix[3][0] += vec.mV[0];
- mMatrix[3][1] += vec.mV[1];
- mMatrix[3][2] += vec.mV[2];
- return (*this);
-}
-
-inline LLVector3 operator*(const LLVector3 &a, const LLV4Matrix4 &b)
-{
- return LLVector3(a.mV[VX] * b.mMatrix[VX][VX] +
- a.mV[VY] * b.mMatrix[VY][VX] +
- a.mV[VZ] * b.mMatrix[VZ][VX] +
- b.mMatrix[VW][VX],
-
- a.mV[VX] * b.mMatrix[VX][VY] +
- a.mV[VY] * b.mMatrix[VY][VY] +
- a.mV[VZ] * b.mMatrix[VZ][VY] +
- b.mMatrix[VW][VY],
-
- a.mV[VX] * b.mMatrix[VX][VZ] +
- a.mV[VY] * b.mMatrix[VY][VZ] +
- a.mV[VZ] * b.mMatrix[VZ][VZ] +
- b.mMatrix[VW][VZ]);
-}
-
-
-#endif
diff --git a/indra/llmath/llv4vector3.h b/indra/llmath/llv4vector3.h
deleted file mode 100644
index a340d53f5a..0000000000
--- a/indra/llmath/llv4vector3.h
+++ /dev/null
@@ -1,80 +0,0 @@
-/**
- * @file llviewerjointmesh.cpp
- * @brief LLV4* class header file - vector processor enabled math
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-#ifndef LL_LLV4VECTOR3_H
-#define LL_LLV4VECTOR3_H
-
-#include "llv4math.h"
-
-//-----------------------------------------------------------------------------
-//-----------------------------------------------------------------------------
-// LLV4Vector3
-//-----------------------------------------------------------------------------
-//-----------------------------------------------------------------------------
-
-LL_LLV4MATH_ALIGN_PREFIX
-
-class LLV4Vector3
-{
-public:
- union {
- F32 mV[LLV4_NUM_AXIS];
- V4F32 v;
- };
-
- enum {
- ALIGNMENT = 16
- };
-
- void setVec(F32 x, F32 y, F32 z);
- void setVec(F32 a);
-}
-
-LL_LLV4MATH_ALIGN_POSTFIX;
-
-//-----------------------------------------------------------------------------
-//-----------------------------------------------------------------------------
-// LLV4Vector3
-//-----------------------------------------------------------------------------
-//-----------------------------------------------------------------------------
-
-inline void LLV4Vector3::setVec(F32 x, F32 y, F32 z)
-{
- mV[VX] = x;
- mV[VY] = y;
- mV[VZ] = z;
-}
-
-inline void LLV4Vector3::setVec(F32 a)
-{
-#if LL_VECTORIZE
- v = _mm_set1_ps(a);
-#else
- setVec(a, a, a);
-#endif
-}
-
-#endif
diff --git a/indra/llmath/llvolume.cpp b/indra/llmath/llvolume.cpp
index 1a95f9cd46..761fc171c4 100644
--- a/indra/llmath/llvolume.cpp
+++ b/indra/llmath/llvolume.cpp
@@ -2078,6 +2078,7 @@ LLVolume::LLVolume(const LLVolumeParams &params, const F32 detail, const BOOL ge
mFaceMask = 0x0;
mDetail = detail;
mSculptLevel = -2;
+ mSurfaceArea = 1.f; //only calculated for sculpts, defaults to 1 for all other prims
mIsMeshAssetLoaded = FALSE;
mLODScaleBias.setVec(1,1,1);
mHullPoints = NULL;
@@ -3144,6 +3145,8 @@ void LLVolume::sculpt(U16 sculpt_width, U16 sculpt_height, S8 sculpt_components,
{
F32 area = sculptGetSurfaceArea();
+ mSurfaceArea = area;
+
const F32 SCULPT_MAX_AREA = 384.f;
if (area < SCULPT_MIN_AREA || area > SCULPT_MAX_AREA)
@@ -4305,15 +4308,25 @@ S32 LLVolume::getNumTriangleIndices() const
}
-S32 LLVolume::getNumTriangles() const
+S32 LLVolume::getNumTriangles(S32* vcount) const
{
U32 triangle_count = 0;
+ U32 vertex_count = 0;
for (S32 i = 0; i < getNumVolumeFaces(); ++i)
{
- triangle_count += getVolumeFace(i).mNumIndices/3;
+ const LLVolumeFace& face = getVolumeFace(i);
+ triangle_count += face.mNumIndices/3;
+
+ vertex_count += face.mNumVertices;
}
+
+ if (vcount)
+ {
+ *vcount = vertex_count;
+ }
+
return triangle_count;
}
@@ -4607,18 +4620,83 @@ S32 LLVolume::lineSegmentIntersect(const LLVector4a& start, const LLVector4a& en
genBinormals(i);
}
- if (!face.mOctree)
- {
- face.createOctree();
- }
-
- //LLVector4a* p = (LLVector4a*) face.mPositions;
+ if (isUnique())
+ { //don't bother with an octree for flexi volumes
+ U32 tri_count = face.mNumIndices/3;
+
+ for (U32 j = 0; j < tri_count; ++j)
+ {
+ U16 idx0 = face.mIndices[j*3+0];
+ U16 idx1 = face.mIndices[j*3+1];
+ U16 idx2 = face.mIndices[j*3+2];
+
+ const LLVector4a& v0 = face.mPositions[idx0];
+ const LLVector4a& v1 = face.mPositions[idx1];
+ const LLVector4a& v2 = face.mPositions[idx2];
+
+ F32 a,b,t;
- LLOctreeTriangleRayIntersect intersect(start, dir, &face, &closest_t, intersection, tex_coord, normal, bi_normal);
- intersect.traverse(face.mOctree);
- if (intersect.mHitFace)
+ if (LLTriangleRayIntersect(v0, v1, v2,
+ start, dir, a, b, t))
+ {
+ if ((t >= 0.f) && // if hit is after start
+ (t <= 1.f) && // and before end
+ (t < closest_t)) // and this hit is closer
+ {
+ closest_t = t;
+ hit_face = i;
+
+ if (intersection != NULL)
+ {
+ LLVector4a intersect = dir;
+ intersect.mul(closest_t);
+ intersect.add(start);
+ intersection->set(intersect.getF32ptr());
+ }
+
+
+ if (tex_coord != NULL)
+ {
+ LLVector2* tc = (LLVector2*) face.mTexCoords;
+ *tex_coord = ((1.f - a - b) * tc[idx0] +
+ a * tc[idx1] +
+ b * tc[idx2]);
+
+ }
+
+ if (normal!= NULL)
+ {
+ LLVector4* norm = (LLVector4*) face.mNormals;
+
+ *normal = ((1.f - a - b) * LLVector3(norm[idx0]) +
+ a * LLVector3(norm[idx1]) +
+ b * LLVector3(norm[idx2]));
+ }
+
+ if (bi_normal != NULL)
+ {
+ LLVector4* binormal = (LLVector4*) face.mBinormals;
+ *bi_normal = ((1.f - a - b) * LLVector3(binormal[idx0]) +
+ a * LLVector3(binormal[idx1]) +
+ b * LLVector3(binormal[idx2]));
+ }
+ }
+ }
+ }
+ }
+ else
{
- hit_face = i;
+ if (!face.mOctree)
+ {
+ face.createOctree();
+ }
+
+ LLOctreeTriangleRayIntersect intersect(start, dir, &face, &closest_t, intersection, tex_coord, normal, bi_normal);
+ intersect.traverse(face.mOctree);
+ if (intersect.mHitFace)
+ {
+ hit_face = i;
+ }
}
}
}
diff --git a/indra/llmath/llvolume.h b/indra/llmath/llvolume.h
index f0e59a3c00..76cf9de613 100644
--- a/indra/llmath/llvolume.h
+++ b/indra/llmath/llvolume.h
@@ -963,6 +963,7 @@ public:
S32 getNumFaces() const;
S32 getNumVolumeFaces() const { return mVolumeFaces.size(); }
F32 getDetail() const { return mDetail; }
+ F32 getSurfaceArea() const { return mSurfaceArea; }
const LLVolumeParams& getParams() const { return mParams; }
LLVolumeParams getCopyOfParams() const { return mParams; }
const LLProfile& getProfile() const { return *mProfilep; }
@@ -990,7 +991,7 @@ public:
S32 getNumTriangleIndices() const;
static void getLoDTriangleCounts(const LLVolumeParams& params, S32* counts);
- S32 getNumTriangles() const;
+ S32 getNumTriangles(S32* vcount = NULL) const;
void generateSilhouetteVertices(std::vector<LLVector3> &vertices,
std::vector<LLVector3> &normals,
@@ -1065,6 +1066,7 @@ public:
BOOL mUnique;
F32 mDetail;
S32 mSculptLevel;
+ F32 mSurfaceArea; //unscaled surface area
BOOL mIsMeshAssetLoaded;
LLVolumeParams mParams;
diff --git a/indra/llmath/llvolumemgr.cpp b/indra/llmath/llvolumemgr.cpp
index 42180197fe..c60b750088 100644
--- a/indra/llmath/llvolumemgr.cpp
+++ b/indra/llmath/llvolumemgr.cpp
@@ -49,7 +49,7 @@ LLVolumeMgr::LLVolumeMgr()
{
// the LLMutex magic interferes with easy unit testing,
// so you now must manually call useMutex() to use it
- //mDataMutex = new LLMutex;
+ //mDataMutex = new LLMutex(gAPRPoolp);
}
LLVolumeMgr::~LLVolumeMgr()
@@ -216,7 +216,7 @@ void LLVolumeMgr::useMutex()
{
if (!mDataMutex)
{
- mDataMutex = new LLMutex;
+ mDataMutex = new LLMutex(gAPRPoolp);
}
}
diff --git a/indra/llmessage/llares.cpp b/indra/llmessage/llares.cpp
index fab9858b69..5a67035ed1 100644
--- a/indra/llmessage/llares.cpp
+++ b/indra/llmessage/llares.cpp
@@ -28,7 +28,6 @@
#include "linden_common.h"
#include "llares.h"
-#include "llscopedvolatileaprpool.h"
#include <ares_dns.h>
#include <ares_version.h>
@@ -465,6 +464,11 @@ void LLAres::search(const std::string &query, LLResType type,
bool LLAres::process(U64 timeout)
{
+ if (!gAPRPoolp)
+ {
+ ll_init_apr();
+ }
+
ares_socket_t socks[ARES_GETSOCK_MAXNUM];
apr_pollfd_t aprFds[ARES_GETSOCK_MAXNUM];
apr_int32_t nsds = 0;
@@ -478,7 +482,10 @@ bool LLAres::process(U64 timeout)
return nsds > 0;
}
- LLScopedVolatileAPRPool scoped_pool;
+ apr_status_t status;
+ LLAPRPool pool;
+ status = pool.getStatus() ;
+ ll_apr_assert_status(status);
for (int i = 0; i < ARES_GETSOCK_MAXNUM; i++)
{
@@ -495,7 +502,7 @@ bool LLAres::process(U64 timeout)
apr_socket_t *aprSock = NULL;
- apr_status_t status = apr_os_sock_put(&aprSock, (apr_os_sock_t *) &socks[i], scoped_pool);
+ status = apr_os_sock_put(&aprSock, (apr_os_sock_t *) &socks[i], pool.getAPRPool());
if (status != APR_SUCCESS)
{
ll_apr_warn_status(status);
@@ -504,7 +511,7 @@ bool LLAres::process(U64 timeout)
aprFds[nactive].desc.s = aprSock;
aprFds[nactive].desc_type = APR_POLL_SOCKET;
- aprFds[nactive].p = scoped_pool;
+ aprFds[nactive].p = pool.getAPRPool();
aprFds[nactive].rtnevents = 0;
aprFds[nactive].client_data = &socks[i];
@@ -513,7 +520,7 @@ bool LLAres::process(U64 timeout)
if (nactive > 0)
{
- apr_status_t status = apr_poll(aprFds, nactive, &nsds, timeout);
+ status = apr_poll(aprFds, nactive, &nsds, timeout);
if (status != APR_SUCCESS && status != APR_TIMEUP)
{
diff --git a/indra/llmessage/llassetstorage.cpp b/indra/llmessage/llassetstorage.cpp
index 31cdb1219b..9b86daebe5 100644
--- a/indra/llmessage/llassetstorage.cpp
+++ b/indra/llmessage/llassetstorage.cpp
@@ -149,8 +149,8 @@ void LLAssetInfo::setFromNameValue( const LLNameValue& nv )
setName( buf );
buf.assign( str, pos2, std::string::npos );
setDescription( buf );
- llinfos << "uuid: " << mUuid << llendl;
- llinfos << "creator: " << mCreatorID << llendl;
+ LL_DEBUGS("AssetStorage") << "uuid: " << mUuid << llendl;
+ LL_DEBUGS("AssetStorage") << "creator: " << mCreatorID << llendl;
}
///----------------------------------------------------------------------------
@@ -434,9 +434,9 @@ bool LLAssetStorage::findInStaticVFSAndInvokeCallback(const LLUUID& uuid, LLAsse
// IW - uuid is passed by value to avoid side effects, please don't re-add &
void LLAssetStorage::getAssetData(const LLUUID uuid, LLAssetType::EType type, LLGetAssetCallback callback, void *user_data, BOOL is_priority)
{
- lldebugs << "LLAssetStorage::getAssetData() - " << uuid << "," << LLAssetType::lookup(type) << llendl;
+ LL_DEBUGS("AssetStorage") << "LLAssetStorage::getAssetData() - " << uuid << "," << LLAssetType::lookup(type) << llendl;
- llinfos << "ASSET_TRACE requesting " << uuid << " type " << LLAssetType::lookup(type) << llendl;
+ LL_DEBUGS("AssetStorage") << "ASSET_TRACE requesting " << uuid << " type " << LLAssetType::lookup(type) << llendl;
if (user_data)
{
@@ -446,7 +446,7 @@ void LLAssetStorage::getAssetData(const LLUUID uuid, LLAssetType::EType type, LL
if (mShutDown)
{
- llinfos << "ASSET_TRACE cancelled " << uuid << " type " << LLAssetType::lookup(type) << " shutting down" << llendl;
+ LL_DEBUGS("AssetStorage") << "ASSET_TRACE cancelled " << uuid << " type " << LLAssetType::lookup(type) << " shutting down" << llendl;
if (callback)
{
@@ -468,7 +468,7 @@ void LLAssetStorage::getAssetData(const LLUUID uuid, LLAssetType::EType type, LL
// Try static VFS first.
if (findInStaticVFSAndInvokeCallback(uuid,type,callback,user_data))
{
- llinfos << "ASSET_TRACE asset " << uuid << " found in static VFS" << llendl;
+ LL_DEBUGS("AssetStorage") << "ASSET_TRACE asset " << uuid << " found in static VFS" << llendl;
return;
}
@@ -486,7 +486,7 @@ void LLAssetStorage::getAssetData(const LLUUID uuid, LLAssetType::EType type, LL
callback(mVFS, uuid, type, user_data, LL_ERR_NOERR, LL_EXSTAT_VFS_CACHED);
}
- llinfos << "ASSET_TRACE asset " << uuid << " found in VFS" << llendl;
+ LL_DEBUGS("AssetStorage") << "ASSET_TRACE asset " << uuid << " found in VFS" << llendl;
}
else
{
@@ -520,7 +520,7 @@ void LLAssetStorage::getAssetData(const LLUUID uuid, LLAssetType::EType type, LL
}
if (duplicate)
{
- llinfos << "Adding additional non-duplicate request for asset " << uuid
+ LL_DEBUGS("AssetStorage") << "Adding additional non-duplicate request for asset " << uuid
<< "." << LLAssetType::lookup(type) << llendl;
}
@@ -584,9 +584,9 @@ void LLAssetStorage::downloadCompleteCallback(
LLAssetType::EType file_type,
void* user_data, LLExtStat ext_status)
{
- llinfos << "ASSET_TRACE asset " << file_id << " downloadCompleteCallback" << llendl;
+ LL_DEBUGS("AssetStorage") << "ASSET_TRACE asset " << file_id << " downloadCompleteCallback" << llendl;
- lldebugs << "LLAssetStorage::downloadCompleteCallback() for " << file_id
+ LL_DEBUGS("AssetStorage") << "LLAssetStorage::downloadCompleteCallback() for " << file_id
<< "," << LLAssetType::lookup(file_type) << llendl;
LLAssetRequest* req = (LLAssetRequest*)user_data;
if(!req)
@@ -731,7 +731,7 @@ void LLAssetStorage::getEstateAsset(const LLHost &object_sim, const LLUUID &agen
tpvf.setAsset(asset_id, atype);
tpvf.setCallback(downloadEstateAssetCompleteCallback, req);
- llinfos << "Starting transfer for " << asset_id << llendl;
+ LL_DEBUGS("AssetStorage") << "Starting transfer for " << asset_id << llendl;
LLTransferTargetChannel *ttcp = gTransferManager.getTargetChannel(source_host, LLTCT_ASSET);
ttcp->requestTransfer(spe, tpvf, 100.f + (is_priority ? 1.f : 0.f));
}
@@ -871,7 +871,7 @@ void LLAssetStorage::getInvItemAsset(const LLHost &object_sim, const LLUUID &age
tpvf.setAsset(asset_id, atype);
tpvf.setCallback(downloadInvItemCompleteCallback, req);
- llinfos << "Starting transfer for inventory asset "
+ LL_DEBUGS("AssetStorage") << "Starting transfer for inventory asset "
<< item_id << " owned by " << owner_id << "," << task_id
<< llendl;
LLTransferTargetChannel *ttcp = gTransferManager.getTargetChannel(source_host, LLTCT_ASSET);
@@ -1211,7 +1211,7 @@ bool LLAssetStorage::deletePendingRequest(LLAssetStorage::ERequestType rt,
request_list_t* requests = getRequestList(rt);
if (deletePendingRequestImpl(requests, asset_type, asset_id))
{
- llinfos << "Asset " << getRequestName(rt) << " request for "
+ LL_DEBUGS("AssetStorage") << "Asset " << getRequestName(rt) << " request for "
<< asset_id << "." << LLAssetType::lookup(asset_type)
<< " removed from pending queue." << llendl;
return true;
@@ -1307,7 +1307,7 @@ void LLAssetStorage::getAssetData(const LLUUID uuid, LLAssetType::EType type, vo
user_data == ((LLLegacyAssetRequest *)tmp->mUserData)->mUserData)
{
// this is a duplicate from the same subsystem - throw it away
- llinfos << "Discarding duplicate request for UUID " << uuid << llendl;
+ LL_DEBUGS("AssetStorage") << "Discarding duplicate request for UUID " << uuid << llendl;
return;
}
}
@@ -1490,7 +1490,7 @@ void LLAssetStorage::reportMetric( const LLUUID& asset_id, const LLAssetType::ET
{
if( !metric_recipient )
{
- llinfos << "Couldn't store LLAssetStoreage::reportMetric - no metrics_recipient" << llendl;
+ LL_DEBUGS("AssetStorage") << "Couldn't store LLAssetStoreage::reportMetric - no metrics_recipient" << llendl;
return;
}
diff --git a/indra/llmessage/llbuffer.cpp b/indra/llmessage/llbuffer.cpp
index 0316797f00..250cace6e9 100644
--- a/indra/llmessage/llbuffer.cpp
+++ b/indra/llmessage/llbuffer.cpp
@@ -32,6 +32,9 @@
#include "llmath.h"
#include "llmemtype.h"
#include "llstl.h"
+#include "llthread.h"
+
+#define ASSERT_LLBUFFERARRAY_MUTEX_LOCKED llassert(!mMutexp || mMutexp->isSelfLocked());
/**
* LLSegment
@@ -224,7 +227,8 @@ void LLHeapBuffer::allocate(S32 size)
* LLBufferArray
*/
LLBufferArray::LLBufferArray() :
- mNextBaseChannel(0)
+ mNextBaseChannel(0),
+ mMutexp(NULL)
{
LLMemType m1(LLMemType::MTYPE_IO_BUFFER);
}
@@ -233,6 +237,8 @@ LLBufferArray::~LLBufferArray()
{
LLMemType m1(LLMemType::MTYPE_IO_BUFFER);
std::for_each(mBuffers.begin(), mBuffers.end(), DeletePointer());
+
+ delete mMutexp;
}
// static
@@ -243,14 +249,57 @@ LLChannelDescriptors LLBufferArray::makeChannelConsumer(
return rv;
}
+void LLBufferArray::lock()
+{
+ if(mMutexp)
+ {
+ mMutexp->lock() ;
+ }
+}
+
+void LLBufferArray::unlock()
+{
+ if(mMutexp)
+ {
+ mMutexp->unlock() ;
+ }
+}
+
+LLMutex* LLBufferArray::getMutex()
+{
+ return mMutexp ;
+}
+
+void LLBufferArray::setThreaded(bool threaded)
+{
+ if(threaded)
+ {
+ if(!mMutexp)
+ {
+ mMutexp = new LLMutex(NULL);
+ }
+ }
+ else
+ {
+ if(mMutexp)
+ {
+ delete mMutexp ;
+ mMutexp = NULL ;
+ }
+ }
+}
+
LLChannelDescriptors LLBufferArray::nextChannel()
{
LLChannelDescriptors rv(mNextBaseChannel++);
return rv;
}
+//mMutexp should be locked before calling this.
S32 LLBufferArray::capacity() const
{
+ ASSERT_LLBUFFERARRAY_MUTEX_LOCKED
+
S32 total = 0;
const_buffer_iterator_t iter = mBuffers.begin();
const_buffer_iterator_t end = mBuffers.end();
@@ -263,6 +312,8 @@ S32 LLBufferArray::capacity() const
bool LLBufferArray::append(S32 channel, const U8* src, S32 len)
{
+ LLMutexLock lock(mMutexp) ;
+
LLMemType m1(LLMemType::MTYPE_IO_BUFFER);
std::vector<LLSegment> segments;
if(copyIntoBuffers(channel, src, len, segments))
@@ -273,8 +324,11 @@ bool LLBufferArray::append(S32 channel, const U8* src, S32 len)
return false;
}
+//mMutexp should be locked before calling this.
bool LLBufferArray::prepend(S32 channel, const U8* src, S32 len)
{
+ ASSERT_LLBUFFERARRAY_MUTEX_LOCKED
+
LLMemType m1(LLMemType::MTYPE_IO_BUFFER);
std::vector<LLSegment> segments;
if(copyIntoBuffers(channel, src, len, segments))
@@ -293,6 +347,8 @@ bool LLBufferArray::insertAfter(
{
LLMemType m1(LLMemType::MTYPE_IO_BUFFER);
std::vector<LLSegment> segments;
+
+ LLMutexLock lock(mMutexp) ;
if(mSegments.end() != segment)
{
++segment;
@@ -305,8 +361,11 @@ bool LLBufferArray::insertAfter(
return false;
}
+//mMutexp should be locked before calling this.
LLBufferArray::segment_iterator_t LLBufferArray::splitAfter(U8* address)
{
+ ASSERT_LLBUFFERARRAY_MUTEX_LOCKED
+
LLMemType m1(LLMemType::MTYPE_IO_BUFFER);
segment_iterator_t end = mSegments.end();
segment_iterator_t it = getSegment(address);
@@ -335,20 +394,26 @@ LLBufferArray::segment_iterator_t LLBufferArray::splitAfter(U8* address)
return rv;
}
+//mMutexp should be locked before calling this.
LLBufferArray::segment_iterator_t LLBufferArray::beginSegment()
{
+ ASSERT_LLBUFFERARRAY_MUTEX_LOCKED
return mSegments.begin();
}
+//mMutexp should be locked before calling this.
LLBufferArray::segment_iterator_t LLBufferArray::endSegment()
{
+ ASSERT_LLBUFFERARRAY_MUTEX_LOCKED
return mSegments.end();
}
+//mMutexp should be locked before calling this.
LLBufferArray::segment_iterator_t LLBufferArray::constructSegmentAfter(
U8* address,
LLSegment& segment)
{
+ ASSERT_LLBUFFERARRAY_MUTEX_LOCKED
LLMemType m1(LLMemType::MTYPE_IO_BUFFER);
segment_iterator_t rv = mSegments.begin();
segment_iterator_t end = mSegments.end();
@@ -395,8 +460,10 @@ LLBufferArray::segment_iterator_t LLBufferArray::constructSegmentAfter(
return rv;
}
+//mMutexp should be locked before calling this.
LLBufferArray::segment_iterator_t LLBufferArray::getSegment(U8* address)
{
+ ASSERT_LLBUFFERARRAY_MUTEX_LOCKED
segment_iterator_t end = mSegments.end();
if(!address)
{
@@ -414,9 +481,11 @@ LLBufferArray::segment_iterator_t LLBufferArray::getSegment(U8* address)
return end;
}
+//mMutexp should be locked before calling this.
LLBufferArray::const_segment_iterator_t LLBufferArray::getSegment(
U8* address) const
{
+ ASSERT_LLBUFFERARRAY_MUTEX_LOCKED
const_segment_iterator_t end = mSegments.end();
if(!address)
{
@@ -466,6 +535,8 @@ S32 LLBufferArray::countAfter(S32 channel, U8* start) const
S32 count = 0;
S32 offset = 0;
const_segment_iterator_t it;
+
+ LLMutexLock lock(mMutexp) ;
const_segment_iterator_t end = mSegments.end();
if(start)
{
@@ -517,6 +588,8 @@ U8* LLBufferArray::readAfter(
len = 0;
S32 bytes_to_copy = 0;
const_segment_iterator_t it;
+
+ LLMutexLock lock(mMutexp) ;
const_segment_iterator_t end = mSegments.end();
if(start)
{
@@ -568,6 +641,7 @@ U8* LLBufferArray::seek(
U8* start,
S32 delta) const
{
+ ASSERT_LLBUFFERARRAY_MUTEX_LOCKED
LLMemType m1(LLMemType::MTYPE_IO_BUFFER);
const_segment_iterator_t it;
const_segment_iterator_t end = mSegments.end();
@@ -709,9 +783,14 @@ U8* LLBufferArray::seek(
return rv;
}
+//test use only
bool LLBufferArray::takeContents(LLBufferArray& source)
{
LLMemType m1(LLMemType::MTYPE_IO_BUFFER);
+
+ LLMutexLock lock(mMutexp);
+ source.lock();
+
std::copy(
source.mBuffers.begin(),
source.mBuffers.end(),
@@ -723,13 +802,17 @@ bool LLBufferArray::takeContents(LLBufferArray& source)
std::back_insert_iterator<segment_list_t>(mSegments));
source.mSegments.clear();
source.mNextBaseChannel = 0;
+ source.unlock();
+
return true;
}
+//mMutexp should be locked before calling this.
LLBufferArray::segment_iterator_t LLBufferArray::makeSegment(
S32 channel,
S32 len)
{
+ ASSERT_LLBUFFERARRAY_MUTEX_LOCKED
LLMemType m1(LLMemType::MTYPE_IO_BUFFER);
// start at the end of the buffers, because it is the most likely
// to have free space.
@@ -765,8 +848,10 @@ LLBufferArray::segment_iterator_t LLBufferArray::makeSegment(
return send;
}
+//mMutexp should be locked before calling this.
bool LLBufferArray::eraseSegment(const segment_iterator_t& erase_iter)
{
+ ASSERT_LLBUFFERARRAY_MUTEX_LOCKED
LLMemType m1(LLMemType::MTYPE_IO_BUFFER);
// Find out which buffer contains the segment, and if it is found,
@@ -792,13 +877,14 @@ bool LLBufferArray::eraseSegment(const segment_iterator_t& erase_iter)
return rv;
}
-
+//mMutexp should be locked before calling this.
bool LLBufferArray::copyIntoBuffers(
S32 channel,
const U8* src,
S32 len,
std::vector<LLSegment>& segments)
{
+ ASSERT_LLBUFFERARRAY_MUTEX_LOCKED
LLMemType m1(LLMemType::MTYPE_IO_BUFFER);
if(!src || !len) return false;
S32 copied = 0;
diff --git a/indra/llmessage/llbuffer.h b/indra/llmessage/llbuffer.h
index 1c42b6fbc6..ccdb9fa7ee 100644
--- a/indra/llmessage/llbuffer.h
+++ b/indra/llmessage/llbuffer.h
@@ -39,6 +39,7 @@
#include <list>
#include <vector>
+class LLMutex;
/**
* @class LLChannelDescriptors
* @brief A way simple interface to accesss channels inside a buffer
@@ -564,6 +565,29 @@ public:
* @return Returns true on success.
*/
bool eraseSegment(const segment_iterator_t& iter);
+
+ /**
+ * @brief Lock the mutex if it exists
+ * This method locks mMutexp to make accessing LLBufferArray thread-safe
+ */
+ void lock();
+
+ /**
+ * @brief Unlock the mutex if it exists
+ */
+ void unlock();
+
+ /**
+ * @brief Return mMutexp
+ */
+ LLMutex* getMutex();
+
+ /**
+ * @brief Set LLBufferArray to be shared across threads or not
+ * This method is to create mMutexp if is threaded.
+ * @param threaded Indicates this LLBufferArray instance is shared across threads if true.
+ */
+ void setThreaded(bool threaded);
//@}
protected:
@@ -595,6 +619,7 @@ protected:
S32 mNextBaseChannel;
buffer_list_t mBuffers;
segment_list_t mSegments;
+ LLMutex* mMutexp;
};
#endif // LL_LLBUFFER_H
diff --git a/indra/llmessage/llbufferstream.cpp b/indra/llmessage/llbufferstream.cpp
index 6257983c43..8d8ad05ad5 100644
--- a/indra/llmessage/llbufferstream.cpp
+++ b/indra/llmessage/llbufferstream.cpp
@@ -31,6 +31,7 @@
#include "llbuffer.h"
#include "llmemtype.h"
+#include "llthread.h"
static const S32 DEFAULT_OUTPUT_SEGMENT_SIZE = 1024 * 4;
@@ -62,6 +63,7 @@ int LLBufferStreamBuf::underflow()
return EOF;
}
+ LLMutexLock lock(mBuffer->getMutex());
LLBufferArray::segment_iterator_t iter;
LLBufferArray::segment_iterator_t end = mBuffer->endSegment();
U8* last_pos = (U8*)gptr();
@@ -149,6 +151,7 @@ int LLBufferStreamBuf::overflow(int c)
// since we got here, we have a buffer, and we have a character to
// put on it.
LLBufferArray::segment_iterator_t it;
+ LLMutexLock lock(mBuffer->getMutex());
it = mBuffer->makeSegment(mChannels.out(), DEFAULT_OUTPUT_SEGMENT_SIZE);
if(it != mBuffer->endSegment())
{
@@ -210,6 +213,7 @@ int LLBufferStreamBuf::sync()
// *NOTE: I bet we could just --address if address is not NULL.
// Need to think about that.
+ LLMutexLock lock(mBuffer->getMutex());
address = mBuffer->seek(mChannels.out(), address, -1);
if(address)
{
@@ -273,6 +277,8 @@ streampos LLBufferStreamBuf::seekoff(
// NULL is fine
break;
}
+
+ LLMutexLock lock(mBuffer->getMutex());
address = mBuffer->seek(mChannels.in(), base_addr, off);
if(address)
{
@@ -304,6 +310,8 @@ streampos LLBufferStreamBuf::seekoff(
// NULL is fine
break;
}
+
+ LLMutexLock lock(mBuffer->getMutex());
address = mBuffer->seek(mChannels.out(), base_addr, off);
if(address)
{
diff --git a/indra/llmessage/llcurl.cpp b/indra/llmessage/llcurl.cpp
index 6d9213f51b..3bcaffc275 100644
--- a/indra/llmessage/llcurl.cpp
+++ b/indra/llmessage/llcurl.cpp
@@ -72,10 +72,9 @@
static const U32 EASY_HANDLE_POOL_SIZE = 5;
static const S32 MULTI_PERFORM_CALL_REPEAT = 5;
-static const S32 CURL_REQUEST_TIMEOUT = 30; // seconds
+static const S32 CURL_REQUEST_TIMEOUT = 30; // seconds per operation
static const S32 MAX_ACTIVE_REQUEST_COUNT = 100;
-static
// DEBUG //
S32 gCurlEasyCount = 0;
S32 gCurlMultiCount = 0;
@@ -86,9 +85,12 @@ S32 gCurlMultiCount = 0;
std::vector<LLMutex*> LLCurl::sSSLMutex;
std::string LLCurl::sCAPath;
std::string LLCurl::sCAFile;
-
-bool LLCurl::sMultiThreaded = false;
-static U32 sMainThreadID = 0;
+LLCurlThread* LLCurl::sCurlThread = NULL ;
+LLMutex* LLCurl::sHandleMutexp = NULL ;
+S32 LLCurl::sTotalHandles = 0 ;
+bool LLCurl::sNotQuitting = true;
+F32 LLCurl::sCurlRequestTimeOut = 120.f; //seonds
+S32 LLCurl::sMaxHandles = 256; //max number of handles, (multi handles and easy handles combined).
void check_curl_code(CURLcode code)
{
@@ -221,17 +223,20 @@ namespace boost
std::set<CURL*> LLCurl::Easy::sFreeHandles;
std::set<CURL*> LLCurl::Easy::sActiveHandles;
-LLMutex* LLCurl::Easy::sHandleMutex = NULL;
-LLMutex* LLCurl::Easy::sMultiMutex = NULL;
+LLMutex* LLCurl::Easy::sHandleMutexp = NULL ;
//static
CURL* LLCurl::Easy::allocEasyHandle()
{
+ llassert(LLCurl::getCurlThread()) ;
+
CURL* ret = NULL;
- LLMutexLock lock(sHandleMutex);
+
+ LLMutexLock lock(sHandleMutexp) ;
+
if (sFreeHandles.empty())
{
- ret = curl_easy_init();
+ ret = LLCurl::newEasyHandle();
}
else
{
@@ -251,17 +256,27 @@ CURL* LLCurl::Easy::allocEasyHandle()
//static
void LLCurl::Easy::releaseEasyHandle(CURL* handle)
{
+ static const S32 MAX_NUM_FREE_HANDLES = 32 ;
+
if (!handle)
{
- llerrs << "handle cannot be NULL!" << llendl;
+ return ; //handle allocation failed.
+ //llerrs << "handle cannot be NULL!" << llendl;
}
- LLMutexLock lock(sHandleMutex);
-
+ LLMutexLock lock(sHandleMutexp) ;
if (sActiveHandles.find(handle) != sActiveHandles.end())
{
sActiveHandles.erase(handle);
- sFreeHandles.insert(handle);
+
+ if(sFreeHandles.size() < MAX_NUM_FREE_HANDLES)
+ {
+ sFreeHandles.insert(handle);
+ }
+ else
+ {
+ LLCurl::deleteEasyHandle(handle) ;
+ }
}
else
{
@@ -304,6 +319,14 @@ LLCurl::Easy::~Easy()
--gCurlEasyCount;
curl_slist_free_all(mHeaders);
for_each(mStrings.begin(), mStrings.end(), DeletePointerArray());
+
+ if (mResponder && LLCurl::sNotQuitting) //aborted
+ {
+ std::string reason("Request timeout, aborted.") ;
+ mResponder->completedRaw(408, //HTTP_REQUEST_TIME_OUT, timeout, abort
+ reason, mChannels, mOutput);
+ }
+ mResponder = NULL;
}
void LLCurl::Easy::resetState()
@@ -476,6 +499,7 @@ void LLCurl::Easy::prepRequest(const std::string& url,
LLProxy::getInstance()->applyProxySettings(this);
mOutput.reset(new LLBufferArray);
+ mOutput->setThreaded(true);
setopt(CURLOPT_WRITEFUNCTION, (void*)&curlWriteCallback);
setopt(CURLOPT_WRITEDATA, (void*)this);
@@ -519,48 +543,56 @@ void LLCurl::Easy::prepRequest(const std::string& url,
}
////////////////////////////////////////////////////////////////////////////
-
-LLCurl::Multi::Multi()
- : LLThread("Curl Multi"),
- mQueued(0),
+LLCurl::Multi::Multi(F32 idle_time_out)
+ : mQueued(0),
mErrorCount(0),
- mPerformState(PERFORM_STATE_READY)
+ mState(STATE_READY),
+ mDead(FALSE),
+ mMutexp(NULL),
+ mDeletionMutexp(NULL),
+ mEasyMutexp(NULL)
{
- mQuitting = false;
-
- mThreaded = LLCurl::sMultiThreaded && LLThread::currentID() == sMainThreadID;
- if (mThreaded)
- {
- mSignal = new LLCondition();
- }
- else
- {
- mSignal = NULL;
- }
-
- mCurlMultiHandle = curl_multi_init();
+ mCurlMultiHandle = LLCurl::newMultiHandle();
if (!mCurlMultiHandle)
{
llwarns << "curl_multi_init() returned NULL! Easy handles: " << gCurlEasyCount << " Multi handles: " << gCurlMultiCount << llendl;
- mCurlMultiHandle = curl_multi_init();
+ mCurlMultiHandle = LLCurl::newMultiHandle();
}
- llassert_always(mCurlMultiHandle);
- ++gCurlMultiCount;
+ //llassert_always(mCurlMultiHandle);
+
+ if(mCurlMultiHandle)
+ {
+ if(LLCurl::getCurlThread()->getThreaded())
+ {
+ mMutexp = new LLMutex(NULL) ;
+ mDeletionMutexp = new LLMutex(NULL) ;
+ mEasyMutexp = new LLMutex(NULL) ;
+ }
+ LLCurl::getCurlThread()->addMulti(this) ;
+
+ mIdleTimeOut = idle_time_out ;
+ if(mIdleTimeOut < LLCurl::sCurlRequestTimeOut)
+ {
+ mIdleTimeOut = LLCurl::sCurlRequestTimeOut ;
+ }
+
+ ++gCurlMultiCount;
+ }
}
LLCurl::Multi::~Multi()
{
- llassert(isStopped());
+ cleanup() ;
+}
- if (LLCurl::sMultiThreaded)
+void LLCurl::Multi::cleanup()
+{
+ if(!mCurlMultiHandle)
{
- LLCurl::Easy::sMultiMutex->lock();
+ return ; //nothing to clean.
}
- delete mSignal;
- mSignal = NULL;
-
// Clean up active
for(easy_active_list_t::iterator iter = mEasyActiveList.begin();
iter != mEasyActiveList.end(); ++iter)
@@ -576,76 +608,157 @@ LLCurl::Multi::~Multi()
for_each(mEasyFreeList.begin(), mEasyFreeList.end(), DeletePointer());
mEasyFreeList.clear();
- check_curl_multi_code(curl_multi_cleanup(mCurlMultiHandle));
+ check_curl_multi_code(LLCurl::deleteMultiHandle(mCurlMultiHandle));
+ mCurlMultiHandle = NULL ;
+
+ delete mMutexp ;
+ mMutexp = NULL ;
+ delete mDeletionMutexp ;
+ mDeletionMutexp = NULL ;
+ delete mEasyMutexp ;
+ mEasyMutexp = NULL ;
+
+ mQueued = 0 ;
+ mState = STATE_COMPLETED;
+
--gCurlMultiCount;
- if (LLCurl::sMultiThreaded)
+ return ;
+}
+
+void LLCurl::Multi::lock()
+{
+ if(mMutexp)
{
- LLCurl::Easy::sMultiMutex->unlock();
+ mMutexp->lock() ;
}
}
-CURLMsg* LLCurl::Multi::info_read(S32* msgs_in_queue)
+void LLCurl::Multi::unlock()
{
- CURLMsg* curlmsg = curl_multi_info_read(mCurlMultiHandle, msgs_in_queue);
- return curlmsg;
+ if(mMutexp)
+ {
+ mMutexp->unlock() ;
+ }
+}
+
+void LLCurl::Multi::markDead()
+{
+ LLMutexLock lock(mDeletionMutexp) ;
+
+ mDead = TRUE ;
+ LLCurl::getCurlThread()->setPriority(mHandle, LLQueuedThread::PRIORITY_URGENT) ;
}
-void LLCurl::Multi::perform()
+void LLCurl::Multi::setState(LLCurl::Multi::ePerformState state)
{
- if (mThreaded)
+ lock() ;
+ mState = state ;
+ unlock() ;
+
+ if(mState == STATE_READY)
{
- if (mPerformState == PERFORM_STATE_READY)
- {
- mSignal->signal();
- }
+ LLCurl::getCurlThread()->setPriority(mHandle, LLQueuedThread::PRIORITY_NORMAL) ;
+ }
+}
+
+LLCurl::Multi::ePerformState LLCurl::Multi::getState()
+{
+ return mState;
+}
+
+bool LLCurl::Multi::isCompleted()
+{
+ return STATE_COMPLETED == getState() ;
+}
+
+bool LLCurl::Multi::waitToComplete()
+{
+ if(!isValid())
+ {
+ return true ;
}
- else
+
+ if(!mMutexp) //not threaded
+ {
+ doPerform() ;
+ return true ;
+ }
+
+ bool completed = (STATE_COMPLETED == mState) ;
+ if(!completed)
{
- doPerform();
+ LLCurl::getCurlThread()->setPriority(mHandle, LLQueuedThread::PRIORITY_HIGH) ;
}
+
+ return completed;
}
-void LLCurl::Multi::run()
+CURLMsg* LLCurl::Multi::info_read(S32* msgs_in_queue)
{
- llassert(mThreaded);
+ LLMutexLock lock(mMutexp) ;
- while (!mQuitting)
- {
- mSignal->wait();
- mPerformState = PERFORM_STATE_PERFORMING;
- if (!mQuitting)
- {
- LLMutexLock lock(LLCurl::Easy::sMultiMutex);
- doPerform();
- }
- }
+ CURLMsg* curlmsg = curl_multi_info_read(mCurlMultiHandle, msgs_in_queue);
+ return curlmsg;
}
-void LLCurl::Multi::doPerform()
+//return true if dead
+bool LLCurl::Multi::doPerform()
{
- S32 q = 0;
- for (S32 call_count = 0;
- call_count < MULTI_PERFORM_CALL_REPEAT;
- call_count += 1)
+ LLMutexLock lock(mDeletionMutexp) ;
+
+ bool dead = mDead ;
+
+ if(mDead)
{
- CURLMcode code = curl_multi_perform(mCurlMultiHandle, &q);
- if (CURLM_CALL_MULTI_PERFORM != code || q == 0)
+ setState(STATE_COMPLETED);
+ mQueued = 0 ;
+ }
+ else if(getState() != STATE_COMPLETED)
+ {
+ setState(STATE_PERFORMING);
+
+ S32 q = 0;
+ for (S32 call_count = 0;
+ call_count < MULTI_PERFORM_CALL_REPEAT;
+ call_count++)
{
- check_curl_multi_code(code);
- break;
+ LLMutexLock lock(mMutexp) ;
+
+ //WARNING: curl_multi_perform will block for many hundreds of milliseconds
+ // NEVER call this from the main thread, and NEVER allow the main thread to
+ // wait on a mutex held by this thread while curl_multi_perform is executing
+ CURLMcode code = curl_multi_perform(mCurlMultiHandle, &q);
+ if (CURLM_CALL_MULTI_PERFORM != code || q == 0)
+ {
+ check_curl_multi_code(code);
+
+ break;
+ }
}
-
+
+ mQueued = q;
+ setState(STATE_COMPLETED) ;
+ mIdleTimer.reset() ;
+ }
+ else if(mIdleTimer.getElapsedTimeF32() > mIdleTimeOut) //idle for too long, remove it.
+ {
+ dead = true ;
}
- mQueued = q;
- mPerformState = PERFORM_STATE_COMPLETED;
+
+ return dead ;
}
S32 LLCurl::Multi::process()
{
- perform();
+ if(!isValid())
+ {
+ return 0 ;
+ }
+
+ waitToComplete() ;
- if (mPerformState != PERFORM_STATE_COMPLETED)
+ if (getState() != STATE_COMPLETED)
{
return 0;
}
@@ -660,10 +773,19 @@ S32 LLCurl::Multi::process()
if (msg->msg == CURLMSG_DONE)
{
U32 response = 0;
- easy_active_map_t::iterator iter = mEasyActiveMap.find(msg->easy_handle);
- if (iter != mEasyActiveMap.end())
+ Easy* easy = NULL ;
+
+ {
+ LLMutexLock lock(mEasyMutexp) ;
+ easy_active_map_t::iterator iter = mEasyActiveMap.find(msg->easy_handle);
+ if (iter != mEasyActiveMap.end())
+ {
+ easy = iter->second;
+ }
+ }
+
+ if(easy)
{
- Easy* easy = iter->second;
response = easy->report(msg->data.result);
removeEasy(easy);
}
@@ -681,25 +803,28 @@ S32 LLCurl::Multi::process()
}
}
- mPerformState = PERFORM_STATE_READY;
+ setState(STATE_READY);
+
return processed;
}
LLCurl::Easy* LLCurl::Multi::allocEasy()
{
- Easy* easy = 0;
+ Easy* easy = 0;
if (mEasyFreeList.empty())
- {
+ {
easy = Easy::getEasy();
}
else
{
+ LLMutexLock lock(mEasyMutexp) ;
easy = *(mEasyFreeList.begin());
mEasyFreeList.erase(easy);
}
if (easy)
{
+ LLMutexLock lock(mEasyMutexp) ;
mEasyActiveList.insert(easy);
mEasyActiveMap[easy->getCurlHandle()] = easy;
}
@@ -708,6 +833,7 @@ LLCurl::Easy* LLCurl::Multi::allocEasy()
bool LLCurl::Multi::addEasy(Easy* easy)
{
+ LLMutexLock lock(mMutexp) ;
CURLMcode mcode = curl_multi_add_handle(mCurlMultiHandle, easy->getCurlHandle());
check_curl_multi_code(mcode);
//if (mcode != CURLM_OK)
@@ -720,25 +846,156 @@ bool LLCurl::Multi::addEasy(Easy* easy)
void LLCurl::Multi::easyFree(Easy* easy)
{
+ if(mEasyMutexp)
+ {
+ mEasyMutexp->lock() ;
+ }
+
mEasyActiveList.erase(easy);
mEasyActiveMap.erase(easy->getCurlHandle());
+
if (mEasyFreeList.size() < EASY_HANDLE_POOL_SIZE)
- {
- easy->resetState();
+ {
mEasyFreeList.insert(easy);
+
+ if(mEasyMutexp)
+ {
+ mEasyMutexp->unlock() ;
+ }
+
+ easy->resetState();
}
else
{
+ if(mEasyMutexp)
+ {
+ mEasyMutexp->unlock() ;
+ }
delete easy;
}
}
void LLCurl::Multi::removeEasy(Easy* easy)
{
- check_curl_multi_code(curl_multi_remove_handle(mCurlMultiHandle, easy->getCurlHandle()));
+ {
+ LLMutexLock lock(mMutexp) ;
+ check_curl_multi_code(curl_multi_remove_handle(mCurlMultiHandle, easy->getCurlHandle()));
+ }
easyFree(easy);
}
+//------------------------------------------------------------
+//LLCurlThread
+LLCurlThread::CurlRequest::CurlRequest(handle_t handle, LLCurl::Multi* multi, LLCurlThread* curl_thread) :
+ LLQueuedThread::QueuedRequest(handle, LLQueuedThread::PRIORITY_NORMAL, FLAG_AUTO_COMPLETE),
+ mMulti(multi),
+ mCurlThread(curl_thread)
+{
+}
+
+LLCurlThread::CurlRequest::~CurlRequest()
+{
+ if(mMulti)
+ {
+ mCurlThread->deleteMulti(mMulti) ;
+ mMulti = NULL ;
+ }
+}
+
+bool LLCurlThread::CurlRequest::processRequest()
+{
+ bool completed = true ;
+ if(mMulti)
+ {
+ completed = mCurlThread->doMultiPerform(mMulti) ;
+
+ if(!completed)
+ {
+ setPriority(LLQueuedThread::PRIORITY_LOW) ;
+ }
+ }
+
+ return completed ;
+}
+
+void LLCurlThread::CurlRequest::finishRequest(bool completed)
+{
+ if(mMulti->isDead())
+ {
+ mCurlThread->deleteMulti(mMulti) ;
+ }
+ else
+ {
+ mCurlThread->cleanupMulti(mMulti) ; //being idle too long, remove the request.
+ }
+
+ mMulti = NULL ;
+}
+
+LLCurlThread::LLCurlThread(bool threaded) :
+ LLQueuedThread("curlthread", threaded)
+{
+}
+
+//virtual
+LLCurlThread::~LLCurlThread()
+{
+}
+
+S32 LLCurlThread::update(F32 max_time_ms)
+{
+ return LLQueuedThread::update(max_time_ms);
+}
+
+void LLCurlThread::addMulti(LLCurl::Multi* multi)
+{
+ multi->mHandle = generateHandle() ;
+
+ CurlRequest* req = new CurlRequest(multi->mHandle, multi, this) ;
+
+ if (!addRequest(req))
+ {
+ llwarns << "curl request added when the thread is quitted" << llendl;
+ }
+}
+
+void LLCurlThread::killMulti(LLCurl::Multi* multi)
+{
+ if(!multi)
+ {
+ return ;
+ }
+
+ if(multi->isValid())
+ {
+ multi->markDead() ;
+ }
+ else
+ {
+ deleteMulti(multi) ;
+ }
+}
+
+//private
+bool LLCurlThread::doMultiPerform(LLCurl::Multi* multi)
+{
+ return multi->doPerform() ;
+}
+
+//private
+void LLCurlThread::deleteMulti(LLCurl::Multi* multi)
+{
+ delete multi ;
+}
+
+//private
+void LLCurlThread::cleanupMulti(LLCurl::Multi* multi)
+{
+ multi->cleanup() ;
+}
+
+//------------------------------------------------------------
+
//static
std::string LLCurl::strerror(CURLcode errorcode)
{
@@ -753,39 +1010,30 @@ LLCurlRequest::LLCurlRequest() :
mActiveMulti(NULL),
mActiveRequestCount(0)
{
- mThreadID = LLThread::currentID();
mProcessing = FALSE;
}
LLCurlRequest::~LLCurlRequest()
{
- llassert_always(mThreadID == LLThread::currentID());
-
//stop all Multi handle background threads
for (curlmulti_set_t::iterator iter = mMultiSet.begin(); iter != mMultiSet.end(); ++iter)
{
- LLCurl::Multi* multi = *iter;
- multi->mQuitting = true;
- if (multi->mThreaded)
- {
- while (!multi->isStopped())
- {
- multi->mSignal->signal();
- apr_sleep(1000);
- }
- }
+ LLCurl::getCurlThread()->killMulti(*iter) ;
}
- for_each(mMultiSet.begin(), mMultiSet.end(), DeletePointer());
+ mMultiSet.clear() ;
}
void LLCurlRequest::addMulti()
{
- llassert_always(mThreadID == LLThread::currentID());
LLCurl::Multi* multi = new LLCurl::Multi();
- if (multi->mThreaded)
+ if(!multi->isValid())
{
- multi->start();
+ LLCurl::getCurlThread()->killMulti(multi) ;
+ mActiveMulti = NULL ;
+ mActiveRequestCount = 0 ;
+ return;
}
+
mMultiSet.insert(multi);
mActiveMulti = multi;
mActiveRequestCount = 0;
@@ -799,7 +1047,12 @@ LLCurl::Easy* LLCurlRequest::allocEasy()
{
addMulti();
}
- llassert_always(mActiveMulti);
+ if(!mActiveMulti)
+ {
+ return NULL ;
+ }
+
+ //llassert_always(mActiveMulti);
++mActiveRequestCount;
LLCurl::Easy* easy = mActiveMulti->allocEasy();
return easy;
@@ -901,7 +1154,6 @@ bool LLCurlRequest::post(const std::string& url,
// Note: call once per frame
S32 LLCurlRequest::process()
{
- llassert_always(mThreadID == LLThread::currentID());
S32 res = 0;
mProcessing = TRUE;
@@ -910,22 +1162,25 @@ S32 LLCurlRequest::process()
{
curlmulti_set_t::iterator curiter = iter++;
LLCurl::Multi* multi = *curiter;
+
+ if(!multi->isValid())
+ {
+ if(multi == mActiveMulti)
+ {
+ mActiveMulti = NULL ;
+ mActiveRequestCount = 0 ;
+ }
+ mMultiSet.erase(curiter) ;
+ LLCurl::getCurlThread()->killMulti(multi) ;
+ continue ;
+ }
+
S32 tres = multi->process();
res += tres;
if (multi != mActiveMulti && tres == 0 && multi->mQueued == 0)
{
mMultiSet.erase(curiter);
- multi->mQuitting = true;
- if (multi->mThreaded)
- {
- while (!multi->isStopped())
- {
- multi->mSignal->signal();
- apr_sleep(1000);
- }
- }
-
- delete multi;
+ LLCurl::getCurlThread()->killMulti(multi);
}
}
mProcessing = FALSE;
@@ -934,15 +1189,27 @@ S32 LLCurlRequest::process()
S32 LLCurlRequest::getQueued()
{
- llassert_always(mThreadID == LLThread::currentID());
S32 queued = 0;
for (curlmulti_set_t::iterator iter = mMultiSet.begin();
iter != mMultiSet.end(); )
{
curlmulti_set_t::iterator curiter = iter++;
LLCurl::Multi* multi = *curiter;
+
+ if(!multi->isValid())
+ {
+ if(multi == mActiveMulti)
+ {
+ mActiveMulti = NULL ;
+ mActiveRequestCount = 0 ;
+ }
+ LLCurl::getCurlThread()->killMulti(multi);
+ mMultiSet.erase(curiter) ;
+ continue ;
+ }
+
queued += multi->mQueued;
- if (multi->mPerformState != LLCurl::Multi::PERFORM_STATE_READY)
+ if (multi->getState() != LLCurl::Multi::STATE_READY)
{
++queued;
}
@@ -959,37 +1226,34 @@ LLCurlEasyRequest::LLCurlEasyRequest()
mResultReturned(false)
{
mMulti = new LLCurl::Multi();
- if (mMulti->mThreaded)
+
+ if(mMulti->isValid())
{
- mMulti->start();
+ mEasy = mMulti->allocEasy();
+ if (mEasy)
+ {
+ mEasy->setErrorBuffer();
+ mEasy->setCA();
+ // Set proxy settings if configured to do so.
+ LLProxy::getInstance()->applyProxySettings(mEasy);
+ }
}
- mEasy = mMulti->allocEasy();
- if (mEasy)
+ else
{
- mEasy->setErrorBuffer();
- mEasy->setCA();
- // Set proxy settings if configured to do so.
- LLProxy::getInstance()->applyProxySettings(mEasy);
+ LLCurl::getCurlThread()->killMulti(mMulti) ;
+ mEasy = NULL ;
+ mMulti = NULL ;
}
}
LLCurlEasyRequest::~LLCurlEasyRequest()
{
- mMulti->mQuitting = true;
- if (mMulti->mThreaded)
- {
- while (!mMulti->isStopped())
- {
- mMulti->mSignal->signal();
- apr_sleep(1000);
- }
- }
- delete mMulti;
+ LLCurl::getCurlThread()->killMulti(mMulti) ;
}
void LLCurlEasyRequest::setopt(CURLoption option, S32 value)
{
- if (mEasy)
+ if (isValid() && mEasy)
{
mEasy->setopt(option, value);
}
@@ -997,7 +1261,7 @@ void LLCurlEasyRequest::setopt(CURLoption option, S32 value)
void LLCurlEasyRequest::setoptString(CURLoption option, const std::string& value)
{
- if (mEasy)
+ if (isValid() && mEasy)
{
mEasy->setoptString(option, value);
}
@@ -1005,7 +1269,7 @@ void LLCurlEasyRequest::setoptString(CURLoption option, const std::string& value
void LLCurlEasyRequest::setPost(char* postdata, S32 size)
{
- if (mEasy)
+ if (isValid() && mEasy)
{
mEasy->setopt(CURLOPT_POST, 1);
mEasy->setopt(CURLOPT_POSTFIELDS, postdata);
@@ -1015,7 +1279,7 @@ void LLCurlEasyRequest::setPost(char* postdata, S32 size)
void LLCurlEasyRequest::setHeaderCallback(curl_header_callback callback, void* userdata)
{
- if (mEasy)
+ if (isValid() && mEasy)
{
mEasy->setopt(CURLOPT_HEADERFUNCTION, (void*)callback);
mEasy->setopt(CURLOPT_HEADERDATA, userdata); // aka CURLOPT_WRITEHEADER
@@ -1024,7 +1288,7 @@ void LLCurlEasyRequest::setHeaderCallback(curl_header_callback callback, void* u
void LLCurlEasyRequest::setWriteCallback(curl_write_callback callback, void* userdata)
{
- if (mEasy)
+ if (isValid() && mEasy)
{
mEasy->setopt(CURLOPT_WRITEFUNCTION, (void*)callback);
mEasy->setopt(CURLOPT_WRITEDATA, userdata);
@@ -1033,7 +1297,7 @@ void LLCurlEasyRequest::setWriteCallback(curl_write_callback callback, void* use
void LLCurlEasyRequest::setReadCallback(curl_read_callback callback, void* userdata)
{
- if (mEasy)
+ if (isValid() && mEasy)
{
mEasy->setopt(CURLOPT_READFUNCTION, (void*)callback);
mEasy->setopt(CURLOPT_READDATA, userdata);
@@ -1042,7 +1306,7 @@ void LLCurlEasyRequest::setReadCallback(curl_read_callback callback, void* userd
void LLCurlEasyRequest::setSSLCtxCallback(curl_ssl_ctx_callback callback, void* userdata)
{
- if (mEasy)
+ if (isValid() && mEasy)
{
mEasy->setopt(CURLOPT_SSL_CTX_FUNCTION, (void*)callback);
mEasy->setopt(CURLOPT_SSL_CTX_DATA, userdata);
@@ -1051,7 +1315,7 @@ void LLCurlEasyRequest::setSSLCtxCallback(curl_ssl_ctx_callback callback, void*
void LLCurlEasyRequest::slist_append(const char* str)
{
- if (mEasy)
+ if (isValid() && mEasy)
{
mEasy->slist_append(str);
}
@@ -1062,7 +1326,7 @@ void LLCurlEasyRequest::sendRequest(const std::string& url)
llassert_always(!mRequestSent);
mRequestSent = true;
lldebugs << url << llendl;
- if (mEasy)
+ if (isValid() && mEasy)
{
mEasy->setHeaders();
mEasy->setoptString(CURLOPT_URL, url);
@@ -1074,25 +1338,24 @@ void LLCurlEasyRequest::requestComplete()
{
llassert_always(mRequestSent);
mRequestSent = false;
- if (mEasy)
+ if (isValid() && mEasy)
{
mMulti->removeEasy(mEasy);
}
}
-void LLCurlEasyRequest::perform()
-{
- mMulti->perform();
-}
-
// Usage: Call getRestult until it returns false (no more messages)
bool LLCurlEasyRequest::getResult(CURLcode* result, LLCurl::TransferInfo* info)
{
- if (mMulti->mPerformState != LLCurl::Multi::PERFORM_STATE_COMPLETED)
+ if(!isValid())
+ {
+ return false ;
+ }
+ if (!mMulti->isCompleted())
{ //we're busy, try again later
return false;
}
- mMulti->mPerformState = LLCurl::Multi::PERFORM_STATE_READY;
+ mMulti->setState(LLCurl::Multi::STATE_READY) ;
if (!mEasy)
{
@@ -1152,7 +1415,7 @@ CURLMsg* LLCurlEasyRequest::info_read(S32* q, LLCurl::TransferInfo* info)
std::string LLCurlEasyRequest::getErrorString()
{
- return mEasy ? std::string(mEasy->getErrorBuffer()) : std::string();
+ return isValid() && mEasy ? std::string(mEasy->getErrorBuffer()) : std::string();
}
////////////////////////////////////////////////////////////////////////////
@@ -1178,10 +1441,11 @@ unsigned long LLCurl::ssl_thread_id(void)
}
#endif
-void LLCurl::initClass(bool multi_threaded)
+void LLCurl::initClass(F32 curl_reuest_timeout, S32 max_number_handles, bool multi_threaded)
{
- sMainThreadID = LLThread::currentID();
- sMultiThreaded = multi_threaded;
+ sCurlRequestTimeOut = curl_reuest_timeout ; //seconds
+ sMaxHandles = max_number_handles ; //max number of handles, (multi handles and easy handles combined).
+
// Do not change this "unless you are familiar with and mean to control
// internal operations of libcurl"
// - http://curl.haxx.se/libcurl/c/curl_global_init.html
@@ -1189,43 +1453,127 @@ void LLCurl::initClass(bool multi_threaded)
check_curl_code(code);
- Easy::sHandleMutex = new LLMutex();
- Easy::sMultiMutex = new LLMutex();
-
#if SAFE_SSL
S32 mutex_count = CRYPTO_num_locks();
for (S32 i=0; i<mutex_count; i++)
{
- sSSLMutex.push_back(new LLMutex);
+ sSSLMutex.push_back(new LLMutex(NULL));
}
CRYPTO_set_id_callback(&LLCurl::ssl_thread_id);
CRYPTO_set_locking_callback(&LLCurl::ssl_locking_callback);
#endif
+
+ sCurlThread = new LLCurlThread(multi_threaded) ;
+ if(multi_threaded)
+ {
+ sHandleMutexp = new LLMutex(NULL) ;
+ Easy::sHandleMutexp = new LLMutex(NULL) ;
+ }
}
void LLCurl::cleanupClass()
{
+ sNotQuitting = false; //set quitting
+
+ //shut down curl thread
+ while(1)
+ {
+ if(!sCurlThread->update(1)) //finish all tasks
+ {
+ break ;
+ }
+ }
+ sCurlThread->shutdown() ;
+ delete sCurlThread ;
+ sCurlThread = NULL ;
+
#if SAFE_SSL
CRYPTO_set_locking_callback(NULL);
for_each(sSSLMutex.begin(), sSSLMutex.end(), DeletePointer());
#endif
- delete Easy::sHandleMutex;
- Easy::sHandleMutex = NULL;
- delete Easy::sMultiMutex;
- Easy::sMultiMutex = NULL;
-
for (std::set<CURL*>::iterator iter = Easy::sFreeHandles.begin(); iter != Easy::sFreeHandles.end(); ++iter)
{
CURL* curl = *iter;
- curl_easy_cleanup(curl);
+ LLCurl::deleteEasyHandle(curl);
}
Easy::sFreeHandles.clear();
+ delete Easy::sHandleMutexp ;
+ Easy::sHandleMutexp = NULL ;
+
+ delete sHandleMutexp ;
+ sHandleMutexp = NULL ;
+
llassert(Easy::sActiveHandles.empty());
}
+//static
+CURLM* LLCurl::newMultiHandle()
+{
+ LLMutexLock lock(sHandleMutexp) ;
+
+ if(sTotalHandles + 1 > sMaxHandles)
+ {
+ llwarns << "no more handles available." << llendl ;
+ return NULL ; //failed
+ }
+ sTotalHandles++;
+
+ CURLM* ret = curl_multi_init() ;
+ if(!ret)
+ {
+ llwarns << "curl_multi_init failed." << llendl ;
+ }
+
+ return ret ;
+}
+
+//static
+CURLMcode LLCurl::deleteMultiHandle(CURLM* handle)
+{
+ if(handle)
+ {
+ LLMutexLock lock(sHandleMutexp) ;
+ sTotalHandles-- ;
+ return curl_multi_cleanup(handle) ;
+ }
+ return CURLM_OK ;
+}
+
+//static
+CURL* LLCurl::newEasyHandle()
+{
+ LLMutexLock lock(sHandleMutexp) ;
+
+ if(sTotalHandles + 1 > sMaxHandles)
+ {
+ llwarns << "no more handles available." << llendl ;
+ return NULL ; //failed
+ }
+ sTotalHandles++;
+
+ CURL* ret = curl_easy_init() ;
+ if(!ret)
+ {
+ llwarns << "curl_easy_init failed." << llendl ;
+ }
+
+ return ret ;
+}
+
+//static
+void LLCurl::deleteEasyHandle(CURL* handle)
+{
+ if(handle)
+ {
+ LLMutexLock lock(sHandleMutexp) ;
+ curl_easy_cleanup(handle) ;
+ sTotalHandles-- ;
+ }
+}
+
const unsigned int LLCurl::MAX_REDIRECTS = 5;
// Provide access to LLCurl free functions outside of llcurl.cpp without polluting the global namespace.
diff --git a/indra/llmessage/llcurl.h b/indra/llmessage/llcurl.h
index 87de202717..fd664c0fa1 100755..100644
--- a/indra/llmessage/llcurl.h
+++ b/indra/llmessage/llcurl.h
@@ -42,8 +42,11 @@
#include "lliopipe.h"
#include "llsd.h"
#include "llthread.h"
+#include "llqueuedthread.h"
+#include "llframetimer.h"
class LLMutex;
+class LLCurlThread;
// For whatever reason, this is not typedef'd in curl.h
typedef size_t (*curl_header_callback)(void *ptr, size_t size, size_t nmemb, void *stream);
@@ -56,8 +59,6 @@ public:
class Easy;
class Multi;
- static bool sMultiThreaded;
-
struct TransferInfo
{
TransferInfo() : mSizeDownload(0.0), mTotalTime(0.0), mSpeedDownload(0.0) {}
@@ -162,7 +163,7 @@ public:
/**
* @ brief Initialize LLCurl class
*/
- static void initClass(bool multi_threaded = false);
+ static void initClass(F32 curl_reuest_timeout = 120.f, S32 max_number_handles = 256, bool multi_threaded = false);
/**
* @ brief Cleanup LLCurl class
@@ -181,10 +182,25 @@ public:
static void ssl_locking_callback(int mode, int type, const char *file, int line);
static unsigned long ssl_thread_id(void);
+ static LLCurlThread* getCurlThread() { return sCurlThread ;}
+
+ static CURLM* newMultiHandle() ;
+ static CURLMcode deleteMultiHandle(CURLM* handle) ;
+ static CURL* newEasyHandle() ;
+ static void deleteEasyHandle(CURL* handle) ;
+
private:
static std::string sCAPath;
static std::string sCAFile;
static const unsigned int MAX_REDIRECTS;
+ static LLCurlThread* sCurlThread;
+
+ static LLMutex* sHandleMutexp ;
+ static S32 sTotalHandles ;
+ static S32 sMaxHandles;
+public:
+ static bool sNotQuitting;
+ static F32 sCurlRequestTimeOut;
};
class LLCurl::Easy
@@ -216,7 +232,7 @@ public:
U32 report(CURLcode);
void getTransferInfo(LLCurl::TransferInfo* info);
- void prepRequest(const std::string& url, const std::vector<std::string>& headers, ResponderPtr, S32 time_out = 0, bool post = false);
+ void prepRequest(const std::string& url, const std::vector<std::string>& headers, LLCurl::ResponderPtr, S32 time_out = 0, bool post = false);
const char* getErrorBuffer();
@@ -247,64 +263,120 @@ private:
// Note: char*'s not strings since we pass pointers to curl
std::vector<char*> mStrings;
- ResponderPtr mResponder;
+ LLCurl::ResponderPtr mResponder;
static std::set<CURL*> sFreeHandles;
static std::set<CURL*> sActiveHandles;
- static LLMutex* sHandleMutex;
- static LLMutex* sMultiMutex;
+ static LLMutex* sHandleMutexp ;
};
-class LLCurl::Multi : public LLThread
+class LLCurl::Multi
{
LOG_CLASS(Multi);
+
+ friend class LLCurlThread ;
+
+private:
+ ~Multi();
+
+ void markDead() ;
+ bool doPerform();
+
public:
typedef enum
{
- PERFORM_STATE_READY=0,
- PERFORM_STATE_PERFORMING=1,
- PERFORM_STATE_COMPLETED=2
+ STATE_READY=0,
+ STATE_PERFORMING=1,
+ STATE_COMPLETED=2
} ePerformState;
- Multi();
- ~Multi();
+ Multi(F32 idle_time_out = 0.f);
- Easy* allocEasy();
- bool addEasy(Easy* easy);
+ LLCurl::Easy* allocEasy();
+ bool addEasy(LLCurl::Easy* easy);
+ void removeEasy(LLCurl::Easy* easy);
- void removeEasy(Easy* easy);
+ void lock() ;
+ void unlock() ;
- S32 process();
- void perform();
- void doPerform();
+ void setState(ePerformState state) ;
+ ePerformState getState() ;
- virtual void run();
+ bool isCompleted() ;
+ bool isValid() {return mCurlMultiHandle != NULL ;}
+ bool isDead() {return mDead;}
+
+ bool waitToComplete() ;
+ S32 process();
+
CURLMsg* info_read(S32* msgs_in_queue);
S32 mQueued;
S32 mErrorCount;
- S32 mPerformState;
-
- LLCondition* mSignal;
- bool mQuitting;
- bool mThreaded;
-
private:
- void easyFree(Easy*);
+ void easyFree(LLCurl::Easy*);
+ void cleanup() ;
CURLM* mCurlMultiHandle;
- typedef std::set<Easy*> easy_active_list_t;
+ typedef std::set<LLCurl::Easy*> easy_active_list_t;
easy_active_list_t mEasyActiveList;
- typedef std::map<CURL*, Easy*> easy_active_map_t;
+ typedef std::map<CURL*, LLCurl::Easy*> easy_active_map_t;
easy_active_map_t mEasyActiveMap;
- typedef std::set<Easy*> easy_free_list_t;
+ typedef std::set<LLCurl::Easy*> easy_free_list_t;
easy_free_list_t mEasyFreeList;
+
+ LLQueuedThread::handle_t mHandle ;
+ ePerformState mState;
+
+ BOOL mDead ;
+ LLMutex* mMutexp ;
+ LLMutex* mDeletionMutexp ;
+ LLMutex* mEasyMutexp ;
+ LLFrameTimer mIdleTimer ;
+ F32 mIdleTimeOut;
};
+class LLCurlThread : public LLQueuedThread
+{
+public:
+
+ class CurlRequest : public LLQueuedThread::QueuedRequest
+ {
+ protected:
+ virtual ~CurlRequest(); // use deleteRequest()
+
+ public:
+ CurlRequest(handle_t handle, LLCurl::Multi* multi, LLCurlThread* curl_thread);
+
+ /*virtual*/ bool processRequest();
+ /*virtual*/ void finishRequest(bool completed);
+
+ private:
+ // input
+ LLCurl::Multi* mMulti;
+ LLCurlThread* mCurlThread;
+ };
+ friend class CurlRequest;
+
+public:
+ LLCurlThread(bool threaded = true) ;
+ virtual ~LLCurlThread() ;
+
+ S32 update(F32 max_time_ms);
+
+ void addMulti(LLCurl::Multi* multi) ;
+ void killMulti(LLCurl::Multi* multi) ;
+
+private:
+ bool doMultiPerform(LLCurl::Multi* multi) ;
+ void deleteMulti(LLCurl::Multi* multi) ;
+ void cleanupMulti(LLCurl::Multi* multi) ;
+} ;
+
namespace boost
{
void intrusive_ptr_add_ref(LLCurl::Responder* p);
@@ -339,7 +411,6 @@ private:
LLCurl::Multi* mActiveMulti;
S32 mActiveRequestCount;
BOOL mProcessing;
- U32 mThreadID; // debug
};
class LLCurlEasyRequest
@@ -357,9 +428,11 @@ public:
void slist_append(const char* str);
void sendRequest(const std::string& url);
void requestComplete();
- void perform();
bool getResult(CURLcode* result, LLCurl::TransferInfo* info = NULL);
std::string getErrorString();
+ bool isCompleted() {return mMulti->isCompleted() ;}
+ bool wait() { return mMulti->waitToComplete(); }
+ bool isValid() {return mMulti && mMulti->isValid(); }
LLCurl::Easy* getEasy() const { return mEasy; }
diff --git a/indra/llmessage/llhttpassetstorage.cpp b/indra/llmessage/llhttpassetstorage.cpp
index 2bca517e97..612d765969 100644
--- a/indra/llmessage/llhttpassetstorage.cpp
+++ b/indra/llmessage/llhttpassetstorage.cpp
@@ -232,7 +232,8 @@ LLSD LLHTTPAssetRequest::getFullDetails() const
void LLHTTPAssetRequest::setupCurlHandle()
{
// *NOTE: Similar code exists in mapserver/llcurlutil.cpp JC
- mCurlHandle = curl_easy_init();
+ mCurlHandle = LLCurl::newEasyHandle();
+ llassert_always(mCurlHandle != NULL) ;
// Apply proxy settings if configured to do so
LLProxy::getInstance()->applyProxySettings(mCurlHandle);
@@ -278,7 +279,7 @@ void LLHTTPAssetRequest::setupCurlHandle()
void LLHTTPAssetRequest::cleanupCurlHandle()
{
- curl_easy_cleanup(mCurlHandle);
+ LLCurl::deleteEasyHandle(mCurlHandle);
if (mAssetStoragep)
{
// Terminating a request. Thus upload or download is no longer pending.
@@ -429,12 +430,13 @@ void LLHTTPAssetStorage::_init(const std::string& web_host, const std::string& l
// curl_global_init moved to LLCurl::initClass()
- mCurlMultiHandle = curl_multi_init();
+ mCurlMultiHandle = LLCurl::newMultiHandle() ;
+ llassert_always(mCurlMultiHandle != NULL) ;
}
LLHTTPAssetStorage::~LLHTTPAssetStorage()
{
- curl_multi_cleanup(mCurlMultiHandle);
+ LLCurl::deleteMultiHandle(mCurlMultiHandle);
mCurlMultiHandle = NULL;
// curl_global_cleanup moved to LLCurl::initClass()
diff --git a/indra/llmessage/llhttpclient.cpp b/indra/llmessage/llhttpclient.cpp
index dd4e3a6300..231cb7ca8f 100644
--- a/indra/llmessage/llhttpclient.cpp
+++ b/indra/llmessage/llhttpclient.cpp
@@ -228,6 +228,12 @@ static void request(
LLPumpIO::chain_t chain;
LLURLRequest* req = new LLURLRequest(method, url);
+ if(!req->isValid())//failed
+ {
+ delete req ;
+ return ;
+ }
+
req->setSSLVerifyCallback(LLHTTPClient::getCertVerifyCallback(), (void *)req);
@@ -423,7 +429,9 @@ static LLSD blocking_request(
{
lldebugs << "blockingRequest of " << url << llendl;
char curl_error_buffer[CURL_ERROR_SIZE] = "\0";
- CURL* curlp = curl_easy_init();
+ CURL* curlp = LLCurl::newEasyHandle();
+ llassert_always(curlp != NULL) ;
+
LLHTTPBuffer http_buffer;
std::string body_str;
@@ -517,7 +525,7 @@ static LLSD blocking_request(
}
// * Cleanup
- curl_easy_cleanup(curlp);
+ LLCurl::deleteEasyHandle(curlp);
return response;
}
diff --git a/indra/llmessage/lliohttpserver.cpp b/indra/llmessage/lliohttpserver.cpp
index 920a57ab55..987f386aa3 100644
--- a/indra/llmessage/lliohttpserver.cpp
+++ b/indra/llmessage/lliohttpserver.cpp
@@ -818,6 +818,8 @@ LLIOPipe::EStatus LLHTTPResponder::process_impl(
// Copy everything after mLast read to the out.
LLBufferArray::segment_iterator_t seg_iter;
+
+ buffer->lock();
seg_iter = buffer->splitAfter(mLastRead);
if(seg_iter != buffer->endSegment())
{
@@ -838,7 +840,7 @@ LLIOPipe::EStatus LLHTTPResponder::process_impl(
}
#endif
}
-
+ buffer->unlock();
//
// *FIX: get rid of extra bytes off the end
//
@@ -963,9 +965,13 @@ private:
// static
-LLHTTPNode& LLIOHTTPServer::create(LLPumpIO& pump, U16 port)
+LLHTTPNode& LLIOHTTPServer::create(
+ apr_pool_t* pool, LLPumpIO& pump, U16 port)
{
- LLSocket::ptr_t socket = LLSocket::create(LLSocket::STREAM_TCP, port);
+ LLSocket::ptr_t socket = LLSocket::create(
+ pool,
+ LLSocket::STREAM_TCP,
+ port);
if(!socket)
{
llerrs << "Unable to initialize socket" << llendl;
@@ -974,7 +980,7 @@ LLHTTPNode& LLIOHTTPServer::create(LLPumpIO& pump, U16 port)
LLHTTPResponseFactory* factory = new LLHTTPResponseFactory;
boost::shared_ptr<LLChainIOFactory> factory_ptr(factory);
- LLIOServerSocket* server = new LLIOServerSocket(socket, factory_ptr);
+ LLIOServerSocket* server = new LLIOServerSocket(pool, socket, factory_ptr);
LLPumpIO::chain_t chain;
chain.push_back(LLIOPipe::ptr_t(server));
diff --git a/indra/llmessage/lliohttpserver.h b/indra/llmessage/lliohttpserver.h
index 2294e4b8ae..5c1b0531ff 100644
--- a/indra/llmessage/lliohttpserver.h
+++ b/indra/llmessage/lliohttpserver.h
@@ -50,7 +50,7 @@ class LLIOHTTPServer
public:
typedef void (*timing_callback_t)(const char* hashed_name, F32 time, void* data);
- static LLHTTPNode& create(LLPumpIO& pump, U16 port);
+ static LLHTTPNode& create(apr_pool_t* pool, LLPumpIO& pump, U16 port);
/**< Creates an HTTP wire server on the pump for the given TCP port.
*
* Returns the root node of the new server. Add LLHTTPNode instances
diff --git a/indra/llmessage/lliopipe.cpp b/indra/llmessage/lliopipe.cpp
index 6e4eec74a6..8f827f7a30 100644
--- a/indra/llmessage/lliopipe.cpp
+++ b/indra/llmessage/lliopipe.cpp
@@ -75,6 +75,12 @@ LLIOPipe::~LLIOPipe()
//lldebugs << "destroying LLIOPipe" << llendl;
}
+//virtual
+bool LLIOPipe::isValid()
+{
+ return true ;
+}
+
// static
std::string LLIOPipe::lookupStatusString(EStatus status)
{
diff --git a/indra/llmessage/lliopipe.h b/indra/llmessage/lliopipe.h
index 8e656b6da1..cbd17b5a3d 100644
--- a/indra/llmessage/lliopipe.h
+++ b/indra/llmessage/lliopipe.h
@@ -231,6 +231,8 @@ public:
*/
virtual ~LLIOPipe();
+ virtual bool isValid() ;
+
protected:
/**
* @brief Base Constructor.
diff --git a/indra/llmessage/lliosocket.cpp b/indra/llmessage/lliosocket.cpp
index a885ba8ee1..d5b4d45821 100644
--- a/indra/llmessage/lliosocket.cpp
+++ b/indra/llmessage/lliosocket.cpp
@@ -35,7 +35,6 @@
#include "llhost.h"
#include "llmemtype.h"
#include "llpumpio.h"
-#include "llthread.h"
//
// constants
@@ -99,31 +98,51 @@ void ll_debug_socket(const char* msg, apr_socket_t* apr_sock)
///
// static
-LLSocket::ptr_t LLSocket::create(EType type, U16 port)
+LLSocket::ptr_t LLSocket::create(apr_pool_t* pool, EType type, U16 port)
{
LLMemType m1(LLMemType::MTYPE_IO_TCP);
+ LLSocket::ptr_t rv;
+ apr_socket_t* socket = NULL;
+ apr_pool_t* new_pool = NULL;
apr_status_t status = APR_EGENERAL;
- LLSocket::ptr_t rv(new LLSocket);
+
+ // create a pool for the socket
+ status = apr_pool_create(&new_pool, pool);
+ if(ll_apr_warn_status(status))
+ {
+ if(new_pool) apr_pool_destroy(new_pool);
+ return rv;
+ }
if(STREAM_TCP == type)
{
- status = apr_socket_create(&rv->mSocket, APR_INET, SOCK_STREAM, APR_PROTO_TCP, rv->mPool());
+ status = apr_socket_create(
+ &socket,
+ APR_INET,
+ SOCK_STREAM,
+ APR_PROTO_TCP,
+ new_pool);
}
else if(DATAGRAM_UDP == type)
{
- status = apr_socket_create(&rv->mSocket, APR_INET, SOCK_DGRAM, APR_PROTO_UDP, rv->mPool());
+ status = apr_socket_create(
+ &socket,
+ APR_INET,
+ SOCK_DGRAM,
+ APR_PROTO_UDP,
+ new_pool);
}
else
{
- rv.reset();
+ if(new_pool) apr_pool_destroy(new_pool);
return rv;
}
if(ll_apr_warn_status(status))
{
- rv->mSocket = NULL;
- rv.reset();
+ if(new_pool) apr_pool_destroy(new_pool);
return rv;
}
+ rv = ptr_t(new LLSocket(socket, new_pool));
if(port > 0)
{
apr_sockaddr_t* sa = NULL;
@@ -133,7 +152,7 @@ LLSocket::ptr_t LLSocket::create(EType type, U16 port)
APR_UNSPEC,
port,
0,
- rv->mPool());
+ new_pool);
if(ll_apr_warn_status(status))
{
rv.reset();
@@ -141,8 +160,8 @@ LLSocket::ptr_t LLSocket::create(EType type, U16 port)
}
// This allows us to reuse the address on quick down/up. This
// is unlikely to create problems.
- ll_apr_warn_status(apr_socket_opt_set(rv->mSocket, APR_SO_REUSEADDR, 1));
- status = apr_socket_bind(rv->mSocket, sa);
+ ll_apr_warn_status(apr_socket_opt_set(socket, APR_SO_REUSEADDR, 1));
+ status = apr_socket_bind(socket, sa);
if(ll_apr_warn_status(status))
{
rv.reset();
@@ -156,7 +175,7 @@ LLSocket::ptr_t LLSocket::create(EType type, U16 port)
// to keep a queue of incoming connections for ACCEPT.
lldebugs << "Setting listen state for socket." << llendl;
status = apr_socket_listen(
- rv->mSocket,
+ socket,
LL_DEFAULT_LISTEN_BACKLOG);
if(ll_apr_warn_status(status))
{
@@ -177,28 +196,21 @@ LLSocket::ptr_t LLSocket::create(EType type, U16 port)
}
// static
-LLSocket::ptr_t LLSocket::create(apr_status_t& status, LLSocket::ptr_t& listen_socket)
+LLSocket::ptr_t LLSocket::create(apr_socket_t* socket, apr_pool_t* pool)
{
LLMemType m1(LLMemType::MTYPE_IO_TCP);
- if (!listen_socket->getSocket())
+ LLSocket::ptr_t rv;
+ if(!socket)
{
- status = APR_ENOSOCKET;
- return LLSocket::ptr_t();
- }
- LLSocket::ptr_t rv(new LLSocket);
- lldebugs << "accepting socket" << llendl;
- status = apr_socket_accept(&rv->mSocket, listen_socket->getSocket(), rv->mPool());
- if (status != APR_SUCCESS)
- {
- rv->mSocket = NULL;
- rv.reset();
return rv;
}
+ rv = ptr_t(new LLSocket(socket, pool));
rv->mPort = PORT_EPHEMERAL;
rv->setNonBlocking();
return rv;
}
+
bool LLSocket::blockingConnect(const LLHost& host)
{
if(!mSocket) return false;
@@ -211,7 +223,7 @@ bool LLSocket::blockingConnect(const LLHost& host)
APR_UNSPEC,
host.getPort(),
0,
- mPool())))
+ mPool)))
{
return false;
}
@@ -222,11 +234,13 @@ bool LLSocket::blockingConnect(const LLHost& host)
return true;
}
-LLSocket::LLSocket() :
- mSocket(NULL),
- mPool(LLThread::tldata().mRootPool),
+LLSocket::LLSocket(apr_socket_t* socket, apr_pool_t* pool) :
+ mSocket(socket),
+ mPool(pool),
mPort(PORT_INVALID)
{
+ ll_debug_socket("Constructing wholely formed socket", mSocket);
+ LLMemType m1(LLMemType::MTYPE_IO_TCP);
}
LLSocket::~LLSocket()
@@ -239,6 +253,10 @@ LLSocket::~LLSocket()
apr_socket_close(mSocket);
mSocket = NULL;
}
+ if(mPool)
+ {
+ apr_pool_destroy(mPool);
+ }
}
// See http://dev.ariel-networks.com/apr/apr-tutorial/html/apr-tutorial-13.html#ss13.4
@@ -427,6 +445,7 @@ LLIOPipe::EStatus LLIOSocketWriter::process_impl(
// efficient - not only because writev() is better, but also
// because we won't have to do as much work to find the start
// address.
+ buffer->lock();
LLBufferArray::segment_iterator_t it;
LLBufferArray::segment_iterator_t end = buffer->endSegment();
LLSegment segment;
@@ -506,6 +525,8 @@ LLIOPipe::EStatus LLIOSocketWriter::process_impl(
}
}
+ buffer->unlock();
+
PUMP_DEBUG;
if(done && eos)
{
@@ -520,8 +541,10 @@ LLIOPipe::EStatus LLIOSocketWriter::process_impl(
///
LLIOServerSocket::LLIOServerSocket(
+ apr_pool_t* pool,
LLIOServerSocket::socket_t listener,
factory_t factory) :
+ mPool(pool),
mListenSocket(listener),
mReactor(factory),
mInitialized(false),
@@ -583,15 +606,21 @@ LLIOPipe::EStatus LLIOServerSocket::process_impl(
lldebugs << "accepting socket" << llendl;
PUMP_DEBUG;
- apr_status_t status;
- LLSocket::ptr_t llsocket(LLSocket::create(status, mListenSocket));
+ apr_pool_t* new_pool = NULL;
+ apr_status_t status = apr_pool_create(&new_pool, mPool);
+ apr_socket_t* socket = NULL;
+ status = apr_socket_accept(
+ &socket,
+ mListenSocket->getSocket(),
+ new_pool);
+ LLSocket::ptr_t llsocket(LLSocket::create(socket, new_pool));
//EStatus rv = STATUS_ERROR;
- if(llsocket && status == APR_SUCCESS)
+ if(llsocket)
{
PUMP_DEBUG;
apr_sockaddr_t* remote_addr;
- apr_socket_addr_get(&remote_addr, APR_REMOTE, llsocket->getSocket());
+ apr_socket_addr_get(&remote_addr, APR_REMOTE, socket);
char* remote_host_string;
apr_sockaddr_ip_get(&remote_host_string, remote_addr);
@@ -606,6 +635,7 @@ LLIOPipe::EStatus LLIOServerSocket::process_impl(
{
chain.push_back(LLIOPipe::ptr_t(new LLIOSocketWriter(llsocket)));
pump->addChain(chain, mResponseTimeout);
+ status = STATUS_OK;
}
else
{
@@ -614,8 +644,7 @@ LLIOPipe::EStatus LLIOServerSocket::process_impl(
}
else
{
- char buf[256];
- llwarns << "Unable to accept linden socket: " << apr_strerror(status, buf, sizeof(buf)) << llendl;
+ llwarns << "Unable to create linden socket." << llendl;
}
PUMP_DEBUG;
@@ -628,10 +657,11 @@ LLIOPipe::EStatus LLIOServerSocket::process_impl(
#if 0
LLIODataSocket::LLIODataSocket(
U16 suggested_port,
- U16 start_discovery_port) :
+ U16 start_discovery_port,
+ apr_pool_t* pool) :
mSocket(NULL)
{
- if(PORT_INVALID == suggested_port) return;
+ if(!pool || (PORT_INVALID == suggested_port)) return;
if(ll_apr_warn_status(apr_socket_create(&mSocket, APR_INET, SOCK_DGRAM, APR_PROTO_UDP, pool))) return;
apr_sockaddr_t* sa = NULL;
if(ll_apr_warn_status(apr_sockaddr_info_get(&sa, APR_ANYADDR, APR_UNSPEC, suggested_port, 0, pool))) return;
diff --git a/indra/llmessage/lliosocket.h b/indra/llmessage/lliosocket.h
index f0a6f25657..be0f7dfcc6 100644
--- a/indra/llmessage/lliosocket.h
+++ b/indra/llmessage/lliosocket.h
@@ -38,6 +38,7 @@
*/
#include "lliopipe.h"
+#include "apr_pools.h"
#include "apr_network_io.h"
#include "llchainio.h"
@@ -87,22 +88,34 @@ public:
* socket. If you intend the socket to be known to external
* clients without prior port notification, do not use
* PORT_EPHEMERAL.
+ * @param pool The apr pool to use. A child pool will be created
+ * and associated with the socket.
* @param type The type of socket to create
* @param port The port for the socket
* @return A valid socket shared pointer if the call worked.
*/
static ptr_t create(
+ apr_pool_t* pool,
EType type,
U16 port = PORT_EPHEMERAL);
/**
- * @brief Create a LLSocket by accepting a connection from a listen socket.
+ * @brief Create a LLSocket when you already have an apr socket.
*
- * @param status Output. Status of the accept if a valid listen socket was passed.
- * @param listen_socket The listen socket to use.
+ * This method assumes an ephemeral port. This is typically used
+ * by calls which spawn a socket such as a call to
+ * <code>accept()</code> as in the server socket. This call should
+ * not fail if you have a valid apr socket.
+ * Because of the nature of how accept() works, you are expected
+ * to create a new pool for the socket, use that pool for the
+ * accept, and pass it in here where it will be bound with the
+ * socket and destroyed at the same time.
+ * @param socket The apr socket to use
+ * @param pool The pool used to create the socket. *NOTE: The pool
+ * passed in will be DESTROYED.
* @return A valid socket shared pointer if the call worked.
*/
- static ptr_t create(apr_status_t& status, ptr_t& listen_socket);
+ static ptr_t create(apr_socket_t* socket, apr_pool_t* pool);
/**
* @brief Perform a blocking connect to a host. Do not use in production.
@@ -133,12 +146,6 @@ public:
apr_socket_t* getSocket() const { return mSocket; }
/**
- * @brief Protected constructor since should only make sockets
- * with one of the two <code>create()</code> calls.
- */
- LLSocket(void);
-
- /**
* @brief Set default socket options, with SO_NONBLOCK = 0 and a timeout in us.
* @param timeout Number of microseconds to wait on this socket. Any
* negative number means block-forever. TIMEOUT OF 0 IS NON-PORTABLE.
@@ -167,8 +174,8 @@ protected:
// The apr socket.
apr_socket_t* mSocket;
- // Our memory pool.
- LLAPRPool mPool;
+ // our memory pool
+ apr_pool_t* mPool;
// The port if we know it.
U16 mPort;
@@ -293,7 +300,7 @@ class LLIOServerSocket : public LLIOPipe
public:
typedef LLSocket::ptr_t socket_t;
typedef boost::shared_ptr<LLChainIOFactory> factory_t;
- LLIOServerSocket(socket_t listener, factory_t reactor);
+ LLIOServerSocket(apr_pool_t* pool, socket_t listener, factory_t reactor);
virtual ~LLIOServerSocket();
/**
@@ -325,6 +332,7 @@ protected:
//@}
protected:
+ apr_pool_t* mPool;
socket_t mListenSocket;
factory_t mReactor;
bool mInitialized;
@@ -358,7 +366,8 @@ public:
*/
LLIODataSocket(
U16 suggested_port,
- U16 start_discovery_port);
+ U16 start_discovery_port,
+ apr_pool_t* pool);
virtual ~LLIODataSocket();
protected:
diff --git a/indra/llmessage/llmail.cpp b/indra/llmessage/llmail.cpp
index 8a898ab1b0..08b31e9c7a 100644
--- a/indra/llmessage/llmail.cpp
+++ b/indra/llmessage/llmail.cpp
@@ -50,7 +50,6 @@
#include "llstring.h"
#include "lluuid.h"
#include "net.h"
-#include "llaprpool.h"
//
// constants
@@ -58,7 +57,7 @@
const size_t LL_MAX_KNOWN_GOOD_MAIL_SIZE = 4096;
static bool gMailEnabled = true;
-static LLAPRPool gMailPool;
+static apr_pool_t* gMailPool;
static apr_sockaddr_t* gSockAddr;
static apr_socket_t* gMailSocket;
@@ -83,7 +82,7 @@ bool connect_smtp()
gSockAddr->sa.sin.sin_family,
SOCK_STREAM,
APR_PROTO_TCP,
- gMailPool());
+ gMailPool);
if(ll_apr_warn_status(status)) return false;
status = apr_socket_connect(gMailSocket, gSockAddr);
if(ll_apr_warn_status(status))
@@ -140,19 +139,19 @@ BOOL LLMail::send(
}
// static
-void LLMail::init(const std::string& hostname)
+void LLMail::init(const std::string& hostname, apr_pool_t* pool)
{
gMailSocket = NULL;
- if (hostname.empty())
+ if(hostname.empty() || !pool)
{
+ gMailPool = NULL;
gSockAddr = NULL;
- gMailPool.destroy();
}
else
{
- gMailPool.create();
+ gMailPool = pool;
- // Collect all the information into a sockaddr structure. the
+ // collect all the information into a socaddr sturcture. the
// documentation is a bit unclear, but I either have to
// specify APR_UNSPEC or not specify any flags. I am not sure
// which option is better.
@@ -162,7 +161,7 @@ void LLMail::init(const std::string& hostname)
APR_UNSPEC,
25,
APR_IPV4_ADDR_OK,
- gMailPool());
+ gMailPool);
ll_apr_warn_status(status);
}
}
diff --git a/indra/llmessage/llmail.h b/indra/llmessage/llmail.h
index 0a5c532088..3791714363 100644
--- a/indra/llmessage/llmail.h
+++ b/indra/llmessage/llmail.h
@@ -27,13 +27,15 @@
#ifndef LL_LLMAIL_H
#define LL_LLMAIL_H
+typedef struct apr_pool_t apr_pool_t;
+
#include "llsd.h"
class LLMail
{
public:
// if hostname is NULL, then the host is resolved as 'mail'
- static void init(const std::string& hostname);
+ static void init(const std::string& hostname, apr_pool_t* pool);
// Allow all email transmission to be disabled/enabled.
static void enable(bool mail_enabled);
diff --git a/indra/llmessage/llproxy.cpp b/indra/llmessage/llproxy.cpp
index 4a7d326c0e..9988fcd9c0 100644
--- a/indra/llmessage/llproxy.cpp
+++ b/indra/llmessage/llproxy.cpp
@@ -49,7 +49,7 @@ static void tcp_close_channel(LLSocket::ptr_t* handle_ptr); // Close an open TCP
LLProxy::LLProxy():
mHTTPProxyEnabled(false),
- mProxyMutex(),
+ mProxyMutex(NULL),
mUDPProxy(),
mTCPProxy(),
mHTTPProxy(),
@@ -524,7 +524,7 @@ static apr_status_t tcp_blocking_handshake(LLSocket::ptr_t handle, char * dataou
*/
static LLSocket::ptr_t tcp_open_channel(LLHost host)
{
- LLSocket::ptr_t socket = LLSocket::create(LLSocket::STREAM_TCP);
+ LLSocket::ptr_t socket = LLSocket::create(NULL, LLSocket::STREAM_TCP);
bool connected = socket->blockingConnect(host);
if (!connected)
{
diff --git a/indra/llmessage/llpumpio.cpp b/indra/llmessage/llpumpio.cpp
index 89cfd66e1b..f3ef4f2684 100644
--- a/indra/llmessage/llpumpio.cpp
+++ b/indra/llmessage/llpumpio.cpp
@@ -37,7 +37,6 @@
#include "llmemtype.h"
#include "llstl.h"
#include "llstat.h"
-#include "llthread.h"
// These should not be enabled in production, but they can be
// intensely useful during development for finding certain kinds of
@@ -163,12 +162,14 @@ struct ll_delete_apr_pollset_fd_client_data
/**
* LLPumpIO
*/
-LLPumpIO::LLPumpIO(void) :
+LLPumpIO::LLPumpIO(apr_pool_t* pool) :
mState(LLPumpIO::NORMAL),
mRebuildPollset(false),
mPollset(NULL),
mPollsetClientID(0),
mNextLock(0),
+ mPool(NULL),
+ mCurrentPool(NULL),
mCurrentPoolReallocCount(0),
mChainsMutex(NULL),
mCallbackMutex(NULL),
@@ -177,27 +178,24 @@ LLPumpIO::LLPumpIO(void) :
mCurrentChain = mRunningChains.end();
LLMemType m1(LLMemType::MTYPE_IO_PUMP);
- initialize();
+ initialize(pool);
}
LLPumpIO::~LLPumpIO()
{
LLMemType m1(LLMemType::MTYPE_IO_PUMP);
-#if LL_THREADS_APR
- if (mChainsMutex) apr_thread_mutex_destroy(mChainsMutex);
- if (mCallbackMutex) apr_thread_mutex_destroy(mCallbackMutex);
-#endif
- mChainsMutex = NULL;
- mCallbackMutex = NULL;
- if(mPollset)
- {
-// lldebugs << "cleaning up pollset" << llendl;
- apr_pollset_destroy(mPollset);
- mPollset = NULL;
- }
+ cleanup();
+}
+
+bool LLPumpIO::prime(apr_pool_t* pool)
+{
+ LLMemType m1(LLMemType::MTYPE_IO_PUMP);
+ cleanup();
+ initialize(pool);
+ return ((pool == NULL) ? false : true);
}
-bool LLPumpIO::addChain(const chain_t& chain, F32 timeout)
+bool LLPumpIO::addChain(const chain_t& chain, F32 timeout, bool has_curl_request)
{
LLMemType m1(LLMemType::MTYPE_IO_PUMP);
if(chain.empty()) return false;
@@ -206,8 +204,10 @@ bool LLPumpIO::addChain(const chain_t& chain, F32 timeout)
LLScopedLock lock(mChainsMutex);
#endif
LLChainInfo info;
+ info.mHasCurlRequest = has_curl_request;
info.setTimeoutSeconds(timeout);
info.mData = LLIOPipe::buffer_ptr_t(new LLBufferArray);
+ info.mData->setThreaded(has_curl_request);
LLLinkInfo link;
#if LL_DEBUG_PIPE_TYPE_IN_PUMP
lldebugs << "LLPumpIO::addChain() " << chain[0] << " '"
@@ -354,7 +354,8 @@ bool LLPumpIO::setConditional(LLIOPipe* pipe, const apr_pollfd_t* poll)
{
// each fd needs a pool to work with, so if one was
// not specified, use this pool.
- value.second.p = (*mCurrentChain).mDescriptorsPool->operator()();
+ // *FIX: Should it always be this pool?
+ value.second.p = mPool;
}
value.second.client_data = new S32(++mPollsetClientID);
(*mCurrentChain).mDescriptors.push_back(value);
@@ -441,6 +442,15 @@ void LLPumpIO::pump()
static LLFastTimer::DeclareTimer FTM_PUMP_IO("Pump IO");
+LLPumpIO::current_chain_t LLPumpIO::removeRunningChain(LLPumpIO::current_chain_t& run_chain)
+{
+ std::for_each(
+ (*run_chain).mDescriptors.begin(),
+ (*run_chain).mDescriptors.end(),
+ ll_delete_apr_pollset_fd_client_data());
+ return mRunningChains.erase(run_chain);
+}
+
//timeout is in microseconds
void LLPumpIO::pump(const S32& poll_timeout)
{
@@ -586,10 +596,16 @@ void LLPumpIO::pump(const S32& poll_timeout)
// << (*run_chain).mChainLinks[0].mPipe
// << " because we reached the end." << llendl;
#endif
- run_chain = mRunningChains.erase(run_chain);
+ run_chain = removeRunningChain(run_chain);
continue;
}
}
+ else if(isChainExpired(*run_chain))
+ {
+ run_chain = removeRunningChain(run_chain);
+ continue;
+ }
+
PUMP_DEBUG;
if((*run_chain).mLock)
{
@@ -697,11 +713,7 @@ void LLPumpIO::pump(const S32& poll_timeout)
PUMP_DEBUG;
// This chain is done. Clean up any allocated memory and
// erase the chain info.
- std::for_each(
- (*run_chain).mDescriptors.begin(),
- (*run_chain).mDescriptors.end(),
- ll_delete_apr_pollset_fd_client_data());
- run_chain = mRunningChains.erase(run_chain);
+ run_chain = removeRunningChain(run_chain);
// *NOTE: may not always need to rebuild the pollset.
mRebuildPollset = true;
@@ -826,15 +838,39 @@ void LLPumpIO::control(LLPumpIO::EControl op)
}
}
-void LLPumpIO::initialize(void)
+void LLPumpIO::initialize(apr_pool_t* pool)
{
LLMemType m1(LLMemType::MTYPE_IO_PUMP);
- mPool.create();
+ if(!pool) return;
#if LL_THREADS_APR
// SJB: Windows defaults to NESTED and OSX defaults to UNNESTED, so use UNNESTED explicitly.
- apr_thread_mutex_create(&mChainsMutex, APR_THREAD_MUTEX_UNNESTED, mPool());
- apr_thread_mutex_create(&mCallbackMutex, APR_THREAD_MUTEX_UNNESTED, mPool());
+ apr_thread_mutex_create(&mChainsMutex, APR_THREAD_MUTEX_UNNESTED, pool);
+ apr_thread_mutex_create(&mCallbackMutex, APR_THREAD_MUTEX_UNNESTED, pool);
#endif
+ mPool = pool;
+}
+
+void LLPumpIO::cleanup()
+{
+ LLMemType m1(LLMemType::MTYPE_IO_PUMP);
+#if LL_THREADS_APR
+ if(mChainsMutex) apr_thread_mutex_destroy(mChainsMutex);
+ if(mCallbackMutex) apr_thread_mutex_destroy(mCallbackMutex);
+#endif
+ mChainsMutex = NULL;
+ mCallbackMutex = NULL;
+ if(mPollset)
+ {
+// lldebugs << "cleaning up pollset" << llendl;
+ apr_pollset_destroy(mPollset);
+ mPollset = NULL;
+ }
+ if(mCurrentPool)
+ {
+ apr_pool_destroy(mCurrentPool);
+ mCurrentPool = NULL;
+ }
+ mPool = NULL;
}
void LLPumpIO::rebuildPollset()
@@ -862,19 +898,21 @@ void LLPumpIO::rebuildPollset()
if(mCurrentPool
&& (0 == (++mCurrentPoolReallocCount % POLLSET_POOL_RECYCLE_COUNT)))
{
- mCurrentPool.destroy();
+ apr_pool_destroy(mCurrentPool);
+ mCurrentPool = NULL;
mCurrentPoolReallocCount = 0;
}
if(!mCurrentPool)
{
- mCurrentPool.create(mPool);
+ apr_status_t status = apr_pool_create(&mCurrentPool, mPool);
+ (void)ll_apr_warn_status(status);
}
// add all of the file descriptors
run_it = mRunningChains.begin();
LLChainInfo::conditionals_t::iterator fd_it;
LLChainInfo::conditionals_t::iterator fd_end;
- apr_pollset_create(&mPollset, size, mCurrentPool(), 0);
+ apr_pollset_create(&mPollset, size, mCurrentPool, 0);
for(; run_it != run_end; ++run_it)
{
fd_it = (*run_it).mDescriptors.begin();
@@ -1070,6 +1108,24 @@ void LLPumpIO::processChain(LLChainInfo& chain)
PUMP_DEBUG;
}
+bool LLPumpIO::isChainExpired(LLChainInfo& chain)
+{
+ if(!chain.mHasCurlRequest)
+ {
+ return false ;
+ }
+
+ for(links_t::iterator iter = chain.mChainLinks.begin(); iter != chain.mChainLinks.end(); ++iter)
+ {
+ if(!(*iter).mPipe->isValid())
+ {
+ return true ;
+ }
+ }
+
+ return false ;
+}
+
bool LLPumpIO::handleChainError(
LLChainInfo& chain,
LLIOPipe::EStatus error)
@@ -1111,6 +1167,9 @@ bool LLPumpIO::handleChainError(
#endif
keep_going = false;
break;
+ case LLIOPipe::STATUS_EXPIRED:
+ keep_going = false;
+ break ;
default:
if(LLIOPipe::isSuccess(error))
{
@@ -1133,7 +1192,7 @@ LLPumpIO::LLChainInfo::LLChainInfo() :
mInit(false),
mLock(0),
mEOS(false),
- mDescriptorsPool(new LLAPRPool(LLThread::tldata().mRootPool))
+ mHasCurlRequest(false)
{
LLMemType m1(LLMemType::MTYPE_IO_PUMP);
mTimer.setTimerExpirySec(DEFAULT_CHAIN_EXPIRY_SECS);
diff --git a/indra/llmessage/llpumpio.h b/indra/llmessage/llpumpio.h
index 75c35ae7ab..d2c5d37571 100644
--- a/indra/llmessage/llpumpio.h
+++ b/indra/llmessage/llpumpio.h
@@ -30,12 +30,11 @@
#define LL_LLPUMPIO_H
#include <set>
-#include <boost/shared_ptr.hpp>
#if LL_LINUX // needed for PATH_MAX in APR.
#include <sys/param.h>
#endif
-#include "llaprpool.h"
+#include "apr_pools.h"
#include "llbuffer.h"
#include "llframetimer.h"
#include "lliopipe.h"
@@ -59,8 +58,9 @@ extern const F32 NEVER_CHAIN_EXPIRY_SECS;
* <code>pump()</code> on a thread used for IO and call
* <code>respond()</code> on a thread that is expected to do higher
* level processing. You can call almost any other method from any
- * thread - see notes for each method for details.
- *
+ * thread - see notes for each method for details. In order for the
+ * threading abstraction to work, you need to call <code>prime()</code>
+ * with a valid apr pool.
* A pump instance manages much of the state for the pipe, including
* the list of pipes in the chain, the channel for each element in the
* chain, the buffer, and if any pipe has marked the stream or process
@@ -79,7 +79,7 @@ public:
/**
* @brief Constructor.
*/
- LLPumpIO(void);
+ LLPumpIO(apr_pool_t* pool);
/**
* @brief Destructor.
@@ -87,6 +87,17 @@ public:
~LLPumpIO();
/**
+ * @brief Prepare this pump for usage.
+ *
+ * If you fail to call this method prior to use, the pump will
+ * try to work, but will not come with any thread locking
+ * mechanisms.
+ * @param pool The apr pool to use.
+ * @return Returns true if the pump is primed.
+ */
+ bool prime(apr_pool_t* pool);
+
+ /**
* @brief Typedef for having a chain of pipes.
*/
typedef std::vector<LLIOPipe::ptr_t> chain_t;
@@ -100,9 +111,10 @@ public:
* @param chain The pipes for the chain
* @param timeout The number of seconds in the future to
* expire. Pass in 0.0f to never expire.
+ * @param has_curl_request The chain contains LLURLRequest if true.
* @return Returns true if anything was added to the pump.
*/
- bool addChain(const chain_t& chain, F32 timeout);
+ bool addChain(const chain_t& chain, F32 timeout, bool has_curl_request = false);
/**
* @brief Struct to associate a pipe with it's buffer io indexes.
@@ -345,19 +357,19 @@ protected:
// basic member data
bool mInit;
+ bool mEOS;
+ bool mHasCurlRequest;
S32 mLock;
LLFrameTimer mTimer;
links_t::iterator mHead;
links_t mChainLinks;
- LLIOPipe::buffer_ptr_t mData;
- bool mEOS;
+ LLIOPipe::buffer_ptr_t mData;
LLSD mContext;
// tracking inside the pump
typedef std::pair<LLIOPipe::ptr_t, apr_pollfd_t> pipe_conditional_t;
typedef std::vector<pipe_conditional_t> conditionals_t;
conditionals_t mDescriptors;
- boost::shared_ptr<LLAPRPool> mDescriptorsPool;
};
// All the running chains & info
@@ -376,9 +388,9 @@ protected:
callbacks_t mPendingCallbacks;
callbacks_t mCallbacks;
- // Memory pool for pollsets & mutexes.
- LLAPRPool mPool;
- LLAPRPool mCurrentPool;
+ // memory allocator for pollsets & mutexes.
+ apr_pool_t* mPool;
+ apr_pool_t* mCurrentPool;
S32 mCurrentPoolReallocCount;
#if LL_THREADS_APR
@@ -390,8 +402,9 @@ protected:
#endif
protected:
- void initialize();
-
+ void initialize(apr_pool_t* pool);
+ void cleanup();
+ current_chain_t removeRunningChain(current_chain_t& chain) ;
/**
* @brief Given the internal state of the chains, rebuild the pollset
* @see setConditional()
@@ -418,6 +431,9 @@ protected:
*/
bool handleChainError(LLChainInfo& chain, LLIOPipe::EStatus error);
+ //if the chain is expired, remove it
+ bool isChainExpired(LLChainInfo& chain) ;
+
public:
/**
* @brief Return number of running chains.
diff --git a/indra/llmessage/llsdmessagereader.cpp b/indra/llmessage/llsdmessagereader.cpp
index 304a692cdf..3d8ca2ad9f 100644
--- a/indra/llmessage/llsdmessagereader.cpp
+++ b/indra/llmessage/llsdmessagereader.cpp
@@ -291,9 +291,10 @@ S32 getElementSize(const LLSD& llsd)
case LLSD::TypeMap:
case LLSD::TypeArray:
case LLSD::TypeUndefined:
+ default: // TypeLLSDTypeEnd, TypeLLSDNumTypes, etc.
return 0;
}
- return 0;
+ //return 0;
}
//virtual
diff --git a/indra/llmessage/llsdrpcclient.h b/indra/llmessage/llsdrpcclient.h
index 9fb49a5c33..0cecf4f688 100644
--- a/indra/llmessage/llsdrpcclient.h
+++ b/indra/llmessage/llsdrpcclient.h
@@ -240,9 +240,16 @@ public:
virtual bool build(LLPumpIO::chain_t& chain, LLSD context) const
{
lldebugs << "LLSDRPCClientFactory::build" << llendl;
- LLIOPipe::ptr_t service(new Client);
- chain.push_back(service);
LLURLRequest* http(new LLURLRequest(LLURLRequest::HTTP_POST));
+ if(!http->isValid())
+ {
+ llwarns << "Creating LLURLRequest failed." << llendl ;
+ delete http;
+ return false;
+ }
+
+ LLIOPipe::ptr_t service(new Client);
+ chain.push_back(service);
LLIOPipe::ptr_t http_pipe(http);
http->addHeader("Content-Type: text/llsd");
if(mURL.empty())
@@ -283,9 +290,16 @@ public:
virtual bool build(LLPumpIO::chain_t& chain, LLSD context) const
{
lldebugs << "LLXMLSDRPCClientFactory::build" << llendl;
- LLIOPipe::ptr_t service(new Client);
- chain.push_back(service);
+
LLURLRequest* http(new LLURLRequest(LLURLRequest::HTTP_POST));
+ if(!http->isValid())
+ {
+ llwarns << "Creating LLURLRequest failed." << llendl ;
+ delete http;
+ return false ;
+ }
+ LLIOPipe::ptr_t service(new Client);
+ chain.push_back(service);
LLIOPipe::ptr_t http_pipe(http);
http->addHeader("Content-Type: text/xml");
if(mURL.empty())
diff --git a/indra/llmessage/llurlrequest.cpp b/indra/llmessage/llurlrequest.cpp
index 91a5a8ce2c..a16f5c7bf0 100644
--- a/indra/llmessage/llurlrequest.cpp
+++ b/indra/llmessage/llurlrequest.cpp
@@ -41,7 +41,6 @@
#include "llstring.h"
#include "apr_env.h"
#include "llapr.h"
-#include "llscopedvolatileaprpool.h"
static const U32 HTTP_STATUS_PIPE_ERROR = 499;
/**
@@ -65,7 +64,7 @@ public:
~LLURLRequestDetail();
std::string mURL;
LLCurlEasyRequest* mCurlRequest;
- LLBufferArray* mResponseBuffer;
+ LLIOPipe::buffer_ptr_t mResponseBuffer;
LLChannelDescriptors mChannels;
U8* mLastRead;
U32 mBodyLimit;
@@ -76,7 +75,6 @@ public:
LLURLRequestDetail::LLURLRequestDetail() :
mCurlRequest(NULL),
- mResponseBuffer(NULL),
mLastRead(NULL),
mBodyLimit(0),
mByteAccumulator(0),
@@ -85,13 +83,18 @@ LLURLRequestDetail::LLURLRequestDetail() :
{
LLMemType m1(LLMemType::MTYPE_IO_URL_REQUEST);
mCurlRequest = new LLCurlEasyRequest();
+
+ if(!mCurlRequest->isValid()) //failed.
+ {
+ delete mCurlRequest ;
+ mCurlRequest = NULL ;
+ }
}
LLURLRequestDetail::~LLURLRequestDetail()
{
LLMemType m1(LLMemType::MTYPE_IO_URL_REQUEST);
delete mCurlRequest;
- mResponseBuffer = NULL;
mLastRead = NULL;
}
@@ -171,6 +174,7 @@ LLURLRequest::~LLURLRequest()
{
LLMemType m1(LLMemType::MTYPE_IO_URL_REQUEST);
delete mDetail;
+ mDetail = NULL ;
}
void LLURLRequest::setURL(const std::string& url)
@@ -212,31 +216,27 @@ void LLURLRequest::setCallback(LLURLRequestComplete* callback)
// is called with use_proxy = FALSE
void LLURLRequest::useProxy(bool use_proxy)
{
- static std::string env_proxy;
+ static char *env_proxy;
- if (use_proxy && env_proxy.empty())
+ if (use_proxy && (env_proxy == NULL))
{
- char* env_proxy_str;
- LLScopedVolatileAPRPool scoped_pool;
- apr_status_t status = apr_env_get(&env_proxy_str, "ALL_PROXY", scoped_pool);
+ apr_status_t status;
+ LLAPRPool pool;
+ status = apr_env_get(&env_proxy, "ALL_PROXY", pool.getAPRPool());
if (status != APR_SUCCESS)
{
- status = apr_env_get(&env_proxy_str, "http_proxy", scoped_pool);
+ status = apr_env_get(&env_proxy, "http_proxy", pool.getAPRPool());
}
if (status != APR_SUCCESS)
{
- use_proxy = false;
+ use_proxy = FALSE;
}
- else
- {
- // env_proxy_str is stored in the scoped_pool, so we have to make a copy.
- env_proxy = env_proxy_str;
- }
}
- LL_DEBUGS("Proxy") << "use_proxy = " << (use_proxy?'Y':'N') << ", env_proxy = " << (!env_proxy.empty() ? env_proxy : "(null)") << LL_ENDL;
- if (use_proxy && !env_proxy.empty())
+ lldebugs << "use_proxy = " << (use_proxy?'Y':'N') << ", env_proxy = " << (env_proxy ? env_proxy : "(null)") << llendl;
+
+ if (env_proxy && use_proxy)
{
mDetail->mCurlRequest->setoptString(CURLOPT_PROXY, env_proxy);
}
@@ -256,12 +256,24 @@ void LLURLRequest::allowCookies()
mDetail->mCurlRequest->setoptString(CURLOPT_COOKIEFILE, "");
}
+//virtual
+bool LLURLRequest::isValid()
+{
+ return mDetail->mCurlRequest && mDetail->mCurlRequest->isValid();
+}
+
// virtual
LLIOPipe::EStatus LLURLRequest::handleError(
LLIOPipe::EStatus status,
LLPumpIO* pump)
{
LLMemType m1(LLMemType::MTYPE_IO_URL_REQUEST);
+
+ if(!isValid())
+ {
+ return STATUS_EXPIRED ;
+ }
+
if(mCompletionCallback && pump)
{
LLURLRequestComplete* complete = NULL;
@@ -330,7 +342,7 @@ LLIOPipe::EStatus LLURLRequest::process_impl(
// *FIX: bit of a hack, but it should work. The configure and
// callback method expect this information to be ready.
- mDetail->mResponseBuffer = buffer.get();
+ mDetail->mResponseBuffer = buffer;
mDetail->mChannels = channels;
if(!configure())
{
@@ -349,7 +361,10 @@ LLIOPipe::EStatus LLURLRequest::process_impl(
static LLFastTimer::DeclareTimer FTM_URL_PERFORM("Perform");
{
LLFastTimer t(FTM_URL_PERFORM);
- mDetail->mCurlRequest->perform();
+ if(!mDetail->mCurlRequest->wait())
+ {
+ return status ;
+ }
}
while(1)
@@ -444,6 +459,12 @@ void LLURLRequest::initialize()
LLMemType m1(LLMemType::MTYPE_IO_URL_REQUEST);
mState = STATE_INITIALIZED;
mDetail = new LLURLRequestDetail;
+
+ if(!isValid())
+ {
+ return ;
+ }
+
mDetail->mCurlRequest->setopt(CURLOPT_NOSIGNAL, 1);
mDetail->mCurlRequest->setWriteCallback(&downCallback, (void*)this);
mDetail->mCurlRequest->setReadCallback(&upCallback, (void*)this);
diff --git a/indra/llmessage/llurlrequest.h b/indra/llmessage/llurlrequest.h
index ec5c2c1941..44d358d906 100644
--- a/indra/llmessage/llurlrequest.h
+++ b/indra/llmessage/llurlrequest.h
@@ -188,6 +188,8 @@ public:
*/
void allowCookies();
+ /*virtual*/ bool isValid() ;
+
public:
/**
* @brief Give this pipe a chance to handle a generated error
diff --git a/indra/llmessage/message.cpp b/indra/llmessage/message.cpp
index 7d21e35f96..d0b0e178b8 100644
--- a/indra/llmessage/message.cpp
+++ b/indra/llmessage/message.cpp
@@ -97,10 +97,8 @@ std::string get_shared_secret();
class LLMessagePollInfo
{
public:
- LLMessagePollInfo(void) : mPool(LLThread::tldata().mRootPool) { }
apr_socket_t *mAPRSocketp;
apr_pollfd_t mPollFD;
- LLAPRPool mPool;
};
namespace
@@ -289,13 +287,20 @@ LLMessageSystem::LLMessageSystem(const std::string& filename, U32 port,
}
// LL_DEBUGS("Messaging") << << "*** port: " << mPort << llendl;
- mPollInfop = new LLMessagePollInfo;
-
+ //
+ // Create the data structure that we can poll on
+ //
+ if (!gAPRPoolp)
+ {
+ LL_ERRS("Messaging") << "No APR pool before message system initialization!" << llendl;
+ ll_init_apr();
+ }
apr_socket_t *aprSocketp = NULL;
- apr_os_sock_put(&aprSocketp, (apr_os_sock_t*)&mSocket, mPollInfop->mPool());
+ apr_os_sock_put(&aprSocketp, (apr_os_sock_t*)&mSocket, gAPRPoolp);
+ mPollInfop = new LLMessagePollInfo;
mPollInfop->mAPRSocketp = aprSocketp;
- mPollInfop->mPollFD.p = mPollInfop->mPool();
+ mPollInfop->mPollFD.p = gAPRPoolp;
mPollInfop->mPollFD.desc_type = APR_POLL_SOCKET;
mPollInfop->mPollFD.reqevents = APR_POLLIN;
mPollInfop->mPollFD.rtnevents = 0;
diff --git a/indra/llmessage/tests/llsdmessage_test.cpp b/indra/llmessage/tests/llsdmessage_test.cpp
index 0f2c069303..6871ac0d52 100644
--- a/indra/llmessage/tests/llsdmessage_test.cpp
+++ b/indra/llmessage/tests/llsdmessage_test.cpp
@@ -42,6 +42,7 @@
// external library headers
// other Linden headers
#include "../test/lltut.h"
+#include "../test/catch_and_store_what_in.h"
#include "llsdserialize.h"
#include "llevents.h"
#include "stringize.h"
@@ -72,43 +73,14 @@ namespace tut
template<> template<>
void llsdmessage_object::test<1>()
{
- bool threw = false;
+ std::string threw;
// This should fail...
try
{
LLSDMessage localListener;
}
- catch (const LLEventPump::DupPumpName&)
- {
- threw = true;
- }
- catch (const std::runtime_error& ex)
- {
- // This clause is because on Linux, on the viewer side, for this
- // one test program (though not others!), the
- // LLEventPump::DupPumpName exception isn't caught by the clause
- // above. Warn the user...
- std::cerr << "Failed to catch " << typeid(ex).name() << std::endl;
- // But if the expected exception was thrown, allow the test to
- // succeed anyway. Not sure how else to handle this odd case.
- if (std::string(typeid(ex).name()) == typeid(LLEventPump::DupPumpName).name())
- {
- threw = true;
- }
- else
- {
- // We don't even recognize this exception. Let it propagate
- // out to TUT to fail the test.
- throw;
- }
- }
- catch (...)
- {
- std::cerr << "Utterly failed to catch expected exception!" << std::endl;
- // This case is full of fail. We HAVE to address it.
- throw;
- }
- ensure("second LLSDMessage should throw", threw);
+ CATCH_AND_STORE_WHAT_IN(threw, LLEventPump::DupPumpName)
+ ensure("second LLSDMessage should throw", ! threw.empty());
}
template<> template<>
diff --git a/indra/llmessage/tests/networkio.h b/indra/llmessage/tests/networkio.h
index 23e1c791f4..2aff90ca1e 100644
--- a/indra/llmessage/tests/networkio.h
+++ b/indra/llmessage/tests/networkio.h
@@ -30,6 +30,7 @@
#define LL_NETWORKIO_H
#include "llmemory.h" // LLSingleton
+#include "llapr.h"
#include "llares.h"
#include "llpumpio.h"
#include "llhttpclient.h"
@@ -47,8 +48,14 @@ public:
mServicePump(NULL),
mDone(false)
{
+ ll_init_apr();
+ if (! gAPRPoolp)
+ {
+ throw std::runtime_error("Can't initialize APR");
+ }
+
// Create IO Pump to use for HTTP Requests.
- mServicePump = new LLPumpIO;
+ mServicePump = new LLPumpIO(gAPRPoolp);
LLHTTPClient::setPump(*mServicePump);
if (ll_init_ares() == NULL || !gAres->isInitialized())
{
diff --git a/indra/llplugin/llpluginclassmedia.cpp b/indra/llplugin/llpluginclassmedia.cpp
index c53857fcee..dbd96673a1 100644
--- a/indra/llplugin/llpluginclassmedia.cpp
+++ b/indra/llplugin/llpluginclassmedia.cpp
@@ -1239,6 +1239,14 @@ void LLPluginClassMedia::focus(bool focused)
sendMessage(message);
}
+void LLPluginClassMedia::set_page_zoom_factor( double factor )
+{
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "set_page_zoom_factor");
+
+ message.setValueReal("factor", factor);
+ sendMessage(message);
+}
+
void LLPluginClassMedia::clear_cache()
{
LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "clear_cache");
diff --git a/indra/llplugin/llpluginclassmedia.h b/indra/llplugin/llpluginclassmedia.h
index 1f548f8cc0..5fe8254331 100644
--- a/indra/llplugin/llpluginclassmedia.h
+++ b/indra/llplugin/llpluginclassmedia.h
@@ -41,7 +41,7 @@ class LLPluginClassMedia : public LLPluginProcessParentOwner
LOG_CLASS(LLPluginClassMedia);
public:
LLPluginClassMedia(LLPluginClassMediaOwner *owner);
- ~LLPluginClassMedia();
+ virtual ~LLPluginClassMedia();
// local initialization, called by the media manager when creating a source
bool init(const std::string &launcher_filename,
@@ -202,6 +202,7 @@ public:
bool pluginSupportsMediaBrowser(void);
void focus(bool focused);
+ void set_page_zoom_factor( double factor );
void clear_cache();
void clear_cookies();
void set_cookies(const std::string &cookies);
@@ -269,7 +270,7 @@ public:
std::string getHoverText() const { return mHoverText; };
std::string getHoverLink() const { return mHoverLink; };
- std::string getMediaName() const { return mMediaName; };
+ const std::string& getMediaName() const { return mMediaName; };
std::string getMediaDescription() const { return mMediaDescription; };
// Crash the plugin. If you use this outside of a testbed, you will be punished.
diff --git a/indra/llplugin/llplugininstance.cpp b/indra/llplugin/llplugininstance.cpp
index e8efb233ff..7cde82a20e 100644
--- a/indra/llplugin/llplugininstance.cpp
+++ b/indra/llplugin/llplugininstance.cpp
@@ -29,7 +29,8 @@
#include "linden_common.h"
#include "llplugininstance.h"
-#include "llthread.h" // Needed for LLThread::tldata().mRootPool
+
+#include "llapr.h"
#if LL_WINDOWS
#include "direct.h" // needed for _chdir()
@@ -51,7 +52,6 @@ const char *LLPluginInstance::PLUGIN_INIT_FUNCTION_NAME = "LLPluginInitEntryPoin
* @param[in] owner Plugin instance. TODO:DOC is this a good description of what "owner" is?
*/
LLPluginInstance::LLPluginInstance(LLPluginInstanceMessageListener *owner) :
- mDSOHandlePool(LLThread::tldata().mRootPool),
mDSOHandle(NULL),
mPluginUserData(NULL),
mPluginSendMessageFunction(NULL)
@@ -97,7 +97,7 @@ int LLPluginInstance::load(const std::string& plugin_dir, std::string &plugin_fi
int result = apr_dso_load(&mDSOHandle,
plugin_file.c_str(),
- mDSOHandlePool());
+ gAPRPoolp);
if(result != APR_SUCCESS)
{
char buf[1024];
diff --git a/indra/llplugin/llplugininstance.h b/indra/llplugin/llplugininstance.h
index ee28f68e83..e6926c3e37 100644
--- a/indra/llplugin/llplugininstance.h
+++ b/indra/llplugin/llplugininstance.h
@@ -30,7 +30,6 @@
#include "llstring.h"
#include "llapr.h"
-#include "llaprpool.h"
#include "apr_dso.h"
@@ -40,7 +39,7 @@
class LLPluginInstanceMessageListener
{
public:
- ~LLPluginInstanceMessageListener();
+ virtual ~LLPluginInstanceMessageListener();
/** Plugin receives message from plugin loader shell. */
virtual void receivePluginMessage(const std::string &message) = 0;
};
@@ -89,7 +88,6 @@ private:
static void staticReceiveMessage(const char *message_string, void **user_data);
void receiveMessage(const char *message_string);
- LLAPRPool mDSOHandlePool;
apr_dso_handle_t *mDSOHandle;
void *mPluginUserData;
diff --git a/indra/llplugin/llpluginmessagepipe.cpp b/indra/llplugin/llpluginmessagepipe.cpp
index dd47300b9c..091e93ea4b 100644
--- a/indra/llplugin/llpluginmessagepipe.cpp
+++ b/indra/llplugin/llpluginmessagepipe.cpp
@@ -92,10 +92,12 @@ void LLPluginMessagePipeOwner::killMessagePipe(void)
}
LLPluginMessagePipe::LLPluginMessagePipe(LLPluginMessagePipeOwner *owner, LLSocket::ptr_t socket):
+ mInputMutex(gAPRPoolp),
+ mOutputMutex(gAPRPoolp),
+ mOutputStartIndex(0),
mOwner(owner),
mSocket(socket)
{
-
mOwner->setMessagePipe(this);
}
@@ -111,6 +113,14 @@ bool LLPluginMessagePipe::addMessage(const std::string &message)
{
// queue the message for later output
LLMutexLock lock(&mOutputMutex);
+
+ // If we're starting to use up too much memory, clear
+ if (mOutputStartIndex > 1024 * 1024)
+ {
+ mOutput = mOutput.substr(mOutputStartIndex);
+ mOutputStartIndex = 0;
+ }
+
mOutput += message;
mOutput += MESSAGE_DELIMITER; // message separator
@@ -163,35 +173,44 @@ bool LLPluginMessagePipe::pumpOutput()
if(mSocket)
{
apr_status_t status;
- apr_size_t size;
+ apr_size_t in_size, out_size;
LLMutexLock lock(&mOutputMutex);
- if(!mOutput.empty())
+
+ const char * output_data = &(mOutput.data()[mOutputStartIndex]);
+ if(*output_data != '\0')
{
// write any outgoing messages
- size = (apr_size_t)mOutput.size();
+ in_size = (apr_size_t) (mOutput.size() - mOutputStartIndex);
+ out_size = in_size;
setSocketTimeout(0);
// LL_INFOS("Plugin") << "before apr_socket_send, size = " << size << LL_ENDL;
- status = apr_socket_send(
- mSocket->getSocket(),
- (const char*)mOutput.data(),
- &size);
+ status = apr_socket_send(mSocket->getSocket(),
+ output_data,
+ &out_size);
// LL_INFOS("Plugin") << "after apr_socket_send, size = " << size << LL_ENDL;
- if(status == APR_SUCCESS)
+ if((status == APR_SUCCESS) || APR_STATUS_IS_EAGAIN(status))
{
- // success
- mOutput = mOutput.substr(size);
- }
- else if(APR_STATUS_IS_EAGAIN(status))
- {
- // Socket buffer is full...
- // remove the written part from the buffer and try again later.
- mOutput = mOutput.substr(size);
+ // Success or Socket buffer is full...
+
+ // If we've pumped the entire string, clear it
+ if (out_size == in_size)
+ {
+ mOutputStartIndex = 0;
+ mOutput.clear();
+ }
+ else
+ {
+ llassert(in_size > out_size);
+
+ // Remove the written part from the buffer and try again later.
+ mOutputStartIndex += out_size;
+ }
}
else if(APR_STATUS_IS_EOF(status))
{
diff --git a/indra/llplugin/llpluginmessagepipe.h b/indra/llplugin/llpluginmessagepipe.h
index beb942c0fe..c3498beac0 100644
--- a/indra/llplugin/llpluginmessagepipe.h
+++ b/indra/llplugin/llpluginmessagepipe.h
@@ -40,7 +40,7 @@ class LLPluginMessagePipeOwner
LOG_CLASS(LLPluginMessagePipeOwner);
public:
LLPluginMessagePipeOwner();
- ~LLPluginMessagePipeOwner();
+ virtual ~LLPluginMessagePipeOwner();
// called with incoming messages
virtual void receiveMessageRaw(const std::string &message) = 0;
@@ -86,6 +86,7 @@ protected:
std::string mInput;
LLMutex mOutputMutex;
std::string mOutput;
+ std::string::size_type mOutputStartIndex;
LLPluginMessagePipeOwner *mOwner;
LLSocket::ptr_t mSocket;
diff --git a/indra/llplugin/llpluginprocesschild.cpp b/indra/llplugin/llpluginprocesschild.cpp
index fd63fdde81..f8a282184e 100644
--- a/indra/llplugin/llpluginprocesschild.cpp
+++ b/indra/llplugin/llpluginprocesschild.cpp
@@ -40,7 +40,7 @@ LLPluginProcessChild::LLPluginProcessChild()
{
mState = STATE_UNINITIALIZED;
mInstance = NULL;
- mSocket = LLSocket::create(LLSocket::STREAM_TCP);
+ mSocket = LLSocket::create(gAPRPoolp, LLSocket::STREAM_TCP);
mSleepTime = PLUGIN_IDLE_SECONDS; // default: send idle messages at 100Hz
mCPUElapsed = 0.0f;
mBlockingRequest = false;
diff --git a/indra/llplugin/llpluginprocessparent.cpp b/indra/llplugin/llpluginprocessparent.cpp
index 7aec72731e..f10eaee5b4 100644
--- a/indra/llplugin/llpluginprocessparent.cpp
+++ b/indra/llplugin/llpluginprocessparent.cpp
@@ -31,9 +31,9 @@
#include "llpluginprocessparent.h"
#include "llpluginmessagepipe.h"
#include "llpluginmessageclasses.h"
+#include "stringize.h"
#include "llapr.h"
-#include "llscopedvolatileaprpool.h"
//virtual
LLPluginProcessParentOwner::~LLPluginProcessParentOwner()
@@ -43,7 +43,6 @@ LLPluginProcessParentOwner::~LLPluginProcessParentOwner()
bool LLPluginProcessParent::sUseReadThread = false;
apr_pollset_t *LLPluginProcessParent::sPollSet = NULL;
-LLAPRPool LLPluginProcessParent::sPollSetPool;
bool LLPluginProcessParent::sPollsetNeedsRebuild = false;
LLMutex *LLPluginProcessParent::sInstancesMutex;
std::list<LLPluginProcessParent*> LLPluginProcessParent::sInstances;
@@ -54,7 +53,7 @@ class LLPluginProcessParentPollThread: public LLThread
{
public:
LLPluginProcessParentPollThread() :
- LLThread("LLPluginProcessParentPollThread")
+ LLThread("LLPluginProcessParentPollThread", gAPRPoolp)
{
}
protected:
@@ -79,11 +78,12 @@ protected:
};
-LLPluginProcessParent::LLPluginProcessParent(LLPluginProcessParentOwner* owner)
+LLPluginProcessParent::LLPluginProcessParent(LLPluginProcessParentOwner *owner):
+ mIncomingQueueMutex(gAPRPoolp)
{
if(!sInstancesMutex)
{
- sInstancesMutex = new LLMutex;
+ sInstancesMutex = new LLMutex(gAPRPoolp);
}
mOwner = owner;
@@ -96,7 +96,6 @@ LLPluginProcessParent::LLPluginProcessParent(LLPluginProcessParentOwner* owner)
mBlocked = false;
mPolledInput = false;
mPollFD.client_data = NULL;
- mPollFDPool.create();
mPluginLaunchTimeout = 60.0f;
mPluginLockupTimeout = 15.0f;
@@ -136,7 +135,10 @@ LLPluginProcessParent::~LLPluginProcessParent()
mSharedMemoryRegions.erase(iter);
}
- mProcess.kill();
+ if (mProcess)
+ {
+ mProcess->kill();
+ }
killSockets();
}
@@ -161,8 +163,8 @@ void LLPluginProcessParent::errorState(void)
void LLPluginProcessParent::init(const std::string &launcher_filename, const std::string &plugin_dir, const std::string &plugin_filename, bool debug)
{
- mProcess.setExecutable(launcher_filename);
- mProcess.setWorkingDirectory(plugin_dir);
+ mProcessParams.executable = launcher_filename;
+ mProcessParams.cwd = plugin_dir;
mPluginFile = plugin_filename;
mPluginDir = plugin_dir;
mCPUUsage = 0.0f;
@@ -173,28 +175,44 @@ void LLPluginProcessParent::init(const std::string &launcher_filename, const std
bool LLPluginProcessParent::accept()
{
bool result = false;
+
apr_status_t status = APR_EGENERAL;
+ apr_socket_t *new_socket = NULL;
+
+ status = apr_socket_accept(
+ &new_socket,
+ mListenSocket->getSocket(),
+ gAPRPoolp);
- mSocket = LLSocket::create(status, mListenSocket);
if(status == APR_SUCCESS)
{
// llinfos << "SUCCESS" << llendl;
// Success. Create a message pipe on the new socket
+
+ // we MUST create a new pool for the LLSocket, since it will take ownership of it and delete it in its destructor!
+ apr_pool_t* new_pool = NULL;
+ status = apr_pool_create(&new_pool, gAPRPoolp);
+
+ mSocket = LLSocket::create(new_socket, new_pool);
new LLPluginMessagePipe(this, mSocket);
result = true;
}
+ else if(APR_STATUS_IS_EAGAIN(status))
+ {
+// llinfos << "EAGAIN" << llendl;
+
+ // No incoming connections. This is not an error.
+ status = APR_SUCCESS;
+ }
else
{
- mSocket.reset();
- // EAGAIN means "No incoming connections". This is not an error.
- if (!APR_STATUS_IS_EAGAIN(status))
- {
- // Some other error.
- ll_apr_warn_status(status);
- errorState();
- }
+// llinfos << "Error:" << llendl;
+ ll_apr_warn_status(status);
+
+ // Some other error.
+ errorState();
}
return result;
@@ -260,10 +278,10 @@ void LLPluginProcessParent::idle(void)
case STATE_INITIALIZED:
{
+
apr_status_t status = APR_SUCCESS;
- LLScopedVolatileAPRPool addr_pool;
apr_sockaddr_t* addr = NULL;
- mListenSocket = LLSocket::create(LLSocket::STREAM_TCP);
+ mListenSocket = LLSocket::create(gAPRPoolp, LLSocket::STREAM_TCP);
mBoundPort = 0;
// This code is based on parts of LLSocket::create() in lliosocket.cpp.
@@ -274,7 +292,7 @@ void LLPluginProcessParent::idle(void)
APR_INET,
0, // port 0 = ephemeral ("find me a port")
0,
- addr_pool);
+ gAPRPoolp);
if(ll_apr_warn_status(status))
{
@@ -357,10 +375,8 @@ void LLPluginProcessParent::idle(void)
// Launch the plugin process.
// Only argument to the launcher is the port number we're listening on
- std::stringstream stream;
- stream << mBoundPort;
- mProcess.addArgument(stream.str());
- if(mProcess.launch() != 0)
+ mProcessParams.args.add(stringize(mBoundPort));
+ if (! (mProcess = LLProcess::create(mProcessParams)))
{
errorState();
}
@@ -374,19 +390,18 @@ void LLPluginProcessParent::idle(void)
// The command we're constructing would look like this on the command line:
// osascript -e 'tell application "Terminal"' -e 'set win to do script "gdb -pid 12345"' -e 'do script "continue" in win' -e 'end tell'
- std::stringstream cmd;
-
- mDebugger.setExecutable("/usr/bin/osascript");
- mDebugger.addArgument("-e");
- mDebugger.addArgument("tell application \"Terminal\"");
- mDebugger.addArgument("-e");
- cmd << "set win to do script \"gdb -pid " << mProcess.getProcessID() << "\"";
- mDebugger.addArgument(cmd.str());
- mDebugger.addArgument("-e");
- mDebugger.addArgument("do script \"continue\" in win");
- mDebugger.addArgument("-e");
- mDebugger.addArgument("end tell");
- mDebugger.launch();
+ LLProcess::Params params;
+ params.executable = "/usr/bin/osascript";
+ params.args.add("-e");
+ params.args.add("tell application \"Terminal\"");
+ params.args.add("-e");
+ params.args.add(STRINGIZE("set win to do script \"gdb -pid "
+ << mProcess->getProcessID() << "\""));
+ params.args.add("-e");
+ params.args.add("do script \"continue\" in win");
+ params.args.add("-e");
+ params.args.add("end tell");
+ mDebugger = LLProcess::create(params);
#endif
}
@@ -456,7 +471,7 @@ void LLPluginProcessParent::idle(void)
break;
case STATE_EXITING:
- if(!mProcess.isRunning())
+ if (! mProcess->isRunning())
{
setState(STATE_CLEANUP);
}
@@ -484,7 +499,7 @@ void LLPluginProcessParent::idle(void)
break;
case STATE_CLEANUP:
- mProcess.kill();
+ mProcess->kill();
killSockets();
setState(STATE_DONE);
break;
@@ -587,7 +602,7 @@ void LLPluginProcessParent::setMessagePipe(LLPluginMessagePipe *message_pipe)
if(message_pipe != NULL)
{
// Set up the apr_pollfd_t
- mPollFD.p = mPollFDPool();
+ mPollFD.p = gAPRPoolp;
mPollFD.desc_type = APR_POLL_SOCKET;
mPollFD.reqevents = APR_POLLIN|APR_POLLERR|APR_POLLHUP;
mPollFD.rtnevents = 0;
@@ -634,7 +649,6 @@ void LLPluginProcessParent::updatePollset()
// delete the existing pollset.
apr_pollset_destroy(sPollSet);
sPollSet = NULL;
- sPollSetPool.destroy();
}
std::list<LLPluginProcessParent*>::iterator iter;
@@ -657,14 +671,12 @@ void LLPluginProcessParent::updatePollset()
{
#ifdef APR_POLLSET_NOCOPY
// The pollset doesn't exist yet. Create it now.
- sPollSetPool.create();
- apr_status_t status = apr_pollset_create(&sPollSet, count, sPollSetPool(), APR_POLLSET_NOCOPY);
+ apr_status_t status = apr_pollset_create(&sPollSet, count, gAPRPoolp, APR_POLLSET_NOCOPY);
if(status != APR_SUCCESS)
{
#endif // APR_POLLSET_NOCOPY
LL_WARNS("PluginPoll") << "Couldn't create pollset. Falling back to non-pollset mode." << LL_ENDL;
sPollSet = NULL;
- sPollSetPool.destroy();
#ifdef APR_POLLSET_NOCOPY
}
else
@@ -1066,7 +1078,7 @@ bool LLPluginProcessParent::pluginLockedUpOrQuit()
{
bool result = false;
- if(!mProcess.isRunning())
+ if (! mProcess->isRunning())
{
LL_WARNS("Plugin") << "child exited" << LL_ENDL;
result = true;
diff --git a/indra/llplugin/llpluginprocessparent.h b/indra/llplugin/llpluginprocessparent.h
index 74b7e9f50c..990fc5cbae 100644
--- a/indra/llplugin/llpluginprocessparent.h
+++ b/indra/llplugin/llpluginprocessparent.h
@@ -30,18 +30,19 @@
#define LL_LLPLUGINPROCESSPARENT_H
#include "llapr.h"
-#include "llprocesslauncher.h"
+#include "llprocess.h"
#include "llpluginmessage.h"
#include "llpluginmessagepipe.h"
#include "llpluginsharedmemory.h"
#include "lliosocket.h"
#include "llthread.h"
+#include "llsd.h"
class LLPluginProcessParentOwner
{
public:
- ~LLPluginProcessParentOwner();
+ virtual ~LLPluginProcessParentOwner();
virtual void receivePluginMessage(const LLPluginMessage &message) = 0;
virtual bool receivePluginMessageEarly(const LLPluginMessage &message) {return false;};
// This will only be called when the plugin has died unexpectedly
@@ -139,26 +140,27 @@ private:
};
EState mState;
void setState(EState state);
-
+
bool pluginLockedUp();
bool pluginLockedUpOrQuit();
bool accept();
-
+
LLSocket::ptr_t mListenSocket;
LLSocket::ptr_t mSocket;
U32 mBoundPort;
-
- LLProcessLauncher mProcess;
-
+
+ LLProcess::Params mProcessParams;
+ LLProcessPtr mProcess;
+
std::string mPluginFile;
std::string mPluginDir;
LLPluginProcessParentOwner *mOwner;
-
+
typedef std::map<std::string, LLPluginSharedMemory*> sharedMemoryRegionsType;
sharedMemoryRegionsType mSharedMemoryRegions;
-
+
LLSD mMessageClassVersions;
std::string mPluginVersionString;
@@ -171,16 +173,14 @@ private:
bool mBlocked;
bool mPolledInput;
- LLProcessLauncher mDebugger;
+ LLProcessPtr mDebugger;
F32 mPluginLaunchTimeout; // Somewhat longer timeout for initial launch.
F32 mPluginLockupTimeout; // If we don't receive a heartbeat in this many seconds, we declare the plugin locked up.
static bool sUseReadThread;
apr_pollfd_t mPollFD;
- LLAPRPool mPollFDPool;
static apr_pollset_t *sPollSet;
- static LLAPRPool sPollSetPool;
static bool sPollsetNeedsRebuild;
static LLMutex *sInstancesMutex;
static std::list<LLPluginProcessParent*> sInstances;
diff --git a/indra/llplugin/llpluginsharedmemory.cpp b/indra/llplugin/llpluginsharedmemory.cpp
index e2ff645a9c..63ff5085c6 100644
--- a/indra/llplugin/llpluginsharedmemory.cpp
+++ b/indra/llplugin/llpluginsharedmemory.cpp
@@ -187,8 +187,7 @@ bool LLPluginSharedMemory::create(size_t size)
mName += createName();
mSize = size;
- mPool.create();
- apr_status_t status = apr_shm_create( &(mImpl->mAprSharedMemory), mSize, mName.c_str(), mPool());
+ apr_status_t status = apr_shm_create( &(mImpl->mAprSharedMemory), mSize, mName.c_str(), gAPRPoolp );
if(ll_apr_warn_status(status))
{
@@ -211,7 +210,7 @@ bool LLPluginSharedMemory::destroy(void)
}
mImpl->mAprSharedMemory = NULL;
}
- mPool.destroy();
+
return true;
}
@@ -220,8 +219,7 @@ bool LLPluginSharedMemory::attach(const std::string &name, size_t size)
mName = name;
mSize = size;
- mPool.create();
- apr_status_t status = apr_shm_attach( &(mImpl->mAprSharedMemory), mName.c_str(), mPool() );
+ apr_status_t status = apr_shm_attach( &(mImpl->mAprSharedMemory), mName.c_str(), gAPRPoolp );
if(ll_apr_warn_status(status))
{
@@ -243,7 +241,6 @@ bool LLPluginSharedMemory::detach(void)
}
mImpl->mAprSharedMemory = NULL;
}
- mPool.destroy();
return true;
}
diff --git a/indra/llplugin/llpluginsharedmemory.h b/indra/llplugin/llpluginsharedmemory.h
index 84b7a58c32..c6cd49cabb 100644
--- a/indra/llplugin/llpluginsharedmemory.h
+++ b/indra/llplugin/llpluginsharedmemory.h
@@ -28,8 +28,6 @@
#ifndef LL_LLPLUGINSHAREDMEMORY_H
#define LL_LLPLUGINSHAREDMEMORY_H
-#include "llaprpool.h"
-
class LLPluginSharedMemoryPlatformImpl;
/**
@@ -110,7 +108,6 @@ private:
bool close(void);
bool unlink(void);
- LLAPRPool mPool;
std::string mName;
size_t mSize;
void *mMappedAddress;
diff --git a/indra/llplugin/slplugin/slplugin.cpp b/indra/llplugin/slplugin/slplugin.cpp
index ff86e4e135..516a58db88 100644
--- a/indra/llplugin/slplugin/slplugin.cpp
+++ b/indra/llplugin/slplugin/slplugin.cpp
@@ -176,6 +176,8 @@ int APIENTRY WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdL
int main(int argc, char **argv)
#endif
{
+ ll_init_apr();
+
// Set up llerror logging
{
LLError::initForApplication(".");
@@ -391,6 +393,8 @@ int main(int argc, char **argv)
delete plugin;
+ ll_cleanup_apr();
+
return 0;
}
diff --git a/indra/llprimitive/llmaterialtable.cpp b/indra/llprimitive/llmaterialtable.cpp
index 99f32e4109..b4539ebee9 100644
--- a/indra/llprimitive/llmaterialtable.cpp
+++ b/indra/llprimitive/llmaterialtable.cpp
@@ -538,7 +538,7 @@ std::string LLMaterialTable::getName(U8 mcode)
}
}
- return NULL;
+ return std::string();
}
diff --git a/indra/llprimitive/llmodel.cpp b/indra/llprimitive/llmodel.cpp
index 6e4bb7ec97..cb32a510b8 100644
--- a/indra/llprimitive/llmodel.cpp
+++ b/indra/llprimitive/llmodel.cpp
@@ -31,11 +31,18 @@
#include "llconvexdecomposition.h"
#include "llsdserialize.h"
#include "llvector4a.h"
-
+#if LL_MSVC
+#pragma warning (disable : 4263)
+#pragma warning (disable : 4264)
+#endif
#include "dae.h"
#include "dae/daeErrorHandler.h"
#include "dom/domConstants.h"
#include "dom/domMesh.h"
+#if LL_MSVC
+#pragma warning (default : 4263)
+#pragma warning (default : 4264)
+#endif
#ifdef LL_STANDALONE
# include <zlib.h>
diff --git a/indra/llprimitive/lltextureanim.cpp b/indra/llprimitive/lltextureanim.cpp
index 398af4e6e8..185a3f69c0 100644
--- a/indra/llprimitive/lltextureanim.cpp
+++ b/indra/llprimitive/lltextureanim.cpp
@@ -168,8 +168,8 @@ void LLTextureAnim::unpackTAMessage(LLDataPacker &dp)
mMode = data[0];
mFace = data[1];
- mSizeX = llmax((U8)1, data[2]);
- mSizeY = llmax((U8)1, data[3]);
+ mSizeX = data[2];
+ mSizeY = data[3];
htonmemcpy(&mStart, data + 4, MVT_F32, sizeof(F32));
htonmemcpy(&mLength, data + 8, MVT_F32, sizeof(F32));
htonmemcpy(&mRate, data + 12, MVT_F32, sizeof(F32));
diff --git a/indra/llprimitive/llvolumexml.cpp b/indra/llprimitive/llvolumexml.cpp
index f4f9d4d713..bf2297a029 100644
--- a/indra/llprimitive/llvolumexml.cpp
+++ b/indra/llprimitive/llvolumexml.cpp
@@ -34,9 +34,9 @@
//============================================================================
-LLXMLNode *LLVolumeXml::exportProfileParams(const LLProfileParams* params)
+LLPointer<LLXMLNode> LLVolumeXml::exportProfileParams(const LLProfileParams* params)
{
- LLXMLNode *ret = new LLXMLNode("profile", FALSE);
+ LLPointer<LLXMLNode> ret = new LLXMLNode("profile", FALSE);
ret->createChild("curve_type", TRUE)->setByteValue(1, &params->getCurveType());
ret->createChild("interval", FALSE)->setFloatValue(2, &params->getBegin());
@@ -46,9 +46,9 @@ LLXMLNode *LLVolumeXml::exportProfileParams(const LLProfileParams* params)
}
-LLXMLNode *LLVolumeXml::exportPathParams(const LLPathParams* params)
+LLPointer<LLXMLNode> LLVolumeXml::exportPathParams(const LLPathParams* params)
{
- LLXMLNode *ret = new LLXMLNode("path", FALSE);
+ LLPointer<LLXMLNode> ret = new LLXMLNode("path", FALSE);
ret->createChild("curve_type", TRUE)->setByteValue(1, &params->getCurveType());
ret->createChild("interval", FALSE)->setFloatValue(2, &params->getBegin());
ret->createChild("scale", FALSE)->setFloatValue(2, params->getScale().mV);
@@ -63,12 +63,15 @@ LLXMLNode *LLVolumeXml::exportPathParams(const LLPathParams* params)
}
-LLXMLNode *LLVolumeXml::exportVolumeParams(const LLVolumeParams* params)
+LLPointer<LLXMLNode> LLVolumeXml::exportVolumeParams(const LLVolumeParams* params)
{
- LLXMLNode *ret = new LLXMLNode("shape", FALSE);
+ LLPointer<LLXMLNode> ret = new LLXMLNode("shape", FALSE);
- exportPathParams(&params->getPathParams())->setParent(ret);
- exportProfileParams(&params->getProfileParams())->setParent(ret);
+ LLPointer<LLXMLNode> node ;
+ node = exportPathParams(&params->getPathParams()) ;
+ node->setParent(ret);
+ node = exportProfileParams(&params->getProfileParams()) ;
+ node->setParent(ret);
return ret;
}
diff --git a/indra/llprimitive/llvolumexml.h b/indra/llprimitive/llvolumexml.h
index 5e79205d9a..9d4d989475 100644
--- a/indra/llprimitive/llvolumexml.h
+++ b/indra/llprimitive/llvolumexml.h
@@ -34,11 +34,11 @@
class LLVolumeXml
{
public:
- static LLXMLNode* exportProfileParams(const LLProfileParams* params);
+ static LLPointer<LLXMLNode> exportProfileParams(const LLProfileParams* params);
- static LLXMLNode* exportPathParams(const LLPathParams* params);
+ static LLPointer<LLXMLNode> exportPathParams(const LLPathParams* params);
- static LLXMLNode* exportVolumeParams(const LLVolumeParams* params);
+ static LLPointer<LLXMLNode> exportVolumeParams(const LLVolumeParams* params);
};
#endif // LL_LLVOLUMEXML_H
diff --git a/indra/llrender/llcubemap.cpp b/indra/llrender/llcubemap.cpp
index 1b10354c22..45a3b18179 100644
--- a/indra/llrender/llcubemap.cpp
+++ b/indra/llrender/llcubemap.cpp
@@ -36,6 +36,7 @@
#include "m4math.h"
#include "llrender.h"
+#include "llglslshader.h"
#include "llglheaders.h"
@@ -195,7 +196,7 @@ void LLCubeMap::enableTexture(S32 stage)
void LLCubeMap::enableTextureCoords(S32 stage)
{
mTextureCoordStage = stage;
- if (gGLManager.mHasCubeMap && stage >= 0 && LLCubeMap::sUseCubeMaps)
+ if (!LLGLSLShader::sNoFixedFunction && gGLManager.mHasCubeMap && stage >= 0 && LLCubeMap::sUseCubeMaps)
{
if (stage > 0)
{
@@ -237,7 +238,7 @@ void LLCubeMap::disableTexture(void)
void LLCubeMap::disableTextureCoords(void)
{
- if (gGLManager.mHasCubeMap && mTextureCoordStage >= 0 && LLCubeMap::sUseCubeMaps)
+ if (!LLGLSLShader::sNoFixedFunction && gGLManager.mHasCubeMap && mTextureCoordStage >= 0 && LLCubeMap::sUseCubeMaps)
{
if (mTextureCoordStage > 0)
{
@@ -264,19 +265,19 @@ void LLCubeMap::setMatrix(S32 stage)
gGL.getTexUnit(stage)->activate();
}
- LLVector3 x(LLVector3d(gGLModelView+0));
- LLVector3 y(LLVector3d(gGLModelView+4));
- LLVector3 z(LLVector3d(gGLModelView+8));
+ LLVector3 x(gGLModelView+0);
+ LLVector3 y(gGLModelView+4);
+ LLVector3 z(gGLModelView+8);
LLMatrix3 mat3;
mat3.setRows(x,y,z);
LLMatrix4 trans(mat3);
trans.transpose();
- glMatrixMode(GL_TEXTURE);
- glPushMatrix();
- glLoadMatrixf((F32 *)trans.mMatrix);
- glMatrixMode(GL_MODELVIEW);
+ gGL.matrixMode(LLRender::MM_TEXTURE);
+ gGL.pushMatrix();
+ gGL.loadMatrix((F32 *)trans.mMatrix);
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
/*if (stage > 0)
{
@@ -292,9 +293,9 @@ void LLCubeMap::restoreMatrix()
{
gGL.getTexUnit(mMatrixStage)->activate();
}
- glMatrixMode(GL_TEXTURE);
- glPopMatrix();
- glMatrixMode(GL_MODELVIEW);
+ gGL.matrixMode(LLRender::MM_TEXTURE);
+ gGL.popMatrix();
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
/*if (mMatrixStage > 0)
{
diff --git a/indra/llrender/llfontfreetype.cpp b/indra/llrender/llfontfreetype.cpp
index 91c8a37022..66d4ad2d87 100644
--- a/indra/llrender/llfontfreetype.cpp
+++ b/indra/llrender/llfontfreetype.cpp
@@ -55,7 +55,10 @@ FT_Library gFTLibrary = NULL;
//static
void LLFontManager::initClass()
{
- gFontManagerp = new LLFontManager;
+ if (!gFontManagerp)
+ {
+ gFontManagerp = new LLFontManager;
+ }
}
//static
@@ -136,7 +139,7 @@ BOOL LLFontFreetype::loadFace(const std::string& filename, F32 point_size, F32 v
FT_Done_Face(mFTFace);
mFTFace = NULL;
}
-
+
int error;
error = FT_New_Face( gFTLibrary,
diff --git a/indra/llrender/llfontgl.cpp b/indra/llrender/llfontgl.cpp
index 607473d416..82e8227ffe 100644
--- a/indra/llrender/llfontgl.cpp
+++ b/indra/llrender/llfontgl.cpp
@@ -304,6 +304,18 @@ S32 LLFontGL::render(const LLWString &wstr, S32 begin_offset, F32 x, F32 y, cons
S32 next_bitmap_num = fgi->mBitmapNum;
if (next_bitmap_num != bitmap_num)
{
+ // Actually draw the queued glyphs before switching their texture;
+ // otherwise the queued glyphs will be taken from wrong textures.
+ if (glyph_count > 0)
+ {
+ gGL.begin(LLRender::QUADS);
+ {
+ gGL.vertexBatchPreTransformed(vertices, uvs, colors, glyph_count * 4);
+ }
+ gGL.end();
+ glyph_count = 0;
+ }
+
bitmap_num = next_bitmap_num;
LLImageGL *font_image = font_bitmap_cache->getImageGL(bitmap_num);
gGL.getTexUnit(0)->bind(font_image);
diff --git a/indra/llrender/llgl.cpp b/indra/llrender/llgl.cpp
index 4e3cfb9c8a..946e602fee 100644
--- a/indra/llrender/llgl.cpp
+++ b/indra/llrender/llgl.cpp
@@ -67,6 +67,36 @@ static const std::string HEADLESS_VERSION_STRING("1.0");
std::ofstream gFailLog;
+#if GL_ARB_debug_output
+
+#ifndef APIENTRY
+#define APIENTRY
+#endif
+
+void APIENTRY gl_debug_callback(GLenum source,
+ GLenum type,
+ GLuint id,
+ GLenum severity,
+ GLsizei length,
+ const GLchar* message,
+ GLvoid* userParam)
+{
+ if (severity == GL_DEBUG_SEVERITY_HIGH_ARB)
+ {
+ llwarns << "----- GL ERROR --------" << llendl;
+ }
+ else
+ {
+ llwarns << "----- GL WARNING -------" << llendl;
+ }
+ llwarns << "Type: " << std::hex << type << llendl;
+ llwarns << "ID: " << std::hex << id << llendl;
+ llwarns << "Severity: " << std::hex << severity << llendl;
+ llwarns << "Message: " << message << llendl;
+ llwarns << "-----------------------" << llendl;
+}
+#endif
+
void ll_init_fail_log(std::string filename)
{
gFailLog.open(filename.c_str());
@@ -110,6 +140,11 @@ std::list<LLGLUpdate*> LLGLUpdate::sGLQ;
#if (LL_WINDOWS || LL_LINUX || LL_SOLARIS) && !LL_MESA_HEADLESS
// ATI prototypes
+
+#if LL_WINDOWS
+PFNGLGETSTRINGIPROC glGetStringi = NULL;
+#endif
+
// vertex blending prototypes
PFNGLWEIGHTPOINTERARBPROC glWeightPointerARB = NULL;
PFNGLVERTEXBLENDARBPROC glVertexBlendARB = NULL;
@@ -128,6 +163,12 @@ PFNGLUNMAPBUFFERARBPROC glUnmapBufferARB = NULL;
PFNGLGETBUFFERPARAMETERIVARBPROC glGetBufferParameterivARB = NULL;
PFNGLGETBUFFERPOINTERVARBPROC glGetBufferPointervARB = NULL;
+//GL_ARB_vertex_array_object
+PFNGLBINDVERTEXARRAYPROC glBindVertexArray = NULL;
+PFNGLDELETEVERTEXARRAYSPROC glDeleteVertexArrays = NULL;
+PFNGLGENVERTEXARRAYSPROC glGenVertexArrays = NULL;
+PFNGLISVERTEXARRAYPROC glIsVertexArray = NULL;
+
// GL_ARB_map_buffer_range
PFNGLMAPBUFFERRANGEPROC glMapBufferRange = NULL;
PFNGLFLUSHMAPPEDBUFFERRANGEPROC glFlushMappedBufferRange = NULL;
@@ -197,10 +238,16 @@ PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC glRenderbufferStorageMultisample = NULL;
PFNGLFRAMEBUFFERTEXTURELAYERPROC glFramebufferTextureLayer = NULL;
//GL_ARB_texture_multisample
-PFNGLTEXIMAGE2DMULTISAMPLEPROC glTexImage2DMultisample;
-PFNGLTEXIMAGE3DMULTISAMPLEPROC glTexImage3DMultisample;
-PFNGLGETMULTISAMPLEFVPROC glGetMultisamplefv;
-PFNGLSAMPLEMASKIPROC glSampleMaski;
+PFNGLTEXIMAGE2DMULTISAMPLEPROC glTexImage2DMultisample = NULL;
+PFNGLTEXIMAGE3DMULTISAMPLEPROC glTexImage3DMultisample = NULL;
+PFNGLGETMULTISAMPLEFVPROC glGetMultisamplefv = NULL;
+PFNGLSAMPLEMASKIPROC glSampleMaski = NULL;
+
+//GL_ARB_debug_output
+PFNGLDEBUGMESSAGECONTROLARBPROC glDebugMessageControlARB = NULL;
+PFNGLDEBUGMESSAGEINSERTARBPROC glDebugMessageInsertARB = NULL;
+PFNGLDEBUGMESSAGECALLBACKARBPROC glDebugMessageCallbackARB = NULL;
+PFNGLGETDEBUGMESSAGELOGARBPROC glGetDebugMessageLogARB = NULL;
// GL_EXT_blend_func_separate
PFNGLBLENDFUNCSEPARATEEXTPROC glBlendFuncSeparateEXT = NULL;
@@ -249,6 +296,10 @@ PFNGLGETUNIFORMFVARBPROC glGetUniformfvARB = NULL;
PFNGLGETUNIFORMIVARBPROC glGetUniformivARB = NULL;
PFNGLGETSHADERSOURCEARBPROC glGetShaderSourceARB = NULL;
+#if LL_WINDOWS
+PFNWGLCREATECONTEXTATTRIBSARBPROC wglCreateContextAttribsARB = NULL;
+#endif
+
// vertex shader prototypes
#if LL_LINUX || LL_SOLARIS
PFNGLVERTEXATTRIB1DARBPROC glVertexAttrib1dARB = NULL;
@@ -349,6 +400,7 @@ LLGLManager::LLGLManager() :
mHasBlendFuncSeparate(FALSE),
mHasSync(FALSE),
mHasVertexBufferObject(FALSE),
+ mHasVertexArrayObject(FALSE),
mHasMapBufferRange(FALSE),
mHasFlushBufferRange(FALSE),
mHasPBuffer(FALSE),
@@ -370,6 +422,7 @@ LLGLManager::LLGLManager() :
mHasAnisotropic(FALSE),
mHasARBEnvCombine(FALSE),
mHasCubeMap(FALSE),
+ mHasDebugOutput(FALSE),
mIsATI(FALSE),
mIsNVIDIA(FALSE),
@@ -409,6 +462,15 @@ void LLGLManager::initWGL()
LL_WARNS("RenderInit") << "No ARB pixel format extensions" << LL_ENDL;
}
+ if (ExtensionExists("WGL_ARB_create_context",gGLHExts.mSysExts))
+ {
+ GLH_EXT_NAME(wglCreateContextAttribsARB) = (PFNWGLCREATECONTEXTATTRIBSARBPROC)GLH_EXT_GET_PROC_ADDRESS("wglCreateContextAttribsARB");
+ }
+ else
+ {
+ LL_WARNS("RenderInit") << "No ARB create context extensions" << LL_ENDL;
+ }
+
if (ExtensionExists("WGL_EXT_swap_control", gGLHExts.mSysExts))
{
GLH_EXT_NAME(wglSwapIntervalEXT) = (PFNWGLSWAPINTERVALEXTPROC)GLH_EXT_GET_PROC_ADDRESS("wglSwapIntervalEXT");
@@ -438,13 +500,45 @@ bool LLGLManager::initGL()
LL_ERRS("RenderInit") << "Calling init on LLGLManager after already initialized!" << LL_ENDL;
}
- GLint alpha_bits;
- glGetIntegerv( GL_ALPHA_BITS, &alpha_bits );
- if( 8 != alpha_bits )
+ stop_glerror();
+
+#if LL_WINDOWS
+ if (!glGetStringi)
{
- LL_WARNS("RenderInit") << "Frame buffer has less than 8 bits of alpha. Avatar texture compositing will fail." << LL_ENDL;
+ glGetStringi = (PFNGLGETSTRINGIPROC) GLH_EXT_GET_PROC_ADDRESS("glGetStringi");
}
+ //reload extensions string (may have changed after using wglCreateContextAttrib)
+ if (glGetStringi)
+ {
+ std::stringstream str;
+
+ GLint count = 0;
+ glGetIntegerv(GL_NUM_EXTENSIONS, &count);
+ for (GLint i = 0; i < count; ++i)
+ {
+ std::string ext((const char*) glGetStringi(GL_EXTENSIONS, i));
+ str << ext << " ";
+ LL_DEBUGS("GLExtensions") << ext << llendl;
+ }
+
+ {
+ PFNWGLGETEXTENSIONSSTRINGARBPROC wglGetExtensionsStringARB = 0;
+ wglGetExtensionsStringARB = (PFNWGLGETEXTENSIONSSTRINGARBPROC)wglGetProcAddress("wglGetExtensionsStringARB");
+ if(wglGetExtensionsStringARB)
+ {
+ str << (const char*) wglGetExtensionsStringARB(wglGetCurrentDC());
+ }
+ }
+
+ free(gGLHExts.mSysExts);
+ std::string extensions = str.str();
+ gGLHExts.mSysExts = strdup(extensions.c_str());
+ }
+#endif
+
+ stop_glerror();
+
// Extract video card strings and convert to upper case to
// work around driver-to-driver variation in capitalization.
mGLVendor = std::string((const char *)glGetString(GL_VENDOR));
@@ -459,7 +553,7 @@ bool LLGLManager::initGL()
&mDriverVersionVendorString );
mGLVersion = mDriverVersionMajor + mDriverVersionMinor * .1f;
-
+
// Trailing space necessary to keep "nVidia Corpor_ati_on" cards
// from being recognized as ATI.
if (mGLVendor.substr(0,4) == "ATI ")
@@ -531,8 +625,12 @@ bool LLGLManager::initGL()
mGLVendorShort = "MISC";
}
+ stop_glerror();
// This is called here because it depends on the setting of mIsGF2or4MX, and sets up mHasMultitexture.
initExtensions();
+ stop_glerror();
+
+ S32 old_vram = mVRAM;
if (mHasATIMemInfo)
{ //ask the gl how much vram is free at startup and attempt to use no more than half of that
@@ -548,7 +646,27 @@ bool LLGLManager::initGL()
mVRAM = dedicated_memory/1024;
}
- if (mHasMultitexture)
+ if (mVRAM < 256)
+ { //something likely went wrong using the above extensions, fall back to old method
+ mVRAM = old_vram;
+ }
+
+ stop_glerror();
+
+ stop_glerror();
+
+ if (mHasFragmentShader)
+ {
+ GLint num_tex_image_units;
+ glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS_ARB, &num_tex_image_units);
+ mNumTextureImageUnits = llmin(num_tex_image_units, 32);
+ }
+
+ if (LLRender::sGLCoreProfile)
+ {
+ mNumTextureUnits = llmin(mNumTextureImageUnits, MAX_GL_TEXTURE_UNITS);
+ }
+ else if (mHasMultitexture)
{
GLint num_tex_units;
glGetIntegerv(GL_MAX_TEXTURE_UNITS_ARB, &num_tex_units);
@@ -567,12 +685,7 @@ bool LLGLManager::initGL()
return false;
}
- if (mHasFragmentShader)
- {
- GLint num_tex_image_units;
- glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS_ARB, &num_tex_image_units);
- mNumTextureImageUnits = llmin(num_tex_image_units, 32);
- }
+ stop_glerror();
if (mHasTextureMultisample)
{
@@ -582,6 +695,21 @@ bool LLGLManager::initGL()
glGetIntegerv(GL_MAX_SAMPLE_MASK_WORDS, &mMaxSampleMaskWords);
}
+ stop_glerror();
+
+#if LL_WINDOWS
+ if (mHasDebugOutput && gDebugGL)
+ { //setup debug output callback
+ //glDebugMessageControlARB(GL_DONT_CARE, GL_DONT_CARE, GL_DEBUG_SEVERITY_LOW_ARB, 0, NULL, GL_TRUE);
+ glDebugMessageCallbackARB((GLDEBUGPROCARB) gl_debug_callback, NULL);
+ glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS_ARB);
+ }
+#endif
+
+ stop_glerror();
+
+ //HACK always disable texture multisample, use FXAA instead
+ mHasTextureMultisample = FALSE;
#if LL_WINDOWS
if (mIsATI)
{ //using multisample textures on ATI results in black screen for some reason
@@ -593,10 +721,17 @@ bool LLGLManager::initGL()
{
glGetIntegerv(GL_MAX_SAMPLES, &mMaxSamples);
}
+
+ stop_glerror();
setToDebugGPU();
+ stop_glerror();
+
initGLStates();
+
+ stop_glerror();
+
return true;
}
@@ -700,14 +835,6 @@ std::string LLGLManager::getRawGLString()
return gl_string;
}
-U32 LLGLManager::getNumFBOFSAASamples(U32 samples)
-{
- samples = llmin(samples, (U32) mMaxColorTextureSamples);
- samples = llmin(samples, (U32) mMaxDepthTextureSamples);
- samples = llmin(samples, (U32) 4);
- return samples;
-}
-
void LLGLManager::shutdownGL()
{
if (mInited)
@@ -774,7 +901,7 @@ void LLGLManager::initExtensions()
mHasVertexShader = FALSE;
mHasFragmentShader = FALSE;
mHasTextureRectangle = FALSE;
-#else // LL_MESA_HEADLESS
+#else // LL_MESA_HEADLESS //important, gGLHExts.mSysExts is uninitialized until after glh_init_extensions is called
mHasMultitexture = glh_init_extensions("GL_ARB_multitexture");
mHasATIMemInfo = ExtensionExists("GL_ATI_meminfo", gGLHExts.mSysExts);
mHasNVXMemInfo = ExtensionExists("GL_NVX_gpu_memory_info", gGLHExts.mSysExts);
@@ -788,6 +915,7 @@ void LLGLManager::initExtensions()
mHasOcclusionQuery = ExtensionExists("GL_ARB_occlusion_query", gGLHExts.mSysExts);
mHasOcclusionQuery2 = ExtensionExists("GL_ARB_occlusion_query2", gGLHExts.mSysExts);
mHasVertexBufferObject = ExtensionExists("GL_ARB_vertex_buffer_object", gGLHExts.mSysExts);
+ mHasVertexArrayObject = ExtensionExists("GL_ARB_vertex_array_object", gGLHExts.mSysExts);
mHasSync = ExtensionExists("GL_ARB_sync", gGLHExts.mSysExts);
mHasMapBufferRange = ExtensionExists("GL_ARB_map_buffer_range", gGLHExts.mSysExts);
mHasFlushBufferRange = ExtensionExists("GL_APPLE_flush_buffer_range", gGLHExts.mSysExts);
@@ -806,13 +934,14 @@ void LLGLManager::initExtensions()
mHasBlendFuncSeparate = ExtensionExists("GL_EXT_blend_func_separate", gGLHExts.mSysExts);
mHasTextureRectangle = ExtensionExists("GL_ARB_texture_rectangle", gGLHExts.mSysExts);
mHasTextureMultisample = ExtensionExists("GL_ARB_texture_multisample", gGLHExts.mSysExts);
+ mHasDebugOutput = ExtensionExists("GL_ARB_debug_output", gGLHExts.mSysExts);
#if !LL_DARWIN
mHasPointParameters = !mIsATI && ExtensionExists("GL_ARB_point_parameters", gGLHExts.mSysExts);
#endif
- mHasShaderObjects = ExtensionExists("GL_ARB_shader_objects", gGLHExts.mSysExts) && ExtensionExists("GL_ARB_shading_language_100", gGLHExts.mSysExts);
+ mHasShaderObjects = ExtensionExists("GL_ARB_shader_objects", gGLHExts.mSysExts) && (LLRender::sGLCoreProfile || ExtensionExists("GL_ARB_shading_language_100", gGLHExts.mSysExts));
mHasVertexShader = ExtensionExists("GL_ARB_vertex_program", gGLHExts.mSysExts) && ExtensionExists("GL_ARB_vertex_shader", gGLHExts.mSysExts)
- && ExtensionExists("GL_ARB_shading_language_100", gGLHExts.mSysExts);
- mHasFragmentShader = ExtensionExists("GL_ARB_fragment_shader", gGLHExts.mSysExts) && ExtensionExists("GL_ARB_shading_language_100", gGLHExts.mSysExts);
+ && (LLRender::sGLCoreProfile || ExtensionExists("GL_ARB_shading_language_100", gGLHExts.mSysExts));
+ mHasFragmentShader = ExtensionExists("GL_ARB_fragment_shader", gGLHExts.mSysExts) && (LLRender::sGLCoreProfile || ExtensionExists("GL_ARB_shading_language_100", gGLHExts.mSysExts));
#endif
#if LL_LINUX || LL_SOLARIS
@@ -985,6 +1114,13 @@ void LLGLManager::initExtensions()
mHasVertexBufferObject = FALSE;
}
}
+ if (mHasVertexArrayObject)
+ {
+ glBindVertexArray = (PFNGLBINDVERTEXARRAYPROC) GLH_EXT_GET_PROC_ADDRESS("glBindVertexArray");
+ glDeleteVertexArrays = (PFNGLDELETEVERTEXARRAYSPROC) GLH_EXT_GET_PROC_ADDRESS("glDeleteVertexArrays");
+ glGenVertexArrays = (PFNGLGENVERTEXARRAYSPROC) GLH_EXT_GET_PROC_ADDRESS("glGenVertexArrays");
+ glIsVertexArray = (PFNGLISVERTEXARRAYPROC) GLH_EXT_GET_PROC_ADDRESS("glIsVertexArray");
+ }
if (mHasSync)
{
glFenceSync = (PFNGLFENCESYNCPROC) GLH_EXT_GET_PROC_ADDRESS("glFenceSync");
@@ -1039,6 +1175,13 @@ void LLGLManager::initExtensions()
glGetMultisamplefv = (PFNGLGETMULTISAMPLEFVPROC) GLH_EXT_GET_PROC_ADDRESS("glGetMultisamplefv");
glSampleMaski = (PFNGLSAMPLEMASKIPROC) GLH_EXT_GET_PROC_ADDRESS("glSampleMaski");
}
+ if (mHasDebugOutput)
+ {
+ glDebugMessageControlARB = (PFNGLDEBUGMESSAGECONTROLARBPROC) GLH_EXT_GET_PROC_ADDRESS("glDebugMessageControlARB");
+ glDebugMessageInsertARB = (PFNGLDEBUGMESSAGEINSERTARBPROC) GLH_EXT_GET_PROC_ADDRESS("glDebugMessageInsertARB");
+ glDebugMessageCallbackARB = (PFNGLDEBUGMESSAGECALLBACKARBPROC) GLH_EXT_GET_PROC_ADDRESS("glDebugMessageCallbackARB");
+ glGetDebugMessageLogARB = (PFNGLGETDEBUGMESSAGELOGARBPROC) GLH_EXT_GET_PROC_ADDRESS("glGetDebugMessageLogARB");
+ }
#if (!LL_LINUX && !LL_SOLARIS) || LL_LINUX_NV_GL_HEADERS
// This is expected to be a static symbol on Linux GL implementations, except if we use the nvidia headers - bah
glDrawRangeElements = (PFNGLDRAWRANGEELEMENTSPROC)GLH_EXT_GET_PROC_ADDRESS("glDrawRangeElements");
@@ -1193,7 +1336,7 @@ void rotate_quat(LLQuaternion& rotation)
{
F32 angle_radians, x, y, z;
rotation.getAngleAxis(&angle_radians, &x, &y, &z);
- glRotatef(angle_radians * RAD_TO_DEG, x, y, z);
+ gGL.rotatef(angle_radians * RAD_TO_DEG, x, y, z);
}
void flush_glerror()
@@ -1230,10 +1373,6 @@ void log_glerror()
void do_assert_glerror()
{
- if (LL_UNLIKELY(!gGLManager.mInited))
- {
- LL_ERRS("RenderInit") << "GL not initialized" << LL_ENDL;
- }
// Create or update texture to be used with this data
GLenum error;
error = glGetError();
@@ -1326,11 +1465,6 @@ void LLGLState::initClass()
//make sure multisample defaults to disabled
sStateMap[GL_MULTISAMPLE_ARB] = GL_FALSE;
glDisable(GL_MULTISAMPLE_ARB);
-
- sStateMap[GL_MULTISAMPLE_ARB] = GL_FALSE;
- glDisable(GL_MULTISAMPLE_ARB);
-
- glEnableClientState(GL_VERTEX_ARRAY);
}
//static
@@ -1604,7 +1738,7 @@ void LLGLState::checkTextureChannels(const std::string& msg)
void LLGLState::checkClientArrays(const std::string& msg, U32 data_mask)
{
- if (!gDebugGL)
+ if (!gDebugGL || LLGLSLShader::sNoFixedFunction)
{
return;
}
@@ -1625,7 +1759,7 @@ void LLGLState::checkClientArrays(const std::string& msg, U32 data_mask)
error = TRUE;
}
- glGetIntegerv(GL_ACTIVE_TEXTURE_ARB, &active_texture);
+ /*glGetIntegerv(GL_ACTIVE_TEXTURE_ARB, &active_texture);
if (active_texture != GL_TEXTURE0_ARB)
{
llwarns << "Active texture corrupted: " << active_texture << llendl;
@@ -1634,7 +1768,7 @@ void LLGLState::checkClientArrays(const std::string& msg, U32 data_mask)
gFailLog << "Active texture corrupted: " << active_texture << std::endl;
}
error = TRUE;
- }
+ }*/
static const char* label[] =
{
@@ -1661,7 +1795,7 @@ void LLGLState::checkClientArrays(const std::string& msg, U32 data_mask)
};
- for (S32 j = 0; j < 4; j++)
+ for (S32 j = 1; j < 4; j++)
{
if (glIsEnabled(value[j]))
{
@@ -1783,17 +1917,26 @@ LLGLState::LLGLState(LLGLenum state, S32 enabled) :
mState(state), mWasEnabled(FALSE), mIsEnabled(FALSE)
{
if (LLGLSLShader::sNoFixedFunction)
- { //always disable state that's deprecated post GL 3.0
+ { //always ignore state that's deprecated post GL 3.0
switch (state)
{
case GL_ALPHA_TEST:
- enabled = 0;
+ case GL_NORMALIZE:
+ case GL_TEXTURE_GEN_R:
+ case GL_TEXTURE_GEN_S:
+ case GL_TEXTURE_GEN_T:
+ case GL_TEXTURE_GEN_Q:
+ case GL_LIGHTING:
+ case GL_COLOR_MATERIAL:
+ case GL_FOG:
+ case GL_LINE_STIPPLE:
+ mState = 0;
break;
}
}
stop_glerror();
- if (state)
+ if (mState)
{
mWasEnabled = sStateMap[state];
llassert(mWasEnabled == glIsEnabled(state));
@@ -1875,79 +2018,6 @@ void LLGLManager::initGLStates()
////////////////////////////////////////////////////////////////////////////////
-void enable_vertex_weighting(const S32 index)
-{
-#if GL_ARB_vertex_program
- if (index > 0) glEnableVertexAttribArrayARB(index); // vertex weights
-#endif
-}
-
-void disable_vertex_weighting(const S32 index)
-{
-#if GL_ARB_vertex_program
- if (index > 0) glDisableVertexAttribArrayARB(index); // vertex weights
-#endif
-}
-
-void enable_binormals(const S32 index)
-{
-#if GL_ARB_vertex_program
- if (index > 0)
- {
- glEnableVertexAttribArrayARB(index); // binormals
- }
-#endif
-}
-
-void disable_binormals(const S32 index)
-{
-#if GL_ARB_vertex_program
- if (index > 0)
- {
- glDisableVertexAttribArrayARB(index); // binormals
- }
-#endif
-}
-
-
-void enable_cloth_weights(const S32 index)
-{
-#if GL_ARB_vertex_program
- if (index > 0) glEnableVertexAttribArrayARB(index);
-#endif
-}
-
-void disable_cloth_weights(const S32 index)
-{
-#if GL_ARB_vertex_program
- if (index > 0) glDisableVertexAttribArrayARB(index);
-#endif
-}
-
-void set_vertex_weights(const S32 index, const U32 stride, const F32 *weights)
-{
-#if GL_ARB_vertex_program
- if (index > 0) glVertexAttribPointerARB(index, 1, GL_FLOAT, FALSE, stride, weights);
- stop_glerror();
-#endif
-}
-
-void set_vertex_clothing_weights(const S32 index, const U32 stride, const LLVector4 *weights)
-{
-#if GL_ARB_vertex_program
- if (index > 0) glVertexAttribPointerARB(index, 4, GL_FLOAT, TRUE, stride, weights);
- stop_glerror();
-#endif
-}
-
-void set_binormals(const S32 index, const U32 stride,const LLVector3 *binormals)
-{
-#if GL_ARB_vertex_program
- if (index > 0) glVertexAttribPointerARB(index, 3, GL_FLOAT, FALSE, stride, binormals);
- stop_glerror();
-#endif
-}
-
void parse_gl_version( S32* major, S32* minor, S32* release, std::string* vendor_specific )
{
// GL_VERSION returns a null-terminated string with the format:
@@ -2060,20 +2130,20 @@ void LLGLUserClipPlane::setPlane(F32 a, F32 b, F32 c, F32 d)
glh::matrix4f suffix;
suffix.set_row(2, cplane);
glh::matrix4f newP = suffix * P;
- glMatrixMode(GL_PROJECTION);
- glPushMatrix();
- glLoadMatrixf(newP.m);
+ gGL.matrixMode(LLRender::MM_PROJECTION);
+ gGL.pushMatrix();
+ gGL.loadMatrix(newP.m);
gGLObliqueProjectionInverse = LLMatrix4(newP.inverse().transpose().m);
- glMatrixMode(GL_MODELVIEW);
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
}
LLGLUserClipPlane::~LLGLUserClipPlane()
{
if (mApply)
{
- glMatrixMode(GL_PROJECTION);
- glPopMatrix();
- glMatrixMode(GL_MODELVIEW);
+ gGL.matrixMode(LLRender::MM_PROJECTION);
+ gGL.popMatrix();
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
}
}
@@ -2263,16 +2333,16 @@ LLGLSquashToFarClip::LLGLSquashToFarClip(glh::matrix4f P, U32 layer)
P.element(2, i) = P.element(3, i) * depth;
}
- glMatrixMode(GL_PROJECTION);
- glPushMatrix();
- glLoadMatrixf(P.m);
- glMatrixMode(GL_MODELVIEW);
+ gGL.matrixMode(LLRender::MM_PROJECTION);
+ gGL.pushMatrix();
+ gGL.loadMatrix(P.m);
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
}
LLGLSquashToFarClip::~LLGLSquashToFarClip()
{
- glMatrixMode(GL_PROJECTION);
- glPopMatrix();
- glMatrixMode(GL_MODELVIEW);
+ gGL.matrixMode(LLRender::MM_PROJECTION);
+ gGL.popMatrix();
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
}
diff --git a/indra/llrender/llgl.h b/indra/llrender/llgl.h
index d736133f3f..6a147b8e19 100644
--- a/indra/llrender/llgl.h
+++ b/indra/llrender/llgl.h
@@ -88,6 +88,7 @@ public:
// ARB Extensions
BOOL mHasVertexBufferObject;
+ BOOL mHasVertexArrayObject;
BOOL mHasSync;
BOOL mHasMapBufferRange;
BOOL mHasFlushBufferRange;
@@ -112,6 +113,7 @@ public:
BOOL mHasAnisotropic;
BOOL mHasARBEnvCombine;
BOOL mHasCubeMap;
+ BOOL mHasDebugOutput;
// Vendor-specific extensions
BOOL mIsATI;
@@ -148,7 +150,6 @@ public:
void printGLInfoString();
void getGLInfo(LLSD& info);
- U32 getNumFBOFSAASamples(U32 desired_samples = 32);
// In ALL CAPS
std::string mGLVendor;
std::string mGLVendorShort;
@@ -252,7 +253,7 @@ public:
static void dumpStates();
static void checkStates(const std::string& msg = "");
static void checkTextureChannels(const std::string& msg = "");
- static void checkClientArrays(const std::string& msg = "", U32 data_mask = 0x0001);
+ static void checkClientArrays(const std::string& msg = "", U32 data_mask = 0);
protected:
static boost::unordered_map<LLGLenum, LLGLboolean> sStateMap;
@@ -419,15 +420,7 @@ extern LLMatrix4 gGLObliqueProjectionInverse;
#include "llglstates.h"
void init_glstates();
-void enable_vertex_weighting(const S32 index);
-void disable_vertex_weighting(const S32 index);
-void enable_binormals(const S32 index);
-void disable_binormals(const S32 index);
-void enable_cloth_weights(const S32 index);
-void disable_cloth_weights(const S32 index);
-void set_vertex_weights(const S32 index, const U32 stride, const F32 *weights);
-void set_vertex_clothing_weights(const S32 index, const U32 stride, const LLVector4 *weights);
-void set_binormals(const S32 index, const U32 stride, const LLVector3 *binormals);
+
void parse_gl_version( S32* major, S32* minor, S32* release, std::string* vendor_specific );
extern BOOL gClothRipple;
diff --git a/indra/llrender/llglheaders.h b/indra/llrender/llglheaders.h
index 851a75629e..10aad202e1 100644
--- a/indra/llrender/llglheaders.h
+++ b/indra/llrender/llglheaders.h
@@ -68,6 +68,12 @@ extern PFNGLUNMAPBUFFERARBPROC glUnmapBufferARB;
extern PFNGLGETBUFFERPARAMETERIVARBPROC glGetBufferParameterivARB;
extern PFNGLGETBUFFERPOINTERVARBPROC glGetBufferPointervARB;
+// GL_ARB_vertex_array_object
+extern PFNGLBINDVERTEXARRAYPROC glBindVertexArray;
+extern PFNGLDELETEVERTEXARRAYSPROC glDeleteVertexArrays;
+extern PFNGLGENVERTEXARRAYSPROC glGenVertexArrays;
+extern PFNGLISVERTEXARRAYPROC glIsVertexArray;
+
// GL_ARB_sync
extern PFNGLFENCESYNCPROC glFenceSync;
extern PFNGLISSYNCPROC glIsSync;
@@ -310,6 +316,12 @@ extern PFNGLCLIENTACTIVETEXTUREARBPROC glClientActiveTextureARB;
extern PFNGLDRAWRANGEELEMENTSPROC glDrawRangeElements;
#endif // LL_LINUX_NV_GL_HEADERS
+// GL_ARB_vertex_array_object
+extern PFNGLBINDVERTEXARRAYPROC glBindVertexArray;
+extern PFNGLDELETEVERTEXARRAYSPROC glDeleteVertexArrays;
+extern PFNGLGENVERTEXARRAYSPROC glGenVertexArrays;
+extern PFNGLISVERTEXARRAYPROC glIsVertexArray;
+
// GL_ARB_vertex_buffer_object
extern PFNGLBINDBUFFERARBPROC glBindBufferARB;
extern PFNGLDELETEBUFFERSARBPROC glDeleteBuffersARB;
@@ -531,6 +543,9 @@ extern PFNGLSAMPLEMASKIPROC glSampleMaski;
#include "GL/glext.h"
#include "GL/glh_extensions.h"
+// WGL_ARB_create_context
+extern PFNWGLCREATECONTEXTATTRIBSARBPROC wglCreateContextAttribsARB;
+extern PFNGLGETSTRINGIPROC glGetStringi;
// GL_ARB_vertex_buffer_object
extern PFNGLBINDBUFFERARBPROC glBindBufferARB;
@@ -545,6 +560,12 @@ extern PFNGLUNMAPBUFFERARBPROC glUnmapBufferARB;
extern PFNGLGETBUFFERPARAMETERIVARBPROC glGetBufferParameterivARB;
extern PFNGLGETBUFFERPOINTERVARBPROC glGetBufferPointervARB;
+// GL_ARB_vertex_array_object
+extern PFNGLBINDVERTEXARRAYPROC glBindVertexArray;
+extern PFNGLDELETEVERTEXARRAYSPROC glDeleteVertexArrays;
+extern PFNGLGENVERTEXARRAYSPROC glGenVertexArrays;
+extern PFNGLISVERTEXARRAYPROC glIsVertexArray;
+
// GL_ARB_sync
extern PFNGLFENCESYNCPROC glFenceSync;
extern PFNGLISSYNCPROC glIsSync;
@@ -735,6 +756,12 @@ extern PFNGLTEXIMAGE3DMULTISAMPLEPROC glTexImage3DMultisample;
extern PFNGLGETMULTISAMPLEFVPROC glGetMultisamplefv;
extern PFNGLSAMPLEMASKIPROC glSampleMaski;
+//GL_ARB_debug_output
+extern PFNGLDEBUGMESSAGECONTROLARBPROC glDebugMessageControlARB;
+extern PFNGLDEBUGMESSAGEINSERTARBPROC glDebugMessageInsertARB;
+extern PFNGLDEBUGMESSAGECALLBACKARBPROC glDebugMessageCallbackARB;
+extern PFNGLGETDEBUGMESSAGELOGARBPROC glGetDebugMessageLogARB;
+
#elif LL_DARWIN
//----------------------------------------------------------------------------
// LL_DARWIN
@@ -899,6 +926,31 @@ extern void glGetBufferPointervARB (GLenum, GLenum, GLvoid* *);
#endif /* GL_GLEXT_FUNCTION_POINTERS */
#endif
+#ifndef GL_ARB_texture_rg
+#define GL_RG 0x8227
+#define GL_RG_INTEGER 0x8228
+#define GL_R8 0x8229
+#define GL_R16 0x822A
+#define GL_RG8 0x822B
+#define GL_RG16 0x822C
+#define GL_R16F 0x822D
+#define GL_R32F 0x822E
+#define GL_RG16F 0x822F
+#define GL_RG32F 0x8230
+#define GL_R8I 0x8231
+#define GL_R8UI 0x8232
+#define GL_R16I 0x8233
+#define GL_R16UI 0x8234
+#define GL_R32I 0x8235
+#define GL_R32UI 0x8236
+#define GL_RG8I 0x8237
+#define GL_RG8UI 0x8238
+#define GL_RG16I 0x8239
+#define GL_RG16UI 0x823A
+#define GL_RG32I 0x823B
+#define GL_RG32UI 0x823C
+#endif
+
// May be needed for DARWIN...
// #ifndef GL_ARB_compressed_tex_image
// #define GL_ARB_compressed_tex_image 1
diff --git a/indra/llrender/llglslshader.cpp b/indra/llrender/llglslshader.cpp
index f51d83abe4..6b2852670a 100644
--- a/indra/llrender/llglslshader.cpp
+++ b/indra/llrender/llglslshader.cpp
@@ -31,6 +31,7 @@
#include "llshadermgr.h"
#include "llfile.h"
#include "llrender.h"
+#include "llvertexbuffer.h"
#if LL_DARWIN
#include "OpenGL/OpenGL.h"
@@ -50,6 +51,7 @@ using std::string;
GLhandleARB LLGLSLShader::sCurBoundShader = 0;
LLGLSLShader* LLGLSLShader::sCurBoundShaderPtr = NULL;
+S32 LLGLSLShader::sIndexedTextureChannels = 0;
bool LLGLSLShader::sNoFixedFunction = false;
//UI shader -- declared here so llui_libtest will link properly
@@ -64,7 +66,7 @@ BOOL shouldChange(const LLVector4& v1, const LLVector4& v2)
LLShaderFeatures::LLShaderFeatures()
: calculatesLighting(false), isShiny(false), isFullbright(false), hasWaterFog(false),
hasTransport(false), hasSkinning(false), hasObjectSkinning(false), hasAtmospherics(false), isSpecular(false),
-hasGamma(false), hasLighting(false), calculatesAtmospherics(false), mIndexedTextureChannels(0), disableTextureIndex(false),
+hasGamma(false), hasLighting(false), isAlphaLighting(false), calculatesAtmospherics(false), mIndexedTextureChannels(0), disableTextureIndex(false),
hasAlphaMask(false)
{
}
@@ -75,6 +77,7 @@ hasAlphaMask(false)
LLGLSLShader::LLGLSLShader()
: mProgramObject(0), mActiveTextureChannels(0), mShaderLevel(0), mShaderGroup(SG_DEFAULT), mUniformsDirty(FALSE)
{
+
}
void LLGLSLShader::unload()
@@ -110,17 +113,19 @@ void LLGLSLShader::unload()
BOOL LLGLSLShader::createShader(vector<string> * attributes,
vector<string> * uniforms)
{
+ //reloading, reset matrix hash values
+ for (U32 i = 0; i < LLRender::NUM_MATRIX_MODES; ++i)
+ {
+ mMatHash[i] = 0xFFFFFFFF;
+ }
+ mLightHash = 0xFFFFFFFF;
+
llassert_always(!mShaderFiles.empty());
BOOL success = TRUE;
// Create program
mProgramObject = glCreateProgramObjectARB();
- if (gGLManager.mGLVersion < 3.1f)
- { //force indexed texture channels to 1 if GL version is old (performance improvement for drivers with poor branching shader model support)
- mFeatures.mIndexedTextureChannels = llmin(mFeatures.mIndexedTextureChannels, 1);
- }
-
//compile new source
vector< pair<string,GLenum> >::iterator fileIter = mShaderFiles.begin();
for ( ; fileIter != mShaderFiles.end(); fileIter++ )
@@ -235,6 +240,13 @@ void LLGLSLShader::attachObjects(GLhandleARB* objects, S32 count)
BOOL LLGLSLShader::mapAttributes(const vector<string> * attributes)
{
+ //before linking, make sure reserved attributes always have consistent locations
+ for (U32 i = 0; i < LLShaderMgr::instance()->mReservedAttribs.size(); i++)
+ {
+ const char* name = LLShaderMgr::instance()->mReservedAttribs[i].c_str();
+ glBindAttribLocationARB(mProgramObject, i, (const GLcharARB *) name);
+ }
+
//link the program
BOOL res = link();
@@ -308,7 +320,7 @@ void LLGLSLShader::mapUniform(GLint index, const vector<string> * uniforms)
for (S32 i = 0; i < (S32) LLShaderMgr::instance()->mReservedUniforms.size(); i++)
{
if ( (mUniform[i] == -1)
- && (LLShaderMgr::instance()->mReservedUniforms[i].compare(0, length, name, LLShaderMgr::instance()->mReservedUniforms[i].length()) == 0))
+ && (LLShaderMgr::instance()->mReservedUniforms[i] == name))
{
//found it
mUniform[i] = location;
@@ -322,7 +334,7 @@ void LLGLSLShader::mapUniform(GLint index, const vector<string> * uniforms)
for (U32 i = 0; i < uniforms->size(); i++)
{
if ( (mUniform[i+LLShaderMgr::instance()->mReservedUniforms.size()] == -1)
- && ((*uniforms)[i].compare(0, length, name, (*uniforms)[i].length()) == 0))
+ && ((*uniforms)[i] == name))
{
//found it
mUniform[i+LLShaderMgr::instance()->mReservedUniforms.size()] = location;
@@ -386,6 +398,7 @@ void LLGLSLShader::bind()
gGL.flush();
if (gGLManager.mHasShaderObjects)
{
+ LLVertexBuffer::unbind();
glUseProgramObjectARB(mProgramObject);
sCurBoundShader = mProgramObject;
sCurBoundShaderPtr = this;
@@ -411,6 +424,7 @@ void LLGLSLShader::unbind()
stop_glerror();
}
}
+ LLVertexBuffer::unbind();
glUseProgramObjectARB(0);
sCurBoundShader = 0;
sCurBoundShaderPtr = NULL;
@@ -420,9 +434,13 @@ void LLGLSLShader::unbind()
void LLGLSLShader::bindNoShader(void)
{
- glUseProgramObjectARB(0);
- sCurBoundShader = 0;
- sCurBoundShaderPtr = NULL;
+ LLVertexBuffer::unbind();
+ if (gGLManager.mHasShaderObjects)
+ {
+ glUseProgramObjectARB(0);
+ sCurBoundShader = 0;
+ sCurBoundShaderPtr = NULL;
+ }
}
S32 LLGLSLShader::enableTexture(S32 uniform, LLTexUnit::eTextureType mode)
@@ -768,13 +786,17 @@ GLint LLGLSLShader::getUniformLocation(const string& uniform)
}
}
- /*if (gDebugGL)
+ return ret;
+}
+
+GLint LLGLSLShader::getUniformLocation(U32 index)
+{
+ GLint ret = -1;
+ if (mProgramObject > 0)
{
- if (ret == -1 && ret != glGetUniformLocationARB(mProgramObject, uniform.c_str()))
- {
- llerrs << "Uniform map invalid." << llendl;
- }
- }*/
+ llassert(index < mUniform.size());
+ return mUniform[index];
+ }
return ret;
}
@@ -930,7 +952,9 @@ void LLGLSLShader::uniform4fv(const string& uniform, U32 count, const GLfloat* v
std::map<GLint, LLVector4>::iterator iter = mValue.find(location);
if (iter == mValue.end() || shouldChange(iter->second,vec) || count != 1)
{
+ stop_glerror();
glUniform4fvARB(location, count, v);
+ stop_glerror();
mValue[location] = vec;
}
}
@@ -985,8 +1009,8 @@ void LLGLSLShader::vertexAttrib4fv(U32 index, GLfloat* v)
}
}
-void LLGLSLShader::setAlphaRange(F32 minimum, F32 maximum)
+void LLGLSLShader::setMinimumAlpha(F32 minimum)
{
- uniform1f("minimum_alpha", minimum);
- uniform1f("maximum_alpha", maximum);
+ gGL.flush();
+ uniform1f(LLShaderMgr::MINIMUM_ALPHA, minimum);
}
diff --git a/indra/llrender/llglslshader.h b/indra/llrender/llglslshader.h
index 558ea66b50..00b4b0dbd4 100644
--- a/indra/llrender/llglslshader.h
+++ b/indra/llrender/llglslshader.h
@@ -36,6 +36,7 @@ public:
bool calculatesLighting;
bool calculatesAtmospherics;
bool hasLighting; // implies no transport (it's possible to have neither though)
+ bool isAlphaLighting; // indicates lighting shaders need not be linked in (lighting performed directly in alpha shader to match deferred lighting functions)
bool isShiny;
bool isFullbright; // implies no lighting
bool isSpecular;
@@ -69,7 +70,7 @@ public:
static GLhandleARB sCurBoundShader;
static LLGLSLShader* sCurBoundShaderPtr;
-
+ static S32 sIndexedTextureChannels;
static bool sNoFixedFunction;
void unload();
@@ -108,16 +109,17 @@ public:
void uniformMatrix3fv(const std::string& uniform, U32 count, GLboolean transpose, const GLfloat *v);
void uniformMatrix4fv(const std::string& uniform, U32 count, GLboolean transpose, const GLfloat *v);
- void setAlphaRange(F32 minimum, F32 maximum);
+ void setMinimumAlpha(F32 minimum);
void vertexAttrib4f(U32 index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
void vertexAttrib4fv(U32 index, GLfloat* v);
GLint getUniformLocation(const std::string& uniform);
+ GLint getUniformLocation(U32 index);
+
GLint getAttribLocation(U32 attrib);
GLint mapUniformTextureChannel(GLint location, GLenum type);
-
//enable/disable texture channel for specified uniform
//if given texture uniform is active in the shader,
//the corresponding channel will be active upon return
@@ -132,6 +134,9 @@ public:
// Unbinds any previously bound shader by explicitly binding no shader.
static void bindNoShader(void);
+ U32 mMatHash[LLRender::NUM_MATRIX_MODES];
+ U32 mLightHash;
+
GLhandleARB mProgramObject;
std::vector<GLint> mAttribute; //lookup table of attribute enum to attribute channel
std::vector<GLint> mUniform; //lookup table of uniform enum to uniform location
diff --git a/indra/llrender/llimagegl.cpp b/indra/llrender/llimagegl.cpp
index 7188b0fa44..78591ddd38 100644
--- a/indra/llrender/llimagegl.cpp
+++ b/indra/llrender/llimagegl.cpp
@@ -36,7 +36,9 @@
#include "llmath.h"
#include "llgl.h"
+#include "llglslshader.h"
#include "llrender.h"
+
//----------------------------------------------------------------------------
const F32 MIN_TEXTURE_LIFETIME = 10.f;
@@ -725,7 +727,10 @@ void LLImageGL::setImage(const U8* data_in, BOOL data_hasmips)
{
if (mAutoGenMips)
{
- glTexParameteri(LLTexUnit::getInternalType(mBindTarget), GL_GENERATE_MIPMAP_SGIS, TRUE);
+ if (!gGLManager.mHasFramebufferObject)
+ {
+ glTexParameteri(LLTexUnit::getInternalType(mBindTarget), GL_GENERATE_MIPMAP_SGIS, TRUE);
+ }
stop_glerror();
{
// LLFastTimer t2(FTM_TEMP4);
@@ -754,6 +759,11 @@ void LLImageGL::setImage(const U8* data_in, BOOL data_hasmips)
stop_glerror();
}
}
+
+ if (gGLManager.mHasFramebufferObject)
+ {
+ glGenerateMipmap(LLTexUnit::getInternalType(mBindTarget));
+ }
}
else
{
@@ -875,6 +885,9 @@ void LLImageGL::setImage(const U8* data_in, BOOL data_hasmips)
BOOL LLImageGL::preAddToAtlas(S32 discard_level, const LLImageRaw* raw_image)
{
+ //not compatible with core GL profile
+ llassert(!LLRender::sGLCoreProfile);
+
if (gGLManager.mIsDisabled)
{
llwarns << "Trying to create a texture while GL is disabled!" << llendl;
@@ -901,29 +914,29 @@ BOOL LLImageGL::preAddToAtlas(S32 discard_level, const LLImageRaw* raw_image)
{
switch (mComponents)
{
- case 1:
+ case 1:
// Use luminance alpha (for fonts)
mFormatInternal = GL_LUMINANCE8;
mFormatPrimary = GL_LUMINANCE;
mFormatType = GL_UNSIGNED_BYTE;
break;
- case 2:
+ case 2:
// Use luminance alpha (for fonts)
mFormatInternal = GL_LUMINANCE8_ALPHA8;
mFormatPrimary = GL_LUMINANCE_ALPHA;
mFormatType = GL_UNSIGNED_BYTE;
break;
- case 3:
+ case 3:
mFormatInternal = GL_RGB8;
mFormatPrimary = GL_RGB;
mFormatType = GL_UNSIGNED_BYTE;
break;
- case 4:
+ case 4:
mFormatInternal = GL_RGBA8;
mFormatPrimary = GL_RGBA;
mFormatType = GL_UNSIGNED_BYTE;
break;
- default:
+ default:
llerrs << "Bad number of components for texture: " << (U32)getComponents() << llendl;
}
}
@@ -1099,8 +1112,75 @@ void LLImageGL::deleteTextures(S32 numTextures, U32 *textures, bool immediate)
// static
void LLImageGL::setManualImage(U32 target, S32 miplevel, S32 intformat, S32 width, S32 height, U32 pixformat, U32 pixtype, const void *pixels)
{
- glTexImage2D(target, miplevel, intformat, width, height, 0, pixformat, pixtype, pixels);
+ bool use_scratch = false;
+ U32* scratch = NULL;
+ if (LLRender::sGLCoreProfile)
+ {
+ if (pixformat == GL_ALPHA && pixtype == GL_UNSIGNED_BYTE)
+ { //GL_ALPHA is deprecated, convert to RGBA
+ use_scratch = true;
+ scratch = new U32[width*height];
+
+ U32 pixel_count = (U32) (width*height);
+ for (U32 i = 0; i < pixel_count; i++)
+ {
+ U8* pix = (U8*) &scratch[i];
+ pix[0] = pix[1] = pix[2] = 0;
+ pix[3] = ((U8*) pixels)[i];
+ }
+
+ pixformat = GL_RGBA;
+ intformat = GL_RGBA8;
+ }
+
+ if (pixformat == GL_LUMINANCE_ALPHA && pixtype == GL_UNSIGNED_BYTE)
+ { //GL_LUMINANCE_ALPHA is deprecated, convert to RGBA
+ use_scratch = true;
+ scratch = new U32[width*height];
+
+ U32 pixel_count = (U32) (width*height);
+ for (U32 i = 0; i < pixel_count; i++)
+ {
+ U8 lum = ((U8*) pixels)[i*2+0];
+ U8 alpha = ((U8*) pixels)[i*2+1];
+
+ U8* pix = (U8*) &scratch[i];
+ pix[0] = pix[1] = pix[2] = lum;
+ pix[3] = alpha;
+ }
+
+ pixformat = GL_RGBA;
+ intformat = GL_RGBA8;
+ }
+
+ if (pixformat == GL_LUMINANCE && pixtype == GL_UNSIGNED_BYTE)
+ { //GL_LUMINANCE_ALPHA is deprecated, convert to RGB
+ use_scratch = true;
+ scratch = new U32[width*height];
+
+ U32 pixel_count = (U32) (width*height);
+ for (U32 i = 0; i < pixel_count; i++)
+ {
+ U8 lum = ((U8*) pixels)[i];
+
+ U8* pix = (U8*) &scratch[i];
+ pix[0] = pix[1] = pix[2] = lum;
+ pix[3] = 255;
+ }
+
+ pixformat = GL_RGBA;
+ intformat = GL_RGB8;
+ }
+ }
+
stop_glerror();
+ glTexImage2D(target, miplevel, intformat, width, height, 0, pixformat, pixtype, use_scratch ? scratch : pixels);
+ stop_glerror();
+
+ if (use_scratch)
+ {
+ delete [] scratch;
+ }
}
//create an empty GL texture: just create a texture name
@@ -1167,29 +1247,29 @@ BOOL LLImageGL::createGLTexture(S32 discard_level, const LLImageRaw* imageraw, S
{
switch (mComponents)
{
- case 1:
+ case 1:
// Use luminance alpha (for fonts)
mFormatInternal = GL_LUMINANCE8;
mFormatPrimary = GL_LUMINANCE;
mFormatType = GL_UNSIGNED_BYTE;
break;
- case 2:
+ case 2:
// Use luminance alpha (for fonts)
mFormatInternal = GL_LUMINANCE8_ALPHA8;
mFormatPrimary = GL_LUMINANCE_ALPHA;
mFormatType = GL_UNSIGNED_BYTE;
break;
- case 3:
+ case 3:
mFormatInternal = GL_RGB8;
mFormatPrimary = GL_RGB;
mFormatType = GL_UNSIGNED_BYTE;
break;
- case 4:
+ case 4:
mFormatInternal = GL_RGBA8;
mFormatPrimary = GL_RGBA;
mFormatType = GL_UNSIGNED_BYTE;
break;
- default:
+ default:
llerrs << "Bad number of components for texture: " << (U32)getComponents() << llendl;
}
@@ -1212,6 +1292,7 @@ BOOL LLImageGL::createGLTexture(S32 discard_level, const LLImageRaw* imageraw, S
BOOL LLImageGL::createGLTexture(S32 discard_level, const U8* data_in, BOOL data_hasmips, S32 usename)
{
llassert(data_in);
+ stop_glerror();
if (discard_level < 0)
{
@@ -1240,8 +1321,11 @@ BOOL LLImageGL::createGLTexture(S32 discard_level, const U8* data_in, BOOL data_
stop_glerror();
{
llverify(gGL.getTexUnit(0)->bind(this));
+ stop_glerror();
glTexParameteri(LLTexUnit::getInternalType(mBindTarget), GL_TEXTURE_BASE_LEVEL, 0);
+ stop_glerror();
glTexParameteri(LLTexUnit::getInternalType(mBindTarget), GL_TEXTURE_MAX_LEVEL, mMaxDiscardLevel-discard_level);
+ stop_glerror();
}
}
if (!mTexName)
@@ -1754,7 +1838,7 @@ void LLImageGL::analyzeAlpha(const void* data_in, U32 w, U32 h)
// this to be an intentional effect and don't treat as a mask.
U32 midrangetotal = 0;
- for (U32 i = 4; i < 11; i++)
+ for (U32 i = 2; i < 13; i++)
{
midrangetotal += sample[i];
}
@@ -1769,7 +1853,7 @@ void LLImageGL::analyzeAlpha(const void* data_in, U32 w, U32 h)
upperhalftotal += sample[i];
}
- if (midrangetotal > length/16 || // lots of midrange, or
+ if (midrangetotal > length/48 || // lots of midrange, or
(lowerhalftotal == length && alphatotal != 0) || // all close to transparent but not all totally transparent, or
(upperhalftotal == length && alphatotal != 255*length)) // all close to opaque but not all totally opaque
{
diff --git a/indra/llrender/llpostprocess.cpp b/indra/llrender/llpostprocess.cpp
index d76b2d9004..c0045c8044 100644
--- a/indra/llrender/llpostprocess.cpp
+++ b/indra/llrender/llpostprocess.cpp
@@ -466,21 +466,21 @@ void LLPostProcess::drawOrthoQuad(unsigned int width, unsigned int height, QuadT
void LLPostProcess::viewOrthogonal(unsigned int width, unsigned int height)
{
- glMatrixMode(GL_PROJECTION);
- glPushMatrix();
- glLoadIdentity();
- glOrtho( 0.f, (GLdouble) width , (GLdouble) height , 0.f, -1.f, 1.f );
- glMatrixMode(GL_MODELVIEW);
- glPushMatrix();
- glLoadIdentity();
+ gGL.matrixMode(LLRender::MM_PROJECTION);
+ gGL.pushMatrix();
+ gGL.loadIdentity();
+ gGL.ortho( 0.f, (GLdouble) width , (GLdouble) height , 0.f, -1.f, 1.f );
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
+ gGL.pushMatrix();
+ gGL.loadIdentity();
}
void LLPostProcess::viewPerspective(void)
{
- glMatrixMode( GL_PROJECTION );
- glPopMatrix();
- glMatrixMode( GL_MODELVIEW );
- glPopMatrix();
+ gGL.matrixMode(LLRender::MM_PROJECTION);
+ gGL.popMatrix();
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
+ gGL.popMatrix();
}
void LLPostProcess::changeOrthogonal(unsigned int width, unsigned int height)
diff --git a/indra/llrender/llrender.cpp b/indra/llrender/llrender.cpp
index edcc47aa14..b0ddacbb05 100644
--- a/indra/llrender/llrender.cpp
+++ b/indra/llrender/llrender.cpp
@@ -1,4 +1,4 @@
-/**
+ /**
* @file llrender.cpp
* @brief LLRender implementation
*
@@ -34,19 +34,21 @@
#include "llimagegl.h"
#include "llrendertarget.h"
#include "lltexture.h"
+#include "llshadermgr.h"
LLRender gGL;
// Handy copies of last good GL matrices
-F64 gGLModelView[16];
-F64 gGLLastModelView[16];
-F64 gGLLastProjection[16];
-F64 gGLProjection[16];
+F32 gGLModelView[16];
+F32 gGLLastModelView[16];
+F32 gGLLastProjection[16];
+F32 gGLProjection[16];
S32 gGLViewport[4];
U32 LLRender::sUICalls = 0;
U32 LLRender::sUIVerts = 0;
U32 LLTexUnit::sWhiteTexture = 0;
+bool LLRender::sGLCoreProfile = false;
static const U32 LL_NUM_TEXTURE_LAYERS = 32;
static const U32 LL_NUM_LIGHT_UNITS = 8;
@@ -178,10 +180,13 @@ void LLTexUnit::enable(eTextureType type)
if ( (mCurrTexType != type || gGL.mDirty) && (type != TT_NONE) )
{
+ stop_glerror();
activate();
+ stop_glerror();
if (mCurrTexType != TT_NONE && !gGL.mDirty)
{
disable(); // Force a disable of a previous texture type if it's enabled.
+ stop_glerror();
}
mCurrTexType = type;
@@ -190,7 +195,9 @@ void LLTexUnit::enable(eTextureType type)
type != LLTexUnit::TT_MULTISAMPLE_TEXTURE &&
mIndex < gGLManager.mNumTextureUnits)
{
+ stop_glerror();
glEnable(sGLTextureType[type]);
+ stop_glerror();
}
}
}
@@ -286,26 +293,35 @@ bool LLTexUnit::bind(LLImageGL* texture, bool for_rendering, bool forceBind)
{
return bind(LLImageGL::sDefaultGLTexture) ;
}
+ stop_glerror();
return false ;
}
if ((mCurrTexture != texture->getTexName()) || forceBind)
{
gGL.flush();
+ stop_glerror();
activate();
+ stop_glerror();
enable(texture->getTarget());
+ stop_glerror();
mCurrTexture = texture->getTexName();
glBindTexture(sGLTextureType[texture->getTarget()], mCurrTexture);
+ stop_glerror();
texture->updateBindStats(texture->mTextureMemory);
mHasMipMaps = texture->mHasMipMaps;
if (texture->mTexOptionsDirty)
{
+ stop_glerror();
texture->mTexOptionsDirty = false;
setTextureAddressMode(texture->mAddressMode);
setTextureFilteringOption(texture->mFilterOption);
+ stop_glerror();
}
}
+ stop_glerror();
+
return true;
}
@@ -814,14 +830,16 @@ LLLightState::LLLightState(S32 index)
mAmbient.set(0,0,0,1);
mPosition.set(0,0,1,0);
mSpotDirection.set(0,0,-1);
-
}
void LLLightState::enable()
{
if (!mEnabled)
{
- glEnable(GL_LIGHT0+mIndex);
+ if (!LLGLSLShader::sNoFixedFunction)
+ {
+ glEnable(GL_LIGHT0+mIndex);
+ }
mEnabled = true;
}
}
@@ -830,7 +848,10 @@ void LLLightState::disable()
{
if (mEnabled)
{
- glDisable(GL_LIGHT0+mIndex);
+ if (!LLGLSLShader::sNoFixedFunction)
+ {
+ glDisable(GL_LIGHT0+mIndex);
+ }
mEnabled = false;
}
}
@@ -839,8 +860,12 @@ void LLLightState::setDiffuse(const LLColor4& diffuse)
{
if (mDiffuse != diffuse)
{
+ ++gGL.mLightHash;
mDiffuse = diffuse;
- glLightfv(GL_LIGHT0+mIndex, GL_DIFFUSE, mDiffuse.mV);
+ if (!LLGLSLShader::sNoFixedFunction)
+ {
+ glLightfv(GL_LIGHT0+mIndex, GL_DIFFUSE, mDiffuse.mV);
+ }
}
}
@@ -848,8 +873,12 @@ void LLLightState::setAmbient(const LLColor4& ambient)
{
if (mAmbient != ambient)
{
+ ++gGL.mLightHash;
mAmbient = ambient;
- glLightfv(GL_LIGHT0+mIndex, GL_AMBIENT, mAmbient.mV);
+ if (!LLGLSLShader::sNoFixedFunction)
+ {
+ glLightfv(GL_LIGHT0+mIndex, GL_AMBIENT, mAmbient.mV);
+ }
}
}
@@ -857,16 +886,34 @@ void LLLightState::setSpecular(const LLColor4& specular)
{
if (mSpecular != specular)
{
+ ++gGL.mLightHash;
mSpecular = specular;
- glLightfv(GL_LIGHT0+mIndex, GL_SPECULAR, mSpecular.mV);
+ if (!LLGLSLShader::sNoFixedFunction)
+ {
+ glLightfv(GL_LIGHT0+mIndex, GL_SPECULAR, mSpecular.mV);
+ }
}
}
void LLLightState::setPosition(const LLVector4& position)
{
//always set position because modelview matrix may have changed
+ ++gGL.mLightHash;
mPosition = position;
- glLightfv(GL_LIGHT0+mIndex, GL_POSITION, mPosition.mV);
+ if (!LLGLSLShader::sNoFixedFunction)
+ {
+ glLightfv(GL_LIGHT0+mIndex, GL_POSITION, mPosition.mV);
+ }
+ else
+ { //transform position by current modelview matrix
+ glh::vec4f pos(position.mV);
+
+ const glh::matrix4f& mat = gGL.getModelviewMatrix();
+ mat.mult_matrix_vec(pos);
+
+ mPosition.set(pos.v);
+ }
+
}
void LLLightState::setConstantAttenuation(const F32& atten)
@@ -874,7 +921,11 @@ void LLLightState::setConstantAttenuation(const F32& atten)
if (mConstantAtten != atten)
{
mConstantAtten = atten;
- glLightf(GL_LIGHT0+mIndex, GL_CONSTANT_ATTENUATION, atten);
+ ++gGL.mLightHash;
+ if (!LLGLSLShader::sNoFixedFunction)
+ {
+ glLightf(GL_LIGHT0+mIndex, GL_CONSTANT_ATTENUATION, atten);
+ }
}
}
@@ -882,8 +933,12 @@ void LLLightState::setLinearAttenuation(const F32& atten)
{
if (mLinearAtten != atten)
{
+ ++gGL.mLightHash;
mLinearAtten = atten;
- glLightf(GL_LIGHT0+mIndex, GL_LINEAR_ATTENUATION, atten);
+ if (!LLGLSLShader::sNoFixedFunction)
+ {
+ glLightf(GL_LIGHT0+mIndex, GL_LINEAR_ATTENUATION, atten);
+ }
}
}
@@ -891,8 +946,12 @@ void LLLightState::setQuadraticAttenuation(const F32& atten)
{
if (mQuadraticAtten != atten)
{
+ ++gGL.mLightHash;
mQuadraticAtten = atten;
- glLightf(GL_LIGHT0+mIndex, GL_QUADRATIC_ATTENUATION, atten);
+ if (!LLGLSLShader::sNoFixedFunction)
+ {
+ glLightf(GL_LIGHT0+mIndex, GL_QUADRATIC_ATTENUATION, atten);
+ }
}
}
@@ -900,8 +959,12 @@ void LLLightState::setSpotExponent(const F32& exponent)
{
if (mSpotExponent != exponent)
{
+ ++gGL.mLightHash;
mSpotExponent = exponent;
- glLightf(GL_LIGHT0+mIndex, GL_SPOT_EXPONENT, exponent);
+ if (!LLGLSLShader::sNoFixedFunction)
+ {
+ glLightf(GL_LIGHT0+mIndex, GL_SPOT_EXPONENT, exponent);
+ }
}
}
@@ -909,21 +972,39 @@ void LLLightState::setSpotCutoff(const F32& cutoff)
{
if (mSpotCutoff != cutoff)
{
+ ++gGL.mLightHash;
mSpotCutoff = cutoff;
- glLightf(GL_LIGHT0+mIndex, GL_SPOT_CUTOFF, cutoff);
+ if (!LLGLSLShader::sNoFixedFunction)
+ {
+ glLightf(GL_LIGHT0+mIndex, GL_SPOT_CUTOFF, cutoff);
+ }
}
}
void LLLightState::setSpotDirection(const LLVector3& direction)
{
//always set direction because modelview matrix may have changed
+ ++gGL.mLightHash;
mSpotDirection = direction;
- glLightfv(GL_LIGHT0+mIndex, GL_SPOT_DIRECTION, direction.mV);
+ if (!LLGLSLShader::sNoFixedFunction)
+ {
+ glLightfv(GL_LIGHT0+mIndex, GL_SPOT_DIRECTION, direction.mV);
+ }
+ else
+ { //transform direction by current modelview matrix
+ glh::vec3f dir(direction.mV);
+
+ const glh::matrix4f& mat = gGL.getModelviewMatrix();
+ mat.mult_matrix_dir(dir);
+
+ mSpotDirection.set(dir.v);
+ }
}
LLRender::LLRender()
: mDirty(false),
mCount(0),
+ mQuadCycle(0),
mMode(LLRender::TRIANGLES),
mCurrTextureUnitIndex(0),
mMaxAnisotropy(0.f)
@@ -951,6 +1032,17 @@ LLRender::LLRender()
mCurrBlendAlphaSFactor = BF_UNDEF;
mCurrBlendColorDFactor = BF_UNDEF;
mCurrBlendAlphaDFactor = BF_UNDEF;
+
+ mMatrixMode = LLRender::MM_MODELVIEW;
+
+ for (U32 i = 0; i < NUM_MATRIX_MODES; ++i)
+ {
+ mMatIdx[i] = 0;
+ mMatHash[i] = 0;
+ mCurMatHash[i] = 0xFFFFFFFF;
+ }
+
+ mLightHash = 0;
}
LLRender::~LLRender()
@@ -961,12 +1053,13 @@ LLRender::~LLRender()
void LLRender::init()
{
llassert_always(mBuffer.isNull()) ;
-
+ stop_glerror();
mBuffer = new LLVertexBuffer(immediate_mask, 0);
mBuffer->allocateBuffer(4096, 0, TRUE);
mBuffer->getVertexStrider(mVerticesp);
mBuffer->getTexCoord0Strider(mTexcoordsp);
mBuffer->getColorStrider(mColorsp);
+ stop_glerror();
}
void LLRender::shutdown()
@@ -1007,28 +1100,355 @@ void LLRender::refreshState(void)
mDirty = false;
}
+void LLRender::syncLightState()
+{
+ LLGLSLShader* shader = LLGLSLShader::sCurBoundShaderPtr;
+
+ if (!shader)
+ {
+ return;
+ }
+
+ if (shader->mLightHash != mLightHash)
+ {
+ shader->mLightHash = mLightHash;
+
+ LLVector4 position[8];
+ LLVector3 direction[8];
+ LLVector3 attenuation[8];
+ LLVector3 diffuse[8];
+
+ for (U32 i = 0; i < 8; i++)
+ {
+ LLLightState* light = mLightState[i];
+
+ position[i] = light->mPosition;
+ direction[i] = light->mSpotDirection;
+ attenuation[i].set(light->mLinearAtten, light->mQuadraticAtten, light->mSpecular.mV[3]);
+ diffuse[i].set(light->mDiffuse.mV);
+ }
+
+ shader->uniform4fv(LLShaderMgr::LIGHT_POSITION, 8, position[0].mV);
+ shader->uniform3fv(LLShaderMgr::LIGHT_DIRECTION, 8, direction[0].mV);
+ shader->uniform3fv(LLShaderMgr::LIGHT_ATTENUATION, 8, attenuation[0].mV);
+ shader->uniform3fv(LLShaderMgr::LIGHT_DIFFUSE, 8, diffuse[0].mV);
+ shader->uniform4fv(LLShaderMgr::LIGHT_AMBIENT, 1, mAmbientLightColor.mV);
+ //HACK -- duplicate sunlight color for compatibility with drivers that can't deal with multiple shader objects referencing the same uniform
+ shader->uniform4fv(LLShaderMgr::SUNLIGHT_COLOR, 1, diffuse[0].mV);
+ }
+}
+
+void LLRender::syncMatrices()
+{
+ stop_glerror();
+
+ U32 name[] =
+ {
+ LLShaderMgr::MODELVIEW_MATRIX,
+ LLShaderMgr::PROJECTION_MATRIX,
+ LLShaderMgr::TEXTURE_MATRIX0,
+ LLShaderMgr::TEXTURE_MATRIX1,
+ LLShaderMgr::TEXTURE_MATRIX2,
+ LLShaderMgr::TEXTURE_MATRIX3,
+ };
+
+ LLGLSLShader* shader = LLGLSLShader::sCurBoundShaderPtr;
+
+ static glh::matrix4f cached_mvp;
+ static U32 cached_mvp_mdv_hash = 0xFFFFFFFF;
+ static U32 cached_mvp_proj_hash = 0xFFFFFFFF;
+
+ static glh::matrix4f cached_normal;
+ static U32 cached_normal_hash = 0xFFFFFFFF;
+
+ if (shader)
+ {
+ llassert(shader);
+
+ bool mvp_done = false;
+
+ U32 i = MM_MODELVIEW;
+ if (mMatHash[i] != shader->mMatHash[i])
+ { //update modelview, normal, and MVP
+ glh::matrix4f& mat = mMatrix[i][mMatIdx[i]];
+
+ shader->uniformMatrix4fv(name[i], 1, GL_FALSE, mat.m);
+ shader->mMatHash[i] = mMatHash[i];
+
+ //update normal matrix
+ S32 loc = shader->getUniformLocation(LLShaderMgr::NORMAL_MATRIX);
+ if (loc > -1)
+ {
+ if (cached_normal_hash != mMatHash[i])
+ {
+ cached_normal = mat.inverse().transpose();
+ cached_normal_hash = mMatHash[i];
+ }
+
+ glh::matrix4f& norm = cached_normal;
+
+ F32 norm_mat[] =
+ {
+ norm.m[0], norm.m[1], norm.m[2],
+ norm.m[4], norm.m[5], norm.m[6],
+ norm.m[8], norm.m[9], norm.m[10]
+ };
+
+ shader->uniformMatrix3fv(LLShaderMgr::NORMAL_MATRIX, 1, GL_FALSE, norm_mat);
+ }
+
+ //update MVP matrix
+ mvp_done = true;
+ loc = shader->getUniformLocation(LLShaderMgr::MODELVIEW_PROJECTION_MATRIX);
+ if (loc > -1)
+ {
+ U32 proj = MM_PROJECTION;
+
+ if (cached_mvp_mdv_hash != mMatHash[i] || cached_mvp_proj_hash != mMatHash[MM_PROJECTION])
+ {
+ cached_mvp = mat;
+ cached_mvp.mult_left(mMatrix[proj][mMatIdx[proj]]);
+ cached_mvp_mdv_hash = mMatHash[i];
+ cached_mvp_proj_hash = mMatHash[MM_PROJECTION];
+ }
+
+ shader->uniformMatrix4fv(LLShaderMgr::MODELVIEW_PROJECTION_MATRIX, 1, GL_FALSE, cached_mvp.m);
+ }
+ }
+
+
+ i = MM_PROJECTION;
+ if (mMatHash[i] != shader->mMatHash[i])
+ { //update projection matrix, normal, and MVP
+ glh::matrix4f& mat = mMatrix[i][mMatIdx[i]];
+
+ shader->uniformMatrix4fv(name[i], 1, GL_FALSE, mat.m);
+ shader->mMatHash[i] = mMatHash[i];
+
+ if (!mvp_done)
+ {
+ //update MVP matrix
+ S32 loc = shader->getUniformLocation(LLShaderMgr::MODELVIEW_PROJECTION_MATRIX);
+ if (loc > -1)
+ {
+ if (cached_mvp_mdv_hash != mMatHash[i] || cached_mvp_proj_hash != mMatHash[MM_PROJECTION])
+ {
+ U32 mdv = MM_MODELVIEW;
+ cached_mvp = mat;
+ cached_mvp.mult_right(mMatrix[mdv][mMatIdx[mdv]]);
+ cached_mvp_mdv_hash = mMatHash[MM_MODELVIEW];
+ cached_mvp_proj_hash = mMatHash[MM_PROJECTION];
+ }
+
+ shader->uniformMatrix4fv(LLShaderMgr::MODELVIEW_PROJECTION_MATRIX, 1, GL_FALSE, cached_mvp.m);
+ }
+ }
+ }
+
+ for (i = MM_TEXTURE0; i < NUM_MATRIX_MODES; ++i)
+ {
+ if (mMatHash[i] != shader->mMatHash[i])
+ {
+ shader->uniformMatrix4fv(name[i], 1, GL_FALSE, mMatrix[i][mMatIdx[i]].m);
+ shader->mMatHash[i] = mMatHash[i];
+ }
+ }
+
+
+ if (shader->mFeatures.hasLighting || shader->mFeatures.calculatesLighting)
+ { //also sync light state
+ syncLightState();
+ }
+ }
+ else if (!LLGLSLShader::sNoFixedFunction)
+ {
+ GLenum mode[] =
+ {
+ GL_MODELVIEW,
+ GL_PROJECTION,
+ GL_TEXTURE,
+ GL_TEXTURE,
+ GL_TEXTURE,
+ GL_TEXTURE,
+ };
+
+ for (U32 i = 0; i < 2; ++i)
+ {
+ if (mMatHash[i] != mCurMatHash[i])
+ {
+ glMatrixMode(mode[i]);
+ glLoadMatrixf(mMatrix[i][mMatIdx[i]].m);
+ mCurMatHash[i] = mMatHash[i];
+ }
+ }
+
+ for (U32 i = 2; i < NUM_MATRIX_MODES; ++i)
+ {
+ if (mMatHash[i] != mCurMatHash[i])
+ {
+ gGL.getTexUnit(i-2)->activate();
+ glMatrixMode(mode[i]);
+ glLoadMatrixf(mMatrix[i][mMatIdx[i]].m);
+ mCurMatHash[i] = mMatHash[i];
+ }
+ }
+ }
+
+ stop_glerror();
+}
+
void LLRender::translatef(const GLfloat& x, const GLfloat& y, const GLfloat& z)
{
flush();
- glTranslatef(x,y,z);
+
+ {
+ glh::matrix4f trans_mat(1,0,0,x,
+ 0,1,0,y,
+ 0,0,1,z,
+ 0,0,0,1);
+
+ mMatrix[mMatrixMode][mMatIdx[mMatrixMode]].mult_right(trans_mat);
+ mMatHash[mMatrixMode]++;
+ }
}
void LLRender::scalef(const GLfloat& x, const GLfloat& y, const GLfloat& z)
{
flush();
- glScalef(x,y,z);
+
+ {
+ glh::matrix4f scale_mat(x,0,0,0,
+ 0,y,0,0,
+ 0,0,z,0,
+ 0,0,0,1);
+
+ mMatrix[mMatrixMode][mMatIdx[mMatrixMode]].mult_right(scale_mat);
+ mMatHash[mMatrixMode]++;
+ }
+}
+
+void LLRender::ortho(F32 left, F32 right, F32 bottom, F32 top, F32 zNear, F32 zFar)
+{
+ flush();
+
+ {
+
+ glh::matrix4f ortho_mat(2.f/(right-left),0,0, -(right+left)/(right-left),
+ 0,2.f/(top-bottom),0, -(top+bottom)/(top-bottom),
+ 0,0,-2.f/(zFar-zNear), -(zFar+zNear)/(zFar-zNear),
+ 0,0,0,1);
+
+ mMatrix[mMatrixMode][mMatIdx[mMatrixMode]].mult_right(ortho_mat);
+ mMatHash[mMatrixMode]++;
+ }
+}
+
+void LLRender::rotatef(const GLfloat& a, const GLfloat& x, const GLfloat& y, const GLfloat& z)
+{
+ flush();
+
+ {
+ F32 r = a * DEG_TO_RAD;
+
+ F32 c = cosf(r);
+ F32 s = sinf(r);
+
+ F32 ic = 1.f-c;
+
+ glh::matrix4f rot_mat(x*x*ic+c, x*y*ic-z*s, x*z*ic+y*s, 0,
+ x*y*ic+z*s, y*y*ic+c, y*z*ic-x*s, 0,
+ x*z*ic-y*s, y*z*ic+x*s, z*z*ic+c, 0,
+ 0,0,0,1);
+
+ mMatrix[mMatrixMode][mMatIdx[mMatrixMode]].mult_right(rot_mat);
+ mMatHash[mMatrixMode]++;
+ }
}
void LLRender::pushMatrix()
{
flush();
- glPushMatrix();
+
+ {
+ if (mMatIdx[mMatrixMode] < LL_MATRIX_STACK_DEPTH-1)
+ {
+ mMatrix[mMatrixMode][mMatIdx[mMatrixMode]+1] = mMatrix[mMatrixMode][mMatIdx[mMatrixMode]];
+ ++mMatIdx[mMatrixMode];
+ }
+ else
+ {
+ llwarns << "Matrix stack overflow." << llendl;
+ }
+ }
}
void LLRender::popMatrix()
{
flush();
- glPopMatrix();
+ {
+ if (mMatIdx[mMatrixMode] > 0)
+ {
+ --mMatIdx[mMatrixMode];
+ mMatHash[mMatrixMode]++;
+ }
+ else
+ {
+ llwarns << "Matrix stack underflow." << llendl;
+ }
+ }
+}
+
+void LLRender::loadMatrix(const GLfloat* m)
+{
+ flush();
+ {
+ mMatrix[mMatrixMode][mMatIdx[mMatrixMode]].set_value((GLfloat*) m);
+ mMatHash[mMatrixMode]++;
+ }
+}
+
+void LLRender::multMatrix(const GLfloat* m)
+{
+ flush();
+ {
+ glh::matrix4f mat((GLfloat*) m);
+
+ mMatrix[mMatrixMode][mMatIdx[mMatrixMode]].mult_right(mat);
+ mMatHash[mMatrixMode]++;
+ }
+}
+
+void LLRender::matrixMode(U32 mode)
+{
+ if (mode == MM_TEXTURE)
+ {
+ mode = MM_TEXTURE0 + gGL.getCurrentTexUnitIndex();
+ }
+
+ llassert(mode < NUM_MATRIX_MODES);
+ mMatrixMode = mode;
+}
+
+void LLRender::loadIdentity()
+{
+ flush();
+
+ {
+ llassert_always(mMatrixMode < NUM_MATRIX_MODES) ;
+
+ mMatrix[mMatrixMode][mMatIdx[mMatrixMode]].make_identity();
+ mMatHash[mMatrixMode]++;
+ }
+}
+
+const glh::matrix4f& LLRender::getModelviewMatrix()
+{
+ return mMatrix[MM_MODELVIEW][mMatIdx[MM_MODELVIEW]];
+}
+
+const glh::matrix4f& LLRender::getProjectionMatrix()
+{
+ return mMatrix[MM_PROJECTION][mMatIdx[MM_PROJECTION]];
}
void LLRender::translateUI(F32 x, F32 y, F32 z)
@@ -1284,6 +1704,19 @@ LLLightState* LLRender::getLight(U32 index)
return NULL;
}
+void LLRender::setAmbientLightColor(const LLColor4& color)
+{
+ if (color != mAmbientLightColor)
+ {
+ ++mLightHash;
+ mAmbientLightColor = color;
+ if (!LLGLSLShader::sNoFixedFunction)
+ {
+ glLightModelfv(GL_LIGHT_MODEL_AMBIENT, color.mV);
+ }
+ }
+}
+
bool LLRender::verifyTexUnitActive(U32 unitToVerify)
{
if (mCurrTextureUnitIndex == unitToVerify)
@@ -1309,6 +1742,11 @@ void LLRender::begin(const GLuint& mode)
{
if (mode != mMode)
{
+ if (mode == LLRender::QUADS)
+ {
+ mQuadCycle = 1;
+ }
+
if (mMode == LLRender::QUADS ||
mMode == LLRender::LINES ||
mMode == LLRender::TRIANGLES ||
@@ -1396,7 +1834,7 @@ void LLRender::flush()
if (gDebugGL)
{
- if (mMode == LLRender::QUADS)
+ if (mMode == LLRender::QUADS && !sGLCoreProfile)
{
if (mCount%4 != 0)
{
@@ -1421,12 +1859,34 @@ void LLRender::flush()
}
}
+ //store mCount in a local variable to avoid re-entrance (drawArrays may call flush)
+ U32 count = mCount;
+ mCount = 0;
+
+ if (mBuffer->useVBOs() && !mBuffer->isLocked())
+ { //hack to only flush the part of the buffer that was updated (relies on stream draw using buffersubdata)
+ mBuffer->getVertexStrider(mVerticesp, 0, count);
+ mBuffer->getTexCoord0Strider(mTexcoordsp, 0, count);
+ mBuffer->getColorStrider(mColorsp, 0, count);
+ }
+
+ mBuffer->flush();
mBuffer->setBuffer(immediate_mask);
- mBuffer->drawArrays(mMode, 0, mCount);
+
+ if (mMode == LLRender::QUADS && sGLCoreProfile)
+ {
+ mBuffer->drawArrays(LLRender::TRIANGLES, 0, count);
+ mQuadCycle = 1;
+ }
+ else
+ {
+ mBuffer->drawArrays(mMode, 0, count);
+ }
+
+ mVerticesp[0] = mVerticesp[count];
+ mTexcoordsp[0] = mTexcoordsp[count];
+ mColorsp[0] = mColorsp[count];
- mVerticesp[0] = mVerticesp[mCount];
- mTexcoordsp[0] = mTexcoordsp[mCount];
- mColorsp[0] = mColorsp[mCount];
mCount = 0;
}
}
@@ -1434,6 +1894,17 @@ void LLRender::flush()
void LLRender::vertex3f(const GLfloat& x, const GLfloat& y, const GLfloat& z)
{
//the range of mVerticesp, mColorsp and mTexcoordsp is [0, 4095]
+ if (mCount > 2048)
+ { //break when buffer gets reasonably full to keep GL command buffers happy and avoid overflow below
+ switch (mMode)
+ {
+ case LLRender::POINTS: flush(); break;
+ case LLRender::TRIANGLES: if (mCount%3==0) flush(); break;
+ case LLRender::QUADS: if(mCount%4 == 0) flush(); break;
+ case LLRender::LINES: if (mCount%2 == 0) flush(); break;
+ }
+ }
+
if (mCount > 4094)
{
// llwarns << "GL immediate mode overflow. Some geometry not drawn." << llendl;
@@ -1450,10 +1921,29 @@ void LLRender::vertex3f(const GLfloat& x, const GLfloat& y, const GLfloat& z)
mVerticesp[mCount] = vert;
}
+ if (mMode == LLRender::QUADS && LLRender::sGLCoreProfile)
+ {
+ mQuadCycle++;
+ if (mQuadCycle == 4)
+ { //copy two vertices so fourth quad element will add a triangle
+ mQuadCycle = 0;
+
+ mCount++;
+ mVerticesp[mCount] = mVerticesp[mCount-3];
+ mColorsp[mCount] = mColorsp[mCount-3];
+ mTexcoordsp[mCount] = mTexcoordsp[mCount-3];
+
+ mCount++;
+ mVerticesp[mCount] = mVerticesp[mCount-2];
+ mColorsp[mCount] = mColorsp[mCount-2];
+ mTexcoordsp[mCount] = mTexcoordsp[mCount-2];
+ }
+ }
+
mCount++;
mVerticesp[mCount] = mVerticesp[mCount-1];
mColorsp[mCount] = mColorsp[mCount-1];
- mTexcoordsp[mCount] = mTexcoordsp[mCount-1];
+ mTexcoordsp[mCount] = mTexcoordsp[mCount-1];
}
void LLRender::vertexBatchPreTransformed(LLVector3* verts, S32 vert_count)
@@ -1464,13 +1954,50 @@ void LLRender::vertexBatchPreTransformed(LLVector3* verts, S32 vert_count)
return;
}
- for (S32 i = 0; i < vert_count; i++)
+ if (sGLCoreProfile && mMode == LLRender::QUADS)
+ { //quads are deprecated, convert to triangle list
+ S32 i = 0;
+
+ while (i < vert_count)
+ {
+ //read first three
+ mVerticesp[mCount++] = verts[i++];
+ mTexcoordsp[mCount] = mTexcoordsp[mCount-1];
+ mColorsp[mCount] = mColorsp[mCount-1];
+
+ mVerticesp[mCount++] = verts[i++];
+ mTexcoordsp[mCount] = mTexcoordsp[mCount-1];
+ mColorsp[mCount] = mColorsp[mCount-1];
+
+ mVerticesp[mCount++] = verts[i++];
+ mTexcoordsp[mCount] = mTexcoordsp[mCount-1];
+ mColorsp[mCount] = mColorsp[mCount-1];
+
+ //copy two
+ mVerticesp[mCount++] = verts[i-3];
+ mTexcoordsp[mCount] = mTexcoordsp[mCount-1];
+ mColorsp[mCount] = mColorsp[mCount-1];
+
+ mVerticesp[mCount++] = verts[i-1];
+ mTexcoordsp[mCount] = mTexcoordsp[mCount-1];
+ mColorsp[mCount] = mColorsp[mCount-1];
+
+ //copy last one
+ mVerticesp[mCount++] = verts[i++];
+ mTexcoordsp[mCount] = mTexcoordsp[mCount-1];
+ mColorsp[mCount] = mColorsp[mCount-1];
+ }
+ }
+ else
{
- mVerticesp[mCount] = verts[i];
+ for (S32 i = 0; i < vert_count; i++)
+ {
+ mVerticesp[mCount] = verts[i];
- mCount++;
- mTexcoordsp[mCount] = mTexcoordsp[mCount-1];
- mColorsp[mCount] = mColorsp[mCount-1];
+ mCount++;
+ mTexcoordsp[mCount] = mTexcoordsp[mCount-1];
+ mColorsp[mCount] = mColorsp[mCount-1];
+ }
}
mVerticesp[mCount] = mVerticesp[mCount-1];
@@ -1484,13 +2011,50 @@ void LLRender::vertexBatchPreTransformed(LLVector3* verts, LLVector2* uvs, S32 v
return;
}
- for (S32 i = 0; i < vert_count; i++)
+ if (sGLCoreProfile && mMode == LLRender::QUADS)
+ { //quads are deprecated, convert to triangle list
+ S32 i = 0;
+
+ while (i < vert_count)
+ {
+ //read first three
+ mVerticesp[mCount] = verts[i];
+ mTexcoordsp[mCount++] = uvs[i++];
+ mColorsp[mCount] = mColorsp[mCount-1];
+
+ mVerticesp[mCount] = verts[i];
+ mTexcoordsp[mCount++] = uvs[i++];
+ mColorsp[mCount] = mColorsp[mCount-1];
+
+ mVerticesp[mCount] = verts[i];
+ mTexcoordsp[mCount++] = uvs[i++];
+ mColorsp[mCount] = mColorsp[mCount-1];
+
+ //copy last two
+ mVerticesp[mCount] = verts[i-3];
+ mTexcoordsp[mCount++] = uvs[i-3];
+ mColorsp[mCount] = mColorsp[mCount-1];
+
+ mVerticesp[mCount] = verts[i-1];
+ mTexcoordsp[mCount++] = uvs[i-1];
+ mColorsp[mCount] = mColorsp[mCount-1];
+
+ //copy last one
+ mVerticesp[mCount] = verts[i];
+ mTexcoordsp[mCount++] = uvs[i++];
+ mColorsp[mCount] = mColorsp[mCount-1];
+ }
+ }
+ else
{
- mVerticesp[mCount] = verts[i];
- mTexcoordsp[mCount] = uvs[i];
+ for (S32 i = 0; i < vert_count; i++)
+ {
+ mVerticesp[mCount] = verts[i];
+ mTexcoordsp[mCount] = uvs[i];
- mCount++;
- mColorsp[mCount] = mColorsp[mCount-1];
+ mCount++;
+ mColorsp[mCount] = mColorsp[mCount-1];
+ }
}
mVerticesp[mCount] = mVerticesp[mCount-1];
@@ -1505,13 +2069,51 @@ void LLRender::vertexBatchPreTransformed(LLVector3* verts, LLVector2* uvs, LLCol
return;
}
- for (S32 i = 0; i < vert_count; i++)
+
+ if (sGLCoreProfile && mMode == LLRender::QUADS)
+ { //quads are deprecated, convert to triangle list
+ S32 i = 0;
+
+ while (i < vert_count)
+ {
+ //read first three
+ mVerticesp[mCount] = verts[i];
+ mTexcoordsp[mCount] = uvs[i];
+ mColorsp[mCount++] = colors[i++];
+
+ mVerticesp[mCount] = verts[i];
+ mTexcoordsp[mCount] = uvs[i];
+ mColorsp[mCount++] = colors[i++];
+
+ mVerticesp[mCount] = verts[i];
+ mTexcoordsp[mCount] = uvs[i];
+ mColorsp[mCount++] = colors[i++];
+
+ //copy last two
+ mVerticesp[mCount] = verts[i-3];
+ mTexcoordsp[mCount] = uvs[i-3];
+ mColorsp[mCount++] = colors[i-3];
+
+ mVerticesp[mCount] = verts[i-1];
+ mTexcoordsp[mCount] = uvs[i-1];
+ mColorsp[mCount++] = colors[i-1];
+
+ //copy last one
+ mVerticesp[mCount] = verts[i];
+ mTexcoordsp[mCount] = uvs[i];
+ mColorsp[mCount++] = colors[i++];
+ }
+ }
+ else
{
- mVerticesp[mCount] = verts[i];
- mTexcoordsp[mCount] = uvs[i];
- mColorsp[mCount] = colors[i];
+ for (S32 i = 0; i < vert_count; i++)
+ {
+ mVerticesp[mCount] = verts[i];
+ mTexcoordsp[mCount] = uvs[i];
+ mColorsp[mCount] = colors[i];
- mCount++;
+ mCount++;
+ }
}
mVerticesp[mCount] = mVerticesp[mCount-1];
@@ -1586,6 +2188,81 @@ void LLRender::color3fv(const GLfloat* c)
color4f(c[0],c[1],c[2],1);
}
+void LLRender::diffuseColor3f(F32 r, F32 g, F32 b)
+{
+ LLGLSLShader* shader = LLGLSLShader::sCurBoundShaderPtr;
+ llassert(!LLGLSLShader::sNoFixedFunction || shader != NULL);
+
+ if (shader)
+ {
+ shader->uniform4f(LLShaderMgr::DIFFUSE_COLOR, r,g,b,1.f);
+ }
+ else
+ {
+ glColor3f(r,g,b);
+ }
+}
+
+void LLRender::diffuseColor3fv(const F32* c)
+{
+ LLGLSLShader* shader = LLGLSLShader::sCurBoundShaderPtr;
+ llassert(!LLGLSLShader::sNoFixedFunction || shader != NULL);
+
+ if (shader)
+ {
+ shader->uniform4f(LLShaderMgr::DIFFUSE_COLOR, c[0], c[1], c[2], 1.f);
+ }
+ else
+ {
+ glColor3fv(c);
+ }
+}
+
+void LLRender::diffuseColor4f(F32 r, F32 g, F32 b, F32 a)
+{
+ LLGLSLShader* shader = LLGLSLShader::sCurBoundShaderPtr;
+ llassert(!LLGLSLShader::sNoFixedFunction || shader != NULL);
+
+ if (shader)
+ {
+ shader->uniform4f(LLShaderMgr::DIFFUSE_COLOR, r,g,b,a);
+ }
+ else
+ {
+ glColor4f(r,g,b,a);
+ }
+}
+
+void LLRender::diffuseColor4fv(const F32* c)
+{
+ LLGLSLShader* shader = LLGLSLShader::sCurBoundShaderPtr;
+ llassert(!LLGLSLShader::sNoFixedFunction || shader != NULL);
+
+ if (shader)
+ {
+ shader->uniform4fv(LLShaderMgr::DIFFUSE_COLOR, 1, c);
+ }
+ else
+ {
+ glColor4fv(c);
+ }
+}
+
+void LLRender::diffuseColor4ubv(const U8* c)
+{
+ LLGLSLShader* shader = LLGLSLShader::sCurBoundShaderPtr;
+ llassert(!LLGLSLShader::sNoFixedFunction || shader != NULL);
+
+ if (shader)
+ {
+ shader->uniform4f(LLShaderMgr::DIFFUSE_COLOR, c[0]/255.f, c[1]/255.f, c[2]/255.f, c[3]/255.f);
+ }
+ else
+ {
+ glColor4ubv(c);
+ }
+}
+
void LLRender::debugTexUnits(void)
{
LL_INFOS("TextureUnit") << "Active TexUnit: " << mCurrTextureUnitIndex << LL_ENDL;
diff --git a/indra/llrender/llrender.h b/indra/llrender/llrender.h
index 8f7ee30d87..fa5f7f311d 100644
--- a/indra/llrender/llrender.h
+++ b/indra/llrender/llrender.h
@@ -41,6 +41,8 @@
#include "llstrider.h"
#include "llpointer.h"
#include "llglheaders.h"
+#include "llmatrix4a.h"
+#include "glh/glh_linear.h"
class LLVertexBuffer;
class LLCubeMap;
@@ -48,6 +50,8 @@ class LLImageGL;
class LLRenderTarget;
class LLTexture ;
+#define LL_MATRIX_STACK_DEPTH 32
+
class LLTexUnit
{
friend class LLRender;
@@ -235,6 +239,8 @@ public:
void setSpotDirection(const LLVector3& direction);
protected:
+ friend class LLRender;
+
S32 mIndex;
bool mEnabled;
LLColor4 mDiffuse;
@@ -308,6 +314,18 @@ public:
BF_UNDEF
} eBlendFactor;
+ typedef enum
+ {
+ MM_MODELVIEW = 0,
+ MM_PROJECTION,
+ MM_TEXTURE0,
+ MM_TEXTURE1,
+ MM_TEXTURE2,
+ MM_TEXTURE3,
+ NUM_MATRIX_MODES,
+ MM_TEXTURE
+ } eMatrixMode;
+
LLRender();
~LLRender();
void init() ;
@@ -319,8 +337,21 @@ public:
void translatef(const GLfloat& x, const GLfloat& y, const GLfloat& z);
void scalef(const GLfloat& x, const GLfloat& y, const GLfloat& z);
+ void rotatef(const GLfloat& a, const GLfloat& x, const GLfloat& y, const GLfloat& z);
+ void ortho(F32 left, F32 right, F32 bottom, F32 top, F32 zNear, F32 zFar);
+
void pushMatrix();
void popMatrix();
+ void loadMatrix(const GLfloat* m);
+ void loadIdentity();
+ void multMatrix(const GLfloat* m);
+ void matrixMode(U32 mode);
+
+ const glh::matrix4f& getModelviewMatrix();
+ const glh::matrix4f& getProjectionMatrix();
+
+ void syncMatrices();
+ void syncLightState();
void translateUI(F32 x, F32 y, F32 z);
void scaleUI(F32 x, F32 y, F32 z);
@@ -351,6 +382,12 @@ public:
void color3fv(const GLfloat* c);
void color4ubv(const GLubyte* c);
+ void diffuseColor3f(F32 r, F32 g, F32 b);
+ void diffuseColor3fv(const F32* c);
+ void diffuseColor4f(F32 r, F32 g, F32 b, F32 a);
+ void diffuseColor4fv(const F32* c);
+ void diffuseColor4ubv(const U8* c);
+
void vertexBatchPreTransformed(LLVector3* verts, S32 vert_count);
void vertexBatchPreTransformed(LLVector3* verts, LLVector2* uvs, S32 vert_count);
void vertexBatchPreTransformed(LLVector3* verts, LLVector2* uvs, LLColor4U*, S32 vert_count);
@@ -368,7 +405,8 @@ public:
eBlendFactor alpha_sfactor, eBlendFactor alpha_dfactor);
LLLightState* getLight(U32 index);
-
+ void setAmbientLightColor(const LLColor4& color);
+
LLTexUnit* getTexUnit(U32 index);
U32 getCurrentTexUnitIndex(void) const { return mCurrTextureUnitIndex; }
@@ -389,9 +427,21 @@ public:
public:
static U32 sUICalls;
static U32 sUIVerts;
+ static bool sGLCoreProfile;
private:
- bool mDirty;
+ friend class LLLightState;
+
+ U32 mMatrixMode;
+ U32 mMatIdx[NUM_MATRIX_MODES];
+ U32 mMatHash[NUM_MATRIX_MODES];
+ glh::matrix4f mMatrix[NUM_MATRIX_MODES][LL_MATRIX_STACK_DEPTH];
+ U32 mCurMatHash[NUM_MATRIX_MODES];
+ U32 mLightHash;
+ LLColor4 mAmbientLightColor;
+
+ bool mDirty;
+ U32 mQuadCycle;
U32 mCount;
U32 mMode;
U32 mCurrTextureUnitIndex;
@@ -419,10 +469,10 @@ private:
};
-extern F64 gGLModelView[16];
-extern F64 gGLLastModelView[16];
-extern F64 gGLLastProjection[16];
-extern F64 gGLProjection[16];
+extern F32 gGLModelView[16];
+extern F32 gGLLastModelView[16];
+extern F32 gGLLastProjection[16];
+extern F32 gGLProjection[16];
extern S32 gGLViewport[4];
extern LLRender gGL;
diff --git a/indra/llrender/llrendersphere.cpp b/indra/llrender/llrendersphere.cpp
index a5cd70445f..26bfe036e8 100644
--- a/indra/llrender/llrendersphere.cpp
+++ b/indra/llrender/llrendersphere.cpp
@@ -35,106 +35,12 @@
#include "llglheaders.h"
-GLUquadricObj *gQuadObj2 = NULL;
LLRenderSphere gSphere;
-void drawSolidSphere(GLdouble radius, GLint slices, GLint stacks);
-
-void drawSolidSphere(GLdouble radius, GLint slices, GLint stacks)
-{
- if (!gQuadObj2)
- {
- gQuadObj2 = gluNewQuadric();
- if (!gQuadObj2)
- {
- llwarns << "drawSolidSphere couldn't allocate quadric" << llendl;
- return;
- }
- }
-
- gluQuadricDrawStyle(gQuadObj2, GLU_FILL);
- gluQuadricNormals(gQuadObj2, GLU_SMOOTH);
- // If we ever changed/used the texture or orientation state
- // of quadObj, we'd need to change it to the defaults here
- // with gluQuadricTexture and/or gluQuadricOrientation.
- gluQuadricTexture(gQuadObj2, GL_TRUE);
- gluSphere(gQuadObj2, radius, slices, stacks);
-}
-
-
-// A couple thoughts on sphere drawing:
-// 1) You need more slices than stacks, but little less than 2:1
-// 2) At low LOD, setting stacks to an odd number avoids a "band" around the equator, making things look smoother
-void LLRenderSphere::prerender()
-{
- // Create a series of display lists for different LODs
- mDList[0] = glGenLists(1);
- glNewList(mDList[0], GL_COMPILE);
- drawSolidSphere(1.0, 30, 20);
- glEndList();
-
- mDList[1] = glGenLists(1);
- glNewList(mDList[1], GL_COMPILE);
- drawSolidSphere(1.0, 20, 15);
- glEndList();
-
- mDList[2] = glGenLists(1);
- glNewList(mDList[2], GL_COMPILE);
- drawSolidSphere(1.0, 12, 8);
- glEndList();
-
- mDList[3] = glGenLists(1);
- glNewList(mDList[3], GL_COMPILE);
- drawSolidSphere(1.0, 8, 5);
- glEndList();
-}
-
-void LLRenderSphere::cleanupGL()
-{
- for (S32 detail = 0; detail < 4; detail++)
- {
- glDeleteLists(mDList[detail], 1);
- mDList[detail] = 0;
- }
-
- if (gQuadObj2)
- {
- gluDeleteQuadric(gQuadObj2);
- gQuadObj2 = NULL;
- }
-}
-
-// Constants here are empirically derived from my eyeballs, JNC
-//
-// The toughest adjustment is the cutoff for the lowest LOD
-// Maybe we should have more LODs at the low end?
-void LLRenderSphere::render(F32 pixel_area)
-{
- S32 level_of_detail;
-
- if (pixel_area > 10000.f)
- {
- level_of_detail = 0;
- }
- else if (pixel_area > 800.f)
- {
- level_of_detail = 1;
- }
- else if (pixel_area > 100.f)
- {
- level_of_detail = 2;
- }
- else
- {
- level_of_detail = 3;
- }
- glCallList(mDList[level_of_detail]);
-}
-
-
void LLRenderSphere::render()
{
- glCallList(mDList[0]);
+ renderGGL();
+ gGL.flush();
}
inline LLVector3 polar_to_cart(F32 latitude, F32 longitude)
diff --git a/indra/llrender/llrendersphere.h b/indra/llrender/llrendersphere.h
index 96a6bec80c..f8e9e86e7f 100644
--- a/indra/llrender/llrendersphere.h
+++ b/indra/llrender/llrendersphere.h
@@ -40,11 +40,6 @@ void lat2xyz(LLVector3 * result, F32 lat, F32 lon); // utility routine
class LLRenderSphere
{
public:
- LLGLuint mDList[5];
-
- void prerender();
- void cleanupGL();
- void render(F32 pixel_area); // of a box of size 1.0 at that position
void render(); // render at highest LOD
void renderGGL(); // render using LLRender
diff --git a/indra/llrender/llrendertarget.cpp b/indra/llrender/llrendertarget.cpp
index 8c0d3592df..ef2a7395da 100644
--- a/indra/llrender/llrendertarget.cpp
+++ b/indra/llrender/llrendertarget.cpp
@@ -31,8 +31,7 @@
#include "llgl.h"
LLRenderTarget* LLRenderTarget::sBoundTarget = NULL;
-
-
+U32 LLRenderTarget::sBytesAllocated = 0;
void check_framebuffer_status()
{
@@ -62,8 +61,7 @@ LLRenderTarget::LLRenderTarget() :
mStencil(0),
mUseDepth(false),
mRenderDepth(false),
- mUsage(LLTexUnit::TT_TEXTURE),
- mSamples(0)
+ mUsage(LLTexUnit::TT_TEXTURE)
{
}
@@ -84,20 +82,6 @@ bool LLRenderTarget::allocate(U32 resx, U32 resy, U32 color_fmt, bool depth, boo
mStencil = stencil;
mUsage = usage;
mUseDepth = depth;
- mSamples = samples;
-
- mSamples = gGLManager.getNumFBOFSAASamples(mSamples);
-
- if (mSamples > 1 && gGLManager.mHasTextureMultisample)
- {
- mUsage = LLTexUnit::TT_MULTISAMPLE_TEXTURE;
- //no support for multisampled stencil targets yet
- mStencil = false;
- }
- else
- {
- mSamples = 0;
- }
if ((sUseFBO || use_fbo) && gGLManager.mHasFramebufferObject)
{
@@ -157,21 +141,6 @@ bool LLRenderTarget::addColorAttachment(U32 color_fmt)
stop_glerror();
-#ifdef GL_ARB_texture_multisample
- if (mSamples > 1)
- {
- clear_glerror();
- glTexImage2DMultisample(LLTexUnit::getInternalType(mUsage), mSamples, color_fmt, mResX, mResY, GL_TRUE);
- if (glGetError() != GL_NO_ERROR)
- {
- llwarns << "Could not allocate multisample color buffer for render target." << llendl;
- return false;
- }
- }
- else
-#else
- llassert_always(mSamples <= 1);
-#endif
{
clear_glerror();
LLImageGL::setManualImage(LLTexUnit::getInternalType(mUsage), 0, color_fmt, mResX, mResY, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
@@ -182,32 +151,32 @@ bool LLRenderTarget::addColorAttachment(U32 color_fmt)
}
}
+ sBytesAllocated += mResX*mResY*4;
+
stop_glerror();
- if (mSamples == 0)
- {
- if (offset == 0)
- { //use bilinear filtering on single texture render targets that aren't multisampled
- gGL.getTexUnit(0)->setTextureFilteringOption(LLTexUnit::TFO_BILINEAR);
- stop_glerror();
- }
- else
- { //don't filter data attachments
- gGL.getTexUnit(0)->setTextureFilteringOption(LLTexUnit::TFO_POINT);
- stop_glerror();
- }
+
+ if (offset == 0)
+ { //use bilinear filtering on single texture render targets that aren't multisampled
+ gGL.getTexUnit(0)->setTextureFilteringOption(LLTexUnit::TFO_BILINEAR);
+ stop_glerror();
+ }
+ else
+ { //don't filter data attachments
+ gGL.getTexUnit(0)->setTextureFilteringOption(LLTexUnit::TFO_POINT);
+ stop_glerror();
+ }
- if (mUsage != LLTexUnit::TT_RECT_TEXTURE)
- {
- gGL.getTexUnit(0)->setTextureAddressMode(LLTexUnit::TAM_MIRROR);
- stop_glerror();
- }
- else
- {
- // ATI doesn't support mirrored repeat for rectangular textures.
- gGL.getTexUnit(0)->setTextureAddressMode(LLTexUnit::TAM_CLAMP);
- stop_glerror();
- }
+ if (mUsage != LLTexUnit::TT_RECT_TEXTURE)
+ {
+ gGL.getTexUnit(0)->setTextureAddressMode(LLTexUnit::TAM_MIRROR);
+ stop_glerror();
+ }
+ else
+ {
+ // ATI doesn't support mirrored repeat for rectangular textures.
+ gGL.getTexUnit(0)->setTextureAddressMode(LLTexUnit::TAM_CLAMP);
+ stop_glerror();
}
if (mFBO)
@@ -250,26 +219,16 @@ bool LLRenderTarget::allocateDepth()
{
LLImageGL::generateTextures(1, &mDepth);
gGL.getTexUnit(0)->bindManual(mUsage, mDepth);
- if (mSamples == 0)
- {
- U32 internal_type = LLTexUnit::getInternalType(mUsage);
- gGL.getTexUnit(0)->setTextureFilteringOption(LLTexUnit::TFO_POINT);
- stop_glerror();
- clear_glerror();
- LLImageGL::setManualImage(internal_type, 0, GL_DEPTH_COMPONENT32, mResX, mResY, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, NULL);
- }
-#ifdef GL_ARB_texture_multisample
- else
- {
- stop_glerror();
- clear_glerror();
- glTexImage2DMultisample(LLTexUnit::getInternalType(mUsage), mSamples, GL_DEPTH_COMPONENT32, mResX, mResY, GL_TRUE);
- }
-#else
- llassert_always(mSamples <= 1);
-#endif
+
+ U32 internal_type = LLTexUnit::getInternalType(mUsage);
+ stop_glerror();
+ clear_glerror();
+ LLImageGL::setManualImage(internal_type, 0, GL_DEPTH_COMPONENT24, mResX, mResY, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, NULL);
+ gGL.getTexUnit(0)->setTextureFilteringOption(LLTexUnit::TFO_POINT);
}
+ sBytesAllocated += mResX*mResY*4;
+
if (glGetError() != GL_NO_ERROR)
{
llwarns << "Unable to allocate depth buffer for render target." << llendl;
@@ -339,14 +298,16 @@ void LLRenderTarget::release()
stop_glerror();
}
mDepth = 0;
+
+ sBytesAllocated -= mResX*mResY*4;
}
else if (mUseDepth && mFBO)
{ //detach shared depth buffer
glBindFramebuffer(GL_FRAMEBUFFER, mFBO);
if (mStencil)
{ //attached as a renderbuffer
- glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, 0);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, 0);
+ glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, 0);
mStencil = false;
}
else
@@ -364,6 +325,7 @@ void LLRenderTarget::release()
if (mTex.size() > 0)
{
+ sBytesAllocated -= mResX*mResY*4*mTex.size();
LLImageGL::deleteTextures(mTex.size(), &mTex[0], true);
mTex.clear();
}
@@ -495,7 +457,8 @@ void LLRenderTarget::copyContents(LLRenderTarget& source, S32 srcX0, S32 srcY0,
gGL.flush();
if (!source.mFBO || !mFBO)
{
- llerrs << "Cannot copy framebuffer contents for non FBO render targets." << llendl;
+ llwarns << "Cannot copy framebuffer contents for non FBO render targets." << llendl;
+ return;
}
diff --git a/indra/llrender/llrendertarget.h b/indra/llrender/llrendertarget.h
index dea1de12d8..2735ab21c5 100644
--- a/indra/llrender/llrendertarget.h
+++ b/indra/llrender/llrendertarget.h
@@ -64,6 +64,7 @@ class LLRenderTarget
public:
//whether or not to use FBO implementation
static bool sUseFBO;
+ static U32 sBytesAllocated;
LLRenderTarget();
~LLRenderTarget();
@@ -147,7 +148,6 @@ protected:
bool mUseDepth;
bool mRenderDepth;
LLTexUnit::eTextureType mUsage;
- U32 mSamples;
static LLRenderTarget* sBoundTarget;
};
diff --git a/indra/llrender/llshadermgr.cpp b/indra/llrender/llshadermgr.cpp
index 986c1f2774..1a03aeebb7 100644
--- a/indra/llrender/llshadermgr.cpp
+++ b/indra/llrender/llshadermgr.cpp
@@ -81,7 +81,14 @@ BOOL LLShaderMgr::attachShaderFeatures(LLGLSLShader * shader)
// NOTE order of shader object attaching is VERY IMPORTANT!!!
if (features->calculatesAtmospherics)
{
- if (!shader->attachObject("windlight/atmosphericsVarsV.glsl"))
+ if (features->hasWaterFog)
+ {
+ if (!shader->attachObject("windlight/atmosphericsVarsWaterV.glsl"))
+ {
+ return FALSE;
+ }
+ }
+ else if (!shader->attachObject("windlight/atmosphericsVarsV.glsl"))
{
return FALSE;
}
@@ -100,10 +107,13 @@ BOOL LLShaderMgr::attachShaderFeatures(LLGLSLShader * shader)
{
return FALSE;
}
-
- if (!shader->attachObject("lighting/sumLightsSpecularV.glsl"))
+
+ if (!features->isAlphaLighting)
{
- return FALSE;
+ if (!shader->attachObject("lighting/sumLightsSpecularV.glsl"))
+ {
+ return FALSE;
+ }
}
if (!shader->attachObject("lighting/lightSpecularV.glsl"))
@@ -118,9 +128,12 @@ BOOL LLShaderMgr::attachShaderFeatures(LLGLSLShader * shader)
return FALSE;
}
- if (!shader->attachObject("lighting/sumLightsV.glsl"))
+ if (!features->isAlphaLighting)
{
- return FALSE;
+ if (!shader->attachObject("lighting/sumLightsV.glsl"))
+ {
+ return FALSE;
+ }
}
if (!shader->attachObject("lighting/lightV.glsl"))
@@ -161,7 +174,14 @@ BOOL LLShaderMgr::attachShaderFeatures(LLGLSLShader * shader)
if(features->calculatesAtmospherics)
{
- if (!shader->attachObject("windlight/atmosphericsVarsF.glsl"))
+ if (features->hasWaterFog)
+ {
+ if (!shader->attachObject("windlight/atmosphericsVarsWaterF.glsl"))
+ {
+ return FALSE;
+ }
+ }
+ else if (!shader->attachObject("windlight/atmosphericsVarsF.glsl"))
{
return FALSE;
}
@@ -241,7 +261,7 @@ BOOL LLShaderMgr::attachShaderFeatures(LLGLSLShader * shader)
return FALSE;
}
}
- shader->mFeatures.mIndexedTextureChannels = gGLManager.mNumTextureImageUnits-1;
+ shader->mFeatures.mIndexedTextureChannels = llmax(LLGLSLShader::sIndexedTextureChannels-1, 1);
}
}
@@ -280,9 +300,9 @@ BOOL LLShaderMgr::attachShaderFeatures(LLGLSLShader * shader)
return FALSE;
}
}
- shader->mFeatures.mIndexedTextureChannels = gGLManager.mNumTextureImageUnits-1;
+ shader->mFeatures.mIndexedTextureChannels = llmax(LLGLSLShader::sIndexedTextureChannels-1, 1);
}
- }
+ }
}
// NOTE order of shader object attaching is VERY IMPORTANT!!!
@@ -304,7 +324,7 @@ BOOL LLShaderMgr::attachShaderFeatures(LLGLSLShader * shader)
{
return FALSE;
}
- shader->mFeatures.mIndexedTextureChannels = gGLManager.mNumTextureImageUnits-1;
+ shader->mFeatures.mIndexedTextureChannels = llmax(LLGLSLShader::sIndexedTextureChannels-1, 1);
}
}
else if (features->hasWaterFog)
@@ -336,7 +356,7 @@ BOOL LLShaderMgr::attachShaderFeatures(LLGLSLShader * shader)
{
return FALSE;
}
- shader->mFeatures.mIndexedTextureChannels = gGLManager.mNumTextureImageUnits-1;
+ shader->mFeatures.mIndexedTextureChannels = llmax(LLGLSLShader::sIndexedTextureChannels-1, 1);
}
}
@@ -355,7 +375,7 @@ BOOL LLShaderMgr::attachShaderFeatures(LLGLSLShader * shader)
{
return FALSE;
}
- shader->mFeatures.mIndexedTextureChannels = gGLManager.mNumTextureImageUnits-1;
+ shader->mFeatures.mIndexedTextureChannels = llmax(LLGLSLShader::sIndexedTextureChannels-1, 1);
}
}
@@ -395,7 +415,7 @@ BOOL LLShaderMgr::attachShaderFeatures(LLGLSLShader * shader)
return FALSE;
}
}
- shader->mFeatures.mIndexedTextureChannels = gGLManager.mNumTextureImageUnits-1;
+ shader->mFeatures.mIndexedTextureChannels = llmax(LLGLSLShader::sIndexedTextureChannels-1, 1);
}
}
}
@@ -419,7 +439,7 @@ BOOL LLShaderMgr::attachShaderFeatures(LLGLSLShader * shader)
{
return FALSE;
}
- shader->mFeatures.mIndexedTextureChannels = gGLManager.mNumTextureImageUnits-1;
+ shader->mFeatures.mIndexedTextureChannels = llmax(LLGLSLShader::sIndexedTextureChannels-1, 1);
}
}
@@ -438,10 +458,26 @@ BOOL LLShaderMgr::attachShaderFeatures(LLGLSLShader * shader)
{
return FALSE;
}
- shader->mFeatures.mIndexedTextureChannels = gGLManager.mNumTextureImageUnits-1;
+ shader->mFeatures.mIndexedTextureChannels = llmax(LLGLSLShader::sIndexedTextureChannels-1, 1);
}
}
}
+
+ if (features->mIndexedTextureChannels <= 1)
+ {
+ if (!shader->attachObject("objects/nonindexedTextureV.glsl"))
+ {
+ return FALSE;
+ }
+ }
+ else
+ {
+ if (!shader->attachObject("objects/indexedTextureV.glsl"))
+ {
+ return FALSE;
+ }
+ }
+
return TRUE;
}
@@ -477,7 +513,7 @@ void LLShaderMgr::dumpObjectLog(GLhandleARB ret, BOOL warns)
}
else
{
- LL_DEBUGS("ShaderLoading") << log << LL_ENDL;
+ LL_INFOS("ShaderLoading") << log << LL_ENDL;
}
}
}
@@ -531,23 +567,64 @@ GLhandleARB LLShaderMgr::loadShaderFile(const std::string& filename, S32 & shade
}
//we can't have any lines longer than 1024 characters
- //or any shaders longer than 1024 lines... deal - DaveP
+ //or any shaders longer than 4096 lines... deal - DaveP
GLcharARB buff[1024];
- GLcharARB* text[1024];
+ GLcharARB* text[4096];
GLuint count = 0;
- if (gGLManager.mGLVersion < 2.1f)
+ F32 version = gGLManager.mGLVersion;
+
+//hack to never use GLSL > 1.20 on OSX
+#if LL_DARWIN
+ version = llmin(version, 2.9f);
+#endif
+
+ if (version < 2.1f)
{
text[count++] = strdup("#version 110\n");
+ text[count++] = strdup("#define ATTRIBUTE attribute\n");
+ text[count++] = strdup("#define VARYING varying\n");
}
- else if (gGLManager.mGLVersion < 3.f)
+ else if (version < 3.3f)
{
//set version to 1.20
text[count++] = strdup("#version 120\n");
+ text[count++] = strdup("#define FXAA_GLSL_120 1\n");
+ text[count++] = strdup("#define FXAA_FAST_PIXEL_OFFSET 0\n");
+ text[count++] = strdup("#define ATTRIBUTE attribute\n");
+ text[count++] = strdup("#define VARYING varying\n");
}
else
- { //set version to 1.30
- text[count++] = strdup("#version 130\n");
+ {
+ if (version < 4.f)
+ {
+ //set version to 1.30
+ text[count++] = strdup("#version 130\n");
+ }
+ else
+ { //set version to 400
+ text[count++] = strdup("#version 400\n");
+ }
+
+ text[count++] = strdup("#define DEFINE_GL_FRAGCOLOR 1\n");
+ text[count++] = strdup("#define FXAA_GLSL_130 1\n");
+
+ text[count++] = strdup("#define ATTRIBUTE in\n");
+
+ if (type == GL_VERTEX_SHADER_ARB)
+ { //"varying" state is "out" in a vertex program, "in" in a fragment program
+ // ("varying" is deprecated after version 1.20)
+ text[count++] = strdup("#define VARYING out\n");
+ }
+ else
+ {
+ text[count++] = strdup("#define VARYING in\n");
+ }
+
+ //backwards compatibility with legacy texture lookup syntax
+ text[count++] = strdup("#define textureCube texture\n");
+ text[count++] = strdup("#define texture2DLod textureLod\n");
+ text[count++] = strdup("#define shadow2D(a,b) vec2(texture(a,b))\n");
}
//copy preprocessor definitions into buffer
@@ -571,7 +648,7 @@ GLhandleARB LLShaderMgr::loadShaderFile(const std::string& filename, S32 & shade
.
uniform sampler2D texN;
- varying float vary_texture_index;
+ VARYING float vary_texture_index;
vec4 diffuseLookup(vec2 texcoord)
{
@@ -597,7 +674,11 @@ GLhandleARB LLShaderMgr::loadShaderFile(const std::string& filename, S32 & shade
text[count++] = strdup(decl.c_str());
}
- text[count++] = strdup("varying float vary_texture_index;\n");
+ if (texture_index_channels > 1)
+ {
+ text[count++] = strdup("VARYING float vary_texture_index;\n");
+ }
+
text[count++] = strdup("vec4 diffuseLookup(vec2 texcoord)\n");
text[count++] = strdup("{\n");
@@ -620,7 +701,7 @@ GLhandleARB LLShaderMgr::loadShaderFile(const std::string& filename, S32 & shade
}
text[count++] = strdup("\t}\n");
- text[count++] = strdup("\treturn vec4(0,0,0,0);\n");
+ text[count++] = strdup("\treturn vec4(1,0,1,1);\n");
text[count++] = strdup("}\n");
}
else
@@ -643,13 +724,13 @@ GLhandleARB LLShaderMgr::loadShaderFile(const std::string& filename, S32 & shade
text[count++] = strdup(if_str.c_str());
}
- text[count++] = strdup("\treturn vec4(0,0,0,0);\n");
+ text[count++] = strdup("\treturn vec4(1,0,1,1);\n");
text[count++] = strdup("}\n");
}
}
//copy file into memory
- while( fgets((char *)buff, 1024, file) != NULL && count < LL_ARRAY_SIZE(buff) )
+ while( fgets((char *)buff, 1024, file) != NULL && count < LL_ARRAY_SIZE(text) )
{
text[count++] = (GLcharARB *)strdup((char *)buff);
}
@@ -704,14 +785,24 @@ GLhandleARB LLShaderMgr::loadShaderFile(const std::string& filename, S32 & shade
LL_WARNS("ShaderLoading") << "GLSL Compilation Error: (" << error << ") in " << filename << LL_ENDL;
dumpObjectLog(ret);
+#if LL_WINDOWS
std::stringstream ostr;
//dump shader source for debugging
for (GLuint i = 0; i < count; i++)
{
ostr << i << ": " << text[i];
+
+ if (i % 128 == 0)
+ { //dump every 128 lines
+
+ LL_WARNS("ShaderLoading") << "\n" << ostr.str() << llendl;
+ ostr = std::stringstream();
+ }
+
}
LL_WARNS("ShaderLoading") << "\n" << ostr.str() << llendl;
+#endif // LL_WINDOWS
ret = 0;
}
@@ -760,28 +851,42 @@ BOOL LLShaderMgr::linkProgramObject(GLhandleARB obj, BOOL suppress_errors)
LL_WARNS("ShaderLoading") << "GLSL Linker Error:" << LL_ENDL;
}
-// NOTE: Removing LL_DARWIN block as it doesn't seem to actually give the correct answer,
-// but want it for reference once I move it.
-#if 0
- // Force an evaluation of the gl state so the driver can tell if the shader will run in hardware or software
- // per Apple's suggestion
- glBegin(gGL.mMode);
- glEnd();
+#if LL_DARWIN
- // Query whether the shader can or cannot run in hardware
- // http://developer.apple.com/qa/qa2007/qa1502.html
- long vertexGPUProcessing;
- CGLContextObj ctx = CGLGetCurrentContext();
- CGLGetParameter (ctx, kCGLCPGPUVertexProcessing, &vertexGPUProcessing);
- long fragmentGPUProcessing;
- CGLGetParameter (ctx, kCGLCPGPUFragmentProcessing, &fragmentGPUProcessing);
- if (!fragmentGPUProcessing || !vertexGPUProcessing)
+ // For some reason this absolutely kills the frame rate when VBO's are enabled
+ if (0)
{
- LL_WARNS("ShaderLoading") << "GLSL Linker: Running in Software:" << LL_ENDL;
- success = GL_FALSE;
- suppress_errors = FALSE;
+ // Force an evaluation of the gl state so the driver can tell if the shader will run in hardware or software
+ // per Apple's suggestion
+ LLGLSLShader::sNoFixedFunction = false;
+
+ glUseProgramObjectARB(obj);
+
+ gGL.begin(LLRender::TRIANGLES);
+ gGL.vertex3f(0.0f, 0.0f, 0.0f);
+ gGL.vertex3f(0.0f, 0.0f, 0.0f);
+ gGL.vertex3f(0.0f, 0.0f, 0.0f);
+ gGL.end();
+ gGL.flush();
+
+ glUseProgramObjectARB(0);
+
+ LLGLSLShader::sNoFixedFunction = true;
+
+ // Query whether the shader can or cannot run in hardware
+ // http://developer.apple.com/qa/qa2007/qa1502.html
+ GLint vertexGPUProcessing, fragmentGPUProcessing;
+ CGLContextObj ctx = CGLGetCurrentContext();
+ CGLGetParameter(ctx, kCGLCPGPUVertexProcessing, &vertexGPUProcessing);
+ CGLGetParameter(ctx, kCGLCPGPUFragmentProcessing, &fragmentGPUProcessing);
+ if (!fragmentGPUProcessing || !vertexGPUProcessing)
+ {
+ LL_WARNS("ShaderLoading") << "GLSL Linker: Running in Software:" << LL_ENDL;
+ success = GL_FALSE;
+ suppress_errors = FALSE;
+ }
}
-
+
#else
std::string log = get_object_log(obj);
LLStringUtil::toLower(log);
@@ -819,3 +924,181 @@ BOOL LLShaderMgr::validateProgramObject(GLhandleARB obj)
return success;
}
+//virtual
+void LLShaderMgr::initAttribsAndUniforms()
+{
+ //MUST match order of enum in LLVertexBuffer.h
+ mReservedAttribs.push_back("position");
+ mReservedAttribs.push_back("normal");
+ mReservedAttribs.push_back("texcoord0");
+ mReservedAttribs.push_back("texcoord1");
+ mReservedAttribs.push_back("texcoord2");
+ mReservedAttribs.push_back("texcoord3");
+ mReservedAttribs.push_back("diffuse_color");
+ mReservedAttribs.push_back("emissive");
+ mReservedAttribs.push_back("binormal");
+ mReservedAttribs.push_back("weight");
+ mReservedAttribs.push_back("weight4");
+ mReservedAttribs.push_back("clothing");
+ mReservedAttribs.push_back("texture_index");
+
+ //matrix state
+ mReservedUniforms.push_back("modelview_matrix");
+ mReservedUniforms.push_back("projection_matrix");
+ mReservedUniforms.push_back("inv_proj");
+ mReservedUniforms.push_back("modelview_projection_matrix");
+ mReservedUniforms.push_back("normal_matrix");
+ mReservedUniforms.push_back("texture_matrix0");
+ mReservedUniforms.push_back("texture_matrix1");
+ mReservedUniforms.push_back("texture_matrix2");
+ mReservedUniforms.push_back("texture_matrix3");
+ llassert(mReservedUniforms.size() == LLShaderMgr::TEXTURE_MATRIX3+1);
+
+ mReservedUniforms.push_back("viewport");
+
+ mReservedUniforms.push_back("light_position");
+ mReservedUniforms.push_back("light_direction");
+ mReservedUniforms.push_back("light_attenuation");
+ mReservedUniforms.push_back("light_diffuse");
+ mReservedUniforms.push_back("light_ambient");
+ mReservedUniforms.push_back("light_count");
+ mReservedUniforms.push_back("light");
+ mReservedUniforms.push_back("light_col");
+ mReservedUniforms.push_back("far_z");
+
+ llassert(mReservedUniforms.size() == LLShaderMgr::MULTI_LIGHT_FAR_Z+1);
+
+
+ mReservedUniforms.push_back("proj_mat");
+ mReservedUniforms.push_back("proj_near");
+ mReservedUniforms.push_back("proj_p");
+ mReservedUniforms.push_back("proj_n");
+ mReservedUniforms.push_back("proj_origin");
+ mReservedUniforms.push_back("proj_range");
+ mReservedUniforms.push_back("proj_ambiance");
+ mReservedUniforms.push_back("proj_shadow_idx");
+ mReservedUniforms.push_back("shadow_fade");
+ mReservedUniforms.push_back("proj_focus");
+ mReservedUniforms.push_back("proj_lod");
+ mReservedUniforms.push_back("proj_ambient_lod");
+
+ llassert(mReservedUniforms.size() == LLShaderMgr::PROJECTOR_AMBIENT_LOD+1);
+
+ mReservedUniforms.push_back("color");
+
+ mReservedUniforms.push_back("diffuseMap");
+ mReservedUniforms.push_back("specularMap");
+ mReservedUniforms.push_back("bumpMap");
+ mReservedUniforms.push_back("environmentMap");
+ mReservedUniforms.push_back("cloude_noise_texture");
+ mReservedUniforms.push_back("fullbright");
+ mReservedUniforms.push_back("lightnorm");
+ mReservedUniforms.push_back("sunlight_color_copy");
+ mReservedUniforms.push_back("ambient");
+ mReservedUniforms.push_back("blue_horizon");
+ mReservedUniforms.push_back("blue_density");
+ mReservedUniforms.push_back("haze_horizon");
+ mReservedUniforms.push_back("haze_density");
+ mReservedUniforms.push_back("cloud_shadow");
+ mReservedUniforms.push_back("density_multiplier");
+ mReservedUniforms.push_back("distance_multiplier");
+ mReservedUniforms.push_back("max_y");
+ mReservedUniforms.push_back("glow");
+ mReservedUniforms.push_back("cloud_color");
+ mReservedUniforms.push_back("cloud_pos_density1");
+ mReservedUniforms.push_back("cloud_pos_density2");
+ mReservedUniforms.push_back("cloud_scale");
+ mReservedUniforms.push_back("gamma");
+ mReservedUniforms.push_back("scene_light_strength");
+
+ llassert(mReservedUniforms.size() == LLShaderMgr::SCENE_LIGHT_STRENGTH+1);
+
+ mReservedUniforms.push_back("center");
+ mReservedUniforms.push_back("size");
+ mReservedUniforms.push_back("falloff");
+
+
+ mReservedUniforms.push_back("minLuminance");
+ mReservedUniforms.push_back("maxExtractAlpha");
+ mReservedUniforms.push_back("lumWeights");
+ mReservedUniforms.push_back("warmthWeights");
+ mReservedUniforms.push_back("warmthAmount");
+ mReservedUniforms.push_back("glowStrength");
+ mReservedUniforms.push_back("glowDelta");
+
+ llassert(mReservedUniforms.size() == LLShaderMgr::GLOW_DELTA+1);
+
+
+ mReservedUniforms.push_back("minimum_alpha");
+
+ mReservedUniforms.push_back("shadow_matrix");
+ mReservedUniforms.push_back("env_mat");
+ mReservedUniforms.push_back("shadow_clip");
+ mReservedUniforms.push_back("sun_wash");
+ mReservedUniforms.push_back("shadow_noise");
+ mReservedUniforms.push_back("blur_size");
+ mReservedUniforms.push_back("ssao_radius");
+ mReservedUniforms.push_back("ssao_max_radius");
+ mReservedUniforms.push_back("ssao_factor");
+ mReservedUniforms.push_back("ssao_factor_inv");
+ mReservedUniforms.push_back("ssao_effect_mat");
+ mReservedUniforms.push_back("screen_res");
+ mReservedUniforms.push_back("near_clip");
+ mReservedUniforms.push_back("shadow_offset");
+ mReservedUniforms.push_back("shadow_bias");
+ mReservedUniforms.push_back("spot_shadow_bias");
+ mReservedUniforms.push_back("spot_shadow_offset");
+ mReservedUniforms.push_back("sun_dir");
+ mReservedUniforms.push_back("shadow_res");
+ mReservedUniforms.push_back("proj_shadow_res");
+ mReservedUniforms.push_back("depth_cutoff");
+ mReservedUniforms.push_back("norm_cutoff");
+
+ llassert(mReservedUniforms.size() == LLShaderMgr::DEFERRED_NORM_CUTOFF+1);
+
+ mReservedUniforms.push_back("tc_scale");
+ mReservedUniforms.push_back("rcp_screen_res");
+ mReservedUniforms.push_back("rcp_frame_opt");
+ mReservedUniforms.push_back("rcp_frame_opt2");
+
+ mReservedUniforms.push_back("focal_distance");
+ mReservedUniforms.push_back("blur_constant");
+ mReservedUniforms.push_back("tan_pixel_angle");
+ mReservedUniforms.push_back("magnification");
+ mReservedUniforms.push_back("max_cof");
+ mReservedUniforms.push_back("res_scale");
+
+ mReservedUniforms.push_back("depthMap");
+ mReservedUniforms.push_back("shadowMap0");
+ mReservedUniforms.push_back("shadowMap1");
+ mReservedUniforms.push_back("shadowMap2");
+ mReservedUniforms.push_back("shadowMap3");
+ mReservedUniforms.push_back("shadowMap4");
+ mReservedUniforms.push_back("shadowMap5");
+
+ llassert(mReservedUniforms.size() == LLShaderMgr::DEFERRED_SHADOW5+1);
+
+ mReservedUniforms.push_back("normalMap");
+ mReservedUniforms.push_back("positionMap");
+ mReservedUniforms.push_back("diffuseRect");
+ mReservedUniforms.push_back("specularRect");
+ mReservedUniforms.push_back("noiseMap");
+ mReservedUniforms.push_back("lightFunc");
+ mReservedUniforms.push_back("lightMap");
+ mReservedUniforms.push_back("bloomMap");
+ mReservedUniforms.push_back("projectionMap");
+
+ llassert(mReservedUniforms.size() == END_RESERVED_UNIFORMS);
+
+ std::set<std::string> dupe_check;
+
+ for (U32 i = 0; i < mReservedUniforms.size(); ++i)
+ {
+ if (dupe_check.find(mReservedUniforms[i]) != dupe_check.end())
+ {
+ llerrs << "Duplicate reserved uniform name found: " << mReservedUniforms[i] << llendl;
+ }
+ dupe_check.insert(mReservedUniforms[i]);
+ }
+}
+
diff --git a/indra/llrender/llshadermgr.h b/indra/llrender/llshadermgr.h
index 2f30103811..950e6c9c2f 100644
--- a/indra/llrender/llshadermgr.h
+++ b/indra/llrender/llshadermgr.h
@@ -36,9 +36,137 @@ public:
LLShaderMgr();
virtual ~LLShaderMgr();
+ typedef enum
+ {
+ MODELVIEW_MATRIX = 0,
+ PROJECTION_MATRIX,
+ INVERSE_PROJECTION_MATRIX,
+ MODELVIEW_PROJECTION_MATRIX,
+ NORMAL_MATRIX,
+ TEXTURE_MATRIX0,
+ TEXTURE_MATRIX1,
+ TEXTURE_MATRIX2,
+ TEXTURE_MATRIX3,
+ VIEWPORT,
+ LIGHT_POSITION,
+ LIGHT_DIRECTION,
+ LIGHT_ATTENUATION,
+ LIGHT_DIFFUSE,
+ LIGHT_AMBIENT,
+ MULTI_LIGHT_COUNT,
+ MULTI_LIGHT,
+ MULTI_LIGHT_COL,
+ MULTI_LIGHT_FAR_Z,
+ PROJECTOR_MATRIX,
+ PROJECTOR_NEAR,
+ PROJECTOR_P,
+ PROJECTOR_N,
+ PROJECTOR_ORIGIN,
+ PROJECTOR_RANGE,
+ PROJECTOR_AMBIANCE,
+ PROJECTOR_SHADOW_INDEX,
+ PROJECTOR_SHADOW_FADE,
+ PROJECTOR_FOCUS,
+ PROJECTOR_LOD,
+ PROJECTOR_AMBIENT_LOD,
+ DIFFUSE_COLOR,
+ DIFFUSE_MAP,
+ SPECULAR_MAP,
+ BUMP_MAP,
+ ENVIRONMENT_MAP,
+ CLOUD_NOISE_MAP,
+ FULLBRIGHT,
+ LIGHTNORM,
+ SUNLIGHT_COLOR,
+ AMBIENT,
+ BLUE_HORIZON,
+ BLUE_DENSITY,
+ HAZE_HORIZON,
+ HAZE_DENSITY,
+ CLOUD_SHADOW,
+ DENSITY_MULTIPLIER,
+ DISTANCE_MULTIPLIER,
+ MAX_Y,
+ GLOW,
+ CLOUD_COLOR,
+ CLOUD_POS_DENSITY1,
+ CLOUD_POS_DENSITY2,
+ CLOUD_SCALE,
+ GAMMA,
+ SCENE_LIGHT_STRENGTH,
+ LIGHT_CENTER,
+ LIGHT_SIZE,
+ LIGHT_FALLOFF,
+
+ GLOW_MIN_LUMINANCE,
+ GLOW_MAX_EXTRACT_ALPHA,
+ GLOW_LUM_WEIGHTS,
+ GLOW_WARMTH_WEIGHTS,
+ GLOW_WARMTH_AMOUNT,
+ GLOW_STRENGTH,
+ GLOW_DELTA,
+
+ MINIMUM_ALPHA,
+
+ DEFERRED_SHADOW_MATRIX,
+ DEFERRED_ENV_MAT,
+ DEFERRED_SHADOW_CLIP,
+ DEFERRED_SUN_WASH,
+ DEFERRED_SHADOW_NOISE,
+ DEFERRED_BLUR_SIZE,
+ DEFERRED_SSAO_RADIUS,
+ DEFERRED_SSAO_MAX_RADIUS,
+ DEFERRED_SSAO_FACTOR,
+ DEFERRED_SSAO_FACTOR_INV,
+ DEFERRED_SSAO_EFFECT_MAT,
+ DEFERRED_SCREEN_RES,
+ DEFERRED_NEAR_CLIP,
+ DEFERRED_SHADOW_OFFSET,
+ DEFERRED_SHADOW_BIAS,
+ DEFERRED_SPOT_SHADOW_BIAS,
+ DEFERRED_SPOT_SHADOW_OFFSET,
+ DEFERRED_SUN_DIR,
+ DEFERRED_SHADOW_RES,
+ DEFERRED_PROJ_SHADOW_RES,
+ DEFERRED_DEPTH_CUTOFF,
+ DEFERRED_NORM_CUTOFF,
+
+ FXAA_TC_SCALE,
+ FXAA_RCP_SCREEN_RES,
+ FXAA_RCP_FRAME_OPT,
+ FXAA_RCP_FRAME_OPT2,
+
+ DOF_FOCAL_DISTANCE,
+ DOF_BLUR_CONSTANT,
+ DOF_TAN_PIXEL_ANGLE,
+ DOF_MAGNIFICATION,
+ DOF_MAX_COF,
+ DOF_RES_SCALE,
+
+ DEFERRED_DEPTH,
+ DEFERRED_SHADOW0,
+ DEFERRED_SHADOW1,
+ DEFERRED_SHADOW2,
+ DEFERRED_SHADOW3,
+ DEFERRED_SHADOW4,
+ DEFERRED_SHADOW5,
+ DEFERRED_NORMAL,
+ DEFERRED_POSITION,
+ DEFERRED_DIFFUSE,
+ DEFERRED_SPECULAR,
+ DEFERRED_NOISE,
+ DEFERRED_LIGHTFUNC,
+ DEFERRED_LIGHT,
+ DEFERRED_BLOOM,
+ DEFERRED_PROJECTION,
+ END_RESERVED_UNIFORMS
+ } eGLSLReservedUniforms;
+
// singleton pattern implementation
static LLShaderMgr * instance();
+ virtual void initAttribsAndUniforms(void);
+
BOOL attachShaderFeatures(LLGLSLShader * shader);
void dumpObjectLog(GLhandleARB ret, BOOL warns = TRUE);
BOOL linkProgramObject(GLhandleARB obj, BOOL suppress_errors = FALSE);
diff --git a/indra/llrender/llvertexbuffer.cpp b/indra/llrender/llvertexbuffer.cpp
index 8fd1193780..eb302392bb 100644
--- a/indra/llrender/llvertexbuffer.cpp
+++ b/indra/llrender/llvertexbuffer.cpp
@@ -34,9 +34,21 @@
#include "llmemtype.h"
#include "llrender.h"
#include "llvector4a.h"
+#include "llshadermgr.h"
#include "llglslshader.h"
#include "llmemory.h"
+//Next Highest Power Of Two
+//helper function, returns first number > v that is a power of 2, or v if v is already a power of 2
+U32 nhpo2(U32 v)
+{
+ U32 r = 1;
+ while (r < v) {
+ r *= 2;
+ }
+ return r;
+}
+
//============================================================================
@@ -45,6 +57,7 @@ LLVBOPool LLVertexBuffer::sStreamVBOPool;
LLVBOPool LLVertexBuffer::sDynamicVBOPool;
LLVBOPool LLVertexBuffer::sStreamIBOPool;
LLVBOPool LLVertexBuffer::sDynamicIBOPool;
+U32 LLVBOPool::sBytesPooled = 0;
LLPrivateMemoryPool* LLVertexBuffer::sPrivatePoolp = NULL ;
U32 LLVertexBuffer::sBindCount = 0;
@@ -55,6 +68,7 @@ S32 LLVertexBuffer::sMappedCount = 0;
BOOL LLVertexBuffer::sDisableVBOMapping = FALSE ;
BOOL LLVertexBuffer::sEnableVBOs = TRUE;
U32 LLVertexBuffer::sGLRenderBuffer = 0;
+U32 LLVertexBuffer::sGLRenderArray = 0;
U32 LLVertexBuffer::sGLRenderIndices = 0;
U32 LLVertexBuffer::sLastMask = 0;
BOOL LLVertexBuffer::sVBOActive = FALSE;
@@ -62,11 +76,8 @@ BOOL LLVertexBuffer::sIBOActive = FALSE;
U32 LLVertexBuffer::sAllocatedBytes = 0;
BOOL LLVertexBuffer::sMapped = FALSE;
BOOL LLVertexBuffer::sUseStreamDraw = TRUE;
+BOOL LLVertexBuffer::sUseVAO = FALSE;
BOOL LLVertexBuffer::sPreferStreamDraw = FALSE;
-S32 LLVertexBuffer::sWeight4Loc = -1;
-
-std::vector<U32> LLVertexBuffer::sDeleteList;
-
const U32 FENCE_WAIT_TIME_NANOSECONDS = 10000; //1 ms
@@ -84,7 +95,7 @@ public:
#endif
}
- ~LLGLSyncFence()
+ virtual ~LLGLSyncFence()
{
#ifdef GL_ARB_sync
if (mSync)
@@ -122,6 +133,121 @@ public:
};
+
+//which power of 2 is i?
+//assumes i is a power of 2 > 0
+U32 wpo2(U32 i)
+{
+ llassert(i > 0);
+ llassert(nhpo2(i) == i);
+
+ U32 r = 0;
+
+ while (i >>= 1) ++r;
+
+ return r;
+}
+
+volatile U8* LLVBOPool::allocate(U32& name, U32 size)
+{
+ llassert(nhpo2(size) == size);
+
+ U32 i = wpo2(size);
+
+ if (mFreeList.size() <= i)
+ {
+ mFreeList.resize(i+1);
+ }
+
+ volatile U8* ret = NULL;
+
+ if (mFreeList[i].empty())
+ {
+ //make a new buffer
+ glGenBuffersARB(1, &name);
+ glBindBufferARB(mType, name);
+ LLVertexBuffer::sAllocatedBytes += size;
+
+ if (LLVertexBuffer::sDisableVBOMapping || mUsage != GL_DYNAMIC_DRAW_ARB)
+ {
+ glBufferDataARB(mType, size, 0, mUsage);
+ ret = (U8*) ll_aligned_malloc_16(size);
+ }
+ else
+ { //always use a true hint of static draw when allocating non-client-backed buffers
+ glBufferDataARB(mType, size, 0, GL_STATIC_DRAW_ARB);
+ }
+
+ glBindBufferARB(mType, 0);
+ }
+ else
+ {
+ name = mFreeList[i].front().mGLName;
+ ret = mFreeList[i].front().mClientData;
+
+ sBytesPooled -= size;
+
+ mFreeList[i].pop_front();
+ }
+
+ return ret;
+}
+
+void LLVBOPool::release(U32 name, volatile U8* buffer, U32 size)
+{
+ llassert(nhpo2(size) == size);
+
+ U32 i = wpo2(size);
+
+ llassert(mFreeList.size() > i);
+
+ Record rec;
+ rec.mGLName = name;
+ rec.mClientData = buffer;
+
+ sBytesPooled += size;
+
+ if (!LLVertexBuffer::sDisableVBOMapping && mUsage == GL_DYNAMIC_DRAW_ARB)
+ {
+ glDeleteBuffersARB(1, &rec.mGLName);
+ }
+ else
+ {
+ mFreeList[i].push_back(rec);
+ }
+}
+
+void LLVBOPool::cleanup()
+{
+ U32 size = 1;
+
+ for (U32 i = 0; i < mFreeList.size(); ++i)
+ {
+ record_list_t& l = mFreeList[i];
+
+ while (!l.empty())
+ {
+ Record& r = l.front();
+
+ glDeleteBuffersARB(1, &r.mGLName);
+
+ if (r.mClientData)
+ {
+ ll_aligned_free_16((void*) r.mClientData);
+ }
+
+ l.pop_front();
+
+ LLVertexBuffer::sAllocatedBytes -= size;
+ sBytesPooled -= size;
+ }
+
+ size *= 2;
+ }
+}
+
+
+//NOTE: each component must be AT LEAST 4 bytes in size to avoid a performance penalty on AMD hardware
S32 LLVertexBuffer::sTypeSize[LLVertexBuffer::TYPE_MAX] =
{
sizeof(LLVector4), // TYPE_VERTEX,
@@ -131,10 +257,12 @@ S32 LLVertexBuffer::sTypeSize[LLVertexBuffer::TYPE_MAX] =
sizeof(LLVector2), // TYPE_TEXCOORD2,
sizeof(LLVector2), // TYPE_TEXCOORD3,
sizeof(LLColor4U), // TYPE_COLOR,
+ sizeof(LLColor4U), // TYPE_EMISSIVE, only alpha is used currently
sizeof(LLVector4), // TYPE_BINORMAL,
sizeof(F32), // TYPE_WEIGHT,
sizeof(LLVector4), // TYPE_WEIGHT4,
sizeof(LLVector4), // TYPE_CLOTHWEIGHT,
+ sizeof(LLVector4), // TYPE_TEXTURE_INDEX (actually exists as position.w), no extra data, but stride is 16 bytes
};
U32 LLVertexBuffer::sGLMode[LLRender::NUM_MODES] =
@@ -149,146 +277,147 @@ U32 LLVertexBuffer::sGLMode[LLRender::NUM_MODES] =
GL_LINE_LOOP,
};
+
//static
void LLVertexBuffer::setupClientArrays(U32 data_mask)
{
- /*if (LLGLImmediate::sStarted)
- {
- llerrs << "Cannot use LLGLImmediate and LLVertexBuffer simultaneously!" << llendl;
- }*/
-
if (sLastMask != data_mask)
{
- U32 mask[] =
+ BOOL error = FALSE;
+
+ if (LLGLSLShader::sNoFixedFunction)
{
- MAP_VERTEX,
- MAP_NORMAL,
- MAP_TEXCOORD0,
- MAP_COLOR,
- };
-
- GLenum array[] =
+ for (U32 i = 0; i < TYPE_MAX; ++i)
+ {
+ S32 loc = i;
+
+ U32 mask = 1 << i;
+
+ if (sLastMask & (1 << i))
+ { //was enabled
+ if (!(data_mask & mask))
+ { //needs to be disabled
+ glDisableVertexAttribArrayARB(loc);
+ }
+ }
+ else
+ { //was disabled
+ if (data_mask & mask)
+ { //needs to be enabled
+ glEnableVertexAttribArrayARB(loc);
+ }
+ }
+ }
+ }
+ else
{
- GL_VERTEX_ARRAY,
- GL_NORMAL_ARRAY,
- GL_TEXTURE_COORD_ARRAY,
- GL_COLOR_ARRAY,
- };
- BOOL error = FALSE;
- for (U32 i = 0; i < 4; ++i)
- {
- if (sLastMask & mask[i])
- { //was enabled
- if (!(data_mask & mask[i]) && i > 0)
- { //needs to be disabled
- glDisableClientState(array[i]);
+ GLenum array[] =
+ {
+ GL_VERTEX_ARRAY,
+ GL_NORMAL_ARRAY,
+ GL_TEXTURE_COORD_ARRAY,
+ GL_COLOR_ARRAY,
+ };
+
+ GLenum mask[] =
+ {
+ MAP_VERTEX,
+ MAP_NORMAL,
+ MAP_TEXCOORD0,
+ MAP_COLOR
+ };
+
+
+
+ for (U32 i = 0; i < 4; ++i)
+ {
+ if (sLastMask & mask[i])
+ { //was enabled
+ if (!(data_mask & mask[i]))
+ { //needs to be disabled
+ glDisableClientState(array[i]);
+ }
+ else if (gDebugGL)
+ { //needs to be enabled, make sure it was (DEBUG)
+ if (!glIsEnabled(array[i]))
+ {
+ if (gDebugSession)
+ {
+ error = TRUE;
+ gFailLog << "Bad client state! " << array[i] << " disabled." << std::endl;
+ }
+ else
+ {
+ llerrs << "Bad client state! " << array[i] << " disabled." << llendl;
+ }
+ }
+ }
}
- else if (gDebugGL)
- { //needs to be enabled, make sure it was (DEBUG TEMPORARY)
- if (i > 0 && !glIsEnabled(array[i]))
- {
+ else
+ { //was disabled
+ if (data_mask & mask[i])
+ { //needs to be enabled
+ glEnableClientState(array[i]);
+ }
+ else if (gDebugGL && glIsEnabled(array[i]))
+ { //needs to be disabled, make sure it was (DEBUG TEMPORARY)
if (gDebugSession)
{
error = TRUE;
- gFailLog << "Bad client state! " << array[i] << " disabled." << std::endl;
+ gFailLog << "Bad client state! " << array[i] << " enabled." << std::endl;
}
else
{
- llerrs << "Bad client state! " << array[i] << " disabled." << llendl;
+ llerrs << "Bad client state! " << array[i] << " enabled." << llendl;
}
}
}
}
- else
- { //was disabled
- if (data_mask & mask[i] && i > 0)
- { //needs to be enabled
- glEnableClientState(array[i]);
- }
- else if (gDebugGL && i > 0 && glIsEnabled(array[i]))
- { //needs to be disabled, make sure it was (DEBUG TEMPORARY)
- if (gDebugSession)
- {
- error = TRUE;
- gFailLog << "Bad client state! " << array[i] << " enabled." << std::endl;
- }
- else
- {
- llerrs << "Bad client state! " << array[i] << " enabled." << llendl;
+
+ U32 map_tc[] =
+ {
+ MAP_TEXCOORD1,
+ MAP_TEXCOORD2,
+ MAP_TEXCOORD3
+ };
+
+ for (U32 i = 0; i < 3; i++)
+ {
+ if (sLastMask & map_tc[i])
+ {
+ if (!(data_mask & map_tc[i]))
+ { //disable
+ glClientActiveTextureARB(GL_TEXTURE1_ARB+i);
+ glDisableClientState(GL_TEXTURE_COORD_ARRAY);
+ glClientActiveTextureARB(GL_TEXTURE0_ARB);
}
}
+ else if (data_mask & map_tc[i])
+ {
+ glClientActiveTextureARB(GL_TEXTURE1_ARB+i);
+ glEnableClientState(GL_TEXTURE_COORD_ARRAY);
+ glClientActiveTextureARB(GL_TEXTURE0_ARB);
+ }
}
- }
-
- if (error)
- {
- ll_fail("LLVertexBuffer::setupClientArrays failed");
- }
- U32 map_tc[] =
- {
- MAP_TEXCOORD1,
- MAP_TEXCOORD2,
- MAP_TEXCOORD3
- };
-
- for (U32 i = 0; i < 3; i++)
- {
- if (sLastMask & map_tc[i])
+ if (sLastMask & MAP_BINORMAL)
{
- if (!(data_mask & map_tc[i]))
+ if (!(data_mask & MAP_BINORMAL))
{
- glClientActiveTextureARB(GL_TEXTURE1_ARB+i);
+ glClientActiveTextureARB(GL_TEXTURE2_ARB);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glClientActiveTextureARB(GL_TEXTURE0_ARB);
}
}
- else if (data_mask & map_tc[i])
- {
- glClientActiveTextureARB(GL_TEXTURE1_ARB+i);
- glEnableClientState(GL_TEXTURE_COORD_ARRAY);
- glClientActiveTextureARB(GL_TEXTURE0_ARB);
- }
- }
-
- if (sLastMask & MAP_BINORMAL)
- {
- if (!(data_mask & MAP_BINORMAL))
+ else if (data_mask & MAP_BINORMAL)
{
glClientActiveTextureARB(GL_TEXTURE2_ARB);
- glDisableClientState(GL_TEXTURE_COORD_ARRAY);
+ glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glClientActiveTextureARB(GL_TEXTURE0_ARB);
}
}
- else if (data_mask & MAP_BINORMAL)
- {
- glClientActiveTextureARB(GL_TEXTURE2_ARB);
- glEnableClientState(GL_TEXTURE_COORD_ARRAY);
- glClientActiveTextureARB(GL_TEXTURE0_ARB);
- }
-
- if (sLastMask & MAP_WEIGHT4)
- {
- if (sWeight4Loc < 0)
- {
- llerrs << "Weighting disabled but vertex buffer still bound!" << llendl;
- }
-
- if (!(data_mask & MAP_WEIGHT4))
- { //disable 4-component skin weight
- glDisableVertexAttribArrayARB(sWeight4Loc);
- }
- }
- else if (data_mask & MAP_WEIGHT4)
- {
- if (sWeight4Loc >= 0)
- { //enable 4-component skin weight
- glEnableVertexAttribArrayARB(sWeight4Loc);
- }
- }
-
sLastMask = data_mask;
}
}
@@ -296,6 +425,9 @@ void LLVertexBuffer::setupClientArrays(U32 data_mask)
//static
void LLVertexBuffer::drawArrays(U32 mode, const std::vector<LLVector3>& pos, const std::vector<LLVector3>& norm)
{
+ llassert(!LLGLSLShader::sNoFixedFunction || LLGLSLShader::sCurBoundShaderPtr != NULL);
+ gGL.syncMatrices();
+
U32 count = pos.size();
llassert_always(norm.size() >= pos.size());
llassert_always(count > 0) ;
@@ -304,24 +436,79 @@ void LLVertexBuffer::drawArrays(U32 mode, const std::vector<LLVector3>& pos, con
setupClientArrays(MAP_VERTEX | MAP_NORMAL);
- glVertexPointer(3, GL_FLOAT, 0, pos[0].mV);
- glNormalPointer(GL_FLOAT, 0, norm[0].mV);
+ LLGLSLShader* shader = LLGLSLShader::sCurBoundShaderPtr;
+
+ if (shader)
+ {
+ S32 loc = LLVertexBuffer::TYPE_VERTEX;
+ if (loc > -1)
+ {
+ glVertexAttribPointerARB(loc, 3, GL_FLOAT, GL_FALSE, 0, pos[0].mV);
+ }
+ loc = LLVertexBuffer::TYPE_NORMAL;
+ if (loc > -1)
+ {
+ glVertexAttribPointerARB(loc, 3, GL_FLOAT, GL_FALSE, 0, norm[0].mV);
+ }
+ }
+ else
+ {
+ glVertexPointer(3, GL_FLOAT, 0, pos[0].mV);
+ glNormalPointer(GL_FLOAT, 0, norm[0].mV);
+ }
glDrawArrays(sGLMode[mode], 0, count);
}
+//static
+void LLVertexBuffer::drawElements(U32 mode, const LLVector4a* pos, const LLVector2* tc, S32 num_indices, const U16* indicesp)
+{
+ llassert(!LLGLSLShader::sNoFixedFunction || LLGLSLShader::sCurBoundShaderPtr != NULL);
+
+ gGL.syncMatrices();
+
+ U32 mask = LLVertexBuffer::MAP_VERTEX;
+ if (tc)
+ {
+ mask = mask | LLVertexBuffer::MAP_TEXCOORD0;
+ }
+
+ unbind();
+
+ setupClientArrays(mask);
+
+ if (LLGLSLShader::sNoFixedFunction)
+ {
+ S32 loc = LLVertexBuffer::TYPE_VERTEX;
+ glVertexAttribPointerARB(loc, 3, GL_FLOAT, GL_FALSE, 16, pos);
+
+ if (tc)
+ {
+ loc = LLVertexBuffer::TYPE_TEXCOORD0;
+ glVertexAttribPointerARB(loc, 2, GL_FLOAT, GL_FALSE, 0, tc);
+ }
+ }
+ else
+ {
+ glTexCoordPointer(2, GL_FLOAT, 0, tc);
+ glVertexPointer(3, GL_FLOAT, 16, pos);
+ }
+
+ glDrawElements(sGLMode[mode], num_indices, GL_UNSIGNED_SHORT, indicesp);
+}
+
void LLVertexBuffer::validateRange(U32 start, U32 end, U32 count, U32 indices_offset) const
{
- if (start >= (U32) mRequestedNumVerts ||
- end >= (U32) mRequestedNumVerts)
+ if (start >= (U32) mNumVerts ||
+ end >= (U32) mNumVerts)
{
- llerrs << "Bad vertex buffer draw range: [" << start << ", " << end << "] vs " << mRequestedNumVerts << llendl;
+ llerrs << "Bad vertex buffer draw range: [" << start << ", " << end << "] vs " << mNumVerts << llendl;
}
- llassert(mRequestedNumIndices >= 0);
+ llassert(mNumIndices >= 0);
- if (indices_offset >= (U32) mRequestedNumIndices ||
- indices_offset + count > (U32) mRequestedNumIndices)
+ if (indices_offset >= (U32) mNumIndices ||
+ indices_offset + count > (U32) mNumIndices)
{
llerrs << "Bad index buffer draw range: [" << indices_offset << ", " << indices_offset+count << "]" << llendl;
}
@@ -336,23 +523,66 @@ void LLVertexBuffer::validateRange(U32 start, U32 end, U32 count, U32 indices_of
llerrs << "Index out of range: " << idx[i] << " not in [" << start << ", " << end << "]" << llendl;
}
}
+
+ LLGLSLShader* shader = LLGLSLShader::sCurBoundShaderPtr;
+
+ if (shader && shader->mFeatures.mIndexedTextureChannels > 1)
+ {
+ LLStrider<LLVector4a> v;
+ //hack to get non-const reference
+ LLVertexBuffer* vb = (LLVertexBuffer*) this;
+ vb->getVertexStrider(v);
+
+ for (U32 i = start; i < end; i++)
+ {
+ S32 idx = (S32) (v[i][3]+0.25f);
+ if (idx < 0 || idx >= shader->mFeatures.mIndexedTextureChannels)
+ {
+ llerrs << "Bad texture index found in vertex data stream." << llendl;
+ }
+ }
+ }
}
}
void LLVertexBuffer::drawRange(U32 mode, U32 start, U32 end, U32 count, U32 indices_offset) const
{
validateRange(start, end, count, indices_offset);
+ mMappable = FALSE;
+ gGL.syncMatrices();
- llassert(mRequestedNumVerts >= 0);
+ llassert(mNumVerts >= 0);
+ llassert(!LLGLSLShader::sNoFixedFunction || LLGLSLShader::sCurBoundShaderPtr != NULL);
- if (mGLIndices != sGLRenderIndices)
+ if (mGLArray)
{
- llerrs << "Wrong index buffer bound." << llendl;
+ if (mGLArray != sGLRenderArray)
+ {
+ llerrs << "Wrong vertex array bound." << llendl;
+ }
+ }
+ else
+ {
+ if (mGLIndices != sGLRenderIndices)
+ {
+ llerrs << "Wrong index buffer bound." << llendl;
+ }
+
+ if (mGLBuffer != sGLRenderBuffer)
+ {
+ llerrs << "Wrong vertex buffer bound." << llendl;
+ }
}
- if (mGLBuffer != sGLRenderBuffer)
+ if (gDebugGL && !mGLArray && useVBOs())
{
- llerrs << "Wrong vertex buffer bound." << llendl;
+ GLint elem = 0;
+ glGetIntegerv(GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB, &elem);
+
+ if (elem != mGLIndices)
+ {
+ llerrs << "Wrong index buffer bound!" << llendl;
+ }
}
if (mode >= LLRender::NUM_MODES)
@@ -372,21 +602,35 @@ void LLVertexBuffer::drawRange(U32 mode, U32 start, U32 end, U32 count, U32 indi
void LLVertexBuffer::draw(U32 mode, U32 count, U32 indices_offset) const
{
- llassert(mRequestedNumIndices >= 0);
- if (indices_offset >= (U32) mRequestedNumIndices ||
- indices_offset + count > (U32) mRequestedNumIndices)
+ llassert(!LLGLSLShader::sNoFixedFunction || LLGLSLShader::sCurBoundShaderPtr != NULL);
+ mMappable = FALSE;
+ gGL.syncMatrices();
+
+ llassert(mNumIndices >= 0);
+ if (indices_offset >= (U32) mNumIndices ||
+ indices_offset + count > (U32) mNumIndices)
{
llerrs << "Bad index buffer draw range: [" << indices_offset << ", " << indices_offset+count << "]" << llendl;
}
- if (mGLIndices != sGLRenderIndices)
+ if (mGLArray)
{
- llerrs << "Wrong index buffer bound." << llendl;
+ if (mGLArray != sGLRenderArray)
+ {
+ llerrs << "Wrong vertex array bound." << llendl;
+ }
}
-
- if (mGLBuffer != sGLRenderBuffer)
+ else
{
- llerrs << "Wrong vertex buffer bound." << llendl;
+ if (mGLIndices != sGLRenderIndices)
+ {
+ llerrs << "Wrong index buffer bound." << llendl;
+ }
+
+ if (mGLBuffer != sGLRenderBuffer)
+ {
+ llerrs << "Wrong vertex buffer bound." << llendl;
+ }
}
if (mode >= LLRender::NUM_MODES)
@@ -404,16 +648,30 @@ void LLVertexBuffer::draw(U32 mode, U32 count, U32 indices_offset) const
void LLVertexBuffer::drawArrays(U32 mode, U32 first, U32 count) const
{
- llassert(mRequestedNumVerts >= 0);
- if (first >= (U32) mRequestedNumVerts ||
- first + count > (U32) mRequestedNumVerts)
+ llassert(!LLGLSLShader::sNoFixedFunction || LLGLSLShader::sCurBoundShaderPtr != NULL);
+ mMappable = FALSE;
+ gGL.syncMatrices();
+
+ llassert(mNumVerts >= 0);
+ if (first >= (U32) mNumVerts ||
+ first + count > (U32) mNumVerts)
{
llerrs << "Bad vertex buffer draw range: [" << first << ", " << first+count << "]" << llendl;
}
- if (mGLBuffer != sGLRenderBuffer || useVBOs() != sVBOActive)
+ if (mGLArray)
+ {
+ if (mGLArray != sGLRenderArray)
+ {
+ llerrs << "Wrong vertex array bound." << llendl;
+ }
+ }
+ else
{
- llerrs << "Wrong vertex buffer bound." << llendl;
+ if (mGLBuffer != sGLRenderBuffer || useVBOs() != sVBOActive)
+ {
+ llerrs << "Wrong vertex buffer bound." << llendl;
+ }
}
if (mode >= LLRender::NUM_MODES)
@@ -432,28 +690,37 @@ void LLVertexBuffer::drawArrays(U32 mode, U32 first, U32 count) const
void LLVertexBuffer::initClass(bool use_vbo, bool no_vbo_mapping)
{
sEnableVBOs = use_vbo && gGLManager.mHasVertexBufferObject ;
- if(sEnableVBOs)
- {
- //llassert_always(glBindBufferARB) ; //double check the extention for VBO is loaded.
-
- llinfos << "VBO is enabled." << llendl ;
- }
- else
- {
- llinfos << "VBO is disabled." << llendl ;
- }
-
sDisableVBOMapping = sEnableVBOs && no_vbo_mapping ;
if(!sPrivatePoolp)
- {
+ {
sPrivatePoolp = LLPrivateMemoryPoolManager::getInstance()->newPool(LLPrivateMemoryPool::STATIC) ;
}
+
+ sStreamVBOPool.mType = GL_ARRAY_BUFFER_ARB;
+ sStreamVBOPool.mUsage= GL_STREAM_DRAW_ARB;
+ sStreamIBOPool.mType = GL_ELEMENT_ARRAY_BUFFER_ARB;
+ sStreamIBOPool.mUsage= GL_STREAM_DRAW_ARB;
+
+ sDynamicVBOPool.mType = GL_ARRAY_BUFFER_ARB;
+ sDynamicVBOPool.mUsage= GL_DYNAMIC_DRAW_ARB;
+ sDynamicIBOPool.mType = GL_ELEMENT_ARRAY_BUFFER_ARB;
+ sDynamicIBOPool.mUsage= GL_DYNAMIC_DRAW_ARB;
}
//static
void LLVertexBuffer::unbind()
{
+ if (sGLRenderArray)
+ {
+#if GL_ARB_vertex_array_object
+ glBindVertexArray(0);
+#endif
+ sGLRenderArray = 0;
+ sGLRenderIndices = 0;
+ sIBOActive = FALSE;
+ }
+
if (sVBOActive)
{
glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);
@@ -476,7 +743,11 @@ void LLVertexBuffer::cleanupClass()
{
LLMemType mt2(LLMemType::MTYPE_VERTEX_CLEANUP_CLASS);
unbind();
- clientCopy(); // deletes GL buffers
+
+ sStreamIBOPool.cleanup();
+ sDynamicIBOPool.cleanup();
+ sStreamVBOPool.cleanup();
+ sDynamicVBOPool.cleanup();
if(sPrivatePoolp)
{
@@ -485,15 +756,6 @@ void LLVertexBuffer::cleanupClass()
}
}
-void LLVertexBuffer::clientCopy(F64 max_time)
-{
- if (!sDeleteList.empty())
- {
- glDeleteBuffersARB(sDeleteList.size(), (GLuint*) &(sDeleteList[0]));
- sDeleteList.clear();
- }
-}
-
//----------------------------------------------------------------------------
LLVertexBuffer::LLVertexBuffer(U32 typemask, S32 usage) :
@@ -501,20 +763,16 @@ LLVertexBuffer::LLVertexBuffer(U32 typemask, S32 usage) :
mNumVerts(0),
mNumIndices(0),
- mRequestedNumVerts(-1),
- mRequestedNumIndices(-1),
mUsage(usage),
mGLBuffer(0),
+ mGLArray(0),
mGLIndices(0),
mMappedData(NULL),
mMappedIndexData(NULL),
mVertexLocked(FALSE),
mIndexLocked(FALSE),
mFinal(FALSE),
- mFilthy(FALSE),
mEmpty(TRUE),
- mResized(FALSE),
- mDynamicSize(FALSE),
mFence(NULL)
{
LLMemType mt2(LLMemType::MTYPE_VERTEX_CONSTRUCTOR);
@@ -534,6 +792,33 @@ LLVertexBuffer::LLVertexBuffer(U32 typemask, S32 usage) :
mUsage = GL_STREAM_DRAW_ARB;
}
+ if (mUsage == 0 && LLRender::sGLCoreProfile)
+ { //MUST use VBOs for all rendering
+ mUsage = GL_STREAM_DRAW_ARB;
+ }
+
+ if (mUsage && mUsage != GL_STREAM_DRAW_ARB)
+ { //only stream_draw and dynamic_draw are supported when using VBOs, dynamic draw is the default
+ if (sDisableVBOMapping)
+ { //always use stream draw if VBO mapping is disabled
+ mUsage = GL_STREAM_DRAW_ARB;
+ }
+ else
+ {
+ mUsage = GL_DYNAMIC_DRAW_ARB;
+ }
+ }
+
+
+ if (mUsage == GL_DYNAMIC_DRAW_ARB && !sDisableVBOMapping)
+ {
+ mMappable = TRUE;
+ }
+ else
+ {
+ mMappable = FALSE;
+ }
+
//zero out offsets
for (U32 i = 0; i < TYPE_MAX; i++)
{
@@ -542,6 +827,7 @@ LLVertexBuffer::LLVertexBuffer(U32 typemask, S32 usage) :
mTypeMask = typemask;
mSize = 0;
+ mIndicesSize = 0;
mAlignedOffset = 0;
mAlignedIndexOffset = 0;
@@ -552,12 +838,12 @@ LLVertexBuffer::LLVertexBuffer(U32 typemask, S32 usage) :
S32 LLVertexBuffer::calcOffsets(const U32& typemask, S32* offsets, S32 num_vertices)
{
S32 offset = 0;
- for (S32 i=0; i<TYPE_MAX; i++)
+ for (S32 i=0; i<TYPE_TEXTURE_INDEX; i++)
{
U32 mask = 1<<i;
if (typemask & mask)
{
- if (offsets)
+ if (offsets && LLVertexBuffer::sTypeSize[i])
{
offsets[i] = offset;
offset += LLVertexBuffer::sTypeSize[i]*num_vertices;
@@ -566,6 +852,8 @@ S32 LLVertexBuffer::calcOffsets(const U32& typemask, S32* offsets, S32 num_verti
}
}
+ offsets[TYPE_TEXTURE_INDEX] = offsets[TYPE_VERTEX] + 12;
+
return offset+16;
}
@@ -573,7 +861,7 @@ S32 LLVertexBuffer::calcOffsets(const U32& typemask, S32* offsets, S32 num_verti
S32 LLVertexBuffer::calcVertexSize(const U32& typemask)
{
S32 size = 0;
- for (S32 i = 0; i < TYPE_MAX; i++)
+ for (S32 i = 0; i < TYPE_TEXTURE_INDEX; i++)
{
U32 mask = 1<<i;
if (typemask & mask)
@@ -597,6 +885,14 @@ LLVertexBuffer::~LLVertexBuffer()
LLMemType mt2(LLMemType::MTYPE_VERTEX_DESTRUCTOR);
destroyGLBuffer();
destroyGLIndices();
+
+ if (mGLArray)
+ {
+#if GL_ARB_vertex_array_object
+ glDeleteVertexArrays(1, &mGLArray);
+#endif
+ }
+
sCount--;
if (mFence)
@@ -635,39 +931,35 @@ void LLVertexBuffer::waitFence() const
//----------------------------------------------------------------------------
-void LLVertexBuffer::genBuffer()
+void LLVertexBuffer::genBuffer(U32 size)
{
+ mSize = nhpo2(size);
+
if (mUsage == GL_STREAM_DRAW_ARB)
{
- mGLBuffer = sStreamVBOPool.allocate();
- }
- else if (mUsage == GL_DYNAMIC_DRAW_ARB)
- {
- mGLBuffer = sDynamicVBOPool.allocate();
+ mMappedData = sStreamVBOPool.allocate(mGLBuffer, mSize);
}
else
{
- BOOST_STATIC_ASSERT(sizeof(mGLBuffer) == sizeof(GLuint));
- glGenBuffersARB(1, (GLuint*)&mGLBuffer);
+ mMappedData = sDynamicVBOPool.allocate(mGLBuffer, mSize);
}
+
sGLCount++;
}
-void LLVertexBuffer::genIndices()
+void LLVertexBuffer::genIndices(U32 size)
{
+ mIndicesSize = nhpo2(size);
+
if (mUsage == GL_STREAM_DRAW_ARB)
{
- mGLIndices = sStreamIBOPool.allocate();
- }
- else if (mUsage == GL_DYNAMIC_DRAW_ARB)
- {
- mGLIndices = sDynamicIBOPool.allocate();
+ mMappedIndexData = sStreamIBOPool.allocate(mGLIndices, mIndicesSize);
}
else
{
- BOOST_STATIC_ASSERT(sizeof(mGLBuffer) == sizeof(GLuint));
- glGenBuffersARB(1, (GLuint*)&mGLIndices);
+ mMappedIndexData = sDynamicIBOPool.allocate(mGLIndices, mIndicesSize);
}
+
sGLCount++;
}
@@ -675,16 +967,16 @@ void LLVertexBuffer::releaseBuffer()
{
if (mUsage == GL_STREAM_DRAW_ARB)
{
- sStreamVBOPool.release(mGLBuffer);
- }
- else if (mUsage == GL_DYNAMIC_DRAW_ARB)
- {
- sDynamicVBOPool.release(mGLBuffer);
+ sStreamVBOPool.release(mGLBuffer, mMappedData, mSize);
}
else
{
- sDeleteList.push_back(mGLBuffer);
+ sDynamicVBOPool.release(mGLBuffer, mMappedData, mSize);
}
+
+ mGLBuffer = 0;
+ mMappedData = NULL;
+
sGLCount--;
}
@@ -692,24 +984,23 @@ void LLVertexBuffer::releaseIndices()
{
if (mUsage == GL_STREAM_DRAW_ARB)
{
- sStreamIBOPool.release(mGLIndices);
- }
- else if (mUsage == GL_DYNAMIC_DRAW_ARB)
- {
- sDynamicIBOPool.release(mGLIndices);
+ sStreamIBOPool.release(mGLIndices, mMappedIndexData, mIndicesSize);
}
else
{
- sDeleteList.push_back(mGLIndices);
+ sDynamicIBOPool.release(mGLIndices, mMappedIndexData, mIndicesSize);
}
+
+ mGLIndices = 0;
+ mMappedIndexData = NULL;
+
sGLCount--;
}
-void LLVertexBuffer::createGLBuffer()
+void LLVertexBuffer::createGLBuffer(U32 size)
{
LLMemType mt2(LLMemType::MTYPE_VERTEX_CREATE_VERTICES);
- U32 size = getSize();
if (mGLBuffer)
{
destroyGLBuffer();
@@ -724,23 +1015,21 @@ void LLVertexBuffer::createGLBuffer()
if (useVBOs())
{
- mMappedData = NULL;
- genBuffer();
- mResized = TRUE;
+ genBuffer(size);
}
else
{
static int gl_buffer_idx = 0;
mGLBuffer = ++gl_buffer_idx;
mMappedData = (U8*)ALLOCATE_MEM(sPrivatePoolp, size);
+ mSize = size;
}
}
-void LLVertexBuffer::createGLIndices()
+void LLVertexBuffer::createGLIndices(U32 size)
{
LLMemType mt2(LLMemType::MTYPE_VERTEX_CREATE_INDICES);
- U32 size = getIndicesSize();
-
+
if (mGLIndices)
{
destroyGLIndices();
@@ -760,15 +1049,14 @@ void LLVertexBuffer::createGLIndices()
{
//pad by another 16 bytes for VBO pointer adjustment
size += 16;
- mMappedIndexData = NULL;
- genIndices();
- mResized = TRUE;
+ genIndices(size);
}
else
{
mMappedIndexData = (U8*)ALLOCATE_MEM(sPrivatePoolp, size);
static int gl_buffer_idx = 0;
mGLIndices = ++gl_buffer_idx;
+ mIndicesSize = size;
}
}
@@ -779,22 +1067,14 @@ void LLVertexBuffer::destroyGLBuffer()
{
if (useVBOs())
{
- freeClientBuffer() ;
-
- if (mMappedData || mMappedIndexData)
- {
- llerrs << "Vertex buffer destroyed while mapped!" << llendl;
- }
releaseBuffer();
}
else
{
- FREE_MEM(sPrivatePoolp, mMappedData) ;
+ FREE_MEM(sPrivatePoolp, (void*) mMappedData) ;
mMappedData = NULL;
mEmpty = TRUE;
}
-
- sAllocatedBytes -= getSize();
}
mGLBuffer = 0;
@@ -808,22 +1088,14 @@ void LLVertexBuffer::destroyGLIndices()
{
if (useVBOs())
{
- freeClientBuffer() ;
-
- if (mMappedData || mMappedIndexData)
- {
- llerrs << "Vertex buffer destroyed while mapped." << llendl;
- }
releaseIndices();
}
else
{
- FREE_MEM(sPrivatePoolp, mMappedIndexData) ;
+ FREE_MEM(sPrivatePoolp, (void*) mMappedIndexData) ;
mMappedIndexData = NULL;
mEmpty = TRUE;
}
-
- sAllocatedBytes -= getIndicesSize();
}
mGLIndices = 0;
@@ -842,23 +1114,14 @@ void LLVertexBuffer::updateNumVerts(S32 nverts)
nverts = 65535;
}
- mRequestedNumVerts = nverts;
+ U32 needed_size = calcOffsets(mTypeMask, mOffsets, nverts);
- if (!mDynamicSize)
- {
- mNumVerts = nverts;
- }
- else if (mUsage == GL_STATIC_DRAW_ARB ||
- nverts > mNumVerts ||
- nverts < mNumVerts/2)
+ if (needed_size > mSize || needed_size <= mSize/2)
{
- if (mUsage != GL_STATIC_DRAW_ARB && nverts + nverts/4 <= 65535)
- {
- nverts += nverts/4;
- }
- mNumVerts = nverts;
+ createGLBuffer(needed_size);
}
- mSize = calcOffsets(mTypeMask, mOffsets, mNumVerts);
+
+ mNumVerts = nverts;
}
void LLVertexBuffer::updateNumIndices(S32 nindices)
@@ -867,28 +1130,22 @@ void LLVertexBuffer::updateNumIndices(S32 nindices)
llassert(nindices >= 0);
- mRequestedNumIndices = nindices;
- if (!mDynamicSize)
+ U32 needed_size = sizeof(U16) * nindices;
+
+ if (needed_size > mIndicesSize || needed_size <= mIndicesSize/2)
{
- mNumIndices = nindices;
+ createGLIndices(needed_size);
}
- else if (mUsage == GL_STATIC_DRAW_ARB ||
- nindices > mNumIndices ||
- nindices < mNumIndices/2)
- {
- if (mUsage != GL_STATIC_DRAW_ARB)
- {
- nindices += nindices/4;
- }
- mNumIndices = nindices;
- }
+ mNumIndices = nindices;
}
void LLVertexBuffer::allocateBuffer(S32 nverts, S32 nindices, bool create)
{
LLMemType mt2(LLMemType::MTYPE_VERTEX_ALLOCATE_BUFFER);
-
+
+ stop_glerror();
+
if (nverts < 0 || nindices < 0 ||
nverts > 65536)
{
@@ -898,96 +1155,127 @@ void LLVertexBuffer::allocateBuffer(S32 nverts, S32 nindices, bool create)
updateNumVerts(nverts);
updateNumIndices(nindices);
- if (mMappedData)
- {
- llerrs << "LLVertexBuffer::allocateBuffer() called redundantly." << llendl;
- }
if (create && (nverts || nindices))
{
- createGLBuffer();
- createGLIndices();
+ //actually allocate space for the vertex buffer if using VBO mapping
+ flush();
+
+ if (gGLManager.mHasVertexArrayObject && useVBOs() && (LLRender::sGLCoreProfile || sUseVAO))
+ {
+#if GL_ARB_vertex_array_object
+ glGenVertexArrays(1, &mGLArray);
+#endif
+ setupVertexArray();
+ }
}
-
- sAllocatedBytes += getSize() + getIndicesSize();
}
-void LLVertexBuffer::resizeBuffer(S32 newnverts, S32 newnindices)
-{
- llassert(newnverts >= 0);
- llassert(newnindices >= 0);
-
- mRequestedNumVerts = newnverts;
- mRequestedNumIndices = newnindices;
+static LLFastTimer::DeclareTimer FTM_SETUP_VERTEX_ARRAY("Setup VAO");
- LLMemType mt2(LLMemType::MTYPE_VERTEX_RESIZE_BUFFER);
- mDynamicSize = TRUE;
- if (mUsage == GL_STATIC_DRAW_ARB)
- { //always delete/allocate static buffers on resize
- destroyGLBuffer();
- destroyGLIndices();
- allocateBuffer(newnverts, newnindices, TRUE);
- mFinal = FALSE;
- }
- else if (newnverts > mNumVerts || newnindices > mNumIndices ||
- newnverts < mNumVerts/2 || newnindices < mNumIndices/2)
+void LLVertexBuffer::setupVertexArray()
+{
+ if (!mGLArray)
{
- sAllocatedBytes -= getSize() + getIndicesSize();
-
- updateNumVerts(newnverts);
- updateNumIndices(newnindices);
-
- S32 newsize = getSize();
- S32 new_index_size = getIndicesSize();
-
- sAllocatedBytes += newsize + new_index_size;
+ return;
+ }
- if (newsize)
- {
- if (!mGLBuffer)
- { //no buffer exists, create a new one
- createGLBuffer();
- }
- else
- {
- if (!useVBOs())
- {
- FREE_MEM(sPrivatePoolp, mMappedData);
- mMappedData = (U8*)ALLOCATE_MEM(sPrivatePoolp, newsize);
- }
- mResized = TRUE;
- }
- }
- else if (mGLBuffer)
- {
- destroyGLBuffer();
- }
-
- if (new_index_size)
+ LLFastTimer t(FTM_SETUP_VERTEX_ARRAY);
+#if GL_ARB_vertex_array_object
+ glBindVertexArray(mGLArray);
+#endif
+ sGLRenderArray = mGLArray;
+
+ U32 attrib_size[] =
+ {
+ 3, //TYPE_VERTEX,
+ 3, //TYPE_NORMAL,
+ 2, //TYPE_TEXCOORD0,
+ 2, //TYPE_TEXCOORD1,
+ 2, //TYPE_TEXCOORD2,
+ 2, //TYPE_TEXCOORD3,
+ 4, //TYPE_COLOR,
+ 4, //TYPE_EMISSIVE,
+ 3, //TYPE_BINORMAL,
+ 1, //TYPE_WEIGHT,
+ 4, //TYPE_WEIGHT4,
+ 4, //TYPE_CLOTHWEIGHT,
+ 1, //TYPE_TEXTURE_INDEX
+ };
+
+ U32 attrib_type[] =
+ {
+ GL_FLOAT, //TYPE_VERTEX,
+ GL_FLOAT, //TYPE_NORMAL,
+ GL_FLOAT, //TYPE_TEXCOORD0,
+ GL_FLOAT, //TYPE_TEXCOORD1,
+ GL_FLOAT, //TYPE_TEXCOORD2,
+ GL_FLOAT, //TYPE_TEXCOORD3,
+ GL_UNSIGNED_BYTE, //TYPE_COLOR,
+ GL_UNSIGNED_BYTE, //TYPE_EMISSIVE,
+ GL_FLOAT, //TYPE_BINORMAL,
+ GL_FLOAT, //TYPE_WEIGHT,
+ GL_FLOAT, //TYPE_WEIGHT4,
+ GL_FLOAT, //TYPE_CLOTHWEIGHT,
+ GL_FLOAT, //TYPE_TEXTURE_INDEX
+ };
+
+ U32 attrib_normalized[] =
+ {
+ GL_FALSE, //TYPE_VERTEX,
+ GL_FALSE, //TYPE_NORMAL,
+ GL_FALSE, //TYPE_TEXCOORD0,
+ GL_FALSE, //TYPE_TEXCOORD1,
+ GL_FALSE, //TYPE_TEXCOORD2,
+ GL_FALSE, //TYPE_TEXCOORD3,
+ GL_TRUE, //TYPE_COLOR,
+ GL_TRUE, //TYPE_EMISSIVE,
+ GL_FALSE, //TYPE_BINORMAL,
+ GL_FALSE, //TYPE_WEIGHT,
+ GL_FALSE, //TYPE_WEIGHT4,
+ GL_FALSE, //TYPE_CLOTHWEIGHT,
+ GL_FALSE, //TYPE_TEXTURE_INDEX
+ };
+
+ bindGLBuffer(true);
+ bindGLIndices(true);
+
+ for (U32 i = 0; i < TYPE_MAX; ++i)
+ {
+ if (mTypeMask & (1 << i))
{
- if (!mGLIndices)
- {
- createGLIndices();
- }
- else
- {
- if (!useVBOs())
- {
- FREE_MEM(sPrivatePoolp, mMappedIndexData) ;
- mMappedIndexData = (U8*)ALLOCATE_MEM(sPrivatePoolp, new_index_size);
- }
- mResized = TRUE;
- }
+ glEnableVertexAttribArrayARB(i);
+ glVertexAttribPointerARB(i, attrib_size[i], attrib_type[i], attrib_normalized[i], sTypeSize[i], (void*) mOffsets[i]);
}
- else if (mGLIndices)
+ else
{
- destroyGLIndices();
+ glDisableVertexAttribArrayARB(i);
}
}
- if (mResized && useVBOs())
+ //draw a dummy triangle to set index array pointer
+ //glDrawElements(GL_TRIANGLES, 0, GL_UNSIGNED_SHORT, NULL);
+
+ unbind();
+}
+
+void LLVertexBuffer::resizeBuffer(S32 newnverts, S32 newnindices)
+{
+ llassert(newnverts >= 0);
+ llassert(newnindices >= 0);
+
+ LLMemType mt2(LLMemType::MTYPE_VERTEX_RESIZE_BUFFER);
+
+ updateNumVerts(newnverts);
+ updateNumIndices(newnindices);
+
+ if (useVBOs())
{
- freeClientBuffer() ;
- setBuffer(0);
+ flush();
+
+ if (mGLArray)
+ { //if size changed, offsets changed
+ setupVertexArray();
+ }
}
}
@@ -1004,32 +1292,6 @@ BOOL LLVertexBuffer::useVBOs() const
}
//----------------------------------------------------------------------------
-void LLVertexBuffer::freeClientBuffer()
-{
- if(useVBOs() && sDisableVBOMapping && (mMappedData || mMappedIndexData))
- {
- FREE_MEM(sPrivatePoolp, mMappedData) ;
- FREE_MEM(sPrivatePoolp, mMappedIndexData) ;
- mMappedData = NULL ;
- mMappedIndexData = NULL ;
- }
-}
-
-void LLVertexBuffer::allocateClientVertexBuffer()
-{
- if(!mMappedData)
- {
- mMappedData = (U8*)ALLOCATE_MEM(sPrivatePoolp, getSize());
- }
-}
-
-void LLVertexBuffer::allocateClientIndexBuffer()
-{
- if(!mMappedIndexData)
- {
- mMappedIndexData = (U8*)ALLOCATE_MEM(sPrivatePoolp, getIndicesSize());
- }
-}
bool expand_region(LLVertexBuffer::MappedRegion& region, S32 index, S32 count)
{
@@ -1049,9 +1311,13 @@ bool expand_region(LLVertexBuffer::MappedRegion& region, S32 index, S32 count)
return true;
}
+static LLFastTimer::DeclareTimer FTM_VBO_MAP_BUFFER_RANGE("VBO Map Range");
+static LLFastTimer::DeclareTimer FTM_VBO_MAP_BUFFER("VBO Map");
+
// Map for data access
-U8* LLVertexBuffer::mapVertexBuffer(S32 type, S32 index, S32 count, bool map_range)
+volatile U8* LLVertexBuffer::mapVertexBuffer(S32 type, S32 index, S32 count, bool map_range)
{
+ bindGLBuffer(true);
LLMemType mt2(LLMemType::MTYPE_VERTEX_MAP_BUFFER);
if (mFinal)
{
@@ -1064,7 +1330,7 @@ U8* LLVertexBuffer::mapVertexBuffer(S32 type, S32 index, S32 count, bool map_ran
if (useVBOs())
{
- if (sDisableVBOMapping || gGLManager.mHasMapBufferRange || gGLManager.mHasFlushBufferRange)
+ if (!mMappable || gGLManager.mHasMapBufferRange || gGLManager.mHasFlushBufferRange)
{
if (count == -1)
{
@@ -1089,7 +1355,7 @@ U8* LLVertexBuffer::mapVertexBuffer(S32 type, S32 index, S32 count, bool map_ran
if (!mapped)
{
//not already mapped, map new region
- MappedRegion region(type, !sDisableVBOMapping && map_range ? -1 : index, count);
+ MappedRegion region(type, mMappable && map_range ? -1 : index, count);
mMappedVertexRegions.push_back(region);
}
}
@@ -1102,25 +1368,24 @@ U8* LLVertexBuffer::mapVertexBuffer(S32 type, S32 index, S32 count, bool map_ran
if (!mVertexLocked)
{
LLMemType mt_v(LLMemType::MTYPE_VERTEX_MAP_BUFFER_VERTICES);
- setBuffer(0, type);
mVertexLocked = TRUE;
sMappedCount++;
stop_glerror();
- if(sDisableVBOMapping)
+ if(!mMappable)
{
map_range = false;
- allocateClientVertexBuffer() ;
}
else
{
- U8* src = NULL;
+ volatile U8* src = NULL;
waitFence();
if (gGLManager.mHasMapBufferRange)
{
if (map_range)
{
#ifdef GL_ARB_map_buffer_range
+ LLFastTimer t(FTM_VBO_MAP_BUFFER_RANGE);
S32 offset = mOffsets[type] + sTypeSize[type]*index;
S32 length = (sTypeSize[type]*count+0xF) & ~0xF;
src = (U8*) glMapBufferRange(GL_ARRAY_BUFFER_ARB, offset, length,
@@ -1132,6 +1397,19 @@ U8* LLVertexBuffer::mapVertexBuffer(S32 type, S32 index, S32 count, bool map_ran
else
{
#ifdef GL_ARB_map_buffer_range
+
+ if (gDebugGL)
+ {
+ GLint size = 0;
+ glGetBufferParameterivARB(GL_ARRAY_BUFFER_ARB, GL_BUFFER_SIZE_ARB, &size);
+
+ if (size < mSize)
+ {
+ llerrs << "Invalid buffer size." << llendl;
+ }
+ }
+
+ LLFastTimer t(FTM_VBO_MAP_BUFFER);
src = (U8*) glMapBufferRange(GL_ARRAY_BUFFER_ARB, 0, mSize,
GL_MAP_WRITE_BIT |
GL_MAP_FLUSH_EXPLICIT_BIT);
@@ -1159,7 +1437,7 @@ U8* LLVertexBuffer::mapVertexBuffer(S32 type, S32 index, S32 count, bool map_ran
llassert(src != NULL);
- mMappedData = LL_NEXT_ALIGNED_ADDRESS<U8>(src);
+ mMappedData = LL_NEXT_ALIGNED_ADDRESS<volatile U8>(src);
mAlignedOffset = mMappedData - src;
stop_glerror();
@@ -1172,7 +1450,7 @@ U8* LLVertexBuffer::mapVertexBuffer(S32 type, S32 index, S32 count, bool map_ran
//check the availability of memory
LLMemory::logMemoryInfo(TRUE) ;
- if(!sDisableVBOMapping)
+ if(mMappable)
{
//--------------------
//print out more debug info before crash
@@ -1204,7 +1482,7 @@ U8* LLVertexBuffer::mapVertexBuffer(S32 type, S32 index, S32 count, bool map_ran
map_range = false;
}
- if (map_range && gGLManager.mHasMapBufferRange && !sDisableVBOMapping)
+ if (map_range && gGLManager.mHasMapBufferRange && mMappable)
{
return mMappedData;
}
@@ -1214,9 +1492,14 @@ U8* LLVertexBuffer::mapVertexBuffer(S32 type, S32 index, S32 count, bool map_ran
}
}
-U8* LLVertexBuffer::mapIndexBuffer(S32 index, S32 count, bool map_range)
+
+static LLFastTimer::DeclareTimer FTM_VBO_MAP_INDEX_RANGE("IBO Map Range");
+static LLFastTimer::DeclareTimer FTM_VBO_MAP_INDEX("IBO Map");
+
+volatile U8* LLVertexBuffer::mapIndexBuffer(S32 index, S32 count, bool map_range)
{
LLMemType mt2(LLMemType::MTYPE_VERTEX_MAP_BUFFER);
+ bindGLIndices(true);
if (mFinal)
{
llerrs << "LLVertexBuffer::mapIndexBuffer() called on a finalized buffer." << llendl;
@@ -1228,7 +1511,7 @@ U8* LLVertexBuffer::mapIndexBuffer(S32 index, S32 count, bool map_range)
if (useVBOs())
{
- if (sDisableVBOMapping || gGLManager.mHasMapBufferRange || gGLManager.mHasFlushBufferRange)
+ if (!mMappable || gGLManager.mHasMapBufferRange || gGLManager.mHasFlushBufferRange)
{
if (count == -1)
{
@@ -1250,7 +1533,7 @@ U8* LLVertexBuffer::mapIndexBuffer(S32 index, S32 count, bool map_range)
if (!mapped)
{
//not already mapped, map new region
- MappedRegion region(TYPE_INDEX, !sDisableVBOMapping && map_range ? -1 : index, count);
+ MappedRegion region(TYPE_INDEX, mMappable && map_range ? -1 : index, count);
mMappedIndexRegions.push_back(region);
}
}
@@ -1264,25 +1547,35 @@ U8* LLVertexBuffer::mapIndexBuffer(S32 index, S32 count, bool map_range)
{
LLMemType mt_v(LLMemType::MTYPE_VERTEX_MAP_BUFFER_INDICES);
- setBuffer(0, TYPE_INDEX);
mIndexLocked = TRUE;
sMappedCount++;
stop_glerror();
- if(sDisableVBOMapping)
+ if (gDebugGL && useVBOs())
+ {
+ GLint elem = 0;
+ glGetIntegerv(GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB, &elem);
+
+ if (elem != mGLIndices)
+ {
+ llerrs << "Wrong index buffer bound!" << llendl;
+ }
+ }
+
+ if(!mMappable)
{
map_range = false;
- allocateClientIndexBuffer() ;
}
else
{
- U8* src = NULL;
+ volatile U8* src = NULL;
waitFence();
if (gGLManager.mHasMapBufferRange)
{
if (map_range)
{
#ifdef GL_ARB_map_buffer_range
+ LLFastTimer t(FTM_VBO_MAP_INDEX_RANGE);
S32 offset = sizeof(U16)*index;
S32 length = sizeof(U16)*count;
src = (U8*) glMapBufferRange(GL_ELEMENT_ARRAY_BUFFER_ARB, offset, length,
@@ -1294,6 +1587,7 @@ U8* LLVertexBuffer::mapIndexBuffer(S32 index, S32 count, bool map_range)
else
{
#ifdef GL_ARB_map_buffer_range
+ LLFastTimer t(FTM_VBO_MAP_INDEX);
src = (U8*) glMapBufferRange(GL_ELEMENT_ARRAY_BUFFER_ARB, 0, sizeof(U16)*mNumIndices,
GL_MAP_WRITE_BIT |
GL_MAP_FLUSH_EXPLICIT_BIT);
@@ -1315,6 +1609,7 @@ U8* LLVertexBuffer::mapIndexBuffer(S32 index, S32 count, bool map_range)
}
else
{
+ LLFastTimer t(FTM_VBO_MAP_INDEX);
map_range = false;
src = (U8*) glMapBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, GL_WRITE_ONLY_ARB);
}
@@ -1333,7 +1628,7 @@ U8* LLVertexBuffer::mapIndexBuffer(S32 index, S32 count, bool map_range)
log_glerror();
LLMemory::logMemoryInfo(TRUE) ;
- if(!sDisableVBOMapping)
+ if(mMappable)
{
GLint buff;
glGetIntegerv(GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB, &buff);
@@ -1355,7 +1650,7 @@ U8* LLVertexBuffer::mapIndexBuffer(S32 index, S32 count, bool map_range)
map_range = false;
}
- if (map_range && gGLManager.mHasMapBufferRange && !sDisableVBOMapping)
+ if (map_range && gGLManager.mHasMapBufferRange && mMappable)
{
return mMappedIndexData;
}
@@ -1365,21 +1660,30 @@ U8* LLVertexBuffer::mapIndexBuffer(S32 index, S32 count, bool map_range)
}
}
-void LLVertexBuffer::unmapBuffer(S32 type)
+static LLFastTimer::DeclareTimer FTM_VBO_UNMAP("VBO Unmap");
+static LLFastTimer::DeclareTimer FTM_VBO_FLUSH_RANGE("Flush VBO Range");
+
+
+static LLFastTimer::DeclareTimer FTM_IBO_UNMAP("IBO Unmap");
+static LLFastTimer::DeclareTimer FTM_IBO_FLUSH_RANGE("Flush IBO Range");
+
+void LLVertexBuffer::unmapBuffer()
{
LLMemType mt2(LLMemType::MTYPE_VERTEX_UNMAP_BUFFER);
- if (!useVBOs() || type == -2)
+ if (!useVBOs())
{
return ; //nothing to unmap
}
bool updated_all = false ;
- if (mMappedData && mVertexLocked && type != TYPE_INDEX)
+ if (mMappedData && mVertexLocked)
{
- updated_all = (mIndexLocked && type < 0) ; //both vertex and index buffers done updating
+ LLFastTimer t(FTM_VBO_UNMAP);
+ bindGLBuffer(true);
+ updated_all = mIndexLocked; //both vertex and index buffers done updating
- if(sDisableVBOMapping)
+ if(!mMappable)
{
if (!mMappedVertexRegions.empty())
{
@@ -1389,7 +1693,7 @@ void LLVertexBuffer::unmapBuffer(S32 type)
const MappedRegion& region = mMappedVertexRegions[i];
S32 offset = region.mIndex >= 0 ? mOffsets[region.mType]+sTypeSize[region.mType]*region.mIndex : 0;
S32 length = sTypeSize[region.mType]*region.mCount;
- glBufferSubDataARB(GL_ARRAY_BUFFER_ARB, offset, length, mMappedData+offset);
+ glBufferSubDataARB(GL_ARRAY_BUFFER_ARB, offset, length, (U8*) mMappedData+offset);
stop_glerror();
}
@@ -1398,7 +1702,7 @@ void LLVertexBuffer::unmapBuffer(S32 type)
else
{
stop_glerror();
- glBufferSubDataARB(GL_ARRAY_BUFFER_ARB, 0, getSize(), mMappedData);
+ glBufferSubDataARB(GL_ARRAY_BUFFER_ARB, 0, getSize(), (U8*) mMappedData);
stop_glerror();
}
}
@@ -1416,6 +1720,7 @@ void LLVertexBuffer::unmapBuffer(S32 type)
S32 length = sTypeSize[region.mType]*region.mCount;
if (gGLManager.mHasMapBufferRange)
{
+ LLFastTimer t(FTM_VBO_FLUSH_RANGE);
#ifdef GL_ARB_map_buffer_range
glFlushMappedBufferRange(GL_ARRAY_BUFFER_ARB, offset, length);
#endif
@@ -1441,9 +1746,11 @@ void LLVertexBuffer::unmapBuffer(S32 type)
sMappedCount--;
}
- if (mMappedIndexData && mIndexLocked && (type < 0 || type == TYPE_INDEX))
+ if (mMappedIndexData && mIndexLocked)
{
- if(sDisableVBOMapping)
+ LLFastTimer t(FTM_IBO_UNMAP);
+ bindGLIndices();
+ if(!mMappable)
{
if (!mMappedIndexRegions.empty())
{
@@ -1452,7 +1759,7 @@ void LLVertexBuffer::unmapBuffer(S32 type)
const MappedRegion& region = mMappedIndexRegions[i];
S32 offset = region.mIndex >= 0 ? sizeof(U16)*region.mIndex : 0;
S32 length = sizeof(U16)*region.mCount;
- glBufferSubDataARB(GL_ELEMENT_ARRAY_BUFFER_ARB, offset, length, mMappedIndexData+offset);
+ glBufferSubDataARB(GL_ELEMENT_ARRAY_BUFFER_ARB, offset, length, (U8*) mMappedIndexData+offset);
stop_glerror();
}
@@ -1461,7 +1768,7 @@ void LLVertexBuffer::unmapBuffer(S32 type)
else
{
stop_glerror();
- glBufferSubDataARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 0, getIndicesSize(), mMappedIndexData);
+ glBufferSubDataARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 0, getIndicesSize(), (U8*) mMappedIndexData);
stop_glerror();
}
}
@@ -1478,6 +1785,7 @@ void LLVertexBuffer::unmapBuffer(S32 type)
S32 length = sizeof(U16)*region.mCount;
if (gGLManager.mHasMapBufferRange)
{
+ LLFastTimer t(FTM_IBO_FLUSH_RANGE);
#ifdef GL_ARB_map_buffer_range
glFlushMappedBufferRange(GL_ELEMENT_ARRAY_BUFFER_ARB, offset, length);
#endif
@@ -1507,21 +1815,7 @@ void LLVertexBuffer::unmapBuffer(S32 type)
if(updated_all)
{
- if(mUsage == GL_STATIC_DRAW_ARB)
- {
- //static draw buffers can only be mapped a single time
- //throw out client data (we won't be using it again)
- mEmpty = TRUE;
- mFinal = TRUE;
- if(sDisableVBOMapping)
- {
- freeClientBuffer() ;
- }
- }
- else
- {
- mEmpty = FALSE;
- }
+ mEmpty = FALSE;
}
}
@@ -1536,7 +1830,7 @@ template <class T,S32 type> struct VertexBufferStrider
{
if (type == LLVertexBuffer::TYPE_INDEX)
{
- U8* ptr = vbo.mapIndexBuffer(index, count, map_range);
+ volatile U8* ptr = vbo.mapIndexBuffer(index, count, map_range);
if (ptr == NULL)
{
@@ -1552,7 +1846,7 @@ template <class T,S32 type> struct VertexBufferStrider
{
S32 stride = LLVertexBuffer::sTypeSize[type];
- U8* ptr = vbo.mapVertexBuffer(type, index, count, map_range);
+ volatile U8* ptr = vbo.mapVertexBuffer(type, index, count, map_range);
if (ptr == NULL)
{
@@ -1576,6 +1870,10 @@ bool LLVertexBuffer::getVertexStrider(LLStrider<LLVector3>& strider, S32 index,
{
return VertexBufferStrider<LLVector3,TYPE_VERTEX>::get(*this, strider, index, count, map_range);
}
+bool LLVertexBuffer::getVertexStrider(LLStrider<LLVector4a>& strider, S32 index, S32 count, bool map_range)
+{
+ return VertexBufferStrider<LLVector4a,TYPE_VERTEX>::get(*this, strider, index, count, map_range);
+}
bool LLVertexBuffer::getIndexStrider(LLStrider<U16>& strider, S32 index, S32 count, bool map_range)
{
return VertexBufferStrider<U16,TYPE_INDEX>::get(*this, strider, index, count, map_range);
@@ -1601,6 +1899,10 @@ bool LLVertexBuffer::getColorStrider(LLStrider<LLColor4U>& strider, S32 index, S
{
return VertexBufferStrider<LLColor4U,TYPE_COLOR>::get(*this, strider, index, count, map_range);
}
+bool LLVertexBuffer::getEmissiveStrider(LLStrider<LLColor4U>& strider, S32 index, S32 count, bool map_range)
+{
+ return VertexBufferStrider<LLColor4U,TYPE_EMISSIVE>::get(*this, strider, index, count, map_range);
+}
bool LLVertexBuffer::getWeightStrider(LLStrider<F32>& strider, S32 index, S32 count, bool map_range)
{
return VertexBufferStrider<F32,TYPE_WEIGHT>::get(*this, strider, index, count, map_range);
@@ -1618,43 +1920,151 @@ bool LLVertexBuffer::getClothWeightStrider(LLStrider<LLVector4>& strider, S32 in
//----------------------------------------------------------------------------
+static LLFastTimer::DeclareTimer FTM_BIND_GL_ARRAY("Bind Array");
+bool LLVertexBuffer::bindGLArray()
+{
+ if (mGLArray && sGLRenderArray != mGLArray)
+ {
+ {
+ LLFastTimer t(FTM_BIND_GL_ARRAY);
+#if GL_ARB_vertex_array_object
+ glBindVertexArray(mGLArray);
+#endif
+ sGLRenderArray = mGLArray;
+ }
+
+ //really shouldn't be necessary, but some drivers don't properly restore the
+ //state of GL_ELEMENT_ARRAY_BUFFER_BINDING
+ bindGLIndices();
+
+ return true;
+ }
+
+ return false;
+}
+
+static LLFastTimer::DeclareTimer FTM_BIND_GL_BUFFER("Bind Buffer");
+
+bool LLVertexBuffer::bindGLBuffer(bool force_bind)
+{
+ bindGLArray();
+
+ bool ret = false;
+
+ if (useVBOs() && (force_bind || (mGLBuffer && (mGLBuffer != sGLRenderBuffer || !sVBOActive))))
+ {
+ LLFastTimer t(FTM_BIND_GL_BUFFER);
+ /*if (sMapped)
+ {
+ llerrs << "VBO bound while another VBO mapped!" << llendl;
+ }*/
+ glBindBufferARB(GL_ARRAY_BUFFER_ARB, mGLBuffer);
+ sGLRenderBuffer = mGLBuffer;
+ sBindCount++;
+ sVBOActive = TRUE;
+
+ if (mGLArray)
+ {
+ llassert(sGLRenderArray == mGLArray);
+ //mCachedRenderBuffer = mGLBuffer;
+ }
+
+ ret = true;
+ }
+
+ return ret;
+}
+
+static LLFastTimer::DeclareTimer FTM_BIND_GL_INDICES("Bind Indices");
+
+bool LLVertexBuffer::bindGLIndices(bool force_bind)
+{
+ bindGLArray();
+
+ bool ret = false;
+ if (useVBOs() && (force_bind || (mGLIndices && (mGLIndices != sGLRenderIndices || !sIBOActive))))
+ {
+ LLFastTimer t(FTM_BIND_GL_INDICES);
+ /*if (sMapped)
+ {
+ llerrs << "VBO bound while another VBO mapped!" << llendl;
+ }*/
+ glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, mGLIndices);
+ sGLRenderIndices = mGLIndices;
+ stop_glerror();
+ sBindCount++;
+ sIBOActive = TRUE;
+ ret = true;
+ }
+
+ return ret;
+}
+
+void LLVertexBuffer::flush()
+{
+ if (useVBOs())
+ {
+ unmapBuffer();
+ }
+}
+
// Set for rendering
-void LLVertexBuffer::setBuffer(U32 data_mask, S32 type)
+void LLVertexBuffer::setBuffer(U32 data_mask)
{
+ flush();
+
LLMemType mt2(LLMemType::MTYPE_VERTEX_SET_BUFFER);
//set up pointers if the data mask is different ...
BOOL setup = (sLastMask != data_mask);
+ if (gDebugGL && data_mask != 0)
+ { //make sure data requirements are fulfilled
+ LLGLSLShader* shader = LLGLSLShader::sCurBoundShaderPtr;
+ if (shader)
+ {
+ U32 required_mask = 0;
+ for (U32 i = 0; i < LLVertexBuffer::TYPE_TEXTURE_INDEX; ++i)
+ {
+ if (shader->getAttribLocation(i) > -1)
+ {
+ U32 required = 1 << i;
+ if ((data_mask & required) == 0)
+ {
+ llwarns << "Missing attribute: " << LLShaderMgr::instance()->mReservedAttribs[i] << llendl;
+ }
+
+ required_mask |= required;
+ }
+ }
+
+ if ((data_mask & required_mask) != required_mask)
+ {
+ llerrs << "Shader consumption mismatches data provision." << llendl;
+ }
+ }
+ }
+
if (useVBOs())
{
- if (mGLBuffer && (mGLBuffer != sGLRenderBuffer || !sVBOActive))
+ if (mGLArray)
{
- /*if (sMapped)
- {
- llerrs << "VBO bound while another VBO mapped!" << llendl;
- }*/
- stop_glerror();
- glBindBufferARB(GL_ARRAY_BUFFER_ARB, mGLBuffer);
- stop_glerror();
- sBindCount++;
- sVBOActive = TRUE;
- setup = TRUE; // ... or the bound buffer changed
+ bindGLArray();
+ setup = FALSE; //do NOT perform pointer setup if using VAO
}
- if (mGLIndices && (mGLIndices != sGLRenderIndices || !sIBOActive))
+ else
{
- /*if (sMapped)
+ if (bindGLBuffer())
{
- llerrs << "VBO bound while another VBO mapped!" << llendl;
- }*/
- stop_glerror();
- glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, mGLIndices);
- stop_glerror();
- sBindCount++;
- sIBOActive = TRUE;
+ setup = TRUE;
+ }
+ if (bindGLIndices())
+ {
+ setup = TRUE;
+ }
}
-
+
BOOL error = FALSE;
- if (gDebugGL)
+ if (gDebugGL && !mGLArray)
{
GLint buff;
glGetIntegerv(GL_ARRAY_BUFFER_BINDING_ARB, &buff);
@@ -1689,81 +2099,20 @@ void LLVertexBuffer::setBuffer(U32 data_mask, S32 type)
}
}
- if (mResized)
+
+ }
+ else
+ {
+ if (sGLRenderArray)
{
- if (gDebugGL)
- {
- GLint buff;
- glGetIntegerv(GL_ARRAY_BUFFER_BINDING_ARB, &buff);
- if ((GLuint)buff != mGLBuffer)
- {
- if (gDebugSession)
- {
- error = TRUE;
- gFailLog << "Invalid GL vertex buffer bound: " << std::endl;
- }
- else
- {
- llerrs << "Invalid GL vertex buffer bound: " << buff << llendl;
- }
- }
-
- if (mGLIndices != 0)
- {
- glGetIntegerv(GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB, &buff);
- if ((GLuint)buff != mGLIndices)
- {
- if (gDebugSession)
- {
- error = TRUE;
- gFailLog << "Invalid GL index buffer bound: "<< std::endl;
- }
- else
- {
- llerrs << "Invalid GL index buffer bound: " << buff << llendl;
- }
- }
- }
- }
-
- if (mGLBuffer)
- {
- stop_glerror();
- glBufferDataARB(GL_ARRAY_BUFFER_ARB, getSize(), NULL, mUsage);
- stop_glerror();
- }
- if (mGLIndices)
- {
- stop_glerror();
- glBufferDataARB(GL_ELEMENT_ARRAY_BUFFER_ARB, getIndicesSize(), NULL, mUsage);
- stop_glerror();
- }
-
- mEmpty = TRUE;
- mResized = FALSE;
-
- if (data_mask != 0)
- {
- if (gDebugSession)
- {
- error = TRUE;
- gFailLog << "Buffer set for rendering before being filled after resize." << std::endl;
- }
- else
- {
- llerrs << "Buffer set for rendering before being filled after resize." << llendl;
- }
- }
+#if GL_ARB_vertex_array_object
+ glBindVertexArray(0);
+#endif
+ sGLRenderArray = 0;
+ sGLRenderIndices = 0;
+ sIBOActive = FALSE;
}
- if (error)
- {
- ll_fail("LLVertexBuffer::mapBuffer failed");
- }
- unmapBuffer(type);
- }
- else
- {
if (mGLBuffer)
{
if (sVBOActive)
@@ -1775,30 +2124,30 @@ void LLVertexBuffer::setBuffer(U32 data_mask, S32 type)
}
if (sGLRenderBuffer != mGLBuffer)
{
+ sGLRenderBuffer = mGLBuffer;
setup = TRUE; // ... or a client memory pointer changed
}
}
- if (mGLIndices && sIBOActive)
+ if (mGLIndices)
{
- /*if (sMapped)
+ if (sIBOActive)
{
- llerrs << "VBO unbound while potentially mapped!" << llendl;
- }*/
- glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 0);
- sBindCount++;
- sIBOActive = FALSE;
+ glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 0);
+ sBindCount++;
+ sIBOActive = FALSE;
+ }
+
+ sGLRenderIndices = mGLIndices;
}
}
- setupClientArrays(data_mask);
-
- if (mGLIndices)
+ if (!mGLArray)
{
- sGLRenderIndices = mGLIndices;
+ setupClientArrays(data_mask);
}
+
if (mGLBuffer)
{
- sGLRenderBuffer = mGLBuffer;
if (data_mask && setup)
{
setupVertexBuffer(data_mask); // subclass specific setup (virtual function)
@@ -1808,80 +2157,150 @@ void LLVertexBuffer::setBuffer(U32 data_mask, S32 type)
}
// virtual (default)
-void LLVertexBuffer::setupVertexBuffer(U32 data_mask) const
+void LLVertexBuffer::setupVertexBuffer(U32 data_mask)
{
LLMemType mt2(LLMemType::MTYPE_VERTEX_SETUP_VERTEX_BUFFER);
stop_glerror();
- U8* base = useVBOs() ? (U8*) mAlignedOffset : mMappedData;
+ volatile U8* base = useVBOs() ? (U8*) mAlignedOffset : mMappedData;
- if ((data_mask & mTypeMask) != data_mask)
+ /*if ((data_mask & mTypeMask) != data_mask)
{
llerrs << "LLVertexBuffer::setupVertexBuffer missing required components for supplied data mask." << llendl;
- }
-
- if (data_mask & MAP_NORMAL)
- {
- glNormalPointer(GL_FLOAT, LLVertexBuffer::sTypeSize[TYPE_NORMAL], (void*)(base + mOffsets[TYPE_NORMAL]));
- }
- if (data_mask & MAP_TEXCOORD3)
- {
- glClientActiveTextureARB(GL_TEXTURE3_ARB);
- glTexCoordPointer(2,GL_FLOAT, LLVertexBuffer::sTypeSize[TYPE_TEXCOORD3], (void*)(base + mOffsets[TYPE_TEXCOORD3]));
- glClientActiveTextureARB(GL_TEXTURE0_ARB);
- }
- if (data_mask & MAP_TEXCOORD2)
- {
- glClientActiveTextureARB(GL_TEXTURE2_ARB);
- glTexCoordPointer(2,GL_FLOAT, LLVertexBuffer::sTypeSize[TYPE_TEXCOORD2], (void*)(base + mOffsets[TYPE_TEXCOORD2]));
- glClientActiveTextureARB(GL_TEXTURE0_ARB);
- }
- if (data_mask & MAP_TEXCOORD1)
- {
- glClientActiveTextureARB(GL_TEXTURE1_ARB);
- glTexCoordPointer(2,GL_FLOAT, LLVertexBuffer::sTypeSize[TYPE_TEXCOORD1], (void*)(base + mOffsets[TYPE_TEXCOORD1]));
- glClientActiveTextureARB(GL_TEXTURE0_ARB);
- }
- if (data_mask & MAP_BINORMAL)
- {
- glClientActiveTextureARB(GL_TEXTURE2_ARB);
- glTexCoordPointer(3,GL_FLOAT, LLVertexBuffer::sTypeSize[TYPE_BINORMAL], (void*)(base + mOffsets[TYPE_BINORMAL]));
- glClientActiveTextureARB(GL_TEXTURE0_ARB);
- }
- if (data_mask & MAP_TEXCOORD0)
- {
- glTexCoordPointer(2,GL_FLOAT, LLVertexBuffer::sTypeSize[TYPE_TEXCOORD0], (void*)(base + mOffsets[TYPE_TEXCOORD0]));
- }
- if (data_mask & MAP_COLOR)
- {
- glColorPointer(4, GL_UNSIGNED_BYTE, LLVertexBuffer::sTypeSize[TYPE_COLOR], (void*)(base + mOffsets[TYPE_COLOR]));
- }
-
- if (data_mask & MAP_WEIGHT)
- {
- glVertexAttribPointerARB(1, 1, GL_FLOAT, FALSE, LLVertexBuffer::sTypeSize[TYPE_WEIGHT], (void*)(base + mOffsets[TYPE_WEIGHT]));
- }
-
- if (data_mask & MAP_WEIGHT4 && sWeight4Loc != -1)
- {
- glVertexAttribPointerARB(sWeight4Loc, 4, GL_FLOAT, FALSE, LLVertexBuffer::sTypeSize[TYPE_WEIGHT4], (void*)(base+mOffsets[TYPE_WEIGHT4]));
- }
+ }*/
- if (data_mask & MAP_CLOTHWEIGHT)
- {
- glVertexAttribPointerARB(4, 4, GL_FLOAT, TRUE, LLVertexBuffer::sTypeSize[TYPE_CLOTHWEIGHT], (void*)(base + mOffsets[TYPE_CLOTHWEIGHT]));
- }
- if (data_mask & MAP_VERTEX)
+ if (LLGLSLShader::sNoFixedFunction)
{
+ if (data_mask & MAP_NORMAL)
+ {
+ S32 loc = TYPE_NORMAL;
+ void* ptr = (void*)(base + mOffsets[TYPE_NORMAL]);
+ glVertexAttribPointerARB(loc, 3, GL_FLOAT, GL_FALSE, LLVertexBuffer::sTypeSize[TYPE_NORMAL], ptr);
+ }
+ if (data_mask & MAP_TEXCOORD3)
+ {
+ S32 loc = TYPE_TEXCOORD3;
+ void* ptr = (void*)(base + mOffsets[TYPE_TEXCOORD3]);
+ glVertexAttribPointerARB(loc,2,GL_FLOAT, GL_FALSE, LLVertexBuffer::sTypeSize[TYPE_TEXCOORD3], ptr);
+ }
+ if (data_mask & MAP_TEXCOORD2)
+ {
+ S32 loc = TYPE_TEXCOORD2;
+ void* ptr = (void*)(base + mOffsets[TYPE_TEXCOORD2]);
+ glVertexAttribPointerARB(loc,2,GL_FLOAT, GL_FALSE, LLVertexBuffer::sTypeSize[TYPE_TEXCOORD2], ptr);
+ }
+ if (data_mask & MAP_TEXCOORD1)
+ {
+ S32 loc = TYPE_TEXCOORD1;
+ void* ptr = (void*)(base + mOffsets[TYPE_TEXCOORD1]);
+ glVertexAttribPointerARB(loc,2,GL_FLOAT, GL_FALSE, LLVertexBuffer::sTypeSize[TYPE_TEXCOORD1], ptr);
+ }
+ if (data_mask & MAP_BINORMAL)
+ {
+ S32 loc = TYPE_BINORMAL;
+ void* ptr = (void*)(base + mOffsets[TYPE_BINORMAL]);
+ glVertexAttribPointerARB(loc, 3,GL_FLOAT, GL_FALSE, LLVertexBuffer::sTypeSize[TYPE_BINORMAL], ptr);
+ }
+ if (data_mask & MAP_TEXCOORD0)
+ {
+ S32 loc = TYPE_TEXCOORD0;
+ void* ptr = (void*)(base + mOffsets[TYPE_TEXCOORD0]);
+ glVertexAttribPointerARB(loc,2,GL_FLOAT, GL_FALSE, LLVertexBuffer::sTypeSize[TYPE_TEXCOORD0], ptr);
+ }
+ if (data_mask & MAP_COLOR)
+ {
+ S32 loc = TYPE_COLOR;
+ void* ptr = (void*)(base + mOffsets[TYPE_COLOR]);
+ glVertexAttribPointerARB(loc, 4, GL_UNSIGNED_BYTE, GL_TRUE, LLVertexBuffer::sTypeSize[TYPE_COLOR], ptr);
+ }
+ if (data_mask & MAP_EMISSIVE)
+ {
+ S32 loc = TYPE_EMISSIVE;
+ void* ptr = (void*)(base + mOffsets[TYPE_EMISSIVE]);
+ glVertexAttribPointerARB(loc, 4, GL_UNSIGNED_BYTE, GL_TRUE, LLVertexBuffer::sTypeSize[TYPE_EMISSIVE], ptr);
+ }
+ if (data_mask & MAP_WEIGHT)
+ {
+ S32 loc = TYPE_WEIGHT;
+ void* ptr = (void*)(base + mOffsets[TYPE_WEIGHT]);
+ glVertexAttribPointerARB(loc, 1, GL_FLOAT, FALSE, LLVertexBuffer::sTypeSize[TYPE_WEIGHT], ptr);
+ }
+ if (data_mask & MAP_WEIGHT4)
+ {
+ S32 loc = TYPE_WEIGHT4;
+ void* ptr = (void*)(base+mOffsets[TYPE_WEIGHT4]);
+ glVertexAttribPointerARB(loc, 4, GL_FLOAT, FALSE, LLVertexBuffer::sTypeSize[TYPE_WEIGHT4], ptr);
+ }
+ if (data_mask & MAP_CLOTHWEIGHT)
+ {
+ S32 loc = TYPE_CLOTHWEIGHT;
+ void* ptr = (void*)(base + mOffsets[TYPE_CLOTHWEIGHT]);
+ glVertexAttribPointerARB(loc, 4, GL_FLOAT, TRUE, LLVertexBuffer::sTypeSize[TYPE_CLOTHWEIGHT], ptr);
+ }
if (data_mask & MAP_TEXTURE_INDEX)
{
- glVertexPointer(4,GL_FLOAT, LLVertexBuffer::sTypeSize[TYPE_VERTEX], (void*)(base + 0));
+ S32 loc = TYPE_TEXTURE_INDEX;
+ void *ptr = (void*) (base + mOffsets[TYPE_VERTEX] + 12);
+ glVertexAttribPointerARB(loc, 1, GL_FLOAT, GL_FALSE, LLVertexBuffer::sTypeSize[TYPE_VERTEX], ptr);
}
- else
+ if (data_mask & MAP_VERTEX)
{
- glVertexPointer(3,GL_FLOAT, LLVertexBuffer::sTypeSize[TYPE_VERTEX], (void*)(base + 0));
+ S32 loc = TYPE_VERTEX;
+ void* ptr = (void*)(base + mOffsets[TYPE_VERTEX]);
+ glVertexAttribPointerARB(loc, 3,GL_FLOAT, GL_FALSE, LLVertexBuffer::sTypeSize[TYPE_VERTEX], ptr);
+ }
+ }
+ else
+ {
+ if (data_mask & MAP_NORMAL)
+ {
+ glNormalPointer(GL_FLOAT, LLVertexBuffer::sTypeSize[TYPE_NORMAL], (void*)(base + mOffsets[TYPE_NORMAL]));
}
+ if (data_mask & MAP_TEXCOORD3)
+ {
+ glClientActiveTextureARB(GL_TEXTURE3_ARB);
+ glTexCoordPointer(2,GL_FLOAT, LLVertexBuffer::sTypeSize[TYPE_TEXCOORD3], (void*)(base + mOffsets[TYPE_TEXCOORD3]));
+ glClientActiveTextureARB(GL_TEXTURE0_ARB);
+ }
+ if (data_mask & MAP_TEXCOORD2)
+ {
+ glClientActiveTextureARB(GL_TEXTURE2_ARB);
+ glTexCoordPointer(2,GL_FLOAT, LLVertexBuffer::sTypeSize[TYPE_TEXCOORD2], (void*)(base + mOffsets[TYPE_TEXCOORD2]));
+ glClientActiveTextureARB(GL_TEXTURE0_ARB);
+ }
+ if (data_mask & MAP_TEXCOORD1)
+ {
+ glClientActiveTextureARB(GL_TEXTURE1_ARB);
+ glTexCoordPointer(2,GL_FLOAT, LLVertexBuffer::sTypeSize[TYPE_TEXCOORD1], (void*)(base + mOffsets[TYPE_TEXCOORD1]));
+ glClientActiveTextureARB(GL_TEXTURE0_ARB);
+ }
+ if (data_mask & MAP_BINORMAL)
+ {
+ glClientActiveTextureARB(GL_TEXTURE2_ARB);
+ glTexCoordPointer(3,GL_FLOAT, LLVertexBuffer::sTypeSize[TYPE_BINORMAL], (void*)(base + mOffsets[TYPE_BINORMAL]));
+ glClientActiveTextureARB(GL_TEXTURE0_ARB);
+ }
+ if (data_mask & MAP_TEXCOORD0)
+ {
+ glTexCoordPointer(2,GL_FLOAT, LLVertexBuffer::sTypeSize[TYPE_TEXCOORD0], (void*)(base + mOffsets[TYPE_TEXCOORD0]));
+ }
+ if (data_mask & MAP_COLOR)
+ {
+ glColorPointer(4, GL_UNSIGNED_BYTE, LLVertexBuffer::sTypeSize[TYPE_COLOR], (void*)(base + mOffsets[TYPE_COLOR]));
+ }
+ if (data_mask & MAP_VERTEX)
+ {
+ glVertexPointer(3,GL_FLOAT, LLVertexBuffer::sTypeSize[TYPE_VERTEX], (void*)(base + 0));
+ }
}
llglassertok();
}
+LLVertexBuffer::MappedRegion::MappedRegion(S32 type, S32 index, S32 count)
+: mType(type), mIndex(index), mCount(count)
+{
+ llassert(mType == LLVertexBuffer::TYPE_INDEX ||
+ mType < LLVertexBuffer::TYPE_TEXTURE_INDEX);
+}
+
+
diff --git a/indra/llrender/llvertexbuffer.h b/indra/llrender/llvertexbuffer.h
index 578cec3885..e1cbfd3b61 100644
--- a/indra/llrender/llvertexbuffer.h
+++ b/indra/llrender/llvertexbuffer.h
@@ -38,6 +38,8 @@
#include <vector>
#include <list>
+#define LL_MAX_VERTEX_ATTRIB_LOCATION 64
+
//============================================================================
// NOTES
// Threading:
@@ -49,25 +51,32 @@
//============================================================================
// gl name pools for dynamic and streaming buffers
-
-class LLVBOPool : public LLGLNamePool
+class LLVBOPool
{
-protected:
- virtual GLuint allocateName()
- {
- GLuint name;
- stop_glerror();
- glGenBuffersARB(1, &name);
- stop_glerror();
- return name;
- }
+public:
+ static U32 sBytesPooled;
+
+ U32 mUsage;
+ U32 mType;
- virtual void releaseName(GLuint name)
+ //size MUST be a power of 2
+ volatile U8* allocate(U32& name, U32 size);
+
+ //size MUST be the size provided to allocate that returned the given name
+ void release(U32 name, volatile U8* buffer, U32 size);
+
+ //destroy all records in mFreeList
+ void cleanup();
+
+ class Record
{
- stop_glerror();
- glDeleteBuffersARB(1, &name);
- stop_glerror();
- }
+ public:
+ U32 mGLName;
+ volatile U8* mClientData;
+ };
+
+ typedef std::list<Record> record_list_t;
+ std::vector<record_list_t> mFreeList;
};
class LLGLFence
@@ -90,9 +99,7 @@ public:
S32 mIndex;
S32 mCount;
- MappedRegion(S32 type, S32 index, S32 count)
- : mType(type), mIndex(index), mCount(count)
- { }
+ MappedRegion(S32 type, S32 index, S32 count);
};
LLVertexBuffer(const LLVertexBuffer& rhs)
@@ -111,18 +118,17 @@ public:
static LLVBOPool sStreamIBOPool;
static LLVBOPool sDynamicIBOPool;
- static S32 sWeight4Loc;
-
static BOOL sUseStreamDraw;
+ static BOOL sUseVAO;
static BOOL sPreferStreamDraw;
static void initClass(bool use_vbo, bool no_vbo_mapping);
static void cleanupClass();
static void setupClientArrays(U32 data_mask);
static void drawArrays(U32 mode, const std::vector<LLVector3>& pos, const std::vector<LLVector3>& norm);
+ static void drawElements(U32 mode, const LLVector4a* pos, const LLVector2* tc, S32 num_indices, const U16* indicesp);
- static void clientCopy(F64 max_time = 0.005); //copy data from client to GL
- static void unbind(); //unbind any bound vertex buffer
+ static void unbind(); //unbind any bound vertex buffer
//get the size of a vertex with the given typemask
static S32 calcVertexSize(const U32& typemask);
@@ -133,24 +139,29 @@ public:
static S32 calcOffsets(const U32& typemask, S32* offsets, S32 num_vertices);
+ //WARNING -- when updating these enums you MUST
+ // 1 - update LLVertexBuffer::sTypeSize
+ // 2 - add a strider accessor
+ // 3 - modify LLVertexBuffer::setupVertexBuffer
+ // 4 - modify LLVertexBuffer::setupClientArray
+ // 5 - modify LLViewerShaderMgr::mReservedAttribs
+ // 6 - update LLVertexBuffer::setupVertexArray
enum {
- TYPE_VERTEX,
+ TYPE_VERTEX = 0,
TYPE_NORMAL,
TYPE_TEXCOORD0,
TYPE_TEXCOORD1,
TYPE_TEXCOORD2,
TYPE_TEXCOORD3,
TYPE_COLOR,
- // These use VertexAttribPointer and should possibly be made generic
+ TYPE_EMISSIVE,
TYPE_BINORMAL,
TYPE_WEIGHT,
TYPE_WEIGHT4,
TYPE_CLOTHWEIGHT,
- TYPE_MAX,
- TYPE_INDEX,
-
- //no actual additional data, but indicates position.w is texture index
TYPE_TEXTURE_INDEX,
+ TYPE_MAX,
+ TYPE_INDEX,
};
enum {
MAP_VERTEX = (1<<TYPE_VERTEX),
@@ -160,6 +171,7 @@ public:
MAP_TEXCOORD2 = (1<<TYPE_TEXCOORD2),
MAP_TEXCOORD3 = (1<<TYPE_TEXCOORD3),
MAP_COLOR = (1<<TYPE_COLOR),
+ MAP_EMISSIVE = (1<<TYPE_EMISSIVE),
// These use VertexAttribPointer and should possibly be made generic
MAP_BINORMAL = (1<<TYPE_BINORMAL),
MAP_WEIGHT = (1<<TYPE_WEIGHT),
@@ -173,33 +185,35 @@ protected:
virtual ~LLVertexBuffer(); // use unref()
- virtual void setupVertexBuffer(U32 data_mask) const; // pure virtual, called from mapBuffer()
+ virtual void setupVertexBuffer(U32 data_mask); // pure virtual, called from mapBuffer()
+ void setupVertexArray();
- void genBuffer();
- void genIndices();
+ void genBuffer(U32 size);
+ void genIndices(U32 size);
+ bool bindGLBuffer(bool force_bind = false);
+ bool bindGLIndices(bool force_bind = false);
+ bool bindGLArray();
void releaseBuffer();
void releaseIndices();
- void createGLBuffer();
- void createGLIndices();
+ void createGLBuffer(U32 size);
+ void createGLIndices(U32 size);
void destroyGLBuffer();
void destroyGLIndices();
void updateNumVerts(S32 nverts);
void updateNumIndices(S32 nindices);
virtual BOOL useVBOs() const;
- void unmapBuffer(S32 type);
- void freeClientBuffer() ;
- void allocateClientVertexBuffer() ;
- void allocateClientIndexBuffer() ;
-
+ void unmapBuffer();
+
public:
LLVertexBuffer(U32 typemask, S32 usage);
// map for data access
- U8* mapVertexBuffer(S32 type, S32 index, S32 count, bool map_range);
- U8* mapIndexBuffer(S32 index, S32 count, bool map_range);
+ volatile U8* mapVertexBuffer(S32 type, S32 index, S32 count, bool map_range);
+ volatile U8* mapIndexBuffer(S32 index, S32 count, bool map_range);
// set for rendering
- virtual void setBuffer(U32 data_mask, S32 type = -1); // calls setupVertexBuffer() if data_mask is not 0
+ virtual void setBuffer(U32 data_mask); // calls setupVertexBuffer() if data_mask is not 0
+ void flush(); //flush pending data to GL memory
// allocate buffer
void allocateBuffer(S32 nverts, S32 nindices, bool create);
virtual void resizeBuffer(S32 newnverts, S32 newnindices);
@@ -212,33 +226,35 @@ public:
// setVertsNorms(verts, norms);
// vb->unmapBuffer();
bool getVertexStrider(LLStrider<LLVector3>& strider, S32 index=0, S32 count = -1, bool map_range = false);
+ bool getVertexStrider(LLStrider<LLVector4a>& strider, S32 index=0, S32 count = -1, bool map_range = false);
bool getIndexStrider(LLStrider<U16>& strider, S32 index=0, S32 count = -1, bool map_range = false);
bool getTexCoord0Strider(LLStrider<LLVector2>& strider, S32 index=0, S32 count = -1, bool map_range = false);
bool getTexCoord1Strider(LLStrider<LLVector2>& strider, S32 index=0, S32 count = -1, bool map_range = false);
bool getNormalStrider(LLStrider<LLVector3>& strider, S32 index=0, S32 count = -1, bool map_range = false);
bool getBinormalStrider(LLStrider<LLVector3>& strider, S32 index=0, S32 count = -1, bool map_range = false);
bool getColorStrider(LLStrider<LLColor4U>& strider, S32 index=0, S32 count = -1, bool map_range = false);
+ bool getEmissiveStrider(LLStrider<LLColor4U>& strider, S32 index=0, S32 count = -1, bool map_range = false);
bool getWeightStrider(LLStrider<F32>& strider, S32 index=0, S32 count = -1, bool map_range = false);
bool getWeight4Strider(LLStrider<LLVector4>& strider, S32 index=0, S32 count = -1, bool map_range = false);
bool getClothWeightStrider(LLStrider<LLVector4>& strider, S32 index=0, S32 count = -1, bool map_range = false);
+
BOOL isEmpty() const { return mEmpty; }
BOOL isLocked() const { return mVertexLocked || mIndexLocked; }
S32 getNumVerts() const { return mNumVerts; }
S32 getNumIndices() const { return mNumIndices; }
- S32 getRequestedVerts() const { return mRequestedNumVerts; }
- S32 getRequestedIndices() const { return mRequestedNumIndices; }
-
- U8* getIndicesPointer() const { return useVBOs() ? (U8*) mAlignedIndexOffset : mMappedIndexData; }
- U8* getVerticesPointer() const { return useVBOs() ? (U8*) mAlignedOffset : mMappedData; }
+
+ volatile U8* getIndicesPointer() const { return useVBOs() ? (U8*) mAlignedIndexOffset : mMappedIndexData; }
+ volatile U8* getVerticesPointer() const { return useVBOs() ? (U8*) mAlignedOffset : mMappedData; }
U32 getTypeMask() const { return mTypeMask; }
bool hasDataType(S32 type) const { return ((1 << type) & getTypeMask()); }
S32 getSize() const;
- S32 getIndicesSize() const { return mNumIndices * sizeof(U16); }
- U8* getMappedData() const { return mMappedData; }
- U8* getMappedIndices() const { return mMappedIndexData; }
+ S32 getIndicesSize() const { return mIndicesSize; }
+ volatile U8* getMappedData() const { return mMappedData; }
+ volatile U8* getMappedIndices() const { return mMappedIndexData; }
S32 getOffset(S32 type) const { return mOffsets[type]; }
S32 getUsage() const { return mUsage; }
+ BOOL isWriteable() const { return (mMappable || mUsage == GL_STREAM_DRAW_ARB) ? TRUE : FALSE; }
void draw(U32 mode, U32 count, U32 indices_offset) const;
void drawArrays(U32 mode, U32 offset, U32 count) const;
@@ -252,25 +268,24 @@ public:
protected:
S32 mNumVerts; // Number of vertices allocated
S32 mNumIndices; // Number of indices allocated
- S32 mRequestedNumVerts; // Number of vertices requested
- S32 mRequestedNumIndices; // Number of indices requested
-
+
ptrdiff_t mAlignedOffset;
ptrdiff_t mAlignedIndexOffset;
S32 mSize;
+ S32 mIndicesSize;
U32 mTypeMask;
S32 mUsage; // GL usage
U32 mGLBuffer; // GL VBO handle
U32 mGLIndices; // GL IBO handle
- U8* mMappedData; // pointer to currently mapped data (NULL if unmapped)
- U8* mMappedIndexData; // pointer to currently mapped indices (NULL if unmapped)
+ U32 mGLArray; // GL VAO handle
+
+ volatile U8* mMappedData; // pointer to currently mapped data (NULL if unmapped)
+ volatile U8* mMappedIndexData; // pointer to currently mapped indices (NULL if unmapped)
BOOL mVertexLocked; // if TRUE, vertex buffer is being or has been written to in client memory
BOOL mIndexLocked; // if TRUE, index buffer is being or has been written to in client memory
BOOL mFinal; // if TRUE, buffer can not be mapped again
- BOOL mFilthy; // if TRUE, entire buffer must be copied (used to prevent redundant dirty flags)
BOOL mEmpty; // if TRUE, client buffer is empty (or NULL). Old values have been discarded.
- BOOL mResized; // if TRUE, client buffer has been resized and GL buffer has not
- BOOL mDynamicSize; // if TRUE, buffer has been resized at least once (and should be padded)
+ mutable BOOL mMappable; // if TRUE, use memory mapping to upload data (otherwise doublebuffer and use glBufferSubData)
S32 mOffsets[TYPE_MAX];
std::vector<MappedRegion> mMappedVertexRegions;
@@ -290,7 +305,6 @@ public:
static S32 sGLCount;
static S32 sMappedCount;
static BOOL sMapped;
- static std::vector<U32> sDeleteList;
typedef std::list<LLVertexBuffer*> buffer_list_t;
static BOOL sDisableVBOMapping; //disable glMapBufferARB
@@ -298,6 +312,7 @@ public:
static S32 sTypeSize[TYPE_MAX];
static U32 sGLMode[LLRender::NUM_MODES];
static U32 sGLRenderBuffer;
+ static U32 sGLRenderArray;
static U32 sGLRenderIndices;
static BOOL sVBOActive;
static BOOL sIBOActive;
diff --git a/indra/llui/CMakeLists.txt b/indra/llui/CMakeLists.txt
index b3b2f4ae56..20c3456a56 100644
--- a/indra/llui/CMakeLists.txt
+++ b/indra/llui/CMakeLists.txt
@@ -5,24 +5,24 @@ project(llui)
include(00-Common)
include(LLCommon)
include(LLImage)
+include(LLInventory)
include(LLMath)
include(LLMessage)
include(LLRender)
include(LLWindow)
include(LLVFS)
include(LLXML)
-include(LLXUIXML)
include_directories(
${LLCOMMON_INCLUDE_DIRS}
${LLIMAGE_INCLUDE_DIRS}
+ ${LLINVENTORY_INCLUDE_DIRS}
${LLMATH_INCLUDE_DIRS}
${LLMESSAGE_INCLUDE_DIRS}
${LLRENDER_INCLUDE_DIRS}
${LLWINDOW_INCLUDE_DIRS}
${LLVFS_INCLUDE_DIRS}
${LLXML_INCLUDE_DIRS}
- ${LLXUIXML_INCLUDE_DIRS}
)
set(llui_SOURCE_FILES
@@ -35,6 +35,7 @@ set(llui_SOURCE_FILES
llcheckboxctrl.cpp
llclipboard.cpp
llcombobox.cpp
+ llcommandmanager.cpp
llconsole.cpp
llcontainerview.cpp
llctrlselectioninterface.cpp
@@ -80,7 +81,6 @@ set(llui_SOURCE_FILES
llscrolllistcolumn.cpp
llscrolllistctrl.cpp
llscrolllistitem.cpp
- llsdparam.cpp
llsearcheditor.cpp
llslider.cpp
llsliderctrl.cpp
@@ -97,10 +97,13 @@ set(llui_SOURCE_FILES
lltextutil.cpp
lltextvalidate.cpp
lltimectrl.cpp
+ lltrans.cpp
lltransutil.cpp
lltoggleablemenu.cpp
+ lltoolbar.cpp
lltooltip.cpp
llui.cpp
+ lluicolor.cpp
lluicolortable.cpp
lluictrl.cpp
lluictrlfactory.cpp
@@ -112,10 +115,12 @@ set(llui_SOURCE_FILES
llurlmatch.cpp
llurlregistry.cpp
llviewborder.cpp
+ llviewinject.cpp
llviewmodel.cpp
llview.cpp
llviewquery.cpp
llwindowshade.cpp
+ llxuiparser.cpp
)
set(llui_HEADER_FILES
@@ -131,6 +136,7 @@ set(llui_HEADER_FILES
llcheckboxctrl.h
llclipboard.h
llcombobox.h
+ llcommandmanager.h
llconsole.h
llcontainerview.h
llctrlselectioninterface.h
@@ -183,7 +189,6 @@ set(llui_HEADER_FILES
llscrolllistcolumn.h
llscrolllistctrl.h
llscrolllistitem.h
- llsdparam.h
llsliderctrl.h
llslider.h
llspinctrl.h
@@ -200,7 +205,9 @@ set(llui_HEADER_FILES
lltextvalidate.h
lltimectrl.h
lltoggleablemenu.h
+ lltoolbar.h
lltooltip.h
+ lltrans.h
lltransutil.h
lluicolortable.h
lluiconstants.h
@@ -208,6 +215,7 @@ set(llui_HEADER_FILES
lluictrl.h
lluifwd.h
llui.h
+ lluicolor.h
lluiimage.h
lluistring.h
llundo.h
@@ -216,10 +224,12 @@ set(llui_HEADER_FILES
llurlmatch.h
llurlregistry.h
llviewborder.h
+ llviewinject.h
llviewmodel.h
llview.h
llviewquery.h
llwindowshade.h
+ llxuiparser.h
)
set_source_files_properties(${llui_HEADER_FILES}
@@ -245,6 +255,7 @@ target_link_libraries(llui
${LLRENDER_LIBRARIES}
${LLWINDOW_LIBRARIES}
${LLIMAGE_LIBRARIES}
+ ${LLINVENTORY_LIBRARIES}
${LLVFS_LIBRARIES} # ugh, just for LLDir
${LLXUIXML_LIBRARIES}
${LLXML_LIBRARIES}
diff --git a/indra/llui/llaccordionctrltab.cpp b/indra/llui/llaccordionctrltab.cpp
index 4b0b7c561d..7a5f9f9fd6 100644
--- a/indra/llui/llaccordionctrltab.cpp
+++ b/indra/llui/llaccordionctrltab.cpp
@@ -973,7 +973,7 @@ void LLAccordionCtrlTab::drawChild(const LLRect& root_rect,LLView* child)
if ( root_rect.overlaps(screen_rect) && LLUI::sDirtyRect.overlaps(screen_rect))
{
- glMatrixMode(GL_MODELVIEW);
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
LLUI::pushMatrix();
{
LLUI::translate((F32)child->getRect().mLeft, (F32)child->getRect().mBottom, 0.f);
diff --git a/indra/llui/llbutton.cpp b/indra/llui/llbutton.cpp
index 2459429f6e..f0d92d597a 100644
--- a/indra/llui/llbutton.cpp
+++ b/indra/llui/llbutton.cpp
@@ -83,10 +83,11 @@ LLButton::Params::Params()
label_color_selected("label_color_selected"), // requires is_toggle true
label_color_disabled("label_color_disabled"),
label_color_disabled_selected("label_color_disabled_selected"),
- highlight_color("highlight_color"),
image_color("image_color"),
image_color_disabled("image_color_disabled"),
- image_overlay_color("image_overlay_color", LLColor4::white),
+ image_overlay_color("image_overlay_color", LLColor4::white % 0.75f),
+ image_overlay_disabled_color("image_overlay_disabled_color", LLColor4::white % 0.3f),
+ image_overlay_selected_color("image_overlay_selected_color", LLColor4::white),
flash_color("flash_color"),
pad_right("pad_right", LLUI::sSettingGroups["config"]->getS32("ButtonHPad")),
pad_left("pad_left", LLUI::sSettingGroups["config"]->getS32("ButtonHPad")),
@@ -99,10 +100,13 @@ LLButton::Params::Params()
scale_image("scale_image", true),
hover_glow_amount("hover_glow_amount"),
commit_on_return("commit_on_return", true),
+ display_pressed_state("display_pressed_state", true),
use_draw_context_alpha("use_draw_context_alpha", true),
badge("badge"),
handle_right_mouse("handle_right_mouse"),
- held_down_delay("held_down_delay")
+ held_down_delay("held_down_delay"),
+ button_flash_count("button_flash_count"),
+ button_flash_rate("button_flash_rate")
{
addSynonym(is_toggle, "toggle");
changeDefault(initial_value, LLSD(false));
@@ -111,7 +115,7 @@ LLButton::Params::Params()
LLButton::LLButton(const LLButton::Params& p)
: LLUICtrl(p),
- LLBadgeOwner(LLView::getHandle()),
+ LLBadgeOwner(getHandle()),
mMouseDownFrame(0),
mMouseHeldDownCount(0),
mBorderEnabled( FALSE ),
@@ -136,12 +140,13 @@ LLButton::LLButton(const LLButton::Params& p)
mSelectedLabelColor(p.label_color_selected()),
mDisabledLabelColor(p.label_color_disabled()),
mDisabledSelectedLabelColor(p.label_color_disabled_selected()),
- mHighlightColor(p.highlight_color()),
mImageColor(p.image_color()),
mFlashBgColor(p.flash_color()),
mDisabledImageColor(p.image_color_disabled()),
mImageOverlay(p.image_overlay()),
mImageOverlayColor(p.image_overlay_color()),
+ mImageOverlayDisabledColor(p.image_overlay_disabled_color()),
+ mImageOverlaySelectedColor(p.image_overlay_selected_color()),
mImageOverlayAlignment(LLFontGL::hAlignFromName(p.image_overlay_alignment)),
mImageOverlayTopPad(p.image_top_pad),
mImageOverlayBottomPad(p.image_bottom_pad),
@@ -159,12 +164,15 @@ LLButton::LLButton(const LLButton::Params& p)
mCommitOnReturn(p.commit_on_return),
mFadeWhenDisabled(FALSE),
mForcePressedState(false),
+ mDisplayPressedState(p.display_pressed_state),
mLastDrawCharsCount(0),
mMouseDownSignal(NULL),
mMouseUpSignal(NULL),
mHeldDownSignal(NULL),
mUseDrawContextAlpha(p.use_draw_context_alpha),
- mHandleRightMouse(p.handle_right_mouse)
+ mHandleRightMouse(p.handle_right_mouse),
+ mButtonFlashCount(p.button_flash_count),
+ mButtonFlashRate(p.button_flash_rate)
{
static LLUICachedControl<S32> llbutton_orig_h_pad ("UIButtonOrigHPad", 0);
static Params default_params(LLUICtrlFactory::getDefaultParams<LLButton>());
@@ -292,6 +300,24 @@ void LLButton::onCommit()
LLUICtrl::onCommit();
}
+boost::signals2::connection LLButton::setClickedCallback(const CommitCallbackParam& cb)
+{
+ return setClickedCallback(initCommitCallback(cb));
+}
+boost::signals2::connection LLButton::setMouseDownCallback(const CommitCallbackParam& cb)
+{
+ return setMouseDownCallback(initCommitCallback(cb));
+}
+boost::signals2::connection LLButton::setMouseUpCallback(const CommitCallbackParam& cb)
+{
+ return setMouseUpCallback(initCommitCallback(cb));
+}
+boost::signals2::connection LLButton::setHeldDownCallback(const CommitCallbackParam& cb)
+{
+ return setHeldDownCallback(initCommitCallback(cb));
+}
+
+
boost::signals2::connection LLButton::setClickedCallback( const commit_signal_t::slot_type& cb )
{
if (!mCommitSignal) mCommitSignal = new commit_signal_t();
@@ -314,7 +340,7 @@ boost::signals2::connection LLButton::setHeldDownCallback( const commit_signal_t
}
-// *TODO: Deprecate (for backwards compatability only)
+// *TODO: Deprecate (for backwards compatibility only)
boost::signals2::connection LLButton::setClickedCallback( button_callback_t cb, void* data )
{
return setClickedCallback(boost::bind(cb, data));
@@ -511,15 +537,6 @@ BOOL LLButton::handleRightMouseUp(S32 x, S32 y, MASK mask)
return TRUE;
}
-
-void LLButton::onMouseEnter(S32 x, S32 y, MASK mask)
-{
- LLUICtrl::onMouseEnter(x, y, mask);
-
- if (isInEnabledChain())
- mNeedsHighlight = TRUE;
-}
-
void LLButton::onMouseLeave(S32 x, S32 y, MASK mask)
{
LLUICtrl::onMouseLeave(x, y, mask);
@@ -534,6 +551,10 @@ void LLButton::setHighlight(bool b)
BOOL LLButton::handleHover(S32 x, S32 y, MASK mask)
{
+ if (isInEnabledChain()
+ && (!gFocusMgr.getMouseCapture() || gFocusMgr.getMouseCapture() == this))
+ mNeedsHighlight = TRUE;
+
if (!childrenHandleHover(x, y, mask))
{
if (mMouseDownTimer.getStarted())
@@ -554,21 +575,37 @@ BOOL LLButton::handleHover(S32 x, S32 y, MASK mask)
return TRUE;
}
+void LLButton::getOverlayImageSize(S32& overlay_width, S32& overlay_height)
+{
+ overlay_width = mImageOverlay->getWidth();
+ overlay_height = mImageOverlay->getHeight();
+
+ F32 scale_factor = llmin((F32)getRect().getWidth() / (F32)overlay_width, (F32)getRect().getHeight() / (F32)overlay_height, 1.f);
+ overlay_width = llround((F32)overlay_width * scale_factor);
+ overlay_height = llround((F32)overlay_height * scale_factor);
+}
+
// virtual
void LLButton::draw()
{
+ static LLCachedControl<bool> sEnableButtonFlashing(*LLUI::sSettingGroups["config"], "EnableButtonFlashing", true);
F32 alpha = mUseDrawContextAlpha ? getDrawContext().mAlpha : getCurrentTransparency();
bool flash = FALSE;
- static LLUICachedControl<F32> button_flash_rate("ButtonFlashRate", 0);
- static LLUICachedControl<S32> button_flash_count("ButtonFlashCount", 0);
- if( mFlashing )
+ if( mFlashing)
{
- F32 elapsed = mFlashingTimer.getElapsedTimeF32();
- S32 flash_count = S32(elapsed * button_flash_rate * 2.f);
- // flash on or off?
- flash = (flash_count % 2 == 0) || flash_count > S32((F32)button_flash_count * 2.f);
+ if ( sEnableButtonFlashing)
+ {
+ F32 elapsed = mFlashingTimer.getElapsedTimeF32();
+ S32 flash_count = S32(elapsed * mButtonFlashRate * 2.f);
+ // flash on or off?
+ flash = (flash_count % 2 == 0) || flash_count > S32((F32)mButtonFlashCount * 2.f);
+ }
+ else
+ { // otherwise just highlight button in flash color
+ flash = true;
+ }
}
bool pressed_by_keyboard = FALSE;
@@ -597,7 +634,7 @@ void LLButton::draw()
LLColor4 glow_color = LLColor4::white;
LLRender::eBlendType glow_type = LLRender::BT_ADD_WITH_ALPHA;
LLUIImage* imagep = NULL;
- if (pressed)
+ if (pressed && mDisplayPressedState)
{
imagep = selected ? mImagePressedSelected : mImagePressed;
}
@@ -707,16 +744,7 @@ void LLButton::draw()
}
// Unselected label assignments
- LLWString label;
-
- if( getToggleState() )
- {
- label = mSelectedLabel;
- }
- else
- {
- label = mUnselectedLabel;
- }
+ LLWString label = getCurrentLabel();
// overlay with keyboard focus border
if (hasFocus())
@@ -781,18 +809,16 @@ void LLButton::draw()
if (mImageOverlay.notNull())
{
// get max width and height (discard level 0)
- S32 overlay_width = mImageOverlay->getWidth();
- S32 overlay_height = mImageOverlay->getHeight();
+ S32 overlay_width;
+ S32 overlay_height;
- F32 scale_factor = llmin((F32)getRect().getWidth() / (F32)overlay_width, (F32)getRect().getHeight() / (F32)overlay_height, 1.f);
- overlay_width = llround((F32)overlay_width * scale_factor);
- overlay_height = llround((F32)overlay_height * scale_factor);
+ getOverlayImageSize(overlay_width, overlay_height);
S32 center_x = getLocalRect().getCenterX();
S32 center_y = getLocalRect().getCenterY();
//FUGLY HACK FOR "DEPRESSED" BUTTONS
- if (pressed)
+ if (pressed && mDisplayPressedState)
{
center_y--;
center_x++;
@@ -803,7 +829,11 @@ void LLButton::draw()
LLColor4 overlay_color = mImageOverlayColor.get();
if (!enabled)
{
- overlay_color.mV[VALPHA] = 0.5f;
+ overlay_color = mImageOverlayDisabledColor.get();
+ }
+ else if (getToggleState())
+ {
+ overlay_color = mImageOverlaySelectedColor.get();
}
overlay_color.mV[VALPHA] *= alpha;
@@ -811,6 +841,7 @@ void LLButton::draw()
{
case LLFontGL::LEFT:
text_left += overlay_width + mImgOverlayLabelSpace;
+ text_width -= overlay_width + mImgOverlayLabelSpace;
mImageOverlay->draw(
mLeftHPad,
center_y - (overlay_height / 2),
@@ -828,6 +859,7 @@ void LLButton::draw()
break;
case LLFontGL::RIGHT:
text_right -= overlay_width + mImgOverlayLabelSpace;
+ text_width -= overlay_width + mImgOverlayLabelSpace;
mImageOverlay->draw(
getRect().getWidth() - mRightHPad - overlay_width,
center_y - (overlay_height / 2),
@@ -863,7 +895,7 @@ void LLButton::draw()
S32 y_offset = 2 + (getRect().getHeight() - 20)/2;
- if (pressed)
+ if (pressed && mDisplayPressedState)
{
y_offset--;
x++;
@@ -919,7 +951,7 @@ void LLButton::setToggleState(BOOL b)
void LLButton::setFlashing( BOOL b )
{
- if (b != mFlashing)
+ if ((bool)b != mFlashing)
{
mFlashing = b;
mFlashingTimer.reset();
@@ -959,6 +991,23 @@ void LLButton::setLabelSelected( const LLStringExplicit& label )
mSelectedLabel = label;
}
+bool LLButton::labelIsTruncated() const
+{
+ return getCurrentLabel().getString().size() > mLastDrawCharsCount;
+}
+
+const LLUIString& LLButton::getCurrentLabel() const
+{
+ if( getToggleState() )
+ {
+ return mSelectedLabel;
+ }
+ else
+ {
+ return mUnselectedLabel;
+ }
+}
+
void LLButton::setImageUnselected(LLPointer<LLUIImage> image)
{
mImageUnselected = image;
@@ -970,16 +1019,7 @@ void LLButton::setImageUnselected(LLPointer<LLUIImage> image)
void LLButton::autoResize()
{
- LLUIString label;
- if(getToggleState())
- {
- label = mSelectedLabel;
- }
- else
- {
- label = mUnselectedLabel;
- }
- resize(label);
+ resize(getCurrentLabel());
}
void LLButton::resize(LLUIString label)
@@ -989,11 +1029,32 @@ void LLButton::resize(LLUIString label)
// get current btn length
S32 btn_width =getRect().getWidth();
// check if it need resize
- if (mAutoResize == TRUE)
+ if (mAutoResize)
{
- if (btn_width - (mRightHPad + mLeftHPad) < label_width)
+ S32 min_width = label_width + mLeftHPad + mRightHPad;
+ if (mImageOverlay)
{
- setRect(LLRect( getRect().mLeft, getRect().mTop, getRect().mLeft + label_width + mLeftHPad + mRightHPad , getRect().mBottom));
+ S32 overlay_width = mImageOverlay->getWidth();
+ F32 scale_factor = (getRect().getHeight() - (mImageOverlayBottomPad + mImageOverlayTopPad)) / (F32)mImageOverlay->getHeight();
+ overlay_width = llround((F32)overlay_width * scale_factor);
+
+ switch(mImageOverlayAlignment)
+ {
+ case LLFontGL::LEFT:
+ case LLFontGL::RIGHT:
+ min_width += overlay_width + mImgOverlayLabelSpace;
+ break;
+ case LLFontGL::HCENTER:
+ min_width = llmax(min_width, overlay_width + mLeftHPad + mRightHPad);
+ break;
+ default:
+ // draw nothing
+ break;
+ }
+ }
+ if (btn_width < min_width)
+ {
+ reshape(min_width, getRect().getHeight());
}
}
}
@@ -1140,7 +1201,7 @@ void LLButton::setFloaterToggle(LLUICtrl* ctrl, const LLSD& sdname)
// Set the button control value (toggle state) to the floater visibility control (Sets the value as well)
button->setControlVariable(LLFloater::getControlGroup()->getControl(vis_control_name));
// Set the clicked callback to toggle the floater
- button->setClickedCallback(boost::bind(&LLFloaterReg::toggleFloaterInstance, sdname));
+ button->setClickedCallback(boost::bind(&LLFloaterReg::toggleInstance, sdname, LLSD()));
}
// static
@@ -1181,7 +1242,6 @@ void LLButton::resetMouseDownTimer()
mMouseDownTimer.reset();
}
-
BOOL LLButton::handleDoubleClick(S32 x, S32 y, MASK mask)
{
// just treat a double click as a second click
diff --git a/indra/llui/llbutton.h b/indra/llui/llbutton.h
index 5968916006..deaa0823c6 100644
--- a/indra/llui/llbutton.h
+++ b/indra/llui/llbutton.h
@@ -91,10 +91,11 @@ public:
label_color_selected,
label_color_disabled,
label_color_disabled_selected,
- highlight_color,
image_color,
image_color_disabled,
image_overlay_color,
+ image_overlay_selected_color,
+ image_overlay_disabled_color,
flash_color;
// layout
@@ -120,7 +121,8 @@ public:
// misc
Optional<bool> is_toggle,
scale_image,
- commit_on_return;
+ commit_on_return,
+ display_pressed_state;
Optional<F32> hover_glow_amount;
Optional<TimeIntervalParam> held_down_delay;
@@ -131,6 +133,9 @@ public:
Optional<bool> handle_right_mouse;
+ Optional<S32> button_flash_count;
+ Optional<F32> button_flash_rate;
+
Params();
};
@@ -157,7 +162,6 @@ public:
virtual void draw();
/*virtual*/ BOOL postBuild();
- virtual void onMouseEnter(S32 x, S32 y, MASK mask);
virtual void onMouseLeave(S32 x, S32 y, MASK mask);
virtual void onMouseCaptureLost();
@@ -168,6 +172,11 @@ public:
void setUseEllipses( BOOL use_ellipses ) { mUseEllipses = use_ellipses; }
+ boost::signals2::connection setClickedCallback(const CommitCallbackParam& cb);
+ boost::signals2::connection setMouseDownCallback(const CommitCallbackParam& cb);
+ boost::signals2::connection setMouseUpCallback(const CommitCallbackParam& cb);
+ boost::signals2::connection setHeldDownCallback(const CommitCallbackParam& cb);
+
boost::signals2::connection setClickedCallback( const commit_signal_t::slot_type& cb ); // mouse down and up within button
boost::signals2::connection setMouseDownCallback( const commit_signal_t::slot_type& cb );
boost::signals2::connection setMouseUpCallback( const commit_signal_t::slot_type& cb ); // mouse up, EVEN IF NOT IN BUTTON
@@ -235,6 +244,8 @@ public:
S32 getLastDrawCharsCount() const { return mLastDrawCharsCount; }
+ bool labelIsTruncated() const;
+ const LLUIString& getCurrentLabel() const;
void setScaleImage(BOOL scale) { mScaleImage = scale; }
BOOL getScaleImage() const { return mScaleImage; }
@@ -270,14 +281,16 @@ public:
protected:
LLPointer<LLUIImage> getImageUnselected() const { return mImageUnselected; }
LLPointer<LLUIImage> getImageSelected() const { return mImageSelected; }
+ void getOverlayImageSize(S32& overlay_width, S32& overlay_height);
LLFrameTimer mMouseDownTimer;
+ bool mNeedsHighlight;
+ S32 mButtonFlashCount;
+ F32 mButtonFlashRate;
-private:
void drawBorder(LLUIImage* imagep, const LLColor4& color, S32 size);
void resetMouseDownTimer();
-private:
commit_signal_t* mMouseDownSignal;
commit_signal_t* mMouseUpSignal;
commit_signal_t* mHeldDownSignal;
@@ -293,6 +306,8 @@ private:
LLPointer<LLUIImage> mImageOverlay;
LLFontGL::HAlign mImageOverlayAlignment;
LLUIColor mImageOverlayColor;
+ LLUIColor mImageOverlaySelectedColor;
+ LLUIColor mImageOverlayDisabledColor;
LLPointer<LLUIImage> mImageUnselected;
LLUIString mUnselectedLabel;
@@ -321,21 +336,19 @@ private:
flash icon name is set in attributes(by default it isn't). First way is used otherwise. */
LLPointer<LLUIImage> mImageFlash;
- LLUIColor mHighlightColor;
LLUIColor mFlashBgColor;
LLUIColor mImageColor;
LLUIColor mDisabledImageColor;
- BOOL mIsToggle;
- BOOL mScaleImage;
-
- BOOL mDropShadowedText;
- BOOL mAutoResize;
- BOOL mUseEllipses;
- BOOL mBorderEnabled;
+ bool mIsToggle;
+ bool mScaleImage;
- BOOL mFlashing;
+ bool mDropShadowedText;
+ bool mAutoResize;
+ bool mUseEllipses;
+ bool mBorderEnabled;
+ bool mFlashing;
LLFontGL::HAlign mHAlign;
S32 mLeftHPad;
@@ -355,10 +368,10 @@ private:
F32 mHoverGlowStrength;
F32 mCurGlowStrength;
- BOOL mNeedsHighlight;
- BOOL mCommitOnReturn;
- BOOL mFadeWhenDisabled;
+ bool mCommitOnReturn;
+ bool mFadeWhenDisabled;
bool mForcePressedState;
+ bool mDisplayPressedState;
LLFrameTimer mFlashingTimer;
diff --git a/indra/llui/llclipboard.cpp b/indra/llui/llclipboard.cpp
index 984c4ec5fb..6910b962a1 100644
--- a/indra/llui/llclipboard.cpp
+++ b/indra/llui/llclipboard.cpp
@@ -40,6 +40,7 @@ LLClipboard gClipboard;
LLClipboard::LLClipboard()
{
+ mSourceItem = NULL;
}
@@ -134,3 +135,8 @@ BOOL LLClipboard::canPastePrimaryString() const
{
return LLView::getWindow()->isPrimaryTextAvailable();
}
+
+void LLClipboard::setSourceObject(const LLUUID& source_id, LLAssetType::EType type)
+{
+ mSourceItem = new LLInventoryObject (source_id, LLUUID::null, type, "");
+}
diff --git a/indra/llui/llclipboard.h b/indra/llui/llclipboard.h
index 24cb46c3f4..9371b94284 100644
--- a/indra/llui/llclipboard.h
+++ b/indra/llui/llclipboard.h
@@ -30,6 +30,8 @@
#include "llstring.h"
#include "lluuid.h"
+#include "stdenums.h"
+#include "llinventory.h"
class LLClipboard
@@ -52,9 +54,14 @@ public:
BOOL canPastePrimaryString() const;
const LLWString& getPastePrimaryWString(LLUUID* source_id = NULL);
+ // Support clipboard for object known only by their uuid and asset type
+ void setSourceObject(const LLUUID& source_id, LLAssetType::EType type);
+ const LLInventoryObject* getSourceObject() { return mSourceItem; }
+
private:
- LLUUID mSourceID;
+ LLUUID mSourceID;
LLWString mString;
+ LLInventoryObject* mSourceItem;
};
diff --git a/indra/llui/llcommandmanager.cpp b/indra/llui/llcommandmanager.cpp
new file mode 100644
index 0000000000..0e2f3f1961
--- /dev/null
+++ b/indra/llui/llcommandmanager.cpp
@@ -0,0 +1,172 @@
+/**
+ * @file llcommandmanager.cpp
+ * @brief LLCommandManager class
+ *
+ * $LicenseInfo:firstyear=2001&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+// A control that displays the name of the chosen item, which when
+// clicked shows a scrolling box of options.
+
+#include "linden_common.h"
+
+#include "llcommandmanager.h"
+#include "lldir.h"
+#include "llerror.h"
+#include "llxuiparser.h"
+
+#include <boost/foreach.hpp>
+
+
+//
+// LLCommandId class
+//
+
+const LLCommandId LLCommandId::null = LLCommandId("null command");
+
+//
+// LLCommand class
+//
+
+LLCommand::Params::Params()
+ : available_in_toybox("available_in_toybox", false)
+ , icon("icon")
+ , label_ref("label_ref")
+ , name("name")
+ , tooltip_ref("tooltip_ref")
+ , execute_function("execute_function")
+ , execute_parameters("execute_parameters")
+ , execute_stop_function("execute_stop_function")
+ , execute_stop_parameters("execute_stop_parameters")
+ , is_enabled_function("is_enabled_function")
+ , is_enabled_parameters("is_enabled_parameters")
+ , is_running_function("is_running_function")
+ , is_running_parameters("is_running_parameters")
+ , is_starting_function("is_starting_function")
+ , is_starting_parameters("is_starting_parameters")
+{
+}
+
+LLCommand::LLCommand(const LLCommand::Params& p)
+ : mIdentifier(p.name)
+ , mAvailableInToybox(p.available_in_toybox)
+ , mIcon(p.icon)
+ , mLabelRef(p.label_ref)
+ , mName(p.name)
+ , mTooltipRef(p.tooltip_ref)
+ , mExecuteFunction(p.execute_function)
+ , mExecuteParameters(p.execute_parameters)
+ , mExecuteStopFunction(p.execute_stop_function)
+ , mExecuteStopParameters(p.execute_stop_parameters)
+ , mIsEnabledFunction(p.is_enabled_function)
+ , mIsEnabledParameters(p.is_enabled_parameters)
+ , mIsRunningFunction(p.is_running_function)
+ , mIsRunningParameters(p.is_running_parameters)
+ , mIsStartingFunction(p.is_starting_function)
+ , mIsStartingParameters(p.is_starting_parameters)
+{
+}
+
+
+//
+// LLCommandManager class
+//
+
+LLCommandManager::LLCommandManager()
+{
+}
+
+LLCommandManager::~LLCommandManager()
+{
+ for (CommandVector::iterator cmdIt = mCommands.begin(); cmdIt != mCommands.end(); ++cmdIt)
+ {
+ LLCommand * command = *cmdIt;
+
+ delete command;
+ }
+}
+
+U32 LLCommandManager::commandCount() const
+{
+ return mCommands.size();
+}
+
+LLCommand * LLCommandManager::getCommand(U32 commandIndex)
+{
+ return mCommands[commandIndex];
+}
+
+LLCommand * LLCommandManager::getCommand(const LLCommandId& commandId)
+{
+ LLCommand * command_match = NULL;
+
+ CommandIndexMap::const_iterator found = mCommandIndices.find(commandId.uuid());
+
+ if (found != mCommandIndices.end())
+ {
+ command_match = mCommands[found->second];
+ }
+
+ return command_match;
+}
+
+void LLCommandManager::addCommand(LLCommand * command)
+{
+ LLCommandId command_id = command->id();
+ mCommandIndices[command_id.uuid()] = mCommands.size();
+ mCommands.push_back(command);
+
+ lldebugs << "Successfully added command: " << command->name() << llendl;
+}
+
+//static
+bool LLCommandManager::load()
+{
+ LLCommandManager& mgr = LLCommandManager::instance();
+
+ std::string commands_file = gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "commands.xml");
+
+ LLCommandManager::Params commandsParams;
+
+ LLSimpleXUIParser parser;
+
+ if (!parser.readXUI(commands_file, commandsParams))
+ {
+ llerrs << "Unable to load xml file: " << commands_file << llendl;
+ return false;
+ }
+
+ if (!commandsParams.validateBlock())
+ {
+ llerrs << "Invalid commands file: " << commands_file << llendl;
+ return false;
+ }
+
+ BOOST_FOREACH(LLCommand::Params& commandParams, commandsParams.commands)
+ {
+ LLCommand * command = new LLCommand(commandParams);
+
+ mgr.addCommand(command);
+ }
+
+ return true;
+}
diff --git a/indra/llui/llcommandmanager.h b/indra/llui/llcommandmanager.h
new file mode 100644
index 0000000000..a7276a48aa
--- /dev/null
+++ b/indra/llui/llcommandmanager.h
@@ -0,0 +1,202 @@
+/**
+ * @file llcommandmanager.h
+ * @brief LLCommandManager class to hold commands
+ *
+ * $LicenseInfo:firstyear=2001&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLCOMMANDMANAGER_H
+#define LL_LLCOMMANDMANAGER_H
+
+#include "llinitparam.h"
+#include "llsingleton.h"
+
+
+class LLCommand;
+class LLCommandManager;
+
+
+class LLCommandId
+{
+public:
+ friend class LLCommand;
+ friend class LLCommandManager;
+
+ struct Params : public LLInitParam::Block<Params>
+ {
+ Mandatory<std::string> name;
+
+ Params()
+ : name("name")
+ {}
+ };
+
+ LLCommandId(const std::string& name)
+ {
+ mUUID = LLUUID::generateNewID(name);
+ }
+
+ LLCommandId(const Params& p)
+ {
+ mUUID = LLUUID::generateNewID(p.name);
+ }
+
+ LLCommandId(const LLUUID& uuid)
+ : mUUID(uuid)
+ {}
+
+ const LLUUID& uuid() const { return mUUID; }
+
+ bool operator!=(const LLCommandId& command) const
+ {
+ return (mUUID != command.mUUID);
+ }
+
+ bool operator==(const LLCommandId& command) const
+ {
+ return (mUUID == command.mUUID);
+ }
+
+ static const LLCommandId null;
+
+private:
+ LLUUID mUUID;
+};
+
+typedef std::list<LLCommandId> command_id_list_t;
+
+
+class LLCommand
+{
+public:
+ struct Params : public LLInitParam::Block<Params>
+ {
+ Mandatory<bool> available_in_toybox;
+ Mandatory<std::string> icon;
+ Mandatory<std::string> label_ref;
+ Mandatory<std::string> name;
+ Mandatory<std::string> tooltip_ref;
+
+ Mandatory<std::string> execute_function;
+ Optional<LLSD> execute_parameters;
+
+ Optional<std::string> execute_stop_function;
+ Optional<LLSD> execute_stop_parameters;
+
+ Optional<std::string> is_enabled_function;
+ Optional<LLSD> is_enabled_parameters;
+
+ Optional<std::string> is_running_function;
+ Optional<LLSD> is_running_parameters;
+
+ Optional<std::string> is_starting_function;
+ Optional<LLSD> is_starting_parameters;
+
+ Params();
+ };
+
+ LLCommand(const LLCommand::Params& p);
+
+ const bool availableInToybox() const { return mAvailableInToybox; }
+ const std::string& icon() const { return mIcon; }
+ const LLCommandId& id() const { return mIdentifier; }
+ const std::string& labelRef() const { return mLabelRef; }
+ const std::string& name() const { return mName; }
+ const std::string& tooltipRef() const { return mTooltipRef; }
+
+ const std::string& executeFunctionName() const { return mExecuteFunction; }
+ const LLSD& executeParameters() const { return mExecuteParameters; }
+
+ const std::string& executeStopFunctionName() const { return mExecuteStopFunction; }
+ const LLSD& executeStopParameters() const { return mExecuteStopParameters; }
+
+ const std::string& isEnabledFunctionName() const { return mIsEnabledFunction; }
+ const LLSD& isEnabledParameters() const { return mIsEnabledParameters; }
+
+ const std::string& isRunningFunctionName() const { return mIsRunningFunction; }
+ const LLSD& isRunningParameters() const { return mIsRunningParameters; }
+
+ const std::string& isStartingFunctionName() const { return mIsStartingFunction; }
+ const LLSD& isStartingParameters() const { return mIsStartingParameters; }
+
+private:
+ LLCommandId mIdentifier;
+
+ bool mAvailableInToybox;
+ std::string mIcon;
+ std::string mLabelRef;
+ std::string mName;
+ std::string mTooltipRef;
+
+ std::string mExecuteFunction;
+ LLSD mExecuteParameters;
+
+ std::string mExecuteStopFunction;
+ LLSD mExecuteStopParameters;
+
+ std::string mIsEnabledFunction;
+ LLSD mIsEnabledParameters;
+
+ std::string mIsRunningFunction;
+ LLSD mIsRunningParameters;
+
+ std::string mIsStartingFunction;
+ LLSD mIsStartingParameters;
+};
+
+
+class LLCommandManager
+: public LLSingleton<LLCommandManager>
+{
+public:
+ struct Params : public LLInitParam::Block<Params>
+ {
+ Multiple< LLCommand::Params, AtLeast<1> > commands;
+
+ Params()
+ : commands("command")
+ {
+ }
+ };
+
+ LLCommandManager();
+ ~LLCommandManager();
+
+ U32 commandCount() const;
+ LLCommand * getCommand(U32 commandIndex);
+ LLCommand * getCommand(const LLCommandId& commandId);
+
+ static bool load();
+
+protected:
+ void addCommand(LLCommand * command);
+
+private:
+ typedef std::map<LLUUID, U32> CommandIndexMap;
+ typedef std::vector<LLCommand *> CommandVector;
+
+ CommandVector mCommands;
+ CommandIndexMap mCommandIndices;
+};
+
+
+#endif // LL_LLCOMMANDMANAGER_H
diff --git a/indra/llui/lldockablefloater.cpp b/indra/llui/lldockablefloater.cpp
index ca2dc644a4..3396213f1c 100644
--- a/indra/llui/lldockablefloater.cpp
+++ b/indra/llui/lldockablefloater.cpp
@@ -82,7 +82,7 @@ BOOL LLDockableFloater::postBuild()
mForceDocking = true;
}
- mDockTongue = LLUI::getUIImage("windows/Flyout_Pointer.png");
+ mDockTongue = LLUI::getUIImage("Flyout_Pointer");
LLFloater::setDocked(true);
return LLView::postBuild();
}
@@ -162,10 +162,15 @@ void LLDockableFloater::setVisible(BOOL visible)
void LLDockableFloater::setMinimized(BOOL minimize)
{
- if(minimize)
+ if(minimize && isDocked())
{
+ // minimizing a docked floater just hides it
setVisible(FALSE);
}
+ else
+ {
+ LLFloater::setMinimized(minimize);
+ }
}
LLView * LLDockableFloater::getDockWidget()
@@ -234,8 +239,21 @@ void LLDockableFloater::setDockControl(LLDockControl* dockControl)
setDocked(isDocked());
}
-const LLUIImagePtr& LLDockableFloater::getDockTongue()
+const LLUIImagePtr& LLDockableFloater::getDockTongue(LLDockControl::DocAt dock_side)
{
+ switch(dock_side)
+ {
+ case LLDockControl::LEFT:
+ mDockTongue = LLUI::getUIImage("Flyout_Left");
+ break;
+ case LLDockControl::RIGHT:
+ mDockTongue = LLUI::getUIImage("Flyout_Right");
+ break;
+ default:
+ mDockTongue = LLUI::getUIImage("Flyout_Pointer");
+ break;
+ }
+
return mDockTongue;
}
diff --git a/indra/llui/lldockablefloater.h b/indra/llui/lldockablefloater.h
index 8deb6c1159..89c9852f4a 100644
--- a/indra/llui/lldockablefloater.h
+++ b/indra/llui/lldockablefloater.h
@@ -113,6 +113,8 @@ public:
bool getUniqueDocking() { return mUniqueDocking; }
bool getUseTongue() { return mUseTongue; }
+
+ void setUseTongue(bool use_tongue) { mUseTongue = use_tongue;}
private:
/**
* Provides unique of dockable floater.
@@ -122,7 +124,7 @@ private:
protected:
void setDockControl(LLDockControl* dockControl);
- const LLUIImagePtr& getDockTongue();
+ const LLUIImagePtr& getDockTongue(LLDockControl::DocAt dock_side = LLDockControl::TOP);
// Checks if docking should be forced.
// It may be useful e.g. if floater created in mouselook mode (see EXT-5609)
diff --git a/indra/llui/lldockcontrol.cpp b/indra/llui/lldockcontrol.cpp
index b1c27126d9..af39e41fa6 100644
--- a/indra/llui/lldockcontrol.cpp
+++ b/indra/llui/lldockcontrol.cpp
@@ -92,19 +92,24 @@ void LLDockControl::setDock(LLView* dockWidget)
void LLDockControl::getAllowedRect(LLRect& rect)
{
- rect = mDockableFloater->getRootView()->getRect();
+ rect = mDockableFloater->getRootView()->getChild<LLView>("non_toolbar_panel")->getRect();
}
void LLDockControl::repositionDockable()
{
+ if (!mDockWidget) return;
LLRect dockRect = mDockWidget->calcScreenRect();
LLRect rootRect;
+ LLRect floater_rect = mDockableFloater->calcScreenRect();
mGetAllowedRectCallback(rootRect);
- // recalculate dockable position if dock position changed, dock visibility changed,
- // root view rect changed or recalculation is forced
- if (mPrevDockRect != dockRect || mDockWidgetVisible != isDockVisible()
- || mRootRect != rootRect || mRecalculateDocablePosition)
+ // recalculate dockable position if:
+ if (mPrevDockRect != dockRect //dock position changed
+ || mDockWidgetVisible != isDockVisible() //dock visibility changed
+ || mRootRect != rootRect //root view rect changed
+ || mFloaterRect != floater_rect //floater rect changed
+ || mRecalculateDockablePosition //recalculation is forced
+ )
{
// undock dockable and off() if dock not visible
if (!isDockVisible())
@@ -135,7 +140,8 @@ void LLDockControl::repositionDockable()
mPrevDockRect = dockRect;
mRootRect = rootRect;
- mRecalculateDocablePosition = false;
+ mFloaterRect = floater_rect;
+ mRecalculateDockablePosition = false;
mDockWidgetVisible = isDockVisible();
}
}
@@ -160,7 +166,7 @@ bool LLDockControl::isDockVisible()
case TOP:
{
// check is dock inside parent rect
- // assume that parent for all dockable flaoters
+ // assume that parent for all dockable floaters
// is the root view
LLRect dockParentRect =
mDockWidget->getRootView()->calcScreenRect();
@@ -202,21 +208,33 @@ void LLDockControl::moveDockable()
switch (mDockAt)
{
case LEFT:
- x = dockRect.mLeft;
- y = dockRect.mTop + mDockTongue->getHeight() + dockableRect.getHeight();
- // check is dockable inside root view rect
- if (x < rootRect.mLeft)
+
+ x = dockRect.mLeft - dockableRect.getWidth();
+ y = dockRect.getCenterY() + dockableRect.getHeight() / 2;
+
+ if (use_tongue)
{
- x = rootRect.mLeft;
+ x -= mDockTongue->getWidth();
}
- if (x + dockableRect.getWidth() > rootRect.mRight)
+
+ mDockTongueX = dockableRect.mRight;
+ mDockTongueY = dockableRect.getCenterY() - mDockTongue->getHeight() / 2;
+
+ break;
+
+ case RIGHT:
+
+ x = dockRect.mRight;
+ y = dockRect.getCenterY() + dockableRect.getHeight() / 2;
+
+ if (use_tongue)
{
- x = rootRect.mRight - dockableRect.getWidth();
+ x += mDockTongue->getWidth();
}
-
- mDockTongueX = x + dockableRect.getWidth()/2 - mDockTongue->getWidth() / 2;
-
- mDockTongueY = dockRect.mTop;
+
+ mDockTongueX = dockRect.mRight;
+ mDockTongueY = dockableRect.getCenterY() - mDockTongue->getHeight() / 2;
+
break;
case TOP:
@@ -314,13 +332,12 @@ void LLDockControl::moveDockable()
dockableRect.setLeftTopAndSize(x, y, dockableRect.getWidth(),
dockableRect.getHeight());
}
+
LLRect localDocableParentRect;
- mDockableFloater->getParent()->screenRectToLocal(dockableRect,
- &localDocableParentRect);
- mDockableFloater->setRect(localDocableParentRect);
- mDockableFloater->screenPointToLocal(mDockTongueX, mDockTongueY,
- &mDockTongueX, &mDockTongueY);
+ mDockableFloater->getParent()->screenRectToLocal(dockableRect, &localDocableParentRect);
+ mDockableFloater->setRect(localDocableParentRect);
+ mDockableFloater->screenPointToLocal(mDockTongueX, mDockTongueY, &mDockTongueX, &mDockTongueY);
}
@@ -329,7 +346,7 @@ void LLDockControl::on()
if (isDockVisible())
{
mEnabled = true;
- mRecalculateDocablePosition = true;
+ mRecalculateDockablePosition = true;
}
}
@@ -340,7 +357,7 @@ void LLDockControl::off()
void LLDockControl::forceRecalculatePosition()
{
- mRecalculateDocablePosition = true;
+ mRecalculateDockablePosition = true;
}
void LLDockControl::drawToungue()
diff --git a/indra/llui/lldockcontrol.h b/indra/llui/lldockcontrol.h
index 2e7359245f..c9602011f6 100644
--- a/indra/llui/lldockcontrol.h
+++ b/indra/llui/lldockcontrol.h
@@ -43,6 +43,7 @@ public:
{
TOP,
LEFT,
+ RIGHT,
BOTTOM
};
@@ -79,12 +80,13 @@ private:
private:
get_allowed_rect_callback_t mGetAllowedRectCallback;
bool mEnabled;
- bool mRecalculateDocablePosition;
+ bool mRecalculateDockablePosition;
bool mDockWidgetVisible;
DocAt mDockAt;
LLView* mDockWidget;
LLRect mPrevDockRect;
LLRect mRootRect;
+ LLRect mFloaterRect;
LLFloater* mDockableFloater;
LLUIImagePtr mDockTongue;
S32 mDockTongueX;
diff --git a/indra/llui/llfloater.cpp b/indra/llui/llfloater.cpp
index bc494e97f5..33548151fd 100644
--- a/indra/llui/llfloater.cpp
+++ b/indra/llui/llfloater.cpp
@@ -58,10 +58,23 @@
#include "llhelp.h"
#include "llmultifloater.h"
#include "llsdutil.h"
+#include <boost/foreach.hpp>
+
// use this to control "jumping" behavior when Ctrl-Tabbing
const S32 TABBED_FLOATER_OFFSET = 0;
+namespace LLInitParam
+{
+ void TypeValues<LLFloaterEnums::EOpenPositioning>::declareValues()
+ {
+ declare("none", LLFloaterEnums::OPEN_POSITIONING_NONE);
+ declare("cascading", LLFloaterEnums::OPEN_POSITIONING_CASCADING);
+ declare("centered", LLFloaterEnums::OPEN_POSITIONING_CENTERED);
+ declare("specified", LLFloaterEnums::OPEN_POSITIONING_SPECIFIED);
+ }
+}
+
std::string LLFloater::sButtonNames[BUTTON_COUNT] =
{
"llfloater_close_btn", //BUTTON_CLOSE
@@ -100,7 +113,6 @@ LLFloater::click_callback LLFloater::sButtonCallbacks[BUTTON_COUNT] =
LLMultiFloater* LLFloater::sHostp = NULL;
BOOL LLFloater::sQuitting = FALSE; // Flag to prevent storing visibility controls while quitting
-LLFloater::handle_map_t LLFloater::sFloaterMap;
LLFloaterView* gFloaterView = NULL;
@@ -154,7 +166,7 @@ LLFloater::Params::Params()
: title("title"),
short_title("short_title"),
single_instance("single_instance", false),
- auto_tile("auto_tile", false),
+ reuse_instance("reuse_instance", false),
can_resize("can_resize", false),
can_minimize("can_minimize", true),
can_close("can_close", true),
@@ -164,7 +176,10 @@ LLFloater::Params::Params()
save_rect("save_rect", false),
save_visibility("save_visibility", false),
can_dock("can_dock", false),
- open_centered("open_centered", false),
+ show_title("show_title", true),
+ open_positioning("open_positioning", LLFloaterEnums::OPEN_POSITIONING_NONE),
+ specified_left("specified_left"),
+ specified_bottom("specified_bottom"),
header_height("header_height", 0),
legacy_header_height("legacy_header_height", 0),
close_image("close_image"),
@@ -180,7 +195,8 @@ LLFloater::Params::Params()
dock_pressed_image("dock_pressed_image"),
help_pressed_image("help_pressed_image"),
open_callback("open_callback"),
- close_callback("close_callback")
+ close_callback("close_callback"),
+ follows("follows")
{
changeDefault(visible, false);
}
@@ -226,13 +242,16 @@ LLFloater::LLFloater(const LLSD& key, const LLFloater::Params& p)
mTitle(p.title),
mShortTitle(p.short_title),
mSingleInstance(p.single_instance),
+ mReuseInstance(p.reuse_instance.isProvided() ? p.reuse_instance : p.single_instance), // reuse single-instance floaters by default
mKey(key),
- mAutoTile(p.auto_tile),
mCanTearOff(p.can_tear_off),
mCanMinimize(p.can_minimize),
mCanClose(p.can_close),
mDragOnLeft(p.can_drag_on_left),
mResizable(p.can_resize),
+ mOpenPositioning(p.open_positioning),
+ mSpecifiedLeft(p.specified_left),
+ mSpecifiedBottom(p.specified_bottom),
mMinWidth(p.min_width),
mMinHeight(p.min_height),
mHeaderHeight(p.header_height),
@@ -251,7 +270,6 @@ LLFloater::LLFloater(const LLSD& key, const LLFloater::Params& p)
mMinimizeSignal(NULL)
// mNotificationContext(NULL)
{
- mHandle.bind(this);
// mNotificationContext = new LLFloaterNotificationContext(getHandle());
// Clicks stop here.
@@ -306,9 +324,6 @@ void LLFloater::initFloater(const Params& p)
// Floaters are created in the invisible state
setVisible(FALSE);
- // add self to handle->floater map
- sFloaterMap[mHandle] = this;
-
if (!getParent())
{
gFloaterView->addChild(this);
@@ -459,15 +474,24 @@ void LLFloater::layoutResizeCtrls()
mResizeHandle[3]->setRect(rect);
}
-void LLFloater::enableResizeCtrls(bool enable)
+void LLFloater::enableResizeCtrls(bool enable, bool width, bool height)
{
+ mResizeBar[LLResizeBar::LEFT]->setVisible(enable && width);
+ mResizeBar[LLResizeBar::LEFT]->setEnabled(enable && width);
+
+ mResizeBar[LLResizeBar::TOP]->setVisible(enable && height);
+ mResizeBar[LLResizeBar::TOP]->setEnabled(enable && height);
+
+ mResizeBar[LLResizeBar::RIGHT]->setVisible(enable && width);
+ mResizeBar[LLResizeBar::RIGHT]->setEnabled(enable && width);
+
+ mResizeBar[LLResizeBar::BOTTOM]->setVisible(enable && height);
+ mResizeBar[LLResizeBar::BOTTOM]->setEnabled(enable && height);
+
for (S32 i = 0; i < 4; ++i)
{
- mResizeBar[i]->setVisible(enable);
- mResizeBar[i]->setEnabled(enable);
-
- mResizeHandle[i]->setVisible(enable);
- mResizeHandle[i]->setEnabled(enable);
+ mResizeHandle[i]->setVisible(enable && width && height);
+ mResizeHandle[i]->setEnabled(enable && width && height);
}
}
@@ -506,8 +530,6 @@ LLFloater::~LLFloater()
// correct, non-minimized positions.
setMinimized( FALSE );
- sFloaterMap.erase(mHandle);
-
delete mDragHandle;
for (S32 i = 0; i < 4; i++)
{
@@ -515,7 +537,6 @@ LLFloater::~LLFloater()
delete mResizeHandle[i];
}
- storeRectControl();
setVisible(false); // We're not visible if we're destroyed
storeVisibilityControl();
storeDockStateControl();
@@ -660,6 +681,12 @@ void LLFloater::openFloater(const LLSD& key)
}
else
{
+ LLFloater* floater_to_stack = LLFloaterReg::getLastFloaterInGroup(mInstanceName);
+ if (!floater_to_stack)
+ {
+ floater_to_stack = LLFloaterReg::getLastFloaterCascading();
+ }
+ applyControlsAndPosition(floater_to_stack);
setMinimized(FALSE);
setVisibleAndFrontmost(mAutoFocus);
}
@@ -752,12 +779,19 @@ void LLFloater::closeFloater(bool app_quitting)
else
{
setVisible(FALSE);
+ if (!mReuseInstance)
+ {
+ destroy();
+ }
}
}
else
{
setVisible(FALSE); // hide before destroying (so handleVisibilityChange() gets called)
- destroy();
+ if (!mReuseInstance)
+ {
+ destroy();
+ }
}
}
}
@@ -822,43 +856,108 @@ LLMultiFloater* LLFloater::getHost()
return (LLMultiFloater*)mHostHandle.get();
}
-void LLFloater::applySavedVariables()
+void LLFloater::applyControlsAndPosition(LLFloater* other)
{
- applyRectControl();
- applyDockState();
+ if (!applyDockState())
+ {
+ if (!applyRectControl())
+ {
+ applyPositioning(other);
+ }
+ }
}
-void LLFloater::applyRectControl()
+bool LLFloater::applyRectControl()
{
- // first, center on screen if requested
- if (mOpenCentered)
+ bool saved_rect = false;
+
+ LLFloater* last_in_group = LLFloaterReg::getLastFloaterInGroup(mInstanceName);
+ if (last_in_group && last_in_group != this)
{
- center();
+ // other floaters in our group, position ourselves relative to them and don't save the rect
+ mRectControl.clear();
+ mOpenPositioning = LLFloaterEnums::OPEN_POSITIONING_CASCADE_GROUP;
}
-
- // override center if we have saved rect control
- if (mRectControl.size() > 1)
+ else if (mRectControl.size() > 1)
{
+ // If we have a saved rect, use it
const LLRect& rect = getControlGroup()->getRect(mRectControl);
- if (rect.getWidth() > 0 && rect.getHeight() > 0)
+ saved_rect = rect.notEmpty();
+ if (saved_rect)
{
- translate( rect.mLeft - getRect().mLeft, rect.mBottom - getRect().mBottom);
+ setOrigin(rect.mLeft, rect.mBottom);
+
if (mResizable)
{
reshape(llmax(mMinWidth, rect.getWidth()), llmax(mMinHeight, rect.getHeight()));
}
}
}
+
+ return saved_rect;
}
-void LLFloater::applyDockState()
+bool LLFloater::applyDockState()
{
+ bool docked = false;
+
if (mDocStateControl.size() > 1)
{
- bool dockState = getControlGroup()->getBOOL(mDocStateControl);
- setDocked(dockState);
+ docked = getControlGroup()->getBOOL(mDocStateControl);
+ setDocked(docked);
}
+ return docked;
+}
+
+void LLFloater::applyPositioning(LLFloater* other)
+{
+ // Otherwise position according to the positioning code
+ switch (mOpenPositioning)
+ {
+ case LLFloaterEnums::OPEN_POSITIONING_CENTERED:
+ center();
+ break;
+
+ case LLFloaterEnums::OPEN_POSITIONING_SPECIFIED:
+ {
+ // Translate relative to snap rect
+ setOrigin(mSpecifiedLeft, mSpecifiedBottom);
+ const LLRect& snap_rect = gFloaterView->getSnapRect();
+ translate(snap_rect.mLeft, snap_rect.mBottom);
+ translateIntoRect(snap_rect, FALSE);
+ }
+ break;
+
+ case LLFloaterEnums::OPEN_POSITIONING_CASCADE_GROUP:
+ case LLFloaterEnums::OPEN_POSITIONING_CASCADING:
+ if (other != NULL && other != this)
+ {
+ stackWith(*other);
+ }
+ else
+ {
+ static const U32 CASCADING_FLOATER_HOFFSET = 0;
+ static const U32 CASCADING_FLOATER_VOFFSET = 0;
+
+ const LLRect& snap_rect = gFloaterView->getSnapRect();
+
+ const S32 horizontal_offset = CASCADING_FLOATER_HOFFSET;
+ const S32 vertical_offset = snap_rect.getHeight() - CASCADING_FLOATER_VOFFSET;
+
+ S32 rect_height = getRect().getHeight();
+ setOrigin(horizontal_offset, vertical_offset - rect_height);
+
+ translate(snap_rect.mLeft, snap_rect.mBottom);
+ translateIntoRect(snap_rect, FALSE);
+ }
+ break;
+
+ case LLFloaterEnums::OPEN_POSITIONING_NONE:
+ default:
+ // Do nothing
+ break;
+ }
}
void LLFloater::applyTitle()
@@ -935,7 +1034,9 @@ BOOL LLFloater::canSnapTo(const LLView* other_view)
if (other_view != getParent())
{
const LLFloater* other_floaterp = dynamic_cast<const LLFloater*>(other_view);
- if (other_floaterp && other_floaterp->getSnapTarget() == getHandle() && mDependents.find(other_floaterp->getHandle()) != mDependents.end())
+ if (other_floaterp
+ && other_floaterp->getSnapTarget() == getHandle()
+ && mDependents.find(other_floaterp->getHandle()) != mDependents.end())
{
// this is a dependent that is already snapped to us, so don't snap back to it
return FALSE;
@@ -967,9 +1068,10 @@ void LLFloater::handleReshape(const LLRect& new_rect, bool by_user)
const LLRect old_rect = getRect();
LLView::handleReshape(new_rect, by_user);
- if (by_user)
+ if (by_user && !isMinimized())
{
storeRectControl();
+ mOpenPositioning = LLFloaterEnums::OPEN_POSITIONING_NONE;
}
// if not minimized, adjust all snapped dependents to new shape
@@ -1029,7 +1131,7 @@ void LLFloater::setMinimized(BOOL minimize)
if (minimize == mMinimized) return;
- if(mMinimizeSignal)
+ if (mMinimizeSignal)
{
(*mMinimizeSignal)(this, LLSD(minimize));
}
@@ -1061,10 +1163,6 @@ void LLFloater::setMinimized(BOOL minimize)
mButtonsEnabled[BUTTON_RESTORE] = TRUE;
}
- if (mDragHandle)
- {
- mDragHandle->setVisible(TRUE);
- }
setBorderVisible(TRUE);
for(handle_set_iter_t dependent_it = mDependents.begin();
@@ -1215,19 +1313,9 @@ void LLFloater::setIsChrome(BOOL is_chrome)
mButtons[BUTTON_CLOSE]->setToolTip(LLStringExplicit(getButtonTooltip(Params(), BUTTON_CLOSE, is_chrome)));
}
- // no titles displayed on "chrome" floaters
- if (mDragHandle)
- mDragHandle->setTitleVisible(!is_chrome);
-
LLPanel::setIsChrome(is_chrome);
}
-void LLFloater::setTitleVisible(bool visible)
-{
- if (mDragHandle)
- mDragHandle->setTitleVisible(visible);
-}
-
// Change the draw style to account for the foreground state.
void LLFloater::setForeground(BOOL front)
{
@@ -1315,7 +1403,10 @@ void LLFloater::moveResizeHandlesToFront()
BOOL LLFloater::isFrontmost()
{
- return gFloaterView && gFloaterView->getFrontmost() == this && getVisible();
+ LLFloaterView* floater_view = getParentByType<LLFloaterView>();
+ return getVisible()
+ && (floater_view
+ && floater_view->getFrontmost() == this);
}
void LLFloater::addDependentFloater(LLFloater* floaterp, BOOL reposition)
@@ -1388,6 +1479,7 @@ BOOL LLFloater::handleMouseDown(S32 x, S32 y, MASK mask)
if(offerClickToButton(x, y, mask, BUTTON_CLOSE)) return TRUE;
if(offerClickToButton(x, y, mask, BUTTON_RESTORE)) return TRUE;
if(offerClickToButton(x, y, mask, BUTTON_TEAR_OFF)) return TRUE;
+ if(offerClickToButton(x, y, mask, BUTTON_DOCK)) return TRUE;
// Otherwise pass to drag handle for movement
return mDragHandle->handleMouseDown(x, y, mask);
@@ -1493,6 +1585,13 @@ void LLFloater::setDocked(bool docked, bool pop_on_undock)
{
mDocked = docked;
mButtonsEnabled[BUTTON_DOCK] = !mDocked;
+
+ if (mDocked)
+ {
+ setMinimized(FALSE);
+ mOpenPositioning = LLFloaterEnums::OPEN_POSITIONING_NONE;
+ }
+
updateTitleButtons();
storeDockStateControl();
@@ -1576,18 +1675,17 @@ void LLFloater::onClickHelp( LLFloater* self )
LLFloater* LLFloater::getClosableFloaterFromFocus()
{
LLFloater* focused_floater = NULL;
-
- handle_map_iter_t iter;
- for(iter = sFloaterMap.begin(); iter != sFloaterMap.end(); ++iter)
+ LLInstanceTracker<LLFloater>::instance_iter it = beginInstances();
+ LLInstanceTracker<LLFloater>::instance_iter end_it = endInstances();
+ for (; it != end_it; ++it)
{
- focused_floater = iter->second;
- if (focused_floater->hasFocus())
+ if (it->hasFocus())
{
break;
}
}
- if (iter == sFloaterMap.end())
+ if (it == endInstances())
{
// nothing found, return
return NULL;
@@ -1731,7 +1829,7 @@ void LLFloater::draw()
{
drawChild(mButtons[i]);
}
- drawChild(mDragHandle);
+ drawChild(mDragHandle, 0, 0, TRUE);
}
else
{
@@ -1848,6 +1946,12 @@ void LLFloater::setCanDrag(BOOL can_drag)
}
}
+bool LLFloater::getCanDrag()
+{
+ return mDragHandle->getEnabled();
+}
+
+
void LLFloater::updateTitleButtons()
{
static LLUICachedControl<S32> floater_close_box_size ("UIFloaterCloseBoxSize", 0);
@@ -2062,8 +2166,15 @@ LLFloaterView::LLFloaterView (const Params& p)
// By default, adjust vertical.
void LLFloaterView::reshape(S32 width, S32 height, BOOL called_from_parent)
{
- S32 old_width = getRect().getWidth();
- S32 old_height = getRect().getHeight();
+ S32 old_right = mLastSnapRect.mRight;
+ S32 old_top = mLastSnapRect.mTop;
+
+ LLView::reshape(width, height, called_from_parent);
+
+ S32 new_right = getSnapRect().mRight;
+ S32 new_top = getSnapRect().mTop;
+
+ mLastSnapRect = getSnapRect();
for ( child_list_const_iter_t child_it = getChildList()->begin(); child_it != getChildList()->end(); ++child_it)
{
@@ -2071,66 +2182,48 @@ void LLFloaterView::reshape(S32 width, S32 height, BOOL called_from_parent)
LLFloater* floaterp = (LLFloater*)viewp;
if (floaterp->isDependent())
{
- // dependents use same follow flags as their "dependee"
+ // dependents are moved with their "dependee"
continue;
}
- // Make if follow the edge it is closest to
- U32 follow_flags = 0x0;
-
- if (floaterp->isMinimized())
- {
- follow_flags |= (FOLLOWS_LEFT | FOLLOWS_TOP);
- }
- else
+ if (!floaterp->isMinimized())
{
LLRect r = floaterp->getRect();
// Compute absolute distance from each edge of screen
S32 left_offset = llabs(r.mLeft - 0);
- S32 right_offset = llabs(old_width - r.mRight);
+ S32 right_offset = llabs(old_right - r.mRight);
- S32 top_offset = llabs(old_height - r.mTop);
+ S32 top_offset = llabs(old_top - r.mTop);
S32 bottom_offset = llabs(r.mBottom - 0);
+ S32 translate_x = 0;
+ S32 translate_y = 0;
- if (left_offset < right_offset)
- {
- follow_flags |= FOLLOWS_LEFT;
- }
- else
+ if (left_offset > right_offset)
{
- follow_flags |= FOLLOWS_RIGHT;
+ translate_x = new_right - old_right;
}
- // "No vertical adjustment" usually means that the bottom of the view
- // has been pushed up or down. Hence we want the floaters to follow
- // the top.
if (top_offset < bottom_offset)
{
- follow_flags |= FOLLOWS_TOP;
+ translate_y = new_top - old_top;
}
- else
+
+ // don't reposition immovable floaters
+ if (floaterp->getCanDrag())
{
- follow_flags |= FOLLOWS_BOTTOM;
+ floaterp->translate(translate_x, translate_y);
}
- }
-
- floaterp->setFollows(follow_flags);
-
- //RN: all dependent floaters copy follow behavior of "parent"
- for(LLFloater::handle_set_iter_t dependent_it = floaterp->mDependents.begin();
- dependent_it != floaterp->mDependents.end(); ++dependent_it)
- {
- LLFloater* dependent_floaterp = dependent_it->get();
- if (dependent_floaterp)
+ BOOST_FOREACH(LLHandle<LLFloater> dependent_floater, floaterp->mDependents)
{
- dependent_floaterp->setFollows(follow_flags);
+ if (dependent_floater.get())
+ {
+ dependent_floater.get()->translate(translate_x, translate_y);
+ }
}
}
}
-
- LLView::reshape(width, height, called_from_parent);
}
@@ -2451,6 +2544,52 @@ void LLFloaterView::closeAllChildren(bool app_quitting)
}
}
+void LLFloaterView::hiddenFloaterClosed(LLFloater* floater)
+{
+ for (hidden_floaters_t::iterator it = mHiddenFloaters.begin(), end_it = mHiddenFloaters.end();
+ it != end_it;
+ ++it)
+ {
+ if (it->first.get() == floater)
+ {
+ it->second.disconnect();
+ mHiddenFloaters.erase(it);
+ break;
+ }
+ }
+}
+
+void LLFloaterView::hideAllFloaters()
+{
+ child_list_t child_list = *(getChildList());
+
+ for (child_list_iter_t it = child_list.begin(); it != child_list.end(); ++it)
+ {
+ LLFloater* floaterp = dynamic_cast<LLFloater*>(*it);
+ if (floaterp && floaterp->getVisible())
+ {
+ floaterp->setVisible(false);
+ boost::signals2::connection connection = floaterp->mCloseSignal.connect(boost::bind(&LLFloaterView::hiddenFloaterClosed, this, floaterp));
+ mHiddenFloaters.push_back(std::make_pair(floaterp->getHandle(), connection));
+ }
+ }
+}
+
+void LLFloaterView::showHiddenFloaters()
+{
+ for (hidden_floaters_t::iterator it = mHiddenFloaters.begin(), end_it = mHiddenFloaters.end();
+ it != end_it;
+ ++it)
+ {
+ LLFloater* floaterp = it->first.get();
+ if (floaterp)
+ {
+ floaterp->setVisible(true);
+ }
+ it->second.disconnect();
+ }
+ mHiddenFloaters.clear();
+}
BOOL LLFloaterView::allChildrenClosed()
{
@@ -2484,6 +2623,12 @@ void LLFloaterView::shiftFloaters(S32 x_offset, S32 y_offset)
void LLFloaterView::refresh()
{
+ LLRect snap_rect = getSnapRect();
+ if (snap_rect != mLastSnapRect)
+ {
+ reshape(getRect().getWidth(), getRect().getHeight(), TRUE);
+ }
+
// Constrain children to be entirely on the screen
for ( child_list_const_iter_t child_it = getChildList()->begin(); child_it != getChildList()->end(); ++child_it)
{
@@ -2549,7 +2694,7 @@ void LLFloaterView::adjustToFitScreen(LLFloater* floater, BOOL allow_partial_out
}
// move window fully onscreen
- if (floater->translateIntoRect( getLocalRect(), allow_partial_outside ))
+ if (floater->translateIntoRect( getSnapRect(), allow_partial_outside ))
{
floater->clearSnapTarget();
}
@@ -2775,7 +2920,6 @@ void LLFloater::setInstanceName(const std::string& name)
{
mDocStateControl = LLFloaterReg::declareDockStateControl(ctrl_name);
}
-
}
}
@@ -2822,6 +2966,9 @@ void LLFloater::initFromParams(const LLFloater::Params& p)
// control_name, tab_stop, focus_lost_callback, initial_value, rect, enabled, visible
LLPanel::initFromParams(p);
+ // override any follows flags
+ setFollows(FOLLOWS_NONE);
+
mTitle = p.title;
mShortTitle = p.short_title;
applyTitle();
@@ -2837,8 +2984,11 @@ void LLFloater::initFromParams(const LLFloater::Params& p)
mHeaderHeight = p.header_height;
mLegacyHeaderHeight = p.legacy_header_height;
mSingleInstance = p.single_instance;
- mAutoTile = p.auto_tile;
- mOpenCentered = p.open_centered;
+ mReuseInstance = p.reuse_instance.isProvided() ? p.reuse_instance : p.single_instance;
+
+ mOpenPositioning = p.open_positioning;
+ mSpecifiedLeft = p.specified_left;
+ mSpecifiedBottom = p.specified_bottom;
if (p.save_rect && mRectControl.empty())
{
@@ -2848,7 +2998,6 @@ void LLFloater::initFromParams(const LLFloater::Params& p)
{
mVisibilityControl = "t"; // flag to build mVisibilityControl name once mInstanceName is set
}
-
if(p.save_dock_state)
{
mDocStateControl = "t"; // flag to build mDocStateControl name once mInstanceName is set
@@ -2857,13 +3006,18 @@ void LLFloater::initFromParams(const LLFloater::Params& p)
// open callback
if (p.open_callback.isProvided())
{
- mOpenSignal.connect(initCommitCallback(p.open_callback));
+ setOpenCallback(initCommitCallback(p.open_callback));
}
// close callback
if (p.close_callback.isProvided())
{
setCloseCallback(initCommitCallback(p.close_callback));
}
+
+ if (mDragHandle)
+ {
+ mDragHandle->setTitleVisible(p.show_title);
+ }
}
boost::signals2::connection LLFloater::setMinimizeCallback( const commit_signal_t::slot_type& cb )
@@ -2872,6 +3026,11 @@ boost::signals2::connection LLFloater::setMinimizeCallback( const commit_signal_
return mMinimizeSignal->connect(cb);
}
+boost::signals2::connection LLFloater::setOpenCallback( const commit_signal_t::slot_type& cb )
+{
+ return mOpenSignal.connect(cb);
+}
+
boost::signals2::connection LLFloater::setCloseCallback( const commit_signal_t::slot_type& cb )
{
return mCloseSignal.connect(cb);
@@ -2916,7 +3075,9 @@ bool LLFloater::initFloaterXML(LLXMLNodePtr node, LLView *parent, const std::str
return FALSE;
}
- parser.readXUI(referenced_xml, params, LLUICtrlFactory::getInstance()->getCurFileName());
+ Params referenced_params;
+ parser.readXUI(referenced_xml, referenced_params, LLUICtrlFactory::getInstance()->getCurFileName());
+ params.fillFrom(referenced_params);
// add children using dimensions from referenced xml for consistent layout
setShape(params.rect);
@@ -3105,7 +3266,6 @@ void LLFloater::stackWith(LLFloater& other)
next_rect.setLeftTopAndSize(next_rect.mLeft, next_rect.mTop, getRect().getWidth(), getRect().getHeight());
- mRectControl.clear(); // don't save rect of stacked floaters
setShape(next_rect);
}
diff --git a/indra/llui/llfloater.h b/indra/llui/llfloater.h
index 58c2d34253..59b35d206f 100644
--- a/indra/llui/llfloater.h
+++ b/indra/llui/llfloater.h
@@ -35,6 +35,7 @@
#include "lluuid.h"
//#include "llnotificationsutil.h"
#include <set>
+#include <boost/signals2.hpp>
class LLDragHandle;
class LLResizeHandle;
@@ -59,11 +60,35 @@ const BOOL CLOSE_NO = FALSE;
const BOOL ADJUST_VERTICAL_YES = TRUE;
const BOOL ADJUST_VERTICAL_NO = FALSE;
-class LLFloater : public LLPanel
+namespace LLFloaterEnums
{
-friend class LLFloaterView;
-friend class LLFloaterReg;
-friend class LLMultiFloater;
+ enum EOpenPositioning
+ {
+ OPEN_POSITIONING_NONE,
+ OPEN_POSITIONING_CASCADING,
+ OPEN_POSITIONING_CASCADE_GROUP,
+ OPEN_POSITIONING_CENTERED,
+ OPEN_POSITIONING_SPECIFIED,
+ OPEN_POSITIONING_COUNT
+ };
+}
+
+namespace LLInitParam
+{
+ template<>
+ struct TypeValues<LLFloaterEnums::EOpenPositioning> : public TypeValuesHelper<LLFloaterEnums::EOpenPositioning>
+ {
+ static void declareValues();
+ };
+}
+
+
+class LLFloater : public LLPanel, public LLInstanceTracker<LLFloater>
+{
+ friend class LLFloaterView;
+ friend class LLFloaterReg;
+ friend class LLMultiFloater;
+
public:
struct KeyCompare
{
@@ -95,7 +120,7 @@ public:
short_title;
Optional<bool> single_instance,
- auto_tile,
+ reuse_instance,
can_resize,
can_minimize,
can_close,
@@ -105,7 +130,13 @@ public:
save_visibility,
save_dock_state,
can_dock,
- open_centered;
+ show_title;
+
+ Optional<LLFloaterEnums::EOpenPositioning> open_positioning;
+ Optional<S32> specified_left;
+ Optional<S32> specified_bottom;
+
+
Optional<S32> header_height,
legacy_header_height; // HACK see initFromXML()
@@ -125,6 +156,8 @@ public:
Optional<CommitCallbackParam> open_callback,
close_callback;
+
+ Ignored follows;
Params();
};
@@ -144,6 +177,7 @@ public:
bool buildFromFile(const std::string &filename, LLXMLNodePtr output_node = NULL);
boost::signals2::connection setMinimizeCallback( const commit_signal_t::slot_type& cb );
+ boost::signals2::connection setOpenCallback( const commit_signal_t::slot_type& cb );
boost::signals2::connection setCloseCallback( const commit_signal_t::slot_type& cb );
void initFromParams(const LLFloater::Params& p);
@@ -179,7 +213,6 @@ public:
std::string getTitle() const;
void setShortTitle( const std::string& short_title );
std::string getShortTitle() const;
- void setTitleVisible(bool visible);
virtual void setMinimized(BOOL b);
void moveResizeHandlesToFront();
void addDependentFloater(LLFloater* dependent, BOOL reposition = TRUE);
@@ -203,6 +236,7 @@ public:
void setCanTearOff(BOOL can_tear_off);
virtual void setCanResize(BOOL can_resize);
void setCanDrag(BOOL can_drag);
+ bool getCanDrag();
void setHost(LLMultiFloater* host);
BOOL isResizable() const { return mResizable; }
void setResizeLimits( S32 min_width, S32 min_height );
@@ -251,7 +285,7 @@ public:
void clearSnapTarget() { mSnappedTo.markDead(); }
LLHandle<LLFloater> getSnapTarget() const { return mSnappedTo; }
- LLHandle<LLFloater> getHandle() const { return mHandle; }
+ LLHandle<LLFloater> getHandle() const { return getDerivedHandle<LLFloater>(); }
const LLSD& getKey() { return mKey; }
virtual bool matchesKey(const LLSD& key) { return mSingleInstance || KeyCompare::equate(key, mKey); }
@@ -265,8 +299,6 @@ public:
virtual void setTornOff(bool torn_off) { mTornOff = torn_off; }
- void stackWith(LLFloater& other);
-
// Return a closeable floater, if any, given the current focus.
static LLFloater* getClosableFloaterFromFocus();
@@ -290,11 +322,17 @@ public:
void updateTransparency(ETypeTransparency transparency_type);
+ void enableResizeCtrls(bool enable, bool width = true, bool height = true);
+
+ bool isPositioning(LLFloaterEnums::EOpenPositioning p) const { return (p == mOpenPositioning); }
protected:
- virtual void applySavedVariables();
+ void applyControlsAndPosition(LLFloater* other);
- void applyRectControl();
- void applyDockState();
+ void stackWith(LLFloater& other);
+
+ virtual bool applyRectControl();
+ bool applyDockState();
+ void applyPositioning(LLFloater* other);
void storeRectControl();
void storeVisibilityControl();
void storeDockStateControl();
@@ -339,7 +377,6 @@ private:
BOOL offerClickToButton(S32 x, S32 y, MASK mask, EFloaterButton index);
void addResizeCtrls();
void layoutResizeCtrls();
- void enableResizeCtrls(bool enable);
void addDragHandle();
void layoutDragHandle(); // repair layout
@@ -376,15 +413,18 @@ private:
LLUIString mShortTitle;
BOOL mSingleInstance; // TRUE if there is only ever one instance of the floater
+ bool mReuseInstance; // true if we want to hide the floater when we close it instead of destroying it
std::string mInstanceName; // Store the instance name so we can remove ourselves from the list
- BOOL mAutoTile; // TRUE if placement of new instances tiles
BOOL mCanTearOff;
BOOL mCanMinimize;
BOOL mCanClose;
BOOL mDragOnLeft;
BOOL mResizable;
- bool mOpenCentered;
+
+ LLFloaterEnums::EOpenPositioning mOpenPositioning;
+ S32 mSpecifiedLeft;
+ S32 mSpecifiedBottom;
S32 mMinWidth;
S32 mMinHeight;
@@ -423,18 +463,9 @@ private:
typedef void(*click_callback)(LLFloater*);
static click_callback sButtonCallbacks[BUTTON_COUNT];
- typedef std::map<LLHandle<LLFloater>, LLFloater*> handle_map_t;
- typedef std::map<LLHandle<LLFloater>, LLFloater*>::iterator handle_map_iter_t;
- static handle_map_t sFloaterMap;
-
- std::vector<LLHandle<LLView> > mMinimizedHiddenChildren;
-
BOOL mHasBeenDraggedWhileMinimized;
S32 mPreviousMinimizedBottom;
S32 mPreviousMinimizedLeft;
-
-// LLFloaterNotificationContext* mNotificationContext;
- LLRootHandle<LLFloater> mHandle;
};
@@ -482,6 +513,10 @@ public:
BOOL allChildrenClosed();
void shiftFloaters(S32 x_offset, S32 y_offset);
+ void hideAllFloaters();
+ void showHiddenFloaters();
+
+
LLFloater* getFrontmost() const;
LLFloater* getBackmost() const;
LLFloater* getParentFloater(LLView* viewp) const;
@@ -496,11 +531,16 @@ public:
void setFloaterSnapView(LLHandle<LLView> snap_view) {mSnapView = snap_view; }
private:
+ void hiddenFloaterClosed(LLFloater* floater);
+
+ LLRect mLastSnapRect;
LLHandle<LLView> mSnapView;
BOOL mFocusCycleMode;
S32 mSnapOffsetBottom;
S32 mSnapOffsetRight;
S32 mMinimizePositionVOffset;
+ typedef std::vector<std::pair<LLHandle<LLFloater>, boost::signals2::connection> > hidden_floaters_t;
+ hidden_floaters_t mHiddenFloaters;
};
//
diff --git a/indra/llui/llfloaterreg.cpp b/indra/llui/llfloaterreg.cpp
index fc7dcfcc4e..e144b68f5e 100644
--- a/indra/llui/llfloaterreg.cpp
+++ b/indra/llui/llfloaterreg.cpp
@@ -59,19 +59,57 @@ void LLFloaterReg::add(const std::string& name, const std::string& filename, con
//static
LLFloater* LLFloaterReg::getLastFloaterInGroup(const std::string& name)
{
- LLRect rect;
const std::string& groupname = sGroupMap[name];
if (!groupname.empty())
{
instance_list_t& list = sInstanceMap[groupname];
if (!list.empty())
{
- return list.back();
+ for (instance_list_t::reverse_iterator iter = list.rbegin(); iter != list.rend(); ++iter)
+ {
+ LLFloater* inst = *iter;
+
+ if (inst->getVisible() && !inst->isMinimized())
+ {
+ return inst;
+ }
+ }
}
}
return NULL;
}
+LLFloater* LLFloaterReg::getLastFloaterCascading()
+{
+ LLRect candidate_rect;
+ candidate_rect.mTop = 100000;
+ LLFloater* candidate_floater = NULL;
+
+ std::map<std::string,std::string>::const_iterator it = sGroupMap.begin(), it_end = sGroupMap.end();
+ for( ; it != it_end; ++it)
+ {
+ const std::string& group_name = it->second;
+
+ instance_list_t& instances = sInstanceMap[group_name];
+
+ for (instance_list_t::const_iterator iter = instances.begin(); iter != instances.end(); ++iter)
+ {
+ LLFloater* inst = *iter;
+
+ if (inst->getVisible() && inst->isPositioning(LLFloaterEnums::OPEN_POSITIONING_CASCADING))
+ {
+ if (candidate_rect.mTop > inst->getRect().mTop)
+ {
+ candidate_floater = inst;
+ candidate_rect = inst->getRect();
+ }
+ }
+ }
+ }
+
+ return candidate_floater;
+}
+
//static
LLFloater* LLFloaterReg::findInstance(const std::string& name, const LLSD& key)
{
@@ -107,37 +145,33 @@ LLFloater* LLFloaterReg::getInstance(const std::string& name, const LLSD& key)
if (!groupname.empty())
{
instance_list_t& list = sInstanceMap[groupname];
- int index = list.size();
res = build_func(key);
-
+ if (!res)
+ {
+ llwarns << "Failed to build floater type: '" << name << "'." << llendl;
+ return NULL;
+ }
bool success = res->buildFromFile(xui_file, NULL);
if (!success)
{
llwarns << "Failed to build floater type: '" << name << "'." << llendl;
return NULL;
}
-
+
// Note: key should eventually be a non optional LLFloater arg; for now, set mKey to be safe
if (res->mKey.isUndefined())
{
- res->mKey = key;
+ res->mKey = key;
}
res->setInstanceName(name);
- res->applySavedVariables(); // Can't apply rect and dock state until setting instance name
- if (res->mAutoTile && !res->getHost() && index > 0)
- {
- LLFloater* last_floater = getLastFloaterInGroup(groupname);
- if (last_floater)
- {
- res->stackWith(*last_floater);
- gFloaterView->adjustToFitScreen(res, true);
- }
- }
- else
- {
- gFloaterView->adjustToFitScreen(res, false);
- }
+
+ LLFloater *last_floater = (list.empty() ? NULL : list.back());
+
+ res->applyControlsAndPosition(last_floater);
+
+ gFloaterView->adjustToFitScreen(res, false);
+
list.push_back(res);
}
}
@@ -403,70 +437,71 @@ void LLFloaterReg::registerControlVariables()
}
}
-// Callbacks
-
-// static
-// Call once (i.e use for init callbacks)
-void LLFloaterReg::initUICtrlToFloaterVisibilityControl(LLUICtrl* ctrl, const LLSD& sdname)
+//static
+void LLFloaterReg::toggleInstanceOrBringToFront(const LLSD& sdname, const LLSD& key)
{
- // Get the visibility control name for the floater
- std::string vis_control_name = LLFloaterReg::declareVisibilityControl(sdname.asString());
- // Set the control value to the floater visibility control (Sets the value as well)
- ctrl->setControlVariable(LLFloater::getControlGroup()->getControl(vis_control_name));
-}
+ //
+ // Floaters controlled by the toolbar behave a bit differently from others.
+ // Namely they have 3-4 states as defined in the design wiki page here:
+ // https://wiki.lindenlab.com/wiki/FUI_Button_states
+ //
+ // The basic idea is this:
+ // * If the target floater is minimized, this button press will un-minimize it.
+ // * Else if the target floater is closed open it.
+ // * Else if the target floater does not have focus, give it focus.
+ // * Also, if it is not on top, bring it forward when focus is given.
+ // * Else the target floater is open, close it.
+ //
-// callback args may use "floatername.key" format
-static void parse_name_key(std::string& name, LLSD& key)
-{
- std::string instname = name;
- std::size_t dotpos = instname.find(".");
- if (dotpos != std::string::npos)
+ std::string name = sdname.asString();
+ LLFloater* instance = getInstance(name, key);
+
+ if (!instance)
+ {
+ lldebugs << "Unable to get instance of floater '" << name << "'" << llendl;
+ }
+ else if (instance->isMinimized())
+ {
+ instance->setMinimized(FALSE);
+ instance->setVisibleAndFrontmost();
+ }
+ else if (!instance->isShown())
+ {
+ instance->openFloater(key);
+ instance->setVisibleAndFrontmost();
+ }
+ else if (!instance->isFrontmost())
+ {
+ instance->setVisibleAndFrontmost();
+ }
+ else
{
- name = instname.substr(0, dotpos);
- key = LLSD(instname.substr(dotpos+1, std::string::npos));
+ instance->closeFloater();
}
}
-//static
-void LLFloaterReg::showFloaterInstance(const LLSD& sdname)
-{
- LLSD key;
- std::string name = sdname.asString();
- parse_name_key(name, key);
- showInstance(name, key, TRUE);
-}
-//static
-void LLFloaterReg::hideFloaterInstance(const LLSD& sdname)
-{
- LLSD key;
- std::string name = sdname.asString();
- parse_name_key(name, key);
- hideInstance(name, key);
-}
-//static
-void LLFloaterReg::toggleFloaterInstance(const LLSD& sdname)
+// static
+U32 LLFloaterReg::getVisibleFloaterInstanceCount()
{
- LLSD key;
- std::string name = sdname.asString();
- parse_name_key(name, key);
- toggleInstance(name, key);
-}
+ U32 count = 0;
-//static
-bool LLFloaterReg::floaterInstanceVisible(const LLSD& sdname)
-{
- LLSD key;
- std::string name = sdname.asString();
- parse_name_key(name, key);
- return instanceVisible(name, key);
-}
+ std::map<std::string,std::string>::const_iterator it = sGroupMap.begin(), it_end = sGroupMap.end();
+ for( ; it != it_end; ++it)
+ {
+ const std::string& group_name = it->second;
-//static
-bool LLFloaterReg::floaterInstanceMinimized(const LLSD& sdname)
-{
- LLSD key;
- std::string name = sdname.asString();
- parse_name_key(name, key);
- LLFloater* instance = findInstance(name, key);
- return LLFloater::isShown(instance);
+ instance_list_t& instances = sInstanceMap[group_name];
+
+ for (instance_list_t::const_iterator iter = instances.begin(); iter != instances.end(); ++iter)
+ {
+ LLFloater* inst = *iter;
+
+ if (inst->getVisible() && !inst->isMinimized())
+ {
+ count++;
+ }
+ }
+ }
+
+ return count;
}
diff --git a/indra/llui/llfloaterreg.h b/indra/llui/llfloaterreg.h
index a2027a77a0..534cf8b40a 100644
--- a/indra/llui/llfloaterreg.h
+++ b/indra/llui/llfloaterreg.h
@@ -87,6 +87,7 @@ public:
// Helpers
static LLFloater* getLastFloaterInGroup(const std::string& name);
+ static LLFloater* getLastFloaterCascading();
// Find / get (create) / remove / destroy
static LLFloater* findInstance(const std::string& name, const LLSD& key = LLSD());
@@ -123,12 +124,7 @@ public:
static void registerControlVariables();
// Callback wrappers
- static void initUICtrlToFloaterVisibilityControl(LLUICtrl* ctrl, const LLSD& sdname);
- static void showFloaterInstance(const LLSD& sdname);
- static void hideFloaterInstance(const LLSD& sdname);
- static void toggleFloaterInstance(const LLSD& sdname);
- static bool floaterInstanceVisible(const LLSD& sdname);
- static bool floaterInstanceMinimized(const LLSD& sdname);
+ static void toggleInstanceOrBringToFront(const LLSD& sdname, const LLSD& key = LLSD());
// Typed find / get / show
template <class T>
@@ -151,6 +147,7 @@ public:
static void blockShowFloaters(bool value) { sBlockShowFloaters = value;}
+ static U32 getVisibleFloaterInstanceCount();
};
#endif
diff --git a/indra/llui/llhandle.h b/indra/llui/llhandle.h
index 8c000eee48..37c657dd92 100644
--- a/indra/llui/llhandle.h
+++ b/indra/llui/llhandle.h
@@ -28,17 +28,18 @@
#define LLHANDLE_H
#include "llpointer.h"
+#include <boost/type_traits/is_convertible.hpp>
+#include <boost/utility/enable_if.hpp>
-template <typename T>
class LLTombStone : public LLRefCount
{
public:
- LLTombStone(T* target = NULL) : mTarget(target) {}
+ LLTombStone(void* target = NULL) : mTarget(target) {}
- void setTarget(T* target) { mTarget = target; }
- T* getTarget() const { return mTarget; }
+ void setTarget(void* target) { mTarget = target; }
+ void* getTarget() const { return mTarget; }
private:
- T* mTarget;
+ mutable void* mTarget;
};
// LLHandles are used to refer to objects whose lifetime you do not control or influence.
@@ -53,13 +54,15 @@ private:
template <typename T>
class LLHandle
{
+ template <typename U> friend class LLHandle;
+ template <typename U> friend class LLHandleProvider;
public:
LLHandle() : mTombStone(getDefaultTombStone()) {}
- const LLHandle<T>& operator =(const LLHandle<T>& other)
- {
- mTombStone = other.mTombStone;
- return *this;
- }
+
+ template<typename U>
+ LLHandle(const LLHandle<U>& other, typename boost::enable_if< typename boost::is_convertible<U*, T*> >::type* dummy = 0)
+ : mTombStone(other.mTombStone)
+ {}
bool isDead() const
{
@@ -73,7 +76,7 @@ public:
T* get() const
{
- return mTombStone->getTarget();
+ return reinterpret_cast<T*>(mTombStone->getTarget());
}
friend bool operator== (const LLHandle<T>& lhs, const LLHandle<T>& rhs)
@@ -94,12 +97,13 @@ public:
}
protected:
- LLPointer<LLTombStone<T> > mTombStone;
+ LLPointer<LLTombStone> mTombStone;
private:
- static LLPointer<LLTombStone<T> >& getDefaultTombStone()
+ typedef T* pointer_t;
+ static LLPointer<LLTombStone>& getDefaultTombStone()
{
- static LLPointer<LLTombStone<T> > sDefaultTombStone = new LLTombStone<T>;
+ static LLPointer<LLTombStone> sDefaultTombStone = new LLTombStone;
return sDefaultTombStone;
}
};
@@ -108,23 +112,26 @@ template <typename T>
class LLRootHandle : public LLHandle<T>
{
public:
+ typedef LLRootHandle<T> self_t;
+ typedef LLHandle<T> base_t;
+
LLRootHandle(T* object) { bind(object); }
LLRootHandle() {};
~LLRootHandle() { unbind(); }
- // this is redundant, since a LLRootHandle *is* an LLHandle
- LLHandle<T> getHandle() { return LLHandle<T>(*this); }
+ // this is redundant, since an LLRootHandle *is* an LLHandle
+ //LLHandle<T> getHandle() { return LLHandle<T>(*this); }
void bind(T* object)
{
// unbind existing tombstone
if (LLHandle<T>::mTombStone.notNull())
{
- if (LLHandle<T>::mTombStone->getTarget() == object) return;
+ if (LLHandle<T>::mTombStone->getTarget() == (void*)object) return;
LLHandle<T>::mTombStone->setTarget(NULL);
}
// tombstone reference counted, so no paired delete
- LLHandle<T>::mTombStone = new LLTombStone<T>(object);
+ LLHandle<T>::mTombStone = new LLTombStone((void*)object);
}
void unbind()
@@ -142,6 +149,15 @@ private:
template <typename T>
class LLHandleProvider
{
+public:
+ LLHandle<T> getHandle() const
+ {
+ // perform lazy binding to avoid small tombstone allocations for handle
+ // providers whose handles are never referenced
+ mHandle.bind(static_cast<T*>(const_cast<LLHandleProvider<T>* >(this)));
+ return mHandle;
+ }
+
protected:
typedef LLHandle<T> handle_type_t;
LLHandleProvider()
@@ -149,16 +165,17 @@ protected:
// provided here to enforce T deriving from LLHandleProvider<T>
}
- LLHandle<T> getHandle()
- {
- // perform lazy binding to avoid small tombstone allocations for handle
- // providers whose handles are never referenced
- mHandle.bind(static_cast<T*>(this));
- return mHandle;
+ template <typename U>
+ LLHandle<U> getDerivedHandle(typename boost::enable_if< typename boost::is_convertible<U*, T*> >::type* dummy = 0) const
+ {
+ LLHandle<U> downcast_handle;
+ downcast_handle.mTombStone = getHandle().mTombStone;
+ return downcast_handle;
}
+
private:
- LLRootHandle<T> mHandle;
+ mutable LLRootHandle<T> mHandle;
};
#endif
diff --git a/indra/llui/llhelp.h b/indra/llui/llhelp.h
index 83317bd03c..1726347a78 100644
--- a/indra/llui/llhelp.h
+++ b/indra/llui/llhelp.h
@@ -32,6 +32,7 @@ class LLHelp
{
public:
virtual void showTopic(const std::string &topic) = 0;
+ virtual std::string getURL(const std::string &topic) = 0;
// return default (fallback) topic name suitable for showTopic()
virtual std::string defaultTopic() = 0;
// return topic to use before the user logs in
diff --git a/indra/llui/llkeywords.cpp b/indra/llui/llkeywords.cpp
index ceec9c7eb1..c1cd04186b 100644
--- a/indra/llui/llkeywords.cpp
+++ b/indra/llui/llkeywords.cpp
@@ -57,6 +57,22 @@ LLKeywords::LLKeywords() : mLoaded(FALSE)
{
}
+inline BOOL LLKeywordToken::isTail(const llwchar* s) const
+{
+ BOOL res = TRUE;
+ const llwchar* t = mDelimiter.c_str();
+ S32 len = mDelimiter.size();
+ for (S32 i=0; i<len; i++)
+ {
+ if (s[i] != t[i])
+ {
+ res = FALSE;
+ break;
+ }
+ }
+ return res;
+}
+
LLKeywords::~LLKeywords()
{
std::for_each(mWordTokenMap.begin(), mWordTokenMap.end(), DeletePairedPointer());
@@ -106,6 +122,7 @@ BOOL LLKeywords::loadFromFile( const std::string& filename )
std::string SOL_LINE("[line ");
std::string SOL_ONE_SIDED_DELIMITER("[one_sided_delimiter ");
std::string SOL_TWO_SIDED_DELIMITER("[two_sided_delimiter ");
+ std::string SOL_DOUBLE_QUOTATION_MARKS("[double_quotation_marks ");
LLColor3 cur_color( 1, 0, 0 );
LLKeywordToken::TOKEN_TYPE cur_type = LLKeywordToken::WORD;
@@ -137,6 +154,12 @@ BOOL LLKeywords::loadFromFile( const std::string& filename )
cur_type = LLKeywordToken::TWO_SIDED_DELIMITER;
continue;
}
+ else if( line.find(SOL_DOUBLE_QUOTATION_MARKS) == 0 )
+ {
+ cur_color = readColor( line.substr(SOL_DOUBLE_QUOTATION_MARKS.size()) );
+ cur_type = LLKeywordToken::DOUBLE_QUOTATION_MARKS;
+ continue;
+ }
else if( line.find(SOL_ONE_SIDED_DELIMITER) == 0 )
{
cur_color = readColor( line.substr(SOL_ONE_SIDED_DELIMITER.size()) );
@@ -154,10 +177,26 @@ BOOL LLKeywords::loadFromFile( const std::string& filename )
if( !token_buffer.empty() && token_word_iter != word_tokens.end() )
{
- // first word is keyword
+ // first word is the keyword or a left delimiter
std::string keyword = (*token_word_iter);
LLStringUtil::trim(keyword);
+ // second word may be a right delimiter
+ std::string delimiter;
+ if (cur_type == LLKeywordToken::TWO_SIDED_DELIMITER)
+ {
+ while (delimiter.length() == 0 && ++token_word_iter != word_tokens.end())
+ {
+ delimiter = *token_word_iter;
+ LLStringUtil::trim(delimiter);
+ }
+ }
+ else if (cur_type == LLKeywordToken::DOUBLE_QUOTATION_MARKS)
+ {
+ // Closing delimiter is identical to the opening one.
+ delimiter = keyword;
+ }
+
// following words are tooltip
std::string tool_tip;
while (++token_word_iter != word_tokens.end())
@@ -170,11 +209,11 @@ BOOL LLKeywords::loadFromFile( const std::string& filename )
{
// Replace : with \n for multi-line tool tips.
LLStringUtil::replaceChar( tool_tip, ':', '\n' );
- addToken(cur_type, keyword, cur_color, tool_tip );
+ addToken(cur_type, keyword, cur_color, tool_tip, delimiter );
}
else
{
- addToken(cur_type, keyword, cur_color, LLStringUtil::null );
+ addToken(cur_type, keyword, cur_color, LLStringUtil::null, delimiter );
}
}
}
@@ -189,23 +228,26 @@ BOOL LLKeywords::loadFromFile( const std::string& filename )
void LLKeywords::addToken(LLKeywordToken::TOKEN_TYPE type,
const std::string& key_in,
const LLColor3& color,
- const std::string& tool_tip_in )
+ const std::string& tool_tip_in,
+ const std::string& delimiter_in)
{
LLWString key = utf8str_to_wstring(key_in);
LLWString tool_tip = utf8str_to_wstring(tool_tip_in);
+ LLWString delimiter = utf8str_to_wstring(delimiter_in);
switch(type)
{
case LLKeywordToken::WORD:
- mWordTokenMap[key] = new LLKeywordToken(type, color, key, tool_tip);
+ mWordTokenMap[key] = new LLKeywordToken(type, color, key, tool_tip, LLWStringUtil::null);
break;
case LLKeywordToken::LINE:
- mLineTokenList.push_front(new LLKeywordToken(type, color, key, tool_tip));
+ mLineTokenList.push_front(new LLKeywordToken(type, color, key, tool_tip, LLWStringUtil::null));
break;
case LLKeywordToken::TWO_SIDED_DELIMITER:
+ case LLKeywordToken::DOUBLE_QUOTATION_MARKS:
case LLKeywordToken::ONE_SIDED_DELIMITER:
- mDelimiterTokenList.push_front(new LLKeywordToken(type, color, key, tool_tip));
+ mDelimiterTokenList.push_front(new LLKeywordToken(type, color, key, tool_tip, delimiter));
break;
default:
@@ -357,7 +399,7 @@ void LLKeywords::findSegments(std::vector<LLTextSegmentPtr>* seg_list, const LLW
}
// cur is now at the first non-whitespace character of a new line
-
+
// Line start tokens
{
BOOL line_done = FALSE;
@@ -418,14 +460,15 @@ void LLKeywords::findSegments(std::vector<LLTextSegmentPtr>* seg_list, const LLW
S32 seg_end = 0;
seg_start = cur - base;
- cur += cur_delimiter->getLength();
+ cur += cur_delimiter->getLengthHead();
- if( cur_delimiter->getType() == LLKeywordToken::TWO_SIDED_DELIMITER )
+ LLKeywordToken::TOKEN_TYPE type = cur_delimiter->getType();
+ if( type == LLKeywordToken::TWO_SIDED_DELIMITER || type == LLKeywordToken::DOUBLE_QUOTATION_MARKS )
{
- while( *cur && !cur_delimiter->isHead(cur))
+ while( *cur && !cur_delimiter->isTail(cur))
{
// Check for an escape sequence.
- if (*cur == '\\')
+ if (type == LLKeywordToken::DOUBLE_QUOTATION_MARKS && *cur == '\\')
{
// Count the number of backslashes.
S32 num_backslashes = 0;
@@ -435,10 +478,10 @@ void LLKeywords::findSegments(std::vector<LLTextSegmentPtr>* seg_list, const LLW
between_delimiters++;
cur++;
}
- // Is the next character the end delimiter?
- if (cur_delimiter->isHead(cur))
+ // If the next character is the end delimiter?
+ if (cur_delimiter->isTail(cur))
{
- // Is there was an odd number of backslashes, then this delimiter
+ // If there was an odd number of backslashes, then this delimiter
// does not end the sequence.
if (num_backslashes % 2 == 1)
{
@@ -461,13 +504,13 @@ void LLKeywords::findSegments(std::vector<LLTextSegmentPtr>* seg_list, const LLW
if( *cur )
{
- cur += cur_delimiter->getLength();
- seg_end = seg_start + between_delimiters + 2 * cur_delimiter->getLength();
+ cur += cur_delimiter->getLengthHead();
+ seg_end = seg_start + between_delimiters + cur_delimiter->getLengthHead() + cur_delimiter->getLengthTail();
}
else
{
// eof
- seg_end = seg_start + between_delimiters + cur_delimiter->getLength();
+ seg_end = seg_start + between_delimiters + cur_delimiter->getLengthHead();
}
}
else
@@ -479,7 +522,7 @@ void LLKeywords::findSegments(std::vector<LLTextSegmentPtr>* seg_list, const LLW
between_delimiters++;
cur++;
}
- seg_end = seg_start + between_delimiters + cur_delimiter->getLength();
+ seg_end = seg_start + between_delimiters + cur_delimiter->getLengthHead();
}
insertSegments(wtext, *seg_list,cur_delimiter, text_len, seg_start, seg_end, defaultColor, editor);
diff --git a/indra/llui/llkeywords.h b/indra/llui/llkeywords.h
index f6d75b7e75..ac34015393 100644
--- a/indra/llui/llkeywords.h
+++ b/indra/llui/llkeywords.h
@@ -41,23 +41,44 @@ typedef LLPointer<LLTextSegment> LLTextSegmentPtr;
class LLKeywordToken
{
public:
- enum TOKEN_TYPE { WORD, LINE, TWO_SIDED_DELIMITER, ONE_SIDED_DELIMITER };
+ /**
+ * @brief Types of tokens/delimters being parsed.
+ *
+ * @desc Tokens/delimiters that need to be identified/highlighted. All are terminated if an EOF is encountered.
+ * - WORD are keywords in the normal sense, i.e. constants, events, etc.
+ * - LINE are for entire lines (currently only flow control labels use this).
+ * - ONE_SIDED_DELIMITER are for open-ended delimiters which are terminated by EOL.
+ * - TWO_SIDED_DELIMITER are for delimiters that end with a different delimiter than they open with.
+ * - DOUBLE_QUOTATION_MARKS are for delimiting areas using the same delimiter to open and close.
+ */
+ enum TOKEN_TYPE
+ {
+ WORD,
+ LINE,
+ TWO_SIDED_DELIMITER,
+ ONE_SIDED_DELIMITER,
+ DOUBLE_QUOTATION_MARKS
+ };
- LLKeywordToken( TOKEN_TYPE type, const LLColor3& color, const LLWString& token, const LLWString& tool_tip )
+ LLKeywordToken( TOKEN_TYPE type, const LLColor3& color, const LLWString& token, const LLWString& tool_tip, const LLWString& delimiter )
:
mType( type ),
mToken( token ),
mColor( color ),
- mToolTip( tool_tip )
+ mToolTip( tool_tip ),
+ mDelimiter( delimiter ) // right delimiter
{
}
- S32 getLength() const { return mToken.size(); }
+ S32 getLengthHead() const { return mToken.size(); }
+ S32 getLengthTail() const { return mDelimiter.size(); }
BOOL isHead(const llwchar* s) const;
+ BOOL isTail(const llwchar* s) const;
const LLWString& getToken() const { return mToken; }
const LLColor3& getColor() const { return mColor; }
TOKEN_TYPE getType() const { return mType; }
const LLWString& getToolTip() const { return mToolTip; }
+ const LLWString& getDelimiter() const { return mDelimiter; }
#ifdef _DEBUG
void dump();
@@ -68,6 +89,7 @@ private:
LLWString mToken;
LLColor3 mColor;
LLWString mToolTip;
+ LLWString mDelimiter;
};
class LLKeywords
@@ -85,7 +107,8 @@ public:
void addToken(LLKeywordToken::TOKEN_TYPE type,
const std::string& key,
const LLColor3& color,
- const std::string& tool_tip = LLStringUtil::null);
+ const std::string& tool_tip = LLStringUtil::null,
+ const std::string& delimiter = LLStringUtil::null);
// This class is here as a performance optimization.
// The word token map used to be defined as std::map<LLWString, LLKeywordToken*>.
diff --git a/indra/llui/lllayoutstack.cpp b/indra/llui/lllayoutstack.cpp
index a250404292..2f1c2a47c9 100644
--- a/indra/llui/lllayoutstack.cpp
+++ b/indra/llui/lllayoutstack.cpp
@@ -34,6 +34,10 @@
#include "llpanel.h"
#include "llresizebar.h"
#include "llcriticaldamp.h"
+#include "boost/foreach.hpp"
+
+static const F32 MIN_FRACTIONAL_SIZE = 0.0001f;
+static const F32 MAX_FRACTIONAL_SIZE = 1.f;
static LLDefaultChildRegistry::Register<LLLayoutStack> register_layout_stack("layout_stack");
static LLLayoutStack::LayoutStackRegistry::Register<LLLayoutPanel> register_layout_panel("layout_panel");
@@ -47,26 +51,31 @@ void LLLayoutStack::OrientationNames::declareValues()
//
// LLLayoutPanel
//
+LLLayoutPanel::Params::Params()
+: expanded_min_dim("expanded_min_dim", 0),
+ min_dim("min_dim", -1),
+ user_resize("user_resize", false),
+ auto_resize("auto_resize", true)
+{
+ addSynonym(min_dim, "min_width");
+ addSynonym(min_dim, "min_height");
+}
+
LLLayoutPanel::LLLayoutPanel(const Params& p)
: LLPanel(p),
- mExpandedMinDimSpecified(false),
- mExpandedMinDim(p.min_dim),
+ mExpandedMinDim(p.expanded_min_dim.isProvided() ? p.expanded_min_dim : p.min_dim),
mMinDim(p.min_dim),
- mMaxDim(p.max_dim),
mAutoResize(p.auto_resize),
mUserResize(p.user_resize),
mCollapsed(FALSE),
mCollapseAmt(0.f),
mVisibleAmt(1.f), // default to fully visible
- mResizeBar(NULL)
+ mResizeBar(NULL),
+ mFractionalSize(MIN_FRACTIONAL_SIZE),
+ mTargetDim(0),
+ mIgnoreReshape(false),
+ mOrientation(LLLayoutStack::HORIZONTAL)
{
- // Set the expanded min dim if it is provided, otherwise it gets the p.min_dim value
- if (p.expanded_min_dim.isProvided())
- {
- mExpandedMinDimSpecified = true;
- mExpandedMinDim = p.expanded_min_dim();
- }
-
// panels initialized as hidden should not start out partially visible
if (!getVisible())
{
@@ -88,20 +97,83 @@ LLLayoutPanel::~LLLayoutPanel()
mResizeBar = NULL;
}
-F32 LLLayoutPanel::getCollapseFactor(LLLayoutStack::ELayoutOrientation orientation)
+F32 LLLayoutPanel::getAutoResizeFactor() const
+{
+ return mVisibleAmt * (1.f - mCollapseAmt);
+}
+
+F32 LLLayoutPanel::getVisibleAmount() const
+{
+ return mVisibleAmt;
+}
+
+S32 LLLayoutPanel::getLayoutDim() const
+{
+ return llround((F32)((mOrientation == LLLayoutStack::HORIZONTAL)
+ ? getRect().getWidth()
+ : getRect().getHeight()));
+}
+
+S32 LLLayoutPanel::getVisibleDim() const
{
- if (orientation == LLLayoutStack::HORIZONTAL)
+ F32 min_dim = getRelevantMinDim();
+ return llround(mVisibleAmt
+ * (min_dim
+ + (((F32)mTargetDim - min_dim) * (1.f - mCollapseAmt))));
+}
+
+void LLLayoutPanel::setOrientation( LLLayoutStack::ELayoutOrientation orientation )
+{
+ mOrientation = orientation;
+ S32 layout_dim = llround((F32)((mOrientation == LLLayoutStack::HORIZONTAL)
+ ? getRect().getWidth()
+ : getRect().getHeight()));
+
+ mTargetDim = llmax(layout_dim, getMinDim());
+}
+
+void LLLayoutPanel::setVisible( BOOL visible )
+{
+ if (visible != getVisible())
{
- F32 collapse_amt =
- clamp_rescale(mCollapseAmt, 0.f, 1.f, 1.f, (F32)getRelevantMinDim() / (F32)llmax(1, getRect().getWidth()));
- return mVisibleAmt * collapse_amt;
+ LLLayoutStack* stackp = dynamic_cast<LLLayoutStack*>(getParent());
+ if (stackp)
+ {
+ stackp->mNeedsLayout = true;
+ }
}
- else
+ LLPanel::setVisible(visible);
+}
+
+void LLLayoutPanel::reshape( S32 width, S32 height, BOOL called_from_parent /*= TRUE*/ )
+{
+ if (width == getRect().getWidth() && height == getRect().getHeight()) return;
+
+ if (!mIgnoreReshape && mAutoResize == false)
+ {
+ mTargetDim = (mOrientation == LLLayoutStack::HORIZONTAL) ? width : height;
+ LLLayoutStack* stackp = dynamic_cast<LLLayoutStack*>(getParent());
+ if (stackp)
+ {
+ stackp->mNeedsLayout = true;
+ }
+ }
+ LLPanel::reshape(width, height, called_from_parent);
+}
+
+void LLLayoutPanel::handleReshape(const LLRect& new_rect, bool by_user)
+{
+ LLLayoutStack* stackp = dynamic_cast<LLLayoutStack*>(getParent());
+ if (stackp)
{
- F32 collapse_amt =
- clamp_rescale(mCollapseAmt, 0.f, 1.f, 1.f, llmin(1.f, (F32)getRelevantMinDim() / (F32)llmax(1, getRect().getHeight())));
- return mVisibleAmt * collapse_amt;
+ stackp->mNeedsLayout = true;
+ if (by_user)
+ {
+ // tell layout stack to account for new shape
+ stackp->updatePanelRect(this, new_rect);
+ }
}
+ LLPanel::handleReshape(new_rect, by_user);
}
//
@@ -114,20 +186,21 @@ LLLayoutStack::Params::Params()
clip("clip", true),
open_time_constant("open_time_constant", 0.02f),
close_time_constant("close_time_constant", 0.03f),
+ resize_bar_overlap("resize_bar_overlap", 1),
border_size("border_size", LLCachedControl<S32>(*LLUI::sSettingGroups["config"], "UIResizeBarHeight", 0))
{}
LLLayoutStack::LLLayoutStack(const LLLayoutStack::Params& p)
: LLView(p),
- mMinWidth(0),
- mMinHeight(0),
mPanelSpacing(p.border_size),
mOrientation(p.orientation),
mAnimate(p.animate),
mAnimatedThisFrame(false),
+ mNeedsLayout(true),
mClip(p.clip),
mOpenTimeConstant(p.open_time_constant),
- mCloseTimeConstant(p.close_time_constant)
+ mCloseTimeConstant(p.close_time_constant),
+ mResizeBarOverlap(p.resize_bar_overlap)
{}
LLLayoutStack::~LLLayoutStack()
@@ -141,26 +214,26 @@ void LLLayoutStack::draw()
{
updateLayout();
- e_panel_list_t::iterator panel_it;
- for (panel_it = mPanels.begin(); panel_it != mPanels.end(); ++panel_it)
+ // always clip to stack itself
+ LLLocalClipRect clip(getLocalRect());
+ BOOST_FOREACH(LLLayoutPanel* panelp, mPanels)
{
// clip to layout rectangle, not bounding rectangle
- LLRect clip_rect = (*panel_it)->getRect();
+ LLRect clip_rect = panelp->getRect();
// scale clipping rectangle by visible amount
if (mOrientation == HORIZONTAL)
{
- clip_rect.mRight = clip_rect.mLeft + llround((F32)clip_rect.getWidth() * (*panel_it)->getCollapseFactor(mOrientation));
+ clip_rect.mRight = clip_rect.mLeft + panelp->getVisibleDim();
}
else
{
- clip_rect.mBottom = clip_rect.mTop - llround((F32)clip_rect.getHeight() * (*panel_it)->getCollapseFactor(mOrientation));
+ clip_rect.mBottom = clip_rect.mTop - panelp->getVisibleDim();
}
- LLPanel* panelp = (*panel_it);
-
- LLLocalClipRect clip(clip_rect, mClip);
- // only force drawing invisible children if visible amount is non-zero
- drawChild(panelp, 0, 0, !clip_rect.isEmpty());
+ {LLLocalClipRect clip(clip_rect, mClip);
+ // only force drawing invisible children if visible amount is non-zero
+ drawChild(panelp, 0, 0, !clip_rect.isEmpty());
+ }
}
mAnimatedThisFrame = false;
}
@@ -173,12 +246,10 @@ void LLLayoutStack::removeChild(LLView* view)
{
mPanels.erase(std::find(mPanels.begin(), mPanels.end(), embedded_panelp));
delete embedded_panelp;
+ updateFractionalSizes();
+ mNeedsLayout = true;
}
- // need to update resizebars
-
- calcMinExtents();
-
LLView::removeChild(view);
}
@@ -193,50 +264,15 @@ bool LLLayoutStack::addChild(LLView* child, S32 tab_group)
LLLayoutPanel* panelp = dynamic_cast<LLLayoutPanel*>(child);
if (panelp)
{
+ panelp->setOrientation(mOrientation);
mPanels.push_back(panelp);
+ createResizeBar(panelp);
+ mNeedsLayout = true;
}
- return LLView::addChild(child, tab_group);
-}
-
-
-S32 LLLayoutStack::getDefaultHeight(S32 cur_height)
-{
- // if we are spanning our children (crude upward propagation of size)
- // then don't enforce our size on our children
- if (mOrientation == HORIZONTAL)
- {
- cur_height = llmax(mMinHeight, getRect().getHeight());
- }
-
- return cur_height;
-}
-
-S32 LLLayoutStack::getDefaultWidth(S32 cur_width)
-{
- // if we are spanning our children (crude upward propagation of size)
- // then don't enforce our size on our children
- if (mOrientation == VERTICAL)
- {
- cur_width = llmax(mMinWidth, getRect().getWidth());
- }
-
- return cur_width;
-}
-
-void LLLayoutStack::movePanel(LLPanel* panel_to_move, LLPanel* target_panel, bool move_to_front)
-{
- LLLayoutPanel* embedded_panel_to_move = findEmbeddedPanel(panel_to_move);
- LLLayoutPanel* embedded_target_panel = move_to_front ? *mPanels.begin() : findEmbeddedPanel(target_panel);
+ BOOL result = LLView::addChild(child, tab_group);
- if (!embedded_panel_to_move || !embedded_target_panel || embedded_panel_to_move == embedded_target_panel)
- {
- llwarns << "One of the panels was not found in stack or NULL was passed instead of valid panel" << llendl;
- return;
- }
- e_panel_list_t::iterator it = std::find(mPanels.begin(), mPanels.end(), embedded_panel_to_move);
- mPanels.erase(it);
- it = move_to_front ? mPanels.begin() : std::find(mPanels.begin(), mPanels.end(), embedded_target_panel);
- mPanels.insert(it, embedded_panel_to_move);
+ updateFractionalSizes();
+ return result;
}
void LLLayoutStack::addPanel(LLLayoutPanel* panel, EAnimate animate)
@@ -251,82 +287,274 @@ void LLLayoutStack::addPanel(LLLayoutPanel* panel, EAnimate animate)
}
}
-void LLLayoutStack::removePanel(LLPanel* panel)
-{
- removeChild(panel);
-}
-
void LLLayoutStack::collapsePanel(LLPanel* panel, BOOL collapsed)
{
LLLayoutPanel* panel_container = findEmbeddedPanel(panel);
if (!panel_container) return;
panel_container->mCollapsed = collapsed;
+ mNeedsLayout = true;
}
-void LLLayoutStack::updatePanelAutoResize(const std::string& panel_name, BOOL auto_resize)
-{
- LLLayoutPanel* panel = findEmbeddedPanelByName(panel_name);
+static LLFastTimer::DeclareTimer FTM_UPDATE_LAYOUT("Update LayoutStacks");
+
+void LLLayoutStack::updateLayout()
+{
+ LLFastTimer ft(FTM_UPDATE_LAYOUT);
+
+ if (!mNeedsLayout) return;
- if (panel)
+ bool animation_in_progress = animatePanels();
+ F32 total_visible_fraction = 0.f;
+ F32 total_open_fraction = 0.f;
+ S32 space_to_distribute = (mOrientation == HORIZONTAL)
+ ? getRect().getWidth()
+ : getRect().getHeight();
+
+ // first, assign minimum dimensions
+ LLLayoutPanel* panelp = NULL;
+ BOOST_FOREACH(panelp, mPanels)
{
- panel->mAutoResize = auto_resize;
+ if (panelp->mAutoResize)
+ {
+ panelp->mTargetDim = panelp->getRelevantMinDim();
+ if (!panelp->mCollapsed && panelp->getVisible())
+ {
+ total_open_fraction += panelp->mFractionalSize;
+ }
+ }
+ space_to_distribute -= panelp->getVisibleDim() + llround((F32)mPanelSpacing * panelp->getVisibleAmount());
+ total_visible_fraction += panelp->mFractionalSize;
}
-}
-void LLLayoutStack::setPanelUserResize(const std::string& panel_name, BOOL user_resize)
+ llassert(total_visible_fraction < 1.01f);
+
+ // don't need spacing after last panel
+ space_to_distribute += panelp ? llround((F32)mPanelSpacing * panelp->getVisibleAmount()) : 0;
+
+ F32 fraction_distributed = 0.f;
+ if (space_to_distribute > 0 && total_visible_fraction > 0.f)
+ { // give space proportionally to visible auto resize panels
+ BOOST_FOREACH(LLLayoutPanel* panelp, mPanels)
+ {
+ if (panelp->mAutoResize)
+ {
+ F32 fraction_to_distribute = (panelp->mFractionalSize * panelp->getAutoResizeFactor()) / (total_visible_fraction);
+ S32 delta = llround((F32)space_to_distribute * fraction_to_distribute);
+ fraction_distributed += fraction_to_distribute;
+ panelp->mTargetDim += delta;
+ }
+ }
+ }
+
+ if (fraction_distributed < total_visible_fraction)
+ { // distribute any left over pixels to non-collapsed, visible panels
+ F32 fraction_left = total_visible_fraction - fraction_distributed;
+ S32 space_left = llround((F32)space_to_distribute * (fraction_left / total_visible_fraction));
+
+ BOOST_FOREACH(LLLayoutPanel* panelp, mPanels)
+ {
+ if (panelp->mAutoResize
+ && !panelp->mCollapsed
+ && panelp->getVisible())
+ {
+ S32 space_for_panel = llmax(0, llround((F32)space_left * (panelp->mFractionalSize / total_open_fraction)));
+ panelp->mTargetDim += space_for_panel;
+ space_left -= space_for_panel;
+ total_open_fraction -= panelp->mFractionalSize;
+ }
+ }
+ }
+
+ F32 cur_pos = (mOrientation == HORIZONTAL) ? 0.f : (F32)getRect().getHeight();
+
+ BOOST_FOREACH(LLLayoutPanel* panelp, mPanels)
+ {
+ F32 panel_dim = llmax(panelp->getExpandedMinDim(), panelp->mTargetDim);
+ F32 panel_visible_dim = panelp->getVisibleDim();
+
+ LLRect panel_rect;
+ if (mOrientation == HORIZONTAL)
+ {
+ panel_rect.setLeftTopAndSize(llround(cur_pos),
+ getRect().getHeight(),
+ llround(panel_dim),
+ getRect().getHeight());
+ }
+ else
+ {
+ panel_rect.setLeftTopAndSize(0,
+ llround(cur_pos),
+ getRect().getWidth(),
+ llround(panel_dim));
+ }
+ panelp->setIgnoreReshape(true);
+ panelp->setShape(panel_rect);
+ panelp->setIgnoreReshape(false);
+
+ LLRect resize_bar_rect(panel_rect);
+
+ F32 panel_spacing = (F32)mPanelSpacing * panelp->getVisibleAmount();
+ if (mOrientation == HORIZONTAL)
+ {
+ resize_bar_rect.mLeft = panel_rect.mRight - mResizeBarOverlap;
+ resize_bar_rect.mRight = panel_rect.mRight + (S32)(llround(panel_spacing)) + mResizeBarOverlap;
+
+ cur_pos += panel_visible_dim + panel_spacing;
+ }
+ else //VERTICAL
+ {
+ resize_bar_rect.mTop = panel_rect.mBottom + mResizeBarOverlap;
+ resize_bar_rect.mBottom = panel_rect.mBottom - (S32)(llround(panel_spacing)) - mResizeBarOverlap;
+
+ cur_pos -= panel_visible_dim + panel_spacing;
+ }
+ panelp->mResizeBar->setShape(resize_bar_rect);
+ }
+
+ updateResizeBarLimits();
+
+ // clear animation flag at end, since panel resizes will set it
+ // and leave it set if there is any animation in progress
+ mNeedsLayout = animation_in_progress;
+} // end LLLayoutStack::updateLayout
+
+LLLayoutPanel* LLLayoutStack::findEmbeddedPanel(LLPanel* panelp) const
{
- LLLayoutPanel* panel = findEmbeddedPanelByName(panel_name);
+ if (!panelp) return NULL;
- if (panel)
+ e_panel_list_t::const_iterator panel_it;
+ BOOST_FOREACH(LLLayoutPanel* p, mPanels)
{
- panel->mUserResize = user_resize;
+ if (p == panelp)
+ {
+ return p;
+ }
}
+ return NULL;
}
-bool LLLayoutStack::getPanelMinSize(const std::string& panel_name, S32* min_dimp)
+LLLayoutPanel* LLLayoutStack::findEmbeddedPanelByName(const std::string& name) const
{
- LLLayoutPanel* panel = findEmbeddedPanelByName(panel_name);
+ LLLayoutPanel* result = NULL;
- if (panel && min_dimp)
+ BOOST_FOREACH(LLLayoutPanel* p, mPanels)
{
- *min_dimp = panel->getRelevantMinDim();
+ if (p->getName() == name)
+ {
+ result = p;
+ break;
+ }
}
- return NULL != panel;
+ return result;
}
-bool LLLayoutStack::getPanelMaxSize(const std::string& panel_name, S32* max_dimp)
+void LLLayoutStack::createResizeBar(LLLayoutPanel* panelp)
{
- LLLayoutPanel* panel = findEmbeddedPanelByName(panel_name);
+ BOOST_FOREACH(LLLayoutPanel* lp, mPanels)
+ {
+ if (lp->mResizeBar == NULL)
+ {
+ LLResizeBar::Side side = (mOrientation == HORIZONTAL) ? LLResizeBar::RIGHT : LLResizeBar::BOTTOM;
+ LLRect resize_bar_rect = getRect();
- if (panel)
+ LLResizeBar::Params resize_params;
+ resize_params.name("resize");
+ resize_params.resizing_view(lp);
+ resize_params.min_size(lp->getRelevantMinDim());
+ resize_params.side(side);
+ resize_params.snapping_enabled(false);
+ LLResizeBar* resize_bar = LLUICtrlFactory::create<LLResizeBar>(resize_params);
+ lp->mResizeBar = resize_bar;
+ LLView::addChild(resize_bar, 0);
+ }
+ }
+ // bring all resize bars to the front so that they are clickable even over the panels
+ // with a bit of overlap
+ for (e_panel_list_t::iterator panel_it = mPanels.begin(); panel_it != mPanels.end(); ++panel_it)
{
- if (max_dimp) *max_dimp = panel->mMaxDim;
+ LLResizeBar* resize_barp = (*panel_it)->mResizeBar;
+ sendChildToFront(resize_barp);
}
+}
- return NULL != panel;
+// update layout stack animations, etc. once per frame
+// NOTE: we use this to size world view based on animating UI, *before* we draw the UI
+// we might still need to call updateLayout during UI draw phase, in case UI elements
+// are resizing themselves dynamically
+//static
+void LLLayoutStack::updateClass()
+{
+ for (instance_iter it = beginInstances(); it != endInstances(); ++it)
+ {
+ it->updateLayout();
+ }
}
-static LLFastTimer::DeclareTimer FTM_UPDATE_LAYOUT("Update LayoutStacks");
-void LLLayoutStack::updateLayout(BOOL force_resize)
+void LLLayoutStack::updateFractionalSizes()
{
- LLFastTimer ft(FTM_UPDATE_LAYOUT);
- static LLUICachedControl<S32> resize_bar_overlap ("UIResizeBarOverlap", 0);
- calcMinExtents();
- createResizeBars();
+ F32 total_resizable_dim = 0;
+ S32 num_auto_resize_panels = 0;
- // calculate current extents
- S32 total_width = 0;
- S32 total_height = 0;
+ BOOST_FOREACH(LLLayoutPanel* panelp, mPanels)
+ {
+ if (panelp->mAutoResize)
+ {
+ total_resizable_dim += llmax(0, panelp->getLayoutDim() - panelp->getRelevantMinDim());
+ num_auto_resize_panels++;
+ }
+ }
- e_panel_list_t::iterator panel_it;
- for (panel_it = mPanels.begin(); panel_it != mPanels.end(); ++panel_it)
+ F32 total_fractional_size = 0.f;
+
+ BOOST_FOREACH(LLLayoutPanel* panelp, mPanels)
{
- LLLayoutPanel* panelp = (*panel_it);
- if (panelp->getVisible())
+ if (panelp->mAutoResize)
{
- if (mAnimate)
+ F32 panel_resizable_dim = llmax(MIN_FRACTIONAL_SIZE, (F32)(panelp->getLayoutDim() - panelp->getRelevantMinDim()));
+ panelp->mFractionalSize = panel_resizable_dim > 0.f
+ ? llclamp(panel_resizable_dim / total_resizable_dim, MIN_FRACTIONAL_SIZE, MAX_FRACTIONAL_SIZE)
+ : MIN_FRACTIONAL_SIZE;
+ total_fractional_size += panelp->mFractionalSize;
+ llassert(!llisnan(panelp->mFractionalSize));
+ }
+ }
+
+ if (total_fractional_size == 0.f)
+ { // equal distribution
+ BOOST_FOREACH(LLLayoutPanel* panelp, mPanels)
+ {
+ if (panelp->mAutoResize)
+ {
+ panelp->mFractionalSize = MAX_FRACTIONAL_SIZE / (F32)num_auto_resize_panels;
+ }
+ }
+ }
+ else
+ { // renormalize
+ BOOST_FOREACH(LLLayoutPanel* panelp, mPanels)
+ {
+ if (panelp->mAutoResize)
+ {
+ panelp->mFractionalSize /= total_fractional_size;
+ }
+ }
+ }
+}
+
+bool LLLayoutStack::animatePanels()
+{
+ bool animation_in_progress = false;
+
+ //
+ // animate visibility
+ //
+ BOOST_FOREACH(LLLayoutPanel* panelp, mPanels)
+ {
+ if (panelp->getVisible())
+ {
+ if (mAnimate && panelp->mVisibleAmt < 1.f)
{
if (!mAnimatedThisFrame)
{
@@ -336,15 +564,21 @@ void LLLayoutStack::updateLayout(BOOL force_resize)
panelp->mVisibleAmt = 1.f;
}
}
+
+ animation_in_progress = true;
}
else
{
- panelp->mVisibleAmt = 1.f;
+ if (panelp->mVisibleAmt != 1.f)
+ {
+ panelp->mVisibleAmt = 1.f;
+ animation_in_progress = true;
+ }
}
}
else // not visible
{
- if (mAnimate)
+ if (mAnimate && panelp->mVisibleAmt > 0.f)
{
if (!mAnimatedThisFrame)
{
@@ -354,365 +588,213 @@ void LLLayoutStack::updateLayout(BOOL force_resize)
panelp->mVisibleAmt = 0.f;
}
}
+
+ animation_in_progress = true;
}
else
{
- panelp->mVisibleAmt = 0.f;
+ if (panelp->mVisibleAmt != 0.f)
+ {
+ panelp->mVisibleAmt = 0.f;
+ animation_in_progress = true;
+ }
}
}
- if (panelp->mCollapsed)
- {
- panelp->mCollapseAmt = lerp(panelp->mCollapseAmt, 1.f, LLCriticalDamp::getInterpolant(mCloseTimeConstant));
- }
- else
- {
- panelp->mCollapseAmt = lerp(panelp->mCollapseAmt, 0.f, LLCriticalDamp::getInterpolant(mCloseTimeConstant));
- }
-
- if (mOrientation == HORIZONTAL)
- {
- // enforce minimize size constraint by default
- if (panelp->getRect().getWidth() < panelp->getRelevantMinDim())
- {
- panelp->reshape(panelp->getRelevantMinDim(), panelp->getRect().getHeight());
- }
- total_width += llround(panelp->getRect().getWidth() * panelp->getCollapseFactor(mOrientation));
- // want n-1 panel gaps for n panels
- if (panel_it != mPanels.begin())
- {
- total_width += mPanelSpacing;
- }
- }
- else //VERTICAL
+ F32 collapse_state = panelp->mCollapsed ? 1.f : 0.f;
+ if (panelp->mCollapseAmt != collapse_state)
{
- // enforce minimize size constraint by default
- if (panelp->getRect().getHeight() < panelp->getRelevantMinDim())
+ if (!mAnimatedThisFrame)
{
- panelp->reshape(panelp->getRect().getWidth(), panelp->getRelevantMinDim());
+ panelp->mCollapseAmt = lerp(panelp->mCollapseAmt, collapse_state, LLCriticalDamp::getInterpolant(mCloseTimeConstant));
}
- total_height += llround(panelp->getRect().getHeight() * panelp->getCollapseFactor(mOrientation));
- if (panel_it != mPanels.begin())
+ animation_in_progress = true;
+
+ if (llabs(panelp->mCollapseAmt - collapse_state) < 0.001f)
{
- total_height += mPanelSpacing;
+ panelp->mCollapseAmt = collapse_state;
}
}
}
- S32 num_resizable_panels = 0;
- S32 shrink_headroom_available = 0;
- S32 shrink_headroom_total = 0;
- for (panel_it = mPanels.begin(); panel_it != mPanels.end(); ++panel_it)
+ mAnimatedThisFrame = true;
+
+ return animation_in_progress;
+}
+
+void LLLayoutStack::updatePanelRect( LLLayoutPanel* resized_panel, const LLRect& new_rect )
+{
+ S32 new_dim = (mOrientation == HORIZONTAL)
+ ? new_rect.getWidth()
+ : new_rect.getHeight();
+ S32 delta_dim = new_dim - resized_panel->getVisibleDim();
+ if (delta_dim == 0) return;
+
+ F32 total_visible_fraction = 0.f;
+ F32 delta_auto_resize_headroom = 0.f;
+ F32 total_auto_resize_headroom = 0.f;
+
+ LLLayoutPanel* other_resize_panel = NULL;
+ LLLayoutPanel* following_panel = NULL;
+
+ BOOST_REVERSE_FOREACH(LLLayoutPanel* panelp, mPanels)
{
- // panels that are not fully visible do not count towards shrink headroom
- if ((*panel_it)->getCollapseFactor(mOrientation) < 1.f)
+ if (panelp->mAutoResize)
{
- continue;
+ total_auto_resize_headroom += (F32)(panelp->mTargetDim - panelp->getRelevantMinDim());
+ total_visible_fraction += panelp->mFractionalSize * panelp->getAutoResizeFactor();
}
- S32 relevant_dimension = (mOrientation == HORIZONTAL) ? (*panel_it)->getRect().getWidth() : (*panel_it)->getRect().getHeight();
- S32 relevant_min = (*panel_it)->getRelevantMinDim();
-
- // if currently resizing a panel or the panel is flagged as not automatically resizing
- // only track total available headroom, but don't use it for automatic resize logic
- if ((*panel_it)->mResizeBar->hasMouseCapture()
- || (!(*panel_it)->mAutoResize
- && !force_resize))
+ if (panelp == resized_panel)
{
- shrink_headroom_total += relevant_dimension - relevant_min;
+ other_resize_panel = following_panel;
}
- else
+
+ if (panelp->getVisible() && !panelp->mCollapsed)
{
- num_resizable_panels++;
-
- shrink_headroom_available += relevant_dimension - relevant_min;
- shrink_headroom_total += relevant_dimension - relevant_min;
+ following_panel = panelp;
}
}
- // calculate how many pixels need to be distributed among layout panels
- // positive means panels need to grow, negative means shrink
- S32 pixels_to_distribute;
- if (mOrientation == HORIZONTAL)
+ if (resized_panel->mAutoResize == FALSE)
{
- pixels_to_distribute = getRect().getWidth() - total_width;
+ delta_auto_resize_headroom += -delta_dim;
}
- else //VERTICAL
+ if (other_resize_panel && other_resize_panel->mAutoResize == FALSE)
{
- pixels_to_distribute = getRect().getHeight() - total_height;
+ delta_auto_resize_headroom += delta_dim;
}
- // now we distribute the pixels...
- S32 cur_x = 0;
- S32 cur_y = getRect().getHeight();
+ F32 fraction_given_up = 0.f;
+ F32 fraction_remaining = 1.f;
+ F32 updated_auto_resize_headroom = total_auto_resize_headroom + delta_auto_resize_headroom;
- for (panel_it = mPanels.begin(); panel_it != mPanels.end(); ++panel_it)
+ enum
{
- LLLayoutPanel* panelp = (*panel_it);
+ BEFORE_RESIZED_PANEL,
+ RESIZED_PANEL,
+ NEXT_PANEL,
+ AFTER_RESIZED_PANEL
+ } which_panel = BEFORE_RESIZED_PANEL;
- S32 cur_width = panelp->getRect().getWidth();
- S32 cur_height = panelp->getRect().getHeight();
- S32 new_width = cur_width;
- S32 new_height = cur_height;
- S32 relevant_min = panelp->getRelevantMinDim();
+ BOOST_FOREACH(LLLayoutPanel* panelp, mPanels)
+ {
+ if (!panelp->getVisible() || panelp->mCollapsed) continue;
- if (mOrientation == HORIZONTAL)
- {
- new_width = llmax(relevant_min, new_width);
- }
- else
+ if (panelp == resized_panel)
{
- new_height = llmax(relevant_min, new_height);
+ which_panel = RESIZED_PANEL;
}
- S32 delta_size = 0;
- // if panel can automatically resize (not animating, and resize flag set)...
- if (panelp->getCollapseFactor(mOrientation) == 1.f
- && (force_resize || panelp->mAutoResize)
- && !panelp->mResizeBar->hasMouseCapture())
+ switch(which_panel)
{
- if (mOrientation == HORIZONTAL)
- {
- // if we're shrinking
- if (pixels_to_distribute < 0)
- {
- // shrink proportionally to amount over minimum
- // so we can do this in one pass
- delta_size = (shrink_headroom_available > 0) ? llround((F32)pixels_to_distribute * ((F32)(cur_width - relevant_min) / (F32)shrink_headroom_available)) : 0;
- shrink_headroom_available -= (cur_width - relevant_min);
- }
- else
- {
- // grow all elements equally
- delta_size = llround((F32)pixels_to_distribute / (F32)num_resizable_panels);
- num_resizable_panels--;
- }
- pixels_to_distribute -= delta_size;
- new_width = llmax(relevant_min, cur_width + delta_size);
+ case BEFORE_RESIZED_PANEL:
+ if (panelp->mAutoResize)
+ { // freeze current size as fraction of overall auto_resize space
+ F32 fractional_adjustment_factor = total_auto_resize_headroom / updated_auto_resize_headroom;
+ F32 new_fractional_size = llclamp(panelp->mFractionalSize * fractional_adjustment_factor,
+ MIN_FRACTIONAL_SIZE,
+ MAX_FRACTIONAL_SIZE);
+ F32 fraction_delta = (new_fractional_size - panelp->mFractionalSize);
+ fraction_given_up -= fraction_delta;
+ fraction_remaining -= panelp->mFractionalSize;
+ panelp->mFractionalSize += fraction_delta;
+ llassert(!llisnan(panelp->mFractionalSize));
}
else
{
- new_width = getDefaultWidth(new_width);
+ // leave non auto-resize panels alone
}
-
- if (mOrientation == VERTICAL)
+ break;
+ case RESIZED_PANEL:
+ if (panelp->mAutoResize)
+ { // freeze new size as fraction
+ F32 new_fractional_size = (updated_auto_resize_headroom == 0.f)
+ ? MAX_FRACTIONAL_SIZE
+ : llclamp((F32)(new_dim - panelp->getRelevantMinDim()) / updated_auto_resize_headroom, MIN_FRACTIONAL_SIZE, MAX_FRACTIONAL_SIZE);
+ fraction_given_up -= new_fractional_size - panelp->mFractionalSize;
+ fraction_remaining -= panelp->mFractionalSize;
+ panelp->mFractionalSize = new_fractional_size;
+ llassert(!llisnan(panelp->mFractionalSize));
+ }
+ else
+ { // freeze new size as original size
+ panelp->mTargetDim = new_dim;
+ fraction_remaining -= fraction_given_up;
+ }
+ which_panel = NEXT_PANEL;
+ break;
+ case NEXT_PANEL:
+ if (panelp->mAutoResize)
{
- if (pixels_to_distribute < 0)
+ fraction_remaining -= panelp->mFractionalSize;
+ if (fraction_given_up != 0.f)
{
- // shrink proportionally to amount over minimum
- // so we can do this in one pass
- delta_size = (shrink_headroom_available > 0) ? llround((F32)pixels_to_distribute * ((F32)(cur_height - relevant_min) / (F32)shrink_headroom_available)) : 0;
- shrink_headroom_available -= (cur_height - relevant_min);
+ panelp->mFractionalSize = llclamp(panelp->mFractionalSize + fraction_given_up, MIN_FRACTIONAL_SIZE, MAX_FRACTIONAL_SIZE);
+ fraction_given_up = 0.f;
}
else
{
- delta_size = llround((F32)pixels_to_distribute / (F32)num_resizable_panels);
- num_resizable_panels--;
+ F32 new_fractional_size = llclamp((F32)(panelp->mTargetDim - panelp->getRelevantMinDim() + delta_auto_resize_headroom)
+ / updated_auto_resize_headroom,
+ MIN_FRACTIONAL_SIZE,
+ MAX_FRACTIONAL_SIZE);
+ fraction_given_up -= new_fractional_size - panelp->mFractionalSize;
+ panelp->mFractionalSize = new_fractional_size;
}
- pixels_to_distribute -= delta_size;
- new_height = llmax(relevant_min, cur_height + delta_size);
}
else
{
- new_height = getDefaultHeight(new_height);
- }
- }
- else
- {
- if (mOrientation == HORIZONTAL)
- {
- new_height = getDefaultHeight(new_height);
+ panelp->mTargetDim -= delta_dim;
}
- else // VERTICAL
+ which_panel = AFTER_RESIZED_PANEL;
+ break;
+ case AFTER_RESIZED_PANEL:
+ if (panelp->mAutoResize)
{
- new_width = getDefaultWidth(new_width);
+ panelp->mFractionalSize = llclamp(panelp->mFractionalSize + (panelp->mFractionalSize / fraction_remaining) * fraction_given_up,
+ MIN_FRACTIONAL_SIZE,
+ MAX_FRACTIONAL_SIZE);
}
- }
-
- // adjust running headroom count based on new sizes
- shrink_headroom_total += delta_size;
-
- LLRect panel_rect;
- panel_rect.setLeftTopAndSize(cur_x, cur_y, new_width, new_height);
- panelp->setShape(panel_rect);
-
- LLRect resize_bar_rect = panel_rect;
- if (mOrientation == HORIZONTAL)
- {
- resize_bar_rect.mLeft = panel_rect.mRight - resize_bar_overlap;
- resize_bar_rect.mRight = panel_rect.mRight + mPanelSpacing + resize_bar_overlap;
- }
- else
- {
- resize_bar_rect.mTop = panel_rect.mBottom + resize_bar_overlap;
- resize_bar_rect.mBottom = panel_rect.mBottom - mPanelSpacing - resize_bar_overlap;
- }
- (*panel_it)->mResizeBar->setRect(resize_bar_rect);
-
- if (mOrientation == HORIZONTAL)
- {
- cur_x += llround(new_width * (*panel_it)->getCollapseFactor(mOrientation)) + mPanelSpacing;
- }
- else //VERTICAL
- {
- cur_y -= llround(new_height * (*panel_it)->getCollapseFactor(mOrientation)) + mPanelSpacing;
- }
- }
-
- // update resize bars with new limits
- LLLayoutPanel* last_resizeable_panel = NULL;
- for (panel_it = mPanels.begin(); panel_it != mPanels.end(); ++panel_it)
- {
- LLLayoutPanel* panelp = (*panel_it);
- S32 relevant_min = panelp->getRelevantMinDim();
-
- if (mOrientation == HORIZONTAL)
- {
- (*panel_it)->mResizeBar->setResizeLimits(
- relevant_min,
- relevant_min + shrink_headroom_total);
- }
- else //VERTICAL
- {
- (*panel_it)->mResizeBar->setResizeLimits(
- relevant_min,
- relevant_min + shrink_headroom_total);
- }
-
- // toggle resize bars based on panel visibility, resizability, etc
- BOOL resize_bar_enabled = panelp->getVisible() && (*panel_it)->mUserResize;
- (*panel_it)->mResizeBar->setVisible(resize_bar_enabled);
-
- if ((*panel_it)->mUserResize || (*panel_it)->mAutoResize)
- {
- last_resizeable_panel = (*panel_it);
- }
- }
-
- // hide last resize bar as there is nothing past it
- // resize bars need to be in between two resizable panels
- if (last_resizeable_panel)
- {
- last_resizeable_panel->mResizeBar->setVisible(FALSE);
- }
-
- // not enough room to fit existing contents
- if (force_resize == FALSE
- // layout did not complete by reaching target position
- && ((mOrientation == VERTICAL && cur_y != -mPanelSpacing)
- || (mOrientation == HORIZONTAL && cur_x != getRect().getWidth() + mPanelSpacing)))
- {
- // do another layout pass with all stacked elements contributing
- // even those that don't usually resize
- llassert_always(force_resize == FALSE);
- updateLayout(TRUE);
- }
-
- mAnimatedThisFrame = true;
-} // end LLLayoutStack::updateLayout
-
-
-LLLayoutPanel* LLLayoutStack::findEmbeddedPanel(LLPanel* panelp) const
-{
- if (!panelp) return NULL;
-
- e_panel_list_t::const_iterator panel_it;
- for (panel_it = mPanels.begin(); panel_it != mPanels.end(); ++panel_it)
- {
- if ((*panel_it) == panelp)
- {
- return *panel_it;
+ default:
+ break;
}
}
- return NULL;
}
-LLLayoutPanel* LLLayoutStack::findEmbeddedPanelByName(const std::string& name) const
+void LLLayoutStack::reshape(S32 width, S32 height, BOOL called_from_parent)
{
- LLLayoutPanel* result = NULL;
-
- for (e_panel_list_t::const_iterator panel_it = mPanels.begin(); panel_it != mPanels.end(); ++panel_it)
- {
- LLLayoutPanel* p = *panel_it;
-
- if (p->getName() == name)
- {
- result = p;
- break;
- }
- }
-
- return result;
+ mNeedsLayout = true;
+ LLView::reshape(width, height, called_from_parent);
}
-// Compute sum of min_width or min_height of children
-void LLLayoutStack::calcMinExtents()
+void LLLayoutStack::updateResizeBarLimits()
{
- mMinWidth = 0;
- mMinHeight = 0;
-
- e_panel_list_t::iterator panel_it;
- for (panel_it = mPanels.begin(); panel_it != mPanels.end(); ++panel_it)
+ LLLayoutPanel* previous_visible_panelp = NULL;
+ BOOST_REVERSE_FOREACH(LLLayoutPanel* visible_panelp, mPanels)
{
- if (mOrientation == HORIZONTAL)
+ if (!visible_panelp->getVisible() || visible_panelp->mCollapsed)
{
- mMinWidth += (*panel_it)->getRelevantMinDim();
- if (panel_it != mPanels.begin())
- {
- mMinWidth += mPanelSpacing;
- }
+ visible_panelp->mResizeBar->setVisible(FALSE);
+ continue;
}
- else //VERTICAL
+
+ // toggle resize bars based on panel visibility, resizability, etc
+ if (previous_visible_panelp
+ && (visible_panelp->mUserResize || previous_visible_panelp->mUserResize) // one of the pair is user resizable
+ && (visible_panelp->mAutoResize || visible_panelp->mUserResize) // current panel is resizable
+ && (previous_visible_panelp->mAutoResize || previous_visible_panelp->mUserResize)) // previous panel is resizable
{
- mMinHeight += (*panel_it)->getRelevantMinDim();
- if (panel_it != mPanels.begin())
- {
- mMinHeight += mPanelSpacing;
- }
+ visible_panelp->mResizeBar->setVisible(TRUE);
+ S32 previous_panel_headroom = previous_visible_panelp->getVisibleDim() - previous_visible_panelp->getRelevantMinDim();
+ visible_panelp->mResizeBar->setResizeLimits(visible_panelp->getRelevantMinDim(),
+ visible_panelp->getVisibleDim() + previous_panel_headroom);
}
- }
-}
-
-void LLLayoutStack::createResizeBars()
-{
- for (e_panel_list_t::iterator panel_it = mPanels.begin(); panel_it != mPanels.end(); ++panel_it)
- {
- LLLayoutPanel* lp = (*panel_it);
- if (lp->mResizeBar == NULL)
+ else
{
- LLResizeBar::Side side = (mOrientation == HORIZONTAL) ? LLResizeBar::RIGHT : LLResizeBar::BOTTOM;
- LLRect resize_bar_rect = getRect();
-
- LLResizeBar::Params resize_params;
- resize_params.name("resize");
- resize_params.resizing_view(lp);
- resize_params.min_size(lp->getRelevantMinDim());
- resize_params.side(side);
- resize_params.snapping_enabled(false);
- LLResizeBar* resize_bar = LLUICtrlFactory::create<LLResizeBar>(resize_params);
- lp->mResizeBar = resize_bar;
- LLView::addChild(resize_bar, 0);
-
- // bring all resize bars to the front so that they are clickable even over the panels
- // with a bit of overlap
- for (e_panel_list_t::iterator panel_it = mPanels.begin(); panel_it != mPanels.end(); ++panel_it)
- {
- LLResizeBar* resize_barp = (*panel_it)->mResizeBar;
- sendChildToFront(resize_barp);
- }
+ visible_panelp->mResizeBar->setVisible(FALSE);
}
- }
-}
-// update layout stack animations, etc. once per frame
-// NOTE: we use this to size world view based on animating UI, *before* we draw the UI
-// we might still need to call updateLayout during UI draw phase, in case UI elements
-// are resizing themselves dynamically
-//static
-void LLLayoutStack::updateClass()
-{
- for (instance_iter it = beginInstances(); it != endInstances(); ++it)
- {
- it->updateLayout();
+ previous_visible_panelp = visible_panelp;
}
}
diff --git a/indra/llui/lllayoutstack.h b/indra/llui/lllayoutstack.h
index d8ef0aeaca..efe93f6def 100644
--- a/indra/llui/lllayoutstack.h
+++ b/indra/llui/lllayoutstack.h
@@ -5,7 +5,7 @@
*
* $LicenseInfo:firstyear=2001&license=viewerlgpl$
* Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
+ * Copyright (C) 2010, Linden Reshasearch, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -60,6 +60,7 @@ public:
clip;
Optional<F32> open_time_constant,
close_time_constant;
+ Optional<S32> resize_bar_overlap;
Params();
};
@@ -72,12 +73,11 @@ public:
/*virtual*/ void removeChild(LLView*);
/*virtual*/ BOOL postBuild();
/*virtual*/ bool addChild(LLView* child, S32 tab_group = 0);
+ /*virtual*/ void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE);
+
static LLView* fromXML(LLXMLNodePtr node, LLView *parent, LLXMLNodePtr output_node = NULL);
- S32 getMinWidth() const { return mMinWidth; }
- S32 getMinHeight() const { return mMinHeight; }
-
typedef enum e_animate
{
NO_ANIMATE,
@@ -85,49 +85,24 @@ public:
} EAnimate;
void addPanel(LLLayoutPanel* panel, EAnimate animate = NO_ANIMATE);
- void removePanel(LLPanel* panel);
void collapsePanel(LLPanel* panel, BOOL collapsed = TRUE);
S32 getNumPanels() { return mPanels.size(); }
- /**
- * Moves panel_to_move before target_panel inside layout stack (both panels should already be there).
- * If move_to_front is true target_panel is ignored and panel_to_move is moved to the beginning of mPanels
- */
- void movePanel(LLPanel* panel_to_move, LLPanel* target_panel, bool move_to_front = false);
-
- void updatePanelAutoResize(const std::string& panel_name, BOOL auto_resize);
- void setPanelUserResize(const std::string& panel_name, BOOL user_resize);
-
- /**
- * Gets minimal dimension along layout_stack axis of the specified by name panel.
- *
- * @returns true if specified by panel_name internal panel exists, false otherwise.
- */
- bool getPanelMinSize(const std::string& panel_name, S32* min_dimp);
-
- /**
- * Gets maximal dimension along layout_stack axis of the specified by name panel.
- *
- * @returns true if specified by panel_name internal panel exists, false otherwise.
- */
- bool getPanelMaxSize(const std::string& panel_name, S32* max_dim);
-
- void updateLayout(BOOL force_resize = FALSE);
-
+
+ void updateLayout();
+
S32 getPanelSpacing() const { return mPanelSpacing; }
- BOOL getAnimate () const { return mAnimate; }
- void setAnimate (BOOL animate) { mAnimate = animate; }
static void updateClass();
protected:
LLLayoutStack(const Params&);
friend class LLUICtrlFactory;
+ friend class LLLayoutPanel;
private:
- void createResizeBars();
- void calcMinExtents();
- S32 getDefaultHeight(S32 cur_height);
- S32 getDefaultWidth(S32 cur_width);
+ void updateResizeBarLimits();
+ bool animatePanels();
+ void createResizeBar(LLLayoutPanel* panel);
const ELayoutOrientation mOrientation;
@@ -136,17 +111,19 @@ private:
LLLayoutPanel* findEmbeddedPanel(LLPanel* panelp) const;
LLLayoutPanel* findEmbeddedPanelByName(const std::string& name) const;
+ void updateFractionalSizes();
+ void updatePanelRect( LLLayoutPanel* param1, const LLRect& new_rect );
- S32 mMinWidth; // calculated by calcMinExtents
- S32 mMinHeight; // calculated by calcMinExtents
S32 mPanelSpacing;
// true if we already applied animation this frame
bool mAnimatedThisFrame;
bool mAnimate;
bool mClip;
- F32 mOpenTimeConstant;
- F32 mCloseTimeConstant;
+ F32 mOpenTimeConstant;
+ F32 mCloseTimeConstant;
+ bool mNeedsLayout;
+ S32 mResizeBarOverlap;
}; // end class LLLayoutStack
@@ -158,37 +135,30 @@ public:
struct Params : public LLInitParam::Block<Params, LLPanel::Params>
{
Optional<S32> expanded_min_dim,
- min_dim,
- max_dim;
+ min_dim;
Optional<bool> user_resize,
auto_resize;
- Params()
- : expanded_min_dim("expanded_min_dim", 0),
- min_dim("min_dim", 0),
- max_dim("max_dim", 0),
- user_resize("user_resize", true),
- auto_resize("auto_resize", true)
- {
- addSynonym(min_dim, "min_width");
- addSynonym(min_dim, "min_height");
- addSynonym(max_dim, "max_width");
- addSynonym(max_dim, "max_height");
- }
+ Params();
};
~LLLayoutPanel();
void initFromParams(const Params& p);
- S32 getMinDim() const { return mMinDim; }
- void setMinDim(S32 value) { mMinDim = value; if (!mExpandedMinDimSpecified) mExpandedMinDim = value; }
+ void handleReshape(const LLRect& new_rect, bool by_user);
+
+ void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE);
+
- S32 getMaxDim() const { return mMaxDim; }
- void setMaxDim(S32 value) { mMaxDim = value; }
+ void setVisible(BOOL visible);
- S32 getExpandedMinDim() const { return mExpandedMinDim; }
- void setExpandedMinDim(S32 value) { mExpandedMinDim = value; mExpandedMinDimSpecified = true; }
+ S32 getLayoutDim() const;
+ S32 getMinDim() const { return (mMinDim >= 0 || mAutoResize) ? llmax(0, mMinDim) : getLayoutDim(); }
+ void setMinDim(S32 value) { mMinDim = value; }
+
+ S32 getExpandedMinDim() const { return mExpandedMinDim >= 0 ? mExpandedMinDim : mMinDim; }
+ void setExpandedMinDim(S32 value) { mExpandedMinDim = value; }
S32 getRelevantMinDim() const
{
@@ -196,28 +166,37 @@ public:
if (!mCollapsed)
{
- min_dim = mExpandedMinDim;
+ min_dim = getExpandedMinDim();
}
return min_dim;
}
+ F32 getAutoResizeFactor() const;
+ F32 getVisibleAmount() const;
+ S32 getVisibleDim() const;
+
+ void setOrientation(LLLayoutStack::ELayoutOrientation orientation);
+ void storeOriginalDim();
+
+ void setIgnoreReshape(bool ignore) { mIgnoreReshape = ignore; }
+
protected:
LLLayoutPanel(const Params& p);
- F32 getCollapseFactor(LLLayoutStack::ELayoutOrientation orientation);
-
- bool mExpandedMinDimSpecified;
- S32 mExpandedMinDim;
-
- S32 mMinDim;
- S32 mMaxDim;
- BOOL mAutoResize;
- BOOL mUserResize;
- BOOL mCollapsed;
+ const bool mAutoResize;
+ const bool mUserResize;
+
+ S32 mExpandedMinDim;
+ S32 mMinDim;
+ bool mCollapsed;
+ F32 mVisibleAmt;
+ F32 mCollapseAmt;
+ F32 mFractionalSize;
+ S32 mTargetDim;
+ bool mIgnoreReshape;
+ LLLayoutStack::ELayoutOrientation mOrientation;
class LLResizeBar* mResizeBar;
- F32 mVisibleAmt;
- F32 mCollapseAmt;
};
diff --git a/indra/llui/lllineeditor.cpp b/indra/llui/lllineeditor.cpp
index ebdd47ae80..06dfc90d83 100644
--- a/indra/llui/lllineeditor.cpp
+++ b/indra/llui/lllineeditor.cpp
@@ -198,6 +198,7 @@ LLLineEditor::~LLLineEditor()
void LLLineEditor::onFocusReceived()
{
+ gEditMenuHandler = this;
LLUICtrl::onFocusReceived();
updateAllowingLanguageInput();
}
diff --git a/indra/llui/lllineeditor.h b/indra/llui/lllineeditor.h
index 583bde360a..2518dbe3c7 100644
--- a/indra/llui/lllineeditor.h
+++ b/indra/llui/lllineeditor.h
@@ -60,7 +60,7 @@ public:
typedef boost::function<void (LLLineEditor* caller)> keystroke_callback_t;
- struct MaxLength : public LLInitParam::Choice<MaxLength>
+ struct MaxLength : public LLInitParam::ChoiceBlock<MaxLength>
{
Alternative<S32> bytes, chars;
diff --git a/indra/llui/llloadingindicator.cpp b/indra/llui/llloadingindicator.cpp
index c4eec1835c..6ac38f5ad4 100644
--- a/indra/llui/llloadingindicator.cpp
+++ b/indra/llui/llloadingindicator.cpp
@@ -34,6 +34,7 @@
// Project includes
#include "lluictrlfactory.h"
#include "lluiimage.h"
+#include "boost/foreach.hpp"
// registered in llui.cpp to avoid being left out by MS linker
//static LLDefaultChildRegistry::Register<LLLoadingIndicator> r("loading_indicator");
@@ -51,11 +52,9 @@ LLLoadingIndicator::LLLoadingIndicator(const Params& p)
void LLLoadingIndicator::initFromParams(const Params& p)
{
- for (LLInitParam::ParamIterator<LLUIImage*>::const_iterator it = p.images().image.begin(), end_it = p.images().image.end();
- it != end_it;
- ++it)
+ BOOST_FOREACH(LLUIImage* image, p.images.image)
{
- mImages.push_back(it->getValue());
+ mImages.push_back(image);
}
// Start timer for switching images.
diff --git a/indra/llui/llloadingindicator.h b/indra/llui/llloadingindicator.h
index 7c44478848..c1f979c111 100644
--- a/indra/llui/llloadingindicator.h
+++ b/indra/llui/llloadingindicator.h
@@ -51,7 +51,7 @@ class LLLoadingIndicator
LOG_CLASS(LLLoadingIndicator);
public:
- struct Images : public LLInitParam::Block<Images>
+ struct Images : public LLInitParam::BatchBlock<Images>
{
Multiple<LLUIImage*> image;
@@ -63,7 +63,7 @@ public:
struct Params : public LLInitParam::Block<Params, LLUICtrl::Params>
{
Optional<F32> images_per_sec;
- Batch<Images> images;
+ Optional<Images> images;
Params()
: images_per_sec("images_per_sec", 1.0f),
diff --git a/indra/llui/llmenugl.cpp b/indra/llui/llmenugl.cpp
index 6cac841cde..95ecbb1c94 100644
--- a/indra/llui/llmenugl.cpp
+++ b/indra/llui/llmenugl.cpp
@@ -947,9 +947,14 @@ LLMenuItemBranchGL::LLMenuItemBranchGL(const LLMenuItemBranchGL::Params& p)
LLMenuItemBranchGL::~LLMenuItemBranchGL()
{
- LLView::deleteViewByHandle(mBranchHandle);
+ if (mBranchHandle.get())
+ {
+ mBranchHandle.get()->die();
+ }
}
+
+
// virtual
LLView* LLMenuItemBranchGL::getChildView(const std::string& name, BOOL recurse) const
{
@@ -1686,7 +1691,8 @@ LLMenuGL::LLMenuGL(const LLMenuGL::Params& p)
mSpilloverMenu(NULL),
mJumpKey(p.jump_key),
mCreateJumpKeys(p.create_jump_keys),
- mNeedsArrange(FALSE),
+ mNeedsArrange(FALSE),
+ mResetScrollPositionOnShow(true),
mShortcutPad(p.shortcut_pad)
{
typedef boost::tokenizer<boost::char_separator<char> > tokenizer;
@@ -1731,7 +1737,7 @@ void LLMenuGL::setCanTearOff(BOOL tear_off)
{
LLMenuItemTearOffGL::Params p;
mTearOffItem = LLUICtrlFactory::create<LLMenuItemTearOffGL>(p);
- addChildInBack(mTearOffItem);
+ addChild(mTearOffItem);
}
else if (!tear_off && mTearOffItem != NULL)
{
@@ -3043,7 +3049,7 @@ void LLMenuGL::showPopup(LLView* spawning_view, LLMenuGL* menu, S32 x, S32 y)
S32 mouse_x, mouse_y;
// Resetting scrolling position
- if (menu->isScrollable())
+ if (menu->isScrollable() && menu->isScrollPositionOnShowReset())
{
menu->mFirstVisibleItem = NULL;
}
diff --git a/indra/llui/llmenugl.h b/indra/llui/llmenugl.h
index 77db588390..36f3ba34b9 100644
--- a/indra/llui/llmenugl.h
+++ b/indra/llui/llmenugl.h
@@ -516,6 +516,9 @@ public:
static class LLMenuHolderGL* sMenuContainer;
+ void resetScrollPositionOnShow(bool reset_scroll_pos) { mResetScrollPositionOnShow = reset_scroll_pos; }
+ bool isScrollPositionOnShowReset() { return mResetScrollPositionOnShow; }
+
protected:
void createSpilloverBranch();
void cleanupSpilloverBranch();
@@ -565,6 +568,7 @@ private:
KEY mJumpKey;
BOOL mCreateJumpKeys;
S32 mShortcutPad;
+ bool mResetScrollPositionOnShow;
}; // end class LLMenuGL
@@ -677,7 +681,7 @@ public:
BOOL appendContextSubMenu(LLContextMenu *menu);
- LLHandle<LLContextMenu> getHandle() { mHandle.bind(this); return mHandle; }
+ LLHandle<LLContextMenu> getHandle() { return getDerivedHandle<LLContextMenu>(); }
protected:
BOOL mHoveredAnyItem;
diff --git a/indra/llui/llnotifications.cpp b/indra/llui/llnotifications.cpp
index ffe5908a9d..d232e27ef2 100644
--- a/indra/llui/llnotifications.cpp
+++ b/indra/llui/llnotifications.cpp
@@ -46,6 +46,7 @@
#include <algorithm>
#include <boost/regex.hpp>
+#include <boost/foreach.hpp>
const std::string NOTIFICATION_PERSIST_VERSION = "0.93";
@@ -416,23 +417,17 @@ LLNotificationTemplate::LLNotificationTemplate(const LLNotificationTemplate::Par
mSoundEffect = LLUUID(LLUI::sSettingGroups["config"]->getString(p.sound));
}
- for(LLInitParam::ParamIterator<LLNotificationTemplate::UniquenessContext>::const_iterator it = p.unique.contexts.begin(),
- end_it = p.unique.contexts.end();
- it != end_it;
- ++it)
+ BOOST_FOREACH(const LLNotificationTemplate::UniquenessContext& context, p.unique.contexts)
{
- mUniqueContext.push_back(it->value);
+ mUniqueContext.push_back(context.value);
}
lldebugs << "notification \"" << mName << "\": tag count is " << p.tags.size() << llendl;
- for(LLInitParam::ParamIterator<LLNotificationTemplate::Tag>::const_iterator it = p.tags.begin(),
- end_it = p.tags.end();
- it != end_it;
- ++it)
+ BOOST_FOREACH(const LLNotificationTemplate::Tag& tag, p.tags)
{
- lldebugs << " tag \"" << std::string(it->value) << "\"" << llendl;
- mTags.push_back(it->value);
+ lldebugs << " tag \"" << std::string(tag.value) << "\"" << llendl;
+ mTags.push_back(tag.value);
}
mForm = LLNotificationFormPtr(new LLNotificationForm(p.name, p.form_ref.form));
@@ -1397,14 +1392,12 @@ void replaceFormText(LLNotificationForm::Params& form, const std::string& patter
{
form.ignore.text = replace;
}
- for (LLInitParam::ParamIterator<LLNotificationForm::FormElement>::iterator it = form.form_elements.elements.begin(),
- end_it = form.form_elements.elements.end();
- it != end_it;
- ++it)
+
+ BOOST_FOREACH(LLNotificationForm::FormElement& element, form.form_elements.elements)
{
- if (it->button.isChosen() && it->button.text() == pattern)
+ if (element.button.isChosen() && element.button.text() == pattern)
{
- it->button.text = replace;
+ element.button.text = replace;
}
}
}
@@ -1453,48 +1446,42 @@ bool LLNotifications::loadTemplates()
mTemplates.clear();
- for(LLInitParam::ParamIterator<LLNotificationTemplate::GlobalString>::const_iterator it = params.strings.begin(), end_it = params.strings.end();
- it != end_it;
- ++it)
+ BOOST_FOREACH(LLNotificationTemplate::GlobalString& string, params.strings)
{
- mGlobalStrings[it->name] = it->value;
+ mGlobalStrings[string.name] = string.value;
}
std::map<std::string, LLNotificationForm::Params> form_templates;
- for(LLInitParam::ParamIterator<LLNotificationTemplate::Template>::const_iterator it = params.templates.begin(), end_it = params.templates.end();
- it != end_it;
- ++it)
+ BOOST_FOREACH(LLNotificationTemplate::Template& notification_template, params.templates)
{
- form_templates[it->name] = it->form;
+ form_templates[notification_template.name] = notification_template.form;
}
- for(LLInitParam::ParamIterator<LLNotificationTemplate::Params>::iterator it = params.notifications.begin(), end_it = params.notifications.end();
- it != end_it;
- ++it)
+ BOOST_FOREACH(LLNotificationTemplate::Params& notification, params.notifications)
{
- if (it->form_ref.form_template.isChosen())
+ if (notification.form_ref.form_template.isChosen())
{
// replace form contents from template
- it->form_ref.form = form_templates[it->form_ref.form_template.name];
- if(it->form_ref.form_template.yes_text.isProvided())
+ notification.form_ref.form = form_templates[notification.form_ref.form_template.name];
+ if(notification.form_ref.form_template.yes_text.isProvided())
{
- replaceFormText(it->form_ref.form, "$yestext", it->form_ref.form_template.yes_text);
+ replaceFormText(notification.form_ref.form, "$yestext", notification.form_ref.form_template.yes_text);
}
- if(it->form_ref.form_template.no_text.isProvided())
+ if(notification.form_ref.form_template.no_text.isProvided())
{
- replaceFormText(it->form_ref.form, "$notext", it->form_ref.form_template.no_text);
+ replaceFormText(notification.form_ref.form, "$notext", notification.form_ref.form_template.no_text);
}
- if(it->form_ref.form_template.cancel_text.isProvided())
+ if(notification.form_ref.form_template.cancel_text.isProvided())
{
- replaceFormText(it->form_ref.form, "$canceltext", it->form_ref.form_template.cancel_text);
+ replaceFormText(notification.form_ref.form, "$canceltext", notification.form_ref.form_template.cancel_text);
}
- if(it->form_ref.form_template.ignore_text.isProvided())
+ if(notification.form_ref.form_template.ignore_text.isProvided())
{
- replaceFormText(it->form_ref.form, "$ignoretext", it->form_ref.form_template.ignore_text);
+ replaceFormText(notification.form_ref.form, "$ignoretext", notification.form_ref.form_template.ignore_text);
}
}
- mTemplates[it->name] = LLNotificationTemplatePtr(new LLNotificationTemplate(*it));
+ mTemplates[notification.name] = LLNotificationTemplatePtr(new LLNotificationTemplate(notification));
}
return true;
@@ -1517,12 +1504,9 @@ bool LLNotifications::loadVisibilityRules()
mVisibilityRules.clear();
- for(LLInitParam::ParamIterator<LLNotificationVisibilityRule::Rule>::iterator it = params.rules.begin(),
- end_it = params.rules.end();
- it != end_it;
- ++it)
+ BOOST_FOREACH(LLNotificationVisibilityRule::Rule& rule, params.rules)
{
- mVisibilityRules.push_back(LLNotificationVisibilityRulePtr(new LLNotificationVisibilityRule(*it)));
+ mVisibilityRules.push_back(LLNotificationVisibilityRulePtr(new LLNotificationVisibilityRule(rule)));
}
return true;
@@ -1640,7 +1624,7 @@ LLNotificationPtr LLNotifications::find(LLUUID uuid)
LLNotificationSet::iterator it=mItems.find(target);
if (it == mItems.end())
{
- llwarns << "Tried to dereference uuid '" << uuid << "' as a notification key but didn't find it." << llendl;
+ LL_DEBUGS("Notifications") << "Tried to dereference uuid '" << uuid << "' as a notification key but didn't find it." << llendl;
return LLNotificationPtr((LLNotification*)NULL);
}
else
diff --git a/indra/llui/llnotifications.h b/indra/llui/llnotifications.h
index 0c4d4fc897..462d69be2e 100644
--- a/indra/llui/llnotifications.h
+++ b/indra/llui/llnotifications.h
@@ -201,7 +201,7 @@ public:
FormInput();
};
- struct FormElement : public LLInitParam::Choice<FormElement>
+ struct FormElement : public LLInitParam::ChoiceBlock<FormElement>
{
Alternative<FormButton> button;
Alternative<FormInput> input;
@@ -312,7 +312,7 @@ public:
Optional<LLNotificationContext*> context;
Optional<void*> responder;
- struct Functor : public LLInitParam::Choice<Functor>
+ struct Functor : public LLInitParam::ChoiceBlock<Functor>
{
Alternative<std::string> name;
Alternative<LLNotificationFunctorRegistry::ResponseFunctor> function;
diff --git a/indra/llui/llnotificationtemplate.h b/indra/llui/llnotificationtemplate.h
index eff572b553..fb50c9c123 100644
--- a/indra/llui/llnotificationtemplate.h
+++ b/indra/llui/llnotificationtemplate.h
@@ -88,10 +88,10 @@ struct LLNotificationTemplate
{
private:
// this idiom allows
- // <notification unique="true">
+ // <notification> <unique/> </notification>
// as well as
// <notification> <unique> <context></context> </unique>...
- Optional<bool> dummy_val;
+ Optional<LLInitParam::Flag> dummy_val;
public:
Multiple<UniquenessContext> contexts;
@@ -147,7 +147,7 @@ struct LLNotificationTemplate
{}
};
- struct FormRef : public LLInitParam::Choice<FormRef>
+ struct FormRef : public LLInitParam::ChoiceBlock<FormRef>
{
Alternative<LLNotificationForm::Params> form;
Alternative<TemplateRef> form_template;
diff --git a/indra/llui/llnotificationvisibilityrule.h b/indra/llui/llnotificationvisibilityrule.h
index 78bdec2a8f..78788a275c 100644
--- a/indra/llui/llnotificationvisibilityrule.h
+++ b/indra/llui/llnotificationvisibilityrule.h
@@ -59,7 +59,7 @@ struct LLNotificationVisibilityRule
{}
};
- struct Rule : public LLInitParam::Choice<Rule>
+ struct Rule : public LLInitParam::ChoiceBlock<Rule>
{
Alternative<Filter> show;
Alternative<Filter> hide;
diff --git a/indra/llui/llpanel.cpp b/indra/llui/llpanel.cpp
index a45b617c2e..00318cec6b 100644
--- a/indra/llui/llpanel.cpp
+++ b/indra/llui/llpanel.cpp
@@ -122,8 +122,6 @@ LLPanel::LLPanel(const LLPanel::Params& p)
{
addBorder(p.border);
}
-
- mPanelHandle.bind(this);
}
LLPanel::~LLPanel()
diff --git a/indra/llui/llpanel.h b/indra/llui/llpanel.h
index 790025cb2d..f620201020 100644
--- a/indra/llui/llpanel.h
+++ b/indra/llui/llpanel.h
@@ -96,9 +96,6 @@ public:
Params();
};
- // valid children for LLPanel are stored in this registry
- typedef LLDefaultChildRegistry child_registry_t;
-
protected:
friend class LLUICtrlFactory;
// RN: for some reason you can't just use LLUICtrlFactory::getDefaultParams as a default argument in VC8
@@ -138,6 +135,8 @@ public:
const LLColor4& getBackgroundColor() const { return mBgOpaqueColor; }
void setTransparentColor(const LLColor4& color) { mBgAlphaColor = color; }
const LLColor4& getTransparentColor() const { return mBgAlphaColor; }
+ void setBackgroundImage(LLUIImage* image) { mBgOpaqueImage = image; }
+ void setTransparentImage(LLUIImage* image) { mBgAlphaImage = image; }
LLPointer<LLUIImage> getBackgroundImage() const { return mBgOpaqueImage; }
LLPointer<LLUIImage> getTransparentImage() const { return mBgAlphaImage; }
LLColor4 getBackgroundImageOverlay() { return mBgOpaqueImageOverlay; }
@@ -156,7 +155,7 @@ public:
void setCtrlsEnabled(BOOL b);
- LLHandle<LLPanel> getHandle() const { return mPanelHandle; }
+ LLHandle<LLPanel> getHandle() const { return getDerivedHandle<LLPanel>(); }
const LLCallbackMap::map_t& getFactoryMap() const { return mFactoryMap; }
@@ -281,7 +280,6 @@ private:
LLViewBorder* mBorder;
LLButton* mDefaultBtn;
LLUIString mLabel;
- LLRootHandle<LLPanel> mPanelHandle;
typedef std::map<std::string, std::string> ui_string_map_t;
ui_string_map_t mUIStrings;
diff --git a/indra/llui/llresizebar.cpp b/indra/llui/llresizebar.cpp
index 02f60c76fa..87aeb4d7a7 100644
--- a/indra/llui/llresizebar.cpp
+++ b/indra/llui/llresizebar.cpp
@@ -79,6 +79,8 @@ LLResizeBar::LLResizeBar(const LLResizeBar::Params& p)
BOOL LLResizeBar::handleMouseDown(S32 x, S32 y, MASK mask)
{
+ if (!canResize()) return FALSE;
+
// Route future Mouse messages here preemptively. (Release on mouse up.)
// No handler needed for focus lost since this clas has no state that depends on it.
gFocusMgr.setMouseCapture( this );
@@ -243,7 +245,7 @@ BOOL LLResizeBar::handleHover(S32 x, S32 y, MASK mask)
handled = TRUE;
}
- if( handled )
+ if( handled && canResize() )
{
switch( mSide )
{
diff --git a/indra/llui/llresizebar.h b/indra/llui/llresizebar.h
index 0725fbd846..6daf191918 100644
--- a/indra/llui/llresizebar.h
+++ b/indra/llui/llresizebar.h
@@ -70,6 +70,7 @@ public:
void setResizeLimits( S32 min_size, S32 max_size ) { mMinSize = min_size; mMaxSize = max_size; }
void setEnableSnapping(BOOL enable) { mSnappingEnabled = enable; }
void setAllowDoubleClickSnapping(BOOL allow) { mAllowDoubleClickSnapping = allow; }
+ bool canResize() { return getEnabled() && mMaxSize > mMinSize; }
private:
S32 mDragLastScreenX;
diff --git a/indra/llui/llresizehandle.h b/indra/llui/llresizehandle.h
index 531eb1db61..7541b9e6c0 100644
--- a/indra/llui/llresizehandle.h
+++ b/indra/llui/llresizehandle.h
@@ -55,7 +55,7 @@ public:
virtual BOOL handleMouseUp(S32 x, S32 y, MASK mask);
void setResizeLimits( S32 min_width, S32 min_height ) { mMinWidth = min_width; mMinHeight = min_height; }
-
+
private:
BOOL pointInHandle( S32 x, S32 y );
diff --git a/indra/llui/llscrollcontainer.cpp b/indra/llui/llscrollcontainer.cpp
index b44b4c36b6..ad4cc20d9a 100644
--- a/indra/llui/llscrollcontainer.cpp
+++ b/indra/llui/llscrollcontainer.cpp
@@ -223,6 +223,15 @@ BOOL LLScrollContainer::handleKeyHere(KEY key, MASK mask)
return FALSE;
}
+BOOL LLScrollContainer::handleUnicodeCharHere(llwchar uni_char)
+{
+ if (mScrolledView && mScrolledView->handleUnicodeCharHere(uni_char))
+ {
+ return TRUE;
+ }
+ return FALSE;
+}
+
BOOL LLScrollContainer::handleScrollWheel( S32 x, S32 y, S32 clicks )
{
// Give event to my child views - they may have scroll bars
@@ -415,63 +424,66 @@ void LLScrollContainer::draw()
focusFirstItem();
}
- // Draw background
- if( mIsOpaque )
+ if (getRect().isValid())
{
- F32 alpha = getCurrentTransparency();
+ // Draw background
+ if( mIsOpaque )
+ {
+ F32 alpha = getCurrentTransparency();
- gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
- gl_rect_2d(mInnerRect, mBackgroundColor.get() % alpha);
- }
+ gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
+ gl_rect_2d(mInnerRect, mBackgroundColor.get() % alpha);
+ }
- // Draw mScrolledViews and update scroll bars.
- // get a scissor region ready, and draw the scrolling view. The
- // scissor region ensures that we don't draw outside of the bounds
- // of the rectangle.
- if( mScrolledView )
- {
- updateScroll();
-
- // Draw the scrolled area.
+ // Draw mScrolledViews and update scroll bars.
+ // get a scissor region ready, and draw the scrolling view. The
+ // scissor region ensures that we don't draw outside of the bounds
+ // of the rectangle.
+ if( mScrolledView )
{
- S32 visible_width = 0;
- S32 visible_height = 0;
- BOOL show_v_scrollbar = FALSE;
- BOOL show_h_scrollbar = FALSE;
- calcVisibleSize( &visible_width, &visible_height, &show_h_scrollbar, &show_v_scrollbar );
-
- LLLocalClipRect clip(LLRect(mInnerRect.mLeft,
- mInnerRect.mBottom + (show_h_scrollbar ? scrollbar_size : 0) + visible_height,
- mInnerRect.mRight - (show_v_scrollbar ? scrollbar_size: 0),
- mInnerRect.mBottom + (show_h_scrollbar ? scrollbar_size : 0)
- ));
- drawChild(mScrolledView);
- }
- }
-
- // Highlight border if a child of this container has keyboard focus
- if( mBorder->getVisible() )
- {
- mBorder->setKeyboardFocusHighlight( gFocusMgr.childHasKeyboardFocus(this) );
- }
+ updateScroll();
- // Draw all children except mScrolledView
- // Note: scrollbars have been adjusted by above drawing code
- for (child_list_const_reverse_iter_t child_iter = getChildList()->rbegin();
- child_iter != getChildList()->rend(); ++child_iter)
- {
- LLView *viewp = *child_iter;
- if( sDebugRects )
- {
- sDepth++;
+ // Draw the scrolled area.
+ {
+ S32 visible_width = 0;
+ S32 visible_height = 0;
+ BOOL show_v_scrollbar = FALSE;
+ BOOL show_h_scrollbar = FALSE;
+ calcVisibleSize( &visible_width, &visible_height, &show_h_scrollbar, &show_v_scrollbar );
+
+ LLLocalClipRect clip(LLRect(mInnerRect.mLeft,
+ mInnerRect.mBottom + (show_h_scrollbar ? scrollbar_size : 0) + visible_height,
+ mInnerRect.mRight - (show_v_scrollbar ? scrollbar_size: 0),
+ mInnerRect.mBottom + (show_h_scrollbar ? scrollbar_size : 0)
+ ));
+ drawChild(mScrolledView);
+ }
}
- if( (viewp != mScrolledView) && viewp->getVisible() )
+
+ // Highlight border if a child of this container has keyboard focus
+ if( mBorder->getVisible() )
{
- drawChild(viewp);
+ mBorder->setKeyboardFocusHighlight( gFocusMgr.childHasKeyboardFocus(this) );
}
- if( sDebugRects )
+
+ // Draw all children except mScrolledView
+ // Note: scrollbars have been adjusted by above drawing code
+ for (child_list_const_reverse_iter_t child_iter = getChildList()->rbegin();
+ child_iter != getChildList()->rend(); ++child_iter)
{
- sDepth--;
+ LLView *viewp = *child_iter;
+ if( sDebugRects )
+ {
+ sDepth++;
+ }
+ if( (viewp != mScrolledView) && viewp->getVisible() )
+ {
+ drawChild(viewp);
+ }
+ if( sDebugRects )
+ {
+ sDepth--;
+ }
}
}
} // end draw
diff --git a/indra/llui/llscrollcontainer.h b/indra/llui/llscrollcontainer.h
index 46a71a7e30..3aa79cc255 100644
--- a/indra/llui/llscrollcontainer.h
+++ b/indra/llui/llscrollcontainer.h
@@ -103,6 +103,7 @@ public:
// LLView functionality
virtual void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE);
virtual BOOL handleKeyHere(KEY key, MASK mask);
+ virtual BOOL handleUnicodeCharHere(llwchar uni_char);
virtual BOOL handleScrollWheel( S32 x, S32 y, S32 clicks );
virtual BOOL handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
EDragAndDropType cargo_type,
diff --git a/indra/llui/llscrolllistcolumn.h b/indra/llui/llscrolllistcolumn.h
index 12baea8e0c..b4d4a6d05e 100644
--- a/indra/llui/llscrolllistcolumn.h
+++ b/indra/llui/llscrolllistcolumn.h
@@ -95,7 +95,7 @@ public:
Optional<ESortDirection, SortNames> sort_direction;
Optional<bool> sort_ascending;
- struct Width : public LLInitParam::Choice<Width>
+ struct Width : public LLInitParam::ChoiceBlock<Width>
{
Alternative<bool> dynamic_width;
Alternative<S32> pixel_width;
@@ -112,7 +112,7 @@ public:
Optional<Width> width;
// either an image or label is used in column header
- struct Header : public LLInitParam::Choice<Header>
+ struct Header : public LLInitParam::ChoiceBlock<Header>
{
Alternative<std::string> label;
Alternative<LLUIImage*> image;
diff --git a/indra/llui/llscrolllistctrl.cpp b/indra/llui/llscrolllistctrl.cpp
index 622f3e215c..466fac33ea 100644
--- a/indra/llui/llscrolllistctrl.cpp
+++ b/indra/llui/llscrolllistctrl.cpp
@@ -175,6 +175,7 @@ LLScrollListCtrl::LLScrollListCtrl(const LLScrollListCtrl::Params& p)
mBorder(NULL),
mSortCallback(NULL),
mPopupMenu(NULL),
+ mCommentTextView(NULL),
mNumDynamicWidthColumns(0),
mTotalStaticColumnWidth(0),
mTotalColumnPadding(0),
@@ -476,7 +477,12 @@ void LLScrollListCtrl::updateLayout()
getRect().getWidth() - 2 * mBorderThickness,
getRect().getHeight() - (2 * mBorderThickness ) - heading_size );
- getChildView("comment_text")->setShape(mItemListRect);
+ if (mCommentTextView == NULL)
+ {
+ mCommentTextView = getChildView("comment_text");
+ }
+
+ mCommentTextView->setShape(mItemListRect);
// how many lines of content in a single "page"
S32 page_lines = getLinesPerPage();
diff --git a/indra/llui/llscrolllistctrl.h b/indra/llui/llscrolllistctrl.h
index 09ab89960d..ae8aea9245 100644
--- a/indra/llui/llscrolllistctrl.h
+++ b/indra/llui/llscrolllistctrl.h
@@ -480,6 +480,8 @@ private:
S32 mHighlightedItem;
class LLViewBorder* mBorder;
LLContextMenu *mPopupMenu;
+
+ LLView *mCommentTextView;
LLWString mSearchString;
LLFrameTimer mSearchTimer;
diff --git a/indra/llui/llsdparam.cpp b/indra/llui/llsdparam.cpp
deleted file mode 100644
index 04919e6991..0000000000
--- a/indra/llui/llsdparam.cpp
+++ /dev/null
@@ -1,314 +0,0 @@
-/**
- * @file llsdparam.cpp
- * @brief parameter block abstraction for creating complex objects and
- * parsing construction parameters from xml and LLSD
- *
- * $LicenseInfo:firstyear=2008&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-#include "linden_common.h"
-
-// Project includes
-#include "llsdparam.h"
-#include "llsdutil.h"
-
-static LLInitParam::Parser::parser_read_func_map_t sReadFuncs;
-static LLInitParam::Parser::parser_write_func_map_t sWriteFuncs;
-static LLInitParam::Parser::parser_inspect_func_map_t sInspectFuncs;
-
-//
-// LLParamSDParser
-//
-LLParamSDParser::LLParamSDParser()
-: Parser(sReadFuncs, sWriteFuncs, sInspectFuncs)
-{
- using boost::bind;
-
- if (sReadFuncs.empty())
- {
- registerParserFuncs<LLInitParam::NoParamValue>(readNoValue, &LLParamSDParser::writeNoValue);
- registerParserFuncs<S32>(readS32, &LLParamSDParser::writeTypedValue<S32>);
- registerParserFuncs<U32>(readU32, &LLParamSDParser::writeU32Param);
- registerParserFuncs<F32>(readF32, &LLParamSDParser::writeTypedValue<F32>);
- registerParserFuncs<F64>(readF64, &LLParamSDParser::writeTypedValue<F64>);
- registerParserFuncs<bool>(readBool, &LLParamSDParser::writeTypedValue<bool>);
- registerParserFuncs<std::string>(readString, &LLParamSDParser::writeTypedValue<std::string>);
- registerParserFuncs<LLUUID>(readUUID, &LLParamSDParser::writeTypedValue<LLUUID>);
- registerParserFuncs<LLDate>(readDate, &LLParamSDParser::writeTypedValue<LLDate>);
- registerParserFuncs<LLURI>(readURI, &LLParamSDParser::writeTypedValue<LLURI>);
- registerParserFuncs<LLSD>(readSD, &LLParamSDParser::writeTypedValue<LLSD>);
- }
-}
-
-// special case handling of U32 due to ambiguous LLSD::assign overload
-bool LLParamSDParser::writeU32Param(LLParamSDParser::parser_t& parser, const void* val_ptr, const parser_t::name_stack_t& name_stack)
-{
- LLParamSDParser& sdparser = static_cast<LLParamSDParser&>(parser);
- if (!sdparser.mWriteRootSD) return false;
-
- LLSD* sd_to_write = sdparser.getSDWriteNode(name_stack);
- if (!sd_to_write) return false;
-
- sd_to_write->assign((S32)*((const U32*)val_ptr));
- return true;
-}
-
-bool LLParamSDParser::writeNoValue(LLParamSDParser::parser_t& parser, const void* val_ptr, const parser_t::name_stack_t& name_stack)
-{
- LLParamSDParser& sdparser = static_cast<LLParamSDParser&>(parser);
- if (!sdparser.mWriteRootSD) return false;
-
- LLSD* sd_to_write = sdparser.getSDWriteNode(name_stack);
- if (!sd_to_write) return false;
-
- return true;
-}
-
-
-void LLParamSDParser::readSD(const LLSD& sd, LLInitParam::BaseBlock& block, bool silent)
-{
- mCurReadSD = NULL;
- mNameStack.clear();
- setParseSilently(silent);
-
- readSDValues(sd, block);
-}
-
-void LLParamSDParser::writeSD(LLSD& sd, const LLInitParam::BaseBlock& block)
-{
- mNameStack.clear();
- mWriteRootSD = &sd;
- block.serializeBlock(*this);
-}
-
-const LLSD NO_VALUE_MARKER;
-
-void LLParamSDParser::readSDValues(const LLSD& sd, LLInitParam::BaseBlock& block)
-{
- if (sd.isMap())
- {
- for (LLSD::map_const_iterator it = sd.beginMap();
- it != sd.endMap();
- ++it)
- {
- mNameStack.push_back(make_pair(it->first, newParseGeneration()));
- readSDValues(it->second, block);
- mNameStack.pop_back();
- }
- }
- else if (sd.isArray())
- {
- for (LLSD::array_const_iterator it = sd.beginArray();
- it != sd.endArray();
- ++it)
- {
- mNameStack.back().second = newParseGeneration();
- readSDValues(*it, block);
- }
- }
- else if (sd.isUndefined())
- {
- mCurReadSD = &NO_VALUE_MARKER;
- block.submitValue(mNameStack, *this);
- }
- else
- {
- mCurReadSD = &sd;
- block.submitValue(mNameStack, *this);
- }
-}
-
-/*virtual*/ std::string LLParamSDParser::getCurrentElementName()
-{
- std::string full_name = "sd";
- for (name_stack_t::iterator it = mNameStack.begin();
- it != mNameStack.end();
- ++it)
- {
- full_name += llformat("[%s]", it->first.c_str());
- }
-
- return full_name;
-}
-
-LLSD* LLParamSDParser::getSDWriteNode(const parser_t::name_stack_t& name_stack)
-{
- //TODO: implement nested LLSD writing
- LLSD* sd_to_write = mWriteRootSD;
- bool new_traversal = false;
- for (name_stack_t::const_iterator it = name_stack.begin(), prev_it = mNameStack.begin();
- it != name_stack.end();
- ++it)
- {
- bool new_array_entry = false;
- if (prev_it == mNameStack.end())
- {
- new_traversal = true;
- }
- else
- {
- if (!new_traversal // have not diverged yet from previous trace
- && prev_it->first == it->first // names match
- && prev_it->second != it->second) // versions differ
- {
- // name stacks match, but version numbers differ in last place.
- // create a different entry at this point using an LLSD array
- new_array_entry = true;
- }
- if (prev_it->first != it->first // names differ
- || prev_it->second != it->second) // versions differ
- {
- // at this point we have diverged from our last trace
- // so any elements referenced here are new
- new_traversal = true;
- }
- }
-
- LLSD* child_sd = it->first.empty() ? sd_to_write : &(*sd_to_write)[it->first];
-
- if (child_sd->isArray())
- {
- if (new_traversal)
- {
- // write to new element at end
- sd_to_write = &(*child_sd)[child_sd->size()];
- }
- else
- {
- // write to last of existing elements, or first element if empty
- sd_to_write = &(*child_sd)[llmax(0, child_sd->size() - 1)];
- }
- }
- else
- {
- if (new_array_entry && !child_sd->isArray())
- {
- // copy child contents into first element of an array
- LLSD new_array = LLSD::emptyArray();
- new_array.append(*child_sd);
- // assign array to slot that previously held the single value
- *child_sd = new_array;
- // return next element in that array
- sd_to_write = &((*child_sd)[1]);
- }
- else
- {
- sd_to_write = child_sd;
- }
- }
- if (prev_it != mNameStack.end())
- {
- ++prev_it;
- }
- }
- mNameStack = name_stack;
-
- //llinfos << ll_pretty_print_sd(*mWriteRootSD) << llendl;
- return sd_to_write;
-}
-
-bool LLParamSDParser::readNoValue(Parser& parser, void* val_ptr)
-{
- LLParamSDParser& self = static_cast<LLParamSDParser&>(parser);
- return self.mCurReadSD == &NO_VALUE_MARKER;
-}
-
-
-bool LLParamSDParser::readS32(Parser& parser, void* val_ptr)
-{
- LLParamSDParser& self = static_cast<LLParamSDParser&>(parser);
-
- *((S32*)val_ptr) = self.mCurReadSD->asInteger();
- return true;
-}
-
-bool LLParamSDParser::readU32(Parser& parser, void* val_ptr)
-{
- LLParamSDParser& self = static_cast<LLParamSDParser&>(parser);
-
- *((U32*)val_ptr) = self.mCurReadSD->asInteger();
- return true;
-}
-
-bool LLParamSDParser::readF32(Parser& parser, void* val_ptr)
-{
- LLParamSDParser& self = static_cast<LLParamSDParser&>(parser);
-
- *((F32*)val_ptr) = self.mCurReadSD->asReal();
- return true;
-}
-
-bool LLParamSDParser::readF64(Parser& parser, void* val_ptr)
-{
- LLParamSDParser& self = static_cast<LLParamSDParser&>(parser);
-
- *((F64*)val_ptr) = self.mCurReadSD->asReal();
- return true;
-}
-
-bool LLParamSDParser::readBool(Parser& parser, void* val_ptr)
-{
- LLParamSDParser& self = static_cast<LLParamSDParser&>(parser);
-
- *((bool*)val_ptr) = self.mCurReadSD->asBoolean();
- return true;
-}
-
-bool LLParamSDParser::readString(Parser& parser, void* val_ptr)
-{
- LLParamSDParser& self = static_cast<LLParamSDParser&>(parser);
-
- *((std::string*)val_ptr) = self.mCurReadSD->asString();
- return true;
-}
-
-bool LLParamSDParser::readUUID(Parser& parser, void* val_ptr)
-{
- LLParamSDParser& self = static_cast<LLParamSDParser&>(parser);
-
- *((LLUUID*)val_ptr) = self.mCurReadSD->asUUID();
- return true;
-}
-
-bool LLParamSDParser::readDate(Parser& parser, void* val_ptr)
-{
- LLParamSDParser& self = static_cast<LLParamSDParser&>(parser);
-
- *((LLDate*)val_ptr) = self.mCurReadSD->asDate();
- return true;
-}
-
-bool LLParamSDParser::readURI(Parser& parser, void* val_ptr)
-{
- LLParamSDParser& self = static_cast<LLParamSDParser&>(parser);
-
- *((LLURI*)val_ptr) = self.mCurReadSD->asURI();
- return true;
-}
-
-bool LLParamSDParser::readSD(Parser& parser, void* val_ptr)
-{
- LLParamSDParser& self = static_cast<LLParamSDParser&>(parser);
-
- *((LLSD*)val_ptr) = *self.mCurReadSD;
- return true;
-}
diff --git a/indra/llui/llsdparam.h b/indra/llui/llsdparam.h
deleted file mode 100644
index f776c781b3..0000000000
--- a/indra/llui/llsdparam.h
+++ /dev/null
@@ -1,113 +0,0 @@
-/**
- * @file llsdparam.h
- * @brief parameter block abstraction for creating complex objects and
- * parsing construction parameters from xml and LLSD
- *
- * $LicenseInfo:firstyear=2008&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-#ifndef LL_LLSDPARAM_H
-#define LL_LLSDPARAM_H
-
-#include "llinitparam.h"
-
-class LLParamSDParser
-: public LLInitParam::Parser
-{
-LOG_CLASS(LLParamSDParser);
-
-typedef LLInitParam::Parser parser_t;
-
-public:
- LLParamSDParser();
- void readSD(const LLSD& sd, LLInitParam::BaseBlock& block, bool silent = false);
- void writeSD(LLSD& sd, const LLInitParam::BaseBlock& block);
-
- /*virtual*/ std::string getCurrentElementName();
-
-private:
- void readSDValues(const LLSD& sd, LLInitParam::BaseBlock& block);
-
- template<typename T>
- static bool writeTypedValue(Parser& parser, const void* val_ptr, const parser_t::name_stack_t& name_stack)
- {
- LLParamSDParser& sdparser = static_cast<LLParamSDParser&>(parser);
- if (!sdparser.mWriteRootSD) return false;
-
- LLSD* sd_to_write = sdparser.getSDWriteNode(name_stack);
- if (!sd_to_write) return false;
-
- sd_to_write->assign(*((const T*)val_ptr));
- return true;
- }
-
- LLSD* getSDWriteNode(const parser_t::name_stack_t& name_stack);
-
- static bool writeU32Param(Parser& parser, const void* value_ptr, const parser_t::name_stack_t& name_stack);
- static bool writeNoValue(Parser& parser, const void* value_ptr, const parser_t::name_stack_t& name_stack);
-
- static bool readNoValue(Parser& parser, void* val_ptr);
- static bool readS32(Parser& parser, void* val_ptr);
- static bool readU32(Parser& parser, void* val_ptr);
- static bool readF32(Parser& parser, void* val_ptr);
- static bool readF64(Parser& parser, void* val_ptr);
- static bool readBool(Parser& parser, void* val_ptr);
- static bool readString(Parser& parser, void* val_ptr);
- static bool readUUID(Parser& parser, void* val_ptr);
- static bool readDate(Parser& parser, void* val_ptr);
- static bool readURI(Parser& parser, void* val_ptr);
- static bool readSD(Parser& parser, void* val_ptr);
-
- Parser::name_stack_t mNameStack;
- const LLSD* mCurReadSD;
- LLSD* mWriteRootSD;
- LLSD* mCurWriteSD;
-};
-
-template<typename T>
-class LLSDParamAdapter : public T
- {
- public:
- LLSDParamAdapter() {}
- LLSDParamAdapter(const LLSD& sd)
- {
- LLParamSDParser parser;
- parser.readSD(sd, *this);
- }
-
- operator LLSD() const
- {
- LLParamSDParser parser;
- LLSD sd;
- parser.writeSD(sd, *this);
- return sd;
- }
-
- LLSDParamAdapter(const T& val)
- : T(val)
- {
- T::operator=(val);
- }
- };
-
-#endif // LL_LLSDPARAM_H
-
diff --git a/indra/llui/llspinctrl.h b/indra/llui/llspinctrl.h
index d197084e38..87814f838e 100644
--- a/indra/llui/llspinctrl.h
+++ b/indra/llui/llspinctrl.h
@@ -96,6 +96,9 @@ public:
void onUpBtn(const LLSD& data);
void onDownBtn(const LLSD& data);
+
+ const LLColor4& getEnabledTextColor() const { return mTextEnabledColor.get(); }
+ const LLColor4& getDisabledTextColor() const { return mTextDisabledColor.get(); }
private:
void updateLabelColor();
diff --git a/indra/llui/lltabcontainer.cpp b/indra/llui/lltabcontainer.cpp
index 9c6a76822c..5fc2cc350d 100644
--- a/indra/llui/lltabcontainer.cpp
+++ b/indra/llui/lltabcontainer.cpp
@@ -98,24 +98,25 @@ class LLCustomButtonIconCtrl : public LLButton
{
public:
struct Params
- : public LLInitParam::Block<Params, LLButton::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)
+ Params()
+ : icon_ctrl_pad("icon_ctrl_pad", 1)
{}
};
protected:
friend class LLUICtrlFactory;
- LLCustomButtonIconCtrl(const Params& p):
- LLButton(p),
+
+ LLCustomButtonIconCtrl(const Params& p)
+ : LLButton(p),
mIcon(NULL),
mIconAlignment(LLFontGL::HCENTER),
mIconCtrlPad(p.icon_ctrl_pad)
- {}
+ {}
public:
@@ -214,6 +215,7 @@ LLTabContainer::Params::Params()
middle_tab("middle_tab"),
last_tab("last_tab"),
use_custom_icon_ctrl("use_custom_icon_ctrl", false),
+ open_tabs_on_drag_and_drop("open_tabs_on_drag_and_drop", false),
tab_icon_ctrl_pad("tab_icon_ctrl_pad", 0),
use_ellipses("use_ellipses"),
font_halign("halign")
@@ -250,6 +252,7 @@ LLTabContainer::LLTabContainer(const LLTabContainer::Params& p)
mMiddleTabParams(p.middle_tab),
mLastTabParams(p.last_tab),
mCustomIconCtrlUsed(p.use_custom_icon_ctrl),
+ mOpenTabsOnDragAndDrop(p.open_tabs_on_drag_and_drop),
mTabIconCtrlPad(p.tab_icon_ctrl_pad),
mUseTabEllipses(p.use_ellipses)
{
@@ -548,23 +551,23 @@ BOOL LLTabContainer::handleMouseDown( S32 x, S32 y, MASK mask )
}
S32 tab_count = getTabCount();
- if (tab_count > 0)
+ if (tab_count > 0 && !getTabsHidden())
{
LLTabTuple* firsttuple = getTab(0);
LLRect tab_rect;
if (mIsVertical)
{
tab_rect = LLRect(firsttuple->mButton->getRect().mLeft,
- has_scroll_arrows ? mPrevArrowBtn->getRect().mBottom - tabcntrv_pad : mPrevArrowBtn->getRect().mTop,
- firsttuple->mButton->getRect().mRight,
- has_scroll_arrows ? mNextArrowBtn->getRect().mTop + tabcntrv_pad : mNextArrowBtn->getRect().mBottom );
+ has_scroll_arrows ? mPrevArrowBtn->getRect().mBottom - tabcntrv_pad : mPrevArrowBtn->getRect().mTop,
+ firsttuple->mButton->getRect().mRight,
+ has_scroll_arrows ? mNextArrowBtn->getRect().mTop + tabcntrv_pad : mNextArrowBtn->getRect().mBottom );
}
else
{
tab_rect = LLRect(has_scroll_arrows ? mPrevArrowBtn->getRect().mRight : mJumpPrevArrowBtn->getRect().mLeft,
- firsttuple->mButton->getRect().mTop,
- has_scroll_arrows ? mNextArrowBtn->getRect().mLeft : mJumpNextArrowBtn->getRect().mRight,
- firsttuple->mButton->getRect().mBottom );
+ firsttuple->mButton->getRect().mTop,
+ has_scroll_arrows ? mNextArrowBtn->getRect().mLeft : mJumpNextArrowBtn->getRect().mRight,
+ firsttuple->mButton->getRect().mBottom );
}
if( tab_rect.pointInRect( x, y ) )
{
@@ -681,7 +684,7 @@ BOOL LLTabContainer::handleToolTip( S32 x, S32 y, MASK mask)
{
static LLUICachedControl<S32> tabcntrv_pad ("UITabCntrvPad", 0);
BOOL handled = LLPanel::handleToolTip( x, y, mask);
- if (!handled && getTabCount() > 0)
+ if (!handled && getTabCount() > 0 && !getTabsHidden())
{
LLTabTuple* firsttuple = getTab(0);
@@ -812,48 +815,62 @@ BOOL LLTabContainer::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, EDrag
{
BOOL has_scroll_arrows = (getMaxScrollPos() > 0);
- if( mDragAndDropDelayTimer.getStarted() && mDragAndDropDelayTimer.getElapsedTimeF32() > SCROLL_DELAY_TIME )
+ if(mOpenTabsOnDragAndDrop && !getTabsHidden())
{
- if (has_scroll_arrows)
+ // In that case, we'll open the hovered tab while dragging and dropping items.
+ // This allows for drilling through tabs.
+ if (mDragAndDropDelayTimer.getStarted())
{
- if (mJumpPrevArrowBtn && mJumpPrevArrowBtn->getRect().pointInRect(x, y))
- {
- S32 local_x = x - mJumpPrevArrowBtn->getRect().mLeft;
- S32 local_y = y - mJumpPrevArrowBtn->getRect().mBottom;
- mJumpPrevArrowBtn->handleHover(local_x, local_y, mask);
- }
- if (mJumpNextArrowBtn && mJumpNextArrowBtn->getRect().pointInRect(x, y))
- {
- S32 local_x = x - mJumpNextArrowBtn->getRect().mLeft;
- S32 local_y = y - mJumpNextArrowBtn->getRect().mBottom;
- mJumpNextArrowBtn->handleHover(local_x, local_y, mask);
- }
- if (mPrevArrowBtn->getRect().pointInRect(x, y))
- {
- S32 local_x = x - mPrevArrowBtn->getRect().mLeft;
- S32 local_y = y - mPrevArrowBtn->getRect().mBottom;
- mPrevArrowBtn->handleHover(local_x, local_y, mask);
- }
- else if (mNextArrowBtn->getRect().pointInRect(x, y))
+ if (mDragAndDropDelayTimer.getElapsedTimeF32() > SCROLL_DELAY_TIME)
{
- S32 local_x = x - mNextArrowBtn->getRect().mLeft;
- S32 local_y = y - mNextArrowBtn->getRect().mBottom;
- mNextArrowBtn->handleHover(local_x, local_y, mask);
- }
- }
+ if (has_scroll_arrows)
+ {
+ if (mJumpPrevArrowBtn && mJumpPrevArrowBtn->getRect().pointInRect(x, y))
+ {
+ S32 local_x = x - mJumpPrevArrowBtn->getRect().mLeft;
+ S32 local_y = y - mJumpPrevArrowBtn->getRect().mBottom;
+ mJumpPrevArrowBtn->handleHover(local_x, local_y, mask);
+ }
+ if (mJumpNextArrowBtn && mJumpNextArrowBtn->getRect().pointInRect(x, y))
+ {
+ S32 local_x = x - mJumpNextArrowBtn->getRect().mLeft;
+ S32 local_y = y - mJumpNextArrowBtn->getRect().mBottom;
+ mJumpNextArrowBtn->handleHover(local_x, local_y, mask);
+ }
+ if (mPrevArrowBtn->getRect().pointInRect(x, y))
+ {
+ S32 local_x = x - mPrevArrowBtn->getRect().mLeft;
+ S32 local_y = y - mPrevArrowBtn->getRect().mBottom;
+ mPrevArrowBtn->handleHover(local_x, local_y, mask);
+ }
+ else if (mNextArrowBtn->getRect().pointInRect(x, y))
+ {
+ S32 local_x = x - mNextArrowBtn->getRect().mLeft;
+ S32 local_y = y - mNextArrowBtn->getRect().mBottom;
+ mNextArrowBtn->handleHover(local_x, local_y, mask);
+ }
+ }
- for(tuple_list_t::iterator iter = mTabList.begin(); iter != mTabList.end(); ++iter)
- {
- LLTabTuple* tuple = *iter;
- tuple->mButton->setVisible( TRUE );
- S32 local_x = x - tuple->mButton->getRect().mLeft;
- S32 local_y = y - tuple->mButton->getRect().mBottom;
- if (tuple->mButton->pointInView(local_x, local_y) && tuple->mButton->getEnabled() && !tuple->mTabPanel->getVisible())
- {
- tuple->mButton->onCommit();
+ for(tuple_list_t::iterator iter = mTabList.begin(); iter != mTabList.end(); ++iter)
+ {
+ LLTabTuple* tuple = *iter;
+ tuple->mButton->setVisible( TRUE );
+ S32 local_x = x - tuple->mButton->getRect().mLeft;
+ S32 local_y = y - tuple->mButton->getRect().mBottom;
+ if (tuple->mButton->pointInView(local_x, local_y) && tuple->mButton->getEnabled() && !tuple->mTabPanel->getVisible())
+ {
+ tuple->mButton->onCommit();
+ }
+ }
+ // Stop the timer whether successful or not. Don't let it run forever.
mDragAndDropDelayTimer.stop();
}
}
+ else
+ {
+ // Start a timer so we don't open tabs as soon as we hover on them
+ mDragAndDropDelayTimer.start();
+ }
}
return LLView::handleDragAndDrop(x, y, mask, drop, type, cargo_data, accept, tooltip);
@@ -1023,85 +1040,50 @@ void LLTabContainer::addTabPanel(const TabPanelParams& panel)
}
else
{
+ LLButton::Params& p = (mCustomIconCtrlUsed ? custom_btn_params : normal_btn_params);
+
+ p.rect(btn_rect);
+ p.font(mFont);
+ p.font_halign = mFontHalign;
+ p.label(trimmed_label);
+ p.click_callback.function(boost::bind(&LLTabContainer::onTabBtn, this, _2, child));
+ if (indent)
+ {
+ p.pad_left(indent);
+ }
+ p.pad_bottom( mLabelPadBottom );
+ p.scale_image(true);
+ p.tab_stop(false);
+ p.label_shadow(false);
+ p.follows.flags = FOLLOWS_LEFT;
+
if (mIsVertical)
{
- 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);
- p.click_callback.function(boost::bind(&LLTabContainer::onTabBtn, this, _2, child));
- p.font(mFont);
- p.label(trimmed_label);
p.image_unselected(mMiddleTabParams.tab_left_image_unselected);
p.image_selected(mMiddleTabParams.tab_left_image_selected);
- p.scale_image(true);
- p.font_halign = mFontHalign;
- p.pad_bottom( mLabelPadBottom );
- p.tab_stop(false);
- p.label_shadow(false);
- if (indent)
- {
- p.pad_left(indent);
- }
-
-
- if(mCustomIconCtrlUsed)
- {
- btn = LLUICtrlFactory::create<LLCustomButtonIconCtrl>(custom_btn_params);
-
- }
- else
- {
- btn = LLUICtrlFactory::create<LLButton>(p);
- }
+ p.follows.flags = p.follows.flags() | FOLLOWS_TOP;
}
else
{
- 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));
- p.font(mFont);
- p.label(trimmed_label);
p.visible(false);
- p.scale_image(true);
p.image_unselected(tab_img);
p.image_selected(tab_selected_img);
- p.tab_stop(false);
- p.label_shadow(false);
+ p.follows.flags = p.follows.flags() | (getTabPosition() == TOP ? FOLLOWS_TOP : FOLLOWS_BOTTOM);
// Try to squeeze in a bit more text
p.pad_left( mLabelPadLeft );
p.pad_right(2);
- p.pad_bottom( mLabelPadBottom );
- p.font_halign = mFontHalign;
- p.follows.flags = FOLLOWS_LEFT;
- p.follows.flags = FOLLOWS_LEFT;
-
- if (indent)
- {
- p.pad_left(indent);
- }
-
- if( getTabPosition() == TOP )
- {
- p.follows.flags = p.follows.flags() | FOLLOWS_TOP;
- }
- else
- {
- p.follows.flags = p.follows.flags() | FOLLOWS_BOTTOM;
- }
-
- if(mCustomIconCtrlUsed)
- {
- btn = LLUICtrlFactory::create<LLCustomButtonIconCtrl>(custom_btn_params);
- }
- else
- {
- btn = LLUICtrlFactory::create<LLButton>(p);
- }
+ }
+
+ // *TODO : It seems wrong not to use p in both cases considering the way p is initialized
+ if (mCustomIconCtrlUsed)
+ {
+ btn = LLUICtrlFactory::create<LLCustomButtonIconCtrl>(custom_btn_params);
+ }
+ else
+ {
+ btn = LLUICtrlFactory::create<LLButton>(p);
}
}
@@ -1278,6 +1260,10 @@ void LLTabContainer::enableTabButton(S32 which, BOOL enable)
{
mTabList[which]->mButton->setEnabled(enable);
}
+ // Stop the DaD timer as it might run forever
+ // enableTabButton() is typically called on refresh and draw when anything changed
+ // in the tab container so it's a good time to reset that.
+ mDragAndDropDelayTimer.stop();
}
void LLTabContainer::deleteAllTabs()
diff --git a/indra/llui/lltabcontainer.h b/indra/llui/lltabcontainer.h
index eaa2fd54e0..cebace2ceb 100644
--- a/indra/llui/lltabcontainer.h
+++ b/indra/llui/lltabcontainer.h
@@ -105,6 +105,11 @@ public:
Optional<bool> use_custom_icon_ctrl;
/**
+ * Open tabs on hover in drag and drop situations
+ */
+ Optional<bool> open_tabs_on_drag_and_drop;
+
+ /**
* Paddings for LLIconCtrl in case of LLCustomButtonIconCtrl usage(use_custom_icon_ctrl = true)
*/
Optional<S32> tab_icon_ctrl_pad;
@@ -300,6 +305,7 @@ private:
TabParams mLastTabParams;
bool mCustomIconCtrlUsed;
+ bool mOpenTabsOnDragAndDrop;
S32 mTabIconCtrlPad;
bool mUseTabEllipses;
};
diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp
index 919364be63..0040be45c7 100644
--- a/indra/llui/lltextbase.cpp
+++ b/indra/llui/lltextbase.cpp
@@ -598,7 +598,7 @@ S32 LLTextBase::insertStringNoUndo(S32 pos, const LLWString &wstr, LLTextBase::s
pos = getEditableIndex(pos, true);
- segment_set_t::iterator seg_iter = getSegIterContaining(pos);
+ segment_set_t::iterator seg_iter = getEditableSegIterContaining(pos);
LLTextSegmentPtr default_segment;
@@ -1510,8 +1510,48 @@ void LLTextBase::getSegmentAndOffset( S32 startpos, segment_set_t::iterator* seg
}
}
+LLTextBase::segment_set_t::iterator LLTextBase::getEditableSegIterContaining(S32 index)
+{
+ segment_set_t::iterator it = getSegIterContaining(index);
+ segment_set_t::iterator orig_it = it;
+
+ if (it == mSegments.end()) return it;
+
+ if (!(*it)->canEdit()
+ && index == (*it)->getStart()
+ && it != mSegments.begin())
+ {
+ it--;
+ if ((*it)->canEdit())
+ {
+ return it;
+ }
+ }
+ return orig_it;
+}
+
+LLTextBase::segment_set_t::const_iterator LLTextBase::getEditableSegIterContaining(S32 index) const
+{
+ segment_set_t::const_iterator it = getSegIterContaining(index);
+ segment_set_t::const_iterator orig_it = it;
+ if (it == mSegments.end()) return it;
+
+ if (!(*it)->canEdit()
+ && index == (*it)->getStart()
+ && it != mSegments.begin())
+ {
+ it--;
+ if ((*it)->canEdit())
+ {
+ return it;
+ }
+ }
+ return orig_it;
+}
+
LLTextBase::segment_set_t::iterator LLTextBase::getSegIterContaining(S32 index)
{
+
static LLPointer<LLIndexSegment> index_segment = new LLIndexSegment();
if (index > getLength()) { return mSegments.end(); }
@@ -2518,7 +2558,11 @@ BOOL LLTextSegment::handleDoubleClick(S32 x, S32 y, MASK mask) { return FALSE; }
BOOL LLTextSegment::handleHover(S32 x, S32 y, MASK mask) { return FALSE; }
BOOL LLTextSegment::handleScrollWheel(S32 x, S32 y, S32 clicks) { return FALSE; }
BOOL LLTextSegment::handleToolTip(S32 x, S32 y, MASK mask) { return FALSE; }
-std::string LLTextSegment::getName() const { return ""; }
+const std::string& LLTextSegment::getName() const
+{
+ static std::string empty_string("");
+ return empty_string;
+}
void LLTextSegment::onMouseCaptureLost() {}
void LLTextSegment::screenPointToLocal(S32 screen_x, S32 screen_y, S32* local_x, S32* local_y) const {}
void LLTextSegment::localPointToScreen(S32 local_x, S32 local_y, S32* screen_x, S32* screen_y) const {}
diff --git a/indra/llui/lltextbase.h b/indra/llui/lltextbase.h
index 7d545a1ba6..0549141b72 100644
--- a/indra/llui/lltextbase.h
+++ b/indra/llui/lltextbase.h
@@ -84,7 +84,7 @@ public:
/*virtual*/ BOOL handleHover(S32 x, S32 y, MASK mask);
/*virtual*/ BOOL handleScrollWheel(S32 x, S32 y, S32 clicks);
/*virtual*/ BOOL handleToolTip(S32 x, S32 y, MASK mask);
- /*virtual*/ std::string getName() const;
+ /*virtual*/ const std::string& getName() const;
/*virtual*/ void onMouseCaptureLost();
/*virtual*/ void screenPointToLocal(S32 screen_x, S32 screen_y, S32* local_x, S32* local_y) const;
/*virtual*/ void localPointToScreen(S32 local_x, S32 local_y, S32* screen_x, S32* screen_y) const;
@@ -237,7 +237,7 @@ public:
friend class LLNormalTextSegment;
friend class LLUICtrlFactory;
- struct LineSpacingParams : public LLInitParam::Choice<LineSpacingParams>
+ struct LineSpacingParams : public LLInitParam::ChoiceBlock<LineSpacingParams>
{
Alternative<F32> multiple;
Alternative<S32> pixels;
@@ -461,6 +461,8 @@ protected:
void getSegmentAndOffset( S32 startpos, segment_set_t::const_iterator* seg_iter, S32* offsetp ) const;
void getSegmentAndOffset( S32 startpos, segment_set_t::iterator* seg_iter, S32* offsetp );
LLTextSegmentPtr getSegmentAtLocalPos( S32 x, S32 y, bool hit_past_end_of_line = true);
+ segment_set_t::iterator getEditableSegIterContaining(S32 index);
+ segment_set_t::const_iterator getEditableSegIterContaining(S32 index) const;
segment_set_t::iterator getSegIterContaining(S32 index);
segment_set_t::const_iterator getSegIterContaining(S32 index) const;
void clearSegments();
diff --git a/indra/llui/lltexteditor.cpp b/indra/llui/lltexteditor.cpp
index 9bd445988d..3a23ce1cac 100644
--- a/indra/llui/lltexteditor.cpp
+++ b/indra/llui/lltexteditor.cpp
@@ -2250,6 +2250,22 @@ void LLTextEditor::insertText(const std::string &new_text)
setEnabled( enabled );
}
+void LLTextEditor::insertText(LLWString &new_text)
+{
+ BOOL enabled = getEnabled();
+ setEnabled( TRUE );
+
+ // Delete any selected characters (the insertion replaces them)
+ if( hasSelection() )
+ {
+ deleteSelection(TRUE);
+ }
+
+ setCursorPos(mCursorPos + insert( mCursorPos, new_text, FALSE, LLTextSegmentPtr() ));
+
+ setEnabled( enabled );
+}
+
void LLTextEditor::appendWidget(const LLInlineViewSegment::Params& params, const std::string& text, bool allow_undo)
{
// Save old state
@@ -2838,3 +2854,13 @@ void LLTextEditor::clear()
getViewModel()->setDisplay(LLWStringUtil::null);
clearSegments();
}
+
+bool LLTextEditor::canLoadOrSaveToFile()
+{
+ return !mReadOnly;
+}
+
+S32 LLTextEditor::spacesPerTab()
+{
+ return SPACES_PER_TAB;
+}
diff --git a/indra/llui/lltexteditor.h b/indra/llui/lltexteditor.h
index 9e4b95003b..40821ae9fb 100644
--- a/indra/llui/lltexteditor.h
+++ b/indra/llui/lltexteditor.h
@@ -92,6 +92,8 @@ public:
void setParseHighlights(BOOL parsing) {mParseHighlights=parsing;}
+ static S32 spacesPerTab();
+
// mousehandler overrides
virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask);
virtual BOOL handleMouseUp(S32 x, S32 y, MASK mask);
@@ -140,6 +142,8 @@ public:
virtual void selectAll();
virtual BOOL canSelectAll() const;
+ virtual bool canLoadOrSaveToFile();
+
void selectNext(const std::string& search_text_in, BOOL case_insensitive, BOOL wrap = TRUE);
BOOL replaceText(const std::string& search_text, const std::string& replace_text, BOOL case_insensitive, BOOL wrap = TRUE);
void replaceTextAll(const std::string& search_text, const std::string& replace_text, BOOL case_insensitive);
@@ -158,6 +162,7 @@ public:
// inserts text at cursor
void insertText(const std::string &text);
+ void insertText(LLWString &text);
void appendWidget(const LLInlineViewSegment::Params& params, const std::string& text, bool allow_undo);
// Non-undoable
diff --git a/indra/llui/lltextparser.cpp b/indra/llui/lltextparser.cpp
index a4fe4f6ca8..8a85f99e0c 100644
--- a/indra/llui/lltextparser.cpp
+++ b/indra/llui/lltextparser.cpp
@@ -46,8 +46,6 @@ LLTextParser::LLTextParser()
{}
-// Moved triggerAlerts() to llfloaterchat.cpp to break llui/llaudio library dependency.
-
S32 LLTextParser::findPattern(const std::string &text, LLSD highlight)
{
if (!highlight.has("pattern")) return -1;
diff --git a/indra/llui/lltoolbar.cpp b/indra/llui/lltoolbar.cpp
new file mode 100644
index 0000000000..9b31a6449d
--- /dev/null
+++ b/indra/llui/lltoolbar.cpp
@@ -0,0 +1,1230 @@
+/**
+ * @file lltoolbar.cpp
+ * @author Richard Nelson
+ * @brief User customizable toolbar class
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "linden_common.h"
+
+#include <boost/foreach.hpp>
+#include "lltoolbar.h"
+
+#include "llcommandmanager.h"
+#include "llmenugl.h"
+#include "lltrans.h"
+#include "llinventory.h"
+#include "lliconctrl.h"
+
+// uncomment this and remove the one in llui.cpp when there is an external reference to this translation unit
+// thanks, MSVC!
+//static LLDefaultChildRegistry::Register<LLToolBar> r1("toolbar");
+
+namespace LLToolBarEnums
+{
+ LLLayoutStack::ELayoutOrientation getOrientation(SideType sideType)
+ {
+ LLLayoutStack::ELayoutOrientation orientation = LLLayoutStack::HORIZONTAL;
+
+ if ((sideType == SIDE_LEFT) || (sideType == SIDE_RIGHT))
+ {
+ orientation = LLLayoutStack::VERTICAL;
+ }
+
+ return orientation;
+ }
+}
+
+using namespace LLToolBarEnums;
+
+
+namespace LLInitParam
+{
+ void TypeValues<ButtonType>::declareValues()
+ {
+ declare("icons_with_text", BTNTYPE_ICONS_WITH_TEXT);
+ declare("icons_only", BTNTYPE_ICONS_ONLY);
+ }
+
+ void TypeValues<SideType>::declareValues()
+ {
+ declare("bottom", SIDE_BOTTOM);
+ declare("left", SIDE_LEFT);
+ declare("right", SIDE_RIGHT);
+ declare("top", SIDE_TOP);
+ }
+}
+
+LLToolBar::Params::Params()
+: button_display_mode("button_display_mode"),
+ commands("command"),
+ side("side", SIDE_TOP),
+ button_icon("button_icon"),
+ button_icon_and_text("button_icon_and_text"),
+ read_only("read_only", false),
+ wrap("wrap", true),
+ pad_left("pad_left"),
+ pad_top("pad_top"),
+ pad_right("pad_right"),
+ pad_bottom("pad_bottom"),
+ pad_between("pad_between"),
+ min_girth("min_girth"),
+ button_panel("button_panel")
+{}
+
+LLToolBar::LLToolBar(const LLToolBar::Params& p)
+: LLUICtrl(p),
+ mReadOnly(p.read_only),
+ mButtonType(p.button_display_mode),
+ mSideType(p.side),
+ mWrap(p.wrap),
+ mNeedsLayout(false),
+ mModified(false),
+ mButtonPanel(NULL),
+ mCenteringStack(NULL),
+ mPadLeft(p.pad_left),
+ mPadRight(p.pad_right),
+ mPadTop(p.pad_top),
+ mPadBottom(p.pad_bottom),
+ mPadBetween(p.pad_between),
+ mMinGirth(p.min_girth),
+ mPopupMenuHandle(),
+ mRightMouseTargetButton(NULL),
+ mStartDragItemCallback(NULL),
+ mHandleDragItemCallback(NULL),
+ mHandleDropCallback(NULL),
+ mButtonAddSignal(NULL),
+ mButtonEnterSignal(NULL),
+ mButtonLeaveSignal(NULL),
+ mButtonRemoveSignal(NULL),
+ mDragAndDropTarget(false)
+{
+ mButtonParams[LLToolBarEnums::BTNTYPE_ICONS_WITH_TEXT] = p.button_icon_and_text;
+ mButtonParams[LLToolBarEnums::BTNTYPE_ICONS_ONLY] = p.button_icon;
+}
+
+LLToolBar::~LLToolBar()
+{
+ delete mPopupMenuHandle.get();
+ delete mButtonAddSignal;
+ delete mButtonEnterSignal;
+ delete mButtonLeaveSignal;
+ delete mButtonRemoveSignal;
+}
+
+void LLToolBar::createContextMenu()
+{
+ if (!mPopupMenuHandle.get())
+ {
+ // Setup bindings specific to this instance for the context menu options
+
+ LLUICtrl::CommitCallbackRegistry::ScopedRegistrar commit_reg;
+ commit_reg.add("Toolbars.EnableSetting", boost::bind(&LLToolBar::onSettingEnable, this, _2));
+ commit_reg.add("Toolbars.RemoveSelectedCommand", boost::bind(&LLToolBar::onRemoveSelectedCommand, this));
+
+ LLUICtrl::EnableCallbackRegistry::ScopedRegistrar enable_reg;
+ enable_reg.add("Toolbars.CheckSetting", boost::bind(&LLToolBar::isSettingChecked, this, _2));
+
+ // Create the context menu
+ LLContextMenu* menu = LLUICtrlFactory::instance().createFromFile<LLContextMenu>("menu_toolbars.xml", LLMenuGL::sMenuContainer, LLMenuHolderGL::child_registry_t::instance());
+
+ if (menu)
+ {
+ menu->setBackgroundColor(LLUIColorTable::instance().getColor("MenuPopupBgColor"));
+ mPopupMenuHandle = menu->getHandle();
+ mRemoveButtonHandle = menu->getChild<LLView>("Remove button")->getHandle();
+ }
+ else
+ {
+ llwarns << "Unable to load toolbars context menu." << llendl;
+ }
+ }
+
+ if (mRemoveButtonHandle.get())
+ {
+ // Disable/Enable the "Remove button" menu item depending on whether or not a button was clicked
+ mRemoveButtonHandle.get()->setEnabled(mRightMouseTargetButton != NULL);
+ }
+}
+
+void LLToolBar::initFromParams(const LLToolBar::Params& p)
+{
+ // Initialize the base object
+ LLUICtrl::initFromParams(p);
+
+ LLLayoutStack::ELayoutOrientation orientation = getOrientation(p.side);
+
+ LLLayoutStack::Params centering_stack_p;
+ centering_stack_p.name = "centering_stack";
+ centering_stack_p.rect = getLocalRect();
+ centering_stack_p.follows.flags = FOLLOWS_ALL;
+ centering_stack_p.orientation = orientation;
+ centering_stack_p.mouse_opaque = false;
+
+ mCenteringStack = LLUICtrlFactory::create<LLLayoutStack>(centering_stack_p);
+ addChild(mCenteringStack);
+
+ LLLayoutPanel::Params border_panel_p;
+ border_panel_p.name = "border_panel";
+ border_panel_p.rect = getLocalRect();
+ border_panel_p.auto_resize = true;
+ border_panel_p.user_resize = false;
+ border_panel_p.mouse_opaque = false;
+
+ mCenteringStack->addChild(LLUICtrlFactory::create<LLLayoutPanel>(border_panel_p));
+
+ LLLayoutPanel::Params center_panel_p;
+ center_panel_p.name = "center_panel";
+ center_panel_p.rect = getLocalRect();
+ center_panel_p.auto_resize = false;
+ center_panel_p.user_resize = false;
+ center_panel_p.mouse_opaque = false;
+ LLLayoutPanel* center_panel = LLUICtrlFactory::create<LLLayoutPanel>(center_panel_p);
+ mCenteringStack->addChild(center_panel);
+
+ LLPanel::Params button_panel_p(p.button_panel);
+ button_panel_p.rect = center_panel->getLocalRect();
+ button_panel_p.follows.flags = FOLLOWS_BOTTOM|FOLLOWS_LEFT;
+ mButtonPanel = LLUICtrlFactory::create<LLPanel>(button_panel_p);
+ center_panel->addChild(mButtonPanel);
+
+ mCenteringStack->addChild(LLUICtrlFactory::create<LLLayoutPanel>(border_panel_p));
+
+ BOOST_FOREACH(LLCommandId id, p.commands)
+ {
+ addCommand(id);
+ }
+
+ mNeedsLayout = true;
+}
+
+bool LLToolBar::addCommand(const LLCommandId& commandId, int rank)
+{
+ LLCommand * command = LLCommandManager::instance().getCommand(commandId);
+ if (!command) return false;
+
+ // Create the button and do the things that don't need ordering
+ LLToolBarButton* button = createButton(commandId);
+ mButtonPanel->addChild(button);
+ mButtonMap.insert(std::make_pair(commandId.uuid(), button));
+
+ // Insert the command and button in the right place in their respective lists
+ if ((rank >= mButtonCommands.size()) || (rank == RANK_NONE))
+ {
+ // In that case, back load
+ mButtonCommands.push_back(command->id());
+ mButtons.push_back(button);
+ }
+ else
+ {
+ // Insert in place: iterate to the right spot...
+ std::list<LLToolBarButton*>::iterator it_button = mButtons.begin();
+ command_id_list_t::iterator it_command = mButtonCommands.begin();
+ while (rank > 0)
+ {
+ ++it_button;
+ ++it_command;
+ rank--;
+ }
+ // ...then insert
+ mButtonCommands.insert(it_command, command->id());
+ mButtons.insert(it_button,button);
+ }
+
+ mNeedsLayout = true;
+
+ updateLayoutAsNeeded();
+
+
+ if (mButtonAddSignal)
+ {
+ (*mButtonAddSignal)(button);
+ }
+
+ return true;
+}
+
+// Remove a command from the list
+// Returns the rank of the command in the original list so that doing addCommand(id,rank) right after
+// a removeCommand(id) would leave the list unchanged.
+// Returns RANK_NONE if the command is not found in the list
+int LLToolBar::removeCommand(const LLCommandId& commandId)
+{
+ if (!hasCommand(commandId)) return RANK_NONE;
+
+ // First erase the map record
+ command_id_map::iterator it = mButtonMap.find(commandId.uuid());
+ mButtonMap.erase(it);
+
+ // Now iterate on the commands and buttons to identify the relevant records
+ int rank = 0;
+ std::list<LLToolBarButton*>::iterator it_button = mButtons.begin();
+ command_id_list_t::iterator it_command = mButtonCommands.begin();
+ while (*it_command != commandId)
+ {
+ ++it_button;
+ ++it_command;
+ ++rank;
+ }
+
+ if (mButtonRemoveSignal)
+ {
+ (*mButtonRemoveSignal)(*it_button);
+ }
+
+ // Delete the button and erase the command and button records
+ delete (*it_button);
+ mButtonCommands.erase(it_command);
+ mButtons.erase(it_button);
+
+ mNeedsLayout = true;
+
+ return rank;
+}
+
+void LLToolBar::clearCommandsList()
+{
+ // Clears the commands list
+ mButtonCommands.clear();
+ // This will clear the buttons
+ createButtons();
+}
+
+bool LLToolBar::hasCommand(const LLCommandId& commandId) const
+{
+ if (commandId != LLCommandId::null)
+ {
+ command_id_map::const_iterator it = mButtonMap.find(commandId.uuid());
+ return (it != mButtonMap.end());
+ }
+
+ return false;
+}
+
+bool LLToolBar::enableCommand(const LLCommandId& commandId, bool enabled)
+{
+ LLButton * command_button = NULL;
+
+ if (commandId != LLCommandId::null)
+ {
+ command_id_map::iterator it = mButtonMap.find(commandId.uuid());
+ if (it != mButtonMap.end())
+ {
+ command_button = it->second;
+ command_button->setEnabled(enabled);
+ }
+ }
+
+ return (command_button != NULL);
+}
+
+bool LLToolBar::stopCommandInProgress(const LLCommandId& commandId)
+{
+ //
+ // Note from Leslie:
+ //
+ // This implementation was largely put in place to handle EXP-1348 which is related to
+ // dragging and dropping the "speak" button. The "speak" button can be in one of two
+ // modes, i.e., either a toggle action or a push-to-talk action. Because of this it
+ // responds to mouse down and mouse up in different ways, based on which behavior the
+ // button is currently set to obey. This was the simplest way of getting the button
+ // to turn off the microphone for both behaviors without risking duplicate state.
+ //
+
+ LLToolBarButton * command_button = NULL;
+
+ if (commandId != LLCommandId::null)
+ {
+ LLCommand* command = LLCommandManager::instance().getCommand(commandId);
+ llassert(command);
+
+ // If this command has an explicit function for execution stop
+ if (command->executeStopFunctionName().length() > 0)
+ {
+ command_id_map::iterator it = mButtonMap.find(commandId.uuid());
+ if (it != mButtonMap.end())
+ {
+ command_button = it->second;
+ llassert(command_button->mIsRunningSignal);
+
+ // Check to see if it is running
+ if ((*command_button->mIsRunningSignal)(command_button, command->isRunningParameters()))
+ {
+ // Trigger an additional button commit, which calls mouse down, mouse up and commit
+ command_button->onCommit();
+ }
+ }
+ }
+ }
+
+ return (command_button != NULL);
+}
+
+bool LLToolBar::flashCommand(const LLCommandId& commandId, bool flash)
+{
+ LLButton * command_button = NULL;
+
+ if (commandId != LLCommandId::null)
+ {
+ command_id_map::iterator it = mButtonMap.find(commandId.uuid());
+ if (it != mButtonMap.end())
+ {
+ command_button = it->second;
+ command_button->setFlashing(flash ? TRUE : FALSE);
+ }
+ }
+
+ return (command_button != NULL);
+}
+
+BOOL LLToolBar::handleRightMouseDown(S32 x, S32 y, MASK mask)
+{
+ LLRect button_panel_rect;
+ mButtonPanel->localRectToOtherView(mButtonPanel->getLocalRect(), &button_panel_rect, this);
+ BOOL handle_it_here = !mReadOnly && button_panel_rect.pointInRect(x, y);
+
+ if (handle_it_here)
+ {
+ // Determine which button the mouse was over during the click in case the context menu action
+ // is intended to affect the button.
+ mRightMouseTargetButton = NULL;
+ BOOST_FOREACH(LLToolBarButton* button, mButtons)
+ {
+ LLRect button_rect;
+ button->localRectToOtherView(button->getLocalRect(), &button_rect, this);
+
+ if (button_rect.pointInRect(x, y))
+ {
+ mRightMouseTargetButton = button;
+ break;
+ }
+ }
+
+ createContextMenu();
+
+ LLContextMenu * menu = (LLContextMenu *) mPopupMenuHandle.get();
+
+ if (menu)
+ {
+ menu->show(x, y);
+
+ LLMenuGL::showPopup(this, menu, x, y);
+ }
+ }
+
+ return handle_it_here;
+}
+
+BOOL LLToolBar::isSettingChecked(const LLSD& userdata)
+{
+ BOOL retval = FALSE;
+
+ const std::string setting_name = userdata.asString();
+
+ if (setting_name == "icons_with_text")
+ {
+ retval = (mButtonType == BTNTYPE_ICONS_WITH_TEXT);
+ }
+ else if (setting_name == "icons_only")
+ {
+ retval = (mButtonType == BTNTYPE_ICONS_ONLY);
+ }
+
+ return retval;
+}
+
+void LLToolBar::onSettingEnable(const LLSD& userdata)
+{
+ llassert(!mReadOnly);
+
+ const std::string setting_name = userdata.asString();
+
+ if (setting_name == "icons_with_text")
+ {
+ setButtonType(BTNTYPE_ICONS_WITH_TEXT);
+ }
+ else if (setting_name == "icons_only")
+ {
+ setButtonType(BTNTYPE_ICONS_ONLY);
+ }
+}
+
+void LLToolBar::onRemoveSelectedCommand()
+{
+ llassert(!mReadOnly);
+
+ if (mRightMouseTargetButton)
+ {
+ removeCommand(mRightMouseTargetButton->getCommandId());
+
+ mRightMouseTargetButton = NULL;
+ }
+}
+
+void LLToolBar::setButtonType(LLToolBarEnums::ButtonType button_type)
+{
+ bool regenerate_buttons = (mButtonType != button_type);
+
+ mButtonType = button_type;
+
+ if (regenerate_buttons)
+ {
+ createButtons();
+ }
+}
+
+void LLToolBar::resizeButtonsInRow(std::vector<LLToolBarButton*>& buttons_in_row, S32 max_row_girth)
+{
+ // make buttons in current row all same girth
+ BOOST_FOREACH(LLToolBarButton* button, buttons_in_row)
+ {
+ if (getOrientation(mSideType) == LLLayoutStack::HORIZONTAL)
+ {
+ button->reshape(button->mWidthRange.clamp(button->getRect().getWidth()), max_row_girth);
+ }
+ else // VERTICAL
+ {
+ button->reshape(max_row_girth, button->getRect().getHeight());
+ }
+ }
+}
+
+// Returns the position of the coordinates as a rank in the button list.
+// The rank is the position a tool dropped in (x,y) would assume in the button list.
+// The returned value is between 0 and mButtons.size(), 0 being the first element to the left
+// (or top) and mButtons.size() the last one to the right (or bottom).
+// Various drag data are stored in the toolbar object though are not exposed outside (and shouldn't).
+int LLToolBar::getRankFromPosition(S32 x, S32 y)
+{
+ if (mButtons.empty())
+ {
+ return RANK_NONE;
+ }
+
+ int rank = 0;
+
+ // Convert the toolbar coord into button panel coords
+ LLLayoutStack::ELayoutOrientation orientation = getOrientation(mSideType);
+ S32 button_panel_x = 0;
+ S32 button_panel_y = 0;
+ localPointToOtherView(x, y, &button_panel_x, &button_panel_y, mButtonPanel);
+ S32 dx = x - button_panel_x;
+ S32 dy = y - button_panel_y;
+
+ // Simply compare the passed coord with the buttons outbound box + padding
+ std::list<LLToolBarButton*>::iterator it_button = mButtons.begin();
+ std::list<LLToolBarButton*>::iterator end_button = mButtons.end();
+ LLRect button_rect;
+ while (it_button != end_button)
+ {
+ button_rect = (*it_button)->getRect();
+ S32 point_x = button_rect.mRight + mPadRight;
+ S32 point_y = button_rect.mBottom - mPadBottom;
+
+ if ((button_panel_x < point_x) && (button_panel_y > point_y))
+ {
+ break;
+ }
+ rank++;
+ ++it_button;
+ }
+
+ // Update the passed coordinates to the hit button relevant corner
+ // (different depending on toolbar orientation)
+ if (rank < mButtons.size())
+ {
+ if (orientation == LLLayoutStack::HORIZONTAL)
+ {
+ // Horizontal
+ S32 mid_point = (button_rect.mRight + button_rect.mLeft) / 2;
+ if (button_panel_x < mid_point)
+ {
+ mDragx = button_rect.mLeft - mPadLeft;
+ mDragy = button_rect.mTop + mPadTop;
+ }
+ else
+ {
+ rank++;
+ mDragx = button_rect.mRight + mPadRight - 1;
+ mDragy = button_rect.mTop + mPadTop;
+ }
+ }
+ else
+ {
+ // Vertical
+ S32 mid_point = (button_rect.mTop + button_rect.mBottom) / 2;
+ if (button_panel_y > mid_point)
+ {
+ mDragx = button_rect.mLeft - mPadLeft;
+ mDragy = button_rect.mTop + mPadTop;
+ }
+ else
+ {
+ rank++;
+ mDragx = button_rect.mLeft - mPadLeft;
+ mDragy = button_rect.mBottom - mPadBottom + 1;
+ }
+ }
+ }
+ else
+ {
+ // We hit passed the end of the list so put the insertion point at the end
+ if (orientation == LLLayoutStack::HORIZONTAL)
+ {
+ mDragx = button_rect.mRight + mPadRight;
+ mDragy = button_rect.mTop + mPadTop;
+ }
+ else
+ {
+ mDragx = button_rect.mLeft - mPadLeft;
+ mDragy = button_rect.mBottom - mPadBottom;
+ }
+ }
+
+ // Update the "girth" of the caret, i.e. the width or height (depending of orientation)
+ if (orientation == LLLayoutStack::HORIZONTAL)
+ {
+ mDragGirth = button_rect.getHeight() + mPadBottom + mPadTop;
+ }
+ else
+ {
+ mDragGirth = button_rect.getWidth() + mPadLeft + mPadRight;
+ }
+
+ // The delta account for the coord model change (i.e. convert back to toolbar coord)
+ mDragx += dx;
+ mDragy += dy;
+
+ return rank;
+}
+
+int LLToolBar::getRankFromPosition(const LLCommandId& id)
+{
+ if (!hasCommand(id))
+ {
+ return RANK_NONE;
+ }
+ int rank = 0;
+ std::list<LLToolBarButton*>::iterator it_button = mButtons.begin();
+ std::list<LLToolBarButton*>::iterator end_button = mButtons.end();
+ while (it_button != end_button)
+ {
+ if ((*it_button)->mId == id)
+ {
+ break;
+ }
+ rank++;
+ ++it_button;
+ }
+ return rank;
+}
+
+void LLToolBar::updateLayoutAsNeeded()
+{
+ if (!mNeedsLayout) return;
+
+ LLLayoutStack::ELayoutOrientation orientation = getOrientation(mSideType);
+
+ // our terminology for orientation-agnostic layout is such that
+ // length refers to a distance in the direction we stack the buttons
+ // and girth refers to a distance in the direction buttons wrap
+ S32 max_row_girth = 0;
+ S32 max_row_length = 0;
+
+ S32 max_length;
+ S32 max_total_girth;
+ S32 cur_start;
+ S32 cur_row ;
+ S32 row_pad_start;
+ S32 row_pad_end;
+ S32 girth_pad_end;
+ S32 row_running_length;
+
+ if (orientation == LLLayoutStack::HORIZONTAL)
+ {
+ max_length = getRect().getWidth() - mPadLeft - mPadRight;
+ max_total_girth = getRect().getHeight() - mPadTop - mPadBottom;
+ row_pad_start = mPadLeft;
+ row_pad_end = mPadRight;
+ cur_row = mPadTop;
+ girth_pad_end = mPadBottom;
+ }
+ else // VERTICAL
+ {
+ max_length = getRect().getHeight() - mPadTop - mPadBottom;
+ max_total_girth = getRect().getWidth() - mPadLeft - mPadRight;
+ row_pad_start = mPadTop;
+ row_pad_end = mPadBottom;
+ cur_row = mPadLeft;
+ girth_pad_end = mPadRight;
+ }
+
+ row_running_length = row_pad_start;
+ cur_start = row_pad_start;
+
+
+ LLRect panel_rect = mButtonPanel->getLocalRect();
+
+ std::vector<LLToolBarButton*> buttons_in_row;
+
+ BOOST_FOREACH(LLToolBarButton* button, mButtons)
+ {
+ button->reshape(button->mWidthRange.getMin(), button->mDesiredHeight);
+ button->autoResize();
+
+ S32 button_clamped_width = button->mWidthRange.clamp(button->getRect().getWidth());
+ S32 button_length = (orientation == LLLayoutStack::HORIZONTAL)
+ ? button_clamped_width
+ : button->getRect().getHeight();
+ S32 button_girth = (orientation == LLLayoutStack::HORIZONTAL)
+ ? button->getRect().getHeight()
+ : button_clamped_width;
+
+ // wrap if needed
+ if (mWrap
+ && row_running_length + button_length > max_length // out of room...
+ && cur_start != row_pad_start) // ...and not first button in row
+ {
+ if (orientation == LLLayoutStack::VERTICAL)
+ { // row girth (width in this case) is clamped to allowable button widths
+ max_row_girth = button->mWidthRange.clamp(max_row_girth);
+ }
+
+ // make buttons in current row all same girth
+ resizeButtonsInRow(buttons_in_row, max_row_girth);
+ buttons_in_row.clear();
+
+ max_row_length = llmax(max_row_length, row_running_length);
+ row_running_length = row_pad_start;
+ cur_start = row_pad_start;
+ cur_row += max_row_girth + mPadBetween;
+ max_row_girth = 0;
+ }
+
+ LLRect button_rect;
+ if (orientation == LLLayoutStack::HORIZONTAL)
+ {
+ button_rect.setLeftTopAndSize(cur_start, panel_rect.mTop - cur_row, button_clamped_width, button->getRect().getHeight());
+ }
+ else // VERTICAL
+ {
+ button_rect.setLeftTopAndSize(cur_row, panel_rect.mTop - cur_start, button_clamped_width, button->getRect().getHeight());
+ }
+ button->setShape(button_rect);
+
+ buttons_in_row.push_back(button);
+
+ row_running_length += button_length + mPadBetween;
+ cur_start = row_running_length;
+ max_row_girth = llmax(button_girth, max_row_girth);
+ }
+
+ // final resizing in "girth" direction
+ S32 total_girth = cur_row // current row position...
+ + max_row_girth // ...incremented by size of final row...
+ + girth_pad_end; // ...plus padding reserved on end
+ total_girth = llmax(total_girth,mMinGirth);
+
+ max_row_length = llmax(max_row_length, row_running_length - mPadBetween + row_pad_end);
+
+ resizeButtonsInRow(buttons_in_row, max_row_girth);
+
+ // grow and optionally shift toolbar to accommodate buttons
+ if (orientation == LLLayoutStack::HORIZONTAL)
+ {
+ if (mSideType == SIDE_TOP)
+ { // shift down to maintain top edge
+ translate(0, getRect().getHeight() - total_girth);
+ }
+
+ reshape(getRect().getWidth(), total_girth);
+ mButtonPanel->reshape(max_row_length, total_girth);
+ }
+ else // VERTICAL
+ {
+ if (mSideType == SIDE_RIGHT)
+ { // shift left to maintain right edge
+ translate(getRect().getWidth() - total_girth, 0);
+ }
+
+ reshape(total_girth, getRect().getHeight());
+ mButtonPanel->reshape(total_girth, max_row_length);
+ }
+
+ // make parent fit button panel
+ mButtonPanel->getParent()->setShape(mButtonPanel->getLocalRect());
+
+ // re-center toolbar buttons
+ mCenteringStack->updateLayout();
+
+ if (!mButtons.empty())
+ {
+ mButtonPanel->setVisible(TRUE);
+ mButtonPanel->setMouseOpaque(TRUE);
+ }
+
+ // don't clear flag until after we've resized ourselves, to avoid laying out every frame
+ mNeedsLayout = false;
+}
+
+
+void LLToolBar::draw()
+{
+ if (mButtons.empty())
+ {
+ mButtonPanel->setVisible(FALSE);
+ mButtonPanel->setMouseOpaque(FALSE);
+ }
+ else
+ {
+ mButtonPanel->setVisible(TRUE);
+ mButtonPanel->setMouseOpaque(TRUE);
+ }
+
+ // Update enable/disable state and highlight state for editable toolbars
+ if (!mReadOnly)
+ {
+ for (toolbar_button_list::iterator btn_it = mButtons.begin(); btn_it != mButtons.end(); ++btn_it)
+ {
+ LLToolBarButton* btn = *btn_it;
+ LLCommand* command = LLCommandManager::instance().getCommand(btn->mId);
+
+ if (command && btn->mIsEnabledSignal)
+ {
+ const bool button_command_enabled = (*btn->mIsEnabledSignal)(btn, command->isEnabledParameters());
+ btn->setEnabled(button_command_enabled);
+ }
+
+ if (command && btn->mIsRunningSignal)
+ {
+ const bool button_command_running = (*btn->mIsRunningSignal)(btn, command->isRunningParameters());
+ btn->setToggleState(button_command_running);
+ }
+ }
+ }
+
+ updateLayoutAsNeeded();
+ // rect may have shifted during layout
+ LLUI::popMatrix();
+ LLUI::pushMatrix();
+ LLUI::translate((F32)getRect().mLeft, (F32)getRect().mBottom, 0.f);
+
+ // Position the caret
+ LLIconCtrl* caret = getChild<LLIconCtrl>("caret");
+ caret->setVisible(FALSE);
+ if (mDragAndDropTarget && !mButtonCommands.empty())
+ {
+ LLRect caret_rect = caret->getRect();
+ LLRect toolbar_rect = getRect();
+ if (getOrientation(mSideType) == LLLayoutStack::HORIZONTAL)
+ {
+ caret->setRect(LLRect(mDragx-caret_rect.getWidth()/2+1,
+ mDragy,
+ mDragx+caret_rect.getWidth()/2+1,
+ mDragy-mDragGirth));
+ }
+ else
+ {
+ caret->setRect(LLRect(mDragx,
+ mDragy+caret_rect.getHeight()/2,
+ mDragx+mDragGirth,
+ mDragy-caret_rect.getHeight()/2));
+ }
+ caret->setVisible(TRUE);
+ }
+
+ LLUICtrl::draw();
+ caret->setVisible(FALSE);
+ mDragAndDropTarget = false;
+}
+
+void LLToolBar::reshape(S32 width, S32 height, BOOL called_from_parent)
+{
+ LLUICtrl::reshape(width, height, called_from_parent);
+ mNeedsLayout = true;
+}
+
+void LLToolBar::createButtons()
+{
+ BOOST_FOREACH(LLToolBarButton* button, mButtons)
+ {
+ if (mButtonRemoveSignal)
+ {
+ (*mButtonRemoveSignal)(button);
+ }
+
+ delete button;
+ }
+ mButtons.clear();
+ mButtonMap.clear();
+ mRightMouseTargetButton = NULL;
+
+ BOOST_FOREACH(LLCommandId& command_id, mButtonCommands)
+ {
+ LLToolBarButton* button = createButton(command_id);
+ mButtons.push_back(button);
+ mButtonPanel->addChild(button);
+ mButtonMap.insert(std::make_pair(command_id.uuid(), button));
+
+ if (mButtonAddSignal)
+ {
+ (*mButtonAddSignal)(button);
+ }
+ }
+ mNeedsLayout = true;
+}
+
+void LLToolBarButton::callIfEnabled(LLUICtrl::commit_callback_t commit, LLUICtrl* ctrl, const LLSD& param )
+{
+ LLCommand* command = LLCommandManager::instance().getCommand(mId);
+
+ if (!mIsEnabledSignal || (*mIsEnabledSignal)(this, command->isEnabledParameters()))
+ {
+ commit(ctrl, param);
+ }
+}
+
+LLToolBarButton* LLToolBar::createButton(const LLCommandId& id)
+{
+ LLCommand* commandp = LLCommandManager::instance().getCommand(id);
+ if (!commandp) return NULL;
+
+ LLToolBarButton::Params button_p;
+ button_p.name = commandp->name();
+ button_p.label = LLTrans::getString(commandp->labelRef());
+ button_p.tool_tip = LLTrans::getString(commandp->tooltipRef());
+ button_p.image_overlay = LLUI::getUIImage(commandp->icon());
+ button_p.overwriteFrom(mButtonParams[mButtonType]);
+ LLToolBarButton* button = LLUICtrlFactory::create<LLToolBarButton>(button_p);
+
+ if (!mReadOnly)
+ {
+ enable_callback_t isEnabledCB;
+
+ const std::string& isEnabledFunction = commandp->isEnabledFunctionName();
+ if (isEnabledFunction.length() > 0)
+ {
+ LLUICtrl::EnableCallbackParam isEnabledParam;
+ isEnabledParam.function_name = isEnabledFunction;
+ isEnabledParam.parameter = commandp->isEnabledParameters();
+ isEnabledCB = initEnableCallback(isEnabledParam);
+
+ if (NULL == button->mIsEnabledSignal)
+ {
+ button->mIsEnabledSignal = new enable_signal_t();
+ }
+
+ button->mIsEnabledSignal->connect(isEnabledCB);
+ }
+
+ LLUICtrl::CommitCallbackParam executeParam;
+ executeParam.function_name = commandp->executeFunctionName();
+ executeParam.parameter = commandp->executeParameters();
+
+ // If we have a "stop" function then we map the command to mouse down / mouse up otherwise commit
+ const std::string& executeStopFunction = commandp->executeStopFunctionName();
+ if (executeStopFunction.length() > 0)
+ {
+ LLUICtrl::CommitCallbackParam executeStopParam;
+ executeStopParam.function_name = executeStopFunction;
+ executeStopParam.parameter = commandp->executeStopParameters();
+ LLUICtrl::commit_callback_t execute_func = initCommitCallback(executeParam);
+ LLUICtrl::commit_callback_t stop_func = initCommitCallback(executeStopParam);
+
+ button->setMouseDownCallback(boost::bind(&LLToolBarButton::callIfEnabled, button, execute_func, _1, _2));
+ button->setMouseUpCallback(boost::bind(&LLToolBarButton::callIfEnabled, button, stop_func, _1, _2));
+ }
+ else
+ {
+ button->setCommitCallback(executeParam);
+ }
+
+ // Set up "is running" query callback
+ const std::string& isRunningFunction = commandp->isRunningFunctionName();
+ if (isRunningFunction.length() > 0)
+ {
+ LLUICtrl::EnableCallbackParam isRunningParam;
+ isRunningParam.function_name = isRunningFunction;
+ isRunningParam.parameter = commandp->isRunningParameters();
+ enable_signal_t::slot_type isRunningCB = initEnableCallback(isRunningParam);
+
+ if (NULL == button->mIsRunningSignal)
+ {
+ button->mIsRunningSignal = new enable_signal_t();
+ }
+
+ button->mIsRunningSignal->connect(isRunningCB);
+ }
+ }
+
+ // Drag and drop behavior must work also if provided in the Toybox and, potentially, any read-only toolbar
+ button->setStartDragCallback(mStartDragItemCallback);
+ button->setHandleDragCallback(mHandleDragItemCallback);
+
+ button->setCommandId(id);
+
+ return button;
+}
+
+boost::signals2::connection connectSignal(LLToolBar::button_signal_t*& signal, const LLToolBar::button_signal_t::slot_type& cb)
+{
+ if (!signal)
+ {
+ signal = new LLToolBar::button_signal_t();
+ }
+
+ return signal->connect(cb);
+}
+
+boost::signals2::connection LLToolBar::setButtonAddCallback(const button_signal_t::slot_type& cb)
+{
+ return connectSignal(mButtonAddSignal, cb);
+}
+
+boost::signals2::connection LLToolBar::setButtonEnterCallback(const button_signal_t::slot_type& cb)
+{
+ return connectSignal(mButtonEnterSignal, cb);
+}
+
+boost::signals2::connection LLToolBar::setButtonLeaveCallback(const button_signal_t::slot_type& cb)
+{
+ return connectSignal(mButtonLeaveSignal, cb);
+}
+
+boost::signals2::connection LLToolBar::setButtonRemoveCallback(const button_signal_t::slot_type& cb)
+{
+ return connectSignal(mButtonRemoveSignal, cb);
+}
+
+BOOL LLToolBar::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
+ EDragAndDropType cargo_type,
+ void* cargo_data,
+ EAcceptance* accept,
+ std::string& tooltip_msg)
+{
+ // If we have a drop callback, that means that we can handle the drop
+ BOOL handled = (mHandleDropCallback ? TRUE : FALSE);
+
+ // if drop is set, it's time to call the callback to get the operation done
+ if (handled && drop)
+ {
+ handled = mHandleDropCallback(cargo_data, x, y ,this);
+ }
+
+ // We accept only single tool drop on toolbars
+ *accept = (handled ? ACCEPT_YES_SINGLE : ACCEPT_NO);
+
+ // We'll use that flag to change the visual aspect of the toolbar target on draw()
+ mDragAndDropTarget = false;
+
+ // Convert drag position into insert position and rank
+ if (!isReadOnly() && handled && !drop)
+ {
+ LLInventoryItem* inv_item = (LLInventoryItem*)cargo_data;
+ LLAssetType::EType type = inv_item->getType();
+ if (type == LLAssetType::AT_WIDGET)
+ {
+ LLCommandId dragged_command(inv_item->getUUID());
+ int orig_rank = getRankFromPosition(dragged_command);
+ mDragRank = getRankFromPosition(x, y);
+ // Don't DaD if we're dragging a command on itself
+ mDragAndDropTarget = ((orig_rank != RANK_NONE) && ((mDragRank == orig_rank) || ((mDragRank-1) == orig_rank)) ? false : true);
+ //llinfos << "Merov debug : DaD, rank = " << mDragRank << ", dragged uui = " << inv_item->getUUID() << llendl;
+ /* Do the following if you want to animate the button itself
+ LLCommandId dragged_command(inv_item->getUUID());
+ removeCommand(dragged_command);
+ addCommand(dragged_command,rank);
+ */
+ }
+ else
+ {
+ handled = FALSE;
+ }
+ }
+
+ return handled;
+}
+
+LLToolBarButton::LLToolBarButton(const Params& p)
+: LLButton(p),
+ mMouseDownX(0),
+ mMouseDownY(0),
+ mWidthRange(p.button_width),
+ mDesiredHeight(p.desired_height),
+ mId(""),
+ mIsEnabledSignal(NULL),
+ mIsRunningSignal(NULL),
+ mIsStartingSignal(NULL),
+ mIsDragged(false),
+ mStartDragItemCallback(NULL),
+ mHandleDragItemCallback(NULL),
+ mOriginalImageSelected(p.image_selected),
+ mOriginalImageUnselected(p.image_unselected),
+ mOriginalImagePressed(p.image_pressed),
+ mOriginalImagePressedSelected(p.image_pressed_selected),
+ mOriginalLabelColor(p.label_color),
+ mOriginalLabelColorSelected(p.label_color_selected),
+ mOriginalImageOverlayColor(p.image_overlay_color),
+ mOriginalImageOverlaySelectedColor(p.image_overlay_selected_color)
+{
+}
+
+LLToolBarButton::~LLToolBarButton()
+{
+ delete mIsEnabledSignal;
+ delete mIsRunningSignal;
+ delete mIsStartingSignal;
+}
+
+BOOL LLToolBarButton::handleMouseDown(S32 x, S32 y, MASK mask)
+{
+ mMouseDownX = x;
+ mMouseDownY = y;
+ return LLButton::handleMouseDown(x, y, mask);
+}
+
+BOOL LLToolBarButton::handleHover(S32 x, S32 y, MASK mask)
+{
+ BOOL handled = FALSE;
+
+ S32 mouse_distance_squared = (x - mMouseDownX) * (x - mMouseDownX) + (y - mMouseDownY) * (y - mMouseDownY);
+ S32 drag_threshold = LLUI::sSettingGroups["config"]->getS32("DragAndDropDistanceThreshold");
+ if (mouse_distance_squared > drag_threshold * drag_threshold
+ && hasMouseCapture() &&
+ mStartDragItemCallback && mHandleDragItemCallback)
+ {
+ if (!mIsDragged)
+ {
+ mStartDragItemCallback(x, y, this);
+ mIsDragged = true;
+ handled = TRUE;
+ }
+ else
+ {
+ handled = mHandleDragItemCallback(x, y, mId.uuid(), LLAssetType::AT_WIDGET);
+ }
+ }
+ else
+ {
+ handled = LLButton::handleHover(x, y, mask);
+ }
+
+ return handled;
+}
+
+void LLToolBarButton::onMouseEnter(S32 x, S32 y, MASK mask)
+{
+ LLUICtrl::onMouseEnter(x, y, mask);
+
+ // Always highlight toolbar buttons, even if they are disabled
+ if (!gFocusMgr.getMouseCapture() || gFocusMgr.getMouseCapture() == this)
+ {
+ mNeedsHighlight = TRUE;
+ }
+
+ LLToolBar* parent_toolbar = getParentByType<LLToolBar>();
+ if (parent_toolbar && parent_toolbar->mButtonEnterSignal)
+ {
+ (*(parent_toolbar->mButtonEnterSignal))(this);
+ }
+}
+
+void LLToolBarButton::onMouseLeave(S32 x, S32 y, MASK mask)
+{
+ LLButton::onMouseLeave(x, y, mask);
+
+ LLToolBar* parent_toolbar = getParentByType<LLToolBar>();
+ if (parent_toolbar && parent_toolbar->mButtonLeaveSignal)
+ {
+ (*(parent_toolbar->mButtonLeaveSignal))(this);
+ }
+}
+
+void LLToolBarButton::onMouseCaptureLost()
+{
+ mIsDragged = false;
+}
+
+void LLToolBarButton::onCommit()
+{
+ LLCommand* command = LLCommandManager::instance().getCommand(mId);
+
+ if (!mIsEnabledSignal || (*mIsEnabledSignal)(this, command->isEnabledParameters()))
+ {
+ LLButton::onCommit();
+ }
+}
+
+void LLToolBarButton::reshape(S32 width, S32 height, BOOL called_from_parent)
+{
+ LLButton::reshape(mWidthRange.clamp(width), height, called_from_parent);
+}
+
+void LLToolBarButton::setEnabled(BOOL enabled)
+{
+ if (enabled)
+ {
+ mImageSelected = mOriginalImageSelected;
+ mImageUnselected = mOriginalImageUnselected;
+ mImagePressed = mOriginalImagePressed;
+ mImagePressedSelected = mOriginalImagePressedSelected;
+ mUnselectedLabelColor = mOriginalLabelColor;
+ mSelectedLabelColor = mOriginalLabelColorSelected;
+ mImageOverlayColor = mOriginalImageOverlayColor;
+ mImageOverlaySelectedColor = mOriginalImageOverlaySelectedColor;
+ }
+ else
+ {
+ mImageSelected = mImageDisabledSelected;
+ mImageUnselected = mImageDisabled;
+ mImagePressed = mImageDisabled;
+ mImagePressedSelected = mImageDisabledSelected;
+ mUnselectedLabelColor = mDisabledLabelColor;
+ mSelectedLabelColor = mDisabledSelectedLabelColor;
+ mImageOverlayColor = mImageOverlayDisabledColor;
+ mImageOverlaySelectedColor = mImageOverlayDisabledColor;
+ }
+}
+
+const std::string LLToolBarButton::getToolTip() const
+{
+ std::string tooltip;
+
+ if (labelIsTruncated() || getCurrentLabel().empty())
+ {
+ tooltip = LLTrans::getString(LLCommandManager::instance().getCommand(mId)->labelRef()) + " -- " + LLView::getToolTip();
+ }
+ else
+ {
+ tooltip = LLView::getToolTip();
+ }
+
+ LLToolBar* parent_toolbar = getParentByType<LLToolBar>();
+ if (parent_toolbar && parent_toolbar->mButtonTooltipSuffix.length() > 0)
+ {
+ tooltip = tooltip + "\n(" + parent_toolbar->mButtonTooltipSuffix + ")";
+ }
+
+ return tooltip;
+}
+
diff --git a/indra/llui/lltoolbar.h b/indra/llui/lltoolbar.h
new file mode 100644
index 0000000000..a50c60282c
--- /dev/null
+++ b/indra/llui/lltoolbar.h
@@ -0,0 +1,290 @@
+/**
+ * @file lltoolbar.h
+ * @author Richard Nelson
+ * @brief User customizable toolbar class
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLTOOLBAR_H
+#define LL_LLTOOLBAR_H
+
+#include "llbutton.h"
+#include "llcommandmanager.h"
+#include "lllayoutstack.h"
+#include "lluictrl.h"
+#include "llcommandmanager.h"
+#include "llassettype.h"
+
+class LLToolBar;
+class LLToolBarButton;
+
+typedef boost::function<void (S32 x, S32 y, LLToolBarButton* button)> tool_startdrag_callback_t;
+typedef boost::function<BOOL (S32 x, S32 y, const LLUUID& uuid, LLAssetType::EType type)> tool_handledrag_callback_t;
+typedef boost::function<BOOL (void* data, S32 x, S32 y, LLToolBar* toolbar)> tool_handledrop_callback_t;
+
+class LLToolBarButton : public LLButton
+{
+ friend class LLToolBar;
+public:
+ struct Params : public LLInitParam::Block<Params, LLButton::Params>
+ {
+ Optional<LLUI::RangeS32::Params> button_width;
+ Optional<S32> desired_height;
+
+ Params()
+ : button_width("button_width"),
+ desired_height("desired_height", 20)
+ {}
+
+ };
+
+ LLToolBarButton(const Params& p);
+ ~LLToolBarButton();
+
+ BOOL handleMouseDown(S32 x, S32 y, MASK mask);
+ BOOL handleHover(S32 x, S32 y, MASK mask);
+
+ void reshape(S32 width, S32 height, BOOL called_from_parent = true);
+ void setEnabled(BOOL enabled);
+ void setCommandId(const LLCommandId& id) { mId = id; }
+ LLCommandId getCommandId() { return mId; }
+
+ void setStartDragCallback(tool_startdrag_callback_t cb) { mStartDragItemCallback = cb; }
+ void setHandleDragCallback(tool_handledrag_callback_t cb) { mHandleDragItemCallback = cb; }
+
+ void onMouseEnter(S32 x, S32 y, MASK mask);
+ void onMouseLeave(S32 x, S32 y, MASK mask);
+ void onMouseCaptureLost();
+
+ void onCommit();
+
+ virtual const std::string getToolTip() const;
+
+private:
+ void callIfEnabled(LLUICtrl::commit_callback_t commit, LLUICtrl* ctrl, const LLSD& param );
+
+ LLCommandId mId;
+ S32 mMouseDownX;
+ S32 mMouseDownY;
+ LLUI::RangeS32 mWidthRange;
+ S32 mDesiredHeight;
+ bool mIsDragged;
+ tool_startdrag_callback_t mStartDragItemCallback;
+ tool_handledrag_callback_t mHandleDragItemCallback;
+
+ enable_signal_t* mIsEnabledSignal;
+ enable_signal_t* mIsRunningSignal;
+ enable_signal_t* mIsStartingSignal;
+ LLPointer<LLUIImage> mOriginalImageSelected,
+ mOriginalImageUnselected,
+ mOriginalImagePressed,
+ mOriginalImagePressedSelected;
+ LLUIColor mOriginalLabelColor,
+ mOriginalLabelColorSelected,
+ mOriginalImageOverlayColor,
+ mOriginalImageOverlaySelectedColor;
+};
+
+
+namespace LLToolBarEnums
+{
+ enum ButtonType
+ {
+ BTNTYPE_ICONS_WITH_TEXT = 0,
+ BTNTYPE_ICONS_ONLY,
+
+ BTNTYPE_COUNT
+ };
+
+ enum SideType
+ {
+ SIDE_BOTTOM,
+ SIDE_LEFT,
+ SIDE_RIGHT,
+ SIDE_TOP,
+ };
+
+ LLLayoutStack::ELayoutOrientation getOrientation(SideType sideType);
+}
+
+// NOTE: This needs to occur before Param block declaration for proper compilation.
+namespace LLInitParam
+{
+ template<>
+ struct TypeValues<LLToolBarEnums::ButtonType> : public TypeValuesHelper<LLToolBarEnums::ButtonType>
+ {
+ static void declareValues();
+ };
+
+ template<>
+ struct TypeValues<LLToolBarEnums::SideType> : public TypeValuesHelper<LLToolBarEnums::SideType>
+ {
+ static void declareValues();
+ };
+}
+
+
+class LLToolBar
+: public LLUICtrl
+{
+ friend class LLToolBarButton;
+public:
+ struct Params : public LLInitParam::Block<Params, LLUICtrl::Params>
+ {
+ Mandatory<LLToolBarEnums::ButtonType> button_display_mode;
+ Mandatory<LLToolBarEnums::SideType> side;
+
+ Optional<LLToolBarButton::Params> button_icon,
+ button_icon_and_text;
+
+ Optional<bool> read_only,
+ wrap;
+
+ Optional<S32> pad_left,
+ pad_top,
+ pad_right,
+ pad_bottom,
+ pad_between,
+ min_girth;
+
+ // default command set
+ Multiple<LLCommandId::Params> commands;
+
+ Optional<LLPanel::Params> button_panel;
+
+ Params();
+ };
+
+ // virtuals
+ void draw();
+ void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE);
+ BOOL handleRightMouseDown(S32 x, S32 y, MASK mask);
+ virtual BOOL handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
+ EDragAndDropType cargo_type,
+ void* cargo_data,
+ EAcceptance* accept,
+ std::string& tooltip_msg);
+
+ static const int RANK_NONE = -1;
+ bool addCommand(const LLCommandId& commandId, int rank = RANK_NONE);
+ int removeCommand(const LLCommandId& commandId); // Returns the rank the removed command was at, RANK_NONE if not found
+ bool hasCommand(const LLCommandId& commandId) const; // is this command bound to a button in this toolbar
+ bool enableCommand(const LLCommandId& commandId, bool enabled); // enable/disable button bound to the specified command, if it exists in this toolbar
+ bool stopCommandInProgress(const LLCommandId& commandId); // stop command if it is currently active
+ bool flashCommand(const LLCommandId& commandId, bool flash); // flash button associated with given command, if in this toolbar
+
+ void setStartDragCallback(tool_startdrag_callback_t cb) { mStartDragItemCallback = cb; } // connects drag and drop behavior to external logic
+ void setHandleDragCallback(tool_handledrag_callback_t cb) { mHandleDragItemCallback = cb; }
+ void setHandleDropCallback(tool_handledrop_callback_t cb) { mHandleDropCallback = cb; }
+ bool isReadOnly() const { return mReadOnly; }
+
+ LLToolBarButton* createButton(const LLCommandId& id);
+
+ typedef boost::signals2::signal<void (LLView* button)> button_signal_t;
+ boost::signals2::connection setButtonAddCallback(const button_signal_t::slot_type& cb);
+ boost::signals2::connection setButtonEnterCallback(const button_signal_t::slot_type& cb);
+ boost::signals2::connection setButtonLeaveCallback(const button_signal_t::slot_type& cb);
+ boost::signals2::connection setButtonRemoveCallback(const button_signal_t::slot_type& cb);
+
+ // append the specified string to end of tooltip
+ void setTooltipButtonSuffix(const std::string& suffix) { mButtonTooltipSuffix = suffix; }
+
+ LLToolBarEnums::SideType getSideType() const { return mSideType; }
+ bool hasButtons() const { return !mButtons.empty(); }
+ bool isModified() const { return mModified; }
+
+ int getRankFromPosition(S32 x, S32 y);
+ int getRankFromPosition(const LLCommandId& id);
+
+ // Methods used in loading and saving toolbar settings
+ void setButtonType(LLToolBarEnums::ButtonType button_type);
+ LLToolBarEnums::ButtonType getButtonType() { return mButtonType; }
+ command_id_list_t& getCommandsList() { return mButtonCommands; }
+ void clearCommandsList();
+
+private:
+ friend class LLUICtrlFactory;
+ LLToolBar(const Params&);
+ ~LLToolBar();
+
+ void initFromParams(const Params&);
+ void createContextMenu();
+ void updateLayoutAsNeeded();
+ void createButtons();
+ void resizeButtonsInRow(std::vector<LLToolBarButton*>& buttons_in_row, S32 max_row_girth);
+ BOOL isSettingChecked(const LLSD& userdata);
+ void onSettingEnable(const LLSD& userdata);
+ void onRemoveSelectedCommand();
+
+private:
+ // static layout state
+ const bool mReadOnly;
+ const LLToolBarEnums::SideType mSideType;
+ const bool mWrap;
+ const S32 mPadLeft,
+ mPadRight,
+ mPadTop,
+ mPadBottom,
+ mPadBetween,
+ mMinGirth;
+
+ // drag and drop state
+ tool_startdrag_callback_t mStartDragItemCallback;
+ tool_handledrag_callback_t mHandleDragItemCallback;
+ tool_handledrop_callback_t mHandleDropCallback;
+ bool mDragAndDropTarget;
+ int mDragRank;
+ S32 mDragx,
+ mDragy,
+ mDragGirth;
+
+ typedef std::list<LLToolBarButton*> toolbar_button_list;
+ typedef std::map<LLUUID, LLToolBarButton*> command_id_map;
+ toolbar_button_list mButtons;
+ command_id_list_t mButtonCommands;
+ command_id_map mButtonMap;
+
+ LLToolBarEnums::ButtonType mButtonType;
+ LLToolBarButton::Params mButtonParams[LLToolBarEnums::BTNTYPE_COUNT];
+
+ // related widgets
+ LLLayoutStack* mCenteringStack;
+ LLPanel* mButtonPanel;
+ LLHandle<class LLContextMenu> mPopupMenuHandle;
+ LLHandle<class LLView> mRemoveButtonHandle;
+
+ LLToolBarButton* mRightMouseTargetButton;
+
+ bool mNeedsLayout;
+ bool mModified;
+
+ button_signal_t* mButtonAddSignal;
+ button_signal_t* mButtonEnterSignal;
+ button_signal_t* mButtonLeaveSignal;
+ button_signal_t* mButtonRemoveSignal;
+
+ std::string mButtonTooltipSuffix;
+};
+
+
+#endif // LL_LLTOOLBAR_H
diff --git a/indra/llui/lltooltip.cpp b/indra/llui/lltooltip.cpp
index bc6461a0c2..23cdd9ad9a 100644
--- a/indra/llui/lltooltip.cpp
+++ b/indra/llui/lltooltip.cpp
@@ -200,7 +200,7 @@ LLToolTip::LLToolTip(const LLToolTip::Params& p)
icon_params.image_selected(imagep);
icon_params.scale_image(true);
- icon_params.flash_color(icon_params.highlight_color());
+ icon_params.flash_color.control = "ButtonUnselectedFgColor";
mInfoButton = LLUICtrlFactory::create<LLButton>(icon_params);
if (p.click_callback.isProvided())
{
diff --git a/indra/llxuixml/lltrans.cpp b/indra/llui/lltrans.cpp
index 5388069c24..5388069c24 100644
--- a/indra/llxuixml/lltrans.cpp
+++ b/indra/llui/lltrans.cpp
diff --git a/indra/llxuixml/lltrans.h b/indra/llui/lltrans.h
index 128b51d383..128b51d383 100644
--- a/indra/llxuixml/lltrans.h
+++ b/indra/llui/lltrans.h
diff --git a/indra/llui/llui.cpp b/indra/llui/llui.cpp
index 58ba9e05f5..6b74c5a6be 100644
--- a/indra/llui/llui.cpp
+++ b/indra/llui/llui.cpp
@@ -41,6 +41,7 @@
#include "llgl.h"
// Project includes
+#include "llcommandmanager.h"
#include "llcontrol.h"
#include "llui.h"
#include "lluicolortable.h"
@@ -57,6 +58,7 @@
#include "llfiltereditor.h"
#include "llflyoutbutton.h"
#include "llsearcheditor.h"
+#include "lltoolbar.h"
// for XUIParse
#include "llquaternion.h"
@@ -87,13 +89,14 @@ std::list<std::string> gUntranslated;
/*static*/ LLUI::remove_popup_t LLUI::sRemovePopupFunc;
/*static*/ LLUI::clear_popups_t LLUI::sClearPopupsFunc;
-// register filtereditor here
+// register filter editor here
static LLDefaultChildRegistry::Register<LLFilterEditor> register_filter_editor("filter_editor");
static LLDefaultChildRegistry::Register<LLFlyoutButton> register_flyout_button("flyout_button");
static LLDefaultChildRegistry::Register<LLSearchEditor> register_search_editor("search_editor");
// register other widgets which otherwise may not be linked in
static LLDefaultChildRegistry::Register<LLLoadingIndicator> register_loading_indicator("loading_indicator");
+static LLDefaultChildRegistry::Register<LLToolBar> register_toolbar("toolbar");
//
// Functions
@@ -103,7 +106,7 @@ void make_ui_sound(const char* namep)
std::string name = ll_safe_string(namep);
if (!LLUI::sSettingGroups["config"]->controlExists(name))
{
- llwarns << "tried to make ui sound for unknown sound name: " << name << llendl;
+ llwarns << "tried to make UI sound for unknown sound name: " << name << llendl;
}
else
{
@@ -114,12 +117,12 @@ void make_ui_sound(const char* namep)
{
if (LLUI::sSettingGroups["config"]->getBOOL("UISndDebugSpamToggle"))
{
- llinfos << "ui sound name: " << name << " triggered but silent (null uuid)" << llendl;
+ llinfos << "UI sound name: " << name << " triggered but silent (null uuid)" << llendl;
}
}
else
{
- llwarns << "ui sound named: " << name << " does not translate to a valid uuid" << llendl;
+ llwarns << "UI sound named: " << name << " does not translate to a valid uuid" << llendl;
}
}
@@ -127,7 +130,7 @@ void make_ui_sound(const char* namep)
{
if (LLUI::sSettingGroups["config"]->getBOOL("UISndDebugSpamToggle"))
{
- llinfos << "ui sound name: " << name << llendl;
+ llinfos << "UI sound name: " << name << llendl;
}
LLUI::sAudioCallback(uuid);
}
@@ -150,11 +153,11 @@ void gl_state_for_2d(S32 width, S32 height)
F32 window_width = (F32) width;//gViewerWindow->getWindowWidth();
F32 window_height = (F32) height;//gViewerWindow->getWindowHeight();
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- glOrtho(0.0f, llmax(window_width, 1.f), 0.0f, llmax(window_height,1.f), -1.0f, 1.0f);
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
+ gGL.matrixMode(LLRender::MM_PROJECTION);
+ gGL.loadIdentity();
+ gGL.ortho(0.0f, llmax(window_width, 1.f), 0.0f, llmax(window_height,1.f), -1.0f, 1.0f);
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
+ gGL.loadIdentity();
stop_glerror();
}
@@ -471,7 +474,7 @@ void gl_draw_scaled_image_with_border(S32 x, S32 y, S32 width, S32 height, LLTex
return;
}
- // add in offset of current image to current ui translation
+ // add in offset of current image to current UI translation
const LLVector3 ui_scale = gGL.getUIScale();
const LLVector3 ui_translation = (gGL.getUITranslation() + LLVector3(x, y, 0.f)).scaledVec(ui_scale);
@@ -534,7 +537,7 @@ void gl_draw_scaled_image_with_border(S32 x, S32 y, S32 width, S32 height, LLTex
}
}
- gGL.getTexUnit(0)->bind(image);
+ gGL.getTexUnit(0)->bind(image, true);
gGL.color4fv(color.mV);
@@ -732,7 +735,7 @@ void gl_draw_scaled_rotated_image(S32 x, S32 y, S32 width, S32 height, F32 degre
LLGLSUIDefault gls_ui;
- gGL.getTexUnit(0)->bind(image);
+ gGL.getTexUnit(0)->bind(image, true);
gGL.color4fv(color.mV);
@@ -785,7 +788,7 @@ void gl_draw_scaled_rotated_image(S32 x, S32 y, S32 width, S32 height, F32 degre
LLMatrix3 quat(0.f, 0.f, degrees*DEG_TO_RAD);
- gGL.getTexUnit(0)->bind(image);
+ gGL.getTexUnit(0)->bind(image, true);
gGL.color4fv(color.mV);
@@ -952,10 +955,12 @@ void gl_ring( F32 radius, F32 width, const LLColor4& center_color, const LLColor
if( render_center )
{
gGL.color4fv(center_color.mV);
+ gGL.diffuseColor4fv(center_color.mV);
gl_deep_circle( radius, width, steps );
}
else
{
+ gGL.diffuseColor4fv(side_color.mV);
gl_washer_2d(radius, radius - width, steps, side_color, side_color);
gGL.translateUI(0.f, 0.f, width);
gl_washer_2d(radius - width, radius, steps, side_color, side_color);
@@ -992,10 +997,18 @@ void gl_rect_2d_checkerboard(const LLRect& rect, GLfloat alpha)
// ...gray squares
gGL.color4f( .7f, .7f, .7f, alpha );
gGL.flush();
- glPolygonStipple( checkerboard );
- LLGLEnable polygon_stipple(GL_POLYGON_STIPPLE);
- gl_rect_2d(rect);
+ if (!LLGLSLShader::sNoFixedFunction)
+ { //polygon stipple is deprecated
+ glPolygonStipple( checkerboard );
+
+ LLGLEnable polygon_stipple(GL_POLYGON_STIPPLE);
+ gl_rect_2d(rect);
+ }
+ else
+ {
+ gl_rect_2d(rect);
+ }
gGL.flush();
}
@@ -1613,16 +1626,16 @@ void LLUI::initClass(const settings_map_t& settings,
LLUICtrl::CommitCallbackRegistry::Registrar& reg = LLUICtrl::CommitCallbackRegistry::defaultRegistrar();
- // Callbacks for associating controls with floater visibilty:
- reg.add("Floater.Toggle", boost::bind(&LLFloaterReg::toggleFloaterInstance, _2));
- reg.add("Floater.Show", boost::bind(&LLFloaterReg::showFloaterInstance, _2));
- reg.add("Floater.Hide", boost::bind(&LLFloaterReg::hideFloaterInstance, _2));
- reg.add("Floater.InitToVisibilityControl", boost::bind(&LLFloaterReg::initUICtrlToFloaterVisibilityControl, _1, _2));
+ // Callbacks for associating controls with floater visibility:
+ reg.add("Floater.Toggle", boost::bind(&LLFloaterReg::toggleInstance, _2, LLSD()));
+ reg.add("Floater.ToggleOrBringToFront", boost::bind(&LLFloaterReg::toggleInstanceOrBringToFront, _2, LLSD()));
+ reg.add("Floater.Show", boost::bind(&LLFloaterReg::showInstance, _2, LLSD(), FALSE));
+ reg.add("Floater.Hide", boost::bind(&LLFloaterReg::hideInstance, _2, LLSD()));
// Button initialization callback for toggle buttons
reg.add("Button.SetFloaterToggle", boost::bind(&LLButton::setFloaterToggle, _1, _2));
- // Button initialization callback for toggle buttons on dockale floaters
+ // Button initialization callback for toggle buttons on dockable floaters
reg.add("Button.SetDockableFloaterToggle", boost::bind(&LLButton::setDockableFloaterToggle, _1, _2));
// Display the help topic for the current context
@@ -1631,8 +1644,12 @@ void LLUI::initClass(const settings_map_t& settings,
// Currently unused, but kept for reference:
reg.add("Button.ToggleFloater", boost::bind(&LLButton::toggleFloaterAndSetToggleState, _1, _2));
- // Used by menus along with Floater.Toggle to display visibility as a checkmark
- LLUICtrl::EnableCallbackRegistry::defaultRegistrar().add("Floater.Visible", boost::bind(&LLFloaterReg::floaterInstanceVisible, _2));
+ // Used by menus along with Floater.Toggle to display visibility as a check-mark
+ LLUICtrl::EnableCallbackRegistry::defaultRegistrar().add("Floater.Visible", boost::bind(&LLFloaterReg::instanceVisible, _2, LLSD()));
+ LLUICtrl::EnableCallbackRegistry::defaultRegistrar().add("Floater.IsOpen", boost::bind(&LLFloaterReg::instanceVisible, _2, LLSD()));
+
+ // Parse the master list of commands
+ LLCommandManager::load();
}
void LLUI::cleanupClass()
@@ -1816,9 +1833,12 @@ void LLUI::setupPaths()
LLXMLNodePtr root;
BOOL success = LLXMLNode::parseFile(filename, root, NULL);
Paths paths;
- LLXUIParser parser;
- parser.readXUI(root, paths, filename);
+ if(success)
+ {
+ LLXUIParser parser;
+ parser.readXUI(root, paths, filename);
+ }
sXUIPaths.clear();
if (success && paths.validateBlock())
@@ -2026,12 +2046,12 @@ void LLUI::positionViewNearMouse(LLView* view, S32 spawn_x, S32 spawn_y)
CURSOR_HEIGHT + MOUSE_CURSOR_PADDING * 2);
S32 local_x, local_y;
- // convert screen coordinates to tooltipview-local coordinates
+ // convert screen coordinates to tooltip view-local coordinates
parent->screenPointToLocal(spawn_x, spawn_y, &local_x, &local_y);
// Start at spawn position (using left/top)
view->setOrigin( local_x, local_y - view->getRect().getHeight());
- // Make sure we're onscreen and not overlapping the mouse
+ // Make sure we're on-screen and not overlapping the mouse
view->translateIntoRectWithExclusion( virtual_window_rect, mouse_rect, FALSE );
}
@@ -2100,7 +2120,7 @@ namespace LLInitParam
void ParamValue<LLUIColor, TypeValues<LLUIColor> >::updateValueFromBlock()
{
- if (control.isProvided())
+ if (control.isProvided() && !control().empty())
{
updateValue(LLUIColorTable::instance().getColor(control));
}
@@ -2257,9 +2277,11 @@ namespace LLInitParam
// in this case, that is left+width and bottom+height
LLRect& value = getValue();
+ right.set(value.mRight, false);
left.set(value.mLeft, make_block_authoritative);
width.set(value.getWidth(), make_block_authoritative);
+ top.set(value.mTop, false);
bottom.set(value.mBottom, make_block_authoritative);
height.set(value.getHeight(), make_block_authoritative);
}
diff --git a/indra/llui/llui.h b/indra/llui/llui.h
index 7801a01ace..28e84fa444 100644
--- a/indra/llui/llui.h
+++ b/indra/llui/llui.h
@@ -41,6 +41,7 @@
#include <boost/signals2.hpp>
#include "lllazyvalue.h"
#include "llframetimer.h"
+#include <limits>
// LLUIFactory
#include "llsd.h"
@@ -148,6 +149,122 @@ class LLUI
LOG_CLASS(LLUI);
public:
//
+ // Classes
+ //
+
+ struct RangeS32
+ {
+ struct Params : public LLInitParam::Block<Params>
+ {
+ Optional<S32> minimum,
+ maximum;
+
+ Params()
+ : minimum("min", 0),
+ maximum("max", S32_MAX)
+ {}
+ };
+
+ // correct for inverted params
+ RangeS32(const Params& p = Params())
+ : mMin(p.minimum),
+ mMax(p.maximum)
+ {
+ sanitizeRange();
+ }
+
+ RangeS32(S32 minimum, S32 maximum)
+ : mMin(minimum),
+ mMax(maximum)
+ {
+ sanitizeRange();
+ }
+
+ S32 clamp(S32 input)
+ {
+ if (input < mMin) return mMin;
+ if (input > mMax) return mMax;
+ return input;
+ }
+
+ void setRange(S32 minimum, S32 maximum)
+ {
+ mMin = minimum;
+ mMax = maximum;
+ sanitizeRange();
+ }
+
+ S32 getMin() { return mMin; }
+ S32 getMax() { return mMax; }
+
+ bool operator==(const RangeS32& other) const
+ {
+ return mMin == other.mMin
+ && mMax == other.mMax;
+ }
+ private:
+ void sanitizeRange()
+ {
+ if (mMin > mMax)
+ {
+ llwarns << "Bad interval range (" << mMin << ", " << mMax << ")" << llendl;
+ // since max is usually the most dangerous one to ignore (buffer overflow, etc), prefer it
+ // in the case of a malformed range
+ mMin = mMax;
+ }
+ }
+
+
+ S32 mMin,
+ mMax;
+ };
+
+ struct ClampedS32 : public RangeS32
+ {
+ struct Params : public LLInitParam::Block<Params, RangeS32::Params>
+ {
+ Mandatory<S32> value;
+
+ Params()
+ : value("", 0)
+ {
+ addSynonym(value, "value");
+ }
+ };
+
+ ClampedS32(const Params& p)
+ : RangeS32(p)
+ {}
+
+ ClampedS32(const RangeS32& range)
+ : RangeS32(range)
+ {
+ // set value here, after range has been sanitized
+ mValue = clamp(0);
+ }
+
+ ClampedS32(S32 value, const RangeS32& range = RangeS32())
+ : RangeS32(range)
+ {
+ mValue = clamp(value);
+ }
+
+ S32 get()
+ {
+ return mValue;
+ }
+
+ void set(S32 value)
+ {
+ mValue = clamp(value);
+ }
+
+
+ private:
+ S32 mValue;
+ };
+
+ //
// Methods
//
typedef std::map<std::string, LLControlGroup*> settings_map_t;
@@ -365,7 +482,7 @@ template <typename T> LLRegisterWith<LLInitClassList> LLInitClass<T>::sRegister(
template <typename T> LLRegisterWith<LLDestroyClassList> LLDestroyClass<T>::sRegister(&T::destroyClass);
// useful parameter blocks
-struct TimeIntervalParam : public LLInitParam::Choice<TimeIntervalParam>
+struct TimeIntervalParam : public LLInitParam::ChoiceBlock<TimeIntervalParam>
{
Alternative<F32> seconds;
Alternative<S32> frames;
diff --git a/indra/llxuixml/lluicolor.cpp b/indra/llui/lluicolor.cpp
index f9bb80f8c5..f9bb80f8c5 100644
--- a/indra/llxuixml/lluicolor.cpp
+++ b/indra/llui/lluicolor.cpp
diff --git a/indra/llxuixml/lluicolor.h b/indra/llui/lluicolor.h
index 97ebea854a..97ebea854a 100644
--- a/indra/llxuixml/lluicolor.h
+++ b/indra/llui/lluicolor.h
diff --git a/indra/llui/lluicolortable.h b/indra/llui/lluicolortable.h
index 76518789ec..6a7a681d57 100644
--- a/indra/llui/lluicolortable.h
+++ b/indra/llui/lluicolortable.h
@@ -44,7 +44,7 @@ LOG_CLASS(LLUIColorTable);
typedef std::map<std::string, LLUIColor> string_color_map_t;
public:
- struct ColorParams : LLInitParam::Choice<ColorParams>
+ struct ColorParams : LLInitParam::ChoiceBlock<ColorParams>
{
Alternative<LLColor4> value;
Alternative<std::string> reference;
diff --git a/indra/llui/lluictrl.cpp b/indra/llui/lluictrl.cpp
index d58df5801b..b9c843e931 100644
--- a/indra/llui/lluictrl.cpp
+++ b/indra/llui/lluictrl.cpp
@@ -118,7 +118,6 @@ LLUICtrl::LLUICtrl(const LLUICtrl::Params& p, const LLViewModelPtr& viewmodel)
mDoubleClickSignal(NULL),
mTransparencyType(TT_DEFAULT)
{
- mUICtrlHandle.bind(this);
}
void LLUICtrl::initFromParams(const Params& p)
@@ -460,7 +459,7 @@ void LLUICtrl::setControlVariable(LLControlVariable* control)
if (control)
{
mControlVariable = control;
- mControlConnection = mControlVariable->getSignal()->connect(boost::bind(&controlListener, _2, getUICtrlHandle(), std::string("value")));
+ mControlConnection = mControlVariable->getSignal()->connect(boost::bind(&controlListener, _2, getHandle(), std::string("value")));
setValue(mControlVariable->getValue());
}
}
@@ -491,7 +490,7 @@ void LLUICtrl::setEnabledControlVariable(LLControlVariable* control)
if (control)
{
mEnabledControlVariable = control;
- mEnabledControlConnection = mEnabledControlVariable->getSignal()->connect(boost::bind(&controlListener, _2, getUICtrlHandle(), std::string("enabled")));
+ mEnabledControlConnection = mEnabledControlVariable->getSignal()->connect(boost::bind(&controlListener, _2, getHandle(), std::string("enabled")));
setEnabled(mEnabledControlVariable->getValue().asBoolean());
}
}
@@ -506,7 +505,7 @@ void LLUICtrl::setDisabledControlVariable(LLControlVariable* control)
if (control)
{
mDisabledControlVariable = control;
- mDisabledControlConnection = mDisabledControlVariable->getSignal()->connect(boost::bind(&controlListener, _2, getUICtrlHandle(), std::string("disabled")));
+ mDisabledControlConnection = mDisabledControlVariable->getSignal()->connect(boost::bind(&controlListener, _2, getHandle(), std::string("disabled")));
setEnabled(!(mDisabledControlVariable->getValue().asBoolean()));
}
}
@@ -521,7 +520,7 @@ void LLUICtrl::setMakeVisibleControlVariable(LLControlVariable* control)
if (control)
{
mMakeVisibleControlVariable = control;
- mMakeVisibleControlConnection = mMakeVisibleControlVariable->getSignal()->connect(boost::bind(&controlListener, _2, getUICtrlHandle(), std::string("visible")));
+ mMakeVisibleControlConnection = mMakeVisibleControlVariable->getSignal()->connect(boost::bind(&controlListener, _2, getHandle(), std::string("visible")));
setVisible(mMakeVisibleControlVariable->getValue().asBoolean());
}
}
@@ -536,7 +535,7 @@ void LLUICtrl::setMakeInvisibleControlVariable(LLControlVariable* control)
if (control)
{
mMakeInvisibleControlVariable = control;
- mMakeInvisibleControlConnection = mMakeInvisibleControlVariable->getSignal()->connect(boost::bind(&controlListener, _2, getUICtrlHandle(), std::string("invisible")));
+ mMakeInvisibleControlConnection = mMakeInvisibleControlVariable->getSignal()->connect(boost::bind(&controlListener, _2, getHandle(), std::string("invisible")));
setVisible(!(mMakeInvisibleControlVariable->getValue().asBoolean()));
}
}
@@ -992,6 +991,16 @@ void LLUICtrl::setTransparencyType(ETypeTransparency type)
mTransparencyType = type;
}
+boost::signals2::connection LLUICtrl::setCommitCallback(const CommitCallbackParam& cb)
+{
+ return setCommitCallback(initCommitCallback(cb));
+}
+
+boost::signals2::connection LLUICtrl::setValidateCallback(const EnableCallbackParam& cb)
+{
+ return setValidateCallback(initEnableCallback(cb));
+}
+
boost::signals2::connection LLUICtrl::setCommitCallback( const commit_signal_t::slot_type& cb )
{
if (!mCommitSignal) mCommitSignal = new commit_signal_t();
@@ -1045,3 +1054,9 @@ boost::signals2::connection LLUICtrl::setDoubleClickCallback( const mouse_signal
if (!mDoubleClickSignal) mDoubleClickSignal = new mouse_signal_t();
return mDoubleClickSignal->connect(cb);
}
+
+void LLUICtrl::addInfo(LLSD & info)
+{
+ LLView::addInfo(info);
+ info["value"] = getValue();
+}
diff --git a/indra/llui/lluictrl.h b/indra/llui/lluictrl.h
index 09bed9b958..fb2196bb16 100644
--- a/indra/llui/lluictrl.h
+++ b/indra/llui/lluictrl.h
@@ -76,14 +76,14 @@ public:
Optional<enable_callback_t> function;
};
- struct EnableControls : public LLInitParam::Choice<EnableControls>
+ struct EnableControls : public LLInitParam::ChoiceBlock<EnableControls>
{
Alternative<std::string> enabled;
Alternative<std::string> disabled;
EnableControls();
};
- struct ControlVisibility : public LLInitParam::Choice<ControlVisibility>
+ struct ControlVisibility : public LLInitParam::ChoiceBlock<ControlVisibility>
{
Alternative<std::string> visible;
Alternative<std::string> invisible;
@@ -223,7 +223,7 @@ public:
BOOL focusLastItem(BOOL prefer_text_fields = FALSE);
// Non Virtuals
- LLHandle<LLUICtrl> getUICtrlHandle() const { return mUICtrlHandle; }
+ LLHandle<LLUICtrl> getHandle() const { return getDerivedHandle<LLUICtrl>(); }
BOOL getIsChrome() const;
void setTabStop( BOOL b );
@@ -235,6 +235,9 @@ public:
// topic then put in help_topic_out
bool findHelpTopic(std::string& help_topic_out);
+ boost::signals2::connection setCommitCallback(const CommitCallbackParam& cb);
+ boost::signals2::connection setValidateCallback(const EnableCallbackParam& cb);
+
boost::signals2::connection setCommitCallback( const commit_signal_t::slot_type& cb );
boost::signals2::connection setValidateCallback( const enable_signal_t::slot_type& cb );
@@ -301,14 +304,15 @@ protected:
static F32 sActiveControlTransparency;
static F32 sInactiveControlTransparency;
-
+
+ virtual void addInfo(LLSD & info);
+
private:
BOOL mIsChrome;
BOOL mRequestsFront;
BOOL mTabStop;
BOOL mTentative;
- LLRootHandle<LLUICtrl> mUICtrlHandle;
ETypeTransparency mTransparencyType;
diff --git a/indra/llui/lluictrlfactory.h b/indra/llui/lluictrlfactory.h
index f0ba7fc7d7..d612ad5005 100644
--- a/indra/llui/lluictrlfactory.h
+++ b/indra/llui/lluictrlfactory.h
@@ -172,7 +172,7 @@ public:
static T* createFromFile(const std::string &filename, LLView *parent, const widget_registry_t& registry, LLXMLNodePtr output_node = NULL)
{
T* widget = NULL;
-
+
std::string skinned_filename = findSkinnedFilename(filename);
instance().pushFileName(filename);
{
@@ -201,10 +201,10 @@ public:
// not of right type, so delete it
if (!widget)
{
+ llwarns << "Widget in " << filename << " was of type " << typeid(view).name() << " instead of expected type " << typeid(T).name() << llendl;
delete view;
view = NULL;
}
-
}
}
fail:
diff --git a/indra/llui/llurlaction.cpp b/indra/llui/llurlaction.cpp
index 42b779bd28..fd9b3d9a6d 100644
--- a/indra/llui/llurlaction.cpp
+++ b/indra/llui/llurlaction.cpp
@@ -33,28 +33,28 @@
#include "llurlregistry.h"
// global state for the callback functions
-void (*LLUrlAction::sOpenURLCallback) (const std::string& url) = NULL;
-void (*LLUrlAction::sOpenURLInternalCallback) (const std::string& url) = NULL;
-void (*LLUrlAction::sOpenURLExternalCallback) (const std::string& url) = NULL;
-bool (*LLUrlAction::sExecuteSLURLCallback) (const std::string& url) = NULL;
+LLUrlAction::url_callback_t LLUrlAction::sOpenURLCallback;
+LLUrlAction::url_callback_t LLUrlAction::sOpenURLInternalCallback;
+LLUrlAction::url_callback_t LLUrlAction::sOpenURLExternalCallback;
+LLUrlAction::execute_url_callback_t LLUrlAction::sExecuteSLURLCallback;
-void LLUrlAction::setOpenURLCallback(void (*cb) (const std::string& url))
+void LLUrlAction::setOpenURLCallback(url_callback_t cb)
{
sOpenURLCallback = cb;
}
-void LLUrlAction::setOpenURLInternalCallback(void (*cb) (const std::string& url))
+void LLUrlAction::setOpenURLInternalCallback(url_callback_t cb)
{
sOpenURLInternalCallback = cb;
}
-void LLUrlAction::setOpenURLExternalCallback(void (*cb) (const std::string& url))
+void LLUrlAction::setOpenURLExternalCallback(url_callback_t cb)
{
sOpenURLExternalCallback = cb;
}
-void LLUrlAction::setExecuteSLURLCallback(bool (*cb) (const std::string& url))
+void LLUrlAction::setExecuteSLURLCallback(execute_url_callback_t cb)
{
sExecuteSLURLCallback = cb;
}
@@ -63,7 +63,7 @@ void LLUrlAction::openURL(std::string url)
{
if (sOpenURLCallback)
{
- (*sOpenURLCallback)(url);
+ sOpenURLCallback(url);
}
}
@@ -71,7 +71,7 @@ void LLUrlAction::openURLInternal(std::string url)
{
if (sOpenURLInternalCallback)
{
- (*sOpenURLInternalCallback)(url);
+ sOpenURLInternalCallback(url);
}
}
@@ -79,7 +79,7 @@ void LLUrlAction::openURLExternal(std::string url)
{
if (sOpenURLExternalCallback)
{
- (*sOpenURLExternalCallback)(url);
+ sOpenURLExternalCallback(url);
}
}
@@ -87,18 +87,18 @@ void LLUrlAction::executeSLURL(std::string url)
{
if (sExecuteSLURLCallback)
{
- (*sExecuteSLURLCallback)(url);
+ sExecuteSLURLCallback(url);
}
}
void LLUrlAction::clickAction(std::string url)
{
// Try to handle as SLURL first, then http Url
- if ( (sExecuteSLURLCallback) && !(*sExecuteSLURLCallback)(url) )
+ if ( (sExecuteSLURLCallback) && !sExecuteSLURLCallback(url) )
{
if (sOpenURLCallback)
{
- (*sOpenURLCallback)(url);
+ sOpenURLCallback(url);
}
}
}
diff --git a/indra/llui/llurlaction.h b/indra/llui/llurlaction.h
index 0132dbaaf0..c34960b826 100644
--- a/indra/llui/llurlaction.h
+++ b/indra/llui/llurlaction.h
@@ -29,6 +29,7 @@
#define LL_LLURLACTION_H
#include <string>
+#include <boost/function.hpp>
///
/// The LLUrlAction class provides a number of static functions that
@@ -77,17 +78,21 @@ public:
static void showProfile(std::string url);
/// specify the callbacks to enable this class's functionality
- static void setOpenURLCallback(void (*cb) (const std::string& url));
- static void setOpenURLInternalCallback(void (*cb) (const std::string& url));
- static void setOpenURLExternalCallback(void (*cb) (const std::string& url));
- static void setExecuteSLURLCallback(bool (*cb) (const std::string& url));
+ typedef boost::function<void (const std::string&)> url_callback_t;
+ typedef boost::function<bool(const std::string& url)> execute_url_callback_t;
+
+ static void setOpenURLCallback(url_callback_t cb);
+ static void setOpenURLInternalCallback(url_callback_t cb);
+ static void setOpenURLExternalCallback(url_callback_t cb);
+ static void setExecuteSLURLCallback(execute_url_callback_t cb);
private:
// callbacks for operations we can perform on Urls
- static void (*sOpenURLCallback) (const std::string& url);
- static void (*sOpenURLInternalCallback) (const std::string& url);
- static void (*sOpenURLExternalCallback) (const std::string& url);
- static bool (*sExecuteSLURLCallback) (const std::string& url);
+ static url_callback_t sOpenURLCallback;
+ static url_callback_t sOpenURLInternalCallback;
+ static url_callback_t sOpenURLExternalCallback;
+
+ static execute_url_callback_t sExecuteSLURLCallback;
};
#endif
diff --git a/indra/llui/llview.cpp b/indra/llui/llview.cpp
index 60452b9ae4..e1ee0a5b14 100644
--- a/indra/llui/llview.cpp
+++ b/indra/llui/llview.cpp
@@ -31,7 +31,10 @@
#include "llview.h"
#include <cassert>
+#include <sstream>
#include <boost/tokenizer.hpp>
+#include <boost/foreach.hpp>
+#include <boost/bind.hpp>
#include "llrender.h"
#include "llevent.h"
@@ -44,6 +47,7 @@
#include "v3color.h"
#include "lluictrlfactory.h"
#include "lltooltip.h"
+#include "llsdutil.h"
// for ui edit hack
#include "llbutton.h"
@@ -66,6 +70,8 @@ S32 LLView::sLastLeftXML = S32_MIN;
S32 LLView::sLastBottomXML = S32_MIN;
std::vector<LLViewDrawContext*> LLViewDrawContext::sDrawContextStack;
+LLView::DrilldownFunc LLView::sDrilldown =
+ boost::bind(&LLView::pointInView, _1, _2, _3, HIT_TEST_USE_BOUNDING_RECT);
//#if LL_DEBUG
BOOL LLView::sIsDrawing = FALSE;
@@ -115,6 +121,7 @@ LLView::Params::Params()
LLView::LLView(const LLView::Params& p)
: mVisible(p.visible),
+ mInDraw(false),
mName(p.name),
mParentView(NULL),
mReshapeFlags(FOLLOWS_NONE),
@@ -219,9 +226,11 @@ BOOL LLView::getUseBoundingRect() const
}
// virtual
-std::string LLView::getName() const
+const std::string& LLView::getName() const
{
- return mName.empty() ? std::string("(no name)") : mName;
+ static std::string no_name("(no name)");
+
+ return mName.empty() ? no_name : mName;
}
void LLView::sendChildToFront(LLView* child)
@@ -325,6 +334,8 @@ void LLView::removeChild(LLView* child)
//llassert_always(sDepth == 0); // Avoid re-ordering while drawing; it can cause subtle iterator bugs
if (child->mParentView == this)
{
+ // if we are removing an item we are currently iterating over, that would be bad
+ llassert(child->mInDraw == false);
mChildList.remove( child );
child->mParentView = NULL;
if (child->isCtrl())
@@ -346,13 +357,11 @@ void LLView::removeChild(LLView* child)
LLView::ctrl_list_t LLView::getCtrlList() const
{
ctrl_list_t controls;
- for(child_list_const_iter_t iter = mChildList.begin();
- iter != mChildList.end();
- iter++)
+ BOOST_FOREACH(LLView* viewp, mChildList)
{
- if((*iter)->isCtrl())
+ if(viewp->isCtrl())
{
- controls.push_back(static_cast<LLUICtrl*>(*iter));
+ controls.push_back(static_cast<LLUICtrl*>(viewp));
}
}
return controls;
@@ -428,6 +437,36 @@ BOOL LLView::isInEnabledChain() const
return enabled;
}
+static void buildPathname(std::ostream& out, const LLView* view)
+{
+ if (! (view && view->getParent()))
+ {
+ return; // Don't include root in the path.
+ }
+
+ buildPathname(out, view->getParent());
+
+ // Build pathname into ostream on the way back from recursion.
+ out << '/' << view->getName();
+}
+
+std::string LLView::getPathname() const
+{
+ std::ostringstream out;
+ buildPathname(out, this);
+ return out.str();
+}
+
+//static
+std::string LLView::getPathname(const LLView* view)
+{
+ if (! view)
+ {
+ return "NULL";
+ }
+ return view->getPathname();
+}
+
// virtual
BOOL LLView::canFocusChildren() const
{
@@ -574,9 +613,8 @@ void LLView::deleteAllChildren()
void LLView::setAllChildrenEnabled(BOOL b)
{
- for ( child_list_iter_t child_it = mChildList.begin(); child_it != mChildList.end(); ++child_it)
+ BOOST_FOREACH(LLView* viewp, mChildList)
{
- LLView* viewp = *child_it;
viewp->setEnabled(b);
}
}
@@ -602,9 +640,8 @@ void LLView::setVisible(BOOL visible)
// virtual
void LLView::handleVisibilityChange ( BOOL new_visibility )
{
- for ( child_list_iter_t child_it = mChildList.begin(); child_it != mChildList.end(); ++child_it)
+ BOOST_FOREACH(LLView* viewp, mChildList)
{
- LLView* viewp = *child_it;
// only views that are themselves visible will have their overall visibility affected by their ancestors
if (viewp->getVisible())
{
@@ -646,56 +683,178 @@ void LLView::onMouseLeave(S32 x, S32 y, MASK mask)
//llinfos << "Mouse left " << getName() << llendl;
}
+bool LLView::visibleAndContains(S32 local_x, S32 local_y)
+{
+ return sDrilldown(this, local_x, local_y)
+ && getVisible();
+}
+
+bool LLView::visibleEnabledAndContains(S32 local_x, S32 local_y)
+{
+ return visibleAndContains(local_x, local_y)
+ && getEnabled();
+}
+
+void LLView::logMouseEvent()
+{
+ if (sDebugMouseHandling)
+ {
+ sMouseHandlerMessage = std::string("/") + mName + sMouseHandlerMessage;
+ }
+}
+
+template <typename METHOD, typename CHARTYPE>
+LLView* LLView::childrenHandleCharEvent(const std::string& desc, const METHOD& method,
+ CHARTYPE c, MASK mask)
+{
+ if ( getVisible() && getEnabled() )
+ {
+ BOOST_FOREACH(LLView* viewp, mChildList)
+ {
+ if ((viewp->*method)(c, mask, TRUE))
+ {
+ if (LLView::sDebugKeys)
+ {
+ llinfos << desc << " handled by " << viewp->getName() << llendl;
+ }
+ return viewp;
+ }
+ }
+ }
+ return NULL;
+}
+
+// XDATA might be MASK, or S32 clicks
+template <typename METHOD, typename XDATA>
+LLView* LLView::childrenHandleMouseEvent(const METHOD& method, S32 x, S32 y, XDATA extra, bool allow_mouse_block)
+{
+ BOOST_FOREACH(LLView* viewp, mChildList)
+ {
+ S32 local_x = x - viewp->getRect().mLeft;
+ S32 local_y = y - viewp->getRect().mBottom;
+
+ if (!viewp->visibleEnabledAndContains(local_x, local_y))
+ {
+ continue;
+ }
+
+ if ((viewp->*method)( local_x, local_y, extra )
+ || (allow_mouse_block && viewp->blockMouseEvent( local_x, local_y )))
+ {
+ viewp->logMouseEvent();
+ return viewp;
+ }
+ }
+ return NULL;
+}
LLView* LLView::childrenHandleToolTip(S32 x, S32 y, MASK mask)
{
- LLView* handled_view = NULL;
- for ( child_list_iter_t child_it = mChildList.begin(); child_it != mChildList.end(); ++child_it)
+ BOOST_FOREACH(LLView* viewp, mChildList)
{
- LLView* viewp = *child_it;
S32 local_x = x - viewp->getRect().mLeft;
S32 local_y = y - viewp->getRect().mBottom;
- if(!viewp->pointInView(local_x, local_y)
- || !viewp->getVisible())
+ // Differs from childrenHandleMouseEvent() in that we want to offer
+ // tooltips even for disabled widgets.
+ if(!viewp->visibleAndContains(local_x, local_y))
{
continue;
}
- if (viewp->handleToolTip(local_x, local_y, mask) )
+ if (viewp->handleToolTip(local_x, local_y, mask)
+ || viewp->blockMouseEvent(local_x, local_y))
{
- if (sDebugMouseHandling)
- {
- sMouseHandlerMessage = std::string("/") + viewp->mName + sMouseHandlerMessage;
- }
+ viewp->logMouseEvent();
+ return viewp;
+ }
+ }
+ return NULL;
+}
- handled_view = viewp;
- break;
+LLView* LLView::childrenHandleDragAndDrop(S32 x, S32 y, MASK mask,
+ BOOL drop,
+ EDragAndDropType cargo_type,
+ void* cargo_data,
+ EAcceptance* accept,
+ std::string& tooltip_msg)
+{
+ // default to not accepting drag and drop, will be overridden by handler
+ *accept = ACCEPT_NO;
+
+ BOOST_FOREACH(LLView* viewp, mChildList)
+ {
+ S32 local_x = x - viewp->getRect().mLeft;
+ S32 local_y = y - viewp->getRect().mBottom;
+ if( !viewp->visibleEnabledAndContains(local_x, local_y))
+ {
+ continue;
}
- if (viewp->blockMouseEvent(local_x, local_y))
+ // Differs from childrenHandleMouseEvent() simply in that this virtual
+ // method call diverges pretty radically from the usual (x, y, int).
+ if (viewp->handleDragAndDrop(local_x, local_y, mask, drop,
+ cargo_type,
+ cargo_data,
+ accept,
+ tooltip_msg)
+ || viewp->blockMouseEvent(local_x, local_y))
{
- handled_view = viewp;
- break;
+ return viewp;
}
}
- return handled_view;
+ return NULL;
}
+LLView* LLView::childrenHandleHover(S32 x, S32 y, MASK mask)
+{
+ BOOST_FOREACH(LLView* viewp, mChildList)
+ {
+ S32 local_x = x - viewp->getRect().mLeft;
+ S32 local_y = y - viewp->getRect().mBottom;
+ if(!viewp->visibleEnabledAndContains(local_x, local_y))
+ {
+ continue;
+ }
+
+ // This call differentiates this method from childrenHandleMouseEvent().
+ LLUI::sWindow->setCursor(viewp->getHoverCursor());
-LLView* LLView::childFromPoint(S32 x, S32 y)
+ if (viewp->handleHover(local_x, local_y, mask)
+ || viewp->blockMouseEvent(local_x, local_y))
+ {
+ viewp->logMouseEvent();
+ return viewp;
+ }
+ }
+ return NULL;
+}
+
+LLView* LLView::childFromPoint(S32 x, S32 y, bool recur)
{
- if (!getVisible() )
+ if (!getVisible())
return false;
- for ( child_list_iter_t child_it = mChildList.begin(); child_it != mChildList.end(); ++child_it)
+
+ BOOST_FOREACH(LLView* viewp, mChildList)
{
- LLView* viewp = *child_it;
S32 local_x = x - viewp->getRect().mLeft;
S32 local_y = y - viewp->getRect().mBottom;
- if (!viewp->pointInView(local_x, local_y)
- || !viewp->getVisible() )
+ if (!viewp->visibleAndContains(local_x, local_y))
{
continue;
}
+ // Here we've found the first (frontmost) visible child at this level
+ // containing the specified point. Is the caller asking us to drill
+ // down and return the innermost leaf child at this point, or just the
+ // top-level child?
+ if (recur)
+ {
+ LLView* leaf(viewp->childFromPoint(local_x, local_y, recur));
+ // Maybe viewp is already a leaf LLView, or maybe it has children
+ // but this particular (x, y) point falls between them. If the
+ // recursive call returns non-NULL, great, use that; else just use
+ // viewp.
+ return leaf? leaf : viewp;
+ }
return viewp;
}
@@ -708,15 +867,16 @@ BOOL LLView::handleToolTip(S32 x, S32 y, MASK mask)
// parents provide tooltips first, which are optionally
// overridden by children, in case child is mouse_opaque
- if (!mToolTipMsg.empty())
+ std::string tooltip = getToolTip();
+ if (!tooltip.empty())
{
// allow "scrubbing" over ui by showing next tooltip immediately
// if previous one was still visible
F32 timeout = LLToolTipMgr::instance().toolTipVisible()
- ? 0.f
+ ? LLUI::sSettingGroups["config"]->getF32( "ToolTipFastDelay" )
: LLUI::sSettingGroups["config"]->getF32( "ToolTipDelay" );
LLToolTipMgr::instance().show(LLToolTip::Params()
- .message(mToolTipMsg)
+ .message(tooltip)
.sticky_rect(calcScreenRect())
.delay_time(timeout));
@@ -815,45 +975,6 @@ BOOL LLView::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
return childrenHandleDragAndDrop( x, y, mask, drop, cargo_type, cargo_data, accept, tooltip_msg) != NULL;
}
-LLView* LLView::childrenHandleDragAndDrop(S32 x, S32 y, MASK mask,
- BOOL drop,
- EDragAndDropType cargo_type,
- void* cargo_data,
- EAcceptance* accept,
- std::string& tooltip_msg)
-{
- LLView* handled_view = NULL;
- for ( child_list_iter_t child_it = mChildList.begin(); child_it != mChildList.end(); ++child_it)
- {
- LLView* viewp = *child_it;
- S32 local_x = x - viewp->getRect().mLeft;
- S32 local_y = y - viewp->getRect().mBottom;
- if( !viewp->pointInView(local_x, local_y) ||
- !viewp->getVisible() ||
- !viewp->getEnabled())
- {
- continue;
- }
- if (viewp->handleDragAndDrop(local_x, local_y, mask, drop,
- cargo_type,
- cargo_data,
- accept,
- tooltip_msg))
- {
- handled_view = viewp;
- break;
- }
-
- if (viewp->blockMouseEvent(x, y))
- {
- *accept = ACCEPT_NO;
- handled_view = viewp;
- break;
- }
- }
- return handled_view;
-}
-
void LLView::onMouseCaptureLost()
{
}
@@ -903,391 +1024,57 @@ BOOL LLView::handleMiddleMouseUp(S32 x, S32 y, MASK mask)
return childrenHandleMiddleMouseUp( x, y, mask ) != NULL;
}
-
LLView* LLView::childrenHandleScrollWheel(S32 x, S32 y, S32 clicks)
{
- LLView* handled_view = NULL;
- if (getVisible() && getEnabled() )
- {
- for ( child_list_iter_t child_it = mChildList.begin(); child_it != mChildList.end(); ++child_it)
- {
- LLView* viewp = *child_it;
- S32 local_x = x - viewp->getRect().mLeft;
- S32 local_y = y - viewp->getRect().mBottom;
- if (!viewp->pointInView(local_x, local_y)
- || !viewp->getVisible()
- || !viewp->getEnabled())
- {
- continue;
- }
-
- if (viewp->handleScrollWheel( local_x, local_y, clicks ))
- {
- if (sDebugMouseHandling)
- {
- sMouseHandlerMessage = std::string("/") + viewp->mName + sMouseHandlerMessage;
- }
-
- handled_view = viewp;
- break;
- }
- }
- }
- return handled_view;
-}
-
-LLView* LLView::childrenHandleHover(S32 x, S32 y, MASK mask)
-{
- LLView* handled_view = NULL;
- if (getVisible() && getEnabled() )
- {
- for ( child_list_iter_t child_it = mChildList.begin(); child_it != mChildList.end(); ++child_it)
- {
- LLView* viewp = *child_it;
- S32 local_x = x - viewp->getRect().mLeft;
- S32 local_y = y - viewp->getRect().mBottom;
- if(!viewp->pointInView(local_x, local_y)
- || !viewp->getVisible()
- || !viewp->getEnabled())
- {
- continue;
- }
-
- if (viewp->handleHover(local_x, local_y, mask) )
- {
- if (sDebugMouseHandling)
- {
- sMouseHandlerMessage = std::string("/") + viewp->mName + sMouseHandlerMessage;
- }
-
- handled_view = viewp;
- break;
- }
-
- if (viewp->blockMouseEvent(local_x, local_y))
- {
- LLUI::sWindow->setCursor(viewp->getHoverCursor());
-
- handled_view = viewp;
- break;
- }
- }
- }
- return handled_view;
+ return childrenHandleMouseEvent(&LLView::handleScrollWheel, x, y, clicks, false);
}
// Called during downward traversal
LLView* LLView::childrenHandleKey(KEY key, MASK mask)
{
- LLView* handled_view = NULL;
-
- if ( getVisible() && getEnabled() )
- {
- for ( child_list_iter_t child_it = mChildList.begin(); child_it != mChildList.end(); ++child_it)
- {
- LLView* viewp = *child_it;
- if (viewp->handleKey(key, mask, TRUE))
- {
- if (LLView::sDebugKeys)
- {
- llinfos << "Key handled by " << viewp->getName() << llendl;
- }
- handled_view = viewp;
- break;
- }
- }
- }
-
- return handled_view;
+ return childrenHandleCharEvent("Key", &LLView::handleKey, key, mask);
}
// Called during downward traversal
LLView* LLView::childrenHandleUnicodeChar(llwchar uni_char)
{
- LLView* handled_view = NULL;
-
- if ( getVisible() && getEnabled() )
- {
- for ( child_list_iter_t child_it = mChildList.begin(); child_it != mChildList.end(); ++child_it)
- {
- LLView* viewp = *child_it;
- if (viewp->handleUnicodeChar(uni_char, TRUE))
- {
- if (LLView::sDebugKeys)
- {
- llinfos << "Unicode character handled by " << viewp->getName() << llendl;
- }
- handled_view = viewp;
- break;
- }
- }
- }
-
- return handled_view;
+ return childrenHandleCharEvent("Unicode character", &LLView::handleUnicodeCharWithDummyMask,
+ uni_char, MASK_NONE);
}
LLView* LLView::childrenHandleMouseDown(S32 x, S32 y, MASK mask)
{
- LLView* handled_view = NULL;
-
- for ( child_list_iter_t child_it = mChildList.begin(); child_it != mChildList.end(); ++child_it)
- {
- LLView* viewp = *child_it;
- S32 local_x = x - viewp->getRect().mLeft;
- S32 local_y = y - viewp->getRect().mBottom;
-
- if (!viewp->pointInView(local_x, local_y)
- || !viewp->getVisible()
- || !viewp->getEnabled())
- {
- continue;
- }
-
- if(viewp->handleMouseDown( local_x, local_y, mask ))
- {
- if (sDebugMouseHandling)
- {
- sMouseHandlerMessage = std::string("/") + viewp->mName + sMouseHandlerMessage;
- }
- handled_view = viewp;
- break;
- }
-
- if(viewp->blockMouseEvent(local_x, local_y))
- {
- handled_view = viewp;
- break;
- }
- }
- return handled_view;
+ return childrenHandleMouseEvent(&LLView::handleMouseDown, x, y, mask);
}
LLView* LLView::childrenHandleRightMouseDown(S32 x, S32 y, MASK mask)
{
- LLView* handled_view = NULL;
-
- if (getVisible() && getEnabled() )
- {
- for ( child_list_iter_t child_it = mChildList.begin(); child_it != mChildList.end(); ++child_it)
- {
- LLView* viewp = *child_it;
- S32 local_x = x - viewp->getRect().mLeft;
- S32 local_y = y - viewp->getRect().mBottom;
-
- if (!viewp->pointInView(local_x, local_y)
- || !viewp->getVisible()
- || !viewp->getEnabled())
- {
- continue;
- }
-
- if (viewp->handleRightMouseDown( local_x, local_y, mask ))
- {
- if (sDebugMouseHandling)
- {
- sMouseHandlerMessage = std::string("/") + viewp->mName + sMouseHandlerMessage;
- }
-
- handled_view = viewp;
- break;
- }
-
- if (viewp->blockMouseEvent(local_x, local_y))
- {
- handled_view = viewp;
- break;
- }
- }
- }
- return handled_view;
+ return childrenHandleMouseEvent(&LLView::handleRightMouseDown, x, y, mask);
}
LLView* LLView::childrenHandleMiddleMouseDown(S32 x, S32 y, MASK mask)
{
- LLView* handled_view = NULL;
-
- if (getVisible() && getEnabled() )
- {
- for ( child_list_iter_t child_it = mChildList.begin(); child_it != mChildList.end(); ++child_it)
- {
- LLView* viewp = *child_it;
- S32 local_x = x - viewp->getRect().mLeft;
- S32 local_y = y - viewp->getRect().mBottom;
- if (!viewp->pointInView(local_x, local_y)
- || !viewp->getVisible()
- || !viewp->getEnabled())
- {
- continue;
- }
-
- if(viewp->handleMiddleMouseDown( local_x, local_y, mask ))
- {
- if (sDebugMouseHandling)
- {
- sMouseHandlerMessage = std::string("/") + viewp->mName + sMouseHandlerMessage;
- }
- handled_view = viewp;
- break;
- }
-
- if (viewp->blockMouseEvent(local_x, local_y))
- {
- handled_view = viewp;
- break;
- }
- }
- }
- return handled_view;
+ return childrenHandleMouseEvent(&LLView::handleMiddleMouseDown, x, y, mask);
}
LLView* LLView::childrenHandleDoubleClick(S32 x, S32 y, MASK mask)
{
- LLView* handled_view = NULL;
-
- if (getVisible() && getEnabled() )
- {
- for ( child_list_iter_t child_it = mChildList.begin(); child_it != mChildList.end(); ++child_it)
- {
- LLView* viewp = *child_it;
- S32 local_x = x - viewp->getRect().mLeft;
- S32 local_y = y - viewp->getRect().mBottom;
-
- if (!viewp->pointInView(local_x, local_y)
- || !viewp->getVisible()
- || !viewp->getEnabled())
- {
- continue;
- }
-
- if (viewp->handleDoubleClick( local_x, local_y, mask ))
- {
- if (sDebugMouseHandling)
- {
- sMouseHandlerMessage = std::string("/") + viewp->mName + sMouseHandlerMessage;
- }
- handled_view = viewp;
- break;
- }
-
- if (viewp->blockMouseEvent(local_x, local_y))
- {
- handled_view = viewp;
- break;
- }
- }
- }
- return handled_view;
+ return childrenHandleMouseEvent(&LLView::handleDoubleClick, x, y, mask);
}
LLView* LLView::childrenHandleMouseUp(S32 x, S32 y, MASK mask)
{
- LLView* handled_view = NULL;
- if( getVisible() && getEnabled() )
- {
- for ( child_list_iter_t child_it = mChildList.begin(); child_it != mChildList.end(); ++child_it)
- {
- LLView* viewp = *child_it;
- S32 local_x = x - viewp->getRect().mLeft;
- S32 local_y = y - viewp->getRect().mBottom;
- if (!viewp->pointInView(local_x, local_y)
- || !viewp->getVisible()
- || !viewp->getEnabled())
- {
- continue;
- }
-
- if (viewp->handleMouseUp( local_x, local_y, mask ))
- {
- if (sDebugMouseHandling)
- {
- sMouseHandlerMessage = std::string("/") + viewp->mName + sMouseHandlerMessage;
- }
- handled_view = viewp;
- break;
- }
-
- if (viewp->blockMouseEvent(local_x, local_y))
- {
- handled_view = viewp;
- break;
- }
- }
- }
- return handled_view;
+ return childrenHandleMouseEvent(&LLView::handleMouseUp, x, y, mask);
}
LLView* LLView::childrenHandleRightMouseUp(S32 x, S32 y, MASK mask)
{
- LLView* handled_view = NULL;
- if( getVisible() && getEnabled() )
- {
- for ( child_list_iter_t child_it = mChildList.begin(); child_it != mChildList.end(); ++child_it)
- {
- LLView* viewp = *child_it;
- S32 local_x = x - viewp->getRect().mLeft;
- S32 local_y = y - viewp->getRect().mBottom;
- if (!viewp->pointInView(local_x, local_y)
- || !viewp->getVisible()
- || !viewp->getEnabled() )
- {
- continue;
- }
-
- if(viewp->handleRightMouseUp( local_x, local_y, mask ))
- {
- if (sDebugMouseHandling)
- {
- sMouseHandlerMessage = std::string("/") + viewp->mName + sMouseHandlerMessage;
- }
- handled_view = viewp;
- break;
- }
-
- if(viewp->blockMouseEvent(local_x, local_y))
- {
- handled_view = viewp;
- break;
- }
- }
- }
- return handled_view;
+ return childrenHandleMouseEvent(&LLView::handleRightMouseUp, x, y, mask);
}
LLView* LLView::childrenHandleMiddleMouseUp(S32 x, S32 y, MASK mask)
{
- LLView* handled_view = NULL;
- if( getVisible() && getEnabled() )
- {
- for ( child_list_iter_t child_it = mChildList.begin(); child_it != mChildList.end(); ++child_it)
- {
- LLView* viewp = *child_it;
- S32 local_x = x - viewp->getRect().mLeft;
- S32 local_y = y - viewp->getRect().mBottom;
- if (!viewp->pointInView(local_x, local_y)
- || !viewp->getVisible()
- || !viewp->getEnabled())
- {
- continue;
- }
-
- if(viewp->handleMiddleMouseUp( local_x, local_y, mask ))
- {
- if (sDebugMouseHandling)
- {
- sMouseHandlerMessage = std::string("/") + viewp->mName + sMouseHandlerMessage;
- }
- handled_view = viewp;
- break;
- }
-
- if (viewp->blockMouseEvent(local_x, local_y))
- {
- handled_view = viewp;
- break;
- }
- }
- }
- return handled_view;
+ return childrenHandleMouseEvent(&LLView::handleMiddleMouseUp, x, y, mask);
}
void LLView::draw()
@@ -1306,6 +1093,11 @@ void LLView::drawChildren()
{
child_list_reverse_iter_t child = child_iter++;
LLView *viewp = *child;
+
+ if (viewp == NULL)
+ {
+ continue;
+ }
if (viewp->getVisible() && viewp->getRect().isValid())
{
@@ -1315,7 +1107,10 @@ void LLView::drawChildren()
LLUI::pushMatrix();
{
LLUI::translate((F32)viewp->getRect().mLeft, (F32)viewp->getRect().mBottom, 0.f);
+ // flag the fact we are in draw here, in case overridden draw() method attempts to remove this widget
+ viewp->mInDraw = true;
viewp->draw();
+ viewp->mInDraw = false;
if (sDebugRects)
{
@@ -1433,7 +1228,7 @@ void LLView::drawChild(LLView* childp, S32 x_offset, S32 y_offset, BOOL force_dr
if ((childp->getVisible() && childp->getRect().isValid())
|| force_draw)
{
- glMatrixMode(GL_MODELVIEW);
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
LLUI::pushMatrix();
{
LLUI::translate((F32)childp->getRect().mLeft + x_offset, (F32)childp->getRect().mBottom + y_offset, 0.f);
@@ -1460,9 +1255,8 @@ void LLView::reshape(S32 width, S32 height, BOOL called_from_parent)
mRect.mTop = getRect().mBottom + height;
// move child views according to reshape flags
- for ( child_list_iter_t child_it = mChildList.begin(); child_it != mChildList.end(); ++child_it)
+ BOOST_FOREACH(LLView* viewp, mChildList)
{
- LLView* viewp = *child_it;
LLRect child_rect( viewp->mRect );
if (viewp->followsRight() && viewp->followsLeft())
@@ -1525,10 +1319,8 @@ LLRect LLView::calcBoundingRect()
{
LLRect local_bounding_rect = LLRect::null;
- child_list_const_iter_t child_it;
- for ( child_it = mChildList.begin(); child_it != mChildList.end(); ++child_it)
+ BOOST_FOREACH(LLView* childp, mChildList)
{
- LLView* childp = *child_it;
// ignore invisible and "top" children when calculating bounding rect
// such as combobox popups
if (!childp->getVisible() || childp == gFocusMgr.getTopCtrl())
@@ -1693,11 +1485,9 @@ LLView* LLView::findChildView(const std::string& name, BOOL recurse) const
//richard: should we allow empty names?
//if(name.empty())
// return NULL;
- child_list_const_iter_t child_it;
// Look for direct children *first*
- for ( child_it = mChildList.begin(); child_it != mChildList.end(); ++child_it)
+ BOOST_FOREACH(LLView* childp, mChildList)
{
- LLView* childp = *child_it;
llassert(childp);
if (childp->getName() == name)
{
@@ -1707,9 +1497,8 @@ LLView* LLView::findChildView(const std::string& name, BOOL recurse) const
if (recurse)
{
// Look inside each child as well.
- for ( child_it = mChildList.begin(); child_it != mChildList.end(); ++child_it)
+ BOOST_FOREACH(LLView* childp, mChildList)
{
- LLView* childp = *child_it;
llassert(childp);
LLView* viewp = childp->findChildView(name, recurse);
if ( viewp )
@@ -1826,13 +1615,6 @@ LLView* LLView::findNextSibling(LLView* child)
return (next_it != mChildList.end()) ? *next_it : NULL;
}
-void LLView::deleteViewByHandle(LLHandle<LLView> handle)
-{
- LLView* viewp = handle.get();
-
- delete viewp;
-}
-
LLCoordGL getNeededTranslation(const LLRect& input, const LLRect& constraint, BOOL allow_partial_outside)
{
@@ -2850,9 +2632,9 @@ S32 LLView::notifyParent(const LLSD& info)
bool LLView::notifyChildren(const LLSD& info)
{
bool ret = false;
- for ( child_list_iter_t child_it = mChildList.begin(); child_it != mChildList.end(); ++child_it)
+ BOOST_FOREACH(LLView* childp, mChildList)
{
- ret |= (*child_it)->notifyChildren(info);
+ ret = ret || childp->notifyChildren(info);
}
return ret;
}
@@ -2872,3 +2654,24 @@ const LLViewDrawContext& LLViewDrawContext::getCurrentContext()
return *sDrawContextStack.back();
}
+
+LLSD LLView::getInfo(void)
+{
+ LLSD info;
+ addInfo(info);
+ return info;
+}
+
+void LLView::addInfo(LLSD & info)
+{
+ info["path"] = getPathname();
+ info["class"] = typeid(*this).name();
+ info["visible"] = getVisible();
+ info["visible_chain"] = isInVisibleChain();
+ info["enabled"] = getEnabled();
+ info["enabled_chain"] = isInEnabledChain();
+ info["available"] = isAvailable();
+ LLRect rect(calcScreenRect());
+ info["rect"] = LLSDMap("left", rect.mLeft)("top", rect.mTop)
+ ("right", rect.mRight)("bottom", rect.mBottom);
+}
diff --git a/indra/llui/llview.h b/indra/llui/llview.h
index 594a5eec6b..f1fac5f69c 100644
--- a/indra/llui/llview.h
+++ b/indra/llui/llview.h
@@ -50,6 +50,8 @@
#include "llfocusmgr.h"
#include <list>
+#include <boost/function.hpp>
+#include <boost/noncopyable.hpp>
class LLSD;
@@ -95,13 +97,14 @@ private:
static std::vector<LLViewDrawContext*> sDrawContextStack;
};
-class LLViewWidgetRegistry : public LLChildRegistry<LLViewWidgetRegistry>
-{};
-
-class LLView : public LLMouseHandler, public LLMortician, public LLFocusableElement
+class LLView
+: public LLMouseHandler, // handles mouse events
+ public LLFocusableElement, // handles keyboard events
+ public LLMortician, // lazy deletion
+ public LLHandleProvider<LLView> // passes out weak references to self
{
public:
- struct Follows : public LLInitParam::Choice<Follows>
+ struct Follows : public LLInitParam::ChoiceBlock<Follows>
{
Alternative<std::string> string;
Alternative<U32> flags;
@@ -150,7 +153,8 @@ public:
Params();
};
- typedef LLViewWidgetRegistry child_registry_t;
+ // most widgets are valid children of LLView
+ typedef LLDefaultChildRegistry child_registry_t;
void initFromParams(const LLView::Params&);
@@ -240,7 +244,7 @@ public:
ECursorType getHoverCursor() { return mHoverCursor; }
- const std::string& getToolTip() const { return mToolTipMsg.getString(); }
+ virtual const std::string getToolTip() const { return mToolTipMsg.getString(); }
void sendChildToFront(LLView* child);
void sendChildToBack(LLView* child);
@@ -306,8 +310,6 @@ public:
void popVisible() { setVisible(mLastVisible); }
BOOL getLastVisible() const { return mLastVisible; }
- LLHandle<LLView> getHandle() { mHandle.bind(this); return mHandle; }
-
U32 getFollows() const { return mReshapeFlags; }
BOOL followsLeft() const { return mReshapeFlags & FOLLOWS_LEFT; }
BOOL followsRight() const { return mReshapeFlags & FOLLOWS_RIGHT; }
@@ -431,18 +433,21 @@ public:
/*virtual*/ BOOL handleRightMouseUp(S32 x, S32 y, MASK mask);
/*virtual*/ BOOL handleToolTip(S32 x, S32 y, MASK mask);
- /*virtual*/ std::string getName() const;
+ /*virtual*/ const std::string& getName() const;
/*virtual*/ void onMouseCaptureLost();
/*virtual*/ BOOL hasMouseCapture();
/*virtual*/ void screenPointToLocal(S32 screen_x, S32 screen_y, S32* local_x, S32* local_y) const;
/*virtual*/ void localPointToScreen(S32 local_x, S32 local_y, S32* screen_x, S32* screen_y) const;
- virtual LLView* childFromPoint(S32 x, S32 y);
+ virtual LLView* childFromPoint(S32 x, S32 y, bool recur=false);
// view-specific handlers
virtual void onMouseEnter(S32 x, S32 y, MASK mask);
virtual void onMouseLeave(S32 x, S32 y, MASK mask);
+ std::string getPathname() const;
+ // static method handles NULL pointer too
+ static std::string getPathname(const LLView*);
template <class T> T* findChild(const std::string& name, BOOL recurse = TRUE) const
{
@@ -467,6 +472,20 @@ public:
return dynamic_cast<T*>(widgetp);
}
+ template <class T> T* getParentByType() const
+ {
+ LLView* parent = getParent();
+ while(parent)
+ {
+ if (dynamic_cast<T*>(parent))
+ {
+ return static_cast<T*>(parent);
+ }
+ parent = parent->getParent();
+ }
+ return NULL;
+ }
+
//////////////////////////////////////////////
// statics
//////////////////////////////////////////////
@@ -482,7 +501,6 @@ public:
// return query for iterating over focus roots in tab order
static const LLCtrlQuery & getFocusRootsQuery();
- static void deleteViewByHandle(LLHandle<LLView> handle);
static LLWindow* getWindow(void) { return LLUI::sWindow; }
// Set up params after XML load before calling new(),
@@ -511,11 +529,17 @@ public:
virtual S32 notify(const LLSD& info) { return 0;};
static const LLViewDrawContext& getDrawContext();
+
+ // Returns useful information about this ui widget.
+ LLSD getInfo(void);
protected:
void drawDebugRect();
void drawChild(LLView* childp, S32 x_offset = 0, S32 y_offset = 0, BOOL force_draw = FALSE);
void drawChildren();
+ bool visibleAndContains(S32 local_x, S32 local_Y);
+ bool visibleEnabledAndContains(S32 local_x, S32 local_y);
+ void logMouseEvent();
LLView* childrenHandleKey(KEY key, MASK mask);
LLView* childrenHandleUnicodeChar(llwchar uni_char);
@@ -538,9 +562,24 @@ protected:
LLView* childrenHandleToolTip(S32 x, S32 y, MASK mask);
ECursorType mHoverCursor;
-
+
+ virtual void addInfo(LLSD & info);
private:
+ template <typename METHOD, typename XDATA>
+ LLView* childrenHandleMouseEvent(const METHOD& method, S32 x, S32 y, XDATA extra, bool allow_mouse_block = true);
+
+ template <typename METHOD, typename CHARTYPE>
+ LLView* childrenHandleCharEvent(const std::string& desc, const METHOD& method,
+ CHARTYPE c, MASK mask);
+
+ // adapter to blur distinction between handleKey() and handleUnicodeChar()
+ // for childrenHandleCharEvent()
+ BOOL handleUnicodeCharWithDummyMask(llwchar uni_char, MASK /* dummy */, BOOL from_parent)
+ {
+ return handleUnicodeChar(uni_char, from_parent);
+ }
+
LLView* mParentView;
child_list_t mChildList;
@@ -569,11 +608,12 @@ private:
BOOL mIsFocusRoot;
BOOL mUseBoundingRect; // hit test against bounding rectangle that includes all child elements
- LLRootHandle<LLView> mHandle;
BOOL mLastVisible;
S32 mNextInsertionOrdinal;
+ bool mInDraw;
+
static LLWindow* sWindow; // All root views must know about their window.
typedef std::map<std::string, LLView*> default_widget_map_t;
@@ -582,7 +622,35 @@ private:
LLView& getDefaultWidgetContainer() const;
+ // This allows special mouse-event targeting logic for testing.
+ typedef boost::function<bool(const LLView*, S32 x, S32 y)> DrilldownFunc;
+ static DrilldownFunc sDrilldown;
+
public:
+ // This is the only public accessor to alter sDrilldown. This is not
+ // an accident. The intended usage pattern is like:
+ // {
+ // LLView::TemporaryDrilldownFunc scoped_func(myfunctor);
+ // // ... test with myfunctor ...
+ // } // exiting block restores original LLView::sDrilldown
+ class TemporaryDrilldownFunc: public boost::noncopyable
+ {
+ public:
+ TemporaryDrilldownFunc(const DrilldownFunc& func):
+ mOldDrilldown(sDrilldown)
+ {
+ sDrilldown = func;
+ }
+
+ ~TemporaryDrilldownFunc()
+ {
+ sDrilldown = mOldDrilldown;
+ }
+
+ private:
+ DrilldownFunc mOldDrilldown;
+ };
+
// Depth in view hierarchy during rendering
static S32 sDepth;
diff --git a/indra/llui/llviewinject.cpp b/indra/llui/llviewinject.cpp
new file mode 100644
index 0000000000..46c5839f8e
--- /dev/null
+++ b/indra/llui/llviewinject.cpp
@@ -0,0 +1,49 @@
+/**
+ * @file llviewinject.cpp
+ * @author Nat Goodspeed
+ * @date 2011-08-16
+ * @brief Implementation for llviewinject.
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Copyright (c) 2011, Linden Research, Inc.
+ * $/LicenseInfo$
+ */
+
+// Precompiled header
+#include "linden_common.h"
+// associated header
+#include "llviewinject.h"
+// STL headers
+// std headers
+// external library headers
+// other Linden headers
+
+llview::TargetEvent::TargetEvent(LLView* view)
+{
+ // Walk up the view tree from target LLView to the root (NULL). If
+ // passed NULL, iterate 0 times.
+ for (; view; view = view->getParent())
+ {
+ // At each level, operator() is going to ask: for a particular parent
+ // LLView*, which of its children should I select? So for this view's
+ // parent, select this view.
+ mChildMap[view->getParent()] = view;
+ }
+}
+
+bool llview::TargetEvent::operator()(const LLView* view, S32 /*x*/, S32 /*y*/) const
+{
+ // We are being called to decide whether to direct an incoming mouse event
+ // to this child view. (Normal LLView processing is to check whether the
+ // incoming (x, y) is within the view.) Look up the parent to decide
+ // whether, for that parent, this is the previously-selected child.
+ ChildMap::const_iterator found(mChildMap.find(view->getParent()));
+ // If we're looking at a child whose parent isn't even in the map, never
+ // mind.
+ if (found == mChildMap.end())
+ {
+ return false;
+ }
+ // So, is this the predestined child for this parent?
+ return (view == found->second);
+}
diff --git a/indra/llui/llviewinject.h b/indra/llui/llviewinject.h
new file mode 100644
index 0000000000..0de3d155c4
--- /dev/null
+++ b/indra/llui/llviewinject.h
@@ -0,0 +1,56 @@
+/**
+ * @file llviewinject.h
+ * @author Nat Goodspeed
+ * @date 2011-08-16
+ * @brief Supplemental LLView functionality used for simulating UI events.
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Copyright (c) 2011, Linden Research, Inc.
+ * $/LicenseInfo$
+ */
+
+#if ! defined(LL_LLVIEWINJECT_H)
+#define LL_LLVIEWINJECT_H
+
+#include "llview.h"
+#include <map>
+
+namespace llview
+{
+
+ /**
+ * TargetEvent is a callable with state, specifically intended for use as
+ * an LLView::TemporaryDrilldownFunc. Instantiate it with the desired
+ * target LLView*; pass it to a TemporaryDrilldownFunc instance;
+ * TargetEvent::operator() will then attempt to direct subsequent mouse
+ * events to the desired target LLView*. (This is an "attempt" because
+ * LLView will still balk unless the target LLView and every parent are
+ * visible and enabled.)
+ */
+ class TargetEvent
+ {
+ public:
+ /**
+ * Construct TargetEvent with the desired target LLView*. (See
+ * LLUI::resolvePath() to obtain an LLView* given a string pathname.)
+ * This sets up for operator().
+ */
+ TargetEvent(LLView* view);
+
+ /**
+ * This signature must match LLView::DrilldownFunc. When you install
+ * this TargetEvent instance using LLView::TemporaryDrilldownFunc,
+ * LLView will call this method to decide whether to propagate an
+ * incoming mouse event to the passed child LLView*.
+ */
+ bool operator()(const LLView*, S32 x, S32 y) const;
+
+ private:
+ // For a given parent LLView, identify which child to select.
+ typedef std::map<LLView*, LLView*> ChildMap;
+ ChildMap mChildMap;
+ };
+
+} // llview namespace
+
+#endif /* ! defined(LL_LLVIEWINJECT_H) */
diff --git a/indra/llui/llwindowshade.cpp b/indra/llui/llwindowshade.cpp
index cf76202215..f5c463c961 100644
--- a/indra/llui/llwindowshade.cpp
+++ b/indra/llui/llwindowshade.cpp
@@ -37,10 +37,13 @@
const S32 MIN_NOTIFICATION_AREA_HEIGHT = 30;
const S32 MAX_NOTIFICATION_AREA_HEIGHT = 100;
+static LLDefaultChildRegistry::Register<LLWindowShade> r("window_shade");
+
LLWindowShade::Params::Params()
: bg_image("bg_image"),
modal("modal", false),
text_color("text_color"),
+ shade_color("shade_color"),
can_close("can_close", true)
{
changeDefault(mouse_opaque, false);
@@ -48,7 +51,6 @@ LLWindowShade::Params::Params()
LLWindowShade::LLWindowShade(const LLWindowShade::Params& params)
: LLUICtrl(params),
- mNotification(params.notification),
mModal(params.modal),
mFormHeight(0),
mTextColor(params.text_color)
@@ -72,7 +74,7 @@ void LLWindowShade::initFromParams(const LLWindowShade::Params& params)
addChild(stackp);
LLLayoutPanel::Params panel_p;
- panel_p.rect = LLRect(0, 30, 800, 0);
+ panel_p.rect = LLRect(0, MIN_NOTIFICATION_AREA_HEIGHT, 800, 0);
panel_p.name = "notification_area";
panel_p.visible = false;
panel_p.user_resize = false;
@@ -89,7 +91,7 @@ void LLWindowShade::initFromParams(const LLWindowShade::Params& params)
panel_p.name = "background_area";
panel_p.mouse_opaque = false;
panel_p.background_visible = false;
- panel_p.bg_alpha_color = LLColor4(0.f, 0.f, 0.f, 0.2f);
+ panel_p.bg_alpha_color = params.shade_color;
LLLayoutPanel* dummy_panel = LLUICtrlFactory::create<LLLayoutPanel>(panel_p);
stackp->addChild(dummy_panel);
@@ -107,11 +109,11 @@ void LLWindowShade::initFromParams(const LLWindowShade::Params& params)
LLIconCtrl::Params icon_p;
icon_p.name = "notification_icon";
- icon_p.rect = LLRect(5, 23, 21, 8);
+ icon_p.rect = LLRect(5, 25, 21, 10);
panel->addChild(LLUICtrlFactory::create<LLIconCtrl>(icon_p));
LLTextBox::Params text_p;
- text_p.rect = LLRect(31, 20, panel->getRect().getWidth() - 5, 0);
+ text_p.rect = LLRect(31, 23, panel->getRect().getWidth() - 5, 3);
text_p.follows.flags = FOLLOWS_ALL;
text_p.text_color = mTextColor;
text_p.font = LLFontGL::getFontSansSerifSmall();
@@ -125,41 +127,132 @@ void LLWindowShade::initFromParams(const LLWindowShade::Params& params)
panel_p.auto_resize = false;
panel_p.user_resize = false;
panel_p.name="form_elements";
- panel_p.rect = LLRect(0, 30, 130, 0);
+ panel_p.rect = LLRect(0, MIN_NOTIFICATION_AREA_HEIGHT, 130, 0);
LLLayoutPanel* form_elements_panel = LLUICtrlFactory::create<LLLayoutPanel>(panel_p);
stackp->addChild(form_elements_panel);
- if (params.can_close)
+ panel_p = LLUICtrlFactory::getDefaultParams<LLLayoutPanel>();
+ panel_p.auto_resize = false;
+ panel_p.user_resize = false;
+ panel_p.rect = LLRect(0, MIN_NOTIFICATION_AREA_HEIGHT, 25, 0);
+ panel_p.name = "close_panel";
+ LLLayoutPanel* close_panel = LLUICtrlFactory::create<LLLayoutPanel>(panel_p);
+ stackp->addChild(close_panel);
+
+ LLButton::Params button_p;
+ button_p.name = "close_notification";
+ button_p.rect = LLRect(5, 23, 21, 7);
+ button_p.image_color.control="DkGray_66";
+ button_p.image_unselected.name="Icon_Close_Foreground";
+ button_p.image_selected.name="Icon_Close_Press";
+ button_p.click_callback.function = boost::bind(&LLWindowShade::onCloseNotification, this);
+
+ close_panel->addChild(LLUICtrlFactory::create<LLButton>(button_p));
+
+ close_panel->setVisible(params.can_close);
+}
+
+void LLWindowShade::draw()
+{
+ LLRect message_rect = getChild<LLTextBox>("notification_text")->getTextBoundingRect();
+
+ LLLayoutPanel* notification_area = getChild<LLLayoutPanel>("notification_area");
+
+ notification_area->reshape(notification_area->getRect().getWidth(),
+ llclamp(message_rect.getHeight() + 15,
+ llmax(mFormHeight, MIN_NOTIFICATION_AREA_HEIGHT),
+ MAX_NOTIFICATION_AREA_HEIGHT));
+
+ LLUICtrl::draw();
+
+ while(!mNotifications.empty() && !mNotifications.back()->isActive())
+ {
+ mNotifications.pop_back();
+ // go ahead and hide
+ hide();
+ }
+
+ if (mNotifications.empty())
+ {
+ hide();
+ }
+ else if (notification_area->getVisibleAmount() < 0.01f)
+ {
+ displayLatestNotification();
+ }
+
+ if (!notification_area->getVisible() && (notification_area->getVisibleAmount() < 0.001f))
{
- panel_p = LLUICtrlFactory::getDefaultParams<LLLayoutPanel>();
- panel_p.auto_resize = false;
- panel_p.user_resize = false;
- panel_p.rect = LLRect(0, 30, 25, 0);
- LLLayoutPanel* close_panel = LLUICtrlFactory::create<LLLayoutPanel>(panel_p);
- stackp->addChild(close_panel);
-
- LLButton::Params button_p;
- button_p.name = "close_notification";
- button_p.rect = LLRect(5, 23, 21, 7);
- button_p.image_color.control="DkGray_66";
- button_p.image_unselected.name="Icon_Close_Foreground";
- button_p.image_selected.name="Icon_Close_Press";
- button_p.click_callback.function = boost::bind(&LLWindowShade::onCloseNotification, this);
-
- close_panel->addChild(LLUICtrlFactory::create<LLButton>(button_p));
+ getChildRef<LLLayoutPanel>("background_area").setBackgroundVisible(false);
+ setMouseOpaque(false);
}
+}
+
+void LLWindowShade::hide()
+{
+ getChildRef<LLLayoutPanel>("notification_area").setVisible(false);
+}
+
+void LLWindowShade::onCloseNotification()
+{
+ if (!mNotifications.empty())
+ LLNotifications::instance().cancel(mNotifications.back());
+}
+
+void LLWindowShade::onClickIgnore(LLUICtrl* ctrl)
+{
+ LLNotificationPtr notify = getCurrentNotification();
+ if (!notify) return;
+
+ bool check = ctrl->getValue().asBoolean();
+ if (notify->getForm()->getIgnoreType() == LLNotificationForm::IGNORE_SHOW_AGAIN)
+ {
+ // question was "show again" so invert value to get "ignore"
+ check = !check;
+ }
+ notify->setIgnored(check);
+}
+
+void LLWindowShade::onClickNotificationButton(const std::string& name)
+{
+ LLNotificationPtr notify = getCurrentNotification();
+ if (!notify) return;
- LLSD payload = mNotification->getPayload();
+ mNotificationResponse[name] = true;
+
+ notify->respond(mNotificationResponse);
+}
- LLNotificationFormPtr formp = mNotification->getForm();
+void LLWindowShade::onEnterNotificationText(LLUICtrl* ctrl, const std::string& name)
+{
+ mNotificationResponse[name] = ctrl->getValue().asString();
+}
+
+void LLWindowShade::show(LLNotificationPtr notification)
+{
+ mNotifications.push_back(notification);
+
+ displayLatestNotification();
+}
+
+void LLWindowShade::displayLatestNotification()
+{
+ if (mNotifications.empty()) return;
+
+ LLNotificationPtr notification = mNotifications.back();
+
+ LLSD payload = notification->getPayload();
+
+ LLNotificationFormPtr formp = notification->getForm();
LLLayoutPanel& notification_area = getChildRef<LLLayoutPanel>("notification_area");
- notification_area.getChild<LLUICtrl>("notification_icon")->setValue(mNotification->getIcon());
- notification_area.getChild<LLUICtrl>("notification_text")->setValue(mNotification->getMessage());
- notification_area.getChild<LLUICtrl>("notification_text")->setToolTip(mNotification->getMessage());
+ notification_area.getChild<LLUICtrl>("notification_icon")->setValue(notification->getIcon());
+ notification_area.getChild<LLUICtrl>("notification_text")->setValue(notification->getMessage());
+ notification_area.getChild<LLUICtrl>("notification_text")->setToolTip(notification->getMessage());
LLNotificationForm::EIgnoreType ignore_type = formp->getIgnoreType();
LLLayoutPanel& form_elements = notification_area.getChildRef<LLLayoutPanel>("form_elements");
form_elements.deleteAllChildren();
+ form_elements.reshape(form_elements.getRect().getWidth(), MIN_NOTIFICATION_AREA_HEIGHT);
const S32 FORM_PADDING_HORIZONTAL = 10;
const S32 FORM_PADDING_VERTICAL = 3;
@@ -229,7 +322,7 @@ void LLWindowShade::initFromParams(const LLWindowShade::Params& params)
label_p.v_pad = 5;
LLTextBox* textbox = LLUICtrlFactory::create<LLTextBox>(label_p);
textbox->reshapeToFitText();
- textbox->reshape(textbox->getRect().getWidth(), form_elements.getRect().getHeight() - 2 * FORM_PADDING_VERTICAL);
+ textbox->reshape(textbox->getRect().getWidth(), MIN_NOTIFICATION_AREA_HEIGHT - 2 * FORM_PADDING_VERTICAL);
form_elements.addChild(textbox);
cur_x = textbox->getRect().mRight + FORM_PADDING_HORIZONTAL;
@@ -249,7 +342,7 @@ void LLWindowShade::initFromParams(const LLWindowShade::Params& params)
}
}
- mFormHeight = form_elements.getRect().getHeight() - (cur_y - FORM_PADDING_VERTICAL) + WIDGET_HEIGHT;
+ mFormHeight = form_elements.getRect().getHeight() - (cur_y - WIDGET_HEIGHT - FORM_PADDING_VERTICAL);
form_elements.reshape(form_width, mFormHeight);
form_elements.setMinDim(form_width);
@@ -261,68 +354,39 @@ void LLWindowShade::initFromParams(const LLWindowShade::Params& params)
{
(*it)->translate(0, delta_y);
}
-}
-void LLWindowShade::show()
-{
getChildRef<LLLayoutPanel>("notification_area").setVisible(true);
getChildRef<LLLayoutPanel>("background_area").setBackgroundVisible(mModal);
setMouseOpaque(mModal);
}
-void LLWindowShade::draw()
+void LLWindowShade::setBackgroundImage(LLUIImage* image)
{
- LLRect message_rect = getChild<LLTextBox>("notification_text")->getTextBoundingRect();
-
- LLLayoutPanel* notification_area = getChild<LLLayoutPanel>("notification_area");
-
- notification_area->reshape(notification_area->getRect().getWidth(),
- llclamp(message_rect.getHeight() + 10,
- llmin(mFormHeight, MAX_NOTIFICATION_AREA_HEIGHT),
- MAX_NOTIFICATION_AREA_HEIGHT));
-
- LLUICtrl::draw();
- if (mNotification && !mNotification->isActive())
- {
- hide();
- }
+ getChild<LLLayoutPanel>("notification_area")->setTransparentImage(image);
}
-void LLWindowShade::hide()
+void LLWindowShade::setTextColor(LLColor4 color)
{
- getChildRef<LLLayoutPanel>("notification_area").setVisible(false);
- getChildRef<LLLayoutPanel>("background_area").setBackgroundVisible(false);
-
- setMouseOpaque(false);
+ getChild<LLTextBox>("notification_text")->setColor(color);
}
-void LLWindowShade::onCloseNotification()
+bool LLWindowShade::isShown() const
{
- LLNotifications::instance().cancel(mNotification);
+ return getChildRef<LLLayoutPanel>("notification_area").getVisible();
}
-void LLWindowShade::onClickIgnore(LLUICtrl* ctrl)
+void LLWindowShade::setCanClose(bool can_close)
{
- bool check = ctrl->getValue().asBoolean();
- if (mNotification && mNotification->getForm()->getIgnoreType() == LLNotificationForm::IGNORE_SHOW_AGAIN)
- {
- // question was "show again" so invert value to get "ignore"
- check = !check;
- }
- mNotification->setIgnored(check);
+ getChildView("close_panel")->setVisible(can_close);
}
-void LLWindowShade::onClickNotificationButton(const std::string& name)
+LLNotificationPtr LLWindowShade::getCurrentNotification()
{
- if (!mNotification) return;
-
- mNotificationResponse[name] = true;
-
- mNotification->respond(mNotificationResponse);
+ if (mNotifications.empty())
+ {
+ return LLNotificationPtr();
+ }
+ return mNotifications.back();
}
-void LLWindowShade::onEnterNotificationText(LLUICtrl* ctrl, const std::string& name)
-{
- mNotificationResponse[name] = ctrl->getValue().asString();
-}
diff --git a/indra/llui/llwindowshade.h b/indra/llui/llwindowshade.h
index 09ffc2cd54..6d753d1161 100644
--- a/indra/llui/llwindowshade.h
+++ b/indra/llui/llwindowshade.h
@@ -36,20 +36,28 @@ class LLWindowShade : public LLUICtrl
public:
struct Params : public LLInitParam::Block<Params, LLUICtrl::Params>
{
- Mandatory<LLNotificationPtr> notification;
Optional<LLUIImage*> bg_image;
- Optional<LLUIColor> text_color;
+ Optional<LLUIColor> text_color,
+ shade_color;
Optional<bool> modal,
can_close;
Params();
};
- void show();
+ void show(LLNotificationPtr);
/*virtual*/ void draw();
void hide();
+
+ bool isShown() const;
+
+ void setBackgroundImage(LLUIImage* image);
+ void setTextColor(LLColor4 color);
+ void setCanClose(bool can_close);
private:
+ void displayLatestNotification();
+ LLNotificationPtr getCurrentNotification();
friend class LLUICtrlFactory;
LLWindowShade(const Params& p);
@@ -60,7 +68,7 @@ private:
void onEnterNotificationText(LLUICtrl* ctrl, const std::string& name);
void onClickIgnore(LLUICtrl* ctrl);
- LLNotificationPtr mNotification;
+ std::vector<LLNotificationPtr> mNotifications;
LLSD mNotificationResponse;
bool mModal;
S32 mFormHeight;
diff --git a/indra/llui/llxuiparser.cpp b/indra/llui/llxuiparser.cpp
new file mode 100644
index 0000000000..afc76024d1
--- /dev/null
+++ b/indra/llui/llxuiparser.cpp
@@ -0,0 +1,1756 @@
+/**
+ * @file llxuiparser.cpp
+ * @brief Utility functions for handling XUI structures in XML
+ *
+ * $LicenseInfo:firstyear=2003&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "linden_common.h"
+
+#include "llxuiparser.h"
+
+#include "llxmlnode.h"
+
+#ifdef LL_STANDALONE
+#include <expat.h>
+#else
+#include "expat/expat.h"
+#endif
+
+#include <fstream>
+#include <boost/tokenizer.hpp>
+//#include <boost/spirit/include/qi.hpp>
+#include <boost/spirit/include/classic_core.hpp>
+
+#include "lluicolor.h"
+
+using namespace BOOST_SPIRIT_CLASSIC_NS;
+
+const S32 MAX_STRING_ATTRIBUTE_SIZE = 40;
+
+static LLInitParam::Parser::parser_read_func_map_t sXSDReadFuncs;
+static LLInitParam::Parser::parser_write_func_map_t sXSDWriteFuncs;
+static LLInitParam::Parser::parser_inspect_func_map_t sXSDInspectFuncs;
+
+static LLInitParam::Parser::parser_read_func_map_t sSimpleXUIReadFuncs;
+static LLInitParam::Parser::parser_write_func_map_t sSimpleXUIWriteFuncs;
+static LLInitParam::Parser::parser_inspect_func_map_t sSimpleXUIInspectFuncs;
+
+const char* NO_VALUE_MARKER = "no_value";
+
+const S32 LINE_NUMBER_HERE = 0;
+
+struct MaxOccursValues : public LLInitParam::TypeValuesHelper<U32, MaxOccursValues>
+{
+ static void declareValues()
+ {
+ declare("unbounded", U32_MAX);
+ }
+};
+
+struct Occurs : public LLInitParam::Block<Occurs>
+{
+ Optional<U32> minOccurs;
+ Optional<U32, MaxOccursValues> maxOccurs;
+
+ Occurs()
+ : minOccurs("minOccurs", 0),
+ maxOccurs("maxOccurs", U32_MAX)
+
+ {}
+};
+
+
+typedef enum
+{
+ USE_REQUIRED,
+ USE_OPTIONAL
+} EUse;
+
+namespace LLInitParam
+{
+ template<>
+ struct TypeValues<EUse> : public TypeValuesHelper<EUse>
+ {
+ static void declareValues()
+ {
+ declare("required", USE_REQUIRED);
+ declare("optional", USE_OPTIONAL);
+ }
+ };
+}
+
+struct Element;
+struct Group;
+struct Choice;
+struct Sequence;
+struct Any;
+
+struct Attribute : public LLInitParam::Block<Attribute>
+{
+ Mandatory<std::string> name;
+ Mandatory<std::string> type;
+ Mandatory<EUse> use;
+
+ Attribute()
+ : name("name"),
+ type("type"),
+ use("use")
+ {}
+};
+
+struct Any : public LLInitParam::Block<Any, Occurs>
+{
+ Optional<std::string> _namespace;
+
+ Any()
+ : _namespace("namespace")
+ {}
+};
+
+struct All : public LLInitParam::Block<All, Occurs>
+{
+ Multiple< Lazy<Element> > elements;
+
+ All()
+ : elements("element")
+ {
+ maxOccurs = 1;
+ }
+};
+
+struct Choice : public LLInitParam::ChoiceBlock<Choice, Occurs>
+{
+ Alternative< Lazy<Element> > element;
+ Alternative< Lazy<Group> > group;
+ Alternative< Lazy<Choice> > choice;
+ Alternative< Lazy<Sequence> > sequence;
+ Alternative< Lazy<Any> > any;
+
+ Choice()
+ : element("element"),
+ group("group"),
+ choice("choice"),
+ sequence("sequence"),
+ any("any")
+ {}
+
+};
+
+struct Sequence : public LLInitParam::ChoiceBlock<Sequence, Occurs>
+{
+ Alternative< Lazy<Element> > element;
+ Alternative< Lazy<Group> > group;
+ Alternative< Lazy<Choice> > choice;
+ Alternative< Lazy<Sequence> > sequence;
+ Alternative< Lazy<Any> > any;
+};
+
+struct GroupContents : public LLInitParam::ChoiceBlock<GroupContents, Occurs>
+{
+ Alternative<All> all;
+ Alternative<Choice> choice;
+ Alternative<Sequence> sequence;
+
+ GroupContents()
+ : all("all"),
+ choice("choice"),
+ sequence("sequence")
+ {}
+};
+
+struct Group : public LLInitParam::Block<Group, GroupContents>
+{
+ Optional<std::string> name,
+ ref;
+
+ Group()
+ : name("name"),
+ ref("ref")
+ {}
+};
+
+struct Restriction : public LLInitParam::Block<Restriction>
+{
+};
+
+struct Extension : public LLInitParam::Block<Extension>
+{
+};
+
+struct SimpleContent : public LLInitParam::ChoiceBlock<SimpleContent>
+{
+ Alternative<Restriction> restriction;
+ Alternative<Extension> extension;
+
+ SimpleContent()
+ : restriction("restriction"),
+ extension("extension")
+ {}
+};
+
+struct SimpleType : public LLInitParam::Block<SimpleType>
+{
+ // TODO
+};
+
+struct ComplexContent : public LLInitParam::Block<ComplexContent, SimpleContent>
+{
+ Optional<bool> mixed;
+
+ ComplexContent()
+ : mixed("mixed", true)
+ {}
+};
+
+struct ComplexTypeContents : public LLInitParam::ChoiceBlock<ComplexTypeContents>
+{
+ Alternative<SimpleContent> simple_content;
+ Alternative<ComplexContent> complex_content;
+ Alternative<Group> group;
+ Alternative<All> all;
+ Alternative<Choice> choice;
+ Alternative<Sequence> sequence;
+
+ ComplexTypeContents()
+ : simple_content("simpleContent"),
+ complex_content("complexContent"),
+ group("group"),
+ all("all"),
+ choice("choice"),
+ sequence("sequence")
+ {}
+};
+
+struct ComplexType : public LLInitParam::Block<ComplexType, ComplexTypeContents>
+{
+ Optional<std::string> name;
+ Optional<bool> mixed;
+
+ Multiple<Attribute> attribute;
+ Multiple< Lazy<Element> > elements;
+
+ ComplexType()
+ : name("name"),
+ attribute("xs:attribute"),
+ elements("xs:element"),
+ mixed("mixed")
+ {
+ }
+};
+
+struct ElementContents : public LLInitParam::ChoiceBlock<ElementContents, Occurs>
+{
+ Alternative<SimpleType> simpleType;
+ Alternative<ComplexType> complexType;
+
+ ElementContents()
+ : simpleType("simpleType"),
+ complexType("complexType")
+ {}
+};
+
+struct Element : public LLInitParam::Block<Element, ElementContents>
+{
+ Optional<std::string> name,
+ ref,
+ type;
+
+ Element()
+ : name("xs:name"),
+ ref("xs:ref"),
+ type("xs:type")
+ {}
+};
+
+struct Schema : public LLInitParam::Block<Schema>
+{
+private:
+ Mandatory<std::string> targetNamespace,
+ xmlns,
+ xs;
+
+public:
+ Optional<std::string> attributeFormDefault,
+ elementFormDefault;
+
+ Mandatory<Element> root_element;
+
+ void setNameSpace(const std::string& ns) {targetNamespace = ns; xmlns = ns;}
+
+ Schema(const std::string& ns = LLStringUtil::null)
+ : attributeFormDefault("attributeFormDefault"),
+ elementFormDefault("elementFormDefault"),
+ xs("xmlns:xs"),
+ targetNamespace("targetNamespace"),
+ xmlns("xmlns"),
+ root_element("xs:element")
+ {
+ attributeFormDefault = "unqualified";
+ elementFormDefault = "qualified";
+ xs = "http://www.w3.org/2001/XMLSchema";
+ if (!ns.empty())
+ {
+ setNameSpace(ns);
+ };
+ }
+
+};
+
+//
+// LLXSDWriter
+//
+LLXSDWriter::LLXSDWriter()
+: Parser(sXSDReadFuncs, sXSDWriteFuncs, sXSDInspectFuncs)
+{
+ registerInspectFunc<bool>(boost::bind(&LLXSDWriter::writeAttribute, this, "xs:boolean", _1, _2, _3, _4));
+ registerInspectFunc<std::string>(boost::bind(&LLXSDWriter::writeAttribute, this, "xs:string", _1, _2, _3, _4));
+ registerInspectFunc<U8>(boost::bind(&LLXSDWriter::writeAttribute, this, "xs:unsignedByte", _1, _2, _3, _4));
+ registerInspectFunc<S8>(boost::bind(&LLXSDWriter::writeAttribute, this, "xs:signedByte", _1, _2, _3, _4));
+ registerInspectFunc<U16>(boost::bind(&LLXSDWriter::writeAttribute, this, "xs:unsignedShort", _1, _2, _3, _4));
+ registerInspectFunc<S16>(boost::bind(&LLXSDWriter::writeAttribute, this, "xs:signedShort", _1, _2, _3, _4));
+ registerInspectFunc<U32>(boost::bind(&LLXSDWriter::writeAttribute, this, "xs:unsignedInt", _1, _2, _3, _4));
+ registerInspectFunc<S32>(boost::bind(&LLXSDWriter::writeAttribute, this, "xs:integer", _1, _2, _3, _4));
+ registerInspectFunc<F32>(boost::bind(&LLXSDWriter::writeAttribute, this, "xs:float", _1, _2, _3, _4));
+ registerInspectFunc<F64>(boost::bind(&LLXSDWriter::writeAttribute, this, "xs:double", _1, _2, _3, _4));
+ registerInspectFunc<LLColor4>(boost::bind(&LLXSDWriter::writeAttribute, this, "xs:string", _1, _2, _3, _4));
+ registerInspectFunc<LLUIColor>(boost::bind(&LLXSDWriter::writeAttribute, this, "xs:string", _1, _2, _3, _4));
+ registerInspectFunc<LLUUID>(boost::bind(&LLXSDWriter::writeAttribute, this, "xs:string", _1, _2, _3, _4));
+ registerInspectFunc<LLSD>(boost::bind(&LLXSDWriter::writeAttribute, this, "xs:string", _1, _2, _3, _4));
+}
+
+void LLXSDWriter::writeXSD(const std::string& type_name, LLXMLNodePtr node, const LLInitParam::BaseBlock& block, const std::string& xml_namespace)
+{
+ Schema schema(xml_namespace);
+
+ schema.root_element.name = type_name;
+ Choice& choice = schema.root_element.complexType.choice;
+
+ choice.minOccurs = 0;
+ choice.maxOccurs = "unbounded";
+
+ mSchemaNode = node;
+ //node->setName("xs:schema");
+ //node->createChild("attributeFormDefault", true)->setStringValue("unqualified");
+ //node->createChild("elementFormDefault", true)->setStringValue("qualified");
+ //node->createChild("targetNamespace", true)->setStringValue(xml_namespace);
+ //node->createChild("xmlns:xs", true)->setStringValue("http://www.w3.org/2001/XMLSchema");
+ //node->createChild("xmlns", true)->setStringValue(xml_namespace);
+
+ //node = node->createChild("xs:complexType", false);
+ //node->createChild("name", true)->setStringValue(type_name);
+ //node->createChild("mixed", true)->setStringValue("true");
+
+ //mAttributeNode = node;
+ //mElementNode = node->createChild("xs:choice", false);
+ //mElementNode->createChild("minOccurs", true)->setStringValue("0");
+ //mElementNode->createChild("maxOccurs", true)->setStringValue("unbounded");
+ block.inspectBlock(*this);
+
+ // duplicate element choices
+ LLXMLNodeList children;
+ mElementNode->getChildren("xs:element", children, FALSE);
+ for (LLXMLNodeList::iterator child_it = children.begin(); child_it != children.end(); ++child_it)
+ {
+ LLXMLNodePtr child_copy = child_it->second->deepCopy();
+ std::string child_name;
+ child_copy->getAttributeString("name", child_name);
+ child_copy->setAttributeString("name", type_name + "." + child_name);
+ mElementNode->addChild(child_copy);
+ }
+
+ LLXMLNodePtr element_declaration_node = mSchemaNode->createChild("xs:element", false);
+ element_declaration_node->createChild("name", true)->setStringValue(type_name);
+ element_declaration_node->createChild("type", true)->setStringValue(type_name);
+}
+
+void LLXSDWriter::writeAttribute(const std::string& type, const Parser::name_stack_t& stack, S32 min_count, S32 max_count, const std::vector<std::string>* possible_values)
+{
+ name_stack_t non_empty_names;
+ std::string attribute_name;
+ for (name_stack_t::const_iterator it = stack.begin();
+ it != stack.end();
+ ++it)
+ {
+ const std::string& name = it->first;
+ if (!name.empty())
+ {
+ non_empty_names.push_back(*it);
+ }
+ }
+
+ for (name_stack_t::const_iterator it = non_empty_names.begin();
+ it != non_empty_names.end();
+ ++it)
+ {
+ if (!attribute_name.empty())
+ {
+ attribute_name += ".";
+ }
+ attribute_name += it->first;
+ }
+
+ // only flag non-nested attributes as mandatory, nested attributes have variant syntax
+ // that can't be properly constrained in XSD
+ // e.g. <foo mandatory.value="bar"/> vs <foo><mandatory value="bar"/></foo>
+ bool attribute_mandatory = min_count == 1 && max_count == 1 && non_empty_names.size() == 1;
+
+ // don't bother supporting "Multiple" params as xml attributes
+ if (max_count <= 1)
+ {
+ // add compound attribute to root node
+ addAttributeToSchema(mAttributeNode, attribute_name, type, attribute_mandatory, possible_values);
+ }
+
+ // now generated nested elements for compound attributes
+ if (non_empty_names.size() > 1 && !attribute_mandatory)
+ {
+ std::string element_name;
+
+ // traverse all but last element, leaving that as an attribute name
+ name_stack_t::const_iterator end_it = non_empty_names.end();
+ end_it--;
+
+ for (name_stack_t::const_iterator it = non_empty_names.begin();
+ it != end_it;
+ ++it)
+ {
+ if (it != non_empty_names.begin())
+ {
+ element_name += ".";
+ }
+ element_name += it->first;
+ }
+
+ std::string short_attribute_name = non_empty_names.back().first;
+
+ LLXMLNodePtr complex_type_node;
+
+ // find existing element node here, starting at tail of child list
+ if (mElementNode->mChildren.notNull())
+ {
+ for(LLXMLNodePtr element = mElementNode->mChildren->tail;
+ element.notNull();
+ element = element->mPrev)
+ {
+ std::string name;
+ if(element->getAttributeString("name", name) && name == element_name)
+ {
+ complex_type_node = element->mChildren->head;
+ break;
+ }
+ }
+ }
+ //create complex_type node
+ //
+ //<xs:element
+ // maxOccurs="1"
+ // minOccurs="0"
+ // name="name">
+ // <xs:complexType>
+ // </xs:complexType>
+ //</xs:element>
+ if(complex_type_node.isNull())
+ {
+ complex_type_node = mElementNode->createChild("xs:element", false);
+
+ complex_type_node->createChild("minOccurs", true)->setIntValue(min_count);
+ complex_type_node->createChild("maxOccurs", true)->setIntValue(max_count);
+ complex_type_node->createChild("name", true)->setStringValue(element_name);
+ complex_type_node = complex_type_node->createChild("xs:complexType", false);
+ }
+
+ addAttributeToSchema(complex_type_node, short_attribute_name, type, false, possible_values);
+ }
+}
+
+void LLXSDWriter::addAttributeToSchema(LLXMLNodePtr type_declaration_node, const std::string& attribute_name, const std::string& type, bool mandatory, const std::vector<std::string>* possible_values)
+{
+ if (!attribute_name.empty())
+ {
+ LLXMLNodePtr new_enum_type_node;
+ if (possible_values != NULL)
+ {
+ // custom attribute type, for example
+ //<xs:simpleType>
+ // <xs:restriction
+ // base="xs:string">
+ // <xs:enumeration
+ // value="a" />
+ // <xs:enumeration
+ // value="b" />
+ // </xs:restriction>
+ // </xs:simpleType>
+ new_enum_type_node = new LLXMLNode("xs:simpleType", false);
+
+ LLXMLNodePtr restriction_node = new_enum_type_node->createChild("xs:restriction", false);
+ restriction_node->createChild("base", true)->setStringValue("xs:string");
+
+ for (std::vector<std::string>::const_iterator it = possible_values->begin();
+ it != possible_values->end();
+ ++it)
+ {
+ LLXMLNodePtr enum_node = restriction_node->createChild("xs:enumeration", false);
+ enum_node->createChild("value", true)->setStringValue(*it);
+ }
+ }
+
+ string_set_t& attributes_written = mAttributesWritten[type_declaration_node];
+
+ string_set_t::iterator found_it = attributes_written.lower_bound(attribute_name);
+
+ // attribute not yet declared
+ if (found_it == attributes_written.end() || attributes_written.key_comp()(attribute_name, *found_it))
+ {
+ attributes_written.insert(found_it, attribute_name);
+
+ LLXMLNodePtr attribute_node = type_declaration_node->createChild("xs:attribute", false);
+
+ // attribute name
+ attribute_node->createChild("name", true)->setStringValue(attribute_name);
+
+ if (new_enum_type_node.notNull())
+ {
+ attribute_node->addChild(new_enum_type_node);
+ }
+ else
+ {
+ // simple attribute type
+ attribute_node->createChild("type", true)->setStringValue(type);
+ }
+
+ // required or optional
+ attribute_node->createChild("use", true)->setStringValue(mandatory ? "required" : "optional");
+ }
+ // attribute exists...handle collision of same name attributes with potentially different types
+ else
+ {
+ LLXMLNodePtr attribute_declaration;
+ if (type_declaration_node.notNull())
+ {
+ for(LLXMLNodePtr node = type_declaration_node->mChildren->tail;
+ node.notNull();
+ node = node->mPrev)
+ {
+ std::string name;
+ if (node->getAttributeString("name", name) && name == attribute_name)
+ {
+ attribute_declaration = node;
+ break;
+ }
+ }
+ }
+
+ bool new_type_is_enum = new_enum_type_node.notNull();
+ bool existing_type_is_enum = !attribute_declaration->hasAttribute("type");
+
+ // either type is enum, revert to string in collision
+ // don't bother to check for enum equivalence
+ if (new_type_is_enum || existing_type_is_enum)
+ {
+ if (attribute_declaration->hasAttribute("type"))
+ {
+ attribute_declaration->setAttributeString("type", "xs:string");
+ }
+ else
+ {
+ attribute_declaration->createChild("type", true)->setStringValue("xs:string");
+ }
+ attribute_declaration->deleteChildren("xs:simpleType");
+ }
+ else
+ {
+ // check for collision of different standard types
+ std::string existing_type;
+ attribute_declaration->getAttributeString("type", existing_type);
+ // if current type is not the same as the new type, revert to strnig
+ if (existing_type != type)
+ {
+ // ...than use most general type, string
+ attribute_declaration->setAttributeString("type", "string");
+ }
+ }
+ }
+ }
+}
+
+//
+// LLXUIXSDWriter
+//
+void LLXUIXSDWriter::writeXSD(const std::string& type_name, const std::string& path, const LLInitParam::BaseBlock& block)
+{
+ std::string file_name(path);
+ file_name += type_name + ".xsd";
+ LLXMLNodePtr root_nodep = new LLXMLNode();
+
+ LLXSDWriter::writeXSD(type_name, root_nodep, block, "http://www.lindenlab.com/xui");
+
+ // add includes for all possible children
+ const std::type_info* type = *LLWidgetTypeRegistry::instance().getValue(type_name);
+ const widget_registry_t* widget_registryp = LLChildRegistryRegistry::instance().getValue(type);
+
+ // add choices for valid children
+ if (widget_registryp)
+ {
+ // add include declarations for all valid children
+ for (widget_registry_t::Registrar::registry_map_t::const_iterator it = widget_registryp->currentRegistrar().beginItems();
+ it != widget_registryp->currentRegistrar().endItems();
+ ++it)
+ {
+ std::string widget_name = it->first;
+ if (widget_name == type_name)
+ {
+ continue;
+ }
+ LLXMLNodePtr nodep = new LLXMLNode("xs:include", false);
+ nodep->createChild("schemaLocation", true)->setStringValue(widget_name + ".xsd");
+
+ // add to front of schema
+ mSchemaNode->addChild(nodep, mSchemaNode);
+ }
+
+ for (widget_registry_t::Registrar::registry_map_t::const_iterator it = widget_registryp->currentRegistrar().beginItems();
+ it != widget_registryp->currentRegistrar().endItems();
+ ++it)
+ {
+ std::string widget_name = it->first;
+ //<xs:element name="widget_name" type="widget_name">
+ LLXMLNodePtr widget_node = mElementNode->createChild("xs:element", false);
+ widget_node->createChild("name", true)->setStringValue(widget_name);
+ widget_node->createChild("type", true)->setStringValue(widget_name);
+ }
+ }
+
+ LLFILE* xsd_file = LLFile::fopen(file_name.c_str(), "w");
+ LLXMLNode::writeHeaderToFile(xsd_file);
+ root_nodep->writeToFile(xsd_file);
+ fclose(xsd_file);
+}
+
+static LLInitParam::Parser::parser_read_func_map_t sXUIReadFuncs;
+static LLInitParam::Parser::parser_write_func_map_t sXUIWriteFuncs;
+static LLInitParam::Parser::parser_inspect_func_map_t sXUIInspectFuncs;
+
+//
+// LLXUIParser
+//
+LLXUIParser::LLXUIParser()
+: Parser(sXUIReadFuncs, sXUIWriteFuncs, sXUIInspectFuncs),
+ mCurReadDepth(0)
+{
+ if (sXUIReadFuncs.empty())
+ {
+ registerParserFuncs<LLInitParam::Flag>(readFlag, writeFlag);
+ registerParserFuncs<bool>(readBoolValue, writeBoolValue);
+ registerParserFuncs<std::string>(readStringValue, writeStringValue);
+ registerParserFuncs<U8>(readU8Value, writeU8Value);
+ registerParserFuncs<S8>(readS8Value, writeS8Value);
+ registerParserFuncs<U16>(readU16Value, writeU16Value);
+ registerParserFuncs<S16>(readS16Value, writeS16Value);
+ registerParserFuncs<U32>(readU32Value, writeU32Value);
+ registerParserFuncs<S32>(readS32Value, writeS32Value);
+ registerParserFuncs<F32>(readF32Value, writeF32Value);
+ registerParserFuncs<F64>(readF64Value, writeF64Value);
+ registerParserFuncs<LLColor4>(readColor4Value, writeColor4Value);
+ registerParserFuncs<LLUIColor>(readUIColorValue, writeUIColorValue);
+ registerParserFuncs<LLUUID>(readUUIDValue, writeUUIDValue);
+ registerParserFuncs<LLSD>(readSDValue, writeSDValue);
+ }
+}
+
+static LLFastTimer::DeclareTimer FTM_PARSE_XUI("XUI Parsing");
+const LLXMLNodePtr DUMMY_NODE = new LLXMLNode();
+
+void LLXUIParser::readXUI(LLXMLNodePtr node, LLInitParam::BaseBlock& block, const std::string& filename, bool silent)
+{
+ LLFastTimer timer(FTM_PARSE_XUI);
+ mNameStack.clear();
+ mRootNodeName = node->getName()->mString;
+ mCurFileName = filename;
+ mCurReadDepth = 0;
+ setParseSilently(silent);
+
+ if (node.isNull())
+ {
+ parserWarning("Invalid node");
+ }
+ else
+ {
+ readXUIImpl(node, block);
+ }
+}
+
+bool LLXUIParser::readXUIImpl(LLXMLNodePtr nodep, LLInitParam::BaseBlock& block)
+{
+ typedef boost::tokenizer<boost::char_separator<char> > tokenizer;
+ boost::char_separator<char> sep(".");
+
+ bool values_parsed = false;
+ bool silent = mCurReadDepth > 0;
+
+ if (nodep->getFirstChild().isNull()
+ && nodep->mAttributes.empty()
+ && nodep->getSanitizedValue().empty())
+ {
+ // empty node, just parse as flag
+ mCurReadNode = DUMMY_NODE;
+ return block.submitValue(mNameStack, *this, silent);
+ }
+
+ // submit attributes for current node
+ values_parsed |= readAttributes(nodep, block);
+
+ // treat text contents of xml node as "value" parameter
+ std::string text_contents = nodep->getSanitizedValue();
+ if (!text_contents.empty())
+ {
+ mCurReadNode = nodep;
+ mNameStack.push_back(std::make_pair(std::string("value"), true));
+ // child nodes are not necessarily valid parameters (could be a child widget)
+ // so don't complain once we've recursed
+ if (!block.submitValue(mNameStack, *this, true))
+ {
+ mNameStack.pop_back();
+ block.submitValue(mNameStack, *this, silent);
+ }
+ else
+ {
+ mNameStack.pop_back();
+ }
+ }
+
+ // then traverse children
+ // child node must start with last name of parent node (our "scope")
+ // for example: "<button><button.param nested_param1="foo"><param.nested_param2 nested_param3="bar"/></button.param></button>"
+ // which equates to the following nesting:
+ // button
+ // param
+ // nested_param1
+ // nested_param2
+ // nested_param3
+ mCurReadDepth++;
+ for(LLXMLNodePtr childp = nodep->getFirstChild(); childp.notNull();)
+ {
+ std::string child_name(childp->getName()->mString);
+ S32 num_tokens_pushed = 0;
+
+ // for non "dotted" child nodes check to see if child node maps to another widget type
+ // and if not, treat as a child element of the current node
+ // e.g. <button><rect left="10"/></button> will interpret <rect> as "button.rect"
+ // since there is no widget named "rect"
+ if (child_name.find(".") == std::string::npos)
+ {
+ mNameStack.push_back(std::make_pair(child_name, true));
+ num_tokens_pushed++;
+ }
+ else
+ {
+ // parse out "dotted" name into individual tokens
+ tokenizer name_tokens(child_name, sep);
+
+ tokenizer::iterator name_token_it = name_tokens.begin();
+ if(name_token_it == name_tokens.end())
+ {
+ childp = childp->getNextSibling();
+ continue;
+ }
+
+ // check for proper nesting
+ if (mNameStack.empty())
+ {
+ if (*name_token_it != mRootNodeName)
+ {
+ childp = childp->getNextSibling();
+ continue;
+ }
+ }
+ else if(mNameStack.back().first != *name_token_it)
+ {
+ childp = childp->getNextSibling();
+ continue;
+ }
+
+ // now ignore first token
+ ++name_token_it;
+
+ // copy remaining tokens on to our running token list
+ for(tokenizer::iterator token_to_push = name_token_it; token_to_push != name_tokens.end(); ++token_to_push)
+ {
+ mNameStack.push_back(std::make_pair(*token_to_push, true));
+ num_tokens_pushed++;
+ }
+ }
+
+ // recurse and visit children XML nodes
+ if(readXUIImpl(childp, block))
+ {
+ // child node successfully parsed, remove from DOM
+
+ values_parsed = true;
+ LLXMLNodePtr node_to_remove = childp;
+ childp = childp->getNextSibling();
+
+ nodep->deleteChild(node_to_remove);
+ }
+ else
+ {
+ childp = childp->getNextSibling();
+ }
+
+ while(num_tokens_pushed-- > 0)
+ {
+ mNameStack.pop_back();
+ }
+ }
+ mCurReadDepth--;
+ return values_parsed;
+}
+
+bool LLXUIParser::readAttributes(LLXMLNodePtr nodep, LLInitParam::BaseBlock& block)
+{
+ typedef boost::tokenizer<boost::char_separator<char> > tokenizer;
+ boost::char_separator<char> sep(".");
+
+ bool any_parsed = false;
+ bool silent = mCurReadDepth > 0;
+
+ for(LLXMLAttribList::const_iterator attribute_it = nodep->mAttributes.begin();
+ attribute_it != nodep->mAttributes.end();
+ ++attribute_it)
+ {
+ S32 num_tokens_pushed = 0;
+ std::string attribute_name(attribute_it->first->mString);
+ mCurReadNode = attribute_it->second;
+
+ tokenizer name_tokens(attribute_name, sep);
+ // copy remaining tokens on to our running token list
+ for(tokenizer::iterator token_to_push = name_tokens.begin(); token_to_push != name_tokens.end(); ++token_to_push)
+ {
+ mNameStack.push_back(std::make_pair(*token_to_push, true));
+ num_tokens_pushed++;
+ }
+
+ // child nodes are not necessarily valid attributes, so don't complain once we've recursed
+ any_parsed |= block.submitValue(mNameStack, *this, silent);
+
+ while(num_tokens_pushed-- > 0)
+ {
+ mNameStack.pop_back();
+ }
+ }
+
+ return any_parsed;
+}
+
+void LLXUIParser::writeXUI(LLXMLNodePtr node, const LLInitParam::BaseBlock &block, const LLInitParam::BaseBlock* diff_block)
+{
+ mWriteRootNode = node;
+ name_stack_t name_stack = Parser::name_stack_t();
+ block.serializeBlock(*this, name_stack, diff_block);
+ mOutNodes.clear();
+}
+
+// go from a stack of names to a specific XML node
+LLXMLNodePtr LLXUIParser::getNode(name_stack_t& stack)
+{
+ LLXMLNodePtr out_node = mWriteRootNode;
+
+ name_stack_t::iterator next_it = stack.begin();
+ for (name_stack_t::iterator it = stack.begin();
+ it != stack.end();
+ it = next_it)
+ {
+ ++next_it;
+ if (it->first.empty())
+ {
+ it->second = false;
+ continue;
+ }
+
+ out_nodes_t::iterator found_it = mOutNodes.find(it->first);
+
+ // node with this name not yet written
+ if (found_it == mOutNodes.end() || it->second)
+ {
+ // make an attribute if we are the last element on the name stack
+ bool is_attribute = next_it == stack.end();
+ LLXMLNodePtr new_node = new LLXMLNode(it->first.c_str(), is_attribute);
+ out_node->addChild(new_node);
+ mOutNodes[it->first] = new_node;
+ out_node = new_node;
+ it->second = false;
+ }
+ else
+ {
+ out_node = found_it->second;
+ }
+ }
+
+ return (out_node == mWriteRootNode ? LLXMLNodePtr(NULL) : out_node);
+}
+
+bool LLXUIParser::readFlag(Parser& parser, void* val_ptr)
+{
+ LLXUIParser& self = static_cast<LLXUIParser&>(parser);
+ return self.mCurReadNode == DUMMY_NODE;
+}
+
+bool LLXUIParser::writeFlag(Parser& parser, const void* val_ptr, name_stack_t& stack)
+{
+ // just create node
+ LLXUIParser& self = static_cast<LLXUIParser&>(parser);
+ LLXMLNodePtr node = self.getNode(stack);
+ return node.notNull();
+}
+
+bool LLXUIParser::readBoolValue(Parser& parser, void* val_ptr)
+{
+ S32 value;
+ LLXUIParser& self = static_cast<LLXUIParser&>(parser);
+ bool success = self.mCurReadNode->getBoolValue(1, &value);
+ *((bool*)val_ptr) = (value != FALSE);
+ return success;
+}
+
+bool LLXUIParser::writeBoolValue(Parser& parser, const void* val_ptr, name_stack_t& stack)
+{
+ LLXUIParser& self = static_cast<LLXUIParser&>(parser);
+ LLXMLNodePtr node = self.getNode(stack);
+ if (node.notNull())
+ {
+ node->setBoolValue(*((bool*)val_ptr));
+ return true;
+ }
+ return false;
+}
+
+bool LLXUIParser::readStringValue(Parser& parser, void* val_ptr)
+{
+ LLXUIParser& self = static_cast<LLXUIParser&>(parser);
+ *((std::string*)val_ptr) = self.mCurReadNode->getSanitizedValue();
+ return true;
+}
+
+bool LLXUIParser::writeStringValue(Parser& parser, const void* val_ptr, name_stack_t& stack)
+{
+ LLXUIParser& self = static_cast<LLXUIParser&>(parser);
+ LLXMLNodePtr node = self.getNode(stack);
+ if (node.notNull())
+ {
+ const std::string* string_val = reinterpret_cast<const std::string*>(val_ptr);
+ if (string_val->find('\n') != std::string::npos
+ || string_val->size() > MAX_STRING_ATTRIBUTE_SIZE)
+ {
+ // don't write strings with newlines into attributes
+ std::string attribute_name = node->getName()->mString;
+ LLXMLNodePtr parent_node = node->mParent;
+ parent_node->deleteChild(node);
+ // write results in text contents of node
+ if (attribute_name == "value")
+ {
+ // "value" is implicit, just write to parent
+ node = parent_node;
+ }
+ else
+ {
+ // create a child that is not an attribute, but with same name
+ node = parent_node->createChild(attribute_name.c_str(), false);
+ }
+ }
+ node->setStringValue(*string_val);
+ return true;
+ }
+ return false;
+}
+
+bool LLXUIParser::readU8Value(Parser& parser, void* val_ptr)
+{
+ LLXUIParser& self = static_cast<LLXUIParser&>(parser);
+ return self.mCurReadNode->getByteValue(1, (U8*)val_ptr);
+}
+
+bool LLXUIParser::writeU8Value(Parser& parser, const void* val_ptr, name_stack_t& stack)
+{
+ LLXUIParser& self = static_cast<LLXUIParser&>(parser);
+ LLXMLNodePtr node = self.getNode(stack);
+ if (node.notNull())
+ {
+ node->setUnsignedValue(*((U8*)val_ptr));
+ return true;
+ }
+ return false;
+}
+
+bool LLXUIParser::readS8Value(Parser& parser, void* val_ptr)
+{
+ LLXUIParser& self = static_cast<LLXUIParser&>(parser);
+ S32 value;
+ if(self.mCurReadNode->getIntValue(1, &value))
+ {
+ *((S8*)val_ptr) = value;
+ return true;
+ }
+ return false;
+}
+
+bool LLXUIParser::writeS8Value(Parser& parser, const void* val_ptr, name_stack_t& stack)
+{
+ LLXUIParser& self = static_cast<LLXUIParser&>(parser);
+ LLXMLNodePtr node = self.getNode(stack);
+ if (node.notNull())
+ {
+ node->setIntValue(*((S8*)val_ptr));
+ return true;
+ }
+ return false;
+}
+
+bool LLXUIParser::readU16Value(Parser& parser, void* val_ptr)
+{
+ LLXUIParser& self = static_cast<LLXUIParser&>(parser);
+ U32 value;
+ if(self.mCurReadNode->getUnsignedValue(1, &value))
+ {
+ *((U16*)val_ptr) = value;
+ return true;
+ }
+ return false;
+}
+
+bool LLXUIParser::writeU16Value(Parser& parser, const void* val_ptr, name_stack_t& stack)
+{
+ LLXUIParser& self = static_cast<LLXUIParser&>(parser);
+ LLXMLNodePtr node = self.getNode(stack);
+ if (node.notNull())
+ {
+ node->setUnsignedValue(*((U16*)val_ptr));
+ return true;
+ }
+ return false;
+}
+
+bool LLXUIParser::readS16Value(Parser& parser, void* val_ptr)
+{
+ LLXUIParser& self = static_cast<LLXUIParser&>(parser);
+ S32 value;
+ if(self.mCurReadNode->getIntValue(1, &value))
+ {
+ *((S16*)val_ptr) = value;
+ return true;
+ }
+ return false;
+}
+
+bool LLXUIParser::writeS16Value(Parser& parser, const void* val_ptr, name_stack_t& stack)
+{
+ LLXUIParser& self = static_cast<LLXUIParser&>(parser);
+ LLXMLNodePtr node = self.getNode(stack);
+ if (node.notNull())
+ {
+ node->setIntValue(*((S16*)val_ptr));
+ return true;
+ }
+ return false;
+}
+
+bool LLXUIParser::readU32Value(Parser& parser, void* val_ptr)
+{
+ LLXUIParser& self = static_cast<LLXUIParser&>(parser);
+ return self.mCurReadNode->getUnsignedValue(1, (U32*)val_ptr);
+}
+
+bool LLXUIParser::writeU32Value(Parser& parser, const void* val_ptr, name_stack_t& stack)
+{
+ LLXUIParser& self = static_cast<LLXUIParser&>(parser);
+ LLXMLNodePtr node = self.getNode(stack);
+ if (node.notNull())
+ {
+ node->setUnsignedValue(*((U32*)val_ptr));
+ return true;
+ }
+ return false;
+}
+
+bool LLXUIParser::readS32Value(Parser& parser, void* val_ptr)
+{
+ LLXUIParser& self = static_cast<LLXUIParser&>(parser);
+ return self.mCurReadNode->getIntValue(1, (S32*)val_ptr);
+}
+
+bool LLXUIParser::writeS32Value(Parser& parser, const void* val_ptr, name_stack_t& stack)
+{
+ LLXUIParser& self = static_cast<LLXUIParser&>(parser);
+ LLXMLNodePtr node = self.getNode(stack);
+ if (node.notNull())
+ {
+ node->setIntValue(*((S32*)val_ptr));
+ return true;
+ }
+ return false;
+}
+
+bool LLXUIParser::readF32Value(Parser& parser, void* val_ptr)
+{
+ LLXUIParser& self = static_cast<LLXUIParser&>(parser);
+ return self.mCurReadNode->getFloatValue(1, (F32*)val_ptr);
+}
+
+bool LLXUIParser::writeF32Value(Parser& parser, const void* val_ptr, name_stack_t& stack)
+{
+ LLXUIParser& self = static_cast<LLXUIParser&>(parser);
+ LLXMLNodePtr node = self.getNode(stack);
+ if (node.notNull())
+ {
+ node->setFloatValue(*((F32*)val_ptr));
+ return true;
+ }
+ return false;
+}
+
+bool LLXUIParser::readF64Value(Parser& parser, void* val_ptr)
+{
+ LLXUIParser& self = static_cast<LLXUIParser&>(parser);
+ return self.mCurReadNode->getDoubleValue(1, (F64*)val_ptr);
+}
+
+bool LLXUIParser::writeF64Value(Parser& parser, const void* val_ptr, name_stack_t& stack)
+{
+ LLXUIParser& self = static_cast<LLXUIParser&>(parser);
+ LLXMLNodePtr node = self.getNode(stack);
+ if (node.notNull())
+ {
+ node->setDoubleValue(*((F64*)val_ptr));
+ return true;
+ }
+ return false;
+}
+
+bool LLXUIParser::readColor4Value(Parser& parser, void* val_ptr)
+{
+ LLXUIParser& self = static_cast<LLXUIParser&>(parser);
+ LLColor4* colorp = (LLColor4*)val_ptr;
+ if(self.mCurReadNode->getFloatValue(4, colorp->mV) >= 3)
+ {
+ return true;
+ }
+
+ return false;
+}
+
+bool LLXUIParser::writeColor4Value(Parser& parser, const void* val_ptr, name_stack_t& stack)
+{
+ LLXUIParser& self = static_cast<LLXUIParser&>(parser);
+ LLXMLNodePtr node = self.getNode(stack);
+ if (node.notNull())
+ {
+ LLColor4 color = *((LLColor4*)val_ptr);
+ node->setFloatValue(4, color.mV);
+ return true;
+ }
+ return false;
+}
+
+bool LLXUIParser::readUIColorValue(Parser& parser, void* val_ptr)
+{
+ LLXUIParser& self = static_cast<LLXUIParser&>(parser);
+ LLUIColor* param = (LLUIColor*)val_ptr;
+ LLColor4 color;
+ bool success = self.mCurReadNode->getFloatValue(4, color.mV) >= 3;
+ if (success)
+ {
+ param->set(color);
+ return true;
+ }
+ return false;
+}
+
+bool LLXUIParser::writeUIColorValue(Parser& parser, const void* val_ptr, name_stack_t& stack)
+{
+ LLXUIParser& self = static_cast<LLXUIParser&>(parser);
+ LLXMLNodePtr node = self.getNode(stack);
+ if (node.notNull())
+ {
+ LLUIColor color = *((LLUIColor*)val_ptr);
+ //RN: don't write out the color that is represented by a function
+ // rely on param block exporting to get the reference to the color settings
+ if (color.isReference()) return false;
+ node->setFloatValue(4, color.get().mV);
+ return true;
+ }
+ return false;
+}
+
+bool LLXUIParser::readUUIDValue(Parser& parser, void* val_ptr)
+{
+ LLXUIParser& self = static_cast<LLXUIParser&>(parser);
+ LLUUID temp_id;
+ // LLUUID::set is destructive, so use temporary value
+ if (temp_id.set(self.mCurReadNode->getSanitizedValue()))
+ {
+ *(LLUUID*)(val_ptr) = temp_id;
+ return true;
+ }
+ return false;
+}
+
+bool LLXUIParser::writeUUIDValue(Parser& parser, const void* val_ptr, name_stack_t& stack)
+{
+ LLXUIParser& self = static_cast<LLXUIParser&>(parser);
+ LLXMLNodePtr node = self.getNode(stack);
+ if (node.notNull())
+ {
+ node->setStringValue(((LLUUID*)val_ptr)->asString());
+ return true;
+ }
+ return false;
+}
+
+bool LLXUIParser::readSDValue(Parser& parser, void* val_ptr)
+{
+ LLXUIParser& self = static_cast<LLXUIParser&>(parser);
+ *((LLSD*)val_ptr) = LLSD(self.mCurReadNode->getSanitizedValue());
+ return true;
+}
+
+bool LLXUIParser::writeSDValue(Parser& parser, const void* val_ptr, name_stack_t& stack)
+{
+ LLXUIParser& self = static_cast<LLXUIParser&>(parser);
+
+ LLXMLNodePtr node = self.getNode(stack);
+ if (node.notNull())
+ {
+ std::string string_val = ((LLSD*)val_ptr)->asString();
+ if (string_val.find('\n') != std::string::npos || string_val.size() > MAX_STRING_ATTRIBUTE_SIZE)
+ {
+ // don't write strings with newlines into attributes
+ std::string attribute_name = node->getName()->mString;
+ LLXMLNodePtr parent_node = node->mParent;
+ parent_node->deleteChild(node);
+ // write results in text contents of node
+ if (attribute_name == "value")
+ {
+ // "value" is implicit, just write to parent
+ node = parent_node;
+ }
+ else
+ {
+ node = parent_node->createChild(attribute_name.c_str(), false);
+ }
+ }
+
+ node->setStringValue(string_val);
+ return true;
+ }
+ return false;
+}
+
+/*virtual*/ std::string LLXUIParser::getCurrentElementName()
+{
+ std::string full_name;
+ for (name_stack_t::iterator it = mNameStack.begin();
+ it != mNameStack.end();
+ ++it)
+ {
+ full_name += it->first + "."; // build up dotted names: "button.param.nestedparam."
+ }
+
+ return full_name;
+}
+
+void LLXUIParser::parserWarning(const std::string& message)
+{
+#ifdef LL_WINDOWS
+ // use Visual Studo friendly formatting of output message for easy access to originating xml
+ llutf16string utf16str = utf8str_to_utf16str(llformat("%s(%d):\t%s", mCurFileName.c_str(), mCurReadNode->getLineNumber(), message.c_str()).c_str());
+ utf16str += '\n';
+ OutputDebugString(utf16str.c_str());
+#else
+ Parser::parserWarning(message);
+#endif
+}
+
+void LLXUIParser::parserError(const std::string& message)
+{
+#ifdef LL_WINDOWS
+ llutf16string utf16str = utf8str_to_utf16str(llformat("%s(%d):\t%s", mCurFileName.c_str(), mCurReadNode->getLineNumber(), message.c_str()).c_str());
+ utf16str += '\n';
+ OutputDebugString(utf16str.c_str());
+#else
+ Parser::parserError(message);
+#endif
+}
+
+
+//
+// LLSimpleXUIParser
+//
+
+struct ScopedFile
+{
+ ScopedFile( const std::string& filename, const char* accessmode )
+ {
+ mFile = LLFile::fopen(filename, accessmode);
+ }
+
+ ~ScopedFile()
+ {
+ fclose(mFile);
+ mFile = NULL;
+ }
+
+ S32 getRemainingBytes()
+ {
+ if (!isOpen()) return 0;
+
+ S32 cur_pos = ftell(mFile);
+ fseek(mFile, 0L, SEEK_END);
+ S32 file_size = ftell(mFile);
+ fseek(mFile, cur_pos, SEEK_SET);
+ return file_size - cur_pos;
+ }
+
+ bool isOpen() { return mFile != NULL; }
+
+ LLFILE* mFile;
+};
+LLSimpleXUIParser::LLSimpleXUIParser(LLSimpleXUIParser::element_start_callback_t element_cb)
+: Parser(sSimpleXUIReadFuncs, sSimpleXUIWriteFuncs, sSimpleXUIInspectFuncs),
+ mCurReadDepth(0),
+ mElementCB(element_cb)
+{
+ if (sSimpleXUIReadFuncs.empty())
+ {
+ registerParserFuncs<LLInitParam::Flag>(readFlag);
+ registerParserFuncs<bool>(readBoolValue);
+ registerParserFuncs<std::string>(readStringValue);
+ registerParserFuncs<U8>(readU8Value);
+ registerParserFuncs<S8>(readS8Value);
+ registerParserFuncs<U16>(readU16Value);
+ registerParserFuncs<S16>(readS16Value);
+ registerParserFuncs<U32>(readU32Value);
+ registerParserFuncs<S32>(readS32Value);
+ registerParserFuncs<F32>(readF32Value);
+ registerParserFuncs<F64>(readF64Value);
+ registerParserFuncs<LLColor4>(readColor4Value);
+ registerParserFuncs<LLUIColor>(readUIColorValue);
+ registerParserFuncs<LLUUID>(readUUIDValue);
+ registerParserFuncs<LLSD>(readSDValue);
+ }
+}
+
+LLSimpleXUIParser::~LLSimpleXUIParser()
+{
+}
+
+
+bool LLSimpleXUIParser::readXUI(const std::string& filename, LLInitParam::BaseBlock& block, bool silent)
+{
+ LLFastTimer timer(FTM_PARSE_XUI);
+
+ mParser = XML_ParserCreate(NULL);
+ XML_SetUserData(mParser, this);
+ XML_SetElementHandler( mParser, startElementHandler, endElementHandler);
+ XML_SetCharacterDataHandler( mParser, characterDataHandler);
+
+ mOutputStack.push_back(std::make_pair(&block, 0));
+ mNameStack.clear();
+ mCurFileName = filename;
+ mCurReadDepth = 0;
+ setParseSilently(silent);
+
+ ScopedFile file(filename, "rb");
+ if( !file.isOpen() )
+ {
+ LL_WARNS("ReadXUI") << "Unable to open file " << filename << LL_ENDL;
+ XML_ParserFree( mParser );
+ return false;
+ }
+
+ S32 bytes_read = 0;
+
+ S32 buffer_size = file.getRemainingBytes();
+ void* buffer = XML_GetBuffer(mParser, buffer_size);
+ if( !buffer )
+ {
+ LL_WARNS("ReadXUI") << "Unable to allocate XML buffer while reading file " << filename << LL_ENDL;
+ XML_ParserFree( mParser );
+ return false;
+ }
+
+ bytes_read = (S32)fread(buffer, 1, buffer_size, file.mFile);
+ if( bytes_read <= 0 )
+ {
+ LL_WARNS("ReadXUI") << "Error while reading file " << filename << LL_ENDL;
+ XML_ParserFree( mParser );
+ return false;
+ }
+
+ mEmptyLeafNode.push_back(false);
+
+ if( !XML_ParseBuffer(mParser, bytes_read, TRUE ) )
+ {
+ LL_WARNS("ReadXUI") << "Error while parsing file " << filename << LL_ENDL;
+ XML_ParserFree( mParser );
+ return false;
+ }
+
+ mEmptyLeafNode.pop_back();
+
+ XML_ParserFree( mParser );
+ return true;
+}
+
+void LLSimpleXUIParser::startElementHandler(void *userData, const char *name, const char **atts)
+{
+ LLSimpleXUIParser* self = reinterpret_cast<LLSimpleXUIParser*>(userData);
+ self->startElement(name, atts);
+}
+
+void LLSimpleXUIParser::endElementHandler(void *userData, const char *name)
+{
+ LLSimpleXUIParser* self = reinterpret_cast<LLSimpleXUIParser*>(userData);
+ self->endElement(name);
+}
+
+void LLSimpleXUIParser::characterDataHandler(void *userData, const char *s, int len)
+{
+ LLSimpleXUIParser* self = reinterpret_cast<LLSimpleXUIParser*>(userData);
+ self->characterData(s, len);
+}
+
+void LLSimpleXUIParser::characterData(const char *s, int len)
+{
+ mTextContents += std::string(s, len);
+}
+
+void LLSimpleXUIParser::startElement(const char *name, const char **atts)
+{
+ processText();
+
+ typedef boost::tokenizer<boost::char_separator<char> > tokenizer;
+ boost::char_separator<char> sep(".");
+
+ if (mElementCB)
+ {
+ LLInitParam::BaseBlock* blockp = mElementCB(*this, name);
+ if (blockp)
+ {
+ mOutputStack.push_back(std::make_pair(blockp, 0));
+ }
+ }
+
+ mOutputStack.back().second++;
+ S32 num_tokens_pushed = 0;
+ std::string child_name(name);
+
+ if (mOutputStack.back().second == 1)
+ { // root node for this block
+ mScope.push_back(child_name);
+ }
+ else
+ { // compound attribute
+ if (child_name.find(".") == std::string::npos)
+ {
+ mNameStack.push_back(std::make_pair(child_name, true));
+ num_tokens_pushed++;
+ mScope.push_back(child_name);
+ }
+ else
+ {
+ // parse out "dotted" name into individual tokens
+ tokenizer name_tokens(child_name, sep);
+
+ tokenizer::iterator name_token_it = name_tokens.begin();
+ if(name_token_it == name_tokens.end())
+ {
+ return;
+ }
+
+ // check for proper nesting
+ if(!mScope.empty() && *name_token_it != mScope.back())
+ {
+ return;
+ }
+
+ // now ignore first token
+ ++name_token_it;
+
+ // copy remaining tokens on to our running token list
+ for(tokenizer::iterator token_to_push = name_token_it; token_to_push != name_tokens.end(); ++token_to_push)
+ {
+ mNameStack.push_back(std::make_pair(*token_to_push, true));
+ num_tokens_pushed++;
+ }
+ mScope.push_back(mNameStack.back().first);
+ }
+ }
+
+ // parent node is not empty
+ mEmptyLeafNode.back() = false;
+ // we are empty if we have no attributes
+ mEmptyLeafNode.push_back(atts[0] == NULL);
+
+ mTokenSizeStack.push_back(num_tokens_pushed);
+ readAttributes(atts);
+
+}
+
+void LLSimpleXUIParser::endElement(const char *name)
+{
+ bool has_text = processText();
+
+ // no text, attributes, or children
+ if (!has_text && mEmptyLeafNode.back())
+ {
+ // submit this as a valueless name (even though there might be text contents we haven't seen yet)
+ mCurAttributeValueBegin = NO_VALUE_MARKER;
+ mOutputStack.back().first->submitValue(mNameStack, *this, mParseSilently);
+ }
+
+ if (--mOutputStack.back().second == 0)
+ {
+ if (mOutputStack.empty())
+ {
+ LL_ERRS("ReadXUI") << "Parameter block output stack popped while empty." << LL_ENDL;
+ }
+ mOutputStack.pop_back();
+ }
+
+ S32 num_tokens_to_pop = mTokenSizeStack.back();
+ mTokenSizeStack.pop_back();
+ while(num_tokens_to_pop-- > 0)
+ {
+ mNameStack.pop_back();
+ }
+ mScope.pop_back();
+ mEmptyLeafNode.pop_back();
+}
+
+bool LLSimpleXUIParser::readAttributes(const char **atts)
+{
+ typedef boost::tokenizer<boost::char_separator<char> > tokenizer;
+ boost::char_separator<char> sep(".");
+
+ bool any_parsed = false;
+ for(S32 i = 0; atts[i] && atts[i+1]; i += 2 )
+ {
+ std::string attribute_name(atts[i]);
+ mCurAttributeValueBegin = atts[i+1];
+
+ S32 num_tokens_pushed = 0;
+ tokenizer name_tokens(attribute_name, sep);
+ // copy remaining tokens on to our running token list
+ for(tokenizer::iterator token_to_push = name_tokens.begin(); token_to_push != name_tokens.end(); ++token_to_push)
+ {
+ mNameStack.push_back(std::make_pair(*token_to_push, true));
+ num_tokens_pushed++;
+ }
+
+ // child nodes are not necessarily valid attributes, so don't complain once we've recursed
+ any_parsed |= mOutputStack.back().first->submitValue(mNameStack, *this, mParseSilently);
+
+ while(num_tokens_pushed-- > 0)
+ {
+ mNameStack.pop_back();
+ }
+ }
+ return any_parsed;
+}
+
+bool LLSimpleXUIParser::processText()
+{
+ if (!mTextContents.empty())
+ {
+ LLStringUtil::trim(mTextContents);
+ if (!mTextContents.empty())
+ {
+ mNameStack.push_back(std::make_pair(std::string("value"), true));
+ mCurAttributeValueBegin = mTextContents.c_str();
+ mOutputStack.back().first->submitValue(mNameStack, *this, mParseSilently);
+ mNameStack.pop_back();
+ }
+ mTextContents.clear();
+ return true;
+ }
+ return false;
+}
+
+/*virtual*/ std::string LLSimpleXUIParser::getCurrentElementName()
+{
+ std::string full_name;
+ for (name_stack_t::iterator it = mNameStack.begin();
+ it != mNameStack.end();
+ ++it)
+ {
+ full_name += it->first + "."; // build up dotted names: "button.param.nestedparam."
+ }
+
+ return full_name;
+}
+
+void LLSimpleXUIParser::parserWarning(const std::string& message)
+{
+#ifdef LL_WINDOWS
+ // use Visual Studo friendly formatting of output message for easy access to originating xml
+ llutf16string utf16str = utf8str_to_utf16str(llformat("%s(%d):\t%s", mCurFileName.c_str(), LINE_NUMBER_HERE, message.c_str()).c_str());
+ utf16str += '\n';
+ OutputDebugString(utf16str.c_str());
+#else
+ Parser::parserWarning(message);
+#endif
+}
+
+void LLSimpleXUIParser::parserError(const std::string& message)
+{
+#ifdef LL_WINDOWS
+ llutf16string utf16str = utf8str_to_utf16str(llformat("%s(%d):\t%s", mCurFileName.c_str(), LINE_NUMBER_HERE, message.c_str()).c_str());
+ utf16str += '\n';
+ OutputDebugString(utf16str.c_str());
+#else
+ Parser::parserError(message);
+#endif
+}
+
+bool LLSimpleXUIParser::readFlag(Parser& parser, void* val_ptr)
+{
+ LLSimpleXUIParser& self = static_cast<LLSimpleXUIParser&>(parser);
+ return self.mCurAttributeValueBegin == NO_VALUE_MARKER;
+}
+
+bool LLSimpleXUIParser::readBoolValue(Parser& parser, void* val_ptr)
+{
+ LLSimpleXUIParser& self = static_cast<LLSimpleXUIParser&>(parser);
+ if (!strcmp(self.mCurAttributeValueBegin, "true"))
+ {
+ *((bool*)val_ptr) = true;
+ return true;
+ }
+ else if (!strcmp(self.mCurAttributeValueBegin, "false"))
+ {
+ *((bool*)val_ptr) = false;
+ return true;
+ }
+
+ return false;
+}
+
+bool LLSimpleXUIParser::readStringValue(Parser& parser, void* val_ptr)
+{
+ LLSimpleXUIParser& self = static_cast<LLSimpleXUIParser&>(parser);
+ *((std::string*)val_ptr) = self.mCurAttributeValueBegin;
+ return true;
+}
+
+bool LLSimpleXUIParser::readU8Value(Parser& parser, void* val_ptr)
+{
+ LLSimpleXUIParser& self = static_cast<LLSimpleXUIParser&>(parser);
+ return parse(self.mCurAttributeValueBegin, uint_p[assign_a(*(U8*)val_ptr)]).full;
+}
+
+bool LLSimpleXUIParser::readS8Value(Parser& parser, void* val_ptr)
+{
+ LLSimpleXUIParser& self = static_cast<LLSimpleXUIParser&>(parser);
+ return parse(self.mCurAttributeValueBegin, int_p[assign_a(*(S8*)val_ptr)]).full;
+}
+
+bool LLSimpleXUIParser::readU16Value(Parser& parser, void* val_ptr)
+{
+ LLSimpleXUIParser& self = static_cast<LLSimpleXUIParser&>(parser);
+ return parse(self.mCurAttributeValueBegin, uint_p[assign_a(*(U16*)val_ptr)]).full;
+}
+
+bool LLSimpleXUIParser::readS16Value(Parser& parser, void* val_ptr)
+{
+ LLSimpleXUIParser& self = static_cast<LLSimpleXUIParser&>(parser);
+ return parse(self.mCurAttributeValueBegin, int_p[assign_a(*(S16*)val_ptr)]).full;
+}
+
+bool LLSimpleXUIParser::readU32Value(Parser& parser, void* val_ptr)
+{
+ LLSimpleXUIParser& self = static_cast<LLSimpleXUIParser&>(parser);
+ return parse(self.mCurAttributeValueBegin, uint_p[assign_a(*(U32*)val_ptr)]).full;
+}
+
+bool LLSimpleXUIParser::readS32Value(Parser& parser, void* val_ptr)
+{
+ LLSimpleXUIParser& self = static_cast<LLSimpleXUIParser&>(parser);
+ return parse(self.mCurAttributeValueBegin, int_p[assign_a(*(S32*)val_ptr)]).full;
+}
+
+bool LLSimpleXUIParser::readF32Value(Parser& parser, void* val_ptr)
+{
+ LLSimpleXUIParser& self = static_cast<LLSimpleXUIParser&>(parser);
+ return parse(self.mCurAttributeValueBegin, real_p[assign_a(*(F32*)val_ptr)]).full;
+}
+
+bool LLSimpleXUIParser::readF64Value(Parser& parser, void* val_ptr)
+{
+ LLSimpleXUIParser& self = static_cast<LLSimpleXUIParser&>(parser);
+ return parse(self.mCurAttributeValueBegin, real_p[assign_a(*(F64*)val_ptr)]).full;
+}
+
+bool LLSimpleXUIParser::readColor4Value(Parser& parser, void* val_ptr)
+{
+ LLSimpleXUIParser& self = static_cast<LLSimpleXUIParser&>(parser);
+ LLColor4 value;
+
+ if (parse(self.mCurAttributeValueBegin, real_p[assign_a(value.mV[0])] >> real_p[assign_a(value.mV[1])] >> real_p[assign_a(value.mV[2])] >> real_p[assign_a(value.mV[3])], space_p).full)
+ {
+ *(LLColor4*)(val_ptr) = value;
+ return true;
+ }
+ return false;
+}
+
+bool LLSimpleXUIParser::readUIColorValue(Parser& parser, void* val_ptr)
+{
+ LLSimpleXUIParser& self = static_cast<LLSimpleXUIParser&>(parser);
+ LLColor4 value;
+ LLUIColor* colorp = (LLUIColor*)val_ptr;
+
+ if (parse(self.mCurAttributeValueBegin, real_p[assign_a(value.mV[0])] >> real_p[assign_a(value.mV[1])] >> real_p[assign_a(value.mV[2])] >> real_p[assign_a(value.mV[3])], space_p).full)
+ {
+ colorp->set(value);
+ return true;
+ }
+ return false;
+}
+
+bool LLSimpleXUIParser::readUUIDValue(Parser& parser, void* val_ptr)
+{
+ LLSimpleXUIParser& self = static_cast<LLSimpleXUIParser&>(parser);
+ LLUUID temp_id;
+ // LLUUID::set is destructive, so use temporary value
+ if (temp_id.set(std::string(self.mCurAttributeValueBegin)))
+ {
+ *(LLUUID*)(val_ptr) = temp_id;
+ return true;
+ }
+ return false;
+}
+
+bool LLSimpleXUIParser::readSDValue(Parser& parser, void* val_ptr)
+{
+ LLSimpleXUIParser& self = static_cast<LLSimpleXUIParser&>(parser);
+ *((LLSD*)val_ptr) = LLSD(self.mCurAttributeValueBegin);
+ return true;
+}
diff --git a/indra/llui/llxuiparser.h b/indra/llui/llxuiparser.h
new file mode 100644
index 0000000000..d7cd256967
--- /dev/null
+++ b/indra/llui/llxuiparser.h
@@ -0,0 +1,242 @@
+/**
+ * @file llxuiparser.h
+ * @brief Utility functions for handling XUI structures in XML
+ *
+ * $LicenseInfo:firstyear=2003&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LLXUIPARSER_H
+#define LLXUIPARSER_H
+
+#include "llinitparam.h"
+#include "llregistry.h"
+#include "llpointer.h"
+
+#include <boost/function.hpp>
+#include <iosfwd>
+#include <stack>
+#include <set>
+
+
+
+class LLView;
+
+
+typedef LLPointer<class LLXMLNode> LLXMLNodePtr;
+
+
+// lookup widget type by name
+class LLWidgetTypeRegistry
+: public LLRegistrySingleton<std::string, const std::type_info*, LLWidgetTypeRegistry>
+{};
+
+
+// global static instance for registering all widget types
+typedef boost::function<LLView* (LLXMLNodePtr node, LLView *parent, LLXMLNodePtr output_node)> LLWidgetCreatorFunc;
+
+typedef LLRegistry<std::string, LLWidgetCreatorFunc> widget_registry_t;
+
+class LLChildRegistryRegistry
+: public LLRegistrySingleton<const std::type_info*, widget_registry_t, LLChildRegistryRegistry>
+{};
+
+
+
+class LLXSDWriter : public LLInitParam::Parser
+{
+ LOG_CLASS(LLXSDWriter);
+public:
+ void writeXSD(const std::string& name, LLXMLNodePtr node, const LLInitParam::BaseBlock& block, const std::string& xml_namespace);
+
+ /*virtual*/ std::string getCurrentElementName() { return LLStringUtil::null; }
+
+ LLXSDWriter();
+
+protected:
+ void writeAttribute(const std::string& type, const Parser::name_stack_t&, S32 min_count, S32 max_count, const std::vector<std::string>* possible_values);
+ void addAttributeToSchema(LLXMLNodePtr nodep, const std::string& attribute_name, const std::string& type, bool mandatory, const std::vector<std::string>* possible_values);
+ LLXMLNodePtr mAttributeNode;
+ LLXMLNodePtr mElementNode;
+ LLXMLNodePtr mSchemaNode;
+
+ typedef std::set<std::string> string_set_t;
+ typedef std::map<LLXMLNodePtr, string_set_t> attributes_map_t;
+ attributes_map_t mAttributesWritten;
+};
+
+
+
+// NOTE: DOES NOT WORK YET
+// should support child widgets for XUI
+class LLXUIXSDWriter : public LLXSDWriter
+{
+public:
+ void writeXSD(const std::string& name, const std::string& path, const LLInitParam::BaseBlock& block);
+};
+
+
+class LLXUIParserImpl;
+
+class LLXUIParser : public LLInitParam::Parser
+{
+LOG_CLASS(LLXUIParser);
+
+public:
+ LLXUIParser();
+ typedef LLInitParam::Parser::name_stack_t name_stack_t;
+
+ /*virtual*/ std::string getCurrentElementName();
+ /*virtual*/ void parserWarning(const std::string& message);
+ /*virtual*/ void parserError(const std::string& message);
+
+ void readXUI(LLXMLNodePtr node, LLInitParam::BaseBlock& block, const std::string& filename = LLStringUtil::null, bool silent=false);
+ void writeXUI(LLXMLNodePtr node, const LLInitParam::BaseBlock& block, const LLInitParam::BaseBlock* diff_block = NULL);
+
+private:
+ bool readXUIImpl(LLXMLNodePtr node, LLInitParam::BaseBlock& block);
+ bool readAttributes(LLXMLNodePtr nodep, LLInitParam::BaseBlock& block);
+
+ //reader helper functions
+ static bool readFlag(Parser& parser, void* val_ptr);
+ static bool readBoolValue(Parser& parser, void* val_ptr);
+ static bool readStringValue(Parser& parser, void* val_ptr);
+ static bool readU8Value(Parser& parser, void* val_ptr);
+ static bool readS8Value(Parser& parser, void* val_ptr);
+ static bool readU16Value(Parser& parser, void* val_ptr);
+ static bool readS16Value(Parser& parser, void* val_ptr);
+ static bool readU32Value(Parser& parser, void* val_ptr);
+ static bool readS32Value(Parser& parser, void* val_ptr);
+ static bool readF32Value(Parser& parser, void* val_ptr);
+ static bool readF64Value(Parser& parser, void* val_ptr);
+ static bool readColor4Value(Parser& parser, void* val_ptr);
+ static bool readUIColorValue(Parser& parser, void* val_ptr);
+ static bool readUUIDValue(Parser& parser, void* val_ptr);
+ static bool readSDValue(Parser& parser, void* val_ptr);
+
+ //writer helper functions
+ static bool writeFlag(Parser& parser, const void* val_ptr, name_stack_t&);
+ static bool writeBoolValue(Parser& parser, const void* val_ptr, name_stack_t&);
+ static bool writeStringValue(Parser& parser, const void* val_ptr, name_stack_t&);
+ static bool writeU8Value(Parser& parser, const void* val_ptr, name_stack_t&);
+ static bool writeS8Value(Parser& parser, const void* val_ptr, name_stack_t&);
+ static bool writeU16Value(Parser& parser, const void* val_ptr, name_stack_t&);
+ static bool writeS16Value(Parser& parser, const void* val_ptr, name_stack_t&);
+ static bool writeU32Value(Parser& parser, const void* val_ptr, name_stack_t&);
+ static bool writeS32Value(Parser& parser, const void* val_ptr, name_stack_t&);
+ static bool writeF32Value(Parser& parser, const void* val_ptr, name_stack_t&);
+ static bool writeF64Value(Parser& parser, const void* val_ptr, name_stack_t&);
+ static bool writeColor4Value(Parser& parser, const void* val_ptr, name_stack_t&);
+ static bool writeUIColorValue(Parser& parser, const void* val_ptr, name_stack_t&);
+ static bool writeUUIDValue(Parser& parser, const void* val_ptr, name_stack_t&);
+ static bool writeSDValue(Parser& parser, const void* val_ptr, name_stack_t&);
+
+ LLXMLNodePtr getNode(name_stack_t& stack);
+
+private:
+ Parser::name_stack_t mNameStack;
+ LLXMLNodePtr mCurReadNode;
+ // Root of the widget XML sub-tree, for example, "line_editor"
+ LLXMLNodePtr mWriteRootNode;
+
+ typedef std::map<std::string, LLXMLNodePtr> out_nodes_t;
+ out_nodes_t mOutNodes;
+ LLXMLNodePtr mLastWrittenChild;
+ S32 mCurReadDepth;
+ std::string mCurFileName;
+ std::string mRootNodeName;
+};
+
+// LLSimpleXUIParser is a streamlined SAX-based XUI parser that does not support localization
+// or parsing of a tree of independent param blocks, such as child widgets.
+// Use this for reading non-localized files that only need a single param block as a result.
+//
+// NOTE: In order to support nested block parsing, we need callbacks for start element that
+// push new blocks contexts on the mScope stack.
+// NOTE: To support localization without building a DOM, we need to enforce consistent
+// ordering of child elements from base file to localized diff file. Then we can use a pair
+// of coroutines to perform matching of xml nodes during parsing. Not sure if the overhead
+// of coroutines would offset the gain from SAX parsing
+class LLSimpleXUIParserImpl;
+
+class LLSimpleXUIParser : public LLInitParam::Parser
+{
+LOG_CLASS(LLSimpleXUIParser);
+public:
+ typedef LLInitParam::Parser::name_stack_t name_stack_t;
+ typedef LLInitParam::BaseBlock* (*element_start_callback_t)(LLSimpleXUIParser&, const char* block_name);
+
+ LLSimpleXUIParser(element_start_callback_t element_cb = NULL);
+ virtual ~LLSimpleXUIParser();
+
+ /*virtual*/ std::string getCurrentElementName();
+ /*virtual*/ void parserWarning(const std::string& message);
+ /*virtual*/ void parserError(const std::string& message);
+
+ bool readXUI(const std::string& filename, LLInitParam::BaseBlock& block, bool silent=false);
+
+
+private:
+ //reader helper functions
+ static bool readFlag(Parser&, void* val_ptr);
+ static bool readBoolValue(Parser&, void* val_ptr);
+ static bool readStringValue(Parser&, void* val_ptr);
+ static bool readU8Value(Parser&, void* val_ptr);
+ static bool readS8Value(Parser&, void* val_ptr);
+ static bool readU16Value(Parser&, void* val_ptr);
+ static bool readS16Value(Parser&, void* val_ptr);
+ static bool readU32Value(Parser&, void* val_ptr);
+ static bool readS32Value(Parser&, void* val_ptr);
+ static bool readF32Value(Parser&, void* val_ptr);
+ static bool readF64Value(Parser&, void* val_ptr);
+ static bool readColor4Value(Parser&, void* val_ptr);
+ static bool readUIColorValue(Parser&, void* val_ptr);
+ static bool readUUIDValue(Parser&, void* val_ptr);
+ static bool readSDValue(Parser&, void* val_ptr);
+
+private:
+ static void startElementHandler(void *userData, const char *name, const char **atts);
+ static void endElementHandler(void *userData, const char *name);
+ static void characterDataHandler(void *userData, const char *s, int len);
+
+ void startElement(const char *name, const char **atts);
+ void endElement(const char *name);
+ void characterData(const char *s, int len);
+ bool readAttributes(const char **atts);
+ bool processText();
+
+ Parser::name_stack_t mNameStack;
+ struct XML_ParserStruct* mParser;
+ LLXMLNodePtr mLastWrittenChild;
+ S32 mCurReadDepth;
+ std::string mCurFileName;
+ std::string mTextContents;
+ const char* mCurAttributeValueBegin;
+ std::vector<S32> mTokenSizeStack;
+ std::vector<std::string> mScope;
+ std::vector<bool> mEmptyLeafNode;
+ element_start_callback_t mElementCB;
+
+ std::vector<std::pair<LLInitParam::BaseBlock*, S32> > mOutputStack;
+};
+
+
+#endif //LLXUIPARSER_H
diff --git a/indra/llui/tests/llurlentry_stub.cpp b/indra/llui/tests/llurlentry_stub.cpp
index d522123260..cb3b7abb14 100644
--- a/indra/llui/tests/llurlentry_stub.cpp
+++ b/indra/llui/tests/llurlentry_stub.cpp
@@ -105,31 +105,6 @@ LLStyle::Params::Params()
namespace LLInitParam
{
- BaseBlock::BaseBlock() {}
- BaseBlock::~BaseBlock() {}
- Param::Param(BaseBlock* enclosing_block)
- : mIsProvided(false)
- {
- const U8* my_addr = reinterpret_cast<const U8*>(this);
- const U8* block_addr = reinterpret_cast<const U8*>(enclosing_block);
- mEnclosingBlockOffset = (U16)(my_addr - block_addr);
- }
- void BaseBlock::paramChanged(const Param& last_param, bool user_provided) {}
-
- void BaseBlock::addParam(BlockDescriptor& block_data, const ParamDescriptorPtr in_param, const char* char_name){}
- void BaseBlock::addSynonym(Param& param, const std::string& synonym) {}
- param_handle_t BaseBlock::getHandleFromParam(const Param* param) const {return 0;}
-
- void BaseBlock::init(BlockDescriptor& descriptor, BlockDescriptor& base_descriptor, size_t block_size)
- {
- descriptor.mCurrentBlockPtr = this;
- }
- bool BaseBlock::deserializeBlock(Parser& p, Parser::name_stack_range_t name_stack, S32 generation){ return true; }
- void BaseBlock::serializeBlock(Parser& parser, Parser::name_stack_t name_stack, const LLInitParam::BaseBlock* diff_block) const {}
- bool BaseBlock::inspectBlock(Parser& parser, Parser::name_stack_t name_stack, S32 min_value, S32 max_value) const { return true; }
- bool BaseBlock::mergeBlock(BlockDescriptor& block_data, const BaseBlock& other, bool overwrite) { return true; }
- bool BaseBlock::validateBlock(bool emit_errors) const { return true; }
-
ParamValue<LLUIColor, TypeValues<LLUIColor> >::ParamValue(const LLUIColor& color)
: super_t(color)
{}
diff --git a/indra/llui/tests/llurlentry_test.cpp b/indra/llui/tests/llurlentry_test.cpp
index 2f814f4200..8f0a48018f 100644
--- a/indra/llui/tests/llurlentry_test.cpp
+++ b/indra/llui/tests/llurlentry_test.cpp
@@ -70,22 +70,6 @@ S32 LLUIImage::getHeight() const
return 0;
}
-namespace LLInitParam
-{
- S32 Parser::sNextParseGeneration = 0;
- BlockDescriptor::BlockDescriptor() {}
- ParamDescriptor::ParamDescriptor(param_handle_t p,
- merge_func_t merge_func,
- deserialize_func_t deserialize_func,
- serialize_func_t serialize_func,
- validation_func_t validation_func,
- inspect_func_t inspect_func,
- S32 min_count,
- S32 max_count){}
- ParamDescriptor::~ParamDescriptor() {}
-
-}
-
namespace tut
{
struct LLUrlEntryData
diff --git a/indra/llui/tests/llurlmatch_test.cpp b/indra/llui/tests/llurlmatch_test.cpp
index fb6a2eabf1..963473c92a 100644
--- a/indra/llui/tests/llurlmatch_test.cpp
+++ b/indra/llui/tests/llurlmatch_test.cpp
@@ -63,47 +63,6 @@ S32 LLUIImage::getHeight() const
namespace LLInitParam
{
- BaseBlock::BaseBlock() {}
- BaseBlock::~BaseBlock() {}
-
- S32 Parser::sNextParseGeneration = 0;
-
- BlockDescriptor::BlockDescriptor() {}
- ParamDescriptor::ParamDescriptor(param_handle_t p,
- merge_func_t merge_func,
- deserialize_func_t deserialize_func,
- serialize_func_t serialize_func,
- validation_func_t validation_func,
- inspect_func_t inspect_func,
- S32 min_count,
- S32 max_count){}
- ParamDescriptor::~ParamDescriptor() {}
-
- void BaseBlock::paramChanged(const Param& last_param, bool user_provided) {}
-
- void BaseBlock::addParam(BlockDescriptor& block_data, const ParamDescriptorPtr in_param, const char* char_name){}
- param_handle_t BaseBlock::getHandleFromParam(const Param* param) const {return 0;}
- void BaseBlock::addSynonym(Param& param, const std::string& synonym) {}
-
- void BaseBlock::init(BlockDescriptor& descriptor, BlockDescriptor& base_descriptor, size_t block_size)
- {
- descriptor.mCurrentBlockPtr = this;
- }
-
- Param::Param(BaseBlock* enclosing_block)
- : mIsProvided(false)
- {
- const U8* my_addr = reinterpret_cast<const U8*>(this);
- const U8* block_addr = reinterpret_cast<const U8*>(enclosing_block);
- mEnclosingBlockOffset = 0x7FFFffff & ((U32)(my_addr - block_addr));
- }
-
- bool BaseBlock::deserializeBlock(Parser& p, Parser::name_stack_range_t name_stack, S32 generation){ return true; }
- void BaseBlock::serializeBlock(Parser& parser, Parser::name_stack_t name_stack, const LLInitParam::BaseBlock* diff_block) const {}
- bool BaseBlock::inspectBlock(Parser& parser, Parser::name_stack_t name_stack, S32 min_count, S32 max_count) const { return true; }
- bool BaseBlock::mergeBlock(BlockDescriptor& block_data, const BaseBlock& other, bool overwrite) { return true; }
- bool BaseBlock::validateBlock(bool emit_errors) const { return true; }
-
ParamValue<LLUIColor, TypeValues<LLUIColor> >::ParamValue(const LLUIColor& color)
: super_t(color)
{}
diff --git a/indra/llvfs/lllfsthread.cpp b/indra/llvfs/lllfsthread.cpp
index bf49b9668e..3d3ed9f6d4 100644
--- a/indra/llvfs/lllfsthread.cpp
+++ b/indra/llvfs/lllfsthread.cpp
@@ -67,6 +67,10 @@ LLLFSThread::LLLFSThread(bool threaded) :
LLQueuedThread("LFS", threaded),
mPriorityCounter(PRIORITY_LOWBITS)
{
+ if(!mLocalAPRFilePoolp)
+ {
+ mLocalAPRFilePoolp = new LLVolatileAPRPool() ;
+ }
}
LLLFSThread::~LLLFSThread()
@@ -178,7 +182,8 @@ bool LLLFSThread::Request::processRequest()
if (mOperation == FILE_READ)
{
llassert(mOffset >= 0);
- LLAPRFile infile(mFileName, LL_APR_RB);
+ LLAPRFile infile ; // auto-closes
+ infile.open(mFileName, LL_APR_RB, mThread->getLocalAPRFilePool());
if (!infile.getFileHandle())
{
llwarns << "LLLFS: Unable to read file: " << mFileName << llendl;
@@ -200,7 +205,8 @@ bool LLLFSThread::Request::processRequest()
apr_int32_t flags = APR_CREATE|APR_WRITE|APR_BINARY;
if (mOffset < 0)
flags |= APR_APPEND;
- LLAPRFile outfile(mFileName, flags);
+ LLAPRFile outfile ; // auto-closes
+ outfile.open(mFileName, flags, mThread->getLocalAPRFilePool());
if (!outfile.getFileHandle())
{
llwarns << "LLLFS: Unable to write file: " << mFileName << llendl;
diff --git a/indra/llvfs/llvfs.cpp b/indra/llvfs/llvfs.cpp
index ade19f8103..82c926620a 100644
--- a/indra/llvfs/llvfs.cpp
+++ b/indra/llvfs/llvfs.cpp
@@ -234,7 +234,7 @@ LLVFS::LLVFS(const std::string& index_filename, const std::string& data_filename
mDataFP(NULL),
mIndexFP(NULL)
{
- mDataMutex = new LLMutex;
+ mDataMutex = new LLMutex(0);
S32 i;
for (i = 0; i < VFSLOCK_COUNT; i++)
@@ -2098,7 +2098,8 @@ void LLVFS::dumpFiles()
std::string filename = id.asString() + extension;
llinfos << " Writing " << filename << llendl;
- LLAPRFile outfile(filename, LL_APR_WB);
+ LLAPRFile outfile;
+ outfile.open(filename, LL_APR_WB);
outfile.write(&buffer[0], size);
outfile.close();
diff --git a/indra/llwindow/CMakeLists.txt b/indra/llwindow/CMakeLists.txt
index 3d89867bc1..341bddfffd 100644
--- a/indra/llwindow/CMakeLists.txt
+++ b/indra/llwindow/CMakeLists.txt
@@ -38,7 +38,6 @@ set(llwindow_SOURCE_FILES
llkeyboardheadless.cpp
llwindowheadless.cpp
llwindowcallbacks.cpp
- llwindowlistener.cpp
)
set(llwindow_HEADER_FILES
@@ -48,7 +47,6 @@ set(llwindow_HEADER_FILES
llkeyboardheadless.h
llwindowheadless.h
llwindowcallbacks.h
- llwindowlistener.h
)
set(viewer_SOURCE_FILES
diff --git a/indra/llwindow/llmousehandler.h b/indra/llwindow/llmousehandler.h
index bbbc3d4406..d825a3424c 100644
--- a/indra/llwindow/llmousehandler.h
+++ b/indra/llwindow/llmousehandler.h
@@ -65,7 +65,7 @@ public:
virtual BOOL handleHover(S32 x, S32 y, MASK mask) = 0;
virtual BOOL handleScrollWheel(S32 x, S32 y, S32 clicks) = 0;
virtual BOOL handleToolTip(S32 x, S32 y, MASK mask) = 0;
- virtual std::string getName() const = 0;
+ virtual const std::string& getName() const = 0;
virtual void onMouseCaptureLost() = 0;
diff --git a/indra/llwindow/llwindow.cpp b/indra/llwindow/llwindow.cpp
index 71a5df910d..2e9e31bfea 100644
--- a/indra/llwindow/llwindow.cpp
+++ b/indra/llwindow/llwindow.cpp
@@ -41,8 +41,6 @@
#include "llkeyboard.h"
#include "linked_lists.h"
#include "llwindowcallbacks.h"
-#include "llwindowlistener.h"
-#include <boost/lambda/core.hpp>
//
@@ -110,25 +108,21 @@ LLWindow::LLWindow(LLWindowCallbacks* callbacks, BOOL fullscreen, U32 flags)
mSupportedResolutions(NULL),
mNumSupportedResolutions(0),
mCurrentCursor(UI_CURSOR_ARROW),
+ mNextCursor(UI_CURSOR_ARROW),
mCursorHidden(FALSE),
mBusyCount(0),
mIsMouseClipping(FALSE),
+ mMinWindowWidth(0),
+ mMinWindowHeight(0),
mSwapMethod(SWAP_METHOD_UNDEFINED),
mHideCursorPermanent(FALSE),
mFlags(flags),
mHighSurrogate(0)
{
- // gKeyboard is still NULL, so it doesn't do LLWindowListener any good to
- // pass its value right now. Instead, pass it a nullary function that
- // will, when we later need it, return the value of gKeyboard.
- // boost::lambda::var() constructs such a functor on the fly.
- mListener = new LLWindowListener(callbacks, boost::lambda::var(gKeyboard));
}
LLWindow::~LLWindow()
{
- delete mListener;
- mListener = NULL;
}
//virtual
@@ -188,6 +182,36 @@ void *LLWindow::getMediaWindow()
return getPlatformWindow();
}
+BOOL LLWindow::setSize(LLCoordScreen size)
+{
+ if (!getMaximized())
+ {
+ size.mX = llmax(size.mX, mMinWindowWidth);
+ size.mY = llmax(size.mY, mMinWindowHeight);
+ }
+ return setSizeImpl(size);
+}
+
+
+// virtual
+void LLWindow::setMinSize(U32 min_width, U32 min_height, bool enforce_immediately)
+{
+ mMinWindowWidth = min_width;
+ mMinWindowHeight = min_height;
+
+ if (enforce_immediately)
+ {
+ LLCoordScreen cur_size;
+ if (!getMaximized() && getSize(&cur_size))
+ {
+ if (cur_size.mX < mMinWindowWidth || cur_size.mY < mMinWindowHeight)
+ {
+ setSizeImpl(LLCoordScreen(llmin(cur_size.mX, mMinWindowWidth), llmin(cur_size.mY, mMinWindowHeight)));
+ }
+ }
+ }
+}
+
//virtual
void LLWindow::processMiscNativeEvents()
{
diff --git a/indra/llwindow/llwindow.h b/indra/llwindow/llwindow.h
index 6bdc01ae88..cab2d0a8fb 100644
--- a/indra/llwindow/llwindow.h
+++ b/indra/llwindow/llwindow.h
@@ -36,7 +36,6 @@
class LLSplashScreen;
class LLPreeditor;
class LLWindowCallbacks;
-class LLWindowListener;
// Refer to llwindow_test in test/common/llwindow for usage example
@@ -73,7 +72,8 @@ public:
virtual BOOL getSize(LLCoordScreen *size) = 0;
virtual BOOL getSize(LLCoordWindow *size) = 0;
virtual BOOL setPosition(LLCoordScreen position) = 0;
- virtual BOOL setSize(LLCoordScreen size) = 0;
+ BOOL setSize(LLCoordScreen size);
+ virtual void setMinSize(U32 min_width, U32 min_height, bool enforce_immediately = true);
virtual BOOL switchContext(BOOL fullscreen, const LLCoordScreen &size, BOOL disable_vsync, const LLCoordScreen * const posp = NULL) = 0;
virtual BOOL setCursorPosition(LLCoordWindow position) = 0;
virtual BOOL getCursorPosition(LLCoordWindow *position) = 0;
@@ -92,8 +92,9 @@ public:
virtual S32 getBusyCount() const;
// Sets cursor, may set to arrow+hourglass
- virtual void setCursor(ECursorType cursor) = 0;
+ virtual void setCursor(ECursorType cursor) { mNextCursor = cursor; };
virtual ECursorType getCursor() const;
+ virtual void updateCursor() = 0;
virtual void captureMouse() = 0;
virtual void releaseMouse() = 0;
@@ -170,6 +171,8 @@ protected:
// Defaults to true
virtual BOOL canDelete();
+ virtual BOOL setSizeImpl(LLCoordScreen size) = 0;
+
protected:
LLWindowCallbacks* mCallbacks;
@@ -182,6 +185,7 @@ protected:
LLWindowResolution* mSupportedResolutions;
S32 mNumSupportedResolutions;
ECursorType mCurrentCursor;
+ ECursorType mNextCursor;
BOOL mCursorHidden;
S32 mBusyCount; // how deep is the "cursor busy" stack?
BOOL mIsMouseClipping; // Is this window currently clipping the mouse
@@ -189,7 +193,8 @@ protected:
BOOL mHideCursorPermanent;
U32 mFlags;
U16 mHighSurrogate;
- LLWindowListener* mListener;
+ S32 mMinWindowWidth;
+ S32 mMinWindowHeight;
// Handle a UTF-16 encoding unit received from keyboard.
// Converting the series of UTF-16 encoding units to UTF-32 data,
diff --git a/indra/llwindow/llwindowheadless.h b/indra/llwindow/llwindowheadless.h
index ac53e6a86e..d4a778cb85 100644
--- a/indra/llwindow/llwindowheadless.h
+++ b/indra/llwindow/llwindowheadless.h
@@ -46,7 +46,7 @@ public:
/*virtual*/ BOOL getSize(LLCoordScreen *size) {return FALSE;};
/*virtual*/ BOOL getSize(LLCoordWindow *size) {return FALSE;};
/*virtual*/ BOOL setPosition(LLCoordScreen position) {return FALSE;};
- /*virtual*/ BOOL setSize(LLCoordScreen size) {return FALSE;};
+ /*virtual*/ BOOL setSizeImpl(LLCoordScreen size) {return FALSE;};
/*virtual*/ BOOL switchContext(BOOL fullscreen, const LLCoordScreen &size, BOOL disable_vsync, const LLCoordScreen * const posp = NULL) {return FALSE;};
/*virtual*/ BOOL setCursorPosition(LLCoordWindow position) {return FALSE;};
/*virtual*/ BOOL getCursorPosition(LLCoordWindow *position) {return FALSE;};
@@ -55,7 +55,7 @@ public:
/*virtual*/ void showCursorFromMouseMove() {};
/*virtual*/ void hideCursorUntilMouseMove() {};
/*virtual*/ BOOL isCursorHidden() {return FALSE;};
- /*virtual*/ void setCursor(ECursorType cursor) {};
+ /*virtual*/ void updateCursor() {};
//virtual ECursorType getCursor() { return mCurrentCursor; };
/*virtual*/ void captureMouse() {};
/*virtual*/ void releaseMouse() {};
diff --git a/indra/llwindow/llwindowlistener.cpp b/indra/llwindow/llwindowlistener.cpp
deleted file mode 100644
index 91b99d83c6..0000000000
--- a/indra/llwindow/llwindowlistener.cpp
+++ /dev/null
@@ -1,307 +0,0 @@
-/**
- * @file llwindowlistener.cpp
- * @brief EventAPI interface for injecting input into LLWindow
- *
- * $LicenseInfo:firstyear=2001&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-#include "linden_common.h"
-
-#include "llwindowlistener.h"
-
-#include "llcoord.h"
-#include "llkeyboard.h"
-#include "llwindowcallbacks.h"
-#include <map>
-
-LLWindowListener::LLWindowListener(LLWindowCallbacks *window, const KeyboardGetter& kbgetter)
- : LLEventAPI("LLWindow", "Inject input events into the LLWindow instance"),
- mWindow(window),
- mKbGetter(kbgetter)
-{
- std::string keySomething =
- "Given [\"keysym\"], [\"keycode\"] or [\"char\"], inject the specified ";
- std::string keyExplain =
- "(integer keycode values, or keysym \"XXXX\" from any KEY_XXXX, in\n"
- "http://hg.secondlife.com/viewer-development/src/tip/indra/llcommon/indra_constants.h )";
- std::string mask =
- "Specify optional [\"mask\"] as an array containing any of \"CONTROL\", \"ALT\",\n"
- "\"SHIFT\" or \"MAC_CONTROL\"; the corresponding modifier bits will be combined\n"
- "to form the mask used with the event.";
-
- std::string mouseSomething =
- "Given [\"button\"], [\"x\"] and [\"y\"], inject the given mouse ";
- std::string mouseExplain =
- "(button values \"LEFT\", \"MIDDLE\", \"RIGHT\")";
-
- add("keyDown",
- keySomething + "keypress event.\n" + keyExplain + '\n' + mask,
- &LLWindowListener::keyDown);
- add("keyUp",
- keySomething + "key release event.\n" + keyExplain + '\n' + mask,
- &LLWindowListener::keyUp);
- add("mouseDown",
- mouseSomething + "click event.\n" + mouseExplain + '\n' + mask,
- &LLWindowListener::mouseDown);
- add("mouseUp",
- mouseSomething + "release event.\n" + mouseExplain + '\n' + mask,
- &LLWindowListener::mouseUp);
- add("mouseMove",
- std::string("Given [\"x\"] and [\"y\"], inject the given mouse movement event.\n") +
- mask,
- &LLWindowListener::mouseMove);
- add("mouseScroll",
- "Given an integer number of [\"clicks\"], inject the given mouse scroll event.\n"
- "(positive clicks moves downward through typical content)",
- &LLWindowListener::mouseScroll);
-}
-
-template <typename MAPPED>
-class StringLookup
-{
-private:
- std::string mDesc;
- typedef std::map<std::string, MAPPED> Map;
- Map mMap;
-
-public:
- StringLookup(const std::string& desc): mDesc(desc) {}
-
- MAPPED lookup(const typename Map::key_type& key) const
- {
- typename Map::const_iterator found = mMap.find(key);
- if (found == mMap.end())
- {
- LL_WARNS("LLWindowListener") << "Unknown " << mDesc << " '" << key << "'" << LL_ENDL;
- return MAPPED();
- }
- return found->second;
- }
-
-protected:
- void add(const typename Map::key_type& key, const typename Map::mapped_type& value)
- {
- mMap.insert(typename Map::value_type(key, value));
- }
-};
-
-// for WhichKeysym. KeyProxy is like the typedef KEY, except that KeyProxy()
-// (default-constructed) is guaranteed to have the value KEY_NONE.
-class KeyProxy
-{
-public:
- KeyProxy(KEY k): mKey(k) {}
- KeyProxy(): mKey(KEY_NONE) {}
- operator KEY() const { return mKey; }
-
-private:
- KEY mKey;
-};
-
-struct WhichKeysym: public StringLookup<KeyProxy>
-{
- WhichKeysym(): StringLookup<KeyProxy>("keysym")
- {
- add("RETURN", KEY_RETURN);
- add("LEFT", KEY_LEFT);
- add("RIGHT", KEY_RIGHT);
- add("UP", KEY_UP);
- add("DOWN", KEY_DOWN);
- add("ESCAPE", KEY_ESCAPE);
- add("BACKSPACE", KEY_BACKSPACE);
- add("DELETE", KEY_DELETE);
- add("SHIFT", KEY_SHIFT);
- add("CONTROL", KEY_CONTROL);
- add("ALT", KEY_ALT);
- add("HOME", KEY_HOME);
- add("END", KEY_END);
- add("PAGE_UP", KEY_PAGE_UP);
- add("PAGE_DOWN", KEY_PAGE_DOWN);
- add("HYPHEN", KEY_HYPHEN);
- add("EQUALS", KEY_EQUALS);
- add("INSERT", KEY_INSERT);
- add("CAPSLOCK", KEY_CAPSLOCK);
- add("TAB", KEY_TAB);
- add("ADD", KEY_ADD);
- add("SUBTRACT", KEY_SUBTRACT);
- add("MULTIPLY", KEY_MULTIPLY);
- add("DIVIDE", KEY_DIVIDE);
- add("F1", KEY_F1);
- add("F2", KEY_F2);
- add("F3", KEY_F3);
- add("F4", KEY_F4);
- add("F5", KEY_F5);
- add("F6", KEY_F6);
- add("F7", KEY_F7);
- add("F8", KEY_F8);
- add("F9", KEY_F9);
- add("F10", KEY_F10);
- add("F11", KEY_F11);
- add("F12", KEY_F12);
-
- add("PAD_UP", KEY_PAD_UP);
- add("PAD_DOWN", KEY_PAD_DOWN);
- add("PAD_LEFT", KEY_PAD_LEFT);
- add("PAD_RIGHT", KEY_PAD_RIGHT);
- add("PAD_HOME", KEY_PAD_HOME);
- add("PAD_END", KEY_PAD_END);
- add("PAD_PGUP", KEY_PAD_PGUP);
- add("PAD_PGDN", KEY_PAD_PGDN);
- add("PAD_CENTER", KEY_PAD_CENTER); // the 5 in the middle
- add("PAD_INS", KEY_PAD_INS);
- add("PAD_DEL", KEY_PAD_DEL);
- add("PAD_RETURN", KEY_PAD_RETURN);
- add("PAD_ADD", KEY_PAD_ADD); // not used
- add("PAD_SUBTRACT", KEY_PAD_SUBTRACT); // not used
- add("PAD_MULTIPLY", KEY_PAD_MULTIPLY); // not used
- add("PAD_DIVIDE", KEY_PAD_DIVIDE); // not used
-
- add("BUTTON0", KEY_BUTTON0);
- add("BUTTON1", KEY_BUTTON1);
- add("BUTTON2", KEY_BUTTON2);
- add("BUTTON3", KEY_BUTTON3);
- add("BUTTON4", KEY_BUTTON4);
- add("BUTTON5", KEY_BUTTON5);
- add("BUTTON6", KEY_BUTTON6);
- add("BUTTON7", KEY_BUTTON7);
- add("BUTTON8", KEY_BUTTON8);
- add("BUTTON9", KEY_BUTTON9);
- add("BUTTON10", KEY_BUTTON10);
- add("BUTTON11", KEY_BUTTON11);
- add("BUTTON12", KEY_BUTTON12);
- add("BUTTON13", KEY_BUTTON13);
- add("BUTTON14", KEY_BUTTON14);
- add("BUTTON15", KEY_BUTTON15);
- }
-};
-static WhichKeysym keysyms;
-
-struct WhichMask: public StringLookup<MASK>
-{
- WhichMask(): StringLookup<MASK>("shift mask")
- {
- add("NONE", MASK_NONE);
- add("CONTROL", MASK_CONTROL); // Mapped to cmd on Macs
- add("ALT", MASK_ALT);
- add("SHIFT", MASK_SHIFT);
- add("MAC_CONTROL", MASK_MAC_CONTROL); // Un-mapped Ctrl key on Macs, not used on Windows
- }
-};
-static WhichMask masks;
-
-static MASK getMask(const LLSD& event)
-{
- MASK mask(MASK_NONE);
- LLSD masknames(event["mask"]);
- for (LLSD::array_const_iterator ai(masknames.beginArray()), aend(masknames.endArray());
- ai != aend; ++ai)
- {
- mask |= masks.lookup(*ai);
- }
- return mask;
-}
-
-static KEY getKEY(const LLSD& event)
-{
- if (event.has("keysym"))
- {
- return keysyms.lookup(event["keysym"]);
- }
- else if (event.has("keycode"))
- {
- return KEY(event["keycode"].asInteger());
- }
- else
- {
- return KEY(event["char"].asString()[0]);
- }
-}
-
-void LLWindowListener::keyDown(LLSD const & evt)
-{
- mKbGetter()->handleTranslatedKeyDown(getKEY(evt), getMask(evt));
-}
-
-void LLWindowListener::keyUp(LLSD const & evt)
-{
- mKbGetter()->handleTranslatedKeyUp(getKEY(evt), getMask(evt));
-}
-
-// for WhichButton
-typedef BOOL (LLWindowCallbacks::*MouseFunc)(LLWindow *, LLCoordGL, MASK);
-struct Actions
-{
- Actions(const MouseFunc& d, const MouseFunc& u): down(d), up(u), valid(true) {}
- Actions(): valid(false) {}
- MouseFunc down, up;
- bool valid;
-};
-
-struct WhichButton: public StringLookup<Actions>
-{
- WhichButton(): StringLookup<Actions>("mouse button")
- {
- add("LEFT", Actions(&LLWindowCallbacks::handleMouseDown,
- &LLWindowCallbacks::handleMouseUp));
- add("RIGHT", Actions(&LLWindowCallbacks::handleRightMouseDown,
- &LLWindowCallbacks::handleRightMouseUp));
- add("MIDDLE", Actions(&LLWindowCallbacks::handleMiddleMouseDown,
- &LLWindowCallbacks::handleMiddleMouseUp));
- }
-};
-static WhichButton buttons;
-
-static LLCoordGL getPos(const LLSD& event)
-{
- return LLCoordGL(event["x"].asInteger(), event["y"].asInteger());
-}
-
-void LLWindowListener::mouseDown(LLSD const & evt)
-{
- Actions actions(buttons.lookup(evt["button"]));
- if (actions.valid)
- {
- (mWindow->*(actions.down))(NULL, getPos(evt), getMask(evt));
- }
-}
-
-void LLWindowListener::mouseUp(LLSD const & evt)
-{
- Actions actions(buttons.lookup(evt["button"]));
- if (actions.valid)
- {
- (mWindow->*(actions.up))(NULL, getPos(evt), getMask(evt));
- }
-}
-
-void LLWindowListener::mouseMove(LLSD const & evt)
-{
- mWindow->handleMouseMove(NULL, getPos(evt), getMask(evt));
-}
-
-void LLWindowListener::mouseScroll(LLSD const & evt)
-{
- S32 clicks = evt["clicks"].asInteger();
-
- mWindow->handleScrollWheel(NULL, clicks);
-}
-
diff --git a/indra/llwindow/llwindowlistener.h b/indra/llwindow/llwindowlistener.h
deleted file mode 100644
index 74e577ff93..0000000000
--- a/indra/llwindow/llwindowlistener.h
+++ /dev/null
@@ -1,55 +0,0 @@
-/**
- * @file llwindowlistener.h
- * @brief EventAPI interface for injecting input into LLWindow
- *
- * $LicenseInfo:firstyear=2001&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-#ifndef LL_LLWINDOWLISTENER_H
-#define LL_LLWINDOWLISTENER_H
-
-#include "lleventapi.h"
-#include <boost/function.hpp>
-
-class LLKeyboard;
-class LLWindowCallbacks;
-
-class LLWindowListener : public LLEventAPI
-{
-public:
- typedef boost::function<LLKeyboard*()> KeyboardGetter;
- LLWindowListener(LLWindowCallbacks * window, const KeyboardGetter& kbgetter);
-
- void keyDown(LLSD const & evt);
- void keyUp(LLSD const & evt);
- void mouseDown(LLSD const & evt);
- void mouseUp(LLSD const & evt);
- void mouseMove(LLSD const & evt);
- void mouseScroll(LLSD const & evt);
-
-private:
- LLWindowCallbacks * mWindow;
- KeyboardGetter mKbGetter;
-};
-
-
-#endif // LL_LLWINDOWLISTENER_H
diff --git a/indra/llwindow/llwindowmacosx.cpp b/indra/llwindow/llwindowmacosx.cpp
index 4dd11541b9..c952f8bbcf 100644
--- a/indra/llwindow/llwindowmacosx.cpp
+++ b/indra/llwindow/llwindowmacosx.cpp
@@ -1,25 +1,25 @@
-/**
+/**
* @file llwindowmacosx.cpp
* @brief Platform-dependent implementation of llwindow
*
* $LicenseInfo:firstyear=2001&license=viewerlgpl$
* Second Life Viewer Source Code
* Copyright (C) 2010, Linden Research, Inc.
- *
+ *
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation;
* version 2.1 of the License only.
- *
+ *
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
- *
+ *
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
+ *
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
@@ -220,10 +220,10 @@ LLWindowMacOSX::LLWindowMacOSX(LLWindowCallbacks* callbacks,
// Route them to a dummy callback structure until the end of constructor.
LLWindowCallbacks null_callbacks;
mCallbacks = &null_callbacks;
-
+
// Voodoo for calling cocoa from carbon (see llwindowmacosx-objc.mm).
setupCocoa();
-
+
// Initialize the keyboard
gKeyboard = new LLKeyboardMacOSX();
gKeyboard->setCallbacks(callbacks);
@@ -254,10 +254,10 @@ LLWindowMacOSX::LLWindowMacOSX(LLWindowCallbacks* callbacks,
mRawKeyEvent = NULL;
mFSAASamples = fsaa_samples;
mForceRebuild = FALSE;
-
+
// For reasons that aren't clear to me, LLTimers seem to be created in the "started" state.
// Since the started state of this one is used to track whether the NMRec has been installed, it wants to start out in the "stopped" state.
- mBounceTimer.stop();
+ mBounceTimer.stop();
// Get the original aspect ratio of the main device.
mOriginalAspectRatio = (double)CGDisplayPixelsWide(mDisplay) / (double)CGDisplayPixelsHigh(mDisplay);
@@ -270,7 +270,7 @@ LLWindowMacOSX::LLWindowMacOSX(LLWindowCallbacks* callbacks,
mMoveEventCampartorUPP = NewEventComparatorUPP(staticMoveEventComparator);
mGlobalHandlerRef = NULL;
mWindowHandlerRef = NULL;
-
+
mDragOverrideCursor = -1;
// We're not clipping yet
@@ -445,7 +445,7 @@ BOOL LLWindowMacOSX::createContext(int x, int y, int width, int height, int bits
mFullscreenBits = -1;
mFullscreenRefresh = -1;
- std::string error= llformat("Unable to run fullscreen at %d x %d.\nRunning in window.", width, height);
+ std::string error= llformat("Unable to run fullscreen at %d x %d.\nRunning in window.", width, height);
OSMessageBox(error, "Error", OSMB_OK);
}
}
@@ -477,7 +477,7 @@ BOOL LLWindowMacOSX::createContext(int x, int y, int width, int height, int bits
kFirstWindowOfClass,
true,
(long)this);
-
+
if (!mWindow)
{
setupFailure("Window creation error", "Error", OSMB_OK);
@@ -493,7 +493,7 @@ BOOL LLWindowMacOSX::createContext(int x, int y, int width, int height, int bits
InstallStandardEventHandler(GetWindowEventTarget(mWindow));
InstallWindowEventHandler(mWindow, mEventHandlerUPP, GetEventTypeCount (WindowHandlerEventList), WindowHandlerEventList, (void*)this, &mWindowHandlerRef); // add event handler
#if LL_OS_DRAGDROP_ENABLED
- InstallTrackingHandler( dragTrackingHandler, mWindow, (void*)this );
+ InstallTrackingHandler( dragTrackingHandler, mWindow, (void*)this );
InstallReceiveHandler( dragReceiveHandler, mWindow, (void*)this );
#endif // LL_OS_DRAGDROP_ENABLED
}
@@ -790,7 +790,7 @@ BOOL LLWindowMacOSX::createContext(int x, int y, int width, int height, int bits
LL_DEBUGS("GLinit") << "Keeping vertical sync" << LL_ENDL;
frames_per_swap = 1;
}
- aglSetInteger(mContext, AGL_SWAP_INTERVAL, &frames_per_swap);
+ aglSetInteger(mContext, AGL_SWAP_INTERVAL, &frames_per_swap);
//enable multi-threaded OpenGL
if (sUseMultGL)
@@ -803,7 +803,7 @@ BOOL LLWindowMacOSX::createContext(int x, int y, int width, int height, int bits
if (cgl_err != kCGLNoError )
{
LL_DEBUGS("GLInit") << "Multi-threaded OpenGL not available." << LL_ENDL;
- }
+ }
else
{
LL_DEBUGS("GLInit") << "Multi-threaded OpenGL enabled." << LL_ENDL;
@@ -1109,7 +1109,7 @@ BOOL LLWindowMacOSX::maximize()
{
ZoomWindow(mWindow, inContent, true);
}
-
+
return mMaximized;
}
@@ -1164,6 +1164,8 @@ void LLWindowMacOSX::gatherInput()
}
}
+
+ updateCursor();
}
BOOL LLWindowMacOSX::getPosition(LLCoordScreen *position)
@@ -1254,7 +1256,7 @@ BOOL LLWindowMacOSX::setPosition(const LLCoordScreen position)
return TRUE;
}
-BOOL LLWindowMacOSX::setSize(const LLCoordScreen size)
+BOOL LLWindowMacOSX::setSizeImpl(const LLCoordScreen size)
{
if(mWindow)
{
@@ -1266,7 +1268,6 @@ BOOL LLWindowMacOSX::setSize(const LLCoordScreen size)
void LLWindowMacOSX::swapBuffers()
{
- glFinish();
aglSwapBuffers(mContext);
}
@@ -1433,7 +1434,7 @@ static void fixOrigin(void)
GrafPtr port;
Rect portrect;
- ::GetPort(&port);
+ ::GetPort(&port);
::GetPortBounds(port, &portrect);
if((portrect.left != 0) || (portrect.top != 0))
{
@@ -1447,17 +1448,17 @@ BOOL LLWindowMacOSX::getCursorPosition(LLCoordWindow *position)
Point cursor_point;
LLCoordScreen screen_pos;
GrafPtr save;
-
+
if(mWindow == NULL)
return FALSE;
-
+
::GetPort(&save);
::SetPort(GetWindowPort(mWindow));
fixOrigin();
// gets the mouse location in local coordinates
::GetMouse(&cursor_point);
-
+
// lldebugs << "getCursorPosition(): cursor is at " << cursor_point.h << ", " << cursor_point.v << " port origin: " << portrect.left << ", " << portrect.top << llendl;
::SetPort(save);
@@ -1522,7 +1523,7 @@ F32 LLWindowMacOSX::getNativeAspectRatio()
{
// The constructor for this class grabs the aspect ratio of the monitor before doing any resolution
// switching, and stashes it in mOriginalAspectRatio. Here, we just return it.
-
+
if (mOverrideAspectRatio > 0.f)
{
return mOverrideAspectRatio;
@@ -1997,7 +1998,7 @@ OSStatus LLWindowMacOSX::eventHandler (EventHandlerCallRef myHandler, EventRef e
if (mPreeditor
&& (result = GetEventParameter(event, kEventParamTextInputSendFixLen,
typeLongInteger, &param_type, sizeof(fix_len), NULL, &fix_len)) == noErr
- && typeLongInteger == param_type
+ && typeLongInteger == param_type
&& (result = GetEventParameter(event, kEventParamTextInputSendText,
typeUnicodeText, &param_type, 0, &text_len, NULL)) == noErr
&& typeUnicodeText == param_type)
@@ -2017,7 +2018,7 @@ OSStatus LLWindowMacOSX::eventHandler (EventHandlerCallRef myHandler, EventRef e
mPreeditor->markAsPreedit(location, length);
}
mPreeditor->resetPreedit();
-
+
// Receive the text from input method.
U16 *const text = new U16[text_len / sizeof(U16)];
GetEventParameter(event, kEventParamTextInputSendText, typeUnicodeText, NULL, text_len, NULL, text);
@@ -2056,11 +2057,11 @@ OSStatus LLWindowMacOSX::eventHandler (EventHandlerCallRef myHandler, EventRef e
GetEventParameter(event, kEventParamTextInputSendHiliteRng, typeTextRangeArray,
NULL, text_range_array_size, NULL, text_range_array);
- // WARNING: We assume ranges are in ascending order,
+ // WARNING: We assume ranges are in ascending order,
// although the condition is undocumented. It seems
// OK to assume this. I also assumed
// the ranges are contiguous in previous versions, but I
- // have heard a rumore that older versions os ATOK may
+ // have heard a rumore that older versions os ATOK may
// return ranges with some _gap_. I don't know whether
// it is true, but I'm preparing my code for the case.
@@ -2124,7 +2125,7 @@ OSStatus LLWindowMacOSX::eventHandler (EventHandlerCallRef myHandler, EventRef e
}
}
break;
-
+
case kEventTextInputUnicodeForKeyEvent:
{
UInt32 modifiers = 0;
@@ -2133,7 +2134,7 @@ OSStatus LLWindowMacOSX::eventHandler (EventHandlerCallRef myHandler, EventRef e
// First, process the raw event.
{
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)
{
@@ -2142,7 +2143,7 @@ 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;
}
@@ -2173,7 +2174,7 @@ OSStatus LLWindowMacOSX::eventHandler (EventHandlerCallRef myHandler, EventRef e
else
{
MASK mask = LLWindowMacOSX::modifiersToMask(modifiers);
-
+
llassert( actualType == typeUnicodeText );
// The result is a UTF16 buffer. Pass the characters in turn to handleUnicodeChar.
@@ -2199,7 +2200,7 @@ OSStatus LLWindowMacOSX::eventHandler (EventHandlerCallRef myHandler, EventRef e
result = err;
}
break;
-
+
case kEventTextInputOffsetToPos:
{
EventParamType param_type;
@@ -2212,7 +2213,7 @@ OSStatus LLWindowMacOSX::eventHandler (EventHandlerCallRef myHandler, EventRef e
S32 preedit, preedit_length;
mPreeditor->getPreeditRange(&preedit, &preedit_length);
const LLWString & text = mPreeditor->getPreeditString();
-
+
LLCoordGL caret_coord;
LLRect preedit_bounds;
if (0 <= offset
@@ -2226,10 +2227,10 @@ OSStatus LLWindowMacOSX::eventHandler (EventHandlerCallRef myHandler, EventRef e
qd_point.h = caret_base_coord_screen.mX;
qd_point.v = caret_base_coord_screen.mY;
SetEventParameter(event, kEventParamTextInputReplyPoint, typeQDPoint, sizeof(qd_point), &qd_point);
-
+
short line_height = (short) preedit_bounds.getHeight();
SetEventParameter(event, kEventParamTextInputReplyLineHeight, typeShortInteger, sizeof(line_height), &line_height);
-
+
result = noErr;
}
else
@@ -2282,7 +2283,7 @@ OSStatus LLWindowMacOSX::eventHandler (EventHandlerCallRef myHandler, EventRef e
case kEventRawKeyRepeat:
if (gDebugWindowProc)
{
- printf("key down, key code = 0x%08x, char code = 0x%02x (%c), modifiers = 0x%08x\n",
+ printf("key down, key code = 0x%08x, char code = 0x%02x (%c), modifiers = 0x%08x\n",
(unsigned int)keyCode, charCode, (char)charCode, (unsigned int)modifiers);
fflush(stdout);
}
@@ -2293,7 +2294,7 @@ OSStatus LLWindowMacOSX::eventHandler (EventHandlerCallRef myHandler, EventRef e
case kEventRawKeyUp:
if (gDebugWindowProc)
{
- printf("key up, key code = 0x%08x, char code = 0x%02x (%c), modifiers = 0x%08x\n",
+ printf("key up, key code = 0x%08x, char code = 0x%02x (%c), modifiers = 0x%08x\n",
(unsigned int)keyCode, charCode, (char)charCode, (unsigned int)modifiers);
fflush(stdout);
}
@@ -2351,7 +2352,7 @@ OSStatus LLWindowMacOSX::eventHandler (EventHandlerCallRef myHandler, EventRef e
}
// When the state of the 'Fn' key (the one that changes some of the mappings on a powerbook/macbook keyboard
- // to an embedded keypad) changes, it may subsequently cause a key up event to be lost, which may lead to
+ // to an embedded keypad) changes, it may subsequently cause a key up event to be lost, which may lead to
// a movement key getting "stuck" down. This is bad.
// This is an OS bug -- even the GetKeys() API doesn't tell you the key has been released.
// This workaround causes all held-down keys to be reset whenever the state of the Fn key changes. This isn't
@@ -2361,14 +2362,14 @@ OSStatus LLWindowMacOSX::eventHandler (EventHandlerCallRef myHandler, EventRef e
if (gDebugWindowProc) printf("Fn key state change event\n");
gKeyboard->resetKeys();
}
-
+
if (gDebugWindowProc) fflush(stdout);
mLastModifiers = modifiers;
result = eventNotHandledErr;
break;
}
-
+
mRawKeyEvent = NULL;
}
break;
@@ -2463,7 +2464,7 @@ OSStatus LLWindowMacOSX::eventHandler (EventHandlerCallRef myHandler, EventRef e
case kEventMouseButtonSecondary:
mCallbacks->handleRightMouseDown(this, outCoords, mask);
break;
-
+
case kEventMouseButtonTertiary:
mCallbacks->handleMiddleMouseDown(this, outCoords, mask);
break;
@@ -2525,7 +2526,7 @@ OSStatus LLWindowMacOSX::eventHandler (EventHandlerCallRef myHandler, EventRef e
case kEventClassWindow:
switch(evtKind)
- {
+ {
case kEventWindowActivated:
if (mTSMDocument)
{
@@ -2540,20 +2541,20 @@ OSStatus LLWindowMacOSX::eventHandler (EventHandlerCallRef myHandler, EventRef e
}
mCallbacks->handleFocusLost(this);
break;
-
+
case kEventWindowBoundsChanging:
{
// This is where we would constrain move/resize to a particular screen
- const S32 MIN_WIDTH = 320;
- const S32 MIN_HEIGHT = 240;
-
+ const S32 MIN_WIDTH = mMinWindowWidth;
+ const S32 MIN_HEIGHT = mMinWindowHeight;
+
Rect currentBounds;
Rect previousBounds;
GetEventParameter(event, kEventParamCurrentBounds, typeQDRectangle, NULL, sizeof(Rect), NULL, &currentBounds);
GetEventParameter(event, kEventParamPreviousBounds, typeQDRectangle, NULL, sizeof(Rect), NULL, &previousBounds);
-
+
// Put an offset into window un-maximize operation since the kEventWindowGetIdealSize
// event only allows the specification of size and not position.
if (mMaximized)
@@ -2561,7 +2562,7 @@ OSStatus LLWindowMacOSX::eventHandler (EventHandlerCallRef myHandler, EventRef e
short leftOffset = mPreviousWindowRect.left - currentBounds.left;
currentBounds.left += leftOffset;
currentBounds.right += leftOffset;
-
+
short topOffset = mPreviousWindowRect.top - currentBounds.top;
currentBounds.top += topOffset;
currentBounds.bottom += topOffset;
@@ -2581,7 +2582,7 @@ OSStatus LLWindowMacOSX::eventHandler (EventHandlerCallRef myHandler, EventRef e
{
currentBounds.bottom = currentBounds.top + MIN_HEIGHT;
}
-
+
SetEventParameter(event, kEventParamCurrentBounds, typeQDRectangle, sizeof(Rect), &currentBounds);
result = noErr;
}
@@ -2592,38 +2593,38 @@ OSStatus LLWindowMacOSX::eventHandler (EventHandlerCallRef myHandler, EventRef e
// Get new window bounds
Rect newBounds;
GetEventParameter(event, kEventParamCurrentBounds, typeQDRectangle, NULL, sizeof(Rect), NULL, &newBounds);
-
+
// Get previous window bounds
Rect oldBounds;
GetEventParameter(event, kEventParamPreviousBounds, typeQDRectangle, NULL, sizeof(Rect), NULL, &oldBounds);
-
+
// Determine if the new size is larger than the old
bool newBoundsLarger = ((newBounds.right - newBounds.left) >= (oldBounds.right - oldBounds.left));
newBoundsLarger &= ((newBounds.bottom - newBounds.top) >= (oldBounds.bottom - oldBounds.top));
-
+
// Check to see if this is a zoom event (+ button on window pane)
unsigned int eventParams;
GetEventParameter(event, kEventParamAttributes, typeUInt32, NULL, sizeof(int), NULL, &eventParams);
bool isZoomEvent = ((eventParams & kWindowBoundsChangeZoom) != 0);
-
+
// Maximized flag is if zoom event and increasing window size
mMaximized = (isZoomEvent && newBoundsLarger);
-
+
aglUpdateContext(mContext);
-
+
mCallbacks->handleResize(this, newBounds.right - newBounds.left, newBounds.bottom - newBounds.top);
}
break;
-
+
case kEventWindowGetIdealSize:
// Only recommend a new ideal size when un-maximizing
if (mMaximized == TRUE)
{
Point nonMaximizedSize;
-
+
nonMaximizedSize.v = mPreviousWindowRect.bottom - mPreviousWindowRect.top;
nonMaximizedSize.h = mPreviousWindowRect.right - mPreviousWindowRect.left;
-
+
SetEventParameter(event, kEventParamDimensions, typeQDPoint, sizeof(Point), &nonMaximizedSize);
result = noErr;
}
@@ -2678,7 +2679,7 @@ OSStatus LLWindowMacOSX::eventHandler (EventHandlerCallRef myHandler, EventRef e
if (mPreeditor)
{
switch(evtKind)
- {
+ {
case kEventTSMDocumentAccessGetLength:
{
@@ -2697,14 +2698,14 @@ OSStatus LLWindowMacOSX::eventHandler (EventHandlerCallRef myHandler, EventRef e
{
// Return the selected range, excluding preedit.
// In our preeditor, preedit and selection are exclusive, so,
- // when it has a preedit, there is no selection and the
+ // when it has a preedit, there is no selection and the
// insertion point is on the preedit that corrupses into the
// beginning of the preedit when the preedit was removed.
S32 preedit, preedit_length;
mPreeditor->getPreeditRange(&preedit, &preedit_length);
const LLWString & text = mPreeditor->getPreeditString();
-
+
CFRange range;
if (preedit_length)
{
@@ -2768,7 +2769,7 @@ OSStatus LLWindowMacOSX::eventHandler (EventHandlerCallRef myHandler, EventRef e
memcpy(target_pointer, text_utf16.c_str() + range.location, range.length * sizeof(UniChar));
// Note that result has already been set above.
- }
+ }
}
break;
@@ -2815,14 +2816,14 @@ const char* cursorIDToName(int id)
case UI_CURSOR_TOOLPLAY: return "UI_CURSOR_TOOLPLAY";
case UI_CURSOR_TOOLPAUSE: return "UI_CURSOR_TOOLPAUSE";
case UI_CURSOR_TOOLMEDIAOPEN: return "UI_CURSOR_TOOLMEDIAOPEN";
- case UI_CURSOR_PIPETTE: return "UI_CURSOR_PIPETTE";
+ case UI_CURSOR_PIPETTE: return "UI_CURSOR_PIPETTE";
case UI_CURSOR_TOOLSIT: return "UI_CURSOR_TOOLSIT";
case UI_CURSOR_TOOLBUY: return "UI_CURSOR_TOOLBUY";
case UI_CURSOR_TOOLOPEN: return "UI_CURSOR_TOOLOPEN";
}
llerrs << "cursorIDToName: unknown cursor id" << id << llendl;
-
+
return "UI_CURSOR_ARROW";
}
@@ -2838,42 +2839,42 @@ static void initPixmapCursor(int cursorid, int hotspotX, int hotspotY)
fullpath += gDirUtilp->getDirDelimiter();
fullpath += cursorIDToName(cursorid);
fullpath += ".tif";
-
+
gCursors[cursorid] = createImageCursor(fullpath.c_str(), hotspotX, hotspotY);
}
-void LLWindowMacOSX::setCursor(ECursorType cursor)
+void LLWindowMacOSX::updateCursor()
{
OSStatus result = noErr;
- if (mDragOverrideCursor != -1)
+ if (mDragOverrideCursor != -1)
{
// A drag is in progress...remember the requested cursor and we'll
// restore it when it is done
- mCurrentCursor = cursor;
+ mCurrentCursor = mNextCursor;
return;
}
- if (cursor == UI_CURSOR_ARROW
+ if (mNextCursor == UI_CURSOR_ARROW
&& mBusyCount > 0)
{
- cursor = UI_CURSOR_WORKING;
+ mNextCursor = UI_CURSOR_WORKING;
}
- if(mCurrentCursor == cursor)
+ if(mCurrentCursor == mNextCursor)
return;
// RN: replace multi-drag cursors with single versions
- if (cursor == UI_CURSOR_ARROWDRAGMULTI)
+ if (mNextCursor == UI_CURSOR_ARROWDRAGMULTI)
{
- cursor = UI_CURSOR_ARROWDRAG;
+ mNextCursor = UI_CURSOR_ARROWDRAG;
}
- else if (cursor == UI_CURSOR_ARROWCOPYMULTI)
+ else if (mNextCursor == UI_CURSOR_ARROWCOPYMULTI)
{
- cursor = UI_CURSOR_ARROWCOPY;
+ mNextCursor = UI_CURSOR_ARROWCOPY;
}
- switch(cursor)
+ switch(mNextCursor)
{
default:
case UI_CURSOR_ARROW:
@@ -2924,7 +2925,7 @@ void LLWindowMacOSX::setCursor(ECursorType cursor)
case UI_CURSOR_TOOLSIT:
case UI_CURSOR_TOOLBUY:
case UI_CURSOR_TOOLOPEN:
- result = setImageCursor(gCursors[cursor]);
+ result = setImageCursor(gCursors[mNextCursor]);
break;
}
@@ -2934,7 +2935,7 @@ void LLWindowMacOSX::setCursor(ECursorType cursor)
InitCursor();
}
- mCurrentCursor = cursor;
+ mCurrentCursor = mNextCursor;
}
ECursorType LLWindowMacOSX::getCursor() const
@@ -3269,14 +3270,14 @@ void LLWindowMacOSX::spawnWebBrowser(const std::string& escaped_url, bool async)
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);
@@ -3286,7 +3287,7 @@ LLSD LLWindowMacOSX::getNativeKeyData()
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!
@@ -3295,7 +3296,7 @@ LLSD LLWindowMacOSX::getNativeKeyData()
EventParamType actualType = typeUTF8Text;
UInt32 actualSize = 0;
char *buffer = NULL;
-
+
err = GetEventParameter (mRawKeyEvent, kEventParamKeyUnicodes, typeUTF8Text, &actualType, 0, &actualSize, NULL);
if(err == noErr)
{
@@ -3308,7 +3309,7 @@ LLSD LLWindowMacOSX::getNativeKeyData()
}
delete[] buffer;
}
-
+
result["unicode"] = unicode;
#endif
@@ -3316,7 +3317,7 @@ LLSD LLWindowMacOSX::getNativeKeyData()
lldebugs << "native key data is: " << result << llendl;
-
+
return result;
}
@@ -3363,17 +3364,17 @@ void *LLWindowMacOSX::getPlatformWindow()
void *LLWindowMacOSX::getMediaWindow()
{
- /*
- Mozilla needs to be initialized with a WindowRef to function properly.
+ /*
+ Mozilla needs to be initialized with a WindowRef to function properly.
(There's no good reason for this, since it shouldn't be interacting with our window in any way, but that's another issue.)
- If we're in windowed mode, we _could_ hand it our actual window pointer, but a subsequent switch to fullscreen will destroy that window,
+ If we're in windowed mode, we _could_ hand it our actual window pointer, but a subsequent switch to fullscreen will destroy that window,
which trips up Mozilla.
Instead of using our actual window, we create an invisible window which will persist for the lifetime of the application and pass that to Mozilla.
This satisfies its deep-seated need to latch onto a WindowRef and solves the issue with switching between fullscreen and windowed modes.
Note that we will never destroy this window (by design!), but since only one will ever be created per run of the application, that's okay.
*/
-
+
if(sMediaWindow == NULL)
{
Rect window_rect = {100, 100, 200, 200};
@@ -3382,13 +3383,13 @@ void *LLWindowMacOSX::getMediaWindow()
NULL,
&window_rect,
(ConstStr255Param) "\p",
- false, // Create the window invisible.
+ false, // Create the window invisible.
zoomDocProc, // Window with a grow box and a zoom box
kLastWindowOfClass, // create it behind other windows
false, // no close box
0);
}
-
+
return (void*)sMediaWindow;
}
@@ -3438,7 +3439,7 @@ void LLWindowMacOSX::allowLanguageTextInput(LLPreeditor *preeditor, BOOL b)
}
UseInputWindow(mTSMDocument, !b);
-
+
// Take care of old and new preeditors.
if (preeditor != mPreeditor || !b)
{
@@ -3457,7 +3458,7 @@ void LLWindowMacOSX::allowLanguageTextInput(LLPreeditor *preeditor, BOOL b)
return;
}
mLanguageTextInputAllowed = b;
-
+
if (b)
{
if (mTSMScriptCode != smRoman)
@@ -3506,7 +3507,7 @@ MASK LLWindowMacOSX::modifiersToMask(SInt16 modifiers)
if(modifiers & (cmdKey | controlKey)) { mask |= MASK_CONTROL; }
if(modifiers & optionKey) { mask |= MASK_ALT; }
return mask;
-}
+}
#if LL_OS_DRAGDROP_ENABLED
@@ -3517,53 +3518,53 @@ OSErr LLWindowMacOSX::dragTrackingHandler(DragTrackingMessage message, WindowRef
LLWindowMacOSX *self = (LLWindowMacOSX*)handlerRefCon;
lldebugs << "drag tracking handler, message = " << message << llendl;
-
+
switch(message)
{
case kDragTrackingInWindow:
result = self->handleDragNDrop(drag, LLWindowCallbacks::DNDA_TRACK);
break;
-
+
case kDragTrackingEnterHandler:
result = self->handleDragNDrop(drag, LLWindowCallbacks::DNDA_START_TRACKING);
break;
-
+
case kDragTrackingLeaveHandler:
result = self->handleDragNDrop(drag, LLWindowCallbacks::DNDA_STOP_TRACKING);
break;
-
+
default:
break;
}
-
+
return result;
}
-OSErr LLWindowMacOSX::dragReceiveHandler(WindowRef theWindow, void * handlerRefCon,
+OSErr LLWindowMacOSX::dragReceiveHandler(WindowRef theWindow, void * handlerRefCon,
DragRef drag)
-{
+{
LLWindowMacOSX *self = (LLWindowMacOSX*)handlerRefCon;
return self->handleDragNDrop(drag, LLWindowCallbacks::DNDA_DROPPED);
}
OSErr LLWindowMacOSX::handleDragNDrop(DragRef drag, LLWindowCallbacks::DragNDropAction action)
-{
+{
OSErr result = dragNotAcceptedErr; // overall function result
OSErr err = noErr; // for local error handling
-
+
// Get the mouse position and modifiers of this drag.
SInt16 modifiers, mouseDownModifiers, mouseUpModifiers;
::GetDragModifiers(drag, &modifiers, &mouseDownModifiers, &mouseUpModifiers);
MASK mask = LLWindowMacOSX::modifiersToMask(modifiers);
-
+
Point mouse_point;
// This will return the mouse point in global screen coords
::GetDragMouse(drag, &mouse_point, NULL);
LLCoordScreen screen_coords(mouse_point.h, mouse_point.v);
LLCoordGL gl_pos;
convertCoords(screen_coords, &gl_pos);
-
+
// Look at the pasteboard and try to extract an URL from it
PasteboardRef pasteboard;
if(GetDragPasteboard(drag, &pasteboard) == noErr)
@@ -3571,22 +3572,22 @@ OSErr LLWindowMacOSX::handleDragNDrop(DragRef drag, LLWindowCallbacks::DragNDrop
ItemCount num_items = 0;
// Treat an error here as an item count of 0
(void)PasteboardGetItemCount(pasteboard, &num_items);
-
+
// Only deal with single-item drags.
if(num_items == 1)
{
PasteboardItemID item_id = NULL;
CFArrayRef flavors = NULL;
CFDataRef data = NULL;
-
+
err = PasteboardGetItemIdentifier(pasteboard, 1, &item_id); // Yes, this really is 1-based.
-
+
// Try to extract an URL from the pasteboard
if(err == noErr)
{
err = PasteboardCopyItemFlavors( pasteboard, item_id, &flavors);
}
-
+
if(err == noErr)
{
if(CFArrayContainsValue(flavors, CFRangeMake(0, CFArrayGetCount(flavors)), kUTTypeURL))
@@ -3599,9 +3600,9 @@ OSErr LLWindowMacOSX::handleDragNDrop(DragRef drag, LLWindowCallbacks::DragNDrop
// This is a string that might be an URL.
err = PasteboardCopyItemFlavorData(pasteboard, item_id, kUTTypeUTF8PlainText, &data);
}
-
+
}
-
+
if(flavors != NULL)
{
CFRelease(flavors);
@@ -3612,12 +3613,12 @@ OSErr LLWindowMacOSX::handleDragNDrop(DragRef drag, LLWindowCallbacks::DragNDrop
std::string url;
url.assign((char*)CFDataGetBytePtr(data), CFDataGetLength(data));
CFRelease(data);
-
+
if(!url.empty())
{
- LLWindowCallbacks::DragNDropResult res =
+ LLWindowCallbacks::DragNDropResult res =
mCallbacks->handleDragNDrop(this, gl_pos, mask, action, url);
-
+
switch (res) {
case LLWindowCallbacks::DND_NONE: // No drop allowed
if (action == LLWindowCallbacks::DNDA_TRACK)
@@ -3652,7 +3653,7 @@ OSErr LLWindowMacOSX::handleDragNDrop(DragRef drag, LLWindowCallbacks::DragNDrop
// Restore the cursor
ECursorType temp_cursor = mCurrentCursor;
// get around the "setting the same cursor" code in setCursor()
- mCurrentCursor = UI_CURSOR_COUNT;
+ mCurrentCursor = UI_CURSOR_COUNT;
setCursor(temp_cursor);
}
else {
@@ -3664,7 +3665,7 @@ OSErr LLWindowMacOSX::handleDragNDrop(DragRef drag, LLWindowCallbacks::DragNDrop
}
}
}
-
+
return result;
}
diff --git a/indra/llwindow/llwindowmacosx.h b/indra/llwindow/llwindowmacosx.h
index 6c9e075a21..073f294b54 100644
--- a/indra/llwindow/llwindowmacosx.h
+++ b/indra/llwindow/llwindowmacosx.h
@@ -58,7 +58,7 @@ public:
/*virtual*/ BOOL getSize(LLCoordScreen *size);
/*virtual*/ BOOL getSize(LLCoordWindow *size);
/*virtual*/ BOOL setPosition(LLCoordScreen position);
- /*virtual*/ BOOL setSize(LLCoordScreen size);
+ /*virtual*/ BOOL setSizeImpl(LLCoordScreen size);
/*virtual*/ BOOL switchContext(BOOL fullscreen, const LLCoordScreen &size, BOOL disable_vsync, const LLCoordScreen * const posp = NULL);
/*virtual*/ BOOL setCursorPosition(LLCoordWindow position);
/*virtual*/ BOOL getCursorPosition(LLCoordWindow *position);
@@ -67,7 +67,7 @@ public:
/*virtual*/ void showCursorFromMouseMove();
/*virtual*/ void hideCursorUntilMouseMove();
/*virtual*/ BOOL isCursorHidden();
- /*virtual*/ void setCursor(ECursorType cursor);
+ /*virtual*/ void updateCursor();
/*virtual*/ ECursorType getCursor() const;
/*virtual*/ void captureMouse();
/*virtual*/ void releaseMouse();
diff --git a/indra/llwindow/llwindowmesaheadless.h b/indra/llwindow/llwindowmesaheadless.h
index fd4bd635e2..8f70aee4f6 100644
--- a/indra/llwindow/llwindowmesaheadless.h
+++ b/indra/llwindow/llwindowmesaheadless.h
@@ -50,7 +50,7 @@ public:
/*virtual*/ BOOL getSize(LLCoordScreen *size) {return FALSE;};
/*virtual*/ BOOL getSize(LLCoordWindow *size) {return FALSE;};
/*virtual*/ BOOL setPosition(LLCoordScreen position) {return FALSE;};
- /*virtual*/ BOOL setSize(LLCoordScreen size) {return FALSE;};
+ /*virtual*/ BOOL setSizeImpl(LLCoordScreen size) {return FALSE;};
/*virtual*/ BOOL switchContext(BOOL fullscreen, const LLCoordScreen &size, BOOL disable_vsync, const LLCoordScreen * const posp = NULL) {return FALSE;};
/*virtual*/ BOOL setCursorPosition(LLCoordWindow position) {return FALSE;};
/*virtual*/ BOOL getCursorPosition(LLCoordWindow *position) {return FALSE;};
@@ -59,7 +59,7 @@ public:
/*virtual*/ void showCursorFromMouseMove() {};
/*virtual*/ void hideCursorUntilMouseMove() {};
/*virtual*/ BOOL isCursorHidden() {return FALSE;};
- /*virtual*/ void setCursor(ECursorType cursor) {};
+ /*virtual*/ void updateCursor() {};
//virtual ECursorType getCursor() { return mCurrentCursor; };
/*virtual*/ void captureMouse() {};
/*virtual*/ void releaseMouse() {};
diff --git a/indra/llwindow/llwindowsdl.cpp b/indra/llwindow/llwindowsdl.cpp
index e41aa9820f..5f5baceef8 100644
--- a/indra/llwindow/llwindowsdl.cpp
+++ b/indra/llwindow/llwindowsdl.cpp
@@ -963,7 +963,7 @@ BOOL LLWindowSDL::setPosition(const LLCoordScreen position)
return TRUE;
}
-BOOL LLWindowSDL::setSize(const LLCoordScreen size)
+BOOL LLWindowSDL::setSizeImpl(const LLCoordScreen size)
{
if(mWindow)
{
@@ -985,7 +985,6 @@ void LLWindowSDL::swapBuffers()
{
if (mWindow)
{
- glFinish();
SDL_GL_SwapBuffers();
}
}
@@ -1034,6 +1033,25 @@ void LLWindowSDL::setMouseClipping( BOOL b )
//SDL_WM_GrabInput(b ? SDL_GRAB_ON : SDL_GRAB_OFF);
}
+// virtual
+void LLWindowSDL::setMinSize(U32 min_width, U32 min_height, bool enforce_immediately)
+{
+ LLWindow::setMinSize(min_width, min_height, enforce_immediately);
+
+#if LL_X11
+ // Set the minimum size limits for X11 window
+ // so the window manager doesn't allow resizing below those limits.
+ XSizeHints* hints = XAllocSizeHints();
+ hints->flags |= PMinSize;
+ hints->min_width = mMinWindowWidth;
+ hints->min_height = mMinWindowHeight;
+
+ XSetWMNormalHints(mSDL_Display, mSDL_XWindowID, hints);
+
+ XFree(hints);
+#endif
+}
+
BOOL LLWindowSDL::setCursorPosition(const LLCoordWindow position)
{
BOOL result = TRUE;
@@ -1843,11 +1861,15 @@ void LLWindowSDL::gatherInput()
break;
case SDL_VIDEORESIZE: // *FIX: handle this?
+ {
llinfos << "Handling a resize event: " << event.resize.w <<
"x" << event.resize.h << llendl;
+ S32 width = llmax(event.resize.w, (S32)mMinWindowWidth);
+ S32 height = llmax(event.resize.h, (S32)mMinWindowHeight);
+
// *FIX: I'm not sure this is necessary!
- mWindow = SDL_SetVideoMode(event.resize.w, event.resize.h, 32, mSDLFlags);
+ mWindow = SDL_SetVideoMode(width, height, 32, mSDLFlags);
if (!mWindow)
{
// *FIX: More informative dialog?
@@ -1860,10 +1882,10 @@ void LLWindowSDL::gatherInput()
}
break;
}
-
- mCallbacks->handleResize(this, event.resize.w, event.resize.h );
- break;
+ mCallbacks->handleResize(this, width, height);
+ break;
+ }
case SDL_ACTIVEEVENT:
if (event.active.state & SDL_APPINPUTFOCUS)
{
@@ -1914,6 +1936,8 @@ void LLWindowSDL::gatherInput()
break;
}
}
+
+ updateCursor();
#if LL_X11
// This is a good time to stop flashing the icon if our mFlashTimer has
@@ -2000,7 +2024,7 @@ static SDL_Cursor *makeSDLCursorFromBMP(const char *filename, int hotx, int hoty
return sdlcursor;
}
-void LLWindowSDL::setCursor(ECursorType cursor)
+void LLWindowSDL::updateCursor()
{
if (ATIbug) {
// cursor-updating is very flaky when this bug is
@@ -2008,11 +2032,11 @@ void LLWindowSDL::setCursor(ECursorType cursor)
return;
}
- if (mCurrentCursor != cursor)
+ if (mCurrentCursor != mNextCursor)
{
- if (cursor < UI_CURSOR_COUNT)
+ if (mNextCursor < UI_CURSOR_COUNT)
{
- SDL_Cursor *sdlcursor = mSDLCursors[cursor];
+ SDL_Cursor *sdlcursor = mSDLCursors[mNextCursor];
// Try to default to the arrow for any cursors that
// did not load correctly.
if (!sdlcursor && mSDLCursors[UI_CURSOR_ARROW])
@@ -2020,9 +2044,9 @@ void LLWindowSDL::setCursor(ECursorType cursor)
if (sdlcursor)
SDL_SetCursor(sdlcursor);
} else {
- llwarns << "Tried to set invalid cursor number " << cursor << llendl;
+ llwarns << "Tried to set invalid cursor number " << mNextCursor << llendl;
}
- mCurrentCursor = cursor;
+ mCurrentCursor = mNextCursor;
}
}
diff --git a/indra/llwindow/llwindowsdl.h b/indra/llwindow/llwindowsdl.h
index fa544b16ce..59719e4046 100644
--- a/indra/llwindow/llwindowsdl.h
+++ b/indra/llwindow/llwindowsdl.h
@@ -63,7 +63,7 @@ public:
/*virtual*/ BOOL getSize(LLCoordScreen *size);
/*virtual*/ BOOL getSize(LLCoordWindow *size);
/*virtual*/ BOOL setPosition(LLCoordScreen position);
- /*virtual*/ BOOL setSize(LLCoordScreen size);
+ /*virtual*/ BOOL setSizeImpl(LLCoordScreen size);
/*virtual*/ BOOL switchContext(BOOL fullscreen, const LLCoordScreen &size, BOOL disable_vsync, const LLCoordScreen * const posp = NULL);
/*virtual*/ BOOL setCursorPosition(LLCoordWindow position);
/*virtual*/ BOOL getCursorPosition(LLCoordWindow *position);
@@ -72,10 +72,11 @@ public:
/*virtual*/ void showCursorFromMouseMove();
/*virtual*/ void hideCursorUntilMouseMove();
/*virtual*/ BOOL isCursorHidden();
- /*virtual*/ void setCursor(ECursorType cursor);
+ /*virtual*/ void updateCursor();
/*virtual*/ void captureMouse();
/*virtual*/ void releaseMouse();
/*virtual*/ void setMouseClipping( BOOL b );
+ /*virtual*/ void setMinSize(U32 min_width, U32 min_height, bool enforce_immediately = true);
/*virtual*/ BOOL isClipboardTextAvailable();
/*virtual*/ BOOL pasteTextFromClipboard(LLWString &dst);
diff --git a/indra/llwindow/llwindowwin32.cpp b/indra/llwindow/llwindowwin32.cpp
index 121c7880df..228fbefd19 100644
--- a/indra/llwindow/llwindowwin32.cpp
+++ b/indra/llwindow/llwindowwin32.cpp
@@ -41,6 +41,7 @@
#include "llgl.h"
#include "llstring.h"
#include "lldir.h"
+#include "llglslshader.h"
// System includes
#include <commdlg.h>
@@ -861,7 +862,7 @@ BOOL LLWindowWin32::setPosition(const LLCoordScreen position)
return TRUE;
}
-BOOL LLWindowWin32::setSize(const LLCoordScreen size)
+BOOL LLWindowWin32::setSizeImpl(const LLCoordScreen size)
{
LLCoordScreen position;
@@ -1031,6 +1032,8 @@ BOOL LLWindowWin32::switchContext(BOOL fullscreen, const LLCoordScreen &size, BO
mhInstance,
NULL);
+ LL_INFOS("Window") << "window is created." << llendl ;
+
//-----------------------------------------------------------------------
// Create GL drawing context
//-----------------------------------------------------------------------
@@ -1080,6 +1083,37 @@ BOOL LLWindowWin32::switchContext(BOOL fullscreen, const LLCoordScreen &size, BO
return FALSE;
}
+ // (EXP-1765) dump pixel data to see if there is a pattern that leads to unreproducible crash
+ LL_INFOS("Window") << "--- begin pixel format dump ---" << llendl ;
+ LL_INFOS("Window") << "pixel_format is " << pixel_format << llendl ;
+ LL_INFOS("Window") << "pfd.nSize: " << pfd.nSize << llendl ;
+ LL_INFOS("Window") << "pfd.nVersion: " << pfd.nVersion << llendl ;
+ LL_INFOS("Window") << "pfd.dwFlags: 0x" << std::hex << pfd.dwFlags << std::dec << llendl ;
+ LL_INFOS("Window") << "pfd.iPixelType: " << (int)pfd.iPixelType << llendl ;
+ LL_INFOS("Window") << "pfd.cColorBits: " << (int)pfd.cColorBits << llendl ;
+ LL_INFOS("Window") << "pfd.cRedBits: " << (int)pfd.cRedBits << llendl ;
+ LL_INFOS("Window") << "pfd.cRedShift: " << (int)pfd.cRedShift << llendl ;
+ LL_INFOS("Window") << "pfd.cGreenBits: " << (int)pfd.cGreenBits << llendl ;
+ LL_INFOS("Window") << "pfd.cGreenShift: " << (int)pfd.cGreenShift << llendl ;
+ LL_INFOS("Window") << "pfd.cBlueBits: " << (int)pfd.cBlueBits << llendl ;
+ LL_INFOS("Window") << "pfd.cBlueShift: " << (int)pfd.cBlueShift << llendl ;
+ LL_INFOS("Window") << "pfd.cAlphaBits: " << (int)pfd.cAlphaBits << llendl ;
+ LL_INFOS("Window") << "pfd.cAlphaShift: " << (int)pfd.cAlphaShift << llendl ;
+ LL_INFOS("Window") << "pfd.cAccumBits: " << (int)pfd.cAccumBits << llendl ;
+ LL_INFOS("Window") << "pfd.cAccumRedBits: " << (int)pfd.cAccumRedBits << llendl ;
+ LL_INFOS("Window") << "pfd.cAccumGreenBits: " << (int)pfd.cAccumGreenBits << llendl ;
+ LL_INFOS("Window") << "pfd.cAccumBlueBits: " << (int)pfd.cAccumBlueBits << llendl ;
+ LL_INFOS("Window") << "pfd.cAccumAlphaBits: " << (int)pfd.cAccumAlphaBits << llendl ;
+ LL_INFOS("Window") << "pfd.cDepthBits: " << (int)pfd.cDepthBits << llendl ;
+ LL_INFOS("Window") << "pfd.cStencilBits: " << (int)pfd.cStencilBits << llendl ;
+ LL_INFOS("Window") << "pfd.cAuxBuffers: " << (int)pfd.cAuxBuffers << llendl ;
+ LL_INFOS("Window") << "pfd.iLayerType: " << (int)pfd.iLayerType << llendl ;
+ LL_INFOS("Window") << "pfd.bReserved: " << (int)pfd.bReserved << llendl ;
+ LL_INFOS("Window") << "pfd.dwLayerMask: " << pfd.dwLayerMask << llendl ;
+ LL_INFOS("Window") << "pfd.dwVisibleMask: " << pfd.dwVisibleMask << llendl ;
+ LL_INFOS("Window") << "pfd.dwDamageMask: " << pfd.dwDamageMask << llendl ;
+ LL_INFOS("Window") << "--- end pixel format dump ---" << llendl ;
+
if (pfd.cColorBits < 32)
{
close();
@@ -1120,8 +1154,10 @@ BOOL LLWindowWin32::switchContext(BOOL fullscreen, const LLCoordScreen &size, BO
return FALSE;
}
- gGLManager.initWGL();
+ LL_INFOS("Window") << "Drawing context is created." << llendl ;
+ gGLManager.initWGL();
+
if (wglChoosePixelFormatARB)
{
// OK, at this point, use the ARB wglChoosePixelFormatsARB function to see if we
@@ -1256,7 +1292,7 @@ BOOL LLWindowWin32::switchContext(BOOL fullscreen, const LLCoordScreen &size, BO
LL_INFOS("Window") << "Choosing pixel formats: " << num_formats << " pixel formats returned" << LL_ENDL;
}
-
+ LL_INFOS("Window") << "pixel formats done." << llendl ;
S32 swap_method = 0;
S32 cur_format = num_formats-1;
@@ -1306,6 +1342,8 @@ BOOL LLWindowWin32::switchContext(BOOL fullscreen, const LLCoordScreen &size, BO
mhInstance,
NULL);
+ LL_INFOS("Window") << "recreate window done." << llendl ;
+
if (!(mhDC = GetDC(mWindowHandle)))
{
close();
@@ -1378,7 +1416,53 @@ BOOL LLWindowWin32::switchContext(BOOL fullscreen, const LLCoordScreen &size, BO
return FALSE;
}
- if (!(mhRC = wglCreateContext(mhDC)))
+ mhRC = 0;
+ if (wglCreateContextAttribsARB)
+ { //attempt to create a specific versioned context
+ S32 attribs[] =
+ { //start at 4.2
+ WGL_CONTEXT_MAJOR_VERSION_ARB, 4,
+ WGL_CONTEXT_MINOR_VERSION_ARB, 2,
+ WGL_CONTEXT_PROFILE_MASK_ARB, LLRender::sGLCoreProfile ? WGL_CONTEXT_CORE_PROFILE_BIT_ARB : WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB,
+ WGL_CONTEXT_FLAGS_ARB, gDebugGL ? WGL_CONTEXT_DEBUG_BIT_ARB : 0,
+ 0
+ };
+
+ bool done = false;
+ while (!done)
+ {
+ mhRC = wglCreateContextAttribsARB(mhDC, mhRC, attribs);
+
+ if (!mhRC)
+ {
+ if (attribs[3] > 0)
+ { //decrement minor version
+ attribs[3]--;
+ }
+ else if (attribs[1] > 3)
+ { //decrement major version and start minor version over at 3
+ attribs[1]--;
+ attribs[3] = 3;
+ }
+ else
+ { //we reached 3.0 and still failed, bail out
+ done = true;
+ }
+ }
+ else
+ {
+ llinfos << "Created OpenGL " << llformat("%d.%d", attribs[1], attribs[3]) << " context." << llendl;
+ done = true;
+
+ if (LLRender::sGLCoreProfile)
+ {
+ LLGLSLShader::sNoFixedFunction = true;
+ }
+ }
+ }
+ }
+
+ if (!mhRC && !(mhRC = wglCreateContext(mhDC)))
{
close();
OSMessageBox(mCallbacks->translateString("MBGLContextErr"), mCallbacks->translateString("MBError"), OSMB_OK);
@@ -1398,7 +1482,7 @@ BOOL LLWindowWin32::switchContext(BOOL fullscreen, const LLCoordScreen &size, BO
OSMessageBox(mCallbacks->translateString("MBVideoDrvErr"), mCallbacks->translateString("MBError"), OSMB_OK);
return FALSE;
}
-
+
// Disable vertical sync for swap
if (disable_vsync && wglSwapIntervalEXT)
{
@@ -1614,18 +1698,18 @@ void LLWindowWin32::initCursors()
-void LLWindowWin32::setCursor(ECursorType cursor)
+void LLWindowWin32::updateCursor()
{
- if (cursor == UI_CURSOR_ARROW
+ if (mNextCursor == UI_CURSOR_ARROW
&& mBusyCount > 0)
{
- cursor = UI_CURSOR_WORKING;
+ mNextCursor = UI_CURSOR_WORKING;
}
- if( mCurrentCursor != cursor )
+ if( mCurrentCursor != mNextCursor )
{
- mCurrentCursor = cursor;
- SetCursor( mCursor[cursor] );
+ mCurrentCursor = mNextCursor;
+ SetCursor( mCursor[mNextCursor] );
}
}
@@ -1663,7 +1747,7 @@ void LLWindowWin32::gatherInput()
LLMemType m1(LLMemType::MTYPE_GATHER_INPUT);
- while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE) && msg_count < MAX_MESSAGE_PER_UPDATE)
+ while ((msg_count < MAX_MESSAGE_PER_UPDATE) && PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
mCallbacks->handlePingWatchdog(this, "Main:TranslateGatherInput");
TranslateMessage(&msg);
@@ -1707,6 +1791,8 @@ void LLWindowWin32::gatherInput()
mInputProcessingPaused = FALSE;
+ updateCursor();
+
// clear this once we've processed all mouse messages that might have occurred after
// we slammed the mouse position
mMousePositionModified = FALSE;
@@ -2354,6 +2440,14 @@ LRESULT CALLBACK LLWindowWin32::mainWindowProc(HWND h_wnd, UINT u_msg, WPARAM w_
return 0;
}
+ case WM_GETMINMAXINFO:
+ {
+ LPMINMAXINFO min_max = (LPMINMAXINFO)l_param;
+ min_max->ptMinTrackSize.x = window_imp->mMinWindowWidth;
+ min_max->ptMinTrackSize.y = window_imp->mMinWindowHeight;
+ return 0;
+ }
+
case WM_SIZE:
{
window_imp->mCallbacks->handlePingWatchdog(window_imp, "Main:WM_SIZE");
@@ -2896,7 +2990,6 @@ BOOL LLWindowWin32::resetDisplayResolution()
void LLWindowWin32::swapBuffers()
{
- glFinish();
SwapBuffers(mhDC);
}
diff --git a/indra/llwindow/llwindowwin32.h b/indra/llwindow/llwindowwin32.h
index 387e4cbdb6..b3602be8b7 100644
--- a/indra/llwindow/llwindowwin32.h
+++ b/indra/llwindow/llwindowwin32.h
@@ -57,7 +57,7 @@ public:
/*virtual*/ BOOL getSize(LLCoordScreen *size);
/*virtual*/ BOOL getSize(LLCoordWindow *size);
/*virtual*/ BOOL setPosition(LLCoordScreen position);
- /*virtual*/ BOOL setSize(LLCoordScreen size);
+ /*virtual*/ BOOL setSizeImpl(LLCoordScreen size);
/*virtual*/ BOOL switchContext(BOOL fullscreen, const LLCoordScreen &size, BOOL disable_vsync, const LLCoordScreen * const posp = NULL);
/*virtual*/ BOOL setCursorPosition(LLCoordWindow position);
/*virtual*/ BOOL getCursorPosition(LLCoordWindow *position);
@@ -66,7 +66,7 @@ public:
/*virtual*/ void showCursorFromMouseMove();
/*virtual*/ void hideCursorUntilMouseMove();
/*virtual*/ BOOL isCursorHidden();
- /*virtual*/ void setCursor(ECursorType cursor);
+ /*virtual*/ void updateCursor();
/*virtual*/ ECursorType getCursor() const;
/*virtual*/ void captureMouse();
/*virtual*/ void releaseMouse();
diff --git a/indra/llxml/llcontrol.h b/indra/llxml/llcontrol.h
index 050d4b729f..bf38a8b062 100644
--- a/indra/llxml/llcontrol.h
+++ b/indra/llxml/llcontrol.h
@@ -185,9 +185,10 @@ protected:
ctrl_name_table_t mNameTable;
std::string mTypeString[TYPE_COUNT];
+public:
eControlType typeStringToEnum(const std::string& typestr);
std::string typeEnumToString(eControlType typeenum);
-public:
+
LLControlGroup(const std::string& name);
~LLControlGroup();
void cleanup();
diff --git a/indra/llxml/llxmlnode.cpp b/indra/llxml/llxmlnode.cpp
index 9f1e249ddd..2b4a0fc2a1 100644
--- a/indra/llxml/llxmlnode.cpp
+++ b/indra/llxml/llxmlnode.cpp
@@ -693,7 +693,7 @@ bool LLXMLNode::parseFile(const std::string& filename, LLXMLNodePtr& node, LLXML
LLFILE* fp = LLFile::fopen(filename, "rb"); /* Flawfinder: ignore */
if (fp == NULL)
{
- node = new LLXMLNode();
+ node = NULL ;
return false;
}
fseek(fp, 0, SEEK_END);
@@ -746,7 +746,7 @@ bool LLXMLNode::parseBuffer(
{
llwarns << "Parse failure - wrong number of top-level nodes xml."
<< llendl;
- node = new LLXMLNode();
+ node = NULL ;
return false;
}
@@ -805,7 +805,7 @@ bool LLXMLNode::parseStream(
{
llwarns << "Parse failure - wrong number of top-level nodes xml."
<< llendl;
- node = new LLXMLNode();
+ node = NULL;
return false;
}
@@ -1206,7 +1206,7 @@ bool LLXMLNode::getChild(const LLStringTableEntry* name, LLXMLNodePtr& node, BOO
{
return mDefault->getChild(name, node, FALSE);
}
- node = new LLXMLNode();
+ node = NULL;
return false;
}
@@ -1277,7 +1277,7 @@ bool LLXMLNode::getAttribute(const LLStringTableEntry* name, LLXMLNodePtr& node,
{
return mDefault->getAttribute(name, node, FALSE);
}
- node = new LLXMLNode();
+
return false;
}
diff --git a/indra/llxuixml/CMakeLists.txt b/indra/llxuixml/CMakeLists.txt
deleted file mode 100644
index daed4de6ce..0000000000
--- a/indra/llxuixml/CMakeLists.txt
+++ /dev/null
@@ -1,45 +0,0 @@
-# -*- cmake -*-
-
-project(llxuixml)
-
-include(00-Common)
-include(LLCommon)
-include(LLMath)
-include(LLXML)
-
-include_directories(
- ${LLCOMMON_INCLUDE_DIRS}
- ${LLMATH_INCLUDE_DIRS}
- ${LLXML_INCLUDE_DIRS}
- )
-
-set(llxuixml_SOURCE_FILES
- llinitparam.cpp
- lltrans.cpp
- lluicolor.cpp
- llxuiparser.cpp
- )
-
-set(llxuixml_HEADER_FILES
- CMakeLists.txt
-
- llinitparam.h
- lltrans.h
- llregistry.h
- lluicolor.h
- llxuiparser.h
- )
-
-set_source_files_properties(${llxuixml_HEADER_FILES}
- PROPERTIES HEADER_FILE_ONLY TRUE)
-
-list(APPEND llxuixml_SOURCE_FILES ${llxuixml_HEADER_FILES})
-
-add_library (llxuixml ${llxuixml_SOURCE_FILES})
-# Libraries on which this library depends, needed for Linux builds
-# Sort by high-level to low-level
-target_link_libraries(llxuixml
- llxml
- llcommon
- llmath
- )
diff --git a/indra/llxuixml/llinitparam.cpp b/indra/llxuixml/llinitparam.cpp
deleted file mode 100644
index c024fd405e..0000000000
--- a/indra/llxuixml/llinitparam.cpp
+++ /dev/null
@@ -1,490 +0,0 @@
-/**
- * @file llinitparam.cpp
- * @brief parameter block abstraction for creating complex objects and
- * parsing construction parameters from xml and LLSD
- *
- * $LicenseInfo:firstyear=2008&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-#include "linden_common.h"
-
-#include "llinitparam.h"
-
-
-namespace LLInitParam
-{
- //
- // Param
- //
- Param::Param(BaseBlock* enclosing_block)
- : mIsProvided(false)
- {
- const U8* my_addr = reinterpret_cast<const U8*>(this);
- const U8* block_addr = reinterpret_cast<const U8*>(enclosing_block);
- mEnclosingBlockOffset = 0x7FFFffff & ((U32)(my_addr - block_addr));
- }
-
- //
- // ParamDescriptor
- //
- ParamDescriptor::ParamDescriptor(param_handle_t p,
- merge_func_t merge_func,
- deserialize_func_t deserialize_func,
- serialize_func_t serialize_func,
- validation_func_t validation_func,
- inspect_func_t inspect_func,
- S32 min_count,
- S32 max_count)
- : mParamHandle(p),
- mMergeFunc(merge_func),
- mDeserializeFunc(deserialize_func),
- mSerializeFunc(serialize_func),
- mValidationFunc(validation_func),
- mInspectFunc(inspect_func),
- mMinCount(min_count),
- mMaxCount(max_count),
- mGeneration(0),
- mUserData(NULL)
- {}
-
- ParamDescriptor::ParamDescriptor()
- : mParamHandle(0),
- mMergeFunc(NULL),
- mDeserializeFunc(NULL),
- mSerializeFunc(NULL),
- mValidationFunc(NULL),
- mInspectFunc(NULL),
- mMinCount(0),
- mMaxCount(0),
- mGeneration(0),
- mUserData(NULL)
- {}
-
- ParamDescriptor::~ParamDescriptor()
- {
- delete mUserData;
- }
-
- //
- // Parser
- //
- S32 Parser::sNextParseGeneration = 0;
-
- Parser::~Parser()
- {}
-
- void Parser::parserWarning(const std::string& message)
- {
- if (mParseSilently) return;
- llwarns << message << llendl;
- }
-
- void Parser::parserError(const std::string& message)
- {
- if (mParseSilently) return;
- llerrs << message << llendl;
- }
-
-
- //
- // BlockDescriptor
- //
- void BlockDescriptor::aggregateBlockData(BlockDescriptor& src_block_data)
- {
- mNamedParams.insert(src_block_data.mNamedParams.begin(), src_block_data.mNamedParams.end());
- std::copy(src_block_data.mUnnamedParams.begin(), src_block_data.mUnnamedParams.end(), std::back_inserter(mUnnamedParams));
- std::copy(src_block_data.mValidationList.begin(), src_block_data.mValidationList.end(), std::back_inserter(mValidationList));
- std::copy(src_block_data.mAllParams.begin(), src_block_data.mAllParams.end(), std::back_inserter(mAllParams));
- }
-
- BlockDescriptor::BlockDescriptor()
- : mMaxParamOffset(0),
- mInitializationState(UNINITIALIZED),
- mCurrentBlockPtr(NULL)
- {}
-
- //
- // BaseBlock
- //
- BaseBlock::BaseBlock()
- : mChangeVersion(0)
- {}
-
- BaseBlock::~BaseBlock()
- {}
-
- // called by each derived class in least to most derived order
- void BaseBlock::init(BlockDescriptor& descriptor, BlockDescriptor& base_descriptor, size_t block_size)
- {
- descriptor.mCurrentBlockPtr = this;
- descriptor.mMaxParamOffset = block_size;
-
- switch(descriptor.mInitializationState)
- {
- case BlockDescriptor::UNINITIALIZED:
- // copy params from base class here
- descriptor.aggregateBlockData(base_descriptor);
-
- descriptor.mInitializationState = BlockDescriptor::INITIALIZING;
- break;
- case BlockDescriptor::INITIALIZING:
- descriptor.mInitializationState = BlockDescriptor::INITIALIZED;
- break;
- case BlockDescriptor::INITIALIZED:
- // nothing to do
- break;
- }
- }
-
- param_handle_t BaseBlock::getHandleFromParam(const Param* param) const
- {
- const U8* param_address = reinterpret_cast<const U8*>(param);
- const U8* baseblock_address = reinterpret_cast<const U8*>(this);
- return (param_address - baseblock_address);
- }
-
- bool BaseBlock::submitValue(const Parser::name_stack_t& name_stack, Parser& p, bool silent)
- {
- if (!deserializeBlock(p, std::make_pair(name_stack.begin(), name_stack.end()), -1))
- {
- if (!silent)
- {
- p.parserWarning(llformat("Failed to parse parameter \"%s\"", p.getCurrentElementName().c_str()));
- }
- return false;
- }
- return true;
- }
-
-
- bool BaseBlock::validateBlock(bool emit_errors) const
- {
- const BlockDescriptor& block_data = mostDerivedBlockDescriptor();
- for (BlockDescriptor::param_validation_list_t::const_iterator it = block_data.mValidationList.begin(); it != block_data.mValidationList.end(); ++it)
- {
- const Param* param = getParamFromHandle(it->first);
- if (!it->second(param))
- {
- if (emit_errors)
- {
- llwarns << "Invalid param \"" << getParamName(block_data, param) << "\"" << llendl;
- }
- return false;
- }
- }
- return true;
- }
-
- void BaseBlock::serializeBlock(Parser& parser, Parser::name_stack_t name_stack, const LLInitParam::BaseBlock* diff_block) const
- {
- // named param is one like LLView::Params::follows
- // unnamed param is like LLView::Params::rect - implicit
- const BlockDescriptor& block_data = mostDerivedBlockDescriptor();
-
- for (BlockDescriptor::param_list_t::const_iterator it = block_data.mUnnamedParams.begin();
- it != block_data.mUnnamedParams.end();
- ++it)
- {
- param_handle_t param_handle = (*it)->mParamHandle;
- const Param* param = getParamFromHandle(param_handle);
- ParamDescriptor::serialize_func_t serialize_func = (*it)->mSerializeFunc;
- if (serialize_func)
- {
- const Param* diff_param = diff_block ? diff_block->getParamFromHandle(param_handle) : NULL;
- // each param descriptor remembers its serial number
- // so we can inspect the same param under different names
- // and see that it has the same number
- (*it)->mGeneration = parser.newParseGeneration();
- name_stack.push_back(std::make_pair("", (*it)->mGeneration));
- serialize_func(*param, parser, name_stack, diff_param);
- name_stack.pop_back();
- }
- }
-
- for(BlockDescriptor::param_map_t::const_iterator it = block_data.mNamedParams.begin();
- it != block_data.mNamedParams.end();
- ++it)
- {
- param_handle_t param_handle = it->second->mParamHandle;
- const Param* param = getParamFromHandle(param_handle);
- ParamDescriptor::serialize_func_t serialize_func = it->second->mSerializeFunc;
- if (serialize_func && param->anyProvided())
- {
- // Ensure this param has not already been serialized
- // Prevents <rect> from being serialized as its own tag.
- bool duplicate = false;
- for (BlockDescriptor::param_list_t::const_iterator it2 = block_data.mUnnamedParams.begin();
- it2 != block_data.mUnnamedParams.end();
- ++it2)
- {
- if (param_handle == (*it2)->mParamHandle)
- {
- duplicate = true;
- break;
- }
- }
-
- //FIXME: for now, don't attempt to serialize values under synonyms, as current parsers
- // don't know how to detect them
- if (duplicate)
- {
- continue;
- }
-
- if (!duplicate)
- {
- it->second->mGeneration = parser.newParseGeneration();
- }
-
- name_stack.push_back(std::make_pair(it->first, it->second->mGeneration));
- const Param* diff_param = diff_block ? diff_block->getParamFromHandle(param_handle) : NULL;
- serialize_func(*param, parser, name_stack, diff_param);
- name_stack.pop_back();
- }
- }
- }
-
- bool BaseBlock::inspectBlock(Parser& parser, Parser::name_stack_t name_stack, S32 min_count, S32 max_count) const
- {
- // named param is one like LLView::Params::follows
- // unnamed param is like LLView::Params::rect - implicit
- const BlockDescriptor& block_data = mostDerivedBlockDescriptor();
-
- for (BlockDescriptor::param_list_t::const_iterator it = block_data.mUnnamedParams.begin();
- it != block_data.mUnnamedParams.end();
- ++it)
- {
- param_handle_t param_handle = (*it)->mParamHandle;
- const Param* param = getParamFromHandle(param_handle);
- ParamDescriptor::inspect_func_t inspect_func = (*it)->mInspectFunc;
- if (inspect_func)
- {
- (*it)->mGeneration = parser.newParseGeneration();
- name_stack.push_back(std::make_pair("", (*it)->mGeneration));
- inspect_func(*param, parser, name_stack, (*it)->mMinCount, (*it)->mMaxCount);
- name_stack.pop_back();
- }
- }
-
- for(BlockDescriptor::param_map_t::const_iterator it = block_data.mNamedParams.begin();
- it != block_data.mNamedParams.end();
- ++it)
- {
- param_handle_t param_handle = it->second->mParamHandle;
- const Param* param = getParamFromHandle(param_handle);
- ParamDescriptor::inspect_func_t inspect_func = it->second->mInspectFunc;
- if (inspect_func)
- {
- // Ensure this param has not already been inspected
- bool duplicate = false;
- for (BlockDescriptor::param_list_t::const_iterator it2 = block_data.mUnnamedParams.begin();
- it2 != block_data.mUnnamedParams.end();
- ++it2)
- {
- if (param_handle == (*it2)->mParamHandle)
- {
- duplicate = true;
- break;
- }
- }
-
- if (!duplicate)
- {
- it->second->mGeneration = parser.newParseGeneration();
- }
- name_stack.push_back(std::make_pair(it->first, it->second->mGeneration));
- inspect_func(*param, parser, name_stack, it->second->mMinCount, it->second->mMaxCount);
- name_stack.pop_back();
- }
- }
-
- return true;
- }
-
- bool BaseBlock::deserializeBlock(Parser& p, Parser::name_stack_range_t name_stack, S32 parent_generation)
- {
- BlockDescriptor& block_data = mostDerivedBlockDescriptor();
- bool names_left = name_stack.first != name_stack.second;
-
- S32 parse_generation = name_stack.first == name_stack.second ? -1 : name_stack.first->second;
-
- if (names_left)
- {
- const std::string& top_name = name_stack.first->first;
-
- ParamDescriptor::deserialize_func_t deserialize_func = NULL;
- Param* paramp = NULL;
-
- BlockDescriptor::param_map_t::iterator found_it = block_data.mNamedParams.find(top_name);
- if (found_it != block_data.mNamedParams.end())
- {
- // find pointer to member parameter from offset table
- paramp = getParamFromHandle(found_it->second->mParamHandle);
- deserialize_func = found_it->second->mDeserializeFunc;
-
- Parser::name_stack_range_t new_name_stack(name_stack.first, name_stack.second);
- ++new_name_stack.first;
- return deserialize_func(*paramp, p, new_name_stack, parse_generation);
- }
- }
-
- // try to parse unnamed parameters, in declaration order
- for ( BlockDescriptor::param_list_t::iterator it = block_data.mUnnamedParams.begin();
- it != block_data.mUnnamedParams.end();
- ++it)
- {
- Param* paramp = getParamFromHandle((*it)->mParamHandle);
- ParamDescriptor::deserialize_func_t deserialize_func = (*it)->mDeserializeFunc;
-
- if (deserialize_func && deserialize_func(*paramp, p, name_stack, parse_generation))
- {
- return true;
- }
- }
-
- // if no match, and no names left on stack, this is just an existence assertion of this block
- // verify by calling readValue with NoParamValue type, an inherently unparseable type
- if (!names_left)
- {
- NoParamValue no_value;
- return p.readValue(no_value);
- }
-
- return false;
- }
-
- //static
- void BaseBlock::addParam(BlockDescriptor& block_data, const ParamDescriptorPtr in_param, const char* char_name)
- {
- // create a copy of the param descriptor in mAllParams
- // so other data structures can store a pointer to it
- block_data.mAllParams.push_back(in_param);
- ParamDescriptorPtr param(block_data.mAllParams.back());
-
- std::string name(char_name);
- if ((size_t)param->mParamHandle > block_data.mMaxParamOffset)
- {
- llerrs << "Attempted to register param with block defined for parent class, make sure to derive from LLInitParam::Block<YOUR_CLASS, PARAM_BLOCK_BASE_CLASS>" << llendl;
- }
-
- if (name.empty())
- {
- block_data.mUnnamedParams.push_back(param);
- }
- else
- {
- // don't use insert, since we want to overwrite existing entries
- block_data.mNamedParams[name] = param;
- }
-
- if (param->mValidationFunc)
- {
- block_data.mValidationList.push_back(std::make_pair(param->mParamHandle, param->mValidationFunc));
- }
- }
-
- void BaseBlock::addSynonym(Param& param, const std::string& synonym)
- {
- BlockDescriptor& block_data = mostDerivedBlockDescriptor();
- if (block_data.mInitializationState == BlockDescriptor::INITIALIZING)
- {
- param_handle_t handle = getHandleFromParam(&param);
-
- // check for invalid derivation from a paramblock (i.e. without using
- // Block<T, Base_Class>
- if ((size_t)handle > block_data.mMaxParamOffset)
- {
- llerrs << "Attempted to register param with block defined for parent class, make sure to derive from LLInitParam::Block<YOUR_CLASS, PARAM_BLOCK_BASE_CLASS>" << llendl;
- }
-
- ParamDescriptorPtr param_descriptor = findParamDescriptor(param);
- if (param_descriptor)
- {
- if (synonym.empty())
- {
- block_data.mUnnamedParams.push_back(param_descriptor);
- }
- else
- {
- block_data.mNamedParams[synonym] = param_descriptor;
- }
- }
- }
- }
-
- void BaseBlock::paramChanged(const Param& changed_param, bool user_provided)
- {
- if (user_provided)
- {
- mChangeVersion++;
- }
- }
-
- const std::string& BaseBlock::getParamName(const BlockDescriptor& block_data, const Param* paramp) const
- {
- param_handle_t handle = getHandleFromParam(paramp);
- for (BlockDescriptor::param_map_t::const_iterator it = block_data.mNamedParams.begin(); it != block_data.mNamedParams.end(); ++it)
- {
- if (it->second->mParamHandle == handle)
- {
- return it->first;
- }
- }
-
- return LLStringUtil::null;
- }
-
- ParamDescriptorPtr BaseBlock::findParamDescriptor(const Param& param)
- {
- param_handle_t handle = getHandleFromParam(&param);
- BlockDescriptor& descriptor = mostDerivedBlockDescriptor();
- BlockDescriptor::all_params_list_t::iterator end_it = descriptor.mAllParams.end();
- for (BlockDescriptor::all_params_list_t::iterator it = descriptor.mAllParams.begin();
- it != end_it;
- ++it)
- {
- if ((*it)->mParamHandle == handle) return *it;
- }
- return ParamDescriptorPtr();
- }
-
- // take all provided params from other and apply to self
- // NOTE: this requires that "other" is of the same derived type as this
- bool BaseBlock::mergeBlock(BlockDescriptor& block_data, const BaseBlock& other, bool overwrite)
- {
- bool some_param_changed = false;
- BlockDescriptor::all_params_list_t::const_iterator end_it = block_data.mAllParams.end();
- for (BlockDescriptor::all_params_list_t::const_iterator it = block_data.mAllParams.begin();
- it != end_it;
- ++it)
- {
- const Param* other_paramp = other.getParamFromHandle((*it)->mParamHandle);
- ParamDescriptor::merge_func_t merge_func = (*it)->mMergeFunc;
- if (merge_func)
- {
- Param* paramp = getParamFromHandle((*it)->mParamHandle);
- some_param_changed |= merge_func(*paramp, *other_paramp, overwrite);
- }
- }
- return some_param_changed;
- }
-}
diff --git a/indra/llxuixml/llinitparam.h b/indra/llxuixml/llinitparam.h
deleted file mode 100644
index 9d0fe781ce..0000000000
--- a/indra/llxuixml/llinitparam.h
+++ /dev/null
@@ -1,1913 +0,0 @@
-/**
- * @file llinitparam.h
- * @brief parameter block abstraction for creating complex objects and
- * parsing construction parameters from xml and LLSD
- *
- * $LicenseInfo:firstyear=2008&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-#ifndef LL_LLPARAM_H
-#define LL_LLPARAM_H
-
-#include <vector>
-#include <boost/function.hpp>
-#include <boost/type_traits/is_convertible.hpp>
-#include <boost/unordered_map.hpp>
-#include <boost/shared_ptr.hpp>
-
-#include "llerror.h"
-
-namespace LLInitParam
-{
- template<typename T> const T& defaultValue() { static T value; return value; }
-
- template <typename T, bool IS_BOOST_FUNCTION = boost::is_convertible<T, boost::function_base>::value >
- struct ParamCompare
- {
- static bool equals(const T &a, const T &b)
- {
- return a == b;
- }
- };
-
- // boost function types are not comparable
- template<typename T>
- struct ParamCompare<T, true>
- {
- static bool equals(const T&a, const T &b)
- {
- return false;
- }
- };
-
- template<>
- struct ParamCompare<LLSD, false>
- {
- static bool equals(const LLSD &a, const LLSD &b) { return false; }
- };
-
- // helper functions and classes
- typedef ptrdiff_t param_handle_t;
-
- // empty default implementation of key cache
- // leverages empty base class optimization
- template <typename T>
- class TypeValues
- {
- public:
- typedef std::map<std::string, T> value_name_map_t;
-
- void setValueName(const std::string& key) {}
- std::string getValueName() const { return ""; }
- void clearValueName() const {}
-
- static bool getValueFromName(const std::string& name, T& value)
- {
- return false;
- }
-
- static bool valueNamesExist()
- {
- return false;
- }
-
- static std::vector<std::string>* getPossibleValues()
- {
- return NULL;
- }
-
- static value_name_map_t* getValueNames() {return NULL;}
- };
-
- template <typename T, typename DERIVED_TYPE = TypeValues<T> >
- class TypeValuesHelper
- {
- public:
- typedef typename std::map<std::string, T> value_name_map_t;
-
- //TODO: cache key by index to save on param block size
- void setValueName(const std::string& value_name)
- {
- mValueName = value_name;
- }
-
- std::string getValueName() const
- {
- return mValueName;
- }
-
- void clearValueName() const
- {
- mValueName.clear();
- }
-
- static bool getValueFromName(const std::string& name, T& value)
- {
- value_name_map_t* map = getValueNames();
- typename value_name_map_t::iterator found_it = map->find(name);
- if (found_it == map->end()) return false;
-
- value = found_it->second;
- return true;
- }
-
- static bool valueNamesExist()
- {
- return !getValueNames()->empty();
- }
-
- static value_name_map_t* getValueNames()
- {
- static value_name_map_t sMap;
- static bool sInitialized = false;
-
- if (!sInitialized)
- {
- sInitialized = true;
- DERIVED_TYPE::declareValues();
- }
- return &sMap;
- }
-
- static std::vector<std::string>* getPossibleValues()
- {
- static std::vector<std::string> sValues;
-
- value_name_map_t* map = getValueNames();
- for (typename value_name_map_t::iterator it = map->begin(), end_it = map->end();
- it != end_it;
- ++it)
- {
- sValues.push_back(it->first);
- }
- return &sValues;
- }
-
- static void declare(const std::string& name, const T& value)
- {
- (*getValueNames())[name] = value;
- }
-
- protected:
- static void getName(const std::string& name, const T& value)
- {}
-
- mutable std::string mValueName;
- };
-
- class Parser
- {
- LOG_CLASS(Parser);
-
- public:
-
- struct CompareTypeID
- {
- bool operator()(const std::type_info* lhs, const std::type_info* rhs) const
- {
- return lhs->before(*rhs);
- }
- };
-
- typedef std::vector<std::pair<std::string, S32> > name_stack_t;
- typedef std::pair<name_stack_t::const_iterator, name_stack_t::const_iterator> name_stack_range_t;
- typedef std::vector<std::string> possible_values_t;
-
- typedef bool (*parser_read_func_t)(Parser& parser, void* output);
- typedef bool (*parser_write_func_t)(Parser& parser, const void*, const name_stack_t&);
- typedef boost::function<void (const name_stack_t&, S32, S32, const possible_values_t*)> parser_inspect_func_t;
-
- typedef std::map<const std::type_info*, parser_read_func_t, CompareTypeID> parser_read_func_map_t;
- typedef std::map<const std::type_info*, parser_write_func_t, CompareTypeID> parser_write_func_map_t;
- typedef std::map<const std::type_info*, parser_inspect_func_t, CompareTypeID> parser_inspect_func_map_t;
-
- Parser(parser_read_func_map_t& read_map, parser_write_func_map_t& write_map, parser_inspect_func_map_t& inspect_map)
- : mParseSilently(false),
- mParseGeneration(sNextParseGeneration),
- mParserReadFuncs(&read_map),
- mParserWriteFuncs(&write_map),
- mParserInspectFuncs(&inspect_map)
- {}
- virtual ~Parser();
-
- template <typename T> bool readValue(T& param)
- {
- parser_read_func_map_t::iterator found_it = mParserReadFuncs->find(&typeid(T));
- if (found_it != mParserReadFuncs->end())
- {
- return found_it->second(*this, (void*)&param);
- }
- return false;
- }
-
- template <typename T> bool writeValue(const T& param, const name_stack_t& name_stack)
- {
- parser_write_func_map_t::iterator found_it = mParserWriteFuncs->find(&typeid(T));
- if (found_it != mParserWriteFuncs->end())
- {
- return found_it->second(*this, (const void*)&param, name_stack);
- }
- return false;
- }
-
- // dispatch inspection to registered inspection functions, for each parameter in a param block
- template <typename T> bool inspectValue(const name_stack_t& name_stack, S32 min_count, S32 max_count, const possible_values_t* possible_values)
- {
- parser_inspect_func_map_t::iterator found_it = mParserInspectFuncs->find(&typeid(T));
- if (found_it != mParserInspectFuncs->end())
- {
- found_it->second(name_stack, min_count, max_count, possible_values);
- return true;
- }
- return false;
- }
-
- virtual std::string getCurrentElementName() = 0;
- virtual void parserWarning(const std::string& message);
- virtual void parserError(const std::string& message);
- void setParseSilently(bool silent) { mParseSilently = silent; }
-
- S32 getParseGeneration() { return mParseGeneration; }
- S32 newParseGeneration() { return mParseGeneration = ++sNextParseGeneration; }
-
-
- protected:
- template <typename T>
- void registerParserFuncs(parser_read_func_t read_func, parser_write_func_t write_func = NULL)
- {
- mParserReadFuncs->insert(std::make_pair(&typeid(T), read_func));
- mParserWriteFuncs->insert(std::make_pair(&typeid(T), write_func));
- }
-
- template <typename T>
- void registerInspectFunc(parser_inspect_func_t inspect_func)
- {
- mParserInspectFuncs->insert(std::make_pair(&typeid(T), inspect_func));
- }
-
- bool mParseSilently;
-
- private:
- parser_read_func_map_t* mParserReadFuncs;
- parser_write_func_map_t* mParserWriteFuncs;
- parser_inspect_func_map_t* mParserInspectFuncs;
- S32 mParseGeneration;
-
- static S32 sNextParseGeneration;
- };
-
- // used to indicate no matching value to a given name when parsing
- struct NoParamValue{};
-
- class BaseBlock;
-
- class Param
- {
- public:
- // public to allow choice blocks to clear provided flag on stale choices
- void setProvided(bool is_provided) { mIsProvided = is_provided; }
-
- protected:
- bool anyProvided() const { return mIsProvided; }
-
- Param(class BaseBlock* enclosing_block);
-
- // store pointer to enclosing block as offset to reduce space and allow for quick copying
- class BaseBlock& enclosingBlock() const
- {
- const U8* my_addr = reinterpret_cast<const U8*>(this);
- // get address of enclosing BLOCK class using stored offset to enclosing BaseBlock class
- return *const_cast<class BaseBlock*>
- (reinterpret_cast<const class BaseBlock*>
- (my_addr - (ptrdiff_t)(S32)mEnclosingBlockOffset));
- }
-
- private:
- friend class BaseBlock;
-
- U32 mEnclosingBlockOffset:31;
- U32 mIsProvided:1;
-
- };
-
- // various callbacks and constraints associated with an individual param
- struct ParamDescriptor
- {
- struct UserData
- {
- virtual ~UserData() {}
- };
-
- typedef bool(*merge_func_t)(Param&, const Param&, bool);
- typedef bool(*deserialize_func_t)(Param&, Parser&, const Parser::name_stack_range_t&, S32);
- typedef void(*serialize_func_t)(const Param&, Parser&, Parser::name_stack_t&, const Param* diff_param);
- typedef void(*inspect_func_t)(const Param&, Parser&, Parser::name_stack_t&, S32 min_count, S32 max_count);
- typedef bool(*validation_func_t)(const Param*);
-
- ParamDescriptor(param_handle_t p,
- merge_func_t merge_func,
- deserialize_func_t deserialize_func,
- serialize_func_t serialize_func,
- validation_func_t validation_func,
- inspect_func_t inspect_func,
- S32 min_count,
- S32 max_count);
-
- ParamDescriptor();
- ~ParamDescriptor();
-
- param_handle_t mParamHandle;
- merge_func_t mMergeFunc;
- deserialize_func_t mDeserializeFunc;
- serialize_func_t mSerializeFunc;
- inspect_func_t mInspectFunc;
- validation_func_t mValidationFunc;
- S32 mMinCount;
- S32 mMaxCount;
- S32 mGeneration;
- S32 mNumRefs;
- UserData* mUserData;
- };
-
- typedef boost::shared_ptr<ParamDescriptor> ParamDescriptorPtr;
-
- // each derived Block class keeps a static data structure maintaining offsets to various params
- class BlockDescriptor
- {
- public:
- BlockDescriptor();
-
- typedef enum e_initialization_state
- {
- UNINITIALIZED,
- INITIALIZING,
- INITIALIZED
- } EInitializationState;
-
- void aggregateBlockData(BlockDescriptor& src_block_data);
-
- typedef boost::unordered_map<const std::string, ParamDescriptorPtr> param_map_t;
- typedef std::vector<ParamDescriptorPtr> param_list_t;
- typedef std::list<ParamDescriptorPtr> all_params_list_t;
- typedef std::vector<std::pair<param_handle_t, ParamDescriptor::validation_func_t> > param_validation_list_t;
-
- param_map_t mNamedParams; // parameters with associated names
- param_list_t mUnnamedParams; // parameters with_out_ associated names
- param_validation_list_t mValidationList; // parameters that must be validated
- all_params_list_t mAllParams; // all parameters, owns descriptors
-
- size_t mMaxParamOffset;
-
- EInitializationState mInitializationState; // whether or not static block data has been initialized
- class BaseBlock* mCurrentBlockPtr; // pointer to block currently being constructed
- };
-
- class BaseBlock
- {
- public:
- // "Multiple" constraint types, put here in root class to avoid ambiguity during use
- struct AnyAmount
- {
- static U32 minCount() { return 0; }
- static U32 maxCount() { return U32_MAX; }
- };
-
- template<U32 MIN_AMOUNT>
- struct AtLeast
- {
- static U32 minCount() { return MIN_AMOUNT; }
- static U32 maxCount() { return U32_MAX; }
- };
-
- template<U32 MAX_AMOUNT>
- struct AtMost
- {
- static U32 minCount() { return 0; }
- static U32 maxCount() { return MAX_AMOUNT; }
- };
-
- template<U32 MIN_AMOUNT, U32 MAX_AMOUNT>
- struct Between
- {
- static U32 minCount() { return MIN_AMOUNT; }
- static U32 maxCount() { return MAX_AMOUNT; }
- };
-
- template<U32 EXACT_COUNT>
- struct Exactly
- {
- static U32 minCount() { return EXACT_COUNT; }
- static U32 maxCount() { return EXACT_COUNT; }
- };
-
- // this typedef identifies derived classes as being blocks
- typedef void baseblock_base_class_t;
- LOG_CLASS(BaseBlock);
- friend class Param;
-
- BaseBlock();
- virtual ~BaseBlock();
- bool submitValue(const Parser::name_stack_t& name_stack, Parser& p, bool silent=false);
-
- param_handle_t getHandleFromParam(const Param* param) const;
- bool validateBlock(bool emit_errors = true) const;
-
- Param* getParamFromHandle(const param_handle_t param_handle)
- {
- if (param_handle == 0) return NULL;
-
- U8* baseblock_address = reinterpret_cast<U8*>(this);
- return reinterpret_cast<Param*>(baseblock_address + param_handle);
- }
-
- const Param* getParamFromHandle(const param_handle_t param_handle) const
- {
- const U8* baseblock_address = reinterpret_cast<const U8*>(this);
- return reinterpret_cast<const Param*>(baseblock_address + param_handle);
- }
-
- void addSynonym(Param& param, const std::string& synonym);
-
- // Blocks can override this to do custom tracking of changes
- virtual void paramChanged(const Param& changed_param, bool user_provided);
-
- S32 getLastChangeVersion() const { return mChangeVersion; }
-
- bool deserializeBlock(Parser& p, Parser::name_stack_range_t name_stack, S32 generation);
- void serializeBlock(Parser& p, Parser::name_stack_t name_stack = Parser::name_stack_t(), const BaseBlock* diff_block = NULL) const;
- bool inspectBlock(Parser& p, Parser::name_stack_t name_stack = Parser::name_stack_t(), S32 min_count = 0, S32 max_count = S32_MAX) const;
-
- virtual const BlockDescriptor& mostDerivedBlockDescriptor() const { return selfBlockDescriptor(); }
- virtual BlockDescriptor& mostDerivedBlockDescriptor() { return selfBlockDescriptor(); }
-
- // take all provided params from other and apply to self
- bool overwriteFrom(const BaseBlock& other)
- {
- return false;
- }
-
- // take all provided params that are not already provided, and apply to self
- bool fillFrom(const BaseBlock& other)
- {
- return false;
- }
-
- static void addParam(BlockDescriptor& block_data, ParamDescriptorPtr param, const char* name);
-
- ParamDescriptorPtr findParamDescriptor(const Param& param);
-
- protected:
- void init(BlockDescriptor& descriptor, BlockDescriptor& base_descriptor, size_t block_size);
-
-
- bool mergeBlockParam(bool param_provided, BlockDescriptor& block_data, const BaseBlock& other, bool overwrite)
- {
- return mergeBlock(block_data, other, overwrite);
- }
- // take all provided params from other and apply to self
- bool mergeBlock(BlockDescriptor& block_data, const BaseBlock& other, bool overwrite);
-
- // can be updated in getters
- mutable S32 mChangeVersion;
-
- static BlockDescriptor& selfBlockDescriptor()
- {
- static BlockDescriptor sBlockDescriptor;
- return sBlockDescriptor;
- }
-
- private:
- const std::string& getParamName(const BlockDescriptor& block_data, const Param* paramp) const;
- };
-
- // these templates allow us to distinguish between template parameters
- // that derive from BaseBlock and those that don't
- template<typename T, typename Void = void>
- struct IsBlock
- {
- static const bool value = false;
- };
-
- template<typename T>
- struct IsBlock<T, typename T::baseblock_base_class_t>
- {
- static const bool value = true;
- };
-
- template<typename T, typename NAME_VALUE_LOOKUP, bool VALUE_IS_BLOCK = IsBlock<T>::value>
- class ParamValue : public NAME_VALUE_LOOKUP
- {
- public:
- typedef const T& value_assignment_t;
-
- ParamValue(): mValue() {}
- ParamValue(const T& other) : mValue(other) {}
-
- void setValue(value_assignment_t val)
- {
- mValue = val;
- }
-
- value_assignment_t getValue() const
- {
- return mValue;
- }
-
- T& getValue()
- {
- return mValue;
- }
-
- private:
- T mValue;
- };
-
- template<typename T, typename NAME_VALUE_LOOKUP>
- class ParamValue<T, NAME_VALUE_LOOKUP, true>
- : public T,
- public NAME_VALUE_LOOKUP
- {
- public:
- typedef const T& value_assignment_t;
-
- S32 mKeyVersion;
- mutable S32 mValidatedVersion;
- mutable bool mValidated; // lazy validation flag
-
- ParamValue()
- : T(),
- mKeyVersion(0),
- mValidatedVersion(-1),
- mValidated(false)
- {}
-
- ParamValue(const T& other)
- : T(other),
- mKeyVersion(0),
- mValidatedVersion(-1),
- mValidated(false)
- {
- }
-
- void setValue(value_assignment_t val)
- {
- *this = val;
- }
-
- value_assignment_t getValue() const
- {
- return *this;
- }
-
- T& getValue()
- {
- return *this;
- }
- };
-
- template<typename T, typename NAME_VALUE_LOOKUP = TypeValues<T> >
- struct ParamIterator
- {
- typedef typename std::vector<ParamValue<T, NAME_VALUE_LOOKUP> >::const_iterator const_iterator;
- typedef typename std::vector<ParamValue<T, NAME_VALUE_LOOKUP> >::iterator iterator;
- };
-
- // specialize for custom parsing/decomposition of specific classes
- // e.g. TypedParam<LLRect> has left, top, right, bottom, etc...
- template<typename T,
- typename NAME_VALUE_LOOKUP = TypeValues<T>,
- bool HAS_MULTIPLE_VALUES = false,
- bool VALUE_IS_BLOCK = IsBlock<ParamValue<T, NAME_VALUE_LOOKUP> >::value>
- class TypedParam
- : public Param,
- public ParamValue<T, NAME_VALUE_LOOKUP>
- {
- public:
- typedef const T& value_assignment_t;
- typedef TypedParam<T, NAME_VALUE_LOOKUP, HAS_MULTIPLE_VALUES, VALUE_IS_BLOCK> self_t;
- typedef NAME_VALUE_LOOKUP name_value_lookup_t;
- typedef ParamValue<T, NAME_VALUE_LOOKUP> param_value_t;
-
- TypedParam(BlockDescriptor& block_descriptor, const char* name, value_assignment_t value, ParamDescriptor::validation_func_t validate_func, S32 min_count, S32 max_count)
- : Param(block_descriptor.mCurrentBlockPtr)
- {
- if (LL_UNLIKELY(block_descriptor.mInitializationState == BlockDescriptor::INITIALIZING))
- {
- ParamDescriptorPtr param_descriptor = ParamDescriptorPtr(new ParamDescriptor(
- block_descriptor.mCurrentBlockPtr->getHandleFromParam(this),
- &mergeWith,
- &deserializeParam,
- &serializeParam,
- validate_func,
- &inspectParam,
- min_count, max_count));
- BaseBlock::addParam(block_descriptor, param_descriptor, name);
- }
-
- setValue(value);
- }
-
- bool isProvided() const { return Param::anyProvided(); }
-
- static bool deserializeParam(Param& param, Parser& parser, const Parser::name_stack_range_t& name_stack, S32 generation)
- {
- self_t& typed_param = static_cast<self_t&>(param);
- // no further names in stack, attempt to parse value now
- if (name_stack.first == name_stack.second)
- {
- if (parser.readValue(typed_param.getValue()))
- {
- typed_param.clearValueName();
- typed_param.setProvided(true);
- typed_param.enclosingBlock().paramChanged(param, true);
- return true;
- }
-
- // try to parse a known named value
- if(name_value_lookup_t::valueNamesExist())
- {
- // try to parse a known named value
- std::string name;
- if (parser.readValue(name))
- {
- // try to parse a per type named value
- if (name_value_lookup_t::getValueFromName(name, typed_param.getValue()))
- {
- typed_param.setValueName(name);
- typed_param.setProvided(true);
- typed_param.enclosingBlock().paramChanged(param, true);
- return true;
- }
-
- }
- }
- }
- return false;
- }
-
- static void serializeParam(const Param& param, Parser& parser, Parser::name_stack_t& name_stack, const Param* diff_param)
- {
- const self_t& typed_param = static_cast<const self_t&>(param);
- if (!typed_param.isProvided()) return;
-
- if (!name_stack.empty())
- {
- name_stack.back().second = parser.newParseGeneration();
- }
-
- std::string key = typed_param.getValueName();
-
- // first try to write out name of name/value pair
-
- if (!key.empty())
- {
- if (!diff_param || !ParamCompare<std::string>::equals(static_cast<const self_t*>(diff_param)->getValueName(), key))
- {
- if (!parser.writeValue(key, name_stack))
- {
- return;
- }
- }
- }
- // then try to serialize value directly
- else if (!diff_param || !ParamCompare<T>::equals(typed_param.getValue(), static_cast<const self_t*>(diff_param)->getValue()))
- {
- if (!parser.writeValue(typed_param.getValue(), name_stack))
- {
- return;
- }
- }
- }
-
- static void inspectParam(const Param& param, Parser& parser, Parser::name_stack_t& name_stack, S32 min_count, S32 max_count)
- {
- // tell parser about our actual type
- parser.inspectValue<T>(name_stack, min_count, max_count, NULL);
- // then tell it about string-based alternatives ("red", "blue", etc. for LLColor4)
- if (name_value_lookup_t::getPossibleValues())
- {
- parser.inspectValue<std::string>(name_stack, min_count, max_count, name_value_lookup_t::getPossibleValues());
- }
- }
-
- void set(value_assignment_t val, bool flag_as_provided = true)
- {
- setValue(val);
- param_value_t::clearValueName();
- setProvided(flag_as_provided);
- Param::enclosingBlock().paramChanged(*this, flag_as_provided);
- }
-
- // implicit conversion
- operator value_assignment_t() const { return param_value_t::getValue(); }
- // explicit conversion
- value_assignment_t operator()() const { return param_value_t::getValue(); }
-
- protected:
-
- static bool mergeWith(Param& dst, const Param& src, bool overwrite)
- {
- const self_t& src_typed_param = static_cast<const self_t&>(src);
- self_t& dst_typed_param = static_cast<self_t&>(dst);
-
- if (src_typed_param.isProvided()
- && (overwrite || !dst_typed_param.isProvided()))
- {
- dst_typed_param.set(src_typed_param.getValue());
- return true;
- }
- return false;
- }
- };
-
- // parameter that is a block
- template <typename T, typename NAME_VALUE_LOOKUP>
- class TypedParam<T, NAME_VALUE_LOOKUP, false, true>
- : public Param,
- public ParamValue<T, NAME_VALUE_LOOKUP>
- {
- public:
- typedef const T value_const_t;
- typedef T value_t;
- typedef value_const_t& value_assignment_t;
- typedef TypedParam<T, NAME_VALUE_LOOKUP, false, true> self_t;
- typedef NAME_VALUE_LOOKUP name_value_lookup_t;
- typedef ParamValue<T, NAME_VALUE_LOOKUP> param_value_t;
-
- TypedParam(BlockDescriptor& block_descriptor, const char* name, value_assignment_t value, ParamDescriptor::validation_func_t validate_func, S32 min_count, S32 max_count)
- : Param(block_descriptor.mCurrentBlockPtr),
- param_value_t(value)
- {
- if (LL_UNLIKELY(block_descriptor.mInitializationState == BlockDescriptor::INITIALIZING))
- {
- ParamDescriptorPtr param_descriptor = ParamDescriptorPtr(new ParamDescriptor(
- block_descriptor.mCurrentBlockPtr->getHandleFromParam(this),
- &mergeWith,
- &deserializeParam,
- &serializeParam,
- validate_func,
- &inspectParam,
- min_count, max_count));
- BaseBlock::addParam(block_descriptor, param_descriptor, name);
- }
- }
-
- static bool deserializeParam(Param& param, Parser& parser, const Parser::name_stack_range_t& name_stack, S32 generation)
- {
- self_t& typed_param = static_cast<self_t&>(param);
- // attempt to parse block...
- if(typed_param.deserializeBlock(parser, name_stack, generation))
- {
- typed_param.clearValueName();
- typed_param.enclosingBlock().paramChanged(param, true);
- typed_param.setProvided(true);
- return true;
- }
-
- if(name_value_lookup_t::valueNamesExist())
- {
- // try to parse a known named value
- std::string name;
- if (parser.readValue(name))
- {
- // try to parse a per type named value
- if (name_value_lookup_t::getValueFromName(name, typed_param.getValue()))
- {
- typed_param.enclosingBlock().paramChanged(param, true);
- typed_param.setValueName(name);
- typed_param.setProvided(true);
- typed_param.mKeyVersion = typed_param.getLastChangeVersion();
- return true;
- }
-
- }
- }
- return false;
- }
-
- static void serializeParam(const Param& param, Parser& parser, Parser::name_stack_t& name_stack, const Param* diff_param)
- {
- const self_t& typed_param = static_cast<const self_t&>(param);
- if (!typed_param.isProvided()) return;
-
- if (!name_stack.empty())
- {
- name_stack.back().second = parser.newParseGeneration();
- }
-
- std::string key = typed_param.getValueName();
- if (!key.empty() && typed_param.mKeyVersion == typed_param.getLastChangeVersion())
- {
- if (!parser.writeValue(key, name_stack))
- {
- return;
- }
- }
- else
- {
- typed_param.serializeBlock(parser, name_stack, static_cast<const self_t*>(diff_param));
- }
- }
-
- static void inspectParam(const Param& param, Parser& parser, Parser::name_stack_t& name_stack, S32 min_count, S32 max_count)
- {
- // I am a param that is also a block, so just recurse into my contents
- const self_t& typed_param = static_cast<const self_t&>(param);
- typed_param.inspectBlock(parser, name_stack, min_count, max_count);
- }
-
- // a param-that-is-a-block is provided when the user has set one of its child params
- // *and* the block as a whole validates
- bool isProvided() const
- {
- // only validate block when it hasn't already passed validation with current data
- if (Param::anyProvided() && param_value_t::mValidatedVersion < param_value_t::getLastChangeVersion())
- {
- // a sub-block is "provided" when it has been filled in enough to be valid
- param_value_t::mValidated = param_value_t::validateBlock(false);
- param_value_t::mValidatedVersion = param_value_t::getLastChangeVersion();
- }
- return Param::anyProvided() && param_value_t::mValidated;
- }
-
- // assign block contents to this param-that-is-a-block
- void set(value_assignment_t val, bool flag_as_provided = true)
- {
- setValue(val);
- param_value_t::clearValueName();
- // force revalidation of block by clearing known provided version
- // next call to isProvided() will update provision status based on validity
- param_value_t::mValidatedVersion = -1;
- setProvided(flag_as_provided);
- Param::enclosingBlock().paramChanged(*this, flag_as_provided);
- }
-
- // propagate changed status up to enclosing block
- /*virtual*/ void paramChanged(const Param& changed_param, bool user_provided)
- {
- param_value_t::paramChanged(changed_param, user_provided);
- Param::enclosingBlock().paramChanged(*this, user_provided);
- if (user_provided)
- {
- // a child param has been explicitly changed
- // so *some* aspect of this block is now provided
- setProvided(true);
- }
- }
-
- // implicit conversion
- operator value_assignment_t() const { return param_value_t::getValue(); }
- // explicit conversion
- value_assignment_t operator()() const { return param_value_t::getValue(); }
-
- protected:
-
- static bool mergeWith(Param& dst, const Param& src, bool overwrite)
- {
- const self_t& src_typed_param = static_cast<const self_t&>(src);
- self_t& dst_typed_param = static_cast<self_t&>(dst);
-
- if (src_typed_param.anyProvided())
- {
- bool param_provided = src_typed_param.isProvided() && (overwrite || !dst_typed_param.isProvided());
- if (dst_typed_param.mergeBlockParam(param_provided, param_value_t::selfBlockDescriptor(), src_typed_param, overwrite))
- {
- dst_typed_param.clearValueName();
- dst_typed_param.setProvided(true);
- dst_typed_param.enclosingBlock().paramChanged(dst_typed_param, true);
- return true;
- }
- }
- return false;
- }
- };
-
- // container of non-block parameters
- template <typename VALUE_TYPE, typename NAME_VALUE_LOOKUP>
- class TypedParam<VALUE_TYPE, NAME_VALUE_LOOKUP, true, false>
- : public Param
- {
- public:
- typedef TypedParam<VALUE_TYPE, NAME_VALUE_LOOKUP, true, false> self_t;
- typedef ParamValue<VALUE_TYPE, NAME_VALUE_LOOKUP> param_value_t;
- typedef typename std::vector<param_value_t> container_t;
- typedef const container_t& value_assignment_t;
-
- typedef VALUE_TYPE value_t;
- typedef NAME_VALUE_LOOKUP name_value_lookup_t;
-
- TypedParam(BlockDescriptor& block_descriptor, const char* name, value_assignment_t value, ParamDescriptor::validation_func_t validate_func, S32 min_count, S32 max_count)
- : Param(block_descriptor.mCurrentBlockPtr)
- {
- std::copy(value.begin(), value.end(), std::back_inserter(mValues));
-
- if (LL_UNLIKELY(block_descriptor.mInitializationState == BlockDescriptor::INITIALIZING))
- {
- ParamDescriptorPtr param_descriptor = ParamDescriptorPtr(new ParamDescriptor(
- block_descriptor.mCurrentBlockPtr->getHandleFromParam(this),
- &mergeWith,
- &deserializeParam,
- &serializeParam,
- validate_func,
- &inspectParam,
- min_count, max_count));
- BaseBlock::addParam(block_descriptor, param_descriptor, name);
- }
- }
-
- bool isProvided() const { return Param::anyProvided(); }
-
- static bool deserializeParam(Param& param, Parser& parser, const Parser::name_stack_range_t& name_stack, S32 generation)
- {
- self_t& typed_param = static_cast<self_t&>(param);
- value_t value;
- // no further names in stack, attempt to parse value now
- if (name_stack.first == name_stack.second)
- {
- // attempt to read value directly
- if (parser.readValue(value))
- {
- typed_param.add(value);
- return true;
- }
-
- // try to parse a known named value
- if(name_value_lookup_t::valueNamesExist())
- {
- // try to parse a known named value
- std::string name;
- if (parser.readValue(name))
- {
- // try to parse a per type named value
- if (name_value_lookup_t::getValueFromName(name, typed_param.mValues))
- {
- typed_param.add(value);
- typed_param.mValues.back().setValueName(name);
- return true;
- }
-
- }
- }
- }
- return false;
- }
-
- static void serializeParam(const Param& param, Parser& parser, Parser::name_stack_t& name_stack, const Param* diff_param)
- {
- const self_t& typed_param = static_cast<const self_t&>(param);
- if (!typed_param.isProvided() || name_stack.empty()) return;
-
- for (const_iterator it = typed_param.mValues.begin(), end_it = typed_param.mValues.end();
- it != end_it;
- ++it)
- {
- std::string key = it->getValue();
- name_stack.back().second = parser.newParseGeneration();
-
- if(key.empty())
- // not parsed via name values, write out value directly
- {
- if (!parser.writeValue(*it, name_stack))
- {
- break;
- }
- }
- else
- {
- if(!parser.writeValue(key, name_stack))
- {
- break;
- }
- }
- }
- }
-
- static void inspectParam(const Param& param, Parser& parser, Parser::name_stack_t& name_stack, S32 min_count, S32 max_count)
- {
- parser.inspectValue<VALUE_TYPE>(name_stack, min_count, max_count, NULL);
- if (name_value_lookup_t::getPossibleValues())
- {
- parser.inspectValue<std::string>(name_stack, min_count, max_count, name_value_lookup_t::getPossibleValues());
- }
- }
-
- void set(value_assignment_t val, bool flag_as_provided = true)
- {
- mValues = val;
- setProvided(flag_as_provided);
- Param::enclosingBlock().paramChanged(*this, flag_as_provided);
- }
-
- value_t& add()
- {
- mValues.push_back(param_value_t(value_t()));
- setProvided(true);
- Param::enclosingBlock().paramChanged(*this, true);
- return mValues.back();
- }
-
- void add(const value_t& item)
- {
- mValues.push_back(param_value_t(item));
- setProvided(true);
- Param::enclosingBlock().paramChanged(*this, true);
- }
-
- // implicit conversion
- operator value_assignment_t() const { return mValues; }
-
- typedef typename container_t::iterator iterator;
- typedef typename container_t::const_iterator const_iterator;
- iterator begin() { return mValues.begin(); }
- iterator end() { return mValues.end(); }
- const_iterator begin() const { return mValues.begin(); }
- const_iterator end() const { return mValues.end(); }
- bool empty() const { return mValues.empty(); }
- size_t size() const { return mValues.size(); }
-
- U32 numValidElements() const
- {
- return mValues.size();
- }
-
- protected:
- static bool mergeWith(Param& dst, const Param& src, bool overwrite)
- {
- const self_t& src_typed_param = static_cast<const self_t&>(src);
- self_t& dst_typed_param = static_cast<self_t&>(dst);
-
- if (overwrite)
- {
- std::copy(src_typed_param.begin(), src_typed_param.end(), std::back_inserter(dst_typed_param.mValues));
- }
- else
- {
- container_t new_values(src_typed_param.mValues);
- std::copy(dst_typed_param.begin(), dst_typed_param.end(), std::back_inserter(new_values));
- std::swap(dst_typed_param.mValues, new_values);
- }
-
- if (src_typed_param.begin() != src_typed_param.end())
- {
- dst_typed_param.setProvided(true);
- dst_typed_param.enclosingBlock().paramChanged(dst_typed_param, true);
- }
- return true;
- }
-
- container_t mValues;
- };
-
- // container of block parameters
- template <typename VALUE_TYPE, typename NAME_VALUE_LOOKUP>
- class TypedParam<VALUE_TYPE, NAME_VALUE_LOOKUP, true, true>
- : public Param
- {
- public:
- typedef TypedParam<VALUE_TYPE, NAME_VALUE_LOOKUP, true, true> self_t;
- typedef ParamValue<VALUE_TYPE, NAME_VALUE_LOOKUP> param_value_t;
- typedef typename std::vector<param_value_t> container_t;
- typedef const container_t& value_assignment_t;
- typedef VALUE_TYPE value_t;
- typedef NAME_VALUE_LOOKUP name_value_lookup_t;
-
- TypedParam(BlockDescriptor& block_descriptor, const char* name, value_assignment_t value, ParamDescriptor::validation_func_t validate_func, S32 min_count, S32 max_count)
- : Param(block_descriptor.mCurrentBlockPtr),
- mLastParseGeneration(0)
- {
- std::copy(value.begin(), value.end(), back_inserter(mValues));
-
- if (LL_UNLIKELY(block_descriptor.mInitializationState == BlockDescriptor::INITIALIZING))
- {
- ParamDescriptorPtr param_descriptor = ParamDescriptorPtr(new ParamDescriptor(
- block_descriptor.mCurrentBlockPtr->getHandleFromParam(this),
- &mergeWith,
- &deserializeParam,
- &serializeParam,
- validate_func,
- &inspectParam,
- min_count, max_count));
- BaseBlock::addParam(block_descriptor, param_descriptor, name);
- }
- }
-
- bool isProvided() const { return Param::anyProvided(); }
-
- static bool deserializeParam(Param& param, Parser& parser, const Parser::name_stack_range_t& name_stack, S32 generation)
- {
- self_t& typed_param = static_cast<self_t&>(param);
- bool new_value = false;
-
- if (generation != typed_param.mLastParseGeneration
- || typed_param.mValues.empty())
- {
- new_value = true;
- typed_param.mValues.push_back(value_t());
- }
-
- param_value_t& value = typed_param.mValues.back();
-
- // attempt to parse block...
- if(value.deserializeBlock(parser, name_stack, generation))
- {
- if (new_value)
- { // successfully parsed new value, let's keep it
- typed_param.mLastParseGeneration = generation;
- }
- typed_param.enclosingBlock().paramChanged(param, true);
- typed_param.setProvided(true);
- return true;
- }
- else if(name_value_lookup_t::valueNamesExist())
- {
- // try to parse a known named value
- std::string name;
- if (parser.readValue(name))
- {
- // try to parse a per type named value
- if (name_value_lookup_t::getValueFromName(name, value.getValue()))
- {
- if (new_value)
- { // successfully parsed new value, let's keep it
- typed_param.mLastParseGeneration = generation;
- }
-
- typed_param.mValues.back().setValueName(name);
- typed_param.mValues.back().mKeyVersion = value.getLastChangeVersion();
- typed_param.enclosingBlock().paramChanged(param, true);
- typed_param.setProvided(true);
- return true;
- }
-
- }
- }
-
- if (new_value)
- { // failed to parse new value, pop it off
- typed_param.mValues.pop_back();
- }
-
- return false;
- }
-
- static void serializeParam(const Param& param, Parser& parser, Parser::name_stack_t& name_stack, const Param* diff_param)
- {
- const self_t& typed_param = static_cast<const self_t&>(param);
- if (!typed_param.isProvided() || name_stack.empty()) return;
-
- for (const_iterator it = typed_param.mValues.begin(), end_it = typed_param.mValues.end();
- it != end_it;
- ++it)
- {
- name_stack.back().second = parser.newParseGeneration();
-
- std::string key = it->getValueName();
- if (!key.empty() && it->mKeyVersion == it->getLastChangeVersion())
- {
- parser.writeValue(key, name_stack);
- }
- // Not parsed via named values, write out value directly
- // NOTE: currently we don't worry about removing default values in Multiple
- else
- {
- it->serializeBlock(parser, name_stack, NULL);
- }
- }
- }
-
- static void inspectParam(const Param& param, Parser& parser, Parser::name_stack_t& name_stack, S32 min_count, S32 max_count)
- {
- // I am a vector of blocks, so describe my contents recursively
- param_value_t(value_t()).inspectBlock(parser, name_stack, min_count, max_count);
- }
-
- void set(value_assignment_t val, bool flag_as_provided = true)
- {
- mValues = val;
- setProvided(flag_as_provided);
- Param::enclosingBlock().paramChanged(*this, flag_as_provided);
- }
-
- value_t& add()
- {
- mValues.push_back(value_t());
- setProvided(true);
- Param::enclosingBlock().paramChanged(*this, true);
- return mValues.back();
- }
-
- void add(const value_t& item)
- {
- mValues.push_back(item);
- setProvided(true);
- Param::enclosingBlock().paramChanged(*this, true);
- }
-
- // implicit conversion
- operator value_assignment_t() const { return mValues; }
-
- typedef typename container_t::iterator iterator;
- typedef typename container_t::const_iterator const_iterator;
- iterator begin() { return mValues.begin(); }
- iterator end() { return mValues.end(); }
- const_iterator begin() const { return mValues.begin(); }
- const_iterator end() const { return mValues.end(); }
- bool empty() const { return mValues.empty(); }
- size_t size() const { return mValues.size(); }
-
- U32 numValidElements() const
- {
- U32 count = 0;
- for (const_iterator it = mValues.begin(), end_it = mValues.end();
- it != end_it;
- ++it)
- {
- if(it->validateBlock(false)) count++;
- }
- return count;
- }
-
- protected:
-
- static bool mergeWith(Param& dst, const Param& src, bool overwrite)
- {
- const self_t& src_typed_param = static_cast<const self_t&>(src);
- self_t& dst_typed_param = static_cast<self_t&>(dst);
-
- if (overwrite)
- {
- std::copy(src_typed_param.begin(), src_typed_param.end(), std::back_inserter(dst_typed_param.mValues));
- }
- else
- {
- container_t new_values(src_typed_param.mValues);
- std::copy(dst_typed_param.begin(), dst_typed_param.end(), std::back_inserter(new_values));
- std::swap(dst_typed_param.mValues, new_values);
- }
-
- if (src_typed_param.begin() != src_typed_param.end())
- {
- dst_typed_param.setProvided(true);
- dst_typed_param.enclosingBlock().paramChanged(dst_typed_param, true);
- }
-
- return true;
- }
-
- container_t mValues;
-
- S32 mLastParseGeneration;
- };
-
- template <typename DERIVED_BLOCK>
- class Choice : public BaseBlock
- {
- typedef Choice<DERIVED_BLOCK> self_t;
- typedef Choice<DERIVED_BLOCK> enclosing_block_t;
-
- LOG_CLASS(self_t);
- public:
- // take all provided params from other and apply to self
- bool overwriteFrom(const self_t& other)
- {
- return mergeBlock(selfBlockDescriptor(), other, true);
- }
-
- // take all provided params that are not already provided, and apply to self
- bool fillFrom(const self_t& other)
- {
- return mergeBlock(selfBlockDescriptor(), other, false);
- }
-
- bool mergeBlockParam(bool param_provided, BlockDescriptor& block_data, const self_t& other, bool overwrite)
- {
- if (param_provided)
- {
- return mergeBlock(block_data, other, overwrite);
- }
- return false;
- }
-
- // merge with other block
- bool mergeBlock(BlockDescriptor& block_data, const self_t& other, bool overwrite)
- {
- mCurChoice = other.mCurChoice;
- return BaseBlock::mergeBlock(selfBlockDescriptor(), other, overwrite);
- }
-
- // clear out old choice when param has changed
- /*virtual*/ void paramChanged(const Param& changed_param, bool user_provided)
- {
- param_handle_t changed_param_handle = BaseBlock::getHandleFromParam(&changed_param);
- // if we have a new choice...
- if (changed_param_handle != mCurChoice)
- {
- // clear provided flag on previous choice
- Param* previous_choice = BaseBlock::getParamFromHandle(mCurChoice);
- if (previous_choice)
- {
- previous_choice->setProvided(false);
- }
- mCurChoice = changed_param_handle;
- }
- BaseBlock::paramChanged(changed_param, user_provided);
- }
-
- virtual const BlockDescriptor& mostDerivedBlockDescriptor() const { return selfBlockDescriptor(); }
- virtual BlockDescriptor& mostDerivedBlockDescriptor() { return selfBlockDescriptor(); }
-
- protected:
- Choice()
- : mCurChoice(0)
- {
- BaseBlock::init(selfBlockDescriptor(), BaseBlock::selfBlockDescriptor(), sizeof(DERIVED_BLOCK));
- }
-
- // Alternatives are mutually exclusive wrt other Alternatives in the same block.
- // One alternative in a block will always have isChosen() == true.
- // At most one alternative in a block will have isProvided() == true.
- template <typename T, typename NAME_VALUE_LOOKUP = TypeValues<T> >
- class Alternative : public TypedParam<T, NAME_VALUE_LOOKUP, false>
- {
- public:
- friend class Choice<DERIVED_BLOCK>;
-
- typedef Alternative<T, NAME_VALUE_LOOKUP> self_t;
- typedef TypedParam<T, NAME_VALUE_LOOKUP, false, IsBlock<ParamValue<T, NAME_VALUE_LOOKUP> >::value> super_t;
- typedef typename super_t::value_assignment_t value_assignment_t;
-
- explicit Alternative(const char* name, value_assignment_t val = defaultValue<T>())
- : super_t(DERIVED_BLOCK::selfBlockDescriptor(), name, val, NULL, 0, 1),
- mOriginalValue(val)
- {
- // assign initial choice to first declared option
- DERIVED_BLOCK* blockp = ((DERIVED_BLOCK*)DERIVED_BLOCK::selfBlockDescriptor().mCurrentBlockPtr);
- if (LL_UNLIKELY(DERIVED_BLOCK::selfBlockDescriptor().mInitializationState == BlockDescriptor::INITIALIZING))
- {
- if(blockp->mCurChoice == 0)
- {
- blockp->mCurChoice = Param::enclosingBlock().getHandleFromParam(this);
- }
- }
- }
-
- Alternative& operator=(value_assignment_t val)
- {
- super_t::set(val);
- return *this;
- }
-
- void operator()(typename super_t::value_assignment_t val)
- {
- super_t::set(val);
- }
-
- operator value_assignment_t() const
- {
- if (static_cast<enclosing_block_t&>(Param::enclosingBlock()).getCurrentChoice() == this)
- {
- return super_t::getValue();
- }
- return mOriginalValue;
- }
-
- value_assignment_t operator()() const
- {
- if (static_cast<enclosing_block_t&>(Param::enclosingBlock()).getCurrentChoice() == this)
- {
- return super_t::getValue();
- }
- return mOriginalValue;
- }
-
- bool isChosen() const
- {
- return static_cast<enclosing_block_t&>(Param::enclosingBlock()).getCurrentChoice() == this;
- }
-
- private:
- T mOriginalValue;
- };
-
- protected:
- static BlockDescriptor& selfBlockDescriptor()
- {
- static BlockDescriptor sBlockDescriptor;
- return sBlockDescriptor;
- }
-
- private:
- param_handle_t mCurChoice;
-
- const Param* getCurrentChoice() const
- {
- return BaseBlock::getParamFromHandle(mCurChoice);
- }
- };
-
- template <typename DERIVED_BLOCK, typename BASE_BLOCK = BaseBlock>
- class Block
- : public BASE_BLOCK
- {
- typedef Block<DERIVED_BLOCK, BASE_BLOCK> self_t;
- typedef Block<DERIVED_BLOCK, BASE_BLOCK> block_t;
-
- public:
- typedef BASE_BLOCK base_block_t;
-
- // take all provided params from other and apply to self
- bool overwriteFrom(const self_t& other)
- {
- return static_cast<DERIVED_BLOCK*>(this)->mergeBlock(selfBlockDescriptor(), other, true);
- }
-
- // take all provided params that are not already provided, and apply to self
- bool fillFrom(const self_t& other)
- {
- return static_cast<DERIVED_BLOCK*>(this)->mergeBlock(selfBlockDescriptor(), other, false);
- }
-
- virtual const BlockDescriptor& mostDerivedBlockDescriptor() const { return selfBlockDescriptor(); }
- virtual BlockDescriptor& mostDerivedBlockDescriptor() { return selfBlockDescriptor(); }
-
- protected:
- Block()
- {
- //#pragma message("Parsing LLInitParam::Block")
- BaseBlock::init(selfBlockDescriptor(), BASE_BLOCK::selfBlockDescriptor(), sizeof(DERIVED_BLOCK));
- }
-
- //
- // Nested classes for declaring parameters
- //
- template <typename T, typename NAME_VALUE_LOOKUP = TypeValues<T> >
- class Optional : public TypedParam<T, NAME_VALUE_LOOKUP, false>
- {
- public:
- typedef TypedParam<T, NAME_VALUE_LOOKUP, false, IsBlock<ParamValue<T, NAME_VALUE_LOOKUP> >::value> super_t;
- typedef typename super_t::value_assignment_t value_assignment_t;
-
- explicit Optional(const char* name = "", value_assignment_t val = defaultValue<T>())
- : super_t(DERIVED_BLOCK::selfBlockDescriptor(), name, val, NULL, 0, 1)
- {
- //#pragma message("Parsing LLInitParam::Block::Optional")
- }
-
- Optional& operator=(value_assignment_t val)
- {
- set(val);
- return *this;
- }
-
- DERIVED_BLOCK& operator()(value_assignment_t val)
- {
- super_t::set(val);
- return static_cast<DERIVED_BLOCK&>(Param::enclosingBlock());
- }
- using super_t::operator();
- };
-
- template <typename T, typename NAME_VALUE_LOOKUP = TypeValues<T> >
- class Mandatory : public TypedParam<T, NAME_VALUE_LOOKUP, false>
- {
- public:
- typedef TypedParam<T, NAME_VALUE_LOOKUP, false, IsBlock<ParamValue<T, NAME_VALUE_LOOKUP> >::value> super_t;
- typedef Mandatory<T, NAME_VALUE_LOOKUP> self_t;
- typedef typename super_t::value_assignment_t value_assignment_t;
-
- // mandatory parameters require a name to be parseable
- explicit Mandatory(const char* name = "", value_assignment_t val = defaultValue<T>())
- : super_t(DERIVED_BLOCK::selfBlockDescriptor(), name, val, &validate, 1, 1)
- {}
-
- Mandatory& operator=(value_assignment_t val)
- {
- set(val);
- return *this;
- }
-
- DERIVED_BLOCK& operator()(typename super_t::value_assignment_t val)
- {
- super_t::set(val);
- return static_cast<DERIVED_BLOCK&>(Param::enclosingBlock());
- }
- using super_t::operator();
-
- static bool validate(const Param* p)
- {
- // valid only if provided
- return static_cast<const self_t*>(p)->isProvided();
- }
-
- };
-
- template <typename T, typename RANGE = BaseBlock::AnyAmount, typename NAME_VALUE_LOOKUP = TypeValues<T> >
- class Multiple : public TypedParam<T, NAME_VALUE_LOOKUP, true>
- {
- public:
- typedef TypedParam<T, NAME_VALUE_LOOKUP, true, IsBlock<ParamValue<T, NAME_VALUE_LOOKUP> >::value> super_t;
- typedef Multiple<T, RANGE, NAME_VALUE_LOOKUP> self_t;
- typedef typename super_t::container_t container_t;
- typedef typename super_t::value_assignment_t value_assignment_t;
- typedef typename super_t::iterator iterator;
- typedef typename super_t::const_iterator const_iterator;
-
- explicit Multiple(const char* name = "")
- : super_t(DERIVED_BLOCK::selfBlockDescriptor(), name, container_t(), &validate, RANGE::minCount(), RANGE::maxCount())
- {}
-
- Multiple& operator=(value_assignment_t val)
- {
- set(val);
- return *this;
- }
-
- DERIVED_BLOCK& operator()(typename super_t::value_assignment_t val)
- {
- super_t::set(val);
- return static_cast<DERIVED_BLOCK&>(Param::enclosingBlock());
- }
-
- static bool validate(const Param* paramp)
- {
- U32 num_valid = ((super_t*)paramp)->numValidElements();
- return RANGE::minCount() <= num_valid && num_valid <= RANGE::maxCount();
- }
- };
-
- template <typename T, typename RANGE = BaseBlock::AnyAmount, typename NAME_VALUE_LOOKUP = TypeValues<T> >
- class Batch : private TypedParam<T, NAME_VALUE_LOOKUP, false>
- {
- public:
- typedef ParamValue<T, NAME_VALUE_LOOKUP> param_value_t;
- typedef TypedParam<T, NAME_VALUE_LOOKUP, false, IsBlock<param_value_t>::value> super_t;
- typedef Batch<T, RANGE, NAME_VALUE_LOOKUP> self_t;
- typedef typename super_t::value_assignment_t value_assignment_t;
- typedef typename super_t::value_t value_t;
-
- struct BatchDefaultValue : public ParamDescriptor::UserData
- {
- BatchDefaultValue(const T& value)
- : mValue(value)
- {}
-
- T mValue;
- };
-
- explicit Batch(const char* name, value_assignment_t val)
- : super_t(DERIVED_BLOCK::selfBlockDescriptor(), name, val, NULL, 0, 1),
- mLastParseGeneration(-1)
- {
- BlockDescriptor& block_descriptor = DERIVED_BLOCK::selfBlockDescriptor();
- if (LL_UNLIKELY(block_descriptor.mInitializationState == BlockDescriptor::INITIALIZING))
- {
- ParamDescriptorPtr param_descriptorp = block_descriptor.mCurrentBlockPtr->findParamDescriptor(*this);
-
- if (param_descriptorp)
- {
- param_descriptorp->mDeserializeFunc = &deserializeParam;
- param_descriptorp->mUserData = new BatchDefaultValue(new param_value_t(val));
- }
- }
- }
-
- explicit Batch(const char* name = "")
- : super_t(DERIVED_BLOCK::selfBlockDescriptor(), name, defaultValue<T>(), NULL, 0, 1),
- mLastParseGeneration(-1)
- {
- BlockDescriptor& block_descriptor = DERIVED_BLOCK::selfBlockDescriptor();
- if (LL_UNLIKELY(block_descriptor.mInitializationState == BlockDescriptor::INITIALIZING))
- {
- ParamDescriptorPtr param_descriptorp = block_descriptor.mCurrentBlockPtr->findParamDescriptor(*this);
-
- if (param_descriptorp)
- {
- param_descriptorp->mDeserializeFunc = &deserializeParam;
- }
- }
- }
-
- Batch& operator=(value_assignment_t val)
- {
- set(val);
- return *this;
- }
-
- DERIVED_BLOCK& operator()(value_assignment_t val)
- {
- super_t::set(val);
- return static_cast<DERIVED_BLOCK&>(Param::enclosingBlock());
- }
-
- using super_t::operator();
-
- private:
- static bool deserializeParam(Param& param, Parser& parser, const Parser::name_stack_range_t& name_stack, S32 generation)
- {
- self_t& typed_param = static_cast<self_t&>(param);
-
- if (generation != typed_param.mLastParseGeneration)
- {
- ParamDescriptorPtr descriptor = typed_param.enclosingBlock().findParamDescriptor(param);
- if (descriptor && static_cast<BatchDefaultValue*>(descriptor->mUserData))
- {
- static_cast<param_value_t&>(typed_param) = (static_cast<BatchDefaultValue*>(descriptor->mUserData))->mValue;
- }
- else
- {
- static_cast<param_value_t&>(typed_param) = param_value_t(value_t());
- }
- typed_param.mLastParseGeneration = generation;
- }
- return super_t::deserializeParam(param, parser, name_stack, generation);
- }
-
- S32 mLastParseGeneration;
- };
-
- class Deprecated : public Param
- {
- public:
- explicit Deprecated(const char* name)
- : Param(DERIVED_BLOCK::selfBlockDescriptor().mCurrentBlockPtr)
- {
- BlockDescriptor& block_descriptor = DERIVED_BLOCK::selfBlockDescriptor();
- if (LL_UNLIKELY(block_descriptor.mInitializationState == BlockDescriptor::INITIALIZING))
- {
- ParamDescriptorPtr param_descriptor = ParamDescriptorPtr(new ParamDescriptor(
- block_descriptor.mCurrentBlockPtr->getHandleFromParam(this),
- NULL,
- &deserializeParam,
- NULL,
- NULL,
- NULL,
- 0, S32_MAX));
- BaseBlock::addParam(block_descriptor, param_descriptor, name);
- }
- }
-
- static bool deserializeParam(Param& param, Parser& parser, const Parser::name_stack_range_t& name_stack, S32 generation)
- {
- if (name_stack.first == name_stack.second)
- {
- //std::string message = llformat("Deprecated value %s ignored", getName().c_str());
- //parser.parserWarning(message);
- return true;
- }
-
- return false;
- }
- };
-
- typedef Deprecated Ignored;
-
- protected:
- static BlockDescriptor& selfBlockDescriptor()
- {
- static BlockDescriptor sBlockDescriptor;
- return sBlockDescriptor;
- }
-
- template <typename T, typename NAME_VALUE_LOOKUP, bool multiple, bool is_block>
- void changeDefault(TypedParam<T, NAME_VALUE_LOOKUP, multiple, is_block>& param,
- typename TypedParam<T, NAME_VALUE_LOOKUP, multiple, is_block>::value_assignment_t value)
- {
- if (!param.isProvided())
- {
- param.set(value, false);
- }
- }
-
- };
-
- template<typename T>
- class CustomParamValue
- : public Block<ParamValue<T, TypeValues<T> > >,
- public TypeValues<T>
- {
- public:
- typedef enum e_value_age
- {
- VALUE_NEEDS_UPDATE, // mValue needs to be refreshed from the block parameters
- VALUE_AUTHORITATIVE, // mValue holds the authoritative value (which has been replicated to the block parameters via updateBlockFromValue)
- BLOCK_AUTHORITATIVE // mValue is derived from the block parameters, which are authoritative
- } EValueAge;
-
- typedef ParamValue<T, TypeValues<T> > derived_t;
- typedef CustomParamValue<T> self_t;
- typedef Block<derived_t> block_t;
- typedef const T& value_assignment_t;
-
- CustomParamValue(const T& value = T())
- : mValue(value),
- mValueAge(VALUE_AUTHORITATIVE),
- mKeyVersion(0),
- mValidatedVersion(-1),
- mValidated(false)
- {}
-
- bool deserializeBlock(Parser& parser, Parser::name_stack_range_t name_stack, S32 generation)
- {
- derived_t& typed_param = static_cast<derived_t&>(*this);
- // try to parse direct value T
- if (name_stack.first == name_stack.second)
- {
- if(parser.readValue(typed_param.mValue))
- {
- typed_param.mValueAge = VALUE_AUTHORITATIVE;
- typed_param.updateBlockFromValue(false);
-
- typed_param.clearValueName();
-
- return true;
- }
- }
-
- // fall back on parsing block components for T
- return typed_param.BaseBlock::deserializeBlock(parser, name_stack, generation);
- }
-
- void serializeBlock(Parser& parser, Parser::name_stack_t name_stack = Parser::name_stack_t(), const BaseBlock* diff_block = NULL) const
- {
- const derived_t& typed_param = static_cast<const derived_t&>(*this);
- const derived_t* diff_param = static_cast<const derived_t*>(diff_block);
-
- std::string key = typed_param.getValueName();
-
- // first try to write out name of name/value pair
- if (!key.empty())
- {
- if (!diff_param || !ParamCompare<std::string>::equals(diff_param->getValueName(), key))
- {
- parser.writeValue(key, name_stack);
- }
- }
- // then try to serialize value directly
- else if (!diff_param || !ParamCompare<T>::equals(typed_param.getValue(), diff_param->getValue()))
- {
-
- if (!parser.writeValue(typed_param.getValue(), name_stack))
- {
- //RN: *always* serialize provided components of BlockValue (don't pass diff_param on),
- // since these tend to be viewed as the constructor arguments for the value T. It seems
- // cleaner to treat the uniqueness of a BlockValue according to the generated value, and
- // not the individual components. This way <color red="0" green="1" blue="0"/> will not
- // be exported as <color green="1"/>, since it was probably the intent of the user to
- // be specific about the RGB color values. This also fixes an issue where we distinguish
- // between rect.left not being provided and rect.left being explicitly set to 0 (same as default)
-
- if (typed_param.mValueAge == VALUE_AUTHORITATIVE)
- {
- // if the value is authoritative but the parser doesn't accept the value type
- // go ahead and make a copy, and splat the value out to its component params
- // and serialize those params
- derived_t copy(typed_param);
- copy.updateBlockFromValue(true);
- copy.block_t::serializeBlock(parser, name_stack, NULL);
- }
- else
- {
- block_t::serializeBlock(parser, name_stack, NULL);
- }
- }
- }
- }
-
- bool inspectBlock(Parser& parser, Parser::name_stack_t name_stack = Parser::name_stack_t(), S32 min_count = 0, S32 max_count = S32_MAX) const
- {
- // first, inspect with actual type...
- parser.inspectValue<T>(name_stack, min_count, max_count, NULL);
- if (TypeValues<T>::getPossibleValues())
- {
- //...then inspect with possible string values...
- parser.inspectValue<std::string>(name_stack, min_count, max_count, TypeValues<T>::getPossibleValues());
- }
- // then recursively inspect contents...
- return block_t::inspectBlock(parser, name_stack, min_count, max_count);
- }
-
- bool validateBlock(bool emit_errors = true) const
- {
- if (mValueAge == VALUE_NEEDS_UPDATE)
- {
- if (block_t::validateBlock(emit_errors))
- {
- // clear stale keyword associated with old value
- TypeValues<T>::clearValueName();
- mValueAge = BLOCK_AUTHORITATIVE;
- static_cast<derived_t*>(const_cast<self_t*>(this))->updateValueFromBlock();
- return true;
- }
- else
- {
- //block value incomplete, so not considered provided
- // will attempt to revalidate on next call to isProvided()
- return false;
- }
- }
- else
- {
- // we have a valid value in hand
- return true;
- }
- }
-
- // propagate change status up to enclosing block
- /*virtual*/ void paramChanged(const Param& changed_param, bool user_provided)
- {
- BaseBlock::paramChanged(changed_param, user_provided);
- if (user_provided)
- {
- // a parameter changed, so our value is out of date
- mValueAge = VALUE_NEEDS_UPDATE;
- }
- }
-
- void setValue(value_assignment_t val)
- {
- derived_t& typed_param = static_cast<derived_t&>(*this);
- // set param version number to be up to date, so we ignore block contents
- mValueAge = VALUE_AUTHORITATIVE;
- mValue = val;
- typed_param.clearValueName();
- static_cast<derived_t*>(this)->updateBlockFromValue(false);
- }
-
- value_assignment_t getValue() const
- {
- validateBlock(true);
- return mValue;
- }
-
- T& getValue()
- {
- validateBlock(true);
- return mValue;
- }
-
- S32 mKeyVersion;
-
- protected:
-
- // use this from within updateValueFromBlock() to set the value without making it authoritative
- void updateValue(value_assignment_t value)
- {
- mValue = value;
- }
-
- bool mergeBlockParam(bool param_provided, BlockDescriptor& block_data, const BaseBlock& other, bool overwrite)
- {
- if (param_provided)
- {
- return mergeBlock(block_data, other, overwrite);
- }
- return false;
- }
-
- bool mergeBlock(BlockDescriptor& block_data, const BaseBlock& other, bool overwrite)
- {
- const derived_t& src_typed_param = static_cast<const derived_t&>(other);
-
- if (src_typed_param.mValueAge == VALUE_AUTHORITATIVE)
- {
- // copy value over
- setValue(src_typed_param.getValue());
- return true;
- }
- else
- {
- // merge individual parameters into destination
- return block_t::mergeBlock(block_t::selfBlockDescriptor(), src_typed_param, overwrite);
- }
- }
-
- mutable S32 mValidatedVersion;
- mutable bool mValidated; // lazy validation flag
-
- private:
- mutable T mValue;
- mutable EValueAge mValueAge;
- };
-}
-
-
-#endif // LL_LLPARAM_H
diff --git a/indra/llxuixml/llregistry.h b/indra/llxuixml/llregistry.h
deleted file mode 100644
index 36ce6a97b7..0000000000
--- a/indra/llxuixml/llregistry.h
+++ /dev/null
@@ -1,351 +0,0 @@
-/**
- * @file llregistry.h
- * @brief template classes for registering name, value pairs in nested scopes, statically, etc.
- *
- * $LicenseInfo:firstyear=2001&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-#ifndef LL_LLREGISTRY_H
-#define LL_LLREGISTRY_H
-
-#include <list>
-
-#include <boost/type_traits.hpp>
-#include "llsingleton.h"
-
-template <typename T>
-class LLRegistryDefaultComparator
-{
- bool operator()(const T& lhs, const T& rhs) { return lhs < rhs; }
-};
-
-template <typename KEY, typename VALUE, typename COMPARATOR = LLRegistryDefaultComparator<KEY> >
-class LLRegistry
-{
-public:
- typedef LLRegistry<KEY, VALUE, COMPARATOR> registry_t;
- typedef typename boost::add_reference<typename boost::add_const<KEY>::type>::type ref_const_key_t;
- typedef typename boost::add_reference<typename boost::add_const<VALUE>::type>::type ref_const_value_t;
- typedef typename boost::add_reference<VALUE>::type ref_value_t;
- typedef typename boost::add_pointer<typename boost::add_const<VALUE>::type>::type ptr_const_value_t;
- typedef typename boost::add_pointer<VALUE>::type ptr_value_t;
-
- class Registrar
- {
- friend class LLRegistry<KEY, VALUE, COMPARATOR>;
- public:
- typedef typename std::map<KEY, VALUE> registry_map_t;
-
- bool add(ref_const_key_t key, ref_const_value_t value)
- {
- if (mMap.insert(std::make_pair(key, value)).second == false)
- {
- llwarns << "Tried to register " << key << " but it was already registered!" << llendl;
- return false;
- }
- return true;
- }
-
- void remove(ref_const_key_t key)
- {
- mMap.erase(key);
- }
-
- void replace(ref_const_key_t key, ref_const_value_t value)
- {
- mMap[key] = value;
- }
-
- typename registry_map_t::const_iterator beginItems() const
- {
- return mMap.begin();
- }
-
- typename registry_map_t::const_iterator endItems() const
- {
- return mMap.end();
- }
-
- protected:
- ptr_value_t getValue(ref_const_key_t key)
- {
- typename registry_map_t::iterator found_it = mMap.find(key);
- if (found_it != mMap.end())
- {
- return &(found_it->second);
- }
- return NULL;
- }
-
- ptr_const_value_t getValue(ref_const_key_t key) const
- {
- typename registry_map_t::const_iterator found_it = mMap.find(key);
- if (found_it != mMap.end())
- {
- return &(found_it->second);
- }
- return NULL;
- }
-
- // if the registry is used to store pointers, and null values are valid entries
- // then use this function to check the existence of an entry
- bool exists(ref_const_key_t key) const
- {
- return mMap.find(key) != mMap.end();
- }
-
- bool empty() const
- {
- return mMap.empty();
- }
-
- protected:
- // use currentRegistrar() or defaultRegistrar()
- Registrar() {}
- ~Registrar() {}
-
- private:
- registry_map_t mMap;
- };
-
- typedef typename std::list<Registrar*> scope_list_t;
- typedef typename std::list<Registrar*>::iterator scope_list_iterator_t;
- typedef typename std::list<Registrar*>::const_iterator scope_list_const_iterator_t;
-
- LLRegistry()
- {}
-
- ~LLRegistry() {}
-
- ptr_value_t getValue(ref_const_key_t key)
- {
- for(scope_list_iterator_t it = mActiveScopes.begin();
- it != mActiveScopes.end();
- ++it)
- {
- ptr_value_t valuep = (*it)->getValue(key);
- if (valuep != NULL) return valuep;
- }
- return mDefaultRegistrar.getValue(key);
- }
-
- ptr_const_value_t getValue(ref_const_key_t key) const
- {
- for(scope_list_const_iterator_t it = mActiveScopes.begin();
- it != mActiveScopes.end();
- ++it)
- {
- ptr_value_t valuep = (*it)->getValue(key);
- if (valuep != NULL) return valuep;
- }
- return mDefaultRegistrar.getValue(key);
- }
-
- bool exists(ref_const_key_t key) const
- {
- for(scope_list_const_iterator_t it = mActiveScopes.begin();
- it != mActiveScopes.end();
- ++it)
- {
- if ((*it)->exists(key)) return true;
- }
-
- return mDefaultRegistrar.exists(key);
- }
-
- bool empty() const
- {
- for(scope_list_const_iterator_t it = mActiveScopes.begin();
- it != mActiveScopes.end();
- ++it)
- {
- if (!(*it)->empty()) return false;
- }
-
- return mDefaultRegistrar.empty();
- }
-
-
- Registrar& defaultRegistrar()
- {
- return mDefaultRegistrar;
- }
-
- const Registrar& defaultRegistrar() const
- {
- return mDefaultRegistrar;
- }
-
-
- Registrar& currentRegistrar()
- {
- if (!mActiveScopes.empty())
- {
- return *mActiveScopes.front();
- }
-
- return mDefaultRegistrar;
- }
-
- const Registrar& currentRegistrar() const
- {
- if (!mActiveScopes.empty())
- {
- return *mActiveScopes.front();
- }
-
- return mDefaultRegistrar;
- }
-
-
-protected:
- void addScope(Registrar* scope)
- {
- // newer scopes go up front
- mActiveScopes.insert(mActiveScopes.begin(), scope);
- }
-
- void removeScope(Registrar* scope)
- {
- // O(N) but should be near the beggining and N should be small and this is safer than storing iterators
- scope_list_iterator_t iter = std::find(mActiveScopes.begin(), mActiveScopes.end(), scope);
- if (iter != mActiveScopes.end())
- {
- mActiveScopes.erase(iter);
- }
- }
-
-private:
- scope_list_t mActiveScopes;
- Registrar mDefaultRegistrar;
-};
-
-template <typename KEY, typename VALUE, typename DERIVED_TYPE, typename COMPARATOR = LLRegistryDefaultComparator<KEY> >
-class LLRegistrySingleton
- : public LLRegistry<KEY, VALUE, COMPARATOR>,
- public LLSingleton<DERIVED_TYPE>
-{
- friend class LLSingleton<DERIVED_TYPE>;
-public:
- typedef LLRegistry<KEY, VALUE, COMPARATOR> registry_t;
- typedef const KEY& ref_const_key_t;
- typedef const VALUE& ref_const_value_t;
- typedef VALUE* ptr_value_t;
- typedef const VALUE* ptr_const_value_t;
- typedef LLSingleton<DERIVED_TYPE> singleton_t;
-
- class ScopedRegistrar : public registry_t::Registrar
- {
- public:
- ScopedRegistrar(bool push_scope = true)
- {
- if (push_scope)
- {
- pushScope();
- }
- }
-
- ~ScopedRegistrar()
- {
- if (!singleton_t::destroyed())
- {
- popScope();
- }
- }
-
- void pushScope()
- {
- singleton_t::instance().addScope(this);
- }
-
- void popScope()
- {
- singleton_t::instance().removeScope(this);
- }
-
- ptr_value_t getValueFromScope(ref_const_key_t key)
- {
- return getValue(key);
- }
-
- ptr_const_value_t getValueFromScope(ref_const_key_t key) const
- {
- return getValue(key);
- }
-
- private:
- typename std::list<typename registry_t::Registrar*>::iterator mListIt;
- };
-
- class StaticRegistrar : public registry_t::Registrar
- {
- public:
- virtual ~StaticRegistrar() {}
- StaticRegistrar(ref_const_key_t key, ref_const_value_t value)
- {
- singleton_t::instance().mStaticScope->add(key, value);
- }
- };
-
- // convenience functions
- typedef typename LLRegistry<KEY, VALUE, COMPARATOR>::Registrar& ref_registrar_t;
- static ref_registrar_t currentRegistrar()
- {
- return singleton_t::instance().registry_t::currentRegistrar();
- }
-
- static ref_registrar_t defaultRegistrar()
- {
- return singleton_t::instance().registry_t::defaultRegistrar();
- }
-
- static ptr_value_t getValue(ref_const_key_t key)
- {
- return singleton_t::instance().registry_t::getValue(key);
- }
-
-protected:
- // DERIVED_TYPE needs to derive from LLRegistrySingleton
- LLRegistrySingleton()
- : mStaticScope(NULL)
- {}
-
- virtual void initSingleton()
- {
- mStaticScope = new ScopedRegistrar();
- }
-
- virtual ~LLRegistrySingleton()
- {
- delete mStaticScope;
- }
-
-private:
- ScopedRegistrar* mStaticScope;
-};
-
-// helper macro for doing static registration
-#define GLUED_TOKEN(x, y) x ## y
-#define GLUE_TOKENS(x, y) GLUED_TOKEN(x, y)
-#define LLREGISTER_STATIC(REGISTRY, KEY, VALUE) static REGISTRY::StaticRegistrar GLUE_TOKENS(reg, __LINE__)(KEY, VALUE);
-
-#endif
diff --git a/indra/llxuixml/llxuiparser.cpp b/indra/llxuixml/llxuiparser.cpp
deleted file mode 100644
index 72a7bb7af5..0000000000
--- a/indra/llxuixml/llxuiparser.cpp
+++ /dev/null
@@ -1,1503 +0,0 @@
-/**
- * @file llxuiparser.cpp
- * @brief Utility functions for handling XUI structures in XML
- *
- * $LicenseInfo:firstyear=2003&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-#include "linden_common.h"
-
-#include "llxuiparser.h"
-
-#include "llxmlnode.h"
-
-#ifdef LL_STANDALONE
-#include <expat.h>
-#else
-#include "expat/expat.h"
-#endif
-
-#include <fstream>
-#include <boost/tokenizer.hpp>
-//#include <boost/spirit/include/qi.hpp>
-#include <boost/spirit/include/classic_core.hpp>
-
-#include "lluicolor.h"
-
-using namespace BOOST_SPIRIT_CLASSIC_NS;
-
-const S32 MAX_STRING_ATTRIBUTE_SIZE = 40;
-
-static LLInitParam::Parser::parser_read_func_map_t sXSDReadFuncs;
-static LLInitParam::Parser::parser_write_func_map_t sXSDWriteFuncs;
-static LLInitParam::Parser::parser_inspect_func_map_t sXSDInspectFuncs;
-
-
-//
-// LLXSDWriter
-//
-LLXSDWriter::LLXSDWriter()
-: Parser(sXSDReadFuncs, sXSDWriteFuncs, sXSDInspectFuncs)
-{
- registerInspectFunc<bool>(boost::bind(&LLXSDWriter::writeAttribute, this, "xs:boolean", _1, _2, _3, _4));
- registerInspectFunc<std::string>(boost::bind(&LLXSDWriter::writeAttribute, this, "xs:string", _1, _2, _3, _4));
- registerInspectFunc<U8>(boost::bind(&LLXSDWriter::writeAttribute, this, "xs:unsignedByte", _1, _2, _3, _4));
- registerInspectFunc<S8>(boost::bind(&LLXSDWriter::writeAttribute, this, "xs:signedByte", _1, _2, _3, _4));
- registerInspectFunc<U16>(boost::bind(&LLXSDWriter::writeAttribute, this, "xs:unsignedShort", _1, _2, _3, _4));
- registerInspectFunc<S16>(boost::bind(&LLXSDWriter::writeAttribute, this, "xs:signedShort", _1, _2, _3, _4));
- registerInspectFunc<U32>(boost::bind(&LLXSDWriter::writeAttribute, this, "xs:unsignedInt", _1, _2, _3, _4));
- registerInspectFunc<S32>(boost::bind(&LLXSDWriter::writeAttribute, this, "xs:integer", _1, _2, _3, _4));
- registerInspectFunc<F32>(boost::bind(&LLXSDWriter::writeAttribute, this, "xs:float", _1, _2, _3, _4));
- registerInspectFunc<F64>(boost::bind(&LLXSDWriter::writeAttribute, this, "xs:double", _1, _2, _3, _4));
- registerInspectFunc<LLColor4>(boost::bind(&LLXSDWriter::writeAttribute, this, "xs:string", _1, _2, _3, _4));
- registerInspectFunc<LLUIColor>(boost::bind(&LLXSDWriter::writeAttribute, this, "xs:string", _1, _2, _3, _4));
- registerInspectFunc<LLUUID>(boost::bind(&LLXSDWriter::writeAttribute, this, "xs:string", _1, _2, _3, _4));
- registerInspectFunc<LLSD>(boost::bind(&LLXSDWriter::writeAttribute, this, "xs:string", _1, _2, _3, _4));
-}
-
-void LLXSDWriter::writeXSD(const std::string& type_name, LLXMLNodePtr node, const LLInitParam::BaseBlock& block, const std::string& xml_namespace)
-{
- mSchemaNode = node;
- node->setName("xs:schema");
- node->createChild("attributeFormDefault", true)->setStringValue("unqualified");
- node->createChild("elementFormDefault", true)->setStringValue("qualified");
- node->createChild("targetNamespace", true)->setStringValue(xml_namespace);
- node->createChild("xmlns:xs", true)->setStringValue("http://www.w3.org/2001/XMLSchema");
- node->createChild("xmlns", true)->setStringValue(xml_namespace);
-
- node = node->createChild("xs:complexType", false);
- node->createChild("name", true)->setStringValue(type_name);
- node->createChild("mixed", true)->setStringValue("true");
-
- mAttributeNode = node;
- mElementNode = node->createChild("xs:choice", false);
- mElementNode->createChild("minOccurs", true)->setStringValue("0");
- mElementNode->createChild("maxOccurs", true)->setStringValue("unbounded");
- block.inspectBlock(*this);
-
- // duplicate element choices
- LLXMLNodeList children;
- mElementNode->getChildren("xs:element", children, FALSE);
- for (LLXMLNodeList::iterator child_it = children.begin(); child_it != children.end(); ++child_it)
- {
- LLXMLNodePtr child_copy = child_it->second->deepCopy();
- std::string child_name;
- child_copy->getAttributeString("name", child_name);
- child_copy->setAttributeString("name", type_name + "." + child_name);
- mElementNode->addChild(child_copy);
- }
-
- LLXMLNodePtr element_declaration_node = mSchemaNode->createChild("xs:element", false);
- element_declaration_node->createChild("name", true)->setStringValue(type_name);
- element_declaration_node->createChild("type", true)->setStringValue(type_name);
-}
-
-void LLXSDWriter::writeAttribute(const std::string& type, const Parser::name_stack_t& stack, S32 min_count, S32 max_count, const std::vector<std::string>* possible_values)
-{
- name_stack_t non_empty_names;
- std::string attribute_name;
- for (name_stack_t::const_iterator it = stack.begin();
- it != stack.end();
- ++it)
- {
- const std::string& name = it->first;
- if (!name.empty())
- {
- non_empty_names.push_back(*it);
- }
- }
-
- for (name_stack_t::const_iterator it = non_empty_names.begin();
- it != non_empty_names.end();
- ++it)
- {
- if (!attribute_name.empty())
- {
- attribute_name += ".";
- }
- attribute_name += it->first;
- }
-
- // only flag non-nested attributes as mandatory, nested attributes have variant syntax
- // that can't be properly constrained in XSD
- // e.g. <foo mandatory.value="bar"/> vs <foo><mandatory value="bar"/></foo>
- bool attribute_mandatory = min_count == 1 && max_count == 1 && non_empty_names.size() == 1;
-
- // don't bother supporting "Multiple" params as xml attributes
- if (max_count <= 1)
- {
- // add compound attribute to root node
- addAttributeToSchema(mAttributeNode, attribute_name, type, attribute_mandatory, possible_values);
- }
-
- // now generated nested elements for compound attributes
- if (non_empty_names.size() > 1 && !attribute_mandatory)
- {
- std::string element_name;
-
- // traverse all but last element, leaving that as an attribute name
- name_stack_t::const_iterator end_it = non_empty_names.end();
- end_it--;
-
- for (name_stack_t::const_iterator it = non_empty_names.begin();
- it != end_it;
- ++it)
- {
- if (it != non_empty_names.begin())
- {
- element_name += ".";
- }
- element_name += it->first;
- }
-
- std::string short_attribute_name = non_empty_names.back().first;
-
- LLXMLNodePtr complex_type_node;
-
- // find existing element node here, starting at tail of child list
- if (mElementNode->mChildren.notNull())
- {
- for(LLXMLNodePtr element = mElementNode->mChildren->tail;
- element.notNull();
- element = element->mPrev)
- {
- std::string name;
- if(element->getAttributeString("name", name) && name == element_name)
- {
- complex_type_node = element->mChildren->head;
- break;
- }
- }
- }
- //create complex_type node
- //
- //<xs:element
- // maxOccurs="1"
- // minOccurs="0"
- // name="name">
- // <xs:complexType>
- // </xs:complexType>
- //</xs:element>
- if(complex_type_node.isNull())
- {
- complex_type_node = mElementNode->createChild("xs:element", false);
-
- complex_type_node->createChild("minOccurs", true)->setIntValue(min_count);
- complex_type_node->createChild("maxOccurs", true)->setIntValue(max_count);
- complex_type_node->createChild("name", true)->setStringValue(element_name);
- complex_type_node = complex_type_node->createChild("xs:complexType", false);
- }
-
- addAttributeToSchema(complex_type_node, short_attribute_name, type, false, possible_values);
- }
-}
-
-void LLXSDWriter::addAttributeToSchema(LLXMLNodePtr type_declaration_node, const std::string& attribute_name, const std::string& type, bool mandatory, const std::vector<std::string>* possible_values)
-{
- if (!attribute_name.empty())
- {
- LLXMLNodePtr new_enum_type_node;
- if (possible_values != NULL)
- {
- // custom attribute type, for example
- //<xs:simpleType>
- // <xs:restriction
- // base="xs:string">
- // <xs:enumeration
- // value="a" />
- // <xs:enumeration
- // value="b" />
- // </xs:restriction>
- // </xs:simpleType>
- new_enum_type_node = new LLXMLNode("xs:simpleType", false);
-
- LLXMLNodePtr restriction_node = new_enum_type_node->createChild("xs:restriction", false);
- restriction_node->createChild("base", true)->setStringValue("xs:string");
-
- for (std::vector<std::string>::const_iterator it = possible_values->begin();
- it != possible_values->end();
- ++it)
- {
- LLXMLNodePtr enum_node = restriction_node->createChild("xs:enumeration", false);
- enum_node->createChild("value", true)->setStringValue(*it);
- }
- }
-
- string_set_t& attributes_written = mAttributesWritten[type_declaration_node];
-
- string_set_t::iterator found_it = attributes_written.lower_bound(attribute_name);
-
- // attribute not yet declared
- if (found_it == attributes_written.end() || attributes_written.key_comp()(attribute_name, *found_it))
- {
- attributes_written.insert(found_it, attribute_name);
-
- LLXMLNodePtr attribute_node = type_declaration_node->createChild("xs:attribute", false);
-
- // attribute name
- attribute_node->createChild("name", true)->setStringValue(attribute_name);
-
- if (new_enum_type_node.notNull())
- {
- attribute_node->addChild(new_enum_type_node);
- }
- else
- {
- // simple attribute type
- attribute_node->createChild("type", true)->setStringValue(type);
- }
-
- // required or optional
- attribute_node->createChild("use", true)->setStringValue(mandatory ? "required" : "optional");
- }
- // attribute exists...handle collision of same name attributes with potentially different types
- else
- {
- LLXMLNodePtr attribute_declaration;
- if (type_declaration_node.notNull())
- {
- for(LLXMLNodePtr node = type_declaration_node->mChildren->tail;
- node.notNull();
- node = node->mPrev)
- {
- std::string name;
- if (node->getAttributeString("name", name) && name == attribute_name)
- {
- attribute_declaration = node;
- break;
- }
- }
- }
-
- bool new_type_is_enum = new_enum_type_node.notNull();
- bool existing_type_is_enum = !attribute_declaration->hasAttribute("type");
-
- // either type is enum, revert to string in collision
- // don't bother to check for enum equivalence
- if (new_type_is_enum || existing_type_is_enum)
- {
- if (attribute_declaration->hasAttribute("type"))
- {
- attribute_declaration->setAttributeString("type", "xs:string");
- }
- else
- {
- attribute_declaration->createChild("type", true)->setStringValue("xs:string");
- }
- attribute_declaration->deleteChildren("xs:simpleType");
- }
- else
- {
- // check for collision of different standard types
- std::string existing_type;
- attribute_declaration->getAttributeString("type", existing_type);
- // if current type is not the same as the new type, revert to strnig
- if (existing_type != type)
- {
- // ...than use most general type, string
- attribute_declaration->setAttributeString("type", "string");
- }
- }
- }
- }
-}
-
-//
-// LLXUIXSDWriter
-//
-void LLXUIXSDWriter::writeXSD(const std::string& type_name, const std::string& path, const LLInitParam::BaseBlock& block)
-{
- std::string file_name(path);
- file_name += type_name + ".xsd";
- LLXMLNodePtr root_nodep = new LLXMLNode();
-
- LLXSDWriter::writeXSD(type_name, root_nodep, block, "http://www.lindenlab.com/xui");
-
- // add includes for all possible children
- const std::type_info* type = *LLWidgetTypeRegistry::instance().getValue(type_name);
- const widget_registry_t* widget_registryp = LLChildRegistryRegistry::instance().getValue(type);
-
- // add choices for valid children
- if (widget_registryp)
- {
- // add include declarations for all valid children
- for (widget_registry_t::Registrar::registry_map_t::const_iterator it = widget_registryp->currentRegistrar().beginItems();
- it != widget_registryp->currentRegistrar().endItems();
- ++it)
- {
- std::string widget_name = it->first;
- if (widget_name == type_name)
- {
- continue;
- }
- LLXMLNodePtr nodep = new LLXMLNode("xs:include", false);
- nodep->createChild("schemaLocation", true)->setStringValue(widget_name + ".xsd");
-
- // add to front of schema
- mSchemaNode->addChild(nodep, mSchemaNode);
- }
-
- for (widget_registry_t::Registrar::registry_map_t::const_iterator it = widget_registryp->currentRegistrar().beginItems();
- it != widget_registryp->currentRegistrar().endItems();
- ++it)
- {
- std::string widget_name = it->first;
- //<xs:element name="widget_name" type="widget_name">
- LLXMLNodePtr widget_node = mElementNode->createChild("xs:element", false);
- widget_node->createChild("name", true)->setStringValue(widget_name);
- widget_node->createChild("type", true)->setStringValue(widget_name);
- }
- }
-
- LLFILE* xsd_file = LLFile::fopen(file_name.c_str(), "w");
- LLXMLNode::writeHeaderToFile(xsd_file);
- root_nodep->writeToFile(xsd_file);
- fclose(xsd_file);
-}
-
-static LLInitParam::Parser::parser_read_func_map_t sXUIReadFuncs;
-static LLInitParam::Parser::parser_write_func_map_t sXUIWriteFuncs;
-static LLInitParam::Parser::parser_inspect_func_map_t sXUIInspectFuncs;
-
-//
-// LLXUIParser
-//
-LLXUIParser::LLXUIParser()
-: Parser(sXUIReadFuncs, sXUIWriteFuncs, sXUIInspectFuncs),
- mLastWriteGeneration(-1),
- mCurReadDepth(0)
-{
- if (sXUIReadFuncs.empty())
- {
- registerParserFuncs<LLInitParam::NoParamValue>(readNoValue, writeNoValue);
- registerParserFuncs<bool>(readBoolValue, writeBoolValue);
- registerParserFuncs<std::string>(readStringValue, writeStringValue);
- registerParserFuncs<U8>(readU8Value, writeU8Value);
- registerParserFuncs<S8>(readS8Value, writeS8Value);
- registerParserFuncs<U16>(readU16Value, writeU16Value);
- registerParserFuncs<S16>(readS16Value, writeS16Value);
- registerParserFuncs<U32>(readU32Value, writeU32Value);
- registerParserFuncs<S32>(readS32Value, writeS32Value);
- registerParserFuncs<F32>(readF32Value, writeF32Value);
- registerParserFuncs<F64>(readF64Value, writeF64Value);
- registerParserFuncs<LLColor4>(readColor4Value, writeColor4Value);
- registerParserFuncs<LLUIColor>(readUIColorValue, writeUIColorValue);
- registerParserFuncs<LLUUID>(readUUIDValue, writeUUIDValue);
- registerParserFuncs<LLSD>(readSDValue, writeSDValue);
- }
-}
-
-static LLFastTimer::DeclareTimer FTM_PARSE_XUI("XUI Parsing");
-const LLXMLNodePtr DUMMY_NODE = new LLXMLNode();
-
-void LLXUIParser::readXUI(LLXMLNodePtr node, LLInitParam::BaseBlock& block, const std::string& filename, bool silent)
-{
- LLFastTimer timer(FTM_PARSE_XUI);
- mNameStack.clear();
- mRootNodeName = node->getName()->mString;
- mCurFileName = filename;
- mCurReadDepth = 0;
- setParseSilently(silent);
-
- if (node.isNull())
- {
- parserWarning("Invalid node");
- }
- else
- {
- readXUIImpl(node, block);
- }
-}
-
-bool LLXUIParser::readXUIImpl(LLXMLNodePtr nodep, LLInitParam::BaseBlock& block)
-{
- typedef boost::tokenizer<boost::char_separator<char> > tokenizer;
- boost::char_separator<char> sep(".");
-
- bool values_parsed = false;
- bool silent = mCurReadDepth > 0;
-
- if (nodep->getFirstChild().isNull()
- && nodep->mAttributes.empty()
- && nodep->getSanitizedValue().empty())
- {
- // empty node, just parse as NoValue
- mCurReadNode = DUMMY_NODE;
- return block.submitValue(mNameStack, *this, silent);
- }
-
-
- // submit attributes for current node
- values_parsed |= readAttributes(nodep, block);
-
- // treat text contents of xml node as "value" parameter
- std::string text_contents = nodep->getSanitizedValue();
- if (!text_contents.empty())
- {
- mCurReadNode = nodep;
- mNameStack.push_back(std::make_pair(std::string("value"), newParseGeneration()));
- // child nodes are not necessarily valid parameters (could be a child widget)
- // so don't complain once we've recursed
- if (!block.submitValue(mNameStack, *this, true))
- {
- mNameStack.pop_back();
- block.submitValue(mNameStack, *this, silent);
- }
- else
- {
- mNameStack.pop_back();
- }
- }
-
- // then traverse children
- // child node must start with last name of parent node (our "scope")
- // for example: "<button><button.param nested_param1="foo"><param.nested_param2 nested_param3="bar"/></button.param></button>"
- // which equates to the following nesting:
- // button
- // param
- // nested_param1
- // nested_param2
- // nested_param3
- mCurReadDepth++;
- for(LLXMLNodePtr childp = nodep->getFirstChild(); childp.notNull();)
- {
- std::string child_name(childp->getName()->mString);
- S32 num_tokens_pushed = 0;
-
- // for non "dotted" child nodes check to see if child node maps to another widget type
- // and if not, treat as a child element of the current node
- // e.g. <button><rect left="10"/></button> will interpret <rect> as "button.rect"
- // since there is no widget named "rect"
- if (child_name.find(".") == std::string::npos)
- {
- mNameStack.push_back(std::make_pair(child_name, newParseGeneration()));
- num_tokens_pushed++;
- }
- else
- {
- // parse out "dotted" name into individual tokens
- tokenizer name_tokens(child_name, sep);
-
- tokenizer::iterator name_token_it = name_tokens.begin();
- if(name_token_it == name_tokens.end())
- {
- childp = childp->getNextSibling();
- continue;
- }
-
- // check for proper nesting
- if (mNameStack.empty())
- {
- if (*name_token_it != mRootNodeName)
- {
- childp = childp->getNextSibling();
- continue;
- }
- }
- else if(mNameStack.back().first != *name_token_it)
- {
- childp = childp->getNextSibling();
- continue;
- }
-
- // now ignore first token
- ++name_token_it;
-
- // copy remaining tokens on to our running token list
- for(tokenizer::iterator token_to_push = name_token_it; token_to_push != name_tokens.end(); ++token_to_push)
- {
- mNameStack.push_back(std::make_pair(*token_to_push, newParseGeneration()));
- num_tokens_pushed++;
- }
- }
-
- // recurse and visit children XML nodes
- if(readXUIImpl(childp, block))
- {
- // child node successfully parsed, remove from DOM
-
- values_parsed = true;
- LLXMLNodePtr node_to_remove = childp;
- childp = childp->getNextSibling();
-
- nodep->deleteChild(node_to_remove);
- }
- else
- {
- childp = childp->getNextSibling();
- }
-
- while(num_tokens_pushed-- > 0)
- {
- mNameStack.pop_back();
- }
- }
- mCurReadDepth--;
- return values_parsed;
-}
-
-bool LLXUIParser::readAttributes(LLXMLNodePtr nodep, LLInitParam::BaseBlock& block)
-{
- typedef boost::tokenizer<boost::char_separator<char> > tokenizer;
- boost::char_separator<char> sep(".");
-
- bool any_parsed = false;
- bool silent = mCurReadDepth > 0;
-
- for(LLXMLAttribList::const_iterator attribute_it = nodep->mAttributes.begin();
- attribute_it != nodep->mAttributes.end();
- ++attribute_it)
- {
- S32 num_tokens_pushed = 0;
- std::string attribute_name(attribute_it->first->mString);
- mCurReadNode = attribute_it->second;
-
- tokenizer name_tokens(attribute_name, sep);
- // copy remaining tokens on to our running token list
- for(tokenizer::iterator token_to_push = name_tokens.begin(); token_to_push != name_tokens.end(); ++token_to_push)
- {
- mNameStack.push_back(std::make_pair(*token_to_push, newParseGeneration()));
- num_tokens_pushed++;
- }
-
- // child nodes are not necessarily valid attributes, so don't complain once we've recursed
- any_parsed |= block.submitValue(mNameStack, *this, silent);
-
- while(num_tokens_pushed-- > 0)
- {
- mNameStack.pop_back();
- }
- }
-
- return any_parsed;
-}
-
-void LLXUIParser::writeXUI(LLXMLNodePtr node, const LLInitParam::BaseBlock &block, const LLInitParam::BaseBlock* diff_block)
-{
- mWriteRootNode = node;
- block.serializeBlock(*this, Parser::name_stack_t(), diff_block);
- mOutNodes.clear();
-}
-
-// go from a stack of names to a specific XML node
-LLXMLNodePtr LLXUIParser::getNode(const name_stack_t& stack)
-{
- name_stack_t name_stack;
- for (name_stack_t::const_iterator it = stack.begin();
- it != stack.end();
- ++it)
- {
- if (!it->first.empty())
- {
- name_stack.push_back(*it);
- }
- }
-
- LLXMLNodePtr out_node = mWriteRootNode;
-
- name_stack_t::const_iterator next_it = name_stack.begin();
- for (name_stack_t::const_iterator it = name_stack.begin();
- it != name_stack.end();
- it = next_it)
- {
- ++next_it;
- if (it->first.empty())
- {
- continue;
- }
-
- out_nodes_t::iterator found_it = mOutNodes.lower_bound(it->second);
-
- // node with this name not yet written
- if (found_it == mOutNodes.end() || mOutNodes.key_comp()(found_it->first, it->second))
- {
- // make an attribute if we are the last element on the name stack
- bool is_attribute = next_it == name_stack.end();
- LLXMLNodePtr new_node = new LLXMLNode(it->first.c_str(), is_attribute);
- out_node->addChild(new_node);
- mOutNodes.insert(found_it, std::make_pair(it->second, new_node));
- out_node = new_node;
- }
- else
- {
- out_node = found_it->second;
- }
- }
-
- return (out_node == mWriteRootNode ? LLXMLNodePtr(NULL) : out_node);
-}
-
-bool LLXUIParser::readNoValue(Parser& parser, void* val_ptr)
-{
- LLXUIParser& self = static_cast<LLXUIParser&>(parser);
- return self.mCurReadNode == DUMMY_NODE;
-}
-
-bool LLXUIParser::writeNoValue(Parser& parser, const void* val_ptr, const name_stack_t& stack)
-{
- // just create node
- LLXUIParser& self = static_cast<LLXUIParser&>(parser);
- LLXMLNodePtr node = self.getNode(stack);
- return node.notNull();
-}
-
-bool LLXUIParser::readBoolValue(Parser& parser, void* val_ptr)
-{
- S32 value;
- LLXUIParser& self = static_cast<LLXUIParser&>(parser);
- bool success = self.mCurReadNode->getBoolValue(1, &value);
- *((bool*)val_ptr) = (value != FALSE);
- return success;
-}
-
-bool LLXUIParser::writeBoolValue(Parser& parser, const void* val_ptr, const name_stack_t& stack)
-{
- LLXUIParser& self = static_cast<LLXUIParser&>(parser);
- LLXMLNodePtr node = self.getNode(stack);
- if (node.notNull())
- {
- node->setBoolValue(*((bool*)val_ptr));
- return true;
- }
- return false;
-}
-
-bool LLXUIParser::readStringValue(Parser& parser, void* val_ptr)
-{
- LLXUIParser& self = static_cast<LLXUIParser&>(parser);
- *((std::string*)val_ptr) = self.mCurReadNode->getSanitizedValue();
- return true;
-}
-
-bool LLXUIParser::writeStringValue(Parser& parser, const void* val_ptr, const name_stack_t& stack)
-{
- LLXUIParser& self = static_cast<LLXUIParser&>(parser);
- LLXMLNodePtr node = self.getNode(stack);
- if (node.notNull())
- {
- const std::string* string_val = reinterpret_cast<const std::string*>(val_ptr);
- if (string_val->find('\n') != std::string::npos
- || string_val->size() > MAX_STRING_ATTRIBUTE_SIZE)
- {
- // don't write strings with newlines into attributes
- std::string attribute_name = node->getName()->mString;
- LLXMLNodePtr parent_node = node->mParent;
- parent_node->deleteChild(node);
- // write results in text contents of node
- if (attribute_name == "value")
- {
- // "value" is implicit, just write to parent
- node = parent_node;
- }
- else
- {
- // create a child that is not an attribute, but with same name
- node = parent_node->createChild(attribute_name.c_str(), false);
- }
- }
- node->setStringValue(*string_val);
- return true;
- }
- return false;
-}
-
-bool LLXUIParser::readU8Value(Parser& parser, void* val_ptr)
-{
- LLXUIParser& self = static_cast<LLXUIParser&>(parser);
- return self.mCurReadNode->getByteValue(1, (U8*)val_ptr);
-}
-
-bool LLXUIParser::writeU8Value(Parser& parser, const void* val_ptr, const name_stack_t& stack)
-{
- LLXUIParser& self = static_cast<LLXUIParser&>(parser);
- LLXMLNodePtr node = self.getNode(stack);
- if (node.notNull())
- {
- node->setUnsignedValue(*((U8*)val_ptr));
- return true;
- }
- return false;
-}
-
-bool LLXUIParser::readS8Value(Parser& parser, void* val_ptr)
-{
- LLXUIParser& self = static_cast<LLXUIParser&>(parser);
- S32 value;
- if(self.mCurReadNode->getIntValue(1, &value))
- {
- *((S8*)val_ptr) = value;
- return true;
- }
- return false;
-}
-
-bool LLXUIParser::writeS8Value(Parser& parser, const void* val_ptr, const name_stack_t& stack)
-{
- LLXUIParser& self = static_cast<LLXUIParser&>(parser);
- LLXMLNodePtr node = self.getNode(stack);
- if (node.notNull())
- {
- node->setIntValue(*((S8*)val_ptr));
- return true;
- }
- return false;
-}
-
-bool LLXUIParser::readU16Value(Parser& parser, void* val_ptr)
-{
- LLXUIParser& self = static_cast<LLXUIParser&>(parser);
- U32 value;
- if(self.mCurReadNode->getUnsignedValue(1, &value))
- {
- *((U16*)val_ptr) = value;
- return true;
- }
- return false;
-}
-
-bool LLXUIParser::writeU16Value(Parser& parser, const void* val_ptr, const name_stack_t& stack)
-{
- LLXUIParser& self = static_cast<LLXUIParser&>(parser);
- LLXMLNodePtr node = self.getNode(stack);
- if (node.notNull())
- {
- node->setUnsignedValue(*((U16*)val_ptr));
- return true;
- }
- return false;
-}
-
-bool LLXUIParser::readS16Value(Parser& parser, void* val_ptr)
-{
- LLXUIParser& self = static_cast<LLXUIParser&>(parser);
- S32 value;
- if(self.mCurReadNode->getIntValue(1, &value))
- {
- *((S16*)val_ptr) = value;
- return true;
- }
- return false;
-}
-
-bool LLXUIParser::writeS16Value(Parser& parser, const void* val_ptr, const name_stack_t& stack)
-{
- LLXUIParser& self = static_cast<LLXUIParser&>(parser);
- LLXMLNodePtr node = self.getNode(stack);
- if (node.notNull())
- {
- node->setIntValue(*((S16*)val_ptr));
- return true;
- }
- return false;
-}
-
-bool LLXUIParser::readU32Value(Parser& parser, void* val_ptr)
-{
- LLXUIParser& self = static_cast<LLXUIParser&>(parser);
- return self.mCurReadNode->getUnsignedValue(1, (U32*)val_ptr);
-}
-
-bool LLXUIParser::writeU32Value(Parser& parser, const void* val_ptr, const name_stack_t& stack)
-{
- LLXUIParser& self = static_cast<LLXUIParser&>(parser);
- LLXMLNodePtr node = self.getNode(stack);
- if (node.notNull())
- {
- node->setUnsignedValue(*((U32*)val_ptr));
- return true;
- }
- return false;
-}
-
-bool LLXUIParser::readS32Value(Parser& parser, void* val_ptr)
-{
- LLXUIParser& self = static_cast<LLXUIParser&>(parser);
- return self.mCurReadNode->getIntValue(1, (S32*)val_ptr);
-}
-
-bool LLXUIParser::writeS32Value(Parser& parser, const void* val_ptr, const name_stack_t& stack)
-{
- LLXUIParser& self = static_cast<LLXUIParser&>(parser);
- LLXMLNodePtr node = self.getNode(stack);
- if (node.notNull())
- {
- node->setIntValue(*((S32*)val_ptr));
- return true;
- }
- return false;
-}
-
-bool LLXUIParser::readF32Value(Parser& parser, void* val_ptr)
-{
- LLXUIParser& self = static_cast<LLXUIParser&>(parser);
- return self.mCurReadNode->getFloatValue(1, (F32*)val_ptr);
-}
-
-bool LLXUIParser::writeF32Value(Parser& parser, const void* val_ptr, const name_stack_t& stack)
-{
- LLXUIParser& self = static_cast<LLXUIParser&>(parser);
- LLXMLNodePtr node = self.getNode(stack);
- if (node.notNull())
- {
- node->setFloatValue(*((F32*)val_ptr));
- return true;
- }
- return false;
-}
-
-bool LLXUIParser::readF64Value(Parser& parser, void* val_ptr)
-{
- LLXUIParser& self = static_cast<LLXUIParser&>(parser);
- return self.mCurReadNode->getDoubleValue(1, (F64*)val_ptr);
-}
-
-bool LLXUIParser::writeF64Value(Parser& parser, const void* val_ptr, const name_stack_t& stack)
-{
- LLXUIParser& self = static_cast<LLXUIParser&>(parser);
- LLXMLNodePtr node = self.getNode(stack);
- if (node.notNull())
- {
- node->setDoubleValue(*((F64*)val_ptr));
- return true;
- }
- return false;
-}
-
-bool LLXUIParser::readColor4Value(Parser& parser, void* val_ptr)
-{
- LLXUIParser& self = static_cast<LLXUIParser&>(parser);
- LLColor4* colorp = (LLColor4*)val_ptr;
- if(self.mCurReadNode->getFloatValue(4, colorp->mV) >= 3)
- {
- return true;
- }
-
- return false;
-}
-
-bool LLXUIParser::writeColor4Value(Parser& parser, const void* val_ptr, const name_stack_t& stack)
-{
- LLXUIParser& self = static_cast<LLXUIParser&>(parser);
- LLXMLNodePtr node = self.getNode(stack);
- if (node.notNull())
- {
- LLColor4 color = *((LLColor4*)val_ptr);
- node->setFloatValue(4, color.mV);
- return true;
- }
- return false;
-}
-
-bool LLXUIParser::readUIColorValue(Parser& parser, void* val_ptr)
-{
- LLXUIParser& self = static_cast<LLXUIParser&>(parser);
- LLUIColor* param = (LLUIColor*)val_ptr;
- LLColor4 color;
- bool success = self.mCurReadNode->getFloatValue(4, color.mV) >= 3;
- if (success)
- {
- param->set(color);
- return true;
- }
- return false;
-}
-
-bool LLXUIParser::writeUIColorValue(Parser& parser, const void* val_ptr, const name_stack_t& stack)
-{
- LLXUIParser& self = static_cast<LLXUIParser&>(parser);
- LLXMLNodePtr node = self.getNode(stack);
- if (node.notNull())
- {
- LLUIColor color = *((LLUIColor*)val_ptr);
- //RN: don't write out the color that is represented by a function
- // rely on param block exporting to get the reference to the color settings
- if (color.isReference()) return false;
- node->setFloatValue(4, color.get().mV);
- return true;
- }
- return false;
-}
-
-bool LLXUIParser::readUUIDValue(Parser& parser, void* val_ptr)
-{
- LLXUIParser& self = static_cast<LLXUIParser&>(parser);
- LLUUID temp_id;
- // LLUUID::set is destructive, so use temporary value
- if (temp_id.set(self.mCurReadNode->getSanitizedValue()))
- {
- *(LLUUID*)(val_ptr) = temp_id;
- return true;
- }
- return false;
-}
-
-bool LLXUIParser::writeUUIDValue(Parser& parser, const void* val_ptr, const name_stack_t& stack)
-{
- LLXUIParser& self = static_cast<LLXUIParser&>(parser);
- LLXMLNodePtr node = self.getNode(stack);
- if (node.notNull())
- {
- node->setStringValue(((LLUUID*)val_ptr)->asString());
- return true;
- }
- return false;
-}
-
-bool LLXUIParser::readSDValue(Parser& parser, void* val_ptr)
-{
- LLXUIParser& self = static_cast<LLXUIParser&>(parser);
- *((LLSD*)val_ptr) = LLSD(self.mCurReadNode->getSanitizedValue());
- return true;
-}
-
-bool LLXUIParser::writeSDValue(Parser& parser, const void* val_ptr, const name_stack_t& stack)
-{
- LLXUIParser& self = static_cast<LLXUIParser&>(parser);
-
- LLXMLNodePtr node = self.getNode(stack);
- if (node.notNull())
- {
- std::string string_val = ((LLSD*)val_ptr)->asString();
- if (string_val.find('\n') != std::string::npos || string_val.size() > MAX_STRING_ATTRIBUTE_SIZE)
- {
- // don't write strings with newlines into attributes
- std::string attribute_name = node->getName()->mString;
- LLXMLNodePtr parent_node = node->mParent;
- parent_node->deleteChild(node);
- // write results in text contents of node
- if (attribute_name == "value")
- {
- // "value" is implicit, just write to parent
- node = parent_node;
- }
- else
- {
- node = parent_node->createChild(attribute_name.c_str(), false);
- }
- }
-
- node->setStringValue(string_val);
- return true;
- }
- return false;
-}
-
-/*virtual*/ std::string LLXUIParser::getCurrentElementName()
-{
- std::string full_name;
- for (name_stack_t::iterator it = mNameStack.begin();
- it != mNameStack.end();
- ++it)
- {
- full_name += it->first + "."; // build up dotted names: "button.param.nestedparam."
- }
-
- return full_name;
-}
-
-void LLXUIParser::parserWarning(const std::string& message)
-{
-#ifdef LL_WINDOWS
- // use Visual Studo friendly formatting of output message for easy access to originating xml
- llutf16string utf16str = utf8str_to_utf16str(llformat("%s(%d):\t%s", mCurFileName.c_str(), mCurReadNode->getLineNumber(), message.c_str()).c_str());
- utf16str += '\n';
- OutputDebugString(utf16str.c_str());
-#else
- Parser::parserWarning(message);
-#endif
-}
-
-void LLXUIParser::parserError(const std::string& message)
-{
-#ifdef LL_WINDOWS
- llutf16string utf16str = utf8str_to_utf16str(llformat("%s(%d):\t%s", mCurFileName.c_str(), mCurReadNode->getLineNumber(), message.c_str()).c_str());
- utf16str += '\n';
- OutputDebugString(utf16str.c_str());
-#else
- Parser::parserError(message);
-#endif
-}
-
-
-//
-// LLSimpleXUIParser
-//
-
-struct ScopedFile
-{
- ScopedFile( const std::string& filename, const char* accessmode )
- {
- mFile = LLFile::fopen(filename, accessmode);
- }
-
- ~ScopedFile()
- {
- fclose(mFile);
- mFile = NULL;
- }
-
- S32 getRemainingBytes()
- {
- if (!isOpen()) return 0;
-
- S32 cur_pos = ftell(mFile);
- fseek(mFile, 0L, SEEK_END);
- S32 file_size = ftell(mFile);
- fseek(mFile, cur_pos, SEEK_SET);
- return file_size - cur_pos;
- }
-
- bool isOpen() { return mFile != NULL; }
-
- LLFILE* mFile;
-};
-static LLInitParam::Parser::parser_read_func_map_t sSimpleXUIReadFuncs;
-static LLInitParam::Parser::parser_write_func_map_t sSimpleXUIWriteFuncs;
-static LLInitParam::Parser::parser_inspect_func_map_t sSimpleXUIInspectFuncs;
-
-const char* NO_VALUE_MARKER = "no_value";
-
-LLSimpleXUIParser::LLSimpleXUIParser(LLSimpleXUIParser::element_start_callback_t element_cb)
-: Parser(sSimpleXUIReadFuncs, sSimpleXUIWriteFuncs, sSimpleXUIInspectFuncs),
- mLastWriteGeneration(-1),
- mCurReadDepth(0),
- mElementCB(element_cb)
-{
- if (sSimpleXUIReadFuncs.empty())
- {
- registerParserFuncs<LLInitParam::NoParamValue>(readNoValue);
- registerParserFuncs<bool>(readBoolValue);
- registerParserFuncs<std::string>(readStringValue);
- registerParserFuncs<U8>(readU8Value);
- registerParserFuncs<S8>(readS8Value);
- registerParserFuncs<U16>(readU16Value);
- registerParserFuncs<S16>(readS16Value);
- registerParserFuncs<U32>(readU32Value);
- registerParserFuncs<S32>(readS32Value);
- registerParserFuncs<F32>(readF32Value);
- registerParserFuncs<F64>(readF64Value);
- registerParserFuncs<LLColor4>(readColor4Value);
- registerParserFuncs<LLUIColor>(readUIColorValue);
- registerParserFuncs<LLUUID>(readUUIDValue);
- registerParserFuncs<LLSD>(readSDValue);
- }
-}
-
-LLSimpleXUIParser::~LLSimpleXUIParser()
-{
-}
-
-
-bool LLSimpleXUIParser::readXUI(const std::string& filename, LLInitParam::BaseBlock& block, bool silent)
-{
- LLFastTimer timer(FTM_PARSE_XUI);
-
- mParser = XML_ParserCreate(NULL);
- XML_SetUserData(mParser, this);
- XML_SetElementHandler( mParser, startElementHandler, endElementHandler);
- XML_SetCharacterDataHandler( mParser, characterDataHandler);
-
- mOutputStack.push_back(std::make_pair(&block, 0));
- mNameStack.clear();
- mCurFileName = filename;
- mCurReadDepth = 0;
- setParseSilently(silent);
-
- ScopedFile file(filename, "rb");
- if( !file.isOpen() )
- {
- LL_WARNS("ReadXUI") << "Unable to open file " << filename << LL_ENDL;
- return false;
- }
-
- S32 bytes_read = 0;
-
- S32 buffer_size = file.getRemainingBytes();
- void* buffer = XML_GetBuffer(mParser, buffer_size);
- if( !buffer )
- {
- LL_WARNS("ReadXUI") << "Unable to allocate XML buffer while reading file " << filename << LL_ENDL;
- XML_ParserFree( mParser );
- return false;
- }
-
- bytes_read = (S32)fread(buffer, 1, buffer_size, file.mFile);
- if( bytes_read <= 0 )
- {
- LL_WARNS("ReadXUI") << "Error while reading file " << filename << LL_ENDL;
- XML_ParserFree( mParser );
- return false;
- }
-
- mEmptyLeafNode.push_back(false);
-
- if( !XML_ParseBuffer(mParser, bytes_read, TRUE ) )
- {
- LL_WARNS("ReadXUI") << "Error while parsing file " << filename << LL_ENDL;
- XML_ParserFree( mParser );
- return false;
- }
-
- mEmptyLeafNode.pop_back();
-
- XML_ParserFree( mParser );
- return true;
-}
-
-void LLSimpleXUIParser::startElementHandler(void *userData, const char *name, const char **atts)
-{
- LLSimpleXUIParser* self = reinterpret_cast<LLSimpleXUIParser*>(userData);
- self->startElement(name, atts);
-}
-
-void LLSimpleXUIParser::endElementHandler(void *userData, const char *name)
-{
- LLSimpleXUIParser* self = reinterpret_cast<LLSimpleXUIParser*>(userData);
- self->endElement(name);
-}
-
-void LLSimpleXUIParser::characterDataHandler(void *userData, const char *s, int len)
-{
- LLSimpleXUIParser* self = reinterpret_cast<LLSimpleXUIParser*>(userData);
- self->characterData(s, len);
-}
-
-void LLSimpleXUIParser::startElement(const char *name, const char **atts)
-{
- processText();
-
- typedef boost::tokenizer<boost::char_separator<char> > tokenizer;
- boost::char_separator<char> sep(".");
-
- if (mElementCB)
- {
- LLInitParam::BaseBlock* blockp = mElementCB(*this, name);
- if (blockp)
- {
- mOutputStack.push_back(std::make_pair(blockp, 0));
- }
- }
-
- mOutputStack.back().second++;
- S32 num_tokens_pushed = 0;
- std::string child_name(name);
-
- if (mOutputStack.back().second == 1)
- { // root node for this block
- mScope.push_back(child_name);
- }
- else
- { // compound attribute
- if (child_name.find(".") == std::string::npos)
- {
- mNameStack.push_back(std::make_pair(child_name, newParseGeneration()));
- num_tokens_pushed++;
- mScope.push_back(child_name);
- }
- else
- {
- // parse out "dotted" name into individual tokens
- tokenizer name_tokens(child_name, sep);
-
- tokenizer::iterator name_token_it = name_tokens.begin();
- if(name_token_it == name_tokens.end())
- {
- return;
- }
-
- // check for proper nesting
- if(!mScope.empty() && *name_token_it != mScope.back())
- {
- return;
- }
-
- // now ignore first token
- ++name_token_it;
-
- // copy remaining tokens on to our running token list
- for(tokenizer::iterator token_to_push = name_token_it; token_to_push != name_tokens.end(); ++token_to_push)
- {
- mNameStack.push_back(std::make_pair(*token_to_push, newParseGeneration()));
- num_tokens_pushed++;
- }
- mScope.push_back(mNameStack.back().first);
- }
- }
-
- // parent node is not empty
- mEmptyLeafNode.back() = false;
- // we are empty if we have no attributes
- mEmptyLeafNode.push_back(atts[0] == NULL);
-
- mTokenSizeStack.push_back(num_tokens_pushed);
- readAttributes(atts);
-
-}
-
-bool LLSimpleXUIParser::readAttributes(const char **atts)
-{
- typedef boost::tokenizer<boost::char_separator<char> > tokenizer;
- boost::char_separator<char> sep(".");
-
- bool any_parsed = false;
- for(S32 i = 0; atts[i] && atts[i+1]; i += 2 )
- {
- std::string attribute_name(atts[i]);
- mCurAttributeValueBegin = atts[i+1];
-
- S32 num_tokens_pushed = 0;
- tokenizer name_tokens(attribute_name, sep);
- // copy remaining tokens on to our running token list
- for(tokenizer::iterator token_to_push = name_tokens.begin(); token_to_push != name_tokens.end(); ++token_to_push)
- {
- mNameStack.push_back(std::make_pair(*token_to_push, newParseGeneration()));
- num_tokens_pushed++;
- }
-
- // child nodes are not necessarily valid attributes, so don't complain once we've recursed
- any_parsed |= mOutputStack.back().first->submitValue(mNameStack, *this, mParseSilently);
-
- while(num_tokens_pushed-- > 0)
- {
- mNameStack.pop_back();
- }
- }
- return any_parsed;
-}
-
-bool LLSimpleXUIParser::processText()
-{
- if (!mTextContents.empty())
- {
- LLStringUtil::trim(mTextContents);
- if (!mTextContents.empty())
- {
- mNameStack.push_back(std::make_pair(std::string("value"), newParseGeneration()));
- mCurAttributeValueBegin = mTextContents.c_str();
- mOutputStack.back().first->submitValue(mNameStack, *this, mParseSilently);
- mNameStack.pop_back();
- }
- mTextContents.clear();
- return true;
- }
- return false;
-}
-
-void LLSimpleXUIParser::endElement(const char *name)
-{
- bool has_text = processText();
-
- // no text, attributes, or children
- if (!has_text && mEmptyLeafNode.back())
- {
- // submit this as a valueless name (even though there might be text contents we haven't seen yet)
- mCurAttributeValueBegin = NO_VALUE_MARKER;
- mOutputStack.back().first->submitValue(mNameStack, *this, mParseSilently);
- }
-
- if (--mOutputStack.back().second == 0)
- {
- if (mOutputStack.empty())
- {
- LL_ERRS("ReadXUI") << "Parameter block output stack popped while empty." << LL_ENDL;
- }
- mOutputStack.pop_back();
- }
-
- S32 num_tokens_to_pop = mTokenSizeStack.back();
- mTokenSizeStack.pop_back();
- while(num_tokens_to_pop-- > 0)
- {
- mNameStack.pop_back();
- }
- mScope.pop_back();
- mEmptyLeafNode.pop_back();
-}
-
-void LLSimpleXUIParser::characterData(const char *s, int len)
-{
- mTextContents += std::string(s, len);
-}
-
-
-/*virtual*/ std::string LLSimpleXUIParser::getCurrentElementName()
-{
- std::string full_name;
- for (name_stack_t::iterator it = mNameStack.begin();
- it != mNameStack.end();
- ++it)
- {
- full_name += it->first + "."; // build up dotted names: "button.param.nestedparam."
- }
-
- return full_name;
-}
-
-const S32 LINE_NUMBER_HERE = 0;
-
-void LLSimpleXUIParser::parserWarning(const std::string& message)
-{
-#ifdef LL_WINDOWS
- // use Visual Studo friendly formatting of output message for easy access to originating xml
- llutf16string utf16str = utf8str_to_utf16str(llformat("%s(%d):\t%s", mCurFileName.c_str(), LINE_NUMBER_HERE, message.c_str()).c_str());
- utf16str += '\n';
- OutputDebugString(utf16str.c_str());
-#else
- Parser::parserWarning(message);
-#endif
-}
-
-void LLSimpleXUIParser::parserError(const std::string& message)
-{
-#ifdef LL_WINDOWS
- llutf16string utf16str = utf8str_to_utf16str(llformat("%s(%d):\t%s", mCurFileName.c_str(), LINE_NUMBER_HERE, message.c_str()).c_str());
- utf16str += '\n';
- OutputDebugString(utf16str.c_str());
-#else
- Parser::parserError(message);
-#endif
-}
-
-bool LLSimpleXUIParser::readNoValue(Parser& parser, void* val_ptr)
-{
- LLSimpleXUIParser& self = static_cast<LLSimpleXUIParser&>(parser);
- return self.mCurAttributeValueBegin == NO_VALUE_MARKER;
-}
-
-bool LLSimpleXUIParser::readBoolValue(Parser& parser, void* val_ptr)
-{
- LLSimpleXUIParser& self = static_cast<LLSimpleXUIParser&>(parser);
- if (!strcmp(self.mCurAttributeValueBegin, "true"))
- {
- *((bool*)val_ptr) = true;
- return true;
- }
- else if (!strcmp(self.mCurAttributeValueBegin, "false"))
- {
- *((bool*)val_ptr) = false;
- return true;
- }
-
- return false;
-}
-
-bool LLSimpleXUIParser::readStringValue(Parser& parser, void* val_ptr)
-{
- LLSimpleXUIParser& self = static_cast<LLSimpleXUIParser&>(parser);
- *((std::string*)val_ptr) = self.mCurAttributeValueBegin;
- return true;
-}
-
-bool LLSimpleXUIParser::readU8Value(Parser& parser, void* val_ptr)
-{
- LLSimpleXUIParser& self = static_cast<LLSimpleXUIParser&>(parser);
- return parse(self.mCurAttributeValueBegin, uint_p[assign_a(*(U8*)val_ptr)]).full;
-}
-
-bool LLSimpleXUIParser::readS8Value(Parser& parser, void* val_ptr)
-{
- LLSimpleXUIParser& self = static_cast<LLSimpleXUIParser&>(parser);
- return parse(self.mCurAttributeValueBegin, int_p[assign_a(*(S8*)val_ptr)]).full;
-}
-
-bool LLSimpleXUIParser::readU16Value(Parser& parser, void* val_ptr)
-{
- LLSimpleXUIParser& self = static_cast<LLSimpleXUIParser&>(parser);
- return parse(self.mCurAttributeValueBegin, uint_p[assign_a(*(U16*)val_ptr)]).full;
-}
-
-bool LLSimpleXUIParser::readS16Value(Parser& parser, void* val_ptr)
-{
- LLSimpleXUIParser& self = static_cast<LLSimpleXUIParser&>(parser);
- return parse(self.mCurAttributeValueBegin, int_p[assign_a(*(S16*)val_ptr)]).full;
-}
-
-bool LLSimpleXUIParser::readU32Value(Parser& parser, void* val_ptr)
-{
- LLSimpleXUIParser& self = static_cast<LLSimpleXUIParser&>(parser);
- return parse(self.mCurAttributeValueBegin, uint_p[assign_a(*(U32*)val_ptr)]).full;
-}
-
-bool LLSimpleXUIParser::readS32Value(Parser& parser, void* val_ptr)
-{
- LLSimpleXUIParser& self = static_cast<LLSimpleXUIParser&>(parser);
- return parse(self.mCurAttributeValueBegin, int_p[assign_a(*(S32*)val_ptr)]).full;
-}
-
-bool LLSimpleXUIParser::readF32Value(Parser& parser, void* val_ptr)
-{
- LLSimpleXUIParser& self = static_cast<LLSimpleXUIParser&>(parser);
- return parse(self.mCurAttributeValueBegin, real_p[assign_a(*(F32*)val_ptr)]).full;
-}
-
-bool LLSimpleXUIParser::readF64Value(Parser& parser, void* val_ptr)
-{
- LLSimpleXUIParser& self = static_cast<LLSimpleXUIParser&>(parser);
- return parse(self.mCurAttributeValueBegin, real_p[assign_a(*(F64*)val_ptr)]).full;
-}
-
-bool LLSimpleXUIParser::readColor4Value(Parser& parser, void* val_ptr)
-{
- LLSimpleXUIParser& self = static_cast<LLSimpleXUIParser&>(parser);
- LLColor4 value;
-
- if (parse(self.mCurAttributeValueBegin, real_p[assign_a(value.mV[0])] >> real_p[assign_a(value.mV[1])] >> real_p[assign_a(value.mV[2])] >> real_p[assign_a(value.mV[3])], space_p).full)
- {
- *(LLColor4*)(val_ptr) = value;
- return true;
- }
- return false;
-}
-
-bool LLSimpleXUIParser::readUIColorValue(Parser& parser, void* val_ptr)
-{
- LLSimpleXUIParser& self = static_cast<LLSimpleXUIParser&>(parser);
- LLColor4 value;
- LLUIColor* colorp = (LLUIColor*)val_ptr;
-
- if (parse(self.mCurAttributeValueBegin, real_p[assign_a(value.mV[0])] >> real_p[assign_a(value.mV[1])] >> real_p[assign_a(value.mV[2])] >> real_p[assign_a(value.mV[3])], space_p).full)
- {
- colorp->set(value);
- return true;
- }
- return false;
-}
-
-bool LLSimpleXUIParser::readUUIDValue(Parser& parser, void* val_ptr)
-{
- LLSimpleXUIParser& self = static_cast<LLSimpleXUIParser&>(parser);
- LLUUID temp_id;
- // LLUUID::set is destructive, so use temporary value
- if (temp_id.set(std::string(self.mCurAttributeValueBegin)))
- {
- *(LLUUID*)(val_ptr) = temp_id;
- return true;
- }
- return false;
-}
-
-bool LLSimpleXUIParser::readSDValue(Parser& parser, void* val_ptr)
-{
- LLSimpleXUIParser& self = static_cast<LLSimpleXUIParser&>(parser);
- *((LLSD*)val_ptr) = LLSD(self.mCurAttributeValueBegin);
- return true;
-}
diff --git a/indra/llxuixml/llxuiparser.h b/indra/llxuixml/llxuiparser.h
deleted file mode 100644
index 0c38c4da93..0000000000
--- a/indra/llxuixml/llxuiparser.h
+++ /dev/null
@@ -1,244 +0,0 @@
-/**
- * @file llxuiparser.h
- * @brief Utility functions for handling XUI structures in XML
- *
- * $LicenseInfo:firstyear=2003&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-#ifndef LLXUIPARSER_H
-#define LLXUIPARSER_H
-
-#include "llinitparam.h"
-#include "llregistry.h"
-#include "llpointer.h"
-
-#include <boost/function.hpp>
-#include <iosfwd>
-#include <stack>
-#include <set>
-
-
-
-class LLView;
-
-
-typedef LLPointer<class LLXMLNode> LLXMLNodePtr;
-
-
-// lookup widget type by name
-class LLWidgetTypeRegistry
-: public LLRegistrySingleton<std::string, const std::type_info*, LLWidgetTypeRegistry>
-{};
-
-
-// global static instance for registering all widget types
-typedef boost::function<LLView* (LLXMLNodePtr node, LLView *parent, LLXMLNodePtr output_node)> LLWidgetCreatorFunc;
-
-typedef LLRegistry<std::string, LLWidgetCreatorFunc> widget_registry_t;
-
-class LLChildRegistryRegistry
-: public LLRegistrySingleton<const std::type_info*, widget_registry_t, LLChildRegistryRegistry>
-{};
-
-
-
-class LLXSDWriter : public LLInitParam::Parser
-{
- LOG_CLASS(LLXSDWriter);
-public:
- void writeXSD(const std::string& name, LLXMLNodePtr node, const LLInitParam::BaseBlock& block, const std::string& xml_namespace);
-
- /*virtual*/ std::string getCurrentElementName() { return LLStringUtil::null; }
-
- LLXSDWriter();
-
-protected:
- void writeAttribute(const std::string& type, const Parser::name_stack_t&, S32 min_count, S32 max_count, const std::vector<std::string>* possible_values);
- void addAttributeToSchema(LLXMLNodePtr nodep, const std::string& attribute_name, const std::string& type, bool mandatory, const std::vector<std::string>* possible_values);
- LLXMLNodePtr mAttributeNode;
- LLXMLNodePtr mElementNode;
- LLXMLNodePtr mSchemaNode;
-
- typedef std::set<std::string> string_set_t;
- typedef std::map<LLXMLNodePtr, string_set_t> attributes_map_t;
- attributes_map_t mAttributesWritten;
-};
-
-
-
-// NOTE: DOES NOT WORK YET
-// should support child widgets for XUI
-class LLXUIXSDWriter : public LLXSDWriter
-{
-public:
- void writeXSD(const std::string& name, const std::string& path, const LLInitParam::BaseBlock& block);
-};
-
-
-class LLXUIParserImpl;
-
-class LLXUIParser : public LLInitParam::Parser
-{
-LOG_CLASS(LLXUIParser);
-
-public:
- LLXUIParser();
- typedef LLInitParam::Parser::name_stack_t name_stack_t;
-
- /*virtual*/ std::string getCurrentElementName();
- /*virtual*/ void parserWarning(const std::string& message);
- /*virtual*/ void parserError(const std::string& message);
-
- void readXUI(LLXMLNodePtr node, LLInitParam::BaseBlock& block, const std::string& filename = LLStringUtil::null, bool silent=false);
- void writeXUI(LLXMLNodePtr node, const LLInitParam::BaseBlock& block, const LLInitParam::BaseBlock* diff_block = NULL);
-
-private:
- bool readXUIImpl(LLXMLNodePtr node, LLInitParam::BaseBlock& block);
- bool readAttributes(LLXMLNodePtr nodep, LLInitParam::BaseBlock& block);
-
- //reader helper functions
- static bool readNoValue(Parser& parser, void* val_ptr);
- static bool readBoolValue(Parser& parser, void* val_ptr);
- static bool readStringValue(Parser& parser, void* val_ptr);
- static bool readU8Value(Parser& parser, void* val_ptr);
- static bool readS8Value(Parser& parser, void* val_ptr);
- static bool readU16Value(Parser& parser, void* val_ptr);
- static bool readS16Value(Parser& parser, void* val_ptr);
- static bool readU32Value(Parser& parser, void* val_ptr);
- static bool readS32Value(Parser& parser, void* val_ptr);
- static bool readF32Value(Parser& parser, void* val_ptr);
- static bool readF64Value(Parser& parser, void* val_ptr);
- static bool readColor4Value(Parser& parser, void* val_ptr);
- static bool readUIColorValue(Parser& parser, void* val_ptr);
- static bool readUUIDValue(Parser& parser, void* val_ptr);
- static bool readSDValue(Parser& parser, void* val_ptr);
-
- //writer helper functions
- static bool writeNoValue(Parser& parser, const void* val_ptr, const name_stack_t&);
- static bool writeBoolValue(Parser& parser, const void* val_ptr, const name_stack_t&);
- static bool writeStringValue(Parser& parser, const void* val_ptr, const name_stack_t&);
- static bool writeU8Value(Parser& parser, const void* val_ptr, const name_stack_t&);
- static bool writeS8Value(Parser& parser, const void* val_ptr, const name_stack_t&);
- static bool writeU16Value(Parser& parser, const void* val_ptr, const name_stack_t&);
- static bool writeS16Value(Parser& parser, const void* val_ptr, const name_stack_t&);
- static bool writeU32Value(Parser& parser, const void* val_ptr, const name_stack_t&);
- static bool writeS32Value(Parser& parser, const void* val_ptr, const name_stack_t&);
- static bool writeF32Value(Parser& parser, const void* val_ptr, const name_stack_t&);
- static bool writeF64Value(Parser& parser, const void* val_ptr, const name_stack_t&);
- static bool writeColor4Value(Parser& parser, const void* val_ptr, const name_stack_t&);
- static bool writeUIColorValue(Parser& parser, const void* val_ptr, const name_stack_t&);
- static bool writeUUIDValue(Parser& parser, const void* val_ptr, const name_stack_t&);
- static bool writeSDValue(Parser& parser, const void* val_ptr, const name_stack_t&);
-
- LLXMLNodePtr getNode(const name_stack_t& stack);
-
-private:
- Parser::name_stack_t mNameStack;
- LLXMLNodePtr mCurReadNode;
- // Root of the widget XML sub-tree, for example, "line_editor"
- LLXMLNodePtr mWriteRootNode;
-
- typedef std::map<S32, LLXMLNodePtr> out_nodes_t;
- out_nodes_t mOutNodes;
- S32 mLastWriteGeneration;
- LLXMLNodePtr mLastWrittenChild;
- S32 mCurReadDepth;
- std::string mCurFileName;
- std::string mRootNodeName;
-};
-
-// LLSimpleXUIParser is a streamlined SAX-based XUI parser that does not support localization
-// or parsing of a tree of independent param blocks, such as child widgets.
-// Use this for reading non-localized files that only need a single param block as a result.
-//
-// NOTE: In order to support nested block parsing, we need callbacks for start element that
-// push new blocks contexts on the mScope stack.
-// NOTE: To support localization without building a DOM, we need to enforce consistent
-// ordering of child elements from base file to localized diff file. Then we can use a pair
-// of coroutines to perform matching of xml nodes during parsing. Not sure if the overhead
-// of coroutines would offset the gain from SAX parsing
-class LLSimpleXUIParserImpl;
-
-class LLSimpleXUIParser : public LLInitParam::Parser
-{
-LOG_CLASS(LLSimpleXUIParser);
-public:
- typedef LLInitParam::Parser::name_stack_t name_stack_t;
- typedef LLInitParam::BaseBlock* (*element_start_callback_t)(LLSimpleXUIParser&, const char* block_name);
-
- LLSimpleXUIParser(element_start_callback_t element_cb = NULL);
- virtual ~LLSimpleXUIParser();
-
- /*virtual*/ std::string getCurrentElementName();
- /*virtual*/ void parserWarning(const std::string& message);
- /*virtual*/ void parserError(const std::string& message);
-
- bool readXUI(const std::string& filename, LLInitParam::BaseBlock& block, bool silent=false);
-
-
-private:
- //reader helper functions
- static bool readNoValue(Parser&, void* val_ptr);
- static bool readBoolValue(Parser&, void* val_ptr);
- static bool readStringValue(Parser&, void* val_ptr);
- static bool readU8Value(Parser&, void* val_ptr);
- static bool readS8Value(Parser&, void* val_ptr);
- static bool readU16Value(Parser&, void* val_ptr);
- static bool readS16Value(Parser&, void* val_ptr);
- static bool readU32Value(Parser&, void* val_ptr);
- static bool readS32Value(Parser&, void* val_ptr);
- static bool readF32Value(Parser&, void* val_ptr);
- static bool readF64Value(Parser&, void* val_ptr);
- static bool readColor4Value(Parser&, void* val_ptr);
- static bool readUIColorValue(Parser&, void* val_ptr);
- static bool readUUIDValue(Parser&, void* val_ptr);
- static bool readSDValue(Parser&, void* val_ptr);
-
-private:
- static void startElementHandler(void *userData, const char *name, const char **atts);
- static void endElementHandler(void *userData, const char *name);
- static void characterDataHandler(void *userData, const char *s, int len);
-
- void startElement(const char *name, const char **atts);
- void endElement(const char *name);
- void characterData(const char *s, int len);
- bool readAttributes(const char **atts);
- bool processText();
-
- Parser::name_stack_t mNameStack;
- struct XML_ParserStruct* mParser;
- S32 mLastWriteGeneration;
- LLXMLNodePtr mLastWrittenChild;
- S32 mCurReadDepth;
- std::string mCurFileName;
- std::string mTextContents;
- const char* mCurAttributeValueBegin;
- std::vector<S32> mTokenSizeStack;
- std::vector<std::string> mScope;
- std::vector<bool> mEmptyLeafNode;
- element_start_callback_t mElementCB;
-
- std::vector<std::pair<LLInitParam::BaseBlock*, S32> > mOutputStack;
-};
-
-
-#endif //LLXUIPARSER_H
diff --git a/indra/mac_crash_logger/llcrashloggermac.cpp b/indra/mac_crash_logger/llcrashloggermac.cpp
index b555e92b96..8f1c1a2dd0 100644
--- a/indra/mac_crash_logger/llcrashloggermac.cpp
+++ b/indra/mac_crash_logger/llcrashloggermac.cpp
@@ -249,5 +249,6 @@ void LLCrashLoggerMac::updateApplication(const std::string& message)
bool LLCrashLoggerMac::cleanup()
{
+ commonCleanup();
return true;
}
diff --git a/indra/media_plugins/gstreamer010/llmediaimplgstreamer.h b/indra/media_plugins/gstreamer010/llmediaimplgstreamer.h
index 77d6d19663..6bc272c009 100644
--- a/indra/media_plugins/gstreamer010/llmediaimplgstreamer.h
+++ b/indra/media_plugins/gstreamer010/llmediaimplgstreamer.h
@@ -37,6 +37,7 @@ extern "C" {
#include <stdio.h>
#include <gst/gst.h>
+#include "apr_pools.h"
#include "apr_dso.h"
}
diff --git a/indra/media_plugins/gstreamer010/llmediaimplgstreamer_syms.cpp b/indra/media_plugins/gstreamer010/llmediaimplgstreamer_syms.cpp
index 93a10424dd..2e4baaa9eb 100644
--- a/indra/media_plugins/gstreamer010/llmediaimplgstreamer_syms.cpp
+++ b/indra/media_plugins/gstreamer010/llmediaimplgstreamer_syms.cpp
@@ -28,18 +28,16 @@
#if LL_GSTREAMER010_ENABLED
-#include "linden_common.h"
-
#include <string>
extern "C" {
#include <gst/gst.h>
+#include "apr_pools.h"
#include "apr_dso.h"
}
#include "llmediaimplgstreamertriviallogging.h"
-#include "llaprpool.h"
#define LL_GST_SYM(REQ, GSTSYM, RTN, ...) RTN (*ll##GSTSYM)(__VA_ARGS__) = NULL
#include "llmediaimplgstreamer_syms_raw.inc"
@@ -58,7 +56,7 @@ void ll_gst_debug_register_funcptr(GstDebugFuncPtr func, gchar* ptrname)
}
static bool sSymsGrabbed = false;
-static LLAPRPool sSymGSTDSOMemoryPool;
+static apr_pool_t *sSymGSTDSOMemoryPool = NULL;
static apr_dso_handle_t *sSymGSTDSOHandleG = NULL;
static apr_dso_handle_t *sSymGSTDSOHandleV = NULL;
@@ -80,11 +78,11 @@ bool grab_gst_syms(std::string gst_dso_name,
#define LL_GST_SYM(REQ, GSTSYM, RTN, ...) do{rv = apr_dso_sym((apr_dso_handle_sym_t*)&ll##GSTSYM, sSymGSTDSOHandle, #GSTSYM); if (rv != APR_SUCCESS) {INFOMSG("Failed to grab symbol: %s", #GSTSYM); if (REQ) sym_error = true;} else DEBUGMSG("grabbed symbol: %s from %p", #GSTSYM, (void*)ll##GSTSYM);}while(0)
//attempt to load the shared libraries
- sSymGSTDSOMemoryPool.create();
+ apr_pool_create(&sSymGSTDSOMemoryPool, NULL);
if ( APR_SUCCESS == (rv = apr_dso_load(&sSymGSTDSOHandle,
gst_dso_name.c_str(),
- sSymGSTDSOMemoryPool()) ))
+ sSymGSTDSOMemoryPool) ))
{
INFOMSG("Found DSO: %s", gst_dso_name.c_str());
#include "llmediaimplgstreamer_syms_raw.inc"
@@ -98,7 +96,7 @@ bool grab_gst_syms(std::string gst_dso_name,
if ( APR_SUCCESS ==
(rv = apr_dso_load(&sSymGSTDSOHandle,
gst_dso_name_vid.c_str(),
- sSymGSTDSOMemoryPool()) ))
+ sSymGSTDSOMemoryPool) ))
{
INFOMSG("Found DSO: %s", gst_dso_name_vid.c_str());
#include "llmediaimplgstreamer_syms_rawv.inc"
@@ -152,7 +150,8 @@ void ungrab_gst_syms()
if ( sSymGSTDSOMemoryPool )
{
- sSymGSTDSOMemoryPool.destroy();
+ apr_pool_destroy(sSymGSTDSOMemoryPool);
+ sSymGSTDSOMemoryPool = NULL;
}
// NULL-out all of the symbols we'd grabbed
diff --git a/indra/media_plugins/webkit/linux_volume_catcher.cpp b/indra/media_plugins/webkit/linux_volume_catcher.cpp
index 94dfd80700..91be3a89e9 100644
--- a/indra/media_plugins/webkit/linux_volume_catcher.cpp
+++ b/indra/media_plugins/webkit/linux_volume_catcher.cpp
@@ -65,7 +65,7 @@ extern "C" {
#undef LL_PA_SYM
static bool sSymsGrabbed = false;
-static LLAPRPool sSymPADSOMemoryPool;
+static apr_pool_t *sSymPADSOMemoryPool = NULL;
static apr_dso_handle_t *sSymPADSOHandleG = NULL;
bool grab_pa_syms(std::string pulse_dso_name)
@@ -84,11 +84,11 @@ bool grab_pa_syms(std::string pulse_dso_name)
#define LL_PA_SYM(REQUIRED, PASYM, RTN, ...) do{rv = apr_dso_sym((apr_dso_handle_sym_t*)&ll##PASYM, sSymPADSOHandle, #PASYM); if (rv != APR_SUCCESS) {INFOMSG("Failed to grab symbol: %s", #PASYM); if (REQUIRED) sym_error = true;} else DEBUGMSG("grabbed symbol: %s from %p", #PASYM, (void*)ll##PASYM);}while(0)
//attempt to load the shared library
- sSymPADSOMemoryPool.create();
+ apr_pool_create(&sSymPADSOMemoryPool, NULL);
if ( APR_SUCCESS == (rv = apr_dso_load(&sSymPADSOHandle,
pulse_dso_name.c_str(),
- sSymPADSOMemoryPool()) ))
+ sSymPADSOMemoryPool) ))
{
INFOMSG("Found DSO: %s", pulse_dso_name.c_str());
@@ -130,8 +130,12 @@ void ungrab_pa_syms()
apr_dso_unload(sSymPADSOHandleG);
sSymPADSOHandleG = NULL;
}
-
- sSymPADSOMemoryPool.destroy();
+
+ if ( sSymPADSOMemoryPool )
+ {
+ apr_pool_destroy(sSymPADSOMemoryPool);
+ sSymPADSOMemoryPool = NULL;
+ }
// NULL-out all of the symbols we'd grabbed
#define LL_PA_SYM(REQUIRED, PASYM, RTN, ...) do{ll##PASYM = NULL;}while(0)
diff --git a/indra/media_plugins/webkit/media_plugin_webkit.cpp b/indra/media_plugins/webkit/media_plugin_webkit.cpp
index 0f74772e42..47f8dcd545 100644
--- a/indra/media_plugins/webkit/media_plugin_webkit.cpp
+++ b/indra/media_plugins/webkit/media_plugin_webkit.cpp
@@ -25,12 +25,11 @@
* $/LicenseInfo$
* @endcond
*/
-
#include "llqtwebkit.h"
-
#include "linden_common.h"
#include "indra_constants.h" // for indra keyboard codes
+#include "lltimer.h"
#include "llgl.h"
#include "llplugininstance.h"
@@ -117,15 +116,19 @@ private:
F32 mBackgroundG;
F32 mBackgroundB;
std::string mTarget;
-
+ LLTimer mElapsedTime;
+
VolumeCatcher mVolumeCatcher;
void postDebugMessage( const std::string& msg )
{
if ( mEnableMediaPluginDebugging )
{
+ std::stringstream str;
+ str << "@Media Msg> " << "[" << (double)mElapsedTime.getElapsedTimeF32() << "] -- " << msg;
+
LLPluginMessage debug_message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "debug_message");
- debug_message.setValue("message_text", "Media> " + msg);
+ debug_message.setValue("message_text", str.str());
debug_message.setValue("message_level", "info");
sendMessage(debug_message);
}
@@ -323,7 +326,11 @@ private:
LLQtWebKit::getInstance()->enablePlugins( mPluginsEnabled );
// turn on/off Javascript based on what host app tells us
+#if LLQTWEBKIT_API_VERSION >= 11
+ LLQtWebKit::getInstance()->enableJavaScript( mJavascriptEnabled );
+#else
LLQtWebKit::getInstance()->enableJavascript( mJavascriptEnabled );
+#endif
std::stringstream str;
str << "Cookies enabled = " << mCookiesEnabled << ", plugins enabled = " << mPluginsEnabled << ", Javascript enabled = " << mJavascriptEnabled;
@@ -346,7 +353,7 @@ private:
// append details to agent string
LLQtWebKit::getInstance()->setBrowserAgentId( mUserAgent );
postDebugMessage( "Updating user agent with " + mUserAgent );
-
+
#if !LL_QTWEBKIT_USES_PIXMAPS
// don't flip bitmap
LLQtWebKit::getInstance()->flipWindow( mBrowserWindowId, true );
@@ -374,7 +381,17 @@ private:
url << "%22%3E%3C/body%3E%3C/html%3E";
//lldebugs << "data url is: " << url.str() << llendl;
-
+
+ // always display loading overlay now
+#if LLQTWEBKIT_API_VERSION >= 16
+ LLQtWebKit::getInstance()->enableLoadingOverlay(mBrowserWindowId, true);
+#else
+ llwarns << "Ignoring enableLoadingOverlay() call (llqtwebkit version is too old)." << llendl;
+#endif
+ str.clear();
+ str << "Loading overlay enabled = " << mEnableMediaPluginDebugging << " for mBrowserWindowId = " << mBrowserWindowId;
+ postDebugMessage( str.str() );
+
LLQtWebKit::getInstance()->navigateTo( mBrowserWindowId, url.str() );
// LLQtWebKit::getInstance()->navigateTo( mBrowserWindowId, "about:blank" );
@@ -583,6 +600,10 @@ private:
// These could be passed through as well, but aren't really needed.
// message.setValue("uri", event.getEventUri());
// message.setValueBoolean("dead", (event.getIntValue() != 0))
+
+ // debug spam
+ postDebugMessage( "Sending cookie_set message from plugin: " + event.getStringValue() );
+
sendMessage(message);
}
@@ -863,6 +884,8 @@ MediaPluginWebKit::MediaPluginWebKit(LLPluginInstance::sendMessageFunction host_
mPluginsEnabled = true; // default to on
mEnableMediaPluginDebugging = false;
mUserAgent = "LLPluginMedia Web Browser";
+
+ mElapsedTime.reset();
}
MediaPluginWebKit::~MediaPluginWebKit()
@@ -1210,7 +1233,6 @@ void MediaPluginWebKit::receiveMessage(const char *message_string)
{
mEnableMediaPluginDebugging = message_in.getValueBoolean( "enable" );
}
-
else
if(message_name == "js_enable_object")
{
@@ -1298,6 +1320,15 @@ void MediaPluginWebKit::receiveMessage(const char *message_string)
mFirstFocus = false;
}
}
+ else if(message_name == "set_page_zoom_factor")
+ {
+#if LLQTWEBKIT_API_VERSION >= 15
+ F32 factor = message_in.getValueReal("factor");
+ LLQtWebKit::getInstance()->setPageZoomFactor(factor);
+#else
+ llwarns << "Ignoring setPageZoomFactor message (llqtwebkit version is too old)." << llendl;
+#endif
+ }
else if(message_name == "clear_cache")
{
LLQtWebKit::getInstance()->clearCache();
@@ -1324,6 +1355,9 @@ void MediaPluginWebKit::receiveMessage(const char *message_string)
else if(message_name == "set_cookies")
{
LLQtWebKit::getInstance()->setCookies(message_in.getValue("cookies"));
+
+ // debug spam
+ postDebugMessage( "Plugin setting cookie: " + message_in.getValue("cookies") );
}
else if(message_name == "proxy_setup")
{
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index fe80a47ca4..61ece1f857 100644
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -30,7 +30,6 @@ include(LLUI)
include(LLVFS)
include(LLWindow)
include(LLXML)
-include(LLXUIXML)
include(LScript)
include(Linking)
include(NDOF)
@@ -65,7 +64,6 @@ include_directories(
${LLVFS_INCLUDE_DIRS}
${LLWINDOW_INCLUDE_DIRS}
${LLXML_INCLUDE_DIRS}
- ${LLXUIXML_INCLUDE_DIRS}
${LSCRIPT_INCLUDE_DIRS}
${LSCRIPT_INCLUDE_DIRS}/lscript_compile
${LLLOGIN_INCLUDE_DIRS}
@@ -102,7 +100,6 @@ set(viewer_SOURCE_FILES
llavatarlist.cpp
llavatarlistitem.cpp
llavatarpropertiesprocessor.cpp
- llbottomtray.cpp
llbox.cpp
llbreadcrumbview.cpp
llbrowsernotification.cpp
@@ -118,6 +115,7 @@ set(viewer_SOURCE_FILES
llchatitemscontainerctrl.cpp
llchatmsgbox.cpp
llchiclet.cpp
+ llchicletbar.cpp
llclassifiedinfo.cpp
llclassifiedstatsresponder.cpp
llcofwearables.cpp
@@ -168,6 +166,7 @@ set(viewer_SOURCE_FILES
llfloaterabout.cpp
llfloateranimpreview.cpp
llfloaterauction.cpp
+ llfloateravatar.cpp
llfloateravatarpicker.cpp
llfloateravatartextures.cpp
llfloaterbeacons.cpp
@@ -182,6 +181,7 @@ set(viewer_SOURCE_FILES
llfloatercamera.cpp
llfloatercolorpicker.cpp
llfloaterdeleteenvpreset.cpp
+ llfloaterdestinations.cpp
llfloaterdisplayname.cpp
llfloatereditdaycycle.cpp
llfloatereditsky.cpp
@@ -205,7 +205,6 @@ set(viewer_SOURCE_FILES
llfloaterland.cpp
llfloaterlandholdings.cpp
llfloatermap.cpp
- llfloatermediabrowser.cpp
llfloatermediasettings.cpp
llfloatermemleak.cpp
llfloatermodelpreview.cpp
@@ -215,9 +214,9 @@ set(viewer_SOURCE_FILES
llfloaternotificationsconsole.cpp
llfloaterobjectweights.cpp
llfloateropenobject.cpp
+ llfloateroutbox.cpp
llfloaterpay.cpp
llfloaterperms.cpp
- llfloaterpostcard.cpp
llfloaterpostprocess.cpp
llfloaterpreference.cpp
llfloaterproperties.cpp
@@ -229,7 +228,7 @@ set(viewer_SOURCE_FILES
llfloatersearch.cpp
llfloatersellland.cpp
llfloatersettingsdebug.cpp
- llfloatersidetraytab.cpp
+ llfloatersidepanelcontainer.cpp
llfloatersnapshot.cpp
llfloatersounddevices.cpp
llfloatertelehub.cpp
@@ -238,10 +237,13 @@ set(viewer_SOURCE_FILES
llfloatertools.cpp
llfloatertopobjects.cpp
llfloatertos.cpp
+ llfloatertoybox.cpp
+ llfloatertranslationsettings.cpp
llfloateruipreview.cpp
llfloaterurlentry.cpp
llfloatervoiceeffect.cpp
llfloaterwebcontent.cpp
+ llfloaterwebprofile.cpp
llfloaterwhitelistentry.cpp
llfloaterwindowsize.cpp
llfloaterworldmap.cpp
@@ -311,10 +313,11 @@ set(viewer_SOURCE_FILES
llmaniprotate.cpp
llmanipscale.cpp
llmaniptranslate.cpp
+ llmarketplacefunctions.cpp
+ llmarketplacenotifications.cpp
llmediactrl.cpp
llmediadataclient.cpp
llmemoryview.cpp
- llmenucommands.cpp
llmeshrepository.cpp
llmimetypes.cpp
llmorphview.cpp
@@ -368,7 +371,6 @@ set(viewer_SOURCE_FILES
llpanelmaininventory.cpp
llpanelmarketplaceinbox.cpp
llpanelmarketplaceinboxinventory.cpp
- llpanelmarketplaceoutbox.cpp
llpanelmarketplaceoutboxinventory.cpp
llpanelmediasettingsgeneral.cpp
llpanelmediasettingspermissions.cpp
@@ -391,7 +393,12 @@ set(viewer_SOURCE_FILES
llpanelplacestab.cpp
llpanelprimmediacontrols.cpp
llpanelprofile.cpp
- llpanelprofileview.cpp
+ llpanelsnapshot.cpp
+ llpanelsnapshotinventory.cpp
+ llpanelsnapshotlocal.cpp
+ llpanelsnapshotoptions.cpp
+ llpanelsnapshotpostcard.cpp
+ llpanelsnapshotprofile.cpp
llpanelteleporthistory.cpp
llpaneltiptoast.cpp
llpanelvoiceeffect.cpp
@@ -410,6 +417,7 @@ set(viewer_SOURCE_FILES
llpopupview.cpp
llpolymesh.cpp
llpolymorph.cpp
+ llpostcard.cpp
llpreview.cpp
llpreviewanim.cpp
llpreviewgesture.cpp
@@ -441,13 +449,10 @@ set(viewer_SOURCE_FILES
llsidepanelinventorysubpanel.cpp
llsidepaneliteminfo.cpp
llsidepaneltaskinfo.cpp
- llsidetray.cpp
- llsidetraylistener.cpp
llsidetraypanelcontainer.cpp
llsky.cpp
llslurl.cpp
llspatialpartition.cpp
- llspeakbutton.cpp
llspeakers.cpp
llspeakingindicatormanager.cpp
llsplitbutton.cpp
@@ -483,6 +488,7 @@ set(viewer_SOURCE_FILES
lltoastpanel.cpp
lltoastscripttextbox.cpp
lltool.cpp
+ lltoolbarview.cpp
lltoolbrush.cpp
lltoolcomp.cpp
lltooldraganddrop.cpp
@@ -538,9 +544,6 @@ set(viewer_SOURCE_FILES
llviewerjoint.cpp
llviewerjointattachment.cpp
llviewerjointmesh.cpp
- llviewerjointmesh_sse.cpp
- llviewerjointmesh_sse2.cpp
- llviewerjointmesh_vec.cpp
llviewerjoystick.cpp
llviewerkeyboard.cpp
llviewerlayer.cpp
@@ -588,7 +591,6 @@ set(viewer_SOURCE_FILES
llvopartgroup.cpp
llvosky.cpp
llvosurfacepatch.cpp
- llvotextbubble.cpp
llvotree.cpp
llvovolume.cpp
llvowater.cpp
@@ -601,8 +603,10 @@ set(viewer_SOURCE_FILES
llwearablelist.cpp
llwearabletype.cpp
llweb.cpp
+ llwebprofile.cpp
llwebsharing.cpp
llwind.cpp
+ llwindowlistener.cpp
llwlanimator.cpp
llwldaycycle.cpp
llwlhandlers.cpp
@@ -622,20 +626,6 @@ set(viewer_SOURCE_FILES
set(VIEWER_BINARY_NAME "secondlife-bin" CACHE STRING
"The name of the viewer executable to create.")
-if (LINUX)
- # We can't set these flags for Darwin, because they get passed to
- # the PPC compiler. Ugh.
-
- set_source_files_properties(
- llviewerjointmesh_sse.cpp
- PROPERTIES COMPILE_FLAGS "-msse -mfpmath=sse"
- )
- set_source_files_properties(
- llviewerjointmesh_sse2.cpp
- PROPERTIES COMPILE_FLAGS "-msse2 -mfpmath=sse"
- )
-endif (LINUX)
-
set(viewer_HEADER_FILES
CMakeLists.txt
ViewerInstall.cmake
@@ -666,7 +656,6 @@ set(viewer_HEADER_FILES
llavatarlist.h
llavatarlistitem.h
llavatarpropertiesprocessor.h
- llbottomtray.h
llbox.h
llbreadcrumbview.h
llbuycurrencyhtml.h
@@ -682,6 +671,7 @@ set(viewer_HEADER_FILES
llchatitemscontainerctrl.h
llchatmsgbox.h
llchiclet.h
+ llchicletbar.h
llclassifiedinfo.h
llclassifiedstatsresponder.h
llcofwearables.h
@@ -732,6 +722,7 @@ set(viewer_HEADER_FILES
llfloaterabout.h
llfloateranimpreview.h
llfloaterauction.h
+ llfloateravatar.h
llfloateravatarpicker.h
llfloateravatartextures.h
llfloaterbeacons.h
@@ -746,6 +737,7 @@ set(viewer_HEADER_FILES
llfloatercamera.h
llfloatercolorpicker.h
llfloaterdeleteenvpreset.h
+ llfloaterdestinations.h
llfloaterdisplayname.h
llfloatereditdaycycle.h
llfloatereditsky.h
@@ -769,7 +761,6 @@ set(viewer_HEADER_FILES
llfloaterland.h
llfloaterlandholdings.h
llfloatermap.h
- llfloatermediabrowser.h
llfloatermediasettings.h
llfloatermemleak.h
llfloatermodelpreview.h
@@ -779,9 +770,9 @@ set(viewer_HEADER_FILES
llfloaternotificationsconsole.h
llfloaterobjectweights.h
llfloateropenobject.h
+ llfloateroutbox.h
llfloaterpay.h
llfloaterperms.h
- llfloaterpostcard.h
llfloaterpostprocess.h
llfloaterpreference.h
llfloaterproperties.h
@@ -793,7 +784,7 @@ set(viewer_HEADER_FILES
llfloatersearch.h
llfloatersellland.h
llfloatersettingsdebug.h
- llfloatersidetraytab.h
+ llfloatersidepanelcontainer.h
llfloatersnapshot.h
llfloatersounddevices.h
llfloatertelehub.h
@@ -802,10 +793,13 @@ set(viewer_HEADER_FILES
llfloatertools.h
llfloatertopobjects.h
llfloatertos.h
+ llfloatertoybox.h
+ llfloatertranslationsettings.h
llfloateruipreview.h
llfloaterurlentry.h
llfloatervoiceeffect.h
llfloaterwebcontent.h
+ llfloaterwebprofile.h
llfloaterwhitelistentry.h
llfloaterwindowsize.h
llfloaterworldmap.h
@@ -875,10 +869,11 @@ set(viewer_HEADER_FILES
llmaniprotate.h
llmanipscale.h
llmaniptranslate.h
+ llmarketplacefunctions.h
+ llmarketplacenotifications.h
llmediactrl.h
llmediadataclient.h
llmemoryview.h
- llmenucommands.h
llmeshrepository.h
llmimetypes.h
llmorphview.h
@@ -926,7 +921,6 @@ set(viewer_HEADER_FILES
llpanelmaininventory.h
llpanelmarketplaceinbox.h
llpanelmarketplaceinboxinventory.h
- llpanelmarketplaceoutbox.h
llpanelmarketplaceoutboxinventory.h
llpanelmediasettingsgeneral.h
llpanelmediasettingspermissions.h
@@ -949,7 +943,7 @@ set(viewer_HEADER_FILES
llpanelplacestab.h
llpanelprimmediacontrols.h
llpanelprofile.h
- llpanelprofileview.h
+ llpanelsnapshot.h
llpanelteleporthistory.h
llpaneltiptoast.h
llpanelvoicedevicesettings.h
@@ -968,6 +962,7 @@ set(viewer_HEADER_FILES
llpolymesh.h
llpolymorph.h
llpopupview.h
+ llpostcard.h
llpreview.h
llpreviewanim.h
llpreviewgesture.h
@@ -1000,13 +995,10 @@ set(viewer_HEADER_FILES
llsidepanelinventorysubpanel.h
llsidepaneliteminfo.h
llsidepaneltaskinfo.h
- llsidetray.h
- llsidetraylistener.h
llsidetraypanelcontainer.h
llsky.h
llslurl.h
llspatialpartition.h
- llspeakbutton.h
llspeakers.h
llspeakingindicatormanager.h
llsplitbutton.h
@@ -1043,6 +1035,7 @@ set(viewer_HEADER_FILES
lltoastpanel.h
lltoastscripttextbox.h
lltool.h
+ lltoolbarview.h
lltoolbrush.h
lltoolcomp.h
lltooldraganddrop.h
@@ -1145,7 +1138,6 @@ set(viewer_HEADER_FILES
llvopartgroup.h
llvosky.h
llvosurfacepatch.h
- llvotextbubble.h
llvotree.h
llvotreenew.h
llvovolume.h
@@ -1159,8 +1151,10 @@ set(viewer_HEADER_FILES
llwearablelist.h
llwearabletype.h
llweb.h
+ llwebprofile.h
llwebsharing.h
llwind.h
+ llwindowlistener.h
llwlanimator.h
llwldaycycle.h
llwlhandlers.h
@@ -1383,11 +1377,6 @@ endif (WINDOWS)
set(viewer_XUI_FILES
skins/default/colors.xml
skins/default/textures/textures.xml
- skins/minimal/colors.xml
- skins/minimal/textures/textures.xml
-
-
-
)
file(GLOB DEFAULT_XUI_FILE_GLOB_LIST
${CMAKE_CURRENT_SOURCE_DIR}/skins/*/xui/en/*.xml)
@@ -1414,6 +1403,7 @@ list(APPEND viewer_SOURCE_FILES ${viewer_XUI_FILES})
set(viewer_APPSETTINGS_FILES
app_settings/anim.ini
app_settings/cmd_line.xml
+ app_settings/commands.xml
app_settings/grass.xml
app_settings/high_graphics.xml
app_settings/ignorable_dialogs.xml
@@ -1426,8 +1416,8 @@ set(viewer_APPSETTINGS_FILES
app_settings/settings_crash_behavior.xml
app_settings/settings_files.xml
app_settings/settings_per_account.xml
- app_settings/settings_minimal.xml
app_settings/std_bump.ini
+ app_settings/toolbars.xml
app_settings/trees.xml
app_settings/ultra_graphics.xml
app_settings/viewerart.xml
@@ -1752,7 +1742,6 @@ target_link_libraries(${VIEWER_BINARY_NAME}
${LLVFS_LIBRARIES}
${LLWINDOW_LIBRARIES}
${LLXML_LIBRARIES}
- ${LLXUIXML_LIBRARIES}
${LSCRIPT_LIBRARIES}
${LLMATH_LIBRARIES}
${LLCOMMON_LIBRARIES}
@@ -1987,12 +1976,19 @@ if (LL_TESTS)
llmediadataclient.cpp
lllogininstance.cpp
llremoteparcelrequest.cpp
+ lltranslate.cpp
llviewerhelputil.cpp
llversioninfo.cpp
llworldmap.cpp
llworldmipmap.cpp
)
+ set_source_files_properties(
+ lltranslate.cpp
+ PROPERTIES
+ LL_TEST_ADDITIONAL_LIBRARIES "${JSONCPP_LIBRARIES}"
+ )
+
##################################################
# DISABLING PRECOMPILED HEADERS USAGE FOR TESTS
##################################################
diff --git a/indra/newview/app_settings/cmd_line.xml b/indra/newview/app_settings/cmd_line.xml
index 15434f2b8f..be79f91919 100644
--- a/indra/newview/app_settings/cmd_line.xml
+++ b/indra/newview/app_settings/cmd_line.xml
@@ -1,45 +1,101 @@
<?xml version="1.0"?>
<llsd>
<map>
- <key>help</key>
+ <!-- Please insert new keys in alphabetical order. -->
+ <key>analyzeperformance</key>
<map>
<key>desc</key>
- <string>display this help message</string>
+ <string>When used in conjunction with logperformance, analyzes result of log against baseline.</string>
+ <key>map-to</key>
+ <string>AnalyzePerformance</string>
+ </map>
- <key>short</key>
- <string>h</string>
+ <key>autologin</key>
+ <map>
+ <key>desc</key>
+ <string>log in as last saved user</string>
+ <key>map-to</key>
+ <string>AutoLogin</string>
</map>
- <key>port</key>
+ <key>channel</key>
<map>
<key>count</key>
<integer>1</integer>
- <key>map-to</key>
- <string>UserConnectionPort</string>
+ <!-- Special case. Not mapped to a setting. -->
</map>
- <key>drop</key>
+ <key>console</key>
<map>
<key>count</key>
<integer>1</integer>
<key>map-to</key>
- <string>PacketDropPercentage</string>
+ <string>ShowConsoleWindow</string>
</map>
- <key>inbw</key>
+ <key>cooperative</key>
<map>
+ <key>desc</key>
+ <string>Yield some idle time to local host.</string>
<key>count</key>
<integer>1</integer>
<key>map-to</key>
- <string>InBandwidth</string>
+ <string>YieldTime</string>
</map>
- <key>outbw</key>
+ <key>crashonstartup</key>
+ <map>
+ <key>desc</key>
+ <string>Crashes on startup. For QA use.</string>
+ <key>map-to</key>
+ <string>CrashOnStartup</string>
+ </map>
+
+ <key>debugsession</key>
+ <map>
+ <key>desc</key>
+ <string>Run as if RenderDebugGL is TRUE, but log errors until end of session.</string>
+ <key>map-to</key>
+ <string>DebugSession</string>
+ </map>
+
+ <key>debugviews</key>
+ <map>
+ <key>map-to</key>
+ <string>DebugViews</string>
+ </map>
+
+ <key>disablecrashlogger</key>
+ <map>
+ <key>desc</key>
+ <string>Disables the crash logger and lets the OS handle crashes</string>
+ <key>map-to</key>
+ <string>DisableCrashLogger</string>
+ </map>
+
+ <key>drop</key>
<map>
<key>count</key>
<integer>1</integer>
<key>map-to</key>
- <string>OutBandwidth</string>
+ <string>PacketDropPercentage</string>
+ </map>
+
+ <key>god</key>
+ <map>
+ <key>desc</key>
+ <string>Log in a god if you have god access.</string>
+ <key>map-to</key>
+ <string>ConnectAsGod</string>
+ </map>
+
+ <key>graphicslevel</key>
+ <map>
+ <key>desc</key>
+ <string>Set the detail level.
+0 - low, 1 - medium, 2 - high, 3 - ultra</string>
+ <key>count</key>
+ <integer>1</integer>
</map>
<key>grid</key>
@@ -52,16 +108,13 @@
<string>CmdLineGridChoice</string>
</map>
- <key>loginuri</key>
+ <key>help</key>
<map>
<key>desc</key>
- <string>login server and CGI script to use</string>
- <key>count</key>
- <integer>1</integer>
- <key>compose</key>
- <boolean>true</boolean>
- <key>map-to</key>
- <string>CmdLineLoginURI</string>
+ <string>display this help message</string>
+
+ <key>short</key>
+ <string>h</string>
</map>
<key>helperuri</key>
@@ -74,44 +127,73 @@
<string>CmdLineHelperURI</string>
</map>
- <key>debugviews</key>
+ <key>ignorepixeldepth</key>
<map>
+ <key>desc</key>
+ <string>Ignore pixel depth settings.</string>
<key>map-to</key>
- <string>DebugViews</string>
+ <string>IgnorePixelDepth</string>
</map>
- <key>skin</key>
+ <key>inbw</key>
+ <map>
+ <key>count</key>
+ <integer>1</integer>
+ <key>map-to</key>
+ <string>InBandwidth</string>
+ </map>
+
+ <key>leap</key>
<map>
<key>desc</key>
- <string>ui/branding skin folder to use</string>
+ <string>command line to run an LLSD Event API Plugin</string>
<key>count</key>
<integer>1</integer>
+ <!-- you can specify multiple such plugins -->
+ <key>compose</key>
+ <boolean>true</boolean>
<key>map-to</key>
- <string>SkinFolder</string>
+ <string>LeapCommand</string>
</map>
- <key>autologin</key>
+ <key>logfile</key>
+ <map>
+ <key>count</key>
+ <integer>1</integer>
+ <key>map-to</key>
+ <string>UserLogFile</string>
+ </map>
+
+ <key>login</key>
<map>
<key>desc</key>
- <string>log in as last saved user</string>
+ <string>3 tokens: first, last and password</string>
+ <key>count</key>
+ <integer>3</integer>
<key>map-to</key>
- <string>AutoLogin</string>
+ <string>UserLoginInfo</string>
</map>
- <key>quitafter</key>
+ <key>loginpage</key>
<map>
+ <key>desc</key>
+ <string>Login authentication page to use.</string>
<key>count</key>
<integer>1</integer>
<key>map-to</key>
- <string>QuitAfterSeconds</string>
+ <string>LoginPage</string>
</map>
- <key>logperformance</key>
+ <key>loginuri</key>
<map>
<key>desc</key>
- <string>Log performance metrics for benchmarking</string>
+ <string>login server and CGI script to use</string>
+ <key>count</key>
+ <integer>1</integer>
+ <key>compose</key>
+ <boolean>true</boolean>
<key>map-to</key>
- <string>LogPerformance</string>
+ <string>CmdLineLoginURI</string>
</map>
<key>logmetrics</key>
@@ -123,29 +205,35 @@
<key>map-to</key>
<string>LogMetrics</string>
</map>
-
- <key>analyzeperformance</key>
+
+ <key>logperformance</key>
<map>
<key>desc</key>
- <string>When used in conjunction with logperformance, analyzes result of log against baseline.</string>
+ <string>Log performance metrics for benchmarking</string>
<key>map-to</key>
- <string>AnalyzePerformance</string>
+ <string>LogPerformance</string>
</map>
- <key>debugsession</key>
+ <key>multiple</key>
<map>
<key>desc</key>
- <string>Run as if RenderDebugGL is TRUE, but log errors until end of session.</string>
+ <string>Allow multiple viewers.</string>
<key>map-to</key>
- <string>DebugSession</string>
+ <string>AllowMultipleViewers</string>
</map>
- <key>replaysession</key>
+ <key>noaudio</key>
+ <map>
+ <key>map-to</key>
+ <string>NoAudio</string>
+ </map>
+
+ <key>noinvlib</key>
<map>
<key>desc</key>
- <string>After login, replay last recorded session and quit.</string>
+ <string>Do not request the inventory library.</string>
<key>map-to</key>
- <string>ReplaySession</string>
+ <string>NoInventoryLibrary</string>
</map>
<key>nonotifications</key>
@@ -156,22 +244,10 @@
<string>IgnoreAllNotifications</string>
</map>
- <key>rotate</key>
- <map>
- <key>map-to</key>
- <string>RotateRight</string>
- </map>
-
- <key>noaudio</key>
- <map>
- <key>map-to</key>
- <string>NoAudio</string>
- </map>
-
- <key>nosound</key>
+ <key>nopreload</key>
<map>
<key>map-to</key>
- <string>NoAudio</string>
+ <string>NoPreload</string>
</map>
<key>noprobe</key>
@@ -186,151 +262,134 @@
<string>NoQuickTime</string>
</map>
- <key>nopreload</key>
+ <key>nosound</key>
<map>
<key>map-to</key>
- <string>NoPreload</string>
+ <string>NoAudio</string>
</map>
- <key>purge</key>
+ <key>no-verify-ssl-cert</key>
<map>
- <key>desc</key>
- <string>Delete files in the cache.</string>
<key>map-to</key>
- <string>PurgeCacheOnNextStartup</string>
+ <string>NoVerifySSLCert</string>
</map>
- <key>noinvlib</key>
+ <key>novoice</key>
<map>
<key>desc</key>
- <string>Do not request the inventory library.</string>
+ <string>Disable voice.</string>
<key>map-to</key>
- <string>NoInventoryLibrary</string>
+ <string>CmdLineDisableVoice</string>
</map>
- <key>logfile</key>
+ <key>outbw</key>
<map>
<key>count</key>
<integer>1</integer>
<key>map-to</key>
- <string>UserLogFile</string>
+ <string>OutBandwidth</string>
</map>
- <key>graphicslevel</key>
+ <key>port</key>
<map>
- <key>desc</key>
- <string>Set the detail level.
-0 - low, 1 - medium, 2 - high, 3 - ultra</string>
<key>count</key>
<integer>1</integer>
+ <key>map-to</key>
+ <string>UserConnectionPort</string>
</map>
- <key>setdefault</key>
+ <key>purge</key>
<map>
<key>desc</key>
- <string>specify the value of a particular configuration variable which can be overridden by settings.xml.</string>
- <key>count</key>
- <integer>2</integer>
- <!-- Special case. Mapped to settings procedurally. -->
+ <string>Delete files in the cache.</string>
+ <key>map-to</key>
+ <string>PurgeCacheOnNextStartup</string>
</map>
- <key>set</key>
+ <key>qa</key>
<map>
<key>desc</key>
- <string>specify the value of a particular configuration variable that overrides all other settings.</string>
- <key>count</key>
- <integer>2</integer>
- <key>compose</key>
- <boolean>true</boolean>
- <!-- Special case. Mapped to settings procedurally. -->
+ <string>Activated debugging menu in Advanced Settings.</string>
+ <key>map-to</key>
+ <string>QAMode</string>
</map>
- <key>settings</key>
+ <key>quitafter</key>
<map>
- <key>desc</key>
- <string>Specify the filename of a configuration file.</string>
<key>count</key>
<integer>1</integer>
- <!-- Special case. Mapped to settings procedurally. -->
+ <key>map-to</key>
+ <string>QuitAfterSeconds</string>
</map>
-
- <key>sessionsettings</key>
+
+ <key>replaysession</key>
<map>
<key>desc</key>
- <string>Specify the filename of a configuration file that contains temporary per-session configuration overrides.</string>
- <key>count</key>
- <integer>1</integer>
- <!-- Special case. Mapped to settings procedurally. -->
+ <string>After login, replay last recorded session and quit.</string>
+ <key>map-to</key>
+ <string>ReplaySession</string>
</map>
- <key>usersessionsettings</key>
- <map>
- <key>desc</key>
- <string>Specify the filename of a configuration file that contains temporary per-session configuration user overrides.</string>
- <key>count</key>
- <integer>1</integer>
- <!-- Special case. Mapped to settings procedurally. -->
- </map>
-
- <key>login</key>
+ <key>rotate</key>
<map>
- <key>desc</key>
- <string>3 tokens: first, last and password</string>
- <key>count</key>
- <integer>3</integer>
<key>map-to</key>
- <string>UserLoginInfo</string>
+ <string>RotateRight</string>
</map>
- <key>god</key>
+ <key>safe</key>
<map>
<key>desc</key>
- <string>Log in a god if you have god access.</string>
+ <string>Reset preferences, run in safe mode.</string>
<key>map-to</key>
- <string>ConnectAsGod</string>
+ <string>SafeMode</string>
</map>
- <key>console</key>
+ <key>sessionsettings</key>
<map>
+ <key>desc</key>
+ <string>Specify the filename of a configuration file that contains temporary per-session configuration overrides.</string>
<key>count</key>
<integer>1</integer>
- <key>map-to</key>
- <string>ShowConsoleWindow</string>
+ <!-- Special case. Mapped to settings procedurally. -->
</map>
- <key>safe</key>
+ <key>set</key>
<map>
<key>desc</key>
- <string>Reset preferences, run in safe mode.</string>
- <key>map-to</key>
- <string>SafeMode</string>
+ <string>specify the value of a particular configuration variable that overrides all other settings.</string>
+ <key>count</key>
+ <integer>2</integer>
+ <key>compose</key>
+ <boolean>true</boolean>
+ <!-- Special case. Mapped to settings procedurally. -->
</map>
- <key>multiple</key>
+ <key>setdefault</key>
<map>
<key>desc</key>
- <string>Allow multiple viewers.</string>
- <key>map-to</key>
- <string>AllowMultipleViewers</string>
+ <string>specify the value of a particular configuration variable which can be overridden by settings.xml.</string>
+ <key>count</key>
+ <integer>2</integer>
+ <!-- Special case. Mapped to settings procedurally. -->
</map>
- <key>novoice</key>
+ <key>settings</key>
<map>
<key>desc</key>
- <string>Disable voice.</string>
- <key>map-to</key>
- <string>CmdLineDisableVoice</string>
+ <string>Specify the filename of a configuration file.</string>
+ <key>count</key>
+ <integer>1</integer>
+ <!-- Special case. Mapped to settings procedurally. -->
</map>
- <key>url</key>
+ <key>skin</key>
<map>
<key>desc</key>
- <string>Startup location</string>
+ <string>ui/branding skin folder to use</string>
<key>count</key>
<integer>1</integer>
- <key>last_option</key>
- <boolean>true</boolean>
- <!-- Special case. Not mapped to a setting. -->
+ <key>map-to</key>
+ <string>SkinFolder</string>
</map>
<key>slurl</key>
@@ -346,69 +405,24 @@
<!-- Special case. Not mapped to a setting. -->
</map>
- <key>ignorepixeldepth</key>
- <map>
- <key>desc</key>
- <string>Ignore pixel depth settings.</string>
- <key>map-to</key>
- <string>IgnorePixelDepth</string>
- </map>
-
- <key>cooperative</key>
+ <key>url</key>
<map>
<key>desc</key>
- <string>Yield some idle time to local host.</string>
- <key>count</key>
- <integer>1</integer>
- <key>map-to</key>
- <string>YieldTime</string>
- </map>
-
- <key>no-verify-ssl-cert</key>
- <map>
- <key>map-to</key>
- <string>NoVerifySSLCert</string>
- </map>
-
- <key>channel</key>
- <map>
+ <string>Startup location</string>
<key>count</key>
<integer>1</integer>
+ <key>last_option</key>
+ <boolean>true</boolean>
<!-- Special case. Not mapped to a setting. -->
</map>
- <key>loginpage</key>
+ <key>usersessionsettings</key>
<map>
<key>desc</key>
- <string>Login authentication page to use.</string>
+ <string>Specify the filename of a configuration file that contains temporary per-session configuration user overrides.</string>
<key>count</key>
<integer>1</integer>
- <key>map-to</key>
- <string>LoginPage</string>
- </map>
-
- <key>qa</key>
- <map>
- <key>desc</key>
- <string>Activated debugging menu in Advanced Settings.</string>
- <key>map-to</key>
- <string>QAMode</string>
- </map>
-
- <key>crashonstartup</key>
- <map>
- <key>desc</key>
- <string>Crashes on startup. For QA use.</string>
- <key>map-to</key>
- <string>CrashOnStartup</string>
- </map>
-
- <key>disablecrashlogger</key>
- <map>
- <key>desc</key>
- <string>Disables the crash logger and lets the OS handle crashes</string>
- <key>map-to</key>
- <string>DisableCrashLogger</string>
+ <!-- Special case. Mapped to settings procedurally. -->
</map>
</map>
</llsd>
diff --git a/indra/newview/app_settings/commands.xml b/indra/newview/app_settings/commands.xml
new file mode 100644
index 0000000000..1d1d39c786
--- /dev/null
+++ b/indra/newview/app_settings/commands.xml
@@ -0,0 +1,250 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<commands>
+ <command name="aboutland"
+ available_in_toybox="true"
+ icon="Command_AboutLand_Icon"
+ label_ref="Command_AboutLand_Label"
+ tooltip_ref="Command_AboutLand_Tooltip"
+ execute_function="Floater.ToggleOrBringToFront"
+ execute_parameters="about_land"
+ is_running_function="Floater.IsOpen"
+ is_running_parameters="about_land"
+ />
+ <command name="appearance"
+ available_in_toybox="true"
+ icon="Command_Appearance_Icon"
+ label_ref="Command_Appearance_Label"
+ tooltip_ref="Command_Appearance_Tooltip"
+ execute_function="Floater.ToggleOrBringToFront"
+ execute_parameters="appearance"
+ is_running_function="Floater.IsOpen"
+ is_running_parameters="appearance"
+ />
+ <command name="avatar"
+ available_in_toybox="true"
+ icon="Command_Avatar_Icon"
+ label_ref="Command_Avatar_Label"
+ tooltip_ref="Command_Avatar_Tooltip"
+ execute_function="Floater.ToggleOrBringToFront"
+ execute_parameters="avatar"
+ is_running_function="Floater.IsOpen"
+ is_running_parameters="avatar"
+ />
+ <command name="build"
+ available_in_toybox="true"
+ icon="Command_Build_Icon"
+ label_ref="Command_Build_Label"
+ tooltip_ref="Command_Build_Tooltip"
+ execute_function="Build.Toggle"
+ execute_parameters="build"
+ is_running_function="Floater.IsOpen"
+ is_running_parameters="build"
+ />
+ <command name="chat"
+ available_in_toybox="true"
+ icon="Command_Chat_Icon"
+ label_ref="Command_Chat_Label"
+ tooltip_ref="Command_Chat_Tooltip"
+ execute_function="Floater.ToggleOrBringToFront"
+ execute_parameters="chat_bar"
+ is_running_function="Floater.IsOpen"
+ is_running_parameters="chat_bar"
+ />
+ <command name="compass"
+ available_in_toybox="false"
+ icon="Command_Compass_Icon"
+ label_ref="Command_Compass_Label"
+ tooltip_ref="Command_Compass_Tooltip"
+ execute_function="Floater.ToggleOrBringToFront"
+ execute_parameters="compass"
+ is_running_function="Floater.IsOpen"
+ is_running_parameters="compass"
+ />
+ <command name="destinations"
+ available_in_toybox="true"
+ icon="Command_Destinations_Icon"
+ label_ref="Command_Destinations_Label"
+ tooltip_ref="Command_Destinations_Tooltip"
+ execute_function="Floater.ToggleOrBringToFront"
+ execute_parameters="destinations"
+ is_running_function="Floater.IsOpen"
+ is_running_parameters="destinations"
+ />
+ <command name="gestures"
+ available_in_toybox="true"
+ icon="Command_Gestures_Icon"
+ label_ref="Command_Gestures_Label"
+ tooltip_ref="Command_Gestures_Tooltip"
+ execute_function="Floater.ToggleOrBringToFront"
+ execute_parameters="gestures"
+ is_running_function="Floater.IsOpen"
+ is_running_parameters="gestures"
+ />
+ <command name="howto"
+ available_in_toybox="true"
+ icon="Command_HowTo_Icon"
+ label_ref="Command_HowTo_Label"
+ tooltip_ref="Command_HowTo_Tooltip"
+ execute_function="Help.ToggleHowTo"
+ is_running_function="Help.HowToVisible"
+ />
+ <command name="inventory"
+ available_in_toybox="true"
+ icon="Command_Inventory_Icon"
+ label_ref="Command_Inventory_Label"
+ tooltip_ref="Command_Inventory_Tooltip"
+ execute_function="Floater.ToggleOrBringToFront"
+ execute_parameters="inventory"
+ is_running_function="Floater.IsOpen"
+ is_running_parameters="inventory"
+ />
+ <command name="map"
+ available_in_toybox="true"
+ icon="Command_Map_Icon"
+ label_ref="Command_Map_Label"
+ tooltip_ref="Command_Map_Tooltip"
+ execute_function="Floater.ToggleOrBringToFront"
+ execute_parameters="world_map"
+ is_running_function="Floater.IsOpen"
+ is_running_parameters="world_map"
+ />
+ <command name="marketplace"
+ available_in_toybox="false"
+ icon="Command_Marketplace_Icon"
+ label_ref="Command_Marketplace_Label"
+ tooltip_ref="Command_Marketplace_Tooltip"
+ execute_function="Avatar.OpenMarketplace"
+ />
+ <command name="minimap"
+ available_in_toybox="true"
+ icon="Command_MiniMap_Icon"
+ label_ref="Command_MiniMap_Label"
+ tooltip_ref="Command_MiniMap_Tooltip"
+ execute_function="Floater.ToggleOrBringToFront"
+ execute_parameters="mini_map"
+ is_running_function="Floater.IsOpen"
+ is_running_parameters="mini_map"
+ />
+ <command name="move"
+ available_in_toybox="true"
+ icon="Command_Move_Icon"
+ label_ref="Command_Move_Label"
+ tooltip_ref="Command_Move_Tooltip"
+ execute_function="Floater.ToggleOrBringToFront"
+ execute_parameters="moveview"
+ is_running_function="Floater.IsOpen"
+ is_running_parameters="moveview"
+ />
+ <command name="outbox"
+ available_in_toybox="false"
+ icon="Command_Outbox_Icon"
+ label_ref="Command_Outbox_Label"
+ tooltip_ref="Command_Outbox_Tooltip"
+ execute_function="Floater.ToggleOrBringToFront"
+ execute_parameters="outbox"
+ is_running_function="Floater.IsOpen"
+ is_running_parameters="outbox"
+ />
+ <command name="people"
+ available_in_toybox="true"
+ icon="Command_People_Icon"
+ label_ref="Command_People_Label"
+ tooltip_ref="Command_People_Tooltip"
+ execute_function="Floater.ToggleOrBringToFront"
+ execute_parameters="people"
+ is_running_function="Floater.IsOpen"
+ is_running_parameters="people"
+ />
+ <command name="picks"
+ available_in_toybox="true"
+ icon="Command_Picks_Icon"
+ label_ref="Command_Picks_Label"
+ tooltip_ref="Command_Picks_Tooltip"
+ execute_function="Floater.ToggleOrBringToFront"
+ execute_parameters="picks"
+ is_running_function="Floater.IsOpen"
+ is_running_parameters="picks"
+ />
+ <command name="places"
+ available_in_toybox="true"
+ icon="Command_Places_Icon"
+ label_ref="Command_Places_Label"
+ tooltip_ref="Command_Places_Tooltip"
+ execute_function="Floater.ToggleOrBringToFront"
+ execute_parameters="places"
+ is_running_function="Floater.IsOpen"
+ is_running_parameters="places"
+ />
+ <command name="preferences"
+ available_in_toybox="true"
+ icon="Command_Preferences_Icon"
+ label_ref="Command_Preferences_Label"
+ tooltip_ref="Command_Preferences_Tooltip"
+ execute_function="Floater.ToggleOrBringToFront"
+ execute_parameters="preferences"
+ is_running_function="Floater.IsOpen"
+ is_running_parameters="preferences"
+ />
+ <command name="profile"
+ available_in_toybox="true"
+ icon="Command_Profile_Icon"
+ label_ref="Command_Profile_Label"
+ tooltip_ref="Command_Profile_Tooltip"
+ execute_function="Avatar.ToggleMyProfile"
+ is_running_function="Avatar.IsMyProfileOpen"
+ />
+ <command name="search"
+ available_in_toybox="true"
+ icon="Command_Search_Icon"
+ label_ref="Command_Search_Label"
+ tooltip_ref="Command_Search_Tooltip"
+ execute_function="Floater.ToggleOrBringToFront"
+ execute_parameters="search"
+ is_running_function="Floater.IsOpen"
+ is_running_parameters="search"
+ />
+ <command name="snapshot"
+ available_in_toybox="true"
+ icon="Command_Snapshot_Icon"
+ label_ref="Command_Snapshot_Label"
+ tooltip_ref="Command_Snapshot_Tooltip"
+ execute_function="Floater.ToggleOrBringToFront"
+ execute_parameters="snapshot"
+ is_running_function="Floater.IsOpen"
+ is_running_parameters="snapshot"
+ />
+ <command name="speak"
+ available_in_toybox="true"
+ icon="Command_Speak_Icon"
+ label_ref="Command_Speak_Label"
+ tooltip_ref="Command_Speak_Tooltip"
+ execute_function="Agent.PressMicrophone"
+ execute_parameters="speak"
+ execute_stop_function="Agent.ReleaseMicrophone"
+ execute_stop_parameters="speak"
+ is_enabled_function="Agent.IsActionAllowed"
+ is_enabled_parameters="speak"
+ is_running_function="Agent.IsMicrophoneOn"
+ is_running_parameters="speak"
+ />
+ <command name="view"
+ available_in_toybox="true"
+ icon="Command_View_Icon"
+ label_ref="Command_View_Label"
+ tooltip_ref="Command_View_Tooltip"
+ execute_function="Floater.ToggleOrBringToFront"
+ execute_parameters="camera"
+ is_running_function="Floater.IsOpen"
+ is_running_parameters="camera"
+ />
+ <command name="voice"
+ available_in_toybox="true"
+ icon="Command_Voice_Icon"
+ label_ref="Command_Voice_Label"
+ tooltip_ref="Command_Voice_Tooltip"
+ execute_function="Floater.ToggleOrBringToFront"
+ execute_parameters="voice_controls"
+ is_running_function="Floater.IsOpen"
+ is_running_parameters="voice_controls"
+ />
+</commands>
diff --git a/indra/newview/app_settings/keywords.ini b/indra/newview/app_settings/keywords.ini
index 9fa4046fdf..82b43432eb 100644
--- a/indra/newview/app_settings/keywords.ini
+++ b/indra/newview/app_settings/keywords.ini
@@ -10,7 +10,7 @@ state Keyword to indicate state block or state transition
integer Integer type
float Floating-point type
string String type
-key Key type. Use NULL_KEY to test for empty keys.
+key Key type. Use NULL_KEY to test for empty keys
vector Vector type of 3 floats. Used to represent 3D motion, Euler angles, and color.:Access components by .x, .y. or .z
rotation Rotation type of 4 floats. Used to represent rotation.:Access components by .x, .y., .z, or .w
list List of various data types
@@ -28,7 +28,7 @@ collision_end collision_end(integer num_detected):Triggered when task stops coll
land_collision_start land_collision_start(vector pos):Triggered when task starts colliding with land
land_collision land_collision(vector pos):Triggered when task is colliding with land
land_collision_end land_collision_end(vector pos):Triggered when task stops colliding with land
-timer timer():Result of the llSetTimerEvent library function call.
+timer timer():Result of the llSetTimerEvent library function call
listen listen(integer channel, string name, key id, string message):Result of the llListen library function call
sensor sensor(integer num_detected):Result of the llSensor library function call
no_sensor no_sensor():Result of the llSensor library function call
@@ -44,8 +44,8 @@ attach attach(key id):Triggered when task attaches or detaches from agent
dataserver dataserver(key queryid, string data):Triggered when task receives asynchronous data
moving_start moving_start():Triggered when task begins moving
moving_end moving_end():Triggered when task stops moving
-on_rez on_rez(integer start_param):Triggered when task is rezed in from inventory or another task
-object_rez object_rez(key id):Triggered when task rezes in another task
+on_rez on_rez(integer start_param):Triggered when task is rezzed in from inventory or another task
+object_rez object_rez(key id):Triggered when task rezzes in another task
link_message link_message(integer sender_num, integer num, string str, key id):Triggered when task receives a link message via LLMessageLinked library function call
changed changed( integer change ):Triggered various event change the task:(test change with CHANGED_INVENTORY, CHANGED_COLOR, CHANGED_SHAPE, CHANGED_SCALE, CHANGED_TEXTURE, CHANGED_LINK, CHANGED_ALLOWED_DROP, CHANGED_OWNER, CHANGED_REGION, CHANGED_TELEPORT, CHANGED_REGION_START, CHANGED_MEDIA)
remote_data remote_data(integer event_type, key channel, key message_id, string sender,integer idata, string sdata):Triggered by various XML-RPC calls (event_type will be one of REMOTE_DATA_CHANNEL, REMOTE_DATA_REQUEST, REMOTE_DATA_REPLY)
@@ -151,15 +151,15 @@ PSYS_SRC_PATTERN_ANGLE
PSYS_SRC_PATTERN_ANGLE_CONE
PSYS_SRC_PATTERN_ANGLE_CONE_EMPTY
-OBJECT_UNKNOWN_DETAIL Returned by llGetObjectDetails when passed an invalid object parameter type.
-OBJECT_NAME Used with llGetObjectDetails to get an object's name.
-OBJECT_DESC Used with llGetObjectDetails to get an object's description.
-OBJECT_POS Used with llGetObjectDetails to get an object's position.
-OBJECT_ROT Used with llGetObjectDetails to get an object's rotation.
-OBJECT_VELOCITY Used with llGetObjectDetails to get an object's velocity.
-OBJECT_OWNER Used with llGetObjectDetails to get an object's owner's key. Will be NULL_KEY if group owned.
-OBJECT_GROUP Used with llGetObjectDetails to get an object's group's key.
-OBJECT_CREATOR Used with llGetObjectDetails to get an object's creator's key.
+OBJECT_UNKNOWN_DETAIL Returned by llGetObjectDetails when passed an invalid object parameter type
+OBJECT_NAME Used with llGetObjectDetails to get an object's name
+OBJECT_DESC Used with llGetObjectDetails to get an object's description
+OBJECT_POS Used with llGetObjectDetails to get an object's position
+OBJECT_ROT Used with llGetObjectDetails to get an object's rotation
+OBJECT_VELOCITY Used with llGetObjectDetails to get an object's velocity
+OBJECT_OWNER Used with llGetObjectDetails to get an object's owner's key. Will be NULL_KEY if group owned
+OBJECT_GROUP Used with llGetObjectDetails to get an object's group's key
+OBJECT_CREATOR Used with llGetObjectDetails to get an object's creator's key
# some vehicle params
VEHICLE_TYPE_NONE
@@ -198,7 +198,7 @@ VEHICLE_VERTICAL_ATTRACTION_EFFICIENCY A slider between 0 (bouncy) and 1 (critic
VEHICLE_VERTICAL_ATTRACTION_TIMESCALE The exponential timescale for the vehicle to align its z-axis to the world z-axis (vertical)
VEHICLE_BANKING_EFFICIENCY A slider between -1 (leans out of turns), 0 (no banking), and +1 (leans into turns)
-VEHICLE_BANKING_MIX A slider betwen 0 (static banking) and 1 (dynamic banking)
+VEHICLE_BANKING_MIX A slider between 0 (static banking) and 1 (dynamic banking)
VEHICLE_BANKING_TIMESCALE The exponential timescale for the banking behavior to take full effect
VEHICLE_FLAG_NO_DEFLECTION_UP Prevents linear deflection along world-z axis
@@ -208,9 +208,9 @@ VEHICLE_FLAG_HOVER_TERRAIN_ONLY Hover only pays attention to terrain height
VEHICLE_FLAG_HOVER_GLOBAL_HEIGHT Hover only pays attention to global height
VEHICLE_FLAG_HOVER_UP_ONLY Hover only pushes up
VEHICLE_FLAG_LIMIT_MOTOR_UP Prevents ground vehicles from motoring into the sky
-VEHICLE_FLAG_MOUSELOOK_STEER Makes vehicle try to turn toward mouselook direction.
-VEHICLE_FLAG_MOUSELOOK_BANK Makes vehicle try to turn toward mouselook direction assuming banking is enabled.
-VEHICLE_FLAG_CAMERA_DECOUPLED Causes the camera look-at axis to NOT move when the vehicle rotates.
+VEHICLE_FLAG_MOUSELOOK_STEER Makes vehicle try to turn toward mouselook direction
+VEHICLE_FLAG_MOUSELOOK_BANK Makes vehicle try to turn toward mouselook direction assuming banking is enabled
+VEHICLE_FLAG_CAMERA_DECOUPLED Causes the camera look-at axis to NOT move when the vehicle rotates
CAMERA_PITCH (-45 to 80) (Adjusts the angular amount that the camera aims straight ahead vs. straight down, maintaining the same distance. Analogous to 'incidence'.")
CAMERA_FOCUS_OFFSET (-10 to 10) A vector that adjusts the position of the camera focus position relative to the subject
@@ -238,7 +238,7 @@ INVENTORY_BODYPART Passed to task inventory library functions to reference body
INVENTORY_ANIMATION Passed to task inventory library functions to reference animations
INVENTORY_GESTURE Passed to task inventory library functions to reference gestures
INVENTORY_ALL Passed to task inventory library functions to reference all inventory items
-INVENTORY_NONE Returned by llGetInventoryType when no item is found.
+INVENTORY_NONE Returned by llGetInventoryType when no item is found
ATTACH_CHEST Passed to llAttachToAvatar to attach task to chest
ATTACH_HEAD Passed to llAttachToAvatar to attach task to head
@@ -256,7 +256,7 @@ ATTACH_LEAR Passed to llAttachToAvatar to attach task to left ear
ATTACH_REAR Passed to llAttachToAvatar to attach task to right ear
ATTACH_LEYE Passed to llAttachToAvatar to attach task to left eye
ATTACH_REYE Passed to llAttachToAvatar to attach task to right eye
-ATTACH_NOSE Passed to llAttachToAvatar to attach task to noce
+ATTACH_NOSE Passed to llAttachToAvatar to attach task to nose
ATTACH_RUARM Passed to llAttachToAvatar to attach task to right upper arm
ATTACH_RLARM Passed to llAttachToAvatar to attach task to right lower arm
ATTACH_LUARM Passed to llAttachToAvatar to attach task to left upper arm
@@ -296,7 +296,7 @@ PAYMENT_INFO_USED Used with llRequestAgentData to tell if Agent is of "Payment I
ANIM_ON Enable texture animation
LOOP Loop when animating textures
REVERSE Animate in the reverse direction
-PING_PONG Animate forward, then reverse.
+PING_PONG Animate forward, then reverse
SMOOTH Textures slides, instead of stepping
ROTATE Rotates the texture, instead of using frames
SCALE Scales the texture, instead of using frames
@@ -343,7 +343,7 @@ PRIM_FLEXIBLE Followed by TRUE or FALSE, integer softness, float gravity, float
PRIM_POINT_LIGHT Followed by TRUE or FALSE, vector color, float intensity, float radius, float falloff
PRIM_TEMP_ON_REZ Sets temporay on rez to TRUE or FALSE
PRIM_PHANTOM Sets phantom to TRUE or FALSE
-PRIM_CAST_SHADOWS DEPRECATED. Takes 1 parameter, an integer, but has no effect when set and always returns 0 if used in llGetPrimitiveParams.
+PRIM_CAST_SHADOWS DEPRECATED. Takes 1 parameter, an integer, but has no effect when set and always returns 0 if used in llGetPrimitiveParams
PRIM_POSITION Sets primitive position to a vector position
PRIM_SIZE Sets primitive size to a vector size
PRIM_ROTATION Sets primitive rotation
@@ -363,10 +363,10 @@ PRIM_TYPE_TUBE Followed by integer hole shape, vector cut, float hollow, vector
PRIM_TYPE_RING Followed by integer hole shape, vector cut, float hollow, vector twist,:vector hole size, vector top shear, vector advanced cut, vector taper,:float revolutions, float radius offset, and float skew
PRIM_TYPE_SCULPT Followed by a key/string texture uuid, and one of PRIM_SCULPT_TYPE_SPHERE, PRIM_SCULPT_TYPE_TORUS, PRIM_SCULPT_TYPE_PLANE, or PRIM_SCULPT_TYPE_CYLINDER
-PRIM_HOLE_DEFAULT Sets hole type to match the prim type.
-PRIM_HOLE_SQUARE Sets hole type to square.
-PRIM_HOLE_CIRCLE Sets hole type to circle.
-PRIM_HOLE_TRIANGLE Sets hole type to triangle.
+PRIM_HOLE_DEFAULT Sets hole type to match the prim type
+PRIM_HOLE_SQUARE Sets hole type to square
+PRIM_HOLE_CIRCLE Sets hole type to circle
+PRIM_HOLE_TRIANGLE Sets hole type to triangle
PRIM_MATERIAL_STONE Sets material to stone
PRIM_MATERIAL_METAL Sets material to metal
@@ -436,7 +436,7 @@ PARCEL_MEDIA_COMMAND_TIME Set media stream to specific time
PARCEL_MEDIA_COMMAND_SIZE Get or set the parcel's media pixel resolution
PARCEL_MEDIA_COMMAND_AGENT Allows media stream commands to apply to only one agent
PARCEL_MEDIA_COMMAND_UNLOAD Unloads the media stream
-PARCEL_MEDIA_COMMAND_AUTO_ALIGN Auto aligns the media stream to the texture size. May cause a performance hit and loss of some visual quality.
+PARCEL_MEDIA_COMMAND_AUTO_ALIGN Auto aligns the media stream to the texture size. May cause a performance hit and loss of some visual quality
PAY_HIDE Used with llSetPayPrice to hide a button
PAY_DEFAULT Used with llSetPayPrice to use the default price for a button
@@ -481,7 +481,7 @@ REGION_FLAG_RESTRICT_PUSHOBJECT Used with llGetRegionFlags to find if a region
HTTP_METHOD Used with llHTTPRequest to specify the method, such as "GET" or "POST"
HTTP_MIMETYPE Used with llHTTPRequest to specify the MIME type, defaults to "text/plain"
-HTTP_BODY_MAXLENGTH Used with llHTTPRequest to specify the maxium reponse body to return
+HTTP_BODY_MAXLENGTH Used with llHTTPRequest to specify the maximum response body to return
HTTP_VERIFY_CERT Used with llHTTPRequest to specify SSL certificate verification
HTTP_BODY_TRUNCATED Used with http_response to indicate truncation point in bytes
@@ -492,17 +492,17 @@ PARCEL_COUNT_OTHER Used with llGetParcelPrimCount to get the number of prims on
PARCEL_COUNT_SELECTED Used with llGetParcelPrimCount to get the number of prims on the parcel currently selected or sat upon
PARCEL_COUNT_TEMP Used with llGetParcelPrimCount to get the number of prims on the parcel that are temp on rez
-PARCEL_DETAILS_NAME Used with llGetParcelDetails to get the parcel name.
-PARCEL_DETAILS_DESC Used with llGetParcelDetails to get the parcel description.
-PARCEL_DETAILS_OWNER Used with llGetParcelDetails to get the parcel owner id.
-PARCEL_DETAILS_GROUP Used with llGetParcelDetails to get the parcel group id.
-PARCEL_DETAILS_AREA Used with llGetParcelDetails to get the parcel area in square meters.
-PARCEL_DETAILS_ID Used with llGetParcelDetails to get the parcel id.
-PARCEL_DETAILS_SEE_AVATARS Used with llGetParcelDetails to get the avatars visibility setting.
+PARCEL_DETAILS_NAME Used with llGetParcelDetails to get the parcel name
+PARCEL_DETAILS_DESC Used with llGetParcelDetails to get the parcel description
+PARCEL_DETAILS_OWNER Used with llGetParcelDetails to get the parcel owner id
+PARCEL_DETAILS_GROUP Used with llGetParcelDetails to get the parcel group id
+PARCEL_DETAILS_AREA Used with llGetParcelDetails to get the parcel area in square meters
+PARCEL_DETAILS_ID Used with llGetParcelDetails to get the parcel id
+PARCEL_DETAILS_SEE_AVATARS Used with llGetParcelDetails to get the avatars visibility setting
-STRING_TRIM_HEAD Used with llStringTrim to trim leading spaces from a string.
-STRING_TRIM_TAIL Used with llStringTrim to trim trailing spaces from a string.
-STRING_TRIM Used with llStringTrim to trim both leading and trailing spaces from a string.
+STRING_TRIM_HEAD Used with llStringTrim to trim leading spaces from a string
+STRING_TRIM_TAIL Used with llStringTrim to trim trailing spaces from a string
+STRING_TRIM Used with llStringTrim to trim both leading and trailing spaces from a string
CLICK_ACTION_NONE Used with llSetClickAction to disable the click action
CLICK_ACTION_TOUCH Used with llSetClickAction to set touch as the default action when object is clicked
@@ -514,9 +514,9 @@ CLICK_ACTION_PLAY Used with llSetClickAction to set play as the default ac
CLICK_ACTION_OPEN_MEDIA Used with llSetClickAction to set open-media as the default action when object is clicked
CLICK_ACTION_ZOOM Used with llSetClickAction to set zoom in as the default action when object is clicked
-TOUCH_INVALID_TEXCOORD Value returned by llDetectedTouchUV() and llDetectedTouchST() when the touch position is not valid.
-TOUCH_INVALID_VECTOR Value returned by llDetectedTouchPos(), llDetectedTouchNormal(), and llDetectedTouchBinormal() when the touch position is not valid.
-TOUCH_INVALID_FACE Value returned by llDetectedTouchFace() when the touch position is not valid.
+TOUCH_INVALID_TEXCOORD Value returned by llDetectedTouchUV() and llDetectedTouchST() when the touch position is not valid
+TOUCH_INVALID_VECTOR Value returned by llDetectedTouchPos(), llDetectedTouchNormal(), and llDetectedTouchBinormal() when the touch position is not valid
+TOUCH_INVALID_FACE Value returned by llDetectedTouchFace() when the touch position is not valid
PRIM_MEDIA_ALT_IMAGE_ENABLE Used with ll{Get,Set}PrimMediaParams to enable the default alt image for media
PRIM_MEDIA_CONTROLS Used with ll{Get,Set}PrimMediaParams to determine the controls shown for media
@@ -603,9 +603,11 @@ return Leave current function or event handler
# Comment
[one_sided_delimiter .8, .3, .15]
// Comment:Non-functional commentary or disabled code
+[two_sided_delimiter .8, .3, .15]
+/* */ Comment:Non-functional commentary or disabled code
# String literals
-[two_sided_delimiter 0, .2, 0]
+[double_quotation_marks 0, .2, 0]
" String literal
-#functions are supplied by the program now.
+#functions are supplied by the program now
diff --git a/indra/newview/app_settings/logcontrol.xml b/indra/newview/app_settings/logcontrol.xml
index ae72dee900..a76eb3cd37 100644
--- a/indra/newview/app_settings/logcontrol.xml
+++ b/indra/newview/app_settings/logcontrol.xml
@@ -43,7 +43,7 @@
<key>tags</key>
<array>
<!-- sample entry for debugging a specific item -->
-<!-- <string>Voice</string> -->
+<!-- <string>Voice</string> -->
</array>
</map>
</array>
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index 1b539fe0db..e9dd405bc6 100755..100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -619,7 +619,7 @@
<key>Type</key>
<string>String</string>
<key>Value</key>
- <string></string>
+ <string>http://lecs-viewer-web-components.s3.amazonaws.com/v3.0/[GRID_LOWERCASE]/avatars.html</string>
</map>
<key>AvatarBakedTextureUploadTimeout</key>
<map>
@@ -1150,27 +1150,16 @@
<key>Value</key>
<integer>0</integer>
</map>
- <key>ButtonFlashCount</key>
+ <key>EnableButtonFlashing</key>
<map>
<key>Comment</key>
- <string>Number of flashes after which flashing buttons stay lit up</string>
+ <string>Allow UI to flash buttons to get your attention</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
- <string>S32</string>
+ <string>Boolean</string>
<key>Value</key>
- <integer>8</integer>
- </map>
- <key>ButtonFlashRate</key>
- <map>
- <key>Comment</key>
- <string>Frequency at which buttons flash (hz)</string>
- <key>Persist</key>
<integer>1</integer>
- <key>Type</key>
- <string>F32</string>
- <key>Value</key>
- <real>1.25</real>
</map>
<key>ButtonHPad</key>
<map>
@@ -1414,6 +1403,18 @@
<real>0.5</real>
</map>
+ <key>CameraMaxCoF</key>
+ <map>
+ <key>Comment</key>
+ <string>Maximum camera circle of confusion for DoF effect</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>10.0</real>
+ </map>
+
<key>CameraFNumber</key>
<map>
<key>Comment</key>
@@ -1572,17 +1573,6 @@
<key>Value</key>
<integer>1</integer>
</map>
- <key>ChatVisible</key>
- <map>
- <key>Comment</key>
- <string>Chat bar is visible</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>1</integer>
- </map>
<key>ChatWindow</key>
<map>
<key>Comment</key>
@@ -1627,17 +1617,6 @@
<key>Value</key>
<integer>0</integer>
</map>
- <key>CloseSnapshotOnKeep</key>
- <map>
- <key>Comment</key>
- <string>Close snapshot window after saving snapshot</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>1</integer>
- </map>
<key>CmdLineDisableVoice</key>
<map>
<key>Comment</key>
@@ -1849,6 +1828,28 @@
<key>Value</key>
<integer>0</integer>
</map>
+ <key>CurlMaximumNumberOfHandles</key>
+ <map>
+ <key>Comment</key>
+ <string>Maximum number of handles curl can use (requires restart)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>256</integer>
+ </map>
+ <key>CurlRequestTimeOut</key>
+ <map>
+ <key>Comment</key>
+ <string>Max idle time of a curl request before killed (requires restart)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>120.0</real>
+ </map>
<key>CurlUseMultipleThreads</key>
<map>
<key>Comment</key>
@@ -1926,6 +1927,17 @@
<key>Value</key>
<integer>1</integer>
</map>
+ <key>DebugHideEmptySystemFolders</key>
+ <map>
+ <key>Comment</key>
+ <string>Hide empty system folders when on</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
<key>DebugInventoryFilters</key>
<map>
<key>Comment</key>
@@ -2728,7 +2740,7 @@
<key>Type</key>
<string>String</string>
<key>Value</key>
- <string></string>
+ <string>http://lecs-viewer-web-components.s3.amazonaws.com/v3.0/[GRID_LOWERCASE]/guide.html</string>
</map>
<key>DisableCameraConstraints</key>
<map>
@@ -3148,17 +3160,6 @@
<key>Value</key>
<integer>1</integer>
</map>
- <key>EnableRippleWater</key>
- <map>
- <key>Comment</key>
- <string>Whether to use ripple water shader or not</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>1</integer>
- </map>
<key>EnableTextureAtlas</key>
<map>
<key>Comment</key>
@@ -3179,7 +3180,7 @@
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
- <integer>1</integer>
+ <integer>0</integer>
</map>
<key>EnableVoiceChat</key>
<map>
@@ -4039,6 +4040,17 @@
<key>Value</key>
<string>http://viewer-help.secondlife.com/[LANGUAGE]/[CHANNEL]/[VERSION]/[TOPIC][DEBUG_MODE]</string>
</map>
+ <key>HowToHelpURL</key>
+ <map>
+ <key>Comment</key>
+ <string>URL for How To help content</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>http://lecs-viewer-web-components.s3.amazonaws.com/v3.0/[GRID_LOWERCASE]/howto/index.html</string>
+ </map>
<key>HomeSidePanelURL</key>
<map>
<key>Comment</key>
@@ -4281,16 +4293,49 @@
<key>Value</key>
<integer>0</integer>
</map>
- <key>InventoryMarketplaceUserStatus</key>
+ <key>InventoryOutboxLogging</key>
+ <map>
+ <key>Comment</key>
+ <string>Enable debug output associated with the Merchant Outbox.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>InventoryOutboxMaxFolderCount</key>
<map>
<key>Comment</key>
- <string>Marketplace user status.</string>
+ <string>Maximum number of subfolders allowed in a listing in the merchant outbox.</string>
<key>Persist</key>
- <integer>1</integer>
+ <integer>0</integer>
<key>Type</key>
- <string>String</string>
+ <string>U32</string>
<key>Value</key>
- <string />
+ <integer>21</integer>
+ </map>
+ <key>InventoryOutboxMaxFolderDepth</key>
+ <map>
+ <key>Comment</key>
+ <string>Maximum number of nested levels of subfolders allowed in a listing in the merchant outbox.</string>
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>U32</string>
+ <key>Value</key>
+ <integer>4</integer>
+ </map>
+ <key>InventoryOutboxMaxItemCount</key>
+ <map>
+ <key>Comment</key>
+ <string>Maximum number of items allowed in a listing in the merchant outbox.</string>
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>U32</string>
+ <key>Value</key>
+ <integer>200</integer>
</map>
<key>InventorySortOrder</key>
<map>
@@ -4534,6 +4579,17 @@
<key>Value</key>
<integer>0</integer>
</map>
+ <key>LeapCommand</key>
+ <map>
+ <key>Comment</key>
+ <string>Zero or more command lines to run LLSD Event API Plugin programs.</string>
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>LLSD</string>
+ <key>Value</key>
+ <array />
+ </map>
<key>LSLFindCaseInsensitivity</key>
<map>
<key>Comment</key>
@@ -4589,21 +4645,21 @@
<key>Value</key>
<integer>1</integer>
</map>
- <key>LastGPUClass</key>
+ <key>LastGPUString</key>
<map>
<key>Comment</key>
- <string>[DO NOT MODIFY] previous GPU class for tracking hardware changes</string>
+ <string>[DO NOT MODIFY] previous GPU id string for tracking hardware changes</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
- <string>S32</string>
+ <string>String</string>
<key>Value</key>
- <integer>-1</integer>
+ <string></string>
</map>
<key>LastFeatureVersion</key>
<map>
<key>Comment</key>
- <string>[DO NOT MODIFY] Version number for tracking hardware changes</string>
+ <string>[DO NOT MODIFY] Feature Table Version number for tracking rendering system changes</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
@@ -4667,6 +4723,17 @@
<string>0.0.0</string>
</map>
+ <key>LastSnapshotToProfileHeight</key>
+ <map>
+ <key>Comment</key>
+ <string>The height of the last profile snapshot, in px</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>768</integer>
+ </map>
<key>LastSnapshotToEmailHeight</key>
<map>
<key>Comment</key>
@@ -4678,6 +4745,17 @@
<key>Value</key>
<integer>768</integer>
</map>
+ <key>LastSnapshotToProfileWidth</key>
+ <map>
+ <key>Comment</key>
+ <string>The width of the last profile snapshot, in px</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>1024</integer>
+ </map>
<key>LastSnapshotToEmailWidth</key>
<map>
<key>Comment</key>
@@ -4733,17 +4811,6 @@
<key>Value</key>
<integer>512</integer>
</map>
- <key>LastSnapshotType</key>
- <map>
- <key>Comment</key>
- <string>Select this as next type of snapshot to take (0 = postcard, 1 = texture, 2 = local image)</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>S32</string>
- <key>Value</key>
- <integer>0</integer>
- </map>
<key>LeftClickShowMenu</key>
<map>
<key>Comment</key>
@@ -5094,7 +5161,7 @@
<key>Type</key>
<string>String</string>
<key>Value</key>
- <string>http://marketplace.secondlife.com/</string>
+ <string>https://marketplace.secondlife.com/</string>
</map>
<key>MarketplaceURL_objectFemale</key>
<map>
@@ -5105,7 +5172,7 @@
<key>Type</key>
<string>String</string>
<key>Value</key>
- <string>http://marketplace.secondlife.com/trampoline/viewer21/attachments</string>
+ <string>https://marketplace.secondlife.com/trampoline/viewer21/attachments</string>
</map>
<key>MarketplaceURL_objectMale</key>
<map>
@@ -5116,7 +5183,7 @@
<key>Type</key>
<string>String</string>
<key>Value</key>
- <string>http://marketplace.secondlife.com/trampoline/viewer21/attachments</string>
+ <string>https://marketplace.secondlife.com/trampoline/viewer21/attachments</string>
</map>
<key>MarketplaceURL_clothingFemale</key>
<map>
@@ -5127,7 +5194,7 @@
<key>Type</key>
<string>String</string>
<key>Value</key>
- <string>http://marketplace.secondlife.com/trampoline/viewer21/clothing_female_avatar</string>
+ <string>https://marketplace.secondlife.com/trampoline/viewer21/clothing_female_avatar</string>
</map>
<key>MarketplaceURL_clothingMale</key>
<map>
@@ -5138,7 +5205,7 @@
<key>Type</key>
<string>String</string>
<key>Value</key>
- <string>http://marketplace.secondlife.com/trampoline/viewer21/clothing_male_avatar</string>
+ <string>https://marketplace.secondlife.com/trampoline/viewer21/clothing_male_avatar</string>
</map>
<key>MarketplaceURL_bodypartFemale</key>
<map>
@@ -5149,7 +5216,7 @@
<key>Type</key>
<string>String</string>
<key>Value</key>
- <string>http://marketplace.secondlife.com</string>
+ <string>https://marketplace.secondlife.com/</string>
</map>
<key>MarketplaceURL_bodypartMale</key>
<map>
@@ -5160,7 +5227,7 @@
<key>Type</key>
<string>String</string>
<key>Value</key>
- <string>http://marketplace.secondlife.com/</string>
+ <string>https://marketplace.secondlife.com/</string>
</map>
<key>MarketplaceURL_glovesMale</key>
<map>
@@ -5171,7 +5238,7 @@
<key>Type</key>
<string>String</string>
<key>Value</key>
- <string>http://marketplace.secondlife.com/trampoline/viewer21/gloves_both_women_and_men</string>
+ <string>https://marketplace.secondlife.com/trampoline/viewer21/gloves_both_women_and_men</string>
</map>
<key>MarketplaceURL_glovesFemale</key>
<map>
@@ -5182,7 +5249,7 @@
<key>Type</key>
<string>String</string>
<key>Value</key>
- <string>http://marketplace.secondlife.com/trampoline/viewer21/gloves_both_women_and_men</string>
+ <string>https://marketplace.secondlife.com/trampoline/viewer21/gloves_both_women_and_men</string>
</map>
<key>MarketplaceURL_jacketFemale</key>
<map>
@@ -5193,7 +5260,7 @@
<key>Type</key>
<string>String</string>
<key>Value</key>
- <string>http://marketplace.secondlife.com/trampoline/viewer21/jacket_womens</string>
+ <string>https://marketplace.secondlife.com/trampoline/viewer21/jacket_womens</string>
</map>
<key>MarketplaceURL_jacketMale</key>
<map>
@@ -5204,7 +5271,7 @@
<key>Type</key>
<string>String</string>
<key>Value</key>
- <string>http://marketplace.secondlife.com/trampoline/viewer21/jacket_mens</string>
+ <string>https://marketplace.secondlife.com/trampoline/viewer21/jacket_mens</string>
</map>
<key>MarketplaceURL_shirtFemale</key>
<map>
@@ -5215,7 +5282,7 @@
<key>Type</key>
<string>String</string>
<key>Value</key>
- <string>http://marketplace.secondlife.com/trampoline/viewer21/shirt_womens</string>
+ <string>https://marketplace.secondlife.com/trampoline/viewer21/shirt_womens</string>
</map>
<key>MarketplaceURL_shirtMale</key>
<map>
@@ -5226,7 +5293,7 @@
<key>Type</key>
<string>String</string>
<key>Value</key>
- <string>http://marketplace.secondlife.com/trampoline/viewer21/shirt_mens</string>
+ <string>https://marketplace.secondlife.com/trampoline/viewer21/shirt_mens</string>
</map>
<key>MarketplaceURL_undershirtFemale</key>
<map>
@@ -5237,7 +5304,7 @@
<key>Type</key>
<string>String</string>
<key>Value</key>
- <string>http://marketplace.secondlife.com/trampoline/viewer21/undershirt_womens</string>
+ <string>https://marketplace.secondlife.com/trampoline/viewer21/undershirt_womens</string>
</map>
<key>MarketplaceURL_undershirtMale</key>
<map>
@@ -5248,7 +5315,7 @@
<key>Type</key>
<string>String</string>
<key>Value</key>
- <string>http://marketplace.secondlife.com/trampoline/viewer21/undershirt_mens</string>
+ <string>https://marketplace.secondlife.com/trampoline/viewer21/undershirt_mens</string>
</map>
<key>MarketplaceURL_skirtFemale</key>
<map>
@@ -5259,7 +5326,7 @@
<key>Type</key>
<string>String</string>
<key>Value</key>
- <string>http://marketplace.secondlife.com/trampoline/viewer21/skirts_women</string>
+ <string>https://marketplace.secondlife.com/trampoline/viewer21/skirts_women</string>
</map>
<key>MarketplaceURL_skirtMale</key>
<map>
@@ -5270,7 +5337,7 @@
<key>Type</key>
<string>String</string>
<key>Value</key>
- <string>http://marketplace.secondlife.com/trampoline/viewer21/skirts_women</string>
+ <string>https://marketplace.secondlife.com/trampoline/viewer21/skirts_women</string>
</map>
<key>MarketplaceURL_pantsFemale</key>
<map>
@@ -5281,7 +5348,7 @@
<key>Type</key>
<string>String</string>
<key>Value</key>
- <string>http://marketplace.secondlife.com/trampoline/viewer21/pants_women</string>
+ <string>https://marketplace.secondlife.com/trampoline/viewer21/pants_women</string>
</map>
<key>MarketplaceURL_pantsMale</key>
<map>
@@ -5292,7 +5359,7 @@
<key>Type</key>
<string>String</string>
<key>Value</key>
- <string>http://marketplace.secondlife.com/trampoline/viewer21/pants_men</string>
+ <string>https://marketplace.secondlife.com/trampoline/viewer21/pants_men</string>
</map>
<key>MarketplaceURL_underpantsFemale</key>
<map>
@@ -5303,7 +5370,7 @@
<key>Type</key>
<string>String</string>
<key>Value</key>
- <string>http://marketplace.secondlife.com/trampoline/viewer21/underwear_women</string>
+ <string>https://marketplace.secondlife.com/trampoline/viewer21/underwear_women</string>
</map>
<key>MarketplaceURL_underpantsMale</key>
<map>
@@ -5314,7 +5381,7 @@
<key>Type</key>
<string>String</string>
<key>Value</key>
- <string>http://marketplace.secondlife.com/trampoline/viewer21/underwear_men</string>
+ <string>https://marketplace.secondlife.com/trampoline/viewer21/underwear_men</string>
</map>
<key>MarketplaceURL_shoesFemale</key>
<map>
@@ -5325,7 +5392,7 @@
<key>Type</key>
<string>String</string>
<key>Value</key>
- <string>http://marketplace.secondlife.com/trampoline/viewer21/shoes_women</string>
+ <string>https://marketplace.secondlife.com/trampoline/viewer21/shoes_women</string>
</map>
<key>MarketplaceURL_shoesMale</key>
<map>
@@ -5336,7 +5403,7 @@
<key>Type</key>
<string>String</string>
<key>Value</key>
- <string>http://marketplace.secondlife.com/trampoline/viewer21/shoes_men</string>
+ <string>https://marketplace.secondlife.com/trampoline/viewer21/shoes_men</string>
</map>
<key>MarketplaceURL_socksFemale</key>
<map>
@@ -5347,7 +5414,7 @@
<key>Type</key>
<string>String</string>
<key>Value</key>
- <string>http://marketplace.secondlife.com/trampoline/viewer21/socks_women</string>
+ <string>https://marketplace.secondlife.com/trampoline/viewer21/socks_women</string>
</map>
<key>MarketplaceURL_socksMale</key>
<map>
@@ -5358,7 +5425,7 @@
<key>Type</key>
<string>String</string>
<key>Value</key>
- <string>http://marketplace.secondlife.com/trampoline/viewer21/socks_women</string>
+ <string>https://marketplace.secondlife.com/trampoline/viewer21/socks_women</string>
</map>
<key>MarketplaceURL_tattooMale</key>
<map>
@@ -5369,7 +5436,7 @@
<key>Type</key>
<string>String</string>
<key>Value</key>
- <string>http://marketplace.secondlife.com/trampoline/viewer21/tattoo_both_women_and_men</string>
+ <string>https://marketplace.secondlife.com/trampoline/viewer21/tattoo_both_women_and_men</string>
</map>
<key>MarketplaceURL_tattooFemale</key>
<map>
@@ -5380,7 +5447,7 @@
<key>Type</key>
<string>String</string>
<key>Value</key>
- <string>http://marketplace.secondlife.com/trampoline/viewer21/tattoo_both_women_and_men</string>
+ <string>https://marketplace.secondlife.com/trampoline/viewer21/tattoo_both_women_and_men</string>
</map>
<key>MarketplaceURL_hairFemale</key>
<map>
@@ -5391,7 +5458,7 @@
<key>Type</key>
<string>String</string>
<key>Value</key>
- <string>http://marketplace.secondlife.com/trampoline/viewer21/womens_hair</string>
+ <string>https://marketplace.secondlife.com/trampoline/viewer21/womens_hair</string>
</map>
<key>MarketplaceURL_hairMale</key>
<map>
@@ -5402,7 +5469,7 @@
<key>Type</key>
<string>String</string>
<key>Value</key>
- <string>http://marketplace.secondlife.com/trampoline/viewer21/mens_hair</string>
+ <string>https://marketplace.secondlife.com/trampoline/viewer21/mens_hair</string>
</map>
<key>MarketplaceURL_eyesFemale</key>
<map>
@@ -5413,7 +5480,7 @@
<key>Type</key>
<string>String</string>
<key>Value</key>
- <string>http://marketplace.secondlife.com/trampoline/viewer21/womens_eyes</string>
+ <string>https://marketplace.secondlife.com/trampoline/viewer21/womens_eyes</string>
</map>
<key>MarketplaceURL_eyesMale</key>
<map>
@@ -5424,7 +5491,7 @@
<key>Type</key>
<string>String</string>
<key>Value</key>
- <string>http://marketplace.secondlife.com/trampoline/viewer21/mens_eyes</string>
+ <string>https://marketplace.secondlife.com/trampoline/viewer21/mens_eyes</string>
</map>
<key>MarketplaceURL_shapeFemale</key>
<map>
@@ -5435,7 +5502,7 @@
<key>Type</key>
<string>String</string>
<key>Value</key>
- <string>http://marketplace.secondlife.com/trampoline/viewer21/womens_shape</string>
+ <string>https://marketplace.secondlife.com/trampoline/viewer21/womens_shape</string>
</map>
<key>MarketplaceURL_shapeMale</key>
<map>
@@ -5446,7 +5513,7 @@
<key>Type</key>
<string>String</string>
<key>Value</key>
- <string>http://marketplace.secondlife.com/trampoline/viewer21/mens_shape</string>
+ <string>https://marketplace.secondlife.com/trampoline/viewer21/mens_shape</string>
</map>
<key>MarketplaceURL_skinFemale</key>
<map>
@@ -5457,7 +5524,7 @@
<key>Type</key>
<string>String</string>
<key>Value</key>
- <string>http://marketplace.secondlife.com/trampoline/viewer21/womens_skin</string>
+ <string>https://marketplace.secondlife.com/trampoline/viewer21/womens_skin</string>
</map>
<key>MarketplaceURL_skinMale</key>
<map>
@@ -5468,7 +5535,7 @@
<key>Type</key>
<string>String</string>
<key>Value</key>
- <string>http://marketplace.secondlife.com/trampoline/viewer21/mens_skin</string>
+ <string>https://marketplace.secondlife.com/trampoline/viewer21/mens_skin</string>
</map>
<key>MaxDragDistance</key>
<map>
@@ -5655,7 +5722,18 @@
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
- <integer>0</integer>
+ <integer>1</integer>
+ </map>
+ <key>MemoryPrivatePoolSize</key>
+ <map>
+ <key>Comment</key>
+ <string>Size of the private memory pool in MB (min. value is 256)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>U32</string>
+ <key>Value</key>
+ <integer>512</integer>
</map>
<key>MemProfiling</key>
<map>
@@ -7075,7 +7153,7 @@
<key>QAModeEventHostPort</key>
<map>
<key>Comment</key>
- <string>Port on which lleventhost should listen</string>
+ <string>DEPRECATED: Port on which lleventhost should listen</string>
<key>Persist</key>
<integer>0</integer>
<key>Type</key>
@@ -7498,7 +7576,7 @@
<key>Value</key>
<integer>-1</integer>
</map>
- <key>RenderAvatarLODFactor</key>
+ <key>RenderAvatarLODFactor</key>
<map>
<key>Comment</key>
<string>Controls level of detail of avatars (multiplier for current screen area when calculated level of detail)</string>
@@ -7796,7 +7874,7 @@
<key>Type</key>
<string>U32</string>
<key>Value</key>
- <integer>6</integer>
+ <integer>16</integer>
</map>
<key>RenderDebugTextureBind</key>
<map>
@@ -7857,162 +7935,6 @@
<integer>0</integer>
</map>
- <key>RenderAnimateTrees</key>
- <map>
- <key>Comment</key>
- <string>Use GL matrix ops to animate tree branches.</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>0</integer>
- </map>
-
- <key>RenderGIRange</key>
- <map>
- <key>Comment</key>
- <string>Distance to cut off GI effect.</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>F32</string>
- <key>Value</key>
- <real>96</real>
- </map>
-
- <key>RenderGILuminance</key>
- <map>
- <key>Comment</key>
- <string>Luminance factor of global illumination contribution.</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>F32</string>
- <key>Value</key>
- <real>0.075</real>
- </map>
-
- <key>RenderGIBrightness</key>
- <map>
- <key>Comment</key>
- <string>Brightness factor of global illumination contribution.</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>F32</string>
- <key>Value</key>
- <real>0.3</real>
- </map>
-
- <key>RenderGINoise</key>
- <map>
- <key>Comment</key>
- <string>Noise of position sampling for GI photon mapping.</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>F32</string>
- <key>Value</key>
- <real>0.7</real>
- </map>
-
- <key>RenderGIAttenuation</key>
- <map>
- <key>Comment</key>
- <string>Distance attenuation factor for indirect lighting.</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>F32</string>
- <key>Value</key>
- <real>0.1</real>
- </map>
-
- <key>RenderGIBlurBrightness</key>
- <map>
- <key>Comment</key>
- <string>Brightness factor of global illumination blur effect.</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>F32</string>
- <key>Value</key>
- <real>1.025</real>
- </map>
-
- <key>RenderGIBlurEdgeWeight</key>
- <map>
- <key>Comment</key>
- <string>Edge weight for GI soften filter (sharpness).</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>F32</string>
- <key>Value</key>
- <real>0.8</real>
- </map>
-
- <key>RenderGIBlurIncrement</key>
- <map>
- <key>Comment</key>
- <string>Increment of scale for each pass of global illumination blur effect.</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>F32</string>
- <key>Value</key>
- <real>0.8</real>
- </map>
-
- <key>RenderLuminanceScale</key>
- <map>
- <key>Comment</key>
- <string>Luminance value scalar for darkening effect.</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>F32</string>
- <key>Value</key>
- <real>1.0</real>
- </map>
-
- <key>RenderSunLuminanceScale</key>
- <map>
- <key>Comment</key>
- <string>Sun Luminance value scalar for darkening effect.</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>F32</string>
- <key>Value</key>
- <real>1.0</real>
- </map>
-
- <key>RenderSunLuminanceOffset</key>
- <map>
- <key>Comment</key>
- <string>Sun Luminance value offset for darkening effect.</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>F32</string>
- <key>Value</key>
- <real>0</real>
- </map>
-
- <key>RenderLuminanceDetail</key>
- <map>
- <key>Comment</key>
- <string>Mipmap level to use for luminance</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>F32</string>
- <key>Value</key>
- <real>16.0</real>
- </map>
-
<key>RenderMinimumLODTriangleCount</key>
<map>
<key>Comment</key>
@@ -8149,7 +8071,19 @@
<key>Value</key>
<integer>0</integer>
</map>
-
+
+ <key>CameraDoFResScale</key>
+ <map>
+ <key>Comment</key>
+ <string>Amount to scale down depth of field resolution. Valid range is 0.25 (quarter res) to 1.0 (full res)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>0.7</real>
+ </map>
+
<key>RenderSpotLightsInNondeferred</key>
<map>
<key>Comment</key>
@@ -8333,18 +8267,6 @@
<integer>0</integer>
</map>
- <key>RenderDeferredGI</key>
- <map>
- <key>Comment</key>
- <string>Enable GI in deferred renderer.</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>0</integer>
- </map>
-
<key>RenderDeferredSun</key>
<map>
<key>Comment</key>
@@ -8488,92 +8410,6 @@
<real>0</real>
</map>
- <key>RenderGIAmbiance</key>
- <map>
- <key>Comment</key>
- <string>Ambiance factor of global illumination contribution.</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>F32</string>
- <key>Value</key>
- <real>0.5</real>
- </map>
-
- <key>RenderGIMinRenderSize</key>
- <map>
- <key>Comment</key>
- <string>Minimum size of objects to put into GI source map.</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>F32</string>
- <key>Value</key>
- <real>0.5</real>
- </map>
-
- <key>RenderGIBlurColorCurve</key>
- <map>
- <key>Comment</key>
- <string>Color curve for GI softening kernel</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>Vector3</string>
- <key>Value</key>
- <array>
- <real>1.0</real>
- <real>0.6</real>
- <real>0.02</real>
- </array>
- </map>
-
- <key>RenderGIBlurPasses</key>
- <map>
- <key>Comment</key>
- <string>Scale of GI softening kernel.</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>U32</string>
- <key>Value</key>
- <real>4</real>
- </map>
-
- <key>RenderGIBlurSize</key>
- <map>
- <key>Comment</key>
- <string>Scale of GI softening kernel.</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>F32</string>
- <key>Value</key>
- <real>4.0</real>
- </map>
- <key>RenderGIBlurSamples</key>
- <map>
- <key>Comment</key>
- <string>Number of samples to take for each pass of GI blur (value range 1-16). Actual number of samples is value * 2 - 1.</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>U32</string>
- <key>Value</key>
- <real>16</real>
- </map>
- <key>RenderGIBlurDistFactor</key>
- <map>
- <key>Comment</key>
- <string>Distance scaler for GI blur.</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>F32</string>
- <key>Value</key>
- <real>0.0</real>
- </map>
-
<key>RenderDynamicLOD</key>
<map>
<key>Comment</key>
@@ -8616,7 +8452,7 @@
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
- <integer>0</integer>
+ <integer>1</integer>
</map>
<key>RenderAutoMaskAlphaDeferred</key>
<map>
@@ -8673,6 +8509,17 @@
<key>Value</key>
<real>1.0</real>
</map>
+ <key>RenderGLCoreProfile</key>
+ <map>
+ <key>Comment</key>
+ <string>Don't use a compatibility profile OpenGL context. Requires restart. Basic shaders MUST be enabled.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
<key>RenderGlow</key>
<map>
<key>Comment</key>
@@ -9243,6 +9090,28 @@
<key>Value</key>
<integer>1</integer>
</map>
+ <key>RenderAutoMuteByteLimit</key>
+ <map>
+ <key>Comment</key>
+ <string>Maximum bytes of attachments before an avatar is automatically visually muted (0 for no limit).</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>U32</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>RenderAutoMuteSurfaceAreaLimit</key>
+ <map>
+ <key>Comment</key>
+ <string>Maximum surface area of attachments before an avatar is automatically visually muted (0 for no limit).</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
<key>RenderUseShaderLOD</key>
<map>
<key>Comment</key>
@@ -9276,6 +9145,17 @@
<key>Value</key>
<integer>1</integer>
</map>
+ <key>RenderUseVAO</key>
+ <map>
+ <key>Comment</key>
+ <string>Use GL Vertex Array Objects</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
<key>RenderVBOMappingDisable</key>
<map>
<key>Comment</key>
@@ -9285,7 +9165,7 @@
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
- <integer>0</integer>
+ <integer>1</integer>
</map>
<key>RenderUseStreamVBO</key>
<map>
@@ -9720,7 +9600,7 @@
<key>ShowBuildButton</key>
<map>
<key>Comment</key>
- <string>Shows/Hides Build button in the bottom tray.</string>
+ <string>Shows/hides build button in the bottom tray.</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
@@ -9731,7 +9611,7 @@
<key>ShowCameraButton</key>
<map>
<key>Comment</key>
- <string>Show/Hide View button in the bottom tray.</string>
+ <string>Show/hide view button in the bottom tray.</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
@@ -9819,7 +9699,7 @@
<key>ShowGestureButton</key>
<map>
<key>Comment</key>
- <string>Shows/Hides Gesture button in the bottom tray.</string>
+ <string>Shows/hides gesture button in the bottom tray.</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
@@ -9852,7 +9732,7 @@
<key>ShowMiniMapButton</key>
<map>
<key>Comment</key>
- <string>Shows/Hides Mini-Map button in the bottom tray.</string>
+ <string>Shows/hides mini-map button in the bottom tray.</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
@@ -9863,7 +9743,7 @@
<key>ShowMoveButton</key>
<map>
<key>Comment</key>
- <string>Shows/Hides Move button in the bottom tray.</string>
+ <string>Shows/hides move button in the bottom tray.</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
@@ -9896,7 +9776,7 @@
<key>ShowSearchButton</key>
<map>
<key>Comment</key>
- <string>Shows/Hides Search button in the bottom tray.</string>
+ <string>Shows/hides search button in the bottom tray.</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
@@ -9907,7 +9787,7 @@
<key>ShowSnapshotButton</key>
<map>
<key>Comment</key>
- <string>Shows/Hides Snapshot button button in the bottom tray.</string>
+ <string>Shows/hides snapshot button button in the bottom tray.</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
@@ -9929,7 +9809,7 @@
<key>ShowNavbarFavoritesPanel</key>
<map>
<key>Comment</key>
- <string>Show/Hide Navigation Bar Favorites Panel</string>
+ <string>Show/hide navigation bar favorites panel</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
@@ -9940,7 +9820,7 @@
<key>ShowNavbarNavigationPanel</key>
<map>
<key>Comment</key>
- <string>Show/Hide Navigation Bar Navigation Panel</string>
+ <string>Show/hide navigation bar navigation panel</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
@@ -9951,7 +9831,7 @@
<key>ShowWorldMapButton</key>
<map>
<key>Comment</key>
- <string>Shows/Hides Map button in the bottom tray.</string>
+ <string>Shows/hides map button in the bottom tray.</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
@@ -9962,18 +9842,7 @@
<key>ShowMiniLocationPanel</key>
<map>
<key>Comment</key>
- <string>Show/Hide Mini-Location Panel</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>0</integer>
- </map>
- <key>SidebarCameraMovement</key>
- <map>
- <key>Comment</key>
- <string>Reflects world rect changing while changing sidebar visibility.</string>
+ <string>Show/hide mini-location panel</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
@@ -10597,28 +10466,6 @@
<key>Value</key>
<integer>0</integer>
</map>
- <key>SnapshotLocalLastResolution</key>
- <map>
- <key>Comment</key>
- <string>Take next local snapshot at this resolution</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>S32</string>
- <key>Value</key>
- <integer>0</integer>
- </map>
- <key>SnapshotPostcardLastResolution</key>
- <map>
- <key>Comment</key>
- <string>Take next postcard snapshot at this resolution</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>S32</string>
- <key>Value</key>
- <integer>0</integer>
- </map>
<key>SnapshotQuality</key>
<map>
<key>Comment</key>
@@ -10652,17 +10499,6 @@
<key>Value</key>
<string>http://photos.apps.staging.avatarsunited.com/viewer_config</string>
</map>
- <key>SnapshotTextureLastResolution</key>
- <map>
- <key>Comment</key>
- <string>Take next texture snapshot at this resolution</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>S32</string>
- <key>Value</key>
- <integer>0</integer>
- </map>
<key>SpeedTest</key>
<map>
<key>Comment</key>
@@ -10916,7 +10752,17 @@
<key>Value</key>
<real>0.699999988079</real>
</map>
- <key>ToolTipFadeTime</key>
+ <key>ToolTipFastDelay</key>
+ <map>
+ <key>Comment</key>
+ <string>Seconds before displaying tooltip when mouse stops over UI element (when a tooltip is already visible)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>0.1</real>
+ </map> <key>ToolTipFadeTime</key>
<map>
<key>Comment</key>
<string>Seconds over which tooltip fades away</string>
@@ -11004,6 +10850,39 @@
<key>Value</key>
<integer>0</integer>
</map>
+ <key>TranslationService</key>
+ <map>
+ <key>Comment</key>
+ <string>Translation API to use. (google|bing)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>bing</string>
+ </map>
+ <key>GoogleTranslateAPIKey</key>
+ <map>
+ <key>Comment</key>
+ <string>Google Translate API key</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string></string>
+ </map>
+ <key>BingTranslateAPIKey</key>
+ <map>
+ <key>Comment</key>
+ <string>Bing AppID to use with the Microsoft Translator API</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string></string>
+ </map>
<key>TutorialURL</key>
<map>
<key>Comment</key>
@@ -11554,17 +11433,6 @@
<key>Value</key>
<real>3</real>
</map>
- <key>UIResizeBarOverlap</key>
- <map>
- <key>Comment</key>
- <string>Size of UI resize bar overlap</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>S32</string>
- <key>Value</key>
- <real>1</real>
- </map>
<key>UIScaleFactor</key>
<map>
<key>Comment</key>
@@ -12234,7 +12102,7 @@
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
- <integer>1</integer>
+ <boolean>1</boolean>
</map>
<key>UseFreezeFrame</key>
<map>
@@ -12378,50 +12246,6 @@
<key>Value</key>
<integer>1</integer>
</map>
- <key>VectorizeEnable</key>
- <map>
- <key>Comment</key>
- <string>Enable general vector operations and data alignment.</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>0</integer>
- </map>
- <key>VectorizePerfTest</key>
- <map>
- <key>Comment</key>
- <string>Test SSE/vectorization performance and choose fastest version.</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>1</integer>
- </map>
- <key>VectorizeProcessor</key>
- <map>
- <key>Comment</key>
- <string>0=Compiler Default, 1=SSE, 2=SSE2, autodetected</string>
- <key>Persist</key>
- <integer>0</integer>
- <key>Type</key>
- <string>U32</string>
- <key>Value</key>
- <integer>0</integer>
- </map>
- <key>VectorizeSkin</key>
- <map>
- <key>Comment</key>
- <string>Enable vector operations for avatar skinning.</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>1</integer>
- </map>
<key>VelocityInterpolate</key>
<map>
<key>Comment</key>
@@ -12873,10 +12697,10 @@
<key>Value</key>
<integer>1</integer>
</map>
- <key>WindowFullScreen</key>
+ <key>FullScreen</key>
<map>
<key>Comment</key>
- <string>SL viewer window full screen</string>
+ <string>run a fullscreen session</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
@@ -12884,6 +12708,17 @@
<key>Value</key>
<integer>0</integer>
</map>
+ <key>MinWindowHeight</key>
+ <map>
+ <key>Comment</key>
+ <string>SL viewer minimum window height in pixels</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>U32</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
<key>WindowHeight</key>
<map>
<key>Comment</key>
@@ -12891,7 +12726,7 @@
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
- <string>S32</string>
+ <string>U32</string>
<key>Value</key>
<integer>738</integer>
</map>
@@ -12906,6 +12741,17 @@
<key>Value</key>
<integer>0</integer>
</map>
+ <key>MinWindowWidth</key>
+ <map>
+ <key>Comment</key>
+ <string>SL viewer minimum window width in pixels</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>U32</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
<key>WindowWidth</key>
<map>
<key>Comment</key>
@@ -12913,7 +12759,7 @@
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
- <string>S32</string>
+ <string>U32</string>
<key>Value</key>
<integer>1024</integer>
</map>
@@ -13340,7 +13186,7 @@
<key>Comment</key>
<string>Settings that are a applied per session (not saved).</string>
<key>Persist</key>
- <integer>1</integer>
+ <integer>0</integer>
<key>Type</key>
<string>String</string>
<key>Value</key>
@@ -13351,7 +13197,7 @@
<key>Comment</key>
<string>User settings that are a applied per session (not saved).</string>
<key>Persist</key>
- <integer>1</integer>
+ <integer>0</integer>
<key>Type</key>
<string>String</string>
<key>Value</key>
@@ -13564,7 +13410,7 @@
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
- <integer>0</integer>
+ <integer>1</integer>
</map>
<key>ShowOfferedInventory</key>
<map>
@@ -13588,17 +13434,6 @@
<key>Value</key>
<string>http://common-flash-secondlife-com.s3.amazonaws.com/viewer/v2.6/agni/404.html</string>
</map>
- <key>DestinationsAndAvatarsVisibility</key>
- <map>
- <key>Comment</key>
- <string>Whether destination panel or avatar picker are open (0=destination guide, 1=avatar picker, default=nothing)</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>S32</string>
- <key>Value</key>
- <integer>0</integer>
- </map>
<key>OpenIMOnVoice</key>
<map>
<key>Comment</key>
@@ -13621,10 +13456,10 @@
<key>Value</key>
<integer>1</integer>
</map>
- <key>WebProfileRect</key>
+ <key>WebProfileFloaterRect</key>
<map>
<key>Comment</key>
- <string>Web profile dimensions</string>
+ <string>Web profile floater dimensions</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
@@ -13632,8 +13467,8 @@
<key>Value</key>
<array>
<integer>0</integer>
- <integer>650</integer>
- <integer>490</integer>
+ <integer>680</integer>
+ <integer>485</integer>
<integer>0</integer>
</array>
</map>
diff --git a/indra/newview/app_settings/settings_minimal.xml b/indra/newview/app_settings/settings_minimal.xml
index 29e52ab054..01a70f2671 100644
--- a/indra/newview/app_settings/settings_minimal.xml
+++ b/indra/newview/app_settings/settings_minimal.xml
@@ -1,474 +1 @@
-<llsd>
- <map>
- <key>ChannelBottomPanelMargin</key>
- <map>
- <key>Comment</key>
- <string>Space from a lower toast to the Bottom Tray</string>
- <key>Type</key>
- <string>S32</string>
- <key>Value</key>
- <integer>2</integer>
- </map>
- <key>ClickActionBuyEnabled</key>
- <map>
- <key>Comment</key>
- <string>Enable click to buy actions in tool pie menu</string>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>0</integer>
- </map>
- <key>ClickActionPayEnabled</key>
- <map>
- <key>Comment</key>
- <string>Enable click to pay actions in tool pie menu</string>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>0</integer>
- </map>
- <key>EnableGrab</key>
- <map>
- <key>Comment</key>
- <string>Use Ctrl+mouse to grab and manipulate objects</string>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>0</integer>
- </map>
- <key>EnableMouselook</key>
- <map>
- <key>Comment</key>
- <string>Allow first person perspective and mouse control of camera</string>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>0</integer>
- </map>
- <key>HelpURLFormat</key>
- <map>
- <key>Comment</key>
- <string>URL pattern for help page; arguments will be encoded; see llviewerhelp.cpp:buildHelpURL for arguments</string>
- <key>Type</key>
- <string>String</string>
- <key>Value</key>
- <string>http://common-flash-secondlife-com.s3.amazonaws.com/viewer/v2.6/agni/howto/index.html?topic=[TOPIC]</string>
- </map>
- <key>PreferredMaturity</key>
- <map>
- <key>Comment</key>
- <string>Setting for the user&apos;s preferred maturity level (consts in indra_constants.h)</string>
- <key>Type</key>
- <string>U32</string>
- <key>Value</key>
- <integer>21</integer>
- </map>
- <key>RenderTrackerBeacon</key>
- <map>
- <key>Comment</key>
- <string>Display tracking arrow and beacon to target avatar, teleport destination</string>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>0</integer>
- </map>
- <key>ShowScriptErrors</key>
- <map>
- <key>Comment</key>
- <string>Show script errors</string>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>0</integer>
- </map>
- <key>ShowScriptErrorsLocation</key>
- <map>
- <key>Comment</key>
- <string>Show script error in chat or window</string>
- <key>Type</key>
- <string>S32</string>
- <key>Value</key>
- <integer>0</integer>
- </map>
- <key>SkinCurrent</key>
- <map>
- <key>Comment</key>
- <string>The currently selected skin.</string>
- <key>Type</key>
- <string>String</string>
- <key>Value</key>
- <string>minimal</string>
- </map>
- <key>UseExternalBrowser</key>
- <map>
- <key>Comment</key>
- <string>Use default browser when opening web pages instead of in-world browser.</string>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>0</integer>
- </map>
- <key>VoiceCallsRejectGroup</key>
- <map>
- <key>Comment</key>
- <string>Silently reject all incoming group voice calls.</string>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>1</integer>
- </map>
- <key>VoiceDisableMic</key>
- <map>
- <key>Comment</key>
- <string>Completely disable the ability to open the mic.</string>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>0</integer>
- </map>
- <key>ScriptsCanShowUI</key>
- <map>
- <key>Comment</key>
- <string>Allow LSL calls (such as LLMapDestination) to spawn viewer UI</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>0</integer>
- </map>
- <key>ChatFontSize</key>
- <map>
- <key>Comment</key>
- <string>Size of chat text in chat console (0 = small, 1 = big, 2 = extra large)</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>S32</string>
- <key>Value</key>
- <integer>1</integer>
- </map>
- <key>AvatarPickerHintTimeout</key>
- <map>
- <key>Comment</key>
- <string>Number of seconds to wait before telling resident about avatar picker.</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>F32</string>
- <key>Value</key>
- <real>0.0</real>
- </map>
- <key>RenderShowGroupTitleAll</key>
- <map>
- <key>Comment</key>
- <string>Show group titles in name labels</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>0</integer>
- </map>
- <key>OpenSidePanelsInFloaters</key>
- <map>
- <key>Comment</key>
- <string>If true, will always open side panel contents in a floater.</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>1</integer>
- </map>
- <key>AvatarInspectorTooltipDelay</key>
- <map>
- <key>Comment</key>
- <string>Seconds before displaying avatar inspector tooltip</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>F32</string>
- <key>Value</key>
- <real>0.1</real>
- </map>
- <key>AFKTimeout</key>
- <map>
- <key>Comment</key>
- <string>
- Time before automatically setting AFK (away from keyboard) mode (seconds, 0=never).
- Valid values are: 0, 120, 300, 600, 1800
- </string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>S32</string>
- <key>Value</key>
- <real>0</real>
- </map>
- <key>SLURLTeleportDirectly</key>
- <map>
- <key>Comment</key>
- <string>Clicking on a slurl will teleport you directly instead of opening places panel</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>1</integer>
- </map>
- <key>EnableClassifieds</key>
- <map>
- <key>Comment</key>
- <string>Enable creation of new classified ads</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>0</integer>
- </map>
- <key>EnableGroupInfo</key>
- <map>
- <key>Comment</key>
- <string>Enable viewing and editing of group info.</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>0</integer>
- </map>
- <key>EnablePlaceProfile</key>
- <map>
- <key>Comment</key>
- <string>Enable viewing of place profile from web link</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>0</integer>
- </map>
- <key>EnablePicks</key>
- <map>
- <key>Comment</key>
- <string>Enable editing of picks</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>0</integer>
- </map>
- <key>EnableWorldMap</key>
- <map>
- <key>Comment</key>
- <string>Enable opening world map from web link</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>0</integer>
- </map>
- <key>EnableAvatarPay</key>
- <map>
- <key>Comment</key>
- <string>Enable paying other avatars from web link</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>0</integer>
- </map>
- <key>EnableVoiceCall</key>
- <map>
- <key>Comment</key>
- <string>Enable voice calls from web link</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>1</integer>
- </map>
- <key>EnableAvatarShare</key>
- <map>
- <key>Comment</key>
- <string>Enable sharing from web link</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>0</integer>
- </map>
- <key>EnableInventory</key>
- <map>
- <key>Comment</key>
- <string>Enable opening inventory from web link</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>0</integer>
- </map>
- <key>EnableSearch</key>
- <map>
- <key>Comment</key>
- <string>Enable opening search from web link</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>0</integer>
- </map>
- <key>EnableAppearance</key>
- <map>
- <key>Comment</key>
- <string>Enable opening appearance from web link</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>0</integer>
- </map>
- <key>DoubleClickShowWorldMap</key>
- <map>
- <key>Comment</key>
- <string>Enable double-click to show world map from mini map</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>0</integer>
- </map>
- <key>EnableGroupChatPopups</key>
- <map>
- <key>Comment</key>
- <string>Enable Incoming Group Chat Popups</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>0</integer>
- </map>
- <key>SearchFromAddressBar</key>
- <map>
- <key>Comment</key>
- <string>Can enter search queries into navigation address bar</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>0</integer>
- </map>
- <key>DestinationGuideURL</key>
- <map>
- <key>Comment</key>
- <string>Destination guide contents</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>String</string>
- <key>Value</key>
- <string>http://common-flash-secondlife-com.s3.amazonaws.com/viewer/v2.6/agni/guide.html</string>
- </map>
- <key>AvatarPickerURL</key>
- <map>
- <key>Comment</key>
- <string>Avatar picker contents</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>String</string>
- <key>Value</key>
- <string>http://common-flash-secondlife-com.s3.amazonaws.com/viewer/v2.6/agni/avatars.html</string>
- </map>
- <key>LogInventoryDecline</key>
- <map>
- <key>Comment</key>
- <string>Log in system chat whenever an inventory offer is declined</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>0</integer>
- </map>
- <key>UseHTTPInventory</key>
- <map>
- <key>Comment</key>
- <string>Allow use of http inventory transfers instead of UDP</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>0</integer>
- </map>
- <key>ClickToWalk</key>
- <map>
- <key>Comment</key>
- <string>Click in world to walk to location</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>1</integer>
- </map>
- <key>ShowOfferedInventory</key>
- <map>
- <key>Comment</key>
- <string>Show inventory window with last inventory offer selected when receiving inventory from other users.</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>0</integer>
- </map>
- <key>OpenIMOnVoice</key>
- <map>
- <key>Comment</key>
- <string>Open the corresponding IM window when connecting to a voice call.</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>1</integer>
- </map>
- <key>AllowBottomTrayButtonReordering</key>
- <map>
- <key>Comment</key>
- <string>Allow user to move and hide bottom tray buttons</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>0</integer>
- </map>
- <key>ShowHelpOnFirstLogin</key>
- <map>
- <key>Comment</key>
- <string>Show Help Floater on first login</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>1</integer>
- </map>
- </map>
-</llsd>
+<llsd/> \ No newline at end of file
diff --git a/indra/newview/app_settings/settings_per_account.xml b/indra/newview/app_settings/settings_per_account.xml
index d8295ddb87..8cdd8ed838 100644
--- a/indra/newview/app_settings/settings_per_account.xml
+++ b/indra/newview/app_settings/settings_per_account.xml
@@ -33,6 +33,17 @@
<key>Value</key>
<string />
</map>
+ <key>DisplayDestinationsOnInitialRun</key>
+ <map>
+ <key>Comment</key>
+ <string>Display the destinations guide when a user first launches Second Life.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
<key>LastInventoryInboxActivity</key>
<map>
<key>Comment</key>
diff --git a/indra/newview/app_settings/shaders/class1/avatar/avatarSkinV.glsl b/indra/newview/app_settings/shaders/class1/avatar/avatarSkinV.glsl
index c72da8d758..bc63d07d72 100644
--- a/indra/newview/app_settings/shaders/class1/avatar/avatarSkinV.glsl
+++ b/indra/newview/app_settings/shaders/class1/avatar/avatarSkinV.glsl
@@ -24,8 +24,7 @@
*/
-
-attribute vec4 weight; //1
+ATTRIBUTE vec4 weight;
uniform vec4 matrixPalette[45];
diff --git a/indra/newview/app_settings/shaders/class1/avatar/avatarV.glsl b/indra/newview/app_settings/shaders/class1/avatar/avatarV.glsl
index c2fe60ddaf..19203ab670 100644
--- a/indra/newview/app_settings/shaders/class1/avatar/avatarV.glsl
+++ b/indra/newview/app_settings/shaders/class1/avatar/avatarV.glsl
@@ -22,8 +22,17 @@
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
-
+uniform mat4 projection_matrix;
+
+ATTRIBUTE vec3 position;
+ATTRIBUTE vec3 normal;
+ATTRIBUTE vec2 texcoord0;
+
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+
+uniform vec4 color;
vec4 calcLighting(vec3 pos, vec3 norm, vec4 color, vec4 baseCol);
mat4 getSkinnedTransform();
@@ -31,32 +40,30 @@ void calcAtmospherics(vec3 inPositionEye);
void main()
{
- gl_TexCoord[0] = gl_MultiTexCoord0;
+ vary_texcoord0 = texcoord0;
vec4 pos;
vec3 norm;
+ vec4 pos_in = vec4(position.xyz, 1.0);
+
mat4 trans = getSkinnedTransform();
- pos.x = dot(trans[0], gl_Vertex);
- pos.y = dot(trans[1], gl_Vertex);
- pos.z = dot(trans[2], gl_Vertex);
+ pos.x = dot(trans[0], pos_in);
+ pos.y = dot(trans[1], pos_in);
+ pos.z = dot(trans[2], pos_in);
pos.w = 1.0;
- norm.x = dot(trans[0].xyz, gl_Normal);
- norm.y = dot(trans[1].xyz, gl_Normal);
- norm.z = dot(trans[2].xyz, gl_Normal);
+ norm.x = dot(trans[0].xyz, normal);
+ norm.y = dot(trans[1].xyz, normal);
+ norm.z = dot(trans[2].xyz, normal);
norm = normalize(norm);
- gl_Position = gl_ProjectionMatrix * pos;
-
- //gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
+ gl_Position = projection_matrix * pos;
- gl_FogFragCoord = length(pos.xyz);
-
calcAtmospherics(pos.xyz);
- vec4 color = calcLighting(pos.xyz, norm, gl_Color, vec4(0,0,0,0));
- gl_FrontColor = color;
+ vec4 col = calcLighting(pos.xyz, norm, color, vec4(0,0,0,0));
+ vertex_color = col;
}
diff --git a/indra/newview/app_settings/shaders/class1/avatar/eyeballV.glsl b/indra/newview/app_settings/shaders/class1/avatar/eyeballV.glsl
index 1a0866be0a..82db15c3ae 100644
--- a/indra/newview/app_settings/shaders/class1/avatar/eyeballV.glsl
+++ b/indra/newview/app_settings/shaders/class1/avatar/eyeballV.glsl
@@ -22,8 +22,19 @@
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
-
+uniform mat3 normal_matrix;
+uniform mat4 texture_matrix0;
+uniform mat4 modelview_matrix;
+uniform mat4 modelview_projection_matrix;
+
+ATTRIBUTE vec3 position;
+ATTRIBUTE vec4 diffuse_color;
+ATTRIBUTE vec3 normal;
+ATTRIBUTE vec2 texcoord0;
+
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
vec4 calcLightingSpecular(vec3 pos, vec3 norm, vec4 color, inout vec4 specularColor, vec4 baseCol);
void calcAtmospherics(vec3 inPositionEye);
@@ -31,17 +42,18 @@ void calcAtmospherics(vec3 inPositionEye);
void main()
{
//transform vertex
- gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
- gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
+ vec3 pos = (modelview_matrix * vec4(position.xyz, 1.0)).xyz;
+ gl_Position = modelview_projection_matrix * vec4(position.xyz, 1.0);
+ vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy;
+
- vec3 pos = (gl_ModelViewMatrix * gl_Vertex).xyz;
- vec3 norm = normalize(gl_NormalMatrix * gl_Normal);
+ vec3 norm = normalize(normal_matrix * normal);
calcAtmospherics(pos.xyz);
vec4 specular = vec4(1.0);
- vec4 color = calcLightingSpecular(pos, norm, gl_Color, specular, vec4(0.0));
- gl_FrontColor = color;
+ vec4 color = calcLightingSpecular(pos, norm, diffuse_color, specular, vec4(0.0));
+ vertex_color = color;
}
diff --git a/indra/newview/app_settings/shaders/class1/avatar/objectSkinV.glsl b/indra/newview/app_settings/shaders/class1/avatar/objectSkinV.glsl
index 09688b2be2..43ed41a205 100644
--- a/indra/newview/app_settings/shaders/class1/avatar/objectSkinV.glsl
+++ b/indra/newview/app_settings/shaders/class1/avatar/objectSkinV.glsl
@@ -24,7 +24,7 @@
-attribute vec4 object_weight;
+ATTRIBUTE vec4 weight4;
uniform mat4 matrixPalette[32];
@@ -32,8 +32,8 @@ mat4 getObjectSkinnedTransform()
{
int i;
- vec4 w = fract(object_weight);
- vec4 index = floor(object_weight);
+ vec4 w = fract(weight4);
+ vec4 index = floor(weight4);
float scale = 1.0/(w.x+w.y+w.z+w.w);
w *= scale;
diff --git a/indra/newview/app_settings/shaders/class1/avatar/pickAvatarF.glsl b/indra/newview/app_settings/shaders/class1/avatar/pickAvatarF.glsl
index 374808c091..3e4d438ed3 100644
--- a/indra/newview/app_settings/shaders/class1/avatar/pickAvatarF.glsl
+++ b/indra/newview/app_settings/shaders/class1/avatar/pickAvatarF.glsl
@@ -22,12 +22,17 @@
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
-
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 gl_FragColor;
+#endif
+
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
uniform sampler2D diffuseMap;
void main()
{
- gl_FragColor = vec4(gl_Color.rgb, texture2D(diffuseMap, gl_TexCoord[0].xy).a);
+ gl_FragColor = vec4(vertex_color.rgb, texture2D(diffuseMap, vary_texcoord0.xy).a);
}
diff --git a/indra/newview/app_settings/shaders/class1/avatar/pickAvatarV.glsl b/indra/newview/app_settings/shaders/class1/avatar/pickAvatarV.glsl
index e25d84a594..78b5328c9a 100644
--- a/indra/newview/app_settings/shaders/class1/avatar/pickAvatarV.glsl
+++ b/indra/newview/app_settings/shaders/class1/avatar/pickAvatarV.glsl
@@ -22,22 +22,29 @@
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
-
+uniform mat4 projection_matrix;
+
+ATTRIBUTE vec3 position;
+ATTRIBUTE vec4 diffuse_color;
+ATTRIBUTE vec2 texcoord0;
+
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
mat4 getSkinnedTransform();
void main()
{
vec4 pos;
-
+ vec4 pos_in = vec4(position, 1.0);
mat4 trans = getSkinnedTransform();
- pos.x = dot(trans[0], gl_Vertex);
- pos.y = dot(trans[1], gl_Vertex);
- pos.z = dot(trans[2], gl_Vertex);
+ pos.x = dot(trans[0], pos_in);
+ pos.y = dot(trans[1], pos_in);
+ pos.z = dot(trans[2], pos_in);
pos.w = 1.0;
- gl_FrontColor = gl_Color;
- gl_TexCoord[0] = gl_MultiTexCoord0;
- gl_Position = gl_ProjectionMatrix * pos;
+ vertex_color = diffuse_color;
+ vary_texcoord0 = texcoord0;
+ gl_Position = projection_matrix * pos;
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl b/indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl
index 19de0c0b39..c012efa056 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl
@@ -23,10 +23,12 @@
* $/LicenseInfo$
*/
-
-
#extension GL_ARB_texture_rectangle : enable
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 gl_FragColor;
+#endif
+
uniform sampler2DRect depthMap;
vec4 diffuseLookup(vec2 texcoord);
@@ -38,26 +40,16 @@ uniform vec2 screen_res;
vec3 atmosLighting(vec3 light);
vec3 scaleSoftClip(vec3 light);
-varying vec3 vary_ambient;
-varying vec3 vary_directional;
-varying vec3 vary_fragcoord;
-varying vec3 vary_position;
-varying vec3 vary_pointlight_col;
+VARYING vec3 vary_ambient;
+VARYING vec3 vary_directional;
+VARYING vec3 vary_fragcoord;
+VARYING vec3 vary_position;
+VARYING vec3 vary_pointlight_col;
-uniform mat4 inv_proj;
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
-vec4 getPosition(vec2 pos_screen)
-{
- float depth = texture2DRect(depthMap, pos_screen.xy).a;
- vec2 sc = pos_screen.xy*2.0;
- sc /= screen_res;
- sc -= vec2(1.0,1.0);
- vec4 ndc = vec4(sc.x, sc.y, 2.0*depth-1.0, 1.0);
- vec4 pos = inv_proj * ndc;
- pos /= pos.w;
- pos.w = 1.0;
- return pos;
-}
+uniform mat4 inv_proj;
void main()
{
@@ -66,9 +58,9 @@ void main()
vec4 pos = vec4(vary_position, 1.0);
- vec4 diff= diffuseLookup(gl_TexCoord[0].xy);
+ vec4 diff= diffuseLookup(vary_texcoord0.xy);
- vec4 col = vec4(vary_ambient + vary_directional.rgb, gl_Color.a);
+ vec4 col = vec4(vary_ambient + vary_directional.rgb, vertex_color.a);
vec4 color = diff * col;
color.rgb = atmosLighting(color.rgb);
@@ -78,8 +70,5 @@ void main()
color.rgb += diff.rgb * vary_pointlight_col.rgb;
gl_FragColor = color;
- //gl_FragColor = vec4(1,0,1,1);
- //gl_FragColor = vec4(1,0,1,1)*shadow;
-
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/alphaNonIndexedF.glsl b/indra/newview/app_settings/shaders/class1/deferred/alphaNonIndexedF.glsl
index d4f56896cf..8641827777 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/alphaNonIndexedF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/alphaNonIndexedF.glsl
@@ -23,10 +23,12 @@
* $/LicenseInfo$
*/
-
-
#extension GL_ARB_texture_rectangle : enable
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 gl_FragColor;
+#endif
+
uniform sampler2DRect depthMap;
uniform sampler2D diffuseMap;
@@ -38,11 +40,13 @@ uniform vec2 screen_res;
vec3 atmosLighting(vec3 light);
vec3 scaleSoftClip(vec3 light);
-varying vec3 vary_ambient;
-varying vec3 vary_directional;
-varying vec3 vary_fragcoord;
-varying vec3 vary_position;
-varying vec3 vary_pointlight_col;
+VARYING vec3 vary_ambient;
+VARYING vec3 vary_directional;
+VARYING vec3 vary_fragcoord;
+VARYING vec3 vary_position;
+VARYING vec3 vary_pointlight_col;
+VARYING vec2 vary_texcoord0;
+VARYING vec4 vertex_color;
uniform mat4 inv_proj;
@@ -66,9 +70,9 @@ void main()
vec4 pos = vec4(vary_position, 1.0);
- vec4 diff= texture2D(diffuseMap,gl_TexCoord[0].xy);
+ vec4 diff= texture2D(diffuseMap,vary_texcoord0.xy);
- vec4 col = vec4(vary_ambient + vary_directional.rgb, gl_Color.a);
+ vec4 col = vec4(vary_ambient + vary_directional.rgb, vertex_color.a);
vec4 color = diff * col;
color.rgb = atmosLighting(color.rgb);
diff --git a/indra/newview/app_settings/shaders/class1/deferred/alphaNonIndexedNoColorF.glsl b/indra/newview/app_settings/shaders/class1/deferred/alphaNonIndexedNoColorF.glsl
new file mode 100644
index 0000000000..c13ea702db
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/deferred/alphaNonIndexedNoColorF.glsl
@@ -0,0 +1,84 @@
+/**
+ * @file alphaNonIndexedNoColorF.glsl
+ *
+ * $LicenseInfo:firstyear=2005&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2005, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#extension GL_ARB_texture_rectangle : enable
+
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 gl_FragColor;
+#endif
+
+uniform sampler2DRect depthMap;
+uniform sampler2D diffuseMap;
+
+uniform mat4 shadow_matrix[6];
+uniform vec4 shadow_clip;
+uniform vec2 screen_res;
+
+vec3 atmosLighting(vec3 light);
+vec3 scaleSoftClip(vec3 light);
+
+VARYING vec3 vary_ambient;
+VARYING vec3 vary_directional;
+VARYING vec3 vary_fragcoord;
+VARYING vec3 vary_position;
+VARYING vec3 vary_pointlight_col;
+VARYING vec2 vary_texcoord0;
+
+uniform mat4 inv_proj;
+
+vec4 getPosition(vec2 pos_screen)
+{
+ float depth = texture2DRect(depthMap, pos_screen.xy).a;
+ vec2 sc = pos_screen.xy*2.0;
+ sc /= screen_res;
+ sc -= vec2(1.0,1.0);
+ vec4 ndc = vec4(sc.x, sc.y, 2.0*depth-1.0, 1.0);
+ vec4 pos = inv_proj * ndc;
+ pos /= pos.w;
+ pos.w = 1.0;
+ return pos;
+}
+
+void main()
+{
+ vec2 frag = vary_fragcoord.xy/vary_fragcoord.z*0.5+0.5;
+ frag *= screen_res;
+
+ vec4 pos = vec4(vary_position, 1.0);
+
+ vec4 diff= texture2D(diffuseMap,vary_texcoord0.xy);
+
+ vec4 col = vec4(vary_ambient + vary_directional.rgb, 1.0);
+ vec4 color = diff * col;
+
+ color.rgb = atmosLighting(color.rgb);
+
+ color.rgb = scaleSoftClip(color.rgb);
+
+ color.rgb += diff.rgb * vary_pointlight_col.rgb;
+
+ gl_FragColor = color;
+}
+
diff --git a/indra/newview/app_settings/shaders/class1/deferred/alphaSkinnedV.glsl b/indra/newview/app_settings/shaders/class1/deferred/alphaSkinnedV.glsl
index d57b8f8525..40b0cf47ac 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/alphaSkinnedV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/alphaSkinnedV.glsl
@@ -21,10 +21,15 @@
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
-
+uniform mat4 projection_matrix;
+uniform mat4 modelview_matrix;
+
+ATTRIBUTE vec3 position;
+ATTRIBUTE vec3 normal;
+ATTRIBUTE vec4 diffuse_color;
+ATTRIBUTE vec2 texcoord0;
-vec4 calcLighting(vec3 pos, vec3 norm, vec4 color, vec4 baseCol);
mat4 getObjectSkinnedTransform();
void calcAtmospherics(vec3 inPositionEye);
@@ -32,35 +37,41 @@ float calcDirectionalLight(vec3 n, vec3 l);
vec3 atmosAmbient(vec3 light);
vec3 atmosAffectDirectionalLight(float lightIntensity);
-vec3 scaleDownLight(vec3 light);
-vec3 scaleUpLight(vec3 light);
-varying vec3 vary_position;
-varying vec3 vary_ambient;
-varying vec3 vary_directional;
-varying vec3 vary_normal;
-varying vec3 vary_fragcoord;
-varying vec3 vary_pointlight_col;
+VARYING vec3 vary_position;
+VARYING vec3 vary_ambient;
+VARYING vec3 vary_directional;
+VARYING vec3 vary_normal;
+VARYING vec3 vary_fragcoord;
+VARYING vec3 vary_pointlight_col;
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+
uniform float near_clip;
+uniform vec4 light_position[8];
+uniform vec3 light_direction[8];
+uniform vec3 light_attenuation[8];
+uniform vec3 light_diffuse[8];
+
float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float fa, float is_pointlight)
{
//get light vector
vec3 lv = lp.xyz-v;
//get distance
- float d = length(lv);
+ float d = dot(lv,lv);
float da = 0.0;
if (d > 0.0 && la > 0.0 && fa > 0.0)
{
//normalize light vector
- lv *= 1.0/d;
+ lv = normalize(lv);
//distance attenuation
- float dist2 = d*d/(la*la);
+ float dist2 = d/la;
da = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 0.0, 1.0);
// spotlight coefficient.
@@ -68,7 +79,7 @@ float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, floa
da *= spot*spot; // GL_SPOT_EXPONENT=2
//angular attenuation
- da *= calcDirectionalLight(n, lv);
+ da *= max(dot(n, lv), 0.0);
}
return da;
@@ -76,20 +87,20 @@ float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, floa
void main()
{
- gl_TexCoord[0] = gl_MultiTexCoord0;
+ vary_texcoord0 = texcoord0;
vec4 pos;
vec3 norm;
mat4 trans = getObjectSkinnedTransform();
- trans = gl_ModelViewMatrix * trans;
+ trans = modelview_matrix * trans;
- pos = trans * gl_Vertex;
+ pos = trans * vec4(position.xyz, 1.0);
- norm = gl_Vertex.xyz + gl_Normal.xyz;
+ norm = position.xyz + normal.xyz;
norm = normalize(( trans*vec4(norm, 1.0) ).xyz-pos.xyz);
- vec4 frag_pos = gl_ProjectionMatrix * pos;
+ vec4 frag_pos = projection_matrix * pos;
gl_Position = frag_pos;
vary_position = pos.xyz;
@@ -97,31 +108,31 @@ void main()
calcAtmospherics(pos.xyz);
- vec4 col = vec4(0.0, 0.0, 0.0, gl_Color.a);
+ vec4 col = vec4(0.0, 0.0, 0.0, diffuse_color.a);
// Collect normal lights
- 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].quadraticAttenuation, 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].quadraticAttenuation ,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].quadraticAttenuation, 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].quadraticAttenuation, 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].quadraticAttenuation, 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].quadraticAttenuation, gl_LightSource[7].specular.a);
-
- vary_pointlight_col = col.rgb*gl_Color.rgb;
+ col.rgb += light_diffuse[2].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[2], light_direction[2], light_attenuation[2].x, light_attenuation[2].y, light_attenuation[2].z);
+ col.rgb += light_diffuse[3].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[3], light_direction[3], light_attenuation[3].x, light_attenuation[3].y, light_attenuation[3].z);
+ col.rgb += light_diffuse[4].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[4], light_direction[4], light_attenuation[4].x, light_attenuation[4].y, light_attenuation[4].z);
+ col.rgb += light_diffuse[5].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[5], light_direction[5], light_attenuation[5].x, light_attenuation[5].y, light_attenuation[5].z);
+ col.rgb += light_diffuse[6].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[6], light_direction[6], light_attenuation[6].x, light_attenuation[6].y, light_attenuation[6].z);
+ col.rgb += light_diffuse[7].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[7], light_direction[7], light_attenuation[7].x, light_attenuation[7].y, light_attenuation[7].z);
+
+ vary_pointlight_col = col.rgb*diffuse_color.rgb;
col.rgb = vec3(0,0,0);
// 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)));
+ vary_ambient = col.rgb*diffuse_color.rgb;
+ vary_directional = diffuse_color.rgb*atmosAffectDirectionalLight(max(calcDirectionalLight(norm, light_position[0].xyz), (1.0-diffuse_color.a)*(1.0-diffuse_color.a)));
- col.rgb = min(col.rgb*gl_Color.rgb, 1.0);
+ col.rgb = min(col.rgb*diffuse_color.rgb, 1.0);
- gl_FrontColor = col;
+ vertex_color = col;
- gl_FogFragCoord = pos.z;
+
vary_fragcoord.xyz = frag_pos.xyz + vec3(0,0,near_clip);
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/alphaV.glsl b/indra/newview/app_settings/shaders/class1/deferred/alphaV.glsl
index f6a280462e..8c96d55342 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/alphaV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/alphaV.glsl
@@ -23,7 +23,16 @@
* $/LicenseInfo$
*/
+uniform mat3 normal_matrix;
+uniform mat4 texture_matrix0;
+uniform mat4 modelview_matrix;
+uniform mat4 modelview_projection_matrix;
+ATTRIBUTE vec3 position;
+void passTextureIndex();
+ATTRIBUTE vec3 normal;
+ATTRIBUTE vec4 diffuse_color;
+ATTRIBUTE vec2 texcoord0;
vec4 calcLighting(vec3 pos, vec3 norm, vec4 color, vec4 baseCol);
void calcAtmospherics(vec3 inPositionEye);
@@ -35,35 +44,43 @@ vec3 atmosAffectDirectionalLight(float lightIntensity);
vec3 scaleDownLight(vec3 light);
vec3 scaleUpLight(vec3 light);
-varying vec3 vary_ambient;
-varying vec3 vary_directional;
-varying vec3 vary_fragcoord;
-varying vec3 vary_position;
-varying vec3 vary_light;
-varying vec3 vary_pointlight_col;
-varying float vary_texture_index;
+VARYING vec3 vary_ambient;
+VARYING vec3 vary_directional;
+VARYING vec3 vary_fragcoord;
+VARYING vec3 vary_position;
+VARYING vec3 vary_light;
+VARYING vec3 vary_pointlight_col;
+
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+
uniform float near_clip;
uniform float shadow_offset;
uniform float shadow_bias;
+uniform vec4 light_position[8];
+uniform vec3 light_direction[8];
+uniform vec3 light_attenuation[8];
+uniform vec3 light_diffuse[8];
+
float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float fa, float is_pointlight)
{
//get light vector
vec3 lv = lp.xyz-v;
//get distance
- float d = length(lv);
+ float d = dot(lv,lv);
float da = 0.0;
if (d > 0.0 && la > 0.0 && fa > 0.0)
{
//normalize light vector
- lv *= 1.0/d;
+ lv = normalize(lv);
//distance attenuation
- float dist2 = d*d/(la*la);
+ float dist2 = d/la;
da = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 0.0, 1.0);
// spotlight coefficient.
@@ -71,7 +88,7 @@ float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, floa
da *= spot*spot; // GL_SPOT_EXPONENT=2
//angular attenuation
- da *= calcDirectionalLight(n, lv);
+ da *= max(dot(n, lv), 0.0);
}
return da;
@@ -80,50 +97,49 @@ float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, floa
void main()
{
//transform vertex
- vec4 vert = vec4(gl_Vertex.xyz, 1.0);
- vary_texture_index = gl_Vertex.w;
- gl_Position = gl_ModelViewProjectionMatrix * vert;
+ vec4 vert = vec4(position.xyz, 1.0);
+ passTextureIndex();
+ vec4 pos = (modelview_matrix * vert);
+ gl_Position = modelview_projection_matrix*vec4(position.xyz, 1.0);
- gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
+ vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy;
- vec4 pos = (gl_ModelViewMatrix * vert);
- vec3 norm = normalize(gl_NormalMatrix * gl_Normal);
+ vec3 norm = normalize(normal_matrix * normal);
- float dp_directional_light = max(0.0, dot(norm, gl_LightSource[0].position.xyz));
- vary_position = pos.xyz + gl_LightSource[0].position.xyz * (1.0-dp_directional_light)*shadow_offset;
+ float dp_directional_light = max(0.0, dot(norm, light_position[0].xyz));
+ vary_position = pos.xyz + light_position[0].xyz * (1.0-dp_directional_light)*shadow_offset;
calcAtmospherics(pos.xyz);
- //vec4 color = calcLighting(pos.xyz, norm, gl_Color, vec4(0.));
- vec4 col = vec4(0.0, 0.0, 0.0, gl_Color.a);
+ //vec4 color = calcLighting(pos.xyz, norm, diffuse_color, vec4(0.));
+ vec4 col = vec4(0.0, 0.0, 0.0, diffuse_color.a);
// Collect normal lights
- 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].quadraticAttenuation, 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].quadraticAttenuation ,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].quadraticAttenuation, 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].quadraticAttenuation, 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].quadraticAttenuation, 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].quadraticAttenuation, gl_LightSource[7].specular.a);
+ col.rgb += light_diffuse[2].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[2], light_direction[2], light_attenuation[2].x, light_attenuation[2].y, light_attenuation[2].z);
+ col.rgb += light_diffuse[3].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[3], light_direction[3], light_attenuation[3].x, light_attenuation[3].y, light_attenuation[3].z);
+ col.rgb += light_diffuse[4].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[4], light_direction[4], light_attenuation[4].x, light_attenuation[4].y, light_attenuation[4].z);
+ col.rgb += light_diffuse[5].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[5], light_direction[5], light_attenuation[5].x, light_attenuation[5].y, light_attenuation[5].z);
+ col.rgb += light_diffuse[6].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[6], light_direction[6], light_attenuation[6].x, light_attenuation[6].y, light_attenuation[6].z);
+ col.rgb += light_diffuse[7].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[7], light_direction[7], light_attenuation[7].x, light_attenuation[7].y, light_attenuation[7].z);
- vary_pointlight_col = col.rgb*gl_Color.rgb;
-
+ vary_pointlight_col = col.rgb*diffuse_color.rgb;
col.rgb = vec3(0,0,0);
// Add windlight lights
col.rgb = atmosAmbient(vec3(0.));
- vary_light = gl_LightSource[0].position.xyz;
+ vary_light = light_position[0].xyz;
- vary_ambient = col.rgb*gl_Color.rgb;
- vary_directional.rgb = gl_Color.rgb*atmosAffectDirectionalLight(max(calcDirectionalLight(norm, gl_LightSource[0].position.xyz), (1.0-gl_Color.a)*(1.0-gl_Color.a)));
+ vary_ambient = col.rgb*diffuse_color.rgb;
+ vary_directional.rgb = diffuse_color.rgb*atmosAffectDirectionalLight(max(calcDirectionalLight(norm, light_position[0].xyz), (1.0-diffuse_color.a)*(1.0-diffuse_color.a)));
- col.rgb = col.rgb*gl_Color.rgb;
+ col.rgb = col.rgb*diffuse_color.rgb;
- gl_FrontColor = col;
+ vertex_color = col;
- gl_FogFragCoord = pos.z;
- pos = gl_ModelViewProjectionMatrix * vert;
+
+ pos = modelview_projection_matrix * vert;
vary_fragcoord.xyz = pos.xyz + vec3(0,0,near_clip);
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/attachmentShadowF.glsl b/indra/newview/app_settings/shaders/class1/deferred/attachmentShadowF.glsl
index 0c930848e5..402f681631 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/attachmentShadowF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/attachmentShadowF.glsl
@@ -22,14 +22,18 @@
* $/LicenseInfo$
*/
-
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 gl_FragColor;
+#endif
uniform sampler2D diffuseMap;
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
void main()
{
- //gl_FragColor = vec4(1,1,1,gl_Color.a * texture2D(diffuseMap, gl_TexCoord[0].xy).a);
+ //gl_FragColor = vec4(1,1,1,vertex_color.a * texture2D(diffuseMap, vary_texcoord0.xy).a);
gl_FragColor = vec4(1,1,1,1);
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/attachmentShadowV.glsl b/indra/newview/app_settings/shaders/class1/deferred/attachmentShadowV.glsl
index bf4e79d815..ded6cced27 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/attachmentShadowV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/attachmentShadowV.glsl
@@ -22,23 +22,29 @@
* $/LicenseInfo$
*/
+uniform mat4 projection_matrix;
+uniform mat4 modelview_matrix;
+uniform mat4 texture_matrix0;
+ATTRIBUTE vec3 position;
+ATTRIBUTE vec4 diffuse_color;
+ATTRIBUTE vec2 texcoord0;
+
+VARYING vec4 vertex_color;
mat4 getObjectSkinnedTransform();
void main()
{
//transform vertex
- gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
-
mat4 mat = getObjectSkinnedTransform();
- mat = gl_ModelViewMatrix * mat;
- vec3 pos = (mat*gl_Vertex).xyz;
+ mat = modelview_matrix * mat;
+ vec3 pos = (mat*vec4(position.xyz, 1.0)).xyz;
- gl_FrontColor = gl_Color;
+ vertex_color = diffuse_color;
- vec4 p = gl_ProjectionMatrix * vec4(pos, 1.0);
+ vec4 p = projection_matrix * vec4(pos, 1.0);
p.z = max(p.z, -p.w+0.01);
gl_Position = p;
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/avatarAlphaV.glsl b/indra/newview/app_settings/shaders/class1/deferred/avatarAlphaV.glsl
index f70ea4da52..c0edddc40a 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/avatarAlphaV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/avatarAlphaV.glsl
@@ -22,8 +22,12 @@
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
-
+uniform mat4 projection_matrix;
+
+ATTRIBUTE vec3 position;
+ATTRIBUTE vec3 normal;
+ATTRIBUTE vec2 texcoord0;
vec4 calcLighting(vec3 pos, vec3 norm, vec4 color, vec4 baseCol);
mat4 getSkinnedTransform();
@@ -37,31 +41,41 @@ vec3 atmosAffectDirectionalLight(float lightIntensity);
vec3 scaleDownLight(vec3 light);
vec3 scaleUpLight(vec3 light);
-varying vec3 vary_position;
-varying vec3 vary_ambient;
-varying vec3 vary_directional;
-varying vec3 vary_fragcoord;
-varying vec3 vary_pointlight_col;
+VARYING vec3 vary_position;
+VARYING vec3 vary_ambient;
+VARYING vec3 vary_directional;
+VARYING vec3 vary_fragcoord;
+VARYING vec3 vary_pointlight_col;
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+
uniform float near_clip;
+uniform vec4 color;
+
+uniform vec4 light_position[8];
+uniform vec3 light_direction[8];
+uniform vec3 light_attenuation[8];
+uniform vec3 light_diffuse[8];
+
float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float fa, float is_pointlight)
{
//get light vector
vec3 lv = lp.xyz-v;
//get distance
- float d = length(lv);
+ float d = dot(lv,lv);
float da = 0.0;
if (d > 0.0 && la > 0.0 && fa > 0.0)
{
//normalize light vector
- lv *= 1.0/d;
+ lv = normalize(lv);
//distance attenuation
- float dist2 = d*d/(la*la);
+ float dist2 = d/la;
da = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 0.0, 1.0);
// spotlight coefficient.
@@ -69,7 +83,7 @@ float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, floa
da *= spot*spot; // GL_SPOT_EXPONENT=2
//angular attenuation
- da *= calcDirectionalLight(n, lv);
+ da *= max(dot(n, lv), 0.0);
}
return da;
@@ -77,56 +91,55 @@ float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, floa
void main()
{
- gl_TexCoord[0] = gl_MultiTexCoord0;
+ vary_texcoord0 = texcoord0;
vec4 pos;
vec3 norm;
mat4 trans = getSkinnedTransform();
- pos.x = dot(trans[0], gl_Vertex);
- pos.y = dot(trans[1], gl_Vertex);
- pos.z = dot(trans[2], gl_Vertex);
+ vec4 pos_in = vec4(position.xyz, 1.0);
+ pos.x = dot(trans[0], pos_in);
+ pos.y = dot(trans[1], pos_in);
+ pos.z = dot(trans[2], pos_in);
pos.w = 1.0;
- norm.x = dot(trans[0].xyz, gl_Normal);
- norm.y = dot(trans[1].xyz, gl_Normal);
- norm.z = dot(trans[2].xyz, gl_Normal);
+ norm.x = dot(trans[0].xyz, normal);
+ norm.y = dot(trans[1].xyz, normal);
+ norm.z = dot(trans[2].xyz, normal);
norm = normalize(norm);
- vec4 frag_pos = gl_ProjectionMatrix * pos;
+ vec4 frag_pos = projection_matrix * pos;
gl_Position = frag_pos;
vary_position = pos.xyz;
calcAtmospherics(pos.xyz);
- //vec4 color = calcLighting(pos.xyz, norm, gl_Color, vec4(0.));
-
- vec4 col = vec4(0.0, 0.0, 0.0, gl_Color.a);
+ vec4 col = vec4(0.0, 0.0, 0.0, 1.0);
// Collect normal lights
- 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].quadraticAttenuation, 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].quadraticAttenuation ,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].quadraticAttenuation, 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].quadraticAttenuation, 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].quadraticAttenuation, 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].quadraticAttenuation, gl_LightSource[7].specular.a);
+ col.rgb += light_diffuse[2].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[2], light_direction[2], light_attenuation[2].x, light_attenuation[2].y, light_attenuation[2].z);
+ col.rgb += light_diffuse[3].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[3], light_direction[3], light_attenuation[3].x, light_attenuation[3].y, light_attenuation[3].z);
+ col.rgb += light_diffuse[4].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[4], light_direction[4], light_attenuation[4].x, light_attenuation[4].y, light_attenuation[4].z);
+ col.rgb += light_diffuse[5].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[5], light_direction[5], light_attenuation[5].x, light_attenuation[5].y, light_attenuation[5].z);
+ col.rgb += light_diffuse[6].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[6], light_direction[6], light_attenuation[6].x, light_attenuation[6].y, light_attenuation[6].z);
+ col.rgb += light_diffuse[7].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[7], light_direction[7], light_attenuation[7].x, light_attenuation[7].y, light_attenuation[7].z);
- vary_pointlight_col = col.rgb*gl_Color.rgb;
+ vary_pointlight_col = col.rgb*color.rgb;
col.rgb = vec3(0,0,0);
// 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)));
+ vary_ambient = col.rgb*color.rgb;
+ vary_directional = color.rgb*atmosAffectDirectionalLight(max(calcDirectionalLight(norm, light_position[0].xyz), 0.0));
- col.rgb = min(col.rgb*gl_Color.rgb, 1.0);
+ col.rgb = col.rgb * color.rgb;
- gl_FrontColor = col;
+ vertex_color = col;
- gl_FogFragCoord = pos.z;
+
vary_fragcoord.xyz = frag_pos.xyz + vec3(0,0,near_clip);
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/avatarEyesV.glsl b/indra/newview/app_settings/shaders/class1/deferred/avatarEyesV.glsl
index d0f3397932..01ffb862f7 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/avatarEyesV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/avatarEyesV.glsl
@@ -22,18 +22,27 @@
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
-
+uniform mat3 normal_matrix;
+uniform mat4 texture_matrix0;
+uniform mat4 modelview_projection_matrix;
-varying vec3 vary_normal;
+ATTRIBUTE vec3 position;
+ATTRIBUTE vec3 normal;
+ATTRIBUTE vec4 diffuse_color;
+ATTRIBUTE vec2 texcoord0;
+
+VARYING vec3 vary_normal;
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
void main()
{
//transform vertex
- gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
- gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
+ gl_Position = modelview_projection_matrix * vec4(position.xyz, 1.0);
+ vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy;
- vary_normal = normalize(gl_NormalMatrix * gl_Normal);
+ vary_normal = normalize(normal_matrix * normal);
- gl_FrontColor = gl_Color;
+ vertex_color = diffuse_color;
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/avatarF.glsl b/indra/newview/app_settings/shaders/class1/deferred/avatarF.glsl
index 3f30402583..9a3b2e3e8a 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/avatarF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/avatarF.glsl
@@ -22,16 +22,19 @@
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
-
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 gl_FragData[3];
+#endif
uniform sampler2D diffuseMap;
-varying vec3 vary_normal;
+VARYING vec3 vary_normal;
+VARYING vec2 vary_texcoord0;
void main()
{
- vec4 diff = gl_Color*texture2D(diffuseMap, gl_TexCoord[0].xy);
+ vec4 diff = texture2D(diffuseMap, vary_texcoord0.xy);
if (diff.a < 0.2)
{
diff --git a/indra/newview/app_settings/shaders/class1/deferred/avatarShadowF.glsl b/indra/newview/app_settings/shaders/class1/deferred/avatarShadowF.glsl
index c9a349f026..558a88009a 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/avatarShadowF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/avatarShadowF.glsl
@@ -23,15 +23,16 @@
* $/LicenseInfo$
*/
-
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 gl_FragColor;
+#endif
uniform sampler2D diffuseMap;
-varying vec4 post_pos;
+VARYING vec4 post_pos;
void main()
{
- //gl_FragColor = vec4(1,1,1,gl_Color.a * texture2D(diffuseMap, gl_TexCoord[0].xy).a);
gl_FragColor = vec4(1,1,1,1);
gl_FragDepth = max(post_pos.z/post_pos.w*0.5+0.5, 0.0);
diff --git a/indra/newview/app_settings/shaders/class1/deferred/avatarShadowV.glsl b/indra/newview/app_settings/shaders/class1/deferred/avatarShadowV.glsl
index 3d2ad397df..23feb09d72 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/avatarShadowV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/avatarShadowV.glsl
@@ -23,38 +23,37 @@
* $/LicenseInfo$
*/
-
+uniform mat4 projection_matrix;
mat4 getSkinnedTransform();
-attribute vec4 weight;
+ATTRIBUTE vec3 position;
+ATTRIBUTE vec3 normal;
+ATTRIBUTE vec2 texcoord0;
-varying vec4 post_pos;
+VARYING vec4 post_pos;
void main()
{
- gl_TexCoord[0] = gl_MultiTexCoord0;
-
vec4 pos;
vec3 norm;
+ vec4 pos_in = vec4(position.xyz, 1.0);
mat4 trans = getSkinnedTransform();
- pos.x = dot(trans[0], gl_Vertex);
- pos.y = dot(trans[1], gl_Vertex);
- pos.z = dot(trans[2], gl_Vertex);
+ pos.x = dot(trans[0], pos_in);
+ pos.y = dot(trans[1], pos_in);
+ pos.z = dot(trans[2], pos_in);
pos.w = 1.0;
- norm.x = dot(trans[0].xyz, gl_Normal);
- norm.y = dot(trans[1].xyz, gl_Normal);
- norm.z = dot(trans[2].xyz, gl_Normal);
+ norm.x = dot(trans[0].xyz, normal);
+ norm.y = dot(trans[1].xyz, normal);
+ norm.z = dot(trans[2].xyz, normal);
norm = normalize(norm);
- pos = gl_ProjectionMatrix * pos;
+ pos = projection_matrix * pos;
post_pos = pos;
gl_Position = vec4(pos.x, pos.y, pos.w*0.5, pos.w);
-
- gl_FrontColor = gl_Color;
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/avatarV.glsl b/indra/newview/app_settings/shaders/class1/deferred/avatarV.glsl
index 37fcef81f3..1bd8fee7c9 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/avatarV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/avatarV.glsl
@@ -23,38 +23,41 @@
* $/LicenseInfo$
*/
+uniform mat4 projection_matrix;
+ATTRIBUTE vec3 position;
+ATTRIBUTE vec3 normal;
+ATTRIBUTE vec2 texcoord0;
mat4 getSkinnedTransform();
-attribute vec4 weight;
+ATTRIBUTE vec4 weight;
-varying vec3 vary_normal;
+VARYING vec3 vary_normal;
+VARYING vec2 vary_texcoord0;
void main()
{
- gl_TexCoord[0] = gl_MultiTexCoord0;
+ vary_texcoord0 = texcoord0;
vec4 pos;
vec3 norm;
+ vec4 pos_in = vec4(position.xyz, 1.0);
mat4 trans = getSkinnedTransform();
- pos.x = dot(trans[0], gl_Vertex);
- pos.y = dot(trans[1], gl_Vertex);
- pos.z = dot(trans[2], gl_Vertex);
+ pos.x = dot(trans[0], pos_in);
+ pos.y = dot(trans[1], pos_in);
+ pos.z = dot(trans[2], pos_in);
pos.w = 1.0;
- norm.x = dot(trans[0].xyz, gl_Normal);
- norm.y = dot(trans[1].xyz, gl_Normal);
- norm.z = dot(trans[2].xyz, gl_Normal);
+ norm.x = dot(trans[0].xyz, normal);
+ norm.y = dot(trans[1].xyz, normal);
+ norm.z = dot(trans[2].xyz, normal);
norm = normalize(norm);
vary_normal = norm;
- gl_Position = gl_ProjectionMatrix * pos;
- //gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
-
- gl_FrontColor = gl_Color;
+ gl_Position = projection_matrix * pos;
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/blurLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/blurLightF.glsl
index 3609cc054b..60d4dae99f 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/blurLightF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/blurLightF.glsl
@@ -22,11 +22,13 @@
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
-
-
#extension GL_ARB_texture_rectangle : enable
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 gl_FragColor;
+#endif
+
uniform sampler2DRect depthMap;
uniform sampler2DRect normalMap;
uniform sampler2DRect lightMap;
@@ -37,11 +39,16 @@ uniform vec2 delta;
uniform vec3 kern[4];
uniform float kern_scale;
-varying vec2 vary_fragcoord;
+VARYING vec2 vary_fragcoord;
uniform mat4 inv_proj;
uniform vec2 screen_res;
+vec3 getKern(int i)
+{
+ return kern[i];
+}
+
vec4 getPosition(vec2 pos_screen)
{
float depth = texture2DRect(depthMap, pos_screen.xy).r;
@@ -66,35 +73,38 @@ void main()
vec2 dlt = kern_scale * delta / (1.0+norm.xy*norm.xy);
dlt /= max(-pos.z*dist_factor, 1.0);
- vec2 defined_weight = kern[0].xy; // special case the first (centre) sample's weight in the blur; we have to sample it anyway so we get it for 'free'
+ vec2 defined_weight = getKern(0).xy; // special case the first (centre) sample's weight in the blur; we have to sample it anyway so we get it for 'free'
vec4 col = defined_weight.xyxx * ccol;
// relax tolerance according to distance to avoid speckling artifacts, as angles and distances are a lot more abrupt within a small screen area at larger distances
float pointplanedist_tolerance_pow2 = pos.z*pos.z*0.00005;
// perturb sampling origin slightly in screen-space to hide edge-ghosting artifacts where smoothing radius is quite large
- tc += ( (mod(tc.x+tc.y,2) - 0.5) * kern[1].z * dlt * 0.5 );
+ float tc_mod = 0.5*(tc.x + tc.y); // mod(tc.x+tc.y,2)
+ tc_mod -= floor(tc_mod);
+ tc_mod *= 2.0;
+ tc += ( (tc_mod - 0.5) * getKern(1).z * dlt * 0.5 );
for (int i = 1; i < 4; i++)
{
- vec2 samptc = tc + kern[i].z*dlt;
+ vec2 samptc = tc + getKern(i).z*dlt;
vec3 samppos = getPosition(samptc).xyz;
float d = dot(norm.xyz, samppos.xyz-pos.xyz);// dist from plane
if (d*d <= pointplanedist_tolerance_pow2)
{
- col += texture2DRect(lightMap, samptc)*kern[i].xyxx;
- defined_weight += kern[i].xy;
+ col += texture2DRect(lightMap, samptc)*getKern(i).xyxx;
+ defined_weight += getKern(i).xy;
}
}
for (int i = 1; i < 4; i++)
{
- vec2 samptc = tc - kern[i].z*dlt;
+ vec2 samptc = tc - getKern(i).z*dlt;
vec3 samppos = getPosition(samptc).xyz;
float d = dot(norm.xyz, samppos.xyz-pos.xyz);// dist from plane
if (d*d <= pointplanedist_tolerance_pow2)
{
- col += texture2DRect(lightMap, samptc)*kern[i].xyxx;
- defined_weight += kern[i].xy;
+ col += texture2DRect(lightMap, samptc)*getKern(i).xyxx;
+ defined_weight += getKern(i).xy;
}
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/blurLightMSF.glsl b/indra/newview/app_settings/shaders/class1/deferred/blurLightMSF.glsl
deleted file mode 100644
index c858eb7a3a..0000000000
--- a/indra/newview/app_settings/shaders/class1/deferred/blurLightMSF.glsl
+++ /dev/null
@@ -1,131 +0,0 @@
-/**
- * @file blurLightF.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2007, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-
-
-#extension GL_ARB_texture_rectangle : enable
-#extension GL_ARB_texture_multisample : enable
-
-uniform sampler2DMS depthMap;
-uniform sampler2DMS normalMap;
-uniform sampler2DRect lightMap;
-
-uniform float dist_factor;
-uniform float blur_size;
-uniform vec2 delta;
-uniform vec3 kern[4];
-uniform float kern_scale;
-
-varying vec2 vary_fragcoord;
-
-uniform mat4 inv_proj;
-uniform vec2 screen_res;
-
-vec3 texture2DMS3(sampler2DMS tex, ivec2 tc)
-{
- vec3 ret = vec3(0,0,0);
- for (int i = 0; i < samples; i++)
- {
- ret += texelFetch(tex, tc, i).rgb;
- }
-
- return ret/samples;
-}
-
-float texture2DMS1(sampler2DMS tex, ivec2 tc)
-{
- float ret = 0;
- for (int i = 0; i < samples; i++)
- {
- ret += texelFetch(tex, tc, i).r;
- }
-
- return ret/samples;
-}
-
-vec4 getPosition(ivec2 pos_screen)
-{
- float depth = texture2DMS1(depthMap, pos_screen.xy);
- vec2 sc = pos_screen.xy*2.0;
- sc /= screen_res;
- sc -= vec2(1.0,1.0);
- vec4 ndc = vec4(sc.x, sc.y, 2.0*depth-1.0, 1.0);
- vec4 pos = inv_proj * ndc;
- pos /= pos.w;
- pos.w = 1.0;
- return pos;
-}
-
-void main()
-{
- vec2 tc = vary_fragcoord.xy;
- ivec2 itc = ivec2(tc);
-
- vec3 norm = texture2DMS3(normalMap, itc).xyz;
- norm = vec3((norm.xy-0.5)*2.0,norm.z); // unpack norm
- vec3 pos = getPosition(itc).xyz;
- vec4 ccol = texture2DRect(lightMap, tc).rgba;
-
- vec2 dlt = kern_scale * delta / (1.0+norm.xy*norm.xy);
- dlt /= max(-pos.z*dist_factor, 1.0);
-
- vec2 defined_weight = kern[0].xy; // special case the first (centre) sample's weight in the blur; we have to sample it anyway so we get it for 'free'
- vec4 col = defined_weight.xyxx * ccol;
-
- // relax tolerance according to distance to avoid speckling artifacts, as angles and distances are a lot more abrupt within a small screen area at larger distances
- float pointplanedist_tolerance_pow2 = pos.z*pos.z*0.00005;
-
- // perturb sampling origin slightly in screen-space to hide edge-ghosting artifacts where smoothing radius is quite large
- tc += ( (mod(tc.x+tc.y,2) - 0.5) * kern[1].z * dlt * 0.5 );
-
- for (int i = 1; i < 4; i++)
- {
- vec2 samptc = tc + kern[i].z*dlt;
- vec3 samppos = getPosition(ivec2(samptc)).xyz;
- float d = dot(norm.xyz, samppos.xyz-pos.xyz);// dist from plane
- if (d*d <= pointplanedist_tolerance_pow2)
- {
- col += texture2DRect(lightMap, samptc)*kern[i].xyxx;
- defined_weight += kern[i].xy;
- }
- }
- for (int i = 1; i < 4; i++)
- {
- vec2 samptc = vec2(tc - kern[i].z*dlt);
- vec3 samppos = getPosition(ivec2(samptc)).xyz;
- float d = dot(norm.xyz, samppos.xyz-pos.xyz);// dist from plane
- if (d*d <= pointplanedist_tolerance_pow2)
- {
- col += texture2DRect(lightMap, samptc)*kern[i].xyxx;
- defined_weight += kern[i].xy;
- }
- }
-
- col /= defined_weight.xyxx;
- col.y *= col.y;
-
- gl_FragColor = col;
-}
-
diff --git a/indra/newview/app_settings/shaders/class1/deferred/blurLightV.glsl b/indra/newview/app_settings/shaders/class1/deferred/blurLightV.glsl
index e904b7ded0..212f7e56ad 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/blurLightV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/blurLightV.glsl
@@ -22,16 +22,18 @@
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
-
+uniform mat4 modelview_projection_matrix;
-varying vec2 vary_fragcoord;
+ATTRIBUTE vec3 position;
+
+VARYING vec2 vary_fragcoord;
uniform vec2 screen_res;
void main()
{
//transform vertex
- gl_Position = ftransform();
- vec4 pos = gl_ModelViewProjectionMatrix * gl_Vertex;
+ vec4 pos = modelview_projection_matrix * vec4(position.xyz, 1.0);
+ gl_Position = pos;
vary_fragcoord = (pos.xy*0.5+0.5)*screen_res;
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/bumpF.glsl b/indra/newview/app_settings/shaders/class1/deferred/bumpF.glsl
index 429a891f07..6cc5f23aca 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/bumpF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/bumpF.glsl
@@ -23,27 +23,32 @@
* $/LicenseInfo$
*/
-
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 gl_FragData[3];
+#endif
uniform sampler2D diffuseMap;
uniform sampler2D bumpMap;
-varying vec3 vary_mat0;
-varying vec3 vary_mat1;
-varying vec3 vary_mat2;
+VARYING vec3 vary_mat0;
+VARYING vec3 vary_mat1;
+VARYING vec3 vary_mat2;
+
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
void main()
{
- vec3 col = gl_Color.rgb * texture2D(diffuseMap, gl_TexCoord[0].xy).rgb;
- vec3 norm = texture2D(bumpMap, gl_TexCoord[0].xy).rgb * 2.0 - 1.0;
+ vec3 col = vertex_color.rgb * texture2D(diffuseMap, vary_texcoord0.xy).rgb;
+ vec3 norm = texture2D(bumpMap, vary_texcoord0.xy).rgb * 2.0 - 1.0;
vec3 tnorm = vec3(dot(norm,vary_mat0),
dot(norm,vary_mat1),
dot(norm,vary_mat2));
gl_FragData[0] = vec4(col, 0.0);
- gl_FragData[1] = gl_Color.aaaa; // spec
- //gl_FragData[1] = vec4(vec3(gl_Color.a), gl_Color.a+(1.0-gl_Color.a)*gl_Color.a); // spec - from former class3 - maybe better, but not so well tested
+ gl_FragData[1] = vertex_color.aaaa; // spec
+ //gl_FragData[1] = vec4(vec3(vertex_color.a), vertex_color.a+(1.0-vertex_color.a)*vertex_color.a); // spec - from former class3 - maybe better, but not so well tested
vec3 nvn = normalize(tnorm);
gl_FragData[2] = vec4(nvn.xy * 0.5 + 0.5, nvn.z, 0.0);
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/bumpSkinnedV.glsl b/indra/newview/app_settings/shaders/class1/deferred/bumpSkinnedV.glsl
index 7d934e7ff8..6c205074b4 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/bumpSkinnedV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/bumpSkinnedV.glsl
@@ -22,33 +22,43 @@
* $/LicenseInfo$
*/
+uniform mat4 projection_matrix;
+uniform mat4 texture_matrix0;
+uniform mat4 modelview_matrix;
+ATTRIBUTE vec3 position;
+ATTRIBUTE vec4 diffuse_color;
+ATTRIBUTE vec3 normal;
+ATTRIBUTE vec2 texcoord0;
+ATTRIBUTE vec2 texcoord2;
-varying vec3 vary_mat0;
-varying vec3 vary_mat1;
-varying vec3 vary_mat2;
+VARYING vec3 vary_mat0;
+VARYING vec3 vary_mat1;
+VARYING vec3 vary_mat2;
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
mat4 getObjectSkinnedTransform();
void main()
{
- gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
+ vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy;
mat4 mat = getObjectSkinnedTransform();
- mat = gl_ModelViewMatrix * mat;
+ mat = modelview_matrix * mat;
- vec3 pos = (mat*gl_Vertex).xyz;
+ vec3 pos = (mat*vec4(position.xyz, 1.0)).xyz;
- vec3 n = normalize((mat * vec4(gl_Normal.xyz+gl_Vertex.xyz, 1.0)).xyz-pos.xyz);
- vec3 b = normalize((mat * vec4(gl_MultiTexCoord2.xyz+gl_Vertex.xyz, 1.0)).xyz-pos.xyz);
+ vec3 n = normalize((mat * vec4(normal.xyz+position.xyz, 1.0)).xyz-pos.xyz);
+ vec3 b = normalize((mat * vec4(vec4(texcoord2,0,1).xyz+position.xyz, 1.0)).xyz-pos.xyz);
vec3 t = cross(b, n);
vary_mat0 = vec3(t.x, b.x, n.x);
vary_mat1 = vec3(t.y, b.y, n.y);
vary_mat2 = vec3(t.z, b.z, n.z);
- gl_Position = gl_ProjectionMatrix*vec4(pos, 1.0);
- gl_FrontColor = gl_Color;
+ gl_Position = projection_matrix*vec4(pos, 1.0);
+ vertex_color = diffuse_color;
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/bumpV.glsl b/indra/newview/app_settings/shaders/class1/deferred/bumpV.glsl
index 92fd41554d..c8d38bb8f7 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/bumpV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/bumpV.glsl
@@ -22,26 +22,36 @@
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
-
+uniform mat3 normal_matrix;
+uniform mat4 texture_matrix0;
+uniform mat4 modelview_projection_matrix;
-varying vec3 vary_mat0;
-varying vec3 vary_mat1;
-varying vec3 vary_mat2;
+ATTRIBUTE vec3 position;
+ATTRIBUTE vec4 diffuse_color;
+ATTRIBUTE vec3 normal;
+ATTRIBUTE vec2 texcoord0;
+ATTRIBUTE vec3 binormal;
+
+VARYING vec3 vary_mat0;
+VARYING vec3 vary_mat1;
+VARYING vec3 vary_mat2;
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
void main()
{
//transform vertex
- gl_Position = ftransform();
- gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
+ gl_Position = modelview_projection_matrix * vec4(position.xyz, 1.0);
+ vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy;
- vec3 n = normalize(gl_NormalMatrix * gl_Normal);
- vec3 b = normalize(gl_NormalMatrix * gl_MultiTexCoord2.xyz);
+ vec3 n = normalize(normal_matrix * normal);
+ vec3 b = normalize(normal_matrix * binormal);
vec3 t = cross(b, n);
vary_mat0 = vec3(t.x, b.x, n.x);
vary_mat1 = vec3(t.y, b.y, n.y);
vary_mat2 = vec3(t.z, b.z, n.z);
- gl_FrontColor = gl_Color;
+ vertex_color = diffuse_color;
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/cloudsF.glsl b/indra/newview/app_settings/shaders/class1/deferred/cloudsF.glsl
index f4310dae95..db272cf601 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/cloudsF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/cloudsF.glsl
@@ -24,20 +24,28 @@
*/
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 gl_FragData[3];
+#endif
/////////////////////////////////////////////////////////////////////////
// The fragment shader for the sky
/////////////////////////////////////////////////////////////////////////
-varying vec4 vary_CloudColorSun;
-varying vec4 vary_CloudColorAmbient;
-varying float vary_CloudDensity;
+VARYING vec4 vary_CloudColorSun;
+VARYING vec4 vary_CloudColorAmbient;
+VARYING float vary_CloudDensity;
uniform sampler2D cloud_noise_texture;
uniform vec4 cloud_pos_density1;
uniform vec4 cloud_pos_density2;
uniform vec4 gamma;
+VARYING vec2 vary_texcoord0;
+VARYING vec2 vary_texcoord1;
+VARYING vec2 vary_texcoord2;
+VARYING vec2 vary_texcoord3;
+
/// Soft clips the light with a gamma correction
vec3 scaleSoftClip(vec3 light) {
//soft clip effect:
@@ -50,14 +58,14 @@ vec3 scaleSoftClip(vec3 light) {
void main()
{
// Set variables
- vec2 uv1 = gl_TexCoord[0].xy;
- vec2 uv2 = gl_TexCoord[1].xy;
+ vec2 uv1 = vary_texcoord0.xy;
+ vec2 uv2 = vary_texcoord1.xy;
vec4 cloudColorSun = vary_CloudColorSun;
vec4 cloudColorAmbient = vary_CloudColorAmbient;
float cloudDensity = vary_CloudDensity;
- vec2 uv3 = gl_TexCoord[2].xy;
- vec2 uv4 = gl_TexCoord[3].xy;
+ vec2 uv3 = vary_texcoord2.xy;
+ vec2 uv4 = vary_texcoord3.xy;
// Offset texture coords
uv1 += cloud_pos_density1.xy; //large texture, visible density
diff --git a/indra/newview/app_settings/shaders/class1/deferred/cloudsV.glsl b/indra/newview/app_settings/shaders/class1/deferred/cloudsV.glsl
index c175a834c2..64e094e3c5 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/cloudsV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/cloudsV.glsl
@@ -22,17 +22,25 @@
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
-
+uniform mat4 modelview_projection_matrix;
+
+ATTRIBUTE vec3 position;
+ATTRIBUTE vec2 texcoord0;
//////////////////////////////////////////////////////////////////////////
// The vertex shader for creating the atmospheric sky
///////////////////////////////////////////////////////////////////////////////
// Output parameters
-varying vec4 vary_CloudColorSun;
-varying vec4 vary_CloudColorAmbient;
-varying float vary_CloudDensity;
+VARYING vec4 vary_CloudColorSun;
+VARYING vec4 vary_CloudColorAmbient;
+VARYING float vary_CloudDensity;
+
+VARYING vec2 vary_texcoord0;
+VARYING vec2 vary_texcoord1;
+VARYING vec2 vary_texcoord2;
+VARYING vec2 vary_texcoord3;
// Inputs
uniform vec3 camPosLocal;
@@ -59,12 +67,12 @@ void main()
{
// World / view / projection
- gl_Position = ftransform();
+ gl_Position = modelview_projection_matrix * vec4(position.xyz, 1.0);
- gl_TexCoord[0] = gl_MultiTexCoord0;
+ vary_texcoord0 = texcoord0;
// Get relative position
- vec3 P = gl_Vertex.xyz - camPosLocal.xyz + vec3(0,50,0);
+ vec3 P = position.xyz - camPosLocal.xyz + vec3(0,50,0);
// Set altitude
if (P.y > 0.)
@@ -160,17 +168,17 @@ void main()
// Texture coords
- gl_TexCoord[0] = gl_MultiTexCoord0;
- gl_TexCoord[0].xy -= 0.5;
- gl_TexCoord[0].xy /= cloud_scale.x;
- gl_TexCoord[0].xy += 0.5;
+ vary_texcoord0 = texcoord0;
+ vary_texcoord0.xy -= 0.5;
+ vary_texcoord0.xy /= cloud_scale.x;
+ vary_texcoord0.xy += 0.5;
- gl_TexCoord[1] = gl_TexCoord[0];
- gl_TexCoord[1].x += lightnorm.x * 0.0125;
- gl_TexCoord[1].y += lightnorm.z * 0.0125;
+ vary_texcoord1 = vary_texcoord0;
+ vary_texcoord1.x += lightnorm.x * 0.0125;
+ vary_texcoord1.y += lightnorm.z * 0.0125;
- gl_TexCoord[2] = gl_TexCoord[0] * 16.;
- gl_TexCoord[3] = gl_TexCoord[1] * 16.;
+ vary_texcoord2 = vary_texcoord0 * 16.;
+ vary_texcoord3 = vary_texcoord1 * 16.;
// Combine these to minimize register use
vary_CloudColorAmbient += oHazeColorBelowCloud;
diff --git a/indra/newview/app_settings/shaders/class1/deferred/cofF.glsl b/indra/newview/app_settings/shaders/class1/deferred/cofF.glsl
new file mode 100644
index 0000000000..e612efba61
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/deferred/cofF.glsl
@@ -0,0 +1,88 @@
+/**
+ * @file cofF.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#extension GL_ARB_texture_rectangle : enable
+
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 gl_FragColor;
+#endif
+
+uniform sampler2DRect diffuseRect;
+uniform sampler2DRect depthMap;
+uniform sampler2D bloomMap;
+
+uniform float depth_cutoff;
+uniform float norm_cutoff;
+uniform float focal_distance;
+uniform float blur_constant;
+uniform float tan_pixel_angle;
+uniform float magnification;
+uniform float max_cof;
+
+uniform mat4 inv_proj;
+uniform vec2 screen_res;
+
+VARYING vec2 vary_fragcoord;
+
+float getDepth(vec2 pos_screen)
+{
+ float z = texture2DRect(depthMap, pos_screen.xy).r;
+ z = z*2.0-1.0;
+ vec4 ndc = vec4(0.0, 0.0, z, 1.0);
+ vec4 p = inv_proj*ndc;
+ return p.z/p.w;
+}
+
+float calc_cof(float depth)
+{
+ float sc = (depth-focal_distance)/-depth*blur_constant;
+
+ sc /= magnification;
+
+ // tan_pixel_angle = pixel_length/-depth;
+ float pixel_length = tan_pixel_angle*-focal_distance;
+
+ sc = sc/pixel_length;
+ sc *= 1.414;
+
+ return sc;
+}
+
+void main()
+{
+ vec2 tc = vary_fragcoord.xy;
+
+ float depth = getDepth(tc);
+
+ vec4 diff = texture2DRect(diffuseRect, vary_fragcoord.xy);
+
+ float sc = calc_cof(depth);
+ sc = min(sc, max_cof);
+ sc = max(sc, -max_cof);
+
+ vec4 bloom = texture2D(bloomMap, vary_fragcoord.xy/screen_res);
+ gl_FragColor.rgb = diff.rgb + bloom.rgb;
+ gl_FragColor.a = sc/max_cof*0.5+0.5;
+}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/diffuseAlphaMaskF.glsl b/indra/newview/app_settings/shaders/class1/deferred/diffuseAlphaMaskF.glsl
index 933e50fed1..e9989a4e48 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/diffuseAlphaMaskF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/diffuseAlphaMaskF.glsl
@@ -1,5 +1,5 @@
/**
- * @file diffuseF.glsl
+ * @file diffuseAlphaMaskF.glsl
*
* $LicenseInfo:firstyear=2011&license=viewerlgpl$
* Second Life Viewer Source Code
@@ -22,20 +22,24 @@
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
-
+
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 gl_FragData[3];
+#endif
uniform float minimum_alpha;
-uniform float maximum_alpha;
uniform sampler2D diffuseMap;
-varying vec3 vary_normal;
+VARYING vec3 vary_normal;
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
void main()
{
- vec4 col = gl_Color * texture2D(diffuseMap, gl_TexCoord[0].xy) * gl_Color;
+ vec4 col = texture2D(diffuseMap, vary_texcoord0.xy) * vertex_color;
- if (col.a < minimum_alpha || col.a > maximum_alpha)
+ if (col.a < minimum_alpha)
{
discard;
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/diffuseAlphaMaskIndexedF.glsl b/indra/newview/app_settings/shaders/class1/deferred/diffuseAlphaMaskIndexedF.glsl
index f3ad6f92de..fdf8d72b38 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/diffuseAlphaMaskIndexedF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/diffuseAlphaMaskIndexedF.glsl
@@ -22,17 +22,23 @@
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
-
-varying vec3 vary_normal;
+
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 gl_FragData[3];
+#endif
+
+VARYING vec3 vary_normal;
uniform float minimum_alpha;
-uniform float maximum_alpha;
+
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
void main()
{
- vec4 col = diffuseLookup(gl_TexCoord[0].xy) * gl_Color;
+ vec4 col = diffuseLookup(vary_texcoord0.xy) * vertex_color;
- if (col.a < minimum_alpha || col.a > maximum_alpha)
+ if (col.a < minimum_alpha)
{
discard;
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/diffuseAlphaMaskNoColorF.glsl b/indra/newview/app_settings/shaders/class1/deferred/diffuseAlphaMaskNoColorF.glsl
new file mode 100644
index 0000000000..bb20e2ca47
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/deferred/diffuseAlphaMaskNoColorF.glsl
@@ -0,0 +1,52 @@
+/**
+ * @file diffuseAlphaMaskNoColorF.glsl
+ *
+ * $LicenseInfo:firstyear=2005&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2005, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 gl_FragData[3];
+#endif
+
+uniform float minimum_alpha;
+
+uniform sampler2D diffuseMap;
+
+VARYING vec3 vary_normal;
+VARYING vec2 vary_texcoord0;
+
+void main()
+{
+ vec4 col = texture2D(diffuseMap, vary_texcoord0.xy);
+
+ if (col.a < minimum_alpha)
+ {
+ discard;
+ }
+
+ gl_FragData[0] = vec4(col.rgb, 0.0);
+ gl_FragData[1] = vec4(0,0,0,0); // spec
+ vec3 nvn = normalize(vary_normal);
+ gl_FragData[2] = vec4(nvn.xy * 0.5 + 0.5, nvn.z, 0.0);
+}
+
diff --git a/indra/newview/app_settings/shaders/class1/deferred/diffuseF.glsl b/indra/newview/app_settings/shaders/class1/deferred/diffuseF.glsl
index 9c9a8b56c5..7bde49eb86 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/diffuseF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/diffuseF.glsl
@@ -23,18 +23,22 @@
* $/LicenseInfo$
*/
-
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 gl_FragData[3];
+#endif
uniform sampler2D diffuseMap;
-varying vec3 vary_normal;
+VARYING vec3 vary_normal;
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
void main()
{
- vec3 col = gl_Color.rgb * texture2D(diffuseMap, gl_TexCoord[0].xy).rgb;
+ vec3 col = vertex_color.rgb * texture2D(diffuseMap, vary_texcoord0.xy).rgb;
gl_FragData[0] = vec4(col, 0.0);
- gl_FragData[1] = gl_Color.aaaa; // spec
- //gl_FragData[1] = vec4(vec3(gl_Color.a), gl_Color.a+(1.0-gl_Color.a)*gl_Color.a); // spec - from former class3 - maybe better, but not so well tested
+ gl_FragData[1] = vertex_color.aaaa; // spec
+ //gl_FragData[1] = vec4(vec3(vertex_color.a), vertex_color.a+(1.0-vertex_color.a)*vertex_color.a); // spec - from former class3 - maybe better, but not so well tested
vec3 nvn = normalize(vary_normal);
gl_FragData[2] = vec4(nvn.xy * 0.5 + 0.5, nvn.z, 0.0);
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/diffuseIndexedF.glsl b/indra/newview/app_settings/shaders/class1/deferred/diffuseIndexedF.glsl
index 4d996a099d..75b45111e0 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/diffuseIndexedF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/diffuseIndexedF.glsl
@@ -22,16 +22,22 @@
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
-
-varying vec3 vary_normal;
+
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 gl_FragData[3];
+#endif
+
+VARYING vec3 vary_normal;
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
void main()
{
- vec3 col = gl_Color.rgb * diffuseLookup(gl_TexCoord[0].xy).rgb;
+ vec3 col = vertex_color.rgb * diffuseLookup(vary_texcoord0.xy).rgb;
gl_FragData[0] = vec4(col, 0.0);
- gl_FragData[1] = gl_Color.aaaa; // spec
- //gl_FragData[1] = vec4(vec3(gl_Color.a), gl_Color.a+(1.0-gl_Color.a)*gl_Color.a); // spec - from former class3 - maybe better, but not so well tested
+ gl_FragData[1] = vertex_color.aaaa; // spec
+ //gl_FragData[1] = vec4(vec3(vertex_color.a), vertex_color.a+(1.0-vertex_color.a)*vertex_color.a); // spec - from former class3 - maybe better, but not so well tested
vec3 nvn = normalize(vary_normal);
gl_FragData[2] = vec4(nvn.xy * 0.5 + 0.5, nvn.z, 0.0);
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/diffuseNoColorV.glsl b/indra/newview/app_settings/shaders/class1/deferred/diffuseNoColorV.glsl
new file mode 100644
index 0000000000..9461e3e32e
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/deferred/diffuseNoColorV.glsl
@@ -0,0 +1,45 @@
+/**
+ * @file diffuseNoColorV.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+uniform mat3 normal_matrix;
+uniform mat4 texture_matrix0;
+uniform mat4 modelview_projection_matrix;
+
+ATTRIBUTE vec3 position;
+ATTRIBUTE vec3 normal;
+ATTRIBUTE vec2 texcoord0;
+
+VARYING vec3 vary_normal;
+
+VARYING vec2 vary_texcoord0;
+
+void main()
+{
+ //transform vertex
+ gl_Position = modelview_projection_matrix * vec4(position.xyz, 1.0);
+ vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy;
+
+ vary_normal = normalize(normal_matrix * normal);
+}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/diffuseSkinnedV.glsl b/indra/newview/app_settings/shaders/class1/deferred/diffuseSkinnedV.glsl
index 1470d7c9ca..a74290bfcd 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/diffuseSkinnedV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/diffuseSkinnedV.glsl
@@ -22,29 +22,38 @@
* $/LicenseInfo$
*/
+uniform mat4 projection_matrix;
+uniform mat4 texture_matrix0;
+uniform mat4 modelview_matrix;
+ATTRIBUTE vec3 position;
+ATTRIBUTE vec4 diffuse_color;
+ATTRIBUTE vec3 normal;
+ATTRIBUTE vec2 texcoord0;
-varying vec3 vary_normal;
+VARYING vec3 vary_normal;
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
mat4 getObjectSkinnedTransform();
void main()
{
- gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
+ vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy;
mat4 mat = getObjectSkinnedTransform();
- mat = gl_ModelViewMatrix * mat;
- vec3 pos = (mat*gl_Vertex).xyz;
+ mat = modelview_matrix * mat;
+ vec3 pos = (mat*vec4(position.xyz, 1.0)).xyz;
- vec4 norm = gl_Vertex;
- norm.xyz += gl_Normal.xyz;
+ vec4 norm = vec4(position.xyz, 1.0);
+ norm.xyz += normal.xyz;
norm.xyz = (mat*norm).xyz;
norm.xyz = normalize(norm.xyz-pos.xyz);
vary_normal = norm.xyz;
- gl_FrontColor = gl_Color;
+ vertex_color = diffuse_color;
- gl_Position = gl_ProjectionMatrix*vec4(pos, 1.0);
+ gl_Position = projection_matrix*vec4(pos, 1.0);
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/diffuseV.glsl b/indra/newview/app_settings/shaders/class1/deferred/diffuseV.glsl
index 7c5a4d35b3..76d29b1df7 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/diffuseV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/diffuseV.glsl
@@ -22,20 +22,31 @@
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
-
+uniform mat3 normal_matrix;
+uniform mat4 texture_matrix0;
+uniform mat4 modelview_projection_matrix;
-varying vec3 vary_normal;
-varying float vary_texture_index;
+ATTRIBUTE vec3 position;
+ATTRIBUTE vec4 diffuse_color;
+ATTRIBUTE vec3 normal;
+ATTRIBUTE vec2 texcoord0;
+
+VARYING vec3 vary_normal;
+
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+
+void passTextureIndex();
void main()
{
//transform vertex
- gl_Position = gl_ModelViewProjectionMatrix * vec4(gl_Vertex.xyz, 1.0);
- gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
+ gl_Position = modelview_projection_matrix * vec4(position.xyz, 1.0);
+ vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy;
- vary_texture_index = gl_Vertex.w;
- vary_normal = normalize(gl_NormalMatrix * gl_Normal);
+ passTextureIndex();
+ vary_normal = normalize(normal_matrix * normal);
- gl_FrontColor = gl_Color;
+ vertex_color = diffuse_color;
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/dofCombineF.glsl b/indra/newview/app_settings/shaders/class1/deferred/dofCombineF.glsl
new file mode 100644
index 0000000000..01e3505359
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/deferred/dofCombineF.glsl
@@ -0,0 +1,67 @@
+/**
+ * @file dofCombineF.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#extension GL_ARB_texture_rectangle : enable
+
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 gl_FragColor;
+#endif
+
+uniform sampler2DRect diffuseRect;
+uniform sampler2DRect lightMap;
+
+uniform mat4 inv_proj;
+uniform vec2 screen_res;
+
+uniform float max_cof;
+uniform float res_scale;
+
+VARYING vec2 vary_fragcoord;
+
+void main()
+{
+ vec2 tc = vary_fragcoord.xy;
+
+ vec4 dof = texture2DRect(diffuseRect, vary_fragcoord.xy*res_scale);
+
+ vec4 diff = texture2DRect(lightMap, vary_fragcoord.xy);
+
+ float a = min(abs(diff.a*2.0-1.0) * max_cof*res_scale*res_scale, 1.0);
+
+ if (a > 0.25 && a < 0.75)
+ { //help out the transition a bit
+ float sc = a/res_scale;
+
+ vec4 col;
+ col = texture2DRect(lightMap, vary_fragcoord.xy+vec2(sc,sc));
+ col += texture2DRect(lightMap, vary_fragcoord.xy+vec2(-sc,sc));
+ col += texture2DRect(lightMap, vary_fragcoord.xy+vec2(sc,-sc));
+ col += texture2DRect(lightMap, vary_fragcoord.xy+vec2(-sc,-sc));
+
+ diff = mix(diff, col*0.25, a);
+ }
+
+ gl_FragColor = mix(diff, dof, a);
+}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/emissiveF.glsl b/indra/newview/app_settings/shaders/class1/deferred/emissiveF.glsl
new file mode 100644
index 0000000000..92f78125d8
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/deferred/emissiveF.glsl
@@ -0,0 +1,50 @@
+/**
+ * @file emissiveF.glsl
+ *
+ * $LicenseInfo:firstyear=2005&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2005, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#extension GL_ARB_texture_rectangle : enable
+
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 gl_FragColor;
+#endif
+
+vec3 fullbrightAtmosTransport(vec3 light);
+vec3 fullbrightScaleSoftClip(vec3 light);
+
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+
+void main()
+{
+ float shadow = 1.0;
+
+ vec4 color = diffuseLookup(vary_texcoord0.xy)*vertex_color;
+
+ color.rgb = fullbrightAtmosTransport(color.rgb);
+
+ color.rgb = fullbrightScaleSoftClip(color.rgb);
+
+ gl_FragColor = color;
+}
+
diff --git a/indra/newview/app_settings/shaders/class1/deferred/emissiveV.glsl b/indra/newview/app_settings/shaders/class1/deferred/emissiveV.glsl
new file mode 100644
index 0000000000..115b04797f
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/deferred/emissiveV.glsl
@@ -0,0 +1,63 @@
+/**
+ * @file emissiveV.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+uniform mat4 texture_matrix0;
+uniform mat4 modelview_matrix;
+uniform mat4 modelview_projection_matrix;
+
+ATTRIBUTE vec3 position;
+void passTextureIndex();
+ATTRIBUTE vec4 emissive;
+ATTRIBUTE vec2 texcoord0;
+
+void calcAtmospherics(vec3 inPositionEye);
+
+vec3 atmosAmbient(vec3 light);
+vec3 atmosAffectDirectionalLight(float lightIntensity);
+vec3 scaleDownLight(vec3 light);
+vec3 scaleUpLight(vec3 light);
+
+
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+
+
+void main()
+{
+ //transform vertex
+ vec4 vert = vec4(position.xyz, 1.0);
+ vec4 pos = (modelview_matrix * vert);
+ passTextureIndex();
+
+ gl_Position = modelview_projection_matrix*vec4(position.xyz, 1.0);
+
+ vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy;
+
+ calcAtmospherics(pos.xyz);
+
+ vertex_color = emissive;
+
+
+}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/fullbrightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/fullbrightF.glsl
index 6c506676af..84ae2f9f10 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/fullbrightF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/fullbrightF.glsl
@@ -23,9 +23,14 @@
* $/LicenseInfo$
*/
+#extension GL_ARB_texture_rectangle : enable
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 gl_FragColor;
+#endif
-#extension GL_ARB_texture_rectangle : enable
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
vec3 fullbrightAtmosTransport(vec3 light);
vec3 fullbrightScaleSoftClip(vec3 light);
@@ -35,7 +40,7 @@ void main()
{
float shadow = 1.0;
- vec4 color = diffuseLookup(gl_TexCoord[0].xy)*gl_Color;
+ vec4 color = diffuseLookup(vary_texcoord0.xy)*vertex_color;
color.rgb = fullbrightAtmosTransport(color.rgb);
diff --git a/indra/newview/app_settings/shaders/class1/deferred/fullbrightV.glsl b/indra/newview/app_settings/shaders/class1/deferred/fullbrightV.glsl
index a4ff0b80e2..2e6982d101 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/fullbrightV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/fullbrightV.glsl
@@ -22,8 +22,16 @@
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
-
+uniform mat4 texture_matrix0;
+uniform mat4 modelview_matrix;
+uniform mat4 modelview_projection_matrix;
+
+
+ATTRIBUTE vec3 position;
+void passTextureIndex();
+ATTRIBUTE vec4 diffuse_color;
+ATTRIBUTE vec2 texcoord0;
void calcAtmospherics(vec3 inPositionEye);
@@ -32,23 +40,25 @@ vec3 atmosAffectDirectionalLight(float lightIntensity);
vec3 scaleDownLight(vec3 light);
vec3 scaleUpLight(vec3 light);
-varying float vary_texture_index;
+
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+
void main()
{
//transform vertex
- vec4 vert = vec4(gl_Vertex.xyz, 1.0);
- vary_texture_index = gl_Vertex.w;
+ vec4 vert = vec4(position.xyz, 1.0);
+ vec4 pos = (modelview_matrix * vert);
+ passTextureIndex();
- gl_Position = gl_ModelViewProjectionMatrix*vert;
+ gl_Position = modelview_projection_matrix*vec4(position.xyz, 1.0);
- gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
+ vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy;
- vec4 pos = (gl_ModelViewMatrix * vert);
-
calcAtmospherics(pos.xyz);
- gl_FrontColor = gl_Color;
+ vertex_color = diffuse_color;
- gl_FogFragCoord = pos.z;
+
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/fxaaF.glsl b/indra/newview/app_settings/shaders/class1/deferred/fxaaF.glsl
new file mode 100644
index 0000000000..5af9406452
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/deferred/fxaaF.glsl
@@ -0,0 +1,2118 @@
+/**
+ * @file fxaaF.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#extension GL_ARB_texture_rectangle : enable
+
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 gl_FragColor;
+#endif
+
+#define FXAA_PC 1
+//#define FXAA_GLSL_130 1
+#define FXAA_QUALITY__PRESET 12
+
+/*============================================================================
+
+
+ NVIDIA FXAA 3.11 by TIMOTHY LOTTES
+
+
+------------------------------------------------------------------------------
+COPYRIGHT (C) 2010, 2011 NVIDIA CORPORATION. ALL RIGHTS RESERVED.
+------------------------------------------------------------------------------
+TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, THIS SOFTWARE IS PROVIDED
+*AS IS* AND NVIDIA AND ITS SUPPLIERS DISCLAIM ALL WARRANTIES, EITHER EXPRESS
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL NVIDIA
+OR ITS SUPPLIERS BE LIABLE FOR ANY SPECIAL, INCIDENTAL, INDIRECT, OR
+CONSEQUENTIAL DAMAGES WHATSOEVER (INCLUDING, WITHOUT LIMITATION, DAMAGES FOR
+LOSS OF BUSINESS PROFITS, BUSINESS INTERRUPTION, LOSS OF BUSINESS INFORMATION,
+OR ANY OTHER PECUNIARY LOSS) ARISING OUT OF THE USE OF OR INABILITY TO USE
+THIS SOFTWARE, EVEN IF NVIDIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+------------------------------------------------------------------------------
+ INTEGRATION CHECKLIST
+------------------------------------------------------------------------------
+(1.)
+In the shader source, setup defines for the desired configuration.
+When providing multiple shaders (for different presets),
+simply setup the defines differently in multiple files.
+Example,
+
+ #define FXAA_PC 1
+ #define FXAA_HLSL_5 1
+ #define FXAA_QUALITY__PRESET 12
+
+Or,
+
+ #define FXAA_360 1
+
+Or,
+
+ #define FXAA_PS3 1
+
+Etc.
+
+(2.)
+Then include this file,
+
+ #include "Fxaa3_11.h"
+
+(3.)
+Then call the FXAA pixel shader from within your desired shader.
+Look at the FXAA Quality FxaaPixelShader() for docs on inputs.
+As for FXAA 3.11 all inputs for all shaders are the same
+to enable easy porting between platforms.
+
+ return FxaaPixelShader(...);
+
+(4.)
+Insure pass prior to FXAA outputs RGBL (see next section).
+Or use,
+
+ #define FXAA_GREEN_AS_LUMA 1
+
+(5.)
+Setup engine to provide the following constants
+which are used in the FxaaPixelShader() inputs,
+
+ FxaaFloat2 fxaaQualityRcpFrame,
+ FxaaFloat4 fxaaConsoleRcpFrameOpt,
+ FxaaFloat4 fxaaConsoleRcpFrameOpt2,
+ FxaaFloat4 fxaaConsole360RcpFrameOpt2,
+ FxaaFloat fxaaQualitySubpix,
+ FxaaFloat fxaaQualityEdgeThreshold,
+ FxaaFloat fxaaQualityEdgeThresholdMin,
+ FxaaFloat fxaaConsoleEdgeSharpness,
+ FxaaFloat fxaaConsoleEdgeThreshold,
+ FxaaFloat fxaaConsoleEdgeThresholdMin,
+ FxaaFloat4 fxaaConsole360ConstDir
+
+Look at the FXAA Quality FxaaPixelShader() for docs on inputs.
+
+(6.)
+Have FXAA vertex shader run as a full screen triangle,
+and output "pos" and "fxaaConsolePosPos"
+such that inputs in the pixel shader provide,
+
+ // {xy} = center of pixel
+ FxaaFloat2 pos,
+
+ // {xy__} = upper left of pixel
+ // {__zw} = lower right of pixel
+ FxaaFloat4 fxaaConsolePosPos,
+
+(7.)
+Insure the texture sampler(s) used by FXAA are set to bilinear filtering.
+
+
+------------------------------------------------------------------------------
+ INTEGRATION - RGBL AND COLORSPACE
+------------------------------------------------------------------------------
+FXAA3 requires RGBL as input unless the following is set,
+
+ #define FXAA_GREEN_AS_LUMA 1
+
+In which case the engine uses green in place of luma,
+and requires RGB input is in a non-linear colorspace.
+
+RGB should be LDR (low dynamic range).
+Specifically do FXAA after tonemapping.
+
+RGB data as returned by a texture fetch can be non-linear,
+or linear when FXAA_GREEN_AS_LUMA is not set.
+Note an "sRGB format" texture counts as linear,
+because the result of a texture fetch is linear data.
+Regular "RGBA8" textures in the sRGB colorspace are non-linear.
+
+If FXAA_GREEN_AS_LUMA is not set,
+luma must be stored in the alpha channel prior to running FXAA.
+This luma should be in a perceptual space (could be gamma 2.0).
+Example pass before FXAA where output is gamma 2.0 encoded,
+
+ color.rgb = ToneMap(color.rgb); // linear color output
+ color.rgb = sqrt(color.rgb); // gamma 2.0 color output
+ return color;
+
+To use FXAA,
+
+ color.rgb = ToneMap(color.rgb); // linear color output
+ color.rgb = sqrt(color.rgb); // gamma 2.0 color output
+ color.a = dot(color.rgb, FxaaFloat3(0.299, 0.587, 0.114)); // compute luma
+ return color;
+
+Another example where output is linear encoded,
+say for instance writing to an sRGB formated render target,
+where the render target does the conversion back to sRGB after blending,
+
+ color.rgb = ToneMap(color.rgb); // linear color output
+ return color;
+
+To use FXAA,
+
+ color.rgb = ToneMap(color.rgb); // linear color output
+ color.a = sqrt(dot(color.rgb, FxaaFloat3(0.299, 0.587, 0.114))); // compute luma
+ return color;
+
+Getting luma correct is required for the algorithm to work correctly.
+
+
+------------------------------------------------------------------------------
+ BEING LINEARLY CORRECT?
+------------------------------------------------------------------------------
+Applying FXAA to a framebuffer with linear RGB color will look worse.
+This is very counter intuitive, but happends to be true in this case.
+The reason is because dithering artifacts will be more visiable
+in a linear colorspace.
+
+
+------------------------------------------------------------------------------
+ COMPLEX INTEGRATION
+------------------------------------------------------------------------------
+Q. What if the engine is blending into RGB before wanting to run FXAA?
+
+A. In the last opaque pass prior to FXAA,
+ have the pass write out luma into alpha.
+ Then blend into RGB only.
+ FXAA should be able to run ok
+ assuming the blending pass did not any add aliasing.
+ This should be the common case for particles and common blending passes.
+
+A. Or use FXAA_GREEN_AS_LUMA.
+
+============================================================================*/
+
+/*============================================================================
+
+ INTEGRATION KNOBS
+
+============================================================================*/
+//
+// FXAA_PS3 and FXAA_360 choose the console algorithm (FXAA3 CONSOLE).
+// FXAA_360_OPT is a prototype for the new optimized 360 version.
+//
+// 1 = Use API.
+// 0 = Don't use API.
+//
+/*--------------------------------------------------------------------------*/
+#ifndef FXAA_PS3
+ #define FXAA_PS3 0
+#endif
+/*--------------------------------------------------------------------------*/
+#ifndef FXAA_360
+ #define FXAA_360 0
+#endif
+/*--------------------------------------------------------------------------*/
+#ifndef FXAA_360_OPT
+ #define FXAA_360_OPT 0
+#endif
+/*==========================================================================*/
+#ifndef FXAA_PC
+ //
+ // FXAA Quality
+ // The high quality PC algorithm.
+ //
+ #define FXAA_PC 0
+#endif
+/*--------------------------------------------------------------------------*/
+#ifndef FXAA_PC_CONSOLE
+ //
+ // The console algorithm for PC is included
+ // for developers targeting really low spec machines.
+ // Likely better to just run FXAA_PC, and use a really low preset.
+ //
+ #define FXAA_PC_CONSOLE 0
+#endif
+/*--------------------------------------------------------------------------*/
+#ifndef FXAA_GLSL_120
+ #define FXAA_GLSL_120 0
+#endif
+/*--------------------------------------------------------------------------*/
+#ifndef FXAA_GLSL_130
+ #define FXAA_GLSL_130 0
+#endif
+/*--------------------------------------------------------------------------*/
+#ifndef FXAA_HLSL_3
+ #define FXAA_HLSL_3 0
+#endif
+/*--------------------------------------------------------------------------*/
+#ifndef FXAA_HLSL_4
+ #define FXAA_HLSL_4 0
+#endif
+/*--------------------------------------------------------------------------*/
+#ifndef FXAA_HLSL_5
+ #define FXAA_HLSL_5 0
+#endif
+/*==========================================================================*/
+#ifndef FXAA_GREEN_AS_LUMA
+ //
+ // For those using non-linear color,
+ // and either not able to get luma in alpha, or not wanting to,
+ // this enables FXAA to run using green as a proxy for luma.
+ // So with this enabled, no need to pack luma in alpha.
+ //
+ // This will turn off AA on anything which lacks some amount of green.
+ // Pure red and blue or combination of only R and B, will get no AA.
+ //
+ // Might want to lower the settings for both,
+ // fxaaConsoleEdgeThresholdMin
+ // fxaaQualityEdgeThresholdMin
+ // In order to insure AA does not get turned off on colors
+ // which contain a minor amount of green.
+ //
+ // 1 = On.
+ // 0 = Off.
+ //
+ #define FXAA_GREEN_AS_LUMA 0
+#endif
+/*--------------------------------------------------------------------------*/
+#ifndef FXAA_EARLY_EXIT
+ //
+ // Controls algorithm's early exit path.
+ // On PS3 turning this ON adds 2 cycles to the shader.
+ // On 360 turning this OFF adds 10ths of a millisecond to the shader.
+ // Turning this off on console will result in a more blurry image.
+ // So this defaults to on.
+ //
+ // 1 = On.
+ // 0 = Off.
+ //
+ #define FXAA_EARLY_EXIT 1
+#endif
+/*--------------------------------------------------------------------------*/
+#ifndef FXAA_DISCARD
+ //
+ // Only valid for PC OpenGL currently.
+ // Probably will not work when FXAA_GREEN_AS_LUMA = 1.
+ //
+ // 1 = Use discard on pixels which don't need AA.
+ // For APIs which enable concurrent TEX+ROP from same surface.
+ // 0 = Return unchanged color on pixels which don't need AA.
+ //
+ #define FXAA_DISCARD 0
+#endif
+/*--------------------------------------------------------------------------*/
+#ifndef FXAA_FAST_PIXEL_OFFSET
+ //
+ // Used for GLSL 120 only.
+ //
+ // 1 = GL API supports fast pixel offsets
+ // 0 = do not use fast pixel offsets
+ //
+ #ifdef GL_EXT_gpu_shader4
+ #define FXAA_FAST_PIXEL_OFFSET 1
+ #endif
+ #ifdef GL_NV_gpu_shader5
+ #define FXAA_FAST_PIXEL_OFFSET 1
+ #endif
+ #ifdef GL_ARB_gpu_shader5
+ #define FXAA_FAST_PIXEL_OFFSET 1
+ #endif
+ #ifndef FXAA_FAST_PIXEL_OFFSET
+ #define FXAA_FAST_PIXEL_OFFSET 0
+ #endif
+#endif
+/*--------------------------------------------------------------------------*/
+#ifndef FXAA_GATHER4_ALPHA
+ //
+ // 1 = API supports gather4 on alpha channel.
+ // 0 = API does not support gather4 on alpha channel.
+ //
+ #if (FXAA_HLSL_5 == 1)
+ #define FXAA_GATHER4_ALPHA 1
+ #endif
+ #ifdef GL_ARB_gpu_shader5
+ #define FXAA_GATHER4_ALPHA 1
+ #endif
+ #ifdef GL_NV_gpu_shader5
+ #define FXAA_GATHER4_ALPHA 1
+ #endif
+ #ifndef FXAA_GATHER4_ALPHA
+ #define FXAA_GATHER4_ALPHA 0
+ #endif
+#endif
+
+/*============================================================================
+ FXAA CONSOLE PS3 - TUNING KNOBS
+============================================================================*/
+#ifndef FXAA_CONSOLE__PS3_EDGE_SHARPNESS
+ //
+ // Consoles the sharpness of edges on PS3 only.
+ // Non-PS3 tuning is done with shader input.
+ //
+ // Due to the PS3 being ALU bound,
+ // there are only two safe values here: 4 and 8.
+ // These options use the shaders ability to a free *|/ by 2|4|8.
+ //
+ // 8.0 is sharper
+ // 4.0 is softer
+ // 2.0 is really soft (good for vector graphics inputs)
+ //
+ #if 1
+ #define FXAA_CONSOLE__PS3_EDGE_SHARPNESS 8.0
+ #endif
+ #if 0
+ #define FXAA_CONSOLE__PS3_EDGE_SHARPNESS 4.0
+ #endif
+ #if 0
+ #define FXAA_CONSOLE__PS3_EDGE_SHARPNESS 2.0
+ #endif
+#endif
+/*--------------------------------------------------------------------------*/
+#ifndef FXAA_CONSOLE__PS3_EDGE_THRESHOLD
+ //
+ // Only effects PS3.
+ // Non-PS3 tuning is done with shader input.
+ //
+ // The minimum amount of local contrast required to apply algorithm.
+ // The console setting has a different mapping than the quality setting.
+ //
+ // This only applies when FXAA_EARLY_EXIT is 1.
+ //
+ // Due to the PS3 being ALU bound,
+ // there are only two safe values here: 0.25 and 0.125.
+ // These options use the shaders ability to a free *|/ by 2|4|8.
+ //
+ // 0.125 leaves less aliasing, but is softer
+ // 0.25 leaves more aliasing, and is sharper
+ //
+ #if 1
+ #define FXAA_CONSOLE__PS3_EDGE_THRESHOLD 0.125
+ #else
+ #define FXAA_CONSOLE__PS3_EDGE_THRESHOLD 0.25
+ #endif
+#endif
+
+/*============================================================================
+ FXAA QUALITY - TUNING KNOBS
+------------------------------------------------------------------------------
+NOTE the other tuning knobs are now in the shader function inputs!
+============================================================================*/
+#ifndef FXAA_QUALITY__PRESET
+ //
+ // Choose the quality preset.
+ // This needs to be compiled into the shader as it effects code.
+ // Best option to include multiple presets is to
+ // in each shader define the preset, then include this file.
+ //
+ // OPTIONS
+ // -----------------------------------------------------------------------
+ // 10 to 15 - default medium dither (10=fastest, 15=highest quality)
+ // 20 to 29 - less dither, more expensive (20=fastest, 29=highest quality)
+ // 39 - no dither, very expensive
+ //
+ // NOTES
+ // -----------------------------------------------------------------------
+ // 12 = slightly faster then FXAA 3.9 and higher edge quality (default)
+ // 13 = about same speed as FXAA 3.9 and better than 12
+ // 23 = closest to FXAA 3.9 visually and performance wise
+ // _ = the lowest digit is directly related to performance
+ // _ = the highest digit is directly related to style
+ //
+ #define FXAA_QUALITY__PRESET 12
+#endif
+
+
+/*============================================================================
+
+ FXAA QUALITY - PRESETS
+
+============================================================================*/
+
+/*============================================================================
+ FXAA QUALITY - MEDIUM DITHER PRESETS
+============================================================================*/
+#if (FXAA_QUALITY__PRESET == 10)
+ #define FXAA_QUALITY__PS 3
+ #define FXAA_QUALITY__P0 1.5
+ #define FXAA_QUALITY__P1 3.0
+ #define FXAA_QUALITY__P2 12.0
+#endif
+/*--------------------------------------------------------------------------*/
+#if (FXAA_QUALITY__PRESET == 11)
+ #define FXAA_QUALITY__PS 4
+ #define FXAA_QUALITY__P0 1.0
+ #define FXAA_QUALITY__P1 1.5
+ #define FXAA_QUALITY__P2 3.0
+ #define FXAA_QUALITY__P3 12.0
+#endif
+/*--------------------------------------------------------------------------*/
+#if (FXAA_QUALITY__PRESET == 12)
+ #define FXAA_QUALITY__PS 5
+ #define FXAA_QUALITY__P0 1.0
+ #define FXAA_QUALITY__P1 1.5
+ #define FXAA_QUALITY__P2 2.0
+ #define FXAA_QUALITY__P3 4.0
+ #define FXAA_QUALITY__P4 12.0
+#endif
+/*--------------------------------------------------------------------------*/
+#if (FXAA_QUALITY__PRESET == 13)
+ #define FXAA_QUALITY__PS 6
+ #define FXAA_QUALITY__P0 1.0
+ #define FXAA_QUALITY__P1 1.5
+ #define FXAA_QUALITY__P2 2.0
+ #define FXAA_QUALITY__P3 2.0
+ #define FXAA_QUALITY__P4 4.0
+ #define FXAA_QUALITY__P5 12.0
+#endif
+/*--------------------------------------------------------------------------*/
+#if (FXAA_QUALITY__PRESET == 14)
+ #define FXAA_QUALITY__PS 7
+ #define FXAA_QUALITY__P0 1.0
+ #define FXAA_QUALITY__P1 1.5
+ #define FXAA_QUALITY__P2 2.0
+ #define FXAA_QUALITY__P3 2.0
+ #define FXAA_QUALITY__P4 2.0
+ #define FXAA_QUALITY__P5 4.0
+ #define FXAA_QUALITY__P6 12.0
+#endif
+/*--------------------------------------------------------------------------*/
+#if (FXAA_QUALITY__PRESET == 15)
+ #define FXAA_QUALITY__PS 8
+ #define FXAA_QUALITY__P0 1.0
+ #define FXAA_QUALITY__P1 1.5
+ #define FXAA_QUALITY__P2 2.0
+ #define FXAA_QUALITY__P3 2.0
+ #define FXAA_QUALITY__P4 2.0
+ #define FXAA_QUALITY__P5 2.0
+ #define FXAA_QUALITY__P6 4.0
+ #define FXAA_QUALITY__P7 12.0
+#endif
+
+/*============================================================================
+ FXAA QUALITY - LOW DITHER PRESETS
+============================================================================*/
+#if (FXAA_QUALITY__PRESET == 20)
+ #define FXAA_QUALITY__PS 3
+ #define FXAA_QUALITY__P0 1.5
+ #define FXAA_QUALITY__P1 2.0
+ #define FXAA_QUALITY__P2 8.0
+#endif
+/*--------------------------------------------------------------------------*/
+#if (FXAA_QUALITY__PRESET == 21)
+ #define FXAA_QUALITY__PS 4
+ #define FXAA_QUALITY__P0 1.0
+ #define FXAA_QUALITY__P1 1.5
+ #define FXAA_QUALITY__P2 2.0
+ #define FXAA_QUALITY__P3 8.0
+#endif
+/*--------------------------------------------------------------------------*/
+#if (FXAA_QUALITY__PRESET == 22)
+ #define FXAA_QUALITY__PS 5
+ #define FXAA_QUALITY__P0 1.0
+ #define FXAA_QUALITY__P1 1.5
+ #define FXAA_QUALITY__P2 2.0
+ #define FXAA_QUALITY__P3 2.0
+ #define FXAA_QUALITY__P4 8.0
+#endif
+/*--------------------------------------------------------------------------*/
+#if (FXAA_QUALITY__PRESET == 23)
+ #define FXAA_QUALITY__PS 6
+ #define FXAA_QUALITY__P0 1.0
+ #define FXAA_QUALITY__P1 1.5
+ #define FXAA_QUALITY__P2 2.0
+ #define FXAA_QUALITY__P3 2.0
+ #define FXAA_QUALITY__P4 2.0
+ #define FXAA_QUALITY__P5 8.0
+#endif
+/*--------------------------------------------------------------------------*/
+#if (FXAA_QUALITY__PRESET == 24)
+ #define FXAA_QUALITY__PS 7
+ #define FXAA_QUALITY__P0 1.0
+ #define FXAA_QUALITY__P1 1.5
+ #define FXAA_QUALITY__P2 2.0
+ #define FXAA_QUALITY__P3 2.0
+ #define FXAA_QUALITY__P4 2.0
+ #define FXAA_QUALITY__P5 3.0
+ #define FXAA_QUALITY__P6 8.0
+#endif
+/*--------------------------------------------------------------------------*/
+#if (FXAA_QUALITY__PRESET == 25)
+ #define FXAA_QUALITY__PS 8
+ #define FXAA_QUALITY__P0 1.0
+ #define FXAA_QUALITY__P1 1.5
+ #define FXAA_QUALITY__P2 2.0
+ #define FXAA_QUALITY__P3 2.0
+ #define FXAA_QUALITY__P4 2.0
+ #define FXAA_QUALITY__P5 2.0
+ #define FXAA_QUALITY__P6 4.0
+ #define FXAA_QUALITY__P7 8.0
+#endif
+/*--------------------------------------------------------------------------*/
+#if (FXAA_QUALITY__PRESET == 26)
+ #define FXAA_QUALITY__PS 9
+ #define FXAA_QUALITY__P0 1.0
+ #define FXAA_QUALITY__P1 1.5
+ #define FXAA_QUALITY__P2 2.0
+ #define FXAA_QUALITY__P3 2.0
+ #define FXAA_QUALITY__P4 2.0
+ #define FXAA_QUALITY__P5 2.0
+ #define FXAA_QUALITY__P6 2.0
+ #define FXAA_QUALITY__P7 4.0
+ #define FXAA_QUALITY__P8 8.0
+#endif
+/*--------------------------------------------------------------------------*/
+#if (FXAA_QUALITY__PRESET == 27)
+ #define FXAA_QUALITY__PS 10
+ #define FXAA_QUALITY__P0 1.0
+ #define FXAA_QUALITY__P1 1.5
+ #define FXAA_QUALITY__P2 2.0
+ #define FXAA_QUALITY__P3 2.0
+ #define FXAA_QUALITY__P4 2.0
+ #define FXAA_QUALITY__P5 2.0
+ #define FXAA_QUALITY__P6 2.0
+ #define FXAA_QUALITY__P7 2.0
+ #define FXAA_QUALITY__P8 4.0
+ #define FXAA_QUALITY__P9 8.0
+#endif
+/*--------------------------------------------------------------------------*/
+#if (FXAA_QUALITY__PRESET == 28)
+ #define FXAA_QUALITY__PS 11
+ #define FXAA_QUALITY__P0 1.0
+ #define FXAA_QUALITY__P1 1.5
+ #define FXAA_QUALITY__P2 2.0
+ #define FXAA_QUALITY__P3 2.0
+ #define FXAA_QUALITY__P4 2.0
+ #define FXAA_QUALITY__P5 2.0
+ #define FXAA_QUALITY__P6 2.0
+ #define FXAA_QUALITY__P7 2.0
+ #define FXAA_QUALITY__P8 2.0
+ #define FXAA_QUALITY__P9 4.0
+ #define FXAA_QUALITY__P10 8.0
+#endif
+/*--------------------------------------------------------------------------*/
+#if (FXAA_QUALITY__PRESET == 29)
+ #define FXAA_QUALITY__PS 12
+ #define FXAA_QUALITY__P0 1.0
+ #define FXAA_QUALITY__P1 1.5
+ #define FXAA_QUALITY__P2 2.0
+ #define FXAA_QUALITY__P3 2.0
+ #define FXAA_QUALITY__P4 2.0
+ #define FXAA_QUALITY__P5 2.0
+ #define FXAA_QUALITY__P6 2.0
+ #define FXAA_QUALITY__P7 2.0
+ #define FXAA_QUALITY__P8 2.0
+ #define FXAA_QUALITY__P9 2.0
+ #define FXAA_QUALITY__P10 4.0
+ #define FXAA_QUALITY__P11 8.0
+#endif
+
+/*============================================================================
+ FXAA QUALITY - EXTREME QUALITY
+============================================================================*/
+#if (FXAA_QUALITY__PRESET == 39)
+ #define FXAA_QUALITY__PS 12
+ #define FXAA_QUALITY__P0 1.0
+ #define FXAA_QUALITY__P1 1.0
+ #define FXAA_QUALITY__P2 1.0
+ #define FXAA_QUALITY__P3 1.0
+ #define FXAA_QUALITY__P4 1.0
+ #define FXAA_QUALITY__P5 1.5
+ #define FXAA_QUALITY__P6 2.0
+ #define FXAA_QUALITY__P7 2.0
+ #define FXAA_QUALITY__P8 2.0
+ #define FXAA_QUALITY__P9 2.0
+ #define FXAA_QUALITY__P10 4.0
+ #define FXAA_QUALITY__P11 8.0
+#endif
+
+
+
+/*============================================================================
+
+ API PORTING
+
+============================================================================*/
+#if (FXAA_GLSL_120 == 1) || (FXAA_GLSL_130 == 1)
+ #define FxaaBool bool
+ #define FxaaDiscard discard
+ #define FxaaFloat float
+ #define FxaaFloat2 vec2
+ #define FxaaFloat3 vec3
+ #define FxaaFloat4 vec4
+ #define FxaaHalf float
+ #define FxaaHalf2 vec2
+ #define FxaaHalf3 vec3
+ #define FxaaHalf4 vec4
+ #define FxaaInt2 ivec2
+ #define FxaaSat(x) clamp(x, 0.0, 1.0)
+ #define FxaaTex sampler2D
+#else
+ #define FxaaBool bool
+ #define FxaaDiscard clip(-1)
+ #define FxaaFloat float
+ #define FxaaFloat2 float2
+ #define FxaaFloat3 float3
+ #define FxaaFloat4 float4
+ #define FxaaHalf half
+ #define FxaaHalf2 half2
+ #define FxaaHalf3 half3
+ #define FxaaHalf4 half4
+ #define FxaaSat(x) saturate(x)
+#endif
+/*--------------------------------------------------------------------------*/
+#if (FXAA_GLSL_120 == 1)
+ // Requires,
+ // #version 120
+ // And at least,
+ // #extension GL_EXT_gpu_shader4 : enable
+ // (or set FXAA_FAST_PIXEL_OFFSET 1 to work like DX9)
+ #define FxaaTexTop(t, p) texture2DLod(t, p, 0.0)
+ #if (FXAA_FAST_PIXEL_OFFSET == 1)
+ #define FxaaTexOff(t, p, o, r) texture2DLodOffset(t, p, 0.0, o)
+ #else
+ #define FxaaTexOff(t, p, o, r) texture2DLod(t, p + (o * r), 0.0)
+ #endif
+ #if (FXAA_GATHER4_ALPHA == 1)
+ // use #extension GL_ARB_gpu_shader5 : enable
+ #define FxaaTexAlpha4(t, p) textureGather(t, p, 3)
+ #define FxaaTexOffAlpha4(t, p, o) textureGatherOffset(t, p, o, 3)
+ #define FxaaTexGreen4(t, p) textureGather(t, p, 1)
+ #define FxaaTexOffGreen4(t, p, o) textureGatherOffset(t, p, o, 1)
+ #endif
+#endif
+/*--------------------------------------------------------------------------*/
+#if (FXAA_GLSL_130 == 1)
+ // Requires "#version 130" or better
+ #define FxaaTexTop(t, p) textureLod(t, p, 0.0)
+ #define FxaaTexOff(t, p, o, r) textureLodOffset(t, p, 0.0, o)
+ #if (FXAA_GATHER4_ALPHA == 1)
+ // use #extension GL_ARB_gpu_shader5 : enable
+ #define FxaaTexAlpha4(t, p) textureGather(t, p, 3)
+ #define FxaaTexOffAlpha4(t, p, o) textureGatherOffset(t, p, o, 3)
+ #define FxaaTexGreen4(t, p) textureGather(t, p, 1)
+ #define FxaaTexOffGreen4(t, p, o) textureGatherOffset(t, p, o, 1)
+ #endif
+#endif
+/*--------------------------------------------------------------------------*/
+#if (FXAA_HLSL_3 == 1) || (FXAA_360 == 1) || (FXAA_PS3 == 1)
+ #define FxaaInt2 float2
+ #define FxaaTex sampler2D
+ #define FxaaTexTop(t, p) tex2Dlod(t, float4(p, 0.0, 0.0))
+ #define FxaaTexOff(t, p, o, r) tex2Dlod(t, float4(p + (o * r), 0, 0))
+#endif
+/*--------------------------------------------------------------------------*/
+#if (FXAA_HLSL_4 == 1)
+ #define FxaaInt2 int2
+ struct FxaaTex { SamplerState smpl; Texture2D tex; };
+ #define FxaaTexTop(t, p) t.tex.SampleLevel(t.smpl, p, 0.0)
+ #define FxaaTexOff(t, p, o, r) t.tex.SampleLevel(t.smpl, p, 0.0, o)
+#endif
+/*--------------------------------------------------------------------------*/
+#if (FXAA_HLSL_5 == 1)
+ #define FxaaInt2 int2
+ struct FxaaTex { SamplerState smpl; Texture2D tex; };
+ #define FxaaTexTop(t, p) t.tex.SampleLevel(t.smpl, p, 0.0)
+ #define FxaaTexOff(t, p, o, r) t.tex.SampleLevel(t.smpl, p, 0.0, o)
+ #define FxaaTexAlpha4(t, p) t.tex.GatherAlpha(t.smpl, p)
+ #define FxaaTexOffAlpha4(t, p, o) t.tex.GatherAlpha(t.smpl, p, o)
+ #define FxaaTexGreen4(t, p) t.tex.GatherGreen(t.smpl, p)
+ #define FxaaTexOffGreen4(t, p, o) t.tex.GatherGreen(t.smpl, p, o)
+#endif
+
+
+/*============================================================================
+ GREEN AS LUMA OPTION SUPPORT FUNCTION
+============================================================================*/
+#if (FXAA_GREEN_AS_LUMA == 0)
+ FxaaFloat FxaaLuma(FxaaFloat4 rgba) { return rgba.w; }
+#else
+ FxaaFloat FxaaLuma(FxaaFloat4 rgba) { return rgba.y; }
+#endif
+
+
+
+
+/*============================================================================
+
+ FXAA3 QUALITY - PC
+
+============================================================================*/
+#if (FXAA_PC == 1)
+/*--------------------------------------------------------------------------*/
+FxaaFloat4 FxaaPixelShader(
+ //
+ // Use noperspective interpolation here (turn off perspective interpolation).
+ // {xy} = center of pixel
+ FxaaFloat2 pos,
+ //
+ // Used only for FXAA Console, and not used on the 360 version.
+ // Use noperspective interpolation here (turn off perspective interpolation).
+ // {xy__} = upper left of pixel
+ // {__zw} = lower right of pixel
+ FxaaFloat4 fxaaConsolePosPos,
+ //
+ // Input color texture.
+ // {rgb_} = color in linear or perceptual color space
+ // if (FXAA_GREEN_AS_LUMA == 0)
+ // {___a} = luma in perceptual color space (not linear)
+ FxaaTex tex,
+ //
+ // Only used on the optimized 360 version of FXAA Console.
+ // For everything but 360, just use the same input here as for "tex".
+ // For 360, same texture, just alias with a 2nd sampler.
+ // This sampler needs to have an exponent bias of -1.
+ FxaaTex fxaaConsole360TexExpBiasNegOne,
+ //
+ // Only used on the optimized 360 version of FXAA Console.
+ // For everything but 360, just use the same input here as for "tex".
+ // For 360, same texture, just alias with a 3nd sampler.
+ // This sampler needs to have an exponent bias of -2.
+ FxaaTex fxaaConsole360TexExpBiasNegTwo,
+ //
+ // Only used on FXAA Quality.
+ // This must be from a constant/uniform.
+ // {x_} = 1.0/screenWidthInPixels
+ // {_y} = 1.0/screenHeightInPixels
+ FxaaFloat2 fxaaQualityRcpFrame,
+ //
+ // Only used on FXAA Console.
+ // This must be from a constant/uniform.
+ // This effects sub-pixel AA quality and inversely sharpness.
+ // Where N ranges between,
+ // N = 0.50 (default)
+ // N = 0.33 (sharper)
+ // {x___} = -N/screenWidthInPixels
+ // {_y__} = -N/screenHeightInPixels
+ // {__z_} = N/screenWidthInPixels
+ // {___w} = N/screenHeightInPixels
+ FxaaFloat4 fxaaConsoleRcpFrameOpt,
+ //
+ // Only used on FXAA Console.
+ // Not used on 360, but used on PS3 and PC.
+ // This must be from a constant/uniform.
+ // {x___} = -2.0/screenWidthInPixels
+ // {_y__} = -2.0/screenHeightInPixels
+ // {__z_} = 2.0/screenWidthInPixels
+ // {___w} = 2.0/screenHeightInPixels
+ FxaaFloat4 fxaaConsoleRcpFrameOpt2,
+ //
+ // Only used on FXAA Console.
+ // Only used on 360 in place of fxaaConsoleRcpFrameOpt2.
+ // This must be from a constant/uniform.
+ // {x___} = 8.0/screenWidthInPixels
+ // {_y__} = 8.0/screenHeightInPixels
+ // {__z_} = -4.0/screenWidthInPixels
+ // {___w} = -4.0/screenHeightInPixels
+ FxaaFloat4 fxaaConsole360RcpFrameOpt2,
+ //
+ // Only used on FXAA Quality.
+ // This used to be the FXAA_QUALITY__SUBPIX define.
+ // It is here now to allow easier tuning.
+ // Choose the amount of sub-pixel aliasing removal.
+ // This can effect sharpness.
+ // 1.00 - upper limit (softer)
+ // 0.75 - default amount of filtering
+ // 0.50 - lower limit (sharper, less sub-pixel aliasing removal)
+ // 0.25 - almost off
+ // 0.00 - completely off
+ FxaaFloat fxaaQualitySubpix,
+ //
+ // Only used on FXAA Quality.
+ // This used to be the FXAA_QUALITY__EDGE_THRESHOLD define.
+ // It is here now to allow easier tuning.
+ // The minimum amount of local contrast required to apply algorithm.
+ // 0.333 - too little (faster)
+ // 0.250 - low quality
+ // 0.166 - default
+ // 0.125 - high quality
+ // 0.063 - overkill (slower)
+ FxaaFloat fxaaQualityEdgeThreshold,
+ //
+ // Only used on FXAA Quality.
+ // This used to be the FXAA_QUALITY__EDGE_THRESHOLD_MIN define.
+ // It is here now to allow easier tuning.
+ // Trims the algorithm from processing darks.
+ // 0.0833 - upper limit (default, the start of visible unfiltered edges)
+ // 0.0625 - high quality (faster)
+ // 0.0312 - visible limit (slower)
+ // Special notes when using FXAA_GREEN_AS_LUMA,
+ // Likely want to set this to zero.
+ // As colors that are mostly not-green
+ // will appear very dark in the green channel!
+ // Tune by looking at mostly non-green content,
+ // then start at zero and increase until aliasing is a problem.
+ FxaaFloat fxaaQualityEdgeThresholdMin,
+ //
+ // Only used on FXAA Console.
+ // This used to be the FXAA_CONSOLE__EDGE_SHARPNESS define.
+ // It is here now to allow easier tuning.
+ // This does not effect PS3, as this needs to be compiled in.
+ // Use FXAA_CONSOLE__PS3_EDGE_SHARPNESS for PS3.
+ // Due to the PS3 being ALU bound,
+ // there are only three safe values here: 2 and 4 and 8.
+ // These options use the shaders ability to a free *|/ by 2|4|8.
+ // For all other platforms can be a non-power of two.
+ // 8.0 is sharper (default!!!)
+ // 4.0 is softer
+ // 2.0 is really soft (good only for vector graphics inputs)
+ FxaaFloat fxaaConsoleEdgeSharpness,
+ //
+ // Only used on FXAA Console.
+ // This used to be the FXAA_CONSOLE__EDGE_THRESHOLD define.
+ // It is here now to allow easier tuning.
+ // This does not effect PS3, as this needs to be compiled in.
+ // Use FXAA_CONSOLE__PS3_EDGE_THRESHOLD for PS3.
+ // Due to the PS3 being ALU bound,
+ // there are only two safe values here: 1/4 and 1/8.
+ // These options use the shaders ability to a free *|/ by 2|4|8.
+ // The console setting has a different mapping than the quality setting.
+ // Other platforms can use other values.
+ // 0.125 leaves less aliasing, but is softer (default!!!)
+ // 0.25 leaves more aliasing, and is sharper
+ FxaaFloat fxaaConsoleEdgeThreshold,
+ //
+ // Only used on FXAA Console.
+ // This used to be the FXAA_CONSOLE__EDGE_THRESHOLD_MIN define.
+ // It is here now to allow easier tuning.
+ // Trims the algorithm from processing darks.
+ // The console setting has a different mapping than the quality setting.
+ // This only applies when FXAA_EARLY_EXIT is 1.
+ // This does not apply to PS3,
+ // PS3 was simplified to avoid more shader instructions.
+ // 0.06 - faster but more aliasing in darks
+ // 0.05 - default
+ // 0.04 - slower and less aliasing in darks
+ // Special notes when using FXAA_GREEN_AS_LUMA,
+ // Likely want to set this to zero.
+ // As colors that are mostly not-green
+ // will appear very dark in the green channel!
+ // Tune by looking at mostly non-green content,
+ // then start at zero and increase until aliasing is a problem.
+ FxaaFloat fxaaConsoleEdgeThresholdMin,
+ //
+ // Extra constants for 360 FXAA Console only.
+ // Use zeros or anything else for other platforms.
+ // These must be in physical constant registers and NOT immedates.
+ // Immedates will result in compiler un-optimizing.
+ // {xyzw} = float4(1.0, -1.0, 0.25, -0.25)
+ FxaaFloat4 fxaaConsole360ConstDir
+) {
+/*--------------------------------------------------------------------------*/
+ FxaaFloat2 posM;
+ posM.x = pos.x;
+ posM.y = pos.y;
+ #if (FXAA_GATHER4_ALPHA == 1)
+ #if (FXAA_DISCARD == 0)
+ FxaaFloat4 rgbyM = FxaaTexTop(tex, posM);
+ #if (FXAA_GREEN_AS_LUMA == 0)
+ #define lumaM rgbyM.w
+ #else
+ #define lumaM rgbyM.y
+ #endif
+ #endif
+ #if (FXAA_GREEN_AS_LUMA == 0)
+ FxaaFloat4 luma4A = FxaaTexAlpha4(tex, posM);
+ FxaaFloat4 luma4B = FxaaTexOffAlpha4(tex, posM, FxaaInt2(-1, -1));
+ #else
+ FxaaFloat4 luma4A = FxaaTexGreen4(tex, posM);
+ FxaaFloat4 luma4B = FxaaTexOffGreen4(tex, posM, FxaaInt2(-1, -1));
+ #endif
+ #if (FXAA_DISCARD == 1)
+ #define lumaM luma4A.w
+ #endif
+ #define lumaE luma4A.z
+ #define lumaS luma4A.x
+ #define lumaSE luma4A.y
+ #define lumaNW luma4B.w
+ #define lumaN luma4B.z
+ #define lumaW luma4B.x
+ #else
+ FxaaFloat4 rgbyM = FxaaTexTop(tex, posM);
+ #if (FXAA_GREEN_AS_LUMA == 0)
+ #define lumaM rgbyM.w
+ #else
+ #define lumaM rgbyM.y
+ #endif
+ FxaaFloat lumaS = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2( 0, 1), fxaaQualityRcpFrame.xy));
+ FxaaFloat lumaE = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2( 1, 0), fxaaQualityRcpFrame.xy));
+ FxaaFloat lumaN = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2( 0,-1), fxaaQualityRcpFrame.xy));
+ FxaaFloat lumaW = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2(-1, 0), fxaaQualityRcpFrame.xy));
+ #endif
+/*--------------------------------------------------------------------------*/
+ FxaaFloat maxSM = max(lumaS, lumaM);
+ FxaaFloat minSM = min(lumaS, lumaM);
+ FxaaFloat maxESM = max(lumaE, maxSM);
+ FxaaFloat minESM = min(lumaE, minSM);
+ FxaaFloat maxWN = max(lumaN, lumaW);
+ FxaaFloat minWN = min(lumaN, lumaW);
+ FxaaFloat rangeMax = max(maxWN, maxESM);
+ FxaaFloat rangeMin = min(minWN, minESM);
+ FxaaFloat rangeMaxScaled = rangeMax * fxaaQualityEdgeThreshold;
+ FxaaFloat range = rangeMax - rangeMin;
+ FxaaFloat rangeMaxClamped = max(fxaaQualityEdgeThresholdMin, rangeMaxScaled);
+ FxaaBool earlyExit = range < rangeMaxClamped;
+/*--------------------------------------------------------------------------*/
+ if(earlyExit)
+ #if (FXAA_DISCARD == 1)
+ FxaaDiscard;
+ #else
+ return rgbyM;
+ #endif
+/*--------------------------------------------------------------------------*/
+ #if (FXAA_GATHER4_ALPHA == 0)
+ FxaaFloat lumaNW = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2(-1,-1), fxaaQualityRcpFrame.xy));
+ FxaaFloat lumaSE = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2( 1, 1), fxaaQualityRcpFrame.xy));
+ FxaaFloat lumaNE = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2( 1,-1), fxaaQualityRcpFrame.xy));
+ FxaaFloat lumaSW = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2(-1, 1), fxaaQualityRcpFrame.xy));
+ #else
+ FxaaFloat lumaNE = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2(1, -1), fxaaQualityRcpFrame.xy));
+ FxaaFloat lumaSW = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2(-1, 1), fxaaQualityRcpFrame.xy));
+ #endif
+/*--------------------------------------------------------------------------*/
+ FxaaFloat lumaNS = lumaN + lumaS;
+ FxaaFloat lumaWE = lumaW + lumaE;
+ FxaaFloat subpixRcpRange = 1.0/range;
+ FxaaFloat subpixNSWE = lumaNS + lumaWE;
+ FxaaFloat edgeHorz1 = (-2.0 * lumaM) + lumaNS;
+ FxaaFloat edgeVert1 = (-2.0 * lumaM) + lumaWE;
+/*--------------------------------------------------------------------------*/
+ FxaaFloat lumaNESE = lumaNE + lumaSE;
+ FxaaFloat lumaNWNE = lumaNW + lumaNE;
+ FxaaFloat edgeHorz2 = (-2.0 * lumaE) + lumaNESE;
+ FxaaFloat edgeVert2 = (-2.0 * lumaN) + lumaNWNE;
+/*--------------------------------------------------------------------------*/
+ FxaaFloat lumaNWSW = lumaNW + lumaSW;
+ FxaaFloat lumaSWSE = lumaSW + lumaSE;
+ FxaaFloat edgeHorz4 = (abs(edgeHorz1) * 2.0) + abs(edgeHorz2);
+ FxaaFloat edgeVert4 = (abs(edgeVert1) * 2.0) + abs(edgeVert2);
+ FxaaFloat edgeHorz3 = (-2.0 * lumaW) + lumaNWSW;
+ FxaaFloat edgeVert3 = (-2.0 * lumaS) + lumaSWSE;
+ FxaaFloat edgeHorz = abs(edgeHorz3) + edgeHorz4;
+ FxaaFloat edgeVert = abs(edgeVert3) + edgeVert4;
+/*--------------------------------------------------------------------------*/
+ FxaaFloat subpixNWSWNESE = lumaNWSW + lumaNESE;
+ FxaaFloat lengthSign = fxaaQualityRcpFrame.x;
+ FxaaBool horzSpan = edgeHorz >= edgeVert;
+ FxaaFloat subpixA = subpixNSWE * 2.0 + subpixNWSWNESE;
+/*--------------------------------------------------------------------------*/
+ if(!horzSpan) lumaN = lumaW;
+ if(!horzSpan) lumaS = lumaE;
+ if(horzSpan) lengthSign = fxaaQualityRcpFrame.y;
+ FxaaFloat subpixB = (subpixA * (1.0/12.0)) - lumaM;
+/*--------------------------------------------------------------------------*/
+ FxaaFloat gradientN = lumaN - lumaM;
+ FxaaFloat gradientS = lumaS - lumaM;
+ FxaaFloat lumaNN = lumaN + lumaM;
+ FxaaFloat lumaSS = lumaS + lumaM;
+ FxaaBool pairN = abs(gradientN) >= abs(gradientS);
+ FxaaFloat gradient = max(abs(gradientN), abs(gradientS));
+ if(pairN) lengthSign = -lengthSign;
+ FxaaFloat subpixC = FxaaSat(abs(subpixB) * subpixRcpRange);
+/*--------------------------------------------------------------------------*/
+ FxaaFloat2 posB;
+ posB.x = posM.x;
+ posB.y = posM.y;
+ FxaaFloat2 offNP;
+ offNP.x = (!horzSpan) ? 0.0 : fxaaQualityRcpFrame.x;
+ offNP.y = ( horzSpan) ? 0.0 : fxaaQualityRcpFrame.y;
+ if(!horzSpan) posB.x += lengthSign * 0.5;
+ if( horzSpan) posB.y += lengthSign * 0.5;
+/*--------------------------------------------------------------------------*/
+ FxaaFloat2 posN;
+ posN.x = posB.x - offNP.x * FXAA_QUALITY__P0;
+ posN.y = posB.y - offNP.y * FXAA_QUALITY__P0;
+ FxaaFloat2 posP;
+ posP.x = posB.x + offNP.x * FXAA_QUALITY__P0;
+ posP.y = posB.y + offNP.y * FXAA_QUALITY__P0;
+ FxaaFloat subpixD = ((-2.0)*subpixC) + 3.0;
+ FxaaFloat lumaEndN = FxaaLuma(FxaaTexTop(tex, posN));
+ FxaaFloat subpixE = subpixC * subpixC;
+ FxaaFloat lumaEndP = FxaaLuma(FxaaTexTop(tex, posP));
+/*--------------------------------------------------------------------------*/
+ if(!pairN) lumaNN = lumaSS;
+ FxaaFloat gradientScaled = gradient * 1.0/4.0;
+ FxaaFloat lumaMM = lumaM - lumaNN * 0.5;
+ FxaaFloat subpixF = subpixD * subpixE;
+ FxaaBool lumaMLTZero = lumaMM < 0.0;
+/*--------------------------------------------------------------------------*/
+ lumaEndN -= lumaNN * 0.5;
+ lumaEndP -= lumaNN * 0.5;
+ FxaaBool doneN = abs(lumaEndN) >= gradientScaled;
+ FxaaBool doneP = abs(lumaEndP) >= gradientScaled;
+ if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P1;
+ if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P1;
+ FxaaBool doneNP = (!doneN) || (!doneP);
+ if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P1;
+ if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P1;
+/*--------------------------------------------------------------------------*/
+ if(doneNP) {
+ if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy));
+ if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy));
+ if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;
+ if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;
+ doneN = abs(lumaEndN) >= gradientScaled;
+ doneP = abs(lumaEndP) >= gradientScaled;
+ if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P2;
+ if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P2;
+ doneNP = (!doneN) || (!doneP);
+ if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P2;
+ if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P2;
+/*--------------------------------------------------------------------------*/
+ #if (FXAA_QUALITY__PS > 3)
+ if(doneNP) {
+ if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy));
+ if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy));
+ if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;
+ if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;
+ doneN = abs(lumaEndN) >= gradientScaled;
+ doneP = abs(lumaEndP) >= gradientScaled;
+ if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P3;
+ if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P3;
+ doneNP = (!doneN) || (!doneP);
+ if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P3;
+ if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P3;
+/*--------------------------------------------------------------------------*/
+ #if (FXAA_QUALITY__PS > 4)
+ if(doneNP) {
+ if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy));
+ if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy));
+ if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;
+ if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;
+ doneN = abs(lumaEndN) >= gradientScaled;
+ doneP = abs(lumaEndP) >= gradientScaled;
+ if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P4;
+ if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P4;
+ doneNP = (!doneN) || (!doneP);
+ if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P4;
+ if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P4;
+/*--------------------------------------------------------------------------*/
+ #if (FXAA_QUALITY__PS > 5)
+ if(doneNP) {
+ if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy));
+ if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy));
+ if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;
+ if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;
+ doneN = abs(lumaEndN) >= gradientScaled;
+ doneP = abs(lumaEndP) >= gradientScaled;
+ if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P5;
+ if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P5;
+ doneNP = (!doneN) || (!doneP);
+ if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P5;
+ if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P5;
+/*--------------------------------------------------------------------------*/
+ #if (FXAA_QUALITY__PS > 6)
+ if(doneNP) {
+ if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy));
+ if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy));
+ if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;
+ if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;
+ doneN = abs(lumaEndN) >= gradientScaled;
+ doneP = abs(lumaEndP) >= gradientScaled;
+ if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P6;
+ if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P6;
+ doneNP = (!doneN) || (!doneP);
+ if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P6;
+ if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P6;
+/*--------------------------------------------------------------------------*/
+ #if (FXAA_QUALITY__PS > 7)
+ if(doneNP) {
+ if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy));
+ if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy));
+ if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;
+ if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;
+ doneN = abs(lumaEndN) >= gradientScaled;
+ doneP = abs(lumaEndP) >= gradientScaled;
+ if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P7;
+ if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P7;
+ doneNP = (!doneN) || (!doneP);
+ if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P7;
+ if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P7;
+/*--------------------------------------------------------------------------*/
+ #if (FXAA_QUALITY__PS > 8)
+ if(doneNP) {
+ if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy));
+ if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy));
+ if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;
+ if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;
+ doneN = abs(lumaEndN) >= gradientScaled;
+ doneP = abs(lumaEndP) >= gradientScaled;
+ if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P8;
+ if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P8;
+ doneNP = (!doneN) || (!doneP);
+ if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P8;
+ if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P8;
+/*--------------------------------------------------------------------------*/
+ #if (FXAA_QUALITY__PS > 9)
+ if(doneNP) {
+ if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy));
+ if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy));
+ if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;
+ if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;
+ doneN = abs(lumaEndN) >= gradientScaled;
+ doneP = abs(lumaEndP) >= gradientScaled;
+ if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P9;
+ if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P9;
+ doneNP = (!doneN) || (!doneP);
+ if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P9;
+ if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P9;
+/*--------------------------------------------------------------------------*/
+ #if (FXAA_QUALITY__PS > 10)
+ if(doneNP) {
+ if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy));
+ if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy));
+ if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;
+ if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;
+ doneN = abs(lumaEndN) >= gradientScaled;
+ doneP = abs(lumaEndP) >= gradientScaled;
+ if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P10;
+ if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P10;
+ doneNP = (!doneN) || (!doneP);
+ if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P10;
+ if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P10;
+/*--------------------------------------------------------------------------*/
+ #if (FXAA_QUALITY__PS > 11)
+ if(doneNP) {
+ if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy));
+ if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy));
+ if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;
+ if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;
+ doneN = abs(lumaEndN) >= gradientScaled;
+ doneP = abs(lumaEndP) >= gradientScaled;
+ if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P11;
+ if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P11;
+ doneNP = (!doneN) || (!doneP);
+ if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P11;
+ if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P11;
+/*--------------------------------------------------------------------------*/
+ #if (FXAA_QUALITY__PS > 12)
+ if(doneNP) {
+ if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy));
+ if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy));
+ if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;
+ if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;
+ doneN = abs(lumaEndN) >= gradientScaled;
+ doneP = abs(lumaEndP) >= gradientScaled;
+ if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P12;
+ if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P12;
+ doneNP = (!doneN) || (!doneP);
+ if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P12;
+ if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P12;
+/*--------------------------------------------------------------------------*/
+ }
+ #endif
+/*--------------------------------------------------------------------------*/
+ }
+ #endif
+/*--------------------------------------------------------------------------*/
+ }
+ #endif
+/*--------------------------------------------------------------------------*/
+ }
+ #endif
+/*--------------------------------------------------------------------------*/
+ }
+ #endif
+/*--------------------------------------------------------------------------*/
+ }
+ #endif
+/*--------------------------------------------------------------------------*/
+ }
+ #endif
+/*--------------------------------------------------------------------------*/
+ }
+ #endif
+/*--------------------------------------------------------------------------*/
+ }
+ #endif
+/*--------------------------------------------------------------------------*/
+ }
+ #endif
+/*--------------------------------------------------------------------------*/
+ }
+/*--------------------------------------------------------------------------*/
+ FxaaFloat dstN = posM.x - posN.x;
+ FxaaFloat dstP = posP.x - posM.x;
+ if(!horzSpan) dstN = posM.y - posN.y;
+ if(!horzSpan) dstP = posP.y - posM.y;
+/*--------------------------------------------------------------------------*/
+ FxaaBool goodSpanN = (lumaEndN < 0.0) != lumaMLTZero;
+ FxaaFloat spanLength = (dstP + dstN);
+ FxaaBool goodSpanP = (lumaEndP < 0.0) != lumaMLTZero;
+ FxaaFloat spanLengthRcp = 1.0/spanLength;
+/*--------------------------------------------------------------------------*/
+ FxaaBool directionN = dstN < dstP;
+ FxaaFloat dst = min(dstN, dstP);
+ FxaaBool goodSpan = directionN ? goodSpanN : goodSpanP;
+ FxaaFloat subpixG = subpixF * subpixF;
+ FxaaFloat pixelOffset = (dst * (-spanLengthRcp)) + 0.5;
+ FxaaFloat subpixH = subpixG * fxaaQualitySubpix;
+/*--------------------------------------------------------------------------*/
+ FxaaFloat pixelOffsetGood = goodSpan ? pixelOffset : 0.0;
+ FxaaFloat pixelOffsetSubpix = max(pixelOffsetGood, subpixH);
+ if(!horzSpan) posM.x += pixelOffsetSubpix * lengthSign;
+ if( horzSpan) posM.y += pixelOffsetSubpix * lengthSign;
+ #if (FXAA_DISCARD == 1)
+ return FxaaTexTop(tex, posM);
+ #else
+ return FxaaFloat4(FxaaTexTop(tex, posM).xyz, lumaM);
+ #endif
+}
+/*==========================================================================*/
+#endif
+
+
+
+
+/*============================================================================
+
+ FXAA3 CONSOLE - PC VERSION
+
+------------------------------------------------------------------------------
+Instead of using this on PC, I'd suggest just using FXAA Quality with
+ #define FXAA_QUALITY__PRESET 10
+Or
+ #define FXAA_QUALITY__PRESET 20
+Either are higher qualilty and almost as fast as this on modern PC GPUs.
+============================================================================*/
+#if (FXAA_PC_CONSOLE == 1)
+/*--------------------------------------------------------------------------*/
+FxaaFloat4 FxaaPixelShader(
+ // See FXAA Quality FxaaPixelShader() source for docs on Inputs!
+ FxaaFloat2 pos,
+ FxaaFloat4 fxaaConsolePosPos,
+ FxaaTex tex,
+ FxaaTex fxaaConsole360TexExpBiasNegOne,
+ FxaaTex fxaaConsole360TexExpBiasNegTwo,
+ FxaaFloat2 fxaaQualityRcpFrame,
+ FxaaFloat4 fxaaConsoleRcpFrameOpt,
+ FxaaFloat4 fxaaConsoleRcpFrameOpt2,
+ FxaaFloat4 fxaaConsole360RcpFrameOpt2,
+ FxaaFloat fxaaQualitySubpix,
+ FxaaFloat fxaaQualityEdgeThreshold,
+ FxaaFloat fxaaQualityEdgeThresholdMin,
+ FxaaFloat fxaaConsoleEdgeSharpness,
+ FxaaFloat fxaaConsoleEdgeThreshold,
+ FxaaFloat fxaaConsoleEdgeThresholdMin,
+ FxaaFloat4 fxaaConsole360ConstDir
+) {
+/*--------------------------------------------------------------------------*/
+ FxaaFloat lumaNw = FxaaLuma(FxaaTexTop(tex, fxaaConsolePosPos.xy));
+ FxaaFloat lumaSw = FxaaLuma(FxaaTexTop(tex, fxaaConsolePosPos.xw));
+ FxaaFloat lumaNe = FxaaLuma(FxaaTexTop(tex, fxaaConsolePosPos.zy));
+ FxaaFloat lumaSe = FxaaLuma(FxaaTexTop(tex, fxaaConsolePosPos.zw));
+/*--------------------------------------------------------------------------*/
+ FxaaFloat4 rgbyM = FxaaTexTop(tex, pos.xy);
+ #if (FXAA_GREEN_AS_LUMA == 0)
+ FxaaFloat lumaM = rgbyM.w;
+ #else
+ FxaaFloat lumaM = rgbyM.y;
+ #endif
+/*--------------------------------------------------------------------------*/
+ FxaaFloat lumaMaxNwSw = max(lumaNw, lumaSw);
+ lumaNe += 1.0/384.0;
+ FxaaFloat lumaMinNwSw = min(lumaNw, lumaSw);
+/*--------------------------------------------------------------------------*/
+ FxaaFloat lumaMaxNeSe = max(lumaNe, lumaSe);
+ FxaaFloat lumaMinNeSe = min(lumaNe, lumaSe);
+/*--------------------------------------------------------------------------*/
+ FxaaFloat lumaMax = max(lumaMaxNeSe, lumaMaxNwSw);
+ FxaaFloat lumaMin = min(lumaMinNeSe, lumaMinNwSw);
+/*--------------------------------------------------------------------------*/
+ FxaaFloat lumaMaxScaled = lumaMax * fxaaConsoleEdgeThreshold;
+/*--------------------------------------------------------------------------*/
+ FxaaFloat lumaMinM = min(lumaMin, lumaM);
+ FxaaFloat lumaMaxScaledClamped = max(fxaaConsoleEdgeThresholdMin, lumaMaxScaled);
+ FxaaFloat lumaMaxM = max(lumaMax, lumaM);
+ FxaaFloat dirSwMinusNe = lumaSw - lumaNe;
+ FxaaFloat lumaMaxSubMinM = lumaMaxM - lumaMinM;
+ FxaaFloat dirSeMinusNw = lumaSe - lumaNw;
+ if(lumaMaxSubMinM < lumaMaxScaledClamped) return rgbyM;
+/*--------------------------------------------------------------------------*/
+ FxaaFloat2 dir;
+ dir.x = dirSwMinusNe + dirSeMinusNw;
+ dir.y = dirSwMinusNe - dirSeMinusNw;
+/*--------------------------------------------------------------------------*/
+ FxaaFloat2 dir1 = normalize(dir.xy);
+ FxaaFloat4 rgbyN1 = FxaaTexTop(tex, pos.xy - dir1 * fxaaConsoleRcpFrameOpt.zw);
+ FxaaFloat4 rgbyP1 = FxaaTexTop(tex, pos.xy + dir1 * fxaaConsoleRcpFrameOpt.zw);
+/*--------------------------------------------------------------------------*/
+ FxaaFloat dirAbsMinTimesC = min(abs(dir1.x), abs(dir1.y)) * fxaaConsoleEdgeSharpness;
+ FxaaFloat2 dir2 = clamp(dir1.xy / dirAbsMinTimesC, -2.0, 2.0);
+/*--------------------------------------------------------------------------*/
+ FxaaFloat4 rgbyN2 = FxaaTexTop(tex, pos.xy - dir2 * fxaaConsoleRcpFrameOpt2.zw);
+ FxaaFloat4 rgbyP2 = FxaaTexTop(tex, pos.xy + dir2 * fxaaConsoleRcpFrameOpt2.zw);
+/*--------------------------------------------------------------------------*/
+ FxaaFloat4 rgbyA = rgbyN1 + rgbyP1;
+ FxaaFloat4 rgbyB = ((rgbyN2 + rgbyP2) * 0.25) + (rgbyA * 0.25);
+/*--------------------------------------------------------------------------*/
+ #if (FXAA_GREEN_AS_LUMA == 0)
+ FxaaBool twoTap = (rgbyB.w < lumaMin) || (rgbyB.w > lumaMax);
+ #else
+ FxaaBool twoTap = (rgbyB.y < lumaMin) || (rgbyB.y > lumaMax);
+ #endif
+ if(twoTap) rgbyB.xyz = rgbyA.xyz * 0.5;
+ return rgbyB; }
+/*==========================================================================*/
+#endif
+
+
+
+/*============================================================================
+
+ FXAA3 CONSOLE - 360 PIXEL SHADER
+
+------------------------------------------------------------------------------
+This optimized version thanks to suggestions from Andy Luedke.
+Should be fully tex bound in all cases.
+As of the FXAA 3.11 release, I have still not tested this code,
+however I fixed a bug which was in both FXAA 3.9 and FXAA 3.10.
+And note this is replacing the old unoptimized version.
+If it does not work, please let me know so I can fix it.
+============================================================================*/
+#if (FXAA_360 == 1)
+/*--------------------------------------------------------------------------*/
+[reduceTempRegUsage(4)]
+float4 FxaaPixelShader(
+ // See FXAA Quality FxaaPixelShader() source for docs on Inputs!
+ FxaaFloat2 pos,
+ FxaaFloat4 fxaaConsolePosPos,
+ FxaaTex tex,
+ FxaaTex fxaaConsole360TexExpBiasNegOne,
+ FxaaTex fxaaConsole360TexExpBiasNegTwo,
+ FxaaFloat2 fxaaQualityRcpFrame,
+ FxaaFloat4 fxaaConsoleRcpFrameOpt,
+ FxaaFloat4 fxaaConsoleRcpFrameOpt2,
+ FxaaFloat4 fxaaConsole360RcpFrameOpt2,
+ FxaaFloat fxaaQualitySubpix,
+ FxaaFloat fxaaQualityEdgeThreshold,
+ FxaaFloat fxaaQualityEdgeThresholdMin,
+ FxaaFloat fxaaConsoleEdgeSharpness,
+ FxaaFloat fxaaConsoleEdgeThreshold,
+ FxaaFloat fxaaConsoleEdgeThresholdMin,
+ FxaaFloat4 fxaaConsole360ConstDir
+) {
+/*--------------------------------------------------------------------------*/
+ float4 lumaNwNeSwSe;
+ #if (FXAA_GREEN_AS_LUMA == 0)
+ asm {
+ tfetch2D lumaNwNeSwSe.w___, tex, pos.xy, OffsetX = -0.5, OffsetY = -0.5, UseComputedLOD=false
+ tfetch2D lumaNwNeSwSe._w__, tex, pos.xy, OffsetX = 0.5, OffsetY = -0.5, UseComputedLOD=false
+ tfetch2D lumaNwNeSwSe.__w_, tex, pos.xy, OffsetX = -0.5, OffsetY = 0.5, UseComputedLOD=false
+ tfetch2D lumaNwNeSwSe.___w, tex, pos.xy, OffsetX = 0.5, OffsetY = 0.5, UseComputedLOD=false
+ };
+ #else
+ asm {
+ tfetch2D lumaNwNeSwSe.y___, tex, pos.xy, OffsetX = -0.5, OffsetY = -0.5, UseComputedLOD=false
+ tfetch2D lumaNwNeSwSe._y__, tex, pos.xy, OffsetX = 0.5, OffsetY = -0.5, UseComputedLOD=false
+ tfetch2D lumaNwNeSwSe.__y_, tex, pos.xy, OffsetX = -0.5, OffsetY = 0.5, UseComputedLOD=false
+ tfetch2D lumaNwNeSwSe.___y, tex, pos.xy, OffsetX = 0.5, OffsetY = 0.5, UseComputedLOD=false
+ };
+ #endif
+/*--------------------------------------------------------------------------*/
+ lumaNwNeSwSe.y += 1.0/384.0;
+ float2 lumaMinTemp = min(lumaNwNeSwSe.xy, lumaNwNeSwSe.zw);
+ float2 lumaMaxTemp = max(lumaNwNeSwSe.xy, lumaNwNeSwSe.zw);
+ float lumaMin = min(lumaMinTemp.x, lumaMinTemp.y);
+ float lumaMax = max(lumaMaxTemp.x, lumaMaxTemp.y);
+/*--------------------------------------------------------------------------*/
+ float4 rgbyM = tex2Dlod(tex, float4(pos.xy, 0.0, 0.0));
+ #if (FXAA_GREEN_AS_LUMA == 0)
+ float lumaMinM = min(lumaMin, rgbyM.w);
+ float lumaMaxM = max(lumaMax, rgbyM.w);
+ #else
+ float lumaMinM = min(lumaMin, rgbyM.y);
+ float lumaMaxM = max(lumaMax, rgbyM.y);
+ #endif
+ if((lumaMaxM - lumaMinM) < max(fxaaConsoleEdgeThresholdMin, lumaMax * fxaaConsoleEdgeThreshold)) return rgbyM;
+/*--------------------------------------------------------------------------*/
+ float2 dir;
+ dir.x = dot(lumaNwNeSwSe, fxaaConsole360ConstDir.yyxx);
+ dir.y = dot(lumaNwNeSwSe, fxaaConsole360ConstDir.xyxy);
+ dir = normalize(dir);
+/*--------------------------------------------------------------------------*/
+ float4 dir1 = dir.xyxy * fxaaConsoleRcpFrameOpt.xyzw;
+/*--------------------------------------------------------------------------*/
+ float4 dir2;
+ float dirAbsMinTimesC = min(abs(dir.x), abs(dir.y)) * fxaaConsoleEdgeSharpness;
+ dir2 = saturate(fxaaConsole360ConstDir.zzww * dir.xyxy / dirAbsMinTimesC + 0.5);
+ dir2 = dir2 * fxaaConsole360RcpFrameOpt2.xyxy + fxaaConsole360RcpFrameOpt2.zwzw;
+/*--------------------------------------------------------------------------*/
+ float4 rgbyN1 = tex2Dlod(fxaaConsole360TexExpBiasNegOne, float4(pos.xy + dir1.xy, 0.0, 0.0));
+ float4 rgbyP1 = tex2Dlod(fxaaConsole360TexExpBiasNegOne, float4(pos.xy + dir1.zw, 0.0, 0.0));
+ float4 rgbyN2 = tex2Dlod(fxaaConsole360TexExpBiasNegTwo, float4(pos.xy + dir2.xy, 0.0, 0.0));
+ float4 rgbyP2 = tex2Dlod(fxaaConsole360TexExpBiasNegTwo, float4(pos.xy + dir2.zw, 0.0, 0.0));
+/*--------------------------------------------------------------------------*/
+ float4 rgbyA = rgbyN1 + rgbyP1;
+ float4 rgbyB = rgbyN2 + rgbyP2 * 0.5 + rgbyA;
+/*--------------------------------------------------------------------------*/
+ float4 rgbyR = ((rgbyB.w - lumaMax) > 0.0) ? rgbyA : rgbyB;
+ rgbyR = ((rgbyB.w - lumaMin) > 0.0) ? rgbyR : rgbyA;
+ return rgbyR; }
+/*==========================================================================*/
+#endif
+
+
+
+/*============================================================================
+
+ FXAA3 CONSOLE - OPTIMIZED PS3 PIXEL SHADER (NO EARLY EXIT)
+
+==============================================================================
+The code below does not exactly match the assembly.
+I have a feeling that 12 cycles is possible, but was not able to get there.
+Might have to increase register count to get full performance.
+Note this shader does not use perspective interpolation.
+
+Use the following cgc options,
+
+ --fenable-bx2 --fastmath --fastprecision --nofloatbindings
+
+------------------------------------------------------------------------------
+ NVSHADERPERF OUTPUT
+------------------------------------------------------------------------------
+For reference and to aid in debug, output of NVShaderPerf should match this,
+
+Shader to schedule:
+ 0: texpkb h0.w(TRUE), v5.zyxx, #0
+ 2: addh h2.z(TRUE), h0.w, constant(0.001953, 0.000000, 0.000000, 0.000000).x
+ 4: texpkb h0.w(TRUE), v5.xwxx, #0
+ 6: addh h0.z(TRUE), -h2, h0.w
+ 7: texpkb h1.w(TRUE), v5, #0
+ 9: addh h0.x(TRUE), h0.z, -h1.w
+ 10: addh h3.w(TRUE), h0.z, h1
+ 11: texpkb h2.w(TRUE), v5.zwzz, #0
+ 13: addh h0.z(TRUE), h3.w, -h2.w
+ 14: addh h0.x(TRUE), h2.w, h0
+ 15: nrmh h1.xz(TRUE), h0_n
+ 16: minh_m8 h0.x(TRUE), |h1|, |h1.z|
+ 17: maxh h4.w(TRUE), h0, h1
+ 18: divx h2.xy(TRUE), h1_n.xzzw, h0_n
+ 19: movr r1.zw(TRUE), v4.xxxy
+ 20: madr r2.xz(TRUE), -h1, constant(cConst5.x, cConst5.y, cConst5.z, cConst5.w).zzww, r1.zzww
+ 22: minh h5.w(TRUE), h0, h1
+ 23: texpkb h0(TRUE), r2.xzxx, #0
+ 25: madr r0.zw(TRUE), h1.xzxz, constant(cConst5.x, cConst5.y, cConst5.z, cConst5.w), r1
+ 27: maxh h4.x(TRUE), h2.z, h2.w
+ 28: texpkb h1(TRUE), r0.zwzz, #0
+ 30: addh_d2 h1(TRUE), h0, h1
+ 31: madr r0.xy(TRUE), -h2, constant(cConst5.x, cConst5.y, cConst5.z, cConst5.w).xyxx, r1.zwzz
+ 33: texpkb h0(TRUE), r0, #0
+ 35: minh h4.z(TRUE), h2, h2.w
+ 36: fenct TRUE
+ 37: madr r1.xy(TRUE), h2, constant(cConst5.x, cConst5.y, cConst5.z, cConst5.w).xyxx, r1.zwzz
+ 39: texpkb h2(TRUE), r1, #0
+ 41: addh_d2 h0(TRUE), h0, h2
+ 42: maxh h2.w(TRUE), h4, h4.x
+ 43: minh h2.x(TRUE), h5.w, h4.z
+ 44: addh_d2 h0(TRUE), h0, h1
+ 45: slth h2.x(TRUE), h0.w, h2
+ 46: sgth h2.w(TRUE), h0, h2
+ 47: movh h0(TRUE), h0
+ 48: addx.c0 rc(TRUE), h2, h2.w
+ 49: movh h0(c0.NE.x), h1
+
+IPU0 ------ Simplified schedule: --------
+Pass | Unit | uOp | PC: Op
+-----+--------+------+-------------------------
+ 1 | SCT0/1 | mov | 0: TXLr h0.w, g[TEX1].zyxx, const.xxxx, TEX0;
+ | TEX | txl | 0: TXLr h0.w, g[TEX1].zyxx, const.xxxx, TEX0;
+ | SCB1 | add | 2: ADDh h2.z, h0.--w-, const.--x-;
+ | | |
+ 2 | SCT0/1 | mov | 4: TXLr h0.w, g[TEX1].xwxx, const.xxxx, TEX0;
+ | TEX | txl | 4: TXLr h0.w, g[TEX1].xwxx, const.xxxx, TEX0;
+ | SCB1 | add | 6: ADDh h0.z,-h2, h0.--w-;
+ | | |
+ 3 | SCT0/1 | mov | 7: TXLr h1.w, g[TEX1], const.xxxx, TEX0;
+ | TEX | txl | 7: TXLr h1.w, g[TEX1], const.xxxx, TEX0;
+ | SCB0 | add | 9: ADDh h0.x, h0.z---,-h1.w---;
+ | SCB1 | add | 10: ADDh h3.w, h0.---z, h1;
+ | | |
+ 4 | SCT0/1 | mov | 11: TXLr h2.w, g[TEX1].zwzz, const.xxxx, TEX0;
+ | TEX | txl | 11: TXLr h2.w, g[TEX1].zwzz, const.xxxx, TEX0;
+ | SCB0 | add | 14: ADDh h0.x, h2.w---, h0;
+ | SCB1 | add | 13: ADDh h0.z, h3.--w-,-h2.--w-;
+ | | |
+ 5 | SCT1 | mov | 15: NRMh h1.xz, h0;
+ | SRB | nrm | 15: NRMh h1.xz, h0;
+ | SCB0 | min | 16: MINh*8 h0.x, |h1|, |h1.z---|;
+ | SCB1 | max | 17: MAXh h4.w, h0, h1;
+ | | |
+ 6 | SCT0 | div | 18: DIVx h2.xy, h1.xz--, h0;
+ | SCT1 | mov | 19: MOVr r1.zw, g[TEX0].--xy;
+ | SCB0 | mad | 20: MADr r2.xz,-h1, const.z-w-, r1.z-w-;
+ | SCB1 | min | 22: MINh h5.w, h0, h1;
+ | | |
+ 7 | SCT0/1 | mov | 23: TXLr h0, r2.xzxx, const.xxxx, TEX0;
+ | TEX | txl | 23: TXLr h0, r2.xzxx, const.xxxx, TEX0;
+ | SCB0 | max | 27: MAXh h4.x, h2.z---, h2.w---;
+ | SCB1 | mad | 25: MADr r0.zw, h1.--xz, const, r1;
+ | | |
+ 8 | SCT0/1 | mov | 28: TXLr h1, r0.zwzz, const.xxxx, TEX0;
+ | TEX | txl | 28: TXLr h1, r0.zwzz, const.xxxx, TEX0;
+ | SCB0/1 | add | 30: ADDh/2 h1, h0, h1;
+ | | |
+ 9 | SCT0 | mad | 31: MADr r0.xy,-h2, const.xy--, r1.zw--;
+ | SCT1 | mov | 33: TXLr h0, r0, const.zzzz, TEX0;
+ | TEX | txl | 33: TXLr h0, r0, const.zzzz, TEX0;
+ | SCB1 | min | 35: MINh h4.z, h2, h2.--w-;
+ | | |
+ 10 | SCT0 | mad | 37: MADr r1.xy, h2, const.xy--, r1.zw--;
+ | SCT1 | mov | 39: TXLr h2, r1, const.zzzz, TEX0;
+ | TEX | txl | 39: TXLr h2, r1, const.zzzz, TEX0;
+ | SCB0/1 | add | 41: ADDh/2 h0, h0, h2;
+ | | |
+ 11 | SCT0 | min | 43: MINh h2.x, h5.w---, h4.z---;
+ | SCT1 | max | 42: MAXh h2.w, h4, h4.---x;
+ | SCB0/1 | add | 44: ADDh/2 h0, h0, h1;
+ | | |
+ 12 | SCT0 | set | 45: SLTh h2.x, h0.w---, h2;
+ | SCT1 | set | 46: SGTh h2.w, h0, h2;
+ | SCB0/1 | mul | 47: MOVh h0, h0;
+ | | |
+ 13 | SCT0 | mad | 48: ADDxc0_s rc, h2, h2.w---;
+ | SCB0/1 | mul | 49: MOVh h0(NE0.xxxx), h1;
+
+Pass SCT TEX SCB
+ 1: 0% 100% 25%
+ 2: 0% 100% 25%
+ 3: 0% 100% 50%
+ 4: 0% 100% 50%
+ 5: 0% 0% 50%
+ 6: 100% 0% 75%
+ 7: 0% 100% 75%
+ 8: 0% 100% 100%
+ 9: 0% 100% 25%
+ 10: 0% 100% 100%
+ 11: 50% 0% 100%
+ 12: 50% 0% 100%
+ 13: 25% 0% 100%
+
+MEAN: 17% 61% 67%
+
+Pass SCT0 SCT1 TEX SCB0 SCB1
+ 1: 0% 0% 100% 0% 100%
+ 2: 0% 0% 100% 0% 100%
+ 3: 0% 0% 100% 100% 100%
+ 4: 0% 0% 100% 100% 100%
+ 5: 0% 0% 0% 100% 100%
+ 6: 100% 100% 0% 100% 100%
+ 7: 0% 0% 100% 100% 100%
+ 8: 0% 0% 100% 100% 100%
+ 9: 0% 0% 100% 0% 100%
+ 10: 0% 0% 100% 100% 100%
+ 11: 100% 100% 0% 100% 100%
+ 12: 100% 100% 0% 100% 100%
+ 13: 100% 0% 0% 100% 100%
+
+MEAN: 30% 23% 61% 76% 100%
+Fragment Performance Setup: Driver RSX Compiler, GPU RSX, Flags 0x5
+Results 13 cycles, 3 r regs, 923,076,923 pixels/s
+============================================================================*/
+#if (FXAA_PS3 == 1) && (FXAA_EARLY_EXIT == 0)
+/*--------------------------------------------------------------------------*/
+#pragma regcount 7
+#pragma disablepc all
+#pragma option O3
+#pragma option OutColorPrec=fp16
+#pragma texformat default RGBA8
+/*==========================================================================*/
+half4 FxaaPixelShader(
+ // See FXAA Quality FxaaPixelShader() source for docs on Inputs!
+ FxaaFloat2 pos,
+ FxaaFloat4 fxaaConsolePosPos,
+ FxaaTex tex,
+ FxaaTex fxaaConsole360TexExpBiasNegOne,
+ FxaaTex fxaaConsole360TexExpBiasNegTwo,
+ FxaaFloat2 fxaaQualityRcpFrame,
+ FxaaFloat4 fxaaConsoleRcpFrameOpt,
+ FxaaFloat4 fxaaConsoleRcpFrameOpt2,
+ FxaaFloat4 fxaaConsole360RcpFrameOpt2,
+ FxaaFloat fxaaQualitySubpix,
+ FxaaFloat fxaaQualityEdgeThreshold,
+ FxaaFloat fxaaQualityEdgeThresholdMin,
+ FxaaFloat fxaaConsoleEdgeSharpness,
+ FxaaFloat fxaaConsoleEdgeThreshold,
+ FxaaFloat fxaaConsoleEdgeThresholdMin,
+ FxaaFloat4 fxaaConsole360ConstDir
+) {
+/*--------------------------------------------------------------------------*/
+// (1)
+ half4 dir;
+ half4 lumaNe = h4tex2Dlod(tex, half4(fxaaConsolePosPos.zy, 0, 0));
+ #if (FXAA_GREEN_AS_LUMA == 0)
+ lumaNe.w += half(1.0/512.0);
+ dir.x = -lumaNe.w;
+ dir.z = -lumaNe.w;
+ #else
+ lumaNe.y += half(1.0/512.0);
+ dir.x = -lumaNe.y;
+ dir.z = -lumaNe.y;
+ #endif
+/*--------------------------------------------------------------------------*/
+// (2)
+ half4 lumaSw = h4tex2Dlod(tex, half4(fxaaConsolePosPos.xw, 0, 0));
+ #if (FXAA_GREEN_AS_LUMA == 0)
+ dir.x += lumaSw.w;
+ dir.z += lumaSw.w;
+ #else
+ dir.x += lumaSw.y;
+ dir.z += lumaSw.y;
+ #endif
+/*--------------------------------------------------------------------------*/
+// (3)
+ half4 lumaNw = h4tex2Dlod(tex, half4(fxaaConsolePosPos.xy, 0, 0));
+ #if (FXAA_GREEN_AS_LUMA == 0)
+ dir.x -= lumaNw.w;
+ dir.z += lumaNw.w;
+ #else
+ dir.x -= lumaNw.y;
+ dir.z += lumaNw.y;
+ #endif
+/*--------------------------------------------------------------------------*/
+// (4)
+ half4 lumaSe = h4tex2Dlod(tex, half4(fxaaConsolePosPos.zw, 0, 0));
+ #if (FXAA_GREEN_AS_LUMA == 0)
+ dir.x += lumaSe.w;
+ dir.z -= lumaSe.w;
+ #else
+ dir.x += lumaSe.y;
+ dir.z -= lumaSe.y;
+ #endif
+/*--------------------------------------------------------------------------*/
+// (5)
+ half4 dir1_pos;
+ dir1_pos.xy = normalize(dir.xyz).xz;
+ half dirAbsMinTimesC = min(abs(dir1_pos.x), abs(dir1_pos.y)) * half(FXAA_CONSOLE__PS3_EDGE_SHARPNESS);
+/*--------------------------------------------------------------------------*/
+// (6)
+ half4 dir2_pos;
+ dir2_pos.xy = clamp(dir1_pos.xy / dirAbsMinTimesC, half(-2.0), half(2.0));
+ dir1_pos.zw = pos.xy;
+ dir2_pos.zw = pos.xy;
+ half4 temp1N;
+ temp1N.xy = dir1_pos.zw - dir1_pos.xy * fxaaConsoleRcpFrameOpt.zw;
+/*--------------------------------------------------------------------------*/
+// (7)
+ temp1N = h4tex2Dlod(tex, half4(temp1N.xy, 0.0, 0.0));
+ half4 rgby1;
+ rgby1.xy = dir1_pos.zw + dir1_pos.xy * fxaaConsoleRcpFrameOpt.zw;
+/*--------------------------------------------------------------------------*/
+// (8)
+ rgby1 = h4tex2Dlod(tex, half4(rgby1.xy, 0.0, 0.0));
+ rgby1 = (temp1N + rgby1) * 0.5;
+/*--------------------------------------------------------------------------*/
+// (9)
+ half4 temp2N;
+ temp2N.xy = dir2_pos.zw - dir2_pos.xy * fxaaConsoleRcpFrameOpt2.zw;
+ temp2N = h4tex2Dlod(tex, half4(temp2N.xy, 0.0, 0.0));
+/*--------------------------------------------------------------------------*/
+// (10)
+ half4 rgby2;
+ rgby2.xy = dir2_pos.zw + dir2_pos.xy * fxaaConsoleRcpFrameOpt2.zw;
+ rgby2 = h4tex2Dlod(tex, half4(rgby2.xy, 0.0, 0.0));
+ rgby2 = (temp2N + rgby2) * 0.5;
+/*--------------------------------------------------------------------------*/
+// (11)
+ // compilier moves these scalar ops up to other cycles
+ #if (FXAA_GREEN_AS_LUMA == 0)
+ half lumaMin = min(min(lumaNw.w, lumaSw.w), min(lumaNe.w, lumaSe.w));
+ half lumaMax = max(max(lumaNw.w, lumaSw.w), max(lumaNe.w, lumaSe.w));
+ #else
+ half lumaMin = min(min(lumaNw.y, lumaSw.y), min(lumaNe.y, lumaSe.y));
+ half lumaMax = max(max(lumaNw.y, lumaSw.y), max(lumaNe.y, lumaSe.y));
+ #endif
+ rgby2 = (rgby2 + rgby1) * 0.5;
+/*--------------------------------------------------------------------------*/
+// (12)
+ #if (FXAA_GREEN_AS_LUMA == 0)
+ bool twoTapLt = rgby2.w < lumaMin;
+ bool twoTapGt = rgby2.w > lumaMax;
+ #else
+ bool twoTapLt = rgby2.y < lumaMin;
+ bool twoTapGt = rgby2.y > lumaMax;
+ #endif
+/*--------------------------------------------------------------------------*/
+// (13)
+ if(twoTapLt || twoTapGt) rgby2 = rgby1;
+/*--------------------------------------------------------------------------*/
+ return rgby2; }
+/*==========================================================================*/
+#endif
+
+
+
+/*============================================================================
+
+ FXAA3 CONSOLE - OPTIMIZED PS3 PIXEL SHADER (WITH EARLY EXIT)
+
+==============================================================================
+The code mostly matches the assembly.
+I have a feeling that 14 cycles is possible, but was not able to get there.
+Might have to increase register count to get full performance.
+Note this shader does not use perspective interpolation.
+
+Use the following cgc options,
+
+ --fenable-bx2 --fastmath --fastprecision --nofloatbindings
+
+Use of FXAA_GREEN_AS_LUMA currently adds a cycle (16 clks).
+Will look at fixing this for FXAA 3.12.
+------------------------------------------------------------------------------
+ NVSHADERPERF OUTPUT
+------------------------------------------------------------------------------
+For reference and to aid in debug, output of NVShaderPerf should match this,
+
+Shader to schedule:
+ 0: texpkb h0.w(TRUE), v5.zyxx, #0
+ 2: addh h2.y(TRUE), h0.w, constant(0.001953, 0.000000, 0.000000, 0.000000).x
+ 4: texpkb h1.w(TRUE), v5.xwxx, #0
+ 6: addh h0.x(TRUE), h1.w, -h2.y
+ 7: texpkb h2.w(TRUE), v5.zwzz, #0
+ 9: minh h4.w(TRUE), h2.y, h2
+ 10: maxh h5.x(TRUE), h2.y, h2.w
+ 11: texpkb h0.w(TRUE), v5, #0
+ 13: addh h3.w(TRUE), -h0, h0.x
+ 14: addh h0.x(TRUE), h0.w, h0
+ 15: addh h0.z(TRUE), -h2.w, h0.x
+ 16: addh h0.x(TRUE), h2.w, h3.w
+ 17: minh h5.y(TRUE), h0.w, h1.w
+ 18: nrmh h2.xz(TRUE), h0_n
+ 19: minh_m8 h2.w(TRUE), |h2.x|, |h2.z|
+ 20: divx h4.xy(TRUE), h2_n.xzzw, h2_n.w
+ 21: movr r1.zw(TRUE), v4.xxxy
+ 22: maxh h2.w(TRUE), h0, h1
+ 23: fenct TRUE
+ 24: madr r0.xy(TRUE), -h2.xzzw, constant(cConst5.x, cConst5.y, cConst5.z, cConst5.w).zwzz, r1.zwzz
+ 26: texpkb h0(TRUE), r0, #0
+ 28: maxh h5.x(TRUE), h2.w, h5
+ 29: minh h5.w(TRUE), h5.y, h4
+ 30: madr r1.xy(TRUE), h2.xzzw, constant(cConst5.x, cConst5.y, cConst5.z, cConst5.w).zwzz, r1.zwzz
+ 32: texpkb h2(TRUE), r1, #0
+ 34: addh_d2 h2(TRUE), h0, h2
+ 35: texpkb h1(TRUE), v4, #0
+ 37: maxh h5.y(TRUE), h5.x, h1.w
+ 38: minh h4.w(TRUE), h1, h5
+ 39: madr r0.xy(TRUE), -h4, constant(cConst5.x, cConst5.y, cConst5.z, cConst5.w).xyxx, r1.zwzz
+ 41: texpkb h0(TRUE), r0, #0
+ 43: addh_m8 h5.z(TRUE), h5.y, -h4.w
+ 44: madr r2.xy(TRUE), h4, constant(cConst5.x, cConst5.y, cConst5.z, cConst5.w).xyxx, r1.zwzz
+ 46: texpkb h3(TRUE), r2, #0
+ 48: addh_d2 h0(TRUE), h0, h3
+ 49: addh_d2 h3(TRUE), h0, h2
+ 50: movh h0(TRUE), h3
+ 51: slth h3.x(TRUE), h3.w, h5.w
+ 52: sgth h3.w(TRUE), h3, h5.x
+ 53: addx.c0 rc(TRUE), h3.x, h3
+ 54: slth.c0 rc(TRUE), h5.z, h5
+ 55: movh h0(c0.NE.w), h2
+ 56: movh h0(c0.NE.x), h1
+
+IPU0 ------ Simplified schedule: --------
+Pass | Unit | uOp | PC: Op
+-----+--------+------+-------------------------
+ 1 | SCT0/1 | mov | 0: TXLr h0.w, g[TEX1].zyxx, const.xxxx, TEX0;
+ | TEX | txl | 0: TXLr h0.w, g[TEX1].zyxx, const.xxxx, TEX0;
+ | SCB0 | add | 2: ADDh h2.y, h0.-w--, const.-x--;
+ | | |
+ 2 | SCT0/1 | mov | 4: TXLr h1.w, g[TEX1].xwxx, const.xxxx, TEX0;
+ | TEX | txl | 4: TXLr h1.w, g[TEX1].xwxx, const.xxxx, TEX0;
+ | SCB0 | add | 6: ADDh h0.x, h1.w---,-h2.y---;
+ | | |
+ 3 | SCT0/1 | mov | 7: TXLr h2.w, g[TEX1].zwzz, const.xxxx, TEX0;
+ | TEX | txl | 7: TXLr h2.w, g[TEX1].zwzz, const.xxxx, TEX0;
+ | SCB0 | max | 10: MAXh h5.x, h2.y---, h2.w---;
+ | SCB1 | min | 9: MINh h4.w, h2.---y, h2;
+ | | |
+ 4 | SCT0/1 | mov | 11: TXLr h0.w, g[TEX1], const.xxxx, TEX0;
+ | TEX | txl | 11: TXLr h0.w, g[TEX1], const.xxxx, TEX0;
+ | SCB0 | add | 14: ADDh h0.x, h0.w---, h0;
+ | SCB1 | add | 13: ADDh h3.w,-h0, h0.---x;
+ | | |
+ 5 | SCT0 | mad | 16: ADDh h0.x, h2.w---, h3.w---;
+ | SCT1 | mad | 15: ADDh h0.z,-h2.--w-, h0.--x-;
+ | SCB0 | min | 17: MINh h5.y, h0.-w--, h1.-w--;
+ | | |
+ 6 | SCT1 | mov | 18: NRMh h2.xz, h0;
+ | SRB | nrm | 18: NRMh h2.xz, h0;
+ | SCB1 | min | 19: MINh*8 h2.w, |h2.---x|, |h2.---z|;
+ | | |
+ 7 | SCT0 | div | 20: DIVx h4.xy, h2.xz--, h2.ww--;
+ | SCT1 | mov | 21: MOVr r1.zw, g[TEX0].--xy;
+ | SCB1 | max | 22: MAXh h2.w, h0, h1;
+ | | |
+ 8 | SCT0 | mad | 24: MADr r0.xy,-h2.xz--, const.zw--, r1.zw--;
+ | SCT1 | mov | 26: TXLr h0, r0, const.xxxx, TEX0;
+ | TEX | txl | 26: TXLr h0, r0, const.xxxx, TEX0;
+ | SCB0 | max | 28: MAXh h5.x, h2.w---, h5;
+ | SCB1 | min | 29: MINh h5.w, h5.---y, h4;
+ | | |
+ 9 | SCT0 | mad | 30: MADr r1.xy, h2.xz--, const.zw--, r1.zw--;
+ | SCT1 | mov | 32: TXLr h2, r1, const.xxxx, TEX0;
+ | TEX | txl | 32: TXLr h2, r1, const.xxxx, TEX0;
+ | SCB0/1 | add | 34: ADDh/2 h2, h0, h2;
+ | | |
+ 10 | SCT0/1 | mov | 35: TXLr h1, g[TEX0], const.xxxx, TEX0;
+ | TEX | txl | 35: TXLr h1, g[TEX0], const.xxxx, TEX0;
+ | SCB0 | max | 37: MAXh h5.y, h5.-x--, h1.-w--;
+ | SCB1 | min | 38: MINh h4.w, h1, h5;
+ | | |
+ 11 | SCT0 | mad | 39: MADr r0.xy,-h4, const.xy--, r1.zw--;
+ | SCT1 | mov | 41: TXLr h0, r0, const.zzzz, TEX0;
+ | TEX | txl | 41: TXLr h0, r0, const.zzzz, TEX0;
+ | SCB0 | mad | 44: MADr r2.xy, h4, const.xy--, r1.zw--;
+ | SCB1 | add | 43: ADDh*8 h5.z, h5.--y-,-h4.--w-;
+ | | |
+ 12 | SCT0/1 | mov | 46: TXLr h3, r2, const.xxxx, TEX0;
+ | TEX | txl | 46: TXLr h3, r2, const.xxxx, TEX0;
+ | SCB0/1 | add | 48: ADDh/2 h0, h0, h3;
+ | | |
+ 13 | SCT0/1 | mad | 49: ADDh/2 h3, h0, h2;
+ | SCB0/1 | mul | 50: MOVh h0, h3;
+ | | |
+ 14 | SCT0 | set | 51: SLTh h3.x, h3.w---, h5.w---;
+ | SCT1 | set | 52: SGTh h3.w, h3, h5.---x;
+ | SCB0 | set | 54: SLThc0 rc, h5.z---, h5;
+ | SCB1 | add | 53: ADDxc0_s rc, h3.---x, h3;
+ | | |
+ 15 | SCT0/1 | mul | 55: MOVh h0(NE0.wwww), h2;
+ | SCB0/1 | mul | 56: MOVh h0(NE0.xxxx), h1;
+
+Pass SCT TEX SCB
+ 1: 0% 100% 25%
+ 2: 0% 100% 25%
+ 3: 0% 100% 50%
+ 4: 0% 100% 50%
+ 5: 50% 0% 25%
+ 6: 0% 0% 25%
+ 7: 100% 0% 25%
+ 8: 0% 100% 50%
+ 9: 0% 100% 100%
+ 10: 0% 100% 50%
+ 11: 0% 100% 75%
+ 12: 0% 100% 100%
+ 13: 100% 0% 100%
+ 14: 50% 0% 50%
+ 15: 100% 0% 100%
+
+MEAN: 26% 60% 56%
+
+Pass SCT0 SCT1 TEX SCB0 SCB1
+ 1: 0% 0% 100% 100% 0%
+ 2: 0% 0% 100% 100% 0%
+ 3: 0% 0% 100% 100% 100%
+ 4: 0% 0% 100% 100% 100%
+ 5: 100% 100% 0% 100% 0%
+ 6: 0% 0% 0% 0% 100%
+ 7: 100% 100% 0% 0% 100%
+ 8: 0% 0% 100% 100% 100%
+ 9: 0% 0% 100% 100% 100%
+ 10: 0% 0% 100% 100% 100%
+ 11: 0% 0% 100% 100% 100%
+ 12: 0% 0% 100% 100% 100%
+ 13: 100% 100% 0% 100% 100%
+ 14: 100% 100% 0% 100% 100%
+ 15: 100% 100% 0% 100% 100%
+
+MEAN: 33% 33% 60% 86% 80%
+Fragment Performance Setup: Driver RSX Compiler, GPU RSX, Flags 0x5
+Results 15 cycles, 3 r regs, 800,000,000 pixels/s
+============================================================================*/
+#if (FXAA_PS3 == 1) && (FXAA_EARLY_EXIT == 1)
+/*--------------------------------------------------------------------------*/
+#pragma regcount 7
+#pragma disablepc all
+#pragma option O2
+#pragma option OutColorPrec=fp16
+#pragma texformat default RGBA8
+/*==========================================================================*/
+half4 FxaaPixelShader(
+ // See FXAA Quality FxaaPixelShader() source for docs on Inputs!
+ FxaaFloat2 pos,
+ FxaaFloat4 fxaaConsolePosPos,
+ FxaaTex tex,
+ FxaaTex fxaaConsole360TexExpBiasNegOne,
+ FxaaTex fxaaConsole360TexExpBiasNegTwo,
+ FxaaFloat2 fxaaQualityRcpFrame,
+ FxaaFloat4 fxaaConsoleRcpFrameOpt,
+ FxaaFloat4 fxaaConsoleRcpFrameOpt2,
+ FxaaFloat4 fxaaConsole360RcpFrameOpt2,
+ FxaaFloat fxaaQualitySubpix,
+ FxaaFloat fxaaQualityEdgeThreshold,
+ FxaaFloat fxaaQualityEdgeThresholdMin,
+ FxaaFloat fxaaConsoleEdgeSharpness,
+ FxaaFloat fxaaConsoleEdgeThreshold,
+ FxaaFloat fxaaConsoleEdgeThresholdMin,
+ FxaaFloat4 fxaaConsole360ConstDir
+) {
+/*--------------------------------------------------------------------------*/
+// (1)
+ half4 rgbyNe = h4tex2Dlod(tex, half4(fxaaConsolePosPos.zy, 0, 0));
+ #if (FXAA_GREEN_AS_LUMA == 0)
+ half lumaNe = rgbyNe.w + half(1.0/512.0);
+ #else
+ half lumaNe = rgbyNe.y + half(1.0/512.0);
+ #endif
+/*--------------------------------------------------------------------------*/
+// (2)
+ half4 lumaSw = h4tex2Dlod(tex, half4(fxaaConsolePosPos.xw, 0, 0));
+ #if (FXAA_GREEN_AS_LUMA == 0)
+ half lumaSwNegNe = lumaSw.w - lumaNe;
+ #else
+ half lumaSwNegNe = lumaSw.y - lumaNe;
+ #endif
+/*--------------------------------------------------------------------------*/
+// (3)
+ half4 lumaNw = h4tex2Dlod(tex, half4(fxaaConsolePosPos.xy, 0, 0));
+ #if (FXAA_GREEN_AS_LUMA == 0)
+ half lumaMaxNwSw = max(lumaNw.w, lumaSw.w);
+ half lumaMinNwSw = min(lumaNw.w, lumaSw.w);
+ #else
+ half lumaMaxNwSw = max(lumaNw.y, lumaSw.y);
+ half lumaMinNwSw = min(lumaNw.y, lumaSw.y);
+ #endif
+/*--------------------------------------------------------------------------*/
+// (4)
+ half4 lumaSe = h4tex2Dlod(tex, half4(fxaaConsolePosPos.zw, 0, 0));
+ #if (FXAA_GREEN_AS_LUMA == 0)
+ half dirZ = lumaNw.w + lumaSwNegNe;
+ half dirX = -lumaNw.w + lumaSwNegNe;
+ #else
+ half dirZ = lumaNw.y + lumaSwNegNe;
+ half dirX = -lumaNw.y + lumaSwNegNe;
+ #endif
+/*--------------------------------------------------------------------------*/
+// (5)
+ half3 dir;
+ dir.y = 0.0;
+ #if (FXAA_GREEN_AS_LUMA == 0)
+ dir.x = lumaSe.w + dirX;
+ dir.z = -lumaSe.w + dirZ;
+ half lumaMinNeSe = min(lumaNe, lumaSe.w);
+ #else
+ dir.x = lumaSe.y + dirX;
+ dir.z = -lumaSe.y + dirZ;
+ half lumaMinNeSe = min(lumaNe, lumaSe.y);
+ #endif
+/*--------------------------------------------------------------------------*/
+// (6)
+ half4 dir1_pos;
+ dir1_pos.xy = normalize(dir).xz;
+ half dirAbsMinTimes8 = min(abs(dir1_pos.x), abs(dir1_pos.y)) * half(FXAA_CONSOLE__PS3_EDGE_SHARPNESS);
+/*--------------------------------------------------------------------------*/
+// (7)
+ half4 dir2_pos;
+ dir2_pos.xy = clamp(dir1_pos.xy / dirAbsMinTimes8, half(-2.0), half(2.0));
+ dir1_pos.zw = pos.xy;
+ dir2_pos.zw = pos.xy;
+ #if (FXAA_GREEN_AS_LUMA == 0)
+ half lumaMaxNeSe = max(lumaNe, lumaSe.w);
+ #else
+ half lumaMaxNeSe = max(lumaNe, lumaSe.y);
+ #endif
+/*--------------------------------------------------------------------------*/
+// (8)
+ half4 temp1N;
+ temp1N.xy = dir1_pos.zw - dir1_pos.xy * fxaaConsoleRcpFrameOpt.zw;
+ temp1N = h4tex2Dlod(tex, half4(temp1N.xy, 0.0, 0.0));
+ half lumaMax = max(lumaMaxNwSw, lumaMaxNeSe);
+ half lumaMin = min(lumaMinNwSw, lumaMinNeSe);
+/*--------------------------------------------------------------------------*/
+// (9)
+ half4 rgby1;
+ rgby1.xy = dir1_pos.zw + dir1_pos.xy * fxaaConsoleRcpFrameOpt.zw;
+ rgby1 = h4tex2Dlod(tex, half4(rgby1.xy, 0.0, 0.0));
+ rgby1 = (temp1N + rgby1) * 0.5;
+/*--------------------------------------------------------------------------*/
+// (10)
+ half4 rgbyM = h4tex2Dlod(tex, half4(pos.xy, 0.0, 0.0));
+ #if (FXAA_GREEN_AS_LUMA == 0)
+ half lumaMaxM = max(lumaMax, rgbyM.w);
+ half lumaMinM = min(lumaMin, rgbyM.w);
+ #else
+ half lumaMaxM = max(lumaMax, rgbyM.y);
+ half lumaMinM = min(lumaMin, rgbyM.y);
+ #endif
+/*--------------------------------------------------------------------------*/
+// (11)
+ half4 temp2N;
+ temp2N.xy = dir2_pos.zw - dir2_pos.xy * fxaaConsoleRcpFrameOpt2.zw;
+ temp2N = h4tex2Dlod(tex, half4(temp2N.xy, 0.0, 0.0));
+ half4 rgby2;
+ rgby2.xy = dir2_pos.zw + dir2_pos.xy * fxaaConsoleRcpFrameOpt2.zw;
+ half lumaRangeM = (lumaMaxM - lumaMinM) / FXAA_CONSOLE__PS3_EDGE_THRESHOLD;
+/*--------------------------------------------------------------------------*/
+// (12)
+ rgby2 = h4tex2Dlod(tex, half4(rgby2.xy, 0.0, 0.0));
+ rgby2 = (temp2N + rgby2) * 0.5;
+/*--------------------------------------------------------------------------*/
+// (13)
+ rgby2 = (rgby2 + rgby1) * 0.5;
+/*--------------------------------------------------------------------------*/
+// (14)
+ #if (FXAA_GREEN_AS_LUMA == 0)
+ bool twoTapLt = rgby2.w < lumaMin;
+ bool twoTapGt = rgby2.w > lumaMax;
+ #else
+ bool twoTapLt = rgby2.y < lumaMin;
+ bool twoTapGt = rgby2.y > lumaMax;
+ #endif
+ bool earlyExit = lumaRangeM < lumaMax;
+ bool twoTap = twoTapLt || twoTapGt;
+/*--------------------------------------------------------------------------*/
+// (15)
+ if(twoTap) rgby2 = rgby1;
+ if(earlyExit) rgby2 = rgbyM;
+/*--------------------------------------------------------------------------*/
+ return rgby2; }
+/*==========================================================================*/
+#endif
+
+uniform sampler2D diffuseMap;
+
+uniform vec2 rcp_screen_res;
+uniform vec4 rcp_frame_opt;
+uniform vec4 rcp_frame_opt2;
+uniform vec2 screen_res;
+VARYING vec2 vary_fragcoord;
+VARYING vec2 vary_tc;
+
+void main()
+{
+ vec4 diff = FxaaPixelShader(vary_tc, //pos
+ vec4(vary_fragcoord.xy, 0, 0), //fxaaConsolePosPos
+ diffuseMap, //tex
+ diffuseMap,
+ diffuseMap,
+ rcp_screen_res, //fxaaQualityRcpFrame
+ vec4(0,0,0,0), //fxaaConsoleRcpFrameOpt
+ rcp_frame_opt, //fxaaConsoleRcpFrameOpt2
+ rcp_frame_opt2, //fxaaConsole360RcpFrameOpt2
+ 0.75, //fxaaQualitySubpix
+ 0.07, //fxaaQualityEdgeThreshold
+ 0.03, //fxaaQualityEdgeThresholdMin
+ 8.0, //fxaaConsoleEdgeSharpness
+ 0.125, //fxaaConsoleEdgeThreshold
+ 0.05, //fxaaConsoleEdgeThresholdMin
+ vec4(0,0,0,0)); //fxaaConsole360ConstDir
+
+
+
+ //diff = texture2D(diffuseMap, vary_tc);
+
+ gl_FragColor = diff;
+
+}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/giF.glsl b/indra/newview/app_settings/shaders/class1/deferred/giF.glsl
index bfb7760af8..29ca80ae92 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/giF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/giF.glsl
@@ -23,10 +23,12 @@
* $/LicenseInfo$
*/
-
-
#extension GL_ARB_texture_rectangle : enable
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 gl_FragColor;
+#endif
+
uniform sampler2DRect depthMap;
uniform sampler2DRect normalMap;
uniform sampler2D noiseMap;
@@ -38,7 +40,7 @@ uniform sampler2D depthGIMap;
uniform sampler2D lightFunc;
// Inputs
-varying vec2 vary_fragcoord;
+VARYING vec2 vary_fragcoord;
uniform vec2 screen_res;
@@ -182,5 +184,5 @@ void main()
vec3 norm = texture2DRect(normalMap, pos_screen).xyz;
norm = vec3((norm.xy-0.5)*2.0,norm.z); // unpack norm
- gl_FragData[0].xyz = giAmbient(pos, norm);
+ gl_FragColor.xyz = giAmbient(pos, norm);
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/giV.glsl b/indra/newview/app_settings/shaders/class1/deferred/giV.glsl
index 190e32b6a3..e5d3bb8ea6 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/giV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/giV.glsl
@@ -22,21 +22,27 @@
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
-
+uniform mat4 modelview_projection_matrix;
-varying vec2 vary_fragcoord;
+ATTRIBUTE vec3 position;
+ATTRIBUTE vec4 diffuse_color;
+ATTRIBUTE vec2 texcoord0;
+
+VARYING vec4 vertex_color;
+VARYING vec2 vary_fragcoord;
uniform vec2 screen_res;
void main()
{
//transform vertex
- gl_Position = ftransform();
- vec4 pos = gl_ModelViewProjectionMatrix * gl_Vertex;
+ vec4 pos = modelview_projection_matrix * vec4(position.xyz, 1.0);
+ gl_Position = pos;
+
vary_fragcoord = (pos.xy * 0.5 + 0.5)*screen_res;
- vec4 tex = gl_MultiTexCoord0;
+ vec4 tex = vec4(texcoord0,0,1);
tex.w = 1.0;
- gl_FrontColor = gl_Color;
+ vertex_color = diffuse_color;
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/impostorF.glsl b/indra/newview/app_settings/shaders/class1/deferred/impostorF.glsl
index 7152e13946..a44173a2a4 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/impostorF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/impostorF.glsl
@@ -22,25 +22,30 @@
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
-
+
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 gl_FragData[3];
+#endif
+
uniform float minimum_alpha;
-uniform float maximum_alpha;
uniform sampler2D diffuseMap;
uniform sampler2D normalMap;
uniform sampler2D specularMap;
+VARYING vec2 vary_texcoord0;
+
void main()
{
- vec4 col = texture2D(diffuseMap, gl_TexCoord[0].xy);
+ vec4 col = texture2D(diffuseMap, vary_texcoord0.xy);
- if (col.a < minimum_alpha || col.a > maximum_alpha)
+ if (col.a < minimum_alpha)
{
discard;
}
gl_FragData[0] = vec4(col.rgb, col.a * 0.005);
- gl_FragData[1] = texture2D(specularMap, gl_TexCoord[0].xy);
- gl_FragData[2] = vec4(texture2D(normalMap, gl_TexCoord[0].xy).xyz, 0.0);
+ gl_FragData[1] = texture2D(specularMap, vary_texcoord0.xy);
+ gl_FragData[2] = vec4(texture2D(normalMap, vary_texcoord0.xy).xyz, 0.0);
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/impostorV.glsl b/indra/newview/app_settings/shaders/class1/deferred/impostorV.glsl
index 0cf8c68173..42266e9378 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/impostorV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/impostorV.glsl
@@ -22,14 +22,18 @@
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
-
+uniform mat4 texture_matrix0;
+uniform mat4 modelview_projection_matrix;
+
+ATTRIBUTE vec3 position;
+ATTRIBUTE vec2 texcoord0;
+
+VARYING vec2 vary_texcoord0;
void main()
{
//transform vertex
- gl_Position = ftransform();
- gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
-
- gl_FrontColor = gl_Color;
+ gl_Position = modelview_projection_matrix * vec4(position.xyz, 1.0);
+ vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy;
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/luminanceF.glsl b/indra/newview/app_settings/shaders/class1/deferred/luminanceF.glsl
index 4ba26fb0c6..e014a14ad8 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/luminanceF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/luminanceF.glsl
@@ -22,12 +22,14 @@
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
-
-
-
+
uniform sampler2DRect diffuseMap;
-varying vec2 vary_fragcoord;
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 gl_FragColor;
+#endif
+
+VARYING vec2 vary_fragcoord;
void main()
{
diff --git a/indra/newview/app_settings/shaders/class1/deferred/luminanceV.glsl b/indra/newview/app_settings/shaders/class1/deferred/luminanceV.glsl
index 9f22175f84..f2dc60aa5d 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/luminanceV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/luminanceV.glsl
@@ -23,19 +23,23 @@
* $/LicenseInfo$
*/
+uniform mat4 modelview_projection_matrix;
+
+ATTRIBUTE vec3 position;
+ATTRIBUTE vec4 diffuse_color;
-
-
-varying vec2 vary_fragcoord;
+VARYING vec2 vary_fragcoord;
+VARYING vec4 vertex_color;
uniform vec2 screen_res;
void main()
{
//transform vertex
- gl_Position = ftransform();
- vec4 pos = gl_ModelViewProjectionMatrix * gl_Vertex;
+ vec4 pos = modelview_projection_matrix * vec4(position.xyz, 1.0);
+ gl_Position = pos;
+
vary_fragcoord = (pos.xy * 0.5 + 0.5)*screen_res;
- gl_FrontColor = gl_Color;
+ vertex_color = diffuse_color;
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/multiPointLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/multiPointLightF.glsl
index 42212a978e..179c721a2f 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/multiPointLightF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/multiPointLightF.glsl
@@ -23,10 +23,12 @@
* $/LicenseInfo$
*/
-
-
#extension GL_ARB_texture_rectangle : enable
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 gl_FragColor;
+#endif
+
uniform sampler2DRect depthMap;
uniform sampler2DRect diffuseRect;
uniform sampler2DRect specularRect;
@@ -45,7 +47,7 @@ uniform int light_count;
uniform vec4 light[MAX_LIGHT_COUNT];
uniform vec4 light_col[MAX_LIGHT_COUNT];
-varying vec4 vary_fragcoord;
+VARYING vec4 vary_fragcoord;
uniform vec2 screen_res;
uniform float far_z;
@@ -124,7 +126,7 @@ void main()
if (sa > 0.0)
{
- sa = texture2D(lightFunc,vec2(sa, spec.a)).a * min(dist_atten*4.0, 1.0);
+ sa = texture2D(lightFunc,vec2(sa, spec.a)).r * min(dist_atten*4.0, 1.0);
sa *= noise;
col += da*sa*light_col[i].rgb*spec.rgb;
}
@@ -141,6 +143,4 @@ void main()
gl_FragColor.rgb = out_col;
gl_FragColor.a = 0.0;
-
- //gl_FragColor = vec4(0.1, 0.025, 0.025/4.0, 0.0);
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/multiPointLightMSF.glsl b/indra/newview/app_settings/shaders/class1/deferred/multiPointLightMSF.glsl
deleted file mode 100644
index 863bac19cf..0000000000
--- a/indra/newview/app_settings/shaders/class1/deferred/multiPointLightMSF.glsl
+++ /dev/null
@@ -1,155 +0,0 @@
-/**
- * @file multiPointLightF.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2007, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-
-
-#extension GL_ARB_texture_rectangle : enable
-#extension GL_ARB_texture_multisample : enable
-
-uniform sampler2DMS depthMap;
-uniform sampler2DMS diffuseRect;
-uniform sampler2DMS specularRect;
-uniform sampler2DMS normalMap;
-uniform sampler2D noiseMap;
-uniform sampler2D lightFunc;
-
-
-uniform vec3 env_mat[3];
-uniform float sun_wash;
-
-uniform int light_count;
-
-#define MAX_LIGHT_COUNT 16
-uniform vec4 light[MAX_LIGHT_COUNT];
-uniform vec4 light_col[MAX_LIGHT_COUNT];
-
-varying vec4 vary_fragcoord;
-uniform vec2 screen_res;
-
-uniform float far_z;
-
-uniform mat4 inv_proj;
-
-vec4 getPosition(ivec2 pos_screen, int sample)
-{
- float depth = texelFetch(depthMap, pos_screen, sample).r;
- vec2 sc = vec2(pos_screen.xy)*2.0;
- sc /= screen_res;
- sc -= vec2(1.0,1.0);
- vec4 ndc = vec4(sc.x, sc.y, 2.0*depth-1.0, 1.0);
- vec4 pos = inv_proj * ndc;
- pos /= pos.w;
- pos.w = 1.0;
- return pos;
-}
-
-void main()
-{
- vec2 frag = (vary_fragcoord.xy*0.5+0.5)*screen_res;
- ivec2 itc = ivec2(frag);
-
- int wght = 0;
- vec3 fcol = vec3(0,0,0);
-
- for (int s = 0; s < samples; ++s)
- {
- vec3 pos = getPosition(itc, s).xyz;
- if (pos.z >= far_z)
- {
- vec3 norm = texelFetch(normalMap, itc, s).xyz;
- norm = vec3((norm.xy-0.5)*2.0,norm.z); // unpack norm
- norm = normalize(norm);
- vec4 spec = texelFetch(specularRect, itc, s);
- vec3 diff = texelFetch(diffuseRect, itc, s).rgb;
- float noise = texture2D(noiseMap, frag.xy/128.0).b;
- vec3 out_col = vec3(0,0,0);
- vec3 npos = normalize(-pos);
-
- // As of OSX 10.6.7 ATI Apple's crash when using a variable size loop
- for (int i = 0; i < MAX_LIGHT_COUNT; ++i)
- {
- bool light_contrib = (i < light_count);
-
- vec3 lv = light[i].xyz-pos;
- float dist2 = dot(lv,lv);
- dist2 /= light[i].w;
- if (dist2 > 1.0)
- {
- light_contrib = false;
- }
-
- float da = dot(norm, lv);
- if (da < 0.0)
- {
- light_contrib = false;
- }
-
- if (light_contrib)
- {
- lv = normalize(lv);
- da = dot(norm, lv);
-
- float fa = light_col[i].a+1.0;
- float dist_atten = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 0.0, 1.0);
- dist_atten *= noise;
-
- float lit = da * dist_atten;
-
- vec3 col = light_col[i].rgb*lit*diff;
- //vec3 col = vec3(dist2, light_col[i].a, lit);
-
- if (spec.a > 0.0)
- {
- //vec3 ref = dot(pos+lv, norm);
-
- float sa = dot(normalize(lv+npos),norm);
-
- if (sa > 0.0)
- {
- sa = texture2D(lightFunc,vec2(sa, spec.a)).a * min(dist_atten*4.0, 1.0);
- sa *= noise;
- col += da*sa*light_col[i].rgb*spec.rgb;
- }
- }
-
- out_col += col;
- }
- }
-
- fcol += out_col;
- ++wght;
- }
- }
-
- if (wght <= 0)
- {
- discard;
- }
-
- gl_FragColor.rgb = fcol/samples;
- gl_FragColor.a = 0.0;
-
-
-}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/multiPointLightV.glsl b/indra/newview/app_settings/shaders/class1/deferred/multiPointLightV.glsl
index 1362a48daf..eefefa640d 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/multiPointLightV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/multiPointLightV.glsl
@@ -23,16 +23,17 @@
* $/LicenseInfo$
*/
+uniform mat4 modelview_projection_matrix;
+ATTRIBUTE vec3 position;
-varying vec4 vary_fragcoord;
+VARYING vec4 vary_fragcoord;
void main()
{
//transform vertex
- vec4 pos = gl_ModelViewProjectionMatrix * gl_Vertex;
+ vec4 pos = modelview_projection_matrix * vec4(position.xyz, 1.0);
vary_fragcoord = pos;
gl_Position = pos;
- gl_FrontColor = gl_Color;
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/multiSpotLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/multiSpotLightF.glsl
index 85b0ce5beb..2196d14895 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/multiSpotLightF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/multiSpotLightF.glsl
@@ -23,7 +23,9 @@
* $/LicenseInfo$
*/
-
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 gl_FragColor;
+#endif
//class 1 -- no shadows
@@ -35,7 +37,6 @@ uniform sampler2DRect depthMap;
uniform sampler2DRect normalMap;
uniform samplerCube environmentMap;
uniform sampler2D noiseMap;
-uniform sampler2D lightFunc;
uniform sampler2D projectionMap;
uniform mat4 proj_mat; //screen space to light space
@@ -55,9 +56,12 @@ uniform float sun_wash;
uniform int proj_shadow_idx;
uniform float shadow_fade;
-varying vec4 vary_light;
+uniform vec3 center;
+uniform vec3 color;
+uniform float falloff;
+uniform float size;
-varying vec4 vary_fragcoord;
+VARYING vec4 vary_fragcoord;
uniform vec2 screen_res;
uniform mat4 inv_proj;
@@ -110,7 +114,7 @@ vec4 texture2DLodAmbient(sampler2D projectionMap, vec2 tc, float lod)
vec4 getPosition(vec2 pos_screen)
{
- float depth = texture2DRect(depthMap, pos_screen.xy).a;
+ float depth = texture2DRect(depthMap, pos_screen.xy).r;
vec2 sc = pos_screen.xy*2.0;
sc /= screen_res;
sc -= vec2(1.0,1.0);
@@ -129,9 +133,9 @@ void main()
frag.xy *= screen_res;
vec3 pos = getPosition(frag.xy).xyz;
- vec3 lv = vary_light.xyz-pos.xyz;
+ vec3 lv = center.xyz-pos.xyz;
float dist2 = dot(lv,lv);
- dist2 /= vary_light.w;
+ dist2 /= size;
if (dist2 > 1.0)
{
discard;
@@ -150,7 +154,7 @@ void main()
proj_tc.xyz /= proj_tc.w;
- float fa = gl_Color.a+1.0;
+ float fa = falloff+1.0;
float dist_atten = min(1.0-(dist2-1.0*(1.0-fa))/fa, 1.0);
if (dist_atten <= 0.0)
{
@@ -182,7 +186,7 @@ void main()
vec4 plcol = texture2DLodDiffuse(projectionMap, proj_tc.xy, lod);
- vec3 lcol = gl_Color.rgb * plcol.rgb * plcol.a;
+ vec3 lcol = color.rgb * plcol.rgb * plcol.a;
lit = da * dist_atten * noise;
@@ -199,7 +203,7 @@ void main()
amb_da = min(amb_da, 1.0-lit);
- col += amb_da*gl_Color.rgb*diff_tex.rgb*amb_plcol.rgb*amb_plcol.a;
+ col += amb_da*color.rgb*diff_tex.rgb*amb_plcol.rgb*amb_plcol.a;
}
@@ -232,7 +236,7 @@ void main()
stc.y > 0.0)
{
vec4 scol = texture2DLodSpecular(projectionMap, stc.xy, proj_lod-spec.a*proj_lod);
- col += dist_atten*scol.rgb*gl_Color.rgb*scol.a*spec.rgb;
+ col += dist_atten*scol.rgb*color.rgb*scol.a*spec.rgb;
}
}
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/multiSpotLightMSF.glsl b/indra/newview/app_settings/shaders/class1/deferred/multiSpotLightMSF.glsl
deleted file mode 100644
index 10285817c2..0000000000
--- a/indra/newview/app_settings/shaders/class1/deferred/multiSpotLightMSF.glsl
+++ /dev/null
@@ -1,250 +0,0 @@
-/**
- * @file multiSpotLightF.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2007, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-
-
-//class 1 -- no shadows
-
-#extension GL_ARB_texture_rectangle : enable
-#extension GL_ARB_texture_multisample : enable
-
-uniform sampler2DMS diffuseRect;
-uniform sampler2DMS specularRect;
-uniform sampler2DMS depthMap;
-uniform sampler2DMS normalMap;
-uniform sampler2D noiseMap;
-uniform sampler2D lightFunc;
-uniform sampler2D projectionMap;
-
-uniform mat4 proj_mat; //screen space to light space
-uniform float proj_near; //near clip for projection
-uniform vec3 proj_p; //plane projection is emitting from (in screen space)
-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 float shadow_fade;
-
-varying vec4 vary_light;
-
-varying vec4 vary_fragcoord;
-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(ivec2 pos_screen, int sample)
-{
- float depth = texelFetch(depthMap, pos_screen, sample).r;
- vec2 sc = vec2(pos_screen.xy)*2.0;
- sc /= screen_res;
- sc -= vec2(1.0,1.0);
- vec4 ndc = vec4(sc.x, sc.y, 2.0*depth-1.0, 1.0);
- vec4 pos = inv_proj * ndc;
- pos /= pos.w;
- pos.w = 1.0;
- return pos;
-}
-
-void main()
-{
- int wght = 0;
-
- vec3 fcol = vec3(0,0,0);
-
- vec2 frag = (vary_fragcoord.xy*0.5+0.5)*screen_res;
-
- ivec2 itc = ivec2(frag.xy);
-
- for (int i = 0; i < samples; ++i)
- {
- vec3 pos = getPosition(itc, i).xyz;
- vec3 lv = vary_light.xyz-pos.xyz;
- float dist2 = dot(lv,lv);
- dist2 /= vary_light.w;
- if (dist2 <= 1.0)
- {
- vec3 norm = texelFetch(normalMap, itc, i).xyz*2.0-1.0;
-
- norm = normalize(norm);
- float l_dist = -dot(lv, proj_n);
-
- vec4 proj_tc = (proj_mat * vec4(pos.xyz, 1.0));
- if (proj_tc.z >= 0.0)
- {
- proj_tc.xyz /= proj_tc.w;
-
- float fa = gl_Color.a+1.0;
- float dist_atten = min(1.0-(dist2-1.0*(1.0-fa))/fa, 1.0);
- if (dist_atten > 0.0)
- {
- lv = proj_origin-pos.xyz;
- lv = normalize(lv);
- float da = dot(norm, lv);
-
- vec3 col = vec3(0,0,0);
-
- vec3 diff_tex = texelFetch(diffuseRect, itc, i).rgb;
-
- float noise = texture2D(noiseMap, frag.xy/128.0).b;
- if (proj_tc.z > 0.0 &&
- proj_tc.x < 1.0 &&
- proj_tc.y < 1.0 &&
- proj_tc.x > 0.0 &&
- 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 = 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);
- 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;
- }
-
-
- vec4 spec = texelFetch(specularRect, itc, i);
- if (spec.a > 0.0)
- {
- vec3 ref = reflect(normalize(pos), norm);
-
- //project from point pos in direction ref to plane proj_p, proj_n
- vec3 pdelta = proj_p-pos;
- float ds = dot(ref, proj_n);
-
- if (ds < 0.0)
- {
- vec3 pfinal = pos + ref * dot(pdelta, proj_n)/ds;
-
- vec4 stc = (proj_mat * vec4(pfinal.xyz, 1.0));
-
- 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 = texture2DLodSpecular(projectionMap, stc.xy, proj_lod-spec.a*proj_lod);
- col += dist_atten*scol.rgb*gl_Color.rgb*scol.a*spec.rgb;
- }
- }
- }
- }
-
- fcol += col;
- ++wght;
- }
- }
- }
- }
-
- if (wght <= 0)
- {
- discard;
- }
-
- gl_FragColor.rgb = fcol/samples;
- gl_FragColor.a = 0.0;
-}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/normgenF.glsl b/indra/newview/app_settings/shaders/class1/deferred/normgenF.glsl
new file mode 100644
index 0000000000..879942d8fa
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/deferred/normgenF.glsl
@@ -0,0 +1,56 @@
+/**
+ * @file normgenF.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#extension GL_ARB_texture_rectangle : enable
+
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 gl_FragColor;
+#endif
+
+uniform sampler2D alphaMap;
+
+VARYING vec2 vary_texcoord0;
+
+uniform float stepX;
+uniform float stepY;
+uniform float norm_scale;
+
+void main()
+{
+ float alpha = texture2D(alphaMap, vary_texcoord0).a;
+
+ vec3 right = vec3(norm_scale, 0, (texture2D(alphaMap, vary_texcoord0+vec2(stepX, 0)).a-alpha)*255);
+ vec3 left = vec3(-norm_scale, 0, (texture2D(alphaMap, vary_texcoord0-vec2(stepX, 0)).a-alpha)*255);
+ vec3 up = vec3(0, -norm_scale, (texture2D(alphaMap, vary_texcoord0-vec2(0, stepY)).a-alpha)*255);
+ vec3 down = vec3(0, norm_scale, (texture2D(alphaMap, vary_texcoord0+vec2(0, stepY)).a-alpha)*255);
+
+ vec3 norm = cross(right, down) + cross(down, left) + cross(left,up) + cross(up, right);
+
+ norm = normalize(norm);
+ norm *= 0.5;
+ norm += 0.5;
+
+ gl_FragColor = vec4(norm, alpha);
+}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/normgenV.glsl b/indra/newview/app_settings/shaders/class1/deferred/normgenV.glsl
new file mode 100644
index 0000000000..9bceae05b7
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/deferred/normgenV.glsl
@@ -0,0 +1,36 @@
+/**
+ * @file normgenV.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+ATTRIBUTE vec3 position;
+ATTRIBUTE vec2 texcoord0;
+
+VARYING vec2 vary_fragcoord;
+VARYING vec2 vary_texcoord0;
+
+void main()
+{
+ gl_Position = vec4(position.x*2.0-1.0, position.y*2.0-1.0, -1.0, 1.0);
+ vary_texcoord0 = texcoord0;
+}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/pointLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/pointLightF.glsl
index 0771f9b91a..b673d00d6e 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/pointLightF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/pointLightF.glsl
@@ -23,10 +23,12 @@
* $/LicenseInfo$
*/
-
-
#extension GL_ARB_texture_rectangle : enable
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 gl_FragColor;
+#endif
+
uniform sampler2DRect diffuseRect;
uniform sampler2DRect specularRect;
uniform sampler2DRect normalMap;
@@ -38,9 +40,12 @@ uniform sampler2DRect depthMap;
uniform vec3 env_mat[3];
uniform float sun_wash;
-varying vec4 vary_light;
+uniform vec3 center;
+uniform vec3 color;
+uniform float falloff;
+uniform float size;
-varying vec4 vary_fragcoord;
+VARYING vec4 vary_fragcoord;
uniform vec2 screen_res;
uniform mat4 inv_proj;
@@ -67,9 +72,9 @@ void main()
frag.xy *= screen_res;
vec3 pos = getPosition(frag.xy).xyz;
- vec3 lv = vary_light.xyz-pos;
+ vec3 lv = center.xyz-pos;
float dist2 = dot(lv,lv);
- dist2 /= vary_light.w;
+ dist2 /= size;
if (dist2 > 1.0)
{
discard;
@@ -90,11 +95,11 @@ void main()
float noise = texture2D(noiseMap, frag.xy/128.0).b;
vec3 col = texture2DRect(diffuseRect, frag.xy).rgb;
- float fa = gl_Color.a+1.0;
+ float fa = falloff+1.0;
float dist_atten = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 0.0, 1.0);
float lit = da * dist_atten * noise;
- col = gl_Color.rgb*lit*col;
+ col = color.rgb*lit*col;
vec4 spec = texture2DRect(specularRect, frag.xy);
if (spec.a > 0.0)
@@ -102,9 +107,9 @@ void main()
float sa = dot(normalize(lv-normalize(pos)),norm);
if (sa > 0.0)
{
- sa = texture2D(lightFunc, vec2(sa, spec.a)).a * min(dist_atten*4.0, 1.0);
+ sa = texture2D(lightFunc, vec2(sa, spec.a)).r * min(dist_atten*4.0, 1.0);
sa *= noise;
- col += da*sa*gl_Color.rgb*spec.rgb;
+ col += da*sa*color.rgb*spec.rgb;
}
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/pointLightMSF.glsl b/indra/newview/app_settings/shaders/class1/deferred/pointLightMSF.glsl
deleted file mode 100644
index cdce58c84e..0000000000
--- a/indra/newview/app_settings/shaders/class1/deferred/pointLightMSF.glsl
+++ /dev/null
@@ -1,126 +0,0 @@
-/**
- * @file pointLightF.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2007, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-
-
-#extension GL_ARB_texture_rectangle : enable
-#extension GL_ARB_texture_multisample : enable
-
-uniform sampler2DMS depthMap;
-uniform sampler2DMS diffuseRect;
-uniform sampler2DMS specularRect;
-uniform sampler2DMS normalMap;
-uniform sampler2D noiseMap;
-uniform sampler2D lightFunc;
-
-
-uniform vec3 env_mat[3];
-uniform float sun_wash;
-
-varying vec4 vary_light;
-
-varying vec4 vary_fragcoord;
-uniform vec2 screen_res;
-
-uniform mat4 inv_proj;
-uniform vec4 viewport;
-
-vec4 getPosition(ivec2 pos_screen, int sample)
-{
- float depth = texelFetch(depthMap, pos_screen, sample).r;
- vec2 sc = (vec2(pos_screen.xy)-viewport.xy)*2.0;
- sc /= viewport.zw;
- sc -= vec2(1.0,1.0);
- vec4 ndc = vec4(sc.x, sc.y, 2.0*depth-1.0, 1.0);
- vec4 pos = inv_proj * ndc;
- pos /= pos.w;
- pos.w = 1.0;
- return pos;
-}
-
-void main()
-{
- vec4 frag = vary_fragcoord;
- frag.xyz /= frag.w;
- frag.xyz = frag.xyz*0.5+0.5;
- frag.xy *= screen_res;
-
- ivec2 itc = ivec2(frag.xy);
-
- int wght = 0;
- vec3 fcol = vec3(0,0,0);
-
- for (int s = 0; s < samples; ++s)
- {
- vec3 pos = getPosition(itc, s).xyz;
- vec3 lv = vary_light.xyz-pos;
- float dist2 = dot(lv,lv);
- dist2 /= vary_light.w;
- if (dist2 <= 1.0)
- {
- vec3 norm = texelFetch(normalMap, itc, s).xyz;
- norm = vec3((norm.xy-0.5)*2.0,norm.z); // unpack norm
- float da = dot(norm, lv);
- if (da >= 0.0)
- {
- norm = normalize(norm);
- lv = normalize(lv);
- da = dot(norm, lv);
-
- float noise = texture2D(noiseMap, frag.xy/128.0).b;
-
- vec3 col = texelFetch(diffuseRect, itc, s).rgb;
- 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 lit = da * dist_atten * noise;
-
- col = gl_Color.rgb*lit*col;
-
- vec4 spec = texelFetch(specularRect, itc, s);
- if (spec.a > 0.0)
- {
- float sa = dot(normalize(lv-normalize(pos)),norm);
- if (sa > 0.0)
- {
- sa = texture2D(lightFunc, vec2(sa, spec.a)).a * min(dist_atten*4.0, 1.0);
- sa *= noise;
- col += da*sa*gl_Color.rgb*spec.rgb;
- }
- }
-
- fcol += col;
- ++wght;
- }
- }
- }
-
- if (wght <= 0)
- {
- discard;
- }
-
- gl_FragColor.rgb = fcol/samples;
- gl_FragColor.a = 0.0;
-}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/pointLightV.glsl b/indra/newview/app_settings/shaders/class1/deferred/pointLightV.glsl
index db1b9d3feb..cb14e6d4e8 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/pointLightV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/pointLightV.glsl
@@ -23,23 +23,17 @@
* $/LicenseInfo$
*/
+uniform mat4 modelview_projection_matrix;
+ATTRIBUTE vec3 position;
-varying vec4 vary_light;
-varying vec4 vary_fragcoord;
+VARYING vec4 vary_fragcoord;
void main()
{
//transform vertex
- vec4 pos = gl_ModelViewProjectionMatrix * gl_Vertex;
+ vec4 pos = modelview_projection_matrix * vec4(position.xyz, 1.0);
vary_fragcoord = pos;
- vec4 tex = gl_MultiTexCoord0;
- tex.w = 1.0;
-
- vary_light = gl_MultiTexCoord0;
-
gl_Position = pos;
-
- gl_FrontColor = gl_Color;
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/postDeferredF.glsl b/indra/newview/app_settings/shaders/class1/deferred/postDeferredF.glsl
index 29f5f899ba..18d451bf87 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/postDeferredF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/postDeferredF.glsl
@@ -22,82 +22,32 @@
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
-
-
#extension GL_ARB_texture_rectangle : enable
-uniform sampler2DRect diffuseRect;
-uniform sampler2DRect edgeMap;
-uniform sampler2DRect depthMap;
-uniform sampler2DRect normalMap;
-uniform sampler2D bloomMap;
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 gl_FragColor;
+#endif
-uniform float depth_cutoff;
-uniform float norm_cutoff;
-uniform float focal_distance;
-uniform float blur_constant;
-uniform float tan_pixel_angle;
-uniform float magnification;
+uniform sampler2DRect diffuseRect;
uniform mat4 inv_proj;
uniform vec2 screen_res;
+uniform float max_cof;
+uniform float res_scale;
-varying vec2 vary_fragcoord;
-
-float getDepth(vec2 pos_screen)
-{
- float z = texture2DRect(depthMap, pos_screen.xy).r;
- z = z*2.0-1.0;
- vec4 ndc = vec4(0.0, 0.0, z, 1.0);
- vec4 p = inv_proj*ndc;
- return p.z/p.w;
-}
+VARYING vec2 vary_fragcoord;
-float calc_cof(float depth)
+void dofSample(inout vec4 diff, inout float w, float min_sc, vec2 tc)
{
- float sc = abs(depth-focal_distance)/-depth*blur_constant;
-
- sc /= magnification;
-
- // tan_pixel_angle = pixel_length/-depth;
- float pixel_length = tan_pixel_angle*-focal_distance;
-
- sc = sc/pixel_length;
- sc *= 1.414;
-
- return sc;
-}
-
-void dofSampleNear(inout vec4 diff, inout float w, float cur_sc, vec2 tc)
-{
- float d = getDepth(tc);
-
- float sc = calc_cof(d);
-
- float wg = 0.25;
-
vec4 s = texture2DRect(diffuseRect, tc);
- // de-weight dull areas to make highlights 'pop'
- wg += s.r+s.g+s.b;
-
- diff += wg*s;
-
- w += wg;
-}
-void dofSample(inout vec4 diff, inout float w, float min_sc, float cur_depth, vec2 tc)
-{
- float d = getDepth(tc);
-
- float sc = calc_cof(d);
-
- if (sc > min_sc //sampled pixel is more "out of focus" than current sample radius
- || d < cur_depth) //sampled pixel is further away than current pixel
+ float sc = abs(s.a*2.0-1.0)*max_cof;
+
+ if (sc > min_sc) //sampled pixel is more "out of focus" than current sample radius
{
float wg = 0.25;
- vec4 s = texture2DRect(diffuseRect, tc);
// de-weight dull areas to make highlights 'pop'
wg += s.r+s.g+s.b;
@@ -107,30 +57,35 @@ void dofSample(inout vec4 diff, inout float w, float min_sc, float cur_depth, ve
}
}
+void dofSampleNear(inout vec4 diff, inout float w, float min_sc, vec2 tc)
+{
+ vec4 s = texture2DRect(diffuseRect, tc);
+
+ float wg = 0.25;
+
+ // de-weight dull areas to make highlights 'pop'
+ wg += s.r+s.g+s.b;
+
+ diff += wg*s;
+
+ w += wg;
+}
void main()
{
- vec3 norm = texture2DRect(normalMap, vary_fragcoord.xy).xyz;
- norm = vec3((norm.xy-0.5)*2.0,norm.z); // unpack norm
-
vec2 tc = vary_fragcoord.xy;
- float depth = getDepth(tc);
-
vec4 diff = texture2DRect(diffuseRect, vary_fragcoord.xy);
{
float w = 1.0;
- float sc = calc_cof(depth);
- sc = min(abs(sc), 10.0);
-
- float fd = depth*0.5f;
-
+ float sc = (diff.a*2.0-1.0)*max_cof;
+
float PI = 3.14159265358979323846264;
// sample quite uniformly spaced points within a circle, for a circular 'bokeh'
- //if (depth < focal_distance)
+ if (sc > 0.5)
{
while (sc > 0.5)
{
@@ -141,15 +96,31 @@ void main()
float samp_x = sc*sin(ang);
float samp_y = sc*cos(ang);
// you could test sample coords against an interesting non-circular aperture shape here, if desired.
- dofSample(diff, w, sc, depth, vary_fragcoord.xy + vec2(samp_x,samp_y));
+ dofSampleNear(diff, w, sc, vary_fragcoord.xy + vec2(samp_x,samp_y));
}
sc -= 1.0;
}
}
-
+ else if (sc < -0.5)
+ {
+ sc = abs(sc);
+ while (sc > 0.5)
+ {
+ int its = int(max(1.0,(sc*3.7)));
+ for (int i=0; i<its; ++i)
+ {
+ float ang = sc+i*2*PI/its; // sc is added for rotary perturbance
+ float samp_x = sc*sin(ang);
+ float samp_y = sc*cos(ang);
+ // you could test sample coords against an interesting non-circular aperture shape here, if desired.
+ dofSample(diff, w, sc, vary_fragcoord.xy + vec2(samp_x,samp_y));
+ }
+ sc -= 1.0;
+ }
+ }
+
diff /= w;
}
- vec4 bloom = texture2D(bloomMap, vary_fragcoord.xy/screen_res);
- gl_FragColor = diff + bloom;
+ gl_FragColor = diff;
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/postDeferredMSF.glsl b/indra/newview/app_settings/shaders/class1/deferred/postDeferredMSF.glsl
deleted file mode 100644
index 792102a64d..0000000000
--- a/indra/newview/app_settings/shaders/class1/deferred/postDeferredMSF.glsl
+++ /dev/null
@@ -1,151 +0,0 @@
-/**
- * @file postDeferredF.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2007, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-
-
-#extension GL_ARB_texture_rectangle : enable
-#extension GL_ARB_texture_multisample : enable
-
-uniform sampler2DMS diffuseRect;
-uniform sampler2DMS edgeMap;
-uniform sampler2DMS depthMap;
-uniform sampler2DMS normalMap;
-uniform sampler2D bloomMap;
-
-uniform float depth_cutoff;
-uniform float norm_cutoff;
-uniform float focal_distance;
-uniform float blur_constant;
-uniform float tan_pixel_angle;
-uniform float magnification;
-
-uniform mat4 inv_proj;
-uniform vec2 screen_res;
-
-varying vec2 vary_fragcoord;
-
-vec4 texture2DMS(sampler2DMS tex, ivec2 tc)
-{
- vec4 ret = vec4(0,0,0,0);
- for (int i = 0; i < samples; ++i)
- {
- ret += texelFetch(tex, tc, i);
- }
-
- return ret/samples;
-}
-
-float getDepth(ivec2 pos_screen)
-{
- float z = texture2DMS(depthMap, pos_screen.xy).r;
- z = z*2.0-1.0;
- vec4 ndc = vec4(0.0, 0.0, z, 1.0);
- vec4 p = inv_proj*ndc;
- return p.z/p.w;
-}
-
-float calc_cof(float depth)
-{
- float sc = abs(depth-focal_distance)/-depth*blur_constant;
-
- sc /= magnification;
-
- // tan_pixel_angle = pixel_length/-depth;
- float pixel_length = tan_pixel_angle*-focal_distance;
-
- sc = sc/pixel_length;
- sc *= 1.414;
-
- return sc;
-}
-
-void dofSample(inout vec4 diff, inout float w, float min_sc, float cur_depth, ivec2 tc)
-{
- float d = getDepth(tc);
-
- float sc = calc_cof(d);
-
- if (sc > min_sc //sampled pixel is more "out of focus" than current sample radius
- || d < cur_depth) //sampled pixel is further away than current pixel
- {
- float wg = 0.25;
-
- vec4 s = texture2DMS(diffuseRect, tc);
- // de-weight dull areas to make highlights 'pop'
- wg += s.r+s.g+s.b;
-
- diff += wg*s;
-
- w += wg;
- }
-}
-
-
-void main()
-{
- ivec2 itc = ivec2(vary_fragcoord.xy);
-
- vec3 norm = texture2DMS(normalMap, itc).xyz;
- norm = vec3((norm.xy-0.5)*2.0,norm.z); // unpack norm
-
- float depth = getDepth(itc);
-
- vec4 diff = texture2DMS(diffuseRect, itc);
-
- {
- float w = 1.0;
-
- float sc = calc_cof(depth);
- sc = min(abs(sc), 10.0);
-
- float fd = depth*0.5f;
-
- float PI = 3.14159265358979323846264;
-
- int isc = int(sc);
-
- // sample quite uniformly spaced points within a circle, for a circular 'bokeh'
- //if (depth < focal_distance)
- {
- for (int x = -isc; x <= isc; x+=2)
- {
- for (int y = -isc; y <= isc; y+=2)
- {
- ivec2 cur_samp = ivec2(x,y);
- float cur_sc = length(vec2(cur_samp));
- if (cur_sc < sc)
- {
- dofSample(diff, w, cur_sc, depth, itc+cur_samp);
- }
- }
- }
- }
-
- diff /= w;
- }
-
- vec4 bloom = texture2D(bloomMap, vary_fragcoord.xy/screen_res);
- gl_FragColor = diff + bloom;
-}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/postDeferredNoDoFF.glsl b/indra/newview/app_settings/shaders/class1/deferred/postDeferredNoDoFF.glsl
index 34e30a3070..c275434777 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/postDeferredNoDoFF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/postDeferredNoDoFF.glsl
@@ -1,5 +1,5 @@
/**
- * @file postDeferredF.glsl
+ * @file postDeferredNoDoFF.glsl
*
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* Second Life Viewer Source Code
@@ -23,15 +23,17 @@
* $/LicenseInfo$
*/
-
-
#extension GL_ARB_texture_rectangle : enable
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 gl_FragColor;
+#endif
+
uniform sampler2DRect diffuseRect;
uniform sampler2D bloomMap;
uniform vec2 screen_res;
-varying vec2 vary_fragcoord;
+VARYING vec2 vary_fragcoord;
void main()
{
@@ -40,3 +42,4 @@ void main()
vec4 bloom = texture2D(bloomMap, vary_fragcoord.xy/screen_res);
gl_FragColor = diff + bloom;
}
+
diff --git a/indra/newview/app_settings/shaders/class1/deferred/postDeferredNoDoFMSF.glsl b/indra/newview/app_settings/shaders/class1/deferred/postDeferredNoDoFMSF.glsl
deleted file mode 100644
index 41849858e7..0000000000
--- a/indra/newview/app_settings/shaders/class1/deferred/postDeferredNoDoFMSF.glsl
+++ /dev/null
@@ -1,55 +0,0 @@
-/**
- * @file postDeferredF.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2007, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-
-
-#extension GL_ARB_texture_rectangle : enable
-#extension GL_ARB_texture_multisample : enable
-
-uniform sampler2DMS diffuseRect;
-uniform sampler2D bloomMap;
-
-uniform vec2 screen_res;
-varying vec2 vary_fragcoord;
-
-vec4 texture2DMS(sampler2DMS tex, ivec2 tc)
-{
- vec4 ret = vec4(0,0,0,0);
-
- for (int i = 0; i < samples; ++i)
- {
- ret += texelFetch(tex,tc,i);
- }
-
- return ret/samples;
-}
-
-void main()
-{
- vec4 diff = texture2DMS(diffuseRect, ivec2(vary_fragcoord.xy));
-
- vec4 bloom = texture2D(bloomMap, vary_fragcoord.xy/screen_res);
- gl_FragColor = diff + bloom;
-}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/postDeferredV.glsl b/indra/newview/app_settings/shaders/class1/deferred/postDeferredV.glsl
index cb83dda795..8edf5b2723 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/postDeferredV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/postDeferredV.glsl
@@ -22,16 +22,23 @@
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
-
+uniform mat4 modelview_projection_matrix;
+
+ATTRIBUTE vec3 position;
+
+VARYING vec2 vary_fragcoord;
+VARYING vec2 vary_tc;
+
+uniform vec2 tc_scale;
-varying vec2 vary_fragcoord;
uniform vec2 screen_res;
void main()
{
//transform vertex
- gl_Position = ftransform();
- vec4 pos = gl_ModelViewProjectionMatrix * gl_Vertex;
+ vec4 pos = modelview_projection_matrix * vec4(position.xyz, 1.0);
+ gl_Position = pos;
+ vary_tc = (pos.xy*0.5+0.5)*tc_scale;
vary_fragcoord = (pos.xy*0.5+0.5)*screen_res;
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/postgiF.glsl b/indra/newview/app_settings/shaders/class1/deferred/postgiF.glsl
index 99257daca4..84d65d5b3b 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/postgiF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/postgiF.glsl
@@ -22,9 +22,11 @@
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
-
-
+ #ifdef DEFINE_GL_FRAGCOLOR
+ out vec4 gl_FragColor;
+ #endif
+
uniform sampler2DRect depthMap;
uniform sampler2DRect normalMap;
uniform sampler2DRect giLightMap;
@@ -38,7 +40,7 @@ uniform int kern_length;
uniform float kern_scale;
uniform vec3 blur_quad;
-varying vec2 vary_fragcoord;
+VARYING vec2 vary_fragcoord;
uniform mat4 inv_proj;
uniform vec2 screen_res;
@@ -94,7 +96,5 @@ void main()
col = col*col*blur_quad.x + col*blur_quad.y + blur_quad.z;
- gl_FragData[0].xyz = col;
-
- //gl_FragColor = ccol;
+ gl_FragColor.rgb = col;
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/postgiV.glsl b/indra/newview/app_settings/shaders/class1/deferred/postgiV.glsl
index 6231ee68b7..0d5c8e7287 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/postgiV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/postgiV.glsl
@@ -22,16 +22,19 @@
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
+
+uniform mat4 modelview_projection_matrix;
+ATTRIBUTE vec3 position;
-varying vec2 vary_fragcoord;
+VARYING vec2 vary_fragcoord;
uniform vec2 screen_res;
void main()
{
//transform vertex
- gl_Position = ftransform();
- vec4 pos = gl_ModelViewProjectionMatrix * gl_Vertex;
+ vec4 pos = modelview_projection_matrix * vec4(position.xyz, 1.0);
+ gl_Position = pos;
vary_fragcoord = (pos.xy*0.5+0.5)*screen_res;
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/shadowAlphaMaskF.glsl b/indra/newview/app_settings/shaders/class1/deferred/shadowAlphaMaskF.glsl
index 615317febf..c1fb7b55d4 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/shadowAlphaMaskF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/shadowAlphaMaskF.glsl
@@ -22,19 +22,24 @@
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
-
+
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 gl_FragColor;
+#endif
+
uniform float minimum_alpha;
-uniform float maximum_alpha;
uniform sampler2D diffuseMap;
-varying vec4 post_pos;
+VARYING vec4 post_pos;
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
void main()
{
- float alpha = texture2D(diffuseMap, gl_TexCoord[0].xy).a * gl_Color.a;
+ float alpha = diffuseLookup(vary_texcoord0.xy).a * vertex_color.a;
- if (alpha < minimum_alpha || alpha > maximum_alpha)
+ if (alpha < minimum_alpha)
{
discard;
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/shadowAlphaMaskV.glsl b/indra/newview/app_settings/shaders/class1/deferred/shadowAlphaMaskV.glsl
index 4be18a9c5e..7d3b06c56e 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/shadowAlphaMaskV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/shadowAlphaMaskV.glsl
@@ -22,20 +22,30 @@
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
-
+uniform mat4 texture_matrix0;
+uniform mat4 modelview_projection_matrix;
-varying vec4 post_pos;
+ATTRIBUTE vec3 position;
+ATTRIBUTE vec4 diffuse_color;
+ATTRIBUTE vec2 texcoord0;
+
+VARYING vec4 post_pos;
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+
+void passTextureIndex();
void main()
{
//transform vertex
- vec4 pos = gl_ModelViewProjectionMatrix*gl_Vertex;
-
+ vec4 pos = modelview_projection_matrix*vec4(position.xyz, 1.0);
post_pos = pos;
gl_Position = vec4(pos.x, pos.y, pos.w*0.5, pos.w);
- gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
- gl_FrontColor = gl_Color;
+ passTextureIndex();
+
+ vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy;
+ vertex_color = diffuse_color;
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/shadowF.glsl b/indra/newview/app_settings/shaders/class1/deferred/shadowF.glsl
index 541f08d5fe..bf75ca262e 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/shadowF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/shadowF.glsl
@@ -23,9 +23,11 @@
* $/LicenseInfo$
*/
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 gl_FragColor;
+#endif
-
-varying vec4 post_pos;
+VARYING vec4 post_pos;
void main()
{
diff --git a/indra/newview/app_settings/shaders/class1/deferred/shadowV.glsl b/indra/newview/app_settings/shaders/class1/deferred/shadowV.glsl
index fc3ff45614..8b46e81f90 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/shadowV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/shadowV.glsl
@@ -22,15 +22,17 @@
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
-
+uniform mat4 modelview_projection_matrix;
-varying vec4 post_pos;
+ATTRIBUTE vec3 position;
+
+VARYING vec4 post_pos;
void main()
{
//transform vertex
- vec4 pos = gl_ModelViewProjectionMatrix*gl_Vertex;
+ vec4 pos = modelview_projection_matrix*vec4(position.xyz, 1.0);
post_pos = pos;
diff --git a/indra/newview/app_settings/shaders/class1/deferred/skyF.glsl b/indra/newview/app_settings/shaders/class1/deferred/skyF.glsl
index 59c0a994cd..96ad0aa93a 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/skyF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/skyF.glsl
@@ -23,13 +23,15 @@
* $/LicenseInfo$
*/
-
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 gl_FragData[3];
+#endif
/////////////////////////////////////////////////////////////////////////
// The fragment shader for the sky
/////////////////////////////////////////////////////////////////////////
-varying vec4 vary_HazeColor;
+VARYING vec4 vary_HazeColor;
uniform sampler2D cloud_noise_texture;
uniform vec4 gamma;
diff --git a/indra/newview/app_settings/shaders/class1/deferred/skyV.glsl b/indra/newview/app_settings/shaders/class1/deferred/skyV.glsl
index 3a44bb6d26..721de18e0b 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/skyV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/skyV.glsl
@@ -22,15 +22,19 @@
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
-
+uniform mat4 modelview_projection_matrix;
+
+ATTRIBUTE vec3 position;
+ATTRIBUTE vec2 texcoord0;
// SKY ////////////////////////////////////////////////////////////////////////
// The vertex shader for creating the atmospheric sky
///////////////////////////////////////////////////////////////////////////////
// Output parameters
-varying vec4 vary_HazeColor;
+VARYING vec4 vary_HazeColor;
+VARYING vec2 vary_texcoord0;
// Inputs
uniform vec3 camPosLocal;
@@ -57,12 +61,12 @@ void main()
{
// World / view / projection
- gl_Position = ftransform();
- gl_TexCoord[0] = gl_MultiTexCoord0;
+ gl_Position = modelview_projection_matrix * vec4(position.xyz, 1.0);
+ vary_texcoord0 = texcoord0;
// Get relative position
- vec3 P = gl_Vertex.xyz - camPosLocal.xyz + vec3(0,50,0);
- //vec3 P = gl_Vertex.xyz + vec3(0,50,0);
+ vec3 P = position.xyz - camPosLocal.xyz + vec3(0,50,0);
+ //vec3 P = position.xyz + vec3(0,50,0);
// Set altitude
if (P.y > 0.)
diff --git a/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl
index 855d89ebe6..51110ae4df 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl
@@ -23,17 +23,18 @@
* $/LicenseInfo$
*/
-
-
#extension GL_ARB_texture_rectangle : enable
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 gl_FragColor;
+#endif
+
uniform sampler2DRect diffuseRect;
uniform sampler2DRect specularRect;
uniform sampler2DRect positionMap;
uniform sampler2DRect normalMap;
uniform sampler2DRect lightMap;
uniform sampler2DRect depthMap;
-uniform sampler2D noiseMap;
uniform samplerCube environmentMap;
uniform sampler2D lightFunc;
@@ -58,13 +59,11 @@ uniform vec4 distance_multiplier;
uniform vec4 max_y;
uniform vec4 glow;
uniform float scene_light_strength;
-uniform vec3 env_mat[3];
-//uniform mat4 shadow_matrix[3];
-//uniform vec4 shadow_clip;
+uniform mat3 env_mat;
uniform mat3 ssao_effect_mat;
-varying vec4 vary_light;
-varying vec2 vary_fragcoord;
+uniform vec3 sun_dir;
+VARYING vec2 vary_fragcoord;
vec3 vary_PositionEye;
@@ -146,10 +145,6 @@ void calcAtmospherics(vec3 inPositionEye, float ambFactor) {
vec3 P = inPositionEye;
setPositionEye(P);
- //(TERRAIN) limit altitude
- if (P.y > max_y.x) P *= (max_y.x / P.y);
- if (P.y < -max_y.x) P *= (-max_y.x / P.y);
-
vec3 tmpLightnorm = lightnorm.xyz;
vec3 Pn = normalize(P);
@@ -281,9 +276,8 @@ void main()
vec3 pos = getPosition_d(tc, depth).xyz;
vec3 norm = texture2DRect(normalMap, tc).xyz;
norm = vec3((norm.xy-0.5)*2.0,norm.z); // unpack norm
- //vec3 nz = texture2D(noiseMap, vary_fragcoord.xy/128.0).xyz;
-
- float da = max(dot(norm.xyz, vary_light.xyz), 0.0);
+
+ float da = max(dot(norm.xyz, sun_dir.xyz), 0.0);
vec4 diffuse = texture2DRect(diffuseRect, tc);
vec4 spec = texture2DRect(specularRect, vary_fragcoord.xy);
@@ -304,13 +298,18 @@ void main()
// the old infinite-sky shiny reflection
//
vec3 refnormpersp = normalize(reflect(pos.xyz, norm.xyz));
- float sa = dot(refnormpersp, vary_light.xyz);
- vec3 dumbshiny = vary_SunlitColor*texture2D(lightFunc, vec2(sa, spec.a)).a;
+ float sa = dot(refnormpersp, sun_dir.xyz);
+ vec3 dumbshiny = vary_SunlitColor*texture2D(lightFunc, vec2(sa, spec.a)).r;
// add the two types of shiny together
vec3 spec_contrib = dumbshiny * spec.rgb;
bloom = dot(spec_contrib, spec_contrib);
col += spec_contrib;
+
+ //add environmentmap
+ vec3 env_vec = env_mat * refnormpersp;
+ col = mix(col.rgb, textureCube(environmentMap, env_vec).rgb,
+ max(spec.a-diffuse.a*2.0, 0.0));
}
col = atmosLighting(col);
@@ -324,5 +323,6 @@ void main()
}
gl_FragColor.rgb = col;
+
gl_FragColor.a = bloom;
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/softenLightMSF.glsl b/indra/newview/app_settings/shaders/class1/deferred/softenLightMSF.glsl
deleted file mode 100644
index f118b0da2a..0000000000
--- a/indra/newview/app_settings/shaders/class1/deferred/softenLightMSF.glsl
+++ /dev/null
@@ -1,342 +0,0 @@
-/**
- * @file softenLightF.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2007, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-
-
-#extension GL_ARB_texture_rectangle : enable
-#extension GL_ARB_texture_multisample : enable
-
-uniform sampler2DMS diffuseRect;
-uniform sampler2DMS specularRect;
-uniform sampler2DMS normalMap;
-uniform sampler2DMS depthMap;
-uniform sampler2D noiseMap;
-uniform samplerCube environmentMap;
-uniform sampler2D lightFunc;
-
-uniform float blur_size;
-uniform float blur_fidelity;
-
-// Inputs
-uniform vec4 morphFactor;
-uniform vec3 camPosLocal;
-//uniform vec4 camPosWorld;
-uniform vec4 gamma;
-uniform vec4 lightnorm;
-uniform vec4 sunlight_color;
-uniform vec4 ambient;
-uniform vec4 blue_horizon;
-uniform vec4 blue_density;
-uniform vec4 haze_horizon;
-uniform vec4 haze_density;
-uniform vec4 cloud_shadow;
-uniform vec4 density_multiplier;
-uniform vec4 distance_multiplier;
-uniform vec4 max_y;
-uniform vec4 glow;
-uniform float scene_light_strength;
-uniform vec3 env_mat[3];
-//uniform mat4 shadow_matrix[3];
-//uniform vec4 shadow_clip;
-uniform mat3 ssao_effect_mat;
-
-varying vec4 vary_light;
-varying vec2 vary_fragcoord;
-
-vec3 vary_PositionEye;
-
-vec3 vary_SunlitColor;
-vec3 vary_AmblitColor;
-vec3 vary_AdditiveColor;
-vec3 vary_AtmosAttenuation;
-
-uniform mat4 inv_proj;
-uniform vec2 screen_res;
-
-vec4 getPosition_d(vec2 pos_screen, float depth)
-{
- vec2 sc = pos_screen.xy*2.0;
- sc /= screen_res;
- sc -= vec2(1.0,1.0);
- vec4 ndc = vec4(sc.x, sc.y, 2.0*depth-1.0, 1.0);
- vec4 pos = inv_proj * ndc;
- pos /= pos.w;
- pos.w = 1.0;
- return pos;
-}
-
-vec3 getPositionEye()
-{
- return vary_PositionEye;
-}
-vec3 getSunlitColor()
-{
- return vary_SunlitColor;
-}
-vec3 getAmblitColor()
-{
- return vary_AmblitColor;
-}
-vec3 getAdditiveColor()
-{
- return vary_AdditiveColor;
-}
-vec3 getAtmosAttenuation()
-{
- return vary_AtmosAttenuation;
-}
-
-
-void setPositionEye(vec3 v)
-{
- vary_PositionEye = v;
-}
-
-void setSunlitColor(vec3 v)
-{
- vary_SunlitColor = v;
-}
-
-void setAmblitColor(vec3 v)
-{
- vary_AmblitColor = v;
-}
-
-void setAdditiveColor(vec3 v)
-{
- vary_AdditiveColor = v;
-}
-
-void setAtmosAttenuation(vec3 v)
-{
- vary_AtmosAttenuation = v;
-}
-
-void calcAtmospherics(vec3 inPositionEye, float ambFactor) {
-
- vec3 P = inPositionEye;
- setPositionEye(P);
-
- //(TERRAIN) limit altitude
- if (P.y > max_y.x) P *= (max_y.x / P.y);
- if (P.y < -max_y.x) P *= (-max_y.x / P.y);
-
- vec3 tmpLightnorm = lightnorm.xyz;
-
- vec3 Pn = normalize(P);
- float Plen = length(P);
-
- vec4 temp1 = vec4(0);
- vec3 temp2 = vec3(0);
- vec4 blue_weight;
- vec4 haze_weight;
- vec4 sunlight = sunlight_color;
- vec4 light_atten;
-
- //sunlight attenuation effect (hue and brightness) due to atmosphere
- //this is used later for sunlight modulation at various altitudes
- light_atten = (blue_density * 1.0 + vec4(haze_density.r) * 0.25) * (density_multiplier.x * max_y.x);
- //I had thought blue_density and haze_density should have equal weighting,
- //but attenuation due to haze_density tends to seem too strong
-
- temp1 = blue_density + vec4(haze_density.r);
- blue_weight = blue_density / temp1;
- haze_weight = vec4(haze_density.r) / temp1;
-
- //(TERRAIN) compute sunlight from lightnorm only (for short rays like terrain)
- temp2.y = max(0.0, tmpLightnorm.y);
- temp2.y = 1. / temp2.y;
- sunlight *= exp( - light_atten * temp2.y);
-
- // main atmospheric scattering line integral
- temp2.z = Plen * density_multiplier.x;
-
- // Transparency (-> temp1)
- // ATI Bugfix -- can't store temp1*temp2.z*distance_multiplier.x in a variable because the ati
- // compiler gets confused.
- temp1 = exp(-temp1 * temp2.z * distance_multiplier.x);
-
- //final atmosphere attenuation factor
- setAtmosAttenuation(temp1.rgb);
-
- //compute haze glow
- //(can use temp2.x as temp because we haven't used it yet)
- temp2.x = dot(Pn, tmpLightnorm.xyz);
- temp2.x = 1. - temp2.x;
- //temp2.x is 0 at the sun and increases away from sun
- temp2.x = max(temp2.x, .03); //was glow.y
- //set a minimum "angle" (smaller glow.y allows tighter, brighter hotspot)
- temp2.x *= glow.x;
- //higher glow.x gives dimmer glow (because next step is 1 / "angle")
- temp2.x = pow(temp2.x, glow.z);
- //glow.z should be negative, so we're doing a sort of (1 / "angle") function
-
- //add "minimum anti-solar illumination"
- temp2.x += .25;
-
- //increase ambient when there are more clouds
- vec4 tmpAmbient = ambient + (vec4(1.) - ambient) * cloud_shadow.x * 0.5;
-
- /* decrease value and saturation (that in HSV, not HSL) for occluded areas
- * // for HSV color/geometry used here, see http://gimp-savvy.com/BOOK/index.html?node52.html
- * // The following line of code performs the equivalent of:
- * float ambAlpha = tmpAmbient.a;
- * float ambValue = dot(vec3(tmpAmbient), vec3(0.577)); // projection onto <1/rt(3), 1/rt(3), 1/rt(3)>, the neutral white-black axis
- * vec3 ambHueSat = vec3(tmpAmbient) - vec3(ambValue);
- * tmpAmbient = vec4(RenderSSAOEffect.valueFactor * vec3(ambValue) + RenderSSAOEffect.saturationFactor *(1.0 - ambFactor) * ambHueSat, ambAlpha);
- */
- tmpAmbient = vec4(mix(ssao_effect_mat * tmpAmbient.rgb, tmpAmbient.rgb, ambFactor), tmpAmbient.a);
-
- //haze color
- setAdditiveColor(
- vec3(blue_horizon * blue_weight * (sunlight*(1.-cloud_shadow.x) + tmpAmbient)
- + (haze_horizon.r * haze_weight) * (sunlight*(1.-cloud_shadow.x) * temp2.x
- + tmpAmbient)));
-
- //brightness of surface both sunlight and ambient
- setSunlitColor(vec3(sunlight * .5));
- setAmblitColor(vec3(tmpAmbient * .25));
- setAdditiveColor(getAdditiveColor() * vec3(1.0 - temp1));
-}
-
-vec3 atmosLighting(vec3 light)
-{
- light *= getAtmosAttenuation().r;
- light += getAdditiveColor();
- return (2.0 * light);
-}
-
-vec3 atmosTransport(vec3 light) {
- light *= getAtmosAttenuation().r;
- light += getAdditiveColor() * 2.0;
- return light;
-}
-vec3 atmosGetDiffuseSunlightColor()
-{
- return getSunlitColor();
-}
-
-vec3 scaleDownLight(vec3 light)
-{
- return (light / scene_light_strength );
-}
-
-vec3 scaleUpLight(vec3 light)
-{
- return (light * scene_light_strength);
-}
-
-vec3 atmosAmbient(vec3 light)
-{
- return getAmblitColor() + light / 2.0;
-}
-
-vec3 atmosAffectDirectionalLight(float lightIntensity)
-{
- return getSunlitColor() * lightIntensity;
-}
-
-vec3 scaleSoftClip(vec3 light)
-{
- //soft clip effect:
- light = 1. - clamp(light, vec3(0.), vec3(1.));
- light = 1. - pow(light, gamma.xxx);
-
- return light;
-}
-
-vec4 texture2DMS(sampler2DMS tex, ivec2 tc)
-{
- vec4 ret = vec4(0,0,0,0);
-
- for (int i = 0; i < samples; ++i)
- {
- ret += texelFetch(tex,tc,i);
- }
-
- return ret/samples;
-}
-
-void main()
-{
- vec2 tc = vary_fragcoord.xy;
- ivec2 itc = ivec2(tc);
-
- vec4 fcol = vec4(0,0,0,0);
-
- for (int i = 0; i < samples; ++i)
- {
- float depth = texelFetch(depthMap, itc, i).r;
- vec3 pos = getPosition_d(tc, depth).xyz;
- vec3 norm = texelFetch(normalMap, itc, i).xyz;
-
- norm = vec3((norm.xy-0.5)*2.0,norm.z); // unpack norm
- //vec3 nz = texture2D(noiseMap, vary_fragcoord.xy/128.0).xyz;
-
- float da = max(dot(norm.xyz, vary_light.xyz), 0.0);
-
- vec4 diffuse = texelFetch(diffuseRect, itc, i);
- vec3 col;
- float bloom = 0.0;
-
- if (diffuse.a < 0.9)
- {
- vec4 spec = texelFetch(specularRect, itc, i);
-
- calcAtmospherics(pos.xyz, 1.0);
-
- col = atmosAmbient(vec3(0));
- col += atmosAffectDirectionalLight(max(min(da, 1.0), diffuse.a));
-
- col *= diffuse.rgb;
-
- if (spec.a > 0.0) // specular reflection
- {
- // the old infinite-sky shiny reflection
- //
- vec3 refnormpersp = normalize(reflect(pos.xyz, norm.xyz));
- float sa = dot(refnormpersp, vary_light.xyz);
- vec3 dumbshiny = vary_SunlitColor*texture2D(lightFunc, vec2(sa, spec.a)).a;
-
- // add the two types of shiny together
- vec3 spec_contrib = dumbshiny * spec.rgb;
- bloom = dot(spec_contrib, spec_contrib);
- col += spec_contrib;
- }
-
- col = atmosLighting(col);
- col = scaleSoftClip(col);
- col = mix(col, diffuse.rgb, diffuse.a);
- }
- else
- {
- col = diffuse.rgb;
- }
-
- fcol += vec4(col, bloom);
- }
-
- gl_FragColor = fcol/samples;
-}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/softenLightV.glsl b/indra/newview/app_settings/shaders/class1/deferred/softenLightV.glsl
index fed238510a..c6031fc45a 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/softenLightV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/softenLightV.glsl
@@ -23,22 +23,18 @@
* $/LicenseInfo$
*/
+uniform mat4 modelview_projection_matrix;
+ATTRIBUTE vec3 position;
uniform vec2 screen_res;
-varying vec4 vary_light;
-varying vec2 vary_fragcoord;
+VARYING vec2 vary_fragcoord;
void main()
{
//transform vertex
- gl_Position = ftransform();
-
- vec4 pos = gl_ModelViewProjectionMatrix * gl_Vertex;
- vary_fragcoord = (pos.xy*0.5+0.5)*screen_res;
+ vec4 pos = modelview_projection_matrix * vec4(position.xyz, 1.0);
+ gl_Position = pos;
- vec4 tex = gl_MultiTexCoord0;
- tex.w = 1.0;
-
- vary_light = gl_MultiTexCoord0;
+ vary_fragcoord = (pos.xy*0.5+0.5)*screen_res;
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/spotLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/spotLightF.glsl
index 7363bd6715..cc0f4e5b6b 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/spotLightF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/spotLightF.glsl
@@ -23,17 +23,18 @@
* $/LicenseInfo$
*/
-
-
+
#extension GL_ARB_texture_rectangle : enable
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 gl_FragColor;
+#endif
+
uniform sampler2DRect diffuseRect;
uniform sampler2DRect specularRect;
uniform sampler2DRect depthMap;
uniform sampler2DRect normalMap;
-uniform samplerCube environmentMap;
uniform sampler2D noiseMap;
-uniform sampler2D lightFunc;
uniform sampler2D projectionMap;
uniform mat4 proj_mat; //screen space to light space
@@ -50,9 +51,12 @@ uniform float far_clip;
uniform vec3 proj_origin; //origin of projection to be used for angular attenuation
uniform float sun_wash;
-varying vec4 vary_light;
+uniform vec3 center;
+uniform vec3 color;
+uniform float falloff;
+uniform float size;
-varying vec4 vary_fragcoord;
+VARYING vec4 vary_fragcoord;
uniform vec2 screen_res;
uniform mat4 inv_proj;
@@ -78,9 +82,9 @@ void main()
frag.xy *= screen_res;
vec3 pos = getPosition(frag.xy).xyz;
- vec3 lv = vary_light.xyz-pos.xyz;
+ vec3 lv = center.xyz-pos.xyz;
float dist2 = dot(lv,lv);
- dist2 /= vary_light.w;
+ dist2 /= size;
if (dist2 > 1.0)
{
discard;
@@ -100,7 +104,7 @@ void main()
proj_tc.xyz /= proj_tc.w;
- float fa = gl_Color.a+1.0;
+ float fa = falloff+1.0;
float dist_atten = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 0.0, 1.0);
lv = proj_origin-pos.xyz;
@@ -126,7 +130,7 @@ void main()
vec4 plcol = texture2DLod(projectionMap, proj_tc.xy, lod);
- vec3 lcol = gl_Color.rgb * plcol.rgb * plcol.a;
+ vec3 lcol = color.rgb * plcol.rgb * plcol.a;
lit = da * dist_atten * noise;
@@ -145,7 +149,7 @@ void main()
amb_da = min(amb_da, 1.0-lit);
- col += amb_da*gl_Color.rgb*diff_tex.rgb*amb_plcol.rgb*amb_plcol.a;
+ col += amb_da*color.rgb*diff_tex.rgb*amb_plcol.rgb*amb_plcol.a;
}
@@ -174,7 +178,7 @@ void main()
stc.y > 0.0)
{
vec4 scol = texture2DLod(projectionMap, stc.xy, proj_lod-spec.a*proj_lod);
- col += dist_atten*scol.rgb*gl_Color.rgb*scol.a*spec.rgb;
+ col += dist_atten*scol.rgb*color.rgb*scol.a*spec.rgb;
}
}
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/spotLightMSF.glsl b/indra/newview/app_settings/shaders/class1/deferred/spotLightMSF.glsl
deleted file mode 100644
index 0c0171881f..0000000000
--- a/indra/newview/app_settings/shaders/class1/deferred/spotLightMSF.glsl
+++ /dev/null
@@ -1,252 +0,0 @@
-/**
- * @file multiSpotLightF.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2007, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-
-
-//class 1 -- no shadows
-
-#extension GL_ARB_texture_rectangle : enable
-#extension GL_ARB_texture_multisample : enable
-
-uniform sampler2DMS diffuseRect;
-uniform sampler2DMS specularRect;
-uniform sampler2DMS depthMap;
-uniform sampler2DMS normalMap;
-uniform sampler2D noiseMap;
-uniform sampler2D lightFunc;
-uniform sampler2D projectionMap;
-
-uniform mat4 proj_mat; //screen space to light space
-uniform float proj_near; //near clip for projection
-uniform vec3 proj_p; //plane projection is emitting from (in screen space)
-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;
-
-varying vec4 vary_fragcoord;
-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(ivec2 pos_screen, int sample)
-{
- float depth = texelFetch(depthMap, pos_screen, sample).r;
- vec2 sc = vec2(pos_screen.xy)*2.0;
- sc /= screen_res;
- sc -= vec2(1.0,1.0);
- vec4 ndc = vec4(sc.x, sc.y, 2.0*depth-1.0, 1.0);
- vec4 pos = inv_proj * ndc;
- pos /= pos.w;
- pos.w = 1.0;
- return pos;
-}
-
-void main()
-{
- vec4 frag = vary_fragcoord;
- frag.xyz /= frag.w;
- frag.xyz = frag.xyz*0.5+0.5;
- frag.xy *= screen_res;
- ivec2 itc = ivec2(frag.xy);
-
- vec3 fcol = vec3(0,0,0);
- int wght = 0;
-
- for (int i = 0; i < samples; ++i)
- {
- vec3 pos = getPosition(itc, i).xyz;
- vec3 lv = vary_light.xyz-pos.xyz;
- float dist2 = dot(lv,lv);
- dist2 /= vary_light.w;
- if (dist2 <= 1.0)
- {
- vec3 norm = texelFetch(normalMap, itc, i).xyz*2.0-1.0;
-
- norm = normalize(norm);
- float l_dist = -dot(lv, proj_n);
-
- vec4 proj_tc = (proj_mat * vec4(pos.xyz, 1.0));
- if (proj_tc.z >= 0.0)
- {
- proj_tc.xyz /= proj_tc.w;
-
- float fa = gl_Color.a+1.0;
- float dist_atten = min(1.0-(dist2-1.0*(1.0-fa))/fa, 1.0);
- if (dist_atten > 0.0)
- {
- lv = proj_origin-pos.xyz;
- lv = normalize(lv);
- float da = dot(norm, lv);
-
- vec3 col = vec3(0,0,0);
-
- vec3 diff_tex = texelFetch(diffuseRect, itc, i).rgb;
-
- float noise = texture2D(noiseMap, frag.xy/128.0).b;
- if (proj_tc.z > 0.0 &&
- proj_tc.x < 1.0 &&
- proj_tc.y < 1.0 &&
- proj_tc.x > 0.0 &&
- 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 = 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);
- 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;
- }
-
-
- vec4 spec = texelFetch(specularRect, itc, i);
- if (spec.a > 0.0)
- {
- vec3 ref = reflect(normalize(pos), norm);
-
- //project from point pos in direction ref to plane proj_p, proj_n
- vec3 pdelta = proj_p-pos;
- float ds = dot(ref, proj_n);
-
- if (ds < 0.0)
- {
- vec3 pfinal = pos + ref * dot(pdelta, proj_n)/ds;
-
- vec4 stc = (proj_mat * vec4(pfinal.xyz, 1.0));
-
- 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 = texture2DLodSpecular(projectionMap, stc.xy, proj_lod-spec.a*proj_lod);
- col += dist_atten*scol.rgb*gl_Color.rgb*scol.a*spec.rgb;
- }
- }
- }
- }
-
- fcol += col;
- ++wght;
- }
- }
- }
- }
-
- if (wght <= 0)
- {
- discard;
- }
-
- gl_FragColor.rgb = fcol/samples;
- gl_FragColor.a = 0.0;
-}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/starsF.glsl b/indra/newview/app_settings/shaders/class1/deferred/starsF.glsl
index 4ab59d4d66..03fccd2766 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/starsF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/starsF.glsl
@@ -22,14 +22,19 @@
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
-
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 gl_FragData[3];
+#endif
+
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
uniform sampler2D diffuseMap;
void main()
{
- vec4 col = gl_Color * texture2D(diffuseMap, gl_TexCoord[0].xy);
+ vec4 col = vertex_color * texture2D(diffuseMap, vary_texcoord0.xy);
gl_FragData[0] = col;
gl_FragData[1] = vec4(0,0,0,0);
diff --git a/indra/newview/app_settings/shaders/class1/deferred/starsV.glsl b/indra/newview/app_settings/shaders/class1/deferred/starsV.glsl
index 84adf6bc41..8bc5b06379 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/starsV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/starsV.glsl
@@ -22,14 +22,21 @@
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
-
+uniform mat4 texture_matrix0;
+uniform mat4 modelview_projection_matrix;
+ATTRIBUTE vec3 position;
+ATTRIBUTE vec4 diffuse_color;
+ATTRIBUTE vec2 texcoord0;
+
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
void main()
{
//transform vertex
- gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
- gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
- gl_FrontColor = gl_Color;
+ gl_Position = modelview_projection_matrix * vec4(position.xyz, 1.0);
+ vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy;
+ vertex_color = diffuse_color;
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/sunLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/sunLightF.glsl
index 78ea15e87a..adc7c5d005 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/sunLightF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/sunLightF.glsl
@@ -23,12 +23,14 @@
* $/LicenseInfo$
*/
-
-
//class 1, no shadow, no SSAO, should never be called
#extension GL_ARB_texture_rectangle : enable
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 gl_FragColor;
+#endif
+
void main()
{
gl_FragColor = vec4(0,0,0,0);
diff --git a/indra/newview/app_settings/shaders/class1/deferred/sunLightMSF.glsl b/indra/newview/app_settings/shaders/class1/deferred/sunLightMSF.glsl
deleted file mode 100644
index 78ea15e87a..0000000000
--- a/indra/newview/app_settings/shaders/class1/deferred/sunLightMSF.glsl
+++ /dev/null
@@ -1,35 +0,0 @@
-/**
- * @file sunLightF.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2007, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-
-
-//class 1, no shadow, no SSAO, should never be called
-
-#extension GL_ARB_texture_rectangle : enable
-
-void main()
-{
- gl_FragColor = vec4(0,0,0,0);
-}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/sunLightSSAOF.glsl b/indra/newview/app_settings/shaders/class1/deferred/sunLightSSAOF.glsl
index 2f880d65dd..fc5959a33c 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/sunLightSSAOF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/sunLightSSAOF.glsl
@@ -23,9 +23,12 @@
*/
-
#extension GL_ARB_texture_rectangle : enable
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 gl_FragColor;
+#endif
+
//class 1 -- no shadow, SSAO only
uniform sampler2DRect depthMap;
@@ -41,8 +44,7 @@ uniform float ssao_max_radius;
uniform float ssao_factor;
uniform float ssao_factor_inv;
-varying vec2 vary_fragcoord;
-varying vec4 vary_light;
+VARYING vec2 vary_fragcoord;
uniform mat4 inv_proj;
uniform vec2 screen_res;
diff --git a/indra/newview/app_settings/shaders/class1/deferred/sunLightSSAOMSF.glsl b/indra/newview/app_settings/shaders/class1/deferred/sunLightSSAOMSF.glsl
deleted file mode 100644
index abb64334ed..0000000000
--- a/indra/newview/app_settings/shaders/class1/deferred/sunLightSSAOMSF.glsl
+++ /dev/null
@@ -1,140 +0,0 @@
-/**
- * @file sunLightSSAOF.glsl
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2007, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-
-
-#extension GL_ARB_texture_rectangle : enable
-#extension GL_ARB_texture_multisample : enable
-
-//class 1 -- no shadow, SSAO only
-
-uniform sampler2DMS depthMap;
-uniform sampler2DMS normalMap;
-uniform sampler2D noiseMap;
-
-
-// Inputs
-uniform mat4 shadow_matrix[6];
-uniform vec4 shadow_clip;
-uniform float ssao_radius;
-uniform float ssao_max_radius;
-uniform float ssao_factor;
-uniform float ssao_factor_inv;
-
-varying vec2 vary_fragcoord;
-varying vec4 vary_light;
-
-uniform mat4 inv_proj;
-uniform vec2 screen_res;
-
-uniform float shadow_bias;
-uniform float shadow_offset;
-
-vec4 getPosition(ivec2 pos_screen, int sample)
-{
- float depth = texelFetch(depthMap, pos_screen, sample).r;
- vec2 sc = pos_screen.xy*2.0;
- sc /= screen_res;
- sc -= vec2(1.0,1.0);
- vec4 ndc = vec4(sc.x, sc.y, 2.0*depth-1.0, 1.0);
- vec4 pos = inv_proj * ndc;
- pos /= pos.w;
- pos.w = 1.0;
- return pos;
-}
-
-//calculate decreases in ambient lighting when crowded out (SSAO)
-float calcAmbientOcclusion(vec4 pos, vec3 norm, int sample)
-{
- float ret = 1.0;
-
- 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 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++)
- {
- ivec2 samppos_screen = ivec2(pos_screen + scale * reflect(kern[i], noise_reflect));
- vec3 samppos_world = getPosition(samppos_screen, sample).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)
-
- 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);
- }
-
- angle_hidden = min(ssao_factor*angle_hidden/float(points), 1.0);
-
- ret = (1.0 - (float(points != 0) * angle_hidden));
-
- return min(ret, 1.0);
-}
-
-void main()
-{
- vec2 pos_screen = vary_fragcoord.xy;
- ivec2 itc = ivec2(pos_screen);
-
- float col = 0;
-
- for (int i = 0; i < samples; i++)
- {
- vec4 pos = getPosition(itc, i);
- vec3 norm = texelFetch(normalMap, itc, i).xyz;
- norm = vec3((norm.xy-0.5)*2.0,norm.z); // unpack norm
- col += calcAmbientOcclusion(pos,norm,i);
- }
-
- col /= samples;
-
- gl_FragColor[0] = 1.0;
- gl_FragColor[1] = col;
- gl_FragColor[2] = 1.0;
- gl_FragColor[3] = 1.0;
-}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/sunLightV.glsl b/indra/newview/app_settings/shaders/class1/deferred/sunLightV.glsl
index e7ab11c6ed..473d6df8fa 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/sunLightV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/sunLightV.glsl
@@ -22,24 +22,20 @@
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
-
+uniform mat4 modelview_projection_matrix;
+
+ATTRIBUTE vec3 position;
-varying vec4 vary_light;
-varying vec2 vary_fragcoord;
+VARYING vec2 vary_fragcoord;
uniform vec2 screen_res;
void main()
{
//transform vertex
- gl_Position = ftransform();
- vec4 pos = gl_ModelViewProjectionMatrix * gl_Vertex;
- vary_fragcoord = (pos.xy * 0.5 + 0.5)*screen_res;
- vec4 tex = gl_MultiTexCoord0;
- tex.w = 1.0;
+ vec4 pos = modelview_projection_matrix * vec4(position.xyz, 1.0);
+ gl_Position = pos;
- vary_light = gl_MultiTexCoord0;
-
- gl_FrontColor = gl_Color;
+ vary_fragcoord = (pos.xy * 0.5 + 0.5)*screen_res;
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/terrainF.glsl b/indra/newview/app_settings/shaders/class1/deferred/terrainF.glsl
index c6578ea177..5522e6c41d 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/terrainF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/terrainF.glsl
@@ -23,7 +23,9 @@
* $/LicenseInfo$
*/
-
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 gl_FragData[3];
+#endif
uniform sampler2D detail_0;
uniform sampler2D detail_1;
@@ -31,24 +33,26 @@ uniform sampler2D detail_2;
uniform sampler2D detail_3;
uniform sampler2D alpha_ramp;
-varying vec3 vary_normal;
+VARYING vec3 vary_normal;
+VARYING vec4 vary_texcoord0;
+VARYING vec4 vary_texcoord1;
void main()
{
/// Note: This should duplicate the blending functionality currently used for the terrain rendering.
- vec4 color0 = texture2D(detail_0, gl_TexCoord[0].xy);
- vec4 color1 = texture2D(detail_1, gl_TexCoord[0].xy);
- vec4 color2 = texture2D(detail_2, gl_TexCoord[0].xy);
- vec4 color3 = texture2D(detail_3, gl_TexCoord[0].xy);
+ vec4 color0 = texture2D(detail_0, vary_texcoord0.xy);
+ vec4 color1 = texture2D(detail_1, vary_texcoord0.xy);
+ vec4 color2 = texture2D(detail_2, vary_texcoord0.xy);
+ vec4 color3 = texture2D(detail_3, vary_texcoord0.xy);
- float alpha1 = texture2D(alpha_ramp, gl_TexCoord[0].zw).a;
- float alpha2 = texture2D(alpha_ramp,gl_TexCoord[1].xy).a;
- float alphaFinal = texture2D(alpha_ramp, gl_TexCoord[1].zw).a;
+ float alpha1 = texture2D(alpha_ramp, vary_texcoord0.zw).a;
+ float alpha2 = texture2D(alpha_ramp,vary_texcoord1.xy).a;
+ float alphaFinal = texture2D(alpha_ramp, vary_texcoord1.zw).a;
vec4 outColor = mix( mix(color3, color2, alpha2), mix(color1, color0, alpha1), alphaFinal );
gl_FragData[0] = vec4(outColor.rgb, 0.0);
- gl_FragData[1] = vec4(outColor.rgb*0.2, 0.2);
+ gl_FragData[1] = vec4(0,0,0,0);
vec3 nvn = normalize(vary_normal);
gl_FragData[2] = vec4(nvn.xy * 0.5 + 0.5, nvn.z, 0.0);
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/terrainV.glsl b/indra/newview/app_settings/shaders/class1/deferred/terrainV.glsl
index fc19a73709..5effee4e4e 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/terrainV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/terrainV.glsl
@@ -22,10 +22,24 @@
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
-
+uniform mat3 normal_matrix;
+uniform mat4 texture_matrix0;
+uniform mat4 modelview_projection_matrix;
-varying vec3 vary_normal;
+ATTRIBUTE vec3 position;
+ATTRIBUTE vec3 normal;
+ATTRIBUTE vec4 diffuse_color;
+ATTRIBUTE vec2 texcoord0;
+ATTRIBUTE vec2 texcoord1;
+
+VARYING vec3 vary_normal;
+
+VARYING vec4 vary_texcoord0;
+VARYING vec4 vary_texcoord1;
+
+uniform vec4 object_plane_s;
+uniform vec4 object_plane_t;
vec4 texgen_object(vec4 vpos, vec4 tc, mat4 mat, vec4 tp0, vec4 tp1)
{
@@ -44,16 +58,16 @@ vec4 texgen_object(vec4 vpos, vec4 tc, mat4 mat, vec4 tp0, vec4 tp1)
void main()
{
//transform vertex
- gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
+ gl_Position = modelview_projection_matrix * vec4(position.xyz, 1.0);
- vary_normal = normalize(gl_NormalMatrix * gl_Normal);
+ vary_normal = normalize(normal_matrix * normal);
// Transform and pass tex coords
- gl_TexCoord[0].xy = texgen_object(gl_Vertex, gl_MultiTexCoord0, gl_TextureMatrix[0], gl_ObjectPlaneS[0], gl_ObjectPlaneT[0]).xy;
+ vary_texcoord0.xy = texgen_object(vec4(position, 1.0), vec4(texcoord0,0,1), texture_matrix0, object_plane_s, object_plane_t).xy;
- vec4 t = gl_MultiTexCoord1;
+ vec4 t = vec4(texcoord1,0,1);
- gl_TexCoord[0].zw = t.xy;
- gl_TexCoord[1].xy = t.xy-vec2(2.0, 0.0);
- gl_TexCoord[1].zw = t.xy-vec2(1.0, 0.0);
+ vary_texcoord0.zw = t.xy;
+ vary_texcoord1.xy = t.xy-vec2(2.0, 0.0);
+ vary_texcoord1.zw = t.xy-vec2(1.0, 0.0);
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/treeF.glsl b/indra/newview/app_settings/shaders/class1/deferred/treeF.glsl
index 56a149523e..ea98d6884c 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/treeF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/treeF.glsl
@@ -22,17 +22,28 @@
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
-
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 gl_FragData[3];
+#endif
uniform sampler2D diffuseMap;
-varying vec3 vary_normal;
+VARYING vec4 vertex_color;
+VARYING vec3 vary_normal;
+VARYING vec2 vary_texcoord0;
+
+uniform float minimum_alpha;
void main()
{
- vec4 col = texture2D(diffuseMap, gl_TexCoord[0].xy);
- gl_FragData[0] = vec4(gl_Color.rgb*col.rgb, col.a <= 0.5 ? 0.0 : 0.005);
+ vec4 col = texture2D(diffuseMap, vary_texcoord0.xy);
+ if (col.a < minimum_alpha)
+ {
+ discard;
+ }
+
+ gl_FragData[0] = vec4(vertex_color.rgb*col.rgb, 0.0);
gl_FragData[1] = vec4(0,0,0,0);
vec3 nvn = normalize(vary_normal);
gl_FragData[2] = vec4(nvn.xy * 0.5 + 0.5, nvn.z, 0.0);
diff --git a/indra/newview/app_settings/shaders/class1/deferred/treeShadowF.glsl b/indra/newview/app_settings/shaders/class1/deferred/treeShadowF.glsl
new file mode 100644
index 0000000000..20d0170535
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/deferred/treeShadowF.glsl
@@ -0,0 +1,49 @@
+/**
+ * @file treeShadowF.glsl
+ *
+ * $LicenseInfo:firstyear=2005&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2005, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 gl_FragColor;
+#endif
+
+uniform float minimum_alpha;
+
+uniform sampler2D diffuseMap;
+
+VARYING vec4 post_pos;
+VARYING vec2 vary_texcoord0;
+
+void main()
+{
+ float alpha = texture2D(diffuseMap, vary_texcoord0.xy).a;
+
+ if (alpha < minimum_alpha)
+ {
+ discard;
+ }
+
+ gl_FragColor = vec4(1,1,1,1);
+
+ gl_FragDepth = max(post_pos.z/post_pos.w*0.5+0.5, 0.0);
+}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/treeShadowV.glsl b/indra/newview/app_settings/shaders/class1/deferred/treeShadowV.glsl
new file mode 100644
index 0000000000..e472a75304
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/deferred/treeShadowV.glsl
@@ -0,0 +1,45 @@
+/**
+ * @file treeShadowV.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+uniform mat4 texture_matrix0;
+uniform mat4 modelview_projection_matrix;
+
+ATTRIBUTE vec3 position;
+ATTRIBUTE vec2 texcoord0;
+
+VARYING vec4 post_pos;
+VARYING vec2 vary_texcoord0;
+
+void main()
+{
+ //transform vertex
+ vec4 pos = modelview_projection_matrix*vec4(position.xyz, 1.0);
+
+ post_pos = pos;
+
+ gl_Position = vec4(pos.x, pos.y, pos.w*0.5, pos.w);
+
+ vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy;
+}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/treeV.glsl b/indra/newview/app_settings/shaders/class1/deferred/treeV.glsl
index 01401028d6..3b6571a24a 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/treeV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/treeV.glsl
@@ -22,18 +22,26 @@
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
-
+uniform mat4 texture_matrix0;
+uniform mat4 modelview_projection_matrix;
+uniform mat3 normal_matrix;
-varying vec3 vary_normal;
+ATTRIBUTE vec3 position;
+ATTRIBUTE vec3 normal;
+ATTRIBUTE vec2 texcoord0;
+
+VARYING vec3 vary_normal;
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
void main()
{
//transform vertex
- gl_Position = ftransform();
- gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
+ gl_Position = modelview_projection_matrix * vec4(position.xyz, 1.0);
+ vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy;
- vary_normal = normalize(gl_NormalMatrix * gl_Normal);
+ vary_normal = normalize(normal_matrix * normal);
- gl_FrontColor = gl_Color;
+ vertex_color = vec4(1,1,1,1);
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/waterF.glsl b/indra/newview/app_settings/shaders/class1/deferred/waterF.glsl
index c3e7371c8e..4c9ea24a24 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/waterF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/waterF.glsl
@@ -23,10 +23,12 @@
* $/LicenseInfo$
*/
-
-
#extension GL_ARB_texture_rectangle : enable
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 gl_FragData[3];
+#endif
+
vec3 scaleSoftClip(vec3 inColor);
vec3 atmosTransport(vec3 inColor);
@@ -58,10 +60,10 @@ uniform vec2 screen_res;
uniform mat4 norm_mat; //region space to screen space
//bigWave is (refCoord.w, view.w);
-varying vec4 refCoord;
-varying vec4 littleWave;
-varying vec4 view;
-varying vec4 vary_position;
+VARYING vec4 refCoord;
+VARYING vec4 littleWave;
+VARYING vec4 view;
+VARYING vec4 vary_position;
void main()
{
diff --git a/indra/newview/app_settings/shaders/class1/deferred/waterV.glsl b/indra/newview/app_settings/shaders/class1/deferred/waterV.glsl
index 9d415ade85..9734acf005 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/waterV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/waterV.glsl
@@ -22,7 +22,11 @@
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
-
+
+uniform mat4 modelview_matrix;
+uniform mat4 modelview_projection_matrix;
+
+ATTRIBUTE vec3 position;
void calcAtmospherics(vec3 inPositionEye);
@@ -33,11 +37,11 @@ uniform float time;
uniform vec3 eyeVec;
uniform float waterHeight;
-varying vec4 refCoord;
-varying vec4 littleWave;
-varying vec4 view;
+VARYING vec4 refCoord;
+VARYING vec4 littleWave;
+VARYING vec4 view;
-varying vec4 vary_position;
+VARYING vec4 vary_position;
float wave(vec2 v, float t, float f, vec2 d, float s)
{
@@ -47,43 +51,42 @@ float wave(vec2 v, float t, float f, vec2 d, float s)
void main()
{
//transform vertex
- vec4 position = gl_Vertex;
- mat4 modelViewProj = gl_ModelViewProjectionMatrix;
+ vec4 pos = vec4(position.xyz, 1.0);
+ mat4 modelViewProj = modelview_projection_matrix;
vec4 oPosition;
//get view vector
vec3 oEyeVec;
- oEyeVec.xyz = position.xyz-eyeVec;
+ oEyeVec.xyz = pos.xyz-eyeVec;
float d = length(oEyeVec.xy);
float ld = min(d, 2560.0);
- position.xy = eyeVec.xy + oEyeVec.xy/d*ld;
+ pos.xy = eyeVec.xy + oEyeVec.xy/d*ld;
view.xyz = oEyeVec;
d = clamp(ld/1536.0-0.5, 0.0, 1.0);
d *= d;
- oPosition = position;
+ oPosition = vec4(position, 1.0);
oPosition.z = mix(oPosition.z, max(eyeVec.z*0.75, 0.0), d);
- vary_position = gl_ModelViewMatrix * oPosition;
+ vary_position = modelview_matrix * oPosition;
oPosition = modelViewProj * oPosition;
refCoord.xyz = oPosition.xyz + vec3(0,0,0.2);
//get wave position parameter (create sweeping horizontal waves)
- vec3 v = position.xyz;
+ vec3 v = pos.xyz;
v.x += (cos(v.x*0.08/*+time*0.01*/)+sin(v.y*0.02))*6.0;
//push position for further horizon effect.
- position.xyz = oEyeVec.xyz*(waterHeight/oEyeVec.z);
- position.w = 1.0;
- position = position*gl_ModelViewMatrix;
-
- calcAtmospherics((gl_ModelViewMatrix * gl_Vertex).xyz);
-
+ pos.xyz = oEyeVec.xyz*(waterHeight/oEyeVec.z);
+ pos.w = 1.0;
+ pos = modelview_matrix*pos;
+ calcAtmospherics(pos.xyz);
+
//pass wave parameters to pixel shader
vec2 bigWave = (v.xy) * vec2(0.04,0.04) + d1 * time * 0.055;
//get two normal map (detail map) texture coordinates
diff --git a/indra/newview/app_settings/shaders/class1/effects/glowExtractF.glsl b/indra/newview/app_settings/shaders/class1/effects/glowExtractF.glsl
index e827863436..9a3d792224 100644
--- a/indra/newview/app_settings/shaders/class1/effects/glowExtractF.glsl
+++ b/indra/newview/app_settings/shaders/class1/effects/glowExtractF.glsl
@@ -23,10 +23,12 @@
* $/LicenseInfo$
*/
-
-
#extension GL_ARB_texture_rectangle : enable
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 gl_FragColor;
+#endif
+
uniform sampler2DRect diffuseMap;
uniform float minLuminance;
uniform float maxExtractAlpha;
@@ -34,10 +36,11 @@ uniform vec3 lumWeights;
uniform vec3 warmthWeights;
uniform float warmthAmount;
+VARYING vec2 vary_texcoord0;
+
void main()
{
- vec4 col = texture2DRect(diffuseMap, gl_TexCoord[0].xy);
-
+ vec4 col = texture2DRect(diffuseMap, vary_texcoord0.xy);
/// CALCULATING LUMINANCE (Using NTSC lum weights)
/// http://en.wikipedia.org/wiki/Luma_%28video%29
float lum = smoothstep(minLuminance, minLuminance+1.0, dot(col.rgb, lumWeights ) );
@@ -45,4 +48,5 @@ void main()
gl_FragColor.rgb = col.rgb;
gl_FragColor.a = max(col.a, mix(lum, warmth, warmthAmount) * maxExtractAlpha);
+
}
diff --git a/indra/newview/app_settings/shaders/class1/effects/glowExtractMSF.glsl b/indra/newview/app_settings/shaders/class1/effects/glowExtractMSF.glsl
deleted file mode 100644
index c2cc8ed567..0000000000
--- a/indra/newview/app_settings/shaders/class1/effects/glowExtractMSF.glsl
+++ /dev/null
@@ -1,56 +0,0 @@
-/**
- * @file glowExtractF.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2007, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-
-
-#extension GL_ARB_texture_rectangle : enable
-#extension GL_ARB_texture_multisample : enable
-
-uniform sampler2DMS diffuseMap;
-uniform float minLuminance;
-uniform float maxExtractAlpha;
-uniform vec3 lumWeights;
-uniform vec3 warmthWeights;
-uniform float warmthAmount;
-
-void main()
-{
- ivec2 itc = ivec2(gl_TexCoord[0].xy);
- vec4 fcol = vec4(0,0,0,0);
-
- for (int i = 0; i < samples; i++)
- {
- vec4 col = texelFetch(diffuseMap, itc, i);
-
- /// CALCULATING LUMINANCE (Using NTSC lum weights)
- /// http://en.wikipedia.org/wiki/Luma_%28video%29
- float lum = smoothstep(minLuminance, minLuminance+1.0, dot(col.rgb, lumWeights ) );
- float warmth = smoothstep(minLuminance, minLuminance+1.0, max(col.r * warmthWeights.r, max(col.g * warmthWeights.g, col.b * warmthWeights.b)) );
-
- fcol += vec4(col.rgb, max(col.a, mix(lum, warmth, warmthAmount) * maxExtractAlpha));
- }
-
- gl_FragColor = fcol/samples;
-}
diff --git a/indra/newview/app_settings/shaders/class1/effects/glowExtractV.glsl b/indra/newview/app_settings/shaders/class1/effects/glowExtractV.glsl
index 8db6d1bf24..1396dc6973 100644
--- a/indra/newview/app_settings/shaders/class1/effects/glowExtractV.glsl
+++ b/indra/newview/app_settings/shaders/class1/effects/glowExtractV.glsl
@@ -23,11 +23,16 @@
* $/LicenseInfo$
*/
+uniform mat4 modelview_projection_matrix;
+ATTRIBUTE vec3 position;
+ATTRIBUTE vec2 texcoord0;
+
+VARYING vec2 vary_texcoord0;
void main()
{
- gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
+ gl_Position = modelview_projection_matrix * vec4(position, 1.0);
- gl_TexCoord[0].xy = gl_MultiTexCoord0.xy;
+ vary_texcoord0.xy = texcoord0;
}
diff --git a/indra/newview/app_settings/shaders/class1/effects/glowF.glsl b/indra/newview/app_settings/shaders/class1/effects/glowF.glsl
index 75cff75ea9..90bb84323c 100644
--- a/indra/newview/app_settings/shaders/class1/effects/glowF.glsl
+++ b/indra/newview/app_settings/shaders/class1/effects/glowF.glsl
@@ -23,11 +23,18 @@
* $/LicenseInfo$
*/
-
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 gl_FragColor;
+#endif
uniform sampler2D diffuseMap;
uniform float glowStrength;
+VARYING vec4 vary_texcoord0;
+VARYING vec4 vary_texcoord1;
+VARYING vec4 vary_texcoord2;
+VARYING vec4 vary_texcoord3;
+
void main()
{
@@ -38,14 +45,14 @@ void main()
kern[0] = 0.25; kern[1] = 0.5; kern[2] = 0.8; kern[3] = 1.0;
kern[4] = 1.0; kern[5] = 0.8; kern[6] = 0.5; kern[7] = 0.25;
- col += kern[0] * texture2D(diffuseMap, gl_TexCoord[0].xy);
- col += kern[1] * texture2D(diffuseMap, gl_TexCoord[1].xy);
- col += kern[2] * texture2D(diffuseMap, gl_TexCoord[2].xy);
- col += kern[3] * texture2D(diffuseMap, gl_TexCoord[3].xy);
- col += kern[4] * texture2D(diffuseMap, gl_TexCoord[0].zw);
- col += kern[5] * texture2D(diffuseMap, gl_TexCoord[1].zw);
- col += kern[6] * texture2D(diffuseMap, gl_TexCoord[2].zw);
- col += kern[7] * texture2D(diffuseMap, gl_TexCoord[3].zw);
+ col += kern[0] * texture2D(diffuseMap, vary_texcoord0.xy);
+ col += kern[1] * texture2D(diffuseMap, vary_texcoord1.xy);
+ col += kern[2] * texture2D(diffuseMap, vary_texcoord2.xy);
+ col += kern[3] * texture2D(diffuseMap, vary_texcoord3.xy);
+ col += kern[4] * texture2D(diffuseMap, vary_texcoord0.zw);
+ col += kern[5] * texture2D(diffuseMap, vary_texcoord1.zw);
+ col += kern[6] * texture2D(diffuseMap, vary_texcoord2.zw);
+ col += kern[7] * texture2D(diffuseMap, vary_texcoord3.zw);
gl_FragColor = vec4(col.rgb * glowStrength, col.a);
}
diff --git a/indra/newview/app_settings/shaders/class1/effects/glowV.glsl b/indra/newview/app_settings/shaders/class1/effects/glowV.glsl
index a5aacc0196..cdb2281578 100644
--- a/indra/newview/app_settings/shaders/class1/effects/glowV.glsl
+++ b/indra/newview/app_settings/shaders/class1/effects/glowV.glsl
@@ -23,20 +23,28 @@
* $/LicenseInfo$
*/
+uniform mat4 modelview_projection_matrix;
+ATTRIBUTE vec3 position;
+ATTRIBUTE vec2 texcoord0;
uniform vec2 glowDelta;
+VARYING vec4 vary_texcoord0;
+VARYING vec4 vary_texcoord1;
+VARYING vec4 vary_texcoord2;
+VARYING vec4 vary_texcoord3;
+
void main()
{
- gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
+ gl_Position = modelview_projection_matrix * vec4(position, 1.0);
- gl_TexCoord[0].xy = gl_MultiTexCoord0.xy + glowDelta*(-3.5);
- gl_TexCoord[1].xy = gl_MultiTexCoord0.xy + glowDelta*(-2.5);
- gl_TexCoord[2].xy = gl_MultiTexCoord0.xy + glowDelta*(-1.5);
- gl_TexCoord[3].xy = gl_MultiTexCoord0.xy + glowDelta*(-0.5);
- gl_TexCoord[0].zw = gl_MultiTexCoord0.xy + glowDelta*(0.5);
- gl_TexCoord[1].zw = gl_MultiTexCoord0.xy + glowDelta*(1.5);
- gl_TexCoord[2].zw = gl_MultiTexCoord0.xy + glowDelta*(2.5);
- gl_TexCoord[3].zw = gl_MultiTexCoord0.xy + glowDelta*(3.5);
+ vary_texcoord0.xy = texcoord0 + glowDelta*(-3.5);
+ vary_texcoord1.xy = texcoord0 + glowDelta*(-2.5);
+ vary_texcoord2.xy = texcoord0 + glowDelta*(-1.5);
+ vary_texcoord3.xy = texcoord0 + glowDelta*(-0.5);
+ vary_texcoord0.zw = texcoord0 + glowDelta*(0.5);
+ vary_texcoord1.zw = texcoord0 + glowDelta*(1.5);
+ vary_texcoord2.zw = texcoord0 + glowDelta*(2.5);
+ vary_texcoord3.zw = texcoord0 + glowDelta*(3.5);
}
diff --git a/indra/newview/app_settings/shaders/class1/environment/terrainF.glsl b/indra/newview/app_settings/shaders/class1/environment/terrainF.glsl
index c61d5a2a08..18f6d91804 100644
--- a/indra/newview/app_settings/shaders/class1/environment/terrainF.glsl
+++ b/indra/newview/app_settings/shaders/class1/environment/terrainF.glsl
@@ -1,4 +1,4 @@
-/**
+/**
* @file terrainF.glsl
*
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
@@ -23,19 +23,42 @@
* $/LicenseInfo$
*/
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 gl_FragColor;
+#endif
+VARYING vec4 vertex_color;
+VARYING vec4 vary_texcoord0;
+VARYING vec4 vary_texcoord1;
-uniform sampler2D detail0;
-uniform sampler2D detail1;
-uniform sampler2D alphaRamp;
+uniform sampler2D detail_0;
+uniform sampler2D detail_1;
+uniform sampler2D detail_2;
+uniform sampler2D detail_3;
+uniform sampler2D alpha_ramp;
-void main()
+vec3 atmosLighting(vec3 light);
+
+vec3 scaleSoftClip(vec3 color);
+
+void main()
{
- float a = texture2D(alphaRamp, gl_TexCoord[1].xy).a;
- vec3 color = mix(texture2D(detail1, gl_TexCoord[2].xy).rgb,
- texture2D(detail0, gl_TexCoord[0].xy).rgb,
- a);
+ /// Note: This should duplicate the blending functionality currently used for the terrain rendering.
+
+ /// TODO Confirm tex coords and bind them appropriately in vert shader.
+ vec4 color0 = texture2D(detail_0, vary_texcoord0.xy);
+ vec4 color1 = texture2D(detail_1, vary_texcoord0.xy);
+ vec4 color2 = texture2D(detail_2, vary_texcoord0.xy);
+ vec4 color3 = texture2D(detail_3, vary_texcoord0.xy);
- gl_FragColor.rgb = color;
- gl_FragColor.a = texture2D(alphaRamp, gl_TexCoord[3].xy).a;
+ float alpha1 = texture2D(alpha_ramp, vary_texcoord0.zw).a;
+ float alpha2 = texture2D(alpha_ramp,vary_texcoord1.xy).a;
+ float alphaFinal = texture2D(alpha_ramp, vary_texcoord1.zw).a;
+ vec4 outColor = mix( mix(color3, color2, alpha2), mix(color1, color0, alpha1), alphaFinal );
+
+ /// Add WL Components
+ outColor.rgb = atmosLighting(outColor.rgb * vertex_color.rgb);
+
+ gl_FragColor = vec4(scaleSoftClip(outColor.rgb), 1.0);
}
+
diff --git a/indra/newview/app_settings/shaders/class1/environment/terrainV.glsl b/indra/newview/app_settings/shaders/class1/environment/terrainV.glsl
index 917891c063..d09c5f9247 100644
--- a/indra/newview/app_settings/shaders/class1/environment/terrainV.glsl
+++ b/indra/newview/app_settings/shaders/class1/environment/terrainV.glsl
@@ -1,4 +1,4 @@
-/**
+/**
* @file terrainV.glsl
*
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
@@ -22,8 +22,25 @@
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
-
+uniform mat3 normal_matrix;
+uniform mat4 texture_matrix0;
+uniform mat4 modelview_matrix;
+uniform mat4 modelview_projection_matrix;
+
+uniform vec4 object_plane_t;
+uniform vec4 object_plane_s;
+
+ATTRIBUTE vec3 position;
+ATTRIBUTE vec3 normal;
+ATTRIBUTE vec2 texcoord0;
+ATTRIBUTE vec2 texcoord1;
+
+VARYING vec4 vertex_color;
+VARYING vec4 vary_texcoord0;
+VARYING vec4 vary_texcoord1;
+
+void calcAtmospherics(vec3 inPositionEye);
vec4 calcLighting(vec3 pos, vec3 norm, vec4 color, vec4 baseCol);
@@ -44,17 +61,27 @@ vec4 texgen_object(vec4 vpos, vec4 tc, mat4 mat, vec4 tp0, vec4 tp1)
void main()
{
//transform vertex
- gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
-
- vec4 pos = gl_ModelViewMatrix * gl_Vertex;
- vec3 norm = normalize(gl_NormalMatrix * gl_Normal);
+ gl_Position = modelview_projection_matrix * vec4(position.xyz, 1.0);
+
+ vec4 pos = modelview_matrix * vec4(position.xyz, 1.0);
+ vec3 norm = normalize(normal_matrix * normal);
+
+ calcAtmospherics(pos.xyz);
+
+ /// Potentially better without it for water.
+ pos /= pos.w;
+
+ vec4 color = calcLighting(pos.xyz, norm, vec4(1,1,1,1), vec4(0));
- vec4 color = calcLighting(pos.xyz, norm, vec4(1,1,1,1), gl_Color);
+ vertex_color = color;
+
+ // Transform and pass tex coords
+ vary_texcoord0.xy = texgen_object(vec4(position.xyz, 1.0), vec4(texcoord0,0,1), texture_matrix0, object_plane_s, object_plane_t).xy;
- gl_FrontColor = color;
+ vec4 t = vec4(texcoord1,0,1);
- gl_TexCoord[0] = texgen_object(gl_Vertex,gl_MultiTexCoord0,gl_TextureMatrix[0],gl_ObjectPlaneS[0],gl_ObjectPlaneT[0]);
- gl_TexCoord[1] = gl_TextureMatrix[1]*gl_MultiTexCoord1;
- gl_TexCoord[2] = texgen_object(gl_Vertex,gl_MultiTexCoord2,gl_TextureMatrix[2],gl_ObjectPlaneS[2],gl_ObjectPlaneT[2]);
- gl_TexCoord[3] = gl_TextureMatrix[3]*gl_MultiTexCoord3;
+ vary_texcoord0.zw = t.xy;
+ vary_texcoord1.xy = t.xy-vec2(2.0, 0.0);
+ vary_texcoord1.zw = t.xy-vec2(1.0, 0.0);
}
+
diff --git a/indra/newview/app_settings/shaders/class1/environment/terrainWaterF.glsl b/indra/newview/app_settings/shaders/class1/environment/terrainWaterF.glsl
index 711b42b95e..e5c7ced52c 100644
--- a/indra/newview/app_settings/shaders/class1/environment/terrainWaterF.glsl
+++ b/indra/newview/app_settings/shaders/class1/environment/terrainWaterF.glsl
@@ -1,4 +1,4 @@
-/**
+/**
* @file terrainWaterF.glsl
*
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
@@ -22,22 +22,44 @@
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
-
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 gl_FragColor;
+#endif
-// this class1 shader is just a copy of terrainF
+VARYING vec4 vertex_color;
+VARYING vec4 vary_texcoord0;
+VARYING vec4 vary_texcoord1;
-uniform sampler2D detail0;
-uniform sampler2D detail1;
-uniform sampler2D alphaRamp;
+uniform sampler2D detail_0;
+uniform sampler2D detail_1;
+uniform sampler2D detail_2;
+uniform sampler2D detail_3;
+uniform sampler2D alpha_ramp;
-void main()
+vec3 atmosLighting(vec3 light);
+
+vec4 applyWaterFog(vec4 color);
+
+void main()
{
- float a = texture2D(alphaRamp, gl_TexCoord[1].xy).a;
- vec3 color = mix(texture2D(detail1, gl_TexCoord[2].xy).rgb,
- texture2D(detail0, gl_TexCoord[0].xy).rgb,
- a);
+ /// Note: This should duplicate the blending functionality currently used for the terrain rendering.
+
+ /// TODO Confirm tex coords and bind them appropriately in vert shader.
+ vec4 color0 = texture2D(detail_0, vary_texcoord0.xy);
+ vec4 color1 = texture2D(detail_1, vary_texcoord0.xy);
+ vec4 color2 = texture2D(detail_2, vary_texcoord0.xy);
+ vec4 color3 = texture2D(detail_3, vary_texcoord0.xy);
- gl_FragColor.rgb = color;
- gl_FragColor.a = texture2D(alphaRamp, gl_TexCoord[3].xy).a;
+ float alpha1 = texture2D(alpha_ramp, vary_texcoord0.zw).a;
+ float alpha2 = texture2D(alpha_ramp,vary_texcoord1.xy).a;
+ float alphaFinal = texture2D(alpha_ramp, vary_texcoord1.zw).a;
+ vec4 outColor = mix( mix(color3, color2, alpha2), mix(color1, color0, alpha1), alphaFinal );
+
+ /// Add WL Components
+ outColor.rgb = atmosLighting(outColor.rgb * vertex_color.rgb);
+
+ outColor = applyWaterFog(outColor);
+ gl_FragColor = outColor;
}
+
diff --git a/indra/newview/app_settings/shaders/class1/environment/underWaterF.glsl b/indra/newview/app_settings/shaders/class1/environment/underWaterF.glsl
index 72e8e739b3..1fdb90f792 100644
--- a/indra/newview/app_settings/shaders/class1/environment/underWaterF.glsl
+++ b/indra/newview/app_settings/shaders/class1/environment/underWaterF.glsl
@@ -23,36 +23,82 @@
* $/LicenseInfo$
*/
-
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 gl_FragColor;
+#endif
uniform sampler2D diffuseMap;
uniform sampler2D bumpMap;
uniform sampler2D screenTex;
+uniform sampler2D refTex;
+uniform sampler2D screenDepth;
+uniform vec4 fogCol;
+uniform vec3 lightDir;
+uniform vec3 specular;
+uniform float lightExp;
+uniform vec2 fbScale;
uniform float refScale;
+uniform float znear;
+uniform float zfar;
+uniform float kd;
+uniform vec4 waterPlane;
+uniform vec3 eyeVec;
uniform vec4 waterFogColor;
+uniform float waterFogDensity;
+uniform float waterFogKS;
+uniform vec2 screenRes;
//bigWave is (refCoord.w, view.w);
-varying vec4 refCoord;
-varying vec4 littleWave;
-varying vec4 view;
+VARYING vec4 refCoord;
+VARYING vec4 littleWave;
+VARYING vec4 view;
-void main()
+vec4 applyWaterFog(vec4 color, vec3 viewVec)
{
- vec4 color;
+ //normalize view vector
+ vec3 view = normalize(viewVec);
+ float es = -view.z;
+
+ //find intersection point with water plane and eye vector
- //get bigwave normal
- vec3 wavef = texture2D(bumpMap, vec2(refCoord.w, view.w)).xyz*2.0;
-
- //get detail normals
- vec3 dcol = texture2D(bumpMap, littleWave.xy).rgb*0.75;
- dcol += texture2D(bumpMap, littleWave.zw).rgb*1.25;
-
- //interpolate between big waves and little waves (big waves in deep water)
- wavef = (wavef+dcol)*0.5;
+ //get eye depth
+ float e0 = max(-waterPlane.w, 0.0);
+
+ //get object depth
+ float depth = length(viewVec);
+
+ //get "thickness" of water
+ float l = max(depth, 0.1);
- //crunch normal to range [-1,1]
- wavef -= vec3(1,1,1);
+ float kd = waterFogDensity;
+ float ks = waterFogKS;
+ vec4 kc = waterFogColor;
+
+ float F = 0.98;
+
+ float t1 = -kd * pow(F, ks * e0);
+ float t2 = kd + ks * es;
+ float t3 = pow(F, t2*l) - 1.0;
+
+ float L = min(t1/t2*t3, 1.0);
+
+ float D = pow(0.98, l*kd);
+ //return vec4(1.0, 0.0, 1.0, 1.0);
+ return color * D + kc * L;
+ //depth /= 10.0;
+ //return vec4(depth,depth,depth,0.0);
+}
+
+void main()
+{
+ vec4 color;
+
+ //get detail normals
+ vec3 wave1 = texture2D(bumpMap, vec2(refCoord.w, view.w)).xyz*2.0-1.0;
+ vec3 wave2 = texture2D(bumpMap, littleWave.xy).xyz*2.0-1.0;
+ vec3 wave3 = texture2D(bumpMap, littleWave.zw).xyz*2.0-1.0;
+ vec3 wavef = normalize(wave1+wave2+wave3);
//figure out distortion vector (ripply)
vec2 distort = (refCoord.xy/refCoord.z) * 0.5 + 0.5;
@@ -60,6 +106,5 @@ void main()
vec4 fb = texture2D(screenTex, distort);
- gl_FragColor.rgb = mix(waterFogColor.rgb, fb.rgb, waterFogColor.a * 0.001 + 0.999);
- gl_FragColor.a = fb.a;
+ gl_FragColor = applyWaterFog(fb,view.xyz);
}
diff --git a/indra/newview/app_settings/shaders/class1/environment/waterF.glsl b/indra/newview/app_settings/shaders/class1/environment/waterF.glsl
index 4d555b566a..444c896d38 100644
--- a/indra/newview/app_settings/shaders/class1/environment/waterF.glsl
+++ b/indra/newview/app_settings/shaders/class1/environment/waterF.glsl
@@ -23,20 +23,19 @@
* $/LicenseInfo$
*/
-
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 gl_FragColor;
+#endif
vec3 scaleSoftClip(vec3 inColor);
vec3 atmosTransport(vec3 inColor);
-vec3 applyWaterFog(vec4 inColor);
-uniform sampler2D diffuseMap;
uniform sampler2D bumpMap;
uniform sampler2D screenTex;
uniform sampler2D refTex;
uniform float sunAngle;
uniform float sunAngle2;
-uniform float scaledAngle;
uniform vec3 lightDir;
uniform vec3 specular;
uniform float lightExp;
@@ -47,67 +46,92 @@ uniform vec3 normScale;
uniform float fresnelScale;
uniform float fresnelOffset;
uniform float blurMultiplier;
-uniform vec4 fogCol;
+
//bigWave is (refCoord.w, view.w);
-varying vec4 refCoord;
-varying vec4 littleWave;
-varying vec4 view;
+VARYING vec4 refCoord;
+VARYING vec4 littleWave;
+VARYING vec4 view;
void main()
{
- vec3 viewVec = view.xyz;
vec4 color;
- float dist = length(viewVec.xy);
+ float dist = length(view.xy);
//normalize view vector
- viewVec = normalize(viewVec);
+ vec3 viewVec = normalize(view.xyz);
//get wave normals
- vec3 wavef = texture2D(bumpMap, vec2(refCoord.w, view.w)).xyz*2.0;
-
- //get detail normals
- vec3 dcol = texture2D(bumpMap, littleWave.xy).rgb*0.75;
- dcol += texture2D(bumpMap, littleWave.zw).rgb*1.25;
-
- //interpolate between big waves and little waves (big waves in deep water)
- wavef = (wavef + dcol) * 0.5;
-
- //crunch normal to range [-1,1]
- wavef -= vec3(1,1,1);
- wavef = normalize(wavef);
-
+ vec3 wave1 = texture2D(bumpMap, vec2(refCoord.w, view.w)).xyz*2.0-1.0;
+ vec3 wave2 = texture2D(bumpMap, littleWave.xy).xyz*2.0-1.0;
+ vec3 wave3 = texture2D(bumpMap, littleWave.zw).xyz*2.0-1.0;
//get base fresnel components
- float df = dot(viewVec,wavef) * fresnelScale + fresnelOffset;
+ vec3 df = vec3(
+ dot(viewVec, wave1),
+ dot(viewVec, (wave2 + wave3) * 0.5),
+ dot(viewVec, wave3)
+ ) * fresnelScale + fresnelOffset;
+ df *= df;
vec2 distort = (refCoord.xy/refCoord.z) * 0.5 + 0.5;
float dist2 = dist;
dist = max(dist, 5.0);
+ float dmod = sqrt(dist);
+
+ vec2 dmod_scale = vec2(dmod*dmod, dmod);
+
//get reflected color
- vec2 refdistort = wavef.xy*dot(normScale, vec3(0.333));
- vec2 refvec = distort+refdistort/dist;
- vec4 refcol = texture2D(refTex, refvec);
+ vec2 refdistort1 = wave1.xy*normScale.x;
+ vec2 refvec1 = distort+refdistort1/dmod_scale;
+ vec4 refcol1 = texture2D(refTex, refvec1);
+
+ vec2 refdistort2 = wave2.xy*normScale.y;
+ vec2 refvec2 = distort+refdistort2/dmod_scale;
+ vec4 refcol2 = texture2D(refTex, refvec2);
+
+ vec2 refdistort3 = wave3.xy*normScale.z;
+ vec2 refvec3 = distort+refdistort3/dmod_scale;
+ vec4 refcol3 = texture2D(refTex, refvec3);
+
+ vec4 refcol = refcol1 + refcol2 + refcol3;
+ float df1 = df.x + df.y + df.z;
+ refcol *= df1 * 0.333;
+
+ vec3 wavef = (wave1 + wave2 * 0.4 + wave3 * 0.6) * 0.5;
+
+ wavef.z *= max(-viewVec.z, 0.1);
+ wavef = normalize(wavef);
+
+ float df2 = dot(viewVec, wavef) * fresnelScale+fresnelOffset;
+
+ vec2 refdistort4 = wavef.xy*0.125;
+ refdistort4.y -= abs(refdistort4.y);
+ vec2 refvec4 = distort+refdistort4/dmod;
+ float dweight = min(dist2*blurMultiplier, 1.0);
+ vec4 baseCol = texture2D(refTex, refvec4);
+ refcol = mix(baseCol*df2, refcol, dweight);
//get specular component
float spec = clamp(dot(lightDir, (reflect(viewVec,wavef))),0.0,1.0);
-
+
//harden specular
- spec = pow(spec, lightExp);
+ spec = pow(spec, 128.0);
//figure out distortion vector (ripply)
- vec2 distort2 = distort+wavef.xy*refScale/max(dist*df, 1.0);
+ vec2 distort2 = distort+wavef.xy*refScale/max(dmod*df1, 1.0);
vec4 fb = texture2D(screenTex, distort2);
//mix with reflection
- color.rgb = mix(mix(fogCol.rgb, fb.rgb, fogCol.a), refcol.rgb, df);
+ // Note we actually want to use just df1, but multiplying by 0.999999 gets around and nvidia compiler bug
+ color.rgb = mix(fb.rgb, refcol.rgb, df1 * 0.99999);
color.rgb += spec * specular;
- //color.rgb = applyWaterFog(color);//atmosTransport(color.rgb);
+ color.rgb = atmosTransport(color.rgb);
color.rgb = scaleSoftClip(color.rgb);
color.a = spec * sunAngle2;
diff --git a/indra/newview/app_settings/shaders/class1/environment/waterFogF.glsl b/indra/newview/app_settings/shaders/class1/environment/waterFogF.glsl
index d44690d1fb..4bdfce9260 100644
--- a/indra/newview/app_settings/shaders/class1/environment/waterFogF.glsl
+++ b/indra/newview/app_settings/shaders/class1/environment/waterFogF.glsl
@@ -25,16 +25,50 @@
+uniform vec4 lightnorm;
+uniform vec4 waterPlane;
+uniform vec4 waterFogColor;
+uniform float waterFogDensity;
+uniform float waterFogKS;
+
+vec3 getPositionEye();
+
vec4 applyWaterFog(vec4 color)
{
- // GL_EXP2 Fog
- //float fog = exp(-gl_Fog.density * gl_Fog.density * gl_FogFragCoord * gl_FogFragCoord);
- // GL_EXP Fog
- // float fog = exp(-gl_Fog.density * gl_FogFragCoord);
- // GL_LINEAR Fog
- float fog = (gl_Fog.end - gl_FogFragCoord) * gl_Fog.scale;
- fog = clamp(fog, 0.0, 1.0);
- color.rgb = mix(gl_Fog.color.rgb, color.rgb, fog);
+ //normalize view vector
+ vec3 view = normalize(getPositionEye());
+ float es = -(dot(view, waterPlane.xyz));
+
+ //find intersection point with water plane and eye vector
+
+ //get eye depth
+ float e0 = max(-waterPlane.w, 0.0);
+
+ vec3 int_v = waterPlane.w > 0.0 ? view * waterPlane.w/es : vec3(0.0, 0.0, 0.0);
+
+ //get object depth
+ float depth = length(getPositionEye() - int_v);
+
+ //get "thickness" of water
+ float l = max(depth, 0.1);
+
+ float kd = waterFogDensity;
+ float ks = waterFogKS;
+ vec4 kc = waterFogColor;
+
+ float F = 0.98;
+
+ float t1 = -kd * pow(F, ks * e0);
+ float t2 = kd + ks * es;
+ float t3 = pow(F, t2*l) - 1.0;
+
+ float L = min(t1/t2*t3, 1.0);
+
+ float D = pow(0.98, l*kd);
+
+ color.rgb = color.rgb * D + kc.rgb * L;
+ color.a = kc.a + color.a;
+
return color;
}
diff --git a/indra/newview/app_settings/shaders/class1/environment/waterV.glsl b/indra/newview/app_settings/shaders/class1/environment/waterV.glsl
index 610c06fbbc..f66ba1d2d9 100644
--- a/indra/newview/app_settings/shaders/class1/environment/waterV.glsl
+++ b/indra/newview/app_settings/shaders/class1/environment/waterV.glsl
@@ -22,8 +22,11 @@
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
-
+uniform mat4 modelview_matrix;
+uniform mat4 modelview_projection_matrix;
+
+ATTRIBUTE vec3 position;
void calcAtmospherics(vec3 inPositionEye);
@@ -33,9 +36,9 @@ uniform float time;
uniform vec3 eyeVec;
uniform float waterHeight;
-varying vec4 refCoord;
-varying vec4 littleWave;
-varying vec4 view;
+VARYING vec4 refCoord;
+VARYING vec4 littleWave;
+VARYING vec4 view;
float wave(vec2 v, float t, float f, vec2 d, float s)
{
@@ -45,8 +48,7 @@ float wave(vec2 v, float t, float f, vec2 d, float s)
void main()
{
//transform vertex
- vec4 position = gl_Vertex;
- mat4 modelViewProj = gl_ModelViewProjectionMatrix;
+ mat4 modelViewProj = modelview_projection_matrix;
vec4 oPosition;
@@ -57,27 +59,29 @@ void main()
float d = length(oEyeVec.xy);
float ld = min(d, 2560.0);
- position.xy = eyeVec.xy + oEyeVec.xy/d*ld;
+ vec3 lpos = position;
+ lpos.xy = eyeVec.xy + oEyeVec.xy/d*ld;
view.xyz = oEyeVec;
d = clamp(ld/1536.0-0.5, 0.0, 1.0);
d *= d;
- oPosition = position;
+ oPosition = vec4(lpos, 1.0);
oPosition.z = mix(oPosition.z, max(eyeVec.z*0.75, 0.0), d);
oPosition = modelViewProj * oPosition;
refCoord.xyz = oPosition.xyz + vec3(0,0,0.2);
//get wave position parameter (create sweeping horizontal waves)
- vec3 v = position.xyz;
+ vec3 v = lpos;
v.x += (cos(v.x*0.08/*+time*0.01*/)+sin(v.y*0.02))*6.0;
//push position for further horizon effect.
- position.xyz = oEyeVec.xyz*(waterHeight/oEyeVec.z);
- position.w = 1.0;
- position = position*gl_ModelViewMatrix;
+ vec4 pos;
+ pos.xyz = oEyeVec.xyz*(waterHeight/oEyeVec.z);
+ pos.w = 1.0;
+ pos = modelview_matrix*pos;
- calcAtmospherics((gl_ModelViewMatrix * gl_Vertex).xyz);
+ calcAtmospherics(pos.xyz);
//pass wave parameters to pixel shader
diff --git a/indra/newview/app_settings/shaders/class1/interface/alphamaskF.glsl b/indra/newview/app_settings/shaders/class1/interface/alphamaskF.glsl
new file mode 100644
index 0000000000..d2f5e1987a
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/interface/alphamaskF.glsl
@@ -0,0 +1,46 @@
+/**
+ * @file alphamaskF.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 gl_FragColor;
+#endif
+
+uniform sampler2D diffuseMap;
+
+uniform float minimum_alpha;
+
+VARYING vec2 vary_texcoord0;
+VARYING vec4 vertex_color;
+
+void main()
+{
+ vec4 col = vertex_color*texture2D(diffuseMap, vary_texcoord0.xy);
+ if (col.a < minimum_alpha)
+ {
+ discard;
+ }
+
+ gl_FragColor = col;
+}
diff --git a/indra/newview/app_settings/shaders/class1/interface/alphamaskV.glsl b/indra/newview/app_settings/shaders/class1/interface/alphamaskV.glsl
new file mode 100644
index 0000000000..3580d1f27b
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/interface/alphamaskV.glsl
@@ -0,0 +1,42 @@
+/**
+ * @file alphamaskV.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+uniform mat4 texture_matrix0;
+uniform mat4 modelview_projection_matrix;
+
+ATTRIBUTE vec3 position;
+ATTRIBUTE vec4 diffuse_color;
+ATTRIBUTE vec2 texcoord0;
+
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+
+void main()
+{
+ gl_Position = modelview_projection_matrix * vec4(position, 1);
+ vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy;
+ vertex_color = diffuse_color;
+}
+
diff --git a/indra/newview/app_settings/shaders/class1/interface/customalphaF.glsl b/indra/newview/app_settings/shaders/class1/interface/customalphaF.glsl
index 27c63fdc8b..4b481ba834 100644
--- a/indra/newview/app_settings/shaders/class1/interface/customalphaF.glsl
+++ b/indra/newview/app_settings/shaders/class1/interface/customalphaF.glsl
@@ -22,14 +22,21 @@
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
-
+
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 gl_FragColor;
+#endif
+
uniform sampler2D diffuseMap;
uniform float custom_alpha;
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+
void main()
{
- vec4 color = gl_Color*texture2D(diffuseMap, gl_TexCoord[0].xy);
+ vec4 color = vertex_color*texture2D(diffuseMap, vary_texcoord0.xy);
color.a *= custom_alpha;
gl_FragColor = color;
}
diff --git a/indra/newview/app_settings/shaders/class1/interface/customalphaV.glsl b/indra/newview/app_settings/shaders/class1/interface/customalphaV.glsl
index c4c896c35c..890474d6d8 100644
--- a/indra/newview/app_settings/shaders/class1/interface/customalphaV.glsl
+++ b/indra/newview/app_settings/shaders/class1/interface/customalphaV.glsl
@@ -22,13 +22,20 @@
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
-
+uniform mat4 modelview_projection_matrix;
+
+ATTRIBUTE vec3 position;
+ATTRIBUTE vec4 diffuse_color;
+ATTRIBUTE vec2 texcoord0;
+
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
void main()
{
- gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
- gl_TexCoord[0] = gl_MultiTexCoord0;
- gl_FrontColor = gl_Color;
+ gl_Position = modelview_projection_matrix * vec4(position.xyz, 1.0);
+ vary_texcoord0 = texcoord0;
+ vertex_color = diffuse_color;
}
diff --git a/indra/newview/app_settings/shaders/class1/interface/debugF.glsl b/indra/newview/app_settings/shaders/class1/interface/debugF.glsl
new file mode 100644
index 0000000000..6bcc97ba18
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/interface/debugF.glsl
@@ -0,0 +1,35 @@
+/**
+ * @file debugF.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 gl_FragColor;
+#endif
+
+uniform vec4 color;
+
+void main()
+{
+ gl_FragColor = color;
+}
diff --git a/indra/newview/app_settings/shaders/class1/interface/debugV.glsl b/indra/newview/app_settings/shaders/class1/interface/debugV.glsl
new file mode 100644
index 0000000000..f4d704577a
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/interface/debugV.glsl
@@ -0,0 +1,34 @@
+/**
+ * @file debugV.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+uniform mat4 modelview_projection_matrix;
+
+ATTRIBUTE vec3 position;
+
+void main()
+{
+ gl_Position = modelview_projection_matrix * vec4(position.xyz, 1.0);
+}
+
diff --git a/indra/newview/app_settings/shaders/class1/interface/glowcombineF.glsl b/indra/newview/app_settings/shaders/class1/interface/glowcombineF.glsl
index b8963e1dec..f67703b839 100644
--- a/indra/newview/app_settings/shaders/class1/interface/glowcombineF.glsl
+++ b/indra/newview/app_settings/shaders/class1/interface/glowcombineF.glsl
@@ -22,14 +22,21 @@
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
-
+
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 gl_FragColor;
+#endif
+
#extension GL_ARB_texture_rectangle : enable
uniform sampler2D glowMap;
uniform sampler2DRect screenMap;
+VARYING vec2 vary_texcoord0;
+VARYING vec2 vary_texcoord1;
+
void main()
{
- gl_FragColor = texture2D(glowMap, gl_TexCoord[0].xy) +
- texture2DRect(screenMap, gl_TexCoord[1].xy);
+ gl_FragColor = texture2D(glowMap, vary_texcoord0.xy) +
+ texture2DRect(screenMap, vary_texcoord1.xy);
}
diff --git a/indra/newview/app_settings/shaders/class1/interface/glowcombineFXAAF.glsl b/indra/newview/app_settings/shaders/class1/interface/glowcombineFXAAF.glsl
new file mode 100644
index 0000000000..c66a6e5b48
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/interface/glowcombineFXAAF.glsl
@@ -0,0 +1,42 @@
+/**
+ * @file glowcombineFXAAF.glsl
+ *
+ * $LicenseInfo:firstyear=2005&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2005, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#extension GL_ARB_texture_rectangle : enable
+
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 gl_FragColor;
+#endif
+
+uniform sampler2DRect diffuseRect;
+
+uniform vec2 screen_res;
+VARYING vec2 vary_tc;
+
+void main()
+{
+ vec3 col = texture2DRect(diffuseRect, vary_tc*screen_res).rgb;
+
+ gl_FragColor = vec4(col.rgb, dot(col.rgb, vec3(0.299, 0.587, 0.144)));
+}
diff --git a/indra/newview/app_settings/shaders/class1/interface/glowcombineFXAAV.glsl b/indra/newview/app_settings/shaders/class1/interface/glowcombineFXAAV.glsl
new file mode 100644
index 0000000000..058f3b1b82
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/interface/glowcombineFXAAV.glsl
@@ -0,0 +1,39 @@
+/**
+ * @file glowcombineFXAAV.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+uniform mat4 modelview_projection_matrix;
+
+ATTRIBUTE vec3 position;
+
+VARYING vec2 vary_tc;
+
+void main()
+{
+ vec4 pos = modelview_projection_matrix*vec4(position.xyz, 1.0);
+ gl_Position = pos;
+
+ vary_tc = pos.xy*0.5+0.5;
+}
+
diff --git a/indra/newview/app_settings/shaders/class1/interface/glowcombineV.glsl b/indra/newview/app_settings/shaders/class1/interface/glowcombineV.glsl
index 4c6360f71d..f7970b7f78 100644
--- a/indra/newview/app_settings/shaders/class1/interface/glowcombineV.glsl
+++ b/indra/newview/app_settings/shaders/class1/interface/glowcombineV.glsl
@@ -22,12 +22,20 @@
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
-
+
+uniform mat4 modelview_projection_matrix;
+
+ATTRIBUTE vec3 position;
+ATTRIBUTE vec2 texcoord0;
+ATTRIBUTE vec2 texcoord1;
+
+VARYING vec2 vary_texcoord0;
+VARYING vec2 vary_texcoord1;
void main()
{
- gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
- gl_TexCoord[0] = gl_MultiTexCoord0;
- gl_TexCoord[1] = gl_MultiTexCoord1;
+ gl_Position = modelview_projection_matrix * vec4(position.xyz, 1.0);
+ vary_texcoord0 = texcoord0;
+ vary_texcoord1 = texcoord1;
}
diff --git a/indra/newview/app_settings/shaders/class1/interface/highlightF.glsl b/indra/newview/app_settings/shaders/class1/interface/highlightF.glsl
index a3cb5225ba..ecbc30f05f 100644
--- a/indra/newview/app_settings/shaders/class1/interface/highlightF.glsl
+++ b/indra/newview/app_settings/shaders/class1/interface/highlightF.glsl
@@ -23,11 +23,16 @@
* $/LicenseInfo$
*/
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 gl_FragColor;
+#endif
-
+uniform vec4 color;
uniform sampler2D diffuseMap;
+VARYING vec2 vary_texcoord0;
+
void main()
{
- gl_FragColor = gl_Color*texture2D(diffuseMap, gl_TexCoord[0].xy);
+ gl_FragColor = color*texture2D(diffuseMap, vary_texcoord0.xy);
}
diff --git a/indra/newview/app_settings/shaders/class1/interface/highlightV.glsl b/indra/newview/app_settings/shaders/class1/interface/highlightV.glsl
index da3bea6d06..9bf7b60eb7 100644
--- a/indra/newview/app_settings/shaders/class1/interface/highlightV.glsl
+++ b/indra/newview/app_settings/shaders/class1/interface/highlightV.glsl
@@ -22,24 +22,19 @@
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
-
+uniform mat4 texture_matrix0;
+uniform mat4 modelview_projection_matrix;
+
+ATTRIBUTE vec3 position;
+ATTRIBUTE vec2 texcoord0;
+
+VARYING vec2 vary_texcoord0;
void main()
{
//transform vertex
- gl_Position = ftransform();
- vec3 pos = (gl_ModelViewMatrix * gl_Vertex).xyz;
- pos = normalize(pos);
- float d = dot(pos, normalize(gl_NormalMatrix * gl_Normal));
- d *= d;
- d = 1.0 - d;
- d *= d;
-
- d = min(d, gl_Color.a*2.0);
-
- gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
- gl_FrontColor.rgb = gl_Color.rgb;
- gl_FrontColor.a = max(d, gl_Color.a);
+ gl_Position = modelview_projection_matrix * vec4(position.xyz, 1.0);
+ vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy;
}
diff --git a/indra/newview/app_settings/shaders/class1/interface/occlusionF.glsl b/indra/newview/app_settings/shaders/class1/interface/occlusionF.glsl
index 57248699cb..85f819f4c2 100644
--- a/indra/newview/app_settings/shaders/class1/interface/occlusionF.glsl
+++ b/indra/newview/app_settings/shaders/class1/interface/occlusionF.glsl
@@ -23,6 +23,10 @@
* $/LicenseInfo$
*/
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 gl_FragColor;
+#endif
+
void main()
{
gl_FragColor = vec4(1,1,1,1);
diff --git a/indra/newview/app_settings/shaders/class1/interface/occlusionV.glsl b/indra/newview/app_settings/shaders/class1/interface/occlusionV.glsl
index 915e452e0f..c26fa08ddc 100644
--- a/indra/newview/app_settings/shaders/class1/interface/occlusionV.glsl
+++ b/indra/newview/app_settings/shaders/class1/interface/occlusionV.glsl
@@ -23,8 +23,12 @@
* $/LicenseInfo$
*/
+uniform mat4 modelview_projection_matrix;
+
+ATTRIBUTE vec3 position;
+
void main()
{
- gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
+ gl_Position = modelview_projection_matrix * vec4(position.xyz, 1.0);
}
diff --git a/indra/newview/app_settings/shaders/class1/interface/onetexturenocolorF.glsl b/indra/newview/app_settings/shaders/class1/interface/onetexturenocolorF.glsl
new file mode 100644
index 0000000000..fafeb5a7b4
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/interface/onetexturenocolorF.glsl
@@ -0,0 +1,37 @@
+/**
+ * @file onetexturenocolorF.glsl
+ *
+ * $LicenseInfo:firstyear=2005&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2005, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 gl_FragColor;
+#endif
+
+uniform sampler2D tex0;
+
+VARYING vec2 vary_texcoord0;
+
+void main()
+{
+ gl_FragColor = texture2D(tex0, vary_texcoord0.xy);
+}
diff --git a/indra/newview/app_settings/shaders/class1/interface/onetexturenocolorV.glsl b/indra/newview/app_settings/shaders/class1/interface/onetexturenocolorV.glsl
new file mode 100644
index 0000000000..6b9986c8d7
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/interface/onetexturenocolorV.glsl
@@ -0,0 +1,38 @@
+/**
+ * @file onetexturenocolorV.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+uniform mat4 modelview_projection_matrix;
+
+ATTRIBUTE vec3 position;
+ATTRIBUTE vec2 texcoord0;
+
+VARYING vec2 vary_texcoord0;
+
+void main()
+{
+ gl_Position = modelview_projection_matrix * vec4(position, 1);
+ vary_texcoord0 = texcoord0;
+}
+
diff --git a/indra/newview/app_settings/shaders/class1/interface/solidcolorF.glsl b/indra/newview/app_settings/shaders/class1/interface/solidcolorF.glsl
index b1d2b949ac..f790122749 100644
--- a/indra/newview/app_settings/shaders/class1/interface/solidcolorF.glsl
+++ b/indra/newview/app_settings/shaders/class1/interface/solidcolorF.glsl
@@ -22,12 +22,19 @@
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
-
+
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 gl_FragColor;
+#endif
+
uniform sampler2D tex0;
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+
void main()
{
- float alpha = texture2D(tex0, gl_TexCoord[0].xy).a * gl_Color.a;
+ float alpha = texture2D(tex0, vary_texcoord0.xy).a * vertex_color.a;
- gl_FragColor = vec4(gl_Color.rgb, alpha);
+ gl_FragColor = vec4(vertex_color.rgb, alpha);
}
diff --git a/indra/newview/app_settings/shaders/class1/interface/solidcolorV.glsl b/indra/newview/app_settings/shaders/class1/interface/solidcolorV.glsl
index fedf6ae546..c58f9dfdaf 100644
--- a/indra/newview/app_settings/shaders/class1/interface/solidcolorV.glsl
+++ b/indra/newview/app_settings/shaders/class1/interface/solidcolorV.glsl
@@ -22,13 +22,20 @@
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
+
+uniform mat4 modelview_projection_matrix;
+ATTRIBUTE vec3 position;
+ATTRIBUTE vec4 diffuse_color;
+ATTRIBUTE vec2 texcoord0;
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
void main()
{
- gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
- gl_FrontColor = gl_Color;
- gl_TexCoord[0] = gl_MultiTexCoord0;
+ gl_Position = modelview_projection_matrix * vec4(position.xyz, 1.0);
+ vertex_color = diffuse_color;
+ vary_texcoord0 = texcoord0;
}
diff --git a/indra/newview/app_settings/shaders/class1/interface/splattexturerectF.glsl b/indra/newview/app_settings/shaders/class1/interface/splattexturerectF.glsl
new file mode 100644
index 0000000000..a0bb255cfa
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/interface/splattexturerectF.glsl
@@ -0,0 +1,40 @@
+/**
+ * @file splattexturerectF.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#extension GL_ARB_texture_rectangle : enable
+
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 gl_FragColor;
+#endif
+
+uniform sampler2DRect screenMap;
+
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+
+void main()
+{
+ gl_FragColor = texture2DRect(screenMap, vary_texcoord0.xy) * vertex_color;
+}
diff --git a/indra/newview/app_settings/shaders/class1/interface/splattexturerectV.glsl b/indra/newview/app_settings/shaders/class1/interface/splattexturerectV.glsl
new file mode 100644
index 0000000000..641d670c26
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/interface/splattexturerectV.glsl
@@ -0,0 +1,41 @@
+/**
+ * @file splattexturerectV.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+uniform mat4 modelview_projection_matrix;
+
+ATTRIBUTE vec3 position;
+ATTRIBUTE vec2 texcoord0;
+ATTRIBUTE vec4 diffuse_color;
+
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+
+void main()
+{
+ gl_Position = modelview_projection_matrix * vec4(position.xyz, 1.0);
+ vary_texcoord0 = texcoord0;
+ vertex_color = diffuse_color;
+}
+
diff --git a/indra/newview/app_settings/shaders/class1/interface/twotextureaddF.glsl b/indra/newview/app_settings/shaders/class1/interface/twotextureaddF.glsl
index 3408cc44f8..cdb48163dd 100644
--- a/indra/newview/app_settings/shaders/class1/interface/twotextureaddF.glsl
+++ b/indra/newview/app_settings/shaders/class1/interface/twotextureaddF.glsl
@@ -22,11 +22,18 @@
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
-
+
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 gl_FragColor;
+#endif
+
uniform sampler2D tex0;
uniform sampler2D tex1;
+VARYING vec2 vary_texcoord0;
+VARYING vec2 vary_texcoord1;
+
void main()
{
- gl_FragColor = texture2D(tex0, gl_TexCoord[0].xy)+texture2D(tex1, gl_TexCoord[1].xy);
+ gl_FragColor = texture2D(tex0, vary_texcoord0.xy)+texture2D(tex1, vary_texcoord1.xy);
}
diff --git a/indra/newview/app_settings/shaders/class1/interface/twotextureaddV.glsl b/indra/newview/app_settings/shaders/class1/interface/twotextureaddV.glsl
index 94aa964be6..3c2f297f7f 100644
--- a/indra/newview/app_settings/shaders/class1/interface/twotextureaddV.glsl
+++ b/indra/newview/app_settings/shaders/class1/interface/twotextureaddV.glsl
@@ -23,12 +23,19 @@
* $/LicenseInfo$
*/
+uniform mat4 modelview_projection_matrix;
+ATTRIBUTE vec3 position;
+ATTRIBUTE vec2 texcoord0;
+ATTRIBUTE vec2 texcoord1;
+
+VARYING vec2 vary_texcoord0;
+VARYING vec2 vary_texcoord1;
void main()
{
- gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
- gl_TexCoord[0] = gl_MultiTexCoord0;
- gl_TexCoord[1] = gl_MultiTexCoord1;
+ gl_Position = modelview_projection_matrix * vec4(position.xyz, 1.0);
+ vary_texcoord0 = texcoord0;
+ vary_texcoord1 = texcoord1;
}
diff --git a/indra/newview/app_settings/shaders/class1/interface/uiF.glsl b/indra/newview/app_settings/shaders/class1/interface/uiF.glsl
index 7694056b08..36d6e06fc5 100644
--- a/indra/newview/app_settings/shaders/class1/interface/uiF.glsl
+++ b/indra/newview/app_settings/shaders/class1/interface/uiF.glsl
@@ -22,10 +22,17 @@
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
-
+
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 gl_FragColor;
+#endif
+
uniform sampler2D diffuseMap;
+VARYING vec2 vary_texcoord0;
+VARYING vec4 vertex_color;
+
void main()
{
- gl_FragColor = gl_Color*texture2D(diffuseMap, gl_TexCoord[0].xy);
+ gl_FragColor = vertex_color*texture2D(diffuseMap, vary_texcoord0.xy);
}
diff --git a/indra/newview/app_settings/shaders/class1/interface/uiV.glsl b/indra/newview/app_settings/shaders/class1/interface/uiV.glsl
index b1b90d0b5e..220dafef25 100644
--- a/indra/newview/app_settings/shaders/class1/interface/uiV.glsl
+++ b/indra/newview/app_settings/shaders/class1/interface/uiV.glsl
@@ -22,13 +22,21 @@
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
-
+uniform mat4 texture_matrix0;
+uniform mat4 modelview_projection_matrix;
+
+ATTRIBUTE vec3 position;
+ATTRIBUTE vec4 diffuse_color;
+ATTRIBUTE vec2 texcoord0;
+
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
void main()
{
- gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
- gl_TexCoord[0] = gl_MultiTexCoord0;
- gl_FrontColor = gl_Color;
+ gl_Position = modelview_projection_matrix * vec4(position, 1);
+ vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy;
+ vertex_color = diffuse_color;
}
diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightAlphaMaskF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightAlphaMaskF.glsl
new file mode 100644
index 0000000000..10413bdeb0
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/lighting/lightAlphaMaskF.glsl
@@ -0,0 +1,53 @@
+/**
+ * @file lightAlphaMaskF.glsl
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 gl_FragColor;
+#endif
+
+uniform float minimum_alpha;
+
+vec3 atmosLighting(vec3 light);
+vec3 scaleSoftClip(vec3 light);
+
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+
+void default_lighting()
+{
+ vec4 color = diffuseLookup(vary_texcoord0.xy) * vertex_color;
+
+ if (color.a < minimum_alpha)
+ {
+ discard;
+ }
+
+ color.rgb = atmosLighting(color.rgb);
+
+ color.rgb = scaleSoftClip(color.rgb);
+
+ gl_FragColor = color;
+}
+
diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightAlphaMaskNonIndexedF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightAlphaMaskNonIndexedF.glsl
new file mode 100644
index 0000000000..1164e5b0a6
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/lighting/lightAlphaMaskNonIndexedF.glsl
@@ -0,0 +1,55 @@
+/**
+ * @file lightAlphaMaskNonIndexedF.glsl
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 gl_FragColor;
+#endif
+
+uniform float minimum_alpha;
+
+uniform sampler2D diffuseMap;
+
+vec3 atmosLighting(vec3 light);
+vec3 scaleSoftClip(vec3 light);
+
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+
+void default_lighting()
+{
+ vec4 color = texture2D(diffuseMap,vary_texcoord0.xy) * vertex_color;
+
+ if (color.a < minimum_alpha)
+ {
+ discard;
+ }
+
+ color.rgb = atmosLighting(color.rgb);
+
+ color.rgb = scaleSoftClip(color.rgb);
+
+ gl_FragColor = color;
+}
+
diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightF.glsl
index 5cb3eb05a7..735f5b3813 100644
--- a/indra/newview/app_settings/shaders/class1/lighting/lightF.glsl
+++ b/indra/newview/app_settings/shaders/class1/lighting/lightF.glsl
@@ -22,14 +22,25 @@
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
-
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 gl_FragColor;
+#endif
-uniform sampler2D diffuseMap;
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+
+vec3 atmosLighting(vec3 light);
+vec3 scaleSoftClip(vec3 light);
void default_lighting()
{
- vec4 color = gl_Color * texture2D(diffuseMap, gl_TexCoord[0].xy);
+ vec4 color = diffuseLookup(vary_texcoord0.xy) * vertex_color;
+
+ color.rgb = atmosLighting(color.rgb);
+
+ color.rgb = scaleSoftClip(color.rgb);
+
gl_FragColor = color;
}
diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightAlphaMaskF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightAlphaMaskF.glsl
new file mode 100644
index 0000000000..ba99c0ed71
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightAlphaMaskF.glsl
@@ -0,0 +1,53 @@
+/**
+ * @file lightFullbrightAlphaMaskF.glsl
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 gl_FragColor;
+#endif
+
+uniform float minimum_alpha;
+
+vec3 fullbrightAtmosTransport(vec3 light);
+vec3 fullbrightScaleSoftClip(vec3 light);
+
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+
+void fullbright_lighting()
+{
+ vec4 color = diffuseLookup(vary_texcoord0.xy) * vertex_color;
+
+ if (color.a < minimum_alpha)
+ {
+ discard;
+ }
+
+ color.rgb = fullbrightAtmosTransport(color.rgb);
+
+ color.rgb = fullbrightScaleSoftClip(color.rgb);
+
+ gl_FragColor = color;
+}
+
diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightF.glsl
index f3ba8b73a8..c3edc0bd70 100644
--- a/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightF.glsl
+++ b/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightF.glsl
@@ -22,14 +22,25 @@
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
-
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 gl_FragColor;
+#endif
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
-uniform sampler2D diffuseMap;
+vec3 fullbrightAtmosTransport(vec3 light);
+vec3 fullbrightScaleSoftClip(vec3 light);
void fullbright_lighting()
{
- gl_FragColor = texture2D(diffuseMap, gl_TexCoord[0].xy);
+ vec4 color = diffuseLookup(vary_texcoord0.xy) * vertex_color;
+
+ color.rgb = fullbrightAtmosTransport(color.rgb);
+
+ color.rgb = fullbrightScaleSoftClip(color.rgb);
+
+ gl_FragColor = color;
}
diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightNonIndexedAlphaMaskF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightNonIndexedAlphaMaskF.glsl
new file mode 100644
index 0000000000..276fad4f44
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightNonIndexedAlphaMaskF.glsl
@@ -0,0 +1,55 @@
+/**
+ * @file lightFullbrightNonIndexedAlphaMaskF.glsl
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 gl_FragColor;
+#endif
+
+uniform float minimum_alpha;
+
+vec3 fullbrightAtmosTransport(vec3 light);
+vec3 fullbrightScaleSoftClip(vec3 light);
+
+uniform sampler2D diffuseMap;
+
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+
+void fullbright_lighting()
+{
+ vec4 color = texture2D(diffuseMap,vary_texcoord0.xy) * vertex_color;
+
+ if (color.a < minimum_alpha)
+ {
+ discard;
+ }
+
+ color.rgb = fullbrightAtmosTransport(color.rgb);
+
+ color.rgb = fullbrightScaleSoftClip(color.rgb);
+
+ gl_FragColor = color;
+}
+
diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightNonIndexedF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightNonIndexedF.glsl
new file mode 100644
index 0000000000..4e1e664e6b
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightNonIndexedF.glsl
@@ -0,0 +1,48 @@
+/**
+ * @file lightFullbrightF.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 gl_FragColor;
+#endif
+
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+
+vec3 fullbrightAtmosTransport(vec3 light);
+vec3 fullbrightScaleSoftClip(vec3 light);
+
+uniform sampler2D diffuseMap;
+
+void fullbright_lighting()
+{
+ vec4 color = texture2D(diffuseMap,vary_texcoord0.xy) * vertex_color;
+
+ color.rgb = fullbrightAtmosTransport(color.rgb);
+
+ color.rgb = fullbrightScaleSoftClip(color.rgb);
+
+ gl_FragColor = color;
+}
+
diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightShinyF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightShinyF.glsl
index b4c8a9abce..c981e9eba2 100644
--- a/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightShinyF.glsl
+++ b/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightShinyF.glsl
@@ -22,14 +22,34 @@
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
-
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 gl_FragColor;
+#endif
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+VARYING vec3 vary_texcoord1;
-uniform sampler2D diffuseMap;
uniform samplerCube environmentMap;
-void fullbright_shiny_lighting()
+vec3 fullbrightShinyAtmosTransport(vec3 light);
+vec3 fullbrightScaleSoftClip(vec3 light);
+
+void fullbright_shiny_lighting()
{
- gl_FragColor = texture2D(diffuseMap, gl_TexCoord[0].xy);
+ vec4 color = diffuseLookup(vary_texcoord0.xy);
+ color.rgb *= vertex_color.rgb;
+
+ vec3 envColor = textureCube(environmentMap, vary_texcoord1.xyz).rgb;
+ color.rgb = mix(color.rgb, envColor.rgb, vertex_color.a);
+
+ color.rgb = fullbrightShinyAtmosTransport(color.rgb);
+
+ color.rgb = fullbrightScaleSoftClip(color.rgb);
+
+ color.a = max(color.a, vertex_color.a);
+
+ gl_FragColor = color;
}
+
diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightShinyNonIndexedF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightShinyNonIndexedF.glsl
new file mode 100644
index 0000000000..a4893f0359
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightShinyNonIndexedF.glsl
@@ -0,0 +1,56 @@
+/**
+ * @file lightFullbrightShinyF.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 gl_FragColor;
+#endif
+
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+VARYING vec3 vary_texcoord1;
+
+uniform samplerCube environmentMap;
+uniform sampler2D diffuseMap;
+
+vec3 fullbrightShinyAtmosTransport(vec3 light);
+vec3 fullbrightScaleSoftClip(vec3 light);
+
+void fullbright_shiny_lighting()
+{
+ vec4 color = texture2D(diffuseMap, vary_texcoord0.xy);
+ color.rgb *= vertex_color.rgb;
+
+ vec3 envColor = textureCube(environmentMap, vary_texcoord1.xyz).rgb;
+ color.rgb = mix(color.rgb, envColor.rgb, vertex_color.a);
+
+ color.rgb = fullbrightShinyAtmosTransport(color.rgb);
+
+ color.rgb = fullbrightScaleSoftClip(color.rgb);
+
+ color.a = max(color.a, vertex_color.a);
+
+ gl_FragColor = color;
+}
+
diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightShinyWaterF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightShinyWaterF.glsl
index 925d6fbcfd..c10cde98e0 100644
--- a/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightShinyWaterF.glsl
+++ b/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightShinyWaterF.glsl
@@ -21,14 +21,33 @@
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
-
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 gl_FragColor;
+#endif
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+VARYING vec3 vary_texcoord1;
-uniform sampler2D diffuseMap;
uniform samplerCube environmentMap;
-void fullbright_shiny_lighting_water()
+vec3 fullbrightShinyAtmosTransport(vec3 light);
+vec3 fullbrightScaleSoftClip(vec3 light);
+vec4 applyWaterFog(vec4 color);
+
+void fullbright_shiny_lighting_water()
{
- gl_FragColor = texture2D(diffuseMap, gl_TexCoord[0].xy);
+ vec4 color = diffuseLookup(vary_texcoord0.xy);
+ color.rgb *= vertex_color.rgb;
+
+ vec3 envColor = textureCube(environmentMap, vary_texcoord1.xyz).rgb;
+ color.rgb = mix(color.rgb, envColor.rgb, vertex_color.a);
+
+ color.rgb = fullbrightShinyAtmosTransport(color.rgb);
+ color.rgb = fullbrightScaleSoftClip(color.rgb);
+ color.a = max(color.a, vertex_color.a);
+
+ gl_FragColor = applyWaterFog(color);
}
+
diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightShinyWaterNonIndexedF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightShinyWaterNonIndexedF.glsl
new file mode 100644
index 0000000000..e9b26087f4
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightShinyWaterNonIndexedF.glsl
@@ -0,0 +1,54 @@
+/**
+ * @file lightFullbrightShinyWaterF.glsl
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 gl_FragColor;
+#endif
+
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+VARYING vec3 vary_texcoord1;
+
+uniform samplerCube environmentMap;
+uniform sampler2D diffuseMap;
+
+vec3 fullbrightShinyAtmosTransport(vec3 light);
+vec3 fullbrightScaleSoftClip(vec3 light);
+vec4 applyWaterFog(vec4 color);
+
+void fullbright_shiny_lighting_water()
+{
+ vec4 color = texture2D(diffuseMap,vary_texcoord0.xy);
+ color.rgb *= vertex_color.rgb;
+
+ vec3 envColor = textureCube(environmentMap, vary_texcoord1.xyz).rgb;
+ color.rgb = mix(color.rgb, envColor.rgb, vertex_color.a);
+
+ color.rgb = fullbrightShinyAtmosTransport(color.rgb);
+ color.rgb = fullbrightScaleSoftClip(color.rgb);
+ color.a = max(color.a, vertex_color.a);
+
+ gl_FragColor = applyWaterFog(color);
+}
+
diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightWaterAlphaMaskF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightWaterAlphaMaskF.glsl
new file mode 100644
index 0000000000..754b2922d9
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightWaterAlphaMaskF.glsl
@@ -0,0 +1,53 @@
+/**
+ * @file lightFullbrightWaterAlphaMaskF.glsl
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 gl_FragColor;
+#endif
+
+uniform float minimum_alpha;
+
+vec4 diffuseLookup(vec2 texcoord);
+
+vec3 fullbrightAtmosTransport(vec3 light);
+vec4 applyWaterFog(vec4 color);
+
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+
+void fullbright_lighting_water()
+{
+ vec4 color = diffuseLookup(vary_texcoord0.xy) * vertex_color;
+
+ if (color.a < minimum_alpha)
+ {
+ discard;
+ }
+
+ color.rgb = fullbrightAtmosTransport(color.rgb);
+
+ gl_FragColor = applyWaterFog(color);
+}
+
diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightWaterF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightWaterF.glsl
index 71238f7d31..2547f9e750 100644
--- a/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightWaterF.glsl
+++ b/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightWaterF.glsl
@@ -23,13 +23,24 @@
* $/LicenseInfo$
*/
-
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 gl_FragColor;
+#endif
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
-uniform sampler2D diffuseMap;
+vec4 diffuseLookup(vec2 texcoord);
+
+vec3 fullbrightAtmosTransport(vec3 light);
+vec4 applyWaterFog(vec4 color);
void fullbright_lighting_water()
{
- gl_FragColor = texture2D(diffuseMap, gl_TexCoord[0].xy);
+ vec4 color = diffuseLookup(vary_texcoord0.xy) * vertex_color;
+
+ color.rgb = fullbrightAtmosTransport(color.rgb);
+
+ gl_FragColor = applyWaterFog(color);
}
diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightWaterNonIndexedAlphaMaskF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightWaterNonIndexedAlphaMaskF.glsl
new file mode 100644
index 0000000000..f69b907dc7
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightWaterNonIndexedAlphaMaskF.glsl
@@ -0,0 +1,53 @@
+/**
+ * @file lightFullbrightWaterNonIndexedAlphaMaskF.glsl
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 gl_FragColor;
+#endif
+
+uniform float minimum_alpha;
+
+uniform sampler2D diffuseMap;
+
+vec3 fullbrightAtmosTransport(vec3 light);
+vec4 applyWaterFog(vec4 color);
+
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+
+void fullbright_lighting_water()
+{
+ vec4 color = texture2D(diffuseMap, vary_texcoord0.xy) * vertex_color;
+
+ if (color.a < minimum_alpha)
+ {
+ discard;
+ }
+
+ color.rgb = fullbrightAtmosTransport(color.rgb);
+
+ gl_FragColor = applyWaterFog(color);
+}
+
diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightWaterNonIndexedF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightWaterNonIndexedF.glsl
new file mode 100644
index 0000000000..aa3ef8cdd9
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightWaterNonIndexedF.glsl
@@ -0,0 +1,46 @@
+/**
+ * @file lightFullbrightWaterF.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 gl_FragColor;
+#endif
+
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+
+uniform sampler2D diffuseMap;
+
+vec3 fullbrightAtmosTransport(vec3 light);
+vec4 applyWaterFog(vec4 color);
+
+void fullbright_lighting_water()
+{
+ vec4 color = texture2D(diffuseMap, vary_texcoord0.xy) * vertex_color;
+
+ color.rgb = fullbrightAtmosTransport(color.rgb);
+
+ gl_FragColor = applyWaterFog(color);
+}
+
diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightNonIndexedF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightNonIndexedF.glsl
new file mode 100644
index 0000000000..9f1a358b53
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/lighting/lightNonIndexedF.glsl
@@ -0,0 +1,48 @@
+/**
+ * @file lightF.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 gl_FragColor;
+#endif
+
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+
+uniform sampler2D diffuseMap;
+
+vec3 atmosLighting(vec3 light);
+vec3 scaleSoftClip(vec3 light);
+
+void default_lighting()
+{
+ vec4 color = texture2D(diffuseMap,vary_texcoord0.xy) * vertex_color;
+
+ color.rgb = atmosLighting(color.rgb);
+
+ color.rgb = scaleSoftClip(color.rgb);
+
+ gl_FragColor = color;
+}
+
diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightShinyF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightShinyF.glsl
index 7c9b7c218f..e9c27dbefd 100644
--- a/indra/newview/app_settings/shaders/class1/lighting/lightShinyF.glsl
+++ b/indra/newview/app_settings/shaders/class1/lighting/lightShinyF.glsl
@@ -22,16 +22,33 @@
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
-
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 gl_FragColor;
+#endif
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+VARYING vec3 vary_texcoord1;
-uniform sampler2D diffuseMap;
uniform samplerCube environmentMap;
-void shiny_lighting()
+vec3 scaleSoftClip(vec3 light);
+vec3 atmosLighting(vec3 light);
+vec4 applyWaterFog(vec4 color);
+
+void shiny_lighting()
{
- vec4 color = gl_Color * texture2D(diffuseMap, gl_TexCoord[0].xy);
+ vec4 color = diffuseLookup(vary_texcoord0.xy);
+ color.rgb *= vertex_color.rgb;
+
+ vec3 envColor = textureCube(environmentMap, vary_texcoord1.xyz).rgb;
+ color.rgb = mix(color.rgb, envColor.rgb, vertex_color.a);
+
+ color.rgb = atmosLighting(color.rgb);
+
+ color.rgb = scaleSoftClip(color.rgb);
+ color.a = max(color.a, vertex_color.a);
gl_FragColor = color;
}
diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightShinyNonIndexedF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightShinyNonIndexedF.glsl
new file mode 100644
index 0000000000..595ad74365
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/lighting/lightShinyNonIndexedF.glsl
@@ -0,0 +1,55 @@
+/**
+ * @file lightShinyF.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 gl_FragColor;
+#endif
+
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+VARYING vec3 vary_texcoord1;
+
+uniform samplerCube environmentMap;
+uniform sampler2D diffuseMap;
+
+vec3 scaleSoftClip(vec3 light);
+vec3 atmosLighting(vec3 light);
+vec4 applyWaterFog(vec4 color);
+
+void shiny_lighting()
+{
+ vec4 color = texture2D(diffuseMap,vary_texcoord0.xy);
+ color.rgb *= vertex_color.rgb;
+
+ vec3 envColor = textureCube(environmentMap, vary_texcoord1.xyz).rgb;
+ color.rgb = mix(color.rgb, envColor.rgb, vertex_color.a);
+
+ color.rgb = atmosLighting(color.rgb);
+
+ color.rgb = scaleSoftClip(color.rgb);
+ color.a = max(color.a, vertex_color.a);
+ gl_FragColor = color;
+}
+
diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightShinyWaterF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightShinyWaterF.glsl
index ca1af8fc79..68c727d62c 100644
--- a/indra/newview/app_settings/shaders/class1/lighting/lightShinyWaterF.glsl
+++ b/indra/newview/app_settings/shaders/class1/lighting/lightShinyWaterF.glsl
@@ -22,16 +22,30 @@
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
-
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 gl_FragColor;
+#endif
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+VARYING vec3 vary_texcoord1;
-uniform sampler2D diffuseMap;
uniform samplerCube environmentMap;
-void shiny_lighting_water()
+vec3 atmosLighting(vec3 light);
+vec4 applyWaterFog(vec4 color);
+
+void shiny_lighting_water()
{
- vec4 color = gl_Color * texture2D(diffuseMap, gl_TexCoord[0].xy);
- gl_FragColor = color;
+ vec4 color = diffuseLookup(vary_texcoord0.xy);
+ color.rgb *= vertex_color.rgb;
+
+ vec3 envColor = textureCube(environmentMap, vary_texcoord1.xyz).rgb;
+ color.rgb = mix(color.rgb, envColor.rgb, vertex_color.a);
+
+ color.rgb = atmosLighting(color.rgb);
+ color.a = max(color.a, vertex_color.a);
+ gl_FragColor = applyWaterFog(color);
}
diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightShinyWaterNonIndexedF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightShinyWaterNonIndexedF.glsl
new file mode 100644
index 0000000000..f32b9e1958
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/lighting/lightShinyWaterNonIndexedF.glsl
@@ -0,0 +1,52 @@
+/**
+ * @file lightShinyWaterF.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 gl_FragColor;
+#endif
+
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+VARYING vec3 vary_texcoord1;
+
+uniform sampler2D diffuseMap;
+uniform samplerCube environmentMap;
+
+vec3 atmosLighting(vec3 light);
+vec4 applyWaterFog(vec4 color);
+
+void shiny_lighting_water()
+{
+ vec4 color = texture2D(diffuseMap,vary_texcoord0.xy);
+ color.rgb *= vertex_color.rgb;
+
+ vec3 envColor = textureCube(environmentMap, vary_texcoord1.xyz).rgb;
+ color.rgb = mix(color.rgb, envColor.rgb, vertex_color.a);
+
+ color.rgb = atmosLighting(color.rgb);
+ color.a = max(color.a, vertex_color.a);
+ gl_FragColor = applyWaterFog(color);
+}
+
diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightSpecularV.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightSpecularV.glsl
index 4a59b8245d..24bf9b3cee 100644
--- a/indra/newview/app_settings/shaders/class1/lighting/lightSpecularV.glsl
+++ b/indra/newview/app_settings/shaders/class1/lighting/lightSpecularV.glsl
@@ -1,5 +1,5 @@
/**
- * @file lightV.glsl
+ * @file lightSpecularV.glsl
*
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* Second Life Viewer Source Code
@@ -25,22 +25,12 @@
-float calcDirectionalLight(vec3 n, vec3 l);
+// All lights, no specular highlights
+
+vec4 sumLightsSpecular(vec3 pos, vec3 norm, vec4 color, inout vec4 specularColor, vec4 baseCol);
-// Same as non-specular lighting in lightV.glsl
vec4 calcLightingSpecular(vec3 pos, vec3 norm, vec4 color, inout vec4 specularColor, vec4 baseCol)
{
- specularColor.rgb = vec3(0.0, 0.0, 0.0);
- vec4 col;
- col.a = color.a;
-
- col.rgb = gl_LightModel.ambient.rgb + baseCol.rgb;
-
- col.rgb += gl_LightSource[0].diffuse.rgb*calcDirectionalLight(norm, gl_LightSource[0].position.xyz);
- col.rgb += gl_LightSource[1].diffuse.rgb*calcDirectionalLight(norm, gl_LightSource[1].position.xyz);
-
- col.rgb = min(col.rgb*color.rgb, 1.0);
-
- return col;
+ return sumLightsSpecular(pos, norm, color, specularColor, baseCol);
}
diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightV.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightV.glsl
index 742cb38d80..8045809b82 100644
--- a/indra/newview/app_settings/shaders/class1/lighting/lightV.glsl
+++ b/indra/newview/app_settings/shaders/class1/lighting/lightV.glsl
@@ -25,20 +25,12 @@
-float calcDirectionalLight(vec3 n, vec3 l);
+// All lights, no specular highlights
+
+vec4 sumLights(vec3 pos, vec3 norm, vec4 color, vec4 baseLight);
vec4 calcLighting(vec3 pos, vec3 norm, vec4 color, vec4 baseLight)
{
- vec4 col;
- col.a = color.a;
-
- col.rgb = gl_LightModel.ambient.rgb + baseLight.rgb;
-
- col.rgb += gl_LightSource[0].diffuse.rgb*calcDirectionalLight(norm, gl_LightSource[0].position.xyz);
- col.rgb += gl_LightSource[1].diffuse.rgb*calcDirectionalLight(norm, gl_LightSource[1].position.xyz);
-
- col.rgb = min(col.rgb*color.rgb, 1.0);
-
- return col;
+ return sumLights(pos, norm, color, baseLight);
}
diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightWaterAlphaMaskF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightWaterAlphaMaskF.glsl
new file mode 100644
index 0000000000..103dd633c9
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/lighting/lightWaterAlphaMaskF.glsl
@@ -0,0 +1,51 @@
+/**
+ * @file lightWaterAlphaMaskF.glsl
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 gl_FragColor;
+#endif
+
+uniform float minimum_alpha;
+
+vec3 atmosLighting(vec3 light);
+vec4 applyWaterFog(vec4 color);
+
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+
+void default_lighting_water()
+{
+ vec4 color = diffuseLookup(vary_texcoord0.xy) * vertex_color;
+
+ if (color.a < minimum_alpha)
+ {
+ discard;
+ }
+
+ color.rgb = atmosLighting(color.rgb);
+
+ gl_FragColor = applyWaterFog(color);
+}
+
diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightWaterAlphaMaskNonIndexedF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightWaterAlphaMaskNonIndexedF.glsl
new file mode 100644
index 0000000000..bef72752da
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/lighting/lightWaterAlphaMaskNonIndexedF.glsl
@@ -0,0 +1,55 @@
+/**
+ * @file lightWaterAlphaMaskNonIndexedF.glsl
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 gl_FragColor;
+#endif
+
+uniform float minimum_alpha;
+
+uniform sampler2D diffuseMap;
+
+vec3 atmosLighting(vec3 light);
+vec4 applyWaterFog(vec4 color);
+
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+
+void default_lighting_water()
+{
+ vec4 color = texture2D(diffuseMap,vary_texcoord0.xy) * vertex_color;
+
+ if (color.a < minimum_alpha)
+ {
+ discard;
+ }
+
+ color.rgb = atmosLighting(color.rgb);
+
+ color = applyWaterFog(color);
+
+ gl_FragColor = color;
+}
+
diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightWaterF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightWaterF.glsl
index da76a977b6..e9537d1e9d 100644
--- a/indra/newview/app_settings/shaders/class1/lighting/lightWaterF.glsl
+++ b/indra/newview/app_settings/shaders/class1/lighting/lightWaterF.glsl
@@ -22,14 +22,23 @@
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
-
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 gl_FragColor;
+#endif
-uniform sampler2D diffuseMap;
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
-void default_lighting_water()
+vec3 atmosLighting(vec3 light);
+vec4 applyWaterFog(vec4 color);
+
+void default_lighting_water()
{
- vec4 color = gl_Color * texture2D(diffuseMap, gl_TexCoord[0].xy);
- gl_FragColor = color;
+ vec4 color = diffuseLookup(vary_texcoord0.xy) * vertex_color;
+
+ color.rgb = atmosLighting(color.rgb);
+
+ gl_FragColor = applyWaterFog(color);
}
diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightWaterNonIndexedF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightWaterNonIndexedF.glsl
new file mode 100644
index 0000000000..8b0c25b705
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/lighting/lightWaterNonIndexedF.glsl
@@ -0,0 +1,46 @@
+/**
+ * @file lightWaterF.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 gl_FragColor;
+#endif
+
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+
+uniform sampler2D diffuseMap;
+
+vec3 atmosLighting(vec3 light);
+vec4 applyWaterFog(vec4 color);
+
+void default_lighting_water()
+{
+ vec4 color = texture2D(diffuseMap,vary_texcoord0.xy) * vertex_color;
+
+ color.rgb = atmosLighting(color.rgb);
+
+ gl_FragColor = applyWaterFog(color);
+}
+
diff --git a/indra/newview/app_settings/shaders/class1/lighting/sumLightsSpecularV.glsl b/indra/newview/app_settings/shaders/class1/lighting/sumLightsSpecularV.glsl
index 3e0815226c..7059ff31ae 100644
--- a/indra/newview/app_settings/shaders/class1/lighting/sumLightsSpecularV.glsl
+++ b/indra/newview/app_settings/shaders/class1/lighting/sumLightsSpecularV.glsl
@@ -31,21 +31,22 @@ vec3 atmosAffectDirectionalLight(float lightIntensity);
vec3 atmosGetDiffuseSunlightColor();
vec3 scaleDownLight(vec3 light);
+uniform vec4 light_position[8];
+uniform vec3 light_diffuse[8];
+
vec4 sumLightsSpecular(vec3 pos, vec3 norm, vec4 color, inout vec4 specularColor, vec4 baseCol)
{
- vec4 col;
- col.a = color.a;
-
-
+ vec4 col = vec4(0,0,0, color.a);
+
vec3 view = normalize(pos);
/// collect all the specular values from each calcXXXLightSpecular() function
vec4 specularSum = vec4(0.0);
- col.rgb = gl_LightSource[1].diffuse.rgb * calcDirectionalLightSpecular(specularColor, view, norm, gl_LightSource[1].position.xyz, gl_LightSource[1].diffuse.rgb, 1.0);
+ col.rgb += light_diffuse[1].rgb * calcDirectionalLightSpecular(specularColor, view, norm, light_position[1].xyz,light_diffuse[1].rgb, 1.0);
col.rgb = scaleDownLight(col.rgb);
col.rgb += atmosAmbient(baseCol.rgb);
- col.rgb += atmosAffectDirectionalLight(calcDirectionalLightSpecular(specularSum, view, norm, gl_LightSource[0].position.xyz,atmosGetDiffuseSunlightColor() * baseCol.a, 1.0));
+ col.rgb += atmosAffectDirectionalLight(calcDirectionalLightSpecular(specularSum, view, norm, light_position[0].xyz,atmosGetDiffuseSunlightColor()*baseCol.a, 1.0));
col.rgb = min(col.rgb * color.rgb, 1.0);
specularColor.rgb = min(specularColor.rgb * specularSum.rgb, 1.0);
diff --git a/indra/newview/app_settings/shaders/class1/lighting/sumLightsV.glsl b/indra/newview/app_settings/shaders/class1/lighting/sumLightsV.glsl
index c271dbcd18..41288c21c1 100644
--- a/indra/newview/app_settings/shaders/class1/lighting/sumLightsV.glsl
+++ b/indra/newview/app_settings/shaders/class1/lighting/sumLightsV.glsl
@@ -23,7 +23,8 @@
* $/LicenseInfo$
*/
-
+uniform vec4 light_position[8];
+uniform vec3 light_diffuse[8];
float calcDirectionalLight(vec3 n, vec3 l);
@@ -36,10 +37,10 @@ vec4 sumLights(vec3 pos, vec3 norm, vec4 color, vec4 baseLight)
vec4 col;
col.a = color.a;
- col.rgb = gl_LightSource[1].diffuse.rgb * calcDirectionalLight(norm, gl_LightSource[1].position.xyz);
+ col.rgb = light_diffuse[1].rgb * calcDirectionalLight(norm, light_position[1].xyz);
col.rgb = scaleDownLight(col.rgb);
col.rgb += atmosAmbient(baseLight.rgb);
- col.rgb += atmosAffectDirectionalLight(calcDirectionalLight(norm, gl_LightSource[0].position.xyz));
+ col.rgb += atmosAffectDirectionalLight(calcDirectionalLight(norm, light_position[0].xyz));
col.rgb = min(col.rgb*color.rgb, 1.0);
diff --git a/indra/newview/app_settings/shaders/class1/objects/bumpF.glsl b/indra/newview/app_settings/shaders/class1/objects/bumpF.glsl
index 11031a8829..4b85d61aca 100644
--- a/indra/newview/app_settings/shaders/class1/objects/bumpF.glsl
+++ b/indra/newview/app_settings/shaders/class1/objects/bumpF.glsl
@@ -22,14 +22,21 @@
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
-
+
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 gl_FragColor;
+#endif
+
uniform sampler2D texture0;
uniform sampler2D texture1;
+VARYING vec2 vary_texcoord0;
+VARYING vec2 vary_texcoord1;
+
void main()
{
- float tex0 = texture2D(texture0, gl_TexCoord[0].xy).a;
- float tex1 = texture2D(texture1, gl_TexCoord[1].xy).a;
+ float tex0 = texture2D(texture0, vary_texcoord0.xy).a;
+ float tex1 = texture2D(texture1, vary_texcoord1.xy).a;
gl_FragColor = vec4(tex0+(1.0-tex1)-0.5);
}
diff --git a/indra/newview/app_settings/shaders/class1/objects/bumpV.glsl b/indra/newview/app_settings/shaders/class1/objects/bumpV.glsl
index c50ed86315..a7738087dc 100644
--- a/indra/newview/app_settings/shaders/class1/objects/bumpV.glsl
+++ b/indra/newview/app_settings/shaders/class1/objects/bumpV.glsl
@@ -22,13 +22,21 @@
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
-
+
+uniform mat4 texture_matrix0;
+uniform mat4 modelview_projection_matrix;
+
+ATTRIBUTE vec3 position;
+ATTRIBUTE vec2 texcoord0;
+ATTRIBUTE vec2 texcoord1;
+
+VARYING vec2 vary_texcoord0;
+VARYING vec2 vary_texcoord1;
void main()
{
//transform vertex
- gl_Position = gl_ModelViewProjectionMatrix*gl_Vertex;
- gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
- gl_TexCoord[1] = gl_TextureMatrix[1] * gl_MultiTexCoord1;
- gl_FrontColor = gl_Color;
+ gl_Position = modelview_projection_matrix*vec4(position.xyz, 1.0);
+ vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy;
+ vary_texcoord1 = (texture_matrix0 * vec4(texcoord1,0,1)).xy;
}
diff --git a/indra/newview/app_settings/shaders/class1/objects/emissiveSkinnedV.glsl b/indra/newview/app_settings/shaders/class1/objects/emissiveSkinnedV.glsl
new file mode 100644
index 0000000000..8494ffba52
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/objects/emissiveSkinnedV.glsl
@@ -0,0 +1,58 @@
+/**
+ * @file emissiveSkinnedV.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+uniform mat4 projection_matrix;
+uniform mat4 texture_matrix0;
+uniform mat4 modelview_matrix;
+
+ATTRIBUTE vec3 position;
+ATTRIBUTE vec4 emissive;
+ATTRIBUTE vec2 texcoord0;
+
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+
+
+void calcAtmospherics(vec3 inPositionEye);
+mat4 getObjectSkinnedTransform();
+
+void main()
+{
+ //transform vertex
+ vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy;
+
+ mat4 mat = getObjectSkinnedTransform();
+
+ mat = modelview_matrix * mat;
+ vec3 pos = (mat*vec4(position.xyz, 1.0)).xyz;
+
+ calcAtmospherics(pos.xyz);
+
+ vertex_color = emissive;
+
+ gl_Position = projection_matrix*vec4(pos, 1.0);
+
+
+}
diff --git a/indra/newview/app_settings/shaders/class1/objects/emissiveV.glsl b/indra/newview/app_settings/shaders/class1/objects/emissiveV.glsl
new file mode 100644
index 0000000000..e984deb0c8
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/objects/emissiveV.glsl
@@ -0,0 +1,56 @@
+/**
+ * @file emissiveV.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+uniform mat4 texture_matrix0;
+uniform mat4 modelview_matrix;
+uniform mat4 modelview_projection_matrix;
+
+ATTRIBUTE vec3 position;
+void passTextureIndex();
+ATTRIBUTE vec4 emissive;
+ATTRIBUTE vec2 texcoord0;
+
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+
+void calcAtmospherics(vec3 inPositionEye);
+
+
+
+
+void main()
+{
+ //transform vertex
+ passTextureIndex();
+ gl_Position = modelview_projection_matrix * vec4(position.xyz, 1.0);
+ vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy;
+
+ vec4 pos = (modelview_matrix * vec4(position.xyz, 1.0));
+ calcAtmospherics(pos.xyz);
+
+ vertex_color = emissive;
+
+
+}
diff --git a/indra/newview/app_settings/shaders/class1/objects/fullbrightF.glsl b/indra/newview/app_settings/shaders/class1/objects/fullbrightF.glsl
index 0fab5e5001..a54c0caf81 100644
--- a/indra/newview/app_settings/shaders/class1/objects/fullbrightF.glsl
+++ b/indra/newview/app_settings/shaders/class1/objects/fullbrightF.glsl
@@ -20,7 +20,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
+ * $/LicenseInfo$F
*/
diff --git a/indra/newview/app_settings/shaders/class1/objects/fullbrightNoColorV.glsl b/indra/newview/app_settings/shaders/class1/objects/fullbrightNoColorV.glsl
new file mode 100644
index 0000000000..5d6f14230c
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/objects/fullbrightNoColorV.glsl
@@ -0,0 +1,53 @@
+/**
+ * @file fullbrightNoColorV.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+uniform mat4 texture_matrix0;
+uniform mat4 modelview_matrix;
+uniform mat4 modelview_projection_matrix;
+
+ATTRIBUTE vec3 position;
+ATTRIBUTE vec2 texcoord0;
+ATTRIBUTE vec3 normal;
+
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+
+
+void calcAtmospherics(vec3 inPositionEye);
+
+void main()
+{
+ //transform vertex
+ vec4 vert = vec4(position.xyz,1.0);
+ vec4 pos = (modelview_matrix * vert);
+ gl_Position = modelview_projection_matrix*vec4(position.xyz, 1.0);
+ vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy;
+
+ calcAtmospherics(pos.xyz);
+
+ vertex_color = vec4(1,1,1,1);
+
+
+}
diff --git a/indra/newview/app_settings/shaders/class1/objects/fullbrightShinySkinnedV.glsl b/indra/newview/app_settings/shaders/class1/objects/fullbrightShinySkinnedV.glsl
index e1a7f263f7..79b552ee1a 100644
--- a/indra/newview/app_settings/shaders/class1/objects/fullbrightShinySkinnedV.glsl
+++ b/indra/newview/app_settings/shaders/class1/objects/fullbrightShinySkinnedV.glsl
@@ -22,6 +22,19 @@
* $/LicenseInfo$
*/
+uniform mat4 texture_matrix0;
+uniform mat4 texture_matrix1;
+uniform mat4 modelview_matrix;
+uniform mat4 projection_matrix;
+
+ATTRIBUTE vec3 position;
+ATTRIBUTE vec3 normal;
+ATTRIBUTE vec4 diffuse_color;
+ATTRIBUTE vec2 texcoord0;
+
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+VARYING vec3 vary_texcoord1;
void calcAtmospherics(vec3 inPositionEye);
@@ -31,24 +44,24 @@ void main()
{
mat4 mat = getObjectSkinnedTransform();
- mat = gl_ModelViewMatrix * mat;
- vec3 pos = (mat*gl_Vertex).xyz;
+ mat = modelview_matrix * mat;
+ vec3 pos = (mat*vec4(position.xyz, 1.0)).xyz;
- vec4 norm = gl_Vertex;
- norm.xyz += gl_Normal.xyz;
+ vec4 norm = vec4(position.xyz, 1.0);
+ norm.xyz += normal.xyz;
norm.xyz = (mat*norm).xyz;
norm.xyz = normalize(norm.xyz-pos.xyz);
vec3 ref = reflect(pos.xyz, -norm.xyz);
- gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
- gl_TexCoord[1] = gl_TextureMatrix[1]*vec4(ref,1.0);
+ vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy;
+ vary_texcoord1 = (texture_matrix1*vec4(ref,1.0)).xyz;
calcAtmospherics(pos.xyz);
- gl_FrontColor = gl_Color;
+ vertex_color = diffuse_color;
+
+ gl_Position = projection_matrix*vec4(pos, 1.0);
- gl_Position = gl_ProjectionMatrix*vec4(pos, 1.0);
- gl_FogFragCoord = pos.z;
}
diff --git a/indra/newview/app_settings/shaders/class1/objects/fullbrightShinyV.glsl b/indra/newview/app_settings/shaders/class1/objects/fullbrightShinyV.glsl
index 36b00dfbc1..34bd8d445a 100644
--- a/indra/newview/app_settings/shaders/class1/objects/fullbrightShinyV.glsl
+++ b/indra/newview/app_settings/shaders/class1/objects/fullbrightShinyV.glsl
@@ -22,28 +22,46 @@
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
-
+
+uniform mat3 normal_matrix;
+uniform mat4 texture_matrix0;
+uniform mat4 texture_matrix1;
+uniform mat4 modelview_matrix;
+uniform mat4 modelview_projection_matrix;
void calcAtmospherics(vec3 inPositionEye);
uniform vec4 origin;
+
+
+ATTRIBUTE vec3 position;
+void passTextureIndex();
+ATTRIBUTE vec3 normal;
+ATTRIBUTE vec4 diffuse_color;
+ATTRIBUTE vec2 texcoord0;
+
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+VARYING vec3 vary_texcoord1;
+
+
void main()
{
//transform vertex
- gl_Position = ftransform();
+ vec4 vert = vec4(position.xyz,1.0);
+ passTextureIndex();
+ vec4 pos = (modelview_matrix * vert);
+ gl_Position = modelview_projection_matrix*vec4(position.xyz, 1.0);
- vec4 pos = (gl_ModelViewMatrix * gl_Vertex);
- vec3 norm = normalize(gl_NormalMatrix * gl_Normal);
+ vec3 norm = normalize(normal_matrix * normal);
vec3 ref = reflect(pos.xyz, -norm);
- gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
- gl_TexCoord[1] = gl_TextureMatrix[1]*vec4(ref,1.0);
+ vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy;
+ vary_texcoord1 = (texture_matrix1*vec4(ref,1.0)).xyz;
calcAtmospherics(pos.xyz);
- gl_FrontColor = gl_Color;
-
- gl_FogFragCoord = pos.z;
+ vertex_color = diffuse_color;
}
diff --git a/indra/newview/app_settings/shaders/class1/objects/fullbrightSkinnedV.glsl b/indra/newview/app_settings/shaders/class1/objects/fullbrightSkinnedV.glsl
index b540054c56..eff75435a9 100644
--- a/indra/newview/app_settings/shaders/class1/objects/fullbrightSkinnedV.glsl
+++ b/indra/newview/app_settings/shaders/class1/objects/fullbrightSkinnedV.glsl
@@ -22,31 +22,36 @@
* $/LicenseInfo$
*/
+uniform mat4 projection_matrix;
+uniform mat4 texture_matrix0;
+uniform mat4 modelview_matrix;
+ATTRIBUTE vec3 position;
+ATTRIBUTE vec4 diffuse_color;
+ATTRIBUTE vec2 texcoord0;
void calcAtmospherics(vec3 inPositionEye);
mat4 getObjectSkinnedTransform();
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+
+
void main()
{
//transform vertex
- gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
+ vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy;
mat4 mat = getObjectSkinnedTransform();
- mat = gl_ModelViewMatrix * mat;
- vec3 pos = (mat*gl_Vertex).xyz;
+ mat = modelview_matrix * mat;
+ vec3 pos = (mat*vec4(position.xyz, 1.0)).xyz;
- vec4 norm = gl_Vertex;
- norm.xyz += gl_Normal.xyz;
- norm.xyz = (mat*norm).xyz;
- norm.xyz = normalize(norm.xyz-pos.xyz);
-
calcAtmospherics(pos.xyz);
- gl_FrontColor = gl_Color;
+ vertex_color = diffuse_color;
- gl_Position = gl_ProjectionMatrix*vec4(pos, 1.0);
+ gl_Position = projection_matrix*vec4(pos, 1.0);
- gl_FogFragCoord = pos.z;
+
}
diff --git a/indra/newview/app_settings/shaders/class1/objects/fullbrightV.glsl b/indra/newview/app_settings/shaders/class1/objects/fullbrightV.glsl
index 22f731ffde..fc20d3270e 100644
--- a/indra/newview/app_settings/shaders/class1/objects/fullbrightV.glsl
+++ b/indra/newview/app_settings/shaders/class1/objects/fullbrightV.glsl
@@ -22,22 +22,37 @@
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
+
+uniform mat4 texture_matrix0;
+uniform mat4 modelview_matrix;
+uniform mat4 modelview_projection_matrix;
+ATTRIBUTE vec3 position;
+void passTextureIndex();
+ATTRIBUTE vec2 texcoord0;
+ATTRIBUTE vec3 normal;
+ATTRIBUTE vec4 diffuse_color;
void calcAtmospherics(vec3 inPositionEye);
+
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+
+
void main()
{
//transform vertex
- gl_Position = ftransform();
- gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
+ vec4 vert = vec4(position.xyz,1.0);
+ passTextureIndex();
+ vec4 pos = (modelview_matrix * vert);
+ gl_Position = modelview_projection_matrix*vec4(position.xyz, 1.0);
+ vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy;
- vec4 pos = (gl_ModelViewMatrix * gl_Vertex);
-
calcAtmospherics(pos.xyz);
- gl_FrontColor = gl_Color;
+ vertex_color = diffuse_color;
- gl_FogFragCoord = pos.z;
+
}
diff --git a/indra/newview/app_settings/shaders/class1/objects/impostorF.glsl b/indra/newview/app_settings/shaders/class1/objects/impostorF.glsl
index 92c09ce937..3c6e22b295 100644
--- a/indra/newview/app_settings/shaders/class1/objects/impostorF.glsl
+++ b/indra/newview/app_settings/shaders/class1/objects/impostorF.glsl
@@ -22,20 +22,22 @@
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
-
-uniform float minimum_alpha;
-uniform float maximum_alpha;
-vec3 fullbrightAtmosTransport(vec3 light);
-vec3 fullbrightScaleSoftClip(vec3 light);
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 gl_FragColor;
+#endif
+
+uniform float minimum_alpha;
uniform sampler2D diffuseMap;
+VARYING vec2 vary_texcoord0;
+
void main()
{
- vec4 color = texture2D(diffuseMap,gl_TexCoord[0].xy) * gl_Color;
+ vec4 color = texture2D(diffuseMap,vary_texcoord0.xy);
- if (color.a < minimum_alpha || color.a > maximum_alpha)
+ if (color.a < minimum_alpha)
{
discard;
}
diff --git a/indra/newview/app_settings/shaders/class1/objects/impostorV.glsl b/indra/newview/app_settings/shaders/class1/objects/impostorV.glsl
index eea51eba45..e90dbb115a 100644
--- a/indra/newview/app_settings/shaders/class1/objects/impostorV.glsl
+++ b/indra/newview/app_settings/shaders/class1/objects/impostorV.glsl
@@ -22,13 +22,19 @@
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
-
-
+
+uniform mat4 texture_matrix0;
+uniform mat4 modelview_projection_matrix;
+
+
+ATTRIBUTE vec3 position;
+ATTRIBUTE vec2 texcoord0;
+
+VARYING vec2 vary_texcoord0;
+
void main()
{
//transform vertex
- gl_Position = ftransform();
- gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
-
- gl_FrontColor = gl_Color;
+ gl_Position = modelview_projection_matrix * vec4(position.xyz, 1.0);
+ vary_texcoord0 = (texture_matrix0 * vec4(texcoord0, 0, 1)).xy;
}
diff --git a/indra/newview/app_settings/shaders/class1/objects/indexedTextureF.glsl b/indra/newview/app_settings/shaders/class1/objects/indexedTextureF.glsl
new file mode 100644
index 0000000000..254c1d4fc2
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/objects/indexedTextureF.glsl
@@ -0,0 +1,33 @@
+/**
+ * @file fullbrightF.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+
+
+
+void main()
+{
+ fullbright_lighting();
+}
+
diff --git a/indra/newview/app_settings/shaders/class1/objects/indexedTextureV.glsl b/indra/newview/app_settings/shaders/class1/objects/indexedTextureV.glsl
new file mode 100644
index 0000000000..a95c9e0ab9
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/objects/indexedTextureV.glsl
@@ -0,0 +1,34 @@
+/**
+ * @file indexedTextureV.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+ATTRIBUTE float texture_index;
+
+VARYING float vary_texture_index;
+
+void passTextureIndex()
+{
+ vary_texture_index = texture_index;
+}
+
diff --git a/indra/newview/app_settings/shaders/class1/objects/nonindexedTextureV.glsl b/indra/newview/app_settings/shaders/class1/objects/nonindexedTextureV.glsl
new file mode 100644
index 0000000000..80ea286ac0
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/objects/nonindexedTextureV.glsl
@@ -0,0 +1,31 @@
+/**
+ * @file nonindexedTextureV.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+void passTextureIndex()
+{
+
+}
+
+
diff --git a/indra/newview/app_settings/shaders/class1/objects/previewV.glsl b/indra/newview/app_settings/shaders/class1/objects/previewV.glsl
new file mode 100644
index 0000000000..5dcfa87066
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/objects/previewV.glsl
@@ -0,0 +1,57 @@
+/**
+ * @file previewV.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+uniform mat3 normal_matrix;
+uniform mat4 texture_matrix0;
+uniform mat4 modelview_matrix;
+uniform mat4 modelview_projection_matrix;
+
+ATTRIBUTE vec3 position;
+ATTRIBUTE vec3 normal;
+ATTRIBUTE vec2 texcoord0;
+
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+
+
+vec4 calcLighting(vec3 pos, vec3 norm, vec4 color, vec4 baseCol);
+void calcAtmospherics(vec3 inPositionEye);
+
+void main()
+{
+ //transform vertex
+ vec4 pos = (modelview_matrix * vec4(position.xyz, 1.0));
+ gl_Position = modelview_projection_matrix * vec4(position.xyz, 1.0);
+ vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy;
+
+ vec3 norm = normalize(normal_matrix * normal);
+
+ calcAtmospherics(pos.xyz);
+
+ vec4 color = calcLighting(pos.xyz, norm, vec4(1,1,1,1), vec4(0.));
+ vertex_color = color;
+
+
+}
diff --git a/indra/newview/app_settings/shaders/class1/objects/shinySimpleSkinnedV.glsl b/indra/newview/app_settings/shaders/class1/objects/shinySimpleSkinnedV.glsl
index f5fd4ededd..591d6fc5c9 100644
--- a/indra/newview/app_settings/shaders/class1/objects/shinySimpleSkinnedV.glsl
+++ b/indra/newview/app_settings/shaders/class1/objects/shinySimpleSkinnedV.glsl
@@ -22,7 +22,19 @@
* $/LicenseInfo$
*/
+uniform mat4 projection_matrix;
+uniform mat4 texture_matrix0;
+uniform mat4 texture_matrix1;
+uniform mat4 modelview_matrix;
+ATTRIBUTE vec3 position;
+ATTRIBUTE vec3 normal;
+ATTRIBUTE vec4 diffuse_color;
+ATTRIBUTE vec2 texcoord0;
+
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+VARYING vec3 vary_texcoord1;
vec4 calcLighting(vec3 pos, vec3 norm, vec4 color, vec4 baseCol);
void calcAtmospherics(vec3 inPositionEye);
@@ -32,23 +44,23 @@ void main()
{
mat4 mat = getObjectSkinnedTransform();
- mat = gl_ModelViewMatrix * mat;
- vec3 pos = (mat*gl_Vertex).xyz;
+ mat = modelview_matrix * mat;
+ vec3 pos = (mat*vec4(position.xyz, 1.0)).xyz;
- vec4 norm = gl_Vertex;
- norm.xyz += gl_Normal.xyz;
+ vec4 norm = vec4(position.xyz, 1.0);
+ norm.xyz += normal.xyz;
norm.xyz = (mat*norm).xyz;
norm.xyz = normalize(norm.xyz-pos.xyz);
vec3 ref = reflect(pos.xyz, -norm.xyz);
- gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
- gl_TexCoord[1] = gl_TextureMatrix[1]*vec4(ref,1.0);
+ vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy;
+ vary_texcoord1 = (texture_matrix1*vec4(ref,1.0)).xyz;
calcAtmospherics(pos.xyz);
- vec4 color = calcLighting(pos.xyz, norm.xyz, gl_Color, vec4(0.));
- gl_FrontColor = color;
+ vec4 color = calcLighting(pos.xyz, norm.xyz, diffuse_color, vec4(0.));
+ vertex_color = color;
- gl_Position = gl_ProjectionMatrix*vec4(pos, 1.0);
+ gl_Position = projection_matrix*vec4(pos, 1.0);
}
diff --git a/indra/newview/app_settings/shaders/class1/objects/shinyV.glsl b/indra/newview/app_settings/shaders/class1/objects/shinyV.glsl
index 13a58f0d4a..fdb3453cc5 100644
--- a/indra/newview/app_settings/shaders/class1/objects/shinyV.glsl
+++ b/indra/newview/app_settings/shaders/class1/objects/shinyV.glsl
@@ -1,4 +1,4 @@
-/**
+/**
* @file shinyV.glsl
*
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
@@ -22,8 +22,24 @@
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
-
+uniform mat3 normal_matrix;
+uniform mat4 texture_matrix0;
+uniform mat4 texture_matrix1;
+uniform mat4 modelview_matrix;
+uniform mat4 modelview_projection_matrix;
+
+ATTRIBUTE vec3 position;
+void passTextureIndex();
+ATTRIBUTE vec2 texcoord0;
+ATTRIBUTE vec3 normal;
+ATTRIBUTE vec4 diffuse_color;
+
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+VARYING vec3 vary_texcoord1;
+
+vec4 calcLighting(vec3 pos, vec3 norm, vec4 color, vec4 baseCol);
void calcAtmospherics(vec3 inPositionEye);
@@ -32,19 +48,18 @@ uniform vec4 origin;
void main()
{
//transform vertex
- gl_Position = ftransform();
-
- vec4 pos = (gl_ModelViewMatrix * gl_Vertex);
- vec3 norm = normalize(gl_NormalMatrix * gl_Normal);
+ vec4 vert = vec4(position.xyz,1.0);
+ passTextureIndex();
+ vec4 pos = (modelview_matrix * vert);
+ gl_Position = modelview_projection_matrix*vec4(position.xyz, 1.0);
+
+ vec3 norm = normalize(normal_matrix * normal);
+ vec3 ref = reflect(pos.xyz, -norm);
+
+ vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy;
+ vary_texcoord1 = (texture_matrix1*vec4(ref,1.0)).xyz;
calcAtmospherics(pos.xyz);
-
- gl_FrontColor = gl_Color;
-
- vec3 ref = reflect(pos.xyz, -norm);
-
- gl_TexCoord[0] = gl_TextureMatrix[0]*vec4(ref,1.0);
-
- gl_FogFragCoord = pos.z;
-}
+ vertex_color = calcLighting(pos.xyz, norm, diffuse_color, vec4(0.0));
+}
diff --git a/indra/newview/app_settings/shaders/class1/objects/simpleNoColorV.glsl b/indra/newview/app_settings/shaders/class1/objects/simpleNoColorV.glsl
new file mode 100644
index 0000000000..0be52a52af
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/objects/simpleNoColorV.glsl
@@ -0,0 +1,59 @@
+/**
+ * @file simpleNoColorV.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+uniform mat3 normal_matrix;
+uniform mat4 texture_matrix0;
+uniform mat4 modelview_matrix;
+uniform mat4 modelview_projection_matrix;
+
+uniform vec4 color;
+
+ATTRIBUTE vec3 position;
+ATTRIBUTE vec3 normal;
+ATTRIBUTE vec2 texcoord0;
+
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+
+
+vec4 calcLighting(vec3 pos, vec3 norm, vec4 color, vec4 baseCol);
+void calcAtmospherics(vec3 inPositionEye);
+
+void main()
+{
+ //transform vertex
+ vec4 pos = (modelview_matrix * vec4(position.xyz, 1.0));
+ gl_Position = modelview_projection_matrix * vec4(position.xyz, 1.0);
+ vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy;
+
+ vec3 norm = normalize(normal_matrix * normal);
+
+ calcAtmospherics(pos.xyz);
+
+ vec4 col = calcLighting(pos.xyz, norm, color, vec4(0.));
+ vertex_color = col;
+
+
+}
diff --git a/indra/newview/app_settings/shaders/class1/objects/simpleNonIndexedV.glsl b/indra/newview/app_settings/shaders/class1/objects/simpleNonIndexedV.glsl
new file mode 100644
index 0000000000..cb80697d15
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/objects/simpleNonIndexedV.glsl
@@ -0,0 +1,61 @@
+/**
+ * @file simpleNonIndexedV.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+uniform mat3 normal_matrix;
+uniform mat4 texture_matrix0;
+uniform mat4 modelview_matrix;
+uniform mat4 modelview_projection_matrix;
+
+ATTRIBUTE vec3 position;
+ATTRIBUTE vec2 texcoord0;
+ATTRIBUTE vec3 normal;
+ATTRIBUTE vec4 diffuse_color;
+
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+
+
+vec4 calcLighting(vec3 pos, vec3 norm, vec4 color, vec4 baseCol);
+void calcAtmospherics(vec3 inPositionEye);
+
+void main()
+{
+ //transform vertex
+ vec4 vert = vec4(position.xyz,1.0);
+
+ gl_Position = modelview_projection_matrix*vert;
+ vary_texcoord0 = (texture_matrix0 * vec4(texcoord0, 0, 1)).xy;
+
+ vec4 pos = (modelview_matrix * vert);
+
+ vec3 norm = normalize(normal_matrix * normal);
+
+ calcAtmospherics(pos.xyz);
+
+ vec4 color = calcLighting(pos.xyz, norm, diffuse_color, vec4(0.));
+ vertex_color = color;
+
+
+}
diff --git a/indra/newview/app_settings/shaders/class1/objects/simpleSkinnedV.glsl b/indra/newview/app_settings/shaders/class1/objects/simpleSkinnedV.glsl
index ad171f7b43..1c6e53b187 100644
--- a/indra/newview/app_settings/shaders/class1/objects/simpleSkinnedV.glsl
+++ b/indra/newview/app_settings/shaders/class1/objects/simpleSkinnedV.glsl
@@ -22,6 +22,17 @@
* $/LicenseInfo$
*/
+uniform mat4 texture_matrix0;
+uniform mat4 modelview_matrix;
+uniform mat4 projection_matrix;
+
+ATTRIBUTE vec3 position;
+ATTRIBUTE vec3 normal;
+ATTRIBUTE vec4 diffuse_color;
+ATTRIBUTE vec2 texcoord0;
+
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
vec4 calcLighting(vec3 pos, vec3 norm, vec4 color, vec4 baseCol);
@@ -31,24 +42,24 @@ mat4 getObjectSkinnedTransform();
void main()
{
//transform vertex
- gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
+ vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy;
mat4 mat = getObjectSkinnedTransform();
- mat = gl_ModelViewMatrix * mat;
- vec3 pos = (mat*gl_Vertex).xyz;
+ mat = modelview_matrix * mat;
+ vec3 pos = (mat*vec4(position.xyz, 1.0)).xyz;
- vec4 norm = gl_Vertex;
- norm.xyz += gl_Normal.xyz;
+ vec4 norm = vec4(position.xyz, 1.0);
+ norm.xyz += normal.xyz;
norm.xyz = (mat*norm).xyz;
norm.xyz = normalize(norm.xyz-pos.xyz);
calcAtmospherics(pos.xyz);
- vec4 color = calcLighting(pos.xyz, norm.xyz, gl_Color, vec4(0.));
- gl_FrontColor = color;
+ vec4 color = calcLighting(pos.xyz, norm.xyz, diffuse_color, vec4(0.));
+ vertex_color = color;
+
+ gl_Position = projection_matrix*vec4(pos, 1.0);
- gl_Position = gl_ProjectionMatrix*vec4(pos, 1.0);
- gl_FogFragCoord = pos.z;
}
diff --git a/indra/newview/app_settings/shaders/class1/objects/simpleTexGenV.glsl b/indra/newview/app_settings/shaders/class1/objects/simpleTexGenV.glsl
new file mode 100644
index 0000000000..d4dee78793
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/objects/simpleTexGenV.glsl
@@ -0,0 +1,77 @@
+/**
+ * @file simpleV.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+uniform mat3 normal_matrix;
+uniform mat4 texture_matrix0;
+uniform mat4 modelview_matrix;
+uniform mat4 modelview_projection_matrix;
+
+ATTRIBUTE vec3 position;
+void passTextureIndex();
+ATTRIBUTE vec2 texcoord0;
+ATTRIBUTE vec3 normal;
+
+uniform vec4 color;
+uniform vec4 object_plane_t;
+uniform vec4 object_plane_s;
+
+vec4 calcLighting(vec3 pos, vec3 norm, vec4 color, vec4 baseCol);
+void calcAtmospherics(vec3 inPositionEye);
+
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+
+vec4 texgen_object(vec4 vpos, vec4 tc, mat4 mat, vec4 tp0, vec4 tp1)
+{
+ vec4 tcoord;
+
+ tcoord.x = dot(vpos, tp0);
+ tcoord.y = dot(vpos, tp1);
+ tcoord.z = tc.z;
+ tcoord.w = tc.w;
+
+ tcoord = mat * tcoord;
+
+ return tcoord;
+}
+
+void main()
+{
+ //transform vertex
+ vec4 vert = vec4(position.xyz,1.0);
+ passTextureIndex();
+ vec4 pos = (modelview_matrix * vert);
+ gl_Position = modelview_projection_matrix*vec4(position.xyz, 1.0);
+ vary_texcoord0.xy = texgen_object(vec4(position.xyz, 1.0), vec4(texcoord0,0,1), texture_matrix0, object_plane_s, object_plane_t).xy;
+
+ vec3 norm = normalize(normal_matrix * normal);
+
+ calcAtmospherics(pos.xyz);
+
+ vec4 color = calcLighting(pos.xyz, norm, color, vec4(0.));
+ vertex_color = color;
+
+
+}
diff --git a/indra/newview/app_settings/shaders/class1/objects/simpleV.glsl b/indra/newview/app_settings/shaders/class1/objects/simpleV.glsl
index dc1794e132..37a20383e2 100644
--- a/indra/newview/app_settings/shaders/class1/objects/simpleV.glsl
+++ b/indra/newview/app_settings/shaders/class1/objects/simpleV.glsl
@@ -22,26 +22,43 @@
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
-
+uniform mat3 normal_matrix;
+uniform mat4 texture_matrix0;
+uniform mat4 modelview_matrix;
+uniform mat4 modelview_projection_matrix;
+
+ATTRIBUTE vec3 position;
+void passTextureIndex();
+ATTRIBUTE vec2 texcoord0;
+ATTRIBUTE vec3 normal;
+ATTRIBUTE vec4 diffuse_color;
vec4 calcLighting(vec3 pos, vec3 norm, vec4 color, vec4 baseCol);
void calcAtmospherics(vec3 inPositionEye);
+
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+
+
void main()
{
//transform vertex
- gl_Position = ftransform();
- gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
+ vec4 vert = vec4(position.xyz,1.0);
+ passTextureIndex();
+ vec4 pos = (modelview_matrix * vert);
+ gl_Position = modelview_projection_matrix*vec4(position.xyz, 1.0);
+ vary_texcoord0 = (texture_matrix0 * vec4(texcoord0, 0, 1)).xy;
+
- vec4 pos = (gl_ModelViewMatrix * gl_Vertex);
- vec3 norm = normalize(gl_NormalMatrix * gl_Normal);
+ vec3 norm = normalize(normal_matrix * normal);
calcAtmospherics(pos.xyz);
- vec4 color = calcLighting(pos.xyz, norm, gl_Color, vec4(0.));
- gl_FrontColor = color;
+ vec4 color = calcLighting(pos.xyz, norm, diffuse_color, vec4(0.));
+ vertex_color = color;
- gl_FogFragCoord = pos.z;
+
}
diff --git a/indra/newview/app_settings/shaders/class1/objects/treeV.glsl b/indra/newview/app_settings/shaders/class1/objects/treeV.glsl
new file mode 100644
index 0000000000..fa01a27ec0
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/objects/treeV.glsl
@@ -0,0 +1,60 @@
+/**
+ * @file treeV.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+uniform mat3 normal_matrix;
+uniform mat4 texture_matrix0;
+uniform mat4 modelview_matrix;
+uniform mat4 modelview_projection_matrix;
+
+ATTRIBUTE vec3 position;
+ATTRIBUTE vec2 texcoord0;
+ATTRIBUTE vec3 normal;
+
+vec4 calcLighting(vec3 pos, vec3 norm, vec4 color, vec4 baseCol);
+void calcAtmospherics(vec3 inPositionEye);
+
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+
+
+void main()
+{
+ //transform vertex
+ vec4 vert = vec4(position.xyz,1.0);
+
+ gl_Position = modelview_projection_matrix*vert;
+ vary_texcoord0 = (texture_matrix0 * vec4(texcoord0, 0, 1)).xy;
+
+ vec4 pos = (modelview_matrix * vert);
+
+ vec3 norm = normalize(normal_matrix * normal);
+
+ calcAtmospherics(pos.xyz);
+
+ vec4 color = calcLighting(pos.xyz, norm, vec4(1,1,1,1), vec4(0.));
+ vertex_color = color;
+
+
+}
diff --git a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsHelpersV.glsl b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsHelpersV.glsl
index 15738e37e8..6ff860362c 100644
--- a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsHelpersV.glsl
+++ b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsHelpersV.glsl
@@ -23,21 +23,22 @@
* $/LicenseInfo$
*/
-
+uniform vec4 sunlight_color_copy;
+uniform vec4 light_ambient;
vec3 atmosAmbient(vec3 light)
{
- return gl_LightModel.ambient.rgb + light;
+ return light + light_ambient.rgb;
}
vec3 atmosAffectDirectionalLight(float lightIntensity)
{
- return gl_LightSource[0].diffuse.rgb * lightIntensity;
+ return sunlight_color_copy.rgb * lightIntensity;
}
vec3 atmosGetDiffuseSunlightColor()
{
- return gl_LightSource[0].diffuse.rgb;
+ return sunlight_color_copy.rgb;
}
vec3 scaleDownLight(vec3 light)
diff --git a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsVarsF.glsl b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsVarsF.glsl
index dbacf28637..8bdae328bd 100644
--- a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsVarsF.glsl
+++ b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsVarsF.glsl
@@ -24,10 +24,7 @@
*/
-
-varying vec3 vary_PositionEye;
-
vec3 getPositionEye()
{
- return vary_PositionEye;
+ return vec3(0,0,0);
}
diff --git a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsVarsV.glsl b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsVarsV.glsl
index e051ac9851..8ec9ae617c 100644
--- a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsVarsV.glsl
+++ b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsVarsV.glsl
@@ -25,15 +25,12 @@
-varying vec3 vary_PositionEye;
-
-
vec3 getPositionEye()
{
- return vary_PositionEye;
+ return vec3(0,0,0);
}
void setPositionEye(vec3 v)
{
- vary_PositionEye = v;
+
}
diff --git a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsVarsWaterF.glsl b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsVarsWaterF.glsl
new file mode 100644
index 0000000000..636d4af006
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsVarsWaterF.glsl
@@ -0,0 +1,33 @@
+/**
+ * @file atmosphericVarsWaterF.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+
+VARYING vec3 vary_PositionEye;
+
+vec3 getPositionEye()
+{
+ return vary_PositionEye;
+}
+
diff --git a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsVarsWaterV.glsl b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsVarsWaterV.glsl
new file mode 100644
index 0000000000..8afcc20f6d
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsVarsWaterV.glsl
@@ -0,0 +1,37 @@
+/**
+ * @file atmosphericVarsWaterV.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+
+VARYING vec3 vary_PositionEye;
+
+vec3 getPositionEye()
+{
+ return vary_PositionEye;
+}
+
+void setPositionEye(vec3 v)
+{
+ vary_PositionEye = v;
+}
diff --git a/indra/newview/app_settings/shaders/class2/avatar/eyeballV.glsl b/indra/newview/app_settings/shaders/class2/avatar/eyeballV.glsl
index f9f376c2b7..5af9f5c902 100644
--- a/indra/newview/app_settings/shaders/class2/avatar/eyeballV.glsl
+++ b/indra/newview/app_settings/shaders/class2/avatar/eyeballV.glsl
@@ -22,7 +22,19 @@
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
-
+
+uniform mat3 normal_matrix;
+uniform mat4 texture_matrix0;
+uniform mat4 modelview_matrix;
+uniform mat4 modelview_projection_matrix;
+
+ATTRIBUTE vec3 position;
+ATTRIBUTE vec4 diffuse_color;
+ATTRIBUTE vec3 normal;
+ATTRIBUTE vec2 texcoord0;
+
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
vec4 calcLightingSpecular(vec3 pos, vec3 norm, vec4 color, inout vec4 specularColor, vec4 baseCol);
@@ -31,20 +43,20 @@ void calcAtmospherics(vec3 inPositionEye);
void main()
{
//transform vertex
- gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
- gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
-
- vec3 pos = (gl_ModelViewMatrix * gl_Vertex).xyz;
- vec3 norm = normalize(gl_NormalMatrix * gl_Normal);
+ vec3 pos = (modelview_matrix * vec4(position.xyz, 1.0)).xyz;
+ gl_Position = modelview_projection_matrix * vec4(position.xyz, 1.0);
+ vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy;
+
+ vec3 norm = normalize(normal_matrix * normal);
calcAtmospherics(pos.xyz);
// vec4 specular = specularColor;
vec4 specular = vec4(1.0);
- vec4 color = calcLightingSpecular(pos, norm, gl_Color, specular, vec4(0.0));
+ vec4 color = calcLightingSpecular(pos, norm, diffuse_color, specular, vec4(0.0));
- gl_FrontColor = color;
- gl_FogFragCoord = pos.z;
+ vertex_color = color;
+
}
diff --git a/indra/newview/app_settings/shaders/class2/deferred/alphaF.glsl b/indra/newview/app_settings/shaders/class2/deferred/alphaF.glsl
index 839606cdcb..1179b212ae 100644
--- a/indra/newview/app_settings/shaders/class2/deferred/alphaF.glsl
+++ b/indra/newview/app_settings/shaders/class2/deferred/alphaF.glsl
@@ -22,11 +22,16 @@
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
-
-
#extension GL_ARB_texture_rectangle : enable
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 gl_FragColor;
+#endif
+
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+
uniform sampler2DRectShadow shadowMap0;
uniform sampler2DRectShadow shadowMap1;
uniform sampler2DRectShadow shadowMap2;
@@ -41,29 +46,16 @@ uniform vec2 shadow_res;
vec3 atmosLighting(vec3 light);
vec3 scaleSoftClip(vec3 light);
-varying vec3 vary_ambient;
-varying vec3 vary_directional;
-varying vec3 vary_fragcoord;
-varying vec3 vary_position;
-varying vec3 vary_pointlight_col;
+VARYING vec3 vary_ambient;
+VARYING vec3 vary_directional;
+VARYING vec3 vary_fragcoord;
+VARYING vec3 vary_position;
+VARYING vec3 vary_pointlight_col;
uniform float shadow_bias;
uniform mat4 inv_proj;
-vec4 getPosition(vec2 pos_screen)
-{
- float depth = texture2DRect(depthMap, pos_screen.xy).a;
- vec2 sc = pos_screen.xy*2.0;
- sc /= screen_res;
- sc -= vec2(1.0,1.0);
- vec4 ndc = vec4(sc.x, sc.y, 2.0*depth-1.0, 1.0);
- vec4 pos = inv_proj * ndc;
- pos.xyz /= pos.w;
- pos.w = 1.0;
- return pos;
-}
-
float pcfShadow(sampler2DRectShadow shadowMap, vec4 stc, float scl)
{
stc.xyz /= stc.w;
@@ -122,9 +114,9 @@ void main()
}
}
- vec4 diff = diffuseLookup(gl_TexCoord[0].xy);
+ vec4 diff = diffuseLookup(vary_texcoord0.xy);
- vec4 col = vec4(vary_ambient + vary_directional.rgb*shadow, gl_Color.a);
+ vec4 col = vec4(vary_ambient + vary_directional.rgb*shadow, vertex_color.a);
vec4 color = diff * col;
color.rgb = atmosLighting(color.rgb);
@@ -133,10 +125,6 @@ void main()
color.rgb += diff.rgb * vary_pointlight_col.rgb;
- //gl_FragColor = gl_Color;
gl_FragColor = color;
- //gl_FragColor.r = 0.0;
- //gl_FragColor = vec4(1,shadow,1,1);
-
}
diff --git a/indra/newview/app_settings/shaders/class2/deferred/alphaNonIndexedF.glsl b/indra/newview/app_settings/shaders/class2/deferred/alphaNonIndexedF.glsl
index 84e49a5f8f..0df557f2aa 100644
--- a/indra/newview/app_settings/shaders/class2/deferred/alphaNonIndexedF.glsl
+++ b/indra/newview/app_settings/shaders/class2/deferred/alphaNonIndexedF.glsl
@@ -23,10 +23,12 @@
* $/LicenseInfo$
*/
-
-
#extension GL_ARB_texture_rectangle : enable
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 gl_FragColor;
+#endif
+
uniform sampler2DRectShadow shadowMap0;
uniform sampler2DRectShadow shadowMap1;
uniform sampler2DRectShadow shadowMap2;
@@ -42,11 +44,13 @@ uniform vec2 shadow_res;
vec3 atmosLighting(vec3 light);
vec3 scaleSoftClip(vec3 light);
-varying vec3 vary_ambient;
-varying vec3 vary_directional;
-varying vec3 vary_fragcoord;
-varying vec3 vary_position;
-varying vec3 vary_pointlight_col;
+VARYING vec3 vary_ambient;
+VARYING vec3 vary_directional;
+VARYING vec3 vary_fragcoord;
+VARYING vec3 vary_position;
+VARYING vec3 vary_pointlight_col;
+VARYING vec2 vary_texcoord0;
+VARYING vec4 vertex_color;
uniform float shadow_bias;
@@ -123,9 +127,9 @@ void main()
}
}
- vec4 diff = texture2D(diffuseMap,gl_TexCoord[0].xy);
+ vec4 diff = texture2D(diffuseMap,vary_texcoord0.xy);
- vec4 col = vec4(vary_ambient + vary_directional.rgb*shadow, gl_Color.a);
+ vec4 col = vec4(vary_ambient + vary_directional.rgb*shadow, vertex_color.a);
vec4 color = diff * col;
color.rgb = atmosLighting(color.rgb);
@@ -134,10 +138,6 @@ void main()
color.rgb += diff.rgb * vary_pointlight_col.rgb;
- //gl_FragColor = gl_Color;
- gl_FragColor = color;
- //gl_FragColor.r = 0.0;
- //gl_FragColor = vec4(1,shadow,1,1);
-
+ gl_FragColor = color;
}
diff --git a/indra/newview/app_settings/shaders/class2/deferred/alphaNonIndexedNoColorF.glsl b/indra/newview/app_settings/shaders/class2/deferred/alphaNonIndexedNoColorF.glsl
new file mode 100644
index 0000000000..331dbc7079
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class2/deferred/alphaNonIndexedNoColorF.glsl
@@ -0,0 +1,142 @@
+/**
+ * @file alphaNonIndexedNoColorF.glsl
+ *
+ * $LicenseInfo:firstyear=2005&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2005, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#extension GL_ARB_texture_rectangle : enable
+
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 gl_FragColor;
+#endif
+
+uniform sampler2DRectShadow shadowMap0;
+uniform sampler2DRectShadow shadowMap1;
+uniform sampler2DRectShadow shadowMap2;
+uniform sampler2DRectShadow shadowMap3;
+uniform sampler2DRect depthMap;
+uniform sampler2D diffuseMap;
+
+uniform mat4 shadow_matrix[6];
+uniform vec4 shadow_clip;
+uniform vec2 screen_res;
+uniform vec2 shadow_res;
+
+vec3 atmosLighting(vec3 light);
+vec3 scaleSoftClip(vec3 light);
+
+VARYING vec3 vary_ambient;
+VARYING vec3 vary_directional;
+VARYING vec3 vary_fragcoord;
+VARYING vec3 vary_position;
+VARYING vec3 vary_pointlight_col;
+VARYING vec2 vary_texcoord0;
+
+uniform float shadow_bias;
+
+uniform mat4 inv_proj;
+
+vec4 getPosition(vec2 pos_screen)
+{
+ float depth = texture2DRect(depthMap, pos_screen.xy).a;
+ vec2 sc = pos_screen.xy*2.0;
+ sc /= screen_res;
+ sc -= vec2(1.0,1.0);
+ vec4 ndc = vec4(sc.x, sc.y, 2.0*depth-1.0, 1.0);
+ vec4 pos = inv_proj * ndc;
+ pos.xyz /= pos.w;
+ pos.w = 1.0;
+ return pos;
+}
+
+float pcfShadow(sampler2DRectShadow shadowMap, vec4 stc, float scl)
+{
+ stc.xyz /= stc.w;
+ stc.z += shadow_bias;
+
+ float cs = shadow2DRect(shadowMap, stc.xyz).x;
+ float shadow = cs;
+
+ shadow += max(shadow2DRect(shadowMap, stc.xyz+vec3(scl, scl, 0.0)).x, cs);
+ shadow += max(shadow2DRect(shadowMap, stc.xyz+vec3(scl, -scl, 0.0)).x, cs);
+ shadow += max(shadow2DRect(shadowMap, stc.xyz+vec3(-scl, scl, 0.0)).x, cs);
+ shadow += max(shadow2DRect(shadowMap, stc.xyz+vec3(-scl, -scl, 0.0)).x, cs);
+
+ return shadow/5.0;
+}
+
+
+void main()
+{
+ vec2 frag = vary_fragcoord.xy/vary_fragcoord.z*0.5+0.5;
+ frag *= screen_res;
+
+ float shadow = 1.0;
+ vec4 pos = vec4(vary_position, 1.0);
+
+ vec4 spos = pos;
+
+ if (spos.z > -shadow_clip.w)
+ {
+ vec4 lpos;
+
+ if (spos.z < -shadow_clip.z)
+ {
+ lpos = shadow_matrix[3]*spos;
+ lpos.xy *= shadow_res;
+ shadow = pcfShadow(shadowMap3, lpos, 1.5);
+ shadow += max((pos.z+shadow_clip.z)/(shadow_clip.z-shadow_clip.w)*2.0-1.0, 0.0);
+ }
+ else if (spos.z < -shadow_clip.y)
+ {
+ lpos = shadow_matrix[2]*spos;
+ lpos.xy *= shadow_res;
+ shadow = pcfShadow(shadowMap2, lpos, 1.5);
+ }
+ else if (spos.z < -shadow_clip.x)
+ {
+ lpos = shadow_matrix[1]*spos;
+ lpos.xy *= shadow_res;
+ shadow = pcfShadow(shadowMap1, lpos, 1.5);
+ }
+ else
+ {
+ lpos = shadow_matrix[0]*spos;
+ lpos.xy *= shadow_res;
+ shadow = pcfShadow(shadowMap0, lpos, 1.5);
+ }
+ }
+
+ vec4 diff = texture2D(diffuseMap,vary_texcoord0.xy);
+
+ vec4 col = vec4(vary_ambient + vary_directional.rgb*shadow, 1.0);
+ vec4 color = diff * col;
+
+ color.rgb = atmosLighting(color.rgb);
+
+ color.rgb = scaleSoftClip(color.rgb);
+
+ color.rgb += diff.rgb * vary_pointlight_col.rgb;
+
+ gl_FragColor = color;
+}
+
diff --git a/indra/newview/app_settings/shaders/class2/deferred/alphaSkinnedV.glsl b/indra/newview/app_settings/shaders/class2/deferred/alphaSkinnedV.glsl
index 20121da52d..83815b1786 100644
--- a/indra/newview/app_settings/shaders/class2/deferred/alphaSkinnedV.glsl
+++ b/indra/newview/app_settings/shaders/class2/deferred/alphaSkinnedV.glsl
@@ -21,8 +21,16 @@
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
-
+uniform mat4 projection_matrix;
+uniform mat4 texture_matrix0;
+uniform mat4 modelview_matrix;
+uniform mat4 modelview_projection_matrix;
+
+ATTRIBUTE vec3 position;
+ATTRIBUTE vec3 normal;
+ATTRIBUTE vec4 diffuse_color;
+ATTRIBUTE vec2 texcoord0;
vec4 calcLighting(vec3 pos, vec3 norm, vec4 color, vec4 baseCol);
void calcAtmospherics(vec3 inPositionEye);
@@ -34,33 +42,42 @@ vec3 atmosAffectDirectionalLight(float lightIntensity);
vec3 scaleDownLight(vec3 light);
vec3 scaleUpLight(vec3 light);
-varying vec3 vary_ambient;
-varying vec3 vary_directional;
-varying vec3 vary_fragcoord;
-varying vec3 vary_position;
-varying vec3 vary_pointlight_col;
+VARYING vec3 vary_ambient;
+VARYING vec3 vary_directional;
+VARYING vec3 vary_fragcoord;
+VARYING vec3 vary_position;
+VARYING vec3 vary_pointlight_col;
+
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+
uniform float near_clip;
uniform float shadow_offset;
uniform float shadow_bias;
+uniform vec4 light_position[8];
+uniform vec3 light_direction[8];
+uniform vec3 light_attenuation[8];
+uniform vec3 light_diffuse[8];
+
float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float fa, float is_pointlight)
{
- //get light vector
+//get light vector
vec3 lv = lp.xyz-v;
//get distance
- float d = length(lv);
+ float d = dot(lv,lv);
float da = 0.0;
if (d > 0.0 && la > 0.0 && fa > 0.0)
{
//normalize light vector
- lv *= 1.0/d;
+ lv = normalize(lv);
//distance attenuation
- float dist2 = d*d/(la*la);
+ float dist2 = d/la;
da = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 0.0, 1.0);
// spotlight coefficient.
@@ -68,7 +85,7 @@ float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, floa
da *= spot*spot; // GL_SPOT_EXPONENT=2
//angular attenuation
- da *= calcDirectionalLight(n, lv);
+ da *= max(dot(n, lv), 0.0);
}
return da;
@@ -76,56 +93,56 @@ float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, floa
void main()
{
- gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
+ vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy;
mat4 mat = getObjectSkinnedTransform();
- mat = gl_ModelViewMatrix * mat;
+ mat = modelview_matrix * mat;
- vec3 pos = (mat*gl_Vertex).xyz;
+ vec3 pos = (mat*vec4(position, 1.0)).xyz;
- gl_Position = gl_ProjectionMatrix * vec4(pos, 1.0);
+ gl_Position = projection_matrix * vec4(pos, 1.0);
- vec4 n = gl_Vertex;
- n.xyz += gl_Normal.xyz;
+ vec4 n = vec4(position, 1.0);
+ n.xyz += normal.xyz;
n.xyz = (mat*n).xyz;
n.xyz = normalize(n.xyz-pos.xyz);
vec3 norm = n.xyz;
- float dp_directional_light = max(0.0, dot(norm, gl_LightSource[0].position.xyz));
- vary_position = pos.xyz + gl_LightSource[0].position.xyz * (1.0-dp_directional_light)*shadow_offset;
+ float dp_directional_light = max(0.0, dot(norm, light_position[0].xyz));
+ vary_position = pos.xyz + light_position[0].xyz * (1.0-dp_directional_light)*shadow_offset;
calcAtmospherics(pos.xyz);
- //vec4 color = calcLighting(pos.xyz, norm, gl_Color, vec4(0.));
- vec4 col = vec4(0.0, 0.0, 0.0, gl_Color.a);
+ //vec4 color = calcLighting(pos.xyz, norm, diffuse_color, vec4(0.));
+ vec4 col = vec4(0.0, 0.0, 0.0, diffuse_color.a);
// Collect normal lights
- 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].quadraticAttenuation, 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].quadraticAttenuation ,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].quadraticAttenuation, 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].quadraticAttenuation, 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].quadraticAttenuation, 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].quadraticAttenuation, gl_LightSource[7].specular.a);
+ col.rgb += light_diffuse[2].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[2], light_direction[2], light_attenuation[2].x, light_attenuation[2].y, light_attenuation[2].z);
+ col.rgb += light_diffuse[3].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[3], light_direction[3], light_attenuation[3].x, light_attenuation[3].y, light_attenuation[3].z);
+ col.rgb += light_diffuse[4].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[4], light_direction[4], light_attenuation[4].x, light_attenuation[4].y, light_attenuation[4].z);
+ col.rgb += light_diffuse[5].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[5], light_direction[5], light_attenuation[5].x, light_attenuation[5].y, light_attenuation[5].z);
+ col.rgb += light_diffuse[6].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[6], light_direction[6], light_attenuation[6].x, light_attenuation[6].y, light_attenuation[6].z);
+ col.rgb += light_diffuse[7].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[7], light_direction[7], light_attenuation[7].x, light_attenuation[7].y, light_attenuation[7].z);
- vary_pointlight_col = col.rgb*gl_Color.rgb;
+ vary_pointlight_col = col.rgb*diffuse_color.rgb;
col.rgb = vec3(0,0,0);
// Add windlight lights
col.rgb = atmosAmbient(vec3(0.));
- vary_ambient = col.rgb*gl_Color.rgb;
- vary_directional.rgb = gl_Color.rgb*atmosAffectDirectionalLight(max(calcDirectionalLight(norm, gl_LightSource[0].position.xyz), (1.0-gl_Color.a)*(1.0-gl_Color.a)));
+ vary_ambient = col.rgb*diffuse_color.rgb;
+ vary_directional.rgb = diffuse_color.rgb*atmosAffectDirectionalLight(max(calcDirectionalLight(norm, light_position[0].xyz), (1.0-diffuse_color.a)*(1.0-diffuse_color.a)));
- col.rgb = min(col.rgb*gl_Color.rgb, 1.0);
+ col.rgb = min(col.rgb*diffuse_color.rgb, 1.0);
- gl_FrontColor = col;
+ vertex_color = col;
- gl_FogFragCoord = pos.z;
- pos.xyz = (gl_ModelViewProjectionMatrix * gl_Vertex).xyz;
+
+ pos.xyz = (modelview_projection_matrix * vec4(position.xyz, 1.0)).xyz;
vary_fragcoord.xyz = pos.xyz + vec3(0,0,near_clip);
}
diff --git a/indra/newview/app_settings/shaders/class2/deferred/alphaV.glsl b/indra/newview/app_settings/shaders/class2/deferred/alphaV.glsl
index 307ae30098..1660f9687e 100644
--- a/indra/newview/app_settings/shaders/class2/deferred/alphaV.glsl
+++ b/indra/newview/app_settings/shaders/class2/deferred/alphaV.glsl
@@ -22,8 +22,17 @@
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
-
+uniform mat3 normal_matrix;
+uniform mat4 texture_matrix0;
+uniform mat4 modelview_matrix;
+uniform mat4 modelview_projection_matrix;
+
+ATTRIBUTE vec3 position;
+void passTextureIndex();
+ATTRIBUTE vec3 normal;
+ATTRIBUTE vec4 diffuse_color;
+ATTRIBUTE vec2 texcoord0;
vec4 calcLighting(vec3 pos, vec3 norm, vec4 color, vec4 baseCol);
void calcAtmospherics(vec3 inPositionEye);
@@ -35,34 +44,42 @@ vec3 atmosAffectDirectionalLight(float lightIntensity);
vec3 scaleDownLight(vec3 light);
vec3 scaleUpLight(vec3 light);
-varying vec3 vary_ambient;
-varying vec3 vary_directional;
-varying vec3 vary_fragcoord;
-varying vec3 vary_position;
-varying vec3 vary_pointlight_col;
-varying float vary_texture_index;
+VARYING vec3 vary_ambient;
+VARYING vec3 vary_directional;
+VARYING vec3 vary_fragcoord;
+VARYING vec3 vary_position;
+VARYING vec3 vary_pointlight_col;
+
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+
uniform float near_clip;
uniform float shadow_offset;
uniform float shadow_bias;
+uniform vec4 light_position[8];
+uniform vec3 light_direction[8];
+uniform vec3 light_attenuation[8];
+uniform vec3 light_diffuse[8];
+
float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float fa, float is_pointlight)
{
//get light vector
vec3 lv = lp.xyz-v;
//get distance
- float d = length(lv);
+ float d = dot(lv,lv);
float da = 0.0;
if (d > 0.0 && la > 0.0 && fa > 0.0)
{
//normalize light vector
- lv *= 1.0/d;
+ lv = normalize(lv);
//distance attenuation
- float dist2 = d*d/(la*la);
+ float dist2 = d/la;
da = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 0.0, 1.0);
// spotlight coefficient.
@@ -70,7 +87,7 @@ float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, floa
da *= spot*spot; // GL_SPOT_EXPONENT=2
//angular attenuation
- da *= calcDirectionalLight(n, lv);
+ da *= max(dot(n, lv), 0.0);
}
return da;
@@ -79,48 +96,49 @@ float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, floa
void main()
{
//transform vertex
- vec4 vert = vec4(gl_Vertex.xyz, 1.0);
- vary_texture_index = gl_Vertex.w;
- gl_Position = gl_ModelViewProjectionMatrix * vert;
-
- gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
+ vec4 vert = vec4(position.xyz, 1.0);
+ passTextureIndex();
+ vec4 pos = (modelview_matrix * vert);
+ gl_Position = modelview_projection_matrix*vec4(position.xyz, 1.0);
- vec4 pos = (gl_ModelViewMatrix * vert);
- vec3 norm = normalize(gl_NormalMatrix * gl_Normal);
+ vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy;
+
+ vec3 norm = normalize(normal_matrix * normal);
- float dp_directional_light = max(0.0, dot(norm, gl_LightSource[0].position.xyz));
- vary_position = pos.xyz + gl_LightSource[0].position.xyz * (1.0-dp_directional_light)*shadow_offset;
+ float dp_directional_light = max(0.0, dot(norm, light_position[0].xyz));
+ vary_position = pos.xyz + light_position[0].xyz * (1.0-dp_directional_light)*shadow_offset;
calcAtmospherics(pos.xyz);
- //vec4 color = calcLighting(pos.xyz, norm, gl_Color, vec4(0.));
- vec4 col = vec4(0.0, 0.0, 0.0, gl_Color.a);
+ //vec4 color = calcLighting(pos.xyz, norm, diffuse_color, vec4(0.));
+ vec4 col = vec4(0.0, 0.0, 0.0, diffuse_color.a);
- // Collect normal lights
- 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].quadraticAttenuation, 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].quadraticAttenuation ,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].quadraticAttenuation, 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].quadraticAttenuation, 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].quadraticAttenuation, 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].quadraticAttenuation, gl_LightSource[7].specular.a);
- vary_pointlight_col = col.rgb*gl_Color.rgb;
+ // Collect normal lights
+ col.rgb += light_diffuse[2].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[2], light_direction[2], light_attenuation[2].x, light_attenuation[2].y, light_attenuation[2].z);
+ col.rgb += light_diffuse[3].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[3], light_direction[3], light_attenuation[3].x, light_attenuation[3].y, light_attenuation[3].z);
+ col.rgb += light_diffuse[4].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[4], light_direction[4], light_attenuation[4].x, light_attenuation[4].y, light_attenuation[4].z);
+ col.rgb += light_diffuse[5].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[5], light_direction[5], light_attenuation[5].x, light_attenuation[5].y, light_attenuation[5].z);
+ col.rgb += light_diffuse[6].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[6], light_direction[6], light_attenuation[6].x, light_attenuation[6].y, light_attenuation[6].z);
+ col.rgb += light_diffuse[7].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[7], light_direction[7], light_attenuation[7].x, light_attenuation[7].y, light_attenuation[7].z);
+
+ vary_pointlight_col = col.rgb*diffuse_color.rgb;
col.rgb = vec3(0,0,0);
// Add windlight lights
col.rgb = atmosAmbient(vec3(0.));
- vary_ambient = col.rgb*gl_Color.rgb;
- vary_directional.rgb = gl_Color.rgb*atmosAffectDirectionalLight(max(calcDirectionalLight(norm, gl_LightSource[0].position.xyz), (1.0-gl_Color.a)*(1.0-gl_Color.a)));
+ vary_ambient = col.rgb*diffuse_color.rgb;
+ vary_directional.rgb = diffuse_color.rgb*atmosAffectDirectionalLight(max(calcDirectionalLight(norm, light_position[0].xyz), (1.0-diffuse_color.a)*(1.0-diffuse_color.a)));
- col.rgb = col.rgb*gl_Color.rgb;
+ col.rgb = col.rgb*diffuse_color.rgb;
- gl_FrontColor = col;
+ vertex_color = col;
- gl_FogFragCoord = pos.z;
- pos = gl_ModelViewProjectionMatrix * vert;
+
+ pos = modelview_projection_matrix * vert;
vary_fragcoord.xyz = pos.xyz + vec3(0,0,near_clip);
}
diff --git a/indra/newview/app_settings/shaders/class2/deferred/avatarAlphaV.glsl b/indra/newview/app_settings/shaders/class2/deferred/avatarAlphaV.glsl
index 80f386ecb0..84c27edb26 100644
--- a/indra/newview/app_settings/shaders/class2/deferred/avatarAlphaV.glsl
+++ b/indra/newview/app_settings/shaders/class2/deferred/avatarAlphaV.glsl
@@ -23,7 +23,11 @@
* $/LicenseInfo$
*/
+uniform mat4 projection_matrix;
+ATTRIBUTE vec3 position;
+ATTRIBUTE vec3 normal;
+ATTRIBUTE vec2 texcoord0;
vec4 calcLighting(vec3 pos, vec3 norm, vec4 color, vec4 baseCol);
mat4 getSkinnedTransform();
@@ -37,33 +41,42 @@ vec3 atmosAffectDirectionalLight(float lightIntensity);
vec3 scaleDownLight(vec3 light);
vec3 scaleUpLight(vec3 light);
-varying vec3 vary_position;
-varying vec3 vary_ambient;
-varying vec3 vary_directional;
-varying vec3 vary_fragcoord;
-varying vec3 vary_pointlight_col;
+VARYING vec3 vary_position;
+VARYING vec3 vary_ambient;
+VARYING vec3 vary_directional;
+VARYING vec3 vary_fragcoord;
+VARYING vec3 vary_pointlight_col;
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+
+uniform vec4 color;
uniform float near_clip;
uniform float shadow_offset;
uniform float shadow_bias;
+uniform vec4 light_position[8];
+uniform vec3 light_direction[8];
+uniform vec3 light_attenuation[8];
+uniform vec3 light_diffuse[8];
+
float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float fa, float is_pointlight)
{
//get light vector
vec3 lv = lp.xyz-v;
//get distance
- float d = length(lv);
+ float d = dot(lv,lv);
float da = 0.0;
if (d > 0.0 && la > 0.0 && fa > 0.0)
{
//normalize light vector
- lv *= 1.0/d;
+ lv = normalize(lv);
//distance attenuation
- float dist2 = d*d/(la*la);
+ float dist2 = d/la;
da = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 0.0, 1.0);
// spotlight coefficient.
@@ -71,7 +84,7 @@ float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, floa
da *= spot*spot; // GL_SPOT_EXPONENT=2
//angular attenuation
- da *= calcDirectionalLight(n, lv);
+ da *= max(dot(n, lv), 0.0);
}
return da;
@@ -79,56 +92,55 @@ float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, floa
void main()
{
- gl_TexCoord[0] = gl_MultiTexCoord0;
+ vary_texcoord0 = texcoord0;
vec4 pos;
vec3 norm;
mat4 trans = getSkinnedTransform();
- pos.x = dot(trans[0], gl_Vertex);
- pos.y = dot(trans[1], gl_Vertex);
- pos.z = dot(trans[2], gl_Vertex);
+ vec4 pos_in = vec4(position.xyz, 1.0);
+ pos.x = dot(trans[0], pos_in);
+ pos.y = dot(trans[1], pos_in);
+ pos.z = dot(trans[2], pos_in);
pos.w = 1.0;
- norm.x = dot(trans[0].xyz, gl_Normal);
- norm.y = dot(trans[1].xyz, gl_Normal);
- norm.z = dot(trans[2].xyz, gl_Normal);
+ norm.x = dot(trans[0].xyz, normal);
+ norm.y = dot(trans[1].xyz, normal);
+ norm.z = dot(trans[2].xyz, normal);
norm = normalize(norm);
- gl_Position = gl_ProjectionMatrix * pos;
+ gl_Position = projection_matrix * pos;
- float dp_directional_light = max(0.0, dot(norm, gl_LightSource[0].position.xyz));
- vary_position = pos.xyz + gl_LightSource[0].position.xyz * (1.0-dp_directional_light)*shadow_offset;
+ float dp_directional_light = max(0.0, dot(norm, light_position[0].xyz));
+ vary_position = pos.xyz + light_position[0].xyz * (1.0-dp_directional_light)*shadow_offset;
calcAtmospherics(pos.xyz);
- //vec4 color = calcLighting(pos.xyz, norm, gl_Color, vec4(0.));
-
- vec4 col = vec4(0.0, 0.0, 0.0, gl_Color.a);
+ vec4 col = vec4(0.0, 0.0, 0.0, 1.0);
// Collect normal lights
- 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].quadraticAttenuation, 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].quadraticAttenuation ,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].quadraticAttenuation, 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].quadraticAttenuation, 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].quadraticAttenuation, 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].quadraticAttenuation, gl_LightSource[7].specular.a);
+ col.rgb += light_diffuse[2].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[2], light_direction[2], light_attenuation[2].x, light_attenuation[2].y, light_attenuation[2].z);
+ col.rgb += light_diffuse[3].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[3], light_direction[3], light_attenuation[3].x, light_attenuation[3].y, light_attenuation[3].z);
+ col.rgb += light_diffuse[4].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[4], light_direction[4], light_attenuation[4].x, light_attenuation[4].y, light_attenuation[4].z);
+ col.rgb += light_diffuse[5].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[5], light_direction[5], light_attenuation[5].x, light_attenuation[5].y, light_attenuation[5].z);
+ col.rgb += light_diffuse[6].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[6], light_direction[6], light_attenuation[6].x, light_attenuation[6].y, light_attenuation[6].z);
+ col.rgb += light_diffuse[7].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[7], light_direction[7], light_attenuation[7].x, light_attenuation[7].y, light_attenuation[7].z);
- vary_pointlight_col = col.rgb*gl_Color.rgb;
+ vary_pointlight_col = col.rgb*color.rgb;
col.rgb = vec3(0,0,0);
// 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)));
+ vary_ambient = col.rgb*color.rgb;
+ vary_directional = atmosAffectDirectionalLight(max(calcDirectionalLight(norm, light_position[0].xyz), 0.0));
- col.rgb = min(col.rgb*gl_Color.rgb, 1.0);
+ col.rgb = col.rgb*color.rgb;
- gl_FrontColor = col;
+ vertex_color = col;
- gl_FogFragCoord = pos.z;
+
vary_fragcoord.xyz = pos.xyz + vec3(0,0,near_clip);
}
diff --git a/indra/newview/app_settings/shaders/class2/deferred/edgeF.glsl b/indra/newview/app_settings/shaders/class2/deferred/edgeF.glsl
deleted file mode 100644
index d9eafb6eba..0000000000
--- a/indra/newview/app_settings/shaders/class2/deferred/edgeF.glsl
+++ /dev/null
@@ -1,81 +0,0 @@
-/**
- * @file edgeF.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2007, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-
-
-#extension GL_ARB_texture_rectangle : enable
-
-uniform sampler2DRect depthMap;
-uniform sampler2DRect normalMap;
-
-varying vec2 vary_fragcoord;
-
-uniform float depth_cutoff;
-uniform float norm_cutoff;
-
-uniform mat4 inv_proj;
-uniform vec2 screen_res;
-
-float getDepth(vec2 pos_screen)
-{
- float z = texture2DRect(depthMap, pos_screen.xy).r;
- z = z*2.0-1.0;
- vec4 ndc = vec4(0.0, 0.0, z, 1.0);
- vec4 p = inv_proj*ndc;
- return p.z/p.w;
-}
-
-void main()
-{
- vec3 norm = texture2DRect(normalMap, vary_fragcoord.xy).xyz;
- norm = vec3((norm.xy-0.5)*2.0,norm.z); // unpack norm
- float depth = getDepth(vary_fragcoord.xy);
-
- vec2 tc = vary_fragcoord.xy;
-
- float sc = 0.75;
-
- vec2 de;
- de.x = (depth-getDepth(tc+vec2(sc, sc))) + (depth-getDepth(tc+vec2(-sc, -sc)));
- de.y = (depth-getDepth(tc+vec2(-sc, sc))) + (depth-getDepth(tc+vec2(sc, -sc)));
- de /= depth;
- de *= de;
- de = step(depth_cutoff, de);
-
- vec2 ne;
- vec3 nexnorm = texture2DRect(normalMap, tc+vec2(-sc,-sc)).rgb;
- nexnorm = vec3((nexnorm.xy-0.5)*2.0,nexnorm.z); // unpack norm
- ne.x = dot(nexnorm, norm);
- vec3 neynorm = texture2DRect(normalMap, tc+vec2(sc,sc)).rgb;
- neynorm = vec3((neynorm.xy-0.5)*2.0,neynorm.z); // unpack norm
- ne.y = dot(neynorm, norm);
-
- ne = 1.0-ne;
-
- ne = step(norm_cutoff, ne);
-
- gl_FragColor.a = dot(de,de)+dot(ne,ne);
- //gl_FragColor.a = dot(de,de);
-}
diff --git a/indra/newview/app_settings/shaders/class2/deferred/edgeMSF.glsl b/indra/newview/app_settings/shaders/class2/deferred/edgeMSF.glsl
deleted file mode 100644
index a84fdd5dc1..0000000000
--- a/indra/newview/app_settings/shaders/class2/deferred/edgeMSF.glsl
+++ /dev/null
@@ -1,92 +0,0 @@
-/**
- * @file edgeF.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2007, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-
-
-#extension GL_ARB_texture_rectangle : enable
-#extension GL_ARB_texture_multisample : enable
-
-uniform sampler2DMS depthMap;
-uniform sampler2DMS normalMap;
-
-varying vec2 vary_fragcoord;
-
-uniform float depth_cutoff;
-uniform float norm_cutoff;
-
-uniform mat4 inv_proj;
-uniform vec2 screen_res;
-
-float getDepth(ivec2 pos_screen, int sample)
-{
- float z = texelFetch(depthMap, pos_screen, sample).r;
- z = z*2.0-1.0;
- vec4 ndc = vec4(0.0, 0.0, z, 1.0);
- vec4 p = inv_proj*ndc;
- return p.z/p.w;
-}
-
-void main()
-{
- float e = 0;
-
- ivec2 itc = ivec2(vary_fragcoord.xy);
-
- for (int i = 0; i < samples; i++)
- {
- vec3 norm = texelFetch(normalMap, itc, i).xyz;
- norm = vec3((norm.xy-0.5)*2.0,norm.z); // unpack norm
- float depth = getDepth(itc, i);
-
- vec2 tc = vary_fragcoord.xy;
-
- int sc = 1;
-
- vec2 de;
- de.x = (depth-getDepth(itc+ivec2(sc, sc),i)) + (depth-getDepth(itc+ivec2(-sc, -sc), i));
- de.y = (depth-getDepth(itc+ivec2(-sc, sc),i)) + (depth-getDepth(itc+ivec2(sc, -sc), i));
- de /= depth;
- de *= de;
- de = step(depth_cutoff, de);
-
- vec2 ne;
- vec3 nexnorm = texelFetch(normalMap, itc+ivec2(-sc,-sc), i).rgb;
- nexnorm = vec3((nexnorm.xy-0.5)*2.0,nexnorm.z); // unpack norm
- ne.x = dot(nexnorm, norm);
- vec3 neynorm = texelFetch(normalMap, itc+ivec2(sc,sc), i).rgb;
- neynorm = vec3((neynorm.xy-0.5)*2.0,neynorm.z); // unpack norm
- ne.y = dot(neynorm, norm);
-
- ne = 1.0-ne;
-
- ne = step(norm_cutoff, ne);
-
- e += dot(de,de)+dot(ne,ne);
- }
-
- e /= samples;
-
- gl_FragColor.a = e;
-}
diff --git a/indra/newview/app_settings/shaders/class2/deferred/edgeV.glsl b/indra/newview/app_settings/shaders/class2/deferred/edgeV.glsl
deleted file mode 100644
index 9deff7bb2a..0000000000
--- a/indra/newview/app_settings/shaders/class2/deferred/edgeV.glsl
+++ /dev/null
@@ -1,37 +0,0 @@
-/**
- * @file edgeV.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2007, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-
-
-varying vec2 vary_fragcoord;
-uniform vec2 screen_res;
-
-void main()
-{
- //transform vertex
- gl_Position = ftransform();
- vec4 pos = gl_ModelViewProjectionMatrix * gl_Vertex;
- vary_fragcoord = (pos.xy*0.5+0.5)*screen_res;
-}
diff --git a/indra/newview/app_settings/shaders/class2/deferred/multiSpotLightF.glsl b/indra/newview/app_settings/shaders/class2/deferred/multiSpotLightF.glsl
index 0b31cbefd1..14a683971a 100644
--- a/indra/newview/app_settings/shaders/class2/deferred/multiSpotLightF.glsl
+++ b/indra/newview/app_settings/shaders/class2/deferred/multiSpotLightF.glsl
@@ -22,11 +22,13 @@
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
-
-
-
+
#extension GL_ARB_texture_rectangle : enable
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 gl_FragColor;
+#endif
+
uniform sampler2DRect diffuseRect;
uniform sampler2DRect specularRect;
uniform sampler2DRect depthMap;
@@ -34,7 +36,6 @@ uniform sampler2DRect normalMap;
uniform samplerCube environmentMap;
uniform sampler2DRect lightMap;
uniform sampler2D noiseMap;
-uniform sampler2D lightFunc;
uniform sampler2D projectionMap;
uniform mat4 proj_mat; //screen space to light space
@@ -54,9 +55,12 @@ uniform float sun_wash;
uniform int proj_shadow_idx;
uniform float shadow_fade;
-varying vec4 vary_light;
+uniform vec3 center;
+uniform float size;
+uniform vec3 color;
+uniform float falloff;
-varying vec4 vary_fragcoord;
+VARYING vec4 vary_fragcoord;
uniform vec2 screen_res;
uniform mat4 inv_proj;
@@ -128,9 +132,9 @@ void main()
frag.xy *= screen_res;
vec3 pos = getPosition(frag.xy).xyz;
- vec3 lv = vary_light.xyz-pos.xyz;
+ vec3 lv = center.xyz-pos.xyz;
float dist2 = dot(lv,lv);
- dist2 /= vary_light.w;
+ dist2 /= size;
if (dist2 > 1.0)
{
discard;
@@ -161,7 +165,7 @@ void main()
proj_tc.xyz /= proj_tc.w;
- float fa = gl_Color.a+1.0;
+ float fa = falloff+1.0;
float dist_atten = min(1.0-(dist2-1.0*(1.0-fa))/fa, 1.0);
if (dist_atten <= 0.0)
{
@@ -193,7 +197,7 @@ void main()
vec4 plcol = texture2DLodDiffuse(projectionMap, proj_tc.xy, lod);
- vec3 lcol = gl_Color.rgb * plcol.rgb * plcol.a;
+ vec3 lcol = color.rgb * plcol.rgb * plcol.a;
lit = da * dist_atten * noise;
@@ -210,7 +214,7 @@ void main()
amb_da = min(amb_da, 1.0-lit);
- col += amb_da*gl_Color.rgb*diff_tex.rgb*amb_plcol.rgb*amb_plcol.a;
+ col += amb_da*color.rgb*diff_tex.rgb*amb_plcol.rgb*amb_plcol.a;
}
@@ -243,7 +247,7 @@ void main()
stc.y > 0.0)
{
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;
+ col += dist_atten*scol.rgb*color.rgb*scol.a*spec.rgb*shadow;
}
}
}
diff --git a/indra/newview/app_settings/shaders/class2/deferred/multiSpotLightMSF.glsl b/indra/newview/app_settings/shaders/class2/deferred/multiSpotLightMSF.glsl
deleted file mode 100644
index 1afa9a9fb4..0000000000
--- a/indra/newview/app_settings/shaders/class2/deferred/multiSpotLightMSF.glsl
+++ /dev/null
@@ -1,262 +0,0 @@
-/**
- * @file multiSpotLightF.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2007, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-
-
-#extension GL_ARB_texture_rectangle : enable
-#extension GL_ARB_texture_multisample : enable
-
-uniform sampler2DMS diffuseRect;
-uniform sampler2DMS specularRect;
-uniform sampler2DMS depthMap;
-uniform sampler2DMS normalMap;
-uniform sampler2DRect lightMap;
-uniform sampler2D noiseMap;
-uniform sampler2D lightFunc;
-uniform sampler2D projectionMap;
-
-uniform mat4 proj_mat; //screen space to light space
-uniform float proj_near; //near clip for projection
-uniform vec3 proj_p; //plane projection is emitting from (in screen space)
-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;
-
-varying vec4 vary_fragcoord;
-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(ivec2 pos_screen, int sample)
-{
- float depth = texelFetch(depthMap, pos_screen, sample).r;
- vec2 sc = vec2(pos_screen.xy)*2.0;
- sc /= screen_res;
- sc -= vec2(1.0,1.0);
- vec4 ndc = vec4(sc.x, sc.y, 2.0*depth-1.0, 1.0);
- vec4 pos = inv_proj * ndc;
- pos /= pos.w;
- pos.w = 1.0;
- return pos;
-}
-
-void main()
-{
- int wght = 0;
-
- vec3 fcol = vec3(0,0,0);
-
- vec2 frag = (vary_fragcoord.xy*0.5+0.5)*screen_res;
-
- ivec2 itc = ivec2(frag.xy);
-
- float shadow = 1.0;
-
- if (proj_shadow_idx >= 0)
- {
- vec4 shd = texture2DRect(lightMap, frag);
- float sh[2];
- sh[0] = shd.b;
- sh[1] = shd.a;
- shadow = min(sh[proj_shadow_idx]+shadow_fade, 1.0);
- }
-
- for (int i = 0; i < samples; i++)
- {
- vec3 pos = getPosition(itc, i).xyz;
- vec3 lv = vary_light.xyz-pos.xyz;
- float dist2 = dot(lv,lv);
- dist2 /= vary_light.w;
- if (dist2 <= 1.0)
- {
- vec3 norm = texelFetch(normalMap, itc, i).xyz;
- norm = vec3((norm.xy-0.5)*2.0,norm.z); // unpack norm
-
- norm = normalize(norm);
- float l_dist = -dot(lv, proj_n);
-
- vec4 proj_tc = (proj_mat * vec4(pos.xyz, 1.0));
- if (proj_tc.z >= 0.0)
- {
- proj_tc.xyz /= proj_tc.w;
-
- float fa = gl_Color.a+1.0;
- float dist_atten = min(1.0-(dist2-1.0*(1.0-fa))/fa, 1.0);
- if (dist_atten > 0.0)
- {
- lv = proj_origin-pos.xyz;
- lv = normalize(lv);
- float da = dot(norm, lv);
-
- vec3 col = vec3(0,0,0);
-
- vec3 diff_tex = texelFetch(diffuseRect, itc, i).rgb;
-
- float noise = texture2D(noiseMap, frag.xy/128.0).b;
- if (proj_tc.z > 0.0 &&
- proj_tc.x < 1.0 &&
- proj_tc.y < 1.0 &&
- proj_tc.x > 0.0 &&
- 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 = 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*shadow;
- amb_da += (da*0.5)*(1.0-shadow)*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;
- }
-
-
- vec4 spec = texelFetch(specularRect, itc, i);
- if (spec.a > 0.0)
- {
- vec3 ref = reflect(normalize(pos), norm);
-
- //project from point pos in direction ref to plane proj_p, proj_n
- vec3 pdelta = proj_p-pos;
- float ds = dot(ref, proj_n);
-
- if (ds < 0.0)
- {
- vec3 pfinal = pos + ref * dot(pdelta, proj_n)/ds;
-
- vec4 stc = (proj_mat * vec4(pfinal.xyz, 1.0));
-
- 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 = texture2DLodSpecular(projectionMap, stc.xy, proj_lod-spec.a*proj_lod);
- col += dist_atten*scol.rgb*gl_Color.rgb*scol.a*spec.rgb*shadow;
- }
- }
- }
- }
-
- fcol += col;
- wght++;
- }
- }
- }
- }
-
- if (wght <= 0)
- {
- discard;
- }
-
- gl_FragColor.rgb = fcol/samples;
- gl_FragColor.a = 0.0;
-}
diff --git a/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl b/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl
index d7407332e5..97f3063a9e 100644
--- a/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl
+++ b/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl
@@ -23,16 +23,17 @@
* $/LicenseInfo$
*/
-
-
#extension GL_ARB_texture_rectangle : enable
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 gl_FragColor;
+#endif
+
uniform sampler2DRect diffuseRect;
uniform sampler2DRect specularRect;
uniform sampler2DRect normalMap;
uniform sampler2DRect lightMap;
uniform sampler2DRect depthMap;
-uniform sampler2D noiseMap;
uniform samplerCube environmentMap;
uniform sampler2D lightFunc;
uniform vec3 gi_quad;
@@ -58,15 +59,16 @@ uniform vec4 distance_multiplier;
uniform vec4 max_y;
uniform vec4 glow;
uniform float scene_light_strength;
-uniform vec3 env_mat[3];
+uniform mat3 env_mat;
uniform vec4 shadow_clip;
uniform mat3 ssao_effect_mat;
uniform mat4 inv_proj;
uniform vec2 screen_res;
-varying vec4 vary_light;
-varying vec2 vary_fragcoord;
+uniform vec3 sun_dir;
+
+VARYING vec2 vary_fragcoord;
vec3 vary_PositionEye;
@@ -145,10 +147,6 @@ void calcAtmospherics(vec3 inPositionEye, float ambFactor) {
vec3 P = inPositionEye;
setPositionEye(P);
- //(TERRAIN) limit altitude
- if (P.y > max_y.x) P *= (max_y.x / P.y);
- if (P.y < -max_y.x) P *= (-max_y.x / P.y);
-
vec3 tmpLightnorm = lightnorm.xyz;
vec3 Pn = normalize(P);
@@ -280,9 +278,8 @@ void main()
vec3 pos = getPosition_d(tc, depth).xyz;
vec3 norm = texture2DRect(normalMap, tc).xyz;
norm = vec3((norm.xy-0.5)*2.0,norm.z); // unpack norm
- //vec3 nz = texture2D(noiseMap, vary_fragcoord.xy/128.0).xyz;
-
- float da = max(dot(norm.xyz, vary_light.xyz), 0.0);
+
+ float da = max(dot(norm.xyz, sun_dir.xyz), 0.0);
vec4 diffuse = texture2DRect(diffuseRect, tc);
@@ -309,13 +306,18 @@ void main()
// the old infinite-sky shiny reflection
//
vec3 refnormpersp = normalize(reflect(pos.xyz, norm.xyz));
- float sa = dot(refnormpersp, vary_light.xyz);
- vec3 dumbshiny = vary_SunlitColor*scol_ambocc.r*texture2D(lightFunc, vec2(sa, spec.a)).a;
+ float sa = dot(refnormpersp, sun_dir.xyz);
+ vec3 dumbshiny = vary_SunlitColor*scol_ambocc.r*texture2D(lightFunc, vec2(sa, spec.a)).r;
// add the two types of shiny together
vec3 spec_contrib = dumbshiny * spec.rgb;
bloom = dot(spec_contrib, spec_contrib);
col += spec_contrib;
+
+ //add environmentmap
+ vec3 env_vec = env_mat * refnormpersp;
+ col = mix(col.rgb, textureCube(environmentMap, env_vec).rgb,
+ max(spec.a-diffuse.a*2.0, 0.0));
}
col = atmosLighting(col);
diff --git a/indra/newview/app_settings/shaders/class2/deferred/softenLightMSF.glsl b/indra/newview/app_settings/shaders/class2/deferred/softenLightMSF.glsl
deleted file mode 100644
index 1244294451..0000000000
--- a/indra/newview/app_settings/shaders/class2/deferred/softenLightMSF.glsl
+++ /dev/null
@@ -1,337 +0,0 @@
-/**
- * @file softenLightMSF.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2007, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-
-
-#extension GL_ARB_texture_rectangle : enable
-#extension GL_ARB_texture_multisample : enable
-
-uniform sampler2DMS diffuseRect;
-uniform sampler2DMS specularRect;
-uniform sampler2DMS normalMap;
-uniform sampler2DRect lightMap;
-uniform sampler2DMS depthMap;
-uniform sampler2D noiseMap;
-uniform samplerCube environmentMap;
-uniform sampler2D lightFunc;
-uniform vec3 gi_quad;
-
-uniform float blur_size;
-uniform float blur_fidelity;
-
-// Inputs
-uniform vec4 morphFactor;
-uniform vec3 camPosLocal;
-//uniform vec4 camPosWorld;
-uniform vec4 gamma;
-uniform vec4 lightnorm;
-uniform vec4 sunlight_color;
-uniform vec4 ambient;
-uniform vec4 blue_horizon;
-uniform vec4 blue_density;
-uniform vec4 haze_horizon;
-uniform vec4 haze_density;
-uniform vec4 cloud_shadow;
-uniform vec4 density_multiplier;
-uniform vec4 distance_multiplier;
-uniform vec4 max_y;
-uniform vec4 glow;
-uniform float scene_light_strength;
-uniform vec3 env_mat[3];
-uniform vec4 shadow_clip;
-uniform mat3 ssao_effect_mat;
-
-uniform mat4 inv_proj;
-uniform vec2 screen_res;
-
-varying vec4 vary_light;
-varying vec2 vary_fragcoord;
-
-vec3 vary_PositionEye;
-
-vec3 vary_SunlitColor;
-vec3 vary_AmblitColor;
-vec3 vary_AdditiveColor;
-vec3 vary_AtmosAttenuation;
-
-vec4 getPosition_d(vec2 pos_screen, float depth)
-{
- vec2 sc = pos_screen.xy*2.0;
- sc /= screen_res;
- sc -= vec2(1.0,1.0);
- vec4 ndc = vec4(sc.x, sc.y, 2.0*depth-1.0, 1.0);
- vec4 pos = inv_proj * ndc;
- pos /= pos.w;
- pos.w = 1.0;
- return pos;
-}
-
-vec3 getPositionEye()
-{
- return vary_PositionEye;
-}
-vec3 getSunlitColor()
-{
- return vary_SunlitColor;
-}
-vec3 getAmblitColor()
-{
- return vary_AmblitColor;
-}
-vec3 getAdditiveColor()
-{
- return vary_AdditiveColor;
-}
-vec3 getAtmosAttenuation()
-{
- return vary_AtmosAttenuation;
-}
-
-
-void setPositionEye(vec3 v)
-{
- vary_PositionEye = v;
-}
-
-void setSunlitColor(vec3 v)
-{
- vary_SunlitColor = v;
-}
-
-void setAmblitColor(vec3 v)
-{
- vary_AmblitColor = v;
-}
-
-void setAdditiveColor(vec3 v)
-{
- vary_AdditiveColor = v;
-}
-
-void setAtmosAttenuation(vec3 v)
-{
- vary_AtmosAttenuation = v;
-}
-
-void calcAtmospherics(vec3 inPositionEye, float ambFactor) {
-
- vec3 P = inPositionEye;
- setPositionEye(P);
-
- //(TERRAIN) limit altitude
- if (P.y > max_y.x) P *= (max_y.x / P.y);
- if (P.y < -max_y.x) P *= (-max_y.x / P.y);
-
- vec3 tmpLightnorm = lightnorm.xyz;
-
- vec3 Pn = normalize(P);
- float Plen = length(P);
-
- vec4 temp1 = vec4(0);
- vec3 temp2 = vec3(0);
- vec4 blue_weight;
- vec4 haze_weight;
- vec4 sunlight = sunlight_color;
- vec4 light_atten;
-
- //sunlight attenuation effect (hue and brightness) due to atmosphere
- //this is used later for sunlight modulation at various altitudes
- light_atten = (blue_density * 1.0 + vec4(haze_density.r) * 0.25) * (density_multiplier.x * max_y.x);
- //I had thought blue_density and haze_density should have equal weighting,
- //but attenuation due to haze_density tends to seem too strong
-
- temp1 = blue_density + vec4(haze_density.r);
- blue_weight = blue_density / temp1;
- haze_weight = vec4(haze_density.r) / temp1;
-
- //(TERRAIN) compute sunlight from lightnorm only (for short rays like terrain)
- temp2.y = max(0.0, tmpLightnorm.y);
- temp2.y = 1. / temp2.y;
- sunlight *= exp( - light_atten * temp2.y);
-
- // main atmospheric scattering line integral
- temp2.z = Plen * density_multiplier.x;
-
- // Transparency (-> temp1)
- // ATI Bugfix -- can't store temp1*temp2.z*distance_multiplier.x in a variable because the ati
- // compiler gets confused.
- temp1 = exp(-temp1 * temp2.z * distance_multiplier.x);
-
- //final atmosphere attenuation factor
- setAtmosAttenuation(temp1.rgb);
-
- //compute haze glow
- //(can use temp2.x as temp because we haven't used it yet)
- temp2.x = dot(Pn, tmpLightnorm.xyz);
- temp2.x = 1. - temp2.x;
- //temp2.x is 0 at the sun and increases away from sun
- temp2.x = max(temp2.x, .03); //was glow.y
- //set a minimum "angle" (smaller glow.y allows tighter, brighter hotspot)
- temp2.x *= glow.x;
- //higher glow.x gives dimmer glow (because next step is 1 / "angle")
- temp2.x = pow(temp2.x, glow.z);
- //glow.z should be negative, so we're doing a sort of (1 / "angle") function
-
- //add "minimum anti-solar illumination"
- temp2.x += .25;
-
- //increase ambient when there are more clouds
- vec4 tmpAmbient = ambient + (vec4(1.) - ambient) * cloud_shadow.x * 0.5;
-
- /* decrease value and saturation (that in HSV, not HSL) for occluded areas
- * // for HSV color/geometry used here, see http://gimp-savvy.com/BOOK/index.html?node52.html
- * // The following line of code performs the equivalent of:
- * float ambAlpha = tmpAmbient.a;
- * float ambValue = dot(vec3(tmpAmbient), vec3(0.577)); // projection onto <1/rt(3), 1/rt(3), 1/rt(3)>, the neutral white-black axis
- * vec3 ambHueSat = vec3(tmpAmbient) - vec3(ambValue);
- * tmpAmbient = vec4(RenderSSAOEffect.valueFactor * vec3(ambValue) + RenderSSAOEffect.saturationFactor *(1.0 - ambFactor) * ambHueSat, ambAlpha);
- */
- tmpAmbient = vec4(mix(ssao_effect_mat * tmpAmbient.rgb, tmpAmbient.rgb, ambFactor), tmpAmbient.a);
-
- //haze color
- setAdditiveColor(
- vec3(blue_horizon * blue_weight * (sunlight*(1.-cloud_shadow.x) + tmpAmbient)
- + (haze_horizon.r * haze_weight) * (sunlight*(1.-cloud_shadow.x) * temp2.x
- + tmpAmbient)));
-
- //brightness of surface both sunlight and ambient
- setSunlitColor(vec3(sunlight * .5));
- setAmblitColor(vec3(tmpAmbient * .25));
- setAdditiveColor(getAdditiveColor() * vec3(1.0 - temp1));
-}
-
-vec3 atmosLighting(vec3 light)
-{
- light *= getAtmosAttenuation().r;
- light += getAdditiveColor();
- return (2.0 * light);
-}
-
-vec3 atmosTransport(vec3 light) {
- light *= getAtmosAttenuation().r;
- light += getAdditiveColor() * 2.0;
- return light;
-}
-vec3 atmosGetDiffuseSunlightColor()
-{
- return getSunlitColor();
-}
-
-vec3 scaleDownLight(vec3 light)
-{
- return (light / scene_light_strength );
-}
-
-vec3 scaleUpLight(vec3 light)
-{
- return (light * scene_light_strength);
-}
-
-vec3 atmosAmbient(vec3 light)
-{
- return getAmblitColor() + light / 2.0;
-}
-
-vec3 atmosAffectDirectionalLight(float lightIntensity)
-{
- return getSunlitColor() * lightIntensity;
-}
-
-vec3 scaleSoftClip(vec3 light)
-{
- //soft clip effect:
- light = 1. - clamp(light, vec3(0.), vec3(1.));
- light = 1. - pow(light, gamma.xxx);
-
- return light;
-}
-
-void main()
-{
- vec2 tc = vary_fragcoord.xy;
- ivec2 itc = ivec2(tc);
-
- vec4 fcol = vec4(0,0,0,0);
-
- vec2 scol_ambocc = texture2DRect(lightMap, tc).rg;
- float ambocc = scol_ambocc.g;
-
- for (int i = 0; i < samples; ++i)
- {
- float depth = texelFetch(depthMap, itc.xy, i).r;
- vec3 pos = getPosition_d(tc, depth).xyz;
- vec3 norm = texelFetch(normalMap, itc, i).xyz;
- norm = vec3((norm.xy-0.5)*2.0,norm.z); // unpack norm
-
- float da = max(dot(norm.xyz, vary_light.xyz), 0.0);
-
- vec4 diffuse = texelFetch(diffuseRect, itc, i);
- vec3 col;
- float bloom = 0.0;
- if (diffuse.a < 0.9)
- {
- vec4 spec = texelFetch(specularRect, itc, i);
-
- float amb = 0;
-
- float scol = max(scol_ambocc.r, diffuse.a);
- amb += ambocc;
-
- calcAtmospherics(pos.xyz, ambocc);
-
- col = atmosAmbient(vec3(0));
- col += atmosAffectDirectionalLight(max(min(da, scol), diffuse.a));
-
- col *= diffuse.rgb;
-
- if (spec.a > 0.0) // specular reflection
- {
- // the old infinite-sky shiny reflection
- //
- vec3 refnormpersp = normalize(reflect(pos.xyz, norm.xyz));
- float sa = dot(refnormpersp, vary_light.xyz);
- vec3 dumbshiny = vary_SunlitColor*scol_ambocc.r*texture2D(lightFunc, vec2(sa, spec.a)).a;
-
- // add the two types of shiny together
- vec3 spec_contrib = dumbshiny * spec.rgb;
- bloom = dot(spec_contrib, spec_contrib);
- col += spec_contrib;
- }
-
- col = atmosLighting(col);
- col = scaleSoftClip(col);
-
- col = mix(col, diffuse.rgb, diffuse.a);
- }
- else
- {
- col = diffuse.rgb;
- }
-
- fcol += vec4(col, bloom);
- }
-
- gl_FragColor = fcol/samples;
-}
diff --git a/indra/newview/app_settings/shaders/class2/deferred/softenLightV.glsl b/indra/newview/app_settings/shaders/class2/deferred/softenLightV.glsl
index fed238510a..c840d72784 100644
--- a/indra/newview/app_settings/shaders/class2/deferred/softenLightV.glsl
+++ b/indra/newview/app_settings/shaders/class2/deferred/softenLightV.glsl
@@ -22,23 +22,21 @@
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
-
+uniform mat4 modelview_projection_matrix;
+
+ATTRIBUTE vec3 position;
uniform vec2 screen_res;
-varying vec4 vary_light;
-varying vec2 vary_fragcoord;
+VARYING vec2 vary_fragcoord;
+
void main()
{
//transform vertex
- gl_Position = ftransform();
+ vec4 pos = modelview_projection_matrix * vec4(position.xyz, 1.0);
+ gl_Position = pos;
- vec4 pos = gl_ModelViewProjectionMatrix * gl_Vertex;
- vary_fragcoord = (pos.xy*0.5+0.5)*screen_res;
-
- vec4 tex = gl_MultiTexCoord0;
- tex.w = 1.0;
- vary_light = gl_MultiTexCoord0;
+ vary_fragcoord = (pos.xy*0.5+0.5)*screen_res;
}
diff --git a/indra/newview/app_settings/shaders/class2/deferred/spotLightF.glsl b/indra/newview/app_settings/shaders/class2/deferred/spotLightF.glsl
index 25270f4939..31bd0c79da 100644
--- a/indra/newview/app_settings/shaders/class2/deferred/spotLightF.glsl
+++ b/indra/newview/app_settings/shaders/class2/deferred/spotLightF.glsl
@@ -23,9 +23,13 @@
* $/LicenseInfo$
*/
+#extension GL_ARB_texture_rectangle : enable
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 gl_FragColor;
+#endif
-#extension GL_ARB_texture_rectangle : enable
+VARYING vec4 vertex_color;
uniform sampler2DRect diffuseRect;
uniform sampler2DRect specularRect;
@@ -34,7 +38,6 @@ uniform sampler2DRect normalMap;
uniform samplerCube environmentMap;
uniform sampler2DRect lightMap;
uniform sampler2D noiseMap;
-uniform sampler2D lightFunc;
uniform sampler2D projectionMap;
uniform mat4 proj_mat; //screen space to light space
@@ -53,9 +56,9 @@ uniform float sun_wash;
uniform int proj_shadow_idx;
uniform float shadow_fade;
-varying vec4 vary_light;
+VARYING vec4 vary_light;
-varying vec4 vary_fragcoord;
+VARYING vec4 vary_fragcoord;
uniform vec2 screen_res;
uniform mat4 inv_proj;
@@ -114,7 +117,7 @@ void main()
proj_tc.xyz /= proj_tc.w;
- float fa = gl_Color.a+1.0;
+ float fa = vertex_color.a+1.0;
float dist_atten = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 0.0, 1.0);
lv = proj_origin-pos.xyz;
@@ -140,7 +143,7 @@ void main()
vec4 plcol = texture2DLod(projectionMap, proj_tc.xy, lod);
- vec3 lcol = gl_Color.rgb * plcol.rgb * plcol.a;
+ vec3 lcol = vertex_color.rgb * plcol.rgb * plcol.a;
lit = da * dist_atten * noise;
@@ -163,7 +166,7 @@ void main()
amb_da = min(amb_da, 1.0-lit);
- col += amb_da*gl_Color.rgb*diff_tex.rgb*amb_plcol.rgb*amb_plcol.a;
+ col += amb_da*vertex_color.rgb*diff_tex.rgb*amb_plcol.rgb*amb_plcol.a;
}
@@ -192,7 +195,7 @@ void main()
stc.y > 0.0)
{
vec4 scol = texture2DLod(projectionMap, stc.xy, proj_lod-spec.a*proj_lod);
- col += dist_atten*scol.rgb*gl_Color.rgb*scol.a*spec.rgb*shadow;
+ col += dist_atten*scol.rgb*vertex_color.rgb*scol.a*spec.rgb*shadow;
}
}
}
diff --git a/indra/newview/app_settings/shaders/class2/deferred/spotLightMSF.glsl b/indra/newview/app_settings/shaders/class2/deferred/spotLightMSF.glsl
deleted file mode 100644
index 4962e73e39..0000000000
--- a/indra/newview/app_settings/shaders/class2/deferred/spotLightMSF.glsl
+++ /dev/null
@@ -1,263 +0,0 @@
-/**
- * @file multiSpotLightF.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2007, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-
-
-#extension GL_ARB_texture_rectangle : enable
-#extension GL_ARB_texture_multisample : enable
-
-uniform sampler2DMS diffuseRect;
-uniform sampler2DMS specularRect;
-uniform sampler2DMS depthMap;
-uniform sampler2DMS normalMap;
-uniform sampler2DRect lightMap;
-uniform sampler2D noiseMap;
-uniform sampler2D lightFunc;
-uniform sampler2D projectionMap;
-
-uniform mat4 proj_mat; //screen space to light space
-uniform float proj_near; //near clip for projection
-uniform vec3 proj_p; //plane projection is emitting from (in screen space)
-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;
-
-varying vec4 vary_fragcoord;
-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(ivec2 pos_screen, int sample)
-{
- float depth = texelFetch(depthMap, pos_screen, sample).r;
- vec2 sc = vec2(pos_screen.xy)*2.0;
- sc /= screen_res;
- sc -= vec2(1.0,1.0);
- vec4 ndc = vec4(sc.x, sc.y, 2.0*depth-1.0, 1.0);
- vec4 pos = inv_proj * ndc;
- pos /= pos.w;
- pos.w = 1.0;
- return pos;
-}
-
-void main()
-{
- vec4 frag = vary_fragcoord;
- frag.xyz /= frag.w;
- frag.xyz = frag.xyz*0.5+0.5;
- frag.xy *= screen_res;
- ivec2 itc = ivec2(frag.xy);
-
- vec3 fcol = vec3(0,0,0);
- int wght = 0;
-
- float shadow = 1.0;
-
- if (proj_shadow_idx >= 0)
- {
- vec4 shd = texture2DRect(lightMap, frag.xy);
- float sh[2];
- sh[0] = shd.b;
- sh[1] = shd.a;
- shadow = min(sh[proj_shadow_idx]+shadow_fade, 1.0);
- }
-
- for (int i = 0; i < samples; i++)
- {
- vec3 pos = getPosition(itc, i).xyz;
- vec3 lv = vary_light.xyz-pos.xyz;
- float dist2 = dot(lv,lv);
- dist2 /= vary_light.w;
- if (dist2 <= 1.0)
- {
- vec3 norm = texelFetch(normalMap, itc, i).xyz;
- norm = vec3((norm.xy-0.5)*2.0,norm.z); // unpack norm
-
- norm = normalize(norm);
- float l_dist = -dot(lv, proj_n);
-
- vec4 proj_tc = (proj_mat * vec4(pos.xyz, 1.0));
- if (proj_tc.z >= 0.0)
- {
- proj_tc.xyz /= proj_tc.w;
-
- float fa = gl_Color.a+1.0;
- float dist_atten = min(1.0-(dist2-1.0*(1.0-fa))/fa, 1.0);
- if (dist_atten > 0.0)
- {
- lv = proj_origin-pos.xyz;
- lv = normalize(lv);
- float da = dot(norm, lv);
-
- vec3 col = vec3(0,0,0);
-
- vec3 diff_tex = texelFetch(diffuseRect, itc, i).rgb;
-
- float noise = texture2D(noiseMap, frag.xy/128.0).b;
- if (proj_tc.z > 0.0 &&
- proj_tc.x < 1.0 &&
- proj_tc.y < 1.0 &&
- proj_tc.x > 0.0 &&
- 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 = 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*shadow;
- amb_da += (da*0.5)*(1.0-shadow)*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;
- }
-
-
- vec4 spec = texelFetch(specularRect, itc, i);
- if (spec.a > 0.0)
- {
- vec3 ref = reflect(normalize(pos), norm);
-
- //project from point pos in direction ref to plane proj_p, proj_n
- vec3 pdelta = proj_p-pos;
- float ds = dot(ref, proj_n);
-
- if (ds < 0.0)
- {
- vec3 pfinal = pos + ref * dot(pdelta, proj_n)/ds;
-
- vec4 stc = (proj_mat * vec4(pfinal.xyz, 1.0));
-
- 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 = texture2DLodSpecular(projectionMap, stc.xy, proj_lod-spec.a*proj_lod);
- col += dist_atten*scol.rgb*gl_Color.rgb*scol.a*spec.rgb*shadow;
- }
- }
- }
- }
-
- fcol += col;
- wght++;
- }
- }
- }
- }
-
- if (wght <= 0)
- {
- discard;
- }
-
- gl_FragColor.rgb = fcol/wght;
- gl_FragColor.a = 0.0;
-}
diff --git a/indra/newview/app_settings/shaders/class2/deferred/sunLightF.glsl b/indra/newview/app_settings/shaders/class2/deferred/sunLightF.glsl
index 1809cff1e5..229c2f4b67 100644
--- a/indra/newview/app_settings/shaders/class2/deferred/sunLightF.glsl
+++ b/indra/newview/app_settings/shaders/class2/deferred/sunLightF.glsl
@@ -22,11 +22,13 @@
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
-
-
#extension GL_ARB_texture_rectangle : enable
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 gl_FragColor;
+#endif
+
//class 2, shadows, no SSAO
uniform sampler2DRect depthMap;
@@ -47,13 +49,13 @@ uniform float ssao_max_radius;
uniform float ssao_factor;
uniform float ssao_factor_inv;
-varying vec2 vary_fragcoord;
-varying vec4 vary_light;
+VARYING vec2 vary_fragcoord;
uniform mat4 inv_proj;
uniform vec2 screen_res;
uniform vec2 shadow_res;
uniform vec2 proj_shadow_res;
+uniform vec3 sun_dir;
uniform float shadow_bias;
uniform float shadow_offset;
@@ -132,10 +134,10 @@ void main()
}*/
float shadow = 1.0;
- float dp_directional_light = max(0.0, dot(norm, vary_light.xyz));
+ float dp_directional_light = max(0.0, dot(norm, sun_dir.xyz));
vec3 shadow_pos = pos.xyz + displace*norm;
- vec3 offset = vary_light.xyz * (1.0-dp_directional_light);
+ vec3 offset = sun_dir.xyz * (1.0-dp_directional_light);
vec4 spos = vec4(shadow_pos+offset*shadow_offset, 1.0);
diff --git a/indra/newview/app_settings/shaders/class2/deferred/sunLightMSF.glsl b/indra/newview/app_settings/shaders/class2/deferred/sunLightMSF.glsl
deleted file mode 100644
index ac4fe52655..0000000000
--- a/indra/newview/app_settings/shaders/class2/deferred/sunLightMSF.glsl
+++ /dev/null
@@ -1,220 +0,0 @@
-/**
- * @file sunLightMSF.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2007, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-
-
-#extension GL_ARB_texture_rectangle : enable
-#extension GL_ARB_texture_multisample : enable
-
-//class 2, shadows, no SSAO
-
-uniform sampler2DMS depthMap;
-uniform sampler2DMS normalMap;
-uniform sampler2DRectShadow shadowMap0;
-uniform sampler2DRectShadow shadowMap1;
-uniform sampler2DRectShadow shadowMap2;
-uniform sampler2DRectShadow shadowMap3;
-uniform sampler2DShadow shadowMap4;
-uniform sampler2DShadow shadowMap5;
-
-
-// Inputs
-uniform mat4 shadow_matrix[6];
-uniform vec4 shadow_clip;
-uniform float ssao_radius;
-uniform float ssao_max_radius;
-uniform float ssao_factor;
-uniform float ssao_factor_inv;
-
-varying vec2 vary_fragcoord;
-varying vec4 vary_light;
-
-uniform mat4 inv_proj;
-uniform vec2 screen_res;
-uniform vec2 shadow_res;
-uniform vec2 proj_shadow_res;
-
-uniform float shadow_bias;
-uniform float shadow_offset;
-
-uniform float spot_shadow_bias;
-uniform float spot_shadow_offset;
-
-vec4 getPosition(ivec2 pos_screen, int sample)
-{
- float depth = texelFetch(depthMap, pos_screen.xy, sample).r;
- vec2 sc = vec2(pos_screen.xy)*2.0;
- sc /= screen_res;
- sc -= vec2(1.0,1.0);
- vec4 ndc = vec4(sc.x, sc.y, 2.0*depth-1.0, 1.0);
- vec4 pos = inv_proj * ndc;
- pos /= pos.w;
- pos.w = 1.0;
- return pos;
-}
-
-float pcfShadow(sampler2DRectShadow shadowMap, vec4 stc, float scl)
-{
- stc.xyz /= stc.w;
- stc.z += shadow_bias*scl;
-
- float cs = shadow2DRect(shadowMap, stc.xyz).x;
- float shadow = cs;
-
- shadow += max(shadow2DRect(shadowMap, stc.xyz+vec3(1.5, 1.5, 0.0)).x, cs);
- shadow += max(shadow2DRect(shadowMap, stc.xyz+vec3(1.5, -1.5, 0.0)).x, cs);
- shadow += max(shadow2DRect(shadowMap, stc.xyz+vec3(-1.5, 1.5, 0.0)).x, cs);
- shadow += max(shadow2DRect(shadowMap, stc.xyz+vec3(-1.5, -1.5, 0.0)).x, cs);
-
- return shadow/5.0;
-
- //return shadow;
-}
-
-float pcfShadow(sampler2DShadow shadowMap, vec4 stc, float scl)
-{
- stc.xyz /= stc.w;
- stc.z += spot_shadow_bias*scl;
-
- float cs = shadow2D(shadowMap, stc.xyz).x;
- float shadow = cs;
-
- vec2 off = 1.5/proj_shadow_res;
-
- shadow += max(shadow2D(shadowMap, stc.xyz+vec3(off.x, off.y, 0.0)).x, cs);
- shadow += max(shadow2D(shadowMap, stc.xyz+vec3(off.x, -off.y, 0.0)).x, cs);
- shadow += max(shadow2D(shadowMap, stc.xyz+vec3(-off.x, off.y, 0.0)).x, cs);
- shadow += max(shadow2D(shadowMap, stc.xyz+vec3(-off.x, -off.y, 0.0)).x, cs);
-
- return shadow/5.0;
-
- //return shadow;
-}
-
-void main()
-{
- vec2 pos_screen = vary_fragcoord.xy;
- ivec2 itc = ivec2(pos_screen);
-
- //try doing an unproject here
-
- vec4 fcol = vec4(0,0,0,0);
-
- for (int i = 0; i < samples; i++)
- {
- vec4 pos = getPosition(itc, i);
-
- vec4 nmap4 = texelFetch(normalMap, itc, i);
- nmap4 = vec4((nmap4.xy-0.5)*2.0,nmap4.z,nmap4.w); // unpack norm
- float displace = nmap4.w;
- vec3 norm = nmap4.xyz;
-
- /*if (pos.z == 0.0) // do nothing for sky *FIX: REMOVE THIS IF/WHEN THE POSITION MAP IS BEING USED AS A STENCIL
- {
- gl_FragColor = vec4(0.0); // doesn't matter
- return;
- }*/
-
- float shadow = 1.0;
- float dp_directional_light = max(0.0, dot(norm, vary_light.xyz));
-
- vec3 shadow_pos = pos.xyz + displace*norm;
- vec3 offset = vary_light.xyz * (1.0-dp_directional_light);
-
- vec4 spos = vec4(shadow_pos+offset*shadow_offset, 1.0);
-
- if (spos.z > -shadow_clip.w)
- {
- if (dp_directional_light == 0.0)
- {
- // if we know this point is facing away from the sun then we know it's in shadow without having to do a squirrelly shadow-map lookup
- shadow = 0.0;
- }
- else
- {
- vec4 lpos;
-
- if (spos.z < -shadow_clip.z)
- {
- lpos = shadow_matrix[3]*spos;
- lpos.xy *= shadow_res;
- shadow = pcfShadow(shadowMap3, lpos, 0.25);
- shadow += max((pos.z+shadow_clip.z)/(shadow_clip.z-shadow_clip.w)*2.0-1.0, 0.0);
- }
- else if (spos.z < -shadow_clip.y)
- {
- lpos = shadow_matrix[2]*spos;
- lpos.xy *= shadow_res;
- shadow = pcfShadow(shadowMap2, lpos, 0.5);
- }
- else if (spos.z < -shadow_clip.x)
- {
- lpos = shadow_matrix[1]*spos;
- lpos.xy *= shadow_res;
- shadow = pcfShadow(shadowMap1, lpos, 0.75);
- }
- else
- {
- lpos = shadow_matrix[0]*spos;
- lpos.xy *= shadow_res;
- shadow = pcfShadow(shadowMap0, lpos, 1.0);
- }
-
- // take the most-shadowed value out of these two:
- // * the blurred sun shadow in the light (shadow) map
- // * an unblurred dot product between the sun and this norm
- // the goal is to err on the side of most-shadow to fill-in shadow holes and reduce artifacting
- shadow = min(shadow, dp_directional_light);
-
- //lpos.xy /= lpos.w*32.0;
- //if (fract(lpos.x) < 0.1 || fract(lpos.y) < 0.1)
- //{
- // shadow = 0.0;
- //}
-
- }
- }
- else
- {
- // more distant than the shadow map covers
- shadow = 1.0;
- }
-
- fcol[0] += shadow;
- fcol[1] += 1.0;
-
- spos = vec4(shadow_pos+norm*spot_shadow_offset, 1.0);
-
- //spotlight shadow 1
- vec4 lpos = shadow_matrix[4]*spos;
- fcol[2] += pcfShadow(shadowMap4, lpos, 0.8);
-
- //spotlight shadow 2
- lpos = shadow_matrix[5]*spos;
- fcol[3] += pcfShadow(shadowMap5, lpos, 0.8);
- }
-
- gl_FragColor = fcol/samples;
-}
diff --git a/indra/newview/app_settings/shaders/class2/deferred/sunLightSSAOF.glsl b/indra/newview/app_settings/shaders/class2/deferred/sunLightSSAOF.glsl
index 681186d6b2..6b420833b9 100644
--- a/indra/newview/app_settings/shaders/class2/deferred/sunLightSSAOF.glsl
+++ b/indra/newview/app_settings/shaders/class2/deferred/sunLightSSAOF.glsl
@@ -22,10 +22,12 @@
* $/LicenseInfo$
*/
-
-
#extension GL_ARB_texture_rectangle : enable
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 gl_FragColor;
+#endif
+
//class 2 -- shadows and SSAO
uniform sampler2DRect depthMap;
@@ -38,6 +40,7 @@ uniform sampler2DShadow shadowMap4;
uniform sampler2DShadow shadowMap5;
uniform sampler2D noiseMap;
+
// Inputs
uniform mat4 shadow_matrix[6];
uniform vec4 shadow_clip;
@@ -46,13 +49,13 @@ uniform float ssao_max_radius;
uniform float ssao_factor;
uniform float ssao_factor_inv;
-varying vec2 vary_fragcoord;
-varying vec4 vary_light;
+VARYING vec2 vary_fragcoord;
uniform mat4 inv_proj;
uniform vec2 screen_res;
uniform vec2 shadow_res;
uniform vec2 proj_shadow_res;
+uniform vec3 sun_dir;
uniform float shadow_bias;
uniform float shadow_offset;
@@ -73,11 +76,8 @@ vec4 getPosition(vec2 pos_screen)
return pos;
}
-//calculate decreases in ambient lighting when crowded out (SSAO)
-float calcAmbientOcclusion(vec4 pos, vec3 norm)
+vec2 getKern(int i)
{
- float ret = 1.0;
-
vec2 kern[8];
// exponentially (^2) distant occlusion samples spread around origin
kern[0] = vec2(-1.0, 0.0) * 0.125*0.125;
@@ -88,22 +88,30 @@ float calcAmbientOcclusion(vec4 pos, vec3 norm)
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;
+
+ return kern[i];
+}
+
+//calculate decreases in ambient lighting when crowded out (SSAO)
+float calcAmbientOcclusion(vec4 pos, vec3 norm)
+{
+ float ret = 1.0;
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 points = 0;
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++)
{
- vec2 samppos_screen = pos_screen + scale * reflect(kern[i], noise_reflect);
+ vec2 samppos_screen = pos_screen + scale * reflect(getKern(i), noise_reflect);
vec3 samppos_world = getPosition(samppos_screen).xyz;
-
+
vec3 diff = pos_world - samppos_world;
float dist2 = dot(diff, diff);
@@ -111,17 +119,21 @@ float calcAmbientOcclusion(vec4 pos, vec3 norm)
// --> 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)
-
- angle_hidden = angle_hidden + float(dot((samppos_world - 0.05*norm - pos_world), norm) > 0.0) * min(1.0/dist2, ssao_factor_inv);
+
+ float funky_val = (dot((samppos_world - 0.05*norm - pos_world), norm) > 0.0) ? 1.0 : 0.0;
+ angle_hidden = angle_hidden + funky_val * 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);
+ float diffz_val = (diff.z > -1.0) ? 1.0 : 0.0;
+ points = points + diffz_val;
}
- angle_hidden = min(ssao_factor*angle_hidden/float(points), 1.0);
-
- ret = (1.0 - (float(points != 0) * angle_hidden));
+ angle_hidden = min(ssao_factor*angle_hidden/points, 1.0);
+ float points_val = (points > 0.0) ? 1.0 : 0.0;
+ ret = (1.0 - (points_val * angle_hidden));
+
+ ret = max(ret, 0.0);
return min(ret, 1.0);
}
@@ -158,7 +170,6 @@ float pcfShadow(sampler2DShadow shadowMap, vec4 stc, float scl)
shadow += max(shadow2D(shadowMap, stc.xyz+vec3(-off.x, off.y, 0.0)).x, cs);
shadow += max(shadow2D(shadowMap, stc.xyz+vec3(-off.x, -off.y, 0.0)).x, cs);
-
return shadow/5.0;
//return shadow;
@@ -184,10 +195,10 @@ void main()
}*/
float shadow = 1.0;
- float dp_directional_light = max(0.0, dot(norm, vary_light.xyz));
+ float dp_directional_light = max(0.0, dot(norm, sun_dir.xyz));
vec3 shadow_pos = pos.xyz + displace*norm;
- vec3 offset = vary_light.xyz * (1.0-dp_directional_light);
+ vec3 offset = sun_dir.xyz * (1.0-dp_directional_light);
vec4 spos = vec4(shadow_pos+offset*shadow_offset, 1.0);
@@ -251,7 +262,7 @@ void main()
gl_FragColor[0] = shadow;
gl_FragColor[1] = calcAmbientOcclusion(pos, norm);
- spos.xyz = shadow_pos+norm*spot_shadow_offset;
+ spos = vec4(shadow_pos+norm*spot_shadow_offset, 1.0);
//spotlight shadow 1
vec4 lpos = shadow_matrix[4]*spos;
diff --git a/indra/newview/app_settings/shaders/class2/deferred/sunLightSSAOMSF.glsl b/indra/newview/app_settings/shaders/class2/deferred/sunLightSSAOMSF.glsl
deleted file mode 100644
index 0fd7b7525d..0000000000
--- a/indra/newview/app_settings/shaders/class2/deferred/sunLightSSAOMSF.glsl
+++ /dev/null
@@ -1,258 +0,0 @@
-/**
- * @file sunLightSSAOF.glsl
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2007, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-
-
-#extension GL_ARB_texture_rectangle : enable
-#extension GL_ARB_texture_multisample : enable
-
-//class 2 -- shadows and SSAO
-
-uniform sampler2DMS depthMap;
-uniform sampler2DMS normalMap;
-uniform sampler2DRectShadow shadowMap0;
-uniform sampler2DRectShadow shadowMap1;
-uniform sampler2DRectShadow shadowMap2;
-uniform sampler2DRectShadow shadowMap3;
-uniform sampler2DShadow shadowMap4;
-uniform sampler2DShadow shadowMap5;
-uniform sampler2D noiseMap;
-
-// Inputs
-uniform mat4 shadow_matrix[6];
-uniform vec4 shadow_clip;
-uniform float ssao_radius;
-uniform float ssao_max_radius;
-uniform float ssao_factor;
-uniform float ssao_factor_inv;
-
-varying vec2 vary_fragcoord;
-varying vec4 vary_light;
-
-uniform mat4 inv_proj;
-uniform vec2 screen_res;
-uniform vec2 shadow_res;
-uniform vec2 proj_shadow_res;
-
-uniform float shadow_bias;
-uniform float shadow_offset;
-
-uniform float spot_shadow_bias;
-uniform float spot_shadow_offset;
-
-vec4 getPosition(ivec2 pos_screen, int sample)
-{
- float depth = texelFetch(depthMap, pos_screen, sample).r;
- vec2 sc = vec2(pos_screen.xy)*2.0;
- sc /= screen_res;
- sc -= vec2(1.0,1.0);
- vec4 ndc = vec4(sc.x, sc.y, 2.0*depth-1.0, 1.0);
- vec4 pos = inv_proj * ndc;
- pos /= pos.w;
- pos.w = 1.0;
- return pos;
-}
-
-//calculate decreases in ambient lighting when crowded out (SSAO)
-float calcAmbientOcclusion(vec4 pos, vec3 norm, int sample)
-{
- float ret = 1.0;
-
- 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 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++)
- {
- ivec2 samppos_screen = ivec2(pos_screen + scale * reflect(kern[i], noise_reflect));
- vec3 samppos_world = getPosition(samppos_screen, sample).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)
-
- 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);
- }
-
- angle_hidden = min(ssao_factor*angle_hidden/float(points), 1.0);
-
- ret = (1.0 - (float(points != 0) * angle_hidden));
-
- return min(ret, 1.0);
-}
-
-float pcfShadow(sampler2DRectShadow shadowMap, vec4 stc, float scl)
-{
- stc.xyz /= stc.w;
- stc.z += shadow_bias*scl;
-
- float cs = shadow2DRect(shadowMap, stc.xyz).x;
- float shadow = cs;
-
- shadow += max(shadow2DRect(shadowMap, stc.xyz+vec3(1.5, 1.5, 0.0)).x, cs);
- shadow += max(shadow2DRect(shadowMap, stc.xyz+vec3(1.5, -1.5, 0.0)).x, cs);
- shadow += max(shadow2DRect(shadowMap, stc.xyz+vec3(-1.5, 1.5, 0.0)).x, cs);
- shadow += max(shadow2DRect(shadowMap, stc.xyz+vec3(-1.5, -1.5, 0.0)).x, cs);
-
- return shadow/5.0;
-
- //return shadow;
-}
-
-float pcfShadow(sampler2DShadow shadowMap, vec4 stc, float scl)
-{
- stc.xyz /= stc.w;
- stc.z += spot_shadow_bias*scl;
-
- float cs = shadow2D(shadowMap, stc.xyz).x;
- float shadow = cs;
-
- vec2 off = 1.5/proj_shadow_res;
-
- shadow += max(shadow2D(shadowMap, stc.xyz+vec3(off.x, off.y, 0.0)).x, cs);
- shadow += max(shadow2D(shadowMap, stc.xyz+vec3(off.x, -off.y, 0.0)).x, cs);
- shadow += max(shadow2D(shadowMap, stc.xyz+vec3(-off.x, off.y, 0.0)).x, cs);
- shadow += max(shadow2D(shadowMap, stc.xyz+vec3(-off.x, -off.y, 0.0)).x, cs);
-
-
- return shadow/5.0;
-
- //return shadow;
-}
-
-void main()
-{
- vec2 pos_screen = vary_fragcoord.xy;
- ivec2 itc = ivec2(pos_screen);
- vec4 fcol = vec4(0,0,0,0);
-
- for (int i = 0; i < samples; i++)
- {
- vec4 pos = getPosition(itc, i);
-
- vec4 nmap4 = texelFetch(normalMap, itc, i);
- nmap4 = vec4((nmap4.xy-0.5)*2.0,nmap4.z,nmap4.w); // unpack norm
- float displace = nmap4.w;
- vec3 norm = nmap4.xyz;
-
- float shadow = 1.0;
- float dp_directional_light = max(0.0, dot(norm, vary_light.xyz));
-
- vec3 shadow_pos = pos.xyz + displace*norm;
- vec3 offset = vary_light.xyz * (1.0-dp_directional_light);
-
- vec4 spos = vec4(shadow_pos+offset*shadow_offset, 1.0);
-
- if (spos.z > -shadow_clip.w)
- {
- if (dp_directional_light == 0.0)
- {
- // if we know this point is facing away from the sun then we know it's in shadow without having to do a squirrelly shadow-map lookup
- shadow = 0.0;
- }
- else
- {
- vec4 lpos;
-
- if (spos.z < -shadow_clip.z)
- {
- lpos = shadow_matrix[3]*spos;
- lpos.xy *= shadow_res;
- shadow = pcfShadow(shadowMap3, lpos, 0.25);
- shadow += max((pos.z+shadow_clip.z)/(shadow_clip.z-shadow_clip.w)*2.0-1.0, 0.0);
- }
- else if (spos.z < -shadow_clip.y)
- {
- lpos = shadow_matrix[2]*spos;
- lpos.xy *= shadow_res;
- shadow = pcfShadow(shadowMap2, lpos, 0.5);
- }
- else if (spos.z < -shadow_clip.x)
- {
- lpos = shadow_matrix[1]*spos;
- lpos.xy *= shadow_res;
- shadow = pcfShadow(shadowMap1, lpos, 0.75);
- }
- else
- {
- lpos = shadow_matrix[0]*spos;
- lpos.xy *= shadow_res;
- shadow = pcfShadow(shadowMap0, lpos, 1.0);
- }
-
- // take the most-shadowed value out of these two:
- // * the blurred sun shadow in the light (shadow) map
- // * an unblurred dot product between the sun and this norm
- // the goal is to err on the side of most-shadow to fill-in shadow holes and reduce artifacting
- shadow = min(shadow, dp_directional_light);
-
- }
- }
- else
- {
- // more distant than the shadow map covers
- shadow = 1.0;
- }
-
-
- fcol[0] += shadow;
- fcol[1] += calcAmbientOcclusion(pos, norm, i);
-
- spos.xyz = shadow_pos+offset*spot_shadow_offset;
-
- //spotlight shadow 1
- vec4 lpos = shadow_matrix[4]*spos;
- fcol[2] += pcfShadow(shadowMap4, lpos, 0.8);
-
- //spotlight shadow 2
- lpos = shadow_matrix[5]*spos;
- fcol[3] += pcfShadow(shadowMap5, lpos, 0.8);
- }
-
- gl_FragColor = fcol / samples;
-}
diff --git a/indra/newview/app_settings/shaders/class2/deferred/sunLightV.glsl b/indra/newview/app_settings/shaders/class2/deferred/sunLightV.glsl
index e7ab11c6ed..bc5eb5181d 100644
--- a/indra/newview/app_settings/shaders/class2/deferred/sunLightV.glsl
+++ b/indra/newview/app_settings/shaders/class2/deferred/sunLightV.glsl
@@ -1,5 +1,5 @@
/**
- * @file sunLightF.glsl
+ * @file sunLightV.glsl
*
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* Second Life Viewer Source Code
@@ -22,24 +22,20 @@
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
-
+uniform mat4 modelview_projection_matrix;
-varying vec4 vary_light;
-varying vec2 vary_fragcoord;
+ATTRIBUTE vec3 position;
+
+VARYING vec2 vary_fragcoord;
uniform vec2 screen_res;
void main()
{
//transform vertex
- gl_Position = ftransform();
- vec4 pos = gl_ModelViewProjectionMatrix * gl_Vertex;
- vary_fragcoord = (pos.xy * 0.5 + 0.5)*screen_res;
- vec4 tex = gl_MultiTexCoord0;
- tex.w = 1.0;
+ vec4 pos = modelview_projection_matrix * vec4(position.xyz, 1.0);
+ gl_Position = pos;
- vary_light = gl_MultiTexCoord0;
-
- gl_FrontColor = gl_Color;
+ vary_fragcoord = (pos.xy * 0.5 + 0.5)*screen_res;
}
diff --git a/indra/newview/app_settings/shaders/class2/effects/blurF.glsl b/indra/newview/app_settings/shaders/class2/effects/blurF.glsl
deleted file mode 100644
index 35411db04b..0000000000
--- a/indra/newview/app_settings/shaders/class2/effects/blurF.glsl
+++ /dev/null
@@ -1,51 +0,0 @@
-/**
- * @file blurf.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2007, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-
-
-uniform sampler2DRect RenderTexture;
-uniform float bloomStrength;
-
-varying vec4 gl_TexCoord[gl_MaxTextureCoords];
-void main(void)
-{
- float blurWeights[7];
- blurWeights[0] = 0.05;
- blurWeights[1] = 0.1;
- blurWeights[2] = 0.2;
- blurWeights[3] = 0.3;
- blurWeights[4] = 0.2;
- blurWeights[5] = 0.1;
- blurWeights[6] = 0.05;
-
- vec3 color = vec3(0,0,0);
- for (int i = 0; i < 7; i++){
- color += vec3(texture2DRect(RenderTexture, gl_TexCoord[i].st)) * blurWeights[i];
- }
-
- color *= bloomStrength;
-
- gl_FragColor = vec4(color, 1.0);
-}
diff --git a/indra/newview/app_settings/shaders/class2/effects/blurV.glsl b/indra/newview/app_settings/shaders/class2/effects/blurV.glsl
deleted file mode 100644
index 3e47ed15fe..0000000000
--- a/indra/newview/app_settings/shaders/class2/effects/blurV.glsl
+++ /dev/null
@@ -1,55 +0,0 @@
-/**
- * @file blurV.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2007, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-
-
-uniform vec2 texelSize;
-uniform vec2 blurDirection;
-uniform float blurWidth;
-
-void main(void)
-{
- // Transform vertex
- gl_Position = ftransform();
-
- vec2 blurDelta = texelSize * blurDirection * vec2(blurWidth, blurWidth);
- vec2 s = gl_MultiTexCoord0.st - (blurDelta * 3.0);
-
- // for (int i = 0; i < 7; i++) {
- // gl_TexCoord[i].st = s + (i * blurDelta);
- // }
-
- // MANUALLY UNROLL
- gl_TexCoord[0].st = s;
- gl_TexCoord[1].st = s + blurDelta;
- gl_TexCoord[2].st = s + (2. * blurDelta);
- gl_TexCoord[3].st = s + (3. * blurDelta);
- gl_TexCoord[4].st = s + (4. * blurDelta);
- gl_TexCoord[5].st = s + (5. * blurDelta);
- gl_TexCoord[6].st = s + (6. * blurDelta);
-
- // gl_TexCoord[0].st = s;
- // gl_TexCoord[1].st = blurDelta;
-}
diff --git a/indra/newview/app_settings/shaders/class2/effects/colorFilterF.glsl b/indra/newview/app_settings/shaders/class2/effects/colorFilterF.glsl
deleted file mode 100644
index 42ab8d40e8..0000000000
--- a/indra/newview/app_settings/shaders/class2/effects/colorFilterF.glsl
+++ /dev/null
@@ -1,51 +0,0 @@
-/**
- * @file colorFilterF.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2007, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-
-
-uniform sampler2DRect RenderTexture;
-uniform float brightness;
-uniform float contrast;
-uniform vec3 contrastBase;
-uniform float saturation;
-uniform vec3 lumWeights;
-
-const float gamma = 2.0;
-
-void main(void)
-{
- vec3 color = vec3(texture2DRect(RenderTexture, gl_TexCoord[0].st));
-
- /// Modulate brightness
- color *= brightness;
-
- /// Modulate contrast
- color = mix(contrastBase, color, contrast);
-
- /// Modulate saturation
- color = mix(vec3(dot(color, lumWeights)), color, saturation);
-
- gl_FragColor = vec4(color, 1.0);
-}
diff --git a/indra/newview/app_settings/shaders/class2/effects/drawQuadV.glsl b/indra/newview/app_settings/shaders/class2/effects/drawQuadV.glsl
deleted file mode 100644
index 25806cd914..0000000000
--- a/indra/newview/app_settings/shaders/class2/effects/drawQuadV.glsl
+++ /dev/null
@@ -1,34 +0,0 @@
-/**
- * @file drawQuadV.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2007, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-
-
-void main(void)
-{
- //transform vertex
- gl_Position = ftransform();
- gl_TexCoord[0] = gl_MultiTexCoord0;
- gl_TexCoord[1] = gl_MultiTexCoord1;
-}
diff --git a/indra/newview/app_settings/shaders/class2/effects/extractF.glsl b/indra/newview/app_settings/shaders/class2/effects/extractF.glsl
deleted file mode 100644
index 9187c8ec31..0000000000
--- a/indra/newview/app_settings/shaders/class2/effects/extractF.glsl
+++ /dev/null
@@ -1,42 +0,0 @@
-/**
- * @file extractF.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2007, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-
-
-uniform sampler2DRect RenderTexture;
-uniform float extractLow;
-uniform float extractHigh;
-uniform vec3 lumWeights;
-
-void main(void)
-{
- /// Get scene color
- vec3 color = vec3(texture2DRect(RenderTexture, gl_TexCoord[0].st));
-
- /// Extract luminance and scale up by night vision brightness
- float lum = smoothstep(extractLow, extractHigh, dot(color, lumWeights));
-
- gl_FragColor = vec4(vec3(lum), 1.0);
-}
diff --git a/indra/newview/app_settings/shaders/class2/effects/nightVisionF.glsl b/indra/newview/app_settings/shaders/class2/effects/nightVisionF.glsl
deleted file mode 100644
index 76b675a9bd..0000000000
--- a/indra/newview/app_settings/shaders/class2/effects/nightVisionF.glsl
+++ /dev/null
@@ -1,62 +0,0 @@
-/**
- * @file nightVisionF.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2007, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-
-
-uniform sampler2DRect RenderTexture;
-uniform sampler2D NoiseTexture;
-uniform float brightMult;
-uniform float noiseStrength;
-
-float luminance(vec3 color)
-{
- /// CALCULATING LUMINANCE (Using NTSC lum weights)
- /// http://en.wikipedia.org/wiki/Luma_%28video%29
- return dot(color, vec3(0.299, 0.587, 0.114));
-}
-
-void main(void)
-{
- /// Get scene color
- vec3 color = vec3(texture2DRect(RenderTexture, gl_TexCoord[0].st));
-
- /// Extract luminance and scale up by night vision brightness
- float lum = luminance(color) * brightMult;
-
- /// Convert into night vision color space
- /// Newer NVG colors (crisper and more saturated)
- vec3 outColor = (lum * vec3(0.91, 1.21, 0.9)) + vec3(-0.07, 0.1, -0.12);
-
- /// Add noise
- float noiseValue = texture2D(NoiseTexture, gl_TexCoord[1].st).r;
- noiseValue = (noiseValue - 0.5) * noiseStrength;
-
- /// Older NVG colors (more muted)
- // vec3 outColor = (lum * vec3(0.82, 0.75, 0.83)) + vec3(0.05, 0.32, -0.11);
-
- outColor += noiseValue;
-
- gl_FragColor = vec4(outColor, 1.0);
-}
diff --git a/indra/newview/app_settings/shaders/class2/effects/simpleF.glsl b/indra/newview/app_settings/shaders/class2/effects/simpleF.glsl
deleted file mode 100644
index abf1be6645..0000000000
--- a/indra/newview/app_settings/shaders/class2/effects/simpleF.glsl
+++ /dev/null
@@ -1,34 +0,0 @@
-/**
- * @file simpleF.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2007, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-
-
-uniform sampler2DRect RenderTexture;
-
-void main(void)
-{
- vec3 color = vec3(texture2DRect(RenderTexture, gl_TexCoord[0].st));
- gl_FragColor = vec4(1.0 - color, 1.0);
-}
diff --git a/indra/newview/app_settings/shaders/class2/environment/terrainF.glsl b/indra/newview/app_settings/shaders/class2/environment/terrainF.glsl
deleted file mode 100644
index df08fce0da..0000000000
--- a/indra/newview/app_settings/shaders/class2/environment/terrainF.glsl
+++ /dev/null
@@ -1,58 +0,0 @@
-/**
- * @file terrainF.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2007, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-
-
-uniform sampler2D detail_0;
-uniform sampler2D detail_1;
-uniform sampler2D detail_2;
-uniform sampler2D detail_3;
-uniform sampler2D alpha_ramp;
-
-vec3 atmosLighting(vec3 light);
-
-vec3 scaleSoftClip(vec3 color);
-
-void main()
-{
- /// Note: This should duplicate the blending functionality currently used for the terrain rendering.
-
- /// TODO Confirm tex coords and bind them appropriately in vert shader.
- vec4 color0 = texture2D(detail_0, gl_TexCoord[0].xy);
- vec4 color1 = texture2D(detail_1, gl_TexCoord[0].xy);
- vec4 color2 = texture2D(detail_2, gl_TexCoord[0].xy);
- vec4 color3 = texture2D(detail_3, gl_TexCoord[0].xy);
-
- float alpha1 = texture2D(alpha_ramp, gl_TexCoord[0].zw).a;
- float alpha2 = texture2D(alpha_ramp,gl_TexCoord[1].xy).a;
- float alphaFinal = texture2D(alpha_ramp, gl_TexCoord[1].zw).a;
- vec4 outColor = mix( mix(color3, color2, alpha2), mix(color1, color0, alpha1), alphaFinal );
-
- /// Add WL Components
- outColor.rgb = atmosLighting(outColor.rgb * gl_Color.rgb);
-
- gl_FragColor = vec4(scaleSoftClip(outColor.rgb), 1.0);
-}
-
diff --git a/indra/newview/app_settings/shaders/class2/environment/terrainV.glsl b/indra/newview/app_settings/shaders/class2/environment/terrainV.glsl
deleted file mode 100644
index 36d0c99b63..0000000000
--- a/indra/newview/app_settings/shaders/class2/environment/terrainV.glsl
+++ /dev/null
@@ -1,72 +0,0 @@
-/**
- * @file terrainV.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2007, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-
-
-void calcAtmospherics(vec3 inPositionEye);
-
-vec4 calcLighting(vec3 pos, vec3 norm, vec4 color, vec4 baseCol);
-
-vec4 texgen_object(vec4 vpos, vec4 tc, mat4 mat, vec4 tp0, vec4 tp1)
-{
- vec4 tcoord;
-
- tcoord.x = dot(vpos, tp0);
- tcoord.y = dot(vpos, tp1);
- tcoord.z = tc.z;
- tcoord.w = tc.w;
-
- tcoord = mat * tcoord;
-
- return tcoord;
-}
-
-void main()
-{
- //transform vertex
- gl_Position = ftransform();
-
- vec4 pos = gl_ModelViewMatrix * gl_Vertex;
- vec3 norm = normalize(gl_NormalMatrix * gl_Normal);
-
- /// Potentially better without it for water.
- pos /= pos.w;
-
- calcAtmospherics((gl_ModelViewMatrix * gl_Vertex).xyz);
-
- vec4 color = calcLighting(pos.xyz, norm, gl_Color, vec4(0));
-
- gl_FrontColor = color;
-
- // Transform and pass tex coords
- gl_TexCoord[0].xy = texgen_object(gl_Vertex, gl_MultiTexCoord0, gl_TextureMatrix[0], gl_ObjectPlaneS[0], gl_ObjectPlaneT[0]).xy;
-
- vec4 t = gl_MultiTexCoord1;
-
- gl_TexCoord[0].zw = t.xy;
- gl_TexCoord[1].xy = t.xy-vec2(2.0, 0.0);
- gl_TexCoord[1].zw = t.xy-vec2(1.0, 0.0);
-}
-
diff --git a/indra/newview/app_settings/shaders/class2/environment/terrainWaterF.glsl b/indra/newview/app_settings/shaders/class2/environment/terrainWaterF.glsl
deleted file mode 100644
index 90468b45a2..0000000000
--- a/indra/newview/app_settings/shaders/class2/environment/terrainWaterF.glsl
+++ /dev/null
@@ -1,59 +0,0 @@
-/**
- * @file terrainWaterF.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2007, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-
-
-uniform sampler2D detail_0;
-uniform sampler2D detail_1;
-uniform sampler2D detail_2;
-uniform sampler2D detail_3;
-uniform sampler2D alpha_ramp;
-
-vec3 atmosLighting(vec3 light);
-
-vec4 applyWaterFog(vec4 color);
-
-void main()
-{
- /// Note: This should duplicate the blending functionality currently used for the terrain rendering.
-
- /// TODO Confirm tex coords and bind them appropriately in vert shader.
- vec4 color0 = texture2D(detail_0, gl_TexCoord[0].xy);
- vec4 color1 = texture2D(detail_1, gl_TexCoord[0].xy);
- vec4 color2 = texture2D(detail_2, gl_TexCoord[0].xy);
- vec4 color3 = texture2D(detail_3, gl_TexCoord[0].xy);
-
- float alpha1 = texture2D(alpha_ramp, gl_TexCoord[0].zw).a;
- float alpha2 = texture2D(alpha_ramp,gl_TexCoord[1].xy).a;
- float alphaFinal = texture2D(alpha_ramp, gl_TexCoord[1].zw).a;
- vec4 outColor = mix( mix(color3, color2, alpha2), mix(color1, color0, alpha1), alphaFinal );
-
- /// Add WL Components
- outColor.rgb = atmosLighting(outColor.rgb * gl_Color.rgb);
-
- outColor = applyWaterFog(outColor);
- gl_FragColor = outColor;
-}
-
diff --git a/indra/newview/app_settings/shaders/class2/environment/underWaterF.glsl b/indra/newview/app_settings/shaders/class2/environment/underWaterF.glsl
deleted file mode 100644
index f947aa4be1..0000000000
--- a/indra/newview/app_settings/shaders/class2/environment/underWaterF.glsl
+++ /dev/null
@@ -1,108 +0,0 @@
-/**
- * @file underWaterF.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2007, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-
-
-uniform sampler2D diffuseMap;
-uniform sampler2D bumpMap;
-uniform sampler2D screenTex;
-uniform sampler2D refTex;
-uniform sampler2D screenDepth;
-
-uniform vec4 fogCol;
-uniform vec3 lightDir;
-uniform vec3 specular;
-uniform float lightExp;
-uniform vec2 fbScale;
-uniform float refScale;
-uniform float znear;
-uniform float zfar;
-uniform float kd;
-uniform vec4 waterPlane;
-uniform vec3 eyeVec;
-uniform vec4 waterFogColor;
-uniform float waterFogDensity;
-uniform float waterFogKS;
-uniform vec2 screenRes;
-
-//bigWave is (refCoord.w, view.w);
-varying vec4 refCoord;
-varying vec4 littleWave;
-varying vec4 view;
-
-vec4 applyWaterFog(vec4 color, vec3 viewVec)
-{
- //normalize view vector
- vec3 view = normalize(viewVec);
- float es = -view.z;
-
- //find intersection point with water plane and eye vector
-
- //get eye depth
- float e0 = max(-waterPlane.w, 0.0);
-
- //get object depth
- float depth = length(viewVec);
-
- //get "thickness" of water
- float l = max(depth, 0.1);
-
- float kd = waterFogDensity;
- float ks = waterFogKS;
- vec4 kc = waterFogColor;
-
- float F = 0.98;
-
- float t1 = -kd * pow(F, ks * e0);
- float t2 = kd + ks * es;
- float t3 = pow(F, t2*l) - 1.0;
-
- float L = min(t1/t2*t3, 1.0);
-
- float D = pow(0.98, l*kd);
- //return vec4(1.0, 0.0, 1.0, 1.0);
- return color * D + kc * L;
- //depth /= 10.0;
- //return vec4(depth,depth,depth,0.0);
-}
-
-void main()
-{
- vec4 color;
-
- //get detail normals
- vec3 wave1 = texture2D(bumpMap, vec2(refCoord.w, view.w)).xyz*2.0-1.0;
- vec3 wave2 = texture2D(bumpMap, littleWave.xy).xyz*2.0-1.0;
- vec3 wave3 = texture2D(bumpMap, littleWave.zw).xyz*2.0-1.0;
- vec3 wavef = normalize(wave1+wave2+wave3);
-
- //figure out distortion vector (ripply)
- vec2 distort = (refCoord.xy/refCoord.z) * 0.5 + 0.5;
- distort = distort+wavef.xy*refScale;
-
- vec4 fb = texture2D(screenTex, distort);
-
- gl_FragColor = applyWaterFog(fb,view.xyz);
-}
diff --git a/indra/newview/app_settings/shaders/class2/environment/waterF.glsl b/indra/newview/app_settings/shaders/class2/environment/waterF.glsl
deleted file mode 100644
index dc543b2231..0000000000
--- a/indra/newview/app_settings/shaders/class2/environment/waterF.glsl
+++ /dev/null
@@ -1,137 +0,0 @@
-/**
- * @file waterF.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2007, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-
-
-vec3 scaleSoftClip(vec3 inColor);
-vec3 atmosTransport(vec3 inColor);
-
-uniform sampler2D bumpMap;
-uniform sampler2D screenTex;
-uniform sampler2D refTex;
-
-uniform float sunAngle;
-uniform float sunAngle2;
-uniform vec3 lightDir;
-uniform vec3 specular;
-uniform float lightExp;
-uniform float refScale;
-uniform float kd;
-uniform vec2 screenRes;
-uniform vec3 normScale;
-uniform float fresnelScale;
-uniform float fresnelOffset;
-uniform float blurMultiplier;
-
-
-//bigWave is (refCoord.w, view.w);
-varying vec4 refCoord;
-varying vec4 littleWave;
-varying vec4 view;
-
-void main()
-{
- vec4 color;
-
- float dist = length(view.xy);
-
- //normalize view vector
- vec3 viewVec = normalize(view.xyz);
-
- //get wave normals
- vec3 wave1 = texture2D(bumpMap, vec2(refCoord.w, view.w)).xyz*2.0-1.0;
- vec3 wave2 = texture2D(bumpMap, littleWave.xy).xyz*2.0-1.0;
- vec3 wave3 = texture2D(bumpMap, littleWave.zw).xyz*2.0-1.0;
- //get base fresnel components
-
- vec3 df = vec3(
- dot(viewVec, wave1),
- dot(viewVec, (wave2 + wave3) * 0.5),
- dot(viewVec, wave3)
- ) * fresnelScale + fresnelOffset;
- df *= df;
-
- vec2 distort = (refCoord.xy/refCoord.z) * 0.5 + 0.5;
-
- float dist2 = dist;
- dist = max(dist, 5.0);
-
- float dmod = sqrt(dist);
-
- vec2 dmod_scale = vec2(dmod*dmod, dmod);
-
- //get reflected color
- vec2 refdistort1 = wave1.xy*normScale.x;
- vec2 refvec1 = distort+refdistort1/dmod_scale;
- vec4 refcol1 = texture2D(refTex, refvec1);
-
- vec2 refdistort2 = wave2.xy*normScale.y;
- vec2 refvec2 = distort+refdistort2/dmod_scale;
- vec4 refcol2 = texture2D(refTex, refvec2);
-
- vec2 refdistort3 = wave3.xy*normScale.z;
- vec2 refvec3 = distort+refdistort3/dmod_scale;
- vec4 refcol3 = texture2D(refTex, refvec3);
-
- vec4 refcol = refcol1 + refcol2 + refcol3;
- float df1 = df.x + df.y + df.z;
- refcol *= df1 * 0.333;
-
- vec3 wavef = (wave1 + wave2 * 0.4 + wave3 * 0.6) * 0.5;
-
- wavef.z *= max(-viewVec.z, 0.1);
- wavef = normalize(wavef);
-
- float df2 = dot(viewVec, wavef) * fresnelScale+fresnelOffset;
-
- vec2 refdistort4 = wavef.xy*0.125;
- refdistort4.y -= abs(refdistort4.y);
- vec2 refvec4 = distort+refdistort4/dmod;
- float dweight = min(dist2*blurMultiplier, 1.0);
- vec4 baseCol = texture2D(refTex, refvec4);
- refcol = mix(baseCol*df2, refcol, dweight);
-
- //get specular component
- float spec = clamp(dot(lightDir, (reflect(viewVec,wavef))),0.0,1.0);
-
- //harden specular
- spec = pow(spec, 128.0);
-
- //figure out distortion vector (ripply)
- vec2 distort2 = distort+wavef.xy*refScale/max(dmod*df1, 1.0);
-
- vec4 fb = texture2D(screenTex, distort2);
-
- //mix with reflection
- // Note we actually want to use just df1, but multiplying by 0.999999 gets around and nvidia compiler bug
- color.rgb = mix(fb.rgb, refcol.rgb, df1 * 0.99999);
- color.rgb += spec * specular;
-
- color.rgb = atmosTransport(color.rgb);
- color.rgb = scaleSoftClip(color.rgb);
- color.a = spec * sunAngle2;
-
- gl_FragColor = color;
-}
diff --git a/indra/newview/app_settings/shaders/class2/environment/waterFogF.glsl b/indra/newview/app_settings/shaders/class2/environment/waterFogF.glsl
deleted file mode 100644
index 4bdfce9260..0000000000
--- a/indra/newview/app_settings/shaders/class2/environment/waterFogF.glsl
+++ /dev/null
@@ -1,74 +0,0 @@
-/**
- * @file waterFogF.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2007, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-
-
-uniform vec4 lightnorm;
-uniform vec4 waterPlane;
-uniform vec4 waterFogColor;
-uniform float waterFogDensity;
-uniform float waterFogKS;
-
-vec3 getPositionEye();
-
-vec4 applyWaterFog(vec4 color)
-{
- //normalize view vector
- vec3 view = normalize(getPositionEye());
- float es = -(dot(view, waterPlane.xyz));
-
- //find intersection point with water plane and eye vector
-
- //get eye depth
- float e0 = max(-waterPlane.w, 0.0);
-
- vec3 int_v = waterPlane.w > 0.0 ? view * waterPlane.w/es : vec3(0.0, 0.0, 0.0);
-
- //get object depth
- float depth = length(getPositionEye() - int_v);
-
- //get "thickness" of water
- float l = max(depth, 0.1);
-
- float kd = waterFogDensity;
- float ks = waterFogKS;
- vec4 kc = waterFogColor;
-
- float F = 0.98;
-
- float t1 = -kd * pow(F, ks * e0);
- float t2 = kd + ks * es;
- float t3 = pow(F, t2*l) - 1.0;
-
- float L = min(t1/t2*t3, 1.0);
-
- float D = pow(0.98, l*kd);
-
- color.rgb = color.rgb * D + kc.rgb * L;
- color.a = kc.a + color.a;
-
- return color;
-}
-
diff --git a/indra/newview/app_settings/shaders/class2/lighting/lightAlphaMaskF.glsl b/indra/newview/app_settings/shaders/class2/lighting/lightAlphaMaskF.glsl
deleted file mode 100644
index 4c05329065..0000000000
--- a/indra/newview/app_settings/shaders/class2/lighting/lightAlphaMaskF.glsl
+++ /dev/null
@@ -1,48 +0,0 @@
-/**
- * @file lightAlphaMaskF.glsl
- *
- * $LicenseInfo:firstyear=2011&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2011, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-
-uniform float minimum_alpha;
-uniform float maximum_alpha;
-
-vec3 atmosLighting(vec3 light);
-vec3 scaleSoftClip(vec3 light);
-
-void default_lighting()
-{
- vec4 color = diffuseLookup(gl_TexCoord[0].xy) * gl_Color;
-
- if (color.a < minimum_alpha || color.a > maximum_alpha)
- {
- discard;
- }
-
- color.rgb = atmosLighting(color.rgb);
-
- color.rgb = scaleSoftClip(color.rgb);
-
- gl_FragColor = color;
-}
-
diff --git a/indra/newview/app_settings/shaders/class2/lighting/lightAlphaMaskNonIndexedF.glsl b/indra/newview/app_settings/shaders/class2/lighting/lightAlphaMaskNonIndexedF.glsl
deleted file mode 100644
index 0de909353e..0000000000
--- a/indra/newview/app_settings/shaders/class2/lighting/lightAlphaMaskNonIndexedF.glsl
+++ /dev/null
@@ -1,51 +0,0 @@
-/**
- * @file lightAlphaMaskNonIndexedF.glsl
- *
- * $LicenseInfo:firstyear=2011&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2011, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-
-uniform float minimum_alpha;
-uniform float maximum_alpha;
-
-
-uniform sampler2D diffuseMap;
-
-vec3 atmosLighting(vec3 light);
-vec3 scaleSoftClip(vec3 light);
-
-void default_lighting()
-{
- vec4 color = texture2D(diffuseMap,gl_TexCoord[0].xy) * gl_Color;
-
- if (color.a < minimum_alpha || color.a > maximum_alpha)
- {
- discard;
- }
-
- color.rgb = atmosLighting(color.rgb);
-
- color.rgb = scaleSoftClip(color.rgb);
-
- gl_FragColor = color;
-}
-
diff --git a/indra/newview/app_settings/shaders/class2/lighting/lightF.glsl b/indra/newview/app_settings/shaders/class2/lighting/lightF.glsl
deleted file mode 100644
index d12d88f1c5..0000000000
--- a/indra/newview/app_settings/shaders/class2/lighting/lightF.glsl
+++ /dev/null
@@ -1,41 +0,0 @@
-/**
- * @file lightF.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2007, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-
-
-vec3 atmosLighting(vec3 light);
-vec3 scaleSoftClip(vec3 light);
-
-void default_lighting()
-{
- vec4 color = diffuseLookup(gl_TexCoord[0].xy) * gl_Color;
-
- color.rgb = atmosLighting(color.rgb);
-
- color.rgb = scaleSoftClip(color.rgb);
-
- gl_FragColor = color;
-}
-
diff --git a/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightAlphaMaskF.glsl b/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightAlphaMaskF.glsl
deleted file mode 100644
index 8c7713c08d..0000000000
--- a/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightAlphaMaskF.glsl
+++ /dev/null
@@ -1,47 +0,0 @@
-/**
- * @file lightFullbrightAlphaMaskF.glsl
- *
- * $LicenseInfo:firstyear=2011&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2011, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-uniform float minimum_alpha;
-uniform float maximum_alpha;
-
-vec3 fullbrightAtmosTransport(vec3 light);
-vec3 fullbrightScaleSoftClip(vec3 light);
-
-void fullbright_lighting()
-{
- vec4 color = diffuseLookup(gl_TexCoord[0].xy) * gl_Color;
-
- if (color.a < minimum_alpha || color.a > maximum_alpha)
- {
- discard;
- }
-
- color.rgb = fullbrightAtmosTransport(color.rgb);
-
- color.rgb = fullbrightScaleSoftClip(color.rgb);
-
- gl_FragColor = color;
-}
-
diff --git a/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightF.glsl b/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightF.glsl
deleted file mode 100644
index f03b1fdc74..0000000000
--- a/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightF.glsl
+++ /dev/null
@@ -1,41 +0,0 @@
-/**
- * @file lightFullbrightF.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2007, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-
-
-vec3 fullbrightAtmosTransport(vec3 light);
-vec3 fullbrightScaleSoftClip(vec3 light);
-
-void fullbright_lighting()
-{
- vec4 color = diffuseLookup(gl_TexCoord[0].xy) * gl_Color;
-
- color.rgb = fullbrightAtmosTransport(color.rgb);
-
- color.rgb = fullbrightScaleSoftClip(color.rgb);
-
- gl_FragColor = color;
-}
-
diff --git a/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightNonIndexedAlphaMaskF.glsl b/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightNonIndexedAlphaMaskF.glsl
deleted file mode 100644
index 89468b9665..0000000000
--- a/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightNonIndexedAlphaMaskF.glsl
+++ /dev/null
@@ -1,49 +0,0 @@
-/**
- * @file lightFullbrightNonIndexedAlphaMaskF.glsl
- *
- * $LicenseInfo:firstyear=2011&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2011, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-uniform float minimum_alpha;
-uniform float maximum_alpha;
-
-vec3 fullbrightAtmosTransport(vec3 light);
-vec3 fullbrightScaleSoftClip(vec3 light);
-
-uniform sampler2D diffuseMap;
-
-void fullbright_lighting()
-{
- vec4 color = texture2D(diffuseMap,gl_TexCoord[0].xy) * gl_Color;
-
- if (color.a < minimum_alpha || color.a > maximum_alpha)
- {
- discard;
- }
-
- color.rgb = fullbrightAtmosTransport(color.rgb);
-
- color.rgb = fullbrightScaleSoftClip(color.rgb);
-
- gl_FragColor = color;
-}
-
diff --git a/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightNonIndexedF.glsl b/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightNonIndexedF.glsl
deleted file mode 100644
index a909ff608a..0000000000
--- a/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightNonIndexedF.glsl
+++ /dev/null
@@ -1,43 +0,0 @@
-/**
- * @file lightFullbrightF.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2007, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-
-
-vec3 fullbrightAtmosTransport(vec3 light);
-vec3 fullbrightScaleSoftClip(vec3 light);
-
-uniform sampler2D diffuseMap;
-
-void fullbright_lighting()
-{
- vec4 color = texture2D(diffuseMap,gl_TexCoord[0].xy) * gl_Color;
-
- color.rgb = fullbrightAtmosTransport(color.rgb);
-
- color.rgb = fullbrightScaleSoftClip(color.rgb);
-
- gl_FragColor = color;
-}
-
diff --git a/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightShinyF.glsl b/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightShinyF.glsl
deleted file mode 100644
index d2bc912edb..0000000000
--- a/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightShinyF.glsl
+++ /dev/null
@@ -1,49 +0,0 @@
-/**
- * @file lightFullbrightShinyF.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2007, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-
-
-uniform samplerCube environmentMap;
-
-vec3 fullbrightShinyAtmosTransport(vec3 light);
-vec3 fullbrightScaleSoftClip(vec3 light);
-
-void fullbright_shiny_lighting()
-{
- vec4 color = diffuseLookup(gl_TexCoord[0].xy);
- color.rgb *= gl_Color.rgb;
-
- vec3 envColor = textureCube(environmentMap, gl_TexCoord[1].xyz).rgb;
- color.rgb = mix(color.rgb, envColor.rgb, gl_Color.a);
-
- color.rgb = fullbrightShinyAtmosTransport(color.rgb);
-
- color.rgb = fullbrightScaleSoftClip(color.rgb);
-
- color.a = max(color.a, gl_Color.a);
-
- gl_FragColor = color;
-}
-
diff --git a/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightShinyNonIndexedF.glsl b/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightShinyNonIndexedF.glsl
deleted file mode 100644
index af73168c13..0000000000
--- a/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightShinyNonIndexedF.glsl
+++ /dev/null
@@ -1,50 +0,0 @@
-/**
- * @file lightFullbrightShinyF.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2007, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-
-
-uniform samplerCube environmentMap;
-uniform sampler2D diffuseMap;
-
-vec3 fullbrightShinyAtmosTransport(vec3 light);
-vec3 fullbrightScaleSoftClip(vec3 light);
-
-void fullbright_shiny_lighting()
-{
- vec4 color = texture2D(diffuseMap, gl_TexCoord[0].xy);
- color.rgb *= gl_Color.rgb;
-
- vec3 envColor = textureCube(environmentMap, gl_TexCoord[1].xyz).rgb;
- color.rgb = mix(color.rgb, envColor.rgb, gl_Color.a);
-
- color.rgb = fullbrightShinyAtmosTransport(color.rgb);
-
- color.rgb = fullbrightScaleSoftClip(color.rgb);
-
- color.a = max(color.a, gl_Color.a);
-
- gl_FragColor = color;
-}
-
diff --git a/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightShinyWaterF.glsl b/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightShinyWaterF.glsl
deleted file mode 100644
index e9dab85095..0000000000
--- a/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightShinyWaterF.glsl
+++ /dev/null
@@ -1,48 +0,0 @@
-/**
- * @file lightFullbrightShinyWaterF.glsl
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2007, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-
-
-
-uniform samplerCube environmentMap;
-
-vec3 fullbrightShinyAtmosTransport(vec3 light);
-vec3 fullbrightScaleSoftClip(vec3 light);
-vec4 applyWaterFog(vec4 color);
-
-void fullbright_shiny_lighting_water()
-{
- vec4 color = diffuseLookup(gl_TexCoord[0].xy);
- color.rgb *= gl_Color.rgb;
-
- vec3 envColor = textureCube(environmentMap, gl_TexCoord[1].xyz).rgb;
- color.rgb = mix(color.rgb, envColor.rgb, gl_Color.a);
-
- color.rgb = fullbrightShinyAtmosTransport(color.rgb);
- color.rgb = fullbrightScaleSoftClip(color.rgb);
- color.a = max(color.a, gl_Color.a);
-
- gl_FragColor = applyWaterFog(color);
-}
-
diff --git a/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightShinyWaterNonIndexedF.glsl b/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightShinyWaterNonIndexedF.glsl
deleted file mode 100644
index e0a7986705..0000000000
--- a/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightShinyWaterNonIndexedF.glsl
+++ /dev/null
@@ -1,49 +0,0 @@
-/**
- * @file lightFullbrightShinyWaterF.glsl
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2007, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-
-
-
-uniform samplerCube environmentMap;
-uniform sampler2D diffuseMap;
-
-vec3 fullbrightShinyAtmosTransport(vec3 light);
-vec3 fullbrightScaleSoftClip(vec3 light);
-vec4 applyWaterFog(vec4 color);
-
-void fullbright_shiny_lighting_water()
-{
- vec4 color = texture2D(diffuseMap,gl_TexCoord[0].xy);
- color.rgb *= gl_Color.rgb;
-
- vec3 envColor = textureCube(environmentMap, gl_TexCoord[1].xyz).rgb;
- color.rgb = mix(color.rgb, envColor.rgb, gl_Color.a);
-
- color.rgb = fullbrightShinyAtmosTransport(color.rgb);
- color.rgb = fullbrightScaleSoftClip(color.rgb);
- color.a = max(color.a, gl_Color.a);
-
- gl_FragColor = applyWaterFog(color);
-}
-
diff --git a/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightWaterAlphaMaskF.glsl b/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightWaterAlphaMaskF.glsl
deleted file mode 100644
index e5998b77a9..0000000000
--- a/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightWaterAlphaMaskF.glsl
+++ /dev/null
@@ -1,47 +0,0 @@
-/**
- * @file lightFullbrightWaterAlphaMaskF.glsl
- *
- * $LicenseInfo:firstyear=2011&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2011, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-uniform float minimum_alpha;
-uniform float maximum_alpha;
-
-vec4 diffuseLookup(vec2 texcoord);
-
-vec3 fullbrightAtmosTransport(vec3 light);
-vec4 applyWaterFog(vec4 color);
-
-void fullbright_lighting_water()
-{
- vec4 color = diffuseLookup(gl_TexCoord[0].xy) * gl_Color;
-
- if (color.a < minimum_alpha || color.a > maximum_alpha)
- {
- discard;
- }
-
- color.rgb = fullbrightAtmosTransport(color.rgb);
-
- gl_FragColor = applyWaterFog(color);
-}
-
diff --git a/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightWaterF.glsl b/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightWaterF.glsl
deleted file mode 100644
index 20ff3712af..0000000000
--- a/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightWaterF.glsl
+++ /dev/null
@@ -1,41 +0,0 @@
-/**
- * @file lightFullbrightWaterF.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2007, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-
-
-vec4 diffuseLookup(vec2 texcoord);
-
-vec3 fullbrightAtmosTransport(vec3 light);
-vec4 applyWaterFog(vec4 color);
-
-void fullbright_lighting_water()
-{
- vec4 color = diffuseLookup(gl_TexCoord[0].xy) * gl_Color;
-
- color.rgb = fullbrightAtmosTransport(color.rgb);
-
- gl_FragColor = applyWaterFog(color);
-}
-
diff --git a/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightWaterNonIndexedAlphaMaskF.glsl b/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightWaterNonIndexedAlphaMaskF.glsl
deleted file mode 100644
index 3fdd110f7d..0000000000
--- a/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightWaterNonIndexedAlphaMaskF.glsl
+++ /dev/null
@@ -1,47 +0,0 @@
-/**
- * @file lightFullbrightWaterNonIndexedAlphaMaskF.glsl
- *
- * $LicenseInfo:firstyear=2011&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2011, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-uniform float minimum_alpha;
-uniform float maximum_alpha;
-
-uniform sampler2D diffuseMap;
-
-vec3 fullbrightAtmosTransport(vec3 light);
-vec4 applyWaterFog(vec4 color);
-
-void fullbright_lighting_water()
-{
- vec4 color = texture2D(diffuseMap, gl_TexCoord[0].xy) * gl_Color;
-
- if (color.a < minimum_alpha || color.a > maximum_alpha)
- {
- discard;
- }
-
- color.rgb = fullbrightAtmosTransport(color.rgb);
-
- gl_FragColor = applyWaterFog(color);
-}
-
diff --git a/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightWaterNonIndexedF.glsl b/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightWaterNonIndexedF.glsl
deleted file mode 100644
index 01b89019b1..0000000000
--- a/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightWaterNonIndexedF.glsl
+++ /dev/null
@@ -1,41 +0,0 @@
-/**
- * @file lightFullbrightWaterF.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2007, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-
-
-uniform sampler2D diffuseMap;
-
-vec3 fullbrightAtmosTransport(vec3 light);
-vec4 applyWaterFog(vec4 color);
-
-void fullbright_lighting_water()
-{
- vec4 color = texture2D(diffuseMap, gl_TexCoord[0].xy) * gl_Color;
-
- color.rgb = fullbrightAtmosTransport(color.rgb);
-
- gl_FragColor = applyWaterFog(color);
-}
-
diff --git a/indra/newview/app_settings/shaders/class2/lighting/lightNonIndexedF.glsl b/indra/newview/app_settings/shaders/class2/lighting/lightNonIndexedF.glsl
deleted file mode 100644
index d419c2d116..0000000000
--- a/indra/newview/app_settings/shaders/class2/lighting/lightNonIndexedF.glsl
+++ /dev/null
@@ -1,43 +0,0 @@
-/**
- * @file lightF.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2007, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-
-
-uniform sampler2D diffuseMap;
-
-vec3 atmosLighting(vec3 light);
-vec3 scaleSoftClip(vec3 light);
-
-void default_lighting()
-{
- vec4 color = texture2D(diffuseMap,gl_TexCoord[0].xy) * gl_Color;
-
- color.rgb = atmosLighting(color.rgb);
-
- color.rgb = scaleSoftClip(color.rgb);
-
- gl_FragColor = color;
-}
-
diff --git a/indra/newview/app_settings/shaders/class2/lighting/lightShinyF.glsl b/indra/newview/app_settings/shaders/class2/lighting/lightShinyF.glsl
deleted file mode 100644
index ba4cd949d6..0000000000
--- a/indra/newview/app_settings/shaders/class2/lighting/lightShinyF.glsl
+++ /dev/null
@@ -1,49 +0,0 @@
-/**
- * @file lightShinyF.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2007, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-
-
-
-uniform samplerCube environmentMap;
-
-vec3 scaleSoftClip(vec3 light);
-vec3 atmosLighting(vec3 light);
-vec4 applyWaterFog(vec4 color);
-
-void shiny_lighting()
-{
- vec4 color = diffuseLookup(gl_TexCoord[0].xy);
- color.rgb *= gl_Color.rgb;
-
- vec3 envColor = textureCube(environmentMap, gl_TexCoord[1].xyz).rgb;
- color.rgb = mix(color.rgb, envColor.rgb, gl_Color.a);
-
- color.rgb = atmosLighting(color.rgb);
-
- color.rgb = scaleSoftClip(color.rgb);
- color.a = max(color.a, gl_Color.a);
- gl_FragColor = color;
-}
-
diff --git a/indra/newview/app_settings/shaders/class2/lighting/lightShinyNonIndexedF.glsl b/indra/newview/app_settings/shaders/class2/lighting/lightShinyNonIndexedF.glsl
deleted file mode 100644
index 3b30ebf6f1..0000000000
--- a/indra/newview/app_settings/shaders/class2/lighting/lightShinyNonIndexedF.glsl
+++ /dev/null
@@ -1,50 +0,0 @@
-/**
- * @file lightShinyF.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2007, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-
-
-
-uniform samplerCube environmentMap;
-uniform sampler2D diffuseMap;
-
-vec3 scaleSoftClip(vec3 light);
-vec3 atmosLighting(vec3 light);
-vec4 applyWaterFog(vec4 color);
-
-void shiny_lighting()
-{
- vec4 color = texture2D(diffuseMap,gl_TexCoord[0].xy);
- color.rgb *= gl_Color.rgb;
-
- vec3 envColor = textureCube(environmentMap, gl_TexCoord[1].xyz).rgb;
- color.rgb = mix(color.rgb, envColor.rgb, gl_Color.a);
-
- color.rgb = atmosLighting(color.rgb);
-
- color.rgb = scaleSoftClip(color.rgb);
- color.a = max(color.a, gl_Color.a);
- gl_FragColor = color;
-}
-
diff --git a/indra/newview/app_settings/shaders/class2/lighting/lightShinyWaterF.glsl b/indra/newview/app_settings/shaders/class2/lighting/lightShinyWaterF.glsl
deleted file mode 100644
index c451e68763..0000000000
--- a/indra/newview/app_settings/shaders/class2/lighting/lightShinyWaterF.glsl
+++ /dev/null
@@ -1,46 +0,0 @@
-/**
- * @file lightShinyWaterF.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2007, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-
-
-
-uniform samplerCube environmentMap;
-
-vec3 atmosLighting(vec3 light);
-vec4 applyWaterFog(vec4 color);
-
-void shiny_lighting_water()
-{
- vec4 color = diffuseLookup(gl_TexCoord[0].xy);
- color.rgb *= gl_Color.rgb;
-
- vec3 envColor = textureCube(environmentMap, gl_TexCoord[1].xyz).rgb;
- color.rgb = mix(color.rgb, envColor.rgb, gl_Color.a);
-
- color.rgb = atmosLighting(color.rgb);
- color.a = max(color.a, gl_Color.a);
- gl_FragColor = applyWaterFog(color);
-}
-
diff --git a/indra/newview/app_settings/shaders/class2/lighting/lightShinyWaterNonIndexedF.glsl b/indra/newview/app_settings/shaders/class2/lighting/lightShinyWaterNonIndexedF.glsl
deleted file mode 100644
index eeb997fb5f..0000000000
--- a/indra/newview/app_settings/shaders/class2/lighting/lightShinyWaterNonIndexedF.glsl
+++ /dev/null
@@ -1,47 +0,0 @@
-/**
- * @file lightShinyWaterF.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2007, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-
-
-
-uniform sampler2D diffuseMap;
-uniform samplerCube environmentMap;
-
-vec3 atmosLighting(vec3 light);
-vec4 applyWaterFog(vec4 color);
-
-void shiny_lighting_water()
-{
- vec4 color = texture2D(diffuseMap,gl_TexCoord[0].xy);
- color.rgb *= gl_Color.rgb;
-
- vec3 envColor = textureCube(environmentMap, gl_TexCoord[1].xyz).rgb;
- color.rgb = mix(color.rgb, envColor.rgb, gl_Color.a);
-
- color.rgb = atmosLighting(color.rgb);
- color.a = max(color.a, gl_Color.a);
- gl_FragColor = applyWaterFog(color);
-}
-
diff --git a/indra/newview/app_settings/shaders/class2/lighting/lightSpecularV.glsl b/indra/newview/app_settings/shaders/class2/lighting/lightSpecularV.glsl
deleted file mode 100644
index 24bf9b3cee..0000000000
--- a/indra/newview/app_settings/shaders/class2/lighting/lightSpecularV.glsl
+++ /dev/null
@@ -1,36 +0,0 @@
-/**
- * @file lightSpecularV.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2007, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-
-
-// All lights, no specular highlights
-
-vec4 sumLightsSpecular(vec3 pos, vec3 norm, vec4 color, inout vec4 specularColor, vec4 baseCol);
-
-vec4 calcLightingSpecular(vec3 pos, vec3 norm, vec4 color, inout vec4 specularColor, vec4 baseCol)
-{
- return sumLightsSpecular(pos, norm, color, specularColor, baseCol);
-}
-
diff --git a/indra/newview/app_settings/shaders/class2/lighting/lightV.glsl b/indra/newview/app_settings/shaders/class2/lighting/lightV.glsl
deleted file mode 100644
index 8045809b82..0000000000
--- a/indra/newview/app_settings/shaders/class2/lighting/lightV.glsl
+++ /dev/null
@@ -1,36 +0,0 @@
-/**
- * @file lightV.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2007, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-
-
-// All lights, no specular highlights
-
-vec4 sumLights(vec3 pos, vec3 norm, vec4 color, vec4 baseLight);
-
-vec4 calcLighting(vec3 pos, vec3 norm, vec4 color, vec4 baseLight)
-{
- return sumLights(pos, norm, color, baseLight);
-}
-
diff --git a/indra/newview/app_settings/shaders/class2/lighting/lightWaterAlphaMaskF.glsl b/indra/newview/app_settings/shaders/class2/lighting/lightWaterAlphaMaskF.glsl
deleted file mode 100644
index 072dcaa6b6..0000000000
--- a/indra/newview/app_settings/shaders/class2/lighting/lightWaterAlphaMaskF.glsl
+++ /dev/null
@@ -1,45 +0,0 @@
-/**
- * @file lightWaterAlphaMaskF.glsl
- *
- * $LicenseInfo:firstyear=2011&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2011, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-uniform float minimum_alpha;
-uniform float maximum_alpha;
-
-vec3 atmosLighting(vec3 light);
-vec4 applyWaterFog(vec4 color);
-
-void default_lighting_water()
-{
- vec4 color = diffuseLookup(gl_TexCoord[0].xy) * gl_Color;
-
- if (color.a < minimum_alpha || color.a > maximum_alpha)
- {
- discard;
- }
-
- color.rgb = atmosLighting(color.rgb);
-
- gl_FragColor = applyWaterFog(color);
-}
-
diff --git a/indra/newview/app_settings/shaders/class2/lighting/lightWaterAlphaMaskNonIndexedF.glsl b/indra/newview/app_settings/shaders/class2/lighting/lightWaterAlphaMaskNonIndexedF.glsl
deleted file mode 100644
index 2df34da4b4..0000000000
--- a/indra/newview/app_settings/shaders/class2/lighting/lightWaterAlphaMaskNonIndexedF.glsl
+++ /dev/null
@@ -1,49 +0,0 @@
-/**
- * @file lightWaterAlphaMaskNonIndexedF.glsl
- *
- * $LicenseInfo:firstyear=2011&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2011, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-uniform float minimum_alpha;
-uniform float maximum_alpha;
-
-uniform sampler2D diffuseMap;
-
-vec3 atmosLighting(vec3 light);
-vec4 applyWaterFog(vec4 color);
-
-void default_lighting_water()
-{
- vec4 color = texture2D(diffuseMap,gl_TexCoord[0].xy) * gl_Color;
-
- if (color.a < minimum_alpha || color.a > maximum_alpha)
- {
- discard;
- }
-
- color.rgb = atmosLighting(color.rgb);
-
- color = applyWaterFog(color);
-
- gl_FragColor = color;
-}
-
diff --git a/indra/newview/app_settings/shaders/class2/lighting/lightWaterF.glsl b/indra/newview/app_settings/shaders/class2/lighting/lightWaterF.glsl
deleted file mode 100644
index ae7be4d231..0000000000
--- a/indra/newview/app_settings/shaders/class2/lighting/lightWaterF.glsl
+++ /dev/null
@@ -1,39 +0,0 @@
-/**
- * @file lightWaterF.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2007, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-
-
-vec3 atmosLighting(vec3 light);
-vec4 applyWaterFog(vec4 color);
-
-void default_lighting_water()
-{
- vec4 color = diffuseLookup(gl_TexCoord[0].xy) * gl_Color;
-
- color.rgb = atmosLighting(color.rgb);
-
- gl_FragColor = applyWaterFog(color);
-}
-
diff --git a/indra/newview/app_settings/shaders/class2/lighting/lightWaterNonIndexedF.glsl b/indra/newview/app_settings/shaders/class2/lighting/lightWaterNonIndexedF.glsl
deleted file mode 100644
index 5a86dad827..0000000000
--- a/indra/newview/app_settings/shaders/class2/lighting/lightWaterNonIndexedF.glsl
+++ /dev/null
@@ -1,41 +0,0 @@
-/**
- * @file lightWaterF.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2007, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-
-
-uniform sampler2D diffuseMap;
-
-vec3 atmosLighting(vec3 light);
-vec4 applyWaterFog(vec4 color);
-
-void default_lighting_water()
-{
- vec4 color = texture2D(diffuseMap,gl_TexCoord[0].xy) * gl_Color;
-
- color.rgb = atmosLighting(color.rgb);
-
- gl_FragColor = applyWaterFog(color);
-}
-
diff --git a/indra/newview/app_settings/shaders/class2/lighting/sumLightsSpecularV.glsl b/indra/newview/app_settings/shaders/class2/lighting/sumLightsSpecularV.glsl
index d0a12479db..3acf9fe883 100644
--- a/indra/newview/app_settings/shaders/class2/lighting/sumLightsSpecularV.glsl
+++ b/indra/newview/app_settings/shaders/class2/lighting/sumLightsSpecularV.glsl
@@ -33,6 +33,10 @@ vec3 atmosAffectDirectionalLight(float lightIntensity);
vec3 atmosGetDiffuseSunlightColor();
vec3 scaleDownLight(vec3 light);
+uniform vec4 light_position[8];
+uniform vec3 light_attenuation[8];
+uniform vec3 light_diffuse[8];
+
vec4 sumLightsSpecular(vec3 pos, vec3 norm, vec4 color, inout vec4 specularColor, vec4 baseCol)
{
vec4 col = vec4(0.0, 0.0, 0.0, color.a);
@@ -43,15 +47,14 @@ vec4 sumLightsSpecular(vec3 pos, vec3 norm, vec4 color, inout vec4 specularColor
vec4 specularSum = vec4(0.0);
// Collect normal lights (need to be divided by two, as we later multiply by 2)
- col.rgb += gl_LightSource[1].diffuse.rgb * calcDirectionalLightSpecular(specularColor, view, norm, gl_LightSource[1].position.xyz, gl_LightSource[1].diffuse.rgb, 1.0);
- col.rgb += calcPointLightSpecular(specularSum, view, pos, norm, gl_LightSource[2].position.xyz, gl_LightSource[2].linearAttenuation, gl_LightSource[2].quadraticAttenuation, gl_LightSource[2].diffuse.rgb);
- col.rgb += calcPointLightSpecular(specularSum, view, pos, norm, gl_LightSource[3].position.xyz, gl_LightSource[3].linearAttenuation, gl_LightSource[3].quadraticAttenuation, gl_LightSource[3].diffuse.rgb);
- //col.rgb += calcPointLightSpecular(specularSum, view, pos, norm, gl_LightSource[4].position.xyz, gl_LightSource[4].linearAttenuation, gl_LightSource[4].quadraticAttenuation, gl_LightSource[4].diffuse.rgb);
+ col.rgb += light_diffuse[1].rgb * calcDirectionalLightSpecular(specularColor, view, norm, light_position[1].xyz,light_diffuse[1].rgb, 1.0);
+ col.rgb += calcPointLightSpecular(specularSum, view, pos, norm, light_position[2].xyz, light_attenuation[2].x, light_attenuation[2].y, light_diffuse[2].rgb);
+ col.rgb += calcPointLightSpecular(specularSum, view, pos, norm, light_position[3].xyz, light_attenuation[3].x, light_attenuation[3].y, light_diffuse[3].rgb);
col.rgb = scaleDownLight(col.rgb);
// Add windlight lights
col.rgb += atmosAmbient(baseCol.rgb);
- col.rgb += atmosAffectDirectionalLight(calcDirectionalLightSpecular(specularSum, view, norm, gl_LightSource[0].position.xyz, atmosGetDiffuseSunlightColor()*baseCol.a, 1.0));
+ col.rgb += atmosAffectDirectionalLight(calcDirectionalLightSpecular(specularSum, view, norm, light_position[0].xyz,atmosGetDiffuseSunlightColor()*baseCol.a, 1.0));
col.rgb = min(col.rgb*color.rgb, 1.0);
specularColor.rgb = min(specularColor.rgb*specularSum.rgb, 1.0);
diff --git a/indra/newview/app_settings/shaders/class2/lighting/sumLightsV.glsl b/indra/newview/app_settings/shaders/class2/lighting/sumLightsV.glsl
index ad045a3058..c9987ef3b9 100644
--- a/indra/newview/app_settings/shaders/class2/lighting/sumLightsV.glsl
+++ b/indra/newview/app_settings/shaders/class2/lighting/sumLightsV.glsl
@@ -23,8 +23,6 @@
* $/LicenseInfo$
*/
-
-
float calcDirectionalLight(vec3 n, vec3 l);
float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float is_pointlight);
@@ -32,21 +30,26 @@ vec3 atmosAmbient(vec3 light);
vec3 atmosAffectDirectionalLight(float lightIntensity);
vec3 scaleDownLight(vec3 light);
+uniform vec4 light_position[8];
+uniform vec3 light_direction[8];
+uniform vec3 light_attenuation[8];
+uniform vec3 light_diffuse[8];
+
vec4 sumLights(vec3 pos, vec3 norm, vec4 color, vec4 baseLight)
{
vec4 col = vec4(0.0, 0.0, 0.0, color.a);
// 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 += light_diffuse[1].rgb * calcDirectionalLight(norm, light_position[1].xyz);
+
+ col.rgb += light_diffuse[2].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[2], light_direction[2], light_attenuation[2].x, light_attenuation[2].z);
+ col.rgb += light_diffuse[3].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[3], light_direction[3], light_attenuation[3].x, light_attenuation[3].z);
- 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
col.rgb += atmosAmbient(baseLight.rgb);
- col.rgb += atmosAffectDirectionalLight(calcDirectionalLight(norm, gl_LightSource[0].position.xyz));
+ col.rgb += atmosAffectDirectionalLight(calcDirectionalLight(norm, light_position[0].xyz));
col.rgb = min(col.rgb*color.rgb, 1.0);
diff --git a/indra/newview/app_settings/shaders/class2/objects/fullbrightShinyV.glsl b/indra/newview/app_settings/shaders/class2/objects/fullbrightShinyV.glsl
deleted file mode 100644
index 819b28e4fd..0000000000
--- a/indra/newview/app_settings/shaders/class2/objects/fullbrightShinyV.glsl
+++ /dev/null
@@ -1,53 +0,0 @@
-/**
- * @file fullbrightShinyV.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2007, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-
-
-void calcAtmospherics(vec3 inPositionEye);
-
-uniform vec4 origin;
-
-varying float vary_texture_index;
-
-void main()
-{
- //transform vertex
- vec4 vert = vec4(gl_Vertex.xyz,1.0);
- vary_texture_index = gl_Vertex.w;
- gl_Position = gl_ModelViewProjectionMatrix*vert;
-
- vec4 pos = (gl_ModelViewMatrix * vert);
- vec3 norm = normalize(gl_NormalMatrix * gl_Normal);
- vec3 ref = reflect(pos.xyz, -norm);
-
- gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
- gl_TexCoord[1] = gl_TextureMatrix[1]*vec4(ref,1.0);
-
- calcAtmospherics(pos.xyz);
-
- gl_FrontColor = gl_Color;
-
- gl_FogFragCoord = pos.z;
-}
diff --git a/indra/newview/app_settings/shaders/class2/objects/fullbrightV.glsl b/indra/newview/app_settings/shaders/class2/objects/fullbrightV.glsl
deleted file mode 100644
index abf6e37b7c..0000000000
--- a/indra/newview/app_settings/shaders/class2/objects/fullbrightV.glsl
+++ /dev/null
@@ -1,47 +0,0 @@
-/**
- * @file fullbrightV.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2007, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-
-
-void calcAtmospherics(vec3 inPositionEye);
-
-varying float vary_texture_index;
-
-void main()
-{
- //transform vertex
- vec4 vert = vec4(gl_Vertex.xyz,1.0);
- vary_texture_index = gl_Vertex.w;
- gl_Position = gl_ModelViewProjectionMatrix*vert;
- gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
-
- vec4 pos = (gl_ModelViewMatrix * vert);
-
- calcAtmospherics(pos.xyz);
-
- gl_FrontColor = gl_Color;
-
- gl_FogFragCoord = pos.z;
-}
diff --git a/indra/newview/app_settings/shaders/class2/objects/shinyV.glsl b/indra/newview/app_settings/shaders/class2/objects/shinyV.glsl
deleted file mode 100644
index 44c711701b..0000000000
--- a/indra/newview/app_settings/shaders/class2/objects/shinyV.glsl
+++ /dev/null
@@ -1,55 +0,0 @@
-/**
- * @file shinyV.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2007, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-
-
-vec4 calcLighting(vec3 pos, vec3 norm, vec4 color, vec4 baseCol);
-
-void calcAtmospherics(vec3 inPositionEye);
-
-varying float vary_texture_index;
-
-uniform vec4 origin;
-
-void main()
-{
- //transform vertex
- vec4 vert = vec4(gl_Vertex.xyz,1.0);
- vary_texture_index = gl_Vertex.w;
- gl_Position = gl_ModelViewProjectionMatrix*vert;
-
- vec4 pos = (gl_ModelViewMatrix * vert);
- vec3 norm = normalize(gl_NormalMatrix * gl_Normal);
- vec3 ref = reflect(pos.xyz, -norm);
-
- gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
- gl_TexCoord[1] = gl_TextureMatrix[1]*vec4(ref,1.0);
-
- calcAtmospherics(pos.xyz);
-
- gl_FrontColor = calcLighting(pos.xyz, norm, gl_Color, vec4(0.0));
-
- gl_FogFragCoord = pos.z;
-}
diff --git a/indra/newview/app_settings/shaders/class2/objects/simpleV.glsl b/indra/newview/app_settings/shaders/class2/objects/simpleV.glsl
deleted file mode 100644
index b0114763c1..0000000000
--- a/indra/newview/app_settings/shaders/class2/objects/simpleV.glsl
+++ /dev/null
@@ -1,51 +0,0 @@
-/**
- * @file simpleV.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2007, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-
-
-vec4 calcLighting(vec3 pos, vec3 norm, vec4 color, vec4 baseCol);
-void calcAtmospherics(vec3 inPositionEye);
-
-varying float vary_texture_index;
-
-void main()
-{
- //transform vertex
- vec4 vert = vec4(gl_Vertex.xyz,1.0);
- vary_texture_index = gl_Vertex.w;
- gl_Position = gl_ModelViewProjectionMatrix*vert;
- gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
-
- vec4 pos = (gl_ModelViewMatrix * vert);
-
- vec3 norm = normalize(gl_NormalMatrix * gl_Normal);
-
- calcAtmospherics(pos.xyz);
-
- vec4 color = calcLighting(pos.xyz, norm, gl_Color, vec4(0.));
- gl_FrontColor = color;
-
- gl_FogFragCoord = pos.z;
-}
diff --git a/indra/newview/app_settings/shaders/class2/windlight/atmosphericsV.glsl b/indra/newview/app_settings/shaders/class2/windlight/atmosphericsV.glsl
index be990c1757..6a83be1426 100644
--- a/indra/newview/app_settings/shaders/class2/windlight/atmosphericsV.glsl
+++ b/indra/newview/app_settings/shaders/class2/windlight/atmosphericsV.glsl
@@ -25,7 +25,7 @@
-// varying param funcs
+// VARYING param funcs
void setSunlitColor(vec3 v);
void setAmblitColor(vec3 v);
void setAdditiveColor(vec3 v);
@@ -34,8 +34,8 @@ void setPositionEye(vec3 v);
vec3 getAdditiveColor();
-//varying vec4 vary_CloudUVs;
-//varying float vary_CloudDensity;
+//VARYING vec4 vary_CloudUVs;
+//VARYING float vary_CloudDensity;
// Inputs
uniform vec4 morphFactor;
diff --git a/indra/newview/app_settings/shaders/class2/windlight/atmosphericsVarsF.glsl b/indra/newview/app_settings/shaders/class2/windlight/atmosphericsVarsF.glsl
index a98c04b259..765b0927c3 100644
--- a/indra/newview/app_settings/shaders/class2/windlight/atmosphericsVarsF.glsl
+++ b/indra/newview/app_settings/shaders/class2/windlight/atmosphericsVarsF.glsl
@@ -24,25 +24,17 @@
*/
+VARYING vec3 vary_SunlitColor;
+VARYING vec3 vary_AdditiveColor;
+VARYING vec3 vary_AtmosAttenuation;
-varying vec3 vary_PositionEye;
-
-varying vec3 vary_SunlitColor;
-varying vec3 vary_AmblitColor;
-varying vec3 vary_AdditiveColor;
-varying vec3 vary_AtmosAttenuation;
-
-vec3 getPositionEye()
-{
- return vary_PositionEye;
-}
vec3 getSunlitColor()
{
- return vary_SunlitColor;
+ return vec3(0,0,0);
}
vec3 getAmblitColor()
{
- return vary_AmblitColor;
+ return vec3(0,0,0);
}
vec3 getAdditiveColor()
{
@@ -50,5 +42,5 @@ vec3 getAdditiveColor()
}
vec3 getAtmosAttenuation()
{
- return vary_AtmosAttenuation;
+ return vec3(vary_AtmosAttenuation);
}
diff --git a/indra/newview/app_settings/shaders/class2/windlight/atmosphericsVarsV.glsl b/indra/newview/app_settings/shaders/class2/windlight/atmosphericsVarsV.glsl
index 7c3cb88b3c..99dbee15ee 100644
--- a/indra/newview/app_settings/shaders/class2/windlight/atmosphericsVarsV.glsl
+++ b/indra/newview/app_settings/shaders/class2/windlight/atmosphericsVarsV.glsl
@@ -24,57 +24,61 @@
*/
+VARYING vec3 vary_AdditiveColor;
+VARYING vec3 vary_AtmosAttenuation;
-varying vec3 vary_PositionEye;
+vec3 additive_color;
+vec3 atmos_attenuation;
+vec3 sunlit_color;
+vec3 amblit_color;
+vec3 position_eye;
-varying vec3 vary_SunlitColor;
-varying vec3 vary_AmblitColor;
-varying vec3 vary_AdditiveColor;
-varying vec3 vary_AtmosAttenuation;
-
-vec3 getPositionEye()
-{
- return vary_PositionEye;
-}
vec3 getSunlitColor()
{
- return vary_SunlitColor;
+ return sunlit_color;
}
vec3 getAmblitColor()
{
- return vary_AmblitColor;
+ return amblit_color;
}
+
vec3 getAdditiveColor()
{
- return vary_AdditiveColor;
+ return additive_color;
}
vec3 getAtmosAttenuation()
{
- return vary_AtmosAttenuation;
+ return atmos_attenuation;
}
+vec3 getPositionEye()
+{
+ return position_eye;
+}
void setPositionEye(vec3 v)
{
- vary_PositionEye = v;
+ position_eye = v;
}
void setSunlitColor(vec3 v)
{
- vary_SunlitColor = v;
+ sunlit_color = v;
}
void setAmblitColor(vec3 v)
{
- vary_AmblitColor = v;
+ amblit_color = v;
}
void setAdditiveColor(vec3 v)
{
+ additive_color = v;
vary_AdditiveColor = v;
}
void setAtmosAttenuation(vec3 v)
{
+ atmos_attenuation = v;
vary_AtmosAttenuation = v;
}
diff --git a/indra/newview/app_settings/shaders/class2/windlight/atmosphericsVarsWaterF.glsl b/indra/newview/app_settings/shaders/class2/windlight/atmosphericsVarsWaterF.glsl
new file mode 100644
index 0000000000..163ef26444
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class2/windlight/atmosphericsVarsWaterF.glsl
@@ -0,0 +1,50 @@
+/**
+ * @file atmosphericVarsWaterF.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+VARYING vec3 vary_PositionEye;
+VARYING vec3 vary_AdditiveColor;
+VARYING vec3 vary_AtmosAttenuation;
+
+vec3 getSunlitColor()
+{
+ return vec3(0,0,0);
+}
+vec3 getAmblitColor()
+{
+ return vec3(0,0,0);
+}
+vec3 getAdditiveColor()
+{
+ return vary_AdditiveColor;
+}
+vec3 getAtmosAttenuation()
+{
+ return vary_AtmosAttenuation;
+}
+vec3 getPositionEye()
+{
+ return vary_PositionEye;
+}
+
diff --git a/indra/newview/app_settings/shaders/class2/windlight/atmosphericsVarsWaterV.glsl b/indra/newview/app_settings/shaders/class2/windlight/atmosphericsVarsWaterV.glsl
new file mode 100644
index 0000000000..553f6752e6
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class2/windlight/atmosphericsVarsWaterV.glsl
@@ -0,0 +1,81 @@
+/**
+ * @file atmosphericVarsWaterV.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+VARYING vec3 vary_PositionEye;
+VARYING vec3 vary_AdditiveColor;
+VARYING vec3 vary_AtmosAttenuation;
+
+vec3 atmos_attenuation;
+vec3 sunlit_color;
+vec3 amblit_color;
+
+vec3 getSunlitColor()
+{
+ return sunlit_color;
+}
+vec3 getAmblitColor()
+{
+ return amblit_color;
+}
+
+vec3 getAdditiveColor()
+{
+ return vary_AdditiveColor;
+}
+vec3 getAtmosAttenuation()
+{
+ return atmos_attenuation;
+}
+
+vec3 getPositionEye()
+{
+ return vary_PositionEye;
+}
+
+void setPositionEye(vec3 v)
+{
+ vary_PositionEye = v;
+}
+
+void setSunlitColor(vec3 v)
+{
+ sunlit_color = v;
+}
+
+void setAmblitColor(vec3 v)
+{
+ amblit_color = v;
+}
+
+void setAdditiveColor(vec3 v)
+{
+ vary_AdditiveColor = v;
+}
+
+void setAtmosAttenuation(vec3 v)
+{
+ atmos_attenuation = v;
+ vary_AtmosAttenuation = v;
+}
diff --git a/indra/newview/app_settings/shaders/class2/windlight/cloudsF.glsl b/indra/newview/app_settings/shaders/class2/windlight/cloudsF.glsl
index b90cec119b..4ab06c6e21 100644
--- a/indra/newview/app_settings/shaders/class2/windlight/cloudsF.glsl
+++ b/indra/newview/app_settings/shaders/class2/windlight/cloudsF.glsl
@@ -23,15 +23,21 @@
* $/LicenseInfo$
*/
-
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 gl_FragColor;
+#endif
/////////////////////////////////////////////////////////////////////////
// The fragment shader for the sky
/////////////////////////////////////////////////////////////////////////
-varying vec4 vary_CloudColorSun;
-varying vec4 vary_CloudColorAmbient;
-varying float vary_CloudDensity;
+VARYING vec4 vary_CloudColorSun;
+VARYING vec4 vary_CloudColorAmbient;
+VARYING float vary_CloudDensity;
+VARYING vec2 vary_texcoord0;
+VARYING vec2 vary_texcoord1;
+VARYING vec2 vary_texcoord2;
+VARYING vec2 vary_texcoord3;
uniform sampler2D cloud_noise_texture;
uniform vec4 cloud_pos_density1;
@@ -50,14 +56,14 @@ vec3 scaleSoftClip(vec3 light) {
void main()
{
// Set variables
- vec2 uv1 = gl_TexCoord[0].xy;
- vec2 uv2 = gl_TexCoord[1].xy;
+ vec2 uv1 = vary_texcoord0.xy;
+ vec2 uv2 = vary_texcoord1.xy;
vec4 cloudColorSun = vary_CloudColorSun;
vec4 cloudColorAmbient = vary_CloudColorAmbient;
float cloudDensity = vary_CloudDensity;
- vec2 uv3 = gl_TexCoord[2].xy;
- vec2 uv4 = gl_TexCoord[3].xy;
+ vec2 uv3 = vary_texcoord2.xy;
+ vec2 uv4 = vary_texcoord3.xy;
// Offset texture coords
uv1 += cloud_pos_density1.xy; //large texture, visible density
diff --git a/indra/newview/app_settings/shaders/class2/windlight/cloudsV.glsl b/indra/newview/app_settings/shaders/class2/windlight/cloudsV.glsl
index c175a834c2..c5bb52169c 100644
--- a/indra/newview/app_settings/shaders/class2/windlight/cloudsV.glsl
+++ b/indra/newview/app_settings/shaders/class2/windlight/cloudsV.glsl
@@ -22,17 +22,24 @@
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
-
+uniform mat4 modelview_projection_matrix;
+
+ATTRIBUTE vec3 position;
+ATTRIBUTE vec2 texcoord0;
//////////////////////////////////////////////////////////////////////////
// The vertex shader for creating the atmospheric sky
///////////////////////////////////////////////////////////////////////////////
// Output parameters
-varying vec4 vary_CloudColorSun;
-varying vec4 vary_CloudColorAmbient;
-varying float vary_CloudDensity;
+VARYING vec4 vary_CloudColorSun;
+VARYING vec4 vary_CloudColorAmbient;
+VARYING float vary_CloudDensity;
+VARYING vec2 vary_texcoord0;
+VARYING vec2 vary_texcoord1;
+VARYING vec2 vary_texcoord2;
+VARYING vec2 vary_texcoord3;
// Inputs
uniform vec3 camPosLocal;
@@ -59,12 +66,12 @@ void main()
{
// World / view / projection
- gl_Position = ftransform();
+ gl_Position = modelview_projection_matrix * vec4(position.xyz, 1.0);
- gl_TexCoord[0] = gl_MultiTexCoord0;
+ vary_texcoord0 = texcoord0;
// Get relative position
- vec3 P = gl_Vertex.xyz - camPosLocal.xyz + vec3(0,50,0);
+ vec3 P = position.xyz - camPosLocal.xyz + vec3(0,50,0);
// Set altitude
if (P.y > 0.)
@@ -160,17 +167,17 @@ void main()
// Texture coords
- gl_TexCoord[0] = gl_MultiTexCoord0;
- gl_TexCoord[0].xy -= 0.5;
- gl_TexCoord[0].xy /= cloud_scale.x;
- gl_TexCoord[0].xy += 0.5;
+ vary_texcoord0 = texcoord0;
+ vary_texcoord0.xy -= 0.5;
+ vary_texcoord0.xy /= cloud_scale.x;
+ vary_texcoord0.xy += 0.5;
- gl_TexCoord[1] = gl_TexCoord[0];
- gl_TexCoord[1].x += lightnorm.x * 0.0125;
- gl_TexCoord[1].y += lightnorm.z * 0.0125;
+ vary_texcoord1 = vary_texcoord0;
+ vary_texcoord1.x += lightnorm.x * 0.0125;
+ vary_texcoord1.y += lightnorm.z * 0.0125;
- gl_TexCoord[2] = gl_TexCoord[0] * 16.;
- gl_TexCoord[3] = gl_TexCoord[1] * 16.;
+ vary_texcoord2 = vary_texcoord0 * 16.;
+ vary_texcoord3 = vary_texcoord1 * 16.;
// Combine these to minimize register use
vary_CloudColorAmbient += oHazeColorBelowCloud;
diff --git a/indra/newview/app_settings/shaders/class2/windlight/skyF.glsl b/indra/newview/app_settings/shaders/class2/windlight/skyF.glsl
index ac569e8257..c9d96b2cf4 100644
--- a/indra/newview/app_settings/shaders/class2/windlight/skyF.glsl
+++ b/indra/newview/app_settings/shaders/class2/windlight/skyF.glsl
@@ -23,13 +23,15 @@
* $/LicenseInfo$
*/
-
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 gl_FragColor;
+#endif
/////////////////////////////////////////////////////////////////////////
// The fragment shader for the sky
/////////////////////////////////////////////////////////////////////////
-varying vec4 vary_HazeColor;
+VARYING vec4 vary_HazeColor;
uniform sampler2D cloud_noise_texture;
uniform vec4 gamma;
diff --git a/indra/newview/app_settings/shaders/class2/windlight/skyV.glsl b/indra/newview/app_settings/shaders/class2/windlight/skyV.glsl
index 3a44bb6d26..46773cf89f 100644
--- a/indra/newview/app_settings/shaders/class2/windlight/skyV.glsl
+++ b/indra/newview/app_settings/shaders/class2/windlight/skyV.glsl
@@ -23,14 +23,16 @@
* $/LicenseInfo$
*/
+uniform mat4 modelview_projection_matrix;
+ATTRIBUTE vec3 position;
// SKY ////////////////////////////////////////////////////////////////////////
// The vertex shader for creating the atmospheric sky
///////////////////////////////////////////////////////////////////////////////
// Output parameters
-varying vec4 vary_HazeColor;
+VARYING vec4 vary_HazeColor;
// Inputs
uniform vec3 camPosLocal;
@@ -57,12 +59,11 @@ void main()
{
// World / view / projection
- gl_Position = ftransform();
- gl_TexCoord[0] = gl_MultiTexCoord0;
+ gl_Position = modelview_projection_matrix * vec4(position.xyz, 1.0);
// Get relative position
- vec3 P = gl_Vertex.xyz - camPosLocal.xyz + vec3(0,50,0);
- //vec3 P = gl_Vertex.xyz + vec3(0,50,0);
+ vec3 P = position.xyz - camPosLocal.xyz + vec3(0,50,0);
+ //vec3 P = position.xyz + vec3(0,50,0);
// Set altitude
if (P.y > 0.)
diff --git a/indra/newview/app_settings/shaders/class3/avatar/avatarV.glsl b/indra/newview/app_settings/shaders/class3/avatar/avatarV.glsl
index 151602dbc0..721054b5ad 100644
--- a/indra/newview/app_settings/shaders/class3/avatar/avatarV.glsl
+++ b/indra/newview/app_settings/shaders/class3/avatar/avatarV.glsl
@@ -22,39 +22,47 @@
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
-
+uniform mat4 projection_matrix;
+
+ATTRIBUTE vec3 position;
+ATTRIBUTE vec3 normal;
+ATTRIBUTE vec2 texcoord0;
+ATTRIBUTE vec4 clothing;
+
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
vec4 calcLighting(vec3 pos, vec3 norm, vec4 color, vec4 baseCol);
mat4 getSkinnedTransform();
void calcAtmospherics(vec3 inPositionEye);
-attribute vec4 clothing; //4
+uniform vec4 color;
-attribute vec4 gWindDir; //7
-attribute vec4 gSinWaveParams; //3
-attribute vec4 gGravity; //5
+uniform vec4 gWindDir;
+uniform vec4 gSinWaveParams;
+uniform vec4 gGravity;
const vec4 gMinMaxConstants = vec4(1.0, 0.166666, 0.0083143, .00018542); // #minimax-generated coefficients
const vec4 gPiConstants = vec4(0.159154943, 6.28318530, 3.141592653, 1.5707963); // # {1/2PI, 2PI, PI, PI/2}
void main()
{
- gl_TexCoord[0] = gl_MultiTexCoord0;
+ vary_texcoord0 = texcoord0;
vec4 pos;
mat4 trans = getSkinnedTransform();
vec3 norm;
- norm.x = dot(trans[0].xyz, gl_Normal);
- norm.y = dot(trans[1].xyz, gl_Normal);
- norm.z = dot(trans[2].xyz, gl_Normal);
+ norm.x = dot(trans[0].xyz, normal);
+ norm.y = dot(trans[1].xyz, normal);
+ norm.z = dot(trans[2].xyz, normal);
norm = normalize(norm);
//wind
vec4 windEffect;
windEffect = vec4(dot(norm, gWindDir.xyz));
- pos.x = dot(trans[2].xyz, gl_Vertex.xyz);
+ pos.x = dot(trans[2].xyz, position.xyz);
windEffect.xyz = pos.x * vec3(0.015, 0.015, 0.015)
+ windEffect.xyz;
windEffect.w = windEffect.w * 2.0 + 1.0; // move wind offset value to [-1, 3]
@@ -101,7 +109,7 @@ void main()
sinWave.xyz = max(sinWave.xyz, vec3(-1.0, -1.0, -1.0)); // clamp to underlying body shape
offsetPos = clothing * sinWave.x; // multiply wind effect times clothing displacement
temp2 = gWindDir*sinWave.z + vec4(norm,0); // calculate normal offset due to wind oscillation
- offsetPos = vec4(1.0,1.0,1.0,0.0)*offsetPos+gl_Vertex; // add to offset vertex position, and zero out effect from w
+ offsetPos = vec4(1.0,1.0,1.0,0.0)*offsetPos+vec4(position.xyz, 1.0); // add to offset vertex position, and zero out effect from w
norm += temp2.xyz*2.0; // add sin wave effect on normals (exaggerated)
//add "backlighting" effect
@@ -119,12 +127,8 @@ void main()
calcAtmospherics(pos.xyz);
- vec4 color = calcLighting(pos.xyz, norm, gl_Color, vec4(0.0));
- gl_FrontColor = color;
+ vec4 col = calcLighting(pos.xyz, norm, color, vec4(0.0));
+ vertex_color = col;
- gl_Position = gl_ProjectionMatrix * pos;
-
-
- gl_TexCoord[2] = vec4(pos.xyz, 1.0);
-
+ gl_Position = projection_matrix * pos;
}
diff --git a/indra/newview/app_settings/shaders/class3/deferred/giDownsampleF.glsl b/indra/newview/app_settings/shaders/class3/deferred/giDownsampleF.glsl
deleted file mode 100644
index 616ea5fe9e..0000000000
--- a/indra/newview/app_settings/shaders/class3/deferred/giDownsampleF.glsl
+++ /dev/null
@@ -1,106 +0,0 @@
-/**
- * @file giDownsampleF.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2007, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-
-
-uniform sampler2DRect giLightMap;
-
-uniform vec2 kern[32];
-uniform float dist_factor;
-uniform float blur_size;
-uniform vec2 delta;
-uniform int kern_length;
-uniform float kern_scale;
-uniform vec3 blur_quad;
-
-varying vec2 vary_fragcoord;
-
-uniform mat4 inv_proj;
-uniform vec2 screen_res;
-
-vec4 getPosition(vec2 pos_screen)
-{
- float depth = texture2DRect(depthMap, pos_screen.xy).a;
- vec2 sc = pos_screen.xy*2.0;
- sc /= screen_res;
- sc -= vec2(1.0,1.0);
- vec4 ndc = vec4(sc.x, sc.y, 2.0*depth-1.0, 1.0);
- vec4 pos = inv_proj * ndc;
- pos /= pos.w;
- pos.w = 1.0;
- return pos;
-}
-
-float getDepth(vec2 pos_screen)
-{
- float z = texture2DRect(depthMap, pos_screen.xy).a;
- z = z*2.0-1.0;
- vec4 ndc = vec4(0.0, 0.0, z, 1.0);
- vec4 p = inv_proj*ndc;
- return p.z/p.w;
-}
-
-void main()
-{
- vec3 norm = texture2DRect(normalMap, vary_fragcoord.xy).xyz;
- norm = vec3((norm.xy-0.5)*2.0,norm.z); // unpack norm
- float depth = getDepth(vary_fragcoord.xy);
-
- vec3 ccol = texture2DRect(giLightMap, vary_fragcoord.xy).rgb;
- vec2 dlt = kern_scale * delta/(vec2(1.0,1.0)+norm.xy*norm.xy);
- dlt /= clamp(-depth*blur_quad.x, 1.0, 3.0);
- float defined_weight = kern[0].x;
- vec3 col = ccol*kern[0].x;
-
- for (int i = 0; i < kern_length; i++)
- {
- vec2 tc = vary_fragcoord.xy + kern[i].y*dlt;
- vec3 sampNorm = texture2DRect(normalMap, tc.xy).xyz;
- sampNorm = vec3((sampNorm.xy-0.5)*2.0,sampNorm.z); // unpack norm
-
- float d = dot(norm.xyz, sampNorm);
-
- if (d > 0.5)
- {
- float sampdepth = getDepth(tc.xy);
- sampdepth -= depth;
- if (sampdepth*sampdepth < blur_quad.z)
- {
- col += texture2DRect(giLightMap, tc).rgb*kern[i].x;
- defined_weight += kern[i].x;
- }
- }
- }
-
- col /= defined_weight;
-
- //col = ccol;
-
- col = col*blur_quad.y;
-
- gl_FragData[0].xyz = col;
-
- //gl_FragColor = ccol;
-}
diff --git a/indra/newview/app_settings/shaders/class3/deferred/giDownsampleV.glsl b/indra/newview/app_settings/shaders/class3/deferred/giDownsampleV.glsl
deleted file mode 100644
index 6231ee68b7..0000000000
--- a/indra/newview/app_settings/shaders/class3/deferred/giDownsampleV.glsl
+++ /dev/null
@@ -1,37 +0,0 @@
-/**
- * @file postgiV.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2007, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-
-
-varying vec2 vary_fragcoord;
-uniform vec2 screen_res;
-
-void main()
-{
- //transform vertex
- gl_Position = ftransform();
- vec4 pos = gl_ModelViewProjectionMatrix * gl_Vertex;
- vary_fragcoord = (pos.xy*0.5+0.5)*screen_res;
-}
diff --git a/indra/newview/app_settings/shaders/class3/deferred/giF.glsl b/indra/newview/app_settings/shaders/class3/deferred/giF.glsl
deleted file mode 100644
index 95913a502c..0000000000
--- a/indra/newview/app_settings/shaders/class3/deferred/giF.glsl
+++ /dev/null
@@ -1,211 +0,0 @@
-/**
- * @file giF.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2007, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-
-
-#extension GL_ARB_texture_rectangle : enable
-
-uniform sampler2DRect depthMap;
-uniform sampler2DRect normalMap;
-uniform sampler2DRect lightMap;
-uniform sampler2DRect specularRect;
-
-uniform sampler2D noiseMap;
-
-uniform sampler2D diffuseGIMap;
-uniform sampler2D specularGIMap;
-uniform sampler2D normalGIMap;
-uniform sampler2D depthGIMap;
-
-uniform sampler2D lightFunc;
-
-// Inputs
-varying vec2 vary_fragcoord;
-
-uniform vec2 screen_res;
-
-uniform vec4 sunlight_color;
-
-uniform mat4 inv_proj;
-uniform mat4 gi_mat; //gPipeline.mGIMatrix - eye space to sun space
-uniform mat4 gi_mat_proj; //gPipeline.mGIMatrixProj - eye space to projected sun space
-uniform mat4 gi_norm_mat; //gPipeline.mGINormalMatrix - eye space normal to sun space normal matrix
-uniform mat4 gi_inv_proj; //gPipeline.mGIInvProj - projected sun space to sun space
-uniform float gi_sample_width;
-uniform float gi_noise;
-uniform float gi_attenuation;
-uniform float gi_range;
-
-vec4 getPosition(vec2 pos_screen)
-{
- float depth = texture2DRect(depthMap, pos_screen.xy).a;
- vec2 sc = pos_screen.xy*2.0;
- sc /= screen_res;
- sc -= vec2(1.0,1.0);
- vec4 ndc = vec4(sc.x, sc.y, 2.0*depth-1.0, 1.0);
- vec4 pos = inv_proj * ndc;
- pos /= pos.w;
- pos.w = 1.0;
- return pos;
-}
-
-vec4 getGIPosition(vec2 gi_tc)
-{
- float depth = texture2D(depthGIMap, gi_tc).a;
- vec2 sc = gi_tc*2.0;
- sc -= vec2(1.0, 1.0);
- vec4 ndc = vec4(sc.x, sc.y, 2.0*depth-1.0, 1.0);
- vec4 pos = gi_inv_proj*ndc;
- pos.xyz /= pos.w;
- pos.w = 1.0;
- return pos;
-}
-
-vec3 giAmbient(vec3 pos, vec3 norm)
-{
- vec4 gi_c = gi_mat_proj * vec4(pos, 1.0);
- gi_c.xyz /= gi_c.w;
-
- vec4 gi_pos = gi_mat*vec4(pos,1.0);
- vec3 gi_norm = (gi_norm_mat*vec4(norm,1.0)).xyz;
- gi_norm = normalize(gi_norm);
-
- vec4 c_spec = texture2DRect(specularRect, vary_fragcoord.xy);
- vec3 nz = texture2D(noiseMap, vary_fragcoord.xy/128.0).rgb;
- gi_pos.xyz += nz.x*gi_noise*gi_norm.xyz;
- vec2 tcx = gi_norm.xy;
- vec2 tcy = gi_norm.yx;
-
- vec4 eye_pos = gi_mat*vec4(0,0,0,1.0);
-
- vec3 eye_dir = normalize(gi_pos.xyz-eye_pos.xyz);
- vec3 eye_ref = reflect(eye_dir, gi_norm);
-
- float da = 0.0; //texture2DRect(lightMap, vary_fragcoord.xy).r*0.5;
- vec3 fdiff = vec3(da);
- float fda = da;
-
- vec3 rcol = vec3(0,0,0);
-
- float fsa = 0.0;
-
-
- for (int i = -1; i <= 1; i += 2 )
- {
- for (int j = -1; j <= 1; j+= 2)
- {
- vec2 tc = vec2(i, j)*0.75+gi_norm.xy*nz.z;
- tc += nz.xy*2.0;
- tc *= gi_sample_width*0.25;
- tc += gi_c.xy;
-
- vec3 lnorm = -(texture2D(normalGIMap, tc.xy).xyz*2.0-1.0);
- vec3 lpos = getGIPosition(tc.xy).xyz;
-
- vec3 at = lpos-gi_pos.xyz;
- float dist = length(at);
- float dist_atten = clamp(1.0/(gi_attenuation*dist), 0.0, 1.0);
-
-
- if (dist_atten > 0.01)
- { //possible contribution of indirect light to this surface
- vec3 ldir = at;
-
- float ld = -dot(ldir, lnorm);
-
- if (ld < 0.0)
- {
- float ang_atten = dot(ldir, gi_norm);
-
- if (ang_atten > 0.0)
- {
- vec4 spec = texture2D(specularGIMap, tc.xy);
- at = normalize(at);
- vec3 diff;
-
- float da = 0.0;
-
- //contribution from indirect source to visible pixel
- vec3 ha = at;
- ha.z -= 1.0;
- ha = normalize(ha);
- if (spec.a > 0.0)
- {
- float sa = dot(ha,lnorm);
- da = texture2D(lightFunc, vec2(sa, spec.a)).a;
- }
- else
- {
- da = -lnorm.z;
- }
-
- diff = texture2D(diffuseGIMap, tc.xy).rgb+spec.rgb*spec.a*2.0;
-
- if (da > 0.0)
- { //contribution from visible pixel to eye
- vec3 ha = normalize(at-eye_dir);
- if (c_spec.a > 0.0)
- {
- float sa = dot(ha, gi_norm);
- da = dist_atten*texture2D(lightFunc, vec2(sa, c_spec.a)).a;
- }
- else
- {
- da = dist_atten*dot(gi_norm, normalize(ldir));
- }
- fda += da;
- fdiff += da*(c_spec.rgb*c_spec.a*2.0+vec3(1,1,1))*diff.rgb;
- }
- }
- }
- }
- }
- }
-
- fdiff *= sunlight_color.rgb;
-
- vec3 ret = fda*fdiff;
-
- return clamp(ret,vec3(0.0), vec3(1.0));
-}
-
-void main()
-{
- vec2 pos_screen = vary_fragcoord.xy;
- vec4 pos = getPosition(pos_screen);
-
- float rad = gi_range*0.5;
-
- vec3 norm = texture2DRect(normalMap, pos_screen).xyz;
- norm = vec3((norm.xy-0.5)*2.0,norm.z); // unpack norm
- float dist = max(length(pos.xyz)-rad, 0.0);
-
- float da = clamp(1.0-dist/rad, 0.0, 1.0);
-
- vec3 ambient = da > 0.0 ? giAmbient(pos.xyz, norm) : vec3(0);
-
-
- gl_FragData[0].xyz = mix(vec3(0), ambient, da);
-}
diff --git a/indra/newview/app_settings/shaders/class3/deferred/giFinalF.glsl b/indra/newview/app_settings/shaders/class3/deferred/giFinalF.glsl
deleted file mode 100644
index 7c55fcc286..0000000000
--- a/indra/newview/app_settings/shaders/class3/deferred/giFinalF.glsl
+++ /dev/null
@@ -1,45 +0,0 @@
-/**
- * @file giFinalF.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2007, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-
-
-#extension GL_ARB_texture_rectangle : enable
-
-uniform sampler2DRect diffuseRect;
-uniform sampler2D bloomMap;
-uniform sampler2DRect edgeMap;
-
-uniform vec2 screen_res;
-varying vec2 vary_fragcoord;
-
-
-void main()
-{
- vec4 bloom = texture2D(bloomMap, vary_fragcoord.xy/screen_res);
- vec4 diff = texture2DRect(diffuseRect, vary_fragcoord.xy);
-
- gl_FragColor = bloom + diff;
- //gl_FragColor.rgb = vec3(texture2DRect(edgeMap, vary_fragcoord.xy).a);
-}
diff --git a/indra/newview/app_settings/shaders/class3/deferred/giFinalV.glsl b/indra/newview/app_settings/shaders/class3/deferred/giFinalV.glsl
deleted file mode 100644
index a6a206502c..0000000000
--- a/indra/newview/app_settings/shaders/class3/deferred/giFinalV.glsl
+++ /dev/null
@@ -1,37 +0,0 @@
-/**
- * @file giFinalV.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2007, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-
-
-varying vec2 vary_fragcoord;
-uniform vec2 screen_res;
-
-void main()
-{
- //transform vertex
- gl_Position = ftransform();
- vec4 pos = gl_ModelViewProjectionMatrix * gl_Vertex;
- vary_fragcoord = (pos.xy*0.5+0.5)*screen_res;
-}
diff --git a/indra/newview/app_settings/shaders/class3/deferred/giV.glsl b/indra/newview/app_settings/shaders/class3/deferred/giV.glsl
deleted file mode 100644
index 190e32b6a3..0000000000
--- a/indra/newview/app_settings/shaders/class3/deferred/giV.glsl
+++ /dev/null
@@ -1,42 +0,0 @@
-/**
- * @file giV.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2007, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-
-
-varying vec2 vary_fragcoord;
-
-uniform vec2 screen_res;
-
-void main()
-{
- //transform vertex
- gl_Position = ftransform();
- vec4 pos = gl_ModelViewProjectionMatrix * gl_Vertex;
- vary_fragcoord = (pos.xy * 0.5 + 0.5)*screen_res;
- vec4 tex = gl_MultiTexCoord0;
- tex.w = 1.0;
-
- gl_FrontColor = gl_Color;
-}
diff --git a/indra/newview/app_settings/shaders/class3/deferred/luminanceF.glsl b/indra/newview/app_settings/shaders/class3/deferred/luminanceF.glsl
deleted file mode 100644
index 13517a26ba..0000000000
--- a/indra/newview/app_settings/shaders/class3/deferred/luminanceF.glsl
+++ /dev/null
@@ -1,39 +0,0 @@
-/**
- * @file luminanceF.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2007, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-
-
-#extension GL_ARB_texture_rectangle : enable
-
-uniform sampler2DRect lightMap;
-uniform sampler2DRect diffuseRect;
-
-varying vec2 vary_fragcoord;
-void main()
-{
- float i = texture2DRect(lightMap, vary_fragcoord.xy).r;
- gl_FragColor.rgb = vec3(i);
- gl_FragColor.a = 1.0;
-}
diff --git a/indra/newview/app_settings/shaders/class3/deferred/luminanceV.glsl b/indra/newview/app_settings/shaders/class3/deferred/luminanceV.glsl
deleted file mode 100644
index 2d99ef5481..0000000000
--- a/indra/newview/app_settings/shaders/class3/deferred/luminanceV.glsl
+++ /dev/null
@@ -1,40 +0,0 @@
-/**
- * @file giV.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2007, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-
-
-varying vec2 vary_fragcoord;
-
-uniform vec2 screen_res;
-
-void main()
-{
- //transform vertex
- gl_Position = ftransform();
- vec4 pos = gl_ModelViewProjectionMatrix * gl_Vertex;
- vary_fragcoord = (pos.xy * 0.5 + 0.5)*screen_res;
-
- gl_FrontColor = gl_Color;
-}
diff --git a/indra/newview/app_settings/shaders/class3/deferred/postDeferredF.glsl b/indra/newview/app_settings/shaders/class3/deferred/postDeferredF.glsl
deleted file mode 100644
index 0364da6258..0000000000
--- a/indra/newview/app_settings/shaders/class3/deferred/postDeferredF.glsl
+++ /dev/null
@@ -1,100 +0,0 @@
-/**
- * @file postDeferredF.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2007, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-
-
-#extension GL_ARB_texture_rectangle : enable
-
-uniform sampler2DRect diffuseRect;
-uniform sampler2DRect specularRect;
-
-uniform sampler2DRect localLightMap;
-uniform sampler2DRect sunLightMap;
-uniform sampler2DRect giLightMap;
-uniform sampler2DRect edgeMap;
-
-uniform sampler2D luminanceMap;
-
-uniform sampler2DRect lightMap;
-
-uniform sampler2D lightFunc;
-uniform sampler2D noiseMap;
-
-uniform float sun_lum_scale;
-uniform float sun_lum_offset;
-uniform float lum_scale;
-uniform float lum_lod;
-uniform vec4 ambient;
-uniform float gi_brightness;
-uniform float gi_luminance;
-
-uniform vec4 sunlight_color;
-
-uniform vec2 screen_res;
-varying vec2 vary_fragcoord;
-
-void main()
-{
- vec2 tc = vary_fragcoord.xy;
- vec4 lcol = texture2DLod(luminanceMap, vec2(0.5, 0.5), lum_lod);
-
- vec3 gi_col = texture2DRect(giLightMap, vary_fragcoord.xy).rgb;
- vec4 sun_col = texture2DRect(sunLightMap, vary_fragcoord.xy);
- vec3 local_col = texture2DRect(localLightMap, vary_fragcoord.xy).rgb;
-
- float scol = texture2DRect(lightMap, vary_fragcoord.xy).r;
-
- vec3 diff = texture2DRect(diffuseRect, vary_fragcoord.xy).rgb;
- vec4 spec = texture2DRect(specularRect, vary_fragcoord.xy);
-
- gi_col = gi_col*(diff.rgb+spec.rgb*spec.a);
-
- float lum = 1.0-clamp(pow(lcol.r, gi_brightness)+sun_lum_offset, 0.0, 1.0);
-
- lum *= sun_lum_scale;
-
- sun_col *= 1.0+(lum*lum_scale*scol);
-
- vec4 col;
- col.rgb = gi_col+sun_col.rgb+local_col;
-
- col.a = sun_col.a;
-
- vec3 bcol = vec3(0,0,0);
- float tweight = 0.0;
- for (int i = 0; i < 16; i++)
- {
- float weight = (float(i)+1.0)/2.0;
- bcol += texture2DLod(luminanceMap, vary_fragcoord.xy/screen_res, weight).rgb*weight*weight*weight;
- tweight += weight*weight;
- }
-
- bcol /= tweight;
- bcol *= gi_luminance;
- col.rgb += bcol*lum;
-
- gl_FragColor = col;
- //gl_FragColor.rgb = texture2DRect(giLightMap, vary_fragcoord.xy).rgb;
-}
diff --git a/indra/newview/app_settings/shaders/class3/deferred/postDeferredV.glsl b/indra/newview/app_settings/shaders/class3/deferred/postDeferredV.glsl
deleted file mode 100644
index cb83dda795..0000000000
--- a/indra/newview/app_settings/shaders/class3/deferred/postDeferredV.glsl
+++ /dev/null
@@ -1,37 +0,0 @@
-/**
- * @file postDeferredV.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2007, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-
-
-varying vec2 vary_fragcoord;
-uniform vec2 screen_res;
-
-void main()
-{
- //transform vertex
- gl_Position = ftransform();
- vec4 pos = gl_ModelViewProjectionMatrix * gl_Vertex;
- vary_fragcoord = (pos.xy*0.5+0.5)*screen_res;
-}
diff --git a/indra/newview/app_settings/shaders/class3/deferred/postgiF.glsl b/indra/newview/app_settings/shaders/class3/deferred/postgiF.glsl
deleted file mode 100644
index 009b5cc743..0000000000
--- a/indra/newview/app_settings/shaders/class3/deferred/postgiF.glsl
+++ /dev/null
@@ -1,89 +0,0 @@
-/**
- * @file postgiF.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2007, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-
-
-#extension GL_ARB_texture_rectangle : enable
-
-uniform sampler2DRect depthMap;
-uniform sampler2DRect normalMap;
-uniform sampler2DRect giLightMap;
-uniform sampler2D noiseMap;
-uniform sampler2D giMip;
-uniform sampler2DRect edgeMap;
-
-
-uniform vec2 delta;
-uniform float kern_scale;
-uniform float gi_edge_weight;
-uniform float gi_blur_brightness;
-
-varying vec2 vary_fragcoord;
-
-void main()
-{
- vec2 dlt = kern_scale*delta;
- float defined_weight = 0.0;
- vec3 col = vec3(0.0);
-
- float e = 1.0;
-
- for (int i = 1; i < 8; i++)
- {
- vec2 tc = vary_fragcoord.xy + float(i) * dlt;
-
- e = max(e, 0.0);
- float wght = e;
-
- col += texture2DRect(giLightMap, tc).rgb*wght;
- defined_weight += wght;
-
- e *= e;
- e -=(texture2DRect(edgeMap, tc.xy-dlt*0.25).a+
- texture2DRect(edgeMap, tc.xy+dlt*0.25).a)*gi_edge_weight;
- }
-
- e = 1.0;
-
- for (int i = 1; i < 8; i++)
- {
- vec2 tc = vary_fragcoord.xy - float(i) * dlt;
-
- e = max(e,0.0);
- float wght = e;
-
- col += texture2DRect(giLightMap, tc).rgb*wght;
- defined_weight += wght;
-
- e *= e;
- e -= (texture2DRect(edgeMap, tc.xy-dlt*0.25).a+
- texture2DRect(edgeMap, tc.xy+dlt*0.25).a)*gi_edge_weight;
-
- }
-
- col /= max(defined_weight, 0.01);
-
- gl_FragColor.rgb = col * gi_blur_brightness;
-}
diff --git a/indra/newview/app_settings/shaders/class3/deferred/postgiV.glsl b/indra/newview/app_settings/shaders/class3/deferred/postgiV.glsl
deleted file mode 100644
index 6231ee68b7..0000000000
--- a/indra/newview/app_settings/shaders/class3/deferred/postgiV.glsl
+++ /dev/null
@@ -1,37 +0,0 @@
-/**
- * @file postgiV.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2007, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-
-
-varying vec2 vary_fragcoord;
-uniform vec2 screen_res;
-
-void main()
-{
- //transform vertex
- gl_Position = ftransform();
- vec4 pos = gl_ModelViewProjectionMatrix * gl_Vertex;
- vary_fragcoord = (pos.xy*0.5+0.5)*screen_res;
-}
diff --git a/indra/newview/app_settings/shaders/class3/deferred/softenLightF.glsl b/indra/newview/app_settings/shaders/class3/deferred/softenLightF.glsl
deleted file mode 100644
index 1c02adea89..0000000000
--- a/indra/newview/app_settings/shaders/class3/deferred/softenLightF.glsl
+++ /dev/null
@@ -1,335 +0,0 @@
-/**
- * @file softenLightF.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2007, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-
-
-#extension GL_ARB_texture_rectangle : enable
-
-uniform sampler2DRect diffuseRect;
-uniform sampler2DRect specularRect;
-uniform sampler2DRect normalMap;
-uniform sampler2DRect lightMap;
-uniform sampler2D noiseMap;
-uniform samplerCube environmentMap;
-uniform sampler2D lightFunc;
-uniform vec3 gi_quad;
-
-uniform float blur_size;
-uniform float blur_fidelity;
-
-// Inputs
-uniform vec4 morphFactor;
-uniform vec3 camPosLocal;
-//uniform vec4 camPosWorld;
-uniform vec4 gamma;
-uniform vec4 lightnorm;
-uniform vec4 sunlight_color;
-uniform vec4 ambient;
-uniform vec4 blue_horizon;
-uniform vec4 blue_density;
-uniform vec4 haze_horizon;
-uniform vec4 haze_density;
-uniform vec4 cloud_shadow;
-uniform vec4 density_multiplier;
-uniform vec4 distance_multiplier;
-uniform vec4 max_y;
-uniform vec4 glow;
-uniform float scene_light_strength;
-uniform vec3 env_mat[3];
-uniform vec4 shadow_clip;
-uniform mat3 ssao_effect_mat;
-
-uniform sampler2DRect depthMap;
-uniform mat4 inv_proj;
-uniform vec2 screen_res;
-
-varying vec4 vary_light;
-varying vec2 vary_fragcoord;
-
-vec3 vary_PositionEye;
-
-vec3 vary_SunlitColor;
-vec3 vary_AmblitColor;
-vec3 vary_AdditiveColor;
-vec3 vary_AtmosAttenuation;
-uniform float gi_ambiance;
-
-vec4 getPosition_d(vec2 pos_screen, float depth)
-{
- vec2 sc = pos_screen.xy*2.0;
- sc /= screen_res;
- sc -= vec2(1.0,1.0);
- vec4 ndc = vec4(sc.x, sc.y, 2.0*depth-1.0, 1.0);
- vec4 pos = inv_proj * ndc;
- pos /= pos.w;
- pos.w = 1.0;
- return pos;
-}
-
-vec4 getPosition(vec2 pos_screen)
-{ //get position in screen space (world units) given window coordinate and depth map
- float depth = texture2DRect(depthMap, pos_screen.xy).a;
- return getPosition_d(pos_screen, depth);
-}
-
-vec3 getPositionEye()
-{
- return vary_PositionEye;
-}
-vec3 getSunlitColor()
-{
- return vary_SunlitColor;
-}
-vec3 getAmblitColor()
-{
- return vary_AmblitColor;
-}
-vec3 getAdditiveColor()
-{
- return vary_AdditiveColor;
-}
-vec3 getAtmosAttenuation()
-{
- return vary_AtmosAttenuation;
-}
-
-
-void setPositionEye(vec3 v)
-{
- vary_PositionEye = v;
-}
-
-void setSunlitColor(vec3 v)
-{
- vary_SunlitColor = v;
-}
-
-void setAmblitColor(vec3 v)
-{
- vary_AmblitColor = v;
-}
-
-void setAdditiveColor(vec3 v)
-{
- vary_AdditiveColor = v;
-}
-
-void setAtmosAttenuation(vec3 v)
-{
- vary_AtmosAttenuation = v;
-}
-
-void calcAtmospherics(vec3 inPositionEye, float ambFactor) {
-
- vec3 P = inPositionEye;
- setPositionEye(P);
-
- //(TERRAIN) limit altitude
- if (P.y > max_y.x) P *= (max_y.x / P.y);
- if (P.y < -max_y.x) P *= (-max_y.x / P.y);
-
- vec3 tmpLightnorm = lightnorm.xyz;
-
- vec3 Pn = normalize(P);
- float Plen = length(P);
-
- vec4 temp1 = vec4(0);
- vec3 temp2 = vec3(0);
- vec4 blue_weight;
- vec4 haze_weight;
- vec4 sunlight = sunlight_color;
- vec4 light_atten;
-
- //sunlight attenuation effect (hue and brightness) due to atmosphere
- //this is used later for sunlight modulation at various altitudes
- light_atten = (blue_density * 1.0 + vec4(haze_density.r) * 0.25) * (density_multiplier.x * max_y.x);
- //I had thought blue_density and haze_density should have equal weighting,
- //but attenuation due to haze_density tends to seem too strong
-
- temp1 = blue_density + vec4(haze_density.r);
- blue_weight = blue_density / temp1;
- haze_weight = vec4(haze_density.r) / temp1;
-
- //(TERRAIN) compute sunlight from lightnorm only (for short rays like terrain)
- temp2.y = max(0.0, tmpLightnorm.y);
- temp2.y = 1. / temp2.y;
- sunlight *= exp( - light_atten * temp2.y);
-
- // main atmospheric scattering line integral
- temp2.z = Plen * density_multiplier.x;
-
- // Transparency (-> temp1)
- // ATI Bugfix -- can't store temp1*temp2.z*distance_multiplier.x in a variable because the ati
- // compiler gets confused.
- temp1 = exp(-temp1 * temp2.z * distance_multiplier.x);
-
- //final atmosphere attenuation factor
- setAtmosAttenuation(temp1.rgb);
-
- //compute haze glow
- //(can use temp2.x as temp because we haven't used it yet)
- temp2.x = dot(Pn, tmpLightnorm.xyz);
- temp2.x = 1. - temp2.x;
- //temp2.x is 0 at the sun and increases away from sun
- temp2.x = max(temp2.x, .03); //was glow.y
- //set a minimum "angle" (smaller glow.y allows tighter, brighter hotspot)
- temp2.x *= glow.x;
- //higher glow.x gives dimmer glow (because next step is 1 / "angle")
- temp2.x = pow(temp2.x, glow.z);
- //glow.z should be negative, so we're doing a sort of (1 / "angle") function
-
- //add "minimum anti-solar illumination"
- temp2.x += .25;
-
- //increase ambient when there are more clouds
- vec4 tmpAmbient = ambient*gi_ambiance + (vec4(1.) - ambient*gi_ambiance) * cloud_shadow.x * 0.5;
-
- /* decrease value and saturation (that in HSV, not HSL) for occluded areas
- * // for HSV color/geometry used here, see http://gimp-savvy.com/BOOK/index.html?node52.html
- * // The following line of code performs the equivalent of:
- * float ambAlpha = tmpAmbient.a;
- * float ambValue = dot(vec3(tmpAmbient), vec3(0.577)); // projection onto <1/rt(3), 1/rt(3), 1/rt(3)>, the neutral white-black axis
- * vec3 ambHueSat = vec3(tmpAmbient) - vec3(ambValue);
- * tmpAmbient = vec4(RenderSSAOEffect.valueFactor * vec3(ambValue) + RenderSSAOEffect.saturationFactor *(1.0 - ambFactor) * ambHueSat, ambAlpha);
- */
- tmpAmbient = vec4(mix(ssao_effect_mat * tmpAmbient.rgb, tmpAmbient.rgb, ambFactor), tmpAmbient.a);
-
- //haze color
- setAdditiveColor(
- vec3(blue_horizon * blue_weight * (sunlight*(1.-cloud_shadow.x) + tmpAmbient)
- + (haze_horizon.r * haze_weight) * (sunlight*(1.-cloud_shadow.x) * temp2.x
- + tmpAmbient)));
-
- //brightness of surface both sunlight and ambient
- setSunlitColor(vec3(sunlight * .5));
- setAmblitColor(vec3(tmpAmbient * .25));
- setAdditiveColor(getAdditiveColor() * vec3(1.0 - temp1));
-}
-
-vec3 atmosLighting(vec3 light)
-{
- light *= getAtmosAttenuation().r;
- light += getAdditiveColor();
- return (2.0 * light);
-}
-
-vec3 atmosTransport(vec3 light) {
- light *= getAtmosAttenuation().r;
- light += getAdditiveColor() * 2.0;
- return light;
-}
-vec3 atmosGetDiffuseSunlightColor()
-{
- return getSunlitColor();
-}
-
-vec3 scaleDownLight(vec3 light)
-{
- return (light / scene_light_strength );
-}
-
-vec3 scaleUpLight(vec3 light)
-{
- return (light * scene_light_strength);
-}
-
-vec3 atmosAmbient(vec3 light)
-{
- return getAmblitColor() + light / 2.0;
-}
-
-vec3 atmosAffectDirectionalLight(float lightIntensity)
-{
- return getSunlitColor() * lightIntensity;
-}
-
-vec3 scaleSoftClip(vec3 light)
-{
- //soft clip effect:
- light = 1. - clamp(light, vec3(0.), vec3(1.));
- light = 1. - pow(light, gamma.xxx);
-
- return light;
-}
-
-void main()
-{
- vec2 tc = vary_fragcoord.xy;
- float depth = texture2DRect(depthMap, tc.xy).a;
- vec3 pos = getPosition_d(tc, depth).xyz;
- vec3 norm = texture2DRect(normalMap, tc).xyz;
- norm = vec3((norm.xy-0.5)*2.0,norm.z); // unpack norm
- //vec3 nz = texture2D(noiseMap, vary_fragcoord.xy/128.0).xyz;
-
- float da = max(dot(norm.xyz, vary_light.xyz), 0.0);
-
- vec4 diffuse = texture2DRect(diffuseRect, tc);
- vec3 col;
- float bloom = 0.0;
-
- if (diffuse.a < 0.9)
- {
- vec4 spec = texture2DRect(specularRect, vary_fragcoord.xy);
-
- da = texture2D(lightFunc, vec2(da, 0.0)).a;
-
- vec2 scol_ambocc = texture2DRect(lightMap, vary_fragcoord.xy).rg;
- float scol = max(scol_ambocc.r, diffuse.a);
- float ambocc = scol_ambocc.g;
-
- calcAtmospherics(pos.xyz, ambocc);
-
- col = atmosAmbient(vec3(0));
- col += atmosAffectDirectionalLight(max(min(da, scol), diffuse.a));
-
- col *= diffuse.rgb;
-
- if (spec.a > 0.0) // specular reflection
- {
- // the old infinite-sky shiny reflection
- //
- vec3 refnormpersp = normalize(reflect(pos.xyz, norm.xyz));
- float sa = dot(refnormpersp, vary_light.xyz);
- vec3 dumbshiny = vary_SunlitColor*scol*texture2D(lightFunc, vec2(sa, spec.a)).a;
-
- // add the two types of shiny together
- vec3 spec_contrib = dumbshiny * spec.rgb;
- bloom = dot(spec_contrib, spec_contrib);
- col += spec_contrib;
- }
-
- col = atmosLighting(col);
- col = scaleSoftClip(col);
-
- col = mix(col, diffuse.rgb, diffuse.a);
- }
- else
- {
- col = diffuse.rgb;
- }
-
- gl_FragColor.rgb = col;
- gl_FragColor.a = bloom;
-}
diff --git a/indra/newview/app_settings/shaders/class3/deferred/softenLightV.glsl b/indra/newview/app_settings/shaders/class3/deferred/softenLightV.glsl
deleted file mode 100644
index fed238510a..0000000000
--- a/indra/newview/app_settings/shaders/class3/deferred/softenLightV.glsl
+++ /dev/null
@@ -1,44 +0,0 @@
-/**
- * @file softenLightF.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2007, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-
-
-uniform vec2 screen_res;
-
-varying vec4 vary_light;
-varying vec2 vary_fragcoord;
-void main()
-{
- //transform vertex
- gl_Position = ftransform();
-
- vec4 pos = gl_ModelViewProjectionMatrix * gl_Vertex;
- vary_fragcoord = (pos.xy*0.5+0.5)*screen_res;
-
- vec4 tex = gl_MultiTexCoord0;
- tex.w = 1.0;
-
- vary_light = gl_MultiTexCoord0;
-}
diff --git a/indra/newview/app_settings/shaders/class3/deferred/treeF.glsl b/indra/newview/app_settings/shaders/class3/deferred/treeF.glsl
deleted file mode 100644
index 56a149523e..0000000000
--- a/indra/newview/app_settings/shaders/class3/deferred/treeF.glsl
+++ /dev/null
@@ -1,39 +0,0 @@
-/**
- * @file treeF.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2007, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-
-
-uniform sampler2D diffuseMap;
-
-varying vec3 vary_normal;
-
-void main()
-{
- vec4 col = texture2D(diffuseMap, gl_TexCoord[0].xy);
- gl_FragData[0] = vec4(gl_Color.rgb*col.rgb, col.a <= 0.5 ? 0.0 : 0.005);
- gl_FragData[1] = vec4(0,0,0,0);
- vec3 nvn = normalize(vary_normal);
- gl_FragData[2] = vec4(nvn.xy * 0.5 + 0.5, nvn.z, 0.0);
-}
diff --git a/indra/newview/app_settings/shaders/class3/lighting/sumLightsSpecularV.glsl b/indra/newview/app_settings/shaders/class3/lighting/sumLightsSpecularV.glsl
index 79bd017efc..e043ac873e 100644
--- a/indra/newview/app_settings/shaders/class3/lighting/sumLightsSpecularV.glsl
+++ b/indra/newview/app_settings/shaders/class3/lighting/sumLightsSpecularV.glsl
@@ -23,8 +23,6 @@
* $/LicenseInfo$
*/
-
-
float calcDirectionalLightSpecular(inout vec4 specular, vec3 view, vec3 n, vec3 l, vec3 lightCol, float da);
vec3 calcPointLightSpecular(inout vec4 specular, vec3 view, vec3 v, vec3 n, vec3 l, float r, float pw, vec3 lightCol);
@@ -33,6 +31,10 @@ vec3 atmosAffectDirectionalLight(float lightIntensity);
vec3 atmosGetDiffuseSunlightColor();
vec3 scaleDownLight(vec3 light);
+uniform vec4 light_position[8];
+uniform vec3 light_attenuation[8];
+uniform vec3 light_diffuse[8];
+
vec4 sumLightsSpecular(vec3 pos, vec3 norm, vec4 color, inout vec4 specularColor, vec4 baseCol)
{
vec4 col = vec4(0.0, 0.0, 0.0, color.a);
@@ -43,18 +45,18 @@ vec4 sumLightsSpecular(vec3 pos, vec3 norm, vec4 color, inout vec4 specularColor
vec4 specularSum = vec4(0.0);
// Collect normal lights (need to be divided by two, as we later multiply by 2)
- col.rgb += gl_LightSource[1].diffuse.rgb * calcDirectionalLightSpecular(specularColor, view, norm, gl_LightSource[1].position.xyz,gl_LightSource[1].diffuse.rgb, 1.0);
- col.rgb += calcPointLightSpecular(specularSum, view, pos, norm, gl_LightSource[2].position.xyz, gl_LightSource[2].linearAttenuation, gl_LightSource[2].quadraticAttenuation,gl_LightSource[2].diffuse.rgb);
- col.rgb += calcPointLightSpecular(specularSum, view, pos, norm, gl_LightSource[3].position.xyz, gl_LightSource[3].linearAttenuation, gl_LightSource[3].quadraticAttenuation,gl_LightSource[3].diffuse.rgb);
- col.rgb += calcPointLightSpecular(specularSum, view, pos, norm, gl_LightSource[4].position.xyz, gl_LightSource[4].linearAttenuation, gl_LightSource[4].quadraticAttenuation,gl_LightSource[4].diffuse.rgb);
- col.rgb += calcPointLightSpecular(specularSum, view, pos, norm, gl_LightSource[5].position.xyz, gl_LightSource[5].linearAttenuation, gl_LightSource[5].quadraticAttenuation,gl_LightSource[5].diffuse.rgb);
- col.rgb += calcPointLightSpecular(specularSum, view, pos, norm, gl_LightSource[6].position.xyz, gl_LightSource[6].linearAttenuation, gl_LightSource[6].quadraticAttenuation,gl_LightSource[6].diffuse.rgb);
- col.rgb += calcPointLightSpecular(specularSum, view, pos, norm, gl_LightSource[7].position.xyz, gl_LightSource[7].linearAttenuation, gl_LightSource[7].quadraticAttenuation,gl_LightSource[7].diffuse.rgb);
+ col.rgb += light_diffuse[1].rgb * calcDirectionalLightSpecular(specularColor, view, norm, light_position[1].xyz,light_diffuse[1].rgb, 1.0);
+ col.rgb += calcPointLightSpecular(specularSum, view, pos, norm, light_position[2].xyz, light_attenuation[2].x, light_attenuation[2].y, light_diffuse[2].rgb);
+ col.rgb += calcPointLightSpecular(specularSum, view, pos, norm, light_position[3].xyz, light_attenuation[3].x, light_attenuation[3].y, light_diffuse[3].rgb);
+ col.rgb += calcPointLightSpecular(specularSum, view, pos, norm, light_position[4].xyz, light_attenuation[4].x, light_attenuation[4].y, light_diffuse[4].rgb);
+ col.rgb += calcPointLightSpecular(specularSum, view, pos, norm, light_position[5].xyz, light_attenuation[5].x, light_attenuation[5].y, light_diffuse[5].rgb);
+ col.rgb += calcPointLightSpecular(specularSum, view, pos, norm, light_position[6].xyz, light_attenuation[6].x, light_attenuation[6].y, light_diffuse[6].rgb);
+ col.rgb += calcPointLightSpecular(specularSum, view, pos, norm, light_position[7].xyz, light_attenuation[7].x, light_attenuation[7].y, light_diffuse[7].rgb);
col.rgb = scaleDownLight(col.rgb);
// Add windlight lights
col.rgb += atmosAmbient(baseCol.rgb);
- col.rgb += atmosAffectDirectionalLight(calcDirectionalLightSpecular(specularSum, view, norm, gl_LightSource[0].position.xyz,atmosGetDiffuseSunlightColor()*baseCol.a, 1.0));
+ col.rgb += atmosAffectDirectionalLight(calcDirectionalLightSpecular(specularSum, view, norm, light_position[0].xyz,atmosGetDiffuseSunlightColor()*baseCol.a, 1.0));
col.rgb = min(col.rgb*color.rgb, 1.0);
specularColor.rgb = min(specularColor.rgb*specularSum.rgb, 1.0);
diff --git a/indra/newview/app_settings/shaders/class3/lighting/sumLightsV.glsl b/indra/newview/app_settings/shaders/class3/lighting/sumLightsV.glsl
index dcdc72ac02..dadff40933 100644
--- a/indra/newview/app_settings/shaders/class3/lighting/sumLightsV.glsl
+++ b/indra/newview/app_settings/shaders/class3/lighting/sumLightsV.glsl
@@ -24,7 +24,6 @@
*/
-
float calcDirectionalLight(vec3 n, vec3 l);
float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float is_pointlight);
@@ -33,22 +32,29 @@ vec3 atmosAffectDirectionalLight(float lightIntensity);
vec3 scaleDownLight(vec3 light);
vec3 scaleUpLight(vec3 light);
+uniform vec4 light_position[8];
+uniform vec3 light_direction[8];
+uniform vec3 light_attenuation[8];
+uniform vec3 light_diffuse[8];
+
vec4 sumLights(vec3 pos, vec3 norm, vec4 color, vec4 baseLight)
{
vec4 col = vec4(0.0, 0.0, 0.0, color.a);
// Collect normal lights (need to be divided by two, as we later multiply by 2)
- 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);
+
+ // Collect normal lights
+ col.rgb += light_diffuse[2].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[2], light_direction[2], light_attenuation[2].x, light_attenuation[2].z);
+ col.rgb += light_diffuse[3].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[3], light_direction[3], light_attenuation[3].x, light_attenuation[3].z);
+ col.rgb += light_diffuse[4].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[4], light_direction[4], light_attenuation[4].x, light_attenuation[4].z);
+ col.rgb += light_diffuse[5].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[5], light_direction[5], light_attenuation[5].x, light_attenuation[5].z);
+ col.rgb += light_diffuse[6].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[6], light_direction[6], light_attenuation[6].x, light_attenuation[6].z);
+ col.rgb += light_diffuse[7].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[7], light_direction[7], light_attenuation[7].x, light_attenuation[7].z);
+ col.rgb += light_diffuse[1].rgb*calcDirectionalLight(norm, light_position[1].xyz);
col.rgb = scaleDownLight(col.rgb);
// Add windlight lights
- col.rgb += atmosAffectDirectionalLight(calcDirectionalLight(norm, gl_LightSource[0].position.xyz));
+ col.rgb += atmosAffectDirectionalLight(calcDirectionalLight(norm, light_position[0].xyz));
col.rgb += atmosAmbient(baseLight.rgb);
col.rgb = min(col.rgb*color.rgb, 1.0);
diff --git a/indra/newview/app_settings/toolbars.xml b/indra/newview/app_settings/toolbars.xml
new file mode 100644
index 0000000000..29c019719d
--- /dev/null
+++ b/indra/newview/app_settings/toolbars.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<toolbars>
+ <bottom_toolbar
+ button_display_mode="icons_with_text">
+ <command name="chat"/>
+ <command name="speak"/>
+ <command name="destinations"/>
+ <command name="people"/>
+ <command name="profile"/>
+ <command name="move"/>
+ <command name="view"/>
+ <command name="howto"/>
+ </bottom_toolbar>
+ <left_toolbar
+ button_display_mode="icons_only">
+ <command name="avatar"/>
+ <command name="appearance"/>
+ <command name="inventory"/>
+ <command name="search"/>
+ <command name="places"/>
+ <command name="voice"/>
+ <command name="minimap"/>
+ <command name="snapshot"/>
+ </left_toolbar>
+</toolbars>
diff --git a/indra/newview/character/avatar_lad.xml b/indra/newview/character/avatar_lad.xml
index 5d6b10c047..99dbfcae51 100644
--- a/indra/newview/character/avatar_lad.xml
+++ b/indra/newview/character/avatar_lad.xml
@@ -393,7 +393,26 @@
max_attachment_offset="2.0"
visible_in_first_person="true" />
-
+ <attachment_point
+ id="39"
+ group="6"
+ pie_slice="1"
+ name="Neck"
+ joint="mNeck"
+ position="0 0 0"
+ rotation="0 0 0"
+ visible_in_first_person="true" />
+
+ <attachment_point
+ id="40"
+ group="6"
+ pie_slice="2"
+ name="Avatar Center"
+ joint="mRoot"
+ position="0 0 0"
+ rotation="0 0 0"
+ visible_in_first_person="true" />
+
<param
id="32"
group="1"
diff --git a/indra/newview/featuretable.txt b/indra/newview/featuretable.txt
index e12c2f7853..0f33d40ac3 100755..100644
--- a/indra/newview/featuretable.txt
+++ b/indra/newview/featuretable.txt
@@ -1,4 +1,8 @@
version 32
+// The version number above should be implemented IF AND ONLY IF some
+// change has been made that is sufficiently important to justify
+// resetting the graphics preferences of all users to the recommended
+// defaults. This should be as rare an event as we can manage.
// NOTE: This is mostly identical to featuretable_mac.txt with a few differences
// Should be combined into one table
@@ -65,6 +69,8 @@ RenderShadowDetail 1 2
WatchdogDisabled 1 1
RenderUseStreamVBO 1 1
RenderFSAASamples 1 16
+RenderMaxTextureIndex 1 16
+
//
// Low Graphics Settings
@@ -155,7 +161,7 @@ WLSkyDetail 1 48
RenderDeferred 1 0
RenderDeferredSSAO 1 0
RenderShadowDetail 1 0
-RenderFSAASamples 1 4
+RenderFSAASamples 1 2
//
// Ultra graphics (REALLY PURTY!)
@@ -184,7 +190,7 @@ WLSkyDetail 1 128
RenderDeferred 1 1
RenderDeferredSSAO 1 1
RenderShadowDetail 1 2
-RenderFSAASamples 1 8
+RenderFSAASamples 1 2
//
@@ -292,6 +298,7 @@ RenderVBOEnable 1 0
list OpenGLPre30
RenderDeferred 0 0
+RenderMaxTextureIndex 1 1
list Intel
RenderAnisotropic 1 0
diff --git a/indra/newview/featuretable_linux.txt b/indra/newview/featuretable_linux.txt
index 6e962f3c56..8142311a55 100644
--- a/indra/newview/featuretable_linux.txt
+++ b/indra/newview/featuretable_linux.txt
@@ -1,4 +1,8 @@
version 27
+// The version number above should be implemented IF AND ONLY IF some
+// change has been made that is sufficiently important to justify
+// resetting the graphics preferences of all users to the recommended
+// defaults. This should be as rare an event as we can manage.
// NOTE: This is mostly identical to featuretable_mac.txt with a few differences
// Should be combined into one table
@@ -63,6 +67,7 @@ RenderDeferred 1 1
RenderDeferredSSAO 1 1
RenderShadowDetail 1 2
RenderFSAASamples 1 16
+RenderMaxTextureIndex 1 16
//
// Low Graphics Settings
@@ -153,7 +158,7 @@ WLSkyDetail 1 48
RenderDeferred 1 0
RenderDeferredSSAO 1 0
RenderShadowDetail 1 0
-RenderFSAASamples 1 4
+RenderFSAASamples 1 2
//
// Ultra graphics (REALLY PURTY!)
@@ -183,7 +188,7 @@ WLSkyDetail 1 128
RenderDeferred 1 1
RenderDeferredSSAO 1 1
RenderShadowDetail 1 2
-RenderFSAASamples 1 8
+RenderFSAASamples 1 2
//
// Class Unknown Hardware (unknown)
diff --git a/indra/newview/featuretable_mac.txt b/indra/newview/featuretable_mac.txt
index 2690e8ec70..942c043081 100644
--- a/indra/newview/featuretable_mac.txt
+++ b/indra/newview/featuretable_mac.txt
@@ -1,4 +1,8 @@
-version 30
+version 32
+// The version number above should be implemented IF AND ONLY IF some
+// change has been made that is sufficiently important to justify
+// resetting the graphics preferences of all users to the recommended
+// defaults. This should be as rare an event as we can manage.
// NOTE: This is mostly identical to featuretable_mac.txt with a few differences
// Should be combined into one table
@@ -47,10 +51,10 @@ RenderTerrainLODFactor 1 2.0
RenderTransparentWater 1 1
RenderTreeLODFactor 1 1.0
RenderUseImpostors 1 1
-RenderVBOEnable 1 0
-RenderVBOMappingDisable 1 0
+RenderVBOEnable 1 1
+RenderVBOMappingDisable 1 1
RenderVolumeLODFactor 1 2.0
-UseStartScreen 1 1
+UseStartScreen 1 1
UseOcclusion 1 1
VertexShaderEnable 1 1
WindLightUseAtmosShaders 1 1
@@ -63,8 +67,9 @@ RenderDeferred 1 1
RenderDeferredSSAO 1 1
RenderShadowDetail 1 2
WatchdogDisabled 1 1
-RenderUseStreamVBO 1 0
+RenderUseStreamVBO 1 1
RenderFSAASamples 1 16
+RenderMaxTextureIndex 1 16
//
// Low Graphics Settings
@@ -155,7 +160,7 @@ WLSkyDetail 1 48
RenderDeferred 1 0
RenderDeferredSSAO 1 0
RenderShadowDetail 1 2
-RenderFSAASamples 1 4
+RenderFSAASamples 1 2
//
// Ultra graphics (REALLY PURTY!)
@@ -185,7 +190,7 @@ WLSkyDetail 1 128
RenderDeferred 1 0
RenderDeferredSSAO 1 0
RenderShadowDetail 1 2
-RenderFSAASamples 1 8
+RenderFSAASamples 1 2
//
// Class Unknown Hardware (unknown)
@@ -286,7 +291,7 @@ list TexUnit8orLess
RenderDeferredSSAO 0 0
list ATI
-RenderDeferredSSAO 0 0
+RenderDeferredSSAO 1 0
list Intel
RenderAnisotropic 1 0
diff --git a/indra/newview/featuretable_solaris.txt b/indra/newview/featuretable_solaris.txt
index 7df75687f2..e7cae1abdc 100644
--- a/indra/newview/featuretable_solaris.txt
+++ b/indra/newview/featuretable_solaris.txt
@@ -1,4 +1,8 @@
version 15
+// The version number above should be implemented IF AND ONLY IF some
+// change has been made that is sufficiently important to justify
+// resetting the graphics preferences of all users to the recommended
+// defaults. This should be as rare an event as we can manage.
// NOTE: This is mostly identical to featuretable.txt with a few differences
// Should be combined into one table
diff --git a/indra/newview/featuretable_xp.txt b/indra/newview/featuretable_xp.txt
index a0245f5369..278d601860 100644
--- a/indra/newview/featuretable_xp.txt
+++ b/indra/newview/featuretable_xp.txt
@@ -1,4 +1,8 @@
version 31
+// The version number above should be implemented IF AND ONLY IF some
+// change has been made that is sufficiently important to justify
+// resetting the graphics preferences of all users to the recommended
+// defaults. This should be as rare an event as we can manage.
// NOTE: This is mostly identical to featuretable_mac.txt with a few differences
// Should be combined into one table
@@ -65,6 +69,7 @@ RenderShadowDetail 1 0
WatchdogDisabled 1 1
RenderUseStreamVBO 1 1
RenderFSAASamples 1 16
+RenderMaxTextureIndex 1 16
//
// Low Graphics Settings
@@ -155,7 +160,7 @@ WLSkyDetail 1 48
RenderDeferred 1 0
RenderDeferredSSAO 1 0
RenderShadowDetail 1 2
-RenderFSAASamples 1 4
+RenderFSAASamples 1 2
//
// Ultra graphics (REALLY PURTY!)
@@ -185,7 +190,7 @@ WLSkyDetail 1 128
RenderDeferred 1 0
RenderDeferredSSAO 1 0
RenderShadowDetail 1 2
-RenderFSAASamples 1 8
+RenderFSAASamples 1 2
//
// Class Unknown Hardware (unknown)
@@ -290,6 +295,7 @@ RenderVBOEnable 1 0
list OpenGLPre30
RenderDeferred 0 0
+RenderMaxTextureIndex 1 1
list Intel
RenderAnisotropic 1 0
diff --git a/indra/newview/gpu_table.txt b/indra/newview/gpu_table.txt
index 6ed4e3b7f7..198e702459 100644
--- a/indra/newview/gpu_table.txt
+++ b/indra/newview/gpu_table.txt
@@ -5,6 +5,10 @@
// against driver strings, a class number, and whether we claim
// to support them or not.
//
+// Case is not significant in either the regular expressions or the
+// driver strings; the recognizer code lowercases both before using
+// them.
+//
// If you modify this table, use the (perl) gpu_table_tester
// to compare the results of recognizing known cards (it is easy
// to mess this up by putting things in the wrong order):
@@ -12,13 +16,13 @@
// perl ../../scripts/gpu_table_tester -g gpu_table.txt tests/gpus_seen.txt | diff - tests/gpus_results.txt
//
// Format:
-// Fields are separated by one or more tab (not space) characters
-// <recognizer name> <regular expression> <class> <supported>
+// Fields are separated by one or more tab (not space) characters
+// <recognizer name> <regular expression> <class> <supported>
//
// Class Numbers:
-// 0 - Defaults to low graphics settings. No shaders on by default
-// 1 - Defaults to mid graphics settings. Basic shaders on by default
-// 2 - Defaults to high graphics settings. Atmospherics on by default.
+// 0 - Defaults to low graphics settings. No shaders on by default
+// 1 - Defaults to mid graphics settings. Basic shaders on by default
+// 2 - Defaults to high graphics settings. Atmospherics on by default.
// 3 - Same as class 2 for now.
//
// Supported Number:
@@ -39,7 +43,8 @@ ATI All-in-Wonder X800 .*ATI.*All-in-Wonder X8.* 2 1
ATI All-in-Wonder X1800 .*ATI.*All-in-Wonder X18.* 3 1
ATI All-in-Wonder X1900 .*ATI.*All-in-Wonder X19.* 3 1
ATI All-in-Wonder PCI-E .*ATI.*All-in-Wonder.*PCI-E.* 1 1
-ATI All-in-Wonder Radeon .*ATI.*All-in-Wonder Radeon.* 0 1
+ATI All-in-Wonder Radeon .*ATI.*All-in-Wonder Radeon.* 0 1
+ATI ASUS ARES .*ATI.*ASUS.*ARES.* 3 1
ATI ASUS A9xxx .*ATI.*ASUS.*A9.* 1 1
ATI ASUS AH24xx .*ATI.*ASUS.*AH24.* 1 1
ATI ASUS AH26xx .*ATI.*ASUS.*AH26.* 3 1
@@ -51,6 +56,7 @@ ATI ASUS AX5xx .*ATI.*ASUS.*AX5.* 1 1
ATI ASUS AX8xx .*ATI.*ASUS.*AX8.* 2 1
ATI ASUS EAH24xx .*ATI.*ASUS.*EAH24.* 2 1
ATI ASUS EAH26xx .*ATI.*ASUS.*EAH26.* 3 1
+ATI ASUS EAH29xx .*ATI.*ASUS.*EAH29.* 3 1
ATI ASUS EAH34xx .*ATI.*ASUS.*EAH34.* 1 1
ATI ASUS EAH36xx .*ATI.*ASUS.*EAH36.* 3 1
ATI ASUS EAH38xx .*ATI.*ASUS.*EAH38.* 3 1
@@ -59,12 +65,17 @@ ATI ASUS EAH45xx .*ATI.*ASUS.*EAH45.* 1 1
ATI ASUS EAH48xx .*ATI.*ASUS.*EAH48.* 3 1
ATI ASUS EAH57xx .*ATI.*ASUS.*EAH57.* 3 1
ATI ASUS EAH58xx .*ATI.*ASUS.*EAH58.* 3 1
+ATI ASUS EAH6xxx .*ATI.*ASUS.*EAH6.* 3 1
ATI ASUS Radeon X1xxx .*ATI.*ASUS.*X1.* 3 1
ATI Radeon X7xx .*ATI.*ASUS.*X7.* 1 1
-ATI Radeon X1xxx .*ATI.*X1.* 0 1
-ATI Radeon X13xx .*ATI.*Diamond X13.* 1 1
-ATI Radeon X16xx .*ATI.*Diamond X16.* 1 1
-ATI Radeon X19xx .*ATI.*Diamond X19.* 1 1
+ATI Radeon X19xx .*ATI.*(Radeon|Diamond) X19.* ?.* 3 1
+ATI Radeon X18xx .*ATI.*(Radeon|Diamond) X18.* ?.* 3 1
+ATI Radeon X17xx .*ATI.*(Radeon|Diamond) X17.* ?.* 2 1
+ATI Radeon X16xx .*ATI.*(Radeon|Diamond) X16.* ?.* 2 1
+ATI Radeon X15xx .*ATI.*(Radeon|Diamond) X15.* ?.* 2 1
+ATI Radeon X13xx .*ATI.*(Radeon|Diamond) X13.* ?.* 1 1
+ATI Radeon X1xxx .*ATI.*(Radeon|Diamond) X1.. ?.* 1 1
+ATI Radeon X2xxx .*ATI.*(Radeon|Diamond) X2.. ?.* 1 1
ATI Display Adapter .*ATI.*display adapter.* 0 1
ATI FireGL 5200 .*ATI.*FireGL V52.* 0 1
ATI FireGL 5xxx .*ATI.*FireGL V5.* 1 1
@@ -74,8 +85,9 @@ ATI FirePro M5800 .*ATI.*FirePro.*M58.* 3 1
ATI FirePro M7740 .*ATI.*FirePro.*M77.* 3 1
ATI FirePro M7820 .*ATI.*FirePro.*M78.* 3 1
ATI FireMV .*ATI.*FireMV.* 0 1
-ATI Geforce 9500 GT .*ATI.*Geforce 9500 *GT 2 1
-ATI Geforce 9800 GT .*ATI.*Geforce 9800 *GT 2 1
+ATI Geforce 9500 GT .*ATI.*Geforce 9500 *GT.* 2 1
+ATI Geforce 9600 GT .*ATI.*Geforce 9600 *GT.* 2 1
+ATI Geforce 9800 GT .*ATI.*Geforce 9800 *GT.* 2 1
ATI Generic .*ATI.*Generic.* 0 0
ATI Hercules 9800 .*ATI.*Hercules.*9800.* 1 1
ATI IGP 340M .*ATI.*IGP.*340M.* 0 0
@@ -85,168 +97,156 @@ ATI M56 .*ATI.*M56.* 1 1
ATI M71 .*ATI.*M71.* 1 1
ATI M72 .*ATI.*M72.* 1 1
ATI M76 .*ATI.*M76.* 3 1
-ATI Mobility Radeon 4100 .*ATI.*(Mobility|MOBILITY).*41.* 0 1
-ATI Mobility Radeon 7xxx .*ATI.*(Mobility|MOBILITY).*Radeon 7.* 0 1
-ATI Mobility Radeon 8xxx .*ATI.*(Mobility|MOBILITY).*Radeon 8.* 0 1
-ATI Mobility Radeon 9800 .*ATI.*(Mobility|MOBILITY).*98.* 1 1
-ATI Mobility Radeon 9700 .*ATI.*(Mobility|MOBILITY).*97.* 1 1
-ATI Mobility Radeon 9600 .*ATI.*(Mobility|MOBILITY).*96.* 0 1
-ATI Mobility Radeon HD 530v .*ATI.*(Mobility|MOBILITY).*HD *530v.* 1 1
-ATI Mobility Radeon HD 540v .*ATI.*(Mobility|MOBILITY).*HD *540v.* 2 1
-ATI Mobility Radeon HD 545v .*ATI.*(Mobility|MOBILITY).*HD *545v.* 2 1
-ATI Mobility Radeon HD 550v .*ATI.*(Mobility|MOBILITY).*HD *550v.* 2 1
-ATI Mobility Radeon HD 560v .*ATI.*(Mobility|MOBILITY).*HD *560v.* 2 1
-ATI Mobility Radeon HD 565v .*ATI.*(Mobility|MOBILITY).*HD *565v.* 2 1
-ATI Mobility Radeon HD 2300 .*ATI.*(Mobility|MOBILITY).*HD *23.* 1 1
-ATI Mobility Radeon HD 2400 .*ATI.*(Mobility|MOBILITY).*HD *24.* 1 1
-ATI Mobility Radeon HD 2600 .*ATI.*(Mobility|MOBILITY).*HD *26.* 3 1
-ATI Mobility Radeon HD 2700 .*ATI.*(Mobility|MOBILITY).*HD *27.* 3 1
-ATI Mobility Radeon HD 3100 .*ATI.*(Mobility|MOBILITY).*HD *31.* 0 1
-ATI Mobility Radeon HD 3200 .*ATI.*(Mobility|MOBILITY).*HD *32.* 0 1
-ATI Mobility Radeon HD 3400 .*ATI.*(Mobility|MOBILITY).*HD *34.* 2 1
-ATI Mobility Radeon HD 3600 .*ATI.*(Mobility|MOBILITY).*HD *36.* 3 1
-ATI Mobility Radeon HD 3800 .*ATI.*(Mobility|MOBILITY).*HD *38.* 3 1
-ATI Mobility Radeon HD 4200 .*ATI.*(Mobility|MOBILITY).*HD *42.* 2 1
-ATI Mobility Radeon HD 4300 .*ATI.*(Mobility|MOBILITY).*HD *43.* 2 1
-ATI Mobility Radeon HD 4500 .*ATI.*(Mobility|MOBILITY).*HD *45.* 3 1
-ATI Mobility Radeon HD 4600 .*ATI.*(Mobility|MOBILITY).*HD *46.* 3 1
-ATI Mobility Radeon HD 4800 .*ATI.*(Mobility|MOBILITY).*HD *48.* 3 1
-ATI Mobility Radeon HD 5100 .*ATI.*(Mobility|MOBILITY).*HD *51.* 2 1
-ATI Mobility Radeon HD 5300 .*ATI.*(Mobility|MOBILITY).*HD *53.* 2 1
-ATI Mobility Radeon HD 5400 .*ATI.*(Mobility|MOBILITY).*HD *54.* 2 1
-ATI Mobility Radeon HD 5500 .*ATI.*(Mobility|MOBILITY).*HD *55.* 2 1
-ATI Mobility Radeon HD 5600 .*ATI.*(Mobility|MOBILITY).*HD *56.* 2 1
-ATI Mobility Radeon HD 5700 .*ATI.*(Mobility|MOBILITY).*HD *57.* 3 1
-ATI Mobility Radeon HD 6200 .*ATI.*(Mobility|MOBILITY).*HD *62.* 2 1
-ATI Mobility Radeon HD 6300 .*ATI.*(Mobility|MOBILITY).*HD *63.* 2 1
-ATI Mobility Radeon HD 6400M .*ATI.*(Mobility|MOBILITY).*HD *64.* 3 1
-ATI Mobility Radeon HD 6500M .*ATI.*(Mobility|MOBILITY).*HD *65.* 3 1
-ATI Mobility Radeon HD 6600M .*ATI.*(Mobility|MOBILITY).*HD *66.* 3 1
-ATI Mobility Radeon HD 6700M .*ATI.*(Mobility|MOBILITY).*HD *67.* 3 1
-ATI Mobility Radeon HD 6800M .*ATI.*(Mobility|MOBILITY).*HD *68.* 3 1
-ATI Mobility Radeon HD 6900M .*ATI.*(Mobility|MOBILITY).*HD *69.* 3 1
-ATI Mobility Radeon X1xxx .*ATI.*(Mobility|MOBILITY).*X1.* 0 1
-ATI Mobility Radeon X2xxx .*ATI.*(Mobility|MOBILITY).*X2.* 0 1
-ATI Mobility Radeon X3xx .*ATI.*(Mobility|MOBILITY).*X3.* 1 1
-ATI Mobility Radeon X6xx .*ATI.*(Mobility|MOBILITY).*X6.* 1 1
-ATI Mobility Radeon X7xx .*ATI.*(Mobility|MOBILITY).*X7.* 1 1
-ATI Mobility Radeon Xxxx .*ATI.*(Mobility|MOBILITY).*X.* 0 1
-ATI Mobility Radeon .*ATI.*(Mobility|MOBILITY).* 0 1
-ATI Radeon HD 2300 .*ATI.*(Radeon|RADEON) HD *23.* 0 1
-ATI Radeon HD 2400 .*ATI.*(Radeon|RADEON) HD *24.* 1 1
-ATI Radeon HD 2600 .*ATI.*(Radeon|RADEON) HD *26.* 2 1
-ATI Radeon HD 2900 .*ATI.*(Radeon|RADEON) HD *29.* 3 1
-ATI Radeon HD 3000 .*ATI.*(Radeon|RADEON) HD *30.* 0 1
-ATI Radeon HD 3100 .*ATI.*(Radeon|RADEON) HD *31.* 1 1
-ATI Radeon HD 3200 .*ATI.*(Radeon|RADEON) HD *32.* 0 1
-ATI Radeon HD 3300 .*ATI.*(Radeon|RADEON) HD *33.* 1 1
-ATI Radeon HD 3400 .*ATI.*(Radeon|RADEON) HD *34.* 1 1
-ATI Radeon HD 3500 .*ATI.*(Radeon|RADEON) HD *35.* 1 1
-ATI Radeon HD 3600 .*ATI.*(Radeon|RADEON) HD *36.* 3 1
-ATI Radeon HD 3700 .*ATI.*(Radeon|RADEON) HD *37.* 3 1
-ATI Radeon HD 3800 .*ATI.*(Radeon|RADEON) HD *38.* 3 1
-ATI Radeon HD 4200 .*ATI.*(Radeon|RADEON) HD *42.* 1 1
-ATI Radeon HD 4300 .*ATI.*(Radeon|RADEON) HD *43.* 1 1
-ATI Radeon HD 4400 .*ATI.*(Radeon|RADEON) HD *44.* 1 1
-ATI Radeon HD 4500 .*ATI.*(Radeon|RADEON) HD *45.* 3 1
-ATI Radeon HD 4600 .*ATI.*(Radeon|RADEON) HD *46.* 3 1
-ATI Radeon HD 4700 .*ATI.*(Radeon|RADEON) HD *47.* 3 1
-ATI Radeon HD 4800 .*ATI.*(Radeon|RADEON) HD *48.* 3 1
-ATI Radeon HD 5400 .*ATI.*(Radeon|RADEON) HD *54.* 3 1
-ATI Radeon HD 5500 .*ATI.*(Radeon|RADEON) HD *55.* 3 1
-ATI Radeon HD 5600 .*ATI.*(Radeon|RADEON) HD *56.* 3 1
-ATI Radeon HD 5700 .*ATI.*(Radeon|RADEON) HD *57.* 3 1
-ATI Radeon HD 5800 .*ATI.*(Radeon|RADEON) HD *58.* 3 1
-ATI Radeon HD 5900 .*ATI.*(Radeon|RADEON) HD *59.* 3 1
-ATI Radeon HD 6200 .*ATI.*(Radeon|RADEON) HD *62.* 2 1
-ATI Radeon HD 6300 .*ATI.*(Radeon|RADEON) HD *63.* 2 1
-ATI Radeon HD 6400 .*ATI.*(Radeon|RADEON) HD *64.* 3 1
-ATI Radeon HD 6500 .*ATI.*(Radeon|RADEON) HD *65.* 3 1
-ATI Radeon HD 66xx .*ATI.*(Radeon|RADEON) HD *66.* 3 1
-ATI Radeon HD 6700 .*ATI.*(Radeon|RADEON) HD *67.* 3 1
-ATI Radeon HD 6800 .*ATI.*(Radeon|RADEON) HD *68.* 3 1
-ATI Radeon HD 6900 .*ATI.*(Radeon|RADEON) HD *69.* 3 1
-ATI Radeon OpenGL .*ATI.*(Radeon|RADEON) OpenGL.* 0 0
-ATI Radeon 2100 .*ATI.*(Radeon|RADEON) 21.* 0 1
-ATI Radeon 3000 .*ATI.*(Radeon|RADEON) 30.* 0 1
-ATI Radeon 3100 .*ATI.*(Radeon|RADEON) 31.* 1 1
-ATI Radeon 5xxx .*ATI.*(Radeon|RADEON) 5.* 3 1
-ATI Radeon 7xxx .*ATI.*(Radeon|RADEON) 7.* 0 1
-ATI Radeon 8xxx .*ATI.*(Radeon|RADEON) 8.* 0 1
-ATI Radeon 9000 .*ATI.*(Radeon|RADEON) 90.* 0 1
-ATI Radeon 9100 .*ATI.*(Radeon|RADEON) 91.* 0 1
-ATI Radeon 9200 .*ATI.*(Radeon|RADEON) 92.* 0 1
-ATI Radeon 9500 .*ATI.*(Radeon|RADEON) 95.* 0 1
-ATI Radeon 9600 .*ATI.*(Radeon|RADEON) 96.* 0 1
-ATI Radeon 9700 .*ATI.*(Radeon|RADEON) 97.* 1 1
-ATI Radeon 9800 .*ATI.*(Radeon|RADEON) 98.* 1 1
+ATI Radeon HD 64xx .*ATI.*AMD Radeon.* HD [67]4..[MG] 3 1
+ATI Radeon HD 65xx .*ATI.*AMD Radeon.* HD [67]5..[MG] 3 1
+ATI Radeon HD 66xx .*ATI.*AMD Radeon.* HD [67]6..[MG] 3 1
+ATI Mobility Radeon 4100 .*ATI.*Mobility.*41.. 1 1
+ATI Mobility Radeon 7xxx .*ATI.*Mobility.*Radeon 7.* 0 1
+ATI Mobility Radeon 8xxx .*ATI.*Mobility.*Radeon 8.* 0 1
+ATI Mobility Radeon 9800 .*ATI.*Mobility.*98.* 1 1
+ATI Mobility Radeon 9700 .*ATI.*Mobility.*97.* 1 1
+ATI Mobility Radeon 9600 .*ATI.*Mobility.*96.* 0 1
+ATI Mobility Radeon HD 530v .*ATI.*Mobility.*HD *530v.* 1 1
+ATI Mobility Radeon HD 540v .*ATI.*Mobility.*HD *540v.* 2 1
+ATI Mobility Radeon HD 545v .*ATI.*Mobility.*HD *545v.* 2 1
+ATI Mobility Radeon HD 550v .*ATI.*Mobility.*HD *550v.* 2 1
+ATI Mobility Radeon HD 560v .*ATI.*Mobility.*HD *560v.* 2 1
+ATI Mobility Radeon HD 565v .*ATI.*Mobility.*HD *565v.* 2 1
+ATI Mobility Radeon HD 2300 .*ATI.*Mobility.*HD *23.* 2 1
+ATI Mobility Radeon HD 2400 .*ATI.*Mobility.*HD *24.* 2 1
+ATI Mobility Radeon HD 2600 .*ATI.*Mobility.*HD *26.* 3 1
+ATI Mobility Radeon HD 2700 .*ATI.*Mobility.*HD *27.* 3 1
+ATI Mobility Radeon HD 3100 .*ATI.*Mobility.*HD *31.* 0 1
+ATI Mobility Radeon HD 3200 .*ATI.*Mobility.*HD *32.* 0 1
+ATI Mobility Radeon HD 3400 .*ATI.*Mobility.*HD *34.* 2 1
+ATI Mobility Radeon HD 3600 .*ATI.*Mobility.*HD *36.* 3 1
+ATI Mobility Radeon HD 3800 .*ATI.*Mobility.*HD *38.* 3 1
+ATI Mobility Radeon HD 4200 .*ATI.*Mobility.*HD *42.* 2 1
+ATI Mobility Radeon HD 4300 .*ATI.*Mobility.*HD *43.* 2 1
+ATI Mobility Radeon HD 4500 .*ATI.*Mobility.*HD *45.* 3 1
+ATI Mobility Radeon HD 4600 .*ATI.*Mobility.*HD *46.* 3 1
+ATI Mobility Radeon HD 4800 .*ATI.*Mobility.*HD *48.* 3 1
+ATI Mobility Radeon HD 5100 .*ATI.*Mobility.*HD *51.* 3 1
+ATI Mobility Radeon HD 5300 .*ATI.*Mobility.*HD *53.* 3 1
+ATI Mobility Radeon HD 5400 .*ATI.*Mobility.*HD *54.* 3 1
+ATI Mobility Radeon HD 5500 .*ATI.*Mobility.*HD *55.* 3 1
+ATI Mobility Radeon HD 5600 .*ATI.*Mobility.*HD *56.* 3 1
+ATI Mobility Radeon HD 5700 .*ATI.*Mobility.*HD *57.* 3 1
+ATI Mobility Radeon HD 6200 .*ATI.*Mobility.*HD *62.* 3 1
+ATI Mobility Radeon HD 6300 .*ATI.*Mobility.*HD *63.* 3 1
+ATI Mobility Radeon HD 6400M .*ATI.*Mobility.*HD *64.* 3 1
+ATI Mobility Radeon HD 6500M .*ATI.*Mobility.*HD *65.* 3 1
+ATI Mobility Radeon HD 6600M .*ATI.*Mobility.*HD *66.* 3 1
+ATI Mobility Radeon HD 6700M .*ATI.*Mobility.*HD *67.* 3 1
+ATI Mobility Radeon HD 6800M .*ATI.*Mobility.*HD *68.* 3 1
+ATI Mobility Radeon HD 6900M .*ATI.*Mobility.*HD *69.* 3 1
+ATI Radeon HD 2300 .*ATI.*Radeon HD *23.. 2 1
+ATI Radeon HD 2400 .*ATI.*Radeon HD *24.. 2 1
+ATI Radeon HD 2600 .*ATI.*Radeon HD *26.. 2 1
+ATI Radeon HD 2900 .*ATI.*Radeon HD *29.. 3 1
+ATI Radeon HD 3000 .*ATI.*Radeon HD *30.. 0 1
+ATI Radeon HD 3100 .*ATI.*Radeon HD *31.. 1 1
+ATI Radeon HD 3200 .*ATI.*Radeon HD *32.. 1 1
+ATI Radeon HD 3300 .*ATI.*Radeon HD *33.. 2 1
+ATI Radeon HD 3400 .*ATI.*Radeon HD *34.. 2 1
+ATI Radeon HD 3500 .*ATI.*Radeon HD *35.. 2 1
+ATI Radeon HD 3600 .*ATI.*Radeon HD *36.. 3 1
+ATI Radeon HD 3700 .*ATI.*Radeon HD *37.. 3 1
+ATI Radeon HD 3800 .*ATI.*Radeon HD *38.. 3 1
+ATI Radeon HD 4100 .*ATI.*Radeon HD *41.. 1 1
+ATI Radeon HD 4200 .*ATI.*Radeon HD *42.. 1 1
+ATI Radeon HD 4300 .*ATI.*Radeon HD *43.. 2 1
+ATI Radeon HD 4400 .*ATI.*Radeon HD *44.. 2 1
+ATI Radeon HD 4500 .*ATI.*Radeon HD *45.. 3 1
+ATI Radeon HD 4600 .*ATI.*Radeon HD *46.. 3 1
+ATI Radeon HD 4700 .*ATI.*Radeon HD *47.. 3 1
+ATI Radeon HD 4800 .*ATI.*Radeon HD *48.. 3 1
+ATI Radeon HD 5400 .*ATI.*Radeon HD *54.. 3 1
+ATI Radeon HD 5500 .*ATI.*Radeon HD *55.. 3 1
+ATI Radeon HD 5600 .*ATI.*Radeon HD *56.. 3 1
+ATI Radeon HD 5700 .*ATI.*Radeon HD *57.. 3 1
+ATI Radeon HD 5800 .*ATI.*Radeon HD *58.. 3 1
+ATI Radeon HD 5900 .*ATI.*Radeon HD *59.. 3 1
+ATI Radeon HD 6200 .*ATI.*Radeon HD *62.. 3 1
+ATI Radeon HD 6300 .*ATI.*Radeon HD *63.. 3 1
+ATI Radeon HD 6400 .*ATI.*Radeon HD *64.. 3 1
+ATI Radeon HD 6500 .*ATI.*Radeon HD *65.. 3 1
+ATI Radeon HD 6600 .*ATI.*Radeon HD *66.. 3 1
+ATI Radeon HD 6700 .*ATI.*Radeon HD *67.. 3 1
+ATI Radeon HD 6800 .*ATI.*Radeon HD *68.. 3 1
+ATI Radeon HD 6900 .*ATI.*Radeon HD *69.. 3 1
+ATI Radeon OpenGL .*ATI.*Radeon OpenGL.* 0 0
+ATI Radeon 2100 .*ATI.*Radeon 21.. 0 1
+ATI Radeon 3000 .*ATI.*Radeon 30.. 0 1
+ATI Radeon 3100 .*ATI.*Radeon 31.. 1 1
+ATI Radeon 5xxx .*ATI.*Radeon 5... 3 1
+ATI Radeon 7xxx .*ATI.*Radeon 7... 0 1
+ATI Radeon 8xxx .*ATI.*Radeon 8... 0 1
+ATI Radeon 9000 .*ATI.*Radeon 90.. 0 1
+ATI Radeon 9100 .*ATI.*Radeon 91.. 0 1
+ATI Radeon 9200 .*ATI.*Radeon 92.. 0 1
+ATI Radeon 9500 .*ATI.*Radeon 95.. 0 1
+ATI Radeon 9600 .*ATI.*Radeon 96.. 0 1
+ATI Radeon 9700 .*ATI.*Radeon 97.. 1 1
+ATI Radeon 9800 .*ATI.*Radeon 98.. 1 1
ATI Radeon RV250 .*ATI.*RV250.* 0 1
ATI Radeon RV600 .*ATI.*RV6.* 1 1
ATI Radeon RX700 .*ATI.*RX70.* 1 1
-ATI Radeon RX800 .*ATI.*(Radeon|RADEON) *RX80.* 2 1
+ATI Radeon RX800 .*ATI.*Radeon *RX80.* 2 1
ATI RS880M .*ATI.*RS880M 1 1
ATI Radeon RX9550 .*ATI.*RX9550.* 1 1
-ATI Radeon VE .*ATI.*(Radeon|RADEON).*VE.* 0 0
-ATI Radeon X1000 .*ATI.*(Radeon|RADEON) *X10.* 0 1
-ATI Radeon X1200 .*ATI.*(Radeon|RADEON) *X12.* 0 1
-ATI Radeon X1300 .*ATI.*(Radeon|RADEON) *X13.* 1 1
-ATI Radeon X1400 .*ATI.*(Radeon|RADEON) *X14.* 1 1
-ATI Radeon X1500 .*ATI.*(Radeon|RADEON) *X15.* 1 1
-ATI Radeon X1600 .*ATI.*(Radeon|RADEON) *X16.* 1 1
-ATI Radeon X1700 .*ATI.*(Radeon|RADEON) *X17.* 1 1
-ATI Radeon X1800 .*ATI.*(Radeon|RADEON) *X18.* 3 1
-ATI Radeon X1900 .*ATI.*(Radeon|RADEON) *X19.* 3 1
-ATI Radeon X300 .*ATI.*(Radeon|RADEON) *X3.* 0 1
-ATI Radeon X400 .*ATI.*(Radeon|RADEON) X4.* 0 1
-ATI Radeon X500 .*ATI.*(Radeon|RADEON) X5.* 0 1
-ATI Radeon X600 .*ATI.*(Radeon|RADEON) X6.* 1 1
-ATI Radeon X700 .*ATI.*(Radeon|RADEON) X7.* 1 1
-ATI Radeon X800 .*ATI.*(Radeon|RADEON) X8.* 2 1
-ATI Radeon X900 .*ATI.*(Radeon|RADEON) X9.* 2 1
-ATI Radeon Xpress .*ATI.*(Radeon|RADEON) (Xpress|XPRESS).* 0 1
+ATI Radeon VE .*ATI.*Radeon.*VE.* 0 0
+ATI Radeon X300 .*ATI.*Radeon *X3.* 0 1
+ATI Radeon X400 .*ATI.*Radeon ?X4.* 0 1
+ATI Radeon X500 .*ATI.*Radeon ?X5.* 0 1
+ATI Radeon X600 .*ATI.*Radeon ?X6.* 1 1
+ATI Radeon X700 .*ATI.*Radeon ?X7.* 1 1
+ATI Radeon X800 .*ATI.*Radeon ?X8.* 2 1
+ATI Radeon X900 .*ATI.*Radeon ?X9.* 2 1
+ATI Radeon Xpress .*ATI.*Radeon Xpress.* 0 1
ATI Rage 128 .*ATI.*Rage 128.* 0 1
-ATI R350 (9800) .*(ATI)?.*R350.* 1 1
-ATI R580 (X1900) .*(ATI)?.*R580.* 3 1
-ATI RC410 (Xpress 200) .*(ATI)?.*RC410.* 0 0
-ATI RS48x (Xpress 200x) .*(ATI)?.*RS48.* 0 0
-ATI RS600 (Xpress 3200) .*(ATI)?.*RS600.* 0 0
-ATI RV350 (9600) .*(ATI)?.*RV350.* 0 1
-ATI RV370 (X300) .*(ATI)?.*RV370.* 0 1
-ATI RV410 (X700) .*(ATI)?.*RV410.* 1 1
-ATI RV515 .*(ATI)?.*RV515.* 1 1
-ATI RV570 (X1900 GT/PRO) .*(ATI)?.*RV570.* 3 1
-ATI RV380 .*(ATI)?.*RV380.* 0 1
-ATI RV530 .*(ATI)?.*RV530.* 1 1
-ATI RX480 (Xpress 200P) .*(ATI)?.*RX480.* 0 1
-ATI RX700 .*(ATI)?.*RX700.* 1 1
-AMD ANTILLES (HD 6990) .*(AMD|ATI).*(Antilles|ANTILLES).* 3 1
-AMD BARTS (HD 6800) .*(AMD|ATI).*(Barts|BARTS).* 3 1
-AMD CAICOS (HD 6400) .*(AMD|ATI).*(Caicos|CAICOS).* 3 1
+ATI R350 (9800) .*R350.* 1 1
+ATI R580 (X1900) .*R580.* 3 1
+ATI RC410 (Xpress 200) .*RC410.* 0 0
+ATI RS48x (Xpress 200x) .*RS48.* 0 0
+ATI RS600 (Xpress 3200) .*RS600.* 0 0
+ATI RV350 (9600) .*RV350.* 0 1
+ATI RV370 (X300) .*RV370.* 0 1
+ATI RV410 (X700) .*RV410.* 1 1
+ATI RV515 .*RV515.* 1 1
+ATI RV570 (X1900 GT/PRO) .*RV570.* 3 1
+ATI RV380 .*RV380.* 0 1
+ATI RV530 .*RV530.* 1 1
+ATI RX480 (Xpress 200P) .*RX480.* 0 1
+ATI RX700 .*RX700.* 1 1
+AMD ANTILLES (HD 6990) .*(AMD|ATI).*Antilles.* 3 1
+AMD BARTS (HD 6800) .*(AMD|ATI).*Barts.* 3 1
+AMD CAICOS (HD 6400) .*(AMD|ATI).*Caicos.* 3 1
AMD CAYMAN (HD 6900) .*(AMD|ATI).*(Cayman|CAYMAM).* 3 1
-AMD CEDAR (HD 5450) .*(AMD|ATI).*(Cedar|CEDAR).* 2 1
-AMD CYPRESS (HD 5800) .*(AMD|ATI).*(Cypress|CYPRESS).* 3 1
-AMD HEMLOCK (HD 5970) .*(AMD|ATI).*(Hemlock|HEMLOCK).* 3 1
-AMD JUNIPER (HD 5700) .*(AMD|ATI).*(Juniper|JUNIPER).* 3 1
-AMD PARK .*(AMD|ATI).*(Park|PARK).* 3 1
-AMD REDWOOD (HD 5500/5600) .*(AMD|ATI).*(Redwood|REDWOOD).* 3 1
-AMD TURKS (HD 6500/6600) .*(AMD|ATI).*(Turks|TURKS).* 3 1
-AMD RS780 (HD 3200) .*(AMD|ATI)?.*RS780.* 0 1
-AMD RS880 (HD 4200) .*(AMD|ATI)?.*RS880.* 1 1
-AMD RV610 (HD 2400) .*(AMD|ATI)?.*RV610.* 1 1
-AMD RV620 (HD 3400) .*(AMD|ATI)?.*RV620.* 1 1
-AMD RV630 (HD 2600) .*(AMD|ATI)?.*RV630.* 2 1
-AMD RV635 (HD 3600) .*(AMD|ATI)?.*RV635.* 3 1
-AMD RV670 (HD 3800) .*(AMD|ATI)?.*RV670.* 3 1
-AMD R680 (HD 3870 X2) .*(AMD|ATI)?.*R680.* 3 1
-AMD R700 (HD 4800 X2) .*(AMD|ATI)?.*R700.* 3 1
-AMD RV710 (HD 4300) .*(AMD|ATI)?.*RV710.* 1 1
-AMD RV730 (HD 4600) .*(AMD|ATI)?.*RV730.* 3 1
-AMD RV740 (HD 4700) .*(AMD|ATI)?.*RV740.* 3 1
-AMD RV770 (HD 4800) .*(AMD|ATI)?.*RV770.* 3 1
-AMD RV790 (HD 4800) .*(AMD|ATI)?.*RV790.* 3 1
+AMD CEDAR (HD 5450) .*(AMD|ATI).*Cedar.* 2 1
+AMD CYPRESS (HD 5800) .*(AMD|ATI).*Cypress.* 3 1
+AMD HEMLOCK (HD 5970) .*(AMD|ATI).*Hemlock.* 3 1
+AMD JUNIPER (HD 5700) .*(AMD|ATI).*Juniper.* 3 1
+AMD PARK .*(AMD|ATI).*Park.* 3 1
+AMD REDWOOD (HD 5500/5600) .*(AMD|ATI).*Redwood.* 3 1
+AMD TURKS (HD 6500/6600) .*(AMD|ATI).*Turks.* 3 1
+AMD RS780 (HD 3200) .*RS780.* 0 1
+AMD RS880 (HD 4200) .*RS880.* 1 1
+AMD RV610 (HD 2400) .*RV610.* 1 1
+AMD RV620 (HD 3400) .*RV620.* 1 1
+AMD RV630 (HD 2600) .*RV630.* 2 1
+AMD RV635 (HD 3600) .*RV635.* 3 1
+AMD RV670 (HD 3800) .*RV670.* 3 1
+AMD R680 (HD 3870 X2) .*R680.* 3 1
+AMD R700 (HD 4800 X2) .*R700.* 3 1
+AMD RV710 (HD 4300) .*RV710.* 1 1
+AMD RV730 (HD 4600) .*RV730.* 3 1
+AMD RV740 (HD 4700) .*RV740.* 3 1
+AMD RV770 (HD 4800) .*RV770.* 3 1
+AMD RV790 (HD 4800) .*RV790.* 3 1
ATI 760G/Radeon 3000 .*ATI.*AMD 760G.* 1 1
ATI 780L/Radeon 3000 .*ATI.*AMD 780L.* 1 1
-ATI Radeon DDR .*ATI.*(Radeon|RADEON) ?DDR.* 0 1
+ATI Radeon DDR .*ATI.*Radeon ?DDR.* 0 1
ATI FirePro 2000 .*ATI.*FirePro 2.* 1 1
ATI FirePro 3000 .*ATI.*FirePro V3.* 1 1
ATI FirePro 4000 .*ATI.*FirePro V4.* 2 1
@@ -255,8 +255,8 @@ ATI FirePro 7000 .*ATI.*FirePro V7.* 3 1
ATI FirePro M .*ATI.*FirePro M.* 3 1
ATI Technologies .*ATI *Technologies.* 0 1
// This entry is last to work around the "R300" driver problem.
-ATI R300 (9700) .*(ATI)?.*R300.* 1 1
-ATI Radeon .*ATI.*Radeon.* 0 1
+ATI R300 (9700) .*R300.* 1 1
+ATI Radeon .*ATI.*(Diamond|Radeon).* 0 1
Intel X3100 .*Intel.*X3100.* 0 1
Intel 830M .*Intel.*830M 0 0
Intel 845G .*Intel.*845G 0 0
@@ -273,13 +273,13 @@ Intel G33 .*Intel.*G33.* 0 0
Intel G41 .*Intel.*G41.* 0 1
Intel G45 .*Intel.*G45.* 0 1
Intel Bear Lake .*Intel.*Bear Lake.* 0 0
-Intel Broadwater .*Intel.*Broadwater.* 0 0
+Intel Broadwater .*Intel.*Broadwater.* 0 0
Intel Brookdale .*Intel.*Brookdale.* 0 0
Intel Cantiga .*Intel.*Cantiga.* 0 0
Intel Eaglelake .*Intel.*Eaglelake.* 0 1
Intel Graphics Media HD .*Intel.*Graphics Media.*HD.* 0 1
Intel HD Graphics .*Intel.*HD Graphics.* 2 1
-Intel Mobile 4 Series .*Intel.*Mobile *4 Series.* 0 1
+Intel Mobile 4 Series .*Intel.*Mobile.* 4 Series.* 0 1
Intel Media Graphics HD .*Intel.*Media Graphics HD.* 0 1
Intel Montara .*Intel.*Montara.* 0 0
Intel Pineview .*Intel.*Pineview.* 0 1
@@ -288,204 +288,219 @@ Intel HD Graphics 2000 .*Intel.*HD2000.* 1 1
Intel HD Graphics 3000 .*Intel.*HD3000.* 2 1
Matrox .*Matrox.* 0 0
Mesa .*Mesa.* 0 0
-NVIDIA 205 .*NVIDIA.*GeForce 205.* 2 1
-NVIDIA 210 .*NVIDIA.*GeForce 210.* 2 1
-NVIDIA 310M .*NVIDIA.*GeForce 310M.* 1 1
-NVIDIA 310 .*NVIDIA.*GeForce 310.* 3 1
-NVIDIA 315M .*NVIDIA.*GeForce 315M.* 2 1
-NVIDIA 315 .*NVIDIA.*GeForce 315.* 3 1
-NVIDIA 320M .*NVIDIA.*GeForce 320M.* 2 1
-NVIDIA G100M .*NVIDIA *(GeForce)? *(G)? ?100M.* 0 1
-NVIDIA G100 .*NVIDIA *(GeForce)? *(G)? ?100.* 0 1
-NVIDIA G102M .*NVIDIA *(GeForce)? *(G)? ?102M.* 0 1
-NVIDIA G103M .*NVIDIA *(GeForce)? *(G)? ?103M.* 0 1
-NVIDIA G105M .*NVIDIA *(GeForce)? *(G)? ?105M.* 0 1
-NVIDIA G 110M .*NVIDIA *(GeForce)? *(G)? ?110M.* 0 1
-NVIDIA G 120M .*NVIDIA *(GeForce)? *(G)? ?120M.* 1 1
-NVIDIA G 200 .*NVIDIA *(GeForce)? *(G)? ?200(M)?.* 0 1
-NVIDIA G 205M .*NVIDIA *(GeForce)? *(G)? ?205(M)?.* 0 1
-NVIDIA G 210 .*NVIDIA *(GeForce)? *(G)? ?210(M)?.* 1 1
-NVIDIA 305M .*NVIDIA *(GeForce)? *(G)? ?305(M)?.* 1 1
-NVIDIA G 310M .*NVIDIA *(GeForce)? *(G)? ?310(M)?.* 2 1
-NVIDIA G 315 .*NVIDIA *(GeForce)? *(G)? ?315(M)?.* 2 1
-NVIDIA G 320M .*NVIDIA *(GeForce)? *(G)? ?320(M)?.* 2 1
-NVIDIA G 405 .*NVIDIA *(GeForce)? *(G)? ?405(M)?.* 1 1
-NVIDIA G 410M .*NVIDIA *(GeForce)? *(G)? ?410(M)?.* 1 1
-NVIDIA GT 120M .*NVIDIA.*(GeForce)? *GT *120(M)?.* 2 1
-NVIDIA GT 120 .*NVIDIA.*GT.*120 2 1
-NVIDIA GT 130M .*NVIDIA.*(GeForce)? *GT *130(M)?.* 2 1
-NVIDIA GT 140M .*NVIDIA.*(GeForce)? *GT *140(M)?.* 2 1
-NVIDIA GT 150M .*NVIDIA.*(GeForce)? *GT(S)? *150(M)?.* 2 1
-NVIDIA GT 160M .*NVIDIA.*(GeForce)? *GT *160(M)?.* 2 1
-NVIDIA GT 220M .*NVIDIA.*(GeForce)? *GT *220(M)?.* 2 1
-NVIDIA GT 230M .*NVIDIA.*(GeForce)? *GT *230(M)?.* 2 1
-NVIDIA GT 240M .*NVIDIA.*(GeForce)? *GT *240(M)?.* 2 1
-NVIDIA GT 250M .*NVIDIA.*(GeForce)? *GT *250(M)?.* 2 1
-NVIDIA GT 260M .*NVIDIA.*(GeForce)? *GT *260(M)?.* 2 1
-NVIDIA GT 320M .*NVIDIA.*(GeForce)? *GT *320(M)?.* 2 1
-NVIDIA GT 325M .*NVIDIA.*(GeForce)? *GT *325(M)?.* 0 1
-NVIDIA GT 330M .*NVIDIA.*(GeForce)? *GT *330(M)?.* 3 1
-NVIDIA GT 335M .*NVIDIA.*(GeForce)? *GT *335(M)?.* 1 1
-NVIDIA GT 340M .*NVIDIA.*(GeForce)? *GT *340(M)?.* 2 1
-NVIDIA GT 415M .*NVIDIA.*(GeForce)? *GT *415(M)?.* 2 1
-NVIDIA GT 420M .*NVIDIA.*(GeForce)? *GT *420(M)?.* 2 1
-NVIDIA GT 425M .*NVIDIA.*(GeForce)? *GT *425(M)?.* 3 1
-NVIDIA GT 430M .*NVIDIA.*(GeForce)? *GT *430(M)?.* 3 1
-NVIDIA GT 435M .*NVIDIA.*(GeForce)? *GT *435(M)?.* 3 1
-NVIDIA GT 440M .*NVIDIA.*(GeForce)? *GT *440(M)?.* 3 1
-NVIDIA GT 445M .*NVIDIA.*(GeForce)? *GT *445(M)?.* 3 1
-NVIDIA GT 450M .*NVIDIA.*(GeForce)? *GT *450(M)?.* 3 1
-NVIDIA GT 520M .*NVIDIA.*(GeForce)? *GT *520(M)?.* 3 1
-NVIDIA GT 525M .*NVIDIA.*(GeForce)? *GT *525(M)?.* 3 1
-NVIDIA GT 540M .*NVIDIA.*(GeForce)? *GT *540(M)?.* 3 1
-NVIDIA GT 550M .*NVIDIA.*(GeForce)? *GT *550(M)?.* 3 1
-NVIDIA GT 555M .*NVIDIA.*(GeForce)? *GT *555(M)?.* 3 1
-NVIDIA GTS 160M .*NVIDIA.*(GeForce)? *GT(S)? *160(M)?.* 2 1
-NVIDIA GTS 240 .*NVIDIA.*(GeForce)? *GTS *24.* 3 1
-NVIDIA GTS 250 .*NVIDIA.*(GeForce)? *GTS *25.* 3 1
-NVIDIA GTS 350M .*NVIDIA.*(GeForce)? *GTS *350M.* 3 1
-NVIDIA GTS 360M .*NVIDIA.*(GeForce)? *GTS *360M.* 3 1
-NVIDIA GTS 360 .*NVIDIA.*(GeForce)? *GTS *360.* 3 1
-NVIDIA GTS 450 .*NVIDIA.*(GeForce)? *GTS *45.* 3 1
-NVIDIA GTX 260 .*NVIDIA.*(GeForce)? *GTX *26.* 3 1
-NVIDIA GTX 275 .*NVIDIA.*(GeForce)? *GTX *275.* 3 1
-NVIDIA GTX 270 .*NVIDIA.*(GeForce)? *GTX *27.* 3 1
-NVIDIA GTX 285 .*NVIDIA.*(GeForce)? *GTX *285.* 3 1
-NVIDIA GTX 280 .*NVIDIA.*(GeForce)? *GTX *280.* 3 1
-NVIDIA GTX 290 .*NVIDIA.*(GeForce)? *GTX *290.* 3 1
-NVIDIA GTX 295 .*NVIDIA.*(GeForce)? *GTX *295.* 3 1
-NVIDIA GTX 460M .*NVIDIA.*(GeForce)? *GTX *460M.* 3 1
-NVIDIA GTX 465 .*NVIDIA.*(GeForce)? *GTX *465.* 3 1
-NVIDIA GTX 460 .*NVIDIA.*(GeForce)? *GTX *46.* 3 1
-NVIDIA GTX 470M .*NVIDIA.*(GeForce)? *GTX *470M.* 3 1
-NVIDIA GTX 470 .*NVIDIA.*(GeForce)? *GTX *47.* 3 1
-NVIDIA GTX 480M .*NVIDIA.*(GeForce)? *GTX *480M.* 3 1
-NVIDIA GTX 485M .*NVIDIA.*(GeForce)? *GTX *485M.* 3 1
-NVIDIA GTX 480 .*NVIDIA.*(GeForce)? *GTX *48.* 3 1
-NVIDIA GTX 530 .*NVIDIA.*(GeForce)? *GTX *53.* 3 1
-NVIDIA GTX 550 .*NVIDIA.*(GeForce)? *GTX *55.* 3 1
-NVIDIA GTX 560 .*NVIDIA.*(GeForce)? *GTX *56.* 3 1
-NVIDIA GTX 570 .*NVIDIA.*(GeForce)? *GTX *57.* 3 1
-NVIDIA GTX 580M .*NVIDIA.*(GeForce)? *GTX *580M.* 3 1
-NVIDIA GTX 580 .*NVIDIA.*(GeForce)? *GTX *58.* 3 1
-NVIDIA GTX 590 .*NVIDIA.*(GeForce)? *GTX *59.* 3 1
-NVIDIA C51 .*NVIDIA.*(GeForce)? *C51.* 0 1
-NVIDIA G72 .*NVIDIA.*(GeForce)? *G72.* 1 1
-NVIDIA G73 .*NVIDIA.*(GeForce)? *G73.* 1 1
-NVIDIA G84 .*NVIDIA.*(GeForce)? *G84.* 2 1
-NVIDIA G86 .*NVIDIA.*(GeForce)? *G86.* 3 1
-NVIDIA G92 .*NVIDIA.*(GeForce)? *G92.* 3 1
+NVIDIA 205 .*NVIDIA .*GeForce 205.* 2 1
+NVIDIA 210 .*NVIDIA .*GeForce 210.* 2 1
+NVIDIA 310M .*NVIDIA .*GeForce 310M.* 1 1
+NVIDIA 310 .*NVIDIA .*GeForce 310.* 3 1
+NVIDIA 315M .*NVIDIA .*GeForce 315M.* 2 1
+NVIDIA 315 .*NVIDIA .*GeForce 315.* 3 1
+NVIDIA 320M .*NVIDIA .*GeForce 320M.* 2 1
+NVIDIA G100M .*NVIDIA .*100M.* 0 1
+NVIDIA G100 .*NVIDIA .*100.* 0 1
+NVIDIA G102M .*NVIDIA .*102M.* 0 1
+NVIDIA G103M .*NVIDIA .*103M.* 0 1
+NVIDIA G105M .*NVIDIA .*105M.* 0 1
+NVIDIA G 110M .*NVIDIA .*110M.* 0 1
+NVIDIA G 120M .*NVIDIA .*120M.* 1 1
+NVIDIA G 200 .*NVIDIA .*200(M)?.* 0 1
+NVIDIA G 205M .*NVIDIA .*205(M)?.* 0 1
+NVIDIA G 210 .*NVIDIA .*210(M)?.* 1 1
+NVIDIA 305M .*NVIDIA .*305(M)?.* 1 1
+NVIDIA G 310M .*NVIDIA .*310(M)?.* 2 1
+NVIDIA G 315 .*NVIDIA .*315(M)?.* 2 1
+NVIDIA G 320M .*NVIDIA .*320(M)?.* 2 1
+NVIDIA G 405 .*NVIDIA .*405(M)?.* 1 1
+NVIDIA G 410M .*NVIDIA .*410(M)?.* 1 1
+NVIDIA GT 120M .*NVIDIA .*GT *120(M)?.* 2 1
+NVIDIA GT 120 .*NVIDIA .*GT.*120 2 1
+NVIDIA GT 130M .*NVIDIA .*GT *130(M)?.* 2 1
+NVIDIA GT 140M .*NVIDIA .*GT *140(M)?.* 2 1
+NVIDIA GT 150M .*NVIDIA .*GT(S)? *150(M)?.* 2 1
+NVIDIA GT 160M .*NVIDIA .*GT *160(M)?.* 2 1
+NVIDIA GT 220M .*NVIDIA .*GT *220(M)?.* 2 1
+NVIDIA GT 230M .*NVIDIA .*GT *230(M)?.* 2 1
+NVIDIA GT 240M .*NVIDIA .*GT *240(M)?.* 2 1
+NVIDIA GT 250M .*NVIDIA .*GT *250(M)?.* 2 1
+NVIDIA GT 260M .*NVIDIA .*GT *260(M)?.* 2 1
+NVIDIA GT 320M .*NVIDIA .*GT *320(M)?.* 2 1
+NVIDIA GT 325M .*NVIDIA .*GT *325(M)?.* 0 1
+NVIDIA GT 330M .*NVIDIA .*GT *330(M)?.* 3 1
+NVIDIA GT 335M .*NVIDIA .*GT *335(M)?.* 1 1
+NVIDIA GT 340M .*NVIDIA .*GT *340(M)?.* 2 1
+NVIDIA GT 415M .*NVIDIA .*GT *415(M)?.* 2 1
+NVIDIA GT 420M .*NVIDIA .*GT *420(M)?.* 2 1
+NVIDIA GT 425M .*NVIDIA .*GT *425(M)?.* 3 1
+NVIDIA GT 430M .*NVIDIA .*GT *430(M)?.* 3 1
+NVIDIA GT 435M .*NVIDIA .*GT *435(M)?.* 3 1
+NVIDIA GT 440M .*NVIDIA .*GT *440(M)?.* 3 1
+NVIDIA GT 445M .*NVIDIA .*GT *445(M)?.* 3 1
+NVIDIA GT 450M .*NVIDIA .*GT *450(M)?.* 3 1
+NVIDIA GT 520M .*NVIDIA .*GT *52.(M)?.* 3 1
+NVIDIA GT 530M .*NVIDIA .*GT *530(M)?.* 3 1
+NVIDIA GT 540M .*NVIDIA .*GT *54.(M)?.* 3 1
+NVIDIA GT 550M .*NVIDIA .*GT *550(M)?.* 3 1
+NVIDIA GT 555M .*NVIDIA .*GT *555(M)?.* 3 1
+NVIDIA GTS 160M .*NVIDIA .*GT(S)? *160(M)?.* 2 1
+NVIDIA GTS 240 .*NVIDIA .*GTS *24.* 3 1
+NVIDIA GTS 250 .*NVIDIA .*GTS *25.* 3 1
+NVIDIA GTS 350M .*NVIDIA .*GTS *350M.* 3 1
+NVIDIA GTS 360M .*NVIDIA .*GTS *360M.* 3 1
+NVIDIA GTS 360 .*NVIDIA .*GTS *360.* 3 1
+NVIDIA GTS 450 .*NVIDIA .*GTS *45.* 3 1
+NVIDIA GTX 260 .*NVIDIA .*GTX *26.* 3 1
+NVIDIA GTX 275 .*NVIDIA .*GTX *275.* 3 1
+NVIDIA GTX 270 .*NVIDIA .*GTX *27.* 3 1
+NVIDIA GTX 285 .*NVIDIA .*GTX *285.* 3 1
+NVIDIA GTX 280 .*NVIDIA .*GTX *280.* 3 1
+NVIDIA GTX 290 .*NVIDIA .*GTX *290.* 3 1
+NVIDIA GTX 295 .*NVIDIA .*GTX *295.* 3 1
+NVIDIA GTX 460M .*NVIDIA .*GTX *460M.* 3 1
+NVIDIA GTX 465 .*NVIDIA .*GTX *465.* 3 1
+NVIDIA GTX 460 .*NVIDIA .*GTX *46.* 3 1
+NVIDIA GTX 470M .*NVIDIA .*GTX *470M.* 3 1
+NVIDIA GTX 470 .*NVIDIA .*GTX *47.* 3 1
+NVIDIA GTX 480M .*NVIDIA .*GTX *480M.* 3 1
+NVIDIA GTX 485M .*NVIDIA .*GTX *485M.* 3 1
+NVIDIA GTX 480 .*NVIDIA .*GTX *48.* 3 1
+NVIDIA GTX 530 .*NVIDIA .*GTX *53.* 3 1
+NVIDIA GTX 550 .*NVIDIA .*GTX *55.* 3 1
+NVIDIA GTX 560 .*NVIDIA .*GTX *56.* 3 1
+NVIDIA GTX 570 .*NVIDIA .*GTX *57.* 3 1
+NVIDIA GTX 580M .*NVIDIA .*GTX *580M.* 3 1
+NVIDIA GTX 580 .*NVIDIA .*GTX *58.* 3 1
+NVIDIA GTX 590 .*NVIDIA .*GTX *59.* 3 1
+NVIDIA C51 .*NVIDIA .*C51.* 0 1
+NVIDIA G72 .*NVIDIA .*G72.* 1 1
+NVIDIA G73 .*NVIDIA .*G73.* 1 1
+NVIDIA G84 .*NVIDIA .*G84.* 2 1
+NVIDIA G86 .*NVIDIA .*G86.* 3 1
+NVIDIA G92 .*NVIDIA .*G92.* 3 1
NVIDIA GeForce .*GeForce 256.* 0 0
NVIDIA GeForce 2 .*GeForce ?2 ?.* 0 1
NVIDIA GeForce 3 .*GeForce ?3 ?.* 0 1
NVIDIA GeForce 3 Ti .*GeForce ?3 Ti.* 0 1
-NVIDIA GeForce 4 .*NVIDIA.*GeForce ?4.* 0 1
-NVIDIA GeForce 4 Go .*NVIDIA.*GeForce ?4.*Go.* 0 1
-NVIDIA GeForce 4 MX .*NVIDIA.*GeForce ?4 MX.* 0 1
-NVIDIA GeForce 4 PCX .*NVIDIA.*GeForce ?4 PCX.* 0 1
-NVIDIA GeForce 4 Ti .*NVIDIA.*GeForce ?4 Ti.* 0 1
-NVIDIA GeForce 6100 .*NVIDIA.*GeForce 61.* 0 1
-NVIDIA GeForce 6200 .*NVIDIA.*GeForce 62.* 0 1
-NVIDIA GeForce 6500 .*NVIDIA.*GeForce 65.* 0 1
-NVIDIA GeForce 6600 .*NVIDIA.*GeForce 66.* 1 1
-NVIDIA GeForce 6700 .*NVIDIA.*GeForce 67.* 2 1
-NVIDIA GeForce 6800 .*NVIDIA.*GeForce 68.* 2 1
-NVIDIA GeForce 7000 .*NVIDIA.*GeForce 70.* 0 1
-NVIDIA GeForce 7100 .*NVIDIA.*GeForce 71.* 0 1
-NVIDIA GeForce 7200 .*NVIDIA.*GeForce 72.* 1 1
-NVIDIA GeForce 7300 .*NVIDIA.*GeForce 73.* 1 1
-NVIDIA GeForce 7500 .*NVIDIA.*GeForce 75.* 1 1
-NVIDIA GeForce 7600 .*NVIDIA.*GeForce 76.* 2 1
-NVIDIA GeForce 7800 .*NVIDIA.*GeForce 78.* 2 1
-NVIDIA GeForce 7900 .*NVIDIA.*GeForce 79.* 2 1
-NVIDIA GeForce 8100 .*NVIDIA.*GeForce 81.* 1 1
-NVIDIA GeForce 8200M .*NVIDIA.*GeForce 8200M.* 1 1
-NVIDIA GeForce 8200 .*NVIDIA.*GeForce 82.* 1 1
-NVIDIA GeForce 8300 .*NVIDIA.*GeForce 83.* 1 1
-NVIDIA GeForce 8400M .*NVIDIA.*GeForce 8400M.* 1 1
-NVIDIA GeForce 8400 .*NVIDIA.*GeForce 84.* 1 1
-NVIDIA GeForce 8500 .*NVIDIA.*GeForce 85.* 3 1
-NVIDIA GeForce 8600M .*NVIDIA.*GeForce 8600M.* 1 1
-NVIDIA GeForce 8600 .*NVIDIA.*GeForce 86.* 3 1
-NVIDIA GeForce 8700M .*NVIDIA.*GeForce 8700M.* 3 1
-NVIDIA GeForce 8700 .*NVIDIA.*GeForce 87.* 3 1
-NVIDIA GeForce 8800M .*NVIDIA.*GeForce 8800M.* 3 1
-NVIDIA GeForce 8800 .*NVIDIA.*GeForce 88.* 3 1
-NVIDIA GeForce 9100M .*NVIDIA.*GeForce 9100M.* 0 1
-NVIDIA GeForce 9100 .*NVIDIA.*GeForce 91.* 0 1
-NVIDIA GeForce 9200M .*NVIDIA.*GeForce 9200M.* 1 1
-NVIDIA GeForce 9200 .*NVIDIA.*GeForce 92.* 1 1
-NVIDIA GeForce 9300M .*NVIDIA.*GeForce 9300M.* 1 1
-NVIDIA GeForce 9300 .*NVIDIA.*GeForce 93.* 1 1
-NVIDIA GeForce 9400M .*NVIDIA.*GeForce 9400M.* 1 1
-NVIDIA GeForce 9400 .*NVIDIA.*GeForce 94.* 1 1
-NVIDIA GeForce 9500M .*NVIDIA.*GeForce 9500M.* 2 1
-NVIDIA GeForce 9500 .*NVIDIA.*GeForce 95.* 2 1
-NVIDIA GeForce 9600M .*NVIDIA.*GeForce 9600M.* 3 1
-NVIDIA GeForce 9600 .*NVIDIA.*GeForce 96.* 2 1
-NVIDIA GeForce 9700M .*NVIDIA.*GeForce 9700M.* 2 1
-NVIDIA GeForce 9800M .*NVIDIA.*GeForce 9800M.* 3 1
-NVIDIA GeForce 9800 .*NVIDIA.*GeForce 98.* 3 1
-NVIDIA GeForce FX 5100 .*NVIDIA.*GeForce FX 51.* 0 1
-NVIDIA GeForce FX 5200 .*NVIDIA.*GeForce FX 52.* 0 1
-NVIDIA GeForce FX 5300 .*NVIDIA.*GeForce FX 53.* 0 1
-NVIDIA GeForce FX 5500 .*NVIDIA.*GeForce FX 55.* 0 1
-NVIDIA GeForce FX 5600 .*NVIDIA.*GeForce FX 56.* 0 1
-NVIDIA GeForce FX 5700 .*NVIDIA.*GeForce FX 57.* 1 1
-NVIDIA GeForce FX 5800 .*NVIDIA.*GeForce FX 58.* 1 1
-NVIDIA GeForce FX 5900 .*NVIDIA.*GeForce FX 59.* 1 1
-NVIDIA GeForce FX Go5100 .*NVIDIA.*GeForce FX Go51.* 0 1
-NVIDIA GeForce FX Go5200 .*NVIDIA.*GeForce FX Go52.* 0 1
-NVIDIA GeForce FX Go5300 .*NVIDIA.*GeForce FX Go53.* 0 1
-NVIDIA GeForce FX Go5500 .*NVIDIA.*GeForce FX Go55.* 0 1
-NVIDIA GeForce FX Go5600 .*NVIDIA.*GeForce FX Go56.* 0 1
-NVIDIA GeForce FX Go5700 .*NVIDIA.*GeForce FX Go57.* 1 1
-NVIDIA GeForce FX Go5800 .*NVIDIA.*GeForce FX Go58.* 1 1
-NVIDIA GeForce FX Go5900 .*NVIDIA.*GeForce FX Go59.* 1 1
-NVIDIA GeForce FX Go5xxx .*NVIDIA.*GeForce FX Go.* 0 1
-NVIDIA GeForce Go 6100 .*NVIDIA.*GeForce Go 61.* 0 1
-NVIDIA GeForce Go 6200 .*NVIDIA.*GeForce Go 62.* 0 1
-NVIDIA GeForce Go 6400 .*NVIDIA.*GeForce Go 64.* 1 1
-NVIDIA GeForce Go 6500 .*NVIDIA.*GeForce Go 65.* 1 1
-NVIDIA GeForce Go 6600 .*NVIDIA.*GeForce Go 66.* 1 1
-NVIDIA GeForce Go 6700 .*NVIDIA.*GeForce Go 67.* 1 1
-NVIDIA GeForce Go 6800 .*NVIDIA.*GeForce Go 68.* 1 1
-NVIDIA GeForce Go 7200 .*NVIDIA.*GeForce Go 72.* 1 1
-NVIDIA GeForce Go 7300 LE .*NVIDIA.*GeForce Go 73.*LE.* 0 1
-NVIDIA GeForce Go 7300 .*NVIDIA.*GeForce Go 73.* 1 1
-NVIDIA GeForce Go 7400 .*NVIDIA.*GeForce Go 74.* 1 1
-NVIDIA GeForce Go 7600 .*NVIDIA.*GeForce Go 76.* 2 1
-NVIDIA GeForce Go 7700 .*NVIDIA.*GeForce Go 77.* 2 1
-NVIDIA GeForce Go 7800 .*NVIDIA.*GeForce Go 78.* 2 1
-NVIDIA GeForce Go 7900 .*NVIDIA.*GeForce Go 79.* 2 1
-NVIDIA D9M .*NVIDIA.*D9M.* 1 1
-NVIDIA G94 .*NVIDIA.*G94.* 3 1
+NVIDIA GeForce 4 .*NVIDIA .*GeForce ?4.* 0 1
+NVIDIA GeForce 4 Go .*NVIDIA .*GeForce ?4.*Go.* 0 1
+NVIDIA GeForce 4 MX .*NVIDIA .*GeForce ?4 MX.* 0 1
+NVIDIA GeForce 4 PCX .*NVIDIA .*GeForce ?4 PCX.* 0 1
+NVIDIA GeForce 4 Ti .*NVIDIA .*GeForce ?4 Ti.* 0 1
+NVIDIA GeForce 6100 .*NVIDIA .*GeForce 61.* 0 1
+NVIDIA GeForce 6200 .*NVIDIA .*GeForce 62.* 0 1
+NVIDIA GeForce 6500 .*NVIDIA .*GeForce 65.* 0 1
+NVIDIA GeForce 6600 .*NVIDIA .*GeForce 66.* 1 1
+NVIDIA GeForce 6700 .*NVIDIA .*GeForce 67.* 2 1
+NVIDIA GeForce 6800 .*NVIDIA .*GeForce 68.* 2 1
+NVIDIA GeForce 7000 .*NVIDIA .*GeForce 70.* 0 1
+NVIDIA GeForce 7100 .*NVIDIA .*GeForce 71.* 0 1
+NVIDIA GeForce 7200 .*NVIDIA .*GeForce 72.* 1 1
+NVIDIA GeForce 7300 .*NVIDIA .*GeForce 73.* 1 1
+NVIDIA GeForce 7500 .*NVIDIA .*GeForce 75.* 1 1
+NVIDIA GeForce 7600 .*NVIDIA .*GeForce 76.* 2 1
+NVIDIA GeForce 7800 .*NVIDIA .*GeForce 78.* 2 1
+NVIDIA GeForce 7900 .*NVIDIA .*GeForce 79.* 2 1
+NVIDIA GeForce 8100 .*NVIDIA .*GeForce 81.* 1 1
+NVIDIA GeForce 8200M .*NVIDIA .*GeForce 8200M.* 1 1
+NVIDIA GeForce 8200 .*NVIDIA .*GeForce 82.* 1 1
+NVIDIA GeForce 8300 .*NVIDIA .*GeForce 83.* 2 1
+NVIDIA GeForce 8400M .*NVIDIA .*GeForce 8400M.* 2 1
+NVIDIA GeForce 8400 .*NVIDIA .*GeForce 84.* 2 1
+NVIDIA GeForce 8500 .*NVIDIA .*GeForce 85.* 3 1
+NVIDIA GeForce 8600M .*NVIDIA .*GeForce 8600M.* 2 1
+NVIDIA GeForce 8600 .*NVIDIA .*GeForce 86.* 3 1
+NVIDIA GeForce 8700M .*NVIDIA .*GeForce 8700M.* 3 1
+NVIDIA GeForce 8700 .*NVIDIA .*GeForce 87.* 3 1
+NVIDIA GeForce 8800M .*NVIDIA .*GeForce 8800M.* 3 1
+NVIDIA GeForce 8800 .*NVIDIA .*GeForce 88.* 3 1
+NVIDIA GeForce 9100M .*NVIDIA .*GeForce 9100M.* 0 1
+NVIDIA GeForce 9100 .*NVIDIA .*GeForce 91.* 0 1
+NVIDIA GeForce 9200M .*NVIDIA .*GeForce 9200M.* 1 1
+NVIDIA GeForce 9200 .*NVIDIA .*GeForce 92.* 1 1
+NVIDIA GeForce 9300M .*NVIDIA .*GeForce 9300M.* 2 1
+NVIDIA GeForce 9300 .*NVIDIA .*GeForce 93.* 2 1
+NVIDIA GeForce 9400M .*NVIDIA .*GeForce 9400M.* 2 1
+NVIDIA GeForce 9400 .*NVIDIA .*GeForce 94.* 2 1
+NVIDIA GeForce 9500M .*NVIDIA .*GeForce 9500M.* 2 1
+NVIDIA GeForce 9500 .*NVIDIA .*GeForce 95.* 2 1
+NVIDIA GeForce 9600M .*NVIDIA .*GeForce 9600M.* 3 1
+NVIDIA GeForce 9600 .*NVIDIA .*GeForce 96.* 2 1
+NVIDIA GeForce 9700M .*NVIDIA .*GeForce 9700M.* 2 1
+NVIDIA GeForce 9800M .*NVIDIA .*GeForce 9800M.* 3 1
+NVIDIA GeForce 9800 .*NVIDIA .*GeForce 98.* 3 1
+NVIDIA GeForce FX 5100 .*NVIDIA .*GeForce FX 51.* 0 1
+NVIDIA GeForce FX 5200 .*NVIDIA .*GeForce FX 52.* 0 1
+NVIDIA GeForce FX 5300 .*NVIDIA .*GeForce FX 53.* 0 1
+NVIDIA GeForce FX 5500 .*NVIDIA .*GeForce FX 55.* 0 1
+NVIDIA GeForce FX 5600 .*NVIDIA .*GeForce FX 56.* 0 1
+NVIDIA GeForce FX 5700 .*NVIDIA .*GeForce FX 57.* 1 1
+NVIDIA GeForce FX 5800 .*NVIDIA .*GeForce FX 58.* 1 1
+NVIDIA GeForce FX 5900 .*NVIDIA .*GeForce FX 59.* 1 1
+NVIDIA GeForce FX Go5100 .*NVIDIA .*GeForce FX Go51.* 0 1
+NVIDIA GeForce FX Go5200 .*NVIDIA .*GeForce FX Go52.* 0 1
+NVIDIA GeForce FX Go5300 .*NVIDIA .*GeForce FX Go53.* 0 1
+NVIDIA GeForce FX Go5500 .*NVIDIA .*GeForce FX Go55.* 0 1
+NVIDIA GeForce FX Go5600 .*NVIDIA .*GeForce FX Go56.* 0 1
+NVIDIA GeForce FX Go5700 .*NVIDIA .*GeForce FX Go57.* 1 1
+NVIDIA GeForce FX Go5800 .*NVIDIA .*GeForce FX Go58.* 1 1
+NVIDIA GeForce FX Go5900 .*NVIDIA .*GeForce FX Go59.* 1 1
+NVIDIA GeForce FX Go5xxx .*NVIDIA .*GeForce FX Go.* 0 1
+NVIDIA GeForce Go 6100 .*NVIDIA .*GeForce Go 61.* 0 1
+NVIDIA GeForce Go 6200 .*NVIDIA .*GeForce Go 62.* 0 1
+NVIDIA GeForce Go 6400 .*NVIDIA .*GeForce Go 64.* 1 1
+NVIDIA GeForce Go 6500 .*NVIDIA .*GeForce Go 65.* 1 1
+NVIDIA GeForce Go 6600 .*NVIDIA .*GeForce Go 66.* 1 1
+NVIDIA GeForce Go 6700 .*NVIDIA .*GeForce Go 67.* 1 1
+NVIDIA GeForce Go 6800 .*NVIDIA .*GeForce Go 68.* 1 1
+NVIDIA GeForce Go 7200 .*NVIDIA .*GeForce Go 72.* 1 1
+NVIDIA GeForce Go 7300 LE .*NVIDIA .*GeForce Go 73.*LE.* 0 1
+NVIDIA GeForce Go 7300 .*NVIDIA .*GeForce Go 73.* 1 1
+NVIDIA GeForce Go 7400 .*NVIDIA .*GeForce Go 74.* 1 1
+NVIDIA GeForce Go 7600 .*NVIDIA .*GeForce Go 76.* 2 1
+NVIDIA GeForce Go 7700 .*NVIDIA .*GeForce Go 77.* 2 1
+NVIDIA GeForce Go 7800 .*NVIDIA .*GeForce Go 78.* 2 1
+NVIDIA GeForce Go 7900 .*NVIDIA .*GeForce Go 79.* 2 1
+NVIDIA D9M .*NVIDIA .*D9M.* 1 1
+NVIDIA G94 .*NVIDIA .*G94.* 3 1
NVIDIA GeForce Go 6 .*GeForce Go 6.* 1 1
-NVIDIA ION 2 .*NVIDIA ION 2.* 2 1
-NVIDIA ION .*NVIDIA ION.* 2 1
-NVIDIA NB9M .*GeForce NB9M.* 1 1
-NVIDIA NB9P .*GeForce NB9P.* 1 1
+NVIDIA ION 2 .*NVIDIA .*ION 2.* 2 1
+NVIDIA ION .*NVIDIA .*ION.* 2 1
+NVIDIA NB8M .*NVIDIA .*NB8M.* 1 1
+NVIDIA NB8P .*NVIDIA .*NB8P.* 2 1
+NVIDIA NB9E .*NVIDIA .*NB9E.* 3 1
+NVIDIA NB9M .*NVIDIA .*NB9M.* 1 1
+NVIDIA NB9P .*NVIDIA .*NB9P.* 2 1
+NVIDIA N10 .*NVIDIA .*N10.* 1 1
NVIDIA GeForce PCX .*GeForce PCX.* 0 1
-NVIDIA Generic .*NVIDIA.*Unknown.* 0 0
-NVIDIA NV17 .*GeForce NV17.* 0 1
-NVIDIA NV34 .*NVIDIA.*NV34.* 0 1
-NVIDIA NV35 .*NVIDIA.*NV35.* 0 1
-NVIDIA NV36 .*GeForce NV36.* 1 1
-NVIDIA NV43 .*NVIDIA *NV43.* 1 1
-NVIDIA NV44 .*NVIDIA *NV44.* 1 1
-NVIDIA nForce .*NVIDIA *nForce.* 0 0
-NVIDIA MCP78 .*NVIDIA *MCP78.* 1 1
+NVIDIA Generic .*NVIDIA .*Unknown.* 0 0
+NVIDIA NV17 .*NVIDIA .*NV17.* 0 1
+NVIDIA NV34 .*NVIDIA .*NV34.* 0 1
+NVIDIA NV35 .*NVIDIA .*NV35.* 0 1
+NVIDIA NV36 .*NVIDIA .*NV36.* 1 1
+NVIDIA NV41 .*NVIDIA .*NV41.* 1 1
+NVIDIA NV43 .*NVIDIA .*NV43.* 1 1
+NVIDIA NV44 .*NVIDIA .*NV44.* 1 1
+NVIDIA nForce .*NVIDIA .*nForce.* 0 0
+NVIDIA MCP51 .*NVIDIA .*MCP51.* 1 1
+NVIDIA MCP61 .*NVIDIA .*MCP61.* 1 1
+NVIDIA MCP67 .*NVIDIA .*MCP67.* 1 1
+NVIDIA MCP68 .*NVIDIA .*MCP68.* 1 1
+NVIDIA MCP73 .*NVIDIA .*MCP73.* 1 1
+NVIDIA MCP77 .*NVIDIA .*MCP77.* 1 1
+NVIDIA MCP78 .*NVIDIA .*MCP78.* 1 1
+NVIDIA MCP79 .*NVIDIA .*MCP79.* 1 1
+NVIDIA MCP7A .*NVIDIA .*MCP7A.* 1 1
NVIDIA Quadro2 .*Quadro2.* 0 1
NVIDIA Quadro 1000M .*Quadro.*1000M.* 2 1
-NVIDIA Quadro 2000 M/D .*Quadro.*2000(M|D)?.* 3 1
+NVIDIA Quadro 2000 M/D .*Quadro.*2000.* 3 1
+NVIDIA Quadro 3000M .*Quadro.*3000M.* 3 1
NVIDIA Quadro 4000M .*Quadro.*4000M.* 3 1
NVIDIA Quadro 4000 .*Quadro *4000.* 3 1
-NVIDIA Quadro 50x0 M .*Quadro.*50.0(M)?.* 3 1
+NVIDIA Quadro 50x0 M .*Quadro.*50.0.* 3 1
NVIDIA Quadro 6000 .*Quadro.*6000.* 3 1
NVIDIA Quadro 400 .*Quadro.*400.* 2 1
NVIDIA Quadro 600 .*Quadro.*600.* 2 1
NVIDIA Quadro4 .*Quadro4.* 0 1
NVIDIA Quadro DCC .*Quadro DCC.* 0 1
+NVIDIA Quadro CX .*Quadro.*CX.* 3 1
NVIDIA Quadro FX 770M .*Quadro.*FX *770M.* 2 1
NVIDIA Quadro FX 1500M .*Quadro.*FX *1500M.* 1 1
NVIDIA Quadro FX 1600M .*Quadro.*FX *1600M.* 2 1
@@ -498,16 +513,16 @@ NVIDIA Quadro FX 3700 .*Quadro.*FX *3700.* 3 1
NVIDIA Quadro FX 3800 .*Quadro.*FX *3800.* 3 1
NVIDIA Quadro FX 4500 .*Quadro.*FX *45.* 3 1
NVIDIA Quadro FX 880M .*Quadro.*FX *880M.* 3 1
-NVIDIA Quadro FX 4800 .*NVIDIA.*Quadro *FX *4800.* 3 1
+NVIDIA Quadro FX 4800 .*NVIDIA .*Quadro *FX *4800.* 3 1
NVIDIA Quadro FX .*Quadro FX.* 1 1
NVIDIA Quadro NVS 1xxM .*Quadro NVS *1.[05]M.* 0 1
-NVIDIA Quadro NVS 300M .*NVIDIA.*NVS *300M.* 2 1
-NVIDIA Quadro NVS 320M .*NVIDIA.*NVS *320M.* 2 1
-NVIDIA Quadro NVS 2100M .*NVIDIA.*NVS *2100M.* 2 1
-NVIDIA Quadro NVS 3100M .*NVIDIA.*NVS *3100M.* 2 1
-NVIDIA Quadro NVS 4200M .*NVIDIA.*NVS *4200M.* 2 1
-NVIDIA Quadro NVS 5100M .*NVIDIA.*NVS *5100M.* 2 1
-NVIDIA Quadro NVS .*NVIDIA.*NVS 0 1
+NVIDIA Quadro NVS 300M .*NVIDIA .*NVS *300M.* 2 1
+NVIDIA Quadro NVS 320M .*NVIDIA .*NVS *320M.* 2 1
+NVIDIA Quadro NVS 2100M .*NVIDIA .*NVS *2100M.* 2 1
+NVIDIA Quadro NVS 3100M .*NVIDIA .*NVS *3100M.* 2 1
+NVIDIA Quadro NVS 4200M .*NVIDIA .*NVS *4200M.* 2 1
+NVIDIA Quadro NVS 5100M .*NVIDIA .*NVS *5100M.* 2 1
+NVIDIA Quadro NVS .*NVIDIA .*NVS 0 1
NVIDIA RIVA TNT .*RIVA TNT.* 0 0
S3 .*S3 Graphics.* 0 0
SiS SiS.* 0 0
@@ -517,3 +532,4 @@ XGI XGI.* 0 0
VIA VIA.* 0 0
Apple Generic Apple.*Generic.* 0 0
Apple Software Renderer Apple.*Software Renderer.* 0 0
+Humper Humper.* 0 1
diff --git a/indra/newview/installers/darwin/fix_application_icon_position.sh b/indra/newview/installers/darwin/fix_application_icon_position.sh
index 618e34820c..618e34820c 100755..100644
--- a/indra/newview/installers/darwin/fix_application_icon_position.sh
+++ b/indra/newview/installers/darwin/fix_application_icon_position.sh
diff --git a/indra/newview/installers/windows/installer_template.nsi b/indra/newview/installers/windows/installer_template.nsi
index 98cc8fa702..8a6114f0d5 100755..100644
--- a/indra/newview/installers/windows/installer_template.nsi
+++ b/indra/newview/installers/windows/installer_template.nsi
@@ -52,10 +52,10 @@ RequestExecutionLevel admin ; on Vista we must be admin because we write to Prog
!include "%%SOURCE%%\installers\windows\lang_fr.nsi"
!include "%%SOURCE%%\installers\windows\lang_ja.nsi"
!include "%%SOURCE%%\installers\windows\lang_it.nsi"
-!include "%%SOURCE%%\installers\windows\lang_ko.nsi"
-!include "%%SOURCE%%\installers\windows\lang_nl.nsi"
!include "%%SOURCE%%\installers\windows\lang_pl.nsi"
!include "%%SOURCE%%\installers\windows\lang_pt-br.nsi"
+!include "%%SOURCE%%\installers\windows\lang_ru.nsi"
+!include "%%SOURCE%%\installers\windows\lang_tr.nsi"
!include "%%SOURCE%%\installers\windows\lang_zh.nsi"
# *TODO: Move these into the language files themselves
@@ -66,11 +66,11 @@ LangString LanguageCode ${LANG_SPANISH} "es"
LangString LanguageCode ${LANG_FRENCH} "fr"
LangString LanguageCode ${LANG_JAPANESE} "ja"
LangString LanguageCode ${LANG_ITALIAN} "it"
-LangString LanguageCode ${LANG_KOREAN} "ko"
-LangString LanguageCode ${LANG_DUTCH} "nl"
LangString LanguageCode ${LANG_POLISH} "pl"
LangString LanguageCode ${LANG_PORTUGUESEBR} "pt"
-LangString LanguageCode ${LANG_SIMPCHINESE} "zh"
+LangString LanguageCode ${LANG_RUSSIAN} "ru"
+LangString LanguageCode ${LANG_TURKISH} "tr"
+LangString LanguageCode ${LANG_TRADCHINESE} "zh"
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Tweak for different servers/builds (this placeholder is replaced by viewer_manifest.py)
@@ -115,6 +115,7 @@ Var COMMANDLINE ; command line passed to this installer, set in .onInit
Var SHORTCUT_LANG_PARAM ; "--set InstallLanguage de", passes language to viewer
Var SKIP_DIALOGS ; set from command line in .onInit. autoinstall
; GUI and the defaults.
+Var DO_UNINSTALL_V2 ; If non-null, path to a previous Viewer 2 installation that will be uninstalled.
;;; Function definitions should go before file includes, because calls to
;;; DLLs like LangDLL trigger an implicit file include, so if that call is at
@@ -311,6 +312,29 @@ FunctionEnd
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; Function CheckWillUninstallV2
+;
+; If we are being called through auto-update, we need to uninstall any
+; existing V2 installation. Otherwise, we wind up with
+; SecondLifeViewer2 and SecondLifeViewer installations existing side
+; by side no indication which to use.
+; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+Function CheckWillUninstallV2
+
+ StrCpy $DO_UNINSTALL_V2 ""
+
+ StrCmp $SKIP_DIALOGS "true" 0 CHECKV2_DONE
+ StrCmp $INSTDIR "$PROGRAMFILES\SecondLifeViewer2" CHECKV2_DONE ; don't uninstall our own install dir.
+ IfFileExists "$PROGRAMFILES\SecondLifeViewer2\uninst.exe" CHECKV2_FOUND CHECKV2_DONE
+
+CHECKV2_FOUND:
+ StrCpy $DO_UNINSTALL_V2 "true"
+
+CHECKV2_DONE:
+
+FunctionEnd
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Save user files to temp location
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Function PreserveUserFiles
@@ -334,7 +358,7 @@ Push $2
ExpandEnvStrings $2 $2
CreateDirectory "$TEMP\SecondLifeSettingsBackup\$0"
- CopyFiles "$2\Application Data\SecondLife\*" "$TEMP\SecondLifeSettingsBackup\$0"
+ CopyFiles /SILENT "$2\Application Data\SecondLife\*" "$TEMP\SecondLifeSettingsBackup\$0"
CONTINUE:
IntOp $0 $0 + 1
@@ -350,7 +374,7 @@ Push $0
ReadRegStr $0 HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" "Common AppData"
StrCmp $0 "" +2
CreateDirectory "$TEMP\SecondLifeSettingsBackup\AllUsers\"
- CopyFiles "$2\Application Data\SecondLife\*" "$TEMP\SecondLifeSettingsBackup\AllUsers\"
+ CopyFiles /SILENT "$2\Application Data\SecondLife\*" "$TEMP\SecondLifeSettingsBackup\AllUsers\"
Pop $0
FunctionEnd
@@ -377,7 +401,7 @@ Push $2
ExpandEnvStrings $2 $2
CreateDirectory "$2\Application Data\SecondLife\"
- CopyFiles "$TEMP\SecondLifeSettingsBackup\$0\*" "$2\Application Data\SecondLife\"
+ CopyFiles /SILENT "$TEMP\SecondLifeSettingsBackup\$0\*" "$2\Application Data\SecondLife\"
CONTINUE:
IntOp $0 $0 + 1
@@ -393,11 +417,53 @@ Push $0
ReadRegStr $0 HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" "Common AppData"
StrCmp $0 "" +2
CreateDirectory "$2\Application Data\SecondLife\"
- CopyFiles "$TEMP\SecondLifeSettingsBackup\AllUsers\*" "$2\Application Data\SecondLife\"
+ CopyFiles /SILENT "$TEMP\SecondLifeSettingsBackup\AllUsers\*" "$2\Application Data\SecondLife\"
+Pop $0
+
+FunctionEnd
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; Remove temp dirs
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+Function RemoveTempUserFiles
+
+Push $0
+Push $1
+Push $2
+
+ StrCpy $0 0 ; Index number used to iterate via EnumRegKey
+
+ LOOP:
+ EnumRegKey $1 HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList" $0
+ StrCmp $1 "" DONE ; no more users
+
+ ReadRegStr $2 HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\$1" "ProfileImagePath"
+ StrCmp $2 "" CONTINUE 0 ; "ProfileImagePath" value is missing
+
+ ; Required since ProfileImagePath is of type REG_EXPAND_SZ
+ ExpandEnvStrings $2 $2
+
+ RMDir /r "$TEMP\SecondLifeSettingsBackup\$0\*"
+
+ CONTINUE:
+ IntOp $0 $0 + 1
+ Goto LOOP
+ DONE:
+
+Pop $2
+Pop $1
+Pop $0
+
+; Copy files in Documents and Settings\All Users\SecondLife
+Push $0
+ ReadRegStr $0 HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" "Common AppData"
+ StrCmp $0 "" +2
+ RMDir /r "$TEMP\SecondLifeSettingsBackup\AllUsers\*"
Pop $0
FunctionEnd
+
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Clobber user files - TEST ONLY
; This is here for testing, generally not desirable to call it.
@@ -864,9 +930,12 @@ Call CheckIfAdministrator ; Make sure the user can install/uninstall
Call CheckIfAlreadyCurrent ; Make sure that we haven't already installed this version
Call CloseSecondLife ; Make sure we're not running
Call CheckNetworkConnection ; ping secondlife.com
+Call CheckWillUninstallV2 ; See if a V2 install exists and will be removed.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-Call PreserveUserFiles
+StrCmp $DO_UNINSTALL_V2 "" PRESERVE_DONE
+ Call PreserveUserFiles
+PRESERVE_DONE:
;;; Don't remove cache files during a regular install, removing the inventory cache on upgrades results in lots of damage to the servers.
;Call RemoveCacheFiles ; Installing over removes potentially corrupted
@@ -951,17 +1020,15 @@ WriteRegExpandStr HKEY_CLASSES_ROOT "x-grid-location-info\shell\open\command" ""
; write out uninstaller
WriteUninstaller "$INSTDIR\uninst.exe"
-; Remove existing "Second Life Viewer 2" install if any.
-StrCmp $INSTDIR "$PROGRAMFILES\SecondLifeViewer2" SLV2_DONE ; unless that's the install directory
-IfFileExists "$PROGRAMFILES\SecondLifeViewer2\uninst.exe" SLV2_FOUND SLV2_DONE
-
-SLV2_FOUND:
-ExecWait '"$PROGRAMFILES\SecondLifeViewer2\uninst.exe" /S _?=$PROGRAMFILES\SecondLifeViewer2'
-Delete "$PROGRAMFILES\SecondLifeViewer2\uninst.exe" ; with _? option above, uninst.exe will be left behind.
-RMDir "$PROGRAMFILES\SecondLifeViewer2" ; will remove only if empty.
+; Uninstall existing "Second Life Viewer 2" install if needed.
+StrCmp $DO_UNINSTALL_V2 "" REMOVE_SLV2_DONE
+ ExecWait '"$PROGRAMFILES\SecondLifeViewer2\uninst.exe" /S _?=$PROGRAMFILES\SecondLifeViewer2'
+ Delete "$PROGRAMFILES\SecondLifeViewer2\uninst.exe" ; with _? option above, uninst.exe will be left behind.
+ RMDir "$PROGRAMFILES\SecondLifeViewer2" ; will remove only if empty.
-SLV2_DONE:
-Call RestoreUserFiles
+ Call RestoreUserFiles
+ Call RemoveTempUserFiles
+REMOVE_SLV2_DONE:
; end of default section
SectionEnd
diff --git a/indra/newview/installers/windows/lang_ko.nsi b/indra/newview/installers/windows/lang_ko.nsi
deleted file mode 100644
index 5162b7ddad..0000000000
--- a/indra/newview/installers/windows/lang_ko.nsi
+++ /dev/null
Binary files differ
diff --git a/indra/newview/installers/windows/lang_nl.nsi b/indra/newview/installers/windows/lang_nl.nsi
deleted file mode 100644
index 8884b1e858..0000000000
--- a/indra/newview/installers/windows/lang_nl.nsi
+++ /dev/null
Binary files differ
diff --git a/indra/newview/installers/windows/lang_ru.nsi b/indra/newview/installers/windows/lang_ru.nsi
new file mode 100644
index 0000000000..de7affe08a
--- /dev/null
+++ b/indra/newview/installers/windows/lang_ru.nsi
Binary files differ
diff --git a/indra/newview/installers/windows/lang_tr.nsi b/indra/newview/installers/windows/lang_tr.nsi
new file mode 100644
index 0000000000..5e7e3d797b
--- /dev/null
+++ b/indra/newview/installers/windows/lang_tr.nsi
Binary files differ
diff --git a/indra/newview/installers/windows/lang_zh.nsi b/indra/newview/installers/windows/lang_zh.nsi
index d17e860df9..ecf1185fbb 100644
--- a/indra/newview/installers/windows/lang_zh.nsi
+++ b/indra/newview/installers/windows/lang_zh.nsi
Binary files differ
diff --git a/indra/newview/installers/windows/language_menu.nsi b/indra/newview/installers/windows/language_menu.nsi
index fef8d40c69..08ad42532f 100644
--- a/indra/newview/installers/windows/language_menu.nsi
+++ b/indra/newview/installers/windows/language_menu.nsi
Binary files differ
diff --git a/indra/newview/linux_tools/wrapper.sh b/indra/newview/linux_tools/wrapper.sh
index 283a28a0aa..20936c6460 100755
--- a/indra/newview/linux_tools/wrapper.sh
+++ b/indra/newview/linux_tools/wrapper.sh
@@ -110,22 +110,34 @@ export SAVED_LD_LIBRARY_PATH="${LD_LIBRARY_PATH}"
# fi
#fi
-export SL_ENV='LD_LIBRARY_PATH="`pwd`"/lib:"${LD_LIBRARY_PATH}"'
-export SL_CMD='$LL_WRAPPER bin/do-not-directly-run-secondlife-bin'
-export SL_OPT="`cat etc/gridargs.dat` $@"
-
-# Run the program
-eval ${SL_ENV} ${SL_CMD} ${SL_OPT} || LL_RUN_ERR=runerr
+export LD_LIBRARY_PATH="$PWD/lib:${LD_LIBRARY_PATH}"
+
+# Have to deal specially with gridargs.dat; typical contents look like:
+# --channel "Second Life Developer" --settings settings_developer.xml
+# Simply embedding $(<etc/gridargs.dat) into a command line treats each of
+# Second, Life and Developer as separate args -- no good. We need bash to
+# process quotes using eval.
+# First read it without scanning, then scan that string. Break quoted words
+# into a bash array. Note that if gridargs.dat is empty, or contains only
+# whitespace, the resulting gridargs array will be empty -- zero entries --
+# therefore "${gridargs[@]}" entirely vanishes from the command line below,
+# just as we want.
+eval gridargs=("$(<etc/gridargs.dat)")
+
+# Run the program.
+# Don't quote $LL_WRAPPER because, if empty, it should simply vanish from the
+# command line. But DO quote "$@": preserve separate args as individually
+# quoted. Similar remarks about the contents of gridargs.
+$LL_WRAPPER bin/do-not-directly-run-secondlife-bin "${gridargs[@]}" "$@"
+LL_RUN_ERR=$?
# Handle any resulting errors
-if [ -n "$LL_RUN_ERR" ]; then
- LL_RUN_ERR_MSG=""
- if [ "$LL_RUN_ERR" = "runerr" ]; then
- # generic error running the binary
- echo '*** Bad shutdown. ***'
- if [ "`uname -m`" = "x86_64" ]; then
- echo
- cat << EOFMARKER
+if [ $LL_RUN_ERR -ne 0 ]; then
+ # generic error running the binary
+ echo '*** Bad shutdown ($LL_RUN_ERR). ***'
+ if [ "$(uname -m)" = "x86_64" ]; then
+ echo
+ cat << EOFMARKER
You are running the Second Life Viewer on a x86_64 platform. The
most common problems when launching the Viewer (particularly
'bin/do-not-directly-run-secondlife-bin: not found' and 'error while
@@ -134,10 +146,8 @@ distribution's 32-bit compatibility packages.
For example, on Ubuntu and other Debian-based Linuxes you might run:
$ sudo apt-get install ia32-libs ia32-libs-gtk ia32-libs-kde ia32-libs-sdl
EOFMARKER
- fi
fi
fi
-
echo
echo '*******************************************************'
diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp
index 296ae8f10b..ab9b5ff436 100755
--- a/indra/newview/llagent.cpp
+++ b/indra/newview/llagent.cpp
@@ -36,10 +36,10 @@
#include "llagentwearables.h"
#include "llagentui.h"
#include "llanimationstates.h"
-#include "llbottomtray.h"
#include "llcallingcard.h"
#include "llcapabilitylistener.h"
#include "llchannelmanager.h"
+#include "llchicletbar.h"
#include "llconsole.h"
#include "llenvmanager.h"
#include "llfirstuse.h"
@@ -68,9 +68,11 @@
#include "llstatusbar.h"
#include "llteleportflags.h"
#include "lltool.h"
+#include "lltoolbarview.h"
#include "lltoolpie.h"
#include "lltoolmgr.h"
#include "lltrans.h"
+#include "lluictrl.h"
#include "llurlentry.h"
#include "llviewercontrol.h"
#include "llviewerdisplay.h"
@@ -152,6 +154,68 @@ bool handleSlowMotionAnimation(const LLSD& newvalue)
return true;
}
+// static
+void LLAgent::parcelChangedCallback()
+{
+ bool can_edit = LLToolMgr::getInstance()->canEdit();
+
+ gAgent.mCanEditParcel = can_edit;
+}
+
+// static
+bool LLAgent::isActionAllowed(const LLSD& sdname)
+{
+ bool retval = false;
+
+ const std::string& param = sdname.asString();
+
+ if (param == "build")
+ {
+ retval = gAgent.canEditParcel();
+ }
+ else if (param == "speak")
+ {
+ if ( gAgent.isVoiceConnected() &&
+ LLViewerParcelMgr::getInstance()->allowAgentVoice() &&
+ ! LLVoiceClient::getInstance()->inTuningMode() )
+ {
+ retval = true;
+ }
+ else
+ {
+ retval = false;
+ }
+ }
+
+ return retval;
+}
+
+// static
+void LLAgent::pressMicrophone(const LLSD& name)
+{
+ LLFirstUse::speak(false);
+
+ LLVoiceClient::getInstance()->inputUserControlState(true);
+}
+
+// static
+void LLAgent::releaseMicrophone(const LLSD& name)
+{
+ LLVoiceClient::getInstance()->inputUserControlState(false);
+}
+
+// static
+void LLAgent::toggleMicrophone(const LLSD& name)
+{
+ LLVoiceClient::getInstance()->toggleUserPTTState();
+}
+
+// static
+bool LLAgent::isMicrophoneOn(const LLSD& sdname)
+{
+ return LLVoiceClient::getInstance()->getUserPTTState();
+}
+
// ************************************************************
// Enabled this definition to compile a 'hacked' viewer that
// locally believes the end user has godlike powers.
@@ -183,6 +247,7 @@ LLAgent::LLAgent() :
mbTeleportKeepsLookAt(false),
mAgentAccess(new LLAgentAccess(gSavedSettings)),
+ mCanEditParcel(false),
mTeleportSourceSLURL(new LLSLURL),
mTeleportState( TELEPORT_NONE ),
mRegionp(NULL),
@@ -231,6 +296,8 @@ LLAgent::LLAgent() :
mCurrentFidget(0),
mFirstLogin(FALSE),
mGenderChosen(FALSE),
+
+ mVoiceConnected(false),
mAppearanceSerialNum(0),
@@ -267,7 +334,9 @@ void LLAgent::init()
gSavedSettings.getControl("PreferredMaturity")->getValidateSignal()->connect(boost::bind(&LLAgent::validateMaturity, this, _2));
gSavedSettings.getControl("PreferredMaturity")->getSignal()->connect(boost::bind(&LLAgent::handleMaturity, this, _2));
-
+
+ LLViewerParcelMgr::getInstance()->addAgentParcelChangedCallback(boost::bind(&LLAgent::parcelChangedCallback));
+
mInitialized = TRUE;
}
@@ -1032,20 +1101,11 @@ F32 LLAgent::clampPitchToLimits(F32 angle)
LLVector3 skyward = getReferenceUpVector();
- F32 look_down_limit;
- F32 look_up_limit = 10.f * DEG_TO_RAD;
+ const F32 look_down_limit = 179.f * DEG_TO_RAD;;
+ const F32 look_up_limit = 1.f * DEG_TO_RAD;
F32 angle_from_skyward = acos( mFrameAgent.getAtAxis() * skyward );
- if (isAgentAvatarValid() && gAgentAvatarp->isSitting())
- {
- look_down_limit = 130.f * DEG_TO_RAD;
- }
- else
- {
- look_down_limit = 170.f * DEG_TO_RAD;
- }
-
// clamp pitch to limits
if ((angle >= 0.f) && (angle_from_skyward + angle > look_down_limit))
{
@@ -1797,11 +1857,12 @@ void LLAgent::endAnimationUpdateUI()
// clean up UI from mode we're leaving
if (gAgentCamera.getLastCameraMode() == CAMERA_MODE_MOUSELOOK )
{
+ gToolBarView->setToolBarsVisible(true);
// show mouse cursor
gViewerWindow->showCursor();
// show menus
gMenuBarView->setVisible(TRUE);
- LLNavigationBar::getInstance()->setVisible(TRUE);
+ LLNavigationBar::getInstance()->setVisible(TRUE && gSavedSettings.getBOOL("ShowNavbarNavigationPanel"));
gStatusBar->setVisibleForMouselook(true);
if (gSavedSettings.getBOOL("ShowMiniLocationPanel"))
@@ -1809,7 +1870,7 @@ void LLAgent::endAnimationUpdateUI()
LLPanelTopInfoBar::getInstance()->setVisible(TRUE);
}
- LLBottomTray::getInstance()->onMouselookModeOut();
+ LLChicletBar::getInstance()->setVisible(TRUE);
LLPanelStandStopFlying::getInstance()->setVisible(TRUE);
@@ -1906,14 +1967,19 @@ void LLAgent::endAnimationUpdateUI()
//---------------------------------------------------------------------
if (gAgentCamera.getCameraMode() == CAMERA_MODE_MOUSELOOK)
{
- // hide menus
+ // clean up UI
+ // first show anything hidden by UI toggle
+ gViewerWindow->setUIVisibility(TRUE);
+
+ // then hide stuff we want hidden for mouselook
+ gToolBarView->setToolBarsVisible(false);
gMenuBarView->setVisible(FALSE);
LLNavigationBar::getInstance()->setVisible(FALSE);
gStatusBar->setVisibleForMouselook(false);
LLPanelTopInfoBar::getInstance()->setVisible(FALSE);
- LLBottomTray::getInstance()->onMouselookModeIn();
+ LLChicletBar::getInstance()->setVisible(FALSE);
LLPanelStandStopFlying::getInstance()->setVisible(FALSE);
@@ -3248,6 +3314,7 @@ void LLAgent::processAgentCachedTextureResponse(LLMessageSystem *mesgsys, void *
}
llinfos << "Received cached texture response for " << num_results << " textures." << llendl;
+ gAgentAvatarp->outputRezTiming("Fetched agent wearables textures from cache. Will now load them");
gAgentAvatarp->updateMeshTextures();
@@ -3361,7 +3428,14 @@ bool LLAgent::teleportCore(bool is_local)
LLFloaterReg::hideInstance("region_info");
// minimize the Search floater (STORM-1474)
- LLFloaterReg::getInstance("search")->setMinimized(TRUE);
+ {
+ LLFloater* instance = LLFloaterReg::getInstance("search");
+
+ if (instance && instance->getVisible())
+ {
+ instance->setMinimized(TRUE);
+ }
+ }
LLViewerParcelMgr::getInstance()->deselectLand();
LLViewerMediaFocus::getInstance()->clearFocus();
@@ -3922,14 +3996,14 @@ void LLAgent::renderAutoPilotTarget()
F32 height_meters;
LLVector3d target_global;
- glMatrixMode(GL_MODELVIEW);
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
gGL.pushMatrix();
// not textured
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
// lovely green
- glColor4f(0.f, 1.f, 1.f, 1.f);
+ gGL.color4f(0.f, 1.f, 1.f, 1.f);
target_global = mAutoPilotTargetGlobal;
@@ -3937,9 +4011,9 @@ void LLAgent::renderAutoPilotTarget()
height_meters = 1.f;
- glScalef(height_meters, height_meters, height_meters);
+ gGL.scalef(height_meters, height_meters, height_meters);
- gSphere.render(1500.f);
+ gSphere.render();
gGL.popMatrix();
}
diff --git a/indra/newview/llagent.h b/indra/newview/llagent.h
index 5e23ced424..740770bbdf 100644
--- a/indra/newview/llagent.h
+++ b/indra/newview/llagent.h
@@ -282,7 +282,23 @@ public:
static void toggleFlying();
static bool enableFlying();
BOOL canFly(); // Does this parcel allow you to fly?
-
+
+ //--------------------------------------------------------------------
+ // Voice
+ //--------------------------------------------------------------------
+public:
+ bool isVoiceConnected() const { return mVoiceConnected; }
+ void setVoiceConnected(const bool b) { mVoiceConnected = b; }
+
+ static void pressMicrophone(const LLSD& name);
+ static void releaseMicrophone(const LLSD& name);
+ static void toggleMicrophone(const LLSD& name);
+ static bool isMicrophoneOn(const LLSD& sdname);
+ static bool isActionAllowed(const LLSD& sdname);
+
+private:
+ bool mVoiceConnected;
+
//--------------------------------------------------------------------
// Chat
//--------------------------------------------------------------------
@@ -575,6 +591,14 @@ private:
** **
*******************************************************************************/
+ // Build
+public:
+ bool canEditParcel() const { return mCanEditParcel; }
+private:
+ bool mCanEditParcel;
+
+ static void parcelChangedCallback();
+
/********************************************************************************
** **
** ACCESS
diff --git a/indra/newview/llagentcamera.cpp b/indra/newview/llagentcamera.cpp
index f195c985c0..751b73e1eb 100644
--- a/indra/newview/llagentcamera.cpp
+++ b/indra/newview/llagentcamera.cpp
@@ -2040,11 +2040,12 @@ void LLAgentCamera::resetCamera()
//-----------------------------------------------------------------------------
void LLAgentCamera::changeCameraToMouselook(BOOL animate)
{
- if (!gSavedSettings.getBOOL("EnableMouselook") || LLViewerJoystick::getInstance()->getOverrideCamera())
+ if (!gSavedSettings.getBOOL("EnableMouselook")
+ || LLViewerJoystick::getInstance()->getOverrideCamera())
{
return;
}
-
+
// visibility changes at end of animation
gViewerWindow->getWindow()->resetBusyCount();
diff --git a/indra/newview/llagentwearables.cpp b/indra/newview/llagentwearables.cpp
index b9125ec8d3..09305a5b4d 100644
--- a/indra/newview/llagentwearables.cpp
+++ b/indra/newview/llagentwearables.cpp
@@ -33,6 +33,7 @@
#include "llagentwearablesfetch.h"
#include "llappearancemgr.h"
#include "llcallbacklist.h"
+#include "llfloatersidepanelcontainer.h"
#include "llgesturemgr.h"
#include "llinventorybridge.h"
#include "llinventoryfunctions.h"
@@ -42,7 +43,6 @@
#include "llnotificationsutil.h"
#include "lloutfitobserver.h"
#include "llsidepanelappearance.h"
-#include "llsidetray.h"
#include "lltexlayer.h"
#include "lltooldraganddrop.h"
#include "llviewerregion.h"
@@ -185,6 +185,7 @@ void LLAgentWearables::setAvatarObject(LLVOAvatarSelf *avatar)
{
if (avatar)
{
+ avatar->outputRezTiming("Sending wearables request");
sendAgentWearablesRequest();
}
}
@@ -949,6 +950,11 @@ void LLAgentWearables::processAgentInitialWearablesUpdate(LLMessageSystem* mesgs
if (mInitialWearablesUpdateReceived)
return;
+ if (isAgentAvatarValid())
+ {
+ gAgentAvatarp->outputRezTiming("Received initial wearables update");
+ }
+
// notify subscribers that wearables started loading. See EXT-7777
// *TODO: find more proper place to not be called from deprecated method.
// Seems such place is found: LLInitialWearablesFetch::processContents()
@@ -1168,15 +1174,12 @@ private:
std::vector<LLWearable*> mWearablesAwaitingItems;
};
-void LLAgentWearables::createStandardWearables(BOOL female)
+void LLAgentWearables::createStandardWearables()
{
- llwarns << "Creating Standard " << (female ? "female" : "male")
- << " Wearables" << llendl;
+ llwarns << "Creating standard wearables" << llendl;
if (!isAgentAvatarValid()) return;
- gAgentAvatarp->setSex(female ? SEX_FEMALE : SEX_MALE);
-
const BOOL create[LLWearableType::WT_COUNT] =
{
TRUE, //LLWearableType::WT_SHAPE
@@ -1622,6 +1625,11 @@ void LLAgentWearables::queryWearableCache()
//VWR-22113: gAgent.getRegion() can return null if invalid, seen here on logout
if(gAgent.getRegion())
{
+ if (isAgentAvatarValid())
+ {
+ gAgentAvatarp->outputRezTiming("Fetching textures from cache");
+ }
+
llinfos << "Requesting texture cache entry for " << num_queries << " baked textures" << llendl;
gMessageSystem->sendReliable(gAgent.getRegion()->getHost());
gAgentQueryManager.mNumPendingQueries++;
@@ -2015,7 +2023,7 @@ void LLAgentWearables::editWearable(const LLUUID& item_id)
}
const BOOL disable_camera_switch = LLWearableType::getDisableCameraSwitch(wearable->getType());
- LLPanel* panel = LLSideTray::getInstance()->getPanel("sidepanel_appearance");
+ LLPanel* panel = LLFloaterSidePanelContainer::getPanel("appearance");
LLSidepanelAppearance::editWearable(wearable, panel, disable_camera_switch);
}
diff --git a/indra/newview/llagentwearables.h b/indra/newview/llagentwearables.h
index 252b812c27..01cae3ffd8 100644
--- a/indra/newview/llagentwearables.h
+++ b/indra/newview/llagentwearables.h
@@ -56,7 +56,7 @@ public:
LLAgentWearables();
virtual ~LLAgentWearables();
void setAvatarObject(LLVOAvatarSelf *avatar);
- void createStandardWearables(BOOL female);
+ void createStandardWearables();
void cleanup();
void dump();
diff --git a/indra/newview/llagentwearablesfetch.cpp b/indra/newview/llagentwearablesfetch.cpp
index 1edc96e165..8cba54347e 100644
--- a/indra/newview/llagentwearablesfetch.cpp
+++ b/indra/newview/llagentwearablesfetch.cpp
@@ -87,6 +87,10 @@ public:
LLInitialWearablesFetch::LLInitialWearablesFetch(const LLUUID& cof_id) :
LLInventoryFetchDescendentsObserver(cof_id)
{
+ if (isAgentAvatarValid())
+ {
+ gAgentAvatarp->outputRezTiming("Initial wearables fetch started");
+ }
}
LLInitialWearablesFetch::~LLInitialWearablesFetch()
@@ -101,6 +105,10 @@ void LLInitialWearablesFetch::done()
// idle tick instead.
gInventory.removeObserver(this);
doOnIdleOneTime(boost::bind(&LLInitialWearablesFetch::processContents,this));
+ if (isAgentAvatarValid())
+ {
+ gAgentAvatarp->outputRezTiming("Initial wearables fetch done");
+ }
}
void LLInitialWearablesFetch::add(InitialWearableData &data)
@@ -111,6 +119,12 @@ void LLInitialWearablesFetch::add(InitialWearableData &data)
void LLInitialWearablesFetch::processContents()
{
+ if(!gAgentAvatarp) //no need to process wearables if the agent avatar is deleted.
+ {
+ delete this;
+ return ;
+ }
+
// Fetch the wearable items from the Current Outfit Folder
LLInventoryModel::cat_array_t cat_array;
LLInventoryModel::item_array_t wearable_array;
diff --git a/indra/newview/llagentwearablesfetch.h b/indra/newview/llagentwearablesfetch.h
index 7dafab4a33..bedc445c0e 100644
--- a/indra/newview/llagentwearablesfetch.h
+++ b/indra/newview/llagentwearablesfetch.h
@@ -40,6 +40,8 @@
//--------------------------------------------------------------------
class LLInitialWearablesFetch : public LLInventoryFetchDescendentsObserver
{
+ LOG_CLASS(LLInitialWearablesFetch);
+
public:
LLInitialWearablesFetch(const LLUUID& cof_id);
~LLInitialWearablesFetch();
diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp
index 3cb9b77010..33f5373d7e 100644
--- a/indra/newview/llappearancemgr.cpp
+++ b/indra/newview/llappearancemgr.cpp
@@ -34,6 +34,7 @@
#include "llattachmentsmgr.h"
#include "llcommandhandler.h"
#include "lleventtimer.h"
+#include "llfloatersidepanelcontainer.h"
#include "llgesturemgr.h"
#include "llinventorybridge.h"
#include "llinventoryfunctions.h"
@@ -43,7 +44,6 @@
#include "lloutfitslist.h"
#include "llselectmgr.h"
#include "llsidepanelappearance.h"
-#include "llsidetray.h"
#include "llviewerobjectlist.h"
#include "llvoavatar.h"
#include "llvoavatarself.h"
@@ -116,7 +116,7 @@ public:
return true;
}
- LLSideTray::getInstance()->showPanel("sidepanel_appearance", LLSD());
+ LLFloaterSidePanelContainer::showPanel("appearance", LLSD());
return true;
}
};
@@ -268,6 +268,8 @@ struct LLFoundData
class LLWearableHoldingPattern
{
+ LOG_CLASS(LLWearableHoldingPattern);
+
public:
LLWearableHoldingPattern();
~LLWearableHoldingPattern();
@@ -436,6 +438,11 @@ void LLWearableHoldingPattern::checkMissingWearables()
void LLWearableHoldingPattern::onAllComplete()
{
+ if (isAgentAvatarValid())
+ {
+ gAgentAvatarp->outputRezTiming("Agent wearables fetch complete");
+ }
+
if (!isMostRecent())
{
llwarns << "skipping because LLWearableHolding pattern is invalid (superceded by later outfit request)" << llendl;
@@ -1505,7 +1512,7 @@ void LLAppearanceMgr::updateCOF(const LLUUID& category, bool append)
void LLAppearanceMgr::updatePanelOutfitName(const std::string& name)
{
LLSidepanelAppearance* panel_appearance =
- dynamic_cast<LLSidepanelAppearance *>(LLSideTray::getInstance()->getPanel("sidepanel_appearance"));
+ dynamic_cast<LLSidepanelAppearance *>(LLFloaterSidePanelContainer::getPanel("appearance"));
if (panel_appearance)
{
panel_appearance->refreshCurrentOutfitName(name);
@@ -1943,7 +1950,7 @@ void LLAppearanceMgr::wearInventoryCategoryOnAvatar( LLInventoryCategory* catego
if (gAgentCamera.cameraCustomizeAvatar())
{
// switching to outfit editor should automagically save any currently edited wearable
- LLSideTray::getInstance()->showPanel("sidepanel_appearance", LLSD().with("type", "edit_outfit"));
+ LLFloaterSidePanelContainer::showPanel("appearance", LLSD().with("type", "edit_outfit"));
}
LLAppearanceMgr::changeOutfit(TRUE, category->getUUID(), append);
@@ -2264,6 +2271,85 @@ void LLAppearanceMgr::updateIsDirty()
}
}
+// *HACK: Must match name in Library or agent inventory
+const std::string ROOT_GESTURES_FOLDER = "Gestures";
+const std::string COMMON_GESTURES_FOLDER = "Common Gestures";
+const std::string MALE_GESTURES_FOLDER = "Male Gestures";
+const std::string FEMALE_GESTURES_FOLDER = "Female Gestures";
+const std::string SPEECH_GESTURES_FOLDER = "Speech Gestures";
+const std::string OTHER_GESTURES_FOLDER = "Other Gestures";
+
+void LLAppearanceMgr::copyLibraryGestures()
+{
+ llinfos << "Copying library gestures" << llendl;
+
+ // Copy gestures
+ LLUUID lib_gesture_cat_id =
+ gInventory.findCategoryUUIDForType(LLFolderType::FT_GESTURE,false,true);
+ if (lib_gesture_cat_id.isNull())
+ {
+ llwarns << "Unable to copy gestures, source category not found" << llendl;
+ }
+ LLUUID dst_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_GESTURE);
+
+ std::vector<std::string> gesture_folders_to_copy;
+ gesture_folders_to_copy.push_back(MALE_GESTURES_FOLDER);
+ gesture_folders_to_copy.push_back(FEMALE_GESTURES_FOLDER);
+ gesture_folders_to_copy.push_back(COMMON_GESTURES_FOLDER);
+ gesture_folders_to_copy.push_back(SPEECH_GESTURES_FOLDER);
+ gesture_folders_to_copy.push_back(OTHER_GESTURES_FOLDER);
+
+ for(std::vector<std::string>::iterator it = gesture_folders_to_copy.begin();
+ it != gesture_folders_to_copy.end();
+ ++it)
+ {
+ std::string& folder_name = *it;
+
+ LLPointer<LLInventoryCallback> cb(NULL);
+
+ // After copying gestures, activate Common, Other, plus
+ // Male and/or Female, depending upon the initial outfit gender.
+ ESex gender = gAgentAvatarp->getSex();
+
+ std::string activate_male_gestures;
+ std::string activate_female_gestures;
+ switch (gender) {
+ case SEX_MALE:
+ activate_male_gestures = MALE_GESTURES_FOLDER;
+ break;
+ case SEX_FEMALE:
+ activate_female_gestures = FEMALE_GESTURES_FOLDER;
+ break;
+ case SEX_BOTH:
+ activate_male_gestures = MALE_GESTURES_FOLDER;
+ activate_female_gestures = FEMALE_GESTURES_FOLDER;
+ break;
+ }
+
+ if (folder_name == activate_male_gestures ||
+ folder_name == activate_female_gestures ||
+ folder_name == COMMON_GESTURES_FOLDER ||
+ folder_name == OTHER_GESTURES_FOLDER)
+ {
+ cb = new ActivateGestureCallback;
+ }
+
+ LLUUID cat_id = findDescendentCategoryIDByName(lib_gesture_cat_id,folder_name);
+ if (cat_id.isNull())
+ {
+ llwarns << "failed to find gesture folder for " << folder_name << llendl;
+ }
+ else
+ {
+ llinfos << "initiating fetch and copy for " << folder_name << " cat_id " << cat_id << llendl;
+ callAfterCategoryFetch(cat_id,
+ boost::bind(&LLAppearanceMgr::shallowCopyCategory,
+ &LLAppearanceMgr::instance(),
+ cat_id, dst_id, cb));
+ }
+ }
+}
+
void LLAppearanceMgr::autopopulateOutfits()
{
// If this is the very first time the user has logged into viewer2+ (from a legacy viewer, or new account)
@@ -2284,10 +2370,19 @@ void LLAppearanceMgr::autopopulateOutfits()
// Handler for anything that's deferred until avatar de-clouds.
void LLAppearanceMgr::onFirstFullyVisible()
{
+ gAgentAvatarp->outputRezTiming("Avatar fully loaded");
+ gAgentAvatarp->reportAvatarRezTime();
gAgentAvatarp->debugAvatarVisible();
+
// The auto-populate is failing at the point of generating outfits
// folders, so don't do the library copy until that is resolved.
// autopopulateOutfits();
+
+ // If this is the first time we've ever logged in,
+ // then copy default gestures from the library.
+ if (gAgent.isFirstLogin()) {
+ copyLibraryGestures();
+ }
}
bool LLAppearanceMgr::updateBaseOutfit()
@@ -2465,10 +2560,11 @@ public:
// add may be processed after login process is finished
if (mShowPanel)
{
- LLSideTray::getInstance()->showPanel("panel_outfits_inventory", key);
+ LLFloaterSidePanelContainer::showPanel("appearance", "panel_outfits_inventory", key);
+
}
LLOutfitsList *outfits_list =
- dynamic_cast<LLOutfitsList*>(LLSideTray::getInstance()->getPanel("outfitslist_tab"));
+ dynamic_cast<LLOutfitsList*>(LLFloaterSidePanelContainer::getPanel("appearance", "outfitslist_tab"));
if (outfits_list)
{
outfits_list->setSelectedOutfitByUUID(mFolderID);
diff --git a/indra/newview/llappearancemgr.h b/indra/newview/llappearancemgr.h
index 4b1d95cf25..c1d561781d 100644
--- a/indra/newview/llappearancemgr.h
+++ b/indra/newview/llappearancemgr.h
@@ -151,6 +151,9 @@ public:
// Create initial outfits from library.
void autopopulateOutfits();
+
+ // Copy initial gestures from library.
+ void copyLibraryGestures();
void wearBaseOutfit();
diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index 12795a1ec6..f18e5d2c9e 100644
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -45,6 +45,8 @@
#include "llwindow.h"
#include "llviewerstats.h"
#include "llviewerstatsrecorder.h"
+#include "llmarketplacefunctions.h"
+#include "llmarketplacenotifications.h"
#include "llmd5.h"
#include "llmeshrepository.h"
#include "llpumpio.h"
@@ -75,13 +77,13 @@
//#include "llfirstuse.h"
#include "llrender.h"
#include "llteleporthistory.h"
+#include "lltoast.h"
#include "lllocationhistory.h"
#include "llfasttimerview.h"
#include "llvector4a.h"
#include "llviewermenufile.h"
#include "llvoicechannel.h"
#include "llvoavatarself.h"
-#include "llsidetray.h"
#include "llurlmatch.h"
#include "lltextutil.h"
#include "lllogininstance.h"
@@ -90,6 +92,7 @@
#include "llweb.h"
#include "llsecondlifeurls.h"
#include "llupdaterservice.h"
+#include "llcallfloater.h"
// Linden library includes
#include "llavatarnamecache.h"
@@ -108,8 +111,12 @@
#include "llnotifications.h"
#include "llnotificationsutil.h"
+#include "llleap.h"
+
// Third party library includes
#include <boost/bind.hpp>
+#include <boost/foreach.hpp>
+
#if LL_WINDOWS
@@ -119,7 +126,6 @@
#endif
#include "llapr.h"
-#include "apr_dso.h"
#include <boost/lexical_cast.hpp>
#include "llviewerkeyboard.h"
@@ -156,6 +162,7 @@
#include "llcontainerview.h"
#include "lltooltip.h"
+#include "llsdutil.h"
#include "llsdserialize.h"
#include "llworld.h"
@@ -520,6 +527,8 @@ static void settings_to_globals()
LLSurface::setTextureSize(gSavedSettings.getU32("RegionTextureSize"));
+ LLRender::sGLCoreProfile = gSavedSettings.getBOOL("RenderGLCoreProfile");
+
LLImageGL::sGlobalUseAnisotropic = gSavedSettings.getBOOL("RenderAnisotropic");
LLVOVolume::sLODFactor = gSavedSettings.getF32("RenderVolumeLODFactor");
LLVOVolume::sDistanceFactor = 1.f-LLVOVolume::sLODFactor * 0.1f;
@@ -554,42 +563,6 @@ static void settings_modify()
gDebugGL = gSavedSettings.getBOOL("RenderDebugGL") || gDebugSession;
gDebugPipeline = gSavedSettings.getBOOL("RenderDebugPipeline");
gAuditTexture = gSavedSettings.getBOOL("AuditTexture");
-#if LL_VECTORIZE
- if (gSysCPU.hasAltivec())
- {
- gSavedSettings.setBOOL("VectorizeEnable", TRUE );
- gSavedSettings.setU32("VectorizeProcessor", 0 );
- }
- else
- if (gSysCPU.hasSSE2())
- {
- gSavedSettings.setBOOL("VectorizeEnable", TRUE );
- gSavedSettings.setU32("VectorizeProcessor", 2 );
- }
- else
- if (gSysCPU.hasSSE())
- {
- gSavedSettings.setBOOL("VectorizeEnable", TRUE );
- gSavedSettings.setU32("VectorizeProcessor", 1 );
- }
- else
- {
- // Don't bother testing or running if CPU doesn't support it. JC
- gSavedSettings.setBOOL("VectorizePerfTest", FALSE );
- gSavedSettings.setBOOL("VectorizeEnable", FALSE );
- gSavedSettings.setU32("VectorizeProcessor", 0 );
- gSavedSettings.setBOOL("VectorizeSkin", FALSE);
- }
-#else
- // This build target doesn't support SSE, don't test/run.
- gSavedSettings.setBOOL("VectorizePerfTest", FALSE );
- gSavedSettings.setBOOL("VectorizeEnable", FALSE );
- gSavedSettings.setU32("VectorizeProcessor", 0 );
- gSavedSettings.setBOOL("VectorizeSkin", FALSE);
-
- // disable fullscreen mode, unsupported
- gSavedSettings.setBOOL("WindowFullScreen", FALSE);
-#endif
}
class LLFastTimerLogThread : public LLThread
@@ -724,7 +697,7 @@ bool LLAppViewer::init()
//set the max heap size.
initMaxHeapSize() ;
- LLPrivateMemoryPoolManager::initClass((BOOL)gSavedSettings.getBOOL("MemoryPrivatePoolEnabled")) ;
+ LLPrivateMemoryPoolManager::initClass((BOOL)gSavedSettings.getBOOL("MemoryPrivatePoolEnabled"), (U32)gSavedSettings.getU32("MemoryPrivatePoolSize")) ;
// write Google Breakpad minidump files to our log directory
std::string logdir = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, "");
@@ -751,7 +724,9 @@ bool LLAppViewer::init()
// *NOTE:Mani - LLCurl::initClass is not thread safe.
// Called before threads are created.
- LLCurl::initClass(gSavedSettings.getBOOL("CurlUseMultipleThreads"));
+ LLCurl::initClass(gSavedSettings.getF32("CurlRequestTimeOut"),
+ gSavedSettings.getS32("CurlMaximumNumberOfHandles"),
+ gSavedSettings.getBOOL("CurlUseMultipleThreads"));
LL_INFOS("InitInfo") << "LLCurl initialized." << LL_ENDL ;
LLMachineID::init();
@@ -771,7 +746,7 @@ bool LLAppViewer::init()
LLViewerAssetStatsFF::init();
}
- initThreads();
+ initThreads();
LL_INFOS("InitInfo") << "Threads initialized." << LL_ENDL ;
// Initialize settings early so that the defaults for ignorable dialogs are
@@ -845,9 +820,9 @@ bool LLAppViewer::init()
LLWeb::initClass(); // do this after LLUI
// Provide the text fields with callbacks for opening Urls
- LLUrlAction::setOpenURLCallback(&LLWeb::loadURL);
- LLUrlAction::setOpenURLInternalCallback(&LLWeb::loadURLInternal);
- LLUrlAction::setOpenURLExternalCallback(&LLWeb::loadURLExternal);
+ LLUrlAction::setOpenURLCallback(boost::bind(&LLWeb::loadURL, _1, LLStringUtil::null, LLStringUtil::null));
+ LLUrlAction::setOpenURLInternalCallback(boost::bind(&LLWeb::loadURLInternal, _1, LLStringUtil::null, LLStringUtil::null));
+ LLUrlAction::setOpenURLExternalCallback(boost::bind(&LLWeb::loadURLExternal, _1, true, LLStringUtil::null));
LLUrlAction::setExecuteSLURLCallback(&LLURLDispatcher::dispatchFromTextEditor);
// Let code in llui access the viewer help floater
@@ -873,8 +848,6 @@ bool LLAppViewer::init()
LLAgent::parseTeleportMessages("teleport_strings.xml");
- LLViewerJointMesh::updateVectorize();
-
// load MIME type -> media impl mappings
std::string mime_types_name;
#if LL_DARWIN
@@ -1067,11 +1040,38 @@ bool LLAppViewer::init()
gGLActive = FALSE;
+
+ // Iterate over --leap command-line options. But this is a bit tricky: if
+ // there's only one, it won't be an array at all.
+ LLSD LeapCommand(gSavedSettings.getLLSD("LeapCommand"));
+ LL_DEBUGS("InitInfo") << "LeapCommand: " << LeapCommand << LL_ENDL;
+ if (LeapCommand.isDefined() && ! LeapCommand.isArray())
+ {
+ // If LeapCommand is actually a scalar value, make an array of it.
+ // Have to do it in two steps because LeapCommand.append(LeapCommand)
+ // trashes content! :-P
+ LLSD item(LeapCommand);
+ LeapCommand.append(item);
+ }
+ BOOST_FOREACH(const std::string& leap, llsd::inArray(LeapCommand))
+ {
+ LL_INFOS("InitInfo") << "processing --leap \"" << leap << '"' << LL_ENDL;
+ // We don't have any better description of this plugin than the
+ // user-specified command line. Passing "" causes LLLeap to derive a
+ // description from the command line itself.
+ // Suppress LLLeap::Error exception: trust LLLeap's own logging. We
+ // don't consider any one --leap command mission-critical, so if one
+ // fails, log it, shrug and carry on.
+ LLLeap::create("", leap, false); // exception=false
+ }
+
if (gSavedSettings.getBOOL("QAMode") && gSavedSettings.getS32("QAModeEventHostPort") > 0)
{
- loadEventHostModule(gSavedSettings.getS32("QAModeEventHostPort"));
+ LL_WARNS("InitInfo") << "QAModeEventHostPort DEPRECATED: "
+ << "lleventhost no longer supported as a dynamic library"
+ << LL_ENDL;
}
-
+
LLViewerMedia::initClass();
LL_INFOS("InitInfo") << "Viewer media initialized." << LL_ENDL ;
@@ -1124,9 +1124,12 @@ void LLAppViewer::checkMemory()
{
const static F32 MEMORY_CHECK_INTERVAL = 1.0f ; //second
//const static F32 MAX_QUIT_WAIT_TIME = 30.0f ; //seconds
- const static U32 MAX_SIZE_CHECKED_MEMORY_BLOCK = 64 * 1024 * 1024 ; //64 MB
//static F32 force_quit_timer = MAX_QUIT_WAIT_TIME + MEMORY_CHECK_INTERVAL ;
- static void* last_reserved_address = NULL ;
+
+ if(!gGLManager.mDebugGPU)
+ {
+ return ;
+ }
if(MEMORY_CHECK_INTERVAL > mMemCheckTimer.getElapsedTimeF32())
{
@@ -1134,53 +1137,12 @@ void LLAppViewer::checkMemory()
}
mMemCheckTimer.reset() ;
- if(gGLManager.mDebugGPU)
- {
//update the availability of memory
LLMemory::updateMemoryInfo() ;
- }
- //check the virtual address space fragmentation
- if(!last_reserved_address)
- {
- last_reserved_address = LLMemory::tryToAlloc(last_reserved_address, MAX_SIZE_CHECKED_MEMORY_BLOCK) ;
- }
- else
- {
- last_reserved_address = LLMemory::tryToAlloc(last_reserved_address, MAX_SIZE_CHECKED_MEMORY_BLOCK) ;
- if(!last_reserved_address) //failed, try once more
- {
- last_reserved_address = LLMemory::tryToAlloc(last_reserved_address, MAX_SIZE_CHECKED_MEMORY_BLOCK) ;
- }
- }
-
- S32 is_low = !last_reserved_address || LLMemory::isMemoryPoolLow() ;
-
- //if(is_low < 0) //to force quit
- //{
- // if(force_quit_timer > MAX_QUIT_WAIT_TIME) //just hit the limit for the first time
- // {
- // //send out the notification to tell the viewer is about to quit in 30 seconds.
- // LLNotification::Params params("ForceQuitDueToLowMemory");
- // LLNotifications::instance().add(params);
-
- // force_quit_timer = MAX_QUIT_WAIT_TIME - MEMORY_CHECK_INTERVAL ;
- // }
- // else
- // {
- // force_quit_timer -= MEMORY_CHECK_INTERVAL ;
- // if(force_quit_timer < 0.f)
- // {
- // forceQuit() ; //quit
- // }
- // }
- //}
- //else
- //{
- // force_quit_timer = MAX_QUIT_WAIT_TIME + MEMORY_CHECK_INTERVAL ;
- //}
+ bool is_low = LLMemory::isMemoryPoolLow() ;
- LLPipeline::throttleNewMemoryAllocation(!is_low ? FALSE : TRUE) ;
+ LLPipeline::throttleNewMemoryAllocation(is_low) ;
if(is_low)
{
@@ -1213,7 +1175,7 @@ bool LLAppViewer::mainLoop()
//-------------------------------------------
// Create IO Pump to use for HTTP Requests.
- gServicePump = new LLPumpIO;
+ gServicePump = new LLPumpIO(gAPRPoolp);
LLHTTPClient::setPump(*gServicePump);
LLCurl::setCAFile(gDirUtilp->getCAFile());
@@ -1221,6 +1183,7 @@ bool LLAppViewer::mainLoop()
LLVoiceChannel::initClass();
LLVoiceClient::getInstance()->init(gServicePump);
+ LLVoiceChannel::setCurrentVoiceChannelChangedCallback(boost::bind(&LLCallFloater::sOnCurrentChannelChanged, _1), true);
LLTimer frameTimer,idleTimer;
LLTimer debugTime;
LLViewerJoystick* joystick(LLViewerJoystick::getInstance());
@@ -1255,7 +1218,7 @@ bool LLAppViewer::mainLoop()
if (gViewerWindow)
{
LLFastTimer t2(FTM_MESSAGES);
- gViewerWindow->mWindow->processMiscNativeEvents();
+ gViewerWindow->getWindow()->processMiscNativeEvents();
}
pingMainloopTimeout("Main:GatherInput");
@@ -1268,7 +1231,7 @@ bool LLAppViewer::mainLoop()
llwarns << " Someone took over my signal/exception handler (post messagehandling)!" << llendl;
}
- gViewerWindow->mWindow->gatherInput();
+ gViewerWindow->getWindow()->gatherInput();
}
#if 1 && !LL_RELEASE_FOR_DOWNLOAD
@@ -1297,9 +1260,9 @@ bool LLAppViewer::mainLoop()
// Scan keyboard for movement keys. Command keys and typing
// are handled by windows callbacks. Don't do this until we're
// done initializing. JC
- if ((gHeadlessClient || gViewerWindow->mWindow->getVisible())
+ if ((gHeadlessClient || gViewerWindow->getWindow()->getVisible())
&& gViewerWindow->getActive()
- && !gViewerWindow->mWindow->getMinimized()
+ && !gViewerWindow->getWindow()->getMinimized()
&& LLStartUp::getStartupState() == STATE_STARTED
&& (gHeadlessClient || !gViewerWindow->getShowProgress())
&& !gFocusMgr.focusLocked())
@@ -1378,7 +1341,7 @@ bool LLAppViewer::mainLoop()
}
// yield cooperatively when not running as foreground window
- if ( (gViewerWindow && !gViewerWindow->mWindow->getVisible())
+ if ( (gViewerWindow && !gViewerWindow->getWindow()->getVisible())
|| !gFocusMgr.getAppHasFocus())
{
// Sleep if we're not rendering, or the window is minimized.
@@ -1416,17 +1379,19 @@ bool LLAppViewer::mainLoop()
{
S32 work_pending = 0;
S32 io_pending = 0;
+ F32 max_time = llmin(gFrameIntervalSeconds*10.f, 1.f);
+
{
LLFastTimer ftm(FTM_TEXTURE_CACHE);
- work_pending += LLAppViewer::getTextureCache()->update(1); // unpauses the texture cache thread
+ work_pending += LLAppViewer::getTextureCache()->update(max_time); // unpauses the texture cache thread
}
{
LLFastTimer ftm(FTM_DECODE);
- work_pending += LLAppViewer::getImageDecodeThread()->update(1); // unpauses the image thread
+ work_pending += LLAppViewer::getImageDecodeThread()->update(max_time); // unpauses the image thread
}
{
LLFastTimer ftm(FTM_DECODE);
- work_pending += LLAppViewer::getTextureFetch()->update(1); // unpauses the texture fetch thread
+ work_pending += LLAppViewer::getTextureFetch()->update(max_time); // unpauses the texture fetch thread
}
{
@@ -1452,6 +1417,11 @@ bool LLAppViewer::mainLoop()
}
}
gMeshRepo.update() ;
+
+ if(!LLCurl::getCurlThread()->update(1))
+ {
+ LLCurl::getCurlThread()->pause() ; //nothing in the curl thread.
+ }
if(!total_work_pending) //pause texture fetching threads if nothing to process.
{
@@ -1546,6 +1516,9 @@ void LLAppViewer::flushVFSIO()
bool LLAppViewer::cleanup()
{
+ //ditch LLVOAvatarSelf instance
+ gAgentAvatarp = NULL;
+
// workaround for DEV-35406 crash on shutdown
LLEventPumps::instance().reset();
@@ -1571,17 +1544,24 @@ bool LLAppViewer::cleanup()
gDirUtilp->deleteFilesInDir(logdir, "*-*-*-*-*.dmp");
}
- // *TODO - generalize this and move DSO wrangling to a helper class -brad
- for(std::map<apr_dso_handle_t*, boost::shared_ptr<LLAPRPool> >::iterator plugin = mPlugins.begin();
- plugin != mPlugins.end(); ++plugin)
{
- int (*ll_plugin_stop_func)(void) = NULL;
- apr_status_t rv = apr_dso_sym((apr_dso_handle_sym_t*)&ll_plugin_stop_func, plugin->first, "ll_plugin_stop");
- ll_plugin_stop_func();
-
- rv = apr_dso_unload(plugin->first);
- }
- mPlugins.clear(); // Forget handles and destroy all memory pools.
+ // Kill off LLLeap objects. We can find them all because LLLeap is derived
+ // from LLInstanceTracker. But collect instances first: LLInstanceTracker
+ // specifically forbids adding/deleting instances while iterating.
+ std::vector<LLLeap*> leaps;
+ leaps.reserve(LLLeap::instanceCount());
+ for (LLLeap::instance_iter li(LLLeap::beginInstances()), lend(LLLeap::endInstances());
+ li != lend; ++li)
+ {
+ leaps.push_back(&*li);
+ }
+ // Okay, now trash them all. We don't have to NULL or erase the entry
+ // in 'leaps' because the whole vector is going away momentarily.
+ BOOST_FOREACH(LLLeap* leap, leaps)
+ {
+ delete leap;
+ }
+ } // destroy 'leaps'
//flag all elements as needing to be destroyed immediately
// to ensure shutdown order
@@ -1847,6 +1827,7 @@ bool LLAppViewer::cleanup()
pending += LLAppViewer::getTextureFetch()->update(1); // unpauses the texture fetch thread
pending += LLVFSThread::updateClass(0);
pending += LLLFSThread::updateClass(0);
+ pending += LLCurl::getCurlThread()->update(1) ;
F64 idle_time = idleTimer.getElapsedTimeF64();
if(!pending)
{
@@ -1858,6 +1839,7 @@ bool LLAppViewer::cleanup()
break;
}
}
+ LLCurl::getCurlThread()->pause() ;
// Delete workers first
// shotdown all worker threads before deleting them in case of co-dependencies
@@ -2005,6 +1987,8 @@ bool LLAppViewer::initThreads()
static const bool enable_threads = true;
#endif
+ LLImage::initClass();
+
LLVFSThread::initClass(enable_threads && false);
LLLFSThread::initClass(enable_threads && false);
@@ -2014,12 +1998,11 @@ bool LLAppViewer::initThreads()
LLAppViewer::sTextureFetch = new LLTextureFetch(LLAppViewer::getTextureCache(),
sImageDecodeThread,
enable_threads && true,
- app_metrics_qa_mode);
- LLImage::initClass();
+ app_metrics_qa_mode);
if (LLFastTimer::sLog || LLFastTimer::sMetricLog)
{
- LLFastTimer::sLogLock = new LLMutex;
+ LLFastTimer::sLogLock = new LLMutex(NULL);
mFastTimerLogThread = new LLFastTimerLogThread(LLFastTimer::sLogName);
mFastTimerLogThread->start();
}
@@ -2080,42 +2063,37 @@ bool LLAppViewer::loadSettingsFromDirectory(const std::string& location_key,
llerrs << "Invalid settings location list" << llendl;
}
- for(LLInitParam::ParamIterator<SettingsGroup>::const_iterator it = mSettingsLocationList->groups.begin(), end_it = mSettingsLocationList->groups.end();
- it != end_it;
- ++it)
+ BOOST_FOREACH(const SettingsGroup& group, mSettingsLocationList->groups)
{
// skip settings groups that aren't the one we requested
- if (it->name() != location_key) continue;
+ if (group.name() != location_key) continue;
- ELLPath path_index = (ELLPath)it->path_index();
+ ELLPath path_index = (ELLPath)group.path_index();
if(path_index <= LL_PATH_NONE || path_index >= LL_PATH_LAST)
{
llerrs << "Out of range path index in app_settings/settings_files.xml" << llendl;
return false;
}
- LLInitParam::ParamIterator<SettingsFile>::const_iterator file_it, end_file_it;
- for (file_it = it->files.begin(), end_file_it = it->files.end();
- file_it != end_file_it;
- ++file_it)
+ BOOST_FOREACH(const SettingsFile& file, group.files)
{
- llinfos << "Attempting to load settings for the group " << file_it->name()
+ llinfos << "Attempting to load settings for the group " << file.name()
<< " - from location " << location_key << llendl;
- LLControlGroup* settings_group = LLControlGroup::getInstance(file_it->name);
+ LLControlGroup* settings_group = LLControlGroup::getInstance(file.name);
if(!settings_group)
{
- llwarns << "No matching settings group for name " << file_it->name() << llendl;
+ llwarns << "No matching settings group for name " << file.name() << llendl;
continue;
}
std::string full_settings_path;
- if (file_it->file_name_setting.isProvided()
- && gSavedSettings.controlExists(file_it->file_name_setting))
+ if (file.file_name_setting.isProvided()
+ && gSavedSettings.controlExists(file.file_name_setting))
{
// try to find filename stored in file_name_setting control
- full_settings_path = gSavedSettings.getString(file_it->file_name_setting);
+ full_settings_path = gSavedSettings.getString(file.file_name_setting);
if (full_settings_path.empty())
{
continue;
@@ -2129,16 +2107,16 @@ bool LLAppViewer::loadSettingsFromDirectory(const std::string& location_key,
else
{
// by default, use specified file name
- full_settings_path = gDirUtilp->getExpandedFilename((ELLPath)path_index, file_it->file_name());
+ full_settings_path = gDirUtilp->getExpandedFilename((ELLPath)path_index, file.file_name());
}
- if(settings_group->loadFromFile(full_settings_path, set_defaults, file_it->persistent))
+ if(settings_group->loadFromFile(full_settings_path, set_defaults, file.persistent))
{ // success!
llinfos << "Loaded settings file " << full_settings_path << llendl;
}
else
{ // failed to load
- if(file_it->required)
+ if(file.required)
{
llerrs << "Error: Cannot load required settings file from: " << full_settings_path << llendl;
return false;
@@ -2161,20 +2139,15 @@ bool LLAppViewer::loadSettingsFromDirectory(const std::string& location_key,
std::string LLAppViewer::getSettingsFilename(const std::string& location_key,
const std::string& file)
{
- for(LLInitParam::ParamIterator<SettingsGroup>::const_iterator it = mSettingsLocationList->groups.begin(), end_it = mSettingsLocationList->groups.end();
- it != end_it;
- ++it)
+ BOOST_FOREACH(const SettingsGroup& group, mSettingsLocationList->groups)
{
- if (it->name() == location_key)
+ if (group.name() == location_key)
{
- LLInitParam::ParamIterator<SettingsFile>::const_iterator file_it, end_file_it;
- for (file_it = it->files.begin(), end_file_it = it->files.end();
- file_it != end_file_it;
- ++file_it)
+ BOOST_FOREACH(const SettingsFile& settings_file, group.files)
{
- if (file_it->name() == file)
+ if (settings_file.name() == file)
{
- return file_it->file_name;
+ return settings_file.file_name;
}
}
}
@@ -2326,7 +2299,7 @@ bool LLAppViewer::initConfiguration()
if (gSavedSettings.getBOOL("FirstRunThisInstall"))
{
- gSavedSettings.setString("SessionSettingsFile", "settings.xml");
+ // Note that the "FirstRunThisInstall" settings is currently unused.
gSavedSettings.setBOOL("FirstRunThisInstall", FALSE);
}
@@ -2870,48 +2843,15 @@ void LLAppViewer::initUpdater()
void LLAppViewer::checkForCrash(void)
{
-
#if LL_SEND_CRASH_REPORTS
if (gLastExecEvent == LAST_EXEC_FROZE)
{
- llinfos << "Last execution froze, requesting to send crash report." << llendl;
- //
- // Pop up a freeze or crash warning dialog
- //
- S32 choice;
- const S32 cb = gCrashSettings.getS32("CrashSubmitBehavior");
- if(cb == CRASH_BEHAVIOR_ASK)
- {
- std::ostringstream msg;
- msg << LLTrans::getString("MBFrozenCrashed");
- std::string alert = LLTrans::getString("APP_NAME") + " " + LLTrans::getString("MBAlert");
- choice = OSMessageBox(msg.str(),
- alert,
- OSMB_YESNO);
- }
- else if(cb == CRASH_BEHAVIOR_NEVER_SEND)
- {
- choice = OSBTN_NO;
- }
- else
- {
- choice = OSBTN_YES;
- }
-
- if (OSBTN_YES == choice)
- {
- llinfos << "Sending crash report." << llendl;
+ llinfos << "Last execution froze, sending a crash report." << llendl;
- bool report_freeze = true;
- handleCrashReporting(report_freeze);
- }
- else
- {
- llinfos << "Not sending crash report." << llendl;
- }
+ bool report_freeze = true;
+ handleCrashReporting(report_freeze);
}
#endif // LL_SEND_CRASH_REPORTS
-
}
//
@@ -2937,11 +2877,21 @@ bool LLAppViewer::initWindow()
// always start windowed
BOOL ignorePixelDepth = gSavedSettings.getBOOL("IgnorePixelDepth");
- gViewerWindow = new LLViewerWindow(gWindowTitle,
- VIEWER_WINDOW_CLASSNAME,
- gSavedSettings.getS32("WindowX"), gSavedSettings.getS32("WindowY"),
- gSavedSettings.getS32("WindowWidth"), gSavedSettings.getS32("WindowHeight"),
- gSavedSettings.getBOOL("WindowFullScreen"), ignorePixelDepth);
+
+ LLViewerWindow::Params window_params;
+ window_params
+ .title(gWindowTitle)
+ .name(VIEWER_WINDOW_CLASSNAME)
+ .x(gSavedSettings.getS32("WindowX"))
+ .y(gSavedSettings.getS32("WindowY"))
+ .width(gSavedSettings.getU32("WindowWidth"))
+ .height(gSavedSettings.getU32("WindowHeight"))
+ .min_width(gSavedSettings.getU32("MinWindowWidth"))
+ .min_height(gSavedSettings.getU32("MinWindowHeight"))
+ .fullscreen(gSavedSettings.getBOOL("FullScreen"))
+ .ignore_pixel_depth(ignorePixelDepth);
+
+ gViewerWindow = new LLViewerWindow(window_params);
LL_INFOS("AppInit") << "gViewerwindow created." << LL_ENDL;
@@ -2968,7 +2918,7 @@ bool LLAppViewer::initWindow()
if (gSavedSettings.getBOOL("WindowMaximized"))
{
- gViewerWindow->mWindow->maximize();
+ gViewerWindow->getWindow()->maximize();
}
//
@@ -3011,7 +2961,7 @@ bool LLAppViewer::initWindow()
if (gSavedSettings.getBOOL("WindowMaximized"))
{
- gViewerWindow->mWindow->maximize();
+ gViewerWindow->getWindow()->maximize();
}
LLUI::sWindow = gViewerWindow->getWindow();
@@ -3023,7 +2973,7 @@ bool LLAppViewer::initWindow()
gViewerWindow->initBase();
// show viewer window
- //gViewerWindow->mWindow->show();
+ //gViewerWindow->getWindow()->show();
LL_INFOS("AppInit") << "Window initialization done." << LL_ENDL;
return true;
@@ -3057,12 +3007,12 @@ void LLAppViewer::cleanupSavedSettings()
// as we don't track it in callbacks
if(NULL != gViewerWindow)
{
- BOOL maximized = gViewerWindow->mWindow->getMaximized();
+ BOOL maximized = gViewerWindow->getWindow()->getMaximized();
if (!maximized)
{
LLCoordScreen window_pos;
- if (gViewerWindow->mWindow->getPosition(&window_pos))
+ if (gViewerWindow->getWindow()->getPosition(&window_pos))
{
gSavedSettings.setS32("WindowX", window_pos.mX);
gSavedSettings.setS32("WindowY", window_pos.mY);
@@ -3162,6 +3112,8 @@ void LLAppViewer::handleViewerCrash()
llinfos << "Last render pool type: " << LLPipeline::sCurRenderPoolType << llendl ;
+ LLMemory::logMemoryInfo(true) ;
+
//print out recorded call stacks if there are any.
LLError::LLCallStacks::print();
@@ -3267,7 +3219,8 @@ void LLAppViewer::handleViewerCrash()
else crash_file_name = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,ERROR_MARKER_FILE_NAME);
llinfos << "Creating crash marker file " << crash_file_name << llendl;
- LLAPRFile crash_file(crash_file_name, LL_APR_W);
+ LLAPRFile crash_file ;
+ crash_file.open(crash_file_name, LL_APR_W);
if (crash_file.getFileHandle())
{
LL_INFOS("MarkerFile") << "Created crash marker file " << crash_file_name << LL_ENDL;
@@ -3331,10 +3284,11 @@ bool LLAppViewer::anotherInstanceRunning()
LL_DEBUGS("MarkerFile") << "Checking marker file for lock..." << LL_ENDL;
//Freeze case checks
- if (LLAPRFile::isExist(marker_file, LL_APR_RB))
+ if (LLAPRFile::isExist(marker_file, NULL, LL_APR_RB))
{
// File exists, try opening with write permissions
- LLAPRFile outfile(marker_file, LL_APR_WB);
+ LLAPRFile outfile ;
+ outfile.open(marker_file, LL_APR_WB);
apr_file_t* fMarker = outfile.getFileHandle() ;
if (!fMarker)
{
@@ -3373,25 +3327,25 @@ void LLAppViewer::initMarkerFile()
std::string llerror_marker_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, LLERROR_MARKER_FILE_NAME);
std::string error_marker_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, ERROR_MARKER_FILE_NAME);
- if (LLAPRFile::isExist(mMarkerFileName, LL_APR_RB) && !anotherInstanceRunning())
+ if (LLAPRFile::isExist(mMarkerFileName, NULL, LL_APR_RB) && !anotherInstanceRunning())
{
gLastExecEvent = LAST_EXEC_FROZE;
LL_INFOS("MarkerFile") << "Exec marker found: program froze on previous execution" << LL_ENDL;
}
- if(LLAPRFile::isExist(logout_marker_file, LL_APR_RB))
+ if(LLAPRFile::isExist(logout_marker_file, NULL, LL_APR_RB))
{
gLastExecEvent = LAST_EXEC_LOGOUT_FROZE;
LL_INFOS("MarkerFile") << "Last exec LLError crashed, setting LastExecEvent to " << gLastExecEvent << LL_ENDL;
LLAPRFile::remove(logout_marker_file);
}
- if(LLAPRFile::isExist(llerror_marker_file, LL_APR_RB))
+ if(LLAPRFile::isExist(llerror_marker_file, NULL, LL_APR_RB))
{
if(gLastExecEvent == LAST_EXEC_LOGOUT_FROZE) gLastExecEvent = LAST_EXEC_LOGOUT_CRASH;
else gLastExecEvent = LAST_EXEC_LLERROR_CRASH;
LL_INFOS("MarkerFile") << "Last exec LLError crashed, setting LastExecEvent to " << gLastExecEvent << LL_ENDL;
LLAPRFile::remove(llerror_marker_file);
}
- if(LLAPRFile::isExist(error_marker_file, LL_APR_RB))
+ if(LLAPRFile::isExist(error_marker_file, NULL, LL_APR_RB))
{
if(gLastExecEvent == LAST_EXEC_LOGOUT_FROZE) gLastExecEvent = LAST_EXEC_LOGOUT_CRASH;
else gLastExecEvent = LAST_EXEC_OTHER_CRASH;
@@ -3407,7 +3361,7 @@ void LLAppViewer::initMarkerFile()
// Create the marker file for this execution & lock it
apr_status_t s;
- s = mMarkerFile.open(mMarkerFileName, LL_APR_W, LLAPRFile::long_lived);
+ s = mMarkerFile.open(mMarkerFileName, LL_APR_W, TRUE);
if (s == APR_SUCCESS && mMarkerFile.getFileHandle())
{
@@ -3502,8 +3456,6 @@ void LLAppViewer::requestQuit()
gFloaterView->closeAllChildren(true);
}
- LLSideTray::getInstance()->notifyChildren(LLSD().with("request","quit"));
-
send_stats();
gLogoutTimer.reset();
@@ -3522,20 +3474,6 @@ static bool finish_quit(const LLSD& notification, const LLSD& response)
}
static LLNotificationFunctorRegistration finish_quit_reg("ConfirmQuit", finish_quit);
-static bool switch_standard_skin_and_quit(const LLSD& notification, const LLSD& response)
-{
- S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
-
- if (option == 0)
- {
- gSavedSettings.setString("SessionSettingsFile", "");
- LLAppViewer::instance()->requestQuit();
- }
- return false;
-}
-
-static LLNotificationFunctorRegistration standard_skin_quit_reg("SwitchToStandardSkinAndQuit", switch_standard_skin_and_quit);
-
void LLAppViewer::userQuit()
{
if (gDisconnected || gViewerWindow->getProgressView()->getVisible())
@@ -4159,6 +4097,7 @@ void LLAppViewer::idle()
LLFrameTimer::updateFrameTime();
LLFrameTimer::updateFrameCount();
LLEventTimer::updateClass();
+ LLNotificationsUI::LLToast::updateClass();
LLCriticalDamp::updateInterpolants();
LLMortician::updateClass();
LLFilePickerThread::clearDead(); //calls LLFilePickerThread::notify()
@@ -4362,7 +4301,7 @@ void LLAppViewer::idle()
///////////////////////////////////////
// Agent and camera movement
//
- LLCoordGL current_mouse = gViewerWindow->getCurrentMouse();
+ LLCoordGL current_mouse = gViewerWindow->getCurrentMouse();
{
// After agent and camera moved, figure out if we need to
@@ -4508,6 +4447,10 @@ void LLAppViewer::idle()
// update media focus
LLViewerMediaFocus::getInstance()->update();
+
+ // Update marketplace
+ LLMarketplaceInventoryImporter::update();
+ LLMarketplaceInventoryNotifications::update();
// objects and camera should be in sync, do LOD calculations now
{
@@ -4564,10 +4507,6 @@ void LLAppViewer::idleShutdown()
return;
}
- if (LLSideTray::getInstance()->notifyChildren(LLSD().with("request","wait_quit")))
- {
- return;
- }
@@ -4653,7 +4592,8 @@ void LLAppViewer::sendLogoutRequest()
gLogoutInProgress = TRUE;
mLogoutMarkerFileName = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,LOGOUT_MARKER_FILE_NAME);
- LLAPRFile outfile(mLogoutMarkerFileName, LL_APR_W);
+ LLAPRFile outfile ;
+ outfile.open(mLogoutMarkerFileName, LL_APR_W);
mLogoutMarkerFile = outfile.getFileHandle() ;
if (mLogoutMarkerFile)
{
@@ -5054,89 +4994,6 @@ void LLAppViewer::handleLoginComplete()
writeDebugInfo();
}
-// *TODO - generalize this and move DSO wrangling to a helper class -brad
-void LLAppViewer::loadEventHostModule(S32 listen_port)
-{
- std::string dso_name =
-#if LL_WINDOWS
- "lleventhost.dll";
-#elif LL_DARWIN
- "liblleventhost.dylib";
-#else
- "liblleventhost.so";
-#endif
-
- std::string dso_path = gDirUtilp->findFile(dso_name,
- gDirUtilp->getAppRODataDir(),
- gDirUtilp->getExecutableDir());
-
- if(dso_path == "")
- {
- llerrs << "QAModeEventHost requested but module \"" << dso_name << "\" not found!" << llendl;
- return;
- }
-
- LL_INFOS("eventhost") << "Found lleventhost at '" << dso_path << "'" << LL_ENDL;
-#if ! defined(LL_WINDOWS)
- {
- std::string outfile("/tmp/lleventhost.file.out");
- std::string command("file '" + dso_path + "' > '" + outfile + "' 2>&1");
- int rc = system(command.c_str());
- if (rc != 0)
- {
- LL_WARNS("eventhost") << command << " ==> " << rc << ':' << LL_ENDL;
- }
- else
- {
- LL_INFOS("eventhost") << command << ':' << LL_ENDL;
- }
- {
- std::ifstream reader(outfile.c_str());
- std::string line;
- while (std::getline(reader, line))
- {
- size_t len = line.length();
- if (len && line[len-1] == '\n')
- line.erase(len-1);
- LL_INFOS("eventhost") << line << LL_ENDL;
- }
- }
- remove(outfile.c_str());
- }
-#endif // LL_WINDOWS
-
- boost::shared_ptr<LLAPRPool> eventhost_dso_memory_pool_ptr(new LLAPRPool);
- LLAPRPool& eventhost_dso_memory_pool(*eventhost_dso_memory_pool_ptr);
- apr_dso_handle_t* eventhost_dso_handle = NULL;
-
- //attempt to load the shared library
- eventhost_dso_memory_pool.create();
- apr_status_t rv = apr_dso_load(&eventhost_dso_handle,
- dso_path.c_str(),
- eventhost_dso_memory_pool());
- llassert_always(! ll_apr_warn_status(rv, eventhost_dso_handle));
- llassert_always(eventhost_dso_handle != NULL);
-
- int (*ll_plugin_start_func)(LLSD const &) = NULL;
- rv = apr_dso_sym((apr_dso_handle_sym_t*)&ll_plugin_start_func, eventhost_dso_handle, "ll_plugin_start");
-
- llassert_always(! ll_apr_warn_status(rv, eventhost_dso_handle));
- llassert_always(ll_plugin_start_func != NULL);
-
- LLSD args;
- args["listen_port"] = listen_port;
-
- int status = ll_plugin_start_func(args);
-
- if(status != 0)
- {
- llerrs << "problem loading eventhost plugin, status: " << status << llendl;
- }
-
- // Store the handle and link it to the pool that was used to allocate it.
- mPlugins[eventhost_dso_handle] = eventhost_dso_memory_pool_ptr;
-}
-
void LLAppViewer::launchUpdater()
{
LLSD query_map = LLSD::emptyMap();
diff --git a/indra/newview/llappviewer.h b/indra/newview/llappviewer.h
index 168aaf5d94..f7d019ccba 100644
--- a/indra/newview/llappviewer.h
+++ b/indra/newview/llappviewer.h
@@ -41,8 +41,6 @@ class LLTextureFetch;
class LLWatchdogTimeout;
class LLUpdaterService;
-struct apr_dso_handle_t;
-
class LLAppViewer : public LLApp
{
public:
@@ -220,8 +218,6 @@ private:
void sendLogoutRequest();
void disconnectViewer();
-
- void loadEventHostModule(S32 listen_port);
// *FIX: the app viewer class should be some sort of singleton, no?
// Perhaps its child class is the singleton and this should be an abstract base.
@@ -270,8 +266,6 @@ private:
LLAllocator mAlloc;
- std::map<apr_dso_handle_t*, boost::shared_ptr<LLAPRPool> > mPlugins;
-
LLFrameTimer mMemCheckTimer;
boost::scoped_ptr<LLUpdaterService> mUpdater;
diff --git a/indra/newview/llappviewerlinux.cpp b/indra/newview/llappviewerlinux.cpp
index db11462fcb..48d02dfeaa 100644
--- a/indra/newview/llappviewerlinux.cpp
+++ b/indra/newview/llappviewerlinux.cpp
@@ -111,7 +111,6 @@ int main( int argc, char **argv )
}
delete viewer_app_ptr;
viewer_app_ptr = NULL;
-
return 0;
}
diff --git a/indra/newview/llappviewerlinux_api_dbus.cpp b/indra/newview/llappviewerlinux_api_dbus.cpp
index 1ae469dfcf..32e7e0a83d 100644
--- a/indra/newview/llappviewerlinux_api_dbus.cpp
+++ b/indra/newview/llappviewerlinux_api_dbus.cpp
@@ -27,11 +27,11 @@
#if LL_DBUS_ENABLED
#include "linden_common.h"
-#include "llaprpool.h"
extern "C" {
#include <dbus/dbus-glib.h>
+#include "apr_pools.h"
#include "apr_dso.h"
}
@@ -44,7 +44,7 @@ extern "C" {
#undef LL_DBUS_SYM
static bool sSymsGrabbed = false;
-static LLAPRPool sSymDBUSDSOMemoryPool;
+static apr_pool_t *sSymDBUSDSOMemoryPool = NULL;
static apr_dso_handle_t *sSymDBUSDSOHandleG = NULL;
bool grab_dbus_syms(std::string dbus_dso_name)
@@ -63,11 +63,11 @@ bool grab_dbus_syms(std::string dbus_dso_name)
#define LL_DBUS_SYM(REQUIRED, DBUSSYM, RTN, ...) do{rv = apr_dso_sym((apr_dso_handle_sym_t*)&ll##DBUSSYM, sSymDBUSDSOHandle, #DBUSSYM); if (rv != APR_SUCCESS) {INFOMSG("Failed to grab symbol: %s", #DBUSSYM); if (REQUIRED) sym_error = true;} else DEBUGMSG("grabbed symbol: %s from %p", #DBUSSYM, (void*)ll##DBUSSYM);}while(0)
//attempt to load the shared library
- sSymDBUSDSOMemoryPool.create();
+ apr_pool_create(&sSymDBUSDSOMemoryPool, NULL);
if ( APR_SUCCESS == (rv = apr_dso_load(&sSymDBUSDSOHandle,
dbus_dso_name.c_str(),
- sSymDBUSDSOMemoryPool()) ))
+ sSymDBUSDSOMemoryPool) ))
{
INFOMSG("Found DSO: %s", dbus_dso_name.c_str());
@@ -109,7 +109,11 @@ void ungrab_dbus_syms()
sSymDBUSDSOHandleG = NULL;
}
- sSymDBUSDSOMemoryPool.destroy();
+ if ( sSymDBUSDSOMemoryPool )
+ {
+ apr_pool_destroy(sSymDBUSDSOMemoryPool);
+ sSymDBUSDSOMemoryPool = NULL;
+ }
// NULL-out all of the symbols we'd grabbed
#define LL_DBUS_SYM(REQUIRED, DBUSSYM, RTN, ...) do{ll##DBUSSYM = NULL;}while(0)
diff --git a/indra/newview/llappviewermacosx.cpp b/indra/newview/llappviewermacosx.cpp
index 8929c0c1a4..c2916717bd 100644
--- a/indra/newview/llappviewermacosx.cpp
+++ b/indra/newview/llappviewermacosx.cpp
@@ -113,7 +113,6 @@ int main( int argc, char **argv )
}
delete viewer_app_ptr;
viewer_app_ptr = NULL;
-
return 0;
}
diff --git a/indra/newview/llappviewerwin32.cpp b/indra/newview/llappviewerwin32.cpp
index f94c843ad9..647ace7ee3 100644
--- a/indra/newview/llappviewerwin32.cpp
+++ b/indra/newview/llappviewerwin32.cpp
@@ -403,11 +403,9 @@ bool LLAppViewerWin32::initHardwareTest()
//
if (FALSE == gSavedSettings.getBOOL("NoHardwareProbe"))
{
- BOOL vram_only = !gSavedSettings.getBOOL("ProbeHardwareOnStartup");
-
// per DEV-11631 - disable hardware probing for everything
// but vram.
- vram_only = TRUE;
+ BOOL vram_only = TRUE;
LLSplashScreen::update(LLTrans::getString("StartupDetectingHardware"));
diff --git a/indra/newview/llassetuploadresponders.cpp b/indra/newview/llassetuploadresponders.cpp
index 966f5b941e..65bfc990d1 100644
--- a/indra/newview/llassetuploadresponders.cpp
+++ b/indra/newview/llassetuploadresponders.cpp
@@ -78,6 +78,8 @@ void on_new_single_inventory_upload_complete(
const LLSD& server_response,
S32 upload_price)
{
+ bool success = false;
+
if ( upload_price > 0 )
{
// this upload costed us L$, update our balance
@@ -152,6 +154,7 @@ void on_new_single_inventory_upload_complete(
gInventory.updateItem(item);
gInventory.notifyObservers();
+ success = true;
// Show the preview panel for textures and sounds to let
// user know that the image (or snapshot) arrived intact.
@@ -175,6 +178,13 @@ void on_new_single_inventory_upload_complete(
// remove the "Uploading..." message
LLUploadDialog::modalUploadFinished();
+
+ // Let the Snapshot floater know we have finished uploading a snapshot to inventory.
+ LLFloater* floater_snapshot = LLFloaterReg::findInstance("snapshot");
+ if (asset_type == LLAssetType::AT_TEXTURE && floater_snapshot)
+ {
+ floater_snapshot->notify(LLSD().with("set-finished", LLSD().with("ok", success).with("msg", "inventory")));
+ }
}
LLAssetUploadResponder::LLAssetUploadResponder(const LLSD &post_data,
@@ -285,6 +295,11 @@ void LLAssetUploadResponder::uploadFailure(const LLSD& content)
{
// remove the "Uploading..." message
LLUploadDialog::modalUploadFinished();
+ LLFloater* floater_snapshot = LLFloaterReg::findInstance("snapshot");
+ if (floater_snapshot)
+ {
+ floater_snapshot->notify(LLSD().with("set-finished", LLSD().with("ok", false).with("msg", "inventory")));
+ }
std::string reason = content["state"];
// deal with L$ errors
diff --git a/indra/newview/llavataractions.cpp b/indra/newview/llavataractions.cpp
index 4cdfcea64e..9a7cdcfa21 100755
--- a/indra/newview/llavataractions.cpp
+++ b/indra/newview/llavataractions.cpp
@@ -47,6 +47,7 @@
#include "llfloatergroups.h"
#include "llfloaterreg.h"
#include "llfloaterpay.h"
+#include "llfloatersidepanelcontainer.h"
#include "llfloaterwebcontent.h"
#include "llfloaterworldmap.h"
#include "llfolderview.h"
@@ -60,7 +61,6 @@
#include "llpaneloutfitedit.h"
#include "llpanelprofile.h"
#include "llrecentpeople.h"
-#include "llsidetray.h"
#include "lltrans.h"
#include "llviewercontrol.h"
#include "llviewerobjectlist.h"
@@ -302,6 +302,12 @@ void LLAvatarActions::startConference(const uuid_vec_t& ids)
make_ui_sound("UISndStartIM");
}
+static const char* get_profile_floater_name(const LLUUID& avatar_id)
+{
+ // Use different floater XML for our profile to be able to save its rect.
+ return avatar_id == gAgentID ? "my_profile" : "profile";
+}
+
static void on_avatar_name_show_profile(const LLUUID& agent_id, const LLAvatarName& av_name)
{
std::string username = av_name.mUsername;
@@ -314,14 +320,10 @@ static void on_avatar_name_show_profile(const LLUUID& agent_id, const LLAvatarNa
std::string url = getProfileURL(username);
// PROFILES: open in webkit window
- const bool show_chrome = false;
- static LLCachedControl<LLRect> profile_rect(gSavedSettings, "WebProfileRect");
- LLFloaterWebContent::create(LLFloaterWebContent::Params().
- url(url).
- id(agent_id.asString()).
- show_chrome(show_chrome).
- window_class("profile").
- preferred_media_size(profile_rect));
+ LLFloaterWebContent::Params p;
+ p.url(url).
+ id(agent_id.asString());
+ LLFloaterReg::showInstance(get_profile_floater_name(agent_id), p);
}
// static
@@ -338,17 +340,24 @@ bool LLAvatarActions::profileVisible(const LLUUID& id)
{
LLSD sd;
sd["id"] = id;
- LLFloaterWebContent *browser = dynamic_cast<LLFloaterWebContent*> (LLFloaterReg::findInstance("profile", sd));
+ LLFloater* browser = getProfileFloater(id);
return browser && browser->isShown();
}
+//static
+LLFloater* LLAvatarActions::getProfileFloater(const LLUUID& id)
+{
+ LLFloaterWebContent *browser = dynamic_cast<LLFloaterWebContent*>
+ (LLFloaterReg::findInstance(get_profile_floater_name(id), LLSD().with("id", id)));
+ return browser;
+}
//static
void LLAvatarActions::hideProfile(const LLUUID& id)
{
LLSD sd;
sd["id"] = id;
- LLFloaterWebContent *browser = dynamic_cast<LLFloaterWebContent*> (LLFloaterReg::findInstance("profile", sd));
+ LLFloater* browser = getProfileFloater(id);
if (browser)
{
browser->closeFloater();
@@ -438,8 +447,7 @@ void LLAvatarActions::csr(const LLUUID& id, std::string name)
void LLAvatarActions::share(const LLUUID& id)
{
LLSD key;
- LLSideTray::getInstance()->showPanel("sidepanel_inventory", key);
-
+ LLFloaterSidePanelContainer::showPanel("inventory", key);
LLUUID session_id = gIMMgr->computeSessionID(IM_NOTHING_SPECIAL,id);
@@ -462,7 +470,7 @@ namespace action_give_inventory
*/
static LLInventoryPanel* get_outfit_editor_inventory_panel()
{
- LLPanelOutfitEdit* panel_outfit_edit = dynamic_cast<LLPanelOutfitEdit*>(LLSideTray::getInstance()->getPanel("panel_outfit_edit"));
+ LLPanelOutfitEdit* panel_outfit_edit = dynamic_cast<LLPanelOutfitEdit*>(LLFloaterSidePanelContainer::getPanel("appearance", "panel_outfit_edit"));
if (NULL == panel_outfit_edit) return NULL;
LLInventoryPanel* inventory_panel = panel_outfit_edit->findChild<LLInventoryPanel>("folder_view");
@@ -672,12 +680,29 @@ namespace action_give_inventory
std::string items;
build_items_string(inventory_selected_uuids, items);
+ int folders_count = 0;
+ std::set<LLUUID>::const_iterator it = inventory_selected_uuids.begin();
+
+ //traverse through selected inventory items and count folders among them
+ for ( ; it != inventory_selected_uuids.end() && folders_count <=1 ; ++it)
+ {
+ LLViewerInventoryCategory* inv_cat = gInventory.getCategory(*it);
+ if (NULL != inv_cat)
+ {
+ folders_count++;
+ }
+ }
+
+ // EXP-1599
+ // In case of sharing multiple folders, make the confirmation
+ // dialog contain a warning that only one folder can be shared at a time.
+ std::string notification = (folders_count > 1) ? "ShareFolderConfirmation" : "ShareItemsConfirmation";
LLSD substitutions;
substitutions["RESIDENTS"] = residents;
substitutions["ITEMS"] = items;
LLShareInfo::instance().mAvatarNames = avatar_names;
LLShareInfo::instance().mAvatarUuids = avatar_uuids;
- LLNotificationsUtil::add("ShareItemsConfirmation", substitutions, LLSD(), &give_inventory_cb);
+ LLNotificationsUtil::add(notification, substitutions, LLSD(), &give_inventory_cb);
}
}
@@ -696,9 +721,11 @@ std::set<LLUUID> LLAvatarActions::getInventorySelectedUUIDs()
if (inventory_selected_uuids.empty())
{
- LLSidepanelInventory * sidepanel_inventory = LLSideTray::getInstance()->getPanel<LLSidepanelInventory>("sidepanel_inventory");
-
- inventory_selected_uuids = sidepanel_inventory->getInboxOrOutboxSelectionList();
+ LLSidepanelInventory *sidepanel_inventory = LLFloaterSidePanelContainer::getPanel<LLSidepanelInventory>("inventory");
+ if (sidepanel_inventory)
+ {
+ inventory_selected_uuids = sidepanel_inventory->getInboxSelectionList();
+ }
}
return inventory_selected_uuids;
diff --git a/indra/newview/llavataractions.h b/indra/newview/llavataractions.h
index fbfd815f41..748b7cb3d1 100644
--- a/indra/newview/llavataractions.h
+++ b/indra/newview/llavataractions.h
@@ -35,7 +35,7 @@
#include <vector>
class LLInventoryPanel;
-
+class LLFloater;
/**
* Friend-related actions (add, remove, offer teleport, etc)
@@ -96,6 +96,7 @@ public:
static void showProfile(const LLUUID& id);
static void hideProfile(const LLUUID& id);
static bool profileVisible(const LLUUID& id);
+ static LLFloater* getProfileFloater(const LLUUID& id);
/**
* Show avatar on world map.
diff --git a/indra/newview/llavatariconctrl.cpp b/indra/newview/llavatariconctrl.cpp
index 42e7decec1..b539ac38ed 100644..100755
--- a/indra/newview/llavatariconctrl.cpp
+++ b/indra/newview/llavatariconctrl.cpp
@@ -75,6 +75,9 @@ void LLAvatarIconIDCache::load ()
LLUUID icon_id;
LLDate date;
+ if (line.length()<=uuid_len*2)
+ continue; // short line, bail out to prevent substr calls throwing exception.
+
std::string avatar_id_str = line.substr(0,uuid_len);
std::string icon_id_str = line.substr(uuid_len,uuid_len);
diff --git a/indra/newview/llbottomtray.cpp b/indra/newview/llbottomtray.cpp
deleted file mode 100644
index c8cfe5b51e..0000000000
--- a/indra/newview/llbottomtray.cpp
+++ /dev/null
@@ -1,1991 +0,0 @@
-/**
- * @file llbottomtray.cpp
- * @brief LLBottomTray class implementation
- *
- * $LicenseInfo:firstyear=2009&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-#include "llviewerprecompiledheaders.h" // must be first include
-
-#define LLBOTTOMTRAY_CPP
-#include "llbottomtray.h"
-
-// library includes
-#include "llfloaterreg.h"
-#include "llflyoutbutton.h"
-#include "lllayoutstack.h"
-#include "llnotifications.h"
-#include "llnotificationsutil.h"
-#include "lltexteditor.h"
-
-// newview includes
-#include "llagent.h"
-#include "llagentcamera.h"
-#include "llavataractions.h"
-#include "llchiclet.h"
-#include "llfloatercamera.h"
-#include "llhints.h"
-#include "llimfloater.h" // for LLIMFloater
-#include "llnearbychatbar.h"
-#include "llnearbychatbarlistener.h"
-#include "llsidetray.h"
-#include "llspeakbutton.h"
-#include "llsplitbutton.h"
-#include "llsyswellwindow.h"
-#include "lltoolmgr.h"
-#include "llviewerparcelmgr.h"
-
-#include "llviewerwindow.h"
-#include "llsdserialize.h"
-#include "llfirstuse.h"
-
-// Distance from mouse down on which drag'n'drop should be started.
-#define DRAG_START_DISTANCE 3
-
-static const std::string SORTING_DATA_FILE_NAME = "bottomtray_buttons_order.xml";
-
-LLDefaultChildRegistry::Register<LLBottomtrayButton> bottomtray_button("bottomtray_button");
-
-// LLBottomtrayButton methods
-
-// virtual
-BOOL LLBottomtrayButton::handleHover(S32 x, S32 y, MASK mask)
-{
- if (mCanDrag)
- {
- // pass hover to bottomtray
- S32 screenX, screenY;
- localPointToScreen(x, y, &screenX, &screenY);
- LLBottomTray::getInstance()->onDraggableButtonHover(screenX, screenY);
-
- return TRUE;
- }
- else
- {
- return LLButton::handleHover(x, y, mask);
- }
-}
-//virtual
-BOOL LLBottomtrayButton::handleMouseUp(S32 x, S32 y, MASK mask)
-{
- if (mCanDrag)
- {
- S32 screenX, screenY;
- localPointToScreen(x, y, &screenX, &screenY);
- // pass mouse up to bottomtray
- LLBottomTray::getInstance()->onDraggableButtonMouseUp(this, screenX, screenY);
- }
- return LLButton::handleMouseUp(x, y, mask);
-}
-//virtual
-BOOL LLBottomtrayButton::handleMouseDown(S32 x, S32 y, MASK mask)
-{
- if (mCanDrag)
- {
- S32 screenX, screenY;
- localPointToScreen(x, y, &screenX, &screenY);
- // pass mouse up to bottomtray
- LLBottomTray::getInstance()->onDraggableButtonMouseDown(this, screenX, screenY);
- }
- return LLButton::handleMouseDown(x, y, mask);
-}
-
-static void update_build_button_enable_state()
-{
- bool can_edit = LLToolMgr::getInstance()->canEdit();
-
- LLBottomTray::getInstance()->getChildView("build_btn")->setEnabled(can_edit);
-}
-
-// Build time optimization, generate extern template once in .cpp file
-template class LLBottomTray* LLSingleton<class LLBottomTray>::getInstance();
-
-namespace
-{
- const std::string& PANEL_CHICLET_NAME = "chiclet_list_panel";
-
- S32 get_panel_min_width(LLLayoutStack* stack, LLView* panel)
- {
- S32 minimal_width = 0;
- llassert(stack);
- if ( stack && panel && panel->getVisible() )
- {
- stack->getPanelMinSize(panel->getName(), &minimal_width);
- }
- return minimal_width;
- }
-
- S32 get_panel_max_width(LLLayoutStack* stack, LLPanel* panel)
- {
- S32 max_width = 0;
- llassert(stack);
- if ( stack && panel && panel->getVisible() )
- {
- stack->getPanelMaxSize(panel->getName(), &max_width);
- }
- return max_width;
- }
-
- S32 get_curr_width(LLUICtrl* ctrl)
- {
- S32 cur_width = 0;
- if ( ctrl && ctrl->getVisible() )
- {
- cur_width = ctrl->getRect().getWidth();
- }
- return cur_width;
- }
-}
-
-class LLBottomTrayLite
- : public LLPanel
-{
-public:
- LLBottomTrayLite()
- : mNearbyChatBar(NULL),
- mChatBarContainer(NULL),
- mGesturePanel(NULL)
- {
- mFactoryMap["chat_bar"] = LLCallbackMap(LLBottomTray::createNearbyChatBar, NULL);
- buildFromFile("panel_bottomtray_lite.xml");
- }
-
- BOOL postBuild()
- {
- mNearbyChatBar = findChild<LLNearbyChatBar>("chat_bar");
- mChatBarContainer = getChild<LLLayoutPanel>("chat_bar_layout_panel");
- mGesturePanel = getChild<LLPanel>("gesture_panel");
-
- // Hide "show_nearby_chat" button
- if (mNearbyChatBar)
- {
- 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;
- }
-
- void onFocusLost()
- {
- if (gAgentCamera.cameraMouselook())
- {
- LLBottomTray::getInstance()->setVisible(FALSE);
- }
- }
-
- LLNearbyChatBar* mNearbyChatBar;
- LLLayoutPanel* mChatBarContainer;
- LLPanel* mGesturePanel;
-};
-
-LLBottomTray::LLBottomTray(const LLSD&)
-: mDesiredNearbyChatWidth(0),
- mChicletPanel(NULL),
- mSpeakPanel(NULL),
- mSpeakBtn(NULL),
- mNearbyChatBar(NULL),
- mChatBarContainer(NULL),
- mNearbyCharResizeHandlePanel(NULL),
- mToolbarStack(NULL),
- mMovementButton(NULL),
- mResizeState(RS_NORESIZE),
- mBottomTrayContextMenu(NULL),
- mCamButton(NULL),
- mBottomTrayLite(NULL),
- mIsInLiteMode(false),
- mDragStarted(false),
- mDraggedItem(NULL),
- mLandingTab(NULL),
- mCheckForDrag(false)
-{
- // Firstly add our self to IMSession observers, so we catch session events
- // before chiclets do that.
- LLIMMgr::getInstance()->addSessionObserver(this);
-
- mFactoryMap["chat_bar"] = LLCallbackMap(LLBottomTray::createNearbyChatBar, NULL);
-
- buildFromFile("panel_bottomtray.xml");
-
- LLUICtrl::CommitCallbackRegistry::defaultRegistrar().add("CameraPresets.ChangeView", boost::bind(&LLFloaterCamera::onClickCameraItem, _2));
-
- //this is to fix a crash that occurs because LLBottomTray is a singleton
- //and thus is deleted at the end of the viewers lifetime, but to be cleanly
- //destroyed LLBottomTray requires some subsystems that are long gone
- //LLUI::getRootView()->addChild(this);
-
- {
- mBottomTrayLite = new LLBottomTrayLite();
- mBottomTrayLite->setFollowsAll();
- mBottomTrayLite->setVisible(FALSE);
- }
-
- mImageDragIndication = LLUI::getUIImage(getString("DragIndicationImageName"));
- mDesiredNearbyChatWidth = mNearbyChatBar ? mNearbyChatBar->getRect().getWidth() : 0;
-}
-
-LLBottomTray::~LLBottomTray()
-{
- if (!LLSingleton<LLIMMgr>::destroyed())
- {
- LLIMMgr::getInstance()->removeSessionObserver(this);
- }
-
- if (mNearbyChatBar)
- {
- // store custom width of chatbar panel.
- S32 custom_width = mChatBarContainer->getRect().getWidth();
- gSavedSettings.setS32("ChatBarCustomWidth", custom_width);
- }
-
- // emulate previous floater behavior to be hidden on startup.
- // override effect of save_visibility=true.
- // this attribute is necessary to button.initial_callback=Button.SetFloaterToggle works properly:
- // i.g when floater changes its visibility - button changes its toggle state.
- getChild<LLUICtrl>("build_btn")->setControlValue(false);
- getChild<LLUICtrl>("search_btn")->setControlValue(false);
- getChild<LLUICtrl>("world_map_btn")->setControlValue(false);
-}
-
-// *TODO Vadim: why void* ?
-void* LLBottomTray::createNearbyChatBar(void* userdata)
-{
- return new LLNearbyChatBar();
-}
-
-LLNearbyChatBar* LLBottomTray::getNearbyChatBar()
-{
- return mIsInLiteMode ? mBottomTrayLite->mNearbyChatBar : mNearbyChatBar;
-}
-
-LLIMChiclet* LLBottomTray::createIMChiclet(const LLUUID& session_id)
-{
- LLIMChiclet::EType im_chiclet_type = LLIMChiclet::getIMSessionType(session_id);
-
- switch (im_chiclet_type)
- {
- case LLIMChiclet::TYPE_IM:
- return getChicletPanel()->createChiclet<LLIMP2PChiclet>(session_id);
- case LLIMChiclet::TYPE_GROUP:
- return getChicletPanel()->createChiclet<LLIMGroupChiclet>(session_id);
- case LLIMChiclet::TYPE_AD_HOC:
- return getChicletPanel()->createChiclet<LLAdHocChiclet>(session_id);
- case LLIMChiclet::TYPE_UNKNOWN:
- break;
- }
-
- return NULL;
-}
-
-//virtual
-void LLBottomTray::sessionAdded(const LLUUID& session_id, const std::string& name, const LLUUID& other_participant_id)
-{
- if (!getChicletPanel()) return;
-
- LLIMModel::LLIMSession* session = LLIMModel::getInstance()->findIMSession(session_id);
- if (!session) return;
-
- // no need to spawn chiclets for participants in P2P calls called through Avaline
- if (session->isP2P() && session->isOtherParticipantAvaline()) return;
-
- if (getChicletPanel()->findChiclet<LLChiclet>(session_id)) return;
-
- LLIMChiclet* chiclet = createIMChiclet(session_id);
- if(chiclet)
- {
- chiclet->setIMSessionName(name);
- chiclet->setOtherParticipantId(other_participant_id);
-
- LLIMFloater::onIMChicletCreated(session_id);
-
- }
- else
- {
- llerrs << "Could not create chiclet" << llendl;
- }
-}
-
-//virtual
-void LLBottomTray::sessionRemoved(const LLUUID& session_id)
-{
- if(getChicletPanel())
- {
- // IM floater should be closed when session removed and associated chiclet closed
- LLIMFloater* iMfloater = LLFloaterReg::findTypedInstance<LLIMFloater>(
- "impanel", session_id);
- if (iMfloater != NULL)
- {
- iMfloater->closeFloater();
- }
-
- getChicletPanel()->removeChiclet(session_id);
- }
-}
-
-void LLBottomTray::sessionIDUpdated(const LLUUID& old_session_id, const LLUUID& new_session_id)
-{
- //this is only needed in case of outgoing ad-hoc/group chat sessions
- LLChicletPanel* chiclet_panel = getChicletPanel();
- if (chiclet_panel)
- {
- //it should be ad-hoc im chiclet or group im chiclet
- LLChiclet* chiclet = chiclet_panel->findChiclet<LLChiclet>(old_session_id);
- if (chiclet) chiclet->setSessionId(new_session_id);
- }
-}
-
-S32 LLBottomTray::getTotalUnreadIMCount()
-{
- return getChicletPanel()->getTotalUnreadIMCount();
-}
-
-// virtual
-void LLBottomTray::onChange(EStatusType status, const std::string &channelURI, bool proximal)
-{
- // Time it takes to connect to voice channel might be pretty long,
- // so don't expect user login or STATUS_VOICE_ENABLED to be followed by STATUS_JOINED.
- BOOL enable = FALSE;
-
- switch (status)
- {
- // Do not add STATUS_VOICE_ENABLED because voice chat is
- // inactive until STATUS_JOINED
- case STATUS_JOINED:
- enable = TRUE;
- break;
- default:
- enable = FALSE;
- break;
- }
-
- // We have to enable/disable right and left parts of speak button separately (EXT-4648)
- getChild<LLButton>("speak_btn")->setEnabled(enable);
-
- // skipped to avoid button blinking
- if (status != STATUS_JOINING && status!= STATUS_LEFT_CHANNEL)
- {
- bool voice_status = LLVoiceClient::getInstance()->voiceEnabled() && LLVoiceClient::getInstance()->isVoiceWorking();
- getChild<LLButton>("speak_flyout_btn")->setEnabled(voice_status);
- gMenuBarView->getChild<LLView>("Nearby Voice")->setEnabled(voice_status);
- if (voice_status)
- {
- LLFirstUse::speak(true);
- }
- }
-}
-
-void LLBottomTray::onMouselookModeOut()
-{
- mIsInLiteMode = false;
- mBottomTrayLite->setVisible(FALSE);
- mNearbyChatBar->getChatBox()->setText(mBottomTrayLite->mNearbyChatBar->getChatBox()->getText());
- setVisible(TRUE);
-}
-
-void LLBottomTray::onMouselookModeIn()
-{
- setVisible(FALSE);
-
- // Attach the lite bottom tray
- if (getParent() && mBottomTrayLite->getParent() != getParent())
- getParent()->addChild(mBottomTrayLite);
-
- mBottomTrayLite->setShape(getLocalRect());
- mBottomTrayLite->mNearbyChatBar->getChatBox()->setText(mNearbyChatBar->getChatBox()->getText());
- mBottomTrayLite->mGesturePanel->setVisible(gSavedSettings.getBOOL("ShowGestureButton"));
-
- mIsInLiteMode = true;
-}
-
-//virtual
-// setVisible used instead of onVisibilityChange, since LLAgent calls it on entering/leaving mouselook mode.
-// If bottom tray is already visible in mouselook mode, then onVisibilityChange will not be called from setVisible(true),
-void LLBottomTray::setVisible(BOOL visible)
-{
- if (mIsInLiteMode)
- {
- mBottomTrayLite->setVisible(visible);
- }
- else
- {
- LLPanel::setVisible(visible);
- }
-}
-
-S32 LLBottomTray::notifyParent(const LLSD& info)
-{
- if(info.has("well_empty")) // implementation of EXT-3397
- {
- const std::string chiclet_name = info["well_name"];
-
- // only "im_well" or "notification_well" names are expected.
- // They are set in panel_bottomtray.xml in <chiclet_im_well> & <chiclet_notification>
- llassert("im_well" == chiclet_name || "notification_well" == chiclet_name);
-
- BOOL should_be_visible = !info["well_empty"];
- showWellButton("im_well" == chiclet_name ? RS_IM_WELL : RS_NOTIFICATION_WELL, should_be_visible);
- return 1;
- }
-
- if (info.has("action") && info["action"] == "resize")
- {
- const std::string& name = info["view_name"];
-
- // expected only resize of nearby chatbar
- if (mChatBarContainer->getName() != name) return LLPanel::notifyParent(info);
-
- const S32 new_width = info["new_width"];
-
- processChatbarCustomization(new_width);
-
- return 2;
- }
- return LLPanel::notifyParent(info);
-}
-
-void LLBottomTray::showBottomTrayContextMenu(S32 x, S32 y, MASK mask)
-{
- // We should show BottomTrayContextMenu in last turn
- if (mBottomTrayContextMenu && !LLMenuGL::sMenuContainer->getVisibleMenu())
- {
- //there are no other context menu (IM chiclet etc ), so we can show BottomTrayContextMenu
-
- updateContextMenu(x, y, mask);
- mBottomTrayContextMenu->buildDrawLabels();
- mBottomTrayContextMenu->updateParent(LLMenuGL::sMenuContainer);
- LLMenuGL::showPopup(this, mBottomTrayContextMenu, x, y);
-
- }
-}
-
-void LLBottomTray::updateContextMenu(S32 x, S32 y, MASK mask)
-{
- LLUICtrl* edit_box = mNearbyChatBar->getChild<LLUICtrl>("chat_box");
-
- S32 local_x = x - mChatBarContainer->getRect().mLeft - edit_box->getRect().mLeft;
- S32 local_y = y - mChatBarContainer->getRect().mBottom - edit_box->getRect().mBottom;
-
- bool in_edit_box = edit_box->pointInView(local_x, local_y);
-
- mBottomTrayContextMenu->setItemVisible("Separator", in_edit_box);
- mBottomTrayContextMenu->setItemVisible("NearbyChatBar_Cut", in_edit_box);
- mBottomTrayContextMenu->setItemVisible("NearbyChatBar_Copy", in_edit_box);
- mBottomTrayContextMenu->setItemVisible("NearbyChatBar_Paste", in_edit_box);
- mBottomTrayContextMenu->setItemVisible("NearbyChatBar_Delete", in_edit_box);
- mBottomTrayContextMenu->setItemVisible("NearbyChatBar_Select_All", in_edit_box);
-}
-
-void LLBottomTray::showSpeakButton(bool visible)
-{
- // Show/hide the button
- setTrayButtonVisible(RS_BUTTON_SPEAK, visible);
-
- // and adjust other panels according to the occupied/freed space.
- const S32 panel_width = mSpeakPanel->getRect().getWidth();
- if (visible)
- {
- processWidthDecreased(-panel_width);
- }
- else
- {
- processWidthIncreased(panel_width);
- }
-}
-
-void LLBottomTray::toggleMovementControls()
-{
- if (mMovementButton)
- mMovementButton->onCommit();
-}
-
-void LLBottomTray::toggleCameraControls()
-{
- if (mCamButton)
- mCamButton->onCommit();
-}
-
-BOOL LLBottomTray::postBuild()
-{
- LLHints::registerHintTarget("bottom_tray", LLView::getHandle());
- LLHints::registerHintTarget("dest_guide_btn", getChild<LLUICtrl>("destination_btn")->getHandle());
- LLHints::registerHintTarget("avatar_picker_btn", getChild<LLUICtrl>("avatar_btn")->getHandle());
-
- LLUICtrl::CommitCallbackRegistry::currentRegistrar().add("NearbyChatBar.Action", boost::bind(&LLBottomTray::onContextMenuItemClicked, this, _2));
- LLUICtrl::EnableCallbackRegistry::currentRegistrar().add("NearbyChatBar.EnableMenuItem", boost::bind(&LLBottomTray::onContextMenuItemEnabled, this, _2));
-
- mBottomTrayContextMenu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_bottomtray.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
- gMenuHolder->addChild(mBottomTrayContextMenu);
-
- mNearbyChatBar = findChild<LLNearbyChatBar>("chat_bar");
- LLHints::registerHintTarget("chat_bar", mNearbyChatBar->LLView::getHandle());
-
- mListener.reset(new LLNearbyChatBarListener(*mNearbyChatBar));
-
- mChatBarContainer = getChild<LLLayoutPanel>("chat_bar_layout_panel");
- mNearbyCharResizeHandlePanel = getChild<LLPanel>("chat_bar_resize_handle_panel");
-
- mToolbarStack = getChild<LLLayoutStack>("toolbar_stack");
- mMovementButton = getChild<LLButton>("movement_btn");
- LLHints::registerHintTarget("move_btn", mMovementButton->getHandle());
- mCamButton = getChild<LLButton>("camera_btn");
- setRightMouseDownCallback(boost::bind(&LLBottomTray::showBottomTrayContextMenu,this, _2, _3,_4));
-
- mSpeakPanel = getChild<LLPanel>("speak_panel");
- mSpeakBtn = findChild<LLSpeakButton>("talk");
- if (mSpeakBtn)
- {
- LLHints::registerHintTarget("speak_btn", mSpeakBtn->getHandle());
-
- // Localization tool doesn't understand custom buttons like <talk_button>
- mSpeakBtn->setSpeakToolTip( getString("SpeakBtnToolTip") );
- mSpeakBtn->setShowToolTip( getString("VoiceControlBtnToolTip") );
- }
- else
- {
- LLTransientFloaterMgr::getInstance()->addControlView(getChild<LLButton>("speak_btn"));
- LLTransientFloaterMgr::getInstance()->addControlView(getChild<LLButton>("flyout_btn"));
- }
-
-
- // Both parts of speak button should be initially disabled because
- // it takes some time between logging in to world and connecting to voice channel.
- getChild<LLButton>("speak_btn")->setEnabled(false);
- getChild<LLButton>("speak_flyout_btn")->setEnabled(false);
- gMenuBarView->getChild<LLView>("Nearby Voice")->setEnabled(false);
-
- // Registering Chat Bar to receive Voice client status change notifications.
- LLVoiceClient::getInstance()->addObserver(this);
-
- mNearbyChatBar->getChatBox()->setContextMenu(NULL);
-
- mChicletPanel = getChild<LLChicletPanel>("chiclet_list");
-
- initResizeStateContainers();
-
- setButtonsControlsAndListeners();
-
- initButtonsVisibility();
-
- // update wells visibility:
- showWellButton(RS_IM_WELL, !LLIMWellWindow::getInstance()->isWindowEmpty());
- showWellButton(RS_NOTIFICATION_WELL, !LLNotificationWellWindow::getInstance()->isWindowEmpty());
-
- loadButtonsOrder();
-
- LLViewerParcelMgr::getInstance()->addAgentParcelChangedCallback(boost::bind(&update_build_button_enable_state));
-
- return TRUE;
-}
-
-//Drag-n-drop
-
-void LLBottomTray::onDraggableButtonMouseDown(LLUICtrl* ctrl, S32 x, S32 y)
-{
- if (ctrl == NULL) return;
- LLView* parent_view = ctrl->getParent();
- if(parent_view != NULL)
- {
- // we actually drag'n'drop panel (not button) in code, so have to find a parent
- // of button which called this method on mouse down.
- LLPanel* parent = dynamic_cast<LLPanel*>(parent_view);
- // It may happen that we clicked not usual button, but button inside widget(speak, gesture)
- // so we'll need to get a level higher to reach layout panel as a parent.
- if(parent == NULL) parent = dynamic_cast<LLPanel*>(parent_view->getParent());
- if (parent && parent->getVisible())
- {
- mDraggedItem = parent;
- mCheckForDrag = true;
- mStartX = x;
- mStartY = y;
- }
- }
-}
-
-LLPanel* LLBottomTray::findChildPanelByLocalCoords(S32 x, S32 y)
-{
- LLPanel* ctrl = 0;
- S32 screenX, screenY;
- const child_list_t* list = mToolbarStack->getChildList();
-
- localPointToScreen(x, y, &screenX, &screenY);
-
- // look for a child panel which contains the point (screenX, screenY) in it's rectangle
- for (child_list_const_iter_t i = list->begin(); i != list->end(); ++i)
- {
- LLRect rect;
- localRectToScreen((*i)->getRect(), &rect);
-
- if (rect.pointInRect(screenX, screenY))
- {
- ctrl = dynamic_cast<LLPanel*>(*i);
- break;
- }
- }
-
- return ctrl;
-}
-
-void LLBottomTray::onDraggableButtonHover(S32 x, S32 y)
-{
- // if mouse down on draggable item was done, check whether we should start DnD
- if (mCheckForDrag)
- {
- // Start drag'n'drop if mouse cursor was dragged away frome mouse down location enough
- if(sqrt((float)((mStartX-x)*(mStartX-x)+(mStartY-y)*(mStartY-y))) > DRAG_START_DISTANCE)
- {
- mDragStarted = true;
- mCheckForDrag = false;
- }
- }
- if (mDragStarted)
- {
- // Check whether the cursor is over draggable area, find which panel it is and set is as
- // landing tab for drag'n'drop
- if(isCursorOverDraggableArea(x, y))
- {
- LLPanel* panel = findChildPanelByLocalCoords(x,y);
- if (panel && panel != mDraggedItem) mLandingTab = panel;
- gViewerWindow->getWindow()->setCursor(UI_CURSOR_ARROWDRAG);
- }
- else
- {
- gViewerWindow->getWindow()->setCursor(UI_CURSOR_NO);
- }
- }
- else
- {
- // Reset cursor in case you move your mouse from the drag handle to a button.
- getWindow()->setCursor(UI_CURSOR_ARROW);
-
- }
-}
-
-bool LLBottomTray::isCursorOverDraggableArea(S32 x, S32 y)
-{
- // Draggable area lasts from the nearby chat input resize handle
- // to the chiclet area (exlusively).
- bool result = getRect().pointInRect(x, y);
- result = result && mNearbyCharResizeHandlePanel->calcScreenRect().mRight < x;
- result = result && mChicletPanel->calcScreenRect().mRight > x;
- return result;
-}
-
-void LLBottomTray::updateButtonsOrdersAfterDnD()
-{
- // *TODO: change implementation of this method to support simplify it
- // (and according to future possible changes in the way button order is saved between sessions).
- state_object_map_t::const_iterator it = mStateProcessedObjectMap.begin();
- state_object_map_t::const_iterator it_end = mStateProcessedObjectMap.end();
- EResizeState dragged_state = RS_NORESIZE;
- EResizeState landing_state = RS_NORESIZE;
- bool landing_state_found = false;
- // Find states for dragged item and landing tab
- for (; it != it_end; ++it)
- {
- if (it->second == mDraggedItem)
- {
- dragged_state = it->first;
- }
- else if (it->second == mLandingTab)
- {
- landing_state = it->first;
- landing_state_found = true;
- }
- }
-
- if (dragged_state == RS_NORESIZE)
- {
- llwarns << "Cannot determine what button is being dragged" << llendl;
- llassert(dragged_state != RS_NORESIZE);
- return;
- }
-
- lldebugs << "Will place " << resizeStateToString(dragged_state)
- << " before " << resizeStateToString(landing_state) << llendl;
-
- // Update order of buttons according to drag'n'drop
- mButtonsOrder.erase(std::find(mButtonsOrder.begin(), mButtonsOrder.end(), dragged_state));
- if (!landing_state_found && mLandingTab == getChild<LLPanel>(PANEL_CHICLET_NAME))
- {
- mButtonsOrder.push_back(dragged_state);
- }
- else
- {
- if (!landing_state_found) landing_state = RS_BUTTON_SPEAK; // just a random fallback
- mButtonsOrder.insert(std::find(mButtonsOrder.begin(), mButtonsOrder.end(), landing_state), dragged_state);
- }
-
- // Synchronize button process order with their order
- resize_state_vec_t::const_iterator it1 = mButtonsOrder.begin();
- const resize_state_vec_t::const_iterator it_end1 = mButtonsOrder.end();
- resize_state_vec_t::iterator it2 = mButtonsProcessOrder.begin();
- for (; it1 != it_end1; ++it1)
- {
- // Skip Speak because it is not in mButtonsProcessOrder(it's the reason why mButtonsOrder was introduced).
- // If any other draggable items will be added to bottomtray later, they should also be skipped here.
- if (*it1 != RS_BUTTON_SPEAK)
- {
- *it2 = *it1;
- ++it2;
- }
- }
-
- saveButtonsOrder();
-}
-
-void LLBottomTray::saveButtonsOrder()
-{
- if (!gSavedSettings.getBOOL("AllowBottomTrayButtonReordering")) return;
-
- std::string user_dir = gDirUtilp->getLindenUserDir();
- if (user_dir.empty()) return;
-
- std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, SORTING_DATA_FILE_NAME);
- LLSD settings_llsd;
- int i = 0;
- const resize_state_vec_t::const_iterator it_end = mButtonsOrder.end();
- // we use numbers as keys for map which is saved in file and contains resize states as its values
- for (resize_state_vec_t::const_iterator it = mButtonsOrder.begin(); it != it_end; ++it, i++)
- {
- std::string str = llformat("%d", i);
- settings_llsd[str] = *it;
- }
- llofstream file;
- file.open(filename);
- LLSDSerialize::toPrettyXML(settings_llsd, file);
-}
-
-void LLBottomTray::loadButtonsOrder()
-{
- if (!gSavedSettings.getBOOL("AllowBottomTrayButtonReordering")) return;
-
- // load per-resident sorting information
- std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, SORTING_DATA_FILE_NAME);
-
- LLSD settings_llsd;
- llifstream file;
- file.open(filename);
- if (!file.is_open()) return;
-
- LLSDSerialize::fromXML(settings_llsd, file);
-
-
- mButtonsOrder.clear();
- mButtonsProcessOrder.clear();
- int i = 0;
- // getting button order from file
- for (LLSD::map_const_iterator iter = settings_llsd.beginMap();
- iter != settings_llsd.endMap(); ++iter, ++i)
- {
- std::string str = llformat("%d", i);
- EResizeState state = (EResizeState)settings_llsd[str].asInteger();
- mButtonsOrder.push_back(state);
- // RS_BUTTON_SPEAK is skipped, because it shouldn't be in mButtonsProcessOrder (it does not hide or shrink).
- if (state != RS_BUTTON_SPEAK)
- {
- mButtonsProcessOrder.push_back(state);
- }
- }
-
- // There are other panels in layout stack order of which is not saved. Also, panels order of which is saved,
- // are already in layout stack but in wrong order. The most convenient way to place them is moving them
- // to front one by one (because in this case we don't have to pass the panel before which we want to insert our
- // panel to movePanel()). So panels are moved in order from the end of mButtonsOrder vector(reverse iterator is used).
- const resize_state_vec_t::const_reverse_iterator it_end = mButtonsOrder.rend();
- // placing panels in layout stack according to button order which we loaded in previous for
- for (resize_state_vec_t::const_reverse_iterator it = mButtonsOrder.rbegin(); it != it_end; ++it, ++i)
- {
- LLPanel* panel_to_move = getButtonPanel(*it);
- mToolbarStack->movePanel(panel_to_move, NULL, true); // prepend
- }
- // Nearbychat is not stored in order settings file, but it must be the first of the panels, so moving it
- // (along with its drag handle) manually here.
- mToolbarStack->movePanel(getChild<LLLayoutPanel>("chat_bar_resize_handle_panel"), NULL, true);
- mToolbarStack->movePanel(mChatBarContainer, NULL, true);
-}
-
-void LLBottomTray::onDraggableButtonMouseUp(LLUICtrl* ctrl, S32 x, S32 y)
-{
- //if mouse up happened over area where drop is possible, change order of buttons
- if (mLandingTab != NULL && mDraggedItem != NULL && mDragStarted)
- {
- if(isCursorOverDraggableArea(x, y))
- {
- // change order of panels in layout stack
- mToolbarStack->movePanel(mDraggedItem, (LLPanel*)mLandingTab);
- // change order of buttons in order vectors
- updateButtonsOrdersAfterDnD();
- }
- }
- gViewerWindow->getWindow()->setCursor(UI_CURSOR_ARROW);
- mDragStarted = false;
- mDraggedItem = NULL;
- mLandingTab = NULL;
- mCheckForDrag = false;
-}
-
-void LLBottomTray::draw()
-{
- LLPanel::draw();
- if (mLandingTab)
- {
- static S32 w = mImageDragIndication->getWidth();
- static S32 h = mImageDragIndication->getHeight();
- LLRect rect = mLandingTab->calcScreenRect();
- mImageDragIndication->draw(rect.mLeft - w/2, rect.getHeight(), w, h);
- }
- getChild<LLButton>("show_profile_btn")->setToggleState(LLAvatarActions::profileVisible(gAgent.getID()));
-
- LLPanel* panel = LLSideTray::getInstance()->getPanel("panel_people");
- if (panel && panel->isInVisibleChain())
- {
- getChild<LLButton>("show_people_button")->setToggleState(true);
- }
- else
- {
- getChild<LLButton>("show_people_button")->setToggleState(false);
- }
-
- LLFloater* help_browser = (LLFloaterReg::findInstance("help_browser"));
- bool help_floater_visible = (help_browser && help_browser->isInVisibleChain());
-
- getChild<LLButton>("show_help_btn")->setToggleState(help_floater_visible);
-
- bool openmic = LLVoiceClient::getInstance()->getUserPTTState();
- bool voiceenabled = LLVoiceClient::getInstance()->voiceEnabled();
- getChild<LLButton>("speak_btn")->setToggleState(openmic && voiceenabled);
- getChild<LLOutputMonitorCtrl>("chat_zone_indicator")->setIsMuted(!voiceenabled);
-
-}
-
-bool LLBottomTray::onContextMenuItemEnabled(const LLSD& userdata)
-{
- std::string item = userdata.asString();
- LLLineEditor* edit_box = mNearbyChatBar->findChild<LLLineEditor>("chat_box");
-
- if (item == "can_cut")
- {
- return edit_box->canCut();
- }
- else if (item == "can_copy")
- {
- return edit_box->canCopy();
- }
- else if (item == "can_paste")
- {
- return edit_box->canPaste();
- }
- else if (item == "can_delete")
- {
- return edit_box->canDoDelete();
- }
- else if (item == "can_select_all")
- {
- return edit_box->canSelectAll() && (edit_box->getLength()>0);
- }
- return true;
-}
-
-
-void LLBottomTray::onContextMenuItemClicked(const LLSD& userdata)
-{
- std::string item = userdata.asString();
- LLLineEditor* edit_box = mNearbyChatBar->findChild<LLLineEditor>("chat_box");
-
- if (item == "cut")
- {
- edit_box->cut();
- }
- else if (item == "copy")
- {
- edit_box->copy();
- }
- else if (item == "paste")
- {
- edit_box->paste();
- edit_box->setFocus(TRUE);
- }
- else if (item == "delete")
- {
- edit_box->doDelete();
- }
- else if (item == "select_all")
- {
- edit_box->selectAll();
- }
-}
-
-void LLBottomTray::log(LLView* panel, const std::string& descr)
-{
- if (NULL == panel) return;
- LLView* layout = panel->getParent();
- LL_DEBUGS("Bottom Tray Rects") << descr << ": "
- << "panel: " << panel->getName()
- << ", rect: " << panel->getRect()
-
-
- << " layout: " << layout->getName()
- << ", rect: " << layout->getRect()
- << LL_ENDL;
-}
-
-void LLBottomTray::reshape(S32 width, S32 height, BOOL called_from_parent)
-{
- static S32 debug_calling_number = 0;
- lldebugs << "**************************************** " << ++debug_calling_number << llendl;
-
- S32 current_width = getRect().getWidth();
- S32 delta_width = width - current_width;
- lldebugs << "Reshaping: "
- << ", width: " << width
- << ", cur width: " << current_width
- << ", delta_width: " << delta_width
- << ", called_from_parent: " << called_from_parent
- << llendl;
-
- if (mNearbyChatBar) log(mNearbyChatBar, "before");
- if (mChicletPanel) log(mChicletPanel, "before");
-
- // Difference between bottom tray width required to fit its children and the actual width. (see EXT-991)
- // Positive value means that bottom tray is not wide enough.
- // Negative value means that there is free space.
- static S32 extra_shrink_width = 0;
- bool should_be_reshaped = true;
-
- if (mChicletPanel && mToolbarStack && mNearbyChatBar)
- {
- // Firstly, update layout stack to ensure we deal with correct panel sizes.
- {
- BOOL saved_anim = mToolbarStack->getAnimate();
- // Set chiclet panel to be autoresized by default.
- mToolbarStack->updatePanelAutoResize(PANEL_CHICLET_NAME, TRUE);
- // Disable animation to prevent layout updating in several frames.
- mToolbarStack->setAnimate(FALSE);
- // Force the updating of layout to reset panels collapse factor.
- mToolbarStack->updateLayout();
- // Restore animate state.
- mToolbarStack->setAnimate(saved_anim);
- }
-
- // bottom tray is narrowed
- if (delta_width < 0)
- {
- if (extra_shrink_width > 0) // not enough space
- {
- extra_shrink_width += llabs(delta_width);
- should_be_reshaped = false;
- }
- else
- {
- extra_shrink_width = processWidthDecreased(delta_width);
-
- // increase new width to extra_shrink_width value to not reshape less than bottom tray minimum
- width += extra_shrink_width;
- }
- }
- // bottom tray is widened
- else
- {
- if (extra_shrink_width > delta_width)
- {
- // Still not enough space.
- // Only subtract the delta from the required delta and don't reshape.
- extra_shrink_width -= delta_width;
- should_be_reshaped = false;
- }
- else
- {
- if (extra_shrink_width > 0)
- {
- // If we have some extra shrink width let's reduce delta_width & width
- delta_width -= extra_shrink_width;
- width -= extra_shrink_width;
- extra_shrink_width = 0;
- }
- processWidthIncreased(delta_width);
- }
- }
- }
-
- if (should_be_reshaped)
- {
- lldebugs << "Reshape all children with width: " << width << llendl;
- LLPanel::reshape(width, height, called_from_parent);
- }
-
- if (mNearbyChatBar) log(mNearbyChatBar, "after");
- if (mChicletPanel) log(mChicletPanel, "after");
-
-
- // Restore width of the chatbar on first reshape.
- // we can not to do this from postBuild because reshape is called from parent view on startup
- // creation after it and reset width according to resize logic.
- static bool needs_restore_custom_state = true;
- if (mChatBarContainer && needs_restore_custom_state)
- {
- // restore custom width of chatbar panel.
- S32 new_width = gSavedSettings.getS32("ChatBarCustomWidth");
- if (new_width > 0)
- {
- mDesiredNearbyChatWidth = new_width;
- processChatbarCustomization(new_width);
- lldebugs << "Setting nearby chat bar width to " << new_width << " px" << llendl;
- mChatBarContainer->reshape(new_width, mChatBarContainer->getRect().getHeight());
- }
- needs_restore_custom_state = false;
- }
-
-}
-
-S32 LLBottomTray::processWidthDecreased(S32 delta_width)
-{
- bool still_should_be_processed = true;
-
- const S32 chiclet_panel_shrink_headroom = getChicletPanelShrinkHeadroom();
-
- // There are four steps of processing width decrease. If in one of them required width was reached,
- // further are not needed.
- // 1. Decreasing width of chiclet panel.
- if (chiclet_panel_shrink_headroom > 0)
- {
- // we have some space to decrease chiclet panel
- S32 shrink_by = llmin(-delta_width, chiclet_panel_shrink_headroom);
-
- lldebugs << "delta_width: " << delta_width
- << ", panel_delta_min: " << chiclet_panel_shrink_headroom
- << ", shrink_by: " << shrink_by
- << llendl;
-
- // is chiclet panel wide enough to process resizing?
- delta_width += chiclet_panel_shrink_headroom;
-
- still_should_be_processed = delta_width < 0;
-
- lldebugs << "Shrinking chiclet panel by " << shrink_by << " px" << llendl;
- mChicletPanel->getParent()->reshape(mChicletPanel->getParent()->getRect().getWidth() - shrink_by, mChicletPanel->getParent()->getRect().getHeight());
- log(mChicletPanel, "after processing panel decreasing via chiclet panel");
-
- lldebugs << "RS_CHICLET_PANEL"
- << ", delta_width: " << delta_width
- << llendl;
- }
-
- S32 buttons_freed_width = 0;
- // 2. Decreasing width of buttons.
- if (still_should_be_processed)
- {
- processShrinkButtons(delta_width, buttons_freed_width);
- still_should_be_processed = delta_width < 0;
- }
-
- // 3. Decreasing width of nearby chat.
- const S32 chatbar_panel_min_width = get_panel_min_width(mToolbarStack, mChatBarContainer);
- const S32 chatbar_panel_width = mChatBarContainer->getRect().getWidth();
- if (still_should_be_processed && chatbar_panel_width > chatbar_panel_min_width)
- {
- // we have some space to decrease chatbar panel
- S32 chatbar_shrink_headroom = chatbar_panel_width - chatbar_panel_min_width;
-
- S32 shrink_by = llmin(-delta_width, chatbar_shrink_headroom);
-
- // is chatbar panel wide enough to process resizing?
- delta_width += chatbar_shrink_headroom;
-
- still_should_be_processed = delta_width < 0;
-
- // chatbar should only be shrunk here, not stretched
- if (shrink_by > 0)
- {
- lldebugs << "Shrinking nearby chat bar by " << shrink_by << " px " << llendl;
- mChatBarContainer->reshape(mNearbyChatBar->getRect().getWidth() - shrink_by, mChatBarContainer->getRect().getHeight());
- }
-
- log(mNearbyChatBar, "after processing panel decreasing via nearby chatbar panel");
-
- lldebugs << "RS_CHATBAR_INPUT"
- << ", shrink_by: " << shrink_by
- << ", delta_width: " << delta_width
- << llendl;
- }
-
- S32 extra_shrink_width = 0;
- // 4. Hiding buttons if needed.
- if (still_should_be_processed)
- {
- processHideButtons(delta_width, buttons_freed_width);
-
- if (delta_width < 0)
- {
- extra_shrink_width = -delta_width;
- llwarns << "There is no enough width to reshape all children: "
- << extra_shrink_width << llendl;
- }
-
- if (buttons_freed_width > 0)
- {
- S32 nearby_needed_width = mDesiredNearbyChatWidth - mNearbyChatBar->getRect().getWidth();
- if (nearby_needed_width > 0)
- {
- S32 compensative_width = nearby_needed_width > buttons_freed_width ? buttons_freed_width : nearby_needed_width;
- log(mNearbyChatBar, "before applying compensative width");
- lldebugs << "Extending nearby chat bar by " << compensative_width << " px" << llendl;
- mChatBarContainer->reshape(mChatBarContainer->getRect().getWidth() + compensative_width, mChatBarContainer->getRect().getHeight() );
- log(mNearbyChatBar, "after applying compensative width");
- lldebugs << buttons_freed_width << llendl;
- }
- }
- }
-
- return extra_shrink_width;
-}
-
-void LLBottomTray::processWidthIncreased(S32 delta_width)
-{
- if (delta_width <= 0) return;
-
- // how much room we have to show hidden buttons
- S32 available_width = delta_width + getChicletPanelShrinkHeadroom();
-
- lldebugs << "Distributing (" << getChicletPanelShrinkHeadroom()
- << " + " << delta_width << ") = " << available_width << " px" << llendl;
-
- // 1. Try showing buttons that have been auto-hidden.
- S32 processed_width = processShowButtons(available_width);
- lldebugs << "processed_width = " << processed_width << ", delta_width = " << delta_width << llendl;
-
- lldebugs << "Available_width after showing buttons: " << available_width << llendl;
-
- // If the newly shown buttons have consumed more than delta_width pixels,
- // shrink the chiclet panel.
- if (processed_width > delta_width)
- {
- // 1. use delta width of resizing
- S32 shrink_by = processed_width - delta_width;
-
- // 2. use width available via decreasing of chiclet panel
- if (shrink_by > 0)
- {
- lldebugs << "Shrinking chiclet panel by " << shrink_by << " px" << llendl;
- mChicletPanel->getParent()->reshape(mChicletPanel->getParent()->getRect().getWidth() - shrink_by, mChicletPanel->getParent()->getRect().getHeight());
- log(mChicletPanel, "after applying compensative width for chiclets: ");
- lldebugs << shrink_by << llendl;
- }
-
- // shown buttons take some space, rest should be processed by nearby chatbar & chiclet panels
- delta_width -= processed_width;
- }
-
- // 2. Expand the nearby chat bar if needed.
- S32 chatbar_panel_width = mChatBarContainer->getRect().getWidth();
- lldebugs << "delta_width = " << delta_width
- << ", chatbar_panel_width = " << chatbar_panel_width
- << ", mDesiredNearbyChatWidth = " << mDesiredNearbyChatWidth << llendl;
- if (delta_width > 0 && chatbar_panel_width < mDesiredNearbyChatWidth)
- {
- S32 extend_by_max = mDesiredNearbyChatWidth - chatbar_panel_width;
- S32 extend_by = llmin(delta_width, extend_by_max);
- lldebugs << "Unprocessed delta width: " << delta_width
- << " px, chatbar can be extended by " << extend_by_max
- << " px, extending it by " << extend_by << " px"
- << llendl;
-
- delta_width -= extend_by_max;
- lldebugs << "Extending nearby chat bar by " << extend_by << " px " << llendl;
- mChatBarContainer->reshape(chatbar_panel_width + extend_by, mChatBarContainer->getRect().getHeight());
- log(mNearbyChatBar, "applied unprocessed delta width");
- }
-
- // 3. Expand buttons that have been auto-shrunk,
- // if we haven't yet consumed all the available headroom.
- if (delta_width > 0)
- {
- S32 available_width = delta_width + getChicletPanelShrinkHeadroom();
- processExtendButtons(available_width);
- }
-}
-
-S32 LLBottomTray::processShowButtons(S32& available_width)
-{
- lldebugs << "Distributing " << available_width << " px" << llendl;
- S32 original_available_width = available_width;
-
- // process buttons from left to right
- resize_state_vec_t::const_iterator it = mButtonsProcessOrder.begin();
- const resize_state_vec_t::const_iterator it_end = mButtonsProcessOrder.end();
-
- for (; it != it_end; ++it)
- {
- // is there available space?
- if (available_width <= 0) break;
-
- // try to show next button
- processShowButton(*it, available_width);
- }
-
- return original_available_width - available_width;
-}
-
-bool LLBottomTray::processShowButton(EResizeState shown_object_type, S32& available_width)
-{
- // Check if the button was previously auto-hidden (due to lack of space).
- if (!isAutoHidden(shown_object_type))
- {
- return false;
- }
-
- // Ok. Try showing the button.
- return showButton(shown_object_type, available_width);
-}
-
-void LLBottomTray::processHideButtons(S32& required_width, S32& buttons_freed_width)
-{
- // process buttons from right to left
- resize_state_vec_t::const_reverse_iterator it = mButtonsProcessOrder.rbegin();
- const resize_state_vec_t::const_reverse_iterator it_end = mButtonsProcessOrder.rend();
-
- for (; it != it_end; ++it)
- {
- // is it still necessary to hide a button?
- if (required_width >= 0) break;
-
- // try to hide next button
- processHideButton(*it, required_width, buttons_freed_width);
- }
-}
-
-void LLBottomTray::processHideButton(EResizeState processed_object_type, S32& required_width, S32& buttons_freed_width)
-{
- lldebugs << "Trying to hide object type: " << processed_object_type << llendl;
- LLPanel* panel = getButtonPanel(processed_object_type);
- if (NULL == panel)
- {
- return;
- }
-
- if (panel->getVisible())
- {
- required_width += panel->getRect().getWidth();
-
- if (required_width > 0)
- {
- buttons_freed_width += required_width;
- }
-
- setTrayButtonVisible(processed_object_type, false);
-
- setAutoHidden(processed_object_type, true);
-
- lldebugs << "processing object type: " << processed_object_type
- << ", buttons_freed_width: " << buttons_freed_width
- << llendl;
- }
-}
-
-void LLBottomTray::processShrinkButtons(S32& required_width, S32& buttons_freed_width)
-{
- // process buttons from right to left
- resize_state_vec_t::const_reverse_iterator it = mButtonsProcessOrder.rbegin();
- const resize_state_vec_t::const_reverse_iterator it_end = mButtonsProcessOrder.rend();
-
- // iterate through buttons in the mButtonsProcessOrder first
- for (; it != it_end; ++it)
- {
- // is it still necessary to hide a button?
- if (required_width >= 0) break;
-
- // try to shrink next button
- processShrinkButton(*it, required_width);
- }
-
- // then shrink Speak button
- if (required_width < 0)
- {
- S32 panel_min_width = 0;
- std::string panel_name = mSpeakPanel->getName();
- bool success = mToolbarStack->getPanelMinSize(panel_name, &panel_min_width);
- if (!success)
- {
- lldebugs << "Panel was not found to get its min width: " << panel_name << llendl;
- }
- else
- {
- S32 panel_width = mSpeakPanel->getRect().getWidth();
- S32 possible_shrink_width = panel_width - panel_min_width;
-
- if (possible_shrink_width > 0)
- {
- if (mSpeakBtn)
- {
- mSpeakBtn->setLabelVisible(false);
- }
-
- mSpeakPanel->reshape(panel_width - possible_shrink_width, mSpeakPanel->getRect().getHeight());
-
- required_width += possible_shrink_width;
-
- if (required_width > 0)
- {
- buttons_freed_width += required_width;
- }
-
- lldebugs << "Shrunk Speak button panel: " << panel_name
- << ", shrunk width: " << possible_shrink_width
- << ", rest width to process: " << required_width
- << llendl;
- }
- }
- }
-}
-
-void LLBottomTray::processShrinkButton(EResizeState processed_object_type, S32& required_width)
-{
- LLPanel* panel = getButtonPanel(processed_object_type);
- if (NULL == panel)
- {
- return;
- }
-
- if (panel->getVisible())
- {
- S32 panel_width = panel->getRect().getWidth();
- S32 panel_min_width = 0;
- std::string panel_name = panel->getName();
- bool success = mToolbarStack->getPanelMinSize(panel_name, &panel_min_width);
- S32 possible_shrink_width = panel_width - panel_min_width;
-
- if (!success)
- {
- lldebugs << "Panel was not found to get its min width: " << panel_name << llendl;
- }
- // we have some space to free by shrinking the button
- else if (possible_shrink_width > 0)
- {
- // let calculate real width to shrink
-
- // 1. apply all possible width
- required_width += possible_shrink_width;
-
- // 2. it it is too much...
- if (required_width > 0)
- {
- // reduce applied shrunk width to the excessive value.
- possible_shrink_width -= required_width;
- required_width = 0;
- }
- panel->reshape(panel_width - possible_shrink_width, panel->getRect().getHeight());
-
- lldebugs << "Shrunk panel: " << panel_name
- << ", shrunk width: " << possible_shrink_width
- << ", rest width to process: " << required_width
- << llendl;
- }
- }
-}
-
-
-void LLBottomTray::processExtendButtons(S32& available_width)
-{
- // do not allow extending any buttons if we have some buttons hidden via resize
- if (isAutoHidden(RS_BUTTONS_CAN_BE_HIDDEN)) return;
-
- lldebugs << "Distributing " << available_width << " px" << llendl;
-
- // First try extending the Speak button.
- if (available_width > 0)
- {
- if (!processExtendSpeakButton(available_width))
- {
- // The Speak button needs extension but lacks some space.
- // Don't extend other buttons in this case: the Speak button
- // should consume the available headroom first.
- return;
- }
- }
-
- // Then process the other buttons from left to right.
- if (available_width > 0)
- {
- resize_state_vec_t::const_iterator it = mButtonsProcessOrder.begin();
- const resize_state_vec_t::const_iterator it_end = mButtonsProcessOrder.end();
-
- // iterate through buttons in the mButtonsProcessOrder first
- for (; it != it_end; ++it)
- {
- // is there available space?
- if (available_width <= 0) break;
-
- // try to extend next button
- processExtendButton(*it, available_width);
- }
- }
-}
-
-bool LLBottomTray::processExtendSpeakButton(S32& available_width)
-{
- if (available_width <= 0)
- {
- llassert(available_width > 0);
- return true;
- }
-
- const S32 panel_max_width = mObjectDefaultWidthMap[RS_BUTTON_SPEAK];
- const S32 panel_width = mSpeakPanel->getRect().getWidth();
- const S32 required_headroom = panel_max_width - panel_width;
-
- if (panel_width < panel_max_width) // if the button isn't extended already
- {
- if (available_width < required_headroom) // not enough space
- {
- lldebugs << "Need (" << required_headroom << " - " << available_width << ") = "
- << (required_headroom - available_width) << " more px"
- << " to extend the Speak button"<< llendl;
-
- return false; // Don't extend other buttons until we extend Speak.
- }
-
- // Reshape the Speak button to its maximum width.
- if (mSpeakBtn) mSpeakBtn->setLabelVisible(true);
- mSpeakPanel->reshape(panel_max_width, mSpeakPanel->getRect().getHeight());
-
- available_width -= required_headroom;
- llassert(available_width >= 0);
-
- lldebugs << "Extending Speak button panel: " << mSpeakPanel->getName()
- << ", extended width: " << required_headroom
- << ", rest width to process: " << available_width
- << llendl;
- }
-
- return true;
-}
-
-void LLBottomTray::processExtendButton(EResizeState processed_object_type, S32& available_width)
-{
- llassert(available_width >= 0);
-
- LLPanel* panel = getButtonPanel(processed_object_type);
- if (NULL == panel)
- {
- return;
- }
-
- if (!panel->getVisible()) return;
-
- // Widen the button up to its maximum width, but by not more than <available_width> px.
- S32 panel_max_width = mObjectDefaultWidthMap[processed_object_type];
- S32 panel_width = panel->getRect().getWidth();
- S32 required_headroom = panel_max_width - panel_width;
-
- S32 extend_by = llmin(available_width, required_headroom);
- if (extend_by > 0)
- {
- panel->reshape(panel_width + extend_by, panel->getRect().getHeight());
-
- // Decrease amount of headroom available for other panels.
- available_width -= extend_by;
-
- lldebugs << "Extending " << panel->getName()
- << " by " << extend_by
- << " px; remaining available width: " << available_width
- << llendl;
- }
-}
-
-bool LLBottomTray::canButtonBeShown(EResizeState processed_object_type) const
-{
- // Check that all buttons (that can be hidden on resize)
- // to the left of the given one are already shown.
-
- // process buttons in direct order (from left to right)
- resize_state_vec_t::const_iterator it = mButtonsProcessOrder.begin();
- const resize_state_vec_t::const_iterator it_end = mButtonsProcessOrder.end();
-
- MASK buttons_before_mask = RS_NORESIZE;
- for (; it != it_end; ++it)
- {
- const EResizeState button_type = *it;
- if (button_type == processed_object_type) break;
-
- buttons_before_mask |= button_type;
- }
-
- return !isAutoHidden(buttons_before_mask);
-}
-
-void LLBottomTray::initResizeStateContainers()
-{
- // init map with objects should be processed for each type
- mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_SPEAK, getChild<LLPanel>("speak_panel")));
- mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_GESTURES, getChild<LLPanel>("gesture_panel")));
- mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_MOVEMENT, getChild<LLPanel>("movement_panel")));
- mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_CAMERA, getChild<LLPanel>("cam_panel")));
- mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_DESTINATIONS, getChild<LLPanel>("destinations_panel")));
- mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_AVATARS, getChild<LLPanel>("avatar_panel")));
- mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_SNAPSHOT, getChild<LLPanel>("snapshot_panel")));
- mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_BUILD, getChild<LLPanel>("build_btn_panel")));
- mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_SEARCH, getChild<LLPanel>("search_btn_panel")));
- mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_WORLD_MAP, getChild<LLPanel>("world_map_btn_panel")));
- mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_MINI_MAP, getChild<LLPanel>("mini_map_btn_panel")));
- mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_SPLITTER_1, getChild<LLPanel>("splitter_panel_1")));
- mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_PEOPLE, getChild<LLPanel>("people_panel")));
- mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_PROFILE, getChild<LLPanel>("profile_panel")));
- mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_SPLITTER_2, getChild<LLPanel>("splitter_panel_2")));
- mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_HOWTO, getChild<LLPanel>("howto_panel")));
-
- // init an order of processed buttons
- mButtonsProcessOrder.push_back(RS_BUTTON_DESTINATIONS);
- mButtonsProcessOrder.push_back(RS_BUTTON_AVATARS);
- mButtonsProcessOrder.push_back(RS_BUTTON_SNAPSHOT);
- mButtonsProcessOrder.push_back(RS_BUTTON_BUILD);
- mButtonsProcessOrder.push_back(RS_BUTTON_SEARCH);
- mButtonsProcessOrder.push_back(RS_BUTTON_WORLD_MAP);
- mButtonsProcessOrder.push_back(RS_BUTTON_MINI_MAP);
- mButtonsProcessOrder.push_back(RS_BUTTON_SPLITTER_1);
- mButtonsProcessOrder.push_back(RS_BUTTON_PEOPLE);
- mButtonsProcessOrder.push_back(RS_BUTTON_PROFILE);
- mButtonsProcessOrder.push_back(RS_BUTTON_SPLITTER_2);
- mButtonsProcessOrder.push_back(RS_BUTTON_HOWTO);
- mButtonsProcessOrder.push_back(RS_BUTTON_MOVEMENT);
- mButtonsProcessOrder.push_back(RS_BUTTON_CAMERA);
- mButtonsProcessOrder.push_back(RS_BUTTON_GESTURES);
-
- mButtonsOrder.push_back(RS_BUTTON_SPEAK);
- mButtonsOrder.insert(mButtonsOrder.end(), mButtonsProcessOrder.begin(), mButtonsProcessOrder.end());
-
- // init default widths
-
- // process buttons that can be hidden on resize...
- resize_state_vec_t::const_iterator it = mButtonsProcessOrder.begin();
- const resize_state_vec_t::const_iterator it_end = mButtonsProcessOrder.end();
-
- for (; it != it_end; ++it)
- {
- const EResizeState button_type = *it;
- // is there an appropriate object?
- LLPanel* button_panel = getButtonPanel(button_type);
- if (!button_panel) continue;
-
- // set default width for it.
- mObjectDefaultWidthMap[button_type] = button_panel->getRect().getWidth();
- }
-
- // ... and add Speak button because it also can be shrunk.
- mObjectDefaultWidthMap[RS_BUTTON_SPEAK] = mSpeakPanel->getRect().getWidth();
-}
-
-// this method must be called before restoring of the chat entry field on startup
-// because it resets chatbar's width according to resize logic.
-void LLBottomTray::initButtonsVisibility()
-{
- setVisibleAndFitWidths(RS_BUTTON_SPEAK, gSavedSettings.getBOOL("EnableVoiceChat") || !mSpeakBtn );
- setVisibleAndFitWidths(RS_BUTTON_GESTURES, gSavedSettings.getBOOL("ShowGestureButton"));
- setVisibleAndFitWidths(RS_BUTTON_MOVEMENT, gSavedSettings.getBOOL("ShowMoveButton"));
- setVisibleAndFitWidths(RS_BUTTON_CAMERA, gSavedSettings.getBOOL("ShowCameraButton"));
- setVisibleAndFitWidths(RS_BUTTON_SNAPSHOT, gSavedSettings.getBOOL("ShowSnapshotButton"));
- setVisibleAndFitWidths(RS_BUTTON_BUILD, gSavedSettings.getBOOL("ShowBuildButton"));
- setVisibleAndFitWidths(RS_BUTTON_SEARCH, gSavedSettings.getBOOL("ShowSearchButton"));
- setVisibleAndFitWidths(RS_BUTTON_WORLD_MAP, gSavedSettings.getBOOL("ShowWorldMapButton"));
- setVisibleAndFitWidths(RS_BUTTON_MINI_MAP, gSavedSettings.getBOOL("ShowMiniMapButton"));
- lldebugs << "mResizeState = " << resizeStateMaskToString(mResizeState) << llendl;
-}
-
-void LLBottomTray::setButtonsControlsAndListeners()
-{
- // always show the speak panel if using the basic skin
- if (mSpeakBtn)
- {
- gSavedSettings.getControl("EnableVoiceChat")->getSignal()->connect(boost::bind(&LLBottomTray::toggleShowButton, RS_BUTTON_SPEAK, _2));
- }
-
- gSavedSettings.getControl("ShowGestureButton")->getSignal()->connect(boost::bind(&LLBottomTray::toggleShowButton, RS_BUTTON_GESTURES, _2));
- gSavedSettings.getControl("ShowMoveButton")->getSignal()->connect(boost::bind(&LLBottomTray::toggleShowButton, RS_BUTTON_MOVEMENT, _2));
- gSavedSettings.getControl("ShowCameraButton")->getSignal()->connect(boost::bind(&LLBottomTray::toggleShowButton, RS_BUTTON_CAMERA, _2));
- gSavedSettings.getControl("ShowSnapshotButton")->getSignal()->connect(boost::bind(&LLBottomTray::toggleShowButton, RS_BUTTON_SNAPSHOT, _2));
- gSavedSettings.getControl("ShowBuildButton")->getSignal()->connect(boost::bind(&LLBottomTray::toggleShowButton, RS_BUTTON_BUILD, _2));
- gSavedSettings.getControl("ShowSearchButton")->getSignal()->connect(boost::bind(&LLBottomTray::toggleShowButton, RS_BUTTON_SEARCH, _2));
- gSavedSettings.getControl("ShowWorldMapButton")->getSignal()->connect(boost::bind(&LLBottomTray::toggleShowButton, RS_BUTTON_WORLD_MAP, _2));
- gSavedSettings.getControl("ShowMiniMapButton")->getSignal()->connect(boost::bind(&LLBottomTray::toggleShowButton, RS_BUTTON_MINI_MAP, _2));
-
-
- LLButton* build_btn = getChild<LLButton>("build_btn");
- // set control name for Build button. It is not enough to link it with Button.SetFloaterToggle in xml
- std::string vis_control_name = LLFloaterReg::declareVisibilityControl("build");
- // Set the button control value (toggle state) to the floater visibility control (Sets the value as well)
- build_btn->setControlVariable(LLFloater::getControlGroup()->getControl(vis_control_name));
-}
-
-bool LLBottomTray::toggleShowButton(LLBottomTray::EResizeState button_type, const LLSD& new_visibility)
-{
- if (LLBottomTray::instanceExists())
- {
- LLBottomTray::getInstance()->setTrayButtonVisibleIfPossible(button_type, new_visibility.asBoolean());
- }
- return true;
-}
-
-bool LLBottomTray::showButton(EResizeState button_type, S32& available_width)
-{
- LLPanel* panel = getButtonPanel(button_type);
- if (NULL == panel)
- {
- return false;
- }
-
- if (panel->getVisible())
- {
- return false;
- }
-
- // Check if none of the buttons to the left of the given one was auto-hidden.
- // (we auto-show the buttons left to right).
- if (!canButtonBeShown(button_type))
- {
- return false;
- }
-
- // Make sure we have enough room to show this button.
- const S32 required_width = panel->getRect().getWidth();
- if (available_width < required_width)
- {
- lldebugs << "Need " << (required_width - available_width) << " more px to show " << resizeStateToString(button_type) << llendl;
- return false;
- }
-
- // All good. Show the button.
- setTrayButtonVisible(button_type, true);
-
- // Let the caller know that there is now less available space.
- available_width -= required_width;
-
- lldebugs << "Showing button " << resizeStateToString(button_type)
- << ", remaining available width: " << available_width
- << llendl;
- setAutoHidden(button_type, false);
-
- return true;
-}
-
-void LLBottomTray::setTrayButtonVisible(EResizeState shown_object_type, bool visible)
-{
- LLPanel* panel = getButtonPanel(shown_object_type);
- if (NULL == panel)
- {
- return;
- }
-
- panel->setVisible(visible);
-}
-
-void LLBottomTray::setTrayButtonVisibleIfPossible(EResizeState shown_object_type, bool visible, bool raise_notification)
-{
- if (!setVisibleAndFitWidths(shown_object_type, visible) && visible && raise_notification)
- {
- LLNotificationsUtil::add("BottomTrayButtonCanNotBeShown",
- LLSD(),
- LLSD(),
- LLNotificationFunctorRegistry::instance().DONOTHING);
- }
-}
-
-bool LLBottomTray::setVisibleAndFitWidths(EResizeState object_type, bool visible)
-{
- // The Speak button is treated specially: if voice is enabled,
- // the button should be displayed no matter how much space we've got.
- if (object_type == RS_BUTTON_SPEAK)
- {
- showSpeakButton(visible);
- return true;
- }
-
- LLPanel* cur_panel = getButtonPanel(object_type);
- if (NULL == cur_panel)
- {
- return false;
- }
-
- bool is_set = true;
-
- if (visible)
- {
- // Assume that only chiclet panel can be auto-resized
- const S32 available_width = getChicletPanelShrinkHeadroom();
-
- S32 preferred_width = mObjectDefaultWidthMap[object_type];
- S32 current_width = cur_panel->getRect().getWidth();
- S32 result_width = 0;
- bool decrease_width = false;
-
- if (preferred_width > 0 && available_width >= preferred_width)
- {
- result_width = preferred_width;
- }
- else if (available_width >= current_width)
- {
- result_width = current_width;
- }
- else
- {
- // Calculate the possible shrunk width as difference between current and minimal widths
- const S32 chatbar_shrunk_width =
- mChatBarContainer->getRect().getWidth() - get_panel_min_width(mToolbarStack, mChatBarContainer);
-
- S32 sum_of_min_widths = get_panel_min_width(mToolbarStack, mSpeakPanel);
- S32 sum_of_curr_widths = get_curr_width(mSpeakPanel);
-
- resize_state_vec_t::const_iterator it = mButtonsProcessOrder.begin();
- const resize_state_vec_t::const_iterator it_end = mButtonsProcessOrder.end();
-
- for (; it != it_end; ++it)
- {
- LLPanel* cur_panel = getButtonPanel(*it);
- sum_of_min_widths += get_panel_min_width(mToolbarStack, cur_panel);
- sum_of_curr_widths += get_curr_width(cur_panel);
- }
-
- const S32 possible_shrunk_width =
- chatbar_shrunk_width + (sum_of_curr_widths - sum_of_min_widths);
-
- // Minimal width of current panel
- S32 minimal_width = 0;
- mToolbarStack->getPanelMinSize(cur_panel->getName(), &minimal_width);
-
- if ( (available_width + possible_shrunk_width) >= minimal_width)
- {
- // There is enough space for minimal width, but set the result_width
- // to preferred_width so buttons widths decreasing will be done in predefined order
- result_width = (preferred_width > 0) ? preferred_width : current_width;
- decrease_width = true;
- }
- else
- {
- lldebugs << "Need " << (minimal_width - available_width - possible_shrunk_width)
- << " more px to show " << resizeStateToString(object_type) << llendl;
-
- // Make the button uppear when we have more available space.
- setAutoHidden(object_type, true);
- return false;
- }
- }
-
- if (result_width != current_width)
- {
- cur_panel->reshape(result_width, cur_panel->getRect().getHeight());
- current_width = result_width;
- }
-
- is_set = showButton(object_type, current_width);
-
- // Shrink buttons if needed
- if (is_set && decrease_width)
- {
- processWidthDecreased( -result_width);
- }
- }
- else
- {
- const S32 delta_width = get_curr_width(cur_panel);
-
- setTrayButtonVisible(object_type, false);
-
- // Mark button NOT to show while future bottom tray extending
- lldebugs << "Removing " << resizeStateToString(object_type) << " from mResizeState" << llendl;
- setAutoHidden(object_type, false);
-
- // Extend other buttons if need
- if (delta_width)
- {
- processWidthIncreased(delta_width);
- }
- }
- return is_set;
-}
-
-LLPanel* LLBottomTray::getButtonPanel(EResizeState button_type)
-{
- // Don't use the operator[] because it inserts a NULL value if the key is not found.
- if (mStateProcessedObjectMap.count(button_type) == 0)
- {
- llwarns << "Cannot find a panel for " << resizeStateToString(button_type) << llendl;
- llassert(mStateProcessedObjectMap.count(button_type) == 1);
- return NULL;
- }
-
- return mStateProcessedObjectMap[button_type];
-}
-
-void LLBottomTray::showWellButton(EResizeState object_type, bool visible)
-{
- llassert( ((RS_NOTIFICATION_WELL | RS_IM_WELL) & object_type) == object_type );
-
- const std::string panel_name = RS_IM_WELL == object_type ? "im_well_panel" : "notification_well_panel";
-
- LLView * panel = getChild<LLView>(panel_name);
-
- // if necessary visibility is set nothing to do here
- if (panel->getVisible() == (BOOL)visible) return;
-
- S32 panel_width = panel->getRect().getWidth();
- panel->setVisible(visible);
-
- if (visible)
- {
- // method assumes that input param is a negative value
- processWidthDecreased(-panel_width);
- }
- else
- {
- processWidthIncreased(panel_width);
- }
-}
-
-void LLBottomTray::processChatbarCustomization(S32 new_width)
-{
- if (NULL == mNearbyChatBar) return;
-
- const S32 delta_width = mChatBarContainer->getRect().getWidth() - new_width;
-
- if (delta_width == 0) return;
-
- {
- static unsigned dbg_cnt = 0;
- lldebugs << llformat("*** (%03d) ************************************* %d", delta_width, ++dbg_cnt) << llendl;
- }
-
- mDesiredNearbyChatWidth = new_width;
-
- const S32 available_chiclet_shrink_width = getChicletPanelShrinkHeadroom();
- llassert(available_chiclet_shrink_width >= 0);
-
- if (delta_width > 0) // panel gets narrowly
- {
- S32 total_possible_width = delta_width + available_chiclet_shrink_width;
- processShowButtons(total_possible_width);
- processExtendButtons(total_possible_width);
- }
- // here (delta_width < 0) // panel gets wider
- else //if (-delta_width > available_chiclet_shrink_width)
- {
- S32 required_width = delta_width + available_chiclet_shrink_width;
- S32 buttons_freed_width = 0;
- processShrinkButtons(required_width, buttons_freed_width);
- processHideButtons(required_width, buttons_freed_width);
- }
-}
-
-S32 LLBottomTray::getChicletPanelShrinkHeadroom() const
-{
- static const S32 min_width = mChicletPanel->getMinWidth();
- const S32 cur_width = mChicletPanel->getParent()->getRect().getWidth();
-
- S32 shrink_headroom = cur_width - min_width;
- llassert(shrink_headroom >= 0); // the panel cannot get narrower than the minimum
- return shrink_headroom;
-}
-
-// static
-std::string LLBottomTray::resizeStateToString(EResizeState state)
-{
- const char *rs_string = "UNKNOWN_BUTTON";
-
- switch (state)
- {
- case RS_NORESIZE: rs_string = "RS_NORESIZE"; break;
- case RS_CHICLET_PANEL: rs_string = "RS_CHICLET_PANEL"; break;
- case RS_CHATBAR_INPUT: rs_string = "RS_CHATBAR_INPUT"; break;
- case RS_BUTTON_SNAPSHOT: rs_string = "RS_BUTTON_SNAPSHOT"; break;
- case RS_BUTTON_CAMERA: rs_string = "RS_BUTTON_CAMERA"; break;
- case RS_BUTTON_MOVEMENT: rs_string = "RS_BUTTON_MOVEMENT"; break;
- case RS_BUTTON_GESTURES: rs_string = "RS_BUTTON_GESTURES"; break;
- case RS_BUTTON_SPEAK: rs_string = "RS_BUTTON_SPEAK"; break;
- case RS_IM_WELL: rs_string = "RS_IM_WELL"; break;
- case RS_NOTIFICATION_WELL: rs_string = "RS_NOTIFICATION_WELL"; break;
- case RS_BUTTON_BUILD: rs_string = "RS_BUTTON_BUILD"; break;
- case RS_BUTTON_SEARCH: rs_string = "RS_BUTTON_SEARCH"; break;
- case RS_BUTTON_WORLD_MAP: rs_string = "RS_BUTTON_WORLD_MAP"; break;
- case RS_BUTTON_MINI_MAP: rs_string = "RS_BUTTON_MINI_MAP"; break;
- case RS_BUTTON_DESTINATIONS: rs_string = "RS_BUTTON_DESTINATIONS"; break;
- case RS_BUTTON_AVATARS: rs_string = "RS_BUTTON_AVATARS"; break;
- case RS_BUTTON_PEOPLE: rs_string = "RS_BUTTON_PEOPLE"; break;
- case RS_BUTTON_PROFILE: rs_string = "RS_BUTTON_PROFILE"; break;
- case RS_BUTTON_HOWTO: rs_string = "RS_BUTTON_HOWTO"; break;
- case RS_BUTTON_SPLITTER_1: rs_string = "RS_BUTTON_SPLITTER_1"; break;
- case RS_BUTTON_SPLITTER_2: rs_string = "RS_BUTTON_SPLITTER_2"; break;
- case RS_BUTTONS_CAN_BE_HIDDEN: rs_string = "RS_BUTTONS_CAN_BE_HIDDEN"; break;
- // No default to track additions.
- }
-
- return rs_string;
-}
-
-// static
-std::string LLBottomTray::resizeStateMaskToString(MASK mask)
-{
- std::string res;
-
- bool add_delimiter = false;
- for (U32 i = 0; i < 16; i++)
- {
- EResizeState state = (EResizeState) (1 << i);
- if (mask & state)
- {
- if (!add_delimiter)
- {
- add_delimiter = true;
- }
- else
- {
- res += ", ";
- }
-
- res += resizeStateToString(state);
- }
- }
-
- if (res.empty())
- {
- res = resizeStateToString(RS_NORESIZE);
- }
-
- res += llformat(" (0x%X)", mask);
- return res;
-}
-
-bool LLBottomTray::isAutoHidden(MASK button_types) const
-{
- return (mResizeState & button_types) != 0;
-}
-
-void LLBottomTray::setAutoHidden(MASK button_types, bool hide)
-{
- if (hide)
- {
- mResizeState |= button_types;
- }
- else
- {
- mResizeState &= ~button_types;
- }
-}
-
-//EOF
diff --git a/indra/newview/llbottomtray.h b/indra/newview/llbottomtray.h
deleted file mode 100644
index e26b0792e9..0000000000
--- a/indra/newview/llbottomtray.h
+++ /dev/null
@@ -1,564 +0,0 @@
-/**
-* @file llbottomtray.h
-* @brief LLBottomTray class header file
-*
-* $LicenseInfo:firstyear=2009&license=viewerlgpl$
-* Second Life Viewer Source Code
-* Copyright (C) 2010, Linden Research, Inc.
-*
-* This library is free software; you can redistribute it and/or
-* modify it under the terms of the GNU Lesser General Public
-* License as published by the Free Software Foundation;
-* version 2.1 of the License only.
-*
-* This library is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-* Lesser General Public License for more details.
-*
-* You should have received a copy of the GNU Lesser General Public
-* License along with this library; if not, write to the Free Software
-* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-*
-* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
-* $/LicenseInfo$
-*/
-
-#ifndef LL_LLBOTTOMPANEL_H
-#define LL_LLBOTTOMPANEL_H
-
-#include "llpanel.h"
-#include "llimview.h"
-#include "llbutton.h"
-
-class LLChicletPanel;
-class LLLayoutStack;
-class LLSpeakButton;
-class LLNearbyChatBar;
-class LLIMChiclet;
-class LLBottomTrayLite;
-class LLLayoutPanel;
-class LLMenuGL;
-class LLNearbyChatBarListener;
-
-// Build time optimization, generate once in .cpp file
-#ifndef LLBOTTOMTRAY_CPP
-extern template class LLBottomTray* LLSingleton<class LLBottomTray>::getInstance();
-#endif
-
-/**
- * Class for buttons that should have drag'n'drop ability in bottomtray.
- * These buttons pass mouse events handling to bottomtray.
- */
-class LLBottomtrayButton : public LLButton
-{
-public:
- struct Params : public LLInitParam::Block<Params, LLButton::Params>
- {
- Optional<bool> can_drag;
- Params()
- : can_drag("can_drag", true){}
- };
- /*virtual*/ BOOL handleHover(S32 x, S32 y, MASK mask);
- /*virtual*/ BOOL handleMouseUp(S32 x, S32 y, MASK mask);
- /*virtual*/ BOOL handleMouseDown(S32 x, S32 y, MASK mask);
-
-protected:
- LLBottomtrayButton(const Params& p)
- : LLButton(p),
- mCanDrag(p.can_drag)
- {
-
- }
- friend class LLUICtrlFactory;
-
- bool mCanDrag;
-};
-
-class LLBottomTray
- : public LLSingleton<LLBottomTray>
- , public LLPanel
- , public LLIMSessionObserver
- , public LLVoiceClientStatusObserver
-{
- LOG_CLASS(LLBottomTray);
- friend class LLSingleton<LLBottomTray>;
- friend class LLBottomTrayLite;
-public:
- ~LLBottomTray();
-
- BOOL postBuild();
-
- LLChicletPanel* getChicletPanel() {return mChicletPanel;}
- LLNearbyChatBar* getNearbyChatBar();
-
- void onCommitGesture(LLUICtrl* ctrl);
-
- // LLIMSessionObserver observe triggers
- virtual void sessionAdded(const LLUUID& session_id, const std::string& name, const LLUUID& other_participant_id);
- virtual void sessionRemoved(const LLUUID& session_id);
- void sessionIDUpdated(const LLUUID& old_session_id, const LLUUID& new_session_id);
-
- S32 getTotalUnreadIMCount();
-
- virtual void reshape(S32 width, S32 height, BOOL called_from_parent);
-
- virtual void setVisible(BOOL visible);
-
- /*virtual*/ S32 notifyParent(const LLSD& info);
-
- // Implements LLVoiceClientStatusObserver::onChange() to enable the speak
- // button when voice is available
- /*virtual*/ void onChange(EStatusType status, const std::string &channelURI, bool proximal);
-
- void showBottomTrayContextMenu(S32 x, S32 y, MASK mask);
-
- void showSpeakButton(bool visible);
-
- void toggleMovementControls();
- void toggleCameraControls();
-
- void onMouselookModeIn();
- void onMouselookModeOut();
-
- /**
- * Creates IM Chiclet based on session type (IM chat or Group chat)
- */
- LLIMChiclet* createIMChiclet(const LLUUID& session_id);
-
- // Below are methods that were introduced or overriden in bottomtray to handle drag'n'drop
-
- virtual void draw();
-
- /**
- * These three methods handle drag'n'drop, they may be called directly from child buttons.
- * handleHover and other virtual handle* couldn't be used here, because we should call LLPanel::handle*,
- * but x and y here are often outside of bottomtray.
- */
- void onDraggableButtonHover(S32 x, S32 y);
- void onDraggableButtonMouseDown(LLUICtrl* button, S32 x, S32 y);
- void onDraggableButtonMouseUp(LLUICtrl* button, S32 x, S32 y);
-
-
-private:
- typedef enum e_resize_state
- {
- RS_NORESIZE = 0x0000,
- RS_CHICLET_PANEL = 0x0001,
- RS_CHATBAR_INPUT = 0x0002,
- RS_BUTTON_SNAPSHOT = 0x0004,
- RS_BUTTON_CAMERA = 0x0008,
- RS_BUTTON_MOVEMENT = 0x0010,
- RS_BUTTON_GESTURES = 0x0020,
- RS_BUTTON_SPEAK = 0x0040,
- RS_IM_WELL = 0x0080,
- RS_NOTIFICATION_WELL = 0x0100,
- RS_BUTTON_BUILD = 0x0200,
- RS_BUTTON_SEARCH = 0x0400,
- RS_BUTTON_WORLD_MAP = 0x0800,
- RS_BUTTON_MINI_MAP = 0x1000,
- RS_BUTTON_DESTINATIONS = 0x2000,
- RS_BUTTON_AVATARS = 0x4000,
- RS_BUTTON_PEOPLE = 0x8000,
- RS_BUTTON_PROFILE = 0x10000,
- RS_BUTTON_HOWTO = 0x20000,
- RS_BUTTON_SPLITTER_1 = 0x40000,
- RS_BUTTON_SPLITTER_2 = 0x80000,
-
- /*
- Once new button that can be hidden on resize is added don't forget to update related places:
- - RS_BUTTONS_CAN_BE_HIDDEN enum value below.
- - initResizeStateContainers(): mStateProcessedObjectMap and mButtonsProcessOrder
- */
-
- /**
- * Specifies buttons which can be hidden when bottom tray is shrunk.
- * They are: Gestures, Movement (Move), Camera (View), Snapshot
- * new: Build, Search, Map, World Map, Mini-Map, destinations, avatars
- */
- RS_BUTTONS_CAN_BE_HIDDEN = RS_BUTTON_SNAPSHOT | RS_BUTTON_CAMERA | RS_BUTTON_MOVEMENT | RS_BUTTON_GESTURES
- | RS_BUTTON_BUILD | RS_BUTTON_SEARCH | RS_BUTTON_WORLD_MAP | RS_BUTTON_MINI_MAP
- | RS_BUTTON_DESTINATIONS | RS_BUTTON_AVATARS
- }EResizeState;
-
- // Below are three methods that were introduced to handle drag'n'drop
-
- /**
- * finds a panel under the specified LOCAL point
- */
- LLPanel* findChildPanelByLocalCoords(S32 x, S32 y);
-
- /**
- * checks whether the cursor is over an area where the dragged button may be dropped
- */
- bool isCursorOverDraggableArea(S32 x, S32 y);
-
- /**
- * Updates process(shrink/show/hide) order of buttons and order in which they'll be stored for further save/load.
- * It is called when dragged button is dropped
- */
- void updateButtonsOrdersAfterDnD();
-
- // saves order of buttons to file on disk
- void saveButtonsOrder();
- // reads order of buttons from file on disk
- void loadButtonsOrder();
-
- /**
- * Updates child controls size and visibility when it is necessary to reduce total width.
- *
- * Process order:
- * - reduce chiclet panel to its minimal width;
- * - reduce chatbar to its minimal width;
- * - reduce visible buttons from right to left to their minimal width;
- * - hide visible buttons from right to left;
- * When button is hidden chatbar extended to fill released space if it is necessary.
- *
- * @param[in] delta_width - value by which bottom tray should be shrunk. It is a negative value.
- * @return positive value which bottom tray can not process when it reaches its minimal width.
- * Zero if there was enough space to process delta_width.
- */
- S32 processWidthDecreased(S32 delta_width);
-
- /**
- * Updates child controls size and visibility when it is necessary to extend total width.
- *
- * Process order:
- * - show invisible buttons should be shown from left to right if possible;
- * - extend visible buttons from left to right to their default width;
- * - extend chatbar to its maximal width;
- * - extend chiclet panel to all available space;
- * When chatbar & chiclet panels are wider then their minimal width they can be reduced to allow
- * a button gets visible in case if passed delta_width is not enough (chatbar first).
- *
- * @param[in] delta_width - value by which bottom tray should be extended. It is a positive value.
- */
- void processWidthIncreased(S32 delta_width);
-
- /** helper function to log debug messages */
- void log(LLView* panel, const std::string& descr);
-
- /**
- * Tries to show hidden by resize buttons using available width.
- *
- * Gets buttons visible if there is enough space. Reduces available_width in this case.
- *
- * @params[in, out] available_width - reference to available width to be used to show buttons.
- * @see processShowButton()
- * @return consumed pixels (difference in available width).
- */
- S32 processShowButtons(S32& available_width);
-
- /**
- * Tries to show panel with specified button using available width.
- *
- * Shows button specified by type if there is enough space. Reduces available_width in this case.
- *
- * @params[in] shown_object_type - type of button to be shown.
- * @params[in, out] available_width - reference to available width to be used to show button.
- *
- * @return true if button can be shown, false otherwise
- */
- bool processShowButton(EResizeState shown_object_type, S32& available_width);
-
- /**
- * Hides visible panels with all buttons that may be hidden by resize if it is necessary.
- *
- * When button gets hidden some space is released in bottom tray.
- * This space is taken into account for several consecutive calls for several buttons.
- *
- * @params[in, out] required_width - reference to required width to be released. This is a negative value.
- * Its absolute value is decreased by shown panel width.
- * @params[in, out] buttons_freed_width - reference to value released over required one.
- * If panel's width is more than required difference is added to buttons_freed_width.
- * @see processHideButton()
- */
- void processHideButtons(S32& required_width, S32& buttons_freed_width);
-
- /**
- * Hides panel with specified button if it is visible.
- *
- * When button gets hidden some space is released in bottom tray.
- * This space is taken into account for several consecutive calls for several buttons.
- *
- * @params[in] processed_object_type - type of button to be hide.
- * @params[in, out] required_width - reference to required width to be released. This is a negative value.
- * Its absolute value is decreased by panel width.
- * @params[in, out] buttons_freed_width - reference to value released over required one.
- * If panel's width is more than required difference is added to buttons_freed_width.
- */
- void processHideButton(EResizeState processed_object_type, S32& required_width, S32& buttons_freed_width);
-
- /**
- * Shrinks shown buttons to reduce total taken space.
- *
- * Shrinks buttons that may be shrunk smoothly first. Then shrinks Speak button.
- *
- * @param[in, out] required_width - reference to width value which should be released when buttons are shrunk. It is a negative value.
- * It is increased on the value processed by buttons.
- * @params[in, out] buttons_freed_width - reference to value released over required one.
- * If width of panel with Speak button is more than required that difference is added
- * to buttons_freed_width.
- * This is because Speak button shrinks discretely unlike other buttons which are changed smoothly.
- */
- void processShrinkButtons(S32& required_width, S32& buttons_freed_width);
-
- /**
- * Shrinks panel with specified button if it is visible.
- *
- * @params[in] processed_object_type - type of button to be shrunk.
- * @param[in, out] required_width - reference to width value which should be released when button is shrunk. It is a negative value.
- * It is increased on the value released by the button.
- */
- void processShrinkButton(EResizeState processed_object_type, S32& required_width);
-
- /**
- * Extends shown buttons to increase total taken space.
- *
- * Extends buttons that may be extended smoothly first. Then extends Speak button.
- *
- * @param[in, out] available_width - reference to width value which buttons can use to be extended.
- * It is a positive value. It is decreased on the value processed by buttons.
- */
- void processExtendButtons(S32& available_width);
-
- /**
- * Extends the Speak button if there is enough headroom.
- *
- * Unlike other buttons, the Speak buttons has only two possible widths:
- * the minimal one (without label) and the maximal (default) one.
- *
- * If the button is at its minimum width there is not enough headroom to
- * reshape it to the maximum width, the method does nothing.
- *
- * @param available_width Available headroom.
- * @return false if the button requires extension but there's not enough headroom, true otherwise.
- */
- bool processExtendSpeakButton(S32& available_width);
-
- /**
- * Extends shown button to increase total taken space.
- *
- * @params[in] processed_object_type - type of button to be extended.
- * @param[in, out] available_width - reference to width value which button can use to be extended.
- * It is a positive value. It is decreased on the value processed by buttons.
- */
- void processExtendButton(EResizeState processed_object_type, S32& available_width);
-
- /**
- * Determines if specified by type object can be shown. It should be hidden by shrink before.
- *
- * Processes buttons a such way to show buttons in constant order:
- * - Gestures, Move, View, Snapshot
- */
- bool canButtonBeShown(EResizeState processed_object_type) const;
-
- /**
- * Initializes all containers stored data related to children resize state.
- *
- * @see mStateProcessedObjectMap
- * @see mObjectDefaultWidthMap
- * @see mButtonsProcessOrder
- */
- void initResizeStateContainers();
-
- /**
- * Initializes buttons' visibility depend on stored Control Settings.
- */
- void initButtonsVisibility();
-
- /**
- * Initializes listeners of Control Settings to toggle appropriate buttons' visibility.
- *
- * @see toggleShowButton()
- */
- void setButtonsControlsAndListeners();
-
- /**
- * Toggles visibility of specified button depend on passed value.
- *
- * @param button_type - type of button to be toggled
- * @param new_visibility - new visibility of the button
- *
- * @see setButtonsControlsAndListeners()
- */
- static bool toggleShowButton(EResizeState button_type, const LLSD& new_visibility);
-
- /**
- * Show the button if there is enough space.
- *
- * @param[in] button_type - type of button to be shown.
- * @param[in, out] available_width amount of available space on the bottom bar.
- *
- * @return true if button was shown, false that's not possible (not enough space, etc)
- */
- bool showButton(EResizeState button_type, S32& available_width);
-
- /**
- * Sets passed visibility to object specified by resize type.
- */
- void setTrayButtonVisible(EResizeState shown_object_type, bool visible);
-
- /**
- * Sets passed visibility to object specified by resize type if it is possible.
- *
- * If it is impossible to show required button due to there is no enough room in bottom tray
- * it will no be shown. Is called via context menu commands.
- * In this case Alert Dialog will be shown to notify user about that.
- *
- * Method also stores resize state to be processed while future bottom tray extending:
- * - if hidden while resizing button should be hidden it will not be shown while extending;
- * - if hidden via context menu button should be shown but there is no enough room for now
- * it will be shown while extending.
- */
- void setTrayButtonVisibleIfPossible(EResizeState shown_object_type, bool visible, bool raise_notification = true);
-
- /**
- * Sets passed visibility to required button and fit widths of shown
- * buttons(notice that method can shrink widths to
- * allocate needed room in bottom tray).
- * Returns true if visibility of required button was set.
- */
- bool setVisibleAndFitWidths(EResizeState object_type, bool visible);
-
- /**
- * Get panel containing the given button.
- *
- * @see mStateProcessedObjectMap
- */
- LLPanel* getButtonPanel(EResizeState button_type);
-
- /**
- * Shows/hides panel with specified well button (IM or Notification)
- *
- * @param[in] object_type - type of well button to be processed.
- * Must be one of RS_IM_WELL or RS_NOTIFICATION_WELL.
- * @param[in] visible - flag specified whether button should be shown or hidden.
- */
- void showWellButton(EResizeState object_type, bool visible);
-
- /**
- * Handles a customization of chatbar width.
- *
- * When chatbar gets wider layout stack will reduce chiclet panel (it is auto-resizable)
- * But once chiclet panel reaches its minimal width Stack will force to reduce buttons width.
- * including Speak button. The similar behavior is when chatbar gets narrowly.
- * This methods force resize behavior to resize buttons properly in these cases.
- */
- void processChatbarCustomization(S32 new_width);
-
- /**
- * @return difference between current chiclet panel width and the minimum.
- */
- S32 getChicletPanelShrinkHeadroom() const;
-
- /// Get button name for debugging.
- static std::string resizeStateToString(EResizeState state);
-
- /// Dump a mask for debugging
- static std::string resizeStateMaskToString(MASK mask);
-
- /// @return true if any of the the passed buttons have been auto-hidden due to lack of available space.
- bool isAutoHidden(MASK button_types) const;
-
- /**
- * (Un)Mark the buttons as hidden.
- *
- * Auto-hidden buttons are those that re-appear as soon as we have enough available space.
- */
- void setAutoHidden(MASK button_types, bool hide);
-
- /// Buttons automatically hidden due to lack of space.
- MASK mResizeState;
-
- /**
- * Mapping of button types to the layout panels the buttons are wrapped in.
- *
- * Used by getButtonPanel().
- */
- typedef std::map<EResizeState, LLPanel*> state_object_map_t;
- state_object_map_t mStateProcessedObjectMap;
-
- /// Default (maximum) widths of the layout panels.
- typedef std::map<EResizeState, S32> state_object_width_map_t;
- state_object_width_map_t mObjectDefaultWidthMap;
-
- typedef std::vector<EResizeState> resize_state_vec_t;
-
- /**
- * Contains order in which child buttons should be processed in show/hide, extend/shrink methods.
- */
- resize_state_vec_t mButtonsProcessOrder;
-
- /**
- * Contains order in which child buttons are shown.
- * It traces order of all bottomtray buttons that may change place via drag'n'drop and should
- * save and load it between sessions. mButtonsProcessOrder is not enough for it because it contains only
- * buttons that may be hidden.
- */
- resize_state_vec_t mButtonsOrder;
-
-protected:
-
- LLBottomTray(const LLSD& key = LLSD());
-
- static void* createNearbyChatBar(void* userdata);
-
- void updateContextMenu(S32 x, S32 y, MASK mask);
- void onContextMenuItemClicked(const LLSD& userdata);
- bool onContextMenuItemEnabled(const LLSD& userdata);
-
- // Either default or saved after user's manual resize width of nearby chat.
- // Nearby chat will not always have it, because sometimes it can be shrunk on resize,
- // but when possible it will be restored back to this value.
- S32 mDesiredNearbyChatWidth;
- LLChicletPanel* mChicletPanel;
- LLPanel* mSpeakPanel;
- LLSpeakButton* mSpeakBtn;
- LLNearbyChatBar* mNearbyChatBar;
- LLLayoutPanel* mChatBarContainer;
- LLPanel* mNearbyCharResizeHandlePanel;
- LLLayoutStack* mToolbarStack;
- LLMenuGL* mBottomTrayContextMenu;
- LLButton* mCamButton;
- LLButton* mMovementButton;
- LLBottomTrayLite* mBottomTrayLite;
- bool mIsInLiteMode;
-
- // Drag'n'Drop
-
- /**
- * Is true if mouse down happened on draggable button.
- * Set false whether on drag start or on mouse up.
- */
- bool mCheckForDrag;
- /**
- * These two variables hold corrdinates of mouse down on draggable button.
- * They are used to compare with current coordinates of cursor and determine whether drag'n'drop should start.
- */
- S32 mStartX;
- S32 mStartY;
- /**
- * True if drag'n'drop is happening.
- */
- bool mDragStarted;
-
- /**
- * Pointer to panel which is currently dragged (though it seems to user that button is dragged,
- * we are changing place of layout panel).
- */
- LLPanel* mDraggedItem;
- /**
- * Panel before which the dragged button will be inserted.
- */
- LLPanel* mLandingTab;
- /**
- * Image used to show position where dragged button will be dropped.
- */
- LLUIImage* mImageDragIndication;
-
- // We want only one LLNearbyChatBarListener object, so it's tied to this singleton
- boost::shared_ptr<LLNearbyChatBarListener> mListener;
-};
-
-#endif // LL_LLBOTTOMPANEL_H
diff --git a/indra/newview/llcallfloater.cpp b/indra/newview/llcallfloater.cpp
index 945a760d05..e3217668c5 100644
--- a/indra/newview/llcallfloater.cpp
+++ b/indra/newview/llcallfloater.cpp
@@ -37,9 +37,9 @@
#include "llavatarnamecache.h"
#include "llavatariconctrl.h"
#include "llavatarlist.h"
-#include "llbottomtray.h"
#include "lldraghandle.h"
#include "llimfloater.h"
+#include "llimview.h"
#include "llfloaterreg.h"
#include "llparticipantlist.h"
#include "llspeakers.h"
@@ -115,9 +115,6 @@ LLCallFloater::LLCallFloater(const LLSD& key)
LLVoiceClient::instance().addObserver(this);
LLTransientFloaterMgr::getInstance()->addControlView(this);
- // force docked state since this floater doesn't save it between recreations
- setDocked(true);
-
// update the agent's name if display name setting change
LLAvatarNameCache::addUseDisplayNamesCallback(boost::bind(&LLCallFloater::updateAgentModeratorState, this));
LLViewerDisplayName::addNameChangedCallback(boost::bind(&LLCallFloater::updateAgentModeratorState, this));
@@ -145,7 +142,6 @@ LLCallFloater::~LLCallFloater()
// virtual
BOOL LLCallFloater::postBuild()
{
- LLTransientDockableFloater::postBuild();
mAvatarList = getChild<LLAvatarList>("speakers_list");
mAvatarListRefreshConnection = mAvatarList->setRefreshCompleteCallback(boost::bind(&LLCallFloater::onAvatarListRefreshed, this));
@@ -154,20 +150,10 @@ BOOL LLCallFloater::postBuild()
mNonAvatarCaller = findChild<LLNonAvatarCaller>("non_avatar_caller");
mNonAvatarCaller->setVisible(FALSE);
- LLView *anchor_panel = LLBottomTray::getInstance()->getChild<LLView>("speak_flyout_btn");
-
- setDockControl(new LLDockControl(
- anchor_panel, this,
- getDockTongue(), LLDockControl::TOP));
-
initAgentData();
connectToChannel(LLVoiceChannel::getCurrentVoiceChannel());
- setIsChrome(true);
- //chrome="true" hides floater caption
- if (mDragHandle)
- mDragHandle->setTitleVisible(TRUE);
updateTransparency(TT_ACTIVE); // force using active floater transparency (STORM-730)
updateSession();
@@ -204,13 +190,13 @@ void LLCallFloater::draw()
if (mParticipants)
mParticipants->updateRecentSpeakersOrder();
- LLTransientDockableFloater::draw();
+ LLFloater::draw();
}
// virtual
void LLCallFloater::setFocus( BOOL b )
{
- LLTransientDockableFloater::setFocus(b);
+ LLFloater::setFocus(b);
// Force using active floater transparency (STORM-730).
// We have to override setFocus() for LLCallFloater because selecting an item
diff --git a/indra/newview/llchannelmanager.cpp b/indra/newview/llchannelmanager.cpp
index 4ab3d8dc98..987651fc80 100644
--- a/indra/newview/llchannelmanager.cpp
+++ b/indra/newview/llchannelmanager.cpp
@@ -58,7 +58,10 @@ LLChannelManager::~LLChannelManager()
{
for(std::vector<ChannelElem>::iterator it = mChannelList.begin(); it != mChannelList.end(); ++it)
{
- delete (*it).channel;
+ LLScreenChannelBase* channel = it->channel.get();
+ if (!channel) continue;
+
+ delete channel;
}
mChannelList.clear();
@@ -68,9 +71,10 @@ LLChannelManager::~LLChannelManager()
LLScreenChannel* LLChannelManager::createNotificationChannel()
{
// creating params for a channel
- LLChannelManager::Params p;
+ LLScreenChannelBase::Params p;
p.id = LLUUID(gSavedSettings.getString("NotificationChannelUUID"));
p.channel_align = CA_RIGHT;
+ p.toast_align = NA_TOP;
// Getting a Channel for our notifications
return dynamic_cast<LLScreenChannel*> (LLChannelManager::getInstance()->getChannel(p));
@@ -84,16 +88,19 @@ void LLChannelManager::onLoginCompleted()
// calc a number of all offline notifications
for(std::vector<ChannelElem>::iterator it = mChannelList.begin(); it != mChannelList.end(); ++it)
{
+ LLScreenChannelBase* channel = it->channel.get();
+ if (!channel) continue;
+
// don't calc notifications for Nearby Chat
- if((*it).channel->getChannelID() == LLUUID(gSavedSettings.getString("NearByChatChannelUUID")))
+ if(channel->getChannelID() == LLUUID(gSavedSettings.getString("NearByChatChannelUUID")))
{
continue;
}
// don't calc notifications for channels that always show their notifications
- if(!(*it).channel->getDisplayToastsAlways())
+ if(!channel->getDisplayToastsAlways())
{
- away_notifications +=(*it).channel->getNumberOfHiddenToasts();
+ away_notifications +=channel->getNumberOfHiddenToasts();
}
}
@@ -106,7 +113,7 @@ void LLChannelManager::onLoginCompleted()
else
{
// create a channel for the StartUp Toast
- LLChannelManager::Params p;
+ LLScreenChannelBase::Params p;
p.id = LLUUID(gSavedSettings.getString("StartUpChannelUUID"));
p.channel_align = CA_RIGHT;
mStartUpChannel = createChannel(p);
@@ -157,33 +164,22 @@ LLScreenChannelBase* LLChannelManager::addChannel(LLScreenChannelBase* channel)
ChannelElem new_elem;
new_elem.id = channel->getChannelID();
- new_elem.channel = channel;
+ new_elem.channel = channel->getHandle();
mChannelList.push_back(new_elem);
return channel;
}
-LLScreenChannel* LLChannelManager::createChannel(LLChannelManager::Params& p)
+LLScreenChannel* LLChannelManager::createChannel(LLScreenChannelBase::Params& p)
{
- LLScreenChannel* new_channel = new LLScreenChannel(p.id);
-
- if(!new_channel)
- {
- llerrs << "LLChannelManager::getChannel(LLChannelManager::Params& p) - can't create a channel!" << llendl;
- }
- else
- {
- new_channel->setToastAlignment(p.toast_align);
- new_channel->setChannelAlignment(p.channel_align);
- new_channel->setDisplayToastsAlways(p.display_toasts_always);
+ LLScreenChannel* new_channel = new LLScreenChannel(p);
- addChannel(new_channel);
- }
+ addChannel(new_channel);
return new_channel;
}
-LLScreenChannelBase* LLChannelManager::getChannel(LLChannelManager::Params& p)
+LLScreenChannelBase* LLChannelManager::getChannel(LLScreenChannelBase::Params& p)
{
LLScreenChannelBase* new_channel = findChannelByID(p.id);
@@ -195,19 +191,19 @@ LLScreenChannelBase* LLChannelManager::getChannel(LLChannelManager::Params& p)
}
//--------------------------------------------------------------------------
-LLScreenChannelBase* LLChannelManager::findChannelByID(const LLUUID id)
+LLScreenChannelBase* LLChannelManager::findChannelByID(const LLUUID& id)
{
std::vector<ChannelElem>::iterator it = find(mChannelList.begin(), mChannelList.end(), id);
if(it != mChannelList.end())
{
- return (*it).channel;
+ return (*it).channel.get();
}
return NULL;
}
//--------------------------------------------------------------------------
-void LLChannelManager::removeChannelByID(const LLUUID id)
+void LLChannelManager::removeChannelByID(const LLUUID& id)
{
std::vector<ChannelElem>::iterator it = find(mChannelList.begin(), mChannelList.end(), id);
if(it != mChannelList.end())
@@ -222,7 +218,10 @@ void LLChannelManager::muteAllChannels(bool mute)
for (std::vector<ChannelElem>::iterator it = mChannelList.begin();
it != mChannelList.end(); it++)
{
- it->channel->setShowToasts(!mute);
+ if (it->channel.get())
+ {
+ it->channel.get()->setShowToasts(!mute);
+ }
}
}
diff --git a/indra/newview/llchannelmanager.h b/indra/newview/llchannelmanager.h
index 1a0b98f6cf..a5de8a5327 100644
--- a/indra/newview/llchannelmanager.h
+++ b/indra/newview/llchannelmanager.h
@@ -44,24 +44,14 @@ namespace LLNotificationsUI
class LLChannelManager : public LLSingleton<LLChannelManager>
{
public:
- struct Params
- {
- LLUUID id;
- bool display_toasts_always;
- EToastAlignment toast_align;
- EChannelAlignment channel_align;
-
- Params()
- : id(LLUUID("")), display_toasts_always(false), toast_align(NA_BOTTOM), channel_align(CA_LEFT)
- {}
- };
+
struct ChannelElem
{
- LLUUID id;
- LLScreenChannelBase* channel;
+ LLUUID id;
+ LLHandle<LLScreenChannelBase> channel;
- ChannelElem() : id(LLUUID("")), channel(NULL) { }
+ ChannelElem() { }
ChannelElem(const ChannelElem &elem)
{
@@ -84,18 +74,18 @@ public:
void onStartUpToastClose();
// creates a new ScreenChannel according to the given parameters or returns existing if present
- LLScreenChannelBase* getChannel(LLChannelManager::Params& p);
+ LLScreenChannelBase* getChannel(LLScreenChannelBase::Params& p);
LLScreenChannelBase* addChannel(LLScreenChannelBase* channel);
// returns a channel by its ID
- LLScreenChannelBase* findChannelByID(const LLUUID id);
+ LLScreenChannelBase* findChannelByID(const LLUUID& id);
// creator of the Notification channel, that is used in more than one handler
LLScreenChannel* createNotificationChannel();
// remove channel methods
- void removeChannelByID(const LLUUID id);
+ void removeChannelByID(const LLUUID& id);
/**
* Manages toasts showing for all channels.
@@ -117,7 +107,7 @@ public:
std::vector<ChannelElem>& getChannelList() { return mChannelList;}
private:
- LLScreenChannel* createChannel(LLChannelManager::Params& p);
+ LLScreenChannel* createChannel(LLScreenChannelBase::Params& p);
LLScreenChannel* mStartUpChannel;
std::vector<ChannelElem> mChannelList;
diff --git a/indra/newview/llchatbar.cpp b/indra/newview/llchatbar.cpp
index cf0374075a..d6095cce07 100644
--- a/indra/newview/llchatbar.cpp
+++ b/indra/newview/llchatbar.cpp
@@ -60,7 +60,6 @@
#include "llui.h"
#include "llviewermenu.h"
#include "lluictrlfactory.h"
-#include "llbottomtray.h"
//
// Globals
@@ -95,7 +94,7 @@ LLChatBar::LLChatBar()
mGestureCombo(NULL),
mObserver(NULL)
{
- setIsChrome(TRUE);
+ //setIsChrome(TRUE);
}
diff --git a/indra/newview/llchathistory.cpp b/indra/newview/llchathistory.cpp
index 913d2f34b0..f530d10ddc 100644
--- a/indra/newview/llchathistory.cpp
+++ b/indra/newview/llchathistory.cpp
@@ -42,6 +42,7 @@
#include "llavataractions.h"
#include "lltrans.h"
#include "llfloaterreg.h"
+#include "llfloatersidepanelcontainer.h"
#include "llmutelist.h"
#include "llstylemap.h"
#include "llslurl.h"
@@ -58,8 +59,6 @@
#include "llviewercontrol.h"
-#include "llsidetray.h"//for blocked objects panel
-
static LLDefaultChildRegistry::Register<LLChatHistory> r("chat_history");
const static std::string NEW_LINE(rawstr_to_utf8("\n"));
@@ -144,7 +143,7 @@ public:
{
LLMuteList::getInstance()->add(LLMute(getAvatarId(), mFrom, LLMute::OBJECT));
- LLSideTray::getInstance()->showPanel("panel_block_list_sidetray", LLSD().with("blocked_to_select", getAvatarId()));
+ LLFloaterSidePanelContainer::showPanel("people", "panel_block_list_sidetray", LLSD().with("blocked_to_select", getAvatarId()));
}
}
@@ -622,7 +621,6 @@ void LLChatHistory::initFromParams(const LLChatHistory::Params& p)
panel_p.has_border = false;
panel_p.mouse_opaque = false;
panel_p.min_dim = 30;
- panel_p.max_dim = S32_MAX;
panel_p.auto_resize = true;
panel_p.user_resize = false;
diff --git a/indra/newview/llchatitemscontainerctrl.cpp b/indra/newview/llchatitemscontainerctrl.cpp
index 8584885bc9..9a84280f25 100644
--- a/indra/newview/llchatitemscontainerctrl.cpp
+++ b/indra/newview/llchatitemscontainerctrl.cpp
@@ -35,6 +35,7 @@
#include "llfloaterreg.h"
#include "lllocalcliprect.h"
#include "lltrans.h"
+#include "llnearbychatbar.h"
#include "llviewercontrol.h"
#include "llagentdata.h"
@@ -315,12 +316,12 @@ BOOL LLNearbyChatToastPanel::handleMouseUp (S32 x, S32 y, MASK mask)
return TRUE;
else
{
- LLFloaterReg::showInstance("nearby_chat",LLSD());
+ LLNearbyChatBar::getInstance()->showHistory();
return FALSE;
}
}
- LLFloaterReg::showInstance("nearby_chat",LLSD());
+ LLNearbyChatBar::getInstance()->showHistory();
return LLPanel::handleMouseUp(x,y,mask);
}
diff --git a/indra/newview/llchiclet.cpp b/indra/newview/llchiclet.cpp
index 245157923d..aabab0ccb9 100644
--- a/indra/newview/llchiclet.cpp
+++ b/indra/newview/llchiclet.cpp
@@ -29,7 +29,7 @@
#include "llagent.h"
#include "llavataractions.h"
-#include "llbottomtray.h"
+#include "llchicletbar.h"
#include "lleventtimer.h"
#include "llgroupactions.h"
#include "lliconctrl.h"
@@ -214,10 +214,10 @@ void LLSysWellChiclet::updateWidget(bool is_window_empty)
{
mButton->setEnabled(!is_window_empty);
- LLSD params;
- params["well_empty"] = is_window_empty;
- params["well_name"] = getName();
- notifyParent(params);
+ if (LLChicletBar::instanceExists())
+ {
+ LLChicletBar::getInstance()->showWellButton(getName(), !is_window_empty);
+ }
}
// virtual
BOOL LLSysWellChiclet::handleRightMouseDown(S32 x, S32 y, MASK mask)
@@ -250,6 +250,12 @@ LLIMWellChiclet::LLIMWellChiclet(const Params& p)
LLIMWellChiclet::~LLIMWellChiclet()
{
+ LLIMWellWindow* im_well_window = LLIMWellWindow::findInstance();
+ if (im_well_window)
+ {
+ im_well_window->setSysWellChiclet(NULL);
+ }
+
LLIMMgr::getInstance()->removeSessionObserver(this);
}
@@ -296,8 +302,15 @@ void LLIMWellChiclet::createMenu()
void LLIMWellChiclet::messageCountChanged(const LLSD& session_data)
{
+ // The singleton class LLChicletBar instance might be already deleted
+ // so don't create a new one.
+ if (!LLChicletBar::instanceExists())
+ {
+ return;
+ }
+
const LLUUID& session_id = session_data["session_id"];
- const S32 counter = LLBottomTray::getInstance()->getTotalUnreadIMCount();
+ const S32 counter = LLChicletBar::getInstance()->getTotalUnreadIMCount();
const bool im_not_visible = !LLFloaterReg::instanceVisible("im_container")
&& !LLFloaterReg::instanceVisible("impanel", session_id);
diff --git a/indra/newview/llchicletbar.cpp b/indra/newview/llchicletbar.cpp
new file mode 100644
index 0000000000..f1bc51fbe7
--- /dev/null
+++ b/indra/newview/llchicletbar.cpp
@@ -0,0 +1,345 @@
+/**
+ * @file llchicletbar.cpp
+ * @brief LLChicletBar class implementation
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h" // must be first include
+
+#include "llchicletbar.h"
+
+// library includes
+#include "llfloaterreg.h"
+#include "lllayoutstack.h"
+
+// newview includes
+#include "llchiclet.h"
+#include "llimfloater.h" // for LLIMFloater
+#include "llpaneltopinfobar.h"
+#include "llsyswellwindow.h"
+
+namespace
+{
+ const std::string& PANEL_CHICLET_NAME = "chiclet_list_panel";
+
+ S32 get_curr_width(LLUICtrl* ctrl)
+ {
+ S32 cur_width = 0;
+ if ( ctrl && ctrl->getVisible() )
+ {
+ cur_width = ctrl->getRect().getWidth();
+ }
+ return cur_width;
+ }
+}
+
+LLChicletBar::LLChicletBar(const LLSD&)
+: mChicletPanel(NULL),
+ mToolbarStack(NULL)
+{
+ // Firstly add our self to IMSession observers, so we catch session events
+ // before chiclets do that.
+ LLIMMgr::getInstance()->addSessionObserver(this);
+
+ buildFromFile("panel_chiclet_bar.xml");
+}
+
+LLChicletBar::~LLChicletBar()
+{
+ if (!LLSingleton<LLIMMgr>::destroyed())
+ {
+ LLIMMgr::getInstance()->removeSessionObserver(this);
+ }
+}
+
+LLIMChiclet* LLChicletBar::createIMChiclet(const LLUUID& session_id)
+{
+ LLIMChiclet::EType im_chiclet_type = LLIMChiclet::getIMSessionType(session_id);
+
+ switch (im_chiclet_type)
+ {
+ case LLIMChiclet::TYPE_IM:
+ return getChicletPanel()->createChiclet<LLIMP2PChiclet>(session_id);
+ case LLIMChiclet::TYPE_GROUP:
+ return getChicletPanel()->createChiclet<LLIMGroupChiclet>(session_id);
+ case LLIMChiclet::TYPE_AD_HOC:
+ return getChicletPanel()->createChiclet<LLAdHocChiclet>(session_id);
+ case LLIMChiclet::TYPE_UNKNOWN:
+ break;
+ }
+
+ return NULL;
+}
+
+//virtual
+void LLChicletBar::sessionAdded(const LLUUID& session_id, const std::string& name, const LLUUID& other_participant_id)
+{
+ if (!getChicletPanel()) return;
+
+ LLIMModel::LLIMSession* session = LLIMModel::getInstance()->findIMSession(session_id);
+ if (!session) return;
+
+ // no need to spawn chiclets for participants in P2P calls called through Avaline
+ if (session->isP2P() && session->isOtherParticipantAvaline()) return;
+
+ if (getChicletPanel()->findChiclet<LLChiclet>(session_id)) return;
+
+ LLIMChiclet* chiclet = createIMChiclet(session_id);
+ if(chiclet)
+ {
+ chiclet->setIMSessionName(name);
+ chiclet->setOtherParticipantId(other_participant_id);
+
+ LLIMFloater::onIMChicletCreated(session_id);
+
+ }
+ else
+ {
+ llwarns << "Could not create chiclet" << llendl;
+ }
+}
+
+//virtual
+void LLChicletBar::sessionRemoved(const LLUUID& session_id)
+{
+ if(getChicletPanel())
+ {
+ // IM floater should be closed when session removed and associated chiclet closed
+ LLIMFloater* iMfloater = LLFloaterReg::findTypedInstance<LLIMFloater>("impanel", session_id);
+ if (iMfloater != NULL)
+ {
+ iMfloater->closeFloater();
+ }
+
+ getChicletPanel()->removeChiclet(session_id);
+ }
+}
+
+void LLChicletBar::sessionIDUpdated(const LLUUID& old_session_id, const LLUUID& new_session_id)
+{
+ //this is only needed in case of outgoing ad-hoc/group chat sessions
+ LLChicletPanel* chiclet_panel = getChicletPanel();
+ if (chiclet_panel)
+ {
+ //it should be ad-hoc im chiclet or group im chiclet
+ LLChiclet* chiclet = chiclet_panel->findChiclet<LLChiclet>(old_session_id);
+ if (chiclet) chiclet->setSessionId(new_session_id);
+ }
+}
+
+S32 LLChicletBar::getTotalUnreadIMCount()
+{
+ return getChicletPanel()->getTotalUnreadIMCount();
+}
+
+BOOL LLChicletBar::postBuild()
+{
+ mToolbarStack = getChild<LLLayoutStack>("toolbar_stack");
+ mChicletPanel = getChild<LLChicletPanel>("chiclet_list");
+
+ showWellButton("im_well", !LLIMWellWindow::getInstance()->isWindowEmpty());
+ showWellButton("notification_well", !LLNotificationWellWindow::getInstance()->isWindowEmpty());
+
+ LLPanelTopInfoBar::instance().setResizeCallback(boost::bind(&LLChicletBar::fitWithTopInfoBar, this));
+ LLPanelTopInfoBar::instance().setVisibleCallback(boost::bind(&LLChicletBar::fitWithTopInfoBar, this));
+
+ return TRUE;
+}
+
+void LLChicletBar::showWellButton(const std::string& well_name, bool visible)
+{
+ LLView * panel = findChild<LLView>(well_name + "_panel");
+ if (!panel) return;
+
+ panel->setVisible(visible);
+}
+
+void LLChicletBar::log(LLView* panel, const std::string& descr)
+{
+ if (NULL == panel) return;
+ LLView* layout = panel->getParent();
+ LL_DEBUGS("Chiclet Bar Rects") << descr << ": "
+ << "panel: " << panel->getName()
+ << ", rect: " << panel->getRect()
+ << " layout: " << layout->getName()
+ << ", rect: " << layout->getRect()
+ << LL_ENDL;
+}
+
+void LLChicletBar::reshape(S32 width, S32 height, BOOL called_from_parent)
+{
+ static S32 debug_calling_number = 0;
+ lldebugs << "**************************************** " << ++debug_calling_number << llendl;
+
+ S32 current_width = getRect().getWidth();
+ S32 delta_width = width - current_width;
+ lldebugs << "Reshaping: "
+ << ", width: " << width
+ << ", cur width: " << current_width
+ << ", delta_width: " << delta_width
+ << ", called_from_parent: " << called_from_parent
+ << llendl;
+
+ if (mChicletPanel) log(mChicletPanel, "before");
+
+ // Difference between chiclet bar width required to fit its children and the actual width. (see EXT-991)
+ // Positive value means that chiclet bar is not wide enough.
+ // Negative value means that there is free space.
+ static S32 extra_shrink_width = 0;
+ bool should_be_reshaped = true;
+
+ if (mChicletPanel && mToolbarStack)
+ {
+ // Firstly, update layout stack to ensure we deal with correct panel sizes.
+ {
+ // Force the updating of layout to reset panels collapse factor.
+ mToolbarStack->updateLayout();
+ }
+
+ // chiclet bar is narrowed
+ if (delta_width < 0)
+ {
+ if (extra_shrink_width > 0) // not enough space
+ {
+ extra_shrink_width += llabs(delta_width);
+ should_be_reshaped = false;
+ }
+ else
+ {
+ extra_shrink_width = processWidthDecreased(delta_width);
+
+ // increase new width to extra_shrink_width value to not reshape less than chiclet bar minimum
+ width += extra_shrink_width;
+ }
+ }
+ // chiclet bar is widened
+ else
+ {
+ if (extra_shrink_width > delta_width)
+ {
+ // Still not enough space.
+ // Only subtract the delta from the required delta and don't reshape.
+ extra_shrink_width -= delta_width;
+ should_be_reshaped = false;
+ }
+ else if (extra_shrink_width > 0)
+ {
+ // If we have some extra shrink width let's reduce delta_width & width
+ delta_width -= extra_shrink_width;
+ width -= extra_shrink_width;
+ extra_shrink_width = 0;
+ }
+ }
+ }
+
+ if (should_be_reshaped)
+ {
+ lldebugs << "Reshape all children with width: " << width << llendl;
+ LLPanel::reshape(width, height, called_from_parent);
+ }
+
+ if (mChicletPanel) log(mChicletPanel, "after");
+}
+
+S32 LLChicletBar::processWidthDecreased(S32 delta_width)
+{
+ bool still_should_be_processed = true;
+
+ const S32 chiclet_panel_shrink_headroom = getChicletPanelShrinkHeadroom();
+
+ // Decreasing width of chiclet panel.
+ if (chiclet_panel_shrink_headroom > 0)
+ {
+ // we have some space to decrease chiclet panel
+ S32 shrink_by = llmin(-delta_width, chiclet_panel_shrink_headroom);
+
+ lldebugs << "delta_width: " << delta_width
+ << ", panel_delta_min: " << chiclet_panel_shrink_headroom
+ << ", shrink_by: " << shrink_by
+ << llendl;
+
+ // is chiclet panel wide enough to process resizing?
+ delta_width += chiclet_panel_shrink_headroom;
+
+ still_should_be_processed = delta_width < 0;
+
+ lldebugs << "Shrinking chiclet panel by " << shrink_by << " px" << llendl;
+ mChicletPanel->getParent()->reshape(mChicletPanel->getParent()->getRect().getWidth() - shrink_by, mChicletPanel->getParent()->getRect().getHeight());
+ log(mChicletPanel, "after processing panel decreasing via chiclet panel");
+
+ lldebugs << "RS_CHICLET_PANEL"
+ << ", delta_width: " << delta_width
+ << llendl;
+ }
+
+ S32 extra_shrink_width = 0;
+
+ if (still_should_be_processed)
+ {
+ extra_shrink_width = -delta_width;
+ llwarns << "There is no enough width to reshape all children: "
+ << extra_shrink_width << llendl;
+ }
+
+ return extra_shrink_width;
+}
+
+S32 LLChicletBar::getChicletPanelShrinkHeadroom() const
+{
+ static const S32 min_width = mChicletPanel->getMinWidth();
+ const S32 cur_width = mChicletPanel->getParent()->getRect().getWidth();
+
+ S32 shrink_headroom = cur_width - min_width;
+ llassert(shrink_headroom >= 0); // the panel cannot get narrower than the minimum
+ return shrink_headroom;
+}
+
+void LLChicletBar::fitWithTopInfoBar()
+{
+ LLPanelTopInfoBar& top_info_bar = LLPanelTopInfoBar::instance();
+
+ LLRect rect = getRect();
+ S32 width = rect.getWidth();
+
+ if (top_info_bar.getVisible())
+ {
+ S32 delta = top_info_bar.calcScreenRect().mRight - calcScreenRect().mLeft;
+ if (delta < 0 && rect.mLeft < llabs(delta))
+ delta = -rect.mLeft;
+ rect.setLeftTopAndSize(rect.mLeft + delta, rect.mTop, rect.getWidth(), rect.getHeight());
+ width = rect.getWidth() - delta;
+ }
+ else
+ {
+ LLView* parent = getParent();
+ if (parent)
+ {
+ LLRect parent_rect = parent->getRect();
+ rect.setLeftTopAndSize(0, rect.mTop, rect.getWidth(), rect.getHeight());
+ width = parent_rect.getWidth();
+ }
+ }
+
+ setRect(rect);
+ LLPanel::reshape(width, rect.getHeight(), false);
+}
diff --git a/indra/newview/llchicletbar.h b/indra/newview/llchicletbar.h
new file mode 100644
index 0000000000..1427bf95e0
--- /dev/null
+++ b/indra/newview/llchicletbar.h
@@ -0,0 +1,105 @@
+/**
+* @file llchicletbar.h
+* @brief LLChicletBar class header file
+*
+* $LicenseInfo:firstyear=2011&license=viewerlgpl$
+* Second Life Viewer Source Code
+* Copyright (C) 2011, Linden Research, Inc.
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU Lesser General Public
+* License as published by the Free Software Foundation;
+* version 2.1 of the License only.
+*
+* This library is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this library; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+*
+* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+* $/LicenseInfo$
+*/
+
+#ifndef LL_LLCHICLETBAR_H
+#define LL_LLCHICLETBAR_H
+
+#include "llpanel.h"
+#include "llimview.h"
+
+class LLChicletPanel;
+class LLIMChiclet;
+class LLLayoutPanel;
+class LLLayoutStack;
+
+class LLChicletBar
+ : public LLSingleton<LLChicletBar>
+ , public LLPanel
+ , public LLIMSessionObserver
+{
+ LOG_CLASS(LLChicletBar);
+ friend class LLSingleton<LLChicletBar>;
+public:
+ ~LLChicletBar();
+
+ BOOL postBuild();
+
+ LLChicletPanel* getChicletPanel() { return mChicletPanel; }
+
+ // LLIMSessionObserver observe triggers
+ virtual void sessionAdded(const LLUUID& session_id, const std::string& name, const LLUUID& other_participant_id);
+ virtual void sessionRemoved(const LLUUID& session_id);
+ void sessionIDUpdated(const LLUUID& old_session_id, const LLUUID& new_session_id);
+
+ S32 getTotalUnreadIMCount();
+
+ /*virtual*/ void reshape(S32 width, S32 height, BOOL called_from_parent);
+
+ /**
+ * Creates IM Chiclet based on session type (IM chat or Group chat)
+ */
+ LLIMChiclet* createIMChiclet(const LLUUID& session_id);
+
+ /**
+ * Shows/hides panel with specified well button (IM or Notification)
+ *
+ * @param well_name - name of the well panel to be processed.
+ * @param visible - a flag specifying whether a button should be shown or hidden.
+ */
+ void showWellButton(const std::string& well_name, bool visible);
+
+private:
+ /**
+ * Updates child controls size and visibility when it is necessary to reduce total width.
+ *
+ * @param delta_width - value by which chiclet bar should be shrunk. It is a negative value.
+ * @returns positive value which chiclet bar can not process when it reaches its minimal width.
+ * Zero if there was enough space to process delta_width.
+ */
+ S32 processWidthDecreased(S32 delta_width);
+
+ /** helper function to log debug messages */
+ void log(LLView* panel, const std::string& descr);
+
+ /**
+ * @return difference between current chiclet panel width and the minimum.
+ */
+ S32 getChicletPanelShrinkHeadroom() const;
+
+ /**
+ * function adjusts Chiclet bar width to prevent overlapping with Mini-Location bar
+ * EXP-1463
+ */
+ void fitWithTopInfoBar();
+
+protected:
+ LLChicletBar(const LLSD& key = LLSD());
+
+ LLChicletPanel* mChicletPanel;
+ LLLayoutStack* mToolbarStack;
+};
+
+#endif // LL_LLCHICLETBAR_H
diff --git a/indra/newview/llcofwearables.cpp b/indra/newview/llcofwearables.cpp
index 254c0adef1..e9c7a3fa03 100644
--- a/indra/newview/llcofwearables.cpp
+++ b/indra/newview/llcofwearables.cpp
@@ -33,6 +33,7 @@
#include "llagentdata.h"
#include "llagentwearables.h"
#include "llappearancemgr.h"
+#include "llfloatersidepanelcontainer.h"
#include "llinventory.h"
#include "llinventoryfunctions.h"
#include "lllistcontextmenu.h"
@@ -40,7 +41,6 @@
#include "llviewermenu.h"
#include "llwearableitemslist.h"
#include "llpaneloutfitedit.h"
-#include "llsidetray.h"
#include "lltrans.h"
static LLRegisterPanelClassWrapper<LLCOFWearables> t_cof_wearables("cof_wearables");
@@ -159,13 +159,8 @@ public:
protected:
static void replaceWearable(const LLUUID& item_id)
{
- // *TODO: Most probable that accessing to LLPanelOutfitEdit instance should be:
- // LLSideTray::getInstance()->getSidepanelAppearance()->getPanelOutfitEdit()
- // without casting. Getter methods provides possibility to check and construct
- // absent instance. Explicit relations between components avoids situations
- // when we tries to construct instance with unsatisfied implicit input conditions.
LLPanelOutfitEdit * panel_outfit_edit =
- dynamic_cast<LLPanelOutfitEdit*> (LLSideTray::getInstance()->getPanel(
+ dynamic_cast<LLPanelOutfitEdit*> (LLFloaterSidePanelContainer::getPanel("appearance",
"panel_outfit_edit"));
if (panel_outfit_edit != NULL)
{
@@ -235,9 +230,7 @@ protected:
LLUICtrl::EnableCallbackRegistry::ScopedRegistrar enable_registrar;
LLUUID selected_id = mUUIDs.back();
- // *HACK* need to pass pointer to LLPanelOutfitEdit instead of LLSideTray::getInstance()->getPanel().
- // LLSideTray::getInstance()->getPanel() is rather slow variant
- LLPanelOutfitEdit* panel_oe = dynamic_cast<LLPanelOutfitEdit*>(LLSideTray::getInstance()->getPanel("panel_outfit_edit"));
+ LLPanelOutfitEdit* panel_oe = dynamic_cast<LLPanelOutfitEdit*>(LLFloaterSidePanelContainer::getPanel("appearance", "panel_outfit_edit"));
registrar.add("BodyPart.Replace", boost::bind(&LLPanelOutfitEdit::onReplaceMenuItemClicked, panel_oe, selected_id));
registrar.add("BodyPart.Edit", boost::bind(LLAgentWearables::editWearable, selected_id));
registrar.add("BodyPart.Create", boost::bind(&CofBodyPartContextMenu::createNew, this, selected_id));
@@ -335,6 +328,19 @@ BOOL LLCOFWearables::postBuild()
return LLPanel::postBuild();
}
+void LLCOFWearables::setAttachmentsTitle()
+{
+ if (mAttachmentsTab)
+ {
+ U32 free_slots = MAX_AGENT_ATTACHMENTS - mAttachments->size();
+
+ LLStringUtil::format_map_t args_attachments;
+ args_attachments["[COUNT]"] = llformat ("%d", free_slots);
+ std::string attachments_title = LLTrans::getString("Attachments remain", args_attachments);
+ mAttachmentsTab->setTitle(attachments_title);
+ }
+}
+
void LLCOFWearables::onSelectionChange(LLFlatListView* selected_list)
{
if (!selected_list) return;
@@ -497,6 +503,7 @@ void LLCOFWearables::populateAttachmentsAndBodypartsLists(const LLInventoryModel
{
mAttachments->sort();
mAttachments->notify(REARRANGE); //notifying the parent about the list's size change (cause items were added with rearrange=false)
+ setAttachmentsTitle();
}
else
{
diff --git a/indra/newview/llcofwearables.h b/indra/newview/llcofwearables.h
index 1f8d6d0c94..9957d6a64e 100644
--- a/indra/newview/llcofwearables.h
+++ b/indra/newview/llcofwearables.h
@@ -91,6 +91,8 @@ public:
*/
void selectClothing(LLWearableType::EType clothing_type);
+ void setAttachmentsTitle();
+
protected:
void populateAttachmentsAndBodypartsLists(const LLInventoryModel::item_array_t& cof_items);
diff --git a/indra/newview/llcommandlineparser.cpp b/indra/newview/llcommandlineparser.cpp
index 65c61c4a8b..17d403bbe1 100644
--- a/indra/newview/llcommandlineparser.cpp
+++ b/indra/newview/llcommandlineparser.cpp
@@ -342,6 +342,15 @@ bool LLCommandLineParser::parseCommandLine(int argc, char **argv)
return parseAndStoreResults(clp);
}
+// TODO:
+// - Break out this funky parsing logic into separate method
+// - Unit-test it with tests like LLStringUtil::getTokens() (the command-line
+// overload that supports quoted tokens)
+// - Unless this logic offers significant semantic benefits, replace it with
+// LLStringUtil::getTokens(). This would fix a known bug: you cannot --set a
+// string-valued variable to the empty string, because empty strings are
+// eliminated below.
+
bool LLCommandLineParser::parseCommandLineString(const std::string& str)
{
// Split the string content into tokens
diff --git a/indra/newview/llcylinder.cpp b/indra/newview/llcylinder.cpp
index 4901e29691..f353851a25 100644
--- a/indra/newview/llcylinder.cpp
+++ b/indra/newview/llcylinder.cpp
@@ -37,261 +37,39 @@
#include "llgl.h"
#include "llglheaders.h"
-LLCylinder gCylinder;
LLCone gCone;
-GLUquadricObj* gQuadObj = NULL;
-
-static const GLint SLICES[] = { 30, 20, 12, 6 }; // same as sphere slices
-static const GLint STACKS = 2;
-static const GLfloat RADIUS = 0.5f;
-
-// draws a cylinder or cone
-// returns approximate number of triangles required
-U32 draw_cylinder_side(GLint slices, GLint stacks, GLfloat base_radius, GLfloat top_radius)
-{
- U32 triangles = 0;
- GLfloat height = 1.0f;
-
- if (!gQuadObj)
- {
- gQuadObj = gluNewQuadric();
- if (!gQuadObj) llerror("draw_cylindrical_body couldn't allocated quadric", 0);
- }
-
- gluQuadricDrawStyle(gQuadObj, GLU_FILL);
- gluQuadricNormals(gQuadObj, GLU_SMOOTH);
- gluQuadricOrientation(gQuadObj, GLU_OUTSIDE);
- gluQuadricTexture(gQuadObj, GL_TRUE);
- gluCylinder(gQuadObj, base_radius, top_radius, height, slices, stacks);
- triangles += stacks * (slices * 2);
-
-
- return triangles;
-}
-
-
-// Returns number of triangles required to draw
-// Need to know if top or not to set lighting normals
-const BOOL TOP = TRUE;
-const BOOL BOTTOM = FALSE;
-U32 draw_cylinder_cap(GLint slices, GLfloat base_radius, BOOL is_top)
-{
- U32 triangles = 0;
-
- if (!gQuadObj)
- {
- gQuadObj = gluNewQuadric();
- if (!gQuadObj) llerror("draw_cylinder_base couldn't allocated quadric", 0);
- }
-
- gluQuadricDrawStyle(gQuadObj, GLU_FILL);
- gluQuadricNormals(gQuadObj, GLU_SMOOTH);
- gluQuadricOrientation(gQuadObj, GLU_OUTSIDE);
- gluQuadricTexture(gQuadObj, GL_TRUE);
-
- // no hole in the middle of the disk, and just one ring
- GLdouble inner_radius = 0.0;
- GLint rings = 1;
-
- // normals point in +z for top, -z for base
- if (is_top)
- {
- gluQuadricOrientation(gQuadObj, GLU_OUTSIDE);
- }
- else
- {
- gluQuadricOrientation(gQuadObj, GLU_INSIDE);
- }
- gluDisk(gQuadObj, inner_radius, base_radius, slices, rings);
- triangles += slices;
-
- return triangles;
-}
-
-void LLCylinder::drawSide(S32 detail)
-{
- draw_cylinder_side(SLICES[detail], STACKS, RADIUS, RADIUS);
-}
-
-void LLCylinder::drawTop(S32 detail)
-{
- draw_cylinder_cap(SLICES[detail], RADIUS, TOP);
-}
-
-void LLCylinder::drawBottom(S32 detail)
-{
- draw_cylinder_cap(SLICES[detail], RADIUS, BOTTOM);
-}
-
-void LLCylinder::prerender()
-{
-}
-
-void LLCylinder::cleanupGL()
-{
- if (gQuadObj)
- {
- gluDeleteQuadric(gQuadObj);
- gQuadObj = NULL;
- }
-}
-
-void LLCylinder::render(F32 pixel_area)
-{
- renderface(pixel_area, 0);
- renderface(pixel_area, 1);
- renderface(pixel_area, 2);
-}
-
-
-void LLCylinder::renderface(F32 pixel_area, S32 face)
-{
- if (face < 0 || face > 2)
- {
- llerror("LLCylinder::renderface() invalid face number", face);
- return;
- }
-
- glMatrixMode(GL_MODELVIEW);
- glPushMatrix();
-
- S32 level_of_detail;
-
- if (pixel_area > 20000.f)
- {
- level_of_detail = 0;
- }
- else if (pixel_area > 1600.f)
- {
- level_of_detail = 1;
- }
- else if (pixel_area > 200.f)
- {
- level_of_detail = 2;
- }
- else
- {
- level_of_detail = 3;
- }
-
- if (level_of_detail < 0 || CYLINDER_LEVELS_OF_DETAIL <= level_of_detail)
- {
- llerror("LLCylinder::renderface() invalid level of detail", level_of_detail);
- return;
- }
-
- LLVertexBuffer::unbind();
-
- switch(face)
- {
- case 0:
- glTranslatef(0.f, 0.f, -0.5f);
- drawSide(level_of_detail);
- break;
- case 1:
- glTranslatef(0.0f, 0.f, 0.5f);
- drawTop(level_of_detail);
- break;
- case 2:
- glTranslatef(0.0f, 0.f, -0.5f);
- drawBottom(level_of_detail);
- break;
- default:
- llerror("LLCylinder::renderface() fell out of switch", 0);
- break;
- }
-
- glMatrixMode(GL_MODELVIEW);
- glPopMatrix();
-}
-
-
//
// Cones
//
-void LLCone::prerender()
+void LLCone::render(S32 sides)
{
-}
+ gGL.begin(LLRender::TRIANGLE_FAN);
+ gGL.vertex3f(0,0,0);
-void LLCone::cleanupGL()
-{
- if (gQuadObj)
+ for (U32 i = 0; i < sides; i++)
{
- gluDeleteQuadric(gQuadObj);
- gQuadObj = NULL;
+ F32 a = (F32) i/sides * F_PI*2.f;
+ F32 x = cosf(a)*0.5f;
+ F32 y = sinf(a)*0.5f;
+ gGL.vertex3f(x,y,-.5f);
}
-}
+ gGL.vertex3f(cosf(0.f)*0.5f, sinf(0.f)*0.5f, -0.5f);
-void LLCone::drawSide(S32 detail)
-{
- draw_cylinder_side( SLICES[detail], STACKS, RADIUS, 0.f );
-}
-
-void LLCone::drawBottom(S32 detail)
-{
- draw_cylinder_cap( SLICES[detail], RADIUS, BOTTOM );
-}
-
-void LLCone::render(S32 level_of_detail)
-{
- GLfloat height = 1.0f;
+ gGL.end();
- if (level_of_detail < 0 || CONE_LEVELS_OF_DETAIL <= level_of_detail)
+ gGL.begin(LLRender::TRIANGLE_FAN);
+ gGL.vertex3f(0.f, 0.f, 0.5f);
+ for (U32 i = 0; i < sides; i++)
{
- llerror("LLCone::render() invalid level of detail", level_of_detail);
- return;
+ F32 a = (F32) i/sides * F_PI*2.f;
+ F32 x = cosf(a)*0.5f;
+ F32 y = sinf(a)*0.5f;
+ gGL.vertex3f(x,y,-0.5f);
}
+ gGL.vertex3f(cosf(0.f)*0.5f, sinf(0.f)*0.5f, -0.5f);
- glMatrixMode(GL_MODELVIEW);
- glPushMatrix();
-
- // center object at 0
- glTranslatef(0.f, 0.f, - height / 2.0f);
-
- drawSide(level_of_detail);
- drawBottom(level_of_detail);
-
- glMatrixMode(GL_MODELVIEW);
- glPopMatrix();
+ gGL.end();
}
-
-void LLCone::renderface(S32 level_of_detail, S32 face)
-{
- if (face < 0 || face > 1)
- {
- llerror("LLCone::renderface() invalid face number", face);
- return;
- }
-
- if (level_of_detail < 0 || CONE_LEVELS_OF_DETAIL <= level_of_detail)
- {
- llerror("LLCone::renderface() invalid level of detail", level_of_detail);
- return;
- }
-
- glMatrixMode(GL_MODELVIEW);
- glPushMatrix();
-
- LLVertexBuffer::unbind();
-
- switch(face)
- {
- case 0:
- glTranslatef(0.f, 0.f, -0.5f);
- drawSide(level_of_detail);
- break;
- case 1:
- glTranslatef(0.f, 0.f, -0.5f);
- drawBottom(level_of_detail);
- break;
- default:
- llerror("LLCylinder::renderface() fell out of switch", 0);
- break;
- }
-
- glMatrixMode(GL_MODELVIEW);
- glPopMatrix();
-}
diff --git a/indra/newview/llcylinder.h b/indra/newview/llcylinder.h
index 40a669ceb6..4369f06659 100644
--- a/indra/newview/llcylinder.h
+++ b/indra/newview/llcylinder.h
@@ -30,45 +30,18 @@
//#include "stdtypes.h"
//#include "llgl.h"
-//
-// Cylinders
-//
-const S32 CYLINDER_LEVELS_OF_DETAIL = 4;
-const S32 CYLINDER_FACES = 3;
-
-class LLCylinder
-{
-public:
- void prerender();
- void drawTop(S32 detail);
- void drawSide(S32 detail);
- void drawBottom(S32 detail);
- void cleanupGL();
-
- void render(F32 pixel_area);
- void renderface(F32 pixel_area, S32 face);
-};
-
+#include "llvertexbuffer.h"
//
// Cones
//
-const S32 CONE_LOD_HIGHEST = 0;
-const S32 CONE_LEVELS_OF_DETAIL = 4;
-const S32 CONE_FACES = 2;
-
class LLCone
{
public:
- void prerender();
- void cleanupGL();
- void drawSide(S32 detail);
- void drawBottom(S32 detail);
- void render(S32 level_of_detail);
- void renderface(S32 level_of_detail, S32 face);
+ void render(S32 sides = 12);
};
-extern LLCylinder gCylinder;
+
extern LLCone gCone;
#endif
diff --git a/indra/newview/lldebugview.cpp b/indra/newview/lldebugview.cpp
index cc6ba05e7e..7d3170cb76 100644
--- a/indra/newview/lldebugview.cpp
+++ b/indra/newview/lldebugview.cpp
@@ -55,9 +55,23 @@ LLDebugView* gDebugView = NULL;
static LLDefaultChildRegistry::Register<LLDebugView> r("debug_view");
LLDebugView::LLDebugView(const LLDebugView::Params& p)
-: LLView(p)
+: LLView(p),
+ mFastTimerView(NULL),
+ mMemoryView(NULL),
+ mDebugConsolep(NULL),
+ mFloaterSnapRegion(NULL)
{}
+LLDebugView::~LLDebugView()
+{
+ // These have already been deleted. Fix the globals appropriately.
+ gDebugView = NULL;
+ gTextureView = NULL;
+ gSceneView = NULL;
+ gTextureSizeView = NULL;
+ gTextureCategoryView = NULL;
+}
+
void LLDebugView::init()
{
LLRect r;
@@ -109,8 +123,6 @@ void LLDebugView::init()
addChild(gTextureView);
//gTextureView->reshape(r.getWidth(), r.getHeight(), TRUE);
-
-
if(gAuditTexture)
{
@@ -136,14 +148,16 @@ void LLDebugView::init()
}
}
-
-LLDebugView::~LLDebugView()
+void LLDebugView::draw()
{
- // These have already been deleted. Fix the globals appropriately.
- gDebugView = NULL;
- gTextureView = NULL;
- gSceneView = NULL;
- gTextureSizeView = NULL;
- gTextureCategoryView = NULL;
-}
+ if (mFloaterSnapRegion == NULL)
+ {
+ mFloaterSnapRegion = getRootView()->getChildView("floater_snap_region");
+ }
+
+ LLRect debug_rect;
+ mFloaterSnapRegion->localRectToOtherView(mFloaterSnapRegion->getLocalRect(), &debug_rect, getParent());
+ setShape(debug_rect);
+ LLView::draw();
+}
diff --git a/indra/newview/lldebugview.h b/indra/newview/lldebugview.h
index 20262fc89e..5aec77ad62 100644
--- a/indra/newview/lldebugview.h
+++ b/indra/newview/lldebugview.h
@@ -51,16 +51,19 @@ public:
changeDefault(mouse_opaque, false);
}
};
+
LLDebugView(const Params&);
~LLDebugView();
void init();
-
+ void draw();
+
void setStatsVisible(BOOL visible);
LLFastTimerView* mFastTimerView;
LLMemoryView* mMemoryView;
LLConsole* mDebugConsolep;
+ LLView* mFloaterSnapRegion;
};
extern LLDebugView* gDebugView;
diff --git a/indra/newview/lldirpicker.cpp b/indra/newview/lldirpicker.cpp
index dd243397a1..1e03582a29 100644
--- a/indra/newview/lldirpicker.cpp
+++ b/indra/newview/lldirpicker.cpp
@@ -217,12 +217,12 @@ OSStatus LLDirPicker::doNavChooseDialog()
error = NavCreateChooseFolderDialog(&mNavOptions, &doNavCallbackEvent, NULL, NULL, &navRef);
- gViewerWindow->mWindow->beforeDialog();
+ gViewerWindow->getWindow()->beforeDialog();
if (error == noErr)
error = NavDialogRun(navRef);
- gViewerWindow->mWindow->afterDialog();
+ gViewerWindow->getWindow()->afterDialog();
if (error == noErr)
error = NavDialogGetReply(navRef, &navReply);
diff --git a/indra/newview/lldndbutton.cpp b/indra/newview/lldndbutton.cpp
index 8a38c8a643..7c9dda6b1d 100644
--- a/indra/newview/lldndbutton.cpp
+++ b/indra/newview/lldndbutton.cpp
@@ -31,16 +31,9 @@
static LLDefaultChildRegistry::Register<LLDragAndDropButton> r("dnd_button");
-LLDragAndDropButton::Params::Params()
-{
-
-}
-
LLDragAndDropButton::LLDragAndDropButton(const Params& params)
: LLButton(params)
-{
-
-}
+{}
BOOL LLDragAndDropButton::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, EDragAndDropType cargo_type, void* cargo_data, EAcceptance* accept, std::string& tooltip_msg)
{
diff --git a/indra/newview/lldndbutton.h b/indra/newview/lldndbutton.h
index 0642cbb7b9..53ea2f5ea7 100644
--- a/indra/newview/lldndbutton.h
+++ b/indra/newview/lldndbutton.h
@@ -43,10 +43,7 @@
class LLDragAndDropButton : public LLButton
{
public:
- struct Params : public LLInitParam::Block<Params, LLButton::Params>
- {
- Params();
- };
+ struct Params : public LLInitParam::Block<Params, LLButton::Params> {};
LLDragAndDropButton(const Params& params);
diff --git a/indra/newview/lldrawable.cpp b/indra/newview/lldrawable.cpp
index debac9dcbf..21b21c152a 100644
--- a/indra/newview/lldrawable.cpp
+++ b/indra/newview/lldrawable.cpp
@@ -1077,6 +1077,7 @@ BOOL LLDrawable::isVisible() const
LLSpatialBridge::LLSpatialBridge(LLDrawable* root, BOOL render_by_group, U32 data_mask)
: LLSpatialPartition(data_mask, render_by_group, GL_STREAM_DRAW_ARB)
{
+ mBridge = this;
mDrawable = root;
root->setSpatialBridge(this);
@@ -1105,6 +1106,15 @@ LLSpatialBridge::~LLSpatialBridge()
{
group->mSpatialPartition->remove(this, group);
}
+
+ //delete octree here so listeners will still be able to access bridge specific state
+ destroyTree();
+}
+
+void LLSpatialBridge::destroyTree()
+{
+ delete mOctree;
+ mOctree = NULL;
}
void LLSpatialBridge::updateSpatialExtents()
diff --git a/indra/newview/lldrawpool.cpp b/indra/newview/lldrawpool.cpp
index 286284f828..35f8a85796 100644
--- a/indra/newview/lldrawpool.cpp
+++ b/indra/newview/lldrawpool.cpp
@@ -384,7 +384,7 @@ BOOL LLFacePool::LLOverrideFaceColor::sOverrideFaceColor = FALSE;
void LLFacePool::LLOverrideFaceColor::setColor(const LLColor4& color)
{
- glColor4fv(color.mV);
+ gGL.diffuseColor4fv(color.mV);
}
void LLFacePool::LLOverrideFaceColor::setColor(const LLColor4U& color)
@@ -394,7 +394,7 @@ void LLFacePool::LLOverrideFaceColor::setColor(const LLColor4U& color)
void LLFacePool::LLOverrideFaceColor::setColor(F32 r, F32 g, F32 b, F32 a)
{
- glColor4f(r,g,b,a);
+ gGL.diffuseColor4f(r,g,b,a);
}
@@ -457,10 +457,10 @@ void LLRenderPass::applyModelMatrix(LLDrawInfo& params)
if (params.mModelMatrix != gGLLastMatrix)
{
gGLLastMatrix = params.mModelMatrix;
- glLoadMatrixd(gGLModelView);
+ gGL.loadMatrix(gGLModelView);
if (params.mModelMatrix)
{
- glMultMatrixf((GLfloat*) params.mModelMatrix->mMatrix);
+ gGL.multMatrix((GLfloat*) params.mModelMatrix->mMatrix);
}
gPipeline.mMatrixOpCount++;
}
@@ -494,8 +494,8 @@ void LLRenderPass::pushBatch(LLDrawInfo& params, U32 mask, BOOL texture, BOOL ba
{
tex_setup = true;
gGL.getTexUnit(0)->activate();
- glMatrixMode(GL_TEXTURE);
- glLoadMatrixf((GLfloat*) params.mTextureMatrix->mMatrix);
+ gGL.matrixMode(LLRender::MM_TEXTURE);
+ gGL.loadMatrix((GLfloat*) params.mTextureMatrix->mMatrix);
gPipeline.mTextureMatrixOps++;
}
}
@@ -519,8 +519,8 @@ void LLRenderPass::pushBatch(LLDrawInfo& params, U32 mask, BOOL texture, BOOL ba
if (tex_setup)
{
- glLoadIdentity();
- glMatrixMode(GL_MODELVIEW);
+ gGL.loadIdentity();
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
}
}
diff --git a/indra/newview/lldrawpool.h b/indra/newview/lldrawpool.h
index c7acbb42c6..64774d06df 100644
--- a/indra/newview/lldrawpool.h
+++ b/indra/newview/lldrawpool.h
@@ -133,7 +133,7 @@ public:
PASS_ALPHA,
PASS_ALPHA_MASK,
PASS_FULLBRIGHT_ALPHA_MASK,
- PASS_ALPHA_SHADOW,
+ PASS_ALPHA_INVISIBLE,
NUM_RENDER_TYPES,
};
diff --git a/indra/newview/lldrawpoolalpha.cpp b/indra/newview/lldrawpoolalpha.cpp
index 9719140a37..5b62dbc560 100644
--- a/indra/newview/lldrawpoolalpha.cpp
+++ b/indra/newview/lldrawpoolalpha.cpp
@@ -54,7 +54,7 @@ static BOOL deferred_render = FALSE;
LLDrawPoolAlpha::LLDrawPoolAlpha(U32 type) :
LLRenderPass(type), current_shader(NULL), target_shader(NULL),
- simple_shader(NULL), fullbright_shader(NULL),
+ simple_shader(NULL), fullbright_shader(NULL), emissive_shader(NULL),
mColorSFactor(LLRender::BF_UNDEF), mColorDFactor(LLRender::BF_UNDEF),
mAlphaSFactor(LLRender::BF_UNDEF), mAlphaDFactor(LLRender::BF_UNDEF)
{
@@ -90,7 +90,7 @@ void LLDrawPoolAlpha::renderDeferred(S32 pass)
{
LLFastTimer t(FTM_RENDER_GRASS);
gDeferredDiffuseAlphaMaskProgram.bind();
- gDeferredDiffuseAlphaMaskProgram.setAlphaRange(0.33f, 1.f);
+ gDeferredDiffuseAlphaMaskProgram.setMinimumAlpha(0.33f);
//render alpha masked objects
LLRenderPass::pushBatches(LLRenderPass::PASS_ALPHA_MASK, getVertexDataMask() | LLVertexBuffer::MAP_TEXTURE_INDEX, TRUE, TRUE);
@@ -136,7 +136,7 @@ void LLDrawPoolAlpha::beginPostDeferredPass(S32 pass)
simple_shader = NULL;
fullbright_shader = NULL;
gObjectFullbrightAlphaMaskProgram.bind();
- gObjectFullbrightAlphaMaskProgram.setAlphaRange(0.33f, 1.f);
+ gObjectFullbrightAlphaMaskProgram.setMinimumAlpha(0.33f);
}
deferred_render = TRUE;
@@ -175,11 +175,13 @@ void LLDrawPoolAlpha::beginRenderPass(S32 pass)
{
simple_shader = &gObjectSimpleWaterAlphaMaskProgram;
fullbright_shader = &gObjectFullbrightWaterAlphaMaskProgram;
+ emissive_shader = &gObjectEmissiveWaterProgram;
}
else
{
simple_shader = &gObjectSimpleAlphaMaskProgram;
fullbright_shader = &gObjectFullbrightAlphaMaskProgram;
+ emissive_shader = &gObjectEmissiveProgram;
}
if (mVertexShaderLevel > 0)
@@ -230,14 +232,14 @@ void LLDrawPoolAlpha::render(S32 pass)
if (!LLPipeline::sRenderDeferred || !deferred_render)
{
simple_shader->bind();
- simple_shader->setAlphaRange(0.33f, 1.f);
+ simple_shader->setMinimumAlpha(0.33f);
pushBatches(LLRenderPass::PASS_ALPHA_MASK, getVertexDataMask() | LLVertexBuffer::MAP_TEXTURE_INDEX, TRUE, TRUE);
}
if (fullbright_shader)
{
fullbright_shader->bind();
- fullbright_shader->setAlphaRange(0.33f, 1.f);
+ fullbright_shader->setMinimumAlpha(0.33f);
}
pushBatches(LLRenderPass::PASS_FULLBRIGHT_ALPHA_MASK, getVertexDataMask() | LLVertexBuffer::MAP_TEXTURE_INDEX, TRUE, TRUE);
//LLGLSLShader::bindNoShader();
@@ -273,16 +275,16 @@ void LLDrawPoolAlpha::render(S32 pass)
if (LLPipeline::sImpostorRender)
{
fullbright_shader->bind();
- fullbright_shader->setAlphaRange(0.5f, 1.f);
+ fullbright_shader->setMinimumAlpha(0.5f);
simple_shader->bind();
- simple_shader->setAlphaRange(0.5f, 1.f);
+ simple_shader->setMinimumAlpha(0.5f);
}
else
{
fullbright_shader->bind();
- fullbright_shader->setAlphaRange(0.f, 1.f);
+ fullbright_shader->setMinimumAlpha(0.f);
simple_shader->bind();
- simple_shader->setAlphaRange(0.f, 1.f);
+ simple_shader->setMinimumAlpha(0.f);
}
}
else
@@ -319,20 +321,27 @@ void LLDrawPoolAlpha::render(S32 pass)
BOOL shaders = gPipeline.canUseVertexShaders();
if(shaders)
{
- gObjectFullbrightNonIndexedProgram.bind();
+ gHighlightProgram.bind();
}
else
{
gPipeline.enableLightsFullbright(LLColor4(1,1,1,1));
}
- glColor4f(1,0,0,1);
+
+ gGL.diffuseColor4f(1,0,0,1);
+
LLViewerFetchedTexture::sSmokeImagep->addTextureStats(1024.f*1024.f);
gGL.getTexUnit(0)->bind(LLViewerFetchedTexture::sSmokeImagep, TRUE) ;
renderAlphaHighlight(LLVertexBuffer::MAP_VERTEX |
LLVertexBuffer::MAP_TEXCOORD0);
+
+ pushBatches(LLRenderPass::PASS_ALPHA_MASK, LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0, FALSE);
+ pushBatches(LLRenderPass::PASS_FULLBRIGHT_ALPHA_MASK, LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0, FALSE);
+ pushBatches(LLRenderPass::PASS_ALPHA_INVISIBLE, LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0, FALSE);
+
if(shaders)
{
- gObjectFullbrightNonIndexedProgram.unbind();
+ gHighlightProgram.unbind();
}
}
}
@@ -472,8 +481,8 @@ void LLDrawPoolAlpha::renderAlpha(U32 mask)
{
tex_setup = true;
gGL.getTexUnit(0)->activate();
- glMatrixMode(GL_TEXTURE);
- glLoadMatrixf((GLfloat*) params.mTextureMatrix->mMatrix);
+ gGL.matrixMode(LLRender::MM_TEXTURE);
+ gGL.loadMatrix((GLfloat*) params.mTextureMatrix->mMatrix);
gPipeline.mTextureMatrixOps++;
}
}
@@ -488,30 +497,34 @@ void LLDrawPoolAlpha::renderAlpha(U32 mask)
gPipeline.addTrianglesDrawn(params.mCount, params.mDrawMode);
// If this alpha mesh has glow, then draw it a second time to add the destination-alpha (=glow). Interleaving these state-changing calls could be expensive, but glow must be drawn Z-sorted with alpha.
- if (draw_glow_for_this_partition &&
- params.mGlowColor.mV[3] > 0)
+ if (current_shader &&
+ draw_glow_for_this_partition &&
+ params.mVertexBuffer->hasDataType(LLVertexBuffer::TYPE_EMISSIVE))
{
// install glow-accumulating blend mode
gGL.blendFunc(LLRender::BF_ZERO, LLRender::BF_ONE, // don't touch color
LLRender::BF_ONE, LLRender::BF_ONE); // add to alpha (glow)
+ emissive_shader->bind();
+
// glow doesn't use vertex colors from the mesh data
- params.mVertexBuffer->setBuffer(mask & ~LLVertexBuffer::MAP_COLOR);
- glColor4ubv(params.mGlowColor.mV);
-
+ params.mVertexBuffer->setBuffer((mask & ~LLVertexBuffer::MAP_COLOR) | LLVertexBuffer::MAP_EMISSIVE);
+
// do the actual drawing, again
params.mVertexBuffer->drawRange(params.mDrawMode, params.mStart, params.mEnd, params.mCount, params.mOffset);
gPipeline.addTrianglesDrawn(params.mCount, params.mDrawMode);
// restore our alpha blend mode
gGL.blendFunc(mColorSFactor, mColorDFactor, mAlphaSFactor, mAlphaDFactor);
+
+ current_shader->bind();
}
if (tex_setup)
{
gGL.getTexUnit(0)->activate();
- glLoadIdentity();
- glMatrixMode(GL_MODELVIEW);
+ gGL.loadIdentity();
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
}
}
}
diff --git a/indra/newview/lldrawpoolalpha.h b/indra/newview/lldrawpoolalpha.h
index 12a7ae92b1..a4245e561d 100644
--- a/indra/newview/lldrawpoolalpha.h
+++ b/indra/newview/lldrawpoolalpha.h
@@ -78,6 +78,7 @@ private:
LLGLSLShader* target_shader;
LLGLSLShader* simple_shader;
LLGLSLShader* fullbright_shader;
+ LLGLSLShader* emissive_shader;
// our 'normal' alpha blend function for this pass
LLRender::eBlendFactor mColorSFactor;
diff --git a/indra/newview/lldrawpoolavatar.cpp b/indra/newview/lldrawpoolavatar.cpp
index 37ee81aeb5..b002c11af5 100644
--- a/indra/newview/lldrawpoolavatar.cpp
+++ b/indra/newview/lldrawpoolavatar.cpp
@@ -263,7 +263,6 @@ void LLDrawPoolAvatar::beginPostDeferredAlpha()
gPipeline.bindDeferredShader(*sVertexProgram);
sDiffuseChannel = sVertexProgram->enableTexture(LLViewerShaderMgr::DIFFUSE_MAP);
- enable_vertex_weighting(sVertexProgram->mAttribute[LLViewerShaderMgr::AVATAR_WEIGHT]);
}
void LLDrawPoolAvatar::beginDeferredRiggedAlpha()
@@ -271,7 +270,6 @@ void LLDrawPoolAvatar::beginDeferredRiggedAlpha()
sVertexProgram = &gDeferredSkinnedAlphaProgram;
gPipeline.bindDeferredShader(*sVertexProgram);
sDiffuseChannel = sVertexProgram->enableTexture(LLViewerShaderMgr::DIFFUSE_MAP);
- LLVertexBuffer::sWeight4Loc = sVertexProgram->getAttribLocation(LLViewerShaderMgr::OBJECT_WEIGHT);
gPipeline.enableLightsDynamic();
}
@@ -280,7 +278,6 @@ void LLDrawPoolAvatar::endDeferredRiggedAlpha()
LLVertexBuffer::unbind();
gPipeline.unbindDeferredShader(*sVertexProgram);
sDiffuseChannel = 0;
- LLVertexBuffer::sWeight4Loc = -1;
sVertexProgram = NULL;
}
@@ -314,8 +311,7 @@ void LLDrawPoolAvatar::endPostDeferredAlpha()
// if we're in software-blending, remember to set the fence _after_ we draw so we wait till this rendering is done
sRenderingSkinned = FALSE;
sSkipOpaque = FALSE;
- disable_vertex_weighting(sVertexProgram->mAttribute[LLViewerShaderMgr::AVATAR_WEIGHT]);
-
+
gPipeline.unbindDeferredShader(*sVertexProgram);
sDiffuseChannel = 0;
sShaderLevel = mVertexShaderLevel;
@@ -356,27 +352,22 @@ void LLDrawPoolAvatar::beginShadowPass(S32 pass)
if (pass == 0)
{
sVertexProgram = &gDeferredAvatarShadowProgram;
- if (sShaderLevel > 0)
- {
- gAvatarMatrixParam = sVertexProgram->mUniform[LLViewerShaderMgr::AVATAR_MATRIX];
- }
- //gGL.setAlphaRejectSettings(LLRender::CF_GREATER_EQUAL, 0.2f);
- glColor4f(1,1,1,1);
+ //gGL.setAlphaRejectSettings(LLRender::CF_GREATER_EQUAL, 0.2f);
if ((sShaderLevel > 0)) // for hardware blending
{
sRenderingSkinned = TRUE;
sVertexProgram->bind();
- enable_vertex_weighting(sVertexProgram->mAttribute[LLViewerShaderMgr::AVATAR_WEIGHT]);
}
+
+ gGL.diffuseColor4f(1,1,1,1);
}
else
{
sVertexProgram = &gDeferredAttachmentShadowProgram;
sDiffuseChannel = sVertexProgram->enableTexture(LLViewerShaderMgr::DIFFUSE_MAP);
sVertexProgram->bind();
- LLVertexBuffer::sWeight4Loc = sVertexProgram->getAttribLocation(LLViewerShaderMgr::OBJECT_WEIGHT);
}
}
@@ -389,14 +380,12 @@ void LLDrawPoolAvatar::endShadowPass(S32 pass)
{
sRenderingSkinned = FALSE;
sVertexProgram->unbind();
- disable_vertex_weighting(sVertexProgram->mAttribute[LLViewerShaderMgr::AVATAR_WEIGHT]);
}
}
else
{
LLVertexBuffer::unbind();
sVertexProgram->unbind();
- LLVertexBuffer::sWeight4Loc = -1;
sVertexProgram = NULL;
}
}
@@ -430,11 +419,6 @@ void LLDrawPoolAvatar::renderShadow(S32 pass)
if (pass == 0)
{
- if (sShaderLevel > 0)
- {
- gAvatarMatrixParam = sVertexProgram->mUniform[LLViewerShaderMgr::AVATAR_MATRIX];
- }
-
avatarp->renderSkinned(AVATAR_RENDER_PASS_SINGLE);
}
else
@@ -492,11 +476,6 @@ void LLDrawPoolAvatar::beginRenderPass(S32 pass)
//reset vertex buffer mappings
LLVertexBuffer::unbind();
- if (pass == 0)
- { //make sure no stale colors are left over from a previous render
- glColor4f(1,1,1,1);
- }
-
if (LLPipeline::sImpostorRender)
{ //impostor render does not have impostors or rigid rendering
pass += 2;
@@ -535,6 +514,11 @@ void LLDrawPoolAvatar::beginRenderPass(S32 pass)
beginRiggedGlow();
break;
}
+
+ if (pass == 0)
+ { //make sure no stale colors are left over from a previous render
+ gGL.diffuseColor4f(1,1,1,1);
+ }
}
void LLDrawPoolAvatar::endRenderPass(S32 pass)
@@ -592,7 +576,7 @@ void LLDrawPoolAvatar::beginImpostor()
if (LLGLSLShader::sNoFixedFunction)
{
gImpostorProgram.bind();
- gImpostorProgram.setAlphaRange(0.01f, 1.f);
+ gImpostorProgram.setMinimumAlpha(0.01f);
}
gPipeline.enableLightsFullbright(LLColor4(1,1,1,1));
@@ -614,17 +598,17 @@ void LLDrawPoolAvatar::beginRigid()
{
if (LLPipeline::sUnderWaterRender)
{
- sVertexProgram = &gObjectAlphaMaskNonIndexedWaterProgram;
+ sVertexProgram = &gObjectAlphaMaskNoColorWaterProgram;
}
else
{
- sVertexProgram = &gObjectAlphaMaskNonIndexedProgram;
+ sVertexProgram = &gObjectAlphaMaskNoColorProgram;
}
if (sVertexProgram != NULL)
{ //eyeballs render with the specular shader
sVertexProgram->bind();
- sVertexProgram->setAlphaRange(0.2f, 1.f);
+ sVertexProgram->setMinimumAlpha(0.2f);
}
}
else
@@ -657,7 +641,7 @@ void LLDrawPoolAvatar::beginDeferredImpostor()
sDiffuseChannel = sVertexProgram->enableTexture(LLViewerShaderMgr::DIFFUSE_MAP);
sVertexProgram->bind();
- sVertexProgram->setAlphaRange(0.01f, 1.f);
+ sVertexProgram->setMinimumAlpha(0.01f);
}
void LLDrawPoolAvatar::endDeferredImpostor()
@@ -672,14 +656,16 @@ void LLDrawPoolAvatar::endDeferredImpostor()
void LLDrawPoolAvatar::beginDeferredRigid()
{
- sVertexProgram = &gDeferredNonIndexedDiffuseProgram;
-
+ sVertexProgram = &gDeferredNonIndexedDiffuseAlphaMaskNoColorProgram;
+ sDiffuseChannel = sVertexProgram->enableTexture(LLViewerShaderMgr::DIFFUSE_MAP);
sVertexProgram->bind();
+ sVertexProgram->setMinimumAlpha(0.2f);
}
void LLDrawPoolAvatar::endDeferredRigid()
{
sShaderLevel = mVertexShaderLevel;
+ sVertexProgram->disableTexture(LLViewerShaderMgr::DIFFUSE_MAP);
sVertexProgram->unbind();
gGL.getTexUnit(0)->activate();
}
@@ -703,11 +689,11 @@ void LLDrawPoolAvatar::beginSkinned()
{
if (LLPipeline::sUnderWaterRender)
{
- sVertexProgram = &gObjectAlphaMaskNonIndexedWaterProgram;
+ sVertexProgram = &gObjectAlphaMaskNoColorWaterProgram;
}
else
{
- sVertexProgram = &gObjectAlphaMaskNonIndexedProgram;
+ sVertexProgram = &gObjectAlphaMaskNoColorProgram;
}
}
@@ -716,17 +702,6 @@ void LLDrawPoolAvatar::beginSkinned()
sRenderingSkinned = TRUE;
sVertexProgram->bind();
- if (sShaderLevel >= SHADER_LEVEL_CLOTH)
- {
- enable_cloth_weights(sVertexProgram->mAttribute[LLViewerShaderMgr::AVATAR_CLOTHING]);
- }
- enable_vertex_weighting(sVertexProgram->mAttribute[LLViewerShaderMgr::AVATAR_WEIGHT]);
-
- if (sShaderLevel >= SHADER_LEVEL_BUMP)
- {
- enable_binormals(sVertexProgram->mAttribute[LLViewerShaderMgr::BINORMAL]);
- }
-
sVertexProgram->enableTexture(LLViewerShaderMgr::BUMP_MAP);
gGL.getTexUnit(0)->activate();
}
@@ -742,7 +717,7 @@ void LLDrawPoolAvatar::beginSkinned()
if (LLGLSLShader::sNoFixedFunction)
{
- sVertexProgram->setAlphaRange(0.2f, 1.f);
+ sVertexProgram->setMinimumAlpha(0.2f);
}
}
@@ -754,16 +729,6 @@ void LLDrawPoolAvatar::endSkinned()
sRenderingSkinned = FALSE;
sVertexProgram->disableTexture(LLViewerShaderMgr::BUMP_MAP);
gGL.getTexUnit(0)->activate();
- disable_vertex_weighting(sVertexProgram->mAttribute[LLViewerShaderMgr::AVATAR_WEIGHT]);
- if (sShaderLevel >= SHADER_LEVEL_BUMP)
- {
- disable_binormals(sVertexProgram->mAttribute[LLViewerShaderMgr::BINORMAL]);
- }
- if ((sShaderLevel >= SHADER_LEVEL_CLOTH))
- {
- disable_cloth_weights(sVertexProgram->mAttribute[LLViewerShaderMgr::AVATAR_CLOTHING]);
- }
-
sVertexProgram->unbind();
sShaderLevel = mVertexShaderLevel;
}
@@ -809,7 +774,6 @@ void LLDrawPoolAvatar::beginRiggedSimple()
{
sDiffuseChannel = 0;
sVertexProgram->bind();
- LLVertexBuffer::sWeight4Loc = sVertexProgram->getAttribLocation(LLViewerShaderMgr::OBJECT_WEIGHT);
}
}
@@ -820,7 +784,6 @@ void LLDrawPoolAvatar::endRiggedSimple()
{
sVertexProgram->unbind();
sVertexProgram = NULL;
- LLVertexBuffer::sWeight4Loc = -1;
}
}
@@ -847,7 +810,34 @@ void LLDrawPoolAvatar::endRiggedFullbrightAlpha()
void LLDrawPoolAvatar::beginRiggedGlow()
{
- beginRiggedFullbright();
+ if (sShaderLevel > 0)
+ {
+ if (LLPipeline::sUnderWaterRender)
+ {
+ sVertexProgram = &gSkinnedObjectEmissiveWaterProgram;
+ }
+ else
+ {
+ sVertexProgram = &gSkinnedObjectEmissiveProgram;
+ }
+ }
+ else
+ {
+ if (LLPipeline::sUnderWaterRender)
+ {
+ sVertexProgram = &gObjectEmissiveNonIndexedWaterProgram;
+ }
+ else
+ {
+ sVertexProgram = &gObjectEmissiveNonIndexedProgram;
+ }
+ }
+
+ if (sShaderLevel > 0 || gPipeline.canUseVertexShaders())
+ {
+ sDiffuseChannel = 0;
+ sVertexProgram->bind();
+ }
}
void LLDrawPoolAvatar::endRiggedGlow()
@@ -884,7 +874,6 @@ void LLDrawPoolAvatar::beginRiggedFullbright()
{
sDiffuseChannel = 0;
sVertexProgram->bind();
- LLVertexBuffer::sWeight4Loc = sVertexProgram->getAttribLocation(LLViewerShaderMgr::OBJECT_WEIGHT);
}
}
@@ -895,7 +884,6 @@ void LLDrawPoolAvatar::endRiggedFullbright()
{
sVertexProgram->unbind();
sVertexProgram = NULL;
- LLVertexBuffer::sWeight4Loc = -1;
}
}
@@ -928,7 +916,6 @@ void LLDrawPoolAvatar::beginRiggedShinySimple()
{
sVertexProgram->bind();
LLDrawPoolBump::bindCubeMap(sVertexProgram, 2, sDiffuseChannel, cube_channel, false);
- LLVertexBuffer::sWeight4Loc = sVertexProgram->getAttribLocation(LLViewerShaderMgr::OBJECT_WEIGHT);
}
}
@@ -940,7 +927,6 @@ void LLDrawPoolAvatar::endRiggedShinySimple()
LLDrawPoolBump::unbindCubeMap(sVertexProgram, 2, sDiffuseChannel, cube_channel, false);
sVertexProgram->unbind();
sVertexProgram = NULL;
- LLVertexBuffer::sWeight4Loc = -1;
}
}
@@ -974,7 +960,6 @@ void LLDrawPoolAvatar::beginRiggedFullbrightShiny()
{
sVertexProgram->bind();
LLDrawPoolBump::bindCubeMap(sVertexProgram, 2, sDiffuseChannel, cube_channel, false);
- LLVertexBuffer::sWeight4Loc = sVertexProgram->getAttribLocation(LLViewerShaderMgr::OBJECT_WEIGHT);
}
}
@@ -986,7 +971,6 @@ void LLDrawPoolAvatar::endRiggedFullbrightShiny()
LLDrawPoolBump::unbindCubeMap(sVertexProgram, 2, sDiffuseChannel, cube_channel, false);
sVertexProgram->unbind();
sVertexProgram = NULL;
- LLVertexBuffer::sWeight4Loc = -1;
}
}
@@ -996,14 +980,12 @@ void LLDrawPoolAvatar::beginDeferredRiggedSimple()
sVertexProgram = &gDeferredSkinnedDiffuseProgram;
sDiffuseChannel = 0;
sVertexProgram->bind();
- LLVertexBuffer::sWeight4Loc = sVertexProgram->getAttribLocation(LLViewerShaderMgr::OBJECT_WEIGHT);
}
void LLDrawPoolAvatar::endDeferredRiggedSimple()
{
LLVertexBuffer::unbind();
sVertexProgram->unbind();
- LLVertexBuffer::sWeight4Loc = -1;
sVertexProgram = NULL;
}
@@ -1013,7 +995,6 @@ void LLDrawPoolAvatar::beginDeferredRiggedBump()
sVertexProgram->bind();
normal_channel = sVertexProgram->enableTexture(LLViewerShaderMgr::BUMP_MAP);
sDiffuseChannel = sVertexProgram->enableTexture(LLViewerShaderMgr::DIFFUSE_MAP);
- LLVertexBuffer::sWeight4Loc = sVertexProgram->getAttribLocation(LLViewerShaderMgr::OBJECT_WEIGHT);
}
void LLDrawPoolAvatar::endDeferredRiggedBump()
@@ -1022,7 +1003,6 @@ void LLDrawPoolAvatar::endDeferredRiggedBump()
sVertexProgram->disableTexture(LLViewerShaderMgr::BUMP_MAP);
sVertexProgram->disableTexture(LLViewerShaderMgr::DIFFUSE_MAP);
sVertexProgram->unbind();
- LLVertexBuffer::sWeight4Loc = -1;
normal_channel = -1;
sDiffuseChannel = 0;
sVertexProgram = NULL;
@@ -1032,14 +1012,12 @@ void LLDrawPoolAvatar::beginDeferredSkinned()
{
sShaderLevel = mVertexShaderLevel;
sVertexProgram = &gDeferredAvatarProgram;
-
sRenderingSkinned = TRUE;
sVertexProgram->bind();
+ sVertexProgram->setMinimumAlpha(0.2f);
sDiffuseChannel = sVertexProgram->enableTexture(LLViewerShaderMgr::DIFFUSE_MAP);
- enable_vertex_weighting(sVertexProgram->mAttribute[LLViewerShaderMgr::AVATAR_WEIGHT]);
-
gGL.getTexUnit(0)->activate();
}
@@ -1047,7 +1025,6 @@ void LLDrawPoolAvatar::endDeferredSkinned()
{
// if we're in software-blending, remember to set the fence _after_ we draw so we wait till this rendering is done
sRenderingSkinned = FALSE;
- disable_vertex_weighting(sVertexProgram->mAttribute[LLViewerShaderMgr::AVATAR_WEIGHT]);
sVertexProgram->unbind();
sVertexProgram->disableTexture(LLViewerShaderMgr::DIFFUSE_MAP);
@@ -1161,10 +1138,10 @@ void LLDrawPoolAvatar::renderAvatars(LLVOAvatar* single_avatar, S32 pass)
return;
}
- if (single_avatar && avatarp->mSpecialRenderMode >= 1) // 1=anim preview, 2=image preview, 3=morph view
+ /*if (single_avatar && avatarp->mSpecialRenderMode >= 1) // 1=anim preview, 2=image preview, 3=morph view
{
gPipeline.enableLightsAvatarEdit(LLColor4(.5f, .5f, .5f, 1.f));
- }
+ }*/
if (pass == 1)
{
@@ -1255,11 +1232,6 @@ void LLDrawPoolAvatar::renderAvatars(LLVOAvatar* single_avatar, S32 pass)
return;
}
- if (sShaderLevel > 0)
- {
- gAvatarMatrixParam = sVertexProgram->mUniform[LLViewerShaderMgr::AVATAR_MATRIX];
- }
-
if ((sShaderLevel >= SHADER_LEVEL_CLOTH))
{
LLMatrix4 rot_mat;
@@ -1273,16 +1245,16 @@ void LLDrawPoolAvatar::renderAvatars(LLVOAvatar* single_avatar, S32 pass)
wind = wind * rot_mat;
wind.mV[VW] = avatarp->mWindVec.mV[VW];
- sVertexProgram->vertexAttrib4fv(LLViewerShaderMgr::AVATAR_WIND, wind.mV);
+ sVertexProgram->uniform4fv(LLViewerShaderMgr::AVATAR_WIND, 1, wind.mV);
F32 phase = -1.f * (avatarp->mRipplePhase);
F32 freq = 7.f + (noise1(avatarp->mRipplePhase) * 2.f);
LLVector4 sin_params(freq, freq, freq, phase);
- sVertexProgram->vertexAttrib4fv(LLViewerShaderMgr::AVATAR_SINWAVE, sin_params.mV);
+ sVertexProgram->uniform4fv(LLViewerShaderMgr::AVATAR_SINWAVE, 1, sin_params.mV);
LLVector4 gravity(0.f, 0.f, -CLOTHING_GRAVITY_EFFECT, 0.f);
gravity = gravity * rot_mat;
- sVertexProgram->vertexAttrib4fv(LLViewerShaderMgr::AVATAR_GRAVITY, gravity.mV);
+ sVertexProgram->uniform4fv(LLViewerShaderMgr::AVATAR_GRAVITY, 1, gravity.mV);
}
if( !single_avatar || (avatarp == single_avatar) )
@@ -1306,14 +1278,14 @@ void LLDrawPoolAvatar::updateRiggedFaceVertexBuffer(LLVOAvatar* avatar, LLFace*
if (buffer.isNull() ||
buffer->getTypeMask() != data_mask ||
- buffer->getRequestedVerts() != vol_face.mNumVertices ||
- buffer->getRequestedIndices() != vol_face.mNumIndices ||
+ buffer->getNumVerts() != vol_face.mNumVertices ||
+ buffer->getNumIndices() != vol_face.mNumIndices ||
(drawable && drawable->isState(LLDrawable::REBUILD_ALL)))
{
face->setGeomIndex(0);
face->setIndicesIndex(0);
- if (buffer.isNull() || buffer->getTypeMask() != data_mask)
+ if (buffer.isNull() || buffer->getTypeMask() != data_mask || !buffer->isWriteable())
{ //make a new buffer
if (sShaderLevel > 0)
{
@@ -1346,7 +1318,21 @@ void LLDrawPoolAvatar::updateRiggedFaceVertexBuffer(LLVOAvatar* avatar, LLFace*
LLMatrix3 mat_normal(mat3);
+ //let getGeometryVolume know if alpha should override shiny
+ U32 type = gPipeline.getPoolTypeFromTE(face->getTextureEntry(), face->getTexture());
+
+ if (type == LLDrawPool::POOL_ALPHA)
+ {
+ face->setPoolType(LLDrawPool::POOL_ALPHA);
+ }
+ else
+ {
+ face->setPoolType(LLDrawPool::POOL_AVATAR);
+ }
+
face->getGeometryVolume(*volume, face->getTEOffset(), mat_vert, mat_normal, offset, true);
+
+ buffer->flush();
}
if (sShaderLevel <= 0 && face->mLastSkinTime < avatar->getLastSkinTime())
@@ -1383,7 +1369,7 @@ void LLDrawPoolAvatar::updateRiggedFaceVertexBuffer(LLVOAvatar* avatar, LLFace*
LLMatrix4a bind_shape_matrix;
bind_shape_matrix.loadu(skin->mBindShapeMatrix);
- for (U32 j = 0; j < buffer->getRequestedVerts(); ++j)
+ for (U32 j = 0; j < buffer->getNumVerts(); ++j)
{
LLMatrix4a final_mat;
final_mat.clear();
@@ -1483,12 +1469,12 @@ void LLDrawPoolAvatar::renderRigged(LLVOAvatar* avatar, U32 type, bool glow)
continue;
}
- stop_glerror();
+ //stop_glerror();
- const LLVolumeFace& vol_face = volume->getVolumeFace(te);
- updateRiggedFaceVertexBuffer(avatar, face, skin, volume, vol_face);
+ //const LLVolumeFace& vol_face = volume->getVolumeFace(te);
+ //updateRiggedFaceVertexBuffer(avatar, face, skin, volume, vol_face);
- stop_glerror();
+ //stop_glerror();
U32 data_mask = LLFace::getRiggedDataMask(type);
@@ -1524,17 +1510,15 @@ void LLDrawPoolAvatar::renderRigged(LLVOAvatar* avatar, U32 type, bool glow)
data_mask &= ~LLVertexBuffer::MAP_WEIGHT4;
}
- buff->setBuffer(data_mask);
-
U16 start = face->getGeomStart();
U16 end = start + face->getGeomCount()-1;
S32 offset = face->getIndicesStart();
U32 count = face->getIndicesCount();
- if (glow)
+ /*if (glow)
{
- glColor4f(0,0,0,face->getTextureEntry()->getGlow());
- }
+ gGL.diffuseColor4f(0,0,0,face->getTextureEntry()->getGlow());
+ }*/
gGL.getTexUnit(sDiffuseChannel)->bind(face->getTexture());
if (normal_channel > -1)
@@ -1544,14 +1528,16 @@ void LLDrawPoolAvatar::renderRigged(LLVOAvatar* avatar, U32 type, bool glow)
if (face->mTextureMatrix)
{
- glMatrixMode(GL_TEXTURE);
- glLoadMatrixf((F32*) face->mTextureMatrix->mMatrix);
+ gGL.matrixMode(LLRender::MM_TEXTURE);
+ gGL.loadMatrix((F32*) face->mTextureMatrix->mMatrix);
+ buff->setBuffer(data_mask);
buff->drawRange(LLRender::TRIANGLES, start, end, count, offset);
- glLoadIdentity();
- glMatrixMode(GL_MODELVIEW);
+ gGL.loadIdentity();
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
}
else
{
+ buff->setBuffer(data_mask);
buff->drawRange(LLRender::TRIANGLES, start, end, count, offset);
}
}
@@ -1560,6 +1546,7 @@ void LLDrawPoolAvatar::renderRigged(LLVOAvatar* avatar, U32 type, bool glow)
void LLDrawPoolAvatar::renderDeferredRiggedSimple(LLVOAvatar* avatar)
{
+ updateRiggedVertexBuffers(avatar);
renderRigged(avatar, RIGGED_DEFERRED_SIMPLE);
}
@@ -1568,8 +1555,58 @@ void LLDrawPoolAvatar::renderDeferredRiggedBump(LLVOAvatar* avatar)
renderRigged(avatar, RIGGED_DEFERRED_BUMP);
}
+void LLDrawPoolAvatar::updateRiggedVertexBuffers(LLVOAvatar* avatar)
+{
+ //update rigged vertex buffers
+ for (U32 type = 0; type < NUM_RIGGED_PASSES; ++type)
+ {
+ for (U32 i = 0; i < mRiggedFace[type].size(); ++i)
+ {
+ LLFace* face = mRiggedFace[type][i];
+ LLDrawable* drawable = face->getDrawable();
+ if (!drawable)
+ {
+ continue;
+ }
+
+ LLVOVolume* vobj = drawable->getVOVolume();
+
+ if (!vobj)
+ {
+ continue;
+ }
+
+ LLVolume* volume = vobj->getVolume();
+ S32 te = face->getTEOffset();
+
+ if (!volume || volume->getNumVolumeFaces() <= te)
+ {
+ continue;
+ }
+
+ LLUUID mesh_id = volume->getParams().getSculptID();
+ if (mesh_id.isNull())
+ {
+ continue;
+ }
+
+ const LLMeshSkinInfo* skin = gMeshRepo.getSkinInfo(mesh_id, vobj);
+ if (!skin)
+ {
+ continue;
+ }
+
+ stop_glerror();
+
+ const LLVolumeFace& vol_face = volume->getVolumeFace(te);
+ updateRiggedFaceVertexBuffer(avatar, face, skin, volume, vol_face);
+ }
+ }
+}
+
void LLDrawPoolAvatar::renderRiggedSimple(LLVOAvatar* avatar)
{
+ updateRiggedVertexBuffers(avatar);
renderRigged(avatar, RIGGED_SIMPLE);
}
@@ -1684,34 +1721,3 @@ LLVertexBufferAvatar::LLVertexBufferAvatar()
}
-void LLVertexBufferAvatar::setupVertexBuffer(U32 data_mask) const
-{
- if (sRenderingSkinned)
- {
- U8* base = useVBOs() ? (U8*) mAlignedOffset : mMappedData;
-
- glVertexPointer(3,GL_FLOAT, LLVertexBuffer::sTypeSize[LLVertexBuffer::TYPE_VERTEX], (void*)(base + 0));
- glNormalPointer(GL_FLOAT, LLVertexBuffer::sTypeSize[LLVertexBuffer::TYPE_NORMAL], (void*)(base + mOffsets[TYPE_NORMAL]));
- glTexCoordPointer(2,GL_FLOAT, LLVertexBuffer::sTypeSize[LLVertexBuffer::TYPE_TEXCOORD0], (void*)(base + mOffsets[TYPE_TEXCOORD0]));
-
- set_vertex_weights(LLDrawPoolAvatar::sVertexProgram->mAttribute[LLViewerShaderMgr::AVATAR_WEIGHT],
- LLVertexBuffer::sTypeSize[LLVertexBuffer::TYPE_WEIGHT], (F32*)(base + mOffsets[TYPE_WEIGHT]));
-
- if (sShaderLevel >= LLDrawPoolAvatar::SHADER_LEVEL_BUMP)
- {
- set_binormals(LLDrawPoolAvatar::sVertexProgram->mAttribute[LLViewerShaderMgr::BINORMAL],
- LLVertexBuffer::sTypeSize[LLVertexBuffer::TYPE_BINORMAL], (LLVector3*)(base + mOffsets[TYPE_BINORMAL]));
- }
-
- if (sShaderLevel >= LLDrawPoolAvatar::SHADER_LEVEL_CLOTH)
- {
- set_vertex_clothing_weights(LLDrawPoolAvatar::sVertexProgram->mAttribute[LLViewerShaderMgr::AVATAR_CLOTHING],
- LLVertexBuffer::sTypeSize[LLVertexBuffer::TYPE_CLOTHWEIGHT], (LLVector4*)(base + mOffsets[TYPE_CLOTHWEIGHT]));
- }
- }
- else
- {
- LLVertexBuffer::setupVertexBuffer(data_mask);
- }
-}
-
diff --git a/indra/newview/lldrawpoolavatar.h b/indra/newview/lldrawpoolavatar.h
index fcd8294af5..69e3068858 100644
--- a/indra/newview/lldrawpoolavatar.h
+++ b/indra/newview/lldrawpoolavatar.h
@@ -134,6 +134,7 @@ public:
const LLMeshSkinInfo* skin,
LLVolume* volume,
const LLVolumeFace& vol_face);
+ void updateRiggedVertexBuffers(LLVOAvatar* avatar);
void renderRigged(LLVOAvatar* avatar, U32 type, bool glow = false);
void renderRiggedSimple(LLVOAvatar* avatar);
@@ -176,6 +177,7 @@ public:
RIGGED_FULLBRIGHT_SHINY_MASK = RIGGED_SIMPLE_MASK,
RIGGED_GLOW_MASK = LLVertexBuffer::MAP_VERTEX |
LLVertexBuffer::MAP_TEXCOORD0 |
+ LLVertexBuffer::MAP_EMISSIVE |
LLVertexBuffer::MAP_WEIGHT4,
RIGGED_ALPHA_MASK = RIGGED_SIMPLE_MASK,
RIGGED_FULLBRIGHT_ALPHA_MASK = RIGGED_FULLBRIGHT_MASK,
@@ -214,7 +216,6 @@ class LLVertexBufferAvatar : public LLVertexBuffer
{
public:
LLVertexBufferAvatar();
- virtual void setupVertexBuffer(U32 data_mask) const;
};
extern S32 AVATAR_OFFSET_POS;
diff --git a/indra/newview/lldrawpoolbump.cpp b/indra/newview/lldrawpoolbump.cpp
index 0742250b0b..b58efe62ab 100644
--- a/indra/newview/lldrawpoolbump.cpp
+++ b/indra/newview/lldrawpoolbump.cpp
@@ -763,7 +763,7 @@ void LLDrawPoolBump::renderBump(U32 pass)
LLGLDisable fog(GL_FOG);
LLGLDepthTest gls_depth(GL_TRUE, GL_FALSE, GL_LEQUAL);
LLGLEnable blend(GL_BLEND);
- glColor4f(1,1,1,1);
+ gGL.diffuseColor4f(1,1,1,1);
/// Get rid of z-fighting with non-bump pass.
LLGLEnable polyOffset(GL_POLYGON_OFFSET_FILL);
glPolygonOffset(-1.0f, -1.0f);
@@ -786,7 +786,7 @@ void LLDrawPoolBump::endBump(U32 pass)
{
// Disable texture blending on unit 1
gGL.getTexUnit(1)->activate();
- //gGL.getTexUnit(1)->disable();
+ gGL.getTexUnit(1)->disable();
gGL.getTexUnit(1)->setTextureBlendType(LLTexUnit::TB_MULT);
// Disable texture blending on unit 0
@@ -1036,51 +1036,48 @@ LLViewerTexture* LLBumpImageList::getBrightnessDarknessImage(LLViewerFetchedText
llassert( (bump_code == BE_BRIGHTNESS) || (bump_code == BE_DARKNESS) );
LLViewerTexture* bump = NULL;
- const F32 BRIGHTNESS_DARKNESS_PIXEL_AREA_THRESHOLD = 1000;
- if( src_image->getMaxVirtualSize() > BRIGHTNESS_DARKNESS_PIXEL_AREA_THRESHOLD )
- {
- bump_image_map_t* entries_list = NULL;
- void (*callback_func)( BOOL success, LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* aux_src, S32 discard_level, BOOL final, void* userdata ) = NULL;
+
+ bump_image_map_t* entries_list = NULL;
+ void (*callback_func)( BOOL success, LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* aux_src, S32 discard_level, BOOL final, void* userdata ) = NULL;
- switch( bump_code )
- {
- case BE_BRIGHTNESS:
- entries_list = &mBrightnessEntries;
- callback_func = LLBumpImageList::onSourceBrightnessLoaded;
- break;
- case BE_DARKNESS:
- entries_list = &mDarknessEntries;
- callback_func = LLBumpImageList::onSourceDarknessLoaded;
- break;
- default:
- llassert(0);
- return NULL;
- }
+ switch( bump_code )
+ {
+ case BE_BRIGHTNESS:
+ entries_list = &mBrightnessEntries;
+ callback_func = LLBumpImageList::onSourceBrightnessLoaded;
+ break;
+ case BE_DARKNESS:
+ entries_list = &mDarknessEntries;
+ callback_func = LLBumpImageList::onSourceDarknessLoaded;
+ break;
+ default:
+ llassert(0);
+ return NULL;
+ }
- bump_image_map_t::iterator iter = entries_list->find(src_image->getID());
- if (iter != entries_list->end() && iter->second.notNull())
- {
- bump = iter->second;
- }
- else
- {
- LLPointer<LLImageRaw> raw = new LLImageRaw(1,1,1);
- raw->clear(0x77, 0x77, 0xFF, 0xFF);
+ bump_image_map_t::iterator iter = entries_list->find(src_image->getID());
+ if (iter != entries_list->end() && iter->second.notNull())
+ {
+ bump = iter->second;
+ }
+ else
+ {
+ LLPointer<LLImageRaw> raw = new LLImageRaw(1,1,1);
+ raw->clear(0x77, 0x77, 0xFF, 0xFF);
- (*entries_list)[src_image->getID()] = LLViewerTextureManager::getLocalTexture( raw.get(), TRUE);
- bump = (*entries_list)[src_image->getID()]; // In case callback was called immediately and replaced the image
- }
+ (*entries_list)[src_image->getID()] = LLViewerTextureManager::getLocalTexture( raw.get(), TRUE);
+ bump = (*entries_list)[src_image->getID()]; // In case callback was called immediately and replaced the image
+ }
- if (!src_image->hasCallbacks())
- { //if image has no callbacks but resolutions don't match, trigger raw image loaded callback again
- if (src_image->getWidth() != bump->getWidth() ||
- src_image->getHeight() != bump->getHeight())// ||
- //(LLPipeline::sRenderDeferred && bump->getComponents() != 4))
- {
- src_image->setBoostLevel(LLViewerTexture::BOOST_BUMP) ;
- src_image->setLoadedCallback( callback_func, 0, TRUE, FALSE, new LLUUID(src_image->getID()), NULL );
- src_image->forceToSaveRawImage(0) ;
- }
+ if (!src_image->hasCallbacks())
+ { //if image has no callbacks but resolutions don't match, trigger raw image loaded callback again
+ if (src_image->getWidth() != bump->getWidth() ||
+ src_image->getHeight() != bump->getHeight())// ||
+ //(LLPipeline::sRenderDeferred && bump->getComponents() != 4))
+ {
+ src_image->setBoostLevel(LLViewerTexture::BOOST_BUMP) ;
+ src_image->setLoadedCallback( callback_func, 0, TRUE, FALSE, new LLUUID(src_image->getID()), NULL );
+ src_image->forceToSaveRawImage(0) ;
}
}
@@ -1088,6 +1085,8 @@ LLViewerTexture* LLBumpImageList::getBrightnessDarknessImage(LLViewerFetchedText
}
+static LLFastTimer::DeclareTimer FTM_BUMP_SOURCE_STANDARD_LOADED("Bump Standard Callback");
+
// static
void LLBumpImageList::onSourceBrightnessLoaded( BOOL success, LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* aux_src, S32 discard_level, BOOL final, void* userdata )
{
@@ -1110,14 +1109,24 @@ void LLBumpImageList::onSourceDarknessLoaded( BOOL success, LLViewerFetchedTextu
}
}
+static LLFastTimer::DeclareTimer FTM_BUMP_GEN_NORMAL("Generate Normal Map");
+static LLFastTimer::DeclareTimer FTM_BUMP_CREATE_TEXTURE("Create GL Normal Map");
+
void LLBumpImageList::onSourceStandardLoaded( BOOL success, LLViewerFetchedTexture* src_vi, LLImageRaw* src, LLImageRaw* aux_src, S32 discard_level, BOOL final, void* userdata)
{
if (success && LLPipeline::sRenderDeferred)
{
+ LLFastTimer t(FTM_BUMP_SOURCE_STANDARD_LOADED);
LLPointer<LLImageRaw> nrm_image = new LLImageRaw(src->getWidth(), src->getHeight(), 4);
- generateNormalMapFromAlpha(src, nrm_image);
+ {
+ LLFastTimer t(FTM_BUMP_GEN_NORMAL);
+ generateNormalMapFromAlpha(src, nrm_image);
+ }
src_vi->setExplicitFormat(GL_RGBA, GL_RGBA);
- src_vi->createGLTexture(src_vi->getDiscardLevel(), nrm_image);
+ {
+ LLFastTimer t(FTM_BUMP_CREATE_TEXTURE);
+ src_vi->createGLTexture(src_vi->getDiscardLevel(), nrm_image);
+ }
}
}
@@ -1176,24 +1185,39 @@ void LLBumpImageList::generateNormalMapFromAlpha(LLImageRaw* src, LLImageRaw* nr
}
}
+
+static LLFastTimer::DeclareTimer FTM_BUMP_SOURCE_LOADED("Bump Source Loaded");
+static LLFastTimer::DeclareTimer FTM_BUMP_SOURCE_ENTRIES_UPDATE("Entries Update");
+static LLFastTimer::DeclareTimer FTM_BUMP_SOURCE_MIN_MAX("Min/Max");
+static LLFastTimer::DeclareTimer FTM_BUMP_SOURCE_RGB2LUM("RGB to Luminance");
+static LLFastTimer::DeclareTimer FTM_BUMP_SOURCE_RESCALE("Rescale");
+static LLFastTimer::DeclareTimer FTM_BUMP_SOURCE_GEN_NORMAL("Generate Normal");
+static LLFastTimer::DeclareTimer FTM_BUMP_SOURCE_CREATE("Create");
+
// static
void LLBumpImageList::onSourceLoaded( BOOL success, LLViewerTexture *src_vi, LLImageRaw* src, LLUUID& source_asset_id, EBumpEffect bump_code )
{
if( success )
{
+ LLFastTimer t(FTM_BUMP_SOURCE_LOADED);
+
+
bump_image_map_t& entries_list(bump_code == BE_BRIGHTNESS ? gBumpImageList.mBrightnessEntries : gBumpImageList.mDarknessEntries );
bump_image_map_t::iterator iter = entries_list.find(source_asset_id);
- if (iter == entries_list.end() ||
- iter->second.isNull() ||
- iter->second->getWidth() != src->getWidth() ||
- iter->second->getHeight() != src->getHeight()) // bump not cached yet or has changed resolution
- { //make sure an entry exists for this image
- LLPointer<LLImageRaw> raw = new LLImageRaw(1,1,1);
- raw->clear(0x77, 0x77, 0xFF, 0xFF);
-
- entries_list[src_vi->getID()] = LLViewerTextureManager::getLocalTexture( raw.get(), TRUE);
- iter = entries_list.find(src_vi->getID());
+ {
+ LLFastTimer t(FTM_BUMP_SOURCE_ENTRIES_UPDATE);
+ if (iter == entries_list.end() ||
+ iter->second.isNull() ||
+ iter->second->getWidth() != src->getWidth() ||
+ iter->second->getHeight() != src->getHeight()) // bump not cached yet or has changed resolution
+ { //make sure an entry exists for this image
+ LLPointer<LLImageRaw> raw = new LLImageRaw(1,1,1);
+ raw->clear(0x77, 0x77, 0xFF, 0xFF);
+
+ entries_list[src_vi->getID()] = LLViewerTextureManager::getLocalTexture( raw.get(), TRUE);
+ iter = entries_list.find(src_vi->getID());
+ }
}
//if (iter->second->getWidth() != src->getWidth() ||
@@ -1224,50 +1248,56 @@ void LLBumpImageList::onSourceLoaded( BOOL success, LLViewerTexture *src_vi, LLI
{
case 1:
case 2:
- if( src_data_size == dst_data_size * src_components )
{
- for( S32 i = 0, j=0; i < dst_data_size; i++, j+= src_components )
+ LLFastTimer t(FTM_BUMP_SOURCE_MIN_MAX);
+ if( src_data_size == dst_data_size * src_components )
{
- dst_data[i] = src_data[j];
- if( dst_data[i] < minimum )
- {
- minimum = dst_data[i];
- }
- if( dst_data[i] > maximum )
+ for( S32 i = 0, j=0; i < dst_data_size; i++, j+= src_components )
{
- maximum = dst_data[i];
+ dst_data[i] = src_data[j];
+ if( dst_data[i] < minimum )
+ {
+ minimum = dst_data[i];
+ }
+ if( dst_data[i] > maximum )
+ {
+ maximum = dst_data[i];
+ }
}
}
- }
- else
- {
- llassert(0);
- dst_image->clear();
+ else
+ {
+ llassert(0);
+ dst_image->clear();
+ }
}
break;
case 3:
case 4:
- if( src_data_size == dst_data_size * src_components )
{
- for( S32 i = 0, j=0; i < dst_data_size; i++, j+= src_components )
+ LLFastTimer t(FTM_BUMP_SOURCE_RGB2LUM);
+ if( src_data_size == dst_data_size * src_components )
{
- // RGB to luminance
- dst_data[i] = (R_WEIGHT * src_data[j] + G_WEIGHT * src_data[j+1] + B_WEIGHT * src_data[j+2]) >> FIXED_PT;
- //llassert( dst_data[i] <= 255 );true because it's 8bit
- if( dst_data[i] < minimum )
+ for( S32 i = 0, j=0; i < dst_data_size; i++, j+= src_components )
{
- minimum = dst_data[i];
- }
- if( dst_data[i] > maximum )
- {
- maximum = dst_data[i];
+ // RGB to luminance
+ dst_data[i] = (R_WEIGHT * src_data[j] + G_WEIGHT * src_data[j+1] + B_WEIGHT * src_data[j+2]) >> FIXED_PT;
+ //llassert( dst_data[i] <= 255 );true because it's 8bit
+ if( dst_data[i] < minimum )
+ {
+ minimum = dst_data[i];
+ }
+ if( dst_data[i] > maximum )
+ {
+ maximum = dst_data[i];
+ }
}
}
- }
- else
- {
- llassert(0);
- dst_image->clear();
+ else
+ {
+ llassert(0);
+ dst_image->clear();
+ }
}
break;
default:
@@ -1278,6 +1308,7 @@ void LLBumpImageList::onSourceLoaded( BOOL success, LLViewerTexture *src_vi, LLI
if( maximum > minimum )
{
+ LLFastTimer t(FTM_BUMP_SOURCE_RESCALE);
U8 bias_and_scale_lut[256];
F32 twice_one_over_range = 2.f / (maximum - minimum);
S32 i;
@@ -1311,17 +1342,99 @@ void LLBumpImageList::onSourceLoaded( BOOL success, LLViewerTexture *src_vi, LLI
// accidentally releases it.
LLPointer<LLViewerTexture> bump = LLViewerTextureManager::getLocalTexture( TRUE );
+
if (!LLPipeline::sRenderDeferred)
{
+ LLFastTimer t(FTM_BUMP_SOURCE_CREATE);
bump->setExplicitFormat(GL_ALPHA8, GL_ALPHA);
bump->createGLTexture(0, dst_image);
}
- else
- {
- LLPointer<LLImageRaw> nrm_image = new LLImageRaw(dst_image->getWidth(), dst_image->getHeight(), 4);
- generateNormalMapFromAlpha(dst_image, nrm_image);
- bump->setExplicitFormat(GL_RGBA, GL_RGBA);
- bump->createGLTexture(0, nrm_image);
+ else
+ { //convert to normal map
+ {
+ LLFastTimer t(FTM_BUMP_SOURCE_CREATE);
+ bump->setExplicitFormat(GL_RGBA8, GL_ALPHA);
+ bump->createGLTexture(0, dst_image);
+ }
+
+ {
+ LLFastTimer t(FTM_BUMP_SOURCE_GEN_NORMAL);
+ gPipeline.mScreen.bindTarget();
+
+ LLGLDepthTest depth(GL_FALSE);
+ LLGLDisable cull(GL_CULL_FACE);
+ LLGLDisable blend(GL_BLEND);
+ gGL.setColorMask(TRUE, TRUE);
+ gNormalMapGenProgram.bind();
+ gNormalMapGenProgram.uniform1f("norm_scale", gSavedSettings.getF32("RenderNormalMapScale"));
+ gNormalMapGenProgram.uniform1f("stepX", 1.f/bump->getWidth());
+ gNormalMapGenProgram.uniform1f("stepY", 1.f/bump->getHeight());
+
+ LLVector2 v((F32) bump->getWidth()/gPipeline.mScreen.getWidth(),
+ (F32) bump->getHeight()/gPipeline.mScreen.getHeight());
+
+ gGL.getTexUnit(0)->bind(bump);
+
+ S32 width = bump->getWidth();
+ S32 height = bump->getHeight();
+
+ S32 screen_width = gPipeline.mScreen.getWidth();
+ S32 screen_height = gPipeline.mScreen.getHeight();
+
+ glViewport(0, 0, screen_width, screen_height);
+
+ for (S32 left = 0; left < width; left += screen_width)
+ {
+ S32 right = left + screen_width;
+ right = llmin(right, width);
+
+ F32 left_tc = (F32) left/ width;
+ F32 right_tc = (F32) right/width;
+
+ for (S32 bottom = 0; bottom < height; bottom += screen_height)
+ {
+ S32 top = bottom+screen_height;
+ top = llmin(top, height);
+
+ F32 bottom_tc = (F32) bottom/height;
+ F32 top_tc = (F32)(bottom+screen_height)/height;
+ top_tc = llmin(top_tc, 1.f);
+
+ F32 screen_right = (F32) (right-left)/screen_width;
+ F32 screen_top = (F32) (top-bottom)/screen_height;
+
+ gGL.begin(LLRender::TRIANGLE_STRIP);
+ gGL.texCoord2f(left_tc, bottom_tc);
+ gGL.vertex2f(0, 0);
+
+ gGL.texCoord2f(left_tc, top_tc);
+ gGL.vertex2f(0, screen_top);
+
+ gGL.texCoord2f(right_tc, bottom_tc);
+ gGL.vertex2f(screen_right, 0);
+
+ gGL.texCoord2f(right_tc, top_tc);
+ gGL.vertex2f(screen_right, screen_top);
+
+ gGL.end();
+
+ gGL.flush();
+
+ S32 w = right-left;
+ S32 h = top-bottom;
+
+ glCopyTexSubImage2D(GL_TEXTURE_2D, 0, left, bottom, 0, 0, w, h);
+ }
+ }
+
+ glGenerateMipmap(GL_TEXTURE_2D);
+
+ gPipeline.mScreen.flush();
+
+ gNormalMapGenProgram.unbind();
+
+ //generateNormalMapFromAlpha(dst_image, nrm_image);
+ }
}
iter->second = bump; // derefs (and deletes) old image
@@ -1369,18 +1482,24 @@ void LLDrawPoolBump::pushBatch(LLDrawInfo& params, U32 mask, BOOL texture, BOOL
if (mShiny)
{
gGL.getTexUnit(0)->activate();
- glMatrixMode(GL_TEXTURE);
+ gGL.matrixMode(LLRender::MM_TEXTURE);
}
else
{
- gGL.getTexUnit(1)->activate();
- glMatrixMode(GL_TEXTURE);
- glLoadMatrixf((GLfloat*) params.mTextureMatrix->mMatrix);
- gPipeline.mTextureMatrixOps++;
+ if (!LLGLSLShader::sNoFixedFunction)
+ {
+ gGL.getTexUnit(1)->activate();
+ gGL.matrixMode(LLRender::MM_TEXTURE);
+ gGL.loadMatrix((GLfloat*) params.mTextureMatrix->mMatrix);
+ }
+
gGL.getTexUnit(0)->activate();
+ gGL.matrixMode(LLRender::MM_TEXTURE);
+ gGL.loadMatrix((GLfloat*) params.mTextureMatrix->mMatrix);
+ gPipeline.mTextureMatrixOps++;
}
- glLoadMatrixf((GLfloat*) params.mTextureMatrix->mMatrix);
+ gGL.loadMatrix((GLfloat*) params.mTextureMatrix->mMatrix);
gPipeline.mTextureMatrixOps++;
tex_setup = true;
@@ -1390,7 +1509,7 @@ void LLDrawPoolBump::pushBatch(LLDrawInfo& params, U32 mask, BOOL texture, BOOL
{
if (params.mTexture.notNull())
{
- gGL.getTexUnit(diffuse_channel)->bind(params.mTexture) ;
+ gGL.getTexUnit(diffuse_channel)->bind(params.mTexture);
params.mTexture->addTextureStats(params.mVSize);
}
else
@@ -1415,12 +1534,17 @@ void LLDrawPoolBump::pushBatch(LLDrawInfo& params, U32 mask, BOOL texture, BOOL
}
else
{
- gGL.getTexUnit(1)->activate();
- glLoadIdentity();
+ if (!LLGLSLShader::sNoFixedFunction)
+ {
+ gGL.getTexUnit(1)->activate();
+ gGL.matrixMode(LLRender::MM_TEXTURE);
+ gGL.loadIdentity();
+ }
gGL.getTexUnit(0)->activate();
+ gGL.matrixMode(LLRender::MM_TEXTURE);
}
- glLoadIdentity();
- glMatrixMode(GL_MODELVIEW);
+ gGL.loadIdentity();
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
}
}
@@ -1465,6 +1589,7 @@ void LLDrawPoolInvisible::endDeferredPass( S32 pass )
void LLDrawPoolInvisible::renderDeferred( S32 pass )
{ //render invisiprims; this doesn't work becaue it also blocks all the post-deferred stuff
+#if 0
LLFastTimer t(FTM_RENDER_INVISIBLE);
U32 invisi_mask = LLVertexBuffer::MAP_VERTEX;
@@ -1482,4 +1607,5 @@ void LLDrawPoolInvisible::renderDeferred( S32 pass )
renderShiny(true);
endShiny(true);
}
+#endif
}
diff --git a/indra/newview/lldrawpoolground.cpp b/indra/newview/lldrawpoolground.cpp
index ce07e62122..59c3fbf7a1 100644
--- a/indra/newview/lldrawpoolground.cpp
+++ b/indra/newview/lldrawpoolground.cpp
@@ -71,9 +71,9 @@ void LLDrawPoolGround::render(S32 pass)
LLGLSquashToFarClip far_clip(glh_get_current_projection());
F32 water_height = gAgent.getRegion()->getWaterHeight();
- glPushMatrix();
+ gGL.pushMatrix();
LLVector3 origin = LLViewerCamera::getInstance()->getOrigin();
- glTranslatef(origin.mV[0], origin.mV[1], llmax(origin.mV[2], water_height));
+ gGL.translatef(origin.mV[0], origin.mV[1], llmax(origin.mV[2], water_height));
LLFace *facep = mDrawFace[0];
@@ -82,6 +82,6 @@ void LLDrawPoolGround::render(S32 pass)
LLOverrideFaceColor col(this, gSky.mVOSkyp->getGLFogColor());
facep->renderIndexed();
- glPopMatrix();
+ gGL.popMatrix();
}
diff --git a/indra/newview/lldrawpoolsimple.cpp b/indra/newview/lldrawpoolsimple.cpp
index eec4ee6bac..6e0ea78af2 100644
--- a/indra/newview/lldrawpoolsimple.cpp
+++ b/indra/newview/lldrawpoolsimple.cpp
@@ -46,7 +46,7 @@ static LLFastTimer::DeclareTimer FTM_RENDER_GRASS_DEFERRED("Deferred Grass");
void LLDrawPoolGlow::beginPostDeferredPass(S32 pass)
{
- gDeferredFullbrightProgram.bind();
+ gDeferredEmissiveProgram.bind();
}
static LLFastTimer::DeclareTimer FTM_RENDER_GLOW_PUSH("Glow Push");
@@ -76,10 +76,22 @@ void LLDrawPoolGlow::renderPostDeferred(S32 pass)
void LLDrawPoolGlow::endPostDeferredPass(S32 pass)
{
- gDeferredFullbrightProgram.unbind();
+ gDeferredEmissiveProgram.unbind();
LLRenderPass::endRenderPass(pass);
}
+S32 LLDrawPoolGlow::getNumPasses()
+{
+ if (LLViewerShaderMgr::instance()->getVertexShaderLevel(LLViewerShaderMgr::SHADER_OBJECT) > 0)
+ {
+ return 1;
+ }
+ else
+ {
+ return 0;
+ }
+}
+
void LLDrawPoolGlow::render(S32 pass)
{
LLFastTimer t(FTM_RENDER_GLOW);
@@ -93,39 +105,29 @@ void LLDrawPoolGlow::render(S32 pass)
U32 shader_level = LLViewerShaderMgr::instance()->getVertexShaderLevel(LLViewerShaderMgr::SHADER_OBJECT);
- if (shader_level > 0 && fullbright_shader)
- {
- fullbright_shader->bind();
- }
- else
- {
- gPipeline.enableLightsFullbright(LLColor4(1,1,1,1));
- }
+ //should never get here without basic shaders enabled
+ llassert(shader_level > 0);
+
+ LLGLSLShader* shader = LLPipeline::sUnderWaterRender ? &gObjectEmissiveWaterProgram : &gObjectEmissiveProgram;
+ shader->bind();
LLGLDepthTest depth(GL_TRUE, GL_FALSE);
gGL.setColorMask(false, true);
- if (shader_level > 1)
- {
- pushBatches(LLRenderPass::PASS_GLOW, getVertexDataMask() | LLVertexBuffer::MAP_TEXTURE_INDEX, TRUE, TRUE);
- }
- else
- {
- renderTexture(LLRenderPass::PASS_GLOW, getVertexDataMask());
- }
+ pushBatches(LLRenderPass::PASS_GLOW, getVertexDataMask() | LLVertexBuffer::MAP_TEXTURE_INDEX, TRUE, TRUE);
gGL.setColorMask(true, false);
gGL.setSceneBlendType(LLRender::BT_ALPHA);
if (shader_level > 0 && fullbright_shader)
{
- fullbright_shader->unbind();
+ shader->unbind();
}
}
void LLDrawPoolGlow::pushBatch(LLDrawInfo& params, U32 mask, BOOL texture, BOOL batch_textures)
{
- glColor4ubv(params.mGlowColor.mV);
+ //gGL.diffuseColor4ubv(params.mGlowColor.mV);
LLRenderPass::pushBatch(params, mask, texture, batch_textures);
}
@@ -253,6 +255,7 @@ void LLDrawPoolGrass::prerender()
void LLDrawPoolGrass::beginRenderPass(S32 pass)
{
LLFastTimer t(FTM_RENDER_GRASS);
+ stop_glerror();
if (LLPipeline::sUnderWaterRender)
{
@@ -266,7 +269,7 @@ void LLDrawPoolGrass::beginRenderPass(S32 pass)
if (mVertexShaderLevel > 0)
{
simple_shader->bind();
- simple_shader->setAlphaRange(0.5f, 1.f);
+ simple_shader->setMinimumAlpha(0.5f);
}
else
{
@@ -322,7 +325,7 @@ void LLDrawPoolGrass::renderDeferred(S32 pass)
{
LLFastTimer t(FTM_RENDER_GRASS_DEFERRED);
gDeferredNonIndexedDiffuseAlphaMaskProgram.bind();
- gDeferredNonIndexedDiffuseAlphaMaskProgram.setAlphaRange(0.5f, 1.f);
+ gDeferredNonIndexedDiffuseAlphaMaskProgram.setMinimumAlpha(0.5f);
//render grass
LLRenderPass::renderTexture(LLRenderPass::PASS_GRASS, getVertexDataMask());
}
diff --git a/indra/newview/lldrawpoolsimple.h b/indra/newview/lldrawpoolsimple.h
index 3811b3d398..bd62bc7502 100644
--- a/indra/newview/lldrawpoolsimple.h
+++ b/indra/newview/lldrawpoolsimple.h
@@ -118,7 +118,8 @@ public:
enum
{
VERTEX_DATA_MASK = LLVertexBuffer::MAP_VERTEX |
- LLVertexBuffer::MAP_TEXCOORD0
+ LLVertexBuffer::MAP_TEXCOORD0 |
+ LLVertexBuffer::MAP_EMISSIVE
};
virtual U32 getVertexDataMask() { return VERTEX_DATA_MASK; }
@@ -130,6 +131,8 @@ public:
/*virtual*/ void endPostDeferredPass(S32 pass);
/*virtual*/ void renderPostDeferred(S32 pass);
+ /*virtual*/ S32 getNumPasses();
+
void render(S32 pass = 0);
void pushBatch(LLDrawInfo& params, U32 mask, BOOL texture = TRUE, BOOL batch_textures = FALSE);
diff --git a/indra/newview/lldrawpoolsky.cpp b/indra/newview/lldrawpoolsky.cpp
index efffb2df9e..7f7d9f65c6 100644
--- a/indra/newview/lldrawpoolsky.cpp
+++ b/indra/newview/lldrawpoolsky.cpp
@@ -76,15 +76,16 @@ void LLDrawPoolSky::render(S32 pass)
return;
}
- // use a shader only underwater
+ // don't render sky under water (background just gets cleared to fog color)
if(mVertexShaderLevel > 0 && LLPipeline::sUnderWaterRender)
{
- mShader = &gObjectFullbrightWaterProgram;
- mShader->bind();
+ return;
}
- else if (LLGLSLShader::sNoFixedFunction)
+
+
+ if (LLGLSLShader::sNoFixedFunction)
{ //just use the UI shader (generic single texture no lighting)
- gUIProgram.bind();
+ gOneTextureNoColorProgram.bind();
}
else
{
@@ -111,21 +112,21 @@ void LLDrawPoolSky::render(S32 pass)
LLGLDisable clip(GL_CLIP_PLANE0);
- glPushMatrix();
+ gGL.pushMatrix();
LLVector3 origin = LLViewerCamera::getInstance()->getOrigin();
- glTranslatef(origin.mV[0], origin.mV[1], origin.mV[2]);
+ gGL.translatef(origin.mV[0], origin.mV[1], origin.mV[2]);
S32 face_count = (S32)mDrawFace.size();
LLVertexBuffer::unbind();
- glColor4f(1,1,1,1);
+ gGL.diffuseColor4f(1,1,1,1);
for (S32 i = 0; i < llmin(6, face_count); ++i)
{
renderSkyCubeFace(i);
}
- glPopMatrix();
+ gGL.popMatrix();
}
void LLDrawPoolSky::renderSkyCubeFace(U8 side)
@@ -146,7 +147,7 @@ void LLDrawPoolSky::renderSkyCubeFace(U8 side)
LLGLEnable blend(GL_BLEND);
mSkyTex[side].bindTexture(FALSE);
- glColor4f(1, 1, 1, LLSkyTex::getInterpVal()); // lighting is disabled
+ gGL.diffuseColor4f(1, 1, 1, LLSkyTex::getInterpVal()); // lighting is disabled
face.renderIndexed();
}
}
diff --git a/indra/newview/lldrawpoolterrain.cpp b/indra/newview/lldrawpoolterrain.cpp
index 3daa0f8261..b95d8296fa 100644
--- a/indra/newview/lldrawpoolterrain.cpp
+++ b/indra/newview/lldrawpoolterrain.cpp
@@ -62,13 +62,16 @@ LLDrawPoolTerrain::LLDrawPoolTerrain(LLViewerTexture *texturep) :
LLFacePool(POOL_TERRAIN),
mTexturep(texturep)
{
+ U32 format = GL_ALPHA8;
+ U32 int_format = GL_ALPHA;
+
// Hack!
sDetailScale = 1.f/gSavedSettings.getF32("RenderTerrainScale");
sDetailMode = gSavedSettings.getS32("RenderTerrainDetail");
mAlphaRampImagep = LLViewerTextureManager::getFetchedTextureFromFile("alpha_gradient.tga",
TRUE, LLViewerTexture::BOOST_UI,
LLViewerTexture::FETCHED_TEXTURE,
- GL_ALPHA8, GL_ALPHA,
+ format, int_format,
LLUUID("e97cf410-8e61-7005-ec06-629eba4cd1fb"));
//gGL.getTexUnit(0)->bind(mAlphaRampImagep.get());
@@ -77,7 +80,7 @@ LLDrawPoolTerrain::LLDrawPoolTerrain(LLViewerTexture *texturep) :
m2DAlphaRampImagep = LLViewerTextureManager::getFetchedTextureFromFile("alpha_gradient_2d.j2c",
TRUE, LLViewerTexture::BOOST_UI,
LLViewerTexture::FETCHED_TEXTURE,
- GL_ALPHA8, GL_ALPHA,
+ format, int_format,
LLUUID("38b86f85-2575-52a9-a531-23108d8da837"));
//gGL.getTexUnit(0)->bind(m2DAlphaRampImagep.get());
@@ -106,6 +109,10 @@ U32 LLDrawPoolTerrain::getVertexDataMask()
{
return LLVertexBuffer::MAP_VERTEX;
}
+ else if (LLGLSLShader::sCurBoundShaderPtr)
+ {
+ return VERTEX_DATA_MASK & ~(LLVertexBuffer::MAP_TEXCOORD2 | LLVertexBuffer::MAP_TEXCOORD3);
+ }
else
{
return VERTEX_DATA_MASK;
@@ -115,14 +122,7 @@ U32 LLDrawPoolTerrain::getVertexDataMask()
void LLDrawPoolTerrain::prerender()
{
mVertexShaderLevel = LLViewerShaderMgr::instance()->getVertexShaderLevel(LLViewerShaderMgr::SHADER_ENVIRONMENT);
- if (mVertexShaderLevel > 0)
- {
- sDetailMode = 1;
- }
- else
- {
- sDetailMode = gSavedSettings.getS32("RenderTerrainDetail");
- }
+ sDetailMode = gSavedSettings.getS32("RenderTerrainDetail");
}
void LLDrawPoolTerrain::beginRenderPass( S32 pass )
@@ -132,7 +132,7 @@ void LLDrawPoolTerrain::beginRenderPass( S32 pass )
sShader = LLPipeline::sUnderWaterRender ?
&gTerrainWaterProgram :
- &gTerrainProgram;
+ &gTerrainProgram;
if (mVertexShaderLevel > 1 && sShader->mShaderLevel > 0)
{
@@ -174,6 +174,8 @@ void LLDrawPoolTerrain::render(S32 pass)
compp->mDetailTextures[i]->addTextureStats(1024.f*1024.f); // assume large pixel area
}
+ LLOverrideFaceColor override(this, 1.f, 1.f, 1.f, 1.f);
+
if (!gGLManager.mHasMultitexture)
{
// No multitexture, render simple land.
@@ -188,22 +190,27 @@ void LLDrawPoolTerrain::render(S32 pass)
}
LLGLSPipeline gls;
- LLOverrideFaceColor override(this, 1.f, 1.f, 1.f, 1.f);
-
+
if (mVertexShaderLevel > 1 && sShader->mShaderLevel > 0)
{
gPipeline.enableLightsDynamic();
+
renderFullShader();
}
else
{
gPipeline.enableLightsStatic();
- if (sDetailMode == 0){
+ if (sDetailMode == 0)
+ {
renderSimple();
- } else if (gGLManager.mNumTextureUnits < 4){
+ }
+ else if (gGLManager.mNumTextureUnits < 4)
+ {
renderFull2TU();
- } else {
+ }
+ else
+ {
renderFull4TU();
}
}
@@ -215,8 +222,9 @@ void LLDrawPoolTerrain::render(S32 pass)
{ //use fullbright shader for highlighting
LLGLSLShader* old_shader = sShader;
sShader->unbind();
- sShader = &gObjectFullbrightNonIndexedProgram;
+ sShader = &gHighlightProgram;
sShader->bind();
+ gGL.diffuseColor4f(1,1,1,1);
LLGLEnable polyOffset(GL_POLYGON_OFFSET_FILL);
glPolygonOffset(-1.0f, -1.0f);
renderOwnership();
@@ -312,16 +320,15 @@ void LLDrawPoolTerrain::renderFullShader()
gGL.getTexUnit(detail0)->bind(detail_texture0p);
gGL.getTexUnit(0)->activate();
- glEnable(GL_TEXTURE_GEN_S);
- glEnable(GL_TEXTURE_GEN_T);
- glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
- glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
+ LLGLSLShader* shader = LLGLSLShader::sCurBoundShaderPtr;
+ llassert(shader);
+
+ shader->uniform4fv("object_plane_s", 1, tp0.mV);
+ shader->uniform4fv("object_plane_t", 1, tp1.mV);
- glTexGenfv(GL_S, GL_OBJECT_PLANE, tp0.mV);
- glTexGenfv(GL_T, GL_OBJECT_PLANE, tp1.mV);
- glMatrixMode(GL_TEXTURE);
- glLoadIdentity();
- glMatrixMode(GL_MODELVIEW);
+ gGL.matrixMode(LLRender::MM_TEXTURE);
+ gGL.loadIdentity();
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
//
// detail texture 1
@@ -331,9 +338,9 @@ void LLDrawPoolTerrain::renderFullShader()
/// ALPHA TEXTURE COORDS 0:
gGL.getTexUnit(1)->activate();
- glMatrixMode(GL_TEXTURE);
- glLoadIdentity();
- glMatrixMode(GL_MODELVIEW);
+ gGL.matrixMode(LLRender::MM_TEXTURE);
+ gGL.loadIdentity();
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
// detail texture 2
//
@@ -343,10 +350,10 @@ void LLDrawPoolTerrain::renderFullShader()
gGL.getTexUnit(2)->activate();
/// ALPHA TEXTURE COORDS 1:
- glMatrixMode(GL_TEXTURE);
- glLoadIdentity();
- glTranslatef(-2.f, 0.f, 0.f);
- glMatrixMode(GL_MODELVIEW);
+ gGL.matrixMode(LLRender::MM_TEXTURE);
+ gGL.loadIdentity();
+ gGL.translatef(-2.f, 0.f, 0.f);
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
//
// detail texture 3
@@ -356,10 +363,10 @@ void LLDrawPoolTerrain::renderFullShader()
/// ALPHA TEXTURE COORDS 2:
gGL.getTexUnit(3)->activate();
- glMatrixMode(GL_TEXTURE);
- glLoadIdentity();
- glTranslatef(-1.f, 0.f, 0.f);
- glMatrixMode(GL_MODELVIEW);
+ gGL.matrixMode(LLRender::MM_TEXTURE);
+ gGL.loadIdentity();
+ gGL.translatef(-1.f, 0.f, 0.f);
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
//
// Alpha Ramp
@@ -380,38 +387,30 @@ void LLDrawPoolTerrain::renderFullShader()
gGL.getTexUnit(alpha_ramp)->unbind(LLTexUnit::TT_TEXTURE);
gGL.getTexUnit(4)->disable();
gGL.getTexUnit(4)->activate();
- glDisable(GL_TEXTURE_GEN_S);
- glDisable(GL_TEXTURE_GEN_T);
- glMatrixMode(GL_TEXTURE);
- glLoadIdentity();
- glMatrixMode(GL_MODELVIEW);
-
+
gGL.getTexUnit(detail3)->unbind(LLTexUnit::TT_TEXTURE);
gGL.getTexUnit(3)->disable();
gGL.getTexUnit(3)->activate();
- glDisable(GL_TEXTURE_GEN_S);
- glDisable(GL_TEXTURE_GEN_T);
- glMatrixMode(GL_TEXTURE);
- glLoadIdentity();
- glMatrixMode(GL_MODELVIEW);
+
+ gGL.matrixMode(LLRender::MM_TEXTURE);
+ gGL.loadIdentity();
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
gGL.getTexUnit(detail2)->unbind(LLTexUnit::TT_TEXTURE);
gGL.getTexUnit(2)->disable();
gGL.getTexUnit(2)->activate();
- glDisable(GL_TEXTURE_GEN_S);
- glDisable(GL_TEXTURE_GEN_T);
- glMatrixMode(GL_TEXTURE);
- glLoadIdentity();
- glMatrixMode(GL_MODELVIEW);
+
+ gGL.matrixMode(LLRender::MM_TEXTURE);
+ gGL.loadIdentity();
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
gGL.getTexUnit(detail1)->unbind(LLTexUnit::TT_TEXTURE);
gGL.getTexUnit(1)->disable();
gGL.getTexUnit(1)->activate();
- glDisable(GL_TEXTURE_GEN_S);
- glDisable(GL_TEXTURE_GEN_T);
- glMatrixMode(GL_TEXTURE);
- glLoadIdentity();
- glMatrixMode(GL_MODELVIEW);
+
+ gGL.matrixMode(LLRender::MM_TEXTURE);
+ gGL.loadIdentity();
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
//----------------------------------------------------------------------------
// Restore Texture Unit 0 defaults
@@ -419,11 +418,9 @@ void LLDrawPoolTerrain::renderFullShader()
gGL.getTexUnit(detail0)->unbind(LLTexUnit::TT_TEXTURE);
gGL.getTexUnit(0)->enable(LLTexUnit::TT_TEXTURE);
gGL.getTexUnit(0)->activate();
- glDisable(GL_TEXTURE_GEN_S);
- glDisable(GL_TEXTURE_GEN_T);
- glMatrixMode(GL_TEXTURE);
- glLoadIdentity();
- glMatrixMode(GL_MODELVIEW);
+ gGL.matrixMode(LLRender::MM_TEXTURE);
+ gGL.loadIdentity();
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
}
void LLDrawPoolTerrain::renderFull4TU()
@@ -534,9 +531,9 @@ void LLDrawPoolTerrain::renderFull4TU()
gGL.getTexUnit(1)->activate();
// Set the texture matrix
- glMatrixMode(GL_TEXTURE);
- glLoadIdentity();
- glTranslatef(-2.f, 0.f, 0.f);
+ gGL.matrixMode(LLRender::MM_TEXTURE);
+ gGL.loadIdentity();
+ gGL.translatef(-2.f, 0.f, 0.f);
// Care about alpha only
gGL.getTexUnit(1)->setTextureColorBlend(LLTexUnit::TBO_REPLACE, LLTexUnit::TBS_PREV_COLOR);
@@ -566,9 +563,9 @@ void LLDrawPoolTerrain::renderFull4TU()
gGL.getTexUnit(3)->activate();
// Set the texture matrix
- glMatrixMode(GL_TEXTURE);
- glLoadIdentity();
- glTranslatef(-1.f, 0.f, 0.f);
+ gGL.matrixMode(LLRender::MM_TEXTURE);
+ gGL.loadIdentity();
+ gGL.translatef(-1.f, 0.f, 0.f);
// Set alpha texture and do lighting modulation
gGL.getTexUnit(3)->setTextureColorBlend(LLTexUnit::TBO_MULT, LLTexUnit::TBS_PREV_COLOR, LLTexUnit::TBS_VERT_COLOR);
@@ -586,9 +583,9 @@ void LLDrawPoolTerrain::renderFull4TU()
gGL.getTexUnit(3)->disable();
gGL.getTexUnit(3)->activate();
- glMatrixMode(GL_TEXTURE);
- glLoadIdentity();
- glMatrixMode(GL_MODELVIEW);
+ gGL.matrixMode(LLRender::MM_TEXTURE);
+ gGL.loadIdentity();
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
gGL.getTexUnit(2)->unbind(LLTexUnit::TT_TEXTURE);
gGL.getTexUnit(2)->disable();
@@ -596,17 +593,17 @@ void LLDrawPoolTerrain::renderFull4TU()
glDisable(GL_TEXTURE_GEN_S);
glDisable(GL_TEXTURE_GEN_T);
- glMatrixMode(GL_TEXTURE);
- glLoadIdentity();
- glMatrixMode(GL_MODELVIEW);
+ gGL.matrixMode(LLRender::MM_TEXTURE);
+ gGL.loadIdentity();
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
gGL.getTexUnit(1)->unbind(LLTexUnit::TT_TEXTURE);
gGL.getTexUnit(1)->disable();
gGL.getTexUnit(1)->activate();
- glMatrixMode(GL_TEXTURE);
- glLoadIdentity();
- glMatrixMode(GL_MODELVIEW);
+ gGL.matrixMode(LLRender::MM_TEXTURE);
+ gGL.loadIdentity();
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
// Restore blend state
gGL.setSceneBlendType(LLRender::BT_ALPHA);
@@ -620,9 +617,9 @@ void LLDrawPoolTerrain::renderFull4TU()
glDisable(GL_TEXTURE_GEN_S);
glDisable(GL_TEXTURE_GEN_T);
- glMatrixMode(GL_TEXTURE);
- glLoadIdentity();
- glMatrixMode(GL_MODELVIEW);
+ gGL.matrixMode(LLRender::MM_TEXTURE);
+ gGL.loadIdentity();
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT);
}
@@ -714,9 +711,9 @@ void LLDrawPoolTerrain::renderFull2TU()
gGL.getTexUnit(0)->bind(m2DAlphaRampImagep);
// Set the texture matrix
- glMatrixMode(GL_TEXTURE);
- glLoadIdentity();
- glTranslatef(-1.f, 0.f, 0.f);
+ gGL.matrixMode(LLRender::MM_TEXTURE);
+ gGL.loadIdentity();
+ gGL.translatef(-1.f, 0.f, 0.f);
// Care about alpha only
gGL.getTexUnit(0)->setTextureColorBlend(LLTexUnit::TBO_REPLACE, LLTexUnit::TBS_PREV_COLOR);
@@ -753,9 +750,9 @@ void LLDrawPoolTerrain::renderFull2TU()
gGL.getTexUnit(0)->activate();
gGL.getTexUnit(0)->bind(m2DAlphaRampImagep);
// Set the texture matrix
- glMatrixMode(GL_TEXTURE);
- glLoadIdentity();
- glTranslatef(-2.f, 0.f, 0.f);
+ gGL.matrixMode(LLRender::MM_TEXTURE);
+ gGL.loadIdentity();
+ gGL.translatef(-2.f, 0.f, 0.f);
// Care about alpha only
gGL.getTexUnit(0)->setTextureColorBlend(LLTexUnit::TBO_REPLACE, LLTexUnit::TBS_PREV_COLOR);
@@ -793,9 +790,9 @@ void LLDrawPoolTerrain::renderFull2TU()
glDisable(GL_TEXTURE_GEN_S);
glDisable(GL_TEXTURE_GEN_T);
- glMatrixMode(GL_TEXTURE);
- glLoadIdentity();
- glMatrixMode(GL_MODELVIEW);
+ gGL.matrixMode(LLRender::MM_TEXTURE);
+ gGL.loadIdentity();
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
//----------------------------------------------------------------------------
// Restore Texture Unit 0 defaults
@@ -805,9 +802,9 @@ void LLDrawPoolTerrain::renderFull2TU()
glDisable(GL_TEXTURE_GEN_S);
glDisable(GL_TEXTURE_GEN_T);
- glMatrixMode(GL_TEXTURE);
- glLoadIdentity();
- glMatrixMode(GL_MODELVIEW);
+ gGL.matrixMode(LLRender::MM_TEXTURE);
+ gGL.loadIdentity();
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT);
}
@@ -831,13 +828,21 @@ void LLDrawPoolTerrain::renderSimple()
tp0.setVec(tscale, 0.f, 0.0f, -1.f*(origin_agent.mV[0]/256.f));
tp1.setVec(0.f, tscale, 0.0f, -1.f*(origin_agent.mV[1]/256.f));
- glEnable(GL_TEXTURE_GEN_S);
- glEnable(GL_TEXTURE_GEN_T);
- glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
- glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
- glTexGenfv(GL_S, GL_OBJECT_PLANE, tp0.mV);
- glTexGenfv(GL_T, GL_OBJECT_PLANE, tp1.mV);
-
+ if (LLGLSLShader::sNoFixedFunction)
+ {
+ sShader->uniform4fv("object_plane_s", 1, tp0.mV);
+ sShader->uniform4fv("object_plane_t", 1, tp1.mV);
+ }
+ else
+ {
+ glEnable(GL_TEXTURE_GEN_S);
+ glEnable(GL_TEXTURE_GEN_T);
+ glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
+ glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
+ glTexGenfv(GL_S, GL_OBJECT_PLANE, tp0.mV);
+ glTexGenfv(GL_T, GL_OBJECT_PLANE, tp1.mV);
+ }
+
gGL.getTexUnit(0)->setTextureColorBlend(LLTexUnit::TBO_MULT, LLTexUnit::TBS_TEX_COLOR, LLTexUnit::TBS_VERT_COLOR);
drawLoop();
@@ -847,11 +852,14 @@ void LLDrawPoolTerrain::renderSimple()
gGL.getTexUnit(0)->activate();
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
- glDisable(GL_TEXTURE_GEN_S);
- glDisable(GL_TEXTURE_GEN_T);
- glMatrixMode(GL_TEXTURE);
- glLoadIdentity();
- glMatrixMode(GL_MODELVIEW);
+ if (!LLGLSLShader::sNoFixedFunction)
+ {
+ glDisable(GL_TEXTURE_GEN_S);
+ glDisable(GL_TEXTURE_GEN_T);
+ }
+ gGL.matrixMode(LLRender::MM_TEXTURE);
+ gGL.loadIdentity();
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT);
}
@@ -882,11 +890,11 @@ void LLDrawPoolTerrain::renderOwnership()
// texture coordinates for pixel 256x256 is not 1,1. This makes the
// ownership map not line up with the selection. We address this with
// a texture matrix multiply.
- glMatrixMode(GL_TEXTURE);
- glPushMatrix();
+ gGL.matrixMode(LLRender::MM_TEXTURE);
+ gGL.pushMatrix();
const F32 TEXTURE_FUDGE = 257.f / 256.f;
- glScalef( TEXTURE_FUDGE, TEXTURE_FUDGE, 1.f );
+ gGL.scalef( TEXTURE_FUDGE, TEXTURE_FUDGE, 1.f );
for (std::vector<LLFace*>::iterator iter = mDrawFace.begin();
iter != mDrawFace.end(); iter++)
{
@@ -895,9 +903,9 @@ void LLDrawPoolTerrain::renderOwnership()
LLVertexBuffer::MAP_TEXCOORD0);
}
- glMatrixMode(GL_TEXTURE);
- glPopMatrix();
- glMatrixMode(GL_MODELVIEW);
+ gGL.matrixMode(LLRender::MM_TEXTURE);
+ gGL.popMatrix();
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
}
diff --git a/indra/newview/lldrawpoolterrain.h b/indra/newview/lldrawpoolterrain.h
index 3056da44d5..283ed87f1a 100644
--- a/indra/newview/lldrawpoolterrain.h
+++ b/indra/newview/lldrawpoolterrain.h
@@ -40,8 +40,7 @@ public:
LLVertexBuffer::MAP_TEXCOORD0 |
LLVertexBuffer::MAP_TEXCOORD1 |
LLVertexBuffer::MAP_TEXCOORD2 |
- LLVertexBuffer::MAP_TEXCOORD3 |
- LLVertexBuffer::MAP_COLOR
+ LLVertexBuffer::MAP_TEXCOORD3
};
virtual U32 getVertexDataMask();
diff --git a/indra/newview/lldrawpooltree.cpp b/indra/newview/lldrawpooltree.cpp
index a6e0151114..3165a3516c 100644
--- a/indra/newview/lldrawpooltree.cpp
+++ b/indra/newview/lldrawpooltree.cpp
@@ -65,17 +65,18 @@ void LLDrawPoolTree::beginRenderPass(S32 pass)
if (LLPipeline::sUnderWaterRender)
{
- shader = &gObjectAlphaMaskNonIndexedWaterProgram;
+ shader = &gTreeWaterProgram;
}
else
{
- shader = &gObjectAlphaMaskNonIndexedProgram;
+ shader = &gTreeProgram;
}
if (gPipeline.canUseVertexShaders())
{
shader->bind();
- shader->setAlphaRange(0.5f, 1.f);
+ shader->setMinimumAlpha(0.5f);
+ gGL.diffuseColor4f(1,1,1,1);
}
else
{
@@ -96,25 +97,18 @@ void LLDrawPoolTree::render(S32 pass)
LLGLState test(GL_ALPHA_TEST, LLGLSLShader::sNoFixedFunction ? 0 : 1);
LLOverrideFaceColor color(this, 1.f, 1.f, 1.f, 1.f);
- if (gSavedSettings.getBOOL("RenderAnimateTrees"))
- {
- renderTree();
- }
- else
+ gGL.getTexUnit(sDiffTex)->bind(mTexturep);
+
+ for (std::vector<LLFace*>::iterator iter = mDrawFace.begin();
+ iter != mDrawFace.end(); iter++)
{
- gGL.getTexUnit(sDiffTex)->bind(mTexturep);
-
- for (std::vector<LLFace*>::iterator iter = mDrawFace.begin();
- iter != mDrawFace.end(); iter++)
+ LLFace *face = *iter;
+ LLVertexBuffer* buff = face->getVertexBuffer();
+ if(buff)
{
- LLFace *face = *iter;
- LLVertexBuffer* buff = face->getVertexBuffer();
- if(buff)
- {
- buff->setBuffer(LLDrawPoolTree::VERTEX_DATA_MASK);
- buff->drawRange(LLRender::TRIANGLES, 0, buff->getRequestedVerts()-1, buff->getRequestedIndices(), 0);
- gPipeline.addTrianglesDrawn(buff->getRequestedIndices());
- }
+ buff->setBuffer(LLDrawPoolTree::VERTEX_DATA_MASK);
+ buff->drawRange(LLRender::TRIANGLES, 0, buff->getNumVerts()-1, buff->getNumIndices(), 0);
+ gPipeline.addTrianglesDrawn(buff->getNumIndices());
}
}
}
@@ -141,9 +135,9 @@ void LLDrawPoolTree::beginDeferredPass(S32 pass)
{
LLFastTimer t(FTM_RENDER_TREES);
- shader = &gDeferredNonIndexedDiffuseAlphaMaskProgram;
+ shader = &gDeferredTreeProgram;
shader->bind();
- shader->setAlphaRange(0.5f, 1.f);
+ shader->setMinimumAlpha(0.5f);
}
void LLDrawPoolTree::renderDeferred(S32 pass)
@@ -168,8 +162,8 @@ void LLDrawPoolTree::beginShadowPass(S32 pass)
glPolygonOffset(gSavedSettings.getF32("RenderDeferredTreeShadowOffset"),
gSavedSettings.getF32("RenderDeferredTreeShadowBias"));
- gDeferredShadowAlphaMaskProgram.bind();
- gDeferredShadowAlphaMaskProgram.setAlphaRange(0.5f, 1.f);
+ gDeferredTreeShadowProgram.bind();
+ gDeferredTreeShadowProgram.setMinimumAlpha(0.5f);
}
void LLDrawPoolTree::renderShadow(S32 pass)
@@ -183,133 +177,7 @@ void LLDrawPoolTree::endShadowPass(S32 pass)
glPolygonOffset(gSavedSettings.getF32("RenderDeferredSpotShadowOffset"),
gSavedSettings.getF32("RenderDeferredSpotShadowBias"));
-}
-
-
-void LLDrawPoolTree::renderTree(BOOL selecting)
-{
- LLGLState normalize(GL_NORMALIZE, TRUE);
-
- // Bind the texture for this tree.
- gGL.getTexUnit(sDiffTex)->bind(mTexturep.get(), TRUE);
-
- U32 indices_drawn = 0;
-
- glMatrixMode(GL_MODELVIEW);
-
- for (std::vector<LLFace*>::iterator iter = mDrawFace.begin();
- iter != mDrawFace.end(); iter++)
- {
- LLFace *face = *iter;
- LLDrawable *drawablep = face->getDrawable();
-
- if (drawablep->isDead() || !face->getVertexBuffer())
- {
- continue;
- }
-
- face->getVertexBuffer()->setBuffer(LLDrawPoolTree::VERTEX_DATA_MASK);
- U16* indicesp = (U16*) face->getVertexBuffer()->getIndicesPointer();
-
- // Render each of the trees
- LLVOTree *treep = (LLVOTree *)drawablep->getVObj().get();
-
- LLColor4U color(255,255,255,255);
-
- if (!selecting || treep->mGLName != 0)
- {
- if (selecting)
- {
- S32 name = treep->mGLName;
-
- color = LLColor4U((U8)(name >> 16), (U8)(name >> 8), (U8)name, 255);
- }
-
- gGLLastMatrix = NULL;
- glLoadMatrixd(gGLModelView);
- //glPushMatrix();
- F32 mat[16];
- for (U32 i = 0; i < 16; i++)
- mat[i] = (F32) gGLModelView[i];
-
- LLMatrix4 matrix(mat);
-
- // Translate to tree base HACK - adjustment in Z plants tree underground
- const LLVector3 &pos_agent = treep->getPositionAgent();
- //glTranslatef(pos_agent.mV[VX], pos_agent.mV[VY], pos_agent.mV[VZ] - 0.1f);
- LLMatrix4 trans_mat;
- trans_mat.setTranslation(pos_agent.mV[VX], pos_agent.mV[VY], pos_agent.mV[VZ] - 0.1f);
- trans_mat *= matrix;
-
- // Rotate to tree position and bend for current trunk/wind
- // Note that trunk stiffness controls the amount of bend at the trunk as
- // opposed to the crown of the tree
- //
- const F32 TRUNK_STIFF = 22.f;
-
- LLQuaternion rot =
- LLQuaternion(treep->mTrunkBend.magVec()*TRUNK_STIFF*DEG_TO_RAD, LLVector4(treep->mTrunkBend.mV[VX], treep->mTrunkBend.mV[VY], 0)) *
- LLQuaternion(90.f*DEG_TO_RAD, LLVector4(0,0,1)) *
- treep->getRotation();
-
- LLMatrix4 rot_mat(rot);
- rot_mat *= trans_mat;
-
- F32 radius = treep->getScale().magVec()*0.05f;
- LLMatrix4 scale_mat;
- scale_mat.mMatrix[0][0] =
- scale_mat.mMatrix[1][1] =
- scale_mat.mMatrix[2][2] = radius;
-
- scale_mat *= rot_mat;
-
- const F32 THRESH_ANGLE_FOR_BILLBOARD = 15.f;
- const F32 BLEND_RANGE_FOR_BILLBOARD = 3.f;
-
- F32 droop = treep->mDroop + 25.f*(1.f - treep->mTrunkBend.magVec());
-
- S32 stop_depth = 0;
- F32 app_angle = treep->getAppAngle()*LLVOTree::sTreeFactor;
- F32 alpha = 1.0;
- S32 trunk_LOD = LLVOTree::sMAX_NUM_TREE_LOD_LEVELS;
-
- for (S32 j = 0; j < 4; j++)
- {
-
- if (app_angle > LLVOTree::sLODAngles[j])
- {
- trunk_LOD = j;
- break;
- }
- }
- if(trunk_LOD >= LLVOTree::sMAX_NUM_TREE_LOD_LEVELS)
- {
- continue ; //do not render.
- }
-
- if (app_angle < (THRESH_ANGLE_FOR_BILLBOARD - BLEND_RANGE_FOR_BILLBOARD))
- {
- //
- // Draw only the billboard
- //
- // Only the billboard, can use closer to normal alpha func.
- stop_depth = -1;
- LLFacePool::LLOverrideFaceColor clr(this, color);
- indices_drawn += treep->drawBranchPipeline(scale_mat, indicesp, trunk_LOD, stop_depth, treep->mDepth, treep->mTrunkDepth, 1.0, treep->mTwist, droop, treep->mBranches, alpha);
- }
- else // if (app_angle > (THRESH_ANGLE_FOR_BILLBOARD + BLEND_RANGE_FOR_BILLBOARD))
- {
- //
- // Draw only the full geometry tree
- //
- //stop_depth = (app_angle < THRESH_ANGLE_FOR_RECURSION_REDUCTION);
- LLFacePool::LLOverrideFaceColor clr(this, color);
- indices_drawn += treep->drawBranchPipeline(scale_mat, indicesp, trunk_LOD, stop_depth, treep->mDepth, treep->mTrunkDepth, 1.0, treep->mTwist, droop, treep->mBranches, alpha);
- }
-
- //glPopMatrix();
- }
- }
+ gDeferredTreeShadowProgram.unbind();
}
BOOL LLDrawPoolTree::verify() const
diff --git a/indra/newview/lldrawpooltree.h b/indra/newview/lldrawpooltree.h
index ddb259bb82..e7e25453cf 100644
--- a/indra/newview/lldrawpooltree.h
+++ b/indra/newview/lldrawpooltree.h
@@ -68,9 +68,6 @@ public:
/*virtual*/ LLColor3 getDebugColor() const; // For AGP debug display
static S32 sDiffTex;
-
-private:
- void renderTree(BOOL selecting = FALSE);
};
#endif // LL_LLDRAWPOOLTREE_H
diff --git a/indra/newview/lldrawpoolwater.cpp b/indra/newview/lldrawpoolwater.cpp
index 31c14361b5..4f6eaa5a5b 100644
--- a/indra/newview/lldrawpoolwater.cpp
+++ b/indra/newview/lldrawpoolwater.cpp
@@ -59,6 +59,8 @@ BOOL LLDrawPoolWater::sSkipScreenCopy = FALSE;
BOOL LLDrawPoolWater::sNeedsReflectionUpdate = TRUE;
BOOL LLDrawPoolWater::sNeedsDistortionUpdate = TRUE;
LLColor4 LLDrawPoolWater::sWaterFogColor = LLColor4(0.2f, 0.5f, 0.5f, 0.f);
+F32 LLDrawPoolWater::sWaterFogEnd = 0.f;
+
LLVector3 LLDrawPoolWater::sLightDir;
LLDrawPoolWater::LLDrawPoolWater() :
@@ -219,7 +221,7 @@ void LLDrawPoolWater::render(S32 pass)
water_color.setVec(1.f, 1.f, 1.f, 0.5f*(1.f + up_dot));
}
- glColor4fv(water_color.mV);
+ gGL.diffuseColor4fv(water_color.mV);
// Automatically generate texture coords for detail map
glEnable(GL_TEXTURE_GEN_S); //texture unit 1
@@ -275,15 +277,15 @@ void LLDrawPoolWater::render(S32 pass)
gSky.mVOSkyp->getCubeMap()->enable(0);
gSky.mVOSkyp->getCubeMap()->bind();
- glMatrixMode(GL_TEXTURE);
- glLoadIdentity();
+ gGL.matrixMode(LLRender::MM_TEXTURE);
+ gGL.loadIdentity();
LLMatrix4 camera_mat = LLViewerCamera::getInstance()->getModelview();
LLMatrix4 camera_rot(camera_mat.getMat3());
camera_rot.invert();
- glLoadMatrixf((F32 *)camera_rot.mMatrix);
+ gGL.loadMatrix((F32 *)camera_rot.mMatrix);
- glMatrixMode(GL_MODELVIEW);
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
LLOverrideFaceColor overrid(this, 1.f, 1.f, 1.f, 0.5f*up_dot);
gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT);
@@ -310,9 +312,9 @@ void LLDrawPoolWater::render(S32 pass)
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
gGL.getTexUnit(0)->enable(LLTexUnit::TT_TEXTURE);
- glMatrixMode(GL_TEXTURE);
- glLoadIdentity();
- glMatrixMode(GL_MODELVIEW);
+ gGL.matrixMode(LLRender::MM_TEXTURE);
+ gGL.loadIdentity();
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
}
@@ -332,6 +334,21 @@ void LLDrawPoolWater::renderOpaqueLegacyWater()
{
LLVOSky *voskyp = gSky.mVOSkyp;
+ LLGLSLShader* shader = NULL;
+ if (LLGLSLShader::sNoFixedFunction)
+ {
+ if (LLPipeline::sUnderWaterRender)
+ {
+ shader = &gObjectSimpleNonIndexedTexGenWaterProgram;
+ }
+ else
+ {
+ shader = &gObjectSimpleNonIndexedTexGenProgram;
+ }
+
+ shader->bind();
+ }
+
stop_glerror();
// Depth sorting and write to depth buffer
@@ -354,10 +371,13 @@ void LLDrawPoolWater::renderOpaqueLegacyWater()
gGL.getTexUnit(0)->bind(mOpaqueWaterImagep);
// Automatically generate texture coords for water texture
- glEnable(GL_TEXTURE_GEN_S); //texture unit 0
- glEnable(GL_TEXTURE_GEN_T); //texture unit 0
- glTexGenf(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
- glTexGenf(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
+ if (!shader)
+ {
+ glEnable(GL_TEXTURE_GEN_S); //texture unit 0
+ glEnable(GL_TEXTURE_GEN_T); //texture unit 0
+ glTexGenf(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
+ glTexGenf(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
+ }
// Use the fact that we know all water faces are the same size
// to save some computation
@@ -380,10 +400,18 @@ void LLDrawPoolWater::renderOpaqueLegacyWater()
F32 tp0[4] = { 16.f / 256.f, 0.0f, 0.0f, offset };
F32 tp1[4] = { 0.0f, 16.f / 256.f, 0.0f, offset };
- glTexGenfv(GL_S, GL_OBJECT_PLANE, tp0);
- glTexGenfv(GL_T, GL_OBJECT_PLANE, tp1);
+ if (!shader)
+ {
+ glTexGenfv(GL_S, GL_OBJECT_PLANE, tp0);
+ glTexGenfv(GL_T, GL_OBJECT_PLANE, tp1);
+ }
+ else
+ {
+ shader->uniform4fv("object_plane_s", 1, tp0);
+ shader->uniform4fv("object_plane_t", 1, tp1);
+ }
- glColor3f(1.f, 1.f, 1.f);
+ gGL.diffuseColor3f(1.f, 1.f, 1.f);
for (std::vector<LLFace*>::iterator iter = mDrawFace.begin();
iter != mDrawFace.end(); iter++)
@@ -399,9 +427,12 @@ void LLDrawPoolWater::renderOpaqueLegacyWater()
stop_glerror();
- // Reset the settings back to expected values
- glDisable(GL_TEXTURE_GEN_S); //texture unit 0
- glDisable(GL_TEXTURE_GEN_T); //texture unit 0
+ if (!shader)
+ {
+ // Reset the settings back to expected values
+ glDisable(GL_TEXTURE_GEN_S); //texture unit 0
+ glDisable(GL_TEXTURE_GEN_T); //texture unit 0
+ }
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT);
@@ -623,8 +654,6 @@ void LLDrawPoolWater::shade()
water_color.mV[3] = 0.9f;
}
- glColor4fv(water_color.mV);
-
{
LLGLEnable depth_clamp(gGLManager.mHasDepthClamp ? GL_DEPTH_CLAMP : 0);
LLGLDisable cullface(GL_CULL_FACE);
diff --git a/indra/newview/lldrawpoolwater.h b/indra/newview/lldrawpoolwater.h
index 99b541ca5a..aeeba179d6 100644
--- a/indra/newview/lldrawpoolwater.h
+++ b/indra/newview/lldrawpoolwater.h
@@ -49,6 +49,7 @@ public:
static LLVector3 sLightDir;
static LLColor4 sWaterFogColor;
+ static F32 sWaterFogEnd;
enum
{
diff --git a/indra/newview/lldrawpoolwlsky.cpp b/indra/newview/lldrawpoolwlsky.cpp
index 79a835fd14..caf15fe1cb 100644
--- a/indra/newview/lldrawpoolwlsky.cpp
+++ b/indra/newview/lldrawpoolwlsky.cpp
@@ -100,12 +100,12 @@ void LLDrawPoolWLSky::beginRenderPass( S32 pass )
{
sky_shader =
LLPipeline::sUnderWaterRender ?
- &gObjectSimpleWaterProgram :
+ &gObjectFullbrightNoColorWaterProgram :
&gWLSkyProgram;
cloud_shader =
LLPipeline::sUnderWaterRender ?
- &gObjectSimpleWaterProgram :
+ &gObjectFullbrightNoColorWaterProgram :
&gWLCloudProgram;
}
@@ -130,33 +130,33 @@ void LLDrawPoolWLSky::renderDome(F32 camHeightLocal, LLGLSLShader * shader) cons
llassert_always(NULL != shader);
- glPushMatrix();
+ gGL.pushMatrix();
//chop off translation
if (LLPipeline::sReflectionRender && origin.mV[2] > 256.f)
{
- glTranslatef(origin.mV[0], origin.mV[1], 256.f-origin.mV[2]*0.5f);
+ gGL.translatef(origin.mV[0], origin.mV[1], 256.f-origin.mV[2]*0.5f);
}
else
{
- glTranslatef(origin.mV[0], origin.mV[1], origin.mV[2]);
+ gGL.translatef(origin.mV[0], origin.mV[1], origin.mV[2]);
}
// the windlight sky dome works most conveniently in a coordinate system
// where Y is up, so permute our basis vectors accordingly.
- glRotatef(120.f, 1.f / F_SQRT3, 1.f / F_SQRT3, 1.f / F_SQRT3);
+ gGL.rotatef(120.f, 1.f / F_SQRT3, 1.f / F_SQRT3, 1.f / F_SQRT3);
- glScalef(0.333f, 0.333f, 0.333f);
+ gGL.scalef(0.333f, 0.333f, 0.333f);
- glTranslatef(0.f,-camHeightLocal, 0.f);
+ gGL.translatef(0.f,-camHeightLocal, 0.f);
// Draw WL Sky
shader->uniform3f("camPosLocal", 0.f, camHeightLocal, 0.f);
gSky.mVOWLSkyp->drawDome();
- glPopMatrix();
+ gGL.popMatrix();
}
void LLDrawPoolWLSky::renderSkyHaze(F32 camHeightLocal) const
@@ -197,7 +197,7 @@ void LLDrawPoolWLSky::renderStars(void) const
gGL.getTexUnit(0)->bind(gSky.mVOSkyp->getBloomTex());
gGL.pushMatrix();
- glRotatef(gFrameTimeSeconds*0.01f, 0.f, 0.f, 1.f);
+ gGL.rotatef(gFrameTimeSeconds*0.01f, 0.f, 0.f, 1.f);
// gl_FragColor.rgb = gl_Color.rgb;
// gl_FragColor.a = gl_Color.a * star_alpha.a;
if (LLGLSLShader::sNoFixedFunction)
@@ -267,10 +267,6 @@ void LLDrawPoolWLSky::renderHeavenlyBodies()
if (gSky.mVOSkyp->getMoon().getDraw() && face->getGeomCount())
{
- if (gPipeline.canUseVertexShaders())
- {
- gUIProgram.bind();
- }
// *NOTE: even though we already bound this texture above for the
// stars register combiners, we bind again here for defensive reasons,
// since LLImageGL::bind detects that it's a noop, and optimizes it out.
@@ -284,12 +280,18 @@ void LLDrawPoolWLSky::renderHeavenlyBodies()
color.mV[3] = llclamp(a, 0.f, 1.f);
+ if (gPipeline.canUseVertexShaders())
+ {
+ gHighlightProgram.bind();
+ }
+
LLFacePool::LLOverrideFaceColor color_override(this, color);
+
face->renderIndexed();
if (gPipeline.canUseVertexShaders())
{
- gUIProgram.unbind();
+ gHighlightProgram.unbind();
}
}
}
@@ -315,10 +317,10 @@ void LLDrawPoolWLSky::renderDeferred(S32 pass)
renderSkyHaze(camHeightLocal);
LLVector3 const & origin = LLViewerCamera::getInstance()->getOrigin();
- glPushMatrix();
+ gGL.pushMatrix();
- glTranslatef(origin.mV[0], origin.mV[1], origin.mV[2]);
+ gGL.translatef(origin.mV[0], origin.mV[1], origin.mV[2]);
gDeferredStarProgram.bind();
// *NOTE: have to bind a texture here since register combiners blending in
@@ -332,7 +334,7 @@ void LLDrawPoolWLSky::renderDeferred(S32 pass)
gDeferredStarProgram.unbind();
- glPopMatrix();
+ gGL.popMatrix();
renderSkyClouds(camHeightLocal);
@@ -360,9 +362,9 @@ void LLDrawPoolWLSky::render(S32 pass)
renderSkyHaze(camHeightLocal);
LLVector3 const & origin = LLViewerCamera::getInstance()->getOrigin();
- glPushMatrix();
+ gGL.pushMatrix();
- glTranslatef(origin.mV[0], origin.mV[1], origin.mV[2]);
+ gGL.translatef(origin.mV[0], origin.mV[1], origin.mV[2]);
// *NOTE: have to bind a texture here since register combiners blending in
// renderStars() requires something to be bound and we might as well only
@@ -374,7 +376,7 @@ void LLDrawPoolWLSky::render(S32 pass)
renderStars();
- glPopMatrix();
+ gGL.popMatrix();
renderSkyClouds(camHeightLocal);
diff --git a/indra/newview/lldriverparam.cpp b/indra/newview/lldriverparam.cpp
index 8f47d3c5e5..64eb11fc9b 100644
--- a/indra/newview/lldriverparam.cpp
+++ b/indra/newview/lldriverparam.cpp
@@ -139,7 +139,7 @@ void LLDriverParamInfo::toStream(std::ostream &out)
}
else
{
- llwarns << "could not get parameter " << driven.mDrivenID << " from avatar " << gAgentAvatarp << " for driver parameter " << getID() << llendl;
+ llwarns << "could not get parameter " << driven.mDrivenID << " from avatar " << gAgentAvatarp.get() << " for driver parameter " << getID() << llendl;
}
out << std::endl;
}
diff --git a/indra/newview/lldynamictexture.cpp b/indra/newview/lldynamictexture.cpp
index fb9958ee9d..5d6081a35c 100644
--- a/indra/newview/lldynamictexture.cpp
+++ b/indra/newview/lldynamictexture.cpp
@@ -41,6 +41,7 @@
#include "llviewerdisplay.h"
#include "llrender.h"
#include "pipeline.h"
+#include "llglslshader.h"
// static
LLViewerDynamicTexture::instance_list_t LLViewerDynamicTexture::sInstances[ LLViewerDynamicTexture::ORDER_COUNT ];
@@ -207,6 +208,9 @@ BOOL LLViewerDynamicTexture::updateAllInstances()
return TRUE;
}
+ LLGLSLShader::bindNoShader();
+ LLVertexBuffer::unbind();
+
BOOL result = FALSE;
BOOL ret = FALSE ;
for( S32 order = 0; order < ORDER_COUNT; order++ )
diff --git a/indra/newview/llexternaleditor.cpp b/indra/newview/llexternaleditor.cpp
index ed1d7e860a..9480e54809 100644
--- a/indra/newview/llexternaleditor.cpp
+++ b/indra/newview/llexternaleditor.cpp
@@ -29,6 +29,9 @@
#include "lltrans.h"
#include "llui.h"
+#include "llprocess.h"
+#include "llsdutil.h"
+#include <boost/foreach.hpp>
// static
const std::string LLExternalEditor::sFilenameMarker = "%s";
@@ -45,19 +48,8 @@ LLExternalEditor::EErrorCode LLExternalEditor::setCommand(const std::string& env
return EC_NOT_SPECIFIED;
}
- // Add the filename marker if missing.
- if (cmd.find(sFilenameMarker) == std::string::npos)
- {
- cmd += " \"" + sFilenameMarker + "\"";
- llinfos << "Adding the filename marker (" << sFilenameMarker << ")" << llendl;
- }
-
string_vec_t tokens;
- if (tokenize(tokens, cmd) < 2) // 2 = bin + at least one arg (%s)
- {
- llwarns << "Error parsing editor command" << llendl;
- return EC_PARSE_ERROR;
- }
+ tokenize(tokens, cmd);
// Check executable for existence.
std::string bin_path = tokens[0];
@@ -68,51 +60,48 @@ LLExternalEditor::EErrorCode LLExternalEditor::setCommand(const std::string& env
}
// Save command.
- mProcess.setExecutable(bin_path);
- mArgs.clear();
+ mProcessParams = LLProcess::Params();
+ mProcessParams.executable = bin_path;
for (size_t i = 1; i < tokens.size(); ++i)
{
- if (i > 1) mArgs += " ";
- mArgs += "\"" + tokens[i] + "\"";
+ mProcessParams.args.add(tokens[i]);
}
- llinfos << "Setting command [" << bin_path << " " << mArgs << "]" << llendl;
+
+ // Add the filename marker if missing.
+ if (cmd.find(sFilenameMarker) == std::string::npos)
+ {
+ mProcessParams.args.add(sFilenameMarker);
+ llinfos << "Adding the filename marker (" << sFilenameMarker << ")" << llendl;
+ }
+
+ llinfos << "Setting command [" << mProcessParams << "]" << llendl;
return EC_SUCCESS;
}
LLExternalEditor::EErrorCode LLExternalEditor::run(const std::string& file_path)
{
- std::string args = mArgs;
- if (mProcess.getExecutable().empty() || args.empty())
+ if (std::string(mProcessParams.executable).empty() || mProcessParams.args.empty())
{
llwarns << "Editor command not set" << llendl;
return EC_NOT_SPECIFIED;
}
- // Substitute the filename marker in the command with the actual passed file name.
- LLStringUtil::replaceString(args, sFilenameMarker, file_path);
-
- // Split command into separate tokens.
- string_vec_t tokens;
- tokenize(tokens, args);
+ // Copy params block so we can replace sFilenameMarker
+ LLProcess::Params params;
+ params.executable = mProcessParams.executable;
- // Set process arguments taken from the command.
- mProcess.clearArguments();
- for (string_vec_t::const_iterator arg_it = tokens.begin(); arg_it != tokens.end(); ++arg_it)
- {
- mProcess.addArgument(*arg_it);
- }
-
- // Run the editor.
- llinfos << "Running editor command [" << mProcess.getExecutable() + " " + args << "]" << llendl;
- int result = mProcess.launch();
- if (result == 0)
+ // Substitute the filename marker in the command with the actual passed file name.
+ BOOST_FOREACH(const std::string& arg, mProcessParams.args)
{
- // Prevent killing the process in destructor (will add it to the zombies list).
- mProcess.orphan();
+ std::string fixed(arg);
+ LLStringUtil::replaceString(fixed, sFilenameMarker, file_path);
+ params.args.add(fixed);
}
- return result == 0 ? EC_SUCCESS : EC_FAILED_TO_RUN;
+ // Run the editor. Prevent killing the process in destructor.
+ params.autokill = false;
+ return LLProcess::create(params) ? EC_SUCCESS : EC_FAILED_TO_RUN;
}
// static
@@ -130,6 +119,12 @@ std::string LLExternalEditor::getErrorMessage(EErrorCode code)
return LLTrans::getString("Unknown");
}
+// TODO:
+// - Unit-test this with tests like LLStringUtil::getTokens() (the
+// command-line overload that supports quoted tokens)
+// - Unless there are significant semantic differences, eliminate this method
+// and use LLStringUtil::getTokens() instead.
+
// static
size_t LLExternalEditor::tokenize(string_vec_t& tokens, const std::string& str)
{
diff --git a/indra/newview/llexternaleditor.h b/indra/newview/llexternaleditor.h
index ef5db56c6e..fd2c25020c 100644
--- a/indra/newview/llexternaleditor.h
+++ b/indra/newview/llexternaleditor.h
@@ -27,7 +27,7 @@
#ifndef LL_LLEXTERNALEDITOR_H
#define LL_LLEXTERNALEDITOR_H
-#include <llprocesslauncher.h>
+#include "llprocess.h"
/**
* Usage:
@@ -97,9 +97,7 @@ private:
*/
static const std::string sSetting;
-
- std::string mArgs;
- LLProcessLauncher mProcess;
+ LLProcess::Params mProcessParams;
};
#endif // LL_LLEXTERNALEDITOR_H
diff --git a/indra/newview/llface.cpp b/indra/newview/llface.cpp
index 432e61f6d8..cd33a19a2a 100644
--- a/indra/newview/llface.cpp
+++ b/indra/newview/llface.cpp
@@ -496,14 +496,14 @@ void LLFace::renderSelected(LLViewerTexture *imagep, const LLColor4& color)
gGL.pushMatrix();
if (mDrawablep->isActive())
{
- glMultMatrixf((GLfloat*)mDrawablep->getRenderMatrix().mMatrix);
+ gGL.multMatrix((GLfloat*)mDrawablep->getRenderMatrix().mMatrix);
}
else
{
- glMultMatrixf((GLfloat*)mDrawablep->getRegion()->mRenderMatrix.mMatrix);
+ gGL.multMatrix((GLfloat*)mDrawablep->getRegion()->mRenderMatrix.mMatrix);
}
- glColor4fv(color.mV);
+ gGL.diffuseColor4fv(color.mV);
if (mDrawablep->isState(LLDrawable::RIGGED))
{
@@ -515,7 +515,7 @@ void LLFace::renderSelected(LLViewerTexture *imagep, const LLColor4& color)
{
LLGLEnable offset(GL_POLYGON_OFFSET_FILL);
glPolygonOffset(-1.f, -1.f);
- glMultMatrixf((F32*) volume->getRelativeXform().mMatrix);
+ gGL.multMatrix((F32*) volume->getRelativeXform().mMatrix);
const LLVolumeFace& vol_face = rigged->getVolumeFace(getTEOffset());
LLVertexBuffer::unbind();
glVertexPointer(3, GL_FLOAT, 16, vol_face.mPositions);
@@ -524,6 +524,7 @@ void LLFace::renderSelected(LLViewerTexture *imagep, const LLColor4& color)
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glTexCoordPointer(2, GL_FLOAT, 8, vol_face.mTexCoords);
}
+ gGL.syncMatrices();
glDrawElements(GL_TRIANGLES, vol_face.mNumIndices, GL_UNSIGNED_SHORT, vol_face.mIndices);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
}
@@ -557,17 +558,17 @@ void LLFace::renderSelectedUV()
// add green dither pattern on top of red/blue gradient
gGL.blendFunc(LLRender::BF_ONE, LLRender::BF_ONE);
- glMatrixMode(GL_TEXTURE);
- glPushMatrix();
+ gGL.matrixMode(LLRender::MM_TEXTURE);
+ gGL.pushMatrix();
// make green pattern repeat once per texel in red/blue texture
- glScalef(256.f, 256.f, 1.f);
- glMatrixMode(GL_MODELVIEW);
+ gGL.scalef(256.f, 256.f, 1.f);
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
renderSelected(green_imagep, LLColor4::white);
- glMatrixMode(GL_TEXTURE);
- glPopMatrix();
- glMatrixMode(GL_MODELVIEW);
+ gGL.matrixMode(LLRender::MM_TEXTURE);
+ gGL.popMatrix();
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
gGL.blendFunc(LLRender::BF_SOURCE_ALPHA, LLRender::BF_ONE_MINUS_SOURCE_ALPHA);
}
*/
@@ -692,6 +693,49 @@ static void xform(LLVector2 &tex_coord, F32 cosAng, F32 sinAng, F32 offS, F32 of
tex_coord.mV[1] = t;
}
+// Transform the texture coordinates for this face.
+static void xform4a(LLVector4a &tex_coord, const LLVector4a& trans, const LLVector4Logical& mask, const LLVector4a& rot0, const LLVector4a& rot1, const LLVector4a& offset, const LLVector4a& scale)
+{
+ //tex coord is two coords, <s0, t0, s1, t1>
+ LLVector4a st;
+
+ // Texture transforms are done about the center of the face.
+ st.setAdd(tex_coord, trans);
+
+ // Handle rotation
+ LLVector4a rot_st;
+
+ // <s0 * cosAng, s0*-sinAng, s1*cosAng, s1*-sinAng>
+ LLVector4a s0;
+ s0.splat(st, 0);
+ LLVector4a s1;
+ s1.splat(st, 2);
+ LLVector4a ss;
+ ss.setSelectWithMask(mask, s1, s0);
+
+ LLVector4a a;
+ a.setMul(rot0, ss);
+
+ // <t0*sinAng, t0*cosAng, t1*sinAng, t1*cosAng>
+ LLVector4a t0;
+ t0.splat(st, 1);
+ LLVector4a t1;
+ t1.splat(st, 3);
+ LLVector4a tt;
+ tt.setSelectWithMask(mask, t1, t0);
+
+ LLVector4a b;
+ b.setMul(rot1, tt);
+
+ st.setAdd(a,b);
+
+ // Then scale
+ st.mul(scale);
+
+ // Then offset
+ tex_coord.setAdd(st, offset);
+}
+
bool less_than_max_mag(const LLVector4a& vec)
{
@@ -1055,9 +1099,20 @@ static LLFastTimer::DeclareTimer FTM_FACE_GEOM_POSITION("Position");
static LLFastTimer::DeclareTimer FTM_FACE_GEOM_NORMAL("Normal");
static LLFastTimer::DeclareTimer FTM_FACE_GEOM_TEXTURE("Texture");
static LLFastTimer::DeclareTimer FTM_FACE_GEOM_COLOR("Color");
+static LLFastTimer::DeclareTimer FTM_FACE_GEOM_EMISSIVE("Emissive");
static LLFastTimer::DeclareTimer FTM_FACE_GEOM_WEIGHTS("Weights");
static LLFastTimer::DeclareTimer FTM_FACE_GEOM_BINORMAL("Binormal");
static LLFastTimer::DeclareTimer FTM_FACE_GEOM_INDEX("Index");
+static LLFastTimer::DeclareTimer FTM_FACE_GEOM_INDEX_TAIL("Tail");
+static LLFastTimer::DeclareTimer FTM_FACE_POSITION_STORE("Pos");
+static LLFastTimer::DeclareTimer FTM_FACE_TEXTURE_INDEX_STORE("TexIdx");
+static LLFastTimer::DeclareTimer FTM_FACE_POSITION_PAD("Pad");
+static LLFastTimer::DeclareTimer FTM_FACE_TEX_DEFAULT("Default");
+static LLFastTimer::DeclareTimer FTM_FACE_TEX_QUICK("Quick");
+static LLFastTimer::DeclareTimer FTM_FACE_TEX_QUICK_NO_XFORM("No Xform");
+static LLFastTimer::DeclareTimer FTM_FACE_TEX_QUICK_XFORM("Xform");
+
+static LLFastTimer::DeclareTimer FTM_FACE_TEX_QUICK_PLANAR("Quick Planar");
BOOL LLFace::getGeometryVolume(const LLVolume& volume,
const S32 &f,
@@ -1071,7 +1126,14 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,
S32 num_vertices = (S32)vf.mNumVertices;
S32 num_indices = (S32) vf.mNumIndices;
- bool map_range = gGLManager.mHasMapBufferRange || gGLManager.mHasFlushBufferRange;
+ if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_OCTREE))
+ {
+ updateRebuildFlags();
+ }
+
+
+ //don't use map range (generates many redundant unmap calls)
+ bool map_range = false; //gGLManager.mHasMapBufferRange || gGLManager.mHasFlushBufferRange;
if (mVertexBuffer.notNull())
{
@@ -1097,16 +1159,12 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,
}
LLStrider<LLVector3> vert;
- LLVector4a* vertices = NULL;
LLStrider<LLVector2> tex_coords;
LLStrider<LLVector2> tex_coords2;
- LLVector4a* normals = NULL;
LLStrider<LLVector3> norm;
LLStrider<LLColor4U> colors;
- LLVector4a* binormals = NULL;
LLStrider<LLVector3> binorm;
LLStrider<U16> indicesp;
- LLVector4a* weights = NULL;
LLStrider<LLVector4> wght;
BOOL full_rebuild = force_rebuild || mDrawablep->isState(LLDrawable::REBUILD_VOLUME);
@@ -1124,6 +1182,7 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,
bool rebuild_pos = full_rebuild || mDrawablep->isState(LLDrawable::REBUILD_POSITION);
bool rebuild_color = full_rebuild || mDrawablep->isState(LLDrawable::REBUILD_COLOR);
+ bool rebuild_emissive = rebuild_color && mVertexBuffer->hasDataType(LLVertexBuffer::TYPE_EMISSIVE);
bool rebuild_tcoord = full_rebuild || mDrawablep->isState(LLDrawable::REBUILD_TCOORD);
bool rebuild_normal = rebuild_pos && mVertexBuffer->hasDataType(LLVertexBuffer::TYPE_NORMAL);
bool rebuild_binormal = rebuild_pos && mVertexBuffer->hasDataType(LLVertexBuffer::TYPE_BINORMAL);
@@ -1194,7 +1253,7 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,
LLFastTimer t(FTM_FACE_GEOM_INDEX);
mVertexBuffer->getIndexStrider(indicesp, mIndicesIndex, mIndicesCount, map_range);
- __m128i* dst = (__m128i*) indicesp.get();
+ volatile __m128i* dst = (__m128i*) indicesp.get();
__m128i* src = (__m128i*) vf.mIndices;
__m128i offset = _mm_set1_epi16(index_offset);
@@ -1203,17 +1262,22 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,
for (S32 i = 0; i < end; i++)
{
__m128i res = _mm_add_epi16(src[i], offset);
- _mm_storeu_si128(dst+i, res);
+ _mm_storeu_si128((__m128i*) dst++, res);
}
- for (S32 i = end*8; i < num_indices; ++i)
{
- indicesp[i] = vf.mIndices[i]+index_offset;
+ LLFastTimer t(FTM_FACE_GEOM_INDEX_TAIL);
+ U16* idx = (U16*) dst;
+
+ for (S32 i = end*8; i < num_indices; ++i)
+ {
+ *idx++ = vf.mIndices[i]+index_offset;
+ }
}
if (map_range)
{
- mVertexBuffer->setBuffer(0);
+ mVertexBuffer->flush();
}
}
@@ -1365,19 +1429,48 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,
if (texgen != LLTextureEntry::TEX_GEN_PLANAR)
{
+ LLFastTimer t(FTM_FACE_TEX_QUICK);
if (!do_tex_mat)
{
if (!do_xform)
{
+ LLFastTimer t(FTM_FACE_TEX_QUICK_NO_XFORM);
LLVector4a::memcpyNonAliased16((F32*) tex_coords.get(), (F32*) vf.mTexCoords, num_vertices*2*sizeof(F32));
}
else
{
- for (S32 i = 0; i < num_vertices; i++)
+ LLFastTimer t(FTM_FACE_TEX_QUICK_XFORM);
+ F32* dst = (F32*) tex_coords.get();
+ LLVector4a* src = (LLVector4a*) vf.mTexCoords;
+
+ LLVector4a trans;
+ trans.splat(-0.5f);
+
+ LLVector4a rot0;
+ rot0.set(cos_ang, -sin_ang, cos_ang, -sin_ang);
+
+ LLVector4a rot1;
+ rot1.set(sin_ang, cos_ang, sin_ang, cos_ang);
+
+ LLVector4a scale;
+ scale.set(ms, mt, ms, mt);
+
+ LLVector4a offset;
+ offset.set(os+0.5f, ot+0.5f, os+0.5f, ot+0.5f);
+
+ LLVector4Logical mask;
+ mask.clear();
+ mask.setElement<2>();
+ mask.setElement<3>();
+
+ U32 count = num_vertices/2 + num_vertices%2;
+
+ for (S32 i = 0; i < count; i++)
{
- LLVector2 tc(vf.mTexCoords[i]);
- xform(tc, cos_ang, sin_ang, os, ot, ms, mt);
- *tex_coords++ = tc;
+ LLVector4a res = *src++;
+ xform4a(res, trans, mask, rot0, rot1, offset, scale);
+ res.store4a(dst);
+ dst += 4;
}
}
}
@@ -1399,6 +1492,7 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,
}
else
{ //no bump, no atlas, tex gen planar
+ LLFastTimer t(FTM_FACE_TEX_QUICK_PLANAR);
if (do_tex_mat)
{
for (S32 i = 0; i < num_vertices; i++)
@@ -1438,11 +1532,12 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,
if (map_range)
{
- mVertexBuffer->setBuffer(0);
+ mVertexBuffer->flush();
}
}
else
{ //either bump mapped or in atlas, just do the whole expensive loop
+ LLFastTimer t(FTM_FACE_TEX_DEFAULT);
mVertexBuffer->getTexCoord0Strider(tex_coords, mGeomIndex, mGeomCount, map_range);
std::vector<LLVector2> bump_tc;
@@ -1585,7 +1680,7 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,
if (map_range)
{
- mVertexBuffer->setBuffer(0);
+ mVertexBuffer->flush();
}
if (do_bump)
@@ -1622,7 +1717,7 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,
if (map_range)
{
- mVertexBuffer->setBuffer(0);
+ mVertexBuffer->flush();
}
}
}
@@ -1634,45 +1729,58 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,
llassert(num_vertices > 0);
mVertexBuffer->getVertexStrider(vert, mGeomIndex, mGeomCount, map_range);
- vertices = (LLVector4a*) vert.get();
-
+
+
LLMatrix4a mat_vert;
mat_vert.loadu(mat_vert_in);
LLVector4a* src = vf.mPositions;
- LLVector4a* dst = vertices;
+ volatile F32* dst = (volatile F32*) vert.get();
- LLVector4a* end = dst+num_vertices;
- do
- {
- mat_vert.affineTransform(*src++, *dst++);
- }
- while(dst < end);
+ volatile F32* end = dst+num_vertices*4;
+ LLVector4a res;
+
+ LLVector4a texIdx;
F32 index = (F32) (mTextureIndex < 255 ? mTextureIndex : 0);
- F32 *index_dst = (F32*) vertices;
- F32 *index_end = (F32*) end;
+ llassert(index <= LLGLSLShader::sIndexedTextureChannels-1);
+
+ LLVector4Logical mask;
+ mask.clear();
+ mask.setElement<3>();
+
+ texIdx.set(0,0,0,index);
- index_dst += 3;
- index_end += 3;
- do
{
- *index_dst = index;
- index_dst += 4;
+ LLFastTimer t(FTM_FACE_POSITION_STORE);
+ LLVector4a tmp;
+
+ do
+ {
+ mat_vert.affineTransform(*src++, res);
+ tmp.setSelectWithMask(mask, texIdx, res);
+ tmp.store4a((F32*) dst);
+ dst += 4;
+ }
+ while(dst < end);
}
- while (index_dst < index_end);
-
- S32 aligned_pad_vertices = mGeomCount - num_vertices;
- LLVector4a* last_vec = end - 1;
- while (aligned_pad_vertices > 0)
+
{
- --aligned_pad_vertices;
- *dst++ = *last_vec;
+ LLFastTimer t(FTM_FACE_POSITION_PAD);
+ S32 aligned_pad_vertices = mGeomCount - num_vertices;
+ res.set(res[0], res[1], res[2], 0.f);
+
+ while (aligned_pad_vertices > 0)
+ {
+ --aligned_pad_vertices;
+ res.store4a((F32*) dst);
+ dst += 4;
+ }
}
-
+
if (map_range)
{
- mVertexBuffer->setBuffer(0);
+ mVertexBuffer->flush();
}
}
@@ -1680,19 +1788,20 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,
{
LLFastTimer t(FTM_FACE_GEOM_NORMAL);
mVertexBuffer->getNormalStrider(norm, mGeomIndex, mGeomCount, map_range);
- normals = (LLVector4a*) norm.get();
+ F32* normals = (F32*) norm.get();
for (S32 i = 0; i < num_vertices; i++)
{
LLVector4a normal;
mat_normal.rotate(vf.mNormals[i], normal);
normal.normalize3fast();
- normals[i] = normal;
+ normal.store4a(normals);
+ normals += 4;
}
if (map_range)
{
- mVertexBuffer->setBuffer(0);
+ mVertexBuffer->flush();
}
}
@@ -1700,19 +1809,20 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,
{
LLFastTimer t(FTM_FACE_GEOM_BINORMAL);
mVertexBuffer->getBinormalStrider(binorm, mGeomIndex, mGeomCount, map_range);
- binormals = (LLVector4a*) binorm.get();
+ F32* binormals = (F32*) binorm.get();
for (S32 i = 0; i < num_vertices; i++)
{
LLVector4a binormal;
mat_normal.rotate(vf.mBinormals[i], binormal);
binormal.normalize3fast();
- binormals[i] = binormal;
+ binormal.store4a(binormals);
+ binormals += 4;
}
if (map_range)
{
- mVertexBuffer->setBuffer(0);
+ mVertexBuffer->flush();
}
}
@@ -1720,11 +1830,11 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,
{
LLFastTimer t(FTM_FACE_GEOM_WEIGHTS);
mVertexBuffer->getWeight4Strider(wght, mGeomIndex, mGeomCount, map_range);
- weights = (LLVector4a*) wght.get();
- LLVector4a::memcpyNonAliased16((F32*) weights, (F32*) vf.mWeights, num_vertices*4*sizeof(F32));
+ F32* weights = (F32*) wght.get();
+ LLVector4a::memcpyNonAliased16(weights, (F32*) vf.mWeights, num_vertices*4*sizeof(F32));
if (map_range)
{
- mVertexBuffer->setBuffer(0);
+ mVertexBuffer->flush();
}
}
@@ -1740,7 +1850,7 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,
src.loadua((F32*) vec);
- LLVector4a* dst = (LLVector4a*) colors.get();
+ F32* dst = (F32*) colors.get();
S32 num_vecs = num_vertices/4;
if (num_vertices%4 > 0)
{
@@ -1749,15 +1859,55 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,
for (S32 i = 0; i < num_vecs; i++)
{
- dst[i] = src;
+ src.store4a(dst);
+ dst += 4;
}
if (map_range)
{
- mVertexBuffer->setBuffer(0);
+ mVertexBuffer->flush();
}
}
+ if (rebuild_emissive)
+ {
+ LLFastTimer t(FTM_FACE_GEOM_EMISSIVE);
+ LLStrider<LLColor4U> emissive;
+ mVertexBuffer->getEmissiveStrider(emissive, mGeomIndex, mGeomCount, map_range);
+
+ U8 glow = (U8) llclamp((S32) (getTextureEntry()->getGlow()*255), 0, 255);
+
+ LLVector4a src;
+
+
+ U32 glow32 = glow |
+ (glow << 8) |
+ (glow << 16) |
+ (glow << 24);
+
+ U32 vec[4];
+ vec[0] = vec[1] = vec[2] = vec[3] = glow32;
+
+ src.loadua((F32*) vec);
+
+ F32* dst = (F32*) emissive.get();
+ S32 num_vecs = num_vertices/4;
+ if (num_vertices%4 > 0)
+ {
+ ++num_vecs;
+ }
+
+ for (S32 i = 0; i < num_vecs; i++)
+ {
+ src.store4a(dst);
+ dst += 4;
+ }
+
+ if (map_range)
+ {
+ mVertexBuffer->flush();
+ }
+ }
if (rebuild_tcoord)
{
mTexExtents[0].setVec(0,0);
@@ -1773,6 +1923,7 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,
mTexExtents[1][1] *= et ;
}
+
mLastVertexBuffer = mVertexBuffer;
mLastGeomCount = mGeomCount;
mLastGeomIndex = mGeomIndex;
@@ -2014,7 +2165,7 @@ BOOL LLFace::verify(const U32* indices_array) const
}
// First, check whether the face data fits within the pool's range.
- if ((mGeomIndex + mGeomCount) > mVertexBuffer->getRequestedVerts())
+ if ((mGeomIndex + mGeomCount) > mVertexBuffer->getNumVerts())
{
ok = FALSE;
llinfos << "Face references invalid vertices!" << llendl;
@@ -2033,7 +2184,7 @@ BOOL LLFace::verify(const U32* indices_array) const
llinfos << "Face has bogus indices count" << llendl;
}
- if (mIndicesIndex + mIndicesCount > mVertexBuffer->getRequestedIndices())
+ if (mIndicesIndex + mIndicesCount > mVertexBuffer->getNumIndices())
{
ok = FALSE;
llinfos << "Face references invalid indices!" << llendl;
@@ -2095,7 +2246,7 @@ void LLFace::renderSetColor() const
{
const LLColor4* color = &(getRenderColor());
- glColor4fv(color->mV);
+ gGL.diffuseColor4fv(color->mV);
}
}
@@ -2130,10 +2281,10 @@ S32 LLFace::renderElements(const U16 *index_array) const
}
else
{
- glPushMatrix();
- glMultMatrixf((float*)getRenderMatrix().mMatrix);
+ gGL.pushMatrix();
+ gGL.multMatrix((float*)getRenderMatrix().mMatrix);
ret = pushVertices(index_array);
- glPopMatrix();
+ gGL.popMatrix();
}
return ret;
diff --git a/indra/newview/llface.h b/indra/newview/llface.h
index b5eaeecd60..82e4ab61b7 100644
--- a/indra/newview/llface.h
+++ b/indra/newview/llface.h
@@ -329,13 +329,9 @@ public:
{
return lhs->getTexture() < rhs->getTexture();
}
- else if (lte->getBumpShinyFullbright() != rte->getBumpShinyFullbright())
- {
- return lte->getBumpShinyFullbright() < rte->getBumpShinyFullbright();
- }
else
{
- return lte->getGlow() < rte->getGlow();
+ return lte->getBumpShinyFullbright() < rte->getBumpShinyFullbright();
}
}
};
diff --git a/indra/newview/llfasttimerview.cpp b/indra/newview/llfasttimerview.cpp
index a161428c2b..233038daba 100644
--- a/indra/newview/llfasttimerview.cpp
+++ b/indra/newview/llfasttimerview.cpp
@@ -105,6 +105,7 @@ void LLFastTimerView::onPause()
if (!LLFastTimer::sPauseHistory)
{
mScrollIndex = 0;
+ LLFastTimer::sResetHistory = true;
getChild<LLButton>("pause_btn")->setLabel(getString("pause"));
}
else
@@ -591,6 +592,7 @@ void LLFastTimerView::draw()
{
mAvgCountTotal = ticks;
mMaxCountTotal = ticks;
+ LLFastTimer::sResetHistory = false;
}
}
@@ -1125,10 +1127,10 @@ void LLFastTimerView::exportCharts(const std::string& base, const std::string& t
LLPointer<LLImageRaw> scratch = new LLImageRaw(1024, 512, 3);
gGL.pushMatrix();
- glLoadIdentity();
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- glOrtho(-0.05, 1.05, -0.05, 1.05, -1.0, 1.0);
+ gGL.loadIdentity();
+ gGL.matrixMode(LLRender::MM_PROJECTION);
+ gGL.loadIdentity();
+ gGL.ortho(-0.05f, 1.05f, -0.05f, 1.05f, -1.0f, 1.0f);
//render charts
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
@@ -1367,7 +1369,7 @@ void LLFastTimerView::exportCharts(const std::string& base, const std::string& t
buffer.flush();
gGL.popMatrix();
- glMatrixMode(GL_MODELVIEW);
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
gGL.popMatrix();
}
diff --git a/indra/newview/llfavoritesbar.cpp b/indra/newview/llfavoritesbar.cpp
index 0b17d64eb0..f4b6dc2c81 100644
--- a/indra/newview/llfavoritesbar.cpp
+++ b/indra/newview/llfavoritesbar.cpp
@@ -31,6 +31,7 @@
#include "llfocusmgr.h"
#include "llinventory.h"
#include "lllandmarkactions.h"
+#include "lltoolbarview.h"
#include "lltrans.h"
#include "lluictrlfactory.h"
#include "llmenugl.h"
@@ -41,10 +42,10 @@
#include "llinventoryclipboard.h"
#include "llinventorybridge.h"
#include "llinventoryfunctions.h"
+#include "llfloatersidepanelcontainer.h"
#include "llfloaterworldmap.h"
#include "lllandmarkactions.h"
#include "llnotificationsutil.h"
-#include "llsidetray.h"
#include "lltoggleablemenu.h"
#include "llviewerinventory.h"
#include "llviewermenu.h"
@@ -54,6 +55,7 @@
static LLDefaultChildRegistry::Register<LLFavoritesBarCtrl> r("favorites_bar");
const S32 DROP_DOWN_MENU_WIDTH = 250;
+const S32 DROP_DOWN_MENU_TOP_PAD = 13;
/**
* Helper for LLFavoriteLandmarkButton and LLFavoriteLandmarkMenuItem.
@@ -360,7 +362,7 @@ struct LLFavoritesSort
LLFavoritesBarCtrl::Params::Params()
: image_drag_indication("image_drag_indication"),
- chevron_button("chevron_button"),
+ more_button("more_button"),
label("label")
{
}
@@ -389,10 +391,10 @@ LLFavoritesBarCtrl::LLFavoritesBarCtrl(const LLFavoritesBarCtrl::Params& p)
gInventory.addObserver(this);
//make chevron button
- LLButton::Params chevron_button_params(p.chevron_button);
- chevron_button_params.click_callback.function(boost::bind(&LLFavoritesBarCtrl::showDropDownMenu, this));
- mChevronButton = LLUICtrlFactory::create<LLButton> (chevron_button_params);
- addChild(mChevronButton);
+ LLTextBox::Params more_button_params(p.more_button);
+ mMoreTextBox = LLUICtrlFactory::create<LLTextBox> (more_button_params);
+ mMoreTextBox->setClickedCallback(boost::bind(&LLFavoritesBarCtrl::showDropDownMenu, this));
+ addChild(mMoreTextBox);
LLTextBox::Params label_param(p.label);
mBarLabel = LLUICtrlFactory::create<LLTextBox> (label_param);
@@ -403,8 +405,8 @@ LLFavoritesBarCtrl::~LLFavoritesBarCtrl()
{
gInventory.removeObserver(this);
- LLView::deleteViewByHandle(mOverflowMenuHandle);
- LLView::deleteViewByHandle(mContextMenuHandle);
+ if (mOverflowMenuHandle.get()) mOverflowMenuHandle.get()->die();
+ if (mContextMenuHandle.get()) mContextMenuHandle.get()->die();
}
BOOL LLFavoritesBarCtrl::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
@@ -441,17 +443,17 @@ BOOL LLFavoritesBarCtrl::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
{
setLandingTab(dest);
}
- /*
- * the condition dest == NULL can be satisfied not only in the case
- * of dragging to the right from the last tab of the favbar. there is a
- * small gap between each tab. if the user drags something exactly there
- * then mLandingTab will be set to NULL and the dragged item will be pushed
- * to the end of the favorites bar. this is incorrect behavior. that's why
- * we need an additional check which excludes the case described previously
- * making sure that the mouse pointer is beyond the last tab.
- */
- else if (mLastTab && x >= mLastTab->getRect().mRight)
+ else if (mLastTab && (x >= mLastTab->getRect().mRight))
{
+ /*
+ * the condition dest == NULL can be satisfied not only in the case
+ * of dragging to the right from the last tab of the favbar. there is a
+ * small gap between each tab. if the user drags something exactly there
+ * then mLandingTab will be set to NULL and the dragged item will be pushed
+ * to the end of the favorites bar. this is incorrect behavior. that's why
+ * we need an additional check which excludes the case described previously
+ * making sure that the mouse pointer is beyond the last tab.
+ */
setLandingTab(NULL);
}
@@ -465,7 +467,6 @@ BOOL LLFavoritesBarCtrl::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
if (drop)
{
handleExistingFavoriteDragAndDrop(x, y);
- showDragMarker(FALSE);
}
}
else
@@ -488,7 +489,6 @@ BOOL LLFavoritesBarCtrl::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
setLandingTab(NULL);
}
handleNewFavoriteDragAndDrop(item, favorites_id, x, y);
- showDragMarker(FALSE);
}
}
}
@@ -502,20 +502,29 @@ BOOL LLFavoritesBarCtrl::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
void LLFavoritesBarCtrl::handleExistingFavoriteDragAndDrop(S32 x, S32 y)
{
+ // Identify the button hovered and the side to drop
LLFavoriteLandmarkButton* dest = dynamic_cast<LLFavoriteLandmarkButton*>(mLandingTab);
+ bool insert_before = true;
+ if (!dest)
+ {
+ insert_before = false;
+ dest = dynamic_cast<LLFavoriteLandmarkButton*>(mLastTab);
+ }
- // there is no need to handle if an item was dragged onto itself
+ // There is no need to handle if an item was dragged onto itself
if (dest && dest->getLandmarkId() == mDragItemId)
{
return;
}
+ // Insert the dragged item in the right place
if (dest)
{
- LLInventoryModel::updateItemsOrder(mItems, mDragItemId, dest->getLandmarkId());
+ LLInventoryModel::updateItemsOrder(mItems, mDragItemId, dest->getLandmarkId(), insert_before);
}
else
{
+ // This can happen when the item list is empty
mItems.push_back(gInventory.getItem(mDragItemId));
}
@@ -532,22 +541,35 @@ void LLFavoritesBarCtrl::handleExistingFavoriteDragAndDrop(S32 x, S32 y)
void LLFavoritesBarCtrl::handleNewFavoriteDragAndDrop(LLInventoryItem *item, const LLUUID& favorites_id, S32 x, S32 y)
{
- LLFavoriteLandmarkButton* dest = dynamic_cast<LLFavoriteLandmarkButton*>(mLandingTab);
-
- // there is no need to handle if an item was dragged onto itself
+ // Identify the button hovered and the side to drop
+ LLFavoriteLandmarkButton* dest = NULL;
+ bool insert_before = true;
+ if (!mItems.empty())
+ {
+ dest = dynamic_cast<LLFavoriteLandmarkButton*>(mLandingTab);
+ if (!dest)
+ {
+ insert_before = false;
+ dest = dynamic_cast<LLFavoriteLandmarkButton*>(mLastTab);
+ }
+ }
+
+ // There is no need to handle if an item was dragged onto itself
if (dest && dest->getLandmarkId() == mDragItemId)
{
return;
}
-
+
LLPointer<LLViewerInventoryItem> viewer_item = new LLViewerInventoryItem(item);
+ // Insert the dragged item in the right place
if (dest)
{
- insertBeforeItem(mItems, dest->getLandmarkId(), viewer_item);
+ insertItem(mItems, dest->getLandmarkId(), viewer_item, insert_before);
}
else
{
+ // This can happen when the item list is empty
mItems.push_back(viewer_item);
}
@@ -577,7 +599,11 @@ void LLFavoritesBarCtrl::handleNewFavoriteDragAndDrop(LLInventoryItem *item, con
if (tool_dad->getSource() == LLToolDragAndDrop::SOURCE_NOTECARD)
{
viewer_item->setType(LLAssetType::AT_LANDMARK);
- copy_inventory_from_notecard(tool_dad->getObjectID(), tool_dad->getSourceID(), viewer_item.get(), gInventoryCallbacks.registerCB(cb));
+ copy_inventory_from_notecard(favorites_id,
+ tool_dad->getObjectID(),
+ tool_dad->getSourceID(),
+ viewer_item.get(),
+ gInventoryCallbacks.registerCB(cb));
}
else
{
@@ -640,7 +666,7 @@ void LLFavoritesBarCtrl::draw()
{
// mouse pointer hovers over an existing tab
LLRect rect = mLandingTab->getRect();
- mImageDragIndication->draw(rect.mLeft - w/2, rect.getHeight(), w, h);
+ mImageDragIndication->draw(rect.mLeft, rect.getHeight(), w, h);
}
else if (mLastTab)
{
@@ -648,6 +674,8 @@ void LLFavoritesBarCtrl::draw()
LLRect rect = mLastTab->getRect();
mImageDragIndication->draw(rect.mRight, rect.getHeight(), w, h);
}
+ // Once drawn, mark this false so we won't draw it again (unless we hit the favorite bar again)
+ mShowDragMarker = FALSE;
}
}
@@ -692,7 +720,7 @@ void LLFavoritesBarCtrl::updateButtons()
const child_list_t* childs = getChildList();
child_list_const_iter_t child_it = childs->begin();
int first_changed_item_index = 0;
- int rightest_point = getRect().mRight - mChevronButton->getRect().getWidth();
+ int rightest_point = getRect().mRight - mMoreTextBox->getRect().getWidth();
//lets find first changed button
while (child_it != childs->end() && first_changed_item_index < mItems.count())
{
@@ -719,7 +747,7 @@ void LLFavoritesBarCtrl::updateButtons()
if (first_changed_item_index <= mItems.count())
{
// Rebuild the buttons only
- // child_list_t is a linked list, so safe to erase from the middle if we pre-incrament the iterator
+ // child_list_t is a linked list, so safe to erase from the middle if we pre-increment the iterator
while (child_it != childs->end())
{
@@ -735,9 +763,9 @@ void LLFavoritesBarCtrl::updateButtons()
}
// we have to remove ChevronButton to make sure that the last item will be LandmarkButton to get the right aligning
// keep in mind that we are cutting all buttons in space between the last visible child of favbar and ChevronButton
- if (mChevronButton->getParent() == this)
+ if (mMoreTextBox->getParent() == this)
{
- removeChild(mChevronButton);
+ removeChild(mMoreTextBox);
}
int last_right_edge = 0;
//calculate new buttons offset
@@ -777,13 +805,13 @@ void LLFavoritesBarCtrl::updateButtons()
S32 buttonHGap = button_params.rect.left; // default value
LLRect rect;
// Chevron button should stay right aligned
- rect.setOriginAndSize(getRect().mRight - mChevronButton->getRect().getWidth() - buttonHGap, 0,
- mChevronButton->getRect().getWidth(),
- mChevronButton->getRect().getHeight());
+ rect.setOriginAndSize(getRect().mRight - mMoreTextBox->getRect().getWidth() - buttonHGap, 0,
+ mMoreTextBox->getRect().getWidth(),
+ mMoreTextBox->getRect().getHeight());
- addChild(mChevronButton);
- mChevronButton->setRect(rect);
- mChevronButton->setVisible(TRUE);
+ addChild(mMoreTextBox);
+ mMoreTextBox->setRect(rect);
+ mMoreTextBox->setVisible(TRUE);
}
// Update overflow menu
LLToggleableMenu* overflow_menu = static_cast <LLToggleableMenu*> (mOverflowMenuHandle.get());
@@ -808,16 +836,16 @@ LLButton* LLFavoritesBarCtrl::createButton(const LLPointer<LLViewerInventoryItem
/**
* WORKAROUND:
- * there are some problem with displaying of fonts in buttons.
- * Empty space (or ...) is displaying instead of last symbols, even though the width of the button is enough.
- * Problem will gone, if we stretch out the button. For that reason I have to put additional 20 pixels.
+ * There are some problem with displaying of fonts in buttons.
+ * Empty space or ellipsis might be displayed instead of last symbols, even though the width of the button is enough.
+ * The problem disappears if we pad the button with 20 pixels.
*/
int required_width = mFont->getWidth(item->getName()) + 20;
int width = required_width > def_button_width? def_button_width : required_width;
LLFavoriteLandmarkButton* fav_btn = NULL;
- // do we have a place for next button + double buttonHGap + mChevronButton ?
- if(curr_x + width + 2*button_x_delta + mChevronButton->getRect().getWidth() > getRect().mRight )
+ // do we have a place for next button + double buttonHGap + mMoreTextBox ?
+ if(curr_x + width + 2*button_x_delta + mMoreTextBox->getRect().getWidth() > getRect().mRight )
{
return NULL;
}
@@ -838,7 +866,6 @@ LLButton* LLFavoritesBarCtrl::createButton(const LLPointer<LLViewerInventoryItem
fav_btn->setRect(butt_rect);
// change only left and save bottom
fav_btn->setFont(mFont);
- fav_btn->setName(item->getName());
fav_btn->setLabel(item->getName());
fav_btn->setToolTip(item->getName());
fav_btn->setCommitCallback(boost::bind(&LLFavoritesBarCtrl::onButtonClick, this, item->getUUID()));
@@ -893,84 +920,157 @@ void LLFavoritesBarCtrl::showDropDownMenu()
{
if (mOverflowMenuHandle.isDead())
{
- LLToggleableMenu::Params menu_p;
- menu_p.name("favorites menu");
- menu_p.can_tear_off(false);
- menu_p.visible(false);
- menu_p.scrollable(true);
- menu_p.max_scrollable_items = 10;
- menu_p.preferred_width = DROP_DOWN_MENU_WIDTH;
-
- LLToggleableMenu* menu = LLUICtrlFactory::create<LLFavoriteLandmarkToggleableMenu>(menu_p);
- mOverflowMenuHandle = menu->getHandle();
+ createOverflowMenu();
}
LLToggleableMenu* menu = (LLToggleableMenu*)mOverflowMenuHandle.get();
+ if (menu && menu->toggleVisibility())
+ {
+ if (mUpdateDropDownItems)
+ {
+ updateMenuItems(menu);
+ }
- if (menu)
+ menu->buildDrawLabels();
+ menu->updateParent(LLMenuGL::sMenuContainer);
+ menu->setButtonRect(mMoreTextBox->getRect(), this);
+ positionAndShowMenu(menu);
+ }
+}
+
+void LLFavoritesBarCtrl::createOverflowMenu()
+{
+ LLToggleableMenu::Params menu_p;
+ menu_p.name("favorites menu");
+ menu_p.can_tear_off(false);
+ menu_p.visible(false);
+ menu_p.scrollable(true);
+ menu_p.max_scrollable_items = 10;
+ menu_p.preferred_width = DROP_DOWN_MENU_WIDTH;
+
+ LLToggleableMenu* menu = LLUICtrlFactory::create<LLFavoriteLandmarkToggleableMenu>(menu_p);
+ mOverflowMenuHandle = menu->getHandle();
+}
+
+void LLFavoritesBarCtrl::updateMenuItems(LLToggleableMenu* menu)
+{
+ menu->empty();
+
+ U32 widest_item = 0;
+
+ for (S32 i = mFirstDropDownItem; i < mItems.count(); i++)
{
- if (!menu->toggleVisibility())
- return;
+ LLViewerInventoryItem* item = mItems.get(i);
+ const std::string& item_name = item->getName();
- U32 max_width = llmin(DROP_DOWN_MENU_WIDTH, getRect().getWidth());
- if (mUpdateDropDownItems)
+ LLFavoriteLandmarkMenuItem::Params item_params;
+ item_params.name(item_name);
+ item_params.label(item_name);
+ item_params.on_click.function(boost::bind(&LLFavoritesBarCtrl::onButtonClick, this, item->getUUID()));
+
+ LLFavoriteLandmarkMenuItem *menu_item = LLUICtrlFactory::create<LLFavoriteLandmarkMenuItem>(item_params);
+ menu_item->initFavoritesBarPointer(this);
+ menu_item->setRightMouseDownCallback(boost::bind(&LLFavoritesBarCtrl::onButtonRightClick, this, item->getUUID(), _1, _2, _3, _4));
+ menu_item->LLUICtrl::setMouseDownCallback(boost::bind(&LLFavoritesBarCtrl::onButtonMouseDown, this, item->getUUID(), _1, _2, _3, _4));
+ menu_item->LLUICtrl::setMouseUpCallback(boost::bind(&LLFavoritesBarCtrl::onButtonMouseUp, this, item->getUUID(), _1, _2, _3, _4));
+ menu_item->setLandmarkID(item->getUUID());
+
+ fitLabelWidth(menu_item);
+
+ widest_item = llmax(widest_item, menu_item->getNominalWidth());
+
+ menu->addChild(menu_item);
+ }
+
+ addOpenLandmarksMenuItem(menu);
+ mUpdateDropDownItems = false;
+}
+
+void LLFavoritesBarCtrl::fitLabelWidth(LLMenuItemCallGL* menu_item)
+{
+ U32 max_width = llmin(DROP_DOWN_MENU_WIDTH, getRect().getWidth());
+ std::string item_name = menu_item->getName();
+
+ // Check whether item name wider than menu
+ if (menu_item->getNominalWidth() > max_width)
+ {
+ S32 chars_total = item_name.length();
+ S32 chars_fitted = 1;
+ menu_item->setLabel(LLStringExplicit(""));
+ S32 label_space = max_width - menu_item->getFont()->getWidth("...") -
+ menu_item->getNominalWidth();// This returns width of menu item with empty label (pad pixels)
+
+ while (chars_fitted < chars_total
+ && menu_item->getFont()->getWidth(item_name, 0, chars_fitted) < label_space)
{
- menu->empty();
+ chars_fitted++;
+ }
+ chars_fitted--; // Rolling back one char, that doesn't fit
- U32 widest_item = 0;
+ menu_item->setLabel(item_name.substr(0, chars_fitted) + "...");
+ }
+}
- for (S32 i = mFirstDropDownItem; i < mItems.count(); i++)
- {
- LLViewerInventoryItem* item = mItems.get(i);
- const std::string& item_name = item->getName();
-
- LLFavoriteLandmarkMenuItem::Params item_params;
- item_params.name(item_name);
- item_params.label(item_name);
-
- item_params.on_click.function(boost::bind(
- &LLFavoritesBarCtrl::onButtonClick, this,
- item->getUUID()));
- LLFavoriteLandmarkMenuItem *menu_item = LLUICtrlFactory::create<LLFavoriteLandmarkMenuItem>(item_params);
- menu_item->initFavoritesBarPointer(this);
- menu_item->setRightMouseDownCallback(boost::bind(&LLFavoritesBarCtrl::onButtonRightClick, this, item->getUUID(), _1, _2, _3, _4));
- menu_item->LLUICtrl::setMouseDownCallback(boost::bind(&LLFavoritesBarCtrl::onButtonMouseDown, this, item->getUUID(), _1, _2, _3, _4));
- menu_item->LLUICtrl::setMouseUpCallback(boost::bind(&LLFavoritesBarCtrl::onButtonMouseUp, this, item->getUUID(), _1, _2, _3, _4));
- menu_item->setLandmarkID(item->getUUID());
-
- // Check whether item name wider than menu
- if (menu_item->getNominalWidth() > max_width)
- {
- S32 chars_total = item_name.length();
- S32 chars_fitted = 1;
- menu_item->setLabel(LLStringExplicit(""));
- S32 label_space = max_width - menu_item->getFont()->getWidth("...") -
- menu_item->getNominalWidth();// This returns width of menu item with empty label (pad pixels)
-
- while (chars_fitted < chars_total
- && menu_item->getFont()->getWidth(item_name, 0, chars_fitted) < label_space)
- {
- chars_fitted++;
- }
- chars_fitted--; // Rolling back one char, that doesn't fit
+void LLFavoritesBarCtrl::addOpenLandmarksMenuItem(LLToggleableMenu* menu)
+{
+ std::string label_untrans = "Open landmarks";
+ std::string label_transl;
+ bool translated = LLTrans::findString(label_transl, label_untrans);
+
+ LLMenuItemCallGL::Params item_params;
+ item_params.name("open_my_landmarks");
+ item_params.label(translated ? label_transl: label_untrans);
+ LLSD key;
+ key["type"] = "open_landmark_tab";
+ item_params.on_click.function(boost::bind(&LLFloaterSidePanelContainer::showPanel, "places", key));
+ LLMenuItemCallGL* menu_item = LLUICtrlFactory::create<LLMenuItemCallGL>(item_params);
+
+ fitLabelWidth(menu_item);
+
+ LLMenuItemSeparatorGL::Params sep_params;
+ sep_params.enabled_color=LLUIColorTable::instance().getColor("MenuItemEnabledColor");
+ sep_params.disabled_color=LLUIColorTable::instance().getColor("MenuItemDisabledColor");
+ sep_params.highlight_bg_color=LLUIColorTable::instance().getColor("MenuItemHighlightBgColor");
+ sep_params.highlight_fg_color=LLUIColorTable::instance().getColor("MenuItemHighlightFgColor");
+ LLMenuItemSeparatorGL* separator = LLUICtrlFactory::create<LLMenuItemSeparatorGL>(sep_params);
+
+ menu->addChild(separator);
+ menu->addChild(menu_item);
+}
- menu_item->setLabel(item_name.substr(0, chars_fitted)
- + "...");
- }
- widest_item = llmax(widest_item, menu_item->getNominalWidth());
+void LLFavoritesBarCtrl::positionAndShowMenu(LLToggleableMenu* menu)
+{
+ U32 max_width = llmin(DROP_DOWN_MENU_WIDTH, getRect().getWidth());
- menu->addChild(menu_item);
- }
- mUpdateDropDownItems = false;
+ S32 menu_x = getRect().getWidth() - max_width;
+ S32 menu_y = getParent()->getRect().mBottom - DROP_DOWN_MENU_TOP_PAD;
+
+ // the menu should be offset of the right edge of the window
+ // so it's no covered by buttons in the right-side toolbar.
+ LLToolBar* right_toolbar = gToolBarView->getChild<LLToolBar>("toolbar_right");
+ if (right_toolbar && right_toolbar->hasButtons())
+ {
+ S32 toolbar_top = 0;
+
+ if (LLView* top_border_panel = right_toolbar->getChild<LLView>("button_panel"))
+ {
+ toolbar_top = top_border_panel->calcScreenRect().mTop;
}
- menu->buildDrawLabels();
- menu->updateParent(LLMenuGL::sMenuContainer);
+ // Calculating the bottom (in screen coord) of the drop down menu
+ S32 menu_top = getParent()->getRect().mBottom - DROP_DOWN_MENU_TOP_PAD;
+ S32 menu_bottom = menu_top - menu->getRect().getHeight();
+ S32 menu_bottom_screen = 0;
- menu->setButtonRect(mChevronButton->getRect(), this);
+ localPointToScreen(0, menu_bottom, &menu_top, &menu_bottom_screen);
- LLMenuGL::showPopup(this, menu, getRect().getWidth() - max_width, 0);
+ if (menu_bottom_screen < toolbar_top)
+ {
+ menu_x -= right_toolbar->getRect().getWidth();
+ }
}
+
+ LLMenuGL::showPopup(this, menu, menu_x, menu_y);
}
void LLFavoritesBarCtrl::onButtonClick(LLUUID item_id)
@@ -1057,7 +1157,7 @@ void LLFavoritesBarCtrl::doToSelected(const LLSD& userdata)
key["type"] = "landmark";
key["id"] = mSelectedItemID;
- LLSideTray::getInstance()->showPanel("panel_places", key);
+ LLFloaterSidePanelContainer::showPanel("places", key);
}
else if (action == "copy_slurl")
{
@@ -1103,7 +1203,9 @@ void LLFavoritesBarCtrl::doToSelected(const LLSD& userdata)
LLToggleableMenu* menu = (LLToggleableMenu*) mOverflowMenuHandle.get();
if (mRestoreOverflowMenu && menu && !menu->getVisible())
{
+ menu->resetScrollPositionOnShow(false);
showDropDownMenu();
+ menu->resetScrollPositionOnShow(true);
}
}
@@ -1225,25 +1327,24 @@ BOOL LLFavoritesBarCtrl::handleHover(S32 x, S32 y, MASK mask)
LLUICtrl* LLFavoritesBarCtrl::findChildByLocalCoords(S32 x, S32 y)
{
- LLUICtrl* ctrl = 0;
- S32 screenX, screenY;
+ LLUICtrl* ctrl = NULL;
const child_list_t* list = getChildList();
- localPointToScreen(x, y, &screenX, &screenY);
-
- // look for a child which contains the point (screenX, screenY) in it's rectangle
for (child_list_const_iter_t i = list->begin(); i != list->end(); ++i)
{
- LLRect rect;
- localRectToScreen((*i)->getRect(), &rect);
-
- if (rect.pointInRect(screenX, screenY))
+ // Look only for children that are favorite buttons
+ if ((*i)->getName() == "favorites_bar_btn")
{
- ctrl = dynamic_cast<LLUICtrl*>(*i);
- break;
+ LLRect rect = (*i)->getRect();
+ // We consider a button hit if the cursor is left of the right side
+ // This makes the hit a bit less finicky than hitting directly on the button itself
+ if (x <= rect.mRight)
+ {
+ ctrl = dynamic_cast<LLUICtrl*>(*i);
+ break;
+ }
}
}
-
return ctrl;
}
@@ -1264,29 +1365,28 @@ BOOL LLFavoritesBarCtrl::needToSaveItemsOrder(const LLInventoryModel::item_array
return result;
}
-LLInventoryModel::item_array_t::iterator LLFavoritesBarCtrl::findItemByUUID(LLInventoryModel::item_array_t& items, const LLUUID& id)
+void LLFavoritesBarCtrl::insertItem(LLInventoryModel::item_array_t& items, const LLUUID& dest_item_id, LLViewerInventoryItem* insertedItem, bool insert_before)
{
- LLInventoryModel::item_array_t::iterator result = items.end();
+ // Get the iterator to the destination item
+ LLInventoryModel::item_array_t::iterator it_dest = LLInventoryModel::findItemIterByUUID(items, dest_item_id);
+ if (it_dest == items.end())
+ return;
- for (LLInventoryModel::item_array_t::iterator i = items.begin(); i != items.end(); ++i)
+ // Go to the next element if one wishes to insert after the dest element
+ if (!insert_before)
{
- if ((*i)->getUUID() == id)
- {
- result = i;
- break;
- }
+ ++it_dest;
}
-
- return result;
-}
-
-void LLFavoritesBarCtrl::insertBeforeItem(LLInventoryModel::item_array_t& items, const LLUUID& beforeItemId, LLViewerInventoryItem* insertedItem)
-{
- LLViewerInventoryItem* beforeItem = gInventory.getItem(beforeItemId);
- llassert(beforeItem);
- if (beforeItem)
+
+ // Insert the source item in the right place
+ if (it_dest != items.end())
+ {
+ items.insert(it_dest, insertedItem);
+ }
+ else
{
- items.insert(findItemByUUID(items, beforeItem->getUUID()), insertedItem);
+ // Append to the list if it_dest reached the end
+ items.push_back(insertedItem);
}
}
diff --git a/indra/newview/llfavoritesbar.h b/indra/newview/llfavoritesbar.h
index 1a28731c4f..2f75b3bb0e 100644
--- a/indra/newview/llfavoritesbar.h
+++ b/indra/newview/llfavoritesbar.h
@@ -34,13 +34,16 @@
#include "llinventoryobserver.h"
#include "llinventorymodel.h"
+class LLMenuItemCallGL;
+class LLToggleableMenu;
+
class LLFavoritesBarCtrl : public LLUICtrl, public LLInventoryObserver
{
public:
struct Params : public LLInitParam::Block<Params, LLUICtrl::Params>
{
Optional<LLUIImage*> image_drag_indication;
- Optional<LLButton::Params> chevron_button;
+ Optional<LLTextBox::Params> more_button;
Optional<LLTextBox::Params> label;
Params();
};
@@ -127,15 +130,26 @@ private:
* inserts an item identified by insertedItemId BEFORE an item identified by beforeItemId.
* this function assumes that an item identified by insertedItemId doesn't exist in items array.
*/
- void insertBeforeItem(LLInventoryModel::item_array_t& items, const LLUUID& beforeItemId, LLViewerInventoryItem* insertedItem);
+ void insertItem(LLInventoryModel::item_array_t& items, const LLUUID& dest_item_id, LLViewerInventoryItem* insertedItem, bool insert_before);
// finds an item by it's UUID in the items array
LLInventoryModel::item_array_t::iterator findItemByUUID(LLInventoryModel::item_array_t& items, const LLUUID& id);
+ void createOverflowMenu();
+
+ void updateMenuItems(LLToggleableMenu* menu);
+
+ // Fits menu item label width with favorites menu width
+ void fitLabelWidth(LLMenuItemCallGL* menu_item);
+
+ void addOpenLandmarksMenuItem(LLToggleableMenu* menu);
+
+ void positionAndShowMenu(LLToggleableMenu* menu);
+
BOOL mShowDragMarker;
LLUICtrl* mLandingTab;
LLUICtrl* mLastTab;
- LLButton* mChevronButton;
+ LLTextBox* mMoreTextBox;
LLTextBox* mBarLabel;
LLUUID mDragItemId;
diff --git a/indra/newview/llfeaturemanager.cpp b/indra/newview/llfeaturemanager.cpp
index db9a0424c0..08f9d26705 100644
--- a/indra/newview/llfeaturemanager.cpp
+++ b/indra/newview/llfeaturemanager.cpp
@@ -51,6 +51,7 @@
#include "llcontrol.h"
#include "llboost.h"
#include "llweb.h"
+#include "llviewershadermgr.h"
#if LL_WINDOWS
#include "lldxhardware.h"
@@ -662,8 +663,10 @@ void LLFeatureManager::applyFeatures(bool skipFeatures)
void LLFeatureManager::setGraphicsLevel(S32 level, bool skipFeatures)
{
- applyBaseMasks();
+ LLViewerShaderMgr::sSkipReload = true;
+ applyBaseMasks();
+
switch (level)
{
case 0:
@@ -684,6 +687,9 @@ void LLFeatureManager::setGraphicsLevel(S32 level, bool skipFeatures)
}
applyFeatures(skipFeatures);
+
+ LLViewerShaderMgr::sSkipReload = false;
+ LLViewerShaderMgr::instance()->setShaders();
}
void LLFeatureManager::applyBaseMasks()
@@ -725,7 +731,7 @@ void LLFeatureManager::applyBaseMasks()
{
maskFeatures("NoPixelShaders");
}
- if (!gGLManager.mHasVertexShader)
+ if (!gGLManager.mHasVertexShader || !mGPUSupported)
{
maskFeatures("NoVertexShaders");
}
diff --git a/indra/newview/llfilepicker.cpp b/indra/newview/llfilepicker.cpp
index 8c0ed29855..8024755e86 100644
--- a/indra/newview/llfilepicker.cpp
+++ b/indra/newview/llfilepicker.cpp
@@ -58,6 +58,7 @@ LLFilePicker LLFilePicker::sInstance;
#define SLOBJECT_FILTER L"Objects (*.slobject)\0*.slobject\0"
#define RAW_FILTER L"RAW files (*.raw)\0*.raw\0"
#define MODEL_FILTER L"Model files (*.dae)\0*.dae\0"
+#define SCRIPT_FILTER L"Script files (*.lsl)\0*.lsl\0"
#endif
//
@@ -213,6 +214,10 @@ BOOL LLFilePicker::setupFilter(ELoadFilter filter)
mOFN.lpstrFilter = MODEL_FILTER \
L"\0";
break;
+ case FFLOAD_SCRIPT:
+ mOFN.lpstrFilter = SCRIPT_FILTER \
+ L"\0";
+ break;
default:
res = FALSE;
break;
@@ -497,6 +502,14 @@ BOOL LLFilePicker::getSaveFile(ESaveFilter filter, const std::string& filename)
L"Compressed Images (*.j2c)\0*.j2c\0" \
L"\0";
break;
+ case FFSAVE_SCRIPT:
+ if (filename.empty())
+ {
+ wcsncpy( mFilesW,L"untitled.lsl", FILENAME_BUFFER_SIZE);
+ }
+ mOFN.lpstrDefExt = L"txt";
+ mOFN.lpstrFilter = L"LSL Files (*.lsl)\0*.lsl\0" L"\0";
+ break;
default:
return FALSE;
}
@@ -620,6 +633,14 @@ Boolean LLFilePicker::navOpenFilterProc(AEDesc *theItem, void *info, void *callB
result = false;
}
}
+ else if (filter == FFLOAD_SCRIPT)
+ {
+ if (fileInfo.filetype != 'LSL ' &&
+ (fileInfo.extension && (CFStringCompare(fileInfo.extension, CFSTR("lsl"), kCFCompareCaseInsensitive) != kCFCompareEqualTo)) )
+ {
+ result = false;
+ }
+ }
if (fileInfo.extension)
{
@@ -653,12 +674,12 @@ OSStatus LLFilePicker::doNavChooseDialog(ELoadFilter filter)
// (It is destroyed by NavDialogDispose() below.)
error = NavCreateChooseFileDialog(&mNavOptions, NULL, NULL, NULL, navOpenFilterProc, (void*)(&filter), &navRef);
- gViewerWindow->mWindow->beforeDialog();
+ gViewerWindow->getWindow()->beforeDialog();
if (error == noErr)
error = NavDialogRun(navRef);
- gViewerWindow->mWindow->afterDialog();
+ gViewerWindow->getWindow()->afterDialog();
if (error == noErr)
error = NavDialogGetReply(navRef, &navReply);
@@ -766,6 +787,12 @@ OSStatus LLFilePicker::doNavSaveDialog(ESaveFilter filter, const std::string& fi
extension = CFSTR(".j2c");
break;
+ case FFSAVE_SCRIPT:
+ type = 'LSL ';
+ creator = '\?\?\?\?';
+ extension = CFSTR(".lsl");
+ break;
+
case FFSAVE_ALL:
default:
type = '\?\?\?\?';
@@ -808,13 +835,13 @@ OSStatus LLFilePicker::doNavSaveDialog(ESaveFilter filter, const std::string& fi
}
}
- gViewerWindow->mWindow->beforeDialog();
+ gViewerWindow->getWindow()->beforeDialog();
// Run the dialog
if (error == noErr)
error = NavDialogRun(navRef);
- gViewerWindow->mWindow->afterDialog();
+ gViewerWindow->getWindow()->afterDialog();
if (error == noErr)
error = NavDialogGetReply(navRef, &navReply);
@@ -1192,7 +1219,12 @@ static std::string add_imageload_filter_to_gtkchooser(GtkWindow *picker)
add_common_filters_to_gtkchooser(gfilter, picker, filtername);
return filtername;
}
-
+
+static std::string add_script_filter_to_gtkchooser(GtkWindow *picker)
+{
+ return add_simple_mime_filter_to_gtkchooser(picker, "text/plain",
+ LLTrans::getString("script_files") + " (*.lsl)");
+}
BOOL LLFilePicker::getSaveFile( ESaveFilter filter, const std::string& filename )
{
@@ -1204,7 +1236,7 @@ BOOL LLFilePicker::getSaveFile( ESaveFilter filter, const std::string& filename
return FALSE;
}
- gViewerWindow->mWindow->beforeDialog();
+ gViewerWindow->getWindow()->beforeDialog();
reset();
@@ -1258,6 +1290,10 @@ BOOL LLFilePicker::getSaveFile( ESaveFilter filter, const std::string& filename
LLTrans::getString("compressed_image_files") + " (*.j2c)");
suggest_ext = ".j2c";
break;
+ case FFSAVE_SCRIPT:
+ caption += add_script_filter_to_gtkchooser(picker);
+ suggest_ext = ".lsl";
+ break;
default:;
break;
}
@@ -1284,7 +1320,7 @@ BOOL LLFilePicker::getSaveFile( ESaveFilter filter, const std::string& filename
rtn = (getFileCount() == 1);
}
- gViewerWindow->mWindow->afterDialog();
+ gViewerWindow->getWindow()->afterDialog();
return rtn;
}
@@ -1299,7 +1335,7 @@ BOOL LLFilePicker::getOpenFile( ELoadFilter filter, bool blocking )
return FALSE;
}
- gViewerWindow->mWindow->beforeDialog();
+ gViewerWindow->getWindow()->beforeDialog();
reset();
@@ -1323,6 +1359,9 @@ BOOL LLFilePicker::getOpenFile( ELoadFilter filter, bool blocking )
case FFLOAD_IMAGE:
filtername = add_imageload_filter_to_gtkchooser(picker);
break;
+ case FFLOAD_SCRIPT:
+ filtername = add_script_filter_to_gtkchooser(picker);
+ break;
default:;
break;
}
@@ -1337,7 +1376,7 @@ BOOL LLFilePicker::getOpenFile( ELoadFilter filter, bool blocking )
rtn = (getFileCount() == 1);
}
- gViewerWindow->mWindow->afterDialog();
+ gViewerWindow->getWindow()->afterDialog();
return rtn;
}
@@ -1352,7 +1391,7 @@ BOOL LLFilePicker::getMultipleOpenFiles( ELoadFilter filter )
return FALSE;
}
- gViewerWindow->mWindow->beforeDialog();
+ gViewerWindow->getWindow()->beforeDialog();
reset();
@@ -1370,7 +1409,7 @@ BOOL LLFilePicker::getMultipleOpenFiles( ELoadFilter filter )
rtn = !mFiles.empty();
}
- gViewerWindow->mWindow->afterDialog();
+ gViewerWindow->getWindow()->afterDialog();
return rtn;
}
diff --git a/indra/newview/llfilepicker.h b/indra/newview/llfilepicker.h
index cd843a8f33..a4d5d68ff5 100644
--- a/indra/newview/llfilepicker.h
+++ b/indra/newview/llfilepicker.h
@@ -84,6 +84,7 @@ public:
FFLOAD_RAW = 8,
FFLOAD_MODEL = 9,
FFLOAD_COLLADA = 10,
+ FFLOAD_SCRIPT = 11,
};
enum ESaveFilter
@@ -103,6 +104,7 @@ public:
FFSAVE_J2C = 12,
FFSAVE_PNG = 13,
FFSAVE_JPEG = 14,
+ FFSAVE_SCRIPT = 15,
};
// open the dialog. This is a modal operation
diff --git a/indra/newview/llfloaterabout.cpp b/indra/newview/llfloaterabout.cpp
index 849826bb6b..83fb887d81 100644
--- a/indra/newview/llfloaterabout.cpp
+++ b/indra/newview/llfloaterabout.cpp
@@ -70,6 +70,22 @@ extern U32 gPacketsIn;
static std::string get_viewer_release_notes_url();
+///----------------------------------------------------------------------------
+/// Class LLServerReleaseNotesURLFetcher
+///----------------------------------------------------------------------------
+class LLServerReleaseNotesURLFetcher : public LLHTTPClient::Responder
+{
+ LOG_CLASS(LLServerReleaseNotesURLFetcher);
+public:
+
+ static void startFetch();
+ /*virtual*/ void completedHeader(U32 status, const std::string& reason, const LLSD& content);
+ /*virtual*/ void completedRaw(
+ U32 status,
+ const std::string& reason,
+ const LLChannelDescriptors& channels,
+ const LLIOPipe::buffer_ptr_t& buffer);
+};
///----------------------------------------------------------------------------
/// Class LLFloaterAbout
@@ -89,6 +105,11 @@ public:
/// separated so that we can programmatically access the same info.
static LLSD getInfo();
void onClickCopyToClipboard();
+
+ void updateServerReleaseNotesURL(const std::string& url);
+
+private:
+ void setSupportText(const std::string& server_release_notes_url);
};
@@ -122,76 +143,17 @@ BOOL LLFloaterAbout::postBuild()
getChild<LLUICtrl>("copy_btn")->setCommitCallback(
boost::bind(&LLFloaterAbout::onClickCopyToClipboard, this));
-#if LL_WINDOWS
- getWindow()->incBusyCount();
- getWindow()->setCursor(UI_CURSOR_ARROW);
-#endif
- LLSD info(getInfo());
-#if LL_WINDOWS
- getWindow()->decBusyCount();
- getWindow()->setCursor(UI_CURSOR_ARROW);
-#endif
-
- std::ostringstream support;
-
- // Render the LLSD from getInfo() as a format_map_t
- LLStringUtil::format_map_t args;
-
- // allow the "Release Notes" URL label to be localized
- args["ReleaseNotes"] = LLTrans::getString("ReleaseNotes");
-
- for (LLSD::map_const_iterator ii(info.beginMap()), iend(info.endMap());
- ii != iend; ++ii)
- {
- if (! ii->second.isArray())
- {
- // Scalar value
- if (ii->second.isUndefined())
- {
- args[ii->first] = getString("none");
- }
- else
- {
- // don't forget to render value asString()
- args[ii->first] = ii->second.asString();
- }
- }
- else
- {
- // array value: build KEY_0, KEY_1 etc. entries
- for (LLSD::Integer n(0), size(ii->second.size()); n < size; ++n)
- {
- args[STRINGIZE(ii->first << '_' << n)] = ii->second[n].asString();
- }
- }
- }
-
- // Now build the various pieces
- support << getString("AboutHeader", args);
- if (info.has("REGION"))
+ if (gAgent.getRegion())
{
- support << "\n\n" << getString("AboutPosition", args);
+ // start fetching server release notes URL
+ setSupportText(LLTrans::getString("RetrievingData"));
+ LLServerReleaseNotesURLFetcher::startFetch();
}
- support << "\n\n" << getString("AboutSystem", args);
- support << "\n";
- if (info.has("GRAPHICS_DRIVER_VERSION"))
+ else // not logged in
{
- support << "\n" << getString("AboutDriver", args);
- }
- support << "\n" << getString("AboutLibs", args);
- if (info.has("COMPILER"))
- {
- support << "\n" << getString("AboutCompiler", args);
- }
- if (info.has("PACKETS_IN"))
- {
- support << '\n' << getString("AboutTraffic", args);
+ setSupportText(LLStringUtil::null);
}
- support_widget->appendText(support.str(),
- FALSE,
- LLStyle::Params()
- .color(LLUIColorTable::instance().getColor("TextFgReadOnlyColor")));
support_widget->blockUndo();
// Fix views
@@ -294,7 +256,6 @@ LLSD LLFloaterAbout::getInfo()
info["HOSTNAME"] = gAgent.getRegion()->getHost().getHostName();
info["HOSTIP"] = gAgent.getRegion()->getHost().getString();
info["SERVER_VERSION"] = gLastVersionChannel;
- info["SERVER_RELEASE_NOTES_URL"] = LLWeb::escapeURL(region->getCapability("ServerReleaseNotes"));
}
// CPU
@@ -389,6 +350,98 @@ void LLFloaterAbout::onClickCopyToClipboard()
support_widget->deselect();
}
+void LLFloaterAbout::updateServerReleaseNotesURL(const std::string& url)
+{
+ setSupportText(url);
+}
+
+void LLFloaterAbout::setSupportText(const std::string& server_release_notes_url)
+{
+#if LL_WINDOWS
+ getWindow()->incBusyCount();
+ getWindow()->setCursor(UI_CURSOR_ARROW);
+#endif
+ LLSD info(getInfo());
+#if LL_WINDOWS
+ getWindow()->decBusyCount();
+ getWindow()->setCursor(UI_CURSOR_ARROW);
+#endif
+
+ if (LLStringUtil::startsWith(server_release_notes_url, "http")) // it's an URL
+ {
+ info["SERVER_RELEASE_NOTES_URL"] = "[" + LLWeb::escapeURL(server_release_notes_url) + " " + LLTrans::getString("ReleaseNotes") + "]";
+ }
+ else
+ {
+ info["SERVER_RELEASE_NOTES_URL"] = server_release_notes_url;
+ }
+
+ LLViewerTextEditor *support_widget =
+ getChild<LLViewerTextEditor>("support_editor", true);
+
+ std::ostringstream support;
+
+ // Render the LLSD from getInfo() as a format_map_t
+ LLStringUtil::format_map_t args;
+
+ // allow the "Release Notes" URL label to be localized
+ args["ReleaseNotes"] = LLTrans::getString("ReleaseNotes");
+
+ for (LLSD::map_const_iterator ii(info.beginMap()), iend(info.endMap());
+ ii != iend; ++ii)
+ {
+ if (! ii->second.isArray())
+ {
+ // Scalar value
+ if (ii->second.isUndefined())
+ {
+ args[ii->first] = getString("none");
+ }
+ else
+ {
+ // don't forget to render value asString()
+ args[ii->first] = ii->second.asString();
+ }
+ }
+ else
+ {
+ // array value: build KEY_0, KEY_1 etc. entries
+ for (LLSD::Integer n(0), size(ii->second.size()); n < size; ++n)
+ {
+ args[STRINGIZE(ii->first << '_' << n)] = ii->second[n].asString();
+ }
+ }
+ }
+
+ // Now build the various pieces
+ support << getString("AboutHeader", args);
+ if (info.has("REGION"))
+ {
+ support << "\n\n" << getString("AboutPosition", args);
+ }
+ support << "\n\n" << getString("AboutSystem", args);
+ support << "\n";
+ if (info.has("GRAPHICS_DRIVER_VERSION"))
+ {
+ support << "\n" << getString("AboutDriver", args);
+ }
+ support << "\n" << getString("AboutLibs", args);
+ if (info.has("COMPILER"))
+ {
+ support << "\n" << getString("AboutCompiler", args);
+ }
+ if (info.has("PACKETS_IN"))
+ {
+ support << '\n' << getString("AboutTraffic", args);
+ }
+
+ support_widget->clear();
+ support_widget->appendText(support.str(),
+ FALSE,
+ LLStyle::Params()
+ .color(LLUIColorTable::instance().getColor("TextFgReadOnlyColor")));
+}
+
///----------------------------------------------------------------------------
/// LLFloaterAboutUtil
///----------------------------------------------------------------------------
@@ -398,3 +451,52 @@ void LLFloaterAboutUtil::registerFloater()
&LLFloaterReg::build<LLFloaterAbout>);
}
+
+///----------------------------------------------------------------------------
+/// Class LLServerReleaseNotesURLFetcher implementation
+///----------------------------------------------------------------------------
+// static
+void LLServerReleaseNotesURLFetcher::startFetch()
+{
+ LLViewerRegion* region = gAgent.getRegion();
+ if (!region) return;
+
+ // We cannot display the URL returned by the ServerReleaseNotes capability
+ // because opening it in an external browser will trigger a warning about untrusted
+ // SSL certificate.
+ // So we query the URL ourselves, expecting to find
+ // an URL suitable for external browsers in the "Location:" HTTP header.
+ std::string cap_url = region->getCapability("ServerReleaseNotes");
+ LLHTTPClient::get(cap_url, new LLServerReleaseNotesURLFetcher);
+}
+
+// virtual
+void LLServerReleaseNotesURLFetcher::completedHeader(U32 status, const std::string& reason, const LLSD& content)
+{
+ lldebugs << "Status: " << status << llendl;
+ lldebugs << "Reason: " << reason << llendl;
+ lldebugs << "Headers: " << content << llendl;
+
+ LLFloaterAbout* floater_about = LLFloaterReg::getTypedInstance<LLFloaterAbout>("sl_about");
+ if (floater_about)
+ {
+ std::string location = content["location"].asString();
+ if (location.empty())
+ {
+ location = floater_about->getString("ErrorFetchingServerReleaseNotesURL");
+ }
+ floater_about->updateServerReleaseNotesURL(location);
+ }
+}
+
+// virtual
+void LLServerReleaseNotesURLFetcher::completedRaw(
+ U32 status,
+ const std::string& reason,
+ const LLChannelDescriptors& channels,
+ const LLIOPipe::buffer_ptr_t& buffer)
+{
+ // Do nothing.
+ // We're overriding just because the base implementation tries to
+ // deserialize LLSD which triggers warnings.
+}
diff --git a/indra/newview/llfloateranimpreview.cpp b/indra/newview/llfloateranimpreview.cpp
index 9f0218a95e..2a3512e21a 100644
--- a/indra/newview/llfloateranimpreview.cpp
+++ b/indra/newview/llfloateranimpreview.cpp
@@ -223,7 +223,8 @@ BOOL LLFloaterAnimPreview::postBuild()
// now load bvh file
S32 file_size;
- LLAPRFile infile(mFilenameAndPath, LL_APR_RB, &file_size);
+ LLAPRFile infile ;
+ infile.open(mFilenameAndPath, LL_APR_RB, NULL, &file_size);
if (!infile.getFileHandle())
{
@@ -1062,14 +1063,19 @@ BOOL LLPreviewAnimation::render()
mNeedsUpdate = FALSE;
LLVOAvatar* avatarp = mDummyAvatar;
- glMatrixMode(GL_PROJECTION);
+ gGL.matrixMode(LLRender::MM_PROJECTION);
gGL.pushMatrix();
- glLoadIdentity();
- glOrtho(0.0f, mFullWidth, 0.0f, mFullHeight, -1.0f, 1.0f);
+ gGL.loadIdentity();
+ gGL.ortho(0.0f, mFullWidth, 0.0f, mFullHeight, -1.0f, 1.0f);
- glMatrixMode(GL_MODELVIEW);
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
gGL.pushMatrix();
- glLoadIdentity();
+ gGL.loadIdentity();
+
+ if (LLGLSLShader::sNoFixedFunction)
+ {
+ gUIProgram.bind();
+ }
LLGLSUIDefault def;
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
@@ -1077,10 +1083,10 @@ BOOL LLPreviewAnimation::render()
gl_rect_2d_simple( mFullWidth, mFullHeight );
- glMatrixMode(GL_PROJECTION);
+ gGL.matrixMode(LLRender::MM_PROJECTION);
gGL.popMatrix();
- glMatrixMode(GL_MODELVIEW);
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
gGL.popMatrix();
gGL.flush();
diff --git a/indra/newview/llfloateravatar.cpp b/indra/newview/llfloateravatar.cpp
new file mode 100644
index 0000000000..bdc5b581a9
--- /dev/null
+++ b/indra/newview/llfloateravatar.cpp
@@ -0,0 +1,54 @@
+/**
+ * @file llfloateravatar.h
+ * @author Leyla Farazha
+ * @brief floater for the avatar changer
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+/**
+ * Floater that appears when buying an object, giving a preview
+ * of its contents and their permissions.
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llfloateravatar.h"
+#include "lluictrlfactory.h"
+
+
+LLFloaterAvatar::LLFloaterAvatar(const LLSD& key)
+ : LLFloater(key)
+{
+}
+
+LLFloaterAvatar::~LLFloaterAvatar()
+{
+}
+
+BOOL LLFloaterAvatar::postBuild()
+{
+ enableResizeCtrls(true, true, false);
+ return TRUE;
+}
+
+
diff --git a/indra/newview/llfloateravatar.h b/indra/newview/llfloateravatar.h
new file mode 100644
index 0000000000..cadc5e4028
--- /dev/null
+++ b/indra/newview/llfloateravatar.h
@@ -0,0 +1,43 @@
+/**
+ * @file llfloateravatar.h
+ * @author Leyla Farazha
+ * @brief floater for the avatar changer
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_FLOATER_AVATAR_H
+#define LL_FLOATER_AVATAR_H
+
+#include "llfloater.h"
+
+class LLFloaterAvatar:
+ public LLFloater
+{
+ friend class LLFloaterReg;
+private:
+ LLFloaterAvatar(const LLSD& key);
+ /*virtual*/ ~LLFloaterAvatar();
+ /*virtual*/ BOOL postBuild();
+};
+
+#endif
diff --git a/indra/newview/llfloatercamera.cpp b/indra/newview/llfloatercamera.cpp
index 1dfa904a19..21b58d3e3d 100644
--- a/indra/newview/llfloatercamera.cpp
+++ b/indra/newview/llfloatercamera.cpp
@@ -36,7 +36,6 @@
#include "lljoystickbutton.h"
#include "llviewercontrol.h"
#include "llviewercamera.h"
-#include "llbottomtray.h"
#include "lltoolmgr.h"
#include "lltoolfocus.h"
#include "llslider.h"
@@ -314,12 +313,6 @@ void LLFloaterCamera::onOpen(const LLSD& key)
{
LLFirstUse::viewPopup();
- LLButton *anchor_panel = LLBottomTray::getInstance()->getChild<LLButton>("camera_btn");
-
- setDockControl(new LLDockControl(
- anchor_panel, this,
- getDockTongue(), LLDockControl::TOP));
-
mZoom->onOpen(key);
// Returns to previous mode, see EXT-2727(View tool should remember state).
@@ -343,27 +336,23 @@ void LLFloaterCamera::onClose(bool app_quitting)
if (mCurrMode == CAMERA_CTRL_MODE_PAN)
mPrevMode = CAMERA_CTRL_MODE_PAN;
- // HACK: Should always close as docked to prevent toggleInstance without calling onOpen.
- if ( !isDocked() )
- setDocked(true);
switchMode(CAMERA_CTRL_MODE_PAN);
mClosed = TRUE;
}
LLFloaterCamera::LLFloaterCamera(const LLSD& val)
-: LLTransientDockableFloater(NULL, true, val),
+: LLFloater(val),
mClosed(FALSE),
mCurrMode(CAMERA_CTRL_MODE_PAN),
mPrevMode(CAMERA_CTRL_MODE_PAN)
{
- LLHints::registerHintTarget("view_popup", LLView::getHandle());
+ LLHints::registerHintTarget("view_popup", getHandle());
+ mCommitCallbackRegistrar.add("CameraPresets.ChangeView", boost::bind(&LLFloaterCamera::onClickCameraItem, _2));
}
// virtual
BOOL LLFloaterCamera::postBuild()
{
- setIsChrome(TRUE);
- setTitleVisible(TRUE); // restore title visibility after chrome applying
updateTransparency(TT_ACTIVE); // force using active floater transparency (STORM-730)
mRotate = getChild<LLJoystickCameraRotate>(ORBIT);
@@ -379,7 +368,7 @@ BOOL LLFloaterCamera::postBuild()
// ensure that appearance mode is handled while building. See EXT-7796.
handleAvatarEditingAppearance(sAppearanceEditing);
- return LLDockableFloater::postBuild();
+ return LLFloater::postBuild();
}
void LLFloaterCamera::fillFlatlistFromPanel (LLFlatListView* list, LLPanel* panel)
@@ -444,26 +433,6 @@ void LLFloaterCamera::setMode(ECameraControlMode mode)
updateState();
}
-void LLFloaterCamera::setModeTitle(const ECameraControlMode mode)
-{
- std::string title;
- switch(mode)
- {
- case CAMERA_CTRL_MODE_MODES:
- title = getString("camera_modes_title");
- break;
- case CAMERA_CTRL_MODE_PAN:
- title = getString("pan_mode_title");
- break;
- case CAMERA_CTRL_MODE_PRESETS:
- title = getString("presets_mode_title");
- break;
- default:
- break;
- }
- setTitle(title);
-}
-
void LLFloaterCamera::switchMode(ECameraControlMode mode)
{
setMode(mode);
@@ -543,7 +512,6 @@ void LLFloaterCamera::updateState()
{
iter->second->setToggleState(iter->first == mCurrMode);
}
- setModeTitle(mCurrMode);
}
void LLFloaterCamera::updateItemsSelection()
diff --git a/indra/newview/llfloatercamera.h b/indra/newview/llfloatercamera.h
index 424191ef26..4d6d03f22d 100644
--- a/indra/newview/llfloatercamera.h
+++ b/indra/newview/llfloatercamera.h
@@ -27,7 +27,7 @@
#ifndef LLFLOATERCAMERA_H
#define LLFLOATERCAMERA_H
-#include "lltransientdockablefloater.h"
+#include "llfloater.h"
#include "lliconctrl.h"
#include "lltextbox.h"
#include "llflatlistview.h"
@@ -45,8 +45,7 @@ enum ECameraControlMode
CAMERA_CTRL_MODE_PRESETS
};
-class LLFloaterCamera
- : public LLTransientDockableFloater
+class LLFloaterCamera : public LLFloater
{
friend class LLFloaterReg;
@@ -103,9 +102,6 @@ private:
/* sets a new mode preserving previous one and updates ui*/
void setMode(ECameraControlMode mode);
- /** set title appropriate to passed mode */
- void setModeTitle(const ECameraControlMode mode);
-
/* updates the state (UI) according to the current mode */
void updateState();
diff --git a/indra/newview/llfloaterchat.cpp b/indra/newview/llfloaterchat.cpp
deleted file mode 100644
index 2679dbb78b..0000000000
--- a/indra/newview/llfloaterchat.cpp
+++ /dev/null
@@ -1,485 +0,0 @@
-/**
- * @file llfloaterchat.cpp
- * @brief LLFloaterChat class implementation
- *
- * $LicenseInfo:firstyear=2002&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-/**
- * Actually the "Chat History" floater.
- * Should be llfloaterchathistory, not llfloaterchat.
- */
-
-#include "llviewerprecompiledheaders.h"
-
-// project include
-#include "llagent.h"
-#include "llappviewer.h"
-#include "llbutton.h"
-#include "llcheckboxctrl.h"
-#include "llcombobox.h"
-#include "llconsole.h"
-#include "llfloateractivespeakers.h"
-#include "llfloaterchatterbox.h"
-#include "llfloaterreg.h"
-#include "llfloaterscriptdebug.h"
-#include "llkeyboard.h"
-//#include "lllineeditor.h"
-#include "llmutelist.h"
-//#include "llresizehandle.h"
-#include "llchatbar.h"
-#include "llrecentpeople.h"
-#include "llpanelblockedlist.h"
-#include "llslurl.h"
-#include "llstatusbar.h"
-#include "llviewertexteditor.h"
-#include "llviewergesture.h" // for triggering gestures
-#include "llviewermessage.h"
-#include "llviewerwindow.h"
-#include "llviewercontrol.h"
-#include "lluictrlfactory.h"
-#include "lllogchat.h"
-#include "lltexteditor.h"
-#include "lltextparser.h"
-#include "llweb.h"
-#include "llstylemap.h"
-
-// linden library includes
-#include "llaudioengine.h"
-#include "llchat.h"
-#include "llfontgl.h"
-#include "llrect.h"
-#include "llerror.h"
-#include "llstring.h"
-#include "llwindow.h"
-#include "message.h"
-
-//
-// Constants
-//
-const F32 INSTANT_MSG_SIZE = 8.0f;
-const F32 CHAT_MSG_SIZE = 8.0f;
-
-
-//
-// Global statics
-//
-LLColor4 get_text_color(const LLChat& chat);
-
-//
-// Member Functions
-//
-LLFloaterChat::LLFloaterChat(const LLSD& seed)
- : LLFloater(seed),
- mPanel(NULL)
-{
- mFactoryMap["chat_panel"] = LLCallbackMap(createChatPanel, NULL);
- mFactoryMap["active_speakers_panel"] = LLCallbackMap(createSpeakersPanel, NULL);
- //Called from floater reg: LLUICtrlFactory::getInstance()->buildFloater(this,"floater_chat_history.xml");
-
-}
-
-LLFloaterChat::~LLFloaterChat()
-{
- // Children all cleaned up by default view destructor.
-}
-
-void LLFloaterChat::draw()
-{
- // enable say and shout only when text available
-
- childSetValue("toggle_active_speakers_btn", childIsVisible("active_speakers_panel"));
-
- LLChatBar* chat_barp = findChild<LLChatBar>("chat_panel", TRUE);
- if (chat_barp)
- {
- chat_barp->refresh();
- }
-
- mPanel->refreshSpeakers();
- LLFloater::draw();
-}
-
-BOOL LLFloaterChat::postBuild()
-{
- // Hide the chat overlay when our history is visible.
- setVisibleCallback(boost::bind(&LLFloaterChat::updateConsoleVisibility, this));
-
- mPanel = (LLPanelActiveSpeakers*)getChild<LLPanel>("active_speakers_panel");
-
- childSetCommitCallback("show mutes",onClickToggleShowMute,this); //show mutes
- childSetVisible("Chat History Editor with mute",FALSE);
- childSetAction("toggle_active_speakers_btn", onClickToggleActiveSpeakers, this);
-
- return TRUE;
-}
-
-void LLFloaterChat::updateConsoleVisibility()
-{
- if(gDisconnected)
- {
- return;
- }
- // determine whether we should show console due to not being visible
- gConsole->setVisible( !isInVisibleChain() // are we not in part of UI being drawn?
- || isMinimized() // are we minimized?
- || (getHost() && getHost()->isMinimized() )); // are we hosted in a minimized floater?
-}
-
-void add_timestamped_line(LLViewerTextEditor* edit, LLChat chat, const LLColor4& color)
-{
- std::string line = chat.mText;
- bool prepend_newline = true;
- if (gSavedSettings.getBOOL("ChatShowTimestamps"))
- {
- edit->appendTime(prepend_newline);
- prepend_newline = false;
- }
-
- // If the msg is from an agent (not yourself though),
- // extract out the sender name and replace it with the hotlinked name.
- if (chat.mSourceType == CHAT_SOURCE_AGENT &&
- chat.mFromID != LLUUID::null)
- {
- chat.mURL = LLSLURL("agent", chat.mFromID, "inspect").getSLURLString();
- }
-
- // If the chat line has an associated url, link it up to the name.
- if (!chat.mURL.empty()
- && (line.length() > chat.mFromName.length() && line.find(chat.mFromName,0) == 0))
- {
- std::string start_line = line.substr(0, chat.mFromName.length() + 1);
- line = line.substr(chat.mFromName.length() + 1);
- edit->appendText(start_line, prepend_newline, LLStyleMap::instance().lookup(chat.mFromID,chat.mURL));
- edit->blockUndo();
- prepend_newline = false;
- }
- edit->appendText(line, prepend_newline, LLStyle::Params().color(color));
- edit->blockUndo();
-}
-
-// static
-void LLFloaterChat::addChatHistory(const LLChat& chat, bool log_to_file)
-{
- if (log_to_file && (gSavedPerAccountSettings.getBOOL("LogChat")))
- {
- if (chat.mChatType != CHAT_TYPE_WHISPER && chat.mChatType != CHAT_TYPE_SHOUT)
- {
- LLLogChat::saveHistory("chat", chat.mFromName, chat.mFromID, chat.mText);
- }
- else
- {
- LLLogChat::saveHistory("chat", "", chat.mFromID, chat.mFromName + " " + chat.mText);
- }
- }
-
- LLColor4 color = get_text_color(chat);
-
- if (!log_to_file) color = LLColor4::grey; //Recap from log file.
-
- if (chat.mChatType == CHAT_TYPE_DEBUG_MSG)
- {
- if(gSavedSettings.getBOOL("ShowScriptErrors") == FALSE)
- return;
- if (gSavedSettings.getS32("ShowScriptErrorsLocation") == 1)
- {
- LLFloaterScriptDebug::addScriptLine(chat.mText,
- chat.mFromName,
- color,
- chat.mFromID);
- return;
- }
- }
-
- // could flash the chat button in the status bar here. JC
- LLFloaterChat* chat_floater = LLFloaterChat::getInstance();
- LLViewerTextEditor* history_editor = chat_floater->getChild<LLViewerTextEditor>("Chat History Editor");
- LLViewerTextEditor* history_editor_with_mute = chat_floater->getChild<LLViewerTextEditor>("Chat History Editor with mute");
-
- if (!chat.mMuted)
- {
- add_timestamped_line(history_editor, chat, color);
- add_timestamped_line(history_editor_with_mute, chat, color);
- }
- else
- {
- // desaturate muted chat
- LLColor4 muted_color = lerp(color, LLColor4::grey, 0.5f);
- add_timestamped_line(history_editor_with_mute, chat, color);
- }
-
- // add objects as transient speakers that can be muted
- if (chat.mSourceType == CHAT_SOURCE_OBJECT)
- {
- chat_floater->mPanel->setSpeaker(chat.mFromID, chat.mFromName, LLSpeaker::STATUS_NOT_IN_CHANNEL, LLSpeaker::SPEAKER_OBJECT);
- }
-
- // start tab flashing on incoming text from other users (ignoring system text, etc)
- if (!chat_floater->isInVisibleChain() && chat.mSourceType == CHAT_SOURCE_AGENT)
- {
- LLFloaterChatterBox::getInstance()->setFloaterFlashing(chat_floater, TRUE);
- }
-}
-
-// static
-void LLFloaterChat::setHistoryCursorAndScrollToEnd()
-{
- LLViewerTextEditor* history_editor = LLFloaterChat::getInstance()->getChild<LLViewerTextEditor>("Chat History Editor");
- LLViewerTextEditor* history_editor_with_mute = LLFloaterChat::getInstance()->getChild<LLViewerTextEditor>("Chat History Editor with mute");
-
- if (history_editor)
- {
- history_editor->setCursorAndScrollToEnd();
- }
- if (history_editor_with_mute)
- {
- history_editor_with_mute->setCursorAndScrollToEnd();
- }
-}
-
-
-//static
-void LLFloaterChat::onClickMute(void *data)
-{
- LLFloaterChat* self = (LLFloaterChat*)data;
-
- LLComboBox* chatter_combo = self->getChild<LLComboBox>("chatter combobox");
-
- const std::string& name = chatter_combo->getSimple();
- LLUUID id = chatter_combo->getCurrentID();
-
- if (name.empty()) return;
-
- LLMute mute(id);
- mute.setFromDisplayName(name);
- LLMuteList::getInstance()->add(mute);
- LLPanelBlockedList::showPanelAndSelect(mute.mID);
-}
-
-//static
-void LLFloaterChat::onClickToggleShowMute(LLUICtrl* caller, void *data)
-{
- LLFloaterChat* floater = (LLFloaterChat*)data;
-
-
- //LLCheckBoxCtrl*
- BOOL show_mute = floater->getChild<LLCheckBoxCtrl>("show mutes")->get();
- LLViewerTextEditor* history_editor = floater->getChild<LLViewerTextEditor>("Chat History Editor");
- LLViewerTextEditor* history_editor_with_mute = floater->getChild<LLViewerTextEditor>("Chat History Editor with mute");
-
- if (!history_editor || !history_editor_with_mute)
- return;
-
- //BOOL show_mute = floater->mShowMuteCheckBox->get();
- if (show_mute)
- {
- history_editor->setVisible(FALSE);
- history_editor_with_mute->setVisible(TRUE);
- history_editor_with_mute->setCursorAndScrollToEnd();
- }
- else
- {
- history_editor->setVisible(TRUE);
- history_editor_with_mute->setVisible(FALSE);
- history_editor->setCursorAndScrollToEnd();
- }
-}
-
-// Put a line of chat in all the right places
-void LLFloaterChat::addChat(const LLChat& chat, BOOL local_agent)
-{
- triggerAlerts(chat.mText);
-
- // Add the sender to the list of people with which we've recently interacted.
- // this is not the best place to add _all_ messages to recent list
- // comment this for now, may remove later on code cleanup
- //if(chat.mSourceType == CHAT_SOURCE_AGENT && chat.mFromID.notNull())
- // LLRecentPeople::instance().add(chat.mFromID);
-
- addChatHistory(chat, true);
-}
-
-// Moved from lltextparser.cpp to break llui/llaudio library dependency.
-//static
-void LLFloaterChat::triggerAlerts(const std::string& text)
-{
- LLTextParser* parser = LLTextParser::getInstance();
-// bool spoken=FALSE;
- for (S32 i=0;i<parser->mHighlights.size();i++)
- {
- LLSD& highlight = parser->mHighlights[i];
- if (parser->findPattern(text,highlight) >= 0 )
- {
- if(gAudiop)
- {
- if ((std::string)highlight["sound_lluuid"] != LLUUID::null.asString())
- {
- gAudiop->triggerSound(highlight["sound_lluuid"].asUUID(),
- gAgent.getID(),
- 1.f,
- LLAudioEngine::AUDIO_TYPE_UI,
- gAgent.getPositionGlobal() );
- }
-/*
- if (!spoken)
- {
- LLTextToSpeech* text_to_speech = NULL;
- text_to_speech = LLTextToSpeech::getInstance();
- spoken = text_to_speech->speak((LLString)highlight["voice"],text);
- }
- */
- }
- if (highlight["flash"])
- {
- LLWindow* viewer_window = gViewerWindow->getWindow();
- if (viewer_window && viewer_window->getMinimized())
- {
- viewer_window->flashIcon(5.f);
- }
- }
- }
- }
-}
-
-LLColor4 get_text_color(const LLChat& chat)
-{
- LLColor4 text_color;
-
- if(chat.mMuted)
- {
- text_color.setVec(0.8f, 0.8f, 0.8f, 1.f);
- }
- else
- {
- switch(chat.mSourceType)
- {
- case CHAT_SOURCE_SYSTEM:
- text_color = LLUIColorTable::instance().getColor("SystemChatColor");
- break;
- case CHAT_SOURCE_AGENT:
- if (chat.mFromID.isNull())
- {
- text_color = LLUIColorTable::instance().getColor("SystemChatColor");
- }
- else
- {
- if(gAgent.getID() == chat.mFromID)
- {
- text_color = LLUIColorTable::instance().getColor("UserChatColor");
- }
- else
- {
- text_color = LLUIColorTable::instance().getColor("AgentChatColor");
- }
- }
- break;
- case CHAT_SOURCE_OBJECT:
- if (chat.mChatType == CHAT_TYPE_DEBUG_MSG)
- {
- text_color = LLUIColorTable::instance().getColor("ScriptErrorColor");
- }
- else if ( chat.mChatType == CHAT_TYPE_OWNER )
- {
- text_color = LLUIColorTable::instance().getColor("llOwnerSayChatColor");
- }
- else
- {
- text_color = LLUIColorTable::instance().getColor("ObjectChatColor");
- }
- break;
- default:
- text_color.setToWhite();
- }
-
- if (!chat.mPosAgent.isExactlyZero())
- {
- LLVector3 pos_agent = gAgent.getPositionAgent();
- F32 distance_squared = dist_vec_squared(pos_agent, chat.mPosAgent);
- F32 dist_near_chat = gAgent.getNearChatRadius();
- if (distance_squared > dist_near_chat * dist_near_chat)
- {
- // diminish far-off chat
- text_color.mV[VALPHA] = 0.8f;
- }
- }
- }
-
- return text_color;
-}
-
-//static
-void LLFloaterChat::loadHistory()
-{
- LLLogChat::loadHistory(std::string("chat"), &chatFromLogFile, (void *)LLFloaterChat::getInstance());
-}
-
-//static
-void LLFloaterChat::chatFromLogFile(LLLogChat::ELogLineType type , const LLSD& line, void* userdata)
-{
- switch (type)
- {
- case LLLogChat::LOG_EMPTY:
- case LLLogChat::LOG_END:
- // *TODO: nice message from XML file here
- break;
- case LLLogChat::LOG_LINE:
- case LLLogChat::LOG_LLSD:
- {
- LLChat chat;
- chat.mText = line["message"].asString();
- get_text_color(chat);
- addChatHistory(chat, FALSE);
- }
- break;
- default:
- // nothing
- break;
- }
-}
-
-//static
-void* LLFloaterChat::createSpeakersPanel(void* data)
-{
- return new LLPanelActiveSpeakers(LLLocalSpeakerMgr::getInstance(), TRUE);
-}
-
-//static
-void* LLFloaterChat::createChatPanel(void* data)
-{
- LLChatBar* chatp = new LLChatBar();
- return chatp;
-}
-
-// static
-void LLFloaterChat::onClickToggleActiveSpeakers(void* userdata)
-{
- LLFloaterChat* self = (LLFloaterChat*)userdata;
-
- self->childSetVisible("active_speakers_panel", !self->childIsVisible("active_speakers_panel"));
-}
-
-//static
- LLFloaterChat* LLFloaterChat::getInstance()
- {
- return LLFloaterReg::getTypedInstance<LLFloaterChat>("chat", LLSD()) ;
-
- }
diff --git a/indra/newview/llfloaterchat.h b/indra/newview/llfloaterchat.h
deleted file mode 100644
index fb2aabbfdf..0000000000
--- a/indra/newview/llfloaterchat.h
+++ /dev/null
@@ -1,78 +0,0 @@
-/**
- * @file llfloaterchat.h
- * @brief LLFloaterChat class definition
- *
- * $LicenseInfo:firstyear=2002&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-/*
- * Actually the "Chat History" floater.
- * Should be llfloaterchathistory, not llfloaterchat.
- */
-
-#ifndef LL_LLFLOATERCHAT_H
-#define LL_LLFLOATERCHAT_H
-
-#include "llfloater.h"
-#include "lllogchat.h"
-
-class LLChat;
-class LLPanelActiveSpeakers;
-class LLLogChat;
-
-class LLFloaterChat : public LLFloater
-{
-public:
- LLFloaterChat(const LLSD& seed);
- ~LLFloaterChat();
-
- virtual void draw();
- virtual BOOL postBuild();
-
- void updateConsoleVisibility();
-
- static void setHistoryCursorAndScrollToEnd();
-
- // *TODO:Skinning - move these to LLChat (or LLViewerChat?)
- // Add chat to console and history list.
- // Color based on source, type, distance.
- static void addChat(const LLChat& chat, BOOL local_agent = FALSE);
- // Add chat to history alone.
- static void addChatHistory(const LLChat& chat, bool log_to_file = true);
-
- static void triggerAlerts(const std::string& text);
-
- static void onClickMute(void *data);
- static void onClickToggleShowMute(LLUICtrl* caller, void *data);
- static void onClickToggleActiveSpeakers(void* userdata);
- static void chatFromLogFile(LLLogChat::ELogLineType type, const LLSD& line, void* userdata);
- static void loadHistory();
- static void* createSpeakersPanel(void* data);
- static void* createChatPanel(void* data);
-
- static LLFloaterChat* getInstance(); // *TODO:Skinning Deprecate
-
- LLPanelActiveSpeakers* mPanel;
- BOOL mScrolledToEnd;
-};
-
-#endif
diff --git a/indra/newview/llfloaterchatterbox.cpp b/indra/newview/llfloaterchatterbox.cpp
deleted file mode 100644
index dc33e45dd4..0000000000
--- a/indra/newview/llfloaterchatterbox.cpp
+++ /dev/null
@@ -1,344 +0,0 @@
-/**
- * @file llfloaterchatterbox.cpp
- * @author Richard
- * @date 2007-05-08
- * @brief Implementation of the chatterbox integrated conversation ui
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-
-#include "llviewerprecompiledheaders.h"
-
-#include "llfloaterreg.h"
-#include "llfloaterchatterbox.h"
-#include "lluictrlfactory.h"
-#include "llfloaterfriends.h"
-#include "llfloatergroups.h"
-#include "llviewercontrol.h"
-#include "llvoicechannel.h"
-#include "llimpanel.h"
-#include "llimview.h"
-
-//
-// LLFloaterMyFriends
-//
-
-LLFloaterMyFriends::LLFloaterMyFriends(const LLSD& seed)
- : LLFloater(seed)
-{
- mFactoryMap["friends_panel"] = LLCallbackMap(LLFloaterMyFriends::createFriendsPanel, NULL);
- mFactoryMap["groups_panel"] = LLCallbackMap(LLFloaterMyFriends::createGroupsPanel, NULL);
- //Called from floater reg: LLUICtrlFactory::getInstance()->buildFloater(this, "floater_my_friends.xml");
-}
-
-LLFloaterMyFriends::~LLFloaterMyFriends()
-{
-}
-
-BOOL LLFloaterMyFriends::postBuild()
-{
- return TRUE;
-}
-
-void LLFloaterMyFriends::onOpen(const LLSD& key)
-{
- if (key.asString() == "friends")
- {
- childShowTab("friends_and_groups", "friends_panel");
- }
- else if (key.asString() == "groups")
- {
- childShowTab("friends_and_groups", "groups_panel");
- }
-}
-
-//static
-void* LLFloaterMyFriends::createFriendsPanel(void* data)
-{
- return new LLPanelFriends();
-}
-
-//static
-void* LLFloaterMyFriends::createGroupsPanel(void* data)
-{
- return new LLPanelGroups();
-}
-
-//static
-LLFloaterMyFriends* LLFloaterMyFriends::getInstance()
-{
- return LLFloaterReg::getTypedInstance<LLFloaterMyFriends>("contacts", "friends") ;
-}
-
-//
-// LLFloaterChatterBox
-//
-LLFloaterChatterBox::LLFloaterChatterBox(const LLSD& seed)
-: LLMultiFloater(seed),
- mActiveVoiceFloater(NULL)
-{
- mAutoResize = FALSE;
-
- //Called from floater reg: LLUICtrlFactory::getInstance()->buildFloater(this, "floater_chatterbox.xml", FALSE);
-}
-
-LLFloaterChatterBox::~LLFloaterChatterBox()
-{
-}
-
-BOOL LLFloaterChatterBox::postBuild()
-{
- setVisibleCallback(boost::bind(&LLFloaterChatterBox::onVisibilityChange, this, _2));
-
- if (gSavedSettings.getBOOL("ContactsTornOff"))
- {
- LLFloaterMyFriends* floater_contacts = LLFloaterMyFriends::getInstance();
- if(floater_contacts)
- {
- // add then remove to set up relationship for re-attach
- addFloater(floater_contacts, FALSE);
- removeFloater(floater_contacts);
- // reparent to floater view
- gFloaterView->addChild(floater_contacts);
- }
- }
- else
- {
- addFloater(LLFloaterMyFriends::getInstance(), TRUE);
- }
-
- mTabContainer->lockTabs();
- return TRUE;
-}
-
-BOOL LLFloaterChatterBox::handleKeyHere(KEY key, MASK mask)
-{
- if (key == 'W' && mask == MASK_CONTROL)
- {
- LLFloater* floater = getActiveFloater();
- // is user closeable and is system closeable
- if (floater && floater->canClose())
- {
- if (floater->isCloseable())
- {
- floater->closeFloater();
- }
- else
- {
- // close chatterbox window if frontmost tab is reserved, non-closeable tab
- // such as contacts or near me
- closeFloater();
- }
- }
- return TRUE;
- }
-
- return LLMultiFloater::handleKeyHere(key, mask);
-}
-
-void LLFloaterChatterBox::draw()
-{
- // clear new im notifications when chatterbox is visible
- if (!isMinimized())
- {
- gIMMgr->clearNewIMNotification();
- }
- LLFloater* current_active_floater = getCurrentVoiceFloater();
- // set icon on tab for floater currently associated with active voice channel
- if(mActiveVoiceFloater != current_active_floater)
- {
- // remove image from old floater's tab
- if (mActiveVoiceFloater)
- {
- mTabContainer->setTabImage(mActiveVoiceFloater, "");
- }
- }
-
- // update image on current active tab
- if (current_active_floater)
- {
- LLColor4 icon_color = LLColor4::white;
- LLVoiceChannel* channelp = LLVoiceChannel::getCurrentVoiceChannel();
- if (channelp)
- {
- if (channelp->isActive())
- {
- icon_color = LLColor4::green;
- }
- else if (channelp->getState() == LLVoiceChannel::STATE_ERROR)
- {
- icon_color = LLColor4::red;
- }
- else // active, but not connected
- {
- icon_color = LLColor4::yellow;
- }
- }
- mTabContainer->setTabImage(current_active_floater, "active_voice_tab.tga", icon_color);
- }
-
- mActiveVoiceFloater = current_active_floater;
-
- LLMultiFloater::draw();
-}
-
-void LLFloaterChatterBox::onOpen(const LLSD& key)
-{
- //*TODO:Skinning show the session id associated with key
- if (key.asString() == "local")
- {
- }
- else if (key.isDefined())
- {
- /*LLFloaterIMPanel* impanel = gIMMgr->findFloaterBySession(key.asUUID());
- if (impanel)
- {
- impanel->openFloater();
- }*/
- }
-}
-
-void LLFloaterChatterBox::onVisibilityChange ( const LLSD& new_visibility )
-{
-}
-
-void LLFloaterChatterBox::removeFloater(LLFloater* floaterp)
-{
- if(!floaterp) return;
-
- if (floaterp->getName() == "chat floater")
- {
- // only my friends floater now locked
- mTabContainer->lockTabs(mTabContainer->getNumLockedTabs() - 1);
- gSavedSettings.setBOOL("ChatHistoryTornOff", TRUE);
- floaterp->setCanClose(TRUE);
- }
- else if (floaterp->getName() == "floater_my_friends")
- {
- // only chat floater now locked
- mTabContainer->lockTabs(mTabContainer->getNumLockedTabs() - 1);
- gSavedSettings.setBOOL("ContactsTornOff", TRUE);
- floaterp->setCanClose(TRUE);
- }
- LLMultiFloater::removeFloater(floaterp);
-}
-
-void LLFloaterChatterBox::addFloater(LLFloater* floaterp,
- BOOL select_added_floater,
- LLTabContainer::eInsertionPoint insertion_point)
-{
- if(!floaterp) return;
-
- S32 num_locked_tabs = mTabContainer->getNumLockedTabs();
-
- // already here
- if (floaterp->getHost() == this)
- {
- openFloater(floaterp->getKey());
- return;
- }
-
- // make sure my friends and chat history both locked when re-attaching chat history
- if (floaterp->getName() == "chat floater")
- {
- mTabContainer->unlockTabs();
- // add chat history as second tab if contact window is present, first tab otherwise
- if (getChildView("floater_my_friends"))
- {
- // assuming contacts window is first tab, select it
- mTabContainer->selectFirstTab();
- // and add ourselves after
- LLMultiFloater::addFloater(floaterp, select_added_floater, LLTabContainer::RIGHT_OF_CURRENT);
- }
- else
- {
- LLMultiFloater::addFloater(floaterp, select_added_floater, LLTabContainer::START);
- }
-
- // make sure first two tabs are now locked
- mTabContainer->lockTabs(num_locked_tabs + 1);
- gSavedSettings.setBOOL("ChatHistoryTornOff", FALSE);
- floaterp->setCanClose(FALSE);
- }
- else if (floaterp->getName() == "floater_my_friends")
- {
- mTabContainer->unlockTabs();
- // add contacts window as first tab
- LLMultiFloater::addFloater(floaterp, select_added_floater, LLTabContainer::START);
- // make sure first two tabs are now locked
- mTabContainer->lockTabs(num_locked_tabs + 1);
- gSavedSettings.setBOOL("ContactsTornOff", FALSE);
- floaterp->setCanClose(FALSE);
- }
- else
- {
- LLMultiFloater::addFloater(floaterp, select_added_floater, insertion_point);
- // openFloater(floaterp->getKey());
- }
-
- // make sure active voice icon shows up for new tab
- if (floaterp == mActiveVoiceFloater)
- {
- mTabContainer->setTabImage(floaterp, "active_voice_tab.tga");
- }
-}
-
-//static
-LLFloaterChatterBox* LLFloaterChatterBox::getInstance()
-{
- return LLFloaterReg::getTypedInstance<LLFloaterChatterBox>("communicate", LLSD()) ;
-}
-
-//static
-LLFloater* LLFloaterChatterBox::getCurrentVoiceFloater()
-{
- if (!LLVoiceClient::getInstance()->voiceEnabled())
- {
- return NULL;
- }
- if (LLVoiceChannelProximal::getInstance() == LLVoiceChannel::getCurrentVoiceChannel())
- {
- return NULL;
- }
- else
- {
- LLFloaterChatterBox* floater = LLFloaterChatterBox::getInstance();
- if(!floater) return NULL;
- // iterator over all IM tabs (skip friends and near me)
- for (S32 i = 0; i < floater->getFloaterCount(); i++)
- {
- LLPanel* panelp = floater->mTabContainer->getPanelByIndex(i);
- if (panelp->getName() == "im_floater")
- {
- // only LLFloaterIMPanels are called "im_floater"
- LLFloaterIMPanel* im_floaterp = (LLFloaterIMPanel*)panelp;
- LLVoiceChannel* voice_channel = LLIMModel::getInstance()->getVoiceChannel(im_floaterp->getSessionID());
- if (voice_channel == LLVoiceChannel::getCurrentVoiceChannel())
- {
- return im_floaterp;
- }
- }
- }
- }
- return NULL;
-}
diff --git a/indra/newview/llfloaterchatterbox.h b/indra/newview/llfloaterchatterbox.h
deleted file mode 100644
index 3a8bfe2fa4..0000000000
--- a/indra/newview/llfloaterchatterbox.h
+++ /dev/null
@@ -1,80 +0,0 @@
-/**
- * @file llfloaterchatterbox.h
- * @author Richard
- * @date 2007-05-04
- * @brief Integrated friends and group management/communication tool
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-#ifndef LL_LLFLOATERCHATTERBOX_H
-#define LL_LLFLOATERCHATTERBOX_H
-
-#include "llfloater.h"
-#include "llmultifloater.h"
-#include "llstring.h"
-#include "llimpanel.h"
-
-class LLTabContainer;
-
-class LLFloaterChatterBox : public LLMultiFloater
-{
-public:
- LLFloaterChatterBox(const LLSD& seed);
- virtual ~LLFloaterChatterBox();
-
- /*virtual*/ BOOL postBuild();
- /*virtual*/ BOOL handleKeyHere(KEY key, MASK mask);
- /*virtual*/ void draw();
- /*virtual*/ void onOpen(const LLSD& key);
-
- /*virtual*/ void removeFloater(LLFloater* floaterp);
- /*virtual*/ void addFloater(LLFloater* floaterp,
- BOOL select_added_floater,
- LLTabContainer::eInsertionPoint insertion_point = LLTabContainer::END);
-
- static LLFloaterChatterBox* getInstance(); // *TODO:Skinning Deprecate
- static LLFloater* getCurrentVoiceFloater();
-
-protected:
- void onVisibilityChange ( const LLSD& new_visibility );
-
- LLFloater* mActiveVoiceFloater;
-};
-
-
-class LLFloaterMyFriends : public LLFloater
-{
-public:
- LLFloaterMyFriends(const LLSD& seed);
- virtual ~LLFloaterMyFriends();
-
- /*virtual*/ BOOL postBuild();
- /*virtual*/ void onOpen(const LLSD& key);
-
- static LLFloaterMyFriends* getInstance(); // *TODO:Skinning Deprecate
-
- static void* createFriendsPanel(void* data);
- static void* createGroupsPanel(void* data);
-};
-
-#endif // LL_LLFLOATERCHATTERBOX_H
diff --git a/indra/newview/llfloatercolorpicker.cpp b/indra/newview/llfloatercolorpicker.cpp
index 659e52271a..05d73c2416 100644
--- a/indra/newview/llfloatercolorpicker.cpp
+++ b/indra/newview/llfloatercolorpicker.cpp
@@ -271,7 +271,7 @@ void LLFloaterColorPicker::destroyUI ()
if ( mSwatchView )
{
this->removeChild ( mSwatchView );
- delete mSwatchView;
+ mSwatchView->die();;
mSwatchView = NULL;
}
}
diff --git a/indra/newview/llfloaterdestinations.cpp b/indra/newview/llfloaterdestinations.cpp
new file mode 100644
index 0000000000..af21cb593f
--- /dev/null
+++ b/indra/newview/llfloaterdestinations.cpp
@@ -0,0 +1,54 @@
+/**
+ * @file llfloaterdestinations.h
+ * @author Leyla Farazha
+ * @brief floater for the destinations guide
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+/**
+ * Floater that appears when buying an object, giving a preview
+ * of its contents and their permissions.
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llfloaterdestinations.h"
+#include "lluictrlfactory.h"
+
+
+LLFloaterDestinations::LLFloaterDestinations(const LLSD& key)
+ : LLFloater(key)
+{
+}
+
+LLFloaterDestinations::~LLFloaterDestinations()
+{
+}
+
+BOOL LLFloaterDestinations::postBuild()
+{
+ enableResizeCtrls(true, true, false);
+ return TRUE;
+}
+
+
diff --git a/indra/newview/llfloaterdestinations.h b/indra/newview/llfloaterdestinations.h
new file mode 100644
index 0000000000..85d9b3391e
--- /dev/null
+++ b/indra/newview/llfloaterdestinations.h
@@ -0,0 +1,43 @@
+/**
+ * @file llfloaterdestinations.h
+ * @author Leyla Farazha
+ * @brief floater for the destinations guide
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_FLOATER_DESTINATIONS_H
+#define LL_FLOATER_DESTINATIONS_H
+
+#include "llfloater.h"
+
+class LLFloaterDestinations:
+ public LLFloater
+{
+ friend class LLFloaterReg;
+private:
+ LLFloaterDestinations(const LLSD& key);
+ /*virtual*/ ~LLFloaterDestinations();
+ /*virtual*/ BOOL postBuild();
+};
+
+#endif
diff --git a/indra/newview/llfloaterfriends.cpp b/indra/newview/llfloaterfriends.cpp
deleted file mode 100644
index f93568d617..0000000000
--- a/indra/newview/llfloaterfriends.cpp
+++ /dev/null
@@ -1,807 +0,0 @@
-/**
- * @file llfloaterfriends.cpp
- * @author Phoenix
- * @date 2005-01-13
- * @brief Implementation of the friends floater
- *
- * $LicenseInfo:firstyear=2005&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-
-#include "llviewerprecompiledheaders.h"
-
-#include "llfloaterfriends.h"
-
-#include <sstream>
-
-#include "lldir.h"
-
-#include "llagent.h"
-#include "llappviewer.h" // for gLastVersionChannel
-#include "llfloateravatarpicker.h"
-#include "llviewerwindow.h"
-#include "llbutton.h"
-#include "llavataractions.h"
-#include "llinventorymodel.h"
-#include "llnamelistctrl.h"
-#include "llnotificationsutil.h"
-#include "llresmgr.h"
-#include "llscrolllistctrl.h"
-#include "llscrolllistitem.h"
-#include "llscrolllistcell.h"
-#include "lluictrlfactory.h"
-#include "llmenucommands.h"
-#include "llviewercontrol.h"
-#include "llviewermessage.h"
-#include "lleventtimer.h"
-#include "lltextbox.h"
-#include "llvoiceclient.h"
-
-// *TODO: Move more common stuff to LLAvatarActions?
-
-//Maximum number of people you can select to do an operation on at once.
-#define MAX_FRIEND_SELECT 20
-#define DEFAULT_PERIOD 5.0
-#define RIGHTS_CHANGE_TIMEOUT 5.0
-#define OBSERVER_TIMEOUT 0.5
-
-#define ONLINE_SIP_ICON_NAME "slim_icon_16_viewer.tga"
-
-// simple class to observe the calling cards.
-class LLLocalFriendsObserver : public LLFriendObserver, public LLEventTimer
-{
-public:
- LLLocalFriendsObserver(LLPanelFriends* floater) : mFloater(floater), LLEventTimer(OBSERVER_TIMEOUT)
- {
- mEventTimer.stop();
- }
- virtual ~LLLocalFriendsObserver()
- {
- mFloater = NULL;
- }
- virtual void changed(U32 mask)
- {
- // events can arrive quickly in bulk - we need not process EVERY one of them -
- // so we wait a short while to let others pile-in, and process them in aggregate.
- mEventTimer.start();
-
- // save-up all the mask-bits which have come-in
- mMask |= mask;
- }
- virtual BOOL tick()
- {
- mFloater->updateFriends(mMask);
-
- mEventTimer.stop();
- mMask = 0;
-
- return FALSE;
- }
-
-protected:
- LLPanelFriends* mFloater;
- U32 mMask;
-};
-
-LLPanelFriends::LLPanelFriends() :
- LLPanel(),
- LLEventTimer(DEFAULT_PERIOD),
- mObserver(NULL),
- mShowMaxSelectWarning(TRUE),
- mAllowRightsChange(TRUE),
- mNumRightsChanged(0)
-{
- mEventTimer.stop();
- mObserver = new LLLocalFriendsObserver(this);
- LLAvatarTracker::instance().addObserver(mObserver);
- // For notification when SIP online status changes.
- LLVoiceClient::getInstance()->addObserver(mObserver);
-}
-
-LLPanelFriends::~LLPanelFriends()
-{
- // For notification when SIP online status changes.
- LLVoiceClient::getInstance()->removeObserver(mObserver);
- LLAvatarTracker::instance().removeObserver(mObserver);
- delete mObserver;
-}
-
-BOOL LLPanelFriends::tick()
-{
- mEventTimer.stop();
- mPeriod = DEFAULT_PERIOD;
- mAllowRightsChange = TRUE;
- updateFriends(LLFriendObserver::ADD);
- return FALSE;
-}
-
-void LLPanelFriends::updateFriends(U32 changed_mask)
-{
- LLUUID selected_id;
- LLCtrlListInterface *friends_list = childGetListInterface("friend_list");
- if (!friends_list) return;
- LLCtrlScrollInterface *friends_scroll = childGetScrollInterface("friend_list");
- if (!friends_scroll) return;
-
- // We kill the selection warning, otherwise we'll spam with warning popups
- // if the maximum amount of friends are selected
- mShowMaxSelectWarning = false;
-
- std::vector<LLUUID> selected_friends = getSelectedIDs();
- if(changed_mask & (LLFriendObserver::ADD | LLFriendObserver::REMOVE | LLFriendObserver::ONLINE))
- {
- refreshNames(changed_mask);
- }
- else if(changed_mask & LLFriendObserver::POWERS)
- {
- --mNumRightsChanged;
- if(mNumRightsChanged > 0)
- {
- mPeriod = RIGHTS_CHANGE_TIMEOUT;
- mEventTimer.start();
- mAllowRightsChange = FALSE;
- }
- else
- {
- tick();
- }
- }
- if(selected_friends.size() > 0)
- {
- // only non-null if friends was already found. This may fail,
- // but we don't really care here, because refreshUI() will
- // clean up the interface.
- friends_list->setCurrentByID(selected_id);
- for(std::vector<LLUUID>::iterator itr = selected_friends.begin(); itr != selected_friends.end(); ++itr)
- {
- friends_list->setSelectedByValue(*itr, true);
- }
- }
-
- refreshUI();
- mShowMaxSelectWarning = true;
-}
-
-// virtual
-BOOL LLPanelFriends::postBuild()
-{
- mFriendsList = getChild<LLScrollListCtrl>("friend_list");
- mFriendsList->setMaxSelectable(MAX_FRIEND_SELECT);
- mFriendsList->setMaximumSelectCallback(boost::bind(&LLPanelFriends::onMaximumSelect));
- mFriendsList->setCommitOnSelectionChange(TRUE);
- mFriendsList->setContextMenu(LLScrollListCtrl::MENU_AVATAR);
- childSetCommitCallback("friend_list", onSelectName, this);
- getChild<LLScrollListCtrl>("friend_list")->setDoubleClickCallback(onClickIM, this);
-
- U32 changed_mask = LLFriendObserver::ADD | LLFriendObserver::REMOVE | LLFriendObserver::ONLINE;
- refreshNames(changed_mask);
-
- childSetAction("im_btn", onClickIM, this);
- childSetAction("profile_btn", onClickProfile, this);
- childSetAction("offer_teleport_btn", onClickOfferTeleport, this);
- childSetAction("pay_btn", onClickPay, this);
- childSetAction("add_btn", onClickAddFriend, this);
- childSetAction("remove_btn", onClickRemove, this);
-
- setDefaultBtn("im_btn");
-
- updateFriends(LLFriendObserver::ADD);
- refreshUI();
-
- // primary sort = online status, secondary sort = name
- mFriendsList->sortByColumn(std::string("friend_name"), TRUE);
- mFriendsList->sortByColumn(std::string("icon_online_status"), FALSE);
-
- return TRUE;
-}
-
-BOOL LLPanelFriends::addFriend(const LLUUID& agent_id)
-{
- LLAvatarTracker& at = LLAvatarTracker::instance();
- const LLRelationship* relationInfo = at.getBuddyInfo(agent_id);
- if(!relationInfo) return FALSE;
-
- bool isOnlineSIP = LLVoiceClient::getInstance()->isOnlineSIP(agent_id);
- bool isOnline = relationInfo->isOnline();
-
- std::string fullname;
- BOOL have_name = gCacheName->getFullName(agent_id, fullname);
-
- LLSD element;
- element["id"] = agent_id;
- LLSD& friend_column = element["columns"][LIST_FRIEND_NAME];
- friend_column["column"] = "friend_name";
- friend_column["value"] = fullname;
- friend_column["font"]["name"] = "SANSSERIF";
- friend_column["font"]["style"] = "NORMAL";
-
- LLSD& online_status_column = element["columns"][LIST_ONLINE_STATUS];
- online_status_column["column"] = "icon_online_status";
- online_status_column["type"] = "icon";
-
- if (isOnline)
- {
- friend_column["font"]["style"] = "BOLD";
- online_status_column["value"] = "icon_avatar_online.tga";
- }
- else if(isOnlineSIP)
- {
- friend_column["font"]["style"] = "BOLD";
- online_status_column["value"] = ONLINE_SIP_ICON_NAME;
- }
-
- LLSD& online_column = element["columns"][LIST_VISIBLE_ONLINE];
- online_column["column"] = "icon_visible_online";
- online_column["type"] = "checkbox";
- online_column["value"] = relationInfo->isRightGrantedTo(LLRelationship::GRANT_ONLINE_STATUS);
-
- LLSD& visible_map_column = element["columns"][LIST_VISIBLE_MAP];
- visible_map_column["column"] = "icon_visible_map";
- visible_map_column["type"] = "checkbox";
- visible_map_column["value"] = relationInfo->isRightGrantedTo(LLRelationship::GRANT_MAP_LOCATION);
-
- LLSD& edit_my_object_column = element["columns"][LIST_EDIT_MINE];
- edit_my_object_column["column"] = "icon_edit_mine";
- edit_my_object_column["type"] = "checkbox";
- edit_my_object_column["value"] = relationInfo->isRightGrantedTo(LLRelationship::GRANT_MODIFY_OBJECTS);
-
- LLSD& edit_their_object_column = element["columns"][LIST_EDIT_THEIRS];
- edit_their_object_column["column"] = "icon_edit_theirs";
- edit_their_object_column["type"] = "checkbox";
- edit_their_object_column["enabled"] = "";
- edit_their_object_column["value"] = relationInfo->isRightGrantedFrom(LLRelationship::GRANT_MODIFY_OBJECTS);
-
- LLSD& update_gen_column = element["columns"][LIST_FRIEND_UPDATE_GEN];
- update_gen_column["column"] = "friend_last_update_generation";
- update_gen_column["value"] = have_name ? relationInfo->getChangeSerialNum() : -1;
-
- mFriendsList->addElement(element, ADD_BOTTOM);
- return have_name;
-}
-
-// propagate actual relationship to UI.
-// Does not resort the UI list because it can be called frequently. JC
-BOOL LLPanelFriends::updateFriendItem(const LLUUID& agent_id, const LLRelationship* info)
-{
- if (!info) return FALSE;
- LLScrollListItem* itemp = mFriendsList->getItem(agent_id);
- if (!itemp) return FALSE;
-
- bool isOnlineSIP = LLVoiceClient::getInstance()->isOnlineSIP(itemp->getUUID());
- bool isOnline = info->isOnline();
-
- std::string fullname;
- BOOL have_name = gCacheName->getFullName(agent_id, fullname);
-
- // Name of the status icon to use
- std::string statusIcon;
-
- if(isOnline)
- {
- statusIcon = "icon_avatar_online.tga";
- }
- else if(isOnlineSIP)
- {
- statusIcon = ONLINE_SIP_ICON_NAME;
- }
-
- itemp->getColumn(LIST_ONLINE_STATUS)->setValue(statusIcon);
-
- itemp->getColumn(LIST_FRIEND_NAME)->setValue(fullname);
- // render name of online friends in bold text
- ((LLScrollListText*)itemp->getColumn(LIST_FRIEND_NAME))->setFontStyle((isOnline || isOnlineSIP) ? LLFontGL::BOLD : LLFontGL::NORMAL);
- itemp->getColumn(LIST_VISIBLE_ONLINE)->setValue(info->isRightGrantedTo(LLRelationship::GRANT_ONLINE_STATUS));
- itemp->getColumn(LIST_VISIBLE_MAP)->setValue(info->isRightGrantedTo(LLRelationship::GRANT_MAP_LOCATION));
- itemp->getColumn(LIST_EDIT_MINE)->setValue(info->isRightGrantedTo(LLRelationship::GRANT_MODIFY_OBJECTS));
- S32 change_generation = have_name ? info->getChangeSerialNum() : -1;
- itemp->getColumn(LIST_FRIEND_UPDATE_GEN)->setValue(change_generation);
-
- // enable this item, in case it was disabled after user input
- itemp->setEnabled(TRUE);
-
- // Do not resort, this function can be called frequently.
- return have_name;
-}
-
-void LLPanelFriends::refreshRightsChangeList()
-{
- std::vector<LLUUID> friends = getSelectedIDs();
- S32 num_selected = friends.size();
-
- bool can_offer_teleport = num_selected >= 1;
- bool selected_friends_online = true;
-
- const LLRelationship* friend_status = NULL;
- for(std::vector<LLUUID>::iterator itr = friends.begin(); itr != friends.end(); ++itr)
- {
- friend_status = LLAvatarTracker::instance().getBuddyInfo(*itr);
- if (friend_status)
- {
- if(!friend_status->isOnline())
- {
- can_offer_teleport = false;
- selected_friends_online = false;
- }
- }
- else // missing buddy info, don't allow any operations
- {
- can_offer_teleport = false;
- }
- }
-
- if (num_selected == 0) // nothing selected
- {
- childSetEnabled("im_btn", FALSE);
- childSetEnabled("offer_teleport_btn", FALSE);
- }
- else // we have at least one friend selected...
- {
- // only allow IMs to groups when everyone in the group is online
- // to be consistent with context menus in inventory and because otherwise
- // offline friends would be silently dropped from the session
- childSetEnabled("im_btn", selected_friends_online || num_selected == 1);
- childSetEnabled("offer_teleport_btn", can_offer_teleport);
- }
-}
-
-struct SortFriendsByID
-{
- bool operator() (const LLScrollListItem* const a, const LLScrollListItem* const b) const
- {
- return a->getValue().asUUID() < b->getValue().asUUID();
- }
-};
-
-void LLPanelFriends::refreshNames(U32 changed_mask)
-{
- std::vector<LLUUID> selected_ids = getSelectedIDs();
- S32 pos = mFriendsList->getScrollPos();
-
- // get all buddies we know about
- LLAvatarTracker::buddy_map_t all_buddies;
- LLAvatarTracker::instance().copyBuddyList(all_buddies);
-
- BOOL have_names = TRUE;
-
- if(changed_mask & (LLFriendObserver::ADD | LLFriendObserver::REMOVE))
- {
- have_names &= refreshNamesSync(all_buddies);
- }
-
- if(changed_mask & LLFriendObserver::ONLINE)
- {
- have_names &= refreshNamesPresence(all_buddies);
- }
-
- if (!have_names)
- {
- mEventTimer.start();
- }
- // Changed item in place, need to request sort and update columns
- // because we might have changed data in a column on which the user
- // has already sorted. JC
- mFriendsList->updateSort();
-
- // re-select items
- mFriendsList->selectMultiple(selected_ids);
- mFriendsList->setScrollPos(pos);
-}
-
-BOOL LLPanelFriends::refreshNamesSync(const LLAvatarTracker::buddy_map_t & all_buddies)
-{
- mFriendsList->deleteAllItems();
-
- BOOL have_names = TRUE;
- LLAvatarTracker::buddy_map_t::const_iterator buddy_it = all_buddies.begin();
-
- for(; buddy_it != all_buddies.end(); ++buddy_it)
- {
- have_names &= addFriend(buddy_it->first);
- }
-
- return have_names;
-}
-
-BOOL LLPanelFriends::refreshNamesPresence(const LLAvatarTracker::buddy_map_t & all_buddies)
-{
- std::vector<LLScrollListItem*> items = mFriendsList->getAllData();
- std::sort(items.begin(), items.end(), SortFriendsByID());
-
- LLAvatarTracker::buddy_map_t::const_iterator buddy_it = all_buddies.begin();
- std::vector<LLScrollListItem*>::const_iterator item_it = items.begin();
- BOOL have_names = TRUE;
-
- while(true)
- {
- if(item_it == items.end() || buddy_it == all_buddies.end())
- {
- break;
- }
-
- const LLUUID & buddy_uuid = buddy_it->first;
- const LLUUID & item_uuid = (*item_it)->getValue().asUUID();
- if(item_uuid == buddy_uuid)
- {
- const LLRelationship* info = buddy_it->second;
- if (!info)
- {
- ++item_it;
- continue;
- }
-
- S32 last_change_generation = (*item_it)->getColumn(LIST_FRIEND_UPDATE_GEN)->getValue().asInteger();
- if (last_change_generation < info->getChangeSerialNum())
- {
- // update existing item in UI
- have_names &= updateFriendItem(buddy_it->first, info);
- }
-
- ++buddy_it;
- ++item_it;
- }
- else if(item_uuid < buddy_uuid)
- {
- ++item_it;
- }
- else //if(item_uuid > buddy_uuid)
- {
- ++buddy_it;
- }
- }
-
- return have_names;
-}
-
-void LLPanelFriends::refreshUI()
-{
- BOOL single_selected = FALSE;
- BOOL multiple_selected = FALSE;
- int num_selected = mFriendsList->getAllSelected().size();
- if(num_selected > 0)
- {
- single_selected = TRUE;
- if(num_selected > 1)
- {
- multiple_selected = TRUE;
- }
- }
-
-
- //Options that can only be performed with one friend selected
- childSetEnabled("profile_btn", single_selected && !multiple_selected);
- childSetEnabled("pay_btn", single_selected && !multiple_selected);
-
- //Options that can be performed with up to MAX_FRIEND_SELECT friends selected
- //(single_selected will always be true in this situations)
- childSetEnabled("remove_btn", single_selected);
- childSetEnabled("im_btn", single_selected);
-// childSetEnabled("friend_rights", single_selected);
-
- refreshRightsChangeList();
-}
-
-std::vector<LLUUID> LLPanelFriends::getSelectedIDs()
-{
- LLUUID selected_id;
- std::vector<LLUUID> friend_ids;
- std::vector<LLScrollListItem*> selected = mFriendsList->getAllSelected();
- for(std::vector<LLScrollListItem*>::iterator itr = selected.begin(); itr != selected.end(); ++itr)
- {
- friend_ids.push_back((*itr)->getUUID());
- }
- return friend_ids;
-}
-
-// static
-void LLPanelFriends::onSelectName(LLUICtrl* ctrl, void* user_data)
-{
- LLPanelFriends* panelp = (LLPanelFriends*)user_data;
-
- if(panelp)
- {
- panelp->refreshUI();
- // check to see if rights have changed
- panelp->applyRightsToFriends();
- }
-}
-
-//static
-void LLPanelFriends::onMaximumSelect()
-{
- LLSD args;
- args["MAX_SELECT"] = llformat("%d", MAX_FRIEND_SELECT);
- LLNotificationsUtil::add("MaxListSelectMessage", args);
-};
-
-// static
-void LLPanelFriends::onClickProfile(void* user_data)
-{
- LLPanelFriends* panelp = (LLPanelFriends*)user_data;
-
- std::vector<LLUUID> ids = panelp->getSelectedIDs();
- if(ids.size() > 0)
- {
- LLUUID agent_id = ids[0];
- LLAvatarActions::showProfile(agent_id);
- }
-}
-
-// static
-void LLPanelFriends::onClickIM(void* user_data)
-{
- LLPanelFriends* panelp = (LLPanelFriends*)user_data;
-
- std::vector<LLUUID> ids = panelp->getSelectedIDs();
- if(ids.size() > 0)
- {
- if(ids.size() == 1)
- {
- LLAvatarActions::startIM(ids[0]);
- }
- else
- {
- LLAvatarActions::startConference(ids);
- }
- }
-}
-
-// static
-void LLPanelFriends::onPickAvatar(const std::vector<std::string>& names,
- const std::vector<LLUUID>& ids)
-{
- if (names.empty()) return;
- if (ids.empty()) return;
- LLAvatarActions::requestFriendshipDialog(ids[0], names[0]);
-}
-
-// static
-void LLPanelFriends::onClickAddFriend(void* user_data)
-{
- LLPanelFriends* panelp = (LLPanelFriends*)user_data;
- LLFloater* root_floater = gFloaterView->getParentFloater(panelp);
- LLFloaterAvatarPicker* picker = LLFloaterAvatarPicker::show(boost::bind(&LLPanelFriends::onPickAvatar, _1,_2), FALSE, TRUE);
- if (root_floater)
- {
- root_floater->addDependentFloater(picker);
- }
-}
-
-// static
-void LLPanelFriends::onClickRemove(void* user_data)
-{
- LLPanelFriends* panelp = (LLPanelFriends*)user_data;
- LLAvatarActions::removeFriendsDialog(panelp->getSelectedIDs());
-}
-
-// static
-void LLPanelFriends::onClickOfferTeleport(void* user_data)
-{
- LLPanelFriends* panelp = (LLPanelFriends*)user_data;
- LLAvatarActions::offerTeleport(panelp->getSelectedIDs());
-}
-
-// static
-void LLPanelFriends::onClickPay(void* user_data)
-{
- LLPanelFriends* panelp = (LLPanelFriends*)user_data;
-
- std::vector<LLUUID> ids = panelp->getSelectedIDs();
- if(ids.size() == 1)
- {
- LLAvatarActions::pay(ids[0]);
- }
-}
-
-void LLPanelFriends::confirmModifyRights(rights_map_t& ids, EGrantRevoke command)
-{
- if (ids.empty()) return;
-
- LLSD args;
- if(ids.size() > 0)
- {
- rights_map_t* rights = new rights_map_t(ids);
-
- // for single friend, show their name
- if(ids.size() == 1)
- {
- LLUUID agent_id = ids.begin()->first;
- std::string first, last;
- if(gCacheName->getName(agent_id, first, last))
- {
- args["FIRST_NAME"] = first;
- args["LAST_NAME"] = last;
- }
- if (command == GRANT)
- {
- LLNotificationsUtil::add("GrantModifyRights",
- args,
- LLSD(),
- boost::bind(&LLPanelFriends::modifyRightsConfirmation, this, _1, _2, rights));
- }
- else
- {
- LLNotificationsUtil::add("RevokeModifyRights",
- args,
- LLSD(),
- boost::bind(&LLPanelFriends::modifyRightsConfirmation, this, _1, _2, rights));
- }
- }
- else
- {
- if (command == GRANT)
- {
- LLNotificationsUtil::add("GrantModifyRightsMultiple",
- args,
- LLSD(),
- boost::bind(&LLPanelFriends::modifyRightsConfirmation, this, _1, _2, rights));
- }
- else
- {
- LLNotificationsUtil::add("RevokeModifyRightsMultiple",
- args,
- LLSD(),
- boost::bind(&LLPanelFriends::modifyRightsConfirmation, this, _1, _2, rights));
- }
- }
- }
-}
-
-bool LLPanelFriends::modifyRightsConfirmation(const LLSD& notification, const LLSD& response, rights_map_t* rights)
-{
- S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
- if(0 == option)
- {
- sendRightsGrant(*rights);
- }
- else
- {
- // need to resync view with model, since user cancelled operation
- rights_map_t::iterator rights_it;
- for (rights_it = rights->begin(); rights_it != rights->end(); ++rights_it)
- {
- const LLRelationship* info = LLAvatarTracker::instance().getBuddyInfo(rights_it->first);
- updateFriendItem(rights_it->first, info);
- }
- }
- refreshUI();
-
- delete rights;
- return false;
-}
-
-void LLPanelFriends::applyRightsToFriends()
-{
- BOOL rights_changed = FALSE;
-
- // store modify rights separately for confirmation
- rights_map_t rights_updates;
-
- BOOL need_confirmation = FALSE;
- EGrantRevoke confirmation_type = GRANT;
-
- // this assumes that changes only happened to selected items
- std::vector<LLScrollListItem*> selected = mFriendsList->getAllSelected();
- for(std::vector<LLScrollListItem*>::iterator itr = selected.begin(); itr != selected.end(); ++itr)
- {
- LLUUID id = (*itr)->getValue();
- const LLRelationship* buddy_relationship = LLAvatarTracker::instance().getBuddyInfo(id);
- if (buddy_relationship == NULL) continue;
-
- bool show_online_staus = (*itr)->getColumn(LIST_VISIBLE_ONLINE)->getValue().asBoolean();
- bool show_map_location = (*itr)->getColumn(LIST_VISIBLE_MAP)->getValue().asBoolean();
- bool allow_modify_objects = (*itr)->getColumn(LIST_EDIT_MINE)->getValue().asBoolean();
-
- S32 rights = buddy_relationship->getRightsGrantedTo();
- if(buddy_relationship->isRightGrantedTo(LLRelationship::GRANT_ONLINE_STATUS) != show_online_staus)
- {
- rights_changed = TRUE;
- if(show_online_staus)
- {
- rights |= LLRelationship::GRANT_ONLINE_STATUS;
- }
- else
- {
- // ONLINE_STATUS necessary for MAP_LOCATION
- rights &= ~LLRelationship::GRANT_ONLINE_STATUS;
- rights &= ~LLRelationship::GRANT_MAP_LOCATION;
- // propagate rights constraint to UI
- (*itr)->getColumn(LIST_VISIBLE_MAP)->setValue(FALSE);
- }
- }
- if(buddy_relationship->isRightGrantedTo(LLRelationship::GRANT_MAP_LOCATION) != show_map_location)
- {
- rights_changed = TRUE;
- if(show_map_location)
- {
- // ONLINE_STATUS necessary for MAP_LOCATION
- rights |= LLRelationship::GRANT_MAP_LOCATION;
- rights |= LLRelationship::GRANT_ONLINE_STATUS;
- (*itr)->getColumn(LIST_VISIBLE_ONLINE)->setValue(TRUE);
- }
- else
- {
- rights &= ~LLRelationship::GRANT_MAP_LOCATION;
- }
- }
-
- // now check for change in modify object rights, which requires confirmation
- if(buddy_relationship->isRightGrantedTo(LLRelationship::GRANT_MODIFY_OBJECTS) != allow_modify_objects)
- {
- rights_changed = TRUE;
- need_confirmation = TRUE;
-
- if(allow_modify_objects)
- {
- rights |= LLRelationship::GRANT_MODIFY_OBJECTS;
- confirmation_type = GRANT;
- }
- else
- {
- rights &= ~LLRelationship::GRANT_MODIFY_OBJECTS;
- confirmation_type = REVOKE;
- }
- }
-
- if (rights_changed)
- {
- rights_updates.insert(std::make_pair(id, rights));
- // disable these ui elements until response from server
- // to avoid race conditions
- (*itr)->setEnabled(FALSE);
- }
- }
-
- // separately confirm grant and revoke of modify rights
- if (need_confirmation)
- {
- confirmModifyRights(rights_updates, confirmation_type);
- }
- else
- {
- sendRightsGrant(rights_updates);
- }
-}
-
-void LLPanelFriends::sendRightsGrant(rights_map_t& ids)
-{
- if (ids.empty()) return;
-
- LLMessageSystem* msg = gMessageSystem;
-
- // setup message header
- msg->newMessageFast(_PREHASH_GrantUserRights);
- msg->nextBlockFast(_PREHASH_AgentData);
- msg->addUUID(_PREHASH_AgentID, gAgent.getID());
- msg->addUUID(_PREHASH_SessionID, gAgent.getSessionID());
-
- rights_map_t::iterator id_it;
- rights_map_t::iterator end_it = ids.end();
- for(id_it = ids.begin(); id_it != end_it; ++id_it)
- {
- msg->nextBlockFast(_PREHASH_Rights);
- msg->addUUID(_PREHASH_AgentRelated, id_it->first);
- msg->addS32(_PREHASH_RelatedRights, id_it->second);
- }
-
- mNumRightsChanged = ids.size();
- gAgent.sendReliableMessage();
-}
diff --git a/indra/newview/llfloaterfriends.h b/indra/newview/llfloaterfriends.h
deleted file mode 100644
index a303477c95..0000000000
--- a/indra/newview/llfloaterfriends.h
+++ /dev/null
@@ -1,140 +0,0 @@
-/**
- * @file llfloaterfriends.h
- * @author Phoenix
- * @date 2005-01-13
- * @brief Declaration of class for displaying the local agent's friends.
- *
- * $LicenseInfo:firstyear=2005&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-#ifndef LL_LLFLOATERFRIENDS_H
-#define LL_LLFLOATERFRIENDS_H
-
-#include "llpanel.h"
-#include "llstring.h"
-#include "lluuid.h"
-#include "lltimer.h"
-#include "llcallingcard.h"
-
-class LLFriendObserver;
-class LLRelationship;
-class LLScrollListItem;
-class LLScrollListCtrl;
-
-/**
- * @class LLPanelFriends
- * @brief An instance of this class is used for displaying your friends
- * and gives you quick access to all agents which a user relationship.
- *
- * @sa LLFloater
- */
-class LLPanelFriends : public LLPanel, public LLEventTimer
-{
-public:
- LLPanelFriends();
- virtual ~LLPanelFriends();
-
- /**
- * @brief This method either creates or brings to the front the
- * current instantiation of this floater. There is only once since
- * you can currently only look at your local friends.
- */
- virtual BOOL tick();
-
- /**
- * @brief This method is called in response to the LLAvatarTracker
- * sending out a changed() message.
- */
- void updateFriends(U32 changed_mask);
-
- virtual BOOL postBuild();
-
- // *HACK Made public to remove friends from LLAvatarIconCtrl context menu
- static bool handleRemove(const LLSD& notification, const LLSD& response);
-
-private:
-
- enum FRIENDS_COLUMN_ORDER
- {
- LIST_ONLINE_STATUS,
- LIST_FRIEND_NAME,
- LIST_VISIBLE_ONLINE,
- LIST_VISIBLE_MAP,
- LIST_EDIT_MINE,
- LIST_EDIT_THEIRS,
- LIST_FRIEND_UPDATE_GEN
- };
-
- // protected members
- typedef std::map<LLUUID, S32> rights_map_t;
- void refreshNames(U32 changed_mask);
- BOOL refreshNamesSync(const LLAvatarTracker::buddy_map_t & all_buddies);
- BOOL refreshNamesPresence(const LLAvatarTracker::buddy_map_t & all_buddies);
- void refreshUI();
- void refreshRightsChangeList();
- void applyRightsToFriends();
- BOOL addFriend(const LLUUID& agent_id);
- BOOL updateFriendItem(const LLUUID& agent_id, const LLRelationship* relationship);
-
- typedef enum
- {
- GRANT,
- REVOKE
- } EGrantRevoke;
- void confirmModifyRights(rights_map_t& ids, EGrantRevoke command);
- void sendRightsGrant(rights_map_t& ids);
-
- // return empty vector if nothing is selected
- std::vector<LLUUID> getSelectedIDs();
-
- // callback methods
- static void onSelectName(LLUICtrl* ctrl, void* user_data);
- static bool callbackAddFriend(const LLSD& notification, const LLSD& response);
- static bool callbackAddFriendWithMessage(const LLSD& notification, const LLSD& response);
- static void onPickAvatar(const std::vector<std::string>& names, const std::vector<LLUUID>& ids);
- static void onMaximumSelect();
-
- static void onClickIM(void* user_data);
- static void onClickProfile(void* user_data);
- static void onClickAddFriend(void* user_data);
- static void onClickRemove(void* user_data);
-
- static void onClickOfferTeleport(void* user_data);
- static void onClickPay(void* user_data);
-
- static void onClickModifyStatus(LLUICtrl* ctrl, void* user_data);
-
- bool modifyRightsConfirmation(const LLSD& notification, const LLSD& response, rights_map_t* rights);
-
-private:
- // member data
- LLFriendObserver* mObserver;
- LLUUID mAddFriendID;
- std::string mAddFriendName;
- LLScrollListCtrl* mFriendsList;
- BOOL mShowMaxSelectWarning;
- BOOL mAllowRightsChange;
- S32 mNumRightsChanged;
-};
-
-
-#endif // LL_LLFLOATERFRIENDS_H
diff --git a/indra/newview/llfloaterhardwaresettings.cpp b/indra/newview/llfloaterhardwaresettings.cpp
index 42ec7d765b..f9a403cf9f 100644
--- a/indra/newview/llfloaterhardwaresettings.cpp
+++ b/indra/newview/llfloaterhardwaresettings.cpp
@@ -34,7 +34,9 @@
#include "llviewercontrol.h"
#include "llviewertexturelist.h"
#include "llfeaturemanager.h"
+#include "llspinctrl.h"
#include "llstartup.h"
+#include "lltextbox.h"
#include "pipeline.h"
// Linden library includes
@@ -98,18 +100,40 @@ void LLFloaterHardwareSettings::refreshEnabledState()
}
// if no windlight shaders, turn off nighttime brightness, gamma, and fog distance
- getChildView("gamma")->setEnabled(!gPipeline.canUseWindLightShaders());
+ LLSpinCtrl* gamma_ctrl = getChild<LLSpinCtrl>("gamma");
+ gamma_ctrl->setEnabled(!gPipeline.canUseWindLightShaders());
getChildView("(brightness, lower is brighter)")->setEnabled(!gPipeline.canUseWindLightShaders());
getChildView("fog")->setEnabled(!gPipeline.canUseWindLightShaders());
- getChildView("fsaa")->setEnabled(gPipeline.canUseAntiAliasing());
- getChildView("antialiasing restart")->setVisible(!gSavedSettings.getBOOL("RenderDeferred"));
- /* Enable to reset fsaa value to disabled when feature is not available.
- if (!gPipeline.canUseAntiAliasing())
+ // anti-aliasing
{
- getChild<LLUICtrl>("fsaa")->setValue((LLSD::Integer) 0);
+ LLUICtrl* fsaa_ctrl = getChild<LLUICtrl>("fsaa");
+ LLTextBox* fsaa_text = getChild<LLTextBox>("antialiasing label");
+ LLView* fsaa_restart = getChildView("antialiasing restart");
+
+ // Enable or disable the control, the "Antialiasing:" label and the restart warning
+ // based on code support for the feature on the current hardware.
+
+ if (gPipeline.canUseAntiAliasing())
+ {
+ fsaa_ctrl->setEnabled(TRUE);
+
+ // borrow the text color from the gamma control for consistency
+ fsaa_text->setColor(gamma_ctrl->getEnabledTextColor());
+
+ fsaa_restart->setVisible(!gSavedSettings.getBOOL("RenderDeferred"));
+ }
+ else
+ {
+ fsaa_ctrl->setEnabled(FALSE);
+ fsaa_ctrl->setValue((LLSD::Integer) 0);
+
+ // borrow the text color from the gamma control for consistency
+ fsaa_text->setColor(gamma_ctrl->getDisabledTextColor());
+
+ fsaa_restart->setVisible(FALSE);
+ }
}
- */
}
//============================================================================
diff --git a/indra/newview/llfloaterhelpbrowser.cpp b/indra/newview/llfloaterhelpbrowser.cpp
index 3012638d44..fd9c37ae73 100644
--- a/indra/newview/llfloaterhelpbrowser.cpp
+++ b/indra/newview/llfloaterhelpbrowser.cpp
@@ -39,6 +39,7 @@
#include "llurlhistory.h"
#include "llmediactrl.h"
#include "llviewermedia.h"
+#include "llviewerhelp.h"
LLFloaterHelpBrowser::LLFloaterHelpBrowser(const LLSD& key)
@@ -74,6 +75,17 @@ void LLFloaterHelpBrowser::buildURLHistory()
void LLFloaterHelpBrowser::onOpen(const LLSD& key)
{
gSavedSettings.setBOOL("HelpFloaterOpen", TRUE);
+
+ std::string topic = key.asString();
+
+ if (topic == "__local")
+ {
+ mBrowser->navigateToLocalPage( "help-offline" , "index.html" );
+ }
+ else
+ {
+ mBrowser->navigateTo(LLViewerHelp::instance().getURL(topic));
+ }
}
//virtual
@@ -148,8 +160,3 @@ void LLFloaterHelpBrowser::openMedia(const std::string& media_url)
mBrowser->navigateTo(media_url, "text/html");
setCurrentURL(media_url);
}
-
-void LLFloaterHelpBrowser::navigateToLocalPage( const std::string& subdir, const std::string& filename_in )
-{
- mBrowser->navigateToLocalPage(subdir, filename_in);
-}
diff --git a/indra/newview/llfloaterhelpbrowser.h b/indra/newview/llfloaterhelpbrowser.h
index afe0f4df69..bf4f544a14 100644
--- a/indra/newview/llfloaterhelpbrowser.h
+++ b/indra/newview/llfloaterhelpbrowser.h
@@ -1,5 +1,5 @@
/**
- * @file llfloatermediabrowser.h
+ * @file llfloaterhelpbrowser.h
* @brief HTML Help floater - uses embedded web browser control
*
* $LicenseInfo:firstyear=2006&license=viewerlgpl$
@@ -48,8 +48,6 @@ class LLFloaterHelpBrowser :
/*virtual*/ void handleMediaEvent(LLPluginClassMedia* self, EMediaEvent event);
void openMedia(const std::string& media_url);
-
- void navigateToLocalPage( const std::string& subdir, const std::string& filename_in );
private:
void buildURLHistory();
diff --git a/indra/newview/llfloaterhud.cpp b/indra/newview/llfloaterhud.cpp
index 4181d1906e..58c76a0b85 100644
--- a/indra/newview/llfloaterhud.cpp
+++ b/indra/newview/llfloaterhud.cpp
@@ -54,14 +54,6 @@ LLFloaterHUD::LLFloaterHUD(const LLSD& key)
return;
}
- // Don't grab the focus as it will impede performing in-world actions
- // while using the HUD
- setIsChrome(TRUE);
-
- // Chrome doesn't show the window title by default, but here we
- // want to show it.
- setTitleVisible(true);
-
// Opaque background since we never get the focus
setBackgroundOpaque(TRUE);
}
diff --git a/indra/newview/llfloaterimagepreview.cpp b/indra/newview/llfloaterimagepreview.cpp
index e4d8e3513d..92ee8ddac6 100644
--- a/indra/newview/llfloaterimagepreview.cpp
+++ b/indra/newview/llfloaterimagepreview.cpp
@@ -50,6 +50,7 @@
#include "llvoavatar.h"
#include "pipeline.h"
#include "lluictrlfactory.h"
+#include "llviewershadermgr.h"
#include "llviewertexturelist.h"
#include "llstring.h"
@@ -62,6 +63,7 @@
const S32 PREVIEW_BORDER_WIDTH = 2;
const S32 PREVIEW_RESIZE_HANDLE_SIZE = S32(RESIZE_HANDLE_WIDTH * OO_SQRT2) + PREVIEW_BORDER_WIDTH;
const S32 PREVIEW_HPAD = PREVIEW_RESIZE_HANDLE_SIZE;
+const S32 PREVIEW_VPAD = -24; // yuk, hard coded
const S32 PREF_BUTTON_HEIGHT = 16 + 7 + 16;
const S32 PREVIEW_TEXTURE_HEIGHT = 320;
@@ -98,7 +100,7 @@ BOOL LLFloaterImagePreview::postBuild()
childSetCommitCallback("clothing_type_combo", onPreviewTypeCommit, this);
mPreviewRect.set(PREVIEW_HPAD,
- PREVIEW_TEXTURE_HEIGHT,
+ PREVIEW_TEXTURE_HEIGHT + PREVIEW_VPAD,
getRect().getWidth() - PREVIEW_HPAD,
PREVIEW_HPAD + PREF_BUTTON_HEIGHT + PREVIEW_HPAD);
mPreviewImageRect.set(0.f, 1.f, 1.f, 0.f);
@@ -270,13 +272,13 @@ void LLFloaterImagePreview::draw()
gGL.begin( LLRender::QUADS );
{
gGL.texCoord2f(mPreviewImageRect.mLeft, mPreviewImageRect.mTop);
- gGL.vertex2i(PREVIEW_HPAD, PREVIEW_TEXTURE_HEIGHT);
+ gGL.vertex2i(PREVIEW_HPAD, PREVIEW_TEXTURE_HEIGHT + PREVIEW_VPAD);
gGL.texCoord2f(mPreviewImageRect.mLeft, mPreviewImageRect.mBottom);
gGL.vertex2i(PREVIEW_HPAD, PREVIEW_HPAD + PREF_BUTTON_HEIGHT + PREVIEW_HPAD);
gGL.texCoord2f(mPreviewImageRect.mRight, mPreviewImageRect.mBottom);
gGL.vertex2i(r.getWidth() - PREVIEW_HPAD, PREVIEW_HPAD + PREF_BUTTON_HEIGHT + PREVIEW_HPAD);
gGL.texCoord2f(mPreviewImageRect.mRight, mPreviewImageRect.mTop);
- gGL.vertex2i(r.getWidth() - PREVIEW_HPAD, PREVIEW_TEXTURE_HEIGHT);
+ gGL.vertex2i(r.getWidth() - PREVIEW_HPAD, PREVIEW_TEXTURE_HEIGHT + PREVIEW_VPAD);
}
gGL.end();
@@ -302,13 +304,13 @@ void LLFloaterImagePreview::draw()
gGL.begin( LLRender::QUADS );
{
gGL.texCoord2f(0.f, 1.f);
- gGL.vertex2i(PREVIEW_HPAD, PREVIEW_TEXTURE_HEIGHT);
+ gGL.vertex2i(PREVIEW_HPAD, PREVIEW_TEXTURE_HEIGHT + PREVIEW_VPAD);
gGL.texCoord2f(0.f, 0.f);
gGL.vertex2i(PREVIEW_HPAD, PREVIEW_HPAD + PREF_BUTTON_HEIGHT + PREVIEW_HPAD);
gGL.texCoord2f(1.f, 0.f);
gGL.vertex2i(r.getWidth() - PREVIEW_HPAD, PREVIEW_HPAD + PREF_BUTTON_HEIGHT + PREVIEW_HPAD);
gGL.texCoord2f(1.f, 1.f);
- gGL.vertex2i(r.getWidth() - PREVIEW_HPAD, PREVIEW_TEXTURE_HEIGHT);
+ gGL.vertex2i(r.getWidth() - PREVIEW_HPAD, PREVIEW_TEXTURE_HEIGHT + PREVIEW_VPAD);
}
gGL.end();
@@ -649,25 +651,30 @@ BOOL LLImagePreviewAvatar::render()
gGL.pushUIMatrix();
gGL.loadUIIdentity();
- glMatrixMode(GL_PROJECTION);
+ gGL.matrixMode(LLRender::MM_PROJECTION);
gGL.pushMatrix();
- glLoadIdentity();
- glOrtho(0.0f, mFullWidth, 0.0f, mFullHeight, -1.0f, 1.0f);
+ gGL.loadIdentity();
+ gGL.ortho(0.0f, mFullWidth, 0.0f, mFullHeight, -1.0f, 1.0f);
- glMatrixMode(GL_MODELVIEW);
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
gGL.pushMatrix();
- glLoadIdentity();
+ gGL.loadIdentity();
LLGLSUIDefault def;
gGL.color4f(0.15f, 0.2f, 0.3f, 1.f);
+ if (LLGLSLShader::sNoFixedFunction)
+ {
+ gUIProgram.bind();
+ }
+
gl_rect_2d_simple( mFullWidth, mFullHeight );
- glMatrixMode(GL_PROJECTION);
+ gGL.matrixMode(LLRender::MM_PROJECTION);
gGL.popMatrix();
- glMatrixMode(GL_MODELVIEW);
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
gGL.popMatrix();
gGL.flush();
@@ -690,8 +697,7 @@ BOOL LLImagePreviewAvatar::render()
LLVertexBuffer::unbind();
avatarp->updateLOD();
-
-
+
if (avatarp->mDrawable.notNull())
{
LLGLDepthTest gls_depth(GL_TRUE, GL_TRUE);
@@ -699,7 +705,7 @@ BOOL LLImagePreviewAvatar::render()
LLGLDisable no_blend(GL_BLEND);
LLDrawPoolAvatar *avatarPoolp = (LLDrawPoolAvatar *)avatarp->mDrawable->getFace(0)->getPool();
-
+ gPipeline.enableLightsPreview();
avatarPoolp->renderAvatars(avatarp); // renders only one avatar
}
@@ -790,15 +796,17 @@ void LLImagePreviewSculpted::setPreviewTarget(LLImageRaw* imagep, F32 distance)
U32 num_indices = vf.mNumIndices;
U32 num_vertices = vf.mNumVertices;
- mVertexBuffer = new LLVertexBuffer(LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_NORMAL, 0);
+ mVertexBuffer = new LLVertexBuffer(LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_NORMAL | LLVertexBuffer::MAP_TEXCOORD0, 0);
mVertexBuffer->allocateBuffer(num_vertices, num_indices, TRUE);
LLStrider<LLVector3> vertex_strider;
LLStrider<LLVector3> normal_strider;
+ LLStrider<LLVector2> tc_strider;
LLStrider<U16> index_strider;
mVertexBuffer->getVertexStrider(vertex_strider);
mVertexBuffer->getNormalStrider(normal_strider);
+ mVertexBuffer->getTexCoord0Strider(tc_strider);
mVertexBuffer->getIndexStrider(index_strider);
// build vertices and normals
@@ -806,7 +814,8 @@ void LLImagePreviewSculpted::setPreviewTarget(LLImageRaw* imagep, F32 distance)
pos = (LLVector3*) vf.mPositions; pos.setStride(16);
LLStrider<LLVector3> norm;
norm = (LLVector3*) vf.mNormals; norm.setStride(16);
-
+ LLStrider<LLVector2> tc;
+ tc = (LLVector2*) vf.mTexCoords; tc.setStride(8);
for (U32 i = 0; i < num_vertices; i++)
{
@@ -814,6 +823,7 @@ void LLImagePreviewSculpted::setPreviewTarget(LLImageRaw* imagep, F32 distance)
LLVector3 normal = *norm++;
normal.normalize();
*(normal_strider++) = normal;
+ *(tc_strider++) = *tc++;
}
// build indices
@@ -835,23 +845,28 @@ BOOL LLImagePreviewSculpted::render()
LLGLEnable cull(GL_CULL_FACE);
LLGLDepthTest depth(GL_TRUE);
- glMatrixMode(GL_PROJECTION);
+ gGL.matrixMode(LLRender::MM_PROJECTION);
gGL.pushMatrix();
- glLoadIdentity();
- glOrtho(0.0f, mFullWidth, 0.0f, mFullHeight, -1.0f, 1.0f);
+ gGL.loadIdentity();
+ gGL.ortho(0.0f, mFullWidth, 0.0f, mFullHeight, -1.0f, 1.0f);
- glMatrixMode(GL_MODELVIEW);
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
gGL.pushMatrix();
- glLoadIdentity();
+ gGL.loadIdentity();
gGL.color4f(0.15f, 0.2f, 0.3f, 1.f);
- gl_rect_2d_simple( mFullWidth, mFullHeight );
+ if (LLGLSLShader::sNoFixedFunction)
+ {
+ gUIProgram.bind();
+ }
- glMatrixMode(GL_PROJECTION);
+ gl_rect_2d_simple( mFullWidth, mFullHeight );
+
+ gGL.matrixMode(LLRender::MM_PROJECTION);
gGL.popMatrix();
- glMatrixMode(GL_MODELVIEW);
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
gGL.popMatrix();
glClear(GL_DEPTH_BUFFER_BIT);
@@ -876,17 +891,28 @@ BOOL LLImagePreviewSculpted::render()
const LLVolumeFace &vf = mVolume->getVolumeFace(0);
U32 num_indices = vf.mNumIndices;
- mVertexBuffer->setBuffer(LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_NORMAL);
-
gPipeline.enableLightsAvatar();
+
+ if (LLGLSLShader::sNoFixedFunction)
+ {
+ gObjectPreviewProgram.bind();
+ }
gGL.pushMatrix();
const F32 SCALE = 1.25f;
gGL.scalef(SCALE, SCALE, SCALE);
const F32 BRIGHTNESS = 0.9f;
gGL.color3f(BRIGHTNESS, BRIGHTNESS, BRIGHTNESS);
+
+ mVertexBuffer->setBuffer(LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_NORMAL | LLVertexBuffer::MAP_TEXCOORD0);
mVertexBuffer->draw(LLRender::TRIANGLES, num_indices, 0);
gGL.popMatrix();
+
+ if (LLGLSLShader::sNoFixedFunction)
+ {
+ gObjectPreviewProgram.unbind();
+ }
+
return TRUE;
}
diff --git a/indra/newview/llfloaterinspect.cpp b/indra/newview/llfloaterinspect.cpp
index a09b9ea235..cece8d299c 100644
--- a/indra/newview/llfloaterinspect.cpp
+++ b/indra/newview/llfloaterinspect.cpp
@@ -37,6 +37,7 @@
#include "llselectmgr.h"
#include "lltoolcomp.h"
#include "lltoolmgr.h"
+#include "lltrans.h"
#include "llviewercontrol.h"
#include "llviewerobject.h"
#include "lluictrlfactory.h"
@@ -166,6 +167,15 @@ LLUUID LLFloaterInspect::getSelectedUUID()
return LLUUID::null;
}
+void LLFloaterInspect::onGetAvNameCallback(const LLUUID& idCreator, const LLAvatarName& av_name, void* FloaterPtr)
+{
+ if (FloaterPtr)
+ {
+ LLFloaterInspect* floater = (LLFloaterInspect*)FloaterPtr;
+ floater->dirty();
+ }
+}
+
void LLFloaterInspect::refresh()
{
LLUUID creator_id;
@@ -205,11 +215,32 @@ void LLFloaterInspect::refresh()
substitution["datetime"] = (S32) timestamp;
LLStringUtil::format (timeStr, substitution);
+ const LLUUID& idOwner = obj->mPermissions->getOwner();
+ const LLUUID& idCreator = obj->mPermissions->getCreator();
LLAvatarName av_name;
- LLAvatarNameCache::get(obj->mPermissions->getOwner(), &av_name);
- owner_name = av_name.getCompleteName();
- LLAvatarNameCache::get(obj->mPermissions->getCreator(), &av_name);
- creator_name = av_name.getCompleteName();
+
+ // Only work with the names if we actually get a result
+ // from the name cache. If not, defer setting the
+ // actual name and set a placeholder.
+ if (LLAvatarNameCache::get(idOwner, &av_name))
+ {
+ owner_name = av_name.getCompleteName();
+ }
+ else
+ {
+ owner_name = LLTrans::getString("RetrievingData");
+ LLAvatarNameCache::get(idOwner, boost::bind(&LLFloaterInspect::onGetAvNameCallback, _1, _2, this));
+ }
+
+ if (LLAvatarNameCache::get(idCreator, &av_name))
+ {
+ creator_name = av_name.getCompleteName();
+ }
+ else
+ {
+ creator_name = LLTrans::getString("RetrievingData");
+ LLAvatarNameCache::get(idCreator, boost::bind(&LLFloaterInspect::onGetAvNameCallback, _1, _2, this));
+ }
row["id"] = obj->getObject()->getID();
row["columns"][0]["column"] = "object_name";
diff --git a/indra/newview/llfloaterinspect.h b/indra/newview/llfloaterinspect.h
index d9ffdf114b..7ee83ccdb4 100644
--- a/indra/newview/llfloaterinspect.h
+++ b/indra/newview/llfloaterinspect.h
@@ -29,6 +29,7 @@
#ifndef LL_LLFLOATERINSPECT_H
#define LL_LLFLOATERINSPECT_H
+#include "llavatarname.h"
#include "llfloater.h"
//class LLTool;
@@ -53,6 +54,9 @@ public:
void onClickCreatorProfile();
void onClickOwnerProfile();
void onSelectObject();
+
+ static void onGetAvNameCallback(const LLUUID& idCreator, const LLAvatarName& av_name, void* FloaterPtr);
+
LLScrollListCtrl* mObjectList;
protected:
// protected members
diff --git a/indra/newview/llfloaterinventory.cpp b/indra/newview/llfloaterinventory.cpp
index df769bdd88..9b9b90e521 100644
--- a/indra/newview/llfloaterinventory.cpp
+++ b/indra/newview/llfloaterinventory.cpp
@@ -98,3 +98,12 @@ void LLFloaterInventory::onOpen(const LLSD& key)
{
//LLFirstUse::useInventory();
}
+
+void LLFloaterInventory::onClose(bool app_quitting)
+{
+ LLFloater::onClose(app_quitting);
+ if (mKey.asInteger() > 1)
+ {
+ destroy();
+ }
+}
diff --git a/indra/newview/llfloaterinventory.h b/indra/newview/llfloaterinventory.h
index f59a015b07..823c4903b4 100644
--- a/indra/newview/llfloaterinventory.h
+++ b/indra/newview/llfloaterinventory.h
@@ -58,6 +58,7 @@ public:
// Inherited functionality
/*virtual*/ void onOpen(const LLSD& key);
+ /*virtual*/ void onClose(bool app_quitting);
LLInventoryPanel* getPanel();
LLPanelMainInventory* getMainInventoryPanel() { return mPanelMainInventory;}
diff --git a/indra/newview/llfloaterland.cpp b/indra/newview/llfloaterland.cpp
index 4746f93009..95da8ff948 100644
--- a/indra/newview/llfloaterland.cpp
+++ b/indra/newview/llfloaterland.cpp
@@ -433,7 +433,6 @@ BOOL LLPanelLandGeneral::postBuild()
mTextDwell = getChild<LLTextBox>("DwellText");
-
mBtnBuyLand = getChild<LLButton>("Buy Land...");
mBtnBuyLand->setClickedCallback(onClickBuyLand, (void*)&BUY_PERSONAL_LAND);
@@ -696,20 +695,26 @@ void LLPanelLandGeneral::refresh()
S32 area;
S32 claim_price;
S32 rent_price;
- F32 dwell;
+ F32 dwell = DWELL_NAN;
LLViewerParcelMgr::getInstance()->getDisplayInfo(&area,
&claim_price,
&rent_price,
&for_sale,
&dwell);
-
// Area
LLUIString price = getString("area_size_text");
price.setArg("[AREA]", llformat("%d",area));
mTextPriceLabel->setText(getString("area_text"));
mTextPrice->setText(price.getString());
- mTextDwell->setText(llformat("%.0f", dwell));
+ if (dwell == DWELL_NAN)
+ {
+ mTextDwell->setText(LLTrans::getString("LoadingData"));
+ }
+ else
+ {
+ mTextDwell->setText(llformat("%.0f", dwell));
+ }
if (for_sale)
{
@@ -1801,7 +1806,6 @@ LLPanelLandOptions::LLPanelLandOptions(LLParcelSelectionHandle& parcel)
mCheckEditGroupObjects(NULL),
mCheckAllObjectEntry(NULL),
mCheckGroupObjectEntry(NULL),
- mCheckEditLand(NULL),
mCheckSafe(NULL),
mCheckFly(NULL),
mCheckGroupScripts(NULL),
@@ -1835,10 +1839,6 @@ BOOL LLPanelLandOptions::postBuild()
mCheckGroupObjectEntry = getChild<LLCheckBoxCtrl>( "group object entry check");
childSetCommitCallback("group object entry check", onCommitAny, this);
- mCheckEditLand = getChild<LLCheckBoxCtrl>( "edit land check");
- childSetCommitCallback("edit land check", onCommitAny, this);
-
-
mCheckGroupScripts = getChild<LLCheckBoxCtrl>( "check group scripts");
childSetCommitCallback("check group scripts", onCommitAny, this);
@@ -1951,9 +1951,6 @@ void LLPanelLandOptions::refresh()
mCheckGroupObjectEntry ->set(FALSE);
mCheckGroupObjectEntry ->setEnabled(FALSE);
- mCheckEditLand ->set(FALSE);
- mCheckEditLand ->setEnabled(FALSE);
-
mCheckSafe ->set(FALSE);
mCheckSafe ->setEnabled(FALSE);
@@ -2001,10 +1998,6 @@ void LLPanelLandOptions::refresh()
mCheckGroupObjectEntry ->set( parcel->getAllowGroupObjectEntry() || parcel->getAllowAllObjectEntry());
mCheckGroupObjectEntry ->setEnabled( can_change_options && !parcel->getAllowAllObjectEntry() );
-
- BOOL can_change_terraform = LLViewerParcelMgr::isParcelModifiableByAgent(parcel, GP_LAND_EDIT);
- mCheckEditLand ->set( parcel->getAllowTerraform() );
- mCheckEditLand ->setEnabled( can_change_terraform );
mCheckSafe ->set( !parcel->getAllowDamage() );
mCheckSafe ->setEnabled( can_change_options );
@@ -2032,7 +2025,6 @@ void LLPanelLandOptions::refresh()
}
mSeeAvatarsCtrl->set(parcel->getSeeAVs());
- mSeeAvatarsCtrl->setLabel(getString("see_avs_text"));
mSeeAvatarsCtrl->setEnabled(can_change_options && parcel->getHaveNewParcelLimitData());
BOOL can_change_landing_point = LLViewerParcelMgr::isParcelModifiableByAgent(parcel,
@@ -2230,7 +2222,7 @@ void LLPanelLandOptions::onCommitAny(LLUICtrl *ctrl, void *userdata)
BOOL create_group_objects = self->mCheckEditGroupObjects->get() || self->mCheckEditObjects->get();
BOOL all_object_entry = self->mCheckAllObjectEntry->get();
BOOL group_object_entry = self->mCheckGroupObjectEntry->get() || self->mCheckAllObjectEntry->get();
- BOOL allow_terraform = self->mCheckEditLand->get();
+ BOOL allow_terraform = false; // removed from UI so always off now - self->mCheckEditLand->get();
BOOL allow_damage = !self->mCheckSafe->get();
BOOL allow_fly = self->mCheckFly->get();
BOOL allow_landmark = TRUE; // cannot restrict landmark creation
@@ -2482,27 +2474,6 @@ void LLPanelLandAccess::refresh()
mListBanned->addNameItem(entry.mID, ADD_DEFAULT, TRUE, suffix);
}
}
-
- LLCheckBoxWithTBAcess* maturity_checkbox = (LLCheckBoxWithTBAcess*) getChild<LLCheckBoxCtrl>( "public_access");
- LLViewerRegion* region = LLViewerParcelMgr::getInstance()->getSelectionRegion();
- if(region)
- {
- LLTextBox* maturity_textbox = maturity_checkbox->getTextBox();
- insert_maturity_into_textbox(maturity_textbox, gFloaterView->getParentFloater(this), getString("allow_public_access"));
- maturity_checkbox->reshape(maturity_checkbox->getRect().getWidth(), maturity_checkbox->getRect().getHeight(), FALSE);
- }
- else
- {
- std::string maturity_string = getString("allow_public_access");
- size_t maturity_pos = maturity_string.find(MATURITY);
-
- if (maturity_pos != std::string::npos)
- {
- maturity_string.replace(maturity_pos, MATURITY.length(), std::string(""));
- }
-
- maturity_checkbox->setLabel(maturity_string);
- }
if(parcel->getRegionDenyAnonymousOverride())
{
diff --git a/indra/newview/llfloaterland.h b/indra/newview/llfloaterland.h
index 6fceca1acd..4f1c10274a 100644
--- a/indra/newview/llfloaterland.h
+++ b/indra/newview/llfloaterland.h
@@ -330,7 +330,6 @@ private:
LLCheckBoxCtrl* mCheckEditGroupObjects;
LLCheckBoxCtrl* mCheckAllObjectEntry;
LLCheckBoxCtrl* mCheckGroupObjectEntry;
- LLCheckBoxCtrl* mCheckEditLand;
LLCheckBoxCtrl* mCheckSafe;
LLCheckBoxCtrl* mCheckFly;
LLCheckBoxCtrl* mCheckGroupScripts;
diff --git a/indra/newview/llfloatermap.cpp b/indra/newview/llfloatermap.cpp
index 641e64247b..a65e9e911a 100644
--- a/indra/newview/llfloatermap.cpp
+++ b/indra/newview/llfloatermap.cpp
@@ -100,17 +100,11 @@ BOOL LLFloaterMap::postBuild()
mTextBoxSouthWest = getChild<LLTextBox> ("floater_map_southwest");
mTextBoxNorthWest = getChild<LLTextBox> ("floater_map_northwest");
- stretchMiniMap(getRect().getWidth() - MAP_PADDING_LEFT - MAP_PADDING_RIGHT
- ,getRect().getHeight() - MAP_PADDING_TOP - MAP_PADDING_BOTTOM);
-
updateMinorDirections();
// Get the drag handle all the way in back
sendChildToBack(getDragHandle());
- setIsChrome(TRUE);
- getDragHandle()->setTitleVisible(TRUE);
-
// keep onscreen
gFloaterView->adjustToFitScreen(this, FALSE);
@@ -223,40 +217,10 @@ void LLFloaterMap::draw()
LLFloater::draw();
}
-// virtual
-void LLFloaterMap::onFocusReceived()
-{
- setBackgroundOpaque(true);
- LLPanel::onFocusReceived();
-}
-
-// virtual
-void LLFloaterMap::onFocusLost()
-{
- setBackgroundOpaque(false);
- LLPanel::onFocusLost();
-}
-
-void LLFloaterMap::stretchMiniMap(S32 width,S32 height)
-{
- //fix for ext-7112
- //by default ctrl can't overlap caption area
- if(mMap)
- {
- LLRect map_rect;
- map_rect.setLeftTopAndSize( MAP_PADDING_LEFT, getRect().getHeight() - MAP_PADDING_TOP, width, height);
- mMap->reshape( width, height, 1);
- mMap->setRect(map_rect);
- }
-}
-
void LLFloaterMap::reshape(S32 width, S32 height, BOOL called_from_parent)
{
LLFloater::reshape(width, height, called_from_parent);
- stretchMiniMap(width - MAP_PADDING_LEFT - MAP_PADDING_RIGHT
- ,height - MAP_PADDING_TOP - MAP_PADDING_BOTTOM);
-
updateMinorDirections();
}
@@ -285,16 +249,3 @@ void LLFloaterMap::handleZoom(const LLSD& userdata)
mMap->setScale(scale);
}
}
-
-void LLFloaterMap::setMinimized(BOOL b)
-{
- LLFloater::setMinimized(b);
- if(b)
- {
- setTitle(getString("mini_map_caption"));
- }
- else
- {
- setTitle("");
- }
-}
diff --git a/indra/newview/llfloatermap.h b/indra/newview/llfloatermap.h
index 5cf66a594b..8a1b965e62 100644
--- a/indra/newview/llfloatermap.h
+++ b/indra/newview/llfloatermap.h
@@ -45,18 +45,12 @@ public:
/*virtual*/ BOOL handleDoubleClick( S32 x, S32 y, MASK mask );
/*virtual*/ void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE);
/*virtual*/ void draw();
- /*virtual*/ void onFocusLost();
- /*virtual*/ void onFocusReceived();
- /*virtual*/ void setMinimized(BOOL b);
-
private:
void handleZoom(const LLSD& userdata);
void setDirectionPos( LLTextBox* text_box, F32 rotation );
void updateMinorDirections();
- void stretchMiniMap(S32 width,S32 height);
-
LLTextBox* mTextBoxEast;
LLTextBox* mTextBoxNorth;
LLTextBox* mTextBoxWest;
diff --git a/indra/newview/llfloatermediabrowser.cpp b/indra/newview/llfloatermediabrowser.cpp
deleted file mode 100644
index 7a670dd90c..0000000000
--- a/indra/newview/llfloatermediabrowser.cpp
+++ /dev/null
@@ -1,462 +0,0 @@
-/**
- * @file llfloatermediabrowser.cpp
- * @brief media browser floater - uses embedded media browser control
- *
- * $LicenseInfo:firstyear=2006&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-#include "llviewerprecompiledheaders.h"
-
-#include "llfloatermediabrowser.h"
-
-#include "llfloaterreg.h"
-#include "llparcel.h"
-#include "llpluginclassmedia.h"
-#include "lluictrlfactory.h"
-#include "llmediactrl.h"
-#include "llviewerwindow.h"
-#include "llviewercontrol.h"
-#include "llviewerparcelmgr.h"
-#include "llweb.h"
-#include "llui.h"
-#include "roles_constants.h"
-
-#include "llurlhistory.h"
-#include "llmediactrl.h"
-#include "llviewermedia.h"
-#include "llviewerparcelmedia.h"
-#include "llcombobox.h"
-#include "llwindow.h"
-#include "lllayoutstack.h"
-#include "llcheckboxctrl.h"
-
-#include "llnotifications.h"
-
-// TEMP
-#include "llsdutil.h"
-
-LLFloaterMediaBrowser::LLFloaterMediaBrowser(const LLSD& key)
- : LLFloater(key)
-{
-}
-
-//static
-void LLFloaterMediaBrowser::create(const std::string &url, const std::string& target, const std::string& uuid)
-{
- lldebugs << "url = " << url << ", target = " << target << ", uuid = " << uuid << llendl;
-
- std::string tag = target;
-
- if(target.empty() || target == "_blank")
- {
- if(!uuid.empty())
- {
- tag = uuid;
- }
- else
- {
- // create a unique tag for this instance
- LLUUID id;
- id.generate();
- tag = id.asString();
- }
- }
-
- S32 browser_window_limit = gSavedSettings.getS32("MediaBrowserWindowLimit");
-
- if(LLFloaterReg::findInstance("media_browser", tag) != NULL)
- {
- // There's already a media browser for this tag, so we won't be opening a new window.
- }
- else if(browser_window_limit != 0)
- {
- // showInstance will open a new window. Figure out how many media browsers are already open,
- // and close the least recently opened one if this will put us over the limit.
-
- LLFloaterReg::const_instance_list_t &instances = LLFloaterReg::getFloaterList("media_browser");
- lldebugs << "total instance count is " << instances.size() << llendl;
-
- for(LLFloaterReg::const_instance_list_t::const_iterator iter = instances.begin(); iter != instances.end(); iter++)
- {
- lldebugs << " " << (*iter)->getKey() << llendl;
- }
-
- if(instances.size() >= (size_t)browser_window_limit)
- {
- // Destroy the least recently opened instance
- (*instances.begin())->closeFloater();
- }
- }
-
- LLFloaterMediaBrowser *browser = dynamic_cast<LLFloaterMediaBrowser*> (LLFloaterReg::showInstance("media_browser", tag));
- llassert(browser);
- if(browser)
- {
- browser->mUUID = uuid;
-
- // tell the browser instance to load the specified URL
- browser->openMedia(url, target);
- LLViewerMedia::proxyWindowOpened(target, uuid);
- }
-}
-
-//static
-void LLFloaterMediaBrowser::closeRequest(const std::string &uuid)
-{
- LLFloaterReg::const_instance_list_t& inst_list = LLFloaterReg::getFloaterList("media_browser");
- lldebugs << "instance list size is " << inst_list.size() << ", incoming uuid is " << uuid << llendl;
- for (LLFloaterReg::const_instance_list_t::const_iterator iter = inst_list.begin(); iter != inst_list.end(); ++iter)
- {
- LLFloaterMediaBrowser* i = dynamic_cast<LLFloaterMediaBrowser*>(*iter);
- lldebugs << " " << i->mUUID << llendl;
- if (i && i->mUUID == uuid)
- {
- i->closeFloater(false);
- return;
- }
- }
-}
-
-//static
-void LLFloaterMediaBrowser::geometryChanged(const std::string &uuid, S32 x, S32 y, S32 width, S32 height)
-{
- LLFloaterReg::const_instance_list_t& inst_list = LLFloaterReg::getFloaterList("media_browser");
- lldebugs << "instance list size is " << inst_list.size() << ", incoming uuid is " << uuid << llendl;
- for (LLFloaterReg::const_instance_list_t::const_iterator iter = inst_list.begin(); iter != inst_list.end(); ++iter)
- {
- LLFloaterMediaBrowser* i = dynamic_cast<LLFloaterMediaBrowser*>(*iter);
- lldebugs << " " << i->mUUID << llendl;
- if (i && i->mUUID == uuid)
- {
- i->geometryChanged(x, y, width, height);
- return;
- }
-}
-}
-
-void LLFloaterMediaBrowser::geometryChanged(S32 x, S32 y, S32 width, S32 height)
-{
- // Make sure the layout of the browser control is updated, so this calculation is correct.
- LLLayoutStack::updateClass();
-
- // TODO: need to adjust size and constrain position to make sure floaters aren't moved outside the window view, etc.
- LLCoordWindow window_size;
- getWindow()->getSize(&window_size);
-
- // Adjust width and height for the size of the chrome on the Media Browser window.
- width += getRect().getWidth() - mBrowser->getRect().getWidth();
- height += getRect().getHeight() - mBrowser->getRect().getHeight();
-
- LLRect geom;
- geom.setOriginAndSize(x, window_size.mY - (y + height), width, height);
-
- lldebugs << "geometry change: " << geom << llendl;
-
- handleReshape(geom,false);
-}
-
-
-void LLFloaterMediaBrowser::draw()
-{
- getChildView("go")->setEnabled(!mAddressCombo->getValue().asString().empty());
- LLParcel* parcel = LLViewerParcelMgr::getInstance()->getAgentParcel();
- if(parcel)
- {
- getChildView("parcel_owner_controls")->setVisible( LLViewerParcelMgr::isParcelModifiableByAgent(parcel, GP_LAND_CHANGE_MEDIA));
- getChildView("assign")->setEnabled(!mAddressCombo->getValue().asString().empty());
- }
- bool show_time_controls = false;
- bool media_playing = false;
- if(mBrowser)
- {
- LLPluginClassMedia* media_plugin = mBrowser->getMediaPlugin();
- if(media_plugin)
- {
- show_time_controls = media_plugin->pluginSupportsMediaTime();
- media_playing = media_plugin->getStatus() == LLPluginClassMediaOwner::MEDIA_PLAYING;
- }
- }
- getChildView("rewind")->setVisible( show_time_controls);
- getChildView("play")->setVisible( show_time_controls && ! media_playing);
- getChildView("pause")->setVisible( show_time_controls && media_playing);
- getChildView("stop")->setVisible( show_time_controls);
- getChildView("seek")->setVisible( show_time_controls);
-
- getChildView("play")->setEnabled(! media_playing);
- getChildView("stop")->setEnabled(media_playing);
-
- getChildView("back")->setEnabled(mBrowser->canNavigateBack());
- getChildView("forward")->setEnabled(mBrowser->canNavigateForward());
-
- LLFloater::draw();
-}
-
-BOOL LLFloaterMediaBrowser::postBuild()
-{
- mBrowser = getChild<LLMediaCtrl>("browser");
- mBrowser->addObserver(this);
-
- mAddressCombo = getChild<LLComboBox>("address");
- mAddressCombo->setCommitCallback(onEnterAddress, this);
- mAddressCombo->sortByName();
-
- childSetAction("back", onClickBack, this);
- childSetAction("forward", onClickForward, this);
- childSetAction("reload", onClickRefresh, this);
- childSetAction("rewind", onClickRewind, this);
- childSetAction("play", onClickPlay, this);
- childSetAction("stop", onClickStop, this);
- childSetAction("pause", onClickPlay, this);
- childSetAction("seek", onClickSeek, this);
- childSetAction("go", onClickGo, this);
- childSetAction("close", onClickClose, this);
- childSetAction("open_browser", onClickOpenWebBrowser, this);
- childSetAction("assign", onClickAssign, this);
-
- buildURLHistory();
-
- return TRUE;
-}
-
-void LLFloaterMediaBrowser::buildURLHistory()
-{
- LLCtrlListInterface* url_list = childGetListInterface("address");
- if (url_list)
- {
- url_list->operateOnAll(LLCtrlListInterface::OP_DELETE);
- }
-
- // Get all of the entries in the "browser" collection
- LLSD browser_history = LLURLHistory::getURLHistory("browser");
-
- LLSD::array_iterator iter_history =
- browser_history.beginArray();
- LLSD::array_iterator end_history =
- browser_history.endArray();
- for(; iter_history != end_history; ++iter_history)
- {
- std::string url = (*iter_history).asString();
- if(! url.empty())
- url_list->addSimpleElement(url);
- }
-
- // initialize URL history in the plugin
- if(mBrowser && mBrowser->getMediaPlugin())
- {
- mBrowser->getMediaPlugin()->initializeUrlHistory(browser_history);
- }
-}
-
-std::string LLFloaterMediaBrowser::getSupportURL()
-{
- return getString("support_page_url");
-}
-
-//virtual
-void LLFloaterMediaBrowser::onClose(bool app_quitting)
-{
- LLViewerMedia::proxyWindowClosed(mUUID);
- //setVisible(FALSE);
- destroy();
-}
-
-void LLFloaterMediaBrowser::handleMediaEvent(LLPluginClassMedia* self, EMediaEvent event)
-{
- if(event == MEDIA_EVENT_LOCATION_CHANGED)
- {
- setCurrentURL(self->getLocation());
- }
- else if(event == MEDIA_EVENT_NAVIGATE_COMPLETE)
- {
- // This is the event these flags are sent with.
- getChildView("back")->setEnabled(self->getHistoryBackAvailable());
- getChildView("forward")->setEnabled(self->getHistoryForwardAvailable());
- }
- else if(event == MEDIA_EVENT_CLOSE_REQUEST)
- {
- // The browser instance wants its window closed.
- closeFloater();
- }
- else if(event == MEDIA_EVENT_GEOMETRY_CHANGE)
- {
- geometryChanged(self->getGeometryX(), self->getGeometryY(), self->getGeometryWidth(), self->getGeometryHeight());
- }
-}
-
-void LLFloaterMediaBrowser::setCurrentURL(const std::string& url)
-{
- mCurrentURL = url;
-
- mAddressCombo->remove(mCurrentURL);
- mAddressCombo->add(mCurrentURL);
- mAddressCombo->selectByValue(mCurrentURL);
-
- // Serialize url history
- LLURLHistory::removeURL("browser", mCurrentURL);
- LLURLHistory::addURL("browser", mCurrentURL);
-
- getChildView("back")->setEnabled(mBrowser->canNavigateBack());
- getChildView("forward")->setEnabled(mBrowser->canNavigateForward());
- getChildView("reload")->setEnabled(TRUE);
-}
-
-//static
-void LLFloaterMediaBrowser::onEnterAddress(LLUICtrl* ctrl, void* user_data)
-{
- LLFloaterMediaBrowser* self = (LLFloaterMediaBrowser*)user_data;
- self->mBrowser->navigateTo(self->mAddressCombo->getValue().asString());
-}
-
-//static
-void LLFloaterMediaBrowser::onClickRefresh(void* user_data)
-{
- LLFloaterMediaBrowser* self = (LLFloaterMediaBrowser*)user_data;
-
- if( self->mBrowser->getMediaPlugin() && self->mBrowser->getMediaPlugin()->pluginSupportsMediaBrowser())
- {
- bool ignore_cache = true;
- self->mBrowser->getMediaPlugin()->browse_reload( ignore_cache );
- }
- else
- {
- self->mBrowser->navigateTo(self->mCurrentURL);
- }
-}
-
-//static
-void LLFloaterMediaBrowser::onClickForward(void* user_data)
-{
- LLFloaterMediaBrowser* self = (LLFloaterMediaBrowser*)user_data;
-
- self->mBrowser->navigateForward();
-}
-
-//static
-void LLFloaterMediaBrowser::onClickBack(void* user_data)
-{
- LLFloaterMediaBrowser* self = (LLFloaterMediaBrowser*)user_data;
-
- self->mBrowser->navigateBack();
-}
-
-//static
-void LLFloaterMediaBrowser::onClickGo(void* user_data)
-{
- LLFloaterMediaBrowser* self = (LLFloaterMediaBrowser*)user_data;
-
- self->mBrowser->navigateTo(self->mAddressCombo->getValue().asString());
-}
-
-//static
-void LLFloaterMediaBrowser::onClickClose(void* user_data)
-{
- LLFloaterMediaBrowser* self = (LLFloaterMediaBrowser*)user_data;
-
- self->closeFloater();
-}
-
-//static
-void LLFloaterMediaBrowser::onClickOpenWebBrowser(void* user_data)
-{
- LLFloaterMediaBrowser* self = (LLFloaterMediaBrowser*)user_data;
-
- std::string url = self->mCurrentURL.empty() ?
- self->mBrowser->getHomePageUrl() :
- self->mCurrentURL;
- LLWeb::loadURLExternal(url);
-}
-
-void LLFloaterMediaBrowser::onClickAssign(void* user_data)
-{
- LLFloaterMediaBrowser* self = (LLFloaterMediaBrowser*)user_data;
-
- LLParcel* parcel = LLViewerParcelMgr::getInstance()->getAgentParcel();
- if (!parcel)
- {
- return;
- }
- std::string media_url = self->mAddressCombo->getValue().asString();
- LLStringUtil::trim(media_url);
-
- if(parcel->getMediaType() != "text/html")
- {
- parcel->setMediaURL(media_url);
- parcel->setMediaCurrentURL(media_url);
- parcel->setMediaType(std::string("text/html"));
- LLViewerParcelMgr::getInstance()->sendParcelPropertiesUpdate( parcel, true );
- LLViewerParcelMedia::sendMediaNavigateMessage(media_url);
- LLViewerParcelMedia::stop();
- // LLViewerParcelMedia::update( parcel );
- }
- LLViewerParcelMedia::sendMediaNavigateMessage(media_url);
-}
-//static
-void LLFloaterMediaBrowser::onClickRewind(void* user_data)
-{
- LLFloaterMediaBrowser* self = (LLFloaterMediaBrowser*)user_data;
-
- if(self->mBrowser->getMediaPlugin())
- self->mBrowser->getMediaPlugin()->start(-2.0f);
-}
-//static
-void LLFloaterMediaBrowser::onClickPlay(void* user_data)
-{
- LLFloaterMediaBrowser* self = (LLFloaterMediaBrowser*)user_data;
-
- LLPluginClassMedia* plugin = self->mBrowser->getMediaPlugin();
- if(plugin)
- {
- if(plugin->getStatus() == LLPluginClassMediaOwner::MEDIA_PLAYING)
- {
- plugin->pause();
- }
- else
- {
- plugin->start();
- }
- }
-}
-//static
-void LLFloaterMediaBrowser::onClickStop(void* user_data)
-{
- LLFloaterMediaBrowser* self = (LLFloaterMediaBrowser*)user_data;
-
- if(self->mBrowser->getMediaPlugin())
- self->mBrowser->getMediaPlugin()->stop();
-}
-//static
-void LLFloaterMediaBrowser::onClickSeek(void* user_data)
-{
- LLFloaterMediaBrowser* self = (LLFloaterMediaBrowser*)user_data;
-
- if(self->mBrowser->getMediaPlugin())
- self->mBrowser->getMediaPlugin()->start(2.0f);
-}
-void LLFloaterMediaBrowser::openMedia(const std::string& media_url, const std::string& target)
-{
- mBrowser->setHomePageUrl(media_url);
- mBrowser->setTarget(target);
- mBrowser->navigateTo(media_url);
- setCurrentURL(media_url);
-}
-
-
diff --git a/indra/newview/llfloatermediabrowser.h b/indra/newview/llfloatermediabrowser.h
deleted file mode 100644
index 152d221a01..0000000000
--- a/indra/newview/llfloatermediabrowser.h
+++ /dev/null
@@ -1,86 +0,0 @@
-/**
- * @file llfloatermediabrowser.h
- * @brief media browser floater - uses embedded media browser control
- *
- * $LicenseInfo:firstyear=2006&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-#ifndef LL_LLFLOATERMEDIABROWSER_H
-#define LL_LLFLOATERMEDIABROWSER_H
-
-#include "llfloater.h"
-#include "llmediactrl.h"
-
-
-class LLComboBox;
-class LLMediaCtrl;
-class LLNotification;
-
-class LLFloaterMediaBrowser :
- public LLFloater,
- public LLViewerMediaObserver
-{
-public:
- LOG_CLASS(LLFloaterMediaBrowser);
- LLFloaterMediaBrowser(const LLSD& key);
-
- static void create(const std::string &url, const std::string& target, const std::string& uuid = LLStringUtil::null);
-
- static void closeRequest(const std::string &uuid);
- static void geometryChanged(const std::string &uuid, S32 x, S32 y, S32 width, S32 height);
- void geometryChanged(S32 x, S32 y, S32 width, S32 height);
-
- /*virtual*/ BOOL postBuild();
- /*virtual*/ void onClose(bool app_quitting);
- /*virtual*/ void draw();
-
- // inherited from LLViewerMediaObserver
- /*virtual*/ void handleMediaEvent(LLPluginClassMedia* self, EMediaEvent event);
-
- void openMedia(const std::string& media_url, const std::string& target);
- void buildURLHistory();
- std::string getSupportURL();
- void setCurrentURL(const std::string& url);
-
- static void onEnterAddress(LLUICtrl* ctrl, void* user_data);
- static void onClickRefresh(void* user_data);
- static void onClickBack(void* user_data);
- static void onClickForward(void* user_data);
- static void onClickGo(void* user_data);
- static void onClickClose(void* user_data);
- static void onClickOpenWebBrowser(void* user_data);
- static void onClickAssign(void* user_data);
- static void onClickRewind(void* user_data);
- static void onClickPlay(void* user_data);
- static void onClickStop(void* user_data);
- static void onClickSeek(void* user_data);
-
-private:
- LLMediaCtrl* mBrowser;
- LLComboBox* mAddressCombo;
- std::string mCurrentURL;
- boost::shared_ptr<LLNotification> mCurNotification;
- std::string mUUID;
-};
-
-#endif // LL_LLFLOATERMEDIABROWSER_H
-
diff --git a/indra/newview/llfloatermediasettings.cpp b/indra/newview/llfloatermediasettings.cpp
index b5f1b967df..895e16adef 100644
--- a/indra/newview/llfloatermediasettings.cpp
+++ b/indra/newview/llfloatermediasettings.cpp
@@ -212,10 +212,13 @@ void LLFloaterMediaSettings::commitFields()
//static
void LLFloaterMediaSettings::clearValues( bool editable)
{
- // clean up all panels before updating
- sInstance->mPanelMediaSettingsGeneral ->clearValues(sInstance->mPanelMediaSettingsGeneral, editable);
- sInstance->mPanelMediaSettingsSecurity ->clearValues(sInstance->mPanelMediaSettingsSecurity, editable);
- sInstance->mPanelMediaSettingsPermissions->clearValues(sInstance->mPanelMediaSettingsPermissions, editable);
+ if (sInstance)
+ {
+ // clean up all panels before updating
+ sInstance->mPanelMediaSettingsGeneral ->clearValues(sInstance->mPanelMediaSettingsGeneral, editable);
+ sInstance->mPanelMediaSettingsSecurity ->clearValues(sInstance->mPanelMediaSettingsSecurity, editable);
+ sInstance->mPanelMediaSettingsPermissions->clearValues(sInstance->mPanelMediaSettingsPermissions, editable);
+ }
}
////////////////////////////////////////////////////////////////////////////////
diff --git a/indra/newview/llfloatermodelpreview.cpp b/indra/newview/llfloatermodelpreview.cpp
index 5869cf6fee..9122e5a8f5 100644..100755
--- a/indra/newview/llfloatermodelpreview.cpp
+++ b/indra/newview/llfloatermodelpreview.cpp
@@ -26,6 +26,10 @@
#include "llviewerprecompiledheaders.h"
+#if LL_MSVC
+#pragma warning (disable : 4263)
+#pragma warning (disable : 4264)
+#endif
#include "dae.h"
//#include "dom.h"
#include "dom/domAsset.h"
@@ -47,6 +51,10 @@
#include "dom/domScale.h"
#include "dom/domTranslate.h"
#include "dom/domVisual_scene.h"
+#if LL_MSVC
+#pragma warning (default : 4263)
+#pragma warning (default : 4264)
+#endif
#include "llfloatermodelpreview.h"
@@ -103,6 +111,7 @@
#include "llviewerobjectlist.h"
#include "llanimationstates.h"
#include "llviewernetwork.h"
+#include "llviewershadermgr.h"
#include "glod/glod.h"
#include <boost/algorithm/string.hpp>
@@ -388,7 +397,7 @@ mCalculateBtn(NULL)
mLastMouseX = 0;
mLastMouseY = 0;
mGLName = 0;
- mStatusLock = new LLMutex();
+ mStatusLock = new LLMutex(NULL);
mModelPreview = NULL;
mLODMode[LLModel::LOD_HIGH] = 0;
@@ -496,6 +505,11 @@ BOOL LLFloaterModelPreview::postBuild()
{
validate_url = "http://secondlife.com/my/account/mesh.php";
}
+ else if (current_grid == "damballah")
+ {
+ // Staging grid has its own naming scheme.
+ validate_url = "http://secondlife-staging.com/my/account/mesh.php";
+ }
else
{
validate_url = llformat("http://secondlife.%s.lindenlab.com/my/account/mesh.php",current_grid.c_str());
@@ -744,6 +758,11 @@ void LLFloaterModelPreview::draw()
if (!mModelPreview->mLoading)
{
+ if ( mModelPreview->getLoadState() == LLModelLoader::ERROR_MATERIALS )
+ {
+ childSetTextArg("status", "[STATUS]", getString("status_material_mismatch"));
+ }
+ else
if ( mModelPreview->getLoadState() > LLModelLoader::ERROR_PARSING )
{
childSetTextArg("status", "[STATUS]", getString(LLModel::getStatusString(mModelPreview->getLoadState() - LLModelLoader::ERROR_PARSING)));
@@ -995,38 +1014,38 @@ void LLFloaterModelPreview::onPhysicsBrowse(LLUICtrl* ctrl, void* userdata)
//static
void LLFloaterModelPreview::onPhysicsUseLOD(LLUICtrl* ctrl, void* userdata)
{
- S32 num_modes = 4;
- S32 which_mode = 3;
- static S32 previous_mode = which_mode;
+ S32 num_lods = 4;
+ S32 which_mode;
LLCtrlSelectionInterface* iface = sInstance->childGetSelectionInterface("physics_lod_combo");
if (iface)
{
which_mode = iface->getFirstSelectedIndex();
}
+ else
+ {
+ llwarns << "no iface" << llendl;
+ return;
+ }
- S32 file_mode = iface->getItemCount() - 1;
- bool file_browse = which_mode == file_mode;
- bool lod_to_file = file_browse && (previous_mode != file_mode);
- bool file_to_lod = !file_browse && (previous_mode == file_mode);
-
- if (!lod_to_file)
+ if (which_mode <= 0)
{
- which_mode = num_modes - which_mode;
- sInstance->mModelPreview->setPhysicsFromLOD(which_mode);
+ llwarns << "which_mode out of range, " << which_mode << llendl;
}
- if (lod_to_file || file_to_lod)
+ S32 file_mode = iface->getItemCount() - 1;
+ if (which_mode < file_mode)
{
- LLModelPreview *model_preview = sInstance->mModelPreview;
- if (model_preview)
- {
- model_preview->refresh();
- model_preview->updateStatusMessages();
- }
+ S32 which_lod = num_lods - which_mode;
+ sInstance->mModelPreview->setPhysicsFromLOD(which_lod);
}
- previous_mode = which_mode;
+ LLModelPreview *model_preview = sInstance->mModelPreview;
+ if (model_preview)
+ {
+ model_preview->refresh();
+ model_preview->updateStatusMessages();
+ }
}
//static
@@ -3077,7 +3096,7 @@ LLColor4 LLModelLoader::getDaeColor(daeElement* element)
//-----------------------------------------------------------------------------
LLModelPreview::LLModelPreview(S32 width, S32 height, LLFloater* fmp)
-: LLViewerDynamicTexture(width, height, 3, ORDER_MIDDLE, FALSE), LLMutex()
+: LLViewerDynamicTexture(width, height, 3, ORDER_MIDDLE, FALSE), LLMutex(NULL)
, mPelvisZOffset( 0.0f )
, mLegacyRigValid( false )
, mRigValidJointUpload( false )
@@ -3304,7 +3323,7 @@ void LLModelPreview::rebuildUploadData()
F32 max_scale = 0.f;
//reorder materials to match mBaseModel
- for (U32 i = 0; i < LLModel::NUM_LODS; i++)
+ for (U32 i = 0; i < LLModel::NUM_LODS-1; i++)
{
if (mBaseModel.size() == mModel[i].size())
{
@@ -3316,6 +3335,7 @@ void LLModelPreview::rebuildUploadData()
if ( !mModel[i][j]->matchMaterialOrder(mBaseModel[j], refFaceCnt, modelFaceCnt ) )
{
+ setLoadState( LLModelLoader::ERROR_MATERIALS );
mFMP->childDisable( "calculate_btn" );
}
}
@@ -3840,6 +3860,15 @@ void LLModelPreview::genLODs(S32 which_lod, U32 decimation, bool enforce_tri_lim
LLVertexBuffer::unbind();
+ bool no_ff = LLGLSLShader::sNoFixedFunction;
+ LLGLSLShader* shader = LLGLSLShader::sCurBoundShaderPtr;
+ LLGLSLShader::sNoFixedFunction = false;
+
+ if (shader)
+ {
+ shader->unbind();
+ }
+
stop_gloderror();
static U32 cur_name = 1;
@@ -3940,7 +3969,7 @@ void LLModelPreview::genLODs(S32 which_lod, U32 decimation, bool enforce_tri_lim
U32 num_indices = mVertexBuffer[5][mdl][i]->getNumIndices();
if (num_indices > 2)
{
- glodInsertElements(mObject[mdl], i, GL_TRIANGLES, num_indices, GL_UNSIGNED_SHORT, mVertexBuffer[5][mdl][i]->getIndicesPointer(), 0, 0.f);
+ glodInsertElements(mObject[mdl], i, GL_TRIANGLES, num_indices, GL_UNSIGNED_SHORT, (U8*) mVertexBuffer[5][mdl][i]->getIndicesPointer(), 0, 0.f);
}
tri_count += num_indices/3;
stop_gloderror();
@@ -4054,14 +4083,14 @@ void LLModelPreview::genLODs(S32 which_lod, U32 decimation, bool enforce_tri_lim
{
buff->allocateBuffer(sizes[i*2+1], sizes[i*2], true);
buff->setBuffer(type_mask);
- glodFillElements(mObject[base], names[i], GL_UNSIGNED_SHORT, buff->getIndicesPointer());
+ glodFillElements(mObject[base], names[i], GL_UNSIGNED_SHORT, (U8*) buff->getIndicesPointer());
stop_gloderror();
}
else
{ //this face was eliminated, create a dummy triangle (one vertex, 3 indices, all 0)
buff->allocateBuffer(1, 3, true);
- memset(buff->getMappedData(), 0, buff->getSize());
- memset(buff->getIndicesPointer(), 0, buff->getIndicesSize());
+ memset((U8*) buff->getMappedData(), 0, buff->getSize());
+ memset((U8*) buff->getIndicesPointer(), 0, buff->getIndicesSize());
}
buff->validateRange(0, buff->getNumVerts()-1, buff->getNumIndices(), 0);
@@ -4138,6 +4167,13 @@ void LLModelPreview::genLODs(S32 which_lod, U32 decimation, bool enforce_tri_lim
mResourceCost = calcResourceCost();
+ LLVertexBuffer::unbind();
+ LLGLSLShader::sNoFixedFunction = no_ff;
+ if (shader)
+ {
+ shader->bind();
+ }
+
/*if (which_lod == -1 && mScene[LLModel::LOD_PHYSICS].empty())
{ //build physics scene
mScene[LLModel::LOD_PHYSICS] = mScene[LLModel::LOD_LOW];
@@ -4351,11 +4387,6 @@ void LLModelPreview::updateStatusMessages()
{
skinAndRigOk = false;
}
- else
- if ( !isLegacyRigValid() )
- {
- mFMP->childDisable("calculate_btn");
- }
}
if(upload_ok && mModelLoader)
@@ -4849,8 +4880,8 @@ void LLModelPreview::addEmptyFace( LLModel* pTarget )
LLPointer<LLVertexBuffer> buff = new LLVertexBuffer(type_mask, 0);
buff->allocateBuffer(1, 3, true);
- memset( buff->getMappedData(), 0, buff->getSize() );
- memset( buff->getIndicesPointer(), 0, buff->getIndicesSize() );
+ memset( (U8*) buff->getMappedData(), 0, buff->getSize() );
+ memset( (U8*) buff->getIndicesPointer(), 0, buff->getIndicesSize() );
buff->validateRange( 0, buff->getNumVerts()-1, buff->getNumIndices(), 0 );
@@ -4888,6 +4919,8 @@ BOOL LLModelPreview::render()
LLMutexLock lock(this);
mNeedsUpdate = FALSE;
+ bool use_shaders = LLGLSLShader::sNoFixedFunction;
+
bool edges = mViewOption["show_edges"];
bool joint_positions = mViewOption["show_joint_positions"];
bool skin_weight = mViewOption["show_skin_weight"];
@@ -4904,25 +4937,33 @@ BOOL LLModelPreview::render()
LLGLDisable fog(GL_FOG);
{
+ if (use_shaders)
+ {
+ gUIProgram.bind();
+ }
//clear background to blue
- glMatrixMode(GL_PROJECTION);
+ gGL.matrixMode(LLRender::MM_PROJECTION);
gGL.pushMatrix();
- glLoadIdentity();
- glOrtho(0.0f, width, 0.0f, height, -1.0f, 1.0f);
+ gGL.loadIdentity();
+ gGL.ortho(0.0f, width, 0.0f, height, -1.0f, 1.0f);
- glMatrixMode(GL_MODELVIEW);
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
gGL.pushMatrix();
- glLoadIdentity();
+ gGL.loadIdentity();
gGL.color4f(0.169f, 0.169f, 0.169f, 1.f);
gl_rect_2d_simple( width, height );
- glMatrixMode(GL_PROJECTION);
+ gGL.matrixMode(LLRender::MM_PROJECTION);
gGL.popMatrix();
- glMatrixMode(GL_MODELVIEW);
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
gGL.popMatrix();
+ if (use_shaders)
+ {
+ gUIProgram.unbind();
+ }
}
LLFloaterModelPreview* fmp = LLFloaterModelPreview::sInstance;
@@ -5035,7 +5076,7 @@ BOOL LLModelPreview::render()
refresh();
}
- glLoadIdentity();
+ gGL.loadIdentity();
gPipeline.enableLightsPreview();
LLQuaternion camera_rot = LLQuaternion(mCameraPitch, LLVector3::y_axis) *
@@ -5060,6 +5101,11 @@ BOOL LLModelPreview::render()
const U32 type_mask = LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_NORMAL | LLVertexBuffer::MAP_TEXCOORD0;
+ if (use_shaders)
+ {
+ gObjectPreviewProgram.bind();
+ }
+
LLGLEnable normalize(GL_NORMALIZE);
if (!mBaseModel.empty() && mVertexBuffer[5].empty())
@@ -5071,6 +5117,8 @@ BOOL LLModelPreview::render()
if (!mModel[mPreviewLOD].empty())
{
+ mFMP->childEnable("reset_btn");
+
bool regen = mVertexBuffer[mPreviewLOD].empty();
if (!regen)
{
@@ -5083,7 +5131,7 @@ BOOL LLModelPreview::render()
}
//make sure material lists all match
- for (U32 i = 0; i < LLModel::NUM_LODS; i++)
+ for (U32 i = 0; i < LLModel::NUM_LODS-1; i++)
{
if (mBaseModel.size() == mModel[i].size())
{
@@ -5121,7 +5169,7 @@ BOOL LLModelPreview::render()
gGL.pushMatrix();
LLMatrix4 mat = instance.mTransform;
- glMultMatrixf((GLfloat*) mat.mMatrix);
+ gGL.multMatrix((GLfloat*) mat.mMatrix);
for (U32 i = 0; i < mVertexBuffer[mPreviewLOD][model].size(); ++i)
{
@@ -5137,7 +5185,8 @@ BOOL LLModelPreview::render()
const std::string& binding = instance.mModel->mMaterialList[i];
const LLImportMaterial& material = instance.mMaterial[binding];
- glColor4fv(material.mDiffuseColor.mV);
+ gGL.diffuseColor4fv(material.mDiffuseColor.mV);
+
if (material.mDiffuseMap.notNull())
{
if (material.mDiffuseMap->getDiscardLevel() > -1)
@@ -5150,12 +5199,12 @@ BOOL LLModelPreview::render()
}
else
{
- glColor4f(1,1,1,1);
+ gGL.diffuseColor4f(1,1,1,1);
}
buffer->drawRange(LLRender::TRIANGLES, 0, buffer->getNumVerts()-1, buffer->getNumIndices(), 0);
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
- glColor3f(0.4f, 0.4f, 0.4f);
+ gGL.diffuseColor3f(0.4f, 0.4f, 0.4f);
if (edges)
{
@@ -5203,7 +5252,7 @@ BOOL LLModelPreview::render()
gGL.pushMatrix();
LLMatrix4 mat = instance.mTransform;
- glMultMatrixf((GLfloat*) mat.mMatrix);
+ gGL.multMatrix((GLfloat*) mat.mMatrix);
bool render_mesh = true;
@@ -5268,12 +5317,12 @@ BOOL LLModelPreview::render()
LLVertexBuffer* buffer = mVertexBuffer[LLModel::LOD_PHYSICS][model][i];
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
- glColor4f(0.4f, 0.4f, 0.0f, 0.4f);
+ gGL.diffuseColor4f(0.4f, 0.4f, 0.0f, 0.4f);
buffer->setBuffer(type_mask & buffer->getTypeMask());
buffer->drawRange(LLRender::TRIANGLES, 0, buffer->getNumVerts()-1, buffer->getNumIndices(), 0);
- glColor3f(1.f, 1.f, 0.f);
+ gGL.diffuseColor3f(1.f, 1.f, 0.f);
glLineWidth(2.f);
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
@@ -5293,7 +5342,7 @@ BOOL LLModelPreview::render()
//show degenerate triangles
LLGLDepthTest depth(GL_TRUE, GL_TRUE, GL_ALWAYS);
LLGLDisable cull(GL_CULL_FACE);
- glColor4f(1.f,0.f,0.f,1.f);
+ gGL.diffuseColor4f(1.f,0.f,0.f,1.f);
const LLVector4a scale(0.5f);
for (LLMeshUploadThread::instance_list::iterator iter = mUploadData.begin(); iter != mUploadData.end(); ++iter)
@@ -5310,7 +5359,7 @@ BOOL LLModelPreview::render()
gGL.pushMatrix();
LLMatrix4 mat = instance.mTransform;
- glMultMatrixf((GLfloat*) mat.mMatrix);
+ gGL.multMatrix((GLfloat*) mat.mMatrix);
LLPhysicsDecomp* decomp = gMeshRepo.mDecompThread;
@@ -5376,7 +5425,16 @@ BOOL LLModelPreview::render()
if (joint_positions)
{
+ LLGLSLShader* shader = LLGLSLShader::sCurBoundShaderPtr;
+ if (shader)
+ {
+ gDebugProgram.bind();
+ }
getPreviewAvatar()->renderCollisionVolumes();
+ if (shader)
+ {
+ shader->bind();
+ }
}
for (LLModelLoader::scene::iterator iter = mScene[mPreviewLOD].begin(); iter != mScene[mPreviewLOD].end(); ++iter)
@@ -5415,7 +5473,7 @@ BOOL LLModelPreview::render()
}
}
- for (U32 j = 0; j < buffer->getRequestedVerts(); ++j)
+ for (U32 j = 0; j < buffer->getNumVerts(); ++j)
{
LLMatrix4 final_mat;
final_mat.mMatrix[0][0] = final_mat.mMatrix[1][1] = final_mat.mMatrix[2][2] = final_mat.mMatrix[3][3] = 0.f;
@@ -5459,11 +5517,12 @@ BOOL LLModelPreview::render()
const std::string& binding = instance.mModel->mMaterialList[i];
const LLImportMaterial& material = instance.mMaterial[binding];
+
buffer->setBuffer(type_mask & buffer->getTypeMask());
- glColor4fv(material.mDiffuseColor.mV);
+ gGL.diffuseColor4fv(material.mDiffuseColor.mV);
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
buffer->draw(LLRender::TRIANGLES, buffer->getNumIndices(), 0);
- glColor3f(0.4f, 0.4f, 0.4f);
+ gGL.diffuseColor3f(0.4f, 0.4f, 0.4f);
if (edges)
{
@@ -5480,6 +5539,11 @@ BOOL LLModelPreview::render()
}
}
+ if (use_shaders)
+ {
+ gObjectPreviewProgram.unbind();
+ }
+
gGL.popMatrix();
return TRUE;
@@ -5568,6 +5632,7 @@ void LLFloaterModelPreview::onReset(void* user_data)
assert_main_thread();
LLFloaterModelPreview* fmp = (LLFloaterModelPreview*) user_data;
+ fmp->childDisable("reset_btn");
LLModelPreview* mp = fmp->mModelPreview;
std::string filename = mp->mLODFile[3];
diff --git a/indra/newview/llfloatermodelpreview.h b/indra/newview/llfloatermodelpreview.h
index 47de99ce25..64324854a5 100644
--- a/indra/newview/llfloatermodelpreview.h
+++ b/indra/newview/llfloatermodelpreview.h
@@ -70,7 +70,8 @@ public:
GENERATING_VERTEX_BUFFERS,
GENERATING_LOD,
DONE,
- ERROR_PARSING //basically loading failed
+ ERROR_PARSING, //basically loading failed
+ ERROR_MATERIALS,
} eLoadState;
U32 mState;
diff --git a/indra/newview/llfloaternamedesc.cpp b/indra/newview/llfloaternamedesc.cpp
index ae95d4392a..66f0fc3cd7 100644
--- a/indra/newview/llfloaternamedesc.cpp
+++ b/indra/newview/llfloaternamedesc.cpp
@@ -204,3 +204,24 @@ BOOL LLFloaterSoundPreview::postBuild()
getChild<LLUICtrl>("ok_btn")->setCommitCallback(boost::bind(&LLFloaterNameDesc::onBtnOK, this));
return TRUE;
}
+
+
+//-----------------------------------------------------------------------------
+// LLFloaterScriptPreview()
+//-----------------------------------------------------------------------------
+
+LLFloaterScriptPreview::LLFloaterScriptPreview(const LLSD& filename )
+ : LLFloaterNameDesc(filename)
+{
+ mIsText = TRUE;
+}
+
+BOOL LLFloaterScriptPreview::postBuild()
+{
+ if (!LLFloaterNameDesc::postBuild())
+ {
+ return FALSE;
+ }
+ getChild<LLUICtrl>("ok_btn")->setCommitCallback(boost::bind(&LLFloaterNameDesc::onBtnOK, this));
+ return TRUE;
+}
diff --git a/indra/newview/llfloaternamedesc.h b/indra/newview/llfloaternamedesc.h
index 7381a6334a..69bbccaf80 100644
--- a/indra/newview/llfloaternamedesc.h
+++ b/indra/newview/llfloaternamedesc.h
@@ -51,6 +51,7 @@ protected:
protected:
BOOL mIsAudio;
+ bool mIsText;
std::string mFilenameAndPath;
std::string mFilename;
@@ -62,5 +63,12 @@ public:
LLFloaterSoundPreview(const LLSD& filename );
virtual BOOL postBuild();
};
-
+
+class LLFloaterScriptPreview : public LLFloaterNameDesc
+{
+public:
+ LLFloaterScriptPreview(const LLSD& filename );
+ virtual BOOL postBuild();
+};
+
#endif // LL_LLFLOATERNAMEDESC_H
diff --git a/indra/newview/llfloaternotificationsconsole.cpp b/indra/newview/llfloaternotificationsconsole.cpp
index 29af81d64c..2681d4b34d 100644
--- a/indra/newview/llfloaternotificationsconsole.cpp
+++ b/indra/newview/llfloaternotificationsconsole.cpp
@@ -220,7 +220,7 @@ void LLFloaterNotificationConsole::addChannel(const std::string& name, bool open
void LLFloaterNotificationConsole::removeChannel(const std::string& name)
{
LLPanel* panelp = getChild<LLPanel>(name);
- getChildRef<LLLayoutStack>("notification_channels").removePanel(panelp);
+ getChildRef<LLView>("notification_channels").removeChild(panelp);
delete panelp;
updateResizeLimits();
diff --git a/indra/newview/llfloateropenobject.cpp b/indra/newview/llfloateropenobject.cpp
index 8b6619def2..4bfef8b45f 100644
--- a/indra/newview/llfloateropenobject.cpp
+++ b/indra/newview/llfloateropenobject.cpp
@@ -162,26 +162,66 @@ void LLFloaterOpenObject::moveToInventory(bool wear)
{
parent_category_id = gInventory.getRootFolderID();
}
+
+ LLCategoryCreate* cat_data = new LLCategoryCreate(object_id, wear);
+
LLUUID category_id = gInventory.createNewCategory(parent_category_id,
- LLFolderType::FT_NONE,
- name);
+ LLFolderType::FT_NONE,
+ name,
+ callbackCreateInventoryCategory,
+ (void*)cat_data);
+
+ //If we get a null category ID, we are using a capability in createNewCategory and we will
+ //handle the following in the callbackCreateInventoryCategory routine.
+ if ( category_id.notNull() )
+ {
+ delete cat_data;
+
+ LLCatAndWear* data = new LLCatAndWear;
+ data->mCatID = category_id;
+ data->mWear = wear;
+ data->mFolderResponded = false;
+
+ // Copy and/or move the items into the newly created folder.
+ // Ignore any "you're going to break this item" messages.
+ BOOL success = move_inv_category_world_to_agent(object_id, category_id, TRUE,
+ callbackMoveInventory,
+ (void*)data);
+ if (!success)
+ {
+ delete data;
+ data = NULL;
- LLCatAndWear* data = new LLCatAndWear;
- data->mCatID = category_id;
- data->mWear = wear;
+ LLNotificationsUtil::add("OpenObjectCannotCopy");
+ }
+ }
+}
+// static
+void LLFloaterOpenObject::callbackCreateInventoryCategory(const LLSD& result, void* data)
+{
+ LLCategoryCreate* cat_data = (LLCategoryCreate*)data;
+
+ LLUUID category_id = result["folder_id"].asUUID();
+ LLCatAndWear* wear_data = new LLCatAndWear;
+
+ wear_data->mCatID = category_id;
+ wear_data->mWear = cat_data->mWear;
+ wear_data->mFolderResponded = true;
+
// Copy and/or move the items into the newly created folder.
// Ignore any "you're going to break this item" messages.
- BOOL success = move_inv_category_world_to_agent(object_id, category_id, TRUE,
+ BOOL success = move_inv_category_world_to_agent(cat_data->mObjectID, category_id, TRUE,
callbackMoveInventory,
- (void*)data);
+ (void*)wear_data);
if (!success)
{
- delete data;
- data = NULL;
-
+ delete wear_data;
+ wear_data = NULL;
+
LLNotificationsUtil::add("OpenObjectCannotCopy");
}
+ delete cat_data;
}
// static
diff --git a/indra/newview/llfloateropenobject.h b/indra/newview/llfloateropenobject.h
index 0706e99f16..bf7fe69c65 100644
--- a/indra/newview/llfloateropenobject.h
+++ b/indra/newview/llfloateropenobject.h
@@ -45,10 +45,20 @@ public:
void dirty();
+ class LLCategoryCreate
+ {
+ public:
+ LLCategoryCreate(LLUUID object_id, bool wear) : mObjectID(object_id), mWear(wear) {}
+ public:
+ LLUUID mObjectID;
+ bool mWear;
+ };
+
struct LLCatAndWear
{
LLUUID mCatID;
bool mWear;
+ bool mFolderResponded;
};
protected:
@@ -62,6 +72,7 @@ protected:
void onClickMoveToInventory();
void onClickMoveAndWear();
+ static void callbackCreateInventoryCategory(const LLSD& result, void* data);
static void callbackMoveInventory(S32 result, void* data);
private:
diff --git a/indra/newview/llfloateroutbox.cpp b/indra/newview/llfloateroutbox.cpp
new file mode 100644
index 0000000000..540f977305
--- /dev/null
+++ b/indra/newview/llfloateroutbox.cpp
@@ -0,0 +1,567 @@
+/**
+ * @file llfloateroutbox.cpp
+ * @brief Implementation of the merchant outbox window
+ *
+ * $LicenseInfo:firstyear=2001&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llfloateroutbox.h"
+
+#include "llfloaterreg.h"
+#include "llfolderview.h"
+#include "llinventorybridge.h"
+#include "llinventorymodelbackgroundfetch.h"
+#include "llinventoryobserver.h"
+#include "llinventorypanel.h"
+#include "llmarketplacefunctions.h"
+#include "llnotificationhandler.h"
+#include "llnotificationmanager.h"
+#include "llnotificationsutil.h"
+#include "lltextbox.h"
+#include "lltransientfloatermgr.h"
+#include "lltrans.h"
+#include "llviewernetwork.h"
+#include "llwindowshade.h"
+
+#define USE_WINDOWSHADE_DIALOGS 0
+
+
+///----------------------------------------------------------------------------
+/// LLOutboxNotification class
+///----------------------------------------------------------------------------
+
+bool LLNotificationsUI::LLOutboxNotification::processNotification(const LLSD& notify)
+{
+ LLFloaterOutbox* outbox_floater = LLFloaterReg::getTypedInstance<LLFloaterOutbox>("outbox");
+
+ outbox_floater->showNotification(notify);
+
+ return false;
+}
+
+
+///----------------------------------------------------------------------------
+/// LLOutboxAddedObserver helper class
+///----------------------------------------------------------------------------
+
+class LLOutboxAddedObserver : public LLInventoryCategoryAddedObserver
+{
+public:
+ LLOutboxAddedObserver(LLFloaterOutbox * outboxFloater)
+ : LLInventoryCategoryAddedObserver()
+ , mOutboxFloater(outboxFloater)
+ {
+ }
+
+ void done()
+ {
+ for (cat_vec_t::iterator it = mAddedCategories.begin(); it != mAddedCategories.end(); ++it)
+ {
+ LLViewerInventoryCategory* added_category = *it;
+
+ LLFolderType::EType added_category_type = added_category->getPreferredType();
+
+ if (added_category_type == LLFolderType::FT_OUTBOX)
+ {
+ mOutboxFloater->setupOutbox(added_category->getUUID());
+ }
+ }
+ }
+
+private:
+ LLFloaterOutbox * mOutboxFloater;
+};
+
+///----------------------------------------------------------------------------
+/// LLFloaterOutbox
+///----------------------------------------------------------------------------
+
+LLFloaterOutbox::LLFloaterOutbox(const LLSD& key)
+ : LLFloater(key)
+ , mCategoriesObserver(NULL)
+ , mCategoryAddedObserver(NULL)
+ , mImportBusy(false)
+ , mImportButton(NULL)
+ , mInventoryFolderCountText(NULL)
+ , mInventoryImportInProgress(NULL)
+ , mInventoryPlaceholder(NULL)
+ , mInventoryText(NULL)
+ , mInventoryTitle(NULL)
+ , mOutboxId(LLUUID::null)
+ , mOutboxInventoryPanel(NULL)
+ , mOutboxItemCount(0)
+ , mOutboxTopLevelDropZone(NULL)
+ , mWindowShade(NULL)
+{
+}
+
+LLFloaterOutbox::~LLFloaterOutbox()
+{
+ if (mCategoriesObserver && gInventory.containsObserver(mCategoriesObserver))
+ {
+ gInventory.removeObserver(mCategoriesObserver);
+ }
+ delete mCategoriesObserver;
+
+ if (mCategoryAddedObserver && gInventory.containsObserver(mCategoryAddedObserver))
+ {
+ gInventory.removeObserver(mCategoryAddedObserver);
+ }
+ delete mCategoryAddedObserver;
+}
+
+BOOL LLFloaterOutbox::postBuild()
+{
+ mInventoryFolderCountText = getChild<LLTextBox>("outbox_folder_count");
+ mInventoryImportInProgress = getChild<LLView>("import_progress_indicator");
+ mInventoryPlaceholder = getChild<LLView>("outbox_inventory_placeholder_panel");
+ mInventoryText = mInventoryPlaceholder->getChild<LLTextBox>("outbox_inventory_placeholder_text");
+ mInventoryTitle = mInventoryPlaceholder->getChild<LLTextBox>("outbox_inventory_placeholder_title");
+
+ mImportButton = getChild<LLButton>("outbox_import_btn");
+ mImportButton->setCommitCallback(boost::bind(&LLFloaterOutbox::onImportButtonClicked, this));
+
+ mOutboxTopLevelDropZone = getChild<LLPanel>("outbox_generic_drag_target");
+
+ LLFocusableElement::setFocusReceivedCallback(boost::bind(&LLFloaterOutbox::onFocusReceived, this));
+
+ return TRUE;
+}
+
+void LLFloaterOutbox::onClose(bool app_quitting)
+{
+ if (mWindowShade)
+ {
+ delete mWindowShade;
+
+ mWindowShade = NULL;
+ }
+}
+
+void LLFloaterOutbox::onOpen(const LLSD& key)
+{
+ //
+ // Look for an outbox and set up the inventory API
+ //
+
+ if (mOutboxId.isNull())
+ {
+ const bool do_not_create_folder = false;
+ const bool do_not_find_in_library = false;
+
+ const LLUUID outbox_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_OUTBOX, do_not_create_folder, do_not_find_in_library);
+
+ if (outbox_id.isNull())
+ {
+ // Observe category creation to catch outbox creation
+ mCategoryAddedObserver = new LLOutboxAddedObserver(this);
+ gInventory.addObserver(mCategoryAddedObserver);
+ }
+ else
+ {
+ setupOutbox(outbox_id);
+ }
+ }
+
+ updateView();
+
+ //
+ // Trigger fetch of outbox contents
+ //
+
+ fetchOutboxContents();
+}
+
+void LLFloaterOutbox::onFocusReceived()
+{
+ fetchOutboxContents();
+}
+
+void LLFloaterOutbox::fetchOutboxContents()
+{
+ if (mOutboxId.notNull())
+ {
+ LLInventoryModelBackgroundFetch::instance().start(mOutboxId);
+ }
+}
+
+void LLFloaterOutbox::setupOutbox(const LLUUID& outboxId)
+{
+ llassert(outboxId.notNull());
+ llassert(mOutboxId.isNull());
+ llassert(mCategoriesObserver == NULL);
+
+ mOutboxId = outboxId;
+
+ // No longer need to observe new category creation
+ if (mCategoryAddedObserver && gInventory.containsObserver(mCategoryAddedObserver))
+ {
+ gInventory.removeObserver(mCategoryAddedObserver);
+ delete mCategoryAddedObserver;
+ mCategoryAddedObserver = NULL;
+ }
+
+ // Create observer for outbox modifications
+ mCategoriesObserver = new LLInventoryCategoriesObserver();
+ gInventory.addObserver(mCategoriesObserver);
+
+ mCategoriesObserver->addCategory(mOutboxId, boost::bind(&LLFloaterOutbox::onOutboxChanged, this));
+
+ //
+ // Set up the outbox inventory view
+ //
+
+ mOutboxInventoryPanel =
+ LLUICtrlFactory::createFromFile<LLInventoryPanel>("panel_outbox_inventory.xml",
+ mInventoryPlaceholder->getParent(),
+ LLInventoryPanel::child_registry_t::instance());
+
+ llassert(mOutboxInventoryPanel);
+
+ // Reshape the inventory to the proper size
+ LLRect inventory_placeholder_rect = mInventoryPlaceholder->getRect();
+ mOutboxInventoryPanel->setShape(inventory_placeholder_rect);
+
+ // Set the sort order newest to oldest
+ mOutboxInventoryPanel->setSortOrder(LLInventoryFilter::SO_FOLDERS_BY_NAME);
+ mOutboxInventoryPanel->getFilter()->markDefault();
+
+ fetchOutboxContents();
+
+ //
+ // Initialize the marketplace import API
+ //
+
+ LLMarketplaceInventoryImporter& importer = LLMarketplaceInventoryImporter::instance();
+
+ importer.setInitializationErrorCallback(boost::bind(&LLFloaterOutbox::initializationReportError, this, _1, _2));
+ importer.setStatusChangedCallback(boost::bind(&LLFloaterOutbox::importStatusChanged, this, _1));
+ importer.setStatusReportCallback(boost::bind(&LLFloaterOutbox::importReportResults, this, _1, _2));
+ importer.initialize();
+}
+
+void LLFloaterOutbox::setStatusString(const std::string& statusString)
+{
+ llassert(mInventoryFolderCountText != NULL);
+
+ mInventoryFolderCountText->setText(statusString);
+}
+
+void LLFloaterOutbox::updateFolderCount()
+{
+ S32 item_count = 0;
+
+ if (mOutboxId.notNull())
+ {
+ LLInventoryModel::cat_array_t * cats;
+ LLInventoryModel::item_array_t * items;
+ gInventory.getDirectDescendentsOf(mOutboxId, cats, items);
+
+ item_count = cats->count() + items->count();
+ }
+
+ mOutboxItemCount = item_count;
+
+ if (!mImportBusy)
+ {
+ updateFolderCountStatus();
+ }
+}
+
+void LLFloaterOutbox::updateFolderCountStatus()
+{
+ if (mOutboxInventoryPanel)
+ {
+ switch (mOutboxItemCount)
+ {
+ case 0: setStatusString(getString("OutboxFolderCount0")); break;
+ case 1: setStatusString(getString("OutboxFolderCount1")); break;
+ default:
+ {
+ std::string item_count_str = llformat("%d", mOutboxItemCount);
+
+ LLStringUtil::format_map_t args;
+ args["[NUM]"] = item_count_str;
+
+ setStatusString(getString("OutboxFolderCountN", args));
+ break;
+ }
+ }
+ }
+
+ mImportButton->setEnabled(mOutboxItemCount > 0);
+}
+
+void LLFloaterOutbox::updateView()
+{
+ updateFolderCount();
+
+ if (mOutboxItemCount > 0)
+ {
+ mOutboxInventoryPanel->setVisible(TRUE);
+ mInventoryPlaceholder->setVisible(FALSE);
+ }
+ else
+ {
+ if (mOutboxInventoryPanel)
+ {
+ mOutboxInventoryPanel->setVisible(FALSE);
+ }
+
+ mInventoryPlaceholder->setVisible(TRUE);
+
+ std::string outbox_text;
+ std::string outbox_title;
+ std::string outbox_tooltip;
+
+ const LLSD& subs = getMarketplaceStringSubstitutions();
+
+ if (mOutboxId.notNull())
+ {
+ outbox_text = LLTrans::getString("InventoryOutboxNoItems", subs);
+ outbox_title = LLTrans::getString("InventoryOutboxNoItemsTitle");
+ outbox_tooltip = LLTrans::getString("InventoryOutboxNoItemsTooltip");
+ }
+ else
+ {
+ outbox_text = LLTrans::getString("InventoryOutboxNotMerchant", subs);
+ outbox_title = LLTrans::getString("InventoryOutboxNotMerchantTitle");
+ outbox_tooltip = LLTrans::getString("InventoryOutboxNotMerchantTooltip");
+ }
+
+ mInventoryText->setValue(outbox_text);
+ mInventoryTitle->setValue(outbox_title);
+ mInventoryPlaceholder->getParent()->setToolTip(outbox_tooltip);
+ }
+}
+
+bool isAccepted(EAcceptance accept)
+{
+ return (accept >= ACCEPT_YES_COPY_SINGLE);
+}
+
+BOOL LLFloaterOutbox::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
+ EDragAndDropType cargo_type,
+ void* cargo_data,
+ EAcceptance* accept,
+ std::string& tooltip_msg)
+{
+ if ((mOutboxInventoryPanel == NULL) ||
+ (mWindowShade && mWindowShade->isShown()) ||
+ LLMarketplaceInventoryImporter::getInstance()->isImportInProgress())
+ {
+ return FALSE;
+ }
+
+ LLView * handled_view = childrenHandleDragAndDrop(x, y, mask, drop, cargo_type, cargo_data, accept, tooltip_msg);
+ BOOL handled = (handled_view != NULL);
+
+ // Determine if the mouse is inside the inventory panel itself or just within the floater
+ bool pointInInventoryPanel = false;
+ bool pointInInventoryPanelChild = false;
+ LLFolderView * root_folder = mOutboxInventoryPanel->getRootFolder();
+ if (mOutboxInventoryPanel->getVisible())
+ {
+ S32 inv_x, inv_y;
+ localPointToOtherView(x, y, &inv_x, &inv_y, mOutboxInventoryPanel);
+
+ pointInInventoryPanel = mOutboxInventoryPanel->getRect().pointInRect(inv_x, inv_y);
+
+ LLView * inventory_panel_child_at_point = mOutboxInventoryPanel->childFromPoint(inv_x, inv_y, true);
+ pointInInventoryPanelChild = (inventory_panel_child_at_point != root_folder);
+ }
+
+ // Pass all drag and drop for this floater to the outbox inventory control
+ if (!handled || !isAccepted(*accept))
+ {
+ // Handle the drag and drop directly to the root of the outbox if we're not in the inventory panel
+ // (otherwise the inventory panel itself will handle the drag and drop operation, without any override)
+ if (!pointInInventoryPanel)
+ {
+ handled = root_folder->handleDragAndDropToThisFolder(mask, drop, cargo_type, cargo_data, accept, tooltip_msg);
+ }
+
+ mOutboxTopLevelDropZone->setBackgroundVisible(handled && !drop && isAccepted(*accept));
+ }
+ else
+ {
+ mOutboxTopLevelDropZone->setBackgroundVisible(!pointInInventoryPanelChild);
+ }
+
+ return handled;
+}
+
+BOOL LLFloaterOutbox::handleHover(S32 x, S32 y, MASK mask)
+{
+ mOutboxTopLevelDropZone->setBackgroundVisible(FALSE);
+
+ return LLFloater::handleHover(x, y, mask);
+}
+
+void LLFloaterOutbox::onMouseLeave(S32 x, S32 y, MASK mask)
+{
+ mOutboxTopLevelDropZone->setBackgroundVisible(FALSE);
+
+ LLFloater::onMouseLeave(x, y, mask);
+}
+
+void LLFloaterOutbox::onImportButtonClicked()
+{
+ mOutboxInventoryPanel->clearSelection();
+
+ mImportBusy = LLMarketplaceInventoryImporter::instance().triggerImport();
+}
+
+void LLFloaterOutbox::onOutboxChanged()
+{
+ llassert(!mOutboxId.isNull());
+
+ if (mOutboxInventoryPanel)
+ {
+ mOutboxInventoryPanel->requestSort();
+ }
+
+ fetchOutboxContents();
+
+ updateView();
+}
+
+void LLFloaterOutbox::importReportResults(U32 status, const LLSD& content)
+{
+ if (status == MarketplaceErrorCodes::IMPORT_DONE)
+ {
+ LLNotificationsUtil::add("OutboxImportComplete");
+ }
+ else if (status == MarketplaceErrorCodes::IMPORT_DONE_WITH_ERRORS)
+ {
+ const LLSD& subs = getMarketplaceStringSubstitutions();
+
+ LLNotificationsUtil::add("OutboxImportHadErrors", subs);
+ }
+ else
+ {
+ char status_string[16];
+ sprintf(status_string, "%d", status);
+
+ LLSD subs;
+ subs["[ERROR_CODE]"] = status_string;
+
+ LLNotificationsUtil::add("OutboxImportFailed", subs);
+ }
+
+ updateView();
+}
+
+void LLFloaterOutbox::importStatusChanged(bool inProgress)
+{
+ if (inProgress)
+ {
+ if (mImportBusy)
+ {
+ setStatusString(getString("OutboxImporting"));
+ }
+ else
+ {
+ setStatusString(getString("OutboxInitializing"));
+ }
+
+ mImportBusy = true;
+ mImportButton->setEnabled(false);
+ mInventoryImportInProgress->setVisible(true);
+ }
+ else
+ {
+ mImportBusy = false;
+ mImportButton->setEnabled(mOutboxItemCount > 0);
+ mInventoryImportInProgress->setVisible(false);
+ }
+
+ updateView();
+}
+
+void LLFloaterOutbox::initializationReportError(U32 status, const LLSD& content)
+{
+ if (status != MarketplaceErrorCodes::IMPORT_DONE)
+ {
+ char status_string[16];
+ sprintf(status_string, "%d", status);
+
+ LLSD subs;
+ subs["[ERROR_CODE]"] = status_string;
+
+ LLNotificationsUtil::add("OutboxInitFailed", subs);
+ }
+
+ updateView();
+}
+
+void LLFloaterOutbox::showNotification(const LLSD& notify)
+{
+ LLNotificationPtr notification = LLNotifications::instance().find(notify["id"].asUUID());
+
+ if (!notification)
+ {
+ llerrs << "Unable to find outbox notification!" << notify.asString() << llendl;
+
+ return;
+ }
+
+#if USE_WINDOWSHADE_DIALOGS
+
+ if (mWindowShade)
+ {
+ delete mWindowShade;
+ }
+
+ LLRect floater_rect = getLocalRect();
+ floater_rect.mTop -= getHeaderHeight();
+ floater_rect.stretch(-5, 0);
+
+ LLWindowShade::Params params;
+ params.name = "notification_shade";
+ params.rect = floater_rect;
+ params.follows.flags = FOLLOWS_ALL;
+ params.modal = true;
+ params.can_close = false;
+ params.shade_color = LLColor4::white % 0.25f;
+ params.text_color = LLColor4::white;
+
+ mWindowShade = LLUICtrlFactory::create<LLWindowShade>(params);
+
+ addChild(mWindowShade);
+ mWindowShade->show(notification);
+
+#else
+
+ LLNotificationsUI::LLEventHandler * handler =
+ LLNotificationsUI::LLNotificationManager::instance().getHandlerForNotification("alertmodal");
+
+ LLNotificationsUI::LLSysHandler * sys_handler = dynamic_cast<LLNotificationsUI::LLSysHandler *>(handler);
+ llassert(sys_handler);
+
+ sys_handler->processNotification(notify);
+
+#endif
+}
+
diff --git a/indra/newview/llfloateroutbox.h b/indra/newview/llfloateroutbox.h
new file mode 100644
index 0000000000..18baccf1c9
--- /dev/null
+++ b/indra/newview/llfloateroutbox.h
@@ -0,0 +1,114 @@
+/**
+ * @file llfloateroutbox.h
+ * @brief LLFloaterOutbox
+ * class definition
+ *
+ * $LicenseInfo:firstyear=2001&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * ABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLFLOATEROUTBOX_H
+#define LL_LLFLOATEROUTBOX_H
+
+#include "llfloater.h"
+#include "llfoldertype.h"
+#include "llnotificationptr.h"
+
+
+class LLButton;
+class LLInventoryCategoriesObserver;
+class LLInventoryCategoryAddedObserver;
+class LLInventoryPanel;
+class LLLoadingIndicator;
+class LLNotification;
+class LLTextBox;
+class LLView;
+class LLWindowShade;
+
+
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// Class LLFloaterOutbox
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+class LLFloaterOutbox : public LLFloater
+{
+public:
+ LLFloaterOutbox(const LLSD& key);
+ ~LLFloaterOutbox();
+
+ void setupOutbox(const LLUUID& outboxId);
+
+ // virtuals
+ BOOL postBuild();
+ BOOL handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
+ EDragAndDropType cargo_type,
+ void* cargo_data,
+ EAcceptance* accept,
+ std::string& tooltip_msg);
+
+ void showNotification(const LLSD& notify);
+
+ BOOL handleHover(S32 x, S32 y, MASK mask);
+ void onMouseLeave(S32 x, S32 y, MASK mask);
+
+protected:
+ void fetchOutboxContents();
+
+ void importReportResults(U32 status, const LLSD& content);
+ void importStatusChanged(bool inProgress);
+ void initializationReportError(U32 status, const LLSD& content);
+
+ void onClose(bool app_quitting);
+ void onOpen(const LLSD& key);
+
+ void onFocusReceived();
+
+ void onImportButtonClicked();
+ void onOutboxChanged();
+
+ void setStatusString(const std::string& statusString);
+
+ void updateFolderCount();
+ void updateFolderCountStatus();
+ void updateView();
+
+private:
+ LLInventoryCategoriesObserver * mCategoriesObserver;
+ LLInventoryCategoryAddedObserver * mCategoryAddedObserver;
+
+ bool mImportBusy;
+ LLButton * mImportButton;
+
+ LLTextBox * mInventoryFolderCountText;
+ LLView * mInventoryImportInProgress;
+ LLView * mInventoryPlaceholder;
+ LLTextBox * mInventoryText;
+ LLTextBox * mInventoryTitle;
+
+ LLUUID mOutboxId;
+ LLInventoryPanel * mOutboxInventoryPanel;
+ U32 mOutboxItemCount;
+ LLPanel * mOutboxTopLevelDropZone;
+
+ LLWindowShade * mWindowShade;
+};
+
+#endif // LL_LLFLOATEROUTBOX_H
diff --git a/indra/newview/llfloaterpostcard.cpp b/indra/newview/llfloaterpostcard.cpp
deleted file mode 100644
index 3bcbb987f7..0000000000
--- a/indra/newview/llfloaterpostcard.cpp
+++ /dev/null
@@ -1,384 +0,0 @@
-/**
- * @file llfloaterpostcard.cpp
- * @brief Postcard send floater, allows setting name, e-mail address, etc.
- *
- * $LicenseInfo:firstyear=2004&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-#include "llviewerprecompiledheaders.h"
-
-#include "llfloaterpostcard.h"
-
-#include "llfontgl.h"
-#include "llsys.h"
-#include "llgl.h"
-#include "v3dmath.h"
-#include "lldir.h"
-
-#include "llagent.h"
-#include "llui.h"
-#include "lllineeditor.h"
-#include "llbutton.h"
-#include "lltexteditor.h"
-#include "llfloaterreg.h"
-#include "llnotificationsutil.h"
-#include "llviewercontrol.h"
-#include "llviewernetwork.h"
-#include "lluictrlfactory.h"
-#include "lluploaddialog.h"
-#include "llviewerstats.h"
-#include "llviewerwindow.h"
-#include "llstatusbar.h"
-#include "llviewerregion.h"
-#include "lleconomy.h"
-#include "message.h"
-
-#include "llimagejpeg.h"
-#include "llimagej2c.h"
-#include "llvfile.h"
-#include "llvfs.h"
-#include "llviewertexture.h"
-#include "llassetuploadresponders.h"
-#include "llagentui.h"
-
-#include <boost/regex.hpp> //boost.regex lib
-
-///----------------------------------------------------------------------------
-/// Local function declarations, constants, enums, and typedefs
-///----------------------------------------------------------------------------
-
-///----------------------------------------------------------------------------
-/// Class LLFloaterPostcard
-///----------------------------------------------------------------------------
-
-LLFloaterPostcard::LLFloaterPostcard(const LLSD& key)
-: LLFloater(key),
- mJPEGImage(NULL),
- mViewerImage(NULL),
- mHasFirstMsgFocus(false)
-{
-}
-
-// Destroys the object
-LLFloaterPostcard::~LLFloaterPostcard()
-{
- mJPEGImage = NULL; // deletes image
-}
-
-BOOL LLFloaterPostcard::postBuild()
-{
- // pick up the user's up-to-date email address
- gAgent.sendAgentUserInfoRequest();
-
- childSetAction("cancel_btn", onClickCancel, this);
- childSetAction("send_btn", onClickSend, this);
-
- getChildView("from_form")->setEnabled(FALSE);
-
- std::string name_string;
- LLAgentUI::buildFullname(name_string);
- getChild<LLUICtrl>("name_form")->setValue(LLSD(name_string));
-
- // For the first time a user focusess to .the msg box, all text will be selected.
- getChild<LLUICtrl>("msg_form")->setFocusChangedCallback(boost::bind(onMsgFormFocusRecieved, _1, this));
-
- getChild<LLUICtrl>("to_form")->setFocus(TRUE);
-
- return TRUE;
-}
-
-// static
-LLFloaterPostcard* LLFloaterPostcard::showFromSnapshot(LLImageJPEG *jpeg, LLViewerTexture *img, const LLVector2 &image_scale, const LLVector3d& pos_taken_global)
-{
- // Take the images from the caller
- // It's now our job to clean them up
- LLFloaterPostcard* instance = LLFloaterReg::showTypedInstance<LLFloaterPostcard>("postcard", LLSD(img->getID()));
-
- if (instance) // may be 0 if we're in mouselook mode
- {
- instance->mJPEGImage = jpeg;
- instance->mViewerImage = img;
- instance->mImageScale = image_scale;
- instance->mPosTakenGlobal = pos_taken_global;
- }
-
- return instance;
-}
-
-void LLFloaterPostcard::draw()
-{
- LLGLSUIDefault gls_ui;
- LLFloater::draw();
-
- if(!isMinimized() && mViewerImage.notNull() && mJPEGImage.notNull())
- {
- // Force the texture to be 100% opaque when the floater is focused.
- F32 alpha = getTransparencyType() == TT_ACTIVE ? 1.0f : getCurrentTransparency();
- LLRect rect(getRect());
-
- // first set the max extents of our preview
- rect.translate(-rect.mLeft, -rect.mBottom);
- rect.mLeft += 320;
- rect.mRight -= 10;
- rect.mTop -= 27;
- rect.mBottom = rect.mTop - 130;
-
- // then fix the aspect ratio
- F32 ratio = (F32)mJPEGImage->getWidth() / (F32)mJPEGImage->getHeight();
- if ((F32)rect.getWidth() / (F32)rect.getHeight() >= ratio)
- {
- rect.mRight = LLRect::tCoordType((F32)rect.mLeft + ((F32)rect.getHeight() * ratio));
- }
- else
- {
- rect.mBottom = LLRect::tCoordType((F32)rect.mTop - ((F32)rect.getWidth() / ratio));
- }
- {
- gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
- gl_rect_2d(rect, LLColor4(0.f, 0.f, 0.f, 1.f) % alpha);
- rect.stretch(-1);
- }
- {
-
- glMatrixMode(GL_TEXTURE);
- glPushMatrix();
- {
- glScalef(mImageScale.mV[VX], mImageScale.mV[VY], 1.f);
- glMatrixMode(GL_MODELVIEW);
- gl_draw_scaled_image(rect.mLeft,
- rect.mBottom,
- rect.getWidth(),
- rect.getHeight(),
- mViewerImage.get(),
- LLColor4::white % alpha);
- }
- glMatrixMode(GL_TEXTURE);
- glPopMatrix();
- glMatrixMode(GL_MODELVIEW);
- }
- }
-}
-
-// static
-void LLFloaterPostcard::onClickCancel(void* data)
-{
- if (data)
- {
- LLFloaterPostcard *self = (LLFloaterPostcard *)data;
-
- self->closeFloater(false);
- }
-}
-
-class LLSendPostcardResponder : public LLAssetUploadResponder
-{
-public:
- LLSendPostcardResponder(const LLSD &post_data,
- const LLUUID& vfile_id,
- LLAssetType::EType asset_type):
- LLAssetUploadResponder(post_data, vfile_id, asset_type)
- {
- }
- // *TODO define custom uploadFailed here so it's not such a generic message
- void uploadComplete(const LLSD& content)
- {
- // we don't care about what the server returns from this post, just clean up the UI
- LLUploadDialog::modalUploadFinished();
- }
-};
-
-// static
-void LLFloaterPostcard::onClickSend(void* data)
-{
- if (data)
- {
- LLFloaterPostcard *self = (LLFloaterPostcard *)data;
-
- std::string from(self->getChild<LLUICtrl>("from_form")->getValue().asString());
- std::string to(self->getChild<LLUICtrl>("to_form")->getValue().asString());
-
- boost::regex emailFormat("[A-Za-z0-9.%+-_]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}(,[ \t]*[A-Za-z0-9.%+-_]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,})*");
-
- if (to.empty() || !boost::regex_match(to, emailFormat))
- {
- LLNotificationsUtil::add("PromptRecipientEmail");
- return;
- }
-
- if (from.empty() || !boost::regex_match(from, emailFormat))
- {
- LLNotificationsUtil::add("PromptSelfEmail");
- return;
- }
-
- std::string subject(self->getChild<LLUICtrl>("subject_form")->getValue().asString());
- if(subject.empty() || !self->mHasFirstMsgFocus)
- {
- LLNotificationsUtil::add("PromptMissingSubjMsg", LLSD(), LLSD(), boost::bind(&LLFloaterPostcard::missingSubjMsgAlertCallback, self, _1, _2));
- return;
- }
-
- if (self->mJPEGImage.notNull())
- {
- self->sendPostcard();
- }
- else
- {
- LLNotificationsUtil::add("ErrorProcessingSnapshot");
- }
- }
-}
-
-// static
-void LLFloaterPostcard::uploadCallback(const LLUUID& asset_id, void *user_data, S32 result, LLExtStat ext_status) // StoreAssetData callback (fixed)
-{
- LLFloaterPostcard *self = (LLFloaterPostcard *)user_data;
-
- LLUploadDialog::modalUploadFinished();
-
- if (result)
- {
- LLSD args;
- args["REASON"] = std::string(LLAssetStorage::getErrorString(result));
- LLNotificationsUtil::add("ErrorUploadingPostcard", args);
- }
- else
- {
- // only create the postcard once the upload succeeds
-
- // request the postcard
- LLMessageSystem* msg = gMessageSystem;
- msg->newMessage("SendPostcard");
- msg->nextBlock("AgentData");
- msg->addUUID("AgentID", gAgent.getID());
- msg->addUUID("SessionID", gAgent.getSessionID());
- msg->addUUID("AssetID", self->mAssetID);
- msg->addVector3d("PosGlobal", self->mPosTakenGlobal);
- msg->addString("To", self->getChild<LLUICtrl>("to_form")->getValue().asString());
- msg->addString("From", self->getChild<LLUICtrl>("from_form")->getValue().asString());
- msg->addString("Name", self->getChild<LLUICtrl>("name_form")->getValue().asString());
- msg->addString("Subject", self->getChild<LLUICtrl>("subject_form")->getValue().asString());
- msg->addString("Msg", self->getChild<LLUICtrl>("msg_form")->getValue().asString());
- msg->addBOOL("AllowPublish", FALSE);
- msg->addBOOL("MaturePublish", FALSE);
- gAgent.sendReliableMessage();
- }
-
- self->closeFloater();
-}
-
-// static
-void LLFloaterPostcard::updateUserInfo(const std::string& email)
-{
- LLFloaterReg::const_instance_list_t& inst_list = LLFloaterReg::getFloaterList("postcard");
- for (LLFloaterReg::const_instance_list_t::const_iterator iter = inst_list.begin();
- iter != inst_list.end(); ++iter)
- {
- LLFloater* instance = *iter;
- const std::string& text = instance->getChild<LLUICtrl>("from_form")->getValue().asString();
- if (text.empty())
- {
- // there's no text in this field yet, pre-populate
- instance->getChild<LLUICtrl>("from_form")->setValue(LLSD(email));
- }
- }
-}
-
-void LLFloaterPostcard::onMsgFormFocusRecieved(LLFocusableElement* receiver, void* data)
-{
- LLFloaterPostcard* self = (LLFloaterPostcard *)data;
- if(self)
- {
- LLTextEditor* msgForm = self->getChild<LLTextEditor>("msg_form");
- if(msgForm && msgForm == receiver && msgForm->hasFocus() && !(self->mHasFirstMsgFocus))
- {
- self->mHasFirstMsgFocus = true;
- msgForm->setText(LLStringUtil::null);
- }
- }
-}
-
-bool LLFloaterPostcard::missingSubjMsgAlertCallback(const LLSD& notification, const LLSD& response)
-{
- S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
- if(0 == option)
- {
- // User clicked OK
- if((getChild<LLUICtrl>("subject_form")->getValue().asString()).empty())
- {
- // Stuff the subject back into the form.
- getChild<LLUICtrl>("subject_form")->setValue(getString("default_subject"));
- }
-
- if(!mHasFirstMsgFocus)
- {
- // The user never switched focus to the messagee window.
- // Using the default string.
- getChild<LLUICtrl>("msg_form")->setValue(getString("default_message"));
- }
-
- sendPostcard();
- }
- return false;
-}
-
-void LLFloaterPostcard::sendPostcard()
-{
- mTransactionID.generate();
- mAssetID = mTransactionID.makeAssetID(gAgent.getSecureSessionID());
- LLVFile::writeFile(mJPEGImage->getData(), mJPEGImage->getDataSize(), gVFS, mAssetID, LLAssetType::AT_IMAGE_JPEG);
-
- // upload the image
- std::string url = gAgent.getRegion()->getCapability("SendPostcard");
- if(!url.empty())
- {
- llinfos << "Send Postcard via capability" << llendl;
- LLSD body = LLSD::emptyMap();
- // the capability already encodes: agent ID, region ID
- body["pos-global"] = mPosTakenGlobal.getValue();
- body["to"] = getChild<LLUICtrl>("to_form")->getValue().asString();
- body["from"] = getChild<LLUICtrl>("from_form")->getValue().asString();
- body["name"] = getChild<LLUICtrl>("name_form")->getValue().asString();
- body["subject"] = getChild<LLUICtrl>("subject_form")->getValue().asString();
- body["msg"] = getChild<LLUICtrl>("msg_form")->getValue().asString();
- LLHTTPClient::post(url, body, new LLSendPostcardResponder(body, mAssetID, LLAssetType::AT_IMAGE_JPEG));
- }
- else
- {
- gAssetStorage->storeAssetData(mTransactionID, LLAssetType::AT_IMAGE_JPEG, &uploadCallback, (void *)this, FALSE);
- }
-
- // give user feedback of the event
- gViewerWindow->playSnapshotAnimAndSound();
- LLUploadDialog::modalUploadDialog(getString("upload_message"));
-
- // don't destroy the window until the upload is done
- // this way we keep the information in the form
- setVisible(FALSE);
-
- // also remove any dependency on another floater
- // so that we can be sure to outlive it while we
- // need to.
- LLFloater* dependee = getDependee();
- if (dependee)
- dependee->removeDependentFloater(this);
-}
diff --git a/indra/newview/llfloaterpostcard.h b/indra/newview/llfloaterpostcard.h
deleted file mode 100644
index 472592154f..0000000000
--- a/indra/newview/llfloaterpostcard.h
+++ /dev/null
@@ -1,79 +0,0 @@
-/**
- * @file llfloaterpostcard.h
- * @brief Postcard send floater, allows setting name, e-mail address, etc.
- *
- * $LicenseInfo:firstyear=2004&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-#ifndef LL_LLFLOATERPOSTCARD_H
-#define LL_LLFLOATERPOSTCARD_H
-
-#include "llfloater.h"
-#include "llcheckboxctrl.h"
-
-#include "llpointer.h"
-
-class LLTextEditor;
-class LLLineEditor;
-class LLButton;
-class LLViewerTexture;
-class LLImageJPEG;
-
-class LLFloaterPostcard
-: public LLFloater
-{
-public:
- LLFloaterPostcard(const LLSD& key);
- virtual ~LLFloaterPostcard();
-
- virtual BOOL postBuild();
- virtual void draw();
-
- static LLFloaterPostcard* showFromSnapshot(LLImageJPEG *jpeg, LLViewerTexture *img, const LLVector2& img_scale, const LLVector3d& pos_taken_global);
-
- static void onClickCancel(void* data);
- static void onClickSend(void* data);
-
- static void uploadCallback(const LLUUID& asset_id,
- void *user_data,
- S32 result, LLExtStat ext_status);
-
- static void updateUserInfo(const std::string& email);
-
- static void onMsgFormFocusRecieved(LLFocusableElement* receiver, void* data);
- bool missingSubjMsgAlertCallback(const LLSD& notification, const LLSD& response);
-
- void sendPostcard();
-
-private:
-
- LLPointer<LLImageJPEG> mJPEGImage;
- LLPointer<LLViewerTexture> mViewerImage;
- LLTransactionID mTransactionID;
- LLAssetID mAssetID;
- LLVector2 mImageScale;
- LLVector3d mPosTakenGlobal;
- bool mHasFirstMsgFocus;
-};
-
-
-#endif // LL_LLFLOATERPOSTCARD_H
diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp
index d65928e385..a333989e7e 100755
--- a/indra/newview/llfloaterpreference.cpp
+++ b/indra/newview/llfloaterpreference.cpp
@@ -50,6 +50,7 @@
#include "llfloaterreg.h"
#include "llfloaterabout.h"
#include "llfloaterhardwaresettings.h"
+#include "llfloatersidepanelcontainer.h"
#include "llimfloater.h"
#include "llkeyboard.h"
#include "llmodaldialog.h"
@@ -66,7 +67,6 @@
#include "llscrolllistctrl.h"
#include "llscrolllistitem.h"
#include "llsliderctrl.h"
-#include "llsidetray.h"
#include "lltabcontainer.h"
#include "lltrans.h"
#include "llviewercontrol.h"
@@ -304,7 +304,7 @@ LLFloaterPreference::LLFloaterPreference(const LLSD& key)
mOriginalIMViaEmail(false),
mLanguageChanged(false),
mAvatarDataInitialized(false),
- mDoubleClickActionDirty(false)
+ mClickActionDirty(false)
{
//Build Floater is now Called from LLFloaterReg::add("preferences", "floater_preferences.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterPreference>);
@@ -345,11 +345,11 @@ LLFloaterPreference::LLFloaterPreference(const LLSD& key)
mCommitCallbackRegistrar.add("Pref.MaturitySettings", boost::bind(&LLFloaterPreference::onChangeMaturity, this));
mCommitCallbackRegistrar.add("Pref.BlockList", boost::bind(&LLFloaterPreference::onClickBlockList, this));
mCommitCallbackRegistrar.add("Pref.Proxy", boost::bind(&LLFloaterPreference::onClickProxySettings, this));
+ mCommitCallbackRegistrar.add("Pref.TranslationSettings", boost::bind(&LLFloaterPreference::onClickTranslationSettings, this));
sSkin = gSavedSettings.getString("SkinCurrent");
- mCommitCallbackRegistrar.add("Pref.CommitDoubleClickChekbox", boost::bind(&LLFloaterPreference::onDoubleClickCheckBox, this, _1));
- mCommitCallbackRegistrar.add("Pref.CommitRadioDoubleClick", boost::bind(&LLFloaterPreference::onDoubleClickRadio, this));
+ mCommitCallbackRegistrar.add("Pref.ClickActionChange", boost::bind(&LLFloaterPreference::onClickActionChange, this));
gSavedSettings.getControl("NameTagShowUsernames")->getCommitSignal()->connect(boost::bind(&handleNameTagOptionChanged, _2));
gSavedSettings.getControl("NameTagShowFriends")->getCommitSignal()->connect(boost::bind(&handleNameTagOptionChanged, _2));
@@ -439,8 +439,6 @@ BOOL LLFloaterPreference::postBuild()
if (!tabcontainer->selectTab(gSavedSettings.getS32("LastPrefTab")))
tabcontainer->selectFirstTab();
- updateDoubleClickControls();
-
getChild<LLUICtrl>("cache_location")->setEnabled(FALSE); // make it read-only but selectable (STORM-227)
std::string cache_location = gDirUtilp->getExpandedFilename(LL_PATH_CACHE, "");
setCacheLocation(cache_location);
@@ -581,10 +579,10 @@ void LLFloaterPreference::apply()
saveAvatarProperties();
- if (mDoubleClickActionDirty)
+ if (mClickActionDirty)
{
- updateDoubleClickSettings();
- mDoubleClickActionDirty = false;
+ updateClickActionSettings();
+ mClickActionDirty = false;
}
}
@@ -602,6 +600,9 @@ void LLFloaterPreference::cancel()
}
// hide joystick pref floater
LLFloaterReg::hideInstance("pref_joystick");
+
+ // hide translation settings floater
+ LLFloaterReg::hideInstance("prefs_translation");
// cancel hardware menu
LLFloaterHardwareSettings* hardware_settings = LLFloaterReg::getTypedInstance<LLFloaterHardwareSettings>("prefs_hardware_settings");
@@ -613,11 +614,12 @@ void LLFloaterPreference::cancel()
// reverts any changes to current skin
gSavedSettings.setString("SkinCurrent", sSkin);
- if (mDoubleClickActionDirty)
+ if (mClickActionDirty)
{
- updateDoubleClickControls();
- mDoubleClickActionDirty = false;
+ updateClickActionControls();
+ mClickActionDirty = false;
}
+
LLFloaterPreferenceProxy * advanced_proxy_settings = LLFloaterReg::findTypedInstance<LLFloaterPreferenceProxy>("prefs_proxy");
if (advanced_proxy_settings)
{
@@ -682,6 +684,9 @@ void LLFloaterPreference::onOpen(const LLSD& key)
// Display selected maturity icons.
onChangeMaturity();
+ // Load (double-)click to walk/teleport settings.
+ updateClickActionControls();
+
// Enabled/disabled popups, might have been changed by user actions
// while preferences floater was closed.
buildPopupLists();
@@ -1496,79 +1501,42 @@ void LLFloaterPreference::onChangeMaturity()
// but the UI for this will still be enabled
void LLFloaterPreference::onClickBlockList()
{
- // don't create side tray on demand
- if (LLSideTray::instanceCreated())
- {
- LLSideTray::getInstance()->showPanel("panel_block_list_sidetray");
- }
+ LLFloaterSidePanelContainer::showPanel("people", "panel_block_list_sidetray", LLSD());
}
-void LLFloaterPreference::onDoubleClickCheckBox(LLUICtrl* ctrl)
+void LLFloaterPreference::onClickProxySettings()
{
- if (!ctrl) return;
- mDoubleClickActionDirty = true;
- LLRadioGroup* radio_double_click_action = getChild<LLRadioGroup>("double_click_action");
- if (!radio_double_click_action) return;
- // select default value("teleport") in radio-group.
- radio_double_click_action->setSelectedIndex(0);
- // set radio-group enabled depending on state of checkbox
- radio_double_click_action->setEnabled(ctrl->getValue());
+ LLFloaterReg::showInstance("prefs_proxy");
}
-void LLFloaterPreference::onDoubleClickRadio()
+void LLFloaterPreference::onClickTranslationSettings()
{
- mDoubleClickActionDirty = true;
+ LLFloaterReg::showInstance("prefs_translation");
}
-void LLFloaterPreference::updateDoubleClickSettings()
+void LLFloaterPreference::onClickActionChange()
{
- LLCheckBoxCtrl* double_click_action_cb = getChild<LLCheckBoxCtrl>("double_click_chkbox");
- if (!double_click_action_cb) return;
- bool enable = double_click_action_cb->getValue().asBoolean();
-
- LLRadioGroup* radio_double_click_action = getChild<LLRadioGroup>("double_click_action");
- if (!radio_double_click_action) return;
-
- // enable double click radio-group depending on state of checkbox
- radio_double_click_action->setEnabled(enable);
-
- if (!enable)
- {
- // set double click action settings values to false if checkbox was unchecked
- gSavedSettings.setBOOL("DoubleClickAutoPilot", false);
- gSavedSettings.setBOOL("DoubleClickTeleport", false);
- }
- else
- {
- std::string selected = radio_double_click_action->getValue().asString();
- bool teleport_selected = selected == "radio_teleport";
- // set double click action settings values depending on chosen radio-button
- gSavedSettings.setBOOL( "DoubleClickTeleport", teleport_selected );
- gSavedSettings.setBOOL( "DoubleClickAutoPilot", !teleport_selected );
- }
+ mClickActionDirty = true;
}
-void LLFloaterPreference::onClickProxySettings()
+void LLFloaterPreference::updateClickActionSettings()
{
- LLFloaterReg::showInstance("prefs_proxy");
+ const int single_clk_action = getChild<LLComboBox>("single_click_action_combo")->getValue().asInteger();
+ const int double_clk_action = getChild<LLComboBox>("double_click_action_combo")->getValue().asInteger();
+
+ gSavedSettings.setBOOL("ClickToWalk", single_clk_action == 1);
+ gSavedSettings.setBOOL("DoubleClickAutoPilot", double_clk_action == 1);
+ gSavedSettings.setBOOL("DoubleClickTeleport", double_clk_action == 2);
}
-void LLFloaterPreference::updateDoubleClickControls()
+void LLFloaterPreference::updateClickActionControls()
{
- // check is one of double-click actions settings enabled
- bool double_click_action_enabled = gSavedSettings.getBOOL("DoubleClickAutoPilot") || gSavedSettings.getBOOL("DoubleClickTeleport");
- LLCheckBoxCtrl* double_click_action_cb = getChild<LLCheckBoxCtrl>("double_click_chkbox");
- if (double_click_action_cb)
- {
- // check checkbox if one of double-click actions settings enabled, uncheck otherwise
- double_click_action_cb->setValue(double_click_action_enabled);
- }
- LLRadioGroup* double_click_action_radio = getChild<LLRadioGroup>("double_click_action");
- if (!double_click_action_radio) return;
- // set radio-group enabled if one of double-click actions settings enabled
- double_click_action_radio->setEnabled(double_click_action_enabled);
- // select button in radio-group depending on setting
- double_click_action_radio->setSelectedIndex(gSavedSettings.getBOOL("DoubleClickAutoPilot"));
+ const bool click_to_walk = gSavedSettings.getBOOL("ClickToWalk");
+ const bool dbl_click_to_walk = gSavedSettings.getBOOL("DoubleClickAutoPilot");
+ const bool dbl_click_to_teleport = gSavedSettings.getBOOL("DoubleClickTeleport");
+
+ getChild<LLComboBox>("single_click_action_combo")->setValue((int)click_to_walk);
+ getChild<LLComboBox>("double_click_action_combo")->setValue(dbl_click_to_teleport ? 2 : (int)dbl_click_to_walk);
}
void LLFloaterPreference::applyUIColor(LLUICtrl* ctrl, const LLSD& param)
@@ -1954,7 +1922,6 @@ BOOL LLFloaterPreferenceProxy::postBuild()
getChild<LLLineEditor>("socks5_password")->setValue(socks_cred->getAuthenticator()["creds"].asString());
}
- center();
return TRUE;
}
diff --git a/indra/newview/llfloaterpreference.h b/indra/newview/llfloaterpreference.h
index ef9bc2dd53..7ee3294478 100644
--- a/indra/newview/llfloaterpreference.h
+++ b/indra/newview/llfloaterpreference.h
@@ -104,14 +104,13 @@ protected:
void setHardwareDefaults();
// callback for when client turns on shaders
void onVertexShaderEnable();
- // callback for changing double click action checkbox
- void onDoubleClickCheckBox(LLUICtrl* ctrl);
- // callback for selecting double click action radio-button
- void onDoubleClickRadio();
- // updates double-click action settings depending on controls from preferences
- void updateDoubleClickSettings();
- // updates double-click action controls depending on values from settings.xml
- void updateDoubleClickControls();
+
+ // callback for commit in the "Single click on land" and "Double click on land" comboboxes.
+ void onClickActionChange();
+ // updates click/double-click action settings depending on controls values
+ void updateClickActionSettings();
+ // updates click/double-click action controls depending on values from settings.xml
+ void updateClickActionControls();
// This function squirrels away the current values of the controls so that
// cancel() can restore them.
@@ -157,6 +156,7 @@ public:
void onChangeMaturity();
void onClickBlockList();
void onClickProxySettings();
+ void onClickTranslationSettings();
void applyUIColor(LLUICtrl* ctrl, const LLSD& param);
void getUIColor(LLUICtrl* ctrl, const LLSD& param);
@@ -164,9 +164,7 @@ public:
static void refreshSkin(void* data);
private:
static std::string sSkin;
- // set true if state of double-click action checkbox or radio-group was changed by user
- // (reset back to false on apply or cancel)
- bool mDoubleClickActionDirty;
+ bool mClickActionDirty; ///< Set to true when the click/double-click options get changed by user.
bool mGotPersonalInfo;
bool mOriginalIMViaEmail;
bool mLanguageChanged;
diff --git a/indra/newview/llfloatersidepanelcontainer.cpp b/indra/newview/llfloatersidepanelcontainer.cpp
new file mode 100644
index 0000000000..be7a53491d
--- /dev/null
+++ b/indra/newview/llfloatersidepanelcontainer.cpp
@@ -0,0 +1,111 @@
+/**
+ * @file llfloatersidepanelcontainer.cpp
+ * @brief LLFloaterSidePanelContainer class definition
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llfloaterreg.h"
+#include "llfloatersidepanelcontainer.h"
+
+// newview includes
+#include "llsidetraypanelcontainer.h"
+#include "lltransientfloatermgr.h"
+
+//static
+const std::string LLFloaterSidePanelContainer::sMainPanelName("main_panel");
+
+LLFloaterSidePanelContainer::LLFloaterSidePanelContainer(const LLSD& key, const Params& params)
+: LLFloater(key, params)
+{
+ // Prevent transient floaters (e.g. IM windows) from hiding
+ // when this floater is clicked.
+ LLTransientFloaterMgr::getInstance()->addControlView(LLTransientFloaterMgr::GLOBAL, this);
+}
+
+LLFloaterSidePanelContainer::~LLFloaterSidePanelContainer()
+{
+ LLTransientFloaterMgr::getInstance()->removeControlView(LLTransientFloaterMgr::GLOBAL, this);
+}
+
+void LLFloaterSidePanelContainer::onOpen(const LLSD& key)
+{
+ getChild<LLPanel>(sMainPanelName)->onOpen(key);
+}
+
+LLPanel* LLFloaterSidePanelContainer::openChildPanel(const std::string& panel_name, const LLSD& params)
+{
+ LLView* view = findChildView(panel_name, true);
+ if (!view) return NULL;
+
+ openFloater();
+
+ LLPanel* panel = NULL;
+
+ LLSideTrayPanelContainer* container = dynamic_cast<LLSideTrayPanelContainer*>(view->getParent());
+ if (container)
+ {
+ LLSD new_params = params;
+ new_params[LLSideTrayPanelContainer::PARAM_SUB_PANEL_NAME] = panel_name;
+ container->onOpen(new_params);
+
+ panel = container->getCurrentPanel();
+ }
+ else if ((panel = dynamic_cast<LLPanel*>(view)) != NULL)
+ {
+ panel->onOpen(params);
+ }
+
+ return panel;
+}
+
+void LLFloaterSidePanelContainer::showPanel(const std::string& floater_name, const LLSD& key)
+{
+ LLFloaterSidePanelContainer* floaterp = LLFloaterReg::getTypedInstance<LLFloaterSidePanelContainer>(floater_name);
+ if (floaterp)
+ {
+ floaterp->openChildPanel(sMainPanelName, key);
+ }
+}
+
+void LLFloaterSidePanelContainer::showPanel(const std::string& floater_name, const std::string& panel_name, const LLSD& key)
+{
+ LLFloaterSidePanelContainer* floaterp = LLFloaterReg::getTypedInstance<LLFloaterSidePanelContainer>(floater_name);
+ if (floaterp)
+ {
+ floaterp->openChildPanel(panel_name, key);
+ }
+}
+
+LLPanel* LLFloaterSidePanelContainer::getPanel(const std::string& floater_name, const std::string& panel_name)
+{
+ LLFloaterSidePanelContainer* floaterp = LLFloaterReg::getTypedInstance<LLFloaterSidePanelContainer>(floater_name);
+
+ if (floaterp)
+ {
+ return floaterp->findChild<LLPanel>(panel_name, true);
+ }
+
+ return NULL;
+}
diff --git a/indra/newview/llfloatersidepanelcontainer.h b/indra/newview/llfloatersidepanelcontainer.h
new file mode 100644
index 0000000000..10d85867ce
--- /dev/null
+++ b/indra/newview/llfloatersidepanelcontainer.h
@@ -0,0 +1,81 @@
+/**
+ * @file llfloatersidepanelcontainer.h
+ * @brief LLFloaterSidePanelContainer class
+ *
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLFLOATERSIDEPANELCONTAINER_H
+#define LL_LLFLOATERSIDEPANELCONTAINER_H
+
+#include "llfloater.h"
+
+/**
+ * Class LLFloaterSidePanelContainer
+ *
+ * Provides an interface for all former Side Tray panels.
+ *
+ * This class helps to make sure that clicking a floater containing the side panel
+ * doesn't make transient floaters (e.g. IM windows) hide, so that it's possible to
+ * drag an inventory item from My Inventory window to a docked IM window,
+ * i.e. share the item (see VWR-22891).
+ */
+class LLFloaterSidePanelContainer : public LLFloater
+{
+private:
+ static const std::string sMainPanelName;
+
+public:
+ LLFloaterSidePanelContainer(const LLSD& key, const Params& params = getDefaultParams());
+ ~LLFloaterSidePanelContainer();
+
+ /*virtual*/ void onOpen(const LLSD& key);
+
+ LLPanel* openChildPanel(const std::string& panel_name, const LLSD& params);
+
+ static void showPanel(const std::string& floater_name, const LLSD& key);
+
+ static void showPanel(const std::string& floater_name, const std::string& panel_name, const LLSD& key);
+
+ static LLPanel* getPanel(const std::string& floater_name, const std::string& panel_name = sMainPanelName);
+
+ /**
+ * Gets the panel of given type T (doesn't show it or do anything else with it).
+ *
+ * @param floater_name a string specifying the floater to be searched for a child panel.
+ * @param panel_name a string specifying the child panel to get.
+ * @returns a pointer to the panel of given type T.
+ */
+ template <typename T>
+ static T* getPanel(const std::string& floater_name, const std::string& panel_name = sMainPanelName)
+ {
+ T* panel = dynamic_cast<T*>(getPanel(floater_name, panel_name));
+ if (!panel)
+ {
+ llwarns << "Child named \"" << panel_name << "\" of type " << typeid(T*).name() << " not found" << llendl;
+ }
+ return panel;
+ }
+};
+
+#endif // LL_LLFLOATERSIDEPANELCONTAINER_H
diff --git a/indra/newview/llfloatersidetraytab.cpp b/indra/newview/llfloatersidetraytab.cpp
deleted file mode 100644
index 9f15e62d84..0000000000
--- a/indra/newview/llfloatersidetraytab.cpp
+++ /dev/null
@@ -1,52 +0,0 @@
-/**
- * @file llfloatersidetraytab.cpp
- * @brief LLFloaterSideTrayTab class definition
- *
- * $LicenseInfo:firstyear=2010&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-#include "llviewerprecompiledheaders.h"
-
-#include "llfloatersidetraytab.h"
-
-// newview includes
-#include "lltransientfloatermgr.h"
-#include "llsidetray.h"
-
-LLFloaterSideTrayTab::LLFloaterSideTrayTab(const LLSD& key, const Params& params)
-: LLFloater(key, params)
-{
- // Prevent transient floaters (e.g. IM windows) from hiding
- // when this floater is clicked.
- LLTransientFloaterMgr::getInstance()->addControlView(LLTransientFloaterMgr::GLOBAL, this);
-}
-
-LLFloaterSideTrayTab::~LLFloaterSideTrayTab()
-{
- LLTransientFloaterMgr::getInstance()->removeControlView(LLTransientFloaterMgr::GLOBAL, this);
-}
-
-void LLFloaterSideTrayTab::onClose(bool app_quitting)
-{
- // The floater is already being closed, so don't toggle it once more (that may crash viewer).
- LLSideTray::getInstance()->setTabDocked(getName(), /* dock = */ true, /* toggle_floater = */ false);
-}
diff --git a/indra/newview/llfloatersidetraytab.h b/indra/newview/llfloatersidetraytab.h
deleted file mode 100644
index 89f2444a0e..0000000000
--- a/indra/newview/llfloatersidetraytab.h
+++ /dev/null
@@ -1,49 +0,0 @@
-/**
- * @file llfloatersidetraytab.h
- * @brief LLFloaterSideTrayTab class definition
- *
- * $LicenseInfo:firstyear=2010&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-#ifndef LL_LLFLOATERSIDETRAYTAB_H
-#define LL_LLFLOATERSIDETRAYTAB_H
-
-#include "llfloater.h"
-
-/**
- * When a side tray tab gets detached, it's wrapped in an instance of this class.
- *
- * This class helps to make sure that clicking a detached side tray tab doesn't
- * make transient floaters (e.g. IM windows) hide, so that it's possible to
- * drag an inventory item from detached My Inventory window to a docked IM window,
- * i.e. share the item (see VWR-22891).
- */
-class LLFloaterSideTrayTab : public LLFloater
-{
-public:
- LLFloaterSideTrayTab(const LLSD& key, const Params& params = getDefaultParams());
- ~LLFloaterSideTrayTab();
-
- void onClose(bool app_quitting);
-};
-
-#endif // LL_LLFLOATERSIDETRAYTAB_H
diff --git a/indra/newview/llfloatersnapshot.cpp b/indra/newview/llfloatersnapshot.cpp
index 00dc7b1627..d8d62e5bbb 100644
--- a/indra/newview/llfloatersnapshot.cpp
+++ b/indra/newview/llfloatersnapshot.cpp
@@ -42,6 +42,8 @@
#include "llcombobox.h"
#include "lleconomy.h"
#include "lllandmarkactions.h"
+#include "llpanelsnapshot.h"
+#include "llsidetraypanelcontainer.h"
#include "llsliderctrl.h"
#include "llspinctrl.h"
#include "llviewercontrol.h"
@@ -50,9 +52,7 @@
#include "llviewercamera.h"
#include "llviewerwindow.h"
#include "llviewermenufile.h" // upload_new_resource()
-#include "llfloaterpostcard.h"
#include "llcheckboxctrl.h"
-#include "llradiogroup.h"
#include "llslurl.h"
#include "lltoolfocus.h"
#include "lltoolmgr.h"
@@ -76,18 +76,17 @@
#include "llimagej2c.h"
#include "lllocalcliprect.h"
#include "llnotificationsutil.h"
+#include "llpostcard.h"
#include "llresmgr.h" // LLLocale
#include "llvfile.h"
#include "llvfs.h"
+#include "llwebprofile.h"
#include "llwindow.h"
///----------------------------------------------------------------------------
/// Local function declarations, constants, enums, and typedefs
///----------------------------------------------------------------------------
-S32 LLFloaterSnapshot::sUIWinHeightLong = 530 ;
-S32 LLFloaterSnapshot::sUIWinHeightShort = LLFloaterSnapshot::sUIWinHeightLong - 240 ;
-S32 LLFloaterSnapshot::sUIWinWidth = 215 ;
-
+LLUICtrl* LLFloaterSnapshot::sThumbnailPlaceholder = NULL;
LLSnapshotFloaterView* gSnapshotFloaterView = NULL;
const F32 AUTO_SNAPSHOT_TIME_DELAY = 1.f;
@@ -108,6 +107,7 @@ static LLDefaultChildRegistry::Register<LLSnapshotFloaterView> r("snapshot_float
///----------------------------------------------------------------------------
class LLSnapshotLivePreview : public LLView
{
+ LOG_CLASS(LLSnapshotLivePreview);
public:
enum ESnapshotType
{
@@ -135,7 +135,11 @@ public:
/*virtual*/ void reshape(S32 width, S32 height, BOOL called_from_parent);
void setSize(S32 w, S32 h);
+ void setWidth(S32 w) { mWidth[mCurImageIndex] = w; }
+ void setHeight(S32 h) { mHeight[mCurImageIndex] = h; }
void getSize(S32& w, S32& h) const;
+ S32 getWidth() const { return mWidth[mCurImageIndex]; }
+ S32 getHeight() const { return mHeight[mCurImageIndex]; }
S32 getDataSize() const { return mDataSize; }
void setMaxImageSize(S32 size) ;
S32 getMaxImageSize() {return mMaxImageSize ;}
@@ -152,8 +156,10 @@ public:
LLViewerTexture* getCurrentImage();
F32 getImageAspect();
F32 getAspect() ;
- LLRect getImageRect();
- BOOL isImageScaled();
+ const LLRect& getImageRect() const { return mImageRect[mCurImageIndex]; }
+ BOOL isImageScaled() const { return mImageScaled[mCurImageIndex]; }
+ void setImageScaled(BOOL scaled) { mImageScaled[mCurImageIndex] = scaled; }
+ const LLVector3d& getPosTakenGlobal() const { return mPosTakenGlobal; }
void setSnapshotType(ESnapshotType type) { mSnapshotType = type; }
void setSnapshotFormat(LLFloaterSnapshot::ESnapshotFormat type) { mSnapshotFormat = type; }
@@ -161,10 +167,13 @@ public:
void setSnapshotBufferType(LLViewerWindow::ESnapshotType type) { mSnapshotBufferType = type; }
void updateSnapshot(BOOL new_snapshot, BOOL new_thumbnail = FALSE, F32 delay = 0.f);
void saveWeb();
- LLFloaterPostcard* savePostcard();
void saveTexture();
BOOL saveLocal();
+ LLPointer<LLImageFormatted> getFormattedImage() const { return mFormattedImage; }
+ LLPointer<LLImageRaw> getEncodedImage() const { return mPreviewImageEncoded; }
+
+ /// Sets size of preview thumbnail image and thhe surrounding rect.
BOOL setThumbnailImageSize() ;
void generateThumbnailImage(BOOL force_update = FALSE) ;
void resetThumbnailImage() { mThumbnailImage = NULL ; }
@@ -293,7 +302,7 @@ LLViewerTexture* LLSnapshotLivePreview::getCurrentImage()
F32 LLSnapshotLivePreview::getAspect()
{
- F32 image_aspect_ratio = ((F32)mWidth[mCurImageIndex]) / ((F32)mHeight[mCurImageIndex]);
+ F32 image_aspect_ratio = ((F32)getWidth()) / ((F32)getHeight());
F32 window_aspect_ratio = ((F32)getRect().getWidth()) / ((F32)getRect().getHeight());
if (!mKeepAspectRatio)//gSavedSettings.getBOOL("KeepAspectForSnapshot"))
@@ -308,7 +317,7 @@ F32 LLSnapshotLivePreview::getAspect()
F32 LLSnapshotLivePreview::getImageAspect()
{
- if (!mViewerImage[mCurImageIndex])
+ if (!getCurrentImage())
{
return 0.f;
}
@@ -316,32 +325,24 @@ F32 LLSnapshotLivePreview::getImageAspect()
return getAspect() ;
}
-LLRect LLSnapshotLivePreview::getImageRect()
-{
- return mImageRect[mCurImageIndex];
-}
-
-BOOL LLSnapshotLivePreview::isImageScaled()
-{
- return mImageScaled[mCurImageIndex];
-}
-
void LLSnapshotLivePreview::updateSnapshot(BOOL new_snapshot, BOOL new_thumbnail, F32 delay)
-{
- if (mSnapshotUpToDate)
+{
+ // Invalidate current image.
+ lldebugs << "updateSnapshot: mSnapshotUpToDate = " << getSnapshotUpToDate() << llendl;
+ if (getSnapshotUpToDate())
{
S32 old_image_index = mCurImageIndex;
mCurImageIndex = (mCurImageIndex + 1) % 2;
- mWidth[mCurImageIndex] = mWidth[old_image_index];
- mHeight[mCurImageIndex] = mHeight[old_image_index];
+ setSize(mWidth[old_image_index], mHeight[old_image_index]);
mFallAnimTimer.start();
}
mSnapshotUpToDate = FALSE;
+ // Update snapshot source rect depending on whether we keep the aspect ratio.
LLRect& rect = mImageRect[mCurImageIndex];
rect.set(0, getRect().getHeight(), getRect().getWidth(), 0);
- F32 image_aspect_ratio = ((F32)mWidth[mCurImageIndex]) / ((F32)mHeight[mCurImageIndex]);
+ F32 image_aspect_ratio = ((F32)getWidth()) / ((F32)getHeight());
F32 window_aspect_ratio = ((F32)getRect().getWidth()) / ((F32)getRect().getHeight());
if (mKeepAspectRatio)//gSavedSettings.getBOOL("KeepAspectForSnapshot"))
@@ -362,17 +363,22 @@ void LLSnapshotLivePreview::updateSnapshot(BOOL new_snapshot, BOOL new_thumbnail
}
}
+ // Stop shining animation.
mShineAnimTimer.stop();
+
+ // Update snapshot if requested.
if (new_snapshot)
{
mSnapshotDelayTimer.start();
mSnapshotDelayTimer.setTimerExpirySec(delay);
+ LLFloaterSnapshot::preUpdate();
}
+
+ // Update thumbnail if requested.
if(new_thumbnail)
{
mThumbnailUpToDate = FALSE ;
}
- setThumbnailImageSize();
}
void LLSnapshotLivePreview::setSnapshotQuality(S32 quality)
@@ -428,26 +434,26 @@ void LLSnapshotLivePreview::drawPreviewRect(S32 offset_x, S32 offset_y)
//called when the frame is frozen.
void LLSnapshotLivePreview::draw()
{
- if (mViewerImage[mCurImageIndex].notNull() &&
+ if (getCurrentImage() &&
mPreviewImageEncoded.notNull() &&
- mSnapshotUpToDate)
+ getSnapshotUpToDate())
{
LLColor4 bg_color(0.f, 0.f, 0.3f, 0.4f);
gl_rect_2d(getRect(), bg_color);
- LLRect &rect = mImageRect[mCurImageIndex];
- LLRect shadow_rect = mImageRect[mCurImageIndex];
+ const LLRect& rect = getImageRect();
+ LLRect shadow_rect = rect;
shadow_rect.stretch(BORDER_WIDTH);
gl_drop_shadow(shadow_rect.mLeft, shadow_rect.mTop, shadow_rect.mRight, shadow_rect.mBottom, LLColor4(0.f, 0.f, 0.f, mNeedsFlash ? 0.f :0.5f), 10);
LLColor4 image_color(1.f, 1.f, 1.f, 1.f);
gGL.color4fv(image_color.mV);
- gGL.getTexUnit(0)->bind(mViewerImage[mCurImageIndex]);
+ gGL.getTexUnit(0)->bind(getCurrentImage());
// calculate UV scale
- F32 uv_width = mImageScaled[mCurImageIndex] ? 1.f : llmin((F32)mWidth[mCurImageIndex] / (F32)mViewerImage[mCurImageIndex]->getWidth(), 1.f);
- F32 uv_height = mImageScaled[mCurImageIndex] ? 1.f : llmin((F32)mHeight[mCurImageIndex] / (F32)mViewerImage[mCurImageIndex]->getHeight(), 1.f);
- glPushMatrix();
+ F32 uv_width = isImageScaled() ? 1.f : llmin((F32)getWidth() / (F32)getCurrentImage()->getWidth(), 1.f);
+ F32 uv_height = isImageScaled() ? 1.f : llmin((F32)getHeight() / (F32)getCurrentImage()->getHeight(), 1.f);
+ gGL.pushMatrix();
{
- glTranslatef((F32)rect.mLeft, (F32)rect.mBottom, 0.f);
+ gGL.translatef((F32)rect.mLeft, (F32)rect.mBottom, 0.f);
gGL.begin(LLRender::QUADS);
{
gGL.texCoord2f(uv_width, uv_height);
@@ -464,7 +470,7 @@ void LLSnapshotLivePreview::draw()
}
gGL.end();
}
- glPopMatrix();
+ gGL.popMatrix();
gGL.color4f(1.f, 1.f, 1.f, mFlashAlpha);
gl_rect_2d(getRect());
@@ -484,6 +490,7 @@ void LLSnapshotLivePreview::draw()
mFlashAlpha = lerp(mFlashAlpha, 0.f, LLCriticalDamp::getInterpolant(0.15f));
}
+ // Draw shining animation if appropriate.
if (mShineCountdown > 0)
{
mShineCountdown--;
@@ -494,6 +501,7 @@ void LLSnapshotLivePreview::draw()
}
else if (mShineAnimTimer.getStarted())
{
+ lldebugs << "Drawing shining animation" << llendl;
F32 shine_interp = llmin(1.f, mShineAnimTimer.getElapsedTimeF32() / SHINE_TIME);
// draw "shine" effect
@@ -538,7 +546,7 @@ void LLSnapshotLivePreview::draw()
{
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
gGL.color4f(1.f, 1.f, 1.f, 1.f);
- LLRect outline_rect = mImageRect[mCurImageIndex];
+ const LLRect& outline_rect = getImageRect();
gGL.begin(LLRender::QUADS);
{
gGL.vertex2i(outline_rect.mLeft - BORDER_WIDTH, outline_rect.mTop + BORDER_WIDTH);
@@ -570,6 +578,7 @@ void LLSnapshotLivePreview::draw()
S32 old_image_index = (mCurImageIndex + 1) % 2;
if (mViewerImage[old_image_index].notNull() && mFallAnimTimer.getElapsedTimeF32() < FALL_TIME)
{
+ lldebugs << "Drawing fall animation" << llendl;
F32 fall_interp = mFallAnimTimer.getElapsedTimeF32() / FALL_TIME;
F32 alpha = clamp_rescale(fall_interp, 0.f, 1.f, 0.8f, 0.4f);
LLColor4 image_color(1.f, 1.f, 1.f, alpha);
@@ -580,11 +589,11 @@ void LLSnapshotLivePreview::draw()
BOOL rescale = !mImageScaled[old_image_index] && mViewerImage[mCurImageIndex].notNull();
F32 uv_width = rescale ? llmin((F32)mWidth[old_image_index] / (F32)mViewerImage[mCurImageIndex]->getWidth(), 1.f) : 1.f;
F32 uv_height = rescale ? llmin((F32)mHeight[old_image_index] / (F32)mViewerImage[mCurImageIndex]->getHeight(), 1.f) : 1.f;
- glPushMatrix();
+ gGL.pushMatrix();
{
LLRect& rect = mImageRect[old_image_index];
- glTranslatef((F32)rect.mLeft, (F32)rect.mBottom - llround(getRect().getHeight() * 2.f * (fall_interp * fall_interp)), 0.f);
- glRotatef(-45.f * fall_interp, 0.f, 0.f, 1.f);
+ gGL.translatef((F32)rect.mLeft, (F32)rect.mBottom - llround(getRect().getHeight() * 2.f * (fall_interp * fall_interp)), 0.f);
+ gGL.rotatef(-45.f * fall_interp, 0.f, 0.f, 1.f);
gGL.begin(LLRender::QUADS);
{
gGL.texCoord2f(uv_width, uv_height);
@@ -601,7 +610,7 @@ void LLSnapshotLivePreview::draw()
}
gGL.end();
}
- glPopMatrix();
+ gGL.popMatrix();
}
}
}
@@ -613,13 +622,14 @@ void LLSnapshotLivePreview::reshape(S32 width, S32 height, BOOL called_from_pare
LLView::reshape(width, height, called_from_parent);
if (old_rect.getWidth() != width || old_rect.getHeight() != height)
{
+ lldebugs << "window reshaped, updating thumbnail" << llendl;
updateSnapshot(FALSE, TRUE);
}
}
BOOL LLSnapshotLivePreview::setThumbnailImageSize()
{
- if(mWidth[mCurImageIndex] < 10 || mHeight[mCurImageIndex] < 10)
+ if(getWidth() < 10 || getHeight() < 10)
{
return FALSE ;
}
@@ -629,8 +639,10 @@ BOOL LLSnapshotLivePreview::setThumbnailImageSize()
F32 window_aspect_ratio = ((F32)window_width) / ((F32)window_height);
// UI size for thumbnail
- S32 max_width = LLFloaterSnapshot::getUIWinWidth() - 20;
- S32 max_height = 90;
+ // *FIXME: the rect does not change, so maybe there's no need to recalculate max w/h.
+ const LLRect& thumbnail_rect = LLFloaterSnapshot::getThumbnailPlaceholderRect();
+ S32 max_width = thumbnail_rect.getWidth();
+ S32 max_height = thumbnail_rect.getHeight();
if (window_aspect_ratio > (F32)max_width / max_height)
{
@@ -653,11 +665,11 @@ BOOL LLSnapshotLivePreview::setThumbnailImageSize()
S32 left = 0 , top = mThumbnailHeight, right = mThumbnailWidth, bottom = 0 ;
if(!mKeepAspectRatio)
{
- F32 ratio_x = (F32)mWidth[mCurImageIndex] / window_width ;
- F32 ratio_y = (F32)mHeight[mCurImageIndex] / window_height ;
+ F32 ratio_x = (F32)getWidth() / window_width ;
+ F32 ratio_y = (F32)getHeight() / window_height ;
- //if(mWidth[mCurImageIndex] > window_width ||
- // mHeight[mCurImageIndex] > window_height )
+ //if(getWidth() > window_width ||
+ // getHeight() > window_height )
{
if(ratio_x > ratio_y)
{
@@ -689,11 +701,11 @@ void LLSnapshotLivePreview::generateThumbnailImage(BOOL force_update)
{
return ;
}
- if(mThumbnailUpToDate && !force_update)//already updated
+ if(getThumbnailUpToDate() && !force_update)//already updated
{
return ;
}
- if(mWidth[mCurImageIndex] < 10 || mHeight[mCurImageIndex] < 10)
+ if(getWidth() < 10 || getHeight() < 10)
{
return ;
}
@@ -713,25 +725,19 @@ void LLSnapshotLivePreview::generateThumbnailImage(BOOL force_update)
resetThumbnailImage() ;
}
- LLPointer<LLImageRaw> raw = NULL ;
- S32 w , h ;
- w = get_lower_power_two(mThumbnailWidth, 512) * 2 ;
- h = get_lower_power_two(mThumbnailHeight, 512) * 2 ;
-
+ LLPointer<LLImageRaw> raw = new LLImageRaw;
+ if(!gViewerWindow->thumbnailSnapshot(raw,
+ mThumbnailWidth, mThumbnailHeight,
+ gSavedSettings.getBOOL("RenderUIInSnapshot"),
+ FALSE,
+ mSnapshotBufferType) )
{
- raw = new LLImageRaw ;
- if(!gViewerWindow->thumbnailSnapshot(raw,
- w, h,
- gSavedSettings.getBOOL("RenderUIInSnapshot"),
- FALSE,
- mSnapshotBufferType) )
- {
- raw = NULL ;
- }
+ raw = NULL ;
}
if(raw)
{
+ raw->expandToPowerOfTwo();
mThumbnailImage = LLViewerTextureManager::getLocalTexture(raw.get(), FALSE);
mThumbnailUpToDate = TRUE ;
}
@@ -746,8 +752,14 @@ void LLSnapshotLivePreview::generateThumbnailImage(BOOL force_update)
//static
BOOL LLSnapshotLivePreview::onIdle( void* snapshot_preview )
{
- LLSnapshotLivePreview* previewp = (LLSnapshotLivePreview*)snapshot_preview;
+ LLSnapshotLivePreview* previewp = (LLSnapshotLivePreview*)snapshot_preview;
+ if (previewp->getWidth() == 0 || previewp->getHeight() == 0)
+ {
+ llwarns << "Incorrect dimensions: " << previewp->getWidth() << "x" << previewp->getHeight() << llendl;
+ return FALSE;
+ }
+ // If we're in freeze-frame mode and camera has moved, update snapshot.
LLVector3 new_camera_pos = LLViewerCamera::getInstance()->getOrigin();
LLQuaternion new_camera_rot = LLViewerCamera::getInstance()->getQuaternion();
if (gSavedSettings.getBOOL("FreezeTime") &&
@@ -757,6 +769,7 @@ BOOL LLSnapshotLivePreview::onIdle( void* snapshot_preview )
previewp->mCameraRot = new_camera_rot;
// request a new snapshot whenever the camera moves, with a time delay
BOOL autosnap = gSavedSettings.getBOOL("AutoSnapshot");
+ lldebugs << "camera moved, updating thumbnail" << llendl;
previewp->updateSnapshot(
autosnap, // whether a new snapshot is needed or merely invalidate the existing one
FALSE, // or if 1st arg is false, whether to produce a new thumbnail image.
@@ -773,7 +786,9 @@ BOOL LLSnapshotLivePreview::onIdle( void* snapshot_preview )
}
// time to produce a snapshot
+ previewp->setThumbnailImageSize();
+ lldebugs << "producing snapshot" << llendl;
if (!previewp->mPreviewImage)
{
previewp->mPreviewImage = new LLImageRaw;
@@ -788,13 +803,13 @@ BOOL LLSnapshotLivePreview::onIdle( void* snapshot_preview )
previewp->setEnabled(FALSE);
previewp->getWindow()->incBusyCount();
- previewp->mImageScaled[previewp->mCurImageIndex] = FALSE;
+ previewp->setImageScaled(FALSE);
// grab the raw image and encode it into desired format
if(gViewerWindow->rawSnapshot(
previewp->mPreviewImage,
- previewp->mWidth[previewp->mCurImageIndex],
- previewp->mHeight[previewp->mCurImageIndex],
+ previewp->getWidth(),
+ previewp->getHeight(),
previewp->mKeepAspectRatio,//gSavedSettings.getBOOL("KeepAspectForSnapshot"),
previewp->getSnapshotType() == LLSnapshotLivePreview::SNAPSHOT_TEXTURE,
gSavedSettings.getBOOL("RenderUIInSnapshot"),
@@ -809,6 +824,7 @@ BOOL LLSnapshotLivePreview::onIdle( void* snapshot_preview )
if(previewp->getSnapshotType() == SNAPSHOT_TEXTURE)
{
+ lldebugs << "Encoding new image of format J2C" << llendl;
LLPointer<LLImageJ2C> formatted = new LLImageJ2C;
LLPointer<LLImageRaw> scaled = new LLImageRaw(
previewp->mPreviewImage->getData(),
@@ -816,8 +832,8 @@ BOOL LLSnapshotLivePreview::onIdle( void* snapshot_preview )
previewp->mPreviewImage->getHeight(),
previewp->mPreviewImage->getComponents());
- scaled->biasedScaleToPowerOfTwo(512);
- previewp->mImageScaled[previewp->mCurImageIndex] = TRUE;
+ scaled->biasedScaleToPowerOfTwo(MAX_TEXTURE_SIZE);
+ previewp->setImageScaled(TRUE);
if (formatted->encode(scaled, 0.f))
{
previewp->mDataSize = formatted->getDataSize();
@@ -829,18 +845,8 @@ BOOL LLSnapshotLivePreview::onIdle( void* snapshot_preview )
// delete any existing image
previewp->mFormattedImage = NULL;
// now create the new one of the appropriate format.
- // note: postcards and web hardcoded to use jpeg always.
- LLFloaterSnapshot::ESnapshotFormat format;
-
- if (previewp->getSnapshotType() == SNAPSHOT_POSTCARD ||
- previewp->getSnapshotType() == SNAPSHOT_WEB)
- {
- format = LLFloaterSnapshot::SNAPSHOT_FORMAT_JPEG;
- }
- else
- {
- format = previewp->getSnapshotFormat();
- }
+ LLFloaterSnapshot::ESnapshotFormat format = previewp->getSnapshotFormat();
+ lldebugs << "Encoding new image of format " << format << llendl;
switch(format)
{
@@ -882,7 +888,7 @@ BOOL LLSnapshotLivePreview::onIdle( void* snapshot_preview )
{
// go ahead and shrink image to appropriate power of 2 for display
scaled->biasedScaleToPowerOfTwo(1024);
- previewp->mImageScaled[previewp->mCurImageIndex] = TRUE;
+ previewp->setImageScaled(TRUE);
}
else
{
@@ -920,56 +926,28 @@ BOOL LLSnapshotLivePreview::onIdle( void* snapshot_preview )
{
previewp->generateThumbnailImage() ;
}
+ lldebugs << "done creating snapshot" << llendl;
+ LLFloaterSnapshot::postUpdate();
return TRUE;
}
void LLSnapshotLivePreview::setSize(S32 w, S32 h)
{
- mWidth[mCurImageIndex] = w;
- mHeight[mCurImageIndex] = h;
+ lldebugs << "setSize(" << w << ", " << h << ")" << llendl;
+ setWidth(w);
+ setHeight(h);
}
void LLSnapshotLivePreview::getSize(S32& w, S32& h) const
{
- w = mWidth[mCurImageIndex];
- h = mHeight[mCurImageIndex];
-}
-
-LLFloaterPostcard* LLSnapshotLivePreview::savePostcard()
-{
- if(mViewerImage[mCurImageIndex].isNull())
- {
- //this should never happen!!
- llwarns << "The snapshot image has not been generated!" << llendl ;
- return NULL ;
- }
-
- // calculate and pass in image scale in case image data only use portion
- // of viewerimage buffer
- LLVector2 image_scale(1.f, 1.f);
- if (!isImageScaled())
- {
- image_scale.setVec(llmin(1.f, (F32)mWidth[mCurImageIndex] / (F32)getCurrentImage()->getWidth()), llmin(1.f, (F32)mHeight[mCurImageIndex] / (F32)getCurrentImage()->getHeight()));
- }
-
- LLImageJPEG* jpg = dynamic_cast<LLImageJPEG*>(mFormattedImage.get());
- if(!jpg)
- {
- llwarns << "Formatted image not a JPEG" << llendl;
- return NULL;
- }
- LLFloaterPostcard* floater = LLFloaterPostcard::showFromSnapshot(jpg, mViewerImage[mCurImageIndex], image_scale, mPosTakenGlobal);
- // relinquish lifetime of jpeg image to postcard floater
- mFormattedImage = NULL;
- mDataSize = 0;
- updateSnapshot(FALSE, FALSE);
-
- return floater;
+ w = getWidth();
+ h = getHeight();
}
void LLSnapshotLivePreview::saveTexture()
{
+ lldebugs << "saving texture: " << mPreviewImage->getWidth() << "x" << mPreviewImage->getHeight() << llendl;
// gen a new uuid for this asset
LLTransactionID tid;
tid.generate();
@@ -981,8 +959,9 @@ void LLSnapshotLivePreview::saveTexture()
mPreviewImage->getHeight(),
mPreviewImage->getComponents());
- scaled->biasedScaleToPowerOfTwo(512);
-
+ scaled->biasedScaleToPowerOfTwo(MAX_TEXTURE_SIZE);
+ lldebugs << "scaled texture to " << scaled->getWidth() << "x" << scaled->getHeight() << llendl;
+
if (formatted->encode(scaled, 0.0f))
{
LLVFile::writeFile(formatted->getData(), formatted->getDataSize(), gVFS, new_asset_id, LLAssetType::AT_TEXTURE);
@@ -1022,11 +1001,6 @@ BOOL LLSnapshotLivePreview::saveLocal()
{
BOOL success = gViewerWindow->saveImageNumbered(mFormattedImage);
- // Relinquish image memory. Save button will be disabled as a side-effect.
- mFormattedImage = NULL;
- mDataSize = 0;
- updateSnapshot(FALSE, FALSE);
-
if(success)
{
gViewerWindow->playSnapshotAnimAndSound();
@@ -1067,11 +1041,21 @@ void LLSnapshotLivePreview::regionNameCallback(LLImageJPEG* snapshot, LLSD& meta
class LLFloaterSnapshot::Impl
{
+ LOG_CLASS(LLFloaterSnapshot::Impl);
public:
+ typedef enum e_status
+ {
+ STATUS_READY,
+ STATUS_WORKING,
+ STATUS_FINISHED
+ } EStatus;
+
Impl()
: mAvatarPauseHandles(),
mLastToolset(NULL),
- mAspectRatioCheckOff(false)
+ mAspectRatioCheckOff(false),
+ mNeedRefresh(false),
+ mStatus(STATUS_READY)
{
}
~Impl()
@@ -1080,43 +1064,49 @@ public:
mAvatarPauseHandles.clear();
}
- static void onClickDiscard(void* data);
- static void onClickKeep(void* data);
- static void onCommitSave(LLUICtrl* ctrl, void* data);
static void onClickNewSnapshot(void* data);
static void onClickAutoSnap(LLUICtrl *ctrl, void* data);
//static void onClickAdvanceSnap(LLUICtrl *ctrl, void* data);
- static void onClickLess(void* data) ;
static void onClickMore(void* data) ;
static void onClickUICheck(LLUICtrl *ctrl, void* data);
static void onClickHUDCheck(LLUICtrl *ctrl, void* data);
- static void onClickKeepOpenCheck(LLUICtrl *ctrl, void* data);
- static void onClickKeepAspectCheck(LLUICtrl *ctrl, void* data);
- static void onCommitQuality(LLUICtrl* ctrl, void* data);
- static void onCommitResolution(LLUICtrl* ctrl, void* data) { updateResolution(ctrl, data); }
+ static void applyKeepAspectCheck(LLFloaterSnapshot* view, BOOL checked);
static void updateResolution(LLUICtrl* ctrl, void* data, BOOL do_update = TRUE);
static void onCommitFreezeFrame(LLUICtrl* ctrl, void* data);
static void onCommitLayerTypes(LLUICtrl* ctrl, void*data);
- static void onCommitSnapshotType(LLUICtrl* ctrl, void* data);
- static void onCommitSnapshotFormat(LLUICtrl* ctrl, void* data);
- static void onCommitCustomResolution(LLUICtrl *ctrl, void* data);
- static void resetSnapshotSizeOnUI(LLFloaterSnapshot *view, S32 width, S32 height) ;
+ static void onImageQualityChange(LLFloaterSnapshot* view, S32 quality_val);
+ static void onImageFormatChange(LLFloaterSnapshot* view);
+ static void applyCustomResolution(LLFloaterSnapshot* view, S32 w, S32 h);
+ static void onSnapshotUploadFinished(bool status);
+ static void onSendingPostcardFinished(bool status);
static BOOL checkImageSize(LLSnapshotLivePreview* previewp, S32& width, S32& height, BOOL isWidthChanged, S32 max_value);
+ static void setImageSizeSpinnersValues(LLFloaterSnapshot *view, S32 width, S32 height) ;
+ static void updateSpinners(LLFloaterSnapshot* view, LLSnapshotLivePreview* previewp, S32& width, S32& height, BOOL is_width_changed);
+
+ static LLPanelSnapshot* getActivePanel(LLFloaterSnapshot* floater, bool ok_if_not_found = true);
+ static LLSnapshotLivePreview::ESnapshotType getActiveSnapshotType(LLFloaterSnapshot* floater);
+ static LLFloaterSnapshot::ESnapshotFormat getImageFormat(LLFloaterSnapshot* floater);
+ static LLSpinCtrl* getWidthSpinner(LLFloaterSnapshot* floater);
+ static LLSpinCtrl* getHeightSpinner(LLFloaterSnapshot* floater);
+ static void enableAspectRatioCheckbox(LLFloaterSnapshot* floater, BOOL enable);
+ static void setAspectRatioCheckboxValue(LLFloaterSnapshot* floater, BOOL checked);
static LLSnapshotLivePreview* getPreviewView(LLFloaterSnapshot *floater);
static void setResolution(LLFloaterSnapshot* floater, const std::string& comboname);
static void updateControls(LLFloaterSnapshot* floater);
static void updateLayout(LLFloaterSnapshot* floater);
- static void updateResolutionTextEntry(LLFloaterSnapshot* floater);
+ static void setStatus(EStatus status, bool ok = true, const std::string& msg = LLStringUtil::null);
+ EStatus getStatus() const { return mStatus; }
+ static void setNeedRefresh(LLFloaterSnapshot* floater, bool need);
private:
- static LLSnapshotLivePreview::ESnapshotType getTypeIndex(LLFloaterSnapshot* floater);
- static LLSD getTypeName(LLSnapshotLivePreview::ESnapshotType index);
- static ESnapshotFormat getFormatIndex(LLFloaterSnapshot* floater);
static LLViewerWindow::ESnapshotType getLayerType(LLFloaterSnapshot* floater);
static void comboSetCustom(LLFloaterSnapshot *floater, const std::string& comboname);
static void checkAutoSnapshot(LLSnapshotLivePreview* floater, BOOL update_thumbnail = FALSE);
static void checkAspectRatio(LLFloaterSnapshot *view, S32 index) ;
+ static void setWorking(LLFloaterSnapshot* floater, bool working);
+ static void setFinished(LLFloaterSnapshot* floater, bool finished, bool ok = true, const std::string& msg = LLStringUtil::null);
+
public:
std::vector<LLAnimPauseRequest> mAvatarPauseHandles;
@@ -1124,84 +1114,98 @@ public:
LLToolset* mLastToolset;
LLHandle<LLView> mPreviewHandle;
bool mAspectRatioCheckOff ;
+ bool mNeedRefresh;
+ EStatus mStatus;
};
// static
-LLSnapshotLivePreview* LLFloaterSnapshot::Impl::getPreviewView(LLFloaterSnapshot *floater)
+LLPanelSnapshot* LLFloaterSnapshot::Impl::getActivePanel(LLFloaterSnapshot* floater, bool ok_if_not_found)
{
- LLSnapshotLivePreview* previewp = (LLSnapshotLivePreview*)floater->impl.mPreviewHandle.get();
- return previewp;
+ LLSideTrayPanelContainer* panel_container = floater->getChild<LLSideTrayPanelContainer>("panel_container");
+ LLPanelSnapshot* active_panel = dynamic_cast<LLPanelSnapshot*>(panel_container->getCurrentPanel());
+ if (!ok_if_not_found)
+ {
+ llassert_always(active_panel != NULL);
+ }
+ return active_panel;
}
// static
-LLSnapshotLivePreview::ESnapshotType LLFloaterSnapshot::Impl::getTypeIndex(LLFloaterSnapshot* floater)
+LLSnapshotLivePreview::ESnapshotType LLFloaterSnapshot::Impl::getActiveSnapshotType(LLFloaterSnapshot* floater)
{
- LLSnapshotLivePreview::ESnapshotType index = LLSnapshotLivePreview::SNAPSHOT_POSTCARD;
- LLSD value = floater->getChild<LLUICtrl>("snapshot_type_radio")->getValue();
+ LLSnapshotLivePreview::ESnapshotType type = LLSnapshotLivePreview::SNAPSHOT_WEB;
+ std::string name;
+ LLPanelSnapshot* spanel = getActivePanel(floater);
- const std::string id = value.asString();
- if (id == "postcard")
+ if (spanel)
{
- index = LLSnapshotLivePreview::SNAPSHOT_POSTCARD;
+ name = spanel->getName();
}
- else if (id == "texture")
+
+ if (name == "panel_snapshot_postcard")
{
- index = LLSnapshotLivePreview::SNAPSHOT_TEXTURE;
+ type = LLSnapshotLivePreview::SNAPSHOT_POSTCARD;
}
- else if (id == "local")
+ else if (name == "panel_snapshot_inventory")
{
- index = LLSnapshotLivePreview::SNAPSHOT_LOCAL;
+ type = LLSnapshotLivePreview::SNAPSHOT_TEXTURE;
}
- else if (id == "share_to_web")
+ else if (name == "panel_snapshot_local")
{
- index = LLSnapshotLivePreview::SNAPSHOT_WEB;
+ type = LLSnapshotLivePreview::SNAPSHOT_LOCAL;
}
- return index;
+ return type;
+}
+
+// static
+LLFloaterSnapshot::ESnapshotFormat LLFloaterSnapshot::Impl::getImageFormat(LLFloaterSnapshot* floater)
+{
+ LLPanelSnapshot* active_panel = getActivePanel(floater);
+ // FIXME: if the default is not PNG, profile uploads may fail.
+ return active_panel ? active_panel->getImageFormat() : LLFloaterSnapshot::SNAPSHOT_FORMAT_PNG;
}
// static
-LLSD LLFloaterSnapshot::Impl::getTypeName(LLSnapshotLivePreview::ESnapshotType index)
+LLSpinCtrl* LLFloaterSnapshot::Impl::getWidthSpinner(LLFloaterSnapshot* floater)
{
- std::string id;
- switch (index)
+ LLPanelSnapshot* active_panel = getActivePanel(floater);
+ return active_panel ? active_panel->getWidthSpinner() : floater->getChild<LLSpinCtrl>("snapshot_width");
+}
+
+// static
+LLSpinCtrl* LLFloaterSnapshot::Impl::getHeightSpinner(LLFloaterSnapshot* floater)
+{
+ LLPanelSnapshot* active_panel = getActivePanel(floater);
+ return active_panel ? active_panel->getHeightSpinner() : floater->getChild<LLSpinCtrl>("snapshot_height");
+}
+
+// static
+void LLFloaterSnapshot::Impl::enableAspectRatioCheckbox(LLFloaterSnapshot* floater, BOOL enable)
+{
+ LLPanelSnapshot* active_panel = getActivePanel(floater);
+ if (active_panel)
{
- case LLSnapshotLivePreview::SNAPSHOT_WEB:
- id = "share_to_web";
- break;
- case LLSnapshotLivePreview::SNAPSHOT_POSTCARD:
- id = "postcard";
- break;
- case LLSnapshotLivePreview::SNAPSHOT_TEXTURE:
- id = "texture";
- break;
- case LLSnapshotLivePreview::SNAPSHOT_LOCAL:
- default:
- id = "local";
- break;
+ active_panel->enableAspectRatioCheckbox(enable);
}
- return LLSD(id);
}
// static
-LLFloaterSnapshot::ESnapshotFormat LLFloaterSnapshot::Impl::getFormatIndex(LLFloaterSnapshot* floater)
+void LLFloaterSnapshot::Impl::setAspectRatioCheckboxValue(LLFloaterSnapshot* floater, BOOL checked)
{
- ESnapshotFormat index = SNAPSHOT_FORMAT_PNG;
- if(floater->hasChild("local_format_combo"))
+ LLPanelSnapshot* active_panel = getActivePanel(floater);
+ if (active_panel)
{
- LLComboBox* local_format_combo = floater->findChild<LLComboBox>("local_format_combo");
- const std::string id = local_format_combo->getSelectedItemLabel();
- if (id == "PNG")
- index = SNAPSHOT_FORMAT_PNG;
- else if (id == "JPEG")
- index = SNAPSHOT_FORMAT_JPEG;
- else if (id == "BMP")
- index = SNAPSHOT_FORMAT_BMP;
+ active_panel->getChild<LLUICtrl>(active_panel->getAspectRatioCBName())->setValue(checked);
}
- return index;
}
-
+// static
+LLSnapshotLivePreview* LLFloaterSnapshot::Impl::getPreviewView(LLFloaterSnapshot *floater)
+{
+ LLSnapshotLivePreview* previewp = (LLSnapshotLivePreview*)floater->impl.mPreviewHandle.get();
+ return previewp;
+}
// static
LLViewerWindow::ESnapshotType LLFloaterSnapshot::Impl::getLayerType(LLFloaterSnapshot* floater)
@@ -1229,20 +1233,28 @@ void LLFloaterSnapshot::Impl::updateLayout(LLFloaterSnapshot* floaterp)
{
LLSnapshotLivePreview* previewp = getPreviewView(floaterp);
- S32 delta_height = gSavedSettings.getBOOL("AdvanceSnapshot") ? 0 : floaterp->getUIWinHeightShort() - floaterp->getUIWinHeightLong() ;
+ BOOL advanced = gSavedSettings.getBOOL("AdvanceSnapshot");
+
+ // Show/hide advanced options.
+ LLPanel* advanced_options_panel = floaterp->getChild<LLPanel>("advanced_options_panel");
+ floaterp->getChild<LLButton>("advanced_options_btn")->setImageOverlay(advanced ? "TabIcon_Open_Off" : "TabIcon_Close_Off");
+ if (advanced != advanced_options_panel->getVisible())
+ {
+ S32 panel_width = advanced_options_panel->getRect().getWidth();
+ floaterp->getChild<LLPanel>("advanced_options_panel")->setVisible(advanced);
+ S32 floater_width = floaterp->getRect().getWidth();
+ floater_width += (advanced ? panel_width : -panel_width);
+ floaterp->reshape(floater_width, floaterp->getRect().getHeight());
+ }
- if(!gSavedSettings.getBOOL("AdvanceSnapshot")) //set to original window resolution
+ if(!advanced) //set to original window resolution
{
previewp->mKeepAspectRatio = TRUE;
+ floaterp->getChild<LLComboBox>("profile_size_combo")->setCurrentByIndex(0);
floaterp->getChild<LLComboBox>("postcard_size_combo")->setCurrentByIndex(0);
- gSavedSettings.setS32("SnapshotPostcardLastResolution", 0);
-
floaterp->getChild<LLComboBox>("texture_size_combo")->setCurrentByIndex(0);
- gSavedSettings.setS32("SnapshotTextureLastResolution", 0);
-
floaterp->getChild<LLComboBox>("local_size_combo")->setCurrentByIndex(0);
- gSavedSettings.setS32("SnapshotLocalLastResolution", 0);
LLSnapshotLivePreview* previewp = getPreviewView(floaterp);
previewp->setSize(gViewerWindow->getWindowWidthRaw(), gViewerWindow->getWindowHeightRaw());
@@ -1256,7 +1268,8 @@ void LLFloaterSnapshot::Impl::updateLayout(LLFloaterSnapshot* floaterp)
floaterp->getParent()->setMouseOpaque(TRUE);
// shrink to smaller layout
- floaterp->reshape(floaterp->getRect().getWidth(), floaterp->getUIWinHeightLong() + delta_height);
+ // *TODO: unneeded?
+ floaterp->reshape(floaterp->getRect().getWidth(), floaterp->getRect().getHeight());
// can see and interact with fullscreen preview now
if (previewp)
@@ -1286,7 +1299,8 @@ void LLFloaterSnapshot::Impl::updateLayout(LLFloaterSnapshot* floaterp)
else // turning off freeze frame mode
{
floaterp->getParent()->setMouseOpaque(FALSE);
- floaterp->reshape(floaterp->getRect().getWidth(), floaterp->getUIWinHeightLong() + delta_height);
+ // *TODO: unneeded?
+ floaterp->reshape(floaterp->getRect().getWidth(), floaterp->getRect().getHeight());
if (previewp)
{
previewp->setVisible(FALSE);
@@ -1312,86 +1326,67 @@ void LLFloaterSnapshot::Impl::updateLayout(LLFloaterSnapshot* floaterp)
// No other methods should be changing any of the controls directly except for helpers called by this method.
// The basic pattern for programmatically changing the GUI settings is to first set the
// appropriate saved settings and then call this method to sync the GUI with them.
+// FIXME: The above comment seems obsolete now.
// static
void LLFloaterSnapshot::Impl::updateControls(LLFloaterSnapshot* floater)
{
- LLRadioGroup* snapshot_type_radio = floater->getChild<LLRadioGroup>("snapshot_type_radio");
- LLSnapshotLivePreview::ESnapshotType shot_type = (LLSnapshotLivePreview::ESnapshotType)gSavedSettings.getS32("LastSnapshotType");
- snapshot_type_radio->setSelectedByValue(getTypeName(shot_type), true);
-
+ LLSnapshotLivePreview::ESnapshotType shot_type = getActiveSnapshotType(floater);
ESnapshotFormat shot_format = (ESnapshotFormat)gSavedSettings.getS32("SnapshotFormat");
LLViewerWindow::ESnapshotType layer_type = getLayerType(floater);
+#if 0
floater->getChildView("share_to_web")->setVisible( gSavedSettings.getBOOL("SnapshotSharingEnabled"));
+#endif
- floater->getChildView("postcard_size_combo")->setVisible( FALSE);
- floater->getChildView("texture_size_combo")->setVisible( FALSE);
- floater->getChildView("local_size_combo")->setVisible( FALSE);
-
- floater->getChild<LLComboBox>("postcard_size_combo")->selectNthItem(gSavedSettings.getS32("SnapshotPostcardLastResolution"));
- floater->getChild<LLComboBox>("texture_size_combo")->selectNthItem(gSavedSettings.getS32("SnapshotTextureLastResolution"));
- floater->getChild<LLComboBox>("local_size_combo")->selectNthItem(gSavedSettings.getS32("SnapshotLocalLastResolution"));
floater->getChild<LLComboBox>("local_format_combo")->selectNthItem(gSavedSettings.getS32("SnapshotFormat"));
-
- // *TODO: Separate settings for Web images from postcards
- floater->getChildView("send_btn")->setVisible( shot_type == LLSnapshotLivePreview::SNAPSHOT_POSTCARD ||
- shot_type == LLSnapshotLivePreview::SNAPSHOT_WEB);
- floater->getChildView("upload_btn")->setVisible(shot_type == LLSnapshotLivePreview::SNAPSHOT_TEXTURE);
- floater->getChildView("save_btn")->setVisible( shot_type == LLSnapshotLivePreview::SNAPSHOT_LOCAL);
- floater->getChildView("keep_aspect_check")->setEnabled(shot_type != LLSnapshotLivePreview::SNAPSHOT_TEXTURE && !floater->impl.mAspectRatioCheckOff);
+ enableAspectRatioCheckbox(floater, !floater->impl.mAspectRatioCheckOff);
+ setAspectRatioCheckboxValue(floater, gSavedSettings.getBOOL("KeepAspectForSnapshot"));
floater->getChildView("layer_types")->setEnabled(shot_type == LLSnapshotLivePreview::SNAPSHOT_LOCAL);
- BOOL is_advance = gSavedSettings.getBOOL("AdvanceSnapshot");
- BOOL is_local = shot_type == LLSnapshotLivePreview::SNAPSHOT_LOCAL;
- BOOL show_slider = (shot_type == LLSnapshotLivePreview::SNAPSHOT_POSTCARD ||
- shot_type == LLSnapshotLivePreview::SNAPSHOT_WEB ||
- (is_local && shot_format == LLFloaterSnapshot::SNAPSHOT_FORMAT_JPEG));
-
- floater->getChildView("more_btn")->setVisible( !is_advance); // the only item hidden in advanced mode
- floater->getChildView("less_btn")->setVisible( is_advance);
- floater->getChildView("type_label2")->setVisible( is_advance);
- floater->getChildView("format_label")->setVisible( is_advance && is_local);
- floater->getChildView("local_format_combo")->setVisible( is_advance && is_local);
- floater->getChildView("layer_types")->setVisible( is_advance);
- floater->getChildView("layer_type_label")->setVisible( is_advance);
- floater->getChildView("snapshot_width")->setVisible( is_advance);
- floater->getChildView("snapshot_height")->setVisible( is_advance);
- floater->getChildView("keep_aspect_check")->setVisible( is_advance);
- floater->getChildView("ui_check")->setVisible( is_advance);
- floater->getChildView("hud_check")->setVisible( is_advance);
- floater->getChildView("keep_open_check")->setVisible( is_advance);
- floater->getChildView("freeze_frame_check")->setVisible( is_advance);
- floater->getChildView("auto_snapshot_check")->setVisible( is_advance);
- floater->getChildView("image_quality_slider")->setVisible( is_advance && show_slider);
-
- if (gSavedSettings.getBOOL("RenderUIInSnapshot") || gSavedSettings.getBOOL("RenderHUDInSnapshot"))
- { //clamp snapshot resolution to window size when showing UI or HUD in snapshot
-
- LLSpinCtrl* width_ctrl = floater->getChild<LLSpinCtrl>("snapshot_width");
- LLSpinCtrl* height_ctrl = floater->getChild<LLSpinCtrl>("snapshot_height");
-
- S32 width = gViewerWindow->getWindowWidthRaw();
- S32 height = gViewerWindow->getWindowHeightRaw();
-
- width_ctrl->setMaxValue(width);
-
- height_ctrl->setMaxValue(height);
+ LLPanelSnapshot* active_panel = getActivePanel(floater);
+ if (active_panel)
+ {
+ LLSpinCtrl* width_ctrl = getWidthSpinner(floater);
+ LLSpinCtrl* height_ctrl = getHeightSpinner(floater);
- if (width_ctrl->getValue().asInteger() > width)
+ // Initialize spinners.
+ if (width_ctrl->getValue().asInteger() == 0)
{
- width_ctrl->forceSetValue(width);
+ S32 w = gViewerWindow->getWindowWidthRaw();
+ lldebugs << "Initializing width spinner (" << width_ctrl->getName() << "): " << w << llendl;
+ width_ctrl->setValue(w);
}
- if (height_ctrl->getValue().asInteger() > height)
+ if (height_ctrl->getValue().asInteger() == 0)
{
- height_ctrl->forceSetValue(height);
+ S32 h = gViewerWindow->getWindowHeightRaw();
+ lldebugs << "Initializing height spinner (" << height_ctrl->getName() << "): " << h << llendl;
+ height_ctrl->setValue(h);
+ }
+
+ // Сlamp snapshot resolution to window size when showing UI or HUD in snapshot.
+ if (gSavedSettings.getBOOL("RenderUIInSnapshot") || gSavedSettings.getBOOL("RenderHUDInSnapshot"))
+ {
+ S32 width = gViewerWindow->getWindowWidthRaw();
+ S32 height = gViewerWindow->getWindowHeightRaw();
+
+ width_ctrl->setMaxValue(width);
+
+ height_ctrl->setMaxValue(height);
+
+ if (width_ctrl->getValue().asInteger() > width)
+ {
+ width_ctrl->forceSetValue(width);
+ }
+ if (height_ctrl->getValue().asInteger() > height)
+ {
+ height_ctrl->forceSetValue(height);
+ }
+ }
+ else
+ {
+ width_ctrl->setMaxValue(6016);
+ height_ctrl->setMaxValue(6016);
}
- }
- else
- {
- LLSpinCtrl* width = floater->getChild<LLSpinCtrl>("snapshot_width");
- width->setMaxValue(6016);
- LLSpinCtrl* height = floater->getChild<LLSpinCtrl>("snapshot_height");
- height->setMaxValue(6016);
}
LLSnapshotLivePreview* previewp = getPreviewView(floater);
@@ -1399,11 +1394,7 @@ void LLFloaterSnapshot::Impl::updateControls(LLFloaterSnapshot* floater)
BOOL got_snap = previewp && previewp->getSnapshotUpToDate();
// *TODO: Separate maximum size for Web images from postcards
- floater->getChildView("send_btn")->setEnabled((shot_type == LLSnapshotLivePreview::SNAPSHOT_POSTCARD ||
- shot_type == LLSnapshotLivePreview::SNAPSHOT_WEB) &&
- got_snap && previewp->getDataSize() <= MAX_POSTCARD_DATASIZE);
- floater->getChildView("upload_btn")->setEnabled(shot_type == LLSnapshotLivePreview::SNAPSHOT_TEXTURE && got_snap);
- floater->getChildView("save_btn")->setEnabled(shot_type == LLSnapshotLivePreview::SNAPSHOT_LOCAL && got_snap);
+ lldebugs << "Is snapshot up-to-date? " << got_snap << llendl;
LLLocale locale(LLLocale::USER_LOCALE);
std::string bytes_string;
@@ -1411,155 +1402,111 @@ void LLFloaterSnapshot::Impl::updateControls(LLFloaterSnapshot* floater)
{
LLResMgr::getInstance()->getIntegerString(bytes_string, (previewp->getDataSize()) >> 10 );
}
- S32 upload_cost = LLGlobalEconomy::Singleton::getInstance()->getPriceUpload();
- floater->getChild<LLUICtrl>("texture")->setLabelArg("[AMOUNT]", llformat("%d",upload_cost));
- floater->getChild<LLUICtrl>("upload_btn")->setLabelArg("[AMOUNT]", llformat("%d",upload_cost));
+
+ // Update displayed image resolution.
+ LLTextBox* image_res_tb = floater->getChild<LLTextBox>("image_res_text");
+ image_res_tb->setVisible(got_snap);
+ if (got_snap)
+ {
+ LLPointer<LLImageRaw> img = previewp->getEncodedImage();
+ image_res_tb->setTextArg("[WIDTH]", llformat("%d", img->getWidth()));
+ image_res_tb->setTextArg("[HEIGHT]", llformat("%d", img->getHeight()));
+ }
+
floater->getChild<LLUICtrl>("file_size_label")->setTextArg("[SIZE]", got_snap ? bytes_string : floater->getString("unknown"));
floater->getChild<LLUICtrl>("file_size_label")->setColor(
shot_type == LLSnapshotLivePreview::SNAPSHOT_POSTCARD
&& got_bytes
&& previewp->getDataSize() > MAX_POSTCARD_DATASIZE ? LLUIColor(LLColor4::red) : LLUIColorTable::instance().getColor( "LabelTextColor" ));
+ // Update the width and height spinners based on the corresponding resolution combos. (?)
switch(shot_type)
{
- // *TODO: Separate settings for Web images from postcards
case LLSnapshotLivePreview::SNAPSHOT_WEB:
+ layer_type = LLViewerWindow::SNAPSHOT_TYPE_COLOR;
+ floater->getChild<LLUICtrl>("layer_types")->setValue("colors");
+ setResolution(floater, "profile_size_combo");
+ break;
case LLSnapshotLivePreview::SNAPSHOT_POSTCARD:
layer_type = LLViewerWindow::SNAPSHOT_TYPE_COLOR;
floater->getChild<LLUICtrl>("layer_types")->setValue("colors");
- if(is_advance)
- {
- setResolution(floater, "postcard_size_combo");
- }
+ setResolution(floater, "postcard_size_combo");
break;
case LLSnapshotLivePreview::SNAPSHOT_TEXTURE:
layer_type = LLViewerWindow::SNAPSHOT_TYPE_COLOR;
floater->getChild<LLUICtrl>("layer_types")->setValue("colors");
- if(is_advance)
- {
- setResolution(floater, "texture_size_combo");
- }
+ setResolution(floater, "texture_size_combo");
break;
case LLSnapshotLivePreview::SNAPSHOT_LOCAL:
- if(is_advance)
- {
- setResolution(floater, "local_size_combo");
- }
+ setResolution(floater, "local_size_combo");
break;
default:
break;
}
- updateResolutionTextEntry(floater);
-
if (previewp)
{
previewp->setSnapshotType(shot_type);
previewp->setSnapshotFormat(shot_format);
previewp->setSnapshotBufferType(layer_type);
}
-}
-
-// static
-void LLFloaterSnapshot::Impl::updateResolutionTextEntry(LLFloaterSnapshot* floater)
-{
- LLSpinCtrl* width_spinner = floater->getChild<LLSpinCtrl>("snapshot_width");
- LLSpinCtrl* height_spinner = floater->getChild<LLSpinCtrl>("snapshot_height");
- if(getTypeIndex(floater) == LLSnapshotLivePreview::SNAPSHOT_TEXTURE)
+ LLPanelSnapshot* current_panel = Impl::getActivePanel(floater);
+ if (current_panel)
{
- width_spinner->setAllowEdit(FALSE);
- height_spinner->setAllowEdit(FALSE);
- }
- else
- {
- width_spinner->setAllowEdit(TRUE);
- height_spinner->setAllowEdit(TRUE);
+ LLSD info;
+ info["have-snapshot"] = got_snap;
+ current_panel->updateControls(info);
}
+ lldebugs << "finished updating controls" << llendl;
}
// static
-void LLFloaterSnapshot::Impl::checkAutoSnapshot(LLSnapshotLivePreview* previewp, BOOL update_thumbnail)
+void LLFloaterSnapshot::Impl::setStatus(EStatus status, bool ok, const std::string& msg)
{
- if (previewp)
+ LLFloaterSnapshot* floater = LLFloaterSnapshot::getInstance();
+ switch (status)
{
- BOOL autosnap = gSavedSettings.getBOOL("AutoSnapshot");
- previewp->updateSnapshot(autosnap, update_thumbnail, autosnap ? AUTO_SNAPSHOT_TIME_DELAY : 0.f);
+ case STATUS_READY:
+ setWorking(floater, false);
+ setFinished(floater, false);
+ break;
+ case STATUS_WORKING:
+ setWorking(floater, true);
+ setFinished(floater, false);
+ break;
+ case STATUS_FINISHED:
+ setWorking(floater, false);
+ setFinished(floater, true, ok, msg);
+ break;
}
-}
-// static
-void LLFloaterSnapshot::Impl::onClickDiscard(void* data)
-{
- LLFloaterSnapshot *view = (LLFloaterSnapshot *)data;
-
- if (view)
- {
- view->closeFloater();
- }
+ floater->impl.mStatus = status;
}
-
// static
-void LLFloaterSnapshot::Impl::onCommitSave(LLUICtrl* ctrl, void* data)
+void LLFloaterSnapshot::Impl::setNeedRefresh(LLFloaterSnapshot* floater, bool need)
{
- if (ctrl->getValue().asString() == "save as")
+ if (!floater) return;
+
+ // Don't display the "Refresh to save" message if we're in auto-refresh mode.
+ if (gSavedSettings.getBOOL("AutoSnapshot"))
{
- gViewerWindow->resetSnapshotLoc();
+ need = false;
}
- onClickKeep(data);
+
+ floater->mRefreshLabel->setVisible(need);
+ floater->impl.mNeedRefresh = need;
}
// static
-void LLFloaterSnapshot::Impl::onClickKeep(void* data)
+void LLFloaterSnapshot::Impl::checkAutoSnapshot(LLSnapshotLivePreview* previewp, BOOL update_thumbnail)
{
- LLFloaterSnapshot *view = (LLFloaterSnapshot *)data;
- LLSnapshotLivePreview* previewp = getPreviewView(view);
-
if (previewp)
{
- switch (previewp->getSnapshotType())
- {
- case LLSnapshotLivePreview::SNAPSHOT_WEB:
- previewp->saveWeb();
- break;
-
- case LLSnapshotLivePreview::SNAPSHOT_POSTCARD:
- {
- LLFloaterPostcard* floater = previewp->savePostcard();
- // if still in snapshot mode, put postcard floater in snapshot floaterview
- // and link it to snapshot floater
- if (floater && !gSavedSettings.getBOOL("CloseSnapshotOnKeep"))
- {
- gFloaterView->removeChild(floater);
- gSnapshotFloaterView->addChild(floater);
- view->addDependentFloater(floater, FALSE);
- }
- }
- break;
-
- case LLSnapshotLivePreview::SNAPSHOT_TEXTURE:
- previewp->saveTexture();
- break;
-
- case LLSnapshotLivePreview::SNAPSHOT_LOCAL:
- previewp->saveLocal();
- break;
-
- default:
- break;
- }
-
- if (gSavedSettings.getBOOL("CloseSnapshotOnKeep"))
- {
- view->closeFloater();
- }
- else
- {
- checkAutoSnapshot(previewp);
- }
-
- updateControls(view);
+ BOOL autosnap = gSavedSettings.getBOOL("AutoSnapshot");
+ lldebugs << "updating " << (autosnap ? "snapshot" : "thumbnail") << llendl;
+ previewp->updateSnapshot(autosnap, update_thumbnail, autosnap ? AUTO_SNAPSHOT_TIME_DELAY : 0.f);
}
}
@@ -1570,6 +1517,8 @@ void LLFloaterSnapshot::Impl::onClickNewSnapshot(void* data)
LLFloaterSnapshot *view = (LLFloaterSnapshot *)data;
if (previewp && view)
{
+ view->impl.setStatus(Impl::STATUS_READY);
+ lldebugs << "updating snapshot" << llendl;
previewp->updateSnapshot(TRUE);
}
}
@@ -1590,36 +1539,15 @@ void LLFloaterSnapshot::Impl::onClickAutoSnap(LLUICtrl *ctrl, void* data)
void LLFloaterSnapshot::Impl::onClickMore(void* data)
{
- gSavedSettings.setBOOL( "AdvanceSnapshot", TRUE );
+ BOOL visible = gSavedSettings.getBOOL("AdvanceSnapshot");
- LLFloaterSnapshot *view = (LLFloaterSnapshot *)data;
- if (view)
- {
- view->translate( 0, view->getUIWinHeightShort() - view->getUIWinHeightLong() );
- view->reshape(view->getRect().getWidth(), view->getUIWinHeightLong());
- updateControls(view) ;
- updateLayout(view) ;
- if(getPreviewView(view))
- {
- getPreviewView(view)->setThumbnailImageSize() ;
- }
- }
-}
-void LLFloaterSnapshot::Impl::onClickLess(void* data)
-{
- gSavedSettings.setBOOL( "AdvanceSnapshot", FALSE );
-
- LLFloaterSnapshot *view = (LLFloaterSnapshot *)data;
+ LLFloaterSnapshot *view = (LLFloaterSnapshot *)data;
if (view)
{
- view->translate( 0, view->getUIWinHeightLong() - view->getUIWinHeightShort() );
- view->reshape(view->getRect().getWidth(), view->getUIWinHeightShort());
+ view->impl.setStatus(Impl::STATUS_READY);
+ gSavedSettings.setBOOL("AdvanceSnapshot", !visible);
updateControls(view) ;
updateLayout(view) ;
- if(getPreviewView(view))
- {
- getPreviewView(view)->setThumbnailImageSize() ;
- }
}
}
@@ -1652,20 +1580,10 @@ void LLFloaterSnapshot::Impl::onClickHUDCheck(LLUICtrl *ctrl, void* data)
}
// static
-void LLFloaterSnapshot::Impl::onClickKeepOpenCheck(LLUICtrl* ctrl, void* data)
+void LLFloaterSnapshot::Impl::applyKeepAspectCheck(LLFloaterSnapshot* view, BOOL checked)
{
- LLCheckBoxCtrl *check = (LLCheckBoxCtrl *)ctrl;
-
- gSavedSettings.setBOOL( "CloseSnapshotOnKeep", !check->get() );
-}
+ gSavedSettings.setBOOL("KeepAspectForSnapshot", checked);
-// static
-void LLFloaterSnapshot::Impl::onClickKeepAspectCheck(LLUICtrl* ctrl, void* data)
-{
- LLCheckBoxCtrl *check = (LLCheckBoxCtrl *)ctrl;
- gSavedSettings.setBOOL( "KeepAspectForSnapshot", check->get() );
-
- LLFloaterSnapshot *view = (LLFloaterSnapshot *)data;
if (view)
{
LLSnapshotLivePreview* previewp = getPreviewView(view) ;
@@ -1675,11 +1593,9 @@ void LLFloaterSnapshot::Impl::onClickKeepAspectCheck(LLUICtrl* ctrl, void* data)
S32 w, h ;
previewp->getSize(w, h) ;
- if(checkImageSize(previewp, w, h, TRUE, previewp->getMaxImageSize()))
- {
- resetSnapshotSizeOnUI(view, w, h) ;
- }
+ updateSpinners(view, previewp, w, h, TRUE); // may change w and h
+ lldebugs << "updating thumbnail" << llendl;
previewp->setSize(w, h) ;
previewp->updateSnapshot(FALSE, TRUE);
checkAutoSnapshot(previewp, TRUE);
@@ -1688,20 +1604,6 @@ void LLFloaterSnapshot::Impl::onClickKeepAspectCheck(LLUICtrl* ctrl, void* data)
}
// static
-void LLFloaterSnapshot::Impl::onCommitQuality(LLUICtrl* ctrl, void* data)
-{
- LLSliderCtrl* slider = (LLSliderCtrl*)ctrl;
- S32 quality_val = llfloor((F32)slider->getValue().asReal());
-
- LLSnapshotLivePreview* previewp = getPreviewView((LLFloaterSnapshot *)data);
- if (previewp)
- {
- previewp->setSnapshotQuality(quality_val);
- }
- checkAutoSnapshot(previewp, TRUE);
-}
-
-// static
void LLFloaterSnapshot::Impl::onCommitFreezeFrame(LLUICtrl* ctrl, void* data)
{
LLCheckBoxCtrl* check_box = (LLCheckBoxCtrl*)ctrl;
@@ -1723,74 +1625,83 @@ void LLFloaterSnapshot::Impl::checkAspectRatio(LLFloaterSnapshot *view, S32 inde
LLSnapshotLivePreview *previewp = getPreviewView(view) ;
// Don't round texture sizes; textures are commonly stretched in world, profiles, etc and need to be "squashed" during upload, not cropped here
-#if 0
- if(LLSnapshotLivePreview::SNAPSHOT_TEXTURE == getTypeIndex(view))
+ if(LLSnapshotLivePreview::SNAPSHOT_TEXTURE == getActiveSnapshotType(view))
{
previewp->mKeepAspectRatio = FALSE ;
return ;
}
-#endif
-
- if(0 == index) //current window size
- {
- view->impl.mAspectRatioCheckOff = true ;
- view->getChildView("keep_aspect_check")->setEnabled(FALSE) ;
- if(previewp)
- {
- previewp->mKeepAspectRatio = TRUE ;
- }
+ BOOL keep_aspect = FALSE, enable_cb = FALSE;
+
+ if (0 == index) // current window size
+ {
+ enable_cb = FALSE;
+ keep_aspect = TRUE;
}
- else if(-1 == index) //custom
+ else if (-1 == index) // custom
{
- view->impl.mAspectRatioCheckOff = false ;
- //if(LLSnapshotLivePreview::SNAPSHOT_TEXTURE != gSavedSettings.getS32("LastSnapshotType"))
- {
- view->getChildView("keep_aspect_check")->setEnabled(TRUE) ;
-
- if(previewp)
- {
- previewp->mKeepAspectRatio = gSavedSettings.getBOOL("KeepAspectForSnapshot") ;
- }
- }
+ enable_cb = TRUE;
+ keep_aspect = gSavedSettings.getBOOL("KeepAspectForSnapshot");
}
- else
+ else // predefined resolution
{
- view->impl.mAspectRatioCheckOff = true ;
- view->getChildView("keep_aspect_check")->setEnabled(FALSE) ;
-
- if(previewp)
- {
- previewp->mKeepAspectRatio = FALSE ;
- }
+ enable_cb = FALSE;
+ keep_aspect = FALSE;
}
- return ;
+ view->impl.mAspectRatioCheckOff = !enable_cb;
+ enableAspectRatioCheckbox(view, enable_cb);
+ if (previewp)
+ {
+ previewp->mKeepAspectRatio = keep_aspect;
+ }
}
-static std::string lastSnapshotWidthName()
+// Show/hide upload progress indicators.
+// static
+void LLFloaterSnapshot::Impl::setWorking(LLFloaterSnapshot* floater, bool working)
{
- switch(gSavedSettings.getS32("LastSnapshotType"))
+ LLUICtrl* working_lbl = floater->getChild<LLUICtrl>("working_lbl");
+ working_lbl->setVisible(working);
+ floater->getChild<LLUICtrl>("working_indicator")->setVisible(working);
+
+ if (working)
{
- // *TODO: Separate settings for Web snapshots and postcards
- case LLSnapshotLivePreview::SNAPSHOT_WEB: return "LastSnapshotToEmailWidth";
- case LLSnapshotLivePreview::SNAPSHOT_POSTCARD: return "LastSnapshotToEmailWidth";
- case LLSnapshotLivePreview::SNAPSHOT_TEXTURE: return "LastSnapshotToInventoryWidth";
- default: return "LastSnapshotToDiskWidth";
+ const std::string panel_name = getActivePanel(floater, false)->getName();
+ const std::string prefix = panel_name.substr(std::string("panel_snapshot_").size());
+ std::string progress_text = floater->getString(prefix + "_" + "progress_str");
+ working_lbl->setValue(progress_text);
+ }
+
+ // All controls should be disabled while posting.
+ floater->setCtrlsEnabled(!working);
+ LLPanelSnapshot* active_panel = getActivePanel(floater);
+ if (active_panel)
+ {
+ active_panel->enableControls(!working);
}
}
-static std::string lastSnapshotHeightName()
+
+// Show/hide upload status message.
+// static
+void LLFloaterSnapshot::Impl::setFinished(LLFloaterSnapshot* floater, bool finished, bool ok, const std::string& msg)
{
- switch(gSavedSettings.getS32("LastSnapshotType"))
+ floater->mSucceessLblPanel->setVisible(finished && ok);
+ floater->mFailureLblPanel->setVisible(finished && !ok);
+
+ if (finished)
{
- // *TODO: Separate settings for Web snapshots and postcards
- case LLSnapshotLivePreview::SNAPSHOT_WEB: return "LastSnapshotToEmailHeight";
- case LLSnapshotLivePreview::SNAPSHOT_POSTCARD: return "LastSnapshotToEmailHeight";
- case LLSnapshotLivePreview::SNAPSHOT_TEXTURE: return "LastSnapshotToInventoryHeight";
- default: return "LastSnapshotToDiskHeight";
+ LLUICtrl* finished_lbl = floater->getChild<LLUICtrl>(ok ? "succeeded_lbl" : "failed_lbl");
+ std::string result_text = floater->getString(msg + "_" + (ok ? "succeeded_str" : "failed_str"));
+ finished_lbl->setValue(result_text);
+
+ LLSideTrayPanelContainer* panel_container = floater->getChild<LLSideTrayPanelContainer>("panel_container");
+ panel_container->openPreviousPanel();
+ panel_container->getCurrentPanel()->onOpen(LLSD());
}
}
+// Apply a new resolution selected from the given combobox.
// static
void LLFloaterSnapshot::Impl::updateResolution(LLUICtrl* ctrl, void* data, BOOL do_update)
{
@@ -1799,14 +1710,10 @@ void LLFloaterSnapshot::Impl::updateResolution(LLUICtrl* ctrl, void* data, BOOL
if (!view || !combobox)
{
+ llassert(view && combobox);
return;
}
- // save off all selected resolution values
- gSavedSettings.setS32("SnapshotPostcardLastResolution", view->getChild<LLComboBox>("postcard_size_combo")->getCurrentIndex());
- gSavedSettings.setS32("SnapshotTextureLastResolution", view->getChild<LLComboBox>("texture_size_combo")->getCurrentIndex());
- gSavedSettings.setS32("SnapshotLocalLastResolution", view->getChild<LLComboBox>("local_size_combo")->getCurrentIndex());
-
std::string sdstring = combobox->getSelectedValue();
LLSD sdres;
std::stringstream sstream(sdstring);
@@ -1824,16 +1731,42 @@ void LLFloaterSnapshot::Impl::updateResolution(LLUICtrl* ctrl, void* data, BOOL
if (width == 0 || height == 0)
{
// take resolution from current window size
+ lldebugs << "Setting preview res from window: " << gViewerWindow->getWindowWidthRaw() << "x" << gViewerWindow->getWindowHeightRaw() << llendl;
previewp->setSize(gViewerWindow->getWindowWidthRaw(), gViewerWindow->getWindowHeightRaw());
}
else if (width == -1 || height == -1)
{
// load last custom value
- previewp->setSize(gSavedSettings.getS32(lastSnapshotWidthName()), gSavedSettings.getS32(lastSnapshotHeightName()));
+ S32 new_width = 0, new_height = 0;
+ LLPanelSnapshot* spanel = getActivePanel(view);
+ if (spanel)
+ {
+ lldebugs << "Loading typed res from panel " << spanel->getName() << llendl;
+ new_width = spanel->getTypedPreviewWidth();
+ new_height = spanel->getTypedPreviewHeight();
+
+ // Limit custom size for inventory snapshots to 512x512 px.
+ if (getActiveSnapshotType(view) == LLSnapshotLivePreview::SNAPSHOT_TEXTURE)
+ {
+ new_width = llmin(new_width, MAX_TEXTURE_SIZE);
+ new_height = llmin(new_height, MAX_TEXTURE_SIZE);
+ }
+ }
+ else
+ {
+ lldebugs << "No custom res chosen, setting preview res from window: "
+ << gViewerWindow->getWindowWidthRaw() << "x" << gViewerWindow->getWindowHeightRaw() << llendl;
+ new_width = gViewerWindow->getWindowWidthRaw();
+ new_height = gViewerWindow->getWindowHeightRaw();
+ }
+
+ llassert(new_width > 0 && new_height > 0);
+ previewp->setSize(new_width, new_height);
}
else
{
// use the resolution from the selected pre-canned drop-down choice
+ lldebugs << "Setting preview res selected from combo: " << width << "x" << height << llendl;
previewp->setSize(width, height);
}
@@ -1847,16 +1780,12 @@ void LLFloaterSnapshot::Impl::updateResolution(LLUICtrl* ctrl, void* data, BOOL
height = llmin(height, gViewerWindow->getWindowHeightRaw());
}
+ updateSpinners(view, previewp, width, height, TRUE); // may change width and height
- if(checkImageSize(previewp, width, height, TRUE, previewp->getMaxImageSize()))
- {
- resetSnapshotSizeOnUI(view, width, height) ;
- }
-
- if(view->getChild<LLUICtrl>("snapshot_width")->getValue().asInteger() != width || view->getChild<LLUICtrl>("snapshot_height")->getValue().asInteger() != height)
+ if(getWidthSpinner(view)->getValue().asInteger() != width || getHeightSpinner(view)->getValue().asInteger() != height)
{
- view->getChild<LLUICtrl>("snapshot_width")->setValue(width);
- view->getChild<LLUICtrl>("snapshot_height")->setValue(height);
+ getWidthSpinner(view)->setValue(width);
+ getHeightSpinner(view)->setValue(height);
}
if(original_width != width || original_height != height)
@@ -1865,10 +1794,13 @@ void LLFloaterSnapshot::Impl::updateResolution(LLUICtrl* ctrl, void* data, BOOL
// hide old preview as the aspect ratio could be wrong
checkAutoSnapshot(previewp, FALSE);
+ lldebugs << "updating thumbnail" << llendl;
getPreviewView(view)->updateSnapshot(FALSE, TRUE);
if(do_update)
{
+ lldebugs << "Will update controls" << llendl;
updateControls(view);
+ setNeedRefresh(view, true);
}
}
}
@@ -1892,96 +1824,46 @@ void LLFloaterSnapshot::Impl::onCommitLayerTypes(LLUICtrl* ctrl, void*data)
}
}
-//static
-void LLFloaterSnapshot::Impl::onCommitSnapshotType(LLUICtrl* ctrl, void* data)
+// static
+void LLFloaterSnapshot::Impl::onImageQualityChange(LLFloaterSnapshot* view, S32 quality_val)
{
- LLFloaterSnapshot *view = (LLFloaterSnapshot *)data;
- if (view)
+ LLSnapshotLivePreview* previewp = getPreviewView(view);
+ if (previewp)
{
- gSavedSettings.setS32("LastSnapshotType", getTypeIndex(view));
- getPreviewView(view)->updateSnapshot(TRUE);
- updateControls(view);
+ previewp->setSnapshotQuality(quality_val);
}
+ checkAutoSnapshot(previewp, TRUE);
}
-
-//static
-void LLFloaterSnapshot::Impl::onCommitSnapshotFormat(LLUICtrl* ctrl, void* data)
+// static
+void LLFloaterSnapshot::Impl::onImageFormatChange(LLFloaterSnapshot* view)
{
- LLFloaterSnapshot *view = (LLFloaterSnapshot *)data;
if (view)
{
- gSavedSettings.setS32("SnapshotFormat", getFormatIndex(view));
+ gSavedSettings.setS32("SnapshotFormat", getImageFormat(view));
+ lldebugs << "image format changed, updating snapshot" << llendl;
getPreviewView(view)->updateSnapshot(TRUE);
updateControls(view);
+ setNeedRefresh(view, false); // we're refreshing
}
}
-
-
// Sets the named size combo to "custom" mode.
// static
void LLFloaterSnapshot::Impl::comboSetCustom(LLFloaterSnapshot* floater, const std::string& comboname)
{
LLComboBox* combo = floater->getChild<LLComboBox>(comboname);
-
combo->setCurrentByIndex(combo->getItemCount() - 1); // "custom" is always the last index
-
- if(comboname == "postcard_size_combo")
- {
- gSavedSettings.setS32("SnapshotPostcardLastResolution", combo->getCurrentIndex());
- }
- else if(comboname == "texture_size_combo")
- {
- gSavedSettings.setS32("SnapshotTextureLastResolution", combo->getCurrentIndex());
- }
- else if(comboname == "local_size_combo")
- {
- gSavedSettings.setS32("SnapshotLocalLastResolution", combo->getCurrentIndex());
- }
-
checkAspectRatio(floater, -1); // -1 means custom
}
-
-
+// Update supplied width and height according to the constrain proportions flag; limit them by max_val.
//static
BOOL LLFloaterSnapshot::Impl::checkImageSize(LLSnapshotLivePreview* previewp, S32& width, S32& height, BOOL isWidthChanged, S32 max_value)
{
S32 w = width ;
S32 h = height ;
- //if texture, ignore aspect ratio setting, round image size to power of 2.
-#if 0 // Don't round texture sizes; textures are commonly stretched in world, profiles, etc and need to be "squashed" during upload, not cropped here
- if(LLSnapshotLivePreview::SNAPSHOT_TEXTURE == gSavedSettings.getS32("LastSnapshotType"))
- {
- if(width > max_value)
- {
- width = max_value ;
- }
- if(height > max_value)
- {
- height = max_value ;
- }
-
- //round to nearest power of 2 based on the direction of movement
- // i.e. higher power of two if increasing texture resolution
- if(gSavedSettings.getS32("LastSnapshotToInventoryWidth") < width ||
- gSavedSettings.getS32("LastSnapshotToInventoryHeight") < height)
- {
- // Up arrow pressed
- width = get_next_power_two(width, MAX_TEXTURE_SIZE) ;
- height = get_next_power_two(height, MAX_TEXTURE_SIZE) ;
- }
- else
- {
- // Down or no change
- width = get_lower_power_two(width, MAX_TEXTURE_SIZE) ;
- height = get_lower_power_two(height, MAX_TEXTURE_SIZE) ;
- }
- }
- else
-#endif
if(previewp && previewp->mKeepAspectRatio)
{
if(gViewerWindow->getWindowWidthRaw() < 1 || gViewerWindow->getWindowHeightRaw() < 1)
@@ -1995,11 +1877,11 @@ BOOL LLFloaterSnapshot::Impl::checkImageSize(LLSnapshotLivePreview* previewp, S3
//change another value proportionally
if(isWidthChanged)
{
- height = (S32)(width / aspect_ratio) ;
+ height = llround(width / aspect_ratio) ;
}
else
{
- width = (S32)(height * aspect_ratio) ;
+ width = llround(height * aspect_ratio) ;
}
//bound w/h by the max_value
@@ -2017,87 +1899,79 @@ BOOL LLFloaterSnapshot::Impl::checkImageSize(LLSnapshotLivePreview* previewp, S3
}
}
}
- else
- {
- }
return (w != width || h != height) ;
}
//static
-void LLFloaterSnapshot::Impl::resetSnapshotSizeOnUI(LLFloaterSnapshot *view, S32 width, S32 height)
+void LLFloaterSnapshot::Impl::setImageSizeSpinnersValues(LLFloaterSnapshot *view, S32 width, S32 height)
{
- view->getChild<LLSpinCtrl>("snapshot_width")->forceSetValue(width);
- view->getChild<LLSpinCtrl>("snapshot_height")->forceSetValue(height);
- gSavedSettings.setS32(lastSnapshotWidthName(), width);
- gSavedSettings.setS32(lastSnapshotHeightName(), height);
+ getWidthSpinner(view)->forceSetValue(width);
+ getHeightSpinner(view)->forceSetValue(height);
}
-//static
-void LLFloaterSnapshot::Impl::onCommitCustomResolution(LLUICtrl *ctrl, void* data)
+// static
+void LLFloaterSnapshot::Impl::updateSpinners(LLFloaterSnapshot* view, LLSnapshotLivePreview* previewp, S32& width, S32& height, BOOL is_width_changed)
{
- LLFloaterSnapshot *view = (LLFloaterSnapshot *)data;
- if (view)
+ if (checkImageSize(previewp, width, height, is_width_changed, previewp->getMaxImageSize()))
{
- S32 w = llfloor((F32)view->getChild<LLUICtrl>("snapshot_width")->getValue().asReal());
- S32 h = llfloor((F32)view->getChild<LLUICtrl>("snapshot_height")->getValue().asReal());
+ setImageSizeSpinnersValues(view, width, height);
+ }
+}
- LLSnapshotLivePreview* previewp = getPreviewView(view);
- if (previewp)
+// static
+void LLFloaterSnapshot::Impl::applyCustomResolution(LLFloaterSnapshot* view, S32 w, S32 h)
+{
+ bool need_refresh = false;
+
+ lldebugs << "applyCustomResolution(" << w << ", " << h << ")" << llendl;
+ if (!view) return;
+
+ LLSnapshotLivePreview* previewp = getPreviewView(view);
+ if (previewp)
+ {
+ S32 curw,curh;
+ previewp->getSize(curw, curh);
+
+ if (w != curw || h != curh)
{
- S32 curw,curh;
- previewp->getSize(curw, curh);
-
- if (w != curw || h != curh)
- {
- BOOL update_ = FALSE ;
- //if to upload a snapshot, process spinner input in a special way.
-#if 0 // Don't round texture sizes; textures are commonly stretched in world, profiles, etc and need to be "squashed" during upload, not cropped here
- if(LLSnapshotLivePreview::SNAPSHOT_TEXTURE == gSavedSettings.getS32("LastSnapshotType"))
- {
- S32 spinner_increment = (S32)((LLSpinCtrl*)ctrl)->getIncrement() ;
- S32 dw = w - curw ;
- S32 dh = h - curh ;
- dw = (dw == spinner_increment) ? 1 : ((dw == -spinner_increment) ? -1 : 0) ;
- dh = (dh == spinner_increment) ? 1 : ((dh == -spinner_increment) ? -1 : 0) ;
-
- if(dw)
- {
- w = (dw > 0) ? curw << dw : curw >> -dw ;
- update_ = TRUE ;
- }
- if(dh)
- {
- h = (dh > 0) ? curh << dh : curh >> -dh ;
- update_ = TRUE ;
- }
- }
-#endif
- previewp->setMaxImageSize((S32)((LLSpinCtrl *)ctrl)->getMaxValue()) ;
-
- // Check image size changes the value of height and width
- if(checkImageSize(previewp, w, h, w != curw, previewp->getMaxImageSize())
- || update_)
- {
- resetSnapshotSizeOnUI(view, w, h) ;
- }
+ //if to upload a snapshot, process spinner input in a special way.
+ previewp->setMaxImageSize((S32) getWidthSpinner(view)->getMaxValue()) ;
- previewp->setSize(w,h);
- checkAutoSnapshot(previewp, FALSE);
- previewp->updateSnapshot(FALSE, TRUE);
- comboSetCustom(view, "postcard_size_combo");
- comboSetCustom(view, "texture_size_combo");
- comboSetCustom(view, "local_size_combo");
- }
- }
+ updateSpinners(view, previewp, w, h, w != curw); // may change w and h
- gSavedSettings.setS32(lastSnapshotWidthName(), w);
- gSavedSettings.setS32(lastSnapshotHeightName(), h);
+ previewp->setSize(w,h);
+ checkAutoSnapshot(previewp, FALSE);
+ lldebugs << "applied custom resolution, updating thumbnail" << llendl;
+ previewp->updateSnapshot(FALSE, TRUE);
+ comboSetCustom(view, "profile_size_combo");
+ comboSetCustom(view, "postcard_size_combo");
+ comboSetCustom(view, "texture_size_combo");
+ comboSetCustom(view, "local_size_combo");
+ need_refresh = true;
+ }
+ }
- updateControls(view);
+ updateControls(view);
+ if (need_refresh)
+ {
+ setNeedRefresh(view, true); // need to do this after updateControls()
}
}
+// static
+void LLFloaterSnapshot::Impl::onSnapshotUploadFinished(bool status)
+{
+ setStatus(STATUS_FINISHED, status, "profile");
+}
+
+
+// static
+void LLFloaterSnapshot::Impl::onSendingPostcardFinished(bool status)
+{
+ setStatus(STATUS_FINISHED, status, "postcard");
+}
+
///----------------------------------------------------------------------------
/// Class LLFloaterSnapshot
///----------------------------------------------------------------------------
@@ -2105,6 +1979,10 @@ void LLFloaterSnapshot::Impl::onCommitCustomResolution(LLUICtrl *ctrl, void* dat
// Default constructor
LLFloaterSnapshot::LLFloaterSnapshot(const LLSD& key)
: LLFloater(key),
+ mRefreshBtn(NULL),
+ mRefreshLabel(NULL),
+ mSucceessLblPanel(NULL),
+ mFailureLblPanel(NULL),
impl (*(new Impl))
{
}
@@ -2112,7 +1990,7 @@ LLFloaterSnapshot::LLFloaterSnapshot(const LLSD& key)
// Destroys the object
LLFloaterSnapshot::~LLFloaterSnapshot()
{
- LLView::deleteViewByHandle(impl.mPreviewHandle);
+ if (impl.mPreviewHandle.get()) impl.mPreviewHandle.get()->die();
//unfreeze everything else
gSavedSettings.setBOOL("FreezeTime", FALSE);
@@ -2134,24 +2012,13 @@ BOOL LLFloaterSnapshot::postBuild()
LLWebSharing::instance().init();
}
- childSetCommitCallback("snapshot_type_radio", Impl::onCommitSnapshotType, this);
- childSetCommitCallback("local_format_combo", Impl::onCommitSnapshotFormat, this);
-
+ mRefreshBtn = getChild<LLUICtrl>("new_snapshot_btn");
childSetAction("new_snapshot_btn", Impl::onClickNewSnapshot, this);
+ mRefreshLabel = getChild<LLUICtrl>("refresh_lbl");
+ mSucceessLblPanel = getChild<LLUICtrl>("succeeded_panel");
+ mFailureLblPanel = getChild<LLUICtrl>("failed_panel");
- childSetAction("more_btn", Impl::onClickMore, this);
- childSetAction("less_btn", Impl::onClickLess, this);
-
- childSetAction("upload_btn", Impl::onClickKeep, this);
- childSetAction("send_btn", Impl::onClickKeep, this);
- childSetCommitCallback("save_btn", Impl::onCommitSave, this);
- childSetAction("discard_btn", Impl::onClickDiscard, this);
-
- childSetCommitCallback("image_quality_slider", Impl::onCommitQuality, this);
- getChild<LLUICtrl>("image_quality_slider")->setValue(gSavedSettings.getS32("SnapshotQuality"));
-
- childSetCommitCallback("snapshot_width", Impl::onCommitCustomResolution, this);
- childSetCommitCallback("snapshot_height", Impl::onCommitCustomResolution, this);
+ childSetAction("advanced_options_btn", Impl::onClickMore, this);
childSetCommitCallback("ui_check", Impl::onClickUICheck, this);
getChild<LLUICtrl>("ui_check")->setValue(gSavedSettings.getBOOL("RenderUIInSnapshot"));
@@ -2159,28 +2026,22 @@ BOOL LLFloaterSnapshot::postBuild()
childSetCommitCallback("hud_check", Impl::onClickHUDCheck, this);
getChild<LLUICtrl>("hud_check")->setValue(gSavedSettings.getBOOL("RenderHUDInSnapshot"));
- childSetCommitCallback("keep_open_check", Impl::onClickKeepOpenCheck, this);
- getChild<LLUICtrl>("keep_open_check")->setValue(!gSavedSettings.getBOOL("CloseSnapshotOnKeep"));
-
- childSetCommitCallback("keep_aspect_check", Impl::onClickKeepAspectCheck, this);
- getChild<LLUICtrl>("keep_aspect_check")->setValue(gSavedSettings.getBOOL("KeepAspectForSnapshot"));
+ impl.setAspectRatioCheckboxValue(this, gSavedSettings.getBOOL("KeepAspectForSnapshot"));
childSetCommitCallback("layer_types", Impl::onCommitLayerTypes, this);
getChild<LLUICtrl>("layer_types")->setValue("colors");
getChildView("layer_types")->setEnabled(FALSE);
- getChild<LLUICtrl>("snapshot_width")->setValue(gSavedSettings.getS32(lastSnapshotWidthName()));
- getChild<LLUICtrl>("snapshot_height")->setValue(gSavedSettings.getS32(lastSnapshotHeightName()));
-
getChild<LLUICtrl>("freeze_frame_check")->setValue(gSavedSettings.getBOOL("UseFreezeFrame"));
childSetCommitCallback("freeze_frame_check", Impl::onCommitFreezeFrame, this);
getChild<LLUICtrl>("auto_snapshot_check")->setValue(gSavedSettings.getBOOL("AutoSnapshot"));
childSetCommitCallback("auto_snapshot_check", Impl::onClickAutoSnap, this);
- childSetCommitCallback("postcard_size_combo", Impl::onCommitResolution, this);
- childSetCommitCallback("texture_size_combo", Impl::onCommitResolution, this);
- childSetCommitCallback("local_size_combo", Impl::onCommitResolution, this);
+ LLWebProfile::setImageUploadResultCallback(boost::bind(&LLFloaterSnapshot::Impl::onSnapshotUploadFinished, _1));
+ LLPostCard::setPostResultCallback(boost::bind(&LLFloaterSnapshot::Impl::onSendingPostcardFinished, _1));
+
+ sThumbnailPlaceholder = getChild<LLUICtrl>("thumbnail_placeholder");
// create preview window
LLRect full_screen_rect = getRootView()->getRect();
@@ -2198,6 +2059,13 @@ BOOL LLFloaterSnapshot::postBuild()
gFloaterView->removeChild(this);
gSnapshotFloaterView->addChild(this);
+ // Pre-select "Current Window" resolution.
+ getChild<LLComboBox>("profile_size_combo")->selectNthItem(0);
+ getChild<LLComboBox>("postcard_size_combo")->selectNthItem(0);
+ getChild<LLComboBox>("texture_size_combo")->selectNthItem(0);
+ getChild<LLComboBox>("local_size_combo")->selectNthItem(0);
+ getChild<LLComboBox>("local_format_combo")->selectNthItem(0);
+
impl.mPreviewHandle = previewp->getHandle();
impl.updateControls(this);
impl.updateLayout(this);
@@ -2217,23 +2085,69 @@ void LLFloaterSnapshot::draw()
LLFloater::draw();
- if (previewp)
+ if (previewp && !isMinimized())
{
if(previewp->getThumbnailImage())
{
- LLRect thumbnail_rect = getChild<LLUICtrl>("thumbnail_placeholder")->getRect();
+ bool working = impl.getStatus() == Impl::STATUS_WORKING;
+ const LLRect& thumbnail_rect = getThumbnailPlaceholderRect();
+ const S32 thumbnail_w = previewp->getThumbnailWidth();
+ const S32 thumbnail_h = previewp->getThumbnailHeight();
+
+ // calc preview offset within the preview rect
+ const S32 local_offset_x = (thumbnail_rect.getWidth() - thumbnail_w) / 2 ;
+ const S32 local_offset_y = (thumbnail_rect.getHeight() - thumbnail_h) / 2 ; // preview y pos within the preview rect
- S32 offset_x = (getRect().getWidth() - previewp->getThumbnailWidth()) / 2 ;
- S32 offset_y = thumbnail_rect.mBottom + (thumbnail_rect.getHeight() - previewp->getThumbnailHeight()) / 2 ;
+ // calc preview offset within the floater rect
+ S32 offset_x = thumbnail_rect.mLeft + local_offset_x;
+ S32 offset_y = thumbnail_rect.mBottom + local_offset_y;
- glMatrixMode(GL_MODELVIEW);
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
// Apply floater transparency to the texture unless the floater is focused.
F32 alpha = getTransparencyType() == TT_ACTIVE ? 1.0f : getCurrentTransparency();
+ LLColor4 color = working ? LLColor4::grey4 : LLColor4::white;
gl_draw_scaled_image(offset_x, offset_y,
- previewp->getThumbnailWidth(), previewp->getThumbnailHeight(),
- previewp->getThumbnailImage(), LLColor4::white % alpha);
+ thumbnail_w, thumbnail_h,
+ previewp->getThumbnailImage(), color % alpha);
previewp->drawPreviewRect(offset_x, offset_y) ;
+
+ // Draw some controls on top of the preview thumbnail.
+ static const S32 PADDING = 5;
+ static const S32 REFRESH_LBL_BG_HEIGHT = 32;
+
+ // Reshape and position the posting result message panels at the top of the thumbnail.
+ // Do this regardless of current posting status (finished or not) to avoid flicker
+ // when the result message is displayed for the first time.
+ // if (impl.getStatus() == Impl::STATUS_FINISHED)
+ {
+ LLRect result_lbl_rect = mSucceessLblPanel->getRect();
+ const S32 result_lbl_h = result_lbl_rect.getHeight();
+ result_lbl_rect.setLeftTopAndSize(local_offset_x, local_offset_y + thumbnail_h, thumbnail_w - 1, result_lbl_h);
+ mSucceessLblPanel->reshape(result_lbl_rect.getWidth(), result_lbl_h);
+ mSucceessLblPanel->setRect(result_lbl_rect);
+ mFailureLblPanel->reshape(result_lbl_rect.getWidth(), result_lbl_h);
+ mFailureLblPanel->setRect(result_lbl_rect);
+ }
+
+ // Position the refresh button in the bottom left corner of the thumbnail.
+ mRefreshBtn->setOrigin(local_offset_x + PADDING, local_offset_y + PADDING);
+
+ if (impl.mNeedRefresh)
+ {
+ // Place the refresh hint text to the right of the refresh button.
+ const LLRect& refresh_btn_rect = mRefreshBtn->getRect();
+ mRefreshLabel->setOrigin(refresh_btn_rect.mLeft + refresh_btn_rect.getWidth() + PADDING, refresh_btn_rect.mBottom);
+
+ // Draw the refresh hint background.
+ LLRect refresh_label_bg_rect(offset_x, offset_y + REFRESH_LBL_BG_HEIGHT, offset_x + thumbnail_w - 1, offset_y);
+ gl_rect_2d(refresh_label_bg_rect, LLColor4::white % 0.9f, TRUE);
+ }
+
+ gGL.pushUIMatrix();
+ LLUI::translate((F32) thumbnail_rect.mLeft, (F32) thumbnail_rect.mBottom);
+ sThumbnailPlaceholder->draw();
+ gGL.popUIMatrix();
}
}
}
@@ -2243,12 +2157,16 @@ void LLFloaterSnapshot::onOpen(const LLSD& key)
LLSnapshotLivePreview* preview = LLFloaterSnapshot::Impl::getPreviewView(this);
if(preview)
{
+ lldebugs << "opened, updating snapshot" << llendl;
preview->updateSnapshot(TRUE);
}
focusFirstItem(FALSE);
gSnapshotFloaterView->setEnabled(TRUE);
gSnapshotFloaterView->setVisible(TRUE);
gSnapshotFloaterView->adjustToFitScreen(this, FALSE);
+
+ // Initialize default tab.
+ getChild<LLSideTrayPanelContainer>("panel_container")->getCurrentPanel()->onOpen(LLSD());
}
void LLFloaterSnapshot::onClose(bool app_quitting)
@@ -2256,6 +2174,62 @@ void LLFloaterSnapshot::onClose(bool app_quitting)
getParent()->setMouseOpaque(FALSE);
}
+// virtual
+S32 LLFloaterSnapshot::notify(const LLSD& info)
+{
+ // A child panel wants to change snapshot resolution.
+ if (info.has("combo-res-change"))
+ {
+ std::string combo_name = info["combo-res-change"]["control-name"].asString();
+ impl.updateResolution(getChild<LLUICtrl>(combo_name), this);
+ return 1;
+ }
+
+ if (info.has("custom-res-change"))
+ {
+ LLSD res = info["custom-res-change"];
+ impl.applyCustomResolution(this, res["w"].asInteger(), res["h"].asInteger());
+ return 1;
+ }
+
+ if (info.has("keep-aspect-change"))
+ {
+ impl.applyKeepAspectCheck(this, info["keep-aspect-change"].asBoolean());
+ return 1;
+ }
+
+ if (info.has("image-quality-change"))
+ {
+ impl.onImageQualityChange(this, info["image-quality-change"].asInteger());
+ return 1;
+ }
+
+ if (info.has("image-format-change"))
+ {
+ impl.onImageFormatChange(this);
+ return 1;
+ }
+
+ if (info.has("set-ready"))
+ {
+ impl.setStatus(Impl::STATUS_READY);
+ return 1;
+ }
+
+ if (info.has("set-working"))
+ {
+ impl.setStatus(Impl::STATUS_WORKING);
+ return 1;
+ }
+
+ if (info.has("set-finished"))
+ {
+ LLSD data = info["set-finished"];
+ impl.setStatus(Impl::STATUS_FINISHED, data["ok"].asBoolean(), data["msg"].asString());
+ return 1;
+ }
+ return 0;
+}
//static
void LLFloaterSnapshot::update()
@@ -2265,6 +2239,7 @@ void LLFloaterSnapshot::update()
return;
BOOL changed = FALSE;
+ lldebugs << "npreviews: " << LLSnapshotLivePreview::sList.size() << llendl;
for (std::set<LLSnapshotLivePreview*>::iterator iter = LLSnapshotLivePreview::sList.begin();
iter != LLSnapshotLivePreview::sList.end(); ++iter)
{
@@ -2272,10 +2247,181 @@ void LLFloaterSnapshot::update()
}
if(changed)
{
+ lldebugs << "changed" << llendl;
inst->impl.updateControls(inst);
}
}
+// static
+LLFloaterSnapshot* LLFloaterSnapshot::getInstance()
+{
+ return LLFloaterReg::getTypedInstance<LLFloaterSnapshot>("snapshot");
+}
+
+// static
+void LLFloaterSnapshot::saveTexture()
+{
+ lldebugs << "saveTexture" << llendl;
+
+ // FIXME: duplicated code
+ LLFloaterSnapshot* instance = LLFloaterReg::findTypedInstance<LLFloaterSnapshot>("snapshot");
+ if (!instance)
+ {
+ llassert(instance != NULL);
+ return;
+ }
+ LLSnapshotLivePreview* previewp = Impl::getPreviewView(instance);
+ if (!previewp)
+ {
+ llassert(previewp != NULL);
+ return;
+ }
+
+ previewp->saveTexture();
+}
+
+// static
+BOOL LLFloaterSnapshot::saveLocal()
+{
+ lldebugs << "saveLocal" << llendl;
+ // FIXME: duplicated code
+ LLFloaterSnapshot* instance = LLFloaterReg::findTypedInstance<LLFloaterSnapshot>("snapshot");
+ if (!instance)
+ {
+ llassert(instance != NULL);
+ return FALSE;
+ }
+ LLSnapshotLivePreview* previewp = Impl::getPreviewView(instance);
+ if (!previewp)
+ {
+ llassert(previewp != NULL);
+ return FALSE;
+ }
+
+ return previewp->saveLocal();
+}
+
+// static
+void LLFloaterSnapshot::preUpdate()
+{
+ // FIXME: duplicated code
+ LLFloaterSnapshot* instance = LLFloaterReg::findTypedInstance<LLFloaterSnapshot>("snapshot");
+ if (instance)
+ {
+ // Disable the send/post/save buttons until snapshot is ready.
+ Impl::updateControls(instance);
+
+ // Force hiding the "Refresh to save" hint because we know we've just started refresh.
+ Impl::setNeedRefresh(instance, false);
+ }
+}
+
+// static
+void LLFloaterSnapshot::postUpdate()
+{
+ // FIXME: duplicated code
+ LLFloaterSnapshot* instance = LLFloaterReg::findTypedInstance<LLFloaterSnapshot>("snapshot");
+ if (instance)
+ {
+ // Enable the send/post/save buttons.
+ Impl::updateControls(instance);
+
+ // We've just done refresh.
+ Impl::setNeedRefresh(instance, false);
+
+ // The refresh button is initially hidden. We show it after the first update,
+ // i.e. when preview appears.
+ if (!instance->mRefreshBtn->getVisible())
+ {
+ instance->mRefreshBtn->setVisible(true);
+ }
+ }
+}
+
+// static
+void LLFloaterSnapshot::postSave()
+{
+ LLFloaterSnapshot* instance = LLFloaterReg::findTypedInstance<LLFloaterSnapshot>("snapshot");
+ if (!instance)
+ {
+ llassert(instance != NULL);
+ return;
+ }
+
+ instance->impl.updateControls(instance);
+ instance->impl.setStatus(Impl::STATUS_WORKING);
+}
+
+// static
+void LLFloaterSnapshot::postPanelSwitch()
+{
+ LLFloaterSnapshot* instance = getInstance();
+ instance->impl.updateControls(instance);
+
+ // Remove the success/failure indicator whenever user presses a snapshot option button.
+ instance->impl.setStatus(Impl::STATUS_READY);
+}
+
+// static
+LLPointer<LLImageFormatted> LLFloaterSnapshot::getImageData()
+{
+ // FIXME: May not work for textures.
+
+ LLFloaterSnapshot* instance = LLFloaterReg::findTypedInstance<LLFloaterSnapshot>("snapshot");
+ if (!instance)
+ {
+ llassert(instance != NULL);
+ return NULL;
+ }
+
+ LLSnapshotLivePreview* previewp = Impl::getPreviewView(instance);
+ if (!previewp)
+ {
+ llassert(previewp != NULL);
+ return NULL;
+ }
+
+ LLPointer<LLImageFormatted> img = previewp->getFormattedImage();
+ if (!img.get())
+ {
+ llwarns << "Empty snapshot image data" << llendl;
+ llassert(img.get() != NULL);
+ }
+
+ return img;
+}
+
+// static
+const LLVector3d& LLFloaterSnapshot::getPosTakenGlobal()
+{
+ LLFloaterSnapshot* instance = LLFloaterReg::findTypedInstance<LLFloaterSnapshot>("snapshot");
+ if (!instance)
+ {
+ llassert(instance != NULL);
+ return LLVector3d::zero;
+ }
+
+ LLSnapshotLivePreview* previewp = Impl::getPreviewView(instance);
+ if (!previewp)
+ {
+ llassert(previewp != NULL);
+ return LLVector3d::zero;
+ }
+
+ return previewp->getPosTakenGlobal();
+}
+
+// static
+void LLFloaterSnapshot::setAgentEmail(const std::string& email)
+{
+ LLFloaterSnapshot* instance = LLFloaterReg::findTypedInstance<LLFloaterSnapshot>("snapshot");
+ if (instance)
+ {
+ LLSideTrayPanelContainer* panel_container = instance->getChild<LLSideTrayPanelContainer>("panel_container");
+ LLPanel* postcard_panel = panel_container->getPanelByName("panel_snapshot_postcard");
+ postcard_panel->notify(LLSD().with("agent-email", email));
+ }
+}
///----------------------------------------------------------------------------
/// Class LLSnapshotFloaterView
diff --git a/indra/newview/llfloatersnapshot.h b/indra/newview/llfloatersnapshot.h
index c92d9efde5..afe135fa40 100644
--- a/indra/newview/llfloatersnapshot.h
+++ b/indra/newview/llfloatersnapshot.h
@@ -27,11 +27,15 @@
#ifndef LL_LLFLOATERSNAPSHOT_H
#define LL_LLFLOATERSNAPSHOT_H
+#include "llimage.h"
#include "llfloater.h"
+class LLSpinCtrl;
class LLFloaterSnapshot : public LLFloater
{
+ LOG_CLASS(LLFloaterSnapshot);
+
public:
typedef enum e_snapshot_format
{
@@ -47,20 +51,31 @@ public:
/*virtual*/ void draw();
/*virtual*/ void onOpen(const LLSD& key);
/*virtual*/ void onClose(bool app_quitting);
+ /*virtual*/ S32 notify(const LLSD& info);
static void update();
-
- static S32 getUIWinHeightLong() {return sUIWinHeightLong ;}
- static S32 getUIWinHeightShort() {return sUIWinHeightShort ;}
- static S32 getUIWinWidth() {return sUIWinWidth ;}
+
+ // TODO: create a snapshot model instead
+ static LLFloaterSnapshot* getInstance();
+ static void saveTexture();
+ static BOOL saveLocal();
+ static void preUpdate();
+ static void postUpdate();
+ static void postSave();
+ static void postPanelSwitch();
+ static LLPointer<LLImageFormatted> getImageData();
+ static const LLVector3d& getPosTakenGlobal();
+ static void setAgentEmail(const std::string& email);
+
+ static const LLRect& getThumbnailPlaceholderRect() { return sThumbnailPlaceholder->getRect(); }
private:
+ static LLUICtrl* sThumbnailPlaceholder;
+ LLUICtrl *mRefreshBtn, *mRefreshLabel;
+ LLUICtrl *mSucceessLblPanel, *mFailureLblPanel;
+
class Impl;
Impl& impl;
-
- static S32 sUIWinHeightLong ;
- static S32 sUIWinHeightShort ;
- static S32 sUIWinWidth ;
};
class LLSnapshotFloaterView : public LLFloaterView
diff --git a/indra/newview/llfloatersounddevices.cpp b/indra/newview/llfloatersounddevices.cpp
index e692f1735a..72c077d215 100644
--- a/indra/newview/llfloatersounddevices.cpp
+++ b/indra/newview/llfloatersounddevices.cpp
@@ -28,7 +28,6 @@
#include "llfloatersounddevices.h"
-#include "llbottomtray.h"
#include "lldraghandle.h"
#include "llpanelvoicedevicesettings.h"
@@ -55,13 +54,7 @@ LLFloaterSoundDevices::~LLFloaterSoundDevices()
BOOL LLFloaterSoundDevices::postBuild()
{
LLTransientDockableFloater::postBuild();
-
- LLView *anchor_panel = LLBottomTray::getInstance()->getChild<LLView>("flyout_btn");
- setDockControl(new LLDockControl(anchor_panel, this, getDockTongue(), LLDockControl::TOP));
- setIsChrome(TRUE);
- if (mDragHandle)
- mDragHandle->setTitleVisible(TRUE);
updateTransparency(TT_ACTIVE); // force using active floater transparency (STORM-730)
LLPanelVoiceDeviceSettings* panel = findChild<LLPanelVoiceDeviceSettings>("device_settings_panel");
diff --git a/indra/newview/llfloatertools.cpp b/indra/newview/llfloatertools.cpp
index 1008b4a6e4..bd5b5f4eb0 100644
--- a/indra/newview/llfloatertools.cpp
+++ b/indra/newview/llfloatertools.cpp
@@ -529,7 +529,7 @@ void LLFloaterTools::refresh()
mPanelLandInfo->refresh();
// Refresh the advanced weights floater
- LLFloaterObjectWeights* object_weights_floater = LLFloaterReg::getTypedInstance<LLFloaterObjectWeights>("object_weights");
+ LLFloaterObjectWeights* object_weights_floater = LLFloaterReg::findTypedInstance<LLFloaterObjectWeights>("object_weights");
if(object_weights_floater && object_weights_floater->getVisible())
{
object_weights_floater->refresh();
@@ -1409,9 +1409,7 @@ bool LLFloaterTools::deleteMediaConfirm(const LLSD& notification, const LLSD& re
//
void LLFloaterTools::clearMediaSettings()
{
- LLFloaterMediaSettings::getInstance();
LLFloaterMediaSettings::clearValues(false);
-
}
//////////////////////////////////////////////////////////////////////////////
diff --git a/indra/newview/llfloatertoybox.cpp b/indra/newview/llfloatertoybox.cpp
new file mode 100644
index 0000000000..324afe661f
--- /dev/null
+++ b/indra/newview/llfloatertoybox.cpp
@@ -0,0 +1,191 @@
+/**
+ * @file llfloatertoybox.cpp
+ * @brief The toybox for flexibilizing the UI.
+ *
+ * $LicenseInfo:firstyear=2002&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llfloatertoybox.h"
+
+#include "llbutton.h"
+#include "llcommandmanager.h"
+#include "llnotifications.h"
+#include "llnotificationsutil.h"
+#include "llpanel.h"
+#include "lltoolbar.h"
+#include "lltoolbarview.h"
+#include "lltrans.h"
+
+LLFloaterToybox::LLFloaterToybox(const LLSD& key)
+ : LLFloater(key)
+ , mToolBar(NULL)
+{
+ mCommitCallbackRegistrar.add("Toybox.RestoreDefaults", boost::bind(&LLFloaterToybox::onBtnRestoreDefaults, this));
+ mCommitCallbackRegistrar.add("Toybox.ClearAll", boost::bind(&LLFloaterToybox::onBtnClearAll, this));
+}
+
+LLFloaterToybox::~LLFloaterToybox()
+{
+}
+
+bool compare_localized_command_labels(LLCommand * cmd1, LLCommand * cmd2)
+{
+ std::string lab1 = LLTrans::getString(cmd1->labelRef());
+ std::string lab2 = LLTrans::getString(cmd2->labelRef());
+
+ return (lab1 < lab2);
+}
+
+BOOL LLFloaterToybox::postBuild()
+{
+ mToolBar = getChild<LLToolBar>("toybox_toolbar");
+
+ mToolBar->setStartDragCallback(boost::bind(LLToolBarView::startDragTool,_1,_2,_3));
+ mToolBar->setHandleDragCallback(boost::bind(LLToolBarView::handleDragTool,_1,_2,_3,_4));
+ mToolBar->setHandleDropCallback(boost::bind(LLToolBarView::handleDropTool,_1,_2,_3,_4));
+ mToolBar->setButtonEnterCallback(boost::bind(&LLFloaterToybox::onToolBarButtonEnter,this,_1));
+
+ //
+ // Sort commands by localized labels so they will appear alphabetized in all languages
+ //
+
+ std::list<LLCommand *> alphabetized_commands;
+
+ LLCommandManager& cmdMgr = LLCommandManager::instance();
+ for (U32 i = 0; i < cmdMgr.commandCount(); i++)
+ {
+ LLCommand * command = cmdMgr.getCommand(i);
+
+ if (command->availableInToybox())
+ {
+ alphabetized_commands.push_back(command);
+ }
+ }
+
+ alphabetized_commands.sort(compare_localized_command_labels);
+
+ //
+ // Create Buttons
+ //
+
+ for (std::list<LLCommand *>::iterator it = alphabetized_commands.begin(); it != alphabetized_commands.end(); ++it)
+ {
+ mToolBar->addCommand((*it)->id());
+ }
+
+ return TRUE;
+}
+
+void LLFloaterToybox::draw()
+{
+ llassert(gToolBarView != NULL);
+
+ const command_id_list_t& command_list = mToolBar->getCommandsList();
+
+ for (command_id_list_t::const_iterator it = command_list.begin(); it != command_list.end(); ++it)
+ {
+ const LLCommandId& id = *it;
+
+ const bool command_not_present = (gToolBarView->hasCommand(id) == LLToolBarView::TOOLBAR_NONE);
+ mToolBar->enableCommand(id, command_not_present);
+ }
+
+ LLFloater::draw();
+}
+
+static bool finish_restore_toybox(const LLSD& notification, const LLSD& response)
+{
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+
+ if (option == 0)
+ {
+ LLToolBarView::loadDefaultToolbars();
+ }
+
+ return false;
+}
+
+static bool finish_clear_all_toybox(const LLSD& notification, const LLSD& response)
+{
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+
+ if (option == 0)
+ {
+ LLToolBarView::clearAllToolbars();
+ }
+
+ return false;
+}
+
+static LLNotificationFunctorRegistration finish_restore_toybox_reg("ConfirmRestoreToybox", finish_restore_toybox);
+static LLNotificationFunctorRegistration finish_clear_all_toybox_reg("ConfirmClearAllToybox", finish_clear_all_toybox);
+
+void LLFloaterToybox::onBtnRestoreDefaults()
+{
+ LLNotificationsUtil::add("ConfirmRestoreToybox");
+}
+
+void LLFloaterToybox::onBtnClearAll()
+{
+ LLNotificationsUtil::add("ConfirmClearAllToybox");
+}
+
+BOOL LLFloaterToybox::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
+ EDragAndDropType cargo_type,
+ void* cargo_data,
+ EAcceptance* accept,
+ std::string& tooltip_msg)
+{
+ S32 local_x = x - mToolBar->getRect().mLeft;
+ S32 local_y = y - mToolBar->getRect().mBottom;
+ return mToolBar->handleDragAndDrop(local_x, local_y, mask, drop, cargo_type, cargo_data, accept, tooltip_msg);
+}
+
+void LLFloaterToybox::onToolBarButtonEnter(LLView* button)
+{
+ std::string suffix = "";
+
+ LLCommandId commandId(button->getName());
+ LLCommand* command = LLCommandManager::instance().getCommand(commandId);
+
+ if (command)
+ {
+ S32 command_loc = gToolBarView->hasCommand(commandId);
+
+ switch(command_loc)
+ {
+ case LLToolBarView::TOOLBAR_BOTTOM: suffix = LLTrans::getString("Toolbar_Bottom_Tooltip"); break;
+ case LLToolBarView::TOOLBAR_LEFT: suffix = LLTrans::getString("Toolbar_Left_Tooltip"); break;
+ case LLToolBarView::TOOLBAR_RIGHT: suffix = LLTrans::getString("Toolbar_Right_Tooltip"); break;
+
+ default:
+ break;
+ }
+ }
+
+ mToolBar->setTooltipButtonSuffix(suffix);
+}
+
+
+// eof
diff --git a/indra/newview/llfloatertoybox.h b/indra/newview/llfloatertoybox.h
new file mode 100644
index 0000000000..10aee0e6f5
--- /dev/null
+++ b/indra/newview/llfloatertoybox.h
@@ -0,0 +1,62 @@
+/**
+ * @file llfloatertoybox.h
+ * @brief The toybox for flexibilizing the UI.
+ *
+ * $LicenseInfo:firstyear=2002&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLFLOATERTOYBOX_H
+#define LL_LLFLOATERTOYBOX_H
+
+#include "llfloater.h"
+
+
+class LLButton;
+class LLToolBar;
+
+
+class LLFloaterToybox : public LLFloater
+{
+public:
+ LLFloaterToybox(const LLSD& key);
+ virtual ~LLFloaterToybox();
+
+ // virtuals
+ BOOL postBuild();
+ void draw();
+ /*virtual*/ BOOL handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
+ EDragAndDropType cargo_type,
+ void* cargo_data,
+ EAcceptance* accept,
+ std::string& tooltip_msg);
+
+protected:
+ void onBtnClearAll();
+ void onBtnRestoreDefaults();
+
+ void onToolBarButtonEnter(LLView* button);
+
+public:
+ LLToolBar * mToolBar;
+};
+
+#endif // LL_LLFLOATERTOYBOX_H
diff --git a/indra/newview/llfloatertranslationsettings.cpp b/indra/newview/llfloatertranslationsettings.cpp
new file mode 100644
index 0000000000..428a02e9f0
--- /dev/null
+++ b/indra/newview/llfloatertranslationsettings.cpp
@@ -0,0 +1,298 @@
+/**
+ * @file llfloatertranslationsettings.cpp
+ * @brief Machine translation settings for chat
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llfloatertranslationsettings.h"
+
+// Viewer includes
+#include "llnearbychatbar.h"
+#include "lltranslate.h"
+#include "llviewercontrol.h" // for gSavedSettings
+
+// Linden library includes
+#include "llbutton.h"
+#include "llcheckboxctrl.h"
+#include "llcombobox.h"
+#include "llfloaterreg.h"
+#include "lllineeditor.h"
+#include "llnotificationsutil.h"
+#include "llradiogroup.h"
+
+class EnteredKeyVerifier : public LLTranslate::KeyVerificationReceiver
+{
+public:
+ EnteredKeyVerifier(LLTranslate::EService service, bool alert)
+ : LLTranslate::KeyVerificationReceiver(service)
+ , mAlert(alert)
+ {
+ }
+
+private:
+ /*virtual*/ void setVerificationStatus(bool ok)
+ {
+ LLFloaterTranslationSettings* floater =
+ LLFloaterReg::getTypedInstance<LLFloaterTranslationSettings>("prefs_translation");
+
+ if (!floater)
+ {
+ llwarns << "Cannot find translation settings floater" << llendl;
+ return;
+ }
+
+ switch (getService())
+ {
+ case LLTranslate::SERVICE_BING:
+ floater->setBingVerified(ok, mAlert);
+ break;
+ case LLTranslate::SERVICE_GOOGLE:
+ floater->setGoogleVerified(ok, mAlert);
+ break;
+ }
+ }
+
+ bool mAlert;
+};
+
+LLFloaterTranslationSettings::LLFloaterTranslationSettings(const LLSD& key)
+: LLFloater(key)
+, mMachineTranslationCB(NULL)
+, mLanguageCombo(NULL)
+, mTranslationServiceRadioGroup(NULL)
+, mBingAPIKeyEditor(NULL)
+, mGoogleAPIKeyEditor(NULL)
+, mBingVerifyBtn(NULL)
+, mGoogleVerifyBtn(NULL)
+, mOKBtn(NULL)
+, mBingKeyVerified(false)
+, mGoogleKeyVerified(false)
+{
+}
+
+// virtual
+BOOL LLFloaterTranslationSettings::postBuild()
+{
+ mMachineTranslationCB = getChild<LLCheckBoxCtrl>("translate_chat_checkbox");
+ mLanguageCombo = getChild<LLComboBox>("translate_language_combo");
+ mTranslationServiceRadioGroup = getChild<LLRadioGroup>("translation_service_rg");
+ mBingAPIKeyEditor = getChild<LLLineEditor>("bing_api_key");
+ mGoogleAPIKeyEditor = getChild<LLLineEditor>("google_api_key");
+ mBingVerifyBtn = getChild<LLButton>("verify_bing_api_key_btn");
+ mGoogleVerifyBtn = getChild<LLButton>("verify_google_api_key_btn");
+ mOKBtn = getChild<LLButton>("ok_btn");
+
+ mMachineTranslationCB->setCommitCallback(boost::bind(&LLFloaterTranslationSettings::updateControlsEnabledState, this));
+ mTranslationServiceRadioGroup->setCommitCallback(boost::bind(&LLFloaterTranslationSettings::updateControlsEnabledState, this));
+ mOKBtn->setClickedCallback(boost::bind(&LLFloaterTranslationSettings::onBtnOK, this));
+ getChild<LLButton>("cancel_btn")->setClickedCallback(boost::bind(&LLFloater::closeFloater, this, false));
+ mBingVerifyBtn->setClickedCallback(boost::bind(&LLFloaterTranslationSettings::onBtnBingVerify, this));
+ mGoogleVerifyBtn->setClickedCallback(boost::bind(&LLFloaterTranslationSettings::onBtnGoogleVerify, this));
+
+ mBingAPIKeyEditor->setFocusReceivedCallback(boost::bind(&LLFloaterTranslationSettings::onEditorFocused, this, _1));
+ mBingAPIKeyEditor->setKeystrokeCallback(boost::bind(&LLFloaterTranslationSettings::onBingKeyEdited, this), NULL);
+ mGoogleAPIKeyEditor->setFocusReceivedCallback(boost::bind(&LLFloaterTranslationSettings::onEditorFocused, this, _1));
+ mGoogleAPIKeyEditor->setKeystrokeCallback(boost::bind(&LLFloaterTranslationSettings::onGoogleKeyEdited, this), NULL);
+
+ center();
+ return TRUE;
+}
+
+// virtual
+void LLFloaterTranslationSettings::onOpen(const LLSD& key)
+{
+ mMachineTranslationCB->setValue(gSavedSettings.getBOOL("TranslateChat"));
+ mLanguageCombo->setSelectedByValue(gSavedSettings.getString("TranslateLanguage"), TRUE);
+ mTranslationServiceRadioGroup->setSelectedByValue(gSavedSettings.getString("TranslationService"), TRUE);
+
+ std::string bing_key = gSavedSettings.getString("BingTranslateAPIKey");
+ if (!bing_key.empty())
+ {
+ mBingAPIKeyEditor->setText(bing_key);
+ mBingAPIKeyEditor->setTentative(FALSE);
+ verifyKey(LLTranslate::SERVICE_BING, bing_key, false);
+ }
+ else
+ {
+ mBingAPIKeyEditor->setTentative(TRUE);
+ mBingKeyVerified = FALSE;
+ }
+
+ std::string google_key = gSavedSettings.getString("GoogleTranslateAPIKey");
+ if (!google_key.empty())
+ {
+ mGoogleAPIKeyEditor->setText(google_key);
+ mGoogleAPIKeyEditor->setTentative(FALSE);
+ verifyKey(LLTranslate::SERVICE_GOOGLE, google_key, false);
+ }
+ else
+ {
+ mGoogleAPIKeyEditor->setTentative(TRUE);
+ mGoogleKeyVerified = FALSE;
+ }
+
+ updateControlsEnabledState();
+}
+
+void LLFloaterTranslationSettings::setBingVerified(bool ok, bool alert)
+{
+ if (alert)
+ {
+ showAlert(ok ? "bing_api_key_verified" : "bing_api_key_not_verified");
+ }
+
+ mBingKeyVerified = ok;
+ updateControlsEnabledState();
+}
+
+void LLFloaterTranslationSettings::setGoogleVerified(bool ok, bool alert)
+{
+ if (alert)
+ {
+ showAlert(ok ? "google_api_key_verified" : "google_api_key_not_verified");
+ }
+
+ mGoogleKeyVerified = ok;
+ updateControlsEnabledState();
+}
+
+std::string LLFloaterTranslationSettings::getSelectedService() const
+{
+ return mTranslationServiceRadioGroup->getSelectedValue().asString();
+}
+
+std::string LLFloaterTranslationSettings::getEnteredBingKey() const
+{
+ return mBingAPIKeyEditor->getTentative() ? LLStringUtil::null : mBingAPIKeyEditor->getText();
+}
+
+std::string LLFloaterTranslationSettings::getEnteredGoogleKey() const
+{
+ return mGoogleAPIKeyEditor->getTentative() ? LLStringUtil::null : mGoogleAPIKeyEditor->getText();
+}
+
+void LLFloaterTranslationSettings::showAlert(const std::string& msg_name) const
+{
+ LLSD args;
+ args["MESSAGE"] = getString(msg_name);
+ LLNotificationsUtil::add("GenericAlert", args);
+}
+
+void LLFloaterTranslationSettings::updateControlsEnabledState()
+{
+ // Enable/disable controls based on the checkbox value.
+ bool on = mMachineTranslationCB->getValue().asBoolean();
+ std::string service = getSelectedService();
+ bool bing_selected = service == "bing";
+ bool google_selected = service == "google";
+
+ mTranslationServiceRadioGroup->setEnabled(on);
+ mLanguageCombo->setEnabled(on);
+
+ getChild<LLTextBox>("bing_api_key_label")->setEnabled(on);
+ mBingAPIKeyEditor->setEnabled(on);
+
+ getChild<LLTextBox>("google_api_key_label")->setEnabled(on);
+ mGoogleAPIKeyEditor->setEnabled(on);
+
+ mBingAPIKeyEditor->setEnabled(on && bing_selected);
+ mGoogleAPIKeyEditor->setEnabled(on && google_selected);
+
+ mBingVerifyBtn->setEnabled(on && bing_selected &&
+ !mBingKeyVerified && !getEnteredBingKey().empty());
+ mGoogleVerifyBtn->setEnabled(on && google_selected &&
+ !mGoogleKeyVerified && !getEnteredGoogleKey().empty());
+
+ mOKBtn->setEnabled(
+ !on || (
+ (bing_selected && mBingKeyVerified) ||
+ (google_selected && mGoogleKeyVerified)
+ ));
+}
+
+void LLFloaterTranslationSettings::verifyKey(int service, const std::string& key, bool alert)
+{
+ LLTranslate::KeyVerificationReceiverPtr receiver =
+ new EnteredKeyVerifier((LLTranslate::EService) service, alert);
+ LLTranslate::verifyKey(receiver, key);
+}
+
+void LLFloaterTranslationSettings::onEditorFocused(LLFocusableElement* control)
+{
+ LLLineEditor* editor = dynamic_cast<LLLineEditor*>(control);
+ if (editor && editor->hasTabStop()) // if enabled. getEnabled() doesn't work
+ {
+ if (editor->getTentative())
+ {
+ editor->setText(LLStringUtil::null);
+ editor->setTentative(FALSE);
+ }
+ }
+}
+
+void LLFloaterTranslationSettings::onBingKeyEdited()
+{
+ if (mBingAPIKeyEditor->isDirty())
+ {
+ setBingVerified(false, false);
+ }
+}
+
+void LLFloaterTranslationSettings::onGoogleKeyEdited()
+{
+ if (mGoogleAPIKeyEditor->isDirty())
+ {
+ setGoogleVerified(false, false);
+ }
+}
+
+void LLFloaterTranslationSettings::onBtnBingVerify()
+{
+ std::string key = getEnteredBingKey();
+ if (!key.empty())
+ {
+ verifyKey(LLTranslate::SERVICE_BING, key);
+ }
+}
+
+void LLFloaterTranslationSettings::onBtnGoogleVerify()
+{
+ std::string key = getEnteredGoogleKey();
+ if (!key.empty())
+ {
+ verifyKey(LLTranslate::SERVICE_GOOGLE, key);
+ }
+}
+
+void LLFloaterTranslationSettings::onBtnOK()
+{
+ gSavedSettings.setBOOL("TranslateChat", mMachineTranslationCB->getValue().asBoolean());
+ gSavedSettings.setString("TranslateLanguage", mLanguageCombo->getSelectedValue().asString());
+ gSavedSettings.setString("TranslationService", getSelectedService());
+ gSavedSettings.setString("BingTranslateAPIKey", getEnteredBingKey());
+ gSavedSettings.setString("GoogleTranslateAPIKey", getEnteredGoogleKey());
+ LLNearbyChatBar::getInstance()->enableTranslationCheckbox(LLTranslate::isTranslationConfigured());
+ closeFloater(false);
+}
diff --git a/indra/newview/llfloatertranslationsettings.h b/indra/newview/llfloatertranslationsettings.h
new file mode 100644
index 0000000000..9b47ad72ed
--- /dev/null
+++ b/indra/newview/llfloatertranslationsettings.h
@@ -0,0 +1,76 @@
+/**
+ * @file llfloatertranslationsettings.h
+ * @brief Machine translation settings for chat
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLFLOATERTRANSLATIONSETTINGS_H
+#define LL_LLFLOATERTRANSLATIONSETTINGS_H
+
+#include "llfloater.h"
+
+class LLButton;
+class LLCheckBoxCtrl;
+class LLComboBox;
+class LLLineEditor;
+class LLRadioGroup;
+
+class LLFloaterTranslationSettings : public LLFloater
+{
+public:
+ LLFloaterTranslationSettings(const LLSD& key);
+ /*virtual*/ BOOL postBuild();
+ /*virtual*/ void onOpen(const LLSD& key);
+
+ void setBingVerified(bool ok, bool alert);
+ void setGoogleVerified(bool ok, bool alert);
+
+private:
+ std::string getSelectedService() const;
+ std::string getEnteredBingKey() const;
+ std::string getEnteredGoogleKey() const;
+ void showAlert(const std::string& msg_name) const;
+ void updateControlsEnabledState();
+ void verifyKey(int service, const std::string& key, bool alert = true);
+
+ void onEditorFocused(LLFocusableElement* control);
+ void onBingKeyEdited();
+ void onGoogleKeyEdited();
+ void onBtnBingVerify();
+ void onBtnGoogleVerify();
+ void onBtnOK();
+
+ LLCheckBoxCtrl* mMachineTranslationCB;
+ LLComboBox* mLanguageCombo;
+ LLLineEditor* mBingAPIKeyEditor;
+ LLLineEditor* mGoogleAPIKeyEditor;
+ LLRadioGroup* mTranslationServiceRadioGroup;
+ LLButton* mBingVerifyBtn;
+ LLButton* mGoogleVerifyBtn;
+ LLButton* mOKBtn;
+
+ bool mBingKeyVerified;
+ bool mGoogleKeyVerified;
+};
+
+#endif // LL_LLFLOATERTRANSLATIONSETTINGS_H
diff --git a/indra/newview/llfloateruipreview.cpp b/indra/newview/llfloateruipreview.cpp
index 4c9c4cb154..d741b5b133 100644
--- a/indra/newview/llfloateruipreview.cpp
+++ b/indra/newview/llfloateruipreview.cpp
@@ -915,14 +915,16 @@ void LLFloaterUIPreview::displayFloater(BOOL click, S32 ID, bool save)
{
panel->buildFromFile(path); // build it
LLRect new_size = panel->getRect(); // get its rectangle
- panel->setOrigin(0,0); // reset its origin point so it's not offset by -left or other XUI attributes
+ panel->setOrigin(2,2); // reset its origin point so it's not offset by -left or other XUI attributes
(*floaterp)->setTitle(path); // use the file name as its title, since panels have no guaranteed meaningful name attribute
panel->setUseBoundingRect(TRUE); // enable the use of its outer bounding rect (normally disabled because it's O(n) on the number of sub-elements)
panel->updateBoundingRect(); // update bounding rect
LLRect bounding_rect = panel->getBoundingRect(); // get the bounding rect
LLRect new_rect = panel->getRect(); // get the panel's rect
new_rect.unionWith(bounding_rect); // union them to make sure we get the biggest one possible
- (*floaterp)->reshape(new_rect.getWidth(), new_rect.getHeight() + floater_header_size); // reshape floater to match the union rect's dimensions
+ LLRect floater_rect = new_rect;
+ floater_rect.stretch(4, 4);
+ (*floaterp)->reshape(floater_rect.getWidth(), floater_rect.getHeight() + floater_header_size); // reshape floater to match the union rect's dimensions
panel->reshape(new_rect.getWidth(), new_rect.getHeight()); // reshape panel to match the union rect's dimensions as well (both are needed)
(*floaterp)->addChild(panel); // add panel as child
(*floaterp)->openFloater(); // open floater (needed?)
diff --git a/indra/newview/llfloaterwebcontent.cpp b/indra/newview/llfloaterwebcontent.cpp
index 2c9a736aff..3b5c3663fb 100644
--- a/indra/newview/llfloaterwebcontent.cpp
+++ b/indra/newview/llfloaterwebcontent.cpp
@@ -48,13 +48,24 @@ LLFloaterWebContent::_Params::_Params()
show_chrome("show_chrome", true),
allow_address_entry("allow_address_entry", true),
preferred_media_size("preferred_media_size"),
- trusted_content("trusted_content", false)
+ trusted_content("trusted_content", false),
+ show_page_title("show_page_title", true)
{}
LLFloaterWebContent::LLFloaterWebContent( const Params& params )
: LLFloater( params ),
LLInstanceTracker<LLFloaterWebContent, std::string>(params.id()),
- mUUID(params.id())
+ mWebBrowser(NULL),
+ mAddressCombo(NULL),
+ mSecureLockIcon(NULL),
+ mStatusBarText(NULL),
+ mStatusBarProgress(NULL),
+ mBtnBack(NULL),
+ mBtnForward(NULL),
+ mBtnReload(NULL),
+ mBtnStop(NULL),
+ mUUID(params.id()),
+ mShowPageTitle(params.show_page_title)
{
mCommitCallbackRegistrar.add( "WebContent.Back", boost::bind( &LLFloaterWebContent::onClickBack, this ));
mCommitCallbackRegistrar.add( "WebContent.Forward", boost::bind( &LLFloaterWebContent::onClickForward, this ));
@@ -72,11 +83,16 @@ BOOL LLFloaterWebContent::postBuild()
mStatusBarText = getChild< LLTextBox >( "statusbartext" );
mStatusBarProgress = getChild<LLProgressBar>("statusbarprogress" );
+ mBtnBack = getChildView( "back" );
+ mBtnForward = getChildView( "forward" );
+ mBtnReload = getChildView( "reload" );
+ mBtnStop = getChildView( "stop" );
+
// observe browser events
mWebBrowser->addObserver( this );
// these buttons are always enabled
- getChildView("reload")->setEnabled( true );
+ mBtnReload->setEnabled( true );
getChildView("popexternal")->setEnabled( true );
// cache image for secure browsing
@@ -88,20 +104,6 @@ BOOL LLFloaterWebContent::postBuild()
return TRUE;
}
-bool LLFloaterWebContent::matchesKey(const LLSD& key)
-{
- LLUUID id = key["id"];
- if (id.notNull())
- {
- return id == mKey["id"].asUUID();
- }
- else
- {
- return key["target"].asString() == mKey["target"].asString();
- }
-}
-
-
void LLFloaterWebContent::initializeURLHistory()
{
// start with an empty list
@@ -123,56 +125,31 @@ void LLFloaterWebContent::initializeURLHistory()
}
}
-//static
-LLFloater* LLFloaterWebContent::create( Params p)
+bool LLFloaterWebContent::matchesKey(const LLSD& key)
{
- lldebugs << "url = " << p.url() << ", target = " << p.target() << ", uuid = " << p.id() << llendl;
-
- if (!p.id.isProvided())
+ Params p(mKey);
+ Params other_p(key);
+ if (!other_p.target().empty() && other_p.target() != "_blank")
{
- p.id = LLUUID::generateNewID().asString();
+ return other_p.target() == p.target();
}
-
- if(p.target().empty() || p.target() == "_blank")
- {
- p.target = p.id();
- }
-
- S32 browser_window_limit = gSavedSettings.getS32("WebContentWindowLimit");
-
- LLSD sd;
- sd["target"] = p.target;
- if(LLFloaterReg::findInstance(p.window_class, sd) != NULL)
- {
- // There's already a web browser for this tag, so we won't be opening a new window.
- }
- else if(browser_window_limit != 0)
+ else
{
- // showInstance will open a new window. Figure out how many web browsers are already open,
- // and close the least recently opened one if this will put us over the limit.
-
- LLFloaterReg::const_instance_list_t &instances = LLFloaterReg::getFloaterList(p.window_class);
- lldebugs << "total instance count is " << instances.size() << llendl;
-
- for(LLFloaterReg::const_instance_list_t::const_iterator iter = instances.begin(); iter != instances.end(); iter++)
- {
- lldebugs << " " << (*iter)->getKey()["target"] << llendl;
- }
-
- if(instances.size() >= (size_t)browser_window_limit)
- {
- // Destroy the least recently opened instance
- (*instances.begin())->closeFloater();
- }
+ return other_p.id() == p.id();
}
+}
- return LLFloaterReg::showInstance(p.window_class, p);
+//static
+LLFloater* LLFloaterWebContent::create( Params p)
+{
+ preCreate(p);
+ return new LLFloaterWebContent(p);
}
//static
void LLFloaterWebContent::closeRequest(const std::string &uuid)
{
- LLFloaterWebContent* floaterp = getInstance(uuid);
+ LLFloaterWebContent* floaterp = instance_tracker_t::getInstance(uuid);
if (floaterp)
{
floaterp->closeFloater(false);
@@ -182,7 +159,7 @@ void LLFloaterWebContent::closeRequest(const std::string &uuid)
//static
void LLFloaterWebContent::geometryChanged(const std::string &uuid, S32 x, S32 y, S32 width, S32 height)
{
- LLFloaterWebContent* floaterp = getInstance(uuid);
+ LLFloaterWebContent* floaterp = instance_tracker_t::getInstance(uuid);
if (floaterp)
{
floaterp->geometryChanged(x, y, width, height);
@@ -216,6 +193,43 @@ void LLFloaterWebContent::geometryChanged(S32 x, S32 y, S32 width, S32 height)
setShape(new_rect);
}
+// static
+void LLFloaterWebContent::preCreate(LLFloaterWebContent::Params& p)
+{
+ lldebugs << "url = " << p.url() << ", target = " << p.target() << ", uuid = " << p.id() << llendl;
+
+ if (!p.id.isProvided())
+ {
+ p.id = LLUUID::generateNewID().asString();
+ }
+
+ if(p.target().empty() || p.target() == "_blank")
+ {
+ p.target = p.id();
+ }
+
+ S32 browser_window_limit = gSavedSettings.getS32("WebContentWindowLimit");
+ if(browser_window_limit != 0)
+ {
+ // showInstance will open a new window. Figure out how many web browsers are already open,
+ // and close the least recently opened one if this will put us over the limit.
+
+ LLFloaterReg::const_instance_list_t &instances = LLFloaterReg::getFloaterList(p.window_class);
+ lldebugs << "total instance count is " << instances.size() << llendl;
+
+ for(LLFloaterReg::const_instance_list_t::const_iterator iter = instances.begin(); iter != instances.end(); iter++)
+ {
+ lldebugs << " " << (*iter)->getKey()["target"] << llendl;
+ }
+
+ if(instances.size() >= (size_t)browser_window_limit)
+ {
+ // Destroy the least recently opened instance
+ (*instances.begin())->closeFloater();
+ }
+ }
+}
+
void LLFloaterWebContent::open_media(const Params& p)
{
// Specifying a mime type of text/html here causes the plugin system to skip the MIME type probe and just open a browser plugin.
@@ -281,8 +295,8 @@ void LLFloaterWebContent::onClose(bool app_quitting)
void LLFloaterWebContent::draw()
{
// this is asynchronous so we need to keep checking
- getChildView( "back" )->setEnabled( mWebBrowser->canNavigateBack() );
- getChildView( "forward" )->setEnabled( mWebBrowser->canNavigateForward() );
+ mBtnBack->setEnabled( mWebBrowser->canNavigateBack() );
+ mBtnForward->setEnabled( mWebBrowser->canNavigateForward() );
LLFloater::draw();
}
@@ -302,12 +316,12 @@ void LLFloaterWebContent::handleMediaEvent(LLPluginClassMedia* self, EMediaEvent
else if(event == MEDIA_EVENT_NAVIGATE_BEGIN)
{
// flags are sent with this event
- getChildView("back")->setEnabled( self->getHistoryBackAvailable() );
- getChildView("forward")->setEnabled( self->getHistoryForwardAvailable() );
+ mBtnBack->setEnabled( self->getHistoryBackAvailable() );
+ mBtnForward->setEnabled( self->getHistoryForwardAvailable() );
// toggle visibility of these buttons based on browser state
- getChildView("reload")->setVisible( false );
- getChildView("stop")->setVisible( true );
+ mBtnReload->setVisible( false );
+ mBtnStop->setVisible( true );
// turn "on" progress bar now we're about to start loading
mStatusBarProgress->setVisible( true );
@@ -315,12 +329,12 @@ void LLFloaterWebContent::handleMediaEvent(LLPluginClassMedia* self, EMediaEvent
else if(event == MEDIA_EVENT_NAVIGATE_COMPLETE)
{
// flags are sent with this event
- getChildView("back")->setEnabled( self->getHistoryBackAvailable() );
- getChildView("forward")->setEnabled( self->getHistoryForwardAvailable() );
+ mBtnBack->setEnabled( self->getHistoryBackAvailable() );
+ mBtnForward->setEnabled( self->getHistoryForwardAvailable() );
// toggle visibility of these buttons based on browser state
- getChildView("reload")->setVisible( true );
- getChildView("stop")->setVisible( false );
+ mBtnReload->setVisible( true );
+ mBtnStop->setVisible( false );
// turn "off" progress bar now we're loaded
mStatusBarProgress->setVisible( false );
@@ -366,10 +380,13 @@ void LLFloaterWebContent::handleMediaEvent(LLPluginClassMedia* self, EMediaEvent
{
std::string page_title = self->getMediaName();
// simulate browser behavior - title is empty, use the current URL
- if ( page_title.length() > 0 )
- setTitle( page_title );
- else
- setTitle( mCurrentURL );
+ if (mShowPageTitle)
+ {
+ if ( page_title.length() > 0 )
+ setTitle( page_title );
+ else
+ setTitle( mCurrentURL );
+ }
}
else if(event == MEDIA_EVENT_LINK_HOVERED )
{
@@ -423,8 +440,8 @@ void LLFloaterWebContent::onClickStop()
// still should happen when we catch the navigate complete event
// but sometimes (don't know why) that event isn't sent from Qt
// and we ghetto a point where the stop button stays active.
- getChildView("reload")->setVisible( true );
- getChildView("stop")->setVisible( false );
+ mBtnReload->setVisible( true );
+ mBtnStop->setVisible( false );
}
void LLFloaterWebContent::onEnterAddress()
diff --git a/indra/newview/llfloaterwebcontent.h b/indra/newview/llfloaterwebcontent.h
index 36e214b7a9..cfc87e9015 100644
--- a/indra/newview/llfloaterwebcontent.h
+++ b/indra/newview/llfloaterwebcontent.h
@@ -43,6 +43,7 @@ class LLFloaterWebContent :
public LLInstanceTracker<LLFloaterWebContent, std::string>
{
public:
+ typedef LLInstanceTracker<LLFloaterWebContent, std::string> instance_tracker_t;
LOG_CLASS(LLFloaterWebContent);
struct _Params : public LLInitParam::Block<_Params>
@@ -53,7 +54,8 @@ public:
id;
Optional<bool> show_chrome,
allow_address_entry,
- trusted_content;
+ trusted_content,
+ show_page_title;
Optional<LLRect> preferred_media_size;
_Params();
@@ -88,16 +90,24 @@ protected:
void onEnterAddress();
void onPopExternal();
+ static void preCreate(Params& p);
void open_media(const Params& );
void set_current_url(const std::string& url);
- LLMediaCtrl* mWebBrowser;
- LLComboBox* mAddressCombo;
- LLIconCtrl *mSecureLockIcon;
- LLTextBox* mStatusBarText;
- LLProgressBar* mStatusBarProgress;
- std::string mCurrentURL;
- std::string mUUID;
+ LLMediaCtrl* mWebBrowser;
+ LLComboBox* mAddressCombo;
+ LLIconCtrl* mSecureLockIcon;
+ LLTextBox* mStatusBarText;
+ LLProgressBar* mStatusBarProgress;
+
+ LLView* mBtnBack;
+ LLView* mBtnForward;
+ LLView* mBtnReload;
+ LLView* mBtnStop;
+
+ std::string mCurrentURL;
+ std::string mUUID;
+ bool mShowPageTitle;
};
#endif // LL_LLFLOATERWEBCONTENT_H
diff --git a/indra/newview/llfloaterwebprofile.cpp b/indra/newview/llfloaterwebprofile.cpp
new file mode 100644
index 0000000000..c41f6f148f
--- /dev/null
+++ b/indra/newview/llfloaterwebprofile.cpp
@@ -0,0 +1,79 @@
+/**
+ * @file llfloaterwebprofile.cpp
+ * @brief Avatar profile floater.
+ *
+ * $LicenseInfo:firstyear=2009&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llfloaterwebprofile.h"
+
+#include "llviewercontrol.h"
+
+LLFloaterWebProfile::LLFloaterWebProfile(const Params& key) :
+ LLFloaterWebContent(key)
+{
+}
+
+void LLFloaterWebProfile::onOpen(const LLSD& key)
+{
+ Params p(key);
+ p.show_chrome(false).
+ window_class("profile");
+ LLFloaterWebContent::onOpen(p);
+ applyPreferredRect();
+}
+
+// virtual
+void LLFloaterWebProfile::handleReshape(const LLRect& new_rect, bool by_user)
+{
+ lldebugs << "handleReshape: " << new_rect << llendl;
+
+ if (by_user && !isMinimized())
+ {
+ lldebugs << "Storing new rect" << llendl;
+ gSavedSettings.setRect("WebProfileFloaterRect", new_rect);
+ }
+
+ LLFloaterWebContent::handleReshape(new_rect, by_user);
+}
+
+LLFloater* LLFloaterWebProfile::create(const LLSD& key)
+{
+ LLFloaterWebContent::Params p(key);
+ preCreate(p);
+ return new LLFloaterWebProfile(p);
+}
+
+void LLFloaterWebProfile::applyPreferredRect()
+{
+ const LLRect preferred_rect = gSavedSettings.getRect("WebProfileFloaterRect");
+ lldebugs << "Applying preferred rect: " << preferred_rect << llendl;
+
+ // Don't override position that may have been set by floater stacking code.
+ LLRect new_rect = getRect();
+ new_rect.setLeftTopAndSize(
+ new_rect.mLeft, new_rect.mTop,
+ preferred_rect.getWidth(), preferred_rect.getHeight());
+ setShape(new_rect);
+}
diff --git a/indra/newview/llfloaterwebprofile.h b/indra/newview/llfloaterwebprofile.h
new file mode 100644
index 0000000000..4c355e401b
--- /dev/null
+++ b/indra/newview/llfloaterwebprofile.h
@@ -0,0 +1,59 @@
+/**
+ * @file llfloaterwebprofile.h
+ * @brief Avatar profile floater.
+ *
+ * $LicenseInfo:firstyear=2009&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLFLOATERWEBPROFILE_H
+#define LL_LLFLOATERWEBPROFILE_H
+
+#include "llfloaterwebcontent.h"
+#include "llviewermediaobserver.h"
+
+#include <string>
+
+class LLMediaCtrl;
+
+/**
+ * Displays avatar profile web page.
+ */
+class LLFloaterWebProfile
+: public LLFloaterWebContent
+{
+ LOG_CLASS(LLFloaterWebProfile);
+public:
+ typedef LLFloaterWebContent::Params Params;
+
+ LLFloaterWebProfile(const Params& key);
+
+ /*virtual*/ void onOpen(const LLSD& key);
+ /*virtual*/ void handleReshape(const LLRect& new_rect, bool by_user = false);
+
+ static LLFloater* create(const LLSD& key);
+
+private:
+ void applyPreferredRect();
+};
+
+#endif // LL_LLFLOATERWEBPROFILE_H
+
diff --git a/indra/newview/llfloaterwindowsize.cpp b/indra/newview/llfloaterwindowsize.cpp
index a70f2af11a..ec161018b8 100644
--- a/indra/newview/llfloaterwindowsize.cpp
+++ b/indra/newview/llfloaterwindowsize.cpp
@@ -58,33 +58,12 @@ bool extractWindowSizeFromString(const std::string& instr, U32 *width, U32 *heig
}
-///----------------------------------------------------------------------------
-/// Class LLFloaterWindowSize
-///----------------------------------------------------------------------------
-class LLFloaterWindowSize
-: public LLFloater
-{
- friend class LLFloaterReg;
-private:
- LLFloaterWindowSize(const LLSD& key);
- virtual ~LLFloaterWindowSize();
-
-public:
- /*virtual*/ BOOL postBuild();
- void initWindowSizeControls();
- void onClickSet();
- void onClickCancel();
-};
-
-
LLFloaterWindowSize::LLFloaterWindowSize(const LLSD& key)
: LLFloater(key)
-{
-}
+{}
LLFloaterWindowSize::~LLFloaterWindowSize()
-{
-}
+{}
BOOL LLFloaterWindowSize::postBuild()
{
@@ -145,13 +124,3 @@ void LLFloaterWindowSize::onClickCancel()
{
closeFloater();
}
-
-///----------------------------------------------------------------------------
-/// LLFloaterWindowSizeUtil
-///----------------------------------------------------------------------------
-void LLFloaterWindowSizeUtil::registerFloater()
-{
- LLFloaterReg::add("window_size", "floater_window_size.xml",
- &LLFloaterReg::build<LLFloaterWindowSize>);
-
-}
diff --git a/indra/newview/llfloaterwindowsize.h b/indra/newview/llfloaterwindowsize.h
index 40f1a25bb3..a71e5e273c 100644
--- a/indra/newview/llfloaterwindowsize.h
+++ b/indra/newview/llfloaterwindowsize.h
@@ -26,10 +26,24 @@
#ifndef LLFLOATERWINDOWSIZE_H
#define LLFLOATERWINDOWSIZE_H
-// Allow user to set the window size for filming tutorials, machinima, etc
-namespace LLFloaterWindowSizeUtil
+#include "llfloater.h"
+
+///----------------------------------------------------------------------------
+/// Class LLFloaterWindowSize
+///----------------------------------------------------------------------------
+class LLFloaterWindowSize
+ : public LLFloater
{
- void registerFloater();
-}
+ friend class LLFloaterReg;
+private:
+ LLFloaterWindowSize(const LLSD& key);
+ virtual ~LLFloaterWindowSize();
+
+public:
+ /*virtual*/ BOOL postBuild();
+ void initWindowSizeControls();
+ void onClickSet();
+ void onClickCancel();
+};
#endif
diff --git a/indra/newview/llfolderview.cpp b/indra/newview/llfolderview.cpp
index 8b72d83830..e0d7d67f7d 100644
--- a/indra/newview/llfolderview.cpp
+++ b/indra/newview/llfolderview.cpp
@@ -172,6 +172,7 @@ LLFolderView::Params::Params()
title("title"),
use_label_suffix("use_label_suffix"),
allow_multiselect("allow_multiselect", true),
+ show_empty_message("show_empty_message", true),
show_load_status("show_load_status", true),
use_ellipses("use_ellipses", false)
{
@@ -185,6 +186,7 @@ LLFolderView::LLFolderView(const Params& p)
mScrollContainer( NULL ),
mPopupMenuHandle(),
mAllowMultiSelect(p.allow_multiselect),
+ mShowEmptyMessage(p.show_empty_message),
mShowFolderHierarchy(FALSE),
mSourceID(p.task_id),
mRenameItem( NULL ),
@@ -299,7 +301,7 @@ LLFolderView::~LLFolderView( void )
mAutoOpenItems.removeAllNodes();
gIdleCallbacks.deleteFunction(idle, this);
- LLView::deleteViewByHandle(mPopupMenuHandle);
+ if (mPopupMenuHandle.get()) mPopupMenuHandle.get()->die();
mAutoOpenItems.removeAllNodes();
clearSelection();
@@ -349,10 +351,6 @@ BOOL LLFolderView::addFolder( LLFolderViewFolder* folder)
{
mFolders.insert(mFolders.begin(), folder);
}
- if (folder->numSelected())
- {
- recursiveIncrementNumDescendantsSelected(folder->numSelected());
- }
folder->setShowLoadStatus(mShowLoadStatus);
folder->setOrigin(0, 0);
folder->reshape(getRect().getWidth(), 0);
@@ -694,26 +692,6 @@ BOOL LLFolderView::changeSelection(LLFolderViewItem* selection, BOOL selected)
return rv;
}
-void LLFolderView::extendSelection(LLFolderViewItem* selection, LLFolderViewItem* last_selected, LLDynamicArray<LLFolderViewItem*>& items)
-{
- // now store resulting selection
- if (mAllowMultiSelect)
- {
- LLFolderViewItem *cur_selection = getCurSelectedItem();
- LLFolderViewFolder::extendSelection(selection, cur_selection, items);
- for (S32 i = 0; i < items.count(); i++)
- {
- addToSelectionList(items[i]);
- }
- }
- else
- {
- setSelection(selection, FALSE, FALSE);
- }
-
- mSignalSelectCallback = SIGNAL_KEYBOARD_FOCUS;
-}
-
static LLFastTimer::DeclareTimer FTM_SANITIZE_SELECTION("Sanitize Selection");
void LLFolderView::sanitizeSelection()
{
@@ -932,7 +910,7 @@ void LLFolderView::draw()
mStatusText.clear();
mStatusTextBox->setVisible( FALSE );
}
- else
+ else if (mShowEmptyMessage)
{
if (LLInventoryModelBackgroundFetch::instance().backgroundFetchActive() || mCompletedFilterGeneration < mFilter->getMinRequiredGeneration())
{
@@ -966,7 +944,6 @@ void LLFolderView::draw()
// See EXT-7564, EXT-7047.
arrangeFromRoot();
}
-
}
// skip over LLFolderViewFolder::draw since we don't want the folder icon, label,
@@ -1058,7 +1035,7 @@ void LLFolderView::onItemsRemovalConfirmation(const LLSD& notification, const LL
for (item_it = mSelectedItems.begin(); item_it != mSelectedItems.end(); ++item_it)
{
item = *item_it;
- if(item->isRemovable())
+ if (item && item->isRemovable())
{
items.push_back(item);
}
@@ -1222,7 +1199,9 @@ void LLFolderView::changeType(LLInventoryModel *model, LLFolderType::EType new_f
void LLFolderView::autoOpenItem( LLFolderViewFolder* item )
{
- if (mAutoOpenItems.check() == item || mAutoOpenItems.getDepth() >= (U32)AUTO_OPEN_STACK_DEPTH)
+ if ((mAutoOpenItems.check() == item) ||
+ (mAutoOpenItems.getDepth() >= (U32)AUTO_OPEN_STACK_DEPTH) ||
+ item->isOpen())
{
return;
}
@@ -1723,7 +1702,7 @@ BOOL LLFolderView::handleUnicodeCharHere(llwchar uni_char)
}
BOOL handled = FALSE;
- if (gFocusMgr.childHasKeyboardFocus(getRoot()))
+ if (mParentPanel->hasFocus())
{
// SL-51858: Key presses are not being passed to the Popup menu.
// A proper fix is non-trivial so instead just close the menu.
@@ -1945,9 +1924,9 @@ BOOL LLFolderView::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
if (!handled)
{
if (getListener()->getUUID().notNull())
- {
- handled = LLFolderViewFolder::handleDragAndDrop(x, y, mask, drop, cargo_type, cargo_data, accept, tooltip_msg);
- }
+ {
+ handled = LLFolderViewFolder::handleDragAndDrop(x, y, mask, drop, cargo_type, cargo_data, accept, tooltip_msg);
+ }
else
{
if (!mFolders.empty())
@@ -1969,7 +1948,7 @@ BOOL LLFolderView::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
void LLFolderView::deleteAllChildren()
{
closeRenamer();
- LLView::deleteViewByHandle(mPopupMenuHandle);
+ if (mPopupMenuHandle.get()) mPopupMenuHandle.get()->die();
mPopupMenuHandle = LLHandle<LLView>();
mScrollContainer = NULL;
mRenameItem = NULL;
diff --git a/indra/newview/llfolderview.h b/indra/newview/llfolderview.h
index 8af01e9102..1d018b5e6a 100644
--- a/indra/newview/llfolderview.h
+++ b/indra/newview/llfolderview.h
@@ -75,6 +75,7 @@ public:
Optional<std::string> title;
Optional<bool> use_label_suffix,
allow_multiselect,
+ show_empty_message,
show_load_status,
use_ellipses;
@@ -106,6 +107,8 @@ public:
U32 getSortOrder() const;
BOOL isFilterModified();
+ bool getAllowMultiSelect() { return mAllowMultiSelect; }
+
// Close all folders in the view
void closeAllFolders();
void openTopLevelFolders();
@@ -141,8 +144,6 @@ public:
// children, and keeps track of selected objects.
virtual BOOL changeSelection(LLFolderViewItem* selection, BOOL selected);
- virtual void extendSelection(LLFolderViewItem* selection, LLFolderViewItem* last_selected, LLDynamicArray<LLFolderViewItem*>& items);
-
virtual std::set<LLUUID> getSelectionList() const;
// make sure if ancestor is selected, descendents are not
@@ -156,7 +157,6 @@ public:
void setDraggingOverItem(LLFolderViewItem* item) { mDraggingOverItem = item; }
LLFolderViewItem* getDraggingOverItem() { return mDraggingOverItem; }
-
// deletion functionality
void removeSelectedItems();
@@ -282,6 +282,7 @@ protected:
selected_items_t mSelectedItems;
BOOL mKeyboardSelection;
BOOL mAllowMultiSelect;
+ BOOL mShowEmptyMessage;
BOOL mShowFolderHierarchy;
LLUUID mSourceID;
diff --git a/indra/newview/llfolderviewitem.cpp b/indra/newview/llfolderviewitem.cpp
index 622dcfe8dd..8d6114c887 100644
--- a/indra/newview/llfolderviewitem.cpp
+++ b/indra/newview/llfolderviewitem.cpp
@@ -386,13 +386,6 @@ void LLFolderViewItem::changeSelectionFromRoot(LLFolderViewItem* selection, BOOL
getRoot()->changeSelection(selection, selected);
}
-void LLFolderViewItem::extendSelectionFromRoot(LLFolderViewItem* selection)
-{
- LLDynamicArray<LLFolderViewItem*> selected_items;
-
- getRoot()->extendSelection(selection, NULL, selected_items);
-}
-
std::set<LLUUID> LLFolderViewItem::getSelectionList() const
{
std::set<LLUUID> selection;
@@ -496,10 +489,6 @@ BOOL LLFolderViewItem::setSelection(LLFolderViewItem* selection, BOOL openitem,
if (selection == this && !mIsSelected)
{
selectItem();
- if (mListener)
- {
- mListener->selectItem();
- }
}
else if (mIsSelected) // Deselect everything else.
{
@@ -510,7 +499,7 @@ BOOL LLFolderViewItem::setSelection(LLFolderViewItem* selection, BOOL openitem,
BOOL LLFolderViewItem::changeSelection(LLFolderViewItem* selection, BOOL selected)
{
- if (selection == this && mIsSelected != selected)
+ if (selection == this)
{
if (mIsSelected)
{
@@ -520,10 +509,6 @@ BOOL LLFolderViewItem::changeSelection(LLFolderViewItem* selection, BOOL selecte
{
selectItem();
}
- if (mListener)
- {
- mListener->selectItem();
- }
return TRUE;
}
return FALSE;
@@ -531,29 +516,18 @@ BOOL LLFolderViewItem::changeSelection(LLFolderViewItem* selection, BOOL selecte
void LLFolderViewItem::deselectItem(void)
{
- llassert(mIsSelected);
-
mIsSelected = FALSE;
-
- // Update ancestors' count of selected descendents.
- LLFolderViewFolder* parent_folder = getParentFolder();
- if (parent_folder)
- {
- parent_folder->recursiveIncrementNumDescendantsSelected(-1);
- }
}
void LLFolderViewItem::selectItem(void)
{
- llassert(!mIsSelected);
-
- mIsSelected = TRUE;
-
- // Update ancestors' count of selected descendents.
- LLFolderViewFolder* parent_folder = getParentFolder();
- if (parent_folder)
+ if (mIsSelected == FALSE)
{
- parent_folder->recursiveIncrementNumDescendantsSelected(1);
+ if (mListener)
+ {
+ mListener->selectItem();
+ }
+ mIsSelected = TRUE;
}
}
@@ -658,7 +632,7 @@ LLViewerInventoryItem * LLFolderViewItem::getInventoryItem(void)
return gInventory.getItem(getListener()->getUUID());
}
-std::string LLFolderViewItem::getName( void ) const
+const std::string& LLFolderViewItem::getName( void ) const
{
if(mListener)
{
@@ -697,7 +671,7 @@ BOOL LLFolderViewItem::handleMouseDown( S32 x, S32 y, MASK mask )
}
else if (mask & MASK_SHIFT)
{
- extendSelectionFromRoot(this);
+ getParentFolder()->extendSelectionTo(this);
}
else
{
@@ -812,7 +786,7 @@ BOOL LLFolderViewItem::handleMouseUp( S32 x, S32 y, MASK mask )
}
else if (mask & MASK_SHIFT)
{
- extendSelectionFromRoot(this);
+ getParentFolder()->extendSelectionTo(this);
}
else
{
@@ -1125,7 +1099,6 @@ void LLFolderViewItem::draw()
LLFolderViewFolder::LLFolderViewFolder( const LLFolderViewItem::Params& p ):
LLFolderViewItem( p ), // 0 = no create time
- mNumDescendantsSelected(0),
mIsOpen(FALSE),
mExpanderHighlighted(FALSE),
mCurHeight(0.f),
@@ -1173,8 +1146,8 @@ BOOL LLFolderViewFolder::addToFolder(LLFolderViewFolder* folder, LLFolderView* r
return folder->addFolder(this);
}
-// Finds width and height of this object and it's children. Also
-// makes sure that this view and it's children are the right size.
+// Finds width and height of this object and its children. Also
+// makes sure that this view and its children are the right size.
S32 LLFolderViewFolder::arrange( S32* width, S32* height, S32 filter_generation)
{
// sort before laying out contents
@@ -1572,21 +1545,6 @@ BOOL LLFolderViewFolder::hasFilteredDescendants()
return mMostFilteredDescendantGeneration >= getRoot()->getFilter()->getCurrentGeneration();
}
-void LLFolderViewFolder::recursiveIncrementNumDescendantsSelected(S32 increment)
-{
- LLFolderViewFolder* parent_folder = this;
- do
- {
- parent_folder->mNumDescendantsSelected += increment;
-
- // Make sure we don't have negative values.
- llassert(parent_folder->mNumDescendantsSelected >= 0);
-
- parent_folder = parent_folder->getParentFolder();
- }
- while(parent_folder);
-}
-
// Passes selection information on to children and record selection
// information if necessary.
BOOL LLFolderViewFolder::setSelection(LLFolderViewItem* selection, BOOL openitem,
@@ -1599,10 +1557,6 @@ BOOL LLFolderViewFolder::setSelection(LLFolderViewItem* selection, BOOL openitem
{
selectItem();
}
- if (mListener)
- {
- mListener->selectItem();
- }
rv = TRUE;
}
else
@@ -1663,10 +1617,6 @@ BOOL LLFolderViewFolder::changeSelection(LLFolderViewItem* selection, BOOL selec
deselectItem();
}
}
- if (mListener && selected)
- {
- mListener->selectItem();
- }
}
for (folders_t::iterator iter = mFolders.begin();
@@ -1690,119 +1640,261 @@ BOOL LLFolderViewFolder::changeSelection(LLFolderViewItem* selection, BOOL selec
return rv;
}
-void LLFolderViewFolder::extendSelection(LLFolderViewItem* selection, LLFolderViewItem* last_selected, LLDynamicArray<LLFolderViewItem*>& selected_items)
+LLFolderViewFolder* LLFolderViewFolder::getCommonAncestor(LLFolderViewItem* item_a, LLFolderViewItem* item_b, bool& reverse)
{
- // pass on to child folders first
- for (folders_t::iterator iter = mFolders.begin();
- iter != mFolders.end();)
+ if (!item_a->getParentFolder() || !item_b->getParentFolder()) return NULL;
+
+ std::deque<LLFolderViewFolder*> item_a_ancestors;
+
+ LLFolderViewFolder* parent = item_a->getParentFolder();
+ while(parent)
{
- folders_t::iterator fit = iter++;
- (*fit)->extendSelection(selection, last_selected, selected_items);
+ item_a_ancestors.push_back(parent);
+ parent = parent->getParentFolder();
}
- // handle selection of our immediate children...
- BOOL reverse_select = FALSE;
- BOOL found_last_selected = FALSE;
- BOOL found_selection = FALSE;
- LLDynamicArray<LLFolderViewItem*> items_to_select;
- LLFolderViewItem* item;
+ std::deque<LLFolderViewFolder*> item_b_ancestors;
+
+ parent = item_b->getParentFolder();
+ while(parent)
+ {
+ item_b_ancestors.push_back(parent);
+ parent = parent->getParentFolder();
+ }
- //...folders first...
- for (folders_t::iterator iter = mFolders.begin();
- iter != mFolders.end();)
+ LLFolderViewFolder* common_ancestor = item_a->getRoot();
+
+ while(item_a_ancestors.size() > item_b_ancestors.size())
{
- folders_t::iterator fit = iter++;
- item = (*fit);
- if(item == selection)
- {
- found_selection = TRUE;
- }
- else if (item == last_selected)
+ item_a = item_a_ancestors.front();
+ item_a_ancestors.pop_front();
+ }
+
+ while(item_b_ancestors.size() > item_a_ancestors.size())
+ {
+ item_b = item_b_ancestors.front();
+ item_b_ancestors.pop_front();
+ }
+
+ while(item_a_ancestors.size())
+ {
+ common_ancestor = item_a_ancestors.front();
+
+ if (item_a_ancestors.front() == item_b_ancestors.front())
{
- found_last_selected = TRUE;
- if (found_selection)
+ // which came first, sibling a or sibling b?
+ for (folders_t::iterator it = common_ancestor->mFolders.begin(), end_it = common_ancestor->mFolders.end();
+ it != end_it;
+ ++it)
{
- reverse_select = TRUE;
+ LLFolderViewItem* item = *it;
+
+ if (item == item_a)
+ {
+ reverse = false;
+ return common_ancestor;
+ }
+ if (item == item_b)
+ {
+ reverse = true;
+ return common_ancestor;
+ }
}
- }
- if (found_selection || found_last_selected)
- {
- // deselect currently selected items so they can be pushed back on queue
- if (item->isSelected())
+ for (items_t::iterator it = common_ancestor->mItems.begin(), end_it = common_ancestor->mItems.end();
+ it != end_it;
+ ++it)
{
- item->changeSelection(item, FALSE);
+ LLFolderViewItem* item = *it;
+
+ if (item == item_a)
+ {
+ reverse = false;
+ return common_ancestor;
+ }
+ if (item == item_b)
+ {
+ reverse = true;
+ return common_ancestor;
+ }
}
- items_to_select.put(item);
+ break;
}
- if (found_selection && found_last_selected)
- {
- break;
- }
+ item_a = item_a_ancestors.front();
+ item_a_ancestors.pop_front();
+ item_b = item_b_ancestors.front();
+ item_b_ancestors.pop_front();
}
- if (!(found_selection && found_last_selected))
+ return NULL;
+}
+
+void LLFolderViewFolder::gatherChildRangeExclusive(LLFolderViewItem* start, LLFolderViewItem* end, bool reverse, std::vector<LLFolderViewItem*>& items)
+{
+ bool selecting = start == NULL;
+ if (reverse)
{
- //,,,then items
- for (items_t::iterator iter = mItems.begin();
- iter != mItems.end();)
+ for (items_t::reverse_iterator it = mItems.rbegin(), end_it = mItems.rend();
+ it != end_it;
+ ++it)
{
- items_t::iterator iit = iter++;
- item = (*iit);
- if(item == selection)
+ if (*it == end)
{
- found_selection = TRUE;
+ return;
}
- else if (item == last_selected)
+ if (selecting)
{
- found_last_selected = TRUE;
- if (found_selection)
- {
- reverse_select = TRUE;
- }
+ items.push_back(*it);
}
- if (found_selection || found_last_selected)
+ if (*it == start)
{
- // deselect currently selected items so they can be pushed back on queue
- if (item->isSelected())
- {
- item->changeSelection(item, FALSE);
- }
- items_to_select.put(item);
+ selecting = true;
+ }
+ }
+ for (folders_t::reverse_iterator it = mFolders.rbegin(), end_it = mFolders.rend();
+ it != end_it;
+ ++it)
+ {
+ if (*it == end)
+ {
+ return;
}
- if (found_selection && found_last_selected)
+ if (selecting)
{
- break;
+ items.push_back(*it);
+ }
+
+ if (*it == start)
+ {
+ selecting = true;
}
}
}
-
- if (found_last_selected && found_selection)
+ else
{
- // we have a complete selection inside this folder
- for (S32 index = reverse_select ? items_to_select.getLength() - 1 : 0;
- reverse_select ? index >= 0 : index < items_to_select.getLength(); reverse_select ? index-- : index++)
+ for (folders_t::iterator it = mFolders.begin(), end_it = mFolders.end();
+ it != end_it;
+ ++it)
{
- LLFolderViewItem* item = items_to_select[index];
- if (item->changeSelection(item, TRUE))
+ if (*it == end)
{
- selected_items.put(item);
+ return;
+ }
+
+ if (selecting)
+ {
+ items.push_back(*it);
+ }
+
+ if (*it == start)
+ {
+ selecting = true;
+ }
+ }
+ for (items_t::iterator it = mItems.begin(), end_it = mItems.end();
+ it != end_it;
+ ++it)
+ {
+ if (*it == end)
+ {
+ return;
+ }
+
+ if (selecting)
+ {
+ items.push_back(*it);
+ }
+
+ if (*it == start)
+ {
+ selecting = true;
}
}
}
- else if (found_selection)
+}
+
+void LLFolderViewFolder::extendSelectionTo(LLFolderViewItem* new_selection)
+{
+ if (getRoot()->getAllowMultiSelect() == FALSE) return;
+
+ LLFolderViewItem* cur_selected_item = getRoot()->getCurSelectedItem();
+ if (cur_selected_item == NULL)
+ {
+ cur_selected_item = new_selection;
+ }
+
+
+ bool reverse = false;
+ LLFolderViewFolder* common_ancestor = getCommonAncestor(cur_selected_item, new_selection, reverse);
+ if (!common_ancestor) return;
+
+ LLFolderViewItem* last_selected_item_from_cur = cur_selected_item;
+ LLFolderViewFolder* cur_folder = cur_selected_item->getParentFolder();
+
+ std::vector<LLFolderViewItem*> items_to_select_forward;
+
+ while(cur_folder != common_ancestor)
+ {
+ cur_folder->gatherChildRangeExclusive(last_selected_item_from_cur, NULL, reverse, items_to_select_forward);
+
+ last_selected_item_from_cur = cur_folder;
+ cur_folder = cur_folder->getParentFolder();
+ }
+
+ std::vector<LLFolderViewItem*> items_to_select_reverse;
+
+ LLFolderViewItem* last_selected_item_from_new = new_selection;
+ cur_folder = new_selection->getParentFolder();
+ while(cur_folder != common_ancestor)
+ {
+ cur_folder->gatherChildRangeExclusive(last_selected_item_from_new, NULL, !reverse, items_to_select_reverse);
+
+ last_selected_item_from_new = cur_folder;
+ cur_folder = cur_folder->getParentFolder();
+ }
+
+ common_ancestor->gatherChildRangeExclusive(last_selected_item_from_cur, last_selected_item_from_new, reverse, items_to_select_forward);
+
+ for (std::vector<LLFolderViewItem*>::reverse_iterator it = items_to_select_reverse.rbegin(), end_it = items_to_select_reverse.rend();
+ it != end_it;
+ ++it)
+ {
+ items_to_select_forward.push_back(*it);
+ }
+
+ LLFolderView* root = getRoot();
+
+ for (std::vector<LLFolderViewItem*>::iterator it = items_to_select_forward.begin(), end_it = items_to_select_forward.end();
+ it != end_it;
+ ++it)
{
- // last selection was not in this folder....go ahead and select just the new item
- if (selection->changeSelection(selection, TRUE))
+ LLFolderViewItem* item = *it;
+ if (item->isSelected())
+ {
+ root->removeFromSelectionList(item);
+ }
+ else
{
- selected_items.put(selection);
+ item->selectItem();
}
+ root->addToSelectionList(item);
+ }
+
+ if (new_selection->isSelected())
+ {
+ root->removeFromSelectionList(new_selection);
}
+ else
+ {
+ new_selection->selectItem();
+ }
+ root->addToSelectionList(new_selection);
}
+
void LLFolderViewFolder::destroyView()
{
for (items_t::iterator iter = mItems.begin();
@@ -1874,19 +1966,11 @@ void LLFolderViewFolder::extractItem( LLFolderViewItem* item )
ft = std::find(mFolders.begin(), mFolders.end(), f);
if (ft != mFolders.end())
{
- if ((*ft)->numSelected())
- {
- recursiveIncrementNumDescendantsSelected(-(*ft)->numSelected());
- }
mFolders.erase(ft);
}
}
else
{
- if ((*it)->isSelected())
- {
- recursiveIncrementNumDescendantsSelected(-1);
- }
mItems.erase(it);
}
//item has been removed, need to update filter
@@ -2055,11 +2139,6 @@ BOOL LLFolderViewFolder::addItem(LLFolderViewItem* item)
{
mItems.push_back(item);
- if (item->isSelected())
- {
- recursiveIncrementNumDescendantsSelected(1);
- }
-
item->setRect(LLRect(0, 0, getRect().getWidth(), 0));
item->setVisible(FALSE);
@@ -2067,8 +2146,14 @@ BOOL LLFolderViewFolder::addItem(LLFolderViewItem* item)
item->dirtyFilter();
- // Update the folder creation date if the child is newer than our current date
- setCreationDate(llmax<time_t>(mCreationDate, item->getCreationDate()));
+ // Update the folder creation date if the folder has no creation date
+ bool setting_date = false;
+ const time_t item_creation_date = item->getCreationDate();
+ if ((item_creation_date > 0) && (mCreationDate == 0))
+ {
+ setCreationDate(item_creation_date);
+ setting_date = true;
+ }
// Handle sorting
requestArrange();
@@ -2078,8 +2163,11 @@ BOOL LLFolderViewFolder::addItem(LLFolderViewItem* item)
LLFolderViewFolder* parentp = getParentFolder();
while (parentp)
{
- // Update the folder creation date if the child is newer than our current date
- parentp->setCreationDate(llmax<time_t>(parentp->mCreationDate, item->getCreationDate()));
+ // Update the parent folder creation date
+ if (setting_date && (parentp->mCreationDate == 0))
+ {
+ parentp->setCreationDate(item_creation_date);
+ }
if (parentp->mSortFunction.isByDate())
{
@@ -2097,10 +2185,6 @@ BOOL LLFolderViewFolder::addItem(LLFolderViewItem* item)
BOOL LLFolderViewFolder::addFolder(LLFolderViewFolder* folder)
{
mFolders.push_back(folder);
- if (folder->numSelected())
- {
- recursiveIncrementNumDescendantsSelected(folder->numSelected());
- }
folder->setOrigin(0, 0);
folder->reshape(getRect().getWidth(), 0);
folder->setVisible(FALSE);
@@ -2276,33 +2360,16 @@ BOOL LLFolderViewFolder::handleDragAndDrop(S32 x, S32 y, MASK mask,
EAcceptance* accept,
std::string& tooltip_msg)
{
- LLFolderView* root_view = getRoot();
-
BOOL handled = FALSE;
- if(mIsOpen)
+
+ if (mIsOpen)
{
- handled = childrenHandleDragAndDrop(x, y, mask, drop, cargo_type,
- cargo_data, accept, tooltip_msg) != NULL;
+ handled = (childrenHandleDragAndDrop(x, y, mask, drop, cargo_type, cargo_data, accept, tooltip_msg) != NULL);
}
if (!handled)
{
- BOOL accepted = mListener && mListener->dragOrDrop(mask, drop,cargo_type,cargo_data, tooltip_msg);
-
- if (accepted)
- {
- mDragAndDropTarget = TRUE;
- *accept = ACCEPT_YES_MULTI;
- }
- else
- {
- *accept = ACCEPT_NO;
- }
-
- if (!drop && accepted)
- {
- root_view->autoOpenTest(this);
- }
+ handleDragAndDropToThisFolder(mask, drop, cargo_type, cargo_data, accept, tooltip_msg);
lldebugst(LLERR_USER_INPUT) << "dragAndDrop handled by LLFolderViewFolder" << llendl;
}
@@ -2310,6 +2377,33 @@ BOOL LLFolderViewFolder::handleDragAndDrop(S32 x, S32 y, MASK mask,
return TRUE;
}
+BOOL LLFolderViewFolder::handleDragAndDropToThisFolder(MASK mask,
+ BOOL drop,
+ EDragAndDropType cargo_type,
+ void* cargo_data,
+ EAcceptance* accept,
+ std::string& tooltip_msg)
+{
+ BOOL accepted = mListener && mListener->dragOrDrop(mask, drop, cargo_type, cargo_data, tooltip_msg);
+
+ if (accepted)
+ {
+ mDragAndDropTarget = TRUE;
+ *accept = ACCEPT_YES_MULTI;
+ }
+ else
+ {
+ *accept = ACCEPT_NO;
+ }
+
+ if (!drop && accepted)
+ {
+ getRoot()->autoOpenTest(this);
+ }
+
+ return TRUE;
+}
+
BOOL LLFolderViewFolder::handleRightMouseDown( S32 x, S32 y, MASK mask )
{
diff --git a/indra/newview/llfolderviewitem.h b/indra/newview/llfolderviewitem.h
index 676eaf825d..2fc79f5765 100644
--- a/indra/newview/llfolderviewitem.h
+++ b/indra/newview/llfolderviewitem.h
@@ -122,6 +122,8 @@ public:
// Mostly for debugging printout purposes.
const std::string& getSearchableLabel() { return mSearchableLabel; }
+
+ BOOL isLoading() const { return mIsLoading; }
private:
BOOL mIsSelected;
@@ -164,9 +166,6 @@ protected:
// helper function to change the selection from the root.
void changeSelectionFromRoot(LLFolderViewItem* selection, BOOL selected);
- // helper function to change the selection from the root.
- void extendSelectionFromRoot(LLFolderViewItem* selection);
-
// this is an internal method used for adding items to folders. A
// no-op at this level, but reimplemented in derived classes.
virtual BOOL addItem(LLFolderViewItem*) { return FALSE; }
@@ -224,9 +223,6 @@ public:
// Returns TRUE if the selection state of this item was changed.
virtual BOOL changeSelection(LLFolderViewItem* selection, BOOL selected);
- // this method is used to group select items
- virtual void extendSelection(LLFolderViewItem* selection, LLFolderViewItem* last_selected, LLDynamicArray<LLFolderViewItem*>& items) { }
-
// this method is used to deselect this element
void deselectItem();
@@ -267,7 +263,7 @@ public:
// This method returns the actual name of the thing being
// viewed. This method will ask the viewed object itself.
- std::string getName( void ) const;
+ const std::string& getName( void ) const;
const std::string& getSearchableLabel( void ) const;
@@ -373,13 +369,6 @@ public:
typedef std::list<LLFolderViewItem*> items_t;
typedef std::list<LLFolderViewFolder*> folders_t;
-private:
- S32 mNumDescendantsSelected;
-
-public: // Accessed needed by LLFolderViewItem
- void recursiveIncrementNumDescendantsSelected(S32 increment);
- S32 numSelected(void) const { return mNumDescendantsSelected + (isSelected() ? 1 : 0); }
-
protected:
items_t mItems;
folders_t mFolders;
@@ -461,7 +450,7 @@ public:
virtual BOOL changeSelection(LLFolderViewItem* selection, BOOL selected);
// this method is used to group select items
- virtual void extendSelection(LLFolderViewItem* selection, LLFolderViewItem* last_selected, LLDynamicArray<LLFolderViewItem*>& items);
+ void extendSelectionTo(LLFolderViewItem* selection);
// Returns true is this object and all of its children can be removed.
virtual BOOL isRemovable();
@@ -547,15 +536,25 @@ public:
void* cargo_data,
EAcceptance* accept,
std::string& tooltip_msg);
+ BOOL handleDragAndDropToThisFolder(MASK mask, BOOL drop,
+ EDragAndDropType cargo_type,
+ void* cargo_data,
+ EAcceptance* accept,
+ std::string& tooltip_msg);
virtual void draw();
time_t getCreationDate() const;
bool isTrash() const;
- S32 getNumSelectedDescendants(void) const { return mNumDescendantsSelected; }
folders_t::const_iterator getFoldersBegin() const { return mFolders.begin(); }
folders_t::const_iterator getFoldersEnd() const { return mFolders.end(); }
folders_t::size_type getFoldersCount() const { return mFolders.size(); }
+
+ items_t::const_iterator getItemsBegin() const { return mItems.begin(); }
+ items_t::const_iterator getItemsEnd() const { return mItems.end(); }
+ items_t::size_type getItemsCount() const { return mItems.size(); }
+ LLFolderViewFolder* getCommonAncestor(LLFolderViewItem* item_a, LLFolderViewItem* item_b, bool& reverse);
+ void gatherChildRangeExclusive(LLFolderViewItem* start, LLFolderViewItem* end, bool reverse, std::vector<LLFolderViewItem*>& items);
};
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
diff --git a/indra/newview/llglsandbox.cpp b/indra/newview/llglsandbox.cpp
index fa3f546157..1208c9378e 100644
--- a/indra/newview/llglsandbox.cpp
+++ b/indra/newview/llglsandbox.cpp
@@ -115,7 +115,7 @@ void LLToolSelectRect::handleRectangleSelection(S32 x, S32 y, MASK mask)
S32 center_y = (top + bottom) / 2;
// save drawing mode
- glMatrixMode(GL_PROJECTION);
+ gGL.matrixMode(LLRender::MM_PROJECTION);
gGL.pushMatrix();
BOOL limit_select_distance = gSavedSettings.getBOOL("LimitSelectDistance");
@@ -230,9 +230,9 @@ void LLToolSelectRect::handleRectangleSelection(S32 x, S32 y, MASK mask)
}
// restore drawing mode
- glMatrixMode(GL_PROJECTION);
+ gGL.matrixMode(LLRender::MM_PROJECTION);
gGL.popMatrix();
- glMatrixMode(GL_MODELVIEW);
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
// restore camera
LLViewerCamera::getInstance()->setFar(old_far_plane);
@@ -240,7 +240,7 @@ void LLToolSelectRect::handleRectangleSelection(S32 x, S32 y, MASK mask)
gViewerWindow->setup3DRender();
}
-const F32 WIND_ALTITUDE = 180.f;
+const F32 WIND_RELATIVE_ALTITUDE = 25.f;
void LLWind::renderVectors()
{
@@ -254,13 +254,13 @@ void LLWind::renderVectors()
gGL.pushMatrix();
LLVector3 origin_agent;
origin_agent = gAgent.getPosAgentFromGlobal(mOriginGlobal);
- gGL.translatef(origin_agent.mV[VX], origin_agent.mV[VY], WIND_ALTITUDE);
+ gGL.translatef(origin_agent.mV[VX], origin_agent.mV[VY], gAgent.getPositionAgent().mV[VZ] + WIND_RELATIVE_ALTITUDE);
for (j = 0; j < mSize; j++)
{
for (i = 0; i < mSize; i++)
{
- x = mCloudVelX[i + j*mSize] * WIND_SCALE_HACK;
- y = mCloudVelY[i + j*mSize] * WIND_SCALE_HACK;
+ x = mVelX[i + j*mSize] * WIND_SCALE_HACK;
+ y = mVelY[i + j*mSize] * WIND_SCALE_HACK;
gGL.pushMatrix();
gGL.translatef((F32)i * region_width_meters/mSize, (F32)j * region_width_meters/mSize, 0.0);
gGL.color3f(0,1,0);
@@ -777,13 +777,17 @@ void LLViewerObjectList::renderObjectBeacons()
LLGLSUIDefault gls_ui;
+ if (LLGLSLShader::sNoFixedFunction)
+ {
+ gUIProgram.bind();
+ }
+
{
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
S32 last_line_width = -1;
// gGL.begin(LLRender::LINES); // Always happens in (line_width != last_line_width)
- BOOL flush = FALSE;
for (std::vector<LLDebugBeacon>::iterator iter = mDebugBeacons.begin(); iter != mDebugBeacons.end(); ++iter)
{
const LLDebugBeacon &debug_beacon = *iter;
@@ -792,18 +796,14 @@ void LLViewerObjectList::renderObjectBeacons()
S32 line_width = debug_beacon.mLineWidth;
if (line_width != last_line_width)
{
- if (flush)
- {
- gGL.end();
- }
- flush = TRUE;
gGL.flush();
glLineWidth( (F32)line_width );
last_line_width = line_width;
- gGL.begin(LLRender::LINES);
}
const LLVector3 &thisline = debug_beacon.mPositionAgent;
+
+ gGL.begin(LLRender::LINES);
gGL.color4fv(color.mV);
gGL.vertex3f(thisline.mV[VX],thisline.mV[VY],thisline.mV[VZ] - 50.f);
gGL.vertex3f(thisline.mV[VX],thisline.mV[VY],thisline.mV[VZ] + 50.f);
@@ -813,8 +813,9 @@ void LLViewerObjectList::renderObjectBeacons()
gGL.vertex3f(thisline.mV[VX],thisline.mV[VY] + 2.f,thisline.mV[VZ]);
draw_line_cube(0.10f, thisline);
+
+ gGL.end();
}
- gGL.end();
}
{
@@ -824,7 +825,6 @@ void LLViewerObjectList::renderObjectBeacons()
S32 last_line_width = -1;
// gGL.begin(LLRender::LINES); // Always happens in (line_width != last_line_width)
- BOOL flush = FALSE;
for (std::vector<LLDebugBeacon>::iterator iter = mDebugBeacons.begin(); iter != mDebugBeacons.end(); ++iter)
{
const LLDebugBeacon &debug_beacon = *iter;
@@ -832,18 +832,13 @@ void LLViewerObjectList::renderObjectBeacons()
S32 line_width = debug_beacon.mLineWidth;
if (line_width != last_line_width)
{
- if (flush)
- {
- gGL.end();
- }
- flush = TRUE;
gGL.flush();
glLineWidth( (F32)line_width );
last_line_width = line_width;
- gGL.begin(LLRender::LINES);
}
const LLVector3 &thisline = debug_beacon.mPositionAgent;
+ gGL.begin(LLRender::LINES);
gGL.color4fv(debug_beacon.mColor.mV);
gGL.vertex3f(thisline.mV[VX],thisline.mV[VY],thisline.mV[VZ] - 0.5f);
gGL.vertex3f(thisline.mV[VX],thisline.mV[VY],thisline.mV[VZ] + 0.5f);
@@ -853,9 +848,10 @@ void LLViewerObjectList::renderObjectBeacons()
gGL.vertex3f(thisline.mV[VX],thisline.mV[VY] + 0.5f,thisline.mV[VZ]);
draw_line_cube(0.10f, thisline);
+
+ gGL.end();
}
- gGL.end();
gGL.flush();
glLineWidth(1.f);
diff --git a/indra/newview/llgroupactions.cpp b/indra/newview/llgroupactions.cpp
index 97fa551441..623ebb76f2 100644
--- a/indra/newview/llgroupactions.cpp
+++ b/indra/newview/llgroupactions.cpp
@@ -34,10 +34,10 @@
#include "llagent.h"
#include "llcommandhandler.h"
#include "llfloaterreg.h"
+#include "llfloatersidepanelcontainer.h"
#include "llgroupmgr.h"
#include "llimview.h" // for gIMMgr
#include "llnotificationsutil.h"
-#include "llsidetray.h"
#include "llstatusbar.h" // can_afford_transaction()
#include "llimfloater.h"
#include "groupchatlistener.h"
@@ -83,7 +83,7 @@ public:
{
LLSD params;
params["people_panel_tab_name"] = "groups_panel";
- LLSideTray::getInstance()->showPanel("panel_people", params);
+ LLFloaterSidePanelContainer::showPanel("people", "panel_people", params);
return true;
}
return false;
@@ -243,7 +243,7 @@ static bool isGroupUIVisible()
{
static LLPanel* panel = 0;
if(!panel)
- panel = LLSideTray::getInstance()->getPanel("panel_group_info_sidetray");
+ panel = LLFloaterSidePanelContainer::getPanel("people", "panel_group_info_sidetray");
if(!panel)
return false;
return panel->isInVisibleChain();
@@ -265,7 +265,7 @@ void LLGroupActions::show(const LLUUID& group_id)
params["group_id"] = group_id;
params["open_tab_name"] = "panel_group_info_sidetray";
- LLSideTray::getInstance()->showPanel("panel_group_info_sidetray", params);
+ LLFloaterSidePanelContainer::showPanel("people", "panel_group_info_sidetray", params);
}
void LLGroupActions::refresh_notices()
@@ -278,7 +278,7 @@ void LLGroupActions::refresh_notices()
params["open_tab_name"] = "panel_group_info_sidetray";
params["action"] = "refresh_notices";
- LLSideTray::getInstance()->showPanel("panel_group_info_sidetray", params);
+ LLFloaterSidePanelContainer::showPanel("people", "panel_group_info_sidetray", params);
}
//static
@@ -292,7 +292,7 @@ void LLGroupActions::refresh(const LLUUID& group_id)
params["open_tab_name"] = "panel_group_info_sidetray";
params["action"] = "refresh";
- LLSideTray::getInstance()->showPanel("panel_group_info_sidetray", params);
+ LLFloaterSidePanelContainer::showPanel("people", "panel_group_info_sidetray", params);
}
//static
@@ -303,7 +303,7 @@ void LLGroupActions::createGroup()
params["open_tab_name"] = "panel_group_info_sidetray";
params["action"] = "create";
- LLSideTray::getInstance()->showPanel("panel_group_info_sidetray", params);
+ LLFloaterSidePanelContainer::showPanel("people", "panel_group_info_sidetray", params);
}
//static
@@ -317,7 +317,7 @@ void LLGroupActions::closeGroup(const LLUUID& group_id)
params["open_tab_name"] = "panel_group_info_sidetray";
params["action"] = "close";
- LLSideTray::getInstance()->showPanel("panel_group_info_sidetray", params);
+ LLFloaterSidePanelContainer::showPanel("people", "panel_group_info_sidetray", params);
}
diff --git a/indra/newview/llgrouplist.cpp b/indra/newview/llgrouplist.cpp
index c3e6e1c2dc..bbf66ca750 100644
--- a/indra/newview/llgrouplist.cpp
+++ b/indra/newview/llgrouplist.cpp
@@ -95,7 +95,7 @@ LLGroupList::LLGroupList(const Params& p)
LLGroupList::~LLGroupList()
{
gAgent.removeListener(this);
- LLView::deleteViewByHandle(mContextMenuHandle);
+ if (mContextMenuHandle.get()) mContextMenuHandle.get()->die();
}
// virtual
diff --git a/indra/newview/llhudeffectbeam.cpp b/indra/newview/llhudeffectbeam.cpp
index 37b7b2e75d..8abad3d292 100644
--- a/indra/newview/llhudeffectbeam.cpp
+++ b/indra/newview/llhudeffectbeam.cpp
@@ -295,13 +295,13 @@ void LLHUDEffectBeam::render()
F32 alpha = mFadeInterp.getCurVal()*mColor.mV[3];
alpha *= mInterpFade[i].getCurVal();
coloru.mV[3] = (U8)alpha;
- glColor4ubv(coloru.mV);
+ gGL.color4ubv(coloru.mV);
- glPushMatrix();
- glTranslatef(pos_agent.mV[0], pos_agent.mV[1], pos_agent.mV[2]);
- glScalef(scale, scale, scale);
- gSphere.render(0);
- glPopMatrix();
+ gGL.pushMatrix();
+ gGL.translatef(pos_agent.mV[0], pos_agent.mV[1], pos_agent.mV[2]);
+ gGL.scalef(scale, scale, scale);
+ gSphere.render();
+ gGL.popMatrix();
}
}
diff --git a/indra/newview/llhudeffectblob.cpp b/indra/newview/llhudeffectblob.cpp
index d8687eed8d..c909551b51 100644
--- a/indra/newview/llhudeffectblob.cpp
+++ b/indra/newview/llhudeffectblob.cpp
@@ -44,12 +44,20 @@ LLHUDEffectBlob::~LLHUDEffectBlob()
{
}
+void LLHUDEffectBlob::markDead()
+{
+ mImage = NULL;
+
+ LLHUDEffect::markDead();
+}
+
void LLHUDEffectBlob::render()
{
F32 time = mTimer.getElapsedTimeF32();
if (mDuration < time)
{
markDead();
+ return;
}
LLVector3 pos_agent = gAgent.getPosAgentFromGlobal(mPositionGlobal);
diff --git a/indra/newview/llhudeffectblob.h b/indra/newview/llhudeffectblob.h
index f4c1691108..ce3e8500fc 100644
--- a/indra/newview/llhudeffectblob.h
+++ b/indra/newview/llhudeffectblob.h
@@ -35,6 +35,8 @@ class LLHUDEffectBlob : public LLHUDEffect
public:
friend class LLHUDObject;
+ void markDead();
+
void setPixelSize(S32 pixels) { mPixelSize = pixels; }
protected:
diff --git a/indra/newview/llhudeffectlookat.cpp b/indra/newview/llhudeffectlookat.cpp
index b380b3fe20..bc3b220dc0 100644
--- a/indra/newview/llhudeffectlookat.cpp
+++ b/indra/newview/llhudeffectlookat.cpp
@@ -498,10 +498,10 @@ void LLHUDEffectLookAt::render()
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
LLVector3 target = mTargetPos + ((LLVOAvatar*)(LLViewerObject*)mSourceObject)->mHeadp->getWorldPosition();
- glMatrixMode(GL_MODELVIEW);
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
gGL.pushMatrix();
gGL.translatef(target.mV[VX], target.mV[VY], target.mV[VZ]);
- glScalef(0.3f, 0.3f, 0.3f);
+ gGL.scalef(0.3f, 0.3f, 0.3f);
gGL.begin(LLRender::LINES);
{
LLColor3 color = (*mAttentions)[mTargetType].mColor;
diff --git a/indra/newview/llhudeffectpointat.cpp b/indra/newview/llhudeffectpointat.cpp
index 28fe8e1c01..114a633821 100644
--- a/indra/newview/llhudeffectpointat.cpp
+++ b/indra/newview/llhudeffectpointat.cpp
@@ -327,7 +327,7 @@ void LLHUDEffectPointAt::render()
LLVector3 target = mTargetPos + mSourceObject->getRenderPosition();
gGL.pushMatrix();
gGL.translatef(target.mV[VX], target.mV[VY], target.mV[VZ]);
- glScalef(0.3f, 0.3f, 0.3f);
+ gGL.scalef(0.3f, 0.3f, 0.3f);
gGL.begin(LLRender::LINES);
{
gGL.color3f(1.f, 0.f, 0.f);
diff --git a/indra/newview/llhudrender.cpp b/indra/newview/llhudrender.cpp
index 1156e764a1..122711a86d 100644
--- a/indra/newview/llhudrender.cpp
+++ b/indra/newview/llhudrender.cpp
@@ -107,14 +107,24 @@ void hud_render_text(const LLWString &wstr, const LLVector3 &pos_agent,
viewport[1] = world_view_rect.mBottom;
viewport[2] = world_view_rect.getWidth();
viewport[3] = world_view_rect.getHeight();
+
+ F64 mdlv[16];
+ F64 proj[16];
+
+ for (U32 i = 0; i < 16; i++)
+ {
+ mdlv[i] = (F64) gGLModelView[i];
+ proj[i] = (F64) gGLProjection[i];
+ }
+
gluProject(render_pos.mV[0], render_pos.mV[1], render_pos.mV[2],
- gGLModelView, gGLProjection, (GLint*) viewport,
+ mdlv, proj, (GLint*) viewport,
&winX, &winY, &winZ);
//fonts all render orthographically, set up projection``
- glMatrixMode(GL_PROJECTION);
- glPushMatrix();
- glMatrixMode(GL_MODELVIEW);
+ gGL.matrixMode(LLRender::MM_PROJECTION);
+ gGL.pushMatrix();
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
gGL.pushMatrix();
LLUI::pushMatrix();
@@ -124,7 +134,7 @@ void hud_render_text(const LLWString &wstr, const LLVector3 &pos_agent,
winX -= world_view_rect.mLeft;
winY -= world_view_rect.mBottom;
LLUI::loadIdentity();
- glLoadIdentity();
+ gGL.loadIdentity();
LLUI::translate((F32) winX*1.0f/LLFontGL::sScaleX, (F32) winY*1.0f/(LLFontGL::sScaleY), -(((F32) winZ*2.f)-1.f));
F32 right_x;
@@ -133,7 +143,7 @@ void hud_render_text(const LLWString &wstr, const LLVector3 &pos_agent,
LLUI::popMatrix();
gGL.popMatrix();
- glMatrixMode(GL_PROJECTION);
- glPopMatrix();
- glMatrixMode(GL_MODELVIEW);
+ gGL.matrixMode(LLRender::MM_PROJECTION);
+ gGL.popMatrix();
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
}
diff --git a/indra/newview/llimfloater.cpp b/indra/newview/llimfloater.cpp
index 50a9c56518..f67464078b 100644
--- a/indra/newview/llimfloater.cpp
+++ b/indra/newview/llimfloater.cpp
@@ -34,9 +34,9 @@
#include "llappviewer.h"
#include "llavatarnamecache.h"
#include "llbutton.h"
-#include "llbottomtray.h"
#include "llchannelmanager.h"
#include "llchiclet.h"
+#include "llchicletbar.h"
#include "llfloaterreg.h"
#include "llimfloatercontainer.h" // to replace separate IM Floaters with multifloater container
#include "llinventoryfunctions.h"
@@ -55,15 +55,9 @@
#include "llinventorymodel.h"
#include "llrootview.h"
#include "llspeakers.h"
-#include "llsidetray.h"
#include "llviewerchat.h"
-static const S32 RECT_PADDING_NOT_INIT = -1;
-static const S32 RECT_PADDING_NEED_RECALC = -2;
-
-S32 LLIMFloater::sAllowedRectRightPadding = RECT_PADDING_NOT_INIT;
-
LLIMFloater::LLIMFloater(const LLUUID& session_id)
: LLTransientDockableFloater(NULL, true, session_id),
mControlPanel(NULL),
@@ -123,14 +117,14 @@ void LLIMFloater::onFocusLost()
{
LLIMModel::getInstance()->resetActiveSessionID();
- LLBottomTray::getInstance()->getChicletPanel()->setChicletToggleState(mSessionID, false);
+ LLChicletBar::getInstance()->getChicletPanel()->setChicletToggleState(mSessionID, false);
}
void LLIMFloater::onFocusReceived()
{
LLIMModel::getInstance()->setActiveSessionID(mSessionID);
- LLBottomTray::getInstance()->getChicletPanel()->setChicletToggleState(mSessionID, true);
+ LLChicletBar::getInstance()->getChicletPanel()->setChicletToggleState(mSessionID, true);
if (getVisible())
{
@@ -240,12 +234,6 @@ LLIMFloater::~LLIMFloater()
//virtual
BOOL LLIMFloater::postBuild()
{
- // User-resizable control panels in P2P sessions look ugly (EXT-3470).
- if (mDialog == IM_NOTHING_SPECIAL || mDialog == IM_SESSION_P2P_INVITE)
- {
- getChild<LLLayoutStack>("im_panels")->setPanelUserResize("panel_im_control_panel", FALSE);
- }
-
const LLUUID& other_party_id = LLIMModel::getInstance()->getOtherParticipantID(mSessionID);
if (other_party_id.notNull())
{
@@ -391,9 +379,6 @@ void LLIMFloater::onSlide()
getChild<LLButton>("slide_left_btn")->setVisible(mControlPanel->getParent()->getVisible());
getChild<LLButton>("slide_right_btn")->setVisible(!mControlPanel->getParent()->getVisible());
-
- LLLayoutStack* stack = getChild<LLLayoutStack>("im_panels");
- if (stack) stack->setAnimate(true);
}
//static
@@ -450,7 +435,7 @@ LLIMFloater* LLIMFloater::show(const LLUUID& session_id)
if (floater->getDockControl() == NULL)
{
LLChiclet* chiclet =
- LLBottomTray::getInstance()->getChicletPanel()->findChiclet<LLChiclet>(
+ LLChicletBar::getInstance()->getChicletPanel()->findChiclet<LLChiclet>(
session_id);
if (chiclet == NULL)
{
@@ -458,11 +443,11 @@ LLIMFloater* LLIMFloater::show(const LLUUID& session_id)
}
else
{
- LLBottomTray::getInstance()->getChicletPanel()->scrollToChiclet(chiclet);
+ LLChicletBar::getInstance()->getChicletPanel()->scrollToChiclet(chiclet);
}
floater->setDockControl(new LLDockControl(chiclet, floater, floater->getDockTongue(),
- LLDockControl::TOP, boost::bind(&LLIMFloater::getAllowedRect, floater, _1)));
+ LLDockControl::BOTTOM));
}
// window is positioned, now we can show it.
@@ -472,43 +457,6 @@ LLIMFloater* LLIMFloater::show(const LLUUID& session_id)
return floater;
}
-//static
-bool LLIMFloater::resetAllowedRectPadding()
-{
- //reset allowed rect right padding if "SidebarCameraMovement" option
- //or sidebar state changed
- sAllowedRectRightPadding = RECT_PADDING_NEED_RECALC ;
- return true;
-}
-
-void LLIMFloater::getAllowedRect(LLRect& rect)
-{
- if (sAllowedRectRightPadding == RECT_PADDING_NOT_INIT) //wasn't initialized
- {
- gSavedSettings.getControl("SidebarCameraMovement")->getSignal()->connect(boost::bind(&LLIMFloater::resetAllowedRectPadding));
-
- LLSideTray* side_bar = LLSideTray::getInstance();
- side_bar->setVisibleWidthChangeCallback(boost::bind(&LLIMFloater::resetAllowedRectPadding));
- sAllowedRectRightPadding = RECT_PADDING_NEED_RECALC;
- }
-
- rect = gViewerWindow->getWorldViewRectScaled();
- if (sAllowedRectRightPadding == RECT_PADDING_NEED_RECALC) //recalc allowed rect right padding
- {
- LLPanel* side_bar_tabs =
- gViewerWindow->getRootView()->getChild<LLPanel> (
- "side_bar_tabs");
- sAllowedRectRightPadding = side_bar_tabs->getRect().getWidth();
- LLTransientFloaterMgr::getInstance()->addControlView(side_bar_tabs);
-
- if (gSavedSettings.getBOOL("SidebarCameraMovement") == FALSE)
- {
- sAllowedRectRightPadding += LLSideTray::getInstance()->getVisibleWidth();
- }
- }
- rect.mRight -= sAllowedRectRightPadding;
-}
-
void LLIMFloater::setDocked(bool docked, bool pop_on_undock)
{
// update notification channel state
@@ -560,7 +508,7 @@ void LLIMFloater::setVisible(BOOL visible)
if(!visible)
{
- LLIMChiclet* chiclet = LLBottomTray::getInstance()->getChicletPanel()->findChiclet<LLIMChiclet>(mSessionID);
+ LLIMChiclet* chiclet = LLChicletBar::getInstance()->getChicletPanel()->findChiclet<LLIMChiclet>(mSessionID);
if(chiclet)
{
chiclet->setToggleState(false);
diff --git a/indra/newview/llimfloater.h b/indra/newview/llimfloater.h
index 5158f6c1f7..f7cd35b5eb 100644
--- a/indra/newview/llimfloater.h
+++ b/indra/newview/llimfloater.h
@@ -145,8 +145,6 @@ private:
static void* createPanelIMControl(void* userdata);
static void* createPanelGroupControl(void* userdata);
static void* createPanelAdHocControl(void* userdata);
- // gets a rect that bounds possible positions for the LLIMFloater on a screen (EXT-1111)
- void getAllowedRect(LLRect& rect);
// Add the "User is typing..." indicator.
void addTypingIndicator(const LLIMInfo* im_info);
@@ -156,10 +154,6 @@ private:
static void closeHiddenIMToasts();
- static bool resetAllowedRectPadding();
- //need to keep this static for performance issues
- static S32 sAllowedRectRightPadding;
-
static void confirmLeaveCallCallback(const LLSD& notification, const LLSD& response);
LLPanelChatControlPanel* mControlPanel;
diff --git a/indra/newview/llimfloatercontainer.cpp b/indra/newview/llimfloatercontainer.cpp
index 33cb3a54a7..c8e48b0d42 100644
--- a/indra/newview/llimfloatercontainer.cpp
+++ b/indra/newview/llimfloatercontainer.cpp
@@ -47,12 +47,13 @@ LLIMFloaterContainer::LLIMFloaterContainer(const LLSD& seed)
LLIMFloaterContainer::~LLIMFloaterContainer()
{
+ mNewMessageConnection.disconnect();
LLTransientFloaterMgr::getInstance()->removeControlView(LLTransientFloaterMgr::IM, this);
}
BOOL LLIMFloaterContainer::postBuild()
{
- LLIMModel::instance().mNewMsgSignal.connect(boost::bind(&LLIMFloaterContainer::onNewMessageReceived, this, _1));
+ mNewMessageConnection = LLIMModel::instance().mNewMsgSignal.connect(boost::bind(&LLIMFloaterContainer::onNewMessageReceived, this, _1));
// Do not call base postBuild to not connect to mCloseSignal to not close all floaters via Close button
// mTabContainer will be initialized in LLMultiFloater::addChild()
return TRUE;
diff --git a/indra/newview/llimfloatercontainer.h b/indra/newview/llimfloatercontainer.h
index 53dfcd78ff..892ecef48d 100644
--- a/indra/newview/llimfloatercontainer.h
+++ b/indra/newview/llimfloatercontainer.h
@@ -62,7 +62,7 @@ public:
private:
typedef std::map<LLUUID,LLFloater*> avatarID_panel_map_t;
avatarID_panel_map_t mSessions;
-
+ boost::signals2::connection mNewMessageConnection;
void onNewMessageReceived(const LLSD& data);
};
diff --git a/indra/newview/llimpanel.cpp b/indra/newview/llimpanel.cpp
index b3b0c93b99..0250af6a0e 100644
--- a/indra/newview/llimpanel.cpp
+++ b/indra/newview/llimpanel.cpp
@@ -41,7 +41,6 @@
#include "llagent.h"
#include "llbutton.h"
-#include "llbottomtray.h"
#include "llcallingcard.h"
#include "llchannelmanager.h"
#include "llchat.h"
diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp
index 4de6976534..a856bd0bdc 100644
--- a/indra/newview/llimview.cpp
+++ b/indra/newview/llimview.cpp
@@ -46,7 +46,6 @@
#include "llagentui.h"
#include "llappviewer.h"
#include "llavatariconctrl.h"
-#include "llbottomtray.h"
#include "llcallingcard.h"
#include "llchat.h"
#include "llimfloater.h"
@@ -61,6 +60,7 @@
#include "llnearbychat.h"
#include "llspeakers.h" //for LLIMSpeakerMgr
#include "lltextbox.h"
+#include "lltoolbarview.h"
#include "llviewercontrol.h"
#include "llviewerparcelmgr.h"
@@ -1675,27 +1675,48 @@ LLCallDialog::~LLCallDialog()
LLUI::removePopup(this);
}
-void LLCallDialog::getAllowedRect(LLRect& rect)
+BOOL LLCallDialog::postBuild()
{
- rect = gViewerWindow->getWorldViewRectScaled();
+ if (!LLDockableFloater::postBuild() || !gToolBarView)
+ return FALSE;
+
+ dockToToolbarButton("speak");
+
+ return TRUE;
}
-BOOL LLCallDialog::postBuild()
+void LLCallDialog::dockToToolbarButton(const std::string& toolbarButtonName)
{
- if (!LLDockableFloater::postBuild())
- return FALSE;
+ LLDockControl::DocAt dock_pos = getDockControlPos(toolbarButtonName);
+ LLView *anchor_panel = gToolBarView->findChildView(toolbarButtonName);
- // dock the dialog to the Speak Button, where other sys messages appear
- LLView *anchor_panel = LLBottomTray::getInstance()->getChild<LLView>("speak_panel");
+ setUseTongue(anchor_panel);
- setDockControl(new LLDockControl(
- anchor_panel, this,
- getDockTongue(), LLDockControl::TOP,
- boost::bind(&LLCallDialog::getAllowedRect, this, _1)));
+ setDockControl(new LLDockControl(anchor_panel, this, getDockTongue(dock_pos), dock_pos));
+}
- return TRUE;
+LLDockControl::DocAt LLCallDialog::getDockControlPos(const std::string& toolbarButtonName)
+{
+ LLCommandId command_id(toolbarButtonName);
+ S32 toolbar_loc = gToolBarView->hasCommand(command_id);
+
+ LLDockControl::DocAt doc_at = LLDockControl::TOP;
+
+ switch (toolbar_loc)
+ {
+ case LLToolBarView::TOOLBAR_LEFT:
+ doc_at = LLDockControl::RIGHT;
+ break;
+
+ case LLToolBarView::TOOLBAR_RIGHT:
+ doc_at = LLDockControl::LEFT;
+ break;
+ }
+
+ return doc_at;
}
+
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Class LLOutgoingCallDialog
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -2382,15 +2403,6 @@ void LLIMMgr::addMessage(
bool link_name) // If this is true, then we insert the name and link it to a profile
{
LLUUID other_participant_id = target_id;
-
- // don't process muted IMs
- if (LLMuteList::getInstance()->isMuted(
- other_participant_id,
- LLMute::flagTextChat) && !LLMuteList::getInstance()->isLinden(from))
- {
- return;
- }
-
LLUUID new_session_id = session_id;
if (new_session_id.isNull())
{
@@ -2431,10 +2443,25 @@ void LLIMMgr::addMessage(
LLIMModel::instance().addMessage(new_session_id, from, other_participant_id, bonus_info.str());
}
+ // Logically it would make more sense to reject the session sooner, in another area of the
+ // code, but the session has to be established inside the server before it can be left.
+ if (LLMuteList::getInstance()->isMuted(other_participant_id) && !LLMuteList::getInstance()->isLinden(from))
+ {
+ llwarns << "Leaving IM session from initiating muted resident " << from << llendl;
+ if(!gIMMgr->leaveSession(new_session_id))
+ {
+ llinfos << "Session " << new_session_id << " does not exist." << llendl;
+ }
+ return;
+ }
+
make_ui_sound("UISndNewIncomingIMSession");
}
- LLIMModel::instance().addMessage(new_session_id, from, other_participant_id, msg);
+ if (!LLMuteList::getInstance()->isMuted(other_participant_id, LLMute::flagTextChat))
+ {
+ LLIMModel::instance().addMessage(new_session_id, from, other_participant_id, msg);
+ }
}
void LLIMMgr::addSystemMessage(const LLUUID& session_id, const std::string& message_name, const LLSD& args)
@@ -2449,8 +2476,10 @@ void LLIMMgr::addSystemMessage(const LLUUID& session_id, const std::string& mess
LLChat chat(message);
chat.mSourceType = CHAT_SOURCE_SYSTEM;
+
+ LLFloater* chat_bar = LLFloaterReg::getInstance("chat_bar");
+ LLNearbyChat* nearby_chat = chat_bar->findChild<LLNearbyChat>("nearby_chat");
- LLNearbyChat* nearby_chat = LLFloaterReg::getTypedInstance<LLNearbyChat>("nearby_chat", LLSD());
if(nearby_chat)
{
nearby_chat->addMessage(chat);
@@ -2638,18 +2667,15 @@ void LLIMMgr::inviteToSession(
const std::string& session_handle,
const std::string& session_uri)
{
- //ignore invites from muted residents
- if (LLMuteList::getInstance()->isMuted(caller_id))
- {
- return;
- }
-
std::string notify_box_type;
// voice invite question is different from default only for group call (EXT-7118)
std::string question_type = "VoiceInviteQuestionDefault";
BOOL ad_hoc_invite = FALSE;
BOOL voice_invite = FALSE;
+ bool is_linden = LLMuteList::getInstance()->isLinden(caller_name);
+
+
if(type == IM_SESSION_P2P_INVITE)
{
//P2P is different...they only have voice invitations
@@ -2688,7 +2714,18 @@ void LLIMMgr::inviteToSession(
payload["session_uri"] = session_uri;
payload["notify_box_type"] = notify_box_type;
payload["question_type"] = question_type;
-
+
+ //ignore invites from muted residents
+ if (LLMuteList::getInstance()->isMuted(caller_id) && !is_linden)
+ {
+ if (voice_invite && "VoiceInviteQuestionDefault" == question_type)
+ {
+ llinfos << "Rejecting voice call from initiating muted resident " << caller_name << llendl;
+ LLIncomingCallDialog::processCallResponse(1, payload);
+ }
+ return;
+ }
+
LLVoiceChannel* channelp = LLVoiceChannel::getChannelByID(session_id);
if (channelp && channelp->callStarted())
{
@@ -3211,7 +3248,7 @@ public:
chat.mFromID = from_id;
chat.mFromName = name;
- if (!is_linden && (is_busy || is_muted))
+ if (!is_linden && is_busy)
{
return;
}
@@ -3243,6 +3280,11 @@ public:
ll_vector3_from_sd(message_params["position"]),
true);
+ if (LLMuteList::getInstance()->isMuted(from_id, name, LLMute::flagTextChat))
+ {
+ return;
+ }
+
//K now we want to accept the invitation
std::string url = gAgent.getRegion()->getCapability(
"ChatSessionRequest");
diff --git a/indra/newview/llimview.h b/indra/newview/llimview.h
index 0ee56c8070..b1be26a169 100644
--- a/indra/newview/llimview.h
+++ b/indra/newview/llimview.h
@@ -491,14 +491,16 @@ class LLCallDialog : public LLDockableFloater
{
public:
LLCallDialog(const LLSD& payload);
- ~LLCallDialog();
+ virtual ~LLCallDialog();
virtual BOOL postBuild();
+ void dockToToolbarButton(const std::string& toolbarButtonName);
+
// check timer state
/*virtual*/ void draw();
/*virtual*/ void onOpen(const LLSD& key);
-
+
protected:
// lifetime timer for a notification
LLTimer mLifetimeTimer;
@@ -508,8 +510,6 @@ protected:
virtual bool lifetimeHasExpired();
virtual void onLifetimeExpired();
- virtual void getAllowedRect(LLRect& rect);
-
/**
* Sets icon depend on session.
*
@@ -521,6 +521,9 @@ protected:
void setIcon(const LLSD& session_id, const LLSD& participant_id);
LLSD mPayload;
+
+private:
+ LLDockControl::DocAt getDockControlPos(const std::string& toolbarButtonName);
};
class LLIncomingCallDialog : public LLCallDialog
diff --git a/indra/newview/llinspectobject.cpp b/indra/newview/llinspectobject.cpp
index ee076f68ea..acc139c569 100644
--- a/indra/newview/llinspectobject.cpp
+++ b/indra/newview/llinspectobject.cpp
@@ -28,6 +28,7 @@
#include "llinspectobject.h"
// Viewer
+#include "llfloatersidepanelcontainer.h"
#include "llinspect.h"
#include "llmediaentry.h"
#include "llnotificationsutil.h" // *TODO: Eliminate, add LLNotificationsUtil wrapper
@@ -45,7 +46,6 @@
#include "llmenubutton.h"
#include "llresmgr.h" // getMonetaryString
#include "llsafehandle.h"
-#include "llsidetray.h"
#include "lltextbox.h" // for description truncation
#include "lltoggleablemenu.h"
#include "lltrans.h"
@@ -640,7 +640,7 @@ void LLInspectObject::onClickMoreInfo()
{
LLSD key;
key["task"] = "task";
- LLSideTray::getInstance()->showPanel("sidepanel_inventory", key);
+ LLFloaterSidePanelContainer::showPanel("inventory", key);
closeFloater();
}
diff --git a/indra/newview/llinspectremoteobject.cpp b/indra/newview/llinspectremoteobject.cpp
index bf6cf52298..a12ec390af 100644
--- a/indra/newview/llinspectremoteobject.cpp
+++ b/indra/newview/llinspectremoteobject.cpp
@@ -60,12 +60,10 @@ public:
private:
void update();
- void onNameCache(const LLUUID& id, const std::string& name, bool is_group);
private:
LLUUID mObjectID;
LLUUID mOwnerID;
- std::string mOwnerLegacyName;
std::string mSLurl;
std::string mName;
bool mGroupOwned;
@@ -75,7 +73,6 @@ LLInspectRemoteObject::LLInspectRemoteObject(const LLSD& sd) :
LLInspect(LLSD()),
mObjectID(NULL),
mOwnerID(NULL),
- mOwnerLegacyName(),
mSLurl(""),
mName(""),
mGroupOwned(false)
@@ -111,14 +108,6 @@ void LLInspectRemoteObject::onOpen(const LLSD& data)
mGroupOwned = data["group_owned"].asBoolean();
mSLurl = data["slurl"].asString();
- // work out the owner's name
- mOwnerLegacyName = "";
- if (gCacheName)
- {
- gCacheName->get(mOwnerID, mGroupOwned, // muting
- boost::bind(&LLInspectRemoteObject::onNameCache, this, _1, _2, _3));
- }
-
// update the inspector with the current object state
update();
@@ -144,8 +133,7 @@ void LLInspectRemoteObject::onClickMap()
void LLInspectRemoteObject::onClickBlock()
{
- LLMute::EType mute_type = mGroupOwned ? LLMute::GROUP : LLMute::AGENT;
- LLMute mute(mOwnerID, mOwnerLegacyName, mute_type);
+ LLMute mute(mObjectID, mName, LLMute::OBJECT);
LLMuteList::getInstance()->add(mute);
LLPanelBlockedList::showPanelAndSelect(mute.mID);
closeFloater();
@@ -156,12 +144,6 @@ void LLInspectRemoteObject::onClickClose()
closeFloater();
}
-void LLInspectRemoteObject::onNameCache(const LLUUID& id, const std::string& name, bool is_group)
-{
- mOwnerLegacyName = name;
- update();
-}
-
void LLInspectRemoteObject::update()
{
// show the object name as the inspector's title
@@ -198,8 +180,8 @@ void LLInspectRemoteObject::update()
// disable the Map button if we don't have a SLurl
getChild<LLUICtrl>("map_btn")->setEnabled(! mSLurl.empty());
- // disable the Block button if we don't have the owner ID
- getChild<LLUICtrl>("block_btn")->setEnabled(! mOwnerID.isNull());
+ // disable the Block button if we don't have the object ID (will this ever happen?)
+ getChild<LLUICtrl>("block_btn")->setEnabled(! mObjectID.isNull());
}
//////////////////////////////////////////////////////////////////////////////
diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp
index a36aa3dedf..c0065a94e6 100644
--- a/indra/newview/llinventorybridge.cpp
+++ b/indra/newview/llinventorybridge.cpp
@@ -39,6 +39,7 @@
#include "llavataractions.h"
#include "llfloateropenobject.h"
#include "llfloaterreg.h"
+#include "llfloatersidepanelcontainer.h"
#include "llfloaterworldmap.h"
#include "llfolderview.h"
#include "llfriendcard.h"
@@ -52,6 +53,7 @@
#include "llinventorymodel.h"
#include "llinventorymodelbackgroundfetch.h"
#include "llinventorypanel.h"
+#include "llmarketplacefunctions.h"
#include "llnotifications.h"
#include "llnotificationsutil.h"
#include "llpreviewanim.h"
@@ -59,7 +61,7 @@
#include "llpreviewtexture.h"
#include "llselectmgr.h"
#include "llsidepanelappearance.h"
-#include "llsidetray.h"
+#include "lltooldraganddrop.h"
#include "lltrans.h"
#include "llviewerassettype.h"
#include "llviewerfoldertype.h"
@@ -71,7 +73,9 @@
#include "llwearablelist.h"
// Marketplace outbox current disabled
-#define ENABLE_MERCHANT_OUTBOX_CONTEXT_MENU 0 // keep in sync with ENABLE_INVENTORY_DISPLAY_OUTBOX, ENABLE_MERCHANT_OUTBOX_PANEL
+#define ENABLE_MERCHANT_OUTBOX_CONTEXT_MENU 1
+#define ENABLE_MERCHANT_SEND_TO_MARKETPLACE_CONTEXT_MENU 0
+#define BLOCK_WORN_ITEMS_IN_OUTBOX 1
typedef std::pair<LLUUID, LLUUID> two_uuids_t;
typedef std::list<two_uuids_t> two_uuids_list_t;
@@ -127,6 +131,11 @@ bool isMarketplaceCopyAction(const std::string& action)
return (("copy_to_outbox" == action) || ("move_to_outbox" == action));
}
+bool isMarketplaceSendAction(const std::string& action)
+{
+ return ("send_to_marketplace" == action);
+}
+
// +=================================================+
// | LLInvFVBridge |
// +=================================================+
@@ -462,14 +471,13 @@ BOOL LLInvFVBridge::isClipboardPasteableAsLink() const
void hide_context_entries(LLMenuGL& menu,
const menuentry_vec_t &entries_to_show,
- const menuentry_vec_t &disabled_entries,
- BOOL append) // If append is TRUE, then new enabled entries
+ const menuentry_vec_t &disabled_entries)
{
const LLView::child_list_t *list = menu.getChildList();
// 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;
+ bool is_previous_entry_separator = true;
for (LLView::child_list_t::const_iterator itor = list->begin();
itor != list->end();
@@ -485,7 +493,6 @@ void hide_context_entries(LLMenuGL& menu,
hide_context_entries(*branchp->getBranch(), entries_to_show, disabled_entries);
}
-
bool found = false;
menuentry_vec_t::const_iterator itor2;
for (itor2 = entries_to_show.begin(); itor2 != entries_to_show.end(); ++itor2)
@@ -493,6 +500,7 @@ void hide_context_entries(LLMenuGL& menu,
if (*itor2 == name)
{
found = true;
+ break;
}
}
@@ -500,9 +508,8 @@ void hide_context_entries(LLMenuGL& menu,
// between two separators).
if (found)
{
- const BOOL is_entry_separator = (dynamic_cast<LLMenuItemSeparatorGL *>(menu_item) != NULL);
- if (is_entry_separator && is_previous_entry_separator)
- found = false;
+ const bool is_entry_separator = (dynamic_cast<LLMenuItemSeparatorGL *>(menu_item) != NULL);
+ found = !(is_entry_separator && is_previous_entry_separator);
is_previous_entry_separator = is_entry_separator;
}
@@ -512,6 +519,7 @@ void hide_context_entries(LLMenuGL& menu,
{
menu_item->setVisible(FALSE);
}
+
menu_item->setEnabled(FALSE);
}
else
@@ -520,17 +528,14 @@ void hide_context_entries(LLMenuGL& menu,
// A bit of a hack so we can remember that some UI element explicitly set this to be visible
// so that some other UI element from multi-select doesn't later set this invisible.
menu_item->pushVisible(TRUE);
- if (append)
- {
- menu_item->setEnabled(TRUE);
- }
- for (itor2 = disabled_entries.begin(); itor2 != disabled_entries.end(); ++itor2)
+
+ bool enabled = (menu_item->getEnabled() == TRUE);
+ for (itor2 = disabled_entries.begin(); enabled && (itor2 != disabled_entries.end()); ++itor2)
{
- if (*itor2 == name)
- {
- menu_item->setEnabled(FALSE);
- }
+ enabled &= (*itor2 != name);
}
+
+ menu_item->setEnabled(enabled);
}
}
}
@@ -598,25 +603,16 @@ void LLInvFVBridge::getClipboardEntries(bool show_asset_id,
{
items.push_back(std::string("Marketplace Separator"));
- bool copyable = true;
- LLViewerInventoryItem* inv_item = gInventory.getItem(mUUID);
- if (inv_item)
- {
- copyable = inv_item->getPermissions().allowCopyBy(gAgent.getID());
- }
-
- const std::string merchant_action = ((copyable == true) ? "Merchant Copy" : "Merchant Move");
- items.push_back(merchant_action);
-
+ items.push_back(std::string("Merchant Copy"));
if (!canListOnMarketplaceNow())
{
- disabled_items.push_back(merchant_action);
+ disabled_items.push_back(std::string("Merchant Copy"));
}
}
}
}
- // Don't allow items to be pasted directly into the COF or the inbox
+ // Don't allow items to be pasted directly into the COF or the inbox/outbox
if (!isCOFFolder() && !isInboxFolder() && !isOutboxFolder())
{
items.push_back(std::string("Paste"));
@@ -657,7 +653,7 @@ void LLInvFVBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
}
else if(isOutboxFolder())
{
- items.push_back(std::string("Delete"));
+ addOutboxContextMenuOptions(flags, items, disabled_items);
}
else
{
@@ -734,6 +730,32 @@ void LLInvFVBridge::addOpenRightClickMenuOption(menuentry_vec_t &items)
items.push_back(std::string("Open"));
}
+void LLInvFVBridge::addOutboxContextMenuOptions(U32 flags,
+ menuentry_vec_t &items,
+ menuentry_vec_t &disabled_items)
+{
+ items.push_back(std::string("Rename"));
+ items.push_back(std::string("Delete"));
+
+ if ((flags & FIRST_SELECTED_ITEM) == 0)
+ {
+ disabled_items.push_back(std::string("Rename"));
+ }
+
+#if ENABLE_MERCHANT_SEND_TO_MARKETPLACE_CONTEXT_MENU
+ if (isOutboxFolderDirectParent())
+ {
+ items.push_back(std::string("Marketplace Separator"));
+ items.push_back(std::string("Marketplace Send"));
+
+ if ((flags & FIRST_SELECTED_ITEM) == 0)
+ {
+ disabled_items.push_back(std::string("Marketplace Send"));
+ }
+ }
+#endif // ENABLE_MERCHANT_SEND_TO_MARKETPLACE_CONTEXT_MENU
+}
+
// *TODO: remove this
BOOL LLInvFVBridge::startDrag(EDragAndDropType* type, LLUUID* id) const
{
@@ -854,6 +876,22 @@ BOOL LLInvFVBridge::isOutboxFolder() const
return gInventory.isObjectDescendentOf(mUUID, outbox_id);
}
+BOOL LLInvFVBridge::isOutboxFolderDirectParent() const
+{
+ BOOL outbox_is_parent = FALSE;
+
+ const LLInventoryCategory *cat = gInventory.getCategory(mUUID);
+
+ if (cat)
+ {
+ const LLUUID outbox_id = getOutboxFolder();
+
+ outbox_is_parent = (outbox_id.notNull() && (outbox_id == cat->getParentUUID()));
+ }
+
+ return outbox_is_parent;
+}
+
const LLUUID LLInvFVBridge::getOutboxFolder() const
{
const LLUUID outbox_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_OUTBOX, false, false);
@@ -1040,82 +1078,134 @@ void LLInvFVBridge::purgeItem(LLInventoryModel *model, const LLUUID &uuid)
}
}
-BOOL LLInvFVBridge::canShare() const
+bool LLInvFVBridge::canShare() const
{
- if (!isAgentInventory()) return FALSE;
-
- const LLInventoryModel* model = getInventoryModel();
- if (!model) return FALSE;
+ bool can_share = false;
- const LLViewerInventoryItem *item = model->getItem(mUUID);
- if (item)
+ if (isAgentInventory())
{
- if (!LLInventoryCollectFunctor::itemTransferCommonlyAllowed(item))
- return FALSE;
- return (BOOL)LLGiveInventory::isInventoryGiveAcceptable(item);
+ const LLInventoryModel* model = getInventoryModel();
+ if (model)
+ {
+ const LLViewerInventoryItem *item = model->getItem(mUUID);
+ if (item)
+ {
+ if (LLInventoryCollectFunctor::itemTransferCommonlyAllowed(item))
+ {
+ can_share = LLGiveInventory::isInventoryGiveAcceptable(item);
+ }
+ }
+ else
+ {
+ // Categories can be given.
+ can_share = (model->getCategory(mUUID) != NULL);
+ }
+ }
}
- // Categories can be given.
- if (model->getCategory(mUUID)) return TRUE;
-
- return FALSE;
+ return can_share;
}
-BOOL LLInvFVBridge::canListOnMarketplace() const
+bool LLInvFVBridge::canListOnMarketplace() const
{
#if ENABLE_MERCHANT_OUTBOX_CONTEXT_MENU
+
LLInventoryModel * model = getInventoryModel();
+
const LLViewerInventoryCategory * cat = model->getCategory(mUUID);
if (cat && LLFolderType::lookupIsProtectedType(cat->getPreferredType()))
{
- return FALSE;
+ return false;
}
if (!isAgentInventory())
{
- return FALSE;
+ return false;
}
if (getOutboxFolder().isNull())
{
- return FALSE;
+ return false;
}
if (isInboxFolder() || isOutboxFolder())
{
- return FALSE;
+ return false;
}
-
+
LLViewerInventoryItem * item = model->getItem(mUUID);
- if (item && !item->getPermissions().allowOperationBy(PERM_TRANSFER, gAgent.getID()))
+ if (item)
{
- return FALSE;
+ if (!item->getPermissions().allowOperationBy(PERM_TRANSFER, gAgent.getID()))
+ {
+ return false;
+ }
+
+ if (LLAssetType::AT_CALLINGCARD == item->getType())
+ {
+ return false;
+ }
}
- return TRUE;
+ return true;
+
#else
- return FALSE;
+ return false;
#endif
}
-BOOL LLInvFVBridge::canListOnMarketplaceNow() const
+bool LLInvFVBridge::canListOnMarketplaceNow() const
{
#if ENABLE_MERCHANT_OUTBOX_CONTEXT_MENU
- if (get_is_item_worn(mUUID))
+
+ bool can_list = true;
+
+ // Do not allow listing while import is in progress
+ if (LLMarketplaceInventoryImporter::instanceExists())
{
- return FALSE;
+ can_list = !LLMarketplaceInventoryImporter::instance().isImportInProgress();
}
+
+ const LLInventoryObject* obj = getInventoryObject();
+ can_list &= (obj != NULL);
- // Loop through all items worn by avatar and check to see if they are descendants
- // of the item we are trying to list on the marketplace
- if (get_is_parent_to_worn_item(mUUID))
+ if (can_list)
{
- return FALSE;
+ const LLUUID& object_id = obj->getLinkedUUID();
+ can_list = object_id.notNull();
+
+ if (can_list)
+ {
+ LLFolderViewFolder * object_folderp = mRoot->getFolderByID(object_id);
+ if (object_folderp)
+ {
+ can_list = !object_folderp->isLoading();
+ }
+ }
+
+ if (can_list)
+ {
+ // Get outbox id
+ const LLUUID & outbox_id = getInventoryModel()->findCategoryUUIDForType(LLFolderType::FT_OUTBOX, false);
+ LLFolderViewItem * outbox_itemp = mRoot->getItemByID(outbox_id);
+
+ if (outbox_itemp)
+ {
+ MASK mask = 0x0;
+ BOOL drop = FALSE;
+ EDragAndDropType cargo_type = LLViewerAssetType::lookupDragAndDropType(obj->getActualType());
+ void * cargo_data = (void *) obj;
+ std::string tooltip_msg;
+
+ can_list = outbox_itemp->getListener()->dragOrDrop(mask, drop, cargo_type, cargo_data, tooltip_msg);
+ }
+ }
}
+
+ return can_list;
- return TRUE;
#else
- return FALSE;
+ return false;
#endif
}
@@ -1185,7 +1275,7 @@ void LLItemBridge::performAction(LLInventoryModel* model, std::string action)
std::string buffer;
asset_id.toString(buffer);
- gViewerWindow->mWindow->copyTextToClipboard(utf8str_to_wstring(buffer));
+ gViewerWindow->getWindow()->copyTextToClipboard(utf8str_to_wstring(buffer));
return;
}
else if ("copy" == action)
@@ -1225,7 +1315,7 @@ void LLItemBridge::performAction(LLInventoryModel* model, std::string action)
if (!itemp) return;
const LLUUID outbox_id = getInventoryModel()->findCategoryUUIDForType(LLFolderType::FT_OUTBOX, false, false);
- copy_item_to_outbox(itemp, outbox_id, LLUUID::null);
+ copy_item_to_outbox(itemp, outbox_id, LLUUID::null, LLToolDragAndDrop::getOperationId());
}
}
@@ -1235,6 +1325,7 @@ void LLItemBridge::selectItem()
if(item && !item->isFinished())
{
item->fetchFromServer();
+ //LLInventoryModelBackgroundFetch::instance().start(item->getUUID(), false);
}
}
@@ -1376,16 +1467,17 @@ std::string LLItemBridge::getLabelSuffix() const
LLInventoryItem* item = getItem();
if(item)
{
- // it's a bit confusing to put nocopy/nomod/etc on calling cards.
+ // Any type can have the link suffix...
+ BOOL broken_link = LLAssetType::lookupIsLinkType(item->getType());
+ if (broken_link) return BROKEN_LINK;
+
+ BOOL link = item->getIsLinkType();
+ if (link) return LINK;
+
+ // ...but it's a bit confusing to put nocopy/nomod/etc suffixes on calling cards.
if(LLAssetType::AT_CALLINGCARD != item->getType()
&& item->getPermissions().getOwner() == gAgent.getID())
{
- BOOL broken_link = LLAssetType::lookupIsLinkType(item->getType());
- if (broken_link) return BROKEN_LINK;
-
- BOOL link = item->getIsLinkType();
- if (link) return LINK;
-
BOOL copy = item->getPermissions().allowCopyBy(gAgent.getID());
if (!copy)
{
@@ -1563,11 +1655,7 @@ BOOL LLItemBridge::isItemCopyable() const
return FALSE;
}
- // All items can be copied in god mode since you can
- // at least paste-as-link the item, though you
- // still may not be able paste the item.
- return TRUE;
- // return (item->getPermissions().allowCopyBy(gAgent.getID()));
+ return item->getPermissions().allowCopyBy(gAgent.getID()) || gSavedSettings.getBOOL("InventoryLinking");
}
return FALSE;
}
@@ -1680,12 +1768,8 @@ BOOL LLFolderBridge::isUpToDate() const
BOOL LLFolderBridge::isItemCopyable() const
{
- if (gSavedSettings.getBOOL("InventoryLinking"))
- {
- // Can copy folders to paste-as-link, but not for straight paste.
- return TRUE;
- }
- return FALSE;
+ // Can copy folders to paste-as-link, but not for straight paste.
+ return gSavedSettings.getBOOL("InventoryLinking");
}
BOOL LLFolderBridge::copyToClipboard() const
@@ -1786,30 +1870,41 @@ BOOL LLFolderBridge::isClipboardPasteableAsLink() const
static BOOL can_move_to_outbox(LLInventoryItem* inv_item, std::string& tooltip_msg)
{
- bool worn = get_is_item_worn(inv_item->getUUID());
+ // Collapse links directly to items/folders
+ LLViewerInventoryItem * viewer_inv_item = (LLViewerInventoryItem *) inv_item;
+ LLViewerInventoryItem * linked_item = viewer_inv_item->getLinkedItem();
+ if (linked_item != NULL)
+ {
+ inv_item = linked_item;
+ }
+
bool allow_transfer = inv_item->getPermissions().allowOperationBy(PERM_TRANSFER, gAgent.getID());
-
if (!allow_transfer)
{
tooltip_msg = LLTrans::getString("TooltipOutboxNoTransfer");
+ return false;
}
- else if(worn)
+
+#if BLOCK_WORN_ITEMS_IN_OUTBOX
+ bool worn = get_is_item_worn(inv_item->getUUID());
+ if (worn)
{
tooltip_msg = LLTrans::getString("TooltipOutboxWorn");
+ return false;
}
+#endif
- return !worn && allow_transfer;
-}
-
-
-
-void LLFolderBridge::dropFolderToOutbox(LLInventoryCategory* inv_cat)
-{
- copy_folder_to_outbox(inv_cat, getInventoryModel()->findCategoryUUIDForType(LLFolderType::FT_OUTBOX, false), inv_cat->getUUID());
+ bool calling_card = (LLAssetType::AT_CALLINGCARD == inv_item->getType());
+ if (calling_card)
+ {
+ tooltip_msg = LLTrans::getString("TooltipOutboxCallingCard");
+ return false;
+ }
+
+ return true;
}
-
int get_folder_levels(LLInventoryCategory* inv_cat)
{
LLInventoryModel::cat_array_t* cats;
@@ -1864,54 +1959,78 @@ BOOL LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat,
if (!isAgentAvatarValid()) return FALSE;
if (!isAgentInventory()) return FALSE; // cannot drag categories into library
+ const LLUUID &cat_id = inv_cat->getUUID();
+ const LLUUID &current_outfit_id = model->findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT, false);
+ const LLUUID &outbox_id = model->findCategoryUUIDForType(LLFolderType::FT_OUTBOX, false);
+
+ const BOOL move_is_into_current_outfit = (mUUID == current_outfit_id);
+ const BOOL move_is_into_outbox = model->isObjectDescendentOf(mUUID, outbox_id);
+ const BOOL move_is_from_outbox = model->isObjectDescendentOf(cat_id, outbox_id);
// check to make sure source is agent inventory, and is represented there.
LLToolDragAndDrop::ESource source = LLToolDragAndDrop::getInstance()->getSource();
- const BOOL is_agent_inventory = (model->getCategory(inv_cat->getUUID()) != NULL)
+ const BOOL is_agent_inventory = (model->getCategory(cat_id) != NULL)
&& (LLToolDragAndDrop::SOURCE_AGENT == source);
- const LLUUID &current_outfit_id = model->findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT, false);
- const BOOL move_is_into_current_outfit = (mUUID == current_outfit_id);
-
BOOL accept = FALSE;
if (is_agent_inventory)
{
- const LLUUID &cat_id = inv_cat->getUUID();
const LLUUID &trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH, false);
const LLUUID &landmarks_id = model->findCategoryUUIDForType(LLFolderType::FT_LANDMARK, false);
- const LLUUID &outbox_id = model->findCategoryUUIDForType(LLFolderType::FT_OUTBOX, false);
const BOOL move_is_into_trash = (mUUID == trash_id) || model->isObjectDescendentOf(mUUID, trash_id);
const BOOL move_is_into_outfit = getCategory() && (getCategory()->getPreferredType() == LLFolderType::FT_OUTFIT);
const BOOL move_is_into_landmarks = (mUUID == landmarks_id) || model->isObjectDescendentOf(mUUID, landmarks_id);
- const BOOL move_is_into_outbox = model->isObjectDescendentOf(mUUID, outbox_id);
- const BOOL move_is_from_outbox = model->isObjectDescendentOf(inv_cat->getUUID(), outbox_id);
//--------------------------------------------------------------------------------
// Determine if folder can be moved.
//
BOOL is_movable = TRUE;
- if (LLFolderType::lookupIsProtectedType(inv_cat->getPreferredType()))
+
+ if (is_movable && (mUUID == cat_id))
+ {
+ is_movable = FALSE;
+ tooltip_msg = LLTrans::getString("TooltipDragOntoSelf");
+ }
+ if (is_movable && (model->isObjectDescendentOf(mUUID, cat_id)))
+ {
is_movable = FALSE;
- if (move_is_into_outfit)
+ tooltip_msg = LLTrans::getString("TooltipDragOntoOwnChild");
+ }
+ if (is_movable && LLFolderType::lookupIsProtectedType(inv_cat->getPreferredType()))
+ {
is_movable = FALSE;
- if (mUUID == gInventory.findCategoryUUIDForType(LLFolderType::FT_FAVORITE))
+ // tooltip?
+ }
+ if (is_movable && move_is_into_outfit)
+ {
is_movable = FALSE;
+ // tooltip?
+ }
+ if (is_movable && (mUUID == model->findCategoryUUIDForType(LLFolderType::FT_FAVORITE)))
+ {
+ is_movable = FALSE;
+ // tooltip?
+ }
+
LLInventoryModel::cat_array_t descendent_categories;
LLInventoryModel::item_array_t descendent_items;
- gInventory.collectDescendents(cat_id, descendent_categories, descendent_items, FALSE);
- for (S32 i=0; i < descendent_categories.count(); ++i)
+ if (is_movable)
{
- LLInventoryCategory* category = descendent_categories[i];
- if(LLFolderType::lookupIsProtectedType(category->getPreferredType()))
+ model->collectDescendents(cat_id, descendent_categories, descendent_items, FALSE);
+ for (S32 i=0; i < descendent_categories.count(); ++i)
{
- // Can't move "special folders" (e.g. Textures Folder).
- is_movable = FALSE;
- break;
+ LLInventoryCategory* category = descendent_categories[i];
+ if(LLFolderType::lookupIsProtectedType(category->getPreferredType()))
+ {
+ // Can't move "special folders" (e.g. Textures Folder).
+ is_movable = FALSE;
+ break;
+ }
}
}
- if (move_is_into_trash)
+ if (is_movable && move_is_into_trash)
{
for (S32 i=0; i < descendent_items.count(); ++i)
{
@@ -1923,7 +2042,7 @@ BOOL LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat,
}
}
}
- if (move_is_into_landmarks)
+ if (is_movable && move_is_into_landmarks)
{
for (S32 i=0; i < descendent_items.count(); ++i)
{
@@ -1938,35 +2057,100 @@ BOOL LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat,
}
}
}
- if (move_is_into_outbox)
+ if (is_movable && move_is_into_outbox)
{
- for (S32 i=0; i < descendent_items.count(); ++i)
+ const int nested_folder_levels = get_folder_path_length(outbox_id, mUUID) + get_folder_levels(inv_cat);
+
+ if (nested_folder_levels > gSavedSettings.getU32("InventoryOutboxMaxFolderDepth"))
{
- LLInventoryItem* item = descendent_items[i];
- if (!can_move_to_outbox(item, tooltip_msg))
- {
- is_movable = FALSE;
- break;
- }
+ tooltip_msg = LLTrans::getString("TooltipOutboxFolderLevels");
+ is_movable = FALSE;
}
+ else
+ {
+ int dragged_folder_count = descendent_categories.count();
+ int existing_item_count = 0;
+ int existing_folder_count = 0;
+
+ const LLViewerInventoryCategory * master_folder = model->getFirstDescendantOf(outbox_id, mUUID);
+
+ if (master_folder != NULL)
+ {
+ if (model->isObjectDescendentOf(cat_id, master_folder->getUUID()))
+ {
+ // Don't use count because we're already inside the same category anyway
+ dragged_folder_count = 0;
+ }
+ else
+ {
+ existing_folder_count = 1; // Include the master folder in the count!
+
+ // If we're in the drop operation as opposed to the drag without drop, we are doing a
+ // single category at a time so don't block based on the total amount of cargo data items
+ if (drop)
+ {
+ dragged_folder_count += 1;
+ }
+ else
+ {
+ // NOTE: The cargo id's count is a total of categories AND items but we err on the side of
+ // prevention rather than letting too many folders into the hierarchy of the outbox,
+ // when we're dragging the item to a new parent
+ dragged_folder_count += LLToolDragAndDrop::instance().getCargoIDsCount();
+ }
+ }
+
+ // Tally the total number of categories and items inside the master folder
- int nested_folder_levels = get_folder_path_length(outbox_id, mUUID) + get_folder_levels(inv_cat);
+ LLInventoryModel::cat_array_t existing_categories;
+ LLInventoryModel::item_array_t existing_items;
- if (nested_folder_levels > 4)
- {
- tooltip_msg = LLTrans::getString("TooltipOutboxFolderLevels");
- is_movable = FALSE;
+ model->collectDescendents(master_folder->getUUID(), existing_categories, existing_items, FALSE);
+
+ existing_folder_count += existing_categories.count();
+ existing_item_count += existing_items.count();
+ }
+ else
+ {
+ // Assume a single category is being dragged to the outbox since we evaluate one at a time
+ // when not putting them under a parent item.
+ dragged_folder_count += 1;
+ }
+
+ const int nested_folder_count = existing_folder_count + dragged_folder_count;
+ const int nested_item_count = existing_item_count + descendent_items.count();
+
+ if (nested_folder_count > gSavedSettings.getU32("InventoryOutboxMaxFolderCount"))
+ {
+ tooltip_msg = LLTrans::getString("TooltipOutboxTooManyFolders");
+ is_movable = FALSE;
+ }
+ else if (nested_item_count > gSavedSettings.getU32("InventoryOutboxMaxItemCount"))
+ {
+ tooltip_msg = LLTrans::getString("TooltipOutboxTooManyObjects");
+ is_movable = FALSE;
+ }
+
+ if (is_movable == TRUE)
+ {
+ for (S32 i=0; i < descendent_items.count(); ++i)
+ {
+ LLInventoryItem* item = descendent_items[i];
+ if (!can_move_to_outbox(item, tooltip_msg))
+ {
+ is_movable = FALSE;
+ break;
+ }
+ }
+ }
}
-
}
//
//--------------------------------------------------------------------------------
- accept = is_movable
- && (mUUID != cat_id) // Can't move a folder into itself
- && (mUUID != inv_cat->getParentUUID()) // Avoid moves that would change nothing
- && !(model->isObjectDescendentOf(mUUID, cat_id)); // Avoid circularity
+ accept = is_movable;
+
if (accept && drop)
{
// Look for any gestures and deactivate them
@@ -1998,7 +2182,7 @@ BOOL LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat,
// Recursively create links in target outfit.
LLInventoryModel::cat_array_t cats;
LLInventoryModel::item_array_t items;
- gInventory.collectDescendents(inv_cat->getUUID(), cats, items, LLInventoryModel::EXCLUDE_TRASH);
+ model->collectDescendents(cat_id, cats, items, LLInventoryModel::EXCLUDE_TRASH);
LLAppearanceMgr::instance().linkAll(mUUID,items,NULL);
}
}
@@ -2016,7 +2200,7 @@ BOOL LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat,
const std::string empty_description = "";
link_inventory_item(
gAgent.getID(),
- inv_cat->getUUID(),
+ cat_id,
mUUID,
inv_cat->getName(),
empty_description,
@@ -2026,15 +2210,15 @@ BOOL LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat,
#endif
}
}
- if (move_is_into_outbox && !move_is_from_outbox)
+ else if (move_is_into_outbox && !move_is_from_outbox)
{
- dropFolderToOutbox(inv_cat);
+ copy_folder_to_outbox(inv_cat, mUUID, cat_id, LLToolDragAndDrop::getOperationId());
}
else
{
- if (gInventory.isObjectDescendentOf(inv_cat->getUUID(), gInventory.findCategoryUUIDForType(LLFolderType::FT_INBOX, false, false)))
+ if (model->isObjectDescendentOf(cat_id, model->findCategoryUUIDForType(LLFolderType::FT_INBOX, false, false)))
{
- set_dad_inbox_object(inv_cat->getUUID());
+ set_dad_inbox_object(cat_id);
}
// Reparent the folder and restamp children if it's moving
@@ -2049,15 +2233,28 @@ BOOL LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat,
}
else if (LLToolDragAndDrop::SOURCE_WORLD == source)
{
- // content category has same ID as object itself
- LLUUID object_id = inv_cat->getUUID();
- LLUUID category_id = mUUID;
- accept = move_inv_category_world_to_agent(object_id, category_id, drop);
+ if (move_is_into_outbox)
+ {
+ tooltip_msg = LLTrans::getString("TooltipOutboxNotInInventory");
+ accept = FALSE;
+ }
+ else
+ {
+ accept = move_inv_category_world_to_agent(cat_id, mUUID, drop);
+ }
}
else if (LLToolDragAndDrop::SOURCE_LIBRARY == source)
{
- // Accept folders that contain complete outfits.
- accept = move_is_into_current_outfit && LLAppearanceMgr::instance().getCanMakeFolderIntoOutfit(inv_cat->getUUID());
+ if (move_is_into_outbox)
+ {
+ tooltip_msg = LLTrans::getString("TooltipOutboxNotInInventory");
+ accept = FALSE;
+ }
+ else
+ {
+ // Accept folders that contain complete outfits.
+ accept = move_is_into_current_outfit && LLAppearanceMgr::instance().getCanMakeFolderIntoOutfit(cat_id);
+ }
if (accept && drop)
{
@@ -2200,7 +2397,6 @@ public:
delete this;
}
-
protected:
LLUUID mCatID;
bool mCopyItems;
@@ -2304,15 +2500,15 @@ void LLRightClickInventoryFetchDescendentsObserver::done()
class LLInventoryCopyAndWearObserver : public LLInventoryObserver
{
public:
- LLInventoryCopyAndWearObserver(const LLUUID& cat_id, int count) :
- mCatID(cat_id), mContentsCount(count), mFolderAdded(FALSE) {}
+ LLInventoryCopyAndWearObserver(const LLUUID& cat_id, int count, bool folder_added=false) :
+ mCatID(cat_id), mContentsCount(count), mFolderAdded(folder_added) {}
virtual ~LLInventoryCopyAndWearObserver() {}
virtual void changed(U32 mask);
protected:
LLUUID mCatID;
int mContentsCount;
- BOOL mFolderAdded;
+ bool mFolderAdded;
};
@@ -2340,7 +2536,6 @@ void LLInventoryCopyAndWearObserver::changed(U32 mask)
if (mFolderAdded)
{
LLViewerInventoryCategory* category = gInventory.getCategory(mCatID);
-
if (NULL == category)
{
llwarns << "gInventory.getCategory(" << mCatID
@@ -2450,8 +2645,19 @@ void LLFolderBridge::performAction(LLInventoryModel* model, std::string action)
if (!cat) return;
const LLUUID outbox_id = getInventoryModel()->findCategoryUUIDForType(LLFolderType::FT_OUTBOX, false, false);
- copy_folder_to_outbox(cat, outbox_id, cat->getUUID());
+ copy_folder_to_outbox(cat, outbox_id, cat->getUUID(), LLToolDragAndDrop::getOperationId());
}
+#if ENABLE_MERCHANT_SEND_TO_MARKETPLACE_CONTEXT_MENU
+ else if (isMarketplaceSendAction(action))
+ {
+ llinfos << "Send to marketplace action!" << llendl;
+
+ LLInventoryCategory * cat = gInventory.getCategory(mUUID);
+ if (!cat) return;
+
+ send_to_marketplace(cat);
+ }
+#endif // ENABLE_MERCHANT_SEND_TO_MARKETPLACE_CONTEXT_MENU
}
void LLFolderBridge::openItem()
@@ -2718,103 +2924,10 @@ void LLFolderBridge::pasteLinkFromClipboard()
void LLFolderBridge::staticFolderOptionsMenu()
{
LLFolderBridge* selfp = sSelf.get();
- if (selfp)
- {
- selfp->folderOptionsMenu();
- }
-}
-
-void LLFolderBridge::folderOptionsMenu()
-{
- LLInventoryModel* model = getInventoryModel();
- if(!model) return;
-
- const LLInventoryCategory* category = model->getCategory(mUUID);
- if(!category) return;
-
- const LLUUID trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH);
- if (trash_id == mUUID) return;
- if (isItemInTrash()) return;
- if (!isAgentInventory()) return;
- if (isOutboxFolder()) return;
-
- LLFolderType::EType type = category->getPreferredType();
- const bool is_system_folder = LLFolderType::lookupIsProtectedType(type);
- // BAP change once we're no longer treating regular categories as ensembles.
- const bool is_ensemble = (type == LLFolderType::FT_NONE ||
- LLFolderType::lookupIsEnsembleType(type));
- // Only enable calling-card related options for non-system folders.
- if (!is_system_folder)
+ if (selfp && selfp->mRoot)
{
- LLIsType is_callingcard(LLAssetType::AT_CALLINGCARD);
- if (mCallingCards || checkFolderForContentsOfType(model, is_callingcard))
- {
- mItems.push_back(std::string("Calling Card Separator"));
- mItems.push_back(std::string("Conference Chat Folder"));
- mItems.push_back(std::string("IM All Contacts In Folder"));
- }
- }
-
- if (!isItemRemovable())
- {
- mDisabledItems.push_back(std::string("Delete"));
- }
-
-#ifndef LL_RELEASE_FOR_DOWNLOAD
- if (LLFolderType::lookupIsProtectedType(type))
- {
- mItems.push_back(std::string("Delete System Folder"));
- }
-#endif
-
- // wearables related functionality for folders.
- //is_wearable
- LLFindWearables is_wearable;
- LLIsType is_object( LLAssetType::AT_OBJECT );
- LLIsType is_gesture( LLAssetType::AT_GESTURE );
-
- if (mWearables ||
- checkFolderForContentsOfType(model, is_wearable) ||
- checkFolderForContentsOfType(model, is_object) ||
- checkFolderForContentsOfType(model, is_gesture) )
- {
- mItems.push_back(std::string("Folder Wearables Separator"));
-
- // Only enable add/replace outfit for non-system folders.
- if (!is_system_folder)
- {
- // Adding an outfit onto another (versus replacing) doesn't make sense.
- if (type != LLFolderType::FT_OUTFIT)
- {
- mItems.push_back(std::string("Add To Outfit"));
- }
-
- mItems.push_back(std::string("Replace Outfit"));
- }
- if (is_ensemble)
- {
- mItems.push_back(std::string("Wear As Ensemble"));
- }
- mItems.push_back(std::string("Remove From Outfit"));
- if (!LLAppearanceMgr::getCanRemoveFromCOF(mUUID))
- {
- mDisabledItems.push_back(std::string("Remove From Outfit"));
- }
- if (!LLAppearanceMgr::instance().getCanReplaceCOF(mUUID))
- {
- mDisabledItems.push_back(std::string("Replace Outfit"));
- }
- mItems.push_back(std::string("Outfit Separator"));
- }
- LLMenuGL* menup = dynamic_cast<LLMenuGL*>(mMenu.get());
- if (menup)
- {
- hide_context_entries(*menup, mItems, mDisabledItems, TRUE);
-
- // Reposition the menu, in case we're adding items to an existing menu.
- menup->needsArrange();
- menup->arrangeAndClear();
+ selfp->mRoot->updateMenu();
}
}
@@ -2830,17 +2943,11 @@ BOOL LLFolderBridge::checkFolderForContentsOfType(LLInventoryModel* model, LLInv
return ((item_array.count() > 0) ? TRUE : FALSE );
}
-// Flags unused
-void LLFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
+void LLFolderBridge::buildContextMenuBaseOptions(U32 flags)
{
- mItems.clear();
- mDisabledItems.clear();
-
- lldebugs << "LLFolderBridge::buildContextMenu()" << llendl;
-
-// menuentry_vec_t disabled_items;
LLInventoryModel* model = getInventoryModel();
- if(!model) return;
+ llassert(model != NULL);
+
const LLUUID trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH);
const LLUUID lost_and_found_id = model->findCategoryUUIDForType(LLFolderType::FT_LOST_AND_FOUND);
@@ -2857,10 +2964,6 @@ void LLFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
mDisabledItems.push_back(std::string("New Body Parts"));
}
- // clear out old menu and folder pointers
- mMenu.markDead();
- sSelf.markDead();
-
if(trash_id == mUUID)
{
// This is the trash.
@@ -2874,20 +2977,23 @@ void LLFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
}
else if(isOutboxFolder())
{
- mItems.push_back(std::string("Delete"));
+ addOutboxContextMenuOptions(flags, mItems, mDisabledItems);
}
else if(isAgentInventory()) // do not allow creating in library
{
- LLViewerInventoryCategory *cat = getCategory();
+ LLViewerInventoryCategory *cat = getCategory();
// BAP removed protected check to re-enable standard ops in untyped folders.
// Not sure what the right thing is to do here.
if (!isCOFFolder() && cat && (cat->getPreferredType() != LLFolderType::FT_OUTFIT))
{
- if (!isInboxFolder() && !isOutboxFolder()) // don't allow creation in inbox
+ if (!isInboxFolder() && !isOutboxFolder()) // don't allow creation in inbox or outbox
{
// Do not allow to create 2-level subfolder in the Calling Card/Friends folder. EXT-694.
if (!LLFriendCardsManager::instance().isCategoryInFriendFolder(cat))
+ {
mItems.push_back(std::string("New Folder"));
+ }
+
mItems.push_back(std::string("New Script"));
mItems.push_back(std::string("New Note"));
mItems.push_back(std::string("New Gesture"));
@@ -2958,34 +3064,138 @@ void LLFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
mDisabledItems.push_back(std::string("Share"));
}
}
+}
- hide_context_entries(menu, mItems, mDisabledItems);
+void LLFolderBridge::buildContextMenuFolderOptions(U32 flags)
+{
+ // Build folder specific options back up
+ LLInventoryModel* model = getInventoryModel();
+ if(!model) return;
- // Add menu items that are dependent on the contents of the folder.
- uuid_vec_t folders;
- LLViewerInventoryCategory* category = (LLViewerInventoryCategory*)model->getCategory(mUUID);
- if (category)
+ const LLInventoryCategory* category = model->getCategory(mUUID);
+ if(!category) return;
+
+ const LLUUID trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH);
+ if (trash_id == mUUID) return;
+ if (isItemInTrash()) return;
+ if (!isAgentInventory()) return;
+ if (isOutboxFolder()) return;
+
+ LLFolderType::EType type = category->getPreferredType();
+ const bool is_system_folder = LLFolderType::lookupIsProtectedType(type);
+ // BAP change once we're no longer treating regular categories as ensembles.
+ const bool is_ensemble = (type == LLFolderType::FT_NONE ||
+ LLFolderType::lookupIsEnsembleType(type));
+
+ // Only enable calling-card related options for non-system folders.
+ if (!is_system_folder)
{
- folders.push_back(category->getUUID());
+ LLIsType is_callingcard(LLAssetType::AT_CALLINGCARD);
+ if (mCallingCards || checkFolderForContentsOfType(model, is_callingcard))
+ {
+ mItems.push_back(std::string("Calling Card Separator"));
+ mItems.push_back(std::string("Conference Chat Folder"));
+ mItems.push_back(std::string("IM All Contacts In Folder"));
+ }
}
- mMenu = menu.getHandle();
- sSelf = getHandle();
- LLRightClickInventoryFetchDescendentsObserver* fetch = new LLRightClickInventoryFetchDescendentsObserver(folders, FALSE);
- fetch->startFetch();
- inc_busy_count();
- if(fetch->isFinished())
+ if (!isItemRemovable())
{
- // everything is already here - call done.
- fetch->done();
+ mDisabledItems.push_back(std::string("Delete"));
}
- else
+
+#ifndef LL_RELEASE_FOR_DOWNLOAD
+ if (LLFolderType::lookupIsProtectedType(type))
+ {
+ mItems.push_back(std::string("Delete System Folder"));
+ }
+#endif
+
+ // wearables related functionality for folders.
+ //is_wearable
+ LLFindWearables is_wearable;
+ LLIsType is_object( LLAssetType::AT_OBJECT );
+ LLIsType is_gesture( LLAssetType::AT_GESTURE );
+
+ if (mWearables ||
+ checkFolderForContentsOfType(model, is_wearable) ||
+ checkFolderForContentsOfType(model, is_object) ||
+ checkFolderForContentsOfType(model, is_gesture) )
{
- // it's all on its way - add an observer, and the inventory will call done for us when everything is here.
- gInventory.addObserver(fetch);
+ mItems.push_back(std::string("Folder Wearables Separator"));
+
+ // Only enable add/replace outfit for non-system folders.
+ if (!is_system_folder)
+ {
+ // Adding an outfit onto another (versus replacing) doesn't make sense.
+ if (type != LLFolderType::FT_OUTFIT)
+ {
+ mItems.push_back(std::string("Add To Outfit"));
+ }
+
+ mItems.push_back(std::string("Replace Outfit"));
+ }
+ if (is_ensemble)
+ {
+ mItems.push_back(std::string("Wear As Ensemble"));
+ }
+ mItems.push_back(std::string("Remove From Outfit"));
+ if (!LLAppearanceMgr::getCanRemoveFromCOF(mUUID))
+ {
+ mDisabledItems.push_back(std::string("Remove From Outfit"));
+ }
+ if (!LLAppearanceMgr::instance().getCanReplaceCOF(mUUID))
+ {
+ mDisabledItems.push_back(std::string("Replace Outfit"));
+ }
+ mItems.push_back(std::string("Outfit Separator"));
}
}
+// Flags unused
+void LLFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
+{
+ sSelf.markDead();
+
+ mItems.clear();
+ mDisabledItems.clear();
+
+ lldebugs << "LLFolderBridge::buildContextMenu()" << llendl;
+
+ LLInventoryModel* model = getInventoryModel();
+ if(!model) return;
+
+ buildContextMenuBaseOptions(flags);
+
+ // Add menu items that are dependent on the contents of the folder.
+ LLViewerInventoryCategory* category = (LLViewerInventoryCategory *) model->getCategory(mUUID);
+ if (category)
+ {
+ uuid_vec_t folders;
+ folders.push_back(category->getUUID());
+
+ sSelf = getHandle();
+ LLRightClickInventoryFetchDescendentsObserver* fetch = new LLRightClickInventoryFetchDescendentsObserver(folders, FALSE);
+ fetch->startFetch();
+ inc_busy_count();
+ if (fetch->isFinished())
+ {
+ buildContextMenuFolderOptions(flags);
+ }
+ else
+ {
+ // it's all on its way - add an observer, and the inventory will call done for us when everything is here.
+ gInventory.addObserver(fetch);
+ }
+ }
+
+ hide_context_entries(menu, mItems, mDisabledItems);
+
+ // Reposition the menu, in case we're adding items to an existing menu.
+ menu.needsArrange();
+ menu.arrangeAndClear();
+}
+
BOOL LLFolderBridge::hasChildren() const
{
LLInventoryModel* model = getInventoryModel();
@@ -3187,13 +3397,13 @@ bool move_task_inventory_callback(const LLSD& notification, const LLSD& response
if(option == 0 && object)
{
- if (cat_and_wear && cat_and_wear->mWear)
+ if (cat_and_wear && cat_and_wear->mWear) // && !cat_and_wear->mFolderResponded)
{
LLInventoryObject::object_list_t inventory_objects;
object->getInventoryContents(inventory_objects);
int contents_count = inventory_objects.size()-1; //subtract one for containing folder
-
- LLInventoryCopyAndWearObserver* inventoryObserver = new LLInventoryCopyAndWearObserver(cat_and_wear->mCatID, contents_count);
+ LLInventoryCopyAndWearObserver* inventoryObserver = new LLInventoryCopyAndWearObserver(cat_and_wear->mCatID, contents_count, cat_and_wear->mFolderResponded);
+
gInventory.addObserver(inventoryObserver);
}
@@ -3306,8 +3516,8 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,
{
LLInventoryModel* model = getInventoryModel();
- if(!model || !inv_item) return FALSE;
- if(!isAgentInventory()) return FALSE; // cannot drag into library
+ if (!model || !inv_item) return FALSE;
+ if (!isAgentInventory()) return FALSE; // cannot drag into library
if (!isAgentAvatarValid()) return FALSE;
const LLUUID &current_outfit_id = model->findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT, false);
@@ -3375,10 +3585,14 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,
accept = TRUE;
if (!is_movable)
+ {
accept = FALSE;
- if ((mUUID == inv_item->getParentUUID()) && !move_is_into_favorites)
+ }
+ else if ((mUUID == inv_item->getParentUUID()) && !move_is_into_favorites)
+ {
accept = FALSE;
- if (move_is_into_current_outfit || move_is_into_outfit)
+ }
+ else if (move_is_into_current_outfit || move_is_into_outfit)
{
accept = can_move_to_outfit(inv_item, move_is_into_current_outfit);
}
@@ -3389,9 +3603,32 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,
else if (move_is_into_outbox)
{
accept = can_move_to_outbox(inv_item, tooltip_msg);
+
+ if (accept)
+ {
+ const LLViewerInventoryCategory * master_folder = model->getFirstDescendantOf(outbox_id, mUUID);
+
+ int existing_item_count = LLToolDragAndDrop::instance().getCargoIDsCount();
+
+ if (master_folder != NULL)
+ {
+ LLInventoryModel::cat_array_t existing_categories;
+ LLInventoryModel::item_array_t existing_items;
+
+ gInventory.collectDescendents(master_folder->getUUID(), existing_categories, existing_items, FALSE);
+
+ existing_item_count += existing_items.count();
+ }
+
+ if (existing_item_count > gSavedSettings.getU32("InventoryOutboxMaxItemCount"))
+ {
+ tooltip_msg = LLTrans::getString("TooltipOutboxTooManyObjects");
+ accept = FALSE;
+ }
+ }
}
- if(accept && drop)
+ if (accept && drop)
{
if (inv_item->getType() == LLAssetType::AT_GESTURE
&& LLGestureMgr::instance().isGestureActive(inv_item->getUUID()) && move_is_into_trash)
@@ -3440,9 +3677,16 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,
{
dropToOutfit(inv_item, move_is_into_current_outfit);
}
- else if (move_is_into_outbox && !move_is_from_outbox)
+ else if (move_is_into_outbox)
{
- copy_item_to_outbox(inv_item, outbox_id, LLUUID::null);
+ if (move_is_from_outbox)
+ {
+ move_item_within_outbox(inv_item, mUUID, LLToolDragAndDrop::getOperationId());
+ }
+ else
+ {
+ copy_item_to_outbox(inv_item, mUUID, LLUUID::null, LLToolDragAndDrop::getOperationId());
+ }
}
// NORMAL or TRASH folder
// (move the item, restamp if into trash)
@@ -3463,7 +3707,6 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,
//
//--------------------------------------------------------------------------------
-
}
}
else if (LLToolDragAndDrop::SOURCE_WORLD == source)
@@ -3472,7 +3715,7 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,
// anonymous objects, it would be possible to bypass
// permissions.
object = gObjectList.findObject(inv_item->getParentUUID());
- if(!object)
+ if (!object)
{
llinfos << "Object not found for drop." << llendl;
return FALSE;
@@ -3482,10 +3725,9 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,
// move/copy this item.
LLPermissions perm(inv_item->getPermissions());
BOOL is_move = FALSE;
- if((perm.allowCopyBy(gAgent.getID(), gAgent.getGroupID())
+ if ((perm.allowCopyBy(gAgent.getID(), gAgent.getGroupID())
&& perm.allowTransferTo(gAgent.getID())))
// || gAgent.isGodlike())
-
{
accept = TRUE;
}
@@ -3501,7 +3743,7 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,
// Don't allow placing an original item into Current Outfit or an outfit folder
// because they must contain only links to wearable items.
// *TODO: Probably we should create a link to an item if it was dragged to outfit or COF.
- if(move_is_into_current_outfit || move_is_into_outfit)
+ if (move_is_into_current_outfit || move_is_into_outfit)
{
accept = FALSE;
}
@@ -3512,8 +3754,13 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,
{
accept = FALSE;
}
-
- if(drop && accept)
+ else if (move_is_into_outbox)
+ {
+ tooltip_msg = LLTrans::getString("TooltipOutboxNotInInventory");
+ accept = FALSE;
+ }
+
+ if (accept && drop)
{
LLMoveInv* move_inv = new LLMoveInv;
move_inv->mObjectID = inv_item->getParentUUID();
@@ -3535,18 +3782,27 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,
LLNotifications::instance().forceResponse(params, 0);
}
}
-
}
else if(LLToolDragAndDrop::SOURCE_NOTECARD == source)
{
- // Don't allow placing an original item from a notecard to Current Outfit or an outfit folder
- // because they must contain only links to wearable items.
- accept = !(move_is_into_current_outfit || move_is_into_outfit);
-
- if(drop)
+ if (move_is_into_outbox)
+ {
+ tooltip_msg = LLTrans::getString("TooltipOutboxNotInInventory");
+ accept = FALSE;
+ }
+ else
+ {
+ // Don't allow placing an original item from a notecard to Current Outfit or an outfit folder
+ // because they must contain only links to wearable items.
+ accept = !(move_is_into_current_outfit || move_is_into_outfit);
+ }
+
+ if (accept && drop)
{
- copy_inventory_from_notecard(LLToolDragAndDrop::getInstance()->getObjectID(),
- LLToolDragAndDrop::getInstance()->getSourceID(), inv_item);
+ copy_inventory_from_notecard(mUUID, // Drop to the chosen destination folder
+ LLToolDragAndDrop::getInstance()->getObjectID(),
+ LLToolDragAndDrop::getInstance()->getSourceID(),
+ inv_item);
}
}
else if(LLToolDragAndDrop::SOURCE_LIBRARY == source)
@@ -3556,7 +3812,12 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,
{
accept = TRUE;
- if (move_is_into_current_outfit || move_is_into_outfit)
+ if (move_is_into_outbox)
+ {
+ tooltip_msg = LLTrans::getString("TooltipOutboxNotInInventory");
+ accept = FALSE;
+ }
+ else if (move_is_into_current_outfit || move_is_into_outfit)
{
accept = can_move_to_outfit(inv_item, move_is_into_current_outfit);
}
@@ -3647,7 +3908,7 @@ void LLTextureBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
}
else if(isOutboxFolder())
{
- items.push_back(std::string("Delete"));
+ addOutboxContextMenuOptions(flags, items, disabled_items);
}
else
{
@@ -3721,29 +3982,29 @@ void LLSoundBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
menuentry_vec_t items;
menuentry_vec_t disabled_items;
- if(isItemInTrash())
+ if (isOutboxFolder())
{
- addTrashContextMenuOptions(items, disabled_items);
- }
- else if(isOutboxFolder())
- {
- items.push_back(std::string("Delete"));
+ addOutboxContextMenuOptions(flags, items, disabled_items);
}
else
{
- items.push_back(std::string("Share"));
- if (!canShare())
+ if (isItemInTrash())
{
- disabled_items.push_back(std::string("Share"));
- }
- items.push_back(std::string("Sound Open"));
- items.push_back(std::string("Properties"));
+ addTrashContextMenuOptions(items, disabled_items);
+ }
+ else
+ {
+ items.push_back(std::string("Share"));
+ if (!canShare())
+ {
+ disabled_items.push_back(std::string("Share"));
+ }
+ items.push_back(std::string("Sound Open"));
+ items.push_back(std::string("Properties"));
- getClipboardEntries(true, items, disabled_items, flags);
- }
+ getClipboardEntries(true, items, disabled_items, flags);
+ }
- if (!isOutboxFolder())
- {
items.push_back(std::string("Sound Separator"));
items.push_back(std::string("Sound Play"));
}
@@ -3779,29 +4040,29 @@ void LLLandmarkBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
menuentry_vec_t disabled_items;
lldebugs << "LLLandmarkBridge::buildContextMenu()" << llendl;
- if(isItemInTrash())
- {
- addTrashContextMenuOptions(items, disabled_items);
- }
- else if(isOutboxFolder())
+ if(isOutboxFolder())
{
- items.push_back(std::string("Delete"));
+ addOutboxContextMenuOptions(flags, items, disabled_items);
}
else
{
- items.push_back(std::string("Share"));
- if (!canShare())
+ if(isItemInTrash())
{
- disabled_items.push_back(std::string("Share"));
- }
- items.push_back(std::string("Landmark Open"));
- items.push_back(std::string("Properties"));
+ addTrashContextMenuOptions(items, disabled_items);
+ }
+ else
+ {
+ items.push_back(std::string("Share"));
+ if (!canShare())
+ {
+ disabled_items.push_back(std::string("Share"));
+ }
+ items.push_back(std::string("Landmark Open"));
+ items.push_back(std::string("Properties"));
- getClipboardEntries(true, items, disabled_items, flags);
- }
+ getClipboardEntries(true, items, disabled_items, flags);
+ }
- if (!isOutboxFolder())
- {
items.push_back(std::string("Landmark Separator"));
items.push_back(std::string("About Landmark"));
}
@@ -3851,7 +4112,7 @@ void LLLandmarkBridge::performAction(LLInventoryModel* model, std::string action
key["type"] = "landmark";
key["id"] = item->getUUID();
- LLSideTray::getInstance()->showPanel("panel_places", key);
+ LLFloaterSidePanelContainer::showPanel("places", key);
}
}
else
@@ -4334,36 +4595,35 @@ void LLAnimationBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
menuentry_vec_t disabled_items;
lldebugs << "LLAnimationBridge::buildContextMenu()" << llendl;
- if(isItemInTrash())
- {
- addTrashContextMenuOptions(items, disabled_items);
- }
- else if(isOutboxFolder())
+ if(isOutboxFolder())
{
items.push_back(std::string("Delete"));
}
else
{
- items.push_back(std::string("Share"));
- if (!canShare())
+ if(isItemInTrash())
{
- disabled_items.push_back(std::string("Share"));
- }
- items.push_back(std::string("Animation Open"));
- items.push_back(std::string("Properties"));
+ addTrashContextMenuOptions(items, disabled_items);
+ }
+ else
+ {
+ items.push_back(std::string("Share"));
+ if (!canShare())
+ {
+ disabled_items.push_back(std::string("Share"));
+ }
+ items.push_back(std::string("Animation Open"));
+ items.push_back(std::string("Properties"));
- getClipboardEntries(true, items, disabled_items, flags);
- }
+ getClipboardEntries(true, items, disabled_items, flags);
+ }
- if (!isOutboxFolder())
- {
items.push_back(std::string("Animation Separator"));
items.push_back(std::string("Animation Play"));
items.push_back(std::string("Animation Audition"));
}
hide_context_entries(menu, items, disabled_items);
-
}
// virtual
@@ -4780,7 +5040,7 @@ void remove_inventory_category_from_avatar( LLInventoryCategory* category )
if (gAgentCamera.cameraCustomizeAvatar())
{
// switching to outfit editor should automagically save any currently edited wearable
- LLSideTray::getInstance()->showPanel("sidepanel_appearance", LLSD().with("type", "edit_outfit"));
+ LLFloaterSidePanelContainer::showPanel("appearance", LLSD().with("type", "edit_outfit"));
}
remove_inventory_category_from_avatar_step2(TRUE, category->getUUID() );
@@ -5348,7 +5608,7 @@ void LLMeshBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
}
else if(isOutboxFolder())
{
- items.push_back(std::string("Delete"));
+ addOutboxContextMenuOptions(flags, items, disabled_items);
}
else
{
@@ -5357,7 +5617,6 @@ void LLMeshBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
getClipboardEntries(true, items, disabled_items, flags);
}
-
hide_context_entries(menu, items, disabled_items);
}
diff --git a/indra/newview/llinventorybridge.h b/indra/newview/llinventorybridge.h
index 2d625befb4..871657a58a 100644
--- a/indra/newview/llinventorybridge.h
+++ b/indra/newview/llinventorybridge.h
@@ -69,9 +69,9 @@ public:
U32 flags = 0x00);
virtual ~LLInvFVBridge() {}
- BOOL canShare() const;
- BOOL canListOnMarketplace() const;
- BOOL canListOnMarketplaceNow() const;
+ bool canShare() const;
+ bool canListOnMarketplace() const;
+ bool canListOnMarketplaceNow() const;
//--------------------------------------------------------------------
// LLInvFVBridge functionality
@@ -131,6 +131,9 @@ protected:
virtual void addDeleteContextMenuOptions(menuentry_vec_t &items,
menuentry_vec_t &disabled_items);
virtual void addOpenRightClickMenuOption(menuentry_vec_t &items);
+ virtual void addOutboxContextMenuOptions(U32 flags,
+ menuentry_vec_t &items,
+ menuentry_vec_t &disabled_items);
protected:
LLInvFVBridge(LLInventoryPanel* inventory, LLFolderView* root, const LLUUID& uuid);
@@ -144,6 +147,7 @@ protected:
BOOL isCOFFolder() const; // true if COF or descendent of
BOOL isInboxFolder() const; // true if COF or descendent of marketplace inbox
BOOL isOutboxFolder() const; // true if COF or descendent of marketplace outbox
+ BOOL isOutboxFolderDirectParent() const;
const LLUUID getOutboxFolder() const;
virtual BOOL isItemPermissive() const;
@@ -278,6 +282,9 @@ public:
LLHandle<LLFolderBridge> getHandle() { mHandle.bind(this); return mHandle; }
protected:
+ void buildContextMenuBaseOptions(U32 flags);
+ void buildContextMenuFolderOptions(U32 flags);
+
//--------------------------------------------------------------------
// Menu callbacks
//--------------------------------------------------------------------
@@ -306,8 +313,6 @@ protected:
void dropToFavorites(LLInventoryItem* inv_item);
void dropToOutfit(LLInventoryItem* inv_item, BOOL move_is_into_current_outfit);
- void dropToOutbox(LLInventoryItem* inv_item);
- void dropFolderToOutbox(LLInventoryCategory* inv_cat);
//--------------------------------------------------------------------
// Messy hacks for handling folder options
@@ -315,12 +320,10 @@ protected:
public:
static LLHandle<LLFolderBridge> sSelf;
static void staticFolderOptionsMenu();
- void folderOptionsMenu();
private:
BOOL mCallingCards;
BOOL mWearables;
- LLHandle<LLView> mMenu;
menuentry_vec_t mItems;
menuentry_vec_t mDisabledItems;
LLRootHandle<LLFolderBridge> mHandle;
@@ -650,7 +653,6 @@ BOOL move_inv_category_world_to_agent(const LLUUID& object_id,
// are set as enabled.
void hide_context_entries(LLMenuGL& menu,
const menuentry_vec_t &entries_to_show,
- const menuentry_vec_t &disabled_entries,
- BOOL append = FALSE);
+ const menuentry_vec_t &disabled_entries);
#endif // LL_LLINVENTORYBRIDGE_H
diff --git a/indra/newview/llinventoryfilter.cpp b/indra/newview/llinventoryfilter.cpp
index 516b47e616..d54bce4619 100644
--- a/indra/newview/llinventoryfilter.cpp
+++ b/indra/newview/llinventoryfilter.cpp
@@ -36,6 +36,7 @@
#include "llviewercontrol.h"
#include "llfolderview.h"
#include "llinventorybridge.h"
+#include "llviewerfoldertype.h"
// linden library includes
#include "lltrans.h"
@@ -117,7 +118,7 @@ bool LLInventoryFilter::checkFolder(const LLFolderViewFolder* folder)
const LLFolderViewEventListener* listener = folder->getListener();
const LLUUID folder_id = listener->getUUID();
-
+
if (mFilterOps.mFilterTypes & FILTERTYPE_CATEGORY)
{
// Can only filter categories for items in your inventory
@@ -206,6 +207,23 @@ BOOL LLInventoryFilter::checkAgainstFilterType(const LLFolderViewItem* item) con
}
}
+ ////////////////////////////////////////////////////////////////////////////////
+ // FILTERTYPE_EMPTYFOLDERS
+ // Pass if this item is a folder and is not a system folder that should be hidden
+ if (filterTypes & FILTERTYPE_EMPTYFOLDERS)
+ {
+ if (object_type == LLInventoryType::IT_CATEGORY)
+ {
+ bool is_hidden_if_empty = LLViewerFolderType::lookupIsHiddenIfEmpty(listener->getPreferredType());
+ if (is_hidden_if_empty)
+ {
+ // Force the fetching of those folders so they are hidden iff they really are empty...
+ gInventory.fetchDescendentsOf(object_id);
+ return FALSE;
+ }
+ }
+ }
+
return TRUE;
}
@@ -343,6 +361,11 @@ void LLInventoryFilter::setFilterWearableTypes(U64 types)
mFilterOps.mFilterTypes |= FILTERTYPE_WEARABLE;
}
+void LLInventoryFilter::setFilterEmptySystemFolders()
+{
+ mFilterOps.mFilterTypes |= FILTERTYPE_EMPTYFOLDERS;
+}
+
void LLInventoryFilter::setFilterUUID(const LLUUID& object_id)
{
if (mFilterOps.mFilterUUID == LLUUID::null)
diff --git a/indra/newview/llinventoryfilter.h b/indra/newview/llinventoryfilter.h
index f9460822f7..bba24ac652 100644
--- a/indra/newview/llinventoryfilter.h
+++ b/indra/newview/llinventoryfilter.h
@@ -57,7 +57,8 @@ public:
FILTERTYPE_CATEGORY = 0x1 << 1, // search by folder type
FILTERTYPE_UUID = 0x1 << 2, // find the object with UUID and any links to it
FILTERTYPE_DATE = 0x1 << 3, // search by date range
- FILTERTYPE_WEARABLE = 0x1 << 4 // search by wearable type
+ FILTERTYPE_WEARABLE = 0x1 << 4, // search by wearable type
+ FILTERTYPE_EMPTYFOLDERS = 0x1 << 5 // pass if folder is not a system folder to be hidden if empty
};
enum EFilterLink
@@ -88,6 +89,7 @@ public:
void setFilterCategoryTypes(U64 types);
void setFilterUUID(const LLUUID &object_id);
void setFilterWearableTypes(U64 types);
+ void setFilterEmptySystemFolders();
void updateFilterTypes(U64 types, U64& current_types);
void setFilterSubString(const std::string& string);
diff --git a/indra/newview/llinventoryfunctions.cpp b/indra/newview/llinventoryfunctions.cpp
index 0af013fde5..dd92188e9d 100644
--- a/indra/newview/llinventoryfunctions.cpp
+++ b/indra/newview/llinventoryfunctions.cpp
@@ -47,6 +47,7 @@
#include "llappviewer.h"
//#include "llfirstuse.h"
#include "llfloaterinventory.h"
+#include "llfloatersidepanelcontainer.h"
#include "llfocusmgr.h"
#include "llfolderview.h"
#include "llgesturemgr.h"
@@ -57,6 +58,7 @@
#include "llinventorymodel.h"
#include "llinventorypanel.h"
#include "lllineeditor.h"
+#include "llmarketplacenotifications.h"
#include "llmenugl.h"
#include "llnotificationsutil.h"
#include "llpanelmaininventory.h"
@@ -70,7 +72,6 @@
#include "llscrollbar.h"
#include "llscrollcontainer.h"
#include "llselectmgr.h"
-#include "llsidetray.h"
#include "llsidepanelinventory.h"
#include "lltabcontainer.h"
#include "lltooldraganddrop.h"
@@ -82,6 +83,8 @@
#include "llvoavatarself.h"
#include "llwearablelist.h"
+#include <boost/foreach.hpp>
+
BOOL LLInventoryState::sWearNewClothing = FALSE;
LLUUID LLInventoryState::sWearNewClothingTransactionID;
@@ -459,22 +462,28 @@ BOOL get_is_category_renameable(const LLInventoryModel* model, const LLUUID& id)
void show_task_item_profile(const LLUUID& item_uuid, const LLUUID& object_id)
{
- LLSideTray::getInstance()->showPanel("sidepanel_inventory", LLSD().with("id", item_uuid).with("object", object_id));
+ LLFloaterSidePanelContainer::showPanel("inventory", LLSD().with("id", item_uuid).with("object", object_id));
}
void show_item_profile(const LLUUID& item_uuid)
{
LLUUID linked_uuid = gInventory.getLinkedItemID(item_uuid);
- LLSideTray::getInstance()->showPanel("sidepanel_inventory", LLSD().with("id", linked_uuid));
+ LLFloaterSidePanelContainer::showPanel("inventory", LLSD().with("id", linked_uuid));
}
void show_item_original(const LLUUID& item_uuid)
{
+ LLFloater* floater_inventory = LLFloaterReg::getInstance("inventory");
+ if (!floater_inventory)
+ {
+ llwarns << "Could not find My Inventory floater" << llendl;
+ return;
+ }
+
//sidetray inventory panel
- LLSidepanelInventory *sidepanel_inventory =
- dynamic_cast<LLSidepanelInventory *>(LLSideTray::getInstance()->getPanel("sidepanel_inventory"));
+ LLSidepanelInventory *sidepanel_inventory = LLFloaterSidePanelContainer::getPanel<LLSidepanelInventory>("inventory");
- bool reset_inventory_filter = !LLSideTray::getInstance()->isPanelActive("sidepanel_inventory");
+ bool reset_inventory_filter = !floater_inventory->isInVisibleChain();
LLInventoryPanel* active_panel = LLInventoryPanel::getActiveInventoryPanel();
if (!active_panel)
@@ -524,21 +533,37 @@ void show_item_original(const LLUUID& item_uuid)
}
}
-void move_to_outbox_cb(const LLSD& notification, const LLSD& response)
+
+void open_outbox()
{
- S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
- if (option != 0) return; // canceled
+ LLFloaterReg::showInstance("outbox");
+}
+
+LLUUID create_folder_in_outbox_for_item(LLInventoryItem* item, const LLUUID& destFolderId, S32 operation_id)
+{
+ llassert(item);
+ llassert(destFolderId.notNull());
+
+ LLUUID created_folder_id = gInventory.createNewCategory(destFolderId, LLFolderType::FT_NONE, item->getName());
+ gInventory.notifyObservers();
+
+ LLNotificationsUtil::add("OutboxFolderCreated");
- LLViewerInventoryItem * viitem = gInventory.getItem(notification["payload"]["item_id"].asUUID());
- LLUUID dest_folder_id = notification["payload"]["dest_folder_id"].asUUID();
+ return created_folder_id;
+}
+
+void move_to_outbox_cb_action(const LLSD& payload)
+{
+ LLViewerInventoryItem * viitem = gInventory.getItem(payload["item_id"].asUUID());
+ LLUUID dest_folder_id = payload["dest_folder_id"].asUUID();
if (viitem)
{
// when moving item directly into outbox create folder with that name
if (dest_folder_id == gInventory.findCategoryUUIDForType(LLFolderType::FT_OUTBOX, false))
{
- dest_folder_id = gInventory.createNewCategory(dest_folder_id, LLFolderType::FT_NONE, viitem->getName());
- gInventory.notifyObservers();
+ S32 operation_id = payload["operation_id"].asInteger();
+ dest_folder_id = create_folder_in_outbox_for_item(viitem, dest_folder_id, operation_id);
}
LLUUID parent = viitem->getParentUUID();
@@ -549,12 +574,12 @@ void move_to_outbox_cb(const LLSD& notification, const LLSD& response)
dest_folder_id,
false);
- LLUUID top_level_folder = notification["payload"]["top_level_folder"].asUUID();
+ LLUUID top_level_folder = payload["top_level_folder"].asUUID();
if (top_level_folder != LLUUID::null)
{
LLViewerInventoryCategory* category;
-
+
while (parent.notNull())
{
LLInventoryModel::cat_array_t* cat_array;
@@ -583,42 +608,75 @@ void move_to_outbox_cb(const LLSD& notification, const LLSD& response)
}
}
+ open_outbox();
}
}
-
-void copy_item_to_outbox(LLInventoryItem* inv_item, LLUUID dest_folder, const LLUUID& top_level_folder)
+void copy_item_to_outbox(LLInventoryItem* inv_item, LLUUID dest_folder, const LLUUID& top_level_folder, S32 operation_id)
{
- if (inv_item->getPermissions().allowOperationBy(PERM_COPY, gAgent.getID(), gAgent.getGroupID()))
+ // Collapse links directly to items/folders
+ LLViewerInventoryItem * viewer_inv_item = (LLViewerInventoryItem *) inv_item;
+ LLViewerInventoryCategory * linked_category = viewer_inv_item->getLinkedCategory();
+ if (linked_category != NULL)
{
- // when moving item directly into outbox create folder with that name
- if (dest_folder == gInventory.findCategoryUUIDForType(LLFolderType::FT_OUTBOX, false))
+ copy_folder_to_outbox(linked_category, dest_folder, top_level_folder, operation_id);
+ }
+ else
+ {
+ LLViewerInventoryItem * linked_item = viewer_inv_item->getLinkedItem();
+ if (linked_item != NULL)
{
- dest_folder = gInventory.createNewCategory(dest_folder, LLFolderType::FT_NONE, inv_item->getName());
- gInventory.notifyObservers();
+ inv_item = (LLInventoryItem *) linked_item;
+ }
+
+ // Check for copy permissions
+ if (inv_item->getPermissions().allowOperationBy(PERM_COPY, gAgent.getID(), gAgent.getGroupID()))
+ {
+ // when moving item directly into outbox create folder with that name
+ if (dest_folder == gInventory.findCategoryUUIDForType(LLFolderType::FT_OUTBOX, false))
+ {
+ dest_folder = create_folder_in_outbox_for_item(inv_item, dest_folder, operation_id);
+ }
+
+ copy_inventory_item(gAgent.getID(),
+ inv_item->getPermissions().getOwner(),
+ inv_item->getUUID(),
+ dest_folder,
+ inv_item->getName(),
+ LLPointer<LLInventoryCallback>(NULL));
+
+ open_outbox();
+ }
+ else
+ {
+ LLSD payload;
+ payload["item_id"] = inv_item->getUUID();
+ payload["dest_folder_id"] = dest_folder;
+ payload["top_level_folder"] = top_level_folder;
+ payload["operation_id"] = operation_id;
+
+ LLMarketplaceInventoryNotifications::addNoCopyNotification(payload, move_to_outbox_cb_action);
}
-
- copy_inventory_item(
- gAgent.getID(),
- inv_item->getPermissions().getOwner(),
- inv_item->getUUID(),
- dest_folder,
- inv_item->getName(),
- LLPointer<LLInventoryCallback>(NULL));
}
- else
- {
- LLSD args;
- args["ITEM_NAME"] = inv_item->getName();
- LLSD payload;
- payload["item_id"] = inv_item->getUUID();
- payload["dest_folder_id"] = dest_folder;
- payload["top_level_folder"] = top_level_folder;
- LLNotificationsUtil::add("ConfirmNoCopyToOutbox", args, payload, boost::bind(&move_to_outbox_cb, _1, _2));
+}
+
+void move_item_within_outbox(LLInventoryItem* inv_item, LLUUID dest_folder, S32 operation_id)
+{
+ // when moving item directly into outbox create folder with that name
+ if (dest_folder == gInventory.findCategoryUUIDForType(LLFolderType::FT_OUTBOX, false))
+ {
+ dest_folder = create_folder_in_outbox_for_item(inv_item, dest_folder, operation_id);
}
+
+ LLViewerInventoryItem * viewer_inv_item = (LLViewerInventoryItem *) inv_item;
+
+ change_item_parent(&gInventory,
+ viewer_inv_item,
+ dest_folder,
+ false);
}
-void copy_folder_to_outbox(LLInventoryCategory* inv_cat, const LLUUID& dest_folder, const LLUUID& top_level_folder)
+void copy_folder_to_outbox(LLInventoryCategory* inv_cat, const LLUUID& dest_folder, const LLUUID& top_level_folder, S32 operation_id)
{
LLUUID new_folder_id = gInventory.createNewCategory(dest_folder, LLFolderType::FT_NONE, inv_cat->getName());
gInventory.notifyObservers();
@@ -633,7 +691,7 @@ void copy_folder_to_outbox(LLInventoryCategory* inv_cat, const LLUUID& dest_fold
for (LLInventoryModel::item_array_t::iterator iter = item_array_copy.begin(); iter != item_array_copy.end(); iter++)
{
LLInventoryItem* item = *iter;
- copy_item_to_outbox(item, new_folder_id, top_level_folder);
+ copy_item_to_outbox(item, new_folder_id, top_level_folder, operation_id);
}
LLInventoryModel::cat_array_t cat_array_copy = *cat_array;
@@ -641,14 +699,10 @@ void copy_folder_to_outbox(LLInventoryCategory* inv_cat, const LLUUID& dest_fold
for (LLInventoryModel::cat_array_t::iterator iter = cat_array_copy.begin(); iter != cat_array_copy.end(); iter++)
{
LLViewerInventoryCategory* category = *iter;
- copy_folder_to_outbox(category, new_folder_id, top_level_folder);
+ copy_folder_to_outbox(category, new_folder_id, top_level_folder, operation_id);
}
- // delete the folder if we have emptied it
- //if (cat_array->empty() && item_array->empty())
- //{
- // remove_category(inventory_model, inv_cat->getUUID());
- //}
+ open_outbox();
}
///----------------------------------------------------------------------------
diff --git a/indra/newview/llinventoryfunctions.h b/indra/newview/llinventoryfunctions.h
index 7b452537f8..ce2b89b22e 100644
--- a/indra/newview/llinventoryfunctions.h
+++ b/indra/newview/llinventoryfunctions.h
@@ -74,9 +74,10 @@ void rename_category(LLInventoryModel* model, const LLUUID& cat_id, const std::s
// Generates a string containing the path to the item specified by item_id.
void append_path(const LLUUID& id, std::string& path);
-void copy_item_to_outbox(LLInventoryItem* inv_item, LLUUID dest_folder, const LLUUID& top_level_folder);
+void copy_item_to_outbox(LLInventoryItem* inv_item, LLUUID dest_folder, const LLUUID& top_level_folder, S32 operation_id);
+void move_item_within_outbox(LLInventoryItem* inv_item, LLUUID dest_folder, S32 operation_id);
-void copy_folder_to_outbox(LLInventoryCategory* inv_cat, const LLUUID& dest_folder, const LLUUID& top_level_folder);
+void copy_folder_to_outbox(LLInventoryCategory* inv_cat, const LLUUID& dest_folder, const LLUUID& top_level_folder, S32 operation_id);
/** Miscellaneous global functions
** **
diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp
index e86c427ae2..a71b699fdd 100644
--- a/indra/newview/llinventorymodel.cpp
+++ b/indra/newview/llinventorymodel.cpp
@@ -217,6 +217,38 @@ const LLViewerInventoryCategory *LLInventoryModel::getFirstNondefaultParent(cons
return NULL;
}
+//
+// Search up the parent chain until we get to the specified parent, then return the first child category under it
+//
+const LLViewerInventoryCategory* LLInventoryModel::getFirstDescendantOf(const LLUUID& master_parent_id, const LLUUID& obj_id) const
+{
+ if (master_parent_id == obj_id)
+ {
+ return NULL;
+ }
+
+ const LLViewerInventoryCategory* current_cat = getCategory(obj_id);
+
+ if (current_cat == NULL)
+ {
+ current_cat = getCategory(getObject(obj_id)->getParentUUID());
+ }
+
+ while (current_cat != NULL)
+ {
+ const LLUUID& current_parent_id = current_cat->getParentUUID();
+
+ if (current_parent_id == master_parent_id)
+ {
+ return current_cat;
+ }
+
+ current_cat = getCategory(current_parent_id);
+ }
+
+ return NULL;
+}
+
// Get the object by id. Returns NULL if not found.
LLInventoryObject* LLInventoryModel::getObject(const LLUUID& id) const
{
@@ -377,14 +409,67 @@ const LLUUID LLInventoryModel::findCategoryUUIDForType(LLFolderType::EType prefe
return rv;
}
+class LLCreateInventoryCategoryResponder : public LLHTTPClient::Responder
+{
+public:
+ LLCreateInventoryCategoryResponder(LLInventoryModel* model,
+ void (*callback)(const LLSD&, void*),
+ void* user_data) :
+ mModel(model),
+ mCallback(callback),
+ mData(user_data)
+ {
+ }
+
+ virtual void error(U32 status, const std::string& reason)
+ {
+ LL_WARNS("InvAPI") << "CreateInventoryCategory failed. status = " << status << ", reasion = \"" << reason << "\"" << LL_ENDL;
+ }
+
+ virtual void result(const LLSD& content)
+ {
+ //Server has created folder.
+
+ LLUUID category_id = content["folder_id"].asUUID();
+
+
+ // Add the category to the internal representation
+ LLPointer<LLViewerInventoryCategory> cat =
+ new LLViewerInventoryCategory( category_id,
+ content["parent_id"].asUUID(),
+ (LLFolderType::EType)content["type"].asInteger(),
+ content["name"].asString(),
+ gAgent.getID() );
+ cat->setVersion(LLViewerInventoryCategory::VERSION_INITIAL);
+ cat->setDescendentCount(0);
+ LLInventoryModel::LLCategoryUpdate update(cat->getParentUUID(), 1);
+ mModel->accountForUpdate(update);
+ mModel->updateCategory(cat);
+
+ if (mCallback && mData)
+ {
+ mCallback(content, mData);
+ }
+
+ }
+
+private:
+ void (*mCallback)(const LLSD&, void*);
+ void* mData;
+ LLInventoryModel* mModel;
+};
+
// Convenience function to create a new category. You could call
// updateCategory() with a newly generated UUID category, but this
// version will take care of details like what the name should be
// based on preferred type. Returns the UUID of the new category.
LLUUID LLInventoryModel::createNewCategory(const LLUUID& parent_id,
LLFolderType::EType preferred_type,
- const std::string& pname)
+ const std::string& pname,
+ void (*callback)(const LLSD&, void*), //Default to NULL
+ void* user_data) //Default to NULL
{
+
LLUUID id;
if(!isInventoryUsable())
{
@@ -408,6 +493,35 @@ LLUUID LLInventoryModel::createNewCategory(const LLUUID& parent_id,
{
name.assign(LLViewerFolderType::lookupNewCategoryName(preferred_type));
}
+
+ if ( callback && user_data ) //callback required for acked message.
+ {
+ LLViewerRegion* viewer_region = gAgent.getRegion();
+ std::string url;
+ if ( viewer_region )
+ url = viewer_region->getCapability("CreateInventoryCategory");
+
+ if (!url.empty())
+ {
+ //Let's use the new capability.
+
+ LLSD request, body;
+ body["folder_id"] = id;
+ body["parent_id"] = parent_id;
+ body["type"] = (LLSD::Integer) preferred_type;
+ body["name"] = name;
+
+ request["message"] = "CreateInventoryCategory";
+ request["payload"] = body;
+
+ // viewer_region->getCapAPI().post(request);
+ LLHTTPClient::post(
+ url,
+ body,
+ new LLCreateInventoryCategoryResponder(this, callback, user_data) );
+ return LLUUID::null;
+ }
+ }
// Add the category to the internal representation
LLPointer<LLViewerInventoryCategory> cat =
@@ -1087,7 +1201,6 @@ void LLInventoryModel::notifyObservers()
iter != mObservers.end(); )
{
LLInventoryObserver* observer = *iter;
-
observer->changed(mModifyMask);
// safe way to increment since changed may delete entries! (@!##%@!@&*!)
@@ -2528,9 +2641,9 @@ void LLInventoryModel::processBulkUpdateInventory(LLMessageSystem* msg, void**)
{
LLPointer<LLViewerInventoryCategory> tfolder = new LLViewerInventoryCategory(gAgent.getID());
tfolder->unpackMessage(msg, _PREHASH_FolderData, i);
- //llinfos << "unpaked folder '" << tfolder->getName() << "' ("
- // << tfolder->getUUID() << ") in " << tfolder->getParentUUID()
- // << llendl;
+ llinfos << "unpacked folder '" << tfolder->getName() << "' ("
+ << tfolder->getUUID() << ") in " << tfolder->getParentUUID()
+ << llendl;
if(tfolder->getUUID().notNull())
{
folders.push_back(tfolder);
@@ -2570,11 +2683,11 @@ void LLInventoryModel::processBulkUpdateInventory(LLMessageSystem* msg, void**)
{
LLPointer<LLViewerInventoryItem> titem = new LLViewerInventoryItem;
titem->unpackMessage(msg, _PREHASH_ItemData, i);
- //llinfos << "unpaked item '" << titem->getName() << "' in "
- // << titem->getParentUUID() << llendl;
+ llinfos << "unpaked item '" << titem->getName() << "' in "
+ << titem->getParentUUID() << llendl;
U32 callback_id;
msg->getU32Fast(_PREHASH_ItemData, _PREHASH_CallbackID, callback_id);
- if(titem->getUUID().notNull())
+ if(titem->getUUID().notNull() ) // && callback_id.notNull() )
{
items.push_back(titem);
cblist.push_back(InventoryCallbackInfo(callback_id, titem->getUUID()));
@@ -2879,40 +2992,62 @@ BOOL LLInventoryModel::getIsFirstTimeInViewer2()
return sFirstTimeInViewer2;
}
-static LLInventoryModel::item_array_t::iterator find_item_iter_by_uuid(LLInventoryModel::item_array_t& items, const LLUUID& id)
+LLInventoryModel::item_array_t::iterator LLInventoryModel::findItemIterByUUID(LLInventoryModel::item_array_t& items, const LLUUID& id)
{
- LLInventoryModel::item_array_t::iterator result = items.end();
+ LLInventoryModel::item_array_t::iterator curr_item = items.begin();
- for (LLInventoryModel::item_array_t::iterator i = items.begin(); i != items.end(); ++i)
+ while (curr_item != items.end())
{
- if ((*i)->getUUID() == id)
+ if ((*curr_item)->getUUID() == id)
{
- result = i;
break;
}
+ ++curr_item;
}
- return result;
+ return curr_item;
}
// static
// * @param[in, out] items - vector with items to be updated. It should be sorted in a right way
// * before calling this method.
// * @param src_item_id - LLUUID of inventory item to be moved in new position
-// * @param dest_item_id - LLUUID of inventory item before which source item should be placed.
-void LLInventoryModel::updateItemsOrder(LLInventoryModel::item_array_t& items, const LLUUID& src_item_id, const LLUUID& dest_item_id)
+// * @param dest_item_id - LLUUID of inventory item before (or after) which source item should
+// * be placed.
+// * @param insert_before - bool indicating if src_item_id should be placed before or after
+// * dest_item_id. Default is true.
+void LLInventoryModel::updateItemsOrder(LLInventoryModel::item_array_t& items, const LLUUID& src_item_id, const LLUUID& dest_item_id, bool insert_before)
{
- LLInventoryModel::item_array_t::iterator it_src = find_item_iter_by_uuid(items, src_item_id);
- LLInventoryModel::item_array_t::iterator it_dest = find_item_iter_by_uuid(items, dest_item_id);
+ LLInventoryModel::item_array_t::iterator it_src = findItemIterByUUID(items, src_item_id);
+ LLInventoryModel::item_array_t::iterator it_dest = findItemIterByUUID(items, dest_item_id);
- if (it_src == items.end() || it_dest == items.end()) return;
+ // If one of the passed UUID is not in the item list, bail out
+ if ((it_src == items.end()) || (it_dest == items.end()))
+ return;
+ // Erase the source element from the list, keep a copy before erasing.
LLViewerInventoryItem* src_item = *it_src;
items.erase(it_src);
- // target iterator can not be valid because the container was changed, so update it.
- it_dest = find_item_iter_by_uuid(items, dest_item_id);
- items.insert(it_dest, src_item);
+ // Note: Target iterator is not valid anymore because the container was changed, so update it.
+ it_dest = findItemIterByUUID(items, dest_item_id);
+
+ // Go to the next element if one wishes to insert after the dest element
+ if (!insert_before)
+ {
+ ++it_dest;
+ }
+
+ // Reinsert the source item in the right place
+ if (it_dest != items.end())
+ {
+ items.insert(it_dest, src_item);
+ }
+ else
+ {
+ // Append to the list if it_dest reached the end
+ items.push_back(src_item);
+ }
}
//* @param[in] items vector of items in order to be saved.
diff --git a/indra/newview/llinventorymodel.h b/indra/newview/llinventorymodel.h
index e0e81f1006..7cd85c4ab7 100644
--- a/indra/newview/llinventorymodel.h
+++ b/indra/newview/llinventorymodel.h
@@ -64,6 +64,7 @@ class LLInventoryCollectFunctor;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
class LLInventoryModel
{
+ LOG_CLASS(LLInventoryModel);
public:
friend class LLInventoryModelFetchDescendentsResponder;
@@ -238,6 +239,9 @@ public:
// Get whatever special folder this object is a child of, if any.
const LLViewerInventoryCategory *getFirstNondefaultParent(const LLUUID& obj_id) const;
+
+ // Get first descendant of the child object under the specified parent
+ const LLViewerInventoryCategory *getFirstDescendantOf(const LLUUID& master_parent_id, const LLUUID& obj_id) const;
// Get the object by id. Returns NULL if not found.
// NOTE: Use the pointer returned for read operations - do
@@ -332,11 +336,16 @@ protected:
//--------------------------------------------------------------------
public:
// Changes items order by insertion of the item identified by src_item_id
- // before the item identified by dest_item_id. Both items must exist in items array.
- // Sorting is stored after method is finished. Only src_item_id is moved before dest_item_id.
+ // before (or after) the item identified by dest_item_id. Both items must exist in items array.
+ // Sorting is stored after method is finished. Only src_item_id is moved before (or after) dest_item_id.
+ // The parameter "insert_before" controls on which side of dest_item_id src_item_id gets rensinserted.
static void updateItemsOrder(LLInventoryModel::item_array_t& items,
const LLUUID& src_item_id,
- const LLUUID& dest_item_id);
+ const LLUUID& dest_item_id,
+ bool insert_before = true);
+ // Gets an iterator on an item vector knowing only the item UUID.
+ // Returns end() of the vector if not found.
+ static LLInventoryModel::item_array_t::iterator findItemIterByUUID(LLInventoryModel::item_array_t& items, const LLUUID& id);
// Saves current order of the passed items using inventory item sort field.
// Resets 'items' sort fields and saves them on server.
@@ -355,7 +364,9 @@ public:
// name based on type, pass in a NULL to the 'name' parameter.
LLUUID createNewCategory(const LLUUID& parent_id,
LLFolderType::EType preferred_type,
- const std::string& name);
+ const std::string& name,
+ void (*callback)(const LLSD&, void*) = NULL,
+ void* user_data = NULL );
protected:
// Internal methods that add inventory and make sure that all of
// the internal data structures are consistent. These methods
@@ -406,7 +417,7 @@ public:
// Return (yes/no/maybe) child status of category children.
EHasChildren categoryHasChildren(const LLUUID& cat_id) const;
- // Returns true iff category version is known and theoretical
+ // Returns true if category version is known and theoretical
// descendents == actual descendents.
bool isCategoryComplete(const LLUUID& cat_id) const;
diff --git a/indra/newview/llinventoryobserver.cpp b/indra/newview/llinventoryobserver.cpp
index ceba4a0191..9db175ec2e 100644
--- a/indra/newview/llinventoryobserver.cpp
+++ b/indra/newview/llinventoryobserver.cpp
@@ -202,6 +202,7 @@ void LLInventoryFetchItemsObserver::changed(U32 mask)
void fetch_items_from_llsd(const LLSD& items_llsd)
{
if (!items_llsd.size() || gDisconnected) return;
+
LLSD body;
body[0]["cap_name"] = "FetchInventory2";
body[1]["cap_name"] = "FetchLib2";
@@ -212,7 +213,7 @@ void fetch_items_from_llsd(const LLSD& items_llsd)
body[0]["items"].append(items_llsd[i]);
continue;
}
- if (items_llsd[i]["owner_id"].asString() == ALEXANDRIA_LINDEN_ID.asString())
+ else if (items_llsd[i]["owner_id"].asString() == ALEXANDRIA_LINDEN_ID.asString())
{
body[1]["items"].append(items_llsd[i]);
continue;
@@ -221,19 +222,23 @@ void fetch_items_from_llsd(const LLSD& items_llsd)
for (S32 i=0; i<body.size(); i++)
{
- if(!gAgent.getRegion())
+ if (!gAgent.getRegion())
{
- llwarns<<"Agent's region is null"<<llendl;
+ llwarns << "Agent's region is null" << llendl;
break;
}
- if (0 >= body[i].size()) continue;
- std::string url = gAgent.getRegion()->getCapability(body[i]["cap_name"].asString());
+ if (0 == body[i]["items"].size()) {
+ lldebugs << "Skipping body with no items to fetch" << llendl;
+ continue;
+ }
+
+ std::string url = gAgent.getRegion()->getCapability(body[i]["cap_name"].asString());
if (!url.empty())
{
body[i]["agent_id"] = gAgent.getID();
LLHTTPClient::post(url, body[i], new LLInventoryModel::fetchInventoryResponder(body[i]));
- break;
+ continue;
}
LLMessageSystem* msg = gMessageSystem;
@@ -303,7 +308,7 @@ void LLInventoryFetchItemsObserver::startFetch()
// It's incomplete, so put it on the incomplete container, and
// pack this on the message.
mIncomplete.push_back(*it);
-
+
// Prepare the data to fetch
LLSD item_entry;
item_entry["owner_id"] = owner_id;
diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp
index 615d3aefde..382569fa3a 100644
--- a/indra/newview/llinventorypanel.cpp
+++ b/indra/newview/llinventorypanel.cpp
@@ -35,6 +35,7 @@
#include "llavataractions.h"
#include "llfloaterinventory.h"
#include "llfloaterreg.h"
+#include "llfloatersidepanelcontainer.h"
#include "llfolderview.h"
#include "llimfloater.h"
#include "llimview.h"
@@ -42,7 +43,6 @@
#include "llinventoryfunctions.h"
#include "llinventorymodelbackgroundfetch.h"
#include "llsidepanelinventory.h"
-#include "llsidetray.h"
#include "llviewerattachmenu.h"
#include "llviewerfoldertype.h"
#include "llvoavatarself.h"
@@ -132,6 +132,7 @@ LLInventoryPanel::LLInventoryPanel(const LLInventoryPanel::Params& p) :
mAcceptsDragAndDrop(p.accepts_drag_and_drop),
mAllowMultiSelect(p.allow_multi_select),
mShowItemLinkOverlays(p.show_item_link_overlays),
+ mShowEmptyMessage(p.show_empty_message),
mShowLoadStatus(p.show_load_status),
mViewsInitialized(false),
mInvFVBridgeBuilder(NULL)
@@ -240,6 +241,12 @@ void LLInventoryPanel::initFromParams(const LLInventoryPanel::Params& params)
getFilter()->setFilterCategoryTypes(getFilter()->getFilterCategoryTypes() & ~(1ULL << LLFolderType::FT_INBOX));
getFilter()->setFilterCategoryTypes(getFilter()->getFilterCategoryTypes() & ~(1ULL << LLFolderType::FT_OUTBOX));
+ // set the filter for the empty folder if the debug setting is on
+ if (gSavedSettings.getBOOL("DebugHideEmptySystemFolders"))
+ {
+ getFilter()->setFilterEmptySystemFolders();
+ }
+
// Initialize base class params.
LLPanel::initFromParams(params);
}
@@ -611,6 +618,7 @@ LLFolderView * LLInventoryPanel::createFolderView(LLInvFVBridge * bridge, bool u
p.listener = bridge;
p.use_label_suffix = useLabelSuffix;
p.allow_multiselect = mAllowMultiSelect;
+ p.show_empty_message = mShowEmptyMessage;
p.show_load_status = mShowLoadStatus;
return LLUICtrlFactory::create<LLFolderView>(p);
@@ -697,7 +705,10 @@ LLFolderViewItem* LLInventoryPanel::buildNewViews(const LLUUID& id)
if (new_listener)
{
LLFolderViewFolder* folderp = createFolderViewFolder(new_listener);
- folderp->setItemSortOrder(mFolderRoot->getSortOrder());
+ if (folderp)
+ {
+ folderp->setItemSortOrder(mFolderRoot->getSortOrder());
+ }
itemp = folderp;
}
}
@@ -1077,10 +1088,9 @@ void LLInventoryPanel::dumpSelectionInformation(void* user_data)
BOOL is_inventorysp_active()
{
- if (!LLSideTray::getInstance()->isPanelActive("sidepanel_inventory")) return FALSE;
- LLSidepanelInventory *inventorySP = dynamic_cast<LLSidepanelInventory *>(LLSideTray::getInstance()->getPanel("sidepanel_inventory"));
- if (!inventorySP) return FALSE;
- return inventorySP->isMainInventoryPanelActive();
+ LLSidepanelInventory *sidepanel_inventory = LLFloaterSidePanelContainer::getPanel<LLSidepanelInventory>("inventory");
+ if (!sidepanel_inventory || !sidepanel_inventory->isInVisibleChain()) return FALSE;
+ return sidepanel_inventory->isMainInventoryPanelActive();
}
// static
@@ -1090,47 +1100,30 @@ LLInventoryPanel* LLInventoryPanel::getActiveInventoryPanel(BOOL auto_open)
LLInventoryPanel* res = NULL;
LLFloater* active_inv_floaterp = NULL;
- // A. If the inventory side panel is open, use that preferably.
- if (is_inventorysp_active())
- {
- LLSidepanelInventory *inventorySP = dynamic_cast<LLSidepanelInventory *>(LLSideTray::getInstance()->getPanel("sidepanel_inventory"));
- if (inventorySP)
- {
- return inventorySP->getActivePanel();
- }
- }
- // or if it is in floater undocked from sidetray get it and remember z order of floater to later compare it
- // with other inventory floaters order.
- else if (!LLSideTray::getInstance()->isTabAttached("sidebar_inventory"))
+ LLFloater* floater_inventory = LLFloaterReg::getInstance("inventory");
+ if (!floater_inventory)
{
- LLSidepanelInventory *inventorySP =
- dynamic_cast<LLSidepanelInventory *>(LLSideTray::getInstance()->getPanel("sidepanel_inventory"));
- LLFloater* inv_floater = LLFloaterReg::findInstance("side_bar_tab", LLSD("sidebar_inventory"));
- if (inventorySP && inv_floater)
- {
- res = inventorySP->getActivePanel();
- z_min = gFloaterView->getZOrder(inv_floater);
- active_inv_floaterp = inv_floater;
- }
- else
- {
- llwarns << "Inventory tab is detached from sidetray, but either panel or floater were not found!" << llendl;
- }
+ llwarns << "Could not find My Inventory floater" << llendl;
+ return FALSE;
}
-
- // B. Iterate through the inventory floaters and return whichever is on top.
+
+ LLSidepanelInventory *inventory_panel = LLFloaterSidePanelContainer::getPanel<LLSidepanelInventory>("inventory");
+
+ // Iterate through the inventory floaters and return whichever is on top.
LLFloaterReg::const_instance_list_t& inst_list = LLFloaterReg::getFloaterList("inventory");
for (LLFloaterReg::const_instance_list_t::const_iterator iter = inst_list.begin(); iter != inst_list.end(); ++iter)
{
- LLFloaterInventory* iv = dynamic_cast<LLFloaterInventory*>(*iter);
- if (iv && iv->getVisible())
+ LLFloaterSidePanelContainer* inventory_floater = dynamic_cast<LLFloaterSidePanelContainer*>(*iter);
+ inventory_panel = inventory_floater->findChild<LLSidepanelInventory>("main_panel");
+
+ if (inventory_floater && inventory_panel && inventory_floater->getVisible())
{
- S32 z_order = gFloaterView->getZOrder(iv);
+ S32 z_order = gFloaterView->getZOrder(inventory_floater);
if (z_order < z_min)
{
- res = iv->getPanel();
+ res = inventory_panel->getActivePanel();
z_min = z_order;
- active_inv_floaterp = iv;
+ active_inv_floaterp = inventory_floater;
}
}
}
@@ -1139,24 +1132,71 @@ LLInventoryPanel* LLInventoryPanel::getActiveInventoryPanel(BOOL auto_open)
{
// Make sure the floater is not minimized (STORM-438).
if (active_inv_floaterp && active_inv_floaterp->isMinimized())
+ {
active_inv_floaterp->setMinimized(FALSE);
+ }
+ }
+ else if (auto_open)
+ {
+ floater_inventory->openFloater();
- return res;
+ res = inventory_panel->getActivePanel();
}
-
- // C. If no panels are open and we don't want to force open a panel, then just abort out.
- if (!auto_open) return NULL;
-
- // D. Open the inventory side panel and use that.
- LLSD key;
- LLSidepanelInventory *sidepanel_inventory =
- dynamic_cast<LLSidepanelInventory *>(LLSideTray::getInstance()->showPanel("sidepanel_inventory", key));
- if (sidepanel_inventory)
+
+ return res;
+}
+
+//static
+void LLInventoryPanel::openInventoryPanelAndSetSelection(BOOL auto_open, const LLUUID& obj_id)
+{
+ LLInventoryPanel *active_panel = LLInventoryPanel::getActiveInventoryPanel(auto_open);
+
+ if (active_panel)
{
- return sidepanel_inventory->getActivePanel();
- }
+ LL_DEBUGS("Messaging") << "Highlighting" << obj_id << LL_ENDL;
+
+ LLViewerInventoryItem * item = gInventory.getItem(obj_id);
+ LLViewerInventoryCategory * cat = gInventory.getCategory(obj_id);
+
+ bool in_inbox = false;
+
+ LLViewerInventoryCategory * parent_cat = NULL;
+
+ if (item)
+ {
+ parent_cat = gInventory.getCategory(item->getParentUUID());
+ }
+ else if (cat)
+ {
+ parent_cat = gInventory.getCategory(cat->getParentUUID());
+ }
+
+ if (parent_cat)
+ {
+ in_inbox = (LLFolderType::FT_INBOX == parent_cat->getPreferredType());
+ }
+
+ if (in_inbox)
+ {
+ LLSidepanelInventory * sidepanel_inventory = LLFloaterSidePanelContainer::getPanel<LLSidepanelInventory>("inventory");
+ LLInventoryPanel * inventory_panel = NULL;
+
+ if (in_inbox)
+ {
+ sidepanel_inventory->openInbox();
+ inventory_panel = sidepanel_inventory->getInboxPanel();
+ }
- return NULL;
+ if (inventory_panel)
+ {
+ inventory_panel->setSelection(obj_id, TAKE_FOCUS_YES);
+ }
+ }
+ else
+ {
+ active_panel->setSelection(obj_id, TAKE_FOCUS_YES);
+ }
+ }
}
void LLInventoryPanel::addHideFolderType(LLFolderType::EType folder_type)
diff --git a/indra/newview/llinventorypanel.h b/indra/newview/llinventorypanel.h
index 8635ebc5c8..8279163762 100644
--- a/indra/newview/llinventorypanel.h
+++ b/indra/newview/llinventorypanel.h
@@ -84,6 +84,7 @@ public:
Optional<Filter> filter;
Optional<std::string> start_folder;
Optional<bool> use_label_suffix;
+ Optional<bool> show_empty_message;
Optional<bool> show_load_status;
Optional<LLScrollContainer::Params> scroll;
Optional<bool> accepts_drag_and_drop;
@@ -96,6 +97,7 @@ public:
filter("filter"),
start_folder("start_folder"),
use_label_suffix("use_label_suffix", true),
+ show_empty_message("show_empty_message", true),
show_load_status("show_load_status"),
scroll("scroll"),
accepts_drag_and_drop("accepts_drag_and_drop")
@@ -175,6 +177,8 @@ public:
// Find whichever inventory panel is active / on top.
// "Auto_open" determines if we open an inventory panel if none are open.
static LLInventoryPanel *getActiveInventoryPanel(BOOL auto_open = TRUE);
+
+ static void openInventoryPanelAndSetSelection(BOOL auto_open, const LLUUID& obj_id);
protected:
void openStartFolderOrMyInventory(); // open the first level of inventory
@@ -186,6 +190,7 @@ protected:
BOOL mAcceptsDragAndDrop;
BOOL mAllowMultiSelect;
BOOL mShowItemLinkOverlays; // Shows link graphic over inventory item icons
+ BOOL mShowEmptyMessage;
BOOL mShowLoadStatus;
LLFolderView* mFolderRoot;
diff --git a/indra/newview/lllandmarkactions.cpp b/indra/newview/lllandmarkactions.cpp
index f2aec20611..6625a194fb 100644
--- a/indra/newview/lllandmarkactions.cpp
+++ b/indra/newview/lllandmarkactions.cpp
@@ -413,7 +413,7 @@ void LLLandmarkActions::copySLURLtoClipboard(const LLUUID& landmarkInventoryItem
void copy_slurl_to_clipboard_callback(const std::string& slurl)
{
- gViewerWindow->mWindow->copyTextToClipboard(utf8str_to_wstring(slurl));
+ gViewerWindow->getWindow()->copyTextToClipboard(utf8str_to_wstring(slurl));
LLSD args;
args["SLURL"] = slurl;
LLNotificationsUtil::add("CopySLURL", args);
diff --git a/indra/newview/lllocationinputctrl.cpp b/indra/newview/lllocationinputctrl.cpp
index 1c8f6b6c98..025181ead5 100644
--- a/indra/newview/lllocationinputctrl.cpp
+++ b/indra/newview/lllocationinputctrl.cpp
@@ -44,11 +44,11 @@
// newview includes
#include "llagent.h"
+#include "llfloatersidepanelcontainer.h"
#include "llinventoryobserver.h"
#include "lllandmarkactions.h"
#include "lllandmarklist.h"
#include "llteleporthistory.h"
-#include "llsidetray.h"
#include "llslurl.h"
#include "llstatusbar.h" // getHealth()
#include "lltrans.h"
@@ -600,7 +600,7 @@ void LLLocationInputCtrl::reshape(S32 width, S32 height, BOOL called_from_parent
void LLLocationInputCtrl::onInfoButtonClicked()
{
- LLSideTray::getInstance()->showPanel("panel_places", LLSD().with("type", "agent"));
+ LLFloaterSidePanelContainer::showPanel("places", LLSD().with("type", "agent"));
}
void LLLocationInputCtrl::onForSaleButtonClicked()
@@ -618,11 +618,11 @@ void LLLocationInputCtrl::onAddLandmarkButtonClicked()
key["type"] = "landmark";
key["id"] = landmark->getUUID();
- LLSideTray::getInstance()->showPanel("panel_places", key);
+ LLFloaterSidePanelContainer::showPanel("places", key);
}
else
{
- LLSideTray::getInstance()->showPanel("panel_places", LLSD().with("type", "create_landmark"));
+ LLFloaterSidePanelContainer::showPanel("places", LLSD().with("type", "create_landmark"));
}
}
@@ -1087,12 +1087,12 @@ void LLLocationInputCtrl::onLocationContextMenuItemClicked(const LLSD& userdata)
if(!landmark)
{
- LLSideTray::getInstance()->showPanel("panel_places", LLSD().with("type", "create_landmark"));
+ LLFloaterSidePanelContainer::showPanel("places", LLSD().with("type", "create_landmark"));
}
else
{
- LLSideTray::getInstance()->showPanel("panel_places",
- LLSD().with("type", "landmark").with("id",landmark->getUUID()));
+ LLFloaterSidePanelContainer::showPanel("places", LLSD().with("type", "landmark").with("id",landmark->getUUID()));
+
}
}
else if (item == "cut")
diff --git a/indra/newview/lllogininstance.cpp b/indra/newview/lllogininstance.cpp
index f00d6087f9..419641d23c 100644
--- a/indra/newview/lllogininstance.cpp
+++ b/indra/newview/lllogininstance.cpp
@@ -561,15 +561,7 @@ void LLLoginInstance::constructAuthParams(LLPointer<LLCredential> user_credentia
//send this info to login.cgi for stats gathering
//since viewerstats isn't reliable enough
- if (gSavedSettings.getString("SessionSettingsFile").empty())
- {
- requested_options.append("advanced-mode");
- }
- else
- {
- requested_options.append("basic-mode");
- //requested_options.append("inventory-basic");
- }
+ requested_options.append("advanced-mode");
#endif
requested_options.append("max-agent-groups");
diff --git a/indra/newview/llmainlooprepeater.cpp b/indra/newview/llmainlooprepeater.cpp
index d73048a28b..5c020e6d98 100644
--- a/indra/newview/llmainlooprepeater.cpp
+++ b/indra/newview/llmainlooprepeater.cpp
@@ -46,7 +46,7 @@ void LLMainLoopRepeater::start(void)
{
if(mQueue != 0) return;
- mQueue = new LLThreadSafeQueue<LLSD>(1024);
+ mQueue = new LLThreadSafeQueue<LLSD>(gAPRPoolp, 1024);
mMainLoopConnection = LLEventPumps::instance().
obtain("mainloop").listen(LLEventPump::inventName(), boost::bind(&LLMainLoopRepeater::onMainLoop, this, _1));
mRepeaterConnection = LLEventPumps::instance().
diff --git a/indra/newview/llmanip.cpp b/indra/newview/llmanip.cpp
index 85e0043651..6e0f360cbc 100644
--- a/indra/newview/llmanip.cpp
+++ b/indra/newview/llmanip.cpp
@@ -372,14 +372,14 @@ void LLManip::renderGuidelines(BOOL draw_x, BOOL draw_y, BOOL draw_z)
//LLVector3 center_agent = LLSelectMgr::getInstance()->getBBoxOfSelection().getCenterAgent();
LLVector3 center_agent = getPivotPoint();
- glPushMatrix();
+ gGL.pushMatrix();
{
- glTranslatef(center_agent.mV[VX], center_agent.mV[VY], center_agent.mV[VZ]);
+ gGL.translatef(center_agent.mV[VX], center_agent.mV[VY], center_agent.mV[VZ]);
F32 angle_radians, x, y, z;
grid_rot.getAngleAxis(&angle_radians, &x, &y, &z);
- glRotatef(angle_radians * RAD_TO_DEG, x, y, z);
+ gGL.rotatef(angle_radians * RAD_TO_DEG, x, y, z);
F32 region_size = LLWorld::getInstance()->getRegionWidthInMeters();
@@ -416,7 +416,7 @@ void LLManip::renderGuidelines(BOOL draw_x, BOOL draw_y, BOOL draw_z)
}
LLUI::setLineWidth(1.0f);
}
- glPopMatrix();
+ gGL.popMatrix();
}
void LLManip::renderXYZ(const LLVector3 &vec)
@@ -466,11 +466,11 @@ void LLManip::renderXYZ(const LLVector3 &vec)
feedback_string = llformat("X: %.3f", vec.mV[VX]);
hud_render_text(utf8str_to_wstring(feedback_string), camera_pos, *font, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, -102.f, (F32)vertical_offset, LLColor4(1.f, 0.5f, 0.5f, 1.f), FALSE);
- glColor3f(0.5f, 1.f, 0.5f);
+ gGL.diffuseColor3f(0.5f, 1.f, 0.5f);
feedback_string = llformat("Y: %.3f", vec.mV[VY]);
hud_render_text(utf8str_to_wstring(feedback_string), camera_pos, *font, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, -27.f, (F32)vertical_offset, LLColor4(0.5f, 1.f, 0.5f, 1.f), FALSE);
- glColor3f(0.5f, 0.5f, 1.f);
+ gGL.diffuseColor3f(0.5f, 0.5f, 1.f);
feedback_string = llformat("Z: %.3f", vec.mV[VZ]);
hud_render_text(utf8str_to_wstring(feedback_string), camera_pos, *font, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, 48.f, (F32)vertical_offset, LLColor4(0.5f, 0.5f, 1.f, 1.f), FALSE);
}
@@ -481,8 +481,8 @@ void LLManip::renderTickText(const LLVector3& pos, const std::string& text, cons
const LLFontGL* big_fontp = LLFontGL::getFontSansSerif();
BOOL hud_selection = mObjectSelection->getSelectType() == SELECT_TYPE_HUD;
- glMatrixMode(GL_MODELVIEW);
- glPushMatrix();
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
+ gGL.pushMatrix();
LLVector3 render_pos = pos;
if (hud_selection)
{
@@ -490,7 +490,7 @@ void LLManip::renderTickText(const LLVector3& pos, const std::string& text, cons
F32 inv_zoom_amt = 1.f / zoom_amt;
// scale text back up to counter-act zoom level
render_pos = pos * zoom_amt;
- glScalef(inv_zoom_amt, inv_zoom_amt, inv_zoom_amt);
+ gGL.scalef(inv_zoom_amt, inv_zoom_amt, inv_zoom_amt);
}
// render shadow first
@@ -501,7 +501,7 @@ void LLManip::renderTickText(const LLVector3& pos, const std::string& text, cons
gViewerWindow->setup3DViewport();
hud_render_utf8text(text, render_pos, *big_fontp, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, -0.5f * big_fontp->getWidthF32(text), 3.f, color, mObjectSelection->getSelectType() == SELECT_TYPE_HUD);
- glPopMatrix();
+ gGL.popMatrix();
}
void LLManip::renderTickValue(const LLVector3& pos, F32 value, const std::string& suffix, const LLColor4 &color)
@@ -539,8 +539,8 @@ void LLManip::renderTickValue(const LLVector3& pos, F32 value, const std::string
}
BOOL hud_selection = mObjectSelection->getSelectType() == SELECT_TYPE_HUD;
- glMatrixMode(GL_MODELVIEW);
- glPushMatrix();
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
+ gGL.pushMatrix();
LLVector3 render_pos = pos;
if (hud_selection)
{
@@ -548,7 +548,7 @@ void LLManip::renderTickValue(const LLVector3& pos, F32 value, const std::string
F32 inv_zoom_amt = 1.f / zoom_amt;
// scale text back up to counter-act zoom level
render_pos = pos * zoom_amt;
- glScalef(inv_zoom_amt, inv_zoom_amt, inv_zoom_amt);
+ gGL.scalef(inv_zoom_amt, inv_zoom_amt, inv_zoom_amt);
}
LLColor4 shadow_color = LLColor4::black;
@@ -573,7 +573,7 @@ void LLManip::renderTickValue(const LLVector3& pos, F32 value, const std::string
gViewerWindow->setup3DViewport();
hud_render_utf8text(val_string, render_pos, *big_fontp, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, -0.5f * big_fontp->getWidthF32(val_string), 3.f, color, hud_selection);
}
- glPopMatrix();
+ gGL.popMatrix();
}
LLColor4 LLManip::setupSnapGuideRenderPass(S32 pass)
diff --git a/indra/newview/llmaniprotate.cpp b/indra/newview/llmaniprotate.cpp
index 6ee095475f..a8da94f75e 100644
--- a/indra/newview/llmaniprotate.cpp
+++ b/indra/newview/llmaniprotate.cpp
@@ -53,6 +53,7 @@
#include "llviewercamera.h"
#include "llviewerobject.h"
#include "llviewerobject.h"
+#include "llviewershadermgr.h"
#include "llviewerwindow.h"
#include "llworld.h"
#include "pipeline.h"
@@ -113,7 +114,7 @@ void LLManipRotate::handleSelect()
void LLManipRotate::render()
{
LLGLSUIDefault gls_ui;
- gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
+ gGL.getTexUnit(0)->bind(LLViewerFetchedTexture::sWhiteImagep);
LLGLDepthTest gls_depth(GL_TRUE);
LLGLEnable gl_blend(GL_BLEND);
LLGLEnable gls_alpha_test(GL_ALPHA_TEST);
@@ -130,12 +131,12 @@ void LLManipRotate::render()
return;
}
- glMatrixMode(GL_MODELVIEW);
- glPushMatrix();
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
+ gGL.pushMatrix();
if (mObjectSelection->getSelectType() == SELECT_TYPE_HUD)
{
F32 zoom = gAgentCamera.mHUDCurZoom;
- glScalef(zoom, zoom, zoom);
+ gGL.scalef(zoom, zoom, zoom);
}
@@ -145,8 +146,9 @@ void LLManipRotate::render()
LLColor4 highlight_inside( 0.7f, 0.7f, 0.f, 0.5f );
F32 width_meters = WIDTH_PIXELS * mRadiusMeters / RADIUS_PIXELS;
- glPushMatrix();
+ gGL.pushMatrix();
{
+
// are we in the middle of a constrained drag?
if (mManipPart >= LL_ROT_X && mManipPart <= LL_ROT_Z)
{
@@ -154,13 +156,18 @@ void LLManipRotate::render()
}
else
{
+ if (LLGLSLShader::sNoFixedFunction)
+ {
+ gDebugProgram.bind();
+ }
+
LLGLEnable cull_face(GL_CULL_FACE);
LLGLDepthTest gls_depth(GL_FALSE);
- glPushMatrix();
+ gGL.pushMatrix();
{
// Draw "sphere" (intersection of sphere with tangent cone that has apex at camera)
- glTranslatef( mCenterToProfilePlane.mV[VX], mCenterToProfilePlane.mV[VY], mCenterToProfilePlane.mV[VZ] );
- glTranslatef( center.mV[VX], center.mV[VY], center.mV[VZ] );
+ gGL.translatef( mCenterToProfilePlane.mV[VX], mCenterToProfilePlane.mV[VY], mCenterToProfilePlane.mV[VZ] );
+ gGL.translatef( center.mV[VX], center.mV[VY], center.mV[VZ] );
// Inverse change of basis vectors
LLVector3 forward = mCenterToCamNorm;
@@ -177,35 +184,41 @@ void LLManipRotate::render()
LLMatrix4 mat;
mat.initRows(a, b, c, LLVector4(0.f, 0.f, 0.f, 1.f));
- glMultMatrixf( &mat.mMatrix[0][0] );
+ gGL.multMatrix( &mat.mMatrix[0][0] );
- glRotatef( -90, 0.f, 1.f, 0.f);
+ gGL.rotatef( -90, 0.f, 1.f, 0.f);
LLColor4 color;
if (mManipPart == LL_ROT_ROLL || mHighlightedPart == LL_ROT_ROLL)
{
color.setVec(0.8f, 0.8f, 0.8f, 0.8f);
- glScalef(mManipulatorScales.mV[VW], mManipulatorScales.mV[VW], mManipulatorScales.mV[VW]);
+ gGL.scalef(mManipulatorScales.mV[VW], mManipulatorScales.mV[VW], mManipulatorScales.mV[VW]);
}
else
{
color.setVec( 0.7f, 0.7f, 0.7f, 0.6f );
}
+ gGL.diffuseColor4fv(color.mV);
gl_washer_2d(mRadiusMeters + width_meters, mRadiusMeters, CIRCLE_STEPS, color, color);
if (mManipPart == LL_NO_PART)
{
gGL.color4f( 0.7f, 0.7f, 0.7f, 0.3f );
+ gGL.diffuseColor4f(0.7f, 0.7f, 0.7f, 0.3f);
gl_circle_2d( 0, 0, mRadiusMeters, CIRCLE_STEPS, TRUE );
}
- GLdouble plane_eqn[] = { 0, 0, 1, 0 };
- glClipPlane( GL_CLIP_PLANE0, plane_eqn );
+ gGL.flush();
}
- glPopMatrix();
- }
+ gGL.popMatrix();
- glTranslatef( center.mV[VX], center.mV[VY], center.mV[VZ] );
+ if (LLGLSLShader::sNoFixedFunction)
+ {
+ gUIProgram.bind();
+ }
+ }
+
+ gGL.translatef( center.mV[VX], center.mV[VY], center.mV[VZ] );
LLQuaternion rot;
F32 angle_radians, x, y, z;
@@ -217,41 +230,46 @@ void LLManipRotate::render()
LLSelectMgr::getInstance()->getGrid(grid_origin, grid_rotation, grid_scale);
grid_rotation.getAngleAxis(&angle_radians, &x, &y, &z);
- glRotatef(angle_radians * RAD_TO_DEG, x, y, z);
+ gGL.rotatef(angle_radians * RAD_TO_DEG, x, y, z);
+ if (LLGLSLShader::sNoFixedFunction)
+ {
+ gDebugProgram.bind();
+ }
+
if (mManipPart == LL_ROT_Z)
{
mManipulatorScales = lerp(mManipulatorScales, LLVector4(1.f, 1.f, SELECTED_MANIPULATOR_SCALE, 1.f), LLCriticalDamp::getInterpolant(MANIPULATOR_SCALE_HALF_LIFE));
- glPushMatrix();
+ gGL.pushMatrix();
{
// selected part
- glScalef(mManipulatorScales.mV[VZ], mManipulatorScales.mV[VZ], mManipulatorScales.mV[VZ]);
+ gGL.scalef(mManipulatorScales.mV[VZ], mManipulatorScales.mV[VZ], mManipulatorScales.mV[VZ]);
renderActiveRing( mRadiusMeters, width_meters, LLColor4( 0.f, 0.f, 1.f, 1.f) , LLColor4( 0.f, 0.f, 1.f, 0.3f ));
}
- glPopMatrix();
+ gGL.popMatrix();
}
else if (mManipPart == LL_ROT_Y)
{
mManipulatorScales = lerp(mManipulatorScales, LLVector4(1.f, SELECTED_MANIPULATOR_SCALE, 1.f, 1.f), LLCriticalDamp::getInterpolant(MANIPULATOR_SCALE_HALF_LIFE));
- glPushMatrix();
+ gGL.pushMatrix();
{
- glRotatef( 90.f, 1.f, 0.f, 0.f );
- glScalef(mManipulatorScales.mV[VY], mManipulatorScales.mV[VY], mManipulatorScales.mV[VY]);
+ gGL.rotatef( 90.f, 1.f, 0.f, 0.f );
+ gGL.scalef(mManipulatorScales.mV[VY], mManipulatorScales.mV[VY], mManipulatorScales.mV[VY]);
renderActiveRing( mRadiusMeters, width_meters, LLColor4( 0.f, 1.f, 0.f, 1.f), LLColor4( 0.f, 1.f, 0.f, 0.3f));
}
- glPopMatrix();
+ gGL.popMatrix();
}
else if (mManipPart == LL_ROT_X)
{
mManipulatorScales = lerp(mManipulatorScales, LLVector4(SELECTED_MANIPULATOR_SCALE, 1.f, 1.f, 1.f), LLCriticalDamp::getInterpolant(MANIPULATOR_SCALE_HALF_LIFE));
- glPushMatrix();
+ gGL.pushMatrix();
{
- glRotatef( 90.f, 0.f, 1.f, 0.f );
- glScalef(mManipulatorScales.mV[VX], mManipulatorScales.mV[VX], mManipulatorScales.mV[VX]);
+ gGL.rotatef( 90.f, 0.f, 1.f, 0.f );
+ gGL.scalef(mManipulatorScales.mV[VX], mManipulatorScales.mV[VX], mManipulatorScales.mV[VX]);
renderActiveRing( mRadiusMeters, width_meters, LLColor4( 1.f, 0.f, 0.f, 1.f), LLColor4( 1.f, 0.f, 0.f, 0.3f));
}
- glPopMatrix();
+ gGL.popMatrix();
}
else if (mManipPart == LL_ROT_ROLL)
{
@@ -271,12 +289,13 @@ void LLManipRotate::render()
// First pass: centers. Second pass: sides.
for( S32 i=0; i<2; i++ )
{
- glPushMatrix();
+
+ gGL.pushMatrix();
{
if (mHighlightedPart == LL_ROT_Z)
{
mManipulatorScales = lerp(mManipulatorScales, LLVector4(1.f, 1.f, SELECTED_MANIPULATOR_SCALE, 1.f), LLCriticalDamp::getInterpolant(MANIPULATOR_SCALE_HALF_LIFE));
- glScalef(mManipulatorScales.mV[VZ], mManipulatorScales.mV[VZ], mManipulatorScales.mV[VZ]);
+ gGL.scalef(mManipulatorScales.mV[VZ], mManipulatorScales.mV[VZ], mManipulatorScales.mV[VZ]);
// hovering over part
gl_ring( mRadiusMeters, width_meters, LLColor4( 0.f, 0.f, 1.f, 1.f ), LLColor4( 0.f, 0.f, 1.f, 0.5f ), CIRCLE_STEPS, i);
}
@@ -286,15 +305,15 @@ void LLManipRotate::render()
gl_ring( mRadiusMeters, width_meters, LLColor4( 0.f, 0.f, 0.8f, 0.8f ), LLColor4( 0.f, 0.f, 0.8f, 0.4f ), CIRCLE_STEPS, i);
}
}
- glPopMatrix();
-
- glPushMatrix();
+ gGL.popMatrix();
+
+ gGL.pushMatrix();
{
- glRotatef( 90.f, 1.f, 0.f, 0.f );
+ gGL.rotatef( 90.f, 1.f, 0.f, 0.f );
if (mHighlightedPart == LL_ROT_Y)
{
mManipulatorScales = lerp(mManipulatorScales, LLVector4(1.f, SELECTED_MANIPULATOR_SCALE, 1.f, 1.f), LLCriticalDamp::getInterpolant(MANIPULATOR_SCALE_HALF_LIFE));
- glScalef(mManipulatorScales.mV[VY], mManipulatorScales.mV[VY], mManipulatorScales.mV[VY]);
+ gGL.scalef(mManipulatorScales.mV[VY], mManipulatorScales.mV[VY], mManipulatorScales.mV[VY]);
// hovering over part
gl_ring( mRadiusMeters, width_meters, LLColor4( 0.f, 1.f, 0.f, 1.f ), LLColor4( 0.f, 1.f, 0.f, 0.5f ), CIRCLE_STEPS, i);
}
@@ -304,15 +323,15 @@ void LLManipRotate::render()
gl_ring( mRadiusMeters, width_meters, LLColor4( 0.f, 0.8f, 0.f, 0.8f ), LLColor4( 0.f, 0.8f, 0.f, 0.4f ), CIRCLE_STEPS, i);
}
}
- glPopMatrix();
+ gGL.popMatrix();
- glPushMatrix();
+ gGL.pushMatrix();
{
- glRotatef( 90.f, 0.f, 1.f, 0.f );
+ gGL.rotatef( 90.f, 0.f, 1.f, 0.f );
if (mHighlightedPart == LL_ROT_X)
{
mManipulatorScales = lerp(mManipulatorScales, LLVector4(SELECTED_MANIPULATOR_SCALE, 1.f, 1.f, 1.f), LLCriticalDamp::getInterpolant(MANIPULATOR_SCALE_HALF_LIFE));
- glScalef(mManipulatorScales.mV[VX], mManipulatorScales.mV[VX], mManipulatorScales.mV[VX]);
+ gGL.scalef(mManipulatorScales.mV[VX], mManipulatorScales.mV[VX], mManipulatorScales.mV[VX]);
// hovering over part
gl_ring( mRadiusMeters, width_meters, LLColor4( 1.f, 0.f, 0.f, 1.f ), LLColor4( 1.f, 0.f, 0.f, 0.5f ), CIRCLE_STEPS, i);
@@ -323,17 +342,26 @@ void LLManipRotate::render()
gl_ring( mRadiusMeters, width_meters, LLColor4( 0.8f, 0.f, 0.f, 0.8f ), LLColor4( 0.8f, 0.f, 0.f, 0.4f ), CIRCLE_STEPS, i);
}
}
- glPopMatrix();
+ gGL.popMatrix();
if (mHighlightedPart == LL_ROT_ROLL)
{
mManipulatorScales = lerp(mManipulatorScales, LLVector4(1.f, 1.f, 1.f, SELECTED_MANIPULATOR_SCALE), LLCriticalDamp::getInterpolant(MANIPULATOR_SCALE_HALF_LIFE));
}
+
}
+
}
+
+ if (LLGLSLShader::sNoFixedFunction)
+ {
+ gUIProgram.bind();
+ }
+
}
- glPopMatrix();
- glPopMatrix();
+ gGL.popMatrix();
+ gGL.popMatrix();
+
LLVector3 euler_angles;
LLQuaternion object_rot = first_object->getRotationEdit();
@@ -796,14 +824,14 @@ void LLManipRotate::renderSnapGuides()
for (S32 pass = 0; pass < 3; pass++)
{
// render snap guide ring
- glPushMatrix();
+ gGL.pushMatrix();
LLQuaternion snap_guide_rot;
F32 angle_radians, x, y, z;
snap_guide_rot.shortestArc(LLVector3::z_axis, getConstraintAxis());
snap_guide_rot.getAngleAxis(&angle_radians, &x, &y, &z);
- glTranslatef(center.mV[VX], center.mV[VY], center.mV[VZ]);
- glRotatef(angle_radians * RAD_TO_DEG, x, y, z);
+ gGL.translatef(center.mV[VX], center.mV[VY], center.mV[VZ]);
+ gGL.rotatef(angle_radians * RAD_TO_DEG, x, y, z);
LLColor4 line_color = setupSnapGuideRenderPass(pass);
@@ -826,7 +854,7 @@ void LLManipRotate::renderSnapGuides()
{
gl_circle_2d(0.f, 0.f, mRadiusMeters * SNAP_GUIDE_INNER_RADIUS, CIRCLE_STEPS, FALSE);
}
- glPopMatrix();
+ gGL.popMatrix();
for (S32 i = 0; i < 64; i++)
{
diff --git a/indra/newview/llmanipscale.cpp b/indra/newview/llmanipscale.cpp
index 4eb94dfb8e..f6df4cdfbf 100644
--- a/indra/newview/llmanipscale.cpp
+++ b/indra/newview/llmanipscale.cpp
@@ -217,12 +217,12 @@ void LLManipScale::render()
if( canAffectSelection() )
{
- glMatrixMode(GL_MODELVIEW);
- glPushMatrix();
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
+ gGL.pushMatrix();
if (mObjectSelection->getSelectType() == SELECT_TYPE_HUD)
{
F32 zoom = gAgentCamera.mHUDCurZoom;
- glScalef(zoom, zoom, zoom);
+ gGL.scalef(zoom, zoom, zoom);
}
////////////////////////////////////////////////////////////////////////
@@ -274,14 +274,14 @@ void LLManipScale::render()
LLVector3 pos_agent = bbox.getPositionAgent();
LLQuaternion rot = bbox.getRotation();
- glMatrixMode(GL_MODELVIEW);
- glPushMatrix();
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
+ gGL.pushMatrix();
{
- glTranslatef(pos_agent.mV[VX], pos_agent.mV[VY], pos_agent.mV[VZ]);
+ gGL.translatef(pos_agent.mV[VX], pos_agent.mV[VY], pos_agent.mV[VZ]);
F32 angle_radians, x, y, z;
rot.getAngleAxis(&angle_radians, &x, &y, &z);
- glRotatef(angle_radians * RAD_TO_DEG, x, y, z);
+ gGL.rotatef(angle_radians * RAD_TO_DEG, x, y, z);
{
@@ -303,13 +303,13 @@ void LLManipScale::render()
glPolygonOffset( 0.f, 0.f);
}
}
- glPopMatrix();
+ gGL.popMatrix();
if (mManipPart != LL_NO_PART)
{
renderSnapGuides(bbox);
}
- glPopMatrix();
+ gGL.popMatrix();
renderXYZ(bbox.getExtentLocal());
}
@@ -719,17 +719,17 @@ void LLManipScale::renderEdges( const LLBBox& bbox )
LLVector3 direction = edgeToUnitVector( part );
LLVector3 center_to_edge = unitVectorToLocalBBoxExtent( direction, bbox );
- glPushMatrix();
+ gGL.pushMatrix();
{
- glTranslatef( center_to_edge.mV[0], center_to_edge.mV[1], center_to_edge.mV[2] );
+ gGL.translatef( center_to_edge.mV[0], center_to_edge.mV[1], center_to_edge.mV[2] );
conditionalHighlight( part );
- glScalef(
+ gGL.scalef(
direction.mV[0] ? edge_width : extent.mV[VX],
direction.mV[1] ? edge_width : extent.mV[VY],
direction.mV[2] ? edge_width : extent.mV[VZ] );
gBox.render();
}
- glPopMatrix();
+ gGL.popMatrix();
}
}
@@ -766,13 +766,13 @@ void LLManipScale::renderBoxHandle( F32 x, F32 y, F32 z )
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
LLGLDepthTest gls_depth(GL_FALSE);
- glPushMatrix();
+ gGL.pushMatrix();
{
- glTranslatef( x, y, z );
- glScalef( mScaledBoxHandleSize, mScaledBoxHandleSize, mScaledBoxHandleSize );
+ gGL.translatef( x, y, z );
+ gGL.scalef( mScaledBoxHandleSize, mScaledBoxHandleSize, mScaledBoxHandleSize );
gBox.render();
}
- glPopMatrix();
+ gGL.popMatrix();
}
@@ -788,16 +788,16 @@ void LLManipScale::renderAxisHandle( const LLVector3& start, const LLVector3& en
LLVector3 delta = end - offset_start;
LLVector3 pos = offset_start + 0.5f * delta;
- glPushMatrix();
+ gGL.pushMatrix();
{
- glTranslatef( pos.mV[VX], pos.mV[VY], pos.mV[VZ] );
- glScalef(
+ gGL.translatef( pos.mV[VX], pos.mV[VY], pos.mV[VZ] );
+ gGL.scalef(
mBoxHandleSize + llabs(delta.mV[VX]),
mBoxHandleSize + llabs(delta.mV[VY]),
mBoxHandleSize + llabs(delta.mV[VZ]));
gBox.render();
}
- glPopMatrix();
+ gGL.popMatrix();
}
else
{
diff --git a/indra/newview/llmaniptranslate.cpp b/indra/newview/llmaniptranslate.cpp
index f871df0c36..3a88fbd96d 100644
--- a/indra/newview/llmaniptranslate.cpp
+++ b/indra/newview/llmaniptranslate.cpp
@@ -1066,12 +1066,12 @@ BOOL LLManipTranslate::handleMouseUp(S32 x, S32 y, MASK mask)
void LLManipTranslate::render()
{
- glMatrixMode(GL_MODELVIEW);
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
gGL.pushMatrix();
if (mObjectSelection->getSelectType() == SELECT_TYPE_HUD)
{
F32 zoom = gAgentCamera.mHUDCurZoom;
- glScalef(zoom, zoom, zoom);
+ gGL.scalef(zoom, zoom, zoom);
}
{
LLGLDepthTest gls_depth(GL_TRUE, GL_FALSE);
@@ -1515,11 +1515,12 @@ void LLManipTranslate::renderSnapGuides()
F32 x,y,z,angle_radians;
grid_rotation.getAngleAxis(&angle_radians, &x, &y, &z);
gGL.translatef(selection_center.mV[VX], selection_center.mV[VY], selection_center.mV[VZ]);
- glRotatef(angle_radians * RAD_TO_DEG, x, y, z);
+ gGL.rotatef(angle_radians * RAD_TO_DEG, x, y, z);
F32 sz = mGridSizeMeters;
F32 tiles = sz;
- glMatrixMode(GL_TEXTURE);
+
+ gGL.matrixMode(LLRender::MM_TEXTURE);
gGL.pushMatrix();
usc = 1.0f/usc;
vsc = 1.0f/vsc;
@@ -1533,7 +1534,7 @@ void LLManipTranslate::renderSnapGuides()
vsc *= 0.5f;
}
- glScalef(usc, vsc, 1.0f);
+ gGL.scalef(usc, vsc, 1.0f);
gGL.translatef(u, v, 0);
float a = line_alpha;
@@ -1566,7 +1567,7 @@ void LLManipTranslate::renderSnapGuides()
renderGrid(u,v,tiles,1,1,1,a);
gGL.popMatrix();
- glMatrixMode(GL_MODELVIEW);
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
gGL.popMatrix();
}
@@ -1665,7 +1666,7 @@ void LLManipTranslate::highlightIntersection(LLVector3 normal,
glStencilFunc(GL_ALWAYS, 0, stencil_mask);
gGL.setColorMask(false, false);
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
- glColor4f(1,1,1,1);
+ gGL.diffuseColor4f(1,1,1,1);
//setup clip plane
normal = normal * grid_rotation;
@@ -1723,7 +1724,7 @@ void LLManipTranslate::highlightIntersection(LLVector3 normal,
F32 x,y,z,angle_radians;
grid_rotation.getAngleAxis(&angle_radians, &x, &y, &z);
gGL.translatef(selection_center.mV[VX], selection_center.mV[VY], selection_center.mV[VZ]);
- glRotatef(angle_radians * RAD_TO_DEG, x, y, z);
+ gGL.rotatef(angle_radians * RAD_TO_DEG, x, y, z);
F32 sz = mGridSizeMeters;
F32 tiles = sz;
@@ -1852,7 +1853,7 @@ void LLManipTranslate::renderTranslationHandles()
mGridSizeMeters = gSavedSettings.getF32("GridDrawSize");
mConeSize = mArrowLengthMeters / 4.f;
- glMatrixMode(GL_MODELVIEW);
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
gGL.pushMatrix();
{
gGL.translatef(selection_center.mV[VX], selection_center.mV[VY], selection_center.mV[VZ]);
@@ -1860,7 +1861,7 @@ void LLManipTranslate::renderTranslationHandles()
F32 angle_radians, x, y, z;
grid_rotation.getAngleAxis(&angle_radians, &x, &y, &z);
- glRotatef(angle_radians * RAD_TO_DEG, x, y, z);
+ gGL.rotatef(angle_radians * RAD_TO_DEG, x, y, z);
LLQuaternion invRotation = grid_rotation;
invRotation.conjQuat();
@@ -1908,9 +1909,9 @@ void LLManipTranslate::renderTranslationHandles()
{
// render YZ plane manipulator
gGL.pushMatrix();
- glScalef(mPlaneManipPositions.mV[VX], mPlaneManipPositions.mV[VY], mPlaneManipPositions.mV[VZ]);
+ gGL.scalef(mPlaneManipPositions.mV[VX], mPlaneManipPositions.mV[VY], mPlaneManipPositions.mV[VZ]);
gGL.translatef(0.f, mPlaneManipOffsetMeters, mPlaneManipOffsetMeters);
- glScalef(mPlaneScales.mV[VX], mPlaneScales.mV[VX], mPlaneScales.mV[VX]);
+ gGL.scalef(mPlaneScales.mV[VX], mPlaneScales.mV[VX], mPlaneScales.mV[VX]);
if (mHighlightedPart == LL_YZ_PLANE)
{
color1.setVec(0.f, 1.f, 0.f, 1.f);
@@ -1962,9 +1963,9 @@ void LLManipTranslate::renderTranslationHandles()
{
// render XZ plane manipulator
gGL.pushMatrix();
- glScalef(mPlaneManipPositions.mV[VX], mPlaneManipPositions.mV[VY], mPlaneManipPositions.mV[VZ]);
+ gGL.scalef(mPlaneManipPositions.mV[VX], mPlaneManipPositions.mV[VY], mPlaneManipPositions.mV[VZ]);
gGL.translatef(mPlaneManipOffsetMeters, 0.f, mPlaneManipOffsetMeters);
- glScalef(mPlaneScales.mV[VY], mPlaneScales.mV[VY], mPlaneScales.mV[VY]);
+ gGL.scalef(mPlaneScales.mV[VY], mPlaneScales.mV[VY], mPlaneScales.mV[VY]);
if (mHighlightedPart == LL_XZ_PLANE)
{
color1.setVec(0.f, 0.f, 1.f, 1.f);
@@ -2018,7 +2019,7 @@ void LLManipTranslate::renderTranslationHandles()
{
// render XY plane manipulator
gGL.pushMatrix();
- glScalef(mPlaneManipPositions.mV[VX], mPlaneManipPositions.mV[VY], mPlaneManipPositions.mV[VZ]);
+ gGL.scalef(mPlaneManipPositions.mV[VX], mPlaneManipPositions.mV[VY], mPlaneManipPositions.mV[VZ]);
/* Y
^
@@ -2043,7 +2044,7 @@ void LLManipTranslate::renderTranslationHandles()
v2 = LLVector3(mPlaneManipOffsetMeters * ( PLANE_TICK_SIZE * 0.25f), mPlaneManipOffsetMeters * ( PLANE_TICK_SIZE * 0.25f), 0.f);
v3 = LLVector3(mPlaneManipOffsetMeters * (-PLANE_TICK_SIZE * 0.75f), mPlaneManipOffsetMeters * ( PLANE_TICK_SIZE * 0.25f), 0.f);
#endif
- glScalef(mPlaneScales.mV[VZ], mPlaneScales.mV[VZ], mPlaneScales.mV[VZ]);
+ gGL.scalef(mPlaneScales.mV[VZ], mPlaneScales.mV[VZ], mPlaneScales.mV[VZ]);
if (mHighlightedPart == LL_XY_PLANE)
{
color1.setVec(1.f, 0.f, 0.f, 1.f);
@@ -2215,7 +2216,7 @@ void LLManipTranslate::renderArrow(S32 which_arrow, S32 selected_arrow, F32 box_
}
gGL.translatef(vec.mV[0], vec.mV[1], vec.mV[2]);
- glScalef(handle_size, handle_size, handle_size);
+ gGL.scalef(handle_size, handle_size, handle_size);
F32 rot = 0.0f;
LLVector3 axis;
@@ -2239,11 +2240,11 @@ void LLManipTranslate::renderArrow(S32 which_arrow, S32 selected_arrow, F32 box_
break;
}
- glColor4fv(color.mV);
- glRotatef(rot, axis.mV[0], axis.mV[1], axis.mV[2]);
- glScalef(mArrowScales.mV[index], mArrowScales.mV[index], mArrowScales.mV[index] * 1.5f);
+ gGL.diffuseColor4fv(color.mV);
+ gGL.rotatef(rot, axis.mV[0], axis.mV[1], axis.mV[2]);
+ gGL.scalef(mArrowScales.mV[index], mArrowScales.mV[index], mArrowScales.mV[index] * 1.5f);
- gCone.render(CONE_LOD_HIGHEST);
+ gCone.render();
gGL.popMatrix();
}
diff --git a/indra/newview/llmarketplacefunctions.cpp b/indra/newview/llmarketplacefunctions.cpp
new file mode 100644
index 0000000000..93dd82957f
--- /dev/null
+++ b/indra/newview/llmarketplacefunctions.cpp
@@ -0,0 +1,478 @@
+/**
+ * @file llmarketplacefunctions.cpp
+ * @brief Implementation of assorted functions related to the marketplace
+ *
+ * $LicenseInfo:firstyear=2001&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llmarketplacefunctions.h"
+
+#include "llagent.h"
+#include "llhttpclient.h"
+#include "lltimer.h"
+#include "lltrans.h"
+#include "llviewercontrol.h"
+#include "llviewermedia.h"
+#include "llviewernetwork.h"
+
+
+//
+// Helpers
+//
+
+static std::string getMarketplaceDomain()
+{
+ std::string domain = "secondlife.com";
+
+ if (!LLGridManager::getInstance()->isInProductionGrid())
+ {
+ const std::string& grid_label = LLGridManager::getInstance()->getGridLabel();
+ const std::string& grid_label_lower = utf8str_tolower(grid_label);
+
+ if (grid_label_lower == "damballah")
+ {
+ domain = "secondlife-staging.com";
+ }
+ else
+ {
+ domain = llformat("%s.lindenlab.com", grid_label_lower.c_str());
+ }
+ }
+
+ return domain;
+}
+
+static std::string getMarketplaceURL(const std::string& urlStringName)
+{
+ LLStringUtil::format_map_t domain_arg;
+ domain_arg["[MARKETPLACE_DOMAIN_NAME]"] = getMarketplaceDomain();
+
+ std::string marketplace_url = LLTrans::getString(urlStringName, domain_arg);
+
+ return marketplace_url;
+}
+
+LLSD getMarketplaceStringSubstitutions()
+{
+ std::string marketplace_url = getMarketplaceURL("MarketplaceURL");
+ std::string marketplace_url_create = getMarketplaceURL("MarketplaceURL_CreateStore");
+ std::string marketplace_url_dashboard = getMarketplaceURL("MarketplaceURL_Dashboard");
+ std::string marketplace_url_imports = getMarketplaceURL("MarketplaceURL_Imports");
+ std::string marketplace_url_info = getMarketplaceURL("MarketplaceURL_LearnMore");
+
+ LLSD marketplace_sub_map;
+
+ marketplace_sub_map["[MARKETPLACE_URL]"] = marketplace_url;
+ marketplace_sub_map["[MARKETPLACE_CREATE_STORE_URL]"] = marketplace_url_create;
+ marketplace_sub_map["[MARKETPLACE_LEARN_MORE_URL]"] = marketplace_url_info;
+ marketplace_sub_map["[MARKETPLACE_DASHBOARD_URL]"] = marketplace_url_dashboard;
+ marketplace_sub_map["[MARKETPLACE_IMPORTS_URL]"] = marketplace_url_imports;
+
+ return marketplace_sub_map;
+}
+
+namespace LLMarketplaceImport
+{
+ // Basic interface for this namespace
+
+ bool hasSessionCookie();
+ bool inProgress();
+ bool resultPending();
+ U32 getResultStatus();
+ const LLSD& getResults();
+
+ bool establishMarketplaceSessionCookie();
+ bool pollStatus();
+ bool triggerImport();
+
+ // Internal state variables
+
+ static std::string sMarketplaceCookie = "";
+ static LLSD sImportId = LLSD::emptyMap();
+ static bool sImportInProgress = false;
+ static bool sImportPostPending = false;
+ static bool sImportGetPending = false;
+ static U32 sImportResultStatus = 0;
+ static LLSD sImportResults = LLSD::emptyMap();
+
+ static LLTimer slmGetTimer;
+ static LLTimer slmPostTimer;
+
+ // Responders
+
+ class LLImportPostResponder : public LLHTTPClient::Responder
+ {
+ public:
+ LLImportPostResponder() : LLCurl::Responder() {}
+
+ void completed(U32 status, const std::string& reason, const LLSD& content)
+ {
+ slmPostTimer.stop();
+
+ if (gSavedSettings.getBOOL("InventoryOutboxLogging"))
+ {
+ llinfos << " SLM POST status: " << status << llendl;
+ llinfos << " SLM POST reason: " << reason << llendl;
+ llinfos << " SLM POST content: " << content.asString() << llendl;
+
+ llinfos << " SLM POST timer: " << slmPostTimer.getElapsedTimeF32() << llendl;
+ }
+
+ if ((status == MarketplaceErrorCodes::IMPORT_REDIRECT) ||
+ (status == MarketplaceErrorCodes::IMPORT_AUTHENTICATION_ERROR) ||
+ (status == MarketplaceErrorCodes::IMPORT_JOB_TIMEOUT))
+ {
+ if (gSavedSettings.getBOOL("InventoryOutboxLogging"))
+ {
+ llinfos << " SLM POST clearing marketplace cookie due to authentication failure or timeout" << llendl;
+ }
+
+ sMarketplaceCookie.clear();
+ }
+
+ sImportInProgress = (status == MarketplaceErrorCodes::IMPORT_DONE);
+ sImportPostPending = false;
+ sImportResultStatus = status;
+ sImportId = content;
+ }
+ };
+
+ class LLImportGetResponder : public LLHTTPClient::Responder
+ {
+ public:
+ LLImportGetResponder() : LLCurl::Responder() {}
+
+ void completedHeader(U32 status, const std::string& reason, const LLSD& content)
+ {
+ const std::string& set_cookie_string = content["set-cookie"].asString();
+
+ if (!set_cookie_string.empty())
+ {
+ sMarketplaceCookie = set_cookie_string;
+ }
+ }
+
+ void completed(U32 status, const std::string& reason, const LLSD& content)
+ {
+ slmGetTimer.stop();
+
+ if (gSavedSettings.getBOOL("InventoryOutboxLogging"))
+ {
+ llinfos << " SLM GET status: " << status << llendl;
+ llinfos << " SLM GET reason: " << reason << llendl;
+ llinfos << " SLM GET content: " << content.asString() << llendl;
+
+ llinfos << " SLM GET timer: " << slmGetTimer.getElapsedTimeF32() << llendl;
+ }
+
+ if ((status == MarketplaceErrorCodes::IMPORT_AUTHENTICATION_ERROR) ||
+ (status == MarketplaceErrorCodes::IMPORT_JOB_TIMEOUT))
+ {
+ if (gSavedSettings.getBOOL("InventoryOutboxLogging"))
+ {
+ llinfos << " SLM GET clearing marketplace cookie due to authentication failure or timeout" << llendl;
+ }
+
+ sMarketplaceCookie.clear();
+ }
+
+ sImportInProgress = (status == MarketplaceErrorCodes::IMPORT_PROCESSING);
+ sImportGetPending = false;
+ sImportResultStatus = status;
+ sImportResults = content;
+ }
+ };
+
+ // Basic API
+
+ bool hasSessionCookie()
+ {
+ return !sMarketplaceCookie.empty();
+ }
+
+ bool inProgress()
+ {
+ return sImportInProgress;
+ }
+
+ bool resultPending()
+ {
+ return (sImportPostPending || sImportGetPending);
+ }
+
+ U32 getResultStatus()
+ {
+ return sImportResultStatus;
+ }
+
+ const LLSD& getResults()
+ {
+ return sImportResults;
+ }
+
+ static std::string getInventoryImportURL()
+ {
+ std::string url = getMarketplaceURL("MarketplaceURL");
+
+ url += "api/1/";
+ url += gAgent.getID().getString();
+ url += "/inventory/import/";
+
+ return url;
+ }
+
+ bool establishMarketplaceSessionCookie()
+ {
+ if (hasSessionCookie())
+ {
+ return false;
+ }
+
+ sImportInProgress = true;
+ sImportGetPending = true;
+
+ std::string url = getInventoryImportURL();
+
+ if (gSavedSettings.getBOOL("InventoryOutboxLogging"))
+ {
+ llinfos << " SLM GET: " << url << llendl;
+ }
+
+ slmGetTimer.start();
+ LLHTTPClient::get(url, new LLImportGetResponder(), LLViewerMedia::getHeaders());
+
+ return true;
+ }
+
+ bool pollStatus()
+ {
+ if (!hasSessionCookie())
+ {
+ return false;
+ }
+
+ sImportGetPending = true;
+
+ std::string url = getInventoryImportURL();
+
+ url += sImportId.asString();
+
+ // Make the headers for the post
+ LLSD headers = LLSD::emptyMap();
+ headers["Accept"] = "*/*";
+ headers["Cookie"] = sMarketplaceCookie;
+ headers["Content-Type"] = "application/llsd+xml";
+ headers["User-Agent"] = LLViewerMedia::getCurrentUserAgent();
+
+ if (gSavedSettings.getBOOL("InventoryOutboxLogging"))
+ {
+ llinfos << " SLM GET: " << url << llendl;
+ }
+
+ slmGetTimer.start();
+ LLHTTPClient::get(url, new LLImportGetResponder(), headers);
+
+ return true;
+ }
+
+ bool triggerImport()
+ {
+ if (!hasSessionCookie())
+ {
+ return false;
+ }
+
+ sImportId = LLSD::emptyMap();
+ sImportInProgress = true;
+ sImportPostPending = true;
+ sImportResultStatus = MarketplaceErrorCodes::IMPORT_PROCESSING;
+ sImportResults = LLSD::emptyMap();
+
+ std::string url = getInventoryImportURL();
+
+ // Make the headers for the post
+ LLSD headers = LLSD::emptyMap();
+ headers["Accept"] = "*/*";
+ headers["Connection"] = "Keep-Alive";
+ headers["Cookie"] = sMarketplaceCookie;
+ headers["Content-Type"] = "application/xml";
+ headers["User-Agent"] = LLViewerMedia::getCurrentUserAgent();
+
+ if (gSavedSettings.getBOOL("InventoryOutboxLogging"))
+ {
+ llinfos << " SLM POST: " << url << llendl;
+ }
+
+ slmPostTimer.start();
+ LLHTTPClient::post(url, LLSD(), new LLImportPostResponder(), headers);
+
+ return true;
+ }
+}
+
+
+//
+// Interface class
+//
+
+
+//static
+void LLMarketplaceInventoryImporter::update()
+{
+ if (instanceExists())
+ {
+ LLMarketplaceInventoryImporter::instance().updateImport();
+ }
+}
+
+LLMarketplaceInventoryImporter::LLMarketplaceInventoryImporter()
+ : mAutoTriggerImport(false)
+ , mImportInProgress(false)
+ , mInitialized(false)
+ , mErrorInitSignal(NULL)
+ , mStatusChangedSignal(NULL)
+ , mStatusReportSignal(NULL)
+{
+}
+
+boost::signals2::connection LLMarketplaceInventoryImporter::setInitializationErrorCallback(const status_report_signal_t::slot_type& cb)
+{
+ if (mErrorInitSignal == NULL)
+ {
+ mErrorInitSignal = new status_report_signal_t();
+ }
+
+ return mErrorInitSignal->connect(cb);
+}
+
+boost::signals2::connection LLMarketplaceInventoryImporter::setStatusChangedCallback(const status_changed_signal_t::slot_type& cb)
+{
+ if (mStatusChangedSignal == NULL)
+ {
+ mStatusChangedSignal = new status_changed_signal_t();
+ }
+
+ return mStatusChangedSignal->connect(cb);
+}
+
+boost::signals2::connection LLMarketplaceInventoryImporter::setStatusReportCallback(const status_report_signal_t::slot_type& cb)
+{
+ if (mStatusReportSignal == NULL)
+ {
+ mStatusReportSignal = new status_report_signal_t();
+ }
+
+ return mStatusReportSignal->connect(cb);
+}
+
+void LLMarketplaceInventoryImporter::initialize()
+{
+ llassert(!mInitialized);
+
+ if (!LLMarketplaceImport::hasSessionCookie())
+ {
+ LLMarketplaceImport::establishMarketplaceSessionCookie();
+ }
+}
+
+void LLMarketplaceInventoryImporter::reinitializeAndTriggerImport()
+{
+ mInitialized = false;
+
+ initialize();
+
+ mAutoTriggerImport = true;
+}
+
+bool LLMarketplaceInventoryImporter::triggerImport()
+{
+ const bool import_triggered = LLMarketplaceImport::triggerImport();
+
+ if (!import_triggered)
+ {
+ reinitializeAndTriggerImport();
+ }
+
+ return import_triggered;
+}
+
+void LLMarketplaceInventoryImporter::updateImport()
+{
+ const bool in_progress = LLMarketplaceImport::inProgress();
+
+ if (in_progress && !LLMarketplaceImport::resultPending())
+ {
+ const bool polling_status = LLMarketplaceImport::pollStatus();
+
+ if (!polling_status)
+ {
+ reinitializeAndTriggerImport();
+ }
+ }
+
+ if (mImportInProgress != in_progress)
+ {
+ mImportInProgress = in_progress;
+
+ // If we are no longer in progress
+ if (!mImportInProgress)
+ {
+ if (mInitialized)
+ {
+ // Report results
+ if (mStatusReportSignal)
+ {
+ (*mStatusReportSignal)(LLMarketplaceImport::getResultStatus(), LLMarketplaceImport::getResults());
+ }
+ }
+ else
+ {
+ // Look for results success
+ mInitialized = LLMarketplaceImport::hasSessionCookie();
+
+ if (mInitialized)
+ {
+ // Follow up with auto trigger of import
+ if (mAutoTriggerImport)
+ {
+ mAutoTriggerImport = false;
+
+ mImportInProgress = triggerImport();
+ }
+ }
+ else if (mErrorInitSignal)
+ {
+ (*mErrorInitSignal)(LLMarketplaceImport::getResultStatus(), LLMarketplaceImport::getResults());
+ }
+ }
+ }
+
+ // Make sure we trigger the status change with the final state (in case of auto trigger after initialize)
+ if (mStatusChangedSignal)
+ {
+ (*mStatusChangedSignal)(mImportInProgress);
+ }
+ }
+}
+
diff --git a/indra/newview/llmarketplacefunctions.h b/indra/newview/llmarketplacefunctions.h
new file mode 100644
index 0000000000..4b8f7a1ac7
--- /dev/null
+++ b/indra/newview/llmarketplacefunctions.h
@@ -0,0 +1,94 @@
+/**
+ * @file llmarketplacefunctions.h
+ * @brief Miscellaneous marketplace-related functions and classes
+ * class definition
+ *
+ * $LicenseInfo:firstyear=2001&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLMARKETPLACEFUNCTIONS_H
+#define LL_LLMARKETPLACEFUNCTIONS_H
+
+
+#include <llsd.h>
+#include <boost/function.hpp>
+#include <boost/signals2.hpp>
+
+#include "llsingleton.h"
+#include "llstring.h"
+
+
+LLSD getMarketplaceStringSubstitutions();
+
+
+namespace MarketplaceErrorCodes
+{
+ enum eCode
+ {
+ IMPORT_DONE = 200,
+ IMPORT_PROCESSING = 202,
+ IMPORT_REDIRECT = 302,
+ IMPORT_AUTHENTICATION_ERROR = 401,
+ IMPORT_DONE_WITH_ERRORS = 409,
+ IMPORT_JOB_FAILED = 410,
+ IMPORT_JOB_TIMEOUT = 499,
+ };
+}
+
+
+class LLMarketplaceInventoryImporter
+ : public LLSingleton<LLMarketplaceInventoryImporter>
+{
+public:
+ static void update();
+
+ LLMarketplaceInventoryImporter();
+
+ typedef boost::signals2::signal<void (bool)> status_changed_signal_t;
+ typedef boost::signals2::signal<void (U32, const LLSD&)> status_report_signal_t;
+
+ boost::signals2::connection setInitializationErrorCallback(const status_report_signal_t::slot_type& cb);
+ boost::signals2::connection setStatusChangedCallback(const status_changed_signal_t::slot_type& cb);
+ boost::signals2::connection setStatusReportCallback(const status_report_signal_t::slot_type& cb);
+
+ void initialize();
+ bool triggerImport();
+ bool isImportInProgress() const { return mImportInProgress; }
+
+protected:
+ void reinitializeAndTriggerImport();
+ void updateImport();
+
+private:
+ bool mAutoTriggerImport;
+ bool mImportInProgress;
+ bool mInitialized;
+
+ status_report_signal_t * mErrorInitSignal;
+ status_changed_signal_t * mStatusChangedSignal;
+ status_report_signal_t * mStatusReportSignal;
+};
+
+
+
+#endif // LL_LLMARKETPLACEFUNCTIONS_H
+
diff --git a/indra/newview/llmarketplacenotifications.cpp b/indra/newview/llmarketplacenotifications.cpp
new file mode 100644
index 0000000000..0886f9a990
--- /dev/null
+++ b/indra/newview/llmarketplacenotifications.cpp
@@ -0,0 +1,90 @@
+/**
+ * @file llmarketplacenotifications.cpp
+ * @brief Handler for notifications related to marketplace file I/O
+ * class definition
+ *
+ * $LicenseInfo:firstyear=2001&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+// Precompiled header
+#include "llviewerprecompiledheaders.h"
+
+#include "llmarketplacenotifications.h"
+#include "llnotificationsutil.h"
+
+#include "llerror.h"
+
+#include <boost/foreach.hpp>
+#include <boost/signals2.hpp>
+
+
+namespace LLMarketplaceInventoryNotifications
+{
+ typedef boost::signals2::signal<void (const LLSD& param)> no_copy_payload_cb_signal_t;
+
+ static no_copy_payload_cb_signal_t* no_copy_cb_action = NULL;
+ static bool no_copy_notify_active = false;
+ static std::list<LLSD> no_copy_payloads;
+
+ void notifyNoCopyCallback(const LLSD& notification, const LLSD& response)
+ {
+ const S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+
+ if (option == 0)
+ {
+ llassert(!no_copy_payloads.empty());
+ llassert(no_copy_cb_action != NULL);
+
+ BOOST_FOREACH(const LLSD& payload, no_copy_payloads)
+ {
+ (*no_copy_cb_action)(payload);
+ }
+ }
+
+ delete no_copy_cb_action;
+ no_copy_cb_action = NULL;
+
+ no_copy_notify_active = false;
+ no_copy_payloads.clear();
+ }
+
+ void update()
+ {
+ if (!no_copy_notify_active && !no_copy_payloads.empty())
+ {
+ no_copy_notify_active = true;
+
+ LLNotificationsUtil::add("ConfirmNoCopyToOutbox", LLSD(), LLSD(), boost::bind(&notifyNoCopyCallback, _1, _2));
+ }
+ }
+
+ void addNoCopyNotification(const LLSD& payload, const NoCopyCallbackFunction& cb)
+ {
+ if (no_copy_cb_action == NULL)
+ {
+ no_copy_cb_action = new no_copy_payload_cb_signal_t;
+ no_copy_cb_action->connect(boost::bind(cb, _1));
+ }
+
+ no_copy_payloads.push_back(payload);
+ }
+}
diff --git a/indra/newview/llmarketplacenotifications.h b/indra/newview/llmarketplacenotifications.h
new file mode 100644
index 0000000000..83a4e163c7
--- /dev/null
+++ b/indra/newview/llmarketplacenotifications.h
@@ -0,0 +1,57 @@
+/**
+ * @file llmarketplacenotifications.h
+ * @brief Handler for notifications related to marketplace file I/O
+ * class definition
+ *
+ * $LicenseInfo:firstyear=2001&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLMARKETPLACENOTIFICATIONS_H
+#define LL_LLMARKETPLACENOTIFICATIONS_H
+
+
+#include <llsd.h>
+#include <boost/function.hpp>
+
+
+//
+// This is a set of helper functions to handle a unique notification with multiple
+// payloads, helpful when dragging and dropping items to the merchant outbox that
+// trigger notifications that can potentially interfere with the current drag and
+// drop operation.
+//
+// Notification payloads are cached locally when initiated, the notification itself
+// is triggered on the following frame during the call to "update" and then the
+// response is triggered once per payload.
+//
+
+namespace LLMarketplaceInventoryNotifications
+{
+ void update();
+
+ typedef boost::function<void (const LLSD&)> NoCopyCallbackFunction;
+
+ void addNoCopyNotification(const LLSD& payload, const NoCopyCallbackFunction& cb);
+};
+
+
+#endif // LL_LLMARKETPLACENOTIFICATIONS_H
diff --git a/indra/newview/llmediactrl.cpp b/indra/newview/llmediactrl.cpp
index 0bdeb114f5..7650fe9229 100644
--- a/indra/newview/llmediactrl.cpp
+++ b/indra/newview/llmediactrl.cpp
@@ -57,7 +57,6 @@
#include "llcheckboxctrl.h"
#include "llnotifications.h"
#include "lllineeditor.h"
-#include "llfloatermediabrowser.h"
#include "llfloaterwebcontent.h"
#include "llwindowshade.h"
@@ -68,7 +67,6 @@ static LLDefaultChildRegistry::Register<LLMediaCtrl> r("web_browser");
LLMediaCtrl::Params::Params()
: start_url("start_url"),
border_visible("border_visible", true),
- ignore_ui_scale("ignore_ui_scale", true),
decouple_texture_size("decouple_texture_size", false),
texture_width("texture_width", 1024),
texture_height("texture_height", 1024),
@@ -89,7 +87,6 @@ LLMediaCtrl::LLMediaCtrl( const Params& p) :
mFrequentUpdates( true ),
mForceUpdate( false ),
mHomePageUrl( "" ),
- mIgnoreUIScale( true ),
mAlwaysRefresh( false ),
mMediaSource( 0 ),
mTakeFocusOnClick( p.focus_on_click ),
@@ -112,8 +109,6 @@ LLMediaCtrl::LLMediaCtrl( const Params& p) :
setCaretColor( (unsigned int)color.mV[0], (unsigned int)color.mV[1], (unsigned int)color.mV[2] );
}
- setIgnoreUIScale(p.ignore_ui_scale);
-
setHomePageUrl(p.start_url, p.initial_mime_type);
setBorderVisible(p.border_visible);
@@ -124,10 +119,8 @@ LLMediaCtrl::LLMediaCtrl( const Params& p) :
if(!getDecoupleTextureSize())
{
- S32 screen_width = mIgnoreUIScale ?
- llround((F32)getRect().getWidth() * LLUI::sGLScaleFactor.mV[VX]) : getRect().getWidth();
- S32 screen_height = mIgnoreUIScale ?
- llround((F32)getRect().getHeight() * LLUI::sGLScaleFactor.mV[VY]) : getRect().getHeight();
+ S32 screen_width = llround((F32)getRect().getWidth() * LLUI::sGLScaleFactor.mV[VX]);
+ S32 screen_height = llround((F32)getRect().getHeight() * LLUI::sGLScaleFactor.mV[VY]);
setTextureSize(screen_width, screen_height);
}
@@ -140,10 +133,15 @@ LLMediaCtrl::LLMediaCtrl( const Params& p) :
navigateHome();
}
- // FIXME: How do we create a bevel now?
-// LLRect border_rect( 0, getRect().getHeight() + 2, getRect().getWidth() + 2, 0 );
-// mBorder = new LLViewBorder( std::string("web control border"), border_rect, LLViewBorder::BEVEL_IN );
-// addChild( mBorder );
+ LLWindowShade::Params params;
+ params.name = "notification_shade";
+ params.rect = getLocalRect();
+ params.follows.flags = FOLLOWS_ALL;
+ params.modal = true;
+
+ mWindowShade = LLUICtrlFactory::create<LLWindowShade>(params);
+
+ addChild(mWindowShade);
}
LLMediaCtrl::~LLMediaCtrl()
@@ -471,8 +469,8 @@ void LLMediaCtrl::reshape( S32 width, S32 height, BOOL called_from_parent )
{
if(!getDecoupleTextureSize())
{
- S32 screen_width = mIgnoreUIScale ? llround((F32)width * LLUI::sGLScaleFactor.mV[VX]) : width;
- S32 screen_height = mIgnoreUIScale ? llround((F32)height * LLUI::sGLScaleFactor.mV[VY]) : height;
+ S32 screen_width = llround((F32)width * LLUI::sGLScaleFactor.mV[VX]);
+ S32 screen_height = llround((F32)height * LLUI::sGLScaleFactor.mV[VY]);
// when floater is minimized, these sizes are negative
if ( screen_height > 0 && screen_width > 0 )
@@ -689,6 +687,8 @@ bool LLMediaCtrl::ensureMediaSourceExists()
mMediaSource->addObserver( this );
mMediaSource->setBackgroundColor( getBackgroundColor() );
mMediaSource->setTrustedBrowser(mTrusted);
+ mMediaSource->setPageZoomFactor( LLUI::sGLScaleFactor.mV[ VX ] );
+
if(mClearCache)
{
mMediaSource->clearCache();
@@ -770,15 +770,7 @@ void LLMediaCtrl::draw()
{
gGL.pushUIMatrix();
{
- if (mIgnoreUIScale)
- {
- gGL.loadUIIdentity();
- // font system stores true screen origin, need to scale this by UI scale factor
- // to get render origin for this view (with unit scale)
- gGL.translateUI(floorf(LLFontGL::sCurOrigin.mX * LLUI::sGLScaleFactor.mV[VX]),
- floorf(LLFontGL::sCurOrigin.mY * LLUI::sGLScaleFactor.mV[VY]),
- LLFontGL::sCurOrigin.mZ);
- }
+ mMediaSource->setPageZoomFactor( LLUI::sGLScaleFactor.mV[ VX ] );
// scale texture to fit the space using texture coords
gGL.getTexUnit(0)->bind(media_texture);
@@ -826,14 +818,6 @@ void LLMediaCtrl::draw()
x_offset = (r.getWidth() - width) / 2;
y_offset = (r.getHeight() - height) / 2;
- if(mIgnoreUIScale)
- {
- x_offset = llround((F32)x_offset * LLUI::sGLScaleFactor.mV[VX]);
- y_offset = llround((F32)y_offset * LLUI::sGLScaleFactor.mV[VY]);
- width = llround((F32)width * LLUI::sGLScaleFactor.mV[VX]);
- height = llround((F32)height * LLUI::sGLScaleFactor.mV[VY]);
- }
-
// draw the browser
gGL.begin( LLRender::QUADS );
if (! media_plugin->getTextureCoordsOpenGL())
@@ -900,14 +884,14 @@ void LLMediaCtrl::convertInputCoords(S32& x, S32& y)
coords_opengl = mMediaSource->getMediaPlugin()->getTextureCoordsOpenGL();
}
- x = mIgnoreUIScale ? llround((F32)x * LLUI::sGLScaleFactor.mV[VX]) : x;
+ x = llround((F32)x * LLUI::sGLScaleFactor.mV[VX]);
if ( ! coords_opengl )
{
- y = mIgnoreUIScale ? llround((F32)(y) * LLUI::sGLScaleFactor.mV[VY]) : y;
+ y = llround((F32)(y) * LLUI::sGLScaleFactor.mV[VY]);
}
else
{
- y = mIgnoreUIScale ? llround((F32)(getRect().getHeight() - y) * LLUI::sGLScaleFactor.mV[VY]) : getRect().getHeight() - y;
+ y = llround((F32)(getRect().getHeight() - y) * LLUI::sGLScaleFactor.mV[VY]);
};
}
@@ -1102,36 +1086,7 @@ void LLMediaCtrl::onPopup(const LLSD& notification, const LLSD& response)
{
if (response["open"])
{
- // name of default floater to open
- std::string floater_name = "media_browser";
-
- // look for parent floater name
- if ( gFloaterView )
- {
- if ( gFloaterView->getParentFloater(this) )
- {
- floater_name = gFloaterView->getParentFloater(this)->getInstanceName();
- }
- else
- {
- lldebugs << "No gFloaterView->getParentFloater(this) for onPopuup()" << llendl;
- };
- }
- else
- {
- lldebugs << "No gFloaterView for onPopuup()" << llendl;
- };
-
- // (for now) open web content floater if that's our parent, otherwise, open the current media floater
- // (this will change soon)
- if ( floater_name == "web_content" )
- {
- LLWeb::loadWebURL(notification["payload"]["url"], notification["payload"]["target"], notification["payload"]["uuid"]);
- }
- else
- {
- LLWeb::loadURL(notification["payload"]["url"], notification["payload"]["target"], notification["payload"]["uuid"]);
- }
+ LLWeb::loadURL(notification["payload"]["url"], notification["payload"]["target"], notification["payload"]["uuid"]);
}
else
{
@@ -1142,39 +1097,28 @@ void LLMediaCtrl::onPopup(const LLSD& notification, const LLSD& response)
void LLMediaCtrl::showNotification(LLNotificationPtr notify)
{
- delete mWindowShade;
+ LLWindowShade* shade = getChild<LLWindowShade>("notification_shade");
- LLWindowShade::Params params;
- params.name = "notification_shade";
- params.rect = getLocalRect();
- params.follows.flags = FOLLOWS_ALL;
- params.notification = notify;
- params.modal = true;
- //HACK: don't hardcode this
if (notify->getIcon() == "Popup_Caution")
{
- params.bg_image.name = "Yellow_Gradient";
- params.text_color = LLColor4::black;
+ shade->setBackgroundImage(LLUI::getUIImage("Yellow_Gradient"));
+ shade->setTextColor(LLColor4::black);
+ shade->setCanClose(true);
}
- else
- //HACK: another one since XUI doesn't support what we need right now
- if (notify->getName() == "AuthRequest")
+ else if (notify->getName() == "AuthRequest")
{
- params.bg_image.name = "Yellow_Gradient";
- params.text_color = LLColor4::black;
- params.can_close = false;
+ shade->setBackgroundImage(LLUI::getUIImage("Yellow_Gradient"));
+ shade->setTextColor(LLColor4::black);
+ shade->setCanClose(false);
}
else
{
//HACK: make this a property of the notification itself, "cancellable"
- params.can_close = false;
- params.text_color.control = "LabelTextColor";
+ shade->setCanClose(false);
+ shade->setTextColor(LLUIColorTable::instance().getColor("LabelTextColor"));
}
- mWindowShade = LLUICtrlFactory::create<LLWindowShade>(params);
-
- addChild(mWindowShade);
- mWindowShade->show();
+ mWindowShade->show(notify);
}
void LLMediaCtrl::hideNotification()
diff --git a/indra/newview/llmediactrl.h b/indra/newview/llmediactrl.h
index 3c0436e27a..7f2a5e1642 100644
--- a/indra/newview/llmediactrl.h
+++ b/indra/newview/llmediactrl.h
@@ -51,7 +51,6 @@ public:
Optional<std::string> start_url;
Optional<bool> border_visible,
- ignore_ui_scale,
hide_loading,
decouple_texture_size,
trusted_content,
@@ -125,9 +124,6 @@ public:
bool getFrequentUpdates() { return mFrequentUpdates; };
void setFrequentUpdates( bool frequentUpdatesIn ) { mFrequentUpdates = frequentUpdatesIn; };
- void setIgnoreUIScale(bool ignore) { mIgnoreUIScale = ignore; }
- bool getIgnoreUIScale() { return mIgnoreUIScale; }
-
void setAlwaysRefresh(bool refresh) { mAlwaysRefresh = refresh; }
bool getAlwaysRefresh() { return mAlwaysRefresh; }
@@ -181,28 +177,29 @@ public:
const S32 mTextureDepthBytes;
LLUUID mMediaTextureID;
LLViewBorder* mBorder;
- bool mFrequentUpdates;
- bool mForceUpdate;
- bool mTrusted;
- std::string mHomePageUrl;
- std::string mHomePageMimeType;
- std::string mCurrentNavUrl;
- std::string mErrorPageURL;
- std::string mTarget;
- bool mIgnoreUIScale;
- bool mAlwaysRefresh;
+ bool mFrequentUpdates,
+ mForceUpdate,
+ mTrusted,
+ mAlwaysRefresh,
+ mTakeFocusOnClick,
+ mStretchToFill,
+ mMaintainAspectRatio,
+ mHideLoading,
+ mHidingInitialLoad,
+ mClearCache,
+ mHoverTextChanged,
+ mDecoupleTextureSize;
+
+ std::string mHomePageUrl,
+ mHomePageMimeType,
+ mCurrentNavUrl,
+ mErrorPageURL,
+ mTarget;
viewer_media_t mMediaSource;
- bool mTakeFocusOnClick;
- bool mStretchToFill;
- bool mMaintainAspectRatio;
- bool mHideLoading;
- bool mHidingInitialLoad;
- bool mDecoupleTextureSize;
- S32 mTextureWidth;
- S32 mTextureHeight;
- bool mClearCache;
+ S32 mTextureWidth,
+ mTextureHeight;
+
class LLWindowShade* mWindowShade;
- bool mHoverTextChanged;
LLContextMenu* mContextMenu;
};
diff --git a/indra/newview/llmenucommands.cpp b/indra/newview/llmenucommands.cpp
deleted file mode 100644
index 4b7f9432e3..0000000000
--- a/indra/newview/llmenucommands.cpp
+++ /dev/null
@@ -1,94 +0,0 @@
-/**
- * @file llmenucommands.cpp
- * @brief Implementations of menu commands.
- *
- * $LicenseInfo:firstyear=2003&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-#include "llviewerprecompiledheaders.h"
-
-#include "llmenucommands.h"
-
-#include "imageids.h"
-#include "llfloaterreg.h"
-#include "llfontgl.h"
-#include "llrect.h"
-#include "llerror.h"
-#include "llstring.h"
-#include "message.h"
-
-#include "llagentcamera.h"
-#include "llcallingcard.h"
-#include "llviewercontrol.h"
-//#include "llfirstuse.h"
-#include "llfloaterworldmap.h"
-#include "lllineeditor.h"
-#include "llstatusbar.h"
-#include "llimview.h"
-#include "lltextbox.h"
-#include "llui.h"
-#include "llviewergesture.h" // for triggering gestures
-#include "llviewermessage.h"
-#include "llviewerparceloverlay.h"
-#include "llviewerregion.h"
-#include "llviewerstats.h"
-#include "lluictrlfactory.h"
-#include "llviewerwindow.h"
-#include "llworld.h"
-#include "llworldmap.h"
-#include "llfocusmgr.h"
-#include "llnearbychatbar.h"
-
-void handle_mouselook(void*)
-{
- gAgentCamera.changeCameraToMouselook();
-}
-
-
-void handle_chat(void*)
-{
- // give focus to chatbar if it's open but not focused
- if (gSavedSettings.getBOOL("ChatVisible") &&
- gFocusMgr.childHasKeyboardFocus(LLNearbyChatBar::getInstance()->getChatBox()))
- {
- LLNearbyChatBar::stopChat();
- }
- else
- {
- LLNearbyChatBar::startChat(NULL);
- }
-}
-
-void handle_slash_key(void*)
-{
- // LLBottomTray::startChat("/");
- //
- // Don't do this, it results in a double-slash in the input field.
- // Another "/" will be automatically typed for us, because the WM_KEYDOWN event
- // that generated the menu accelerator call (and hence puts focus in
- // the chat edtior) will be followed by a "/" WM_CHAR character message,
- // which will type the slash. Yes, it's weird. It only matters for
- // menu accelerators that put input focus into a field. And Mac works
- // the same way. JC
-
- LLNearbyChatBar::startChat(NULL);
-}
diff --git a/indra/newview/llmenucommands.h b/indra/newview/llmenucommands.h
deleted file mode 100644
index fa845c6f02..0000000000
--- a/indra/newview/llmenucommands.h
+++ /dev/null
@@ -1,37 +0,0 @@
-/**
- * @file llmenucommands.h
- * @brief Implementations of menu commands.
- *
- * $LicenseInfo:firstyear=2003&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-#ifndef LL_LLMENUCOMMANDS_H
-#define LL_LLMENUCOMMANDS_H
-
-class LLUUID;
-
-void handle_mouselook(void*);
-void handle_chat(void*);
-void handle_return_key(void*);
-void handle_slash_key(void*);
-
-#endif
diff --git a/indra/newview/llmeshrepository.cpp b/indra/newview/llmeshrepository.cpp
index e12f140747..b02bf79a28 100644..100755
--- a/indra/newview/llmeshrepository.cpp
+++ b/indra/newview/llmeshrepository.cpp
@@ -88,6 +88,9 @@ const S32 MAX_MESH_VERSION = 999;
U32 LLMeshRepository::sBytesReceived = 0;
U32 LLMeshRepository::sHTTPRequestCount = 0;
U32 LLMeshRepository::sHTTPRetryCount = 0;
+U32 LLMeshRepository::sLODProcessing = 0;
+U32 LLMeshRepository::sLODPending = 0;
+
U32 LLMeshRepository::sCacheBytesRead = 0;
U32 LLMeshRepository::sCacheBytesWritten = 0;
U32 LLMeshRepository::sPeakKbps = 0;
@@ -205,6 +208,12 @@ public:
LLMeshHeaderResponder(const LLVolumeParams& mesh_params)
: mMeshParams(mesh_params)
{
+ LLMeshRepoThread::sActiveHeaderRequests++;
+ }
+
+ ~LLMeshHeaderResponder()
+ {
+ LLMeshRepoThread::sActiveHeaderRequests--;
}
virtual void completedRaw(U32 status, const std::string& reason,
@@ -224,6 +233,12 @@ public:
LLMeshLODResponder(const LLVolumeParams& mesh_params, S32 lod, U32 offset, U32 requested_bytes)
: mMeshParams(mesh_params), mLOD(lod), mOffset(offset), mRequestedBytes(requested_bytes)
{
+ LLMeshRepoThread::sActiveLODRequests++;
+ }
+
+ ~LLMeshLODResponder()
+ {
+ LLMeshRepoThread::sActiveLODRequests--;
}
virtual void completedRaw(U32 status, const std::string& reason,
@@ -447,9 +462,9 @@ LLMeshRepoThread::LLMeshRepoThread()
: LLThread("mesh repo")
{
mWaiting = false;
- mMutex = new LLMutex();
- mHeaderMutex = new LLMutex();
- mSignal = new LLCondition();
+ mMutex = new LLMutex(NULL);
+ mHeaderMutex = new LLMutex(NULL);
+ mSignal = new LLCondition(NULL);
}
LLMeshRepoThread::~LLMeshRepoThread()
@@ -497,10 +512,13 @@ void LLMeshRepoThread::run()
mMutex->lock();
LODRequest req = mLODReqQ.front();
mLODReqQ.pop();
+ LLMeshRepository::sLODProcessing--;
mMutex->unlock();
- if (fetchMeshLOD(req.mMeshParams, req.mLOD))
+ if (!fetchMeshLOD(req.mMeshParams, req.mLOD, count))//failed, resubmit
{
- count++;
+ mMutex->lock();
+ mLODReqQ.push(req) ;
+ mMutex->unlock();
}
}
}
@@ -512,9 +530,11 @@ void LLMeshRepoThread::run()
HeaderRequest req = mHeaderReqQ.front();
mHeaderReqQ.pop();
mMutex->unlock();
- if (fetchMeshHeader(req.mMeshParams))
+ if (!fetchMeshHeader(req.mMeshParams, count))//failed, resubmit
{
- count++;
+ mMutex->lock();
+ mHeaderReqQ.push(req) ;
+ mMutex->unlock();
}
}
}
@@ -603,6 +623,7 @@ void LLMeshRepoThread::loadMeshLOD(const LLVolumeParams& mesh_params, S32 lod)
{
LLMutexLock lock(mMutex);
mLODReqQ.push(req);
+ LLMeshRepository::sLODProcessing++;
}
}
else
@@ -658,6 +679,7 @@ bool LLMeshRepoThread::fetchMeshSkinInfo(const LLUUID& mesh_id)
return false;
}
+ bool ret = true ;
U32 header_size = mMeshHeaderSize[mesh_id];
if (header_size > 0)
@@ -673,7 +695,7 @@ bool LLMeshRepoThread::fetchMeshSkinInfo(const LLUUID& mesh_id)
//check VFS for mesh skin info
LLVFile file(gVFS, mesh_id, LLAssetType::AT_MESH);
if (file.getSize() >= offset+size)
- {
+ {
LLMeshRepository::sCacheBytesRead += size;
file.seek(offset);
U8* buffer = new U8[size];
@@ -689,7 +711,7 @@ bool LLMeshRepoThread::fetchMeshSkinInfo(const LLUUID& mesh_id)
if (!zero)
{ //attempt to parse
if (skinInfoReceived(mesh_id, buffer, size))
- {
+ {
delete[] buffer;
return true;
}
@@ -704,11 +726,13 @@ bool LLMeshRepoThread::fetchMeshSkinInfo(const LLUUID& mesh_id)
std::string http_url = constructUrl(mesh_id);
if (!http_url.empty())
- {
- ++sActiveLODRequests;
- LLMeshRepository::sHTTPRequestCount++;
- mCurlRequest->getByteRange(constructUrl(mesh_id), headers, offset, size,
+ {
+ ret = mCurlRequest->getByteRange(http_url, headers, offset, size,
new LLMeshSkinInfoResponder(mesh_id, offset, size));
+ if(ret)
+ {
+ LLMeshRepository::sHTTPRequestCount++;
+ }
}
}
}
@@ -718,7 +742,7 @@ bool LLMeshRepoThread::fetchMeshSkinInfo(const LLUUID& mesh_id)
}
//early out was not hit, effectively fetched
- return true;
+ return ret;
}
bool LLMeshRepoThread::fetchMeshDecomposition(const LLUUID& mesh_id)
@@ -732,7 +756,8 @@ bool LLMeshRepoThread::fetchMeshDecomposition(const LLUUID& mesh_id)
}
U32 header_size = mMeshHeaderSize[mesh_id];
-
+ bool ret = true ;
+
if (header_size > 0)
{
S32 version = mMeshHeader[mesh_id]["version"].asInteger();
@@ -748,6 +773,7 @@ bool LLMeshRepoThread::fetchMeshDecomposition(const LLUUID& mesh_id)
if (file.getSize() >= offset+size)
{
LLMeshRepository::sCacheBytesRead += size;
+
file.seek(offset);
U8* buffer = new U8[size];
file.read(buffer, size);
@@ -777,11 +803,13 @@ bool LLMeshRepoThread::fetchMeshDecomposition(const LLUUID& mesh_id)
std::string http_url = constructUrl(mesh_id);
if (!http_url.empty())
- {
- ++sActiveLODRequests;
- LLMeshRepository::sHTTPRequestCount++;
- mCurlRequest->getByteRange(http_url, headers, offset, size,
+ {
+ ret = mCurlRequest->getByteRange(http_url, headers, offset, size,
new LLMeshDecompositionResponder(mesh_id, offset, size));
+ if(ret)
+ {
+ LLMeshRepository::sHTTPRequestCount++;
+ }
}
}
}
@@ -791,7 +819,7 @@ bool LLMeshRepoThread::fetchMeshDecomposition(const LLUUID& mesh_id)
}
//early out was not hit, effectively fetched
- return true;
+ return ret;
}
bool LLMeshRepoThread::fetchMeshPhysicsShape(const LLUUID& mesh_id)
@@ -805,6 +833,7 @@ bool LLMeshRepoThread::fetchMeshPhysicsShape(const LLUUID& mesh_id)
}
U32 header_size = mMeshHeaderSize[mesh_id];
+ bool ret = true ;
if (header_size > 0)
{
@@ -850,11 +879,14 @@ bool LLMeshRepoThread::fetchMeshPhysicsShape(const LLUUID& mesh_id)
std::string http_url = constructUrl(mesh_id);
if (!http_url.empty())
- {
- ++sActiveLODRequests;
- LLMeshRepository::sHTTPRequestCount++;
- mCurlRequest->getByteRange(http_url, headers, offset, size,
+ {
+ ret = mCurlRequest->getByteRange(http_url, headers, offset, size,
new LLMeshPhysicsShapeResponder(mesh_id, offset, size));
+
+ if(ret)
+ {
+ LLMeshRepository::sHTTPRequestCount++;
+ }
}
}
else
@@ -868,13 +900,12 @@ bool LLMeshRepoThread::fetchMeshPhysicsShape(const LLUUID& mesh_id)
}
//early out was not hit, effectively fetched
- return true;
+ return ret;
}
-bool LLMeshRepoThread::fetchMeshHeader(const LLVolumeParams& mesh_params)
+//return false if failed to get header
+bool LLMeshRepoThread::fetchMeshHeader(const LLVolumeParams& mesh_params, U32& count)
{
- bool retval = false;
-
{
//look for mesh in asset in vfs
LLVFile file(gVFS, mesh_params.getSculptID(), LLAssetType::AT_MESH);
@@ -889,36 +920,39 @@ bool LLMeshRepoThread::fetchMeshHeader(const LLVolumeParams& mesh_params)
file.read(buffer, bytes);
if (headerReceived(mesh_params, buffer, bytes))
{ //did not do an HTTP request, return false
- return false;
+ return true;
}
}
}
- //either cache entry doesn't exist or is corrupt, request header from simulator
-
+ //either cache entry doesn't exist or is corrupt, request header from simulator
+ bool retval = true ;
std::vector<std::string> headers;
headers.push_back("Accept: application/octet-stream");
std::string http_url = constructUrl(mesh_params.getSculptID());
if (!http_url.empty())
{
- ++sActiveHeaderRequests;
- retval = true;
//grab first 4KB if we're going to bother with a fetch. Cache will prevent future fetches if a full mesh fits
//within the first 4KB
- //NOTE -- this will break of headers ever exceed 4KB
- LLMeshRepository::sHTTPRequestCount++;
- mCurlRequest->getByteRange(http_url, headers, 0, 4096, new LLMeshHeaderResponder(mesh_params));
+ //NOTE -- this will break of headers ever exceed 4KB
+ retval = mCurlRequest->getByteRange(http_url, headers, 0, 4096, new LLMeshHeaderResponder(mesh_params));
+ if(retval)
+ {
+ LLMeshRepository::sHTTPRequestCount++;
+ }
+ count++;
}
return retval;
}
-bool LLMeshRepoThread::fetchMeshLOD(const LLVolumeParams& mesh_params, S32 lod)
+//return false if failed to get mesh lod.
+bool LLMeshRepoThread::fetchMeshLOD(const LLVolumeParams& mesh_params, S32 lod, U32& count)
{ //protected by mMutex
mHeaderMutex->lock();
- bool retval = false;
+ bool retval = true;
LLUUID mesh_id = mesh_params.getSculptID();
@@ -955,7 +989,7 @@ bool LLMeshRepoThread::fetchMeshLOD(const LLVolumeParams& mesh_params, S32 lod)
if (lodReceived(mesh_params, lod, buffer, size))
{
delete[] buffer;
- return false;
+ return true;
}
}
@@ -968,12 +1002,15 @@ bool LLMeshRepoThread::fetchMeshLOD(const LLVolumeParams& mesh_params, S32 lod)
std::string http_url = constructUrl(mesh_id);
if (!http_url.empty())
- {
- ++sActiveLODRequests;
- retval = true;
- LLMeshRepository::sHTTPRequestCount++;
- mCurlRequest->getByteRange(constructUrl(mesh_id), headers, offset, size,
+ {
+ retval = mCurlRequest->getByteRange(constructUrl(mesh_id), headers, offset, size,
new LLMeshLODResponder(mesh_params, lod, offset, size));
+
+ if(retval)
+ {
+ LLMeshRepository::sHTTPRequestCount++;
+ }
+ count++;
}
else
{
@@ -1045,6 +1082,7 @@ bool LLMeshRepoThread::headerReceived(const LLVolumeParams& mesh_params, U8* dat
{
LODRequest req(mesh_params, iter->second[i]);
mLODReqQ.push(req);
+ LLMeshRepository::sLODProcessing++;
}
}
mPendingLOD.erase(iter);
@@ -1198,7 +1236,7 @@ LLMeshUploadThread::LLMeshUploadThread(LLMeshUploadThread::instance_list& data,
mUploadTextures = upload_textures;
mUploadSkin = upload_skin;
mUploadJoints = upload_joints;
- mMutex = new LLMutex();
+ mMutex = new LLMutex(NULL);
mCurlRequest = NULL;
mPendingUploads = 0;
mFinished = false;
@@ -1540,8 +1578,17 @@ void LLMeshUploadThread::doWholeModelUpload()
LLSD body = full_model_data["asset_resources"];
dump_llsd_to_file(body,make_dump_name("whole_model_body_",dump_num));
LLCurlRequest::headers_t headers;
- mCurlRequest->post(mWholeModelUploadURL, headers, body,
- new LLWholeModelUploadResponder(this, full_model_data, mUploadObserverHandle), mMeshUploadTimeOut);
+
+ {
+ LLCurl::ResponderPtr responder = new LLWholeModelUploadResponder(this, full_model_data, mUploadObserverHandle) ;
+
+ while(!mCurlRequest->post(mWholeModelUploadURL, headers, body, responder, mMeshUploadTimeOut))
+ {
+ //sleep for 10ms to prevent eating a whole core
+ apr_sleep(10000);
+ }
+ }
+
do
{
mCurlRequest->process();
@@ -1571,8 +1618,15 @@ void LLMeshUploadThread::requestWholeModelFee()
mPendingUploads++;
LLCurlRequest::headers_t headers;
- mCurlRequest->post(mWholeModelFeeCapability, headers, model_data,
- new LLWholeModelFeeResponder(this,model_data, mFeeObserverHandle), mMeshUploadTimeOut);
+
+ {
+ LLCurl::ResponderPtr responder = new LLWholeModelFeeResponder(this,model_data, mFeeObserverHandle) ;
+ while(!mCurlRequest->post(mWholeModelFeeCapability, headers, model_data, responder, mMeshUploadTimeOut))
+ {
+ //sleep for 10ms to prevent eating a whole core
+ apr_sleep(10000);
+ }
+ }
do
{
@@ -1712,7 +1766,6 @@ void LLMeshLODResponder::completedRaw(U32 status, const std::string& reason,
const LLIOPipe::buffer_ptr_t& buffer)
{
- LLMeshRepoThread::sActiveLODRequests--;
S32 data_size = buffer->countAfter(channels.in(), NULL);
if (status < 200 || status > 400)
@@ -1929,7 +1982,6 @@ void LLMeshHeaderResponder::completedRaw(U32 status, const std::string& reason,
const LLChannelDescriptors& channels,
const LLIOPipe::buffer_ptr_t& buffer)
{
- LLMeshRepoThread::sActiveHeaderRequests--;
if (status < 200 || status > 400)
{
//llwarns
@@ -2043,7 +2095,7 @@ LLMeshRepository::LLMeshRepository()
void LLMeshRepository::init()
{
- mMeshMutex = new LLMutex();
+ mMeshMutex = new LLMutex(NULL);
LLConvexDecomposition::getInstance()->initSystem();
@@ -2147,6 +2199,7 @@ S32 LLMeshRepository::loadMesh(LLVOVolume* vobj, const LLVolumeParams& mesh_para
//first request for this mesh
mLoadingMeshes[detail][mesh_params].insert(vobj->getID());
mPendingRequests.push_back(LLMeshRepoThread::LODRequest(mesh_params, detail));
+ LLMeshRepository::sLODPending++;
}
}
@@ -2359,6 +2412,7 @@ void LLMeshRepository::notifyLoadedMeshes()
LLMeshRepoThread::LODRequest& request = mPendingRequests.front();
mThread->loadMeshLOD(request.mMeshParams, request.mLOD);
mPendingRequests.erase(mPendingRequests.begin());
+ LLMeshRepository::sLODPending--;
push_count--;
}
}
@@ -2866,8 +2920,8 @@ LLPhysicsDecomp::LLPhysicsDecomp()
mQuitting = false;
mDone = false;
- mSignal = new LLCondition();
- mMutex = new LLMutex();
+ mSignal = new LLCondition(NULL);
+ mMutex = new LLMutex(NULL);
}
LLPhysicsDecomp::~LLPhysicsDecomp()
diff --git a/indra/newview/llmeshrepository.h b/indra/newview/llmeshrepository.h
index 31b84ea0d9..da81bb057b 100644
--- a/indra/newview/llmeshrepository.h
+++ b/indra/newview/llmeshrepository.h
@@ -323,8 +323,8 @@ public:
virtual void run();
void loadMeshLOD(const LLVolumeParams& mesh_params, S32 lod);
- bool fetchMeshHeader(const LLVolumeParams& mesh_params);
- bool fetchMeshLOD(const LLVolumeParams& mesh_params, S32 lod);
+ bool fetchMeshHeader(const LLVolumeParams& mesh_params, U32& count);
+ bool fetchMeshLOD(const LLVolumeParams& mesh_params, S32 lod, U32& count);
bool headerReceived(const LLVolumeParams& mesh_params, U8* data, S32 data_size);
bool lodReceived(const LLVolumeParams& mesh_params, S32 lod, U8* data, S32 data_size);
bool skinInfoReceived(const LLUUID& mesh_id, U8* data, S32 data_size);
@@ -441,6 +441,8 @@ public:
static U32 sBytesReceived;
static U32 sHTTPRequestCount;
static U32 sHTTPRetryCount;
+ static U32 sLODPending;
+ static U32 sLODProcessing;
static U32 sCacheBytesRead;
static U32 sCacheBytesWritten;
static U32 sPeakKbps;
diff --git a/indra/newview/llmoveview.cpp b/indra/newview/llmoveview.cpp
index 142ee40cc8..c3d8b91d67 100644
--- a/indra/newview/llmoveview.cpp
+++ b/indra/newview/llmoveview.cpp
@@ -37,7 +37,6 @@
#include "llagent.h"
#include "llagentcamera.h"
#include "llvoavatarself.h" // to check gAgentAvatarp->isSitting()
-#include "llbottomtray.h"
#include "llbutton.h"
#include "llfirstuse.h"
#include "llfloaterreg.h"
@@ -46,7 +45,8 @@
#include "lluictrlfactory.h"
#include "llviewerwindow.h"
#include "llviewercontrol.h"
-#include "llselectmgr.h"
+#include "llselectmgr.h"
+#include "lltoolbarview.h"
#include "llviewerparcelmgr.h"
#include "llviewerregion.h"
#include "lltooltip.h"
@@ -59,15 +59,13 @@ const F32 MOVE_BUTTON_DELAY = 0.0f;
const F32 YAW_NUDGE_RATE = 0.05f; // fraction of normal speed
const F32 NUDGE_TIME = 0.25f; // in seconds
-const std::string BOTTOM_TRAY_BUTTON_NAME = "movement_btn";
-
//
// Member functions
//
// protected
LLFloaterMove::LLFloaterMove(const LLSD& key)
-: LLTransientDockableFloater(NULL, true, key),
+: LLFloater(key),
mForwardButton(NULL),
mBackwardButton(NULL),
mTurnLeftButton(NULL),
@@ -92,12 +90,8 @@ LLFloaterMove::~LLFloaterMove()
// virtual
BOOL LLFloaterMove::postBuild()
{
- setIsChrome(TRUE);
- setTitleVisible(TRUE); // restore title visibility after chrome applying
updateTransparency(TT_ACTIVE); // force using active floater transparency (STORM-730)
- LLDockableFloater::postBuild();
-
// Code that implements floater buttons toggling when user moves via keyboard is located in LLAgent::propagate()
mForwardButton = getChild<LLJoystickAgentTurn>("forward btn");
@@ -155,10 +149,10 @@ BOOL LLFloaterMove::postBuild()
// virtual
void LLFloaterMove::setVisible(BOOL visible)
{
- // Do nothing with Stand/Stop Flying panel in excessive calls of this method (from LLTransientFloaterMgr?).
+ // Do nothing with Stand/Stop Flying panel in excessive calls of this method.
if (getVisible() == visible)
{
- LLTransientDockableFloater::setVisible(visible);
+ LLFloater::setVisible(visible);
return;
}
@@ -177,7 +171,7 @@ void LLFloaterMove::setVisible(BOOL visible)
LLPanelStandStopFlying::getInstance()->reparent(NULL);
}
- LLTransientDockableFloater::setVisible(visible);
+ LLFloater::setVisible(visible);
}
// static
@@ -441,30 +435,6 @@ void LLFloaterMove::setModeTitle(const EMovementMode mode)
setTitle(title);
}
-/**
- * Updates position of the floater to be center aligned with Move button.
- */
-void LLFloaterMove::updatePosition()
-{
- LLBottomTray* tray = LLBottomTray::getInstance();
- if (!tray) return;
-
- LLButton* movement_btn = tray->findChild<LLButton>(BOTTOM_TRAY_BUTTON_NAME);
-
- if (movement_btn)
- {
- //align centers of a button and a floater
- S32 x = movement_btn->calcScreenRect().getCenterX() - getRect().getWidth()/2;
-
- S32 y = 0;
- if (!mModeActionsPanel->getVisible())
- {
- y = mModeActionsPanel->getRect().getHeight();
- }
- setOrigin(x, y);
- }
-}
-
//static
void LLFloaterMove::sUpdateFlyingStatus()
{
@@ -499,8 +469,6 @@ void LLFloaterMove::enableInstance(BOOL bEnable)
void LLFloaterMove::onOpen(const LLSD& key)
{
- LLButton *anchor_panel = LLBottomTray::getInstance()->getChild<LLButton>("movement_btn");
-
if (gAgent.getFlying())
{
setFlyingMode(TRUE);
@@ -513,19 +481,9 @@ void LLFloaterMove::onOpen(const LLSD& key)
showModeButtons(FALSE);
}
- setDockControl(new LLDockControl(
- anchor_panel, this,
- getDockTongue(), LLDockControl::TOP));
-
sUpdateFlyingStatus();
}
-//virtual
-void LLFloaterMove::setDocked(bool docked, bool pop_on_undock/* = true*/)
-{
- LLTransientDockableFloater::setDocked(docked, pop_on_undock);
-}
-
void LLFloaterMove::setModeButtonToggleState(const EMovementMode mode)
{
llassert_always(mModeControlButtonMap.end() != mModeControlButtonMap.find(mode));
@@ -736,23 +694,30 @@ void LLPanelStandStopFlying::onStopFlyingButtonClick()
*/
void LLPanelStandStopFlying::updatePosition()
{
- LLBottomTray* tray = LLBottomTray::getInstance();
- if (!tray || mAttached) return;
+ if (mAttached) return;
- LLButton* movement_btn = tray->findChild<LLButton>(BOTTOM_TRAY_BUTTON_NAME);
+ S32 y_pos = 0;
+ S32 bottom_tb_center = 0;
+ if (LLToolBar* toolbar_bottom = gToolBarView->getChild<LLToolBar>("toolbar_bottom"))
+ {
+ y_pos = toolbar_bottom->getRect().getHeight();
+ bottom_tb_center = toolbar_bottom->getRect().getCenterX();
+ }
- S32 x = 0;
- if (movement_btn)
+ S32 left_tb_width = 0;
+ if (LLToolBar* toolbar_left = gToolBarView->getChild<LLToolBar>("toolbar_left"))
{
- // Align centers of the button and the panel.
- x = movement_btn->calcScreenRect().getCenterX() - getRect().getWidth()/2;
+ left_tb_width = toolbar_left->getRect().getWidth();
}
- else
+
+ if(LLPanel* panel_ssf_container = getRootView()->getChild<LLPanel>("stand_stop_flying_container"))
{
- x = tray->calcScreenRect().getCenterX() - getRect().getWidth()/2;
+ panel_ssf_container->setOrigin(0, y_pos);
}
- setOrigin(x, 0);
-}
+ S32 x_pos = bottom_tb_center-getRect().getWidth()/2 - left_tb_width;
+
+ setOrigin( x_pos, 0);
+}
// EOF
diff --git a/indra/newview/llmoveview.h b/indra/newview/llmoveview.h
index 1b87864651..744dd866d4 100644
--- a/indra/newview/llmoveview.h
+++ b/indra/newview/llmoveview.h
@@ -28,7 +28,7 @@
#define LL_LLMOVEVIEW_H
// Library includes
-#include "lltransientdockablefloater.h"
+#include "llfloater.h"
class LLButton;
class LLJoystickAgentTurn;
@@ -38,7 +38,7 @@ class LLJoystickAgentSlide;
// Classes
//
class LLFloaterMove
-: public LLTransientDockableFloater
+: public LLFloater
{
LOG_CLASS(LLFloaterMove);
friend class LLFloaterReg;
@@ -58,7 +58,6 @@ public:
static void setSittingMode(BOOL bSitting);
static void enableInstance(BOOL bEnable);
/*virtual*/ void onOpen(const LLSD& key);
- /*virtual*/ void setDocked(bool docked, bool pop_on_undock = true);
static void sUpdateFlyingStatus();
@@ -87,7 +86,6 @@ private:
void initModeButtonMap();
void setModeButtonToggleState(const EMovementMode mode);
void updateButtonsWithMovementMode(const EMovementMode newMode);
- void updatePosition();
void showModeButtons(BOOL bShow);
public:
diff --git a/indra/newview/llnamelistctrl.h b/indra/newview/llnamelistctrl.h
index d64fdbe6a5..ca9956dc53 100644
--- a/indra/newview/llnamelistctrl.h
+++ b/indra/newview/llnamelistctrl.h
@@ -61,7 +61,7 @@ public:
{}
};
- struct NameColumn : public LLInitParam::Choice<NameColumn>
+ struct NameColumn : public LLInitParam::ChoiceBlock<NameColumn>
{
Alternative<S32> column_index;
Alternative<std::string> column_name;
diff --git a/indra/newview/llnavigationbar.cpp b/indra/newview/llnavigationbar.cpp
index 9d54ad7463..2a08cb1845 100644
--- a/indra/newview/llnavigationbar.cpp
+++ b/indra/newview/llnavigationbar.cpp
@@ -45,7 +45,6 @@
#include "llpaneltopinfobar.h"
#include "llteleporthistory.h"
#include "llsearchcombobox.h"
-#include "llsidetray.h"
#include "llslurl.h"
#include "llurlregistry.h"
#include "llurldispatcher.h"
@@ -55,7 +54,6 @@
#include "llworldmapmessage.h"
#include "llappviewer.h"
#include "llviewercontrol.h"
-#include "llfloatermediabrowser.h"
#include "llweb.h"
#include "llhints.h"
@@ -269,7 +267,6 @@ LLNavigationBar::LLNavigationBar()
mBtnForward(NULL),
mBtnHome(NULL),
mCmbLocation(NULL),
- mSearchComboBox(NULL),
mPurgeTPHistoryItems(false),
mSaveToLocationHistory(false)
{
@@ -291,10 +288,7 @@ BOOL LLNavigationBar::postBuild()
mBtnForward = getChild<LLPullButton>("forward_btn");
mBtnHome = getChild<LLButton>("home_btn");
- mCmbLocation= getChild<LLLocationInputCtrl>("location_combo");
- mSearchComboBox = getChild<LLSearchComboBox>("search_combo_box");
-
- fillSearchComboBox();
+ mCmbLocation= getChild<LLLocationInputCtrl>("location_combo");
mBtnBack->setEnabled(FALSE);
mBtnBack->setClickedCallback(boost::bind(&LLNavigationBar::onBackButtonClicked, this));
@@ -309,8 +303,6 @@ BOOL LLNavigationBar::postBuild()
mBtnHome->setClickedCallback(boost::bind(&LLNavigationBar::onHomeButtonClicked, this));
mCmbLocation->setCommitCallback(boost::bind(&LLNavigationBar::onLocationSelection, this));
-
- mSearchComboBox->setCommitCallback(boost::bind(&LLNavigationBar::onSearchCommit, this));
mTeleportFinishConnection = LLViewerParcelMgr::getInstance()->
setTeleportFinishedCallback(boost::bind(&LLNavigationBar::onTeleportFinished, this, _1));
@@ -325,7 +317,7 @@ BOOL LLNavigationBar::postBuild()
LLTeleportHistory::getInstance()->setHistoryChangedCallback(
boost::bind(&LLNavigationBar::onTeleportHistoryChanged, this));
- LLHints::registerHintTarget("nav_bar", LLView::getHandle());
+ LLHints::registerHintTarget("nav_bar", getHandle());
return TRUE;
}
@@ -344,26 +336,6 @@ void LLNavigationBar::setVisible(BOOL visible)
}
}
-
-void LLNavigationBar::fillSearchComboBox()
-{
- if(!mSearchComboBox)
- {
- return;
- }
-
- LLSearchHistory::getInstance()->load();
-
- LLSearchHistory::search_history_list_t search_list =
- LLSearchHistory::getInstance()->getSearchHistoryList();
- LLSearchHistory::search_history_list_t::const_iterator it = search_list.begin();
- for( ; search_list.end() != it; ++it)
- {
- LLSearchHistory::LLSearchHistoryItem item = *it;
- mSearchComboBox->add(item.search_query);
- }
-}
-
void LLNavigationBar::draw()
{
if(mPurgeTPHistoryItems)
@@ -416,16 +388,6 @@ void LLNavigationBar::onHomeButtonClicked()
gAgent.teleportHome();
}
-void LLNavigationBar::onSearchCommit()
-{
- std::string search_query = mSearchComboBox->getSimple();
- if(!search_query.empty())
- {
- LLSearchHistory::getInstance()->addEntry(search_query);
- }
- invokeSearch(search_query);
-}
-
void LLNavigationBar::onTeleportHistoryMenuItemClicked(const LLSD& userdata)
{
int idx = userdata.asInteger();
@@ -736,151 +698,3 @@ int LLNavigationBar::getDefFavBarHeight()
{
return mDefaultFpRect.getHeight();
}
-
-void LLNavigationBar::showNavigationPanel(BOOL visible)
-{
- bool fpVisible = gSavedSettings.getBOOL("ShowNavbarFavoritesPanel");
-
- LLFavoritesBarCtrl* fb = getChild<LLFavoritesBarCtrl>("favorite");
- LLPanel* navPanel = getChild<LLPanel>("navigation_panel");
-
- LLRect nbRect(getRect());
- LLRect fbRect(fb->getRect());
-
- navPanel->setVisible(visible);
-
- if (visible)
- {
- if (fpVisible)
- {
- // Navigation Panel must be shown. Favorites Panel is visible.
-
- nbRect.setLeftTopAndSize(nbRect.mLeft, nbRect.mTop, nbRect.getWidth(), mDefaultNbRect.getHeight());
- fbRect.setLeftTopAndSize(fbRect.mLeft, mDefaultFpRect.mTop, fbRect.getWidth(), fbRect.getHeight());
-
- // this is duplicated in 'else' section because it should be called BEFORE fb->reshape
- reshape(nbRect.getWidth(), nbRect.getHeight());
- setRect(nbRect);
- // propagate size to parent container
- getParent()->reshape(nbRect.getWidth(), nbRect.getHeight());
-
- fb->reshape(fbRect.getWidth(), fbRect.getHeight());
- fb->setRect(fbRect);
- }
- else
- {
- // Navigation Panel must be shown. Favorites Panel is hidden.
-
- S32 height = mDefaultNbRect.getHeight() - mDefaultFpRect.getHeight() - FAVBAR_TOP_PADDING;
- nbRect.setLeftTopAndSize(nbRect.mLeft, nbRect.mTop, nbRect.getWidth(), height);
-
- reshape(nbRect.getWidth(), nbRect.getHeight());
- setRect(nbRect);
- getParent()->reshape(nbRect.getWidth(), nbRect.getHeight());
- }
- }
- else
- {
- if (fpVisible)
- {
- // Navigation Panel must be hidden. Favorites Panel is visible.
-
- S32 fpHeight = mDefaultFpRect.getHeight() + FAVBAR_TOP_PADDING;
- S32 fpTop = fpHeight - (mDefaultFpRect.getHeight() / 2) + 1;
-
- nbRect.setLeftTopAndSize(nbRect.mLeft, nbRect.mTop, nbRect.getWidth(), fpHeight);
- fbRect.setLeftTopAndSize(fbRect.mLeft, fpTop, fbRect.getWidth(), mDefaultFpRect.getHeight());
-
- // this is duplicated in 'else' section because it should be called BEFORE fb->reshape
- reshape(nbRect.getWidth(), nbRect.getHeight());
- setRect(nbRect);
- getParent()->reshape(nbRect.getWidth(), nbRect.getHeight());
-
- fb->reshape(fbRect.getWidth(), fbRect.getHeight());
- fb->setRect(fbRect);
- }
- else
- {
- // Navigation Panel must be hidden. Favorites Panel is hidden.
-
- nbRect.setLeftTopAndSize(nbRect.mLeft, nbRect.mTop, nbRect.getWidth(), 0);
-
- reshape(nbRect.getWidth(), nbRect.getHeight());
- setRect(nbRect);
- getParent()->reshape(nbRect.getWidth(), nbRect.getHeight());
- }
- }
-
- getChildView("bg_icon")->setVisible( visible && fpVisible);
- getChildView("bg_icon_no_fav_bevel")->setVisible( visible && !fpVisible);
- getChildView("bg_icon_no_nav_bevel")->setVisible( !visible && fpVisible);
-}
-
-void LLNavigationBar::showFavoritesPanel(BOOL visible)
-{
- bool npVisible = gSavedSettings.getBOOL("ShowNavbarNavigationPanel");
-
- LLFavoritesBarCtrl* fb = getChild<LLFavoritesBarCtrl>("favorite");
-
- LLRect nbRect(getRect());
- LLRect fbRect(fb->getRect());
-
- if (visible)
- {
- if (npVisible)
- {
- // Favorites Panel must be shown. Navigation Panel is visible.
-
- S32 fbHeight = fbRect.getHeight();
- S32 newHeight = nbRect.getHeight() + fbHeight + FAVBAR_TOP_PADDING;
-
- nbRect.setLeftTopAndSize(nbRect.mLeft, nbRect.mTop, nbRect.getWidth(), newHeight);
- fbRect.setLeftTopAndSize(mDefaultFpRect.mLeft, mDefaultFpRect.mTop, fbRect.getWidth(), fbRect.getHeight());
- }
- else
- {
- // Favorites Panel must be shown. Navigation Panel is hidden.
-
- S32 fpHeight = mDefaultFpRect.getHeight() + FAVBAR_TOP_PADDING;
- S32 fpTop = fpHeight - (mDefaultFpRect.getHeight() / 2) + 1;
-
- nbRect.setLeftTopAndSize(nbRect.mLeft, nbRect.mTop, nbRect.getWidth(), fpHeight);
- fbRect.setLeftTopAndSize(fbRect.mLeft, fpTop, fbRect.getWidth(), mDefaultFpRect.getHeight());
- }
-
- reshape(nbRect.getWidth(), nbRect.getHeight());
- setRect(nbRect);
- getParent()->reshape(nbRect.getWidth(), nbRect.getHeight());
-
- fb->reshape(fbRect.getWidth(), fbRect.getHeight());
- fb->setRect(fbRect);
- }
- else
- {
- if (npVisible)
- {
- // Favorites Panel must be hidden. Navigation Panel is visible.
-
- S32 fbHeight = fbRect.getHeight();
- S32 newHeight = nbRect.getHeight() - fbHeight - FAVBAR_TOP_PADDING;
-
- nbRect.setLeftTopAndSize(nbRect.mLeft, nbRect.mTop, nbRect.getWidth(), newHeight);
- }
- else
- {
- // Favorites Panel must be hidden. Navigation Panel is hidden.
-
- nbRect.setLeftTopAndSize(nbRect.mLeft, nbRect.mTop, nbRect.getWidth(), 0);
- }
-
- reshape(nbRect.getWidth(), nbRect.getHeight());
- setRect(nbRect);
- getParent()->reshape(nbRect.getWidth(), nbRect.getHeight());
- }
-
- getChildView("bg_icon")->setVisible( npVisible && visible);
- getChildView("bg_icon_no_fav_bevel")->setVisible( npVisible && !visible);
- getChildView("bg_icon_no_nav_bevel")->setVisible( !npVisible && visible);
-
- fb->setVisible(visible);
-}
diff --git a/indra/newview/llnavigationbar.h b/indra/newview/llnavigationbar.h
index 3c9f8a762d..e4ce9e3998 100644
--- a/indra/newview/llnavigationbar.h
+++ b/indra/newview/llnavigationbar.h
@@ -98,9 +98,6 @@ public:
void handleLoginComplete();
void clearHistoryCache();
- void showNavigationPanel(BOOL visible);
- void showFavoritesPanel(BOOL visible);
-
int getDefNavBarHeight();
int getDefFavBarHeight();
@@ -121,7 +118,6 @@ private:
void onHomeButtonClicked();
void onLocationSelection();
void onLocationPrearrange(const LLSD& data);
- void onSearchCommit();
void onTeleportFinished(const LLVector3d& global_agent_pos);
void onTeleportFailed();
void onRegionNameResponse(
@@ -131,8 +127,6 @@ private:
U64 region_handle, const std::string& url,
const LLUUID& snapshot_id, bool teleport);
- void fillSearchComboBox();
-
static void destroyClass()
{
if (LLNavigationBar::instanceExists())
@@ -145,7 +139,6 @@ private:
LLPullButton* mBtnBack;
LLPullButton* mBtnForward;
LLButton* mBtnHome;
- LLSearchComboBox* mSearchComboBox;
LLLocationInputCtrl* mCmbLocation;
LLRect mDefaultNbRect;
LLRect mDefaultFpRect;
diff --git a/indra/newview/llnearbychat.cpp b/indra/newview/llnearbychat.cpp
index 03ebc344f1..a7303ad035 100644
--- a/indra/newview/llnearbychat.cpp
+++ b/indra/newview/llnearbychat.cpp
@@ -32,8 +32,9 @@
#include "llrootview.h"
//#include "llchatitemscontainerctrl.h"
#include "lliconctrl.h"
-#include "llsidetray.h"
+#include "llfloatersidepanelcontainer.h"
#include "llfocusmgr.h"
+#include "lllogchat.h"
#include "llresizebar.h"
#include "llresizehandle.h"
#include "llmenugl.h"
@@ -50,21 +51,18 @@
#include "lldraghandle.h"
-#include "llbottomtray.h"
#include "llnearbychatbar.h"
#include "llfloaterreg.h"
#include "lltrans.h"
static const S32 RESIZE_BAR_THICKNESS = 3;
-LLNearbyChat::LLNearbyChat(const LLSD& key)
- : LLDockableFloater(NULL, false, false, key)
- ,mChatHistory(NULL)
-{
-
-}
-LLNearbyChat::~LLNearbyChat()
+static LLRegisterPanelClassWrapper<LLNearbyChat> t_panel_nearby_chat("panel_nearby_chat");
+
+LLNearbyChat::LLNearbyChat(const LLNearbyChat::Params& p)
+: LLPanel(p),
+ mChatHistory(NULL)
{
}
@@ -86,54 +84,12 @@ BOOL LLNearbyChat::postBuild()
mChatHistory = getChild<LLChatHistory>("chat_history");
- if(!LLDockableFloater::postBuild())
+ if(!LLPanel::postBuild())
return false;
-
- if (getDockControl() == NULL)
- {
- setDockControl(new LLDockControl(
- LLBottomTray::getInstance()->getNearbyChatBar(), this,
- getDockTongue(), LLDockControl::TOP, boost::bind(&LLNearbyChat::getAllowedRect, this, _1)));
- }
-
- //fix for EXT-4621
- //chrome="true" prevents floater from stilling capture
- setIsChrome(true);
- //chrome="true" hides floater caption
- if (mDragHandle)
- mDragHandle->setTitleVisible(TRUE);
-
+
return true;
}
-
-void LLNearbyChat::applySavedVariables()
-{
- if (mRectControl.size() > 1)
- {
- const LLRect& rect = LLFloater::getControlGroup()->getRect(mRectControl);
- if(!rect.isEmpty() && rect.isValid())
- {
- reshape(rect.getWidth(), rect.getHeight());
- setRect(rect);
- }
- }
-
-
- if(!LLFloater::getControlGroup()->controlExists(mDocStateControl))
- {
- setDocked(true);
- }
- else
- {
- if (mDocStateControl.size() > 1)
- {
- bool dockState = LLFloater::getControlGroup()->getBOOL(mDocStateControl);
- setDocked(dockState);
- }
- }
-}
-
std::string appendTime()
{
time_t utc_time;
@@ -203,7 +159,7 @@ void LLNearbyChat::onNearbySpeakers()
{
LLSD param;
param["people_panel_tab_name"] = "nearby_panel";
- LLSideTray::getInstance()->showPanel("panel_people",param);
+ LLFloaterSidePanelContainer::showPanel("people", "panel_people", param);
}
@@ -218,30 +174,26 @@ bool LLNearbyChat::onNearbyChatCheckContextMenuItem(const LLSD& userdata)
return false;
}
-void LLNearbyChat::setVisible(BOOL visible)
+void LLNearbyChat::removeScreenChat()
{
- if(visible)
+ LLNotificationsUI::LLScreenChannelBase* chat_channel = LLNotificationsUI::LLChannelManager::getInstance()->findChannelByID(LLUUID(gSavedSettings.getString("NearByChatChannelUUID")));
+ if(chat_channel)
{
- LLNotificationsUI::LLScreenChannelBase* chat_channel = LLNotificationsUI::LLChannelManager::getInstance()->findChannelByID(LLUUID(gSavedSettings.getString("NearByChatChannelUUID")));
- if(chat_channel)
- {
- chat_channel->removeToastsFromChannel();
- }
+ chat_channel->removeToastsFromChannel();
}
-
- LLDockableFloater::setVisible(visible);
}
-void LLNearbyChat::onOpen(const LLSD& key )
+void LLNearbyChat::setVisible(BOOL visible)
{
- LLDockableFloater::onOpen(key);
-}
+ if(visible)
+ {
+ removeScreenChat();
+ }
-void LLNearbyChat::setRect (const LLRect &rect)
-{
- LLDockableFloater::setRect(rect);
+ LLPanel::setVisible(visible);
}
+
void LLNearbyChat::getAllowedRect(LLRect& rect)
{
rect = gViewerWindow->getWorldViewRectScaled();
@@ -263,7 +215,8 @@ void LLNearbyChat::updateChatHistoryStyle()
//static
void LLNearbyChat::processChatHistoryStyleUpdate(const LLSD& newvalue)
{
- LLNearbyChat* nearby_chat = LLFloaterReg::getTypedInstance<LLNearbyChat>("nearby_chat", LLSD());
+ LLFloater* chat_bar = LLFloaterReg::getInstance("chat_bar");
+ LLNearbyChat* nearby_chat = chat_bar->findChild<LLNearbyChat>("nearby_chat");
if(nearby_chat)
nearby_chat->updateChatHistoryStyle();
}
@@ -339,7 +292,8 @@ void LLNearbyChat::loadHistory()
//static
LLNearbyChat* LLNearbyChat::getInstance()
{
- return LLFloaterReg::getTypedInstance<LLNearbyChat>("nearby_chat", LLSD());
+ LLFloater* chat_bar = LLFloaterReg::getInstance("chat_bar");
+ return chat_bar->findChild<LLNearbyChat>("nearby_chat");
}
////////////////////////////////////////////////////////////////////////////////
@@ -367,7 +321,7 @@ BOOL LLNearbyChat::handleMouseDown(S32 x, S32 y, MASK mask)
if(mChatHistory)
mChatHistory->setFocus(TRUE);
- return LLDockableFloater::handleMouseDown(x, y, mask);
+ return LLPanel::handleMouseDown(x, y, mask);
}
void LLNearbyChat::draw()
@@ -380,5 +334,5 @@ void LLNearbyChat::draw()
setTransparencyType(hasFocus() ? TT_ACTIVE : TT_INACTIVE);
}
- LLDockableFloater::draw();
+ LLPanel::draw();
}
diff --git a/indra/newview/llnearbychat.h b/indra/newview/llnearbychat.h
index 2ea79797f8..7c5975cbc5 100644
--- a/indra/newview/llnearbychat.h
+++ b/indra/newview/llnearbychat.h
@@ -1,4 +1,4 @@
-/**
+ /**
* @file llnearbychat.h
* @brief nearby chat history scrolling panel implementation
*
@@ -27,18 +27,17 @@
#ifndef LL_LLNEARBYCHAT_H_
#define LL_LLNEARBYCHAT_H_
-#include "lldockablefloater.h"
#include "llscrollbar.h"
#include "llviewerchat.h"
+#include "llfloater.h"
class LLResizeBar;
class LLChatHistory;
-class LLNearbyChat: public LLDockableFloater
+class LLNearbyChat: public LLPanel
{
public:
- LLNearbyChat(const LLSD& key);
- ~LLNearbyChat();
+ LLNearbyChat(const Params& p = LLPanel::getDefaultParams());
BOOL postBuild ();
@@ -54,12 +53,8 @@ public:
/*virtual*/ void onFocusLost();
/*virtual*/ void onFocusReceived();
- /*virtual*/ void onOpen (const LLSD& key);
-
/*virtual*/ void setVisible(BOOL visible);
-
- virtual void setRect (const LLRect &rect);
-
+
virtual void updateChatHistoryStyle();
static void processChatHistoryStyleUpdate(const LLSD& newvalue);
@@ -67,14 +62,14 @@ public:
void loadHistory();
static LLNearbyChat* getInstance();
+ void removeScreenChat();
private:
- virtual void applySavedVariables();
void getAllowedRect (LLRect& rect);
void onNearbySpeakers ();
-
+
private:
LLHandle<LLView> mPopupMenuHandle;
diff --git a/indra/newview/llnearbychatbar.cpp b/indra/newview/llnearbychatbar.cpp
index 4b961db5f9..4512c14b7a 100644
--- a/indra/newview/llnearbychatbar.cpp
+++ b/indra/newview/llnearbychatbar.cpp
@@ -34,7 +34,6 @@
#include "llfirstuse.h"
#include "llnearbychatbar.h"
-#include "llbottomtray.h"
#include "llagent.h"
#include "llgesturemgr.h"
#include "llmultigesture.h"
@@ -48,14 +47,20 @@
#include "llviewerwindow.h"
#include "llrootview.h"
#include "llviewerchat.h"
+#include "llnearbychat.h"
+#include "lltranslate.h"
+
+#include "llresizehandle.h"
S32 LLNearbyChatBar::sLastSpecialChatChannel = 0;
+const S32 EXPANDED_HEIGHT = 300;
+const S32 COLLAPSED_HEIGHT = 60;
+const S32 EXPANDED_MIN_HEIGHT = 150;
+
// legacy callback glue
void send_chat_from_viewer(const std::string& utf8_out_text, EChatType type, S32 channel);
-static LLDefaultChildRegistry::Register<LLGestureComboList> r("gesture_combo_list");
-
struct LLChatTypeTrigger {
std::string name;
EChatType type;
@@ -66,353 +71,13 @@ static LLChatTypeTrigger sChatTypeTriggers[] = {
{ "/shout" , CHAT_TYPE_SHOUT}
};
-//ext-7367
-//Problem: gesture list control (actually LLScrollListCtrl) didn't actually process mouse wheel message.
-// introduce new gesture list subclass to "eat" mouse wheel messages (and probably some other messages)
-class LLGestureScrollListCtrl: public LLScrollListCtrl
-{
-protected:
- friend class LLUICtrlFactory;
- LLGestureScrollListCtrl(const LLScrollListCtrl::Params& params)
- :LLScrollListCtrl(params)
- {
- }
-public:
- BOOL handleScrollWheel(S32 x, S32 y, S32 clicks)
- {
- LLScrollListCtrl::handleScrollWheel( x, y, clicks );
- return TRUE;
- }
- //See EXT-6598
- //Mouse hover over separator will result in not processing tooltip message
- //So eat this message
- BOOL handleToolTip(S32 x, S32 y, MASK mask)
- {
- LLScrollListCtrl::handleToolTip( x, y, mask );
- return TRUE;
- }
-};
-
-LLGestureComboList::Params::Params()
-: combo_button("combo_button"),
- combo_list("combo_list"),
- get_more("get_more", true),
- view_all("view_all", true)
-{
-}
-
-LLGestureComboList::LLGestureComboList(const LLGestureComboList::Params& p)
-: LLUICtrl(p),
- mLabel(p.label),
- mViewAllItemIndex(-1),
- mGetMoreItemIndex(-1),
- mShowViewAll(p.view_all),
- mShowGetMore(p.get_more)
-{
- LLBottomtrayButton::Params button_params = p.combo_button;
- button_params.follows.flags(FOLLOWS_LEFT|FOLLOWS_BOTTOM|FOLLOWS_RIGHT);
-
- mButton = LLUICtrlFactory::create<LLBottomtrayButton>(button_params);
- mButton->reshape(getRect().getWidth(),getRect().getHeight());
- mButton->setCommitCallback(boost::bind(&LLGestureComboList::onButtonCommit, this));
-
- addChild(mButton);
-
- LLGestureScrollListCtrl::Params params(p.combo_list);
-
- params.name("GestureComboList");
- params.commit_callback.function(boost::bind(&LLGestureComboList::onItemSelected, this, _2));
- params.visible(false);
- params.commit_on_keyboard_movement(false);
-
- mList = LLUICtrlFactory::create<LLGestureScrollListCtrl>(params);
- addChild(mList);
-
- //****************************Gesture Part********************************/
-
- setCommitCallback(boost::bind(&LLGestureComboList::onCommitGesture, this));
-
- // now register us as observer since we have a place to put the results
- LLGestureMgr::instance().addObserver(this);
-
- // refresh list from current active gestures
- refreshGestures();
-
- setFocusLostCallback(boost::bind(&LLGestureComboList::hideList, this));
-}
-
-BOOL LLGestureComboList::handleKeyHere(KEY key, MASK mask)
-{
- BOOL handled = FALSE;
-
- if (key == KEY_ESCAPE && mask == MASK_NONE )
- {
- hideList();
- handled = TRUE;
- }
- else
- {
- handled = mList->handleKeyHere(key, mask);
- }
-
- return handled;
-}
-
-void LLGestureComboList::draw()
-{
- LLUICtrl::draw();
-
- if(mButton->getToggleState())
- {
- showList();
- }
-}
-
-void LLGestureComboList::showList()
-{
- LLRect rect = mList->getRect();
- LLRect button_rect = mButton->getRect();
-
- // Calculating amount of space between the navigation bar and gestures combo
- LLNavigationBar* nb = LLNavigationBar::getInstance();
-
- S32 x, nb_bottom;
- nb->localPointToOtherView(0, 0, &x, &nb_bottom, this);
-
- S32 max_height = nb_bottom - button_rect.mTop;
- mList->calcColumnWidths();
- rect.setOriginAndSize(button_rect.mLeft, button_rect.mTop, llmax(mList->getMaxContentWidth(),mButton->getRect().getWidth()), max_height);
-
- mList->setRect(rect);
- mList->fitContents( llmax(mList->getMaxContentWidth(),mButton->getRect().getWidth()), max_height);
-
- gFocusMgr.setKeyboardFocus(this);
-
- // Show the list and push the button down
- mButton->setToggleState(TRUE);
- mList->setVisible(TRUE);
- sendChildToFront(mList);
- LLUI::addPopup(mList);
-}
-
-void LLGestureComboList::onButtonCommit()
-{
- if (!mList->getVisible())
- {
- // highlight the last selected item from the original selection before potentially selecting a new item
- // as visual cue to original value of combo box
- LLScrollListItem* last_selected_item = mList->getLastSelectedItem();
- if (last_selected_item)
- {
- mList->mouseOverHighlightNthItem(mList->getItemIndex(last_selected_item));
- }
-
- if (mList->getItemCount() != 0)
- {
- showList();
- }
- }
- else
- {
- hideList();
- }
-}
-
-void LLGestureComboList::hideList()
-{
- if (mList->getVisible())
- {
- mButton->setToggleState(FALSE);
- mList->setVisible(FALSE);
- mList->mouseOverHighlightNthItem(-1);
- LLUI::removePopup(mList);
- gFocusMgr.setKeyboardFocus(NULL);
- }
-}
-
-S32 LLGestureComboList::getCurrentIndex() const
-{
- LLScrollListItem* item = mList->getFirstSelected();
- if( item )
- {
- return mList->getItemIndex( item );
- }
- return -1;
-}
-
-void LLGestureComboList::onItemSelected(const LLSD& data)
-{
- const std::string name = mList->getSelectedItemLabel();
-
- S32 cur_id = getCurrentIndex();
- mLastSelectedIndex = cur_id;
- if (cur_id != mList->getItemCount()-1 && cur_id != -1)
- {
- mButton->setLabel(name);
- }
-
- // hiding the list reasserts the old value stored in the text editor/dropdown button
- hideList();
-
- // commit does the reverse, asserting the value in the list
- onCommit();
-}
-
-void LLGestureComboList::sortByName(bool ascending)
-{
- mList->sortOnce(0, ascending);
-}
-
-LLSD LLGestureComboList::getValue() const
-{
- LLScrollListItem* item = mList->getFirstSelected();
- if( item )
- {
- return item->getValue();
- }
- else
- {
- return LLSD();
- }
-}
-
-void LLGestureComboList::refreshGestures()
-{
- //store current selection so we can maintain it
- LLSD cur_gesture = getValue();
-
- mList->selectFirstItem();
- mList->clearRows();
- mGestures.clear();
-
- LLGestureMgr::item_map_t::const_iterator it;
- const LLGestureMgr::item_map_t& active_gestures = LLGestureMgr::instance().getActiveGestures();
- LLSD::Integer idx(0);
- for (it = active_gestures.begin(); it != active_gestures.end(); ++it)
- {
- LLMultiGesture* gesture = (*it).second;
- if (gesture)
- {
- mList->addSimpleElement(gesture->mName, ADD_BOTTOM, LLSD(idx));
- mGestures.push_back(gesture);
- idx++;
- }
- }
-
- sortByName();
-
- // store indices for Get More and View All items (idx is the index followed by the last added Gesture)
- if (mShowGetMore)
- {
- mGetMoreItemIndex = idx;
- mList->addSimpleElement(LLTrans::getString("GetMoreGestures"), ADD_BOTTOM, LLSD(mGetMoreItemIndex));
- }
- if (mShowViewAll)
- {
- mViewAllItemIndex = idx + 1;
- mList->addSimpleElement(LLTrans::getString("ViewAllGestures"), ADD_BOTTOM, LLSD(mViewAllItemIndex));
- }
-
- // Insert label after sorting, at top, with separator below it
- mList->addSeparator(ADD_TOP);
- mList->addSimpleElement(mLabel, ADD_TOP);
-
- if (cur_gesture.isDefined())
- {
- mList->selectByValue(cur_gesture);
-
- }
- else
- {
- mList->selectFirstItem();
- }
-
- LLCtrlListInterface* gestures = getListInterface();
- LLMultiGesture* gesture = NULL;
-
- if (gestures)
- {
- S32 sel_index = gestures->getFirstSelectedIndex();
- if (sel_index != 0)
- {
- S32 index = gestures->getSelectedValue().asInteger();
- if (index<0 || index >= (S32)mGestures.size())
- {
- llwarns << "out of range gesture access" << llendl;
- }
- else
- {
- gesture = mGestures.at(index);
- }
- }
- }
-
- if(gesture && LLGestureMgr::instance().isGesturePlaying(gesture))
- {
- return;
- }
-
- mButton->setLabel(mLabel);
-}
-
-void LLGestureComboList::onCommitGesture()
-{
- LLCtrlListInterface* gestures = getListInterface();
- if (gestures)
- {
- S32 sel_index = gestures->getFirstSelectedIndex();
- if (sel_index == 0)
- {
- return;
- }
-
- S32 index = gestures->getSelectedValue().asInteger();
-
- if (mViewAllItemIndex == index)
- {
- // The same behavior as Ctrl+G. EXT-823
- LLFloaterReg::toggleInstance("gestures");
- gestures->selectFirstItem();
- return;
- }
-
- if (mGetMoreItemIndex == index)
- {
- LLWeb::loadURLExternal(gSavedSettings.getString("GesturesMarketplaceURL"));
- return;
- }
-
- if (index<0 || index >= (S32)mGestures.size())
- {
- llwarns << "out of range gesture index" << llendl;
- }
- else
- {
- LLMultiGesture* gesture = mGestures.at(index);
- if(gesture)
- {
- LLGestureMgr::instance().playGesture(gesture);
- if(!gesture->mReplaceText.empty())
- {
- LLNearbyChatBar::sendChatFromViewer(gesture->mReplaceText, CHAT_TYPE_NORMAL, FALSE);
- }
- }
- }
- }
-}
-
-LLGestureComboList::~LLGestureComboList()
-{
- LLGestureMgr::instance().removeObserver(this);
-}
-
-LLCtrlListInterface* LLGestureComboList::getListInterface()
-{
- return mList;
-}
-
-LLNearbyChatBar::LLNearbyChatBar()
-: mChatBox(NULL)
+LLNearbyChatBar::LLNearbyChatBar(const LLSD& key)
+: LLFloater(key),
+ mChatBox(NULL),
+ mNearbyChat(NULL),
+ mOutputMonitor(NULL),
+ mSpeakerMgr(NULL),
+ mExpandedHeight(COLLAPSED_HEIGHT + EXPANDED_HEIGHT)
{
mSpeakerMgr = LLLocalSpeakerMgr::getInstance();
}
@@ -436,15 +101,50 @@ BOOL LLNearbyChatBar::postBuild()
mChatBox->setEnableLineHistory(TRUE);
mChatBox->setFont(LLViewerChat::getChatFont());
+ mNearbyChat = getChildView("nearby_chat");
+
+ LLUICtrl* show_btn = getChild<LLUICtrl>("show_nearby_chat");
+ show_btn->setCommitCallback(boost::bind(&LLNearbyChatBar::onToggleNearbyChatPanel, this));
+
mOutputMonitor = getChild<LLOutputMonitorCtrl>("chat_zone_indicator");
mOutputMonitor->setVisible(FALSE);
+ gSavedSettings.declareBOOL("nearbychat_history_visibility", mNearbyChat->getVisible(), "Visibility state of nearby chat history", TRUE);
+
+ mNearbyChat->setVisible(gSavedSettings.getBOOL("nearbychat_history_visibility"));
+
// Register for font change notifications
LLViewerChat::setFontChangedCallback(boost::bind(&LLNearbyChatBar::onChatFontChange, this, _1));
+ enableResizeCtrls(true, true, false);
+
return TRUE;
}
+// virtual
+void LLNearbyChatBar::onOpen(const LLSD& key)
+{
+ enableTranslationCheckbox(LLTranslate::isTranslationConfigured());
+}
+
+bool LLNearbyChatBar::applyRectControl()
+{
+ bool rect_controlled = LLFloater::applyRectControl();
+
+ if (!mNearbyChat->getVisible())
+ {
+ reshape(getRect().getWidth(), getMinHeight());
+ enableResizeCtrls(true, true, false);
+ }
+ else
+ {
+ enableResizeCtrls(true);
+ setResizeLimits(getMinWidth(), EXPANDED_MIN_HEIGHT);
+ }
+
+ return rect_controlled;
+}
+
void LLNearbyChatBar::onChatFontChange(LLFontGL* fontp)
{
// Update things with the new font whohoo
@@ -457,19 +157,28 @@ void LLNearbyChatBar::onChatFontChange(LLFontGL* fontp)
//static
LLNearbyChatBar* LLNearbyChatBar::getInstance()
{
- return LLBottomTray::getInstance() ? LLBottomTray::getInstance()->getNearbyChatBar() : NULL;
+ return LLFloaterReg::getTypedInstance<LLNearbyChatBar>("chat_bar");
}
-//static
-bool LLNearbyChatBar::instanceExists()
+void LLNearbyChatBar::showHistory()
{
- return LLBottomTray::instanceExists() && LLBottomTray::getInstance()->getNearbyChatBar() != NULL;
+ openFloater();
+
+ if (!getChildView("nearby_chat")->getVisible())
+ {
+ onToggleNearbyChatPanel();
+ }
+}
+
+void LLNearbyChatBar::enableTranslationCheckbox(BOOL enable)
+{
+ getChild<LLUICtrl>("translate_chat_checkbox")->setEnabled(enable);
}
void LLNearbyChatBar::draw()
{
displaySpeakingIndicator();
- LLPanel::draw();
+ LLFloater::draw();
}
std::string LLNearbyChatBar::getCurrentChat()
@@ -683,6 +392,46 @@ void LLNearbyChatBar::sendChat( EChatType type )
}
}
+
+void LLNearbyChatBar::onToggleNearbyChatPanel()
+{
+ LLView* nearby_chat = getChildView("nearby_chat");
+
+ if (nearby_chat->getVisible())
+ {
+ if (!isMinimized())
+ {
+ mExpandedHeight = getRect().getHeight();
+ }
+ setResizeLimits(getMinWidth(), COLLAPSED_HEIGHT);
+ nearby_chat->setVisible(FALSE);
+ reshape(getRect().getWidth(), COLLAPSED_HEIGHT);
+ enableResizeCtrls(true, true, false);
+ storeRectControl();
+ }
+ else
+ {
+ nearby_chat->setVisible(TRUE);
+ setResizeLimits(getMinWidth(), EXPANDED_MIN_HEIGHT);
+ reshape(getRect().getWidth(), mExpandedHeight);
+ enableResizeCtrls(true);
+ storeRectControl();
+ }
+
+ gSavedSettings.setBOOL("nearbychat_history_visibility", mNearbyChat->getVisible());
+}
+
+void LLNearbyChatBar::setMinimized(BOOL b)
+{
+ LLNearbyChat* nearby_chat = getChild<LLNearbyChat>("nearby_chat");
+ // when unminimizing with nearby chat visible, go ahead and kill off screen chats
+ if (!b && nearby_chat->getVisible())
+ {
+ nearby_chat->removeScreenChat();
+ }
+ LLFloater::setMinimized(b);
+}
+
void LLNearbyChatBar::onChatBoxCommit()
{
if (mChatBox->getText().length() > 0)
@@ -780,17 +529,13 @@ void LLNearbyChatBar::sendChatFromViewer(const LLWString &wtext, EChatType type,
// static
void LLNearbyChatBar::startChat(const char* line)
{
- LLBottomTray *bt = LLBottomTray::getInstance();
-
- if (!bt)
- return;
-
- LLNearbyChatBar* cb = bt->getNearbyChatBar();
+ LLNearbyChatBar* cb = LLNearbyChatBar::getInstance();
if (!cb )
return;
- bt->setVisible(TRUE);
+ cb->setVisible(TRUE);
+ cb->setFocus(TRUE);
cb->mChatBox->setFocus(TRUE);
if (line)
@@ -806,12 +551,7 @@ void LLNearbyChatBar::startChat(const char* line)
// static
void LLNearbyChatBar::stopChat()
{
- LLBottomTray *bt = LLBottomTray::getInstance();
-
- if (!bt)
- return;
-
- LLNearbyChatBar* cb = bt->getNearbyChatBar();
+ LLNearbyChatBar* cb = LLNearbyChatBar::getInstance();
if (!cb)
return;
diff --git a/indra/newview/llnearbychatbar.h b/indra/newview/llnearbychatbar.h
index efddec942f..baf12a06ea 100644
--- a/indra/newview/llnearbychatbar.h
+++ b/indra/newview/llnearbychatbar.h
@@ -27,85 +27,26 @@
#ifndef LL_LLNEARBYCHATBAR_H
#define LL_LLNEARBYCHATBAR_H
-#include "llpanel.h"
+#include "llfloater.h"
#include "llcombobox.h"
#include "llgesturemgr.h"
#include "llchat.h"
#include "llvoiceclient.h"
#include "lloutputmonitorctrl.h"
#include "llspeakers.h"
-#include "llbottomtray.h"
-
-class LLGestureComboList
- : public LLGestureManagerObserver
- , public LLUICtrl
-{
-public:
- struct Params : public LLInitParam::Block<Params, LLUICtrl::Params>
- {
- Optional<LLBottomtrayButton::Params> combo_button;
- Optional<LLScrollListCtrl::Params> combo_list;
- Optional<bool> get_more,
- view_all;
-
- Params();
- };
-
-protected:
-
- friend class LLUICtrlFactory;
- LLGestureComboList(const Params&);
- std::vector<LLMultiGesture*> mGestures;
- std::string mLabel;
- bool mShowViewAll;
- bool mShowGetMore;
- LLSD::Integer mViewAllItemIndex;
- LLSD::Integer mGetMoreItemIndex;
-
-public:
-
- ~LLGestureComboList();
-
- LLCtrlListInterface* getListInterface();
- virtual void showList();
- virtual void hideList();
- virtual BOOL handleKeyHere(KEY key, MASK mask);
-
- virtual void draw();
-
- S32 getCurrentIndex() const;
- void onItemSelected(const LLSD& data);
- void sortByName(bool ascending = true);
- void refreshGestures();
- void onCommitGesture();
- void onButtonCommit();
- virtual LLSD getValue() const;
-
- // LLGestureManagerObserver trigger
- virtual void changed() { refreshGestures(); }
-
-private:
-
- LLButton* mButton;
- LLScrollListCtrl* mList;
- S32 mLastSelectedIndex;
-};
-
-class LLNearbyChatBar
-: public LLPanel
+class LLNearbyChatBar : public LLFloater
{
public:
// constructor for inline chat-bars (e.g. hosted in chat history window)
- LLNearbyChatBar();
+ LLNearbyChatBar(const LLSD& key);
~LLNearbyChatBar() {}
virtual BOOL postBuild();
+ /*virtual*/ void onOpen(const LLSD& key);
static LLNearbyChatBar* getInstance();
- static bool instanceExists();
-
LLLineEditor* getChatBox() { return mChatBox; }
virtual void draw();
@@ -119,6 +60,10 @@ public:
static void sendChatFromViewer(const std::string &utf8text, EChatType type, BOOL animate);
static void sendChatFromViewer(const LLWString &wtext, EChatType type, BOOL animate);
+ void showHistory();
+ void enableTranslationCheckbox(BOOL enable);
+ /*virtual*/void setMinimized(BOOL b);
+
protected:
static BOOL matchChatTypeTrigger(const std::string& in_str, std::string* out_str);
static void onChatBoxKeystroke(LLLineEditor* caller, void* userdata);
@@ -129,6 +74,10 @@ protected:
void onChatBoxCommit();
void onChatFontChange(LLFontGL* fontp);
+ /* virtual */ bool applyRectControl();
+
+ void onToggleNearbyChatPanel();
+
static LLWString stripChannelNumber(const LLWString &mesg, S32* channel);
EChatType processChatTypeTriggers(EChatType type, std::string &str);
@@ -137,9 +86,12 @@ protected:
// Which non-zero channel did we last chat on?
static S32 sLastSpecialChatChannel;
- LLLineEditor* mChatBox;
- LLOutputMonitorCtrl* mOutputMonitor;
- LLLocalSpeakerMgr* mSpeakerMgr;
+ LLLineEditor* mChatBox;
+ LLView* mNearbyChat;
+ LLOutputMonitorCtrl* mOutputMonitor;
+ LLLocalSpeakerMgr* mSpeakerMgr;
+
+ S32 mExpandedHeight;
};
#endif
diff --git a/indra/newview/llnearbychathandler.cpp b/indra/newview/llnearbychathandler.cpp
index 957b6d5f94..240a7c7a35 100644
--- a/indra/newview/llnearbychathandler.cpp
+++ b/indra/newview/llnearbychathandler.cpp
@@ -29,7 +29,6 @@
#include "llagentdata.h" // for gAgentID
#include "llnearbychathandler.h"
-#include "llbottomtray.h"
#include "llchatitemscontainerctrl.h"
#include "llfirstuse.h"
#include "llfloaterscriptdebug.h"
@@ -41,6 +40,9 @@
#include "llfloaterreg.h"//for LLFloaterReg::getTypedInstance
#include "llviewerwindow.h"//for screen channel position
+#include "llnearbychatbar.h"
+#include "llrootview.h"
+#include "lllayoutstack.h"
//add LLNearbyChatHandler to LLNotificationsUI namespace
using namespace LLNotificationsUI;
@@ -61,7 +63,8 @@ public:
typedef std::vector<LLHandle<LLToast> > toast_vec_t;
typedef std::list<LLHandle<LLToast> > toast_list_t;
- LLNearbyChatScreenChannel(const LLUUID& id):LLScreenChannelBase(id)
+ LLNearbyChatScreenChannel(const Params& p)
+ : LLScreenChannelBase(p)
{
mStopProcessing = false;
@@ -80,7 +83,6 @@ public:
void addNotification (LLSD& notification);
void arrangeToasts ();
- void showToastsBottom ();
typedef boost::function<LLToastPanelBase* (void )> create_toast_panel_callback_t;
void setCreatePanelCallback(create_toast_panel_callback_t value) { m_create_toast_panel_callback_t = value;}
@@ -88,8 +90,6 @@ public:
void onToastDestroyed (LLToast* toast, bool app_quitting);
void onToastFade (LLToast* toast);
- void reshape (S32 width, S32 height, BOOL called_from_parent);
-
void redrawToasts()
{
arrangeToasts();
@@ -149,6 +149,7 @@ protected:
toast_list_t m_toast_pool;
bool mStopProcessing;
+ bool mChannelRect;
};
//-----------------------------------------------------------------------------------------------
@@ -351,27 +352,6 @@ void LLNearbyChatScreenChannel::addNotification(LLSD& notification)
arrangeToasts();
}
-void LLNearbyChatScreenChannel::arrangeToasts()
-{
- if(!isHovering())
- {
- showToastsBottom();
- }
-
- if (m_active_toasts.empty())
- {
- LLHints::registerHintTarget("incoming_chat", LLHandle<LLView>());
- }
- else
- {
- LLToast* toast = m_active_toasts.front().get();
- if (toast)
- {
- LLHints::registerHintTarget("incoming_chat", m_active_toasts.front().get()->LLView::getHandle());
- }
- }
-}
-
static bool sort_toasts_predicate(LLHandle<LLToast> first, LLHandle<LLToast> second)
{
if (!first.get() || !second.get()) return false; // STORM-1352
@@ -381,16 +361,34 @@ static bool sort_toasts_predicate(LLHandle<LLToast> first, LLHandle<LLToast> sec
return v1 > v2;
}
-void LLNearbyChatScreenChannel::showToastsBottom()
+void LLNearbyChatScreenChannel::arrangeToasts()
{
- if(mStopProcessing)
+ if(mStopProcessing || isHovering())
return;
+ if (mFloaterSnapRegion == NULL)
+ {
+ mFloaterSnapRegion = gViewerWindow->getRootView()->getChildView("floater_snap_region");
+ }
+
+ if (!getParent())
+ {
+ // connect to floater snap region just to get resize events, we don't care about being a proper widget
+ mFloaterSnapRegion->addChild(this);
+ setFollows(FOLLOWS_ALL);
+ }
+
LLRect toast_rect;
- updateBottom();
- S32 channel_bottom = getRect().mBottom;
+ updateRect();
+
+ LLRect channel_rect;
+ mFloaterSnapRegion->localRectToOtherView(mFloaterSnapRegion->getLocalRect(), &channel_rect, gFloaterView);
+ channel_rect.mLeft += 10;
+ channel_rect.mRight = channel_rect.mLeft + 300;
- S32 bottom = channel_bottom;
+ S32 channel_bottom = channel_rect.mBottom;
+
+ S32 bottom = channel_bottom + 80;
S32 margin = gSavedSettings.getS32("ToastGap");
//sort active toasts
@@ -409,7 +407,7 @@ void LLNearbyChatScreenChannel::showToastsBottom()
S32 toast_top = bottom + toast->getRect().getHeight() + margin;
- if(toast_top > gFloaterView->getRect().getHeight())
+ if(toast_top > channel_rect.getHeight())
{
while(it!=m_active_toasts.end())
{
@@ -420,7 +418,7 @@ void LLNearbyChatScreenChannel::showToastsBottom()
}
toast_rect = toast->getRect();
- toast_rect.setLeftTopAndSize(getRect().mLeft , bottom + toast_rect.getHeight(), toast_rect.getWidth() ,toast_rect.getHeight());
+ toast_rect.setLeftTopAndSize(channel_rect.mLeft , bottom + toast_rect.getHeight(), toast_rect.getWidth() ,toast_rect.getHeight());
toast->setRect(toast_rect);
bottom += toast_rect.getHeight() - toast->getTopPad() + margin;
@@ -438,15 +436,10 @@ void LLNearbyChatScreenChannel::showToastsBottom()
}
}
- }
-
-void LLNearbyChatScreenChannel::reshape (S32 width, S32 height, BOOL called_from_parent)
-{
- LLScreenChannelBase::reshape(width, height, called_from_parent);
- arrangeToasts();
}
+
//-----------------------------------------------------------------------------------------------
//LLNearbyChatHandler
//-----------------------------------------------------------------------------------------------
@@ -457,7 +450,9 @@ LLNearbyChatHandler::LLNearbyChatHandler(e_notification_type type, const LLSD& i
mType = type;
// Getting a Channel for our notifications
- LLNearbyChatScreenChannel* channel = new LLNearbyChatScreenChannel(LLUUID(gSavedSettings.getString("NearByChatChannelUUID")));
+ LLNearbyChatScreenChannel::Params p;
+ p.id = LLUUID(gSavedSettings.getString("NearByChatChannelUUID"));
+ LLNearbyChatScreenChannel* channel = new LLNearbyChatScreenChannel(p);
LLNearbyChatScreenChannel::create_toast_panel_callback_t callback = createToastPanel;
@@ -473,15 +468,13 @@ LLNearbyChatHandler::~LLNearbyChatHandler()
void LLNearbyChatHandler::initChannel()
{
- LLNearbyChat* nearby_chat = LLFloaterReg::getTypedInstance<LLNearbyChat>("nearby_chat", LLSD());
- LLView* chat_box = LLBottomTray::getInstance()->getChildView("chat_box");
- S32 channel_right_bound = nearby_chat->getRect().mRight;
- mChannel->init(chat_box->getRect().mLeft, channel_right_bound);
+ //LLRect snap_rect = gFloaterView->getSnapRect();
+ //mChannel->init(snap_rect.mLeft, snap_rect.mLeft + 200);
}
-void LLNearbyChatHandler::processChat(const LLChat& chat_msg, // WARNING - not really const, see hack below changing chat_msg.mText
+void LLNearbyChatHandler::processChat(const LLChat& chat_msg,
const LLSD &args)
{
if(chat_msg.mMuted == TRUE)
@@ -490,24 +483,9 @@ void LLNearbyChatHandler::processChat(const LLChat& chat_msg, // WARNING - not
if(chat_msg.mText.empty())
return;//don't process empty messages
- // Handle irc styled messages for toast panel
- // HACK ALERT - changes mText, stripping out IRC style "/me" prefixes
- LLChat& tmp_chat = const_cast<LLChat&>(chat_msg);
- std::string original_message = tmp_chat.mText; // Save un-modified version of chat text
- if (tmp_chat.mChatStyle == CHAT_STYLE_IRC)
- {
- if(!tmp_chat.mFromName.empty())
- tmp_chat.mText = tmp_chat.mFromName + tmp_chat.mText.substr(3);
- else
- tmp_chat.mText = tmp_chat.mText.substr(3);
- }
+ LLFloater* chat_bar = LLFloaterReg::getInstance("chat_bar");
- LLNearbyChat* nearby_chat = LLFloaterReg::getTypedInstance<LLNearbyChat>("nearby_chat", LLSD());
- {
- //sometimes its usefull to have no name at all...
- //if(tmp_chat.mFromName.empty() && tmp_chat.mFromID!= LLUUID::null)
- // tmp_chat.mFromName = tmp_chat.mFromID.asString();
- }
+ LLNearbyChat* nearby_chat = chat_bar->findChild<LLNearbyChat>("nearby_chat");
// Build notification data
LLSD notification;
@@ -551,7 +529,7 @@ void LLNearbyChatHandler::processChat(const LLChat& chat_msg, // WARNING - not
LLViewerChat::getChatColor(chat_msg,txt_color);
- LLFloaterScriptDebug::addScriptLine(original_message, // Send full message with "/me" style prefix
+ LLFloaterScriptDebug::addScriptLine(chat_msg.mText,
chat_msg.mFromName,
txt_color,
chat_msg.mFromID);
@@ -576,7 +554,8 @@ void LLNearbyChatHandler::processChat(const LLChat& chat_msg, // WARNING - not
sChatWatcher->post(notification);
- if( nearby_chat->getVisible()
+ if( !chat_bar->isMinimized()
+ && nearby_chat->isInVisibleChain()
|| ( chat_msg.mSourceType == CHAT_SOURCE_AGENT
&& gSavedSettings.getBOOL("UseChatBubbles") )
|| !mChannel->getShowToasts() ) // to prevent toasts in Busy mode
@@ -604,6 +583,21 @@ void LLNearbyChatHandler::processChat(const LLChat& chat_msg, // WARNING - not
if(channel)
{
+ // Handle IRC styled messages.
+ std::string toast_msg;
+ if (chat_msg.mChatStyle == CHAT_STYLE_IRC)
+ {
+ if (!chat_msg.mFromName.empty())
+ {
+ toast_msg += chat_msg.mFromName;
+ }
+ toast_msg += chat_msg.mText.substr(3);
+ }
+ else
+ {
+ toast_msg = chat_msg.mText;
+ }
+
// Add a nearby chat toast.
LLUUID id;
id.generate();
@@ -615,6 +609,7 @@ void LLNearbyChatHandler::processChat(const LLChat& chat_msg, // WARNING - not
notification["text_color"] = r_color_name;
notification["color_alpha"] = r_color_alpha;
notification["font_size"] = (S32)LLViewerChat::getChatFontSize() ;
+ notification["message"] = toast_msg;
channel->addNotification(notification);
}
}
diff --git a/indra/newview/llnetmap.cpp b/indra/newview/llnetmap.cpp
index 5fe5c9b1e8..15d5d7c162 100644
--- a/indra/newview/llnetmap.cpp
+++ b/indra/newview/llnetmap.cpp
@@ -172,10 +172,10 @@ void LLNetMap::draw()
LLVector3 offset = gGL.getUITranslation();
LLVector3 scale = gGL.getUIScale();
- glLoadIdentity();
+ gGL.loadIdentity();
gGL.loadUIIdentity();
- glScalef(scale.mV[0], scale.mV[1], scale.mV[2]);
+ gGL.scalef(scale.mV[0], scale.mV[1], scale.mV[2]);
gGL.translatef(offset.mV[0], offset.mV[1], offset.mV[2]);
{
@@ -183,7 +183,7 @@ void LLNetMap::draw()
{
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
- glMatrixMode(GL_MODELVIEW);
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
// Draw background rectangle
LLColor4 background_color = mBackgroundColor.get();
@@ -204,7 +204,7 @@ void LLNetMap::draw()
{
// rotate subsequent draws to agent rotation
rotation = atan2( LLViewerCamera::getInstance()->getAtAxis().mV[VX], LLViewerCamera::getInstance()->getAtAxis().mV[VY] );
- glRotatef( rotation * RAD_TO_DEG, 0.f, 0.f, 1.f);
+ gGL.rotatef( rotation * RAD_TO_DEG, 0.f, 0.f, 1.f);
}
// figure out where agent is
@@ -492,7 +492,7 @@ void LLNetMap::draw()
// If we don't rotate the map, we have to rotate the frustum.
gGL.pushMatrix();
gGL.translatef( ctr_x, ctr_y, 0 );
- glRotatef( atan2( LLViewerCamera::getInstance()->getAtAxis().mV[VX], LLViewerCamera::getInstance()->getAtAxis().mV[VY] ) * RAD_TO_DEG, 0.f, 0.f, -1.f);
+ gGL.rotatef( atan2( LLViewerCamera::getInstance()->getAtAxis().mV[VX], LLViewerCamera::getInstance()->getAtAxis().mV[VY] ) * RAD_TO_DEG, 0.f, 0.f, -1.f);
gGL.begin( LLRender::TRIANGLES );
gGL.vertex2f( 0, 0 );
gGL.vertex2f( -half_width_pixels, far_clip_pixels );
diff --git a/indra/newview/llnotificationalerthandler.cpp b/indra/newview/llnotificationalerthandler.cpp
index 9d824dcd59..cae7d02fed 100644
--- a/indra/newview/llnotificationalerthandler.cpp
+++ b/indra/newview/llnotificationalerthandler.cpp
@@ -44,7 +44,7 @@ LLAlertHandler::LLAlertHandler(e_notification_type type, const LLSD& id) : mIsMo
{
mType = type;
- LLChannelManager::Params p;
+ LLScreenChannelBase::Params p;
p.id = LLUUID(gSavedSettings.getString("AlertChannelUUID"));
p.display_toasts_always = true;
p.toast_align = NA_CENTRE;
@@ -114,7 +114,7 @@ bool LLAlertHandler::processNotification(const LLSD& notify)
// 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);
+ mChannel->updatePositionAndSize(rc);
LLScreenChannel* channel = dynamic_cast<LLScreenChannel*>(mChannel);
if(channel)
diff --git a/indra/newview/llnotificationhandler.h b/indra/newview/llnotificationhandler.h
index 28a69f2373..23dbb6b047 100644
--- a/indra/newview/llnotificationhandler.h
+++ b/indra/newview/llnotificationhandler.h
@@ -283,9 +283,17 @@ class LLBrowserNotification : public LLSingleton<LLBrowserNotification>
{
public:
virtual bool processNotification(const LLSD& notify);
+};
+/**
+ * Handler for outbox notifications
+ */
+class LLOutboxNotification : public LLSingleton<LLOutboxNotification>
+{
+public:
+ virtual bool processNotification(const LLSD& notify);
};
-
+
class LLHandlerUtil
{
public:
diff --git a/indra/newview/llnotificationhandlerutil.cpp b/indra/newview/llnotificationhandlerutil.cpp
index de90023f3b..1b767e80d4 100644
--- a/indra/newview/llnotificationhandlerutil.cpp
+++ b/indra/newview/llnotificationhandlerutil.cpp
@@ -385,7 +385,7 @@ void LLHandlerUtil::logGroupNoticeToIMGroup(
// static
void LLHandlerUtil::logToNearbyChat(const LLNotificationPtr& notification, EChatSourceType type)
{
- LLNearbyChat* nearby_chat = LLFloaterReg::getTypedInstance<LLNearbyChat>("nearby_chat", LLSD());
+ LLNearbyChat* nearby_chat = LLNearbyChat::getInstance();
if(nearby_chat)
{
LLChat chat_msg(notification->getMessage());
diff --git a/indra/newview/llnotificationmanager.cpp b/indra/newview/llnotificationmanager.cpp
index 6988227128..6105eff8ea 100644
--- a/indra/newview/llnotificationmanager.cpp
+++ b/indra/newview/llnotificationmanager.cpp
@@ -62,6 +62,7 @@ void LLNotificationManager::init()
LLNotificationChannel::buildChannel("Offer", "Visible", LLNotificationFilters::filterBy<std::string>(&LLNotification::getType, "offer"));
LLNotificationChannel::buildChannel("Hints", "Visible", LLNotificationFilters::filterBy<std::string>(&LLNotification::getType, "hint"));
LLNotificationChannel::buildChannel("Browser", "Visible", LLNotificationFilters::filterBy<std::string>(&LLNotification::getType, "browser"));
+ LLNotificationChannel::buildChannel("Outbox", "Visible", LLNotificationFilters::filterBy<std::string>(&LLNotification::getType, "outbox"));
LLNotifications::instance().getChannel("Notifications")->connectChanged(boost::bind(&LLNotificationManager::onNotification, this, _1));
LLNotifications::instance().getChannel("NotificationTips")->connectChanged(boost::bind(&LLNotificationManager::onNotification, this, _1));
@@ -72,6 +73,7 @@ void LLNotificationManager::init()
LLNotifications::instance().getChannel("Offer")->connectChanged(boost::bind(&LLNotificationManager::onNotification, this, _1));
LLNotifications::instance().getChannel("Hints")->connectChanged(boost::bind(&LLHintHandler::processNotification, LLHintHandler::getInstance(), _1));
LLNotifications::instance().getChannel("Browser")->connectChanged(boost::bind(&LLBrowserNotification::processNotification, LLBrowserNotification::getInstance(), _1));
+ LLNotifications::instance().getChannel("Outbox")->connectChanged(boost::bind(&LLOutboxNotification::processNotification, LLOutboxNotification::getInstance(), _1));
mNotifyHandlers["notify"] = boost::shared_ptr<LLEventHandler>(new LLScriptHandler(NT_NOTIFY, LLSD()));
mNotifyHandlers["notifytip"] = boost::shared_ptr<LLEventHandler>(new LLTipHandler(NT_NOTIFY, LLSD()));
diff --git a/indra/newview/llnotificationtiphandler.cpp b/indra/newview/llnotificationtiphandler.cpp
index 02b217fc94..fb0891c4c5 100644
--- a/indra/newview/llnotificationtiphandler.cpp
+++ b/indra/newview/llnotificationtiphandler.cpp
@@ -29,6 +29,7 @@
#include "llfloaterreg.h"
#include "llnearbychat.h"
+#include "llnearbychatbar.h"
#include "llnotificationhandler.h"
#include "llnotifications.h"
#include "lltoastnotifypanel.h"
@@ -92,9 +93,9 @@ bool LLTipHandler::processNotification(const LLSD& notify)
LLHandlerUtil::logToNearbyChat(notification, CHAT_SOURCE_SYSTEM);
// don't show toast if Nearby Chat is opened
- LLNearbyChat* nearby_chat = LLFloaterReg::getTypedInstance<
- LLNearbyChat>("nearby_chat", LLSD());
- if (nearby_chat->getVisible())
+ LLNearbyChat* nearby_chat = LLNearbyChat::getInstance();
+ LLNearbyChatBar* nearby_chat_bar = LLNearbyChatBar::getInstance();
+ if (!nearby_chat_bar->isMinimized() && nearby_chat_bar->getVisible() && nearby_chat->getVisible())
{
return false;
}
diff --git a/indra/newview/lloutfitslist.cpp b/indra/newview/lloutfitslist.cpp
index 10887aa53a..1dc4d796ab 100644
--- a/indra/newview/lloutfitslist.cpp
+++ b/indra/newview/lloutfitslist.cpp
@@ -35,13 +35,13 @@
#include "llaccordionctrltab.h"
#include "llagentwearables.h"
#include "llappearancemgr.h"
+#include "llfloatersidepanelcontainer.h"
#include "llinventoryfunctions.h"
#include "llinventorymodel.h"
#include "lllistcontextmenu.h"
#include "llmenubutton.h"
#include "llnotificationsutil.h"
#include "lloutfitobserver.h"
-#include "llsidetray.h"
#include "lltoggleablemenu.h"
#include "lltransutil.h"
#include "llviewermenu.h"
@@ -327,7 +327,7 @@ protected:
static void editOutfit()
{
- LLSideTray::getInstance()->showPanel("sidepanel_appearance", LLSD().with("type", "edit_outfit"));
+ LLFloaterSidePanelContainer::showPanel("appearance", LLSD().with("type", "edit_outfit"));
}
static void renameOutfit(const LLUUID& outfit_cat_id)
diff --git a/indra/newview/lloverlaybar.cpp b/indra/newview/lloverlaybar.cpp
deleted file mode 100644
index c2bbec0470..0000000000
--- a/indra/newview/lloverlaybar.cpp
+++ /dev/null
@@ -1,378 +0,0 @@
-/**
- * @file lloverlaybar.cpp
- * @brief LLOverlayBar class implementation
- *
- * $LicenseInfo:firstyear=2002&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-// Temporary buttons that appear at the bottom of the screen when you
-// are in a mode.
-
-#include "llviewerprecompiledheaders.h"
-
-#include "lloverlaybar.h"
-
-#include "llaudioengine.h"
-#include "llrender.h"
-#include "llagent.h"
-#include "llbutton.h"
-#include "llfocusmgr.h"
-#include "llimview.h"
-#include "llmediaremotectrl.h"
-#include "llparcel.h"
-#include "lltextbox.h"
-#include "llui.h"
-#include "llviewercontrol.h"
-#include "llviewertexturelist.h"
-#include "llviewerjoystick.h"
-#include "llviewermedia.h"
-#include "llviewermenu.h" // handle_reset_view()
-#include "llviewermedia.h"
-#include "llviewerparcelmedia.h"
-#include "llviewerparcelmgr.h"
-#include "lluictrlfactory.h"
-#include "llviewerwindow.h"
-#include "llvoiceclient.h"
-#include "llvoavatarself.h"
-#include "llvoiceremotectrl.h"
-#include "llmediactrl.h"
-#include "llselectmgr.h"
-
-//
-// Globals
-//
-
-LLOverlayBar *gOverlayBar = NULL;
-
-extern S32 MENU_BAR_HEIGHT;
-
-//
-// Functions
-//
-
-
-
-void* LLOverlayBar::createMediaRemote(void* userdata)
-{
- LLOverlayBar *self = (LLOverlayBar*)userdata;
- self->mMediaRemote = new LLMediaRemoteCtrl ();
- return self->mMediaRemote;
-}
-
-void* LLOverlayBar::createVoiceRemote(void* userdata)
-{
- LLOverlayBar *self = (LLOverlayBar*)userdata;
- self->mVoiceRemote = new LLVoiceRemoteCtrl();
- return self->mVoiceRemote;
-}
-
-LLOverlayBar::LLOverlayBar()
- : LLPanel(),
- mMediaRemote(NULL),
- mVoiceRemote(NULL),
- mMusicState(STOPPED)
-{
- setMouseOpaque(FALSE);
- setIsChrome(TRUE);
-
- mBuilt = false;
-
- mFactoryMap["media_remote"] = LLCallbackMap(LLOverlayBar::createMediaRemote, this);
- mFactoryMap["voice_remote"] = LLCallbackMap(LLOverlayBar::createVoiceRemote, this);
-
- LLUICtrlFactory::getInstance()->buildPanel(this, "panel_overlaybar.xml");
-}
-
-BOOL LLOverlayBar::postBuild()
-{
- childSetAction("Set Not Busy",onClickSetNotBusy,this);
- childSetAction("Mouselook",onClickMouselook,this);
- childSetAction("Stand Up",onClickStandUp,this);
- childSetAction("Flycam",onClickFlycam,this);
- childSetVisible("chat_bar", gSavedSettings.getBOOL("ChatVisible"));
-
- mVoiceRemote->expandOrCollapse();
- mMediaRemote->expandOrCollapse();
-
- setFocusRoot(TRUE);
- mBuilt = true;
-
- layoutButtons();
- return TRUE;
-}
-
-LLOverlayBar::~LLOverlayBar()
-{
- // LLView destructor cleans up children
-}
-
-// virtual
-void LLOverlayBar::reshape(S32 width, S32 height, BOOL called_from_parent)
-{
- LLView::reshape(width, height, called_from_parent);
-
- if (mBuilt)
- {
- layoutButtons();
- }
-}
-
-void LLOverlayBar::layoutButtons()
-{
- LLView* state_buttons_panel = getChildView("state_buttons");
-
- if (state_buttons_panel->getVisible())
- {
- LLViewQuery query;
- LLWidgetTypeFilter<LLButton> widget_filter;
- query.addPreFilter(LLEnabledFilter::getInstance());
- query.addPreFilter(&widget_filter);
-
- child_list_t button_list = query(state_buttons_panel);
-
- const S32 MAX_BAR_WIDTH = 600;
- S32 bar_width = llclamp(state_buttons_panel->getRect().getWidth(), 0, MAX_BAR_WIDTH);
-
- // calculate button widths
- const S32 MAX_BUTTON_WIDTH = 150;
- const S32 STATUS_BAR_PAD = 10;
- S32 segment_width = llclamp(lltrunc((F32)(bar_width) / (F32)button_list.size()), 0, MAX_BUTTON_WIDTH);
- S32 btn_width = segment_width - STATUS_BAR_PAD;
-
- // Evenly space all buttons, starting from left
- S32 left = 0;
- S32 bottom = 1;
-
- for (child_list_reverse_iter_t child_iter = button_list.rbegin();
- child_iter != button_list.rend(); ++child_iter)
- {
- LLView *view = *child_iter;
- LLRect r = view->getRect();
- r.setOriginAndSize(left, bottom, btn_width, r.getHeight());
- view->setRect(r);
- left += segment_width;
- }
- }
-}
-
-// Per-frame updates of visibility
-void LLOverlayBar::refresh()
-{
- BOOL buttons_changed = FALSE;
-
- BOOL im_received = gIMMgr->getIMReceived();
- LLButton* button = getChild<LLButton>("IM Received");
- if (button && button->getVisible() != im_received)
- {
- button->setVisible(im_received);
- sendChildToFront(button);
- moveChildToBackOfTabGroup(button);
- buttons_changed = TRUE;
- }
-
- BOOL busy = gAgent.getBusy();
- button = getChild<LLButton>("Set Not Busy");
- if (button && button->getVisible() != busy)
- {
- button->setVisible(busy);
- sendChildToFront(button);
- moveChildToBackOfTabGroup(button);
- buttons_changed = TRUE;
- }
-
- BOOL flycam = LLViewerJoystick::getInstance()->getOverrideCamera();
- button = getChild<LLButton>("Flycam");
- if (button && button->getVisible() != flycam)
- {
- button->setVisible(flycam);
- sendChildToFront(button);
- moveChildToBackOfTabGroup(button);
- buttons_changed = TRUE;
- }
-
- BOOL mouselook_grabbed;
- mouselook_grabbed = gAgent.isControlGrabbed(CONTROL_ML_LBUTTON_DOWN_INDEX)
- || gAgent.isControlGrabbed(CONTROL_ML_LBUTTON_UP_INDEX);
- button = getChild<LLButton>("Mouselook");
-
- if (button && button->getVisible() != mouselook_grabbed)
- {
- button->setVisible(mouselook_grabbed);
- sendChildToFront(button);
- moveChildToBackOfTabGroup(button);
- buttons_changed = TRUE;
- }
-
- BOOL sitting = FALSE;
- if (gAgent.getAvatarObject())
- {
- sitting = gAgent.getAvatarObject()->isSitting();
- }
- button = getChild<LLButton>("Stand Up");
-
- if (button && button->getVisible() != sitting)
- {
- button->setVisible(sitting);
- sendChildToFront(button);
- moveChildToBackOfTabGroup(button);
- buttons_changed = TRUE;
- }
-
-
- moveChildToBackOfTabGroup(mMediaRemote);
- moveChildToBackOfTabGroup(mVoiceRemote);
-
- // turn off the whole bar in mouselook
- if (gAgent.cameraMouselook())
- {
- childSetVisible("media_remote_container", FALSE);
- childSetVisible("voice_remote_container", FALSE);
- childSetVisible("state_buttons", FALSE);
- }
- else
- {
- // update "remotes"
- childSetVisible("media_remote_container", TRUE);
- childSetVisible("voice_remote_container", LLVoiceClient::getInstance()->voiceEnabled());
- childSetVisible("state_buttons", TRUE);
- }
-
- // always let user toggle into and out of chatbar
- childSetVisible("chat_bar", gSavedSettings.getBOOL("ChatVisible"));
-
- if (buttons_changed)
- {
- layoutButtons();
- }
-}
-
-//-----------------------------------------------------------------------
-// Static functions
-//-----------------------------------------------------------------------
-
-// static
-void LLOverlayBar::onClickSetNotBusy(void*)
-{
- gAgent.clearBusy();
-}
-
-
-// static
-void LLOverlayBar::onClickFlycam(void*)
-{
- LLViewerJoystick::getInstance()->toggleFlycam();
-}
-
-// static
-void LLOverlayBar::onClickResetView(void* data)
-{
- handle_reset_view();
-}
-
-//static
-void LLOverlayBar::onClickMouselook(void*)
-{
- gAgent.changeCameraToMouselook();
-}
-
-//static
-void LLOverlayBar::onClickStandUp(void*)
-{
- LLSelectMgr::getInstance()->deselectAllForStandingUp();
- gAgent.setControlFlags(AGENT_CONTROL_STAND_UP);
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// static media helpers
-// *TODO: Move this into an audio manager abstraction
-//static
-void LLOverlayBar::mediaStop(void*)
-{
- if (!gOverlayBar)
- {
- // return;
- }
- LLViewerParcelMedia::stop();
-}
-//static
-void LLOverlayBar::toggleMediaPlay(void*)
-{
- if (!gOverlayBar)
- {
- // return;
- }
-
-
- if (LLViewerParcelMedia::getStatus() == LLViewerMediaImpl::MEDIA_PAUSED)
- {
- LLViewerParcelMedia::start();
- }
- else if(LLViewerParcelMedia::getStatus() == LLViewerMediaImpl::MEDIA_PLAYING)
- {
- LLViewerParcelMedia::pause();
- }
- else
- {
- LLParcel* parcel = LLViewerParcelMgr::getInstance()->getAgentParcel();
- if (parcel)
- {
- LLViewerParcelMedia::play(parcel);
- }
- }
-}
-
-//static
-void LLOverlayBar::toggleMusicPlay(void*)
-{
- if (gAudiop->isInternetStreamPlaying() != 1)
- {
- if (gAudiop)
- {
- LLParcel* parcel = LLViewerParcelMgr::getInstance()->getAgentParcel();
- if ( parcel )
- {
- // this doesn't work properly when crossing parcel boundaries - even when the
- // stream is stopped, it doesn't return the right thing - commenting out for now.
- // if ( gAudiop->isInternetStreamPlaying() == 0 )
- {
- gAudiop->startInternetStream(parcel->getMusicURL());
- }
- }
- }
- }
- //else
- //{
- // gOverlayBar->mMusicState = PAUSED; // desired state
- // if (gAudiop)
- // {
- // gAudiop->pauseInternetStream(1);
- // }
- //}
- else
- {
- if (gAudiop)
- {
- gAudiop->stopInternetStream();
- }
- }
-}
-
diff --git a/indra/newview/lloverlaybar.h b/indra/newview/lloverlaybar.h
deleted file mode 100644
index b36f5ebb73..0000000000
--- a/indra/newview/lloverlaybar.h
+++ /dev/null
@@ -1,95 +0,0 @@
-/**
- * @file lloverlaybar.h
- * @brief LLOverlayBar class definition
- *
- * $LicenseInfo:firstyear=2002&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-#ifndef LL_LLOVERLAYBAR_H
-#define LL_LLOVERLAYBAR_H
-
-#include "llpanel.h"
-
-// "Constants" loaded from settings.xml at start time
-extern S32 STATUS_BAR_HEIGHT;
-
-class LLButton;
-class LLLineEditor;
-class LLMediaRemoteCtrl;
-class LLMessageSystem;
-class LLTextBox;
-class LLTextEditor;
-class LLUICtrl;
-class LLUUID;
-class LLFrameTimer;
-class LLStatGraph;
-class LLSlider;
-class LLVoiceRemoteCtrl;
-
-class LLOverlayBar
-: public LLPanel
-{
-public:
- LLOverlayBar();
- ~LLOverlayBar();
-
- /*virtual*/ void refresh();
- /*virtual*/ void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE);
- /*virtual*/ BOOL postBuild();
-
- void layoutButtons();
-
- // helpers for returning desired state
- BOOL musicPlaying() { return mMusicState == PLAYING; }
-
- static void onClickSetNotBusy(void* data);
- static void onClickMouselook(void* data);
- static void onClickStandUp(void* data);
- static void onClickResetView(void* data);
- static void onClickFlycam(void* data);
-
- //static media helper functions
- static void toggleMediaPlay(void*);
- static void toggleMusicPlay(void*);
- static void musicPause(void*);
- static void musicStop(void*);
- static void mediaStop(void*);
-
- static void toggleAudioVolumeFloater(void*);
-
-protected:
- static void* createMediaRemote(void* userdata);
- static void* createVoiceRemote(void* userdata);
-
- void enableMediaButtons();
-
-protected:
- LLMediaRemoteCtrl* mMediaRemote;
- LLVoiceRemoteCtrl* mVoiceRemote;
- bool mBuilt; // dialog constructed yet?
- enum { STOPPED=0, PLAYING=1, PAUSED=2 };
- S32 mMusicState;
-};
-
-extern LLOverlayBar* gOverlayBar;
-
-#endif
diff --git a/indra/newview/llpanelavatar.cpp b/indra/newview/llpanelavatar.cpp
index 988e801b61..679b1bdcda 100644
--- a/indra/newview/llpanelavatar.cpp
+++ b/indra/newview/llpanelavatar.cpp
@@ -120,269 +120,6 @@ BOOL LLDropTarget::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
static LLDefaultChildRegistry::Register<LLDropTarget> r("drop_target");
-static LLRegisterPanelClassWrapper<LLPanelAvatarProfile> t_panel_profile("panel_profile");
-static LLRegisterPanelClassWrapper<LLPanelMyProfile> t_panel_my_profile("panel_my_profile");
-static LLRegisterPanelClassWrapper<LLPanelAvatarNotes> t_panel_notes("panel_notes");
-
-//-----------------------------------------------------------------------------
-// LLPanelAvatarNotes()
-//-----------------------------------------------------------------------------
-LLPanelAvatarNotes::LLPanelAvatarNotes()
-: LLPanelProfileTab()
-{
-
-}
-
-void LLPanelAvatarNotes::updateData()
-{
- LLAvatarPropertiesProcessor::getInstance()->
- sendAvatarNotesRequest(getAvatarId());
-}
-
-BOOL LLPanelAvatarNotes::postBuild()
-{
- childSetCommitCallback("status_check", boost::bind(&LLPanelAvatarNotes::onCommitRights, this), NULL);
- childSetCommitCallback("map_check", boost::bind(&LLPanelAvatarNotes::onCommitRights, this), NULL);
- childSetCommitCallback("objects_check", boost::bind(&LLPanelAvatarNotes::onCommitRights, this), NULL);
-
- childSetCommitCallback("add_friend", boost::bind(&LLPanelAvatarNotes::onAddFriendButtonClick, this),NULL);
- childSetCommitCallback("im", boost::bind(&LLPanelAvatarNotes::onIMButtonClick, this), NULL);
- childSetCommitCallback("call", boost::bind(&LLPanelAvatarNotes::onCallButtonClick, this), NULL);
- childSetCommitCallback("teleport", boost::bind(&LLPanelAvatarNotes::onTeleportButtonClick, this), NULL);
- childSetCommitCallback("share", boost::bind(&LLPanelAvatarNotes::onShareButtonClick, this), NULL);
- childSetCommitCallback("show_on_map_btn", (boost::bind(
- &LLPanelAvatarNotes::onMapButtonClick, this)), NULL);
-
- LLTextEditor* te = getChild<LLTextEditor>("notes_edit");
- te->setCommitCallback(boost::bind(&LLPanelAvatarNotes::onCommitNotes,this));
- te->setCommitOnFocusLost(TRUE);
-
- resetControls();
- resetData();
-
- LLVoiceClient::getInstance()->addObserver((LLVoiceClientStatusObserver*)this);
-
- return TRUE;
-}
-
-void LLPanelAvatarNotes::onOpen(const LLSD& key)
-{
- LLPanelProfileTab::onOpen(key);
-
- fillRightsData();
-
- //Disable "Add Friend" button for friends.
- getChildView("add_friend")->setEnabled(!LLAvatarActions::isFriend(getAvatarId()));
-}
-
-void LLPanelAvatarNotes::fillRightsData()
-{
- getChild<LLUICtrl>("status_check")->setValue(FALSE);
- getChild<LLUICtrl>("map_check")->setValue(FALSE);
- getChild<LLUICtrl>("objects_check")->setValue(FALSE);
-
- const LLRelationship* relation = LLAvatarTracker::instance().getBuddyInfo(getAvatarId());
- // If true - we are viewing friend's profile, enable check boxes and set values.
- if(relation)
- {
- S32 rights = relation->getRightsGrantedTo();
-
- getChild<LLUICtrl>("status_check")->setValue(LLRelationship::GRANT_ONLINE_STATUS & rights ? TRUE : FALSE);
- getChild<LLUICtrl>("map_check")->setValue(LLRelationship::GRANT_MAP_LOCATION & rights ? TRUE : FALSE);
- getChild<LLUICtrl>("objects_check")->setValue(LLRelationship::GRANT_MODIFY_OBJECTS & rights ? TRUE : FALSE);
-
- }
-
- enableCheckboxes(NULL != relation);
-}
-
-void LLPanelAvatarNotes::onCommitNotes()
-{
- std::string notes = getChild<LLUICtrl>("notes_edit")->getValue().asString();
- LLAvatarPropertiesProcessor::getInstance()-> sendNotes(getAvatarId(),notes);
-}
-
-void LLPanelAvatarNotes::rightsConfirmationCallback(const LLSD& notification,
- const LLSD& response, S32 rights)
-{
- S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
- if (option == 0)
- {
- LLAvatarPropertiesProcessor::getInstance()->sendFriendRights(
- getAvatarId(), rights);
- }
- else
- {
- getChild<LLUICtrl>("objects_check")->setValue(
- getChild<LLUICtrl>("objects_check")->getValue().asBoolean() ? FALSE : TRUE);
- }
-}
-
-void LLPanelAvatarNotes::confirmModifyRights(bool grant, S32 rights)
-{
- LLSD args;
- args["NAME"] = LLSLURL("agent", getAvatarId(), "displayname").getSLURLString();
-
- if (grant)
- {
- LLNotificationsUtil::add("GrantModifyRights", args, LLSD(),
- boost::bind(&LLPanelAvatarNotes::rightsConfirmationCallback, this,
- _1, _2, rights));
- }
- else
- {
- LLNotificationsUtil::add("RevokeModifyRights", args, LLSD(),
- boost::bind(&LLPanelAvatarNotes::rightsConfirmationCallback, this,
- _1, _2, 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(getChild<LLUICtrl>("status_check")->getValue().asBoolean())
- rights |= LLRelationship::GRANT_ONLINE_STATUS;
- if(getChild<LLUICtrl>("map_check")->getValue().asBoolean())
- rights |= LLRelationship::GRANT_MAP_LOCATION;
- if(getChild<LLUICtrl>("objects_check")->getValue().asBoolean())
- rights |= LLRelationship::GRANT_MODIFY_OBJECTS;
-
- bool allow_modify_objects = getChild<LLUICtrl>("objects_check")->getValue().asBoolean();
-
- // if modify objects checkbox clicked
- if (buddy_relationship->isRightGrantedTo(
- LLRelationship::GRANT_MODIFY_OBJECTS) != allow_modify_objects)
- {
- confirmModifyRights(allow_modify_objects, rights);
- }
- // only one checkbox can trigger commit, so store the rest of rights
- else
- {
- LLAvatarPropertiesProcessor::getInstance()->sendFriendRights(
- getAvatarId(), rights);
- }
-}
-
-void LLPanelAvatarNotes::processProperties(void* data, EAvatarProcessorType type)
-{
- if(APT_NOTES == type)
- {
- LLAvatarNotes* avatar_notes = static_cast<LLAvatarNotes*>(data);
- if(avatar_notes && getAvatarId() == avatar_notes->target_id)
- {
- getChild<LLUICtrl>("notes_edit")->setValue(avatar_notes->notes);
- getChildView("notes edit")->setEnabled(true);
-
- LLAvatarPropertiesProcessor::getInstance()->removeObserver(getAvatarId(),this);
- }
- }
-}
-
-void LLPanelAvatarNotes::resetData()
-{
- getChild<LLUICtrl>("notes_edit")->setValue(LLStringUtil::null);
- // Default value is TRUE
- getChild<LLUICtrl>("status_check")->setValue(TRUE);
-}
-
-void LLPanelAvatarNotes::resetControls()
-{
- //Disable "Add Friend" button for friends.
- getChildView("add_friend")->setEnabled(TRUE);
-
- enableCheckboxes(false);
-}
-
-void LLPanelAvatarNotes::onAddFriendButtonClick()
-{
- LLAvatarActions::requestFriendshipDialog(getAvatarId());
-}
-
-void LLPanelAvatarNotes::onIMButtonClick()
-{
- LLAvatarActions::startIM(getAvatarId());
-}
-
-void LLPanelAvatarNotes::onTeleportButtonClick()
-{
- LLAvatarActions::offerTeleport(getAvatarId());
-}
-
-void LLPanelAvatarNotes::onCallButtonClick()
-{
- LLAvatarActions::startCall(getAvatarId());
-}
-
-void LLPanelAvatarNotes::onShareButtonClick()
-{
- //*TODO not implemented.
-}
-
-void LLPanelAvatarNotes::enableCheckboxes(bool enable)
-{
- getChildView("status_check")->setEnabled(enable);
- getChildView("map_check")->setEnabled(enable);
- getChildView("objects_check")->setEnabled(enable);
-}
-
-LLPanelAvatarNotes::~LLPanelAvatarNotes()
-{
- if(getAvatarId().notNull())
- {
- LLAvatarTracker::instance().removeParticularFriendObserver(getAvatarId(), this);
- }
-
- if(LLVoiceClient::instanceExists())
- {
- LLVoiceClient::getInstance()->removeObserver((LLVoiceClientStatusObserver*)this);
- }
-}
-
-// virtual, called by LLAvatarTracker
-void LLPanelAvatarNotes::changed(U32 mask)
-{
- getChildView("teleport")->setEnabled(LLAvatarTracker::instance().isBuddyOnline(getAvatarId()));
-
- // update rights to avoid have checkboxes enabled when friendship is terminated. EXT-4947.
- fillRightsData();
-}
-
-// virtual
-void LLPanelAvatarNotes::onChange(EStatusType status, const std::string &channelURI, bool proximal)
-{
- if(status == STATUS_JOINING || status == STATUS_LEFT_CHANNEL)
- {
- return;
- }
-
- getChildView("call")->setEnabled(LLVoiceClient::getInstance()->voiceEnabled() && LLVoiceClient::getInstance()->isVoiceWorking());
-}
-
-void LLPanelAvatarNotes::setAvatarId(const LLUUID& id)
-{
- if(id.notNull())
- {
- if(getAvatarId().notNull())
- {
- LLAvatarTracker::instance().removeParticularFriendObserver(getAvatarId(), this);
- }
- LLPanelProfileTab::setAvatarId(id);
- LLAvatarTracker::instance().addParticularFriendObserver(getAvatarId(), this);
- }
-}
-
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
@@ -461,449 +198,3 @@ void LLPanelProfileTab::updateButtons()
|| gAgent.isGodlike();
getChildView("show_on_map_btn")->setEnabled(enable_map_btn);
}
-
-//////////////////////////////////////////////////////////////////////////
-//////////////////////////////////////////////////////////////////////////
-//////////////////////////////////////////////////////////////////////////
-
-bool enable_god()
-{
- return gAgent.isGodlike();
-}
-
-LLPanelAvatarProfile::LLPanelAvatarProfile()
-: LLPanelProfileTab()
-{
-}
-
-BOOL LLPanelAvatarProfile::postBuild()
-{
- childSetCommitCallback("see_profile_btn",(boost::bind(&LLPanelAvatarProfile::onSeeProfileBtnClick,this)),NULL);
- childSetCommitCallback("add_friend",(boost::bind(&LLPanelAvatarProfile::onAddFriendButtonClick,this)),NULL);
- childSetCommitCallback("im",(boost::bind(&LLPanelAvatarProfile::onIMButtonClick,this)),NULL);
- childSetCommitCallback("call",(boost::bind(&LLPanelAvatarProfile::onCallButtonClick,this)),NULL);
- childSetCommitCallback("teleport",(boost::bind(&LLPanelAvatarProfile::onTeleportButtonClick,this)),NULL);
- childSetCommitCallback("share",(boost::bind(&LLPanelAvatarProfile::onShareButtonClick,this)),NULL);
- childSetCommitCallback("show_on_map_btn", (boost::bind(
- &LLPanelAvatarProfile::onMapButtonClick, this)), NULL);
-
- LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar;
- registrar.add("Profile.ShowOnMap", boost::bind(&LLPanelAvatarProfile::onMapButtonClick, this));
- registrar.add("Profile.Pay", boost::bind(&LLPanelAvatarProfile::pay, this));
- registrar.add("Profile.Share", boost::bind(&LLPanelAvatarProfile::share, this));
- registrar.add("Profile.BlockUnblock", boost::bind(&LLPanelAvatarProfile::toggleBlock, this));
- registrar.add("Profile.Kick", boost::bind(&LLPanelAvatarProfile::kick, this));
- registrar.add("Profile.Freeze", boost::bind(&LLPanelAvatarProfile::freeze, this));
- registrar.add("Profile.Unfreeze", boost::bind(&LLPanelAvatarProfile::unfreeze, this));
- registrar.add("Profile.CSR", boost::bind(&LLPanelAvatarProfile::csr, this));
-
- LLUICtrl::EnableCallbackRegistry::ScopedRegistrar enable;
- enable.add("Profile.EnableShowOnMap", boost::bind(&LLPanelAvatarProfile::enableShowOnMap, this));
- enable.add("Profile.EnableGod", boost::bind(&enable_god));
- enable.add("Profile.EnableBlock", boost::bind(&LLPanelAvatarProfile::enableBlock, this));
- enable.add("Profile.EnableUnblock", boost::bind(&LLPanelAvatarProfile::enableUnblock, this));
-
- LLToggleableMenu* profile_menu = LLUICtrlFactory::getInstance()->createFromFile<LLToggleableMenu>("menu_profile_overflow.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
- getChild<LLMenuButton>("overflow_btn")->setMenu(profile_menu, LLMenuButton::MP_TOP_RIGHT);
-
- LLVoiceClient::getInstance()->addObserver((LLVoiceClientStatusObserver*)this);
-
- resetControls();
- resetData();
-
- return TRUE;
-}
-
-void LLPanelAvatarProfile::onOpen(const LLSD& key)
-{
- LLPanelProfileTab::onOpen(key);
-
- mGroups.clear();
-
- //Disable "Add Friend" button for friends.
- getChildView("add_friend")->setEnabled(!LLAvatarActions::isFriend(getAvatarId()));
-}
-
-void LLPanelAvatarProfile::updateData()
-{
- if (getAvatarId().notNull())
- {
- LLAvatarPropertiesProcessor::getInstance()->
- sendAvatarPropertiesRequest(getAvatarId());
- LLAvatarPropertiesProcessor::getInstance()->
- sendAvatarGroupsRequest(getAvatarId());
- }
-}
-
-void LLPanelAvatarProfile::resetControls()
-{
- getChildView("status_panel")->setVisible( true);
- getChildView("profile_buttons_panel")->setVisible( true);
- getChildView("title_groups_text")->setVisible( true);
- getChildView("sl_groups")->setVisible( true);
- getChildView("add_friend")->setEnabled(true);
-
- getChildView("status_me_panel")->setVisible( false);
- getChildView("profile_me_buttons_panel")->setVisible( false);
- getChildView("account_actions_panel")->setVisible( false);
-}
-
-void LLPanelAvatarProfile::resetData()
-{
- mGroups.clear();
- getChild<LLUICtrl>("2nd_life_pic")->setValue(LLUUID::null);
- getChild<LLUICtrl>("real_world_pic")->setValue(LLUUID::null);
- getChild<LLUICtrl>("online_status")->setValue(LLStringUtil::null);
- getChild<LLUICtrl>("status_message")->setValue(LLStringUtil::null);
- getChild<LLUICtrl>("sl_description_edit")->setValue(LLStringUtil::null);
- getChild<LLUICtrl>("fl_description_edit")->setValue(LLStringUtil::null);
- getChild<LLUICtrl>("sl_groups")->setValue(LLStringUtil::null);
- getChild<LLUICtrl>("homepage_edit")->setValue(LLStringUtil::null);
- getChild<LLUICtrl>("register_date")->setValue(LLStringUtil::null);
- getChild<LLUICtrl>("acc_status_text")->setValue(LLStringUtil::null);
- getChild<LLUICtrl>("partner_text")->setValue(LLStringUtil::null);
-}
-
-void LLPanelAvatarProfile::processProperties(void* data, EAvatarProcessorType type)
-{
- if(APT_PROPERTIES == type)
- {
- const LLAvatarData* avatar_data = static_cast<const LLAvatarData*>(data);
- if(avatar_data && getAvatarId() == avatar_data->avatar_id)
- {
- processProfileProperties(avatar_data);
- }
- }
- else if(APT_GROUPS == type)
- {
- LLAvatarGroups* avatar_groups = static_cast<LLAvatarGroups*>(data);
- if(avatar_groups && getAvatarId() == avatar_groups->avatar_id)
- {
- processGroupProperties(avatar_groups);
- }
- }
-}
-
-void LLPanelAvatarProfile::processProfileProperties(const LLAvatarData* avatar_data)
-{
- fillCommonData(avatar_data);
-
- fillPartnerData(avatar_data);
-
- fillAccountStatus(avatar_data);
-}
-
-void LLPanelAvatarProfile::processGroupProperties(const LLAvatarGroups* avatar_groups)
-{
- // *NOTE dzaporozhan
- // Group properties may arrive in two callbacks, we need to save them across
- // different calls. We can't do that in textbox as textbox may change the text.
-
- LLAvatarGroups::group_list_t::const_iterator it = avatar_groups->group_list.begin();
- const LLAvatarGroups::group_list_t::const_iterator it_end = avatar_groups->group_list.end();
-
- for(; it_end != it; ++it)
- {
- LLAvatarGroups::LLGroupData group_data = *it;
- mGroups[group_data.group_name] = group_data.group_id;
- }
-
- // Creating string, containing group list
- std::string groups = "";
- for (group_map_t::iterator it = mGroups.begin(); it != mGroups.end(); ++it)
- {
- if (it != mGroups.begin())
- groups += ", ";
-
- std::string group_name = LLURI::escape(it->first);
- std::string group_url= it->second.notNull()
- ? "[secondlife:///app/group/" + it->second.asString() + "/about " + group_name + "]"
- : getString("no_group_text");
-
- groups += group_url;
- }
-
- getChild<LLUICtrl>("sl_groups")->setValue(groups);
-}
-
-static void got_full_name_callback( LLHandle<LLPanel> profile_panel_handle, const std::string& full_name )
-{
- if (profile_panel_handle.isDead() ) return;
-
- LLPanelAvatarProfile* profile_panel = dynamic_cast<LLPanelAvatarProfile*>(profile_panel_handle.get());
- if ( ! profile_panel ) return;
-
- LLStringUtil::format_map_t args;
-
- std::string name;
- if (LLAvatarNameCache::useDisplayNames())
- {
- name = LLCacheName::buildUsername(full_name);
- }
- else
- {
- name = full_name;
- }
-
- args["[NAME]"] = name;
-
- std::string linden_name = profile_panel->getString("name_text_args", args);
- profile_panel->getChild<LLUICtrl>("name_descr_text")->setValue(linden_name);
-}
-
-void LLPanelAvatarProfile::onNameCache(const LLUUID& agent_id, const LLAvatarName& av_name)
-{
- LLStringUtil::format_map_t args;
- args["[DISPLAY_NAME]"] = av_name.mDisplayName;
-
- std::string display_name = getString("display_name_text_args", args);
- getChild<LLUICtrl>("display_name_descr_text")->setValue(display_name);
-}
-
-void LLPanelAvatarProfile::fillCommonData(const LLAvatarData* avatar_data)
-{
- //remove avatar id from cache to get fresh info
- LLAvatarIconIDCache::getInstance()->remove(avatar_data->avatar_id);
-
- LLStringUtil::format_map_t args;
- {
- std::string birth_date = LLTrans::getString("AvatarBirthDateFormat");
- LLStringUtil::format(birth_date, LLSD().with("datetime", (S32) avatar_data->born_on.secondsSinceEpoch()));
- args["[REG_DATE]"] = birth_date;
- }
-
- // ask (asynchronously) for the avatar name
- LLHandle<LLPanel> profile_panel_handle = getHandle();
- std::string full_name;
- if (gCacheName->getFullName(avatar_data->agent_id, full_name))
- {
- // name in cache, call callback directly
- got_full_name_callback( profile_panel_handle, full_name );
- }
- else
- {
- // not in cache, lookup name
- gCacheName->get(avatar_data->agent_id, false, boost::bind( got_full_name_callback, profile_panel_handle, _2 ));
- }
-
- // get display name
- LLAvatarNameCache::get(avatar_data->avatar_id,
- boost::bind(&LLPanelAvatarProfile::onNameCache, this, _1, _2));
-
- args["[AGE]"] = LLDateUtil::ageFromDate( avatar_data->born_on, LLDate::now());
- std::string register_date = getString("RegisterDateFormat", args);
- getChild<LLUICtrl>("register_date")->setValue(register_date );
- getChild<LLUICtrl>("sl_description_edit")->setValue(avatar_data->about_text);
- getChild<LLUICtrl>("fl_description_edit")->setValue(avatar_data->fl_about_text);
- getChild<LLUICtrl>("2nd_life_pic")->setValue(avatar_data->image_id);
- getChild<LLUICtrl>("real_world_pic")->setValue(avatar_data->fl_image_id);
- getChild<LLUICtrl>("homepage_edit")->setValue(avatar_data->profile_url);
-
- // Hide home page textbox if no page was set to fix "homepage URL appears clickable without URL - EXT-4734"
- getChildView("homepage_edit")->setVisible( !avatar_data->profile_url.empty());
-}
-
-void LLPanelAvatarProfile::fillPartnerData(const LLAvatarData* avatar_data)
-{
- LLTextBox* partner_text = getChild<LLTextBox>("partner_text");
- if (avatar_data->partner_id.notNull())
- {
- partner_text->setText(LLSLURL("agent", avatar_data->partner_id, "inspect").getSLURLString());
- }
- else
- {
- partner_text->setText(getString("no_partner_text"));
- }
-}
-
-void LLPanelAvatarProfile::fillAccountStatus(const LLAvatarData* avatar_data)
-{
- LLStringUtil::format_map_t args;
- args["[ACCTTYPE]"] = LLAvatarPropertiesProcessor::accountType(avatar_data);
- args["[PAYMENTINFO]"] = LLAvatarPropertiesProcessor::paymentInfo(avatar_data);
- // *NOTE: AVATAR_AGEVERIFIED not currently getting set in
- // dataserver/lldataavatar.cpp for privacy considerations
- args["[AGEVERIFICATION]"] = "";
- std::string caption_text = getString("CaptionTextAcctInfo", args);
- getChild<LLUICtrl>("acc_status_text")->setValue(caption_text);
-}
-
-void LLPanelAvatarProfile::pay()
-{
- LLAvatarActions::pay(getAvatarId());
-}
-
-void LLPanelAvatarProfile::share()
-{
- LLAvatarActions::share(getAvatarId());
-}
-
-void LLPanelAvatarProfile::toggleBlock()
-{
- LLAvatarActions::toggleBlock(getAvatarId());
-}
-
-bool LLPanelAvatarProfile::enableShowOnMap()
-{
- bool is_buddy_online = LLAvatarTracker::instance().isBuddyOnline(getAvatarId());
-
- bool enable_map_btn = (is_buddy_online && is_agent_mappable(getAvatarId()))
- || gAgent.isGodlike();
- return enable_map_btn;
-}
-
-bool LLPanelAvatarProfile::enableBlock()
-{
- return LLAvatarActions::canBlock(getAvatarId()) && !LLAvatarActions::isBlocked(getAvatarId());
-}
-
-bool LLPanelAvatarProfile::enableUnblock()
-{
- return LLAvatarActions::isBlocked(getAvatarId());
-}
-
-void LLPanelAvatarProfile::kick()
-{
- LLAvatarActions::kick(getAvatarId());
-}
-
-void LLPanelAvatarProfile::freeze()
-{
- LLAvatarActions::freeze(getAvatarId());
-}
-
-void LLPanelAvatarProfile::unfreeze()
-{
- LLAvatarActions::unfreeze(getAvatarId());
-}
-
-void LLPanelAvatarProfile::csr()
-{
- std::string name;
- gCacheName->getFullName(getAvatarId(), name);
- LLAvatarActions::csr(getAvatarId(), name);
-}
-
-void LLPanelAvatarProfile::onAddFriendButtonClick()
-{
- LLAvatarActions::requestFriendshipDialog(getAvatarId());
-}
-
-void LLPanelAvatarProfile::onSeeProfileBtnClick()
-{
- LLAvatarActions::showProfile(getAvatarId());
-}
-
-void LLPanelAvatarProfile::onIMButtonClick()
-{
- LLAvatarActions::startIM(getAvatarId());
-}
-
-void LLPanelAvatarProfile::onTeleportButtonClick()
-{
- LLAvatarActions::offerTeleport(getAvatarId());
-}
-
-void LLPanelAvatarProfile::onCallButtonClick()
-{
- LLAvatarActions::startCall(getAvatarId());
-}
-
-void LLPanelAvatarProfile::onShareButtonClick()
-{
- //*TODO not implemented
-}
-
-LLPanelAvatarProfile::~LLPanelAvatarProfile()
-{
- if(getAvatarId().notNull())
- {
- LLAvatarTracker::instance().removeParticularFriendObserver(getAvatarId(), this);
- }
-
- if(LLVoiceClient::instanceExists())
- {
- LLVoiceClient::getInstance()->removeObserver((LLVoiceClientStatusObserver*)this);
- }
-}
-
-// virtual, called by LLAvatarTracker
-void LLPanelAvatarProfile::changed(U32 mask)
-{
- getChildView("teleport")->setEnabled(LLAvatarTracker::instance().isBuddyOnline(getAvatarId()));
-}
-
-// virtual
-void LLPanelAvatarProfile::onChange(EStatusType status, const std::string &channelURI, bool proximal)
-{
- if(status == STATUS_JOINING || status == STATUS_LEFT_CHANNEL)
- {
- return;
- }
-
- getChildView("call")->setEnabled(LLVoiceClient::getInstance()->voiceEnabled() && LLVoiceClient::getInstance()->isVoiceWorking());
-}
-
-void LLPanelAvatarProfile::setAvatarId(const LLUUID& id)
-{
- if(id.notNull())
- {
- if(getAvatarId().notNull())
- {
- LLAvatarTracker::instance().removeParticularFriendObserver(getAvatarId(), this);
- }
- LLPanelProfileTab::setAvatarId(id);
- LLAvatarTracker::instance().addParticularFriendObserver(getAvatarId(), this);
- }
-}
-
-//////////////////////////////////////////////////////////////////////////
-//////////////////////////////////////////////////////////////////////////
-//////////////////////////////////////////////////////////////////////////
-
-LLPanelMyProfile::LLPanelMyProfile()
-: LLPanelAvatarProfile()
-{
-}
-
-BOOL LLPanelMyProfile::postBuild()
-{
- LLPanelAvatarProfile::postBuild();
-
- childSetCommitCallback("status_me_message_text", boost::bind(&LLPanelMyProfile::onStatusMessageChanged, this), NULL);
-
- resetControls();
- resetData();
-
- return TRUE;
-}
-
-void LLPanelMyProfile::onOpen(const LLSD& key)
-{
- LLPanelProfileTab::onOpen(key);
-}
-
-void LLPanelMyProfile::processProfileProperties(const LLAvatarData* avatar_data)
-{
- fillCommonData(avatar_data);
-
- fillPartnerData(avatar_data);
-
- fillAccountStatus(avatar_data);
-}
-
-void LLPanelMyProfile::resetControls()
-{
- getChildView("status_panel")->setVisible( false);
- getChildView("profile_buttons_panel")->setVisible( false);
- getChildView("title_groups_text")->setVisible( false);
- getChildView("sl_groups")->setVisible( false);
- getChildView("status_me_panel")->setVisible( true);
- getChildView("profile_me_buttons_panel")->setVisible( true);
-}
-
-
-void LLPanelMyProfile::onStatusMessageChanged()
-{
- updateData();
-}
diff --git a/indra/newview/llpanelavatar.h b/indra/newview/llpanelavatar.h
index e95441cd58..e33a850cfa 100644
--- a/indra/newview/llpanelavatar.h
+++ b/indra/newview/llpanelavatar.h
@@ -36,14 +36,8 @@
class LLComboBox;
class LLLineEditor;
-enum EOnlineStatus
-{
- ONLINE_STATUS_NO = 0,
- ONLINE_STATUS_YES = 1
-};
-
/**
-* Base class for any Profile View or My Profile Panel.
+* Base class for any Profile View.
*/
class LLPanelProfileTab
: public LLPanel
@@ -111,187 +105,4 @@ private:
LLUUID mAvatarId;
};
-/**
-* Panel for displaying Avatar's first and second life related info.
-*/
-class LLPanelAvatarProfile
- : public LLPanelProfileTab
- , public LLFriendObserver
- , public LLVoiceClientStatusObserver
-{
-public:
- LLPanelAvatarProfile();
- /*virtual*/ ~LLPanelAvatarProfile();
-
- /*virtual*/ void onOpen(const LLSD& key);
-
- /**
- * LLFriendObserver trigger
- */
- virtual void changed(U32 mask);
-
- // Implements LLVoiceClientStatusObserver::onChange() to enable the call
- // button when voice is available
- /*virtual*/ void onChange(EStatusType status, const std::string &channelURI, bool proximal);
-
- /*virtual*/ void setAvatarId(const LLUUID& id);
-
- /**
- * Processes data received from server.
- */
- /*virtual*/ void processProperties(void* data, EAvatarProcessorType type);
-
- /*virtual*/ BOOL postBuild();
-
- /*virtual*/ void updateData();
-
- /*virtual*/ void resetControls();
-
- /*virtual*/ void resetData();
-
-protected:
-
- /**
- * Process profile related data received from server.
- */
- virtual void processProfileProperties(const LLAvatarData* avatar_data);
-
- /**
- * Processes group related data received from server.
- */
- virtual void processGroupProperties(const LLAvatarGroups* avatar_groups);
-
- /**
- * Fills common for Avatar profile and My Profile fields.
- */
- virtual void fillCommonData(const LLAvatarData* avatar_data);
-
- /**
- * Fills partner data.
- */
- virtual void fillPartnerData(const LLAvatarData* avatar_data);
-
- /**
- * Fills account status.
- */
- virtual void fillAccountStatus(const LLAvatarData* avatar_data);
-
- /**
- * Opens "Pay Resident" dialog.
- */
- void pay();
-
- /**
- * opens inventory and IM for sharing items
- */
- void share();
-
- /**
- * Add/remove resident to/from your block list.
- */
- void toggleBlock();
-
- void kick();
- void freeze();
- void unfreeze();
- void csr();
-
- bool enableShowOnMap();
- bool enableBlock();
- bool enableUnblock();
- bool enableGod();
-
- void onSeeProfileBtnClick();
- void onAddFriendButtonClick();
- void onIMButtonClick();
- void onCallButtonClick();
- void onTeleportButtonClick();
- void onShareButtonClick();
-
-private:
- void onNameCache(const LLUUID& agent_id, const LLAvatarName& av_name);
-
- typedef std::map< std::string,LLUUID> group_map_t;
- group_map_t mGroups;
-};
-
-/**
- * Panel for displaying own first and second life related info.
- */
-class LLPanelMyProfile
- : public LLPanelAvatarProfile
-{
-public:
- LLPanelMyProfile();
-
- /*virtual*/ BOOL postBuild();
-
-protected:
-
- /*virtual*/ void onOpen(const LLSD& key);
-
- /*virtual*/ void processProfileProperties(const LLAvatarData* avatar_data);
-
- /*virtual*/ void resetControls();
-
-protected:
- void onStatusMessageChanged();
-};
-
-/**
- * Panel for displaying Avatar's notes and modifying friend's rights.
- */
-class LLPanelAvatarNotes
- : public LLPanelProfileTab
- , public LLFriendObserver
- , public LLVoiceClientStatusObserver
-{
-public:
- LLPanelAvatarNotes();
- /*virtual*/ ~LLPanelAvatarNotes();
-
- virtual void setAvatarId(const LLUUID& id);
-
- /**
- * LLFriendObserver trigger
- */
- virtual void changed(U32 mask);
-
- // Implements LLVoiceClientStatusObserver::onChange() to enable the call
- // button when voice is available
- /*virtual*/ void onChange(EStatusType status, const std::string &channelURI, bool proximal);
-
- /*virtual*/ void onOpen(const LLSD& key);
-
- /*virtual*/ BOOL postBuild();
-
- /*virtual*/ void processProperties(void* data, EAvatarProcessorType type);
-
- /*virtual*/ void updateData();
-
-protected:
-
- /*virtual*/ void resetControls();
-
- /*virtual*/ void resetData();
-
- /**
- * Fills rights data for friends.
- */
- void fillRightsData();
-
- void rightsConfirmationCallback(const LLSD& notification,
- const LLSD& response, S32 rights);
- void confirmModifyRights(bool grant, S32 rights);
- void onCommitRights();
- void onCommitNotes();
-
- void onAddFriendButtonClick();
- void onIMButtonClick();
- void onCallButtonClick();
- void onTeleportButtonClick();
- void onShareButtonClick();
- void enableCheckboxes(bool enable);
-};
-
#endif // LL_LLPANELAVATAR_H
diff --git a/indra/newview/llpanelblockedlist.cpp b/indra/newview/llpanelblockedlist.cpp
index 81e199d85b..5c85ec438c 100644
--- a/indra/newview/llpanelblockedlist.cpp
+++ b/indra/newview/llpanelblockedlist.cpp
@@ -37,7 +37,7 @@
// project include
#include "llfloateravatarpicker.h"
-#include "llsidetray.h"
+#include "llfloatersidepanelcontainer.h"
#include "llsidetraypanelcontainer.h"
static LLRegisterPanelClassWrapper<LLPanelBlockedList> t_panel_blocked_list("panel_block_list_sidetray");
@@ -99,7 +99,7 @@ void LLPanelBlockedList::selectBlocked(const LLUUID& mute_id)
void LLPanelBlockedList::showPanelAndSelect(const LLUUID& idToSelect)
{
- LLSideTray::getInstance()->showPanel("panel_block_list_sidetray", LLSD().with(BLOCKED_PARAM_NAME, idToSelect));
+ LLFloaterSidePanelContainer::showPanel("people", "panel_block_list_sidetray", LLSD().with(BLOCKED_PARAM_NAME, idToSelect));
}
diff --git a/indra/newview/llpaneleditwearable.cpp b/indra/newview/llpaneleditwearable.cpp
index b73d97e4c4..03404e816b 100644
--- a/indra/newview/llpaneleditwearable.cpp
+++ b/indra/newview/llpaneleditwearable.cpp
@@ -356,9 +356,9 @@ LLEditWearableDictionary::ColorSwatchCtrls::ColorSwatchCtrls()
LLEditWearableDictionary::TextureCtrls::TextureCtrls()
{
- addEntry ( TEX_HEAD_BODYPAINT, new PickerControlEntry (TEX_HEAD_BODYPAINT, "Head Tattoos", LLUUID::null, TRUE ));
- addEntry ( TEX_UPPER_BODYPAINT, new PickerControlEntry (TEX_UPPER_BODYPAINT, "Upper Tattoos", LLUUID::null, TRUE ));
- addEntry ( TEX_LOWER_BODYPAINT, new PickerControlEntry (TEX_LOWER_BODYPAINT, "Lower Tattoos", LLUUID::null, TRUE ));
+ addEntry ( TEX_HEAD_BODYPAINT, new PickerControlEntry (TEX_HEAD_BODYPAINT, "Head", LLUUID::null, TRUE ));
+ addEntry ( TEX_UPPER_BODYPAINT, new PickerControlEntry (TEX_UPPER_BODYPAINT, "Upper Body", LLUUID::null, TRUE ));
+ addEntry ( TEX_LOWER_BODYPAINT, new PickerControlEntry (TEX_LOWER_BODYPAINT, "Lower Body", LLUUID::null, TRUE ));
addEntry ( TEX_HAIR, new PickerControlEntry (TEX_HAIR, "Texture", LLUUID( gSavedSettings.getString( "UIImgDefaultHairUUID" ) ), FALSE ));
addEntry ( TEX_EYES_IRIS, new PickerControlEntry (TEX_EYES_IRIS, "Iris", LLUUID( gSavedSettings.getString( "UIImgDefaultEyesUUID" ) ), FALSE ));
addEntry ( TEX_UPPER_SHIRT, new PickerControlEntry (TEX_UPPER_SHIRT, "Fabric", LLUUID( gSavedSettings.getString( "UIImgDefaultShirtUUID" ) ), FALSE ));
diff --git a/indra/newview/llpanelgroup.cpp b/indra/newview/llpanelgroup.cpp
index 76b85d5bec..ae217958f0 100644
--- a/indra/newview/llpanelgroup.cpp
+++ b/indra/newview/llpanelgroup.cpp
@@ -29,6 +29,7 @@
// Library includes
#include "llbutton.h"
+#include "llfloatersidepanelcontainer.h"
#include "lltabcontainer.h"
#include "lltextbox.h"
#include "lluictrlfactory.h"
@@ -49,7 +50,6 @@
#include "llpanelgroupnotices.h"
#include "llpanelgroupgeneral.h"
-#include "llsidetray.h"
#include "llaccordionctrltab.h"
#include "llaccordionctrl.h"
@@ -597,7 +597,7 @@ void LLPanelGroup::showNotice(const std::string& subject,
//static
void LLPanelGroup::refreshCreatedGroup(const LLUUID& group_id)
{
- LLPanelGroup* panel = LLSideTray::getInstance()->getPanel<LLPanelGroup>("panel_group_info_sidetray");
+ LLPanelGroup* panel = LLFloaterSidePanelContainer::getPanel<LLPanelGroup>("people", "panel_group_info_sidetray");
if(!panel)
return;
panel->setGroupID(group_id);
@@ -612,7 +612,7 @@ void LLPanelGroup::showNotice(const std::string& subject,
const std::string& inventory_name,
LLOfferInfo* inventory_offer)
{
- LLPanelGroup* panel = LLSideTray::getInstance()->getPanel<LLPanelGroup>("panel_group_info_sidetray");
+ LLPanelGroup* panel = LLFloaterSidePanelContainer::getPanel<LLPanelGroup>("people", "panel_group_info_sidetray");
if(!panel)
return;
diff --git a/indra/newview/llpanelgrouplandmoney.cpp b/indra/newview/llpanelgrouplandmoney.cpp
index eddd6e554d..363443646d 100644
--- a/indra/newview/llpanelgrouplandmoney.cpp
+++ b/indra/newview/llpanelgrouplandmoney.cpp
@@ -1062,7 +1062,7 @@ void LLGroupMoneyDetailsTabEventHandler::processReply(LLMessageSystem* msg,
// We don't do time zone corrections of the calculated number of seconds
// because we don't have a full time stamp, only a date.
- substitution["datetime"] = LLDateUtil::secondsSinceEpochFromString("%A %b %d, %Y", start_date);
+ substitution["datetime"] = LLDateUtil::secondsSinceEpochFromString("%Y-%m-%d", start_date);
LLStringUtil::format (time_str, substitution);
if ( interval_days != mImplementationp->mIntervalLength ||
@@ -1217,7 +1217,7 @@ void LLGroupMoneySalesTabEventHandler::processReply(LLMessageSystem* msg,
// We don't do time zone corrections of the calculated number of seconds
// because we don't have a full time stamp, only a date.
- substitution["datetime"] = LLDateUtil::secondsSinceEpochFromString("%A %b %d, %Y", start_date);
+ substitution["datetime"] = LLDateUtil::secondsSinceEpochFromString("%Y-%m-%d", start_date);
LLStringUtil::format (time_str, substitution);
text = time_str + "\n\n";
@@ -1431,22 +1431,23 @@ void LLGroupMoneyPlanningTabEventHandler::processReply(LLMessageSystem* msg,
LLSD substitution;
// We don't do time zone corrections of the calculated number of seconds
// because we don't have a full time stamp, only a date.
- substitution["datetime"] = LLDateUtil::secondsSinceEpochFromString("%m/%d/%Y", start_date);
+ substitution["datetime"] = LLDateUtil::secondsSinceEpochFromString("%Y-%m-%d", start_date);
LLStringUtil::format (time_str, substitution);
text.append(time_str);
+ text.append(". ");
if (current_interval == 0)
{
text.append(LLTrans::getString("NextStipendDay"));
time_str = date_format_str;
- substitution["datetime"] = LLDateUtil::secondsSinceEpochFromString("%m/%d/%Y", next_stipend_date);
+ substitution["datetime"] = LLDateUtil::secondsSinceEpochFromString("%Y-%m-%d", next_stipend_date);
LLStringUtil::format (time_str, substitution);
text.append(time_str);
- text.append("\n\n");
- text.append(llformat("%-24sL$%6d\n", LLTrans::getString("GroupMoneyBalance").c_str(), balance ));
+ text.append(".\n\n");
+ text.append(llformat("%-23sL$%6d\n", LLTrans::getString("GroupMoneyBalance").c_str(), balance ));
text.append(1, '\n');
}
diff --git a/indra/newview/llpanelimcontrolpanel.cpp b/indra/newview/llpanelimcontrolpanel.cpp
index e370f2f622..0295ad151f 100644
--- a/indra/newview/llpanelimcontrolpanel.cpp
+++ b/indra/newview/llpanelimcontrolpanel.cpp
@@ -40,7 +40,6 @@
#include "llparticipantlist.h"
#include "llimview.h"
#include "llvoicechannel.h"
-#include "llsidetray.h"
#include "llspeakers.h"
#include "lltrans.h"
diff --git a/indra/newview/llpanellandmarks.cpp b/indra/newview/llpanellandmarks.cpp
index a9cc247d1b..c7454e85a9 100644
--- a/indra/newview/llpanellandmarks.cpp
+++ b/indra/newview/llpanellandmarks.cpp
@@ -42,6 +42,7 @@
#include "llagentui.h"
#include "llcallbacklist.h"
#include "lldndbutton.h"
+#include "llfloatersidepanelcontainer.h"
#include "llfloaterworldmap.h"
#include "llfolderviewitem.h"
#include "llinventorymodelbackgroundfetch.h"
@@ -51,7 +52,6 @@
#include "llmenubutton.h"
#include "llplacesinventorybridge.h"
#include "llplacesinventorypanel.h"
-#include "llsidetray.h"
#include "lltoggleablemenu.h"
#include "llviewermenu.h"
#include "llviewerregion.h"
@@ -367,7 +367,7 @@ void LLLandmarksPanel::onSelectorButtonClicked()
key["type"] = "landmark";
key["id"] = listenerp->getUUID();
- LLSideTray::getInstance()->showPanel("panel_places", key);
+ LLFloaterSidePanelContainer::showPanel("places", key);
}
}
@@ -786,7 +786,7 @@ void LLLandmarksPanel::onAddAction(const LLSD& userdata) const
}
else
{
- LLSideTray::getInstance()->showPanel("panel_places", LLSD().with("type", "create_landmark"));
+ LLFloaterSidePanelContainer::showPanel("places", LLSD().with("type", "create_landmark"));
}
}
else if ("category" == command_name)
@@ -1309,7 +1309,13 @@ void LLLandmarksPanel::doProcessParcelInfo(LLLandmark* landmark,
landmark->getGlobalPos(landmark_global_pos);
// let's toggle pick panel into panel places
- LLPanel* panel_places = LLSideTray::getInstance()->getPanel("panel_places");//-> sidebar_places
+ LLPanel* panel_places = NULL;
+ LLFloaterSidePanelContainer* floaterp = LLFloaterReg::getTypedInstance<LLFloaterSidePanelContainer>("places");
+ if (floaterp)
+ {
+ panel_places = floaterp->findChild<LLPanel>("main_panel");
+ }
+
if (!panel_places)
{
llassert(NULL != panel_places);
@@ -1393,10 +1399,6 @@ static void filter_list(LLPlacesInventoryPanel* inventory_list, const std::strin
inventory_list->restoreFolderState();
}
- // Open the immediate children of the root folder, since those
- // are invisible in the UI and thus must always be open.
- inventory_list->getRootFolder()->openTopLevelFolders();
-
if (inventory_list->getFilterSubString().empty() && string.empty())
{
// current filter and new filter empty, do nothing
diff --git a/indra/newview/llpanellogin.cpp b/indra/newview/llpanellogin.cpp
index db7d836799..058d1ad6bc 100644
--- a/indra/newview/llpanellogin.cpp
+++ b/indra/newview/llpanellogin.cpp
@@ -154,10 +154,6 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect,
}
updateLocationCombo(false);
- LLUICtrl& mode_combo = getChildRef<LLUICtrl>("mode_combo");
- mode_combo.setValue(gSavedSettings.getString("SessionSettingsFile"));
- mode_combo.setCommitCallback(boost::bind(&LLPanelLogin::onModeChange, this, getChild<LLUICtrl>("mode_combo")->getValue(), _2));
-
LLComboBox* server_choice_combo = sInstance->getChild<LLComboBox>("server_combo");
server_choice_combo->setCommitCallback(onSelectServer, NULL);
server_choice_combo->setFocusLostCallback(boost::bind(onServerComboLostFocus, _1));
@@ -287,15 +283,15 @@ LLPanelLogin::~LLPanelLogin()
// virtual
void LLPanelLogin::draw()
{
- glPushMatrix();
+ gGL.pushMatrix();
{
F32 image_aspect = 1.333333f;
F32 view_aspect = (F32)getRect().getWidth() / (F32)getRect().getHeight();
// stretch image to maintain aspect ratio
if (image_aspect > view_aspect)
{
- glTranslatef(-0.5f * (image_aspect / view_aspect - 1.f) * getRect().getWidth(), 0.f, 0.f);
- glScalef(image_aspect / view_aspect, 1.f, 1.f);
+ gGL.translatef(-0.5f * (image_aspect / view_aspect - 1.f) * getRect().getWidth(), 0.f, 0.f);
+ gGL.scalef(image_aspect / view_aspect, 1.f, 1.f);
}
S32 width = getRect().getWidth();
@@ -310,7 +306,7 @@ void LLPanelLogin::draw()
mLogoImage->draw(0, -264, width + 8, mLogoImage->getHeight());
};
}
- glPopMatrix();
+ gGL.popMatrix();
LLPanel::draw();
}
@@ -1025,32 +1021,6 @@ void LLPanelLogin::updateLoginPanelLinks()
sInstance->getChildView("forgot_password_text")->setVisible( system_grid);
}
-void LLPanelLogin::onModeChange(const LLSD& original_value, const LLSD& new_value)
-{
- if (original_value.asString() != new_value.asString())
- {
- LLNotificationsUtil::add("ModeChange", LLSD(), LLSD(), boost::bind(&LLPanelLogin::onModeChangeConfirm, this, original_value, new_value, _1, _2));
- }
-}
-
-void LLPanelLogin::onModeChangeConfirm(const LLSD& original_value, const LLSD& new_value, const LLSD& notification, const LLSD& response)
-{
- S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
- switch (option)
- {
- case 0:
- gSavedSettings.getControl("SessionSettingsFile")->set(new_value);
- LLAppViewer::instance()->requestQuit();
- break;
- case 1:
- // revert to original value
- getChild<LLUICtrl>("mode_combo")->setValue(original_value);
- break;
- default:
- break;
- }
-}
-
std::string canonicalize_username(const std::string& name)
{
std::string cname = name;
diff --git a/indra/newview/llpanellogin.h b/indra/newview/llpanellogin.h
index be9de884d1..a439c4ff6b 100644
--- a/indra/newview/llpanellogin.h
+++ b/indra/newview/llpanellogin.h
@@ -87,8 +87,6 @@ private:
void reshapeBrowser();
void addFavoritesToStartLocation();
void addUsersWithFavoritesToUsername();
- void onModeChange(const LLSD& original_value, const LLSD& new_value);
- void onModeChangeConfirm(const LLSD& original_value, const LLSD& new_value, const LLSD& notification, const LLSD& response);
static void onClickConnect(void*);
static void onClickNewAccount(void*);
static void onClickVersion(void*);
diff --git a/indra/newview/llpanelmaininventory.cpp b/indra/newview/llpanelmaininventory.cpp
index 858f5cf575..374afb90be 100644
--- a/indra/newview/llpanelmaininventory.cpp
+++ b/indra/newview/llpanelmaininventory.cpp
@@ -28,6 +28,7 @@
#include "llpanelmaininventory.h"
#include "llagent.h"
+#include "llagentcamera.h"
#include "llavataractions.h"
#include "lldndbutton.h"
#include "lleconomy.h"
@@ -38,6 +39,7 @@
#include "llinventorymodelbackgroundfetch.h"
#include "llinventorypanel.h"
#include "llfiltereditor.h"
+#include "llfloatersidepanelcontainer.h"
#include "llfloaterreg.h"
#include "llmenubutton.h"
#include "lloutfitobserver.h"
@@ -51,7 +53,6 @@
#include "llviewermenu.h"
#include "llviewertexturelist.h"
#include "llsidepanelinventory.h"
-#include "llsidetray.h"
const std::string FILTERS_FILENAME("filters.xml");
@@ -111,7 +112,7 @@ LLPanelMainInventory::LLPanelMainInventory(const LLPanel::Params& p)
mCommitCallbackRegistrar.add("Inventory.EmptyTrash", boost::bind(&LLInventoryModel::emptyFolderType, &gInventory, "ConfirmEmptyTrash", LLFolderType::FT_TRASH));
mCommitCallbackRegistrar.add("Inventory.EmptyLostAndFound", boost::bind(&LLInventoryModel::emptyFolderType, &gInventory, "ConfirmEmptyLostAndFound", LLFolderType::FT_LOST_AND_FOUND));
mCommitCallbackRegistrar.add("Inventory.DoCreate", boost::bind(&LLPanelMainInventory::doCreate, this, _2));
- mCommitCallbackRegistrar.add("Inventory.NewWindow", boost::bind(&LLPanelMainInventory::newWindow, this));
+ //mCommitCallbackRegistrar.add("Inventory.NewWindow", boost::bind(&LLPanelMainInventory::newWindow, this));
mCommitCallbackRegistrar.add("Inventory.ShowFilters", boost::bind(&LLPanelMainInventory::toggleFindOptions, this));
mCommitCallbackRegistrar.add("Inventory.ResetFilters", boost::bind(&LLPanelMainInventory::resetFilters, this));
mCommitCallbackRegistrar.add("Inventory.SetSortBy", boost::bind(&LLPanelMainInventory::setSortBy, this, _2));
@@ -294,7 +295,13 @@ void LLPanelMainInventory::closeAllFolders()
void LLPanelMainInventory::newWindow()
{
- LLFloaterInventory::showAgentInventory();
+ static S32 instance_num = 0;
+ instance_num = (instance_num + 1) % S32_MAX;
+
+ if (!gAgentCamera.cameraMouselook())
+ {
+ LLFloaterReg::showTypedInstance<LLFloaterSidePanelContainer>("inventory", LLSD(instance_num));
+ }
}
void LLPanelMainInventory::doCreate(const LLSD& userdata)
@@ -579,9 +586,14 @@ void LLPanelMainInventory::updateItemcountText()
void LLPanelMainInventory::onFocusReceived()
{
- LLSidepanelInventory * sidepanel_inventory = LLSideTray::getInstance()->getPanel<LLSidepanelInventory>("sidepanel_inventory");
-
- sidepanel_inventory->clearSelections(false, true, true);
+ LLSidepanelInventory *sidepanel_inventory = LLFloaterSidePanelContainer::getPanel<LLSidepanelInventory>("inventory");
+ if (!sidepanel_inventory)
+ {
+ llwarns << "Could not find Inventory Panel in My Inventory floater" << llendl;
+ return;
+ }
+
+ sidepanel_inventory->clearSelections(false, true);
}
void LLPanelMainInventory::setFilterTextFromFilter()
@@ -1164,7 +1176,7 @@ BOOL LLPanelMainInventory::isActionEnabled(const LLSD& userdata)
if (command_name == "share")
{
- LLSidepanelInventory* parent = dynamic_cast<LLSidepanelInventory*>(LLSideTray::getInstance()->getPanel("sidepanel_inventory"));
+ LLSidepanelInventory* parent = LLFloaterSidePanelContainer::getPanel<LLSidepanelInventory>("inventory");
return parent ? parent->canShare() : FALSE;
}
diff --git a/indra/newview/llpanelmarketplaceinbox.cpp b/indra/newview/llpanelmarketplaceinbox.cpp
index 0579ecbb90..66c9c323cb 100644
--- a/indra/newview/llpanelmarketplaceinbox.cpp
+++ b/indra/newview/llpanelmarketplaceinbox.cpp
@@ -32,6 +32,7 @@
#include "llappviewer.h"
#include "llbutton.h"
#include "llinventorypanel.h"
+#include "llfloatersidepanelcontainer.h"
#include "llfolderview.h"
#include "llsidepanelinventory.h"
#include "llviewercontrol.h"
@@ -47,6 +48,8 @@ const LLPanelMarketplaceInbox::Params& LLPanelMarketplaceInbox::getDefaultParams
// protected
LLPanelMarketplaceInbox::LLPanelMarketplaceInbox(const Params& p)
: LLPanel(p)
+ , mFreshCountCtrl(NULL)
+ , mInboxButton(NULL)
, mInventoryPanel(NULL)
{
}
@@ -58,27 +61,22 @@ LLPanelMarketplaceInbox::~LLPanelMarketplaceInbox()
// virtual
BOOL LLPanelMarketplaceInbox::postBuild()
{
- LLAppViewer::instance()->setOnLoginCompletedCallback(boost::bind(&LLPanelMarketplaceInbox::handleLoginComplete, this));
-
LLFocusableElement::setFocusReceivedCallback(boost::bind(&LLPanelMarketplaceInbox::onFocusReceived, this));
+
+ mFreshCountCtrl = getChild<LLUICtrl>("inbox_fresh_new_count");
+ mInboxButton = getChild<LLButton>("inbox_btn");
return TRUE;
}
void LLPanelMarketplaceInbox::onSelectionChange()
{
- LLSidepanelInventory* sidepanel_inventory = dynamic_cast<LLSidepanelInventory*>(LLSideTray::getInstance()->getPanel("sidepanel_inventory"));
+ LLSidepanelInventory* sidepanel_inventory = LLFloaterSidePanelContainer::getPanel<LLSidepanelInventory>("inventory");
sidepanel_inventory->updateVerbs();
}
-void LLPanelMarketplaceInbox::handleLoginComplete()
-{
- // Set us up as the class to drive the badge value for the sidebar_inventory button
- LLSideTray::getInstance()->setTabButtonBadgeDriver("sidebar_inventory", this);
-}
-
LLInventoryPanel * LLPanelMarketplaceInbox::setupInventoryPanel()
{
LLView * inbox_inventory_placeholder = getChild<LLView>("inbox_inventory_placeholder");
@@ -113,9 +111,11 @@ LLInventoryPanel * LLPanelMarketplaceInbox::setupInventoryPanel()
void LLPanelMarketplaceInbox::onFocusReceived()
{
- LLSidepanelInventory * sidepanel_inventory = LLSideTray::getInstance()->getPanel<LLSidepanelInventory>("sidepanel_inventory");
-
- sidepanel_inventory->clearSelections(true, false, true);
+ LLSidepanelInventory *sidepanel_inventory = LLFloaterSidePanelContainer::getPanel<LLSidepanelInventory>("inventory");
+ if (sidepanel_inventory)
+ {
+ sidepanel_inventory->clearSelections(true, false);
+ }
gSavedPerAccountSettings.setU32("LastInventoryInboxActivity", time_corrected());
}
@@ -156,6 +156,20 @@ U32 LLPanelMarketplaceInbox::getFreshItemCount() const
fresh_item_count++;
}
}
+
+ LLFolderViewFolder::items_t::const_iterator items_it = inbox_folder->getItemsBegin();
+ LLFolderViewFolder::items_t::const_iterator items_end = inbox_folder->getItemsEnd();
+
+ for (; items_it != items_end; ++items_it)
+ {
+ const LLFolderViewItem * item_view = *items_it;
+ const LLInboxFolderViewItem * inbox_item_view = dynamic_cast<const LLInboxFolderViewItem*>(item_view);
+
+ if (inbox_item_view && inbox_item_view->isFresh())
+ {
+ fresh_item_count++;
+ }
+ }
}
}
@@ -176,6 +190,7 @@ U32 LLPanelMarketplaceInbox::getTotalItemCount() const
if (inbox_folder)
{
item_count += inbox_folder->getFoldersCount();
+ item_count += inbox_folder->getItemsCount();
}
}
@@ -186,9 +201,10 @@ std::string LLPanelMarketplaceInbox::getBadgeString() const
{
std::string item_count_str("");
+ LLPanel *inventory_panel = LLFloaterSidePanelContainer::getPanel("inventory");
+
// If the inbox is visible, and the side panel is collapsed or expanded and not the inventory panel
- if (getParent()->getVisible() &&
- (LLSideTray::getInstance()->getCollapsed() || !LLSideTray::getInstance()->isPanelActive("sidepanel_inventory")))
+ if (getParent()->getVisible() && inventory_panel && !inventory_panel->isInVisibleChain())
{
U32 item_count = getFreshItemCount();
@@ -205,7 +221,7 @@ void LLPanelMarketplaceInbox::draw()
{
U32 item_count = getTotalItemCount();
- LLView * fresh_new_count_view = getChildView("inbox_fresh_new_count");
+ llassert(mFreshCountCtrl != NULL);
if (item_count > 0)
{
@@ -213,26 +229,26 @@ void LLPanelMarketplaceInbox::draw()
LLStringUtil::format_map_t args;
args["[NUM]"] = item_count_str;
- getChild<LLButton>("inbox_btn")->setLabel(getString("InboxLabelWithArg", args));
+ mInboxButton->setLabel(getString("InboxLabelWithArg", args));
#if SUPPORTING_FRESH_ITEM_COUNT
// set green text to fresh item count
U32 fresh_item_count = getFreshItemCount();
- fresh_new_count_view->setVisible((fresh_item_count > 0));
+ mFreshCountCtrl->setVisible((fresh_item_count > 0));
if (fresh_item_count > 0)
{
- getChild<LLUICtrl>("inbox_fresh_new_count")->setTextArg("[NUM]", llformat("%d", fresh_item_count));
+ mFreshCountCtrl->setTextArg("[NUM]", llformat("%d", fresh_item_count));
}
#else
- fresh_new_count_view->setVisible(FALSE);
+ mFreshCountCtrl->setVisible(FALSE);
#endif
}
else
{
- getChild<LLButton>("inbox_btn")->setLabel(getString("InboxLabelNoArg"));
+ mInboxButton->setLabel(getString("InboxLabelNoArg"));
- fresh_new_count_view->setVisible(FALSE);
+ mFreshCountCtrl->setVisible(FALSE);
}
LLPanel::draw();
diff --git a/indra/newview/llpanelmarketplaceinbox.h b/indra/newview/llpanelmarketplaceinbox.h
index 705a095cf0..9eb74581a2 100644
--- a/indra/newview/llpanelmarketplaceinbox.h
+++ b/indra/newview/llpanelmarketplaceinbox.h
@@ -28,11 +28,12 @@
#define LL_LLPANELMARKETPLACEINBOX_H
#include "llpanel.h"
-#include "llsidetray.h"
+class LLButton;
class LLInventoryPanel;
+class LLUICtrl;
-class LLPanelMarketplaceInbox : public LLPanel, public LLSideTrayTabBadgeDriver
+class LLPanelMarketplaceInbox : public LLPanel
{
public:
@@ -61,16 +62,16 @@ public:
std::string getBadgeString() const;
private:
- void handleLoginComplete();
void onSelectionChange();
void onFocusReceived();
private:
- LLInventoryPanel* mInventoryPanel;
+ LLUICtrl * mFreshCountCtrl;
+ LLButton * mInboxButton;
+ LLInventoryPanel * mInventoryPanel;
};
#endif //LL_LLPANELMARKETPLACEINBOX_H
-
diff --git a/indra/newview/llpanelmarketplaceinboxinventory.cpp b/indra/newview/llpanelmarketplaceinboxinventory.cpp
index faba6dc0cf..678e4f2843 100644
--- a/indra/newview/llpanelmarketplaceinboxinventory.cpp
+++ b/indra/newview/llpanelmarketplaceinboxinventory.cpp
@@ -45,6 +45,7 @@
static LLDefaultChildRegistry::Register<LLInboxInventoryPanel> r1("inbox_inventory_panel");
static LLDefaultChildRegistry::Register<LLInboxFolderViewFolder> r2("inbox_folder_view_folder");
+static LLDefaultChildRegistry::Register<LLInboxFolderViewItem> r3("inbox_folder_view_item");
//
@@ -137,7 +138,7 @@ LLFolderViewFolder * LLInboxInventoryPanel::createFolderViewFolder(LLInvFVBridge
LLFolderViewItem * LLInboxInventoryPanel::createFolderViewItem(LLInvFVBridge * bridge)
{
- LLFolderViewItem::Params params;
+ LLInboxFolderViewItem::Params params;
params.name = bridge->getDisplayName();
params.icon = bridge->getIcon();
@@ -171,10 +172,6 @@ LLInboxFolderViewFolder::LLInboxFolderViewFolder(const Params& p)
#endif
}
-LLInboxFolderViewFolder::~LLInboxFolderViewFolder()
-{
-}
-
// virtual
void LLInboxFolderViewFolder::draw()
{
@@ -190,21 +187,32 @@ void LLInboxFolderViewFolder::draw()
LLFolderViewFolder::draw();
}
+void LLInboxFolderViewFolder::selectItem()
+{
+ deFreshify();
+
+ LLFolderViewFolder::selectItem();
+}
+
+void LLInboxFolderViewFolder::toggleOpen()
+{
+ deFreshify();
+
+ LLFolderViewFolder::toggleOpen();
+}
+
void LLInboxFolderViewFolder::computeFreshness()
{
const U32 last_expansion_utc = gSavedPerAccountSettings.getU32("LastInventoryInboxActivity");
if (last_expansion_utc > 0)
{
- const U32 time_offset_for_pdt = 7 * 60 * 60;
- const U32 last_expansion = last_expansion_utc - time_offset_for_pdt;
-
- mFresh = (mCreationDate > last_expansion);
+ mFresh = (mCreationDate > last_expansion_utc);
#if DEBUGGING_FRESHNESS
if (mFresh)
{
- llinfos << "Item is fresh! -- creation " << mCreationDate << ", saved_freshness_date " << last_expansion << llendl;
+ llinfos << "Item is fresh! -- creation " << mCreationDate << ", saved_freshness_date " << last_expansion_utc << llendl;
}
#endif
}
@@ -221,20 +229,6 @@ void LLInboxFolderViewFolder::deFreshify()
gSavedPerAccountSettings.setU32("LastInventoryInboxActivity", time_corrected());
}
-void LLInboxFolderViewFolder::selectItem()
-{
- LLFolderViewFolder::selectItem();
-
- deFreshify();
-}
-
-void LLInboxFolderViewFolder::toggleOpen()
-{
- LLFolderViewFolder::toggleOpen();
-
- deFreshify();
-}
-
void LLInboxFolderViewFolder::setCreationDate(time_t creation_date_utc)
{
mCreationDate = creation_date_utc;
@@ -249,9 +243,87 @@ void LLInboxFolderViewFolder::setCreationDate(time_t creation_date_utc)
// LLInboxFolderViewItem Implementation
//
+LLInboxFolderViewItem::LLInboxFolderViewItem(const Params& p)
+ : LLFolderViewItem(p)
+ , LLBadgeOwner(getHandle())
+ , mFresh(false)
+{
+#if SUPPORTING_FRESH_ITEM_COUNT
+ initBadgeParams(p.new_badge());
+#endif
+}
+
+BOOL LLInboxFolderViewItem::addToFolder(LLFolderViewFolder* folder, LLFolderView* root)
+{
+ BOOL retval = LLFolderViewItem::addToFolder(folder, root);
+
+#if SUPPORTING_FRESH_ITEM_COUNT
+ // Compute freshness if our parent is the root folder for the inbox
+ if (mParentFolder == mRoot)
+ {
+ computeFreshness();
+ }
+#endif
+
+ return retval;
+}
+
BOOL LLInboxFolderViewItem::handleDoubleClick(S32 x, S32 y, MASK mask)
{
- return TRUE;
+ deFreshify();
+
+ return LLFolderViewItem::handleDoubleClick(x, y, mask);
+}
+
+// virtual
+void LLInboxFolderViewItem::draw()
+{
+#if SUPPORTING_FRESH_ITEM_COUNT
+ if (!badgeHasParent())
+ {
+ addBadgeToParentPanel();
+ }
+
+ setBadgeVisibility(mFresh);
+#endif
+
+ LLFolderViewItem::draw();
+}
+
+void LLInboxFolderViewItem::selectItem()
+{
+ deFreshify();
+
+ LLFolderViewItem::selectItem();
+}
+
+void LLInboxFolderViewItem::computeFreshness()
+{
+ const U32 last_expansion_utc = gSavedPerAccountSettings.getU32("LastInventoryInboxActivity");
+
+ if (last_expansion_utc > 0)
+ {
+ mFresh = (mCreationDate > last_expansion_utc);
+
+#if DEBUGGING_FRESHNESS
+ if (mFresh)
+ {
+ llinfos << "Item is fresh! -- creation " << mCreationDate << ", saved_freshness_date " << last_expansion_utc << llendl;
+ }
+#endif
+ }
+ else
+ {
+ mFresh = true;
+ }
+}
+
+void LLInboxFolderViewItem::deFreshify()
+{
+ mFresh = false;
+
+ gSavedPerAccountSettings.setU32("LastInventoryInboxActivity", time_corrected());
}
+
// eof
diff --git a/indra/newview/llpanelmarketplaceinboxinventory.h b/indra/newview/llpanelmarketplaceinboxinventory.h
index 46eeb9ea7f..d6b827ee3e 100644
--- a/indra/newview/llpanelmarketplaceinboxinventory.h
+++ b/indra/newview/llpanelmarketplaceinboxinventory.h
@@ -69,16 +69,15 @@ public:
};
LLInboxFolderViewFolder(const Params& p);
- ~LLInboxFolderViewFolder();
-
+
void draw();
- void computeFreshness();
- void deFreshify();
-
void selectItem();
void toggleOpen();
+ void computeFreshness();
+ void deFreshify();
+
bool isFresh() const { return mFresh; }
protected:
@@ -88,15 +87,35 @@ protected:
};
-class LLInboxFolderViewItem : public LLFolderViewItem
+class LLInboxFolderViewItem : public LLFolderViewItem, public LLBadgeOwner
{
public:
- LLInboxFolderViewItem(const Params& p)
- : LLFolderViewItem(p)
+ struct Params : public LLInitParam::Block<Params, LLFolderViewItem::Params>
{
- }
+ Optional<LLBadge::Params> new_badge;
+
+ Params()
+ : new_badge("new_badge")
+ {
+ }
+ };
+ LLInboxFolderViewItem(const Params& p);
+
+ BOOL addToFolder(LLFolderViewFolder* folder, LLFolderView* root);
BOOL handleDoubleClick(S32 x, S32 y, MASK mask);
+
+ void draw();
+
+ void selectItem();
+
+ void computeFreshness();
+ void deFreshify();
+
+ bool isFresh() const { return mFresh; }
+
+protected:
+ bool mFresh;
};
#endif //LL_INBOXINVENTORYPANEL_H
diff --git a/indra/newview/llpanelmarketplaceoutbox.cpp b/indra/newview/llpanelmarketplaceoutbox.cpp
deleted file mode 100644
index 73fb92ff72..0000000000
--- a/indra/newview/llpanelmarketplaceoutbox.cpp
+++ /dev/null
@@ -1,359 +0,0 @@
-/**
- * @file llpanelmarketplaceoutbox.cpp
- * @brief Panel for marketplace outbox
- *
-* $LicenseInfo:firstyear=2011&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-#include "llviewerprecompiledheaders.h"
-
-#include "llpanelmarketplaceoutbox.h"
-#include "llpanelmarketplaceoutboxinventory.h"
-
-#include "llappviewer.h"
-#include "llbutton.h"
-#include "llcoros.h"
-#include "lleventcoro.h"
-#include "llinventorypanel.h"
-#include "llloadingindicator.h"
-#include "llnotificationsutil.h"
-#include "llpanelmarketplaceinbox.h"
-#include "llsdutil.h"
-#include "llsidepanelinventory.h"
-#include "llsidetray.h"
-#include "lltimer.h"
-#include "llviewernetwork.h"
-#include "llagent.h"
-#include "llviewermedia.h"
-#include "llfolderview.h"
-#include "llinventoryfunctions.h"
-
-static LLRegisterPanelClassWrapper<LLPanelMarketplaceOutbox> t_panel_marketplace_outbox("panel_marketplace_outbox");
-
-const LLPanelMarketplaceOutbox::Params& LLPanelMarketplaceOutbox::getDefaultParams()
-{
- return LLUICtrlFactory::getDefaultParams<LLPanelMarketplaceOutbox>();
-}
-
-// protected
-LLPanelMarketplaceOutbox::LLPanelMarketplaceOutbox(const Params& p)
- : LLPanel(p)
- , mInventoryPanel(NULL)
- , mSyncButton(NULL)
- , mSyncIndicator(NULL)
- , mSyncInProgress(false)
-{
-}
-
-LLPanelMarketplaceOutbox::~LLPanelMarketplaceOutbox()
-{
-}
-
-// virtual
-BOOL LLPanelMarketplaceOutbox::postBuild()
-{
- LLAppViewer::instance()->setOnLoginCompletedCallback(boost::bind(&LLPanelMarketplaceOutbox::handleLoginComplete, this));
-
- LLFocusableElement::setFocusReceivedCallback(boost::bind(&LLPanelMarketplaceOutbox::onFocusReceived, this));
-
- return TRUE;
-}
-
-void LLPanelMarketplaceOutbox::handleLoginComplete()
-{
- mSyncButton = getChild<LLButton>("outbox_sync_btn");
- mSyncButton->setCommitCallback(boost::bind(&LLPanelMarketplaceOutbox::onSyncButtonClicked, this));
- mSyncButton->setEnabled(!isOutboxEmpty());
-
- mSyncIndicator = getChild<LLLoadingIndicator>("outbox_sync_indicator");
-}
-
-void LLPanelMarketplaceOutbox::onFocusReceived()
-{
- LLSidepanelInventory * sidepanel_inventory = LLSideTray::getInstance()->getPanel<LLSidepanelInventory>("sidepanel_inventory");
-
- sidepanel_inventory->clearSelections(true, true, false);
-}
-
-void LLPanelMarketplaceOutbox::onSelectionChange()
-{
- LLSidepanelInventory* sidepanel_inventory = dynamic_cast<LLSidepanelInventory*>(LLSideTray::getInstance()->getPanel("sidepanel_inventory"));
-
- sidepanel_inventory->updateVerbs();
-}
-
-LLInventoryPanel * LLPanelMarketplaceOutbox::setupInventoryPanel()
-{
- LLView * outbox_inventory_placeholder = getChild<LLView>("outbox_inventory_placeholder_panel");
- LLView * outbox_inventory_parent = outbox_inventory_placeholder->getParent();
-
- mInventoryPanel =
- LLUICtrlFactory::createFromFile<LLInventoryPanel>("panel_outbox_inventory.xml",
- outbox_inventory_parent,
- LLInventoryPanel::child_registry_t::instance());
-
- llassert(mInventoryPanel);
-
- // Reshape the inventory to the proper size
- LLRect inventory_placeholder_rect = outbox_inventory_placeholder->getRect();
- mInventoryPanel->setShape(inventory_placeholder_rect);
-
- // Set the sort order newest to oldest
- mInventoryPanel->setSortOrder(LLInventoryFilter::SO_DATE);
- mInventoryPanel->getFilter()->markDefault();
-
- // Set selection callback for proper update of inventory status buttons
- mInventoryPanel->setSelectCallback(boost::bind(&LLPanelMarketplaceOutbox::onSelectionChange, this));
-
- // Set up the note to display when the outbox is empty
- mInventoryPanel->getFilter()->setEmptyLookupMessage("InventoryOutboxNoItems");
-
- // Hide the placeholder text
- outbox_inventory_placeholder->setVisible(FALSE);
-
- return mInventoryPanel;
-}
-
-BOOL LLPanelMarketplaceOutbox::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
- EDragAndDropType cargo_type,
- void* cargo_data,
- EAcceptance* accept,
- std::string& tooltip_msg)
-{
- BOOL handled = LLPanel::handleDragAndDrop(x, y, mask, drop, cargo_type, cargo_data, accept, tooltip_msg);
-
- if (!handled && mInventoryPanel && mInventoryPanel->getRootFolder())
- {
- handled = mInventoryPanel->getRootFolder()->handleDragAndDropFromChild(mask,drop,cargo_type,cargo_data,accept,tooltip_msg);
-
- if (handled)
- {
- mInventoryPanel->getRootFolder()->setDragAndDropThisFrame();
- }
- }
-
- return handled;
-}
-
-bool LLPanelMarketplaceOutbox::isOutboxEmpty() const
-{
- return (getTotalItemCount() == 0);
-}
-
-bool LLPanelMarketplaceOutbox::isSyncInProgress() const
-{
- return mSyncInProgress;
-}
-
-
-std::string gTimeDelayDebugFunc = "";
-
-void timeDelay(LLCoros::self& self, LLPanelMarketplaceOutbox* outboxPanel)
-{
- waitForEventOn(self, "mainloop");
-
- LLTimer delayTimer;
- delayTimer.reset();
- delayTimer.setTimerExpirySec(5.0f);
-
- while (!delayTimer.hasExpired())
- {
- waitForEventOn(self, "mainloop");
- }
-
- outboxPanel->onSyncComplete(true, LLSD::emptyMap());
-
- gTimeDelayDebugFunc = "";
-}
-
-
-class LLInventorySyncResponder : public LLHTTPClient::Responder
-{
-public:
- LLInventorySyncResponder(LLPanelMarketplaceOutbox * outboxPanel)
- : LLCurl::Responder()
- , mOutboxPanel(outboxPanel)
- {
- }
-
- void completed(U32 status, const std::string& reason, const LLSD& content)
- {
- llinfos << "inventory_import complete status: " << status << ", reason: " << reason << llendl;
-
- if (isGoodStatus(status))
- {
- // Complete success
- llinfos << "success" << llendl;
- }
- else
- {
- llwarns << "failed" << llendl;
- }
-
- mOutboxPanel->onSyncComplete(isGoodStatus(status), content);
- }
-
-private:
- LLPanelMarketplaceOutbox * mOutboxPanel;
-};
-
-void LLPanelMarketplaceOutbox::onSyncButtonClicked()
-{
- // Get the sync animation going
- mSyncInProgress = true;
- updateSyncButtonStatus();
-
- // Make the url for the inventory import request
- std::string url = "https://marketplace.secondlife.com/";
-
- if (!LLGridManager::getInstance()->isInProductionGrid())
- {
- std::string gridLabel = LLGridManager::getInstance()->getGridLabel();
- url = llformat("https://marketplace.%s.lindenlab.com/", utf8str_tolower(gridLabel).c_str());
-
- // TEMP for Jim's pdp
- //url = "http://pdp24.lindenlab.com:3000/";
- }
-
- url += "api/1/users/";
- url += gAgent.getID().getString();
- url += "/inventory_import";
-
- llinfos << "http get: " << url << llendl;
- LLHTTPClient::get(url, new LLInventorySyncResponder(this), LLViewerMedia::getHeaders());
-
- // Set a timer (for testing only)
- //gTimeDelayDebugFunc = LLCoros::instance().launch("LLPanelMarketplaceOutbox timeDelay", boost::bind(&timeDelay, _1, this));
-}
-
-void LLPanelMarketplaceOutbox::onSyncComplete(bool goodStatus, const LLSD& content)
-{
- mSyncInProgress = false;
- updateSyncButtonStatus();
-
- const LLSD& errors_list = content["errors"];
-
- if (goodStatus && (errors_list.size() == 0))
- {
- LLNotificationsUtil::add("OutboxUploadComplete", LLSD::emptyMap(), LLSD::emptyMap());
- }
- else
- {
- LLNotificationsUtil::add("OutboxUploadHadErrors", LLSD::emptyMap(), LLSD::emptyMap());
- }
-
- llinfos << "Marketplace upload llsd:" << llendl;
- llinfos << ll_pretty_print_sd(content) << llendl;
- llinfos << llendl;
-
- const LLSD& imported_list = content["imported"];
- LLSD::array_const_iterator it = imported_list.beginArray();
- for ( ; it != imported_list.endArray(); ++it)
- {
- LLUUID imported_folder = (*it).asUUID();
- llinfos << "Successfully uploaded folder " << imported_folder.asString() << " to marketplace." << llendl;
- }
-
- for (it = errors_list.beginArray(); it != errors_list.endArray(); ++it)
- {
- const LLSD& item_error_map = (*it);
-
- LLUUID error_folder = item_error_map["folder_id"].asUUID();
- const std::string& error_string = item_error_map["identifier"].asString();
- LLUUID error_item = item_error_map["item_id"].asUUID();
- const std::string& error_item_name = item_error_map["item_name"].asString();
- const std::string& error_message = item_error_map["message"].asString();
-
- llinfos << "Error item " << error_folder.asString() << ", " << error_string << ", "
- << error_item.asString() << ", " << error_item_name << ", " << error_message << llendl;
-
- LLFolderViewFolder * item_folder = mInventoryPanel->getRootFolder()->getFolderByID(error_folder);
- LLOutboxFolderViewFolder * outbox_item_folder = dynamic_cast<LLOutboxFolderViewFolder *>(item_folder);
-
- llassert(outbox_item_folder);
-
- outbox_item_folder->setErrorString(error_string);
- }
-}
-
-void LLPanelMarketplaceOutbox::updateSyncButtonStatus()
-{
- if (isSyncInProgress())
- {
- mSyncButton->setVisible(false);
-
- mSyncIndicator->setVisible(true);
- mSyncIndicator->reset();
- mSyncIndicator->start();
- }
- else
- {
- mSyncIndicator->stop();
- mSyncIndicator->setVisible(false);
-
- mSyncButton->setVisible(true);
- mSyncButton->setEnabled(!isOutboxEmpty());
- }
-}
-
-U32 LLPanelMarketplaceOutbox::getTotalItemCount() const
-{
- U32 item_count = 0;
-
- if (mInventoryPanel)
- {
- const LLFolderViewFolder * outbox_folder = mInventoryPanel->getRootFolder();
-
- if (outbox_folder)
- {
- item_count += outbox_folder->getFoldersCount();
- }
- }
-
- return item_count;
-}
-
-void LLPanelMarketplaceOutbox::draw()
-{
- const U32 item_count = getTotalItemCount();
- const bool not_empty = (item_count > 0);
-
- if (not_empty)
- {
- std::string item_count_str = llformat("%d", item_count);
-
- LLStringUtil::format_map_t args;
- args["[NUM]"] = item_count_str;
- getChild<LLButton>("outbox_btn")->setLabel(getString("OutboxLabelWithArg", args));
- }
- else
- {
- getChild<LLButton>("outbox_btn")->setLabel(getString("OutboxLabelNoArg"));
- }
-
- if (!isSyncInProgress())
- {
- mSyncButton->setEnabled(not_empty);
- }
-
- LLPanel::draw();
-}
diff --git a/indra/newview/llpanelmarketplaceoutbox.h b/indra/newview/llpanelmarketplaceoutbox.h
deleted file mode 100644
index c6b4a5abe2..0000000000
--- a/indra/newview/llpanelmarketplaceoutbox.h
+++ /dev/null
@@ -1,90 +0,0 @@
-/**
- * @file llpanelmarketplaceoutbox.h
- * @brief Panel for marketplace outbox
- *
-* $LicenseInfo:firstyear=2011&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-#ifndef LL_LLPANELMARKETPLACEOUTBOX_H
-#define LL_LLPANELMARKETPLACEOUTBOX_H
-
-#include "llpanel.h"
-
-
-class LLButton;
-class LLInventoryPanel;
-class LLLoadingIndicator;
-
-
-class LLPanelMarketplaceOutbox : public LLPanel
-{
-public:
-
- struct Params : public LLInitParam::Block<Params, LLPanel::Params>
- {};
-
- LOG_CLASS(LLPanelMarketplaceOutbox);
-
- // RN: for some reason you can't just use LLUICtrlFactory::getDefaultParams as a default argument in VC8
- static const LLPanelMarketplaceOutbox::Params& getDefaultParams();
-
- LLPanelMarketplaceOutbox(const Params& p = getDefaultParams());
- ~LLPanelMarketplaceOutbox();
-
- /*virtual*/ BOOL postBuild();
-
- /*virtual*/ void draw();
-
- LLInventoryPanel * setupInventoryPanel();
-
- U32 getTotalItemCount() const;
-
- bool isOutboxEmpty() const;
- bool isSyncInProgress() const;
-
- void onSyncComplete(bool goodStatus, const LLSD& content);
-
- /*virtual*/ BOOL handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
- EDragAndDropType cargo_type,
- void* cargo_data,
- EAcceptance* accept,
- std::string& tooltip_msg);
-
-protected:
- void onSyncButtonClicked();
- void updateSyncButtonStatus();
-
- void handleLoginComplete();
- void onFocusReceived();
- void onSelectionChange();
-
-private:
- LLInventoryPanel * mInventoryPanel;
-
- LLButton * mSyncButton;
- LLLoadingIndicator * mSyncIndicator;
- bool mSyncInProgress;
-};
-
-
-#endif //LL_LLPANELMARKETPLACEOUTBOX_H
-
diff --git a/indra/newview/llpanelmarketplaceoutboxinventory.cpp b/indra/newview/llpanelmarketplaceoutboxinventory.cpp
index ed1206aec8..ff62cb23db 100644
--- a/indra/newview/llpanelmarketplaceoutboxinventory.cpp
+++ b/indra/newview/llpanelmarketplaceoutboxinventory.cpp
@@ -47,50 +47,6 @@ static LLDefaultChildRegistry::Register<LLOutboxFolderViewFolder> r2("outbox_fol
//
-// Marketplace errors
-//
-
-enum
-{
- MKTERR_NONE = 0,
-
- MKTERR_NOT_MERCHANT,
- MKTERR_FOLDER_EMPTY,
- MKTERR_UNASSOCIATED_PRODUCTS,
- MKTERR_OBJECT_LIMIT,
- MKTERR_FOLDER_DEPTH,
- MKTERR_UNSELLABLE_ITEM,
- MKTERR_INTERNAL_IMPORT,
-
- MKTERR_COUNT
-};
-
-static const std::string MARKETPLACE_ERROR_STRINGS[MKTERR_COUNT] =
-{
- "NO_ERROR",
- "NOT_MERCHANT_ERROR",
- "FOLDER_EMPTY_ERROR",
- "UNASSOCIATED_PRODUCTS_ERROR",
- "OBJECT_LIMIT_ERROR",
- "FOLDER_DEPTH_ERROR",
- "UNSELLABLE_ITEM_FOUND",
- "INTERNAL_IMPORT_ERROR",
-};
-
-static const std::string MARKETPLACE_ERROR_NAMES[MKTERR_COUNT] =
-{
- "Marketplace Error None",
- "Marketplace Error Not Merchant",
- "Marketplace Error Empty Folder",
- "Marketplace Error Unassociated Products",
- "Marketplace Error Object Limit",
- "Marketplace Error Folder Depth",
- "Marketplace Error Unsellable Item",
- "Marketplace Error Internal Import",
-};
-
-
-//
// LLOutboxInventoryPanel Implementation
//
@@ -111,37 +67,6 @@ void LLOutboxInventoryPanel::buildFolderView(const LLInventoryPanel::Params& par
LLUUID root_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_OUTBOX, false, false);
- // leslie -- temporary HACK to work around sim not creating outbox with proper system folder type
- if (root_id.isNull())
- {
- std::string start_folder_name(params.start_folder());
-
- LLInventoryModel::cat_array_t* cats;
- LLInventoryModel::item_array_t* items;
-
- gInventory.getDirectDescendentsOf(gInventory.getRootFolderID(), cats, items);
-
- if (cats)
- {
- for (LLInventoryModel::cat_array_t::const_iterator cat_it = cats->begin(); cat_it != cats->end(); ++cat_it)
- {
- LLInventoryCategory* cat = *cat_it;
-
- if (cat->getName() == start_folder_name)
- {
- root_id = cat->getUUID();
- break;
- }
- }
- }
-
- if (root_id == LLUUID::null)
- {
- llwarns << "No category found that matches outbox inventory panel start_folder: " << start_folder_name << llendl;
- }
- }
- // leslie -- end temporary HACK
-
if (root_id == LLUUID::null)
{
llwarns << "Outbox inventory panel has no root folder!" << llendl;
@@ -206,66 +131,26 @@ LLFolderViewItem * LLOutboxInventoryPanel::createFolderViewItem(LLInvFVBridge *
LLOutboxFolderViewFolder::LLOutboxFolderViewFolder(const Params& p)
: LLFolderViewFolder(p)
- , LLBadgeOwner(getHandle())
- , mError(0)
-{
- initBadgeParams(p.error_badge());
-}
-
-LLOutboxFolderViewFolder::~LLOutboxFolderViewFolder()
{
}
-// virtual
-void LLOutboxFolderViewFolder::draw()
-{
- if (!badgeHasParent())
- {
- addBadgeToParentPanel();
- }
-
- setBadgeVisibility(hasError());
-
- LLFolderViewFolder::draw();
-}
+//
+// LLOutboxFolderViewItem Implementation
+//
-void LLOutboxFolderViewFolder::setErrorString(const std::string& errorString)
+LLOutboxFolderViewItem::LLOutboxFolderViewItem(const Params& p)
+ : LLFolderViewItem(p)
{
- S32 error_code = MKTERR_NONE;
-
- for (S32 i = 1; i < MKTERR_COUNT; ++i)
- {
- if (MARKETPLACE_ERROR_STRINGS[i] == errorString)
- {
- error_code = i;
- break;
- }
- }
-
- setError(error_code);
}
-void LLOutboxFolderViewFolder::setError(S32 errorCode)
+BOOL LLOutboxFolderViewItem::handleDoubleClick(S32 x, S32 y, MASK mask)
{
- mError = errorCode;
-
- if (hasError())
- {
- setToolTip(LLTrans::getString(MARKETPLACE_ERROR_NAMES[mError]));
- }
- else
- {
- setToolTip(LLStringExplicit(""));
- }
+ return TRUE;
}
-//
-// LLOutboxFolderViewItem Implementation
-//
-
-BOOL LLOutboxFolderViewItem::handleDoubleClick(S32 x, S32 y, MASK mask)
+void LLOutboxFolderViewItem::openItem()
{
- return TRUE;
+ // Intentionally do nothing to block attaching items from the outbox
}
// eof
diff --git a/indra/newview/llpanelmarketplaceoutboxinventory.h b/indra/newview/llpanelmarketplaceoutboxinventory.h
index 346680a79d..a6c522b7c2 100644
--- a/indra/newview/llpanelmarketplaceoutboxinventory.h
+++ b/indra/newview/llpanelmarketplaceoutboxinventory.h
@@ -28,7 +28,6 @@
#define LL_OUTBOXINVENTORYPANEL_H
-#include "llbadgeowner.h"
#include "llinventorypanel.h"
#include "llfolderviewitem.h"
@@ -53,44 +52,26 @@ public:
};
-class LLOutboxFolderViewFolder : public LLFolderViewFolder, public LLBadgeOwner
+class LLOutboxFolderViewFolder : public LLFolderViewFolder
{
public:
struct Params : public LLInitParam::Block<Params, LLFolderViewFolder::Params>
{
- Optional<LLBadge::Params> error_badge;
-
- Params()
- : error_badge("error_badge")
- {
- }
+ Params() {}
};
LLOutboxFolderViewFolder(const Params& p);
- ~LLOutboxFolderViewFolder();
-
- void draw();
-
- void setErrorString(const std::string& errorString);
- void setError(S32 errorCode);
-
- bool hasError() const { return (mError != 0); }
-
-protected:
- S32 mError;
};
class LLOutboxFolderViewItem : public LLFolderViewItem
{
public:
- LLOutboxFolderViewItem(const Params& p)
- : LLFolderViewItem(p)
- {
- }
+ LLOutboxFolderViewItem(const Params& p);
// virtual
BOOL handleDoubleClick(S32 x, S32 y, MASK mask);
+ void openItem();
};
diff --git a/indra/newview/llpanelme.cpp b/indra/newview/llpanelme.cpp
index 1347a02a52..a9af56f750 100644
--- a/indra/newview/llpanelme.cpp
+++ b/indra/newview/llpanelme.cpp
@@ -37,7 +37,6 @@
#include "llfirstuse.h"
#include "llfloaterreg.h"
#include "llhints.h"
-#include "llsidetray.h"
#include "llviewercontrol.h"
#include "llviewerdisplayname.h"
@@ -49,16 +48,10 @@
#include "lltabcontainer.h"
#include "lltexturectrl.h"
-#define PICKER_SECOND_LIFE "2nd_life_pic"
-#define PICKER_FIRST_LIFE "real_world_pic"
-#define PANEL_PROFILE "panel_profile"
-
-static LLRegisterPanelClassWrapper<LLPanelMyProfileEdit> t_panel_me_profile_edit("edit_profile_panel");
static LLRegisterPanelClassWrapper<LLPanelMe> t_panel_me_profile("panel_me");
LLPanelMe::LLPanelMe(void)
: LLPanelProfile()
- , mEditPanel(NULL)
{
setAvatarId(gAgent.getID());
}
@@ -73,342 +66,4 @@ BOOL LLPanelMe::postBuild()
void LLPanelMe::onOpen(const LLSD& key)
{
LLPanelProfile::onOpen(key);
-
- // Removed this action as per SOCIAL-431 The first time a new resident opens the profile tab
- // in the sidebar, they see the old profile editing panel
- //
- //// 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() )
- //{
- // buildEditPanel();
- // openPanel(mEditPanel, getAvatarId());
- // gSavedSettings.setBOOL("MePanelOpened", true);
- //}
-}
-
-bool LLPanelMe::notifyChildren(const LLSD& info)
-{
- if (info.has("task-panel-action") && info["task-panel-action"].asString() == "handle-tri-state")
- {
- // Implement task panel tri-state behavior.
- //
- // When the button of an active open task panel is clicked, side tray
- // calls notifyChildren() on the panel, passing task-panel-action=>handle-tri-state as an argument.
- // The task panel is supposed to handle this by reverting to the default view,
- // i.e. closing any dependent panels like "pick info" or "profile edit".
-
- bool on_default_view = true;
-
- const LLRect& task_panel_rect = getRect();
- for (LLView* child = getFirstChild(); child; child = findNextSibling(child))
- {
- LLPanel* panel = dynamic_cast<LLPanel*>(child);
- if (!panel)
- continue;
-
- // *HACK: implement panel stack instead (e.g. me->pick_info->pick_edit).
- if (panel->getRect().getWidth() == task_panel_rect.getWidth() &&
- panel->getRect().getHeight() == task_panel_rect.getHeight() &&
- panel->getVisible())
- {
- panel->setVisible(FALSE);
- on_default_view = false;
- }
- }
-
- if (on_default_view)
- LLSideTray::getInstance()->collapseSideBar();
-
- return true; // this notification is only supposed to be handled by task panels
- }
-
- return LLPanel::notifyChildren(info);
-}
-
-void LLPanelMe::buildEditPanel()
-{
- if (NULL == mEditPanel)
- {
- mEditPanel = new LLPanelMyProfileEdit();
-
- // Note: Remove support for editing profile through this method.
- // All profile editing should go through the web.
- //mEditPanel->childSetAction("save_btn", boost::bind(&LLPanelMe::onSaveChangesClicked, this), this);
-
- mEditPanel->childSetAction("cancel_btn", boost::bind(&LLPanelMe::onCancelClicked, this), this);
- }
-}
-
-
-void LLPanelMe::onEditProfileClicked()
-{
- buildEditPanel();
- togglePanel(mEditPanel, getAvatarId()); // open
-}
-
-void LLPanelMe::onCancelClicked()
-{
- togglePanel(mEditPanel); // close
-}
-
-//////////////////////////////////////////////////////////////////////////
-//////////////////////////////////////////////////////////////////////////
-//////////////////////////////////////////////////////////////////////////
-
-LLPanelMyProfileEdit::LLPanelMyProfileEdit()
- : LLPanelMyProfile()
-{
- buildFromFile( "panel_edit_profile.xml");
-
- setAvatarId(gAgent.getID());
-
- LLAvatarNameCache::addUseDisplayNamesCallback(boost::bind(&LLPanelMyProfileEdit::onAvatarNameChanged, this));
-}
-
-void LLPanelMyProfileEdit::onOpen(const LLSD& key)
-{
- resetData();
-
- // Disable editing until data is loaded, or edited fields will be overwritten when data
- // is loaded.
- enableEditing(false);
-
- // force new avatar name fetch so we have latest update time
- LLAvatarNameCache::fetch(gAgent.getID());
- LLPanelMyProfile::onOpen(getAvatarId());
-
- LLAvatarName av_name;
- if (LLAvatarNameCache::useDisplayNames())
- {
- if (LLAvatarNameCache::get(gAgent.getID(), &av_name) && av_name.mIsDisplayNameDefault)
- {
- LLFirstUse::setDisplayName();
- }
- else
- {
- LLFirstUse::setDisplayName(false);
- }
- }
-
- if (LLAvatarNameCache::useDisplayNames())
- {
- getChild<LLUICtrl>("user_label")->setVisible( true );
- getChild<LLUICtrl>("user_slid")->setVisible( true );
- getChild<LLUICtrl>("display_name_label")->setVisible( true );
- getChild<LLUICtrl>("set_name")->setVisible( true );
- getChild<LLUICtrl>("set_name")->setEnabled( true );
- getChild<LLUICtrl>("solo_user_name")->setVisible( false );
- getChild<LLUICtrl>("solo_username_label")->setVisible( false );
- }
- else
- {
- getChild<LLUICtrl>("user_label")->setVisible( false );
- getChild<LLUICtrl>("user_slid")->setVisible( false );
- getChild<LLUICtrl>("display_name_label")->setVisible( false );
- getChild<LLUICtrl>("set_name")->setVisible( false );
- getChild<LLUICtrl>("set_name")->setEnabled( false );
- getChild<LLUICtrl>("solo_user_name")->setVisible( true );
- getChild<LLUICtrl>("solo_username_label")->setVisible( true );
- }
-}
-
-void LLPanelMyProfileEdit::onClose(const LLSD& key)
-{
- if (LLAvatarNameCache::useDisplayNames())
- {
- LLFirstUse::setDisplayName(false);
- }
-}
-
-void LLPanelMyProfileEdit::processProperties(void* data, EAvatarProcessorType type)
-{
- if(APT_PROPERTIES == type)
- {
- const LLAvatarData* avatar_data = static_cast<const LLAvatarData*>(data);
- if(avatar_data && getAvatarId() == avatar_data->avatar_id)
- {
- // *TODO dzaporozhan
- // Workaround for ticket EXT-1099, waiting for fix for ticket EXT-1128
- enableEditing(true);
- processProfileProperties(avatar_data);
- LLAvatarPropertiesProcessor::getInstance()->removeObserver(getAvatarId(),this);
- }
- }
-}
-
-void LLPanelMyProfileEdit::processProfileProperties(const LLAvatarData* avatar_data)
-{
- fillCommonData(avatar_data);
-
- // 'Home page' was hidden in LLPanelAvatarProfile::fillCommonData() to fix EXT-4734
- // Show 'Home page' in Edit My Profile (EXT-4873)
- getChildView("homepage_edit")->setVisible( true);
-
- fillPartnerData(avatar_data);
-
- fillAccountStatus(avatar_data);
-
- getChild<LLUICtrl>("show_in_search_checkbox")->setValue((BOOL)(avatar_data->flags & AVATAR_ALLOW_PUBLISH));
-
- LLAvatarNameCache::get(avatar_data->avatar_id,
- boost::bind(&LLPanelMyProfileEdit::onNameCache, this, _1, _2));
-}
-
-void LLPanelMyProfileEdit::onNameCache(const LLUUID& agent_id, const LLAvatarName& av_name)
-{
- getChild<LLUICtrl>("user_name")->setValue( av_name.mDisplayName );
- getChild<LLUICtrl>("user_slid")->setValue( av_name.mUsername );
- getChild<LLUICtrl>("user_name_small")->setValue( av_name.mDisplayName );
- getChild<LLUICtrl>("solo_user_name")->setValue( av_name.mDisplayName );
-
-
- if (LLAvatarNameCache::useDisplayNames())
- {
- getChild<LLUICtrl>("user_label")->setVisible( true );
- getChild<LLUICtrl>("user_slid")->setVisible( true );
- getChild<LLUICtrl>("display_name_label")->setVisible( true );
- getChild<LLUICtrl>("set_name")->setVisible( true );
- getChild<LLUICtrl>("set_name")->setEnabled( true );
-
- getChild<LLUICtrl>("solo_user_name")->setVisible( false );
- getChild<LLUICtrl>("solo_username_label")->setVisible( false );
-
- // show smaller display name if too long to display in regular size
- if (getChild<LLTextBox>("user_name")->getTextPixelWidth() > getChild<LLTextBox>("user_name")->getRect().getWidth())
- {
- getChild<LLUICtrl>("user_name_small")->setVisible( true );
- getChild<LLUICtrl>("user_name")->setVisible( false );
- }
- else
- {
- getChild<LLUICtrl>("user_name_small")->setVisible( false );
- getChild<LLUICtrl>("user_name")->setVisible( true );
- }
- }
- else
- {
- getChild<LLUICtrl>("user_label")->setVisible( false );
- getChild<LLUICtrl>("user_slid")->setVisible( false );
- getChild<LLUICtrl>("display_name_label")->setVisible( false );
- getChild<LLUICtrl>("set_name")->setVisible( false );
- getChild<LLUICtrl>("set_name")->setEnabled( false );
-
- getChild<LLUICtrl>("solo_user_name")->setVisible( true );
- getChild<LLUICtrl>("user_name_small")->setVisible( false );
- getChild<LLUICtrl>("user_name")->setVisible( false );
- getChild<LLUICtrl>("solo_username_label")->setVisible( true );
- }
-}
-
-
-void LLPanelMyProfileEdit::onAvatarNameChanged()
-{
- LLAvatarNameCache::get(getAvatarId(),
- boost::bind(&LLPanelMyProfileEdit::onNameCache, this, _1, _2));
-}
-
-BOOL LLPanelMyProfileEdit::postBuild()
-{
- initTexturePickerMouseEvents();
-
- getChild<LLUICtrl>("partner_edit_link")->setTextArg("[URL]", getString("partner_edit_link_url"));
- getChild<LLUICtrl>("my_account_link")->setTextArg("[URL]", getString("my_account_link_url"));
-
- getChild<LLUICtrl>("set_name")->setCommitCallback(
- boost::bind(&LLPanelMyProfileEdit::onClickSetName, this));
-
- LLHints::registerHintTarget("set_display_name", getChild<LLUICtrl>("set_name")->getHandle());
- LLViewerDisplayName::addNameChangedCallback(boost::bind(&LLPanelMyProfileEdit::onAvatarNameChanged, this));
- return LLPanelAvatarProfile::postBuild();
-}
-/**
- * Inits map with texture picker and appropriate edit icon.
- * Sets callbacks of Mouse Enter and Mouse Leave signals of Texture Pickers
- */
-void LLPanelMyProfileEdit::initTexturePickerMouseEvents()
-{
- LLTextureCtrl* text_pic = getChild<LLTextureCtrl>(PICKER_SECOND_LIFE);
- LLIconCtrl* text_icon = getChild<LLIconCtrl>("2nd_life_edit_icon");
- mTextureEditIconMap[text_pic->getName()] = text_icon;
- text_pic->setMouseEnterCallback(boost::bind(&LLPanelMyProfileEdit::onTexturePickerMouseEnter, this, _1));
- text_pic->setMouseLeaveCallback(boost::bind(&LLPanelMyProfileEdit::onTexturePickerMouseLeave, this, _1));
- text_icon->setVisible(FALSE);
-
- text_pic = getChild<LLTextureCtrl>(PICKER_FIRST_LIFE);
- text_icon = getChild<LLIconCtrl>("real_world_edit_icon");
- mTextureEditIconMap[text_pic->getName()] = text_icon;
- text_pic->setMouseEnterCallback(boost::bind(&LLPanelMyProfileEdit::onTexturePickerMouseEnter, this, _1));
- text_pic->setMouseLeaveCallback(boost::bind(&LLPanelMyProfileEdit::onTexturePickerMouseLeave, this, _1));
- text_icon->setVisible(FALSE);
-}
-
-void LLPanelMyProfileEdit::resetData()
-{
- LLPanelMyProfile::resetData();
-
- //childSetTextArg("name_text", "[FIRST]", LLStringUtil::null);
- //childSetTextArg("name_text", "[LAST]", LLStringUtil::null);
- getChild<LLUICtrl>("user_name")->setValue( LLSD() );
- getChild<LLUICtrl>("user_slid")->setValue( LLSD() );
- getChild<LLUICtrl>("solo_user_name")->setValue( LLSD() );
- getChild<LLUICtrl>("user_name_small")->setValue( LLSD() );
-}
-
-void LLPanelMyProfileEdit::onTexturePickerMouseEnter(LLUICtrl* ctrl)
-{
- mTextureEditIconMap[ctrl->getName()]->setVisible(TRUE);
-}
-void LLPanelMyProfileEdit::onTexturePickerMouseLeave(LLUICtrl* ctrl)
-{
- mTextureEditIconMap[ctrl->getName()]->setVisible(FALSE);
-}
-
-void LLPanelMyProfileEdit::onClickSetName()
-{
- LLAvatarNameCache::get(getAvatarId(),
- boost::bind(&LLPanelMyProfileEdit::onAvatarNameCache,
- this, _1, _2));
-
- LLFirstUse::setDisplayName(false);
-}
-
-void LLPanelMyProfileEdit::onAvatarNameCache(const LLUUID& agent_id, const LLAvatarName& av_name)
-{
- if (av_name.mDisplayName.empty())
- {
- // something is wrong, tell user to try again later
- LLNotificationsUtil::add("SetDisplayNameFailedGeneric");
- return;
- }
-
- llinfos << "name-change now " << LLDate::now() << " next_update "
- << LLDate(av_name.mNextUpdate) << llendl;
- F64 now_secs = LLDate::now().secondsSinceEpoch();
-
- if (now_secs < av_name.mNextUpdate)
- {
- // if the update time is more than a year in the future, it means updates have been blocked
- // show a more general message
- const int YEAR = 60*60*24*365;
- if (now_secs + YEAR < av_name.mNextUpdate)
- {
- LLNotificationsUtil::add("SetDisplayNameBlocked");
- return;
- }
- }
-
- LLFloaterReg::showInstance("display_name");
-}
-
-void LLPanelMyProfileEdit::enableEditing(bool enable)
-{
- getChildView("2nd_life_pic")->setEnabled(enable);
- getChildView("real_world_pic")->setEnabled(enable);
- getChildView("sl_description_edit")->setEnabled(enable);
- getChildView("fl_description_edit")->setEnabled(enable);
- getChildView("homepage_edit")->setEnabled(enable);
- getChildView("show_in_search_checkbox")->setEnabled(enable);
}
diff --git a/indra/newview/llpanelme.h b/indra/newview/llpanelme.h
index f27f5a268e..60e9d4317d 100644
--- a/indra/newview/llpanelme.h
+++ b/indra/newview/llpanelme.h
@@ -30,15 +30,9 @@
#include "llpanel.h"
#include "llpanelprofile.h"
-class LLAvatarName;
-class LLPanelMyProfileEdit;
-class LLPanelProfile;
-class LLIconCtrl;
-
/**
-* Panel for displaying Agent's profile, it consists of two sub panels - Profile
-* and Picks.
-* LLPanelMe allows user to edit his profile and picks.
+* Panel for displaying Agent's Picks and Classifieds panel.
+* LLPanelMe allows user to edit his picks and classifieds.
*/
class LLPanelMe : public LLPanelProfile
{
@@ -49,64 +43,8 @@ public:
LLPanelMe();
/*virtual*/ void onOpen(const LLSD& key);
- /*virtual*/ bool notifyChildren(const LLSD& info);
/*virtual*/ BOOL postBuild();
-
-private:
-
- void buildEditPanel();
-
- void onEditProfileClicked();
- void onCancelClicked();
-
- LLPanelMyProfileEdit * mEditPanel;
-
-};
-
-class LLPanelMyProfileEdit : public LLPanelMyProfile
-{
- LOG_CLASS(LLPanelMyProfileEdit);
-
-public:
-
- LLPanelMyProfileEdit();
-
- /*virtual*/void processProperties(void* data, EAvatarProcessorType type);
-
- /*virtual*/BOOL postBuild();
-
- /*virtual*/ void onOpen(const LLSD& key);
- /*virtual*/ void onClose(const LLSD& key);
-
- void onAvatarNameChanged();
-
-protected:
-
- /*virtual*/void resetData();
-
- void processProfileProperties(const LLAvatarData* avatar_data);
- void onNameCache(const LLUUID& agent_id, const LLAvatarName& av_name);
-
-private:
- void initTexturePickerMouseEvents();
- void onTexturePickerMouseEnter(LLUICtrl* ctrl);
- void onTexturePickerMouseLeave(LLUICtrl* ctrl);
- void onClickSetName();
- void onAvatarNameCache(const LLUUID& id, const LLAvatarName& av_name);
-
- /**
- * Enabled/disables controls to prevent overwriting edited data upon receiving
- * current data from server.
- */
- void enableEditing(bool enable);
-
-
-
-private:
- // map TexturePicker name => Edit Icon pointer should be visible while hovering Texture Picker
- typedef std::map<std::string, LLIconCtrl*> texture_edit_icon_map_t;
- texture_edit_icon_map_t mTextureEditIconMap;
};
#endif // LL_LLPANELMEPROFILE_H
diff --git a/indra/newview/llpanelnearbymedia.cpp b/indra/newview/llpanelnearbymedia.cpp
index 2bbd15ae11..c01adc3c35 100644
--- a/indra/newview/llpanelnearbymedia.cpp
+++ b/indra/newview/llpanelnearbymedia.cpp
@@ -52,6 +52,7 @@
#include "llvovolume.h"
#include "llstatusbar.h"
#include "llsdutil.h"
+#include "llvieweraudio.h"
#include "llfloaterreg.h"
#include "llfloaterpreference.h" // for the gear icon
@@ -807,14 +808,26 @@ bool LLPanelNearByMedia::setDisabled(const LLUUID &row_id, bool disabled)
{
if (row_id == PARCEL_AUDIO_LIST_ITEM_UUID)
{
- if (disabled) onClickParcelAudioStop();
- else onClickParcelAudioStart();
+ if (disabled)
+ {
+ onClickParcelAudioStop();
+ }
+ else
+ {
+ onClickParcelAudioPlay();
+ }
return true;
}
else if (row_id == PARCEL_MEDIA_LIST_ITEM_UUID)
{
- if (disabled) onClickDisableParcelMedia();
- else onClickEnableParcelMedia();
+ if (disabled)
+ {
+ onClickDisableParcelMedia();
+ }
+ else
+ {
+ onClickEnableParcelMedia();
+ }
return true;
}
else {
@@ -857,24 +870,11 @@ void LLPanelNearByMedia::onClickParcelMediaPause()
LLViewerParcelMedia::pause();
}
-void LLPanelNearByMedia::onClickParcelAudioStart()
-{
- // User *explicitly* started the internet stream, so keep the stream
- // playing and updated as they cross to other parcels etc.
- mParcelAudioAutoStart = true;
-
- if (!gAudiop)
- return;
-
- gAudiop->startInternetStream(LLViewerMedia::getParcelAudioURL());
-}
-
void LLPanelNearByMedia::onClickParcelAudioPlay()
{
// User *explicitly* started the internet stream, so keep the stream
// playing and updated as they cross to other parcels etc.
mParcelAudioAutoStart = true;
-
if (!gAudiop)
return;
@@ -883,8 +883,9 @@ void LLPanelNearByMedia::onClickParcelAudioPlay()
// 'false' means unpause
gAudiop->pauseInternetStream(false);
}
- else {
- gAudiop->startInternetStream(LLViewerMedia::getParcelAudioURL());
+ else
+ {
+ LLViewerAudio::getInstance()->startInternetStreamWithAutoFade(LLViewerMedia::getParcelAudioURL());
}
}
@@ -894,11 +895,10 @@ void LLPanelNearByMedia::onClickParcelAudioStop()
// re-start audio when i.e. they move to another parcel, until
// they explicitly start it again.
mParcelAudioAutoStart = false;
-
if (!gAudiop)
return;
- gAudiop->stopInternetStream();
+ LLViewerAudio::getInstance()->stopInternetStreamWithAutoFade();
}
void LLPanelNearByMedia::onClickParcelAudioPause()
diff --git a/indra/newview/llpanelnearbymedia.h b/indra/newview/llpanelnearbymedia.h
index be4d313743..c3634de9b4 100644
--- a/indra/newview/llpanelnearbymedia.h
+++ b/indra/newview/llpanelnearbymedia.h
@@ -115,7 +115,6 @@ private:
void onClickParcelMediaPause();
void onClickParcelAudioPlay();
void onClickParcelAudioStop();
- void onClickParcelAudioStart();
void onClickParcelAudioPause();
void onCheckAutoPlay();
void onAdvancedButtonClick();
diff --git a/indra/newview/llpanelobjectinventory.cpp b/indra/newview/llpanelobjectinventory.cpp
index 44364b5831..98ea680504 100644
--- a/indra/newview/llpanelobjectinventory.cpp
+++ b/indra/newview/llpanelobjectinventory.cpp
@@ -57,7 +57,6 @@
#include "llpreviewtexture.h"
#include "llscrollcontainer.h"
#include "llselectmgr.h"
-#include "llsidetray.h"
#include "llstatusbar.h"
#include "lltooldraganddrop.h"
#include "lltrans.h"
diff --git a/indra/newview/llpaneloutfitsinventory.cpp b/indra/newview/llpaneloutfitsinventory.cpp
index a90f864ae2..f90236f6f2 100644
--- a/indra/newview/llpaneloutfitsinventory.cpp
+++ b/indra/newview/llpaneloutfitsinventory.cpp
@@ -31,6 +31,7 @@
#include "llnotificationsutil.h"
#include "lltabcontainer.h"
+#include "llfloatersidepanelcontainer.h"
#include "llinventoryfunctions.h"
#include "llinventorymodelbackgroundfetch.h"
#include "llagentwearables.h"
@@ -40,7 +41,6 @@
#include "llpanelwearing.h"
#include "llsaveoutfitcombobtn.h"
#include "llsidepanelappearance.h"
-#include "llsidetray.h"
#include "llviewerfoldertype.h"
static const std::string OUTFITS_TAB_NAME = "outfitslist_tab";
@@ -222,7 +222,7 @@ void LLPanelOutfitsInventory::onSave()
//static
LLPanelOutfitsInventory* LLPanelOutfitsInventory::findInstance()
{
- return dynamic_cast<LLPanelOutfitsInventory*>(LLSideTray::getInstance()->getPanel("panel_outfits_inventory"));
+ return dynamic_cast<LLPanelOutfitsInventory*>(LLFloaterSidePanelContainer::getPanel("appearance", "panel_outfits_inventory"));
}
//////////////////////////////////////////////////////////////////////////////////
@@ -319,8 +319,7 @@ void LLPanelOutfitsInventory::onWearablesLoading()
// static
LLSidepanelAppearance* LLPanelOutfitsInventory::getAppearanceSP()
{
- static LLSidepanelAppearance* panel_appearance =
- dynamic_cast<LLSidepanelAppearance*>
- (LLSideTray::getInstance()->getPanel("sidepanel_appearance"));
+ LLSidepanelAppearance* panel_appearance =
+ dynamic_cast<LLSidepanelAppearance*>(LLFloaterSidePanelContainer::getPanel("appearance"));
return panel_appearance;
}
diff --git a/indra/newview/llpanelpeople.cpp b/indra/newview/llpanelpeople.cpp
index e3a7b749ea..9c46f04abf 100644
--- a/indra/newview/llpanelpeople.cpp
+++ b/indra/newview/llpanelpeople.cpp
@@ -29,6 +29,7 @@
// libs
#include "llavatarname.h"
#include "llfloaterreg.h"
+#include "llfloatersidepanelcontainer.h"
#include "llmenubutton.h"
#include "llmenugl.h"
#include "llnotificationsutil.h"
@@ -56,7 +57,6 @@
#include "llinventoryobserver.h"
#include "llnetmap.h"
#include "llpanelpeoplemenus.h"
-#include "llsidetray.h"
#include "llsidetraypanelcontainer.h"
#include "llrecentpeople.h"
#include "llviewercontrol.h" // for gSavedSettings
@@ -526,11 +526,11 @@ LLPanelPeople::~LLPanelPeople()
LLVoiceClient::getInstance()->removeObserver(this);
}
- LLView::deleteViewByHandle(mGroupPlusMenuHandle);
- LLView::deleteViewByHandle(mNearbyViewSortMenuHandle);
- LLView::deleteViewByHandle(mFriendsViewSortMenuHandle);
- LLView::deleteViewByHandle(mGroupsViewSortMenuHandle);
- LLView::deleteViewByHandle(mRecentViewSortMenuHandle);
+ if (mGroupPlusMenuHandle.get()) mGroupPlusMenuHandle.get()->die();
+ if (mNearbyViewSortMenuHandle.get()) mNearbyViewSortMenuHandle.get()->die();
+ if (mNearbyViewSortMenuHandle.get()) mNearbyViewSortMenuHandle.get()->die();
+ if (mGroupsViewSortMenuHandle.get()) mGroupsViewSortMenuHandle.get()->die();
+ if (mRecentViewSortMenuHandle.get()) mRecentViewSortMenuHandle.get()->die();
}
@@ -1283,6 +1283,10 @@ void LLPanelPeople::onFriendsViewSortMenuItemClicked(const LLSD& userdata)
mAllFriendList->showPermissions(show_permissions);
mOnlineFriendList->showPermissions(show_permissions);
}
+ else if (chosen_item == "panel_block_list_sidetray")
+ {
+ LLFloaterSidePanelContainer::showPanel("people", "panel_block_list_sidetray", LLSD());
+ }
}
void LLPanelPeople::onGroupsViewSortMenuItemClicked(const LLSD& userdata)
@@ -1315,6 +1319,10 @@ void LLPanelPeople::onNearbyViewSortMenuItemClicked(const LLSD& userdata)
{
setSortOrder(mNearbyList, E_SORT_BY_DISTANCE);
}
+ else if (chosen_item == "panel_block_list_sidetray")
+ {
+ LLFloaterSidePanelContainer::showPanel("people", "panel_block_list_sidetray", LLSD());
+ }
}
bool LLPanelPeople::onNearbyViewSortMenuItemCheck(const LLSD& userdata)
@@ -1348,6 +1356,10 @@ void LLPanelPeople::onRecentViewSortMenuItemClicked(const LLSD& userdata)
{
mRecentList->toggleIcons();
}
+ else if (chosen_item == "panel_block_list_sidetray")
+ {
+ LLFloaterSidePanelContainer::showPanel("people", "panel_block_list_sidetray", LLSD());
+ }
}
bool LLPanelPeople::onFriendsViewSortMenuItemCheck(const LLSD& userdata)
@@ -1439,7 +1451,7 @@ bool LLPanelPeople::notifyChildren(const LLSD& info)
container->onOpen(LLSD().with(LLSideTrayPanelContainer::PARAM_SUB_PANEL_NAME, getName()));
}
else
- LLSideTray::getInstance()->collapseSideBar();
+ LLFloaterReg::hideInstance("people");
return true; // this notification is only supposed to be handled by task panels
}
diff --git a/indra/newview/llpanelpicks.cpp b/indra/newview/llpanelpicks.cpp
index ddce83c616..cfbc8f1a94 100755
--- a/indra/newview/llpanelpicks.cpp
+++ b/indra/newview/llpanelpicks.cpp
@@ -35,6 +35,7 @@
#include "lldispatcher.h"
#include "llflatlistview.h"
#include "llfloaterreg.h"
+#include "llfloatersidepanelcontainer.h"
#include "llfloaterworldmap.h"
#include "llnotificationsutil.h"
#include "lltexturectrl.h"
@@ -48,11 +49,11 @@
#include "llaccordionctrl.h"
#include "llaccordionctrltab.h"
#include "llavatarpropertiesprocessor.h"
+#include "llfloatersidepanelcontainer.h"
#include "llpanelavatar.h"
#include "llpanelprofile.h"
#include "llpanelpick.h"
#include "llpanelclassified.h"
-#include "llsidetray.h"
static const std::string XML_BTN_NEW = "new_btn";
static const std::string XML_BTN_DELETE = "trash_btn";
@@ -129,11 +130,14 @@ public:
void createPick()
{
- LLSD params;
- params["id"] = gAgent.getID();
- params["open_tab_name"] = "panel_picks";
- params["show_tab_panel"] = "create_pick";
- LLSideTray::getInstance()->showPanel("panel_me", params);
+ // open the new pick panel on the Picks floater
+ LLFloater* picks_floater = LLFloaterReg::showInstance("picks");
+
+ LLPanelPicks* picks = picks_floater->findChild<LLPanelPicks>("panel_picks");
+ if (picks)
+ {
+ picks->createNewPick();
+ }
}
void editPick(LLPickData* pick_info)
@@ -146,8 +150,7 @@ public:
params["snapshot_id"] = pick_info->snapshot_id;
params["pick_name"] = pick_info->name;
params["pick_desc"] = pick_info->desc;
-
- LLSideTray::getInstance()->showPanel("panel_me", params);
+ LLFloaterSidePanelContainer::showPanel("picks", params);
}
/*virtual*/ void processProperties(void* data, EAvatarProcessorType type)
@@ -247,12 +250,14 @@ public:
void createClassified()
{
- // open the new classified panel on the Me > Picks sidetray
- LLSD params;
- params["id"] = gAgent.getID();
- params["open_tab_name"] = "panel_picks";
- params["show_tab_panel"] = "create_classified";
- LLSideTray::getInstance()->showPanel("panel_me", params);
+ // open the new classified panel on the Picks floater
+ LLFloater* picks_floater = LLFloaterReg::showInstance("picks");
+
+ LLPanelPicks* picks = picks_floater->findChild<LLPanelPicks>("panel_picks");
+ if (picks)
+ {
+ picks->createNewClassified();
+ }
}
void openClassified(LLAvatarClassifiedInfo* c_info)
@@ -270,7 +275,7 @@ public:
params["classified_name"] = c_info->name;
params["classified_desc"] = c_info->description;
params["from_search"] = true;
- LLSideTray::getInstance()->showPanel("panel_profile_view", params);
+ LLFloaterSidePanelContainer::showPanel("picks", params);
}
else if (mRequestVerb == "edit")
{
@@ -283,7 +288,7 @@ public:
params["open_tab_name"] = "panel_picks";
params["show_tab_panel"] = "edit_classified";
params["classified_id"] = c_info->classified_id;
- LLSideTray::getInstance()->showPanel("panel_me", params);
+ LLFloaterSidePanelContainer::showPanel("my_profile", params);
}
else
{
@@ -1043,13 +1048,10 @@ void LLPanelPicks::createPickInfoPanel()
void LLPanelPicks::createClassifiedInfoPanel()
{
- if(!mPanelClassifiedInfo)
- {
- mPanelClassifiedInfo = LLPanelClassifiedInfo::create();
- mPanelClassifiedInfo->setExitCallback(boost::bind(&LLPanelPicks::onPanelClassifiedClose, this, mPanelClassifiedInfo));
- mPanelClassifiedInfo->setEditClassifiedCallback(boost::bind(&LLPanelPicks::onPanelClassifiedEdit, this));
- mPanelClassifiedInfo->setVisible(FALSE);
- }
+ mPanelClassifiedInfo = LLPanelClassifiedInfo::create();
+ mPanelClassifiedInfo->setExitCallback(boost::bind(&LLPanelPicks::onPanelClassifiedClose, this, mPanelClassifiedInfo));
+ mPanelClassifiedInfo->setEditClassifiedCallback(boost::bind(&LLPanelPicks::onPanelClassifiedEdit, this));
+ mPanelClassifiedInfo->setVisible(FALSE);
}
void LLPanelPicks::createClassifiedEditPanel(LLPanelClassifiedEdit** panel)
@@ -1067,14 +1069,11 @@ void LLPanelPicks::createClassifiedEditPanel(LLPanelClassifiedEdit** panel)
void LLPanelPicks::createPickEditPanel()
{
- if(!mPanelPickEdit)
- {
- mPanelPickEdit = LLPanelPickEdit::create();
- mPanelPickEdit->setExitCallback(boost::bind(&LLPanelPicks::onPanelPickClose, this, mPanelPickEdit));
- mPanelPickEdit->setSaveCallback(boost::bind(&LLPanelPicks::onPanelPickSave, this, mPanelPickEdit));
- mPanelPickEdit->setCancelCallback(boost::bind(&LLPanelPicks::onPanelPickClose, this, mPanelPickEdit));
- mPanelPickEdit->setVisible(FALSE);
- }
+ mPanelPickEdit = LLPanelPickEdit::create();
+ mPanelPickEdit->setExitCallback(boost::bind(&LLPanelPicks::onPanelPickClose, this, mPanelPickEdit));
+ mPanelPickEdit->setSaveCallback(boost::bind(&LLPanelPicks::onPanelPickSave, this, mPanelPickEdit));
+ mPanelPickEdit->setCancelCallback(boost::bind(&LLPanelPicks::onPanelPickClose, this, mPanelPickEdit));
+ mPanelPickEdit->setVisible(FALSE);
}
// void LLPanelPicks::openPickEditPanel(LLPickItem* pick)
diff --git a/indra/newview/llpanelpicks.h b/indra/newview/llpanelpicks.h
index 29db110523..3bb7413ac3 100755
--- a/indra/newview/llpanelpicks.h
+++ b/indra/newview/llpanelpicks.h
@@ -82,6 +82,9 @@ public:
// parent panels failed to work (picks related code was in my profile panel)
void setProfilePanel(LLPanelProfile* profile_panel);
+ void createNewPick();
+ void createNewClassified();
+
protected:
/*virtual*/void updateButtons();
@@ -115,9 +118,6 @@ private:
bool onEnableMenuItem(const LLSD& user_data);
- void createNewPick();
- void createNewClassified();
-
void openPickInfo();
void openClassifiedInfo();
void openClassifiedInfo(const LLSD& params);
diff --git a/indra/newview/llpanelplaces.cpp b/indra/newview/llpanelplaces.cpp
index 1e510a2d7b..6d321d4716 100644
--- a/indra/newview/llpanelplaces.cpp
+++ b/indra/newview/llpanelplaces.cpp
@@ -39,6 +39,7 @@
#include "llfiltereditor.h"
#include "llfirstuse.h"
#include "llfloaterreg.h"
+#include "llfloatersidepanelcontainer.h"
#include "llmenubutton.h"
#include "llnotificationsutil.h"
#include "lltabcontainer.h"
@@ -64,7 +65,6 @@
#include "llpanelplaceprofile.h"
#include "llpanelteleporthistory.h"
#include "llremoteparcelrequest.h"
-#include "llsidetray.h"
#include "llteleporthistorystorage.h"
#include "lltoggleablemenu.h"
#include "llviewerinventory.h"
@@ -82,6 +82,7 @@ static const std::string CREATE_LANDMARK_INFO_TYPE = "create_landmark";
static const std::string LANDMARK_INFO_TYPE = "landmark";
static const std::string REMOTE_PLACE_INFO_TYPE = "remote_place";
static const std::string TELEPORT_HISTORY_INFO_TYPE = "teleport_history";
+static const std::string LANDMARK_TAB_INFO_TYPE = "open_landmark_tab";
// Support for secondlife:///app/parcel/{UUID}/about SLapps
class LLParcelHandler : public LLCommandHandler
@@ -115,7 +116,7 @@ public:
LLSD key;
key["type"] = "remote_place";
key["id"] = parcel_id;
- LLSideTray::getInstance()->showPanel("panel_places", key);
+ LLFloaterSidePanelContainer::showPanel("places", key);
return true;
}
}
@@ -151,18 +152,16 @@ class LLPlacesInventoryObserver : public LLInventoryAddedObserver
{
public:
LLPlacesInventoryObserver(LLPanelPlaces* places_panel) :
- mPlaces(places_panel),
- mTabsCreated(false)
+ mPlaces(places_panel)
{}
/*virtual*/ void changed(U32 mask)
{
LLInventoryAddedObserver::changed(mask);
- if (!mTabsCreated && mPlaces)
+ if (mPlaces && !mPlaces->tabsCreated())
{
mPlaces->createTabs();
- mTabsCreated = true;
}
}
@@ -175,7 +174,6 @@ protected:
private:
LLPanelPlaces* mPlaces;
- bool mTabsCreated;
};
class LLPlacesRemoteParcelInfoObserver : public LLRemoteParcelInfoObserver
@@ -244,7 +242,8 @@ LLPanelPlaces::LLPanelPlaces()
mPlaceMenu(NULL),
mLandmarkMenu(NULL),
mPosGlobal(),
- isLandmarkEditModeOn(false)
+ isLandmarkEditModeOn(false),
+ mTabsCreated(false)
{
mParcelObserver = new LLPlacesParcelObserver(this);
mInventoryObserver = new LLPlacesInventoryObserver(this);
@@ -252,7 +251,7 @@ LLPanelPlaces::LLPanelPlaces()
gInventory.addObserver(mInventoryObserver);
- LLViewerParcelMgr::getInstance()->addAgentParcelChangedCallback(
+ mAgentParcelChangedConnection = LLViewerParcelMgr::getInstance()->addAgentParcelChangedCallback(
boost::bind(&LLPanelPlaces::updateVerbs, this));
//buildFromFile( "panel_places.xml"); // Called from LLRegisterPanelClass::defaultPanelClassBuilder()
@@ -268,6 +267,11 @@ LLPanelPlaces::~LLPanelPlaces()
delete mInventoryObserver;
delete mParcelObserver;
delete mRemoteParcelObserver;
+
+ if (mAgentParcelChangedConnection.connected())
+ {
+ mAgentParcelChangedConnection.disconnect();
+ }
}
BOOL LLPanelPlaces::postBuild()
@@ -349,6 +353,9 @@ BOOL LLPanelPlaces::postBuild()
LLComboBox* folder_combo = mLandmarkInfo->getChild<LLComboBox>("folder_combo");
folder_combo->setCommitCallback(boost::bind(&LLPanelPlaces::onEditButtonClicked, this));
+ createTabs();
+ updateVerbs();
+
return TRUE;
}
@@ -359,83 +366,104 @@ void LLPanelPlaces::onOpen(const LLSD& key)
if (key.size() != 0)
{
- mFilterEditor->clear();
- onFilterEdit("", false);
-
- mPlaceInfoType = key["type"].asString();
- mPosGlobal.setZero();
- mItem = NULL;
- isLandmarkEditModeOn = false;
- togglePlaceInfoPanel(TRUE);
-
- if (mPlaceInfoType == AGENT_INFO_TYPE)
+ std::string key_type = key["type"].asString();
+ if (key_type == LANDMARK_TAB_INFO_TYPE)
{
- mPlaceProfile->setInfoType(LLPanelPlaceInfo::AGENT);
+ // Small hack: We need to toggle twice. The first toggle moves from the Landmark
+ // or Teleport History info panel to the Landmark or Teleport History list panel.
+ // For this first toggle, the mPlaceInfoType should be the one previously used so
+ // that the state can be corretly set.
+ // The second toggle forces the list to be set to Landmark.
+ // This avoids extracting and duplicating all the state logic from togglePlaceInfoPanel()
+ // here or some specific private method
+ togglePlaceInfoPanel(FALSE);
+ mPlaceInfoType = key_type;
+ togglePlaceInfoPanel(FALSE);
+ // Update the active tab
+ onTabSelected();
+ // Update the buttons at the bottom of the panel
+ updateVerbs();
}
- else if (mPlaceInfoType == CREATE_LANDMARK_INFO_TYPE)
+ else
{
- mLandmarkInfo->setInfoType(LLPanelPlaceInfo::CREATE_LANDMARK);
+ mFilterEditor->clear();
+ onFilterEdit("", false);
- if (key.has("x") && key.has("y") && key.has("z"))
+ mPlaceInfoType = key_type;
+ mPosGlobal.setZero();
+ mItem = NULL;
+ isLandmarkEditModeOn = false;
+ togglePlaceInfoPanel(TRUE);
+
+ if (mPlaceInfoType == AGENT_INFO_TYPE)
{
- mPosGlobal = LLVector3d(key["x"].asReal(),
- key["y"].asReal(),
- key["z"].asReal());
+ mPlaceProfile->setInfoType(LLPanelPlaceInfo::AGENT);
}
- else
+ else if (mPlaceInfoType == CREATE_LANDMARK_INFO_TYPE)
{
- mPosGlobal = gAgent.getPositionGlobal();
+ mLandmarkInfo->setInfoType(LLPanelPlaceInfo::CREATE_LANDMARK);
+
+ if (key.has("x") && key.has("y") && key.has("z"))
+ {
+ mPosGlobal = LLVector3d(key["x"].asReal(),
+ key["y"].asReal(),
+ key["z"].asReal());
+ }
+ else
+ {
+ mPosGlobal = gAgent.getPositionGlobal();
+ }
+
+ mLandmarkInfo->displayParcelInfo(LLUUID(), mPosGlobal);
+
+ mSaveBtn->setEnabled(FALSE);
}
-
- mLandmarkInfo->displayParcelInfo(LLUUID(), mPosGlobal);
-
- mSaveBtn->setEnabled(FALSE);
- }
- else if (mPlaceInfoType == LANDMARK_INFO_TYPE)
- {
- mLandmarkInfo->setInfoType(LLPanelPlaceInfo::LANDMARK);
-
- LLInventoryItem* item = gInventory.getItem(key["id"].asUUID());
- if (!item)
- return;
-
- setItem(item);
- }
- else if (mPlaceInfoType == REMOTE_PLACE_INFO_TYPE)
- {
- if (key.has("id"))
+ else if (mPlaceInfoType == LANDMARK_INFO_TYPE)
{
- LLUUID parcel_id = key["id"].asUUID();
- mPlaceProfile->setParcelID(parcel_id);
+ mLandmarkInfo->setInfoType(LLPanelPlaceInfo::LANDMARK);
- // query the server to get the global 3D position of this
- // parcel - we need this for teleport/mapping functions.
- mRemoteParcelObserver->setParcelID(parcel_id);
+ LLInventoryItem* item = gInventory.getItem(key["id"].asUUID());
+ if (!item)
+ return;
+
+ setItem(item);
}
- else
+ else if (mPlaceInfoType == REMOTE_PLACE_INFO_TYPE)
{
- mPosGlobal = LLVector3d(key["x"].asReal(),
- key["y"].asReal(),
- key["z"].asReal());
- mPlaceProfile->displayParcelInfo(LLUUID(), mPosGlobal);
+ if (key.has("id"))
+ {
+ LLUUID parcel_id = key["id"].asUUID();
+ mPlaceProfile->setParcelID(parcel_id);
+
+ // query the server to get the global 3D position of this
+ // parcel - we need this for teleport/mapping functions.
+ mRemoteParcelObserver->setParcelID(parcel_id);
+ }
+ else
+ {
+ mPosGlobal = LLVector3d(key["x"].asReal(),
+ key["y"].asReal(),
+ key["z"].asReal());
+ mPlaceProfile->displayParcelInfo(LLUUID(), mPosGlobal);
+ }
+
+ mPlaceProfile->setInfoType(LLPanelPlaceInfo::PLACE);
}
+ else if (mPlaceInfoType == TELEPORT_HISTORY_INFO_TYPE)
+ {
+ S32 index = key["id"].asInteger();
- mPlaceProfile->setInfoType(LLPanelPlaceInfo::PLACE);
- }
- else if (mPlaceInfoType == TELEPORT_HISTORY_INFO_TYPE)
- {
- S32 index = key["id"].asInteger();
+ const LLTeleportHistoryStorage::slurl_list_t& hist_items =
+ LLTeleportHistoryStorage::getInstance()->getItems();
- const LLTeleportHistoryStorage::slurl_list_t& hist_items =
- LLTeleportHistoryStorage::getInstance()->getItems();
+ mPosGlobal = hist_items[index].mGlobalPos;
- mPosGlobal = hist_items[index].mGlobalPos;
+ mPlaceProfile->setInfoType(LLPanelPlaceInfo::TELEPORT_HISTORY);
+ mPlaceProfile->displayParcelInfo(LLUUID(), mPosGlobal);
+ }
- mPlaceProfile->setInfoType(LLPanelPlaceInfo::TELEPORT_HISTORY);
- mPlaceProfile->displayParcelInfo(LLUUID(), mPosGlobal);
+ updateVerbs();
}
-
- updateVerbs();
}
LLViewerParcelMgr* parcel_mgr = LLViewerParcelMgr::getInstance();
@@ -936,7 +964,8 @@ void LLPanelPlaces::togglePlaceInfoPanel(BOOL visible)
}
}
else if (mPlaceInfoType == CREATE_LANDMARK_INFO_TYPE ||
- mPlaceInfoType == LANDMARK_INFO_TYPE)
+ mPlaceInfoType == LANDMARK_INFO_TYPE ||
+ mPlaceInfoType == LANDMARK_TAB_INFO_TYPE)
{
mLandmarkInfo->setVisible(visible);
@@ -954,13 +983,15 @@ void LLPanelPlaces::togglePlaceInfoPanel(BOOL visible)
{
LLLandmarksPanel* landmarks_panel =
dynamic_cast<LLLandmarksPanel*>(mTabContainer->getPanelByName("Landmarks"));
- if (landmarks_panel && mItem.notNull())
+ if (landmarks_panel)
{
// If a landmark info is being closed we open the landmarks tab
// and set this landmark selected.
mTabContainer->selectTabPanel(landmarks_panel);
-
- landmarks_panel->setItemSelected(mItem->getUUID(), TRUE);
+ if (mItem.notNull())
+ {
+ landmarks_panel->setItemSelected(mItem->getUUID(), TRUE);
+ }
}
}
}
@@ -1025,7 +1056,7 @@ void LLPanelPlaces::changedParcelSelection()
void LLPanelPlaces::createTabs()
{
- if (!(gInventory.isInventoryUsable() && LLTeleportHistory::getInstance()))
+ if (!(gInventory.isInventoryUsable() && LLTeleportHistory::getInstance() && !mTabsCreated))
return;
LLLandmarksPanel* landmarks_panel = new LLLandmarksPanel();
@@ -1059,6 +1090,8 @@ void LLPanelPlaces::createTabs()
// Filter applied to show all items.
if (mActivePanel)
mActivePanel->onSearchEdit(mActivePanel->getFilterSubString());
+
+ mTabsCreated = true;
}
void LLPanelPlaces::changedGlobalPos(const LLVector3d &global_pos)
@@ -1155,7 +1188,8 @@ LLPanelPlaceInfo* LLPanelPlaces::getCurrentInfoPanel()
return mPlaceProfile;
}
else if (mPlaceInfoType == CREATE_LANDMARK_INFO_TYPE ||
- mPlaceInfoType == LANDMARK_INFO_TYPE)
+ mPlaceInfoType == LANDMARK_INFO_TYPE ||
+ mPlaceInfoType == LANDMARK_TAB_INFO_TYPE)
{
return mLandmarkInfo;
}
diff --git a/indra/newview/llpanelplaces.h b/indra/newview/llpanelplaces.h
index b335f88a48..85bdc2c4e1 100644
--- a/indra/newview/llpanelplaces.h
+++ b/indra/newview/llpanelplaces.h
@@ -77,6 +77,8 @@ public:
std::string getPlaceInfoType() { return mPlaceInfoType; }
+ bool tabsCreated() { return mTabsCreated;}
+
/*virtual*/ S32 notifyParent(const LLSD& info);
private:
@@ -146,7 +148,12 @@ private:
bool isLandmarkEditModeOn;
+ // Holds info whether "My Landmarks" and "Teleport History" tabs have been created.
+ bool mTabsCreated;
+
LLSafeHandle<LLParcelSelection> mParcel;
+
+ boost::signals2::connection mAgentParcelChangedConnection;
};
#endif //LL_LLPANELPLACES_H
diff --git a/indra/newview/llpanelprimmediacontrols.cpp b/indra/newview/llpanelprimmediacontrols.cpp
index 933b40ec79..39c0628cbe 100644
--- a/indra/newview/llpanelprimmediacontrols.cpp
+++ b/indra/newview/llpanelprimmediacontrols.cpp
@@ -1351,7 +1351,6 @@ void LLPanelPrimMediaControls::showNotification(LLNotificationPtr notify)
LLWindowShade::Params params;
params.rect = mMediaRegion->getLocalRect();
params.follows.flags = FOLLOWS_ALL;
- params.notification = notify;
//HACK: don't hardcode this
if (notify->getIcon() == "Popup_Caution")
@@ -1369,7 +1368,7 @@ void LLPanelPrimMediaControls::showNotification(LLNotificationPtr notify)
mWindowShade = LLUICtrlFactory::create<LLWindowShade>(params);
mMediaRegion->addChild(mWindowShade);
- mWindowShade->show();
+ mWindowShade->show(notify);
}
void LLPanelPrimMediaControls::hideNotification()
diff --git a/indra/newview/llpanelprofile.cpp b/indra/newview/llpanelprofile.cpp
index fd5c3362bb..e2e7006773 100755
--- a/indra/newview/llpanelprofile.cpp
+++ b/indra/newview/llpanelprofile.cpp
@@ -38,7 +38,6 @@
#include "llviewernetwork.h"
static const std::string PANEL_PICKS = "panel_picks";
-static const std::string PANEL_PROFILE = "panel_profile";
std::string getProfileURL(const std::string& agent_name)
{
@@ -72,7 +71,7 @@ public:
std::string agent_name = params[0];
llinfos << "Profile, agent_name " << agent_name << llendl;
std::string url = getProfileURL(agent_name);
- LLWeb::loadWebURLInternal(url);
+ LLWeb::loadURLInternal(url);
return true;
}
@@ -168,6 +167,23 @@ LLPanelProfile::ChildStack::ChildStack()
{
}
+LLPanelProfile::ChildStack::~ChildStack()
+{
+ while (mStack.size() != 0)
+ {
+ view_list_t& top = mStack.back();
+ for (view_list_t::const_iterator it = top.begin(); it != top.end(); ++it)
+ {
+ LLView* viewp = *it;
+ if (viewp)
+ {
+ viewp->die();
+ }
+ }
+ mStack.pop_back();
+ }
+}
+
void LLPanelProfile::ChildStack::setParent(LLPanel* parent)
{
llassert_always(parent != NULL);
@@ -261,7 +277,6 @@ void LLPanelProfile::ChildStack::dump()
LLPanelProfile::LLPanelProfile()
: LLPanel()
- , mTabCtrl(NULL)
, mAvatarId(LLUUID::null)
{
mChildStack.setParent(this);
@@ -269,15 +284,10 @@ LLPanelProfile::LLPanelProfile()
BOOL LLPanelProfile::postBuild()
{
- mTabCtrl = getChild<LLTabContainer>("tabs");
-
- getTabCtrl()->setCommitCallback(boost::bind(&LLPanelProfile::onTabSelected, this, _2));
-
LLPanelPicks* panel_picks = findChild<LLPanelPicks>(PANEL_PICKS);
panel_picks->setProfilePanel(this);
getTabContainer()[PANEL_PICKS] = panel_picks;
- getTabContainer()[PANEL_PROFILE] = findChild<LLPanelAvatarProfile>(PANEL_PROFILE);
return TRUE;
}
@@ -293,18 +303,7 @@ void LLPanelProfile::reshape(S32 width, S32 height, BOOL called_from_parent)
void LLPanelProfile::onOpen(const LLSD& key)
{
- // open the desired panel
- if (key.has("open_tab_name"))
- {
- getTabContainer()[PANEL_PICKS]->onClosePanel();
-
- // onOpen from selected panel will be called from onTabSelected callback
- getTabCtrl()->selectTabByName(key["open_tab_name"]);
- }
- else
- {
- getTabCtrl()->getCurrentPanel()->onOpen(getAvatarId());
- }
+ getTabContainer()[PANEL_PICKS]->onOpen(getAvatarId());
// support commands to open further pieces of UI
if (key.has("show_tab_panel"))
@@ -362,23 +361,6 @@ void LLPanelProfile::onOpen(const LLSD& key)
}
}
-void LLPanelProfile::togglePanel(LLPanel* panel, const LLSD& key)
-{
- // TRUE - we need to open/expand "panel"
- bool expand = getChildList()->front() != panel; // mTabCtrl->getVisible();
-
- if (expand)
- {
- openPanel(panel, key);
- }
- else
- {
- closePanel(panel);
-
- getTabCtrl()->getCurrentPanel()->onOpen(getAvatarId());
- }
-}
-
void LLPanelProfile::onTabSelected(const LLSD& param)
{
std::string tab_name = param.asString();
diff --git a/indra/newview/llpanelprofile.h b/indra/newview/llpanelprofile.h
index fca359f51e..d97f60ed22 100755
--- a/indra/newview/llpanelprofile.h
+++ b/indra/newview/llpanelprofile.h
@@ -46,8 +46,6 @@ public:
/*virtual*/ void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE);
/*virtual*/ void onOpen(const LLSD& key);
- virtual void togglePanel(LLPanel*, const LLSD& key = LLSD());
-
virtual void openPanel(LLPanel* panel, const LLSD& params);
virtual void closePanel(LLPanel* panel);
@@ -60,8 +58,6 @@ protected:
virtual void onTabSelected(const LLSD& param);
- LLTabContainer* getTabCtrl() { return mTabCtrl; }
-
const LLUUID& getAvatarId() { return mAvatarId; }
void setAvatarId(const LLUUID& avatar_id) { mAvatarId = avatar_id; }
@@ -78,6 +74,7 @@ private:
LOG_CLASS(LLPanelProfile::ChildStack);
public:
ChildStack();
+ ~ChildStack();
void setParent(LLPanel* parent);
bool push();
@@ -97,7 +94,6 @@ private:
};
//-- ChildStack ends ------------------------------------------------------
- LLTabContainer* mTabCtrl;
profile_tabs_t mTabContainer;
ChildStack mChildStack;
LLUUID mAvatarId;
diff --git a/indra/newview/llpanelprofileview.cpp b/indra/newview/llpanelprofileview.cpp
deleted file mode 100644
index 7635aedf58..0000000000
--- a/indra/newview/llpanelprofileview.cpp
+++ /dev/null
@@ -1,247 +0,0 @@
-/**
-* @file llpanelprofileview.cpp
-* @brief Side tray "Profile View" panel
-*
-* $LicenseInfo:firstyear=2009&license=viewerlgpl$
-* Second Life Viewer Source Code
-* Copyright (C) 2010, Linden Research, Inc.
-*
-* This library is free software; you can redistribute it and/or
-* modify it under the terms of the GNU Lesser General Public
-* License as published by the Free Software Foundation;
-* version 2.1 of the License only.
-*
-* This library is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-* Lesser General Public License for more details.
-*
-* You should have received a copy of the GNU Lesser General Public
-* License along with this library; if not, write to the Free Software
-* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-*
-* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
-* $/LicenseInfo$
-*/
-
-#include "llviewerprecompiledheaders.h"
-
-#include "llpanelprofileview.h"
-
-#include "llavatarconstants.h"
-#include "llavatarnamecache.h" // IDEVO
-#include "llclipboard.h"
-#include "lluserrelations.h"
-
-#include "llavatarpropertiesprocessor.h"
-#include "llcallingcard.h"
-#include "llpanelavatar.h"
-#include "llpanelpicks.h"
-#include "llpanelprofile.h"
-#include "llsidetraypanelcontainer.h"
-
-static LLRegisterPanelClassWrapper<LLPanelProfileView> t_panel_target_profile("panel_profile_view");
-
-static std::string PANEL_NOTES = "panel_notes";
-static const std::string PANEL_PROFILE = "panel_profile";
-static const std::string PANEL_PICKS = "panel_picks";
-
-
-class AvatarStatusObserver : public LLAvatarPropertiesObserver
-{
-public:
- AvatarStatusObserver(LLPanelProfileView* profile_view)
- {
- mProfileView = profile_view;
- }
-
- void processProperties(void* data, EAvatarProcessorType type)
- {
- if(APT_PROPERTIES != type) return;
- const LLAvatarData* avatar_data = static_cast<const LLAvatarData*>(data);
- if(avatar_data && mProfileView->getAvatarId() == avatar_data->avatar_id)
- {
- mProfileView->processOnlineStatus(avatar_data->flags & AVATAR_ONLINE);
- LLAvatarPropertiesProcessor::instance().removeObserver(mProfileView->getAvatarId(), this);
- }
- }
-
- void subscribe()
- {
- LLAvatarPropertiesProcessor::instance().addObserver(mProfileView->getAvatarId(), this);
- }
-
-private:
- LLPanelProfileView* mProfileView;
-};
-
-LLPanelProfileView::LLPanelProfileView()
-: LLPanelProfile()
-, mStatusText(NULL)
-, mAvatarStatusObserver(NULL)
-{
- mAvatarStatusObserver = new AvatarStatusObserver(this);
-}
-
-LLPanelProfileView::~LLPanelProfileView(void)
-{
- delete mAvatarStatusObserver;
-}
-
-/*virtual*/
-void LLPanelProfileView::onOpen(const LLSD& key)
-{
- LLUUID id;
- if(key.has("id"))
- {
- id = key["id"];
- }
-
- if(id.notNull() && getAvatarId() != id)
- {
- setAvatarId(id);
-
- // clear name fields, which might have old data
- getChild<LLUICtrl>("user_name")->setValue( LLSD() );
- getChild<LLUICtrl>("user_slid")->setValue( LLSD() );
- }
-
- // Update the avatar name.
- LLAvatarNameCache::get(getAvatarId(),
- boost::bind(&LLPanelProfileView::onAvatarNameCache, this, _1, _2));
-
- updateOnlineStatus();
-
-
- LLPanelProfile::onOpen(key);
-}
-
-BOOL LLPanelProfileView::postBuild()
-{
- LLPanelProfile::postBuild();
-
- getTabContainer()[PANEL_NOTES] = findChild<LLPanelAvatarNotes>(PANEL_NOTES);
-
- //*TODO remove this, according to style guide we don't use status combobox
- getTabContainer()[PANEL_PROFILE]->getChildView("online_me_status_text")->setVisible( FALSE);
- getTabContainer()[PANEL_PROFILE]->getChildView("status_combo")->setVisible( FALSE);
-
- mStatusText = getChild<LLTextBox>("status");
- mStatusText->setVisible(false);
-
- childSetCommitCallback("back",boost::bind(&LLPanelProfileView::onBackBtnClick,this),NULL);
- childSetCommitCallback("copy_to_clipboard",boost::bind(&LLPanelProfileView::onCopyToClipboard,this),NULL);
-
- return TRUE;
-}
-
-
-//private
-
-void LLPanelProfileView::onBackBtnClick()
-{
- // Set dummy value to make picks panel dirty,
- // This will make Picks reload on next open.
- getTabContainer()[PANEL_PICKS]->setValue(LLSD());
-
- LLSideTrayPanelContainer* parent = dynamic_cast<LLSideTrayPanelContainer*>(getParent());
- if(parent)
- {
- parent->openPreviousPanel();
- }
-}
-
-void LLPanelProfileView::onCopyToClipboard()
-{
- std::string name = getChild<LLUICtrl>("user_name")->getValue().asString() + " (" + getChild<LLUICtrl>("user_slid")->getValue().asString() + ")";
- gClipboard.copyFromString(utf8str_to_wstring(name));
-}
-
-bool LLPanelProfileView::isGrantedToSeeOnlineStatus()
-{
- const LLRelationship* relationship = LLAvatarTracker::instance().getBuddyInfo(getAvatarId());
- if (NULL == relationship)
- return false;
-
- // *NOTE: GRANT_ONLINE_STATUS is always set to false while changing any other status.
- // When avatar disallow me to see her online status processOfflineNotification Message is received by the viewer
- // see comments for ChangeUserRights template message. EXT-453.
- // If GRANT_ONLINE_STATUS flag is changed it will be applied when viewer restarts. EXT-3880
- return relationship->isRightGrantedFrom(LLRelationship::GRANT_ONLINE_STATUS);
-}
-
-// method was disabled according to EXT-2022. Re-enabled & improved according to EXT-3880
-void LLPanelProfileView::updateOnlineStatus()
-{
- // set text box visible to show online status for non-friends who has not set in Preferences
- // "Only Friends & Groups can see when I am online"
- mStatusText->setVisible(TRUE);
-
- const LLRelationship* relationship = LLAvatarTracker::instance().getBuddyInfo(getAvatarId());
- if (NULL == relationship)
- {
- // this is non-friend avatar. Status will be updated from LLAvatarPropertiesProcessor.
- // in LLPanelProfileView::processOnlineStatus()
-
- // subscribe observer to get online status. Request will be sent by LLPanelAvatarProfile itself.
- // do not subscribe for friend avatar because online status can be wrong overridden
- // via LLAvatarData::flags if Preferences: "Only Friends & Groups can see when I am online" is set.
- mAvatarStatusObserver->subscribe();
- return;
- }
- // For friend let check if he allowed me to see his status
-
- // status should only show if viewer has permission to view online/offline. EXT-453, EXT-3880
- mStatusText->setVisible(isGrantedToSeeOnlineStatus());
-
- bool online = relationship->isOnline();
- processOnlineStatus(online);
-}
-
-void LLPanelProfileView::processOnlineStatus(bool online)
-{
- std::string status = getString(online ? "status_online" : "status_offline");
-
- mStatusText->setValue(status);
-}
-
-void LLPanelProfileView::onAvatarNameCache(const LLUUID& agent_id,
- const LLAvatarName& av_name)
-{
- getChild<LLUICtrl>("user_name")->setValue( av_name.mDisplayName );
- getChild<LLUICtrl>("user_name_small")->setValue( av_name.mDisplayName );
- getChild<LLUICtrl>("user_slid")->setValue( av_name.mUsername );
-
- // show smaller display name if too long to display in regular size
- if (getChild<LLTextBox>("user_name")->getTextPixelWidth() > getChild<LLTextBox>("user_name")->getRect().getWidth())
- {
- getChild<LLUICtrl>("user_name_small")->setVisible( true );
- getChild<LLUICtrl>("user_name")->setVisible( false );
- }
- else
- {
- getChild<LLUICtrl>("user_name_small")->setVisible( false );
- getChild<LLUICtrl>("user_name")->setVisible( true );
- }
-
- if (LLAvatarNameCache::useDisplayNames())
- {
- getChild<LLUICtrl>("user_label")->setVisible( true );
- getChild<LLUICtrl>("user_slid")->setVisible( true );
- getChild<LLUICtrl>("display_name_label")->setVisible( true );
- getChild<LLUICtrl>("copy_to_clipboard")->setVisible( true );
- getChild<LLUICtrl>("copy_to_clipboard")->setEnabled( true );
- getChild<LLUICtrl>("solo_username_label")->setVisible( false );
- }
- else
- {
- getChild<LLUICtrl>("user_label")->setVisible( false );
- getChild<LLUICtrl>("user_slid")->setVisible( false );
- getChild<LLUICtrl>("display_name_label")->setVisible( false );
- getChild<LLUICtrl>("copy_to_clipboard")->setVisible( false );
- getChild<LLUICtrl>("copy_to_clipboard")->setEnabled( false );
- getChild<LLUICtrl>("solo_username_label")->setVisible( true );
- }
-}
-
-// EOF
diff --git a/indra/newview/llpanelprofileview.h b/indra/newview/llpanelprofileview.h
deleted file mode 100644
index c6d921fdc4..0000000000
--- a/indra/newview/llpanelprofileview.h
+++ /dev/null
@@ -1,108 +0,0 @@
-/**
-* @file llpanelprofileview.h
-* @brief Side tray "Profile View" panel
-*
-* $LicenseInfo:firstyear=2009&license=viewerlgpl$
-* Second Life Viewer Source Code
-* Copyright (C) 2010, Linden Research, Inc.
-*
-* This library is free software; you can redistribute it and/or
-* modify it under the terms of the GNU Lesser General Public
-* License as published by the Free Software Foundation;
-* version 2.1 of the License only.
-*
-* This library is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-* Lesser General Public License for more details.
-*
-* You should have received a copy of the GNU Lesser General Public
-* License along with this library; if not, write to the Free Software
-* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-*
-* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
-* $/LicenseInfo$
-*/
-
-#ifndef LL_LLPANELPROFILEVIEW_H
-#define LL_LLPANELPROFILEVIEW_H
-
-#include "llpanel.h"
-#include "llpanelprofile.h"
-#include "llavatarpropertiesprocessor.h"
-#include "llagent.h"
-#include "lltooldraganddrop.h"
-
-class LLAvatarName;
-class LLPanelProfile;
-class LLPanelProfileTab;
-class LLTextBox;
-class AvatarStatusObserver;
-
-/**
-* Panel for displaying Avatar's profile. It consists of three sub panels - Profile,
-* Picks and Notes.
-*/
-class LLPanelProfileView : public LLPanelProfile
-{
- LOG_CLASS(LLPanelProfileView);
- friend class LLUICtrlFactory;
- friend class AvatarStatusObserver;
-
-public:
-
- LLPanelProfileView();
-
- /*virtual*/ ~LLPanelProfileView();
-
- /*virtual*/ void onOpen(const LLSD& key);
-
- /*virtual*/ BOOL postBuild();
-
- BOOL handleDragAndDrop(S32 x, S32 y, MASK mask,
- BOOL drop, EDragAndDropType cargo_type,
- void *cargo_data, EAcceptance *accept,
- std::string& tooltip_msg)
- {
- LLToolDragAndDrop::handleGiveDragAndDrop(getAvatarId(), gAgent.getSessionID(), drop,
- cargo_type, cargo_data, accept);
-
- return TRUE;
- }
-
-
-protected:
-
- void onBackBtnClick();
- void onCopyToClipboard();
- bool isGrantedToSeeOnlineStatus();
-
- /**
- * Displays avatar's online status if possible.
- *
- * Requirements from EXT-3880:
- * For friends:
- * - Online when online and privacy settings allow to show
- * - Offline when offline and privacy settings allow to show
- * - Else: nothing
- * For other avatars:
- * - Online when online and was not set in Preferences/"Only Friends & Groups can see when I am online"
- * - Else: Offline
- */
- void updateOnlineStatus();
- void processOnlineStatus(bool online);
-
-private:
- // LLCacheName will call this function when avatar name is loaded from server.
- // This is required to display names that have not been cached yet.
-// void onNameCache(
-// const LLUUID& id,
-// const std::string& full_name,
-// bool is_group);
- void onAvatarNameCache(const LLUUID& agent_id, const LLAvatarName& av_name);
-
- LLTextBox* mStatusText;
- AvatarStatusObserver* mAvatarStatusObserver;
-};
-
-#endif //LL_LLPANELPROFILEVIEW_H
diff --git a/indra/newview/llpanelsnapshot.cpp b/indra/newview/llpanelsnapshot.cpp
new file mode 100644
index 0000000000..2f29e758c6
--- /dev/null
+++ b/indra/newview/llpanelsnapshot.cpp
@@ -0,0 +1,201 @@
+/**
+ * @file llpanelsnapshot.cpp
+ * @brief Snapshot panel base class
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+#include "llpanelsnapshot.h"
+
+// libs
+#include "llcombobox.h"
+#include "llsliderctrl.h"
+#include "llspinctrl.h"
+#include "lltrans.h"
+
+// newview
+#include "llsidetraypanelcontainer.h"
+#include "llviewercontrol.h" // gSavedSettings
+
+// virtual
+BOOL LLPanelSnapshot::postBuild()
+{
+ getChild<LLUICtrl>(getImageSizeComboName())->setCommitCallback(boost::bind(&LLPanelSnapshot::onResolutionComboCommit, this, _1));
+ getChild<LLUICtrl>(getWidthSpinnerName())->setCommitCallback(boost::bind(&LLPanelSnapshot::onCustomResolutionCommit, this));
+ getChild<LLUICtrl>(getHeightSpinnerName())->setCommitCallback(boost::bind(&LLPanelSnapshot::onCustomResolutionCommit, this));
+ getChild<LLUICtrl>(getAspectRatioCBName())->setCommitCallback(boost::bind(&LLPanelSnapshot::onKeepAspectRatioCommit, this, _1));
+
+ updateControls(LLSD());
+ return TRUE;
+}
+
+// virtual
+void LLPanelSnapshot::onOpen(const LLSD& key)
+{
+ S32 old_format = gSavedSettings.getS32("SnapshotFormat");
+ S32 new_format = (S32) getImageFormat();
+
+ gSavedSettings.setS32("SnapshotFormat", new_format);
+ setCtrlsEnabled(true);
+
+ // Switching panels will likely change image format.
+ // Not updating preview right away may lead to errors,
+ // e.g. attempt to send a large BMP image by email.
+ if (old_format != new_format)
+ {
+ LLFloaterSnapshot::getInstance()->notify(LLSD().with("image-format-change", true));
+ }
+
+ updateCustomResControls();
+}
+
+LLFloaterSnapshot::ESnapshotFormat LLPanelSnapshot::getImageFormat() const
+{
+ return LLFloaterSnapshot::SNAPSHOT_FORMAT_JPEG;
+}
+
+void LLPanelSnapshot::enableControls(BOOL enable)
+{
+ setCtrlsEnabled(enable);
+ if (enable)
+ {
+ // Make sure only relevant controls are enabled/shown.
+ updateCustomResControls();
+ }
+}
+
+LLSpinCtrl* LLPanelSnapshot::getWidthSpinner()
+{
+ return getChild<LLSpinCtrl>(getWidthSpinnerName());
+}
+
+LLSpinCtrl* LLPanelSnapshot::getHeightSpinner()
+{
+ return getChild<LLSpinCtrl>(getHeightSpinnerName());
+}
+
+S32 LLPanelSnapshot::getTypedPreviewWidth() const
+{
+ return getChild<LLUICtrl>(getWidthSpinnerName())->getValue().asInteger();
+}
+
+S32 LLPanelSnapshot::getTypedPreviewHeight() const
+{
+ return getChild<LLUICtrl>(getHeightSpinnerName())->getValue().asInteger();
+}
+
+void LLPanelSnapshot::enableAspectRatioCheckbox(BOOL enable)
+{
+ getChild<LLUICtrl>(getAspectRatioCBName())->setEnabled(enable);
+}
+
+LLSideTrayPanelContainer* LLPanelSnapshot::getParentContainer()
+{
+ LLSideTrayPanelContainer* parent = dynamic_cast<LLSideTrayPanelContainer*>(getParent());
+ if (!parent)
+ {
+ llwarns << "Cannot find panel container" << llendl;
+ return NULL;
+ }
+
+ return parent;
+}
+
+// virtual
+void LLPanelSnapshot::updateCustomResControls()
+{
+ // Only show width/height spinners and the aspect ratio checkbox
+ // when a custom resolution is chosen.
+ LLComboBox* combo = getChild<LLComboBox>(getImageSizeComboName());
+ const bool show = combo->getFirstSelectedIndex() == (combo->getItemCount() - 1);
+ getChild<LLUICtrl>(getImageSizePanelName())->setVisible(show);
+}
+
+void LLPanelSnapshot::updateImageQualityLevel()
+{
+ LLSliderCtrl* quality_slider = getChild<LLSliderCtrl>("image_quality_slider");
+ S32 quality_val = llfloor((F32) quality_slider->getValue().asReal());
+
+ std::string quality_lvl;
+
+ if (quality_val < 20)
+ {
+ quality_lvl = LLTrans::getString("snapshot_quality_very_low");
+ }
+ else if (quality_val < 40)
+ {
+ quality_lvl = LLTrans::getString("snapshot_quality_low");
+ }
+ else if (quality_val < 60)
+ {
+ quality_lvl = LLTrans::getString("snapshot_quality_medium");
+ }
+ else if (quality_val < 80)
+ {
+ quality_lvl = LLTrans::getString("snapshot_quality_high");
+ }
+ else
+ {
+ quality_lvl = LLTrans::getString("snapshot_quality_very_high");
+ }
+
+ getChild<LLTextBox>("image_quality_level")->setTextArg("[QLVL]", quality_lvl);
+}
+
+void LLPanelSnapshot::goBack()
+{
+ LLSideTrayPanelContainer* parent = getParentContainer();
+ if (parent)
+ {
+ parent->openPreviousPanel();
+ parent->getCurrentPanel()->onOpen(LLSD());
+ }
+}
+
+void LLPanelSnapshot::cancel()
+{
+ goBack();
+ LLFloaterSnapshot::getInstance()->notify(LLSD().with("set-ready", true));
+}
+
+void LLPanelSnapshot::onCustomResolutionCommit()
+{
+ LLSD info;
+ info["w"] = getChild<LLUICtrl>(getWidthSpinnerName())->getValue().asInteger();
+ info["h"] = getChild<LLUICtrl>(getHeightSpinnerName())->getValue().asInteger();
+ LLFloaterSnapshot::getInstance()->notify(LLSD().with("custom-res-change", info));
+}
+
+void LLPanelSnapshot::onResolutionComboCommit(LLUICtrl* ctrl)
+{
+ updateCustomResControls();
+
+ LLSD info;
+ info["combo-res-change"]["control-name"] = ctrl->getName();
+ LLFloaterSnapshot::getInstance()->notify(info);
+}
+
+void LLPanelSnapshot::onKeepAspectRatioCommit(LLUICtrl* ctrl)
+{
+ LLFloaterSnapshot::getInstance()->notify(LLSD().with("keep-aspect-change", ctrl->getValue().asBoolean()));
+}
diff --git a/indra/newview/llpanelsnapshot.h b/indra/newview/llpanelsnapshot.h
new file mode 100644
index 0000000000..f3274cf594
--- /dev/null
+++ b/indra/newview/llpanelsnapshot.h
@@ -0,0 +1,71 @@
+/**
+ * @file llpanelsnapshot.h
+ * @brief Snapshot panel base class
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLPANELSNAPSHOT_H
+#define LL_LLPANELSNAPSHOT_H
+
+#include "llfloatersnapshot.h"
+
+class LLSideTrayPanelContainer;
+
+/**
+ * Snapshot panel base class.
+ */
+class LLPanelSnapshot: public LLPanel
+{
+public:
+ /*virtual*/ BOOL postBuild();
+ /*virtual*/ void onOpen(const LLSD& key);
+
+ virtual std::string getWidthSpinnerName() const = 0;
+ virtual std::string getHeightSpinnerName() const = 0;
+ virtual std::string getAspectRatioCBName() const = 0;
+ virtual std::string getImageSizeComboName() const = 0;
+ virtual std::string getImageSizePanelName() const = 0;
+
+ virtual S32 getTypedPreviewWidth() const;
+ virtual S32 getTypedPreviewHeight() const;
+ virtual LLSpinCtrl* getWidthSpinner();
+ virtual LLSpinCtrl* getHeightSpinner();
+ virtual void enableAspectRatioCheckbox(BOOL enable);
+ virtual LLFloaterSnapshot::ESnapshotFormat getImageFormat() const;
+ virtual void updateControls(const LLSD& info) = 0; ///< Update controls from saved settings
+ void enableControls(BOOL enable);
+
+protected:
+ LLSideTrayPanelContainer* getParentContainer();
+ virtual void updateCustomResControls();
+ void updateImageQualityLevel();
+ void goBack(); ///< Switch to the default (Snapshot Options) panel
+ void cancel();
+
+ // common UI callbacks
+ void onCustomResolutionCommit();
+ void onResolutionComboCommit(LLUICtrl* ctrl);
+ void onKeepAspectRatioCommit(LLUICtrl* ctrl);
+};
+
+#endif // LL_LLPANELSNAPSHOT_H
diff --git a/indra/newview/llpanelsnapshotinventory.cpp b/indra/newview/llpanelsnapshotinventory.cpp
new file mode 100644
index 0000000000..381c11348d
--- /dev/null
+++ b/indra/newview/llpanelsnapshotinventory.cpp
@@ -0,0 +1,109 @@
+/**
+ * @file llpanelsnapshotinventory.cpp
+ * @brief The panel provides UI for saving snapshot as an inventory texture.
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llcombobox.h"
+#include "lleconomy.h"
+#include "llsidetraypanelcontainer.h"
+#include "llspinctrl.h"
+
+#include "llfloatersnapshot.h" // FIXME: replace with a snapshot storage model
+#include "llpanelsnapshot.h"
+#include "llviewercontrol.h" // gSavedSettings
+
+/**
+ * The panel provides UI for saving snapshot as an inventory texture.
+ */
+class LLPanelSnapshotInventory
+: public LLPanelSnapshot
+{
+ LOG_CLASS(LLPanelSnapshotInventory);
+
+public:
+ LLPanelSnapshotInventory();
+ /*virtual*/ BOOL postBuild();
+ /*virtual*/ void onOpen(const LLSD& key);
+
+private:
+ /*virtual*/ void updateCustomResControls(); ///< Show/hide custom resolution controls (spinners and checkbox)
+ /*virtual*/ std::string getWidthSpinnerName() const { return "inventory_snapshot_width"; }
+ /*virtual*/ std::string getHeightSpinnerName() const { return "inventory_snapshot_height"; }
+ /*virtual*/ std::string getAspectRatioCBName() const { return "inventory_keep_aspect_check"; }
+ /*virtual*/ std::string getImageSizeComboName() const { return "texture_size_combo"; }
+ /*virtual*/ std::string getImageSizePanelName() const { return LLStringUtil::null; }
+ /*virtual*/ void updateControls(const LLSD& info);
+
+ void onSend();
+};
+
+static LLRegisterPanelClassWrapper<LLPanelSnapshotInventory> panel_class("llpanelsnapshotinventory");
+
+LLPanelSnapshotInventory::LLPanelSnapshotInventory()
+{
+ mCommitCallbackRegistrar.add("Inventory.Save", boost::bind(&LLPanelSnapshotInventory::onSend, this));
+ mCommitCallbackRegistrar.add("Inventory.Cancel", boost::bind(&LLPanelSnapshotInventory::cancel, this));
+}
+
+// virtual
+BOOL LLPanelSnapshotInventory::postBuild()
+{
+ getChild<LLSpinCtrl>(getWidthSpinnerName())->setAllowEdit(FALSE);
+ getChild<LLSpinCtrl>(getHeightSpinnerName())->setAllowEdit(FALSE);
+ getChild<LLUICtrl>(getAspectRatioCBName())->setVisible(FALSE); // we don't keep aspect ratio for inventory textures
+ return LLPanelSnapshot::postBuild();
+}
+
+// virtual
+void LLPanelSnapshotInventory::onOpen(const LLSD& key)
+{
+ getChild<LLUICtrl>("hint_lbl")->setTextArg("[UPLOAD_COST]", llformat("%d", LLGlobalEconomy::Singleton::getInstance()->getPriceUpload()));
+ LLPanelSnapshot::onOpen(key);
+}
+
+// virtual
+void LLPanelSnapshotInventory::updateCustomResControls()
+{
+ LLComboBox* combo = getChild<LLComboBox>(getImageSizeComboName());
+ S32 selected_idx = combo->getFirstSelectedIndex();
+ const bool show = selected_idx == (combo->getItemCount() - 1); // Custom selected
+
+ getChild<LLUICtrl>(getWidthSpinnerName())->setVisible(show);
+ getChild<LLUICtrl>(getHeightSpinnerName())->setVisible(show);
+}
+
+// virtual
+void LLPanelSnapshotInventory::updateControls(const LLSD& info)
+{
+ const bool have_snapshot = info.has("have-snapshot") ? info["have-snapshot"].asBoolean() : true;
+ getChild<LLUICtrl>("save_btn")->setEnabled(have_snapshot);
+}
+
+void LLPanelSnapshotInventory::onSend()
+{
+ LLFloaterSnapshot::saveTexture();
+ LLFloaterSnapshot::postSave();
+}
diff --git a/indra/newview/llpanelsnapshotlocal.cpp b/indra/newview/llpanelsnapshotlocal.cpp
new file mode 100644
index 0000000000..d153ff598d
--- /dev/null
+++ b/indra/newview/llpanelsnapshotlocal.cpp
@@ -0,0 +1,168 @@
+/**
+ * @file llpanelsnapshotlocal.cpp
+ * @brief The panel provides UI for saving snapshot to a local folder.
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llcombobox.h"
+#include "llsidetraypanelcontainer.h"
+#include "llsliderctrl.h"
+#include "llspinctrl.h"
+
+#include "llfloatersnapshot.h" // FIXME: replace with a snapshot storage model
+#include "llpanelsnapshot.h"
+#include "llviewercontrol.h" // gSavedSettings
+#include "llviewerwindow.h"
+
+/**
+ * The panel provides UI for saving snapshot to a local folder.
+ */
+class LLPanelSnapshotLocal
+: public LLPanelSnapshot
+{
+ LOG_CLASS(LLPanelSnapshotLocal);
+
+public:
+ LLPanelSnapshotLocal();
+ /*virtual*/ BOOL postBuild();
+ /*virtual*/ void onOpen(const LLSD& key);
+
+private:
+ /*virtual*/ std::string getWidthSpinnerName() const { return "local_snapshot_width"; }
+ /*virtual*/ std::string getHeightSpinnerName() const { return "local_snapshot_height"; }
+ /*virtual*/ std::string getAspectRatioCBName() const { return "local_keep_aspect_check"; }
+ /*virtual*/ std::string getImageSizeComboName() const { return "local_size_combo"; }
+ /*virtual*/ std::string getImageSizePanelName() const { return "local_image_size_lp"; }
+ /*virtual*/ LLFloaterSnapshot::ESnapshotFormat getImageFormat() const;
+ /*virtual*/ void updateControls(const LLSD& info);
+
+ void onFormatComboCommit(LLUICtrl* ctrl);
+ void onQualitySliderCommit(LLUICtrl* ctrl);
+ void onSaveFlyoutCommit(LLUICtrl* ctrl);
+};
+
+static LLRegisterPanelClassWrapper<LLPanelSnapshotLocal> panel_class("llpanelsnapshotlocal");
+
+LLPanelSnapshotLocal::LLPanelSnapshotLocal()
+{
+ mCommitCallbackRegistrar.add("Local.Cancel", boost::bind(&LLPanelSnapshotLocal::cancel, this));
+}
+
+// virtual
+BOOL LLPanelSnapshotLocal::postBuild()
+{
+ getChild<LLUICtrl>("image_quality_slider")->setCommitCallback(boost::bind(&LLPanelSnapshotLocal::onQualitySliderCommit, this, _1));
+ getChild<LLUICtrl>("local_format_combo")->setCommitCallback(boost::bind(&LLPanelSnapshotLocal::onFormatComboCommit, this, _1));
+ getChild<LLUICtrl>("save_btn")->setCommitCallback(boost::bind(&LLPanelSnapshotLocal::onSaveFlyoutCommit, this, _1));
+
+ return LLPanelSnapshot::postBuild();
+}
+
+// virtual
+void LLPanelSnapshotLocal::onOpen(const LLSD& key)
+{
+ LLPanelSnapshot::onOpen(key);
+}
+
+// virtual
+LLFloaterSnapshot::ESnapshotFormat LLPanelSnapshotLocal::getImageFormat() const
+{
+ LLFloaterSnapshot::ESnapshotFormat fmt = LLFloaterSnapshot::SNAPSHOT_FORMAT_PNG;
+
+ LLComboBox* local_format_combo = getChild<LLComboBox>("local_format_combo");
+ const std::string id = local_format_combo->getValue().asString();
+ if (id == "PNG")
+ {
+ fmt = LLFloaterSnapshot::SNAPSHOT_FORMAT_PNG;
+ }
+ else if (id == "JPEG")
+ {
+ fmt = LLFloaterSnapshot::SNAPSHOT_FORMAT_JPEG;
+ }
+ else if (id == "BMP")
+ {
+ fmt = LLFloaterSnapshot::SNAPSHOT_FORMAT_BMP;
+ }
+
+ return fmt;
+}
+
+// virtual
+void LLPanelSnapshotLocal::updateControls(const LLSD& info)
+{
+ LLFloaterSnapshot::ESnapshotFormat fmt =
+ (LLFloaterSnapshot::ESnapshotFormat) gSavedSettings.getS32("SnapshotFormat");
+ getChild<LLComboBox>("local_format_combo")->selectNthItem((S32) fmt);
+
+ const bool show_quality_ctrls = (fmt == LLFloaterSnapshot::SNAPSHOT_FORMAT_JPEG);
+ getChild<LLUICtrl>("image_quality_slider")->setVisible(show_quality_ctrls);
+ getChild<LLUICtrl>("image_quality_level")->setVisible(show_quality_ctrls);
+
+ getChild<LLUICtrl>("image_quality_slider")->setValue(gSavedSettings.getS32("SnapshotQuality"));
+ updateImageQualityLevel();
+
+ const bool have_snapshot = info.has("have-snapshot") ? info["have-snapshot"].asBoolean() : true;
+ getChild<LLUICtrl>("save_btn")->setEnabled(have_snapshot);
+}
+
+void LLPanelSnapshotLocal::onFormatComboCommit(LLUICtrl* ctrl)
+{
+ // will call updateControls()
+ LLFloaterSnapshot::getInstance()->notify(LLSD().with("image-format-change", true));
+}
+
+void LLPanelSnapshotLocal::onQualitySliderCommit(LLUICtrl* ctrl)
+{
+ updateImageQualityLevel();
+
+ LLSliderCtrl* slider = (LLSliderCtrl*)ctrl;
+ S32 quality_val = llfloor((F32)slider->getValue().asReal());
+ LLSD info;
+ info["image-quality-change"] = quality_val;
+ LLFloaterSnapshot::getInstance()->notify(info);
+}
+
+void LLPanelSnapshotLocal::onSaveFlyoutCommit(LLUICtrl* ctrl)
+{
+ if (ctrl->getValue().asString() == "save as")
+ {
+ gViewerWindow->resetSnapshotLoc();
+ }
+
+ LLFloaterSnapshot* floater = LLFloaterSnapshot::getInstance();
+
+ floater->notify(LLSD().with("set-working", true));
+ BOOL saved = LLFloaterSnapshot::saveLocal();
+ if (saved)
+ {
+ LLFloaterSnapshot::postSave();
+ goBack();
+ floater->notify(LLSD().with("set-finished", LLSD().with("ok", true).with("msg", "local")));
+ }
+ else
+ {
+ cancel();
+ }
+}
diff --git a/indra/newview/llpanelsnapshotoptions.cpp b/indra/newview/llpanelsnapshotoptions.cpp
new file mode 100644
index 0000000000..554fabe5b3
--- /dev/null
+++ b/indra/newview/llpanelsnapshotoptions.cpp
@@ -0,0 +1,120 @@
+/**
+ * @file llpanelsnapshotoptions.cpp
+ * @brief Snapshot posting options panel.
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "lleconomy.h"
+#include "llpanel.h"
+#include "llsidetraypanelcontainer.h"
+
+#include "llfloatersnapshot.h" // FIXME: create a snapshot model
+
+/**
+ * Provides several ways to save a snapshot.
+ */
+class LLPanelSnapshotOptions
+: public LLPanel
+, public LLEconomyObserver
+{
+ LOG_CLASS(LLPanelSnapshotOptions);
+
+public:
+ LLPanelSnapshotOptions();
+ ~LLPanelSnapshotOptions();
+ /*virtual*/ void onOpen(const LLSD& key);
+ /*virtual*/ void onEconomyDataChange() { updateUploadCost(); }
+
+private:
+ void updateUploadCost();
+ void openPanel(const std::string& panel_name);
+ void onSaveToProfile();
+ void onSaveToEmail();
+ void onSaveToInventory();
+ void onSaveToComputer();
+};
+
+static LLRegisterPanelClassWrapper<LLPanelSnapshotOptions> panel_class("llpanelsnapshotoptions");
+
+LLPanelSnapshotOptions::LLPanelSnapshotOptions()
+{
+ mCommitCallbackRegistrar.add("Snapshot.SaveToProfile", boost::bind(&LLPanelSnapshotOptions::onSaveToProfile, this));
+ mCommitCallbackRegistrar.add("Snapshot.SaveToEmail", boost::bind(&LLPanelSnapshotOptions::onSaveToEmail, this));
+ mCommitCallbackRegistrar.add("Snapshot.SaveToInventory", boost::bind(&LLPanelSnapshotOptions::onSaveToInventory, this));
+ mCommitCallbackRegistrar.add("Snapshot.SaveToComputer", boost::bind(&LLPanelSnapshotOptions::onSaveToComputer, this));
+
+ LLGlobalEconomy::Singleton::getInstance()->addObserver(this);
+}
+
+LLPanelSnapshotOptions::~LLPanelSnapshotOptions()
+{
+ LLGlobalEconomy::Singleton::getInstance()->removeObserver(this);
+}
+
+// virtual
+void LLPanelSnapshotOptions::onOpen(const LLSD& key)
+{
+ updateUploadCost();
+}
+
+void LLPanelSnapshotOptions::updateUploadCost()
+{
+ S32 upload_cost = LLGlobalEconomy::Singleton::getInstance()->getPriceUpload();
+ getChild<LLUICtrl>("save_to_inventory_btn")->setLabelArg("[AMOUNT]", llformat("%d", upload_cost));
+}
+
+void LLPanelSnapshotOptions::openPanel(const std::string& panel_name)
+{
+ LLSideTrayPanelContainer* parent = dynamic_cast<LLSideTrayPanelContainer*>(getParent());
+ if (!parent)
+ {
+ llwarns << "Cannot find panel container" << llendl;
+ return;
+ }
+
+ parent->openPanel(panel_name);
+ parent->getCurrentPanel()->onOpen(LLSD());
+ LLFloaterSnapshot::postPanelSwitch();
+}
+
+void LLPanelSnapshotOptions::onSaveToProfile()
+{
+ openPanel("panel_snapshot_profile");
+}
+
+void LLPanelSnapshotOptions::onSaveToEmail()
+{
+ openPanel("panel_snapshot_postcard");
+}
+
+void LLPanelSnapshotOptions::onSaveToInventory()
+{
+ openPanel("panel_snapshot_inventory");
+}
+
+void LLPanelSnapshotOptions::onSaveToComputer()
+{
+ openPanel("panel_snapshot_local");
+}
diff --git a/indra/newview/llpanelsnapshotpostcard.cpp b/indra/newview/llpanelsnapshotpostcard.cpp
new file mode 100644
index 0000000000..f2bb8f530b
--- /dev/null
+++ b/indra/newview/llpanelsnapshotpostcard.cpp
@@ -0,0 +1,270 @@
+/**
+ * @file llpanelsnapshotpostcard.cpp
+ * @brief Postcard sending panel.
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llcombobox.h"
+#include "llnotificationsutil.h"
+#include "llsidetraypanelcontainer.h"
+#include "llsliderctrl.h"
+#include "llspinctrl.h"
+#include "lltexteditor.h"
+
+#include "llagent.h"
+#include "llagentui.h"
+#include "llfloatersnapshot.h" // FIXME: replace with a snapshot storage model
+#include "llpanelsnapshot.h"
+#include "llpostcard.h"
+#include "llviewercontrol.h" // gSavedSettings
+#include "llviewerwindow.h"
+
+#include <boost/regex.hpp>
+
+/**
+ * Sends postcard via email.
+ */
+class LLPanelSnapshotPostcard
+: public LLPanelSnapshot
+{
+ LOG_CLASS(LLPanelSnapshotPostcard);
+
+public:
+ LLPanelSnapshotPostcard();
+ /*virtual*/ BOOL postBuild();
+ /*virtual*/ void onOpen(const LLSD& key);
+ /*virtual*/ S32 notify(const LLSD& info);
+
+private:
+ /*virtual*/ std::string getWidthSpinnerName() const { return "postcard_snapshot_width"; }
+ /*virtual*/ std::string getHeightSpinnerName() const { return "postcard_snapshot_height"; }
+ /*virtual*/ std::string getAspectRatioCBName() const { return "postcard_keep_aspect_check"; }
+ /*virtual*/ std::string getImageSizeComboName() const { return "postcard_size_combo"; }
+ /*virtual*/ std::string getImageSizePanelName() const { return "postcard_image_size_lp"; }
+ /*virtual*/ LLFloaterSnapshot::ESnapshotFormat getImageFormat() const { return LLFloaterSnapshot::SNAPSHOT_FORMAT_JPEG; }
+ /*virtual*/ void updateControls(const LLSD& info);
+
+ bool missingSubjMsgAlertCallback(const LLSD& notification, const LLSD& response);
+ void sendPostcard();
+
+ void onMsgFormFocusRecieved();
+ void onFormatComboCommit(LLUICtrl* ctrl);
+ void onQualitySliderCommit(LLUICtrl* ctrl);
+ void onTabButtonPress(S32 btn_idx);
+ void onSend();
+
+ bool mHasFirstMsgFocus;
+ std::string mAgentEmail;
+};
+
+static LLRegisterPanelClassWrapper<LLPanelSnapshotPostcard> panel_class("llpanelsnapshotpostcard");
+
+LLPanelSnapshotPostcard::LLPanelSnapshotPostcard()
+: mHasFirstMsgFocus(false)
+{
+ mCommitCallbackRegistrar.add("Postcard.Send", boost::bind(&LLPanelSnapshotPostcard::onSend, this));
+ mCommitCallbackRegistrar.add("Postcard.Cancel", boost::bind(&LLPanelSnapshotPostcard::cancel, this));
+ mCommitCallbackRegistrar.add("Postcard.Message", boost::bind(&LLPanelSnapshotPostcard::onTabButtonPress, this, 0));
+ mCommitCallbackRegistrar.add("Postcard.Settings", boost::bind(&LLPanelSnapshotPostcard::onTabButtonPress, this, 1));
+
+}
+
+// virtual
+BOOL LLPanelSnapshotPostcard::postBuild()
+{
+ // pick up the user's up-to-date email address
+ gAgent.sendAgentUserInfoRequest();
+
+ std::string name_string;
+ LLAgentUI::buildFullname(name_string);
+ getChild<LLUICtrl>("name_form")->setValue(LLSD(name_string));
+
+ // For the first time a user focuses to .the msg box, all text will be selected.
+ getChild<LLUICtrl>("msg_form")->setFocusChangedCallback(boost::bind(&LLPanelSnapshotPostcard::onMsgFormFocusRecieved, this));
+
+ getChild<LLUICtrl>("to_form")->setFocus(TRUE);
+
+ getChild<LLUICtrl>("image_quality_slider")->setCommitCallback(boost::bind(&LLPanelSnapshotPostcard::onQualitySliderCommit, this, _1));
+
+ getChild<LLButton>("message_btn")->setToggleState(TRUE);
+
+ return LLPanelSnapshot::postBuild();
+}
+
+// virtual
+void LLPanelSnapshotPostcard::onOpen(const LLSD& key)
+{
+ LLPanelSnapshot::onOpen(key);
+}
+
+// virtual
+S32 LLPanelSnapshotPostcard::notify(const LLSD& info)
+{
+ if (!info.has("agent-email"))
+ {
+ llassert(info.has("agent-email"));
+ return 0;
+ }
+
+ if (mAgentEmail.empty())
+ {
+ mAgentEmail = info["agent-email"].asString();
+ }
+
+ return 1;
+}
+
+// virtual
+void LLPanelSnapshotPostcard::updateControls(const LLSD& info)
+{
+ getChild<LLUICtrl>("image_quality_slider")->setValue(gSavedSettings.getS32("SnapshotQuality"));
+ updateImageQualityLevel();
+
+ const bool have_snapshot = info.has("have-snapshot") ? info["have-snapshot"].asBoolean() : true;
+ getChild<LLUICtrl>("send_btn")->setEnabled(have_snapshot);
+}
+
+bool LLPanelSnapshotPostcard::missingSubjMsgAlertCallback(const LLSD& notification, const LLSD& response)
+{
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+ if(0 == option)
+ {
+ // User clicked OK
+ if((getChild<LLUICtrl>("subject_form")->getValue().asString()).empty())
+ {
+ // Stuff the subject back into the form.
+ getChild<LLUICtrl>("subject_form")->setValue(getString("default_subject"));
+ }
+
+ if (!mHasFirstMsgFocus)
+ {
+ // The user never switched focus to the message window.
+ // Using the default string.
+ getChild<LLUICtrl>("msg_form")->setValue(getString("default_message"));
+ }
+
+ sendPostcard();
+ }
+ return false;
+}
+
+
+void LLPanelSnapshotPostcard::sendPostcard()
+{
+ std::string to(getChild<LLUICtrl>("to_form")->getValue().asString());
+ std::string subject(getChild<LLUICtrl>("subject_form")->getValue().asString());
+
+ LLSD postcard = LLSD::emptyMap();
+ postcard["pos-global"] = LLFloaterSnapshot::getPosTakenGlobal().getValue();
+ postcard["to"] = to;
+ postcard["from"] = mAgentEmail;
+ postcard["name"] = getChild<LLUICtrl>("name_form")->getValue().asString();
+ postcard["subject"] = subject;
+ postcard["msg"] = getChild<LLUICtrl>("msg_form")->getValue().asString();
+ LLPostCard::send(LLFloaterSnapshot::getImageData(), postcard);
+
+ // Give user feedback of the event.
+ gViewerWindow->playSnapshotAnimAndSound();
+
+ LLFloaterSnapshot::postSave();
+}
+
+void LLPanelSnapshotPostcard::onMsgFormFocusRecieved()
+{
+ LLTextEditor* msg_form = getChild<LLTextEditor>("msg_form");
+ if (msg_form->hasFocus() && !mHasFirstMsgFocus)
+ {
+ mHasFirstMsgFocus = true;
+ msg_form->setText(LLStringUtil::null);
+ }
+}
+
+void LLPanelSnapshotPostcard::onFormatComboCommit(LLUICtrl* ctrl)
+{
+ // will call updateControls()
+ LLFloaterSnapshot::getInstance()->notify(LLSD().with("image-format-change", true));
+}
+
+void LLPanelSnapshotPostcard::onQualitySliderCommit(LLUICtrl* ctrl)
+{
+ updateImageQualityLevel();
+
+ LLSliderCtrl* slider = (LLSliderCtrl*)ctrl;
+ S32 quality_val = llfloor((F32)slider->getValue().asReal());
+ LLSD info;
+ info["image-quality-change"] = quality_val;
+ LLFloaterSnapshot::getInstance()->notify(info); // updates the "SnapshotQuality" setting
+}
+
+void LLPanelSnapshotPostcard::onTabButtonPress(S32 btn_idx)
+{
+ LLButton* buttons[2] = {
+ getChild<LLButton>("message_btn"),
+ getChild<LLButton>("settings_btn"),
+ };
+
+ // Switch between Message and Settings tabs.
+ LLButton* clicked_btn = buttons[btn_idx];
+ LLButton* other_btn = buttons[!btn_idx];
+ LLSideTrayPanelContainer* container =
+ getChild<LLSideTrayPanelContainer>("postcard_panel_container");
+
+ container->selectTab(clicked_btn->getToggleState() ? btn_idx : !btn_idx);
+ //clicked_btn->setEnabled(FALSE);
+ other_btn->toggleState();
+ //other_btn->setEnabled(TRUE);
+
+ lldebugs << "Button #" << btn_idx << " (" << clicked_btn->getName() << ") clicked" << llendl;
+}
+
+void LLPanelSnapshotPostcard::onSend()
+{
+ // Validate input.
+ std::string to(getChild<LLUICtrl>("to_form")->getValue().asString());
+
+ boost::regex email_format("[A-Za-z0-9.%+-_]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}(,[ \t]*[A-Za-z0-9.%+-_]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,})*");
+
+ if (to.empty() || !boost::regex_match(to, email_format))
+ {
+ LLNotificationsUtil::add("PromptRecipientEmail");
+ return;
+ }
+
+ if (mAgentEmail.empty() || !boost::regex_match(mAgentEmail, email_format))
+ {
+ LLNotificationsUtil::add("PromptSelfEmail");
+ return;
+ }
+
+ std::string subject(getChild<LLUICtrl>("subject_form")->getValue().asString());
+ if(subject.empty() || !mHasFirstMsgFocus)
+ {
+ LLNotificationsUtil::add("PromptMissingSubjMsg", LLSD(), LLSD(), boost::bind(&LLPanelSnapshotPostcard::missingSubjMsgAlertCallback, this, _1, _2));
+ return;
+ }
+
+ // Send postcard.
+ sendPostcard();
+}
diff --git a/indra/newview/llpanelsnapshotprofile.cpp b/indra/newview/llpanelsnapshotprofile.cpp
new file mode 100644
index 0000000000..a706318369
--- /dev/null
+++ b/indra/newview/llpanelsnapshotprofile.cpp
@@ -0,0 +1,101 @@
+/**
+ * @file llpanelsnapshotprofile.cpp
+ * @brief Posts a snapshot to My Profile feed.
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+// libs
+#include "llcombobox.h"
+#include "llfloaterreg.h"
+#include "llpanel.h"
+#include "llspinctrl.h"
+
+// newview
+#include "llfloatersnapshot.h"
+#include "llpanelsnapshot.h"
+#include "llsidetraypanelcontainer.h"
+#include "llwebprofile.h"
+
+/**
+ * Posts a snapshot to My Profile feed.
+ */
+class LLPanelSnapshotProfile
+: public LLPanelSnapshot
+{
+ LOG_CLASS(LLPanelSnapshotProfile);
+
+public:
+ LLPanelSnapshotProfile();
+
+ /*virtual*/ BOOL postBuild();
+ /*virtual*/ void onOpen(const LLSD& key);
+
+private:
+ /*virtual*/ std::string getWidthSpinnerName() const { return "profile_snapshot_width"; }
+ /*virtual*/ std::string getHeightSpinnerName() const { return "profile_snapshot_height"; }
+ /*virtual*/ std::string getAspectRatioCBName() const { return "profile_keep_aspect_check"; }
+ /*virtual*/ std::string getImageSizeComboName() const { return "profile_size_combo"; }
+ /*virtual*/ std::string getImageSizePanelName() const { return "profile_image_size_lp"; }
+ /*virtual*/ LLFloaterSnapshot::ESnapshotFormat getImageFormat() const { return LLFloaterSnapshot::SNAPSHOT_FORMAT_PNG; }
+ /*virtual*/ void updateControls(const LLSD& info);
+
+ void onSend();
+};
+
+static LLRegisterPanelClassWrapper<LLPanelSnapshotProfile> panel_class("llpanelsnapshotprofile");
+
+LLPanelSnapshotProfile::LLPanelSnapshotProfile()
+{
+ mCommitCallbackRegistrar.add("PostToProfile.Send", boost::bind(&LLPanelSnapshotProfile::onSend, this));
+ mCommitCallbackRegistrar.add("PostToProfile.Cancel", boost::bind(&LLPanelSnapshotProfile::cancel, this));
+}
+
+// virtual
+BOOL LLPanelSnapshotProfile::postBuild()
+{
+ return LLPanelSnapshot::postBuild();
+}
+
+// virtual
+void LLPanelSnapshotProfile::onOpen(const LLSD& key)
+{
+ LLPanelSnapshot::onOpen(key);
+}
+
+// virtual
+void LLPanelSnapshotProfile::updateControls(const LLSD& info)
+{
+ const bool have_snapshot = info.has("have-snapshot") ? info["have-snapshot"].asBoolean() : true;
+ getChild<LLUICtrl>("post_btn")->setEnabled(have_snapshot);
+}
+
+void LLPanelSnapshotProfile::onSend()
+{
+ std::string caption = getChild<LLUICtrl>("caption")->getValue().asString();
+ bool add_location = getChild<LLUICtrl>("add_location_cb")->getValue().asBoolean();
+
+ LLWebProfile::uploadImage(LLFloaterSnapshot::getImageData(), caption, add_location);
+ LLFloaterSnapshot::postSave();
+}
diff --git a/indra/newview/llpanelteleporthistory.cpp b/indra/newview/llpanelteleporthistory.cpp
index 9b35e78134..1f1cccad85 100644
--- a/indra/newview/llpanelteleporthistory.cpp
+++ b/indra/newview/llpanelteleporthistory.cpp
@@ -31,7 +31,6 @@
#include "llfloaterworldmap.h"
#include "llpanelteleporthistory.h"
-#include "llsidetray.h"
#include "llworldmap.h"
#include "llteleporthistorystorage.h"
#include "lltextutil.h"
@@ -39,6 +38,7 @@
#include "llaccordionctrl.h"
#include "llaccordionctrltab.h"
#include "llflatlistview.h"
+#include "llfloatersidepanelcontainer.h"
#include "llnotificationsutil.h"
#include "lltextbox.h"
#include "lltoggleablemenu.h"
@@ -221,7 +221,7 @@ void LLTeleportHistoryFlatItem::showPlaceInfoPanel(S32 index)
params["id"] = index;
params["type"] = "teleport_history";
- LLSideTray::getInstance()->showPanel("panel_places", params);
+ LLFloaterSidePanelContainer::showPanel("places", params);
}
void LLTeleportHistoryFlatItem::onProfileBtnClick()
@@ -388,7 +388,8 @@ LLTeleportHistoryPanel::LLTeleportHistoryPanel()
LLTeleportHistoryPanel::~LLTeleportHistoryPanel()
{
LLTeleportHistoryFlatItemStorage::instance().purge();
- LLView::deleteViewByHandle(mGearMenuHandle);
+ if (mGearMenuHandle.get()) mGearMenuHandle.get()->die();
+ mTeleportHistoryChangedConnection.disconnect();
}
BOOL LLTeleportHistoryPanel::postBuild()
@@ -396,7 +397,7 @@ BOOL LLTeleportHistoryPanel::postBuild()
mTeleportHistory = LLTeleportHistoryStorage::getInstance();
if (mTeleportHistory)
{
- mTeleportHistory->setHistoryChangedCallback(boost::bind(&LLTeleportHistoryPanel::onTeleportHistoryChange, this, _1));
+ mTeleportHistoryChangedConnection = mTeleportHistory->setHistoryChangedCallback(boost::bind(&LLTeleportHistoryPanel::onTeleportHistoryChange, this, _1));
}
mHistoryAccordion = getChild<LLAccordionCtrl>("history_accordion");
@@ -679,29 +680,32 @@ void LLTeleportHistoryPanel::refresh()
// tab_boundary_date would be earliest possible date for this tab
S32 tab_idx = 0;
getNextTab(date, tab_idx, tab_boundary_date);
-
- LLAccordionCtrlTab* tab = mItemContainers.get(mItemContainers.size() - 1 - tab_idx);
- tab->setVisible(true);
-
- // Expand all accordion tabs when filtering
- if(!sFilterSubString.empty())
+ tab_idx = mItemContainers.size() - 1 - tab_idx;
+ if (tab_idx >= 0)
{
- //store accordion tab state when filter is not empty
- tab->notifyChildren(LLSD().with("action","store_state"));
-
- tab->setDisplayChildren(true);
- }
- // Restore each tab's expand state when not filtering
- else
- {
- bool collapsed = isAccordionCollapsedByUser(tab);
- tab->setDisplayChildren(!collapsed);
+ LLAccordionCtrlTab* tab = mItemContainers.get(tab_idx);
+ tab->setVisible(true);
+
+ // Expand all accordion tabs when filtering
+ if(!sFilterSubString.empty())
+ {
+ //store accordion tab state when filter is not empty
+ tab->notifyChildren(LLSD().with("action","store_state"));
- //restore accordion state after all those accodrion tabmanipulations
- tab->notifyChildren(LLSD().with("action","restore_state"));
- }
+ tab->setDisplayChildren(true);
+ }
+ // Restore each tab's expand state when not filtering
+ else
+ {
+ bool collapsed = isAccordionCollapsedByUser(tab);
+ tab->setDisplayChildren(!collapsed);
+
+ //restore accordion state after all those accodrion tabmanipulations
+ tab->notifyChildren(LLSD().with("action","restore_state"));
+ }
- curr_flat_view = getFlatListViewFromTab(tab);
+ curr_flat_view = getFlatListViewFromTab(tab);
+ }
}
if (curr_flat_view)
@@ -760,7 +764,12 @@ void LLTeleportHistoryPanel::onTeleportHistoryChange(S32 removed_index)
void LLTeleportHistoryPanel::replaceItem(S32 removed_index)
{
// Flat list for 'Today' (mItemContainers keeps accordion tabs in reverse order)
- LLFlatListView* fv = getFlatListViewFromTab(mItemContainers[mItemContainers.size() - 1]);
+ LLFlatListView* fv = NULL;
+
+ if (mItemContainers.size() > 0)
+ {
+ fv = getFlatListViewFromTab(mItemContainers[mItemContainers.size() - 1]);
+ }
// Empty flat list for 'Today' means that other flat lists are empty as well,
// so all items from teleport history should be added.
@@ -828,19 +837,27 @@ void LLTeleportHistoryPanel::showTeleportHistory()
// Starting to add items from last one, in reverse order,
// since TeleportHistory keeps most recent item at the end
+ if (!mTeleportHistory)
+ {
+ mTeleportHistory = LLTeleportHistoryStorage::getInstance();
+ }
+
mCurrentItem = mTeleportHistory->getItems().size() - 1;
for (S32 n = mItemContainers.size() - 1; n >= 0; --n)
{
LLAccordionCtrlTab* tab = mItemContainers.get(n);
- tab->setVisible(false);
-
- LLFlatListView* fv = getFlatListViewFromTab(tab);
- if (fv)
+ if (tab)
{
- // Detached panels are managed by LLTeleportHistoryFlatItemStorage
- std::vector<LLPanel*> detached_items;
- fv->detachItems(detached_items);
+ tab->setVisible(false);
+
+ LLFlatListView* fv = getFlatListViewFromTab(tab);
+ if (fv)
+ {
+ // Detached panels are managed by LLTeleportHistoryFlatItemStorage
+ std::vector<LLPanel*> detached_items;
+ fv->detachItems(detached_items);
+ }
}
}
}
diff --git a/indra/newview/llpanelteleporthistory.h b/indra/newview/llpanelteleporthistory.h
index 3d29454d15..47b607a2f4 100644
--- a/indra/newview/llpanelteleporthistory.h
+++ b/indra/newview/llpanelteleporthistory.h
@@ -119,6 +119,8 @@ private:
LLContextMenu* mAccordionTabMenu;
LLHandle<LLView> mGearMenuHandle;
LLMenuButton* mMenuGearButton;
+
+ boost::signals2::connection mTeleportHistoryChangedConnection;
};
diff --git a/indra/newview/llpaneltopinfobar.cpp b/indra/newview/llpaneltopinfobar.cpp
index 7087541fc8..eb4c7572d4 100644
--- a/indra/newview/llpaneltopinfobar.cpp
+++ b/indra/newview/llpaneltopinfobar.cpp
@@ -31,11 +31,11 @@
#include "llagent.h"
#include "llagentui.h"
#include "llclipboard.h"
+#include "llfloatersidepanelcontainer.h"
#include "lllandmarkactions.h"
#include "lllocationinputctrl.h"
#include "llnotificationsutil.h"
#include "llparcel.h"
-#include "llsidetray.h"
#include "llslurl.h"
#include "llstatusbar.h"
#include "lltrans.h"
@@ -203,6 +203,11 @@ void LLPanelTopInfoBar::onVisibilityChange(const LLSD& show)
gFloaterView->setMinimizePositionVerticalOffset(minimize_pos_offset);
}
+boost::signals2::connection LLPanelTopInfoBar::setResizeCallback( const resize_signal_t::slot_type& cb )
+{
+ return mResizeSignal.connect(cb);
+}
+
void LLPanelTopInfoBar::draw()
{
updateParcelInfoText();
@@ -224,6 +229,7 @@ void LLPanelTopInfoBar::buildLocationString(std::string& loc_str, bool show_coor
void LLPanelTopInfoBar::setParcelInfoText(const std::string& new_text)
{
+ LLRect old_rect = getRect();
const LLFontGL* font = mParcelInfoText->getDefaultFont();
S32 new_text_width = font->getWidth(new_text);
@@ -235,6 +241,11 @@ void LLPanelTopInfoBar::setParcelInfoText(const std::string& new_text)
mParcelInfoText->reshape(rect.getWidth(), rect.getHeight(), TRUE);
mParcelInfoText->setRect(rect);
layoutParcelIcons();
+
+ if (old_rect != getRect())
+ {
+ mResizeSignal();
+ }
}
void LLPanelTopInfoBar::update()
@@ -342,6 +353,8 @@ void LLPanelTopInfoBar::updateHealth()
void LLPanelTopInfoBar::layoutParcelIcons()
{
+ LLRect old_rect = getRect();
+
// TODO: remove hard-coded values and read them as xml parameters
static const int FIRST_ICON_HPAD = 32;
static const int LAST_ICON_HPAD = 11;
@@ -358,6 +371,11 @@ void LLPanelTopInfoBar::layoutParcelIcons()
LLRect rect = getRect();
rect.set(rect.mLeft, rect.mTop, left + LAST_ICON_HPAD, rect.mBottom);
setRect(rect);
+
+ if (old_rect != getRect())
+ {
+ mResizeSignal();
+ }
}
S32 LLPanelTopInfoBar::layoutWidget(LLUICtrl* ctrl, S32 left)
@@ -436,12 +454,11 @@ void LLPanelTopInfoBar::onContextMenuItemClicked(const LLSD::String& item)
if(landmark == NULL)
{
- LLSideTray::getInstance()->showPanel("panel_places", LLSD().with("type", "create_landmark"));
+ LLFloaterSidePanelContainer::showPanel("places", LLSD().with("type", "create_landmark"));
}
else
{
- LLSideTray::getInstance()->showPanel("panel_places",
- LLSD().with("type", "landmark").with("id",landmark->getUUID()));
+ LLFloaterSidePanelContainer::showPanel("places", LLSD().with("type", "landmark").with("id",landmark->getUUID()));
}
}
else if (item == "copy")
@@ -456,5 +473,5 @@ void LLPanelTopInfoBar::onContextMenuItemClicked(const LLSD::String& item)
void LLPanelTopInfoBar::onInfoButtonClicked()
{
- LLSideTray::getInstance()->showPanel("panel_places", LLSD().with("type", "agent"));
+ LLFloaterSidePanelContainer::showPanel("places", LLSD().with("type", "agent"));
}
diff --git a/indra/newview/llpaneltopinfobar.h b/indra/newview/llpaneltopinfobar.h
index 583e91d15e..d58d95be90 100644
--- a/indra/newview/llpaneltopinfobar.h
+++ b/indra/newview/llpaneltopinfobar.h
@@ -41,6 +41,8 @@ class LLPanelTopInfoBar : public LLPanel, public LLSingleton<LLPanelTopInfoBar>,
friend class LLDestroyClass<LLPanelTopInfoBar>;
public:
+ typedef boost::signals2::signal<void ()> resize_signal_t;
+
LLPanelTopInfoBar();
~LLPanelTopInfoBar();
@@ -57,6 +59,8 @@ public:
*/
void onVisibilityChange(const LLSD& show);
+ boost::signals2::connection setResizeCallback( const resize_signal_t::slot_type& cb );
+
private:
class LLParcelChangeObserver;
@@ -148,7 +152,7 @@ private:
void setParcelInfoText(const std::string& new_text);
/**
- * Implementation of LLDestroyClass<LLSideTray>
+ * Implementation of LLDestroyClass<T>
*/
static void destroyClass()
{
@@ -167,6 +171,8 @@ private:
boost::signals2::connection mParcelPropsCtrlConnection;
boost::signals2::connection mShowCoordsCtrlConnection;
boost::signals2::connection mParcelMgrConnection;
+
+ resize_signal_t mResizeSignal;
};
#endif /* LLPANELTOPINFOBAR_H_ */
diff --git a/indra/newview/llpanelwearing.cpp b/indra/newview/llpanelwearing.cpp
index f19b54c1d4..e2801c09bd 100644
--- a/indra/newview/llpanelwearing.cpp
+++ b/indra/newview/llpanelwearing.cpp
@@ -31,11 +31,11 @@
#include "lltoggleablemenu.h"
#include "llappearancemgr.h"
+#include "llfloatersidepanelcontainer.h"
#include "llinventoryfunctions.h"
#include "llinventorymodel.h"
#include "llinventoryobserver.h"
#include "llmenubutton.h"
-#include "llsidetray.h"
#include "llviewermenu.h"
#include "llwearableitemslist.h"
#include "llsdserialize.h"
@@ -44,7 +44,7 @@
// Context menu and Gear menu helper.
static void edit_outfit()
{
- LLSideTray::getInstance()->showPanel("sidepanel_appearance", LLSD().with("type", "edit_outfit"));
+ LLFloaterSidePanelContainer::showPanel("appearance", LLSD().with("type", "edit_outfit"));
}
//////////////////////////////////////////////////////////////////////////
diff --git a/indra/newview/llparticipantlist.cpp b/indra/newview/llparticipantlist.cpp
index fb1153980a..5c95e805ce 100644
--- a/indra/newview/llparticipantlist.cpp
+++ b/indra/newview/llparticipantlist.cpp
@@ -468,7 +468,7 @@ void LLParticipantList::setValidateSpeakerCallback(validate_speaker_callback_t c
void LLParticipantList::updateRecentSpeakersOrder()
{
- if (E_SORT_BY_RECENT_SPEAKERS == getSortOrder())
+ if (E_SORT_BY_RECENT_SPEAKERS == getSortOrder() && !isHovered())
{
// Need to update speakers to sort list correctly
mSpeakerMgr->update(true);
@@ -477,6 +477,13 @@ void LLParticipantList::updateRecentSpeakersOrder()
}
}
+bool LLParticipantList::isHovered()
+{
+ S32 x, y;
+ LLUI::getMousePositionScreen(&x, &y);
+ return mAvatarList->calcScreenRect().pointInRect(x, y);
+}
+
bool LLParticipantList::onAddItemEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata)
{
LLUUID uu_id = event->getValue().asUUID();
diff --git a/indra/newview/llparticipantlist.h b/indra/newview/llparticipantlist.h
index e0b3d42c25..a001d29b67 100644
--- a/indra/newview/llparticipantlist.h
+++ b/indra/newview/llparticipantlist.h
@@ -251,6 +251,8 @@ private:
*/
void adjustParticipant(const LLUUID& speaker_id);
+ bool isHovered();
+
LLSpeakerMgr* mSpeakerMgr;
LLAvatarList* mAvatarList;
diff --git a/indra/newview/llpostcard.cpp b/indra/newview/llpostcard.cpp
new file mode 100644
index 0000000000..4f2d6da7e5
--- /dev/null
+++ b/indra/newview/llpostcard.cpp
@@ -0,0 +1,155 @@
+/**
+ * @file llpostcard.cpp
+ * @brief Sending postcards.
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llpostcard.h"
+
+#include "llvfile.h"
+#include "llvfs.h"
+#include "llviewerregion.h"
+
+#include "message.h"
+
+#include "llagent.h"
+#include "llassetuploadresponders.h"
+
+///////////////////////////////////////////////////////////////////////////////
+// misc
+
+static void postcard_upload_callback(const LLUUID& asset_id, void *user_data, S32 result, LLExtStat ext_status)
+{
+ LLSD* postcard_data = (LLSD*)user_data;
+
+ if (result)
+ {
+ // TODO: display the error messages in UI
+ llwarns << "Failed to send postcard: " << LLAssetStorage::getErrorString(result) << llendl;
+ LLPostCard::reportPostResult(false);
+ }
+ else
+ {
+ // only create the postcard once the upload succeeds
+
+ // request the postcard
+ const LLSD& data = *postcard_data;
+ LLMessageSystem* msg = gMessageSystem;
+ msg->newMessage("SendPostcard");
+ msg->nextBlock("AgentData");
+ msg->addUUID("AgentID", gAgent.getID());
+ msg->addUUID("SessionID", gAgent.getSessionID());
+ msg->addUUID("AssetID", data["asset-id"].asUUID());
+ msg->addVector3d("PosGlobal", LLVector3d(data["pos-global"]));
+ msg->addString("To", data["to"]);
+ msg->addString("From", data["from"]);
+ msg->addString("Name", data["name"]);
+ msg->addString("Subject", data["subject"]);
+ msg->addString("Msg", data["msg"]);
+ msg->addBOOL("AllowPublish", FALSE);
+ msg->addBOOL("MaturePublish", FALSE);
+ gAgent.sendReliableMessage();
+
+ LLPostCard::reportPostResult(true);
+ }
+
+ delete postcard_data;
+}
+
+
+///////////////////////////////////////////////////////////////////////////////
+// LLPostcardSendResponder
+
+class LLPostcardSendResponder : public LLAssetUploadResponder
+{
+ LOG_CLASS(LLPostcardSendResponder);
+
+public:
+ LLPostcardSendResponder(const LLSD &post_data,
+ const LLUUID& vfile_id,
+ LLAssetType::EType asset_type):
+ LLAssetUploadResponder(post_data, vfile_id, asset_type)
+ {
+ }
+
+ /*virtual*/ void uploadComplete(const LLSD& content)
+ {
+ llinfos << "Postcard sent" << llendl;
+ LL_DEBUGS("Snapshots") << "content: " << content << llendl;
+ LLPostCard::reportPostResult(true);
+ }
+
+ /*virtual*/ void uploadFailure(const LLSD& content)
+ {
+ llwarns << "Sending postcard failed: " << content << llendl;
+ LLPostCard::reportPostResult(false);
+ }
+};
+
+///////////////////////////////////////////////////////////////////////////////
+// LLPostCard
+
+LLPostCard::result_callback_t LLPostCard::mResultCallback;
+
+// static
+void LLPostCard::send(LLPointer<LLImageFormatted> image, const LLSD& postcard_data)
+{
+ LLTransactionID transaction_id;
+ LLAssetID asset_id;
+
+ transaction_id.generate();
+ asset_id = transaction_id.makeAssetID(gAgent.getSecureSessionID());
+ LLVFile::writeFile(image->getData(), image->getDataSize(), gVFS, asset_id, LLAssetType::AT_IMAGE_JPEG);
+
+ // upload the image
+ std::string url = gAgent.getRegion()->getCapability("SendPostcard");
+ if (!url.empty())
+ {
+ llinfos << "Sending postcard via capability" << llendl;
+ // the capability already encodes: agent ID, region ID
+ LL_DEBUGS("Snapshots") << "url: " << url << llendl;
+ LL_DEBUGS("Snapshots") << "body: " << postcard_data << llendl;
+ LL_DEBUGS("Snapshots") << "data size: " << image->getDataSize() << llendl;
+ LLHTTPClient::post(url, postcard_data,
+ new LLPostcardSendResponder(postcard_data, asset_id, LLAssetType::AT_IMAGE_JPEG));
+ }
+ else
+ {
+ llinfos << "Sending postcard" << llendl;
+ LLSD* data = new LLSD(postcard_data);
+ (*data)["asset-id"] = asset_id;
+ gAssetStorage->storeAssetData(transaction_id, LLAssetType::AT_IMAGE_JPEG,
+ &postcard_upload_callback, (void *)data, FALSE);
+ }
+}
+
+// static
+void LLPostCard::reportPostResult(bool ok)
+{
+ if (mResultCallback)
+ {
+ mResultCallback(ok);
+ }
+}
diff --git a/indra/newview/llpostcard.h b/indra/newview/llpostcard.h
new file mode 100644
index 0000000000..0eb118b906
--- /dev/null
+++ b/indra/newview/llpostcard.h
@@ -0,0 +1,48 @@
+/**
+ * @file llpostcard.h
+ * @brief Sending postcards.
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLPOSTCARD_H
+#define LL_LLPOSTCARD_H
+
+#include "llimage.h"
+#include "lluuid.h"
+
+class LLPostCard
+{
+ LOG_CLASS(LLPostCard);
+
+public:
+ typedef boost::function<void(bool ok)> result_callback_t;
+
+ static void send(LLPointer<LLImageFormatted> image, const LLSD& postcard_data);
+ static void setPostResultCallback(result_callback_t cb) { mResultCallback = cb; }
+ static void reportPostResult(bool ok);
+
+private:
+ static result_callback_t mResultCallback;
+};
+
+#endif // LL_LLPOSTCARD_H
diff --git a/indra/newview/llpreview.cpp b/indra/newview/llpreview.cpp
index 119fc95cf0..18626e3273 100644
--- a/indra/newview/llpreview.cpp
+++ b/indra/newview/llpreview.cpp
@@ -363,8 +363,10 @@ void LLPreview::onBtnCopyToInv(void* userdata)
// Copy to inventory
if (self->mNotecardInventoryID.notNull())
{
- copy_inventory_from_notecard(self->mNotecardObjectID,
- self->mNotecardInventoryID, item);
+ copy_inventory_from_notecard(LLUUID::null,
+ self->mNotecardObjectID,
+ self->mNotecardInventoryID,
+ item);
}
else
{
diff --git a/indra/newview/llpreviewscript.cpp b/indra/newview/llpreviewscript.cpp
index b19bf5d234..88727bf59b 100644
--- a/indra/newview/llpreviewscript.cpp
+++ b/indra/newview/llpreviewscript.cpp
@@ -35,6 +35,7 @@
#include "llcombobox.h"
#include "lldir.h"
#include "llexternaleditor.h"
+#include "llfilepicker.h"
#include "llfloaterreg.h"
#include "llinventorydefines.h"
#include "llinventorymodel.h"
@@ -503,6 +504,14 @@ void LLScriptEdCore::initMenu()
menuItem = getChild<LLMenuItemCallGL>("Keyword Help...");
menuItem->setClickCallback(boost::bind(&LLScriptEdCore::onBtnDynamicHelp, this));
+
+ menuItem = getChild<LLMenuItemCallGL>("LoadFromFile");
+ menuItem->setClickCallback(boost::bind(&LLScriptEdCore::onBtnLoadFromFile, this));
+ menuItem->setEnableCallback(boost::bind(&LLScriptEdCore::enableLoadFromFileMenu, this));
+
+ menuItem = getChild<LLMenuItemCallGL>("SaveToFile");
+ menuItem->setClickCallback(boost::bind(&LLScriptEdCore::onBtnSaveToFile, this));
+ menuItem->setEnableCallback(boost::bind(&LLScriptEdCore::enableSaveToFileMenu, this));
}
void LLScriptEdCore::setScriptText(const std::string& text, BOOL is_valid)
@@ -1096,6 +1105,88 @@ BOOL LLScriptEdCore::handleKeyHere(KEY key, MASK mask)
return FALSE;
}
+void LLScriptEdCore::onBtnLoadFromFile( void* data )
+{
+ LLScriptEdCore* self = (LLScriptEdCore*) data;
+
+ // TODO Maybe add a dialogue warning here if the current file has unsaved changes.
+ LLFilePicker& file_picker = LLFilePicker::instance();
+ if( !file_picker.getOpenFile( LLFilePicker::FFLOAD_SCRIPT ) )
+ {
+ //File picking cancelled by user, so nothing to do.
+ return;
+ }
+
+ std::string filename = file_picker.getFirstFile();
+
+ std::ifstream fin(filename.c_str());
+
+ std::string line;
+ std::string text;
+ std::string linetotal;
+ while (!fin.eof())
+ {
+ getline(fin,line);
+ text += line;
+ if (!fin.eof())
+ {
+ text += "\n";
+ }
+ }
+ fin.close();
+
+ // Only replace the script if there is something to replace with.
+ if (text.length() > 0)
+ {
+ self->mEditor->selectAll();
+ LLWString script(utf8str_to_wstring(text));
+ self->mEditor->insertText(script);
+ }
+}
+
+void LLScriptEdCore::onBtnSaveToFile( void* userdata )
+{
+
+ LLViewerStats::getInstance()->incStat( LLViewerStats::ST_LSL_SAVE_COUNT );
+
+ LLScriptEdCore* self = (LLScriptEdCore*) userdata;
+
+ if( self->mSaveCallback )
+ {
+ LLFilePicker& file_picker = LLFilePicker::instance();
+ if( file_picker.getSaveFile( LLFilePicker::FFSAVE_SCRIPT ) )
+ {
+ std::string filename = file_picker.getFirstFile();
+ std::string scriptText=self->mEditor->getText();
+ std::ofstream fout(filename.c_str());
+ fout<<(scriptText);
+ fout.close();
+ self->mSaveCallback( self->mUserdata, FALSE );
+ }
+ }
+}
+
+bool LLScriptEdCore::canLoadOrSaveToFile( void* userdata )
+{
+ LLScriptEdCore* self = (LLScriptEdCore*) userdata;
+ return self->mEditor->canLoadOrSaveToFile();
+}
+
+// static
+bool LLScriptEdCore::enableSaveToFileMenu(void* userdata)
+{
+ LLScriptEdCore* self = (LLScriptEdCore*)userdata;
+ if (!self || !self->mEditor) return FALSE;
+ return self->mEditor->canLoadOrSaveToFile();
+}
+
+// static
+bool LLScriptEdCore::enableLoadFromFileMenu(void* userdata)
+{
+ LLScriptEdCore* self = (LLScriptEdCore*)userdata;
+ return (self && self->mEditor) ? self->mEditor->canLoadOrSaveToFile() : FALSE;
+}
+
/// ---------------------------------------------------------------------------
/// LLScriptEdContainer
/// ---------------------------------------------------------------------------
diff --git a/indra/newview/llpreviewscript.h b/indra/newview/llpreviewscript.h
index f86be615c4..7563cecd9d 100644
--- a/indra/newview/llpreviewscript.h
+++ b/indra/newview/llpreviewscript.h
@@ -79,6 +79,7 @@ public:
/*virtual*/ BOOL postBuild();
BOOL canClose();
void setEnableEditing(bool enable);
+ bool canLoadOrSaveToFile( void* userdata );
void setScriptText(const std::string& text, BOOL is_valid);
bool loadScriptText(const std::string& filename);
@@ -98,6 +99,11 @@ public:
static void onClickForward(void* userdata);
static void onBtnInsertSample(void*);
static void onBtnInsertFunction(LLUICtrl*, void*);
+ static void onBtnLoadFromFile(void*);
+ static void onBtnSaveToFile(void*);
+
+ static bool enableSaveToFileMenu(void* userdata);
+ static bool enableLoadFromFileMenu(void* userdata);
virtual bool hasAccelerators() const { return true; }
diff --git a/indra/newview/llpreviewtexture.cpp b/indra/newview/llpreviewtexture.cpp
index 18d6731fcb..3ff5a05d81 100644
--- a/indra/newview/llpreviewtexture.cpp
+++ b/indra/newview/llpreviewtexture.cpp
@@ -169,7 +169,7 @@ void LLPreviewTexture::draw()
saveAs();
}
// Draw the texture
- glColor3f( 1.f, 1.f, 1.f );
+ gGL.diffuseColor3f( 1.f, 1.f, 1.f );
gl_draw_scaled_image(interior.mLeft,
interior.mBottom,
interior.getWidth(),
diff --git a/indra/newview/llprogressview.cpp b/indra/newview/llprogressview.cpp
index a1f38f1854..5d7a5b1c59 100644
--- a/indra/newview/llprogressview.cpp
+++ b/indra/newview/llprogressview.cpp
@@ -187,7 +187,7 @@ void LLProgressView::setVisible(BOOL visible)
void LLProgressView::drawStartTexture(F32 alpha)
{
- glPushMatrix();
+ gGL.pushMatrix();
if (gStartTexture)
{
LLGLSUIDefault gls_ui;
@@ -200,13 +200,13 @@ void LLProgressView::drawStartTexture(F32 alpha)
// stretch image to maintain aspect ratio
if (image_aspect > view_aspect)
{
- glTranslatef(-0.5f * (image_aspect / view_aspect - 1.f) * width, 0.f, 0.f);
- glScalef(image_aspect / view_aspect, 1.f, 1.f);
+ gGL.translatef(-0.5f * (image_aspect / view_aspect - 1.f) * width, 0.f, 0.f);
+ gGL.scalef(image_aspect / view_aspect, 1.f, 1.f);
}
else
{
- glTranslatef(0.f, -0.5f * (view_aspect / image_aspect - 1.f) * height, 0.f);
- glScalef(1.f, view_aspect / image_aspect, 1.f);
+ gGL.translatef(0.f, -0.5f * (view_aspect / image_aspect - 1.f) * height, 0.f);
+ gGL.scalef(1.f, view_aspect / image_aspect, 1.f);
}
gl_rect_2d_simple_tex( getRect().getWidth(), getRect().getHeight() );
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
@@ -217,7 +217,7 @@ void LLProgressView::drawStartTexture(F32 alpha)
gGL.color4f(0.f, 0.f, 0.f, 1.f);
gl_rect_2d(getRect());
}
- glPopMatrix();
+ gGL.popMatrix();
}
diff --git a/indra/newview/llscreenchannel.cpp b/indra/newview/llscreenchannel.cpp
index e3bc67a414..5301955964 100644
--- a/indra/newview/llscreenchannel.cpp
+++ b/indra/newview/llscreenchannel.cpp
@@ -41,7 +41,7 @@
#include "llsyswellwindow.h"
#include "llimfloater.h"
#include "llscriptfloater.h"
-#include "llsidetray.h"
+#include "llrootview.h"
#include <algorithm>
@@ -49,72 +49,101 @@ using namespace LLNotificationsUI;
bool LLScreenChannel::mWasStartUpToastShown = false;
+LLFastTimer::DeclareTimer FTM_GET_CHANNEL_RECT("Calculate Notification Channel Region");
+LLRect LLScreenChannelBase::getChannelRect()
+{
+ LLFastTimer _(FTM_GET_CHANNEL_RECT);
+
+ if (mFloaterSnapRegion == NULL)
+ {
+ mFloaterSnapRegion = gViewerWindow->getRootView()->getChildView("floater_snap_region");
+ }
+
+ if (mChicletRegion == NULL)
+ {
+ mChicletRegion = gViewerWindow->getRootView()->getChildView("chiclet_container");
+ }
+
+ LLRect channel_rect;
+ LLRect chiclet_rect;
+
+ mFloaterSnapRegion->localRectToScreen(mFloaterSnapRegion->getLocalRect(), &channel_rect);
+ mChicletRegion->localRectToScreen(mChicletRegion->getLocalRect(), &chiclet_rect);
+
+ channel_rect.mTop = chiclet_rect.mBottom;
+ return channel_rect;
+}
+
+
//--------------------------------------------------------------------------
//////////////////////
// LLScreenChannelBase
//////////////////////
-LLScreenChannelBase::LLScreenChannelBase(const LLUUID& id) :
- mToastAlignment(NA_BOTTOM)
- ,mCanStoreToasts(true)
- ,mHiddenToastsNum(0)
- ,mHoveredToast(NULL)
- ,mControlHovering(false)
- ,mShowToasts(true)
-{
- mID = id;
- mWorldViewRectConnection = gViewerWindow->setOnWorldViewRectUpdated(boost::bind(&LLScreenChannelBase::updatePositionAndSize, this, _1, _2));
+LLScreenChannelBase::LLScreenChannelBase(const Params& p)
+: LLUICtrl(p),
+ mToastAlignment(p.toast_align),
+ mCanStoreToasts(true),
+ mHiddenToastsNum(0),
+ mHoveredToast(NULL),
+ mControlHovering(false),
+ mShowToasts(true),
+ mID(p.id),
+ mDisplayToastsAlways(p.display_toasts_always),
+ mChannelAlignment(p.channel_align),
+ mFloaterSnapRegion(NULL),
+ mChicletRegion(NULL)
+{
+ mID = p.id;
setMouseOpaque( false );
setVisible(FALSE);
}
-LLScreenChannelBase::~LLScreenChannelBase()
-{
- mWorldViewRectConnection.disconnect();
-}
-bool LLScreenChannelBase::isHovering()
+BOOL LLScreenChannelBase::postBuild()
{
- if (!mHoveredToast)
+ if (mFloaterSnapRegion == NULL)
{
- return false;
+ mFloaterSnapRegion = gViewerWindow->getRootView()->getChildView("floater_snap_region");
}
-
- return mHoveredToast->isHovered();
+
+ if (mChicletRegion == NULL)
+ {
+ mChicletRegion = gViewerWindow->getRootView()->getChildView("chiclet_container");
+ }
+
+ return TRUE;
}
-void LLScreenChannelBase::resetPositionAndSize()
+void LLScreenChannelBase::reshape(S32 width, S32 height, BOOL called_from_parent)
{
- LLRect rc = gViewerWindow->getWorldViewRectScaled();
- updatePositionAndSize(rc, rc);
+ redrawToasts();
}
-void LLScreenChannelBase::updatePositionAndSize(LLRect old_world_rect, LLRect new_world_rect)
+bool LLScreenChannelBase::isHovering()
{
- /*
- take sidetray into account - screenchannel should not overlap sidetray
- */
- S32 world_rect_padding = 0;
- if (gSavedSettings.getBOOL("SidebarCameraMovement") == FALSE
- && LLSideTray::instanceCreated ())
+ if (!mHoveredToast)
{
- world_rect_padding += LLSideTray::getInstance()->getVisibleWidth();
+ return false;
}
+ return mHoveredToast->isHovered();
+}
- S32 top_delta = old_world_rect.mTop - new_world_rect.mTop;
+void LLScreenChannelBase::updatePositionAndSize(LLRect rect)
+{
LLRect this_rect = getRect();
- this_rect.mTop -= top_delta;
+ this_rect.mTop = rect.mTop;
switch(mChannelAlignment)
{
case CA_LEFT :
break;
case CA_CENTRE :
- this_rect.setCenterAndSize( (new_world_rect.getWidth() - world_rect_padding) / 2, new_world_rect.getHeight() / 2, this_rect.getWidth(), this_rect.getHeight());
+ this_rect.setCenterAndSize( (rect.getWidth()) / 2, rect.getHeight() / 2, this_rect.getWidth(), this_rect.getHeight());
break;
case CA_RIGHT :
- this_rect.setLeftTopAndSize(new_world_rect.mRight - world_rect_padding - this_rect.getWidth(),
+ this_rect.setLeftTopAndSize(rect.mRight - this_rect.getWidth(),
this_rect.mTop,
this_rect.getWidth(),
this_rect.getHeight());
@@ -126,45 +155,38 @@ void LLScreenChannelBase::updatePositionAndSize(LLRect old_world_rect, LLRect ne
void LLScreenChannelBase::init(S32 channel_left, S32 channel_right)
{
- if(LLSideTray::instanceCreated())
- {
- LLSideTray* side_bar = LLSideTray::getInstance();
- side_bar->setVisibleWidthChangeCallback(boost::bind(&LLScreenChannelBase::resetPositionAndSize, this));
- }
-
- // top and bottom set by updateBottom()
+ // top and bottom set by updateRect()
setRect(LLRect(channel_left, 0, channel_right, 0));
- updateBottom();
+ updateRect();
setVisible(TRUE);
}
-void LLScreenChannelBase::updateBottom()
+void LLScreenChannelBase::updateRect()
{
- S32 channel_top = gViewerWindow->getWorldViewRectScaled().getHeight();
- S32 channel_bottom = gSavedSettings.getS32("ChannelBottomPanelMargin");
+ S32 channel_top = getChannelRect().mTop;
+ S32 channel_bottom = getChannelRect().mBottom + gSavedSettings.getS32("ChannelBottomPanelMargin");
S32 channel_left = getRect().mLeft;
S32 channel_right = getRect().mRight;
setRect(LLRect(channel_left, channel_top, channel_right, channel_bottom));
}
-
//--------------------------------------------------------------------------
//////////////////////
// LLScreenChannel
//////////////////////
//--------------------------------------------------------------------------
-LLScreenChannel::LLScreenChannel(LLUUID& id):
-LLScreenChannelBase(id)
-,mStartUpToastPanel(NULL)
-{
+LLScreenChannel::LLScreenChannel(const Params& p)
+: LLScreenChannelBase(p),
+ mStartUpToastPanel(NULL)
+{
}
//--------------------------------------------------------------------------
void LLScreenChannel::init(S32 channel_left, S32 channel_right)
{
LLScreenChannelBase::init(channel_left, channel_right);
- LLRect world_rect = gViewerWindow->getWorldViewRectScaled();
- updatePositionAndSize(world_rect, world_rect);
+ LLRect channel_rect = getChannelRect();
+ updatePositionAndSize(channel_rect);
}
//--------------------------------------------------------------------------
@@ -201,19 +223,8 @@ std::list<LLToast*> LLScreenChannel::findToasts(const Matcher& matcher)
}
//--------------------------------------------------------------------------
-void LLScreenChannel::updatePositionAndSize(LLRect old_world_rect, LLRect new_world_rect)
+void LLScreenChannel::updatePositionAndSize(LLRect new_world_rect)
{
- /*
- take sidetray into account - screenchannel should not overlap sidetray
- */
- S32 world_rect_padding = 0;
- if (gSavedSettings.getBOOL("SidebarCameraMovement") == FALSE
- && LLSideTray::instanceCreated ())
- {
- world_rect_padding += LLSideTray::getInstance()->getVisibleWidth();
- }
-
-
LLRect this_rect = getRect();
switch(mChannelAlignment)
@@ -222,11 +233,11 @@ void LLScreenChannel::updatePositionAndSize(LLRect old_world_rect, LLRect new_wo
this_rect.mTop = (S32) (new_world_rect.getHeight() * getHeightRatio());
break;
case CA_CENTRE :
- LLScreenChannelBase::updatePositionAndSize(old_world_rect, new_world_rect);
+ LLScreenChannelBase::updatePositionAndSize(new_world_rect);
return;
case CA_RIGHT :
this_rect.mTop = (S32) (new_world_rect.getHeight() * getHeightRatio());
- this_rect.setLeftTopAndSize(new_world_rect.mRight - world_rect_padding - this_rect.getWidth(),
+ this_rect.setLeftTopAndSize(new_world_rect.mRight - this_rect.getWidth(),
this_rect.mTop,
this_rect.getWidth(),
this_rect.getHeight());
@@ -488,6 +499,13 @@ void LLScreenChannel::modifyToastByNotificationID(LLUUID id, LLPanel* panel)
//--------------------------------------------------------------------------
void LLScreenChannel::redrawToasts()
{
+ if (!getParent())
+ {
+ // connect to floater snap region just to get resize events, we don't care about being a proper widget
+ mFloaterSnapRegion->addChild(this);
+ setFollows(FOLLOWS_ALL);
+ }
+
if(mToastList.size() == 0)
return;
@@ -514,7 +532,7 @@ void LLScreenChannel::showToastsBottom()
S32 toast_margin = 0;
std::vector<ToastElem>::reverse_iterator it;
- updateBottom();
+ updateRect();
LLDockableFloater* floater = dynamic_cast<LLDockableFloater*>(LLDockableFloater::getInstanceHandle().get());
@@ -546,9 +564,9 @@ void LLScreenChannel::showToastsBottom()
(*it).toast->translate(0, shift);
}
- LLRect world_rect = gViewerWindow->getWorldViewRectScaled();
+ LLRect channel_rect = getChannelRect();
// don't show toasts if there is not enough space
- if(toast_rect.mTop > world_rect.mTop)
+ if(toast_rect.mTop > channel_rect.mTop)
{
break;
}
@@ -619,11 +637,103 @@ void LLScreenChannel::showToastsCentre()
//--------------------------------------------------------------------------
void LLScreenChannel::showToastsTop()
{
+ LLRect channel_rect = getChannelRect();
+
+ LLRect toast_rect;
+ S32 top = channel_rect.mTop;
+ S32 toast_margin = 0;
+ std::vector<ToastElem>::reverse_iterator it;
+
+ updateRect();
+
+ LLDockableFloater* floater = dynamic_cast<LLDockableFloater*>(LLDockableFloater::getInstanceHandle().get());
+
+ for(it = mToastList.rbegin(); it != mToastList.rend(); ++it)
+ {
+ if(it != mToastList.rbegin())
+ {
+ LLToast* toast = (*(it-1)).toast;
+ top = toast->getRect().mBottom - toast->getTopPad();
+ toast_margin = gSavedSettings.getS32("ToastGap");
+ }
+
+ toast_rect = (*it).toast->getRect();
+ toast_rect.setLeftTopAndSize(channel_rect.mRight - toast_rect.getWidth(),
+ top, toast_rect.getWidth(),
+ toast_rect.getHeight());
+ (*it).toast->setRect(toast_rect);
+
+ if(floater && floater->overlapsScreenChannel())
+ {
+ if(it == mToastList.rbegin())
+ {
+ // move first toast above docked floater
+ S32 shift = -floater->getRect().getHeight();
+ if(floater->getDockControl())
+ {
+ shift -= floater->getDockControl()->getTongueHeight();
+ }
+ (*it).toast->translate(0, shift);
+ }
+
+ LLRect channel_rect = getChannelRect();
+ // don't show toasts if there is not enough space
+ if(toast_rect.mBottom < channel_rect.mBottom)
+ {
+ break;
+ }
+ }
+
+ bool stop_showing_toasts = (*it).toast->getRect().mBottom < channel_rect.mBottom;
+
+ if(!stop_showing_toasts)
+ {
+ if( it != mToastList.rend()-1)
+ {
+ S32 toast_bottom = (*it).toast->getRect().mBottom - gSavedSettings.getS32("ToastGap");
+ stop_showing_toasts = toast_bottom < channel_rect.mBottom;
+ }
+ }
+
+ // at least one toast should be visible
+ if(it == mToastList.rbegin())
+ {
+ stop_showing_toasts = false;
+ }
+
+ if(stop_showing_toasts)
+ break;
+
+ if( !(*it).toast->getVisible() )
+ {
+ // HACK
+ // EXT-2653: it is necessary to prevent overlapping for secondary showed toasts
+ (*it).toast->setVisible(TRUE);
+ }
+ if(!(*it).toast->hasFocus())
+ {
+ // Fixing Z-order of toasts (EXT-4862)
+ // Next toast will be positioned under this one.
+ gFloaterView->sendChildToBack((*it).toast);
+ }
+ }
+
+ // Dismiss toasts we don't have space for (STORM-391).
+ if(it != mToastList.rend())
+ {
+ mHiddenToastsNum = 0;
+ for(; it != mToastList.rend(); it++)
+ {
+ (*it).toast->hide();
+ }
+ }
}
//--------------------------------------------------------------------------
void LLScreenChannel::createStartUpToast(S32 notif_num, F32 timer)
{
+ LLScreenChannelBase::updateRect();
+
LLRect toast_rect;
LLToast::Params p;
p.lifetime_secs = timer;
@@ -646,13 +756,10 @@ void LLScreenChannel::createStartUpToast(S32 notif_num, F32 timer)
text_box->setValue(text);
text_box->setVisible(TRUE);
- S32 old_height = text_box->getRect().getHeight();
text_box->reshapeToFitText();
text_box->setOrigin(text_box->getRect().mLeft, (wrapper_panel->getRect().getHeight() - text_box->getRect().getHeight())/2);
- S32 new_height = text_box->getRect().getHeight();
- S32 height_delta = new_height - old_height;
- toast_rect.setLeftTopAndSize(0, toast_rect.getHeight() + height_delta +gSavedSettings.getS32("ToastGap"), getRect().getWidth(), toast_rect.getHeight());
+ toast_rect.setLeftTopAndSize(0, getRect().getHeight() - gSavedSettings.getS32("ToastGap"), getRect().getWidth(), toast_rect.getHeight());
mStartUpToastPanel->setRect(toast_rect);
addChild(mStartUpToastPanel);
@@ -848,7 +955,7 @@ void LLScreenChannel::updateShowToastsState()
return;
}
- updateBottom();
+ updateRect();
}
//--------------------------------------------------------------------------
diff --git a/indra/newview/llscreenchannel.h b/indra/newview/llscreenchannel.h
index d207d13981..c9f8855fe6 100644
--- a/indra/newview/llscreenchannel.h
+++ b/indra/newview/llscreenchannel.h
@@ -53,22 +53,34 @@ class LLScreenChannelBase : public LLUICtrl
{
friend class LLChannelManager;
public:
- LLScreenChannelBase(const LLUUID& id);
- ~LLScreenChannelBase();
+ struct Params : public LLInitParam::Block<Params, LLUICtrl::Params>
+ {
+ Mandatory<LLUUID> id;
+ Optional<bool> display_toasts_always;
+ Optional<EToastAlignment> toast_align;
+ Optional<EChannelAlignment> channel_align;
+
+ Params()
+ : id("id", LLUUID("")),
+ display_toasts_always("display_toasts_always", false),
+ toast_align("toast_align", NA_BOTTOM),
+ channel_align("channel_align", CA_LEFT)
+ {}
+ };
+
+ LLScreenChannelBase(const Params&);
+
+ BOOL postBuild();
+
+ void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE);
// Channel's outfit-functions
// update channel's size and position in the World View
- virtual void updatePositionAndSize(LLRect old_world_rect, LLRect new_world_rect);
- void resetPositionAndSize();
+ virtual void updatePositionAndSize(LLRect rect);
// initialization of channel's shape and position
virtual void init(S32 channel_left, S32 channel_right);
-
- virtual void setToastAlignment(EToastAlignment align) {mToastAlignment = align;}
-
- virtual void setChannelAlignment(EChannelAlignment align) {mChannelAlignment = align;}
-
// kill or modify a toast by its ID
virtual void killToastByNotificationID(LLUUID id) {};
virtual void modifyToastNotificationByID(LLUUID id, LLSD data) {};
@@ -91,7 +103,6 @@ public:
void setCanStoreToasts(bool store) { mCanStoreToasts = store; }
- void setDisplayToastsAlways(bool display_toasts) { mDisplayToastsAlways = display_toasts; }
bool getDisplayToastsAlways() { return mDisplayToastsAlways; }
// get number of hidden notifications from a channel
@@ -106,17 +117,20 @@ public:
// get ID of a channel
LLUUID getChannelID() { return mID; }
+ LLHandle<LLScreenChannelBase> getHandle() { mRootHandle.bind(this); return mRootHandle; }
protected:
- void updateBottom();
+ void updateRect();
+ LLRect getChannelRect();
// Channel's flags
bool mControlHovering;
- LLToast* mHoveredToast;
+ LLToast* mHoveredToast;
bool mCanStoreToasts;
bool mDisplayToastsAlways;
// controls whether a channel shows toasts or not
bool mShowToasts;
+ LLRootHandle<LLScreenChannelBase> mRootHandle;
//
EToastAlignment mToastAlignment;
EChannelAlignment mChannelAlignment;
@@ -125,9 +139,9 @@ protected:
// channel's ID
LLUUID mID;
-
- // store a connection to prevent futher crash that is caused by sending a signal to a destroyed channel
- boost::signals2::connection mWorldViewRectConnection;
+
+ LLView* mFloaterSnapRegion;
+ LLView* mChicletRegion;
};
@@ -138,7 +152,7 @@ class LLScreenChannel : public LLScreenChannelBase
{
friend class LLChannelManager;
public:
- LLScreenChannel(LLUUID& id);
+ LLScreenChannel(const Params&);
virtual ~LLScreenChannel();
class Matcher
@@ -153,7 +167,7 @@ public:
// Channel's outfit-functions
// update channel's size and position in the World View
- void updatePositionAndSize(LLRect old_world_rect, LLRect new_world_rect);
+ void updatePositionAndSize(LLRect new_rect);
// initialization of channel's shape and position
void init(S32 channel_left, S32 channel_right);
diff --git a/indra/newview/llscriptfloater.cpp b/indra/newview/llscriptfloater.cpp
index 170e23e4c5..6f98be1cb8 100644
--- a/indra/newview/llscriptfloater.cpp
+++ b/indra/newview/llscriptfloater.cpp
@@ -28,9 +28,9 @@
#include "llscriptfloater.h"
#include "llagentcamera.h"
-#include "llbottomtray.h"
#include "llchannelmanager.h"
#include "llchiclet.h"
+#include "llchicletbar.h"
#include "llfloaterreg.h"
#include "lllslconstants.h"
#include "llnotifications.h"
@@ -95,7 +95,7 @@ bool LLScriptFloater::toggle(const LLUUID& notification_id)
show(notification_id);
}
- LLBottomTray::getInstance()->getChicletPanel()->setChicletToggleState(notification_id, true);
+ LLChicletBar::getInstance()->getChicletPanel()->setChicletToggleState(notification_id, true);
return true;
}
@@ -131,11 +131,6 @@ void LLScriptFloater::setNotificationId(const LLUUID& id)
mObjectId = notification_id_to_object_id(id);
}
-void LLScriptFloater::getAllowedRect(LLRect& rect)
-{
- rect = gViewerWindow->getWorldViewRectScaled();
-}
-
void LLScriptFloater::createForm(const LLUUID& notification_id)
{
// delete old form
@@ -211,7 +206,7 @@ void LLScriptFloater::setVisible(BOOL visible)
if(!visible)
{
- LLIMChiclet* chiclet = LLBottomTray::getInstance()->getChicletPanel()->findChiclet<LLIMChiclet>(getNotificationId());
+ LLIMChiclet* chiclet = LLChicletBar::getInstance()->getChicletPanel()->findChiclet<LLIMChiclet>(getNotificationId());
if(chiclet)
{
chiclet->setToggleState(false);
@@ -224,7 +219,7 @@ void LLScriptFloater::onMouseDown()
if(getNotificationId().notNull())
{
// Remove new message icon
- LLIMChiclet* chiclet = LLBottomTray::getInstance()->getChicletPanel()->findChiclet<LLIMChiclet>(getNotificationId());
+ LLIMChiclet* chiclet = LLChicletBar::getInstance()->getChicletPanel()->findChiclet<LLIMChiclet>(getNotificationId());
if (chiclet == NULL)
{
llerror("Dock chiclet for LLScriptFloater doesn't exist", 0);
@@ -267,7 +262,7 @@ void LLScriptFloater::onFocusLost()
{
if(getNotificationId().notNull())
{
- LLBottomTray::getInstance()->getChicletPanel()->setChicletToggleState(getNotificationId(), false);
+ LLChicletBar::getInstance()->getChicletPanel()->setChicletToggleState(getNotificationId(), false);
}
}
@@ -276,7 +271,7 @@ void LLScriptFloater::onFocusReceived()
// first focus will be received before setObjectId() call - don't toggle chiclet
if(getNotificationId().notNull())
{
- LLBottomTray::getInstance()->getChicletPanel()->setChicletToggleState(getNotificationId(), true);
+ LLChicletBar::getInstance()->getChicletPanel()->setChicletToggleState(getNotificationId(), true);
}
}
@@ -284,7 +279,7 @@ void LLScriptFloater::dockToChiclet(bool dock)
{
if (getDockControl() == NULL)
{
- LLChiclet* chiclet = LLBottomTray::getInstance()->getChicletPanel()->findChiclet<LLChiclet>(getNotificationId());
+ LLChiclet* chiclet = LLChicletBar::getInstance()->getChicletPanel()->findChiclet<LLChiclet>(getNotificationId());
if (chiclet == NULL)
{
llwarns << "Dock chiclet for LLScriptFloater doesn't exist" << llendl;
@@ -292,7 +287,7 @@ void LLScriptFloater::dockToChiclet(bool dock)
}
else
{
- LLBottomTray::getInstance()->getChicletPanel()->scrollToChiclet(chiclet);
+ LLChicletBar::getInstance()->getChicletPanel()->scrollToChiclet(chiclet);
}
// Stop saving position while we dock floater
@@ -300,7 +295,7 @@ void LLScriptFloater::dockToChiclet(bool dock)
setSavePosition(false);
setDockControl(new LLDockControl(chiclet, this, getDockTongue(),
- LLDockControl::TOP, boost::bind(&LLScriptFloater::getAllowedRect, this, _1)));
+ LLDockControl::BOTTOM));
setDocked(dock);
@@ -352,7 +347,7 @@ void LLScriptFloaterManager::onAddNotification(const LLUUID& notification_id)
script_notification_map_t::const_iterator it = findUsingObjectId(object_id);
if(it != mNotifications.end())
{
- LLIMChiclet* chiclet = LLBottomTray::getInstance()->getChicletPanel()->findChiclet<LLIMChiclet>(it->first);
+ LLIMChiclet* chiclet = LLChicletBar::getInstance()->getChicletPanel()->findChiclet<LLIMChiclet>(it->first);
if(chiclet)
{
// Pass the new_message icon state further.
@@ -375,11 +370,11 @@ void LLScriptFloaterManager::onAddNotification(const LLUUID& notification_id)
// Create inventory offer chiclet for offer type notifications
if( OBJ_GIVE_INVENTORY == obj_type )
{
- LLBottomTray::instance().getChicletPanel()->createChiclet<LLInvOfferChiclet>(notification_id);
+ LLChicletBar::instance().getChicletPanel()->createChiclet<LLInvOfferChiclet>(notification_id);
}
else
{
- LLBottomTray::getInstance()->getChicletPanel()->createChiclet<LLScriptChiclet>(notification_id);
+ LLChicletBar::getInstance()->getChicletPanel()->createChiclet<LLScriptChiclet>(notification_id);
}
LLIMWellWindow::getInstance()->addObjectRow(notification_id, set_new_message);
@@ -413,9 +408,16 @@ void LLScriptFloaterManager::onRemoveNotification(const LLUUID& notification_id)
}
// remove related chiclet
- LLBottomTray::getInstance()->getChicletPanel()->removeChiclet(notification_id);
+ if (LLChicletBar::instanceExists())
+ {
+ LLChicletBar::getInstance()->getChicletPanel()->removeChiclet(notification_id);
+ }
- LLIMWellWindow::getInstance()->removeObjectRow(notification_id);
+ LLIMWellWindow* im_well_window = LLIMWellWindow::findInstance();
+ if (im_well_window)
+ {
+ im_well_window->removeObjectRow(notification_id);
+ }
mNotifications.erase(notification_id);
diff --git a/indra/newview/llscriptfloater.h b/indra/newview/llscriptfloater.h
index 8e959a3d0e..70451194b3 100644
--- a/indra/newview/llscriptfloater.h
+++ b/indra/newview/llscriptfloater.h
@@ -185,8 +185,6 @@ protected:
*/
void createForm(const LLUUID& object_id);
- /*virtual*/ void getAllowedRect(LLRect& rect);
-
/**
* Hide all notification toasts.
*/
diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp
index 733902ad30..6111255a66 100644
--- a/indra/newview/llselectmgr.cpp
+++ b/indra/newview/llselectmgr.cpp
@@ -89,6 +89,7 @@
#include "llvoavatarself.h"
#include "llvovolume.h"
#include "pipeline.h"
+#include "llviewershadermgr.h"
#include "llglheaders.h"
@@ -4837,7 +4838,7 @@ void LLSelectMgr::processForceObjectSelect(LLMessageSystem* msg, void**)
LLSelectMgr::getInstance()->highlightObjectAndFamily(objects);
}
-extern LLGLdouble gGLModelView[16];
+extern F32 gGLModelView[16];
void LLSelectMgr::updateSilhouettes()
{
@@ -5133,20 +5134,20 @@ void LLSelectMgr::renderSilhouettes(BOOL for_hud)
F32 cur_zoom = gAgentCamera.mHUDCurZoom;
// set up transform to encompass bounding box of HUD
- glMatrixMode(GL_PROJECTION);
+ gGL.matrixMode(LLRender::MM_PROJECTION);
gGL.pushMatrix();
- glLoadIdentity();
+ gGL.loadIdentity();
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);
+ gGL.ortho(-0.5f * LLViewerCamera::getInstance()->getAspect(), 0.5f * LLViewerCamera::getInstance()->getAspect(), -0.5f, 0.5f, 0.f, depth);
- glMatrixMode(GL_MODELVIEW);
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
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);
- glScalef(cur_zoom, cur_zoom, cur_zoom);
+ gGL.loadIdentity();
+ gGL.loadMatrix(OGL_TO_CFR_ROTATION); // Load Cory's favorite reference frame
+ gGL.translatef(-hud_bbox.getCenterLocal().mV[VX] + (depth *0.5f), 0.f, 0.f);
+ gGL.scalef(cur_zoom, cur_zoom, cur_zoom);
}
if (mSelectedObjects->getNumNodes())
{
@@ -5239,10 +5240,10 @@ void LLSelectMgr::renderSilhouettes(BOOL for_hud)
if (isAgentAvatarValid() && for_hud)
{
- glMatrixMode(GL_PROJECTION);
+ gGL.matrixMode(LLRender::MM_PROJECTION);
gGL.popMatrix();
- glMatrixMode(GL_MODELVIEW);
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
gGL.popMatrix();
gGL.popUIMatrix();
stop_glerror();
@@ -5555,39 +5556,37 @@ BOOL LLSelectNode::allowOperationOnNode(PermissionBit op, U64 group_proxy_power)
//helper function for pushing relevant vertices from drawable to GL
void pushWireframe(LLDrawable* drawable)
{
- if (drawable->isState(LLDrawable::RIGGED))
- { //render straight from rigged volume if this is a rigged attachment
- LLVOVolume* vobj = drawable->getVOVolume();
- if (vobj)
+ LLVOVolume* vobj = drawable->getVOVolume();
+ if (vobj)
+ {
+ LLVertexBuffer::unbind();
+ gGL.pushMatrix();
+ gGL.multMatrix((F32*) vobj->getRelativeXform().mMatrix);
+
+ LLVolume* volume = NULL;
+
+ if (drawable->isState(LLDrawable::RIGGED))
{
- vobj->updateRiggedVolume();
- LLRiggedVolume* rigged_volume = vobj->getRiggedVolume();
- if (rigged_volume)
- {
- LLVertexBuffer::unbind();
- gGL.pushMatrix();
- glMultMatrixf((F32*) vobj->getRelativeXform().mMatrix);
- for (S32 i = 0; i < rigged_volume->getNumVolumeFaces(); ++i)
- {
- const LLVolumeFace& face = rigged_volume->getVolumeFace(i);
- glVertexPointer(3, GL_FLOAT, 16, face.mPositions);
- glDrawElements(GL_TRIANGLES, face.mNumIndices, GL_UNSIGNED_SHORT, face.mIndices);
- }
- gGL.popMatrix();
- }
+ vobj->updateRiggedVolume();
+ volume = vobj->getRiggedVolume();
}
- }
- else
- {
- for (S32 i = 0; i < drawable->getNumFaces(); ++i)
+ else
{
- LLFace* face = drawable->getFace(i);
- if (face->verify())
+ volume = vobj->getVolume();
+ }
+
+ if (volume)
+ {
+ for (S32 i = 0; i < volume->getNumVolumeFaces(); ++i)
{
- pushVerts(face, LLVertexBuffer::MAP_VERTEX);
+ const LLVolumeFace& face = volume->getVolumeFace(i);
+ LLVertexBuffer::drawElements(LLRender::TRIANGLES, face.mPositions, face.mTexCoords, face.mNumIndices, face.mIndices);
}
}
+
+ gGL.popMatrix();
}
+
}
void LLSelectNode::renderOneWireframe(const LLColor4& color)
@@ -5604,22 +5603,29 @@ void LLSelectNode::renderOneWireframe(const LLColor4& color)
return;
}
- glMatrixMode(GL_MODELVIEW);
+ LLGLSLShader* shader = LLGLSLShader::sCurBoundShaderPtr;
+
+ if (shader)
+ {
+ gHighlightProgram.bind();
+ }
+
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
gGL.pushMatrix();
BOOL is_hud_object = objectp->isHUDAttachment();
if (drawable->isActive())
{
- glLoadMatrixd(gGLModelView);
- glMultMatrixf((F32*) objectp->getRenderMatrix().mMatrix);
+ gGL.loadMatrix(gGLModelView);
+ gGL.multMatrix((F32*) objectp->getRenderMatrix().mMatrix);
}
else if (!is_hud_object)
{
- glLoadIdentity();
- glMultMatrixd(gGLModelView);
+ gGL.loadIdentity();
+ gGL.multMatrix(gGLModelView);
LLVector3 trans = objectp->getRegion()->getOriginAgent();
- glTranslatef(trans.mV[0], trans.mV[1], trans.mV[2]);
+ gGL.translatef(trans.mV[0], trans.mV[1], trans.mV[2]);
}
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
@@ -5627,26 +5633,35 @@ void LLSelectNode::renderOneWireframe(const LLColor4& color)
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()-gAgentCamera.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);
+ if (shader)
{
- glColor4f(color.mV[VRED], color.mV[VGREEN], color.mV[VBLUE], 0.4f);
+ gGL.diffuseColor4f(color.mV[VRED], color.mV[VGREEN], color.mV[VBLUE], 0.4f);
pushWireframe(drawable);
}
+ else
+ {
+ 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()-gAgentCamera.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);
+
+ gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT);
+ {
+ gGL.diffuseColor4f(color.mV[VRED], color.mV[VGREEN], color.mV[VBLUE], 0.4f);
+ pushWireframe(drawable);
+ }
+ }
}
gGL.flush();
gGL.setSceneBlendType(LLRender::BT_ALPHA);
- glColor4f(color.mV[VRED]*2, color.mV[VGREEN]*2, color.mV[VBLUE]*2, LLSelectMgr::sHighlightAlpha*2);
+ gGL.diffuseColor4f(color.mV[VRED]*2, color.mV[VGREEN]*2, color.mV[VBLUE]*2, LLSelectMgr::sHighlightAlpha*2);
+
LLGLEnable offset(GL_POLYGON_OFFSET_LINE);
glPolygonOffset(3.f, 3.f);
glLineWidth(3.f);
@@ -5654,6 +5669,11 @@ void LLSelectNode::renderOneWireframe(const LLColor4& color)
glLineWidth(1.f);
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
gGL.popMatrix();
+
+ if (shader)
+ {
+ shader->bind();
+ }
}
//-----------------------------------------------------------------------------
@@ -5692,21 +5712,29 @@ void LLSelectNode::renderOneSilhouette(const LLColor4 &color)
return;
}
- glMatrixMode(GL_MODELVIEW);
+
+ LLGLSLShader* shader = LLGLSLShader::sCurBoundShaderPtr;
+
+ if (shader)
+ { //switch to "solid color" program for SH-2690 -- works around driver bug causing bad triangles when rendering silhouettes
+ gSolidColorProgram.bind();
+ }
+
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
gGL.pushMatrix();
gGL.pushUIMatrix();
gGL.loadUIIdentity();
if (!is_hud_object)
{
- glLoadIdentity();
- glMultMatrixd(gGLModelView);
+ gGL.loadIdentity();
+ gGL.multMatrix(gGLModelView);
}
if (drawable->isActive())
{
- glMultMatrixf((F32*) objectp->getRenderMatrix().mMatrix);
+ gGL.multMatrix((F32*) objectp->getRenderMatrix().mMatrix);
}
LLVolume *volume = objectp->getVolume();
@@ -5814,6 +5842,11 @@ void LLSelectNode::renderOneSilhouette(const LLColor4 &color)
}
gGL.popMatrix();
gGL.popUIMatrix();
+
+ if (shader)
+ {
+ shader->bind();
+ }
}
//
@@ -6503,7 +6536,7 @@ F32 LLObjectSelection::getSelectedObjectStreamingCost(S32* total_bytes, S32* vis
return cost;
}
-U32 LLObjectSelection::getSelectedObjectTriangleCount()
+U32 LLObjectSelection::getSelectedObjectTriangleCount(S32* vcount)
{
U32 count = 0;
for (list_t::iterator iter = mList.begin(); iter != mList.end(); ++iter)
@@ -6513,7 +6546,7 @@ U32 LLObjectSelection::getSelectedObjectTriangleCount()
if (object)
{
- count += object->getTriangleCount();
+ count += object->getTriangleCount(vcount);
}
}
diff --git a/indra/newview/llselectmgr.h b/indra/newview/llselectmgr.h
index 166616e13e..87ada5ac6b 100644
--- a/indra/newview/llselectmgr.h
+++ b/indra/newview/llselectmgr.h
@@ -286,7 +286,7 @@ public:
S32 getSelectedObjectRenderCost();
F32 getSelectedObjectStreamingCost(S32* total_bytes = NULL, S32* visible_bytes = NULL);
- U32 getSelectedObjectTriangleCount();
+ U32 getSelectedObjectTriangleCount(S32* vcount = NULL);
S32 getTECount();
S32 getRootObjectCount();
diff --git a/indra/newview/llsidepanelappearance.cpp b/indra/newview/llsidepanelappearance.cpp
index 28ec11d1c7..853656905c 100644
--- a/indra/newview/llsidepanelappearance.cpp
+++ b/indra/newview/llsidepanelappearance.cpp
@@ -32,6 +32,7 @@
#include "llagentcamera.h"
#include "llagentwearables.h"
#include "llappearancemgr.h"
+#include "llfloatersidepanelcontainer.h"
#include "llfolderview.h"
#include "llinventorypanel.h"
#include "llfiltereditor.h"
@@ -41,7 +42,6 @@
#include "lloutfitobserver.h"
#include "llpaneleditwearable.h"
#include "llpaneloutfitsinventory.h"
-#include "llsidetray.h"
#include "lltextbox.h"
#include "lluictrlfactory.h"
#include "llviewercontrol.h"
@@ -163,7 +163,6 @@ void LLSidepanelAppearance::onOpen(const LLSD& key)
else
{
// Switch to the requested panel.
- // *TODO: replace this crap with LLSideTrayPanelContainer
std::string type = key["type"].asString();
if (type == "my_outfits")
{
@@ -456,7 +455,7 @@ void LLSidepanelAppearance::refreshCurrentOutfitName(const std::string& name)
//static
void LLSidepanelAppearance::editWearable(LLWearable *wearable, LLView *data, BOOL disable_camera_switch)
{
- LLSideTray::getInstance()->showPanel("sidepanel_appearance");
+ LLFloaterSidePanelContainer::showPanel("appearance", LLSD());
LLSidepanelAppearance *panel = dynamic_cast<LLSidepanelAppearance*>(data);
if (panel)
diff --git a/indra/newview/llsidepanelinventory.cpp b/indra/newview/llsidepanelinventory.cpp
index bd62b5c101..038b18afbd 100644
--- a/indra/newview/llsidepanelinventory.cpp
+++ b/indra/newview/llsidepanelinventory.cpp
@@ -34,6 +34,7 @@
#include "llbutton.h"
#include "lldate.h"
#include "llfirstuse.h"
+#include "llfloatersidepanelcontainer.h"
#include "llfoldertype.h"
#include "llhttpclient.h"
#include "llinventorybridge.h"
@@ -46,7 +47,6 @@
#include "lloutfitobserver.h"
#include "llpanelmaininventory.h"
#include "llpanelmarketplaceinbox.h"
-#include "llpanelmarketplaceoutbox.h"
#include "llselectmgr.h"
#include "llsidepaneliteminfo.h"
#include "llsidepaneltaskinfo.h"
@@ -67,35 +67,22 @@ static LLRegisterPanelClassWrapper<LLSidepanelInventory> t_inventory("sidepanel_
// No longer want the inbox panel to auto-expand since it creates issues with the "new" tag time stamp
#define AUTO_EXPAND_INBOX 0
-// Temporarily disabling the outbox until we straighten out the API
-#define ENABLE_MERCHANT_OUTBOX_PANEL 0 // keep in sync with ENABLE_INVENTORY_DISPLAY_OUTBOX, ENABLE_MERCHANT_OUTBOX_CONTEXT_MENU
-
static const char * const INBOX_BUTTON_NAME = "inbox_btn";
-static const char * const OUTBOX_BUTTON_NAME = "outbox_btn";
-
static const char * const INBOX_LAYOUT_PANEL_NAME = "inbox_layout_panel";
-static const char * const OUTBOX_LAYOUT_PANEL_NAME = "outbox_layout_panel";
-
-static const char * const INBOX_OUTBOX_LAYOUT_PANEL_NAME = "inbox_outbox_layout_panel";
static const char * const MAIN_INVENTORY_LAYOUT_PANEL_NAME = "main_inventory_layout_panel";
-static const char * const INBOX_INVENTORY_PANEL = "inventory_inbox";
-static const char * const OUTBOX_INVENTORY_PANEL = "inventory_outbox";
-
-static const char * const INBOX_OUTBOX_LAYOUT_STACK_NAME = "inbox_outbox_layout_stack";
static const char * const INVENTORY_LAYOUT_STACK_NAME = "inventory_layout_stack";
static const char * const MARKETPLACE_INBOX_PANEL = "marketplace_inbox";
-static const char * const MARKETPLACE_OUTBOX_PANEL = "marketplace_outbox";
//
// Helpers
//
-class LLInboxOutboxAddedObserver : public LLInventoryCategoryAddedObserver
+class LLInboxAddedObserver : public LLInventoryCategoryAddedObserver
{
public:
- LLInboxOutboxAddedObserver(LLSidepanelInventory * sidepanelInventory)
+ LLInboxAddedObserver(LLSidepanelInventory * sidepanelInventory)
: LLInventoryCategoryAddedObserver()
, mSidepanelInventory(sidepanelInventory)
{
@@ -112,21 +99,9 @@ public:
switch (added_category_type)
{
case LLFolderType::FT_INBOX:
+ mSidepanelInventory->enableInbox(true);
mSidepanelInventory->observeInboxModifications(added_category->getUUID());
break;
- case LLFolderType::FT_OUTBOX:
- mSidepanelInventory->observeOutboxModifications(added_category->getUUID());
- break;
- case LLFolderType::FT_NONE:
- // HACK until sim update to properly create folder with system type
- if (added_category->getName() == "Received Items")
- {
- mSidepanelInventory->observeInboxModifications(added_category->getUUID());
- }
- else if (added_category->getName() == "Merchant Outbox")
- {
- mSidepanelInventory->observeOutboxModifications(added_category->getUUID());
- }
default:
break;
}
@@ -145,12 +120,10 @@ LLSidepanelInventory::LLSidepanelInventory()
: LLPanel()
, mItemPanel(NULL)
, mInventoryPanelInbox(NULL)
- , mInventoryPanelOutbox(NULL)
, mPanelMainInventory(NULL)
, mInboxEnabled(false)
- , mOutboxEnabled(false)
, mCategoriesObserver(NULL)
- , mInboxOutboxAddedObserver(NULL)
+ , mInboxAddedObserver(NULL)
{
//buildFromFile( "panel_inventory.xml"); // Called from LLRegisterPanelClass::defaultPanelClassBuilder()
}
@@ -163,25 +136,20 @@ LLSidepanelInventory::~LLSidepanelInventory()
}
delete mCategoriesObserver;
- if (mInboxOutboxAddedObserver && gInventory.containsObserver(mInboxOutboxAddedObserver))
+ if (mInboxAddedObserver && gInventory.containsObserver(mInboxAddedObserver))
{
- gInventory.removeObserver(mInboxOutboxAddedObserver);
+ gInventory.removeObserver(mInboxAddedObserver);
}
- delete mInboxOutboxAddedObserver;
+ delete mInboxAddedObserver;
}
void handleInventoryDisplayInboxChanged()
{
- LLSidepanelInventory* sidepanel_inventory = dynamic_cast<LLSidepanelInventory*>(LLSideTray::getInstance()->getPanel("sidepanel_inventory"));
-
- sidepanel_inventory->enableInbox(gSavedSettings.getBOOL("InventoryDisplayInbox"));
-}
-
-void handleInventoryDisplayOutboxChanged()
-{
- LLSidepanelInventory* sidepanel_inventory = dynamic_cast<LLSidepanelInventory*>(LLSideTray::getInstance()->getPanel("sidepanel_inventory"));
-
- sidepanel_inventory->enableOutbox(gSavedSettings.getBOOL("InventoryDisplayOutbox"));
+ LLSidepanelInventory* sidepanel_inventory = LLFloaterSidePanelContainer::getPanel<LLSidepanelInventory>("inventory");
+ if (sidepanel_inventory)
+ {
+ sidepanel_inventory->enableInbox(gSavedSettings.getBOOL("InventoryDisplayInbox"));
+ }
}
BOOL LLSidepanelInventory::postBuild()
@@ -245,208 +213,132 @@ BOOL LLSidepanelInventory::postBuild()
}
}
- // Marketplace inbox/outbox setup
+ // Received items inbox setup
{
LLLayoutStack* inv_stack = getChild<LLLayoutStack>(INVENTORY_LAYOUT_STACK_NAME);
- // Disable user_resize on main inventory panel by default
- inv_stack->setPanelUserResize(MAIN_INVENTORY_LAYOUT_PANEL_NAME, false);
- inv_stack->setPanelUserResize(INBOX_OUTBOX_LAYOUT_PANEL_NAME, false);
-
- // Collapse marketplace panel by default
- inv_stack->collapsePanel(getChild<LLLayoutPanel>(INBOX_OUTBOX_LAYOUT_PANEL_NAME), true);
-
- LLLayoutStack* inout_stack = getChild<LLLayoutStack>(INBOX_OUTBOX_LAYOUT_STACK_NAME);
-
- // Collapse both inbox and outbox panels
- inout_stack->collapsePanel(getChild<LLLayoutPanel>(INBOX_LAYOUT_PANEL_NAME), true);
- inout_stack->collapsePanel(getChild<LLLayoutPanel>(OUTBOX_LAYOUT_PANEL_NAME), true);
+ // Collapse inbox panel
+ inv_stack->collapsePanel(getChild<LLLayoutPanel>(INBOX_LAYOUT_PANEL_NAME), true);
// Set up button states and callbacks
LLButton * inbox_button = getChild<LLButton>(INBOX_BUTTON_NAME);
- LLButton * outbox_button = getChild<LLButton>(OUTBOX_BUTTON_NAME);
inbox_button->setToggleState(false);
- outbox_button->setToggleState(false);
-
inbox_button->setCommitCallback(boost::bind(&LLSidepanelInventory::onToggleInboxBtn, this));
- outbox_button->setCommitCallback(boost::bind(&LLSidepanelInventory::onToggleOutboxBtn, this));
- // Set the inbox and outbox visible based on debug settings (final setting comes from http request below)
+ // Set the inbox visible based on debug settings (final setting comes from http request below)
enableInbox(gSavedSettings.getBOOL("InventoryDisplayInbox"));
- enableOutbox(gSavedSettings.getBOOL("InventoryDisplayOutbox"));
- // Trigger callback for after login so we can setup to track inbox and outbox changes after initial inventory load
- LLAppViewer::instance()->setOnLoginCompletedCallback(boost::bind(&LLSidepanelInventory::handleLoginComplete, this));
+ // Trigger callback for after login so we can setup to track inbox changes after initial inventory load
+ LLAppViewer::instance()->setOnLoginCompletedCallback(boost::bind(&LLSidepanelInventory::updateInbox, this));
}
gSavedSettings.getControl("InventoryDisplayInbox")->getCommitSignal()->connect(boost::bind(&handleInventoryDisplayInboxChanged));
- gSavedSettings.getControl("InventoryDisplayOutbox")->getCommitSignal()->connect(boost::bind(&handleInventoryDisplayOutboxChanged));
+
+ // Update the verbs buttons state.
+ updateVerbs();
return TRUE;
}
-void LLSidepanelInventory::handleLoginComplete()
+void LLSidepanelInventory::updateInbox()
{
//
- // Track inbox and outbox folder changes
+ // Track inbox folder changes
//
const bool do_not_create_folder = false;
const bool do_not_find_in_library = false;
const LLUUID inbox_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_INBOX, do_not_create_folder, do_not_find_in_library);
- const LLUUID outbox_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_OUTBOX, do_not_create_folder, do_not_find_in_library);
- // Set up observer to listen for creation of inbox and outbox if at least one of them doesn't exist
- if (inbox_id.isNull() || outbox_id.isNull())
+ // Set up observer to listen for creation of inbox if at least one of them doesn't exist
+ if (inbox_id.isNull())
{
- observeInboxOutboxCreation();
+ observeInboxCreation();
}
-
// Set up observer for inbox changes, if we have an inbox already
- if (!inbox_id.isNull())
+ else
{
- observeInboxModifications(inbox_id);
-
// Enable the display of the inbox if it exists
enableInbox(true);
- }
-
-#if ENABLE_MERCHANT_OUTBOX_PANEL
- // Set up observer for outbox changes, if we have an outbox already
- if (!outbox_id.isNull())
- {
- observeOutboxModifications(outbox_id);
- // Enable the display of the outbox if it exists
- enableOutbox(true);
+ observeInboxModifications(inbox_id);
}
-#endif
}
-void LLSidepanelInventory::observeInboxOutboxCreation()
+void LLSidepanelInventory::observeInboxCreation()
{
//
- // Set up observer to track inbox and outbox folder creation
+ // Set up observer to track inbox folder creation
//
- if (mInboxOutboxAddedObserver == NULL)
+ if (mInboxAddedObserver == NULL)
{
- mInboxOutboxAddedObserver = new LLInboxOutboxAddedObserver(this);
+ mInboxAddedObserver = new LLInboxAddedObserver(this);
- gInventory.addObserver(mInboxOutboxAddedObserver);
+ gInventory.addObserver(mInboxAddedObserver);
}
}
void LLSidepanelInventory::observeInboxModifications(const LLUUID& inboxID)
{
//
- // Track inbox and outbox folder changes
+ // Silently do nothing if we already have an inbox inventory panel set up
+ // (this can happen multiple times on the initial session that creates the inbox)
//
-
+
+ if (mInventoryPanelInbox != NULL)
+ {
+ return;
+ }
+
+ //
+ // Track inbox folder changes
+ //
+
if (inboxID.isNull())
{
- llwarns << "Attempting to track modifications to non-existant inbox" << llendl;
+ llwarns << "Attempting to track modifications to non-existent inbox" << llendl;
return;
}
-
+
if (mCategoriesObserver == NULL)
{
mCategoriesObserver = new LLInventoryCategoriesObserver();
gInventory.addObserver(mCategoriesObserver);
}
-
+
mCategoriesObserver->addCategory(inboxID, boost::bind(&LLSidepanelInventory::onInboxChanged, this, inboxID));
-
+
//
// Trigger a load for the entire contents of the Inbox
//
-
+
LLInventoryModelBackgroundFetch::instance().start(inboxID);
-
+
//
// Set up the inbox inventory view
//
-
+
LLPanelMarketplaceInbox * inbox = getChild<LLPanelMarketplaceInbox>(MARKETPLACE_INBOX_PANEL);
mInventoryPanelInbox = inbox->setupInventoryPanel();
}
-
-void LLSidepanelInventory::observeOutboxModifications(const LLUUID& outboxID)
-{
- //
- // Track outbox folder changes
- //
-
- if (outboxID.isNull())
- {
- llwarns << "Attempting to track modifications to non-existant outbox" << llendl;
- return;
- }
-
- if (mCategoriesObserver == NULL)
- {
- mCategoriesObserver = new LLInventoryCategoriesObserver();
- gInventory.addObserver(mCategoriesObserver);
- }
-
- mCategoriesObserver->addCategory(outboxID, boost::bind(&LLSidepanelInventory::onOutboxChanged, this, outboxID));
-
- //
- // Set up the outbox inventory view
- //
-
- LLPanelMarketplaceOutbox * outbox = getChild<LLPanelMarketplaceOutbox>(MARKETPLACE_OUTBOX_PANEL);
- mInventoryPanelOutbox = outbox->setupInventoryPanel();
-}
-
void LLSidepanelInventory::enableInbox(bool enabled)
{
mInboxEnabled = enabled;
LLLayoutPanel * inbox_layout_panel = getChild<LLLayoutPanel>(INBOX_LAYOUT_PANEL_NAME);
inbox_layout_panel->setVisible(enabled);
-
- if (mInboxEnabled)
- {
- LLLayoutPanel * inout_layout_panel = getChild<LLLayoutPanel>(INBOX_OUTBOX_LAYOUT_PANEL_NAME);
-
- inout_layout_panel->setVisible(TRUE);
-
- if (mOutboxEnabled)
- {
- S32 inbox_min_dim = inbox_layout_panel->getMinDim();
- S32 outbox_min_dim = getChild<LLLayoutPanel>(OUTBOX_LAYOUT_PANEL_NAME)->getMinDim();
-
- inout_layout_panel->setMinDim(inbox_min_dim + outbox_min_dim);
- }
- }
}
-void LLSidepanelInventory::enableOutbox(bool enabled)
+void LLSidepanelInventory::openInbox()
{
- mOutboxEnabled = enabled;
-
- LLLayoutPanel * outbox_layout_panel = getChild<LLLayoutPanel>(OUTBOX_LAYOUT_PANEL_NAME);
- outbox_layout_panel->setVisible(enabled);
-
- if (mOutboxEnabled)
+ if (mInboxEnabled)
{
- LLLayoutPanel * inout_layout_panel = getChild<LLLayoutPanel>(INBOX_OUTBOX_LAYOUT_PANEL_NAME);
-
- inout_layout_panel->setVisible(TRUE);
-
- if (mInboxEnabled)
- {
- S32 inbox_min_dim = getChild<LLLayoutPanel>(INBOX_LAYOUT_PANEL_NAME)->getMinDim();
- S32 outbox_min_dim = outbox_layout_panel->getMinDim();
-
- inout_layout_panel->setMinDim(inbox_min_dim + outbox_min_dim);
- }
-
- updateOutboxUserStatus();
+ getChild<LLButton>(INBOX_BUTTON_NAME)->setToggleState(true);
+ onToggleInboxBtn();
}
}
@@ -456,16 +348,7 @@ void LLSidepanelInventory::onInboxChanged(const LLUUID& inbox_id)
LLInventoryModelBackgroundFetch::instance().start(inbox_id);
#if AUTO_EXPAND_INBOX
- // If the outbox is expanded, don't auto-expand the inbox
- if (mOutboxEnabled)
- {
- if (getChild<LLButton>(OUTBOX_BUTTON_NAME)->getToggleState())
- {
- return;
- }
- }
-
- // Expand the inbox since we have fresh items and the outbox is not expanded
+ // Expand the inbox since we have fresh items
if (mInboxEnabled)
{
getChild<LLButton>(INBOX_BUTTON_NAME)->setToggleState(true);
@@ -474,68 +357,16 @@ void LLSidepanelInventory::onInboxChanged(const LLUUID& inbox_id)
#endif
}
-void LLSidepanelInventory::onOutboxChanged(const LLUUID& outbox_id)
-{
- // Expand the outbox since we have new items in it
- if (mOutboxEnabled)
- {
- getChild<LLButton>(OUTBOX_BUTTON_NAME)->setToggleState(true);
- onToggleOutboxBtn();
- }
-}
-
-bool LLSidepanelInventory::manageInboxOutboxPanels(LLButton * pressedButton, LLLayoutPanel * pressedPanel,
- LLButton * otherButton, LLLayoutPanel * otherPanel)
-{
- bool expand = pressedButton->getToggleState();
- bool otherExpanded = otherButton->getToggleState();
-
- LLLayoutStack* inv_stack = getChild<LLLayoutStack>(INVENTORY_LAYOUT_STACK_NAME);
- LLLayoutStack* inout_stack = getChild<LLLayoutStack>(INBOX_OUTBOX_LAYOUT_STACK_NAME);
- LLLayoutPanel* inout_panel = getChild<LLLayoutPanel>(INBOX_OUTBOX_LAYOUT_PANEL_NAME);
-
- // Enable user_resize on main inventory panel only when a marketplace box is expanded
- inv_stack->setPanelUserResize(MAIN_INVENTORY_LAYOUT_PANEL_NAME, expand);
- inv_stack->collapsePanel(inout_panel, !expand);
-
- // Collapse other marketplace panel if it is expanded
- if (expand && otherExpanded)
- {
- // Reshape pressedPanel to the otherPanel's height so we preserve the marketplace panel size
- pressedPanel->reshape(pressedPanel->getRect().getWidth(), otherPanel->getRect().getHeight());
-
- inout_stack->collapsePanel(otherPanel, true);
- otherButton->setToggleState(false);
- }
- else
- {
- // NOTE: This is an attempt to reshape the inventory panel to the proper size but it doesn't seem to propagate
- // properly to the child panels.
-
- S32 new_height = inout_panel->getRect().getHeight();
-
- if (otherPanel->getVisible())
- {
- new_height -= otherPanel->getMinDim();
- }
-
- pressedPanel->reshape(pressedPanel->getRect().getWidth(), new_height);
- }
-
- // Expand/collapse the indicated panel
- inout_stack->collapsePanel(pressedPanel, !expand);
-
- return expand;
-}
-
void LLSidepanelInventory::onToggleInboxBtn()
{
LLButton* inboxButton = getChild<LLButton>(INBOX_BUTTON_NAME);
LLLayoutPanel* inboxPanel = getChild<LLLayoutPanel>(INBOX_LAYOUT_PANEL_NAME);
- LLButton* outboxButton = getChild<LLButton>(OUTBOX_BUTTON_NAME);
- LLLayoutPanel* outboxPanel = getChild<LLLayoutPanel>(OUTBOX_LAYOUT_PANEL_NAME);
-
- const bool inbox_expanded = manageInboxOutboxPanels(inboxButton, inboxPanel, outboxButton, outboxPanel);
+ LLLayoutStack* inv_stack = getChild<LLLayoutStack>(INVENTORY_LAYOUT_STACK_NAME);
+
+ const bool inbox_expanded = inboxButton->getToggleState();
+
+ // Expand/collapse the indicated panel
+ inv_stack->collapsePanel(inboxPanel, !inbox_expanded);
if (inbox_expanded && inboxPanel->isInVisibleChain())
{
@@ -543,16 +374,6 @@ void LLSidepanelInventory::onToggleInboxBtn()
}
}
-void LLSidepanelInventory::onToggleOutboxBtn()
-{
- LLButton* inboxButton = getChild<LLButton>(INBOX_BUTTON_NAME);
- LLLayoutPanel* inboxPanel = getChild<LLLayoutPanel>(INBOX_LAYOUT_PANEL_NAME);
- LLButton* outboxButton = getChild<LLButton>(OUTBOX_BUTTON_NAME);
- LLLayoutPanel* outboxPanel = getChild<LLLayoutPanel>(OUTBOX_LAYOUT_PANEL_NAME);
-
- manageInboxOutboxPanels(outboxButton, outboxPanel, inboxButton, inboxPanel);
-}
-
void LLSidepanelInventory::onOpen(const LLSD& key)
{
LLFirstUse::newInventory(false);
@@ -722,77 +543,6 @@ void LLSidepanelInventory::showInventoryPanel()
updateVerbs();
}
-void LLSidepanelInventory::updateOutboxUserStatus()
-{
- const bool isMerchant = (gSavedSettings.getString("InventoryMarketplaceUserStatus") == "merchant");
- const bool hasOutbox = !gInventory.findCategoryUUIDForType(LLFolderType::FT_OUTBOX, false, false).isNull();
-
- LLView * outbox_placeholder = getChild<LLView>("outbox_inventory_placeholder_panel");
- LLView * outbox_placeholder_parent = outbox_placeholder->getParent();
-
- LLTextBox * outbox_title_box = outbox_placeholder->getChild<LLTextBox>("outbox_inventory_placeholder_title");
- LLTextBox * outbox_text_box = outbox_placeholder->getChild<LLTextBox>("outbox_inventory_placeholder_text");
-
- std::string outbox_text;
- std::string outbox_title;
- std::string outbox_tooltip;
-
- if (isMerchant)
- {
- if (hasOutbox)
- {
- outbox_text = LLTrans::getString("InventoryOutboxNoItems");
- outbox_title = LLTrans::getString("InventoryOutboxNoItemsTitle");
- outbox_tooltip = LLTrans::getString("InventoryOutboxNoItemsTooltip");
- }
- else
- {
- outbox_text = LLTrans::getString("InventoryOutboxCreationError");
- outbox_title = LLTrans::getString("InventoryOutboxCreationErrorTitle");
- outbox_tooltip = LLTrans::getString("InventoryOutboxCreationErrorTooltip");
- }
- }
- else
- {
- //
- // The string to become a merchant contains 3 URL's which need the domain name patched in.
- //
-
- std::string domain = "secondlife.com";
-
- if (!LLGridManager::getInstance()->isInProductionGrid())
- {
- std::string gridLabel = LLGridManager::getInstance()->getGridLabel();
- domain = llformat("%s.lindenlab.com", utf8str_tolower(gridLabel).c_str());
- }
-
- LLStringUtil::format_map_t domain_arg;
- domain_arg["[DOMAIN_NAME]"] = domain;
-
- std::string marketplace_url = LLTrans::getString("MarketplaceURL", domain_arg);
- std::string marketplace_url_create = LLTrans::getString("MarketplaceURL_CreateStore", domain_arg);
- std::string marketplace_url_info = LLTrans::getString("MarketplaceURL_LearnMore", domain_arg);
-
- LLStringUtil::format_map_t args1, args2, args3;
- args1["[MARKETPLACE_URL]"] = marketplace_url;
- args2["[LEARN_MORE_URL]"] = marketplace_url_info;
- args3["[CREATE_STORE_URL]"] = marketplace_url_create;
-
- // NOTE: This is dumb, ridiculous and very finicky. The order of these is very important
- // to have these three string substitutions work properly.
- outbox_text = LLTrans::getString("InventoryOutboxNotMerchant", args1);
- LLStringUtil::format(outbox_text, args2);
- LLStringUtil::format(outbox_text, args3);
-
- outbox_title = LLTrans::getString("InventoryOutboxNotMerchantTitle");
- outbox_tooltip = LLTrans::getString("InventoryOutboxNotMerchantTooltip");
- }
-
- outbox_text_box->setValue(outbox_text);
- outbox_title_box->setValue(outbox_title);
- outbox_placeholder_parent->setToolTip(outbox_tooltip);
-}
-
void LLSidepanelInventory::updateVerbs()
{
mInfoBtn->setEnabled(FALSE);
@@ -908,13 +658,6 @@ U32 LLSidepanelInventory::getSelectedCount()
{
selection_list = mInventoryPanelInbox->getRootFolder()->getSelectionList();
- count += selection_list.size();
- }
-
- if ((count == 0) && mOutboxEnabled && (mInventoryPanelOutbox != NULL))
- {
- selection_list = mInventoryPanelOutbox->getRootFolder()->getSelectionList();
-
count += selection_list.size();
}
@@ -939,7 +682,7 @@ BOOL LLSidepanelInventory::isMainInventoryPanelActive() const
return mInventoryPanel->getVisible();
}
-void LLSidepanelInventory::clearSelections(bool clearMain, bool clearInbox, bool clearOutbox)
+void LLSidepanelInventory::clearSelections(bool clearMain, bool clearInbox)
{
if (clearMain)
{
@@ -956,15 +699,10 @@ void LLSidepanelInventory::clearSelections(bool clearMain, bool clearInbox, bool
mInventoryPanelInbox->clearSelection();
}
- if (clearOutbox && mOutboxEnabled && (mInventoryPanelOutbox != NULL))
- {
- mInventoryPanelOutbox->clearSelection();
- }
-
updateVerbs();
}
-std::set<LLUUID> LLSidepanelInventory::getInboxOrOutboxSelectionList()
+std::set<LLUUID> LLSidepanelInventory::getInboxSelectionList()
{
std::set<LLUUID> inventory_selected_uuids;
@@ -973,10 +711,5 @@ std::set<LLUUID> LLSidepanelInventory::getInboxOrOutboxSelectionList()
inventory_selected_uuids = mInventoryPanelInbox->getRootFolder()->getSelectionList();
}
- if (inventory_selected_uuids.empty() && mOutboxEnabled && (mInventoryPanelOutbox != NULL))
- {
- inventory_selected_uuids = mInventoryPanelOutbox->getRootFolder()->getSelectionList();
- }
-
return inventory_selected_uuids;
}
diff --git a/indra/newview/llsidepanelinventory.h b/indra/newview/llsidepanelinventory.h
index b7d11f7f9b..a33607f50d 100644
--- a/indra/newview/llsidepanelinventory.h
+++ b/indra/newview/llsidepanelinventory.h
@@ -31,7 +31,7 @@
class LLButton;
class LLFolderViewItem;
-class LLInboxOutboxAddedObserver;
+class LLInboxAddedObserver;
class LLInventoryCategoriesObserver;
class LLInventoryItem;
class LLInventoryPanel;
@@ -47,22 +47,23 @@ public:
virtual ~LLSidepanelInventory();
private:
- void handleLoginComplete();
+ void updateInbox();
public:
- void observeInboxOutboxCreation();
+ void observeInboxCreation();
void observeInboxModifications(const LLUUID& inboxID);
- void observeOutboxModifications(const LLUUID& outboxID);
/*virtual*/ BOOL postBuild();
/*virtual*/ void onOpen(const LLSD& key);
LLInventoryPanel* getActivePanel(); // Returns an active inventory panel, if any.
+ LLInventoryPanel* getInboxPanel() const { return mInventoryPanelInbox; }
+
LLPanelMainInventory* getMainInventoryPanel() const { return mPanelMainInventory; }
BOOL isMainInventoryPanelActive() const;
- void clearSelections(bool clearMain, bool clearInbox, bool clearOutbox);
- std::set<LLUUID> getInboxOrOutboxSelectionList();
+ void clearSelections(bool clearMain, bool clearInbox);
+ std::set<LLUUID> getInboxSelectionList();
void showItemInfoPanel();
void showTaskInfoPanel();
@@ -72,15 +73,13 @@ public:
bool canShare();
void onToggleInboxBtn();
- void onToggleOutboxBtn();
void enableInbox(bool enabled);
- void enableOutbox(bool enabled);
+
+ void openInbox();
bool isInboxEnabled() const { return mInboxEnabled; }
- bool isOutboxEnabled() const { return mOutboxEnabled; }
- void updateOutboxUserStatus();
void updateVerbs();
protected:
@@ -94,9 +93,6 @@ protected:
bool canWearSelected(); // check whether selected items can be worn
void onInboxChanged(const LLUUID& inbox_id);
- void onOutboxChanged(const LLUUID& outbox_id);
-
- bool manageInboxOutboxPanels(LLButton * pressedButton, LLLayoutPanel * pressedPanel, LLButton * otherButton, LLLayoutPanel * otherPanel);
//
// UI Elements
@@ -104,7 +100,6 @@ protected:
private:
LLPanel* mInventoryPanel; // Main inventory view
LLInventoryPanel* mInventoryPanelInbox;
- LLInventoryPanel* mInventoryPanelOutbox;
LLSidepanelItemInfo* mItemPanel; // Individual item view
LLSidepanelTaskInfo* mTaskPanel; // Individual in-world object view
LLPanelMainInventory* mPanelMainInventory;
@@ -129,10 +124,9 @@ private:
LLButton* mShopBtn;
bool mInboxEnabled;
- bool mOutboxEnabled;
- LLInventoryCategoriesObserver* mCategoriesObserver;
- LLInboxOutboxAddedObserver* mInboxOutboxAddedObserver;
+ LLInventoryCategoriesObserver* mCategoriesObserver;
+ LLInboxAddedObserver* mInboxAddedObserver;
};
#endif //LL_LLSIDEPANELINVENTORY_H
diff --git a/indra/newview/llsidepaneltaskinfo.cpp b/indra/newview/llsidepaneltaskinfo.cpp
index 8774482acd..24cb559fd0 100644
--- a/indra/newview/llsidepaneltaskinfo.cpp
+++ b/indra/newview/llsidepaneltaskinfo.cpp
@@ -117,6 +117,42 @@ BOOL LLSidepanelTaskInfo::postBuild()
childSetCommitCallback("checkbox next owner can transfer", &LLSidepanelTaskInfo::onCommitNextOwnerTransfer,this);
childSetCommitCallback("clickaction", &LLSidepanelTaskInfo::onCommitClickAction,this);
childSetCommitCallback("search_check", &LLSidepanelTaskInfo::onCommitIncludeInSearch,this);
+
+ mDAPermModify = getChild<LLUICtrl>("perm_modify");
+ mDACreator = getChildView("Creator:");
+ mDACreatorName = getChild<LLUICtrl>("Creator Name");
+ mDAOwner = getChildView("Owner:");
+ mDAOwnerName = getChild<LLUICtrl>("Owner Name");
+ mDAGroup = getChildView("Group:");
+ mDAGroupName = getChild<LLUICtrl>("Group Name");
+ mDAButtonSetGroup = getChildView("button set group");
+ mDAObjectName = getChild<LLUICtrl>("Object Name");
+ mDAName = getChildView("Name:");
+ mDADescription = getChildView("Description:");
+ mDAObjectDescription = getChild<LLUICtrl>("Object Description");
+ mDAPermissions = getChildView("Permissions:");
+ mDACheckboxShareWithGroup = getChild<LLUICtrl>("checkbox share with group");
+ mDAButtonDeed = getChildView("button deed");
+ mDACheckboxAllowEveryoneMove = getChild<LLUICtrl>("checkbox allow everyone move");
+ mDACheckboxAllowEveryoneCopy = getChild<LLUICtrl>("checkbox allow everyone copy");
+ mDANextOwnerCan = getChildView("Next owner can:");
+ mDACheckboxNextOwnerCanModify = getChild<LLUICtrl>("checkbox next owner can modify");
+ mDACheckboxNextOwnerCanCopy = getChild<LLUICtrl>("checkbox next owner can copy");
+ mDACheckboxNextOwnerCanTransfer = getChild<LLUICtrl>("checkbox next owner can transfer");
+ mDACheckboxForSale = getChild<LLUICtrl>("checkbox for sale");
+ mDASearchCheck = getChild<LLUICtrl>("search_check");
+ mDAComboSaleType = getChild<LLComboBox>("sale type");
+ mDACost = getChild<LLUICtrl>("Cost");
+ mDAEditCost = getChild<LLUICtrl>("Edit Cost");
+ mDALabelClickAction = getChildView("label click action");
+ mDAComboClickAction = getChild<LLComboBox>("clickaction");
+ mDAB = getChildView("B:");
+ mDAO = getChildView("O:");
+ mDAG = getChildView("G:");
+ mDAE = getChildView("E:");
+ mDAN = getChildView("N:");
+ mDAF = getChildView("F:");
+
return TRUE;
}
@@ -138,81 +174,80 @@ BOOL LLSidepanelTaskInfo::postBuild()
void LLSidepanelTaskInfo::disableAll()
{
- getChildView("perm_modify")->setEnabled(FALSE);
- getChild<LLUICtrl>("perm_modify")->setValue(LLStringUtil::null);
-
- getChildView("Creator:")->setEnabled(FALSE);
- getChild<LLUICtrl>("Creator Name")->setValue(LLStringUtil::null);
- getChildView("Creator Name")->setEnabled(FALSE);
-
- getChildView("Owner:")->setEnabled(FALSE);
- getChild<LLUICtrl>("Owner Name")->setValue(LLStringUtil::null);
- getChildView("Owner Name")->setEnabled(FALSE);
-
- getChildView("Group:")->setEnabled(FALSE);
- getChild<LLUICtrl>("Group Name")->setValue(LLStringUtil::null);
- getChildView("Group Name")->setEnabled(FALSE);
- getChildView("button set group")->setEnabled(FALSE);
-
- getChild<LLUICtrl>("Object Name")->setValue(LLStringUtil::null);
- getChildView("Object Name")->setEnabled(FALSE);
- getChildView("Name:")->setEnabled(FALSE);
- getChild<LLUICtrl>("Group Name")->setValue(LLStringUtil::null);
- getChildView("Group Name")->setEnabled(FALSE);
- getChildView("Description:")->setEnabled(FALSE);
- getChild<LLUICtrl>("Object Description")->setValue(LLStringUtil::null);
- getChildView("Object Description")->setEnabled(FALSE);
-
- getChildView("Permissions:")->setEnabled(FALSE);
+ mDAPermModify->setEnabled(FALSE);
+ mDAPermModify->setValue(LLStringUtil::null);
+
+ mDACreator->setEnabled(FALSE);
+ mDACreatorName->setValue(LLStringUtil::null);
+ mDACreatorName->setEnabled(FALSE);
+
+ mDAOwner->setEnabled(FALSE);
+ mDAOwnerName->setValue(LLStringUtil::null);
+ mDAOwnerName->setEnabled(FALSE);
+
+ mDAGroup->setEnabled(FALSE);
+ mDAGroupName->setValue(LLStringUtil::null);
+ mDAGroupName->setEnabled(FALSE);
+ mDAButtonSetGroup->setEnabled(FALSE);
+
+ mDAObjectName->setValue(LLStringUtil::null);
+ mDAObjectName->setEnabled(FALSE);
+ mDAName->setEnabled(FALSE);
+ mDAGroupName->setValue(LLStringUtil::null);
+ mDAGroupName->setEnabled(FALSE);
+ mDADescription->setEnabled(FALSE);
+ mDAObjectDescription->setValue(LLStringUtil::null);
+ mDAObjectDescription->setEnabled(FALSE);
+
+ mDAPermissions->setEnabled(FALSE);
- getChild<LLUICtrl>("checkbox share with group")->setValue(FALSE);
- getChildView("checkbox share with group")->setEnabled(FALSE);
- getChildView("button deed")->setEnabled(FALSE);
+ mDACheckboxShareWithGroup->setValue(FALSE);
+ mDACheckboxShareWithGroup->setEnabled(FALSE);
+ mDAButtonDeed->setEnabled(FALSE);
- getChild<LLUICtrl>("checkbox allow everyone move")->setValue(FALSE);
- getChildView("checkbox allow everyone move")->setEnabled(FALSE);
- getChild<LLUICtrl>("checkbox allow everyone copy")->setValue(FALSE);
- getChildView("checkbox allow everyone copy")->setEnabled(FALSE);
+ mDACheckboxAllowEveryoneMove->setValue(FALSE);
+ mDACheckboxAllowEveryoneMove->setEnabled(FALSE);
+ mDACheckboxAllowEveryoneCopy->setValue(FALSE);
+ mDACheckboxAllowEveryoneCopy->setEnabled(FALSE);
//Next owner can:
- getChildView("Next owner can:")->setEnabled(FALSE);
- getChild<LLUICtrl>("checkbox next owner can modify")->setValue(FALSE);
- getChildView("checkbox next owner can modify")->setEnabled(FALSE);
- getChild<LLUICtrl>("checkbox next owner can copy")->setValue(FALSE);
- getChildView("checkbox next owner can copy")->setEnabled(FALSE);
- getChild<LLUICtrl>("checkbox next owner can transfer")->setValue(FALSE);
- getChildView("checkbox next owner can transfer")->setEnabled(FALSE);
+ mDANextOwnerCan->setEnabled(FALSE);
+ mDACheckboxNextOwnerCanModify->setValue(FALSE);
+ mDACheckboxNextOwnerCanModify->setEnabled(FALSE);
+ mDACheckboxNextOwnerCanCopy->setValue(FALSE);
+ mDACheckboxNextOwnerCanCopy->setEnabled(FALSE);
+ mDACheckboxNextOwnerCanTransfer->setValue(FALSE);
+ mDACheckboxNextOwnerCanTransfer->setEnabled(FALSE);
//checkbox for sale
- getChild<LLUICtrl>("checkbox for sale")->setValue(FALSE);
- getChildView("checkbox for sale")->setEnabled(FALSE);
+ mDACheckboxForSale->setValue(FALSE);
+ mDACheckboxForSale->setEnabled(FALSE);
//checkbox include in search
- getChild<LLUICtrl>("search_check")->setValue(FALSE);
- getChildView("search_check")->setEnabled(FALSE);
+ mDASearchCheck->setValue(FALSE);
+ mDASearchCheck->setEnabled(FALSE);
- LLComboBox* combo_sale_type = getChild<LLComboBox>("sale type");
- combo_sale_type->setValue(LLSaleInfo::FS_COPY);
- combo_sale_type->setEnabled(FALSE);
+ mDAComboSaleType->setValue(LLSaleInfo::FS_COPY);
+ mDAComboSaleType->setEnabled(FALSE);
- getChildView("Cost")->setEnabled(FALSE);
- getChild<LLUICtrl>("Cost")->setValue(getString("Cost Default"));
- getChild<LLUICtrl>("Edit Cost")->setValue(LLStringUtil::null);
- getChildView("Edit Cost")->setEnabled(FALSE);
+ mDACost->setEnabled(FALSE);
+ mDACost->setValue(getString("Cost Default"));
+ mDAEditCost->setValue(LLStringUtil::null);
+ mDAEditCost->setEnabled(FALSE);
- getChildView("label click action")->setEnabled(FALSE);
- LLComboBox* combo_click_action = getChild<LLComboBox>("clickaction");
- if (combo_click_action)
+ mDALabelClickAction->setEnabled(FALSE);
+ if (mDAComboClickAction)
{
- combo_click_action->setEnabled(FALSE);
- combo_click_action->clear();
+ mDAComboClickAction->setEnabled(FALSE);
+ mDAComboClickAction->clear();
}
- getChildView("B:")->setVisible( FALSE);
- getChildView("O:")->setVisible( FALSE);
- getChildView("G:")->setVisible( FALSE);
- getChildView("E:")->setVisible( FALSE);
- getChildView("N:")->setVisible( FALSE);
- getChildView("F:")->setVisible( FALSE);
+
+ mDAB->setVisible(FALSE);
+ mDAO->setVisible(FALSE);
+ mDAG->setVisible(FALSE);
+ mDAE->setVisible(FALSE);
+ mDAN->setVisible(FALSE);
+ mDAF->setVisible(FALSE);
mOpenBtn->setEnabled(FALSE);
mPayBtn->setEnabled(FALSE);
diff --git a/indra/newview/llsidepaneltaskinfo.h b/indra/newview/llsidepaneltaskinfo.h
index 384bc479d6..be0fee2127 100644
--- a/indra/newview/llsidepaneltaskinfo.h
+++ b/indra/newview/llsidepaneltaskinfo.h
@@ -37,8 +37,9 @@
// Panel for permissions of an object.
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-class LLNameBox;
class LLCheckBoxCtrl;
+class LLComboBox;
+class LLNameBox;
class LLViewerObject;
class LLSidepanelTaskInfo : public LLSidepanelInventorySubpanel
@@ -118,6 +119,43 @@ private:
LLPointer<LLViewerObject> mObject;
LLObjectSelectionHandle mObjectSelection;
static LLSidepanelTaskInfo* sActivePanel;
+
+private:
+ // Pointers cached here to speed up the "disableAll" function which gets called on idle
+ LLUICtrl* mDAPermModify;
+ LLView* mDACreator;
+ LLUICtrl* mDACreatorName;
+ LLView* mDAOwner;
+ LLUICtrl* mDAOwnerName;
+ LLView* mDAGroup;
+ LLUICtrl* mDAGroupName;
+ LLView* mDAButtonSetGroup;
+ LLUICtrl* mDAObjectName;
+ LLView* mDAName;
+ LLView* mDADescription;
+ LLUICtrl* mDAObjectDescription;
+ LLView* mDAPermissions;
+ LLUICtrl* mDACheckboxShareWithGroup;
+ LLView* mDAButtonDeed;
+ LLUICtrl* mDACheckboxAllowEveryoneMove;
+ LLUICtrl* mDACheckboxAllowEveryoneCopy;
+ LLView* mDANextOwnerCan;
+ LLUICtrl* mDACheckboxNextOwnerCanModify;
+ LLUICtrl* mDACheckboxNextOwnerCanCopy;
+ LLUICtrl* mDACheckboxNextOwnerCanTransfer;
+ LLUICtrl* mDACheckboxForSale;
+ LLUICtrl* mDASearchCheck;
+ LLComboBox* mDAComboSaleType;
+ LLUICtrl* mDACost;
+ LLUICtrl* mDAEditCost;
+ LLView* mDALabelClickAction;
+ LLComboBox* mDAComboClickAction;
+ LLView* mDAB;
+ LLView* mDAO;
+ LLView* mDAG;
+ LLView* mDAE;
+ LLView* mDAN;
+ LLView* mDAF;
};
diff --git a/indra/newview/llsidetray.cpp b/indra/newview/llsidetray.cpp
deleted file mode 100644
index 50ecad92dd..0000000000
--- a/indra/newview/llsidetray.cpp
+++ /dev/null
@@ -1,1488 +0,0 @@
-/**
- * @file llsidetray.cpp
- * @brief SideBar implementation
- *
- * $LicenseInfo:firstyear=2009&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-#include "llviewerprecompiledheaders.h"
-
-#include "lltextbox.h"
-
-#include "llagentcamera.h"
-#include "llappviewer.h"
-#include "llbadge.h"
-#include "llbottomtray.h"
-#include "llfloaterreg.h"
-#include "llfirstuse.h"
-#include "llhints.h"
-#include "llsidetray.h"
-#include "llviewerwindow.h"
-#include "llaccordionctrl.h"
-#include "llfocusmgr.h"
-#include "llrootview.h"
-#include "llnavigationbar.h"
-#include "llpanelmarketplaceinbox.h"
-
-#include "llaccordionctrltab.h"
-
-#include "llfloater.h" //for gFloaterView
-#include "lliconctrl.h"//for OpenClose tab icon
-#include "llsidetraypanelcontainer.h"
-#include "llscreenchannel.h"
-#include "llchannelmanager.h"
-#include "llwindow.h"//for SetCursor
-#include "lltransientfloatermgr.h"
-
-#include "llsidepanelappearance.h"
-
-#include "llsidetraylistener.h"
-
-//#include "llscrollcontainer.h"
-
-using namespace std;
-using namespace LLNotificationsUI;
-
-class LLSideTrayButton;
-
-static LLRootViewRegistry::Register<LLSideTray> t1("side_tray");
-static LLDefaultChildRegistry::Register<LLSideTrayTab> t2("sidetray_tab");
-
-static const S32 BOTTOM_BAR_PAD = 5;
-
-static const std::string COLLAPSED_NAME = "<<";
-static const std::string EXPANDED_NAME = ">>";
-
-static const std::string TAB_PANEL_CAPTION_NAME = "sidetray_tab_panel";
-static const std::string TAB_PANEL_CAPTION_TITLE_BOX = "sidetray_tab_title";
-
-LLSideTray* LLSideTray::sInstance = 0;
-
-static LLSideTrayListener sSideTrayListener(LLSideTray::getInstance);
-
-// static
-LLSideTray* LLSideTray::getInstance()
-{
- if (!sInstance)
- {
- sInstance = LLUICtrlFactory::createFromFile<LLSideTray>("panel_side_tray.xml",NULL, LLRootView::child_registry_t::instance());
- sInstance->setXMLFilename("panel_side_tray.xml");
- }
-
- return sInstance;
-}
-
-// static
-bool LLSideTray::instanceCreated ()
-{
- return sInstance!=0;
-}
-
-//////////////////////////////////////////////////////////////////////////////
-// LLSideTrayTab
-// Represents a single tab in the side tray, only used by LLSideTray
-//////////////////////////////////////////////////////////////////////////////
-
-class LLSideTrayTab: public LLPanel
-{
- LOG_CLASS(LLSideTrayTab);
- friend class LLUICtrlFactory;
- friend class LLSideTray;
-public:
-
- struct Params
- : public LLInitParam::Block<Params, LLPanel::Params>
- {
- // image name
- Optional<std::string> image;
- Optional<std::string> image_selected;
- Optional<std::string> tab_title;
- Optional<std::string> description;
- Optional<LLBadge::Params> badge;
-
- Params()
- : image("image"),
- image_selected("image_selected"),
- tab_title("tab_title","no title"),
- description("description","no description"),
- badge("badge")
- {};
- };
-protected:
- LLSideTrayTab(const Params& params);
-
- void dock(LLFloater* floater_tab);
- void undock(LLFloater* floater_tab);
-
- LLSideTray* getSideTray();
-
-public:
- virtual ~LLSideTrayTab();
-
- /*virtual*/ BOOL postBuild ();
- /*virtual*/ bool addChild (LLView* view, S32 tab_group);
-
-
- void reshape (S32 width, S32 height, BOOL called_from_parent = TRUE);
-
- static LLSideTrayTab* createInstance ();
-
- const std::string& getDescription () const { return mDescription;}
-
- void onOpen (const LLSD& key);
-
- void toggleTabDocked(bool toggle_floater = true);
- void setDocked(bool dock);
- bool isDocked() const;
-
- BOOL handleScrollWheel(S32 x, S32 y, S32 clicks);
-
- LLPanel* getPanel();
-
- LLButton* createButton(bool allowTearOff, LLUICtrl::commit_callback_t callback);
-
-private:
- std::string mTabTitle;
- std::string mImage;
- std::string mImageSelected;
- std::string mDescription;
-
- LLView* mMainPanel;
-
- bool mHasBadge;
- LLBadge::Params mBadgeParams;
- LLSideTrayButton* mSideTrayButton;
-};
-
-//////////////////////////////////////////////////////////////////////////////
-// LLSideTrayButton
-// Side Tray tab button with "tear off" handling.
-//////////////////////////////////////////////////////////////////////////////
-
-class LLSideTrayButton : public LLButton
-{
-public:
- /*virtual*/ BOOL handleMouseDown(S32 x, S32 y, MASK mask)
- {
- // Route future Mouse messages here preemptively. (Release on mouse up.)
- // No handler needed for focus lost since this class has no state that depends on it.
- gFocusMgr.setMouseCapture(this);
-
- localPointToScreen(x, y, &mDragLastScreenX, &mDragLastScreenY);
-
- // Note: don't pass on to children
- return TRUE;
- }
-
- /*virtual*/ BOOL handleHover(S32 x, S32 y, MASK mask)
- {
- // We only handle the click if the click both started and ended within us
- if( !hasMouseCapture() ) return FALSE;
-
- S32 screen_x;
- S32 screen_y;
- localPointToScreen(x, y, &screen_x, &screen_y);
-
- S32 delta_x = screen_x - mDragLastScreenX;
- S32 delta_y = screen_y - mDragLastScreenY;
-
- LLSideTray* side_tray = LLSideTray::getInstance();
-
- // Check if the tab we are dragging is docked.
- if (!side_tray->isTabAttached(mTabName)) return FALSE;
-
- // Same value is hardcoded in LLDragHandle::handleHover().
- const S32 undock_threshold = 12;
-
- // Detach a tab if it has been pulled further than undock_threshold.
- if (delta_x <= -undock_threshold || delta_x >= undock_threshold ||
- delta_y <= -undock_threshold || delta_y >= undock_threshold)
- {
- LLSideTrayTab* tab = side_tray->getTab(mTabName);
- if (!tab) return FALSE;
-
- tab->setDocked(false);
-
- LLFloater* floater_tab = LLFloaterReg::getInstance("side_bar_tab", tab->getName());
- if (!floater_tab) return FALSE;
-
- LLRect original_rect = floater_tab->getRect();
- S32 header_snap_y = floater_tab->getHeaderHeight() / 2;
- S32 snap_x = screen_x - original_rect.mLeft - original_rect.getWidth() / 2;
- S32 snap_y = screen_y - original_rect.mTop + header_snap_y;
-
- // Move the floater to appear "under" the mouse pointer.
- floater_tab->setRect(original_rect.translate(snap_x, snap_y));
-
- // Snap the mouse pointer to the center of the floater header
- // and call 'mouse down' event handler to begin dragging.
- floater_tab->handleMouseDown(original_rect.getWidth() / 2,
- original_rect.getHeight() - header_snap_y,
- mask);
-
- return TRUE;
- }
-
- return FALSE;
- }
-
- void setBadgeDriver(LLSideTrayTabBadgeDriver* driver)
- {
- mBadgeDriver = driver;
- }
-
- void setVisible(BOOL visible)
- {
- setBadgeVisibility(visible);
-
- LLButton::setVisible(visible);
- }
-
-protected:
- LLSideTrayButton(const LLButton::Params& p)
- : LLButton(p)
- , mDragLastScreenX(0)
- , mDragLastScreenY(0)
- , mBadgeDriver(NULL)
- {
- // Find out the tab name to use in handleHover().
- size_t pos = getName().find("_button");
- llassert(pos != std::string::npos);
- mTabName = getName().substr(0, pos);
- }
-
- friend class LLUICtrlFactory;
-
- void draw()
- {
- if (mBadgeDriver)
- {
- setBadgeLabel(mBadgeDriver->getBadgeString());
- }
-
- LLButton::draw();
- }
-
-private:
- S32 mDragLastScreenX;
- S32 mDragLastScreenY;
-
- std::string mTabName;
- LLSideTrayTabBadgeDriver* mBadgeDriver;
-};
-
-
-////////////////////////////////////////////////////
-// LLSideTrayTab implementation
-////////////////////////////////////////////////////
-
-LLSideTrayTab::LLSideTrayTab(const Params& p)
-: LLPanel(),
- mTabTitle(p.tab_title),
- mImage(p.image),
- mImageSelected(p.image_selected),
- mDescription(p.description),
- mMainPanel(NULL),
- mBadgeParams(p.badge),
- mSideTrayButton(NULL)
-{
- mHasBadge = p.badge.isProvided();
-}
-
-LLSideTrayTab::~LLSideTrayTab()
-{
-}
-
-bool LLSideTrayTab::addChild(LLView* view, S32 tab_group)
-{
- if(mMainPanel == 0 && TAB_PANEL_CAPTION_NAME != view->getName())//skip our caption panel
- mMainPanel = view;
- return LLPanel::addChild(view,tab_group);
- //return res;
-}
-
-//virtual
-BOOL LLSideTrayTab::postBuild()
-{
- LLPanel* title_panel = LLUICtrlFactory::getInstance()->createFromFile<LLPanel>("panel_side_tray_tab_caption.xml",this, child_registry_t::instance());
- string name = title_panel->getName();
- LLPanel::addChild(title_panel);
-
- title_panel->getChild<LLTextBox>(TAB_PANEL_CAPTION_TITLE_BOX)->setValue(mTabTitle);
-
- getChild<LLButton>("undock")->setCommitCallback(boost::bind(&LLSideTrayTab::setDocked, this, false));
- getChild<LLButton>("dock")->setCommitCallback(boost::bind(&LLSideTrayTab::setDocked, this, true));
-
- return LLPanel::postBuild();
-}
-
-static const S32 splitter_margin = 1;
-
-void LLSideTrayTab::reshape (S32 width, S32 height, BOOL called_from_parent )
-{
- LLPanel::reshape(width, height, called_from_parent);
- LLView* title_panel = findChildView(TAB_PANEL_CAPTION_NAME, true);
- if (!title_panel)
- {
- // not fully constructed yet
- return;
- }
-
- S32 title_height = title_panel->getRect().getHeight();
- title_panel->setOrigin( 0, height - title_height );
- title_panel->reshape(width,title_height);
-
- LLRect sRect;
- sRect.setLeftTopAndSize( splitter_margin, height - title_height - splitter_margin,
- width - 2*splitter_margin, height - title_height - 2*splitter_margin);
- mMainPanel->setShape(sRect);
-}
-
-void LLSideTrayTab::onOpen (const LLSD& key)
-{
- LLPanel *panel = getPanel();
- if(panel)
- panel->onOpen(key);
-}
-
-// Attempts to get the existing side tray instance.
-// Needed to avoid recursive calls of LLSideTray::getInstance().
-LLSideTray* LLSideTrayTab::getSideTray()
-{
- // First, check if the side tray is our parent (i.e. we're attached).
- LLSideTray* side_tray = dynamic_cast<LLSideTray*>(getParent());
- if (!side_tray)
- {
- // Detached? Ok, check if the instance exists at all/
- if (LLSideTray::instanceCreated())
- {
- side_tray = LLSideTray::getInstance();
- }
- else
- {
- llerrs << "No safe way to get the side tray instance" << llendl;
- }
- }
-
- return side_tray;
-}
-
-void LLSideTrayTab::toggleTabDocked(bool toggle_floater /* = true */)
-{
- // *FIX: Calling this method twice per frame would crash the viewer.
-
- std::string tab_name = getName();
-
- LLFloater* floater_tab = LLFloaterReg::getInstance("side_bar_tab", tab_name);
- if (!floater_tab) return;
-
- bool docking = !isDocked();
-
- if (mSideTrayButton)
- {
- mSideTrayButton->setVisible(docking);
- }
-
- // Hide the "Tear Off" button when a tab gets undocked
- // and show "Dock" button instead.
- getChild<LLButton>("undock")->setVisible(docking);
- getChild<LLButton>("dock")->setVisible(!docking);
-
- if (docking)
- {
- dock(floater_tab);
- }
- else
- {
- undock(floater_tab);
- }
-
- // Open/close the floater *after* we reparent the tab panel,
- // so that it doesn't receive redundant visibility change notifications.
- if (toggle_floater)
- {
- LLFloaterReg::toggleInstance("side_bar_tab", tab_name);
- }
-}
-
-// Same as toggleTabDocked() apart from making sure that we do exactly what we want.
-void LLSideTrayTab::setDocked(bool dock)
-{
- if (isDocked() == dock)
- {
- llwarns << "Tab " << getName() << " is already " << (dock ? "docked" : "undocked") << llendl;
- return;
- }
-
- toggleTabDocked();
-}
-
-bool LLSideTrayTab::isDocked() const
-{
- return dynamic_cast<LLSideTray*>(getParent()) != NULL;
-}
-
-BOOL LLSideTrayTab::handleScrollWheel(S32 x, S32 y, S32 clicks)
-{
- // Let children handle the event
- LLUICtrl::handleScrollWheel(x, y, clicks);
-
- // and then eat it to prevent in-world scrolling (STORM-351).
- return TRUE;
-}
-
-void LLSideTrayTab::dock(LLFloater* floater_tab)
-{
- LLSideTray* side_tray = getSideTray();
- if (!side_tray) return;
-
- // Before docking the tab, reset its (and its children's) transparency to default (STORM-688).
- floater_tab->updateTransparency(TT_DEFAULT);
-
- if (!side_tray->addTab(this))
- {
- llwarns << "Failed to add tab " << getName() << " to side tray" << llendl;
- return;
- }
-
- setRect(side_tray->getLocalRect());
- reshape(getRect().getWidth(), getRect().getHeight());
-
- // Select the re-docked tab.
- side_tray->selectTabByName(getName());
-
- if (side_tray->getCollapsed())
- {
- side_tray->expandSideBar(false);
- }
-}
-
-static void on_minimize(LLSidepanelAppearance* panel, LLSD minimized)
-{
- if (!panel) return;
- bool visible = !minimized.asBoolean();
- LLSD visibility;
- visibility["visible"] = visible;
- // Do not reset accordion state on minimize (STORM-375)
- visibility["reset_accordion"] = false;
- panel->updateToVisibility(visibility);
-}
-
-void LLSideTrayTab::undock(LLFloater* floater_tab)
-{
- LLSideTray* side_tray = getSideTray();
- if (!side_tray) return;
-
- // Remember whether the tab have been active before detaching
- // because removeTab() will change active tab.
- bool was_active = side_tray->getActiveTab() == this;
-
- // Remove the tab from Side Tray's tabs list.
- // We have to do it despite removing the tab from Side Tray's child view tree
- // by addChild(). Otherwise the tab could be accessed by the pointer in LLSideTray::mTabs.
- if (!side_tray->removeTab(this))
- {
- llwarns << "Failed to remove tab " << getName() << " from side tray" << llendl;
- return;
- }
-
- // If we're undocking while side tray is collapsed we need to explicitly show the panel.
- if (!getVisible())
- {
- setVisible(true);
- }
-
- floater_tab->addChild(this);
- floater_tab->setTitle(mTabTitle);
- floater_tab->setName(getName());
-
- // Resize handles get obscured by added panel so move them to front.
- floater_tab->moveResizeHandlesToFront();
-
- // Reshape the floater if needed.
- LLRect floater_rect;
- if (floater_tab->hasSavedRect())
- {
- // We've got saved rect for the floater, hence no need to reshape it.
- floater_rect = floater_tab->getLocalRect();
- }
- else
- {
- // Detaching for the first time. Reshape the floater.
- floater_rect = side_tray->getLocalRect();
-
- // Reduce detached floater height by small BOTTOM_BAR_PAD not to make it flush with the bottom bar.
- floater_rect.mBottom += LLBottomTray::getInstance()->getRect().getHeight() + BOTTOM_BAR_PAD;
- floater_rect.makeValid();
- floater_tab->reshape(floater_rect.getWidth(), floater_rect.getHeight());
- }
-
- // Reshape the panel.
- {
- LLRect panel_rect = floater_tab->getLocalRect();
- panel_rect.mTop -= floater_tab->getHeaderHeight();
- panel_rect.makeValid();
- setRect(panel_rect);
- reshape(panel_rect.getWidth(), panel_rect.getHeight());
- }
-
- // Set FOLLOWS_ALL flag for the tab to follow floater dimensions upon resizing.
- setFollowsAll();
-
- // Camera view may need to be changed for appearance panel(STORM-301) on minimize of floater,
- // so setting callback here.
- if (getName() == "sidebar_appearance")
- {
- LLSidepanelAppearance* panel_appearance = dynamic_cast<LLSidepanelAppearance*>(getPanel());
- if(panel_appearance)
- {
- floater_tab->setMinimizeCallback(boost::bind(&on_minimize, panel_appearance, _2));
- }
- }
-
- if (!side_tray->getCollapsed())
- {
- side_tray->collapseSideBar();
- }
-
- if (!was_active)
- {
- // When a tab other then current active tab is detached from Side Tray
- // onOpen() should be called as tab visibility is changed.
- onOpen(LLSD());
- }
-}
-
-LLPanel* LLSideTrayTab::getPanel()
-{
- LLPanel* panel = dynamic_cast<LLPanel*>(mMainPanel);
- return panel;
-}
-
-LLSideTrayTab* LLSideTrayTab::createInstance ()
-{
- LLSideTrayTab::Params tab_params;
- tab_params.tab_title("openclose");
-
- LLSideTrayTab* tab = LLUICtrlFactory::create<LLSideTrayTab>(tab_params);
- return tab;
-}
-
-// Now that we know the definition of LLSideTrayTab, we can implement
-// tab_cast.
-template <>
-LLPanel* tab_cast<LLPanel*>(LLSideTrayTab* tab) { return tab; }
-
-//////////////////////////////////////////////////////////////////////////////
-// LLSideTray
-//////////////////////////////////////////////////////////////////////////////
-
-LLSideTray::Params::Params()
-: collapsed("collapsed",false),
- tab_btn_image_normal("tab_btn_image",LLUI::getUIImage("taskpanel/TaskPanel_Tab_Off.png")),
- tab_btn_image_selected("tab_btn_image_selected",LLUI::getUIImage("taskpanel/TaskPanel_Tab_Selected.png")),
- default_button_width("tab_btn_width",32),
- default_button_height("tab_btn_height",32),
- default_button_margin("tab_btn_margin",0)
-{}
-
-//virtual
-LLSideTray::LLSideTray(const Params& params)
- : LLPanel(params)
- ,mActiveTab(0)
- ,mCollapsed(false)
- ,mCollapseButton(0)
-{
- mCollapsed=params.collapsed;
-
- LLUICtrl::CommitCallbackRegistry::Registrar& commit = LLUICtrl::CommitCallbackRegistry::currentRegistrar();
-
- // register handler function to process data from the xml.
- // panel_name should be specified via "parameter" attribute.
- commit.add("SideTray.ShowPanel", boost::bind(&LLSideTray::showPanel, this, _2, LLUUID::null));
- commit.add("SideTray.Toggle", boost::bind(&LLSideTray::onToggleCollapse, this));
- commit.add("SideTray.Collapse", boost::bind(&LLSideTray::collapseSideBar, this));
- LLTransientFloaterMgr::getInstance()->addControlView(this);
- LLView* side_bar_tabs = gViewerWindow->getRootView()->getChildView("side_bar_tabs");
- if (side_bar_tabs != NULL)
- {
- LLTransientFloaterMgr::getInstance()->addControlView(side_bar_tabs);
- }
-
- LLPanel::Params p;
- p.name = "buttons_panel";
- p.mouse_opaque = false;
- mButtonsPanel = LLUICtrlFactory::create<LLPanel>(p);
-}
-
-
-BOOL LLSideTray::postBuild()
-{
- createButtons();
-
- arrange();
- selectTabByName("sidebar_home");
-
- if(mCollapsed)
- collapseSideBar();
-
- setMouseOpaque(false);
-
- LLAppViewer::instance()->setOnLoginCompletedCallback(boost::bind(&LLSideTray::handleLoginComplete, this));
-
- // Remember original tabs order, so that we can restore it if user detaches and then re-attaches a tab.
- for (child_vector_const_iter_t it = mTabs.begin(); it != mTabs.end(); ++it)
- {
- std::string tab_name = (*it)->getName();
- mOriginalTabOrder.push_back(tab_name);
- }
-
- //EXT-8045
- //connect all already created channels to reflect sidetray collapse/expand
- std::vector<LLChannelManager::ChannelElem>& channels = LLChannelManager::getInstance()->getChannelList();
- for(std::vector<LLChannelManager::ChannelElem>::iterator it = channels.begin();it!=channels.end();++it)
- {
- if ((*it).channel)
- {
- setVisibleWidthChangeCallback(boost::bind(&LLScreenChannelBase::resetPositionAndSize, (*it).channel));
- }
- }
-
- return true;
-}
-
-void LLSideTray::setTabButtonBadgeDriver(std::string tabName, LLSideTrayTabBadgeDriver* driver)
-{
- mTabButtonBadgeDrivers[tabName] = driver;
-}
-
-void LLSideTray::handleLoginComplete()
-{
- //reset tab to "home" tab if it was changesd during login process
- selectTabByName("sidebar_home");
-
- for (badge_map_t::iterator it = mTabButtonBadgeDrivers.begin(); it != mTabButtonBadgeDrivers.end(); ++it)
- {
- LLButton* button = mTabButtons[it->first];
- LLSideTrayButton* side_button = dynamic_cast<LLSideTrayButton*>(button);
-
- if (side_button)
- {
- side_button->setBadgeDriver(it->second);
- }
- else
- {
- llwarns << "Unable to find button " << it->first << " to set the badge driver. " << llendl;
- }
- }
-
- detachTabs();
-}
-
-LLSideTrayTab* LLSideTray::getTab(const std::string& name)
-{
- return findChild<LLSideTrayTab>(name,false);
-}
-
-bool LLSideTray::isTabAttached(const std::string& name)
-{
- LLSideTrayTab* tab = getTab(name);
- if (!tab) return false;
-
- return std::find(mTabs.begin(), mTabs.end(), tab) != mTabs.end();
-}
-
-bool LLSideTray::hasTabs()
-{
- // The open/close tab doesn't count.
- return mTabs.size() > 1;
-}
-
-void LLSideTray::toggleTabButton(LLSideTrayTab* tab)
-{
- if(tab == NULL)
- return;
- std::string name = tab->getName();
- std::map<std::string,LLButton*>::iterator it = mTabButtons.find(name);
- if(it != mTabButtons.end())
- {
- LLButton* btn = it->second;
- bool new_state = !btn->getToggleState();
- btn->setToggleState(new_state);
- // Only highlight the tab if side tray is expanded (STORM-157).
- btn->setImageOverlay( new_state && !getCollapsed() ? tab->mImageSelected : tab->mImage );
- }
-}
-
-LLPanel* LLSideTray::openChildPanel(LLSideTrayTab* tab, const std::string& panel_name, const LLSD& params)
-{
- LLView* view = tab->findChildView(panel_name, true);
- if (!view) return NULL;
-
- std::string tab_name = tab->getName();
-
- bool tab_attached = isTabAttached(tab_name);
-
- if (tab_attached && LLUI::sSettingGroups["config"]->getBOOL("OpenSidePanelsInFloaters"))
- {
- tab->setDocked(false);
- tab_attached = false;
- }
-
- // Select tab and expand Side Tray only when a tab is attached.
- if (tab_attached)
- {
- selectTabByName(tab_name);
- if (mCollapsed)
- expandSideBar();
- }
- else
- {
- LLFloater* floater_tab = LLFloaterReg::getInstance("side_bar_tab", tab_name);
- if (!floater_tab) return NULL;
-
- floater_tab->openFloater(tab_name);
- }
-
- LLSideTrayPanelContainer* container = dynamic_cast<LLSideTrayPanelContainer*>(view->getParent());
- if (container)
- {
- LLSD new_params = params;
- new_params[LLSideTrayPanelContainer::PARAM_SUB_PANEL_NAME] = panel_name;
- container->onOpen(new_params);
-
- return container->getCurrentPanel();
- }
-
- LLPanel* panel = dynamic_cast<LLPanel*>(view);
- if (panel)
- {
- panel->onOpen(params);
- }
-
- return panel;
-}
-
-bool LLSideTray::selectTabByIndex(size_t index)
-{
- if(index>=mTabs.size())
- return false;
-
- LLSideTrayTab* sidebar_tab = mTabs[index];
- return selectTabByName(sidebar_tab->getName());
-}
-
-bool LLSideTray::selectTabByName(const std::string& name, bool keep_prev_visible)
-{
- LLSideTrayTab* tab_to_keep_visible = NULL;
- LLSideTrayTab* new_tab = getTab(name);
- if (!new_tab) return false;
-
- // Bail out if already selected.
- if (new_tab == mActiveTab)
- return false;
-
- //deselect old tab
- if (mActiveTab)
- {
- // Keep previously active tab visible if requested.
- if (keep_prev_visible) tab_to_keep_visible = mActiveTab;
- toggleTabButton(mActiveTab);
- }
-
- //select new tab
- mActiveTab = new_tab;
-
- if (mActiveTab)
- {
- toggleTabButton(mActiveTab);
- LLSD key;//empty
- mActiveTab->onOpen(key);
- }
-
- //arrange();
-
- //hide all tabs - show active tab
- child_vector_const_iter_t child_it;
- for ( child_it = mTabs.begin(); child_it != mTabs.end(); ++child_it)
- {
- LLSideTrayTab* sidebar_tab = *child_it;
-
- bool vis = sidebar_tab == mActiveTab;
-
- // Force keeping the tab visible if requested.
- vis |= sidebar_tab == tab_to_keep_visible;
-
- // When the last tab gets detached, for a short moment the "Toggle Sidebar" pseudo-tab
- // is shown. So, to avoid the flicker we make sure it never gets visible.
- vis &= (*child_it)->getName() != "sidebar_openclose";
-
- sidebar_tab->setVisible(vis);
- }
- return true;
-}
-
-bool LLSideTray::addChild(LLView* view, S32 tab_group)
-{
- LLSideTrayTab* tab_panel = dynamic_cast<LLSideTrayTab*>(view);
-
- if (tab_panel)
- {
- mTabs.push_back(tab_panel);
- }
-
- return LLUICtrl::addChild(view, tab_group);
-}
-
-bool LLSideTray::removeTab(LLSideTrayTab* tab)
-{
- if (!tab) return false;
- std::string tab_name = tab->getName();
-
- // Look up the tab in the list of known tabs.
- child_vector_iter_t tab_it = std::find(mTabs.begin(), mTabs.end(), tab);
- if (tab_it == mTabs.end())
- {
- llwarns << "Cannot find tab named " << tab_name << llendl;
- return false;
- }
-
- // Find the button corresponding to the tab.
- button_map_t::iterator btn_it = mTabButtons.find(tab_name);
- if (btn_it == mTabButtons.end())
- {
- llwarns << "Cannot find button for tab named " << tab_name << llendl;
- return false;
- }
- LLButton* btn = btn_it->second;
-
- // Deselect the tab.
- if (mActiveTab == tab)
- {
- // Select the next tab (or first one, if we're removing the last tab),
- // skipping the fake open/close tab (STORM-155).
- child_vector_iter_t next_tab_it = tab_it;
- do
- {
- next_tab_it = (next_tab_it < (mTabs.end() - 1)) ? next_tab_it + 1 : mTabs.begin();
- }
- while ((*next_tab_it)->getName() == "sidebar_openclose");
-
- selectTabByName((*next_tab_it)->getName(), true); // Don't hide the tab being removed.
- }
-
- // Remove the tab.
- removeChild(tab);
- mTabs.erase(tab_it);
-
- // Add the tab to detached tabs list.
- mDetachedTabs.push_back(tab);
-
- // Remove the button from the buttons panel so that it isn't drawn anymore.
- mButtonsPanel->removeChild(btn);
-
- // Re-arrange remaining tabs.
- arrange();
-
- return true;
-}
-
-bool LLSideTray::addTab(LLSideTrayTab* tab)
-{
- if (tab == NULL) return false;
-
- std::string tab_name = tab->getName();
-
- // Make sure the tab isn't already in the list.
- if (std::find(mTabs.begin(), mTabs.end(), tab) != mTabs.end())
- {
- llwarns << "Attempt to re-add existing tab " << tab_name << llendl;
- return false;
- }
-
- // Look up the corresponding button.
- button_map_t::const_iterator btn_it = mTabButtons.find(tab_name);
- if (btn_it == mTabButtons.end())
- {
- llwarns << "Tab " << tab_name << " has no associated button" << llendl;
- return false;
- }
- LLButton* btn = btn_it->second;
-
- // Insert the tab at its original position.
- LLUICtrl::addChild(tab);
- {
- tab_order_vector_const_iter_t new_tab_orig_pos =
- std::find(mOriginalTabOrder.begin(), mOriginalTabOrder.end(), tab_name);
- llassert(new_tab_orig_pos != mOriginalTabOrder.end());
- child_vector_iter_t insert_pos = mTabs.end();
-
- for (child_vector_iter_t tab_it = mTabs.begin(); tab_it != mTabs.end(); ++tab_it)
- {
- tab_order_vector_const_iter_t cur_tab_orig_pos =
- std::find(mOriginalTabOrder.begin(), mOriginalTabOrder.end(), (*tab_it)->getName());
- llassert(cur_tab_orig_pos != mOriginalTabOrder.end());
-
- if (new_tab_orig_pos < cur_tab_orig_pos)
- {
- insert_pos = tab_it;
- break;
- }
- }
-
- mTabs.insert(insert_pos, tab);
- }
-
- // Add the button to the buttons panel so that it's drawn again.
- mButtonsPanel->addChildInBack(btn);
-
- // Arrange tabs after inserting a new one.
- arrange();
-
- // Remove the tab from the list of detached tabs.
- child_vector_iter_t tab_it = std::find(mDetachedTabs.begin(), mDetachedTabs.end(), tab);
- if (tab_it != mDetachedTabs.end())
- {
- mDetachedTabs.erase(tab_it);
- }
-
- return true;
-}
-
-LLButton* LLSideTrayTab::createButton(bool allowTearOff, LLUICtrl::commit_callback_t callback)
-{
- static LLSideTray::Params sidetray_params(LLUICtrlFactory::getDefaultParams<LLSideTray>());
-
- LLRect rect;
- rect.setOriginAndSize(0, 0, sidetray_params.default_button_width, sidetray_params.default_button_height);
-
- LLButton::Params bparams;
-
- // Append "_button" to the side tray tab name
- std::string button_name = getName() + "_button";
- bparams.name(button_name);
- bparams.follows.flags (FOLLOWS_LEFT | FOLLOWS_TOP);
- bparams.rect (rect);
- bparams.tab_stop(false);
- bparams.image_unselected(sidetray_params.tab_btn_image_normal);
- bparams.image_selected(sidetray_params.tab_btn_image_selected);
- bparams.image_disabled(sidetray_params.tab_btn_image_normal);
- bparams.image_disabled_selected(sidetray_params.tab_btn_image_selected);
-
- if (mHasBadge)
- {
- bparams.badge = mBadgeParams;
- }
-
- LLButton* button;
- if (allowTearOff)
- {
- mSideTrayButton = LLUICtrlFactory::create<LLSideTrayButton>(bparams);
-
- button = mSideTrayButton;
- }
- else
- {
- // "Open/Close" button shouldn't allow "tear off"
- // hence it is created as LLButton instance.
- button = LLUICtrlFactory::create<LLButton>(bparams);
- }
-
- button->setClickedCallback(callback);
-
- button->setToolTip(mTabTitle);
-
- if(mImage.length())
- {
- button->setImageOverlay(mImage);
- }
-
- return button;
-}
-
-void LLSideTray::createButtons()
-{
- //create buttons for tabs
- child_vector_const_iter_t child_it = mTabs.begin();
- for ( ; child_it != mTabs.end(); ++child_it)
- {
- LLSideTrayTab* sidebar_tab = *child_it;
-
- std::string name = sidebar_tab->getName();
-
- // The "OpenClose" button will open/close the whole panel
- if (name == "sidebar_openclose")
- {
- mCollapseButton = sidebar_tab->createButton(false, boost::bind(&LLSideTray::onToggleCollapse, this));
-
- mButtonsPanel->addChildInBack(mCollapseButton);
-
- LLHints::registerHintTarget("side_panel_btn", mCollapseButton->getHandle());
- }
- else
- {
- LLButton* button = sidebar_tab->createButton(true, boost::bind(&LLSideTray::onTabButtonClick, this, name));
-
- mButtonsPanel->addChildInBack(button);
-
- mTabButtons[name] = button;
- }
- }
-
- LLHints::registerHintTarget("inventory_btn", mTabButtons["sidebar_inventory"]->getHandle());
-}
-
-void LLSideTray::processTriState ()
-{
- if(mCollapsed)
- expandSideBar();
- else
- {
-#if 0 // *TODO: EXT-2092
-
- // Tell the active task panel to switch to its default view
- // or collapse side tray if already on the default view.
- LLSD info;
- info["task-panel-action"] = "handle-tri-state";
- mActiveTab->notifyChildren(info);
-#else
- collapseSideBar();
-#endif
- }
-}
-
-void LLSideTray::onTabButtonClick(string name)
-{
- LLSideTrayTab* tab = getTab(name);
- if (!tab) return;
-
- if(tab == mActiveTab)
- {
- processTriState ();
- return;
- }
- selectTabByName (name);
- if(mCollapsed)
- expandSideBar();
-}
-
-void LLSideTray::onToggleCollapse()
-{
- LLFirstUse::notUsingSidePanel(false);
- if(mCollapsed)
- {
- expandSideBar();
- //selectTabByName("sidebar_openclose");
- }
- else
- collapseSideBar();
-}
-
-
-void LLSideTray::reflectCollapseChange()
-{
- updateSidetrayVisibility();
-
- setFocus(!mCollapsed);
-
- gFloaterView->refresh();
-}
-
-void LLSideTray::arrange()
-{
- static LLSideTray::Params sidetray_params(LLUICtrlFactory::getDefaultParams<LLSideTray>());
-
- updateSidetrayVisibility();
-
- LLRect ctrl_rect;
- ctrl_rect.setLeftTopAndSize(0,
- mButtonsPanel->getRect().getHeight() - sidetray_params.default_button_width,
- sidetray_params.default_button_width,
- sidetray_params.default_button_height);
-
- mCollapseButton->setRect(ctrl_rect);
-
- //arrange tab buttons
- //arrange tab buttons
- child_vector_const_iter_t child_it;
- int offset = (sidetray_params.default_button_height+sidetray_params.default_button_margin)*2;
- for ( child_it = mTabs.begin(); child_it != mTabs.end(); ++child_it)
- {
- LLSideTrayTab* sidebar_tab = *child_it;
-
- ctrl_rect.setLeftTopAndSize(0,
- mButtonsPanel->getRect().getHeight()-offset,
- sidetray_params.default_button_width,
- sidetray_params.default_button_height);
-
- if(mTabButtons.find(sidebar_tab->getName()) == mTabButtons.end())
- continue;
-
- LLButton* btn = mTabButtons[sidebar_tab->getName()];
-
- btn->setRect(ctrl_rect);
- offset+=sidetray_params.default_button_height;
- offset+=sidetray_params.default_button_margin;
-
- btn->setVisible(ctrl_rect.mBottom > 0);
- }
-
- //arrange tabs
- for ( child_vector_t::iterator child_it = mTabs.begin(); child_it != mTabs.end(); ++child_it)
- {
- LLSideTrayTab* sidebar_tab = *child_it;
- sidebar_tab->setShape(getLocalRect());
- }
-
- // The tab buttons should be shown only if there is at least one non-detached tab.
- // Also hide them in mouse-look mode.
- mButtonsPanel->setVisible(hasTabs() && !gAgentCamera.cameraMouselook());
-}
-
-// Detach those tabs that were detached when the viewer exited last time.
-void LLSideTray::detachTabs()
-{
- // copy mTabs because LLSideTray::toggleTabDocked() modifies it.
- child_vector_t tabs = mTabs;
-
- for (child_vector_const_iter_t it = tabs.begin(); it != tabs.end(); ++it)
- {
- LLSideTrayTab* tab = *it;
-
- std::string floater_ctrl_name = LLFloater::getControlName("side_bar_tab", LLSD(tab->getName()));
- std::string vis_ctrl_name = LLFloaterReg::getVisibilityControlName(floater_ctrl_name);
- if (!LLFloater::getControlGroup()->controlExists(vis_ctrl_name)) continue;
-
- bool is_visible = LLFloater::getControlGroup()->getBOOL(vis_ctrl_name);
- if (!is_visible) continue;
-
- llassert(isTabAttached(tab->getName()));
- tab->setDocked(false);
- }
-}
-
-void LLSideTray::collapseSideBar()
-{
- mCollapsed = true;
- // Reset all overlay images, because there is no "selected" tab when the
- // whole side tray is hidden.
- child_vector_const_iter_t it = mTabs.begin();
- for ( ; it != mTabs.end(); ++it )
- {
- LLSideTrayTab* tab = *it;
- std::string name = tab->getName();
- std::map<std::string,LLButton*>::const_iterator btn_it =
- mTabButtons.find(name);
- if (btn_it != mTabButtons.end())
- {
- LLButton* btn = btn_it->second;
- btn->setImageOverlay( tab->mImage );
- }
- }
-
- // OpenClose tab doesn't put its button in mTabButtons
- LLSideTrayTab* openclose_tab = getTab("sidebar_openclose");
- if (openclose_tab)
- {
- mCollapseButton->setImageOverlay( openclose_tab->mImage );
- }
- //mActiveTab->setVisible(FALSE);
- reflectCollapseChange();
- setFocus( FALSE );
-}
-
-void LLSideTray::expandSideBar(bool open_active)
-{
- mCollapsed = false;
- LLSideTrayTab* openclose_tab = getTab("sidebar_openclose");
- if (openclose_tab)
- {
- mCollapseButton->setImageOverlay( openclose_tab->mImageSelected );
- }
-
- if (open_active)
- {
- mActiveTab->onOpen(LLSD());
- }
-
- reflectCollapseChange();
-
-
- std::string name = mActiveTab->getName();
- std::map<std::string,LLButton*>::const_iterator btn_it =
- mTabButtons.find(name);
- if (btn_it != mTabButtons.end())
- {
- LLButton* btn = btn_it->second;
- btn->setImageOverlay( mActiveTab->mImageSelected );
- }
-}
-
-void LLSideTray::highlightFocused()
-{
- /* uncomment in case something change
- if(!mActiveTab)
- return;
- BOOL dependent_has_focus = gFocusMgr.childHasKeyboardFocus(this);
- setBackgroundOpaque( dependent_has_focus );
- mActiveTab->setBackgroundOpaque( dependent_has_focus );
- */
-}
-
-//virtual
-BOOL LLSideTray::handleMouseDown (S32 x, S32 y, MASK mask)
-{
- BOOL ret = LLPanel::handleMouseDown(x,y,mask);
- if(ret)
- setFocus(true);
- return ret;
-}
-
-void LLSideTray::reshape(S32 width, S32 height, BOOL called_from_parent)
-{
- LLPanel::reshape(width, height, called_from_parent);
- if(!mActiveTab)
- return;
-
- arrange();
-}
-
-// This is just LLView::findChildView specialized to restrict the search to LLPanels.
-// Optimization for EXT-4068 to avoid searching down to the individual item level
-// when inventories are large.
-LLPanel *findChildPanel(LLPanel *panel, const std::string& name, bool recurse)
-{
- for (LLView::child_list_const_iter_t child_it = panel->beginChild();
- child_it != panel->endChild(); ++child_it)
- {
- LLPanel *child_panel = dynamic_cast<LLPanel*>(*child_it);
- if (!child_panel)
- continue;
- if (child_panel->getName() == name)
- return child_panel;
- }
- if (recurse)
- {
- for (LLView::child_list_const_iter_t child_it = panel->beginChild();
- child_it != panel->endChild(); ++child_it)
- {
- LLPanel *child_panel = dynamic_cast<LLPanel*>(*child_it);
- if (!child_panel)
- continue;
- LLPanel *found_panel = findChildPanel(child_panel,name,recurse);
- if (found_panel)
- {
- return found_panel;
- }
- }
- }
- return NULL;
-}
-
-/**
- * Activate tab with "panel_name" panel
- * if no such tab - return false, otherwise true.
- * TODO* In some cases a pointer to a panel of
- * a specific class may be needed so this method
- * would need to use templates.
- */
-LLPanel* LLSideTray::showPanel (const std::string& panel_name, const LLSD& params)
-{
- LLPanel* new_panel = NULL;
-
- // Look up the tab in the list of detached tabs.
- child_vector_const_iter_t child_it;
- for ( child_it = mDetachedTabs.begin(); child_it != mDetachedTabs.end(); ++child_it)
- {
- new_panel = openChildPanel(*child_it, panel_name, params);
- if (new_panel) break;
- }
-
- // Look up the tab in the list of attached tabs.
- for ( child_it = mTabs.begin(); child_it != mTabs.end(); ++child_it)
- {
- new_panel = openChildPanel(*child_it, panel_name, params);
- if (new_panel) break;
- }
-
- return new_panel;
-}
-
-bool LLSideTray::hidePanel(const std::string& panel_name)
-{
- bool panelHidden = false;
-
- LLPanel* panelp = getPanel(panel_name);
-
- if (panelp)
- {
- LLView* parentp = panelp->getParent();
-
- // Collapse the side bar if the panel or the panel's parent is an attached tab
- if (isTabAttached(panel_name) || (parentp && isTabAttached(parentp->getName())))
- {
- collapseSideBar();
- panelHidden = true;
- }
- else
- {
- panelHidden = LLFloaterReg::hideInstance("side_bar_tab", panel_name);
-
- if (!panelHidden)
- {
- // Look up the panel in the list of detached tabs.
- for (child_vector_const_iter_t child_it = mDetachedTabs.begin(); child_it != mDetachedTabs.end(); ++child_it)
- {
- LLPanel *detached_panel = dynamic_cast<LLPanel*>(*child_it);
-
- if (detached_panel)
- {
- // Hide this detached panel if it is a parent of our panel
- if (findChildPanel(detached_panel, panel_name, true) != NULL)
- {
- panelHidden = LLFloaterReg::hideInstance("side_bar_tab", detached_panel->getName());
- break;
- }
- }
- }
- }
- }
- }
-
- return panelHidden;
-}
-
-void LLSideTray::togglePanel(LLPanel* &sub_panel, const std::string& panel_name, const LLSD& params)
-{
- if(!sub_panel)
- return;
-
- // If a panel is visible and attached to Side Tray (has LLSideTray among its ancestors)
- // it should be toggled off by collapsing Side Tray.
- if (sub_panel->isInVisibleChain() && sub_panel->hasAncestor(this))
- {
- LLSideTray::getInstance()->collapseSideBar();
- }
- else
- {
- LLSideTray::getInstance()->showPanel(panel_name, params);
- }
-}
-
-LLPanel* LLSideTray::getPanel(const std::string& panel_name)
-{
- // Look up the panel in the list of detached tabs.
- for ( child_vector_const_iter_t child_it = mDetachedTabs.begin(); child_it != mDetachedTabs.end(); ++child_it)
- {
- LLPanel *panel = findChildPanel(*child_it,panel_name,true);
- if(panel)
- {
- return panel;
- }
- }
-
- // Look up the panel in the list of attached tabs.
- for ( child_vector_const_iter_t child_it = mTabs.begin(); child_it != mTabs.end(); ++child_it)
- {
- LLPanel *panel = findChildPanel(*child_it,panel_name,true);
- if(panel)
- {
- return panel;
- }
- }
- return NULL;
-}
-
-LLPanel* LLSideTray::getActivePanel()
-{
- if (mActiveTab && !mCollapsed)
- {
- return mActiveTab->getPanel();
- }
- return NULL;
-}
-
-bool LLSideTray::isPanelActive(const std::string& panel_name)
-{
- LLPanel *panel = getActivePanel();
- if (!panel) return false;
- return (panel->getName() == panel_name);
-}
-
-void LLSideTray::setTabDocked(const std::string& tab_name, bool dock, bool toggle_floater /* = true*/)
-{
- // Lookup tab by name.
- LLSideTrayTab* tab = getTab(tab_name);
- if (!tab)
- { // not a docked tab, look through detached tabs
- for(child_vector_iter_t tab_it = mDetachedTabs.begin(), tab_end_it = mDetachedTabs.end();
- tab_it != tab_end_it;
- ++tab_it)
- {
- if ((*tab_it)->getName() == tab_name)
- {
- tab = *tab_it;
- break;
- }
- }
-
- }
-
- llassert(tab != NULL);
-
- // Toggle its dock state.
- if (tab && tab->isDocked() != dock)
- {
- tab->toggleTabDocked(toggle_floater);
- }
-}
-
-
-void LLSideTray::updateSidetrayVisibility()
-{
- // set visibility of parent container based on collapsed state
- LLView* parent = getParent();
- if (parent)
- {
- bool old_visibility = parent->getVisible();
- bool new_visibility = !mCollapsed && !gAgentCamera.cameraMouselook();
-
- if (old_visibility != new_visibility)
- {
- parent->setVisible(new_visibility);
-
- // Signal change of visible width.
- //llinfos << "Visible: " << new_visibility << llendl;
- mVisibleWidthChangeSignal(this, new_visibility);
- }
- }
-}
-
-S32 LLSideTray::getVisibleWidth()
-{
- return (isInVisibleChain() && !mCollapsed) ? getRect().getWidth() : 0;
-}
-
-void LLSideTray::setVisibleWidthChangeCallback(const commit_signal_t::slot_type& cb)
-{
- mVisibleWidthChangeSignal.connect(cb);
-}
diff --git a/indra/newview/llsidetray.h b/indra/newview/llsidetray.h
deleted file mode 100644
index 17158329dc..0000000000
--- a/indra/newview/llsidetray.h
+++ /dev/null
@@ -1,260 +0,0 @@
-/**
- * @file LLSideTray.h
- * @brief SideBar header file
- *
- * $LicenseInfo:firstyear=2004&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-#ifndef LL_LLSIDETRAY_H_
-#define LL_LLSIDETRAY_H_
-
-#include "llpanel.h"
-#include "string"
-
-class LLAccordionCtrl;
-class LLSideTrayTab;
-
-// Define an interface for side tab button badge values
-class LLSideTrayTabBadgeDriver
-{
-public:
- virtual std::string getBadgeString() const = 0;
-};
-
-// Deal with LLSideTrayTab being opaque. Generic do-nothing cast...
-template <class T>
-T tab_cast(LLSideTrayTab* tab) { return tab; }
-// specialized for implementation in presence of LLSideTrayTab definition
-template <>
-LLPanel* tab_cast<LLPanel*>(LLSideTrayTab* tab);
-
-// added inheritance from LLDestroyClass<LLSideTray> to enable Side Tray perform necessary actions
-// while disconnecting viewer in LLAppViewer::disconnectViewer().
-// LLDestroyClassList::instance().fireCallbacks() calls destroyClass method. See EXT-245.
-class LLSideTray : public LLPanel, private LLDestroyClass<LLSideTray>
-{
- friend class LLUICtrlFactory;
- friend class LLDestroyClass<LLSideTray>;
- friend class LLSideTrayTab;
- friend class LLSideTrayButton;
-public:
-
- LOG_CLASS(LLSideTray);
-
- struct Params
- : public LLInitParam::Block<Params, LLPanel::Params>
- {
- // initial state
- Optional<bool> collapsed;
- Optional<LLUIImage*> tab_btn_image_normal,
- tab_btn_image_selected;
-
- Optional<S32> default_button_width,
- default_button_height,
- default_button_margin;
-
- Params();
- };
-
- static LLSideTray* getInstance ();
- static bool instanceCreated ();
-protected:
- LLSideTray(const Params& params);
- typedef std::vector<LLSideTrayTab*> child_vector_t;
- typedef child_vector_t::iterator child_vector_iter_t;
- typedef child_vector_t::const_iterator child_vector_const_iter_t;
- typedef child_vector_t::reverse_iterator child_vector_reverse_iter_t;
- typedef child_vector_t::const_reverse_iterator child_vector_const_reverse_iter_t;
- typedef std::vector<std::string> tab_order_vector_t;
- typedef tab_order_vector_t::const_iterator tab_order_vector_const_iter_t;
-
-public:
-
- // interface functions
-
- /**
- * Select tab with specific name and set it active
- *
- * @param name Tab to switch to.
- * @param keep_prev_visible Whether to keep the previously selected tab visible.
- */
- bool selectTabByName (const std::string& name, bool keep_prev_visible = false);
-
- /**
- * Select tab with specific index and set it active
- */
- bool selectTabByIndex(size_t index);
-
- /**
- * Activate tab with "panel_name" panel
- * if no such tab - return NULL, otherwise a pointer to the panel
- * Pass params as array, or they may be overwritten(example - params["name"]="nearby")
- */
- LLPanel* showPanel (const std::string& panel_name, const LLSD& params = LLSD());
-
- bool hidePanel (const std::string& panel_name);
-
- /**
- * Toggling Side Tray tab which contains "sub_panel" child of "panel_name" panel.
- * If "sub_panel" is not visible Side Tray is opened to display it,
- * otherwise Side Tray is collapsed.
- * params are passed to "panel_name" panel onOpen().
- */
- void togglePanel (LLPanel* &sub_panel, const std::string& panel_name, const LLSD& params = LLSD());
-
- /*
- * get the panel (don't show it or do anything else with it)
- */
- LLPanel* getPanel (const std::string& panel_name);
- LLPanel* getActivePanel ();
- bool isPanelActive (const std::string& panel_name);
-
- void setTabDocked(const std::string& tab_name, bool dock, bool toggle_floater = true);
-
- /*
- * get the panel of given type T (don't show it or do anything else with it)
- */
- template <typename T>
- T* getPanel(const std::string& panel_name)
- {
- T* panel = dynamic_cast<T*>(getPanel(panel_name));
- if (!panel)
- {
- llwarns << "Child named \"" << panel_name << "\" of type " << typeid(T*).name() << " not found" << llendl;
- return NULL;
- }
- return panel;
- }
-
- /*
- * collapse SideBar, hiding visible tab and moving tab buttons
- * to the right corner of the screen
- */
- void collapseSideBar ();
-
- /*
- * expand SideBar
- *
- * @param open_active Whether to call onOpen() for the active tab.
- */
- void expandSideBar(bool open_active = true);
-
-
- /**
- *hightlight if focused. manly copypaste from highlightFocusedFloater
- */
- void highlightFocused();
-
- void setVisible(BOOL visible)
- {
- if (getParent()) getParent()->setVisible(visible);
- }
-
- LLPanel* getButtonsPanel() { return mButtonsPanel; }
-
- bool getCollapsed() { return mCollapsed; }
-
- void setTabButtonBadgeDriver(std::string tabName, LLSideTrayTabBadgeDriver* driver);
-
-public:
- virtual ~LLSideTray(){};
-
- virtual BOOL postBuild();
-
- BOOL handleMouseDown (S32 x, S32 y, MASK mask);
-
- void reshape (S32 width, S32 height, BOOL called_from_parent = TRUE);
-
-
- /**
- * @return side tray width if it's visible and expanded, 0 otherwise.
- *
- * Not that width of the tab buttons is not included.
- *
- * @see setVisibleWidthChangeCallback()
- */
- S32 getVisibleWidth();
-
- void setVisibleWidthChangeCallback(const commit_signal_t::slot_type& cb);
-
- void updateSidetrayVisibility();
-
- void handleLoginComplete();
-
- bool isTabAttached (const std::string& name);
-
-protected:
- bool addChild (LLView* view, S32 tab_group);
- bool removeTab (LLSideTrayTab* tab); // Used to detach tabs temporarily
- bool addTab (LLSideTrayTab* tab); // Used to re-attach tabs
- bool hasTabs ();
-
- const LLSideTrayTab* getActiveTab() const { return mActiveTab; }
- LLSideTrayTab* getTab(const std::string& name);
-
- void createButtons ();
-
- void arrange ();
- void detachTabs ();
- void reflectCollapseChange();
- void processTriState ();
-
- void toggleTabButton (LLSideTrayTab* tab);
-
- LLPanel* openChildPanel (LLSideTrayTab* tab, const std::string& panel_name, const LLSD& params);
-
- void onTabButtonClick(std::string name);
- void onToggleCollapse();
-
-private:
- // Implementation of LLDestroyClass<LLSideTray>
- static void destroyClass()
- {
- // Disable SideTray to avoid crashes. EXT-245
- if (LLSideTray::instanceCreated())
- LLSideTray::getInstance()->setEnabled(FALSE);
- }
-
-private:
- // Since we provide no public way to query mTabs and mDetachedTabs, give
- // LLSideTrayListener friend access.
- friend class LLSideTrayListener;
- LLPanel* mButtonsPanel;
- typedef std::map<std::string,LLButton*> button_map_t;
- button_map_t mTabButtons;
- typedef std::map<std::string,LLSideTrayTabBadgeDriver*> badge_map_t;
- badge_map_t mTabButtonBadgeDrivers;
- child_vector_t mTabs;
- child_vector_t mDetachedTabs;
- tab_order_vector_t mOriginalTabOrder;
- LLSideTrayTab* mActiveTab;
-
- commit_signal_t mVisibleWidthChangeSignal;
-
- LLButton* mCollapseButton;
- bool mCollapsed;
-
- static LLSideTray* sInstance;
-};
-
-#endif
-
diff --git a/indra/newview/llsidetraylistener.cpp b/indra/newview/llsidetraylistener.cpp
deleted file mode 100644
index cd6fa28948..0000000000
--- a/indra/newview/llsidetraylistener.cpp
+++ /dev/null
@@ -1,179 +0,0 @@
-/**
- * @file llsidetraylistener.cpp
- * @author Nat Goodspeed
- * @date 2011-02-15
- * @brief Implementation for llsidetraylistener.
- *
- * $LicenseInfo:firstyear=2011&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2011, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-// Precompiled header
-#include "llviewerprecompiledheaders.h"
-// associated header
-#include "llsidetraylistener.h"
-// STL headers
-// std headers
-// external library headers
-// other Linden headers
-#include "llsidetray.h"
-#include "llsdutil.h"
-
-LLSideTrayListener::LLSideTrayListener(const Getter& getter):
- LLEventAPI("LLSideTray",
- "Operations on side tray (e.g. query state, query tabs)"),
- mGetter(getter)
-{
- add("getCollapsed", "Send on [\"reply\"] an [\"open\"] Boolean",
- &LLSideTrayListener::getCollapsed, LLSDMap("reply", LLSD()));
- add("getTabs",
- "Send on [\"reply\"] a map of tab names and info about them",
- &LLSideTrayListener::getTabs, LLSDMap("reply", LLSD()));
- add("getPanels",
- "Send on [\"reply\"] data about panels available with SideTray.ShowPanel",
- &LLSideTrayListener::getPanels, LLSDMap("reply", LLSD()));
-}
-
-void LLSideTrayListener::getCollapsed(const LLSD& event) const
-{
- sendReply(LLSDMap("open", ! mGetter()->getCollapsed()), event);
-}
-
-void LLSideTrayListener::getTabs(const LLSD& event) const
-{
- LLSD reply;
-
- LLSideTray* tray = mGetter();
- LLSD::Integer ord(0);
- for (LLSideTray::child_list_const_iter_t chi(tray->beginChild()), chend(tray->endChild());
- chi != chend; ++chi, ++ord)
- {
- LLView* child = *chi;
- // How much info is important? Toss in as much as seems reasonable for
- // each tab. But to me, at least for the moment, the most important
- // item is the tab name.
- LLSD info;
- // I like the idea of returning a map keyed by tab name. But as
- // compared to an array of maps, that loses sequence information.
- // Address that by indicating the original order in each map entry.
- info["ord"] = ord;
- info["visible"] = bool(child->getVisible());
- info["enabled"] = bool(child->getEnabled());
- info["available"] = child->isAvailable();
- reply[child->getName()] = info;
- }
-
- sendReply(reply, event);
-}
-
-static LLSD getTabInfo(LLPanel* tab)
-{
- LLSD panels;
- for (LLPanel::tree_iterator_t ti(tab->beginTreeDFS()), tend(tab->endTreeDFS());
- ti != tend; ++ti)
- {
- // *ti is actually an LLView*, which had better not be NULL
- LLView* view(*ti);
- if (! view)
- {
- LL_ERRS("LLSideTrayListener") << "LLSideTrayTab '" << tab->getName()
- << "' has a NULL child LLView*" << LL_ENDL;
- }
-
- // The logic we use to decide what "panel" names to return is heavily
- // based on LLSideTray::showPanel(): the function that actually
- // implements the "SideTray.ShowPanel" operation. showPanel(), in
- // turn, depends on LLSideTray::openChildPanel(): when
- // openChildPanel() returns non-NULL, showPanel() stops searching
- // attached and detached LLSideTrayTab tabs.
-
- // For each LLSideTrayTab, openChildPanel() first calls
- // findChildView(panel_name, true). In other words, panel_name need
- // not be a direct LLSideTrayTab child, it's sought recursively.
- // That's why we use (begin|end)TreeDFS() in this loop.
-
- // But this tree_iterator_t loop will actually traverse every widget
- // in every panel. Returning all those names will not help our caller:
- // passing most such names to openChildPanel() would not do what we
- // want. Even though the code suggests that passing ANY valid
- // side-panel widget name to openChildPanel() will open the tab
- // containing that widget, results could get confusing since followup
- // (onOpen()) logic wouldn't be invoked, and showPanel() wouldn't stop
- // searching because openChildPanel() would return NULL.
-
- // We must filter these LLView items, using logic that (sigh!) mirrors
- // openChildPanel()'s own.
-
- // openChildPanel() returns a non-NULL LLPanel* when either:
- // - the LLView is a direct child of an LLSideTrayPanelContainer
- // - the LLView is itself an LLPanel.
- // But as LLSideTrayPanelContainer can directly contain LLView items
- // that are NOT themselves LLPanels (e.g. "sidebar_me" contains an
- // LLButton called "Jump Right Arrow"), we'd better focus only on
- // LLSideTrayPanelContainer children that are themselves LLPanel
- // items. Which means that the second test completely subsumes the
- // first.
- LLPanel* panel(dynamic_cast<LLPanel*>(view));
- if (panel)
- {
- // Maybe it's overkill to construct an LLSD::Map for each panel, but
- // the possibility remains that we might want to deliver more info
- // about each panel than just its name.
- panels.append(LLSDMap("name", panel->getName()));
- }
- }
-
- return LLSDMap("panels", panels);
-}
-
-void LLSideTrayListener::getPanels(const LLSD& event) const
-{
- LLSD reply;
-
- LLSideTray* tray = mGetter();
- // Iterate through the attached tabs.
- LLSD::Integer ord(0);
- for (LLSideTray::child_vector_t::const_iterator
- ati(tray->mTabs.begin()), atend(tray->mTabs.end());
- ati != atend; ++ati)
- {
- // We don't have access to LLSideTrayTab: the class definition is
- // hidden in llsidetray.cpp. But as LLSideTrayTab isa LLPanel, use the
- // LLPanel API. Unfortunately, without the LLSideTrayTab definition,
- // the compiler doesn't even know this LLSideTrayTab* is an LLPanel*.
- // Persuade it.
- LLPanel* tab(tab_cast<LLPanel*>(*ati));
- reply[tab->getName()] = getTabInfo(tab).with("attached", true).with("ord", ord);
- }
-
- // Now iterate over the detached tabs. These can also be opened via
- // SideTray.ShowPanel.
- ord = 0;
- for (LLSideTray::child_vector_t::const_iterator
- dti(tray->mDetachedTabs.begin()), dtend(tray->mDetachedTabs.end());
- dti != dtend; ++dti)
- {
- LLPanel* tab(tab_cast<LLPanel*>(*dti));
- reply[tab->getName()] = getTabInfo(tab).with("attached", false).with("ord", ord);
- }
-
- sendReply(reply, event);
-}
diff --git a/indra/newview/llsidetraylistener.h b/indra/newview/llsidetraylistener.h
deleted file mode 100644
index 51e2137762..0000000000
--- a/indra/newview/llsidetraylistener.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/**
- * @file llsidetraylistener.h
- * @author Nat Goodspeed
- * @date 2011-02-15
- * @brief
- *
- * $LicenseInfo:firstyear=2011&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2011, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-#if ! defined(LL_LLSIDETRAYLISTENER_H)
-#define LL_LLSIDETRAYLISTENER_H
-
-#include "lleventapi.h"
-#include <boost/function.hpp>
-
-class LLSideTray;
-class LLSD;
-
-class LLSideTrayListener: public LLEventAPI
-{
- typedef boost::function<LLSideTray*()> Getter;
-
-public:
- LLSideTrayListener(const Getter& getter);
-
-private:
- void getCollapsed(const LLSD& event) const;
- void getTabs(const LLSD& event) const;
- void getPanels(const LLSD& event) const;
-
- Getter mGetter;
-};
-
-#endif /* ! defined(LL_LLSIDETRAYLISTENER_H) */
diff --git a/indra/newview/llsidetraypanelcontainer.cpp b/indra/newview/llsidetraypanelcontainer.cpp
index 95a12c7c23..e340333c2c 100644
--- a/indra/newview/llsidetraypanelcontainer.cpp
+++ b/indra/newview/llsidetraypanelcontainer.cpp
@@ -62,6 +62,13 @@ void LLSideTrayPanelContainer::onOpen(const LLSD& key)
getCurrentPanel()->onOpen(key);
}
+void LLSideTrayPanelContainer::openPanel(const std::string& panel_name, const LLSD& key)
+{
+ LLSD combined_key = key;
+ combined_key[PARAM_SUB_PANEL_NAME] = panel_name;
+ onOpen(combined_key);
+}
+
void LLSideTrayPanelContainer::openPreviousPanel()
{
if(!mDefaultPanelName.empty())
diff --git a/indra/newview/llsidetraypanelcontainer.h b/indra/newview/llsidetraypanelcontainer.h
index 14269b002b..93a85ed374 100644
--- a/indra/newview/llsidetraypanelcontainer.h
+++ b/indra/newview/llsidetraypanelcontainer.h
@@ -57,6 +57,11 @@ public:
/*virtual*/ void onOpen(const LLSD& key);
/**
+ * Opens given subpanel.
+ */
+ void openPanel(const std::string& panel_name, const LLSD& key = LLSD::emptyMap());
+
+ /**
* Opens previous panel from panel navigation history.
*/
void openPreviousPanel();
diff --git a/indra/newview/llspatialpartition.cpp b/indra/newview/llspatialpartition.cpp
index 6c2b71dd0a..5d196a465f 100644
--- a/indra/newview/llspatialpartition.cpp
+++ b/indra/newview/llspatialpartition.cpp
@@ -28,6 +28,10 @@
#include "llspatialpartition.h"
+#include "llappviewer.h"
+#include "lltexturecache.h"
+#include "lltexturefetch.h"
+#include "llimageworker.h"
#include "llviewerwindow.h"
#include "llviewerobjectlist.h"
#include "llvovolume.h"
@@ -48,6 +52,7 @@
#include "llvolumemgr.h"
#include "lltextureatlas.h"
#include "llglslshader.h"
+#include "llviewershadermgr.h"
static LLFastTimer::DeclareTimer FTM_FRUSTUM_CULL("Frustum Culling");
static LLFastTimer::DeclareTimer FTM_CULL_REBOUND("Cull Rebound");
@@ -214,7 +219,7 @@ typedef enum
//contact Runitai Linden for a copy of the SL object used to write this table
//basically, you give the table a bitmask of the look-at vector to a node and it
//gives you a triangle fan index array
-static U8 sOcclusionIndices[] =
+static U16 sOcclusionIndices[] =
{
//000
b111, b110, b010, b011, b001, b101, b100, b110,
@@ -251,7 +256,7 @@ U8* get_box_fan_indices_ptr(LLCamera* camera, const LLVector4a& center)
S32 cypher = center.greaterThan(origin).getGatheredBits() & 0x7;
- return sOcclusionIndices+cypher*8;
+ return (U8*) (sOcclusionIndices+cypher*8);
}
@@ -259,9 +264,8 @@ static LLFastTimer::DeclareTimer FTM_BUILD_OCCLUSION("Build Occlusion");
void LLSpatialGroup::buildOcclusion()
{
- if (mOcclusionVerts.isNull())
+ //if (mOcclusionVerts.isNull())
{
-
mOcclusionVerts = new LLVertexBuffer(LLVertexBuffer::MAP_VERTEX,
LLVertexBuffer::sUseStreamDraw ? mBufferUsage : 0); //if GL has a hard time with VBOs, don't use them for occlusion culling.
mOcclusionVerts->allocateBuffer(8, 64, true);
@@ -321,7 +325,8 @@ void LLSpatialGroup::buildOcclusion()
}
{
- mOcclusionVerts->setBuffer(0);
+ mOcclusionVerts->flush();
+ LLVertexBuffer::unbind();
}
clearState(LLSpatialGroup::OCCLUSION_DIRTY);
@@ -721,7 +726,9 @@ void LLSpatialPartition::rebuildGeom(LLSpatialGroup* group)
if (vertex_count > 0 && index_count > 0)
{ //create vertex buffer containing volume geometry for this node
group->mBuilt = 1.f;
- if (group->mVertexBuffer.isNull() || (group->mBufferUsage != group->mVertexBuffer->getUsage() && LLVertexBuffer::sEnableVBOs))
+ if (group->mVertexBuffer.isNull() ||
+ !group->mVertexBuffer->isWriteable() ||
+ (group->mBufferUsage != group->mVertexBuffer->getUsage() && LLVertexBuffer::sEnableVBOs))
{
group->mVertexBuffer = createVertexBuffer(mVertexDataMask, group->mBufferUsage);
group->mVertexBuffer->allocateBuffer(vertex_count, index_count, true);
@@ -1180,6 +1187,8 @@ void LLSpatialGroup::clearOcclusionState(U32 state, S32 mode)
LLSpatialGroup::LLSpatialGroup(OctreeNode* node, LLSpatialPartition* part) :
mState(0),
+ mGeometryBytes(0),
+ mSurfaceArea(0.f),
mBuilt(0.f),
mOctreeNode(node),
mSpatialPartition(part),
@@ -1220,6 +1229,7 @@ LLSpatialGroup::LLSpatialGroup(OctreeNode* node, LLSpatialPartition* part) :
for (U32 i = 0; i < LLViewerCamera::NUM_CAMERAS; i++)
{
mOcclusionQuery[i] = 0;
+ mOcclusionIssued[i] = 0;
mOcclusionState[i] = parent ? SG_STATE_INHERIT_MASK & parent->mOcclusionState[i] : 0;
mVisible[i] = 0;
}
@@ -1404,6 +1414,17 @@ void LLSpatialGroup::handleDestruction(const TreeNode* node)
}
}
+ //clean up avatar attachment stats
+ LLSpatialBridge* bridge = mSpatialPartition->asBridge();
+ if (bridge)
+ {
+ if (bridge->mAvatar.notNull())
+ {
+ bridge->mAvatar->mAttachmentGeometryBytes -= mGeometryBytes;
+ bridge->mAvatar->mAttachmentSurfaceArea -= mSurfaceArea;
+ }
+ }
+
clearDrawMap();
mVertexBuffer = NULL;
mBufferMap.clear();
@@ -1542,6 +1563,8 @@ BOOL LLSpatialGroup::rebound()
}
static LLFastTimer::DeclareTimer FTM_OCCLUSION_READBACK("Readback Occlusion");
+static LLFastTimer::DeclareTimer FTM_OCCLUSION_WAIT("Wait");
+
void LLSpatialGroup::checkOcclusion()
{
if (LLPipeline::sUseOcclusion > 1)
@@ -1559,6 +1582,22 @@ void LLSpatialGroup::checkOcclusion()
if (mOcclusionQuery[LLViewerCamera::sCurCameraID])
{
glGetQueryObjectuivARB(mOcclusionQuery[LLViewerCamera::sCurCameraID], GL_QUERY_RESULT_AVAILABLE_ARB, &available);
+
+ if (mOcclusionIssued[LLViewerCamera::sCurCameraID] < gFrameCount)
+ { //query was issued last frame, wait until it's available
+ S32 max_loop = 1024;
+ LLFastTimer t(FTM_OCCLUSION_WAIT);
+ while (!available && max_loop-- > 0)
+ {
+ F32 max_time = llmin(gFrameIntervalSeconds*10.f, 1.f);
+ //do some usefu work while we wait
+ LLAppViewer::getTextureCache()->update(max_time); // unpauses the texture cache thread
+ LLAppViewer::getImageDecodeThread()->update(max_time); // unpauses the image thread
+ LLAppViewer::getTextureFetch()->update(max_time); // unpauses the texture fetch thread
+
+ glGetQueryObjectuivARB(mOcclusionQuery[LLViewerCamera::sCurCameraID], GL_QUERY_RESULT_AVAILABLE_ARB, &available);
+ }
+ }
}
else
{
@@ -1614,6 +1653,15 @@ void LLSpatialGroup::checkOcclusion()
static LLFastTimer::DeclareTimer FTM_PUSH_OCCLUSION_VERTS("Push Occlusion");
static LLFastTimer::DeclareTimer FTM_SET_OCCLUSION_STATE("Occlusion State");
static LLFastTimer::DeclareTimer FTM_OCCLUSION_EARLY_FAIL("Occlusion Early Fail");
+static LLFastTimer::DeclareTimer FTM_OCCLUSION_ALLOCATE("Allocate");
+static LLFastTimer::DeclareTimer FTM_OCCLUSION_BUILD("Build");
+static LLFastTimer::DeclareTimer FTM_OCCLUSION_BEGIN_QUERY("Begin Query");
+static LLFastTimer::DeclareTimer FTM_OCCLUSION_END_QUERY("End Query");
+static LLFastTimer::DeclareTimer FTM_OCCLUSION_SET_BUFFER("Set Buffer");
+static LLFastTimer::DeclareTimer FTM_OCCLUSION_DRAW_WATER("Draw Water");
+static LLFastTimer::DeclareTimer FTM_OCCLUSION_DRAW("Draw");
+
+
void LLSpatialGroup::doOcclusion(LLCamera* camera)
{
@@ -1637,11 +1685,13 @@ void LLSpatialGroup::doOcclusion(LLCamera* camera)
if (!mOcclusionQuery[LLViewerCamera::sCurCameraID])
{
+ LLFastTimer t(FTM_OCCLUSION_ALLOCATE);
mOcclusionQuery[LLViewerCamera::sCurCameraID] = sQueryPool.allocate();
}
if (mOcclusionVerts.isNull() || isState(LLSpatialGroup::OCCLUSION_DIRTY))
{
+ LLFastTimer t(FTM_OCCLUSION_BUILD);
buildOcclusion();
}
@@ -1666,12 +1716,24 @@ void LLSpatialGroup::doOcclusion(LLCamera* camera)
{
LLFastTimer t(FTM_PUSH_OCCLUSION_VERTS);
- glBeginQueryARB(mode, mOcclusionQuery[LLViewerCamera::sCurCameraID]);
+
+ //store which frame this query was issued on
+ mOcclusionIssued[LLViewerCamera::sCurCameraID] = gFrameCount;
+
+ {
+ LLFastTimer t(FTM_OCCLUSION_BEGIN_QUERY);
+ glBeginQueryARB(mode, mOcclusionQuery[LLViewerCamera::sCurCameraID]);
+ }
- mOcclusionVerts->setBuffer(LLVertexBuffer::MAP_VERTEX);
+ {
+ LLFastTimer t(FTM_OCCLUSION_SET_BUFFER);
+ mOcclusionVerts->setBuffer(LLVertexBuffer::MAP_VERTEX);
+ }
if (!use_depth_clamp && mSpatialPartition->mDrawableType == LLDrawPool::POOL_VOIDWATER)
{
+ LLFastTimer t(FTM_OCCLUSION_DRAW_WATER);
+
LLGLSquashToFarClip squash(glh_get_current_projection(), 1);
if (camera->getOrigin().isExactlyZero())
{ //origin is invalid, draw entire box
@@ -1685,6 +1747,7 @@ void LLSpatialGroup::doOcclusion(LLCamera* camera)
}
else
{
+ LLFastTimer t(FTM_OCCLUSION_DRAW);
if (camera->getOrigin().isExactlyZero())
{ //origin is invalid, draw entire box
mOcclusionVerts->drawRange(LLRender::TRIANGLE_FAN, 0, 7, 8, 0);
@@ -1696,7 +1759,11 @@ void LLSpatialGroup::doOcclusion(LLCamera* camera)
}
}
- glEndQueryARB(mode);
+
+ {
+ LLFastTimer t(FTM_OCCLUSION_END_QUERY);
+ glEndQueryARB(mode);
+ }
}
}
@@ -1713,7 +1780,7 @@ void LLSpatialGroup::doOcclusion(LLCamera* camera)
//==============================================
LLSpatialPartition::LLSpatialPartition(U32 data_mask, BOOL render_by_group, U32 buffer_usage)
-: mRenderByGroup(render_by_group)
+: mRenderByGroup(render_by_group), mBridge(NULL)
{
LLMemType mt(LLMemType::MTYPE_SPACE_PARTITION);
mOcclusionEnabled = TRUE;
@@ -2416,7 +2483,7 @@ void pushVerts(LLFace* face, U32 mask)
LLVertexBuffer* buffer = face->getVertexBuffer();
- if (buffer)
+ if (buffer && (face->getGeomCount() >= 3))
{
buffer->setBuffer(mask);
U16 start = face->getGeomStart();
@@ -2441,8 +2508,7 @@ void pushVerts(LLVolume* volume)
for (S32 i = 0; i < volume->getNumVolumeFaces(); ++i)
{
const LLVolumeFace& face = volume->getVolumeFace(i);
- glVertexPointer(3, GL_FLOAT, 16, face.mPositions);
- glDrawElements(GL_TRIANGLES, face.mNumIndices, GL_UNSIGNED_SHORT, face.mIndices);
+ LLVertexBuffer::drawElements(LLRender::TRIANGLES, face.mPositions, NULL, face.mNumIndices, face.mIndices);
}
}
@@ -2451,7 +2517,7 @@ void pushBufferVerts(LLVertexBuffer* buffer, U32 mask)
if (buffer)
{
buffer->setBuffer(mask);
- buffer->drawRange(LLRender::TRIANGLES, 0, buffer->getRequestedVerts()-1, buffer->getRequestedIndices(), 0);
+ buffer->drawRange(LLRender::TRIANGLES, 0, buffer->getNumVerts()-1, buffer->getNumIndices(), 0);
}
}
@@ -2508,7 +2574,7 @@ void pushVertsColorCoded(LLSpatialGroup* group, U32 mask)
{
params = *j;
LLRenderPass::applyModelMatrix(*params);
- glColor4f(colors[col].mV[0], colors[col].mV[1], colors[col].mV[2], 0.5f);
+ gGL.diffuseColor4f(colors[col].mV[0], colors[col].mV[1], colors[col].mV[2], 0.5f);
params->mVertexBuffer->setBuffer(mask);
params->mVertexBuffer->drawRange(params->mParticle ? LLRender::POINTS : LLRender::TRIANGLES,
params->mStart, params->mEnd, params->mCount, params->mOffset);
@@ -2523,7 +2589,7 @@ void renderOctree(LLSpatialGroup* group)
//coded by buffer usage and activity
gGL.setSceneBlendType(LLRender::BT_ADD_WITH_ALPHA);
LLVector4 col;
- /*if (group->mBuilt > 0.f)
+ if (group->mBuilt > 0.f)
{
group->mBuilt -= 2.f * gFrameIntervalSeconds;
if (group->mBufferUsage == GL_STATIC_DRAW_ARB)
@@ -2541,7 +2607,7 @@ void renderOctree(LLSpatialGroup* group)
LLGLDepthTest gl_depth(FALSE, FALSE);
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
- gGL.color4f(1,0,0,group->mBuilt);
+ gGL.diffuseColor4f(1,0,0,group->mBuilt);
gGL.flush();
glLineWidth(5.f);
drawBoxOutline(group->mObjectBounds[0], group->mObjectBounds[1]);
@@ -2553,9 +2619,9 @@ void renderOctree(LLSpatialGroup* group)
LLDrawable* drawable = *i;
if (!group->mSpatialPartition->isBridge())
{
- glPushMatrix();
+ gGL.pushMatrix();
LLVector3 trans = drawable->getRegion()->getOriginAgent();
- glTranslatef(trans.mV[0], trans.mV[1], trans.mV[2]);
+ gGL.translatef(trans.mV[0], trans.mV[1], trans.mV[2]);
}
for (S32 j = 0; j < drawable->getNumFaces(); j++)
@@ -2565,11 +2631,11 @@ void renderOctree(LLSpatialGroup* group)
{
if (gFrameTimeSeconds - face->mLastUpdateTime < 0.5f)
{
- glColor4f(0, 1, 0, group->mBuilt);
+ gGL.diffuseColor4f(0, 1, 0, group->mBuilt);
}
else if (gFrameTimeSeconds - face->mLastMoveTime < 0.5f)
{
- glColor4f(1, 0, 0, group->mBuilt);
+ gGL.diffuseColor4f(1, 0, 0, group->mBuilt);
}
else
{
@@ -2585,14 +2651,14 @@ void renderOctree(LLSpatialGroup* group)
if (!group->mSpatialPartition->isBridge())
{
- glPopMatrix();
+ gGL.popMatrix();
}
}
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
- gGL.color4f(1,1,1,1);
+ gGL.diffuseColor4f(1,1,1,1);
}
}
- else*/
+ else
{
if (group->mBufferUsage == GL_STATIC_DRAW_ARB && !group->getData().empty()
&& group->mSpatialPartition->mRenderByGroup)
@@ -2605,7 +2671,7 @@ void renderOctree(LLSpatialGroup* group)
}
}
- gGL.color4fv(col.mV);
+ gGL.diffuseColor4fv(col.mV);
LLVector4a fudge;
fudge.splat(0.001f);
LLVector4a size = group->mObjectBounds[1];
@@ -2622,16 +2688,16 @@ void renderOctree(LLSpatialGroup* group)
//if (group->mBuilt <= 0.f)
{
//draw opaque outline
- //gGL.color4f(col.mV[0], col.mV[1], col.mV[2], 1.f);
+ //gGL.diffuseColor4f(col.mV[0], col.mV[1], col.mV[2], 1.f);
//drawBoxOutline(group->mObjectBounds[0], group->mObjectBounds[1]);
- gGL.color4f(0,1,1,1);
+ gGL.diffuseColor4f(0,1,1,1);
drawBoxOutline(group->mBounds[0],group->mBounds[1]);
//draw bounding box for draw info
/*if (group->mSpatialPartition->mRenderByGroup)
{
- gGL.color4f(1.0f, 0.75f, 0.25f, 0.6f);
+ gGL.diffuseColor4f(1.0f, 0.75f, 0.25f, 0.6f);
for (LLSpatialGroup::draw_map_t::iterator i = group->mDrawMap.begin(); i != group->mDrawMap.end(); ++i)
{
for (LLSpatialGroup::drawmap_elem_t::iterator j = i->second.begin(); j != i->second.end(); ++j)
@@ -2650,7 +2716,7 @@ void renderOctree(LLSpatialGroup* group)
}
// LLSpatialGroup::OctreeNode* node = group->mOctreeNode;
-// gGL.color4f(0,1,0,1);
+// gGL.diffuseColor4f(0,1,0,1);
// drawBoxOutline(LLVector3(node->getCenter()), LLVector3(node->getSize()));
}
@@ -2663,11 +2729,12 @@ void renderVisibility(LLSpatialGroup* group, LLCamera* camera)
BOOL render_objects = (!LLPipeline::sUseOcclusion || !group->isOcclusionState(LLSpatialGroup::OCCLUDED)) && group->isVisible() &&
!group->getData().empty();
+
if (render_objects)
{
LLGLDepthTest depth_under(GL_TRUE, GL_FALSE, GL_GREATER);
- glColor4f(0, 0.5f, 0, 0.5f);
- gGL.color4f(0, 0.5f, 0, 0.5f);
+ gGL.diffuseColor4f(0, 0.5f, 0, 0.5f);
+ gGL.diffuseColor4f(0, 0.5f, 0, 0.5f);
pushBufferVerts(group, LLVertexBuffer::MAP_VERTEX);
}
@@ -2676,8 +2743,8 @@ void renderVisibility(LLSpatialGroup* group, LLCamera* camera)
if (render_objects)
{
- glColor4f(0.f, 0.5f, 0.f,1.f);
- gGL.color4f(0.f, 0.5f, 0.f, 1.f);
+ gGL.diffuseColor4f(0.f, 0.5f, 0.f,1.f);
+ gGL.diffuseColor4f(0.f, 0.5f, 0.f, 1.f);
pushBufferVerts(group, LLVertexBuffer::MAP_VERTEX);
}
@@ -2685,8 +2752,8 @@ void renderVisibility(LLSpatialGroup* group, LLCamera* camera)
if (render_objects)
{
- glColor4f(0.f, 0.75f, 0.f,0.5f);
- gGL.color4f(0.f, 0.75f, 0.f, 0.5f);
+ gGL.diffuseColor4f(0.f, 0.75f, 0.f,0.5f);
+ gGL.diffuseColor4f(0.f, 0.75f, 0.f, 0.5f);
pushBufferVerts(group, LLVertexBuffer::MAP_VERTEX);
}
/*else if (camera && group->mOcclusionVerts.notNull())
@@ -2694,11 +2761,11 @@ void renderVisibility(LLSpatialGroup* group, LLCamera* camera)
LLVertexBuffer::unbind();
group->mOcclusionVerts->setBuffer(LLVertexBuffer::MAP_VERTEX);
- glColor4f(1.0f, 0.f, 0.f, 0.5f);
+ gGL.diffuseColor4f(1.0f, 0.f, 0.f, 0.5f);
group->mOcclusionVerts->drawRange(LLRender::TRIANGLE_FAN, 0, 7, 8, get_box_fan_indices(camera, group->mBounds[0]));
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
- glColor4f(1.0f, 1.f, 1.f, 1.0f);
+ gGL.diffuseColor4f(1.0f, 1.f, 1.f, 1.0f);
group->mOcclusionVerts->drawRange(LLRender::TRIANGLE_FAN, 0, 7, 8, get_box_fan_indices(camera, group->mBounds[0]));
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
}*/
@@ -2707,7 +2774,7 @@ void renderVisibility(LLSpatialGroup* group, LLCamera* camera)
void renderCrossHairs(LLVector3 position, F32 size, LLColor4 color)
{
- gGL.color4fv(color.mV);
+ gGL.diffuseColor4fv(color.mV);
gGL.begin(LLRender::LINES);
{
gGL.vertex3fv((position - LLVector3(size, 0.f, 0.f)).mV);
@@ -2731,23 +2798,23 @@ void renderUpdateType(LLDrawable* drawablep)
switch (vobj->getLastUpdateType())
{
case OUT_FULL:
- glColor4f(0,1,0,0.5f);
+ gGL.diffuseColor4f(0,1,0,0.5f);
break;
case OUT_TERSE_IMPROVED:
- glColor4f(0,1,1,0.5f);
+ gGL.diffuseColor4f(0,1,1,0.5f);
break;
case OUT_FULL_COMPRESSED:
if (vobj->getLastUpdateCached())
{
- glColor4f(1,0,0,0.5f);
+ gGL.diffuseColor4f(1,0,0,0.5f);
}
else
{
- glColor4f(1,1,0,0.5f);
+ gGL.diffuseColor4f(1,1,0,0.5f);
}
break;
case OUT_FULL_CACHED:
- glColor4f(0,0,1,0.5f);
+ gGL.diffuseColor4f(0,0,1,0.5f);
break;
default:
llwarns << "Unknown update_type " << vobj->getLastUpdateType() << llendl;
@@ -2879,17 +2946,17 @@ void renderBoundingBox(LLDrawable* drawable, BOOL set_color = TRUE)
{
if (drawable->isSpatialBridge())
{
- gGL.color4f(1,0.5f,0,1);
+ gGL.diffuseColor4f(1,0.5f,0,1);
}
else if (drawable->getVOVolume())
{
if (drawable->isRoot())
{
- gGL.color4f(1,1,0,1);
+ gGL.diffuseColor4f(1,1,0,1);
}
else
{
- gGL.color4f(0,1,0,1);
+ gGL.diffuseColor4f(0,1,0,1);
}
}
else if (drawable->getVObj())
@@ -2897,30 +2964,30 @@ void renderBoundingBox(LLDrawable* drawable, BOOL set_color = TRUE)
switch (drawable->getVObj()->getPCode())
{
case LLViewerObject::LL_VO_SURFACE_PATCH:
- gGL.color4f(0,1,1,1);
+ gGL.diffuseColor4f(0,1,1,1);
break;
case LLViewerObject::LL_VO_CLOUDS:
// no longer used
break;
case LLViewerObject::LL_VO_PART_GROUP:
case LLViewerObject::LL_VO_HUD_PART_GROUP:
- gGL.color4f(0,0,1,1);
+ gGL.diffuseColor4f(0,0,1,1);
break;
case LLViewerObject::LL_VO_VOID_WATER:
case LLViewerObject::LL_VO_WATER:
- gGL.color4f(0,0.5f,1,1);
+ gGL.diffuseColor4f(0,0.5f,1,1);
break;
case LL_PCODE_LEGACY_TREE:
- gGL.color4f(0,0.5f,0,1);
+ gGL.diffuseColor4f(0,0.5f,0,1);
break;
default:
- gGL.color4f(1,0,1,1);
+ gGL.diffuseColor4f(1,0,1,1);
break;
}
}
else
{
- gGL.color4f(1,0,0,1);
+ gGL.diffuseColor4f(1,0,0,1);
}
}
@@ -2976,7 +3043,7 @@ void renderNormals(LLDrawable* drawablep)
{
LLVolume* volume = vol->getVolume();
gGL.pushMatrix();
- glMultMatrixf((F32*) vol->getRelativeXform().mMatrix);
+ gGL.multMatrix((F32*) vol->getRelativeXform().mMatrix);
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
@@ -2986,16 +3053,15 @@ void renderNormals(LLDrawable* drawablep)
{
const LLVolumeFace& face = volume->getVolumeFace(i);
- gGL.begin(LLRender::LINES);
-
for (S32 j = 0; j < face.mNumVertices; ++j)
{
+ gGL.begin(LLRender::LINES);
LLVector4a n,p;
n.setMul(face.mNormals[j], scale);
p.setAdd(face.mPositions[j], n);
- gGL.color4f(1,1,1,1);
+ gGL.diffuseColor4f(1,1,1,1);
gGL.vertex3fv(face.mPositions[j].getF32ptr());
gGL.vertex3fv(p.getF32ptr());
@@ -3004,13 +3070,12 @@ void renderNormals(LLDrawable* drawablep)
n.setMul(face.mBinormals[j], scale);
p.setAdd(face.mPositions[j], n);
- gGL.color4f(0,1,1,1);
+ gGL.diffuseColor4f(0,1,1,1);
gGL.vertex3fv(face.mPositions[j].getF32ptr());
gGL.vertex3fv(p.getF32ptr());
}
+ gGL.end();
}
-
- gGL.end();
}
gGL.popMatrix();
@@ -3050,33 +3115,33 @@ void renderMeshBaseHull(LLVOVolume* volume, U32 data_mask, LLColor4& color, LLCo
{
if (!decomp->mBaseHullMesh.empty())
{
- glColor4fv(color.mV);
+ gGL.diffuseColor4fv(color.mV);
LLVertexBuffer::drawArrays(LLRender::TRIANGLES, decomp->mBaseHullMesh.mPositions, decomp->mBaseHullMesh.mNormals);
}
else
{
gMeshRepo.buildPhysicsMesh(*decomp);
- gGL.color3f(0,1,1);
+ gGL.diffuseColor4f(0,1,1,1);
drawBoxOutline(center, size);
}
}
else
{
- gGL.color3f(1,0,1);
+ gGL.diffuseColor3f(1,0,1);
drawBoxOutline(center, size);
}
}
void render_hull(LLModel::PhysicsMesh& mesh, const LLColor4& color, const LLColor4& line_color)
{
- glColor4fv(color.mV);
+ gGL.diffuseColor4fv(color.mV);
LLVertexBuffer::drawArrays(LLRender::TRIANGLES, mesh.mPositions, mesh.mNormals);
LLGLEnable offset(GL_POLYGON_OFFSET_LINE);
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
glPolygonOffset(3.f, 3.f);
glLineWidth(3.f);
- glColor4fv(line_color.mV);
+ gGL.diffuseColor4fv(line_color.mV);
LLVertexBuffer::drawArrays(LLRender::TRIANGLES, mesh.mPositions, mesh.mNormals);
glLineWidth(1.f);
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
@@ -3130,7 +3195,7 @@ void renderPhysicsShape(LLDrawable* drawable, LLVOVolume* volume)
LLVector3 size(0.25f,0.25f,0.25f);
gGL.pushMatrix();
- glMultMatrixf((F32*) volume->getRelativeXform().mMatrix);
+ gGL.multMatrix((F32*) volume->getRelativeXform().mMatrix);
if (type == LLPhysicsShapeBuilderUtil::PhysicsShapeSpecification::USER_MESH)
{
@@ -3158,11 +3223,11 @@ void renderPhysicsShape(LLDrawable* drawable, LLVOVolume* volume)
else if (!decomp->mPhysicsShapeMesh.empty())
{
//decomp has physics mesh, render that mesh
- glColor4fv(color.mV);
+ gGL.diffuseColor4fv(color.mV);
LLVertexBuffer::drawArrays(LLRender::TRIANGLES, decomp->mPhysicsShapeMesh.mPositions, decomp->mPhysicsShapeMesh.mNormals);
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
- glColor4fv(line_color.mV);
+ gGL.diffuseColor4fv(line_color.mV);
LLVertexBuffer::drawArrays(LLRender::TRIANGLES, decomp->mPhysicsShapeMesh.mPositions, decomp->mPhysicsShapeMesh.mNormals);
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
}
@@ -3179,7 +3244,7 @@ void renderPhysicsShape(LLDrawable* drawable, LLVOVolume* volume)
}
else
{
- gGL.color3f(1,1,0);
+ gGL.diffuseColor3f(1,1,0);
drawBoxOutline(center, size);
}
}
@@ -3190,7 +3255,6 @@ void renderPhysicsShape(LLDrawable* drawable, LLVOVolume* volume)
{
renderMeshBaseHull(volume, data_mask, color, line_color);
}
-#if LL_WINDOWS
else
{
LLVolumeParams volume_params = volume->getVolume()->getParams();
@@ -3288,27 +3352,26 @@ void renderPhysicsShape(LLDrawable* drawable, LLVOVolume* volume)
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
- glColor4fv(line_color.mV);
+ gGL.diffuseColor4fv(line_color.mV);
LLVertexBuffer::unbind();
llassert(!LLGLSLShader::sNoFixedFunction || LLGLSLShader::sCurBoundShader != 0);
-
- glVertexPointer(3, GL_FLOAT, 16, phys_volume->mHullPoints);
- glDrawElements(GL_TRIANGLES, phys_volume->mNumHullIndices, GL_UNSIGNED_SHORT, phys_volume->mHullIndices);
+
+ LLVertexBuffer::drawElements(LLRender::TRIANGLES, phys_volume->mHullPoints, NULL, phys_volume->mNumHullIndices, phys_volume->mHullIndices);
- glColor4fv(color.mV);
+ gGL.diffuseColor4fv(color.mV);
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
- glDrawElements(GL_TRIANGLES, phys_volume->mNumHullIndices, GL_UNSIGNED_SHORT, phys_volume->mHullIndices);
+ LLVertexBuffer::drawElements(LLRender::TRIANGLES, phys_volume->mHullPoints, NULL, phys_volume->mNumHullIndices, phys_volume->mHullIndices);
+
}
else
{
- gGL.color3f(1,0,1);
+ gGL.diffuseColor4f(1,0,1,1);
drawBoxOutline(center, size);
}
LLPrimitive::sVolumeManager->unrefVolume(phys_volume);
}
-#endif //LL_WINDOWS
}
else if (type == LLPhysicsShapeBuilderUtil::PhysicsShapeSpecification::BOX)
{
@@ -3317,12 +3380,12 @@ void renderPhysicsShape(LLDrawable* drawable, LLVOVolume* volume)
LLVector3 vscale = volume->getScale()*2.f;
scale.set(scale[0]/vscale[0], scale[1]/vscale[1], scale[2]/vscale[2]);
- gGL.color4fv(color.mV);
+ gGL.diffuseColor4fv(color.mV);
drawBox(center, scale);
}
else if (type == LLPhysicsShapeBuilderUtil::PhysicsShapeSpecification::SPHERE)
{
- LLVolumeParams volume_params;
+ /*LLVolumeParams volume_params;
volume_params.setType( LL_PCODE_PROFILE_CIRCLE_HALF, LL_PCODE_PATH_CIRCLE );
volume_params.setBeginAndEndS( 0.f, 1.f );
volume_params.setBeginAndEndT( 0.f, 1.f );
@@ -3330,9 +3393,9 @@ void renderPhysicsShape(LLDrawable* drawable, LLVOVolume* volume)
volume_params.setShear ( 0, 0 );
LLVolume* sphere = LLPrimitive::sVolumeManager->refVolume(volume_params, 3);
- glColor4fv(color.mV);
+ gGL.diffuseColor4fv(color.mV);
pushVerts(sphere);
- LLPrimitive::sVolumeManager->unrefVolume(sphere);
+ LLPrimitive::sVolumeManager->unrefVolume(sphere);*/
}
else if (type == LLPhysicsShapeBuilderUtil::PhysicsShapeSpecification::CYLINDER)
{
@@ -3344,7 +3407,7 @@ void renderPhysicsShape(LLDrawable* drawable, LLVOVolume* volume)
volume_params.setShear ( 0, 0 );
LLVolume* cylinder = LLPrimitive::sVolumeManager->refVolume(volume_params, 3);
- glColor4fv(color.mV);
+ gGL.diffuseColor4fv(color.mV);
pushVerts(cylinder);
LLPrimitive::sVolumeManager->unrefVolume(cylinder);
}
@@ -3356,10 +3419,10 @@ void renderPhysicsShape(LLDrawable* drawable, LLVOVolume* volume)
LLVolume* phys_volume = LLPrimitive::sVolumeManager->refVolume(volume_params, detail);
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
- glColor4fv(line_color.mV);
+ gGL.diffuseColor4fv(line_color.mV);
pushVerts(phys_volume);
- glColor4fv(color.mV);
+ gGL.diffuseColor4fv(color.mV);
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
pushVerts(phys_volume);
LLPrimitive::sVolumeManager->unrefVolume(phys_volume);
@@ -3377,16 +3440,17 @@ void renderPhysicsShape(LLDrawable* drawable, LLVOVolume* volume)
llassert(!LLGLSLShader::sNoFixedFunction || LLGLSLShader::sCurBoundShader != 0);
LLVertexBuffer::unbind();
glVertexPointer(3, GL_FLOAT, 16, phys_volume->mHullPoints);
- glColor4fv(line_color.mV);
+ gGL.diffuseColor4fv(line_color.mV);
+ gGL.syncMatrices();
glDrawElements(GL_TRIANGLES, phys_volume->mNumHullIndices, GL_UNSIGNED_SHORT, phys_volume->mHullIndices);
- glColor4fv(color.mV);
+ gGL.diffuseColor4fv(color.mV);
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
glDrawElements(GL_TRIANGLES, phys_volume->mNumHullIndices, GL_UNSIGNED_SHORT, phys_volume->mHullIndices);
}
else
{
- gGL.color3f(1,0,1);
+ gGL.diffuseColor3f(1,0,1);
drawBoxOutline(center, size);
gMeshRepo.buildHull(volume_params, detail);
}
@@ -3402,15 +3466,6 @@ void renderPhysicsShape(LLDrawable* drawable, LLVOVolume* volume)
}
gGL.popMatrix();
-
- /*{ //analytical shape, just push visual rep.
- glColor3fv(color.mV);
- glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
- pushVerts(drawable, data_mask);
- glColor4fv(color.mV);
- glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
- pushVerts(drawable, data_mask);
- }*/
}
void renderPhysicsShapes(LLSpatialGroup* group)
@@ -3425,7 +3480,7 @@ void renderPhysicsShapes(LLSpatialGroup* group)
{
gGL.pushMatrix();
LLVector3 trans = drawable->getRegion()->getOriginAgent();
- glTranslatef(trans.mV[0], trans.mV[1], trans.mV[2]);
+ gGL.translatef(trans.mV[0], trans.mV[1], trans.mV[2]);
renderPhysicsShape(drawable, volume);
gGL.popMatrix();
}
@@ -3449,12 +3504,12 @@ void renderPhysicsShapes(LLSpatialGroup* group)
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
buff->setBuffer(LLVertexBuffer::MAP_VERTEX);
- glColor3f(0.2f, 0.5f, 0.3f);
- buff->draw(LLRender::TRIANGLES, buff->getRequestedIndices(), 0);
+ gGL.diffuseColor3f(0.2f, 0.5f, 0.3f);
+ buff->draw(LLRender::TRIANGLES, buff->getNumIndices(), 0);
- glColor3f(0.2f, 1.f, 0.3f);
+ gGL.diffuseColor3f(0.2f, 1.f, 0.3f);
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
- buff->draw(LLRender::TRIANGLES, buff->getRequestedIndices(), 0);
+ buff->draw(LLRender::TRIANGLES, buff->getNumIndices(), 0);
}
}
}
@@ -3491,11 +3546,11 @@ void renderTexturePriority(LLDrawable* drawable)
F32 t = vsize/sLastMaxTexPriority;
LLVector4 col = lerp(cold, hot, t);
- gGL.color4fv(col.mV);
+ gGL.diffuseColor4fv(col.mV);
}
//else
//{
- // gGL.color4f(1,0,1,1);
+ // gGL.diffuseColor4f(1,0,1,1);
//}
LLVector4a center;
@@ -3514,7 +3569,7 @@ void renderTexturePriority(LLDrawable* drawable)
LLVector4 col = lerp(boost_cold, boost_hot, t);
LLGLEnable blend_on(GL_BLEND);
gGL.blendFunc(GL_SRC_ALPHA, GL_ONE);
- gGL.color4fv(col.mV);
+ gGL.diffuseColor4fv(col.mV);
drawBox(center, size);
gGL.blendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
}*/
@@ -3527,7 +3582,7 @@ void renderPoints(LLDrawable* drawablep)
if (drawablep->getNumFaces())
{
gGL.begin(LLRender::POINTS);
- gGL.color3f(1,1,1);
+ gGL.diffuseColor3f(1,1,1);
for (S32 i = 0; i < drawablep->getNumFaces(); i++)
{
gGL.vertex3fv(drawablep->getFace(i)->mCenterLocal.mV);
@@ -3544,7 +3599,7 @@ void renderTextureAnim(LLDrawInfo* params)
}
LLGLEnable blend(GL_BLEND);
- glColor4f(1,1,0,0.5f);
+ gGL.diffuseColor4f(1,1,0,0.5f);
pushVerts(params, LLVertexBuffer::MAP_VERTEX);
}
@@ -3552,7 +3607,7 @@ void renderBatchSize(LLDrawInfo* params)
{
LLGLEnable offset(GL_POLYGON_OFFSET_FILL);
glPolygonOffset(-1.f, 1.f);
- glColor3ubv((GLubyte*) &(params->mDebugColor));
+ gGL.diffuseColor4ubv((GLubyte*) &(params->mDebugColor));
pushVerts(params, LLVertexBuffer::MAP_VERTEX);
}
@@ -3570,22 +3625,22 @@ void renderShadowFrusta(LLDrawInfo* params)
if (gPipeline.mShadowCamera[4].AABBInFrustum(center, size))
{
- glColor3f(1,0,0);
+ gGL.diffuseColor3f(1,0,0);
pushVerts(params, LLVertexBuffer::MAP_VERTEX);
}
if (gPipeline.mShadowCamera[5].AABBInFrustum(center, size))
{
- glColor3f(0,1,0);
+ gGL.diffuseColor3f(0,1,0);
pushVerts(params, LLVertexBuffer::MAP_VERTEX);
}
if (gPipeline.mShadowCamera[6].AABBInFrustum(center, size))
{
- glColor3f(0,0,1);
+ gGL.diffuseColor3f(0,0,1);
pushVerts(params, LLVertexBuffer::MAP_VERTEX);
}
if (gPipeline.mShadowCamera[7].AABBInFrustum(center, size))
{
- glColor3f(1,0,1);
+ gGL.diffuseColor3f(1,0,1);
pushVerts(params, LLVertexBuffer::MAP_VERTEX);
}
@@ -3603,7 +3658,7 @@ void renderLights(LLDrawable* drawablep)
if (drawablep->getNumFaces())
{
LLGLEnable blend(GL_BLEND);
- glColor4f(0,1,1,0.5f);
+ gGL.diffuseColor4f(0,1,1,0.5f);
for (S32 i = 0; i < drawablep->getNumFaces(); i++)
{
@@ -3621,11 +3676,11 @@ void renderLights(LLDrawable* drawablep)
{
LLGLDepthTest depth(GL_FALSE, GL_TRUE);
- gGL.color4f(1,1,1,1);
+ gGL.diffuseColor4f(1,1,1,1);
drawBoxOutline(pos, size);
}
- gGL.color4f(1,1,0,1);
+ gGL.diffuseColor4f(1,1,0,1);
F32 rad = drawablep->getVOVolume()->getLightRadius();
drawBoxOutline(pos, LLVector4a(rad));
}
@@ -3650,13 +3705,13 @@ public:
if (branch->getData().empty())
{
- gGL.color3f(1.f,0.2f,0.f);
+ gGL.diffuseColor3f(1.f,0.2f,0.f);
center.set(branch->getCenter().getF32ptr());
size.set(branch->getSize().getF32ptr());
}
else
{
- gGL.color3f(0.75f, 1.f, 0.f);
+ gGL.diffuseColor3f(0.75f, 1.f, 0.f);
center.set(vl->mBounds[0].getF32ptr());
size.set(vl->mBounds[1].getF32ptr());
}
@@ -3669,11 +3724,11 @@ public:
if (i == 1)
{
- gGL.color4f(0,1,1,0.5f);
+ gGL.diffuseColor4f(0,1,1,0.5f);
}
else
{
- gGL.color4f(0,0.5f,0.5f, 0.25f);
+ gGL.diffuseColor4f(0,0.5f,0.5f, 0.25f);
drawBoxOutline(center, size);
}
@@ -3710,7 +3765,7 @@ void renderRaycast(LLDrawable* drawablep)
if (drawablep->getNumFaces())
{
LLGLEnable blend(GL_BLEND);
- gGL.color4f(0,1,1,0.5f);
+ gGL.diffuseColor4f(0,1,1,0.5f);
if (drawablep->getVOVolume())
{
@@ -3735,14 +3790,10 @@ void renderRaycast(LLDrawable* drawablep)
for (S32 i = 0; i < volume->getNumVolumeFaces(); ++i)
{
const LLVolumeFace& face = volume->getVolumeFace(i);
- if (!face.mOctree)
- {
- ((LLVolumeFace*) &face)->createOctree();
- }
-
+
gGL.pushMatrix();
- glTranslatef(trans.mV[0], trans.mV[1], trans.mV[2]);
- glMultMatrixf((F32*) vobj->getRelativeXform().mMatrix);
+ gGL.translatef(trans.mV[0], trans.mV[1], trans.mV[2]);
+ gGL.multMatrix((F32*) vobj->getRelativeXform().mMatrix);
LLVector3 start, end;
if (transform)
@@ -3762,21 +3813,32 @@ void renderRaycast(LLDrawable* drawablep)
LLVector4a dir;
dir.setSub(enda, starta);
- F32 t = 1.f;
-
- LLRenderOctreeRaycast render(starta, dir, &t);
gGL.flush();
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
{
//render face positions
LLVertexBuffer::unbind();
- glColor4f(0,1,1,0.5f);
+ gGL.diffuseColor4f(0,1,1,0.5f);
glVertexPointer(3, GL_FLOAT, sizeof(LLVector4a), face.mPositions);
+ gGL.syncMatrices();
glDrawElements(GL_TRIANGLES, face.mNumIndices, GL_UNSIGNED_SHORT, face.mIndices);
}
-
- render.traverse(face.mOctree);
+
+ if (!volume->isUnique())
+ {
+ F32 t = 1.f;
+
+ if (!face.mOctree)
+ {
+ ((LLVolumeFace*) &face)->createOctree();
+ }
+
+ LLRenderOctreeRaycast render(starta, dir, &t);
+
+ render.traverse(face.mOctree);
+ }
+
gGL.popMatrix();
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
}
@@ -3795,23 +3857,23 @@ void renderRaycast(LLDrawable* drawablep)
if (drawablep->getVObj() == gDebugRaycastObject)
{
// draw intersection point
- glPushMatrix();
- glLoadMatrixd(gGLModelView);
+ gGL.pushMatrix();
+ gGL.loadMatrix(gGLModelView);
LLVector3 translate = gDebugRaycastIntersection;
- glTranslatef(translate.mV[0], translate.mV[1], translate.mV[2]);
+ gGL.translatef(translate.mV[0], translate.mV[1], translate.mV[2]);
LLCoordFrame orient;
orient.lookDir(gDebugRaycastNormal, gDebugRaycastBinormal);
LLMatrix4 rotation;
orient.getRotMatrixToParent(rotation);
- glMultMatrixf((float*)rotation.mMatrix);
+ gGL.multMatrix((float*)rotation.mMatrix);
- gGL.color4f(1,0,0,0.5f);
+ gGL.diffuseColor4f(1,0,0,0.5f);
drawBox(LLVector3(0, 0, 0), LLVector3(0.1f, 0.022f, 0.022f));
- gGL.color4f(0,1,0,0.5f);
+ gGL.diffuseColor4f(0,1,0,0.5f);
drawBox(LLVector3(0, 0, 0), LLVector3(0.021f, 0.1f, 0.021f));
- gGL.color4f(0,0,1,0.5f);
+ gGL.diffuseColor4f(0,0,1,0.5f);
drawBox(LLVector3(0, 0, 0), LLVector3(0.02f, 0.02f, 0.1f));
- glPopMatrix();
+ gGL.popMatrix();
// draw bounding box of prim
const LLVector4a* ext = drawablep->getSpatialExtents();
@@ -3824,7 +3886,7 @@ void renderRaycast(LLDrawable* drawablep)
size.mul(0.5f);
LLGLDepthTest depth(GL_FALSE, GL_TRUE);
- gGL.color4f(0,0.5f,0.5f,1);
+ gGL.diffuseColor4f(0,0.5f,0.5f,1);
drawBoxOutline(pos, size);
}
}
@@ -3886,14 +3948,14 @@ public:
group->rebuildMesh();
gGL.flush();
- glPushMatrix();
+ gGL.pushMatrix();
gGLLastMatrix = NULL;
- glLoadMatrixd(gGLModelView);
+ gGL.loadMatrix(gGLModelView);
renderVisibility(group, mCamera);
stop_glerror();
gGLLastMatrix = NULL;
- glPopMatrix();
- gGL.color4f(1,1,1,1);
+ gGL.popMatrix();
+ gGL.diffuseColor4f(1,1,1,1);
}
}
}
@@ -3917,7 +3979,7 @@ public:
{
if (!group->getData().empty())
{
- gGL.color3f(0,0,1);
+ gGL.diffuseColor3f(0,0,1);
drawBoxOutline(group->mObjectBounds[0],
group->mObjectBounds[1]);
}
@@ -3926,7 +3988,7 @@ public:
for (LLSpatialGroup::OctreeNode::const_element_iter i = branch->getData().begin(); i != branch->getData().end(); ++i)
{
LLDrawable* drawable = *i;
-
+
if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_BBOXES))
{
renderBoundingBox(drawable);
@@ -3941,7 +4003,7 @@ public:
{
if (drawable->isState(LLDrawable::IN_REBUILD_Q2))
{
- gGL.color4f(0.6f, 0.6f, 0.1f, 1.f);
+ gGL.diffuseColor4f(0.6f, 0.6f, 0.1f, 1.f);
const LLVector4a* ext = drawable->getSpatialExtents();
LLVector4a center;
center.setAdd(ext[0], ext[1]);
@@ -4234,6 +4296,11 @@ void LLSpatialPartition::renderDebug()
return;
}
+ if (LLGLSLShader::sNoFixedFunction)
+ {
+ gDebugProgram.bind();
+ }
+
if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_TEXTURE_PRIORITY))
{
//sLastMaxTexPriority = lerp(sLastMaxTexPriority, sCurMaxTexPriority, gFrameIntervalSeconds);
@@ -4262,11 +4329,16 @@ void LLSpatialPartition::renderDebug()
LLOctreeRenderNonOccluded render_debug(camera);
render_debug.traverse(mOctree);
+
+ if (LLGLSLShader::sNoFixedFunction)
+ {
+ gDebugProgram.unbind();
+ }
}
void LLSpatialGroup::drawObjectBox(LLColor4 col)
{
- gGL.color4fv(col.mV);
+ gGL.diffuseColor4fv(col.mV);
LLVector4a size;
size = mObjectBounds[1];
size.mul(1.01f);
@@ -4371,7 +4443,7 @@ public:
LLVector3 local_start = mStart;
LLVector3 local_end = mEnd;
- if (!gPipeline.hasRenderType(drawable->getRenderType()) || !drawable->isVisible())
+ if (!drawable || !gPipeline.hasRenderType(drawable->getRenderType()) || !drawable->isVisible())
{
return false;
}
diff --git a/indra/newview/llspatialpartition.h b/indra/newview/llspatialpartition.h
index 11955540c6..6c14ecf452 100644
--- a/indra/newview/llspatialpartition.h
+++ b/indra/newview/llspatialpartition.h
@@ -93,7 +93,6 @@ public:
LLPointer<LLViewerTexture> mTexture;
std::vector<LLPointer<LLViewerTexture> > mTextureList;
- LLColor4U mGlowColor;
S32 mDebugColor;
const LLMatrix4* mTextureMatrix;
const LLMatrix4* mModelMatrix;
@@ -397,6 +396,8 @@ protected:
U32 mState;
U32 mOcclusionState[LLViewerCamera::NUM_CAMERAS];
+ U32 mOcclusionIssued[LLViewerCamera::NUM_CAMERAS];
+
S32 mLODHash;
static S32 sLODSeed;
@@ -404,6 +405,9 @@ public:
bridge_list_t mBridgeList;
buffer_map_t mBufferMap; //used by volume buffers to attempt to reuse vertex buffers
+ U32 mGeometryBytes; //used by volumes to track how many bytes of geometry data are in this node
+ F32 mSurfaceArea; //used by volumes to track estimated surface area of geometry in this node
+
F32 mBuilt;
OctreeNode* mOctreeNode;
LLSpatialPartition* mSpatialPartition;
@@ -473,8 +477,8 @@ public:
BOOL isVisible(const LLVector3& v);
bool isHUDPartition() ;
- virtual LLSpatialBridge* asBridge() { return NULL; }
- virtual BOOL isBridge() { return asBridge() != NULL; }
+ LLSpatialBridge* asBridge() { return mBridge; }
+ BOOL isBridge() { return asBridge() != NULL; }
void renderPhysicsShapes();
void renderDebug();
@@ -486,6 +490,9 @@ public:
public:
LLSpatialGroup::OctreeNode* mOctree;
+ LLSpatialBridge* mBridge; // NULL for non-LLSpatialBridge instances, otherwise, mBridge == this
+ // use a pointer instead of making "isBridge" and "asBridge" virtual so it's safe
+ // to call asBridge() from the destructor
BOOL mOcclusionEnabled; // if TRUE, occlusion culling is performed
BOOL mInfiniteFarClip; // if TRUE, frustum culling ignores far clip plane
U32 mBufferUsage;
@@ -510,8 +517,9 @@ public:
LLSpatialBridge(LLDrawable* root, BOOL render_by_group, U32 data_mask);
- virtual BOOL isSpatialBridge() const { return TRUE; }
+ void destroyTree();
+ virtual BOOL isSpatialBridge() const { return TRUE; }
virtual void updateSpatialExtents();
virtual void updateBinRadius();
virtual void setVisible(LLCamera& camera_in, std::vector<LLDrawable*>* results = NULL, BOOL for_select = FALSE);
@@ -522,11 +530,12 @@ public:
virtual void shiftPos(const LLVector4a& vec);
virtual void cleanupReferences();
virtual LLSpatialPartition* asPartition() { return this; }
- virtual LLSpatialBridge* asBridge() { return this; }
-
+
virtual LLCamera transformCamera(LLCamera& camera);
LLDrawable* mDrawable;
+ LLPointer<LLVOAvatar> mAvatar;
+
};
class LLCullResult
diff --git a/indra/newview/llspeakbutton.cpp b/indra/newview/llspeakbutton.cpp
deleted file mode 100644
index bbe573c546..0000000000
--- a/indra/newview/llspeakbutton.cpp
+++ /dev/null
@@ -1,165 +0,0 @@
-/**
-* @file llspeakbutton.cpp
-* @brief LLSpeakButton class implementation
-*
-* $LicenseInfo:firstyear=2002&license=viewerlgpl$
-* Second Life Viewer Source Code
-* Copyright (C) 2010, Linden Research, Inc.
-*
-* This library is free software; you can redistribute it and/or
-* modify it under the terms of the GNU Lesser General Public
-* License as published by the Free Software Foundation;
-* version 2.1 of the License only.
-*
-* This library is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-* Lesser General Public License for more details.
-*
-* You should have received a copy of the GNU Lesser General Public
-* License along with this library; if not, write to the Free Software
-* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-*
-* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
-* $/LicenseInfo$
-*/
-
-#include "llviewerprecompiledheaders.h" // must be first include
-
-#include "llbutton.h"
-#include "llfloaterreg.h"
-
-#include "llagent.h"
-#include "llbottomtray.h"
-#include "llcallfloater.h"
-#include "lloutputmonitorctrl.h"
-#include "lltransientfloatermgr.h"
-
-#include "llspeakbutton.h"
-
-#include "llbottomtray.h"
-#include "llfirstuse.h"
-
-static LLDefaultChildRegistry::Register<LLSpeakButton> t1("talk_button");
-
-//////////////////////////////////////////////////////////////////////////
-//////////////////////////////////////////////////////////////////////////
-//////////////////////////////////////////////////////////////////////////
-
-LLSpeakButton::Params::Params()
-: speak_button("speak_button"),
- show_button("show_button"),
- monitor("monitor")
-{}
-
-LLSpeakButton::LLSpeakButton(const Params& p)
-: LLUICtrl(p)
-, mOutputMonitor(NULL)
-, mSpeakBtn(NULL)
-, mShowBtn(NULL)
-{
- LLRect rect = p.rect();
- LLRect speak_rect(0, rect.getHeight(), rect.getWidth(), 0);
- LLRect show_rect = p.show_button.rect();
- show_rect.set(0, rect.getHeight(), show_rect.getWidth(), 0);
-
- speak_rect.mRight -= show_rect.getWidth();
- show_rect.mLeft = speak_rect.getWidth();
- show_rect.mRight = rect.getWidth();
-
- LLButton::Params speak_params = p.speak_button;
- speak_params.rect(speak_rect);
- mSpeakBtn = LLUICtrlFactory::create<LLButton>(speak_params);
- addChild(mSpeakBtn);
- LLTransientFloaterMgr::getInstance()->addControlView(mSpeakBtn);
-
- mSpeakBtn->setMouseDownCallback(boost::bind(&LLSpeakButton::onMouseDown_SpeakBtn, this));
- mSpeakBtn->setMouseUpCallback(boost::bind(&LLSpeakButton::onMouseUp_SpeakBtn, this));
- mSpeakBtn->setToggleState(FALSE);
-
- LLBottomtrayButton::Params show_params = p.show_button;
- show_params.rect(show_rect);
- mShowBtn = LLUICtrlFactory::create<LLBottomtrayButton>(show_params);
- addChild(mShowBtn);
- LLTransientFloaterMgr::getInstance()->addControlView(mShowBtn);
-
-// mShowBtn->setClickedCallback(boost::bind(&LLSpeakButton::onClick_ShowBtn, this));
-// mShowBtn->setToggleState(FALSE);
-
- static const S32 MONITOR_RIGHT_PAD = 2;
-
- LLRect monitor_rect = p.monitor.rect();
- S32 monitor_height = monitor_rect.getHeight();
- monitor_rect.mLeft = speak_rect.getWidth() - monitor_rect.getWidth() - MONITOR_RIGHT_PAD;
- monitor_rect.mRight = speak_rect.getWidth() - MONITOR_RIGHT_PAD;
- monitor_rect.mBottom = (rect.getHeight() / 2) - (monitor_height / 2);
- monitor_rect.mTop = monitor_rect.mBottom + monitor_height;
-
- LLOutputMonitorCtrl::Params monitor_params = p.monitor;
- monitor_params.draw_border(false);
- monitor_params.rect(monitor_rect);
- monitor_params.auto_update(true);
- monitor_params.speaker_id(gAgentID);
- mOutputMonitor = LLUICtrlFactory::create<LLOutputMonitorCtrl>(monitor_params);
- mSpeakBtn->addChild(mOutputMonitor);
-
- // never show "muted" because you can't mute yourself
- mOutputMonitor->setIsMuted(false);
- mOutputMonitor->setIsAgentControl(true);
-
- //*TODO find a better place to do that
- LLVoiceChannel::setCurrentVoiceChannelChangedCallback(boost::bind(&LLCallFloater::sOnCurrentChannelChanged, _1), true);
-}
-
-LLSpeakButton::~LLSpeakButton()
-{
- if(LLTransientFloaterMgr::instanceExists())
- {
- LLTransientFloaterMgr::getInstance()->removeControlView(mSpeakBtn);
- LLTransientFloaterMgr::getInstance()->removeControlView(mShowBtn);
- }
-}
-
-void LLSpeakButton::setSpeakToolTip(const std::string& msg)
-{
- mSpeakBtn->setToolTip(msg);
-}
-
-void LLSpeakButton::setShowToolTip(const std::string& msg)
-{
- mShowBtn->setToolTip(msg);
-}
-
-void LLSpeakButton::setLabelVisible(bool visible)
-{
- static std::string label_selected = mSpeakBtn->getLabelSelected();
- static std::string label_unselected = mSpeakBtn->getLabelUnselected();
-
- if (visible)
- {
- mSpeakBtn->setLabelSelected(label_selected);
- mSpeakBtn->setLabelUnselected(label_unselected);
- }
- else
- {
- static LLStringExplicit empty_string("");
- mSpeakBtn->setLabelSelected(empty_string);
- mSpeakBtn->setLabelUnselected(empty_string);
- }
-}
-
-//////////////////////////////////////////////////////////////////////////
-/// PROTECTED SECTION
-//////////////////////////////////////////////////////////////////////////
-void LLSpeakButton::onMouseDown_SpeakBtn()
-{
- bool down = true;
- LLVoiceClient::getInstance()->inputUserControlState(down); // this method knows/care about whether this translates into a toggle-to-talk or down-to-talk
- LLFirstUse::speak(false);
-}
-void LLSpeakButton::onMouseUp_SpeakBtn()
-{
- bool down = false;
- LLVoiceClient::getInstance()->inputUserControlState(down);
-}
-
diff --git a/indra/newview/llspeakbutton.h b/indra/newview/llspeakbutton.h
deleted file mode 100644
index 7db01112ef..0000000000
--- a/indra/newview/llspeakbutton.h
+++ /dev/null
@@ -1,88 +0,0 @@
-/**
-* @file llspeakbutton.h
-* @brief LLSpeakButton class header file
-*
-* $LicenseInfo:firstyear=2002&license=viewerlgpl$
-* Second Life Viewer Source Code
-* Copyright (C) 2010, Linden Research, Inc.
-*
-* This library is free software; you can redistribute it and/or
-* modify it under the terms of the GNU Lesser General Public
-* License as published by the Free Software Foundation;
-* version 2.1 of the License only.
-*
-* This library is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-* Lesser General Public License for more details.
-*
-* You should have received a copy of the GNU Lesser General Public
-* License along with this library; if not, write to the Free Software
-* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-*
-* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
-* $/LicenseInfo$
-*/
-
-#ifndef LL_LLSPEAKBUTTON_H
-#define LL_LLSPEAKBUTTON_H
-
-#include "llinitparam.h"
-#include "lluictrl.h"
-
-class LLCallFloater;
-class LLButton;
-class LLOutputMonitorCtrl;
-class LLBottomtrayButton;
-
-/*
- * Button displaying voice chat status. Displays voice chat options when
- * clicked.
-*/
-class LLSpeakButton : public LLUICtrl
-{
-public:
-
- struct Params : public LLInitParam::Block<Params, LLUICtrl::Params>
- {
- Optional<LLButton::Params> speak_button;
- Optional<LLBottomtrayButton::Params> show_button;
- Optional<LLOutputMonitorCtrl::Params> monitor;
-
- Params();
- };
-
- /*virtual*/ ~LLSpeakButton();
-
- // *HACK: Need to put tooltips in a translatable location,
- // the panel that contains this button.
- void setSpeakToolTip(const std::string& msg);
- void setShowToolTip(const std::string& msg);
-
- /**
- * Sets visibility of speak button's label according to passed parameter.
- *
- * It removes label/selected label if "visible" is false and restores otherwise.
- *
- * @param visible if true - show label and selected label.
- *
- * @see mSpeakBtn
- * @see LLBottomTray::processShrinkButtons()
- */
- void setLabelVisible(bool visible);
-
-protected:
- friend class LLUICtrlFactory;
- LLSpeakButton(const Params& p);
-
- void onMouseDown_SpeakBtn();
- void onMouseUp_SpeakBtn();
-
-private:
- LLButton* mSpeakBtn;
- LLBottomtrayButton* mShowBtn;
- LLHandle<LLFloater> mPrivateCallPanel;
- LLOutputMonitorCtrl* mOutputMonitor;
-};
-
-#endif // LL_LLSPEAKBUTTON_H
diff --git a/indra/newview/llsprite.cpp b/indra/newview/llsprite.cpp
index 4bde2dfcab..c3eb70f850 100644
--- a/indra/newview/llsprite.cpp
+++ b/indra/newview/llsprite.cpp
@@ -243,7 +243,7 @@ void LLSprite::updateFace(LLFace &face)
*indicesp++ = 3 + index_offset;
}
- face.getVertexBuffer()->setBuffer(0);
+ face.getVertexBuffer()->flush();
face.mCenterAgent = mPosition;
}
diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp
index 749acea6c1..3923b4510a 100644
--- a/indra/newview/llstartup.cpp
+++ b/indra/newview/llstartup.cpp
@@ -131,7 +131,6 @@
#include "llsecondlifeurls.h"
#include "llselectmgr.h"
#include "llsky.h"
-#include "llsidetray.h"
#include "llstatview.h"
#include "llstatusbar.h" // sendMoneyBalanceRequest(), owns L$ balance
#include "llsurface.h"
@@ -191,6 +190,7 @@
#include "lllogin.h"
#include "llevents.h"
#include "llstartuplistener.h"
+#include "lltoolbarview.h"
#if LL_WINDOWS
#include "lldxhardware.h"
@@ -367,7 +367,9 @@ bool idle_startup()
//
// Initialize stuff that doesn't need data from simulators
//
-
+ std::string lastGPU = gSavedSettings.getString("LastGPUString");
+ std::string thisGPU = LLFeatureManager::getInstance()->getGPUString();
+
if (LLFeatureManager::getInstance()->isSafe())
{
LLNotificationsUtil::add("DisplaySetToSafe");
@@ -375,12 +377,14 @@ bool idle_startup()
else if ((gSavedSettings.getS32("LastFeatureVersion") < LLFeatureManager::getInstance()->getVersion()) &&
(gSavedSettings.getS32("LastFeatureVersion") != 0))
{
- LLNotificationsUtil::add("DisplaySetToRecommended");
+ LLNotificationsUtil::add("DisplaySetToRecommendedFeatureChange");
}
- else if ((gSavedSettings.getS32("LastGPUClass") != LLFeatureManager::getInstance()->getGPUClass()) &&
- (gSavedSettings.getS32("LastGPUClass") != -1))
+ else if ( ! lastGPU.empty() && (lastGPU != thisGPU))
{
- LLNotificationsUtil::add("DisplaySetToRecommended");
+ LLSD subs;
+ subs["LAST_GPU"] = lastGPU;
+ subs["THIS_GPU"] = thisGPU;
+ LLNotificationsUtil::add("DisplaySetToRecommendedGPUChange", subs);
}
else if (!gViewerWindow->getInitAlert().empty())
{
@@ -396,7 +400,7 @@ bool idle_startup()
LLStartUp::startLLProxy();
gSavedSettings.setS32("LastFeatureVersion", LLFeatureManager::getInstance()->getVersion());
- gSavedSettings.setS32("LastGPUClass", LLFeatureManager::getInstance()->getGPUClass());
+ gSavedSettings.setString("LastGPUString", thisGPU);
// load dynamic GPU/feature tables from website (S3)
LLFeatureManager::getInstance()->fetchHTTPTables();
@@ -733,8 +737,11 @@ bool idle_startup()
// this startup phase more than once.
if (gLoginMenuBarView == NULL)
{
- initialize_edit_menu();
+ display_startup();
+ initialize_edit_menu();
+ display_startup();
init_menus();
+ display_startup();
}
if (show_connect_box)
@@ -743,23 +750,28 @@ bool idle_startup()
// NOTE: Hits "Attempted getFields with no login view shown" warning, since we don't
// show the login view until login_show() is called below.
if (gUserCredential.isNull())
- {
+ {
+ display_startup();
gUserCredential = gLoginHandler.initializeLoginInfo();
+ display_startup();
}
if (gHeadlessClient)
{
LL_WARNS("AppInit") << "Waiting at connection box in headless client. Did you mean to add autologin params?" << LL_ENDL;
}
// Make sure the process dialog doesn't hide things
+ display_startup();
gViewerWindow->setShowProgress(FALSE);
-
+ display_startup();
// Show the login dialog
login_show();
+ display_startup();
// connect dialog is already shown, so fill in the names
if (gUserCredential.notNull())
{
LLPanelLogin::setFields( gUserCredential, gRememberPassword);
}
+ display_startup();
LLPanelLogin::giveFocus();
LLStartUp::setStartupState( STATE_LOGIN_WAIT ); // Wait for user input
@@ -770,14 +782,19 @@ bool idle_startup()
LLStartUp::setStartupState( STATE_LOGIN_CLEANUP );
}
+ display_startup();
gViewerWindow->setNormalControlsVisible( FALSE );
+ display_startup();
gLoginMenuBarView->setVisible( TRUE );
+ display_startup();
gLoginMenuBarView->setEnabled( TRUE );
+ display_startup();
show_debug_menus();
+ display_startup();
// Hide the splash screen
LLSplashScreen::hide();
-
+ display_startup();
// Push our window frontmost
gViewerWindow->getWindow()->show();
display_startup();
@@ -786,7 +803,9 @@ bool idle_startup()
// first made visible.
#ifdef _WIN32
MSG msg;
- while( PeekMessage( &msg, /*All hWnds owned by this thread */ NULL, WM_KEYFIRST, WM_KEYLAST, PM_REMOVE ) );
+ while( PeekMessage( &msg, /*All hWnds owned by this thread */ NULL, WM_KEYFIRST, WM_KEYLAST, PM_REMOVE ) )
+ { }
+ display_startup();
#endif
timeout.reset();
return FALSE;
@@ -801,7 +820,7 @@ bool idle_startup()
// Don't do anything. Wait for the login view to call the login_callback,
// which will push us to the next state.
-
+ display_startup();
// Sleep so we don't spin the CPU
ms_sleep(1);
return FALSE;
@@ -1169,37 +1188,51 @@ bool idle_startup()
// Finish agent initialization. (Requires gSavedSettings, builds camera)
gAgent.init();
+ display_startup();
gAgentCamera.init();
+ display_startup();
set_underclothes_menu_options();
+ display_startup();
// Since we connected, save off the settings so the user doesn't have to
// type the name/password again if we crash.
gSavedSettings.saveToFile(gSavedSettings.getString("ClientSettingsFile"), TRUE);
LLUIColorTable::instance().saveUserSettings();
+ display_startup();
+
//
// Initialize classes w/graphics stuff.
//
gTextureList.doPrefetchImages();
+ display_startup();
+
LLSurface::initClasses();
+ display_startup();
+
LLFace::initClass();
+ display_startup();
LLDrawable::initClass();
+ display_startup();
// init the shader managers
LLPostProcess::initClass();
+ display_startup();
LLViewerObject::initVOClasses();
+ display_startup();
// Initialize all our tools. Must be done after saved settings loaded.
// NOTE: This also is where gToolMgr used to be instantiated before being turned into a singleton.
LLToolMgr::getInstance()->initTools();
+ display_startup();
// Pre-load floaters, like the world map, that are slow to spawn
// due to XML complexity.
gViewerWindow->initWorldUI();
-
+
display_startup();
// This is where we used to initialize gWorldp. Original comment said:
@@ -1207,24 +1240,26 @@ bool idle_startup()
// User might have overridden far clip
LLWorld::getInstance()->setLandFarClip(gAgentCamera.mDrawDistance);
-
+ display_startup();
// Before we create the first region, we need to set the agent's mOriginGlobal
// This is necessary because creating objects before this is set will result in a
// bad mPositionAgent cache.
gAgent.initOriginGlobal(from_region_handle(gFirstSimHandle));
+ display_startup();
LLWorld::getInstance()->addRegion(gFirstSimHandle, gFirstSim);
+ display_startup();
LLViewerRegion *regionp = LLWorld::getInstance()->getRegionFromHandle(gFirstSimHandle);
LL_INFOS("AppInit") << "Adding initial simulator " << regionp->getOriginGlobal() << LL_ENDL;
regionp->setSeedCapability(gFirstSimSeedCap);
LL_DEBUGS("AppInit") << "Waiting for seed grant ...." << LL_ENDL;
-
+ display_startup();
// Set agent's initial region to be the one we just created.
gAgent.setRegion(regionp);
-
+ display_startup();
// Set agent's initial position, which will be read by LLVOAvatar when the avatar
// object is created. I think this must be done after setting the region. JC
gAgent.setPositionAgent(agent_start_position_region);
@@ -1244,6 +1279,7 @@ bool idle_startup()
{
LLStartUp::multimediaInit();
LLStartUp::setStartupState( STATE_FONT_INIT );
+ display_startup();
return FALSE;
}
@@ -1252,6 +1288,7 @@ bool idle_startup()
{
LLStartUp::fontInit();
LLStartUp::setStartupState( STATE_SEED_GRANTED_WAIT );
+ display_startup();
return FALSE;
}
@@ -1279,6 +1316,7 @@ bool idle_startup()
set_startup_status(0.4f, LLTrans::getString("LoginRequestSeedCapGrant"), gAgent.mMOTD);
}
}
+ display_startup();
return FALSE;
}
@@ -1289,7 +1327,9 @@ bool idle_startup()
//---------------------------------------------------------------------
if (STATE_SEED_CAP_GRANTED == LLStartUp::getStartupState())
{
+ display_startup();
update_texture_fetch();
+ display_startup();
if ( gViewerWindow != NULL)
{ // This isn't the first logon attempt, so show the UI
@@ -1297,12 +1337,15 @@ bool idle_startup()
}
gLoginMenuBarView->setVisible( FALSE );
gLoginMenuBarView->setEnabled( FALSE );
+ display_startup();
// direct logging to the debug console's line buffer
LLError::logToFixedBuffer(gDebugView->mDebugConsolep);
+ display_startup();
// set initial visibility of debug console
gDebugView->mDebugConsolep->setVisible(gSavedSettings.getBOOL("ShowDebugConsole"));
+ display_startup();
//
// Set message handlers
@@ -1311,22 +1354,28 @@ bool idle_startup()
// register callbacks for messages. . . do this after initial handshake to make sure that we don't catch any unwanted
register_viewer_callbacks(gMessageSystem);
+ display_startup();
// Debugging info parameters
gMessageSystem->setMaxMessageTime( 0.5f ); // Spam if decoding all msgs takes more than 500 ms
+ display_startup();
#ifndef LL_RELEASE_FOR_DOWNLOAD
gMessageSystem->setTimeDecodes( TRUE ); // Time the decode of each msg
gMessageSystem->setTimeDecodesSpamThreshold( 0.05f ); // Spam if a single msg takes over 50ms to decode
#endif
+ display_startup();
gXferManager->registerCallbacks(gMessageSystem);
+ display_startup();
LLStartUp::initNameCache();
+ display_startup();
// update the voice settings *after* gCacheName initialization
// so that we can construct voice UI that relies on the name cache
LLVoiceClient::getInstance()->updateSettings();
+ display_startup();
//gCacheName is required for nearby chat history loading
//so I just moved nearby history loading a few states further
@@ -1335,12 +1384,14 @@ bool idle_startup()
LLNearbyChat* nearby_chat = LLNearbyChat::getInstance();
if (nearby_chat) nearby_chat->loadHistory();
}
+ display_startup();
// *Note: this is where gWorldMap used to be initialized.
// register null callbacks for audio until the audio system is initialized
gMessageSystem->setHandlerFuncFast(_PREHASH_SoundTrigger, null_message_callback, NULL);
gMessageSystem->setHandlerFuncFast(_PREHASH_AttachedSound, null_message_callback, NULL);
+ display_startup();
//reset statistics
LLViewerStats::getInstance()->resetStats();
@@ -1370,6 +1421,7 @@ bool idle_startup()
LLViewerCamera::getInstance()->setAspect(gViewerWindow->getWorldViewAspectRatio());
// Initialize FOV
LLViewerCamera::getInstance()->setDefaultFOV(gSavedSettings.getF32("CameraAngle"));
+ display_startup();
// Move agent to starting location. The position handed to us by
// the space server is in global coordinates, but the agent frame
@@ -1380,6 +1432,7 @@ bool idle_startup()
gAgent.resetAxes(gAgentStartLookAt);
gAgentCamera.stopCameraAnimation();
gAgentCamera.resetCamera();
+ display_startup();
// Initialize global class data needed for surfaces (i.e. textures)
LL_DEBUGS("AppInit") << "Initializing sky..." << LL_ENDL;
@@ -1392,6 +1445,8 @@ bool idle_startup()
LLGLState::checkStates();
LLGLState::checkTextureChannels();
+ display_startup();
+
LL_DEBUGS("AppInit") << "Decoding images..." << LL_ENDL;
// For all images pre-loaded into viewer cache, decode them.
// Need to do this AFTER we init the sky
@@ -1405,6 +1460,8 @@ bool idle_startup()
}
LLStartUp::setStartupState( STATE_WORLD_WAIT );
+ display_startup();
+
// JC - Do this as late as possible to increase likelihood Purify
// will run.
LLMessageSystem* msg = gMessageSystem;
@@ -1432,6 +1489,7 @@ bool idle_startup()
NULL);
timeout.reset();
+ display_startup();
return FALSE;
}
@@ -1450,8 +1508,10 @@ bool idle_startup()
LLMessageSystem* msg = gMessageSystem;
while (msg->checkAllMessages(gFrameCount, gServicePump))
{
+ display_startup();
}
msg->processAcks();
+ display_startup();
return FALSE;
}
@@ -1462,6 +1522,7 @@ bool idle_startup()
{
LL_DEBUGS("AppInit") << "Connecting to region..." << LL_ENDL;
set_startup_status(0.60f, LLTrans::getString("LoginConnectingToRegion"), gAgent.mMOTD);
+ display_startup();
// register with the message system so it knows we're
// expecting this message
LLMessageSystem* msg = gMessageSystem;
@@ -1477,6 +1538,7 @@ bool idle_startup()
msg->newMessageFast(_PREHASH_EconomyDataRequest);
gAgent.sendReliableMessage();
}
+ display_startup();
// Create login effect
// But not on first login, because you can't see your avatar then
@@ -1491,6 +1553,7 @@ bool idle_startup()
LLStartUp::setStartupState( STATE_AGENT_WAIT ); // Go to STATE_AGENT_WAIT
timeout.reset();
+ display_startup();
return FALSE;
}
@@ -1515,14 +1578,17 @@ bool idle_startup()
LL_DEBUGS("AppInit") << "Awaiting AvatarInitComplete, got "
<< msg->getMessageName() << LL_ENDL;
}
+ display_startup();
}
msg->processAcks();
+ display_startup();
+
if (gAgentMovementCompleted)
{
LLStartUp::setStartupState( STATE_INVENTORY_SEND );
}
-
+ display_startup();
return FALSE;
}
@@ -1531,9 +1597,10 @@ bool idle_startup()
//---------------------------------------------------------------------
if (STATE_INVENTORY_SEND == LLStartUp::getStartupState())
{
+ display_startup();
// Inform simulator of our language preference
LLAgentLanguage::update();
-
+ display_startup();
// unpack thin inventory
LLSD response = LLLoginInstance::getInstance()->getResponse();
//bool dump_buffer = false;
@@ -1548,6 +1615,7 @@ bool idle_startup()
gInventory.setLibraryRootFolderID(id.asUUID());
}
}
+ display_startup();
LLSD inv_lib_owner = response["inventory-lib-owner"];
if(inv_lib_owner.isDefined())
@@ -1559,6 +1627,7 @@ bool idle_startup()
gInventory.setLibraryOwnerID( LLUUID(id.asUUID()));
}
}
+ display_startup();
LLSD inv_skel_lib = response["inventory-skel-lib"];
if(inv_skel_lib.isDefined() && gInventory.getLibraryOwnerID().notNull())
@@ -1568,6 +1637,7 @@ bool idle_startup()
LL_WARNS("AppInit") << "Problem loading inventory-skel-lib" << LL_ENDL;
}
}
+ display_startup();
LLSD inv_skeleton = response["inventory-skeleton"];
if(inv_skeleton.isDefined())
@@ -1577,6 +1647,7 @@ bool idle_startup()
LL_WARNS("AppInit") << "Problem loading inventory-skel-targets" << LL_ENDL;
}
}
+ display_startup();
LLSD inv_basic = response["inventory-basic"];
if(inv_basic.isDefined())
@@ -1614,6 +1685,7 @@ bool idle_startup()
list[agent_id] = new LLRelationship(given_rights, has_rights, false);
}
LLAvatarTracker::instance().addBuddyList(list);
+ display_startup();
}
bool show_hud = false;
@@ -1641,6 +1713,8 @@ bool idle_startup()
//}
}
}
+ display_startup();
+
// Either we want to show tutorial because this is the first login
// to a Linden Help Island or the user quit with the tutorial
// visible. JC
@@ -1648,22 +1722,26 @@ bool idle_startup()
{
LLFloaterReg::showInstance("hud", LLSD(), FALSE);
}
+ display_startup();
LLSD event_notifications = response["event_notifications"];
if(event_notifications.isDefined())
{
gEventNotifier.load(event_notifications);
}
+ display_startup();
LLSD classified_categories = response["classified_categories"];
if(classified_categories.isDefined())
{
LLClassifiedInfo::loadCategories(classified_categories);
}
+ display_startup();
// This method MUST be called before gInventory.findCategoryUUIDForType because of
// gInventory.mIsAgentInvUsable is set to true in the gInventory.buildParentChildMap.
gInventory.buildParentChildMap();
+ display_startup();
//all categories loaded. lets create "My Favorites" category
gInventory.findCategoryUUIDForType(LLFolderType::FT_FAVORITE,true);
@@ -1677,24 +1755,26 @@ bool idle_startup()
LLAvatarTracker::instance().registerCallbacks(msg);
llinfos << " Landmark" << llendl;
LLLandmark::registerCallbacks(msg);
+ display_startup();
// request mute list
llinfos << "Requesting Mute List" << llendl;
LLMuteList::getInstance()->requestFromServer(gAgent.getID());
-
+ display_startup();
// Get L$ and ownership credit information
llinfos << "Requesting Money Balance" << llendl;
LLStatusBar::sendMoneyBalanceRequest();
-
+ display_startup();
// request all group information
llinfos << "Requesting Agent Data" << llendl;
gAgent.sendAgentDataUpdateRequest();
-
+ display_startup();
// Create the inventory views
llinfos << "Creating Inventory Views" << llendl;
LLFloaterReg::getInstance("inventory");
-
+ display_startup();
LLStartUp::setStartupState( STATE_MISC );
+ display_startup();
return FALSE;
}
@@ -1743,17 +1823,23 @@ bool idle_startup()
gSavedSettings.setBOOL("ShowStartLocation", TRUE);
}
+ display_startup();
+
if (gSavedSettings.getBOOL("HelpFloaterOpen"))
{
// show default topic
LLViewerHelp::instance().showTopic("");
}
+ display_startup();
+
// We're successfully logged in.
gSavedSettings.setBOOL("FirstLoginThisInstall", FALSE);
LLFloaterReg::showInitialVisibleInstances();
+ display_startup();
+
// based on the comments, we've successfully logged in so we can delete the 'forced'
// URL that the updater set in settings.ini (in a mostly paranoid fashion)
std::string nextLoginLocation = gSavedSettings.getString( "NextLoginLocation" );
@@ -1767,8 +1853,10 @@ bool idle_startup()
LLUIColorTable::instance().saveUserSettings();
};
+ display_startup();
// JC: Initializing audio requests many sounds for download.
init_audio();
+ display_startup();
// JC: Initialize "active" gestures. This may also trigger
// many gesture downloads, if this is the user's first
@@ -1806,6 +1894,7 @@ bool idle_startup()
LLGestureMgr::instance().startFetch();
}
gDisplaySwapBuffers = TRUE;
+ display_startup();
LLMessageSystem* msg = gMessageSystem;
msg->setHandlerFuncFast(_PREHASH_SoundTrigger, process_sound_trigger);
@@ -1880,8 +1969,10 @@ bool idle_startup()
}
}
+ display_startup();
//DEV-17797. get null folder. Any items found here moved to Lost and Found
LLInventoryModelBackgroundFetch::instance().findLostItems();
+ display_startup();
LLStartUp::setStartupState( STATE_PRECACHE );
timeout.reset();
@@ -1890,6 +1981,7 @@ bool idle_startup()
if (STATE_PRECACHE == LLStartUp::getStartupState())
{
+ display_startup();
F32 timeout_frac = timeout.getElapsedTimeF32()/PRECACHING_DELAY;
// We now have an inventory skeleton, so if this is a user's first
@@ -1906,6 +1998,8 @@ bool idle_startup()
LLStartUp::loadInitialOutfit( sInitialOutfit, sInitialOutfitGender );
}
+ display_startup();
+
// wait precache-delay and for agent's avatar or a lot longer.
if(((timeout_frac > 1.f) && isAgentAvatarValid())
|| (timeout_frac > 3.f))
@@ -1919,11 +2013,6 @@ bool idle_startup()
LLTrans::getString("LoginPrecaching"),
gAgent.mMOTD);
display_startup();
- if (!LLViewerShaderMgr::sInitialized)
- {
- LLViewerShaderMgr::sInitialized = TRUE;
- LLViewerShaderMgr::instance()->setShaders();
- }
}
return TRUE;
@@ -1936,7 +2025,7 @@ bool idle_startup()
const F32 wearables_time = wearables_timer.getElapsedTimeF32();
const F32 MAX_WEARABLES_TIME = 10.f;
- if (!gAgent.isGenderChosen())
+ if (!gAgent.isGenderChosen() && isAgentAvatarValid())
{
// No point in waiting for clothing, we don't even
// know what gender we are. Pop a dialog to ask and
@@ -1952,6 +2041,8 @@ bool idle_startup()
return TRUE;
}
+ display_startup();
+
if (wearables_time > MAX_WEARABLES_TIME)
{
LLNotificationsUtil::add("ClothingLoading");
@@ -1983,16 +2074,20 @@ bool idle_startup()
}
}
+ display_startup();
update_texture_fetch();
+ display_startup();
set_startup_status(0.9f + 0.1f * wearables_time / MAX_WEARABLES_TIME,
LLTrans::getString("LoginDownloadingClothing").c_str(),
gAgent.mMOTD.c_str());
+ display_startup();
return TRUE;
}
if (STATE_CLEANUP == LLStartUp::getStartupState())
{
set_startup_status(1.0, "", "");
+ display_startup();
// Let the map know about the inventory.
LLFloaterWorldMap* floater_world_map = LLFloaterWorldMap::getInstance();
@@ -2008,6 +2103,7 @@ bool idle_startup()
//gViewerWindow->revealIntroPanel();
gViewerWindow->setStartupComplete();
gViewerWindow->setProgressCancelButtonVisible(FALSE);
+ display_startup();
// We're not away from keyboard, even though login might have taken
// a while. JC
@@ -2030,7 +2126,7 @@ bool idle_startup()
show_debug_menus(); // Debug menu visiblity and First Use trigger
// If we've got a startup URL, dispatch it
- LLStartUp::dispatchURL();
+ //LLStartUp::dispatchURL();
// Retrieve information about the land data
// (just accessing this the first time will fetch it,
@@ -2043,6 +2139,7 @@ bool idle_startup()
// LLUserAuth::getInstance()->reset();
LLStartUp::setStartupState( STATE_STARTED );
+ display_startup();
// Unmute audio if desired and setup volumes.
// Unmute audio if desired and setup volumes.
@@ -2067,6 +2164,7 @@ bool idle_startup()
LLAgentPicksInfo::getInstance()->requestNumberOfPicks();
LLIMFloater::initIMFloater();
+ display_startup();
return TRUE;
}
@@ -2088,7 +2186,12 @@ void login_show()
#else
BOOL bUseDebugLogin = TRUE;
#endif
-
+ // Hide the toolbars: may happen to come back here if login fails after login agent but before login in region
+ if (gToolBarView)
+ {
+ gToolBarView->setVisible(FALSE);
+ }
+
LLPanelLogin::show( gViewerWindow->getWindowRectScaled(),
bUseDebugLogin || gSavedSettings.getBOOL("SecondLifeEnterprise"),
login_callback, NULL );
@@ -2387,13 +2490,6 @@ void asset_callback_nothing(LLVFS*, const LLUUID&, LLAssetType::EType, void*, S3
// nothing
}
-// *HACK: Must match name in Library or agent inventory
-const std::string ROOT_GESTURES_FOLDER = "Gestures";
-const std::string COMMON_GESTURES_FOLDER = "Common Gestures";
-const std::string MALE_GESTURES_FOLDER = "Male Gestures";
-const std::string FEMALE_GESTURES_FOLDER = "Female Gestures";
-const std::string SPEECH_GESTURES_FOLDER = "Speech Gestures";
-const std::string OTHER_GESTURES_FOLDER = "Other Gestures";
const S32 OPT_CLOSED_WINDOW = -1;
const S32 OPT_MALE = 0;
const S32 OPT_FEMALE = 1;
@@ -2422,84 +2518,36 @@ bool callback_choose_gender(const LLSD& notification, const LLSD& response)
return false;
}
-void LLStartUp::copyLibraryGestures(const std::string& same_gender_gestures)
-{
- llinfos << "Copying library gestures" << llendl;
-
- // Copy gestures
- LLUUID lib_gesture_cat_id =
- gInventory.findCategoryUUIDForType(LLFolderType::FT_GESTURE,false,true);
- if (lib_gesture_cat_id.isNull())
- {
- llwarns << "Unable to copy gestures, source category not found" << llendl;
- }
- LLUUID dst_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_GESTURE);
-
- std::vector<std::string> gesture_folders_to_copy;
- gesture_folders_to_copy.push_back(MALE_GESTURES_FOLDER);
- gesture_folders_to_copy.push_back(FEMALE_GESTURES_FOLDER);
- gesture_folders_to_copy.push_back(COMMON_GESTURES_FOLDER);
- gesture_folders_to_copy.push_back(SPEECH_GESTURES_FOLDER);
- gesture_folders_to_copy.push_back(OTHER_GESTURES_FOLDER);
-
- for(std::vector<std::string>::iterator it = gesture_folders_to_copy.begin();
- it != gesture_folders_to_copy.end();
- ++it)
- {
- std::string& folder_name = *it;
-
- LLPointer<LLInventoryCallback> cb(NULL);
-
- if (folder_name == same_gender_gestures ||
- folder_name == COMMON_GESTURES_FOLDER ||
- folder_name == OTHER_GESTURES_FOLDER)
- {
- cb = new ActivateGestureCallback;
- }
-
-
- LLUUID cat_id = findDescendentCategoryIDByName(lib_gesture_cat_id,folder_name);
- if (cat_id.isNull())
- {
- llwarns << "failed to find gesture folder for " << folder_name << llendl;
- }
- else
- {
- llinfos << "initiating fetch and copy for " << folder_name << " cat_id " << cat_id << llendl;
- LLAppearanceMgr* app_mgr = LLAppearanceMgr::getInstance();
- callAfterCategoryFetch(cat_id,
- boost::bind(&LLAppearanceMgr::shallowCopyCategory,
- app_mgr,
- cat_id,
- dst_id,
- cb));
- }
- }
-}
-
void LLStartUp::loadInitialOutfit( const std::string& outfit_folder_name,
const std::string& gender_name )
{
- llinfos << "starting" << llendl;
+ lldebugs << "starting" << llendl;
// Not going through the processAgentInitialWearables path, so need to set this here.
LLAppearanceMgr::instance().setAttachmentInvLinkEnable(true);
// Initiate creation of COF, since we're also bypassing that.
gInventory.findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT);
- S32 gender = 0;
- std::string same_gender_gestures;
+ ESex gender;
if (gender_name == "male")
{
- gender = OPT_MALE;
- same_gender_gestures = MALE_GESTURES_FOLDER;
+ lldebugs << "male" << llendl;
+ gender = SEX_MALE;
}
else
{
- gender = OPT_FEMALE;
- same_gender_gestures = FEMALE_GESTURES_FOLDER;
+ lldebugs << "female" << llendl;
+ gender = SEX_FEMALE;
}
+ if (!isAgentAvatarValid())
+ {
+ llwarns << "Trying to load an initial outfit for an invalid agent avatar" << llendl;
+ return;
+ }
+
+ gAgentAvatarp->setSex(gender);
+
// try to find the outfit - if not there, create some default
// wearables.
LLUUID cat_id = findDescendentCategoryIDByName(
@@ -2507,7 +2555,8 @@ void LLStartUp::loadInitialOutfit( const std::string& outfit_folder_name,
outfit_folder_name);
if (cat_id.isNull())
{
- gAgentWearables.createStandardWearables(gender);
+ lldebugs << "standard wearables" << llendl;
+ gAgentWearables.createStandardWearables();
}
else
{
@@ -2517,26 +2566,28 @@ void LLStartUp::loadInitialOutfit( const std::string& outfit_folder_name,
bool do_append = false;
LLViewerInventoryCategory *cat = gInventory.getCategory(cat_id);
LLAppearanceMgr::instance().wearInventoryCategory(cat, do_copy, do_append);
+ lldebugs << "initial outfit category id: " << cat_id << llendl;
}
- // Copy gestures
- copyLibraryGestures(same_gender_gestures);
-
// This is really misnamed -- it means we have started loading
// an outfit/shape that will give the avatar a gender eventually. JC
gAgent.setGenderChosen(TRUE);
-
}
//static
void LLStartUp::saveInitialOutfit()
{
- if (sInitialOutfit.empty()) return;
+ if (sInitialOutfit.empty()) {
+ lldebugs << "sInitialOutfit is empty" << llendl;
+ return;
+ }
if (sWearablesLoadedCon.connected())
{
+ lldebugs << "sWearablesLoadedCon is connected, disconnecting" << llendl;
sWearablesLoadedCon.disconnect();
}
+ lldebugs << "calling makeNewOutfitLinks( \"" << sInitialOutfit << "\" )" << llendl;
LLAppearanceMgr::getInstance()->makeNewOutfitLinks(sInitialOutfit,false);
}
@@ -2743,12 +2794,12 @@ void LLStartUp::cleanupNameCache()
bool LLStartUp::dispatchURL()
{
// ok, if we've gotten this far and have a startup URL
- if (!getStartSLURL().isValid())
+ if (!getStartSLURL().isValid())
{
return false;
}
- if(getStartSLURL().getType() != LLSLURL::APP)
- {
+ if(getStartSLURL().getType() != LLSLURL::APP)
+ {
// If we started with a location, but we're already
// at that location, don't pop dialogs open.
@@ -3340,8 +3391,6 @@ bool process_login_success_response()
}
// Initial outfit for the user.
- // QUESTION: Why can't we simply simply set the users outfit directly
- // from a web page into the user info on the server? - Roxie
LLSD initial_outfit = response["initial-outfit"][0];
if(initial_outfit.size())
{
diff --git a/indra/newview/llstartup.h b/indra/newview/llstartup.h
index 99a644eb9c..0a18ef1b2d 100644
--- a/indra/newview/llstartup.h
+++ b/indra/newview/llstartup.h
@@ -90,8 +90,6 @@ public:
static void initNameCache();
- static void copyLibraryGestures(const std::string& same_gender_gestures);
-
static void cleanupNameCache();
// outfit_folder_name can be a folder anywhere in your inventory,
diff --git a/indra/newview/llstatusbar.cpp b/indra/newview/llstatusbar.cpp
index 0a00885843..89240c982f 100644
--- a/indra/newview/llstatusbar.cpp
+++ b/indra/newview/llstatusbar.cpp
@@ -114,6 +114,7 @@ LLStatusBar::LLStatusBar(const LLRect& rect)
mTextTime(NULL),
mSGBandwidth(NULL),
mSGPacketLoss(NULL),
+ mBtnStats(NULL),
mBtnVolume(NULL),
mBoxBalance(NULL),
mBalance(0),
@@ -162,8 +163,6 @@ BOOL LLStatusBar::handleRightMouseDown(S32 x, S32 y, MASK mask)
BOOL LLStatusBar::postBuild()
{
- LLControlVariablePtr mode_control = gSavedSettings.getControl("SessionSettingsFile");
-
gMenuBarView->setRightMouseDownCallback(boost::bind(&show_navbar_context_menu, _1, _2, _3));
mTextTime = getChild<LLTextBox>("TimeText" );
@@ -171,8 +170,12 @@ BOOL LLStatusBar::postBuild()
getChild<LLUICtrl>("buyL")->setCommitCallback(
boost::bind(&LLStatusBar::onClickBuyCurrency, this));
+ getChild<LLUICtrl>("goShop")->setCommitCallback(boost::bind(&LLWeb::loadURLExternal, gSavedSettings.getString("MarketplaceURL")));
+
mBoxBalance = getChild<LLTextBox>("balance");
mBoxBalance->setClickedCallback( &LLStatusBar::onClickBalance, this );
+
+ mBtnStats = getChildView("stat_btn");
mBtnVolume = getChild<LLButton>( "volume_btn" );
mBtnVolume->setClickedCallback( onClickVolume, this );
@@ -235,40 +238,9 @@ BOOL LLStatusBar::postBuild()
mScriptOut = getChildView("scriptout");
- LLUICtrl& mode_combo = getChildRef<LLUICtrl>("mode_combo");
- mode_combo.setValue(gSavedSettings.getString("SessionSettingsFile"));
- mode_combo.setCommitCallback(boost::bind(&LLStatusBar::onModeChange, this, getChild<LLUICtrl>("mode_combo")->getValue(), _2));
-
-
return TRUE;
}
-void LLStatusBar::onModeChange(const LLSD& original_value, const LLSD& new_value)
-{
- if (original_value.asString() != new_value.asString())
- {
- LLNotificationsUtil::add("ModeChange", LLSD(), LLSD(), boost::bind(&LLStatusBar::onModeChangeConfirm, this, original_value, new_value, _1, _2));
- }
-}
-
-void LLStatusBar::onModeChangeConfirm(const LLSD& original_value, const LLSD& new_value, const LLSD& notification, const LLSD& response)
-{
- S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
- switch (option)
- {
- case 0:
- gSavedSettings.getControl("SessionSettingsFile")->set(new_value);
- LLAppViewer::instance()->requestQuit();
- break;
- case 1:
- // revert to original value
- getChild<LLUICtrl>("mode_combo")->setValue(original_value);
- break;
- default:
- break;
- }
-}
-
// Per-frame updates of visibility
void LLStatusBar::refresh()
{
@@ -319,7 +291,7 @@ void LLStatusBar::refresh()
mSGBandwidth->setVisible(net_stats_visible);
mSGPacketLoss->setVisible(net_stats_visible);
- getChildView("stat_btn")->setEnabled(net_stats_visible);
+ mBtnStats->setEnabled(net_stats_visible);
// update the master volume button state
bool mute_audio = LLAppViewer::instance()->getMasterSystemAudioMute();
@@ -378,9 +350,10 @@ void LLStatusBar::setBalance(S32 balance)
const S32 HPAD = 24;
LLRect balance_rect = mBoxBalance->getTextBoundingRect();
LLRect buy_rect = getChildView("buyL")->getRect();
+ LLRect shop_rect = getChildView("goShop")->getRect();
LLView* balance_bg_view = getChildView("balance_bg");
LLRect balance_bg_rect = balance_bg_view->getRect();
- balance_bg_rect.mLeft = balance_bg_rect.mRight - (buy_rect.getWidth() + balance_rect.getWidth() + HPAD);
+ balance_bg_rect.mLeft = balance_bg_rect.mRight - (buy_rect.getWidth() + shop_rect.getWidth() + balance_rect.getWidth() + HPAD);
balance_bg_view->setShape(balance_bg_rect);
}
diff --git a/indra/newview/llstatusbar.h b/indra/newview/llstatusbar.h
index 6feeab393b..9d28e6c2bc 100644
--- a/indra/newview/llstatusbar.h
+++ b/indra/newview/llstatusbar.h
@@ -92,8 +92,6 @@ private:
void onMouseEnterVolume();
void onMouseEnterNearbyMedia();
void onClickScreen(S32 x, S32 y);
- void onModeChange(const LLSD& original_value, const LLSD& new_value);
- void onModeChangeConfirm(const LLSD& original_value, const LLSD& new_value, const LLSD& notification, const LLSD& response);
static void onClickMediaToggle(void* data);
static void onClickBalance(void* data);
@@ -104,10 +102,11 @@ private:
LLStatGraph *mSGBandwidth;
LLStatGraph *mSGPacketLoss;
+ LLView *mBtnStats;
LLButton *mBtnVolume;
LLTextBox *mBoxBalance;
LLButton *mMediaToggle;
- LLView* mScriptOut;
+ LLView *mScriptOut;
LLFrameTimer mClockUpdateTimer;
S32 mBalance;
diff --git a/indra/newview/llsyswellwindow.cpp b/indra/newview/llsyswellwindow.cpp
index cb49976e5f..0cb6c85012 100644
--- a/indra/newview/llsyswellwindow.cpp
+++ b/indra/newview/llsyswellwindow.cpp
@@ -35,16 +35,17 @@
#include "llfloaterreg.h"
#include "llnotifications.h"
-#include "llbottomtray.h"
#include "llscriptfloater.h"
#include "llviewercontrol.h"
#include "llviewerwindow.h"
#include "llchiclet.h"
+#include "llchicletbar.h"
#include "lltoastpanel.h"
#include "llnotificationmanager.h"
#include "llnotificationsutil.h"
#include "llspeakers.h"
+#include "lltoolbarview.h"
//---------------------------------------------------------------------------------
LLSysWellWindow::LLSysWellWindow(const LLSD& key) : LLTransientDockableFloater(NULL, true, key),
@@ -140,15 +141,6 @@ void LLSysWellWindow::initChannel()
}
//---------------------------------------------------------------------------------
-void LLSysWellWindow::getAllowedRect(LLRect& rect)
-{
- rect = gViewerWindow->getWorldViewRectScaled();
-}
-
-//---------------------------------------------------------------------------------
-
-
-//---------------------------------------------------------------------------------
void LLSysWellWindow::setVisible(BOOL visible)
{
if (visible)
@@ -156,8 +148,8 @@ void LLSysWellWindow::setVisible(BOOL visible)
if (NULL == getDockControl() && getDockTongue().notNull())
{
setDockControl(new LLDockControl(
- LLBottomTray::getInstance()->getChild<LLView>(getAnchorViewName()), this,
- getDockTongue(), LLDockControl::TOP, boost::bind(&LLSysWellWindow::getAllowedRect, this, _1)));
+ LLChicletBar::getInstance()->getChild<LLView>(getAnchorViewName()), this,
+ getDockTongue(), LLDockControl::BOTTOM));
}
}
@@ -167,6 +159,7 @@ void LLSysWellWindow::setVisible(BOOL visible)
LLTransientDockableFloater::setVisible(visible);
// update notification channel state
+ initChannel(); // make sure the channel still exists
if(mChannel)
{
mChannel->updateShowToastsState();
@@ -211,10 +204,9 @@ void LLSysWellWindow::reshapeWindow()
{
new_window_height = MAX_WINDOW_HEIGHT;
}
- S32 newY = curRect.mTop + new_window_height - curRect.getHeight();
- S32 newWidth = curRect.getWidth() < MIN_WINDOW_WIDTH ? MIN_WINDOW_WIDTH
- : curRect.getWidth();
- curRect.setLeftTopAndSize(curRect.mLeft, newY, newWidth, new_window_height);
+ S32 newWidth = curRect.getWidth() < MIN_WINDOW_WIDTH ? MIN_WINDOW_WIDTH : curRect.getWidth();
+
+ curRect.setLeftTopAndSize(curRect.mLeft, curRect.mTop, newWidth, new_window_height);
reshape(curRect.getWidth(), curRect.getHeight(), TRUE);
setRect(curRect);
}
@@ -607,6 +599,13 @@ LLIMWellWindow* LLIMWellWindow::getInstance(const LLSD& key /*= LLSD()*/)
return LLFloaterReg::getTypedInstance<LLIMWellWindow>("im_well_window", key);
}
+
+// static
+LLIMWellWindow* LLIMWellWindow::findInstance(const LLSD& key /*= LLSD()*/)
+{
+ return LLFloaterReg::findTypedInstance<LLIMWellWindow>("im_well_window", key);
+}
+
BOOL LLIMWellWindow::postBuild()
{
BOOL rv = LLSysWellWindow::postBuild();
@@ -760,7 +759,10 @@ void LLIMWellWindow::removeObjectRow(const LLUUID& notification_id)
{
if (mMessageList->removeItemByValue(notification_id))
{
- mSysWellChiclet->updateWidget(isWindowEmpty());
+ if (mSysWellChiclet)
+ {
+ mSysWellChiclet->updateWidget(isWindowEmpty());
+ }
}
else
{
diff --git a/indra/newview/llsyswellwindow.h b/indra/newview/llsyswellwindow.h
index 9f8ab01810..272e9cfcb1 100644
--- a/indra/newview/llsyswellwindow.h
+++ b/indra/newview/llsyswellwindow.h
@@ -76,11 +76,6 @@ public:
static const S32 MIN_WINDOW_WIDTH = 318;
protected:
-
- // gets a rect that bounds possible positions for the SysWellWindow on a screen (EXT-1111)
- void getAllowedRect(LLRect& rect);
-
-
// init Window's channel
virtual void initChannel();
@@ -158,6 +153,7 @@ public:
~LLIMWellWindow();
static LLIMWellWindow* getInstance(const LLSD& key = LLSD());
+ static LLIMWellWindow* findInstance(const LLSD& key = LLSD());
static void initClass() { getInstance(); }
/*virtual*/ BOOL postBuild();
diff --git a/indra/newview/llteleporthistory.cpp b/indra/newview/llteleporthistory.cpp
index 0d8b45db1f..50a088b799 100644
--- a/indra/newview/llteleporthistory.cpp
+++ b/indra/newview/llteleporthistory.cpp
@@ -56,7 +56,8 @@ const std::string& LLTeleportHistoryItem::getTitle() const
LLTeleportHistory::LLTeleportHistory():
mCurrentItem(-1),
mRequestedItem(-1),
- mGotInitialUpdate(false)
+ mGotInitialUpdate(false),
+ mTeleportHistoryStorage(NULL)
{
mTeleportFinishedConn = LLViewerParcelMgr::getInstance()->
setTeleportFinishedCallback(boost::bind(&LLTeleportHistory::updateCurrentLocation, this, _1));
@@ -115,6 +116,10 @@ void LLTeleportHistory::handleLoginComplete()
void LLTeleportHistory::updateCurrentLocation(const LLVector3d& new_pos)
{
+ if (!mTeleportHistoryStorage)
+ {
+ mTeleportHistoryStorage = LLTeleportHistoryStorage::getInstance();
+ }
if (mRequestedItem != -1) // teleport within the history in progress?
{
mCurrentItem = mRequestedItem;
@@ -152,7 +157,7 @@ void LLTeleportHistory::updateCurrentLocation(const LLVector3d& new_pos)
if (mCurrentItem < 0 || mCurrentItem >= (int) mItems.size()) // sanity check
{
llwarns << "Invalid current item. (this should not happen)" << llendl;
- llassert(!"Invalid current teleport histiry item");
+ llassert(!"Invalid current teleport history item");
return;
}
LLVector3 new_pos_local = gAgent.getPosAgentFromGlobal(new_pos);
diff --git a/indra/newview/llteleporthistory.h b/indra/newview/llteleporthistory.h
index e45dc28f9b..e9c29c39bf 100644
--- a/indra/newview/llteleporthistory.h
+++ b/indra/newview/llteleporthistory.h
@@ -33,6 +33,7 @@
#include <string>
#include <boost/function.hpp>
#include <boost/signals2.hpp>
+#include "llteleporthistorystorage.h"
/**
@@ -210,6 +211,8 @@ private:
*/
bool mGotInitialUpdate;
+ LLTeleportHistoryStorage* mTeleportHistoryStorage;
+
/**
* Signal emitted when the history gets changed.
*
diff --git a/indra/newview/llteleporthistorystorage.cpp b/indra/newview/llteleporthistorystorage.cpp
index 0ba455e7d5..af5a047da4 100644
--- a/indra/newview/llteleporthistorystorage.cpp
+++ b/indra/newview/llteleporthistorystorage.cpp
@@ -66,6 +66,7 @@ struct LLSortItemsByDate
LLTeleportHistoryStorage::LLTeleportHistoryStorage() :
mFilename("teleport_history.txt")
{
+ mItems.clear();
LLTeleportHistory *th = LLTeleportHistory::getInstance();
if (th)
th->setHistoryChangedCallback(boost::bind(&LLTeleportHistoryStorage::onTeleportHistoryChange, this));
diff --git a/indra/newview/llteleporthistorystorage.h b/indra/newview/llteleporthistorystorage.h
index 6cae0a3454..cf4c85a991 100644
--- a/indra/newview/llteleporthistorystorage.h
+++ b/indra/newview/llteleporthistorystorage.h
@@ -93,9 +93,6 @@ public:
void removeItem(S32 idx);
void save();
- void load();
-
- void dump() const;
/**
* Set a callback to be called upon history changes.
@@ -113,6 +110,9 @@ public:
private:
+ void load();
+ void dump() const;
+
void onTeleportHistoryChange();
bool compareByTitleAndGlobalPos(const LLTeleportHistoryPersistentItem& a, const LLTeleportHistoryPersistentItem& b);
diff --git a/indra/newview/lltexlayer.cpp b/indra/newview/lltexlayer.cpp
index e8abee2fb7..6f6d5dbf12 100644
--- a/indra/newview/lltexlayer.cpp
+++ b/indra/newview/lltexlayer.cpp
@@ -216,22 +216,22 @@ void LLTexLayerSetBuffer::cancelUpload()
void LLTexLayerSetBuffer::pushProjection() const
{
- glMatrixMode(GL_PROJECTION);
+ gGL.matrixMode(LLRender::MM_PROJECTION);
gGL.pushMatrix();
- glLoadIdentity();
- glOrtho(0.0f, mFullWidth, 0.0f, mFullHeight, -1.0f, 1.0f);
+ gGL.loadIdentity();
+ gGL.ortho(0.0f, mFullWidth, 0.0f, mFullHeight, -1.0f, 1.0f);
- glMatrixMode(GL_MODELVIEW);
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
gGL.pushMatrix();
- glLoadIdentity();
+ gGL.loadIdentity();
}
void LLTexLayerSetBuffer::popProjection() const
{
- glMatrixMode(GL_PROJECTION);
+ gGL.matrixMode(LLRender::MM_PROJECTION);
gGL.popMatrix();
- glMatrixMode(GL_MODELVIEW);
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
gGL.popMatrix();
}
@@ -294,18 +294,22 @@ BOOL LLTexLayerSetBuffer::render()
const BOOL update_now = mNeedsUpdate && isReadyToUpdate();
BOOL success = TRUE;
-
- //hack to use fixed function when updating tex layer sets
- bool no_ff = LLGLSLShader::sNoFixedFunction;
- LLGLSLShader::sNoFixedFunction = false;
+ bool use_shaders = LLGLSLShader::sNoFixedFunction;
+
+ if (use_shaders)
+ {
+ gAlphaMaskProgram.bind();
+ gAlphaMaskProgram.setMinimumAlpha(0.004f);
+ }
+
+ LLVertexBuffer::unbind();
+
// Composite the color data
LLGLSUIDefault gls_ui;
success &= mTexLayerSet->render( mOrigin.mX, mOrigin.mY, mFullWidth, mFullHeight );
gGL.flush();
- LLGLSLShader::sNoFixedFunction = no_ff;
-
if(upload_now)
{
if (!success)
@@ -335,6 +339,13 @@ BOOL LLTexLayerSetBuffer::render()
doUpdate();
}
+ if (use_shaders)
+ {
+ gAlphaMaskProgram.unbind();
+ }
+
+ LLVertexBuffer::unbind();
+
// reset GL state
gGL.setColorMask(true, true);
gGL.setSceneBlendType(LLRender::BT_ALPHA);
@@ -924,6 +935,8 @@ BOOL LLTexLayerSet::render( S32 x, S32 y, S32 width, S32 height )
}
}
+ bool use_shaders = LLGLSLShader::sNoFixedFunction;
+
LLGLSUIDefault gls_ui;
LLGLDepthTest gls_depth(GL_FALSE, GL_FALSE);
gGL.setColorMask(true, true);
@@ -932,12 +945,20 @@ BOOL LLTexLayerSet::render( S32 x, S32 y, S32 width, S32 height )
{
gGL.flush();
LLGLDisable no_alpha(GL_ALPHA_TEST);
+ if (use_shaders)
+ {
+ gAlphaMaskProgram.setMinimumAlpha(0.0f);
+ }
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
gGL.color4f( 0.f, 0.f, 0.f, 1.f );
gl_rect_2d_simple( width, height );
gGL.flush();
+ if (use_shaders)
+ {
+ gAlphaMaskProgram.setMinimumAlpha(0.004f);
+ }
}
if (mIsVisible)
@@ -964,6 +985,11 @@ BOOL LLTexLayerSet::render( S32 x, S32 y, S32 width, S32 height )
gGL.setSceneBlendType(LLRender::BT_REPLACE);
LLGLDisable no_alpha(GL_ALPHA_TEST);
+ if (use_shaders)
+ {
+ gAlphaMaskProgram.setMinimumAlpha(0.f);
+ }
+
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
gGL.color4f( 0.f, 0.f, 0.f, 0.f );
@@ -971,7 +997,10 @@ BOOL LLTexLayerSet::render( S32 x, S32 y, S32 width, S32 height )
gGL.setSceneBlendType(LLRender::BT_ALPHA);
gGL.flush();
-
+ if (use_shaders)
+ {
+ gAlphaMaskProgram.setMinimumAlpha(0.004f);
+ }
}
return success;
@@ -1078,13 +1107,14 @@ void LLTexLayerSet::renderAlphaMaskTextures(S32 x, S32 y, S32 width, S32 height,
{
const LLTexLayerSetInfo *info = getInfo();
+ bool use_shaders = LLGLSLShader::sNoFixedFunction;
+
gGL.setColorMask(false, true);
gGL.setSceneBlendType(LLRender::BT_REPLACE);
// (Optionally) replace alpha with a single component image from a tga file.
if (!info->mStaticAlphaFileName.empty())
{
- LLGLSNoAlphaTest gls_no_alpha_test;
gGL.flush();
{
LLViewerTexture* tex = LLTexLayerStaticImageList::getInstance()->getTexture(info->mStaticAlphaFileName, TRUE);
@@ -1103,12 +1133,20 @@ void LLTexLayerSet::renderAlphaMaskTextures(S32 x, S32 y, S32 width, S32 height,
// Set the alpha channel to one (clean up after previous blending)
gGL.flush();
LLGLDisable no_alpha(GL_ALPHA_TEST);
+ if (use_shaders)
+ {
+ gAlphaMaskProgram.setMinimumAlpha(0.f);
+ }
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
gGL.color4f( 0.f, 0.f, 0.f, 1.f );
gl_rect_2d_simple( width, height );
gGL.flush();
+ if (use_shaders)
+ {
+ gAlphaMaskProgram.setMinimumAlpha(0.004f);
+ }
}
// (Optional) Mask out part of the baked texture with alpha masks
@@ -1593,6 +1631,8 @@ BOOL LLTexLayer::render(S32 x, S32 y, S32 width, S32 height)
LLGLEnable color_mat(GL_COLOR_MATERIAL);
gPipeline.disableLights();
+ bool use_shaders = LLGLSLShader::sNoFixedFunction;
+
LLColor4 net_color;
BOOL color_specified = findNetColor(&net_color);
@@ -1673,8 +1713,13 @@ BOOL LLTexLayer::render(S32 x, S32 y, S32 width, S32 height)
{
if( tex )
{
- LLGLDisable alpha_test(getInfo()->mWriteAllChannels ? GL_ALPHA_TEST : 0);
-
+ bool no_alpha_test = getInfo()->mWriteAllChannels;
+ LLGLDisable alpha_test(no_alpha_test ? GL_ALPHA_TEST : 0);
+ if (use_shaders && no_alpha_test)
+ {
+ gAlphaMaskProgram.setMinimumAlpha(0.f);
+ }
+
LLTexUnit::eTextureAddressMode old_mode = tex->getAddressMode();
gGL.getTexUnit(0)->bind(tex, TRUE);
@@ -1684,6 +1729,11 @@ BOOL LLTexLayer::render(S32 x, S32 y, S32 width, S32 height)
gGL.getTexUnit(0)->setTextureAddressMode(old_mode);
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
+ if (use_shaders && no_alpha_test)
+ {
+ gAlphaMaskProgram.setMinimumAlpha(0.004f);
+ }
+
}
}
// else
@@ -1716,9 +1766,17 @@ BOOL LLTexLayer::render(S32 x, S32 y, S32 width, S32 height)
color_specified )
{
LLGLDisable no_alpha(GL_ALPHA_TEST);
+ if (use_shaders)
+ {
+ gAlphaMaskProgram.setMinimumAlpha(0.f);
+ }
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
gGL.color4fv( net_color.mV );
gl_rect_2d_simple( width, height );
+ if (use_shaders)
+ {
+ gAlphaMaskProgram.setMinimumAlpha(0.004f);
+ }
}
if( alpha_mask_specified || getInfo()->mWriteAllChannels )
@@ -1806,15 +1864,25 @@ BOOL LLTexLayer::blendAlphaTexture(S32 x, S32 y, S32 width, S32 height)
gGL.flush();
+ bool use_shaders = LLGLSLShader::sNoFixedFunction;
+
if( !getInfo()->mStaticImageFileName.empty() )
{
LLViewerTexture* tex = LLTexLayerStaticImageList::getInstance()->getTexture( getInfo()->mStaticImageFileName, getInfo()->mStaticImageIsMask );
if( tex )
{
LLGLSNoAlphaTest gls_no_alpha_test;
+ if (use_shaders)
+ {
+ gAlphaMaskProgram.setMinimumAlpha(0.f);
+ }
gGL.getTexUnit(0)->bind(tex, TRUE);
gl_rect_2d_simple_tex( width, height );
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
+ if (use_shaders)
+ {
+ gAlphaMaskProgram.setMinimumAlpha(0.004f);
+ }
}
else
{
@@ -1829,10 +1897,18 @@ BOOL LLTexLayer::blendAlphaTexture(S32 x, S32 y, S32 width, S32 height)
if (tex)
{
LLGLSNoAlphaTest gls_no_alpha_test;
+ if (use_shaders)
+ {
+ gAlphaMaskProgram.setMinimumAlpha(0.f);
+ }
gGL.getTexUnit(0)->bind(tex);
gl_rect_2d_simple_tex( width, height );
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
success = TRUE;
+ if (use_shaders)
+ {
+ gAlphaMaskProgram.setMinimumAlpha(0.004f);
+ }
}
}
}
@@ -1851,6 +1927,13 @@ BOOL LLTexLayer::renderMorphMasks(S32 x, S32 y, S32 width, S32 height, const LLC
llassert( !mParamAlphaList.empty() );
+ bool use_shaders = LLGLSLShader::sNoFixedFunction;
+
+ if (use_shaders)
+ {
+ gAlphaMaskProgram.setMinimumAlpha(0.f);
+ }
+
gGL.setColorMask(false, true);
LLTexLayerParamAlpha* first_param = *mParamAlphaList.begin();
@@ -1888,7 +1971,6 @@ BOOL LLTexLayer::renderMorphMasks(S32 x, S32 y, S32 width, S32 height, const LLC
if( tex && (tex->getComponents() == 4) )
{
LLGLSNoAlphaTest gls_no_alpha_test;
-
LLTexUnit::eTextureAddressMode old_mode = tex->getAddressMode();
gGL.getTexUnit(0)->bind(tex, TRUE);
@@ -1927,6 +2009,10 @@ BOOL LLTexLayer::renderMorphMasks(S32 x, S32 y, S32 width, S32 height, const LLC
gl_rect_2d_simple( width, height );
}
+ if (use_shaders)
+ {
+ gAlphaMaskProgram.setMinimumAlpha(0.004f);
+ }
LLGLSUIDefault gls_ui;
diff --git a/indra/newview/lltexlayer.h b/indra/newview/lltexlayer.h
index 85dadb213c..4f43547dae 100644
--- a/indra/newview/lltexlayer.h
+++ b/indra/newview/lltexlayer.h
@@ -261,6 +261,8 @@ private:
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
class LLTexLayerSetBuffer : public LLViewerDynamicTexture
{
+ LOG_CLASS(LLTexLayerSetBuffer);
+
public:
LLTexLayerSetBuffer(LLTexLayerSet* const owner, S32 width, S32 height);
virtual ~LLTexLayerSetBuffer();
diff --git a/indra/newview/lltexturecache.cpp b/indra/newview/lltexturecache.cpp
index 87b6304f9d..8632890bbb 100644
--- a/indra/newview/lltexturecache.cpp
+++ b/indra/newview/lltexturecache.cpp
@@ -36,6 +36,7 @@
// Included to allow LLTextureCache::purgeTextures() to pause watchdog timeout
#include "llappviewer.h"
+#include "llmemory.h"
// Cache organization:
// cache/texture.entries
@@ -176,7 +177,7 @@ private:
bool LLTextureCacheLocalFileWorker::doRead()
{
- S32 local_size = LLAPRFile::size(mFileName);
+ S32 local_size = LLAPRFile::size(mFileName, mCache->getLocalAPRFilePool());
if (local_size > 0 && mFileName.size() > 4)
{
@@ -250,7 +251,7 @@ bool LLTextureCacheLocalFileWorker::doRead()
}
mReadData = (U8*)ALLOCATE_MEM(LLImageBase::getPrivatePool(), mDataSize);
- S32 bytes_read = LLAPRFile::readEx(mFileName, mReadData, mOffset, mDataSize);
+ S32 bytes_read = LLAPRFile::readEx(mFileName, mReadData, mOffset, mDataSize, mCache->getLocalAPRFilePool());
if (bytes_read != mDataSize)
{
@@ -331,7 +332,7 @@ bool LLTextureCacheRemoteWorker::doRead()
// Is it a JPEG2000 file?
{
local_filename = filename + ".j2c";
- local_size = LLAPRFile::size(local_filename);
+ local_size = LLAPRFile::size(local_filename, mCache->getLocalAPRFilePool());
if (local_size > 0)
{
mImageFormat = IMG_CODEC_J2C;
@@ -341,7 +342,7 @@ bool LLTextureCacheRemoteWorker::doRead()
if (local_size == 0)
{
local_filename = filename + ".jpg";
- local_size = LLAPRFile::size(local_filename);
+ local_size = LLAPRFile::size(local_filename, mCache->getLocalAPRFilePool());
if (local_size > 0)
{
mImageFormat = IMG_CODEC_JPEG;
@@ -352,7 +353,7 @@ bool LLTextureCacheRemoteWorker::doRead()
if (local_size == 0)
{
local_filename = filename + ".tga";
- local_size = LLAPRFile::size(local_filename);
+ local_size = LLAPRFile::size(local_filename, mCache->getLocalAPRFilePool());
if (local_size > 0)
{
mImageFormat = IMG_CODEC_TGA;
@@ -378,7 +379,8 @@ bool LLTextureCacheRemoteWorker::doRead()
}
// Allocate read buffer
mReadData = (U8*)ALLOCATE_MEM(LLImageBase::getPrivatePool(), mDataSize);
- S32 bytes_read = LLAPRFile::readEx(local_filename, mReadData, mOffset, mDataSize);
+ S32 bytes_read = LLAPRFile::readEx(local_filename,
+ mReadData, mOffset, mDataSize, mCache->getLocalAPRFilePool());
if (bytes_read != mDataSize)
{
llwarns << "Error reading file from local cache: " << local_filename
@@ -429,7 +431,8 @@ bool LLTextureCacheRemoteWorker::doRead()
size = llmin(size, mDataSize);
// Allocate the read buffer
mReadData = (U8*)ALLOCATE_MEM(LLImageBase::getPrivatePool(), size);
- S32 bytes_read = LLAPRFile::readEx(mCache->mHeaderDataFileName, mReadData, offset, size);
+ S32 bytes_read = LLAPRFile::readEx(mCache->mHeaderDataFileName,
+ mReadData, offset, size, mCache->getLocalAPRFilePool());
if (bytes_read != size)
{
llwarns << "LLTextureCacheWorker: " << mID
@@ -455,7 +458,7 @@ bool LLTextureCacheRemoteWorker::doRead()
if (!done && (mState == BODY))
{
std::string filename = mCache->getTextureFileName(mID);
- S32 filesize = LLAPRFile::size(filename);
+ S32 filesize = LLAPRFile::size(filename, mCache->getLocalAPRFilePool());
if (filesize && (filesize + TEXTURE_CACHE_ENTRY_SIZE) > mOffset)
{
@@ -497,7 +500,8 @@ bool LLTextureCacheRemoteWorker::doRead()
// Read the data at last
S32 bytes_read = LLAPRFile::readEx(filename,
mReadData + data_offset,
- file_offset, file_size);
+ file_offset, file_size,
+ mCache->getLocalAPRFilePool());
if (bytes_read != file_size)
{
llwarns << "LLTextureCacheWorker: " << mID
@@ -598,13 +602,13 @@ bool LLTextureCacheRemoteWorker::doWrite()
U8* padBuffer = (U8*)ALLOCATE_MEM(LLImageBase::getPrivatePool(), TEXTURE_CACHE_ENTRY_SIZE);
memset(padBuffer, 0, TEXTURE_CACHE_ENTRY_SIZE); // Init with zeros
memcpy(padBuffer, mWriteData, mDataSize); // Copy the write buffer
- bytes_written = LLAPRFile::writeEx(mCache->mHeaderDataFileName, padBuffer, offset, size);
+ bytes_written = LLAPRFile::writeEx(mCache->mHeaderDataFileName, padBuffer, offset, size, mCache->getLocalAPRFilePool());
FREE_MEM(LLImageBase::getPrivatePool(), padBuffer);
}
else
{
// Write the header record (== first TEXTURE_CACHE_ENTRY_SIZE bytes of the raw file) in the header file
- bytes_written = LLAPRFile::writeEx(mCache->mHeaderDataFileName, mWriteData, offset, size);
+ bytes_written = LLAPRFile::writeEx(mCache->mHeaderDataFileName, mWriteData, offset, size, mCache->getLocalAPRFilePool());
}
if (bytes_written <= 0)
@@ -639,7 +643,8 @@ bool LLTextureCacheRemoteWorker::doWrite()
// llinfos << "Writing Body: " << filename << " Bytes: " << file_offset+file_size << llendl;
S32 bytes_written = LLAPRFile::writeEx( filename,
mWriteData + TEXTURE_CACHE_ENTRY_SIZE,
- 0, file_size);
+ 0, file_size,
+ mCache->getLocalAPRFilePool());
if (bytes_written <= 0)
{
llwarns << "LLTextureCacheWorker: " << mID
@@ -736,6 +741,9 @@ void LLTextureCacheWorker::endWork(S32 param, bool aborted)
LLTextureCache::LLTextureCache(bool threaded)
: LLWorkerThread("TextureCache", threaded),
+ mWorkersMutex(NULL),
+ mHeaderMutex(NULL),
+ mListMutex(NULL),
mHeaderAPRFile(NULL),
mReadOnly(TRUE), //do not allow to change the texture cache until setReadOnly() is called.
mTexturesSizeTotal(0),
@@ -752,7 +760,7 @@ LLTextureCache::~LLTextureCache()
//////////////////////////////////////////////////////////////////////////////
//virtual
-S32 LLTextureCache::update(U32 max_time_ms)
+S32 LLTextureCache::update(F32 max_time_ms)
{
static LLFrameTimer timer ;
static const F32 MAX_TIME_INTERVAL = 300.f ; //seconds.
@@ -839,7 +847,7 @@ BOOL LLTextureCache::isInLocal(const LLUUID& id)
// Is it a JPEG2000 file?
{
local_filename = filename + ".j2c";
- local_size = LLAPRFile::size(local_filename);
+ local_size = LLAPRFile::size(local_filename, getLocalAPRFilePool());
if (local_size > 0)
{
return TRUE ;
@@ -849,7 +857,7 @@ BOOL LLTextureCache::isInLocal(const LLUUID& id)
// If not, is it a jpeg file?
{
local_filename = filename + ".jpg";
- local_size = LLAPRFile::size(local_filename);
+ local_size = LLAPRFile::size(local_filename, getLocalAPRFilePool());
if (local_size > 0)
{
return TRUE ;
@@ -859,7 +867,7 @@ BOOL LLTextureCache::isInLocal(const LLUUID& id)
// Hmm... What about a targa file? (used for UI texture mostly)
{
local_filename = filename + ".tga";
- local_size = LLAPRFile::size(local_filename);
+ local_size = LLAPRFile::size(local_filename, getLocalAPRFilePool());
if (local_size > 0)
{
return TRUE ;
@@ -905,10 +913,10 @@ void LLTextureCache::purgeCache(ELLPath location)
if(LLFile::isdir(mTexturesDirName))
{
std::string file_name = gDirUtilp->getExpandedFilename(location, entries_filename);
- LLAPRFile::remove(file_name);
+ LLAPRFile::remove(file_name, getLocalAPRFilePool());
file_name = gDirUtilp->getExpandedFilename(location, cache_filename);
- LLAPRFile::remove(file_name);
+ LLAPRFile::remove(file_name, getLocalAPRFilePool());
purgeAllTextures(true);
}
@@ -984,9 +992,7 @@ LLAPRFile* LLTextureCache::openHeaderEntriesFile(bool readonly, S32 offset)
{
llassert_always(mHeaderAPRFile == NULL);
apr_int32_t flags = readonly ? APR_READ|APR_BINARY : APR_READ|APR_WRITE|APR_BINARY;
- // All code calling openHeaderEntriesFile, immediately calls closeHeaderEntriesFile,
- // so this file is very short-lived.
- mHeaderAPRFile = new LLAPRFile(mHeaderEntriesFileName, flags);
+ mHeaderAPRFile = new LLAPRFile(mHeaderEntriesFileName, flags, getLocalAPRFilePool());
if(offset > 0)
{
mHeaderAPRFile->seek(APR_SET, offset);
@@ -1009,9 +1015,10 @@ void LLTextureCache::readEntriesHeader()
{
// mHeaderEntriesInfo initializes to default values so safe not to read it
llassert_always(mHeaderAPRFile == NULL);
- if (LLAPRFile::isExist(mHeaderEntriesFileName))
+ if (LLAPRFile::isExist(mHeaderEntriesFileName, getLocalAPRFilePool()))
{
- LLAPRFile::readEx(mHeaderEntriesFileName, (U8*)&mHeaderEntriesInfo, 0, sizeof(EntriesInfo));
+ LLAPRFile::readEx(mHeaderEntriesFileName, (U8*)&mHeaderEntriesInfo, 0, sizeof(EntriesInfo),
+ getLocalAPRFilePool());
}
else //create an empty entries header.
{
@@ -1026,7 +1033,8 @@ void LLTextureCache::writeEntriesHeader()
llassert_always(mHeaderAPRFile == NULL);
if (!mReadOnly)
{
- LLAPRFile::writeEx(mHeaderEntriesFileName, (U8*)&mHeaderEntriesInfo, 0, sizeof(EntriesInfo));
+ LLAPRFile::writeEx(mHeaderEntriesFileName, (U8*)&mHeaderEntriesInfo, 0, sizeof(EntriesInfo),
+ getLocalAPRFilePool());
}
}
@@ -1615,7 +1623,7 @@ void LLTextureCache::purgeTextures(bool validate)
if (uuididx == validate_idx)
{
LL_DEBUGS("TextureCache") << "Validating: " << filename << "Size: " << entries[idx].mBodySize << LL_ENDL;
- S32 bodysize = LLAPRFile::size(filename);
+ S32 bodysize = LLAPRFile::size(filename, getLocalAPRFilePool());
if (bodysize != entries[idx].mBodySize)
{
LL_WARNS("TextureCache") << "TEXTURE CACHE BODY HAS BAD SIZE: " << bodysize << " != " << entries[idx].mBodySize
@@ -1633,8 +1641,8 @@ void LLTextureCache::purgeTextures(bool validate)
{
purge_count++;
LL_DEBUGS("TextureCache") << "PURGING: " << filename << LL_ENDL;
- removeEntry(idx, entries[idx], filename) ;
cache_size -= entries[idx].mBodySize;
+ removeEntry(idx, entries[idx], filename) ;
}
}
@@ -1850,7 +1858,7 @@ void LLTextureCache::removeCachedTexture(const LLUUID& id)
mTexturesSizeMap.erase(id);
}
mHeaderIDMap.erase(id);
- LLAPRFile::remove(getTextureFileName(id));
+ LLAPRFile::remove(getTextureFileName(id), getLocalAPRFilePool());
}
//called after mHeaderMutex is locked.
@@ -1862,7 +1870,7 @@ void LLTextureCache::removeEntry(S32 idx, Entry& entry, std::string& filename)
{
if (entry.mBodySize == 0) // Always attempt to remove when mBodySize > 0.
{
- if (LLAPRFile::isExist(filename)) // Sanity check. Shouldn't exist when body size is 0.
+ if (LLAPRFile::isExist(filename, getLocalAPRFilePool())) // Sanity check. Shouldn't exist when body size is 0.
{
LL_WARNS("TextureCache") << "Entry has body size of zero but file " << filename << " exists. Deleting this file, too." << LL_ENDL;
}
@@ -1871,19 +1879,18 @@ void LLTextureCache::removeEntry(S32 idx, Entry& entry, std::string& filename)
file_maybe_exists = false;
}
}
+ mTexturesSizeTotal -= entry.mBodySize;
entry.mImageSize = -1;
entry.mBodySize = 0;
mHeaderIDMap.erase(entry.mID);
- mTexturesSizeMap.erase(entry.mID);
-
- mTexturesSizeTotal -= entry.mBodySize;
+ mTexturesSizeMap.erase(entry.mID);
mFreeList.insert(idx);
}
if (file_maybe_exists)
{
- LLAPRFile::remove(filename);
+ LLAPRFile::remove(filename, getLocalAPRFilePool());
}
}
diff --git a/indra/newview/lltexturecache.h b/indra/newview/lltexturecache.h
index 79f5ba5835..dd0cc9b4bd 100644
--- a/indra/newview/lltexturecache.h
+++ b/indra/newview/lltexturecache.h
@@ -101,7 +101,7 @@ public:
LLTextureCache(bool threaded);
~LLTextureCache();
- /*virtual*/ S32 update(U32 max_time_ms);
+ /*virtual*/ S32 update(F32 max_time_ms);
void purgeCache(ELLPath location);
void setReadOnly(BOOL read_only) ;
@@ -142,6 +142,9 @@ protected:
std::string getTextureFileName(const LLUUID& id);
void addCompleted(Responder* responder, bool success);
+protected:
+ //void setFileAPRPool(apr_pool_t* pool) { mFileAPRPool = pool ; }
+
private:
void setDirNames(ELLPath location);
void readHeaderCache();
diff --git a/indra/newview/lltexturefetch.cpp b/indra/newview/lltexturefetch.cpp
index e9be45ffd0..f18aa8b4e6 100644
--- a/indra/newview/lltexturefetch.cpp
+++ b/indra/newview/lltexturefetch.cpp
@@ -674,6 +674,7 @@ LLTextureFetchWorker::LLTextureFetchWorker(LLTextureFetch* fetcher,
mRetryAttempt(0),
mActiveCount(0),
mGetStatus(0),
+ mWorkMutex(NULL),
mFirstPacket(0),
mLastPacket(-1),
mTotalPackets(0),
@@ -1810,11 +1811,13 @@ bool LLTextureFetchWorker::writeToCacheComplete()
// public
LLTextureFetch::LLTextureFetch(LLTextureCache* cache, LLImageDecodeThread* imagedecodethread, bool threaded, bool qa_mode)
- : LLWorkerThread("TextureFetch", threaded),
+ : LLWorkerThread("TextureFetch", threaded, true),
mDebugCount(0),
mDebugPause(FALSE),
mPacketCount(0),
mBadPacketCount(0),
+ mQueueMutex(getAPRPool()),
+ mNetworkQueueMutex(getAPRPool()),
mTextureCache(cache),
mImageDecodeThread(imagedecodethread),
mTextureBandwidth(0),
@@ -2201,7 +2204,7 @@ void LLTextureFetch::commonUpdate()
// MAIN THREAD
//virtual
-S32 LLTextureFetch::update(U32 max_time_ms)
+S32 LLTextureFetch::update(F32 max_time_ms)
{
static LLCachedControl<F32> band_width(gSavedSettings,"ThrottleBandwidthKBPS");
diff --git a/indra/newview/lltexturefetch.h b/indra/newview/lltexturefetch.h
index d101da1f4b..35df7d816f 100644
--- a/indra/newview/lltexturefetch.h
+++ b/indra/newview/lltexturefetch.h
@@ -55,7 +55,7 @@ public:
class TFRequest;
- /*virtual*/ S32 update(U32 max_time_ms);
+ /*virtual*/ S32 update(F32 max_time_ms);
void shutDownTextureCacheThread() ; //called in the main thread after the TextureCacheThread shuts down.
void shutDownImageDecodeThread() ; //called in the main thread after the ImageDecodeThread shuts down.
diff --git a/indra/newview/lltextureview.cpp b/indra/newview/lltextureview.cpp
index 6547154bc4..1c89766b26 100644
--- a/indra/newview/lltextureview.cpp
+++ b/indra/newview/lltextureview.cpp
@@ -527,11 +527,12 @@ void LLGLTexMemBar::draw()
LLFontGL::getFontMonospace()->renderUTF8(text, 0, 0, v_offset + line_height*6,
text_color, LLFontGL::LEFT, LLFontGL::TOP);
- text = llformat("GL Tot: %d/%d MB Bound: %d/%d MB Raw Tot: %d MB Bias: %.2f Cache: %.1f/%.1f MB Net Tot Tex: %.1f MB Tot Obj: %.1f MB Tot Htp: %d",
+ text = llformat("GL Tot: %d/%d MB Bound: %d/%d MB FBO: %d MB Raw Tot: %d MB Bias: %.2f Cache: %.1f/%.1f MB Net Tot Tex: %.1f MB Tot Obj: %.1f MB Tot Htp: %d",
total_mem,
max_total_mem,
bound_mem,
max_bound_mem,
+ LLRenderTarget::sBytesAllocated/(1024*1024),
LLImageRaw::sGlobalRawMemory >> 20, discard_bias,
cache_usage, cache_max_usage, total_texture_downloaded, total_object_downloaded, total_http_requests);
//, cache_entries, cache_max_entries
@@ -571,7 +572,7 @@ void LLGLTexMemBar::draw()
color = (total_mem < llfloor(max_total_mem * texmem_lower_bound_scale)) ? LLColor4::green :
(total_mem < max_total_mem) ? LLColor4::yellow : LLColor4::red;
color[VALPHA] = .75f;
- glColor4fv(color.mV);
+ gGL.diffuseColor4fv(color.mV);
gl_rect_2d(left, top, right, bottom); // red/yellow/green
@@ -594,7 +595,7 @@ void LLGLTexMemBar::draw()
color = (bound_mem < llfloor(max_bound_mem * texmem_lower_bound_scale)) ? LLColor4::green :
(bound_mem < max_bound_mem) ? LLColor4::yellow : LLColor4::red;
color[VALPHA] = .75f;
- glColor4fv(color.mV);
+ gGL.diffuseColor4fv(color.mV);
gl_rect_2d(left, top, right, bottom);
#else
diff --git a/indra/newview/lltoast.cpp b/indra/newview/lltoast.cpp
index e0b07ed408..da691a2d0c 100644
--- a/indra/newview/lltoast.cpp
+++ b/indra/newview/lltoast.cpp
@@ -113,7 +113,8 @@ LLToast::LLToast(const LLToast::Params& p)
mHideBtnPressed(false),
mIsTip(p.is_tip),
mWrapperPanel(NULL),
- mIsFading(false)
+ mIsFading(false),
+ mIsHovered(false)
{
mTimer.reset(new LLToastLifeTimer(this, p.lifetime_secs));
@@ -122,8 +123,6 @@ LLToast::LLToast(const LLToast::Params& p)
setCanDrag(FALSE);
mWrapperPanel = getChild<LLPanel>("wrapper_panel");
- mWrapperPanel->setMouseEnterCallback(boost::bind(&LLToast::onToastMouseEnter, this));
- mWrapperPanel->setMouseLeaveCallback(boost::bind(&LLToast::onToastMouseLeave, this));
setBackgroundOpaque(TRUE); // *TODO: obsolete
updateTransparency();
@@ -137,13 +136,13 @@ LLToast::LLToast(const LLToast::Params& p)
{
mHideBtn = getChild<LLButton>("hide_btn");
mHideBtn->setClickedCallback(boost::bind(&LLToast::hide,this));
- mHideBtn->setMouseEnterCallback(boost::bind(&LLToast::onToastMouseEnter, this));
- mHideBtn->setMouseLeaveCallback(boost::bind(&LLToast::onToastMouseLeave, this));
}
// init callbacks if present
if(!p.on_delete_toast().empty())
+ {
mOnDeleteToastSignal.connect(p.on_delete_toast());
+ }
}
void LLToast::reshape(S32 width, S32 height, BOOL called_from_parent)
@@ -239,7 +238,9 @@ void LLToast::setCanFade(bool can_fade)
{
mCanFade = can_fade;
if(!mCanFade)
+ {
mTimer->stop();
+ }
}
//--------------------------------------------------------------------------
@@ -378,8 +379,11 @@ void LLToast::setVisible(BOOL show)
}
}
-void LLToast::onToastMouseEnter()
+void LLToast::updateHoveredState()
{
+ S32 x, y;
+ LLUI::getMousePositionScreen(&x, &y);
+
LLRect panel_rc = mWrapperPanel->calcScreenRect();
LLRect button_rc;
if(mHideBtn)
@@ -387,56 +391,83 @@ void LLToast::onToastMouseEnter()
button_rc = mHideBtn->calcScreenRect();
}
- S32 x, y;
- LLUI::getMousePositionScreen(&x, &y);
-
- if(panel_rc.pointInRect(x, y) || button_rc.pointInRect(x, y))
+ if (!panel_rc.pointInRect(x, y) && !button_rc.pointInRect(x, y))
{
- mOnToastHoverSignal(this, MOUSE_ENTER);
-
- updateTransparency();
+ // mouse is not over this toast
+ mIsHovered = false;
+ }
+ else
+ {
+ bool is_overlapped_by_other_floater = false;
- //toasts fading is management by Screen Channel
+ const child_list_t* child_list = gFloaterView->getChildList();
- sendChildToFront(mHideBtn);
- if(mHideBtn && mHideBtn->getEnabled())
+ // find this toast in gFloaterView child list to check whether any floater
+ // with higher Z-order is visible under the mouse pointer overlapping this toast
+ child_list_const_reverse_iter_t r_iter = std::find(child_list->rbegin(), child_list->rend(), this);
+ if (r_iter != child_list->rend())
{
- mHideBtn->setVisible(TRUE);
+ // skip this toast and proceed to views above in Z-order
+ for (++r_iter; r_iter != child_list->rend(); ++r_iter)
+ {
+ LLView* view = *r_iter;
+ is_overlapped_by_other_floater = view->isInVisibleChain() && view->calcScreenRect().pointInRect(x, y);
+ if (is_overlapped_by_other_floater)
+ {
+ break;
+ }
+ }
}
- mToastMouseEnterSignal(this, getValue());
- }
-}
-void LLToast::onToastMouseLeave()
-{
- LLRect panel_rc = mWrapperPanel->calcScreenRect();
- LLRect button_rc;
- if(mHideBtn)
- {
- button_rc = mHideBtn->calcScreenRect();
+ mIsHovered = !is_overlapped_by_other_floater;
}
- S32 x, y;
- LLUI::getMousePositionScreen(&x, &y);
-
- if( !panel_rc.pointInRect(x, y) && !button_rc.pointInRect(x, y))
- {
- mOnToastHoverSignal(this, MOUSE_LEAVE);
-
- updateTransparency();
-
- //toasts fading is management by Screen Channel
-
- if(mHideBtn && mHideBtn->getEnabled())
+ LLToastLifeTimer* timer = getTimer();
+
+ if (timer)
+ {
+ // Started timer means the mouse had left the toast previously.
+ // If toast is hovered in the current frame we should handle
+ // a mouse enter event.
+ if(timer->getStarted() && mIsHovered)
+ {
+ mOnToastHoverSignal(this, MOUSE_ENTER);
+
+ updateTransparency();
+
+ //toasts fading is management by Screen Channel
+
+ sendChildToFront(mHideBtn);
+ if(mHideBtn && mHideBtn->getEnabled())
+ {
+ mHideBtn->setVisible(TRUE);
+ }
+
+ mToastMouseEnterSignal(this, getValue());
+ }
+ // Stopped timer means the mouse had entered the toast previously.
+ // If the toast is not hovered in the current frame we should handle
+ // a mouse leave event.
+ else if(!timer->getStarted() && !mIsHovered)
{
- if( mHideBtnPressed )
+ mOnToastHoverSignal(this, MOUSE_LEAVE);
+
+ updateTransparency();
+
+ //toasts fading is management by Screen Channel
+
+ if(mHideBtn && mHideBtn->getEnabled())
{
- mHideBtnPressed = false;
- return;
+ if( mHideBtnPressed )
+ {
+ mHideBtnPressed = false;
+ return;
+ }
+ mHideBtn->setVisible(FALSE);
}
- mHideBtn->setVisible(FALSE);
+
+ mToastMouseLeaveSignal(this, getValue());
}
- mToastMouseLeaveSignal(this, getValue());
}
}
@@ -495,13 +526,6 @@ void LLNotificationsUI::LLToast::startTimer()
}
}
-bool LLToast::isHovered()
-{
- S32 x, y;
- LLUI::getMousePositionScreen(&x, &y);
- return mWrapperPanel->calcScreenRect().pointInRect(x, y);
-}
-
//--------------------------------------------------------------------------
BOOL LLToast::handleMouseDown(S32 x, S32 y, MASK mask)
@@ -536,3 +560,14 @@ S32 LLToast::notifyParent(const LLSD& info)
return LLModalDialog::notifyParent(info);
}
+
+//static
+void LLToast::updateClass()
+{
+ for (LLInstanceTracker<LLToast>::instance_iter iter = LLInstanceTracker<LLToast>::beginInstances(); iter != LLInstanceTracker<LLToast>::endInstances(); )
+ {
+ LLToast& toast = *iter++;
+
+ toast.updateHoveredState();
+ }
+}
diff --git a/indra/newview/lltoast.h b/indra/newview/lltoast.h
index 242f786bf2..0b06728935 100644
--- a/indra/newview/lltoast.h
+++ b/indra/newview/lltoast.h
@@ -27,7 +27,7 @@
#ifndef LL_LLTOAST_H
#define LL_LLTOAST_H
-
+#include "llinstancetracker.h"
#include "llpanel.h"
#include "llmodaldialog.h"
#include "lleventtimer.h"
@@ -69,7 +69,7 @@ private :
* Represents toast pop-up.
* This is a parent view for all toast panels.
*/
-class LLToast : public LLModalDialog
+class LLToast : public LLModalDialog, public LLInstanceTracker<LLToast>
{
friend class LLToastLifeTimer;
public:
@@ -102,6 +102,8 @@ public:
Params();
};
+
+ static void updateClass();
LLToast(const LLToast::Params& p);
virtual ~LLToast();
@@ -120,7 +122,7 @@ public:
/** Start lifetime/fading timer */
virtual void startTimer();
- bool isHovered();
+ bool isHovered() { return mIsHovered; }
// Operating with toasts
// insert a panel to a toast
@@ -196,16 +198,13 @@ public:
virtual S32 notifyParent(const LLSD& info);
- LLHandle<LLToast> getHandle() { mHandle.bind(this); return mHandle; }
+ LLHandle<LLToast> getHandle() const { return getDerivedHandle<LLToast>(); }
protected:
void updateTransparency();
private:
-
- void onToastMouseEnter();
-
- void onToastMouseLeave();
+ void updateHoveredState();
void expire();
@@ -215,7 +214,7 @@ private:
LLUUID mSessionID;
LLNotificationPtr mNotification;
- LLRootHandle<LLToast> mHandle;
+ //LLRootHandle<LLToast> mHandle;
LLPanel* mWrapperPanel;
@@ -224,7 +223,7 @@ private:
F32 mToastLifetime; // in seconds
F32 mToastFadingTime; // in seconds
-
+
LLPanel* mPanel;
LLButton* mHideBtn;
@@ -236,6 +235,7 @@ private:
bool mIsHidden; // this flag is TRUE when a toast has faded or was hidden with (x) button (EXT-1849)
bool mIsTip;
bool mIsFading;
+ bool mIsHovered;
commit_signal_t mToastMouseEnterSignal;
commit_signal_t mToastMouseLeaveSignal;
diff --git a/indra/newview/lltoastnotifypanel.cpp b/indra/newview/lltoastnotifypanel.cpp
index 6873cf058a..de305bf3d9 100644
--- a/indra/newview/lltoastnotifypanel.cpp
+++ b/indra/newview/lltoastnotifypanel.cpp
@@ -91,8 +91,6 @@ mCloseNotificationOnDestroy(true)
sFont = LLFontGL::getFontSansSerif();
sFontSmall = LLFontGL::getFontSansSerifSmall();
}
- // clicking on a button does not steal current focus
- setIsChrome(TRUE);
// initialize
setFocusRoot(!mIsTip);
// get a form for the notification
diff --git a/indra/newview/lltool.h b/indra/newview/lltool.h
index d3edabb486..ecc435d844 100644
--- a/indra/newview/lltool.h
+++ b/indra/newview/lltool.h
@@ -68,7 +68,7 @@ public:
virtual void localPointToScreen(S32 local_x, S32 local_y, S32* screen_x, S32* screen_y) const
{ *screen_x = local_x; *screen_y = local_y; }
- virtual std::string getName() const { return mName; }
+ virtual const std::string& getName() const { return mName; }
// New virtual functions
virtual LLViewerObject* getEditingObject() { return NULL; }
diff --git a/indra/newview/lltoolbar.cpp b/indra/newview/lltoolbar.cpp
deleted file mode 100644
index c4f599561d..0000000000
--- a/indra/newview/lltoolbar.cpp
+++ /dev/null
@@ -1,365 +0,0 @@
-/**
- * @file lltoolbar.cpp
- * @author James Cook, Richard Nelson
- * @brief Large friendly buttons at bottom of screen.
- *
- * $LicenseInfo:firstyear=2002&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-#include "llviewerprecompiledheaders.h"
-
-#include "lltoolbar.h"
-
-#include "imageids.h"
-#include "llfloaterreg.h"
-#include "llfontgl.h"
-#include "llflyoutbutton.h"
-#include "llrect.h"
-#include "llparcel.h"
-
-#include "llagent.h"
-#include "llagentwearables.h"
-#include "llbutton.h"
-#include "llfocusmgr.h"
-#include "llviewercontrol.h"
-#include "llmenucommands.h"
-#include "llimview.h"
-#include "lluiconstants.h"
-#include "llvoavatarself.h"
-#include "lltooldraganddrop.h"
-#include "llfloaterinventory.h"
-#include "llfloaterchatterbox.h"
-#include "llfloatersnapshot.h"
-#include "llinventorypanel.h"
-#include "lltoolmgr.h"
-#include "llui.h"
-#include "llviewermenu.h"
-//#include "llfirstuse.h"
-#include "llpanelblockedlist.h"
-#include "llscrolllistctrl.h"
-#include "llscrolllistitem.h"
-#include "llscrolllistcell.h"
-#include "llviewerparcelmgr.h"
-#include "lluictrlfactory.h"
-#include "llviewerwindow.h"
-#include "lltoolgrab.h"
-#include "llcombobox.h"
-#include "lllayoutstack.h"
-
-#if LL_DARWIN
-
- #include "llresizehandle.h"
-
-#endif // LL_DARWIN
-
-//
-// Globals
-//
-
-LLToolBar *gToolBar = NULL;
-
-//
-// Statics
-//
-F32 LLToolBar::sInventoryAutoOpenTime = 1.f;
-
-//
-// Functions
-//
-
-LLToolBar::LLToolBar()
- : LLPanel(),
-
- mInventoryAutoOpen(FALSE),
- mNumUnreadIMs(0)
-#if LL_DARWIN
- , mResizeHandle(NULL)
-#endif // LL_DARWIN
-{
- setIsChrome(TRUE);
- setFocusRoot(TRUE);
-
- mCommitCallbackRegistrar.add("HandleCommunicate", &LLToolBar::onClickCommunicate);
-}
-
-
-BOOL LLToolBar::postBuild()
-{
- for (child_list_const_iter_t child_iter = getChildList()->begin();
- child_iter != getChildList()->end(); ++child_iter)
- {
- LLView *view = *child_iter;
- LLButton* buttonp = dynamic_cast<LLButton*>(view);
- if(buttonp)
- {
- buttonp->setSoundFlags(LLView::SILENT);
- }
- }
-
-#if LL_DARWIN
- if(mResizeHandle == NULL)
- {
- LLRect rect(0, 0, RESIZE_HANDLE_WIDTH, RESIZE_HANDLE_HEIGHT);
- LLResizeHandle::Params p;
- p.name("");
- p.rect(rect);
- p.min_width(RESIZE_HANDLE_WIDTH);
- p.min_height(RESIZE_HANDLE_HEIGHT);
- p.enabled(false);
- mResizeHandle = LLUICtrlFactory::create<LLResizeHandle>(p);
- addChildInBack(mResizeHandle);
- LLLayoutStack* toolbar_stack = getChild<LLLayoutStack>("toolbar_stack");
- toolbar_stack->reshape(toolbar_stack->getRect().getWidth() - RESIZE_HANDLE_WIDTH, toolbar_stack->getRect().getHeight());
- }
-#endif // LL_DARWIN
-
- layoutButtons();
-
- return TRUE;
-}
-
-LLToolBar::~LLToolBar()
-{
- // LLView destructor cleans up children
-}
-
-
-BOOL LLToolBar::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
- EDragAndDropType cargo_type,
- void* cargo_data,
- EAcceptance* accept,
- std::string& tooltip_msg)
-{
- LLButton* inventory_btn = getChild<LLButton>("inventory_btn");
- if (!inventory_btn) return FALSE;
-
- LLRect button_screen_rect;
- inventory_btn->localRectToScreen(inventory_btn->getRect(),&button_screen_rect);
-
- const LLInventoryPanel *active_panel = LLInventoryPanel::getActiveInventoryPanel();
- if(active_panel)
- {
- mInventoryAutoOpen = FALSE;
- }
- else if (button_screen_rect.pointInRect(x, y))
- {
- if (mInventoryAutoOpen)
- {
- if (!active_panel &&
- mInventoryAutoOpenTimer.getElapsedTimeF32() > sInventoryAutoOpenTime)
- {
- LLFloaterInventory::showAgentInventory();
- }
- }
- else
- {
- mInventoryAutoOpen = TRUE;
- mInventoryAutoOpenTimer.reset();
- }
- }
-
- return LLPanel::handleDragAndDrop(x, y, mask, drop, cargo_type, cargo_data, accept, tooltip_msg);
-}
-
-// static
-void LLToolBar::toggle(void*)
-{
- BOOL show = gSavedSettings.getBOOL("ShowToolBar");
- gSavedSettings.setBOOL("ShowToolBar", !show);
- gToolBar->setVisible(!show);
-}
-
-
-// static
-BOOL LLToolBar::visible(void*)
-{
- return gToolBar->getVisible();
-}
-
-
-void LLToolBar::layoutButtons()
-{
-#if LL_DARWIN
- const S32 FUDGE_WIDTH_OF_SCREEN = 4;
- S32 width = gViewerWindow->getWindowWidthScaled() + FUDGE_WIDTH_OF_SCREEN;
- S32 pad = 2;
-
- // this function may be called before postBuild(), in which case mResizeHandle won't have been set up yet.
- if(mResizeHandle != NULL)
- {
- // Only when running in windowed mode on the Mac, leave room for a resize widget on the right edge of the bar.
- width -= RESIZE_HANDLE_WIDTH;
-
- LLRect r;
- r.mLeft = width - pad;
- r.mBottom = 0;
- r.mRight = r.mLeft + RESIZE_HANDLE_WIDTH;
- r.mTop = r.mBottom + RESIZE_HANDLE_HEIGHT;
- mResizeHandle->setRect(r);
- mResizeHandle->setVisible(TRUE);
- }
-#endif // LL_DARWIN
-}
-
-
-// virtual
-void LLToolBar::reshape(S32 width, S32 height, BOOL called_from_parent)
-{
- LLPanel::reshape(width, height, called_from_parent);
-
- layoutButtons();
-}
-
-
-// Per-frame updates of visibility
-void LLToolBar::refresh()
-{
- BOOL show = gSavedSettings.getBOOL("ShowToolBar");
- BOOL mouselook = gAgent.cameraMouselook();
- setVisible(show && !mouselook);
-
- if (isInVisibleChain())
- {
- updateCommunicateList();
- }
-}
-
-void LLToolBar::updateCommunicateList()
-{
- LLFlyoutButton* communicate_button = getChild<LLFlyoutButton>("communicate_btn");
- LLSD selected = communicate_button->getValue();
-
- communicate_button->removeall();
-
- //LLFloater* frontmost_floater = LLFloaterChatterBox::getInstance()->getActiveFloater();
- LLScrollListItem* itemp = NULL;
-
- LLSD contact_sd;
- contact_sd["value"] = "contacts";
- /*contact_sd["columns"][0]["value"] = LLFloaterMyFriends::getInstance()->getShortTitle();
- if (LLFloaterMyFriends::getInstance() == frontmost_floater)
- {
- contact_sd["columns"][0]["font"]["name"] = "SANSSERIF_SMALL";
- contact_sd["columns"][0]["font"]["style"] = "BOLD";
- // make sure current tab is selected in list
- if (selected.isUndefined())
- {
- selected = "contacts";
- }
- }*/
- itemp = communicate_button->addElement(contact_sd, ADD_TOP);
-
- communicate_button->addSeparator(ADD_TOP);
- communicate_button->add(getString("Redock Windows"), LLSD("redock"), ADD_TOP);
- communicate_button->addSeparator(ADD_TOP);
- communicate_button->add(getString("Blocked List"), LLSD("mute list"), ADD_TOP);
-
- std::set<LLHandle<LLFloater> >::const_iterator floater_handle_it;
-
- /*if (gIMMgr->getIMFloaterHandles().size() > 0)
- {
- communicate_button->addSeparator(ADD_TOP);
- }
-
- for(floater_handle_it = gIMMgr->getIMFloaterHandles().begin(); floater_handle_it != gIMMgr->getIMFloaterHandles().end(); ++floater_handle_it)
- {
- LLFloaterIMPanel* im_floaterp = (LLFloaterIMPanel*)floater_handle_it->get();
- if (im_floaterp)
- {
- std::string floater_title = im_floaterp->getNumUnreadMessages() > 0 ? "*" : "";
- floater_title.append(im_floaterp->getShortTitle());
- LLSD im_sd;
- im_sd["value"] = im_floaterp->getSessionID();
- im_sd["columns"][0]["value"] = floater_title;
- if (im_floaterp == frontmost_floater)
- {
- im_sd["columns"][0]["font"]["name"] = "SANSSERIF_SMALL";
- im_sd["columns"][0]["font"]["style"] = "BOLD";
- if (selected.isUndefined())
- {
- selected = im_floaterp->getSessionID();
- }
- }
- itemp = communicate_button->addElement(im_sd, ADD_TOP);
- }
- }*/
-
- communicate_button->setValue(selected);
-}
-
-
-// static
-void LLToolBar::onClickCommunicate(LLUICtrl* ctrl, const LLSD& user_data)
-{
- LLFlyoutButton* communicate_button = dynamic_cast<LLFlyoutButton*>(ctrl);
- llassert_always(communicate_button);
-
- LLSD selected_option = communicate_button->getValue();
-
- if (selected_option.asString() == "contacts")
- {
- LLFloaterReg::showInstance("contacts", "friends");
- }
- else if (selected_option.asString() == "local chat")
- {
- LLFloaterReg::showInstance("communicate", "local");
- }
- else if (selected_option.asString() == "redock")
- {
- /*LLFloaterChatterBox* chatterbox_instance = LLFloaterChatterBox::getInstance();
- if(chatterbox_instance)
- {
- chatterbox_instance->addFloater(LLFloaterMyFriends::getInstance(), FALSE);
-
- LLUUID session_to_show;
-
- std::set<LLHandle<LLFloater> >::const_iterator floater_handle_it;
- for(floater_handle_it = gIMMgr->getIMFloaterHandles().begin(); floater_handle_it != gIMMgr->getIMFloaterHandles().end(); ++floater_handle_it)
- {
- LLFloater* im_floaterp = floater_handle_it->get();
- if (im_floaterp)
- {
- if (im_floaterp->isFrontmost())
- {
- session_to_show = ((LLFloaterIMPanel*)im_floaterp)->getSessionID();
- }
- chatterbox_instance->addFloater(im_floaterp, FALSE);
- }
- }
- LLFloaterReg::showInstance("communicate", session_to_show);
- }*/
- }
- else if (selected_option.asString() == "mute list")
- {
- LLPanelBlockedList::showPanelAndSelect(LLUUID::null);
- }
- else if (selected_option.isUndefined()) // user just clicked the communicate button, treat as toggle
- {
- /*LLFloaterReg::toggleInstance("communicate");*/
- }
- else // otherwise selection_option is undifined or a specific IM session id
- {
- /*LLFloaterReg::showInstance("communicate", selected_option);*/
- }
-}
-
-
diff --git a/indra/newview/lltoolbar.h b/indra/newview/lltoolbar.h
deleted file mode 100644
index 217b3c0ac8..0000000000
--- a/indra/newview/lltoolbar.h
+++ /dev/null
@@ -1,82 +0,0 @@
-/**
- * @file lltoolbar.h
- * @brief Large friendly buttons at bottom of screen.
- *
- * $LicenseInfo:firstyear=2002&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-#ifndef LL_LLTOOLBAR_H
-#define LL_LLTOOLBAR_H
-
-#include "llpanel.h"
-
-#include "llframetimer.h"
-
-class LLResizeHandle;
-
-class LLToolBar
-: public LLPanel
-{
-public:
- LLToolBar();
- ~LLToolBar();
-
- /*virtual*/ BOOL postBuild();
-
- /*virtual*/ BOOL handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
- EDragAndDropType cargo_type,
- void* cargo_data,
- EAcceptance* accept,
- std::string& tooltip_msg);
-
- /*virtual*/ void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE);
-
- static void toggle(void*);
- static BOOL visible(void*);
-
- // Move buttons to appropriate locations based on rect.
- void layoutButtons();
-
- // Per-frame refresh call
- void refresh();
-
- // callbacks
- static void onClickCommunicate(LLUICtrl*, const LLSD&);
-
- static F32 sInventoryAutoOpenTime;
-
-private:
- void updateCommunicateList();
-
-
-private:
- BOOL mInventoryAutoOpen;
- LLFrameTimer mInventoryAutoOpenTimer;
- S32 mNumUnreadIMs;
-#if LL_DARWIN
- LLResizeHandle *mResizeHandle;
-#endif // LL_DARWIN
-};
-
-extern LLToolBar *gToolBar;
-
-#endif
diff --git a/indra/newview/lltoolbarview.cpp b/indra/newview/lltoolbarview.cpp
new file mode 100644
index 0000000000..eccb2cf2f1
--- /dev/null
+++ b/indra/newview/lltoolbarview.cpp
@@ -0,0 +1,697 @@
+/**
+ * @file lltoolbarview.cpp
+ * @author Merov Linden
+ * @brief User customizable toolbar class
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "lltoolbarview.h"
+
+#include "llappviewer.h"
+#include "llbutton.h"
+#include "llclipboard.h"
+#include "lldir.h"
+#include "lldockablefloater.h"
+#include "lldockcontrol.h"
+#include "llimview.h"
+#include "lltransientfloatermgr.h"
+#include "lltoolbar.h"
+#include "lltooldraganddrop.h"
+#include "llxmlnode.h"
+
+#include "llagent.h" // HACK for destinations guide on startup
+#include "llfloaterreg.h" // HACK for destinations guide on startup
+#include "llviewercontrol.h" // HACK for destinations guide on startup
+
+#include <boost/foreach.hpp>
+
+LLToolBarView* gToolBarView = NULL;
+
+static LLDefaultChildRegistry::Register<LLToolBarView> r("toolbar_view");
+
+void handleLoginToolbarSetup();
+
+bool isToolDragged()
+{
+ return (LLToolDragAndDrop::getInstance()->getSource() == LLToolDragAndDrop::SOURCE_VIEWER);
+}
+
+LLToolBarView::Toolbar::Toolbar()
+: button_display_mode("button_display_mode"),
+ commands("command")
+{}
+
+LLToolBarView::ToolbarSet::ToolbarSet()
+: left_toolbar("left_toolbar"),
+ right_toolbar("right_toolbar"),
+ bottom_toolbar("bottom_toolbar")
+{}
+
+
+LLToolBarView::LLToolBarView(const LLToolBarView::Params& p)
+: LLUICtrl(p),
+ mDragStarted(false),
+ mShowToolbars(true),
+ mDragToolbarButton(NULL),
+ mToolbarsLoaded(false)
+{
+ for (S32 i = 0; i < TOOLBAR_COUNT; i++)
+ {
+ mToolbars[i] = NULL;
+ }
+}
+
+void LLToolBarView::initFromParams(const LLToolBarView::Params& p)
+{
+ // Initialize the base object
+ LLUICtrl::initFromParams(p);
+}
+
+LLToolBarView::~LLToolBarView()
+{
+ saveToolbars();
+}
+
+BOOL LLToolBarView::postBuild()
+{
+ mToolbars[TOOLBAR_LEFT] = getChild<LLToolBar>("toolbar_left");
+ mToolbars[TOOLBAR_RIGHT] = getChild<LLToolBar>("toolbar_right");
+ mToolbars[TOOLBAR_BOTTOM] = getChild<LLToolBar>("toolbar_bottom");
+
+ for (int i = TOOLBAR_FIRST; i <= TOOLBAR_LAST; i++)
+ {
+ mToolbars[i]->setStartDragCallback(boost::bind(LLToolBarView::startDragTool,_1,_2,_3));
+ mToolbars[i]->setHandleDragCallback(boost::bind(LLToolBarView::handleDragTool,_1,_2,_3,_4));
+ mToolbars[i]->setHandleDropCallback(boost::bind(LLToolBarView::handleDropTool,_1,_2,_3,_4));
+ mToolbars[i]->setButtonAddCallback(boost::bind(LLToolBarView::onToolBarButtonAdded,_1));
+ mToolbars[i]->setButtonRemoveCallback(boost::bind(LLToolBarView::onToolBarButtonRemoved,_1));
+ }
+
+ LLAppViewer::instance()->setOnLoginCompletedCallback(boost::bind(&handleLoginToolbarSetup));
+
+ return TRUE;
+}
+
+S32 LLToolBarView::hasCommand(const LLCommandId& commandId) const
+{
+ S32 command_location = TOOLBAR_NONE;
+
+ for (S32 loc = TOOLBAR_FIRST; loc <= TOOLBAR_LAST; loc++)
+ {
+ if (mToolbars[loc]->hasCommand(commandId))
+ {
+ command_location = loc;
+ break;
+ }
+ }
+
+ return command_location;
+}
+
+S32 LLToolBarView::addCommand(const LLCommandId& commandId, EToolBarLocation toolbar, int rank)
+{
+ int old_rank;
+ removeCommand(commandId, old_rank);
+
+ S32 command_location = mToolbars[toolbar]->addCommand(commandId, rank);
+
+ return command_location;
+}
+
+S32 LLToolBarView::removeCommand(const LLCommandId& commandId, int& rank)
+{
+ S32 command_location = hasCommand(commandId);
+ rank = LLToolBar::RANK_NONE;
+
+ if (command_location != TOOLBAR_NONE)
+ {
+ rank = mToolbars[command_location]->removeCommand(commandId);
+ }
+
+ return command_location;
+}
+
+S32 LLToolBarView::enableCommand(const LLCommandId& commandId, bool enabled)
+{
+ S32 command_location = hasCommand(commandId);
+
+ if (command_location != TOOLBAR_NONE)
+ {
+ mToolbars[command_location]->enableCommand(commandId, enabled);
+ }
+
+ return command_location;
+}
+
+S32 LLToolBarView::stopCommandInProgress(const LLCommandId& commandId)
+{
+ S32 command_location = hasCommand(commandId);
+
+ if (command_location != TOOLBAR_NONE)
+ {
+ mToolbars[command_location]->stopCommandInProgress(commandId);
+ }
+
+ return command_location;
+}
+
+S32 LLToolBarView::flashCommand(const LLCommandId& commandId, bool flash)
+{
+ S32 command_location = hasCommand(commandId);
+
+ if (command_location != TOOLBAR_NONE)
+ {
+ mToolbars[command_location]->flashCommand(commandId, flash);
+ }
+
+ return command_location;
+}
+
+bool LLToolBarView::addCommandInternal(const LLCommandId& command, LLToolBar* toolbar)
+{
+ LLCommandManager& mgr = LLCommandManager::instance();
+ if (mgr.getCommand(command))
+ {
+ toolbar->addCommand(command);
+ }
+ else
+ {
+ llwarns << "Toolbars creation : the command with id " << command.uuid().asString() << " cannot be found in the command manager" << llendl;
+ return false;
+ }
+ return true;
+}
+
+bool LLToolBarView::loadToolbars(bool force_default)
+{
+ LLToolBarView::ToolbarSet toolbar_set;
+ bool err = false;
+
+ // Load the toolbars.xml file
+ std::string toolbar_file = gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, "toolbars.xml");
+ if (force_default)
+ {
+ toolbar_file = gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "toolbars.xml");
+ }
+ else if (!gDirUtilp->fileExists(toolbar_file))
+ {
+ llwarns << "User toolbars def not found -> use default" << llendl;
+ toolbar_file = gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "toolbars.xml");
+ }
+
+ LLXMLNodePtr root;
+ if(!LLXMLNode::parseFile(toolbar_file, root, NULL))
+ {
+ llwarns << "Unable to load toolbars from file: " << toolbar_file << llendl;
+ err = true;
+ }
+
+ if (!err && !root->hasName("toolbars"))
+ {
+ llwarns << toolbar_file << " is not a valid toolbars definition file" << llendl;
+ err = true;
+ }
+
+ // Parse the toolbar settings
+ LLXUIParser parser;
+ if (!err)
+ {
+ parser.readXUI(root, toolbar_set, toolbar_file);
+ }
+ if (!err && !toolbar_set.validateBlock())
+ {
+ llwarns << "Unable to validate toolbars from file: " << toolbar_file << llendl;
+ err = true;
+ }
+
+ if (err)
+ {
+ if (force_default)
+ {
+ llerrs << "Unable to load toolbars from default file : " << toolbar_file << llendl;
+ return false;
+ }
+ // Try to load the default toolbars
+ return loadToolbars(true);
+ }
+
+ // Clear the toolbars now before adding the loaded commands and settings
+ for (S32 i = TOOLBAR_FIRST; i <= TOOLBAR_LAST; i++)
+ {
+ if (mToolbars[i])
+ {
+ mToolbars[i]->clearCommandsList();
+ }
+ }
+
+ // Add commands to each toolbar
+ if (toolbar_set.left_toolbar.isProvided() && mToolbars[TOOLBAR_LEFT])
+ {
+ if (toolbar_set.left_toolbar.button_display_mode.isProvided())
+ {
+ LLToolBarEnums::ButtonType button_type = toolbar_set.left_toolbar.button_display_mode;
+ mToolbars[TOOLBAR_LEFT]->setButtonType(button_type);
+ }
+ BOOST_FOREACH(const LLCommandId::Params& command_params, toolbar_set.left_toolbar.commands)
+ {
+ if (addCommandInternal(LLCommandId(command_params), mToolbars[TOOLBAR_LEFT]))
+ {
+ llwarns << "Error adding command '" << command_params.name() << "' to left toolbar." << llendl;
+ }
+ }
+ }
+ if (toolbar_set.right_toolbar.isProvided() && mToolbars[TOOLBAR_RIGHT])
+ {
+ if (toolbar_set.right_toolbar.button_display_mode.isProvided())
+ {
+ LLToolBarEnums::ButtonType button_type = toolbar_set.right_toolbar.button_display_mode;
+ mToolbars[TOOLBAR_RIGHT]->setButtonType(button_type);
+ }
+ BOOST_FOREACH(const LLCommandId::Params& command_params, toolbar_set.right_toolbar.commands)
+ {
+ if (addCommandInternal(LLCommandId(command_params), mToolbars[TOOLBAR_RIGHT]))
+ {
+ llwarns << "Error adding command '" << command_params.name() << "' to right toolbar." << llendl;
+ }
+ }
+ }
+ if (toolbar_set.bottom_toolbar.isProvided() && mToolbars[TOOLBAR_BOTTOM])
+ {
+ if (toolbar_set.bottom_toolbar.button_display_mode.isProvided())
+ {
+ LLToolBarEnums::ButtonType button_type = toolbar_set.bottom_toolbar.button_display_mode;
+ mToolbars[TOOLBAR_BOTTOM]->setButtonType(button_type);
+ }
+ BOOST_FOREACH(const LLCommandId::Params& command_params, toolbar_set.bottom_toolbar.commands)
+ {
+ if (addCommandInternal(LLCommandId(command_params), mToolbars[TOOLBAR_BOTTOM]))
+ {
+ llwarns << "Error adding command '" << command_params.name() << "' to bottom toolbar." << llendl;
+ }
+ }
+ }
+ mToolbarsLoaded = true;
+ return true;
+}
+
+bool LLToolBarView::clearToolbars()
+{
+ for (S32 i = TOOLBAR_FIRST; i <= TOOLBAR_LAST; i++)
+ {
+ if (mToolbars[i])
+ {
+ mToolbars[i]->clearCommandsList();
+ }
+ }
+
+ return true;
+}
+
+//static
+bool LLToolBarView::loadDefaultToolbars()
+{
+ bool retval = false;
+
+ if (gToolBarView)
+ {
+ retval = gToolBarView->loadToolbars(true);
+ if (retval)
+ {
+ gToolBarView->saveToolbars();
+ }
+ }
+
+ return retval;
+}
+
+//static
+bool LLToolBarView::clearAllToolbars()
+{
+ bool retval = false;
+
+ if (gToolBarView)
+ {
+ retval = gToolBarView->clearToolbars();
+ if (retval)
+ {
+ gToolBarView->saveToolbars();
+ }
+ }
+
+ return retval;
+}
+
+void LLToolBarView::saveToolbars() const
+{
+ if (!mToolbarsLoaded)
+ return;
+
+ // Build the parameter tree from the toolbar data
+ LLToolBarView::ToolbarSet toolbar_set;
+ if (mToolbars[TOOLBAR_LEFT])
+ {
+ toolbar_set.left_toolbar.button_display_mode = mToolbars[TOOLBAR_LEFT]->getButtonType();
+ addToToolset(mToolbars[TOOLBAR_LEFT]->getCommandsList(), toolbar_set.left_toolbar);
+ }
+ if (mToolbars[TOOLBAR_RIGHT])
+ {
+ toolbar_set.right_toolbar.button_display_mode = mToolbars[TOOLBAR_RIGHT]->getButtonType();
+ addToToolset(mToolbars[TOOLBAR_RIGHT]->getCommandsList(), toolbar_set.right_toolbar);
+ }
+ if (mToolbars[TOOLBAR_BOTTOM])
+ {
+ toolbar_set.bottom_toolbar.button_display_mode = mToolbars[TOOLBAR_BOTTOM]->getButtonType();
+ addToToolset(mToolbars[TOOLBAR_BOTTOM]->getCommandsList(), toolbar_set.bottom_toolbar);
+ }
+
+ // Serialize the parameter tree
+ LLXMLNodePtr output_node = new LLXMLNode("toolbars", false);
+ LLXUIParser parser;
+ parser.writeXUI(output_node, toolbar_set);
+
+ // Write the resulting XML to file
+ if(!output_node->isNull())
+ {
+ const std::string& filename = gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, "toolbars.xml");
+ LLFILE *fp = LLFile::fopen(filename, "w");
+ if (fp != NULL)
+ {
+ LLXMLNode::writeHeaderToFile(fp);
+ output_node->writeToFile(fp);
+ fclose(fp);
+ }
+ }
+}
+
+// Enumerate the commands in command_list and add them as Params to the toolbar
+void LLToolBarView::addToToolset(command_id_list_t& command_list, Toolbar& toolbar) const
+{
+ LLCommandManager& mgr = LLCommandManager::instance();
+
+ for (command_id_list_t::const_iterator it = command_list.begin();
+ it != command_list.end();
+ ++it)
+ {
+ LLCommand* command = mgr.getCommand(*it);
+ if (command)
+ {
+ LLCommandId::Params command_name_param;
+ command_name_param.name = command->name();
+ toolbar.commands.add(command_name_param);
+ }
+ }
+}
+
+void LLToolBarView::onToolBarButtonAdded(LLView* button)
+{
+ llassert(button);
+
+ if (button->getName() == "speak")
+ {
+ // Add the "Speak" button as a control view in LLTransientFloaterMgr
+ // to prevent hiding the transient IM floater upon pressing "Speak".
+ LLTransientFloaterMgr::getInstance()->addControlView(button);
+
+ // Redock incoming and/or outgoing call windows, if applicable
+
+ LLFloater* incoming_floater = LLFloaterReg::getLastFloaterInGroup("incoming_call");
+ LLFloater* outgoing_floater = LLFloaterReg::getLastFloaterInGroup("outgoing_call");
+
+ if (incoming_floater && incoming_floater->isShown())
+ {
+ LLCallDialog* incoming = dynamic_cast<LLCallDialog *>(incoming_floater);
+ llassert(incoming);
+
+ LLDockControl* dock_control = incoming->getDockControl();
+ if (dock_control->getDock() == NULL)
+ {
+ incoming->dockToToolbarButton("speak");
+ }
+ }
+
+ if (outgoing_floater && outgoing_floater->isShown())
+ {
+ LLCallDialog* outgoing = dynamic_cast<LLCallDialog *>(outgoing_floater);
+ llassert(outgoing);
+
+ LLDockControl* dock_control = outgoing->getDockControl();
+ if (dock_control->getDock() == NULL)
+ {
+ outgoing->dockToToolbarButton("speak");
+ }
+ }
+ }
+ else if (button->getName() == "voice")
+ {
+ // Add the "Voice controls" button as a control view in LLTransientFloaterMgr
+ // to prevent hiding the transient IM floater upon pressing "Voice controls".
+ LLTransientFloaterMgr::getInstance()->addControlView(button);
+ }
+}
+
+void LLToolBarView::onToolBarButtonRemoved(LLView* button)
+{
+ llassert(button);
+
+ if (button->getName() == "speak")
+ {
+ LLTransientFloaterMgr::getInstance()->removeControlView(button);
+
+ // Undock incoming and/or outgoing call windows
+
+ LLFloater* incoming_floater = LLFloaterReg::getLastFloaterInGroup("incoming_call");
+ LLFloater* outgoing_floater = LLFloaterReg::getLastFloaterInGroup("outgoing_call");
+
+ if (incoming_floater && incoming_floater->isShown())
+ {
+ LLDockableFloater* incoming = dynamic_cast<LLDockableFloater *>(incoming_floater);
+ llassert(incoming);
+
+ LLDockControl* dock_control = incoming->getDockControl();
+ dock_control->setDock(NULL);
+ }
+
+ if (outgoing_floater && outgoing_floater->isShown())
+ {
+ LLDockableFloater* outgoing = dynamic_cast<LLDockableFloater *>(outgoing_floater);
+ llassert(outgoing);
+
+ LLDockControl* dock_control = outgoing->getDockControl();
+ dock_control->setDock(NULL);
+ }
+ }
+ else if (button->getName() == "voice")
+ {
+ LLTransientFloaterMgr::getInstance()->removeControlView(button);
+ }
+}
+
+void LLToolBarView::draw()
+{
+ LLRect toolbar_rects[TOOLBAR_COUNT];
+
+ for (S32 i = TOOLBAR_FIRST; i <= TOOLBAR_LAST; i++)
+ {
+ if (mToolbars[i])
+ {
+ LLLayoutStack::ELayoutOrientation orientation = LLToolBarEnums::getOrientation(mToolbars[i]->getSideType());
+
+ if (orientation == LLLayoutStack::HORIZONTAL)
+ {
+ mToolbars[i]->getParent()->reshape(mToolbars[i]->getParent()->getRect().getWidth(), mToolbars[i]->getRect().getHeight());
+ }
+ else
+ {
+ mToolbars[i]->getParent()->reshape(mToolbars[i]->getRect().getWidth(), mToolbars[i]->getParent()->getRect().getHeight());
+ }
+
+ mToolbars[i]->localRectToOtherView(mToolbars[i]->getLocalRect(), &toolbar_rects[i], this);
+ }
+ }
+
+ for (S32 i = TOOLBAR_FIRST; i <= TOOLBAR_LAST; i++)
+ {
+ mToolbars[i]->getParent()->setVisible(mShowToolbars
+ && (mToolbars[i]->hasButtons()
+ || isToolDragged()));
+ }
+
+ // Draw drop zones if drop of a tool is active
+ if (isToolDragged())
+ {
+ LLColor4 drop_color = LLUIColorTable::instance().getColor( "ToolbarDropZoneColor" );
+
+ for (S32 i = TOOLBAR_FIRST; i <= TOOLBAR_LAST; i++)
+ {
+ gl_rect_2d(toolbar_rects[i], drop_color, TRUE);
+ }
+ }
+
+ LLUICtrl::draw();
+}
+
+
+// ----------------------------------------
+// Drag and Drop Handling
+// ----------------------------------------
+
+
+void LLToolBarView::startDragTool(S32 x, S32 y, LLToolBarButton* toolbarButton)
+{
+ resetDragTool(toolbarButton);
+
+ // Flag the tool dragging but don't start it yet
+ LLToolDragAndDrop::getInstance()->setDragStart( x, y );
+}
+
+BOOL LLToolBarView::handleDragTool( S32 x, S32 y, const LLUUID& uuid, LLAssetType::EType type)
+{
+ if (LLToolDragAndDrop::getInstance()->isOverThreshold( x, y ))
+ {
+ if (!gToolBarView->mDragStarted)
+ {
+ // Start the tool dragging:
+
+ // First, create the global drag and drop object
+ std::vector<EDragAndDropType> types;
+ uuid_vec_t cargo_ids;
+ types.push_back(DAD_WIDGET);
+ cargo_ids.push_back(uuid);
+ gClipboard.setSourceObject(uuid,LLAssetType::AT_WIDGET);
+ LLToolDragAndDrop::ESource src = LLToolDragAndDrop::SOURCE_VIEWER;
+ LLUUID srcID;
+ LLToolDragAndDrop::getInstance()->beginMultiDrag(types, cargo_ids, src, srcID);
+
+ // Second, stop the command if it is in progress and requires stopping!
+ LLCommandId command_id = LLCommandId(uuid);
+ gToolBarView->stopCommandInProgress(command_id);
+
+ gToolBarView->mDragStarted = true;
+ return TRUE;
+ }
+ else
+ {
+ MASK mask = 0;
+ return LLToolDragAndDrop::getInstance()->handleHover( x, y, mask );
+ }
+ }
+ return FALSE;
+}
+
+BOOL LLToolBarView::handleDropTool( void* cargo_data, S32 x, S32 y, LLToolBar* toolbar)
+{
+ BOOL handled = FALSE;
+ LLInventoryItem* inv_item = (LLInventoryItem*)cargo_data;
+
+ LLAssetType::EType type = inv_item->getType();
+ if (type == LLAssetType::AT_WIDGET)
+ {
+ handled = TRUE;
+ // Get the command from its uuid
+ LLCommandManager& mgr = LLCommandManager::instance();
+ LLCommandId command_id(inv_item->getUUID());
+ LLCommand* command = mgr.getCommand(command_id);
+ if (command)
+ {
+ // Suppress the command from the toolbars (including the one it's dropped in,
+ // this will handle move position).
+ S32 old_toolbar_loc = gToolBarView->hasCommand(command_id);
+ LLToolBar* old_toolbar = NULL;
+
+ if (old_toolbar_loc != TOOLBAR_NONE)
+ {
+ llassert(gToolBarView->mDragToolbarButton);
+ old_toolbar = gToolBarView->mDragToolbarButton->getParentByType<LLToolBar>();
+ if (old_toolbar->isReadOnly() && toolbar->isReadOnly())
+ {
+ // do nothing
+ }
+ else
+ {
+ int old_rank = LLToolBar::RANK_NONE;
+ gToolBarView->removeCommand(command_id, old_rank);
+ }
+ }
+
+ // Convert the (x,y) position in rank in toolbar
+ if (!toolbar->isReadOnly())
+ {
+ int new_rank = toolbar->getRankFromPosition(x,y);
+ toolbar->addCommand(command_id, new_rank);
+ }
+
+ // Save the new toolbars configuration
+ gToolBarView->saveToolbars();
+ }
+ else
+ {
+ llwarns << "Command couldn't be found in command manager" << llendl;
+ }
+ }
+
+ resetDragTool(NULL);
+ return handled;
+}
+
+void LLToolBarView::resetDragTool(LLToolBarButton* toolbarButton)
+{
+ // Clear the saved command, toolbar and rank
+ gToolBarView->mDragStarted = false;
+ gToolBarView->mDragToolbarButton = toolbarButton;
+}
+
+void LLToolBarView::setToolBarsVisible(bool visible)
+{
+ mShowToolbars = visible;
+}
+
+bool LLToolBarView::isModified() const
+{
+ bool modified = false;
+
+ for (S32 i = TOOLBAR_FIRST; i <= TOOLBAR_LAST; i++)
+ {
+ modified |= mToolbars[i]->isModified();
+ }
+
+ return modified;
+}
+
+
+//
+// HACK to bring up destinations guide at startup
+//
+
+void handleLoginToolbarSetup()
+{
+ // Open the destinations guide by default on first login, per Rhett
+ if (gSavedPerAccountSettings.getBOOL("DisplayDestinationsOnInitialRun") || gAgent.isFirstLogin())
+ {
+ LLFloaterReg::showInstance("destinations");
+
+ gSavedPerAccountSettings.setBOOL("DisplayDestinationsOnInitialRun", FALSE);
+ }
+}
+
diff --git a/indra/newview/lltoolbarview.h b/indra/newview/lltoolbarview.h
new file mode 100644
index 0000000000..be66bcae36
--- /dev/null
+++ b/indra/newview/lltoolbarview.h
@@ -0,0 +1,137 @@
+/**
+ * @file lltoolbarview.h
+ * @author Merov Linden
+ * @brief User customizable toolbar class
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLTOOLBARVIEW_H
+#define LL_LLTOOLBARVIEW_H
+
+#include "lluictrl.h"
+#include "lltoolbar.h"
+#include "llcommandmanager.h"
+
+class LLUICtrlFactory;
+
+// Parent of all LLToolBar
+
+class LLToolBarView : public LLUICtrl
+{
+public:
+ typedef enum
+ {
+ TOOLBAR_NONE = 0,
+ TOOLBAR_LEFT,
+ TOOLBAR_RIGHT,
+ TOOLBAR_BOTTOM,
+
+ TOOLBAR_COUNT,
+
+ TOOLBAR_FIRST = TOOLBAR_LEFT,
+ TOOLBAR_LAST = TOOLBAR_BOTTOM,
+ } EToolBarLocation;
+
+ // Xui structure of the toolbar panel
+ struct Params : public LLInitParam::Block<Params, LLUICtrl::Params> {};
+
+ // Note: valid children for LLToolBarView are stored in this registry
+ typedef LLDefaultChildRegistry child_registry_t;
+
+ // Xml structure of the toolbars.xml setting
+ // Those live in a toolbars.xml found in app_settings (for the default) and in
+ // the user folder for the user specific (saved) settings
+ struct Toolbar : public LLInitParam::Block<Toolbar>
+ {
+ Mandatory<LLToolBarEnums::ButtonType> button_display_mode;
+ Multiple<LLCommandId::Params> commands;
+
+ Toolbar();
+ };
+ struct ToolbarSet : public LLInitParam::Block<ToolbarSet>
+ {
+ Optional<Toolbar> left_toolbar,
+ right_toolbar,
+ bottom_toolbar;
+
+ ToolbarSet();
+ };
+
+ // Derived methods
+ virtual ~LLToolBarView();
+ virtual BOOL postBuild();
+ virtual void draw();
+
+ // Toolbar view interface with the rest of the world
+ // Checks if the commandId is being used somewhere in one of the toolbars, returns EToolBarLocation
+ S32 hasCommand(const LLCommandId& commandId) const;
+ S32 addCommand(const LLCommandId& commandId, EToolBarLocation toolbar, int rank = LLToolBar::RANK_NONE);
+ S32 removeCommand(const LLCommandId& commandId, int& rank); // Sets the rank the removed command was at, RANK_NONE if not found
+ S32 enableCommand(const LLCommandId& commandId, bool enabled);
+ S32 stopCommandInProgress(const LLCommandId& commandId);
+ S32 flashCommand(const LLCommandId& commandId, bool flash);
+
+ // Loads the toolbars from the existing user or default settings
+ bool loadToolbars(bool force_default = false); // return false if load fails
+
+ // Clears all buttons off the toolbars
+ bool clearToolbars();
+
+ void setToolBarsVisible(bool visible);
+
+ static bool loadDefaultToolbars();
+ static bool clearAllToolbars();
+
+ static void startDragTool(S32 x, S32 y, LLToolBarButton* toolbarButton);
+ static BOOL handleDragTool(S32 x, S32 y, const LLUUID& uuid, LLAssetType::EType type);
+ static BOOL handleDropTool(void* cargo_data, S32 x, S32 y, LLToolBar* toolbar);
+ static void resetDragTool(LLToolBarButton* toolbarButton);
+
+ bool isModified() const;
+
+protected:
+ friend class LLUICtrlFactory;
+ LLToolBarView(const Params&);
+
+ void initFromParams(const Params&);
+
+private:
+ void saveToolbars() const;
+ bool addCommandInternal(const LLCommandId& commandId, LLToolBar* toolbar);
+ void addToToolset(command_id_list_t& command_list, Toolbar& toolbar) const;
+
+ static void onToolBarButtonAdded(LLView* button);
+ static void onToolBarButtonRemoved(LLView* button);
+
+ // Pointers to the toolbars handled by the toolbar view
+ LLToolBar* mToolbars[TOOLBAR_COUNT];
+ bool mToolbarsLoaded;
+
+ bool mDragStarted;
+ LLToolBarButton* mDragToolbarButton;
+ bool mShowToolbars;
+};
+
+extern LLToolBarView* gToolBarView;
+
+#endif // LL_LLTOOLBARVIEW_H
diff --git a/indra/newview/lltoolbrush.cpp b/indra/newview/lltoolbrush.cpp
index 9782b90cf1..aba43a9715 100644
--- a/indra/newview/lltoolbrush.cpp
+++ b/indra/newview/lltoolbrush.cpp
@@ -507,12 +507,12 @@ void LLToolBrushLand::render()
void LLToolBrushLand::renderOverlay(LLSurface& land, const LLVector3& pos_region,
const LLVector3& pos_world)
{
- glMatrixMode(GL_MODELVIEW);
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
LLGLDepthTest mDepthTest(GL_TRUE);
- glPushMatrix();
+ gGL.pushMatrix();
gGL.color4fv(OVERLAY_COLOR.mV);
- glTranslatef(0.0f, 0.0f, 1.0f);
+ gGL.translatef(0.0f, 0.0f, 1.0f);
S32 i = (S32) pos_region.mV[VX];
S32 j = (S32) pos_region.mV[VY];
@@ -566,7 +566,7 @@ void LLToolBrushLand::renderOverlay(LLSurface& land, const LLVector3& pos_region
}
gGL.end();
- glPopMatrix();
+ gGL.popMatrix();
}
void LLToolBrushLand::determineAffectedRegions(region_list_t& regions,
diff --git a/indra/newview/lltooldraganddrop.cpp b/indra/newview/lltooldraganddrop.cpp
index 3e5ce427a8..8c32dfcb4d 100644
--- a/indra/newview/lltooldraganddrop.cpp
+++ b/indra/newview/lltooldraganddrop.cpp
@@ -57,6 +57,7 @@
#include "llviewerwindow.h"
#include "llvoavatarself.h"
#include "llworld.h"
+#include "llclipboard.h"
// syntactic sugar
#define callMemberFunction(object,ptrToMember) ((object).*(ptrToMember))
@@ -281,6 +282,8 @@ void LLCategoryDropDescendentsObserver::done()
}
*/
+S32 LLToolDragAndDrop::sOperationId = 0;
+
LLToolDragAndDrop::DragAndDropEntry::DragAndDropEntry(dragOrDrop3dImpl f_none,
dragOrDrop3dImpl f_self,
dragOrDrop3dImpl f_avatar,
@@ -625,6 +628,8 @@ BOOL LLToolDragAndDrop::handleToolTip(S32 x, S32 y, MASK mask)
void LLToolDragAndDrop::handleDeselect()
{
mToolTipMsg.clear();
+
+ LLToolTipMgr::instance().blockToolTips();
}
// protected
@@ -641,6 +646,12 @@ void LLToolDragAndDrop::dragOrDrop( S32 x, S32 y, MASK mask, BOOL drop,
mToolTipMsg.clear();
+ // Increment the operation id for every drop
+ if (drop)
+ {
+ sOperationId++;
+ }
+
if (top_view)
{
handled = TRUE;
@@ -766,6 +777,21 @@ void LLToolDragAndDrop::dragOrDrop( S32 x, S32 y, MASK mask, BOOL drop,
if (!handled)
{
+ // Disallow drag and drop to 3D from the outbox
+ const LLUUID outbox_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_OUTBOX, false, false);
+ if (outbox_id.notNull())
+ {
+ for (S32 item_index = 0; item_index < (S32)mCargoIDs.size(); item_index++)
+ {
+ if (gInventory.isObjectDescendentOf(mCargoIDs[item_index], outbox_id))
+ {
+ *acceptance = ACCEPT_NO;
+ mToolTipMsg = LLTrans::getString("TooltipOutboxDragToWorld");
+ return;
+ }
+ }
+ }
+
dragOrDrop3D( x, y, mask, drop, acceptance );
}
}
@@ -802,7 +828,7 @@ void LLToolDragAndDrop::pick(const LLPickInfo& pick_info)
LLViewerObject* hit_obj = pick_info.getObject();
LLSelectMgr::getInstance()->unhighlightAll();
-
+ bool highlight_object = false;
// Treat attachments as part of the avatar they are attached to.
if (hit_obj != NULL)
{
@@ -844,16 +870,7 @@ void LLToolDragAndDrop::pick(const LLPickInfo& pick_info)
{
target = DT_OBJECT;
hit_face = pick_info.mObjectFace;
- // if any item being dragged will be applied to the object under our cursor
- // highlight that object
- for (S32 i = 0; i < (S32)mCargoIDs.size(); i++)
- {
- if (mCargoTypes[i] != DAD_OBJECT || (pick_info.mKeyMask & MASK_CONTROL))
- {
- LLSelectMgr::getInstance()->highlightObjectAndFamily(hit_obj);
- break;
- }
- }
+ highlight_object = true;
}
}
else if (pick_info.mPickType == LLPickInfo::PICK_LAND)
@@ -873,7 +890,7 @@ void LLToolDragAndDrop::pick(const LLPickInfo& pick_info)
(U32)mLastAccept,
(U32)callMemberFunction(*this,
LLDragAndDropDictionary::instance().get(dad_type, target))
- (hit_obj, hit_face, pick_info.mKeyMask, FALSE));
+ (hit_obj, hit_face, pick_info.mKeyMask, FALSE));
}
if (mDrop && ((U32)mLastAccept >= ACCEPT_YES_COPY_SINGLE))
@@ -899,6 +916,19 @@ void LLToolDragAndDrop::pick(const LLPickInfo& pick_info)
}
}
+ if (highlight_object && mLastAccept > ACCEPT_NO_LOCKED)
+ {
+ // if any item being dragged will be applied to the object under our cursor
+ // highlight that object
+ for (S32 i = 0; i < (S32)mCargoIDs.size(); i++)
+ {
+ if (mCargoTypes[i] != DAD_OBJECT || (pick_info.mKeyMask & MASK_CONTROL))
+ {
+ LLSelectMgr::getInstance()->highlightObjectAndFamily(hit_obj);
+ break;
+ }
+ }
+ }
ECursorType cursor = acceptanceToCursor( mLastAccept );
gViewerWindow->getWindow()->setCursor( cursor );
@@ -2495,6 +2525,10 @@ LLInventoryObject* LLToolDragAndDrop::locateInventory(
item = (LLViewerInventoryItem*)preview->getDragItem();
}
}
+ else if(mSource == SOURCE_VIEWER)
+ {
+ item = (LLViewerInventoryItem*)gClipboard.getSourceObject();
+ }
if(item) return item;
if(cat) return cat;
return NULL;
diff --git a/indra/newview/lltooldraganddrop.h b/indra/newview/lltooldraganddrop.h
index 7b8cce3dc7..188d36cd1b 100644
--- a/indra/newview/lltooldraganddrop.h
+++ b/indra/newview/lltooldraganddrop.h
@@ -66,7 +66,8 @@ public:
SOURCE_AGENT,
SOURCE_WORLD,
SOURCE_NOTECARD,
- SOURCE_LIBRARY
+ SOURCE_LIBRARY,
+ SOURCE_VIEWER
};
void beginDrag(EDragAndDropType type,
@@ -85,6 +86,9 @@ public:
EAcceptance getLastAccept() { return mLastAccept; }
boost::signals2::connection setEndDragCallback( const enddrag_signal_t::slot_type& cb ) { return mEndDragSignal.connect(cb); }
+
+ uuid_vec_t::size_type getCargoIDsCount() const { return mCargoIDs.size(); }
+ static S32 getOperationId() { return sOperationId; }
protected:
enum EDropTarget
@@ -124,6 +128,8 @@ protected:
LLUUID mSourceID;
LLUUID mObjectID;
+ static S32 sOperationId;
+
LLVector3d mLastCameraPos;
LLVector3d mLastHitPos;
diff --git a/indra/newview/lltoolgun.cpp b/indra/newview/lltoolgun.cpp
index 68af3d73d2..857d105361 100644
--- a/indra/newview/lltoolgun.cpp
+++ b/indra/newview/lltoolgun.cpp
@@ -56,7 +56,7 @@ void LLToolGun::handleSelect()
{
gViewerWindow->hideCursor();
gViewerWindow->moveCursorToCenter();
- gViewerWindow->mWindow->setMouseClipping(TRUE);
+ gViewerWindow->getWindow()->setMouseClipping(TRUE);
mIsSelected = TRUE;
}
@@ -64,7 +64,7 @@ void LLToolGun::handleDeselect()
{
gViewerWindow->moveCursorToCenter();
gViewerWindow->showCursor();
- gViewerWindow->mWindow->setMouseClipping(FALSE);
+ gViewerWindow->getWindow()->setMouseClipping(FALSE);
mIsSelected = FALSE;
}
diff --git a/indra/newview/lltoolmgr.cpp b/indra/newview/lltoolmgr.cpp
index 51c0e2eeed..6bc7c6de11 100644
--- a/indra/newview/lltoolmgr.cpp
+++ b/indra/newview/lltoolmgr.cpp
@@ -247,24 +247,10 @@ bool LLToolMgr::canEdit()
void LLToolMgr::toggleBuildMode()
{
- if (inBuildMode())
- {
- if (gSavedSettings.getBOOL("EditCameraMovement"))
- {
- // just reset the view, will pull us out of edit mode
- handle_reset_view();
- }
- else
- {
- // manually disable edit mode, but do not affect the camera
- gAgentCamera.resetView(false);
- LLFloaterReg::hideInstance("build");
- gViewerWindow->showCursor();
- }
- // avoid spurious avatar movements pulling out of edit mode
- LLViewerJoystick::getInstance()->setNeedsReset();
- }
- else
+ LLFloaterReg::toggleInstanceOrBringToFront("build");
+
+ bool build_visible = LLFloaterReg::instanceVisible("build");
+ if (build_visible)
{
ECameraMode camMode = gAgentCamera.getCameraMode();
if (CAMERA_MODE_MOUSELOOK == camMode || CAMERA_MODE_CUSTOMIZE_AVATAR == camMode)
@@ -291,7 +277,7 @@ void LLToolMgr::toggleBuildMode()
}
}
-
+
setCurrentToolset(gBasicToolset);
getCurrentToolset()->selectTool( LLToolCompCreate::getInstance() );
@@ -304,6 +290,24 @@ void LLToolMgr::toggleBuildMode()
LLViewerJoystick::getInstance()->setNeedsReset();
}
+ else
+ {
+ if (gSavedSettings.getBOOL("EditCameraMovement"))
+ {
+ // just reset the view, will pull us out of edit mode
+ handle_reset_view();
+ }
+ else
+ {
+ // manually disable edit mode, but do not affect the camera
+ gAgentCamera.resetView(false);
+ LLFloaterReg::hideInstance("build");
+ gViewerWindow->showCursor();
+ }
+ // avoid spurious avatar movements pulling out of edit mode
+ LLViewerJoystick::getInstance()->setNeedsReset();
+ }
+
}
bool LLToolMgr::inBuildMode()
diff --git a/indra/newview/lltoolmorph.cpp b/indra/newview/lltoolmorph.cpp
index 964b17d3a6..718201e381 100644
--- a/indra/newview/lltoolmorph.cpp
+++ b/indra/newview/lltoolmorph.cpp
@@ -169,23 +169,28 @@ BOOL LLVisualParamHint::render()
gGL.pushUIMatrix();
gGL.loadUIIdentity();
- glMatrixMode(GL_PROJECTION);
+ gGL.matrixMode(LLRender::MM_PROJECTION);
gGL.pushMatrix();
- glLoadIdentity();
- glOrtho(0.0f, mFullWidth, 0.0f, mFullHeight, -1.0f, 1.0f);
+ gGL.loadIdentity();
+ gGL.ortho(0.0f, mFullWidth, 0.0f, mFullHeight, -1.0f, 1.0f);
- glMatrixMode(GL_MODELVIEW);
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
gGL.pushMatrix();
- glLoadIdentity();
+ gGL.loadIdentity();
+
+ if (LLGLSLShader::sNoFixedFunction)
+ {
+ gUIProgram.bind();
+ }
LLGLSUIDefault gls_ui;
//LLGLState::verify(TRUE);
mBackgroundp->draw(0, 0, mFullWidth, mFullHeight);
- glMatrixMode(GL_PROJECTION);
+ gGL.matrixMode(LLRender::MM_PROJECTION);
gGL.popMatrix();
- glMatrixMode(GL_MODELVIEW);
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
gGL.popMatrix();
mNeedsUpdate = FALSE;
diff --git a/indra/newview/lltoolpie.cpp b/indra/newview/lltoolpie.cpp
index c38c8bad80..b0d9bd5d70 100644
--- a/indra/newview/lltoolpie.cpp
+++ b/indra/newview/lltoolpie.cpp
@@ -35,7 +35,6 @@
#include "llagent.h"
#include "llagentcamera.h"
#include "llavatarnamecache.h"
-#include "llviewercontrol.h"
#include "llfocusmgr.h"
#include "llfirstuse.h"
#include "llfloaterland.h"
@@ -57,6 +56,7 @@
#include "lltrans.h"
#include "llviewercamera.h"
#include "llviewerparcelmedia.h"
+#include "llviewercontrol.h"
#include "llviewermenu.h"
#include "llviewerobjectlist.h"
#include "llviewerobject.h"
@@ -76,7 +76,6 @@ static void handle_click_action_play();
static void handle_click_action_open_media(LLPointer<LLViewerObject> objectp);
static ECursorType cursor_from_parcel_media(U8 click_action);
-
LLToolPie::LLToolPie()
: LLTool(std::string("Pie")),
mMouseButtonDown( false ),
@@ -479,6 +478,18 @@ void LLToolPie::resetSelection()
mClickAction = 0;
}
+void LLToolPie::walkToClickedLocation()
+{
+ if(mAutoPilotDestination) { mAutoPilotDestination->markDead(); }
+ mAutoPilotDestination = (LLHUDEffectBlob *)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_BLOB, FALSE);
+ mAutoPilotDestination->setPositionGlobal(mPick.mPosGlobal);
+ mAutoPilotDestination->setPixelSize(5);
+ mAutoPilotDestination->setColor(LLColor4U(170, 210, 190));
+ mAutoPilotDestination->setDuration(3.f);
+
+ handle_go_to();
+}
+
// When we get object properties after left-clicking on an object
// with left-click = buy, if it's the same object, do the buy.
@@ -662,18 +673,9 @@ BOOL LLToolPie::handleMouseUp(S32 x, S32 y, MASK mask)
mPick.mPosGlobal = gAgent.getPositionGlobal() + LLVector3d(LLViewerCamera::instance().getAtAxis()) * SELF_CLICK_WALK_DISTANCE;
}
gAgentCamera.setFocusOnAvatar(TRUE, TRUE);
- if(mAutoPilotDestination) { mAutoPilotDestination->markDead(); }
- mAutoPilotDestination = (LLHUDEffectBlob *)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_BLOB, FALSE);
- mAutoPilotDestination->setPositionGlobal(mPick.mPosGlobal);
- mAutoPilotDestination->setPixelSize(5);
- mAutoPilotDestination->setColor(LLColor4U(170, 210, 190));
- mAutoPilotDestination->setDuration(3.f);
-
- handle_go_to();
+ walkToClickedLocation();
LLFirstUse::notMoving(false);
- mBlockClickToWalk = false;
-
return TRUE;
}
gViewerWindow->setCursor(UI_CURSOR_ARROW);
@@ -708,16 +710,10 @@ BOOL LLToolPie::handleDoubleClick(S32 x, S32 y, MASK mask)
if (gSavedSettings.getBOOL("DoubleClickAutoPilot"))
{
- if (mPick.mPickType == LLPickInfo::PICK_LAND
- && !mPick.mPosGlobal.isExactlyZero())
- {
- handle_go_to();
- return TRUE;
- }
- else if (mPick.mObjectID.notNull()
- && !mPick.mPosGlobal.isExactlyZero())
+ if ((mPick.mPickType == LLPickInfo::PICK_LAND && !mPick.mPosGlobal.isExactlyZero()) ||
+ (mPick.mObjectID.notNull() && !mPick.mPosGlobal.isExactlyZero()))
{
- handle_go_to();
+ walkToClickedLocation();
return TRUE;
}
}
diff --git a/indra/newview/lltoolpie.h b/indra/newview/lltoolpie.h
index d7c79ee223..68fe8bc4a5 100644
--- a/indra/newview/lltoolpie.h
+++ b/indra/newview/lltoolpie.h
@@ -66,6 +66,7 @@ public:
LLViewerObject* getClickActionObject() { return mClickActionObject; }
LLObjectSelection* getLeftClickSelection() { return (LLObjectSelection*)mLeftClickSelection; }
void resetSelection();
+ void walkToClickedLocation();
void blockClickToWalk() { mBlockClickToWalk = true; }
void stopClickToWalk();
diff --git a/indra/newview/lltracker.cpp b/indra/newview/lltracker.cpp
index 983108391f..bf1f8808a7 100644
--- a/indra/newview/lltracker.cpp
+++ b/indra/newview/lltracker.cpp
@@ -53,10 +53,12 @@
#include "llinventorymodel.h"
#include "llinventoryobserver.h"
#include "lllandmarklist.h"
+#include "llprogressview.h"
#include "llsky.h"
#include "llui.h"
#include "llviewercamera.h"
#include "llviewerinventory.h"
+#include "llviewerwindow.h"
#include "llworld.h"
#include "llworldmapview.h"
#include "llviewercontrol.h"
@@ -111,6 +113,8 @@ void LLTracker::drawHUDArrow()
{
if (!gSavedSettings.getBOOL("RenderTrackerBeacon")) return;
+ if (gViewerWindow->getProgressView()->getVisible()) return;
+
static LLUIColor map_track_color = LLUIColorTable::instance().getColor("MapTrackColor", LLColor4::white);
/* tracking autopilot destination has been disabled
@@ -505,9 +509,10 @@ void LLTracker::renderBeacon(LLVector3d pos_global,
LLGLDepthTest gls_depth(GL_TRUE, GL_FALSE);
- glMatrixMode(GL_MODELVIEW);
- glPushMatrix();
- glTranslatef(pos_agent.mV[0], pos_agent.mV[1], pos_agent.mV[2]);
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
+ gGL.pushMatrix();
+ {
+ gGL.translatef(pos_agent.mV[0], pos_agent.mV[1], pos_agent.mV[2]);
draw_shockwave(1024.f, gRenderStartTime.getElapsedTimeF32(), 32, fogged_color);
@@ -559,9 +564,8 @@ void LLTracker::renderBeacon(LLVector3d pos_global,
gGL.end();
}
-
- //gCylinder.render(1000);
- glPopMatrix();
+ }
+ gGL.popMatrix();
std::string text;
text = llformat( "%.0f m", to_vec.magVec());
diff --git a/indra/newview/lltransientfloatermgr.cpp b/indra/newview/lltransientfloatermgr.cpp
index c648a6a28a..3d68c10489 100644
--- a/indra/newview/lltransientfloatermgr.cpp
+++ b/indra/newview/lltransientfloatermgr.cpp
@@ -42,9 +42,9 @@ LLTransientFloaterMgr::LLTransientFloaterMgr()
&LLTransientFloaterMgr::leftMouseClickCallback, this, _2, _3, _4));
}
- mGroupControls.insert(std::pair<ETransientGroup, std::set<LLView*> >(GLOBAL, std::set<LLView*>()));
- mGroupControls.insert(std::pair<ETransientGroup, std::set<LLView*> >(DOCKED, std::set<LLView*>()));
- mGroupControls.insert(std::pair<ETransientGroup, std::set<LLView*> >(IM, std::set<LLView*>()));
+ mGroupControls.insert(std::pair<ETransientGroup, controls_set_t >(GLOBAL, controls_set_t()));
+ mGroupControls.insert(std::pair<ETransientGroup, controls_set_t >(DOCKED, controls_set_t()));
+ mGroupControls.insert(std::pair<ETransientGroup, controls_set_t >(IM, controls_set_t()));
}
void LLTransientFloaterMgr::registerTransientFloater(LLTransientFloater* floater)
@@ -59,12 +59,16 @@ void LLTransientFloaterMgr::unregisterTransientFloater(LLTransientFloater* float
void LLTransientFloaterMgr::addControlView(ETransientGroup group, LLView* view)
{
- mGroupControls.find(group)->second.insert(view);
+ if (!view) return;
+
+ mGroupControls.find(group)->second.insert(view->getHandle());
}
void LLTransientFloaterMgr::removeControlView(ETransientGroup group, LLView* view)
{
- mGroupControls.find(group)->second.erase(view);
+ if (!view) return;
+
+ mGroupControls.find(group)->second.erase(view->getHandle());
}
void LLTransientFloaterMgr::addControlView(LLView* view)
@@ -89,7 +93,7 @@ void LLTransientFloaterMgr::hideTransientFloaters(S32 x, S32 y)
{
ETransientGroup group = floater->getGroup();
- bool hide = isControlClicked(mGroupControls.find(group)->second, x, y);
+ bool hide = isControlClicked(group, mGroupControls.find(group)->second, x, y);
if (hide)
{
floater->setTransientVisible(FALSE);
@@ -98,13 +102,25 @@ void LLTransientFloaterMgr::hideTransientFloaters(S32 x, S32 y)
}
}
-bool LLTransientFloaterMgr::isControlClicked(std::set<LLView*>& set, S32 x, S32 y)
+bool LLTransientFloaterMgr::isControlClicked(ETransientGroup group, controls_set_t& set, S32 x, S32 y)
{
+ std::list< LLHandle<LLView> > dead_handles;
+
bool res = true;
for (controls_set_t::iterator it = set.begin(); it
!= set.end(); it++)
{
- LLView* control_view = *it;
+ LLView* control_view = NULL;
+
+ LLHandle<LLView> handle = *it;
+ if (handle.isDead())
+ {
+ dead_handles.push_back(handle);
+ continue;
+ }
+
+ control_view = handle.get();
+
if (!control_view->getVisible())
{
continue;
@@ -118,6 +134,13 @@ bool LLTransientFloaterMgr::isControlClicked(std::set<LLView*>& set, S32 x, S32
break;
}
}
+
+ for (std::list< LLHandle<LLView> >::iterator it = dead_handles.begin(); it != dead_handles.end(); ++it)
+ {
+ LLHandle<LLView> handle = *it;
+ mGroupControls.find(group)->second.erase(handle);
+ }
+
return res;
}
@@ -130,8 +153,8 @@ void LLTransientFloaterMgr::leftMouseClickCallback(S32 x, S32 y,
return;
}
- bool hide = isControlClicked(mGroupControls.find(DOCKED)->second, x, y)
- && isControlClicked(mGroupControls.find(GLOBAL)->second, x, y);
+ bool hide = isControlClicked(DOCKED, mGroupControls.find(DOCKED)->second, x, y)
+ && isControlClicked(GLOBAL, mGroupControls.find(GLOBAL)->second, x, y);
if (hide)
{
hideTransientFloaters(x, y);
diff --git a/indra/newview/lltransientfloatermgr.h b/indra/newview/lltransientfloatermgr.h
index 2919244121..b4611c8c87 100644
--- a/indra/newview/lltransientfloatermgr.h
+++ b/indra/newview/lltransientfloatermgr.h
@@ -56,14 +56,15 @@ public:
void removeControlView(LLView* view);
private:
+ typedef std::set<LLHandle<LLView> > controls_set_t;
+ typedef std::map<ETransientGroup, controls_set_t > group_controls_t;
+
void hideTransientFloaters(S32 x, S32 y);
void leftMouseClickCallback(S32 x, S32 y, MASK mask);
- bool isControlClicked(std::set<LLView*>& set, S32 x, S32 y);
-private:
+ bool isControlClicked(ETransientGroup group, controls_set_t& set, S32 x, S32 y);
+
std::set<LLTransientFloater*> mTransSet;
- typedef std::set<LLView*> controls_set_t;
- typedef std::map<ETransientGroup, std::set<LLView*> > group_controls_t;
group_controls_t mGroupControls;
};
diff --git a/indra/newview/lltranslate.cpp b/indra/newview/lltranslate.cpp
index 2f60b6b90b..c1cc9c7bc4 100644..100755
--- a/indra/newview/lltranslate.cpp
+++ b/indra/newview/lltranslate.cpp
@@ -31,82 +31,306 @@
#include <curl/curl.h>
#include "llbufferstream.h"
+#include "lltrans.h"
#include "llui.h"
#include "llversioninfo.h"
#include "llviewercontrol.h"
#include "reader.h"
-// These two are concatenated with the language specifiers to form a complete Google Translate URL
-const char* LLTranslate::m_GoogleURL = "http://ajax.googleapis.com/ajax/services/language/translate?v=1.0&q=";
-const char* LLTranslate::m_GoogleLangSpec = "&langpair=";
-float LLTranslate::m_GoogleTimeout = 5;
+// virtual
+void LLGoogleTranslationHandler::getTranslateURL(
+ std::string &url,
+ const std::string &from_lang,
+ const std::string &to_lang,
+ const std::string &text) const
+{
+ url = std::string("https://www.googleapis.com/language/translate/v2?key=")
+ + getAPIKey() + "&q=" + LLURI::escape(text) + "&target=" + to_lang;
+ if (!from_lang.empty())
+ {
+ url += "&source=" + from_lang;
+ }
+}
-LLSD LLTranslate::m_Header;
-// These constants are for the GET header.
-const char* LLTranslate::m_AcceptHeader = "Accept";
-const char* LLTranslate::m_AcceptType = "text/plain";
-const char* LLTranslate::m_AgentHeader = "User-Agent";
+// virtual
+void LLGoogleTranslationHandler::getKeyVerificationURL(
+ std::string& url,
+ const std::string& key) const
+{
+ url = std::string("https://www.googleapis.com/language/translate/v2/languages?key=")
+ + key + "&target=en";
+}
+
+// virtual
+bool LLGoogleTranslationHandler::parseResponse(
+ int& status,
+ const std::string& body,
+ std::string& translation,
+ std::string& detected_lang,
+ std::string& err_msg) const
+{
+ Json::Value root;
+ Json::Reader reader;
-// These constants are in the JSON returned from Google
-const char* LLTranslate::m_GoogleData = "responseData";
-const char* LLTranslate::m_GoogleTranslation = "translatedText";
-const char* LLTranslate::m_GoogleLanguage = "detectedSourceLanguage";
+ if (!reader.parse(body, root))
+ {
+ err_msg = reader.getFormatedErrorMessages();
+ return false;
+ }
-//static
-void LLTranslate::translateMessage(LLHTTPClient::ResponderPtr &result, const std::string &from_lang, const std::string &to_lang, const std::string &mesg)
+ if (!root.isObject()) // empty response? should not happen
+ {
+ return false;
+ }
+
+ if (status != STATUS_OK)
+ {
+ // Request failed. Extract error message from the response.
+ parseErrorResponse(root, status, err_msg);
+ return false;
+ }
+
+ // Request succeeded, extract translation from the response.
+ return parseTranslation(root, translation, detected_lang);
+}
+
+// virtual
+bool LLGoogleTranslationHandler::isConfigured() const
{
- std::string url;
- getTranslateUrl(url, from_lang, to_lang, mesg);
+ return !getAPIKey().empty();
+}
+
+// static
+void LLGoogleTranslationHandler::parseErrorResponse(
+ const Json::Value& root,
+ int& status,
+ std::string& err_msg)
+{
+ const Json::Value& error = root.get("error", 0);
+ if (!error.isObject() || !error.isMember("message") || !error.isMember("code"))
+ {
+ return;
+ }
+
+ err_msg = error["message"].asString();
+ status = error["code"].asInt();
+}
+
+// static
+bool LLGoogleTranslationHandler::parseTranslation(
+ const Json::Value& root,
+ std::string& translation,
+ std::string& detected_lang)
+{
+ // JsonCpp is prone to aborting the program on failed assertions,
+ // so be super-careful and verify the response format.
+ const Json::Value& data = root.get("data", 0);
+ if (!data.isObject() || !data.isMember("translations"))
+ {
+ return false;
+ }
- std::string user_agent = llformat("%s %d.%d.%d (%d)",
- LLVersionInfo::getChannel().c_str(),
- LLVersionInfo::getMajor(),
- LLVersionInfo::getMinor(),
- LLVersionInfo::getPatch(),
- LLVersionInfo::getBuild());
+ const Json::Value& translations = data["translations"];
+ if (!translations.isArray() || translations.size() == 0)
+ {
+ return false;
+ }
- if (!m_Header.size())
+ const Json::Value& first = translations[0U];
+ if (!first.isObject() || !first.isMember("translatedText"))
{
- m_Header.insert(m_AcceptHeader, LLSD(m_AcceptType));
- m_Header.insert(m_AgentHeader, LLSD(user_agent));
+ return false;
}
- LLHTTPClient::get(url, result, m_Header, m_GoogleTimeout);
+ translation = first["translatedText"].asString();
+ detected_lang = first.get("detectedSourceLanguage", "").asString();
+ return true;
}
-//static
-void LLTranslate::getTranslateUrl(std::string &translate_url, const std::string &from_lang, const std::string &to_lang, const std::string &mesg)
+// static
+std::string LLGoogleTranslationHandler::getAPIKey()
{
- char * curl_str = curl_escape(mesg.c_str(), mesg.size());
- std::string const escaped_mesg(curl_str);
- curl_free(curl_str);
+ return gSavedSettings.getString("GoogleTranslateAPIKey");
+}
- translate_url = m_GoogleURL
- + escaped_mesg + m_GoogleLangSpec
- + from_lang // 'from' language; empty string for auto
- + "%7C" // |
- + to_lang; // 'to' language
+// virtual
+void LLBingTranslationHandler::getTranslateURL(
+ std::string &url,
+ const std::string &from_lang,
+ const std::string &to_lang,
+ const std::string &text) const
+{
+ url = std::string("http://api.microsofttranslator.com/v2/Http.svc/Translate?appId=")
+ + getAPIKey() + "&text=" + LLURI::escape(text) + "&to=" + to_lang;
+ if (!from_lang.empty())
+ {
+ url += "&from=" + from_lang;
+ }
}
-//static
-bool LLTranslate::parseGoogleTranslate(const std::string& body, std::string &translation, std::string &detected_language)
+// virtual
+void LLBingTranslationHandler::getKeyVerificationURL(
+ std::string& url,
+ const std::string& key) const
{
- Json::Value root;
- Json::Reader reader;
-
- bool success = reader.parse(body, root);
- if (!success)
+ url = std::string("http://api.microsofttranslator.com/v2/Http.svc/GetLanguagesForTranslate?appId=")
+ + key;
+}
+
+// virtual
+bool LLBingTranslationHandler::parseResponse(
+ int& status,
+ const std::string& body,
+ std::string& translation,
+ std::string& detected_lang,
+ std::string& err_msg) const
+{
+ if (status != STATUS_OK)
{
- LL_WARNS("Translate") << "Non valid response from Google Translate API: '" << reader.getFormatedErrorMessages() << "'" << LL_ENDL;
+ static const std::string MSG_BEGIN_MARKER = "Message: ";
+ size_t begin = body.find(MSG_BEGIN_MARKER);
+ if (begin != std::string::npos)
+ {
+ begin += MSG_BEGIN_MARKER.size();
+ }
+ else
+ {
+ begin = 0;
+ err_msg.clear();
+ }
+ size_t end = body.find("</p>", begin);
+ err_msg = body.substr(begin, end-begin);
+ LLStringUtil::replaceString(err_msg, "&#xD;", ""); // strip CR
return false;
}
-
- translation = root[m_GoogleData].get(m_GoogleTranslation, "").asString();
- detected_language = root[m_GoogleData].get(m_GoogleLanguage, "").asString();
+
+ // Sample response: <string xmlns="http://schemas.microsoft.com/2003/10/Serialization/">Hola</string>
+ size_t begin = body.find(">");
+ if (begin == std::string::npos || begin >= (body.size() - 1))
+ {
+ begin = 0;
+ }
+ else
+ {
+ ++begin;
+ }
+
+ size_t end = body.find("</string>", begin);
+
+ detected_lang = ""; // unsupported by this API
+ translation = body.substr(begin, end-begin);
+ LLStringUtil::replaceString(translation, "&#xD;", ""); // strip CR
return true;
}
+// virtual
+bool LLBingTranslationHandler::isConfigured() const
+{
+ return !getAPIKey().empty();
+}
+
+// static
+std::string LLBingTranslationHandler::getAPIKey()
+{
+ return gSavedSettings.getString("BingTranslateAPIKey");
+}
+
+LLTranslate::TranslationReceiver::TranslationReceiver(const std::string& from_lang, const std::string& to_lang)
+: mFromLang(from_lang)
+, mToLang(to_lang)
+, mHandler(LLTranslate::getPreferredHandler())
+{
+}
+
+// virtual
+void LLTranslate::TranslationReceiver::completedRaw(
+ U32 http_status,
+ const std::string& reason,
+ const LLChannelDescriptors& channels,
+ const LLIOPipe::buffer_ptr_t& buffer)
+{
+ LLBufferStream istr(channels, buffer.get());
+ std::stringstream strstrm;
+ strstrm << istr.rdbuf();
+
+ const std::string body = strstrm.str();
+ std::string translation, detected_lang, err_msg;
+ int status = http_status;
+ LL_DEBUGS("Translate") << "HTTP status: " << status << " " << reason << LL_ENDL;
+ LL_DEBUGS("Translate") << "Response body: " << body << LL_ENDL;
+ if (mHandler.parseResponse(status, body, translation, detected_lang, err_msg))
+ {
+ // Fix up the response
+ LLStringUtil::replaceString(translation, "&lt;", "<");
+ LLStringUtil::replaceString(translation, "&gt;",">");
+ LLStringUtil::replaceString(translation, "&quot;","\"");
+ LLStringUtil::replaceString(translation, "&#39;","'");
+ LLStringUtil::replaceString(translation, "&amp;","&");
+ LLStringUtil::replaceString(translation, "&apos;","'");
+
+ handleResponse(translation, detected_lang);
+ }
+ else
+ {
+ if (err_msg.empty())
+ {
+ err_msg = LLTrans::getString("TranslationResponseParseError");
+ }
+
+ llwarns << "Translation request failed: " << err_msg << llendl;
+ handleFailure(status, err_msg);
+ }
+}
+
+LLTranslate::KeyVerificationReceiver::KeyVerificationReceiver(EService service)
+: mService(service)
+{
+}
+
+LLTranslate::EService LLTranslate::KeyVerificationReceiver::getService() const
+{
+ return mService;
+}
+
+// virtual
+void LLTranslate::KeyVerificationReceiver::completedRaw(
+ U32 http_status,
+ const std::string& reason,
+ const LLChannelDescriptors& channels,
+ const LLIOPipe::buffer_ptr_t& buffer)
+{
+ bool ok = (http_status == 200);
+ setVerificationStatus(ok);
+}
+
+//static
+void LLTranslate::translateMessage(
+ TranslationReceiverPtr &receiver,
+ const std::string &from_lang,
+ const std::string &to_lang,
+ const std::string &mesg)
+{
+ std::string url;
+ receiver->mHandler.getTranslateURL(url, from_lang, to_lang, mesg);
+
+ LL_DEBUGS("Translate") << "Sending translation request: " << url << LL_ENDL;
+ sendRequest(url, receiver);
+}
+
+// static
+void LLTranslate::verifyKey(
+ KeyVerificationReceiverPtr& receiver,
+ const std::string& key)
+{
+ std::string url;
+ const LLTranslationAPIHandler& handler = getHandler(receiver->getService());
+ handler.getKeyVerificationURL(url, key);
+
+ LL_DEBUGS("Translate") << "Sending key verification request: " << url << LL_ENDL;
+ sendRequest(url, receiver);
+}
+
//static
std::string LLTranslate::getTranslateLanguage()
{
@@ -119,3 +343,58 @@ std::string LLTranslate::getTranslateLanguage()
return language;
}
+// static
+bool LLTranslate::isTranslationConfigured()
+{
+ return getPreferredHandler().isConfigured();
+}
+
+// static
+const LLTranslationAPIHandler& LLTranslate::getPreferredHandler()
+{
+ EService service = SERVICE_BING;
+
+ std::string service_str = gSavedSettings.getString("TranslationService");
+ if (service_str == "google")
+ {
+ service = SERVICE_GOOGLE;
+ }
+
+ return getHandler(service);
+}
+
+// static
+const LLTranslationAPIHandler& LLTranslate::getHandler(EService service)
+{
+ static LLGoogleTranslationHandler google;
+ static LLBingTranslationHandler bing;
+
+ if (service == SERVICE_GOOGLE)
+ {
+ return google;
+ }
+
+ return bing;
+}
+
+// static
+void LLTranslate::sendRequest(const std::string& url, LLHTTPClient::ResponderPtr responder)
+{
+ static const float REQUEST_TIMEOUT = 5;
+ static LLSD sHeader;
+
+ if (!sHeader.size())
+ {
+ std::string user_agent = llformat("%s %d.%d.%d (%d)",
+ LLVersionInfo::getChannel().c_str(),
+ LLVersionInfo::getMajor(),
+ LLVersionInfo::getMinor(),
+ LLVersionInfo::getPatch(),
+ LLVersionInfo::getBuild());
+
+ sHeader.insert("Accept", "text/plain");
+ sHeader.insert("User-Agent", user_agent);
+ }
+
+ LLHTTPClient::get(url, responder, sHeader, REQUEST_TIMEOUT);
+}
diff --git a/indra/newview/lltranslate.h b/indra/newview/lltranslate.h
index e85a42e878..424bc14587 100644..100755
--- a/indra/newview/lltranslate.h
+++ b/indra/newview/lltranslate.h
@@ -30,89 +30,273 @@
#include "llhttpclient.h"
#include "llbufferstream.h"
+namespace Json
+{
+ class Value;
+}
+
+/**
+ * Handler of an HTTP machine translation service.
+ *
+ * Derived classes know the service URL
+ * and how to parse the translation result.
+ */
+class LLTranslationAPIHandler
+{
+public:
+ /**
+ * Get URL for translation of the given string.
+ *
+ * Sending HTTP GET request to the URL will initiate translation.
+ *
+ * @param[out] url Place holder for the result.
+ * @param from_lang Source language. Leave empty for auto-detection.
+ * @param to_lang Target language.
+ * @param text Text to translate.
+ */
+ virtual void getTranslateURL(
+ std::string &url,
+ const std::string &from_lang,
+ const std::string &to_lang,
+ const std::string &text) const = 0;
+
+ /**
+ * Get URL to verify the given API key.
+ *
+ * Sending request to the URL verifies the key.
+ * Positive HTTP response (code 200) means that the key is valid.
+ *
+ * @param[out] url Place holder for the URL.
+ * @param[in] key Key to verify.
+ */
+ virtual void getKeyVerificationURL(
+ std::string &url,
+ const std::string &key) const = 0;
+
+ /**
+ * Parse translation response.
+ *
+ * @param[in,out] status HTTP status. May be modified while parsing.
+ * @param body Response text.
+ * @param[out] translation Translated text.
+ * @param[out] detected_lang Detected source language. May be empty.
+ * @param[out] err_msg Error message (in case of error).
+ */
+ virtual bool parseResponse(
+ int& status,
+ const std::string& body,
+ std::string& translation,
+ std::string& detected_lang,
+ std::string& err_msg) const = 0;
+
+ /**
+ * @return if the handler is configured to function properly
+ */
+ virtual bool isConfigured() const = 0;
+
+ virtual ~LLTranslationAPIHandler() {}
+
+protected:
+ static const int STATUS_OK = 200;
+};
+
+/// Google Translate v2 API handler.
+class LLGoogleTranslationHandler : public LLTranslationAPIHandler
+{
+ LOG_CLASS(LLGoogleTranslationHandler);
+
+public:
+ /*virtual*/ void getTranslateURL(
+ std::string &url,
+ const std::string &from_lang,
+ const std::string &to_lang,
+ const std::string &text) const;
+ /*virtual*/ void getKeyVerificationURL(
+ std::string &url,
+ const std::string &key) const;
+ /*virtual*/ bool parseResponse(
+ int& status,
+ const std::string& body,
+ std::string& translation,
+ std::string& detected_lang,
+ std::string& err_msg) const;
+ /*virtual*/ bool isConfigured() const;
+
+private:
+ static void parseErrorResponse(
+ const Json::Value& root,
+ int& status,
+ std::string& err_msg);
+ static bool parseTranslation(
+ const Json::Value& root,
+ std::string& translation,
+ std::string& detected_lang);
+ static std::string getAPIKey();
+};
+
+/// Microsoft Translator v2 API handler.
+class LLBingTranslationHandler : public LLTranslationAPIHandler
+{
+ LOG_CLASS(LLBingTranslationHandler);
+
+public:
+ /*virtual*/ void getTranslateURL(
+ std::string &url,
+ const std::string &from_lang,
+ const std::string &to_lang,
+ const std::string &text) const;
+ /*virtual*/ void getKeyVerificationURL(
+ std::string &url,
+ const std::string &key) const;
+ /*virtual*/ bool parseResponse(
+ int& status,
+ const std::string& body,
+ std::string& translation,
+ std::string& detected_lang,
+ std::string& err_msg) const;
+ /*virtual*/ bool isConfigured() const;
+private:
+ static std::string getAPIKey();
+};
+
+/**
+ * Entry point for machine translation services.
+ *
+ * Basically, to translate a string, we need to know the URL
+ * of a translation service, have a valid API for the service
+ * and be given the target language.
+ *
+ * Callers specify the string to translate and the target language,
+ * LLTranslate takes care of the rest.
+ *
+ * API keys for translation are taken from saved settings.
+ */
class LLTranslate
{
LOG_CLASS(LLTranslate);
+
public :
+
+ typedef enum e_service {
+ SERVICE_BING,
+ SERVICE_GOOGLE,
+ } EService;
+
+ /**
+ * Subclasses are supposed to handle translation results (e.g. show them in chat)
+ */
class TranslationReceiver: public LLHTTPClient::Responder
{
+ public:
+
+ /**
+ * Using mHandler, parse incoming response.
+ *
+ * Calls either handleResponse() or handleFailure()
+ * depending on the HTTP status code and parsing success.
+ *
+ * @see handleResponse()
+ * @see handleFailure()
+ * @see mHandler
+ */
+ /*virtual*/ void completedRaw(
+ U32 http_status,
+ const std::string& reason,
+ const LLChannelDescriptors& channels,
+ const LLIOPipe::buffer_ptr_t& buffer);
+
protected:
- TranslationReceiver(const std::string &from_lang, const std::string &to_lang)
- : m_fromLang(from_lang),
- m_toLang(to_lang)
- {
- }
+ friend class LLTranslate;
+
+ /// Remember source and target languages for subclasses to be able to filter inappropriate results.
+ TranslationReceiver(const std::string& from_lang, const std::string& to_lang);
+
+ /// Override point to handle successful translation.
+ virtual void handleResponse(const std::string &translation, const std::string &recognized_lang) = 0;
- virtual void handleResponse(const std::string &translation, const std::string &recognized_lang) {};
- virtual void handleFailure() {};
+ /// Override point to handle unsuccessful translation.
+ virtual void handleFailure(int status, const std::string& err_msg) = 0;
+ std::string mFromLang;
+ std::string mToLang;
+ const LLTranslationAPIHandler& mHandler;
+ };
+
+ /**
+ * Subclasses are supposed to handle API key verification result.
+ */
+ class KeyVerificationReceiver: public LLHTTPClient::Responder
+ {
public:
- ~TranslationReceiver()
- {
- }
-
- virtual void completedRaw( U32 status,
- const std::string& reason,
- const LLChannelDescriptors& channels,
- const LLIOPipe::buffer_ptr_t& buffer)
- {
- if (200 <= status && status < 300)
- {
- LLBufferStream istr(channels, buffer.get());
- std::stringstream strstrm;
- strstrm << istr.rdbuf();
-
- const std::string result = strstrm.str();
- std::string translation;
- std::string detected_language;
-
- if (!parseGoogleTranslate(result, translation, detected_language))
- {
- handleFailure();
- return;
- }
-
- // Fix up the response
- LLStringUtil::replaceString(translation, "&lt;", "<");
- LLStringUtil::replaceString(translation, "&gt;",">");
- LLStringUtil::replaceString(translation, "&quot;","\"");
- LLStringUtil::replaceString(translation, "&#39;","'");
- LLStringUtil::replaceString(translation, "&amp;","&");
- LLStringUtil::replaceString(translation, "&apos;","'");
-
- handleResponse(translation, detected_language);
- }
- else
- {
- LL_WARNS("Translate") << "HTTP request for Google Translate failed with status " << status << ", reason: " << reason << LL_ENDL;
- handleFailure();
- }
- }
+ EService getService() const;
protected:
- const std::string m_toLang;
- const std::string m_fromLang;
+ /**
+ * Save the translation service the key belongs to.
+ *
+ * Subclasses need to know it.
+ *
+ * @see getService()
+ */
+ KeyVerificationReceiver(EService service);
+
+ /**
+ * Parse verification response.
+ *
+ * Calls setVerificationStatus() with the verification status,
+ * which is true if HTTP status code is 200.
+ *
+ * @see setVerificationStatus()
+ */
+ /*virtual*/ void completedRaw(
+ U32 http_status,
+ const std::string& reason,
+ const LLChannelDescriptors& channels,
+ const LLIOPipe::buffer_ptr_t& buffer);
+
+ /**
+ * Override point for subclasses to handle key verification status.
+ */
+ virtual void setVerificationStatus(bool ok) = 0;
+
+ EService mService;
};
- static void translateMessage(LLHTTPClient::ResponderPtr &result, const std::string &from_lang, const std::string &to_lang, const std::string &mesg);
- static float m_GoogleTimeout;
+ typedef boost::intrusive_ptr<TranslationReceiver> TranslationReceiverPtr;
+ typedef boost::intrusive_ptr<KeyVerificationReceiver> KeyVerificationReceiverPtr;
+
+ /**
+ * Translate given text.
+ *
+ * @param receiver Object to pass translation result to.
+ * @param from_lang Source language. Leave empty for auto-detection.
+ * @param to_lang Target language.
+ * @param mesg Text to translate.
+ */
+ static void translateMessage(TranslationReceiverPtr &receiver, const std::string &from_lang, const std::string &to_lang, const std::string &mesg);
+
+ /**
+ * Verify given API key of a translation service.
+ *
+ * @param receiver Object to pass verification result to.
+ * @param key Key to verify.
+ */
+ static void verifyKey(KeyVerificationReceiverPtr& receiver, const std::string& key);
+
+ /**
+ * @return translation target language
+ */
static std::string getTranslateLanguage();
+ /**
+ * @return true if translation is configured properly.
+ */
+ static bool isTranslationConfigured();
+
private:
- static void getTranslateUrl(std::string &translate_url, const std::string &from_lang, const std::string &to_lang, const std::string &text);
- static bool parseGoogleTranslate(const std::string& body, std::string &translation, std::string &detected_language);
-
- static LLSD m_Header;
- static const char* m_GoogleURL;
- static const char* m_GoogleLangSpec;
- static const char* m_AcceptHeader;
- static const char* m_AcceptType;
- static const char* m_AgentHeader;
- static const char* m_UserAgent;
-
- static const char* m_GoogleData;
- static const char* m_GoogleTranslation;
- static const char* m_GoogleLanguage;
+ static const LLTranslationAPIHandler& getPreferredHandler();
+ static const LLTranslationAPIHandler& getHandler(EService service);
+ static void sendRequest(const std::string& url, LLHTTPClient::ResponderPtr responder);
};
#endif
diff --git a/indra/newview/llurldispatcher.cpp b/indra/newview/llurldispatcher.cpp
index ed4d278e90..4240a38326 100644
--- a/indra/newview/llurldispatcher.cpp
+++ b/indra/newview/llurldispatcher.cpp
@@ -32,10 +32,10 @@
#include "llcommandhandler.h"
#include "llfloaterhelpbrowser.h"
#include "llfloaterreg.h"
+#include "llfloatersidepanelcontainer.h"
#include "llfloaterworldmap.h"
#include "llpanellogin.h"
#include "llregionhandle.h"
-#include "llsidetray.h"
#include "llslurl.h"
#include "llstartup.h" // gStartupState
#include "llweb.h"
@@ -167,9 +167,9 @@ bool LLURLDispatcherImpl::dispatchApp(const LLSLURL& slurl,
// static
bool LLURLDispatcherImpl::dispatchRegion(const LLSLURL& slurl, const std::string& nav_type, bool right_mouse)
{
- if(slurl.getType() != LLSLURL::LOCATION)
+ if(slurl.getType() != LLSLURL::LOCATION)
{
- return false;
+ return false;
}
// Before we're logged in, need to update the startup screen
// to tell the user where they are going.
@@ -246,7 +246,7 @@ void LLURLDispatcherImpl::regionHandleCallback(U64 region_handle, const LLSLURL&
key["y"] = global_pos.mdV[VY];
key["z"] = global_pos.mdV[VZ];
- LLSideTray::getInstance()->showPanel("panel_places", key);
+ LLFloaterSidePanelContainer::showPanel("places", key);
}
}
diff --git a/indra/newview/llviewerassetstorage.cpp b/indra/newview/llviewerassetstorage.cpp
index 36c8b42a52..d042f62830 100644
--- a/indra/newview/llviewerassetstorage.cpp
+++ b/indra/newview/llviewerassetstorage.cpp
@@ -116,7 +116,7 @@ void LLViewerAssetStorage::storeAssetData(
F64 timeout)
{
LLAssetID asset_id = tid.makeAssetID(gAgent.getSecureSessionID());
- llinfos << "LLViewerAssetStorage::storeAssetData (legacy) " << tid << ":" << LLAssetType::lookup(asset_type)
+ LL_DEBUGS("AssetStorage") << "LLViewerAssetStorage::storeAssetData (legacy) " << tid << ":" << LLAssetType::lookup(asset_type)
<< " ASSET_ID: " << asset_id << llendl;
if (mUpstreamHost.isOk())
@@ -248,9 +248,9 @@ void LLViewerAssetStorage::storeAssetData(
}
LLAssetID asset_id = tid.makeAssetID(gAgent.getSecureSessionID());
- llinfos << "LLViewerAssetStorage::storeAssetData (legacy)" << asset_id << ":" << LLAssetType::lookup(asset_type) << llendl;
+ LL_DEBUGS("AssetStorage") << "LLViewerAssetStorage::storeAssetData (legacy)" << asset_id << ":" << LLAssetType::lookup(asset_type) << llendl;
- llinfos << "ASSET_ID: " << asset_id << llendl;
+ LL_DEBUGS("AssetStorage") << "ASSET_ID: " << asset_id << llendl;
S32 size = 0;
LLFILE* fp = LLFile::fopen(filename, "rb");
@@ -369,7 +369,7 @@ void LLViewerAssetStorage::_queueDataRequest(
tpvf.setAsset(uuid, atype);
tpvf.setCallback(downloadCompleteCallback, req);
- llinfos << "Starting transfer for " << uuid << llendl;
+ LL_DEBUGS("AssetStorage") << "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/newview/llviewerassettype.cpp b/indra/newview/llviewerassettype.cpp
index b103f11597..a4b1c2155f 100644
--- a/indra/newview/llviewerassettype.cpp
+++ b/indra/newview/llviewerassettype.cpp
@@ -80,7 +80,9 @@ LLViewerAssetDictionary::LLViewerAssetDictionary()
addEntry(LLViewerAssetType::AT_LINK_FOLDER, new ViewerAssetEntry(DAD_LINK));
addEntry(LLViewerAssetType::AT_MESH, new ViewerAssetEntry(DAD_MESH));
-
+
+ addEntry(LLViewerAssetType::AT_WIDGET, new ViewerAssetEntry(DAD_WIDGET));
+
addEntry(LLViewerAssetType::AT_NONE, new ViewerAssetEntry(DAD_NONE));
};
diff --git a/indra/newview/llvieweraudio.cpp b/indra/newview/llvieweraudio.cpp
index f7fa5690d6..2447f5dea8 100644
--- a/indra/newview/llvieweraudio.cpp
+++ b/indra/newview/llvieweraudio.cpp
@@ -37,9 +37,226 @@
#include "llvoiceclient.h"
#include "llviewermedia.h"
#include "llprogressview.h"
+#include "llcallbacklist.h"
+#include "llstartup.h"
+#include "llviewerparcelmgr.h"
+#include "llparcel.h"
/////////////////////////////////////////////////////////
+LLViewerAudio::LLViewerAudio() :
+ mDone(true),
+ mFadeState(FADE_IDLE),
+ mFadeTime(),
+ mIdleListnerActive(false),
+ mForcedTeleportFade(false)
+{
+ mTeleportFailedConnection = LLViewerParcelMgr::getInstance()->
+ setTeleportFailedCallback(boost::bind(&LLViewerAudio::onTeleportFailed, this));
+}
+
+LLViewerAudio::~LLViewerAudio()
+{
+ mTeleportFailedConnection.disconnect();
+}
+
+void LLViewerAudio::registerIdleListener()
+{
+ if(mIdleListnerActive==false)
+ {
+ mIdleListnerActive = true;
+ doOnIdleRepeating(boost::bind(boost::bind(&LLViewerAudio::onIdleUpdate, this)));
+ }
+
+}
+
+void LLViewerAudio::startInternetStreamWithAutoFade(std::string streamURI)
+{
+ // Old and new stream are identical
+ if (mNextStreamURI == streamURI)
+ {
+ return;
+ }
+
+ // Record the URI we are going to be switching to
+ mNextStreamURI = streamURI;
+
+ switch (mFadeState)
+ {
+ case FADE_IDLE:
+ // If a stream is playing fade it out first
+ if (!gAudiop->getInternetStreamURL().empty())
+ {
+ // The order of these tests is important, state FADE_OUT will be processed below
+ mFadeState = FADE_OUT;
+ }
+ // Otherwise the new stream can be faded in
+ else
+ {
+ mFadeState = FADE_IN;
+ gAudiop->startInternetStream(mNextStreamURI);
+ startFading();
+ registerIdleListener();
+ break;
+ }
+
+ case FADE_OUT:
+ startFading();
+ registerIdleListener();
+ break;
+
+ case FADE_IN:
+ registerIdleListener();
+ break;
+
+ default:
+ llwarns << "Unknown fading state: " << mFadeState << llendl;
+ break;
+ }
+}
+
+// A return of false from onIdleUpdate means it will be called again next idle update.
+// A return of true means we have finished with it and the callback will be deleted.
+bool LLViewerAudio::onIdleUpdate()
+{
+ bool fadeIsFinished = false;
+
+ // There is a delay in the login sequence between when the parcel information has
+ // arrived and the music stream is started and when the audio system is called to set
+ // initial volume levels. This code extends the fade time so you hear a full fade in.
+ if ((LLStartUp::getStartupState() < STATE_STARTED))
+ {
+ stream_fade_timer.reset();
+ stream_fade_timer.setTimerExpirySec(mFadeTime);
+ }
+
+ if (mDone)
+ {
+ // This should be a rare or never occurring state.
+ if (mFadeState == FADE_IDLE)
+ {
+ deregisterIdleListener();
+ fadeIsFinished = true; // Stop calling onIdleUpdate
+ }
+
+ // we have finished the current fade operation
+ if (mFadeState == FADE_OUT)
+ {
+ // Clear URI
+ gAudiop->startInternetStream(LLStringUtil::null);
+ gAudiop->stopInternetStream();
+
+ if (!mNextStreamURI.empty())
+ {
+ mFadeState = FADE_IN;
+ gAudiop->startInternetStream(mNextStreamURI);
+ startFading();
+ }
+ else
+ {
+ mFadeState = FADE_IDLE;
+ deregisterIdleListener();
+ fadeIsFinished = true; // Stop calling onIdleUpdate
+ }
+ }
+ else if (mFadeState == FADE_IN)
+ {
+ if (mNextStreamURI != gAudiop->getInternetStreamURL())
+ {
+ mFadeState = FADE_OUT;
+ startFading();
+ }
+ else
+ {
+ mFadeState = FADE_IDLE;
+ deregisterIdleListener();
+ fadeIsFinished = true; // Stop calling onIdleUpdate
+ }
+ }
+ }
+
+ return fadeIsFinished;
+}
+
+void LLViewerAudio::stopInternetStreamWithAutoFade()
+{
+ mFadeState = FADE_IDLE;
+ mNextStreamURI = LLStringUtil::null;
+ mDone = true;
+
+ gAudiop->startInternetStream(LLStringUtil::null);
+ gAudiop->stopInternetStream();
+}
+
+void LLViewerAudio::startFading()
+{
+ const F32 AUDIO_MUSIC_FADE_IN_TIME = 3.0f;
+ const F32 AUDIO_MUSIC_FADE_OUT_TIME = 2.0f;
+ // This minimum fade time prevents divide by zero and negative times
+ const F32 AUDIO_MUSIC_MINIMUM_FADE_TIME = 0.01f;
+
+ if(mDone)
+ {
+ // The fade state here should only be one of FADE_IN or FADE_OUT, but, in case it is not,
+ // rather than check for both states assume a fade in and check for the fade out case.
+ mFadeTime = AUDIO_MUSIC_FADE_IN_TIME;
+ if (LLViewerAudio::getInstance()->getFadeState() == LLViewerAudio::FADE_OUT)
+ {
+ mFadeTime = AUDIO_MUSIC_FADE_OUT_TIME;
+ }
+
+ // Prevent invalid fade time
+ mFadeTime = llmax(mFadeTime, AUDIO_MUSIC_MINIMUM_FADE_TIME);
+
+ stream_fade_timer.reset();
+ stream_fade_timer.setTimerExpirySec(mFadeTime);
+ mDone = false;
+ }
+}
+
+F32 LLViewerAudio::getFadeVolume()
+{
+ F32 fade_volume = 1.0f;
+
+ if (stream_fade_timer.hasExpired())
+ {
+ mDone = true;
+ // If we have been fading out set volume to 0 until the next fade state occurs to prevent
+ // an audio transient.
+ if (LLViewerAudio::getInstance()->getFadeState() == LLViewerAudio::FADE_OUT)
+ {
+ fade_volume = 0.0f;
+ }
+ }
+
+ if (!mDone)
+ {
+ // Calculate how far we are into the fade time
+ fade_volume = stream_fade_timer.getElapsedTimeF32() / mFadeTime;
+
+ if (LLViewerAudio::getInstance()->getFadeState() == LLViewerAudio::FADE_OUT)
+ {
+ // If we are not fading in then we are fading out, so invert the fade
+ // direction; start loud and move towards zero volume.
+ fade_volume = 1.0f - fade_volume;
+ }
+ }
+
+ return fade_volume;
+}
+
+void LLViewerAudio::onTeleportFailed()
+{
+ if (gAudiop)
+ {
+ LLParcel* parcel = LLViewerParcelMgr::getInstance()->getAgentParcel();
+ if (parcel)
+ {
+ mNextStreamURI = parcel->getMusicURL();
+ }
+ }
+}
+
void init_audio()
{
if (!gAudiop)
@@ -142,12 +359,25 @@ void audio_update_volume(bool force_update)
// Streaming Music
if (gAudiop)
- {
+ {
+ if (progress_view_visible && !LLViewerAudio::getInstance()->getForcedTeleportFade())
+ {
+ LLViewerAudio::getInstance()->setForcedTeleportFade(true);
+ LLViewerAudio::getInstance()->startInternetStreamWithAutoFade(LLStringUtil::null);
+ LLViewerAudio::getInstance()->setNextStreamURI(LLStringUtil::null);
+ }
+
+ if (!progress_view_visible && LLViewerAudio::getInstance()->getForcedTeleportFade() == true)
+ {
+ LLViewerAudio::getInstance()->setForcedTeleportFade(false);
+ }
+
F32 music_volume = gSavedSettings.getF32("AudioLevelMusic");
BOOL music_muted = gSavedSettings.getBOOL("MuteMusic");
- music_volume = mute_volume * master_volume * music_volume;
- gAudiop->setInternetStreamGain ( music_muted || progress_view_visible ? 0.f : music_volume );
-
+ F32 fade_volume = LLViewerAudio::getInstance()->getFadeVolume();
+
+ music_volume = mute_volume * master_volume * music_volume * fade_volume;
+ gAudiop->setInternetStreamGain (music_muted ? 0.f : music_volume);
}
// Streaming Media
diff --git a/indra/newview/llvieweraudio.h b/indra/newview/llvieweraudio.h
index e5916285fb..a3da9fc6b8 100644
--- a/indra/newview/llvieweraudio.h
+++ b/indra/newview/llvieweraudio.h
@@ -27,6 +27,9 @@
#ifndef LL_VIEWERAUDIO_H
#define LL_VIEWERAUDIO_H
+#include "llframetimer.h"
+#include "llsingleton.h"
+
// comment out to turn off wind
#define kAUDIO_ENABLE_WIND
//#define kAUDIO_ENABLE_WATER 1 // comment out to turn off water
@@ -38,4 +41,48 @@ void audio_update_volume(bool force_update = true);
void audio_update_listener();
void audio_update_wind(bool force_update = true);
+class LLViewerAudio : public LLSingleton<LLViewerAudio>
+{
+public:
+
+ enum EFadeState
+ {
+ FADE_IDLE,
+ FADE_IN,
+ FADE_OUT,
+ };
+
+ LLViewerAudio();
+ virtual ~LLViewerAudio();
+
+ void startInternetStreamWithAutoFade(std::string streamURI);
+ void stopInternetStreamWithAutoFade();
+
+ bool onIdleUpdate();
+
+ EFadeState getFadeState() { return mFadeState; }
+ bool isDone() { return mDone; };
+ F32 getFadeVolume();
+ bool getForcedTeleportFade() { return mForcedTeleportFade; };
+ void setForcedTeleportFade(bool fade) { mForcedTeleportFade = fade;} ;
+ void setNextStreamURI(std::string stream) { mNextStreamURI = stream; } ;
+
+private:
+
+ bool mDone;
+ F32 mFadeTime;
+ std::string mNextStreamURI;
+ EFadeState mFadeState;
+ LLFrameTimer stream_fade_timer;
+ bool mIdleListnerActive;
+ bool mForcedTeleportFade;
+ boost::signals2::connection mTeleportFailedConnection;
+
+ void registerIdleListener();
+ void deregisterIdleListener() { mIdleListnerActive = false; };
+ void startFading();
+ void onTeleportFailed();
+
+};
+
#endif //LL_VIEWER_H
diff --git a/indra/newview/llviewercamera.cpp b/indra/newview/llviewercamera.cpp
index 7f7366dd3d..a437a8b3b5 100644
--- a/indra/newview/llviewercamera.cpp
+++ b/indra/newview/llviewercamera.cpp
@@ -218,8 +218,15 @@ void LLViewerCamera::calcProjection(const F32 far_distance) const
void LLViewerCamera::updateFrustumPlanes(LLCamera& camera, BOOL ortho, BOOL zflip, BOOL no_hacks)
{
GLint* viewport = (GLint*) gGLViewport;
- GLdouble* model = gGLModelView;
- GLdouble* proj = gGLProjection;
+ F64 model[16];
+ F64 proj[16];
+
+ for (U32 i = 0; i < 16; i++)
+ {
+ model[i] = (F64) gGLModelView[i];
+ proj[i] = (F64) gGLProjection[i];
+ }
+
GLdouble objX,objY,objZ;
LLVector3 frust[8];
@@ -325,8 +332,8 @@ void LLViewerCamera::setPerspective(BOOL for_selection,
aspect = getAspect();
// Load camera view matrix
- glMatrixMode( GL_PROJECTION );
- glLoadIdentity();
+ gGL.matrixMode(LLRender::MM_PROJECTION);
+ gGL.loadIdentity();
glh::matrix4f proj_mat;
@@ -385,14 +392,14 @@ void LLViewerCamera::setPerspective(BOOL for_selection,
proj_mat *= gl_perspective(fov_y,aspect,z_near,z_far);
- glLoadMatrixf(proj_mat.m);
+ gGL.loadMatrix(proj_mat.m);
for (U32 i = 0; i < 16; i++)
{
gGLProjection[i] = proj_mat.m[i];
}
- glMatrixMode( GL_MODELVIEW );
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
glh::matrix4f modelview((GLfloat*) OGL_TO_CFR_ROTATION);
@@ -402,7 +409,7 @@ void LLViewerCamera::setPerspective(BOOL for_selection,
modelview *= glh::matrix4f(ogl_matrix);
- glLoadMatrixf(modelview.m);
+ gGL.loadMatrix(modelview.m);
if (for_selection && (width > 1 || height > 1))
{
@@ -420,7 +427,6 @@ void LLViewerCamera::setPerspective(BOOL for_selection,
if (!for_selection && mZoomFactor == 1.f)
{
// Save GL matrices for access elsewhere in code, especially project_world_to_screen
- //glGetDoublev(GL_MODELVIEW_MATRIX, gGLModelView);
for (U32 i = 0; i < 16; i++)
{
gGLModelView[i] = modelview.m[i];
@@ -428,14 +434,6 @@ void LLViewerCamera::setPerspective(BOOL for_selection,
}
updateFrustumPlanes(*this);
-
- /*if (gSavedSettings.getBOOL("CameraOffset"))
- {
- glMatrixMode(GL_PROJECTION);
- glTranslatef(0,0,-50);
- glRotatef(20.0,1,0,0);
- glMatrixMode(GL_MODELVIEW);
- }*/
}
@@ -443,11 +441,20 @@ void LLViewerCamera::setPerspective(BOOL for_selection,
// screen coordinates to the agent's region.
void LLViewerCamera::projectScreenToPosAgent(const S32 screen_x, const S32 screen_y, LLVector3* pos_agent) const
{
-
GLdouble x, y, z;
+
+ F64 mdlv[16];
+ F64 proj[16];
+
+ for (U32 i = 0; i < 16; i++)
+ {
+ mdlv[i] = (F64) gGLModelView[i];
+ proj[i] = (F64) gGLProjection[i];
+ }
+
gluUnProject(
GLdouble(screen_x), GLdouble(screen_y), 0.0,
- gGLModelView, gGLProjection, (GLint*)gGLViewport,
+ mdlv, proj, (GLint*)gGLViewport,
&x,
&y,
&z );
@@ -484,8 +491,17 @@ BOOL LLViewerCamera::projectPosAgentToScreen(const LLVector3 &pos_agent, LLCoord
viewport[2] = world_view_rect.getWidth();
viewport[3] = world_view_rect.getHeight();
+ F64 mdlv[16];
+ F64 proj[16];
+
+ for (U32 i = 0; i < 16; i++)
+ {
+ mdlv[i] = (F64) gGLModelView[i];
+ proj[i] = (F64) gGLProjection[i];
+ }
+
if (GL_TRUE == gluProject(pos_agent.mV[VX], pos_agent.mV[VY], pos_agent.mV[VZ],
- gGLModelView, gGLProjection, (GLint*)viewport,
+ mdlv, proj, (GLint*)viewport,
&x, &y, &z))
{
// convert screen coordinates to virtual UI coordinates
@@ -587,9 +603,19 @@ BOOL LLViewerCamera::projectPosAgentToScreenEdge(const LLVector3 &pos_agent,
viewport[2] = world_view_rect.getWidth();
viewport[3] = world_view_rect.getHeight();
GLdouble x, y, z; // object's window coords, GL-style
+
+ F64 mdlv[16];
+ F64 proj[16];
+
+ for (U32 i = 0; i < 16; i++)
+ {
+ mdlv[i] = (F64) gGLModelView[i];
+ proj[i] = (F64) gGLProjection[i];
+ }
+
if (GL_TRUE == gluProject(pos_agent.mV[VX], pos_agent.mV[VY],
- pos_agent.mV[VZ], gGLModelView,
- gGLProjection, (GLint*)viewport,
+ pos_agent.mV[VZ], mdlv,
+ proj, (GLint*)viewport,
&x, &y, &z))
{
x /= gViewerWindow->getDisplayScale().mV[VX];
diff --git a/indra/newview/llviewercontrol.cpp b/indra/newview/llviewercontrol.cpp
index 0f0b7d7e78..093b84413a 100644
--- a/indra/newview/llviewercontrol.cpp
+++ b/indra/newview/llviewercontrol.cpp
@@ -118,12 +118,6 @@ static bool handleSetShaderChanged(const LLSD& newvalue)
gBumpImageList.destroyGL();
gBumpImageList.restoreGL();
- // Changing shader also changes the terrain detail to high, reflect that change here
- if (newvalue.asBoolean())
- {
- // shaders enabled, set terrain detail to high
- gSavedSettings.setS32("RenderTerrainDetail", 1);
- }
// else, leave terrain detail as is
LLViewerShaderMgr::instance()->setShaders();
return true;
@@ -187,21 +181,6 @@ static bool handleReleaseGLBufferChanged(const LLSD& newvalue)
return true;
}
-static bool handleFSAASamplesChanged(const LLSD& newvalue)
-{
- if (gPipeline.isInit())
- {
- gPipeline.releaseGLBuffers();
- gPipeline.createGLBuffers();
-
- if (LLPipeline::sRenderDeferred)
- {
- LLViewerShaderMgr::instance()->setShaders();
- }
- }
- return true;
-}
-
static bool handleAnisotropicChanged(const LLSD& newvalue)
{
LLImageGL::sGlobalUseAnisotropic = newvalue.asBoolean();
@@ -403,6 +382,7 @@ static bool handleRenderDeferredChanged(const LLSD& newvalue)
LLRenderTarget::sUseFBO = newvalue.asBoolean();
if (gPipeline.isInit())
{
+ LLPipeline::refreshCachedSettings();
gPipeline.updateRenderDeferred();
gPipeline.releaseGLBuffers();
gPipeline.createGLBuffers();
@@ -472,12 +452,6 @@ bool handleEffectColorChanged(const LLSD& newvalue)
return true;
}
-bool handleVectorizeChanged(const LLSD& newvalue)
-{
- LLViewerJointMesh::updateVectorize();
- return true;
-}
-
bool handleHighResSnapshotChanged(const LLSD& newvalue)
{
// High Res Snapshot active, must uncheck RenderUIInSnapshot
@@ -541,18 +515,12 @@ bool toggle_show_navigation_panel(const LLSD& newvalue)
{
bool value = newvalue.asBoolean();
- LLNavigationBar::getInstance()->showNavigationPanel(value);
+ LLNavigationBar::getInstance()->setVisible(value);
gSavedSettings.setBOOL("ShowMiniLocationPanel", !value);
return true;
}
-bool toggle_show_favorites_panel(const LLSD& newvalue)
-{
- LLNavigationBar::getInstance()->showFavoritesPanel(newvalue.asBoolean());
- return true;
-}
-
bool toggle_show_mini_location_panel(const LLSD& newvalue)
{
bool value = newvalue.asBoolean();
@@ -594,21 +562,20 @@ void settings_setup_listeners()
gSavedSettings.getControl("OctreeMaxNodeCapacity")->getSignal()->connect(boost::bind(&handleRepartition, _2));
gSavedSettings.getControl("OctreeAlphaDistanceFactor")->getSignal()->connect(boost::bind(&handleRepartition, _2));
gSavedSettings.getControl("OctreeAttachmentSizeFactor")->getSignal()->connect(boost::bind(&handleRepartition, _2));
- gSavedSettings.getControl("RenderMaxTextureIndex")->getSignal()->connect(boost::bind(&handleResetVertexBuffersChanged, _2));
+ gSavedSettings.getControl("RenderMaxTextureIndex")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _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));
gSavedSettings.getControl("RenderUIBuffer")->getSignal()->connect(boost::bind(&handleReleaseGLBufferChanged, _2));
+ gSavedSettings.getControl("RenderDepthOfField")->getSignal()->connect(boost::bind(&handleReleaseGLBufferChanged, _2));
+ gSavedSettings.getControl("RenderFSAASamples")->getSignal()->connect(boost::bind(&handleReleaseGLBufferChanged, _2));
gSavedSettings.getControl("RenderSpecularResX")->getSignal()->connect(boost::bind(&handleReleaseGLBufferChanged, _2));
gSavedSettings.getControl("RenderSpecularResY")->getSignal()->connect(boost::bind(&handleReleaseGLBufferChanged, _2));
gSavedSettings.getControl("RenderSpecularExponent")->getSignal()->connect(boost::bind(&handleReleaseGLBufferChanged, _2));
- gSavedSettings.getControl("RenderFSAASamples")->getSignal()->connect(boost::bind(&handleFSAASamplesChanged, _2));
gSavedSettings.getControl("RenderAnisotropic")->getSignal()->connect(boost::bind(&handleAnisotropicChanged, _2));
gSavedSettings.getControl("RenderShadowResolutionScale")->getSignal()->connect(boost::bind(&handleReleaseGLBufferChanged, _2));
gSavedSettings.getControl("RenderGlow")->getSignal()->connect(boost::bind(&handleReleaseGLBufferChanged, _2));
gSavedSettings.getControl("RenderGlow")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _2));
- gSavedSettings.getControl("EnableRippleWater")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _2));
gSavedSettings.getControl("RenderGlowResolutionPow")->getSignal()->connect(boost::bind(&handleReleaseGLBufferChanged, _2));
gSavedSettings.getControl("RenderAvatarCloth")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _2));
gSavedSettings.getControl("WindLightUseAtmosShaders")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _2));
@@ -639,7 +606,6 @@ void settings_setup_listeners()
gSavedSettings.getControl("RenderDeferred")->getSignal()->connect(boost::bind(&handleRenderDeferredChanged, _2));
gSavedSettings.getControl("RenderShadowDetail")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _2));
gSavedSettings.getControl("RenderDeferredSSAO")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _2));
- gSavedSettings.getControl("RenderDeferredGI")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _2));
gSavedSettings.getControl("RenderPerformanceTest")->getSignal()->connect(boost::bind(&handleRenderPerfTestChanged, _2));
gSavedSettings.getControl("TextureMemory")->getSignal()->connect(boost::bind(&handleVideoMemoryChanged, _2));
gSavedSettings.getControl("AuditTexture")->getSignal()->connect(boost::bind(&handleAuditTextureChanged, _2));
@@ -664,6 +630,7 @@ void settings_setup_listeners()
gSavedSettings.getControl("MuteAmbient")->getSignal()->connect(boost::bind(&handleAudioVolumeChanged, _2));
gSavedSettings.getControl("MuteUI")->getSignal()->connect(boost::bind(&handleAudioVolumeChanged, _2));
gSavedSettings.getControl("RenderVBOEnable")->getSignal()->connect(boost::bind(&handleResetVertexBuffersChanged, _2));
+ gSavedSettings.getControl("RenderUseVAO")->getSignal()->connect(boost::bind(&handleResetVertexBuffersChanged, _2));
gSavedSettings.getControl("RenderVBOMappingDisable")->getSignal()->connect(boost::bind(&handleResetVertexBuffersChanged, _2));
gSavedSettings.getControl("RenderUseStreamVBO")->getSignal()->connect(boost::bind(&handleResetVertexBuffersChanged, _2));
gSavedSettings.getControl("RenderPreferStreamDraw")->getSignal()->connect(boost::bind(&handleResetVertexBuffersChanged, _2));
@@ -718,10 +685,6 @@ void settings_setup_listeners()
gSavedSettings.getControl("UserLogFile")->getSignal()->connect(boost::bind(&handleLogFileChanged, _2));
gSavedSettings.getControl("RenderHideGroupTitle")->getSignal()->connect(boost::bind(handleHideGroupTitleChanged, _2));
gSavedSettings.getControl("HighResSnapshot")->getSignal()->connect(boost::bind(handleHighResSnapshotChanged, _2));
- gSavedSettings.getControl("VectorizePerfTest")->getSignal()->connect(boost::bind(&handleVectorizeChanged, _2));
- gSavedSettings.getControl("VectorizeEnable")->getSignal()->connect(boost::bind(&handleVectorizeChanged, _2));
- gSavedSettings.getControl("VectorizeProcessor")->getSignal()->connect(boost::bind(&handleVectorizeChanged, _2));
- gSavedSettings.getControl("VectorizeSkin")->getSignal()->connect(boost::bind(&handleVectorizeChanged, _2));
gSavedSettings.getControl("EnableVoiceChat")->getSignal()->connect(boost::bind(&handleVoiceClientPrefsChanged, _2));
gSavedSettings.getControl("PTTCurrentlyEnabled")->getSignal()->connect(boost::bind(&handleVoiceClientPrefsChanged, _2));
gSavedSettings.getControl("PushToTalkButton")->getSignal()->connect(boost::bind(&handleVoiceClientPrefsChanged, _2));
@@ -736,7 +699,6 @@ void settings_setup_listeners()
gSavedSettings.getControl("UseDebugMenus")->getSignal()->connect(boost::bind(&show_debug_menus));
gSavedSettings.getControl("AgentPause")->getSignal()->connect(boost::bind(&toggle_agent_pause, _2));
gSavedSettings.getControl("ShowNavbarNavigationPanel")->getSignal()->connect(boost::bind(&toggle_show_navigation_panel, _2));
- gSavedSettings.getControl("ShowNavbarFavoritesPanel")->getSignal()->connect(boost::bind(&toggle_show_favorites_panel, _2));
gSavedSettings.getControl("ShowMiniLocationPanel")->getSignal()->connect(boost::bind(&toggle_show_mini_location_panel, _2));
gSavedSettings.getControl("ShowObjectRenderingCost")->getSignal()->connect(boost::bind(&toggle_show_object_render_cost, _2));
gSavedSettings.getControl("UpdaterServiceSetting")->getSignal()->connect(boost::bind(&toggle_updater_service_active, _2));
diff --git a/indra/newview/llviewercontrollistener.cpp b/indra/newview/llviewercontrollistener.cpp
index 8bc25fa281..361b96221c 100644
--- a/indra/newview/llviewercontrollistener.cpp
+++ b/indra/newview/llviewercontrollistener.cpp
@@ -31,99 +31,196 @@
#include "llviewercontrollistener.h"
#include "llviewercontrol.h"
+#include "llcontrol.h"
+#include "llerror.h"
+#include "llsdutil.h"
+#include "stringize.h"
+#include <sstream>
-LLViewerControlListener gSavedSettingsListener;
+namespace {
+
+LLViewerControlListener sSavedSettingsListener;
+
+} // unnamed namespace
LLViewerControlListener::LLViewerControlListener()
: LLEventAPI("LLViewerControl",
- "LLViewerControl listener: set, toggle or set default for various controls",
- "group")
+ "LLViewerControl listener: set, toggle or set default for various controls")
{
- add("Global",
- "Set gSavedSettings control [\"key\"] to value [\"value\"]",
- boost::bind(&LLViewerControlListener::set, &gSavedSettings, _1));
- add("PerAccount",
- "Set gSavedPerAccountSettings control [\"key\"] to value [\"value\"]",
- boost::bind(&LLViewerControlListener::set, &gSavedPerAccountSettings, _1));
- add("Warning",
- "Set gWarningSettings control [\"key\"] to value [\"value\"]",
- boost::bind(&LLViewerControlListener::set, &gWarningSettings, _1));
- add("Crash",
- "Set gCrashSettings control [\"key\"] to value [\"value\"]",
- boost::bind(&LLViewerControlListener::set, &gCrashSettings, _1));
-
-#if 0
- add(/*"toggleControl",*/ "Global", boost::bind(&LLViewerControlListener::toggleControl, &gSavedSettings, _1));
- add(/*"toggleControl",*/ "PerAccount", boost::bind(&LLViewerControlListener::toggleControl, &gSavedPerAccountSettings, _1));
- add(/*"toggleControl",*/ "Warning", boost::bind(&LLViewerControlListener::toggleControl, &gWarningSettings, _1));
- add(/*"toggleControl",*/ "Crash", boost::bind(&LLViewerControlListener::toggleControl, &gCrashSettings, _1));
-
- add(/*"setDefault",*/ "Global", boost::bind(&LLViewerControlListener::setDefault, &gSavedSettings, _1));
- add(/*"setDefault",*/ "PerAccount", boost::bind(&LLViewerControlListener::setDefault, &gSavedPerAccountSettings, _1));
- add(/*"setDefault",*/ "Warning", boost::bind(&LLViewerControlListener::setDefault, &gWarningSettings, _1));
- add(/*"setDefault",*/ "Crash", boost::bind(&LLViewerControlListener::setDefault, &gCrashSettings, _1));
-#endif // 0
+ std::ostringstream groupnames;
+ groupnames << "[\"group\"] is one of ";
+ const char* delim = "";
+ for (LLControlGroup::key_iter cgki(LLControlGroup::beginKeys()),
+ cgkend(LLControlGroup::endKeys());
+ cgki != cgkend; ++cgki)
+ {
+ groupnames << delim << '"' << *cgki << '"';
+ delim = ", ";
+ }
+ groupnames << '\n';
+ std::string grouphelp(groupnames.str());
+ std::string replyhelp("If [\"reply\"] requested, send new [\"value\"] on specified LLEventPump\n");
+
+ add("set",
+ std::string("Set [\"group\"] control [\"key\"] to optional value [\"value\"]\n"
+ "If [\"value\"] omitted, set to control's defined default value\n") +
+ grouphelp + replyhelp,
+ &LLViewerControlListener::set,
+ LLSDMap("group", LLSD())("key", LLSD()));
+ add("toggle",
+ std::string("Toggle [\"group\"] control [\"key\"], if boolean\n") + grouphelp + replyhelp,
+ &LLViewerControlListener::toggle,
+ LLSDMap("group", LLSD())("key", LLSD()));
+ add("get",
+ std::string("Query [\"group\"] control [\"key\"], replying on LLEventPump [\"reply\"]\n") +
+ grouphelp,
+ &LLViewerControlListener::get,
+ LLSDMap("group", LLSD())("key", LLSD())("reply", LLSD()));
+ add("groups",
+ "Send on LLEventPump [\"reply\"] an array [\"groups\"] of valid group names",
+ &LLViewerControlListener::groups,
+ LLSDMap("reply", LLSD()));
+ add("vars",
+ std::string("For [\"group\"], send on LLEventPump [\"reply\"] an array [\"vars\"],\n"
+ "each of whose entries looks like:\n"
+ " [\"name\"], [\"type\"], [\"value\"], [\"comment\"]\n") + grouphelp,
+ &LLViewerControlListener::vars,
+ LLSDMap("group", LLSD())("reply", LLSD()));
}
-//static
-void LLViewerControlListener::set(LLControlGroup * controls, LLSD const & event_data)
+struct Info
{
- if(event_data.has("key"))
+ Info(const LLSD& request):
+ response(LLSD(), request),
+ groupname(request["group"]),
+ group(LLControlGroup::getInstance(groupname)),
+ key(request["key"]),
+ control(NULL)
{
- std::string key(event_data["key"]);
+ if (! group)
+ {
+ response.error(STRINGIZE("Unrecognized group '" << groupname << "'"));
+ return;
+ }
- if(controls->controlExists(key))
+ control = group->getControl(key);
+ if (! control)
{
- controls->setUntypedValue(key, event_data["value"]);
+ response.error(STRINGIZE("In group '" << groupname
+ << "', unrecognized control key '" << key << "'"));
}
- else
+ }
+
+ ~Info()
+ {
+ // If in fact the request passed to our constructor names a valid
+ // group and key, grab the final value of the indicated control and
+ // stuff it in our response. Since this outer destructor runs before
+ // the contained Response destructor, this data will go into the
+ // response we send.
+ if (control)
{
- llwarns << "requested unknown control: \"" << key << '\"' << llendl;
+ response["name"] = control->getName();
+ response["type"] = group->typeEnumToString(control->type());
+ response["value"] = control->get();
+ response["comment"] = control->getComment();
}
}
+
+ LLEventAPI::Response response;
+ std::string groupname;
+ LLControlGroup* group;
+ std::string key;
+ LLControlVariable* control;
+};
+
+//static
+void LLViewerControlListener::set(LLSD const & request)
+{
+ Info info(request);
+ if (! info.control)
+ return;
+
+ if (request.has("value"))
+ {
+ info.control->setValue(request["value"]);
+ }
+ else
+ {
+ info.control->resetToDefault();
+ }
}
//static
-void LLViewerControlListener::toggleControl(LLControlGroup * controls, LLSD const & event_data)
+void LLViewerControlListener::toggle(LLSD const & request)
{
- if(event_data.has("key"))
+ Info info(request);
+ if (! info.control)
+ return;
+
+ if (info.control->isType(TYPE_BOOLEAN))
+ {
+ info.control->set(! info.control->get().asBoolean());
+ }
+ else
{
- std::string key(event_data["key"]);
+ info.response.error(STRINGIZE("toggle of non-boolean '" << info.groupname
+ << "' control '" << info.key
+ << "', type is "
+ << info.group->typeEnumToString(info.control->type())));
+ }
+}
- if(controls->controlExists(key))
- {
- LLControlVariable * control = controls->getControl(key);
- if(control->isType(TYPE_BOOLEAN))
- {
- control->set(!control->get().asBoolean());
- }
- else
- {
- llwarns << "requested toggle of non-boolean control: \"" << key << "\", type is " << control->type() << llendl;
- }
- }
- else
- {
- llwarns << "requested unknown control: \"" << key << '\"' << llendl;
- }
+void LLViewerControlListener::get(LLSD const & request)
+{
+ // The Info constructor and destructor actually do all the work here.
+ Info info(request);
+}
+
+void LLViewerControlListener::groups(LLSD const & request)
+{
+ // No Info, we're not looking up either a group or a control name.
+ Response response(LLSD(), request);
+ for (LLControlGroup::key_iter cgki(LLControlGroup::beginKeys()),
+ cgkend(LLControlGroup::endKeys());
+ cgki != cgkend; ++cgki)
+ {
+ response["groups"].append(*cgki);
}
}
-//static
-void LLViewerControlListener::setDefault(LLControlGroup * controls, LLSD const & event_data)
+struct CollectVars: public LLControlGroup::ApplyFunctor
{
- if(event_data.has("key"))
+ CollectVars(LLControlGroup* g):
+ mGroup(g)
+ {}
+
+ virtual void apply(const std::string& name, LLControlVariable* control)
{
- std::string key(event_data["key"]);
+ vars.append(LLSDMap
+ ("name", name)
+ ("type", mGroup->typeEnumToString(control->type()))
+ ("value", control->get())
+ ("comment", control->getComment()));
+ }
- if(controls->controlExists(key))
- {
- LLControlVariable * control = controls->getControl(key);
- control->resetToDefault();
- }
- else
- {
- llwarns << "requested unknown control: \"" << key << '\"' << llendl;
- }
+ LLControlGroup* mGroup;
+ LLSD vars;
+};
+
+void LLViewerControlListener::vars(LLSD const & request)
+{
+ // This method doesn't use Info, because we're not looking up a specific
+ // control name.
+ Response response(LLSD(), request);
+ std::string groupname(request["group"]);
+ LLControlGroup* group(LLControlGroup::getInstance(groupname));
+ if (! group)
+ {
+ return response.error(STRINGIZE("Unrecognized group '" << groupname << "'"));
}
+
+ CollectVars collector(group);
+ group->applyToAll(&collector);
+ response["vars"] = collector.vars;
}
diff --git a/indra/newview/llviewercontrollistener.h b/indra/newview/llviewercontrollistener.h
index fd211b97af..2e72046924 100644
--- a/indra/newview/llviewercontrollistener.h
+++ b/indra/newview/llviewercontrollistener.h
@@ -40,11 +40,11 @@ public:
LLViewerControlListener();
private:
- static void set(LLControlGroup *controls, LLSD const & event_data);
- static void toggleControl(LLControlGroup *controls, LLSD const & event_data);
- static void setDefault(LLControlGroup *controls, LLSD const & event_data);
+ static void set(LLSD const & event_data);
+ static void toggle(LLSD const & event_data);
+ static void get(LLSD const & event_data);
+ static void groups(LLSD const & event_data);
+ static void vars(LLSD const & event_data);
};
-extern LLViewerControlListener gSavedSettingsListener;
-
#endif // LL_LLVIEWERCONTROLLISTENER_H
diff --git a/indra/newview/llviewerdisplay.cpp b/indra/newview/llviewerdisplay.cpp
index 6142ee0dd6..cb40af7061 100644
--- a/indra/newview/llviewerdisplay.cpp
+++ b/indra/newview/llviewerdisplay.cpp
@@ -114,8 +114,8 @@ void render_disconnected_background();
void display_startup()
{
if ( !gViewerWindow->getActive()
- || !gViewerWindow->mWindow->getVisible()
- || gViewerWindow->mWindow->getMinimized() )
+ || !gViewerWindow->getWindow()->getVisible()
+ || gViewerWindow->getWindow()->getMinimized() )
{
return;
}
@@ -124,7 +124,8 @@ void display_startup()
// Update images?
//gImageList.updateImages(0.01f);
-
+ LLTexUnit::sWhiteTexture = LLViewerFetchedTexture::sWhiteImagep->getTexName();
+
LLGLSDefault gls_default;
// Required for HTML update in login screen
@@ -157,7 +158,7 @@ void display_startup()
LLGLState::checkStates();
LLGLState::checkTextureChannels();
- gViewerWindow->mWindow->swapBuffers();
+ gViewerWindow->getWindow()->swapBuffers();
glClear(GL_DEPTH_BUFFER_BIT);
}
@@ -202,7 +203,7 @@ void display_stats()
gMemoryAllocated = LLMemory::getCurrentRSS();
U32 memory = (U32)(gMemoryAllocated / (1024*1024));
llinfos << llformat("MEMORY: %d MB", memory) << llendl;
- LLMemory::logMemoryInfo() ;
+ LLMemory::logMemoryInfo(TRUE) ;
gRecentMemoryTime.reset();
}
}
@@ -212,6 +213,10 @@ static LLFastTimer::DeclareTimer FTM_RENDER("Render", true);
static LLFastTimer::DeclareTimer FTM_UPDATE_SKY("Update Sky");
static LLFastTimer::DeclareTimer FTM_UPDATE_TEXTURES("Update Textures");
static LLFastTimer::DeclareTimer FTM_IMAGE_UPDATE("Update Images");
+static LLFastTimer::DeclareTimer FTM_IMAGE_UPDATE_CLASS("Class");
+static LLFastTimer::DeclareTimer FTM_IMAGE_UPDATE_BUMP("Bump");
+static LLFastTimer::DeclareTimer FTM_IMAGE_UPDATE_LIST("List");
+static LLFastTimer::DeclareTimer FTM_IMAGE_UPDATE_DELETE("Delete");
// Paint the display!
void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
@@ -223,7 +228,8 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
{ //skip render on frames where window has been resized
gGL.flush();
glClear(GL_COLOR_BUFFER_BIT);
- gViewerWindow->mWindow->swapBuffers();
+ gViewerWindow->getWindow()->swapBuffers();
+ LLPipeline::refreshCachedSettings();
gPipeline.resizeScreenTexture();
gResizeScreenTexture = FALSE;
gWindowResized = FALSE;
@@ -260,8 +266,8 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
// In fact, must explicitly check the minimized state before drawing.
// Attempting to draw into a minimized window causes a GL error. JC
if ( !gViewerWindow->getActive()
- || !gViewerWindow->mWindow->getVisible()
- || gViewerWindow->mWindow->getMinimized() )
+ || !gViewerWindow->getWindow()->getVisible()
+ || gViewerWindow->getWindow()->getMinimized() )
{
// Clean up memory the pools may have allocated
if (rebuild)
@@ -523,10 +529,9 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
// Note that these are not the same as GL defaults...
stop_glerror();
- F32 one[4] = {1.f, 1.f, 1.f, 1.f};
- glLightModelfv (GL_LIGHT_MODEL_AMBIENT,one);
+ gGL.setAmbientLightColor(LLColor4::white);
stop_glerror();
-
+
/////////////////////////////////////
//
// Render
@@ -612,11 +617,6 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
LLDrawable::incrementVisible();
LLSpatialGroup::sNoDelete = TRUE;
- LLPipeline::sUseOcclusion =
- (!gUseWireframe
- && LLFeatureManager::getInstance()->isFeatureAvailable("UseOcclusion")
- && gSavedSettings.getBOOL("UseOcclusion")
- && gGLManager.mHasOcclusionQuery) ? 2 : 0;
LLTexUnit::sWhiteTexture = LLViewerFetchedTexture::sWhiteImagep->getTexName();
/*if (LLPipeline::sUseOcclusion && LLPipeline::sRenderDeferred)
@@ -624,12 +624,6 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
LLPipeline::sUseOcclusion = 3;
}*/
- LLPipeline::sAutoMaskAlphaDeferred = gSavedSettings.getBOOL("RenderAutoMaskAlphaDeferred");
- LLPipeline::sAutoMaskAlphaNonDeferred = gSavedSettings.getBOOL("RenderAutoMaskAlphaNonDeferred");
- LLPipeline::sUseFarClip = gSavedSettings.getBOOL("RenderUseFarClip");
- LLVOAvatar::sMaxVisible = (U32)gSavedSettings.getS32("RenderAvatarMaxVisible");
- LLPipeline::sDelayVBUpdate = gSavedSettings.getBOOL("RenderDelayVBUpdate");
-
S32 occlusion = LLPipeline::sUseOcclusion;
if (gDepthDirty)
{ //depth buffer is invalid, don't overwrite occlusion state
@@ -657,10 +651,6 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
{
LLMemType mt_ds(LLMemType::MTYPE_DISPLAY_SWAP);
- {
- LLFastTimer ftm(FTM_CLIENT_COPY);
- LLVertexBuffer::clientCopy(0.016);
- }
if (gResizeScreenTexture)
{
@@ -701,10 +691,10 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
glh_set_current_projection(proj);
glh_set_current_modelview(mod);
- glMatrixMode(GL_PROJECTION);
- glLoadMatrixf(proj.m);
- glMatrixMode(GL_MODELVIEW);
- glLoadMatrixf(mod.m);
+ gGL.matrixMode(LLRender::MM_PROJECTION);
+ gGL.loadMatrix(proj.m);
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
+ gGL.loadMatrix(mod.m);
gViewerWindow->setup3DViewport();
LLGLState::checkStates();
@@ -724,6 +714,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
LLAppViewer::instance()->pingMainloopTimeout("Display:Imagery");
gPipeline.generateWaterReflection(*LLViewerCamera::getInstance());
gPipeline.generateHighlight(*LLViewerCamera::getInstance());
+ gPipeline.renderPhysicsDisplay();
}
LLGLState::checkStates();
@@ -742,18 +733,31 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
LLMemType mt_iu(LLMemType::MTYPE_DISPLAY_IMAGE_UPDATE);
LLFastTimer t(FTM_IMAGE_UPDATE);
- LLViewerTexture::updateClass(LLViewerCamera::getInstance()->getVelocityStat()->getMean(),
- LLViewerCamera::getInstance()->getAngularVelocityStat()->getMean());
+ {
+ LLFastTimer t(FTM_IMAGE_UPDATE_CLASS);
+ LLViewerTexture::updateClass(LLViewerCamera::getInstance()->getVelocityStat()->getMean(),
+ LLViewerCamera::getInstance()->getAngularVelocityStat()->getMean());
+ }
- gBumpImageList.updateImages(); // must be called before gTextureList version so that it's textures are thrown out first.
+
+ {
+ LLFastTimer t(FTM_IMAGE_UPDATE_BUMP);
+ gBumpImageList.updateImages(); // must be called before gTextureList version so that it's textures are thrown out first.
+ }
- F32 max_image_decode_time = 0.050f*gFrameIntervalSeconds; // 50 ms/second decode time
- max_image_decode_time = llclamp(max_image_decode_time, 0.002f, 0.005f ); // min 2ms/frame, max 5ms/frame)
- gTextureList.updateImages(max_image_decode_time);
+ {
+ LLFastTimer t(FTM_IMAGE_UPDATE_LIST);
+ F32 max_image_decode_time = 0.050f*gFrameIntervalSeconds; // 50 ms/second decode time
+ max_image_decode_time = llclamp(max_image_decode_time, 0.002f, 0.005f ); // min 2ms/frame, max 5ms/frame)
+ gTextureList.updateImages(max_image_decode_time);
+ }
- //remove dead textures from GL
- LLImageGL::deleteDeadTextures();
- stop_glerror();
+ {
+ LLFastTimer t(FTM_IMAGE_UPDATE_DELETE);
+ //remove dead textures from GL
+ LLImageGL::deleteDeadTextures();
+ stop_glerror();
+ }
}
LLGLState::checkStates();
@@ -812,13 +816,13 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
//// assumes frontmost floater with focus is opaque
//if (frontmost_floaterp && gFocusMgr.childHasKeyboardFocus(frontmost_floaterp))
//{
- // glMatrixMode(GL_MODELVIEW);
- // glPushMatrix();
+ // gGL.matrixMode(LLRender::MM_MODELVIEW);
+ // gGL.pushMatrix();
// {
// gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
// glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_TRUE);
- // glLoadIdentity();
+ // gGL.loadIdentity();
// LLRect floater_rect = frontmost_floaterp->calcScreenRect();
// // deflate by one pixel so rounding errors don't occlude outside of floater extents
@@ -828,8 +832,8 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
// (F32)floater_rect.mRight / (F32)gViewerWindow->getWindowWidthScaled(),
// (F32)floater_rect.mBottom / (F32)gViewerWindow->getWindowHeightScaled());
// floater_3d_rect.translate(-0.5f, -0.5f);
- // glTranslatef(0.f, 0.f, -LLViewerCamera::getInstance()->getNear());
- // glScalef(LLViewerCamera::getInstance()->getNear() * LLViewerCamera::getInstance()->getAspect() / sinf(LLViewerCamera::getInstance()->getView()), LLViewerCamera::getInstance()->getNear() / sinf(LLViewerCamera::getInstance()->getView()), 1.f);
+ // gGL.translatef(0.f, 0.f, -LLViewerCamera::getInstance()->getNear());
+ // gGL.scalef(LLViewerCamera::getInstance()->getNear() * LLViewerCamera::getInstance()->getAspect() / sinf(LLViewerCamera::getInstance()->getView()), LLViewerCamera::getInstance()->getNear() / sinf(LLViewerCamera::getInstance()->getView()), 1.f);
// gGL.color4fv(LLColor4::white.mV);
// gGL.begin(LLVertexBuffer::QUADS);
// {
@@ -841,11 +845,10 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
// gGL.end();
// glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
// }
- // glPopMatrix();
+ // gGL.popMatrix();
//}
LLPipeline::sUnderWaterRender = LLViewerCamera::getInstance()->cameraUnderWater() ? TRUE : FALSE;
- LLPipeline::refreshRenderDeferred();
LLGLState::checkStates();
LLGLState::checkClientArrays();
@@ -865,6 +868,11 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
else
{
gPipeline.mScreen.bindTarget();
+ if (LLPipeline::sUnderWaterRender && !gPipeline.canUseWindLightShaders())
+ {
+ const LLColor4 &col = LLDrawPoolWater::sWaterFogColor;
+ glClearColor(col.mV[0], col.mV[1], col.mV[2], 0.f);
+ }
gPipeline.mScreen.clear();
}
@@ -978,10 +986,10 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
void render_hud_attachments()
{
LLMemType mt_ra(LLMemType::MTYPE_DISPLAY_RENDER_ATTACHMENTS);
- glMatrixMode(GL_PROJECTION);
- glPushMatrix();
- glMatrixMode(GL_MODELVIEW);
- glPushMatrix();
+ gGL.matrixMode(LLRender::MM_PROJECTION);
+ gGL.pushMatrix();
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
+ gGL.pushMatrix();
glh::matrix4f current_proj = glh_get_current_projection();
glh::matrix4f current_mod = glh_get_current_modelview();
@@ -1067,10 +1075,10 @@ void render_hud_attachments()
}
LLPipeline::sUseOcclusion = use_occlusion;
}
- glMatrixMode(GL_PROJECTION);
- glPopMatrix();
- glMatrixMode(GL_MODELVIEW);
- glPopMatrix();
+ gGL.matrixMode(LLRender::MM_PROJECTION);
+ gGL.popMatrix();
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
+ gGL.popMatrix();
glh_set_current_projection(current_proj);
glh_set_current_modelview(current_mod);
@@ -1153,12 +1161,12 @@ BOOL setup_hud_matrices(const LLRect& screen_region)
if (!result) return result;
// set up transform to keep HUD objects in front of camera
- glMatrixMode(GL_PROJECTION);
- glLoadMatrixf(proj.m);
+ gGL.matrixMode(LLRender::MM_PROJECTION);
+ gGL.loadMatrix(proj.m);
glh_set_current_projection(proj);
- glMatrixMode(GL_MODELVIEW);
- glLoadMatrixf(model.m);
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
+ gGL.loadMatrix(model.m);
glh_set_current_modelview(model);
return TRUE;
}
@@ -1174,8 +1182,8 @@ void render_ui(F32 zoom_factor, int subfield)
if (!gSnapshot)
{
- glPushMatrix();
- glLoadMatrixd(gGLLastModelView);
+ gGL.pushMatrix();
+ gGL.loadMatrix(gGLLastModelView);
glh_set_current_modelview(glh_copy_matrix(gGLLastModelView));
}
@@ -1231,13 +1239,13 @@ void render_ui(F32 zoom_factor, int subfield)
if (!gSnapshot)
{
glh_set_current_modelview(saved_view);
- glPopMatrix();
+ gGL.popMatrix();
}
if (gDisplaySwapBuffers)
{
LLFastTimer t(FTM_SWAP);
- gViewerWindow->mWindow->swapBuffers();
+ gViewerWindow->getWindow()->swapBuffers();
}
gDisplaySwapBuffers = TRUE;
}
@@ -1304,10 +1312,10 @@ void draw_axes()
gGL.vertex3f(0.0f, 0.0f, 40.0f);
gGL.end();
// Some coordinate axes
- glPushMatrix();
- glTranslatef( v.mV[VX], v.mV[VY], v.mV[VZ] );
+ gGL.pushMatrix();
+ gGL.translatef( v.mV[VX], v.mV[VY], v.mV[VZ] );
renderCoordinateAxes();
- glPopMatrix();
+ gGL.popMatrix();
}
void render_ui_3d()
@@ -1329,14 +1337,19 @@ void render_ui_3d()
// Debugging stuff goes before the UI.
+ stop_glerror();
+
+ if (LLGLSLShader::sNoFixedFunction)
+ {
+ gUIProgram.bind();
+ }
+
// Coordinate axes
if (gSavedSettings.getBOOL("ShowAxes"))
{
draw_axes();
}
- stop_glerror();
-
gViewerWindow->renderSelections(FALSE, FALSE, TRUE); // Non HUD call in render_hud_elements
stop_glerror();
}
@@ -1377,10 +1390,10 @@ void render_ui_2d()
gGL.pushMatrix();
S32 half_width = (gViewerWindow->getWorldViewWidthScaled() / 2);
S32 half_height = (gViewerWindow->getWorldViewHeightScaled() / 2);
- glScalef(LLUI::sGLScaleFactor.mV[0], LLUI::sGLScaleFactor.mV[1], 1.f);
- glTranslatef((F32)half_width, (F32)half_height, 0.f);
+ gGL.scalef(LLUI::sGLScaleFactor.mV[0], LLUI::sGLScaleFactor.mV[1], 1.f);
+ gGL.translatef((F32)half_width, (F32)half_height, 0.f);
F32 zoom = gAgentCamera.mHUDCurZoom;
- glScalef(zoom,zoom,1.f);
+ gGL.scalef(zoom,zoom,1.f);
gGL.color4fv(LLColor4::white.mV);
gl_rect_2d(-half_width, half_height, half_width, -half_height, FALSE);
gGL.popMatrix();
@@ -1459,6 +1472,11 @@ void render_ui_2d()
void render_disconnected_background()
{
+ if (LLGLSLShader::sNoFixedFunction)
+ {
+ gUIProgram.bind();
+ }
+
gGL.color4f(1,1,1,1);
if (!gDisconnectedImagep && gDisconnected)
{
@@ -1512,22 +1530,28 @@ void render_disconnected_background()
{
LLGLSUIDefault gls_ui;
gViewerWindow->setup2DRender();
- glPushMatrix();
+ gGL.pushMatrix();
{
// scale ui to reflect UIScaleFactor
// this can't be done in setup2DRender because it requires a
// pushMatrix/popMatrix pair
const LLVector2& display_scale = gViewerWindow->getDisplayScale();
- glScalef(display_scale.mV[VX], display_scale.mV[VY], 1.f);
+ gGL.scalef(display_scale.mV[VX], display_scale.mV[VY], 1.f);
gGL.getTexUnit(0)->bind(gDisconnectedImagep);
gGL.color4f(1.f, 1.f, 1.f, 1.f);
gl_rect_2d_simple_tex(width, height);
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
}
- glPopMatrix();
+ gGL.popMatrix();
}
gGL.flush();
+
+ if (LLGLSLShader::sNoFixedFunction)
+ {
+ gUIProgram.unbind();
+ }
+
}
void display_cleanup()
diff --git a/indra/newview/llviewerfloaterreg.cpp b/indra/newview/llviewerfloaterreg.cpp
index 8e2240981b..bb870f7651 100644
--- a/indra/newview/llviewerfloaterreg.cpp
+++ b/indra/newview/llviewerfloaterreg.cpp
@@ -37,6 +37,7 @@
#include "llfloaterabout.h"
#include "llfloateranimpreview.h"
#include "llfloaterauction.h"
+#include "llfloateravatar.h"
#include "llfloateravatarpicker.h"
#include "llfloateravatartextures.h"
#include "llfloaterbeacons.h"
@@ -56,15 +57,15 @@
#include "llfloatereditwater.h"
#include "llfloaterenvironmentsettings.h"
#include "llfloaterevent.h"
-#include "llfloatersearch.h"
+#include "llfloaterdestinations.h"
#include "llfloaterfonttest.h"
#include "llfloatergesture.h"
#include "llfloatergodtools.h"
#include "llfloatergroups.h"
#include "llfloaterhardwaresettings.h"
#include "llfloaterhelpbrowser.h"
-#include "llfloatermediabrowser.h"
#include "llfloaterwebcontent.h"
+#include "llfloaterwebprofile.h"
#include "llfloatermediasettings.h"
#include "llfloaterhud.h"
#include "llfloaterimagepreview.h"
@@ -82,9 +83,9 @@
#include "llfloaternotificationsconsole.h"
#include "llfloaterobjectweights.h"
#include "llfloateropenobject.h"
+#include "llfloateroutbox.h"
#include "llfloaterpay.h"
#include "llfloaterperms.h"
-#include "llfloaterpostcard.h"
#include "llfloaterpostprocess.h"
#include "llfloaterpreference.h"
#include "llfloaterproperties.h"
@@ -93,9 +94,10 @@
#include "llfloaterreporter.h"
#include "llfloaterscriptdebug.h"
#include "llfloaterscriptlimits.h"
+#include "llfloatersearch.h"
#include "llfloatersellland.h"
#include "llfloatersettingsdebug.h"
-#include "llfloatersidetraytab.h"
+#include "llfloatersidepanelcontainer.h"
#include "llfloatersnapshot.h"
#include "llfloatersounddevices.h"
#include "llfloatertelehub.h"
@@ -104,6 +106,8 @@
#include "llfloatertools.h"
#include "llfloatertos.h"
#include "llfloatertopobjects.h"
+#include "llfloatertoybox.h"
+#include "llfloatertranslationsettings.h"
#include "llfloateruipreview.h"
#include "llfloatervoiceeffect.h"
#include "llfloaterwhitelistentry.h"
@@ -129,6 +133,7 @@
#include "llscriptfloater.h"
#include "llfloatermodelpreview.h"
#include "llcommandhandler.h"
+#include "llnearbychatbar.h"
// *NOTE: Please add files in alphabetical order to keep merges easy.
@@ -163,7 +168,9 @@ void LLViewerFloaterReg::registerFloaters()
LLFloaterAboutUtil::registerFloater();
LLFloaterReg::add("fast_timers", "floater_fast_timers.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFastTimerView>);
LLFloaterReg::add("about_land", "floater_about_land.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterLand>);
+ LLFloaterReg::add("appearance", "floater_my_appearance.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSidePanelContainer>);
LLFloaterReg::add("auction", "floater_auction.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterAuction>);
+ LLFloaterReg::add("avatar", "floater_avatar.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterAvatar>);
LLFloaterReg::add("avatar_picker", "floater_avatar_picker.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterAvatarPicker>);
LLFloaterReg::add("avatar_textures", "floater_avatar_textures.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterAvatarTextures>);
@@ -179,10 +186,12 @@ void LLViewerFloaterReg::registerFloaters()
LLFloaterReg::add("bumps", "floater_bumps.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterBump>);
LLFloaterReg::add("camera", "floater_camera.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterCamera>);
- LLFloaterReg::add("nearby_chat", "floater_nearby_chat.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLNearbyChat>);
+ LLFloaterReg::add("chat_bar", "floater_chat_bar.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLNearbyChatBar>);
LLFloaterReg::add("compile_queue", "floater_script_queue.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterCompileQueue>);
+ LLFloaterReg::add("destinations", "floater_destinations.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterDestinations>);
+
LLFloaterReg::add("env_post_process", "floater_post_process.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterPostProcess>);
LLFloaterReg::add("env_settings", "floater_environment_settings.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterEnvironmentSettings>);
LLFloaterReg::add("env_delete_preset", "floater_delete_env_preset.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterDeleteEnvPreset>);
@@ -205,7 +214,7 @@ void LLViewerFloaterReg::registerFloaters()
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>);
- LLFloaterReg::add("inventory", "floater_inventory.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterInventory>);
+ LLFloaterReg::add("inventory", "floater_my_inventory.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSidePanelContainer>);
LLFloaterReg::add("inspect", "floater_inspect.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterInspect>);
LLInspectAvatarUtil::registerFloater();
LLInspectGroupUtil::registerFloater();
@@ -218,7 +227,6 @@ void LLViewerFloaterReg::registerFloaters()
LLFloaterReg::add("land_holdings", "floater_land_holdings.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterLandHoldings>);
LLFloaterReg::add("mem_leaking", "floater_mem_leaking.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterMemLeak>);
- LLFloaterReg::add("media_browser", "floater_media_browser.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterMediaBrowser>);
LLFloaterReg::add("media_settings", "floater_media_settings.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterMediaSettings>);
LLFloaterReg::add("message_critical", "floater_critical.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterTOS>);
LLFloaterReg::add("message_tos", "floater_tos.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterTOS>);
@@ -231,14 +239,18 @@ void LLViewerFloaterReg::registerFloaters()
LLFloaterReg::add("object_weights", "floater_object_weights.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterObjectWeights>);
LLFloaterReg::add("openobject", "floater_openobject.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterOpenObject>);
+ LLFloaterReg::add("outbox", "floater_merchant_outbox.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterOutbox>);
LLFloaterReg::add("outgoing_call", "floater_outgoing_call.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLOutgoingCallDialog>);
LLFloaterPayUtil::registerFloater();
- LLFloaterReg::add("postcard", "floater_postcard.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterPostcard>);
+ LLFloaterReg::add("people", "floater_people.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSidePanelContainer>);
+ LLFloaterReg::add("places", "floater_places.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSidePanelContainer>);
LLFloaterReg::add("preferences", "floater_preferences.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterPreference>);
LLFloaterReg::add("prefs_proxy", "floater_preferences_proxy.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterPreferenceProxy>);
LLFloaterReg::add("prefs_hardware_settings", "floater_hardware_settings.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterHardwareSettings>);
+ LLFloaterReg::add("prefs_translation", "floater_translation_settings.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterTranslationSettings>);
LLFloaterReg::add("perm_prefs", "floater_perm_prefs.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterPerms>);
+ LLFloaterReg::add("picks", "floater_picks.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSidePanelContainer>);
LLFloaterReg::add("pref_joystick", "floater_joystick.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterJoystick>);
LLFloaterReg::add("preview_anim", "floater_preview_animation.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLPreviewAnim>, "preview");
LLFloaterReg::add("preview_gesture", "floater_preview_gesture.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLPreviewGesture>, "preview");
@@ -257,6 +269,7 @@ void LLViewerFloaterReg::registerFloaters()
LLFloaterReg::add("test_text_editor", "floater_test_text_editor.xml", &LLFloaterReg::build<LLFloater>);
LLFloaterReg::add("test_widgets", "floater_test_widgets.xml", &LLFloaterReg::build<LLFloater>);
LLFloaterReg::add("top_objects", "floater_top_objects.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterTopObjects>);
+ LLFloaterReg::add("toybox", "floater_toybox.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterToybox>);
LLFloaterReg::add("reporter", "floater_report_abuse.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterReporter>);
LLFloaterReg::add("reset_queue", "floater_script_queue.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterResetQueue>);
@@ -269,29 +282,31 @@ void LLViewerFloaterReg::registerFloaters()
LLFloaterReg::add("script_limits", "floater_script_limits.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterScriptLimits>);
LLFloaterReg::add("sell_land", "floater_sell_land.xml", &LLFloaterSellLand::buildFloater);
LLFloaterReg::add("settings_debug", "floater_settings_debug.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSettingsDebug>);
- LLFloaterReg::add("side_bar_tab", "floater_side_bar_tab.xml", &LLFloaterReg::build<LLFloaterSideTrayTab>);
LLFloaterReg::add("sound_devices", "floater_sound_devices.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSoundDevices>);
LLFloaterReg::add("stats", "floater_stats.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloater>);
LLFloaterReg::add("start_queue", "floater_script_queue.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterRunQueue>);
LLFloaterReg::add("stop_queue", "floater_script_queue.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterNotRunQueue>);
LLFloaterReg::add("snapshot", "floater_snapshot.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSnapshot>);
LLFloaterReg::add("search", "floater_search.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSearch>);
- LLFloaterReg::add("profile", "floater_web_content.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterWebContent>);
+ LLFloaterReg::add("my_profile", "floater_my_web_profile.xml", (LLFloaterBuildFunc)&LLFloaterWebProfile::create);
+ LLFloaterReg::add("profile", "floater_web_profile.xml", (LLFloaterBuildFunc)&LLFloaterWebProfile::create);
+ LLFloaterReg::add("how_to", "floater_how_to.xml", (LLFloaterBuildFunc)&LLFloaterWebContent::create);
LLFloaterUIPreviewUtil::registerFloater();
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("upload_model_wizard", "floater_model_wizard.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterModelWizard>);
+ LLFloaterReg::add("upload_script", "floater_script_preview.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterScriptPreview>, "upload");
+ LLFloaterReg::add("upload_sound", "floater_sound_preview.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSoundPreview>, "upload");
LLFloaterReg::add("voice_controls", "floater_voice_controls.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLCallFloater>);
LLFloaterReg::add("voice_effect", "floater_voice_effect.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterVoiceEffect>);
- LLFloaterReg::add("web_content", "floater_web_content.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterWebContent>);
+ LLFloaterReg::add("web_content", "floater_web_content.xml", (LLFloaterBuildFunc)&LLFloaterWebContent::create);
LLFloaterReg::add("whitelist_entry", "floater_whitelist_entry.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterWhiteListEntry>);
- LLFloaterWindowSizeUtil::registerFloater();
+ LLFloaterReg::add("window_size", "floater_window_size.xml", &LLFloaterReg::build<LLFloaterWindowSize>);
LLFloaterReg::add("world_map", "floater_world_map.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterWorldMap>);
// *NOTE: Please keep these alphabetized for easier merges
diff --git a/indra/newview/llviewerfoldertype.cpp b/indra/newview/llviewerfoldertype.cpp
index 9101222393..a179b61cff 100644
--- a/indra/newview/llviewerfoldertype.cpp
+++ b/indra/newview/llviewerfoldertype.cpp
@@ -40,6 +40,7 @@ struct ViewerFolderEntry : public LLDictionaryEntry
const std::string &icon_name_open, // name of the folder icon
const std::string &icon_name_closed,
BOOL is_quiet, // folder doesn't need a UI update when changed
+ bool hide_if_empty, // folder not shown if empty
const std::string &dictionary_name = empty_string // no reverse lookup needed on non-ensembles, so in most cases just leave this blank
)
:
@@ -47,7 +48,8 @@ struct ViewerFolderEntry : public LLDictionaryEntry
mNewCategoryName(new_category_name),
mIconNameOpen(icon_name_open),
mIconNameClosed(icon_name_closed),
- mIsQuiet(is_quiet)
+ mIsQuiet(is_quiet),
+ mHideIfEmpty(hide_if_empty)
{
mAllowedNames.clear();
}
@@ -66,7 +68,8 @@ struct ViewerFolderEntry : public LLDictionaryEntry
*/
mIconNameOpen("Inv_FolderOpen"), mIconNameClosed("Inv_FolderClosed"),
mNewCategoryName(new_category_name),
- mIsQuiet(FALSE)
+ mIsQuiet(FALSE),
+ mHideIfEmpty(false)
{
const std::string delims (",");
LLStringUtilBase<char>::getTokens(allowed_names, mAllowedNames, delims);
@@ -91,6 +94,7 @@ struct ViewerFolderEntry : public LLDictionaryEntry
typedef std::vector<std::string> name_vec_t;
name_vec_t mAllowedNames;
BOOL mIsQuiet;
+ bool mHideIfEmpty;
};
class LLViewerFolderDictionary : public LLSingleton<LLViewerFolderDictionary>,
@@ -104,43 +108,43 @@ protected:
LLViewerFolderDictionary::LLViewerFolderDictionary()
{
- // NEW CATEGORY NAME FOLDER OPEN FOLDER CLOSED QUIET?
- // |-------------------------|-----------------------|----------------------|-----------|
- addEntry(LLFolderType::FT_TEXTURE, new ViewerFolderEntry("Textures", "Inv_SysOpen", "Inv_SysClosed", FALSE));
- addEntry(LLFolderType::FT_SOUND, new ViewerFolderEntry("Sounds", "Inv_SysOpen", "Inv_SysClosed", FALSE));
- addEntry(LLFolderType::FT_CALLINGCARD, new ViewerFolderEntry("Calling Cards", "Inv_SysOpen", "Inv_SysClosed", FALSE));
- addEntry(LLFolderType::FT_LANDMARK, new ViewerFolderEntry("Landmarks", "Inv_SysOpen", "Inv_SysClosed", FALSE));
- addEntry(LLFolderType::FT_CLOTHING, new ViewerFolderEntry("Clothing", "Inv_SysOpen", "Inv_SysClosed", FALSE));
- addEntry(LLFolderType::FT_OBJECT, new ViewerFolderEntry("Objects", "Inv_SysOpen", "Inv_SysClosed", FALSE));
- addEntry(LLFolderType::FT_NOTECARD, new ViewerFolderEntry("Notecards", "Inv_SysOpen", "Inv_SysClosed", FALSE));
- addEntry(LLFolderType::FT_ROOT_INVENTORY, new ViewerFolderEntry("My Inventory", "Inv_SysOpen", "Inv_SysClosed", FALSE));
- addEntry(LLFolderType::FT_LSL_TEXT, new ViewerFolderEntry("Scripts", "Inv_SysOpen", "Inv_SysClosed", FALSE));
- addEntry(LLFolderType::FT_BODYPART, new ViewerFolderEntry("Body Parts", "Inv_SysOpen", "Inv_SysClosed", FALSE));
- addEntry(LLFolderType::FT_TRASH, new ViewerFolderEntry("Trash", "Inv_TrashOpen", "Inv_TrashClosed", TRUE));
- addEntry(LLFolderType::FT_SNAPSHOT_CATEGORY, new ViewerFolderEntry("Photo Album", "Inv_SysOpen", "Inv_SysClosed", FALSE));
- addEntry(LLFolderType::FT_LOST_AND_FOUND, new ViewerFolderEntry("Lost And Found", "Inv_LostOpen", "Inv_LostClosed", TRUE));
- addEntry(LLFolderType::FT_ANIMATION, new ViewerFolderEntry("Animations", "Inv_SysOpen", "Inv_SysClosed", FALSE));
- addEntry(LLFolderType::FT_GESTURE, new ViewerFolderEntry("Gestures", "Inv_SysOpen", "Inv_SysClosed", FALSE));
- addEntry(LLFolderType::FT_FAVORITE, new ViewerFolderEntry("Favorites", "Inv_SysOpen", "Inv_SysClosed", FALSE));
+ // NEW CATEGORY NAME FOLDER OPEN FOLDER CLOSED QUIET? HIDE IF EMPTY?
+ // |-------------------------|-----------------------|----------------------|-----------|--------------|
+ addEntry(LLFolderType::FT_TEXTURE, new ViewerFolderEntry("Textures", "Inv_SysOpen", "Inv_SysClosed", FALSE, true));
+ addEntry(LLFolderType::FT_SOUND, new ViewerFolderEntry("Sounds", "Inv_SysOpen", "Inv_SysClosed", FALSE, true));
+ addEntry(LLFolderType::FT_CALLINGCARD, new ViewerFolderEntry("Calling Cards", "Inv_SysOpen", "Inv_SysClosed", FALSE, true));
+ addEntry(LLFolderType::FT_LANDMARK, new ViewerFolderEntry("Landmarks", "Inv_SysOpen", "Inv_SysClosed", FALSE, true));
+ addEntry(LLFolderType::FT_CLOTHING, new ViewerFolderEntry("Clothing", "Inv_SysOpen", "Inv_SysClosed", FALSE, true));
+ addEntry(LLFolderType::FT_OBJECT, new ViewerFolderEntry("Objects", "Inv_SysOpen", "Inv_SysClosed", FALSE, true));
+ addEntry(LLFolderType::FT_NOTECARD, new ViewerFolderEntry("Notecards", "Inv_SysOpen", "Inv_SysClosed", FALSE, true));
+ addEntry(LLFolderType::FT_ROOT_INVENTORY, new ViewerFolderEntry("My Inventory", "Inv_SysOpen", "Inv_SysClosed", FALSE, false));
+ addEntry(LLFolderType::FT_LSL_TEXT, new ViewerFolderEntry("Scripts", "Inv_SysOpen", "Inv_SysClosed", FALSE, true));
+ addEntry(LLFolderType::FT_BODYPART, new ViewerFolderEntry("Body Parts", "Inv_SysOpen", "Inv_SysClosed", FALSE, true));
+ addEntry(LLFolderType::FT_TRASH, new ViewerFolderEntry("Trash", "Inv_TrashOpen", "Inv_TrashClosed", TRUE, false));
+ addEntry(LLFolderType::FT_SNAPSHOT_CATEGORY, new ViewerFolderEntry("Photo Album", "Inv_SysOpen", "Inv_SysClosed", FALSE, true));
+ addEntry(LLFolderType::FT_LOST_AND_FOUND, new ViewerFolderEntry("Lost And Found", "Inv_LostOpen", "Inv_LostClosed", TRUE, true));
+ addEntry(LLFolderType::FT_ANIMATION, new ViewerFolderEntry("Animations", "Inv_SysOpen", "Inv_SysClosed", FALSE, true));
+ addEntry(LLFolderType::FT_GESTURE, new ViewerFolderEntry("Gestures", "Inv_SysOpen", "Inv_SysClosed", FALSE, true));
+ addEntry(LLFolderType::FT_FAVORITE, new ViewerFolderEntry("Favorites", "Inv_SysOpen", "Inv_SysClosed", FALSE, true));
- addEntry(LLFolderType::FT_CURRENT_OUTFIT, new ViewerFolderEntry("Current Outfit", "Inv_SysOpen", "Inv_SysClosed", TRUE));
- addEntry(LLFolderType::FT_OUTFIT, new ViewerFolderEntry("New Outfit", "Inv_LookFolderOpen", "Inv_LookFolderClosed", TRUE));
- addEntry(LLFolderType::FT_MY_OUTFITS, new ViewerFolderEntry("My Outfits", "Inv_SysOpen", "Inv_SysClosed", TRUE));
- addEntry(LLFolderType::FT_MESH, new ViewerFolderEntry("Meshes", "Inv_SysOpen", "Inv_SysClosed", FALSE));
+ addEntry(LLFolderType::FT_CURRENT_OUTFIT, new ViewerFolderEntry("Current Outfit", "Inv_SysOpen", "Inv_SysClosed", TRUE, false));
+ addEntry(LLFolderType::FT_OUTFIT, new ViewerFolderEntry("New Outfit", "Inv_LookFolderOpen", "Inv_LookFolderClosed", TRUE, true));
+ addEntry(LLFolderType::FT_MY_OUTFITS, new ViewerFolderEntry("My Outfits", "Inv_SysOpen", "Inv_SysClosed", TRUE, true));
+ addEntry(LLFolderType::FT_MESH, new ViewerFolderEntry("Meshes", "Inv_SysOpen", "Inv_SysClosed", FALSE, true));
- addEntry(LLFolderType::FT_INBOX, new ViewerFolderEntry("Inbox", "Inv_SysOpen", "Inv_SysClosed", FALSE));
- addEntry(LLFolderType::FT_OUTBOX, new ViewerFolderEntry("Outbox", "Inv_SysOpen", "Inv_SysClosed", FALSE));
+ addEntry(LLFolderType::FT_INBOX, new ViewerFolderEntry("Inbox", "Inv_SysOpen", "Inv_SysClosed", FALSE, true));
+ addEntry(LLFolderType::FT_OUTBOX, new ViewerFolderEntry("Outbox", "Inv_SysOpen", "Inv_SysClosed", FALSE, true));
- addEntry(LLFolderType::FT_BASIC_ROOT, new ViewerFolderEntry("Basic Root", "Inv_SysOpen", "Inv_SysClosed", FALSE));
+ addEntry(LLFolderType::FT_BASIC_ROOT, new ViewerFolderEntry("Basic Root", "Inv_SysOpen", "Inv_SysClosed", FALSE, true));
- addEntry(LLFolderType::FT_NONE, new ViewerFolderEntry("New Folder", "Inv_FolderOpen", "Inv_FolderClosed", FALSE, "default"));
+ addEntry(LLFolderType::FT_NONE, new ViewerFolderEntry("New Folder", "Inv_FolderOpen", "Inv_FolderClosed", FALSE, false, "default"));
#if SUPPORT_ENSEMBLES
initEnsemblesFromFile();
#else
for (U32 type = (U32)LLFolderType::FT_ENSEMBLE_START; type <= (U32)LLFolderType::FT_ENSEMBLE_END; ++type)
{
- addEntry((LLFolderType::EType)type, new ViewerFolderEntry("New Folder", "Inv_FolderOpen", "Inv_FolderClosed", FALSE));
+ addEntry((LLFolderType::EType)type, new ViewerFolderEntry("New Folder", "Inv_FolderOpen", "Inv_FolderClosed", FALSE, false));
}
#endif
}
@@ -259,6 +263,15 @@ BOOL LLViewerFolderType::lookupIsQuietType(LLFolderType::EType folder_type)
return FALSE;
}
+bool LLViewerFolderType::lookupIsHiddenIfEmpty(LLFolderType::EType folder_type)
+{
+ const ViewerFolderEntry *entry = LLViewerFolderDictionary::getInstance()->lookup(folder_type);
+ if (entry)
+ {
+ return entry->mHideIfEmpty;
+ }
+ return false;
+}
const std::string &LLViewerFolderType::lookupNewCategoryName(LLFolderType::EType folder_type)
{
diff --git a/indra/newview/llviewerfoldertype.h b/indra/newview/llviewerfoldertype.h
index f5938de619..13d5a8fbbd 100644
--- a/indra/newview/llviewerfoldertype.h
+++ b/indra/newview/llviewerfoldertype.h
@@ -40,6 +40,7 @@ public:
static const std::string& lookupIconName(EType folder_type, BOOL is_open = FALSE); // folder icon name
static BOOL lookupIsQuietType(EType folder_type); // folder doesn't require UI update when changes have occured
+ static bool lookupIsHiddenIfEmpty(EType folder_type); // folder is not displayed if empty
static const std::string& lookupNewCategoryName(EType folder_type); // default name when creating new category
static LLFolderType::EType lookupTypeFromNewCategoryName(const std::string& name); // default name when creating new category
diff --git a/indra/newview/llviewerhelp.cpp b/indra/newview/llviewerhelp.cpp
index 3a3d4f3881..a8a918f259 100644
--- a/indra/newview/llviewerhelp.cpp
+++ b/indra/newview/llviewerhelp.cpp
@@ -69,15 +69,12 @@ LLHelpHandler gHelpHandler;
//////////////////////////////
// implement LLHelp interface
-void LLViewerHelp::showTopic(const std::string &topic)
+std::string LLViewerHelp::getURL(const std::string &topic)
{
// allow overriding the help server with a local help file
if( gSavedSettings.getBOOL("HelpUseLocal") )
{
- showHelp();
- LLFloaterHelpBrowser* helpbrowser = dynamic_cast<LLFloaterHelpBrowser*>(LLFloaterReg::getInstance("help_browser"));
- helpbrowser->navigateToLocalPage( "help-offline" , "index.html" );
- return;
+ return "__local";
}
// if the help topic is empty, use the default topic
@@ -99,11 +96,12 @@ void LLViewerHelp::showTopic(const std::string &topic)
}
}
- // work out the URL for this topic and display it
- showHelp();
-
- std::string helpURL = LLViewerHelpUtil::buildHelpURL( help_topic );
- setRawURL(helpURL);
+ return LLViewerHelpUtil::buildHelpURL( help_topic );
+}
+
+void LLViewerHelp::showTopic(const std::string& topic)
+{
+ LLFloaterReg::showInstance("help_browser", topic);
}
std::string LLViewerHelp::defaultTopic()
@@ -146,23 +144,3 @@ std::string LLViewerHelp::getTopicFromFocus()
return defaultTopic();
}
-// static
-void LLViewerHelp::showHelp()
-{
- LLFloaterReg::showInstance("help_browser");
-}
-
-// static
-void LLViewerHelp::setRawURL(std::string url)
-{
- LLFloaterHelpBrowser* helpbrowser = dynamic_cast<LLFloaterHelpBrowser*>(LLFloaterReg::getInstance("help_browser"));
- if (helpbrowser)
- {
- helpbrowser->openMedia(url);
- }
- else
- {
- llwarns << "Eep, help_browser floater not found" << llendl;
- }
-}
-
diff --git a/indra/newview/llviewerhelp.h b/indra/newview/llviewerhelp.h
index 7612986227..a983012e2e 100644
--- a/indra/newview/llviewerhelp.h
+++ b/indra/newview/llviewerhelp.h
@@ -45,6 +45,8 @@ class LLViewerHelp : public LLHelp, public LLSingleton<LLViewerHelp>
/// display the specified help topic in the help viewer
/*virtual*/ void showTopic(const std::string &topic);
+ std::string getURL(const std::string& topic);
+
// return topic derived from viewer UI focus, else default topic
std::string getTopicFromFocus();
@@ -56,10 +58,6 @@ class LLViewerHelp : public LLHelp, public LLSingleton<LLViewerHelp>
// return topic to use for the top-level help, invoked by F1
/*virtual*/ std::string f1HelpTopic();
-
- private:
- static void showHelp(); // make sure help UI is visible & raised
- static void setRawURL(std::string url); // send URL to help UI
};
#endif // header guard
diff --git a/indra/newview/llviewerinventory.cpp b/indra/newview/llviewerinventory.cpp
index ad65a8846c..163581ea7f 100644
--- a/indra/newview/llviewerinventory.cpp
+++ b/indra/newview/llviewerinventory.cpp
@@ -34,7 +34,9 @@
#include "llagent.h"
#include "llagentcamera.h"
#include "llagentwearables.h"
+#include "llfloatersidepanelcontainer.h"
#include "llviewerfoldertype.h"
+#include "llfloatersidepanelcontainer.h"
#include "llfolderview.h"
#include "llviewercontrol.h"
#include "llconsole.h"
@@ -43,7 +45,6 @@
#include "llinventorymodel.h"
#include "llinventorymodelbackgroundfetch.h"
#include "llgesturemgr.h"
-#include "llsidetray.h"
#include "llinventorybridge.h"
#include "llinventorypanel.h"
@@ -141,7 +142,7 @@ public:
mInventoryItemsDict["Female - Wow"] = LLTrans::getString("Female - Wow");
//common
- mInventoryItemsDict["/bow1"] = LLTrans::getString("/bow1");
+ mInventoryItemsDict["/bow"] = LLTrans::getString("/bow");
mInventoryItemsDict["/clap"] = LLTrans::getString("/clap");
mInventoryItemsDict["/count"] = LLTrans::getString("/count");
mInventoryItemsDict["/extinguish"] = LLTrans::getString("/extinguish");
@@ -220,7 +221,7 @@ public:
// support secondlife:///app/inventory/show
if (params[0].asString() == "show")
{
- LLSideTray::getInstance()->showPanel("sidepanel_inventory", LLSD());
+ LLFloaterSidePanelContainer::showPanel("inventory", LLSD());
return true;
}
@@ -976,7 +977,7 @@ void ModifiedCOFCallback::fire(const LLUUID& inv_item)
if( gAgentCamera.cameraCustomizeAvatar() )
{
// If we're in appearance editing mode, the current tab may need to be refreshed
- LLSidepanelAppearance *panel = dynamic_cast<LLSidepanelAppearance*>(LLSideTray::getInstance()->getPanel("sidepanel_appearance"));
+ LLSidepanelAppearance *panel = dynamic_cast<LLSidepanelAppearance*>(LLFloaterSidePanelContainer::getPanel("appearance"));
if (panel)
{
panel->showDefaultSubpart();
@@ -1208,7 +1209,23 @@ void move_inventory_item(
gAgent.sendReliableMessage();
}
-void copy_inventory_from_notecard(const LLUUID& object_id, const LLUUID& notecard_inv_id, const LLInventoryItem *src, U32 callback_id)
+const LLUUID get_folder_by_itemtype(const LLInventoryItem *src)
+{
+ LLUUID retval = LLUUID::null;
+
+ if (src)
+ {
+ retval = gInventory.findCategoryUUIDForType(LLFolderType::assetTypeToFolderType(src->getType()));
+ }
+
+ return retval;
+}
+
+void copy_inventory_from_notecard(const LLUUID& destination_id,
+ const LLUUID& object_id,
+ const LLUUID& notecard_inv_id,
+ const LLInventoryItem *src,
+ U32 callback_id)
{
if (NULL == src)
{
@@ -1254,7 +1271,7 @@ void copy_inventory_from_notecard(const LLUUID& object_id, const LLUUID& notecar
body["notecard-id"] = notecard_inv_id;
body["object-id"] = object_id;
body["item-id"] = src->getUUID();
- body["folder-id"] = gInventory.findCategoryUUIDForType(LLFolderType::assetTypeToFolderType(src->getType()));
+ body["folder-id"] = destination_id;
body["callback-id"] = (LLSD::Integer)callback_id;
request["message"] = "CopyInventoryFromNotecard";
diff --git a/indra/newview/llviewerinventory.h b/indra/newview/llviewerinventory.h
index 41542a4e0f..7822ef4da6 100644
--- a/indra/newview/llviewerinventory.h
+++ b/indra/newview/llviewerinventory.h
@@ -363,7 +363,10 @@ void move_inventory_item(
const std::string& new_name,
LLPointer<LLInventoryCallback> cb);
-void copy_inventory_from_notecard(const LLUUID& object_id,
+const LLUUID get_folder_by_itemtype(const LLInventoryItem *src);
+
+void copy_inventory_from_notecard(const LLUUID& destination_id,
+ const LLUUID& object_id,
const LLUUID& notecard_inv_id,
const LLInventoryItem *src,
U32 callback_id = 0);
diff --git a/indra/newview/llviewerjoint.cpp b/indra/newview/llviewerjoint.cpp
index baf85d6884..a907f102f8 100644
--- a/indra/newview/llviewerjoint.cpp
+++ b/indra/newview/llviewerjoint.cpp
@@ -126,7 +126,7 @@ void LLViewerJoint::setValid( BOOL valid, BOOL recursive )
// //----------------------------------------------------------------
// // push matrix stack
// //----------------------------------------------------------------
-// glPushMatrix();
+// gGL.pushMatrix();
// //----------------------------------------------------------------
// // render the bone to my parent
@@ -140,8 +140,8 @@ void LLViewerJoint::setValid( BOOL valid, BOOL recursive )
// // offset to joint position and
// // rotate to our orientation
// //----------------------------------------------------------------
-// glLoadIdentity();
-// glMultMatrixf( &getWorldMatrix().mMatrix[0][0] );
+// gGL.loadIdentity();
+// gGL.multMatrix( &getWorldMatrix().mMatrix[0][0] );
// //----------------------------------------------------------------
// // render joint axes
@@ -233,7 +233,7 @@ void LLViewerJoint::setValid( BOOL valid, BOOL recursive )
// //----------------------------------------------------------------
// // pop matrix stack
// //----------------------------------------------------------------
-// glPopMatrix();
+// gGL.popMatrix();
// }
@@ -346,7 +346,7 @@ U32 LLViewerJoint::render( F32 pixelArea, BOOL first_pass, BOOL is_dummy )
// F32 boneSize = 0.02f;
// // rotate to point to child (bone direction)
-// glPushMatrix();
+// gGL.pushMatrix();
// LLVector3 boneX = getPosition();
// F32 length = boneX.normVec();
@@ -362,7 +362,7 @@ U32 LLViewerJoint::render( F32 pixelArea, BOOL first_pass, BOOL is_dummy )
// rotateMat.setFwdRow( boneX );
// rotateMat.setLeftRow( boneY );
// rotateMat.setUpRow( boneZ );
-// glMultMatrixf( &rotateMat.mMatrix[0][0] );
+// gGL.multMatrix( &rotateMat.mMatrix[0][0] );
// // render the bone
// gGL.color3f( 0.5f, 0.5f, 0.0f );
@@ -388,7 +388,7 @@ U32 LLViewerJoint::render( F32 pixelArea, BOOL first_pass, BOOL is_dummy )
// gGL.end();
// // restore matrix
-// glPopMatrix();
+// gGL.popMatrix();
// }
//--------------------------------------------------------------------
@@ -541,9 +541,9 @@ void LLViewerJointCollisionVolume::renderCollision()
updateWorldMatrix();
gGL.pushMatrix();
- glMultMatrixf( &mXform.getWorldMatrix().mMatrix[0][0] );
+ gGL.multMatrix( &mXform.getWorldMatrix().mMatrix[0][0] );
- gGL.color3f( 0.f, 0.f, 1.f );
+ gGL.diffuseColor3f( 0.f, 0.f, 1.f );
gGL.begin(LLRender::LINES);
diff --git a/indra/newview/llviewerjointmesh.cpp b/indra/newview/llviewerjointmesh.cpp
index 77c8bb0329..76f4e18c27 100644
--- a/indra/newview/llviewerjointmesh.cpp
+++ b/indra/newview/llviewerjointmesh.cpp
@@ -459,7 +459,10 @@ void LLViewerJointMesh::uploadJointMatrices()
}
}
stop_glerror();
- glUniform4fvARB(gAvatarMatrixParam, 45, mat);
+ if (LLGLSLShader::sCurBoundShaderPtr)
+ {
+ LLGLSLShader::sCurBoundShaderPtr->uniform4fv(LLViewerShaderMgr::AVATAR_MATRIX, 45, mat);
+ }
stop_glerror();
}
else
@@ -512,7 +515,8 @@ U32 LLViewerJointMesh::drawShape( F32 pixelArea, BOOL first_pass, BOOL is_dummy)
{
if (!mValid || !mMesh || !mFace || !mVisible ||
!mFace->getVertexBuffer() ||
- mMesh->getNumFaces() == 0)
+ mMesh->getNumFaces() == 0 ||
+ (LLGLSLShader::sNoFixedFunction && LLGLSLShader::sCurBoundShaderPtr == NULL))
{
return 0;
}
@@ -527,13 +531,13 @@ U32 LLViewerJointMesh::drawShape( F32 pixelArea, BOOL first_pass, BOOL is_dummy)
// setup current color
//----------------------------------------------------------------
if (is_dummy)
- glColor4fv(LLVOAvatar::getDummyColor().mV);
+ gGL.diffuseColor4fv(LLVOAvatar::getDummyColor().mV);
else
- glColor4fv(mColor.mV);
+ gGL.diffuseColor4fv(mColor.mV);
stop_glerror();
- LLGLSSpecular specular(LLColor4(1.f,1.f,1.f,1.f), mFace->getPool()->getVertexShaderLevel() > 0 ? 0.f : mShiny);
+ LLGLSSpecular specular(LLColor4(1.f,1.f,1.f,1.f), (mFace->getPool()->getVertexShaderLevel() > 0 || LLGLSLShader::sNoFixedFunction) ? 0.f : mShiny);
//----------------------------------------------------------------
// setup current texture
@@ -547,11 +551,11 @@ U32 LLViewerJointMesh::drawShape( F32 pixelArea, BOOL first_pass, BOOL is_dummy)
if (mIsTransparent)
{
- glColor4f(1.f, 1.f, 1.f, 1.f);
+ gGL.diffuseColor4f(1.f, 1.f, 1.f, 1.f);
}
else
{
- glColor4f(0.7f, 0.6f, 0.3f, 1.f);
+ gGL.diffuseColor4f(0.7f, 0.6f, 0.3f, 1.f);
gGL.getTexUnit(diffuse_channel)->setTextureColorBlend(LLTexUnit::TBO_LERP_TEX_ALPHA, LLTexUnit::TBS_TEX_COLOR, LLTexUnit::TBS_PREV_COLOR);
}
}
@@ -582,13 +586,16 @@ U32 LLViewerJointMesh::drawShape( F32 pixelArea, BOOL first_pass, BOOL is_dummy)
gGL.getTexUnit(diffuse_channel)->bind(LLViewerTextureManager::getFetchedTexture(IMG_DEFAULT));
}
- mFace->getVertexBuffer()->setBuffer(sRenderMask);
+
+ U32 mask = sRenderMask;
U32 start = mMesh->mFaceVertexOffset;
U32 end = start + mMesh->mFaceVertexCount - 1;
U32 count = mMesh->mFaceIndexCount;
U32 offset = mMesh->mFaceIndexOffset;
+ LLVertexBuffer* buff = mFace->getVertexBuffer();
+
if (mMesh->hasWeights())
{
if ((mFace->getPool()->getVertexShaderLevel() > 0))
@@ -597,17 +604,24 @@ U32 LLViewerJointMesh::drawShape( F32 pixelArea, BOOL first_pass, BOOL is_dummy)
{
uploadJointMatrices();
}
+ mask = mask | LLVertexBuffer::MAP_WEIGHT;
+ if (mFace->getPool()->getVertexShaderLevel() > 1)
+ {
+ mask = mask | LLVertexBuffer::MAP_CLOTHWEIGHT;
+ }
}
- mFace->getVertexBuffer()->drawRange(LLRender::TRIANGLES, start, end, count, offset);
+ buff->setBuffer(mask);
+ buff->drawRange(LLRender::TRIANGLES, start, end, count, offset);
}
else
{
- glPushMatrix();
+ gGL.pushMatrix();
LLMatrix4 jointToWorld = getWorldMatrix();
- glMultMatrixf((GLfloat*)jointToWorld.mMatrix);
- mFace->getVertexBuffer()->drawRange(LLRender::TRIANGLES, start, end, count, offset);
- glPopMatrix();
+ gGL.multMatrix((GLfloat*)jointToWorld.mMatrix);
+ buff->setBuffer(mask);
+ buff->drawRange(LLRender::TRIANGLES, start, end, count, offset);
+ gGL.popMatrix();
}
gPipeline.addTrianglesDrawn(count);
@@ -692,9 +706,9 @@ void LLViewerJointMesh::updateFaceData(LLFace *face, F32 pixel_area, BOOL damp_w
if (num_verts)
{
- face->getGeometryAvatar(verticesp, normalsp, tex_coordsp, vertex_weightsp, clothing_weightsp);
face->getVertexBuffer()->getIndexStrider(indicesp);
-
+ face->getGeometryAvatar(verticesp, normalsp, tex_coordsp, vertex_weightsp, clothing_weightsp);
+
verticesp += mMesh->mFaceVertexOffset;
normalsp += mMesh->mFaceVertexOffset;
@@ -752,7 +766,7 @@ BOOL LLViewerJointMesh::updateLOD(F32 pixel_area, BOOL activate)
}
// static
-void LLViewerJointMesh::updateGeometryOriginal(LLFace *mFace, LLPolyMesh *mMesh)
+void LLViewerJointMesh::updateGeometry(LLFace *mFace, LLPolyMesh *mMesh)
{
LLStrider<LLVector3> o_vertices;
LLStrider<LLVector3> o_normals;
@@ -803,64 +817,7 @@ void LLViewerJointMesh::updateGeometryOriginal(LLFace *mFace, LLPolyMesh *mMesh)
}
}
- buffer->setBuffer(0);
-}
-
-const U32 UPDATE_GEOMETRY_CALL_MASK = 0x1FFF; // 8K samples before overflow
-const U32 UPDATE_GEOMETRY_CALL_OVERFLOW = ~UPDATE_GEOMETRY_CALL_MASK;
-static bool sUpdateGeometryCallPointer = false;
-static F64 sUpdateGeometryGlobalTime = 0.0 ;
-static F64 sUpdateGeometryElapsedTime = 0.0 ;
-static F64 sUpdateGeometryElapsedTimeOff = 0.0 ;
-static F64 sUpdateGeometryElapsedTimeOn = 0.0 ;
-static F64 sUpdateGeometryRunAvgOff[10];
-static F64 sUpdateGeometryRunAvgOn[10];
-static U32 sUpdateGeometryRunCount = 0 ;
-static U32 sUpdateGeometryCalls = 0 ;
-static U32 sUpdateGeometryLastProcessor = 0 ;
-static BOOL sVectorizePerfTest = FALSE;
-static U32 sVectorizeProcessor = 0;
-
-//static
-void (*LLViewerJointMesh::sUpdateGeometryFunc)(LLFace* face, LLPolyMesh* mesh);
-
-//static
-void LLViewerJointMesh::updateVectorize()
-{
- sVectorizePerfTest = gSavedSettings.getBOOL("VectorizePerfTest");
- sVectorizeProcessor = gSavedSettings.getU32("VectorizeProcessor");
- BOOL vectorizeEnable = gSavedSettings.getBOOL("VectorizeEnable");
- BOOL vectorizeSkin = gSavedSettings.getBOOL("VectorizeSkin");
-
- std::string vp;
- switch(sVectorizeProcessor)
- {
- case 2: vp = "SSE2"; break; // *TODO: replace the magic #s
- case 1: vp = "SSE"; break;
- default: vp = "COMPILER DEFAULT"; break;
- }
- LL_INFOS("AppInit") << "Vectorization : " << ( vectorizeEnable ? "ENABLED" : "DISABLED" ) << LL_ENDL ;
- LL_INFOS("AppInit") << "Vector Processor : " << vp << LL_ENDL ;
- LL_INFOS("AppInit") << "Vectorized Skinning : " << ( vectorizeSkin ? "ENABLED" : "DISABLED" ) << LL_ENDL ;
- if(vectorizeEnable && vectorizeSkin)
- {
- switch(sVectorizeProcessor)
- {
- case 2:
- sUpdateGeometryFunc = &updateGeometrySSE2;
- break;
- case 1:
- sUpdateGeometryFunc = &updateGeometrySSE;
- break;
- default:
- sUpdateGeometryFunc = &updateGeometryVectorized;
- break;
- }
- }
- else
- {
- sUpdateGeometryFunc = &updateGeometryOriginal;
- }
+ buffer->flush();
}
void LLViewerJointMesh::updateJointGeometry()
@@ -875,129 +832,8 @@ void LLViewerJointMesh::updateJointGeometry()
return;
}
- if (!sVectorizePerfTest)
- {
- // Once we've measured performance, just run the specified
- // code version.
- if(sUpdateGeometryFunc == updateGeometryOriginal)
- uploadJointMatrices();
- sUpdateGeometryFunc(mFace, mMesh);
- }
- else
- {
- // At startup, measure the amount of time in skinning and choose
- // the fastest one.
- LLTimer ug_timer ;
-
- if (sUpdateGeometryCallPointer)
- {
- if(sUpdateGeometryFunc == updateGeometryOriginal)
- uploadJointMatrices();
- // call accelerated version for this processor
- sUpdateGeometryFunc(mFace, mMesh);
- }
- else
- {
- uploadJointMatrices();
- updateGeometryOriginal(mFace, mMesh);
- }
-
- sUpdateGeometryElapsedTime += ug_timer.getElapsedTimeF64();
- ++sUpdateGeometryCalls;
- if(0 != (sUpdateGeometryCalls & UPDATE_GEOMETRY_CALL_OVERFLOW))
- {
- F64 time_since_app_start = ug_timer.getElapsedSeconds();
- if(sUpdateGeometryGlobalTime == 0.0
- || sUpdateGeometryLastProcessor != sVectorizeProcessor)
- {
- sUpdateGeometryGlobalTime = time_since_app_start;
- sUpdateGeometryElapsedTime = 0;
- sUpdateGeometryCalls = 0;
- sUpdateGeometryRunCount = 0;
- sUpdateGeometryLastProcessor = sVectorizeProcessor;
- sUpdateGeometryCallPointer = false;
- return;
- }
- F64 percent_time_in_function =
- ( sUpdateGeometryElapsedTime * 100.0 ) / ( time_since_app_start - sUpdateGeometryGlobalTime ) ;
- sUpdateGeometryGlobalTime = time_since_app_start;
- if (!sUpdateGeometryCallPointer)
- {
- // First set of run data is with vectorization off.
- sUpdateGeometryCallPointer = true;
- llinfos << "profile (avg of " << sUpdateGeometryCalls << " samples) = "
- << "vectorize off " << percent_time_in_function
- << "% of time with "
- << (sUpdateGeometryElapsedTime / (F64)sUpdateGeometryCalls)
- << " seconds per call "
- << llendl;
- sUpdateGeometryRunAvgOff[sUpdateGeometryRunCount] = percent_time_in_function;
- sUpdateGeometryElapsedTimeOff += sUpdateGeometryElapsedTime;
- sUpdateGeometryCalls = 0;
- }
- else
- {
- // Second set of run data is with vectorization on.
- sUpdateGeometryCallPointer = false;
- llinfos << "profile (avg of " << sUpdateGeometryCalls << " samples) = "
- << "VEC on " << percent_time_in_function
- << "% of time with "
- << (sUpdateGeometryElapsedTime / (F64)sUpdateGeometryCalls)
- << " seconds per call "
- << llendl;
- sUpdateGeometryRunAvgOn[sUpdateGeometryRunCount] = percent_time_in_function ;
- sUpdateGeometryElapsedTimeOn += sUpdateGeometryElapsedTime;
-
- sUpdateGeometryCalls = 0;
- sUpdateGeometryRunCount++;
- F64 a = 0.0, b = 0.0;
- for(U32 i = 0; i<sUpdateGeometryRunCount; i++)
- {
- a += sUpdateGeometryRunAvgOff[i];
- b += sUpdateGeometryRunAvgOn[i];
- }
- a /= sUpdateGeometryRunCount;
- b /= sUpdateGeometryRunCount;
- F64 perf_boost = ( sUpdateGeometryElapsedTimeOff - sUpdateGeometryElapsedTimeOn ) / sUpdateGeometryElapsedTimeOn;
- llinfos << "run averages (" << (F64)sUpdateGeometryRunCount
- << "/10) vectorize off " << a
- << "% : vectorize type " << sVectorizeProcessor
- << " " << b
- << "% : performance boost "
- << perf_boost * 100.0
- << "%"
- << llendl ;
- if(sUpdateGeometryRunCount == 10)
- {
- // In case user runs test again, force reset of data on
- // next run.
- sUpdateGeometryGlobalTime = 0.0;
-
- // We have data now on which version is faster. Switch to that
- // code and save the data for next run.
- gSavedSettings.setBOOL("VectorizePerfTest", FALSE);
-
- if (perf_boost > 0.0)
- {
- llinfos << "Vectorization improves avatar skinning performance, "
- << "keeping on for future runs."
- << llendl;
- gSavedSettings.setBOOL("VectorizeSkin", TRUE);
- }
- else
- {
- // SIMD decreases performance, fall back to original code
- llinfos << "Vectorization decreases avatar skinning performance, "
- << "switching back to original code."
- << llendl;
-
- gSavedSettings.setBOOL("VectorizeSkin", FALSE);
- }
- }
- }
- sUpdateGeometryElapsedTime = 0.0f;
- }
- }
+ uploadJointMatrices();
+ updateGeometry(mFace, mMesh);
}
void LLViewerJointMesh::dump()
diff --git a/indra/newview/llviewerjointmesh.h b/indra/newview/llviewerjointmesh.h
index cab1205d61..0191f0cae8 100644
--- a/indra/newview/llviewerjointmesh.h
+++ b/indra/newview/llviewerjointmesh.h
@@ -143,23 +143,10 @@ public:
/*virtual*/ BOOL isAnimatable() const { return FALSE; }
- static void updateVectorize(); // Update globals when settings variables change
-
private:
- // Avatar vertex skinning is a significant performance issue on computers
- // with avatar vertex programs turned off (for example, most Macs). We
- // therefore have custom versions that use SIMD instructions.
- //
- // These functions require compiler options for SSE2, SSE, or neither, and
- // hence are contained in separate individual .cpp files. JC
- static void updateGeometryOriginal(LLFace* face, LLPolyMesh* mesh);
- // generic vector code, used for Altivec
- static void updateGeometryVectorized(LLFace* face, LLPolyMesh* mesh);
- static void updateGeometrySSE(LLFace* face, LLPolyMesh* mesh);
- static void updateGeometrySSE2(LLFace* face, LLPolyMesh* mesh);
-
- // Use a fuction pointer to indicate which version we are running.
- static void (*sUpdateGeometryFunc)(LLFace* face, LLPolyMesh* mesh);
+
+ //copy mesh into given face's vertex buffer, applying current animation pose
+ static void updateGeometry(LLFace* face, LLPolyMesh* mesh);
private:
// Allocate skin data
diff --git a/indra/newview/llviewerjointmesh_sse.cpp b/indra/newview/llviewerjointmesh_sse.cpp
deleted file mode 100644
index 400b49d046..0000000000
--- a/indra/newview/llviewerjointmesh_sse.cpp
+++ /dev/null
@@ -1,114 +0,0 @@
-/**
- * @file llviewerjointmesh_sse.cpp
- * @brief SSE vectorized joint skinning code, only used when video card does
- * not support avatar vertex programs.
- *
- * *NOTE: Disabled on Windows builds. See llv4math.h for details.
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-//-----------------------------------------------------------------------------
-// Header Files
-//-----------------------------------------------------------------------------
-
-#include "llviewerprecompiledheaders.h"
-
-#include "llviewerjointmesh.h"
-
-// project includes
-#include "llface.h"
-#include "llpolymesh.h"
-
-// library includes
-#include "lldarray.h"
-#include "llv4math.h" // for LL_VECTORIZE
-#include "llv4matrix3.h"
-#include "llv4matrix4.h"
-#include "v3math.h"
-
-
-#if LL_VECTORIZE
-
-inline void matrix_translate(LLV4Matrix4& m, const LLMatrix4* w, const LLVector3& j)
-{
- m.mV[VX] = _mm_loadu_ps(w->mMatrix[VX]);
- m.mV[VY] = _mm_loadu_ps(w->mMatrix[VY]);
- m.mV[VZ] = _mm_loadu_ps(w->mMatrix[VZ]);
- m.mV[VW] = _mm_loadu_ps(w->mMatrix[VW]);
- m.mV[VW] = _mm_add_ps(m.mV[VW], _mm_mul_ps(_mm_set1_ps(j.mV[VX]), m.mV[VX])); // ( ax * vx ) + vw
- m.mV[VW] = _mm_add_ps(m.mV[VW], _mm_mul_ps(_mm_set1_ps(j.mV[VY]), m.mV[VY]));
- m.mV[VW] = _mm_add_ps(m.mV[VW], _mm_mul_ps(_mm_set1_ps(j.mV[VZ]), m.mV[VZ]));
-}
-
-// static
-void LLViewerJointMesh::updateGeometrySSE(LLFace *face, LLPolyMesh *mesh)
-{
- // This cannot be a file-level static because it will be initialized
- // before main() using SSE code, which will crash on non-SSE processors.
- static LLV4Matrix4 sJointMat[32];
- LLDynamicArray<LLJointRenderData*>& joint_data = mesh->getReferenceMesh()->mJointRenderData;
-
- //upload joint pivots/matrices
- for(S32 j = 0, jend = joint_data.count(); j < jend ; ++j )
- {
- matrix_translate(sJointMat[j], joint_data[j]->mWorldMatrix,
- joint_data[j]->mSkinJoint ?
- joint_data[j]->mSkinJoint->mRootToJointSkinOffset
- : joint_data[j+1]->mSkinJoint->mRootToParentJointSkinOffset);
- }
-
- F32 weight = F32_MAX;
- LLV4Matrix4 blend_mat;
-
- LLStrider<LLVector3> o_vertices;
- LLStrider<LLVector3> o_normals;
-
- LLVertexBuffer *buffer = face->getVertexBuffer();
- buffer->getVertexStrider(o_vertices, mesh->mFaceVertexOffset);
- buffer->getNormalStrider(o_normals, mesh->mFaceVertexOffset);
-
- const F32* weights = mesh->getWeights();
- const LLVector3* coords = (const LLVector3*)mesh->getCoords();
- const LLVector3* normals = (const LLVector3*)mesh->getNormals();
- for (U32 index = 0, index_end = mesh->getNumVertices(); index < index_end; ++index)
- {
- if( weight != weights[index])
- {
- S32 joint = llfloor(weight = weights[index]);
- blend_mat.lerp(sJointMat[joint], sJointMat[joint+1], weight - joint);
- }
- blend_mat.multiply(coords[index], o_vertices[index]);
- ((LLV4Matrix3)blend_mat).multiply(normals[index], o_normals[index]);
- }
-
- buffer->setBuffer(0);
-}
-
-#else
-
-void LLViewerJointMesh::updateGeometrySSE(LLFace *face, LLPolyMesh *mesh)
-{
- LLViewerJointMesh::updateGeometryVectorized(face, mesh);
-}
-
-#endif
diff --git a/indra/newview/llviewerjointmesh_sse2.cpp b/indra/newview/llviewerjointmesh_sse2.cpp
deleted file mode 100644
index c2296dd569..0000000000
--- a/indra/newview/llviewerjointmesh_sse2.cpp
+++ /dev/null
@@ -1,121 +0,0 @@
-/**
- * @file llviewerjointmesh_sse2.cpp
- * @brief SSE vectorized joint skinning code, only used when video card does
- * not support avatar vertex programs.
- *
- * *NOTE: Disabled on Windows builds. See llv4math.h for details.
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-// Visual Studio required settings for this file:
-// Precompiled Headers OFF
-// Code Generation: SSE2
-
-//-----------------------------------------------------------------------------
-// Header Files
-//-----------------------------------------------------------------------------
-
-#include "llviewerprecompiledheaders.h"
-
-#include "llviewerjointmesh.h"
-
-// project includes
-#include "llface.h"
-#include "llpolymesh.h"
-
-// library includes
-#include "lldarray.h"
-#include "llstrider.h"
-#include "llv4math.h" // for LL_VECTORIZE
-#include "llv4matrix3.h"
-#include "llv4matrix4.h"
-#include "m4math.h"
-#include "v3math.h"
-
-
-#if LL_VECTORIZE
-
-
-inline void matrix_translate(LLV4Matrix4& m, const LLMatrix4* w, const LLVector3& j)
-{
- m.mV[VX] = _mm_loadu_ps(w->mMatrix[VX]);
- m.mV[VY] = _mm_loadu_ps(w->mMatrix[VY]);
- m.mV[VZ] = _mm_loadu_ps(w->mMatrix[VZ]);
- m.mV[VW] = _mm_loadu_ps(w->mMatrix[VW]);
- m.mV[VW] = _mm_add_ps(m.mV[VW], _mm_mul_ps(_mm_set1_ps(j.mV[VX]), m.mV[VX])); // ( ax * vx ) + vw
- m.mV[VW] = _mm_add_ps(m.mV[VW], _mm_mul_ps(_mm_set1_ps(j.mV[VY]), m.mV[VY]));
- m.mV[VW] = _mm_add_ps(m.mV[VW], _mm_mul_ps(_mm_set1_ps(j.mV[VZ]), m.mV[VZ]));
-}
-
-// static
-void LLViewerJointMesh::updateGeometrySSE2(LLFace *face, LLPolyMesh *mesh)
-{
- // This cannot be a file-level static because it will be initialized
- // before main() using SSE code, which will crash on non-SSE processors.
- static LLV4Matrix4 sJointMat[32];
- LLDynamicArray<LLJointRenderData*>& joint_data = mesh->getReferenceMesh()->mJointRenderData;
-
- //upload joint pivots/matrices
- for(S32 j = 0, jend = joint_data.count(); j < jend ; ++j )
- {
- matrix_translate(sJointMat[j], joint_data[j]->mWorldMatrix,
- joint_data[j]->mSkinJoint ?
- joint_data[j]->mSkinJoint->mRootToJointSkinOffset
- : joint_data[j+1]->mSkinJoint->mRootToParentJointSkinOffset);
- }
-
- F32 weight = F32_MAX;
- LLV4Matrix4 blend_mat;
-
- LLStrider<LLVector3> o_vertices;
- LLStrider<LLVector3> o_normals;
-
- LLVertexBuffer *buffer = face->getVertexBuffer();
- buffer->getVertexStrider(o_vertices, mesh->mFaceVertexOffset);
- buffer->getNormalStrider(o_normals, mesh->mFaceVertexOffset);
-
- const F32* weights = mesh->getWeights();
- const LLVector3* coords = (const LLVector3*)mesh->getCoords();
- const LLVector3* normals = (const LLVector3*)mesh->getNormals();
- for (U32 index = 0, index_end = mesh->getNumVertices(); index < index_end; ++index)
- {
- if( weight != weights[index])
- {
- S32 joint = llfloor(weight = weights[index]);
- blend_mat.lerp(sJointMat[joint], sJointMat[joint+1], weight - joint);
- }
- blend_mat.multiply(coords[index], o_vertices[index]);
- ((LLV4Matrix3)blend_mat).multiply(normals[index], o_normals[index]);
- }
-
- //setBuffer(0) called in LLVOAvatar::renderSkinned
-}
-
-#else
-
-void LLViewerJointMesh::updateGeometrySSE2(LLFace *face, LLPolyMesh *mesh)
-{
- LLViewerJointMesh::updateGeometryVectorized(face, mesh);
-}
-
-#endif
diff --git a/indra/newview/llviewerjointmesh_vec.cpp b/indra/newview/llviewerjointmesh_vec.cpp
deleted file mode 100644
index 6600d01d17..0000000000
--- a/indra/newview/llviewerjointmesh_vec.cpp
+++ /dev/null
@@ -1,97 +0,0 @@
-/**
- * @file llviewerjointmesh_vec.cpp
- * @brief Compiler-generated vectorized joint skinning code, works well on
- * Altivec processors (PowerPC Mac)
- *
- * *NOTE: See llv4math.h for notes on SSE/Altivec vector code.
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-//-----------------------------------------------------------------------------
-// Header Files
-//-----------------------------------------------------------------------------
-#include "llviewerprecompiledheaders.h"
-
-#include "llviewerjointmesh.h"
-
-#include "llface.h"
-#include "llpolymesh.h"
-#include "llv4math.h"
-#include "llv4matrix3.h"
-#include "llv4matrix4.h"
-
-// Generic vectorized code, uses compiler defaults, works well for Altivec
-// on PowerPC.
-
-// static
-void LLViewerJointMesh::updateGeometryVectorized(LLFace *face, LLPolyMesh *mesh)
-{
-#if 0
- static LLV4Matrix4 sJointMat[32];
- LLDynamicArray<LLJointRenderData*>& joint_data = mesh->getReferenceMesh()->mJointRenderData;
- S32 j, joint_num, joint_end = joint_data.count();
- LLV4Vector3 pivot;
-
- //upload joint pivots/matrices
- for(j = joint_num = 0; joint_num < joint_end ; ++joint_num )
- {
- LLSkinJoint *sj;
- const LLMatrix4 * wm = joint_data[joint_num]->mWorldMatrix;
- if (NULL == (sj = joint_data[joint_num]->mSkinJoint))
- {
- sj = joint_data[++joint_num]->mSkinJoint;
- ((LLV4Matrix3)(sJointMat[j] = *wm)).multiply(sj->mRootToParentJointSkinOffset, pivot);
- sJointMat[j++].translate(pivot);
- wm = joint_data[joint_num]->mWorldMatrix;
- }
- ((LLV4Matrix3)(sJointMat[j] = *wm)).multiply(sj->mRootToJointSkinOffset, pivot);
- sJointMat[j++].translate(pivot);
- }
-
- F32 weight = F32_MAX;
- LLV4Matrix4 blend_mat;
-
- LLStrider<LLVector3> o_vertices;
- LLStrider<LLVector3> o_normals;
-
- LLVertexBuffer *buffer = face->mVertexBuffer;
- buffer->getVertexStrider(o_vertices, mesh->mFaceVertexOffset);
- buffer->getNormalStrider(o_normals, mesh->mFaceVertexOffset);
-
- const F32* weights = mesh->getWeights();
- const LLVector3* coords = mesh->getCoords();
- const LLVector3* normals = mesh->getNormals();
- for (U32 index = 0, index_end = mesh->getNumVertices(); index < index_end; ++index)
- {
- if( weight != weights[index])
- {
- S32 joint = llfloor(weight = weights[index]);
- blend_mat.lerp(sJointMat[joint], sJointMat[joint+1], weight - joint);
- }
- blend_mat.multiply(coords[index], o_vertices[index]);
- ((LLV4Matrix3)blend_mat).multiply(normals[index], o_normals[index]);
- }
-
- buffer->setBuffer(0);
-#endif
-}
diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp
index 13dbc5e386..046360e9e9 100644
--- a/indra/newview/llviewermedia.cpp
+++ b/indra/newview/llviewermedia.cpp
@@ -26,49 +26,51 @@
#include "llviewerprecompiledheaders.h"
+#include "llviewermedia.h"
+
#include "llagent.h"
#include "llagentcamera.h"
-#include "llviewermedia.h"
-#include "llviewermediafocus.h"
-#include "llmimetypes.h"
+#include "llappviewer.h"
+#include "llaudioengine.h" // for gAudiop
+#include "llcallbacklist.h"
+#include "lldir.h"
+#include "lldiriterator.h"
+#include "llevent.h" // LLSimpleListener
+#include "llfilepicker.h"
+#include "llfloaterwebcontent.h" // for handling window close requests and geometry change requests in media browser windows.
+#include "llfocusmgr.h"
+#include "llkeyboard.h"
+#include "lllogininstance.h"
+#include "llmarketplacefunctions.h"
#include "llmediaentry.h"
+#include "llmimetypes.h"
+#include "llmutelist.h"
+#include "llnotifications.h"
+#include "llnotificationsutil.h"
+#include "llpanelprofile.h"
+#include "llparcel.h"
+#include "llpluginclassmedia.h"
+#include "llplugincookiestore.h"
+#include "llurldispatcher.h"
+#include "lluuid.h"
#include "llversioninfo.h"
+#include "llviewermediafocus.h"
#include "llviewercontrol.h"
-#include "llviewertexture.h"
+#include "llviewernetwork.h"
#include "llviewerparcelmedia.h"
#include "llviewerparcelmgr.h"
+#include "llviewerregion.h"
+#include "llviewertexture.h"
#include "llviewertexturelist.h"
-#include "llvovolume.h"
-#include "llpluginclassmedia.h"
-#include "llplugincookiestore.h"
#include "llviewerwindow.h"
-#include "llfocusmgr.h"
-#include "llcallbacklist.h"
-#include "llparcel.h"
-#include "llaudioengine.h" // for gAudiop
-#include "llurldispatcher.h"
#include "llvoavatar.h"
#include "llvoavatarself.h"
-#include "llviewerregion.h"
+#include "llvovolume.h"
+#include "llwebprofile.h"
#include "llwebsharing.h" // For LLWebSharing::setOpenIDCookie(), *TODO: find a better way to do this!
-#include "llfilepicker.h"
-#include "llnotifications.h"
-#include "lldir.h"
-#include "lldiriterator.h"
-#include "llevent.h" // LLSimpleListener
-#include "llnotificationsutil.h"
-#include "lluuid.h"
-#include "llkeyboard.h"
-#include "llmutelist.h"
-#include "llpanelprofile.h"
-#include "llappviewer.h"
-#include "lllogininstance.h"
-//#include "llfirstuse.h"
-#include "llviewernetwork.h"
#include "llwindow.h"
+#include "llvieweraudio.h"
-
-#include "llfloatermediabrowser.h" // for handling window close requests and geometry change requests in media browser windows.
#include "llfloaterwebcontent.h" // for handling window close requests and geometry change requests in media browser windows.
#include <boost/bind.hpp> // for SkinFolder listener
@@ -319,6 +321,10 @@ public:
std::string cookie = content["set-cookie"].asString();
LLViewerMedia::getCookieStore()->setCookiesFromHost(cookie, mHost);
+
+ // Set cookie for snapshot publishing.
+ std::string auth_cookie = cookie.substr(0, cookie.find(";")); // strip path
+ LLWebProfile::setAuthCookie(auth_cookie);
}
void completedRaw(
@@ -782,6 +788,12 @@ static bool proximity_comparitor(const LLViewerMediaImpl* i1, const LLViewerMedi
}
static LLFastTimer::DeclareTimer FTM_MEDIA_UPDATE("Update Media");
+static LLFastTimer::DeclareTimer FTM_MEDIA_SPARE_IDLE("Spare Idle");
+static LLFastTimer::DeclareTimer FTM_MEDIA_UPDATE_INTEREST("Update/Interest");
+static LLFastTimer::DeclareTimer FTM_MEDIA_SORT("Sort");
+static LLFastTimer::DeclareTimer FTM_MEDIA_SORT2("Sort 2");
+static LLFastTimer::DeclareTimer FTM_MEDIA_MISC("Misc");
+
//////////////////////////////////////////////////////////////////////////////////////////
// static
@@ -806,21 +818,28 @@ void LLViewerMedia::updateMedia(void *dummy_arg)
impl_list::iterator iter = sViewerMediaImplList.begin();
impl_list::iterator end = sViewerMediaImplList.end();
- for(; iter != end;)
{
- LLViewerMediaImpl* pimpl = *iter++;
- pimpl->update();
- pimpl->calculateInterest();
+ LLFastTimer t(FTM_MEDIA_UPDATE_INTEREST);
+ for(; iter != end;)
+ {
+ LLViewerMediaImpl* pimpl = *iter++;
+ pimpl->update();
+ pimpl->calculateInterest();
+ }
}
// Let the spare media source actually launch
if(sSpareBrowserMediaSource)
{
+ LLFastTimer t(FTM_MEDIA_SPARE_IDLE);
sSpareBrowserMediaSource->idle();
}
- // Sort the static instance list using our interest criteria
- sViewerMediaImplList.sort(priorityComparitor);
+ {
+ LLFastTimer t(FTM_MEDIA_SORT);
+ // Sort the static instance list using our interest criteria
+ sViewerMediaImplList.sort(priorityComparitor);
+ }
// Go through the list again and adjust according to priority.
iter = sViewerMediaImplList.begin();
@@ -848,147 +867,150 @@ void LLViewerMedia::updateMedia(void *dummy_arg)
// max_instances must be set high enough to allow the various instances used in the UI (for the help browser, search, etc.) to be loaded.
// If max_normal + max_low is less than max_instances, things will tend to get unloaded instead of being set to slideshow.
- for(; iter != end; iter++)
{
- LLViewerMediaImpl* pimpl = *iter;
+ LLFastTimer t(FTM_MEDIA_MISC);
+ for(; iter != end; iter++)
+ {
+ LLViewerMediaImpl* pimpl = *iter;
- LLPluginClassMedia::EPriority new_priority = LLPluginClassMedia::PRIORITY_NORMAL;
+ LLPluginClassMedia::EPriority new_priority = LLPluginClassMedia::PRIORITY_NORMAL;
- if(pimpl->isForcedUnloaded() || (impl_count_total >= (int)max_instances))
- {
- // Never load muted or failed impls.
- // Hard limit on the number of instances that will be loaded at one time
- new_priority = LLPluginClassMedia::PRIORITY_UNLOADED;
- }
- else if(!pimpl->getVisible())
- {
- new_priority = LLPluginClassMedia::PRIORITY_HIDDEN;
- }
- else if(pimpl->hasFocus())
- {
- new_priority = LLPluginClassMedia::PRIORITY_HIGH;
- impl_count_interest_normal++; // count this against the count of "normal" instances for priority purposes
- }
- else if(pimpl->getUsedInUI())
- {
- new_priority = LLPluginClassMedia::PRIORITY_NORMAL;
- impl_count_interest_normal++;
- }
- else if(pimpl->isParcelMedia())
- {
- new_priority = LLPluginClassMedia::PRIORITY_NORMAL;
- impl_count_interest_normal++;
- }
- else
- {
- // Look at interest and CPU usage for instances that aren't in any of the above states.
-
- // Heuristic -- if the media texture's approximate screen area is less than 1/4 of the native area of the texture,
- // turn it down to low instead of normal. This may downsample for plugins that support it.
- bool media_is_small = false;
- F64 approximate_interest = pimpl->getApproximateTextureInterest();
- if(approximate_interest == 0.0f)
+ if(pimpl->isForcedUnloaded() || (impl_count_total >= (int)max_instances))
{
- // this media has no current size, which probably means it's not loaded.
- media_is_small = true;
+ // Never load muted or failed impls.
+ // Hard limit on the number of instances that will be loaded at one time
+ new_priority = LLPluginClassMedia::PRIORITY_UNLOADED;
}
- else if(pimpl->getInterest() < (approximate_interest / 4))
+ else if(!pimpl->getVisible())
{
- media_is_small = true;
+ new_priority = LLPluginClassMedia::PRIORITY_HIDDEN;
}
-
- if(pimpl->getInterest() == 0.0f)
+ else if(pimpl->hasFocus())
{
- // This media is completely invisible, due to being outside the view frustrum or out of range.
- new_priority = LLPluginClassMedia::PRIORITY_HIDDEN;
+ new_priority = LLPluginClassMedia::PRIORITY_HIGH;
+ impl_count_interest_normal++; // count this against the count of "normal" instances for priority purposes
}
- else if(check_cpu_usage && (total_cpu > max_cpu))
+ else if(pimpl->getUsedInUI())
{
- // Higher priority plugins have already used up the CPU budget. Set remaining ones to slideshow priority.
- new_priority = LLPluginClassMedia::PRIORITY_SLIDESHOW;
+ new_priority = LLPluginClassMedia::PRIORITY_NORMAL;
+ impl_count_interest_normal++;
}
- else if((impl_count_interest_normal < (int)max_normal) && !media_is_small)
+ else if(pimpl->isParcelMedia())
{
- // Up to max_normal inworld get normal priority
new_priority = LLPluginClassMedia::PRIORITY_NORMAL;
impl_count_interest_normal++;
}
- else if (impl_count_interest_low + impl_count_interest_normal < (int)max_low + (int)max_normal)
+ else
{
- // The next max_low inworld get turned down
- new_priority = LLPluginClassMedia::PRIORITY_LOW;
- impl_count_interest_low++;
-
- // Set the low priority size for downsampling to approximately the size the texture is displayed at.
+ // Look at interest and CPU usage for instances that aren't in any of the above states.
+
+ // Heuristic -- if the media texture's approximate screen area is less than 1/4 of the native area of the texture,
+ // turn it down to low instead of normal. This may downsample for plugins that support it.
+ bool media_is_small = false;
+ F64 approximate_interest = pimpl->getApproximateTextureInterest();
+ if(approximate_interest == 0.0f)
+ {
+ // this media has no current size, which probably means it's not loaded.
+ media_is_small = true;
+ }
+ else if(pimpl->getInterest() < (approximate_interest / 4))
+ {
+ media_is_small = true;
+ }
+
+ if(pimpl->getInterest() == 0.0f)
{
- F32 approximate_interest_dimension = (F32) sqrt(pimpl->getInterest());
+ // This media is completely invisible, due to being outside the view frustrum or out of range.
+ new_priority = LLPluginClassMedia::PRIORITY_HIDDEN;
+ }
+ else if(check_cpu_usage && (total_cpu > max_cpu))
+ {
+ // Higher priority plugins have already used up the CPU budget. Set remaining ones to slideshow priority.
+ new_priority = LLPluginClassMedia::PRIORITY_SLIDESHOW;
+ }
+ else if((impl_count_interest_normal < (int)max_normal) && !media_is_small)
+ {
+ // Up to max_normal inworld get normal priority
+ new_priority = LLPluginClassMedia::PRIORITY_NORMAL;
+ impl_count_interest_normal++;
+ }
+ else if (impl_count_interest_low + impl_count_interest_normal < (int)max_low + (int)max_normal)
+ {
+ // The next max_low inworld get turned down
+ new_priority = LLPluginClassMedia::PRIORITY_LOW;
+ impl_count_interest_low++;
+
+ // Set the low priority size for downsampling to approximately the size the texture is displayed at.
+ {
+ F32 approximate_interest_dimension = (F32) sqrt(pimpl->getInterest());
- pimpl->setLowPrioritySizeLimit(llround(approximate_interest_dimension));
+ pimpl->setLowPrioritySizeLimit(llround(approximate_interest_dimension));
+ }
+ }
+ else
+ {
+ // Any additional impls (up to max_instances) get very infrequent time
+ new_priority = LLPluginClassMedia::PRIORITY_SLIDESHOW;
}
}
- else
- {
- // Any additional impls (up to max_instances) get very infrequent time
- new_priority = LLPluginClassMedia::PRIORITY_SLIDESHOW;
- }
- }
- if(!pimpl->getUsedInUI() && (new_priority != LLPluginClassMedia::PRIORITY_UNLOADED))
- {
- // This is a loadable inworld impl -- the last one in the list in this class defines the lowest loadable interest.
- lowest_interest_loadable = pimpl;
+ if(!pimpl->getUsedInUI() && (new_priority != LLPluginClassMedia::PRIORITY_UNLOADED))
+ {
+ // This is a loadable inworld impl -- the last one in the list in this class defines the lowest loadable interest.
+ lowest_interest_loadable = pimpl;
- impl_count_total++;
- }
+ impl_count_total++;
+ }
- // Overrides if the window is minimized or we lost focus (taking care
- // not to accidentally "raise" the priority either)
- if (!gViewerWindow->getActive() /* viewer window minimized? */
- && new_priority > LLPluginClassMedia::PRIORITY_HIDDEN)
- {
- new_priority = LLPluginClassMedia::PRIORITY_HIDDEN;
- }
- else if (!gFocusMgr.getAppHasFocus() /* viewer window lost focus? */
- && new_priority > LLPluginClassMedia::PRIORITY_LOW)
- {
- new_priority = LLPluginClassMedia::PRIORITY_LOW;
- }
+ // Overrides if the window is minimized or we lost focus (taking care
+ // not to accidentally "raise" the priority either)
+ if (!gViewerWindow->getActive() /* viewer window minimized? */
+ && new_priority > LLPluginClassMedia::PRIORITY_HIDDEN)
+ {
+ new_priority = LLPluginClassMedia::PRIORITY_HIDDEN;
+ }
+ else if (!gFocusMgr.getAppHasFocus() /* viewer window lost focus? */
+ && new_priority > LLPluginClassMedia::PRIORITY_LOW)
+ {
+ new_priority = LLPluginClassMedia::PRIORITY_LOW;
+ }
- if(!inworld_media_enabled)
- {
- // If inworld media is locked out, force all inworld media to stay unloaded.
- if(!pimpl->getUsedInUI())
+ if(!inworld_media_enabled)
{
- new_priority = LLPluginClassMedia::PRIORITY_UNLOADED;
+ // If inworld media is locked out, force all inworld media to stay unloaded.
+ if(!pimpl->getUsedInUI())
+ {
+ new_priority = LLPluginClassMedia::PRIORITY_UNLOADED;
+ }
}
- }
- // update the audio stream here as well
- if( !inworld_audio_enabled)
- {
- if(LLViewerMedia::isParcelAudioPlaying() && gAudiop && LLViewerMedia::hasParcelAudio())
+ // update the audio stream here as well
+ if( !inworld_audio_enabled)
{
- gAudiop->stopInternetStream();
+ if(LLViewerMedia::isParcelAudioPlaying() && gAudiop && LLViewerMedia::hasParcelAudio())
+ {
+ LLViewerAudio::getInstance()->stopInternetStreamWithAutoFade();
+ }
}
- }
- pimpl->setPriority(new_priority);
+ pimpl->setPriority(new_priority);
- if(pimpl->getUsedInUI())
- {
- // Any impls used in the UI should not be in the proximity list.
- pimpl->mProximity = -1;
- }
- else
- {
- proximity_order.push_back(pimpl);
- }
+ if(pimpl->getUsedInUI())
+ {
+ // Any impls used in the UI should not be in the proximity list.
+ pimpl->mProximity = -1;
+ }
+ else
+ {
+ proximity_order.push_back(pimpl);
+ }
- total_cpu += pimpl->getCPUUsage();
+ total_cpu += pimpl->getCPUUsage();
- if (!pimpl->getUsedInUI() && pimpl->hasMedia())
- {
- sAnyMediaShowing = true;
- }
+ if (!pimpl->getUsedInUI() && pimpl->hasMedia())
+ {
+ sAnyMediaShowing = true;
+ }
+ }
}
// Re-calculate this every time.
@@ -1014,6 +1036,7 @@ void LLViewerMedia::updateMedia(void *dummy_arg)
}
else
{
+ LLFastTimer t(FTM_MEDIA_SORT2);
// Use a distance-based sort for proximity values.
std::stable_sort(proximity_order.begin(), proximity_order.end(), proximity_comparitor);
}
@@ -1069,13 +1092,24 @@ void LLViewerMedia::setAllMediaEnabled(bool val)
gAudiop &&
LLViewerMedia::hasParcelAudio())
{
- gAudiop->startInternetStream(LLViewerMedia::getParcelAudioURL());
+ if (LLAudioEngine::AUDIO_PAUSED == gAudiop->isInternetStreamPlaying())
+ {
+ // 'false' means unpause
+ gAudiop->pauseInternetStream(false);
+ }
+ else
+ {
+ LLViewerAudio::getInstance()->startInternetStreamWithAutoFade(LLViewerMedia::getParcelAudioURL());
+ }
}
}
else {
// This actually unloads the impl, as opposed to "stop"ping the media
LLViewerParcelMedia::stop();
- if (gAudiop) gAudiop->stopInternetStream();
+ if (gAudiop)
+ {
+ LLViewerAudio::getInstance()->stopInternetStreamWithAutoFade();
+ }
}
}
@@ -1366,75 +1400,11 @@ void LLViewerMedia::removeCookie(const std::string &name, const std::string &dom
}
-// This is defined in two files but I don't want to create a dependence between this and llsidepanelinventory
-// just to be able to temporarily disable the outbox.
-#define ENABLE_INVENTORY_DISPLAY_OUTBOX 0 // keep in sync with ENABLE_MERCHANT_OUTBOX_PANEL, ENABLE_MERCHANT_OUTBOX_CONTEXT_MENU
-
-class LLInventoryUserStatusResponder : public LLHTTPClient::Responder
-{
-public:
- LLInventoryUserStatusResponder()
- : LLCurl::Responder()
- {
- }
-
- void completed(U32 status, const std::string& reason, const LLSD& content)
- {
- if (isGoodStatus(status))
- {
- std::string merchantStatus = content[gAgent.getID().getString()].asString();
- llinfos << "Marketplace merchant status: " << merchantStatus << llendl;
-
- // Save the merchant status before turning on the display
- gSavedSettings.setString("InventoryMarketplaceUserStatus", merchantStatus);
-
- // Complete success
- gSavedSettings.setBOOL("InventoryDisplayInbox", true);
-
-#if ENABLE_INVENTORY_DISPLAY_OUTBOX
- gSavedSettings.setBOOL("InventoryDisplayOutbox", true);
-#endif
- }
- else if (status == 401)
- {
- // API is available for use but OpenID authorization failed
- gSavedSettings.setBOOL("InventoryDisplayInbox", true);
- }
- else
- {
- // API in unavailable
- llinfos << "Marketplace API is unavailable -- Inbox may be disabled, status = " << status << ", reason = " << reason << llendl;
- }
- }
-};
-
-
-void doOnetimeEarlyHTTPRequests()
-{
- std::string url = "https://marketplace.secondlife.com/";
-
- if (!LLGridManager::getInstance()->isInProductionGrid())
- {
- std::string gridLabel = LLGridManager::getInstance()->getGridLabel();
- url = llformat("https://marketplace.%s.lindenlab.com/", utf8str_tolower(gridLabel).c_str());
-
- // TEMP for Jim's pdp
- //url = "http://pdp24.lindenlab.com:3000/";
- }
-
- url += "api/1/users/";
- url += gAgent.getID().getString();
- url += "/user_status";
-
- llinfos << "http get: " << url << llendl;
- LLHTTPClient::get(url, new LLInventoryUserStatusResponder(), LLViewerMedia::getHeaders());
-}
-
-
LLSD LLViewerMedia::getHeaders()
{
LLSD headers = LLSD::emptyMap();
headers["Accept"] = "*/*";
+ headers["Content-Type"] = "application/xml";
headers["Cookie"] = sOpenIDCookie;
headers["User-Agent"] = getCurrentUserAgent();
@@ -1484,11 +1454,11 @@ void LLViewerMedia::setOpenIDCookie()
std::string profile_url = getProfileURL("");
LLURL raw_profile_url( profile_url.c_str() );
+ LL_DEBUGS("MediaAuth") << "Requesting " << profile_url << llendl;
+ LL_DEBUGS("MediaAuth") << "sOpenIDCookie = [" << sOpenIDCookie << "]" << llendl;
LLHTTPClient::get(profile_url,
new LLViewerMediaWebProfileResponder(raw_profile_url.getAuthority()),
headers);
-
- doOnetimeEarlyHTTPRequests();
}
}
@@ -1715,7 +1685,8 @@ LLViewerMediaImpl::LLViewerMediaImpl( const LLUUID& texture_id,
mNavigateSuspended(false),
mNavigateSuspendedDeferred(false),
mIsUpdated(false),
- mTrustedBrowser(false)
+ mTrustedBrowser(false),
+ mZoomFactor(1.0)
{
// Set up the mute list observer if it hasn't been set up already.
@@ -1861,7 +1832,7 @@ LLPluginClassMedia* LLViewerMediaImpl::newSourceFromMediaType(std::string media_
if(plugin_basename.empty())
{
- LL_WARNS("Media") << "Couldn't find plugin for media type " << media_type << LL_ENDL;
+ LL_WARNS_ONCE("Media") << "Couldn't find plugin for media type " << media_type << LL_ENDL;
}
else
{
@@ -1887,11 +1858,11 @@ LLPluginClassMedia* LLViewerMediaImpl::newSourceFromMediaType(std::string media_
llstat s;
if(LLFile::stat(launcher_name, &s))
{
- LL_WARNS("Media") << "Couldn't find launcher at " << launcher_name << LL_ENDL;
+ LL_WARNS_ONCE("Media") << "Couldn't find launcher at " << launcher_name << LL_ENDL;
}
else if(LLFile::stat(plugin_name, &s))
{
- LL_WARNS("Media") << "Couldn't find plugin at " << plugin_name << LL_ENDL;
+ LL_WARNS_ONCE("Media") << "Couldn't find plugin at " << plugin_name << LL_ENDL;
}
else
{
@@ -1930,7 +1901,7 @@ LLPluginClassMedia* LLViewerMediaImpl::newSourceFromMediaType(std::string media_
}
}
- LL_WARNS("Plugin") << "plugin intialization failed for mime type: " << media_type << LL_ENDL;
+ LL_WARNS_ONCE("Plugin") << "plugin intialization failed for mime type: " << media_type << LL_ENDL;
LLSD args;
args["MIME_TYPE"] = media_type;
LLNotificationsUtil::add("NoPlugin", args);
@@ -2301,6 +2272,17 @@ void LLViewerMediaImpl::clearCache()
}
}
+
+//////////////////////////////////////////////////////////////////////////////////////////
+void LLViewerMediaImpl::setPageZoomFactor( double factor )
+{
+ if(mMediaSource && factor != mZoomFactor)
+ {
+ mZoomFactor = factor;
+ mMediaSource->set_page_zoom_factor( factor );
+ }
+}
+
//////////////////////////////////////////////////////////////////////////////////////////
void LLViewerMediaImpl::mouseDown(S32 x, S32 y, MASK mask, S32 button)
{
@@ -2449,44 +2431,58 @@ BOOL LLViewerMediaImpl::handleMouseUp(S32 x, S32 y, MASK mask)
//////////////////////////////////////////////////////////////////////////////////////////
void LLViewerMediaImpl::updateJavascriptObject()
{
+ static LLFrameTimer timer ;
+
if ( mMediaSource )
{
// flag to expose this information to internal browser or not.
bool enable = gSavedSettings.getBOOL("BrowserEnableJSObject");
+
+ if(!enable)
+ {
+ return ; //no need to go further.
+ }
+
+ if(timer.getElapsedTimeF32() < 1.0f)
+ {
+ return ; //do not update more than once per second.
+ }
+ timer.reset() ;
+
mMediaSource->jsEnableObject( enable );
// these values are only menaingful after login so don't set them before
bool logged_in = LLLoginInstance::getInstance()->authSuccess();
if ( logged_in )
{
- // current location within a region
- LLVector3 agent_pos = gAgent.getPositionAgent();
- double x = agent_pos.mV[ VX ];
- double y = agent_pos.mV[ VY ];
- double z = agent_pos.mV[ VZ ];
- mMediaSource->jsAgentLocationEvent( x, y, z );
-
- // current location within the grid
- LLVector3d agent_pos_global = gAgent.getLastPositionGlobal();
- double global_x = agent_pos_global.mdV[ VX ];
- double global_y = agent_pos_global.mdV[ VY ];
- double global_z = agent_pos_global.mdV[ VZ ];
- mMediaSource->jsAgentGlobalLocationEvent( global_x, global_y, global_z );
-
- // current agent orientation
- double rotation = atan2( gAgent.getAtAxis().mV[VX], gAgent.getAtAxis().mV[VY] );
- double angle = rotation * RAD_TO_DEG;
- if ( angle < 0.0f ) angle = 360.0f + angle; // TODO: has to be a better way to get orientation!
- mMediaSource->jsAgentOrientationEvent( angle );
-
- // current region agent is in
- std::string region_name("");
- LLViewerRegion* region = gAgent.getRegion();
- if ( region )
- {
- region_name = region->getName();
- };
- mMediaSource->jsAgentRegionEvent( region_name );
+ // current location within a region
+ LLVector3 agent_pos = gAgent.getPositionAgent();
+ double x = agent_pos.mV[ VX ];
+ double y = agent_pos.mV[ VY ];
+ double z = agent_pos.mV[ VZ ];
+ mMediaSource->jsAgentLocationEvent( x, y, z );
+
+ // current location within the grid
+ LLVector3d agent_pos_global = gAgent.getLastPositionGlobal();
+ double global_x = agent_pos_global.mdV[ VX ];
+ double global_y = agent_pos_global.mdV[ VY ];
+ double global_z = agent_pos_global.mdV[ VZ ];
+ mMediaSource->jsAgentGlobalLocationEvent( global_x, global_y, global_z );
+
+ // current agent orientation
+ double rotation = atan2( gAgent.getAtAxis().mV[VX], gAgent.getAtAxis().mV[VY] );
+ double angle = rotation * RAD_TO_DEG;
+ if ( angle < 0.0f ) angle = 360.0f + angle; // TODO: has to be a better way to get orientation!
+ mMediaSource->jsAgentOrientationEvent( angle );
+
+ // current region agent is in
+ std::string region_name("");
+ LLViewerRegion* region = gAgent.getRegion();
+ if ( region )
+ {
+ region_name = region->getName();
+ };
+ mMediaSource->jsAgentRegionEvent( region_name );
}
// language code the viewer is set to
@@ -2505,7 +2501,7 @@ void LLViewerMediaImpl::updateJavascriptObject()
}
//////////////////////////////////////////////////////////////////////////////////////////
-std::string LLViewerMediaImpl::getName() const
+const std::string& LLViewerMediaImpl::getName() const
{
if (mMediaSource)
{
@@ -2767,8 +2763,14 @@ bool LLViewerMediaImpl::canNavigateBack()
}
//////////////////////////////////////////////////////////////////////////////////////////
+static LLFastTimer::DeclareTimer FTM_MEDIA_DO_UPDATE("Do Update");
+static LLFastTimer::DeclareTimer FTM_MEDIA_GET_DATA("Get Data");
+static LLFastTimer::DeclareTimer FTM_MEDIA_SET_SUBIMAGE("Set Subimage");
+
+
void LLViewerMediaImpl::update()
{
+ LLFastTimer t(FTM_MEDIA_DO_UPDATE);
if(mMediaSource == NULL)
{
if(mPriority == LLPluginClassMedia::PRIORITY_UNLOADED)
@@ -2868,20 +2870,27 @@ void LLViewerMediaImpl::update()
if(width > 0 && height > 0)
{
- U8* data = mMediaSource->getBitsData();
+ U8* data = NULL;
+ {
+ LLFastTimer t(FTM_MEDIA_GET_DATA);
+ data = mMediaSource->getBitsData();
+ }
// Offset the pixels pointer to match x_pos and y_pos
data += ( x_pos * mMediaSource->getTextureDepth() * mMediaSource->getBitsWidth() );
data += ( y_pos * mMediaSource->getTextureDepth() );
- placeholder_image->setSubImage(
- data,
- mMediaSource->getBitsWidth(),
- mMediaSource->getBitsHeight(),
- x_pos,
- y_pos,
- width,
- height);
+ {
+ LLFastTimer t(FTM_MEDIA_SET_SUBIMAGE);
+ placeholder_image->setSubImage(
+ data,
+ mMediaSource->getBitsWidth(),
+ mMediaSource->getBitsHeight(),
+ x_pos,
+ y_pos,
+ width,
+ height);
+ }
}
@@ -3340,7 +3349,6 @@ void LLViewerMediaImpl::handleMediaEvent(LLPluginClassMedia* plugin, LLPluginCla
{
// This close request is directed at another instance
pass_through = false;
- LLFloaterMediaBrowser::closeRequest(uuid);
LLFloaterWebContent::closeRequest(uuid);
}
}
@@ -3360,7 +3368,6 @@ void LLViewerMediaImpl::handleMediaEvent(LLPluginClassMedia* plugin, LLPluginCla
{
// This request is directed at another instance
pass_through = false;
- LLFloaterMediaBrowser::geometryChanged(uuid, plugin->getGeometryX(), plugin->getGeometryY(), plugin->getGeometryWidth(), plugin->getGeometryHeight());
LLFloaterWebContent::geometryChanged(uuid, plugin->getGeometryX(), plugin->getGeometryY(), plugin->getGeometryWidth(), plugin->getGeometryHeight());
}
}
@@ -3454,8 +3461,11 @@ BOOL LLViewerMediaImpl::isUpdated()
return mIsUpdated ;
}
+static LLFastTimer::DeclareTimer FTM_MEDIA_CALCULATE_INTEREST("Calculate Interest");
+
void LLViewerMediaImpl::calculateInterest()
{
+ LLFastTimer t(FTM_MEDIA_CALCULATE_INTEREST);
LLViewerMediaTexture* texture = LLViewerTextureManager::findMediaTexture( mTextureId );
if(texture != NULL)
diff --git a/indra/newview/llviewermedia.h b/indra/newview/llviewermedia.h
index 0b69b8f0c1..15dcda59cf 100644
--- a/indra/newview/llviewermedia.h
+++ b/indra/newview/llviewermedia.h
@@ -250,6 +250,7 @@ public:
std::string getMediaEntryURL() { return mMediaEntryURL; }
void setHomeURL(const std::string& home_url, const std::string& mime_type = LLStringUtil::null) { mHomeURL = home_url; mHomeMimeType = mime_type;};
void clearCache();
+ void setPageZoomFactor( double factor );
std::string getMimeType() { return mMimeType; }
void scaleMouse(S32 *mouse_x, S32 *mouse_y);
void scaleTextureCoords(const LLVector2& texture_coords, S32 *x, S32 *y);
@@ -317,7 +318,7 @@ public:
/*virtual*/ BOOL handleToolTip(S32 x, S32 y, MASK mask) { return FALSE; };
/*virtual*/ BOOL handleMiddleMouseDown(S32 x, S32 y, MASK mask) { return FALSE; };
/*virtual*/ BOOL handleMiddleMouseUp(S32 x, S32 y, MASK mask) {return FALSE; };
- /*virtual*/ std::string getName() const;
+ /*virtual*/ const std::string& getName() const;
/*virtual*/ void screenPointToLocal(S32 screen_x, S32 screen_y, S32* local_x, S32* local_y) const {};
/*virtual*/ void localPointToScreen(S32 local_x, S32 local_y, S32* screen_x, S32* screen_y) const {};
@@ -416,6 +417,7 @@ private:
private:
// a single media url with some data and an impl.
LLPluginClassMedia* mMediaSource;
+ F64 mZoomFactor;
LLUUID mTextureId;
bool mMovieImageHasMips;
std::string mMediaURL; // The last media url set with NavigateTo
diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp
index 754731b290..99540ccce9 100644
--- a/indra/newview/llviewermenu.cpp
+++ b/indra/newview/llviewermenu.cpp
@@ -30,6 +30,7 @@
// linden library includes
#include "llavatarnamecache.h" // IDEVO
#include "llfloaterreg.h"
+#include "llfloatersidepanelcontainer.h"
#include "llcombobox.h"
#include "llinventorypanel.h"
#include "llnotifications.h"
@@ -41,7 +42,6 @@
#include "llagentcamera.h"
#include "llagentwearables.h"
#include "llagentpilot.h"
-#include "llbottomtray.h"
#include "llcompilequeue.h"
#include "llconsole.h"
#include "lldaycyclemanager.h"
@@ -76,13 +76,11 @@
#include "llinventoryfunctions.h"
#include "llpanellogin.h"
#include "llpanelblockedlist.h"
-#include "llmenucommands.h"
#include "llmoveview.h"
#include "llparcel.h"
#include "llrootview.h"
#include "llsceneview.h"
#include "llselectmgr.h"
-#include "llsidetray.h"
#include "llstatusbar.h"
#include "lltextureview.h"
#include "lltoolcomp.h"
@@ -373,8 +371,6 @@ void set_underclothes_menu_options()
void init_menus()
{
- S32 top = gViewerWindow->getRootView()->getRect().getHeight();
-
// Initialize actions
initialize_menus();
@@ -446,11 +442,13 @@ void init_menus()
{
color = LLUIColorTable::instance().getColor( "MenuNonProductionBgColor" );
}
+
+ LLView* menu_bar_holder = gViewerWindow->getRootView()->getChildView("menu_bar_holder");
+
gMenuBarView = LLUICtrlFactory::getInstance()->createFromFile<LLMenuBarGL>("menu_viewer.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
- gMenuBarView->setRect(LLRect(0, top, 0, top - MENU_BAR_HEIGHT));
+ gMenuBarView->setRect(LLRect(0, menu_bar_holder->getRect().mTop, 0, menu_bar_holder->getRect().mTop - MENU_BAR_HEIGHT));
gMenuBarView->setBackgroundColor( color );
- LLView* menu_bar_holder = gViewerWindow->getRootView()->getChildView("menu_bar_holder");
menu_bar_holder->addChild(gMenuBarView);
gViewerWindow->setMenuBackgroundColor(false,
@@ -863,51 +861,6 @@ class LLAdvancedCheckFeature : public view_listener_t
}
};
-void toggle_destination_and_avatar_picker(const LLSD& show)
-{
- S32 panel_idx = show.isDefined() ? show.asInteger() : -1;
- LLView* container = gViewerWindow->getRootView()->findChildView("avatar_picker_and_destination_guide_container");
- if (!container) return;
-
- LLMediaCtrl* destinations = container->findChild<LLMediaCtrl>("destination_guide_contents");
- LLMediaCtrl* avatar_picker = container->findChild<LLMediaCtrl>("avatar_picker_contents");
- if (!destinations || !avatar_picker) return;
-
- LLButton* avatar_btn = gViewerWindow->getRootView()->getChildView("bottom_tray")->getChild<LLButton>("avatar_btn");
- LLButton* destination_btn = gViewerWindow->getRootView()->getChildView("bottom_tray")->getChild<LLButton>("destination_btn");
-
- if (panel_idx == 0
- && !destinations->getVisible())
- { // opening destinations guide
- container->setVisible(true);
- destinations->setVisible(true);
- avatar_picker->setVisible(false);
- LLFirstUse::notUsingDestinationGuide(false);
- avatar_btn->setToggleState(false);
- destination_btn->setToggleState(true);
- gSavedSettings.setS32("DestinationsAndAvatarsVisibility", 0);
- }
- else if (panel_idx == 1
- && !avatar_picker->getVisible())
- { // opening avatar picker
- container->setVisible(true);
- destinations->setVisible(false);
- avatar_picker->setVisible(true);
- avatar_btn->setToggleState(true);
- destination_btn->setToggleState(false);
- gSavedSettings.setS32("DestinationsAndAvatarsVisibility", 1);
- }
- else
- { // toggling off dest guide or avatar picker
- container->setVisible(false);
- destinations->setVisible(false);
- avatar_picker->setVisible(false);
- avatar_btn->setToggleState(false);
- destination_btn->setToggleState(false);
- gSavedSettings.setS32("DestinationsAndAvatarsVisibility", -1);
- }
-};
-
//////////////////
// INFO DISPLAY //
@@ -994,6 +947,10 @@ U32 info_display_from_string(std::string info_display)
{
return LLPipeline::RENDER_DEBUG_COMPOSITION;
}
+ else if ("attachment bytes" == info_display)
+ {
+ return LLPipeline::RENDER_DEBUG_ATTACHMENT_BYTES;
+ }
else if ("glow" == info_display)
{
return LLPipeline::RENDER_DEBUG_GLOW;
@@ -1014,6 +971,10 @@ U32 info_display_from_string(std::string info_display)
{
return LLPipeline::RENDER_DEBUG_SCULPTED;
}
+ else if ("wind vectors" == info_display)
+ {
+ return LLPipeline::RENDER_DEBUG_WIND_VECTORS;
+ }
else
{
return 0;
@@ -1026,6 +987,8 @@ class LLAdvancedToggleInfoDisplay : public view_listener_t
{
U32 info_display = info_display_from_string( userdata.asString() );
+ LL_INFOS("ViewerMenu") << "toggle " << userdata.asString() << LL_ENDL;
+
if ( info_display != 0 )
{
LLPipeline::toggleRenderDebug( (void*)info_display );
@@ -1043,6 +1006,8 @@ class LLAdvancedCheckInfoDisplay : public view_listener_t
U32 info_display = info_display_from_string( userdata.asString() );
bool new_value = false;
+ LL_INFOS("ViewerMenu") << "check " << userdata.asString() << LL_ENDL;
+
if ( info_display != 0 )
{
new_value = LLPipeline::toggleRenderDebugControl( (void*)info_display );
@@ -1076,26 +1041,6 @@ class LLAdvancedCheckRandomizeFramerate : public view_listener_t
}
};
-void run_vectorize_perf_test(void *)
-{
- gSavedSettings.setBOOL("VectorizePerfTest", TRUE);
-}
-
-
-////////////////////////////////
-// RUN Vectorized Perform Test//
-////////////////////////////////
-
-
-class LLAdvancedVectorizePerfTest : public view_listener_t
-{
- bool handleEvent(const LLSD& userdata)
- {
- run_vectorize_perf_test(NULL);
- return true;
- }
-};
-
///////////////////////////
//// PERIODIC SLOW FRAME //
///////////////////////////
@@ -2262,6 +2207,30 @@ class LLAdvancedEnableToggleHackedGodmode : public view_listener_t
//// Advanced menu
////-------------------------------------------------------------------
+
+//////////////////
+// DEVELOP MENU //
+//////////////////
+
+class LLDevelopCheckLoggingLevel : public view_listener_t
+{
+ bool handleEvent(const LLSD& userdata)
+ {
+ U32 level = userdata.asInteger();
+ return (static_cast<LLError::ELevel>(level) == LLError::getDefaultLevel());
+ }
+};
+
+class LLDevelopSetLoggingLevel : public view_listener_t
+{
+ bool handleEvent(const LLSD& userdata)
+ {
+ U32 level = userdata.asInteger();
+ LLError::setDefaultLevel(static_cast<LLError::ELevel>(level));
+ return true;
+ }
+};
+
//////////////////
// ADMIN MENU //
//////////////////
@@ -2633,7 +2602,7 @@ void handle_object_inspect()
{
LLSD key;
key["task"] = "task";
- LLSideTray::getInstance()->showPanel("sidepanel_inventory", key);
+ LLFloaterSidePanelContainer::showPanel("inventory", key);
}
/*
@@ -2821,8 +2790,31 @@ bool enable_object_mute()
else
{
// Just a regular object
- return LLSelectMgr::getInstance()->getSelection()->
- contains( object, SELECT_ALL_TES );
+ return LLSelectMgr::getInstance()->getSelection()->contains( object, SELECT_ALL_TES ) &&
+ !LLMuteList::getInstance()->isMuted(object->getID());
+ }
+}
+
+bool enable_object_unmute()
+{
+ LLViewerObject* object = LLSelectMgr::getInstance()->getSelection()->getPrimaryObject();
+ if (!object) return false;
+
+ LLVOAvatar* avatar = find_avatar_from_object(object);
+ if (avatar)
+ {
+ // It's an avatar
+ LLNameValue *lastname = avatar->getNVPair("LastName");
+ bool is_linden =
+ lastname && !LLStringUtil::compareStrings(lastname->getString(), "Linden");
+ bool is_self = avatar->isSelf();
+ return !is_linden && !is_self;
+ }
+ else
+ {
+ // Just a regular object
+ return LLSelectMgr::getInstance()->getSelection()->contains( object, SELECT_ALL_TES ) &&
+ LLMuteList::getInstance()->isMuted(object->getID());;
}
}
@@ -3158,6 +3150,12 @@ void handle_avatar_eject(const LLSD& avatar_id)
}
}
+bool my_profile_visible()
+{
+ LLFloater* floaterp = LLAvatarActions::getProfileFloater(gAgentID);
+ return floaterp && floaterp->isInVisibleChain();
+}
+
bool enable_freeze_eject(const LLSD& avatar_id)
{
// Use avatar_id if available, otherwise default to right-click avatar
@@ -3392,15 +3390,6 @@ bool enable_sitdown_self()
return isAgentAvatarValid() && !gAgentAvatarp->isSitting() && !gAgent.getFlying();
}
-// Used from the login screen to aid in UI work on side tray
-void handle_show_side_tray()
-{
- LLSideTray* side_tray = LLSideTray::getInstance();
- LLView* root = gViewerWindow->getRootView();
- // automatically removes and re-adds if there already
- root->addChild(side_tray);
-}
-
// Toggle one of "People" panel tabs in side tray.
class LLTogglePanelPeopleTab : public view_listener_t
{
@@ -3411,21 +3400,11 @@ class LLTogglePanelPeopleTab : public view_listener_t
LLSD param;
param["people_panel_tab_name"] = panel_name;
- static LLPanel* friends_panel = NULL;
- static LLPanel* groups_panel = NULL;
- static LLPanel* nearby_panel = NULL;
-
- if (panel_name == "friends_panel")
- {
- return togglePeoplePanel(friends_panel, panel_name, param);
- }
- else if (panel_name == "groups_panel")
+ if ( panel_name == "friends_panel"
+ || panel_name == "groups_panel"
+ || panel_name == "nearby_panel")
{
- return togglePeoplePanel(groups_panel, panel_name, param);
- }
- else if (panel_name == "nearby_panel")
- {
- return togglePeoplePanel(nearby_panel, panel_name, param);
+ return togglePeoplePanel(panel_name, param);
}
else
{
@@ -3433,16 +3412,20 @@ class LLTogglePanelPeopleTab : public view_listener_t
}
}
- static bool togglePeoplePanel(LLPanel* &panel, const std::string& panel_name, const LLSD& param)
+ static bool togglePeoplePanel(const std::string& panel_name, const LLSD& param)
{
+ LLPanel *panel = LLFloaterSidePanelContainer::getPanel("people", panel_name);
if(!panel)
+ return false;
+
+ if (panel->isInVisibleChain())
{
- panel = LLSideTray::getInstance()->getPanel(panel_name);
- if(!panel)
- return false;
+ LLFloaterReg::hideInstance("people");
+ }
+ else
+ {
+ LLFloaterSidePanelContainer::showPanel("people", "panel_people", param) ;
}
-
- LLSideTray::getInstance()->togglePanel(panel, "panel_people", param);
return true;
}
@@ -3757,7 +3740,7 @@ void handle_reset_view()
if (gAgentCamera.cameraCustomizeAvatar())
{
// switching to outfit selector should automagically save any currently edited wearable
- LLSideTray::getInstance()->showPanel("sidepanel_appearance", LLSD().with("type", "my_outfits"));
+ LLFloaterSidePanelContainer::showPanel("appearance", LLSD().with("type", "my_outfits"));
}
gAgentCamera.switchCameraPreset(CAMERA_PRESET_REAR_VIEW);
@@ -3822,6 +3805,43 @@ class LLViewDefaultUISize : public view_listener_t
}
};
+class LLViewToggleUI : public view_listener_t
+{
+ bool handleEvent(const LLSD& userdata)
+ {
+ LLNotification::Params params("ConfirmHideUI");
+ params.functor.function(boost::bind(&LLViewToggleUI::confirm, this, _1, _2));
+ LLSD substitutions;
+#if LL_DARWIN
+ substitutions["SHORTCUT"] = "Cmd+Shift+U";
+#else
+ substitutions["SHORTCUT"] = "Ctrl+Shift+U";
+#endif
+ params.substitutions = substitutions;
+ if (gViewerWindow->getUIVisibility())
+ {
+ // hiding, so show notification
+ LLNotifications::instance().add(params);
+ }
+ else
+ {
+ LLNotifications::instance().forceResponse(params, 0);
+ }
+
+ return true;
+ }
+
+ void confirm(const LLSD& notification, const LLSD& response)
+ {
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+
+ if (option == 0) // OK
+ {
+ gViewerWindow->setUIVisibility(!gViewerWindow->getUIVisibility());
+ }
+ }
+};
+
class LLEditDuplicate : public view_listener_t
{
bool handleEvent(const LLSD& userdata)
@@ -4539,6 +4559,13 @@ bool tools_visible_take_object()
return !is_selection_buy_not_take();
}
+bool enable_how_to_visible(const LLSD& param)
+{
+ LLFloaterWebContent::Params p;
+ p.target = "__help_how_to";
+ return LLFloaterReg::instanceVisible("how_to", p);
+}
+
class LLToolsEnableBuyOrTake : public view_listener_t
{
bool handleEvent(const LLSD& userdata)
@@ -5324,7 +5351,7 @@ class LLWorldCreateLandmark : public view_listener_t
{
bool handleEvent(const LLSD& userdata)
{
- LLSideTray::getInstance()->showPanel("panel_places", LLSD().with("type", "create_landmark"));
+ LLFloaterSidePanelContainer::showPanel("places", LLSD().with("type", "create_landmark"));
return true;
}
@@ -5334,7 +5361,7 @@ class LLWorldPlaceProfile : public view_listener_t
{
bool handleEvent(const LLSD& userdata)
{
- LLSideTray::getInstance()->showPanel("panel_places", LLSD().with("type", "agent"));
+ LLFloaterSidePanelContainer::showPanel("places", LLSD().with("type", "agent"));
return true;
}
@@ -5430,6 +5457,34 @@ class LLAvatarAddFriend : public view_listener_t
}
};
+
+class LLAvatarToggleMyProfile : public view_listener_t
+{
+ bool handleEvent(const LLSD& userdata)
+ {
+ LLFloater* instance = LLAvatarActions::getProfileFloater(gAgent.getID());
+ if (LLFloater::isMinimized(instance))
+ {
+ instance->setMinimized(FALSE);
+ instance->setFocus(TRUE);
+ }
+ else if (!LLFloater::isShown(instance))
+ {
+ LLAvatarActions::showProfile(gAgent.getID());
+ }
+ else if (!instance->hasFocus() && !instance->getIsChrome())
+ {
+ instance->setFocus(TRUE);
+ }
+ else
+ {
+ instance->closeFloater();
+ }
+ return true;
+ }
+};
+
+
class LLAvatarAddContact : public view_listener_t
{
bool handleEvent(const LLSD& userdata)
@@ -5575,22 +5630,22 @@ void handle_viewer_disable_message_log(void*)
void handle_customize_avatar()
{
- LLSideTray::getInstance()->showPanel("sidepanel_appearance", LLSD().with("type", "my_outfits"));
+ LLFloaterSidePanelContainer::showPanel("appearance", LLSD().with("type", "my_outfits"));
}
void handle_edit_outfit()
{
- LLSideTray::getInstance()->showPanel("sidepanel_appearance", LLSD().with("type", "edit_outfit"));
+ LLFloaterSidePanelContainer::showPanel("appearance", LLSD().with("type", "edit_outfit"));
}
void handle_edit_shape()
{
- LLSideTray::getInstance()->showPanel("sidepanel_appearance", LLSD().with("type", "edit_shape"));
+ LLFloaterSidePanelContainer::showPanel("appearance", LLSD().with("type", "edit_shape"));
}
void handle_edit_physics()
{
- LLSideTray::getInstance()->showPanel("sidepanel_appearance", LLSD().with("type", "edit_physics"));
+ LLFloaterSidePanelContainer::showPanel("appearance", LLSD().with("type", "edit_physics"));
}
void handle_report_abuse()
@@ -5660,18 +5715,18 @@ class LLShowSidetrayPanel : public view_listener_t
{
bool handleEvent(const LLSD& userdata)
{
- std::string panel_name = userdata.asString();
+ std::string floater_name = userdata.asString();
- LLPanel* panel = LLSideTray::getInstance()->getPanel(panel_name);
+ LLPanel* panel = LLFloaterSidePanelContainer::getPanel(floater_name);
if (panel)
{
if (panel->isInVisibleChain())
{
- LLSideTray::getInstance()->hidePanel(panel_name);
+ LLFloaterReg::getInstance(floater_name)->closeFloater();
}
else
{
- LLSideTray::getInstance()->showPanel(panel_name);
+ LLFloaterReg::getInstance(floater_name)->openFloater();
}
}
return true;
@@ -5682,9 +5737,9 @@ class LLSidetrayPanelVisible : public view_listener_t
{
bool handleEvent(const LLSD& userdata)
{
- std::string panel_name = userdata.asString();
+ std::string floater_name = userdata.asString();
// Toggle the panel
- if (LLSideTray::getInstance()->isPanelActive(panel_name))
+ if (LLFloaterReg::getInstance(floater_name)->isInVisibleChain())
{
return true;
}
@@ -6870,6 +6925,22 @@ class LLToolsEnableSaveToObjectInventory : public view_listener_t
}
};
+class LLToggleHowTo : public view_listener_t
+{
+ bool handleEvent(const LLSD& userdata)
+ {
+ LLFloaterWebContent::Params p;
+ std::string url = gSavedSettings.getString("HowToHelpURL");
+ p.url = LLWeb::expandURLSubstitutions(url, LLSD());
+ p.show_chrome = false;
+ p.target = "__help_how_to";
+ p.show_page_title = false;
+ p.preferred_media_size = LLRect(0, 460, 335, 0);
+
+ LLFloaterReg::toggleInstanceOrBringToFront("how_to", p);
+ return true;
+ }
+};
class LLViewEnableMouselook : public view_listener_t
{
@@ -7289,7 +7360,7 @@ void handle_web_browser_test(const LLSD& param)
void handle_web_content_test(const LLSD& param)
{
std::string url = param.asString();
- LLWeb::loadWebURLInternal(url);
+ LLWeb::loadURLInternal(url);
}
void handle_buy_currency_test(void*)
@@ -7660,7 +7731,14 @@ class LLWorldEnvSettings : public view_listener_t
}
else
{
- LLEnvManagerNew::instance().setUseDayCycle(LLEnvManagerNew::instance().getDayCycleName());
+ LLEnvManagerNew &envmgr = LLEnvManagerNew::instance();
+ // reset all environmental settings to track the region defaults, make this reset 'sticky' like the other sun settings.
+ bool use_fixed_sky = false;
+ bool use_region_settings = true;
+ envmgr.setUserPrefs(envmgr.getWaterPresetName(),
+ envmgr.getSkyPresetName(),
+ envmgr.getDayCycleName(),
+ use_fixed_sky, use_region_settings);
}
return true;
@@ -7762,24 +7840,6 @@ class LLWorldPostProcess : public view_listener_t
}
};
-class LLWorldToggleMovementControls : public view_listener_t
-{
- bool handleEvent(const LLSD& userdata)
- {
- LLBottomTray::getInstance()->toggleMovementControls();
- return true;
- }
-};
-
-class LLWorldToggleCameraControls : public view_listener_t
-{
- bool handleEvent(const LLSD& userdata)
- {
- LLBottomTray::getInstance()->toggleCameraControls();
- return true;
- }
-};
-
void handle_flush_name_caches()
{
// Toggle display names on and off to flush
@@ -7823,55 +7883,6 @@ class LLToggleUIHints : public view_listener_t
}
};
-class LLCheckSessionsSettings : public view_listener_t
-{
- bool handleEvent(const LLSD& userdata)
- {
- std::string expected = userdata.asString();
- return gSavedSettings.getString("SessionSettingsFile") == expected;
- }
-};
-
-class LLChangeMode : public view_listener_t
-{
- bool handleEvent(const LLSD& userdata)
- {
- std::string mode = userdata.asString();
- if (mode == "basic")
- {
- if (gSavedSettings.getString("SessionSettingsFile") != "settings_minimal.xml")
- {
- LLNotificationsUtil::add("ModeChange", LLSD(), LLSD(), boost::bind(onModeChangeConfirm, "settings_minimal.xml", _1, _2));
- }
- return true;
- }
- else if (mode == "advanced")
- {
- if (gSavedSettings.getString("SessionSettingsFile") != "")
- {
- LLNotificationsUtil::add("ModeChange", LLSD(), LLSD(), boost::bind(onModeChangeConfirm, "", _1, _2));
- }
- return true;
- }
- return false;
- }
-
- static void onModeChangeConfirm(const std::string& new_session_settings_file, const LLSD& notification, const LLSD& response)
- {
- S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
- switch (option)
- {
- case 0:
- gSavedSettings.getControl("SessionSettingsFile")->set(new_session_settings_file);
- LLAppViewer::instance()->requestQuit();
- break;
- case 1:
- default:
- break;
- }
- }
-};
-
void LLUploadCostCalculator::calculateCost()
{
S32 upload_cost = LLGlobalEconomy::Singleton::getInstance()->getPriceUpload();
@@ -7978,9 +7989,17 @@ void initialize_menus()
view_listener_t::addEnable(new LLUploadCostCalculator(), "Upload.CalculateCosts");
+
+ commit.add("Inventory.NewWindow", boost::bind(&LLFloaterInventory::showAgentInventory));
+
// Agent
commit.add("Agent.toggleFlying", boost::bind(&LLAgent::toggleFlying));
enable.add("Agent.enableFlying", boost::bind(&LLAgent::enableFlying));
+ commit.add("Agent.PressMicrophone", boost::bind(&LLAgent::pressMicrophone, _2));
+ commit.add("Agent.ReleaseMicrophone", boost::bind(&LLAgent::releaseMicrophone, _2));
+ commit.add("Agent.ToggleMicrophone", boost::bind(&LLAgent::toggleMicrophone, _2));
+ enable.add("Agent.IsMicrophoneOn", boost::bind(&LLAgent::isMicrophoneOn, _2));
+ enable.add("Agent.IsActionAllowed", boost::bind(&LLAgent::isActionAllowed, _2));
// File menu
init_menu_file();
@@ -8007,6 +8026,7 @@ void initialize_menus()
view_listener_t::addMenu(new LLZoomer(1/1.2f), "View.ZoomIn");
view_listener_t::addMenu(new LLZoomer(DEFAULT_FIELD_OF_VIEW, false), "View.ZoomDefault");
view_listener_t::addMenu(new LLViewDefaultUISize(), "View.DefaultUISize");
+ view_listener_t::addMenu(new LLViewToggleUI(), "View.ToggleUI");
view_listener_t::addMenu(new LLViewEnableMouselook(), "View.EnableMouselook");
view_listener_t::addMenu(new LLViewEnableJoystickFlycam(), "View.EnableJoystickFlycam");
@@ -8022,7 +8042,6 @@ void initialize_menus()
view_listener_t::addMenu(new LLAdvancedAgentFlyingInfo(), "Agent.getFlying");
// World menu
- commit.add("World.Chat", boost::bind(&handle_chat, (void*)NULL));
view_listener_t::addMenu(new LLWorldAlwaysRun(), "World.AlwaysRun");
view_listener_t::addMenu(new LLWorldCreateLandmark(), "World.CreateLandmark");
view_listener_t::addMenu(new LLWorldPlaceProfile(), "World.PlaceProfile");
@@ -8043,9 +8062,6 @@ void initialize_menus()
view_listener_t::addMenu(new LLWorldEnableEnvPreset(), "World.EnableEnvPreset");
view_listener_t::addMenu(new LLWorldPostProcess(), "World.PostProcess");
- view_listener_t::addMenu(new LLWorldToggleMovementControls(), "World.Toggle.MovementControls");
- view_listener_t::addMenu(new LLWorldToggleCameraControls(), "World.Toggle.CameraControls");
-
// Tools menu
view_listener_t::addMenu(new LLToolsSelectTool(), "Tools.SelectTool");
view_listener_t::addMenu(new LLToolsSelectOnlyMyObjects(), "Tools.SelectOnlyMyObjects");
@@ -8082,6 +8098,8 @@ void initialize_menus()
// Help menu
// most items use the ShowFloater method
+ view_listener_t::addMenu(new LLToggleHowTo(), "Help.ToggleHowTo");
+ enable.add("Help.HowToVisible", boost::bind(&enable_how_to_visible, _2));
// Advanced menu
view_listener_t::addMenu(new LLAdvancedToggleConsole(), "Advanced.ToggleConsole");
@@ -8119,7 +8137,6 @@ void initialize_menus()
view_listener_t::addMenu(new LLAdvancedCheckRandomizeFramerate(), "Advanced.CheckRandomizeFramerate");
view_listener_t::addMenu(new LLAdvancedTogglePeriodicSlowFrame(), "Advanced.TogglePeriodicSlowFrame");
view_listener_t::addMenu(new LLAdvancedCheckPeriodicSlowFrame(), "Advanced.CheckPeriodicSlowFrame");
- view_listener_t::addMenu(new LLAdvancedVectorizePerfTest(), "Advanced.VectorizePerfTest");
view_listener_t::addMenu(new LLAdvancedToggleFrameTest(), "Advanced.ToggleFrameTest");
view_listener_t::addMenu(new LLAdvancedCheckFrameTest(), "Advanced.CheckFrameTest");
view_listener_t::addMenu(new LLAdvancedHandleAttachedLightParticles(), "Advanced.HandleAttachedLightParticles");
@@ -8160,7 +8177,6 @@ void initialize_menus()
view_listener_t::addMenu(new LLAdvancedCheckDebugKeys(), "Advanced.CheckDebugKeys");
view_listener_t::addMenu(new LLAdvancedToggleDebugWindowProc(), "Advanced.ToggleDebugWindowProc");
view_listener_t::addMenu(new LLAdvancedCheckDebugWindowProc(), "Advanced.CheckDebugWindowProc");
- commit.add("Advanced.ShowSideTray", boost::bind(&handle_show_side_tray));
// Advanced > XUI
commit.add("Advanced.ReloadColorSettings", boost::bind(&LLUIColorTable::loadFromSettings, LLUIColorTable::getInstance()));
@@ -8230,6 +8246,9 @@ void initialize_menus()
view_listener_t::addMenu(new LLAdvancedRequestAdminStatus(), "Advanced.RequestAdminStatus");
view_listener_t::addMenu(new LLAdvancedLeaveAdminStatus(), "Advanced.LeaveAdminStatus");
+ // Develop >Set logging level
+ view_listener_t::addMenu(new LLDevelopCheckLoggingLevel(), "Develop.CheckLoggingLevel");
+ view_listener_t::addMenu(new LLDevelopSetLoggingLevel(), "Develop.SetLoggingLevel");
// Admin >Object
view_listener_t::addMenu(new LLAdminForceTakeCopy(), "Admin.ForceTakeCopy");
@@ -8275,6 +8294,10 @@ void initialize_menus()
view_listener_t::addMenu(new LLAvatarCall(), "Avatar.Call");
enable.add("Avatar.EnableCall", boost::bind(&LLAvatarActions::canCall));
view_listener_t::addMenu(new LLAvatarReportAbuse(), "Avatar.ReportAbuse");
+ view_listener_t::addMenu(new LLAvatarToggleMyProfile(), "Avatar.ToggleMyProfile");
+ enable.add("Avatar.IsMyProfileOpen", boost::bind(&my_profile_visible));
+
+ commit.add("Avatar.OpenMarketplace", boost::bind(&LLWeb::loadURLExternal, gSavedSettings.getString("MarketplaceURL")));
view_listener_t::addMenu(new LLAvatarEnableAddFriend(), "Avatar.EnableAddFriend");
enable.add("Avatar.EnableFreezeEject", boost::bind(&enable_freeze_eject, _2));
@@ -8312,6 +8335,7 @@ void initialize_menus()
enable.add("Avatar.EnableMute", boost::bind(&enable_object_mute));
enable.add("Object.EnableMute", boost::bind(&enable_object_mute));
+ enable.add("Object.EnableUnmute", boost::bind(&enable_object_unmute));
enable.add("Object.EnableBuy", boost::bind(&enable_buy_object));
commit.add("Object.ZoomIn", boost::bind(&handle_look_at_selection, "zoom"));
@@ -8347,6 +8371,8 @@ void initialize_menus()
view_listener_t::addMenu(new LLGoToObject(), "GoToObject");
commit.add("PayObject", boost::bind(&handle_give_money_dialog));
+ commit.add("Inventory.NewWindow", boost::bind(&LLFloaterInventory::showAgentInventory));
+
enable.add("EnablePayObject", boost::bind(&enable_pay_object));
enable.add("EnablePayAvatar", boost::bind(&enable_pay_avatar));
enable.add("EnableEdit", boost::bind(&enable_object_edit));
@@ -8359,11 +8385,5 @@ void initialize_menus()
view_listener_t::addMenu(new LLSomethingSelectedNoHUD(), "SomethingSelectedNoHUD");
view_listener_t::addMenu(new LLEditableSelected(), "EditableSelected");
view_listener_t::addMenu(new LLEditableSelectedMono(), "EditableSelectedMono");
-
view_listener_t::addMenu(new LLToggleUIHints(), "ToggleUIHints");
- view_listener_t::addMenu(new LLCheckSessionsSettings(), "CheckSessionSettings");
- view_listener_t::addMenu(new LLChangeMode(), "ChangeMode");
-
- commit.add("Destination.show", boost::bind(&toggle_destination_and_avatar_picker, 0));
- commit.add("Avatar.show", boost::bind(&toggle_destination_and_avatar_picker, 1));
}
diff --git a/indra/newview/llviewermenu.h b/indra/newview/llviewermenu.h
index b4e239b0cd..87cb4efbc4 100644
--- a/indra/newview/llviewermenu.h
+++ b/indra/newview/llviewermenu.h
@@ -126,8 +126,6 @@ bool enable_pay_object();
bool enable_buy_object();
bool handle_go_to();
-void toggle_destination_and_avatar_picker(const LLSD& show);
-
// Export to XML or Collada
void handle_export_selected( void * );
diff --git a/indra/newview/llviewermenufile.cpp b/indra/newview/llviewermenufile.cpp
index 8139f7deda..7e830e14bf 100644
--- a/indra/newview/llviewermenufile.cpp
+++ b/indra/newview/llviewermenufile.cpp
@@ -149,7 +149,7 @@ void LLFilePickerThread::run()
//static
void LLFilePickerThread::initClass()
{
- sMutex = new LLMutex();
+ sMutex = new LLMutex(NULL);
}
//static
@@ -528,23 +528,7 @@ class LLFileTakeSnapshotToDisk : public view_listener_t
{
gViewerWindow->playSnapshotAnimAndSound();
- LLPointer<LLImageFormatted> formatted;
- switch(LLFloaterSnapshot::ESnapshotFormat(gSavedSettings.getS32("SnapshotFormat")))
- {
- case LLFloaterSnapshot::SNAPSHOT_FORMAT_JPEG:
- formatted = new LLImageJPEG(gSavedSettings.getS32("SnapshotQuality"));
- break;
- case LLFloaterSnapshot::SNAPSHOT_FORMAT_PNG:
- formatted = new LLImagePNG;
- break;
- case LLFloaterSnapshot::SNAPSHOT_FORMAT_BMP:
- formatted = new LLImageBMP;
- break;
- default:
- llwarns << "Unknown Local Snapshot format" << llendl;
- return true;
- }
-
+ LLPointer<LLImageFormatted> formatted = new LLImagePNG;
formatted->enableOverSize() ;
formatted->encode(raw, 0);
formatted->disableOverSize() ;
@@ -816,7 +800,8 @@ LLUUID upload_new_resource(
uuid = tid.makeAssetID(gAgent.getSecureSessionID());
// copy this file into the vfs for upload
S32 file_size;
- LLAPRFile infile(filename, LL_APR_RB, &file_size);
+ LLAPRFile infile ;
+ infile.open(filename, LL_APR_RB, NULL, &file_size);
if (infile.getFileHandle())
{
LLVFile file(gVFS, uuid, asset_type, LLVFile::WRITE);
diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp
index 6435904fee..3c6770df43 100644..100755
--- a/indra/newview/llviewermessage.cpp
+++ b/indra/newview/llviewermessage.cpp
@@ -59,8 +59,9 @@
#include "llfloaterland.h"
#include "llfloaterregioninfo.h"
#include "llfloaterlandholdings.h"
-#include "llfloaterpostcard.h"
#include "llfloaterpreference.h"
+#include "llfloatersidepanelcontainer.h"
+#include "llfloatersnapshot.h"
#include "llhudeffecttrail.h"
#include "llhudmanager.h"
#include "llinventoryfunctions.h"
@@ -73,7 +74,6 @@
#include "llrecentpeople.h"
#include "llscriptfloater.h"
#include "llselectmgr.h"
-#include "llsidetray.h"
#include "llstartup.h"
#include "llsky.h"
#include "llslurl.h"
@@ -1192,9 +1192,7 @@ void open_inventory_offer(const uuid_vec_t& objects, const std::string& from_nam
LLInventoryCategory* parent_folder = gInventory.getCategory(item->getParentUUID());
if ("inventory_handler" == from_name)
{
- //we have to filter inventory_handler messages to avoid notification displaying
- LLSideTray::getInstance()->showPanel("panel_places",
- LLSD().with("type", "landmark").with("id", item->getUUID()));
+ LLFloaterSidePanelContainer::showPanel("places", LLSD().with("type", "landmark").with("id", item->getUUID()));
}
else if("group_offer" == from_name)
{
@@ -1203,7 +1201,7 @@ void open_inventory_offer(const uuid_vec_t& objects, const std::string& from_nam
LLSD args;
args["type"] = "landmark";
args["id"] = obj_id;
- LLSideTray::getInstance()->showPanel("panel_places", args);
+ LLFloaterSidePanelContainer::showPanel("places", args);
continue;
}
@@ -1258,14 +1256,7 @@ void open_inventory_offer(const uuid_vec_t& objects, const std::string& from_nam
const BOOL auto_open =
gSavedSettings.getBOOL("ShowInInventory") && // don't open if showininventory is false
!from_name.empty(); // don't open if it's not from anyone.
- LLInventoryPanel *active_panel = LLInventoryPanel::getActiveInventoryPanel(auto_open);
- if(active_panel)
- {
- LL_DEBUGS("Messaging") << "Highlighting" << obj_id << LL_ENDL;
- LLFocusableElement* focus_ctrl = gFocusMgr.getKeyboardFocus();
- active_panel->setSelection(obj_id, TAKE_FOCUS_NO);
- gFocusMgr.setKeyboardFocus(focus_ctrl);
- }
+ LLInventoryPanel::openInventoryPanelAndSetSelection(auto_open, obj_id);
}
}
@@ -1809,8 +1800,11 @@ void LLOfferInfo::initRespondFunctionMap()
void inventory_offer_handler(LLOfferInfo* info)
{
- //If muted, don't even go through the messaging stuff. Just curtail the offer here.
- if (LLMuteList::getInstance()->isMuted(info->mFromID, info->mFromName))
+ // If muted, don't even go through the messaging stuff. Just curtail the offer here.
+ // Passing in a null UUID handles the case of where you have muted one of your own objects by_name.
+ // The solution for STORM-1297 seems to handle the cases where the object is owned by someone else.
+ if (LLMuteList::getInstance()->isMuted(info->mFromID, info->mFromName) ||
+ LLMuteList::getInstance()->isMuted(LLUUID::null, info->mFromName))
{
info->forceResponse(IOR_MUTE);
return;
@@ -2190,7 +2184,7 @@ void god_message_name_cb(const LLAvatarName& av_name, LLChat chat, std::string m
// Treat like a system message and put in chat history.
chat.mText = av_name.getCompleteName() + ": " + message;
- LLNearbyChat* nearby_chat = LLFloaterReg::getTypedInstance<LLNearbyChat>("nearby_chat", LLSD());
+ LLNearbyChat* nearby_chat = LLNearbyChat::getInstance();
if(nearby_chat)
{
nearby_chat->addMessage(chat);
@@ -2241,6 +2235,10 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
{
name = LLTrans::getString("Unnamed");
}
+
+ // Preserve the unaltered name for use in group notice mute checking.
+ std::string original_name = name;
+
// IDEVO convert new-style "Resident" names for display
name = clean_name_from_im(name, dialog);
@@ -2447,6 +2445,26 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
break;
}
+ // The group notice packet does not have an AgentID. Obtain one from the name cache.
+ // If last name is "Resident" strip it out so the cache name lookup works.
+ U32 index = original_name.find(" Resident");
+ if (index != std::string::npos)
+ {
+ original_name = original_name.substr(0, index);
+ }
+ std::string legacy_name = gCacheName->buildLegacyName(original_name);
+ LLUUID agent_id;
+ gCacheName->getUUID(legacy_name, agent_id);
+
+ if (agent_id.isNull())
+ {
+ LL_WARNS("Messaging") << "buildLegacyName returned null while processing " << original_name << LL_ENDL;
+ }
+ else if (LLMuteList::getInstance()->isMuted(agent_id))
+ {
+ break;
+ }
+
notice_bin_bucket = (struct notice_bucket_full_t*) &binary_bucket[0];
U8 has_inventory = notice_bin_bucket->header.has_inventory;
U8 asset_type = notice_bin_bucket->header.asset_type;
@@ -2752,7 +2770,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
// Note: lie to Nearby Chat, pretending that this is NOT an IM, because
// IMs from obejcts don't open IM sessions.
- LLNearbyChat* nearby_chat = LLFloaterReg::getTypedInstance<LLNearbyChat>("nearby_chat", LLSD());
+ LLNearbyChat* nearby_chat = LLNearbyChat::getInstance();
if(SYSTEM_FROM != name && nearby_chat)
{
chat.mOwnerID = from_id;
@@ -2836,8 +2854,8 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
else
{
LLVector3 pos, look_at;
- U64 region_handle;
- U8 region_access;
+ U64 region_handle(0);
+ U8 region_access(0);
std::string region_info = ll_safe_string((char*)binary_bucket, binary_bucket_size);
std::string region_access_str = LLStringUtil::null;
std::string region_access_icn = LLStringUtil::null;
@@ -3120,7 +3138,7 @@ protected:
{
// filter out non-interesting responeses
if ( !translation.empty()
- && (m_toLang != detected_language)
+ && (mToLang != detected_language)
&& (LLStringUtil::compareInsensitive(translation, m_origMesg) != 0) )
{
m_chat.mText += " (" + translation + ")";
@@ -3129,10 +3147,13 @@ protected:
LLNotificationsUI::LLNotificationManager::instance().onChat(m_chat, m_toastArgs);
}
- void handleFailure()
+ void handleFailure(int status, const std::string& err_msg)
{
- LLTranslate::TranslationReceiver::handleFailure();
- m_chat.mText += " (?)";
+ llwarns << "Translation failed for mesg " << m_origMesg << " toLang " << mToLang << " fromLang " << mFromLang << llendl;
+
+ std::string msg = LLTrans::getString("TranslationFailed", LLSD().with("[REASON]", err_msg));
+ LLStringUtil::replaceString(msg, "\n", " "); // we want one-line error messages
+ m_chat.mText += " (" + msg + ")";
LLNotificationsUI::LLNotificationManager::instance().onChat(m_chat, m_toastArgs);
}
@@ -3370,7 +3391,7 @@ void process_chat_from_simulator(LLMessageSystem *msg, void **user_data)
const std::string from_lang = ""; // leave empty to trigger autodetect
const std::string to_lang = LLTranslate::getTranslateLanguage();
- LLHTTPClient::ResponderPtr result = ChatTranslationReceiver::build(from_lang, to_lang, mesg, chat, args);
+ LLTranslate::TranslationReceiverPtr result = ChatTranslationReceiver::build(from_lang, to_lang, mesg, chat, args);
LLTranslate::translateMessage(result, from_lang, to_lang, mesg);
}
else
@@ -3641,6 +3662,9 @@ void process_teleport_finish(LLMessageSystem* msg, void**)
gCacheName->setUpstream(sim);
*/
+ // Make sure we're standing
+ gAgent.standUp();
+
// now, use the circuit info to tell simulator about us!
LL_INFOS("Messaging") << "process_teleport_finish() Enabling "
<< sim_host << " with code " << msg->mOurCircuitCode << LL_ENDL;
@@ -5206,6 +5230,7 @@ static void process_money_balance_reply_extended(LLMessageSystem* msg)
BOOL is_dest_group = FALSE;
S32 amount = 0;
std::string item_description;
+ BOOL success = FALSE;
msg->getS32("TransactionInfo", "TransactionType", transaction_type);
msg->getUUID("TransactionInfo", "SourceID", source_id);
@@ -5214,6 +5239,7 @@ static void process_money_balance_reply_extended(LLMessageSystem* msg)
msg->getBOOL("TransactionInfo", "IsDestGroup", is_dest_group);
msg->getS32("TransactionInfo", "Amount", amount);
msg->getString("TransactionInfo", "ItemDescription", item_description);
+ msg->getBOOL("MoneyData", "TransactionSuccess", success);
LL_INFOS("Money") << "MoneyBalanceReply source " << source_id
<< " dest " << dest_id
<< " type " << transaction_type
@@ -5275,28 +5301,32 @@ static void process_money_balance_reply_extended(LLMessageSystem* msg)
{
if (dest_id.notNull())
{
- message = LLTrans::getString("you_paid_ldollars", args);
+ message = success ? LLTrans::getString("you_paid_ldollars", args) :
+ LLTrans::getString("you_paid_failure_ldollars", args);
}
else
{
// transaction fee to the system, eg, to create a group
- message = LLTrans::getString("you_paid_ldollars_no_name", args);
+ message = success ? LLTrans::getString("you_paid_ldollars_no_name", args) :
+ LLTrans::getString("you_paid_failure_ldollars_no_name", args);
}
}
else
{
if (dest_id.notNull())
{
- message = LLTrans::getString("you_paid_ldollars_no_reason", args);
+ message = success ? LLTrans::getString("you_paid_ldollars_no_reason", args) :
+ LLTrans::getString("you_paid_failure_ldollars_no_reason", args);
}
else
{
// no target, no reason, you just paid money
- message = LLTrans::getString("you_paid_ldollars_no_info", args);
+ message = success ? LLTrans::getString("you_paid_ldollars_no_info", args) :
+ LLTrans::getString("you_paid_failure_ldollars_no_info", args);
}
}
final_args["MESSAGE"] = message;
- notification = "PaymentSent";
+ notification = success ? "PaymentSent" : "PaymentFailure";
}
else {
// ...someone paid you
@@ -6466,7 +6496,7 @@ void process_user_info_reply(LLMessageSystem* msg, void**)
msg->getString( "UserData", "DirectoryVisibility", dir_visibility);
LLFloaterPreference::updateUserInfo(dir_visibility, im_via_email, email);
- LLFloaterPostcard::updateUserInfo(email);
+ LLFloaterSnapshot::setAgentEmail(email);
}
@@ -6801,7 +6831,7 @@ void process_covenant_reply(LLMessageSystem* msg, void**)
LLPanelLandCovenant::updateEstateOwnerName(owner_name);
LLFloaterBuyLand::updateEstateOwnerName(owner_name);
- LLPanelPlaceProfile* panel = LLSideTray::getInstance()->getPanel<LLPanelPlaceProfile>("panel_place_profile");
+ LLPanelPlaceProfile* panel = LLFloaterSidePanelContainer::getPanel<LLPanelPlaceProfile>("places", "panel_place_profile");
if (panel)
{
panel->updateEstateName(estate_name);
@@ -6935,7 +6965,7 @@ void onCovenantLoadComplete(LLVFS *vfs,
LLPanelLandCovenant::updateCovenantText(covenant_text);
LLFloaterBuyLand::updateCovenantText(covenant_text, asset_uuid);
- LLPanelPlaceProfile* panel = LLSideTray::getInstance()->getPanel<LLPanelPlaceProfile>("panel_place_profile");
+ LLPanelPlaceProfile* panel = LLFloaterSidePanelContainer::getPanel<LLPanelPlaceProfile>("places", "panel_place_profile");
if (panel)
{
panel->updateCovenantText(covenant_text);
diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp
index d81e67bfe2..37fb77a10a 100755..100644
--- a/indra/newview/llviewerobject.cpp
+++ b/indra/newview/llviewerobject.cpp
@@ -3219,12 +3219,12 @@ F32 LLViewerObject::getLinksetPhysicsCost()
return mLinksetPhysicsCost;
}
-F32 LLViewerObject::getStreamingCost(S32* bytes, S32* visible_bytes)
+F32 LLViewerObject::getStreamingCost(S32* bytes, S32* visible_bytes, F32* unscaled_value) const
{
return 0.f;
}
-U32 LLViewerObject::getTriangleCount()
+U32 LLViewerObject::getTriangleCount(S32* vcount) const
{
return 0;
}
@@ -5520,11 +5520,12 @@ void LLViewerObject::dirtyMesh()
{
if (mDrawable)
{
- LLSpatialGroup* group = mDrawable->getSpatialGroup();
+ gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_ALL);
+ /*LLSpatialGroup* group = mDrawable->getSpatialGroup();
if (group)
{
group->dirtyMesh();
- }
+ }*/
}
}
diff --git a/indra/newview/llviewerobject.h b/indra/newview/llviewerobject.h
index 53e951e483..c8152e1539 100644
--- a/indra/newview/llviewerobject.h
+++ b/indra/newview/llviewerobject.h
@@ -1,4 +1,4 @@
-/**
+/**
* @file llviewerobject.h
* @brief Description of LLViewerObject class, which is the base class for most objects in the viewer.
*
@@ -340,8 +340,8 @@ public:
virtual void setScale(const LLVector3 &scale, BOOL damped = FALSE);
- virtual F32 getStreamingCost(S32* bytes = NULL, S32* visible_bytes = NULL);
- virtual U32 getTriangleCount();
+ virtual F32 getStreamingCost(S32* bytes = NULL, S32* visible_bytes = NULL, F32* unscaled_value = NULL) const;
+ virtual U32 getTriangleCount(S32* vcount = NULL) const;
virtual U32 getHighLODTriangleCount();
void setObjectCost(F32 cost);
@@ -811,7 +811,7 @@ public:
virtual F32 getPartSize(S32 idx);
virtual void getGeometry(S32 idx,
- LLStrider<LLVector3>& verticesp,
+ LLStrider<LLVector4a>& verticesp,
LLStrider<LLVector3>& normalsp,
LLStrider<LLVector2>& texcoordsp,
LLStrider<LLColor4U>& colorsp,
diff --git a/indra/newview/llviewerparcelmgr.cpp b/indra/newview/llviewerparcelmgr.cpp
index 8db72da1ee..9db784101d 100644
--- a/indra/newview/llviewerparcelmgr.cpp
+++ b/indra/newview/llviewerparcelmgr.cpp
@@ -67,6 +67,7 @@
#include "llworld.h"
#include "roles_constants.h"
#include "llweb.h"
+#include "llvieweraudio.h"
const F32 PARCEL_COLLISION_DRAW_SECS = 1.f;
@@ -113,7 +114,7 @@ LLViewerParcelMgr::LLViewerParcelMgr()
mRequestResult(0),
mWestSouth(),
mEastNorth(),
- mSelectedDwell(0.f),
+ mSelectedDwell(DWELL_NAN),
mAgentParcelSequenceID(-1),
mHoverRequestResult(0),
mHoverWestSouth(),
@@ -233,7 +234,7 @@ void LLViewerParcelMgr::getDisplayInfo(S32* area_out, S32* claim_out,
S32 price = 0;
S32 rent = 0;
BOOL for_sale = FALSE;
- F32 dwell = 0.f;
+ F32 dwell = DWELL_NAN;
if (mSelected)
{
@@ -579,7 +580,7 @@ void LLViewerParcelMgr::deselectLand()
mCurrentParcel->mBanList.clear();
//mCurrentParcel->mRenterList.reset();
- mSelectedDwell = 0.f;
+ mSelectedDwell = DWELL_NAN;
// invalidate parcel selection so that existing users of this selection can clean up
mCurrentParcelSelection->setParcel(NULL);
@@ -1457,6 +1458,8 @@ void LLViewerParcelMgr::processParcelProperties(LLMessageSystem *msg, void **use
S32 other_clean_time = 0;
+ LLViewerParcelMgr& parcel_mgr = LLViewerParcelMgr::instance();
+
msg->getS32Fast(_PREHASH_ParcelData, _PREHASH_RequestResult, request_result );
msg->getS32Fast(_PREHASH_ParcelData, _PREHASH_SequenceID, sequence_id );
@@ -1472,31 +1475,31 @@ void LLViewerParcelMgr::processParcelProperties(LLMessageSystem *msg, void **use
if (sequence_id == SELECTED_PARCEL_SEQ_ID)
{
// ...selected parcels report this sequence id
- LLViewerParcelMgr::getInstance()->mRequestResult = PARCEL_RESULT_SUCCESS;
- parcel = LLViewerParcelMgr::getInstance()->mCurrentParcel;
+ parcel_mgr.mRequestResult = PARCEL_RESULT_SUCCESS;
+ parcel = parcel_mgr.mCurrentParcel;
}
else if (sequence_id == HOVERED_PARCEL_SEQ_ID)
{
- LLViewerParcelMgr::getInstance()->mHoverRequestResult = PARCEL_RESULT_SUCCESS;
- parcel = LLViewerParcelMgr::getInstance()->mHoverParcel;
+ parcel_mgr.mHoverRequestResult = PARCEL_RESULT_SUCCESS;
+ parcel = parcel_mgr.mHoverParcel;
}
else if (sequence_id == COLLISION_NOT_IN_GROUP_PARCEL_SEQ_ID ||
sequence_id == COLLISION_NOT_ON_LIST_PARCEL_SEQ_ID ||
sequence_id == COLLISION_BANNED_PARCEL_SEQ_ID)
{
- LLViewerParcelMgr::getInstance()->mHoverRequestResult = PARCEL_RESULT_SUCCESS;
- parcel = LLViewerParcelMgr::getInstance()->mCollisionParcel;
+ parcel_mgr.mHoverRequestResult = PARCEL_RESULT_SUCCESS;
+ parcel = parcel_mgr.mCollisionParcel;
}
- else if (sequence_id == 0 || sequence_id > LLViewerParcelMgr::getInstance()->mAgentParcelSequenceID)
+ else if (sequence_id == 0 || sequence_id > parcel_mgr.mAgentParcelSequenceID)
{
// new agent parcel
- LLViewerParcelMgr::getInstance()->mAgentParcelSequenceID = sequence_id;
- parcel = LLViewerParcelMgr::getInstance()->mAgentParcel;
+ parcel_mgr.mAgentParcelSequenceID = sequence_id;
+ parcel = parcel_mgr.mAgentParcel;
}
else
{
llinfos << "out of order agent parcel sequence id " << sequence_id
- << " last good " << LLViewerParcelMgr::getInstance()->mAgentParcelSequenceID
+ << " last good " << parcel_mgr.mAgentParcelSequenceID
<< llendl;
return;
}
@@ -1567,15 +1570,15 @@ void LLViewerParcelMgr::processParcelProperties(LLMessageSystem *msg, void **use
parcel->setRegionDenyAgeUnverifiedOverride(region_deny_age_unverified_override);
parcel->unpackMessage(msg);
- if (parcel == LLViewerParcelMgr::getInstance()->mAgentParcel)
+ if (parcel == parcel_mgr.mAgentParcel)
{
- S32 bitmap_size = LLViewerParcelMgr::getInstance()->mParcelsPerEdge
- * LLViewerParcelMgr::getInstance()->mParcelsPerEdge
+ S32 bitmap_size = parcel_mgr.mParcelsPerEdge
+ * parcel_mgr.mParcelsPerEdge
/ 8;
U8* bitmap = new U8[ bitmap_size ];
msg->getBinaryDataFast(_PREHASH_ParcelData, _PREHASH_Bitmap, bitmap, bitmap_size);
- LLViewerParcelMgr::getInstance()->writeAgentParcelFromBitmap(bitmap);
+ parcel_mgr.writeAgentParcelFromBitmap(bitmap);
delete[] bitmap;
// Let interesting parties know about agent parcel change.
@@ -1595,11 +1598,11 @@ void LLViewerParcelMgr::processParcelProperties(LLMessageSystem *msg, void **use
if (sequence_id == SELECTED_PARCEL_SEQ_ID)
{
// Update selected counts
- LLViewerParcelMgr::getInstance()->mCurrentParcelSelection->mSelectedSelfCount = self_count;
- LLViewerParcelMgr::getInstance()->mCurrentParcelSelection->mSelectedOtherCount = other_count;
- LLViewerParcelMgr::getInstance()->mCurrentParcelSelection->mSelectedPublicCount = public_count;
+ parcel_mgr.mCurrentParcelSelection->mSelectedSelfCount = self_count;
+ parcel_mgr.mCurrentParcelSelection->mSelectedOtherCount = other_count;
+ parcel_mgr.mCurrentParcelSelection->mSelectedPublicCount = public_count;
- LLViewerParcelMgr::getInstance()->mCurrentParcelSelection->mSelectedMultipleOwners =
+ parcel_mgr.mCurrentParcelSelection->mSelectedMultipleOwners =
(request_result == PARCEL_RESULT_MULTIPLE);
// Select the whole parcel
@@ -1610,67 +1613,67 @@ void LLViewerParcelMgr::processParcelProperties(LLMessageSystem *msg, void **use
{
// don't muck with the westsouth and eastnorth.
// just highlight it
- LLVector3 west_south = region->getPosRegionFromGlobal(LLViewerParcelMgr::getInstance()->mWestSouth);
- LLVector3 east_north = region->getPosRegionFromGlobal(LLViewerParcelMgr::getInstance()->mEastNorth);
+ LLVector3 west_south = region->getPosRegionFromGlobal(parcel_mgr.mWestSouth);
+ LLVector3 east_north = region->getPosRegionFromGlobal(parcel_mgr.mEastNorth);
- LLViewerParcelMgr::getInstance()->resetSegments(LLViewerParcelMgr::getInstance()->mHighlightSegments);
- LLViewerParcelMgr::getInstance()->writeHighlightSegments(
+ parcel_mgr.resetSegments(parcel_mgr.mHighlightSegments);
+ parcel_mgr.writeHighlightSegments(
west_south.mV[VX],
west_south.mV[VY],
east_north.mV[VX],
east_north.mV[VY] );
- LLViewerParcelMgr::getInstance()->mCurrentParcelSelection->mWholeParcelSelected = FALSE;
+ parcel_mgr.mCurrentParcelSelection->mWholeParcelSelected = FALSE;
}
else if (0 == local_id)
{
// this is public land, just highlight the selection
- LLViewerParcelMgr::getInstance()->mWestSouth = region->getPosGlobalFromRegion( aabb_min );
- LLViewerParcelMgr::getInstance()->mEastNorth = region->getPosGlobalFromRegion( aabb_max );
+ parcel_mgr.mWestSouth = region->getPosGlobalFromRegion( aabb_min );
+ parcel_mgr.mEastNorth = region->getPosGlobalFromRegion( aabb_max );
- LLViewerParcelMgr::getInstance()->resetSegments(LLViewerParcelMgr::getInstance()->mHighlightSegments);
- LLViewerParcelMgr::getInstance()->writeHighlightSegments(
+ parcel_mgr.resetSegments(parcel_mgr.mHighlightSegments);
+ parcel_mgr.writeHighlightSegments(
aabb_min.mV[VX],
aabb_min.mV[VY],
aabb_max.mV[VX],
aabb_max.mV[VY] );
- LLViewerParcelMgr::getInstance()->mCurrentParcelSelection->mWholeParcelSelected = TRUE;
+ parcel_mgr.mCurrentParcelSelection->mWholeParcelSelected = TRUE;
}
else
{
- LLViewerParcelMgr::getInstance()->mWestSouth = region->getPosGlobalFromRegion( aabb_min );
- LLViewerParcelMgr::getInstance()->mEastNorth = region->getPosGlobalFromRegion( aabb_max );
+ parcel_mgr.mWestSouth = region->getPosGlobalFromRegion( aabb_min );
+ parcel_mgr.mEastNorth = region->getPosGlobalFromRegion( aabb_max );
// Owned land, highlight the boundaries
- S32 bitmap_size = LLViewerParcelMgr::getInstance()->mParcelsPerEdge
- * LLViewerParcelMgr::getInstance()->mParcelsPerEdge
+ S32 bitmap_size = parcel_mgr.mParcelsPerEdge
+ * parcel_mgr.mParcelsPerEdge
/ 8;
U8* bitmap = new U8[ bitmap_size ];
msg->getBinaryDataFast(_PREHASH_ParcelData, _PREHASH_Bitmap, bitmap, bitmap_size);
- LLViewerParcelMgr::getInstance()->resetSegments(LLViewerParcelMgr::getInstance()->mHighlightSegments);
- LLViewerParcelMgr::getInstance()->writeSegmentsFromBitmap( bitmap, LLViewerParcelMgr::getInstance()->mHighlightSegments );
+ parcel_mgr.resetSegments(parcel_mgr.mHighlightSegments);
+ parcel_mgr.writeSegmentsFromBitmap( bitmap, parcel_mgr.mHighlightSegments );
delete[] bitmap;
bitmap = NULL;
- LLViewerParcelMgr::getInstance()->mCurrentParcelSelection->mWholeParcelSelected = TRUE;
+ parcel_mgr.mCurrentParcelSelection->mWholeParcelSelected = TRUE;
}
// Request access list information for this land
- LLViewerParcelMgr::getInstance()->sendParcelAccessListRequest(AL_ACCESS | AL_BAN);
+ parcel_mgr.sendParcelAccessListRequest(AL_ACCESS | AL_BAN);
// Request the media url filter list for this land
- LLViewerParcelMgr::getInstance()->requestParcelMediaURLFilter();
+ parcel_mgr.requestParcelMediaURLFilter();
// Request dwell for this land, if it's not public land.
- LLViewerParcelMgr::getInstance()->mSelectedDwell = 0.f;
+ parcel_mgr.mSelectedDwell = DWELL_NAN;
if (0 != local_id)
{
- LLViewerParcelMgr::getInstance()->sendParcelDwellRequest();
+ parcel_mgr.sendParcelDwellRequest();
}
- LLViewerParcelMgr::getInstance()->mSelected = TRUE;
- LLViewerParcelMgr::getInstance()->notifyObservers();
+ parcel_mgr.mSelected = TRUE;
+ parcel_mgr.notifyObservers();
}
}
else if (sequence_id == COLLISION_NOT_IN_GROUP_PARCEL_SEQ_ID ||
@@ -1678,32 +1681,32 @@ void LLViewerParcelMgr::processParcelProperties(LLMessageSystem *msg, void **use
sequence_id == COLLISION_BANNED_PARCEL_SEQ_ID)
{
// We're about to collide with this parcel
- LLViewerParcelMgr::getInstance()->mRenderCollision = TRUE;
- LLViewerParcelMgr::getInstance()->mCollisionTimer.reset();
+ parcel_mgr.mRenderCollision = TRUE;
+ parcel_mgr.mCollisionTimer.reset();
// Differentiate this parcel if we are banned from it.
if (sequence_id == COLLISION_BANNED_PARCEL_SEQ_ID)
{
- LLViewerParcelMgr::getInstance()->mCollisionBanned = BA_BANNED;
+ parcel_mgr.mCollisionBanned = BA_BANNED;
}
else if (sequence_id == COLLISION_NOT_IN_GROUP_PARCEL_SEQ_ID)
{
- LLViewerParcelMgr::getInstance()->mCollisionBanned = BA_NOT_IN_GROUP;
+ parcel_mgr.mCollisionBanned = BA_NOT_IN_GROUP;
}
else
{
- LLViewerParcelMgr::getInstance()->mCollisionBanned = BA_NOT_ON_LIST;
+ parcel_mgr.mCollisionBanned = BA_NOT_ON_LIST;
}
- S32 bitmap_size = LLViewerParcelMgr::getInstance()->mParcelsPerEdge
- * LLViewerParcelMgr::getInstance()->mParcelsPerEdge
+ S32 bitmap_size = parcel_mgr.mParcelsPerEdge
+ * parcel_mgr.mParcelsPerEdge
/ 8;
U8* bitmap = new U8[ bitmap_size ];
msg->getBinaryDataFast(_PREHASH_ParcelData, _PREHASH_Bitmap, bitmap, bitmap_size);
- LLViewerParcelMgr::getInstance()->resetSegments(LLViewerParcelMgr::getInstance()->mCollisionSegments);
- LLViewerParcelMgr::getInstance()->writeSegmentsFromBitmap( bitmap, LLViewerParcelMgr::getInstance()->mCollisionSegments );
+ parcel_mgr.resetSegments(parcel_mgr.mCollisionSegments);
+ parcel_mgr.writeSegmentsFromBitmap( bitmap, parcel_mgr.mCollisionSegments );
delete[] bitmap;
bitmap = NULL;
@@ -1714,18 +1717,21 @@ void LLViewerParcelMgr::processParcelProperties(LLMessageSystem *msg, void **use
LLViewerRegion *region = LLWorld::getInstance()->getRegion( msg->getSender() );
if (region)
{
- LLViewerParcelMgr::getInstance()->mHoverWestSouth = region->getPosGlobalFromRegion( aabb_min );
- LLViewerParcelMgr::getInstance()->mHoverEastNorth = region->getPosGlobalFromRegion( aabb_max );
+ parcel_mgr.mHoverWestSouth = region->getPosGlobalFromRegion( aabb_min );
+ parcel_mgr.mHoverEastNorth = region->getPosGlobalFromRegion( aabb_max );
}
else
{
- LLViewerParcelMgr::getInstance()->mHoverWestSouth.clearVec();
- LLViewerParcelMgr::getInstance()->mHoverEastNorth.clearVec();
+ parcel_mgr.mHoverWestSouth.clearVec();
+ parcel_mgr.mHoverEastNorth.clearVec();
}
}
else
{
- // look for music.
+ // Check for video
+ LLViewerParcelMedia::update(parcel);
+
+ // Then check for music
if (gAudiop)
{
if (parcel)
@@ -1736,46 +1742,34 @@ void LLViewerParcelMgr::processParcelProperties(LLMessageSystem *msg, void **use
std::string music_url = music_url_raw;
LLStringUtil::trim(music_url);
- // On entering a new parcel, stop the last stream if the
- // new parcel has a different music url. (Empty URL counts
- // as different.)
- const std::string& stream_url = gAudiop->getInternetStreamURL();
-
- if (music_url.empty() || music_url != stream_url)
+ // If there is a new music URL and it's valid, play it.
+ if (music_url.size() > 12)
{
- // URL is different from one currently playing.
- gAudiop->stopInternetStream();
-
- // If there is a new music URL and it's valid, play it.
- if (music_url.size() > 12)
+ if (music_url.substr(0,7) == "http://")
{
- if (music_url.substr(0,7) == "http://")
- {
- optionally_start_music(music_url);
- }
- else
- {
- llinfos << "Stopping parcel music (invalid audio stream URL)" << llendl;
- // clears the URL
- gAudiop->startInternetStream(LLStringUtil::null);
- }
+ optionally_start_music(music_url);
}
- else if (!gAudiop->getInternetStreamURL().empty())
+ else
{
- llinfos << "Stopping parcel music (parcel stream URL is empty)" << llendl;
- gAudiop->startInternetStream(LLStringUtil::null);
+ llinfos << "Stopping parcel music (invalid audio stream URL)" << llendl;
+ // clears the URL
+ // null value causes fade out
+ LLViewerAudio::getInstance()->startInternetStreamWithAutoFade(LLStringUtil::null);
}
}
+ else if (!gAudiop->getInternetStreamURL().empty())
+ {
+ llinfos << "Stopping parcel music (parcel stream URL is empty)" << llendl;
+ // null value causes fade out
+ LLViewerAudio::getInstance()->startInternetStreamWithAutoFade(LLStringUtil::null);
+ }
}
else
{
// Public land has no music
- gAudiop->stopInternetStream();
+ LLViewerAudio::getInstance()->stopInternetStreamWithAutoFade();
}
}//if gAudiop
-
- // now check for video
- LLViewerParcelMedia::update( parcel );
};
}
@@ -1794,7 +1788,11 @@ void optionally_start_music(const std::string& music_url)
gSavedSettings.getBOOL("MediaTentativeAutoPlay")))
{
llinfos << "Starting parcel music " << music_url << llendl;
- gAudiop->startInternetStream(music_url);
+ LLViewerAudio::getInstance()->startInternetStreamWithAutoFade(music_url);
+ }
+ else
+ {
+ LLViewerAudio::getInstance()->startInternetStreamWithAutoFade(LLStringUtil::null);
}
}
}
diff --git a/indra/newview/llviewerparcelmgr.h b/indra/newview/llviewerparcelmgr.h
index 68d8978ea8..cac8d8391c 100644
--- a/indra/newview/llviewerparcelmgr.h
+++ b/indra/newview/llviewerparcelmgr.h
@@ -43,6 +43,8 @@ class LLParcel;
class LLViewerTexture;
class LLViewerRegion;
+const F32 DWELL_NAN = -1.0f; // A dwell having this value will be displayed as Loading...
+
// Constants for sendLandOwner
//const U32 NO_NEIGHBOR_JOIN = 0x0;
//const U32 ALL_NEIGHBOR_JOIN = U32( NORTH_MASK
diff --git a/indra/newview/llviewerparceloverlay.cpp b/indra/newview/llviewerparceloverlay.cpp
index e619b89f9b..a0cf2fc803 100644
--- a/indra/newview/llviewerparceloverlay.cpp
+++ b/indra/newview/llviewerparceloverlay.cpp
@@ -884,14 +884,14 @@ S32 LLViewerParcelOverlay::renderPropertyLines ()
// Always fudge a little vertically.
pull_toward_camera.mV[VZ] += 0.01f;
- glMatrixMode( GL_MODELVIEW );
- glPushMatrix();
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
+ gGL.pushMatrix();
// Move to appropriate region coords
LLVector3 origin = mRegion->getOriginAgent();
- glTranslatef( origin.mV[VX], origin.mV[VY], origin.mV[VZ] );
+ gGL.translatef( origin.mV[VX], origin.mV[VY], origin.mV[VZ] );
- glTranslatef(pull_toward_camera.mV[VX], pull_toward_camera.mV[VY],
+ gGL.translatef(pull_toward_camera.mV[VX], pull_toward_camera.mV[VY],
pull_toward_camera.mV[VZ]);
// Include +1 because vertices are fenceposts.
@@ -990,7 +990,7 @@ S32 LLViewerParcelOverlay::renderPropertyLines ()
}
- glPopMatrix();
+ gGL.popMatrix();
return drawn;
}
diff --git a/indra/newview/llviewerprecompiledheaders.h b/indra/newview/llviewerprecompiledheaders.h
index 12f6a0dd1c..6c8a827ba3 100644
--- a/indra/newview/llviewerprecompiledheaders.h
+++ b/indra/newview/llviewerprecompiledheaders.h
@@ -57,6 +57,8 @@
#include "lldeleteutils.h"
#include "imageids.h"
#include "indra_constants.h"
+#include "llinitparam.h"
+
//#include "linden_common.h"
//#include "llpreprocessor.h"
#include "llallocator.h"
@@ -124,4 +126,5 @@
// Library includes from llmessage project
#include "llcachename.h"
+
#endif
diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp
index ed943964f9..e3cb985ddb 100644
--- a/indra/newview/llviewerregion.cpp
+++ b/indra/newview/llviewerregion.cpp
@@ -1493,6 +1493,7 @@ void LLViewerRegionImpl::buildCapabilityNames(LLSD& capabilityNames)
capabilityNames.append("AvatarPickerSearch");
capabilityNames.append("ChatSessionRequest");
capabilityNames.append("CopyInventoryFromNotecard");
+ capabilityNames.append("CreateInventoryCategory");
capabilityNames.append("DispatchRegionInfo");
capabilityNames.append("EstateChangeInfo");
capabilityNames.append("EventQueueGet");
diff --git a/indra/newview/llviewershadermgr.cpp b/indra/newview/llviewershadermgr.cpp
index 36106752a2..5de363e03c 100644
--- a/indra/newview/llviewershadermgr.cpp
+++ b/indra/newview/llviewershadermgr.cpp
@@ -32,6 +32,7 @@
#include "llfile.h"
#include "llviewerwindow.h"
+#include "llwindow.h"
#include "llviewercontrol.h"
#include "pipeline.h"
#include "llworld.h"
@@ -58,6 +59,7 @@ using std::make_pair;
using std::string;
BOOL LLViewerShaderMgr::sInitialized = FALSE;
+bool LLViewerShaderMgr::sSkipReload = false;
LLVector4 gShinyOrigin;
@@ -65,15 +67,23 @@ LLVector4 gShinyOrigin;
LLGLSLShader gOcclusionProgram;
LLGLSLShader gCustomAlphaProgram;
LLGLSLShader gGlowCombineProgram;
+LLGLSLShader gSplatTextureRectProgram;
+LLGLSLShader gGlowCombineFXAAProgram;
LLGLSLShader gTwoTextureAddProgram;
+LLGLSLShader gOneTextureNoColorProgram;
+LLGLSLShader gDebugProgram;
+LLGLSLShader gAlphaMaskProgram;
//object shaders
LLGLSLShader gObjectSimpleProgram;
+LLGLSLShader gObjectPreviewProgram;
LLGLSLShader gObjectSimpleWaterProgram;
LLGLSLShader gObjectSimpleAlphaMaskProgram;
LLGLSLShader gObjectSimpleWaterAlphaMaskProgram;
LLGLSLShader gObjectFullbrightProgram;
LLGLSLShader gObjectFullbrightWaterProgram;
+LLGLSLShader gObjectEmissiveProgram;
+LLGLSLShader gObjectEmissiveWaterProgram;
LLGLSLShader gObjectFullbrightAlphaMaskProgram;
LLGLSLShader gObjectFullbrightWaterAlphaMaskProgram;
LLGLSLShader gObjectFullbrightShinyProgram;
@@ -81,13 +91,23 @@ LLGLSLShader gObjectFullbrightShinyWaterProgram;
LLGLSLShader gObjectShinyProgram;
LLGLSLShader gObjectShinyWaterProgram;
LLGLSLShader gObjectBumpProgram;
+LLGLSLShader gTreeProgram;
+LLGLSLShader gTreeWaterProgram;
+LLGLSLShader gObjectFullbrightNoColorProgram;
+LLGLSLShader gObjectFullbrightNoColorWaterProgram;
LLGLSLShader gObjectSimpleNonIndexedProgram;
+LLGLSLShader gObjectSimpleNonIndexedTexGenProgram;
+LLGLSLShader gObjectSimpleNonIndexedTexGenWaterProgram;
LLGLSLShader gObjectSimpleNonIndexedWaterProgram;
LLGLSLShader gObjectAlphaMaskNonIndexedProgram;
LLGLSLShader gObjectAlphaMaskNonIndexedWaterProgram;
+LLGLSLShader gObjectAlphaMaskNoColorProgram;
+LLGLSLShader gObjectAlphaMaskNoColorWaterProgram;
LLGLSLShader gObjectFullbrightNonIndexedProgram;
LLGLSLShader gObjectFullbrightNonIndexedWaterProgram;
+LLGLSLShader gObjectEmissiveNonIndexedProgram;
+LLGLSLShader gObjectEmissiveNonIndexedWaterProgram;
LLGLSLShader gObjectFullbrightShinyNonIndexedProgram;
LLGLSLShader gObjectFullbrightShinyNonIndexedWaterProgram;
LLGLSLShader gObjectShinyNonIndexedProgram;
@@ -96,11 +116,13 @@ LLGLSLShader gObjectShinyNonIndexedWaterProgram;
//object hardware skinning shaders
LLGLSLShader gSkinnedObjectSimpleProgram;
LLGLSLShader gSkinnedObjectFullbrightProgram;
+LLGLSLShader gSkinnedObjectEmissiveProgram;
LLGLSLShader gSkinnedObjectFullbrightShinyProgram;
LLGLSLShader gSkinnedObjectShinySimpleProgram;
LLGLSLShader gSkinnedObjectSimpleWaterProgram;
LLGLSLShader gSkinnedObjectFullbrightWaterProgram;
+LLGLSLShader gSkinnedObjectEmissiveWaterProgram;
LLGLSLShader gSkinnedObjectFullbrightShinyWaterProgram;
LLGLSLShader gSkinnedObjectShinySimpleWaterProgram;
@@ -124,6 +146,7 @@ LLGLSLShader gImpostorProgram;
LLGLSLShader gWLSkyProgram;
LLGLSLShader gWLCloudProgram;
+
// Effects Shaders
LLGLSLShader gGlowProgram;
LLGLSLShader gGlowExtractProgram;
@@ -132,18 +155,19 @@ LLGLSLShader gPostNightVisionProgram;
// Deferred rendering shaders
LLGLSLShader gDeferredImpostorProgram;
-LLGLSLShader gDeferredEdgeProgram;
LLGLSLShader gDeferredWaterProgram;
LLGLSLShader gDeferredDiffuseProgram;
LLGLSLShader gDeferredDiffuseAlphaMaskProgram;
LLGLSLShader gDeferredNonIndexedDiffuseProgram;
LLGLSLShader gDeferredNonIndexedDiffuseAlphaMaskProgram;
+LLGLSLShader gDeferredNonIndexedDiffuseAlphaMaskNoColorProgram;
LLGLSLShader gDeferredSkinnedDiffuseProgram;
LLGLSLShader gDeferredSkinnedBumpProgram;
LLGLSLShader gDeferredSkinnedAlphaProgram;
LLGLSLShader gDeferredBumpProgram;
LLGLSLShader gDeferredTerrainProgram;
LLGLSLShader gDeferredTreeProgram;
+LLGLSLShader gDeferredTreeShadowProgram;
LLGLSLShader gDeferredAvatarProgram;
LLGLSLShader gDeferredAvatarAlphaProgram;
LLGLSLShader gDeferredLightProgram;
@@ -160,25 +184,23 @@ LLGLSLShader gDeferredAttachmentShadowProgram;
LLGLSLShader gDeferredAlphaProgram;
LLGLSLShader gDeferredAvatarEyesProgram;
LLGLSLShader gDeferredFullbrightProgram;
-LLGLSLShader gDeferredGIProgram;
-LLGLSLShader gDeferredGIFinalProgram;
-LLGLSLShader gDeferredPostGIProgram;
+LLGLSLShader gDeferredEmissiveProgram;
LLGLSLShader gDeferredPostProgram;
+LLGLSLShader gDeferredCoFProgram;
+LLGLSLShader gDeferredDoFCombineProgram;
+LLGLSLShader gFXAAProgram;
LLGLSLShader gDeferredPostNoDoFProgram;
LLGLSLShader gDeferredWLSkyProgram;
LLGLSLShader gDeferredWLCloudProgram;
LLGLSLShader gDeferredStarProgram;
-LLGLSLShader gLuminanceGatherProgram;
-
-
-//current avatar shader parameter pointer
-GLint gAvatarMatrixParam;
+LLGLSLShader gNormalMapGenProgram;
LLViewerShaderMgr::LLViewerShaderMgr() :
mVertexShaderLevel(SHADER_COUNT, 0),
mMaxAvatarShaderLevel(0)
{
/// Make sure WL Sky is the first program
+ //ONLY shaders that need WL Param management should be added here
mShaderList.push_back(&gWLSkyProgram);
mShaderList.push_back(&gWLCloudProgram);
mShaderList.push_back(&gAvatarProgram);
@@ -187,33 +209,42 @@ LLViewerShaderMgr::LLViewerShaderMgr() :
mShaderList.push_back(&gWaterProgram);
mShaderList.push_back(&gAvatarEyeballProgram);
mShaderList.push_back(&gObjectSimpleProgram);
+ mShaderList.push_back(&gObjectPreviewProgram);
mShaderList.push_back(&gImpostorProgram);
+ mShaderList.push_back(&gObjectFullbrightNoColorProgram);
+ mShaderList.push_back(&gObjectFullbrightNoColorWaterProgram);
mShaderList.push_back(&gObjectSimpleAlphaMaskProgram);
mShaderList.push_back(&gObjectBumpProgram);
- mShaderList.push_back(&gUIProgram);
- mShaderList.push_back(&gCustomAlphaProgram);
- mShaderList.push_back(&gGlowCombineProgram);
- mShaderList.push_back(&gTwoTextureAddProgram);
- mShaderList.push_back(&gSolidColorProgram);
- mShaderList.push_back(&gOcclusionProgram);
+ mShaderList.push_back(&gObjectEmissiveProgram);
+ mShaderList.push_back(&gObjectEmissiveWaterProgram);
mShaderList.push_back(&gObjectFullbrightProgram);
mShaderList.push_back(&gObjectFullbrightAlphaMaskProgram);
mShaderList.push_back(&gObjectFullbrightShinyProgram);
mShaderList.push_back(&gObjectFullbrightShinyWaterProgram);
mShaderList.push_back(&gObjectSimpleNonIndexedProgram);
+ mShaderList.push_back(&gObjectSimpleNonIndexedTexGenProgram);
+ mShaderList.push_back(&gObjectSimpleNonIndexedTexGenWaterProgram);
mShaderList.push_back(&gObjectSimpleNonIndexedWaterProgram);
mShaderList.push_back(&gObjectAlphaMaskNonIndexedProgram);
mShaderList.push_back(&gObjectAlphaMaskNonIndexedWaterProgram);
+ mShaderList.push_back(&gObjectAlphaMaskNoColorProgram);
+ mShaderList.push_back(&gObjectAlphaMaskNoColorWaterProgram);
+ mShaderList.push_back(&gTreeProgram);
+ mShaderList.push_back(&gTreeWaterProgram);
mShaderList.push_back(&gObjectFullbrightNonIndexedProgram);
mShaderList.push_back(&gObjectFullbrightNonIndexedWaterProgram);
+ mShaderList.push_back(&gObjectEmissiveNonIndexedProgram);
+ mShaderList.push_back(&gObjectEmissiveNonIndexedWaterProgram);
mShaderList.push_back(&gObjectFullbrightShinyNonIndexedProgram);
mShaderList.push_back(&gObjectFullbrightShinyNonIndexedWaterProgram);
mShaderList.push_back(&gSkinnedObjectSimpleProgram);
mShaderList.push_back(&gSkinnedObjectFullbrightProgram);
+ mShaderList.push_back(&gSkinnedObjectEmissiveProgram);
mShaderList.push_back(&gSkinnedObjectFullbrightShinyProgram);
mShaderList.push_back(&gSkinnedObjectShinySimpleProgram);
mShaderList.push_back(&gSkinnedObjectSimpleWaterProgram);
mShaderList.push_back(&gSkinnedObjectFullbrightWaterProgram);
+ mShaderList.push_back(&gSkinnedObjectEmissiveWaterProgram);
mShaderList.push_back(&gSkinnedObjectFullbrightShinyWaterProgram);
mShaderList.push_back(&gSkinnedObjectShinySimpleWaterProgram);
mShaderList.push_back(&gTerrainProgram);
@@ -227,24 +258,16 @@ LLViewerShaderMgr::LLViewerShaderMgr() :
mShaderList.push_back(&gObjectShinyNonIndexedWaterProgram);
mShaderList.push_back(&gUnderWaterProgram);
mShaderList.push_back(&gDeferredSunProgram);
- mShaderList.push_back(&gDeferredBlurLightProgram);
mShaderList.push_back(&gDeferredSoftenProgram);
- mShaderList.push_back(&gDeferredLightProgram);
- mShaderList.push_back(&gDeferredMultiLightProgram);
mShaderList.push_back(&gDeferredAlphaProgram);
mShaderList.push_back(&gDeferredSkinnedAlphaProgram);
mShaderList.push_back(&gDeferredFullbrightProgram);
+ mShaderList.push_back(&gDeferredEmissiveProgram);
mShaderList.push_back(&gDeferredAvatarEyesProgram);
- mShaderList.push_back(&gDeferredPostGIProgram);
- mShaderList.push_back(&gDeferredEdgeProgram);
- mShaderList.push_back(&gDeferredPostProgram);
- mShaderList.push_back(&gDeferredGIProgram);
- mShaderList.push_back(&gDeferredGIFinalProgram);
mShaderList.push_back(&gDeferredWaterProgram);
mShaderList.push_back(&gDeferredAvatarAlphaProgram);
mShaderList.push_back(&gDeferredWLSkyProgram);
mShaderList.push_back(&gDeferredWLCloudProgram);
- mShaderList.push_back(&gDeferredStarProgram);
}
LLViewerShaderMgr::~LLViewerShaderMgr()
@@ -268,80 +291,13 @@ void LLViewerShaderMgr::initAttribsAndUniforms(void)
{
if (mReservedAttribs.empty())
{
- mReservedAttribs.push_back("materialColor");
- mReservedAttribs.push_back("specularColor");
- mReservedAttribs.push_back("binormal");
- mReservedAttribs.push_back("object_weight");
-
- mAvatarAttribs.reserve(5);
- mAvatarAttribs.push_back("weight");
- mAvatarAttribs.push_back("clothing");
- mAvatarAttribs.push_back("gWindDir");
- mAvatarAttribs.push_back("gSinWaveParams");
- mAvatarAttribs.push_back("gGravity");
+ LLShaderMgr::initAttribsAndUniforms();
mAvatarUniforms.push_back("matrixPalette");
+ mAvatarUniforms.push_back("gWindDir");
+ mAvatarUniforms.push_back("gSinWaveParams");
+ mAvatarUniforms.push_back("gGravity");
- mReservedUniforms.reserve(24);
- mReservedUniforms.push_back("diffuseMap");
- mReservedUniforms.push_back("specularMap");
- mReservedUniforms.push_back("bumpMap");
- mReservedUniforms.push_back("environmentMap");
- mReservedUniforms.push_back("cloude_noise_texture");
- mReservedUniforms.push_back("fullbright");
- mReservedUniforms.push_back("lightnorm");
- mReservedUniforms.push_back("sunlight_color");
- mReservedUniforms.push_back("ambient");
- mReservedUniforms.push_back("blue_horizon");
- mReservedUniforms.push_back("blue_density");
- mReservedUniforms.push_back("haze_horizon");
- mReservedUniforms.push_back("haze_density");
- mReservedUniforms.push_back("cloud_shadow");
- mReservedUniforms.push_back("density_multiplier");
- mReservedUniforms.push_back("distance_multiplier");
- mReservedUniforms.push_back("max_y");
- mReservedUniforms.push_back("glow");
- mReservedUniforms.push_back("cloud_color");
- mReservedUniforms.push_back("cloud_pos_density1");
- mReservedUniforms.push_back("cloud_pos_density2");
- mReservedUniforms.push_back("cloud_scale");
- mReservedUniforms.push_back("gamma");
- mReservedUniforms.push_back("scene_light_strength");
-
- mReservedUniforms.push_back("depthMap");
- mReservedUniforms.push_back("shadowMap0");
- mReservedUniforms.push_back("shadowMap1");
- mReservedUniforms.push_back("shadowMap2");
- mReservedUniforms.push_back("shadowMap3");
- mReservedUniforms.push_back("shadowMap4");
- mReservedUniforms.push_back("shadowMap5");
-
- mReservedUniforms.push_back("normalMap");
- mReservedUniforms.push_back("positionMap");
- mReservedUniforms.push_back("diffuseRect");
- mReservedUniforms.push_back("specularRect");
- mReservedUniforms.push_back("noiseMap");
- mReservedUniforms.push_back("lightFunc");
- mReservedUniforms.push_back("lightMap");
- mReservedUniforms.push_back("luminanceMap");
- mReservedUniforms.push_back("giLightMap");
- mReservedUniforms.push_back("giMip");
- mReservedUniforms.push_back("edgeMap");
- mReservedUniforms.push_back("bloomMap");
- mReservedUniforms.push_back("sunLightMap");
- mReservedUniforms.push_back("localLightMap");
- mReservedUniforms.push_back("projectionMap");
- mReservedUniforms.push_back("diffuseGIMap");
- mReservedUniforms.push_back("specularGIMap");
- mReservedUniforms.push_back("normalGIMap");
- mReservedUniforms.push_back("minpGIMap");
- mReservedUniforms.push_back("maxpGIMap");
- mReservedUniforms.push_back("depthGIMap");
- mReservedUniforms.push_back("lastDiffuseGIMap");
- mReservedUniforms.push_back("lastNormalGIMap");
- mReservedUniforms.push_back("lastMinpGIMap");
- mReservedUniforms.push_back("lastMaxpGIMap");
-
mWLUniforms.push_back("camPosLocal");
mTerrainUniforms.reserve(5);
@@ -397,17 +353,29 @@ void LLViewerShaderMgr::setShaders()
//setShaders might be called redundantly by gSavedSettings, so return on reentrance
static bool reentrance = false;
- if (!gPipeline.mInitialized || !sInitialized || reentrance)
+ if (!gPipeline.mInitialized || !sInitialized || reentrance || sSkipReload)
{
return;
}
- //setup preprocessor definitions
- LLShaderMgr::instance()->mDefinitions["samples"] = llformat("%d", gGLManager.getNumFBOFSAASamples(gSavedSettings.getU32("RenderFSAASamples")));
- LLShaderMgr::instance()->mDefinitions["NUM_TEX_UNITS"] = llformat("%d", gGLManager.mNumTextureImageUnits);
+ LLGLSLShader::sIndexedTextureChannels = llmax(llmin(gGLManager.mNumTextureImageUnits, (S32) gSavedSettings.getU32("RenderMaxTextureIndex")), 1);
+
+ //NEVER use more than 16 texture channels (work around for prevalent driver bug)
+ LLGLSLShader::sIndexedTextureChannels = llmin(LLGLSLShader::sIndexedTextureChannels, 16);
reentrance = true;
+ if (LLRender::sGLCoreProfile)
+ {
+ if (!gSavedSettings.getBOOL("VertexShaderEnable"))
+ { //vertex shaders MUST be enabled to use core profile
+ gSavedSettings.setBOOL("VertexShaderEnable", TRUE);
+ }
+ }
+
+ //setup preprocessor definitions
+ LLShaderMgr::instance()->mDefinitions["NUM_TEX_UNITS"] = llformat("%d", gGLManager.mNumTextureImageUnits);
+
// Make sure the compiled shader map is cleared before we recompile shaders.
mShaderObjects.clear();
@@ -446,6 +414,7 @@ void LLViewerShaderMgr::setShaders()
mMaxAvatarShaderLevel = 0;
LLGLSLShader::sNoFixedFunction = false;
+ LLVertexBuffer::unbind();
if (LLFeatureManager::getInstance()->isFeatureAvailable("VertexShaderEnable")
&& gSavedSettings.getBOOL("VertexShaderEnable"))
{
@@ -466,15 +435,8 @@ void LLViewerShaderMgr::setShaders()
gSavedSettings.getBOOL("WindLightUseAtmosShaders"))
{
if (gSavedSettings.getS32("RenderShadowDetail") > 0)
- {
- if (gSavedSettings.getBOOL("RenderDeferredGI"))
- { //shadows + gi
- deferred_class = 3;
- }
- else
- { //shadows
- deferred_class = 2;
- }
+ { //shadows
+ deferred_class = 2;
}
else
{ //no shadows
@@ -497,11 +459,7 @@ void LLViewerShaderMgr::setShaders()
wl_class = 1;
}
- if(!gSavedSettings.getBOOL("EnableRippleWater"))
- {
- water_class = 0;
- }
-
+
// Trigger a full rebuild of the fallback skybox / cubemap if we've toggled windlight shaders
if (mVertexShaderLevel[SHADER_WINDLIGHT] != wl_class && gSky.mVOSkyp.notNull())
{
@@ -633,13 +591,21 @@ void LLViewerShaderMgr::setShaders()
void LLViewerShaderMgr::unloadShaders()
{
gOcclusionProgram.unload();
+ gDebugProgram.unload();
+ gAlphaMaskProgram.unload();
gUIProgram.unload();
gCustomAlphaProgram.unload();
gGlowCombineProgram.unload();
+ gSplatTextureRectProgram.unload();
+ gGlowCombineFXAAProgram.unload();
gTwoTextureAddProgram.unload();
+ gOneTextureNoColorProgram.unload();
gSolidColorProgram.unload();
+ gObjectFullbrightNoColorProgram.unload();
+ gObjectFullbrightNoColorWaterProgram.unload();
gObjectSimpleProgram.unload();
+ gObjectPreviewProgram.unload();
gImpostorProgram.unload();
gObjectSimpleAlphaMaskProgram.unload();
gObjectBumpProgram.unload();
@@ -647,6 +613,8 @@ void LLViewerShaderMgr::unloadShaders()
gObjectSimpleWaterAlphaMaskProgram.unload();
gObjectFullbrightProgram.unload();
gObjectFullbrightWaterProgram.unload();
+ gObjectEmissiveProgram.unload();
+ gObjectEmissiveWaterProgram.unload();
gObjectFullbrightAlphaMaskProgram.unload();
gObjectFullbrightWaterAlphaMaskProgram.unload();
@@ -656,11 +624,19 @@ void LLViewerShaderMgr::unloadShaders()
gObjectShinyWaterProgram.unload();
gObjectSimpleNonIndexedProgram.unload();
+ gObjectSimpleNonIndexedTexGenProgram.unload();
+ gObjectSimpleNonIndexedTexGenWaterProgram.unload();
gObjectSimpleNonIndexedWaterProgram.unload();
gObjectAlphaMaskNonIndexedProgram.unload();
gObjectAlphaMaskNonIndexedWaterProgram.unload();
+ gObjectAlphaMaskNoColorProgram.unload();
+ gObjectAlphaMaskNoColorWaterProgram.unload();
gObjectFullbrightNonIndexedProgram.unload();
gObjectFullbrightNonIndexedWaterProgram.unload();
+ gObjectEmissiveNonIndexedProgram.unload();
+ gObjectEmissiveNonIndexedWaterProgram.unload();
+ gTreeProgram.unload();
+ gTreeWaterProgram.unload();
gObjectShinyNonIndexedProgram.unload();
gObjectFullbrightShinyNonIndexedProgram.unload();
@@ -669,11 +645,13 @@ void LLViewerShaderMgr::unloadShaders()
gSkinnedObjectSimpleProgram.unload();
gSkinnedObjectFullbrightProgram.unload();
+ gSkinnedObjectEmissiveProgram.unload();
gSkinnedObjectFullbrightShinyProgram.unload();
gSkinnedObjectShinySimpleProgram.unload();
gSkinnedObjectSimpleWaterProgram.unload();
gSkinnedObjectFullbrightWaterProgram.unload();
+ gSkinnedObjectEmissiveWaterProgram.unload();
gSkinnedObjectFullbrightShinyWaterProgram.unload();
gSkinnedObjectShinySimpleWaterProgram.unload();
@@ -699,6 +677,7 @@ void LLViewerShaderMgr::unloadShaders()
gDeferredDiffuseProgram.unload();
gDeferredDiffuseAlphaMaskProgram.unload();
gDeferredNonIndexedDiffuseAlphaMaskProgram.unload();
+ gDeferredNonIndexedDiffuseAlphaMaskNoColorProgram.unload();
gDeferredNonIndexedDiffuseProgram.unload();
gDeferredSkinnedDiffuseProgram.unload();
gDeferredSkinnedBumpProgram.unload();
@@ -750,8 +729,8 @@ BOOL LLViewerShaderMgr::loadBasicShaders()
// (in order of shader function call depth for reference purposes, deepest level first)
vector< pair<string, S32> > shaders;
- shaders.reserve(10);
shaders.push_back( make_pair( "windlight/atmosphericsVarsV.glsl", mVertexShaderLevel[SHADER_WINDLIGHT] ) );
+ shaders.push_back( make_pair( "windlight/atmosphericsVarsWaterV.glsl", mVertexShaderLevel[SHADER_WINDLIGHT] ) );
shaders.push_back( make_pair( "windlight/atmosphericsHelpersV.glsl", mVertexShaderLevel[SHADER_WINDLIGHT] ) );
shaders.push_back( make_pair( "lighting/lightFuncV.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) );
shaders.push_back( make_pair( "lighting/sumLightsV.glsl", sum_lights_class ) );
@@ -762,6 +741,8 @@ BOOL LLViewerShaderMgr::loadBasicShaders()
shaders.push_back( make_pair( "windlight/atmosphericsV.glsl", mVertexShaderLevel[SHADER_WINDLIGHT] ) );
shaders.push_back( make_pair( "avatar/avatarSkinV.glsl", 1 ) );
shaders.push_back( make_pair( "avatar/objectSkinV.glsl", 1 ) );
+ shaders.push_back( make_pair( "objects/indexedTextureV.glsl", 1 ) );
+ shaders.push_back( make_pair( "objects/nonindexedTextureV.glsl", 1 ) );
// We no longer have to bind the shaders to global glhandles, they are automatically added to a map now.
for (U32 i = 0; i < shaders.size(); i++)
@@ -777,8 +758,7 @@ BOOL LLViewerShaderMgr::loadBasicShaders()
// (in order of shader function call depth for reference purposes, deepest level first)
shaders.clear();
- shaders.reserve(13);
- S32 ch = gGLManager.mNumTextureImageUnits-1;
+ S32 ch = llmax(LLGLSLShader::sIndexedTextureChannels-1, 1);
if (gGLManager.mGLVersion < 3.1f)
{ //force to 1 texture index channel for old drivers
@@ -787,6 +767,7 @@ BOOL LLViewerShaderMgr::loadBasicShaders()
std::vector<S32> index_channels;
index_channels.push_back(-1); shaders.push_back( make_pair( "windlight/atmosphericsVarsF.glsl", mVertexShaderLevel[SHADER_WINDLIGHT] ) );
+ index_channels.push_back(-1); shaders.push_back( make_pair( "windlight/atmosphericsVarsWaterF.glsl", mVertexShaderLevel[SHADER_WINDLIGHT] ) );
index_channels.push_back(-1); shaders.push_back( make_pair( "windlight/gammaF.glsl", mVertexShaderLevel[SHADER_WINDLIGHT]) );
index_channels.push_back(-1); shaders.push_back( make_pair( "windlight/atmosphericsF.glsl", mVertexShaderLevel[SHADER_WINDLIGHT] ) );
index_channels.push_back(-1); shaders.push_back( make_pair( "windlight/transportF.glsl", mVertexShaderLevel[SHADER_WINDLIGHT] ) );
@@ -844,6 +825,8 @@ BOOL LLViewerShaderMgr::loadShadersEnvironment()
gTerrainProgram.mFeatures.calculatesLighting = true;
gTerrainProgram.mFeatures.calculatesAtmospherics = true;
gTerrainProgram.mFeatures.hasAtmospherics = true;
+ gTerrainProgram.mFeatures.mIndexedTextureChannels = 0;
+ gTerrainProgram.mFeatures.disableTextureIndex = true;
gTerrainProgram.mFeatures.hasGamma = true;
gTerrainProgram.mShaderFiles.clear();
gTerrainProgram.mShaderFiles.push_back(make_pair("environment/terrainV.glsl", GL_VERTEX_SHADER_ARB));
@@ -912,6 +895,8 @@ BOOL LLViewerShaderMgr::loadShadersWater()
gTerrainWaterProgram.mFeatures.calculatesAtmospherics = true;
gTerrainWaterProgram.mFeatures.hasAtmospherics = true;
gTerrainWaterProgram.mFeatures.hasWaterFog = true;
+ gTerrainWaterProgram.mFeatures.mIndexedTextureChannels = 0;
+ gTerrainWaterProgram.mFeatures.disableTextureIndex = true;
gTerrainWaterProgram.mShaderFiles.clear();
gTerrainWaterProgram.mShaderFiles.push_back(make_pair("environment/terrainV.glsl", GL_VERTEX_SHADER_ARB));
gTerrainWaterProgram.mShaderFiles.push_back(make_pair("environment/terrainWaterF.glsl", GL_FRAGMENT_SHADER_ARB));
@@ -950,9 +935,6 @@ BOOL LLViewerShaderMgr::loadShadersEffects()
{
BOOL success = TRUE;
- U32 samples = gGLManager.getNumFBOFSAASamples(gSavedSettings.getU32("RenderFSAASamples"));
- bool multisample = samples > 1 && LLPipeline::sRenderDeferred && gGLManager.mHasTextureMultisample;
-
if (mVertexShaderLevel[SHADER_EFFECT] == 0)
{
gGlowProgram.unload();
@@ -978,21 +960,10 @@ BOOL LLViewerShaderMgr::loadShadersEffects()
if (success)
{
- std::string fragment;
-
- if (multisample)
- {
- fragment = "effects/glowExtractMSF.glsl";
- }
- else
- {
- fragment = "effects/glowExtractF.glsl";
- }
-
gGlowExtractProgram.mName = "Glow Extract Shader (Post)";
gGlowExtractProgram.mShaderFiles.clear();
gGlowExtractProgram.mShaderFiles.push_back(make_pair("effects/glowExtractV.glsl", GL_VERTEX_SHADER_ARB));
- gGlowExtractProgram.mShaderFiles.push_back(make_pair(fragment, GL_FRAGMENT_SHADER_ARB));
+ gGlowExtractProgram.mShaderFiles.push_back(make_pair("effects/glowExtractF.glsl", GL_FRAGMENT_SHADER_ARB));
gGlowExtractProgram.mShaderLevel = mVertexShaderLevel[SHADER_EFFECT];
success = gGlowExtractProgram.createShader(NULL, &mGlowExtractUniforms);
if (!success)
@@ -1001,51 +972,6 @@ BOOL LLViewerShaderMgr::loadShadersEffects()
}
}
-#if 0
- // disabling loading of postprocess shaders until we fix
- // ATI sampler2DRect compatibility.
-
- //load Color Filter Shader
- if (success)
- {
- vector<string> shaderUniforms;
- shaderUniforms.reserve(7);
- shaderUniforms.push_back("RenderTexture");
- shaderUniforms.push_back("gamma");
- shaderUniforms.push_back("brightness");
- shaderUniforms.push_back("contrast");
- shaderUniforms.push_back("contrastBase");
- shaderUniforms.push_back("saturation");
- shaderUniforms.push_back("lumWeights");
-
- gPostColorFilterProgram.mName = "Color Filter Shader (Post)";
- gPostColorFilterProgram.mShaderFiles.clear();
- gPostColorFilterProgram.mShaderFiles.push_back(make_pair("effects/colorFilterF.glsl", GL_FRAGMENT_SHADER_ARB));
- gPostColorFilterProgram.mShaderFiles.push_back(make_pair("effects/drawQuadV.glsl", GL_VERTEX_SHADER_ARB));
- gPostColorFilterProgram.mShaderLevel = mVertexShaderLevel[SHADER_EFFECT];
- success = gPostColorFilterProgram.createShader(NULL, &shaderUniforms);
- }
-
- //load Night Vision Shader
- if (success)
- {
- vector<string> shaderUniforms;
- shaderUniforms.reserve(5);
- shaderUniforms.push_back("RenderTexture");
- shaderUniforms.push_back("NoiseTexture");
- shaderUniforms.push_back("brightMult");
- shaderUniforms.push_back("noiseStrength");
- shaderUniforms.push_back("lumWeights");
-
- gPostNightVisionProgram.mName = "Night Vision Shader (Post)";
- gPostNightVisionProgram.mShaderFiles.clear();
- gPostNightVisionProgram.mShaderFiles.push_back(make_pair("effects/nightVisionF.glsl", GL_FRAGMENT_SHADER_ARB));
- gPostNightVisionProgram.mShaderFiles.push_back(make_pair("effects/drawQuadV.glsl", GL_VERTEX_SHADER_ARB));
- gPostNightVisionProgram.mShaderLevel = mVertexShaderLevel[SHADER_EFFECT];
- success = gPostNightVisionProgram.createShader(NULL, &shaderUniforms);
- }
- #endif
-
return success;
}
@@ -1055,9 +981,11 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
if (mVertexShaderLevel[SHADER_DEFERRED] == 0)
{
gDeferredTreeProgram.unload();
+ gDeferredTreeShadowProgram.unload();
gDeferredDiffuseProgram.unload();
gDeferredDiffuseAlphaMaskProgram.unload();
gDeferredNonIndexedDiffuseAlphaMaskProgram.unload();
+ gDeferredNonIndexedDiffuseAlphaMaskNoColorProgram.unload();
gDeferredNonIndexedDiffuseProgram.unload();
gDeferredSkinnedDiffuseProgram.unload();
gDeferredSkinnedBumpProgram.unload();
@@ -1080,34 +1008,29 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
gDeferredAvatarAlphaProgram.unload();
gDeferredAlphaProgram.unload();
gDeferredFullbrightProgram.unload();
+ gDeferredEmissiveProgram.unload();
gDeferredAvatarEyesProgram.unload();
- gDeferredPostGIProgram.unload();
- gDeferredEdgeProgram.unload();
gDeferredPostProgram.unload();
- gLuminanceGatherProgram.unload();
- gDeferredGIProgram.unload();
- gDeferredGIFinalProgram.unload();
+ gDeferredCoFProgram.unload();
+ gDeferredDoFCombineProgram.unload();
+ gFXAAProgram.unload();
gDeferredWaterProgram.unload();
gDeferredWLSkyProgram.unload();
gDeferredWLCloudProgram.unload();
gDeferredStarProgram.unload();
+ gNormalMapGenProgram.unload();
return TRUE;
}
- mVertexShaderLevel[SHADER_AVATAR] = 1;
-
BOOL success = TRUE;
- U32 samples = gGLManager.getNumFBOFSAASamples(gSavedSettings.getU32("RenderFSAASamples"));
- bool multisample = samples > 1 && gGLManager.mHasTextureMultisample;
-
if (success)
{
gDeferredDiffuseProgram.mName = "Deferred Diffuse Shader";
gDeferredDiffuseProgram.mShaderFiles.clear();
gDeferredDiffuseProgram.mShaderFiles.push_back(make_pair("deferred/diffuseV.glsl", GL_VERTEX_SHADER_ARB));
gDeferredDiffuseProgram.mShaderFiles.push_back(make_pair("deferred/diffuseIndexedF.glsl", GL_FRAGMENT_SHADER_ARB));
- gDeferredDiffuseProgram.mFeatures.mIndexedTextureChannels = gGLManager.mNumTextureImageUnits;
+ gDeferredDiffuseProgram.mFeatures.mIndexedTextureChannels = LLGLSLShader::sIndexedTextureChannels;
gDeferredDiffuseProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
success = gDeferredDiffuseProgram.createShader(NULL, NULL);
}
@@ -1118,7 +1041,7 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
gDeferredDiffuseAlphaMaskProgram.mShaderFiles.clear();
gDeferredDiffuseAlphaMaskProgram.mShaderFiles.push_back(make_pair("deferred/diffuseV.glsl", GL_VERTEX_SHADER_ARB));
gDeferredDiffuseAlphaMaskProgram.mShaderFiles.push_back(make_pair("deferred/diffuseAlphaMaskIndexedF.glsl", GL_FRAGMENT_SHADER_ARB));
- gDeferredDiffuseAlphaMaskProgram.mFeatures.mIndexedTextureChannels = gGLManager.mNumTextureImageUnits;
+ gDeferredDiffuseAlphaMaskProgram.mFeatures.mIndexedTextureChannels = LLGLSLShader::sIndexedTextureChannels;
gDeferredDiffuseAlphaMaskProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
success = gDeferredDiffuseAlphaMaskProgram.createShader(NULL, NULL);
}
@@ -1132,6 +1055,16 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
gDeferredNonIndexedDiffuseAlphaMaskProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
success = gDeferredNonIndexedDiffuseAlphaMaskProgram.createShader(NULL, NULL);
}
+
+ if (success)
+ {
+ gDeferredNonIndexedDiffuseAlphaMaskNoColorProgram.mName = "Deferred Diffuse Non-Indexed Alpha Mask Shader";
+ gDeferredNonIndexedDiffuseAlphaMaskNoColorProgram.mShaderFiles.clear();
+ gDeferredNonIndexedDiffuseAlphaMaskNoColorProgram.mShaderFiles.push_back(make_pair("deferred/diffuseNoColorV.glsl", GL_VERTEX_SHADER_ARB));
+ gDeferredNonIndexedDiffuseAlphaMaskNoColorProgram.mShaderFiles.push_back(make_pair("deferred/diffuseAlphaMaskNoColorF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gDeferredNonIndexedDiffuseAlphaMaskNoColorProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
+ success = gDeferredNonIndexedDiffuseAlphaMaskNoColorProgram.createShader(NULL, NULL);
+ }
if (success)
{
@@ -1170,11 +1103,12 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
{
gDeferredSkinnedAlphaProgram.mName = "Deferred Skinned Alpha Shader";
gDeferredSkinnedAlphaProgram.mFeatures.hasObjectSkinning = true;
- gDeferredSkinnedAlphaProgram.mFeatures.calculatesLighting = true;
gDeferredSkinnedAlphaProgram.mFeatures.calculatesAtmospherics = true;
gDeferredSkinnedAlphaProgram.mFeatures.hasGamma = true;
gDeferredSkinnedAlphaProgram.mFeatures.hasAtmospherics = true;
+ gDeferredSkinnedAlphaProgram.mFeatures.calculatesLighting = true;
gDeferredSkinnedAlphaProgram.mFeatures.hasLighting = true;
+ gDeferredSkinnedAlphaProgram.mFeatures.isAlphaLighting = true;
gDeferredSkinnedAlphaProgram.mFeatures.disableTextureIndex = true;
gDeferredSkinnedAlphaProgram.mShaderFiles.clear();
gDeferredSkinnedAlphaProgram.mShaderFiles.push_back(make_pair("deferred/alphaSkinnedV.glsl", GL_VERTEX_SHADER_ARB));
@@ -1205,6 +1139,16 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
if (success)
{
+ gDeferredTreeShadowProgram.mName = "Deferred Tree Shadow Shader";
+ gDeferredTreeShadowProgram.mShaderFiles.clear();
+ gDeferredTreeShadowProgram.mShaderFiles.push_back(make_pair("deferred/treeShadowV.glsl", GL_VERTEX_SHADER_ARB));
+ gDeferredTreeShadowProgram.mShaderFiles.push_back(make_pair("deferred/treeShadowF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gDeferredTreeShadowProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
+ success = gDeferredTreeShadowProgram.createShader(NULL, NULL);
+ }
+
+ if (success)
+ {
gDeferredImpostorProgram.mName = "Deferred Impostor Shader";
gDeferredImpostorProgram.mShaderFiles.clear();
gDeferredImpostorProgram.mShaderFiles.push_back(make_pair("deferred/impostorV.glsl", GL_VERTEX_SHADER_ARB));
@@ -1214,84 +1158,41 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
}
if (success)
- {
- std::string fragment;
-
- if (multisample)
- {
- fragment = "deferred/pointLightMSF.glsl";
- }
- else
- {
- fragment = "deferred/pointLightF.glsl";
- }
-
+ {
gDeferredLightProgram.mName = "Deferred Light Shader";
gDeferredLightProgram.mShaderFiles.clear();
gDeferredLightProgram.mShaderFiles.push_back(make_pair("deferred/pointLightV.glsl", GL_VERTEX_SHADER_ARB));
- gDeferredLightProgram.mShaderFiles.push_back(make_pair(fragment, GL_FRAGMENT_SHADER_ARB));
+ gDeferredLightProgram.mShaderFiles.push_back(make_pair("deferred/pointLightF.glsl", GL_FRAGMENT_SHADER_ARB));
gDeferredLightProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
success = gDeferredLightProgram.createShader(NULL, NULL);
}
if (success)
{
- std::string fragment;
- if (multisample)
- {
- fragment = "deferred/multiPointLightMSF.glsl";
- }
- else
- {
- fragment = "deferred/multiPointLightF.glsl";
- }
-
gDeferredMultiLightProgram.mName = "Deferred MultiLight Shader";
gDeferredMultiLightProgram.mShaderFiles.clear();
gDeferredMultiLightProgram.mShaderFiles.push_back(make_pair("deferred/multiPointLightV.glsl", GL_VERTEX_SHADER_ARB));
- gDeferredMultiLightProgram.mShaderFiles.push_back(make_pair(fragment, GL_FRAGMENT_SHADER_ARB));
+ gDeferredMultiLightProgram.mShaderFiles.push_back(make_pair("deferred/multiPointLightF.glsl", GL_FRAGMENT_SHADER_ARB));
gDeferredMultiLightProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
success = gDeferredMultiLightProgram.createShader(NULL, NULL);
}
if (success)
{
- std::string fragment;
-
- if (multisample)
- {
- fragment = "deferred/spotLightMSF.glsl";
- }
- else
- {
- fragment = "deferred/multiSpotLightF.glsl";
- }
-
gDeferredSpotLightProgram.mName = "Deferred SpotLight Shader";
gDeferredSpotLightProgram.mShaderFiles.clear();
gDeferredSpotLightProgram.mShaderFiles.push_back(make_pair("deferred/pointLightV.glsl", GL_VERTEX_SHADER_ARB));
- gDeferredSpotLightProgram.mShaderFiles.push_back(make_pair(fragment, GL_FRAGMENT_SHADER_ARB));
+ gDeferredSpotLightProgram.mShaderFiles.push_back(make_pair("deferred/multiSpotLightF.glsl", GL_FRAGMENT_SHADER_ARB));
gDeferredSpotLightProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
success = gDeferredSpotLightProgram.createShader(NULL, NULL);
}
if (success)
{
- std::string fragment;
-
- if (multisample)
- {
- fragment = "deferred/multiSpotLightMSF.glsl";
- }
- else
- {
- fragment = "deferred/multiSpotLightF.glsl";
- }
-
gDeferredMultiSpotLightProgram.mName = "Deferred MultiSpotLight Shader";
gDeferredMultiSpotLightProgram.mShaderFiles.clear();
gDeferredMultiSpotLightProgram.mShaderFiles.push_back(make_pair("deferred/pointLightV.glsl", GL_VERTEX_SHADER_ARB));
- gDeferredMultiSpotLightProgram.mShaderFiles.push_back(make_pair(fragment, GL_FRAGMENT_SHADER_ARB));
+ gDeferredMultiSpotLightProgram.mShaderFiles.push_back(make_pair("deferred/multiSpotLightF.glsl", GL_FRAGMENT_SHADER_ARB));
gDeferredMultiSpotLightProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
success = gDeferredMultiSpotLightProgram.createShader(NULL, NULL);
}
@@ -1302,25 +1203,11 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
if (gSavedSettings.getBOOL("RenderDeferredSSAO"))
{
- if (multisample)
- {
- fragment = "deferred/sunLightSSAOMSF.glsl";
- }
- else
- {
- fragment = "deferred/sunLightSSAOF.glsl";
- }
+ fragment = "deferred/sunLightSSAOF.glsl";
}
else
{
- if (multisample)
- {
- fragment = "deferred/sunLightMSF.glsl";
- }
- else
- {
- fragment = "deferred/sunLightF.glsl";
- }
+ fragment = "deferred/sunLightF.glsl";
}
gDeferredSunProgram.mName = "Deferred Sun Shader";
@@ -1333,21 +1220,10 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
if (success)
{
- std::string fragment;
-
- if (multisample)
- {
- fragment = "deferred/blurLightMSF.glsl";
- }
- else
- {
- fragment = "deferred/blurLightF.glsl";
- }
-
gDeferredBlurLightProgram.mName = "Deferred Blur Light Shader";
gDeferredBlurLightProgram.mShaderFiles.clear();
gDeferredBlurLightProgram.mShaderFiles.push_back(make_pair("deferred/blurLightV.glsl", GL_VERTEX_SHADER_ARB));
- gDeferredBlurLightProgram.mShaderFiles.push_back(make_pair(fragment, GL_FRAGMENT_SHADER_ARB));
+ gDeferredBlurLightProgram.mShaderFiles.push_back(make_pair("deferred/blurLightF.glsl", GL_FRAGMENT_SHADER_ARB));
gDeferredBlurLightProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
success = gDeferredBlurLightProgram.createShader(NULL, NULL);
}
@@ -1360,14 +1236,15 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
gDeferredAlphaProgram.mFeatures.hasGamma = true;
gDeferredAlphaProgram.mFeatures.hasAtmospherics = true;
gDeferredAlphaProgram.mFeatures.hasLighting = true;
+ gDeferredAlphaProgram.mFeatures.isAlphaLighting = true;
gDeferredAlphaProgram.mFeatures.disableTextureIndex = true; //hack to disable auto-setup of texture channels
if (mVertexShaderLevel[SHADER_DEFERRED] < 1)
{
- gDeferredAlphaProgram.mFeatures.mIndexedTextureChannels = gGLManager.mNumTextureImageUnits;
+ gDeferredAlphaProgram.mFeatures.mIndexedTextureChannels = LLGLSLShader::sIndexedTextureChannels;
}
else
{ //shave off some texture units for shadow maps
- gDeferredAlphaProgram.mFeatures.mIndexedTextureChannels = gGLManager.mNumTextureImageUnits - 6;
+ gDeferredAlphaProgram.mFeatures.mIndexedTextureChannels = llmax(LLGLSLShader::sIndexedTextureChannels - 6, 1);
}
gDeferredAlphaProgram.mShaderFiles.clear();
@@ -1397,7 +1274,7 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
gDeferredFullbrightProgram.mFeatures.calculatesAtmospherics = true;
gDeferredFullbrightProgram.mFeatures.hasGamma = true;
gDeferredFullbrightProgram.mFeatures.hasTransport = true;
- gDeferredFullbrightProgram.mFeatures.mIndexedTextureChannels = gGLManager.mNumTextureImageUnits;
+ gDeferredFullbrightProgram.mFeatures.mIndexedTextureChannels = LLGLSLShader::sIndexedTextureChannels;
gDeferredFullbrightProgram.mShaderFiles.clear();
gDeferredFullbrightProgram.mShaderFiles.push_back(make_pair("deferred/fullbrightV.glsl", GL_VERTEX_SHADER_ARB));
gDeferredFullbrightProgram.mShaderFiles.push_back(make_pair("deferred/fullbrightF.glsl", GL_FRAGMENT_SHADER_ARB));
@@ -1407,6 +1284,20 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
if (success)
{
+ gDeferredEmissiveProgram.mName = "Deferred Emissive Shader";
+ gDeferredEmissiveProgram.mFeatures.calculatesAtmospherics = true;
+ gDeferredEmissiveProgram.mFeatures.hasGamma = true;
+ gDeferredEmissiveProgram.mFeatures.hasTransport = true;
+ gDeferredEmissiveProgram.mFeatures.mIndexedTextureChannels = LLGLSLShader::sIndexedTextureChannels;
+ gDeferredEmissiveProgram.mShaderFiles.clear();
+ gDeferredEmissiveProgram.mShaderFiles.push_back(make_pair("deferred/emissiveV.glsl", GL_VERTEX_SHADER_ARB));
+ gDeferredEmissiveProgram.mShaderFiles.push_back(make_pair("deferred/emissiveF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gDeferredEmissiveProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
+ success = gDeferredEmissiveProgram.createShader(NULL, NULL);
+ }
+
+ if (success)
+ {
// load water shader
gDeferredWaterProgram.mName = "Deferred Water Shader";
gDeferredWaterProgram.mFeatures.calculatesAtmospherics = true;
@@ -1421,21 +1312,10 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
if (success)
{
- std::string fragment;
-
- if (multisample)
- {
- fragment = "deferred/softenLightMSF.glsl";
- }
- else
- {
- fragment = "deferred/softenLightF.glsl";
- }
-
gDeferredSoftenProgram.mName = "Deferred Soften Shader";
gDeferredSoftenProgram.mShaderFiles.clear();
gDeferredSoftenProgram.mShaderFiles.push_back(make_pair("deferred/softenLightV.glsl", GL_VERTEX_SHADER_ARB));
- gDeferredSoftenProgram.mShaderFiles.push_back(make_pair(fragment, GL_FRAGMENT_SHADER_ARB));
+ gDeferredSoftenProgram.mShaderFiles.push_back(make_pair("deferred/softenLightF.glsl", GL_FRAGMENT_SHADER_ARB));
gDeferredSoftenProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
@@ -1460,6 +1340,7 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
if (success)
{
gDeferredShadowAlphaMaskProgram.mName = "Deferred Shadow Alpha Mask Shader";
+ gDeferredShadowAlphaMaskProgram.mFeatures.mIndexedTextureChannels = LLGLSLShader::sIndexedTextureChannels;
gDeferredShadowAlphaMaskProgram.mShaderFiles.clear();
gDeferredShadowAlphaMaskProgram.mShaderFiles.push_back(make_pair("deferred/shadowAlphaMaskV.glsl", GL_VERTEX_SHADER_ARB));
gDeferredShadowAlphaMaskProgram.mShaderFiles.push_back(make_pair("deferred/shadowAlphaMaskF.glsl", GL_FRAGMENT_SHADER_ARB));
@@ -1475,7 +1356,7 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
gDeferredAvatarShadowProgram.mShaderFiles.push_back(make_pair("deferred/avatarShadowV.glsl", GL_VERTEX_SHADER_ARB));
gDeferredAvatarShadowProgram.mShaderFiles.push_back(make_pair("deferred/avatarShadowF.glsl", GL_FRAGMENT_SHADER_ARB));
gDeferredAvatarShadowProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
- success = gDeferredAvatarShadowProgram.createShader(&mAvatarAttribs, &mAvatarUniforms);
+ success = gDeferredAvatarShadowProgram.createShader(NULL, &mAvatarUniforms);
}
if (success)
@@ -1507,7 +1388,7 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
gDeferredAvatarProgram.mShaderFiles.push_back(make_pair("deferred/avatarV.glsl", GL_VERTEX_SHADER_ARB));
gDeferredAvatarProgram.mShaderFiles.push_back(make_pair("deferred/avatarF.glsl", GL_FRAGMENT_SHADER_ARB));
gDeferredAvatarProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
- success = gDeferredAvatarProgram.createShader(&mAvatarAttribs, &mAvatarUniforms);
+ success = gDeferredAvatarProgram.createShader(NULL, &mAvatarUniforms);
}
if (success)
@@ -1519,50 +1400,61 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
gDeferredAvatarAlphaProgram.mFeatures.hasGamma = true;
gDeferredAvatarAlphaProgram.mFeatures.hasAtmospherics = true;
gDeferredAvatarAlphaProgram.mFeatures.hasLighting = true;
+ gDeferredAvatarAlphaProgram.mFeatures.isAlphaLighting = true;
gDeferredAvatarAlphaProgram.mFeatures.disableTextureIndex = true;
gDeferredAvatarAlphaProgram.mShaderFiles.clear();
gDeferredAvatarAlphaProgram.mShaderFiles.push_back(make_pair("deferred/avatarAlphaV.glsl", GL_VERTEX_SHADER_ARB));
- gDeferredAvatarAlphaProgram.mShaderFiles.push_back(make_pair("deferred/alphaNonIndexedF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gDeferredAvatarAlphaProgram.mShaderFiles.push_back(make_pair("deferred/alphaNonIndexedNoColorF.glsl", GL_FRAGMENT_SHADER_ARB));
gDeferredAvatarAlphaProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
- success = gDeferredAvatarAlphaProgram.createShader(&mAvatarAttribs, &mAvatarUniforms);
+ success = gDeferredAvatarAlphaProgram.createShader(NULL, &mAvatarUniforms);
}
if (success)
{
- std::string fragment;
- if (multisample)
- {
- fragment = "deferred/postDeferredMSF.glsl";
- }
- else
- {
- fragment = "deferred/postDeferredF.glsl";
- }
+ gFXAAProgram.mName = "FXAA Shader";
+ gFXAAProgram.mShaderFiles.clear();
+ gFXAAProgram.mShaderFiles.push_back(make_pair("deferred/postDeferredV.glsl", GL_VERTEX_SHADER_ARB));
+ gFXAAProgram.mShaderFiles.push_back(make_pair("deferred/fxaaF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gFXAAProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
+ success = gFXAAProgram.createShader(NULL, NULL);
+ }
+ if (success)
+ {
gDeferredPostProgram.mName = "Deferred Post Shader";
gDeferredPostProgram.mShaderFiles.clear();
gDeferredPostProgram.mShaderFiles.push_back(make_pair("deferred/postDeferredV.glsl", GL_VERTEX_SHADER_ARB));
- gDeferredPostProgram.mShaderFiles.push_back(make_pair(fragment, GL_FRAGMENT_SHADER_ARB));
+ gDeferredPostProgram.mShaderFiles.push_back(make_pair("deferred/postDeferredF.glsl", GL_FRAGMENT_SHADER_ARB));
gDeferredPostProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
success = gDeferredPostProgram.createShader(NULL, NULL);
}
if (success)
{
- std::string fragment;
- if (multisample)
- {
- fragment = "deferred/postDeferredNoDoFMSF.glsl";
- }
- else
- {
- fragment = "deferred/postDeferredNoDoFF.glsl";
- }
+ gDeferredCoFProgram.mName = "Deferred CoF Shader";
+ gDeferredCoFProgram.mShaderFiles.clear();
+ gDeferredCoFProgram.mShaderFiles.push_back(make_pair("deferred/postDeferredV.glsl", GL_VERTEX_SHADER_ARB));
+ gDeferredCoFProgram.mShaderFiles.push_back(make_pair("deferred/cofF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gDeferredCoFProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
+ success = gDeferredCoFProgram.createShader(NULL, NULL);
+ }
+ if (success)
+ {
+ gDeferredDoFCombineProgram.mName = "Deferred DoFCombine Shader";
+ gDeferredDoFCombineProgram.mShaderFiles.clear();
+ gDeferredDoFCombineProgram.mShaderFiles.push_back(make_pair("deferred/postDeferredV.glsl", GL_VERTEX_SHADER_ARB));
+ gDeferredDoFCombineProgram.mShaderFiles.push_back(make_pair("deferred/dofCombineF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gDeferredDoFCombineProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
+ success = gDeferredDoFCombineProgram.createShader(NULL, NULL);
+ }
+
+ if (success)
+ {
gDeferredPostNoDoFProgram.mName = "Deferred Post Shader";
gDeferredPostNoDoFProgram.mShaderFiles.clear();
gDeferredPostNoDoFProgram.mShaderFiles.push_back(make_pair("deferred/postDeferredV.glsl", GL_VERTEX_SHADER_ARB));
- gDeferredPostNoDoFProgram.mShaderFiles.push_back(make_pair(fragment, GL_FRAGMENT_SHADER_ARB));
+ gDeferredPostNoDoFProgram.mShaderFiles.push_back(make_pair("deferred/postDeferredNoDoFF.glsl", GL_FRAGMENT_SHADER_ARB));
gDeferredPostNoDoFProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
success = gDeferredPostNoDoFProgram.createShader(NULL, NULL);
}
@@ -1601,70 +1493,15 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
success = gDeferredStarProgram.createShader(NULL, &mWLUniforms);
}
- if (mVertexShaderLevel[SHADER_DEFERRED] > 1)
+ if (success)
{
- if (success)
- {
- std::string fragment;
- if (multisample)
- {
- fragment = "deferred/edgeMSF.glsl";
- }
- else
- {
- fragment = "deferred/edgeF.glsl";
- }
-
- gDeferredEdgeProgram.mName = "Deferred Edge Shader";
- gDeferredEdgeProgram.mShaderFiles.clear();
- gDeferredEdgeProgram.mShaderFiles.push_back(make_pair("deferred/edgeV.glsl", GL_VERTEX_SHADER_ARB));
- gDeferredEdgeProgram.mShaderFiles.push_back(make_pair(fragment, GL_FRAGMENT_SHADER_ARB));
- gDeferredEdgeProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
- success = gDeferredEdgeProgram.createShader(NULL, NULL);
- }
- }
-
- if (mVertexShaderLevel[SHADER_DEFERRED] > 2)
- {
- if (success)
- {
- gDeferredPostGIProgram.mName = "Deferred Post GI Shader";
- gDeferredPostGIProgram.mShaderFiles.clear();
- gDeferredPostGIProgram.mShaderFiles.push_back(make_pair("deferred/postgiV.glsl", GL_VERTEX_SHADER_ARB));
- gDeferredPostGIProgram.mShaderFiles.push_back(make_pair("deferred/postgiF.glsl", GL_FRAGMENT_SHADER_ARB));
- gDeferredPostGIProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
- success = gDeferredPostGIProgram.createShader(NULL, NULL);
- }
-
- if (success)
- {
- gDeferredGIProgram.mName = "Deferred GI Shader";
- gDeferredGIProgram.mShaderFiles.clear();
- gDeferredGIProgram.mShaderFiles.push_back(make_pair("deferred/giV.glsl", GL_VERTEX_SHADER_ARB));
- gDeferredGIProgram.mShaderFiles.push_back(make_pair("deferred/giF.glsl", GL_FRAGMENT_SHADER_ARB));
- gDeferredGIProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
- success = gDeferredGIProgram.createShader(NULL, NULL);
- }
-
- if (success)
- {
- gDeferredGIFinalProgram.mName = "Deferred GI Final Shader";
- gDeferredGIFinalProgram.mShaderFiles.clear();
- gDeferredGIFinalProgram.mShaderFiles.push_back(make_pair("deferred/giFinalV.glsl", GL_VERTEX_SHADER_ARB));
- gDeferredGIFinalProgram.mShaderFiles.push_back(make_pair("deferred/giFinalF.glsl", GL_FRAGMENT_SHADER_ARB));
- gDeferredGIFinalProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
- success = gDeferredGIFinalProgram.createShader(NULL, NULL);
- }
-
- if (success)
- {
- gLuminanceGatherProgram.mName = "Luminance Gather Shader";
- gLuminanceGatherProgram.mShaderFiles.clear();
- gLuminanceGatherProgram.mShaderFiles.push_back(make_pair("deferred/luminanceV.glsl", GL_VERTEX_SHADER_ARB));
- gLuminanceGatherProgram.mShaderFiles.push_back(make_pair("deferred/luminanceF.glsl", GL_FRAGMENT_SHADER_ARB));
- gLuminanceGatherProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
- success = gLuminanceGatherProgram.createShader(NULL, NULL);
- }
+ gNormalMapGenProgram.mName = "Normal Map Generation Program";
+ gNormalMapGenProgram.mShaderFiles.clear();
+ gNormalMapGenProgram.mShaderFiles.push_back(make_pair("deferred/normgenV.glsl", GL_VERTEX_SHADER_ARB));
+ gNormalMapGenProgram.mShaderFiles.push_back(make_pair("deferred/normgenF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gNormalMapGenProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
+ gNormalMapGenProgram.mShaderGroup = LLGLSLShader::SG_SKY;
+ success = gNormalMapGenProgram.createShader(NULL, NULL);
}
return success;
@@ -1680,12 +1517,17 @@ BOOL LLViewerShaderMgr::loadShadersObject()
gObjectFullbrightShinyProgram.unload();
gObjectFullbrightShinyWaterProgram.unload();
gObjectShinyWaterProgram.unload();
+ gObjectFullbrightNoColorProgram.unload();
+ gObjectFullbrightNoColorWaterProgram.unload();
gObjectSimpleProgram.unload();
+ gObjectPreviewProgram.unload();
gImpostorProgram.unload();
gObjectSimpleAlphaMaskProgram.unload();
gObjectBumpProgram.unload();
gObjectSimpleWaterProgram.unload();
gObjectSimpleWaterAlphaMaskProgram.unload();
+ gObjectEmissiveProgram.unload();
+ gObjectEmissiveWaterProgram.unload();
gObjectFullbrightProgram.unload();
gObjectFullbrightAlphaMaskProgram.unload();
gObjectFullbrightWaterProgram.unload();
@@ -1694,20 +1536,29 @@ BOOL LLViewerShaderMgr::loadShadersObject()
gObjectFullbrightShinyNonIndexedProgram.unload();
gObjectFullbrightShinyNonIndexedWaterProgram.unload();
gObjectShinyNonIndexedWaterProgram.unload();
- gObjectSimpleNonIndexedProgram.unload();
+ gObjectSimpleNonIndexedTexGenProgram.unload();
+ gObjectSimpleNonIndexedTexGenWaterProgram.unload();
gObjectSimpleNonIndexedWaterProgram.unload();
gObjectAlphaMaskNonIndexedProgram.unload();
gObjectAlphaMaskNonIndexedWaterProgram.unload();
+ gObjectAlphaMaskNoColorProgram.unload();
+ gObjectAlphaMaskNoColorWaterProgram.unload();
gObjectFullbrightNonIndexedProgram.unload();
gObjectFullbrightNonIndexedWaterProgram.unload();
+ gObjectEmissiveNonIndexedProgram.unload();
+ gObjectEmissiveNonIndexedWaterProgram.unload();
gSkinnedObjectSimpleProgram.unload();
gSkinnedObjectFullbrightProgram.unload();
+ gSkinnedObjectEmissiveProgram.unload();
gSkinnedObjectFullbrightShinyProgram.unload();
gSkinnedObjectShinySimpleProgram.unload();
gSkinnedObjectSimpleWaterProgram.unload();
gSkinnedObjectFullbrightWaterProgram.unload();
+ gSkinnedObjectEmissiveWaterProgram.unload();
gSkinnedObjectFullbrightShinyWaterProgram.unload();
gSkinnedObjectShinySimpleWaterProgram.unload();
+ gTreeProgram.unload();
+ gTreeWaterProgram.unload();
return TRUE;
}
@@ -1730,6 +1581,23 @@ BOOL LLViewerShaderMgr::loadShadersObject()
if (success)
{
+ gObjectSimpleNonIndexedTexGenProgram.mName = "Non indexed tex-gen Shader";
+ gObjectSimpleNonIndexedTexGenProgram.mFeatures.calculatesLighting = true;
+ gObjectSimpleNonIndexedTexGenProgram.mFeatures.calculatesAtmospherics = true;
+ gObjectSimpleNonIndexedTexGenProgram.mFeatures.hasGamma = true;
+ gObjectSimpleNonIndexedTexGenProgram.mFeatures.hasAtmospherics = true;
+ gObjectSimpleNonIndexedTexGenProgram.mFeatures.hasLighting = true;
+ gObjectSimpleNonIndexedTexGenProgram.mFeatures.disableTextureIndex = true;
+ gObjectSimpleNonIndexedTexGenProgram.mShaderFiles.clear();
+ gObjectSimpleNonIndexedTexGenProgram.mShaderFiles.push_back(make_pair("objects/simpleTexGenV.glsl", GL_VERTEX_SHADER_ARB));
+ gObjectSimpleNonIndexedTexGenProgram.mShaderFiles.push_back(make_pair("objects/simpleF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gObjectSimpleNonIndexedTexGenProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
+ success = gObjectSimpleNonIndexedTexGenProgram.createShader(NULL, NULL);
+ }
+
+
+ if (success)
+ {
gObjectSimpleNonIndexedWaterProgram.mName = "Non indexed Water Shader";
gObjectSimpleNonIndexedWaterProgram.mFeatures.calculatesLighting = true;
gObjectSimpleNonIndexedWaterProgram.mFeatures.calculatesAtmospherics = true;
@@ -1747,6 +1615,23 @@ BOOL LLViewerShaderMgr::loadShadersObject()
if (success)
{
+ gObjectSimpleNonIndexedTexGenWaterProgram.mName = "Non indexed tex-gen Water Shader";
+ gObjectSimpleNonIndexedTexGenWaterProgram.mFeatures.calculatesLighting = true;
+ gObjectSimpleNonIndexedTexGenWaterProgram.mFeatures.calculatesAtmospherics = true;
+ gObjectSimpleNonIndexedTexGenWaterProgram.mFeatures.hasWaterFog = true;
+ gObjectSimpleNonIndexedTexGenWaterProgram.mFeatures.hasAtmospherics = true;
+ gObjectSimpleNonIndexedTexGenWaterProgram.mFeatures.hasLighting = true;
+ gObjectSimpleNonIndexedTexGenWaterProgram.mFeatures.disableTextureIndex = true;
+ gObjectSimpleNonIndexedTexGenWaterProgram.mShaderFiles.clear();
+ gObjectSimpleNonIndexedTexGenWaterProgram.mShaderFiles.push_back(make_pair("objects/simpleTexGenV.glsl", GL_VERTEX_SHADER_ARB));
+ gObjectSimpleNonIndexedTexGenWaterProgram.mShaderFiles.push_back(make_pair("objects/simpleWaterF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gObjectSimpleNonIndexedTexGenWaterProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
+ gObjectSimpleNonIndexedTexGenWaterProgram.mShaderGroup = LLGLSLShader::SG_WATER;
+ success = gObjectSimpleNonIndexedTexGenWaterProgram.createShader(NULL, NULL);
+ }
+
+ if (success)
+ {
gObjectAlphaMaskNonIndexedProgram.mName = "Non indexed alpha mask Shader";
gObjectAlphaMaskNonIndexedProgram.mFeatures.calculatesLighting = true;
gObjectAlphaMaskNonIndexedProgram.mFeatures.calculatesAtmospherics = true;
@@ -1756,7 +1641,7 @@ BOOL LLViewerShaderMgr::loadShadersObject()
gObjectAlphaMaskNonIndexedProgram.mFeatures.disableTextureIndex = true;
gObjectAlphaMaskNonIndexedProgram.mFeatures.hasAlphaMask = true;
gObjectAlphaMaskNonIndexedProgram.mShaderFiles.clear();
- gObjectAlphaMaskNonIndexedProgram.mShaderFiles.push_back(make_pair("objects/simpleV.glsl", GL_VERTEX_SHADER_ARB));
+ gObjectAlphaMaskNonIndexedProgram.mShaderFiles.push_back(make_pair("objects/simpleNonIndexedV.glsl", GL_VERTEX_SHADER_ARB));
gObjectAlphaMaskNonIndexedProgram.mShaderFiles.push_back(make_pair("objects/simpleF.glsl", GL_FRAGMENT_SHADER_ARB));
gObjectAlphaMaskNonIndexedProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
success = gObjectAlphaMaskNonIndexedProgram.createShader(NULL, NULL);
@@ -1773,7 +1658,7 @@ BOOL LLViewerShaderMgr::loadShadersObject()
gObjectAlphaMaskNonIndexedWaterProgram.mFeatures.disableTextureIndex = true;
gObjectAlphaMaskNonIndexedWaterProgram.mFeatures.hasAlphaMask = true;
gObjectAlphaMaskNonIndexedWaterProgram.mShaderFiles.clear();
- gObjectAlphaMaskNonIndexedWaterProgram.mShaderFiles.push_back(make_pair("objects/simpleV.glsl", GL_VERTEX_SHADER_ARB));
+ gObjectAlphaMaskNonIndexedWaterProgram.mShaderFiles.push_back(make_pair("objects/simpleNonIndexedV.glsl", GL_VERTEX_SHADER_ARB));
gObjectAlphaMaskNonIndexedWaterProgram.mShaderFiles.push_back(make_pair("objects/simpleWaterF.glsl", GL_FRAGMENT_SHADER_ARB));
gObjectAlphaMaskNonIndexedWaterProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
gObjectAlphaMaskNonIndexedWaterProgram.mShaderGroup = LLGLSLShader::SG_WATER;
@@ -1782,6 +1667,76 @@ BOOL LLViewerShaderMgr::loadShadersObject()
if (success)
{
+ gObjectAlphaMaskNoColorProgram.mName = "No color alpha mask Shader";
+ gObjectAlphaMaskNoColorProgram.mFeatures.calculatesLighting = true;
+ gObjectAlphaMaskNoColorProgram.mFeatures.calculatesAtmospherics = true;
+ gObjectAlphaMaskNoColorProgram.mFeatures.hasGamma = true;
+ gObjectAlphaMaskNoColorProgram.mFeatures.hasAtmospherics = true;
+ gObjectAlphaMaskNoColorProgram.mFeatures.hasLighting = true;
+ gObjectAlphaMaskNoColorProgram.mFeatures.disableTextureIndex = true;
+ gObjectAlphaMaskNoColorProgram.mFeatures.hasAlphaMask = true;
+ gObjectAlphaMaskNoColorProgram.mShaderFiles.clear();
+ gObjectAlphaMaskNoColorProgram.mShaderFiles.push_back(make_pair("objects/simpleNoColorV.glsl", GL_VERTEX_SHADER_ARB));
+ gObjectAlphaMaskNoColorProgram.mShaderFiles.push_back(make_pair("objects/simpleF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gObjectAlphaMaskNoColorProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
+ success = gObjectAlphaMaskNoColorProgram.createShader(NULL, NULL);
+ }
+
+ if (success)
+ {
+ gObjectAlphaMaskNoColorWaterProgram.mName = "No color alpha mask Water Shader";
+ gObjectAlphaMaskNoColorWaterProgram.mFeatures.calculatesLighting = true;
+ gObjectAlphaMaskNoColorWaterProgram.mFeatures.calculatesAtmospherics = true;
+ gObjectAlphaMaskNoColorWaterProgram.mFeatures.hasWaterFog = true;
+ gObjectAlphaMaskNoColorWaterProgram.mFeatures.hasAtmospherics = true;
+ gObjectAlphaMaskNoColorWaterProgram.mFeatures.hasLighting = true;
+ gObjectAlphaMaskNoColorWaterProgram.mFeatures.disableTextureIndex = true;
+ gObjectAlphaMaskNoColorWaterProgram.mFeatures.hasAlphaMask = true;
+ gObjectAlphaMaskNoColorWaterProgram.mShaderFiles.clear();
+ gObjectAlphaMaskNoColorWaterProgram.mShaderFiles.push_back(make_pair("objects/simpleNoColorV.glsl", GL_VERTEX_SHADER_ARB));
+ gObjectAlphaMaskNoColorWaterProgram.mShaderFiles.push_back(make_pair("objects/simpleWaterF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gObjectAlphaMaskNoColorWaterProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
+ gObjectAlphaMaskNoColorWaterProgram.mShaderGroup = LLGLSLShader::SG_WATER;
+ success = gObjectAlphaMaskNoColorWaterProgram.createShader(NULL, NULL);
+ }
+
+ if (success)
+ {
+ gTreeProgram.mName = "Tree Shader";
+ gTreeProgram.mFeatures.calculatesLighting = true;
+ gTreeProgram.mFeatures.calculatesAtmospherics = true;
+ gTreeProgram.mFeatures.hasGamma = true;
+ gTreeProgram.mFeatures.hasAtmospherics = true;
+ gTreeProgram.mFeatures.hasLighting = true;
+ gTreeProgram.mFeatures.disableTextureIndex = true;
+ gTreeProgram.mFeatures.hasAlphaMask = true;
+ gTreeProgram.mShaderFiles.clear();
+ gTreeProgram.mShaderFiles.push_back(make_pair("objects/treeV.glsl", GL_VERTEX_SHADER_ARB));
+ gTreeProgram.mShaderFiles.push_back(make_pair("objects/simpleF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gTreeProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
+ success = gTreeProgram.createShader(NULL, NULL);
+ }
+
+ if (success)
+ {
+ gTreeWaterProgram.mName = "Tree Water Shader";
+ gTreeWaterProgram.mFeatures.calculatesLighting = true;
+ gTreeWaterProgram.mFeatures.calculatesAtmospherics = true;
+ gTreeWaterProgram.mFeatures.hasWaterFog = true;
+ gTreeWaterProgram.mFeatures.hasAtmospherics = true;
+ gTreeWaterProgram.mFeatures.hasLighting = true;
+ gTreeWaterProgram.mFeatures.disableTextureIndex = true;
+ gTreeWaterProgram.mFeatures.hasAlphaMask = true;
+ gTreeWaterProgram.mShaderFiles.clear();
+ gTreeWaterProgram.mShaderFiles.push_back(make_pair("objects/treeV.glsl", GL_VERTEX_SHADER_ARB));
+ gTreeWaterProgram.mShaderFiles.push_back(make_pair("objects/simpleWaterF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gTreeWaterProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
+ gTreeWaterProgram.mShaderGroup = LLGLSLShader::SG_WATER;
+ success = gTreeWaterProgram.createShader(NULL, NULL);
+ }
+
+ if (success)
+ {
gObjectFullbrightNonIndexedProgram.mName = "Non Indexed Fullbright Shader";
gObjectFullbrightNonIndexedProgram.mFeatures.calculatesAtmospherics = true;
gObjectFullbrightNonIndexedProgram.mFeatures.hasGamma = true;
@@ -1813,6 +1768,68 @@ BOOL LLViewerShaderMgr::loadShadersObject()
if (success)
{
+ gObjectEmissiveNonIndexedProgram.mName = "Non Indexed Emissive Shader";
+ gObjectEmissiveNonIndexedProgram.mFeatures.calculatesAtmospherics = true;
+ gObjectEmissiveNonIndexedProgram.mFeatures.hasGamma = true;
+ gObjectEmissiveNonIndexedProgram.mFeatures.hasTransport = true;
+ gObjectEmissiveNonIndexedProgram.mFeatures.isFullbright = true;
+ gObjectEmissiveNonIndexedProgram.mFeatures.disableTextureIndex = true;
+ gObjectEmissiveNonIndexedProgram.mShaderFiles.clear();
+ gObjectEmissiveNonIndexedProgram.mShaderFiles.push_back(make_pair("objects/emissiveV.glsl", GL_VERTEX_SHADER_ARB));
+ gObjectEmissiveNonIndexedProgram.mShaderFiles.push_back(make_pair("objects/fullbrightF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gObjectEmissiveNonIndexedProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
+ success = gObjectEmissiveNonIndexedProgram.createShader(NULL, NULL);
+ }
+
+ if (success)
+ {
+ gObjectEmissiveNonIndexedWaterProgram.mName = "Non Indexed Emissive Water Shader";
+ gObjectEmissiveNonIndexedWaterProgram.mFeatures.calculatesAtmospherics = true;
+ gObjectEmissiveNonIndexedWaterProgram.mFeatures.isFullbright = true;
+ gObjectEmissiveNonIndexedWaterProgram.mFeatures.hasWaterFog = true;
+ gObjectEmissiveNonIndexedWaterProgram.mFeatures.hasTransport = true;
+ gObjectEmissiveNonIndexedWaterProgram.mFeatures.disableTextureIndex = true;
+ gObjectEmissiveNonIndexedWaterProgram.mShaderFiles.clear();
+ gObjectEmissiveNonIndexedWaterProgram.mShaderFiles.push_back(make_pair("objects/emissiveV.glsl", GL_VERTEX_SHADER_ARB));
+ gObjectEmissiveNonIndexedWaterProgram.mShaderFiles.push_back(make_pair("objects/fullbrightWaterF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gObjectEmissiveNonIndexedWaterProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
+ gObjectEmissiveNonIndexedWaterProgram.mShaderGroup = LLGLSLShader::SG_WATER;
+ success = gObjectEmissiveNonIndexedWaterProgram.createShader(NULL, NULL);
+ }
+
+ if (success)
+ {
+ gObjectFullbrightNoColorProgram.mName = "Non Indexed no color Fullbright Shader";
+ gObjectFullbrightNoColorProgram.mFeatures.calculatesAtmospherics = true;
+ gObjectFullbrightNoColorProgram.mFeatures.hasGamma = true;
+ gObjectFullbrightNoColorProgram.mFeatures.hasTransport = true;
+ gObjectFullbrightNoColorProgram.mFeatures.isFullbright = true;
+ gObjectFullbrightNoColorProgram.mFeatures.disableTextureIndex = true;
+ gObjectFullbrightNoColorProgram.mShaderFiles.clear();
+ gObjectFullbrightNoColorProgram.mShaderFiles.push_back(make_pair("objects/fullbrightNoColorV.glsl", GL_VERTEX_SHADER_ARB));
+ gObjectFullbrightNoColorProgram.mShaderFiles.push_back(make_pair("objects/fullbrightF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gObjectFullbrightNoColorProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
+ success = gObjectFullbrightNoColorProgram.createShader(NULL, NULL);
+ }
+
+ if (success)
+ {
+ gObjectFullbrightNoColorWaterProgram.mName = "Non Indexed no color Fullbright Water Shader";
+ gObjectFullbrightNoColorWaterProgram.mFeatures.calculatesAtmospherics = true;
+ gObjectFullbrightNoColorWaterProgram.mFeatures.isFullbright = true;
+ gObjectFullbrightNoColorWaterProgram.mFeatures.hasWaterFog = true;
+ gObjectFullbrightNoColorWaterProgram.mFeatures.hasTransport = true;
+ gObjectFullbrightNoColorWaterProgram.mFeatures.disableTextureIndex = true;
+ gObjectFullbrightNoColorWaterProgram.mShaderFiles.clear();
+ gObjectFullbrightNoColorWaterProgram.mShaderFiles.push_back(make_pair("objects/fullbrightNoColorV.glsl", GL_VERTEX_SHADER_ARB));
+ gObjectFullbrightNoColorWaterProgram.mShaderFiles.push_back(make_pair("objects/fullbrightWaterF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gObjectFullbrightNoColorWaterProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
+ gObjectFullbrightNoColorWaterProgram.mShaderGroup = LLGLSLShader::SG_WATER;
+ success = gObjectFullbrightNoColorWaterProgram.createShader(NULL, NULL);
+ }
+
+ if (success)
+ {
gObjectShinyNonIndexedProgram.mName = "Non Indexed Shiny Shader";
gObjectShinyNonIndexedProgram.mFeatures.calculatesAtmospherics = true;
gObjectShinyNonIndexedProgram.mFeatures.calculatesLighting = true;
@@ -1891,6 +1908,23 @@ BOOL LLViewerShaderMgr::loadShadersObject()
if (success)
{
+ gObjectPreviewProgram.mName = "Simple Shader";
+ gObjectPreviewProgram.mFeatures.calculatesLighting = true;
+ gObjectPreviewProgram.mFeatures.calculatesAtmospherics = true;
+ gObjectPreviewProgram.mFeatures.hasGamma = true;
+ gObjectPreviewProgram.mFeatures.hasAtmospherics = true;
+ gObjectPreviewProgram.mFeatures.hasLighting = true;
+ gObjectPreviewProgram.mFeatures.mIndexedTextureChannels = 0;
+ gObjectPreviewProgram.mFeatures.disableTextureIndex = true;
+ gObjectPreviewProgram.mShaderFiles.clear();
+ gObjectPreviewProgram.mShaderFiles.push_back(make_pair("objects/previewV.glsl", GL_VERTEX_SHADER_ARB));
+ gObjectPreviewProgram.mShaderFiles.push_back(make_pair("objects/simpleF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gObjectPreviewProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
+ success = gObjectPreviewProgram.createShader(NULL, NULL);
+ }
+
+ if (success)
+ {
gObjectSimpleProgram.mName = "Simple Shader";
gObjectSimpleProgram.mFeatures.calculatesLighting = true;
gObjectSimpleProgram.mFeatures.calculatesAtmospherics = true;
@@ -1907,19 +1941,19 @@ BOOL LLViewerShaderMgr::loadShadersObject()
if (success)
{
- gObjectSimpleAlphaMaskProgram.mName = "Simple Alpha Mask Shader";
- gObjectSimpleAlphaMaskProgram.mFeatures.calculatesLighting = true;
- gObjectSimpleAlphaMaskProgram.mFeatures.calculatesAtmospherics = true;
- gObjectSimpleAlphaMaskProgram.mFeatures.hasGamma = true;
- gObjectSimpleAlphaMaskProgram.mFeatures.hasAtmospherics = true;
- gObjectSimpleAlphaMaskProgram.mFeatures.hasLighting = true;
- gObjectSimpleAlphaMaskProgram.mFeatures.hasAlphaMask = true;
- gObjectSimpleAlphaMaskProgram.mFeatures.mIndexedTextureChannels = 0;
- gObjectSimpleAlphaMaskProgram.mShaderFiles.clear();
- gObjectSimpleAlphaMaskProgram.mShaderFiles.push_back(make_pair("objects/simpleV.glsl", GL_VERTEX_SHADER_ARB));
- gObjectSimpleAlphaMaskProgram.mShaderFiles.push_back(make_pair("objects/simpleF.glsl", GL_FRAGMENT_SHADER_ARB));
- gObjectSimpleAlphaMaskProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
- success = gObjectSimpleAlphaMaskProgram.createShader(NULL, NULL);
+ gObjectSimpleWaterProgram.mName = "Simple Water Shader";
+ gObjectSimpleWaterProgram.mFeatures.calculatesLighting = true;
+ gObjectSimpleWaterProgram.mFeatures.calculatesAtmospherics = true;
+ gObjectSimpleWaterProgram.mFeatures.hasWaterFog = true;
+ gObjectSimpleWaterProgram.mFeatures.hasAtmospherics = true;
+ gObjectSimpleWaterProgram.mFeatures.hasLighting = true;
+ gObjectSimpleWaterProgram.mFeatures.mIndexedTextureChannels = 0;
+ gObjectSimpleWaterProgram.mShaderFiles.clear();
+ gObjectSimpleWaterProgram.mShaderFiles.push_back(make_pair("objects/simpleV.glsl", GL_VERTEX_SHADER_ARB));
+ gObjectSimpleWaterProgram.mShaderFiles.push_back(make_pair("objects/simpleWaterF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gObjectSimpleWaterProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
+ gObjectSimpleWaterProgram.mShaderGroup = LLGLSLShader::SG_WATER;
+ success = gObjectSimpleWaterProgram.createShader(NULL, NULL);
}
if (success)
@@ -1936,25 +1970,34 @@ BOOL LLViewerShaderMgr::loadShadersObject()
gObjectBumpProgram.mShaderFiles.push_back(make_pair("objects/bumpF.glsl", GL_FRAGMENT_SHADER_ARB));
gObjectBumpProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
success = gObjectBumpProgram.createShader(NULL, NULL);
+
+ if (success)
+ { //lldrawpoolbump assumes "texture0" has channel 0 and "texture1" has channel 1
+ gObjectBumpProgram.bind();
+ gObjectBumpProgram.uniform1i("texture0", 0);
+ gObjectBumpProgram.uniform1i("texture1", 1);
+ gObjectBumpProgram.unbind();
+ }
}
+
if (success)
{
- gObjectSimpleWaterProgram.mName = "Simple Water Shader";
- gObjectSimpleWaterProgram.mFeatures.calculatesLighting = true;
- gObjectSimpleWaterProgram.mFeatures.calculatesAtmospherics = true;
- gObjectSimpleWaterProgram.mFeatures.hasWaterFog = true;
- gObjectSimpleWaterProgram.mFeatures.hasAtmospherics = true;
- gObjectSimpleWaterProgram.mFeatures.hasLighting = true;
- gObjectSimpleWaterProgram.mFeatures.mIndexedTextureChannels = 0;
- gObjectSimpleWaterProgram.mShaderFiles.clear();
- gObjectSimpleWaterProgram.mShaderFiles.push_back(make_pair("objects/simpleV.glsl", GL_VERTEX_SHADER_ARB));
- gObjectSimpleWaterProgram.mShaderFiles.push_back(make_pair("objects/simpleWaterF.glsl", GL_FRAGMENT_SHADER_ARB));
- gObjectSimpleWaterProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
- gObjectSimpleWaterProgram.mShaderGroup = LLGLSLShader::SG_WATER;
- success = gObjectSimpleWaterProgram.createShader(NULL, NULL);
+ gObjectSimpleAlphaMaskProgram.mName = "Simple Alpha Mask Shader";
+ gObjectSimpleAlphaMaskProgram.mFeatures.calculatesLighting = true;
+ gObjectSimpleAlphaMaskProgram.mFeatures.calculatesAtmospherics = true;
+ gObjectSimpleAlphaMaskProgram.mFeatures.hasGamma = true;
+ gObjectSimpleAlphaMaskProgram.mFeatures.hasAtmospherics = true;
+ gObjectSimpleAlphaMaskProgram.mFeatures.hasLighting = true;
+ gObjectSimpleAlphaMaskProgram.mFeatures.hasAlphaMask = true;
+ gObjectSimpleAlphaMaskProgram.mFeatures.mIndexedTextureChannels = 0;
+ gObjectSimpleAlphaMaskProgram.mShaderFiles.clear();
+ gObjectSimpleAlphaMaskProgram.mShaderFiles.push_back(make_pair("objects/simpleV.glsl", GL_VERTEX_SHADER_ARB));
+ gObjectSimpleAlphaMaskProgram.mShaderFiles.push_back(make_pair("objects/simpleF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gObjectSimpleAlphaMaskProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
+ success = gObjectSimpleAlphaMaskProgram.createShader(NULL, NULL);
}
-
+
if (success)
{
gObjectSimpleWaterAlphaMaskProgram.mName = "Simple Water Alpha Mask Shader";
@@ -2006,6 +2049,37 @@ BOOL LLViewerShaderMgr::loadShadersObject()
if (success)
{
+ gObjectEmissiveProgram.mName = "Emissive Shader";
+ gObjectEmissiveProgram.mFeatures.calculatesAtmospherics = true;
+ gObjectEmissiveProgram.mFeatures.hasGamma = true;
+ gObjectEmissiveProgram.mFeatures.hasTransport = true;
+ gObjectEmissiveProgram.mFeatures.isFullbright = true;
+ gObjectEmissiveProgram.mFeatures.mIndexedTextureChannels = 0;
+ gObjectEmissiveProgram.mShaderFiles.clear();
+ gObjectEmissiveProgram.mShaderFiles.push_back(make_pair("objects/emissiveV.glsl", GL_VERTEX_SHADER_ARB));
+ gObjectEmissiveProgram.mShaderFiles.push_back(make_pair("objects/fullbrightF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gObjectEmissiveProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
+ success = gObjectEmissiveProgram.createShader(NULL, NULL);
+ }
+
+ if (success)
+ {
+ gObjectEmissiveWaterProgram.mName = "Emissive Water Shader";
+ gObjectEmissiveWaterProgram.mFeatures.calculatesAtmospherics = true;
+ gObjectEmissiveWaterProgram.mFeatures.isFullbright = true;
+ gObjectEmissiveWaterProgram.mFeatures.hasWaterFog = true;
+ gObjectEmissiveWaterProgram.mFeatures.hasTransport = true;
+ gObjectEmissiveWaterProgram.mFeatures.mIndexedTextureChannels = 0;
+ gObjectEmissiveWaterProgram.mShaderFiles.clear();
+ gObjectEmissiveWaterProgram.mShaderFiles.push_back(make_pair("objects/emissiveV.glsl", GL_VERTEX_SHADER_ARB));
+ gObjectEmissiveWaterProgram.mShaderFiles.push_back(make_pair("objects/fullbrightWaterF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gObjectEmissiveWaterProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
+ gObjectEmissiveWaterProgram.mShaderGroup = LLGLSLShader::SG_WATER;
+ success = gObjectEmissiveWaterProgram.createShader(NULL, NULL);
+ }
+
+ if (success)
+ {
gObjectFullbrightAlphaMaskProgram.mName = "Fullbright Alpha Mask Shader";
gObjectFullbrightAlphaMaskProgram.mFeatures.calculatesAtmospherics = true;
gObjectFullbrightAlphaMaskProgram.mFeatures.hasGamma = true;
@@ -2141,6 +2215,39 @@ BOOL LLViewerShaderMgr::loadShadersObject()
if (success)
{
+ gSkinnedObjectEmissiveProgram.mName = "Skinned Emissive Shader";
+ gSkinnedObjectEmissiveProgram.mFeatures.calculatesAtmospherics = true;
+ gSkinnedObjectEmissiveProgram.mFeatures.hasGamma = true;
+ gSkinnedObjectEmissiveProgram.mFeatures.hasTransport = true;
+ gSkinnedObjectEmissiveProgram.mFeatures.isFullbright = true;
+ gSkinnedObjectEmissiveProgram.mFeatures.hasObjectSkinning = true;
+ gSkinnedObjectEmissiveProgram.mFeatures.disableTextureIndex = true;
+ gSkinnedObjectEmissiveProgram.mShaderFiles.clear();
+ gSkinnedObjectEmissiveProgram.mShaderFiles.push_back(make_pair("objects/emissiveSkinnedV.glsl", GL_VERTEX_SHADER_ARB));
+ gSkinnedObjectEmissiveProgram.mShaderFiles.push_back(make_pair("objects/fullbrightF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gSkinnedObjectEmissiveProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
+ success = gSkinnedObjectEmissiveProgram.createShader(NULL, NULL);
+ }
+
+ if (success)
+ {
+ gSkinnedObjectEmissiveWaterProgram.mName = "Skinned Emissive Water Shader";
+ gSkinnedObjectEmissiveWaterProgram.mFeatures.calculatesAtmospherics = true;
+ gSkinnedObjectEmissiveWaterProgram.mFeatures.hasGamma = true;
+ gSkinnedObjectEmissiveWaterProgram.mFeatures.hasTransport = true;
+ gSkinnedObjectEmissiveWaterProgram.mFeatures.isFullbright = true;
+ gSkinnedObjectEmissiveWaterProgram.mFeatures.hasObjectSkinning = true;
+ gSkinnedObjectEmissiveWaterProgram.mFeatures.disableTextureIndex = true;
+ gSkinnedObjectEmissiveWaterProgram.mFeatures.hasWaterFog = true;
+ gSkinnedObjectEmissiveWaterProgram.mShaderFiles.clear();
+ gSkinnedObjectEmissiveWaterProgram.mShaderFiles.push_back(make_pair("objects/emissiveSkinnedV.glsl", GL_VERTEX_SHADER_ARB));
+ gSkinnedObjectEmissiveWaterProgram.mShaderFiles.push_back(make_pair("objects/fullbrightWaterF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gSkinnedObjectEmissiveWaterProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
+ success = gSkinnedObjectEmissiveWaterProgram.createShader(NULL, NULL);
+ }
+
+ if (success)
+ {
gSkinnedObjectFullbrightShinyProgram.mName = "Skinned Fullbright Shiny Shader";
gSkinnedObjectFullbrightShinyProgram.mFeatures.calculatesAtmospherics = true;
gSkinnedObjectFullbrightShinyProgram.mFeatures.hasGamma = true;
@@ -2287,7 +2394,7 @@ BOOL LLViewerShaderMgr::loadShadersAvatar()
gAvatarProgram.mShaderFiles.push_back(make_pair("avatar/avatarV.glsl", GL_VERTEX_SHADER_ARB));
gAvatarProgram.mShaderFiles.push_back(make_pair("avatar/avatarF.glsl", GL_FRAGMENT_SHADER_ARB));
gAvatarProgram.mShaderLevel = mVertexShaderLevel[SHADER_AVATAR];
- success = gAvatarProgram.createShader(&mAvatarAttribs, &mAvatarUniforms);
+ success = gAvatarProgram.createShader(NULL, &mAvatarUniforms);
if (success)
{
@@ -2306,7 +2413,7 @@ BOOL LLViewerShaderMgr::loadShadersAvatar()
// Note: no cloth under water:
gAvatarWaterProgram.mShaderLevel = llmin(mVertexShaderLevel[SHADER_AVATAR], 1);
gAvatarWaterProgram.mShaderGroup = LLGLSLShader::SG_WATER;
- success = gAvatarWaterProgram.createShader(&mAvatarAttribs, &mAvatarUniforms);
+ success = gAvatarWaterProgram.createShader(NULL, &mAvatarUniforms);
}
/// Keep track of avatar levels
@@ -2325,7 +2432,7 @@ BOOL LLViewerShaderMgr::loadShadersAvatar()
gAvatarPickProgram.mShaderFiles.push_back(make_pair("avatar/pickAvatarV.glsl", GL_VERTEX_SHADER_ARB));
gAvatarPickProgram.mShaderFiles.push_back(make_pair("avatar/pickAvatarF.glsl", GL_FRAGMENT_SHADER_ARB));
gAvatarPickProgram.mShaderLevel = mVertexShaderLevel[SHADER_AVATAR];
- success = gAvatarPickProgram.createShader(&mAvatarAttribs, &mAvatarUniforms);
+ success = gAvatarPickProgram.createShader(NULL, &mAvatarUniforms);
}
if (success)
@@ -2398,6 +2505,22 @@ BOOL LLViewerShaderMgr::loadShadersInterface()
if (success)
{
+ gSplatTextureRectProgram.mName = "Splat Texture Rect Shader";
+ gSplatTextureRectProgram.mShaderFiles.clear();
+ gSplatTextureRectProgram.mShaderFiles.push_back(make_pair("interface/splattexturerectV.glsl", GL_VERTEX_SHADER_ARB));
+ gSplatTextureRectProgram.mShaderFiles.push_back(make_pair("interface/splattexturerectF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gSplatTextureRectProgram.mShaderLevel = mVertexShaderLevel[SHADER_INTERFACE];
+ success = gSplatTextureRectProgram.createShader(NULL, NULL);
+ if (success)
+ {
+ gSplatTextureRectProgram.bind();
+ gSplatTextureRectProgram.uniform1i("screenMap", 0);
+ gSplatTextureRectProgram.unbind();
+ }
+ }
+
+ if (success)
+ {
gGlowCombineProgram.mName = "Glow Combine Shader";
gGlowCombineProgram.mShaderFiles.clear();
gGlowCombineProgram.mShaderFiles.push_back(make_pair("interface/glowcombineV.glsl", GL_VERTEX_SHADER_ARB));
@@ -2415,6 +2538,24 @@ BOOL LLViewerShaderMgr::loadShadersInterface()
if (success)
{
+ gGlowCombineFXAAProgram.mName = "Glow CombineFXAA Shader";
+ gGlowCombineFXAAProgram.mShaderFiles.clear();
+ gGlowCombineFXAAProgram.mShaderFiles.push_back(make_pair("interface/glowcombineFXAAV.glsl", GL_VERTEX_SHADER_ARB));
+ gGlowCombineFXAAProgram.mShaderFiles.push_back(make_pair("interface/glowcombineFXAAF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gGlowCombineFXAAProgram.mShaderLevel = mVertexShaderLevel[SHADER_INTERFACE];
+ success = gGlowCombineFXAAProgram.createShader(NULL, NULL);
+ if (success)
+ {
+ gGlowCombineFXAAProgram.bind();
+ gGlowCombineFXAAProgram.uniform1i("glowMap", 0);
+ gGlowCombineFXAAProgram.uniform1i("screenMap", 1);
+ gGlowCombineFXAAProgram.unbind();
+ }
+ }
+
+
+ if (success)
+ {
gTwoTextureAddProgram.mName = "Two Texture Add Shader";
gTwoTextureAddProgram.mShaderFiles.clear();
gTwoTextureAddProgram.mShaderFiles.push_back(make_pair("interface/twotextureaddV.glsl", GL_VERTEX_SHADER_ARB));
@@ -2431,6 +2572,21 @@ BOOL LLViewerShaderMgr::loadShadersInterface()
if (success)
{
+ gOneTextureNoColorProgram.mName = "One Texture No Color Shader";
+ gOneTextureNoColorProgram.mShaderFiles.clear();
+ gOneTextureNoColorProgram.mShaderFiles.push_back(make_pair("interface/onetexturenocolorV.glsl", GL_VERTEX_SHADER_ARB));
+ gOneTextureNoColorProgram.mShaderFiles.push_back(make_pair("interface/onetexturenocolorF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gOneTextureNoColorProgram.mShaderLevel = mVertexShaderLevel[SHADER_INTERFACE];
+ success = gOneTextureNoColorProgram.createShader(NULL, NULL);
+ if (success)
+ {
+ gOneTextureNoColorProgram.bind();
+ gOneTextureNoColorProgram.uniform1i("tex0", 0);
+ }
+ }
+
+ if (success)
+ {
gSolidColorProgram.mName = "Solid Color Shader";
gSolidColorProgram.mShaderFiles.clear();
gSolidColorProgram.mShaderFiles.push_back(make_pair("interface/solidcolorV.glsl", GL_VERTEX_SHADER_ARB));
@@ -2455,6 +2611,26 @@ BOOL LLViewerShaderMgr::loadShadersInterface()
success = gOcclusionProgram.createShader(NULL, NULL);
}
+ if (success)
+ {
+ gDebugProgram.mName = "Debug Shader";
+ gDebugProgram.mShaderFiles.clear();
+ gDebugProgram.mShaderFiles.push_back(make_pair("interface/debugV.glsl", GL_VERTEX_SHADER_ARB));
+ gDebugProgram.mShaderFiles.push_back(make_pair("interface/debugF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gDebugProgram.mShaderLevel = mVertexShaderLevel[SHADER_INTERFACE];
+ success = gDebugProgram.createShader(NULL, NULL);
+ }
+
+ if (success)
+ {
+ gAlphaMaskProgram.mName = "Alpha Mask Shader";
+ gAlphaMaskProgram.mShaderFiles.clear();
+ gAlphaMaskProgram.mShaderFiles.push_back(make_pair("interface/alphamaskV.glsl", GL_VERTEX_SHADER_ARB));
+ gAlphaMaskProgram.mShaderFiles.push_back(make_pair("interface/alphamaskF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gAlphaMaskProgram.mShaderLevel = mVertexShaderLevel[SHADER_INTERFACE];
+ success = gAlphaMaskProgram.createShader(NULL, NULL);
+ }
+
if( !success )
{
mVertexShaderLevel[SHADER_INTERFACE] = 0;
diff --git a/indra/newview/llviewershadermgr.h b/indra/newview/llviewershadermgr.h
index d4040f11e1..95eb551bf1 100644
--- a/indra/newview/llviewershadermgr.h
+++ b/indra/newview/llviewershadermgr.h
@@ -33,6 +33,7 @@ class LLViewerShaderMgr: public LLShaderMgr
{
public:
static BOOL sInitialized;
+ static bool sSkipReload;
LLViewerShaderMgr();
/* virtual */ ~LLViewerShaderMgr();
@@ -71,76 +72,6 @@ public:
SHADER_COUNT
};
- typedef enum
- {
- MATERIAL_COLOR = 0,
- SPECULAR_COLOR,
- BINORMAL,
- OBJECT_WEIGHT,
- END_RESERVED_ATTRIBS
- } eGLSLReservedAttribs;
-
- typedef enum
- {
- DIFFUSE_MAP = 0,
- SPECULAR_MAP,
- BUMP_MAP,
- ENVIRONMENT_MAP,
- CLOUD_NOISE_MAP,
- FULLBRIGHT,
- LIGHTNORM,
- SUNLIGHT_COLOR,
- AMBIENT,
- BLUE_HORIZON,
- BLUE_DENSITY,
- HAZE_HORIZON,
- HAZE_DENSITY,
- CLOUD_SHADOW,
- DENSITY_MULTIPLIER,
- DISTANCE_MULTIPLIER,
- MAX_Y,
- GLOW,
- CLOUD_COLOR,
- CLOUD_POS_DENSITY1,
- CLOUD_POS_DENSITY2,
- CLOUD_SCALE,
- GAMMA,
- SCENE_LIGHT_STRENGTH,
- DEFERRED_DEPTH,
- DEFERRED_SHADOW0,
- DEFERRED_SHADOW1,
- DEFERRED_SHADOW2,
- DEFERRED_SHADOW3,
- DEFERRED_SHADOW4,
- DEFERRED_SHADOW5,
- DEFERRED_NORMAL,
- DEFERRED_POSITION,
- DEFERRED_DIFFUSE,
- DEFERRED_SPECULAR,
- DEFERRED_NOISE,
- DEFERRED_LIGHTFUNC,
- DEFERRED_LIGHT,
- DEFERRED_LUMINANCE,
- DEFERRED_GI_LIGHT,
- DEFERRED_GI_MIP,
- DEFERRED_EDGE,
- DEFERRED_BLOOM,
- DEFERRED_SUN_LIGHT,
- DEFERRED_LOCAL_LIGHT,
- DEFERRED_PROJECTION,
- DEFERRED_GI_DIFFUSE,
- DEFERRED_GI_SPECULAR,
- DEFERRED_GI_NORMAL,
- DEFERRED_GI_MIN_POS,
- DEFERRED_GI_MAX_POS,
- DEFERRED_GI_DEPTH,
- DEFERRED_GI_LAST_DIFFUSE,
- DEFERRED_GI_LAST_NORMAL,
- DEFERRED_GI_LAST_MIN_POS,
- DEFERRED_GI_LAST_MAX_POS,
- END_RESERVED_UNIFORMS
- } eGLSLReservedUniforms;
-
typedef enum
{
SHINY_ORIGIN = END_RESERVED_UNIFORMS
@@ -186,16 +117,10 @@ public:
typedef enum
{
- AVATAR_WEIGHT = END_RESERVED_ATTRIBS,
- AVATAR_CLOTHING,
+ AVATAR_MATRIX = END_RESERVED_UNIFORMS,
AVATAR_WIND,
AVATAR_SINWAVE,
- AVATAR_GRAVITY
- } eAvatarAttribs;
-
- typedef enum
- {
- AVATAR_MATRIX = END_RESERVED_UNIFORMS
+ AVATAR_GRAVITY,
} eAvatarUniforms;
// simple model of forward iterator
@@ -265,9 +190,6 @@ private:
std::vector<std::string> mGlowExtractUniforms;
- //avatar shader parameter tables
- std::vector<std::string> mAvatarAttribs;
-
std::vector<std::string> mAvatarUniforms;
// the list of shaders we need to propagate parameters to.
@@ -291,26 +213,45 @@ extern LLVector4 gShinyOrigin;
extern LLGLSLShader gOcclusionProgram;
extern LLGLSLShader gCustomAlphaProgram;
extern LLGLSLShader gGlowCombineProgram;
+extern LLGLSLShader gSplatTextureRectProgram;
+extern LLGLSLShader gGlowCombineFXAAProgram;
+extern LLGLSLShader gDebugProgram;
+extern LLGLSLShader gAlphaMaskProgram;
//output tex0[tc0] + tex1[tc1]
extern LLGLSLShader gTwoTextureAddProgram;
-
+
+extern LLGLSLShader gOneTextureNoColorProgram;
+
//object shaders
extern LLGLSLShader gObjectSimpleProgram;
+extern LLGLSLShader gObjectPreviewProgram;
extern LLGLSLShader gObjectSimpleAlphaMaskProgram;
extern LLGLSLShader gObjectSimpleWaterProgram;
extern LLGLSLShader gObjectSimpleWaterAlphaMaskProgram;
extern LLGLSLShader gObjectSimpleNonIndexedProgram;
+extern LLGLSLShader gObjectSimpleNonIndexedTexGenProgram;
+extern LLGLSLShader gObjectSimpleNonIndexedTexGenWaterProgram;
extern LLGLSLShader gObjectSimpleNonIndexedWaterProgram;
extern LLGLSLShader gObjectAlphaMaskNonIndexedProgram;
extern LLGLSLShader gObjectAlphaMaskNonIndexedWaterProgram;
+extern LLGLSLShader gObjectAlphaMaskNoColorProgram;
+extern LLGLSLShader gObjectAlphaMaskNoColorWaterProgram;
extern LLGLSLShader gObjectFullbrightProgram;
extern LLGLSLShader gObjectFullbrightWaterProgram;
+extern LLGLSLShader gObjectFullbrightNoColorProgram;
+extern LLGLSLShader gObjectFullbrightNoColorWaterProgram;
+extern LLGLSLShader gObjectEmissiveProgram;
+extern LLGLSLShader gObjectEmissiveWaterProgram;
extern LLGLSLShader gObjectFullbrightAlphaMaskProgram;
extern LLGLSLShader gObjectFullbrightWaterAlphaMaskProgram;
extern LLGLSLShader gObjectFullbrightNonIndexedProgram;
extern LLGLSLShader gObjectFullbrightNonIndexedWaterProgram;
+extern LLGLSLShader gObjectEmissiveNonIndexedProgram;
+extern LLGLSLShader gObjectEmissiveNonIndexedWaterProgram;
extern LLGLSLShader gObjectBumpProgram;
+extern LLGLSLShader gTreeProgram;
+extern LLGLSLShader gTreeWaterProgram;
extern LLGLSLShader gObjectSimpleLODProgram;
extern LLGLSLShader gObjectFullbrightLODProgram;
@@ -327,11 +268,13 @@ extern LLGLSLShader gObjectShinyNonIndexedWaterProgram;
extern LLGLSLShader gSkinnedObjectSimpleProgram;
extern LLGLSLShader gSkinnedObjectFullbrightProgram;
+extern LLGLSLShader gSkinnedObjectEmissiveProgram;
extern LLGLSLShader gSkinnedObjectFullbrightShinyProgram;
extern LLGLSLShader gSkinnedObjectShinySimpleProgram;
extern LLGLSLShader gSkinnedObjectSimpleWaterProgram;
extern LLGLSLShader gSkinnedObjectFullbrightWaterProgram;
+extern LLGLSLShader gSkinnedObjectEmissiveWaterProgram;
extern LLGLSLShader gSkinnedObjectFullbrightShinyWaterProgram;
extern LLGLSLShader gSkinnedObjectShinySimpleWaterProgram;
@@ -363,11 +306,11 @@ extern LLGLSLShader gPostNightVisionProgram;
// Deferred rendering shaders
extern LLGLSLShader gDeferredImpostorProgram;
-extern LLGLSLShader gDeferredEdgeProgram;
extern LLGLSLShader gDeferredWaterProgram;
extern LLGLSLShader gDeferredDiffuseProgram;
extern LLGLSLShader gDeferredDiffuseAlphaMaskProgram;
extern LLGLSLShader gDeferredNonIndexedDiffuseAlphaMaskProgram;
+extern LLGLSLShader gDeferredNonIndexedDiffuseAlphaMaskNoColorProgram;
extern LLGLSLShader gDeferredNonIndexedDiffuseProgram;
extern LLGLSLShader gDeferredSkinnedDiffuseProgram;
extern LLGLSLShader gDeferredSkinnedBumpProgram;
@@ -375,34 +318,32 @@ extern LLGLSLShader gDeferredSkinnedAlphaProgram;
extern LLGLSLShader gDeferredBumpProgram;
extern LLGLSLShader gDeferredTerrainProgram;
extern LLGLSLShader gDeferredTreeProgram;
+extern LLGLSLShader gDeferredTreeShadowProgram;
extern LLGLSLShader gDeferredLightProgram;
extern LLGLSLShader gDeferredMultiLightProgram;
extern LLGLSLShader gDeferredSpotLightProgram;
extern LLGLSLShader gDeferredMultiSpotLightProgram;
extern LLGLSLShader gDeferredSunProgram;
-extern LLGLSLShader gDeferredGIProgram;
-extern LLGLSLShader gDeferredGIFinalProgram;
extern LLGLSLShader gDeferredBlurLightProgram;
extern LLGLSLShader gDeferredAvatarProgram;
extern LLGLSLShader gDeferredSoftenProgram;
extern LLGLSLShader gDeferredShadowProgram;
extern LLGLSLShader gDeferredShadowAlphaMaskProgram;
-extern LLGLSLShader gDeferredPostGIProgram;
extern LLGLSLShader gDeferredPostProgram;
+extern LLGLSLShader gDeferredCoFProgram;
+extern LLGLSLShader gDeferredDoFCombineProgram;
+extern LLGLSLShader gFXAAProgram;
extern LLGLSLShader gDeferredPostNoDoFProgram;
extern LLGLSLShader gDeferredAvatarShadowProgram;
extern LLGLSLShader gDeferredAttachmentShadowProgram;
extern LLGLSLShader gDeferredAlphaProgram;
extern LLGLSLShader gDeferredFullbrightProgram;
+extern LLGLSLShader gDeferredEmissiveProgram;
extern LLGLSLShader gDeferredAvatarEyesProgram;
extern LLGLSLShader gDeferredAvatarAlphaProgram;
extern LLGLSLShader gDeferredWLSkyProgram;
extern LLGLSLShader gDeferredWLCloudProgram;
extern LLGLSLShader gDeferredStarProgram;
-extern LLGLSLShader gLuminanceGatherProgram;
-
-//current avatar shader parameter pointer
-extern GLint gAvatarMatrixParam;
-
+extern LLGLSLShader gNormalMapGenProgram;
#endif
diff --git a/indra/newview/llviewerstats.cpp b/indra/newview/llviewerstats.cpp
index 0fb94bc44b..c88122f22c 100644
--- a/indra/newview/llviewerstats.cpp
+++ b/indra/newview/llviewerstats.cpp
@@ -854,7 +854,7 @@ void send_stats()
body["DisplayNamesEnabled"] = gSavedSettings.getBOOL("UseDisplayNames");
body["DisplayNamesShowUsername"] = gSavedSettings.getBOOL("NameTagShowUsernames");
- body["MinimalSkin"] = !gSavedSettings.getString("SessionSettingsFile").empty();
+ body["MinimalSkin"] = false;
LLViewerStats::getInstance()->addToMessage(body);
LLHTTPClient::post(url, body, new ViewerStatsResponder());
diff --git a/indra/newview/llviewertexteditor.cpp b/indra/newview/llviewertexteditor.cpp
index 4798bb536f..b41ed00f17 100644
--- a/indra/newview/llviewertexteditor.cpp
+++ b/indra/newview/llviewertexteditor.cpp
@@ -32,6 +32,7 @@
#include "llaudioengine.h"
#include "llavataractions.h"
#include "llfloaterreg.h"
+#include "llfloatersidepanelcontainer.h"
#include "llfloaterworldmap.h"
#include "llfocusmgr.h"
#include "llinventorybridge.h"
@@ -50,7 +51,6 @@
#include "llpreviewtexture.h"
#include "llscrollbar.h"
#include "llscrollcontainer.h"
-#include "llsidetray.h"
#include "lltooldraganddrop.h"
#include "lltooltip.h"
#include "lltrans.h"
@@ -80,7 +80,7 @@ public:
LLSD key;
key["type"] = "landmark";
key["id"] = landmark_inv_id;
- LLSideTray::getInstance()->showPanel("panel_places", key);
+ LLFloaterSidePanelContainer::showPanel("places", key);
}
static void processForeignLandmark(LLLandmark* landmark,
const LLUUID& object_id, const LLUUID& notecard_inventory_id,
@@ -88,12 +88,12 @@ public:
{
LLVector3d global_pos;
landmark->getGlobalPos(global_pos);
- LLViewerInventoryItem* agent_lanmark =
+ LLViewerInventoryItem* agent_landmark =
LLLandmarkActions::findLandmarkForGlobalPos(global_pos);
- if (agent_lanmark)
+ if (agent_landmark)
{
- showInfo(agent_lanmark->getUUID());
+ showInfo(agent_landmark->getUUID());
}
else
{
@@ -104,8 +104,13 @@ public:
}
else
{
+ LLInventoryItem* item = item_ptr.get();
LLPointer<LLEmbeddedLandmarkCopied> cb = new LLEmbeddedLandmarkCopied();
- copy_inventory_from_notecard(object_id, notecard_inventory_id, item_ptr.get(), gInventoryCallbacks.registerCB(cb));
+ copy_inventory_from_notecard(get_folder_by_itemtype(item),
+ object_id,
+ notecard_inventory_id,
+ item,
+ gInventoryCallbacks.registerCB(cb));
}
}
}
@@ -1266,9 +1271,11 @@ bool LLViewerTextEditor::importStream(std::istream& str)
void LLViewerTextEditor::copyInventory(const LLInventoryItem* item, U32 callback_id)
{
- copy_inventory_from_notecard(mObjectID,
+ copy_inventory_from_notecard(LLUUID::null, // Don't specify a destination -- let the sim do that
+ mObjectID,
mNotecardInventoryID,
- item, callback_id);
+ item,
+ callback_id);
}
bool LLViewerTextEditor::hasEmbeddedInventory()
diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp
index 280337be0f..61236edc86 100644
--- a/indra/newview/llviewertexture.cpp
+++ b/indra/newview/llviewertexture.cpp
@@ -417,6 +417,64 @@ const S32 min_non_tex_system_mem = (128<<20); // 128 MB
F32 texmem_lower_bound_scale = 0.85f;
F32 texmem_middle_bound_scale = 0.925f;
+static LLFastTimer::DeclareTimer FTM_TEXTURE_MEMORY_CHECK("Memory Check");
+
+//static
+bool LLViewerTexture::isMemoryForTextureLow()
+{
+ const F32 WAIT_TIME = 1.0f ; //second
+ static LLFrameTimer timer ;
+
+ if(timer.getElapsedTimeF32() < WAIT_TIME) //call this once per second.
+ {
+ return false;
+ }
+ timer.reset() ;
+
+ LLFastTimer t(FTM_TEXTURE_MEMORY_CHECK);
+
+ const S32 MIN_FREE_TEXTURE_MEMORY = 5 ; //MB
+ const S32 MIN_FREE_MAIN_MEMORy = 100 ; //MB
+
+ bool low_mem = false ;
+ if (gGLManager.mHasATIMemInfo)
+ {
+ S32 meminfo[4];
+ glGetIntegerv(GL_TEXTURE_FREE_MEMORY_ATI, meminfo);
+
+ if(meminfo[0] / 1024 < MIN_FREE_TEXTURE_MEMORY)
+ {
+ low_mem = true ;
+ }
+
+ if(!low_mem) //check main memory, only works for windows.
+ {
+ LLMemory::updateMemoryInfo() ;
+ if(LLMemory::getAvailableMemKB() / 1024 < MIN_FREE_MAIN_MEMORy)
+ {
+ low_mem = true ;
+ }
+ }
+ }
+#if 0 //ignore nVidia cards
+ else if (gGLManager.mHasNVXMemInfo)
+ {
+ S32 free_memory;
+ glGetIntegerv(GL_GPU_MEMORY_INFO_CURRENT_AVAILABLE_VIDMEM_NVX, &free_memory);
+
+ if(free_memory / 1024 < MIN_FREE_TEXTURE_MEMORY)
+ {
+ low_mem = true ;
+ }
+ }
+#endif
+
+ return low_mem ;
+}
+
+static LLFastTimer::DeclareTimer FTM_TEXTURE_UPDATE_MEDIA("Media");
+static LLFastTimer::DeclareTimer FTM_TEXTURE_UPDATE_TEST("Test");
+
//static
void LLViewerTexture::updateClass(const F32 velocity, const F32 angular_velocity)
{
@@ -425,9 +483,14 @@ void LLViewerTexture::updateClass(const F32 velocity, const F32 angular_velocity
LLTexturePipelineTester* tester = (LLTexturePipelineTester*)LLMetricPerformanceTesterBasic::getTester(sTesterName);
if (tester)
{
+ LLFastTimer t(FTM_TEXTURE_UPDATE_TEST);
tester->update() ;
}
- LLViewerMediaTexture::updateClass() ;
+
+ {
+ LLFastTimer t(FTM_TEXTURE_UPDATE_MEDIA);
+ LLViewerMediaTexture::updateClass() ;
+ }
sBoundTextureMemoryInBytes = LLImageGL::sBoundTextureMemoryInBytes;//in bytes
sTotalTextureMemoryInBytes = LLImageGL::sGlobalTextureMemoryInBytes;//in bytes
@@ -449,6 +512,11 @@ void LLViewerTexture::updateClass(const F32 velocity, const F32 angular_velocity
sEvaluationTimer.reset();
}
}
+ else if(sEvaluationTimer.getElapsedTimeF32() > discard_delta_time && isMemoryForTextureLow())
+ {
+ sDesiredDiscardBias += discard_bias_delta;
+ sEvaluationTimer.reset();
+ }
else if (sDesiredDiscardBias > 0.0f &&
BYTES_TO_MEGA_BYTES(sBoundTextureMemoryInBytes) < sMaxBoundTextureMemInMegaBytes * texmem_lower_bound_scale &&
BYTES_TO_MEGA_BYTES(sTotalTextureMemoryInBytes) < sMaxTotalTextureMemInMegaBytes * texmem_lower_bound_scale)
@@ -2222,6 +2290,7 @@ void LLViewerFetchedTexture::unpauseLoadedCallbacks(const LLLoadedCallbackEntry:
}
}
mPauseLoadedCallBacks = FALSE ;
+ mLastCallBackActiveTime = sCurrentTime ;
if(need_raw)
{
mSaveRawImage = TRUE ;
@@ -2261,13 +2330,18 @@ void LLViewerFetchedTexture::pauseLoadedCallbacks(const LLLoadedCallbackEntry::s
bool LLViewerFetchedTexture::doLoadedCallbacks()
{
- static const F32 MAX_INACTIVE_TIME = 120.f ; //seconds
+ static const F32 MAX_INACTIVE_TIME = 900.f ; //seconds
if (mNeedsCreateTexture)
{
return false;
}
- if(sCurrentTime - mLastCallBackActiveTime > MAX_INACTIVE_TIME)
+ if(mPauseLoadedCallBacks)
+ {
+ destroyRawImage();
+ return false; //paused
+ }
+ if(sCurrentTime - mLastCallBackActiveTime > MAX_INACTIVE_TIME && !mIsFetching)
{
clearCallbackEntryList() ; //remove all callbacks.
return false ;
@@ -2290,12 +2364,8 @@ bool LLViewerFetchedTexture::doLoadedCallbacks()
// Remove ourself from the global list of textures with callbacks
gTextureList.mCallbackList.erase(this);
- }
- if(mPauseLoadedCallBacks)
- {
- destroyRawImage();
- return res; //paused
- }
+ return false ;
+ }
S32 gl_discard = getDiscardLevel();
@@ -2557,7 +2627,11 @@ bool LLViewerFetchedTexture::needsToSaveRawImage()
void LLViewerFetchedTexture::destroyRawImage()
{
- if (mAuxRawImage.notNull()) sAuxCount--;
+ if (mAuxRawImage.notNull())
+ {
+ sAuxCount--;
+ mAuxRawImage = NULL;
+ }
if (mRawImage.notNull())
{
@@ -2571,12 +2645,12 @@ void LLViewerFetchedTexture::destroyRawImage()
}
setCachedRawImage() ;
}
+
+ mRawImage = NULL;
+
+ mIsRawImageValid = FALSE;
+ mRawDiscardLevel = INVALID_DISCARD_LEVEL;
}
-
- mRawImage = NULL;
- mAuxRawImage = NULL;
- mIsRawImageValid = FALSE;
- mRawDiscardLevel = INVALID_DISCARD_LEVEL;
}
//use the mCachedRawImage to (re)generate the gl texture.
@@ -3089,8 +3163,13 @@ void LLViewerLODTexture::processTextureStats()
S32 current_discard = getDiscardLevel();
if (sDesiredDiscardBias > 0.0f && mBoostLevel < LLViewerTexture::BOOST_SCULPTED && current_discard >= 0)
{
+ if(desired_discard_bias_max <= sDesiredDiscardBias && !mForceToSaveRawImage)
+ {
+ //needs to release texture memory urgently
+ scaleDown() ;
+ }
// Limit the amount of GL memory bound each frame
- if ( BYTES_TO_MEGA_BYTES(sBoundTextureMemoryInBytes) > sMaxBoundTextureMemInMegaBytes * texmem_middle_bound_scale &&
+ else if ( BYTES_TO_MEGA_BYTES(sBoundTextureMemoryInBytes) > sMaxBoundTextureMemInMegaBytes * texmem_middle_bound_scale &&
(!getBoundRecently() || mDesiredDiscardLevel >= mCachedRawDiscardLevel))
{
scaleDown() ;
diff --git a/indra/newview/llviewertexture.h b/indra/newview/llviewertexture.h
index a4a5ae0a5b..b96441127d 100644
--- a/indra/newview/llviewertexture.h
+++ b/indra/newview/llviewertexture.h
@@ -267,6 +267,7 @@ private:
/*virtual*/ LLImageGL* getGLTexture() const ;
virtual void switchToCachedImage();
+ static bool isMemoryForTextureLow() ;
protected:
LLUUID mID;
S32 mBoostLevel; // enum describing priority level
diff --git a/indra/newview/llviewertexturelist.cpp b/indra/newview/llviewertexturelist.cpp
index 30ef8b8a29..089f45ca89 100644
--- a/indra/newview/llviewertexturelist.cpp
+++ b/indra/newview/llviewertexturelist.cpp
@@ -530,9 +530,12 @@ void LLViewerTextureList::removeImageFromList(LLViewerFetchedTexture *image)
}
llerrs << "LLViewerTextureList::removeImageFromList - Image not in list" << llendl;
}
- if(mImageList.erase(image) != 1)
+
+ S32 count = mImageList.erase(image) ;
+ if(count != 1)
{
- llerrs << "Error happens when remove image from mImageList!" << llendl ;
+ llinfos << image->getID() << llendl ;
+ llerrs << "Error happens when remove image from mImageList: " << count << llendl ;
}
image->setInImageList(FALSE) ;
@@ -586,6 +589,11 @@ void LLViewerTextureList::dirtyImage(LLViewerFetchedTexture *image)
////////////////////////////////////////////////////////////////////////////
static LLFastTimer::DeclareTimer FTM_IMAGE_MARK_DIRTY("Dirty Images");
+static LLFastTimer::DeclareTimer FTM_IMAGE_UPDATE_PRIORITIES("Prioritize");
+static LLFastTimer::DeclareTimer FTM_IMAGE_CALLBACKS("Callbacks");
+static LLFastTimer::DeclareTimer FTM_IMAGE_FETCH("Fetch");
+static LLFastTimer::DeclareTimer FTM_IMAGE_CREATE("Create");
+static LLFastTimer::DeclareTimer FTM_IMAGE_STATS("Stats");
void LLViewerTextureList::updateImages(F32 max_time)
{
@@ -597,14 +605,25 @@ void LLViewerTextureList::updateImages(F32 max_time)
LLViewerStats::getInstance()->mGLBoundMemStat.addValue((F32)BYTES_TO_MEGA_BYTES(LLImageGL::sBoundTextureMemoryInBytes));
LLViewerStats::getInstance()->mRawMemStat.addValue((F32)BYTES_TO_MEGA_BYTES(LLImageRaw::sGlobalRawMemory));
LLViewerStats::getInstance()->mFormattedMemStat.addValue((F32)BYTES_TO_MEGA_BYTES(LLImageFormatted::sGlobalFormattedMemory));
-
- updateImagesDecodePriorities();
+
+
+ {
+ LLFastTimer t(FTM_IMAGE_UPDATE_PRIORITIES);
+ updateImagesDecodePriorities();
+ }
F32 total_max_time = max_time;
- max_time -= updateImagesFetchTextures(max_time);
+
+ {
+ LLFastTimer t(FTM_IMAGE_FETCH);
+ max_time -= updateImagesFetchTextures(max_time);
+ }
- max_time = llmax(max_time, total_max_time*.50f); // at least 50% of max_time
- max_time -= updateImagesCreateTextures(max_time);
+ {
+ LLFastTimer t(FTM_IMAGE_CREATE);
+ max_time = llmax(max_time, total_max_time*.50f); // at least 50% of max_time
+ max_time -= updateImagesCreateTextures(max_time);
+ }
if (!mDirtyTextureList.empty())
{
@@ -612,24 +631,32 @@ void LLViewerTextureList::updateImages(F32 max_time)
gPipeline.dirtyPoolObjectTextures(mDirtyTextureList);
mDirtyTextureList.clear();
}
- bool didone = false;
- for (image_list_t::iterator iter = mCallbackList.begin();
- iter != mCallbackList.end(); )
+
{
- //trigger loaded callbacks on local textures immediately
- LLViewerFetchedTexture* image = *iter++;
- if (!image->getUrl().empty())
+ LLFastTimer t(FTM_IMAGE_CALLBACKS);
+ bool didone = false;
+ for (image_list_t::iterator iter = mCallbackList.begin();
+ iter != mCallbackList.end(); )
{
- // Do stuff to handle callbacks, update priorities, etc.
- didone = image->doLoadedCallbacks();
- }
- else if (!didone)
- {
- // Do stuff to handle callbacks, update priorities, etc.
- didone = image->doLoadedCallbacks();
+ //trigger loaded callbacks on local textures immediately
+ LLViewerFetchedTexture* image = *iter++;
+ if (!image->getUrl().empty())
+ {
+ // Do stuff to handle callbacks, update priorities, etc.
+ didone = image->doLoadedCallbacks();
+ }
+ else if (!didone)
+ {
+ // Do stuff to handle callbacks, update priorities, etc.
+ didone = image->doLoadedCallbacks();
+ }
}
}
- updateImagesUpdateStats();
+
+ {
+ LLFastTimer t(FTM_IMAGE_STATS);
+ updateImagesUpdateStats();
+ }
}
void LLViewerTextureList::updateImagesDecodePriorities()
@@ -747,7 +774,6 @@ void LLViewerTextureList::updateImagesDecodePriorities()
return type_from_host;
}
*/
-static LLFastTimer::DeclareTimer FTM_IMAGE_CREATE("Create Images");
F32 LLViewerTextureList::updateImagesCreateTextures(F32 max_time)
{
@@ -757,8 +783,7 @@ F32 LLViewerTextureList::updateImagesCreateTextures(F32 max_time)
// Create GL textures for all textures that need them (images which have been
// decoded, but haven't been pushed into GL).
//
- LLFastTimer t(FTM_IMAGE_CREATE);
-
+
LLTimer create_timer;
image_list_t::iterator enditer = mCreateTextureList.begin();
for (image_list_t::iterator iter = mCreateTextureList.begin();
@@ -895,6 +920,8 @@ void LLViewerTextureList::decodeAllImages(F32 max_time)
image_list.push_back(imagep);
imagep->setInImageList(FALSE) ;
}
+
+ llassert_always(image_list.size() == mImageList.size()) ;
mImageList.clear();
for (std::vector<LLPointer<LLViewerFetchedTexture> >::iterator iter = image_list.begin();
iter != image_list.end(); ++iter)
@@ -1053,6 +1080,13 @@ S32 LLViewerTextureList::getMaxVideoRamSetting(bool get_recommended)
// Treat any card with < 32 MB (shudder) as having 32 MB
// - it's going to be swapping constantly regardless
S32 max_vram = gGLManager.mVRAM;
+
+ if(gGLManager.mIsATI)
+ {
+ //shrink the availabe vram for ATI cards because some of them do not handel texture swapping well.
+ max_vram = (S32)(max_vram * 0.75f);
+ }
+
max_vram = llmax(max_vram, getMinVideoRamSetting());
max_texmem = max_vram;
if (!get_recommended)
@@ -1060,10 +1094,19 @@ S32 LLViewerTextureList::getMaxVideoRamSetting(bool get_recommended)
}
else
{
- if (get_recommended)
- max_texmem = 128;
- else
+ if (!get_recommended)
+ {
+ max_texmem = 512;
+ }
+ else if (gSavedSettings.getBOOL("NoHardwareProbe")) //did not do hardware detection at startup
+ {
max_texmem = 512;
+ }
+ else
+ {
+ max_texmem = 128;
+ }
+
llwarns << "VRAM amount not detected, defaulting to " << max_texmem << " MB" << llendl;
}
@@ -1342,7 +1385,8 @@ LLUIImagePtr LLUIImageList::getUIImageByID(const LLUUID& image_id, S32 priority)
const BOOL use_mips = FALSE;
const LLRect scale_rect = LLRect::null;
- return loadUIImageByID(image_id, use_mips, scale_rect, (LLViewerTexture::EBoostLevel)priority);
+ const LLRect clip_rect = LLRect::null;
+ return loadUIImageByID(image_id, use_mips, scale_rect, clip_rect, (LLViewerTexture::EBoostLevel)priority);
}
LLUIImagePtr LLUIImageList::getUIImage(const std::string& image_name, S32 priority)
@@ -1356,32 +1400,33 @@ LLUIImagePtr LLUIImageList::getUIImage(const std::string& image_name, S32 priori
const BOOL use_mips = FALSE;
const LLRect scale_rect = LLRect::null;
- return loadUIImageByName(image_name, image_name, use_mips, scale_rect, (LLViewerTexture::EBoostLevel)priority);
+ const LLRect clip_rect = LLRect::null;
+ return loadUIImageByName(image_name, image_name, use_mips, scale_rect, clip_rect, (LLViewerTexture::EBoostLevel)priority);
}
LLUIImagePtr LLUIImageList::loadUIImageByName(const std::string& name, const std::string& filename,
- BOOL use_mips, const LLRect& scale_rect, LLViewerTexture::EBoostLevel boost_priority )
+ BOOL use_mips, const LLRect& scale_rect, const LLRect& clip_rect, LLViewerTexture::EBoostLevel boost_priority )
{
if (boost_priority == LLViewerTexture::BOOST_NONE)
{
boost_priority = LLViewerTexture::BOOST_UI;
}
LLViewerFetchedTexture* imagep = LLViewerTextureManager::getFetchedTextureFromFile(filename, MIPMAP_NO, boost_priority);
- return loadUIImage(imagep, name, use_mips, scale_rect);
+ return loadUIImage(imagep, name, use_mips, scale_rect, clip_rect);
}
LLUIImagePtr LLUIImageList::loadUIImageByID(const LLUUID& id,
- BOOL use_mips, const LLRect& scale_rect, LLViewerTexture::EBoostLevel boost_priority)
+ BOOL use_mips, const LLRect& scale_rect, const LLRect& clip_rect, LLViewerTexture::EBoostLevel boost_priority)
{
if (boost_priority == LLViewerTexture::BOOST_NONE)
{
boost_priority = LLViewerTexture::BOOST_UI;
}
LLViewerFetchedTexture* imagep = LLViewerTextureManager::getFetchedTexture(id, MIPMAP_NO, boost_priority);
- return loadUIImage(imagep, id.asString(), use_mips, scale_rect);
+ return loadUIImage(imagep, id.asString(), use_mips, scale_rect, clip_rect);
}
-LLUIImagePtr LLUIImageList::loadUIImage(LLViewerFetchedTexture* imagep, const std::string& name, BOOL use_mips, const LLRect& scale_rect)
+LLUIImagePtr LLUIImageList::loadUIImage(LLViewerFetchedTexture* imagep, const std::string& name, BOOL use_mips, const LLRect& scale_rect, const LLRect& clip_rect)
{
if (!imagep) return NULL;
@@ -1402,13 +1447,14 @@ LLUIImagePtr LLUIImageList::loadUIImage(LLViewerFetchedTexture* imagep, const st
LLUIImageLoadData* datap = new LLUIImageLoadData;
datap->mImageName = name;
datap->mImageScaleRegion = scale_rect;
+ datap->mImageClipRegion = clip_rect;
imagep->setLoadedCallback(onUIImageLoaded, 0, FALSE, FALSE, datap, NULL);
}
return new_imagep;
}
-LLUIImagePtr LLUIImageList::preloadUIImage(const std::string& name, const std::string& filename, BOOL use_mips, const LLRect& scale_rect)
+LLUIImagePtr LLUIImageList::preloadUIImage(const std::string& name, const std::string& filename, BOOL use_mips, const LLRect& scale_rect, const LLRect& clip_rect)
{
// look for existing image
uuid_ui_image_map_t::iterator found_it = mUIImages.find(name);
@@ -1418,7 +1464,7 @@ LLUIImagePtr LLUIImageList::preloadUIImage(const std::string& name, const std::s
llerrs << "UI Image " << name << " already loaded." << llendl;
}
- return loadUIImageByName(name, filename, use_mips, scale_rect);
+ return loadUIImageByName(name, filename, use_mips, scale_rect, clip_rect);
}
//static
@@ -1432,6 +1478,7 @@ void LLUIImageList::onUIImageLoaded( BOOL success, LLViewerFetchedTexture *src_v
LLUIImageLoadData* image_datap = (LLUIImageLoadData*)user_data;
std::string ui_image_name = image_datap->mImageName;
LLRect scale_rect = image_datap->mImageScaleRegion;
+ LLRect clip_rect = image_datap->mImageClipRegion;
if (final)
{
delete image_datap;
@@ -1448,9 +1495,21 @@ void LLUIImageList::onUIImageLoaded( BOOL success, LLViewerFetchedTexture *src_v
// from power-of-2 gl image
if (success && imagep.notNull() && src_vi && (src_vi->getUrl().compare(0, 7, "file://")==0))
{
- F32 clip_x = (F32)src_vi->getOriginalWidth() / (F32)src_vi->getFullWidth();
- F32 clip_y = (F32)src_vi->getOriginalHeight() / (F32)src_vi->getFullHeight();
- imagep->setClipRegion(LLRectf(0.f, clip_y, clip_x, 0.f));
+ F32 full_width = (F32)src_vi->getFullWidth();
+ F32 full_height = (F32)src_vi->getFullHeight();
+ F32 clip_x = (F32)src_vi->getOriginalWidth() / full_width;
+ F32 clip_y = (F32)src_vi->getOriginalHeight() / full_height;
+ if (clip_rect != LLRect::null)
+ {
+ imagep->setClipRegion(LLRectf(llclamp((F32)clip_rect.mLeft / full_width, 0.f, 1.f),
+ llclamp((F32)clip_rect.mTop / full_height, 0.f, 1.f),
+ llclamp((F32)clip_rect.mRight / full_width, 0.f, 1.f),
+ llclamp((F32)clip_rect.mBottom / full_height, 0.f, 1.f)));
+ }
+ else
+ {
+ imagep->setClipRegion(LLRectf(0.f, clip_y, clip_x, 0.f));
+ }
if (scale_rect != LLRect::null)
{
imagep->setScaleRegion(
@@ -1471,6 +1530,7 @@ struct UIImageDeclaration : public LLInitParam::Block<UIImageDeclaration>
Optional<std::string> file_name;
Optional<bool> preload;
Optional<LLRect> scale;
+ Optional<LLRect> clip;
Optional<bool> use_mips;
UIImageDeclaration()
@@ -1478,6 +1538,7 @@ struct UIImageDeclaration : public LLInitParam::Block<UIImageDeclaration>
file_name("file_name"),
preload("preload", false),
scale("scale"),
+ clip("clip"),
use_mips("use_mips", false)
{}
};
@@ -1572,7 +1633,7 @@ bool LLUIImageList::initFromFile()
{
continue;
}
- preloadUIImage(image.name, file_name, image.use_mips, image.scale);
+ preloadUIImage(image.name, file_name, image.use_mips, image.scale, image.clip);
}
if (cur_pass == PASS_DECODE_NOW && !gSavedSettings.getBOOL("NoPreload"))
diff --git a/indra/newview/llviewertexturelist.h b/indra/newview/llviewertexturelist.h
index 7f4dd0ae88..e0a362596d 100644
--- a/indra/newview/llviewertexturelist.h
+++ b/indra/newview/llviewertexturelist.h
@@ -220,24 +220,27 @@ public:
bool initFromFile();
- LLPointer<LLUIImage> preloadUIImage(const std::string& name, const std::string& filename, BOOL use_mips, const LLRect& scale_rect);
+ LLPointer<LLUIImage> preloadUIImage(const std::string& name, const std::string& filename, BOOL use_mips, const LLRect& scale_rect, const LLRect& clip_rect);
static void onUIImageLoaded( BOOL success, LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* src_aux, S32 discard_level, BOOL final, void* userdata );
private:
LLPointer<LLUIImage> loadUIImageByName(const std::string& name, const std::string& filename,
BOOL use_mips = FALSE, const LLRect& scale_rect = LLRect::null,
+ const LLRect& clip_rect = LLRect::null,
LLViewerTexture::EBoostLevel boost_priority = LLViewerTexture::BOOST_UI);
LLPointer<LLUIImage> loadUIImageByID(const LLUUID& id,
BOOL use_mips = FALSE, const LLRect& scale_rect = LLRect::null,
+ const LLRect& clip_rect = LLRect::null,
LLViewerTexture::EBoostLevel boost_priority = LLViewerTexture::BOOST_UI);
- LLPointer<LLUIImage> loadUIImage(LLViewerFetchedTexture* imagep, const std::string& name, BOOL use_mips = FALSE, const LLRect& scale_rect = LLRect::null);
+ LLPointer<LLUIImage> loadUIImage(LLViewerFetchedTexture* imagep, const std::string& name, BOOL use_mips = FALSE, const LLRect& scale_rect = LLRect::null, const LLRect& clip_rect = LLRect::null);
struct LLUIImageLoadData
{
std::string mImageName;
LLRect mImageScaleRegion;
+ LLRect mImageClipRegion;
};
typedef std::map< std::string, LLPointer<LLUIImage> > uuid_ui_image_map_t;
diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp
index a7f4209e69..e0653fec30 100644
--- a/indra/newview/llviewerwindow.cpp
+++ b/indra/newview/llviewerwindow.cpp
@@ -36,6 +36,7 @@
#include <iostream>
#include <fstream>
#include <algorithm>
+#include <boost/lambda/core.hpp>
#include "llagent.h"
#include "llagentcamera.h"
@@ -84,6 +85,7 @@
// newview includes
#include "llagent.h"
#include "llbox.h"
+#include "llchicletbar.h"
#include "llconsole.h"
#include "llviewercontrol.h"
#include "llcylinder.h"
@@ -128,11 +130,11 @@
#include "llmorphview.h"
#include "llmoveview.h"
#include "llnavigationbar.h"
+#include "llpaneltopinfobar.h"
#include "llpopupview.h"
#include "llpreviewtexture.h"
#include "llprogressview.h"
#include "llresmgr.h"
-#include "llsidetray.h"
#include "llselectmgr.h"
#include "llrootview.h"
#include "llrendersphere.h"
@@ -147,6 +149,7 @@
#include "lltexturefetch.h"
#include "lltextureview.h"
#include "lltool.h"
+#include "lltoolbarview.h"
#include "lltoolcomp.h"
#include "lltooldraganddrop.h"
#include "lltoolface.h"
@@ -186,7 +189,6 @@
#include "llviewerjoystick.h"
#include "llviewernetwork.h"
#include "llpostprocess.h"
-#include "llbottomtray.h"
#include "llnearbychatbar.h"
#include "llagentui.h"
#include "llwearablelist.h"
@@ -198,6 +200,7 @@
#include "llfloaternotificationsconsole.h"
#include "llnearbychat.h"
+#include "llwindowlistener.h"
#include "llviewerwindowlistener.h"
#include "llpaneltopinfobar.h"
@@ -487,6 +490,7 @@ public:
{
F32 cost = 0.f;
S32 count = 0;
+ S32 vcount = 0;
S32 object_count = 0;
S32 total_bytes = 0;
S32 visible_bytes = 0;
@@ -508,7 +512,9 @@ public:
S32 bytes = 0;
S32 visible = 0;
cost += object->getStreamingCost(&bytes, &visible);
- count += object->getTriangleCount();
+ S32 vt = 0;
+ count += object->getTriangleCount(&vt);
+ vcount += vt;
total_bytes += bytes;
visible_bytes += visible;
}
@@ -519,20 +525,20 @@ public:
{
label = "Selection";
cost = LLSelectMgr::getInstance()->getSelection()->getSelectedObjectStreamingCost(&total_bytes, &visible_bytes);
- count = LLSelectMgr::getInstance()->getSelection()->getSelectedObjectTriangleCount();
+ count = LLSelectMgr::getInstance()->getSelection()->getSelectedObjectTriangleCount(&vcount);
object_count = LLSelectMgr::getInstance()->getSelection()->getObjectCount();
}
addText(xpos,ypos, llformat("%s streaming cost: %.1f", label, cost));
ypos += y_inc;
- addText(xpos, ypos, llformat(" %.3f KTris, %.1f/%.1f KB, %d objects",
- count/1000.f, visible_bytes/1024.f, total_bytes/1024.f, object_count));
+ addText(xpos, ypos, llformat(" %.3f KTris, %.3f KVerts, %.1f/%.1f KB, %d objects",
+ count/1000.f, vcount/1000.f, visible_bytes/1024.f, total_bytes/1024.f, object_count));
ypos += y_inc;
}
- addText(xpos, ypos, llformat("%d MB Vertex Data", LLVertexBuffer::sAllocatedBytes/(1024*1024)));
+ addText(xpos, ypos, llformat("%d MB Vertex Data (%d MB Pooled)", LLVertexBuffer::sAllocatedBytes/(1024*1024), LLVBOPool::sBytesPooled/(1024*1024)));
ypos += y_inc;
addText(xpos, ypos, llformat("%d Vertex Buffers", LLVertexBuffer::sGLCount));
@@ -607,7 +613,9 @@ public:
addText(xpos, ypos, llformat("%d/%d Mesh HTTP Requests/Retries", LLMeshRepository::sHTTPRequestCount,
LLMeshRepository::sHTTPRetryCount));
-
+ ypos += y_inc;
+
+ addText(xpos, ypos, llformat("%d/%d Mesh LOD Pending/Processing", LLMeshRepository::sLODPending, LLMeshRepository::sLODProcessing));
ypos += y_inc;
addText(xpos, ypos, llformat("%.3f/%.3f MB Mesh Cache Read/Write ", LLMeshRepository::sCacheBytesRead/(1024.f*1024.f), LLMeshRepository::sCacheBytesWritten/(1024.f*1024.f)));
@@ -735,37 +743,6 @@ public:
}
}
- //temporary hack to give feedback on mesh upload progress
- if (!gMeshRepo.mUploads.empty())
- {
- for (std::vector<LLMeshUploadThread*>::iterator iter = gMeshRepo.mUploads.begin();
- iter != gMeshRepo.mUploads.end(); ++iter)
- {
- LLMeshUploadThread* thread = *iter;
-
- addText(xpos, ypos, llformat("Mesh Uploads: %d",
- thread->mPendingUploads));
- ypos += y_inc;
- }
- }
-
- if (!gMeshRepo.mPendingRequests.empty() ||
- !gMeshRepo.mThread->mHeaderReqQ.empty() ||
- !gMeshRepo.mThread->mLODReqQ.empty())
- {
- LLMutexLock lock(gMeshRepo.mThread->mMutex);
- S32 pending = (S32) gMeshRepo.mPendingRequests.size();
- S32 header = (S32) gMeshRepo.mThread->mHeaderReqQ.size();
- S32 lod = (S32) gMeshRepo.mThread->mLODReqQ.size();
-
- addText(xpos, ypos, llformat ("Mesh Queue - %d pending (%d:%d header | %d:%d LOD)",
- pending,
- LLMeshRepoThread::sActiveHeaderRequests, header,
- LLMeshRepoThread::sActiveLODRequests, lod));
-
- ypos += y_inc;
- }
-
if (gSavedSettings.getBOOL("DebugShowTextureInfo"))
{
LLViewerObject* objectp = NULL ;
@@ -836,6 +813,20 @@ void LLViewerWindow::updateDebugText()
// LLViewerWindow
//
+LLViewerWindow::Params::Params()
+: title("title"),
+ name("name"),
+ x("x"),
+ y("y"),
+ width("width"),
+ height("height"),
+ min_width("min_width"),
+ min_height("min_height"),
+ fullscreen("fullscreen", false),
+ ignore_pixel_depth("ignore_pixel_depth", false)
+{}
+
+
BOOL LLViewerWindow::handleAnyMouseClick(LLWindow *window, LLCoordGL pos, MASK mask, LLMouseHandler::EClickType clicktype, BOOL down)
{
const char* buttonname = "";
@@ -938,6 +929,11 @@ BOOL LLViewerWindow::handleAnyMouseClick(LLWindow *window, LLCoordGL pos, MASK
// }
//}
+ // Mark the click as handled and return if we aren't within the root view to avoid spurious bugs
+ if( !mRootView->pointInView(x, y) )
+ {
+ return TRUE;
+ }
// Give the UI views a chance to process the click
if( mRootView->handleAnyMouseClick(x, y, mask, clicktype, down) )
{
@@ -1212,7 +1208,8 @@ void LLViewerWindow::handleMouseMove(LLWindow *window, LLCoordGL pos, MASK mask
mWindow->showCursorFromMouseMove();
- if (gAwayTimer.getElapsedTimeF32() > LLAgent::MIN_AFK_TIME)
+ if (gAwayTimer.getElapsedTimeF32() > LLAgent::MIN_AFK_TIME
+ && !gDisconnected)
{
gAgent.clearAFK();
}
@@ -1339,7 +1336,7 @@ BOOL LLViewerWindow::handleActivate(LLWindow *window, BOOL activated)
{
if (activated)
{
- mActive = TRUE;
+ mActive = true;
send_agent_resume();
gAgent.clearAFK();
@@ -1348,7 +1345,7 @@ BOOL LLViewerWindow::handleActivate(LLWindow *window, BOOL activated)
}
else
{
- mActive = FALSE;
+ mActive = false;
// if the user has chosen to go Away automatically after some time, then go Away when minimizing
if (gSavedSettings.getS32("AFKTimeout"))
@@ -1524,17 +1521,13 @@ std::string LLViewerWindow::translateString(const char* tag,
//
// Classes
//
-LLViewerWindow::LLViewerWindow(
- const std::string& title, const std::string& name,
- S32 x, S32 y,
- S32 width, S32 height,
- BOOL fullscreen, BOOL ignore_pixel_depth) // fullscreen is no longer used
- :
- mWindow(NULL),
- mActive(TRUE),
- mWindowRectRaw(0, height, width, 0),
- mWindowRectScaled(0, height, width, 0),
- mWorldViewRectRaw(0, height, width, 0),
+LLViewerWindow::LLViewerWindow(const Params& p)
+: mWindow(NULL),
+ mActive(true),
+ mUIVisible(true),
+ mWindowRectRaw(0, p.height, p.width, 0),
+ mWindowRectScaled(0, p.height, p.width, 0),
+ mWorldViewRectRaw(0, p.height, p.width, 0),
mLeftMouseDown(FALSE),
mMiddleMouseDown(FALSE),
mRightMouseDown(FALSE),
@@ -1547,7 +1540,12 @@ LLViewerWindow::LLViewerWindow(
mResDirty(false),
mStatesDirty(false),
mCurrResolutionIndex(0),
- mViewerWindowListener(new LLViewerWindowListener(this)),
+ // gKeyboard is still NULL, so it doesn't do LLWindowListener any good to
+ // pass its value right now. Instead, pass it a nullary function that
+ // will, when we later need it, return the value of gKeyboard.
+ // boost::lambda::var() constructs such a functor on the fly.
+ mWindowListener(new LLWindowListener(this, boost::lambda::var(gKeyboard))),
+ mViewerWindowListener(new LLViewerWindowListener(this)),
mProgressView(NULL)
{
LLNotificationChannel::buildChannel("VW_alerts", "Visible", LLNotificationFilters::filterBy<std::string>(&LLNotification::getType, "alert"));
@@ -1565,14 +1563,20 @@ LLViewerWindow::LLViewerWindow(
// create window
mWindow = LLWindowManager::createWindow(this,
- title, name, x, y, width, height, 0,
- fullscreen,
+ p.title, p.name, p.x, p.y, p.width, p.height, 0,
+ p.fullscreen,
gHeadlessClient,
gSavedSettings.getBOOL("DisableVerticalSync"),
!gHeadlessClient,
- ignore_pixel_depth,
+ p.ignore_pixel_depth,
gSavedSettings.getBOOL("RenderDeferred") ? 0 : gSavedSettings.getU32("RenderFSAASamples")); //don't use window level anti-aliasing if FBOs are enabled
+ if (!LLViewerShaderMgr::sInitialized)
+ { //immediately initialize shaders
+ LLViewerShaderMgr::sInitialized = TRUE;
+ LLViewerShaderMgr::instance()->setShaders();
+ }
+
if (NULL == mWindow)
{
LLSplashScreen::update(LLTrans::getString("StartupRequireDriverUpdate"));
@@ -1597,10 +1601,12 @@ LLViewerWindow::LLViewerWindow(
LL_WARNS("Window") << " Someone took over my signal/exception handler (post createWindow)!" << LL_ENDL;
}
+ const bool do_not_enforce = false;
+ mWindow->setMinSize(p.min_width, p.min_height, do_not_enforce); // root view not set
LLCoordScreen scr;
mWindow->getSize(&scr);
- if(fullscreen && ( scr.mX!=width || scr.mY!=height))
+ if(p.fullscreen && ( scr.mX!=p.width || scr.mY!=p.height))
{
llwarns << "Fullscreen has forced us in to a different resolution now using "<<scr.mX<<" x "<<scr.mY<<llendl;
gSavedSettings.setS32("FullScreenWidth",scr.mX);
@@ -1644,7 +1650,7 @@ LLViewerWindow::LLViewerWindow(
if (LLFeatureManager::getInstance()->isSafe()
|| (gSavedSettings.getS32("LastFeatureVersion") != LLFeatureManager::getInstance()->getVersion())
- || (gSavedSettings.getS32("LastGPUClass") != LLFeatureManager::getInstance()->getGPUClass())
+ || (gSavedSettings.getString("LastGPUString") != LLFeatureManager::getInstance()->getGPUString())
|| (gSavedSettings.getBOOL("ProbeHardwareOnStartup")))
{
LLFeatureManager::getInstance()->applyRecommendedSettings();
@@ -1709,32 +1715,30 @@ LLViewerWindow::LLViewerWindow(
void LLViewerWindow::initGLDefaults()
{
gGL.setSceneBlendType(LLRender::BT_ALPHA);
- glColorMaterial( GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE );
- F32 ambient[4] = {0.f,0.f,0.f,0.f };
- F32 diffuse[4] = {1.f,1.f,1.f,1.f };
- glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT,ambient);
- glMaterialfv(GL_FRONT_AND_BACK,GL_DIFFUSE,diffuse);
-
- glPixelStorei(GL_PACK_ALIGNMENT,1);
- glPixelStorei(GL_UNPACK_ALIGNMENT,1);
+ if (!LLGLSLShader::sNoFixedFunction)
+ { //initialize fixed function state
+ glColorMaterial( GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE );
- gGL.getTexUnit(0)->enable(LLTexUnit::TT_TEXTURE);
+ glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT,LLColor4::black.mV);
+ glMaterialfv(GL_FRONT_AND_BACK,GL_DIFFUSE,LLColor4::white.mV);
- // lights for objects
- glShadeModel( GL_SMOOTH );
+ // lights for objects
+ glShadeModel( GL_SMOOTH );
- glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambient);
-
- gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT);
+ gGL.getTexUnit(0)->enable(LLTexUnit::TT_TEXTURE);
+ gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT);
+ }
+ glPixelStorei(GL_PACK_ALIGNMENT,1);
+ glPixelStorei(GL_UNPACK_ALIGNMENT,1);
+
+ gGL.setAmbientLightColor(LLColor4::black);
+
glCullFace(GL_BACK);
// RN: Need this for translation and stretch manip.
- gCone.prerender();
gBox.prerender();
- gSphere.prerender();
- gCylinder.prerender();
}
struct MainPanel : public LLPanel
@@ -1771,12 +1775,19 @@ void LLViewerWindow::initBase()
// placeholder widget that controls where "world" is rendered
mWorldViewPlaceholder = main_view->getChildView("world_view_rect")->getHandle();
- mNonSideTrayView = main_view->getChildView("non_side_tray_view")->getHandle();
- mFloaterViewHolder = main_view->getChildView("floater_view_holder")->getHandle();
mPopupView = main_view->getChild<LLPopupView>("popup_holder");
mHintHolder = main_view->getChild<LLView>("hint_holder")->getHandle();
mLoginPanelHolder = main_view->getChild<LLView>("login_panel_holder")->getHandle();
+ // Create the toolbar view
+ // Get a pointer to the toolbar view holder
+ LLPanel* panel_holder = main_view->getChild<LLPanel>("toolbar_view_holder");
+ // Load the toolbar view from file
+ gToolBarView = LLUICtrlFactory::getInstance()->createFromFile<LLToolBarView>("panel_toolbar_view.xml", panel_holder, LLDefaultChildRegistry::instance());
+ gToolBarView->setShape(panel_holder->getLocalRect());
+ // Hide the toolbars for the moment: we'll make them visible after logging in world (see LLViewerWindow::initWorldUI())
+ gToolBarView->setVisible(FALSE);
+
// Constrain floaters to inside the menu and status bar regions.
gFloaterView = main_view->getChild<LLFloaterView>("Floater View");
gFloaterView->setFloaterSnapView(main_view->getChild<LLView>("floater_snap_region")->getHandle());
@@ -1836,13 +1847,12 @@ void LLViewerWindow::initWorldUI()
//getRootView()->sendChildToFront(gFloaterView);
//getRootView()->sendChildToFront(gSnapshotFloaterView);
- // new bottom panel
- LLPanel* bottom_tray_container = getRootView()->getChild<LLPanel>("bottom_tray_container");
- LLBottomTray* bottom_tray = LLBottomTray::getInstance();
- bottom_tray->setShape(bottom_tray_container->getLocalRect());
- bottom_tray->setFollowsAll();
- bottom_tray_container->addChild(bottom_tray);
- bottom_tray_container->setVisible(TRUE);
+ LLPanel* chiclet_container = getRootView()->getChild<LLPanel>("chiclet_container");
+ LLChicletBar* chiclet_bar = LLChicletBar::getInstance();
+ chiclet_bar->setShape(chiclet_container->getLocalRect());
+ chiclet_bar->setFollowsAll();
+ chiclet_container->addChild(chiclet_bar);
+ chiclet_container->setVisible(TRUE);
LLRect morph_view_rect = full_window;
morph_view_rect.stretch( -STATUS_BAR_HEIGHT );
@@ -1870,7 +1880,7 @@ void LLViewerWindow::initWorldUI()
gStatusBar->setShape(status_bar_container->getLocalRect());
// sync bg color with menu bar
gStatusBar->setBackgroundColor( gMenuBarView->getBackgroundColor().get() );
- status_bar_container->addChild(gStatusBar);
+ status_bar_container->addChildInBack(gStatusBar);
status_bar_container->setVisible(TRUE);
// Navigation bar
@@ -1884,12 +1894,7 @@ void LLViewerWindow::initWorldUI()
if (!gSavedSettings.getBOOL("ShowNavbarNavigationPanel"))
{
- navbar->showNavigationPanel(FALSE);
- }
-
- if (!gSavedSettings.getBOOL("ShowNavbarFavoritesPanel"))
- {
- navbar->showFavoritesPanel(FALSE);
+ navbar->setVisible(FALSE);
}
// Top Info bar
@@ -1915,8 +1920,7 @@ void LLViewerWindow::initWorldUI()
hud_rect.mTop -= gMenuBarView->getRect().getHeight();
}
gHUDView = new LLHUDView(hud_rect);
- // put behind everything else in the UI
- getRootView()->addChildInBack(gHUDView);
+ getRootView()->addChild(gHUDView);
}
LLPanel* panel_ssf_container = getRootView()->getChild<LLPanel>("stand_stop_flying_container");
@@ -1924,40 +1928,30 @@ void LLViewerWindow::initWorldUI()
panel_ssf_container->addChild(panel_stand_stop_flying);
panel_ssf_container->setVisible(TRUE);
- // put sidetray in container
- LLPanel* side_tray_container = getRootView()->getChild<LLPanel>("side_tray_container");
- LLSideTray* sidetrayp = LLSideTray::getInstance();
- sidetrayp->setShape(side_tray_container->getLocalRect());
- // don't follow right edge to avoid spurious resizes, since we are using a fixed width layout
- sidetrayp->setFollows(FOLLOWS_LEFT|FOLLOWS_TOP|FOLLOWS_BOTTOM);
- side_tray_container->addChild(sidetrayp);
- side_tray_container->setVisible(FALSE);
-
- // put sidetray buttons in their own panel
- LLPanel* buttons_panel = sidetrayp->getButtonsPanel();
- LLPanel* buttons_panel_container = getRootView()->getChild<LLPanel>("side_bar_tabs");
- buttons_panel->setShape(buttons_panel_container->getLocalRect());
- buttons_panel->setFollowsAll();
- buttons_panel_container->addChild(buttons_panel);
-
- LLView* avatar_picker_destination_guide_container = gViewerWindow->getRootView()->getChild<LLView>("avatar_picker_and_destination_guide_container");
- avatar_picker_destination_guide_container->getChild<LLButton>("close")->setCommitCallback(boost::bind(toggle_destination_and_avatar_picker, LLSD()));
- LLMediaCtrl* destinations = avatar_picker_destination_guide_container->findChild<LLMediaCtrl>("destination_guide_contents");
- LLMediaCtrl* avatar_picker = avatar_picker_destination_guide_container->findChild<LLMediaCtrl>("avatar_picker_contents");
+ // Load and make the toolbars visible
+ // Note: we need to load the toolbars only *after* the user is logged in and IW
+ if (gToolBarView)
+ {
+ gToolBarView->loadToolbars();
+ gToolBarView->setVisible(TRUE);
+ }
+
+ LLMediaCtrl* destinations = LLFloaterReg::getInstance("destinations")->getChild<LLMediaCtrl>("destination_guide_contents");
if (destinations)
{
destinations->setErrorPageURL(gSavedSettings.getString("GenericErrorPageURL"));
- destinations->navigateTo(gSavedSettings.getString("DestinationGuideURL"), "text/html");
+ std::string url = gSavedSettings.getString("DestinationGuideURL");
+ url = LLWeb::expandURLSubstitutions(url, LLSD());
+ destinations->navigateTo(url, "text/html");
}
-
+ LLMediaCtrl* avatar_picker = LLFloaterReg::getInstance("avatar")->findChild<LLMediaCtrl>("avatar_picker_contents");
if (avatar_picker)
{
avatar_picker->setErrorPageURL(gSavedSettings.getString("GenericErrorPageURL"));
- avatar_picker->navigateTo(gSavedSettings.getString("AvatarPickerURL"), "text/html");
+ std::string url = gSavedSettings.getString("AvatarPickerURL");
+ url = LLWeb::expandURLSubstitutions(url, LLSD());
+ avatar_picker->navigateTo(url, "text/html");
}
-
- // show destinations by default
- toggle_destination_and_avatar_picker(gSavedSettings.getS32("DestinationsAndAvatarsVisibility"));
}
// Destroy the UI
@@ -1966,39 +1960,49 @@ void LLViewerWindow::shutdownViews()
// clean up warning logger
LLError::removeRecorder(RecordToChatConsole::getInstance());
+ llinfos << "Warning logger is cleaned." << llendl ;
+
delete mDebugText;
mDebugText = NULL;
+ llinfos << "DebugText deleted." << llendl ;
+
// Cleanup global views
if (gMorphView)
{
gMorphView->setVisible(FALSE);
}
-
+ llinfos << "Global views cleaned." << llendl ;
+
// DEV-40930: Clear sModalStack. Otherwise, any LLModalDialog left open
// will crump with LL_ERRS.
LLModalDialog::shutdownModals();
-
+ llinfos << "LLModalDialog shut down." << llendl;
+
// destroy the nav bar, not currently part of gViewerWindow
// *TODO: Make LLNavigationBar part of gViewerWindow
if (LLNavigationBar::instanceExists())
{
- delete LLNavigationBar::getInstance();
+ delete LLNavigationBar::getInstance();
}
-
+ llinfos << "LLNavigationBar destroyed." << llendl ;
+
// destroy menus after instantiating navbar above, as it needs
// access to gMenuHolder
cleanup_menus();
-
+ llinfos << "menus destroyed." << llendl ;
+
// Delete all child views.
delete mRootView;
mRootView = NULL;
-
+ llinfos << "RootView deleted." << llendl ;
+
// Automatically deleted as children of mRootView. Fix the globals.
gStatusBar = NULL;
gIMMgr = NULL;
gToolTipView = NULL;
+ gToolBarView = NULL;
gFloaterView = NULL;
gMorphView = NULL;
@@ -2017,6 +2021,12 @@ void LLViewerWindow::shutdownGL()
gSky.cleanup();
stop_glerror();
+ llinfos << "Cleaning up pipeline" << llendl;
+ gPipeline.cleanup();
+ stop_glerror();
+
+ //MUST clean up pipeline before cleaning up wearables
+ llinfos << "Cleaning up wearables" << llendl;
LLWearableList::instance().cleanup() ;
gTextureList.shutdown();
@@ -2027,10 +2037,6 @@ void LLViewerWindow::shutdownGL()
LLWorldMapView::cleanupTextures();
- llinfos << "Cleaning up pipeline" << llendl;
- gPipeline.cleanup();
- stop_glerror();
-
LLViewerTextureManager::cleanup() ;
LLImageGL::cleanupClass() ;
@@ -2149,16 +2155,19 @@ void LLViewerWindow::reshape(S32 width, S32 height)
sendShapeToSim();
// store new settings for the mode we are in, regardless
- // Only save size if not maximized
BOOL maximized = mWindow->getMaximized();
gSavedSettings.setBOOL("WindowMaximized", maximized);
- LLCoordScreen window_size;
- if (!maximized
- && mWindow->getSize(&window_size))
+ if (!maximized)
{
- gSavedSettings.setS32("WindowWidth", window_size.mX);
- gSavedSettings.setS32("WindowHeight", window_size.mY);
+ U32 min_window_width=gSavedSettings.getU32("MinWindowWidth");
+ U32 min_window_height=gSavedSettings.getU32("MinWindowHeight");
+ // tell the OS specific window code about min window size
+ mWindow->setMinSize(min_window_width, min_window_height);
+
+ // Only save size if not maximized
+ gSavedSettings.setU32("WindowWidth", mWindowRectRaw.getWidth());
+ gSavedSettings.setU32("WindowHeight", mWindowRectRaw.getHeight());
}
LLViewerStats::getInstance()->setStat(LLViewerStats::ST_WINDOW_WIDTH, (F64)width);
@@ -2170,10 +2179,10 @@ void LLViewerWindow::reshape(S32 width, S32 height)
// Hide normal UI when a logon fails
void LLViewerWindow::setNormalControlsVisible( BOOL visible )
{
- if(LLBottomTray::instanceExists())
+ if(LLChicletBar::instanceExists())
{
- LLBottomTray::getInstance()->setVisible(visible);
- LLBottomTray::getInstance()->setEnabled(visible);
+ LLChicletBar::getInstance()->setVisible(visible);
+ LLChicletBar::getInstance()->setEnabled(visible);
}
if ( gMenuBarView )
@@ -2195,7 +2204,9 @@ void LLViewerWindow::setNormalControlsVisible( BOOL visible )
LLNavigationBar* navbarp = LLUI::getRootView()->findChild<LLNavigationBar>("navigation_bar");
if (navbarp)
{
- navbarp->setVisible( visible );
+ // when it's time to show navigation bar we need to ensure that the user wants to see it
+ // i.e. ShowNavbarNavigationPanel option is true
+ navbarp->setVisible( visible && gSavedSettings.getBOOL("ShowNavbarNavigationPanel") );
}
}
@@ -2246,6 +2257,10 @@ void LLViewerWindow::drawDebugText()
gGL.color4f(1,1,1,1);
gGL.pushMatrix();
gGL.pushUIMatrix();
+ if (LLGLSLShader::sNoFixedFunction)
+ {
+ gUIProgram.bind();
+ }
{
// scale view by UI global scale factor and aspect ratio correction factor
gGL.scaleUI(mDisplayScale.mV[VX], mDisplayScale.mV[VY], 1.f);
@@ -2255,6 +2270,10 @@ void LLViewerWindow::drawDebugText()
gGL.popMatrix();
gGL.flush();
+ if (LLGLSLShader::sNoFixedFunction)
+ {
+ gUIProgram.unbind();
+ }
}
void LLViewerWindow::draw()
@@ -2269,9 +2288,9 @@ void LLViewerWindow::draw()
LLUI::setLineWidth(1.f);
// Reset any left-over transforms
- glMatrixMode(GL_MODELVIEW);
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
- glLoadIdentity();
+ gGL.loadIdentity();
//S32 screen_x, screen_y;
@@ -2286,7 +2305,7 @@ void LLViewerWindow::draw()
// draw timecode block
std::string text;
- glLoadIdentity();
+ gGL.loadIdentity();
microsecondsToTimecodeString(gFrameTime,text);
const LLFontGL* font = LLFontGL::getFontSansSerif();
@@ -2322,10 +2341,10 @@ void LLViewerWindow::draw()
int pos_y = sub_region / llceil(zoom_factor);
int pos_x = sub_region - (pos_y*llceil(zoom_factor));
// offset for this tile
- glTranslatef((F32)getWindowWidthScaled() * -(F32)pos_x,
+ gGL.translatef((F32)getWindowWidthScaled() * -(F32)pos_x,
(F32)getWindowHeightScaled() * -(F32)pos_y,
0.f);
- glScalef(zoom_factor, zoom_factor, 1.f);
+ gGL.scalef(zoom_factor, zoom_factor, 1.f);
LLUI::sGLScaleFactor *= zoom_factor;
}
@@ -2354,7 +2373,7 @@ void LLViewerWindow::draw()
S32 screen_x, screen_y;
top_ctrl->localPointToScreen(0, 0, &screen_x, &screen_y);
- glMatrixMode(GL_MODELVIEW);
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
LLUI::pushMatrix();
LLUI::translate( (F32) screen_x, (F32) screen_y, 0.f);
top_ctrl->draw();
@@ -2466,7 +2485,12 @@ BOOL LLViewerWindow::handleKey(KEY key, MASK mask)
// Traverses up the hierarchy
if( keyboard_focus )
{
- LLLineEditor* chat_editor = LLBottomTray::instanceExists() ? LLBottomTray::getInstance()->getNearbyChatBar()->getChatBox() : NULL;
+ LLNearbyChatBar* nearby_chat = LLFloaterReg::findTypedInstance<LLNearbyChatBar>("chat_bar");
+
+ if (nearby_chat)
+ {
+ LLLineEditor* chat_editor = nearby_chat->getChatBox();
+
// arrow keys move avatar while chatting hack
if (chat_editor && chat_editor->hasFocus())
{
@@ -2497,7 +2521,7 @@ BOOL LLViewerWindow::handleKey(KEY key, MASK mask)
}
}
}
-
+ }
if (keyboard_focus->handleKey(key, mask, FALSE))
{
return TRUE;
@@ -2528,11 +2552,11 @@ BOOL LLViewerWindow::handleKey(KEY key, MASK mask)
if ( gSavedSettings.getS32("LetterKeysFocusChatBar") && !gAgentCamera.cameraMouselook() &&
!keyboard_focus && key < 0x80 && (mask == MASK_NONE || mask == MASK_SHIFT) )
{
- LLLineEditor* chat_editor = LLBottomTray::instanceExists() ? LLBottomTray::getInstance()->getNearbyChatBar()->getChatBox() : NULL;
+ LLLineEditor* chat_editor = LLFloaterReg::getTypedInstance<LLNearbyChatBar>("chat_bar")->getChatBox();
if (chat_editor)
{
// passing NULL here, character will be added later when it is handled by character handler.
- LLBottomTray::getInstance()->getNearbyChatBar()->startChat(NULL);
+ LLNearbyChatBar::getInstance()->startChat(NULL);
return TRUE;
}
}
@@ -3159,7 +3183,7 @@ void LLViewerWindow::updateLayout()
//gMenuBarView->setItemVisible("BuildTools", gFloaterTools->getVisible());
}
- LLFloaterBuildOptions* build_options_floater = LLFloaterReg::getTypedInstance<LLFloaterBuildOptions>("build_options");
+ LLFloaterBuildOptions* build_options_floater = LLFloaterReg::findTypedInstance<LLFloaterBuildOptions>("build_options");
if (build_options_floater && build_options_floater->getVisible())
{
build_options_floater->updateGridMode();
@@ -3303,9 +3327,6 @@ void LLViewerWindow::updateKeyboardFocus()
// make sure floater visible order is in sync with tab order
gFloaterView->syncFloaterTabOrder();
}
-
- if(LLSideTray::instanceCreated())//just getInstance will create sidetray. we don't want this
- LLSideTray::getInstance()->highlightFocused();
}
static LLFastTimer::DeclareTimer FTM_UPDATE_WORLD_VIEW("Update World View");
@@ -3329,12 +3350,6 @@ void LLViewerWindow::updateWorldViewRect(bool use_full_window)
new_world_rect.mTop = llround((F32)new_world_rect.mTop * mDisplayScale.mV[VY]);
}
- if (gSavedSettings.getBOOL("SidebarCameraMovement") == FALSE)
- {
- // use right edge of window, ignoring sidebar
- new_world_rect.mRight = mWindowRectRaw.mRight;
- }
-
if (mWorldViewRectRaw != new_world_rect)
{
mWorldViewRectRaw = new_world_rect;
@@ -3418,17 +3433,17 @@ void LLViewerWindow::renderSelections( BOOL for_gl_pick, BOOL pick_parcel_walls,
LLBBox hud_bbox = gAgentAvatarp->getHUDBBox();
// set up transform to encompass bounding box of HUD
- glMatrixMode(GL_PROJECTION);
- glPushMatrix();
- glLoadIdentity();
+ gGL.matrixMode(LLRender::MM_PROJECTION);
+ gGL.pushMatrix();
+ gGL.loadIdentity();
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);
+ gGL.ortho(-0.5f * LLViewerCamera::getInstance()->getAspect(), 0.5f * LLViewerCamera::getInstance()->getAspect(), -0.5f, 0.5f, 0.f, depth);
- glMatrixMode(GL_MODELVIEW);
- glPushMatrix();
- 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);
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
+ gGL.pushMatrix();
+ gGL.loadIdentity();
+ gGL.loadMatrix(OGL_TO_CFR_ROTATION); // Load Cory's favorite reference frame
+ gGL.translatef(-hud_bbox.getCenterLocal().mV[VX] + (depth *0.5f), 0.f, 0.f);
}
// Render light for editing
@@ -3438,12 +3453,12 @@ void LLViewerWindow::renderSelections( BOOL for_gl_pick, BOOL pick_parcel_walls,
LLGLEnable gls_blend(GL_BLEND);
LLGLEnable gls_cull(GL_CULL_FACE);
LLGLDepthTest gls_depth(GL_TRUE, GL_FALSE);
- glMatrixMode(GL_MODELVIEW);
- glPushMatrix();
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
+ gGL.pushMatrix();
if (selection->getSelectType() == SELECT_TYPE_HUD)
{
F32 zoom = gAgentCamera.mHUDCurZoom;
- glScalef(zoom, zoom, zoom);
+ gGL.scalef(zoom, zoom, zoom);
}
struct f : public LLSelectedObjectFunctor
@@ -3454,33 +3469,33 @@ void LLViewerWindow::renderSelections( BOOL for_gl_pick, BOOL pick_parcel_walls,
if (drawable && drawable->isLight())
{
LLVOVolume* vovolume = drawable->getVOVolume();
- glPushMatrix();
+ gGL.pushMatrix();
LLVector3 center = drawable->getPositionAgent();
- glTranslatef(center[0], center[1], center[2]);
+ gGL.translatef(center[0], center[1], center[2]);
F32 scale = vovolume->getLightRadius();
- glScalef(scale, scale, scale);
+ gGL.scalef(scale, scale, scale);
LLColor4 color(vovolume->getLightColor(), .5f);
- glColor4fv(color.mV);
+ gGL.color4fv(color.mV);
- F32 pixel_area = 100000.f;
+ //F32 pixel_area = 100000.f;
// Render Outside
- gSphere.render(pixel_area);
+ gSphere.render();
// Render Inside
glCullFace(GL_FRONT);
- gSphere.render(pixel_area);
+ gSphere.render();
glCullFace(GL_BACK);
- glPopMatrix();
+ gGL.popMatrix();
}
return true;
}
} func;
LLSelectMgr::getInstance()->getSelection()->applyToObjects(&func);
- glPopMatrix();
+ gGL.popMatrix();
}
// NOTE: The average position for the axis arrows of the selected objects should
@@ -3543,11 +3558,11 @@ void LLViewerWindow::renderSelections( BOOL for_gl_pick, BOOL pick_parcel_walls,
}
if (selection->getSelectType() == SELECT_TYPE_HUD && selection->getObjectCount())
{
- glMatrixMode(GL_PROJECTION);
- glPopMatrix();
+ gGL.matrixMode(LLRender::MM_PROJECTION);
+ gGL.popMatrix();
- glMatrixMode(GL_MODELVIEW);
- glPopMatrix();
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
+ gGL.popMatrix();
stop_glerror();
}
}
@@ -4014,10 +4029,11 @@ BOOL LLViewerWindow::mousePointOnLandGlobal(const S32 x, const S32 y, LLVector3d
}
// Saves an image to the harddrive as "SnapshotX" where X >= 1.
-BOOL LLViewerWindow::saveImageNumbered(LLImageFormatted *image)
+BOOL LLViewerWindow::saveImageNumbered(LLImageFormatted *image, bool force_picker)
{
if (!image)
{
+ llwarns << "No image to save" << llendl;
return FALSE;
}
@@ -4037,7 +4053,7 @@ BOOL LLViewerWindow::saveImageNumbered(LLImageFormatted *image)
pick_type = LLFilePicker::FFSAVE_ALL; // ???
// Get a base file location if needed.
- if ( ! isSnapshotLocSet())
+ if (force_picker || !isSnapshotLocSet())
{
std::string proposed_name( sSnapshotBaseName );
@@ -4077,6 +4093,7 @@ BOOL LLViewerWindow::saveImageNumbered(LLImageFormatted *image)
}
while( -1 != err ); // search until the file is not found (i.e., stat() gives an error).
+ llinfos << "Saving snapshot to " << filepath << llendl;
return image->save(filepath);
}
@@ -4085,25 +4102,18 @@ void LLViewerWindow::resetSnapshotLoc()
sSnapshotDir.clear();
}
-static S32 BORDERHEIGHT = 0;
-static S32 BORDERWIDTH = 0;
-
// static
void LLViewerWindow::movieSize(S32 new_width, S32 new_height)
{
- LLCoordScreen size;
- gViewerWindow->mWindow->getSize(&size);
- if ( (size.mX != new_width + BORDERWIDTH)
- ||(size.mY != new_height + BORDERHEIGHT))
+ LLCoordWindow size;
+ gViewerWindow->getWindow()->getSize(&size);
+ if ( size.mX != new_width
+ || size.mY != new_height)
{
- // use actual display dimensions, not virtual UI dimensions
- S32 x = gViewerWindow->getWindowWidthRaw();
- S32 y = gViewerWindow->getWindowHeightRaw();
- BORDERWIDTH = size.mX - x;
- BORDERHEIGHT = size.mY- y;
- LLCoordScreen new_size(new_width + BORDERWIDTH,
- new_height + BORDERHEIGHT);
- gViewerWindow->mWindow->setSize(new_size);
+ LLCoordWindow new_size(new_width, new_height);
+ LLCoordScreen screen_size;
+ gViewerWindow->getWindow()->convertCoords(new_size, &screen_size);
+ gViewerWindow->getWindow()->setSize(screen_size);
}
}
@@ -4661,10 +4671,7 @@ void LLViewerWindow::stopGL(BOOL save_state)
gPipeline.destroyGL();
}
- gCone.cleanupGL();
gBox.cleanupGL();
- gSphere.cleanupGL();
- gCylinder.cleanupGL();
if(gPostProcess)
{
@@ -4738,6 +4745,9 @@ void LLViewerWindow::initFonts(F32 zoom_factor)
{
LLFontGL::destroyAllGL();
// Initialize with possibly different zoom factor
+
+ LLFontManager::initClass();
+
LLFontGL::initClass( gSavedSettings.getF32("FontScreenDPI"),
mDisplayScale.mV[VX] * zoom_factor,
mDisplayScale.mV[VY] * zoom_factor,
@@ -4930,8 +4940,8 @@ S32 LLViewerWindow::getChatConsoleBottomPad()
{
S32 offset = 0;
- if(LLBottomTray::instanceExists())
- offset += LLBottomTray::getInstance()->getRect().getHeight();
+ if(gToolBarView)
+ offset += gToolBarView->getChild<LLView>("bottom_toolbar_panel")->getRect().getHeight();
return offset;
}
@@ -4987,6 +4997,35 @@ bool LLViewerWindow::onAlert(const LLSD& notify)
return false;
}
+void LLViewerWindow::setUIVisibility(bool visible)
+{
+ mUIVisible = visible;
+
+ if (!visible)
+ {
+ gAgentCamera.changeCameraToThirdPerson(FALSE);
+ gFloaterView->hideAllFloaters();
+ }
+ else
+ {
+ gFloaterView->showHiddenFloaters();
+ }
+
+ if (gToolBarView)
+ {
+ gToolBarView->setToolBarsVisible(visible);
+ }
+
+ LLNavigationBar::getInstance()->setVisible(visible ? gSavedSettings.getBOOL("ShowNavbarNavigationPanel") : FALSE);
+ LLPanelTopInfoBar::getInstance()->setVisible(visible? gSavedSettings.getBOOL("ShowMiniLocationPanel") : FALSE);
+ mRootView->getChildView("status_bar_container")->setVisible(visible);
+}
+
+bool LLViewerWindow::getUIVisibility()
+{
+ return mUIVisible;
+}
+
////////////////////////////////////////////////////////////////////////////
//
// LLPickInfo
diff --git a/indra/newview/llviewerwindow.h b/indra/newview/llviewerwindow.h
index edd241a742..6efcaeaf18 100644
--- a/indra/newview/llviewerwindow.h
+++ b/indra/newview/llviewerwindow.h
@@ -44,6 +44,7 @@
#include "llstat.h"
#include "llmousehandler.h"
#include "llhandle.h"
+#include "llinitparam.h"
#include <boost/function.hpp>
#include <boost/signals2.hpp>
@@ -62,6 +63,7 @@ class LLImageFormatted;
class LLHUDIcon;
class LLWindow;
class LLRootView;
+class LLWindowListener;
class LLViewerWindowListener;
class LLPopupView;
@@ -132,7 +134,23 @@ public:
//
// CREATORS
//
- LLViewerWindow(const std::string& title, const std::string& name, S32 x, S32 y, S32 width, S32 height, BOOL fullscreen, BOOL ignore_pixel_depth);
+ struct Params : public LLInitParam::Block<Params>
+ {
+ Mandatory<std::string> title,
+ name;
+ Mandatory<S32> x,
+ y,
+ width,
+ height,
+ min_width,
+ min_height;
+ Optional<bool> fullscreen,
+ ignore_pixel_depth;
+
+ Params();
+ };
+
+ LLViewerWindow(const Params& p);
virtual ~LLViewerWindow();
void shutdownViews();
@@ -143,6 +161,8 @@ public:
void adjustRectanglesForFirstUse(const LLRect& window);
void adjustControlRectanglesForFirstUse(const LLRect& window);
void initWorldUI();
+ void setUIVisibility(bool);
+ bool getUIVisibility();
BOOL handleAnyMouseClick(LLWindow *window, LLCoordGL pos, MASK mask, LLMouseHandler::EClickType clicktype, BOOL down);
@@ -282,8 +302,7 @@ public:
void updateKeyboardFocus();
void updateWorldViewRect(bool use_full_window=false);
- LLView* getNonSideTrayView() { return mNonSideTrayView.get(); }
- LLView* getFloaterViewHolder() { return mFloaterViewHolder.get(); }
+ LLView* getToolBarHolder() { return mToolBarHolder.get(); }
LLView* getHintHolder() { return mHintHolder.get(); }
LLView* getLoginPanelHolder() { return mLoginPanelHolder.get(); }
BOOL handleKey(KEY key, MASK mask);
@@ -322,7 +341,7 @@ public:
BOOL thumbnailSnapshot(LLImageRaw *raw, S32 preview_width, S32 preview_height, BOOL show_ui, BOOL do_rebuild, ESnapshotType type) ;
BOOL isSnapshotLocSet() const { return ! sSnapshotDir.empty(); }
void resetSnapshotLoc() const { sSnapshotDir.clear(); }
- BOOL saveImageNumbered(LLImageFormatted *image);
+ BOOL saveImageNumbered(LLImageFormatted *image, bool force_picker = false);
// Reset the directory where snapshots are saved.
// Client will open directory picker on next snapshot save.
@@ -394,11 +413,10 @@ private:
S32 getChatConsoleBottomPad(); // Vertical padding for child console rect, varied by bottom clutter
LLRect getChatConsoleRect(); // Get optimal cosole rect.
-public:
+private:
LLWindow* mWindow; // graphical window object
-
-protected:
- BOOL mActive;
+ bool mActive;
+ bool mUIVisible;
LLRect mWindowRectRaw; // whole window, including UI
LLRect mWindowRectScaled; // whole window, scaled by UI size
@@ -444,8 +462,7 @@ protected:
std::string mInitAlert; // Window / GL initialization requires an alert
LLHandle<LLView> mWorldViewPlaceholder; // widget that spans the portion of screen dedicated to rendering the 3d world
- LLHandle<LLView> mNonSideTrayView; // parent of world view + bottom bar, etc...everything but the side tray
- LLHandle<LLView> mFloaterViewHolder; // container for floater_view
+ LLHandle<LLView> mToolBarHolder; // container for toolbars
LLHandle<LLView> mHintHolder; // container for hints
LLHandle<LLView> mLoginPanelHolder; // container for login panel
LLPopupView* mPopupView; // container for transient popups
@@ -456,15 +473,14 @@ protected:
bool mStatesDirty;
U32 mCurrResolutionIndex;
- boost::scoped_ptr<LLViewerWindowListener> mViewerWindowListener;
+ boost::scoped_ptr<LLWindowListener> mWindowListener;
+ boost::scoped_ptr<LLViewerWindowListener> mViewerWindowListener;
-protected:
static std::string sSnapshotBaseName;
static std::string sSnapshotDir;
static std::string sMovieBaseName;
-private:
// Object temporarily hovered over while dragging
LLPointer<LLViewerObject> mDragHoveredObject;
};
diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp
index e457cc3e70..bc7f5a9744 100644
--- a/indra/newview/llvoavatar.cpp
+++ b/indra/newview/llvoavatar.cpp
@@ -651,6 +651,8 @@ LLVOAvatar::LLVOAvatar(const LLUUID& id,
LLViewerObject(id, pcode, regionp),
mIsDummy(FALSE),
mSpecialRenderMode(0),
+ mAttachmentGeometryBytes(0),
+ mAttachmentSurfaceArea(0.f),
mTurning(FALSE),
mPelvisToFoot(0.f),
mLastSkeletonSerialNum( 0 ),
@@ -690,7 +692,8 @@ LLVOAvatar::LLVOAvatar(const LLUUID& id,
mFullyLoadedInitialized(FALSE),
mSupportsAlphaLayers(FALSE),
mLoadedCallbacksPaused(FALSE),
- mHasPelvisOffset( FALSE )
+ mHasPelvisOffset( FALSE ),
+ mRenderUnloadedAvatar(LLCachedControl<bool>(gSavedSettings, "RenderUnloadedAvatar"))
{
LLMemType mt(LLMemType::MTYPE_AVATAR);
//VTResume(); // VTune
@@ -2117,8 +2120,8 @@ void LLVOAvatar::updateMeshData()
}
else
{
- if (buff->getRequestedIndices() == num_indices &&
- buff->getRequestedVerts() == num_vertices)
+ if (buff->getNumIndices() == num_indices &&
+ buff->getNumVerts() == num_vertices)
{
terse_update = true;
}
@@ -2138,11 +2141,19 @@ void LLVOAvatar::updateMeshData()
for(S32 k = j ; k < part_index ; k++)
{
- mMeshLOD[k]->updateFaceData(facep, mAdjustedPixelArea, k == MESH_ID_HAIR, terse_update);
+ bool rigid = false;
+ if (k == MESH_ID_EYEBALL_LEFT ||
+ k == MESH_ID_EYEBALL_RIGHT)
+ { //eyeballs can't have terse updates since they're never rendered with
+ //the hardware skinning shader
+ rigid = true;
+ }
+
+ mMeshLOD[k]->updateFaceData(facep, mAdjustedPixelArea, k == MESH_ID_HAIR, terse_update && !rigid);
}
stop_glerror();
- buff->setBuffer(0);
+ buff->flush();
if(!f_num)
{
@@ -3354,6 +3365,16 @@ void LLVOAvatar::slamPosition()
mRoot.updateWorldMatrixChildren();
}
+bool LLVOAvatar::isVisuallyMuted()
+{
+ static LLCachedControl<U32> max_attachment_bytes(gSavedSettings, "RenderAutoMuteByteLimit");
+ static LLCachedControl<F32> max_attachment_area(gSavedSettings, "RenderAutoMuteSurfaceAreaLimit");
+
+ return LLMuteList::getInstance()->isMuted(getID()) ||
+ (mAttachmentGeometryBytes > max_attachment_bytes && max_attachment_bytes > 0) ||
+ (mAttachmentSurfaceArea > max_attachment_area && max_attachment_area > 0.f);
+}
+
//------------------------------------------------------------------------
// updateCharacter()
// called on both your avatar and other avatars
@@ -3420,8 +3441,9 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent)
size.setSub(ext[1],ext[0]);
F32 mag = size.getLength3().getF32()*0.5f;
+
F32 impostor_area = 256.f*512.f*(8.125f - LLVOAvatar::sLODFactor*8.f);
- if (LLMuteList::getInstance()->isMuted(getID()))
+ if (isVisuallyMuted())
{ // muted avatars update at 16 hz
mUpdatePeriod = 16;
}
@@ -4135,7 +4157,7 @@ U32 LLVOAvatar::renderSkinned(EAvatarRenderPass pass)
LLVertexBuffer* vb = mDrawable->getFace(0)->getVertexBuffer();
if (vb)
{
- vb->setBuffer(0);
+ vb->flush();
}
}
}
@@ -5405,18 +5427,6 @@ BOOL LLVOAvatar::loadAvatar()
}
}
- // Uncomment to enable avatar_lad.xml debugging.
- std::ofstream file;
- file.open("avatar_lad.log");
- for( LLViewerVisualParam* param = (LLViewerVisualParam*) getFirstVisualParam();
- param;
- param = (LLViewerVisualParam*) getNextVisualParam() )
- {
- param->getInfo()->toStream(file);
- file << std::endl;
- }
-
- file.close();
return TRUE;
}
@@ -6485,10 +6495,7 @@ BOOL LLVOAvatar::processFullyLoadedChange(bool loading)
BOOL LLVOAvatar::isFullyLoaded() const
{
- if (gSavedSettings.getBOOL("RenderUnloadedAvatar"))
- return TRUE;
- else
- return mFullyLoaded;
+ return (mRenderUnloadedAvatar || mFullyLoaded);
}
bool LLVOAvatar::isTooComplex() const
@@ -7524,7 +7531,8 @@ void LLVOAvatar::useBakedTexture( const LLUUID& id )
// static
void LLVOAvatar::dumpArchetypeXML( void* )
{
- LLAPRFile outfile(gDirUtilp->getExpandedFilename(LL_PATH_CHARACTER, "new archetype.xml"), LL_APR_WB);
+ LLAPRFile outfile;
+ outfile.open(gDirUtilp->getExpandedFilename(LL_PATH_CHARACTER,"new archetype.xml"), LL_APR_WB );
apr_file_t* file = outfile.getFileHandle() ;
if (!file)
{
@@ -8334,10 +8342,15 @@ void LLVOAvatar::getImpostorValues(LLVector4a* extents, LLVector3& angle, F32& d
void LLVOAvatar::idleUpdateRenderCost()
{
static const U32 ARC_BODY_PART_COST = 200;
- static const U32 ARC_LIMIT = 2048;
+ static const U32 ARC_LIMIT = 20000;
static std::set<LLUUID> all_textures;
+ if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_ATTACHMENT_BYTES))
+ { //set debug text to attachment geometry bytes here so render cost will override
+ setDebugText(llformat("%.1f KB, %.2f m^2", mAttachmentGeometryBytes/1024.f, mAttachmentSurfaceArea));
+ }
+
if (!gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_SHAME))
{
return;
diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h
index e53b8e3f4b..dd0317f555 100644
--- a/indra/newview/llvoavatar.h
+++ b/indra/newview/llvoavatar.h
@@ -40,6 +40,7 @@
#include "lldrawpoolalpha.h"
#include "llviewerobject.h"
#include "llcharacter.h"
+#include "llcontrol.h"
#include "llviewerjointmesh.h"
#include "llviewerjointattachment.h"
#include "llrendertarget.h"
@@ -77,6 +78,8 @@ class LLVOAvatar :
public LLCharacter,
public boost::signals2::trackable
{
+ LOG_CLASS(LLVOAvatar);
+
public:
friend class LLVOAvatarSelf;
protected:
@@ -379,6 +382,8 @@ private:
public:
U32 renderImpostor(LLColor4U color = LLColor4U(255,255,255,255), S32 diffuse_channel = 0);
+ bool isVisuallyMuted();
+
U32 renderRigid();
U32 renderSkinned(EAvatarRenderPass pass);
F32 getLastSkinTime() { return mLastSkinTime; }
@@ -390,6 +395,9 @@ public:
static void restoreGL();
BOOL mIsDummy; // for special views
S32 mSpecialRenderMode; // special lighting
+ U32 mAttachmentGeometryBytes; //number of bytes in attached geometry
+ F32 mAttachmentSurfaceArea; //estimated surface area of attachments
+
private:
bool shouldAlphaMask();
@@ -450,6 +458,8 @@ private:
F32 mImpostorDistance;
F32 mImpostorPixelArea;
LLVector3 mLastAnimExtents[2];
+
+ LLCachedControl<bool> mRenderUnloadedAvatar;
//--------------------------------------------------------------------
// Wind rippling in clothes
diff --git a/indra/newview/llvoavatarself.cpp b/indra/newview/llvoavatarself.cpp
index 59883e0bb1..e525d6bad0 100644
--- a/indra/newview/llvoavatarself.cpp
+++ b/indra/newview/llvoavatarself.cpp
@@ -66,10 +66,11 @@
#include <boost/lexical_cast.hpp>
-LLVOAvatarSelf *gAgentAvatarp = NULL;
+LLPointer<LLVOAvatarSelf> gAgentAvatarp = NULL;
+
BOOL isAgentAvatarValid()
{
- return (gAgentAvatarp &&
+ return (gAgentAvatarp.notNull() &&
(gAgentAvatarp->getRegion() != NULL) &&
(!gAgentAvatarp->isDead()));
}
@@ -1574,7 +1575,7 @@ void LLVOAvatarSelf::invalidateAll()
{
invalidateComposite(mBakedTextureDatas[i].mTexLayerSet, TRUE);
}
- mDebugSelfLoadTimer.reset();
+ //mDebugSelfLoadTimer.reset();
}
//-----------------------------------------------------------------------------
@@ -1896,11 +1897,13 @@ BOOL LLVOAvatarSelf::getIsCloud()
gAgentWearables.getWearableCount(LLWearableType::WT_EYES) == 0 ||
gAgentWearables.getWearableCount(LLWearableType::WT_SKIN) == 0)
{
+ lldebugs << "No body parts" << llendl;
return TRUE;
}
if (!isTextureDefined(TEX_HAIR, 0))
{
+ lldebugs << "No hair texture" << llendl;
return TRUE;
}
@@ -1909,12 +1912,14 @@ BOOL LLVOAvatarSelf::getIsCloud()
if (!isLocalTextureDataAvailable(mBakedTextureDatas[BAKED_LOWER].mTexLayerSet) &&
(!isTextureDefined(TEX_LOWER_BAKED, 0)))
{
+ lldebugs << "Lower textures not baked" << llendl;
return TRUE;
}
if (!isLocalTextureDataAvailable(mBakedTextureDatas[BAKED_UPPER].mTexLayerSet) &&
(!isTextureDefined(TEX_UPPER_BAKED, 0)))
{
+ lldebugs << "Upper textures not baked" << llendl;
return TRUE;
}
@@ -1931,10 +1936,12 @@ BOOL LLVOAvatarSelf::getIsCloud()
const LLViewerTexture* baked_img = getImage( texture_data.mTextureIndex, 0 );
if (!baked_img || !baked_img->hasGLTexture())
{
+ lldebugs << "Texture at index " << i << " (texture index is " << texture_data.mTextureIndex << ") is not loaded" << llendl;
return TRUE;
}
}
+ lldebugs << "Avatar de-clouded" << llendl;
}
return FALSE;
}
@@ -2258,6 +2265,7 @@ void LLVOAvatarSelf::setNewBakedTexture( ETextureIndex te, const LLUUID& uuid )
}
}
+// FIXME: This is never called. Something may be broken.
void LLVOAvatarSelf::outputRezDiagnostics() const
{
if(!gSavedSettings.getBOOL("DebugAvatarLocalTexLoadedTime"))
@@ -2315,6 +2323,18 @@ void LLVOAvatarSelf::outputRezDiagnostics() const
}
}
+void LLVOAvatarSelf::outputRezTiming(const std::string& msg) const
+{
+ LL_DEBUGS("Avatar Rez")
+ << llformat("%s. Time from avatar creation: %.2f", msg.c_str(), mDebugSelfLoadTimer.getElapsedTimeF32())
+ << llendl;
+}
+
+void LLVOAvatarSelf::reportAvatarRezTime() const
+{
+ // TODO: report mDebugSelfLoadTimer.getElapsedTimeF32() somehow.
+}
+
//-----------------------------------------------------------------------------
// setCachedBakedTexture()
// A baked texture id was received from a cache query, make it active
@@ -2558,7 +2578,7 @@ void LLVOAvatarSelf::deleteScratchTextures()
LLImageGL::decTextureCounter(tex_size, 1, LLViewerTexture::AVATAR_SCRATCH_TEX) ;
total_tex_size -= tex_size ;
}
- if( sScratchTexNames.checkData( GL_LUMINANCE_ALPHA ) )
+ if( sScratchTexNames.checkData( LLRender::sGLCoreProfile ? GL_RG : GL_LUMINANCE_ALPHA ) )
{
LLImageGL::decTextureCounter(tex_size, 2, LLViewerTexture::AVATAR_SCRATCH_TEX) ;
total_tex_size -= 2 * tex_size ;
@@ -2600,89 +2620,6 @@ void LLVOAvatarSelf::deleteScratchTextures()
}
}
-BOOL LLVOAvatarSelf::bindScratchTexture( LLGLenum format )
-{
- U32 texture_bytes = 0;
- S32 components = 0;
- GLuint gl_name = getScratchTexName( format, components, &texture_bytes );
- if( gl_name )
- {
- gGL.getTexUnit(0)->bindManual(LLTexUnit::TT_TEXTURE, gl_name);
- stop_glerror();
-
- F32* last_bind_time = sScratchTexLastBindTime.getIfThere( format );
- if( last_bind_time )
- {
- if( *last_bind_time != LLImageGL::sLastFrameTime )
- {
- *last_bind_time = LLImageGL::sLastFrameTime;
- LLImageGL::updateBoundTexMem(texture_bytes, components, LLViewerTexture::AVATAR_SCRATCH_TEX) ;
- }
- }
- else
- {
- LLImageGL::updateBoundTexMem(texture_bytes, components, LLViewerTexture::AVATAR_SCRATCH_TEX) ;
- sScratchTexLastBindTime.addData( format, new F32(LLImageGL::sLastFrameTime) );
- }
- return TRUE;
- }
- return FALSE;
-}
-
-LLGLuint LLVOAvatarSelf::getScratchTexName( LLGLenum format, S32& components, U32* texture_bytes )
-{
- GLenum internal_format;
- switch( format )
- {
- case GL_LUMINANCE: components = 1; internal_format = GL_LUMINANCE8; break;
- case GL_ALPHA: components = 1; internal_format = GL_ALPHA8; break;
- case GL_LUMINANCE_ALPHA: components = 2; internal_format = GL_LUMINANCE8_ALPHA8; break;
- case GL_RGB: components = 3; internal_format = GL_RGB8; break;
- case GL_RGBA: components = 4; internal_format = GL_RGBA8; break;
- default: llassert(0); components = 4; internal_format = GL_RGBA8; break;
- }
-
- *texture_bytes = components * SCRATCH_TEX_WIDTH * SCRATCH_TEX_HEIGHT;
-
- if( sScratchTexNames.checkData( format ) )
- {
- return *( sScratchTexNames.getData( format ) );
- }
-
- LLGLSUIDefault gls_ui;
-
- U32 name = 0;
- LLImageGL::generateTextures(1, &name );
- stop_glerror();
-
- gGL.getTexUnit(0)->bindManual(LLTexUnit::TT_TEXTURE, name);
- stop_glerror();
-
- LLImageGL::setManualImage(
- GL_TEXTURE_2D, 0, internal_format,
- SCRATCH_TEX_WIDTH, SCRATCH_TEX_HEIGHT,
- format, GL_UNSIGNED_BYTE, NULL );
- stop_glerror();
-
- gGL.getTexUnit(0)->setTextureFilteringOption(LLTexUnit::TFO_BILINEAR);
- gGL.getTexUnit(0)->setTextureAddressMode(LLTexUnit::TAM_CLAMP);
- stop_glerror();
-
- gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
- stop_glerror();
-
- sScratchTexNames.addData( format, new LLGLuint( name ) );
-
- sScratchTexBytes += *texture_bytes;
- LLImageGL::sGlobalTextureMemoryInBytes += *texture_bytes;
-
- if(gAuditTexture)
- {
- LLImageGL::incTextureCounter(SCRATCH_TEX_WIDTH * SCRATCH_TEX_HEIGHT, components, LLViewerTexture::AVATAR_SCRATCH_TEX) ;
- }
- return name;
-}
-
// static
void LLVOAvatarSelf::dumpScratchTextureByteCount()
{
diff --git a/indra/newview/llvoavatarself.h b/indra/newview/llvoavatarself.h
index 51f06dee5f..655fb3a012 100644
--- a/indra/newview/llvoavatarself.h
+++ b/indra/newview/llvoavatarself.h
@@ -41,6 +41,7 @@ struct LocalTextureData;
class LLVOAvatarSelf :
public LLVOAvatar
{
+ LOG_CLASS(LLVOAvatarSelf);
/********************************************************************************
** **
@@ -249,10 +250,7 @@ public:
// Scratch textures (used for compositing)
//--------------------------------------------------------------------
public:
- BOOL bindScratchTexture(LLGLenum format);
static void deleteScratchTextures();
-protected:
- LLGLuint getScratchTexName(LLGLenum format, S32& components, U32* texture_bytes);
private:
static S32 sScratchTexBytes;
static LLMap< LLGLenum, LLGLuint*> sScratchTexNames;
@@ -361,6 +359,8 @@ public:
void debugWearablesLoaded() { mDebugTimeWearablesLoaded = mDebugSelfLoadTimer.getElapsedTimeF32(); }
void debugAvatarVisible() { mDebugTimeAvatarVisible = mDebugSelfLoadTimer.getElapsedTimeF32(); }
void outputRezDiagnostics() const;
+ void outputRezTiming(const std::string& msg) const;
+ void reportAvatarRezTime() const;
void debugBakedTextureUpload(LLVOAvatarDefines::EBakedTextureIndex index, BOOL finished);
static void debugOnTimingLocalTexLoaded(BOOL success, LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* aux_src, S32 discard_level, BOOL final, void* userdata);
@@ -383,7 +383,7 @@ private:
};
-extern LLVOAvatarSelf *gAgentAvatarp;
+extern LLPointer<LLVOAvatarSelf> gAgentAvatarp;
BOOL isAgentAvatarValid();
diff --git a/indra/newview/llvocache.cpp b/indra/newview/llvocache.cpp
index baf01ec066..7db19c5c1b 100644
--- a/indra/newview/llvocache.cpp
+++ b/indra/newview/llvocache.cpp
@@ -268,6 +268,7 @@ LLVOCache::LLVOCache():
mCacheSize(1)
{
mEnabled = gSavedSettings.getBOOL("ObjectCacheEnabled");
+ mLocalAPRFilePoolp = new LLVolatileAPRPool() ;
}
LLVOCache::~LLVOCache()
@@ -277,6 +278,7 @@ LLVOCache::~LLVOCache()
writeCacheHeader();
clearCacheInMemory();
}
+ delete mLocalAPRFilePoolp;
}
void LLVOCache::setDirNames(ELLPath location)
@@ -433,7 +435,7 @@ void LLVOCache::removeFromCache(HeaderEntryInfo* entry)
std::string filename;
getObjectCacheFilename(entry->mHandle, filename);
- LLAPRFile::remove(filename);
+ LLAPRFile::remove(filename, mLocalAPRFilePoolp);
entry->mTime = INVALID_TIME ;
updateEntry(entry) ; //update the head file.
}
@@ -450,9 +452,9 @@ void LLVOCache::readCacheHeader()
clearCacheInMemory();
bool success = true ;
- if (LLAPRFile::isExist(mHeaderFileName))
+ if (LLAPRFile::isExist(mHeaderFileName, mLocalAPRFilePoolp))
{
- LLAPRFile apr_file(mHeaderFileName, APR_READ|APR_BINARY);
+ LLAPRFile apr_file(mHeaderFileName, APR_READ|APR_BINARY, mLocalAPRFilePoolp);
//read the meta element
success = check_read(&apr_file, &mMetaInfo, sizeof(HeaderMetaInfo)) ;
@@ -537,7 +539,7 @@ void LLVOCache::writeCacheHeader()
bool success = true ;
{
- LLAPRFile apr_file(mHeaderFileName, APR_CREATE|APR_WRITE|APR_BINARY);
+ LLAPRFile apr_file(mHeaderFileName, APR_CREATE|APR_WRITE|APR_BINARY, mLocalAPRFilePoolp);
//write the meta element
success = check_write(&apr_file, &mMetaInfo, sizeof(HeaderMetaInfo)) ;
@@ -575,7 +577,7 @@ void LLVOCache::writeCacheHeader()
BOOL LLVOCache::updateEntry(const HeaderEntryInfo* entry)
{
- LLAPRFile apr_file(mHeaderFileName, APR_WRITE|APR_BINARY);
+ LLAPRFile apr_file(mHeaderFileName, APR_WRITE|APR_BINARY, mLocalAPRFilePoolp);
apr_file.seek(APR_SET, entry->mIndex * sizeof(HeaderEntryInfo) + sizeof(HeaderMetaInfo)) ;
return check_write(&apr_file, (void*)entry, sizeof(HeaderEntryInfo)) ;
@@ -601,7 +603,7 @@ void LLVOCache::readFromCache(U64 handle, const LLUUID& id, LLVOCacheEntry::voca
{
std::string filename;
getObjectCacheFilename(handle, filename);
- LLAPRFile apr_file(filename, APR_READ|APR_BINARY);
+ LLAPRFile apr_file(filename, APR_READ|APR_BINARY, mLocalAPRFilePoolp);
LLUUID cache_id ;
success = check_read(&apr_file, cache_id.mData, UUID_BYTES) ;
@@ -724,7 +726,7 @@ void LLVOCache::writeToCache(U64 handle, const LLUUID& id, const LLVOCacheEntry:
{
std::string filename;
getObjectCacheFilename(handle, filename);
- LLAPRFile apr_file(filename, APR_CREATE|APR_WRITE|APR_BINARY);
+ LLAPRFile apr_file(filename, APR_CREATE|APR_WRITE|APR_BINARY, mLocalAPRFilePoolp);
success = check_write(&apr_file, (void*)id.mData, UUID_BYTES) ;
diff --git a/indra/newview/llvocache.h b/indra/newview/llvocache.h
index 13651c6779..14e3b4c793 100644
--- a/indra/newview/llvocache.h
+++ b/indra/newview/llvocache.h
@@ -142,6 +142,7 @@ private:
U32 mNumEntries;
std::string mHeaderFileName ;
std::string mObjectCacheDirName;
+ LLVolatileAPRPool* mLocalAPRFilePoolp ;
header_entry_queue_t mHeaderEntryQueue;
handle_entry_map_t mHandleEntryMap;
diff --git a/indra/newview/llvograss.cpp b/indra/newview/llvograss.cpp
index 32822e1181..8a79d564d3 100644
--- a/indra/newview/llvograss.cpp
+++ b/indra/newview/llvograss.cpp
@@ -464,7 +464,7 @@ void LLVOGrass::plantBlades()
}
void LLVOGrass::getGeometry(S32 idx,
- LLStrider<LLVector3>& verticesp,
+ LLStrider<LLVector4a>& verticesp,
LLStrider<LLVector3>& normalsp,
LLStrider<LLVector2>& texcoordsp,
LLStrider<LLColor4U>& colorsp,
@@ -516,21 +516,24 @@ void LLVOGrass::getGeometry(S32 idx,
position.mV[0] = mPosition.mV[VX] + x + xf;
position.mV[1] = mPosition.mV[VY] + y + yf;
position.mV[2] = mRegionp->getLand().resolveHeightRegion(position);
- *verticesp++ = v1 = position + mRegionp->getOriginAgent();
- *verticesp++ = v1;
+ v1 = position + mRegionp->getOriginAgent();
+ (*verticesp++).load3(v1.mV);
+ (*verticesp++).load3(v1.mV);
position.mV[0] += dzx;
position.mV[1] += dzy;
position.mV[2] += blade_height;
- *verticesp++ = v2 = position + mRegionp->getOriginAgent();
- *verticesp++ = v2;
+ v2 = position + mRegionp->getOriginAgent();
+ (*verticesp++).load3(v2.mV);
+ (*verticesp++).load3(v2.mV);
position.mV[0] = mPosition.mV[VX] + x - xf;
position.mV[1] = mPosition.mV[VY] + y - xf;
position.mV[2] = mRegionp->getLand().resolveHeightRegion(position);
- *verticesp++ = v3 = position + mRegionp->getOriginAgent();
- *verticesp++ = v3;
+ v3 = position + mRegionp->getOriginAgent();
+ (*verticesp++).load3(v3.mV);
+ (*verticesp++).load3(v3.mV);
LLVector3 normal1 = (v1-v2) % (v2-v3);
normal1.mV[VZ] = 0.75f;
@@ -541,8 +544,9 @@ void LLVOGrass::getGeometry(S32 idx,
position.mV[0] += dzx;
position.mV[1] += dzy;
position.mV[2] += blade_height;
- *verticesp++ = v1 = position + mRegionp->getOriginAgent();
- *verticesp++ = v1;
+ v1 = position + mRegionp->getOriginAgent();
+ (*verticesp++).load3(v1.mV);
+ (*verticesp++).load3(v1.mV);
*(normalsp++) = normal1;
*(normalsp++) = normal2;
diff --git a/indra/newview/llvograss.h b/indra/newview/llvograss.h
index c262fdcc79..00a59facf7 100644
--- a/indra/newview/llvograss.h
+++ b/indra/newview/llvograss.h
@@ -59,7 +59,7 @@ public:
/*virtual*/ LLDrawable* createDrawable(LLPipeline *pipeline);
/*virtual*/ BOOL updateGeometry(LLDrawable *drawable);
/*virtual*/ void getGeometry(S32 idx,
- LLStrider<LLVector3>& verticesp,
+ LLStrider<LLVector4a>& verticesp,
LLStrider<LLVector3>& normalsp,
LLStrider<LLVector2>& texcoordsp,
LLStrider<LLColor4U>& colorsp,
diff --git a/indra/newview/llvoground.cpp b/indra/newview/llvoground.cpp
index ce256fdedf..0060f81ab5 100644
--- a/indra/newview/llvoground.cpp
+++ b/indra/newview/llvoground.cpp
@@ -162,7 +162,7 @@ BOOL LLVOGround::updateGeometry(LLDrawable *drawable)
*(texCoordsp++) = LLVector2(0.f, 1.f);
*(texCoordsp++) = LLVector2(0.5f, 0.5f);
- face->getVertexBuffer()->setBuffer(0);
+ face->getVertexBuffer()->flush();
LLPipeline::sCompiles++;
return TRUE;
}
diff --git a/indra/newview/llvoicevivox.cpp b/indra/newview/llvoicevivox.cpp
index 90a05cd9e5..820d1d73e1 100644
--- a/indra/newview/llvoicevivox.cpp
+++ b/indra/newview/llvoicevivox.cpp
@@ -27,8 +27,6 @@
#include "llviewerprecompiledheaders.h"
#include "llvoicevivox.h"
-#include <boost/tokenizer.hpp>
-
#include "llsdutil.h"
// Linden library includes
@@ -47,6 +45,7 @@
#include "llbase64.h"
#include "llviewercontrol.h"
#include "llappviewer.h" // for gDisconnected, gDisableVoice
+#include "llprocess.h"
// Viewer includes
#include "llmutelist.h" // to check for muted avatars
@@ -55,13 +54,12 @@
#include "llimview.h" // for LLIMMgr
#include "llparcel.h"
#include "llviewerparcelmgr.h"
-//#include "llfirstuse.h"
+#include "llfirstuse.h"
#include "llspeakers.h"
#include "lltrans.h"
#include "llviewerwindow.h"
#include "llviewercamera.h"
-#include "llfloaterfriends.h" //VIVOX, inorder to refresh communicate panel
#include "llviewernetwork.h"
#include "llnotificationsutil.h"
@@ -243,59 +241,21 @@ void LLVivoxVoiceClientCapResponder::result(const LLSD& content)
}
}
+static LLProcessPtr sGatewayPtr;
-
-#if LL_WINDOWS
-static HANDLE sGatewayHandle = 0;
-
-static bool isGatewayRunning()
-{
- bool result = false;
- if(sGatewayHandle != 0)
- {
- DWORD waitresult = WaitForSingleObject(sGatewayHandle, 0);
- if(waitresult != WAIT_OBJECT_0)
- {
- result = true;
- }
- }
- return result;
-}
-static void killGateway()
-{
- if(sGatewayHandle != 0)
- {
- TerminateProcess(sGatewayHandle,0);
- }
-}
-
-#else // Mac and linux
-
-static pid_t sGatewayPID = 0;
static bool isGatewayRunning()
{
- bool result = false;
- if(sGatewayPID != 0)
- {
- // A kill with signal number 0 has no effect, just does error checking. It should return an error if the process no longer exists.
- if(kill(sGatewayPID, 0) == 0)
- {
- result = true;
- }
- }
- return result;
+ return sGatewayPtr && sGatewayPtr->isRunning();
}
static void killGateway()
{
- if(sGatewayPID != 0)
+ if (sGatewayPtr)
{
- kill(sGatewayPID, SIGTERM);
+ sGatewayPtr->kill();
}
}
-#endif
-
///////////////////////////////////////////////////////////////////////////////////////////////
LLVivoxVoiceClient::LLVivoxVoiceClient() :
@@ -791,7 +751,7 @@ void LLVivoxVoiceClient::stateMachine()
}
else if(!isGatewayRunning())
{
- if(true)
+ if (true) // production build, not test
{
// Launch the voice daemon
@@ -810,102 +770,33 @@ void LLVivoxVoiceClient::stateMachine()
#endif
// See if the vivox executable exists
llstat s;
- if(!LLFile::stat(exe_path, &s))
+ if (!LLFile::stat(exe_path, &s))
{
// vivox executable exists. Build the command line and launch the daemon.
+ LLProcess::Params params;
+ params.executable = exe_path;
// SLIM SDK: these arguments are no longer necessary.
// std::string args = " -p tcp -h -c";
- std::string args;
- std::string cmd;
std::string loglevel = gSavedSettings.getString("VivoxDebugLevel");
-
if(loglevel.empty())
{
loglevel = "-1"; // turn logging off completely
}
-
- args += " -ll ";
- args += loglevel;
-
- LL_DEBUGS("Voice") << "Args for SLVoice: " << args << LL_ENDL;
-#if LL_WINDOWS
- PROCESS_INFORMATION pinfo;
- STARTUPINFOA sinfo;
-
- memset(&sinfo, 0, sizeof(sinfo));
-
- std::string exe_dir = gDirUtilp->getAppRODataDir();
- cmd = "SLVoice.exe";
- cmd += args;
-
- // So retarded. Windows requires that the second parameter to CreateProcessA be writable (non-const) string...
- char *args2 = new char[args.size() + 1];
- strcpy(args2, args.c_str());
- if(!CreateProcessA(exe_path.c_str(), args2, NULL, NULL, FALSE, 0, NULL, exe_dir.c_str(), &sinfo, &pinfo))
- {
-// DWORD dwErr = GetLastError();
- }
- else
- {
- // foo = pinfo.dwProcessId; // get your pid here if you want to use it later on
- // CloseHandle(pinfo.hProcess); // stops leaks - nothing else
- sGatewayHandle = pinfo.hProcess;
- CloseHandle(pinfo.hThread); // stops leaks - nothing else
- }
-
- delete[] args2;
-#else // LL_WINDOWS
- // This should be the same for mac and linux
- {
- std::vector<std::string> arglist;
- arglist.push_back(exe_path);
-
- // Split the argument string into separate strings for each argument
- typedef boost::tokenizer<boost::char_separator<char> > tokenizer;
- boost::char_separator<char> sep(" ");
- tokenizer tokens(args, sep);
- tokenizer::iterator token_iter;
-
- for(token_iter = tokens.begin(); token_iter != tokens.end(); ++token_iter)
- {
- arglist.push_back(*token_iter);
- }
-
- // create an argv vector for the child process
- char **fakeargv = new char*[arglist.size() + 1];
- int i;
- for(i=0; i < arglist.size(); i++)
- fakeargv[i] = const_cast<char*>(arglist[i].c_str());
+ params.args.add("-ll");
+ params.args.add(loglevel);
+ params.cwd = gDirUtilp->getAppRODataDir();
+ sGatewayPtr = LLProcess::create(params);
- fakeargv[i] = NULL;
-
- fflush(NULL); // flush all buffers before the child inherits them
- pid_t id = vfork();
- if(id == 0)
- {
- // child
- execv(exe_path.c_str(), fakeargv);
-
- // If we reach this point, the exec failed.
- // Use _exit() instead of exit() per the vfork man page.
- _exit(0);
- }
-
- // parent
- delete[] fakeargv;
- sGatewayPID = id;
- }
-#endif // LL_WINDOWS
mDaemonHost = LLHost(gSavedSettings.getString("VivoxVoiceHost").c_str(), gSavedSettings.getU32("VivoxVoicePort"));
- }
+ }
else
{
LL_INFOS("Voice") << exe_path << " not found." << LL_ENDL;
- }
+ }
}
else
- {
+ {
// SLIM SDK: port changed from 44124 to 44125.
// We can connect to a client gateway running on another host. This is useful for testing.
// To do this, launch the gateway on a nearby host like this:
@@ -942,7 +833,7 @@ void LLVivoxVoiceClient::stateMachine()
if(!mSocket)
{
- mSocket = LLSocket::create(LLSocket::STREAM_TCP);
+ mSocket = LLSocket::create(gAPRPoolp, LLSocket::STREAM_TCP);
}
mConnected = mSocket->blockingConnect(mDaemonHost);
@@ -6258,6 +6149,19 @@ void LLVivoxVoiceClient::notifyStatusObservers(LLVoiceClientStatusObserver::ESta
it = mStatusObservers.upper_bound(observer);
}
+ // skipped to avoid speak button blinking
+ if ( status != LLVoiceClientStatusObserver::STATUS_JOINING
+ && status != LLVoiceClientStatusObserver::STATUS_LEFT_CHANNEL)
+ {
+ bool voice_status = LLVoiceClient::getInstance()->voiceEnabled() && LLVoiceClient::getInstance()->isVoiceWorking();
+
+ gAgent.setVoiceConnected(voice_status);
+
+ if (voice_status)
+ {
+ LLFirstUse::speak(true);
+ }
+ }
}
void LLVivoxVoiceClient::addObserver(LLFriendObserver* observer)
@@ -7007,7 +6911,6 @@ void LLVivoxVoiceClient::captureBufferPlayStopSendMessage()
LLVivoxProtocolParser::LLVivoxProtocolParser()
{
- parser = NULL;
parser = XML_ParserCreate(NULL);
reset();
diff --git a/indra/newview/llvopartgroup.cpp b/indra/newview/llvopartgroup.cpp
index a4b0910c92..5c10a80b07 100644
--- a/indra/newview/llvopartgroup.cpp
+++ b/indra/newview/llvopartgroup.cpp
@@ -274,7 +274,7 @@ BOOL LLVOPartGroup::updateGeometry(LLDrawable *drawable)
}
void LLVOPartGroup::getGeometry(S32 idx,
- LLStrider<LLVector3>& verticesp,
+ LLStrider<LLVector4a>& verticesp,
LLStrider<LLVector3>& normalsp,
LLStrider<LLVector2>& texcoordsp,
LLStrider<LLColor4U>& colorsp,
@@ -290,37 +290,54 @@ void LLVOPartGroup::getGeometry(S32 idx,
U32 vert_offset = mDrawable->getFace(idx)->getGeomIndex();
- LLVector3 part_pos_agent(part.mPosAgent);
- LLVector3 camera_agent = getCameraPosition();
- LLVector3 at = part_pos_agent - camera_agent;
- LLVector3 up;
- LLVector3 right;
-
- right = at % LLVector3(0.f, 0.f, 1.f);
- right.normalize();
- up = right % at;
- up.normalize();
+ LLVector4a part_pos_agent;
+ part_pos_agent.load3(part.mPosAgent.mV);
+ LLVector4a camera_agent;
+ camera_agent.load3(getCameraPosition().mV);
+ LLVector4a at;
+ at.setSub(part_pos_agent, camera_agent);
+ LLVector4a up(0, 0, 1);
+ LLVector4a right;
+
+ right.setCross3(at, up);
+ right.normalize3fast();
+ up.setCross3(right, at);
+ up.normalize3fast();
if (part.mFlags & LLPartData::LL_PART_FOLLOW_VELOCITY_MASK)
{
- LLVector3 normvel = part.mVelocity;
- normvel.normalize();
+ LLVector4a normvel;
+ normvel.load3(part.mVelocity.mV);
+ normvel.normalize3fast();
LLVector2 up_fracs;
- up_fracs.mV[0] = normvel*right;
- up_fracs.mV[1] = normvel*up;
+ up_fracs.mV[0] = normvel.dot3(right).getF32();
+ up_fracs.mV[1] = normvel.dot3(up).getF32();
up_fracs.normalize();
- LLVector3 new_up;
- LLVector3 new_right;
- new_up = up_fracs.mV[0] * right + up_fracs.mV[1]*up;
- new_right = up_fracs.mV[1] * right - up_fracs.mV[0]*up;
+ LLVector4a new_up;
+ LLVector4a new_right;
+
+ //new_up = up_fracs.mV[0] * right + up_fracs.mV[1]*up;
+ LLVector4a t = right;
+ t.mul(up_fracs.mV[0]);
+ new_up = up;
+ new_up.mul(up_fracs.mV[1]);
+ new_up.add(t);
+
+ //new_right = up_fracs.mV[1] * right - up_fracs.mV[0]*up;
+ t = right;
+ t.mul(up_fracs.mV[1]);
+ new_right = up;
+ new_right.mul(up_fracs.mV[0]);
+ t.sub(new_right);
+
up = new_up;
- right = new_right;
- up.normalize();
- right.normalize();
+ right = t;
+ up.normalize3fast();
+ right.normalize3fast();
}
- right *= 0.5f*part.mScale.mV[0];
- up *= 0.5f*part.mScale.mV[1];
+ right.mul(0.5f*part.mScale.mV[0]);
+ up.mul(0.5f*part.mScale.mV[1]);
LLVector3 normal = -LLViewerCamera::getInstance()->getXAxis();
@@ -329,14 +346,25 @@ void LLVOPartGroup::getGeometry(S32 idx,
// this works because there is actually a 4th float stored after the vertex position which is used as a texture index
// also, somebody please VECTORIZE THIS
- verticesp->mV[3] = 0.f;
- *verticesp++ = part_pos_agent + up - right;
- verticesp->mV[3] = 0.f;
- *verticesp++ = part_pos_agent - up - right;
- verticesp->mV[3] = 0.f;
- *verticesp++ = part_pos_agent + up + right;
- verticesp->mV[3] = 0.f;
- *verticesp++ = part_pos_agent - up + right;
+ LLVector4a ppapu;
+ LLVector4a ppamu;
+
+ ppapu.setAdd(part_pos_agent, up);
+ ppamu.setSub(part_pos_agent, up);
+
+ verticesp->setSub(ppapu, right);
+ (*verticesp++).getF32ptr()[3] = 0.f;
+ verticesp->setSub(ppamu, right);
+ (*verticesp++).getF32ptr()[3] = 0.f;
+ verticesp->setAdd(ppapu, right);
+ (*verticesp++).getF32ptr()[3] = 0.f;
+ verticesp->setAdd(ppamu, right);
+ (*verticesp++).getF32ptr()[3] = 0.f;
+
+ //*verticesp++ = part_pos_agent + up - right;
+ //*verticesp++ = part_pos_agent - up - right;
+ //*verticesp++ = part_pos_agent + up + right;
+ //*verticesp++ = part_pos_agent - up + right;
*colorsp++ = part.mColor;
*colorsp++ = part.mColor;
@@ -453,7 +481,7 @@ void LLParticlePartition::getGeometry(LLSpatialGroup* group)
LLVertexBuffer* buffer = group->mVertexBuffer;
LLStrider<U16> indicesp;
- LLStrider<LLVector3> verticesp;
+ LLStrider<LLVector4a> verticesp;
LLStrider<LLVector3> normalsp;
LLStrider<LLVector2> texcoordsp;
LLStrider<LLColor4U> colorsp;
@@ -513,7 +541,7 @@ void LLParticlePartition::getGeometry(LLSpatialGroup* group)
}
}
- buffer->setBuffer(0);
+ buffer->flush();
mFaceList.clear();
}
diff --git a/indra/newview/llvopartgroup.h b/indra/newview/llvopartgroup.h
index 4db893b4ef..e58fed86d9 100644
--- a/indra/newview/llvopartgroup.h
+++ b/indra/newview/llvopartgroup.h
@@ -60,7 +60,7 @@ public:
/*virtual*/ LLDrawable* createDrawable(LLPipeline *pipeline);
/*virtual*/ BOOL updateGeometry(LLDrawable *drawable);
void getGeometry(S32 idx,
- LLStrider<LLVector3>& verticesp,
+ LLStrider<LLVector4a>& verticesp,
LLStrider<LLVector3>& normalsp,
LLStrider<LLVector2>& texcoordsp,
LLStrider<LLColor4U>& colorsp,
diff --git a/indra/newview/llvosky.cpp b/indra/newview/llvosky.cpp
index ef21e7373e..e9db37821b 100644
--- a/indra/newview/llvosky.cpp
+++ b/indra/newview/llvosky.cpp
@@ -1267,7 +1267,7 @@ void LLVOSky::updateDummyVertexBuffer()
LLStrider<LLVector3> vertices ;
mFace[FACE_DUMMY]->getVertexBuffer()->getVertexStrider(vertices, 0);
*vertices = mCameraPosAgent ;
- mFace[FACE_DUMMY]->getVertexBuffer()->setBuffer(0) ;
+ mFace[FACE_DUMMY]->getVertexBuffer()->flush();
}
//----------------------------------
//end of fake vertex buffer updating
@@ -1351,7 +1351,7 @@ BOOL LLVOSky::updateGeometry(LLDrawable *drawable)
*indicesp++ = index_offset + 3;
*indicesp++ = index_offset + 2;
- buff->setBuffer(0);
+ buff->flush();
}
}
@@ -1516,7 +1516,7 @@ BOOL LLVOSky::updateHeavenlyBodyGeometry(LLDrawable *drawable, const S32 f, cons
*indicesp++ = index_offset + 2;
*indicesp++ = index_offset + 3;
- facep->getVertexBuffer()->setBuffer(0);
+ facep->getVertexBuffer()->flush();
if (is_sun)
{
@@ -2030,7 +2030,7 @@ void LLVOSky::updateReflectionGeometry(LLDrawable *drawable, F32 H,
}
}
- face->getVertexBuffer()->setBuffer(0);
+ face->getVertexBuffer()->flush();
}
@@ -2040,9 +2040,12 @@ void LLVOSky::updateFog(const F32 distance)
{
if (!gPipeline.hasRenderDebugFeatureMask(LLPipeline::RENDER_DEBUG_FEATURE_FOG))
{
- glFogf(GL_FOG_DENSITY, 0);
- glFogfv(GL_FOG_COLOR, (F32 *) &LLColor4::white.mV);
- glFogf(GL_FOG_END, 1000000.f);
+ if (!LLGLSLShader::sNoFixedFunction)
+ {
+ glFogf(GL_FOG_DENSITY, 0);
+ glFogfv(GL_FOG_COLOR, (F32 *) &LLColor4::white.mV);
+ glFogf(GL_FOG_END, 1000000.f);
+ }
return;
}
@@ -2112,7 +2115,10 @@ void LLVOSky::updateFog(const F32 distance)
if (camera_height > water_height)
{
LLColor4 fog(render_fog_color);
- glFogfv(GL_FOG_COLOR, fog.mV);
+ if (!LLGLSLShader::sNoFixedFunction)
+ {
+ glFogfv(GL_FOG_COLOR, fog.mV);
+ }
mGLFogCol = fog;
if (hide_clip_plane)
@@ -2120,13 +2126,19 @@ void LLVOSky::updateFog(const F32 distance)
// For now, set the density to extend to the cull distance.
const F32 f_log = 2.14596602628934723963618357029f; // sqrt(fabs(log(0.01f)))
fog_density = f_log/fog_distance;
- glFogi(GL_FOG_MODE, GL_EXP2);
+ if (!LLGLSLShader::sNoFixedFunction)
+ {
+ glFogi(GL_FOG_MODE, GL_EXP2);
+ }
}
else
{
const F32 f_log = 4.6051701859880913680359829093687f; // fabs(log(0.01f))
fog_density = (f_log)/fog_distance;
- glFogi(GL_FOG_MODE, GL_EXP);
+ if (!LLGLSLShader::sNoFixedFunction)
+ {
+ glFogi(GL_FOG_MODE, GL_EXP);
+ }
}
}
else
@@ -2146,23 +2158,29 @@ void LLVOSky::updateFog(const F32 distance)
fogCol.setAlpha(1);
// set the gl fog color
- glFogfv(GL_FOG_COLOR, (F32 *) &fogCol.mV);
mGLFogCol = fogCol;
// set the density based on what the shaders use
fog_density = water_fog_density * gSavedSettings.getF32("WaterGLFogDensityScale");
- glFogi(GL_FOG_MODE, GL_EXP2);
+
+ if (!LLGLSLShader::sNoFixedFunction)
+ {
+ glFogfv(GL_FOG_COLOR, (F32 *) &fogCol.mV);
+ glFogi(GL_FOG_MODE, GL_EXP2);
+ }
}
mFogColor = sky_fog_color;
mFogColor.setAlpha(1);
- LLGLSFog gls_fog;
+ LLDrawPoolWater::sWaterFogEnd = fog_distance*2.2f;
- glFogf(GL_FOG_END, fog_distance*2.2f);
-
- glFogf(GL_FOG_DENSITY, fog_density);
-
- glHint(GL_FOG_HINT, GL_NICEST);
+ if (!LLGLSLShader::sNoFixedFunction)
+ {
+ LLGLSFog gls_fog;
+ glFogf(GL_FOG_END, fog_distance*2.2f);
+ glFogf(GL_FOG_DENSITY, fog_density);
+ glHint(GL_FOG_HINT, GL_NICEST);
+ }
stop_glerror();
}
diff --git a/indra/newview/llvosurfacepatch.cpp b/indra/newview/llvosurfacepatch.cpp
index 510525259f..bf6158eeaf 100644
--- a/indra/newview/llvosurfacepatch.cpp
+++ b/indra/newview/llvosurfacepatch.cpp
@@ -57,9 +57,15 @@ public:
};
// virtual
- void setupVertexBuffer(U32 data_mask) const
+ void setupVertexBuffer(U32 data_mask)
{
- U8* base = useVBOs() ? (U8*) mAlignedOffset : mMappedData;
+ if (LLGLSLShader::sNoFixedFunction)
+ { //just use default if shaders are in play
+ LLVertexBuffer::setupVertexBuffer(data_mask & ~(MAP_TEXCOORD2 | MAP_TEXCOORD3));
+ return;
+ }
+
+ volatile U8* base = useVBOs() ? (U8*) mAlignedOffset : mMappedData;
//assume tex coords 2 and 3 are present
U32 type_mask = mTypeMask | MAP_TEXCOORD2 | MAP_TEXCOORD3;
@@ -106,20 +112,6 @@ public:
glColorPointer(4, GL_UNSIGNED_BYTE, LLVertexBuffer::sTypeSize[TYPE_COLOR], (void*)(base + mOffsets[TYPE_COLOR]));
}
- if (data_mask & MAP_WEIGHT)
- {
- glVertexAttribPointerARB(1, 1, GL_FLOAT, FALSE, LLVertexBuffer::sTypeSize[TYPE_WEIGHT], (void*)(base + mOffsets[TYPE_WEIGHT]));
- }
-
- if (data_mask & MAP_WEIGHT4 && sWeight4Loc != -1)
- {
- glVertexAttribPointerARB(sWeight4Loc, 4, GL_FLOAT, FALSE, LLVertexBuffer::sTypeSize[TYPE_WEIGHT4], (void*)(base+mOffsets[TYPE_WEIGHT4]));
- }
-
- if (data_mask & MAP_CLOTHWEIGHT)
- {
- glVertexAttribPointerARB(4, 4, GL_FLOAT, TRUE, LLVertexBuffer::sTypeSize[TYPE_CLOTHWEIGHT], (void*)(base + mOffsets[TYPE_CLOTHWEIGHT]));
- }
if (data_mask & MAP_VERTEX)
{
glVertexPointer(3,GL_FLOAT, LLVertexBuffer::sTypeSize[TYPE_VERTEX], (void*)(base + 0));
@@ -325,7 +317,6 @@ BOOL LLVOSurfacePatch::updateLOD()
void LLVOSurfacePatch::getGeometry(LLStrider<LLVector3> &verticesp,
LLStrider<LLVector3> &normalsp,
- LLStrider<LLColor4U> &colorsp,
LLStrider<LLVector2> &texCoords0p,
LLStrider<LLVector2> &texCoords1p,
LLStrider<U16> &indicesp)
@@ -337,7 +328,6 @@ void LLVOSurfacePatch::getGeometry(LLStrider<LLVector3> &verticesp,
updateMainGeometry(facep,
verticesp,
normalsp,
- colorsp,
texCoords0p,
texCoords1p,
indicesp,
@@ -345,7 +335,6 @@ void LLVOSurfacePatch::getGeometry(LLStrider<LLVector3> &verticesp,
updateNorthGeometry(facep,
verticesp,
normalsp,
- colorsp,
texCoords0p,
texCoords1p,
indicesp,
@@ -353,7 +342,6 @@ void LLVOSurfacePatch::getGeometry(LLStrider<LLVector3> &verticesp,
updateEastGeometry(facep,
verticesp,
normalsp,
- colorsp,
texCoords0p,
texCoords1p,
indicesp,
@@ -363,7 +351,6 @@ void LLVOSurfacePatch::getGeometry(LLStrider<LLVector3> &verticesp,
void LLVOSurfacePatch::updateMainGeometry(LLFace *facep,
LLStrider<LLVector3> &verticesp,
LLStrider<LLVector3> &normalsp,
- LLStrider<LLColor4U> &colorsp,
LLStrider<LLVector2> &texCoords0p,
LLStrider<LLVector2> &texCoords1p,
LLStrider<U16> &indicesp,
@@ -404,7 +391,6 @@ void LLVOSurfacePatch::updateMainGeometry(LLFace *facep,
x = i * render_stride;
y = j * render_stride;
mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords0p.get(), texCoords1p.get());
- *colorsp++ = LLColor4U::white;
verticesp++;
normalsp++;
texCoords0p++;
@@ -469,7 +455,6 @@ void LLVOSurfacePatch::updateMainGeometry(LLFace *facep,
void LLVOSurfacePatch::updateNorthGeometry(LLFace *facep,
LLStrider<LLVector3> &verticesp,
LLStrider<LLVector3> &normalsp,
- LLStrider<LLColor4U> &colorsp,
LLStrider<LLVector2> &texCoords0p,
LLStrider<LLVector2> &texCoords1p,
LLStrider<U16> &indicesp,
@@ -507,7 +492,6 @@ void LLVOSurfacePatch::updateNorthGeometry(LLFace *facep,
y = 16 - render_stride;
mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords0p.get(), texCoords1p.get());
- *colorsp++ = LLColor4U::white;
verticesp++;
normalsp++;
texCoords0p++;
@@ -523,7 +507,6 @@ void LLVOSurfacePatch::updateNorthGeometry(LLFace *facep,
mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords0p.get(), texCoords1p.get());
verticesp++;
normalsp++;
- *colorsp++ = LLColor4U::white;
texCoords0p++;
texCoords1p++;
vertex_count++;
@@ -562,7 +545,6 @@ void LLVOSurfacePatch::updateNorthGeometry(LLFace *facep,
mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords0p.get(), texCoords1p.get());
verticesp++;
normalsp++;
- *colorsp++ = LLColor4U::white;
texCoords0p++;
texCoords1p++;
vertex_count++;
@@ -577,7 +559,6 @@ void LLVOSurfacePatch::updateNorthGeometry(LLFace *facep,
mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords0p.get(), texCoords1p.get());
verticesp++;
normalsp++;
- *colorsp++ = LLColor4U::white;
texCoords0p++;
texCoords1p++;
vertex_count++;
@@ -621,7 +602,6 @@ void LLVOSurfacePatch::updateNorthGeometry(LLFace *facep,
y = 16 - render_stride;
mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords0p.get(), texCoords1p.get());
- *colorsp++ = LLColor4U::white;
verticesp++;
normalsp++;
texCoords0p++;
@@ -638,7 +618,6 @@ void LLVOSurfacePatch::updateNorthGeometry(LLFace *facep,
mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords0p.get(), texCoords1p.get());
verticesp++;
normalsp++;
- *colorsp++ = LLColor4U::white;
texCoords0p++;
texCoords1p++;
vertex_count++;
@@ -676,7 +655,6 @@ void LLVOSurfacePatch::updateNorthGeometry(LLFace *facep,
void LLVOSurfacePatch::updateEastGeometry(LLFace *facep,
LLStrider<LLVector3> &verticesp,
LLStrider<LLVector3> &normalsp,
- LLStrider<LLColor4U> &colorsp,
LLStrider<LLVector2> &texCoords0p,
LLStrider<LLVector2> &texCoords1p,
LLStrider<U16> &indicesp,
@@ -710,7 +688,6 @@ void LLVOSurfacePatch::updateEastGeometry(LLFace *facep,
mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords0p.get(), texCoords1p.get());
verticesp++;
normalsp++;
- *colorsp++ = LLColor4U::white;
texCoords0p++;
texCoords1p++;
}
@@ -723,7 +700,6 @@ void LLVOSurfacePatch::updateEastGeometry(LLFace *facep,
mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords0p.get(), texCoords1p.get());
verticesp++;
normalsp++;
- *colorsp++ = LLColor4U::white;
texCoords0p++;
texCoords1p++;
}
@@ -761,7 +737,6 @@ void LLVOSurfacePatch::updateEastGeometry(LLFace *facep,
mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords0p.get(), texCoords1p.get());
verticesp++;
normalsp++;
- *colorsp++ = LLColor4U::white;
texCoords0p++;
texCoords1p++;
}
@@ -774,7 +749,6 @@ void LLVOSurfacePatch::updateEastGeometry(LLFace *facep,
mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords0p.get(), texCoords1p.get());
verticesp++;
normalsp++;
- *colorsp++ = LLColor4U::white;
texCoords0p++;
texCoords1p++;
}
@@ -818,7 +792,6 @@ void LLVOSurfacePatch::updateEastGeometry(LLFace *facep,
mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords0p.get(), texCoords1p.get());
verticesp++;
normalsp++;
- *colorsp++ = LLColor4U::white;
texCoords0p++;
texCoords1p++;
}
@@ -831,7 +804,6 @@ void LLVOSurfacePatch::updateEastGeometry(LLFace *facep,
mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords0p.get(), texCoords1p.get());
verticesp++;
normalsp++;
- *colorsp++ = LLColor4U::white;
texCoords0p++;
texCoords1p++;
}
@@ -1063,6 +1035,8 @@ void LLVOSurfacePatch::updateSpatialExtents(LLVector4a& newMin, LLVector4a &newM
{
LLVector3 posAgent = getPositionAgent();
LLVector3 scale = getScale();
+ //make z-axis scale at least 1 to avoid shadow artifacts on totally flat land
+ scale.mV[VZ] = llmax(scale.mV[VZ], 1.f);
newMin.load3( (posAgent-scale*0.5f).mV); // Changing to 2.f makes the culling a -little- better, but still wrong
newMax.load3( (posAgent+scale*0.5f).mV);
LLVector4a pos;
@@ -1102,14 +1076,12 @@ void LLTerrainPartition::getGeometry(LLSpatialGroup* group)
LLStrider<LLVector3> normals;
LLStrider<LLVector2> texcoords2;
LLStrider<LLVector2> texcoords;
- LLStrider<LLColor4U> colors;
LLStrider<U16> indices;
llassert_always(buffer->getVertexStrider(vertices));
llassert_always(buffer->getNormalStrider(normals));
llassert_always(buffer->getTexCoord0Strider(texcoords));
llassert_always(buffer->getTexCoord1Strider(texcoords2));
- llassert_always(buffer->getColorStrider(colors));
llassert_always(buffer->getIndexStrider(indices));
U32 indices_index = 0;
@@ -1124,13 +1096,13 @@ void LLTerrainPartition::getGeometry(LLSpatialGroup* group)
facep->setVertexBuffer(buffer);
LLVOSurfacePatch* patchp = (LLVOSurfacePatch*) facep->getViewerObject();
- patchp->getGeometry(vertices, normals, colors, texcoords, texcoords2, indices);
+ patchp->getGeometry(vertices, normals, texcoords, texcoords2, indices);
indices_index += facep->getIndicesCount();
index_offset += facep->getGeomCount();
}
- buffer->setBuffer(0);
+ buffer->flush();
mFaceList.clear();
}
diff --git a/indra/newview/llvosurfacepatch.h b/indra/newview/llvosurfacepatch.h
index 8e75ff2e6e..a15878368e 100644
--- a/indra/newview/llvosurfacepatch.h
+++ b/indra/newview/llvosurfacepatch.h
@@ -44,8 +44,7 @@ public:
VERTEX_DATA_MASK = (1 << LLVertexBuffer::TYPE_VERTEX) |
(1 << LLVertexBuffer::TYPE_NORMAL) |
(1 << LLVertexBuffer::TYPE_TEXCOORD0) |
- (1 << LLVertexBuffer::TYPE_TEXCOORD1) |
- (1 << LLVertexBuffer::TYPE_COLOR)
+ (1 << LLVertexBuffer::TYPE_TEXCOORD1)
};
LLVOSurfacePatch(const LLUUID &id, const LLPCode pcode, LLViewerRegion *regionp);
@@ -64,7 +63,6 @@ public:
/*virtual*/ void updateFaceSize(S32 idx);
void getGeometry(LLStrider<LLVector3> &verticesp,
LLStrider<LLVector3> &normalsp,
- LLStrider<LLColor4U> &colorsp,
LLStrider<LLVector2> &texCoords0p,
LLStrider<LLVector2> &texCoords1p,
LLStrider<U16> &indicesp);
@@ -116,7 +114,6 @@ protected:
void updateMainGeometry(LLFace *facep,
LLStrider<LLVector3> &verticesp,
LLStrider<LLVector3> &normalsp,
- LLStrider<LLColor4U> &colorsp,
LLStrider<LLVector2> &texCoords0p,
LLStrider<LLVector2> &texCoords1p,
LLStrider<U16> &indicesp,
@@ -124,7 +121,6 @@ protected:
void updateNorthGeometry(LLFace *facep,
LLStrider<LLVector3> &verticesp,
LLStrider<LLVector3> &normalsp,
- LLStrider<LLColor4U> &colorsp,
LLStrider<LLVector2> &texCoords0p,
LLStrider<LLVector2> &texCoords1p,
LLStrider<U16> &indicesp,
@@ -132,7 +128,6 @@ protected:
void updateEastGeometry(LLFace *facep,
LLStrider<LLVector3> &verticesp,
LLStrider<LLVector3> &normalsp,
- LLStrider<LLColor4U> &colorsp,
LLStrider<LLVector2> &texCoords0p,
LLStrider<LLVector2> &texCoords1p,
LLStrider<U16> &indicesp,
diff --git a/indra/newview/llvotextbubble.cpp b/indra/newview/llvotextbubble.cpp
deleted file mode 100644
index a92172fe23..0000000000
--- a/indra/newview/llvotextbubble.cpp
+++ /dev/null
@@ -1,272 +0,0 @@
-/**
- * @file llvotextbubble.cpp
- * @brief Viewer-object text bubble.
- *
- * $LicenseInfo:firstyear=2001&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-#include "llviewerprecompiledheaders.h"
-
-#include "llvotextbubble.h"
-
-#include "imageids.h"
-#include "llviewercontrol.h"
-#include "llprimitive.h"
-#include "llrendersphere.h"
-
-#include "llbox.h"
-#include "lldrawable.h"
-#include "llface.h"
-#include "llviewertexturelist.h"
-#include "llvolume.h"
-#include "pipeline.h"
-#include "llvector4a.h"
-#include "llviewerregion.h"
-
-LLVOTextBubble::LLVOTextBubble(const LLUUID &id, const LLPCode pcode, LLViewerRegion *regionp)
-: LLAlphaObject(id, pcode, regionp)
-{
- setScale(LLVector3(1.5f, 1.5f, 0.25f));
- mbCanSelect = FALSE;
- mLOD = MIN_LOD;
- mVolumeChanged = TRUE;
- setVelocity(LLVector3(0.f, 0.f, 0.75f));
- LLVolumeParams volume_params;
- volume_params.setType(LL_PCODE_PROFILE_CIRCLE, LL_PCODE_PATH_LINE);
- volume_params.setBeginAndEndS(0.f, 1.f);
- volume_params.setBeginAndEndT(0.f, 1.f);
- volume_params.setRatio(0.25f, 0.25f);
- volume_params.setShear(0.f, 0.f);
- setVolume(volume_params, 0);
- mColor = LLColor4(1.0f, 0.0f, 0.0f, 1.f);
- S32 i;
- for (i = 0; i < getNumTEs(); i++)
- {
- setTEColor(i, mColor);
- setTETexture(i, LLUUID(IMG_DEFAULT));
- }
-}
-
-
-LLVOTextBubble::~LLVOTextBubble()
-{
-}
-
-
-BOOL LLVOTextBubble::isActive() const
-{
- return TRUE;
-}
-
-BOOL LLVOTextBubble::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time)
-{
- static LLFastTimer::DeclareTimer ftm("Text Bubble");
- LLFastTimer t(ftm);
-
- F32 dt = mUpdateTimer.getElapsedTimeF32();
- // Die after a few seconds.
- if (dt > 1.5f)
- {
- return FALSE;
- }
-
- LLViewerObject::idleUpdate(agent, world, time);
-
- setScale(0.5f * (1.f+dt) * LLVector3(1.5f, 1.5f, 0.5f));
-
- F32 alpha = 0.35f*dt;
-
- LLColor4 color = mColor;
- color.mV[VALPHA] -= alpha;
- if (color.mV[VALPHA] <= 0.05f)
- {
- return FALSE;
- }
- S32 i;
- for (i = 0; i < getNumTEs(); i++)
- {
- setTEColor(i, color);
- setTEFullbright(i, TRUE);
- }
-
- gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_VOLUME, TRUE);
- return TRUE;
-}
-
-
-void LLVOTextBubble::updateTextures()
-{
- // Update the image levels of all textures...
-
- for (U32 i = 0; i < getNumTEs(); i++)
- {
- const LLTextureEntry *te = getTE(i);
- F32 texel_area_ratio = fabs(te->mScaleS * te->mScaleT);
- texel_area_ratio = llclamp(texel_area_ratio, .125f, 16.f);
- LLViewerTexture *imagep = getTEImage(i);
- if (imagep)
- {
- imagep->addTextureStats(mPixelArea / texel_area_ratio);
- }
- }
-}
-
-
-LLDrawable *LLVOTextBubble::createDrawable(LLPipeline *pipeline)
-{
- pipeline->allocDrawable(this);
- mDrawable->setLit(FALSE);
- mDrawable->setRenderType(LLPipeline::RENDER_TYPE_VOLUME);
-
- for (U32 i = 0; i < getNumTEs(); i++)
- {
- LLViewerTexture *imagep;
- const LLTextureEntry *texture_entry = getTE(i);
- imagep = LLViewerTextureManager::getFetchedTexture(texture_entry->getID());
-
- mDrawable->addFace((LLFacePool*) NULL, imagep);
- }
-
- return mDrawable;
-}
-
-// virtual
-BOOL LLVOTextBubble::setVolume(const LLVolumeParams &volume_params, const S32 detail, bool unique_volume)
-{
- if (LLPrimitive::setVolume(volume_params, mLOD))
- {
- if (mDrawable)
- {
- gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_VOLUME, TRUE);
- mVolumeChanged = TRUE;
- }
- return TRUE;
- }
- return FALSE;
-}
-
-
-BOOL LLVOTextBubble::updateLOD()
-{
- return FALSE;
-}
-
-BOOL LLVOTextBubble::updateGeometry(LLDrawable *drawable)
-{
- if (!(gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_VOLUME)))
- return TRUE;
-
- if (mVolumeChanged)
- {
- LLVolumeParams volume_params = getVolume()->getParams();
- setVolume(volume_params, 0);
-
- LLPipeline::sCompiles++;
-
- drawable->setNumFaces(getVolume()->getNumFaces(), drawable->getFace(0)->getPool(), getTEImage(0));
- }
-
- LLMatrix4 identity4;
- LLMatrix3 identity3;
- for (S32 i = 0; i < drawable->getNumFaces(); i++)
- {
- LLFace *face = drawable->getFace(i);
- face->setTEOffset(i);
- face->setTexture(LLViewerFetchedTexture::sSmokeImagep);
- face->setState(LLFace::FULLBRIGHT);
- }
-
- mVolumeChanged = FALSE;
-
- mDrawable->movePartition();
- return TRUE;
-}
-
-void LLVOTextBubble::updateFaceSize(S32 idx)
-{
- LLFace* face = mDrawable->getFace(idx);
-
- if (idx == 0 || idx == 2)
- {
- face->setSize(0,0);
- }
- else
- {
- const LLVolumeFace& vol_face = getVolume()->getVolumeFace(idx);
- face->setSize(vol_face.mNumVertices, vol_face.mNumIndices);
- }
-}
-
-void LLVOTextBubble::getGeometry(S32 idx,
- LLStrider<LLVector3>& verticesp,
- LLStrider<LLVector3>& normalsp,
- LLStrider<LLVector2>& texcoordsp,
- LLStrider<LLColor4U>& colorsp,
- LLStrider<U16>& indicesp)
-{
- if (idx == 0 || idx == 2)
- {
- return;
- }
-
- const LLVolumeFace& face = getVolume()->getVolumeFace(idx);
-
- LLVector4a pos;
- pos.load3(getPositionAgent().mV);
-
- LLVector4a scale;
- scale.load3(getScale().mV);
-
- LLColor4U color = LLColor4U(getTE(idx)->getColor());
- U32 offset = mDrawable->getFace(idx)->getGeomIndex();
-
- LLVector4a* dst_pos = (LLVector4a*) verticesp.get();
- LLVector4a* src_pos = (LLVector4a*) face.mPositions;
-
- LLVector4a* dst_norm = (LLVector4a*) normalsp.get();
- LLVector4a* src_norm = (LLVector4a*) face.mNormals;
-
- LLVector2* dst_tc = (LLVector2*) texcoordsp.get();
- LLVector2* src_tc = (LLVector2*) face.mTexCoords;
-
- LLVector4a::memcpyNonAliased16((F32*) dst_norm, (F32*) src_norm, face.mNumVertices*4*sizeof(F32));
- LLVector4a::memcpyNonAliased16((F32*) dst_tc, (F32*) src_tc, face.mNumVertices*2*sizeof(F32));
-
-
- for (U32 i = 0; i < face.mNumVertices; i++)
- {
- LLVector4a t;
- t.setMul(src_pos[i], scale);
- dst_pos[i].setAdd(t, pos);
- *colorsp++ = color;
- }
-
- for (U32 i = 0; i < face.mNumIndices; i++)
- {
- *indicesp++ = face.mIndices[i] + offset;
- }
-}
-
-U32 LLVOTextBubble::getPartitionType() const
-{
- return LLViewerRegion::PARTITION_PARTICLE;
-}
diff --git a/indra/newview/llvotextbubble.h b/indra/newview/llvotextbubble.h
deleted file mode 100644
index 9c39929711..0000000000
--- a/indra/newview/llvotextbubble.h
+++ /dev/null
@@ -1,66 +0,0 @@
-/**
- * @file llvotextbubble.h
- * @brief Description of LLVORock class, which a derivation of LLViewerObject
- *
- * $LicenseInfo:firstyear=2001&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-#ifndef LL_LLVOTEXTBUBBLE_H
-#define LL_LLVOTEXTBUBBLE_H
-
-#include "llviewerobject.h"
-#include "llframetimer.h"
-
-class LLVOTextBubble : public LLAlphaObject
-{
-public:
- LLVOTextBubble(const LLUUID &id, const LLPCode pcode, LLViewerRegion *regionp);
-
- /*virtual*/ BOOL isActive() const; // Whether this object needs to do an idleUpdate.
- /*virtual*/ BOOL idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time);
-
- /*virtual*/ void updateTextures();
- /*virtual*/ LLDrawable* createDrawable(LLPipeline *pipeline);
- /*virtual*/ BOOL updateGeometry(LLDrawable *drawable);
- /*virtual*/ BOOL updateLOD();
- /*virtual*/ void updateFaceSize(S32 idx);
-
- /*virtual*/ void getGeometry(S32 idx,
- LLStrider<LLVector3>& verticesp,
- LLStrider<LLVector3>& normalsp,
- LLStrider<LLVector2>& texcoordsp,
- LLStrider<LLColor4U>& colorsp,
- LLStrider<U16>& indicesp);
-
- virtual U32 getPartitionType() const;
-
- LLColor4 mColor;
- S32 mLOD;
- BOOL mVolumeChanged;
-
-protected:
- ~LLVOTextBubble();
- BOOL setVolume(const LLVolumeParams &volume_params, const S32 detail, bool unique_volume = false);
- LLFrameTimer mUpdateTimer;
-};
-
-#endif // LL_VO_TEXT_BUBBLE
diff --git a/indra/newview/llvotree.cpp b/indra/newview/llvotree.cpp
index 890861df71..4564207da4 100644
--- a/indra/newview/llvotree.cpp
+++ b/indra/newview/llvotree.cpp
@@ -341,45 +341,11 @@ U32 LLVOTree::processUpdateMessage(LLMessageSystem *mesgsys,
BOOL LLVOTree::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time)
{
- const U16 FRAMES_PER_WIND_UPDATE = 20; // How many frames between wind update per tree
- const F32 TREE_WIND_SENSITIVITY = 0.005f;
- const F32 TREE_TRUNK_STIFFNESS = 0.1f;
-
if (mDead || !(gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_TREE)))
{
return TRUE;
}
- if (gSavedSettings.getBOOL("RenderAnimateTrees"))
- {
- F32 mass_inv;
-
- // For all tree objects, update the trunk bending with the current wind
- // Walk sprite list in order away from viewer
- if (!(mFrameCount % FRAMES_PER_WIND_UPDATE))
- {
- // If needed, Get latest wind for this tree
- mWind = mRegionp->mWind.getVelocity(getPositionRegion());
- }
- mFrameCount++;
-
- mass_inv = 1.f/(5.f + mDepth*mBranches*0.2f);
- mTrunkVel += (mWind * mass_inv * TREE_WIND_SENSITIVITY); // Pull in direction of wind
- mTrunkVel -= (mTrunkBend * mass_inv * TREE_TRUNK_STIFFNESS); // Restoring force in direction of trunk
- mTrunkBend += mTrunkVel;
- mTrunkVel *= 0.99f; // Add damping
-
- if (mTrunkBend.length() > 1.f)
- {
- mTrunkBend.normalize();
- }
-
- if (mTrunkVel.length() > 1.f)
- {
- mTrunkVel.normalize();
- }
- }
-
S32 trunk_LOD = sMAX_NUM_TREE_LOD_LEVELS ;
F32 app_angle = getAppAngle()*LLVOTree::sTreeFactor;
@@ -392,39 +358,36 @@ BOOL LLVOTree::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time)
}
}
- if (!gSavedSettings.getBOOL("RenderAnimateTrees"))
+ if (mReferenceBuffer.isNull())
{
- if (mReferenceBuffer.isNull())
- {
- gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_ALL, TRUE);
- }
- else if (trunk_LOD != mTrunkLOD)
+ gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_ALL, TRUE);
+ }
+ else if (trunk_LOD != mTrunkLOD)
+ {
+ gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_ALL, FALSE);
+ }
+ else
+ {
+ // we're not animating but we may *still* need to
+ // regenerate the mesh if we moved, since position
+ // and rotation are baked into the mesh.
+ // *TODO: I don't know what's so special about trees
+ // that they don't get REBUILD_POSITION automatically
+ // at a higher level.
+ const LLVector3 &this_position = getPositionAgent();
+ if (this_position != mLastPosition)
{
- gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_ALL, FALSE);
+ gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_POSITION);
+ mLastPosition = this_position;
}
else
{
- // we're not animating but we may *still* need to
- // regenerate the mesh if we moved, since position
- // and rotation are baked into the mesh.
- // *TODO: I don't know what's so special about trees
- // that they don't get REBUILD_POSITION automatically
- // at a higher level.
- const LLVector3 &this_position = getPositionAgent();
- if (this_position != mLastPosition)
+ const LLQuaternion &this_rotation = getRotation();
+
+ if (this_rotation != mLastRotation)
{
gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_POSITION);
- mLastPosition = this_position;
- }
- else
- {
- const LLQuaternion &this_rotation = getRotation();
-
- if (this_rotation != mLastRotation)
- {
- gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_POSITION);
- mLastRotation = this_rotation;
- }
+ mLastRotation = this_rotation;
}
}
}
@@ -559,7 +522,7 @@ BOOL LLVOTree::updateGeometry(LLDrawable *drawable)
max_vertices += sLODVertexCount[lod];
}
- mReferenceBuffer = new LLVertexBuffer(LLDrawPoolTree::VERTEX_DATA_MASK, gSavedSettings.getBOOL("RenderAnimateTrees") ? GL_STATIC_DRAW_ARB : 0);
+ mReferenceBuffer = new LLVertexBuffer(LLDrawPoolTree::VERTEX_DATA_MASK, 0);
mReferenceBuffer->allocateBuffer(max_vertices, max_indices, TRUE);
LLStrider<LLVector3> vertices;
@@ -858,20 +821,13 @@ BOOL LLVOTree::updateGeometry(LLDrawable *drawable)
slices /= 2;
}
- mReferenceBuffer->setBuffer(0);
+ mReferenceBuffer->flush();
llassert(vertex_count == max_vertices);
llassert(index_count == max_indices);
}
- if (gSavedSettings.getBOOL("RenderAnimateTrees"))
- {
- mDrawable->getFace(0)->setVertexBuffer(mReferenceBuffer);
- }
- else
- {
- //generate tree mesh
- updateMesh();
- }
+ //generate tree mesh
+ updateMesh();
return TRUE;
}
@@ -882,7 +838,7 @@ void LLVOTree::updateMesh()
// Translate to tree base HACK - adjustment in Z plants tree underground
const LLVector3 &pos_agent = getPositionAgent();
- //glTranslatef(pos_agent.mV[VX], pos_agent.mV[VY], pos_agent.mV[VZ] - 0.1f);
+ //gGL.translatef(pos_agent.mV[VX], pos_agent.mV[VY], pos_agent.mV[VZ] - 0.1f);
LLMatrix4 trans_mat;
trans_mat.setTranslation(pos_agent.mV[VX], pos_agent.mV[VY], pos_agent.mV[VZ] - 0.1f);
trans_mat *= matrix;
@@ -940,8 +896,8 @@ void LLVOTree::updateMesh()
genBranchPipeline(vertices, normals, tex_coords, indices, idx_offset, scale_mat, mTrunkLOD, stop_depth, mDepth, mTrunkDepth, 1.0, mTwist, droop, mBranches, alpha);
- mReferenceBuffer->setBuffer(0);
- buff->setBuffer(0);
+ mReferenceBuffer->flush();
+ buff->flush();
}
void LLVOTree::appendMesh(LLStrider<LLVector3>& vertices,
@@ -1158,7 +1114,8 @@ U32 LLVOTree::drawBranchPipeline(LLMatrix4& matrix, U16* indicesp, S32 trunk_LOD
scale_mat.mMatrix[2][2] = scale*length;
scale_mat *= matrix;
- glLoadMatrixf((F32*) scale_mat.mMatrix);
+ gGL.loadMatrix((F32*) scale_mat.mMatrix);
+ gGL.syncMatrices();
glDrawElements(GL_TRIANGLES, sLODIndexCount[trunk_LOD], GL_UNSIGNED_SHORT, indicesp + sLODIndexOffset[trunk_LOD]);
gPipeline.addTrianglesDrawn(LEAF_INDICES);
stop_glerror();
@@ -1208,7 +1165,8 @@ U32 LLVOTree::drawBranchPipeline(LLMatrix4& matrix, U16* indicesp, S32 trunk_LOD
scale_mat *= matrix;
- glLoadMatrixf((F32*) scale_mat.mMatrix);
+ gGL.loadMatrix((F32*) scale_mat.mMatrix);
+ gGL.syncMatrices();
glDrawElements(GL_TRIANGLES, LEAF_INDICES, GL_UNSIGNED_SHORT, indicesp);
gPipeline.addTrianglesDrawn(LEAF_INDICES);
stop_glerror();
@@ -1229,19 +1187,20 @@ U32 LLVOTree::drawBranchPipeline(LLMatrix4& matrix, U16* indicesp, S32 trunk_LOD
scale_mat *= matrix;
- glMatrixMode(GL_TEXTURE);
- glTranslatef(0.0, -0.5, 0.0);
- glMatrixMode(GL_MODELVIEW);
+ gGL.matrixMode(LLRender::MM_TEXTURE);
+ gGL.translatef(0.0, -0.5, 0.0);
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
- glLoadMatrixf((F32*) scale_mat.mMatrix);
+ gGL.loadMatrix((F32*) scale_mat.mMatrix);
+ gGL.syncMatrices();
glDrawElements(GL_TRIANGLES, LEAF_INDICES, GL_UNSIGNED_SHORT, indicesp);
gPipeline.addTrianglesDrawn(LEAF_INDICES);
stop_glerror();
ret += LEAF_INDICES;
- glMatrixMode(GL_TEXTURE);
- glLoadIdentity();
- glMatrixMode(GL_MODELVIEW);
+ gGL.matrixMode(LLRender::MM_TEXTURE);
+ gGL.loadIdentity();
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
}
return ret;
diff --git a/indra/newview/llvotree.h b/indra/newview/llvotree.h
index 1e1deede26..0554935539 100644
--- a/indra/newview/llvotree.h
+++ b/indra/newview/llvotree.h
@@ -152,7 +152,6 @@ public:
friend class LLDrawPoolTree;
protected:
LLVector3 mTrunkBend; // Accumulated wind (used for blowing trees)
- LLVector3 mTrunkVel; //
LLVector3 mWind;
LLPointer<LLVertexBuffer> mReferenceBuffer; //reference geometry for generating tree mesh
diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp
index 380d63c77b..03d4c51aff 100755..100644
--- a/indra/newview/llvovolume.cpp
+++ b/indra/newview/llvovolume.cpp
@@ -3266,13 +3266,13 @@ void LLVOVolume::updateRenderComplexity()
mRenderComplexity_current = 0;
}
-U32 LLVOVolume::getTriangleCount() const
+U32 LLVOVolume::getTriangleCount(S32* vcount) const
{
U32 count = 0;
LLVolume* volume = getVolume();
if (volume)
{
- count = volume->getNumTriangles();
+ count = volume->getNumTriangles(vcount);
}
return count;
@@ -3976,8 +3976,6 @@ void LLVolumeGeometryManager::registerFace(LLSpatialGroup* group, LLFace* facep,
}
}
- U8 glow = (U8) (facep->getTextureEntry()->getGlow() * 255);
-
if (idx >= 0 &&
draw_vec[idx]->mVertexBuffer == facep->getVertexBuffer() &&
draw_vec[idx]->mEnd == facep->getGeomIndex()-1 &&
@@ -3986,7 +3984,6 @@ void LLVolumeGeometryManager::registerFace(LLSpatialGroup* group, LLFace* facep,
draw_vec[idx]->mEnd - draw_vec[idx]->mStart + facep->getGeomCount() <= (U32) gGLManager.mGLMaxVertexRange &&
draw_vec[idx]->mCount + facep->getIndicesCount() <= (U32) gGLManager.mGLMaxIndexRange &&
#endif
- draw_vec[idx]->mGlowColor.mV[3] == glow &&
draw_vec[idx]->mFullbright == fullbright &&
draw_vec[idx]->mBump == bump &&
draw_vec[idx]->mTextureMatrix == tex_mat &&
@@ -4018,7 +4015,6 @@ void LLVolumeGeometryManager::registerFace(LLSpatialGroup* group, LLFace* facep,
draw_vec.push_back(draw_info);
draw_info->mTextureMatrix = tex_mat;
draw_info->mModelMatrix = model_mat;
- draw_info->mGlowColor.setVec(0,0,0,glow);
if (type == LLRenderPass::PASS_ALPHA)
{ //for alpha sorting
facep->setDrawInfo(draw_info);
@@ -4101,6 +4097,32 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)
LLFastTimer ftm2(FTM_REBUILD_VOLUME_VB);
+ LLVOAvatar* pAvatarVO = NULL;
+
+ LLSpatialBridge* bridge = group->mSpatialPartition->asBridge();
+ if (bridge)
+ {
+ if (bridge->mAvatar.isNull())
+ {
+ LLViewerObject* vobj = bridge->mDrawable->getVObj();
+ if (vobj)
+ {
+ bridge->mAvatar = vobj->getAvatar();
+ }
+ }
+
+ pAvatarVO = bridge->mAvatar;
+ }
+
+ if (pAvatarVO)
+ {
+ pAvatarVO->mAttachmentGeometryBytes -= group->mGeometryBytes;
+ pAvatarVO->mAttachmentSurfaceArea -= group->mSurfaceArea;
+ }
+
+ group->mGeometryBytes = 0;
+ group->mSurfaceArea = 0;
+
group->clearDrawMap();
mFaceList.clear();
@@ -4118,6 +4140,8 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)
U32 cur_total = 0;
+ bool emissive = false;
+
//get all the faces into a list
for (LLSpatialGroup::element_iter drawable_iter = group->getData().begin(); drawable_iter != group->getData().end(); ++drawable_iter)
{
@@ -4135,12 +4159,24 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)
LLVOVolume* vobj = drawablep->getVOVolume();
+ if (!vobj)
+ {
+ continue;
+ }
+
if (vobj->isMesh() &&
(vobj->getVolume() && !vobj->getVolume()->isMeshAssetLoaded() || !gMeshRepo.meshRezEnabled()))
{
continue;
}
+ LLVolume* volume = vobj->getVolume();
+ if (volume)
+ {
+ const LLVector3& scale = vobj->getScale();
+ group->mSurfaceArea += volume->getSurfaceArea() * llmax(llmax(scale.mV[0], scale.mV[1]), scale.mV[2]);
+ }
+
llassert_always(vobj);
vobj->updateTextureVirtualSize(true);
vobj->preRebuild();
@@ -4185,7 +4221,6 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)
//Determine if we've received skininfo that contains an
//alternate bind matrix - if it does then apply the translational component
//to the joints of the avatar.
- LLVOAvatar* pAvatarVO = vobj->getAvatar();
bool pelvisGotSet = false;
if ( pAvatarVO )
@@ -4255,13 +4290,16 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)
if (type == LLDrawPool::POOL_ALPHA)
{
- if (te->getFullbright())
+ if (te->getColor().mV[3] > 0.f)
{
- pool->addRiggedFace(facep, LLDrawPoolAvatar::RIGGED_FULLBRIGHT_ALPHA);
- }
- else
- {
- pool->addRiggedFace(facep, LLDrawPoolAvatar::RIGGED_ALPHA);
+ if (te->getFullbright())
+ {
+ pool->addRiggedFace(facep, LLDrawPoolAvatar::RIGGED_FULLBRIGHT_ALPHA);
+ }
+ else
+ {
+ pool->addRiggedFace(facep, LLDrawPoolAvatar::RIGGED_ALPHA);
+ }
}
}
else if (te->getShiny())
@@ -4330,6 +4368,7 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)
}
}
+
if (cur_total > max_total || facep->getIndicesCount() <= 0 || facep->getGeomCount() <= 0)
{
facep->clearVertexBuffer();
@@ -4343,6 +4382,11 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)
const LLTextureEntry* te = facep->getTextureEntry();
LLViewerTexture* tex = facep->getTexture();
+ if (te->getGlow() >= 1.f/255.f)
+ {
+ emissive = true;
+ }
+
if (facep->isState(LLFace::TEXTURE_ANIM))
{
if (!vobj->mTexAnimMode)
@@ -4388,7 +4432,10 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)
}
else
{
- drawablep->setState(LLDrawable::HAS_ALPHA);
+ if (te->getColor().mV[3] > 0.f)
+ { //only treat as alpha in the pipeline if < 100% transparent
+ drawablep->setState(LLDrawable::HAS_ALPHA);
+ }
alpha_faces.push_back(facep);
}
}
@@ -4459,6 +4506,14 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)
U32 bump_mask = LLVertexBuffer::MAP_TEXCOORD0 | LLVertexBuffer::MAP_TEXCOORD1 | LLVertexBuffer::MAP_NORMAL | LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_COLOR;
U32 fullbright_mask = LLVertexBuffer::MAP_TEXCOORD0 | LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_COLOR;
+ if (emissive)
+ { //emissive faces are present, include emissive byte to preserve batching
+ simple_mask = simple_mask | LLVertexBuffer::MAP_EMISSIVE;
+ alpha_mask = alpha_mask | LLVertexBuffer::MAP_EMISSIVE;
+ bump_mask = bump_mask | LLVertexBuffer::MAP_EMISSIVE;
+ fullbright_mask = fullbright_mask | LLVertexBuffer::MAP_EMISSIVE;
+ }
+
bool batch_textures = LLViewerShaderMgr::instance()->getVertexShaderLevel(LLViewerShaderMgr::SHADER_OBJECT) > 1;
if (batch_textures)
@@ -4498,6 +4553,12 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)
}
mFaceList.clear();
+
+ if (pAvatarVO)
+ {
+ pAvatarVO->mAttachmentGeometryBytes += group->mGeometryBytes;
+ pAvatarVO->mAttachmentSurfaceArea += group->mSurfaceArea;
+ }
}
static LLFastTimer::DeclareTimer FTM_VOLUME_GEOM("Volume Geometry");
@@ -4551,7 +4612,7 @@ void LLVolumeGeometryManager::rebuildMesh(LLSpatialGroup* group)
for (std::set<LLVertexBuffer*>::iterator iter = mapped_buffers.begin(); iter != mapped_buffers.end(); ++iter)
{
- (*iter)->setBuffer(0);
+ (*iter)->flush();
}
// don't forget alpha
@@ -4559,7 +4620,7 @@ void LLVolumeGeometryManager::rebuildMesh(LLSpatialGroup* group)
!group->mVertexBuffer.isNull() &&
group->mVertexBuffer->isLocked())
{
- group->mVertexBuffer->setBuffer(0);
+ group->mVertexBuffer->flush();
}
//if not all buffers are unmapped
@@ -4575,7 +4636,7 @@ void LLVolumeGeometryManager::rebuildMesh(LLSpatialGroup* group)
LLVertexBuffer* buff = face->getVertexBuffer();
if (face && buff && buff->isLocked())
{
- buff->setBuffer(0) ;
+ buff->flush();
}
}
}
@@ -4602,10 +4663,6 @@ struct CompareBatchBreakerModified
{
return lte->getFullbright() < rte->getFullbright();
}
- else if (lte->getGlow() != rte->getGlow())
- {
- return lte->getGlow() < rte->getGlow();
- }
else
{
return lhs->getTexture() < rhs->getTexture();
@@ -4616,6 +4673,19 @@ struct CompareBatchBreakerModified
void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std::vector<LLFace*>& faces, BOOL distance_sort, BOOL batch_textures)
{
+ U32 buffer_usage = group->mBufferUsage;
+
+#if LL_DARWIN
+ // HACK from Leslie:
+ // Disable VBO usage for alpha on Mac OS X because it kills the framerate
+ // due to implicit calls to glTexSubImage that are beyond our control.
+ // (this works because the only calls here that sort by distance are alpha)
+ if (distance_sort)
+ {
+ buffer_usage = 0x0;
+ }
+#endif
+
//calculate maximum number of vertices to store in a single buffer
U32 max_vertices = (gSavedSettings.getS32("RenderMaxVBOSize")*1024)/LLVertexBuffer::calcVertexSize(group->mSpatialPartition->mVertexDataMask);
max_vertices = llmin(max_vertices, (U32) 65535);
@@ -4644,7 +4714,7 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std::
buffer_index = -1;
}
- S32 texture_index_channels = gGLManager.mNumTextureImageUnits-1; //always reserve one for shiny for now just for simplicity
+ S32 texture_index_channels = LLGLSLShader::sIndexedTextureChannels-1; //always reserve one for shiny for now just for simplicity
if (gGLManager.mGLVersion < 3.1f)
{
@@ -4658,6 +4728,8 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std::
texture_index_channels = llmin(texture_index_channels, (S32) gSavedSettings.getU32("RenderMaxTextureIndex"));
+ //NEVER use more than 16 texture index channels (workaround for prevalent driver bug)
+ texture_index_channels = llmin(texture_index_channels, 16);
while (face_iter != faces.end())
{
@@ -4783,29 +4855,30 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std::
//create/delete/resize vertex buffer if needed
LLVertexBuffer* buffer = NULL;
- LLSpatialGroup::buffer_texture_map_t::iterator found_iter = group->mBufferMap[mask].find(*face_iter);
+
+ { //try to find a buffer to reuse
+ LLSpatialGroup::buffer_texture_map_t::iterator found_iter = group->mBufferMap[mask].find(*face_iter);
- if (found_iter != group->mBufferMap[mask].end())
- {
- if ((U32) buffer_index < found_iter->second.size())
+ if (found_iter != group->mBufferMap[mask].end())
{
- buffer = found_iter->second[buffer_index];
+ if ((U32) buffer_index < found_iter->second.size())
+ {
+ buffer = found_iter->second[buffer_index];
+ }
}
}
- if (!buffer)
+ if (!buffer || !buffer->isWriteable())
{ //create new buffer if needed
- buffer = createVertexBuffer(mask,
- group->mBufferUsage);
+ buffer = createVertexBuffer(mask, buffer_usage);
buffer->allocateBuffer(geom_count, index_count, TRUE);
}
else
{ //resize pre-existing buffer
- if (LLVertexBuffer::sEnableVBOs && buffer->getUsage() != group->mBufferUsage ||
+ if (LLVertexBuffer::sEnableVBOs && buffer->getUsage() != buffer_usage ||
buffer->getTypeMask() != mask)
{
- buffer = createVertexBuffer(mask,
- group->mBufferUsage);
+ buffer = createVertexBuffer(mask, buffer_usage);
buffer->allocateBuffer(geom_count, index_count, TRUE);
}
else
@@ -4814,6 +4887,9 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std::
}
}
+ group->mGeometryBytes += buffer->getSize() + buffer->getIndicesSize();
+
+
buffer_map[mask][*face_iter].push_back(buffer);
//add face geometry
@@ -4871,7 +4947,11 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std::
if (is_alpha)
{
// can we safely treat this as an alpha mask?
- if (facep->canRenderAsMask())
+ if (facep->getFaceColor().mV[3] <= 0.f)
+ { //100% transparent, don't render unless we're highlighting transparent
+ registerFace(group, facep, LLRenderPass::PASS_ALPHA_INVISIBLE);
+ }
+ else if (facep->canRenderAsMask())
{
if (te->getFullbright() || LLPipeline::sNoAlpha)
{
@@ -4886,11 +4966,6 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std::
{
registerFace(group, facep, LLRenderPass::PASS_ALPHA);
}
-
- if (LLPipeline::sRenderDeferred)
- {
- registerFace(group, facep, LLRenderPass::PASS_ALPHA_SHADOW);
- }
}
else if (gPipeline.canUseVertexShaders()
&& group->mSpatialPartition->mPartitionType != LLViewerRegion::PARTITION_HUD
@@ -4985,7 +5060,7 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std::
++face_iter;
}
- buffer->setBuffer(0);
+ buffer->flush();
}
group->mBufferMap[mask].clear();
diff --git a/indra/newview/llvovolume.h b/indra/newview/llvovolume.h
index b6347526ee..3cf434dc26 100644
--- a/indra/newview/llvovolume.h
+++ b/indra/newview/llvovolume.h
@@ -131,9 +131,10 @@ public:
/*virtual*/ const LLMatrix4 getRenderMatrix() const;
typedef std::map<LLUUID, S32> texture_cost_t;
U32 getRenderCost(texture_cost_t &textures) const;
- /*virtual*/ F32 getStreamingCost(S32* bytes = NULL, S32* visible_bytes = NULL, F32* unscaled_value = NULL) const;
+ F32 getStreamingCost(S32* bytes, S32* visible_bytes, F32* unscaled_value) const;
+ /*virtual*/ F32 getStreamingCost(S32* bytes = NULL, S32* visible_bytes = NULL) { return getStreamingCost(bytes, visible_bytes, NULL); }
- /*virtual*/ U32 getTriangleCount() const;
+ /*virtual*/ U32 getTriangleCount(S32* vcount = NULL) const;
/*virtual*/ U32 getHighLODTriangleCount();
/*virtual*/ BOOL lineSegmentIntersect(const LLVector3& start, const LLVector3& end,
S32 face = -1, // which face to check, -1 = ALL_SIDES
diff --git a/indra/newview/llvowater.cpp b/indra/newview/llvowater.cpp
index e70ac0a2e7..315616e8a5 100644
--- a/indra/newview/llvowater.cpp
+++ b/indra/newview/llvowater.cpp
@@ -160,14 +160,14 @@ BOOL LLVOWater::updateGeometry(LLDrawable *drawable)
static const unsigned int vertices_per_quad = 4;
static const unsigned int indices_per_quad = 6;
- const S32 size = gSavedSettings.getBOOL("RenderTransparentWater") ? 16 : 1;
+ const S32 size = gSavedSettings.getBOOL("RenderTransparentWater") && !LLGLSLShader::sNoFixedFunction ? 16 : 1;
const S32 num_quads = size * size;
face->setSize(vertices_per_quad * num_quads,
indices_per_quad * num_quads);
LLVertexBuffer* buff = face->getVertexBuffer();
- if (!buff)
+ if (!buff || !buff->isWriteable())
{
buff = new LLVertexBuffer(LLDrawPoolWater::VERTEX_DATA_MASK, GL_DYNAMIC_DRAW_ARB);
buff->allocateBuffer(face->getGeomCount(), face->getIndicesCount(), TRUE);
@@ -231,7 +231,7 @@ BOOL LLVOWater::updateGeometry(LLDrawable *drawable)
}
}
- buff->setBuffer(0);
+ buff->flush();
mDrawable->movePartition();
LLPipeline::sCompiles++;
diff --git a/indra/newview/llvowlsky.cpp b/indra/newview/llvowlsky.cpp
index 7b1c725483..afd902201b 100644
--- a/indra/newview/llvowlsky.cpp
+++ b/indra/newview/llvowlsky.cpp
@@ -326,7 +326,7 @@ BOOL LLVOWLSky::updateGeometry(LLDrawable * drawable)
buildFanBuffer(vertices, texCoords, indices);
- mFanVerts->setBuffer(0);
+ mFanVerts->flush();
}
{
@@ -349,6 +349,9 @@ BOOL LLVOWLSky::updateGeometry(LLDrawable * drawable)
mStripsVerts.resize(strips_segments, NULL);
+ LLTimer timer;
+ timer.start();
+
for (U32 i = 0; i < strips_segments ;++i)
{
LLVertexBuffer * segment = new LLVertexBuffer(LLDrawPoolWLSky::SKY_VERTEX_DATA_MASK, GL_STATIC_DRAW_ARB);
@@ -388,8 +391,10 @@ BOOL LLVOWLSky::updateGeometry(LLDrawable * drawable)
buildStripsBuffer(begin_stack, end_stack, vertices, texCoords, indices);
// and unlock the buffer
- segment->setBuffer(0);
+ segment->flush();
}
+
+ llinfos << "completed in " << llformat("%.2f", timer.getElapsedTimeF32()) << "seconds" << llendl;
}
#else
mStripsVerts = new LLVertexBuffer(LLDrawPoolWLSky::SKY_VERTEX_DATA_MASK, GL_STATIC_DRAW_ARB);
@@ -468,7 +473,7 @@ BOOL LLVOWLSky::updateGeometry(LLDrawable * drawable)
}
}
- mStripsVerts->setBuffer(0);
+ mStripsVerts->flush();
#endif
updateStarColors();
@@ -485,7 +490,7 @@ void LLVOWLSky::drawStars(void)
if (mStarsVerts.notNull())
{
mStarsVerts->setBuffer(LLDrawPoolWLSky::STAR_VERTEX_DATA_MASK);
- mStarsVerts->drawArrays(LLRender::QUADS, 0, getStarsNumVerts()*4);
+ mStarsVerts->drawArrays(LLRender::TRIANGLES, 0, getStarsNumVerts()*4);
}
}
@@ -511,13 +516,14 @@ void LLVOWLSky::drawDome(void)
strips_segment->drawRange(
LLRender::TRIANGLE_STRIP,
- 0, strips_segment->getRequestedVerts()-1, strips_segment->getRequestedIndices(),
+ 0, strips_segment->getNumVerts()-1, strips_segment->getNumIndices(),
0);
- gPipeline.addTrianglesDrawn(strips_segment->getRequestedIndices(), LLRender::TRIANGLE_STRIP);
+ gPipeline.addTrianglesDrawn(strips_segment->getNumIndices(), LLRender::TRIANGLE_STRIP);
}
#else
mStripsVerts->setBuffer(data_mask);
+ gGL.syncMatrices();
glDrawRangeElements(
GL_TRIANGLES,
0, mStripsVerts->getNumVerts()-1, mStripsVerts->getNumIndices(),
@@ -768,10 +774,10 @@ BOOL LLVOWLSky::updateStarGeometry(LLDrawable *drawable)
LLStrider<LLColor4U> colorsp;
LLStrider<LLVector2> texcoordsp;
- if (mStarsVerts.isNull())
+ if (mStarsVerts.isNull() || !mStarsVerts->isWriteable())
{
mStarsVerts = new LLVertexBuffer(LLDrawPoolWLSky::STAR_VERTEX_DATA_MASK, GL_DYNAMIC_DRAW);
- mStarsVerts->allocateBuffer(getStarsNumVerts()*4, 0, TRUE);
+ mStarsVerts->allocateBuffer(getStarsNumVerts()*6, 0, TRUE);
}
BOOL success = mStarsVerts->getVertexStrider(verticesp)
@@ -806,19 +812,25 @@ BOOL LLVOWLSky::updateStarGeometry(LLDrawable *drawable)
*(verticesp++) = mStarVertices[vtx];
*(verticesp++) = mStarVertices[vtx]+left;
*(verticesp++) = mStarVertices[vtx]+left+up;
+ *(verticesp++) = mStarVertices[vtx]+left;
+ *(verticesp++) = mStarVertices[vtx]+left+up;
*(verticesp++) = mStarVertices[vtx]+up;
*(texcoordsp++) = LLVector2(0,0);
*(texcoordsp++) = LLVector2(0,1);
*(texcoordsp++) = LLVector2(1,1);
+ *(texcoordsp++) = LLVector2(0,1);
+ *(texcoordsp++) = LLVector2(1,1);
*(texcoordsp++) = LLVector2(1,0);
*(colorsp++) = LLColor4U(mStarColors[vtx]);
*(colorsp++) = LLColor4U(mStarColors[vtx]);
*(colorsp++) = LLColor4U(mStarColors[vtx]);
*(colorsp++) = LLColor4U(mStarColors[vtx]);
+ *(colorsp++) = LLColor4U(mStarColors[vtx]);
+ *(colorsp++) = LLColor4U(mStarColors[vtx]);
}
- mStarsVerts->setBuffer(0);
+ mStarsVerts->flush();
return TRUE;
}
diff --git a/indra/newview/llwatchdog.cpp b/indra/newview/llwatchdog.cpp
index 64ca94b567..4f582fc2db 100644
--- a/indra/newview/llwatchdog.cpp
+++ b/indra/newview/llwatchdog.cpp
@@ -178,8 +178,8 @@ void LLWatchdog::init(killer_event_callback func)
mKillerCallback = func;
if(!mSuspectsAccessMutex && !mTimer)
{
- mSuspectsAccessMutex = new LLMutex;
- mTimer = new LLWatchdogTimerThread;
+ mSuspectsAccessMutex = new LLMutex(NULL);
+ mTimer = new LLWatchdogTimerThread();
mTimer->setSleepTime(WATCHDOG_SLEEP_TIME_USEC / 1000);
mLastClockCount = LLTimer::getTotalTime();
diff --git a/indra/newview/llwaterparammanager.cpp b/indra/newview/llwaterparammanager.cpp
index 1a98d4c6c2..20b34637b8 100644
--- a/indra/newview/llwaterparammanager.cpp
+++ b/indra/newview/llwaterparammanager.cpp
@@ -190,6 +190,7 @@ void LLWaterParamManager::updateShaderUniforms(LLGLSLShader * shader)
shader->uniform4fv(LLViewerShaderMgr::LIGHTNORM, 1, LLWLParamManager::getInstance()->getRotatedLightDir().mV);
shader->uniform3fv("camPosLocal", 1, LLViewerCamera::getInstance()->getOrigin().mV);
shader->uniform4fv("waterFogColor", 1, LLDrawPoolWater::sWaterFogColor.mV);
+ shader->uniform1f("waterFogEnd", LLDrawPoolWater::sWaterFogEnd);
shader->uniform4fv("waterPlane", 1, mWaterPlane.mV);
shader->uniform1f("waterFogDensity", getFogDensity());
shader->uniform1f("waterFogKS", mWaterFogKS);
diff --git a/indra/newview/llwearable.cpp b/indra/newview/llwearable.cpp
index d1c0990f90..0f7f63061b 100644
--- a/indra/newview/llwearable.cpp
+++ b/indra/newview/llwearable.cpp
@@ -30,13 +30,13 @@
#include "llagentcamera.h"
#include "llagentwearables.h"
#include "lldictionary.h"
+#include "llfloatersidepanelcontainer.h"
#include "lllocaltextureobject.h"
#include "llnotificationsutil.h"
#include "llviewertexturelist.h"
#include "llinventorymodel.h"
#include "llinventoryobserver.h"
#include "llsidepanelappearance.h"
-#include "llsidetray.h"
#include "lltexlayer.h"
#include "lltexglobalcolor.h"
#include "lltrans.h"
@@ -221,7 +221,7 @@ void LLWearable::createVisualParams()
param->resetDrivenParams();
if(!param->linkDrivenParams(boost::bind(wearable_function,(LLWearable*)this, _1), false))
{
- if( !param->linkDrivenParams(boost::bind(avatar_function,gAgentAvatarp,_1 ), true))
+ if( !param->linkDrivenParams(boost::bind(avatar_function,gAgentAvatarp.get(),_1 ), true))
{
llwarns << "could not link driven params for wearable " << getName() << " id: " << param->getID() << llendl;
continue;
@@ -697,7 +697,7 @@ void LLWearable::removeFromAvatar( LLWearableType::EType type, BOOL upload_bake
if(gAgentCamera.cameraCustomizeAvatar())
{
- LLSideTray::getInstance()->showPanel("sidepanel_appearance", LLSD().with("type", "edit_outfit"));
+ LLFloaterSidePanelContainer::showPanel("appearance", LLSD().with("type", "edit_outfit"));
}
gAgentAvatarp->updateVisualParams();
@@ -967,7 +967,7 @@ void LLWearable::revertValues()
syncImages(mSavedTEMap, mTEMap);
- LLSidepanelAppearance *panel = dynamic_cast<LLSidepanelAppearance*>(LLSideTray::getInstance()->getPanel("sidepanel_appearance"));
+ LLSidepanelAppearance *panel = dynamic_cast<LLSidepanelAppearance*>(LLFloaterSidePanelContainer::getPanel("appearance"));
if( panel )
{
panel->updateScrollingPanelList();
@@ -1008,7 +1008,7 @@ void LLWearable::saveValues()
syncImages(mTEMap, mSavedTEMap);
- LLSidepanelAppearance *panel = dynamic_cast<LLSidepanelAppearance*>(LLSideTray::getInstance()->getPanel("sidepanel_appearance"));
+ LLSidepanelAppearance *panel = dynamic_cast<LLSidepanelAppearance*>(LLFloaterSidePanelContainer::getPanel("appearance"));
if( panel )
{
panel->updateScrollingPanelList();
diff --git a/indra/newview/llwearablelist.cpp b/indra/newview/llwearablelist.cpp
index ddbcdfc3f7..6f6411ce3c 100644
--- a/indra/newview/llwearablelist.cpp
+++ b/indra/newview/llwearablelist.cpp
@@ -63,7 +63,7 @@ struct LLWearableArrivedData
LLWearableList::~LLWearableList()
{
- llassert_always(mList.empty()) ;
+ cleanup();
}
void LLWearableList::cleanup()
diff --git a/indra/newview/llweb.cpp b/indra/newview/llweb.cpp
index 6f7115ff6d..d2d48dc68f 100644
--- a/indra/newview/llweb.cpp
+++ b/indra/newview/llweb.cpp
@@ -34,7 +34,6 @@
#include "llagent.h"
#include "llappviewer.h"
-#include "llfloatermediabrowser.h"
#include "llfloaterwebcontent.h"
#include "llfloaterreg.h"
#include "lllogininstance.h"
@@ -78,32 +77,15 @@ void LLWeb::initClass()
}
-// static
-void LLWeb::loadURL(const std::string& url, const std::string& target, const std::string& uuid)
-{
- loadWebURL(url, target, uuid);
- //if(target == "_internal")
- //{
- // // Force load in the internal browser, as if with a blank target.
- // loadURLInternal(url, "", uuid);
- //}
- //else if (gSavedSettings.getBOOL("UseExternalBrowser") || (target == "_external"))
- //{
- // loadURLExternal(url);
- //}
- //else
- //{
- // loadURLInternal(url, target, uuid);
- //}
-}
+
// static
-void LLWeb::loadWebURL(const std::string& url, const std::string& target, const std::string& uuid)
+void LLWeb::loadURL(const std::string& url, const std::string& target, const std::string& uuid)
{
if(target == "_internal")
{
// Force load in the internal browser, as if with a blank target.
- loadWebURLInternal(url, "", uuid);
+ loadURLInternal(url, "", uuid);
}
else if (gSavedSettings.getBOOL("UseExternalBrowser") || (target == "_external"))
{
@@ -111,21 +93,17 @@ void LLWeb::loadWebURL(const std::string& url, const std::string& target, const
}
else
{
- loadWebURLInternal(url, target, uuid);
+ loadURLInternal(url, target, uuid);
}
}
// static
-void LLWeb::loadURLInternal(const std::string &url, const std::string& target, const std::string& uuid)
-{
- LLFloaterMediaBrowser::create(url, target, uuid);
-}
-
-// static
// Explicitly open a Web URL using the Web content floater
-void LLWeb::loadWebURLInternal(const std::string &url, const std::string& target, const std::string& uuid)
+void LLWeb::loadURLInternal(const std::string &url, const std::string& target, const std::string& uuid)
{
- LLFloaterWebContent::create(LLFloaterWebContent::Params().url(url).target(target).id(uuid));
+ LLFloaterWebContent::Params p;
+ p.url(url).target(target).id(uuid);
+ LLFloaterReg::showInstance("web_content", p);
}
// static
@@ -208,6 +186,7 @@ std::string LLWeb::expandURLSubstitutions(const std::string &url,
substitution["VERSION_BUILD"] = LLVersionInfo::getBuild();
substitution["CHANNEL"] = LLVersionInfo::getChannel();
substitution["GRID"] = LLGridManager::getInstance()->getGridLabel();
+ substitution["GRID_LOWERCASE"] = utf8str_tolower(LLGridManager::getInstance()->getGridLabel());
substitution["OS"] = LLAppViewer::instance()->getOSInfo().getOSStringSimple();
substitution["SESSION_ID"] = gAgent.getSessionID();
substitution["FIRST_LOGIN"] = gAgent.isFirstLogin();
diff --git a/indra/newview/llweb.h b/indra/newview/llweb.h
index dc5958e57f..0b95f664d6 100644
--- a/indra/newview/llweb.h
+++ b/indra/newview/llweb.h
@@ -42,25 +42,15 @@ class LLWeb
public:
static void initClass();
- /// Load the given url in the user's preferred web browser
- static void loadURL(const std::string& url, const std::string& target, const std::string& uuid = LLStringUtil::null);
- static void loadURL(const std::string& url) { loadURL(url, LLStringUtil::null); }
- /// Load the given url in the user's preferred web browser
- static void loadURL(const char* url, const std::string& target) { loadURL( ll_safe_string(url), target); }
- static void loadURL(const char* url) { loadURL( ll_safe_string(url), LLStringUtil::null ); }
- /// Load the given url in the Second Life internal web browser
- static void loadURLInternal(const std::string &url, const std::string& target, const std::string& uuid = LLStringUtil::null);
- static void loadURLInternal(const std::string &url) { loadURLInternal(url, LLStringUtil::null); }
/// Load the given url in the operating system's web browser, async if we want to return immediately
/// before browser has spawned
- static void loadURLExternal(const std::string& url) { loadURLExternal(url, LLStringUtil::null); };
+ static void loadURLExternal(const std::string& url) {loadURLExternal(url, LLStringUtil::null);}
static void loadURLExternal(const std::string& url, const std::string& uuid);
static void loadURLExternal(const std::string& url, bool async, const std::string& uuid = LLStringUtil::null);
- // Explicitly open a Web URL using the Web content floater vs. the more general media browser
- static void loadWebURL(const std::string& url, const std::string& target, const std::string& uuid);
- static void loadWebURLInternal(const std::string &url, const std::string& target, const std::string& uuid);
- static void loadWebURLInternal(const std::string &url) { loadWebURLInternal(url, LLStringUtil::null, LLStringUtil::null); }
+ static void loadURL(const std::string& url, const std::string& target = LLStringUtil::null, const std::string& uuid = LLStringUtil::null);
+ // load content using built-in browser
+ static void loadURLInternal(const std::string &url, const std::string& target = LLStringUtil::null, const std::string& uuid = LLStringUtil::null);
/// Returns escaped url (eg, " " to "%20") - used by all loadURL methods
static std::string escapeURL(const std::string& url);
diff --git a/indra/newview/llwebprofile.cpp b/indra/newview/llwebprofile.cpp
new file mode 100644
index 0000000000..641f338f2c
--- /dev/null
+++ b/indra/newview/llwebprofile.cpp
@@ -0,0 +1,305 @@
+/**
+ * @file llwebprofile.cpp
+ * @brief Web profile access.
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llwebprofile.h"
+
+// libs
+#include "llbufferstream.h"
+#include "llhttpclient.h"
+#include "llimagepng.h"
+#include "llplugincookiestore.h"
+
+// newview
+#include "llpanelprofile.h" // for getProfileURL(). FIXME: move the method to LLAvatarActions
+#include "llviewermedia.h" // FIXME: don't use LLViewerMedia internals
+
+// third-party
+#include "reader.h" // JSON
+
+/*
+ * Workflow:
+ * 1. LLViewerMedia::setOpenIDCookie()
+ * -> GET https://my-demo.secondlife.com/ via LLViewerMediaWebProfileResponder
+ * -> LLWebProfile::setAuthCookie()
+ * 2. LLWebProfile::uploadImage()
+ * -> GET "https://my-demo.secondlife.com/snapshots/s3_upload_config" via ConfigResponder
+ * 3. LLWebProfile::post()
+ * -> POST <config_url> via PostImageResponder
+ * -> redirect
+ * -> GET <redirect_url> via PostImageRedirectResponder
+ */
+
+///////////////////////////////////////////////////////////////////////////////
+// LLWebProfileResponders::ConfigResponder
+
+class LLWebProfileResponders::ConfigResponder : public LLHTTPClient::Responder
+{
+ LOG_CLASS(LLWebProfileResponders::ConfigResponder);
+
+public:
+ ConfigResponder(LLPointer<LLImageFormatted> imagep)
+ : mImagep(imagep)
+ {
+ }
+
+ /*virtual*/ void completedRaw(
+ U32 status,
+ const std::string& reason,
+ const LLChannelDescriptors& channels,
+ const LLIOPipe::buffer_ptr_t& buffer)
+ {
+ LLBufferStream istr(channels, buffer.get());
+ std::stringstream strstrm;
+ strstrm << istr.rdbuf();
+ const std::string body = strstrm.str();
+
+ if (status != 200)
+ {
+ llwarns << "Failed to get upload config (" << status << ")" << llendl;
+ LLWebProfile::reportImageUploadStatus(false);
+ return;
+ }
+
+ Json::Value root;
+ Json::Reader reader;
+ if (!reader.parse(body, root))
+ {
+ llwarns << "Failed to parse upload config: " << reader.getFormatedErrorMessages() << llendl;
+ LLWebProfile::reportImageUploadStatus(false);
+ return;
+ }
+
+ // *TODO: 404 = not supported by the grid
+ // *TODO: increase timeout or handle 499 Expired
+
+ // Convert config to LLSD.
+ const Json::Value data = root["data"];
+ const std::string upload_url = root["url"].asString();
+ LLSD config;
+ config["acl"] = data["acl"].asString();
+ config["AWSAccessKeyId"] = data["AWSAccessKeyId"].asString();
+ config["Content-Type"] = data["Content-Type"].asString();
+ config["key"] = data["key"].asString();
+ config["policy"] = data["policy"].asString();
+ config["success_action_redirect"] = data["success_action_redirect"].asString();
+ config["signature"] = data["signature"].asString();
+ config["add_loc"] = data.get("add_loc", "0").asString();
+ config["caption"] = data.get("caption", "").asString();
+
+ // Do the actual image upload using the configuration.
+ LL_DEBUGS("Snapshots") << "Got upload config, POSTing image to " << upload_url << ", config=[" << config << "]" << llendl;
+ LLWebProfile::post(mImagep, config, upload_url);
+ }
+
+private:
+ LLPointer<LLImageFormatted> mImagep;
+};
+
+///////////////////////////////////////////////////////////////////////////////
+// LLWebProfilePostImageRedirectResponder
+class LLWebProfileResponders::PostImageRedirectResponder : public LLHTTPClient::Responder
+{
+ LOG_CLASS(LLWebProfileResponders::PostImageRedirectResponder);
+
+public:
+ /*virtual*/ void completedRaw(
+ U32 status,
+ const std::string& reason,
+ const LLChannelDescriptors& channels,
+ const LLIOPipe::buffer_ptr_t& buffer)
+ {
+ if (status != 200)
+ {
+ llwarns << "Failed to upload image: " << status << " " << reason << llendl;
+ LLWebProfile::reportImageUploadStatus(false);
+ return;
+ }
+
+ LLBufferStream istr(channels, buffer.get());
+ std::stringstream strstrm;
+ strstrm << istr.rdbuf();
+ const std::string body = strstrm.str();
+ llinfos << "Image uploaded." << llendl;
+ LL_DEBUGS("Snapshots") << "Uploading image succeeded. Response: [" << body << "]" << llendl;
+ LLWebProfile::reportImageUploadStatus(true);
+ }
+
+private:
+ LLPointer<LLImageFormatted> mImagep;
+};
+
+
+///////////////////////////////////////////////////////////////////////////////
+// LLWebProfileResponders::PostImageResponder
+class LLWebProfileResponders::PostImageResponder : public LLHTTPClient::Responder
+{
+ LOG_CLASS(LLWebProfileResponders::PostImageResponder);
+
+public:
+ /*virtual*/ void completedHeader(U32 status, const std::string& reason, const LLSD& content)
+ {
+ // Viewer seems to fail to follow a 303 redirect on POST request
+ // (URLRequest Error: 65, Send failed since rewinding of the data stream failed).
+ // Handle it manually.
+ if (status == 303)
+ {
+ LLSD headers = LLViewerMedia::getHeaders();
+ headers["Cookie"] = LLWebProfile::getAuthCookie();
+ const std::string& redir_url = content["location"];
+ LL_DEBUGS("Snapshots") << "Got redirection URL: " << redir_url << llendl;
+ LLHTTPClient::get(redir_url, new LLWebProfileResponders::PostImageRedirectResponder, headers);
+ }
+ else
+ {
+ llwarns << "Unexpected POST status: " << status << " " << reason << llendl;
+ LL_DEBUGS("Snapshots") << "headers: [" << content << "]" << llendl;
+ LLWebProfile::reportImageUploadStatus(false);
+ }
+ }
+
+ // Override just to suppress warnings.
+ /*virtual*/ void completedRaw(U32 status, const std::string& reason,
+ const LLChannelDescriptors& channels,
+ const LLIOPipe::buffer_ptr_t& buffer)
+ {
+ }
+};
+
+///////////////////////////////////////////////////////////////////////////////
+// LLWebProfile
+
+std::string LLWebProfile::sAuthCookie;
+LLWebProfile::status_callback_t LLWebProfile::mStatusCallback;
+
+// static
+void LLWebProfile::uploadImage(LLPointer<LLImageFormatted> image, const std::string& caption, bool add_location)
+{
+ // Get upload configuration data.
+ std::string config_url(getProfileURL(LLStringUtil::null) + "snapshots/s3_upload_config");
+ config_url += "?caption=" + LLURI::escape(caption);
+ config_url += "&add_loc=" + std::string(add_location ? "1" : "0");
+
+ LL_DEBUGS("Snapshots") << "Requesting " << config_url << llendl;
+ LLSD headers = LLViewerMedia::getHeaders();
+ headers["Cookie"] = getAuthCookie();
+ LLHTTPClient::get(config_url, new LLWebProfileResponders::ConfigResponder(image), headers);
+}
+
+// static
+void LLWebProfile::setAuthCookie(const std::string& cookie)
+{
+ LL_DEBUGS("Snapshots") << "Setting auth cookie: " << cookie << llendl;
+ sAuthCookie = cookie;
+}
+
+// static
+void LLWebProfile::post(LLPointer<LLImageFormatted> image, const LLSD& config, const std::string& url)
+{
+ if (dynamic_cast<LLImagePNG*>(image.get()) == 0)
+ {
+ llwarns << "Image to upload is not a PNG" << llendl;
+ llassert(dynamic_cast<LLImagePNG*>(image.get()) != 0);
+ return;
+ }
+
+ const std::string boundary = "----------------------------0123abcdefab";
+
+ LLSD headers = LLViewerMedia::getHeaders();
+ headers["Cookie"] = getAuthCookie();
+ headers["Content-Type"] = "multipart/form-data; boundary=" + boundary;
+
+ std::ostringstream body;
+
+ // *NOTE: The order seems to matter.
+ body << "--" << boundary << "\r\n"
+ << "Content-Disposition: form-data; name=\"key\"\r\n\r\n"
+ << config["key"].asString() << "\r\n";
+
+ body << "--" << boundary << "\r\n"
+ << "Content-Disposition: form-data; name=\"AWSAccessKeyId\"\r\n\r\n"
+ << config["AWSAccessKeyId"].asString() << "\r\n";
+
+ body << "--" << boundary << "\r\n"
+ << "Content-Disposition: form-data; name=\"acl\"\r\n\r\n"
+ << config["acl"].asString() << "\r\n";
+
+ body << "--" << boundary << "\r\n"
+ << "Content-Disposition: form-data; name=\"Content-Type\"\r\n\r\n"
+ << config["Content-Type"].asString() << "\r\n";
+
+ body << "--" << boundary << "\r\n"
+ << "Content-Disposition: form-data; name=\"policy\"\r\n\r\n"
+ << config["policy"].asString() << "\r\n";
+
+ body << "--" << boundary << "\r\n"
+ << "Content-Disposition: form-data; name=\"signature\"\r\n\r\n"
+ << config["signature"].asString() << "\r\n";
+
+ body << "--" << boundary << "\r\n"
+ << "Content-Disposition: form-data; name=\"success_action_redirect\"\r\n\r\n"
+ << config["success_action_redirect"].asString() << "\r\n";
+
+ body << "--" << boundary << "\r\n"
+ << "Content-Disposition: form-data; name=\"file\"; filename=\"snapshot.png\"\r\n"
+ << "Content-Type: image/png\r\n\r\n";
+
+ // Insert the image data.
+ // *FIX: Treating this as a string will probably screw it up ...
+ U8* image_data = image->getData();
+ for (S32 i = 0; i < image->getDataSize(); ++i)
+ {
+ body << image_data[i];
+ }
+
+ body << "\r\n--" << boundary << "--\r\n";
+
+ // postRaw() takes ownership of the buffer and releases it later.
+ size_t size = body.str().size();
+ U8 *data = new U8[size];
+ memcpy(data, body.str().data(), size);
+
+ // Send request, successful upload will trigger posting metadata.
+ LLHTTPClient::postRaw(url, data, size, new LLWebProfileResponders::PostImageResponder(), headers);
+}
+
+// static
+void LLWebProfile::reportImageUploadStatus(bool ok)
+{
+ if (mStatusCallback)
+ {
+ mStatusCallback(ok);
+ }
+}
+
+// static
+std::string LLWebProfile::getAuthCookie()
+{
+ // This is needed to test image uploads on Linux viewer built with OpenSSL 1.0.0 (0.9.8 works fine).
+ const char* debug_cookie = getenv("LL_SNAPSHOT_COOKIE");
+ return debug_cookie ? debug_cookie : sAuthCookie;
+}
diff --git a/indra/newview/llwebprofile.h b/indra/newview/llwebprofile.h
new file mode 100644
index 0000000000..10279bffac
--- /dev/null
+++ b/indra/newview/llwebprofile.h
@@ -0,0 +1,69 @@
+/**
+ * @file llwebprofile.h
+ * @brief Web profile access.
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLWEBPROFILE_H
+#define LL_LLWEBPROFILE_H
+
+#include "llimage.h"
+
+namespace LLWebProfileResponders
+{
+ class ConfigResponder;
+ class PostImageResponder;
+ class PostImageRedirectResponder;
+};
+
+/**
+ * @class LLWebProfile
+ *
+ * Manages interaction with, a web service allowing the upload of snapshot images
+ * taken within the viewer.
+ */
+class LLWebProfile
+{
+ LOG_CLASS(LLWebProfile);
+
+public:
+ typedef boost::function<void(bool ok)> status_callback_t;
+
+ static void uploadImage(LLPointer<LLImageFormatted> image, const std::string& caption, bool add_location);
+ static void setAuthCookie(const std::string& cookie);
+ static void setImageUploadResultCallback(status_callback_t cb) { mStatusCallback = cb; }
+
+private:
+ friend class LLWebProfileResponders::ConfigResponder;
+ friend class LLWebProfileResponders::PostImageResponder;
+ friend class LLWebProfileResponders::PostImageRedirectResponder;
+
+ static void post(LLPointer<LLImageFormatted> image, const LLSD& config, const std::string& url);
+ static void reportImageUploadStatus(bool ok);
+ static std::string getAuthCookie();
+
+ static std::string sAuthCookie;
+ static status_callback_t mStatusCallback;
+};
+
+#endif // LL_LLWEBPROFILE_H
diff --git a/indra/newview/llwind.cpp b/indra/newview/llwind.cpp
index 69d3090442..4c39fb5b74 100644
--- a/indra/newview/llwind.cpp
+++ b/indra/newview/llwind.cpp
@@ -46,16 +46,12 @@
#include "llworld.h"
-const F32 CLOUD_DIVERGENCE_COEF = 0.5f;
-
-
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
LLWind::LLWind()
-: mSize(16),
- mCloudDensityp(NULL)
+: mSize(16)
{
init();
}
@@ -65,8 +61,6 @@ LLWind::~LLWind()
{
delete [] mVelX;
delete [] mVelY;
- delete [] mCloudVelX;
- delete [] mCloudVelY;
}
@@ -77,31 +71,23 @@ LLWind::~LLWind()
void LLWind::init()
{
+ LL_DEBUGS("Wind") << "initializing wind size: "<< mSize << LL_ENDL;
+
// Initialize vector data
mVelX = new F32[mSize*mSize];
mVelY = new F32[mSize*mSize];
- mCloudVelX = new F32[mSize*mSize];
- mCloudVelY = new F32[mSize*mSize];
-
S32 i;
for (i = 0; i < mSize*mSize; i++)
{
mVelX[i] = 0.5f;
mVelY[i] = 0.5f;
- mCloudVelX[i] = 0.0f;
- mCloudVelY[i] = 0.0f;
}
}
void LLWind::decompress(LLBitPack &bitpack, LLGroupHeader *group_headerp)
{
- if (!mCloudDensityp)
- {
- return;
- }
-
LLPatchHeader patch_header;
S32 buffer[16*16];
@@ -122,22 +108,15 @@ void LLWind::decompress(LLBitPack &bitpack, LLGroupHeader *group_headerp)
decode_patch(bitpack, buffer);
decompress_patch(mVelY, buffer, &patch_header);
-
-
S32 i, j, k;
- // HACK -- mCloudVelXY is the same as mVelXY, except we add a divergence
- // that is proportional to the gradient of the cloud density
- // ==> this helps to clump clouds together
- // NOTE ASSUMPTION: cloud density has the same dimensions as the wind field
- // This needs to be fixed... causes discrepency at region boundaries
for (j=1; j<mSize-1; j++)
{
for (i=1; i<mSize-1; i++)
{
k = i + j * mSize;
- *(mCloudVelX + k) = *(mVelX + k) + CLOUD_DIVERGENCE_COEF * (*(mCloudDensityp + k + 1) - *(mCloudDensityp + k - 1));
- *(mCloudVelY + k) = *(mVelY + k) + CLOUD_DIVERGENCE_COEF * (*(mCloudDensityp + k + mSize) - *(mCloudDensityp + k - mSize));
+ *(mVelX + k) = *(mVelX + k);
+ *(mVelY + k) = *(mVelY + k);
}
}
@@ -145,29 +124,29 @@ void LLWind::decompress(LLBitPack &bitpack, LLGroupHeader *group_headerp)
for (j=1; j<mSize-1; j++)
{
k = i + j * mSize;
- *(mCloudVelX + k) = *(mVelX + k) + CLOUD_DIVERGENCE_COEF * (*(mCloudDensityp + k) - *(mCloudDensityp + k - 2));
- *(mCloudVelY + k) = *(mVelY + k) + CLOUD_DIVERGENCE_COEF * (*(mCloudDensityp + k + mSize) - *(mCloudDensityp + k - mSize));
+ *(mVelX + k) = *(mVelX + k);
+ *(mVelY + k) = *(mVelY + k);
}
i = 0;
for (j=1; j<mSize-1; j++)
{
k = i + j * mSize;
- *(mCloudVelX + k) = *(mVelX + k) + CLOUD_DIVERGENCE_COEF * (*(mCloudDensityp + k + 2) - *(mCloudDensityp + k));
- *(mCloudVelY + k) = *(mVelY + k) + CLOUD_DIVERGENCE_COEF * (*(mCloudDensityp + k + mSize) - *(mCloudDensityp + k + mSize));
+ *(mVelX + k) = *(mVelX + k);
+ *(mVelY + k) = *(mVelY + k);
}
j = mSize - 1;
for (i=1; i<mSize-1; i++)
{
k = i + j * mSize;
- *(mCloudVelX + k) = *(mVelX + k) + CLOUD_DIVERGENCE_COEF * (*(mCloudDensityp + k + 1) - *(mCloudDensityp + k - 1));
- *(mCloudVelY + k) = *(mVelY + k) + CLOUD_DIVERGENCE_COEF * (*(mCloudDensityp + k) - *(mCloudDensityp + k - 2*mSize));
+ *(mVelX + k) = *(mVelX + k);
+ *(mVelY + k) = *(mVelY + k);
}
j = 0;
for (i=1; i<mSize-1; i++)
{
k = i + j * mSize;
- *(mCloudVelX + k) = *(mVelX + k) + CLOUD_DIVERGENCE_COEF * (*(mCloudDensityp + k + 1) - *(mCloudDensityp + k -1));
- *(mCloudVelY + k) = *(mVelY + k) + CLOUD_DIVERGENCE_COEF * (*(mCloudDensityp + k + 2*mSize) - *(mCloudDensityp + k));
+ *(mVelX + k) = *(mVelX + k);
+ *(mVelY + k) = *(mVelY + k);
}
}
@@ -280,74 +259,6 @@ LLVector3 LLWind::getVelocity(const LLVector3 &pos_region)
return r_val * WIND_SCALE_HACK;
}
-
-LLVector3 LLWind::getCloudVelocity(const LLVector3 &pos_region)
-{
- llassert(mSize == 16);
- // Resolves value of wind at a location relative to SW corner of region
- //
- // Returns wind magnitude in X,Y components of vector3
- LLVector3 r_val;
- F32 dx,dy;
- S32 k;
-
- LLVector3 pos_clamped_region(pos_region);
-
- F32 region_width_meters = LLWorld::getInstance()->getRegionWidthInMeters();
-
- if (pos_clamped_region.mV[VX] < 0.f)
- {
- pos_clamped_region.mV[VX] = 0.f;
- }
- else if (pos_clamped_region.mV[VX] >= region_width_meters)
- {
- pos_clamped_region.mV[VX] = (F32) fmod(pos_clamped_region.mV[VX], region_width_meters);
- }
-
- if (pos_clamped_region.mV[VY] < 0.f)
- {
- pos_clamped_region.mV[VY] = 0.f;
- }
- else if (pos_clamped_region.mV[VY] >= region_width_meters)
- {
- pos_clamped_region.mV[VY] = (F32) fmod(pos_clamped_region.mV[VY], region_width_meters);
- }
-
-
- S32 i = llfloor(pos_clamped_region.mV[VX] * mSize / region_width_meters);
- S32 j = llfloor(pos_clamped_region.mV[VY] * mSize / region_width_meters);
- k = i + j*mSize;
- dx = ((pos_clamped_region.mV[VX] * mSize / region_width_meters) - (F32) i);
- dy = ((pos_clamped_region.mV[VY] * mSize / region_width_meters) - (F32) j);
-
- if ((i < mSize-1) && (j < mSize-1))
- {
- // Interior points, no edges
- r_val.mV[VX] = mCloudVelX[k]*(1.0f - dx)*(1.0f - dy) +
- mCloudVelX[k + 1]*dx*(1.0f - dy) +
- mCloudVelX[k + mSize]*dy*(1.0f - dx) +
- mCloudVelX[k + mSize + 1]*dx*dy;
- r_val.mV[VY] = mCloudVelY[k]*(1.0f - dx)*(1.0f - dy) +
- mCloudVelY[k + 1]*dx*(1.0f - dy) +
- mCloudVelY[k + mSize]*dy*(1.0f - dx) +
- mCloudVelY[k + mSize + 1]*dx*dy;
- }
- else
- {
- r_val.mV[VX] = mCloudVelX[k];
- r_val.mV[VY] = mCloudVelY[k];
- }
-
- r_val.mV[VZ] = 0.f;
- return r_val * WIND_SCALE_HACK;
-}
-
-
-void LLWind::setCloudDensityPointer(F32 *densityp)
-{
- mCloudDensityp = densityp;
-}
-
void LLWind::setOriginGlobal(const LLVector3d &origin_global)
{
mOriginGlobal = origin_global;
diff --git a/indra/newview/llwind.h b/indra/newview/llwind.h
index 925cb6d642..3b57f07124 100644
--- a/indra/newview/llwind.h
+++ b/indra/newview/llwind.h
@@ -27,7 +27,6 @@
#ifndef LL_LLWIND_H
#define LL_LLWIND_H
-//#include "vmath.h"
#include "llmath.h"
#include "v3math.h"
#include "v3dmath.h"
@@ -44,25 +43,21 @@ public:
~LLWind();
void renderVectors();
LLVector3 getVelocity(const LLVector3 &location); // "location" is region-local
- LLVector3 getCloudVelocity(const LLVector3 &location); // "location" is region-local
LLVector3 getVelocityNoisy(const LLVector3 &location, const F32 dim); // "location" is region-local
void decompress(LLBitPack &bitpack, LLGroupHeader *group_headerp);
LLVector3 getAverage();
- void setCloudDensityPointer(F32 *densityp);
void setOriginGlobal(const LLVector3d &origin_global);
private:
S32 mSize;
F32 * mVelX;
F32 * mVelY;
- F32 * mCloudVelX;
- F32 * mCloudVelY;
- F32 * mCloudDensityp;
LLVector3d mOriginGlobal;
void init();
+ LOG_CLASS(LLWind);
};
#endif
diff --git a/indra/newview/llwindowlistener.cpp b/indra/newview/llwindowlistener.cpp
new file mode 100644
index 0000000000..28f959eb71
--- /dev/null
+++ b/indra/newview/llwindowlistener.cpp
@@ -0,0 +1,505 @@
+/**
+ * @file llwindowlistener.cpp
+ * @brief EventAPI interface for injecting input into LLWindow
+ *
+ * $LicenseInfo:firstyear=2001&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+#include "linden_common.h"
+
+#include "llwindowlistener.h"
+
+#include "llcoord.h"
+#include "llfocusmgr.h"
+#include "llkeyboard.h"
+#include "llwindowcallbacks.h"
+#include "llui.h"
+#include "llview.h"
+#include "llviewinject.h"
+#include "llviewerwindow.h"
+#include "llviewerkeyboard.h"
+#include "llrootview.h"
+#include "llsdutil.h"
+#include "stringize.h"
+#include <typeinfo>
+#include <map>
+#include <boost/scoped_ptr.hpp>
+#include <boost/lambda/core.hpp>
+#include <boost/lambda/bind.hpp>
+
+namespace bll = boost::lambda;
+
+LLWindowListener::LLWindowListener(LLViewerWindow *window, const KeyboardGetter& kbgetter)
+ : LLEventAPI("LLWindow", "Inject input events into the LLWindow instance"),
+ mWindow(window),
+ mKbGetter(kbgetter)
+{
+ std::string keySomething =
+ "Given [\"keysym\"], [\"keycode\"] or [\"char\"], inject the specified ";
+ std::string keyExplain =
+ "(integer keycode values, or keysym string from any addKeyName() call in\n"
+ "http://hg.secondlife.com/viewer-development/src/tip/indra/llwindow/llkeyboard.cpp )\n";
+ std::string mask =
+ "Specify optional [\"mask\"] as an array containing any of \"CTL\", \"ALT\",\n"
+ "\"SHIFT\" or \"MAC_CONTROL\"; the corresponding modifier bits will be combined\n"
+ "to form the mask used with the event.";
+
+ std::string given = "Given ";
+ std::string mouseParams =
+ "optional [\"path\"], optional [\"x\"] and [\"y\"], inject the requested mouse ";
+ std::string buttonParams =
+ std::string("[\"button\"], ") + mouseParams;
+ std::string buttonExplain =
+ "(button values \"LEFT\", \"MIDDLE\", \"RIGHT\")\n";
+ std::string paramsExplain =
+ "[\"path\"] is as for LLUI::resolvePath(), described in\n"
+ "http://hg.secondlife.com/viewer-development/src/tip/indra/llui/llui.h\n"
+ "If you omit [\"path\"], you must specify both [\"x\"] and [\"y\"].\n"
+ "If you specify [\"path\"] without both [\"x\"] and [\"y\"], will synthesize (x, y)\n"
+ "in the center of the LLView selected by [\"path\"].\n"
+ "You may specify [\"path\"] with both [\"x\"] and [\"y\"], will use your (x, y).\n"
+ "This may cause the LLView selected by [\"path\"] to reject the event.\n"
+ "Optional [\"reply\"] requests a reply event on the named LLEventPump.\n"
+ "reply[\"error\"] isUndefined (None) on success, else an explanatory message.\n";
+
+ add("getInfo",
+ "Get information about the ui element specified by [\"path\"]",
+ &LLWindowListener::getInfo,
+ LLSDMap("reply", LLSD()));
+ add("getPaths",
+ "Send on [\"reply\"] an event in which [\"paths\"] is an array of valid LLView\n"
+ "pathnames. Optional [\"under\"] pathname specifies the base node under which\n"
+ "to list; all nodes from root if no [\"under\"].",
+ &LLWindowListener::getPaths,
+ LLSDMap("reply", LLSD()));
+ add("keyDown",
+ keySomething + "keypress event.\n" + keyExplain + mask,
+ &LLWindowListener::keyDown);
+ add("keyUp",
+ keySomething + "key release event.\n" + keyExplain + mask,
+ &LLWindowListener::keyUp);
+ add("mouseDown",
+ given + buttonParams + "click event.\n" + buttonExplain + paramsExplain + mask,
+ &LLWindowListener::mouseDown);
+ add("mouseUp",
+ given + buttonParams + "release event.\n" + buttonExplain + paramsExplain + mask,
+ &LLWindowListener::mouseUp);
+ add("mouseMove",
+ given + mouseParams + "movement event.\n" + paramsExplain + mask,
+ &LLWindowListener::mouseMove);
+ add("mouseScroll",
+ "Given an integer number of [\"clicks\"], inject the requested mouse scroll event.\n"
+ "(positive clicks moves downward through typical content)",
+ &LLWindowListener::mouseScroll);
+}
+
+template <typename MAPPED>
+class StringLookup
+{
+private:
+ std::string mDesc;
+ typedef std::map<std::string, MAPPED> Map;
+ Map mMap;
+
+public:
+ StringLookup(const std::string& desc): mDesc(desc) {}
+
+ MAPPED lookup(const typename Map::key_type& key) const
+ {
+ typename Map::const_iterator found = mMap.find(key);
+ if (found == mMap.end())
+ {
+ LL_WARNS("LLWindowListener") << "Unknown " << mDesc << " '" << key << "'" << LL_ENDL;
+ return MAPPED();
+ }
+ return found->second;
+ }
+
+protected:
+ void add(const typename Map::key_type& key, const typename Map::mapped_type& value)
+ {
+ mMap.insert(typename Map::value_type(key, value));
+ }
+};
+
+namespace {
+
+// helper for getMask()
+MASK lookupMask_(const std::string& maskname)
+{
+ // It's unclear to me whether MASK_MAC_CONTROL is important, but it's not
+ // supported by maskFromString(). Handle that specially.
+ if (maskname == "MAC_CONTROL")
+ {
+ return MASK_MAC_CONTROL;
+ }
+ else
+ {
+ // In case of lookup failure, return MASK_NONE, which won't affect our
+ // caller's OR.
+ MASK mask(MASK_NONE);
+ LLKeyboard::maskFromString(maskname, &mask);
+ return mask;
+ }
+}
+
+MASK getMask(const LLSD& event)
+{
+ LLSD masknames(event["mask"]);
+ if (! masknames.isArray())
+ {
+ // If event["mask"] is a single string, perform normal lookup on it.
+ return lookupMask_(masknames);
+ }
+
+ // Here event["mask"] is an array of mask-name strings. OR together their
+ // corresponding bits.
+ MASK mask(MASK_NONE);
+ for (LLSD::array_const_iterator ai(masknames.beginArray()), aend(masknames.endArray());
+ ai != aend; ++ai)
+ {
+ mask |= lookupMask_(*ai);
+ }
+ return mask;
+}
+
+KEY getKEY(const LLSD& event)
+{
+ if (event.has("keysym"))
+ {
+ // Initialize to KEY_NONE; that way we can ignore the bool return from
+ // keyFromString() and, in the lookup-fail case, simply return KEY_NONE.
+ KEY key(KEY_NONE);
+ LLKeyboard::keyFromString(event["keysym"], &key);
+ return key;
+ }
+ else if (event.has("keycode"))
+ {
+ return KEY(event["keycode"].asInteger());
+ }
+ else
+ {
+ return KEY(event["char"].asString()[0]);
+ }
+}
+
+} // namespace
+
+void LLWindowListener::getInfo(LLSD const & evt)
+{
+ Response response(LLSD(), evt);
+
+ if (evt.has("path"))
+ {
+ std::string path(evt["path"]);
+ LLView * target_view = LLUI::resolvePath(LLUI::getRootView(), path);
+ if (target_view != 0)
+ {
+ response.setResponse(target_view->getInfo());
+ }
+ else
+ {
+ response.error(STRINGIZE(evt["op"].asString() << " request "
+ "specified invalid \"path\": '" << path << "'"));
+ }
+ }
+ else
+ {
+ response.error(
+ STRINGIZE(evt["op"].asString() << "request did not provide a path" ));
+ }
+}
+
+void LLWindowListener::getPaths(LLSD const & request)
+{
+ Response response(LLSD(), request);
+ LLView *root(LLUI::getRootView()), *base(NULL);
+ // Capturing request["under"] as string means we conflate the case in
+ // which there is no ["under"] key with the case in which its value is the
+ // empty string. That seems to make sense to me.
+ std::string under(request["under"]);
+
+ // Deal with optional "under" parameter
+ if (under.empty())
+ {
+ base = root;
+ }
+ else
+ {
+ base = LLUI::resolvePath(root, under);
+ if (! base)
+ {
+ return response.error(STRINGIZE(request["op"].asString() << " request "
+ "specified invalid \"under\" path: '" << under << "'"));
+ }
+ }
+
+ // Traverse the entire subtree under 'base', collecting pathnames
+ for (LLView::tree_iterator_t ti(base->beginTreeDFS()), tend(base->endTreeDFS());
+ ti != tend; ++ti)
+ {
+ response["paths"].append((*ti)->getPathname());
+ }
+}
+
+void LLWindowListener::keyDown(LLSD const & evt)
+{
+ Response response(LLSD(), evt);
+
+ if (evt.has("path"))
+ {
+ std::string path(evt["path"]);
+ LLView * target_view = LLUI::resolvePath(LLUI::getRootView(), path);
+ if (target_view == 0)
+ {
+ response.error(STRINGIZE(evt["op"].asString() << " request "
+ "specified invalid \"path\": '" << path << "'"));
+ }
+ else if(target_view->isAvailable())
+ {
+ response.setResponse(target_view->getInfo());
+
+ gFocusMgr.setKeyboardFocus(target_view);
+ KEY key = getKEY(evt);
+ MASK mask = getMask(evt);
+ gViewerKeyboard.handleKey(key, mask, false);
+ if(key < 0x80) mWindow->handleUnicodeChar(key, mask);
+ }
+ else
+ {
+ response.error(STRINGIZE(evt["op"].asString() << " request "
+ "element specified by \"path\": '" << path << "'"
+ << " is not visible"));
+ }
+ }
+ else
+ {
+ mKbGetter()->handleTranslatedKeyDown(getKEY(evt), getMask(evt));
+ }
+}
+
+void LLWindowListener::keyUp(LLSD const & evt)
+{
+ Response response(LLSD(), evt);
+
+ if (evt.has("path"))
+ {
+ std::string path(evt["path"]);
+ LLView * target_view = LLUI::resolvePath(LLUI::getRootView(), path);
+ if (target_view == 0 )
+ {
+ response.error(STRINGIZE(evt["op"].asString() << " request "
+ "specified invalid \"path\": '" << path << "'"));
+ }
+ else if (target_view->isAvailable())
+ {
+ response.setResponse(target_view->getInfo());
+
+ gFocusMgr.setKeyboardFocus(target_view);
+ mKbGetter()->handleTranslatedKeyUp(getKEY(evt), getMask(evt));
+ }
+ else
+ {
+ response.error(STRINGIZE(evt["op"].asString() << " request "
+ "element specified byt \"path\": '" << path << "'"
+ << " is not visible"));
+ }
+ }
+ else
+ {
+ mKbGetter()->handleTranslatedKeyUp(getKEY(evt), getMask(evt));
+ }
+}
+
+// for WhichButton
+typedef BOOL (LLWindowCallbacks::*MouseMethod)(LLWindow *, LLCoordGL, MASK);
+struct Actions
+{
+ Actions(const MouseMethod& d, const MouseMethod& u): down(d), up(u), valid(true) {}
+ Actions(): valid(false) {}
+ MouseMethod down, up;
+ bool valid;
+};
+
+struct WhichButton: public StringLookup<Actions>
+{
+ WhichButton(): StringLookup<Actions>("mouse button")
+ {
+ add("LEFT", Actions(&LLWindowCallbacks::handleMouseDown,
+ &LLWindowCallbacks::handleMouseUp));
+ add("RIGHT", Actions(&LLWindowCallbacks::handleRightMouseDown,
+ &LLWindowCallbacks::handleRightMouseUp));
+ add("MIDDLE", Actions(&LLWindowCallbacks::handleMiddleMouseDown,
+ &LLWindowCallbacks::handleMiddleMouseUp));
+ }
+};
+static WhichButton buttons;
+
+typedef boost::function<bool(LLCoordGL, MASK)> MouseFunc;
+
+static void mouseEvent(const MouseFunc& func, const LLSD& request)
+{
+ // Ensure we send response
+ LLEventAPI::Response response(LLSD(), request);
+ // We haven't yet established whether the incoming request has "x" and "y",
+ // but capture this anyway, with 0 for omitted values.
+ LLCoordGL pos(request["x"].asInteger(), request["y"].asInteger());
+ bool has_pos(request.has("x") && request.has("y"));
+
+ boost::scoped_ptr<LLView::TemporaryDrilldownFunc> tempfunc;
+
+ // Documentation for mouseDown(), mouseUp() and mouseMove() claims you
+ // must either specify ["path"], or both of ["x"] and ["y"]. You MAY
+ // specify all. Let's say that passing "path" as an empty string is
+ // equivalent to not passing it at all.
+ std::string path(request["path"]);
+ if (path.empty())
+ {
+ // Without "path", you must specify both "x" and "y".
+ if (! has_pos)
+ {
+ return response.error(STRINGIZE(request["op"].asString() << " request "
+ "without \"path\" must specify both \"x\" and \"y\": "
+ << request));
+ }
+ }
+ else // ! path.empty()
+ {
+ LLView* root = LLUI::getRootView();
+ LLView* target = LLUI::resolvePath(root, path);
+ if (! target)
+ {
+ return response.error(STRINGIZE(request["op"].asString() << " request "
+ "specified invalid \"path\": '" << path << "'"));
+ }
+
+ response.setResponse(target->getInfo());
+
+ // The intent of this test is to prevent trying to drill down to a
+ // widget in a hidden floater, or on a tab that's not current, etc.
+ if (! target->isInVisibleChain())
+ {
+ return response.error(STRINGIZE(request["op"].asString() << " request "
+ "specified \"path\" not currently visible: '"
+ << path << "'"));
+ }
+
+ // This test isn't folded in with the above error case since you can
+ // (e.g.) pop up a tooltip even for a disabled widget.
+ if (! target->isInEnabledChain())
+ {
+ response.warn(STRINGIZE(request["op"].asString() << " request "
+ "specified \"path\" not currently enabled: '"
+ << path << "'"));
+ }
+
+ if (! has_pos)
+ {
+ LLRect rect(target->calcScreenRect());
+ pos.set(rect.getCenterX(), rect.getCenterY());
+ // nonstandard warning tactic: probably usual case; we want event
+ // sender to know synthesized (x, y), but maybe don't need to log?
+ response["warnings"].append(STRINGIZE("using center point ("
+ << pos.mX << ", " << pos.mY << ")"));
+ }
+
+/*==========================================================================*|
+ // NEVER MIND: the LLView tree defines priority handler layers in
+ // front of the normal widget set, so this has never yet produced
+ // anything but spam warnings. (sigh)
+
+ // recursive childFromPoint() should give us the frontmost, leafmost
+ // widget at the specified (x, y).
+ LLView* frontmost = root->childFromPoint(pos.mX, pos.mY, true);
+ if (frontmost != target)
+ {
+ response.warn(STRINGIZE(request["op"].asString() << " request "
+ "specified \"path\" = '" << path
+ << "', but frontmost LLView at (" << pos.mX << ", " << pos.mY
+ << ") is '" << LLView::getPathname(frontmost) << "'"));
+ }
+|*==========================================================================*/
+
+ // Instantiate a TemporaryDrilldownFunc to route incoming mouse events
+ // to the target LLView*. But put it on the heap since "path" is
+ // optional. Nonetheless, manage it with a boost::scoped_ptr so it
+ // will be destroyed when we leave.
+ tempfunc.reset(new LLView::TemporaryDrilldownFunc(llview::TargetEvent(target)));
+ }
+
+ // The question of whether the requested LLView actually handled the
+ // specified event is important enough, and its handling unclear enough,
+ // to warrant a separate response attribute. Instead of deciding here to
+ // make it a warning, or an error, let caller decide.
+ response["handled"] = func(pos, getMask(request));
+
+ // On exiting this scope, response will send, tempfunc will restore the
+ // normal pointInView(x, y) containment logic, etc.
+}
+
+void LLWindowListener::mouseDown(LLSD const & request)
+{
+ Actions actions(buttons.lookup(request["button"]));
+ if (actions.valid)
+ {
+ // Normally you can pass NULL to an LLWindow* without compiler
+ // complaint, but going through boost::lambda::bind() evidently
+ // bypasses that special case: it only knows you're trying to pass an
+ // int to a pointer. Explicitly cast NULL to the desired pointer type.
+ mouseEvent(bll::bind(actions.down, mWindow,
+ static_cast<LLWindow*>(NULL), bll::_1, bll::_2),
+ request);
+ }
+}
+
+void LLWindowListener::mouseUp(LLSD const & request)
+{
+ Actions actions(buttons.lookup(request["button"]));
+ if (actions.valid)
+ {
+ mouseEvent(bll::bind(actions.up, mWindow,
+ static_cast<LLWindow*>(NULL), bll::_1, bll::_2),
+ request);
+ }
+}
+
+void LLWindowListener::mouseMove(LLSD const & request)
+{
+ // We want to call the same central mouseEvent() routine for
+ // handleMouseMove() as for button clicks. But handleMouseMove() returns
+ // void, whereas mouseEvent() accepts a function returning bool -- and
+ // uses that bool return. Use (void-lambda-expression, true) to construct
+ // a callable that returns bool anyway. Pass 'true' because we expect that
+ // our caller will usually treat 'false' as a problem.
+ mouseEvent((bll::bind(&LLWindowCallbacks::handleMouseMove, mWindow,
+ static_cast<LLWindow*>(NULL), bll::_1, bll::_2),
+ true),
+ request);
+}
+
+void LLWindowListener::mouseScroll(LLSD const & request)
+{
+ S32 clicks = request["clicks"].asInteger();
+
+ mWindow->handleScrollWheel(NULL, clicks);
+}
diff --git a/indra/newview/llwindowlistener.h b/indra/newview/llwindowlistener.h
new file mode 100644
index 0000000000..7af5ab3b9f
--- /dev/null
+++ b/indra/newview/llwindowlistener.h
@@ -0,0 +1,57 @@
+/**
+ * @file llwindowlistener.h
+ * @brief EventAPI interface for injecting input into LLWindow
+ *
+ * $LicenseInfo:firstyear=2001&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLWINDOWLISTENER_H
+#define LL_LLWINDOWLISTENER_H
+
+#include "lleventapi.h"
+#include <boost/function.hpp>
+
+class LLKeyboard;
+class LLViewerWindow;
+
+class LLWindowListener : public LLEventAPI
+{
+public:
+ typedef boost::function<LLKeyboard*()> KeyboardGetter;
+ LLWindowListener(LLViewerWindow * window, const KeyboardGetter& kbgetter);
+
+ void getInfo(LLSD const & evt);
+ void getPaths(LLSD const & evt);
+ void keyDown(LLSD const & evt);
+ void keyUp(LLSD const & evt);
+ void mouseDown(LLSD const & evt);
+ void mouseUp(LLSD const & evt);
+ void mouseMove(LLSD const & evt);
+ void mouseScroll(LLSD const & evt);
+
+private:
+ LLViewerWindow * mWindow;
+ KeyboardGetter mKbGetter;
+};
+
+
+#endif // LL_LLWINDOWLISTENER_H
diff --git a/indra/newview/llwlparamset.cpp b/indra/newview/llwlparamset.cpp
index 02d914a812..5bb7025031 100644
--- a/indra/newview/llwlparamset.cpp
+++ b/indra/newview/llwlparamset.cpp
@@ -69,12 +69,18 @@ LLWLParamSet::LLWLParamSet(void) :
*/
}
+static LLFastTimer::DeclareTimer FTM_WL_PARAM_UPDATE("WL Param Update");
+
void LLWLParamSet::update(LLGLSLShader * shader) const
{
+ LLFastTimer t(FTM_WL_PARAM_UPDATE);
+
for(LLSD::map_const_iterator i = mParamValues.beginMap();
i != mParamValues.endMap();
++i)
{
+
+
const std::string& param = i->first;
if( param == "star_brightness" || param == "preset_num" || param == "sun_angle" ||
@@ -91,8 +97,9 @@ void LLWLParamSet::update(LLGLSLShader * shader) const
val.mV[1] = F32(i->second[1].asReal()) + mCloudScrollYOffset;
val.mV[2] = (F32) i->second[2].asReal();
val.mV[3] = (F32) i->second[3].asReal();
-
- shader->uniform4fv(param, 1, val.mV);
+ stop_glerror();
+ shader->uniform4fv(param, 1, val.mV);
+ stop_glerror();
}
else // param is the uniform name
{
@@ -118,8 +125,9 @@ void LLWLParamSet::update(LLGLSLShader * shader) const
{
val.mV[0] = i->second.asBoolean();
}
-
+ stop_glerror();
shader->uniform4fv(param, 1, val.mV);
+ stop_glerror();
}
}
}
diff --git a/indra/newview/llworld.cpp b/indra/newview/llworld.cpp
index a7ae456f3c..676287c0ad 100644
--- a/indra/newview/llworld.cpp
+++ b/indra/newview/llworld.cpp
@@ -589,22 +589,22 @@ void LLWorld::updateVisibilities()
{
F32 cur_far_clip = LLViewerCamera::getInstance()->getFar();
- LLViewerCamera::getInstance()->setFar(mLandFarClip);
-
- F32 diagonal_squared = F_SQRT2 * F_SQRT2 * mWidth * mWidth;
- // Go through the culled list and check for visible regions
+ // Go through the culled list and check for visible regions (region is visible if land is visible)
for (region_list_t::iterator iter = mCulledRegionList.begin();
iter != mCulledRegionList.end(); )
{
region_list_t::iterator curiter = iter++;
LLViewerRegion* regionp = *curiter;
- F32 height = regionp->getLand().getMaxZ() - regionp->getLand().getMinZ();
- F32 radius = 0.5f*(F32) sqrt(height * height + diagonal_squared);
- if (!regionp->getLand().hasZData()
- || LLViewerCamera::getInstance()->sphereInFrustum(regionp->getCenterAgent(), radius))
+
+ LLSpatialPartition* part = regionp->getSpatialPartition(LLViewerRegion::PARTITION_TERRAIN);
+ if (part)
{
- mCulledRegionList.erase(curiter);
- mVisibleRegionList.push_back(regionp);
+ LLSpatialGroup* group = (LLSpatialGroup*) part->mOctree->getListener(0);
+ if (LLViewerCamera::getInstance()->AABBInFrustum(group->mBounds[0], group->mBounds[1]))
+ {
+ mCulledRegionList.erase(curiter);
+ mVisibleRegionList.push_back(regionp);
+ }
}
}
@@ -619,17 +619,20 @@ void LLWorld::updateVisibilities()
continue;
}
- F32 height = regionp->getLand().getMaxZ() - regionp->getLand().getMinZ();
- F32 radius = 0.5f*(F32) sqrt(height * height + diagonal_squared);
- if (LLViewerCamera::getInstance()->sphereInFrustum(regionp->getCenterAgent(), radius))
- {
- regionp->calculateCameraDistance();
- regionp->getLand().updatePatchVisibilities(gAgent);
- }
- else
+ LLSpatialPartition* part = regionp->getSpatialPartition(LLViewerRegion::PARTITION_TERRAIN);
+ if (part)
{
- mVisibleRegionList.erase(curiter);
- mCulledRegionList.push_back(regionp);
+ LLSpatialGroup* group = (LLSpatialGroup*) part->mOctree->getListener(0);
+ if (LLViewerCamera::getInstance()->AABBInFrustum(group->mBounds[0], group->mBounds[1]))
+ {
+ regionp->calculateCameraDistance();
+ regionp->getLand().updatePatchVisibilities(gAgent);
+ }
+ else
+ {
+ mVisibleRegionList.erase(curiter);
+ mCulledRegionList.push_back(regionp);
+ }
}
}
@@ -815,14 +818,11 @@ void LLWorld::updateWaterObjects()
max_x = (S32)region_x + range;
max_y = (S32)region_y + range;
- F32 height = 0.f;
-
for (region_list_t::iterator iter = mRegionList.begin();
iter != mRegionList.end(); ++iter)
{
LLViewerRegion* regionp = *iter;
LLVOWater* waterp = regionp->getLand().getWaterObj();
- height += regionp->getWaterHeight();
if (waterp)
{
gObjectList.updateActive(waterp);
@@ -839,6 +839,7 @@ void LLWorld::updateWaterObjects()
// Now, get a list of the holes
S32 x, y;
+ F32 water_height = gAgent.getRegion()->getWaterHeight() + 256.f;
for (x = min_x; x <= max_x; x += rwidth)
{
for (y = min_y; y <= max_y; y += rwidth)
@@ -850,7 +851,7 @@ void LLWorld::updateWaterObjects()
waterp->setUseTexture(FALSE);
waterp->setPositionGlobal(LLVector3d(x + rwidth/2,
y + rwidth/2,
- 256.f+DEFAULT_WATER_HEIGHT));
+ water_height));
waterp->setScale(LLVector3((F32)rwidth, (F32)rwidth, 512.f));
gPipeline.createObject(waterp);
mHoleWaterObjects.push_back(waterp);
@@ -907,8 +908,7 @@ void LLWorld::updateWaterObjects()
}
waterp->setRegion(gAgent.getRegion());
- LLVector3d water_pos(water_center_x, water_center_y,
- DEFAULT_WATER_HEIGHT+256.f);
+ LLVector3d water_pos(water_center_x, water_center_y, water_height) ;
LLVector3 water_scale((F32) dim[0], (F32) dim[1], 512.f);
//stretch out to horizon
diff --git a/indra/newview/llworldmapmessage.cpp b/indra/newview/llworldmapmessage.cpp
index 66d0d698ba..8307d32336 100644
--- a/indra/newview/llworldmapmessage.cpp
+++ b/indra/newview/llworldmapmessage.cpp
@@ -210,15 +210,14 @@ void LLWorldMapMessage::processMapBlockReply(LLMessageSystem* msg, void**)
}
// Handle the SLURL callback if any
- if(LLWorldMapMessage::getInstance()->mSLURLCallback != NULL)
+ url_callback_t callback = LLWorldMapMessage::getInstance()->mSLURLCallback;
+ if(callback != NULL)
{
U64 handle = to_region_handle(x_world, y_world);
// Check if we reached the requested region
if ((LLStringUtil::compareInsensitive(LLWorldMapMessage::getInstance()->mSLURLRegionName, name)==0)
|| (LLWorldMapMessage::getInstance()->mSLURLRegionHandle == handle))
{
- url_callback_t callback = LLWorldMapMessage::getInstance()->mSLURLCallback;
-
LLWorldMapMessage::getInstance()->mSLURLCallback = NULL;
LLWorldMapMessage::getInstance()->mSLURLRegionName.clear();
LLWorldMapMessage::getInstance()->mSLURLRegionHandle = 0;
diff --git a/indra/newview/llworldmapview.cpp b/indra/newview/llworldmapview.cpp
index 265d5dc801..e50851b8e7 100644
--- a/indra/newview/llworldmapview.cpp
+++ b/indra/newview/llworldmapview.cpp
@@ -314,7 +314,7 @@ void LLWorldMapView::draw()
{
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
- glMatrixMode(GL_MODELVIEW);
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
// Clear the background alpha to 0
gGL.flush();
@@ -422,7 +422,7 @@ void LLWorldMapView::draw()
// Draw something whenever we have enough info
if (overlayimage->hasGLTexture())
{
- gGL.blendFunc(LLRender::BF_DEST_ALPHA, LLRender::BF_ZERO);
+ gGL.blendFunc(LLRender::BF_SOURCE_ALPHA, LLRender::BF_ONE_MINUS_SOURCE_ALPHA);
gGL.getTexUnit(0)->bind(overlayimage);
gGL.color4f(1.f, 1.f, 1.f, 1.f);
gGL.begin(LLRender::QUADS);
@@ -1307,7 +1307,7 @@ void LLWorldMapView::drawTrackingCircle( const LLRect& rect, S32 x, S32 y, const
end_theta -= angle_adjust_y;
}
- glMatrixMode(GL_MODELVIEW);
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
gGL.pushMatrix();
gGL.translatef((F32)x, (F32)y, 0.f);
gl_washer_segment_2d(inner_radius, outer_radius, start_theta, end_theta, 40, color, color);
diff --git a/indra/newview/llworldview.cpp b/indra/newview/llworldview.cpp
deleted file mode 100644
index f5dc2a5290..0000000000
--- a/indra/newview/llworldview.cpp
+++ /dev/null
@@ -1,61 +0,0 @@
-/**
- * @file llworldview.cpp
- * @brief LLWorldView class implementation
- *
- * $LicenseInfo:firstyear=2001&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-#include "llviewerprecompiledheaders.h"
-
-#include "llworldview.h"
-
-#include "llviewercontrol.h"
-#include "llsidetray.h"
-/////////////////////////////////////////////////////
-// LLFloaterView
-
-static LLDefaultChildRegistry::Register<LLWorldView> r("world_view");
-
-LLWorldView::LLWorldView(const Params& p)
-: LLUICtrl (p)
-{
- gSavedSettings.getControl("SidebarCameraMovement")->getSignal()->connect(boost::bind(&LLWorldView::toggleSidebarCameraMovement, this, _2));
-}
-
-void LLWorldView::reshape(S32 width, S32 height, BOOL called_from_parent)
-{
- //if (FALSE == gSavedSettings.getBOOL("SidebarCameraMovement") )
- //{
- // LLView* main_view = LLUI::getRootView()->findChild<LLView>("main_view");
- // if(main_view)
- // {
- // width = main_view->getRect().getWidth();
- // }
- //}
-
- LLUICtrl::reshape(width, height, called_from_parent);
-}
-void LLWorldView::toggleSidebarCameraMovement(const LLSD::Boolean& new_visibility)
-{
- reshape(getParent()->getRect().getWidth(),getRect().getHeight());
-}
-
diff --git a/indra/newview/llxmlrpctransaction.cpp b/indra/newview/llxmlrpctransaction.cpp
index f483ba5af8..0da70d398b 100644
--- a/indra/newview/llxmlrpctransaction.cpp
+++ b/indra/newview/llxmlrpctransaction.cpp
@@ -305,6 +305,15 @@ void LLXMLRPCTransaction::Impl::init(XMLRPC_REQUEST request, bool useGzip)
{
mCurlRequest = new LLCurlEasyRequest();
}
+ if(!mCurlRequest->isValid())
+ {
+ llwarns << "mCurlRequest is invalid." << llendl ;
+
+ delete mCurlRequest ;
+ mCurlRequest = NULL ;
+ return ;
+ }
+
mErrorCert = NULL;
// mCurlRequest->setopt(CURLOPT_VERBOSE, 1); // useful for debugging
@@ -357,10 +366,20 @@ LLXMLRPCTransaction::Impl::~Impl()
}
delete mCurlRequest;
+ mCurlRequest = NULL ;
}
bool LLXMLRPCTransaction::Impl::process()
{
+ if(!mCurlRequest || !mCurlRequest->isValid())
+ {
+ llwarns << "transaction failed." << llendl ;
+
+ delete mCurlRequest ;
+ mCurlRequest = NULL ;
+ return true ; //failed, quit.
+ }
+
switch(mStatus)
{
case LLXMLRPCTransaction::StatusComplete:
@@ -382,19 +401,11 @@ bool LLXMLRPCTransaction::Impl::process()
// continue onward
}
}
-
- //const F32 MAX_PROCESSING_TIME = 0.05f;
- //LLTimer timer;
-
- mCurlRequest->perform();
-
- /*while (mCurlRequest->perform() > 0)
+
+ if(!mCurlRequest->wait())
{
- if (timer.getElapsedTimeF32() >= MAX_PROCESSING_TIME)
- {
- return false;
- }
- }*/
+ return false ;
+ }
while(1)
{
diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp
index a50f66f282..c523a78b22 100644
--- a/indra/newview/pipeline.cpp
+++ b/indra/newview/pipeline.cpp
@@ -106,26 +106,6 @@
#include "llnotifications.h"
-void check_stack_depth(S32 stack_depth)
-{
- if (gDebugGL || gDebugSession)
- {
- GLint depth;
- glGetIntegerv(GL_MODELVIEW_STACK_DEPTH, &depth);
- if (depth != stack_depth)
- {
- if (gDebugSession)
- {
- ll_fail("GL matrix stack corrupted.");
- }
- else
- {
- llerrs << "GL matrix stack corrupted!" << llendl;
- }
- }
- }
-}
-
#ifdef _DEBUG
// Debug indices is disabled for now for debug performance - djs 4/24/02
//#define DEBUG_INDICES
@@ -133,13 +113,88 @@ void check_stack_depth(S32 stack_depth)
//#define DEBUG_INDICES
#endif
+//cached settings
+BOOL LLPipeline::RenderAvatarVP;
+BOOL LLPipeline::VertexShaderEnable;
+BOOL LLPipeline::WindLightUseAtmosShaders;
+BOOL LLPipeline::RenderDeferred;
+F32 LLPipeline::RenderDeferredSunWash;
+U32 LLPipeline::RenderFSAASamples;
+U32 LLPipeline::RenderResolutionDivisor;
+BOOL LLPipeline::RenderUIBuffer;
+S32 LLPipeline::RenderShadowDetail;
+BOOL LLPipeline::RenderDeferredSSAO;
+F32 LLPipeline::RenderShadowResolutionScale;
+BOOL LLPipeline::RenderLocalLights;
+BOOL LLPipeline::RenderDelayCreation;
+BOOL LLPipeline::RenderAnimateRes;
+BOOL LLPipeline::FreezeTime;
+S32 LLPipeline::DebugBeaconLineWidth;
+F32 LLPipeline::RenderHighlightBrightness;
+LLColor4 LLPipeline::RenderHighlightColor;
+F32 LLPipeline::RenderHighlightThickness;
+BOOL LLPipeline::RenderSpotLightsInNondeferred;
+LLColor4 LLPipeline::PreviewAmbientColor;
+LLColor4 LLPipeline::PreviewDiffuse0;
+LLColor4 LLPipeline::PreviewSpecular0;
+LLColor4 LLPipeline::PreviewDiffuse1;
+LLColor4 LLPipeline::PreviewSpecular1;
+LLColor4 LLPipeline::PreviewDiffuse2;
+LLColor4 LLPipeline::PreviewSpecular2;
+LLVector3 LLPipeline::PreviewDirection0;
+LLVector3 LLPipeline::PreviewDirection1;
+LLVector3 LLPipeline::PreviewDirection2;
+F32 LLPipeline::RenderGlowMinLuminance;
+F32 LLPipeline::RenderGlowMaxExtractAlpha;
+F32 LLPipeline::RenderGlowWarmthAmount;
+LLVector3 LLPipeline::RenderGlowLumWeights;
+LLVector3 LLPipeline::RenderGlowWarmthWeights;
+S32 LLPipeline::RenderGlowResolutionPow;
+S32 LLPipeline::RenderGlowIterations;
+F32 LLPipeline::RenderGlowWidth;
+F32 LLPipeline::RenderGlowStrength;
+BOOL LLPipeline::RenderDepthOfField;
+F32 LLPipeline::CameraFocusTransitionTime;
+F32 LLPipeline::CameraFNumber;
+F32 LLPipeline::CameraFocalLength;
+F32 LLPipeline::CameraFieldOfView;
+F32 LLPipeline::RenderShadowNoise;
+F32 LLPipeline::RenderShadowBlurSize;
+F32 LLPipeline::RenderSSAOScale;
+U32 LLPipeline::RenderSSAOMaxScale;
+F32 LLPipeline::RenderSSAOFactor;
+LLVector3 LLPipeline::RenderSSAOEffect;
+F32 LLPipeline::RenderShadowOffsetError;
+F32 LLPipeline::RenderShadowBiasError;
+F32 LLPipeline::RenderShadowOffset;
+F32 LLPipeline::RenderShadowBias;
+F32 LLPipeline::RenderSpotShadowOffset;
+F32 LLPipeline::RenderSpotShadowBias;
+F32 LLPipeline::RenderEdgeDepthCutoff;
+F32 LLPipeline::RenderEdgeNormCutoff;
+LLVector3 LLPipeline::RenderShadowGaussian;
+F32 LLPipeline::RenderShadowBlurDistFactor;
+BOOL LLPipeline::RenderDeferredAtmospheric;
+S32 LLPipeline::RenderReflectionDetail;
+F32 LLPipeline::RenderHighlightFadeTime;
+LLVector3 LLPipeline::RenderShadowClipPlanes;
+LLVector3 LLPipeline::RenderShadowOrthoClipPlanes;
+LLVector3 LLPipeline::RenderShadowNearDist;
+F32 LLPipeline::RenderFarClip;
+LLVector3 LLPipeline::RenderShadowSplitExponent;
+F32 LLPipeline::RenderShadowErrorCutoff;
+F32 LLPipeline::RenderShadowFOVCutoff;
+BOOL LLPipeline::CameraOffset;
+F32 LLPipeline::CameraMaxCoF;
+F32 LLPipeline::CameraDoFResScale;
+
const F32 BACKLIGHT_DAY_MAGNITUDE_AVATAR = 0.2f;
const F32 BACKLIGHT_NIGHT_MAGNITUDE_AVATAR = 0.1f;
const F32 BACKLIGHT_DAY_MAGNITUDE_OBJECT = 0.1f;
const F32 BACKLIGHT_NIGHT_MAGNITUDE_OBJECT = 0.08f;
const S32 MAX_OFFSCREEN_GEOMETRY_CHANGES_PER_FRAME = 10;
const U32 REFLECTION_MAP_RES = 128;
-
+const U32 DEFERRED_VB_MASK = LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0 | LLVertexBuffer::MAP_TEXCOORD1;
// Max number of occluders to search for. JC
const S32 MAX_OCCLUDER_COUNT = 2;
@@ -211,23 +266,12 @@ std::string gPoolNames[] =
void drawBox(const LLVector3& c, const LLVector3& r);
void drawBoxOutline(const LLVector3& pos, const LLVector3& size);
+U32 nhpo2(U32 v);
-U32 nhpo2(U32 v)
-{
- U32 r = 1;
- while (r < v) {
- r *= 2;
- }
- return r;
-}
-
-glh::matrix4f glh_copy_matrix(GLdouble* src)
+glh::matrix4f glh_copy_matrix(F32* src)
{
glh::matrix4f ret;
- for (U32 i = 0; i < 16; i++)
- {
- ret.m[i] = (F32) src[i];
- }
+ ret.set_value(src);
return ret;
}
@@ -251,7 +295,7 @@ glh::matrix4f glh_get_last_projection()
return glh_copy_matrix(gGLLastProjection);
}
-void glh_copy_matrix(const glh::matrix4f& src, GLdouble* dst)
+void glh_copy_matrix(const glh::matrix4f& src, F32* dst)
{
for (U32 i = 0; i < 16; i++)
{
@@ -394,11 +438,14 @@ void LLPipeline::init()
{
LLMemType mt(LLMemType::MTYPE_PIPELINE_INIT);
+ refreshCachedSettings();
+
gOctreeMaxCapacity = gSavedSettings.getU32("OctreeMaxNodeCapacity");
sDynamicLOD = gSavedSettings.getBOOL("RenderDynamicLOD");
sRenderBump = gSavedSettings.getBOOL("RenderObjectBump");
sUseTriStrips = gSavedSettings.getBOOL("RenderUseTriStrips");
LLVertexBuffer::sUseStreamDraw = gSavedSettings.getBOOL("RenderUseStreamVBO");
+ LLVertexBuffer::sUseVAO = gSavedSettings.getBOOL("RenderUseVAO");
LLVertexBuffer::sPreferStreamDraw = gSavedSettings.getBOOL("RenderPreferStreamDraw");
sRenderAttachedLights = gSavedSettings.getBOOL("RenderAttachedLights");
sRenderAttachedParticles = gSavedSettings.getBOOL("RenderAttachedParticles");
@@ -459,7 +506,95 @@ void LLPipeline::init()
mSpotLightFade[i] = 1.f;
}
+ mDeferredVB = new LLVertexBuffer(DEFERRED_VB_MASK, 0);
+ mDeferredVB->allocateBuffer(8, 0, true);
setLightingDetail(-1);
+
+ //
+ // Update all settings to trigger a cached settings refresh
+ //
+
+ gSavedSettings.getControl("RenderAutoMaskAlphaDeferred")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("RenderAutoMaskAlphaNonDeferred")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("RenderUseFarClip")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("RenderAvatarMaxVisible")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("RenderDelayVBUpdate")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+
+ gSavedSettings.getControl("UseOcclusion")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+
+ gSavedSettings.getControl("VertexShaderEnable")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("RenderAvatarVP")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("WindLightUseAtmosShaders")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("RenderDeferred")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("RenderDeferredSunWash")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("RenderFSAASamples")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("RenderResolutionDivisor")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("RenderUIBuffer")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("RenderShadowDetail")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("RenderDeferredSSAO")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("RenderShadowResolutionScale")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("RenderLocalLights")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("RenderDelayCreation")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("RenderAnimateRes")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("FreezeTime")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("DebugBeaconLineWidth")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("RenderHighlightBrightness")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("RenderHighlightColor")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("RenderHighlightThickness")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("RenderSpotLightsInNondeferred")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("PreviewAmbientColor")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("PreviewDiffuse0")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("PreviewSpecular0")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("PreviewDiffuse1")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("PreviewSpecular1")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("PreviewDiffuse2")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("PreviewSpecular2")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("PreviewDirection0")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("PreviewDirection1")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("PreviewDirection2")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("RenderGlowMinLuminance")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("RenderGlowMaxExtractAlpha")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("RenderGlowWarmthAmount")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("RenderGlowLumWeights")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("RenderGlowWarmthWeights")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("RenderGlowResolutionPow")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("RenderGlowIterations")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("RenderGlowWidth")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("RenderGlowStrength")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("RenderDepthOfField")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("CameraFocusTransitionTime")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("CameraFNumber")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("CameraFocalLength")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("CameraFieldOfView")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("RenderShadowNoise")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("RenderShadowBlurSize")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("RenderSSAOScale")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("RenderSSAOMaxScale")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("RenderSSAOFactor")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("RenderSSAOEffect")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("RenderShadowOffsetError")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("RenderShadowBiasError")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("RenderShadowOffset")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("RenderShadowBias")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("RenderSpotShadowOffset")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("RenderSpotShadowBias")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("RenderEdgeDepthCutoff")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("RenderEdgeNormCutoff")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("RenderShadowGaussian")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("RenderShadowBlurDistFactor")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("RenderDeferredAtmospheric")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("RenderReflectionDetail")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("RenderHighlightFadeTime")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("RenderShadowClipPlanes")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("RenderShadowOrthoClipPlanes")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("RenderShadowNearDist")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("RenderFarClip")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("RenderShadowSplitExponent")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("RenderShadowErrorCutoff")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("RenderShadowFOVCutoff")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("CameraOffset")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("CameraMaxCoF")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("CameraDoFResScale")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
}
LLPipeline::~LLPipeline()
@@ -537,6 +672,8 @@ void LLPipeline::cleanup()
mMovedBridge.clear();
mInitialized = FALSE;
+
+ mDeferredVB = NULL;
}
//============================================================================
@@ -606,12 +743,8 @@ void LLPipeline::allocatePhysicsBuffer()
void LLPipeline::allocateScreenBuffer(U32 resX, U32 resY)
{
- U32 samples = gGLManager.getNumFBOFSAASamples(gSavedSettings.getU32("RenderFSAASamples"));
-
- if (gGLManager.mIsATI)
- { //ATI doesn't like the way we use multisample texture
- samples = 0;
- }
+ refreshCachedSettings();
+ U32 samples = RenderFSAASamples;
//try to allocate screen buffers at requested resolution and samples
// - on failure, shrink number of samples and try again
@@ -632,6 +765,8 @@ void LLPipeline::allocateScreenBuffer(U32 resX, U32 resY)
releaseScreenBuffers();
}
+ samples = 0;
+
//reduce resolution
while (resY > 0 && resX > 0)
{
@@ -657,11 +792,13 @@ void LLPipeline::allocateScreenBuffer(U32 resX, U32 resY)
bool LLPipeline::allocateScreenBuffer(U32 resX, U32 resY, U32 samples)
{
+ refreshCachedSettings();
+
// remember these dimensions
mScreenWidth = resX;
mScreenHeight = resY;
- U32 res_mod = gSavedSettings.getU32("RenderResolutionDivisor");
+ U32 res_mod = RenderResolutionDivisor;
if (res_mod > 1 && res_mod < resX && res_mod < resY)
{
@@ -669,7 +806,7 @@ bool LLPipeline::allocateScreenBuffer(U32 resX, U32 resY, U32 samples)
resY /= res_mod;
}
- if (gSavedSettings.getBOOL("RenderUIBuffer"))
+ if (RenderUIBuffer)
{
if (!mUIScreen.allocate(resX,resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE))
{
@@ -679,79 +816,40 @@ bool LLPipeline::allocateScreenBuffer(U32 resX, U32 resY, U32 samples)
if (LLPipeline::sRenderDeferred)
{
- S32 shadow_detail = gSavedSettings.getS32("RenderShadowDetail");
- BOOL ssao = gSavedSettings.getBOOL("RenderDeferredSSAO");
- bool gi = LLViewerShaderMgr::instance()->getVertexShaderLevel(LLViewerShaderMgr::SHADER_DEFERRED);
-
+ S32 shadow_detail = RenderShadowDetail;
+ BOOL ssao = RenderDeferredSSAO;
+
//allocate deferred rendering color buffers
if (!mDeferredScreen.allocate(resX, resY, GL_RGBA, TRUE, TRUE, LLTexUnit::TT_RECT_TEXTURE, FALSE, samples)) return false;
if (!mDeferredDepth.allocate(resX, resY, 0, TRUE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE, samples)) return false;
if (!addDeferredAttachments(mDeferredScreen)) return false;
if (!mScreen.allocate(resX, resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE, samples)) return false;
-
-#if LL_DARWIN
- // As of OS X 10.6.7, Apple doesn't support multiple color formats in a single FBO
- if (!mEdgeMap.allocate(resX, resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE)) return false;
-#else
- if (!mEdgeMap.allocate(resX, resY, GL_ALPHA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE)) return false;
-#endif
-
- if (shadow_detail > 0 || ssao)
- { //only need mDeferredLight[0] for shadows OR ssao
- if (!mDeferredLight[0].allocate(resX, resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE)) return false;
- }
- else
+ if (samples > 0)
{
- mDeferredLight[0].release();
- }
-
- if (ssao)
- { //only need mDeferredLight[1] for ssao
- if (!mDeferredLight[1].allocate(resX, resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE, false)) return false;
+ if (!mFXAABuffer.allocate(nhpo2(resX), nhpo2(resY), GL_RGBA, FALSE, FALSE, LLTexUnit::TT_TEXTURE, FALSE, samples)) return false;
}
else
{
- mDeferredLight[1].release();
+ mFXAABuffer.release();
}
-
- if (gi)
- { //only need mDeferredLight[2] and mGIMapPost for gi
- if (!mDeferredLight[2].allocate(resX, resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE, false)) return false;
- for (U32 i = 0; i < 2; i++)
- {
-#if LL_DARWIN
- // As of OS X 10.6.7, Apple doesn't support multiple color formats in a single FBO
- if (!mGIMapPost[i].allocate(resX,resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE)) return false;
-#else
- if (!mGIMapPost[i].allocate(resX,resY, GL_RGB, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE)) return false;
-#endif
- }
+
+ if (shadow_detail > 0 || ssao || RenderDepthOfField || samples > 0)
+ { //only need mDeferredLight for shadows OR ssao OR dof OR fxaa
+ if (!mDeferredLight.allocate(resX, resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE)) return false;
}
else
{
- mDeferredLight[2].release();
-
- for (U32 i = 0; i < 2; i++)
- {
- mGIMapPost[i].release();
- }
+ mDeferredLight.release();
}
- F32 scale = gSavedSettings.getF32("RenderShadowResolutionScale");
-
-#if LL_DARWIN
- U32 shadow_fmt = 0;
-#else
- //HACK: make alpha masking work on ATI depth shadows (work around for ATI driver bug)
- U32 shadow_fmt = gGLManager.mIsATI ? GL_ALPHA : 0;
-#endif
+ F32 scale = RenderShadowResolutionScale;
if (shadow_detail > 0)
{ //allocate 4 sun shadow maps
for (U32 i = 0; i < 4; i++)
{
- if (!mShadow[i].allocate(U32(resX*scale),U32(resY*scale), shadow_fmt, TRUE, FALSE, LLTexUnit::TT_RECT_TEXTURE)) return false;
+ if (!mShadow[i].allocate(U32(resX*scale),U32(resY*scale), 0, TRUE, FALSE, LLTexUnit::TT_RECT_TEXTURE)) return false;
}
}
else
@@ -769,7 +867,7 @@ bool LLPipeline::allocateScreenBuffer(U32 resX, U32 resY, U32 samples)
{ //allocate two spot shadow maps
for (U32 i = 4; i < 6; i++)
{
- if (!mShadow[i].allocate(width, height, shadow_fmt, TRUE, FALSE)) return false;
+ if (!mShadow[i].allocate(width, height, 0, TRUE, FALSE)) return false;
}
}
else
@@ -779,31 +877,20 @@ bool LLPipeline::allocateScreenBuffer(U32 resX, U32 resY, U32 samples)
mShadow[i].release();
}
}
-
- width = nhpo2(resX)/2;
- height = nhpo2(resY)/2;
- if (!mLuminanceMap.allocate(width,height, GL_RGBA, FALSE, FALSE)) return false;
}
else
{
- for (U32 i = 0; i < 3; i++)
- {
- mDeferredLight[i].release();
- }
- for (U32 i = 0; i < 2; i++)
- {
- mGIMapPost[i].release();
- }
+ mDeferredLight.release();
+
for (U32 i = 0; i < 6; i++)
{
mShadow[i].release();
}
+ mFXAABuffer.release();
mScreen.release();
mDeferredScreen.release(); //make sure to release any render targets that share a depth buffer with mDeferredScreen first
mDeferredDepth.release();
- mEdgeMap.release();
- mLuminanceMap.release();
-
+
if (!mScreen.allocate(resX, resY, GL_RGBA, TRUE, TRUE, LLTexUnit::TT_RECT_TEXTURE, FALSE)) return false;
}
@@ -822,12 +909,12 @@ bool LLPipeline::allocateScreenBuffer(U32 resX, U32 resY, U32 samples)
//static
void LLPipeline::updateRenderDeferred()
{
- BOOL deferred = ((gSavedSettings.getBOOL("RenderDeferred") &&
+ BOOL deferred = ((RenderDeferred &&
LLRenderTarget::sUseFBO &&
- LLFeatureManager::getInstance()->isFeatureAvailable("RenderDeferred") &&
- gSavedSettings.getBOOL("VertexShaderEnable") &&
- gSavedSettings.getBOOL("RenderAvatarVP") &&
- gSavedSettings.getBOOL("WindLightUseAtmosShaders")) ? TRUE : FALSE) &&
+ LLFeatureManager::getInstance()->isFeatureAvailable("RenderDeferred") &&
+ VertexShaderEnable &&
+ RenderAvatarVP &&
+ WindLightUseAtmosShaders) ? TRUE : FALSE) &&
!gUseWireframe;
sRenderDeferred = deferred;
@@ -838,8 +925,94 @@ void LLPipeline::updateRenderDeferred()
}
//static
-void LLPipeline::refreshRenderDeferred()
-{
+void LLPipeline::refreshCachedSettings()
+{
+ LLPipeline::sAutoMaskAlphaDeferred = gSavedSettings.getBOOL("RenderAutoMaskAlphaDeferred");
+ LLPipeline::sAutoMaskAlphaNonDeferred = gSavedSettings.getBOOL("RenderAutoMaskAlphaNonDeferred");
+ LLPipeline::sUseFarClip = gSavedSettings.getBOOL("RenderUseFarClip");
+ LLVOAvatar::sMaxVisible = (U32)gSavedSettings.getS32("RenderAvatarMaxVisible");
+ LLPipeline::sDelayVBUpdate = gSavedSettings.getBOOL("RenderDelayVBUpdate");
+
+ LLPipeline::sUseOcclusion =
+ (!gUseWireframe
+ && LLFeatureManager::getInstance()->isFeatureAvailable("UseOcclusion")
+ && gSavedSettings.getBOOL("UseOcclusion")
+ && gGLManager.mHasOcclusionQuery) ? 2 : 0;
+
+ VertexShaderEnable = gSavedSettings.getBOOL("VertexShaderEnable");
+ RenderAvatarVP = gSavedSettings.getBOOL("RenderAvatarVP");
+ WindLightUseAtmosShaders = gSavedSettings.getBOOL("WindLightUseAtmosShaders");
+ RenderDeferred = gSavedSettings.getBOOL("RenderDeferred");
+ RenderDeferredSunWash = gSavedSettings.getF32("RenderDeferredSunWash");
+ RenderFSAASamples = gSavedSettings.getU32("RenderFSAASamples");
+ RenderResolutionDivisor = gSavedSettings.getU32("RenderResolutionDivisor");
+ RenderUIBuffer = gSavedSettings.getBOOL("RenderUIBuffer");
+ RenderShadowDetail = gSavedSettings.getS32("RenderShadowDetail");
+ RenderDeferredSSAO = gSavedSettings.getBOOL("RenderDeferredSSAO");
+ RenderShadowResolutionScale = gSavedSettings.getF32("RenderShadowResolutionScale");
+ RenderLocalLights = gSavedSettings.getBOOL("RenderLocalLights");
+ RenderDelayCreation = gSavedSettings.getBOOL("RenderDelayCreation");
+ RenderAnimateRes = gSavedSettings.getBOOL("RenderAnimateRes");
+ FreezeTime = gSavedSettings.getBOOL("FreezeTime");
+ DebugBeaconLineWidth = gSavedSettings.getS32("DebugBeaconLineWidth");
+ RenderHighlightBrightness = gSavedSettings.getF32("RenderHighlightBrightness");
+ RenderHighlightColor = gSavedSettings.getColor4("RenderHighlightColor");
+ RenderHighlightThickness = gSavedSettings.getF32("RenderHighlightThickness");
+ RenderSpotLightsInNondeferred = gSavedSettings.getBOOL("RenderSpotLightsInNondeferred");
+ PreviewAmbientColor = gSavedSettings.getColor4("PreviewAmbientColor");
+ PreviewDiffuse0 = gSavedSettings.getColor4("PreviewDiffuse0");
+ PreviewSpecular0 = gSavedSettings.getColor4("PreviewSpecular0");
+ PreviewDiffuse1 = gSavedSettings.getColor4("PreviewDiffuse1");
+ PreviewSpecular1 = gSavedSettings.getColor4("PreviewSpecular1");
+ PreviewDiffuse2 = gSavedSettings.getColor4("PreviewDiffuse2");
+ PreviewSpecular2 = gSavedSettings.getColor4("PreviewSpecular2");
+ PreviewDirection0 = gSavedSettings.getVector3("PreviewDirection0");
+ PreviewDirection1 = gSavedSettings.getVector3("PreviewDirection1");
+ PreviewDirection2 = gSavedSettings.getVector3("PreviewDirection2");
+ RenderGlowMinLuminance = gSavedSettings.getF32("RenderGlowMinLuminance");
+ RenderGlowMaxExtractAlpha = gSavedSettings.getF32("RenderGlowMaxExtractAlpha");
+ RenderGlowWarmthAmount = gSavedSettings.getF32("RenderGlowWarmthAmount");
+ RenderGlowLumWeights = gSavedSettings.getVector3("RenderGlowLumWeights");
+ RenderGlowWarmthWeights = gSavedSettings.getVector3("RenderGlowWarmthWeights");
+ RenderGlowResolutionPow = gSavedSettings.getS32("RenderGlowResolutionPow");
+ RenderGlowIterations = gSavedSettings.getS32("RenderGlowIterations");
+ RenderGlowWidth = gSavedSettings.getF32("RenderGlowWidth");
+ RenderGlowStrength = gSavedSettings.getF32("RenderGlowStrength");
+ RenderDepthOfField = gSavedSettings.getBOOL("RenderDepthOfField");
+ CameraFocusTransitionTime = gSavedSettings.getF32("CameraFocusTransitionTime");
+ CameraFNumber = gSavedSettings.getF32("CameraFNumber");
+ CameraFocalLength = gSavedSettings.getF32("CameraFocalLength");
+ CameraFieldOfView = gSavedSettings.getF32("CameraFieldOfView");
+ RenderShadowNoise = gSavedSettings.getF32("RenderShadowNoise");
+ RenderShadowBlurSize = gSavedSettings.getF32("RenderShadowBlurSize");
+ RenderSSAOScale = gSavedSettings.getF32("RenderSSAOScale");
+ RenderSSAOMaxScale = gSavedSettings.getU32("RenderSSAOMaxScale");
+ RenderSSAOFactor = gSavedSettings.getF32("RenderSSAOFactor");
+ RenderSSAOEffect = gSavedSettings.getVector3("RenderSSAOEffect");
+ RenderShadowOffsetError = gSavedSettings.getF32("RenderShadowOffsetError");
+ RenderShadowBiasError = gSavedSettings.getF32("RenderShadowBiasError");
+ RenderShadowOffset = gSavedSettings.getF32("RenderShadowOffset");
+ RenderShadowBias = gSavedSettings.getF32("RenderShadowBias");
+ RenderSpotShadowOffset = gSavedSettings.getF32("RenderSpotShadowOffset");
+ RenderSpotShadowBias = gSavedSettings.getF32("RenderSpotShadowBias");
+ RenderEdgeDepthCutoff = gSavedSettings.getF32("RenderEdgeDepthCutoff");
+ RenderEdgeNormCutoff = gSavedSettings.getF32("RenderEdgeNormCutoff");
+ RenderShadowGaussian = gSavedSettings.getVector3("RenderShadowGaussian");
+ RenderShadowBlurDistFactor = gSavedSettings.getF32("RenderShadowBlurDistFactor");
+ RenderDeferredAtmospheric = gSavedSettings.getBOOL("RenderDeferredAtmospheric");
+ RenderReflectionDetail = gSavedSettings.getS32("RenderReflectionDetail");
+ RenderHighlightFadeTime = gSavedSettings.getF32("RenderHighlightFadeTime");
+ RenderShadowClipPlanes = gSavedSettings.getVector3("RenderShadowClipPlanes");
+ RenderShadowOrthoClipPlanes = gSavedSettings.getVector3("RenderShadowOrthoClipPlanes");
+ RenderShadowNearDist = gSavedSettings.getVector3("RenderShadowNearDist");
+ RenderFarClip = gSavedSettings.getF32("RenderFarClip");
+ RenderShadowSplitExponent = gSavedSettings.getVector3("RenderShadowSplitExponent");
+ RenderShadowErrorCutoff = gSavedSettings.getF32("RenderShadowErrorCutoff");
+ RenderShadowFOVCutoff = gSavedSettings.getF32("RenderShadowFOVCutoff");
+ CameraOffset = gSavedSettings.getBOOL("CameraOffset");
+ CameraMaxCoF = gSavedSettings.getF32("CameraMaxCoF");
+ CameraDoFResScale = gSavedSettings.getF32("CameraDoFResScale");
+
updateRenderDeferred();
}
@@ -883,21 +1056,14 @@ void LLPipeline::releaseScreenBuffers()
{
mUIScreen.release();
mScreen.release();
+ mFXAABuffer.release();
mPhysicsDisplay.release();
mDeferredScreen.release();
mDeferredDepth.release();
- for (U32 i = 0; i < 3; i++)
- {
- mDeferredLight[i].release();
- }
-
- mEdgeMap.release();
- mGIMap.release();
- mGIMapPost[0].release();
- mGIMapPost[1].release();
- mHighlight.release();
- mLuminanceMap.release();
+ mDeferredLight.release();
+ mHighlight.release();
+
for (U32 i = 0; i < 6; i++)
{
mShadow[i].release();
@@ -907,6 +1073,7 @@ void LLPipeline::releaseScreenBuffers()
void LLPipeline::createGLBuffers()
{
+ stop_glerror();
LLMemType mt_cb(LLMemType::MTYPE_PIPELINE_CREATE_BUFFERS);
assertInitialized();
@@ -1011,18 +1178,12 @@ void LLPipeline::createGLBuffers()
LLImageGL::generateTextures(1, &mLightFunc);
gGL.getTexUnit(0)->bindManual(LLTexUnit::TT_TEXTURE, mLightFunc);
- LLImageGL::setManualImage(LLTexUnit::getInternalType(LLTexUnit::TT_TEXTURE), 0, GL_ALPHA, lightResX, lightResY, GL_ALPHA, GL_UNSIGNED_BYTE, lg);
+ LLImageGL::setManualImage(LLTexUnit::getInternalType(LLTexUnit::TT_TEXTURE), 0, GL_R8, lightResX, lightResY, GL_RED, GL_UNSIGNED_BYTE, lg);
gGL.getTexUnit(0)->setTextureAddressMode(LLTexUnit::TAM_CLAMP);
gGL.getTexUnit(0)->setTextureFilteringOption(LLTexUnit::TFO_TRILINEAR);
delete [] lg;
}
-
- if (gSavedSettings.getBOOL("RenderDeferredGI"))
- {
- mGIMap.allocate(512,512,GL_RGBA, TRUE, FALSE);
- addDeferredAttachments(mGIMap);
- }
}
gBumpImageList.restoreGL();
@@ -1056,10 +1217,12 @@ void LLPipeline::restoreGL()
BOOL LLPipeline::canUseVertexShaders()
{
+ static const std::string vertex_shader_enable_feature_string = "VertexShaderEnable";
+
if (sDisableShaders ||
!gGLManager.mHasVertexShader ||
!gGLManager.mHasFragmentShader ||
- !LLFeatureManager::getInstance()->isFeatureAvailable("VertexShaderEnable") ||
+ !LLFeatureManager::getInstance()->isFeatureAvailable(vertex_shader_enable_feature_string) ||
(assertInitialized() && mVertexShadersLoaded != 1) )
{
return FALSE;
@@ -1123,10 +1286,11 @@ S32 LLPipeline::getMaxLightingDetail() const
S32 LLPipeline::setLightingDetail(S32 level)
{
LLMemType mt_ld(LLMemType::MTYPE_PIPELINE_LIGHTING_DETAIL);
+ refreshCachedSettings();
if (level < 0)
{
- if (gSavedSettings.getBOOL("RenderLocalLights"))
+ if (RenderLocalLights)
{
level = 1;
}
@@ -1447,7 +1611,7 @@ U32 LLPipeline::addObject(LLViewerObject *vobj)
{
LLMemType mt_ao(LLMemType::MTYPE_PIPELINE_ADD_OBJECT);
- if (gSavedSettings.getBOOL("RenderDelayCreation"))
+ if (RenderDelayCreation)
{
mCreateQ.push_back(vobj);
}
@@ -1510,7 +1674,7 @@ void LLPipeline::createObject(LLViewerObject* vobj)
markRebuild(drawablep, LLDrawable::REBUILD_ALL, TRUE);
- if (drawablep->getVOVolume() && gSavedSettings.getBOOL("RenderAnimateRes"))
+ if (drawablep->getVOVolume() && RenderAnimateRes)
{
// fun animated res
drawablep->updateXform(TRUE);
@@ -1549,7 +1713,7 @@ void LLPipeline::resetFrameStats()
//external functions for asynchronous updating
void LLPipeline::updateMoveDampedAsync(LLDrawable* drawablep)
{
- if (gSavedSettings.getBOOL("FreezeTime"))
+ if (FreezeTime)
{
return;
}
@@ -1579,7 +1743,7 @@ void LLPipeline::updateMoveDampedAsync(LLDrawable* drawablep)
void LLPipeline::updateMoveNormalAsync(LLDrawable* drawablep)
{
- if (gSavedSettings.getBOOL("FreezeTime"))
+ if (FreezeTime)
{
return;
}
@@ -1636,7 +1800,7 @@ void LLPipeline::updateMove()
LLFastTimer t(FTM_UPDATE_MOVE);
LLMemType mt_um(LLMemType::MTYPE_PIPELINE_UPDATE_MOVE);
- if (gSavedSettings.getBOOL("FreezeTime"))
+ if (FreezeTime)
{
return;
}
@@ -2009,13 +2173,13 @@ void LLPipeline::updateCull(LLCamera& camera, LLCullResult& result, S32 water_cl
gGL.setColorMask(false, false);
}
- glMatrixMode(GL_PROJECTION);
- glPushMatrix();
- glLoadMatrixd(gGLLastProjection);
- glMatrixMode(GL_MODELVIEW);
- glPushMatrix();
+ gGL.matrixMode(LLRender::MM_PROJECTION);
+ gGL.pushMatrix();
+ gGL.loadMatrix(gGLLastProjection);
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
+ gGL.pushMatrix();
gGLLastMatrix = NULL;
- glLoadMatrixd(gGLLastModelView);
+ gGL.loadMatrix(gGLLastModelView);
LLVertexBuffer::unbind();
@@ -2120,10 +2284,10 @@ void LLPipeline::updateCull(LLCamera& camera, LLCullResult& result, S32 water_cl
}
- glMatrixMode(GL_PROJECTION);
- glPopMatrix();
- glMatrixMode(GL_MODELVIEW);
- glPopMatrix();
+ gGL.matrixMode(LLRender::MM_PROJECTION);
+ gGL.popMatrix();
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
+ gGL.popMatrix();
if (sUseOcclusion > 1)
{
@@ -2761,6 +2925,11 @@ void LLPipeline::stateSort(LLCamera& camera, LLCullResult &result)
{
markVisible(*i, camera);
}
+
+ if (!sDelayVBUpdate)
+ { //rebuild mesh as soon as we know it's visible
+ group->rebuildMesh();
+ }
}
}
@@ -2811,6 +2980,11 @@ void LLPipeline::stateSort(LLCamera& camera, LLCullResult &result)
{
group->setVisible();
stateSort(group, camera);
+
+ if (!sDelayVBUpdate)
+ { //rebuild mesh as soon as we know it's visible
+ group->rebuildMesh();
+ }
}
}
@@ -2826,11 +3000,7 @@ void LLPipeline::stateSort(LLCamera& camera, LLCullResult &result)
}
}
}
- {
- LLFastTimer ftm(FTM_CLIENT_COPY);
- LLVertexBuffer::clientCopy();
- }
-
+
postSort(camera);
}
@@ -2986,7 +3156,7 @@ void renderScriptedBeacons(LLDrawable* drawablep)
{
if (gPipeline.sRenderBeacons)
{
- gObjectList.addDebugBeacon(vobj->getPositionAgent(), "", LLColor4(1.f, 0.f, 0.f, 0.5f), LLColor4(1.f, 1.f, 1.f, 0.5f), gSavedSettings.getS32("DebugBeaconLineWidth"));
+ gObjectList.addDebugBeacon(vobj->getPositionAgent(), "", LLColor4(1.f, 0.f, 0.f, 0.5f), LLColor4(1.f, 1.f, 1.f, 0.5f), LLPipeline::DebugBeaconLineWidth);
}
if (gPipeline.sRenderHighlight)
@@ -3012,7 +3182,7 @@ void renderScriptedTouchBeacons(LLDrawable* drawablep)
{
if (gPipeline.sRenderBeacons)
{
- gObjectList.addDebugBeacon(vobj->getPositionAgent(), "", LLColor4(1.f, 0.f, 0.f, 0.5f), LLColor4(1.f, 1.f, 1.f, 0.5f), gSavedSettings.getS32("DebugBeaconLineWidth"));
+ gObjectList.addDebugBeacon(vobj->getPositionAgent(), "", LLColor4(1.f, 0.f, 0.f, 0.5f), LLColor4(1.f, 1.f, 1.f, 0.5f), LLPipeline::DebugBeaconLineWidth);
}
if (gPipeline.sRenderHighlight)
@@ -3037,7 +3207,7 @@ void renderPhysicalBeacons(LLDrawable* drawablep)
{
if (gPipeline.sRenderBeacons)
{
- gObjectList.addDebugBeacon(vobj->getPositionAgent(), "", LLColor4(0.f, 1.f, 0.f, 0.5f), LLColor4(1.f, 1.f, 1.f, 0.5f), gSavedSettings.getS32("DebugBeaconLineWidth"));
+ gObjectList.addDebugBeacon(vobj->getPositionAgent(), "", LLColor4(0.f, 1.f, 0.f, 0.5f), LLColor4(1.f, 1.f, 1.f, 0.5f), LLPipeline::DebugBeaconLineWidth);
}
if (gPipeline.sRenderHighlight)
@@ -3073,7 +3243,7 @@ void renderMOAPBeacons(LLDrawable* drawablep)
{
if (gPipeline.sRenderBeacons)
{
- gObjectList.addDebugBeacon(vobj->getPositionAgent(), "", LLColor4(1.f, 1.f, 1.f, 0.5f), LLColor4(1.f, 1.f, 1.f, 0.5f), gSavedSettings.getS32("DebugBeaconLineWidth"));
+ gObjectList.addDebugBeacon(vobj->getPositionAgent(), "", LLColor4(1.f, 1.f, 1.f, 0.5f), LLColor4(1.f, 1.f, 1.f, 0.5f), LLPipeline::DebugBeaconLineWidth);
}
if (gPipeline.sRenderHighlight)
@@ -3098,7 +3268,7 @@ void renderParticleBeacons(LLDrawable* drawablep)
if (gPipeline.sRenderBeacons)
{
LLColor4 light_blue(0.5f, 0.5f, 1.f, 0.5f);
- gObjectList.addDebugBeacon(vobj->getPositionAgent(), "", light_blue, LLColor4(1.f, 1.f, 1.f, 0.5f), gSavedSettings.getS32("DebugBeaconLineWidth"));
+ gObjectList.addDebugBeacon(vobj->getPositionAgent(), "", light_blue, LLColor4(1.f, 1.f, 1.f, 0.5f), LLPipeline::DebugBeaconLineWidth);
}
if (gPipeline.sRenderHighlight)
@@ -3243,19 +3413,6 @@ void LLPipeline::postSort(LLCamera& camera)
if (!sShadowRender)
{
- //sort by texture or bump map
- for (U32 i = 0; i < LLRenderPass::NUM_RENDER_TYPES; ++i)
- {
- if (i == LLRenderPass::PASS_BUMP)
- {
- std::sort(sCull->beginRenderMap(i), sCull->endRenderMap(i), LLDrawInfo::CompareBump());
- }
- else
- {
- std::sort(sCull->beginRenderMap(i), sCull->endRenderMap(i), LLDrawInfo::CompareTexturePtrMatrix());
- }
- }
-
std::sort(sCull->beginAlphaGroups(), sCull->endAlphaGroups(), LLSpatialGroup::CompareDepthGreater());
}
llpushcallstacks ;
@@ -3304,7 +3461,7 @@ void LLPipeline::postSort(LLCamera& camera)
if (gPipeline.sRenderBeacons)
{
//pos += LLVector3(0.f, 0.f, 0.2f);
- gObjectList.addDebugBeacon(pos, "", LLColor4(1.f, 1.f, 0.f, 0.5f), LLColor4(1.f, 1.f, 1.f, 0.5f), gSavedSettings.getS32("DebugBeaconLineWidth"));
+ gObjectList.addDebugBeacon(pos, "", LLColor4(1.f, 1.f, 0.f, 0.5f), LLColor4(1.f, 1.f, 1.f, 0.5f), DebugBeaconLineWidth);
}
}
// now deal with highlights for all those seeable sound sources
@@ -3369,7 +3526,7 @@ void render_hud_elements()
if (!LLPipeline::sReflectionRender && gPipeline.hasRenderDebugFeatureMask(LLPipeline::RENDER_DEBUG_FEATURE_UI))
{
- LLGLEnable multisample(gSavedSettings.getU32("RenderFSAASamples") > 0 ? GL_MULTISAMPLE_ARB : 0);
+ LLGLEnable multisample(LLPipeline::RenderFSAASamples > 0 ? GL_MULTISAMPLE_ARB : 0);
gViewerWindow->renderSelections(FALSE, FALSE, FALSE); // For HUD version in render_ui_3d()
// Draw the tracking overlays
@@ -3441,10 +3598,10 @@ void LLPipeline::renderHighlights()
//gGL.setSceneBlendType(LLRender::BT_ADD_WITH_ALPHA);
gGL.pushMatrix();
- glLoadIdentity();
- glMatrixMode(GL_PROJECTION);
+ gGL.loadIdentity();
+ gGL.matrixMode(LLRender::MM_PROJECTION);
gGL.pushMatrix();
- glLoadIdentity();
+ gGL.loadIdentity();
gGL.getTexUnit(0)->bind(&mHighlight);
@@ -3456,9 +3613,9 @@ void LLPipeline::renderHighlights()
gGL.begin(LLRender::TRIANGLES);
- F32 scale = gSavedSettings.getF32("RenderHighlightBrightness");
- LLColor4 color = gSavedSettings.getColor4("RenderHighlightColor");
- F32 thickness = gSavedSettings.getF32("RenderHighlightThickness");
+ F32 scale = RenderHighlightBrightness;
+ LLColor4 color = RenderHighlightColor;
+ F32 thickness = RenderHighlightThickness;
for (S32 pass = 0; pass < 2; ++pass)
{
@@ -3504,7 +3661,7 @@ void LLPipeline::renderHighlights()
gGL.end();
gGL.popMatrix();
- glMatrixMode(GL_MODELVIEW);
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
gGL.popMatrix();
//gGL.setSceneBlendType(LLRender::BT_ALPHA);
@@ -3513,7 +3670,7 @@ void LLPipeline::renderHighlights()
if ((LLViewerShaderMgr::instance()->getVertexShaderLevel(LLViewerShaderMgr::SHADER_INTERFACE) > 0))
{
gHighlightProgram.bind();
- gHighlightProgram.vertexAttrib4f(LLViewerShaderMgr::MATERIAL_COLOR,1,1,1,0.5f);
+ gGL.diffuseColor4f(1,1,1,0.5f);
}
if (hasRenderDebugFeatureMask(RENDER_DEBUG_FEATURE_SELECTED))
@@ -3543,10 +3700,7 @@ void LLPipeline::renderHighlights()
{
// Paint 'em red!
color.setVec(1.f, 0.f, 0.f, 0.5f);
- if ((LLViewerShaderMgr::instance()->getVertexShaderLevel(LLViewerShaderMgr::SHADER_INTERFACE) > 0))
- {
- gHighlightProgram.vertexAttrib4f(LLViewerShaderMgr::MATERIAL_COLOR,1,0,0,0.5f);
- }
+
int count = mHighlightFaces.size();
for (S32 i = 0; i < count; i++)
{
@@ -3575,8 +3729,8 @@ void LLPipeline::renderGeom(LLCamera& camera, BOOL forceVBOUpdate)
assertInitialized();
- F64 saved_modelview[16];
- F64 saved_projection[16];
+ F32 saved_modelview[16];
+ F32 saved_projection[16];
//HACK: preserve/restore matrices around HUD render
if (gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_HUD))
@@ -3588,13 +3742,6 @@ void LLPipeline::renderGeom(LLCamera& camera, BOOL forceVBOUpdate)
}
}
- S32 stack_depth = 0;
-
- if (gDebugGL)
- {
- glGetIntegerv(GL_MODELVIEW_STACK_DEPTH, &stack_depth);
- }
-
///////////////////////////////////////////
//
// Sync and verify GL state
@@ -3620,12 +3767,13 @@ void LLPipeline::renderGeom(LLCamera& camera, BOOL forceVBOUpdate)
LLAppViewer::instance()->pingMainloopTimeout("Pipeline:ForceVBO");
// Initialize lots of GL state to "safe" values
- glMatrixMode(GL_TEXTURE);
- glLoadIdentity();
- glMatrixMode(GL_MODELVIEW);
+ gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
+ gGL.matrixMode(LLRender::MM_TEXTURE);
+ gGL.loadIdentity();
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
LLGLSPipeline gls_pipeline;
- LLGLEnable multisample(gSavedSettings.getU32("RenderFSAASamples") > 0 ? GL_MULTISAMPLE_ARB : 0);
+ LLGLEnable multisample(RenderFSAASamples > 0 ? GL_MULTISAMPLE_ARB : 0);
LLGLState gls_color_material(GL_COLOR_MATERIAL, mLightingDetail < 2);
@@ -3691,7 +3839,7 @@ void LLPipeline::renderGeom(LLCamera& camera, BOOL forceVBOUpdate)
{
occlude = FALSE;
gGLLastMatrix = NULL;
- glLoadMatrixd(gGLModelView);
+ gGL.loadMatrix(gGLModelView);
LLGLSLShader::bindNoShader();
doOcclusion(camera);
}
@@ -3702,7 +3850,7 @@ void LLPipeline::renderGeom(LLCamera& camera, BOOL forceVBOUpdate)
LLFastTimer t(FTM_POOLRENDER);
gGLLastMatrix = NULL;
- glLoadMatrixd(gGLModelView);
+ gGL.loadMatrix(gGLModelView);
for( S32 i = 0; i < poolp->getNumPasses(); i++ )
{
@@ -3722,7 +3870,6 @@ void LLPipeline::renderGeom(LLCamera& camera, BOOL forceVBOUpdate)
LLVertexBuffer::unbind();
if (gDebugGL)
{
- check_stack_depth(stack_depth);
std::string msg = llformat("pass %d", i);
LLGLState::checkStates(msg);
//LLGLState::checkTextureChannels(msg);
@@ -3751,13 +3898,13 @@ void LLPipeline::renderGeom(LLCamera& camera, BOOL forceVBOUpdate)
LLVertexBuffer::unbind();
gGLLastMatrix = NULL;
- glLoadMatrixd(gGLModelView);
+ gGL.loadMatrix(gGLModelView);
if (occlude)
{
occlude = FALSE;
gGLLastMatrix = NULL;
- glLoadMatrixd(gGLModelView);
+ gGL.loadMatrix(gGLModelView);
LLGLSLShader::bindNoShader();
doOcclusion(camera);
}
@@ -3851,7 +3998,7 @@ void LLPipeline::renderGeomDeferred(LLCamera& camera)
}
}
- LLGLEnable multisample(gSavedSettings.getU32("RenderFSAASamples") > 0 ? GL_MULTISAMPLE_ARB : 0);
+ LLGLEnable multisample(RenderFSAASamples > 0 ? GL_MULTISAMPLE_ARB : 0);
LLVertexBuffer::unbind();
@@ -3877,7 +4024,7 @@ void LLPipeline::renderGeomDeferred(LLCamera& camera)
LLFastTimer t(FTM_POOLRENDER);
gGLLastMatrix = NULL;
- glLoadMatrixd(gGLModelView);
+ gGL.loadMatrix(gGLModelView);
for( S32 i = 0; i < poolp->getNumDeferredPasses(); i++ )
{
@@ -3898,12 +4045,6 @@ void LLPipeline::renderGeomDeferred(LLCamera& camera)
if (gDebugGL || gDebugPipeline)
{
- GLint depth;
- glGetIntegerv(GL_MODELVIEW_STACK_DEPTH, &depth);
- if (depth > 3)
- {
- llerrs << "GL matrix stack corrupted!" << llendl;
- }
LLGLState::checkStates();
}
}
@@ -3925,7 +4066,7 @@ void LLPipeline::renderGeomDeferred(LLCamera& camera)
}
gGLLastMatrix = NULL;
- glLoadMatrixd(gGLModelView);
+ gGL.loadMatrix(gGLModelView);
gGL.setColorMask(true, false);
}
@@ -3938,7 +4079,7 @@ void LLPipeline::renderGeomPostDeferred(LLCamera& camera)
LLGLEnable cull(GL_CULL_FACE);
- LLGLEnable multisample(gSavedSettings.getU32("RenderFSAASamples") > 0 ? GL_MULTISAMPLE_ARB : 0);
+ LLGLEnable multisample(RenderFSAASamples > 0 ? GL_MULTISAMPLE_ARB : 0);
calcNearbyLights(camera);
setupHWLights(NULL);
@@ -3958,7 +4099,7 @@ void LLPipeline::renderGeomPostDeferred(LLCamera& camera)
{
occlude = FALSE;
gGLLastMatrix = NULL;
- glLoadMatrixd(gGLModelView);
+ gGL.loadMatrix(gGLModelView);
LLGLSLShader::bindNoShader();
doOcclusion(camera);
gGL.setColorMask(true, false);
@@ -3970,7 +4111,7 @@ void LLPipeline::renderGeomPostDeferred(LLCamera& camera)
LLFastTimer t(FTM_POOLRENDER);
gGLLastMatrix = NULL;
- glLoadMatrixd(gGLModelView);
+ gGL.loadMatrix(gGLModelView);
for( S32 i = 0; i < poolp->getNumPostDeferredPasses(); i++ )
{
@@ -3991,12 +4132,6 @@ void LLPipeline::renderGeomPostDeferred(LLCamera& camera)
if (gDebugGL || gDebugPipeline)
{
- GLint depth;
- glGetIntegerv(GL_MODELVIEW_STACK_DEPTH, &depth);
- if (depth > 3)
- {
- llerrs << "GL matrix stack corrupted!" << llendl;
- }
LLGLState::checkStates();
}
}
@@ -4018,17 +4153,17 @@ void LLPipeline::renderGeomPostDeferred(LLCamera& camera)
}
gGLLastMatrix = NULL;
- glLoadMatrixd(gGLModelView);
+ gGL.loadMatrix(gGLModelView);
if (occlude)
{
occlude = FALSE;
gGLLastMatrix = NULL;
- glLoadMatrixd(gGLModelView);
+ gGL.loadMatrix(gGLModelView);
LLGLSLShader::bindNoShader();
doOcclusion(camera);
gGLLastMatrix = NULL;
- glLoadMatrixd(gGLModelView);
+ gGL.loadMatrix(gGLModelView);
}
}
@@ -4052,8 +4187,10 @@ void LLPipeline::renderGeomShadow(LLCamera& camera)
pool_set_t::iterator iter2 = iter1;
if (hasRenderType(poolp->getType()) && poolp->getNumShadowPasses() > 0)
{
+ poolp->prerender() ;
+
gGLLastMatrix = NULL;
- glLoadMatrixd(gGLModelView);
+ gGL.loadMatrix(gGLModelView);
for( S32 i = 0; i < poolp->getNumShadowPasses(); i++ )
{
@@ -4092,7 +4229,7 @@ void LLPipeline::renderGeomShadow(LLCamera& camera)
}
gGLLastMatrix = NULL;
- glLoadMatrixd(gGLModelView);
+ gGL.loadMatrix(gGLModelView);
}
@@ -4139,6 +4276,11 @@ void LLPipeline::renderPhysicsDisplay()
gGL.setColorMask(true, false);
+ if (LLGLSLShader::sNoFixedFunction)
+ {
+ gDebugProgram.bind();
+ }
+
for (LLWorld::region_list_t::const_iterator iter = LLWorld::getInstance()->getRegionList().begin();
iter != LLWorld::getInstance()->getRegionList().end(); ++iter)
{
@@ -4161,15 +4303,20 @@ void LLPipeline::renderPhysicsDisplay()
LLSpatialBridge* bridge = *i;
if (!bridge->isDead() && hasRenderType(bridge->mDrawableType))
{
- glPushMatrix();
- glMultMatrixf((F32*)bridge->mDrawable->getRenderMatrix().mMatrix);
+ gGL.pushMatrix();
+ gGL.multMatrix((F32*)bridge->mDrawable->getRenderMatrix().mMatrix);
bridge->renderPhysicsShapes();
- glPopMatrix();
+ gGL.popMatrix();
}
}
-
gGL.flush();
+
+ if (LLGLSLShader::sNoFixedFunction)
+ {
+ gDebugProgram.unbind();
+ }
+
mPhysicsDisplay.flush();
}
@@ -4183,13 +4330,21 @@ void LLPipeline::renderDebug()
gGL.color4f(1,1,1,1);
gGLLastMatrix = NULL;
- glLoadMatrixd(gGLModelView);
+ gGL.loadMatrix(gGLModelView);
gGL.setColorMask(true, false);
bool hud_only = hasRenderType(LLPipeline::RENDER_TYPE_HUD);
+
if (!hud_only && !mDebugBlips.empty())
{ //render debug blips
+ if (LLGLSLShader::sNoFixedFunction)
+ {
+ gUIProgram.bind();
+ }
+
+ gGL.getTexUnit(0)->bind(LLViewerFetchedTexture::sWhiteImagep, true);
+
glPointSize(8.f);
LLGLDepthTest depth(GL_TRUE, GL_TRUE, GL_ALWAYS);
@@ -4243,13 +4398,18 @@ void LLPipeline::renderDebug()
LLSpatialBridge* bridge = *i;
if (!bridge->isDead() && hasRenderType(bridge->mDrawableType))
{
- glPushMatrix();
- glMultMatrixf((F32*)bridge->mDrawable->getRenderMatrix().mMatrix);
+ gGL.pushMatrix();
+ gGL.multMatrix((F32*)bridge->mDrawable->getRenderMatrix().mMatrix);
bridge->renderDebug();
- glPopMatrix();
+ gGL.popMatrix();
}
}
+ if (LLGLSLShader::sNoFixedFunction)
+ {
+ gUIProgram.bind();
+ }
+
if (hasRenderDebugMask(LLPipeline::RENDER_DEBUG_SHADOW_FRUSTA))
{
LLVertexBuffer::unbind();
@@ -4383,6 +4543,11 @@ void LLPipeline::renderDebug()
}
}
+ if (mRenderDebugMask & RENDER_DEBUG_WIND_VECTORS)
+ {
+ gAgent.getRegion()->mWind.renderVectors();
+ }
+
if (mRenderDebugMask & RENDER_DEBUG_COMPOSITION)
{
// Debug composition layers
@@ -4429,7 +4594,7 @@ void LLPipeline::renderDebug()
gGL.getTexUnit(0)->bind(LLViewerFetchedTexture::sWhiteImagep);
gGL.pushMatrix();
- glLoadMatrixd(gGLModelView);
+ gGL.loadMatrix(gGLModelView);
gGLLastMatrix = NULL;
for (LLSpatialGroup::sg_vector_t::iterator iter = mGroupQ2.begin(); iter != mGroupQ2.end(); ++iter)
@@ -4450,7 +4615,7 @@ void LLPipeline::renderDebug()
if (bridge)
{
gGL.pushMatrix();
- glMultMatrixf((F32*)bridge->mDrawable->getRenderMatrix().mMatrix);
+ gGL.multMatrix((F32*)bridge->mDrawable->getRenderMatrix().mMatrix);
}
F32 alpha = llclamp((F32) (size-count)/size, 0.f, 1.f);
@@ -4474,8 +4639,10 @@ void LLPipeline::renderDebug()
}
gGL.flush();
-
- gPipeline.renderPhysicsDisplay();
+ if (LLGLSLShader::sNoFixedFunction)
+ {
+ gUIProgram.unbind();
+ }
}
void LLPipeline::rebuildPools()
@@ -5024,10 +5191,14 @@ void LLPipeline::calcNearbyLights(LLCamera& camera)
void LLPipeline::setupHWLights(LLDrawPool* pool)
{
assertInitialized();
-
+
// Ambient
- LLColor4 ambient = gSky.getTotalAmbientColor();
- glLightModelfv(GL_LIGHT_MODEL_AMBIENT,ambient.mV);
+ if (!LLGLSLShader::sNoFixedFunction)
+ {
+ gGL.syncMatrices();
+ LLColor4 ambient = gSky.getTotalAmbientColor();
+ gGL.setAmbientLightColor(ambient);
+ }
// Light 0 = Sun or Moon (All objects)
{
@@ -5128,7 +5299,8 @@ void LLPipeline::setupHWLights(LLDrawPool* pool)
light_state->setConstantAttenuation(0.f);
if (sRenderDeferred)
{
- light_state->setLinearAttenuation(light_radius*1.5f);
+ F32 size = light_radius*1.5f;
+ light_state->setLinearAttenuation(size*size);
light_state->setQuadraticAttenuation(light->getLightFalloff()*0.5f+1.f);
}
else
@@ -5137,8 +5309,9 @@ void LLPipeline::setupHWLights(LLDrawPool* pool)
light_state->setQuadraticAttenuation(0.f);
}
+
if (light->isLightSpotlight() // directional (spot-)light
- && (LLPipeline::sRenderDeferred || gSavedSettings.getBOOL("RenderSpotLightsInNondeferred"))) // these are only rendered as GL spotlights if we're in deferred rendering mode *or* the setting forces them on
+ && (LLPipeline::sRenderDeferred || RenderSpotLightsInNondeferred)) // these are only rendered as GL spotlights if we're in deferred rendering mode *or* the setting forces them on
{
LLVector3 spotparams = light->getSpotLightParams();
LLQuaternion quat = light->getRenderRotation();
@@ -5149,7 +5322,8 @@ void LLPipeline::setupHWLights(LLDrawPool* pool)
light_state->setSpotCutoff(90.f);
light_state->setSpotExponent(2.f);
- light_state->setSpecular(LLColor4::black);
+ const LLColor4 specular(0.f, 0.f, 0.f, 0.f);
+ light_state->setSpecular(specular);
}
else // omnidirectional (point) light
{
@@ -5205,7 +5379,11 @@ void LLPipeline::setupHWLights(LLDrawPool* pool)
}
// Init GL state
- glDisable(GL_LIGHTING);
+ if (!LLGLSLShader::sNoFixedFunction)
+ {
+ glDisable(GL_LIGHTING);
+ }
+
for (S32 i = 0; i < 8; ++i)
{
gGL.getLight(i)->disable();
@@ -5226,7 +5404,10 @@ void LLPipeline::enableLights(U32 mask)
stop_glerror();
if (!mLightMask)
{
- glEnable(GL_LIGHTING);
+ if (!LLGLSLShader::sNoFixedFunction)
+ {
+ glEnable(GL_LIGHTING);
+ }
}
if (mask)
{
@@ -5249,13 +5430,16 @@ void LLPipeline::enableLights(U32 mask)
}
else
{
- glDisable(GL_LIGHTING);
+ if (!LLGLSLShader::sNoFixedFunction)
+ {
+ glDisable(GL_LIGHTING);
+ }
}
- stop_glerror();
mLightMask = mask;
- LLColor4 ambient = gSky.getTotalAmbientColor();
- glLightModelfv(GL_LIGHT_MODEL_AMBIENT,ambient.mV);
stop_glerror();
+
+ LLColor4 ambient = gSky.getTotalAmbientColor();
+ gGL.setAmbientLightColor(ambient);
}
}
@@ -5304,21 +5488,24 @@ void LLPipeline::enableLightsPreview()
{
disableLights();
- glEnable(GL_LIGHTING);
- LLColor4 ambient = gSavedSettings.getColor4("PreviewAmbientColor");
- glLightModelfv(GL_LIGHT_MODEL_AMBIENT,ambient.mV);
+ if (!LLGLSLShader::sNoFixedFunction)
+ {
+ glEnable(GL_LIGHTING);
+ }
+ LLColor4 ambient = PreviewAmbientColor;
+ gGL.setAmbientLightColor(ambient);
- LLColor4 diffuse0 = gSavedSettings.getColor4("PreviewDiffuse0");
- LLColor4 specular0 = gSavedSettings.getColor4("PreviewSpecular0");
- LLColor4 diffuse1 = gSavedSettings.getColor4("PreviewDiffuse1");
- LLColor4 specular1 = gSavedSettings.getColor4("PreviewSpecular1");
- LLColor4 diffuse2 = gSavedSettings.getColor4("PreviewDiffuse2");
- LLColor4 specular2 = gSavedSettings.getColor4("PreviewSpecular2");
+ LLColor4 diffuse0 = PreviewDiffuse0;
+ LLColor4 specular0 = PreviewSpecular0;
+ LLColor4 diffuse1 = PreviewDiffuse1;
+ LLColor4 specular1 = PreviewSpecular1;
+ LLColor4 diffuse2 = PreviewDiffuse2;
+ LLColor4 specular2 = PreviewSpecular2;
- LLVector3 dir0 = gSavedSettings.getVector3("PreviewDirection0");
- LLVector3 dir1 = gSavedSettings.getVector3("PreviewDirection1");
- LLVector3 dir2 = gSavedSettings.getVector3("PreviewDirection2");
+ LLVector3 dir0 = PreviewDirection0;
+ LLVector3 dir1 = PreviewDirection1;
+ LLVector3 dir2 = PreviewDirection2;
dir0.normVec();
dir1.normVec();
@@ -5365,7 +5552,7 @@ void LLPipeline::enableLightsAvatarEdit(const LLColor4& color)
setupAvatarLights(TRUE);
enableLights(mask);
- glLightModelfv(GL_LIGHT_MODEL_AMBIENT,color.mV);
+ gGL.setAmbientLightColor(color);
}
void LLPipeline::enableLightsFullbright(const LLColor4& color)
@@ -5374,7 +5561,7 @@ void LLPipeline::enableLightsFullbright(const LLColor4& color)
U32 mask = 0x1000; // Non-0 mask, set ambient
enableLights(mask);
- glLightModelfv(GL_LIGHT_MODEL_AMBIENT,color.mV);
+ gGL.setAmbientLightColor(color);
}
void LLPipeline::disableLights()
@@ -6030,11 +6217,8 @@ void LLPipeline::resetVertexBuffers()
gSky.resetVertexBuffers();
- if (LLVertexBuffer::sGLCount > 0)
- {
- LLVertexBuffer::cleanupClass();
- }
-
+ LLVertexBuffer::cleanupClass();
+
//delete all name pool caches
LLGLNamePool::cleanupPools();
@@ -6043,35 +6227,32 @@ void LLPipeline::resetVertexBuffers()
llwarns << "VBO wipe failed." << llendl;
}
- if (!LLVertexBuffer::sStreamIBOPool.mNameList.empty() ||
- !LLVertexBuffer::sStreamVBOPool.mNameList.empty() ||
- !LLVertexBuffer::sDynamicIBOPool.mNameList.empty() ||
- !LLVertexBuffer::sDynamicVBOPool.mNameList.empty())
- {
- llwarns << "VBO name pool cleanup failed." << llendl;
- }
+ llassert(LLVertexBuffer::sGLCount == 0);
LLVertexBuffer::unbind();
sRenderBump = gSavedSettings.getBOOL("RenderObjectBump");
sUseTriStrips = gSavedSettings.getBOOL("RenderUseTriStrips");
LLVertexBuffer::sUseStreamDraw = gSavedSettings.getBOOL("RenderUseStreamVBO");
+ LLVertexBuffer::sUseVAO = gSavedSettings.getBOOL("RenderUseVAO");
LLVertexBuffer::sPreferStreamDraw = gSavedSettings.getBOOL("RenderPreferStreamDraw");
LLVertexBuffer::sEnableVBOs = gSavedSettings.getBOOL("RenderVBOEnable");
LLVertexBuffer::sDisableVBOMapping = LLVertexBuffer::sEnableVBOs && gSavedSettings.getBOOL("RenderVBOMappingDisable") ;
sBakeSunlight = gSavedSettings.getBOOL("RenderBakeSunlight");
sNoAlpha = gSavedSettings.getBOOL("RenderNoAlpha");
LLPipeline::sTextureBindTest = gSavedSettings.getBOOL("RenderDebugTextureBind");
+
+ LLVertexBuffer::initClass(LLVertexBuffer::sEnableVBOs, LLVertexBuffer::sDisableVBOMapping);
}
-void LLPipeline::renderObjects(U32 type, U32 mask, BOOL texture)
+void LLPipeline::renderObjects(U32 type, U32 mask, BOOL texture, BOOL batch_texture)
{
LLMemType mt_ro(LLMemType::MTYPE_PIPELINE_RENDER_OBJECTS);
assertInitialized();
- glLoadMatrixd(gGLModelView);
+ gGL.loadMatrix(gGLModelView);
gGLLastMatrix = NULL;
- mSimplePool->pushBatches(type, mask);
- glLoadMatrixd(gGLModelView);
+ mSimplePool->pushBatches(type, mask, texture, batch_texture);
+ gGL.loadMatrix(gGLModelView);
gGLLastMatrix = NULL;
}
@@ -6080,25 +6261,25 @@ void apply_cube_face_rotation(U32 face)
switch (face)
{
case 0:
- glRotatef(90.f, 0, 1, 0);
- glRotatef(180.f, 1, 0, 0);
+ gGL.rotatef(90.f, 0, 1, 0);
+ gGL.rotatef(180.f, 1, 0, 0);
break;
case 2:
- glRotatef(-90.f, 1, 0, 0);
+ gGL.rotatef(-90.f, 1, 0, 0);
break;
case 4:
- glRotatef(180.f, 0, 1, 0);
- glRotatef(180.f, 0, 0, 1);
+ gGL.rotatef(180.f, 0, 1, 0);
+ gGL.rotatef(180.f, 0, 0, 1);
break;
case 1:
- glRotatef(-90.f, 0, 1, 0);
- glRotatef(180.f, 1, 0, 0);
+ gGL.rotatef(-90.f, 0, 1, 0);
+ gGL.rotatef(180.f, 1, 0, 0);
break;
case 3:
- glRotatef(90, 1, 0, 0);
+ gGL.rotatef(90, 1, 0, 0);
break;
case 5:
- glRotatef(180, 0, 0, 1);
+ gGL.rotatef(180, 0, 0, 1);
break;
}
}
@@ -6141,8 +6322,7 @@ void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield)
{
LLMemType mt_ru(LLMemType::MTYPE_PIPELINE_RENDER_BLOOM);
if (!(gPipeline.canUseVertexShaders() &&
- sRenderGlow) ||
- (!sRenderDeferred && hasRenderDebugMask(LLPipeline::RENDER_DEBUG_PHYSICS_SHAPES)))
+ sRenderGlow))
{
return;
}
@@ -6158,16 +6338,9 @@ void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield)
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
}
- U32 res_mod = gSavedSettings.getU32("RenderResolutionDivisor");
-
LLVector2 tc1(0,0);
- LLVector2 tc2((F32) gViewerWindow->getWorldViewWidthRaw()*2,
- (F32) gViewerWindow->getWorldViewHeightRaw()*2);
-
- if (res_mod > 1)
- {
- tc2 /= (F32) res_mod;
- }
+ LLVector2 tc2((F32) mScreen.getWidth()*2,
+ (F32) mScreen.getHeight()*2);
LLFastTimer ftm(FTM_RENDER_BLOOM);
gGL.color4f(1,1,1,1);
@@ -6177,12 +6350,12 @@ void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield)
enableLightsFullbright(LLColor4(1,1,1,1));
- glMatrixMode(GL_PROJECTION);
- glPushMatrix();
- glLoadIdentity();
- glMatrixMode(GL_MODELVIEW);
- glPushMatrix();
- glLoadIdentity();
+ gGL.matrixMode(LLRender::MM_PROJECTION);
+ gGL.pushMatrix();
+ gGL.loadIdentity();
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
+ gGL.pushMatrix();
+ gGL.loadIdentity();
LLGLDisable test(GL_ALPHA_TEST);
@@ -6197,16 +6370,18 @@ void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield)
}
gGlowExtractProgram.bind();
- F32 minLum = llmax(gSavedSettings.getF32("RenderGlowMinLuminance"), 0.0f);
- F32 maxAlpha = gSavedSettings.getF32("RenderGlowMaxExtractAlpha");
- F32 warmthAmount = gSavedSettings.getF32("RenderGlowWarmthAmount");
- LLVector3 lumWeights = gSavedSettings.getVector3("RenderGlowLumWeights");
- LLVector3 warmthWeights = gSavedSettings.getVector3("RenderGlowWarmthWeights");
- gGlowExtractProgram.uniform1f("minLuminance", minLum);
- gGlowExtractProgram.uniform1f("maxExtractAlpha", maxAlpha);
- gGlowExtractProgram.uniform3f("lumWeights", lumWeights.mV[0], lumWeights.mV[1], lumWeights.mV[2]);
- gGlowExtractProgram.uniform3f("warmthWeights", warmthWeights.mV[0], warmthWeights.mV[1], warmthWeights.mV[2]);
- gGlowExtractProgram.uniform1f("warmthAmount", warmthAmount);
+ F32 minLum = llmax((F32) RenderGlowMinLuminance, 0.0f);
+ F32 maxAlpha = RenderGlowMaxExtractAlpha;
+ F32 warmthAmount = RenderGlowWarmthAmount;
+ LLVector3 lumWeights = RenderGlowLumWeights;
+ LLVector3 warmthWeights = RenderGlowWarmthWeights;
+
+
+ gGlowExtractProgram.uniform1f(LLShaderMgr::GLOW_MIN_LUMINANCE, minLum);
+ gGlowExtractProgram.uniform1f(LLShaderMgr::GLOW_MAX_EXTRACT_ALPHA, maxAlpha);
+ gGlowExtractProgram.uniform3f(LLShaderMgr::GLOW_LUM_WEIGHTS, lumWeights.mV[0], lumWeights.mV[1], lumWeights.mV[2]);
+ gGlowExtractProgram.uniform3f(LLShaderMgr::GLOW_WARMTH_WEIGHTS, warmthWeights.mV[0], warmthWeights.mV[1], warmthWeights.mV[2]);
+ gGlowExtractProgram.uniform1f(LLShaderMgr::GLOW_WARMTH_AMOUNT, warmthAmount);
LLGLEnable blend_on(GL_BLEND);
LLGLEnable test(GL_ALPHA_TEST);
@@ -6237,22 +6412,22 @@ void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield)
tc2.setVec(2,2);
// power of two between 1 and 1024
- U32 glowResPow = gSavedSettings.getS32("RenderGlowResolutionPow");
+ U32 glowResPow = RenderGlowResolutionPow;
const U32 glow_res = llmax(1,
llmin(1024, 1 << glowResPow));
- S32 kernel = gSavedSettings.getS32("RenderGlowIterations")*2;
- F32 delta = gSavedSettings.getF32("RenderGlowWidth") / glow_res;
+ S32 kernel = RenderGlowIterations*2;
+ F32 delta = RenderGlowWidth / glow_res;
// Use half the glow width if we have the res set to less than 9 so that it looks
// almost the same in either case.
if (glowResPow < 9)
{
delta *= 0.5f;
}
- F32 strength = gSavedSettings.getF32("RenderGlowStrength");
+ F32 strength = RenderGlowStrength;
gGlowProgram.bind();
- gGlowProgram.uniform1f("glowStrength", strength);
+ gGlowProgram.uniform1f(LLShaderMgr::GLOW_STRENGTH, strength);
for (S32 i = 0; i < kernel; i++)
{
@@ -6273,11 +6448,11 @@ void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield)
if (i%2 == 0)
{
- gGlowProgram.uniform2f("glowDelta", delta, 0);
+ gGlowProgram.uniform2f(LLShaderMgr::GLOW_DELTA, delta, 0);
}
else
{
- gGlowProgram.uniform2f("glowDelta", 0, delta);
+ gGlowProgram.uniform2f(LLShaderMgr::GLOW_DELTA, 0, delta);
}
gGL.begin(LLRender::TRIANGLE_STRIP);
@@ -6309,8 +6484,8 @@ void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield)
gGLViewport[3] = gViewerWindow->getWorldViewRectRaw().getHeight();
glViewport(gGLViewport[0], gGLViewport[1], gGLViewport[2], gGLViewport[3]);
- tc2.setVec((F32) gViewerWindow->getWorldViewWidthRaw(),
- (F32) gViewerWindow->getWorldViewHeightRaw());
+ tc2.setVec((F32) mScreen.getWidth(),
+ (F32) mScreen.getHeight());
gGL.flush();
@@ -6318,28 +6493,22 @@ void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield)
if (LLPipeline::sRenderDeferred)
{
- bool dof_enabled = !LLViewerCamera::getInstance()->cameraUnderWater();
- LLGLSLShader* shader = &gDeferredPostProgram;
- if (LLViewerShaderMgr::instance()->getVertexShaderLevel(LLViewerShaderMgr::SHADER_DEFERRED) > 2)
- {
- shader = &gDeferredGIFinalProgram;
- dof_enabled = false;
- }
- else if (!dof_enabled || LLToolMgr::getInstance()->inBuildMode() || !gSavedSettings.getBOOL("RenderDepthOfField"))
- { //squish focal length when in build mode (or if DoF is disabled) so DoF doesn't make editing objects difficult
- shader = &gDeferredPostNoDoFProgram;
- dof_enabled = false;
- }
-
-
- LLGLDisable blend(GL_BLEND);
- bindDeferredShader(*shader);
+ bool dof_enabled = !LLViewerCamera::getInstance()->cameraUnderWater() &&
+ !LLToolMgr::getInstance()->inBuildMode() &&
+ RenderDepthOfField;
+
+
+ bool multisample = RenderFSAASamples > 1 && mFXAABuffer.isComplete();
+ gViewerWindow->setup3DViewport();
+
if (dof_enabled)
{
- //depth of field focal plane calculations
+ LLGLSLShader* shader = &gDeferredPostProgram;
+ LLGLDisable blend(GL_BLEND);
+ //depth of field focal plane calculations
static F32 current_distance = 16.f;
static F32 start_distance = 16.f;
static F32 transition_time = 1.f;
@@ -6369,8 +6538,8 @@ void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield)
else if (gAgentCamera.cameraMouselook())
{ //focus on point under mouselook crosshairs
gViewerWindow->cursorIntersect(-1, -1, 512.f, NULL, -1, FALSE,
- NULL,
- &focus_point);
+ NULL,
+ &focus_point);
}
else
{
@@ -6401,7 +6570,7 @@ void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield)
}
else if (transition_time < 1.f)
{ //currently in a transition, continue interpolating
- transition_time += 1.f/gSavedSettings.getF32("CameraFocusTransitionTime")*gFrameIntervalSeconds;
+ transition_time += 1.f/CameraFocusTransitionTime*gFrameIntervalSeconds;
transition_time = llmin(transition_time, 1.f);
F32 t = cosf(transition_time*F_PI+F_PI)*0.5f+0.5f;
@@ -6414,12 +6583,12 @@ void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield)
//convert to mm
F32 subject_distance = current_distance*1000.f;
- F32 fnumber = gSavedSettings.getF32("CameraFNumber");
- F32 default_focal_length = gSavedSettings.getF32("CameraFocalLength");
+ F32 fnumber = CameraFNumber;
+ F32 default_focal_length = CameraFocalLength;
F32 fov = LLViewerCamera::getInstance()->getView();
- const F32 default_fov = gSavedSettings.getF32("CameraFieldOfView") * F_PI/180.f;
+ const F32 default_fov = CameraFieldOfView * F_PI/180.f;
//const F32 default_aspect_ratio = gSavedSettings.getF32("CameraAspectRatio");
//F32 aspect_ratio = (F32) mScreen.getWidth()/(F32)mScreen.getHeight();
@@ -6442,44 +6611,226 @@ void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield)
blur_constant /= 1000.f; //convert to meters for shader
F32 magnification = focal_length/(subject_distance-focal_length);
- shader->uniform1f("focal_distance", -subject_distance/1000.f);
- shader->uniform1f("blur_constant", blur_constant);
- shader->uniform1f("tan_pixel_angle", tanf(1.f/LLDrawable::sCurPixelAngle));
- shader->uniform1f("magnification", magnification);
- }
+ { //build diffuse+bloom+CoF
+ mDeferredLight.bindTarget();
+ shader = &gDeferredCoFProgram;
- S32 channel = shader->enableTexture(LLViewerShaderMgr::DEFERRED_DIFFUSE, mScreen.getUsage());
- if (channel > -1)
- {
- mScreen.bindTexture(0, channel);
+ bindDeferredShader(*shader);
+
+ S32 channel = shader->enableTexture(LLShaderMgr::DEFERRED_DIFFUSE, mScreen.getUsage());
+ if (channel > -1)
+ {
+ mScreen.bindTexture(0, channel);
+ }
+
+ shader->uniform1f(LLShaderMgr::DOF_FOCAL_DISTANCE, -subject_distance/1000.f);
+ shader->uniform1f(LLShaderMgr::DOF_BLUR_CONSTANT, blur_constant);
+ shader->uniform1f(LLShaderMgr::DOF_TAN_PIXEL_ANGLE, tanf(1.f/LLDrawable::sCurPixelAngle));
+ shader->uniform1f(LLShaderMgr::DOF_MAGNIFICATION, magnification);
+ shader->uniform1f(LLShaderMgr::DOF_MAX_COF, CameraMaxCoF);
+ shader->uniform1f(LLShaderMgr::DOF_RES_SCALE, CameraDoFResScale);
+
+ gGL.begin(LLRender::TRIANGLE_STRIP);
+ gGL.texCoord2f(tc1.mV[0], tc1.mV[1]);
+ gGL.vertex2f(-1,-1);
+
+ gGL.texCoord2f(tc1.mV[0], tc2.mV[1]);
+ gGL.vertex2f(-1,3);
+
+ gGL.texCoord2f(tc2.mV[0], tc1.mV[1]);
+ gGL.vertex2f(3,-1);
+
+ gGL.end();
+
+ unbindDeferredShader(*shader);
+ mDeferredLight.flush();
+ }
+
+ { //perform DoF sampling at half-res (preserve alpha channel)
+ mScreen.bindTarget();
+ glViewport(0,0,(GLsizei) (mScreen.getWidth()*CameraDoFResScale), (GLsizei) (mScreen.getHeight()*CameraDoFResScale));
+ gGL.setColorMask(true, false);
+
+ shader = &gDeferredPostProgram;
+ bindDeferredShader(*shader);
+ S32 channel = shader->enableTexture(LLShaderMgr::DEFERRED_DIFFUSE, mDeferredLight.getUsage());
+ if (channel > -1)
+ {
+ mDeferredLight.bindTexture(0, channel);
+ }
+
+ shader->uniform1f(LLShaderMgr::DOF_MAX_COF, CameraMaxCoF);
+ shader->uniform1f(LLShaderMgr::DOF_RES_SCALE, CameraDoFResScale);
+
+ gGL.begin(LLRender::TRIANGLE_STRIP);
+ gGL.texCoord2f(tc1.mV[0], tc1.mV[1]);
+ gGL.vertex2f(-1,-1);
+
+ gGL.texCoord2f(tc1.mV[0], tc2.mV[1]);
+ gGL.vertex2f(-1,3);
+
+ gGL.texCoord2f(tc2.mV[0], tc1.mV[1]);
+ gGL.vertex2f(3,-1);
+
+ gGL.end();
+
+ unbindDeferredShader(*shader);
+ mScreen.flush();
+ gGL.setColorMask(true, true);
+ }
+
+ { //combine result based on alpha
+ if (multisample)
+ {
+ mDeferredLight.bindTarget();
+ glViewport(0, 0, mDeferredScreen.getWidth(), mDeferredScreen.getHeight());
+ }
+ else
+ {
+ gGLViewport[0] = gViewerWindow->getWorldViewRectRaw().mLeft;
+ gGLViewport[1] = gViewerWindow->getWorldViewRectRaw().mBottom;
+ gGLViewport[2] = gViewerWindow->getWorldViewRectRaw().getWidth();
+ gGLViewport[3] = gViewerWindow->getWorldViewRectRaw().getHeight();
+ glViewport(gGLViewport[0], gGLViewport[1], gGLViewport[2], gGLViewport[3]);
+ }
+
+ shader = &gDeferredDoFCombineProgram;
+ bindDeferredShader(*shader);
+
+ S32 channel = shader->enableTexture(LLShaderMgr::DEFERRED_DIFFUSE, mScreen.getUsage());
+ if (channel > -1)
+ {
+ mScreen.bindTexture(0, channel);
+ gGL.getTexUnit(channel)->setTextureFilteringOption(LLTexUnit::TFO_BILINEAR);
+ }
+
+ shader->uniform1f(LLShaderMgr::DOF_MAX_COF, CameraMaxCoF);
+ shader->uniform1f(LLShaderMgr::DOF_RES_SCALE, CameraDoFResScale);
+
+ gGL.begin(LLRender::TRIANGLE_STRIP);
+ gGL.texCoord2f(tc1.mV[0], tc1.mV[1]);
+ gGL.vertex2f(-1,-1);
+
+ gGL.texCoord2f(tc1.mV[0], tc2.mV[1]);
+ gGL.vertex2f(-1,3);
+
+ gGL.texCoord2f(tc2.mV[0], tc1.mV[1]);
+ gGL.vertex2f(3,-1);
+
+ gGL.end();
+
+ unbindDeferredShader(*shader);
+
+ if (multisample)
+ {
+ mDeferredLight.flush();
+ }
+ }
}
- //channel = shader->enableTexture(LLViewerShaderMgr::DEFERRED_DEPTH, LLTexUnit::TT_RECT_TEXTURE);
- //if (channel > -1)
- //{
- //gGL.getTexUnit(channel)->setTextureFilteringOption(LLTexUnit::TFO_BILINEAR);
- //}
+ else
+ {
+ if (multisample)
+ {
+ mDeferredLight.bindTarget();
+ }
+ LLGLSLShader* shader = &gDeferredPostNoDoFProgram;
+
+ bindDeferredShader(*shader);
+
+ S32 channel = shader->enableTexture(LLShaderMgr::DEFERRED_DIFFUSE, mScreen.getUsage());
+ if (channel > -1)
+ {
+ mScreen.bindTexture(0, channel);
+ }
- gGL.begin(LLRender::TRIANGLE_STRIP);
- gGL.texCoord2f(tc1.mV[0], tc1.mV[1]);
- gGL.vertex2f(-1,-1);
+ gGL.begin(LLRender::TRIANGLE_STRIP);
+ gGL.texCoord2f(tc1.mV[0], tc1.mV[1]);
+ gGL.vertex2f(-1,-1);
- gGL.texCoord2f(tc1.mV[0], tc2.mV[1]);
- gGL.vertex2f(-1,3);
+ gGL.texCoord2f(tc1.mV[0], tc2.mV[1]);
+ gGL.vertex2f(-1,3);
- gGL.texCoord2f(tc2.mV[0], tc1.mV[1]);
- gGL.vertex2f(3,-1);
+ gGL.texCoord2f(tc2.mV[0], tc1.mV[1]);
+ gGL.vertex2f(3,-1);
- gGL.end();
+ gGL.end();
+
+ unbindDeferredShader(*shader);
+
+ if (multisample)
+ {
+ mDeferredLight.flush();
+ }
+ }
+
+ if (multisample)
+ {
+ //bake out texture2D with RGBL for FXAA shader
+ mFXAABuffer.bindTarget();
+
+ S32 width = mScreen.getWidth();
+ S32 height = mScreen.getHeight();
+ glViewport(0, 0, width, height);
+
+ LLGLSLShader* shader = &gGlowCombineFXAAProgram;
+
+ shader->bind();
+ shader->uniform2f(LLShaderMgr::DEFERRED_SCREEN_RES, width, height);
- unbindDeferredShader(*shader);
+ S32 channel = shader->enableTexture(LLShaderMgr::DEFERRED_DIFFUSE, mDeferredLight.getUsage());
+ if (channel > -1)
+ {
+ mDeferredLight.bindTexture(0, channel);
+ }
+
+ gGL.begin(LLRender::TRIANGLE_STRIP);
+ gGL.vertex2f(-1,-1);
+ gGL.vertex2f(-1,3);
+ gGL.vertex2f(3,-1);
+ gGL.end();
+
+ gGL.flush();
+
+ shader->disableTexture(LLShaderMgr::DEFERRED_DIFFUSE, mDeferredLight.getUsage());
+ shader->unbind();
+
+ mFXAABuffer.flush();
+
+ shader = &gFXAAProgram;
+ shader->bind();
+
+ channel = shader->enableTexture(LLShaderMgr::DIFFUSE_MAP, mFXAABuffer.getUsage());
+ if (channel > -1)
+ {
+ mFXAABuffer.bindTexture(0, channel);
+ gGL.getTexUnit(channel)->setTextureFilteringOption(LLTexUnit::TFO_BILINEAR);
+ }
+
+ gGLViewport[0] = gViewerWindow->getWorldViewRectRaw().mLeft;
+ gGLViewport[1] = gViewerWindow->getWorldViewRectRaw().mBottom;
+ gGLViewport[2] = gViewerWindow->getWorldViewRectRaw().getWidth();
+ gGLViewport[3] = gViewerWindow->getWorldViewRectRaw().getHeight();
+ glViewport(gGLViewport[0], gGLViewport[1], gGLViewport[2], gGLViewport[3]);
+
+ F32 scale_x = (F32) width/mFXAABuffer.getWidth();
+ F32 scale_y = (F32) height/mFXAABuffer.getHeight();
+ shader->uniform2f(LLShaderMgr::FXAA_TC_SCALE, scale_x, scale_y);
+ shader->uniform2f(LLShaderMgr::FXAA_RCP_SCREEN_RES, 1.f/width*scale_x, 1.f/height*scale_y);
+ shader->uniform4f(LLShaderMgr::FXAA_RCP_FRAME_OPT, -0.5f/width*scale_x, -0.5f/height*scale_y, 0.5f/width*scale_x, 0.5f/height*scale_y);
+ shader->uniform4f(LLShaderMgr::FXAA_RCP_FRAME_OPT2, -2.f/width*scale_x, -2.f/height*scale_y, 2.f/width*scale_x, 2.f/height*scale_y);
+
+ gGL.begin(LLRender::TRIANGLE_STRIP);
+ gGL.vertex2f(-1,-1);
+ gGL.vertex2f(-1,3);
+ gGL.vertex2f(3,-1);
+ gGL.end();
+
+ gGL.flush();
+ shader->unbind();
+ }
}
else
{
- if (res_mod > 1)
- {
- tc2 /= (F32) res_mod;
- }
-
U32 mask = LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0 | LLVertexBuffer::MAP_TEXCOORD1;
LLPointer<LLVertexBuffer> buff = new LLVertexBuffer(mask, 0);
buff->allocateBuffer(3,0,TRUE);
@@ -6504,7 +6855,7 @@ void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield)
v[1] = LLVector3(-1,3,0);
v[2] = LLVector3(3,-1,0);
- buff->setBuffer(0);
+ buff->flush();
LLGLDisable blend(GL_BLEND);
@@ -6523,7 +6874,7 @@ void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield)
gGL.getTexUnit(0)->bind(&mGlow[1]);
gGL.getTexUnit(1)->bind(&mScreen);
- LLGLEnable multisample(gSavedSettings.getU32("RenderFSAASamples") > 0 ? GL_MULTISAMPLE_ARB : 0);
+ LLGLEnable multisample(RenderFSAASamples > 0 ? GL_MULTISAMPLE_ARB : 0);
buff->setBuffer(mask);
buff->drawArrays(LLRender::TRIANGLE_STRIP, 0, 3);
@@ -6543,19 +6894,13 @@ void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield)
}
- 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);
- }
-
gGL.setSceneBlendType(LLRender::BT_ALPHA);
if (hasRenderDebugMask(LLPipeline::RENDER_DEBUG_PHYSICS_SHAPES))
{
if (LLGLSLShader::sNoFixedFunction)
{
- gUIProgram.bind();
+ gSplatTextureRectProgram.bind();
}
gGL.setColorMask(true, false);
@@ -6569,7 +6914,7 @@ void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield)
gGL.getTexUnit(0)->bind(&mPhysicsDisplay);
- gGL.begin(LLRender::TRIANGLE_STRIP);
+ gGL.begin(LLRender::TRIANGLES);
gGL.texCoord2f(tc1.mV[0], tc1.mV[1]);
gGL.vertex2f(-1,-1);
@@ -6584,15 +6929,22 @@ void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield)
if (LLGLSLShader::sNoFixedFunction)
{
- gUIProgram.unbind();
+ gSplatTextureRectProgram.unbind();
}
+ }
+
+ 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);
}
+
- glMatrixMode(GL_PROJECTION);
- glPopMatrix();
- glMatrixMode(GL_MODELVIEW);
- glPopMatrix();
+ gGL.matrixMode(LLRender::MM_PROJECTION);
+ gGL.popMatrix();
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
+ gGL.popMatrix();
LLVertexBuffer::unbind();
@@ -6603,7 +6955,7 @@ void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield)
static LLFastTimer::DeclareTimer FTM_BIND_DEFERRED("Bind Deferred");
-void LLPipeline::bindDeferredShader(LLGLSLShader& shader, U32 light_index, LLRenderTarget* gi_source, LLRenderTarget* last_gi_post, U32 noise_map)
+void LLPipeline::bindDeferredShader(LLGLSLShader& shader, U32 light_index, U32 noise_map)
{
LLFastTimer t(FTM_BIND_DEFERRED);
@@ -6614,146 +6966,28 @@ void LLPipeline::bindDeferredShader(LLGLSLShader& shader, U32 light_index, LLRen
shader.bind();
S32 channel = 0;
- channel = shader.enableTexture(LLViewerShaderMgr::DEFERRED_DIFFUSE, mDeferredScreen.getUsage());
+ channel = shader.enableTexture(LLShaderMgr::DEFERRED_DIFFUSE, mDeferredScreen.getUsage());
if (channel > -1)
{
mDeferredScreen.bindTexture(0,channel);
gGL.getTexUnit(channel)->setTextureFilteringOption(LLTexUnit::TFO_POINT);
}
- channel = shader.enableTexture(LLViewerShaderMgr::DEFERRED_SPECULAR, mDeferredScreen.getUsage());
+ channel = shader.enableTexture(LLShaderMgr::DEFERRED_SPECULAR, mDeferredScreen.getUsage());
if (channel > -1)
{
mDeferredScreen.bindTexture(1, channel);
gGL.getTexUnit(channel)->setTextureFilteringOption(LLTexUnit::TFO_POINT);
}
- channel = shader.enableTexture(LLViewerShaderMgr::DEFERRED_NORMAL, mDeferredScreen.getUsage());
+ channel = shader.enableTexture(LLShaderMgr::DEFERRED_NORMAL, mDeferredScreen.getUsage());
if (channel > -1)
{
mDeferredScreen.bindTexture(2, channel);
gGL.getTexUnit(channel)->setTextureFilteringOption(LLTexUnit::TFO_POINT);
}
- if (gi_source)
- {
- BOOL has_gi = FALSE;
- channel = shader.enableTexture(LLViewerShaderMgr::DEFERRED_GI_DIFFUSE);
- if (channel > -1)
- {
- has_gi = TRUE;
- gi_source->bindTexture(0, channel);
- gGL.getTexUnit(channel)->setTextureFilteringOption(LLTexUnit::TFO_BILINEAR);
- }
-
- channel = shader.enableTexture(LLViewerShaderMgr::DEFERRED_GI_SPECULAR);
- if (channel > -1)
- {
- has_gi = TRUE;
- gi_source->bindTexture(1, channel);
- gGL.getTexUnit(channel)->setTextureFilteringOption(LLTexUnit::TFO_BILINEAR);
- }
-
- channel = shader.enableTexture(LLViewerShaderMgr::DEFERRED_GI_NORMAL);
- if (channel > -1)
- {
- has_gi = TRUE;
- gi_source->bindTexture(2, channel);
- gGL.getTexUnit(channel)->setTextureFilteringOption(LLTexUnit::TFO_BILINEAR);
- }
-
- channel = shader.enableTexture(LLViewerShaderMgr::DEFERRED_GI_MIN_POS);
- if (channel > -1)
- {
- has_gi = TRUE;
- gi_source->bindTexture(1, channel);
- gGL.getTexUnit(channel)->setTextureFilteringOption(LLTexUnit::TFO_BILINEAR);
- }
-
- channel = shader.enableTexture(LLViewerShaderMgr::DEFERRED_GI_MAX_POS);
- if (channel > -1)
- {
- has_gi = TRUE;
- gi_source->bindTexture(3, channel);
- gGL.getTexUnit(channel)->setTextureFilteringOption(LLTexUnit::TFO_BILINEAR);
- }
-
- channel = shader.enableTexture(LLViewerShaderMgr::DEFERRED_GI_LAST_DIFFUSE);
- if (channel > -1)
- {
- has_gi = TRUE;
- last_gi_post->bindTexture(0, channel);
- gGL.getTexUnit(channel)->setTextureFilteringOption(LLTexUnit::TFO_BILINEAR);
- }
-
- channel = shader.enableTexture(LLViewerShaderMgr::DEFERRED_GI_LAST_NORMAL);
- if (channel > -1)
- {
- has_gi = TRUE;
- last_gi_post->bindTexture(2, channel);
- gGL.getTexUnit(channel)->setTextureFilteringOption(LLTexUnit::TFO_BILINEAR);
- }
-
- channel = shader.enableTexture(LLViewerShaderMgr::DEFERRED_GI_LAST_MAX_POS);
- if (channel > -1)
- {
- has_gi = TRUE;
- last_gi_post->bindTexture(1, channel);
- gGL.getTexUnit(channel)->setTextureFilteringOption(LLTexUnit::TFO_BILINEAR);
- }
-
- channel = shader.enableTexture(LLViewerShaderMgr::DEFERRED_GI_LAST_MIN_POS);
- if (channel > -1)
- {
- has_gi = TRUE;
- last_gi_post->bindTexture(3, channel);
- gGL.getTexUnit(channel)->setTextureFilteringOption(LLTexUnit::TFO_BILINEAR);
- }
-
- channel = shader.enableTexture(LLViewerShaderMgr::DEFERRED_GI_DEPTH);
- if (channel > -1)
- {
- has_gi = TRUE;
- gGL.getTexUnit(channel)->bind(gi_source, TRUE);
- gGL.getTexUnit(channel)->setTextureFilteringOption(LLTexUnit::TFO_POINT);
- stop_glerror();
-
- glTexParameteri(LLTexUnit::getInternalType(mGIMap.getUsage()), GL_TEXTURE_COMPARE_MODE_ARB, GL_NONE);
- glTexParameteri(LLTexUnit::getInternalType(mGIMap.getUsage()), GL_DEPTH_TEXTURE_MODE_ARB, GL_ALPHA);
-
- stop_glerror();
- }
-
- if (has_gi)
- {
- F32 range_x = llmin(mGIRange.mV[0], 1.f);
- F32 range_y = llmin(mGIRange.mV[1], 1.f);
-
- LLVector2 scale(range_x,range_y);
-
- LLVector2 kern[25];
-
- for (S32 i = 0; i < 5; ++i)
- {
- for (S32 j = 0; j < 5; ++j)
- {
- S32 idx = i*5+j;
- kern[idx].mV[0] = (i-2)*0.5f;
- kern[idx].mV[1] = (j-2)*0.5f;
- kern[idx].scaleVec(scale);
- }
- }
-
- shader.uniform2fv("gi_kern", 25, (F32*) kern);
- shader.uniformMatrix4fv("gi_mat", 1, FALSE, mGIMatrix.m);
- shader.uniformMatrix4fv("gi_mat_proj", 1, FALSE, mGIMatrixProj.m);
- shader.uniformMatrix4fv("gi_inv_proj", 1, FALSE, mGIInvProj.m);
- shader.uniformMatrix4fv("gi_norm_mat", 1, FALSE, mGINormalMatrix.m);
- }
- }
- stop_glerror();
-
- channel = shader.enableTexture(LLViewerShaderMgr::DEFERRED_DEPTH, mDeferredDepth.getUsage());
+ channel = shader.enableTexture(LLShaderMgr::DEFERRED_DEPTH, mDeferredDepth.getUsage());
if (channel > -1)
{
gGL.getTexUnit(channel)->bind(&mDeferredDepth, TRUE);
@@ -6767,21 +7001,21 @@ void LLPipeline::bindDeferredShader(LLGLSLShader& shader, U32 light_index, LLRen
glh::matrix4f projection = glh_get_current_projection();
glh::matrix4f inv_proj = projection.inverse();
- shader.uniformMatrix4fv("inv_proj", 1, FALSE, inv_proj.m);
- shader.uniform4f("viewport", (F32) gGLViewport[0],
+ shader.uniformMatrix4fv(LLShaderMgr::INVERSE_PROJECTION_MATRIX, 1, FALSE, inv_proj.m);
+ shader.uniform4f(LLShaderMgr::VIEWPORT, (F32) gGLViewport[0],
(F32) gGLViewport[1],
(F32) gGLViewport[2],
(F32) gGLViewport[3]);
}
- channel = shader.enableTexture(LLViewerShaderMgr::DEFERRED_NOISE);
+ channel = shader.enableTexture(LLShaderMgr::DEFERRED_NOISE);
if (channel > -1)
{
gGL.getTexUnit(channel)->bindManual(LLTexUnit::TT_TEXTURE, noise_map);
gGL.getTexUnit(channel)->setTextureFilteringOption(LLTexUnit::TFO_POINT);
}
- channel = shader.enableTexture(LLViewerShaderMgr::DEFERRED_LIGHTFUNC);
+ channel = shader.enableTexture(LLShaderMgr::DEFERRED_LIGHTFUNC);
if (channel > -1)
{
gGL.getTexUnit(channel)->bindManual(LLTexUnit::TT_TEXTURE, mLightFunc);
@@ -6789,60 +7023,31 @@ void LLPipeline::bindDeferredShader(LLGLSLShader& shader, U32 light_index, LLRen
stop_glerror();
- channel = shader.enableTexture(LLViewerShaderMgr::DEFERRED_LIGHT, mDeferredLight[light_index].getUsage());
+ channel = shader.enableTexture(LLShaderMgr::DEFERRED_LIGHT, mDeferredLight.getUsage());
if (channel > -1)
{
- mDeferredLight[light_index].bindTexture(0, channel);
+ if (light_index > 0)
+ {
+ mScreen.bindTexture(0, channel);
+ }
+ else
+ {
+ mDeferredLight.bindTexture(0, channel);
+ }
gGL.getTexUnit(channel)->setTextureFilteringOption(LLTexUnit::TFO_POINT);
}
- channel = shader.enableTexture(LLViewerShaderMgr::DEFERRED_LUMINANCE);
- if (channel > -1)
- {
- gGL.getTexUnit(channel)->bindManual(LLTexUnit::TT_TEXTURE, mLuminanceMap.getTexture(), true);
- gGL.getTexUnit(channel)->setTextureFilteringOption(LLTexUnit::TFO_TRILINEAR);
- }
-
- channel = shader.enableTexture(LLViewerShaderMgr::DEFERRED_BLOOM);
+ channel = shader.enableTexture(LLShaderMgr::DEFERRED_BLOOM);
if (channel > -1)
{
mGlow[1].bindTexture(0, channel);
}
- channel = shader.enableTexture(LLViewerShaderMgr::DEFERRED_GI_LIGHT, LLTexUnit::TT_RECT_TEXTURE);
- if (channel > -1)
- {
- gi_source->bindTexture(0, channel);
- gGL.getTexUnit(channel)->setTextureFilteringOption(LLTexUnit::TFO_POINT);
- }
-
- channel = shader.enableTexture(LLViewerShaderMgr::DEFERRED_EDGE, LLTexUnit::TT_RECT_TEXTURE);
- if (channel > -1)
- {
- mEdgeMap.bindTexture(0, channel);
- gGL.getTexUnit(channel)->setTextureFilteringOption(LLTexUnit::TFO_POINT);
- }
-
- channel = shader.enableTexture(LLViewerShaderMgr::DEFERRED_SUN_LIGHT, LLTexUnit::TT_RECT_TEXTURE);
- if (channel > -1)
- {
- mDeferredLight[1].bindTexture(0, channel);
- gGL.getTexUnit(channel)->setTextureFilteringOption(LLTexUnit::TFO_POINT);
- }
-
- channel = shader.enableTexture(LLViewerShaderMgr::DEFERRED_LOCAL_LIGHT, LLTexUnit::TT_RECT_TEXTURE);
- if (channel > -1)
- {
- mDeferredLight[2].bindTexture(0, channel);
- gGL.getTexUnit(channel)->setTextureFilteringOption(LLTexUnit::TFO_POINT);
- }
-
-
stop_glerror();
for (U32 i = 0; i < 4; i++)
{
- channel = shader.enableTexture(LLViewerShaderMgr::DEFERRED_SHADOW0+i, LLTexUnit::TT_RECT_TEXTURE);
+ channel = shader.enableTexture(LLShaderMgr::DEFERRED_SHADOW0+i, LLTexUnit::TT_RECT_TEXTURE);
stop_glerror();
if (channel > -1)
{
@@ -6860,7 +7065,7 @@ void LLPipeline::bindDeferredShader(LLGLSLShader& shader, U32 light_index, LLRen
for (U32 i = 4; i < 6; i++)
{
- channel = shader.enableTexture(LLViewerShaderMgr::DEFERRED_SHADOW0+i);
+ channel = shader.enableTexture(LLShaderMgr::DEFERRED_SHADOW0+i);
stop_glerror();
if (channel > -1)
{
@@ -6889,12 +7094,11 @@ void LLPipeline::bindDeferredShader(LLGLSLShader& shader, U32 light_index, LLRen
mat[i+80] = mSunShadowMatrix[5].m[i];
}
- shader.uniformMatrix4fv("shadow_matrix[0]", 6, FALSE, mat);
- shader.uniformMatrix4fv("shadow_matrix", 6, FALSE, mat);
+ shader.uniformMatrix4fv(LLShaderMgr::DEFERRED_SHADOW_MATRIX, 6, FALSE, mat);
stop_glerror();
- channel = shader.enableTexture(LLViewerShaderMgr::ENVIRONMENT_MAP, LLTexUnit::TT_CUBE_MAP);
+ channel = shader.enableTexture(LLShaderMgr::ENVIRONMENT_MAP, LLTexUnit::TT_CUBE_MAP);
if (channel > -1)
{
LLCubeMap* cube_map = gSky.mVOSkyp ? gSky.mVOSkyp->getCubeMap() : NULL;
@@ -6902,31 +7106,29 @@ void LLPipeline::bindDeferredShader(LLGLSLShader& shader, U32 light_index, LLRen
{
cube_map->enable(channel);
cube_map->bind();
- F64* m = gGLModelView;
-
-
+ F32* m = gGLModelView;
+
F32 mat[] = { m[0], m[1], m[2],
m[4], m[5], m[6],
m[8], m[9], m[10] };
- shader.uniform3fv("env_mat[0]", 3, mat);
- shader.uniform3fv("env_mat", 3, mat);
+ shader.uniformMatrix3fv(LLShaderMgr::DEFERRED_ENV_MAT, 1, TRUE, mat);
}
}
- shader.uniform4fv("shadow_clip", 1, mSunClipPlanes.mV);
- shader.uniform1f("sun_wash", gSavedSettings.getF32("RenderDeferredSunWash"));
- shader.uniform1f("shadow_noise", gSavedSettings.getF32("RenderShadowNoise"));
- shader.uniform1f("blur_size", gSavedSettings.getF32("RenderShadowBlurSize"));
+ shader.uniform4fv(LLShaderMgr::DEFERRED_SHADOW_CLIP, 1, mSunClipPlanes.mV);
+ shader.uniform1f(LLShaderMgr::DEFERRED_SUN_WASH, RenderDeferredSunWash);
+ shader.uniform1f(LLShaderMgr::DEFERRED_SHADOW_NOISE, RenderShadowNoise);
+ shader.uniform1f(LLShaderMgr::DEFERRED_BLUR_SIZE, RenderShadowBlurSize);
- shader.uniform1f("ssao_radius", gSavedSettings.getF32("RenderSSAOScale"));
- shader.uniform1f("ssao_max_radius", gSavedSettings.getU32("RenderSSAOMaxScale"));
+ shader.uniform1f(LLShaderMgr::DEFERRED_SSAO_RADIUS, RenderSSAOScale);
+ shader.uniform1f(LLShaderMgr::DEFERRED_SSAO_MAX_RADIUS, RenderSSAOMaxScale);
- F32 ssao_factor = gSavedSettings.getF32("RenderSSAOFactor");
- shader.uniform1f("ssao_factor", ssao_factor);
- shader.uniform1f("ssao_factor_inv", 1.0/ssao_factor);
+ F32 ssao_factor = RenderSSAOFactor;
+ shader.uniform1f(LLShaderMgr::DEFERRED_SSAO_FACTOR, ssao_factor);
+ shader.uniform1f(LLShaderMgr::DEFERRED_SSAO_FACTOR_INV, 1.0/ssao_factor);
- LLVector3 ssao_effect = gSavedSettings.getVector3("RenderSSAOEffect");
+ LLVector3 ssao_effect = RenderSSAOEffect;
F32 matrix_diag = (ssao_effect[0] + 2.0*ssao_effect[1])/3.0;
F32 matrix_nondiag = (ssao_effect[0] - ssao_effect[1])/3.0;
// This matrix scales (proj of color onto <1/rt(3),1/rt(3),1/rt(3)>) by
@@ -6934,35 +7136,23 @@ void LLPipeline::bindDeferredShader(LLGLSLShader& shader, U32 light_index, LLRen
F32 ssao_effect_mat[] = { matrix_diag, matrix_nondiag, matrix_nondiag,
matrix_nondiag, matrix_diag, matrix_nondiag,
matrix_nondiag, matrix_nondiag, matrix_diag};
- shader.uniformMatrix3fv("ssao_effect_mat", 1, GL_FALSE, ssao_effect_mat);
-
- F32 shadow_offset_error = 1.f + gSavedSettings.getF32("RenderShadowOffsetError") * fabsf(LLViewerCamera::getInstance()->getOrigin().mV[2]);
- F32 shadow_bias_error = 1.f + gSavedSettings.getF32("RenderShadowBiasError") * fabsf(LLViewerCamera::getInstance()->getOrigin().mV[2]);
-
- shader.uniform2f("screen_res", mDeferredScreen.getWidth(), mDeferredScreen.getHeight());
- shader.uniform1f("near_clip", LLViewerCamera::getInstance()->getNear()*2.f);
- shader.uniform1f ("shadow_offset", gSavedSettings.getF32("RenderShadowOffset")*shadow_offset_error);
- shader.uniform1f("shadow_bias", gSavedSettings.getF32("RenderShadowBias")*shadow_bias_error);
- shader.uniform1f ("spot_shadow_offset", gSavedSettings.getF32("RenderSpotShadowOffset"));
- shader.uniform1f("spot_shadow_bias", gSavedSettings.getF32("RenderSpotShadowBias"));
-
- shader.uniform1f("lum_scale", gSavedSettings.getF32("RenderLuminanceScale"));
- shader.uniform1f("sun_lum_scale", gSavedSettings.getF32("RenderSunLuminanceScale"));
- shader.uniform1f("sun_lum_offset", gSavedSettings.getF32("RenderSunLuminanceOffset"));
- shader.uniform1f("lum_lod", gSavedSettings.getF32("RenderLuminanceDetail"));
- shader.uniform1f("gi_range", gSavedSettings.getF32("RenderGIRange"));
- shader.uniform1f("gi_brightness", gSavedSettings.getF32("RenderGIBrightness"));
- shader.uniform1f("gi_luminance", gSavedSettings.getF32("RenderGILuminance"));
- shader.uniform1f("gi_edge_weight", gSavedSettings.getF32("RenderGIBlurEdgeWeight"));
- shader.uniform1f("gi_blur_brightness", gSavedSettings.getF32("RenderGIBlurBrightness"));
- shader.uniform1f("gi_sample_width", mGILightRadius);
- shader.uniform1f("gi_noise", gSavedSettings.getF32("RenderGINoise"));
- shader.uniform1f("gi_attenuation", gSavedSettings.getF32("RenderGIAttenuation"));
- shader.uniform1f("gi_ambiance", gSavedSettings.getF32("RenderGIAmbiance"));
- shader.uniform2f("shadow_res", mShadow[0].getWidth(), mShadow[0].getHeight());
- shader.uniform2f("proj_shadow_res", mShadow[4].getWidth(), mShadow[4].getHeight());
- shader.uniform1f("depth_cutoff", gSavedSettings.getF32("RenderEdgeDepthCutoff"));
- shader.uniform1f("norm_cutoff", gSavedSettings.getF32("RenderEdgeNormCutoff"));
+ shader.uniformMatrix3fv(LLShaderMgr::DEFERRED_SSAO_EFFECT_MAT, 1, GL_FALSE, ssao_effect_mat);
+
+ F32 shadow_offset_error = 1.f + RenderShadowOffsetError * fabsf(LLViewerCamera::getInstance()->getOrigin().mV[2]);
+ F32 shadow_bias_error = 1.f + RenderShadowBiasError * fabsf(LLViewerCamera::getInstance()->getOrigin().mV[2]);
+
+ shader.uniform2f(LLShaderMgr::DEFERRED_SCREEN_RES, mDeferredScreen.getWidth(), mDeferredScreen.getHeight());
+ shader.uniform1f(LLShaderMgr::DEFERRED_NEAR_CLIP, LLViewerCamera::getInstance()->getNear()*2.f);
+ shader.uniform1f (LLShaderMgr::DEFERRED_SHADOW_OFFSET, RenderShadowOffset*shadow_offset_error);
+ shader.uniform1f(LLShaderMgr::DEFERRED_SHADOW_BIAS, RenderShadowBias*shadow_bias_error);
+ shader.uniform1f(LLShaderMgr::DEFERRED_SPOT_SHADOW_OFFSET, RenderSpotShadowOffset);
+ shader.uniform1f(LLShaderMgr::DEFERRED_SPOT_SHADOW_BIAS, RenderSpotShadowBias);
+
+ shader.uniform3fv(LLShaderMgr::DEFERRED_SUN_DIR, 1, mTransformedSunDir.mV);
+ shader.uniform2f(LLShaderMgr::DEFERRED_SHADOW_RES, mShadow[0].getWidth(), mShadow[0].getHeight());
+ shader.uniform2f(LLShaderMgr::DEFERRED_PROJ_SHADOW_RES, mShadow[4].getWidth(), mShadow[4].getHeight());
+ shader.uniform1f(LLShaderMgr::DEFERRED_DEPTH_CUTOFF, RenderEdgeDepthCutoff);
+ shader.uniform1f(LLShaderMgr::DEFERRED_NORM_CUTOFF, RenderEdgeNormCutoff);
if (shader.getUniformLocation("norm_mat") >= 0)
@@ -7001,7 +7191,7 @@ void LLPipeline::renderDeferredLighting()
0, 0, mDeferredDepth.getWidth(), mDeferredDepth.getHeight(), GL_DEPTH_BUFFER_BIT, GL_NEAREST);
}
- LLGLEnable multisample(gSavedSettings.getU32("RenderFSAASamples") > 0 ? GL_MULTISAMPLE_ARB : 0);
+ LLGLEnable multisample(RenderFSAASamples > 0 ? GL_MULTISAMPLE_ARB : 0);
if (gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_HUD))
{
@@ -7023,38 +7213,40 @@ void LLPipeline::renderDeferredLighting()
glh::matrix4f mat = glh_copy_matrix(gGLModelView);
- F32 vert[] =
- {
- -1,1,
- -1,-3,
- 3,1,
- };
- glVertexPointer(2, GL_FLOAT, 0, vert);
- glColor3f(1,1,1);
+ LLStrider<LLVector3> vert;
+ mDeferredVB->getVertexStrider(vert);
+ LLStrider<LLVector2> tc0;
+ LLStrider<LLVector2> tc1;
+ mDeferredVB->getTexCoord0Strider(tc0);
+ mDeferredVB->getTexCoord1Strider(tc1);
+ vert[0].set(-1,1,0);
+ vert[1].set(-1,-3,0);
+ vert[2].set(3,1,0);
+
{
setupHWLights(NULL); //to set mSunDir;
LLVector4 dir(mSunDir, 0.f);
glh::vec4f tc(dir.mV);
mat.mult_matrix_vec(tc);
- glTexCoord4f(tc.v[0], tc.v[1], tc.v[2], 0);
+ mTransformedSunDir.set(tc.v);
}
- glPushMatrix();
- glLoadIdentity();
- glMatrixMode(GL_PROJECTION);
- glPushMatrix();
- glLoadIdentity();
+ gGL.pushMatrix();
+ gGL.loadIdentity();
+ gGL.matrixMode(LLRender::MM_PROJECTION);
+ gGL.pushMatrix();
+ gGL.loadIdentity();
- if (gSavedSettings.getBOOL("RenderDeferredSSAO") || gSavedSettings.getS32("RenderShadowDetail") > 0)
+ if (RenderDeferredSSAO || RenderShadowDetail > 0)
{
- mDeferredLight[0].bindTarget();
+ mDeferredLight.bindTarget();
{ //paint shadow/SSAO light map (direct lighting lightmap)
LLFastTimer ftm(FTM_SUN_SHADOW);
bindDeferredShader(gDeferredSunProgram, 0);
-
+ mDeferredVB->setBuffer(LLVertexBuffer::MAP_VERTEX);
glClearColor(1,1,1,1);
- mDeferredLight[0].clear(GL_COLOR_BUFFER_BIT);
+ mDeferredLight.clear(GL_COLOR_BUFFER_BIT);
glClearColor(0,0,0,0);
glh::matrix4f inv_trans = glh_get_current_modelview().inverse().transpose();
@@ -7077,141 +7269,36 @@ void LLPipeline::renderDeferredLighting()
}
gDeferredSunProgram.uniform3fv("offset", slice, offset);
- gDeferredSunProgram.uniform2f("screenRes", mDeferredLight[0].getWidth(), mDeferredLight[0].getHeight());
+ gDeferredSunProgram.uniform2f("screenRes", mDeferredLight.getWidth(), mDeferredLight.getHeight());
{
LLGLDisable blend(GL_BLEND);
LLGLDepthTest depth(GL_TRUE, GL_FALSE, GL_ALWAYS);
stop_glerror();
- glDrawArrays(GL_TRIANGLE_STRIP, 0, 3);
+ mDeferredVB->drawArrays(LLRender::TRIANGLES, 0, 3);
stop_glerror();
}
unbindDeferredShader(gDeferredSunProgram);
}
- mDeferredLight[0].flush();
+ mDeferredLight.flush();
}
- { //global illumination specific block (still experimental)
- if (gSavedSettings.getBOOL("RenderDeferredBlurLight") &&
- gSavedSettings.getBOOL("RenderDeferredGI"))
- {
- LLFastTimer ftm(FTM_EDGE_DETECTION);
- //generate edge map
- LLGLDisable blend(GL_BLEND);
- LLGLDisable test(GL_ALPHA_TEST);
- LLGLDepthTest depth(GL_FALSE);
- LLGLDisable stencil(GL_STENCIL_TEST);
-
- {
- gDeferredEdgeProgram.bind();
- mEdgeMap.bindTarget();
- bindDeferredShader(gDeferredEdgeProgram);
- glDrawArrays(GL_TRIANGLE_STRIP, 0, 3);
- unbindDeferredShader(gDeferredEdgeProgram);
- mEdgeMap.flush();
- }
- }
-
- if (LLViewerShaderMgr::instance()->getVertexShaderLevel(LLViewerShaderMgr::SHADER_DEFERRED) > 2)
- {
- { //get luminance map from previous frame's light map
- LLGLEnable blend(GL_BLEND);
- LLGLDisable test(GL_ALPHA_TEST);
- LLGLDepthTest depth(GL_FALSE);
- LLGLDisable stencil(GL_STENCIL_TEST);
-
- //static F32 fade = 1.f;
-
- {
- gGL.setSceneBlendType(LLRender::BT_ALPHA);
- gLuminanceGatherProgram.bind();
- gLuminanceGatherProgram.uniform2f("screen_res", mDeferredLight[0].getWidth(), mDeferredLight[0].getHeight());
- mLuminanceMap.bindTarget();
- bindDeferredShader(gLuminanceGatherProgram);
- glDrawArrays(GL_TRIANGLE_STRIP, 0, 3);
- unbindDeferredShader(gLuminanceGatherProgram);
- mLuminanceMap.flush();
- gGL.getTexUnit(0)->bindManual(LLTexUnit::TT_TEXTURE, mLuminanceMap.getTexture(), true);
- gGL.getTexUnit(0)->setTextureFilteringOption(LLTexUnit::TFO_TRILINEAR);
- glGenerateMipmap(GL_TEXTURE_2D);
- }
- }
-
- { //paint noisy GI map (bounce lighting lightmap)
- LLFastTimer ftm(FTM_GI_TRACE);
- LLGLDisable blend(GL_BLEND);
- LLGLDepthTest depth(GL_FALSE);
- LLGLDisable test(GL_ALPHA_TEST);
-
- mGIMapPost[0].bindTarget();
-
- bindDeferredShader(gDeferredGIProgram, 0, &mGIMap, 0, mTrueNoiseMap);
- glDrawArrays(GL_TRIANGLE_STRIP, 0, 3);
- unbindDeferredShader(gDeferredGIProgram);
- mGIMapPost[0].flush();
- }
-
- U32 pass_count = 0;
- if (gSavedSettings.getBOOL("RenderDeferredBlurLight"))
- {
- pass_count = llclamp(gSavedSettings.getU32("RenderGIBlurPasses"), (U32) 1, (U32) 128);
- }
-
- for (U32 i = 0; i < pass_count; ++i)
- { //gather/soften indirect lighting map
- LLFastTimer ftm(FTM_GI_GATHER);
- bindDeferredShader(gDeferredPostGIProgram, 0, &mGIMapPost[0], NULL, mTrueNoiseMap);
- F32 blur_size = gSavedSettings.getF32("RenderGIBlurSize")/((F32) i * gSavedSettings.getF32("RenderGIBlurIncrement")+1.f);
- gDeferredPostGIProgram.uniform2f("delta", 1.f, 0.f);
- gDeferredPostGIProgram.uniform1f("kern_scale", blur_size);
- gDeferredPostGIProgram.uniform1f("gi_blur_brightness", gSavedSettings.getF32("RenderGIBlurBrightness"));
-
- mGIMapPost[1].bindTarget();
- {
- LLGLDisable blend(GL_BLEND);
- LLGLDepthTest depth(GL_FALSE);
- stop_glerror();
- glDrawArrays(GL_TRIANGLE_STRIP, 0, 3);
- stop_glerror();
- }
-
- mGIMapPost[1].flush();
- unbindDeferredShader(gDeferredPostGIProgram);
- bindDeferredShader(gDeferredPostGIProgram, 0, &mGIMapPost[1], NULL, mTrueNoiseMap);
- mGIMapPost[0].bindTarget();
-
- gDeferredPostGIProgram.uniform2f("delta", 0.f, 1.f);
-
- {
- LLGLDisable blend(GL_BLEND);
- LLGLDepthTest depth(GL_FALSE);
- stop_glerror();
- glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
- stop_glerror();
- }
- mGIMapPost[0].flush();
- unbindDeferredShader(gDeferredPostGIProgram);
- }
- }
- }
-
- if (gSavedSettings.getBOOL("RenderDeferredSSAO"))
+ if (RenderDeferredSSAO)
{ //soften direct lighting lightmap
LLFastTimer ftm(FTM_SOFTEN_SHADOW);
//blur lightmap
- mDeferredLight[1].bindTarget();
-
+ mScreen.bindTarget();
glClearColor(1,1,1,1);
- mDeferredLight[1].clear(GL_COLOR_BUFFER_BIT);
+ mScreen.clear(GL_COLOR_BUFFER_BIT);
glClearColor(0,0,0,0);
bindDeferredShader(gDeferredBlurLightProgram);
-
- LLVector3 go = gSavedSettings.getVector3("RenderShadowGaussian");
+ mDeferredVB->setBuffer(LLVertexBuffer::MAP_VERTEX);
+ LLVector3 go = RenderShadowGaussian;
const U32 kern_length = 4;
- F32 blur_size = gSavedSettings.getF32("RenderShadowBlurSize");
- F32 dist_factor = gSavedSettings.getF32("RenderShadowBlurDistFactor");
+ F32 blur_size = RenderShadowBlurSize;
+ F32 dist_factor = RenderShadowBlurDistFactor;
// sample symmetrically with the middle sample falling exactly on 0.0
F32 x = 0.f;
@@ -7235,15 +7322,16 @@ void LLPipeline::renderDeferredLighting()
LLGLDisable blend(GL_BLEND);
LLGLDepthTest depth(GL_TRUE, GL_FALSE, GL_ALWAYS);
stop_glerror();
- glDrawArrays(GL_TRIANGLE_STRIP, 0, 3);
+ mDeferredVB->drawArrays(LLRender::TRIANGLES, 0, 3);
stop_glerror();
}
- mDeferredLight[1].flush();
+ mScreen.flush();
unbindDeferredShader(gDeferredBlurLightProgram);
bindDeferredShader(gDeferredBlurLightProgram, 1);
- mDeferredLight[0].bindTarget();
+ mDeferredVB->setBuffer(LLVertexBuffer::MAP_VERTEX);
+ mDeferredLight.bindTarget();
gDeferredBlurLightProgram.uniform2f("delta", 0.f, 1.f);
@@ -7251,69 +7339,59 @@ void LLPipeline::renderDeferredLighting()
LLGLDisable blend(GL_BLEND);
LLGLDepthTest depth(GL_TRUE, GL_FALSE, GL_ALWAYS);
stop_glerror();
- glDrawArrays(GL_TRIANGLE_STRIP, 0, 3);
+ mDeferredVB->drawArrays(LLRender::TRIANGLES, 0, 3);
stop_glerror();
}
- mDeferredLight[0].flush();
+ mDeferredLight.flush();
unbindDeferredShader(gDeferredBlurLightProgram);
}
stop_glerror();
- glPopMatrix();
+ gGL.popMatrix();
stop_glerror();
- glMatrixMode(GL_MODELVIEW);
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
stop_glerror();
- glPopMatrix();
+ gGL.popMatrix();
stop_glerror();
//copy depth and stencil from deferred screen
//mScreen.copyContents(mDeferredScreen, 0, 0, mDeferredScreen.getWidth(), mDeferredScreen.getHeight(),
// 0, 0, mScreen.getWidth(), mScreen.getHeight(), GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT, GL_NEAREST);
- if (LLViewerShaderMgr::instance()->getVertexShaderLevel(LLViewerShaderMgr::SHADER_DEFERRED) > 2)
- {
- mDeferredLight[1].bindTarget();
- // clear color buffer here (GI) - zeroing alpha (glow) is important or it will accumulate against sky
- glClearColor(0,0,0,0);
- mScreen.clear(GL_COLOR_BUFFER_BIT);
- }
- else
- {
- mScreen.bindTarget();
- // clear color buffer here - zeroing alpha (glow) is important or it will accumulate against sky
- glClearColor(0,0,0,0);
- mScreen.clear(GL_COLOR_BUFFER_BIT);
- }
-
- if (gSavedSettings.getBOOL("RenderDeferredAtmospheric"))
+ mScreen.bindTarget();
+ // clear color buffer here - zeroing alpha (glow) is important or it will accumulate against sky
+ glClearColor(0,0,0,0);
+ mScreen.clear(GL_COLOR_BUFFER_BIT);
+
+ if (RenderDeferredAtmospheric)
{ //apply sunlight contribution
LLFastTimer ftm(FTM_ATMOSPHERICS);
- bindDeferredShader(gDeferredSoftenProgram, 0, &mGIMapPost[0]);
+ bindDeferredShader(gDeferredSoftenProgram);
{
LLGLDepthTest depth(GL_FALSE);
LLGLDisable blend(GL_BLEND);
LLGLDisable test(GL_ALPHA_TEST);
//full screen blit
- glPushMatrix();
- glLoadIdentity();
- glMatrixMode(GL_PROJECTION);
- glPushMatrix();
- glLoadIdentity();
+ gGL.pushMatrix();
+ gGL.loadIdentity();
+ gGL.matrixMode(LLRender::MM_PROJECTION);
+ gGL.pushMatrix();
+ gGL.loadIdentity();
- glVertexPointer(2, GL_FLOAT, 0, vert);
-
- glDrawArrays(GL_TRIANGLE_STRIP, 0, 3);
+ mDeferredVB->setBuffer(LLVertexBuffer::MAP_VERTEX);
- glPopMatrix();
- glMatrixMode(GL_MODELVIEW);
- glPopMatrix();
+ mDeferredVB->drawArrays(LLRender::TRIANGLES, 0, 3);
+
+ gGL.popMatrix();
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
+ gGL.popMatrix();
}
unbindDeferredShader(gDeferredSoftenProgram);
}
- { //render sky
+ { //render non-deferred geometry (fullbright, alpha, etc)
LLGLDisable blend(GL_BLEND);
LLGLDisable stencil(GL_STENCIL_TEST);
gGL.setSceneBlendType(LLRender::BT_ALPHA);
@@ -7330,15 +7408,8 @@ void LLPipeline::renderDeferredLighting()
gPipeline.popRenderTypeMask();
}
- BOOL render_local = gSavedSettings.getBOOL("RenderLocalLights");
+ BOOL render_local = RenderLocalLights;
- if (LLViewerShaderMgr::instance()->getVertexShaderLevel(LLViewerShaderMgr::SHADER_DEFERRED) > 2)
- {
- mDeferredLight[1].flush();
- mDeferredLight[2].bindTarget();
- mDeferredLight[2].clear(GL_COLOR_BUFFER_BIT);
- }
-
if (render_local)
{
gGL.setSceneBlendType(LLRender::BT_ADD);
@@ -7354,12 +7425,12 @@ void LLPipeline::renderDeferredLighting()
std::list<LLVector4> light_colors;
LLVertexBuffer::unbind();
+ LLVector4a* v = (LLVector4a*) vert.get();
- F32 v[24];
- glVertexPointer(3, GL_FLOAT, 0, v);
-
{
bindDeferredShader(gDeferredLightProgram);
+ mDeferredVB->setBuffer(LLVertexBuffer::MAP_VERTEX);
+
LLGLDepthTest depth(GL_TRUE, GL_FALSE);
for (LLDrawable::drawable_set_t::iterator iter = mLights.begin(); iter != mLights.end(); ++iter)
{
@@ -7386,8 +7457,7 @@ void LLPipeline::renderDeferredLighting()
F32 s = volume->getLightRadius()*1.5f;
LLColor3 col = volume->getLightColor();
- col *= volume->getLightIntensity();
-
+
if (col.magVecSquared() < 0.001f)
{
continue;
@@ -7414,15 +7484,16 @@ void LLPipeline::renderDeferredLighting()
//correspond to their axis facing, with bit position 3,2,1 matching
//axis facing x,y,z, bit set meaning positive facing, bit clear
//meaning negative facing
- v[0] = c[0]-s; v[1] = c[1]-s; v[2] = c[2]-s; // 0 - 0000
- v[3] = c[0]-s; v[4] = c[1]-s; v[5] = c[2]+s; // 1 - 0001
- v[6] = c[0]-s; v[7] = c[1]+s; v[8] = c[2]-s; // 2 - 0010
- v[9] = c[0]-s; v[10] = c[1]+s; v[11] = c[2]+s; // 3 - 0011
+ mDeferredVB->getVertexStrider(vert);
+ v[0].set(c[0]-s,c[1]-s,c[2]-s); // 0 - 0000
+ v[1].set(c[0]-s,c[1]-s,c[2]+s); // 1 - 0001
+ v[2].set(c[0]-s,c[1]+s,c[2]-s); // 2 - 0010
+ v[3].set(c[0]-s,c[1]+s,c[2]+s); // 3 - 0011
- v[12] = c[0]+s; v[13] = c[1]-s; v[14] = c[2]-s; // 4 - 0100
- v[15] = c[0]+s; v[16] = c[1]-s; v[17] = c[2]+s; // 5 - 0101
- v[18] = c[0]+s; v[19] = c[1]+s; v[20] = c[2]-s; // 6 - 0110
- v[21] = c[0]+s; v[22] = c[1]+s; v[23] = c[2]+s; // 7 - 0111
+ v[4].set(c[0]+s,c[1]-s,c[2]-s); // 4 - 0100
+ v[5].set(c[0]+s,c[1]-s,c[2]+s); // 5 - 0101
+ v[6].set(c[0]+s,c[1]+s,c[2]-s); // 6 - 0110
+ v[7].set(c[0]+s,c[1]+s,c[2]+s); // 7 - 0111
if (camera->getOrigin().mV[0] > c[0] + s + 0.2f ||
camera->getOrigin().mV[0] < c[0] - s - 0.2f ||
@@ -7441,10 +7512,16 @@ void LLPipeline::renderDeferredLighting()
}
LLFastTimer ftm(FTM_LOCAL_LIGHTS);
- glTexCoord4f(tc.v[0], tc.v[1], tc.v[2], s*s);
- glColor4f(col.mV[0], col.mV[1], col.mV[2], volume->getLightFalloff()*0.5f);
+ //glTexCoord4f(tc.v[0], tc.v[1], tc.v[2], s*s);
+ gDeferredLightProgram.uniform3fv(LLShaderMgr::LIGHT_CENTER, 1, tc.v);
+ gDeferredLightProgram.uniform1f(LLShaderMgr::LIGHT_SIZE, s*s);
+ gDeferredLightProgram.uniform3fv(LLShaderMgr::DIFFUSE_COLOR, 1, col.mV);
+ gDeferredLightProgram.uniform1f(LLShaderMgr::LIGHT_FALLOFF, volume->getLightFalloff()*0.5f);
+ //gGL.diffuseColor4f(col.mV[0], col.mV[1], col.mV[2], volume->getLightFalloff()*0.5f);
+ gGL.syncMatrices();
+ mDeferredVB->setBuffer(LLVertexBuffer::MAP_VERTEX);
glDrawRangeElements(GL_TRIANGLE_FAN, 0, 7, 8,
- GL_UNSIGNED_BYTE, get_box_fan_indices_ptr(camera, center));
+ GL_UNSIGNED_SHORT, get_box_fan_indices_ptr(camera, center));
stop_glerror();
}
}
@@ -7469,7 +7546,9 @@ void LLPipeline::renderDeferredLighting()
LLGLDepthTest depth(GL_TRUE, GL_FALSE);
bindDeferredShader(gDeferredSpotLightProgram);
- gDeferredSpotLightProgram.enableTexture(LLViewerShaderMgr::DEFERRED_PROJECTION);
+ mDeferredVB->setBuffer(LLVertexBuffer::MAP_VERTEX);
+
+ gDeferredSpotLightProgram.enableTexture(LLShaderMgr::DEFERRED_PROJECTION);
for (LLDrawable::drawable_list_t::iterator iter = spot_lights.begin(); iter != spot_lights.end(); ++iter)
{
@@ -7491,42 +7570,54 @@ void LLPipeline::renderDeferredLighting()
setupSpotLight(gDeferredSpotLightProgram, drawablep);
LLColor3 col = volume->getLightColor();
- col *= volume->getLightIntensity();
-
+
//vertex positions are encoded so the 3 bits of their vertex index
//correspond to their axis facing, with bit position 3,2,1 matching
//axis facing x,y,z, bit set meaning positive facing, bit clear
//meaning negative facing
- v[0] = c[0]-s; v[1] = c[1]-s; v[2] = c[2]-s; // 0 - 0000
- v[3] = c[0]-s; v[4] = c[1]-s; v[5] = c[2]+s; // 1 - 0001
- v[6] = c[0]-s; v[7] = c[1]+s; v[8] = c[2]-s; // 2 - 0010
- v[9] = c[0]-s; v[10] = c[1]+s; v[11] = c[2]+s; // 3 - 0011
+ mDeferredVB->getVertexStrider(vert);
+ v[0].set(c[0]-s,c[1]-s,c[2]-s); // 0 - 0000
+ v[1].set(c[0]-s,c[1]-s,c[2]+s); // 1 - 0001
+ v[2].set(c[0]-s,c[1]+s,c[2]-s); // 2 - 0010
+ v[3].set(c[0]-s,c[1]+s,c[2]+s); // 3 - 0011
- v[12] = c[0]+s; v[13] = c[1]-s; v[14] = c[2]-s; // 4 - 0100
- v[15] = c[0]+s; v[16] = c[1]-s; v[17] = c[2]+s; // 5 - 0101
- v[18] = c[0]+s; v[19] = c[1]+s; v[20] = c[2]-s; // 6 - 0110
- v[21] = c[0]+s; v[22] = c[1]+s; v[23] = c[2]+s; // 7 - 0111
-
- glTexCoord4f(tc.v[0], tc.v[1], tc.v[2], s*s);
- glColor4f(col.mV[0], col.mV[1], col.mV[2], volume->getLightFalloff()*0.5f);
+ v[4].set(c[0]+s,c[1]-s,c[2]-s); // 4 - 0100
+ v[5].set(c[0]+s,c[1]-s,c[2]+s); // 5 - 0101
+ v[6].set(c[0]+s,c[1]+s,c[2]-s); // 6 - 0110
+ v[7].set(c[0]+s,c[1]+s,c[2]+s); // 7 - 0111
+
+ gDeferredSpotLightProgram.uniform3fv(LLShaderMgr::LIGHT_CENTER, 1, tc.v);
+ gDeferredSpotLightProgram.uniform1f(LLShaderMgr::LIGHT_SIZE, s*s);
+ gDeferredSpotLightProgram.uniform3fv(LLShaderMgr::DIFFUSE_COLOR, 1, col.mV);
+ gDeferredSpotLightProgram.uniform1f(LLShaderMgr::LIGHT_FALLOFF, volume->getLightFalloff()*0.5f);
+ gGL.syncMatrices();
+ mDeferredVB->setBuffer(LLVertexBuffer::MAP_VERTEX);
glDrawRangeElements(GL_TRIANGLE_FAN, 0, 7, 8,
- GL_UNSIGNED_BYTE, get_box_fan_indices_ptr(camera, center));
+ GL_UNSIGNED_SHORT, get_box_fan_indices_ptr(camera, center));
}
- gDeferredSpotLightProgram.disableTexture(LLViewerShaderMgr::DEFERRED_PROJECTION);
+ gDeferredSpotLightProgram.disableTexture(LLShaderMgr::DEFERRED_PROJECTION);
unbindDeferredShader(gDeferredSpotLightProgram);
}
+ //reset mDeferredVB to fullscreen triangle
+ mDeferredVB->getVertexStrider(vert);
+ vert[0].set(-1,1,0);
+ vert[1].set(-1,-3,0);
+ vert[2].set(3,1,0);
+
{
bindDeferredShader(gDeferredMultiLightProgram);
+ mDeferredVB->setBuffer(LLVertexBuffer::MAP_VERTEX);
+
LLGLDepthTest depth(GL_FALSE);
//full screen blit
- glPushMatrix();
- glLoadIdentity();
- glMatrixMode(GL_PROJECTION);
- glPushMatrix();
- glLoadIdentity();
+ gGL.pushMatrix();
+ gGL.loadIdentity();
+ gGL.matrixMode(LLRender::MM_PROJECTION);
+ gGL.pushMatrix();
+ gGL.loadIdentity();
U32 count = 0;
@@ -7534,7 +7625,7 @@ void LLPipeline::renderDeferredLighting()
LLVector4 light[max_count];
LLVector4 col[max_count];
- glVertexPointer(2, GL_FLOAT, 0, vert);
+// glVertexPointer(2, GL_FLOAT, 0, vert);
F32 far_z = 0.f;
@@ -7551,13 +7642,13 @@ void LLPipeline::renderDeferredLighting()
count++;
if (count == max_count || fullscreen_lights.empty())
{
- gDeferredMultiLightProgram.uniform1i("light_count", count);
- gDeferredMultiLightProgram.uniform4fv("light", count, (GLfloat*) light);
- gDeferredMultiLightProgram.uniform4fv("light_col", count, (GLfloat*) col);
- gDeferredMultiLightProgram.uniform1f("far_z", far_z);
+ gDeferredMultiLightProgram.uniform1i(LLShaderMgr::MULTI_LIGHT_COUNT, count);
+ gDeferredMultiLightProgram.uniform4fv(LLShaderMgr::MULTI_LIGHT, count, (GLfloat*) light);
+ gDeferredMultiLightProgram.uniform4fv(LLShaderMgr::MULTI_LIGHT_COL, count, (GLfloat*) col);
+ gDeferredMultiLightProgram.uniform1f(LLShaderMgr::MULTI_LIGHT_FAR_Z, far_z);
far_z = 0.f;
- count = 0;
- glDrawArrays(GL_TRIANGLE_STRIP, 0, 3);
+ count = 0;
+ mDeferredVB->drawArrays(LLRender::TRIANGLES, 0, 3);
}
}
@@ -7565,7 +7656,9 @@ void LLPipeline::renderDeferredLighting()
bindDeferredShader(gDeferredMultiSpotLightProgram);
- gDeferredMultiSpotLightProgram.enableTexture(LLViewerShaderMgr::DEFERRED_PROJECTION);
+ gDeferredMultiSpotLightProgram.enableTexture(LLShaderMgr::DEFERRED_PROJECTION);
+
+ mDeferredVB->setBuffer(LLVertexBuffer::MAP_VERTEX);
for (LLDrawable::drawable_list_t::iterator iter = fullscreen_spot_lights.begin(); iter != fullscreen_spot_lights.end(); ++iter)
{
@@ -7586,64 +7679,24 @@ void LLPipeline::renderDeferredLighting()
setupSpotLight(gDeferredMultiSpotLightProgram, drawablep);
LLColor3 col = volume->getLightColor();
- col *= volume->getLightIntensity();
-
- glTexCoord4f(tc.v[0], tc.v[1], tc.v[2], s*s);
- glColor4f(col.mV[0], col.mV[1], col.mV[2], volume->getLightFalloff()*0.5f);
- glDrawArrays(GL_TRIANGLE_STRIP, 0, 3);
+
+ gDeferredMultiSpotLightProgram.uniform3fv(LLShaderMgr::LIGHT_CENTER, 1, tc.v);
+ gDeferredMultiSpotLightProgram.uniform1f(LLShaderMgr::LIGHT_SIZE, s*s);
+ gDeferredMultiSpotLightProgram.uniform3fv(LLShaderMgr::DIFFUSE_COLOR, 1, col.mV);
+ gDeferredMultiSpotLightProgram.uniform1f(LLShaderMgr::LIGHT_FALLOFF, volume->getLightFalloff()*0.5f);
+ mDeferredVB->drawArrays(LLRender::TRIANGLES, 0, 3);
}
- gDeferredMultiSpotLightProgram.disableTexture(LLViewerShaderMgr::DEFERRED_PROJECTION);
+ gDeferredMultiSpotLightProgram.disableTexture(LLShaderMgr::DEFERRED_PROJECTION);
unbindDeferredShader(gDeferredMultiSpotLightProgram);
- glPopMatrix();
- glMatrixMode(GL_MODELVIEW);
- glPopMatrix();
+ gGL.popMatrix();
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
+ gGL.popMatrix();
}
}
gGL.setColorMask(true, true);
-
- if (LLViewerShaderMgr::instance()->getVertexShaderLevel(LLViewerShaderMgr::SHADER_DEFERRED) > 2)
- {
- mDeferredLight[2].flush();
-
- mScreen.bindTarget();
- mScreen.clear(GL_COLOR_BUFFER_BIT);
-
- gGL.setSceneBlendType(LLRender::BT_ALPHA);
-
- { //mix various light maps (local, sun, gi)
- LLFastTimer ftm(FTM_POST);
- LLGLDisable blend(GL_BLEND);
- LLGLDisable test(GL_ALPHA_TEST);
- LLGLDepthTest depth(GL_FALSE);
- LLGLDisable stencil(GL_STENCIL_TEST);
-
- bindDeferredShader(gDeferredPostProgram, 0, &mGIMapPost[0]);
-
- gDeferredPostProgram.bind();
-
- LLVertexBuffer::unbind();
-
- glVertexPointer(2, GL_FLOAT, 0, vert);
- glColor3f(1,1,1);
-
- glPushMatrix();
- glLoadIdentity();
- glMatrixMode(GL_PROJECTION);
- glPushMatrix();
- glLoadIdentity();
-
- glDrawArrays(GL_TRIANGLES, 0, 3);
-
- glPopMatrix();
- glMatrixMode(GL_MODELVIEW);
- glPopMatrix();
-
- unbindDeferredShader(gDeferredPostProgram);
- }
- }
}
{ //render non-deferred geometry (alpha, fullbright, glow)
@@ -7759,13 +7812,13 @@ void LLPipeline::setupSpotLight(LLGLSLShader& shader, LLDrawable* drawablep)
F32 proj_range = far_clip - near_clip;
glh::matrix4f light_proj = gl_perspective(fovy, aspect, near_clip, far_clip);
screen_to_light = trans * light_proj * screen_to_light;
- shader.uniformMatrix4fv("proj_mat", 1, FALSE, screen_to_light.m);
- shader.uniform1f("proj_near", near_clip);
- shader.uniform3fv("proj_p", 1, p1.v);
- shader.uniform3fv("proj_n", 1, n.v);
- shader.uniform3fv("proj_origin", 1, screen_origin.v);
- shader.uniform1f("proj_range", proj_range);
- shader.uniform1f("proj_ambiance", params.mV[2]);
+ shader.uniformMatrix4fv(LLShaderMgr::PROJECTOR_MATRIX, 1, FALSE, screen_to_light.m);
+ shader.uniform1f(LLShaderMgr::PROJECTOR_NEAR, near_clip);
+ shader.uniform3fv(LLShaderMgr::PROJECTOR_P, 1, p1.v);
+ shader.uniform3fv(LLShaderMgr::PROJECTOR_N, 1, n.v);
+ shader.uniform3fv(LLShaderMgr::PROJECTOR_ORIGIN, 1, screen_origin.v);
+ shader.uniform1f(LLShaderMgr::PROJECTOR_RANGE, proj_range);
+ shader.uniform1f(LLShaderMgr::PROJECTOR_AMBIANCE, params.mV[2]);
S32 s_idx = -1;
for (U32 i = 0; i < 2; i++)
@@ -7776,15 +7829,15 @@ void LLPipeline::setupSpotLight(LLGLSLShader& shader, LLDrawable* drawablep)
}
}
- shader.uniform1i("proj_shadow_idx", s_idx);
+ shader.uniform1i(LLShaderMgr::PROJECTOR_SHADOW_INDEX, s_idx);
if (s_idx >= 0)
{
- shader.uniform1f("shadow_fade", 1.f-mSpotLightFade[s_idx]);
+ shader.uniform1f(LLShaderMgr::PROJECTOR_SHADOW_FADE, 1.f-mSpotLightFade[s_idx]);
}
else
{
- shader.uniform1f("shadow_fade", 1.f);
+ shader.uniform1f(LLShaderMgr::PROJECTOR_SHADOW_FADE, 1.f);
}
{
@@ -7818,7 +7871,7 @@ void LLPipeline::setupSpotLight(LLGLSLShader& shader, LLDrawable* drawablep)
img = LLViewerFetchedTexture::sWhiteImagep;
}
- S32 channel = shader.enableTexture(LLViewerShaderMgr::DEFERRED_PROJECTION);
+ S32 channel = shader.enableTexture(LLShaderMgr::DEFERRED_PROJECTION);
if (channel > -1)
{
@@ -7828,9 +7881,9 @@ void LLPipeline::setupSpotLight(LLGLSLShader& shader, LLDrawable* drawablep)
F32 lod_range = logf(img->getWidth())/logf(2.f);
- shader.uniform1f("proj_focus", focus);
- shader.uniform1f("proj_lod", lod_range);
- shader.uniform1f("proj_ambient_lod", llclamp((proj_range-focus)/proj_range*lod_range, 0.f, 1.f));
+ shader.uniform1f(LLShaderMgr::PROJECTOR_FOCUS, focus);
+ shader.uniform1f(LLShaderMgr::PROJECTOR_LOD, lod_range);
+ shader.uniform1f(LLShaderMgr::PROJECTOR_AMBIENT_LOD, llclamp((proj_range-focus)/proj_range*lod_range, 0.f, 1.f));
}
}
@@ -7839,33 +7892,17 @@ void LLPipeline::setupSpotLight(LLGLSLShader& shader, LLDrawable* drawablep)
void LLPipeline::unbindDeferredShader(LLGLSLShader &shader)
{
stop_glerror();
- shader.disableTexture(LLViewerShaderMgr::DEFERRED_NORMAL, mDeferredScreen.getUsage());
- shader.disableTexture(LLViewerShaderMgr::DEFERRED_DIFFUSE, mDeferredScreen.getUsage());
- shader.disableTexture(LLViewerShaderMgr::DEFERRED_SPECULAR, mDeferredScreen.getUsage());
- shader.disableTexture(LLViewerShaderMgr::DEFERRED_DEPTH, mDeferredScreen.getUsage());
- shader.disableTexture(LLViewerShaderMgr::DEFERRED_LIGHT, mDeferredLight[0].getUsage());
- shader.disableTexture(LLViewerShaderMgr::DEFERRED_GI_LIGHT, LLTexUnit::TT_RECT_TEXTURE);
- shader.disableTexture(LLViewerShaderMgr::DEFERRED_EDGE, mEdgeMap.getUsage());
- shader.disableTexture(LLViewerShaderMgr::DEFERRED_SUN_LIGHT, mDeferredLight[1].getUsage());
- shader.disableTexture(LLViewerShaderMgr::DEFERRED_LOCAL_LIGHT, mDeferredLight[2].getUsage());
- shader.disableTexture(LLViewerShaderMgr::DEFERRED_LUMINANCE);
- shader.disableTexture(LLViewerShaderMgr::DIFFUSE_MAP);
- shader.disableTexture(LLViewerShaderMgr::DEFERRED_GI_MIP);
- shader.disableTexture(LLViewerShaderMgr::DEFERRED_BLOOM);
- shader.disableTexture(LLViewerShaderMgr::DEFERRED_GI_NORMAL);
- shader.disableTexture(LLViewerShaderMgr::DEFERRED_GI_DIFFUSE);
- shader.disableTexture(LLViewerShaderMgr::DEFERRED_GI_SPECULAR);
- shader.disableTexture(LLViewerShaderMgr::DEFERRED_GI_DEPTH);
- shader.disableTexture(LLViewerShaderMgr::DEFERRED_GI_MIN_POS);
- shader.disableTexture(LLViewerShaderMgr::DEFERRED_GI_MAX_POS);
- shader.disableTexture(LLViewerShaderMgr::DEFERRED_GI_LAST_NORMAL);
- shader.disableTexture(LLViewerShaderMgr::DEFERRED_GI_LAST_DIFFUSE);
- shader.disableTexture(LLViewerShaderMgr::DEFERRED_GI_LAST_MIN_POS);
- shader.disableTexture(LLViewerShaderMgr::DEFERRED_GI_LAST_MAX_POS);
+ shader.disableTexture(LLShaderMgr::DEFERRED_NORMAL, mDeferredScreen.getUsage());
+ shader.disableTexture(LLShaderMgr::DEFERRED_DIFFUSE, mDeferredScreen.getUsage());
+ shader.disableTexture(LLShaderMgr::DEFERRED_SPECULAR, mDeferredScreen.getUsage());
+ shader.disableTexture(LLShaderMgr::DEFERRED_DEPTH, mDeferredScreen.getUsage());
+ shader.disableTexture(LLShaderMgr::DEFERRED_LIGHT, mDeferredLight.getUsage());
+ shader.disableTexture(LLShaderMgr::DIFFUSE_MAP);
+ shader.disableTexture(LLShaderMgr::DEFERRED_BLOOM);
for (U32 i = 0; i < 4; i++)
{
- if (shader.disableTexture(LLViewerShaderMgr::DEFERRED_SHADOW0+i, LLTexUnit::TT_RECT_TEXTURE) > -1)
+ if (shader.disableTexture(LLShaderMgr::DEFERRED_SHADOW0+i, LLTexUnit::TT_RECT_TEXTURE) > -1)
{
glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_COMPARE_MODE_ARB, GL_NONE);
}
@@ -7873,16 +7910,16 @@ void LLPipeline::unbindDeferredShader(LLGLSLShader &shader)
for (U32 i = 4; i < 6; i++)
{
- if (shader.disableTexture(LLViewerShaderMgr::DEFERRED_SHADOW0+i) > -1)
+ if (shader.disableTexture(LLShaderMgr::DEFERRED_SHADOW0+i) > -1)
{
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE_ARB, GL_NONE);
}
}
- shader.disableTexture(LLViewerShaderMgr::DEFERRED_NOISE);
- shader.disableTexture(LLViewerShaderMgr::DEFERRED_LIGHTFUNC);
+ shader.disableTexture(LLShaderMgr::DEFERRED_NOISE);
+ shader.disableTexture(LLShaderMgr::DEFERRED_LIGHTFUNC);
- S32 channel = shader.disableTexture(LLViewerShaderMgr::ENVIRONMENT_MAP, LLTexUnit::TT_CUBE_MAP);
+ S32 channel = shader.disableTexture(LLShaderMgr::ENVIRONMENT_MAP, LLTexUnit::TT_CUBE_MAP);
if (channel > -1)
{
LLCubeMap* cube_map = gSky.mVOSkyp ? gSky.mVOSkyp->getCubeMap() : NULL;
@@ -7908,11 +7945,11 @@ void LLPipeline::generateWaterReflection(LLCamera& camera_in)
if (LLPipeline::sWaterReflections && assertInitialized() && LLDrawPoolWater::sNeedsReflectionUpdate)
{
BOOL skip_avatar_update = FALSE;
- if (!isAgentAvatarValid() || gAgentCamera.getCameraAnimating() || gAgentCamera.getCameraMode() != CAMERA_MODE_MOUSELOOK)
+ if (!isAgentAvatarValid() || gAgentCamera.getCameraAnimating() || gAgentCamera.getCameraMode() != CAMERA_MODE_MOUSELOOK || !LLVOAvatar::sVisibleInFirstPerson)
{
skip_avatar_update = TRUE;
}
-
+
if (!skip_avatar_update)
{
gAgentAvatarp->updateAttachmentVisibility(CAMERA_MODE_THIRD_PERSON);
@@ -7977,7 +8014,7 @@ void LLPipeline::generateWaterReflection(LLCamera& camera_in)
stop_glerror();
- glPushMatrix();
+ gGL.pushMatrix();
mat.set_scale(glh::vec3f(1,1,-1));
mat.set_translate(glh::vec3f(0,0,height*2.f));
@@ -7987,7 +8024,7 @@ void LLPipeline::generateWaterReflection(LLCamera& camera_in)
mat = current * mat;
glh_set_current_modelview(mat);
- glLoadMatrixf(mat.m);
+ gGL.loadMatrix(mat.m);
LLViewerCamera::updateFrustumPlanes(camera, FALSE, TRUE);
@@ -8030,7 +8067,7 @@ void LLPipeline::generateWaterReflection(LLCamera& camera_in)
LLPipeline::RENDER_TYPE_CLOUDS,
LLPipeline::END_RENDER_TYPES);
- S32 detail = gSavedSettings.getS32("RenderReflectionDetail");
+ S32 detail = RenderReflectionDetail;
if (detail > 0)
{ //mask out selected geometry based on reflection detail
if (detail < 4)
@@ -8054,7 +8091,7 @@ void LLPipeline::generateWaterReflection(LLCamera& camera_in)
if (LLDrawPoolWater::sNeedsDistortionUpdate)
{
- if (gSavedSettings.getS32("RenderReflectionDetail") > 0)
+ if (RenderReflectionDetail > 0)
{
gPipeline.grabReferences(ref_result);
LLGLUserClipPlane clip_plane(plane, mat, projection);
@@ -8065,7 +8102,7 @@ void LLPipeline::generateWaterReflection(LLCamera& camera_in)
gPipeline.popRenderTypeMask();
}
glCullFace(GL_BACK);
- glPopMatrix();
+ gGL.popMatrix();
mWaterRef.flush();
glh_set_current_modelview(current);
LLPipeline::sUseOcclusion = occlusion;
@@ -8234,7 +8271,14 @@ void LLPipeline::renderShadow(glh::matrix4f& view, glh::matrix4f& proj, LLCamera
}
LLPipeline::sShadowRender = TRUE;
- U32 types[] = { LLRenderPass::PASS_SIMPLE, LLRenderPass::PASS_FULLBRIGHT, LLRenderPass::PASS_SHINY, LLRenderPass::PASS_BUMP, LLRenderPass::PASS_FULLBRIGHT_SHINY };
+ U32 types[] = {
+ LLRenderPass::PASS_SIMPLE,
+ LLRenderPass::PASS_FULLBRIGHT,
+ LLRenderPass::PASS_SHINY,
+ LLRenderPass::PASS_BUMP,
+ LLRenderPass::PASS_FULLBRIGHT_SHINY
+ };
+
LLGLEnable cull(GL_CULL_FACE);
if (use_shader)
@@ -8246,12 +8290,12 @@ void LLPipeline::renderShadow(glh::matrix4f& view, glh::matrix4f& proj, LLCamera
stateSort(shadow_cam, result);
//generate shadow map
- glMatrixMode(GL_PROJECTION);
- glPushMatrix();
- glLoadMatrixf(proj.m);
- glMatrixMode(GL_MODELVIEW);
- glPushMatrix();
- glLoadMatrixd(gGLModelView);
+ gGL.matrixMode(LLRender::MM_PROJECTION);
+ gGL.pushMatrix();
+ gGL.loadMatrix(proj.m);
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
+ gGL.pushMatrix();
+ gGL.loadMatrix(gGLModelView);
stop_glerror();
gGLLastMatrix = NULL;
@@ -8262,12 +8306,8 @@ void LLPipeline::renderShadow(glh::matrix4f& view, glh::matrix4f& proj, LLCamera
}
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
-
- glColor4f(1,1,1,1);
stop_glerror();
-
- gGL.setColorMask(false, false);
//glCullFace(GL_FRONT);
@@ -8278,6 +8318,10 @@ void LLPipeline::renderShadow(glh::matrix4f& view, glh::matrix4f& proj, LLCamera
{ //occlusion program is general purpose depth-only no-textures
gOcclusionProgram.bind();
}
+
+ gGL.diffuseColor4f(1,1,1,1);
+ gGL.setColorMask(false, false);
+
LLFastTimer ftm(FTM_SHADOW_SIMPLE);
gGL.getTexUnit(0)->disable();
for (U32 i = 0; i < sizeof(types)/sizeof(U32); ++i)
@@ -8305,16 +8349,26 @@ void LLPipeline::renderShadow(glh::matrix4f& view, glh::matrix4f& proj, LLCamera
{
LLFastTimer ftm(FTM_SHADOW_ALPHA);
gDeferredShadowAlphaMaskProgram.bind();
- gDeferredShadowAlphaMaskProgram.setAlphaRange(0.6f, 1.f);
- renderObjects(LLRenderPass::PASS_ALPHA_SHADOW, LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0 | LLVertexBuffer::MAP_COLOR, TRUE);
- glColor4f(1,1,1,1);
+ gDeferredShadowAlphaMaskProgram.setMinimumAlpha(0.598f);
+
+ U32 mask = LLVertexBuffer::MAP_VERTEX |
+ LLVertexBuffer::MAP_TEXCOORD0 |
+ LLVertexBuffer::MAP_COLOR |
+ LLVertexBuffer::MAP_TEXTURE_INDEX;
+
+ renderObjects(LLRenderPass::PASS_ALPHA_MASK, mask, TRUE, TRUE);
+ renderObjects(LLRenderPass::PASS_FULLBRIGHT_ALPHA_MASK, mask, TRUE, TRUE);
+ renderObjects(LLRenderPass::PASS_ALPHA, mask, TRUE, TRUE);
+ gDeferredTreeShadowProgram.bind();
+ gDeferredTreeShadowProgram.setMinimumAlpha(0.598f);
renderObjects(LLRenderPass::PASS_GRASS, LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0, TRUE);
}
//glCullFace(GL_BACK);
+ gDeferredShadowProgram.bind();
gGLLastMatrix = NULL;
- glLoadMatrixd(gGLModelView);
+ gGL.loadMatrix(gGLModelView);
doOcclusion(shadow_cam);
if (use_shader)
@@ -8324,10 +8378,10 @@ void LLPipeline::renderShadow(glh::matrix4f& view, glh::matrix4f& proj, LLCamera
gGL.setColorMask(true, true);
- glMatrixMode(GL_PROJECTION);
- glPopMatrix();
- glMatrixMode(GL_MODELVIEW);
- glPopMatrix();
+ gGL.matrixMode(LLRender::MM_PROJECTION);
+ gGL.popMatrix();
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
+ gGL.popMatrix();
gGLLastMatrix = NULL;
LLPipeline::sUseOcclusion = occlude;
@@ -8509,184 +8563,6 @@ BOOL LLPipeline::getVisiblePointCloud(LLCamera& camera, LLVector3& min, LLVector
return TRUE;
}
-void LLPipeline::generateGI(LLCamera& camera, LLVector3& lightDir, std::vector<LLVector3>& vpc)
-{
- if (LLViewerShaderMgr::instance()->getVertexShaderLevel(LLViewerShaderMgr::SHADER_DEFERRED) < 3)
- {
- return;
- }
-
- LLVector3 up;
-
- //LLGLEnable depth_clamp(GL_DEPTH_CLAMP_NV);
-
- if (lightDir.mV[2] > 0.5f)
- {
- up = LLVector3(1,0,0);
- }
- else
- {
- up = LLVector3(0, 0, 1);
- }
-
-
- F32 gi_range = gSavedSettings.getF32("RenderGIRange");
-
- U32 res = mGIMap.getWidth();
-
- F32 atten = llmax(gSavedSettings.getF32("RenderGIAttenuation"), 0.001f);
-
- //set radius to range at which distance attenuation of incoming photons is near 0
-
- F32 lrad = sqrtf(1.f/(atten*0.01f));
-
- F32 lrange = lrad+gi_range*0.5f;
-
- LLVector3 pad(lrange,lrange,lrange);
-
- glh::matrix4f view = look(LLVector3(128.f,128.f,128.f), lightDir, up);
-
- LLVector3 cp = camera.getOrigin()+camera.getAtAxis()*(gi_range*0.5f);
-
- glh::vec3f scp(cp.mV);
- view.mult_matrix_vec(scp);
- cp.setVec(scp.v);
-
- F32 pix_width = lrange/(res*0.5f);
-
- //move cp to the nearest pix_width
- for (U32 i = 0; i < 3; i++)
- {
- cp.mV[i] = llround(cp.mV[i], pix_width);
- }
-
- LLVector3 min = cp-pad;
- LLVector3 max = cp+pad;
-
- //set mGIRange to range in tc space[0,1] that covers texture block of intersecting lights around a point
- mGIRange.mV[0] = (max.mV[0]-min.mV[0])/res;
- mGIRange.mV[1] = (max.mV[1]-min.mV[1])/res;
- mGILightRadius = lrad/lrange*0.5f;
-
- glh::matrix4f proj = gl_ortho(min.mV[0], max.mV[0],
- min.mV[1], max.mV[1],
- -max.mV[2], -min.mV[2]);
-
- LLCamera sun_cam = camera;
-
- glh::matrix4f eye_view = glh_get_current_modelview();
-
- //get eye space to camera space matrix
- mGIMatrix = view*eye_view.inverse();
- mGINormalMatrix = mGIMatrix.inverse().transpose();
- mGIInvProj = proj.inverse();
- mGIMatrixProj = proj*mGIMatrix;
-
- //translate and scale to [0,1]
- glh::matrix4f trans(.5f, 0.f, 0.f, .5f,
- 0.f, 0.5f, 0.f, 0.5f,
- 0.f, 0.f, 0.5f, 0.5f,
- 0.f, 0.f, 0.f, 1.f);
-
- mGIMatrixProj = trans*mGIMatrixProj;
-
- glh_set_current_modelview(view);
- glh_set_current_projection(proj);
-
- LLViewerCamera::updateFrustumPlanes(sun_cam, TRUE, FALSE, TRUE);
-
- sun_cam.ignoreAgentFrustumPlane(LLCamera::AGENT_PLANE_NEAR);
- static LLCullResult result;
-
- pushRenderTypeMask();
-
- andRenderTypeMask(LLPipeline::RENDER_TYPE_SIMPLE,
- LLPipeline::RENDER_TYPE_FULLBRIGHT,
- LLPipeline::RENDER_TYPE_BUMP,
- LLPipeline::RENDER_TYPE_VOLUME,
- LLPipeline::RENDER_TYPE_TREE,
- LLPipeline::RENDER_TYPE_TERRAIN,
- LLPipeline::RENDER_TYPE_WATER,
- LLPipeline::RENDER_TYPE_VOIDWATER,
- LLPipeline::RENDER_TYPE_PASS_ALPHA_SHADOW,
- LLPipeline::RENDER_TYPE_AVATAR,
- LLPipeline::RENDER_TYPE_PASS_SIMPLE,
- LLPipeline::RENDER_TYPE_PASS_BUMP,
- LLPipeline::RENDER_TYPE_PASS_FULLBRIGHT,
- LLPipeline::RENDER_TYPE_PASS_SHINY,
- END_RENDER_TYPES);
-
-
-
- S32 occlude = LLPipeline::sUseOcclusion;
- //LLPipeline::sUseOcclusion = 0;
- LLPipeline::sShadowRender = TRUE;
-
- //only render large objects into GI map
- sMinRenderSize = gSavedSettings.getF32("RenderGIMinRenderSize");
-
- LLViewerCamera::sCurCameraID = LLViewerCamera::CAMERA_GI_SOURCE;
- mGIMap.bindTarget();
-
- F64 last_modelview[16];
- F64 last_projection[16];
- for (U32 i = 0; i < 16; i++)
- {
- last_modelview[i] = gGLLastModelView[i];
- last_projection[i] = gGLLastProjection[i];
- gGLLastModelView[i] = mGIModelview.m[i];
- gGLLastProjection[i] = mGIProjection.m[i];
- }
-
- sun_cam.setOrigin(0.f, 0.f, 0.f);
- updateCull(sun_cam, result);
- stateSort(sun_cam, result);
-
- for (U32 i = 0; i < 16; i++)
- {
- gGLLastModelView[i] = last_modelview[i];
- gGLLastProjection[i] = last_projection[i];
- }
-
- mGIProjection = proj;
- mGIModelview = view;
-
- LLGLEnable cull(GL_CULL_FACE);
-
- //generate GI map
- glMatrixMode(GL_PROJECTION);
- glPushMatrix();
- glLoadMatrixf(proj.m);
- glMatrixMode(GL_MODELVIEW);
- glPushMatrix();
- glLoadMatrixf(view.m);
-
- stop_glerror();
- gGLLastMatrix = NULL;
-
- mGIMap.clear();
-
- {
- //LLGLEnable enable(GL_DEPTH_CLAMP_NV);
- renderGeomDeferred(camera);
- }
-
- mGIMap.flush();
-
- glMatrixMode(GL_PROJECTION);
- glPopMatrix();
- glMatrixMode(GL_MODELVIEW);
- glPopMatrix();
- gGLLastMatrix = NULL;
-
- LLPipeline::sUseOcclusion = occlude;
- LLPipeline::sShadowRender = FALSE;
- sMinRenderSize = 0.f;
-
- popRenderTypeMask();
-
-}
-
void LLPipeline::renderHighlight(const LLViewerObject* obj, F32 fade)
{
if (obj && obj->getVolume())
@@ -8721,7 +8597,7 @@ void LLPipeline::generateHighlight(LLCamera& camera)
if (!mHighlightSet.empty())
{
- F32 transition = gFrameIntervalSeconds/gSavedSettings.getF32("RenderHighlightFadeTime");
+ F32 transition = gFrameIntervalSeconds/RenderHighlightFadeTime;
LLGLDisable test(GL_ALPHA_TEST);
LLGLDepthTest depth(GL_FALSE);
@@ -8767,11 +8643,23 @@ void LLPipeline::generateHighlight(LLCamera& camera)
void LLPipeline::generateSunShadow(LLCamera& camera)
{
- if (!sRenderDeferred || gSavedSettings.getS32("RenderShadowDetail") <= 0)
+ if (!sRenderDeferred || RenderShadowDetail <= 0)
{
return;
}
+ BOOL skip_avatar_update = FALSE;
+ if (!isAgentAvatarValid() || gAgentCamera.getCameraAnimating() || gAgentCamera.getCameraMode() != CAMERA_MODE_MOUSELOOK || !LLVOAvatar::sVisibleInFirstPerson)
+ {
+
+ skip_avatar_update = TRUE;
+ }
+
+ if (!skip_avatar_update)
+ {
+ gAgentAvatarp->updateAttachmentVisibility(CAMERA_MODE_THIRD_PERSON);
+ }
+
F64 last_modelview[16];
F64 last_projection[16];
for (U32 i = 0; i < 16; i++)
@@ -8792,7 +8680,9 @@ void LLPipeline::generateSunShadow(LLCamera& camera)
LLPipeline::RENDER_TYPE_TERRAIN,
LLPipeline::RENDER_TYPE_WATER,
LLPipeline::RENDER_TYPE_VOIDWATER,
- LLPipeline::RENDER_TYPE_PASS_ALPHA_SHADOW,
+ LLPipeline::RENDER_TYPE_PASS_ALPHA,
+ LLPipeline::RENDER_TYPE_PASS_ALPHA_MASK,
+ LLPipeline::RENDER_TYPE_PASS_FULLBRIGHT_ALPHA_MASK,
LLPipeline::RENDER_TYPE_PASS_GRASS,
LLPipeline::RENDER_TYPE_PASS_SIMPLE,
LLPipeline::RENDER_TYPE_PASS_BUMP,
@@ -8814,25 +8704,25 @@ void LLPipeline::generateSunShadow(LLCamera& camera)
glh::matrix4f proj[6];
//clip contains parallel split distances for 3 splits
- LLVector3 clip = gSavedSettings.getVector3("RenderShadowClipPlanes");
+ LLVector3 clip = RenderShadowClipPlanes;
//F32 slope_threshold = gSavedSettings.getF32("RenderShadowSlopeThreshold");
//far clip on last split is minimum of camera view distance and 128
mSunClipPlanes = LLVector4(clip, clip.mV[2] * clip.mV[2]/clip.mV[1]);
- clip = gSavedSettings.getVector3("RenderShadowOrthoClipPlanes");
+ clip = RenderShadowOrthoClipPlanes;
mSunOrthoClipPlanes = LLVector4(clip, clip.mV[2]*clip.mV[2]/clip.mV[1]);
//currently used for amount to extrude frusta corners for constructing shadow frusta
- LLVector3 n = gSavedSettings.getVector3("RenderShadowNearDist");
+ LLVector3 n = RenderShadowNearDist;
//F32 nearDist[] = { n.mV[0], n.mV[1], n.mV[2], n.mV[2] };
//put together a universal "near clip" plane for shadow frusta
LLPlane shadow_near_clip;
{
LLVector3 p = gAgent.getPositionAgent();
- p += mSunDir * gSavedSettings.getF32("RenderFarClip")*2.f;
+ p += mSunDir * RenderFarClip*2.f;
shadow_near_clip.setVec(p, mSunDir);
}
@@ -8885,11 +8775,15 @@ void LLPipeline::generateSunShadow(LLCamera& camera)
mShadowFrustPoints[3].clear();
}
popRenderTypeMask();
+
+ if (!skip_avatar_update)
+ {
+ gAgentAvatarp->updateAttachmentVisibility(gAgentCamera.getCameraMode());
+ }
+
return;
}
- generateGI(camera, lightDir, fp);
-
//get good split distances for frustum
for (U32 i = 0; i < fp.size(); ++i)
{
@@ -8915,7 +8809,7 @@ void LLPipeline::generateSunShadow(LLCamera& camera)
F32 range = far_clip-near_clip;
- LLVector3 split_exp = gSavedSettings.getVector3("RenderShadowSplitExponent");
+ LLVector3 split_exp = RenderShadowSplitExponent;
F32 da = 1.f-llmax( fabsf(lightDir*up), fabsf(lightDir*camera.getLeftAxis()) );
@@ -8936,384 +8830,399 @@ void LLPipeline::generateSunShadow(LLCamera& camera)
// convenience array of 4 near clip plane distances
F32 dist[] = { near_clip, mSunClipPlanes.mV[0], mSunClipPlanes.mV[1], mSunClipPlanes.mV[2], mSunClipPlanes.mV[3] };
- for (S32 j = 0; j < 4; j++)
- {
- if (!hasRenderDebugMask(RENDER_DEBUG_SHADOW_FRUSTA))
+
+ if (mSunDiffuse == LLColor4::black)
+ { //sun diffuse is totally black, shadows don't matter
+ LLGLDepthTest depth(GL_TRUE);
+
+ for (S32 j = 0; j < 4; j++)
{
- mShadowFrustPoints[j].clear();
+ mShadow[j].bindTarget();
+ mShadow[j].clear();
+ mShadow[j].flush();
}
+ }
+ else
+ {
+ for (S32 j = 0; j < 4; j++)
+ {
+ if (!hasRenderDebugMask(RENDER_DEBUG_SHADOW_FRUSTA))
+ {
+ mShadowFrustPoints[j].clear();
+ }
- LLViewerCamera::sCurCameraID = LLViewerCamera::CAMERA_SHADOW0+j;
+ LLViewerCamera::sCurCameraID = LLViewerCamera::CAMERA_SHADOW0+j;
- //restore render matrices
- glh_set_current_modelview(saved_view);
- glh_set_current_projection(saved_proj);
+ //restore render matrices
+ glh_set_current_modelview(saved_view);
+ glh_set_current_projection(saved_proj);
- LLVector3 eye = camera.getOrigin();
+ LLVector3 eye = camera.getOrigin();
- //camera used for shadow cull/render
- LLCamera shadow_cam;
+ //camera used for shadow cull/render
+ LLCamera shadow_cam;
- //create world space camera frustum for this split
- shadow_cam = camera;
- shadow_cam.setFar(16.f);
+ //create world space camera frustum for this split
+ shadow_cam = camera;
+ shadow_cam.setFar(16.f);
- LLViewerCamera::updateFrustumPlanes(shadow_cam, FALSE, FALSE, TRUE);
+ LLViewerCamera::updateFrustumPlanes(shadow_cam, FALSE, FALSE, TRUE);
- LLVector3* frust = shadow_cam.mAgentFrustum;
+ LLVector3* frust = shadow_cam.mAgentFrustum;
- LLVector3 pn = shadow_cam.getAtAxis();
+ LLVector3 pn = shadow_cam.getAtAxis();
- LLVector3 min, max;
+ LLVector3 min, max;
- //construct 8 corners of split frustum section
- for (U32 i = 0; i < 4; i++)
- {
- LLVector3 delta = frust[i+4]-eye;
- delta += (frust[i+4]-frust[(i+2)%4+4])*0.05f;
- delta.normVec();
- F32 dp = delta*pn;
- frust[i] = eye + (delta*dist[j]*0.95f)/dp;
- frust[i+4] = eye + (delta*dist[j+1]*1.05f)/dp;
- }
+ //construct 8 corners of split frustum section
+ for (U32 i = 0; i < 4; i++)
+ {
+ LLVector3 delta = frust[i+4]-eye;
+ delta += (frust[i+4]-frust[(i+2)%4+4])*0.05f;
+ delta.normVec();
+ F32 dp = delta*pn;
+ frust[i] = eye + (delta*dist[j]*0.95f)/dp;
+ frust[i+4] = eye + (delta*dist[j+1]*1.05f)/dp;
+ }
- shadow_cam.calcAgentFrustumPlanes(frust);
- shadow_cam.mFrustumCornerDist = 0.f;
+ shadow_cam.calcAgentFrustumPlanes(frust);
+ shadow_cam.mFrustumCornerDist = 0.f;
- if (!gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_SHADOW_FRUSTA))
- {
- mShadowCamera[j] = shadow_cam;
- }
-
- std::vector<LLVector3> fp;
-
- if (!gPipeline.getVisiblePointCloud(shadow_cam, min, max, fp, lightDir))
- {
- //no possible shadow receivers
if (!gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_SHADOW_FRUSTA))
{
- mShadowExtents[j][0] = LLVector3();
- mShadowExtents[j][1] = LLVector3();
- mShadowCamera[j+4] = shadow_cam;
- }
-
- mShadow[j].bindTarget();
- {
- LLGLDepthTest depth(GL_TRUE);
- mShadow[j].clear();
+ mShadowCamera[j] = shadow_cam;
}
- mShadow[j].flush();
- mShadowError.mV[j] = 0.f;
- mShadowFOV.mV[j] = 0.f;
+ std::vector<LLVector3> fp;
- continue;
- }
+ if (!gPipeline.getVisiblePointCloud(shadow_cam, min, max, fp, lightDir))
+ {
+ //no possible shadow receivers
+ if (!gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_SHADOW_FRUSTA))
+ {
+ mShadowExtents[j][0] = LLVector3();
+ mShadowExtents[j][1] = LLVector3();
+ mShadowCamera[j+4] = shadow_cam;
+ }
- if (!gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_SHADOW_FRUSTA))
- {
- mShadowExtents[j][0] = min;
- mShadowExtents[j][1] = max;
- mShadowFrustPoints[j] = fp;
- }
-
+ mShadow[j].bindTarget();
+ {
+ LLGLDepthTest depth(GL_TRUE);
+ mShadow[j].clear();
+ }
+ mShadow[j].flush();
- //find a good origin for shadow projection
- LLVector3 origin;
+ mShadowError.mV[j] = 0.f;
+ mShadowFOV.mV[j] = 0.f;
- //get a temporary view projection
- view[j] = look(camera.getOrigin(), lightDir, -up);
+ continue;
+ }
- std::vector<LLVector3> wpf;
+ if (!gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_SHADOW_FRUSTA))
+ {
+ mShadowExtents[j][0] = min;
+ mShadowExtents[j][1] = max;
+ mShadowFrustPoints[j] = fp;
+ }
+
- for (U32 i = 0; i < fp.size(); i++)
- {
- glh::vec3f p = glh::vec3f(fp[i].mV);
- view[j].mult_matrix_vec(p);
- wpf.push_back(LLVector3(p.v));
- }
+ //find a good origin for shadow projection
+ LLVector3 origin;
- min = wpf[0];
- max = wpf[0];
+ //get a temporary view projection
+ view[j] = look(camera.getOrigin(), lightDir, -up);
- for (U32 i = 0; i < fp.size(); ++i)
- { //get AABB in camera space
- update_min_max(min, max, wpf[i]);
- }
-
- // Construct a perspective transform with perspective along y-axis that contains
- // points in wpf
- //Known:
- // - far clip plane
- // - near clip plane
- // - points in frustum
- //Find:
- // - origin
-
- //get some "interesting" points of reference
- LLVector3 center = (min+max)*0.5f;
- LLVector3 size = (max-min)*0.5f;
- LLVector3 near_center = center;
- near_center.mV[1] += size.mV[1]*2.f;
-
-
- //put all points in wpf in quadrant 0, reletive to center of min/max
- //get the best fit line using least squares
- F32 bfm = 0.f;
- F32 bfb = 0.f;
+ std::vector<LLVector3> wpf;
- for (U32 i = 0; i < wpf.size(); ++i)
- {
- wpf[i] -= center;
- wpf[i].mV[0] = fabsf(wpf[i].mV[0]);
- wpf[i].mV[2] = fabsf(wpf[i].mV[2]);
- }
-
- if (!wpf.empty())
- {
- F32 sx = 0.f;
- F32 sx2 = 0.f;
- F32 sy = 0.f;
- F32 sxy = 0.f;
-
- for (U32 i = 0; i < wpf.size(); ++i)
- {
- sx += wpf[i].mV[0];
- sx2 += wpf[i].mV[0]*wpf[i].mV[0];
- sy += wpf[i].mV[1];
- sxy += wpf[i].mV[0]*wpf[i].mV[1];
+ for (U32 i = 0; i < fp.size(); i++)
+ {
+ glh::vec3f p = glh::vec3f(fp[i].mV);
+ view[j].mult_matrix_vec(p);
+ wpf.push_back(LLVector3(p.v));
}
- bfm = (sy*sx-wpf.size()*sxy)/(sx*sx-wpf.size()*sx2);
- bfb = (sx*sxy-sy*sx2)/(sx*sx-bfm*sx2);
- }
-
- {
- // best fit line is y=bfm*x+bfb
-
- //find point that is furthest to the right of line
- F32 off_x = -1.f;
- LLVector3 lp;
-
- for (U32 i = 0; i < wpf.size(); ++i)
- {
- //y = bfm*x+bfb
- //x = (y-bfb)/bfm
- F32 lx = (wpf[i].mV[1]-bfb)/bfm;
+ min = wpf[0];
+ max = wpf[0];
- lx = wpf[i].mV[0]-lx;
-
- if (off_x < lx)
- {
- off_x = lx;
- lp = wpf[i];
- }
+ for (U32 i = 0; i < fp.size(); ++i)
+ { //get AABB in camera space
+ update_min_max(min, max, wpf[i]);
}
- //get line with slope bfm through lp
- // bfb = y-bfm*x
- bfb = lp.mV[1]-bfm*lp.mV[0];
+ // Construct a perspective transform with perspective along y-axis that contains
+ // points in wpf
+ //Known:
+ // - far clip plane
+ // - near clip plane
+ // - points in frustum
+ //Find:
+ // - origin
- //calculate error
- mShadowError.mV[j] = 0.f;
+ //get some "interesting" points of reference
+ LLVector3 center = (min+max)*0.5f;
+ LLVector3 size = (max-min)*0.5f;
+ LLVector3 near_center = center;
+ near_center.mV[1] += size.mV[1]*2.f;
+
+
+ //put all points in wpf in quadrant 0, reletive to center of min/max
+ //get the best fit line using least squares
+ F32 bfm = 0.f;
+ F32 bfb = 0.f;
for (U32 i = 0; i < wpf.size(); ++i)
{
- F32 lx = (wpf[i].mV[1]-bfb)/bfm;
- mShadowError.mV[j] += fabsf(wpf[i].mV[0]-lx);
+ wpf[i] -= center;
+ wpf[i].mV[0] = fabsf(wpf[i].mV[0]);
+ wpf[i].mV[2] = fabsf(wpf[i].mV[2]);
}
- mShadowError.mV[j] /= wpf.size();
- mShadowError.mV[j] /= size.mV[0];
+ if (!wpf.empty())
+ {
+ F32 sx = 0.f;
+ F32 sx2 = 0.f;
+ F32 sy = 0.f;
+ F32 sxy = 0.f;
+
+ for (U32 i = 0; i < wpf.size(); ++i)
+ {
+ sx += wpf[i].mV[0];
+ sx2 += wpf[i].mV[0]*wpf[i].mV[0];
+ sy += wpf[i].mV[1];
+ sxy += wpf[i].mV[0]*wpf[i].mV[1];
+ }
- if (mShadowError.mV[j] > gSavedSettings.getF32("RenderShadowErrorCutoff"))
- { //just use ortho projection
- mShadowFOV.mV[j] = -1.f;
- origin.clearVec();
- proj[j] = gl_ortho(min.mV[0], max.mV[0],
- min.mV[1], max.mV[1],
- -max.mV[2], -min.mV[2]);
+ bfm = (sy*sx-wpf.size()*sxy)/(sx*sx-wpf.size()*sx2);
+ bfb = (sx*sxy-sy*sx2)/(sx*sx-bfm*sx2);
}
- else
+
{
- //origin is where line x = 0;
- origin.setVec(0,bfb,0);
-
- F32 fovz = 1.f;
- F32 fovx = 1.f;
-
- LLVector3 zp;
- LLVector3 xp;
+ // best fit line is y=bfm*x+bfb
+
+ //find point that is furthest to the right of line
+ F32 off_x = -1.f;
+ LLVector3 lp;
for (U32 i = 0; i < wpf.size(); ++i)
{
- LLVector3 atz = wpf[i]-origin;
- atz.mV[0] = 0.f;
- atz.normVec();
- if (fovz > -atz.mV[1])
- {
- zp = wpf[i];
- fovz = -atz.mV[1];
- }
-
- LLVector3 atx = wpf[i]-origin;
- atx.mV[2] = 0.f;
- atx.normVec();
- if (fovx > -atx.mV[1])
+ //y = bfm*x+bfb
+ //x = (y-bfb)/bfm
+ F32 lx = (wpf[i].mV[1]-bfb)/bfm;
+
+ lx = wpf[i].mV[0]-lx;
+
+ if (off_x < lx)
{
- fovx = -atx.mV[1];
- xp = wpf[i];
+ off_x = lx;
+ lp = wpf[i];
}
}
- fovx = acos(fovx);
- fovz = acos(fovz);
+ //get line with slope bfm through lp
+ // bfb = y-bfm*x
+ bfb = lp.mV[1]-bfm*lp.mV[0];
- F32 cutoff = llmin(gSavedSettings.getF32("RenderShadowFOVCutoff"), 1.4f);
-
- mShadowFOV.mV[j] = fovx;
-
- if (fovx < cutoff && fovz > cutoff)
+ //calculate error
+ mShadowError.mV[j] = 0.f;
+
+ for (U32 i = 0; i < wpf.size(); ++i)
{
- //x is a good fit, but z is too big, move away from zp enough so that fovz matches cutoff
- F32 d = zp.mV[2]/tan(cutoff);
- F32 ny = zp.mV[1] + fabsf(d);
+ F32 lx = (wpf[i].mV[1]-bfb)/bfm;
+ mShadowError.mV[j] += fabsf(wpf[i].mV[0]-lx);
+ }
+
+ mShadowError.mV[j] /= wpf.size();
+ mShadowError.mV[j] /= size.mV[0];
- origin.mV[1] = ny;
+ if (mShadowError.mV[j] > RenderShadowErrorCutoff)
+ { //just use ortho projection
+ mShadowFOV.mV[j] = -1.f;
+ origin.clearVec();
+ proj[j] = gl_ortho(min.mV[0], max.mV[0],
+ min.mV[1], max.mV[1],
+ -max.mV[2], -min.mV[2]);
+ }
+ else
+ {
+ //origin is where line x = 0;
+ origin.setVec(0,bfb,0);
- fovz = 1.f;
- fovx = 1.f;
+ F32 fovz = 1.f;
+ F32 fovx = 1.f;
+
+ LLVector3 zp;
+ LLVector3 xp;
for (U32 i = 0; i < wpf.size(); ++i)
{
LLVector3 atz = wpf[i]-origin;
atz.mV[0] = 0.f;
atz.normVec();
- fovz = llmin(fovz, -atz.mV[1]);
-
+ if (fovz > -atz.mV[1])
+ {
+ zp = wpf[i];
+ fovz = -atz.mV[1];
+ }
+
LLVector3 atx = wpf[i]-origin;
atx.mV[2] = 0.f;
atx.normVec();
- fovx = llmin(fovx, -atx.mV[1]);
+ if (fovx > -atx.mV[1])
+ {
+ fovx = -atx.mV[1];
+ xp = wpf[i];
+ }
}
fovx = acos(fovx);
fovz = acos(fovz);
- mShadowFOV.mV[j] = cutoff;
- }
+ F32 cutoff = llmin((F32) RenderShadowFOVCutoff, 1.4f);
+
+ mShadowFOV.mV[j] = fovx;
+
+ if (fovx < cutoff && fovz > cutoff)
+ {
+ //x is a good fit, but z is too big, move away from zp enough so that fovz matches cutoff
+ F32 d = zp.mV[2]/tan(cutoff);
+ F32 ny = zp.mV[1] + fabsf(d);
+
+ origin.mV[1] = ny;
+
+ fovz = 1.f;
+ fovx = 1.f;
+
+ for (U32 i = 0; i < wpf.size(); ++i)
+ {
+ LLVector3 atz = wpf[i]-origin;
+ atz.mV[0] = 0.f;
+ atz.normVec();
+ fovz = llmin(fovz, -atz.mV[1]);
+
+ LLVector3 atx = wpf[i]-origin;
+ atx.mV[2] = 0.f;
+ atx.normVec();
+ fovx = llmin(fovx, -atx.mV[1]);
+ }
+
+ fovx = acos(fovx);
+ fovz = acos(fovz);
+
+ mShadowFOV.mV[j] = cutoff;
+ }
- origin += center;
+ origin += center;
- F32 ynear = -(max.mV[1]-origin.mV[1]);
- F32 yfar = -(min.mV[1]-origin.mV[1]);
+ F32 ynear = -(max.mV[1]-origin.mV[1]);
+ F32 yfar = -(min.mV[1]-origin.mV[1]);
- if (ynear < 0.1f) //keep a sensible near clip plane
- {
- F32 diff = 0.1f-ynear;
- origin.mV[1] += diff;
- ynear += diff;
- yfar += diff;
- }
+ if (ynear < 0.1f) //keep a sensible near clip plane
+ {
+ F32 diff = 0.1f-ynear;
+ origin.mV[1] += diff;
+ ynear += diff;
+ yfar += diff;
+ }
- if (fovx > cutoff)
- { //just use ortho projection
- origin.clearVec();
- mShadowError.mV[j] = -1.f;
- proj[j] = gl_ortho(min.mV[0], max.mV[0],
- min.mV[1], max.mV[1],
- -max.mV[2], -min.mV[2]);
- }
- else
- {
- //get perspective projection
- view[j] = view[j].inverse();
+ if (fovx > cutoff)
+ { //just use ortho projection
+ origin.clearVec();
+ mShadowError.mV[j] = -1.f;
+ proj[j] = gl_ortho(min.mV[0], max.mV[0],
+ min.mV[1], max.mV[1],
+ -max.mV[2], -min.mV[2]);
+ }
+ else
+ {
+ //get perspective projection
+ view[j] = view[j].inverse();
- glh::vec3f origin_agent(origin.mV);
+ glh::vec3f origin_agent(origin.mV);
- //translate view to origin
- view[j].mult_matrix_vec(origin_agent);
+ //translate view to origin
+ view[j].mult_matrix_vec(origin_agent);
- eye = LLVector3(origin_agent.v);
+ eye = LLVector3(origin_agent.v);
- if (!hasRenderDebugMask(LLPipeline::RENDER_DEBUG_SHADOW_FRUSTA))
- {
- mShadowFrustOrigin[j] = eye;
- }
+ if (!hasRenderDebugMask(LLPipeline::RENDER_DEBUG_SHADOW_FRUSTA))
+ {
+ mShadowFrustOrigin[j] = eye;
+ }
- view[j] = look(LLVector3(origin_agent.v), lightDir, -up);
+ view[j] = look(LLVector3(origin_agent.v), lightDir, -up);
- F32 fx = 1.f/tanf(fovx);
- F32 fz = 1.f/tanf(fovz);
+ F32 fx = 1.f/tanf(fovx);
+ F32 fz = 1.f/tanf(fovz);
- proj[j] = glh::matrix4f(-fx, 0, 0, 0,
- 0, (yfar+ynear)/(ynear-yfar), 0, (2.f*yfar*ynear)/(ynear-yfar),
- 0, 0, -fz, 0,
- 0, -1.f, 0, 0);
+ proj[j] = glh::matrix4f(-fx, 0, 0, 0,
+ 0, (yfar+ynear)/(ynear-yfar), 0, (2.f*yfar*ynear)/(ynear-yfar),
+ 0, 0, -fz, 0,
+ 0, -1.f, 0, 0);
+ }
}
}
- }
- //shadow_cam.setFar(128.f);
- shadow_cam.setOriginAndLookAt(eye, up, center);
+ //shadow_cam.setFar(128.f);
+ shadow_cam.setOriginAndLookAt(eye, up, center);
- shadow_cam.setOrigin(0,0,0);
+ shadow_cam.setOrigin(0,0,0);
- glh_set_current_modelview(view[j]);
- glh_set_current_projection(proj[j]);
+ glh_set_current_modelview(view[j]);
+ glh_set_current_projection(proj[j]);
- LLViewerCamera::updateFrustumPlanes(shadow_cam, FALSE, FALSE, TRUE);
+ LLViewerCamera::updateFrustumPlanes(shadow_cam, FALSE, FALSE, TRUE);
- //shadow_cam.ignoreAgentFrustumPlane(LLCamera::AGENT_PLANE_NEAR);
- shadow_cam.getAgentPlane(LLCamera::AGENT_PLANE_NEAR).set(shadow_near_clip);
+ //shadow_cam.ignoreAgentFrustumPlane(LLCamera::AGENT_PLANE_NEAR);
+ shadow_cam.getAgentPlane(LLCamera::AGENT_PLANE_NEAR).set(shadow_near_clip);
- //translate and scale to from [-1, 1] to [0, 1]
- glh::matrix4f trans(0.5f, 0.f, 0.f, 0.5f,
- 0.f, 0.5f, 0.f, 0.5f,
- 0.f, 0.f, 0.5f, 0.5f,
- 0.f, 0.f, 0.f, 1.f);
+ //translate and scale to from [-1, 1] to [0, 1]
+ glh::matrix4f trans(0.5f, 0.f, 0.f, 0.5f,
+ 0.f, 0.5f, 0.f, 0.5f,
+ 0.f, 0.f, 0.5f, 0.5f,
+ 0.f, 0.f, 0.f, 1.f);
- glh_set_current_modelview(view[j]);
- glh_set_current_projection(proj[j]);
+ glh_set_current_modelview(view[j]);
+ glh_set_current_projection(proj[j]);
- for (U32 i = 0; i < 16; i++)
- {
- gGLLastModelView[i] = mShadowModelview[j].m[i];
- gGLLastProjection[i] = mShadowProjection[j].m[i];
- }
+ for (U32 i = 0; i < 16; i++)
+ {
+ gGLLastModelView[i] = mShadowModelview[j].m[i];
+ gGLLastProjection[i] = mShadowProjection[j].m[i];
+ }
- mShadowModelview[j] = view[j];
- mShadowProjection[j] = proj[j];
+ mShadowModelview[j] = view[j];
+ mShadowProjection[j] = proj[j];
- mSunShadowMatrix[j] = trans*proj[j]*view[j]*inv_view;
+ mSunShadowMatrix[j] = trans*proj[j]*view[j]*inv_view;
- stop_glerror();
+ stop_glerror();
- mShadow[j].bindTarget();
- mShadow[j].getViewport(gGLViewport);
- mShadow[j].clear();
+ mShadow[j].bindTarget();
+ mShadow[j].getViewport(gGLViewport);
+ mShadow[j].clear();
- {
- static LLCullResult result[4];
+ {
+ static LLCullResult result[4];
- //LLGLEnable enable(GL_DEPTH_CLAMP_NV);
- renderShadow(view[j], proj[j], shadow_cam, result[j], TRUE);
- }
+ //LLGLEnable enable(GL_DEPTH_CLAMP_NV);
+ renderShadow(view[j], proj[j], shadow_cam, result[j], TRUE);
+ }
- mShadow[j].flush();
+ mShadow[j].flush();
- if (!gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_SHADOW_FRUSTA))
- {
- LLViewerCamera::updateFrustumPlanes(shadow_cam, FALSE, FALSE, TRUE);
- mShadowCamera[j+4] = shadow_cam;
+ if (!gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_SHADOW_FRUSTA))
+ {
+ LLViewerCamera::updateFrustumPlanes(shadow_cam, FALSE, FALSE, TRUE);
+ mShadowCamera[j+4] = shadow_cam;
+ }
}
}
//hack to disable projector shadows
- bool gen_shadow = gSavedSettings.getS32("RenderShadowDetail") > 1;
+ bool gen_shadow = RenderShadowDetail > 1;
if (gen_shadow)
{
@@ -9452,7 +9361,7 @@ void LLPipeline::generateSunShadow(LLCamera& camera)
}
- if (!gSavedSettings.getBOOL("CameraOffset"))
+ if (!CameraOffset)
{
glh_set_current_modelview(saved_view);
glh_set_current_projection(saved_proj);
@@ -9461,10 +9370,10 @@ void LLPipeline::generateSunShadow(LLCamera& camera)
{
glh_set_current_modelview(view[1]);
glh_set_current_projection(proj[1]);
- glLoadMatrixf(view[1].m);
- glMatrixMode(GL_PROJECTION);
- glLoadMatrixf(proj[1].m);
- glMatrixMode(GL_MODELVIEW);
+ gGL.loadMatrix(view[1].m);
+ gGL.matrixMode(LLRender::MM_PROJECTION);
+ gGL.loadMatrix(proj[1].m);
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
}
gGL.setColorMask(true, false);
@@ -9475,6 +9384,11 @@ void LLPipeline::generateSunShadow(LLCamera& camera)
}
popRenderTypeMask();
+
+ if (!skip_avatar_update)
+ {
+ gAgentAvatarp->updateAttachmentVisibility(gAgentCamera.getCameraMode());
+ }
}
void LLPipeline::renderGroups(LLRenderPass* pass, U32 type, U32 mask, BOOL texture)
@@ -9510,7 +9424,7 @@ void LLPipeline::generateImpostor(LLVOAvatar* avatar)
assertInitialized();
- BOOL muted = LLMuteList::getInstance()->isMuted(avatar->getID());
+ bool muted = avatar->isVisuallyMuted();
pushRenderTypeMask();
@@ -9596,24 +9510,24 @@ void LLPipeline::generateImpostor(LLVOAvatar* avatar)
tdim.mV[0] = fabsf(half_height.dot3(left).getF32());
tdim.mV[1] = fabsf(half_height.dot3(up).getF32());
- glMatrixMode(GL_PROJECTION);
- glPushMatrix();
+ gGL.matrixMode(LLRender::MM_PROJECTION);
+ gGL.pushMatrix();
F32 distance = (pos-camera.getOrigin()).length();
F32 fov = atanf(tdim.mV[1]/distance)*2.f*RAD_TO_DEG;
F32 aspect = tdim.mV[0]/tdim.mV[1];
glh::matrix4f persp = gl_perspective(fov, aspect, 1.f, 256.f);
glh_set_current_projection(persp);
- glLoadMatrixf(persp.m);
+ gGL.loadMatrix(persp.m);
- glMatrixMode(GL_MODELVIEW);
- glPushMatrix();
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
+ gGL.pushMatrix();
glh::matrix4f mat;
camera.getOpenGLTransform(mat.m);
mat = glh::matrix4f((GLfloat*) OGL_TO_CFR_ROTATION) * mat;
- glLoadMatrixf(mat.m);
+ gGL.loadMatrix(mat.m);
glh_set_current_modelview(mat);
glClearColor(0.0f,0.0f,0.0f,0.0f);
@@ -9681,14 +9595,19 @@ void LLPipeline::generateImpostor(LLVOAvatar* avatar)
gGL.flush();
- glPushMatrix();
- glLoadIdentity();
- glMatrixMode(GL_PROJECTION);
- glPushMatrix();
- glLoadIdentity();
+ gGL.pushMatrix();
+ gGL.loadIdentity();
+ gGL.matrixMode(LLRender::MM_PROJECTION);
+ gGL.pushMatrix();
+ gGL.loadIdentity();
static const F32 clip_plane = 0.99999f;
+ if (LLGLSLShader::sNoFixedFunction)
+ {
+ gUIProgram.bind();
+ }
+
gGL.color4ub(64,64,64,255);
gGL.begin(LLRender::QUADS);
gGL.vertex3f(-1, -1, clip_plane);
@@ -9698,9 +9617,14 @@ void LLPipeline::generateImpostor(LLVOAvatar* avatar)
gGL.end();
gGL.flush();
- glPopMatrix();
- glMatrixMode(GL_MODELVIEW);
- glPopMatrix();
+ if (LLGLSLShader::sNoFixedFunction)
+ {
+ gUIProgram.unbind();
+ }
+
+ gGL.popMatrix();
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
+ gGL.popMatrix();
}
avatar->mImpostor.flush();
@@ -9714,10 +9638,10 @@ void LLPipeline::generateImpostor(LLVOAvatar* avatar)
sShadowRender = FALSE;
popRenderTypeMask();
- glMatrixMode(GL_PROJECTION);
- glPopMatrix();
- glMatrixMode(GL_MODELVIEW);
- glPopMatrix();
+ gGL.matrixMode(LLRender::MM_PROJECTION);
+ gGL.popMatrix();
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
+ gGL.popMatrix();
avatar->mNeedsImpostorUpdate = FALSE;
avatar->cacheImpostorValues();
diff --git a/indra/newview/pipeline.h b/indra/newview/pipeline.h
index 27ee2745b5..9c78048c46 100644
--- a/indra/newview/pipeline.h
+++ b/indra/newview/pipeline.h
@@ -72,7 +72,7 @@ BOOL compute_min_max(LLMatrix4& box, LLVector2& min, LLVector2& max); // Shouldn
bool LLRayAABB(const LLVector3 &center, const LLVector3 &size, const LLVector3& origin, const LLVector3& dir, LLVector3 &coord, F32 epsilon = 0);
BOOL setup_hud_matrices(); // use whole screen to render hud
BOOL setup_hud_matrices(const LLRect& screen_region); // specify portion of screen (in pixels) to render hud attachments from (for picking)
-glh::matrix4f glh_copy_matrix(GLdouble* src);
+glh::matrix4f glh_copy_matrix(F32* src);
glh::matrix4f glh_get_current_modelview();
void glh_set_current_modelview(const glh::matrix4f& mat);
glh::matrix4f glh_get_current_projection();
@@ -231,7 +231,7 @@ public:
void postSort(LLCamera& camera);
void forAllVisibleDrawables(void (*func)(LLDrawable*));
- void renderObjects(U32 type, U32 mask, BOOL texture = TRUE);
+ void renderObjects(U32 type, U32 mask, BOOL texture = TRUE, BOOL batch_texture = FALSE);
void renderGroups(LLRenderPass* pass, U32 type, U32 mask, BOOL texture);
void grabReferences(LLCullResult& result);
@@ -248,7 +248,7 @@ public:
void renderGeomDeferred(LLCamera& camera);
void renderGeomPostDeferred(LLCamera& camera);
void renderGeomShadow(LLCamera& camera);
- void bindDeferredShader(LLGLSLShader& shader, U32 light_index = 0, LLRenderTarget* gi_source = NULL, LLRenderTarget* last_gi_post = NULL, U32 noise_map = 0xFFFFFFFF);
+ void bindDeferredShader(LLGLSLShader& shader, U32 light_index = 0, U32 noise_map = 0xFFFFFFFF);
void setupSpotLight(LLGLSLShader& shader, LLDrawable* drawablep);
void unbindDeferredShader(LLGLSLShader& shader);
@@ -262,7 +262,6 @@ public:
void renderShadow(glh::matrix4f& view, glh::matrix4f& proj, LLCamera& camera, LLCullResult& result, BOOL use_shader = TRUE, BOOL use_occlusion = TRUE);
- void generateGI(LLCamera& camera, LLVector3& lightDir, std::vector<LLVector3>& vpc);
void renderHighlights();
void renderDebug();
void renderPhysicsDisplay();
@@ -360,7 +359,7 @@ public:
static BOOL getRenderHighlights(void* data);
static void updateRenderDeferred();
- static void refreshRenderDeferred();
+ static void refreshCachedSettings();
static void throttleNewMemoryAllocation(BOOL disable);
@@ -408,7 +407,6 @@ public:
RENDER_TYPE_PASS_ALPHA = LLRenderPass::PASS_ALPHA,
RENDER_TYPE_PASS_ALPHA_MASK = LLRenderPass::PASS_ALPHA_MASK,
RENDER_TYPE_PASS_FULLBRIGHT_ALPHA_MASK = LLRenderPass::PASS_FULLBRIGHT_ALPHA_MASK,
- RENDER_TYPE_PASS_ALPHA_SHADOW = LLRenderPass::PASS_ALPHA_SHADOW,
// Following are object types (only used in drawable mRenderType)
RENDER_TYPE_HUD = LLRenderPass::NUM_RENDER_TYPES,
RENDER_TYPE_VOLUME,
@@ -434,34 +432,35 @@ public:
enum LLRenderDebugMask
{
- RENDER_DEBUG_COMPOSITION = 0x0000001,
- RENDER_DEBUG_VERIFY = 0x0000002,
- RENDER_DEBUG_BBOXES = 0x0000004,
- RENDER_DEBUG_OCTREE = 0x0000008,
- RENDER_DEBUG_PICKING = 0x0000010,
- RENDER_DEBUG_OCCLUSION = 0x0000020,
- RENDER_DEBUG_POINTS = 0x0000040,
- RENDER_DEBUG_TEXTURE_PRIORITY = 0x0000080,
- RENDER_DEBUG_TEXTURE_AREA = 0x0000100,
- RENDER_DEBUG_FACE_AREA = 0x0000200,
- RENDER_DEBUG_PARTICLES = 0x0000400,
- RENDER_DEBUG_GLOW = 0x0000800,
- RENDER_DEBUG_TEXTURE_ANIM = 0x0001000,
- RENDER_DEBUG_LIGHTS = 0x0002000,
- RENDER_DEBUG_BATCH_SIZE = 0x0004000,
- RENDER_DEBUG_ALPHA_BINS = 0x0008000,
- RENDER_DEBUG_RAYCAST = 0x0010000,
- RENDER_DEBUG_SHAME = 0x0020000,
- RENDER_DEBUG_SHADOW_FRUSTA = 0x0040000,
- RENDER_DEBUG_SCULPTED = 0x0080000,
- RENDER_DEBUG_AVATAR_VOLUME = 0x0100000,
- RENDER_DEBUG_BUILD_QUEUE = 0x0200000,
- RENDER_DEBUG_AGENT_TARGET = 0x0400000,
- RENDER_DEBUG_UPDATE_TYPE = 0x0800000,
- RENDER_DEBUG_PHYSICS_SHAPES = 0x1000000,
- RENDER_DEBUG_NORMALS = 0x2000000,
- RENDER_DEBUG_LOD_INFO = 0x4000000,
- RENDER_DEBUG_RENDER_COMPLEXITY = 0x8000000
+ RENDER_DEBUG_COMPOSITION = 0x00000001,
+ RENDER_DEBUG_VERIFY = 0x00000002,
+ RENDER_DEBUG_BBOXES = 0x00000004,
+ RENDER_DEBUG_OCTREE = 0x00000008,
+ RENDER_DEBUG_WIND_VECTORS = 0x00000010,
+ RENDER_DEBUG_OCCLUSION = 0x00000020,
+ RENDER_DEBUG_POINTS = 0x00000040,
+ RENDER_DEBUG_TEXTURE_PRIORITY = 0x00000080,
+ RENDER_DEBUG_TEXTURE_AREA = 0x00000100,
+ RENDER_DEBUG_FACE_AREA = 0x00000200,
+ RENDER_DEBUG_PARTICLES = 0x00000400,
+ RENDER_DEBUG_GLOW = 0x00000800,
+ RENDER_DEBUG_TEXTURE_ANIM = 0x00001000,
+ RENDER_DEBUG_LIGHTS = 0x00002000,
+ RENDER_DEBUG_BATCH_SIZE = 0x00004000,
+ RENDER_DEBUG_ALPHA_BINS = 0x00008000,
+ RENDER_DEBUG_RAYCAST = 0x00010000,
+ RENDER_DEBUG_SHAME = 0x00020000,
+ RENDER_DEBUG_SHADOW_FRUSTA = 0x00040000,
+ RENDER_DEBUG_SCULPTED = 0x00080000,
+ RENDER_DEBUG_AVATAR_VOLUME = 0x00100000,
+ RENDER_DEBUG_BUILD_QUEUE = 0x00200000,
+ RENDER_DEBUG_AGENT_TARGET = 0x00400000,
+ RENDER_DEBUG_UPDATE_TYPE = 0x00800000,
+ RENDER_DEBUG_PHYSICS_SHAPES = 0x01000000,
+ RENDER_DEBUG_NORMALS = 0x02000000,
+ RENDER_DEBUG_LOD_INFO = 0x04000000,
+ RENDER_DEBUG_RENDER_COMPLEXITY = 0x08000000,
+ RENDER_DEBUG_ATTACHMENT_BYTES = 0x10000000,
};
public:
@@ -531,15 +530,16 @@ public:
LLRenderTarget mScreen;
LLRenderTarget mUIScreen;
LLRenderTarget mDeferredScreen;
+ LLRenderTarget mFXAABuffer;
LLRenderTarget mEdgeMap;
LLRenderTarget mDeferredDepth;
- LLRenderTarget mDeferredLight[3];
- LLRenderTarget mGIMap;
- LLRenderTarget mGIMapPost[2];
- LLRenderTarget mLuminanceMap;
+ LLRenderTarget mDeferredLight;
LLRenderTarget mHighlight;
LLRenderTarget mPhysicsDisplay;
+ //utility buffer for rendering post effects, gets abused by renderDeferredLighting
+ LLPointer<LLVertexBuffer> mDeferredVB;
+
//sun shadow map
LLRenderTarget mShadow[6];
std::vector<LLVector3> mShadowFrustPoints[4];
@@ -585,6 +585,7 @@ public:
LLColor4 mSunDiffuse;
LLVector3 mSunDir;
+ LLVector3 mTransformedSunDir;
BOOL mInitialized;
BOOL mVertexShadersEnabled;
@@ -770,6 +771,81 @@ public:
//debug use
static U32 sCurRenderPoolType ;
+
+ //cached settings
+ static BOOL WindLightUseAtmosShaders;
+ static BOOL VertexShaderEnable;
+ static BOOL RenderAvatarVP;
+ static BOOL RenderDeferred;
+ static F32 RenderDeferredSunWash;
+ static U32 RenderFSAASamples;
+ static U32 RenderResolutionDivisor;
+ static BOOL RenderUIBuffer;
+ static S32 RenderShadowDetail;
+ static BOOL RenderDeferredSSAO;
+ static F32 RenderShadowResolutionScale;
+ static BOOL RenderLocalLights;
+ static BOOL RenderDelayCreation;
+ static BOOL RenderAnimateRes;
+ static BOOL FreezeTime;
+ static S32 DebugBeaconLineWidth;
+ static F32 RenderHighlightBrightness;
+ static LLColor4 RenderHighlightColor;
+ static F32 RenderHighlightThickness;
+ static BOOL RenderSpotLightsInNondeferred;
+ static LLColor4 PreviewAmbientColor;
+ static LLColor4 PreviewDiffuse0;
+ static LLColor4 PreviewSpecular0;
+ static LLColor4 PreviewDiffuse1;
+ static LLColor4 PreviewSpecular1;
+ static LLColor4 PreviewDiffuse2;
+ static LLColor4 PreviewSpecular2;
+ static LLVector3 PreviewDirection0;
+ static LLVector3 PreviewDirection1;
+ static LLVector3 PreviewDirection2;
+ static F32 RenderGlowMinLuminance;
+ static F32 RenderGlowMaxExtractAlpha;
+ static F32 RenderGlowWarmthAmount;
+ static LLVector3 RenderGlowLumWeights;
+ static LLVector3 RenderGlowWarmthWeights;
+ static S32 RenderGlowResolutionPow;
+ static S32 RenderGlowIterations;
+ static F32 RenderGlowWidth;
+ static F32 RenderGlowStrength;
+ static BOOL RenderDepthOfField;
+ static F32 CameraFocusTransitionTime;
+ static F32 CameraFNumber;
+ static F32 CameraFocalLength;
+ static F32 CameraFieldOfView;
+ static F32 RenderShadowNoise;
+ static F32 RenderShadowBlurSize;
+ static F32 RenderSSAOScale;
+ static U32 RenderSSAOMaxScale;
+ static F32 RenderSSAOFactor;
+ static LLVector3 RenderSSAOEffect;
+ static F32 RenderShadowOffsetError;
+ static F32 RenderShadowBiasError;
+ static F32 RenderShadowOffset;
+ static F32 RenderShadowBias;
+ static F32 RenderSpotShadowOffset;
+ static F32 RenderSpotShadowBias;
+ static F32 RenderEdgeDepthCutoff;
+ static F32 RenderEdgeNormCutoff;
+ static LLVector3 RenderShadowGaussian;
+ static F32 RenderShadowBlurDistFactor;
+ static BOOL RenderDeferredAtmospheric;
+ static S32 RenderReflectionDetail;
+ static F32 RenderHighlightFadeTime;
+ static LLVector3 RenderShadowClipPlanes;
+ static LLVector3 RenderShadowOrthoClipPlanes;
+ static LLVector3 RenderShadowNearDist;
+ static F32 RenderFarClip;
+ static LLVector3 RenderShadowSplitExponent;
+ static F32 RenderShadowErrorCutoff;
+ static F32 RenderShadowFOVCutoff;
+ static BOOL CameraOffset;
+ static F32 CameraMaxCoF;
+ static F32 CameraDoFResScale;
};
void render_bbox(const LLVector3 &min, const LLVector3 &max);
diff --git a/indra/newview/skins/default/colors.xml b/indra/newview/skins/default/colors.xml
index b5cc949ebf..8baaa14595 100644
--- a/indra/newview/skins/default/colors.xml
+++ b/indra/newview/skins/default/colors.xml
@@ -795,6 +795,10 @@
<color
name="DirectChatColor"
reference="LtOrange" />
+
+ <color
+ name="ToolbarDropZoneColor"
+ value=".48 .69 1 .5" />
<!-- Generic color names (legacy) -->
<color
diff --git a/indra/newview/skins/default/textures/arrow_keys.png b/indra/newview/skins/default/textures/arrow_keys.png
deleted file mode 100644
index f19af59251..0000000000
--- a/indra/newview/skins/default/textures/arrow_keys.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/bottomtray/Cam_Pan_Over.png b/indra/newview/skins/default/textures/bottomtray/Cam_Pan_Over.png
deleted file mode 100644
index b5781718ec..0000000000
--- a/indra/newview/skins/default/textures/bottomtray/Cam_Pan_Over.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/bottomtray/CameraView_Press.png b/indra/newview/skins/default/textures/bottomtray/CameraView_Press.png
deleted file mode 100644
index 5a9346fd39..0000000000
--- a/indra/newview/skins/default/textures/bottomtray/CameraView_Press.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/bottomtray/PanOrbit_Disabled.png b/indra/newview/skins/default/textures/bottomtray/PanOrbit_Disabled.png
deleted file mode 100644
index 20fa40e127..0000000000
--- a/indra/newview/skins/default/textures/bottomtray/PanOrbit_Disabled.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/bottomtray/PanOrbit_Over.png b/indra/newview/skins/default/textures/bottomtray/PanOrbit_Over.png
deleted file mode 100644
index f1420e0002..0000000000
--- a/indra/newview/skins/default/textures/bottomtray/PanOrbit_Over.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/bottomtray/PanOrbit_Press.png b/indra/newview/skins/default/textures/bottomtray/PanOrbit_Press.png
deleted file mode 100644
index 89a6269edc..0000000000
--- a/indra/newview/skins/default/textures/bottomtray/PanOrbit_Press.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/bottomtray/VoicePTT_Lvl1_Dark.png b/indra/newview/skins/default/textures/bottomtray/VoicePTT_Lvl1_Dark.png
new file mode 100644
index 0000000000..857fa1e047
--- /dev/null
+++ b/indra/newview/skins/default/textures/bottomtray/VoicePTT_Lvl1_Dark.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/bottomtray/VoicePTT_Lvl2_Dark.png b/indra/newview/skins/default/textures/bottomtray/VoicePTT_Lvl2_Dark.png
new file mode 100644
index 0000000000..453bb53673
--- /dev/null
+++ b/indra/newview/skins/default/textures/bottomtray/VoicePTT_Lvl2_Dark.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/bottomtray/VoicePTT_Lvl3_Dark.png b/indra/newview/skins/default/textures/bottomtray/VoicePTT_Lvl3_Dark.png
new file mode 100644
index 0000000000..135a66ca0d
--- /dev/null
+++ b/indra/newview/skins/default/textures/bottomtray/VoicePTT_Lvl3_Dark.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/bottomtray/VoicePTT_Off_Dark.png b/indra/newview/skins/default/textures/bottomtray/VoicePTT_Off_Dark.png
new file mode 100644
index 0000000000..a63aec5e6d
--- /dev/null
+++ b/indra/newview/skins/default/textures/bottomtray/VoicePTT_Off_Dark.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/bottomtray/VoicePTT_On_Dark.png b/indra/newview/skins/default/textures/bottomtray/VoicePTT_On_Dark.png
new file mode 100644
index 0000000000..1719eb3e84
--- /dev/null
+++ b/indra/newview/skins/default/textures/bottomtray/VoicePTT_On_Dark.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/checkerboard_transparency_bg.png b/indra/newview/skins/default/textures/checkerboard_transparency_bg.png
deleted file mode 100644
index 9a16935204..0000000000
--- a/indra/newview/skins/default/textures/checkerboard_transparency_bg.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/circle.tga b/indra/newview/skins/default/textures/circle.tga
deleted file mode 100644
index d7097e3a35..0000000000
--- a/indra/newview/skins/default/textures/circle.tga
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/containers/Accordion_ArrowClosed_Over.png b/indra/newview/skins/default/textures/containers/Accordion_ArrowClosed_Over.png
deleted file mode 100644
index e47f913db1..0000000000
--- a/indra/newview/skins/default/textures/containers/Accordion_ArrowClosed_Over.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/containers/Accordion_ArrowOpened_Over.png b/indra/newview/skins/default/textures/containers/Accordion_ArrowOpened_Over.png
deleted file mode 100644
index e2c67de9c0..0000000000
--- a/indra/newview/skins/default/textures/containers/Accordion_ArrowOpened_Over.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/containers/TabTop_Left_Over.png b/indra/newview/skins/default/textures/containers/TabTop_Left_Over.png
deleted file mode 100644
index 295cd89a57..0000000000
--- a/indra/newview/skins/default/textures/containers/TabTop_Left_Over.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/containers/TabTop_Middle_Over.png b/indra/newview/skins/default/textures/containers/TabTop_Middle_Over.png
deleted file mode 100644
index 0758cbcf0d..0000000000
--- a/indra/newview/skins/default/textures/containers/TabTop_Middle_Over.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/containers/TabTop_Right_Over.png b/indra/newview/skins/default/textures/containers/TabTop_Right_Over.png
deleted file mode 100644
index c2cbc2b1e5..0000000000
--- a/indra/newview/skins/default/textures/containers/TabTop_Right_Over.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/icn_label_web.tga b/indra/newview/skins/default/textures/icn_label_web.tga
deleted file mode 100644
index 7c9131dfff..0000000000
--- a/indra/newview/skins/default/textures/icn_label_web.tga
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/icn_media.tga b/indra/newview/skins/default/textures/icn_media.tga
deleted file mode 100644
index 43dd342c9d..0000000000
--- a/indra/newview/skins/default/textures/icn_media.tga
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/icn_voice-groupfocus.tga b/indra/newview/skins/default/textures/icn_voice-groupfocus.tga
deleted file mode 100644
index 9f48d4609d..0000000000
--- a/indra/newview/skins/default/textures/icn_voice-groupfocus.tga
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/icn_voice-localchat.tga b/indra/newview/skins/default/textures/icn_voice-localchat.tga
deleted file mode 100644
index 7cf267eaf5..0000000000
--- a/indra/newview/skins/default/textures/icn_voice-localchat.tga
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/icn_voice-pvtfocus.tga b/indra/newview/skins/default/textures/icn_voice-pvtfocus.tga
deleted file mode 100644
index abadb09aaf..0000000000
--- a/indra/newview/skins/default/textures/icn_voice-pvtfocus.tga
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/icon_day_cycle.tga b/indra/newview/skins/default/textures/icon_day_cycle.tga
deleted file mode 100644
index 2d5dee1e94..0000000000
--- a/indra/newview/skins/default/textures/icon_day_cycle.tga
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/icon_event_adult.tga b/indra/newview/skins/default/textures/icon_event_adult.tga
deleted file mode 100644
index f548126e5a..0000000000
--- a/indra/newview/skins/default/textures/icon_event_adult.tga
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/icon_lock.tga b/indra/newview/skins/default/textures/icon_lock.tga
deleted file mode 100644
index 23521aa113..0000000000
--- a/indra/newview/skins/default/textures/icon_lock.tga
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/AddItem_Over.png b/indra/newview/skins/default/textures/icons/AddItem_Over.png
deleted file mode 100644
index cad6e8d52f..0000000000
--- a/indra/newview/skins/default/textures/icons/AddItem_Over.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/BackArrow_Over.png b/indra/newview/skins/default/textures/icons/BackArrow_Over.png
deleted file mode 100644
index b36e03a8cf..0000000000
--- a/indra/newview/skins/default/textures/icons/BackArrow_Over.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/DragHandle.png b/indra/newview/skins/default/textures/icons/DragHandle.png
deleted file mode 100644
index c3cbc07a33..0000000000
--- a/indra/newview/skins/default/textures/icons/DragHandle.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Generic_Object.png b/indra/newview/skins/default/textures/icons/Generic_Object.png
deleted file mode 100644
index e3a80b2aef..0000000000
--- a/indra/newview/skins/default/textures/icons/Generic_Object.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Inv_Gift.png b/indra/newview/skins/default/textures/icons/Inv_Gift.png
deleted file mode 100644
index 5afe85d72d..0000000000
--- a/indra/newview/skins/default/textures/icons/Inv_Gift.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/OptionsMenu_Over.png b/indra/newview/skins/default/textures/icons/OptionsMenu_Over.png
deleted file mode 100644
index fcabd4c6d3..0000000000
--- a/indra/newview/skins/default/textures/icons/OptionsMenu_Over.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/OutboxPush_On_Selected.png b/indra/newview/skins/default/textures/icons/OutboxPush_On_Selected.png
deleted file mode 100644
index 0e60b417b0..0000000000
--- a/indra/newview/skins/default/textures/icons/OutboxPush_On_Selected.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Parcel_Damage_Light_Alt.png b/indra/newview/skins/default/textures/icons/Parcel_Damage_Light_Alt.png
deleted file mode 100644
index d72f02f708..0000000000
--- a/indra/newview/skins/default/textures/icons/Parcel_Damage_Light_Alt.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Parcel_NoScripts_Light.png b/indra/newview/skins/default/textures/icons/Parcel_NoScripts_Light.png
deleted file mode 100644
index f82354959e..0000000000
--- a/indra/newview/skins/default/textures/icons/Parcel_NoScripts_Light.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/TrashItem_Over.png b/indra/newview/skins/default/textures/icons/TrashItem_Over.png
deleted file mode 100644
index 1a0eea6c67..0000000000
--- a/indra/newview/skins/default/textures/icons/TrashItem_Over.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/parcel_color_EVRY.png b/indra/newview/skins/default/textures/icons/parcel_color_EVRY.png
deleted file mode 100644
index b5508423eb..0000000000
--- a/indra/newview/skins/default/textures/icons/parcel_color_EVRY.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/parcel_color_EXP.png b/indra/newview/skins/default/textures/icons/parcel_color_EXP.png
deleted file mode 100644
index 4813d37198..0000000000
--- a/indra/newview/skins/default/textures/icons/parcel_color_EXP.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/parcel_color_M.png b/indra/newview/skins/default/textures/icons/parcel_color_M.png
deleted file mode 100644
index 41984c43e4..0000000000
--- a/indra/newview/skins/default/textures/icons/parcel_color_M.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/image_edit_icon.tga b/indra/newview/skins/default/textures/image_edit_icon.tga
deleted file mode 100644
index 8666f0bbe6..0000000000
--- a/indra/newview/skins/default/textures/image_edit_icon.tga
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/inv_folder_animation.tga b/indra/newview/skins/default/textures/inv_folder_animation.tga
deleted file mode 100644
index 1b4df7a2d8..0000000000
--- a/indra/newview/skins/default/textures/inv_folder_animation.tga
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/inv_folder_inbox.tga b/indra/newview/skins/default/textures/inv_folder_inbox.tga
deleted file mode 100644
index 04539c2cc4..0000000000
--- a/indra/newview/skins/default/textures/inv_folder_inbox.tga
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/map_avatar_above_8.tga b/indra/newview/skins/default/textures/map_avatar_above_8.tga
deleted file mode 100644
index 193428e530..0000000000
--- a/indra/newview/skins/default/textures/map_avatar_above_8.tga
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/map_avatar_below_8.tga b/indra/newview/skins/default/textures/map_avatar_below_8.tga
deleted file mode 100644
index 9e14bfab90..0000000000
--- a/indra/newview/skins/default/textures/map_avatar_below_8.tga
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/map_event_adult.tga b/indra/newview/skins/default/textures/map_event_adult.tga
deleted file mode 100644
index f548126e5a..0000000000
--- a/indra/newview/skins/default/textures/map_event_adult.tga
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/map_event_mature.tga b/indra/newview/skins/default/textures/map_event_mature.tga
deleted file mode 100644
index 71067c0dfd..0000000000
--- a/indra/newview/skins/default/textures/map_event_mature.tga
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/map_track_8.tga b/indra/newview/skins/default/textures/map_track_8.tga
deleted file mode 100644
index 53425ff45b..0000000000
--- a/indra/newview/skins/default/textures/map_track_8.tga
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/model_wizard/divider_line.png b/indra/newview/skins/default/textures/model_wizard/divider_line.png
deleted file mode 100644
index 76c9e68767..0000000000
--- a/indra/newview/skins/default/textures/model_wizard/divider_line.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/mute_icon.tga b/indra/newview/skins/default/textures/mute_icon.tga
deleted file mode 100644
index 879b9e6188..0000000000
--- a/indra/newview/skins/default/textures/mute_icon.tga
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/navbar/Arrow_Left_Over.png b/indra/newview/skins/default/textures/navbar/Arrow_Left_Over.png
deleted file mode 100644
index a91b74819f..0000000000
--- a/indra/newview/skins/default/textures/navbar/Arrow_Left_Over.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/navbar/Arrow_Right_Over.png b/indra/newview/skins/default/textures/navbar/Arrow_Right_Over.png
deleted file mode 100644
index a2caf227a7..0000000000
--- a/indra/newview/skins/default/textures/navbar/Arrow_Right_Over.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/navbar/Help_Over.png b/indra/newview/skins/default/textures/navbar/Help_Over.png
deleted file mode 100644
index b9bc0d0f87..0000000000
--- a/indra/newview/skins/default/textures/navbar/Help_Over.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/navbar/Home_Over.png b/indra/newview/skins/default/textures/navbar/Home_Over.png
deleted file mode 100644
index d9c6b3842e..0000000000
--- a/indra/newview/skins/default/textures/navbar/Home_Over.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/navbar/separator.png b/indra/newview/skins/default/textures/navbar/separator.png
new file mode 100644
index 0000000000..b93e5791a7
--- /dev/null
+++ b/indra/newview/skins/default/textures/navbar/separator.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/places_rating_adult.tga b/indra/newview/skins/default/textures/places_rating_adult.tga
deleted file mode 100644
index c344fb1e78..0000000000
--- a/indra/newview/skins/default/textures/places_rating_adult.tga
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/places_rating_mature.tga b/indra/newview/skins/default/textures/places_rating_mature.tga
deleted file mode 100644
index 61c879bc92..0000000000
--- a/indra/newview/skins/default/textures/places_rating_mature.tga
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/places_rating_pg.tga b/indra/newview/skins/default/textures/places_rating_pg.tga
deleted file mode 100644
index 7805dbce60..0000000000
--- a/indra/newview/skins/default/textures/places_rating_pg.tga
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/propertyline.tga b/indra/newview/skins/default/textures/propertyline.tga
deleted file mode 100644
index 0c504eea71..0000000000
--- a/indra/newview/skins/default/textures/propertyline.tga
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/quick_tips/avatar_free_mode.png b/indra/newview/skins/default/textures/quick_tips/avatar_free_mode.png
deleted file mode 100644
index be7c87efb6..0000000000
--- a/indra/newview/skins/default/textures/quick_tips/avatar_free_mode.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/quick_tips/camera_free_mode.png b/indra/newview/skins/default/textures/quick_tips/camera_free_mode.png
deleted file mode 100644
index 9a3f3703b2..0000000000
--- a/indra/newview/skins/default/textures/quick_tips/camera_free_mode.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/quick_tips/camera_orbit_mode.png b/indra/newview/skins/default/textures/quick_tips/camera_orbit_mode.png
deleted file mode 100644
index dd72cc0162..0000000000
--- a/indra/newview/skins/default/textures/quick_tips/camera_orbit_mode.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/quick_tips/camera_pan_mode.png b/indra/newview/skins/default/textures/quick_tips/camera_pan_mode.png
deleted file mode 100644
index b537dcbe46..0000000000
--- a/indra/newview/skins/default/textures/quick_tips/camera_pan_mode.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/quick_tips/camera_preset_front_view.png b/indra/newview/skins/default/textures/quick_tips/camera_preset_front_view.png
deleted file mode 100644
index 7674a75ac3..0000000000
--- a/indra/newview/skins/default/textures/quick_tips/camera_preset_front_view.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/quick_tips/camera_preset_group_view.png b/indra/newview/skins/default/textures/quick_tips/camera_preset_group_view.png
deleted file mode 100644
index 9c9b923a5a..0000000000
--- a/indra/newview/skins/default/textures/quick_tips/camera_preset_group_view.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/quick_tips/camera_preset_rear_view.png b/indra/newview/skins/default/textures/quick_tips/camera_preset_rear_view.png
deleted file mode 100644
index 15c3053491..0000000000
--- a/indra/newview/skins/default/textures/quick_tips/camera_preset_rear_view.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/quick_tips/move_fly_first.png b/indra/newview/skins/default/textures/quick_tips/move_fly_first.png
deleted file mode 100644
index b6e2ce60e4..0000000000
--- a/indra/newview/skins/default/textures/quick_tips/move_fly_first.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/quick_tips/move_fly_second.png b/indra/newview/skins/default/textures/quick_tips/move_fly_second.png
deleted file mode 100644
index 84b63cc338..0000000000
--- a/indra/newview/skins/default/textures/quick_tips/move_fly_second.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/quick_tips/move_run_first.png b/indra/newview/skins/default/textures/quick_tips/move_run_first.png
deleted file mode 100644
index 16093dc683..0000000000
--- a/indra/newview/skins/default/textures/quick_tips/move_run_first.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/quick_tips/move_run_second.png b/indra/newview/skins/default/textures/quick_tips/move_run_second.png
deleted file mode 100644
index 19fa43ec32..0000000000
--- a/indra/newview/skins/default/textures/quick_tips/move_run_second.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/quick_tips/move_walk_first.png b/indra/newview/skins/default/textures/quick_tips/move_walk_first.png
deleted file mode 100644
index 92d120d53e..0000000000
--- a/indra/newview/skins/default/textures/quick_tips/move_walk_first.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/quick_tips/move_walk_second.png b/indra/newview/skins/default/textures/quick_tips/move_walk_second.png
deleted file mode 100644
index f8e28722be..0000000000
--- a/indra/newview/skins/default/textures/quick_tips/move_walk_second.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/show_btn.tga b/indra/newview/skins/default/textures/show_btn.tga
deleted file mode 100644
index 5f05f377e3..0000000000
--- a/indra/newview/skins/default/textures/show_btn.tga
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/show_btn_selected.tga b/indra/newview/skins/default/textures/show_btn_selected.tga
deleted file mode 100644
index 00a2f34a37..0000000000
--- a/indra/newview/skins/default/textures/show_btn_selected.tga
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/smicon_warn.tga b/indra/newview/skins/default/textures/smicon_warn.tga
deleted file mode 100644
index 90ccaa07e5..0000000000
--- a/indra/newview/skins/default/textures/smicon_warn.tga
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/snapshot_download.png b/indra/newview/skins/default/textures/snapshot_download.png
new file mode 100644
index 0000000000..6aa1abded5
--- /dev/null
+++ b/indra/newview/skins/default/textures/snapshot_download.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/snapshot_email.png b/indra/newview/skins/default/textures/snapshot_email.png
new file mode 100644
index 0000000000..dee784a9bf
--- /dev/null
+++ b/indra/newview/skins/default/textures/snapshot_email.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/spacer35.tga b/indra/newview/skins/default/textures/spacer35.tga
deleted file mode 100644
index b88bc6680a..0000000000
--- a/indra/newview/skins/default/textures/spacer35.tga
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/square_btn_32x128.tga b/indra/newview/skins/default/textures/square_btn_32x128.tga
deleted file mode 100644
index d7ce58dac3..0000000000
--- a/indra/newview/skins/default/textures/square_btn_32x128.tga
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/square_btn_selected_32x128.tga b/indra/newview/skins/default/textures/square_btn_selected_32x128.tga
deleted file mode 100644
index 59ca365aa4..0000000000
--- a/indra/newview/skins/default/textures/square_btn_selected_32x128.tga
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/startup_logo.j2c b/indra/newview/skins/default/textures/startup_logo.j2c
deleted file mode 100644
index d1b991f17f..0000000000
--- a/indra/newview/skins/default/textures/startup_logo.j2c
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/status_busy.tga b/indra/newview/skins/default/textures/status_busy.tga
deleted file mode 100644
index 7743d9c7bb..0000000000
--- a/indra/newview/skins/default/textures/status_busy.tga
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/taskpanel/TabIcon_Appearance_Off.png b/indra/newview/skins/default/textures/taskpanel/TabIcon_Appearance_Off.png
deleted file mode 100644
index 0b91abfb0d..0000000000
--- a/indra/newview/skins/default/textures/taskpanel/TabIcon_Appearance_Off.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/taskpanel/TabIcon_Appearance_Selected.png b/indra/newview/skins/default/textures/taskpanel/TabIcon_Appearance_Selected.png
deleted file mode 100644
index 33a47236a5..0000000000
--- a/indra/newview/skins/default/textures/taskpanel/TabIcon_Appearance_Selected.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/taskpanel/TabIcon_Home_Off.png b/indra/newview/skins/default/textures/taskpanel/TabIcon_Home_Off.png
deleted file mode 100644
index 421f5e1705..0000000000
--- a/indra/newview/skins/default/textures/taskpanel/TabIcon_Home_Off.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/taskpanel/TabIcon_Me_Selected.png b/indra/newview/skins/default/textures/taskpanel/TabIcon_Me_Selected.png
deleted file mode 100644
index 905d4c973e..0000000000
--- a/indra/newview/skins/default/textures/taskpanel/TabIcon_Me_Selected.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/taskpanel/TabIcon_People_Selected.png b/indra/newview/skins/default/textures/taskpanel/TabIcon_People_Selected.png
deleted file mode 100644
index 909f0d0a47..0000000000
--- a/indra/newview/skins/default/textures/taskpanel/TabIcon_People_Selected.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/taskpanel/TabIcon_Places_Large.png b/indra/newview/skins/default/textures/taskpanel/TabIcon_Places_Large.png
deleted file mode 100644
index cc505c4a30..0000000000
--- a/indra/newview/skins/default/textures/taskpanel/TabIcon_Places_Large.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/taskpanel/TabIcon_Places_Selected.png b/indra/newview/skins/default/textures/taskpanel/TabIcon_Places_Selected.png
deleted file mode 100644
index 8e0fb9661e..0000000000
--- a/indra/newview/skins/default/textures/taskpanel/TabIcon_Places_Selected.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/taskpanel/TabIcon_Things_Selected.png b/indra/newview/skins/default/textures/taskpanel/TabIcon_Things_Selected.png
deleted file mode 100644
index d4ac451c8e..0000000000
--- a/indra/newview/skins/default/textures/taskpanel/TabIcon_Things_Selected.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml
index 9fc2479bb1..e4a8622a4b 100644
--- a/indra/newview/skins/default/textures/textures.xml
+++ b/indra/newview/skins/default/textures/textures.xml
@@ -39,7 +39,7 @@ with the same filename but different name
<texture name="Accordion_Over" file_name="containers/Accordion_Over.png" preload="false" />
<texture name="Accordion_Selected" file_name="containers/Accordion_Selected.png" preload="false" />
-<texture name="Activate_Checkmark" file_name="taskpanel/Activate_Checkmark.png" preload="false" />
+ <texture name="Activate_Checkmark" file_name="taskpanel/Activate_Checkmark.png" preload="false" />
<texture name="AddItem_Disabled" file_name="icons/AddItem_Disabled.png" preload="false" />
<texture name="AddItem_Off" file_name="icons/AddItem_Off.png" preload="false" />
@@ -48,9 +48,6 @@ with the same filename but different name
<texture name="Arrow_Left_Off" file_name="navbar/Arrow_Left_Off.png" preload="true" />
<texture name="Arrow_Right_Off" file_name="navbar/Arrow_Right_Off.png" preload="true" />
-<!--
--->
-
<texture name="Arrow_Small_Up" file_name="widgets/Arrow_Small_Up.png" preload="true" />
<texture name="Arrow_Small_Left" file_name="widgets/Arrow_Small_Left.png" preload="true" />
<texture name="Arrow_Small_Right" file_name="widgets/Arrow_Small_Right.png" preload="true" />
@@ -123,12 +120,41 @@ with the same filename but different name
<texture name="Checkbox_On" file_name="widgets/Checkbox_On.png" preload="true" />
<texture name="Checkbox_On_Press" file_name="widgets/Checkbox_On_Press.png" preload="true" />
<texture name="Checkbox_Press" file_name="widgets/Checkbox_Press.png" preload="true" />
- <texture name="Check_Mark" file_name="icons/check_mark" preload="true" />
+ <texture name="Check_Mark" file_name="icons/check_mark.png" preload="true" />
+
+ <texture name="Command_AboutLand_Icon" file_name="toolbar_icons/land.png" preload="true" />
+ <texture name="Command_Appearance_Icon" file_name="toolbar_icons/appearance.png" preload="true" />
+ <texture name="Command_Avatar_Icon" file_name="toolbar_icons/avatars.png" preload="true" />
+ <texture name="Command_Build_Icon" file_name="toolbar_icons/build.png" preload="true" />
+ <texture name="Command_Chat_Icon" file_name="toolbar_icons/chat.png" preload="true" />
+ <texture name="Command_Compass_Icon" file_name="toolbar_icons/land.png" preload="true" />
+ <texture name="Command_Destinations_Icon" file_name="toolbar_icons/destinations.png" preload="true" />
+ <texture name="Command_Gestures_Icon" file_name="toolbar_icons/gestures.png" preload="true" />
+ <texture name="Command_HowTo_Icon" file_name="toolbar_icons/howto.png" preload="true" />
+ <texture name="Command_Inventory_Icon" file_name="toolbar_icons/inventory.png" preload="true" />
+ <texture name="Command_Map_Icon" file_name="toolbar_icons/map.png" preload="true" />
+ <texture name="Command_Marketplace_Icon" file_name="toolbar_icons/marketplace.png" preload="true" />
+ <texture name="Command_MiniCart_Icon" file_name="toolbar_icons/mini_cart.png" preload="true" />
+ <texture name="Command_MiniMap_Icon" file_name="toolbar_icons/mini_map.png" preload="true" />
+ <texture name="Command_Move_Icon" file_name="toolbar_icons/move.png" preload="true" />
+ <texture name="Command_Outbox_Icon" file_name="toolbar_icons/outbox.png" preload="true" />
+ <texture name="Command_People_Icon" file_name="toolbar_icons/people.png" preload="true" />
+ <texture name="Command_Picks_Icon" file_name="toolbar_icons/picks.png" preload="true" />
+ <texture name="Command_Places_Icon" file_name="toolbar_icons/places.png" preload="true" />
+ <texture name="Command_Preferences_Icon" file_name="toolbar_icons/preferences.png" preload="true" />
+ <texture name="Command_Profile_Icon" file_name="toolbar_icons/profile.png" preload="true" />
+ <texture name="Command_Search_Icon" file_name="toolbar_icons/search.png" preload="true" />
+ <texture name="Command_Snapshot_Icon" file_name="toolbar_icons/snapshot.png" preload="true" />
+ <texture name="Command_Speak_Icon" file_name="toolbar_icons/speak.png" preload="true" />
+ <texture name="Command_View_Icon" file_name="toolbar_icons/view.png" preload="true" />
+ <texture name="Command_Voice_Icon" file_name="toolbar_icons/nearbyvoice.png" preload="true" />
+ <texture name="Caret_Bottom_Icon" file_name="toolbar_icons/caret_bottom.png" preload="true" scale.left="1" scale.top="23" scale.right="15" scale.bottom="1" />
+ <texture name="Caret_Right_Icon" file_name="toolbar_icons/caret_right.png" preload="true" scale.left="5" scale.top="15" scale.right="28" scale.bottom="1" />
+ <texture name="Caret_Left_Icon" file_name="toolbar_icons/caret_left.png" preload="true" scale.left="1" scale.top="15" scale.right="23" scale.bottom="1" />
<texture name="ComboButton_Disabled" file_name="widgets/ComboButton_Disabled.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" />
<texture name="ComboButton_Selected" file_name="widgets/ComboButton_Selected.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" />
<texture name="ComboButton_UpSelected" file_name="widgets/ComboButton_UpSelected.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" />
- <texture name="ComboButton_Up_On_Selected" file_name="widgets/ComboButton_Up_On_Selected.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" />
<texture name="ComboButton_On" file_name="widgets/ComboButton_On.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" />
<texture name="ComboButton_Off" file_name="widgets/ComboButton_Off.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" />
<texture name="ComboButton_UpOff" file_name="widgets/ComboButton_UpOff.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" />
@@ -161,6 +187,10 @@ with the same filename but different name
<texture name="Flag" file_name="navbar/Flag.png" preload="false" />
+ <texture name="Flyout_Left" file_name="windows/Flyout_Left.png" preload="false" />
+ <texture name="Flyout_Pointer" file_name="windows/Flyout_Pointer.png" preload="false" />
+ <texture name="Flyout_Right" file_name="windows/Flyout_Right.png" preload="false" />
+
<texture name="Folder_Arrow" file_name="folder_arrow.tga" preload="false" />
<texture name="ForSale_Badge" file_name="icons/ForSale_Badge.png" preload="false" />
<texture name="ForwardArrow_Off" file_name="icons/ForwardArrow_Off.png" preload="false" />
@@ -357,22 +387,9 @@ with the same filename but different name
<texture name="OptionsMenu_Off" file_name="icons/OptionsMenu_Off.png" preload="false" />
<texture name="OptionsMenu_Press" file_name="icons/OptionsMenu_Press.png" preload="false" />
- <texture name="OutboxPush_Disabled" file_name="icons/OutboxPush_Disabled.png" preload="true" />
- <texture name="OutboxPush_Off" file_name="icons/OutboxPush_Off.png" preload="true" />
- <texture name="OutboxPush_On" file_name="icons/OutboxPush_On.png" preload="true" />
- <texture name="OutboxPush_On_Over" file_name="icons/OutboxPush_On_Over.png" preload="true" />
- <texture name="OutboxPush_Over" file_name="icons/OutboxPush_Over.png" preload="true" />
- <texture name="OutboxPush_Press" file_name="icons/OutboxPush_Press.png" preload="true" />
- <texture name="OutboxPush_Progress_1" file_name="icons/OutboxPush_Progress_1.png" preload="true" />
- <texture name="OutboxPush_Progress_2" file_name="icons/OutboxPush_Progress_2.png" preload="true" />
- <texture name="OutboxPush_Progress_3" file_name="icons/OutboxPush_Progress_3.png" preload="true" />
- <texture name="OutboxPush_Progress_4" file_name="icons/OutboxPush_Progress_4.png" preload="true" />
- <texture name="OutboxPush_Progress_5" file_name="icons/OutboxPush_Progress_5.png" preload="true" />
- <texture name="OutboxPush_Progress_6" file_name="icons/OutboxPush_Progress_6.png" preload="true" />
- <texture name="OutboxPush_Selected" file_name="icons/OutboxPush_Selected.png" preload="true" />
- <texture name="OutboxPush_Selected_Disabled" file_name="icons/OutboxPush_Selected_Disabled.png" preload="true" />
- <texture name="OutboxPush_Selected_Over" file_name="icons/OutboxPush_Selected_Over.png" preload="true" />
- <texture name="OutboxPush_Selected_Press" file_name="icons/OutboxPush_Selected_Press.png" preload="true" />
+ <texture name="OutboxStatus_Success" file_name="green_checkmark.png" preload="false" />
+ <texture name="OutboxStatus_Warning" file_name="icons/pop_up_caution.png" preload="false" />
+ <texture name="OutboxStatus_Error" file_name="red_x.png" preload="false" />
<texture name="PanOrbit_Off" file_name="bottomtray/PanOrbit_Off.png" preload="false" />
@@ -432,6 +449,7 @@ with the same filename but different name
<texture name="PushButton_Off" file_name="widgets/PushButton_Off.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" />
<texture name="PushButton_On" file_name="widgets/PushButton_On.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" />
<texture name="PushButton_On_Selected" file_name="widgets/PushButton_On_Selected.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" />
+ <texture name="PushButton_Over" file_name="widgets/PushButton_Over.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" />
<texture name="PushButton_Press" file_name="widgets/PushButton_Press.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" />
<texture name="PushButton_Selected" file_name="widgets/PushButton_Selected.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" />
<texture name="PushButton_Selected_Press" file_name="widgets/PushButton_Selected_Press.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" />
@@ -449,7 +467,11 @@ with the same filename but different name
<texture name="Resize_Corner" file_name="windows/Resize_Corner.png" preload="true" />
- <texture name="Rounded_Rect" file_name="Rounded_Rect.png" preload="true" scale.left="6" scale.top="24" scale.right="58" scale.bottom="6" />
+ <texture name="Rounded_Rect" file_name="Rounded_Rect.png" preload="true" scale.left="6" scale.top="26" scale.right="58" scale.bottom="6" />
+ <texture name="Rounded_Rect_Top" file_name="Rounded_Rect.png" preload="true" scale.left="6" scale.top="8" scale.right="58" scale.bottom="0" clip.left="0" clip.right="64" clip.bottom="16" clip.top="32" />
+ <texture name="Rounded_Rect_Bottom" file_name="Rounded_Rect.png" preload="true" scale.left="6" scale.top="16" scale.right="58" scale.bottom="8" clip.left="0" clip.right="64" clip.bottom="0" clip.top="16" />
+ <texture name="Rounded_Rect_Left" file_name="Rounded_Rect.png" preload="true" scale.left="6" scale.top="26" scale.right="32" scale.bottom="6" clip.left="0" clip.right="32" clip.bottom="0" clip.top="32" />
+ <texture name="Rounded_Rect_Right" file_name="Rounded_Rect.png" preload="true" scale.left="0" scale.top="26" scale.right="26" scale.bottom="6" clip.left="32" clip.right="64" clip.bottom="0" clip.top="32" />
<texture name="Rounded_Square" file_name="rounded_square.j2c" preload="true" scale.left="16" scale.top="16" scale.right="112" scale.bottom="16" />
<texture name="Row_Selection" file_name="navbar/Row_Selection.png" preload="false" />
@@ -513,6 +535,10 @@ with the same filename but different name
<texture name="Unknown_Icon" file_name="icons/unknown_icon.png" preload="true" />
<texture name="Snapshot_Off" file_name="bottomtray/Snapshot_Off.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
+ <texture name="Snapshot_Download" file_name="snapshot_download.png" preload="false" />
+ <texture name="Snapshot_Email" file_name="snapshot_email.png" preload="false" />
+ <texture name="Snapshot_Inventory" file_name="toolbar_icons/inventory.png" preload="false" />
+ <texture name="Snapshot_Profile" file_name="toolbar_icons/profile.png" preload="false" />
<texture name="startup_logo" file_name="windows/startup_logo.png" preload="true" />
@@ -534,21 +560,13 @@ with the same filename but different name
<texture name="Sync_Progress_5" file_name="icons/Sync_Progress_5.png" preload="true" />
<texture name="Sync_Progress_6" file_name="icons/Sync_Progress_6.png" preload="true" />
- <texture name="TabIcon_Appearance_Off" file_name="taskpanel/TabIcon_Appearance_Off.png" preload="false" />
- <texture name="TabIcon_Appearance_Selected" file_name="taskpanel/TabIcon_Appearance_Selected.png" preload="false" />
<texture name="TabIcon_Close_Off" file_name="taskpanel/TabIcon_Close_Off.png" preload="false" />
- <texture name="TabIcon_Home_Off" file_name="taskpanel/TabIcon_Home_Off.png" preload="false" />
<texture name="TabIcon_Home_Selected" file_name="taskpanel/TabIcon_Home_Selected.png" preload="false" />
<texture name="TabIcon_Me_Off" file_name="taskpanel/TabIcon_Me_Off.png" preload="false" />
- <texture name="TabIcon_Me_Selected" file_name="taskpanel/TabIcon_Me_Selected.png" preload="false" />
<texture name="TabIcon_Open_Off" file_name="taskpanel/TabIcon_Open_Off.png" preload="false" />
<texture name="TabIcon_People_Off" file_name="taskpanel/TabIcon_People_Off.png" preload="false" />
- <texture name="TabIcon_People_Selected" file_name="taskpanel/TabIcon_People_Selected.png" preload="false" />
- <texture name="TabIcon_Places_Large" file_name="taskpanel/TabIcon_Places_Large.png" preload="false" />
<texture name="TabIcon_Places_Off" file_name="taskpanel/TabIcon_Places_Off.png" preload="false" />
- <texture name="TabIcon_Places_Selected" file_name="taskpanel/TabIcon_Places_Selected.png" preload="false" />
<texture name="TabIcon_Things_Off" file_name="taskpanel/TabIcon_Things_Off.png" preload="false" />
- <texture name="TabIcon_Things_Selected" file_name="taskpanel/TabIcon_Things_Selected.png" preload="false" />
<texture name="TabTop_Right_Off" file_name="containers/TabTop_Right_Off.png" preload="false" scale.left="8" scale.top="8" scale.right="62" scale.bottom="9" />
<texture name="TabTop_Right_Selected" file_name="containers/TabTop_Right_Selected.png" preload="false" scale.left="8" scale.top="8" scale.right="62" scale.bottom="9" />
@@ -612,6 +630,12 @@ with the same filename but different name
<texture name="VoicePTT_Lvl3" file_name="bottomtray/VoicePTT_Lvl3.png" preload="false" />
<texture name="VoicePTT_Off" file_name="bottomtray/VoicePTT_Off.png" preload="false" />
<texture name="VoicePTT_On" file_name="bottomtray/VoicePTT_On.png" preload="false" />
+
+ <texture name="VoicePTT_Lvl1_Dark" file_name="bottomtray/VoicePTT_Lvl1_Dark.png" preload="false" />
+ <texture name="VoicePTT_Lvl2_Dark" file_name="bottomtray/VoicePTT_Lvl2_Dark.png" preload="false" />
+ <texture name="VoicePTT_Lvl3_Dark" file_name="bottomtray/VoicePTT_Lvl3_Dark.png" preload="false" />
+ <texture name="VoicePTT_Off_Dark" file_name="bottomtray/VoicePTT_Off_Dark.png" preload="false" />
+ <texture name="VoicePTT_On_Dark" file_name="bottomtray/VoicePTT_On_Dark.png" preload="false" />
<texture name="Wearables_Divider" file_name="windows/Wearables_Divider.png" preload="false" />
@@ -644,9 +668,6 @@ with the same filename but different name
<!--WARNING OLD ART BELOW *do not use*-->
<texture name="icn_media_web.tga" preload="true" />
<texture name="icn_media_movie.tga" preload="true" />
- <texture name="icn_voice-localchat.tga" />
- <texture name="icn_voice-groupfocus.tga" />
- <texture name="icn_voice-pvtfocus.tga" />
<texture name="jump_left_out.tga" file_name="widgets/jump_left_out.png" />
<texture name="jump_left_in.tga" file_name="widgets/jump_left_in.png" />
@@ -680,7 +701,6 @@ with the same filename but different name
<texture name="icon_avatar_offline.tga" />
<texture name="icon_avatar_online.tga" />
- <texture name="icon_day_cycle.tga" />
<texture name="icon_diurnal.tga" />
<texture name="icon_for_sale.tga" file_name="icons/Icon_For_Sale.png" />
<texture name="icon_top_pick.tga" />
@@ -697,7 +717,6 @@ with the same filename but different name
<texture name="map_avatar_16.tga" />
<texture name="map_avatar_8.tga" />
<texture name="map_event.tga" />
- <texture name="map_event_mature.tga" />
<texture name="map_home.tga" />
<texture name="map_infohub.tga" />
<texture name="map_telehub.tga" />
@@ -737,4 +756,5 @@ with the same filename but different name
<texture name="Yellow_Gradient" file_name="windows/yellow_gradient.png"/>
<texture name="Popup_Caution" file_name="icons/pop_up_caution.png"/>
<texture name="Camera_Drag_Dot" file_name="world/CameraDragDot.png"/>
+ <texture name="NavBar Separator" file_name="navbar/separator.png"/>
</textures>
diff --git a/indra/newview/skins/default/textures/toolbar_icons/appearance.png b/indra/newview/skins/default/textures/toolbar_icons/appearance.png
new file mode 100644
index 0000000000..e6b1365388
--- /dev/null
+++ b/indra/newview/skins/default/textures/toolbar_icons/appearance.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/toolbar_icons/avatars.png b/indra/newview/skins/default/textures/toolbar_icons/avatars.png
new file mode 100644
index 0000000000..8fa0600cee
--- /dev/null
+++ b/indra/newview/skins/default/textures/toolbar_icons/avatars.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/toolbar_icons/build.png b/indra/newview/skins/default/textures/toolbar_icons/build.png
new file mode 100644
index 0000000000..e21ab3f0e4
--- /dev/null
+++ b/indra/newview/skins/default/textures/toolbar_icons/build.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/toolbar_icons/caret_bottom.png b/indra/newview/skins/default/textures/toolbar_icons/caret_bottom.png
new file mode 100644
index 0000000000..5f6a01eaa1
--- /dev/null
+++ b/indra/newview/skins/default/textures/toolbar_icons/caret_bottom.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/toolbar_icons/caret_left.png b/indra/newview/skins/default/textures/toolbar_icons/caret_left.png
new file mode 100644
index 0000000000..0b8090314c
--- /dev/null
+++ b/indra/newview/skins/default/textures/toolbar_icons/caret_left.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/toolbar_icons/caret_right.png b/indra/newview/skins/default/textures/toolbar_icons/caret_right.png
new file mode 100644
index 0000000000..044751560f
--- /dev/null
+++ b/indra/newview/skins/default/textures/toolbar_icons/caret_right.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/toolbar_icons/chat.png b/indra/newview/skins/default/textures/toolbar_icons/chat.png
new file mode 100644
index 0000000000..e0dbac495f
--- /dev/null
+++ b/indra/newview/skins/default/textures/toolbar_icons/chat.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/toolbar_icons/destinations.png b/indra/newview/skins/default/textures/toolbar_icons/destinations.png
new file mode 100644
index 0000000000..e2325f083a
--- /dev/null
+++ b/indra/newview/skins/default/textures/toolbar_icons/destinations.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/toolbar_icons/gestures.png b/indra/newview/skins/default/textures/toolbar_icons/gestures.png
new file mode 100644
index 0000000000..2404bb4e25
--- /dev/null
+++ b/indra/newview/skins/default/textures/toolbar_icons/gestures.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/toolbar_icons/howto.png b/indra/newview/skins/default/textures/toolbar_icons/howto.png
new file mode 100644
index 0000000000..8594d71113
--- /dev/null
+++ b/indra/newview/skins/default/textures/toolbar_icons/howto.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/toolbar_icons/inventory.png b/indra/newview/skins/default/textures/toolbar_icons/inventory.png
new file mode 100644
index 0000000000..ab3191255e
--- /dev/null
+++ b/indra/newview/skins/default/textures/toolbar_icons/inventory.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/toolbar_icons/land.png b/indra/newview/skins/default/textures/toolbar_icons/land.png
new file mode 100644
index 0000000000..89ea7604a4
--- /dev/null
+++ b/indra/newview/skins/default/textures/toolbar_icons/land.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/toolbar_icons/map.png b/indra/newview/skins/default/textures/toolbar_icons/map.png
new file mode 100644
index 0000000000..ed1049b7db
--- /dev/null
+++ b/indra/newview/skins/default/textures/toolbar_icons/map.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/toolbar_icons/marketplace.png b/indra/newview/skins/default/textures/toolbar_icons/marketplace.png
new file mode 100644
index 0000000000..62bad20be6
--- /dev/null
+++ b/indra/newview/skins/default/textures/toolbar_icons/marketplace.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/toolbar_icons/mini_cart.png b/indra/newview/skins/default/textures/toolbar_icons/mini_cart.png
new file mode 100644
index 0000000000..9fcf46794d
--- /dev/null
+++ b/indra/newview/skins/default/textures/toolbar_icons/mini_cart.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/toolbar_icons/mini_map.png b/indra/newview/skins/default/textures/toolbar_icons/mini_map.png
new file mode 100644
index 0000000000..ab0a654056
--- /dev/null
+++ b/indra/newview/skins/default/textures/toolbar_icons/mini_map.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/toolbar_icons/move.png b/indra/newview/skins/default/textures/toolbar_icons/move.png
new file mode 100644
index 0000000000..5c2ced7375
--- /dev/null
+++ b/indra/newview/skins/default/textures/toolbar_icons/move.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/toolbar_icons/nearbyvoice.png b/indra/newview/skins/default/textures/toolbar_icons/nearbyvoice.png
new file mode 100644
index 0000000000..77a7cd5f44
--- /dev/null
+++ b/indra/newview/skins/default/textures/toolbar_icons/nearbyvoice.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/toolbar_icons/outbox.png b/indra/newview/skins/default/textures/toolbar_icons/outbox.png
new file mode 100644
index 0000000000..0f3db1c47c
--- /dev/null
+++ b/indra/newview/skins/default/textures/toolbar_icons/outbox.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/toolbar_icons/people.png b/indra/newview/skins/default/textures/toolbar_icons/people.png
new file mode 100644
index 0000000000..7228ae8e2f
--- /dev/null
+++ b/indra/newview/skins/default/textures/toolbar_icons/people.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/toolbar_icons/picks.png b/indra/newview/skins/default/textures/toolbar_icons/picks.png
new file mode 100644
index 0000000000..befda04b42
--- /dev/null
+++ b/indra/newview/skins/default/textures/toolbar_icons/picks.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/toolbar_icons/places.png b/indra/newview/skins/default/textures/toolbar_icons/places.png
new file mode 100644
index 0000000000..97d9fa066c
--- /dev/null
+++ b/indra/newview/skins/default/textures/toolbar_icons/places.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/toolbar_icons/preferences.png b/indra/newview/skins/default/textures/toolbar_icons/preferences.png
new file mode 100644
index 0000000000..4ccd7b8ae1
--- /dev/null
+++ b/indra/newview/skins/default/textures/toolbar_icons/preferences.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/toolbar_icons/profile.png b/indra/newview/skins/default/textures/toolbar_icons/profile.png
new file mode 100644
index 0000000000..32fe2bf8ac
--- /dev/null
+++ b/indra/newview/skins/default/textures/toolbar_icons/profile.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/toolbar_icons/search.png b/indra/newview/skins/default/textures/toolbar_icons/search.png
new file mode 100644
index 0000000000..bcb11e950d
--- /dev/null
+++ b/indra/newview/skins/default/textures/toolbar_icons/search.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/toolbar_icons/snapshot.png b/indra/newview/skins/default/textures/toolbar_icons/snapshot.png
new file mode 100644
index 0000000000..d26da9b1d2
--- /dev/null
+++ b/indra/newview/skins/default/textures/toolbar_icons/snapshot.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/toolbar_icons/speak.png b/indra/newview/skins/default/textures/toolbar_icons/speak.png
new file mode 100644
index 0000000000..10cd354c5c
--- /dev/null
+++ b/indra/newview/skins/default/textures/toolbar_icons/speak.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/toolbar_icons/view.png b/indra/newview/skins/default/textures/toolbar_icons/view.png
new file mode 100644
index 0000000000..ddf0df7c26
--- /dev/null
+++ b/indra/newview/skins/default/textures/toolbar_icons/view.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/Checkbox_On_Over.png b/indra/newview/skins/default/textures/widgets/Checkbox_On_Over.png
deleted file mode 100644
index bc504d130e..0000000000
--- a/indra/newview/skins/default/textures/widgets/Checkbox_On_Over.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/Checkbox_Over.png b/indra/newview/skins/default/textures/widgets/Checkbox_Over.png
deleted file mode 100644
index 5a7162addf..0000000000
--- a/indra/newview/skins/default/textures/widgets/Checkbox_Over.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/ComboButton_Up_On_Selected.png b/indra/newview/skins/default/textures/widgets/ComboButton_Up_On_Selected.png
deleted file mode 100644
index fd1d11dd0b..0000000000
--- a/indra/newview/skins/default/textures/widgets/ComboButton_Up_On_Selected.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/DisclosureArrow_Closed_Over.png b/indra/newview/skins/default/textures/widgets/DisclosureArrow_Closed_Over.png
deleted file mode 100644
index 45bcb0464e..0000000000
--- a/indra/newview/skins/default/textures/widgets/DisclosureArrow_Closed_Over.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/DisclosureArrow_Opened_Over.png b/indra/newview/skins/default/textures/widgets/DisclosureArrow_Opened_Over.png
deleted file mode 100644
index dabbd85b34..0000000000
--- a/indra/newview/skins/default/textures/widgets/DisclosureArrow_Opened_Over.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/PushButton_On_Over.png b/indra/newview/skins/default/textures/widgets/PushButton_On_Over.png
deleted file mode 100644
index 064a4c4f7f..0000000000
--- a/indra/newview/skins/default/textures/widgets/PushButton_On_Over.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/PushButton_Selected_Over.png b/indra/newview/skins/default/textures/widgets/PushButton_Selected_Over.png
deleted file mode 100644
index 064a4c4f7f..0000000000
--- a/indra/newview/skins/default/textures/widgets/PushButton_Selected_Over.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/RadioButton_On_Over.png b/indra/newview/skins/default/textures/widgets/RadioButton_On_Over.png
deleted file mode 100644
index 3e7d803a28..0000000000
--- a/indra/newview/skins/default/textures/widgets/RadioButton_On_Over.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/RadioButton_Over.png b/indra/newview/skins/default/textures/widgets/RadioButton_Over.png
deleted file mode 100644
index a5c8cbe293..0000000000
--- a/indra/newview/skins/default/textures/widgets/RadioButton_Over.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/ScrollArrow_Down_Over.png b/indra/newview/skins/default/textures/widgets/ScrollArrow_Down_Over.png
deleted file mode 100644
index 605d159eaa..0000000000
--- a/indra/newview/skins/default/textures/widgets/ScrollArrow_Down_Over.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/ScrollArrow_Left_Over.png b/indra/newview/skins/default/textures/widgets/ScrollArrow_Left_Over.png
deleted file mode 100644
index c79547dffd..0000000000
--- a/indra/newview/skins/default/textures/widgets/ScrollArrow_Left_Over.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/ScrollArrow_Right_Over.png b/indra/newview/skins/default/textures/widgets/ScrollArrow_Right_Over.png
deleted file mode 100644
index e353542ad9..0000000000
--- a/indra/newview/skins/default/textures/widgets/ScrollArrow_Right_Over.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/ScrollArrow_Up_Over.png b/indra/newview/skins/default/textures/widgets/ScrollArrow_Up_Over.png
deleted file mode 100644
index dd2fceb716..0000000000
--- a/indra/newview/skins/default/textures/widgets/ScrollArrow_Up_Over.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/ScrollThumb_Horiz_Over.png b/indra/newview/skins/default/textures/widgets/ScrollThumb_Horiz_Over.png
deleted file mode 100644
index cf78ea3924..0000000000
--- a/indra/newview/skins/default/textures/widgets/ScrollThumb_Horiz_Over.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/ScrollThumb_Vert_Over.png b/indra/newview/skins/default/textures/widgets/ScrollThumb_Vert_Over.png
deleted file mode 100644
index 53587197da..0000000000
--- a/indra/newview/skins/default/textures/widgets/ScrollThumb_Vert_Over.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_On.png b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_On.png
deleted file mode 100644
index 7afb9c99c3..0000000000
--- a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_On.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_On_Disabled.png b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_On_Disabled.png
deleted file mode 100644
index 77c4224539..0000000000
--- a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_On_Disabled.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_On_Over.png b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_On_Over.png
deleted file mode 100644
index 8b93dd551e..0000000000
--- a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_On_Over.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_On_Selected.png b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_On_Selected.png
deleted file mode 100644
index 3f207cbea2..0000000000
--- a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_On_Selected.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_On.png b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_On.png
deleted file mode 100644
index 220df9db25..0000000000
--- a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_On.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_On_Over.png b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_On_Over.png
deleted file mode 100644
index 5bbcdcb0b4..0000000000
--- a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_On_Over.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_On_Press.png b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_On_Press.png
deleted file mode 100644
index dde367f05e..0000000000
--- a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_On_Press.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_Over.png b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_Over.png
deleted file mode 100644
index d4f30b9adb..0000000000
--- a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_Over.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_Selected_Over.png b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_Selected_Over.png
deleted file mode 100644
index 5bbcdcb0b4..0000000000
--- a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_Selected_Over.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_On.png b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_On.png
deleted file mode 100644
index 467c43fc90..0000000000
--- a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_On.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_On_Over.png b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_On_Over.png
deleted file mode 100644
index 2049736897..0000000000
--- a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_On_Over.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_Selected_Over.png b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_Selected_Over.png
deleted file mode 100644
index 2049736897..0000000000
--- a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_Selected_Over.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/SliderThumb_Over.png b/indra/newview/skins/default/textures/widgets/SliderThumb_Over.png
deleted file mode 100644
index b6f900d3bd..0000000000
--- a/indra/newview/skins/default/textures/widgets/SliderThumb_Over.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/Stepper_Down_Over.png b/indra/newview/skins/default/textures/widgets/Stepper_Down_Over.png
deleted file mode 100644
index 01e0a2d9f1..0000000000
--- a/indra/newview/skins/default/textures/widgets/Stepper_Down_Over.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/Stepper_Up_Over.png b/indra/newview/skins/default/textures/widgets/Stepper_Up_Over.png
deleted file mode 100644
index 2ce84ea5be..0000000000
--- a/indra/newview/skins/default/textures/widgets/Stepper_Up_Over.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/windows/Flyout.png b/indra/newview/skins/default/textures/windows/Flyout.png
deleted file mode 100644
index 5596b194c9..0000000000
--- a/indra/newview/skins/default/textures/windows/Flyout.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/windows/Flyout_Left.png b/indra/newview/skins/default/textures/windows/Flyout_Left.png
new file mode 100644
index 0000000000..6ac9fe2efd
--- /dev/null
+++ b/indra/newview/skins/default/textures/windows/Flyout_Left.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/windows/Flyout_Pointer_Up.png b/indra/newview/skins/default/textures/windows/Flyout_Pointer_Up.png
deleted file mode 100644
index 361fab59e0..0000000000
--- a/indra/newview/skins/default/textures/windows/Flyout_Pointer_Up.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/windows/Flyout_Right.png b/indra/newview/skins/default/textures/windows/Flyout_Right.png
new file mode 100644
index 0000000000..aa1f0625aa
--- /dev/null
+++ b/indra/newview/skins/default/textures/windows/Flyout_Right.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/windows/Icon_Gear_Over.png b/indra/newview/skins/default/textures/windows/Icon_Gear_Over.png
deleted file mode 100644
index 67bd399358..0000000000
--- a/indra/newview/skins/default/textures/windows/Icon_Gear_Over.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/windows/Icon_Undock_Press.png b/indra/newview/skins/default/textures/windows/Icon_Undock_Press.png
deleted file mode 100644
index 3ab8c3666a..0000000000
--- a/indra/newview/skins/default/textures/windows/Icon_Undock_Press.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/xui/da/floater_about.xml b/indra/newview/skins/default/xui/da/floater_about.xml
index 0ccaab73ba..fc8bc33096 100644
--- a/indra/newview/skins/default/xui/da/floater_about.xml
+++ b/indra/newview/skins/default/xui/da/floater_about.xml
@@ -10,7 +10,7 @@
<floater.string name="AboutPosition">
Du er ved [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1] i regionen [REGION] lokaliseret ved &lt;nolink&gt;[HOSTNAME]&lt;/nolink&gt; ([HOSTIP])
[SERVER_VERSION]
-[[SERVER_RELEASE_NOTES_URL] [ReleaseNotes]]
+[SERVER_RELEASE_NOTES_URL]
</floater.string>
<floater.string name="AboutSystem">
CPU: [CPU]
diff --git a/indra/newview/skins/default/xui/da/floater_buy_currency.xml b/indra/newview/skins/default/xui/da/floater_buy_currency.xml
index ec47b2f445..3c0428b2b0 100644
--- a/indra/newview/skins/default/xui/da/floater_buy_currency.xml
+++ b/indra/newview/skins/default/xui/da/floater_buy_currency.xml
@@ -46,7 +46,7 @@
L$ [AMT]
</text>
<text name="currency_links">
- [http://www.secondlife.com/my/account/payment_method_management.php payment method] | [http://www.secondlife.com/my/account/currency.php currency] | [http://www.secondlife.com/my/account/exchange_rates.php exchange rate]
+ [http://www.secondlife.com/my/account/payment_method_management.php payment method] | [http://www.secondlife.com/my/account/currency.php currency]
</text>
<text name="exchange_rate_note">
Indtast beløbet for at se nyeste valutakurs.
diff --git a/indra/newview/skins/default/xui/da/floater_camera.xml b/indra/newview/skins/default/xui/da/floater_camera.xml
index 5b7ef6db54..b5d5e8bc08 100644
--- a/indra/newview/skins/default/xui/da/floater_camera.xml
+++ b/indra/newview/skins/default/xui/da/floater_camera.xml
@@ -9,15 +9,6 @@
<floater.string name="move_tooltip">
Flyt kamera op og ned, til venstre og højre
</floater.string>
- <floater.string name="camera_modes_title">
- Kamera valg
- </floater.string>
- <floater.string name="pan_mode_title">
- Kredsløb zoom panorering
- </floater.string>
- <floater.string name="presets_mode_title">
- Forvalg
- </floater.string>
<floater.string name="free_mode_title">
Se objekt
</floater.string>
diff --git a/indra/newview/skins/default/xui/da/floater_nearby_chat.xml b/indra/newview/skins/default/xui/da/floater_nearby_chat.xml
index bd17224259..76bc40edac 100644
--- a/indra/newview/skins/default/xui/da/floater_nearby_chat.xml
+++ b/indra/newview/skins/default/xui/da/floater_nearby_chat.xml
@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="nearby_chat" title="CHAT NÆRVED">
- <check_box label="Oversæt chat (håndteret af Google)" name="translate_chat_checkbox"/>
+ <check_box label="Oversæt chat" name="translate_chat_checkbox"/>
</floater>
diff --git a/indra/newview/skins/default/xui/da/menu_viewer.xml b/indra/newview/skins/default/xui/da/menu_viewer.xml
index c2f7d26dc9..d695cd1f89 100644
--- a/indra/newview/skins/default/xui/da/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/da/menu_viewer.xml
@@ -20,8 +20,6 @@
<menu_item_call label="Væk" name="Set Away"/>
<menu_item_call label="Optaget" name="Set Busy"/>
</menu>
- <menu_item_call label="Anmod om administrator status" name="Request Admin Options"/>
- <menu_item_call label="Stop administrator status" name="Leave Admin Options"/>
<menu_item_call label="Afslut [APP_NAME]" name="Quit"/>
</menu>
<menu label="Kommunikér" name="Communicate">
@@ -36,11 +34,10 @@
<menu_item_check label="Søg" name="Search"/>
<menu_item_call label="Foto" name="Take Snapshot"/>
<menu_item_call label="Opret landemærke for dette sted" name="Create Landmark Here"/>
- <menu label="Profil for sted" name="Land">
- <menu_item_call label="Profil for sted" name="Place Profile"/>
- <menu_item_call label="Om land" name="About Land"/>
- <menu_item_call label="Region/Estate" name="Region/Estate"/>
- </menu>
+ <menu_item_separator/>
+ <menu_item_call label="Profil for sted" name="Place Profile"/>
+ <menu_item_call label="Om land" name="About Land"/>
+ <menu_item_call label="Region/Estate" name="Region/Estate"/>
<menu_item_call label="Køb dette land" name="Buy Land"/>
<menu_item_call label="Mit land" name="My Land"/>
<menu label="Vis" name="LandShow">
@@ -56,7 +53,7 @@
</menu>
<menu_item_call label="Teleport hjem" name="Teleport Home"/>
<menu_item_call label="Sæt dette sted som &apos;Hjem&apos;" name="Set Home to Here"/>
- <menu label="Sol" name="Environment Settings">
+ <menu label="Sol" name="Sun">
<menu_item_call label="Solopgang" name="Sunrise"/>
<menu_item_call label="Middag" name="Noon"/>
<menu_item_call label="Solnedgang" name="Sunset"/>
@@ -121,6 +118,7 @@
<menu_item_call label="Model..." name="Upload Model"/>
<menu_item_call label="Model Wizard..." name="Upload Model Wizard"/>
<menu_item_call label="Mange (L$[COST] pr. fil)..." name="Bulk Upload"/>
+ <menu_item_call label="Sæt standardværdier for upload rettigheder" name="perm prefs"/>
</menu>
<menu_item_call label="Fortyd" name="Undo"/>
<menu_item_call label="Gendan" name="Redo"/>
@@ -154,22 +152,22 @@
<menu_item_check label="Vis muse-sigte" name="ShowCrosshairs"/>
</menu>
<menu label="Gengivelsestyper" name="Rendering Types">
- <menu_item_check label="Simpel" name="Simple"/>
- <menu_item_check label="Alpha" name="Alpha"/>
- <menu_item_check label="Træer" name="Tree"/>
- <menu_item_check label="Avatarer" name="Character"/>
- <menu_item_check label="Surface Patch" name="Surface Patch"/>
- <menu_item_check label="Himmel" name="Sky"/>
- <menu_item_check label="Vand" name="Water"/>
- <menu_item_check label="Jord" name="Ground"/>
- <menu_item_check label="Volume" name="Volume"/>
- <menu_item_check label="Græs" name="Grass"/>
- <menu_item_check label="Skyer" name="Clouds"/>
- <menu_item_check label="Partikler" name="Particles"/>
- <menu_item_check label="Bump" name="Bump"/>
+ <menu_item_check label="Simpel" name="Rendering Type Simple"/>
+ <menu_item_check label="Alpha" name="Rendering Type Alpha"/>
+ <menu_item_check label="Træer" name="Rendering Type Tree"/>
+ <menu_item_check label="Avatarer" name="Rendering Type Character"/>
+ <menu_item_check label="Surface Patch" name="Rendering Type Surface Patch"/>
+ <menu_item_check label="Himmel" name="Rendering Type Sky"/>
+ <menu_item_check label="Vand" name="Rendering Type Water"/>
+ <menu_item_check label="Jord" name="Rendering Type Ground"/>
+ <menu_item_check label="Volume" name="Rendering Type Volume"/>
+ <menu_item_check label="Græs" name="Rendering Type Grass"/>
+ <menu_item_check label="Skyer" name="Rendering Type Clouds"/>
+ <menu_item_check label="Partikler" name="Rendering Type Particles"/>
+ <menu_item_check label="Bump" name="Rendering Type Bump"/>
</menu>
<menu label="Gengivelsesegenskaber" name="Rendering Features">
- <menu_item_check label="UI" name="UI"/>
+ <menu_item_check label="UI" name="ToggleUI"/>
<menu_item_check label="Valgte" name="Selected"/>
<menu_item_check label="Fremhævede" name="Highlighted"/>
<menu_item_check label="Dynamiske teksturer" name="Dynamic Textures"/>
@@ -181,10 +179,7 @@
<menu_item_call label="Tøm gruppe cache" name="ClearGroupCache"/>
<menu_item_check label="Muse udjævning" name="Mouse Smoothing"/>
<menu label="Shortcuts" name="Shortcuts">
- <menu_item_call label="Billede (L$[COST])..." name="Upload Image"/>
- <menu_item_check label="Søg" name="Search"/>
<menu_item_call label="Frigør taster" name="Release Keys"/>
- <menu_item_call label="Sæt UI størrelse til standard" name="Set UI Size to Default"/>
<menu_item_check label="Vis avanceret menu (gammel genvej)" name="Show Advanced Menu - legacy shortcut"/>
<menu_item_call label="Luk vindue" name="Close Window"/>
<menu_item_call label="Luk alle vinduer" name="Close All Windows"/>
@@ -193,13 +188,6 @@
<menu_item_check label="&quot;Joystick Flycam&quot;" name="Joystick Flycam"/>
<menu_item_call label="Nulstil udsyn" name="Reset View"/>
<menu_item_call label="Se på den sidste der chattede" name="Look at Last Chatter"/>
- <menu label="Vælg byggeværktøj" name="Select Tool">
- <menu_item_call label="Fokuseringsværktøj" name="Focus"/>
- <menu_item_call label="Flyt værktøj" name="Move"/>
- <menu_item_call label="Redigeringsværktøj" name="Edit"/>
- <menu_item_call label="Opret værktøj" name="Create"/>
- <menu_item_call label="Land værktøj" name="Land"/>
- </menu>
<menu_item_call label="Zoom ind" name="Zoom In"/>
<menu_item_call label="Zoom standard" name="Zoom Default"/>
<menu_item_call label="Zoom ud" name="Zoom Out"/>
@@ -275,9 +263,8 @@
<menu_item_call label="Mist en netværkspakke" name="Drop a Packet"/>
</menu>
<menu_item_call label="Stød, skub &amp; slag" name="Bumps, Pushes &amp;amp; Hits"/>
- <menu label="Verden" name="World">
+ <menu label="Verden" name="DevelopWorld">
<menu_item_check label="Vælg anden sol end region" name="Sim Sun Override"/>
- <menu_item_check label="Pejlelys blink effekt" name="Cheesy Beacon"/>
<menu_item_check label="Fast vejr" name="Fixed Weather"/>
<menu_item_call label="Dump Region Object Cache" name="Dump Region Object Cache"/>
</menu>
@@ -299,11 +286,11 @@
</menu>
<menu label="Avatar" name="Character">
<menu label="Grab Baked Texture" name="Grab Baked Texture">
- <menu_item_call label="Iris" name="Iris"/>
- <menu_item_call label="Hovede" name="Head"/>
- <menu_item_call label="Overkrop" name="Upper Body"/>
- <menu_item_call label="Underkrop" name="Lower Body"/>
- <menu_item_call label="Nederdel" name="Skirt"/>
+ <menu_item_call label="Iris" name="Grab Iris"/>
+ <menu_item_call label="Hovede" name="Grab Head"/>
+ <menu_item_call label="Overkrop" name="Grab Upper Body"/>
+ <menu_item_call label="Underkrop" name="Grab Lower Body"/>
+ <menu_item_call label="Nederdel" name="Grab Skirt"/>
</menu>
<menu label="Avatar tests" name="Character Tests">
<menu_item_call label="Skift avatar geometri" name="Toggle Character Geometry"/>
@@ -325,8 +312,8 @@
<menu_item_check label="Vis administrationsmenu" name="View Admin Options"/>
</menu>
<menu label="Administrér" name="Admin">
- <menu label="Object">
- <menu_item_call label="Tag kopi" name="Take Copy"/>
+ <menu label="Object" name="AdminObject">
+ <menu_item_call label="Tag kopi" name="Admin Take Copy"/>
<menu_item_call label="Gennemtving ejer til mig" name="Force Owner To Me"/>
<menu_item_call label="Gennemtving ejer tolerance" name="Force Owner Permissive"/>
<menu_item_call label="Slet" name="Delete"/>
diff --git a/indra/newview/skins/default/xui/da/notifications.xml b/indra/newview/skins/default/xui/da/notifications.xml
index 3ccdfc036a..cf6f1ccdd9 100644
--- a/indra/newview/skins/default/xui/da/notifications.xml
+++ b/indra/newview/skins/default/xui/da/notifications.xml
@@ -438,7 +438,7 @@ Tilbyd venskab til [NAME]?
</form>
</notification>
<notification name="RemoveFromFriends">
- Ønsker du at fjerne [NAME] fra din venneliste?
+ Ønsker du at fjerne &lt;nolink&gt;[NAME]&lt;/nolink&gt; fra din venneliste?
</notification>
<notification name="ConfirmItemDeleteHasLinks">
Mindst en af genstandene har lænkede genstande der peger på den. Hvis du sletter denne genstand, vil lænkninger ikke virke mere. Det anbefales kraftigt at fjerne lænkninger først.
@@ -1023,10 +1023,10 @@ Henvis til dette fra en hjemmeside for at give andre nem adgang til denne lokati
Erstattet manglende tøj/kropsdele med standard.
</notification>
<notification name="FriendOnline">
- [NAME] er logget på
+ &lt;nolink&gt;[NAME]&lt;/nolink&gt; er logget på
</notification>
<notification name="FriendOffline">
- [NAME] er logget af
+ &lt;nolink&gt;[NAME]&lt;/nolink&gt; er logget af
</notification>
<notification name="AddSelfFriend">
Selvom du nok er meget sød, kan du ikke tilføje dig selv som ven.
@@ -1404,10 +1404,10 @@ Prøv igen om lidt.
(Som udgangspunkt, vil du være i stand til at se den andens online status)
</notification>
<notification name="FriendshipAccepted">
- [NAME] accepterede dit tilbud om venskab.
+ &lt;nolink&gt;[NAME]&lt;/nolink&gt; accepterede dit tilbud om venskab.
</notification>
<notification name="FriendshipDeclined">
- [NAME] afviste dit tilbud om venskab.
+ &lt;nolink&gt;[NAME]&lt;/nolink&gt; afviste dit tilbud om venskab.
</notification>
<notification name="FriendshipAcceptedByMe">
Tilbud om venskab accepteret.
diff --git a/indra/newview/skins/default/xui/da/panel_my_profile.xml b/indra/newview/skins/default/xui/da/panel_my_profile.xml
deleted file mode 100644
index 94da58389f..0000000000
--- a/indra/newview/skins/default/xui/da/panel_my_profile.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Profil" name="panel_profile">
- <string name="no_partner_text" value="Ingen"/>
- <string name="no_group_text" value="Ingen"/>
- <string name="RegisterDateFormat">
- [REG_DATE] ([AGE])
- </string>
- <string name="name_text_args">
- [NAME]
- </string>
- <string name="display_name_text_args">
- [DISPLAY_NAME]
- </string>
- <layout_stack name="layout">
- <layout_panel name="profile_stack">
- <scroll_container name="profile_scroll">
- <panel name="scroll_content_panel">
- <panel name="second_life_image_panel">
- <text name="display_name_descr_text">
- Brugernavn
- </text>
- <text name="name_descr_text">
- Visningsnavn
- </text>
- <button label="Profil" name="see_profile_btn" tool_tip="Se profil for denne avatar"/>
- </panel>
- </panel>
- </scroll_container>
- </layout_panel>
- </layout_stack>
-</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_notes.xml b/indra/newview/skins/default/xui/da/panel_notes.xml
deleted file mode 100644
index 7d8097f6ff..0000000000
--- a/indra/newview/skins/default/xui/da/panel_notes.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Noter &amp; Privatliv" name="panel_notes">
- <layout_stack name="layout">
- <layout_panel name="notes_stack">
- <scroll_container name="profile_scroll">
- <panel name="profile_scroll_panel">
- <text name="status_message" value="Min private noter:"/>
- <text name="status_message2" value="Tillad denne person at:"/>
- <check_box label="Se min online status" name="status_check"/>
- <check_box label="Se mig på kortet" name="map_check"/>
- <check_box label="Editére, slette og tage mine objekter" name="objects_check"/>
- </panel>
- </scroll_container>
- </layout_panel>
- <layout_panel name="notes_buttons_panel">
- <layout_stack name="bottom_bar_ls">
- <layout_panel name="add_friend_btn_lp">
- <button label="Tilføj ven" name="add_friend" tool_tip="Tilbyd venskab til beboer"/>
- </layout_panel>
- <layout_panel name="im_btn_lp">
- <button label="IM" name="im" tool_tip="Ã…ben session med personlige beskeder"/>
- </layout_panel>
- <layout_panel name="call_btn_lp">
- <button label="Opkald" name="call" tool_tip="Opkald til denne beboer"/>
- </layout_panel>
- <layout_panel name="show_on_map_btn_lp">
- <button label="Kort" name="show_on_map_btn" tool_tip="Vis denne beboer på kortet"/>
- </layout_panel>
- <layout_panel name="teleport_btn_lp">
- <button label="Teleportér" name="teleport" tool_tip="Tilbyd teleport"/>
- </layout_panel>
- </layout_stack>
- </layout_panel>
- </layout_stack>
-</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_preferences_chat.xml b/indra/newview/skins/default/xui/da/panel_preferences_chat.xml
index 19c82509cd..890a3038ef 100644
--- a/indra/newview/skins/default/xui/da/panel_preferences_chat.xml
+++ b/indra/newview/skins/default/xui/da/panel_preferences_chat.xml
@@ -31,7 +31,7 @@
<spinner label="Tid før chatvisning forsvinder:" name="nearby_toasts_fadingtime"/>
<check_box name="translate_chat_checkbox"/>
<text name="translate_chb_label">
- Benyt maskinel oversættelse ved chat (håndteret af Google)
+ Benyt maskinel oversættelse ved chat
</text>
<text name="translate_language_text" width="110">
Oversæt chat til :
@@ -51,7 +51,7 @@
<combo_box.item label="РуÑÑкий (Russisk)" name="Russian"/>
<combo_box.item label="Türkçe (Tyrkisk)" name="Turkish"/>
<combo_box.item label="УкраїнÑька (Ukrainsk)" name="Ukrainian"/>
- <combo_box.item label="中文 (简体) (Kinesisk)" name="Chinese"/>
+ <combo_box.item label="中文 (正體) (Kinesisk)" name="Chinese"/>
<combo_box.item label="日本語 (Japansk)" name="Japanese"/>
<combo_box.item label="한국어 (Koreansk)" name="Korean"/>
</combo_box>
diff --git a/indra/newview/skins/default/xui/da/panel_profile.xml b/indra/newview/skins/default/xui/da/panel_profile.xml
deleted file mode 100644
index db85eb23a8..0000000000
--- a/indra/newview/skins/default/xui/da/panel_profile.xml
+++ /dev/null
@@ -1,59 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Profil" name="panel_profile">
- <string name="no_partner_text" value="Ingen"/>
- <string name="no_group_text" value="Ingen"/>
- <string name="RegisterDateFormat">
- [REG_DATE] ([AGE])
- </string>
- <string name="name_text_args">
- [NAME]
- </string>
- <string name="display_name_text_args">
- [DISPLAY_NAME]
- </string>
- <layout_stack name="layout">
- <layout_panel name="profile_stack">
- <scroll_container name="profile_scroll">
- <panel name="profile_scroll_panel">
- <panel name="second_life_image_panel">
- <text name="title_sl_descr_text" value="[SECOND_LIFE]:"/>
- </panel>
- <panel name="first_life_image_panel">
- <text name="title_rw_descr_text" value="Real World:"/>
- </panel>
- <text name="title_member_text" value="Beboer siden:"/>
- <text name="title_acc_status_text" value="Konto status:"/>
- <text name="title_partner_text" value="Partner:"/>
- <panel name="partner_data_panel">
- <text initial_value="(henter)" name="partner_text"/>
- </panel>
- <text name="title_groups_text" value="Grupper:"/>
- </panel>
- </scroll_container>
- </layout_panel>
- </layout_stack>
- <layout_stack name="layout_verb_buttons">
- <layout_panel name="profile_buttons_panel">
- <layout_stack name="bottom_bar_ls">
- <layout_panel name="add_friend_btn_lp">
- <button label="Tilføj ven" name="add_friend" tool_tip="Tilbyd venskab til beboeren"/>
- </layout_panel>
- <layout_panel name="im_btn_lp">
- <button label="Personlig besked" name="im" tool_tip="Ã…ben session med personlig besked"/>
- </layout_panel>
- <layout_panel name="call_btn_lp">
- <button label="Opkald" name="call" tool_tip="Opkald til denne beboer"/>
- </layout_panel>
- <layout_panel name="chat_btn_lp">
- <button label="Teleportér" name="teleport" tool_tip="Tilbyd teleport"/>
- </layout_panel>
- <layout_panel name="overflow_btn_lp">
- <menu_button label="â–¼" name="overflow_btn" tool_tip="Betal eller del beholdning med denne beboer"/>
- </layout_panel>
- </layout_stack>
- </layout_panel>
- <layout_panel name="profile_me_buttons_panel">
- <button label="Redigér profil" name="edit_profile_btn" tool_tip="Redigér din personlige information"/>
- </layout_panel>
- </layout_stack>
-</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_profile_view.xml b/indra/newview/skins/default/xui/da/panel_profile_view.xml
deleted file mode 100644
index e6e8ca4d10..0000000000
--- a/indra/newview/skins/default/xui/da/panel_profile_view.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="panel_target_profile">
- <string name="status_online">
- Online
- </string>
- <string name="status_offline">
- Offline
- </string>
- <text name="display_name_label" value="Visningsnavn:"/>
- <text name="solo_username_label" value="Brugernavn:"/>
- <text name="status" value="Online"/>
- <text name="user_name_small" value="Se på mig med dette enormt ekstremt super lange navn"/>
- <button name="copy_to_clipboard" tool_tip="Kopiér til udskriftsholder"/>
- <text name="user_label" value="Brugernavn:"/>
- <tab_container name="tabs">
- <panel label="PROFIL" name="panel_profile"/>
- <panel label="FAVORITTER" name="panel_picks"/>
- <panel label="NOTER &amp; PRIVATLIV" name="panel_notes"/>
- </tab_container>
-</panel>
diff --git a/indra/newview/skins/default/xui/da/strings.xml b/indra/newview/skins/default/xui/da/strings.xml
index 165d47c931..11d100eeff 100644
--- a/indra/newview/skins/default/xui/da/strings.xml
+++ b/indra/newview/skins/default/xui/da/strings.xml
@@ -560,6 +560,9 @@ Prøv venligst om lidt igen.
<string name="mesh">
mesh
</string>
+ <string name="AvatarEditingAppearance">
+ (Redigering Udseende)
+ </string>
<string name="AvatarAway">
Væk
</string>
diff --git a/indra/newview/skins/default/xui/da/teleport_strings.xml b/indra/newview/skins/default/xui/da/teleport_strings.xml
index 071aab46f4..0d89fae986 100644
--- a/indra/newview/skins/default/xui/da/teleport_strings.xml
+++ b/indra/newview/skins/default/xui/da/teleport_strings.xml
@@ -20,6 +20,10 @@ Hvis du stadig ikke kan teleporte, prøv venligst at logge ud og ligge ind for a
Beklager, systemet kunne ikke fuldføre teleport forbindelse.
Prøv igen om lidt.
</message>
+ <message name="NoHelpIslandTP">
+ Du kan ikke teleportere tilbage til Welcome Island.
+Gå til &apos;Welcome Island Puclic&apos; for at prøve tutorial igen.
+ </message>
<message name="noaccess_tport">
Beklager, du har ikke adgang til denne teleport destination.
</message>
diff --git a/indra/newview/skins/default/xui/de/floater_about.xml b/indra/newview/skins/default/xui/de/floater_about.xml
index 519efe9ce8..b4c28daac9 100644
--- a/indra/newview/skins/default/xui/de/floater_about.xml
+++ b/indra/newview/skins/default/xui/de/floater_about.xml
@@ -10,7 +10,7 @@
<floater.string name="AboutPosition">
Sie befinden sich in [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1] in [REGION] auf &lt;nolink&gt;[HOSTNAME]&lt;/nolink&gt; ([HOSTIP])
[SERVER_VERSION]
-[[SERVER_RELEASE_NOTES_URL] [ReleaseNotes]]
+[SERVER_RELEASE_NOTES_URL]
</floater.string>
<floater.string name="AboutSystem">
CPU: [CPU]
@@ -37,6 +37,9 @@ Voice-Serverversion: [VOICE_VERSION]
<floater.string name="AboutTraffic">
Paketverlust: [PACKETS_LOST,number,0]/[PACKETS_IN,number,0] ([PACKETS_PCT,number,1]%)
</floater.string>
+ <floater.string name="ErrorFetchingServerReleaseNotesURL">
+ Fehler beim Abrufen der URL für die Server-Versionshinweise.
+ </floater.string>
<tab_container name="about_tab">
<panel label="Info" name="support_panel">
<button label="In Zwischenablage kopieren" name="copy_btn"/>
@@ -64,32 +67,34 @@ Voice-Serverversion: [VOICE_VERSION]
<panel label="Lizenzen" name="licenses_panel">
<text_editor name="credits_editor">
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 sowie 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.
-SDL Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga.
-SSLeay Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com).
-xmlrpc-epi Copyright (C) 2000 Epinions, Inc.
-zlib Copyright (C) 1995-2002 Jean-loup Gailly und Mark Adler.
-google-perftools Copyright (c) 2005, Google Inc.
+ 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 sowie 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.
+ SDL Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga.
+ SSLeay Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com).
+ xmlrpc-epi Copyright (C) 2000 Epinions, Inc.
+ zlib Copyright (C) 1995-2002 Jean-loup Gailly und Mark Adler.
+ google-perftools Copyright (c) 2005, Google Inc.
+
+ Second Life Viewer verwendet Havok (TM) Physics. (c)Copyright 1999-2010 Havok.com Inc. (und Lizenzgeber). Alle Rechte vorbehalten. Details siehe www.havok.com.
-Second Life Viewer verwendet Havok (TM) Physics. (c)Copyright 1999-2010 Havok.com Inc. (und Lizenzgeber). Alle Rechte vorbehalten. Details siehe www.havok.com.
+ Diese Software enthält von der NVIDIA Corporation bereitgestellten Quellcode.
-Alle Rechte vorbehalten. Details siehe licenses.txt.
+ Alle Rechte vorbehalten. Details siehe licenses.txt.
-Audiocodierung für Voice-Chat: Polycom(R) Siren14(TM) (ITU-T Rec. G.722.1 Annex C)
+ Audiocodierung für Voice-Chat: 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/de/floater_about_land.xml b/indra/newview/skins/default/xui/de/floater_about_land.xml
index c65dc5f41d..b893ab79e5 100644
--- a/indra/newview/skins/default/xui/de/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/de/floater_about_land.xml
@@ -130,7 +130,7 @@
Traffic:
</text>
<text name="DwellText">
- 0
+ Laden...
</text>
<button label="Land kaufen" label_selected="Land kaufen..." name="Buy Land..."/>
<button label="Linden-Verkauf" label_selected="Linden-Verkauf..." name="Linden Sale..." tool_tip="Land muss Eigentum und auf Inhalt gesetzt sein und nicht zur Auktion stehen."/>
@@ -214,19 +214,19 @@ werden.
Objektbonusfaktor in Region: [BONUS]
</text>
<text name="Simulator primitive usage:">
- Prim-Verwendung:
+ Regionskapazität:
</text>
<text name="objects_available">
[COUNT] von [MAX] ([AVAILABLE] verfügbar)
</text>
<text name="Primitives parcel supports:">
- Von Parzelle unterstützte Prims:
+ Parzellenlandkapazität:
</text>
<text name="object_contrib_text">
[COUNT]
</text>
<text name="Primitives on parcel:">
- Prims auf Parzelle:
+ Parzellenlandauswirkung:
</text>
<text name="total_objects_text">
[COUNT]
@@ -310,13 +310,15 @@ Nur große Parzellen können in der Suche aufgeführt werden.
Kein Stoßen (regional)
</panel.string>
<panel.string name="see_avs_text">
- Auf dieser Parzelle Einwohner sehen und mit ihnen chatten
+ Avatare auf anderen Parzellen können
</panel.string>
<text name="allow_label">
Anderen Einwohnern gestatten:
</text>
- <check_box label="Terrain bearbeiten" name="edit land check" tool_tip="Falls aktiviert, kann jeder Ihr Land terraformen. Am besten ist es, wenn Sie diese Option deaktiviert lassen. Sie können Ihr eigenes Land jederzeit bearbeiten."/>
- <check_box label="Fliegen" name="check fly" tool_tip="Falls aktiviert, können Einwohner auf Ihrem Land fliegen. Falls nicht aktiviert, können Einwohner lediglich auf Ihr Land fliegen und dort landen (dann jedoch nicht wieder weiterfliegen) oder über Ihr Land hinweg fliegen."/>
+ <text name="allow_label0">
+ Fliegen:
+ </text>
+ <check_box label="Jeder" name="check fly" tool_tip="Falls aktiviert, können Einwohner auf Ihrem Land fliegen. Falls nicht aktiviert, können Einwohner lediglich auf Ihr Land fliegen und dort landen (dann jedoch nicht wieder weiterfliegen) oder über Ihr Land hinweg fliegen."/>
<text name="allow_label2">
Bauen:
</text>
@@ -332,9 +334,6 @@ Nur große Parzellen können in der Suche aufgeführt werden.
</text>
<check_box label="Jeder" name="check other scripts"/>
<check_box label="Gruppe" name="check group scripts"/>
- <text name="land_options_label">
- Landoptionen:
- </text>
<check_box label="Sicher (kein Schaden)" name="check safe" tool_tip="Falls aktiviert, wird Land auf Option „Sicher“ eingestellt, Kampfschäden sind deaktiviert. Ansonsten sind Kampfschäden aktiviert."/>
<check_box label="Kein Stoßen" name="PushRestrictCheck" tool_tip="Verhindert Stoßen durch Skripte. Durch Aktivieren dieser Option verhindern Sie störendes Verhalten auf Ihrem Land."/>
<check_box label="Ort in Suche anzeigen (30 L$/Woche)" name="ShowDirectoryCheck" tool_tip="Diese Parzelle in Suchergebnissen anzeigen."/>
@@ -375,9 +374,9 @@ Nur große Parzellen können in der Suche aufgeführt werden.
</text>
<texture_picker label="" name="snapshot_ctrl" tool_tip="Klicken Sie hier, um ein Bild auszuwählen"/>
<text name="allow_label5">
- Einwohnern auf anderen Parzellen Folgendes gestatten:
+ Avatare auf dieser Parzelle sehen und mit ihnen chatten
</text>
- <check_box label="Avatare sehen" name="SeeAvatarsCheck" tool_tip="Gestattet sowohl Einwohnern auf anderen Parzellen, Einwohner auf dieser Parzelle zu sehen und mit ihnen zu chatten, als auch Ihnen, diese Einwohner auf anderen Parzellen zu sehen und mit ihnen zu chatten."/>
+ <check_box label="Avatare sehen" name="SeeAvatarsCheck" tool_tip="Gestattet sowohl Avataren auf anderen Parzellen, Avatare auf dieser Parzelle zu sehen und mit ihnen zu chatten, als auch Ihnen, diese Avatare auf anderen Parzellen zu sehen und mit ihnen zu chatten."/>
<text name="landing_point">
Landepunkt: [LANDING]
</text>
diff --git a/indra/newview/skins/default/xui/de/floater_avatar.xml b/indra/newview/skins/default/xui/de/floater_avatar.xml
new file mode 100644
index 0000000000..ba0dd54d96
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/floater_avatar.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Avatar" title="AVATAR AUSWÄHLEN"/>
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 38321b7906..65926c088c 100644
--- a/indra/newview/skins/default/xui/de/floater_buy_currency.xml
+++ b/indra/newview/skins/default/xui/de/floater_buy_currency.xml
@@ -46,7 +46,7 @@
[AMT] L$
</text>
<text name="currency_links">
- [http://www.secondlife.com/my/account/payment_method_management.php?lang=de-DE Zahlungsart] | [http://www.secondlife.com/my/account/currency.php?lang=de-DE Währung] | [http://www.secondlife.com/my/account/exchange_rates.php?lang=de-DE Umtauschrate]
+ [http://www.secondlife.com/my/account/payment_method_management.php Zahlungsart] | [http://www.secondlife.com/my/account/currency.php Währung]
</text>
<text name="exchange_rate_note">
Geben Sie den Betrag erneut ein, um die aktuellste Umtauschrate anzuzeigen.
diff --git a/indra/newview/skins/default/xui/de/floater_camera.xml b/indra/newview/skins/default/xui/de/floater_camera.xml
index d49c207f98..163ef87d8c 100644
--- a/indra/newview/skins/default/xui/de/floater_camera.xml
+++ b/indra/newview/skins/default/xui/de/floater_camera.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="camera_floater">
+<floater name="camera_floater" title="KAMERASTEUERUNGEN">
<floater.string name="rotate_tooltip">
Kamera um Fokus drehen
</floater.string>
@@ -9,15 +9,6 @@
<floater.string name="move_tooltip">
Kamera nach oben, unten, links und rechts bewegen
</floater.string>
- <floater.string name="camera_modes_title">
- Kameramodi
- </floater.string>
- <floater.string name="pan_mode_title">
- Kreisen - Zoomen - Schwenken
- </floater.string>
- <floater.string name="presets_mode_title">
- Ansichten
- </floater.string>
<floater.string name="free_mode_title">
Objekt ansehen
</floater.string>
diff --git a/indra/newview/skins/default/xui/de/floater_chat_bar.xml b/indra/newview/skins/default/xui/de/floater_chat_bar.xml
new file mode 100644
index 0000000000..2464a55665
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/floater_chat_bar.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="chat_bar" title="CHAT IN DER NÄHE">
+ <panel name="bottom_panel">
+ <line_editor label="Zum Chatten hier klicken." name="chat_box" tool_tip="Eingabetaste zum Sprechen, Strg+Eingabe zum Rufen"/>
+ <button name="show_nearby_chat" tool_tip="Chatprotokoll in der Nähe ein-/ausblenden"/>
+ </panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_destinations.xml b/indra/newview/skins/default/xui/de/floater_destinations.xml
new file mode 100644
index 0000000000..57881488fd
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/floater_destinations.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Destinations" title="ZIELE"/>
diff --git a/indra/newview/skins/default/xui/de/floater_fast_timers.xml b/indra/newview/skins/default/xui/de/floater_fast_timers.xml
new file mode 100644
index 0000000000..e61e542688
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/floater_fast_timers.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="fast_timers">
+ <string name="pause">
+ Pause
+ </string>
+ <string name="run">
+ Rennen
+ </string>
+ <button label="Pause" name="pause_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_hardware_settings.xml b/indra/newview/skins/default/xui/de/floater_hardware_settings.xml
index 9644bbbaea..ca081aafae 100644
--- a/indra/newview/skins/default/xui/de/floater_hardware_settings.xml
+++ b/indra/newview/skins/default/xui/de/floater_hardware_settings.xml
@@ -4,7 +4,7 @@
Filtern:
</text>
<check_box label="Anisotropische Filterung (langsamer, wenn aktiviert)" name="ani"/>
- <text name="Antialiasing:">
+ <text name="antialiasing label">
Antialiasing:
</text>
<combo_box label="Antialiasing" name="fsaa">
diff --git a/indra/newview/skins/default/xui/de/floater_how_to.xml b/indra/newview/skins/default/xui/de/floater_how_to.xml
new file mode 100644
index 0000000000..caea221f83
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/floater_how_to.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_how_to" title="INFOS"/>
diff --git a/indra/newview/skins/default/xui/de/floater_map.xml b/indra/newview/skins/default/xui/de/floater_map.xml
index f6d9db8d53..c4c42af66d 100644
--- a/indra/newview/skins/default/xui/de/floater_map.xml
+++ b/indra/newview/skins/default/xui/de/floater_map.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Map" title="">
+<floater name="Map" title="MINIKARTE">
<floater.string name="ToolTipMsg">
[REGION](Doppelklicken, um Karte zu öffnen; Umschalt-Taste gedrückt halten und ziehen, um zu schwenken)
</floater.string>
@@ -7,7 +7,7 @@
[REGION](Doppelklicken, um zu teleportieren; Umschalttaste gedrückt halten und ziehen, um zu schwenken)
</floater.string>
<floater.string name="mini_map_caption">
- MINI-KARTE
+ Minikarte
</floater.string>
<text label="N" name="floater_map_north" text="N">
N
diff --git a/indra/newview/skins/default/xui/de/floater_model_preview.xml b/indra/newview/skins/default/xui/de/floater_model_preview.xml
index 330893c326..4af8d67686 100644
--- a/indra/newview/skins/default/xui/de/floater_model_preview.xml
+++ b/indra/newview/skins/default/xui/de/floater_model_preview.xml
@@ -1,10 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Model Preview" title="Modell hochladen">
- <string name="status_idle">
- Inaktiv
- </string>
+<floater name="Model Preview" title="MODELL HOCHLADEN">
+ <string name="status_idle"/>
<string name="status_parse_error">
- DAE-Parsing-Fehler. Details siehe Protokoll.
+ Fehler: Fehler beim DAE-Parsen – Details siehe Protokoll.
+ </string>
+ <string name="status_material_mismatch">
+ Fehler: Das Material des Modells ist keine Teilmenge des Referenzmodells.
</string>
<string name="status_reading_file">
Laden...
@@ -51,6 +52,9 @@
<string name="mesh_status_missing_lod">
Erforderliche Detailstufe fehlt.
</string>
+ <string name="mesh_status_invalid_material_list">
+ Detailstufenmaterial ist keine Teilmenge des Referenzmodells.
+ </string>
<string name="layer_all">
Alle
</string>
@@ -63,188 +67,211 @@
<string name="tbd">
noch nicht festgelegt
</string>
- <text name="name_label">
- Name:
- </text>
- <text name="lod_label">
- Vorschau:
- </text>
- <combo_box name="preview_lod_combo" tool_tip="Detailstufe zur Anzeige in Vorschaudarstellung">
- <combo_item name="high">
- Detailstufe: Hoch
- </combo_item>
- <combo_item name="medium">
- Detailstufe: Mittel
- </combo_item>
- <combo_item name="low">
- Detailstufe: Niedrig
- </combo_item>
- <combo_item name="lowest">
- Detailstufe: Niedrigste
- </combo_item>
- </combo_box>
- <text name="warning_title">
- ACHTUNG:
- </text>
- <text name="warning_message">
- Sie können dieses Modell nicht auf die Second Life-Server hochladen. [[VURL] Weitere Infos], wie Sie das Hochladen von Netzmodellen freischalten können.
- </text>
- <text name="weights_text">
- Herunterladen:
-Physik:
-Server:
-
-Prim-Äquivalenz:
- </text>
- <text name="weights">
- [ST]
-[PH]
-[SIM]
-
-[EQ]
- </text>
- <tab_container name="import_tab">
- <panel label="Detailstufe" name="lod_panel">
- <text name="lod_table_header">
- Detailstufe auswählen
- </text>
- <text name="high_label" value="Hoch"/>
- <text name="high_triangles" value="0"/>
- <text name="high_vertices" value="0"/>
- <text name="medium_label" value="Mittel"/>
- <text name="medium_triangles" value="0"/>
- <text name="medium_vertices" value="0"/>
- <text name="low_label" value="Niedrig"/>
- <text name="low_triangles" value="0"/>
- <text name="low_vertices" value="0"/>
- <text name="lowest_label" value="Niedrigste"/>
- <text name="lowest_triangles" value="0"/>
- <text name="lowest_vertices" value="0"/>
- <text name="lod_table_footer">
- Detailstufe: [DETAIL]
- </text>
- <radio_group name="lod_file_or_limit" value="lod_from_file">
- <radio_item label="Aus Datei laden" name="lod_from_file"/>
- <radio_item label="Automatisch generieren" name="lod_auto_generate"/>
- <radio_item label="Keine" name="lod_none"/>
- </radio_group>
- <button label="Durchsuchen..." name="lod_browse"/>
- <combo_box name="lod_mode">
- <combo_item name="triangle_limit">
- Dreiecklimit
- </combo_item>
- <combo_item name="error_threshold">
- Fehlerschwelle
- </combo_item>
- </combo_box>
- <text name="build_operator_text">
- Konstruktionsoperator:
- </text>
- <text name="queue_mode_text">
- Warteschlangenmodus:
- </text>
- <combo_box name="build_operator">
- <combo_item name="edge_collapse">
- Kantenkollaps
- </combo_item>
- <combo_item name="half_edge_collapse">
- Halbkantenkollaps
- </combo_item>
- </combo_box>
- <combo_box name="queue_mode">
- <combo_item name="greedy">
- Strikt
- </combo_item>
- <combo_item name="lazy">
- Locker
- </combo_item>
- <combo_item name="independent">
- Unabhängig
- </combo_item>
- </combo_box>
- <text name="border_mode_text">
- Grenzenmodus:
+ <panel name="left_panel">
+ <panel name="model_name_representation_panel">
+ <text name="name_label">
+ Modellname:
</text>
- <text name="share_tolderance_text">
- Sharetoleranz:
+ <text name="model_category_label">
+ Dieses Modell repräsentiert...
</text>
- <combo_box name="border_mode">
- <combo_item name="border_unlock">
- Freigeben
- </combo_item>
- <combo_item name="border_lock">
- Sperren
- </combo_item>
+ <combo_box name="model_category_combo">
+ <combo_item label="Eine auswählen..." name="Choose one"/>
+ <combo_item label="Avatarform" name="Avatar shape"/>
+ <combo_item label="Avatar-Anhang" name="Avatar attachment"/>
+ <combo_item label="Mobile Objekte (Fahrzeug, Tier)" name="Moving object (vehicle, animal)"/>
+ <combo_item label="Baukomponenten" name="Building Component"/>
+ <combo_item label="Groß, unbeweglich usw." name="Large, non moving etc"/>
+ <combo_item label="Kleiner, unbeweglich usw." name="Smaller, non-moving etc"/>
+ <combo_item label="Keine der oben genannten" name="Not really any of these"/>
</combo_box>
- <text name="crease_label">
- Knitterwinkel:
- </text>
- <spinner name="crease_angle" value="75"/>
</panel>
- <panel label="Physik" name="physics_panel">
- <panel name="physics geometry">
- <radio_group name="physics_load_radio" value="physics_load_from_file">
- <radio_item label="Datei:" name="physics_load_from_file"/>
- <radio_item label="Detailstufe verwenden:" name="physics_use_lod"/>
- </radio_group>
- <combo_box name="physics_lod_combo" tool_tip="Detailstufe für physische Form">
- <combo_item name="physics_lowest">
- Niedrigste
- </combo_item>
- <combo_item name="physics_low">
- Niedrig
- </combo_item>
- <combo_item name="physics_medium">
- Mittel
- </combo_item>
- <combo_item name="physics_high">
- Hoch
- </combo_item>
- </combo_box>
- <button label="Durchsuchen..." name="physics_browse"/>
- </panel>
- <panel name="physics analysis">
- <slider label="Glätten:" name="Smooth"/>
- <check_box label="Löcher schließen (langsam)" name="Close Holes (Slow)"/>
- <button label="Analysieren" name="Decompose"/>
- <button label="Abbrechen" name="decompose_cancel"/>
+ <tab_container name="import_tab">
+ <panel label="Detailstufe" name="lod_panel" title="Detailstufe">
+ <text initial_value="Quelle" name="source" value="Quelle"/>
+ <text initial_value="Dreiecke" name="triangles" value="Dreiecke"/>
+ <text initial_value="Scheitelpunkte" name="vertices" value="Scheitelpunkte"/>
+ <text initial_value="Hoch" name="high_label" value="Hoch"/>
+ <button label="Durchsuchen..." name="lod_browse_high"/>
+ <text initial_value="0" name="high_triangles" value="0"/>
+ <text initial_value="0" name="high_vertices" value="0"/>
+ <text initial_value="Mittel" name="medium_label" value="Mittel"/>
+ <button label="Durchsuchen..." name="lod_browse_medium"/>
+ <text initial_value="0" name="medium_triangles" value="0"/>
+ <text initial_value="0" name="medium_vertices" value="0"/>
+ <text initial_value="Niedrig" name="low_label" value="Niedrig"/>
+ <button label="Durchsuchen..." name="lod_browse_low"/>
+ <text initial_value="0" name="low_triangles" value="0"/>
+ <text initial_value="0" name="low_vertices" value="0"/>
+ <text initial_value="Niedrigste" name="lowest_label" value="Niedrigste"/>
+ <button label="Durchsuchen..." name="lod_browse_lowest"/>
+ <text initial_value="0" name="lowest_triangles" value="0"/>
+ <text initial_value="0" name="lowest_vertices" value="0"/>
+ <check_box label="Normalen generieren" name="gen_normals"/>
+ <text initial_value="Knitterwinkel:" name="crease_label" value="Knitterwinkel:"/>
+ <spinner name="crease_angle" value="75"/>
</panel>
- <panel name="physics simplification">
- <slider label="Durchläufe:" name="Combine Quality"/>
- <slider label="Detailskala:" name="Detail Scale"/>
- <slider label="Beibehalten:" name="Retain%"/>
- <button label="Vereinfachen" name="Simplify"/>
- <button label="Abbrechen" name="simplify_cancel"/>
+ <panel label="Physik" name="physics_panel">
+ <panel name="physics geometry">
+ <text name="first_step_name">
+ Schritt 1: Detailstufe
+ </text>
+ <combo_box name="physics_lod_combo" tool_tip="Detailstufe für Physikform">
+ <combo_item name="choose_one">
+ Eine auswählen...
+ </combo_item>
+ <combo_item name="physics_high">
+ Hoch
+ </combo_item>
+ <combo_item name="physics_medium">
+ Mittel
+ </combo_item>
+ <combo_item name="physics_low">
+ Niedrig
+ </combo_item>
+ <combo_item name="physics_lowest">
+ Niedrigste
+ </combo_item>
+ <combo_item name="load_from_file">
+ Aus Datei
+ </combo_item>
+ </combo_box>
+ <button label="Durchsuchen..." name="physics_browse"/>
+ </panel>
+ <panel name="physics analysis">
+ <text name="method_label">
+ Schritt 2: Analysieren
+ </text>
+ <text name="analysis_method_label">
+ Methode:
+ </text>
+ <text name="quality_label">
+ Qualität:
+ </text>
+ <text name="smooth_method_label">
+ Glätten:
+ </text>
+ <check_box label="Löcher schließen" name="Close Holes (Slow)"/>
+ <button label="Analysieren" name="Decompose"/>
+ <button label="Abbrechen" name="decompose_cancel"/>
+ </panel>
+ <panel name="physics simplification">
+ <text name="second_step_label">
+ Schritt 3: Vereinfachen
+ </text>
+ <text name="simp_method_header">
+ Methode:
+ </text>
+ <text name="pass_method_header">
+ Durchläufe:
+ </text>
+ <text name="Detail Scale label">
+ Detailskalierung:
+ </text>
+ <text name="Retain%_label">
+ Beibehalten:
+ </text>
+ <combo_box name="Combine Quality" value="1"/>
+ <button label="Vereinfachen" name="Simplify"/>
+ <button label="Abbrechen" name="simplify_cancel"/>
+ </panel>
+ <panel name="physics info">
+ <text name="results_text">
+ Ergebnisse:
+ </text>
+ <text name="physics_triangles">
+ Dreiecke: [TRIANGLES],
+ </text>
+ <text name="physics_points">
+ Scheitelpunkte: [POINTS],
+ </text>
+ <text name="physics_hulls">
+ Hüllen: [HULLS]
+ </text>
+ </panel>
</panel>
- <panel name="physics info">
- <slider label="Vorschaudehnung:" name="physics_explode"/>
- <text name="physics_triangles">
- Dreiecke: [TRIANGLES]
+ <panel label="Hochladeoptionen" name="modifiers_panel">
+ <text name="scale_label">
+ Skalierung (1=keine Skalierung):
</text>
- <text name="physics_points">
- Vertices: [POINTS]
+ <spinner name="import_scale" value="1.0"/>
+ <text name="dimensions_label">
+ Dimensionen:
</text>
- <text name="physics_hulls">
- Hüllen: [HULLS]
+ <text name="import_dimensions">
+ [X] X [Y] X [Z]
</text>
+ <check_box label="Texturen einschließen" name="upload_textures"/>
+ <text name="include_label">
+ Nur für Avatarmodelle:
+ </text>
+ <check_box label="Skingewicht einschließen" name="upload_skin"/>
+ <check_box label="Gelenkpositionen einschließen" name="upload_joints"/>
+ <text name="pelvis_offset_label">
+ Z-Offset (Avatar anheben oder senken):
+ </text>
+ <spinner name="pelvis_offset" value="0.0"/>
</panel>
- </panel>
- <panel label="Modifizierer" name="modifiers_panel">
- <spinner name="import_scale" value="1,0"/>
- <text name="import_dimensions">
- [X] x [Y] x [Z] m
+ </tab_container>
+ <panel name="weights_and_warning_panel">
+ <button label="Gewichte und Gebühr berechnen" name="calculate_btn" tool_tip="Gewichte und Gebühr berechnen"/>
+ <button label="Abbrechen" name="cancel_btn"/>
+ <button label="Hochladen" name="ok_btn" tool_tip="Auf Simulator hochladen"/>
+ <button label="Einstellungen löschen und Formular zurücksetzen" name="reset_btn"/>
+ <text name="upload_fee">
+ Gebühr für Hochladen: [FEE] L$
+ </text>
+ <text name="prim_weight">
+ Auswirkung auf Land: [EQ]
+ </text>
+ <text name="download_weight">
+ Herunterladen: [ST]
+ </text>
+ <text name="physics_weight">
+ Physik: [PH]
+ </text>
+ <text name="server_weight">
+ Server: [SIM]
+ </text>
+ <text name="warning_title">
+ HINWEIS:
+ </text>
+ <text name="warning_message">
+ Sie haben keine Berechtigung zum Hochladen von Netzmodellen. [[VURL] Weitere Infos], wie Sie sich zertifizieren lassen können.
+ </text>
+ <text name="status">
+ [STATUS]
</text>
- <check_box label="Texturen" name="upload_textures"/>
- <check_box label="Skingewicht" name="upload_skin"/>
- <check_box label="Gelenkpositionen" name="upload_joints"/>
- <spinner name="pelvis_offset" value="0,0"/>
</panel>
- </tab_container>
- <text name="upload_fee">
- Gebühr für Hochladen: [FEE] L$
+ </panel>
+ <text name="lod_label">
+ Vorschau:
</text>
- <button label="Auf Standardwerte setzen" name="reset_btn" tool_tip="Auf Standardwerte setzen"/>
- <button label="Gewichte und Gebühr berechnen" name="calculate_btn" tool_tip="Gewichte und Gebühr berechnen"/>
- <button label="Hochladen" name="ok_btn" tool_tip="An Simulator hochladen"/>
- <button label="Abbrechen" name="cancel_btn"/>
+ <panel name="right_panel">
+ <combo_box name="preview_lod_combo" tool_tip="Detailstufe zur Anzeige in Vorschaudarstellung">
+ <combo_item name="high">
+ Hoch
+ </combo_item>
+ <combo_item name="medium">
+ Mittel
+ </combo_item>
+ <combo_item name="low">
+ Niedrig
+ </combo_item>
+ <combo_item name="lowest">
+ Niedrigste
+ </combo_item>
+ </combo_box>
+ <text name="label_display">
+ Anzeige...
+ </text>
+ <check_box label="Kanten" name="show_edges"/>
+ <check_box label="Physik" name="show_physics"/>
+ <check_box label="Texturen" name="show_textures"/>
+ <check_box label="Skingewichte" name="show_skin_weight"/>
+ <check_box label="Gelenke" name="show_joint_positions"/>
+ <text name="physics_explode_label">
+ Vorschaudehnung:
+ </text>
+ </panel>
</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_model_wizard.xml b/indra/newview/skins/default/xui/de/floater_model_wizard.xml
index 7103757b40..a90f36f202 100644
--- a/indra/newview/skins/default/xui/de/floater_model_wizard.xml
+++ b/indra/newview/skins/default/xui/de/floater_model_wizard.xml
@@ -6,26 +6,23 @@
<button label="2. Optimieren" name="optimize_btn"/>
<button label="1. Datei auswählen" name="choose_file_btn"/>
<panel name="choose_file_panel">
- <panel name="choose_file_header_panel">
- <text name="choose_file_header_text">
+ <panel name="header_panel">
+ <text name="header_text">
Modelldatei auswählen
</text>
</panel>
- <panel name="choose_file_content_panel">
+ <panel name="content">
<text name="advanced_users_text">
Fortgeschrittene Benutzer: Wenn Sie bereits mit Tools zur Erstellung von 3D-Inhalten vertraut sind, können Sie den erweiterten Uploader verwenden.
</text>
<button label="Auf Erweitert wechseln" name="switch_to_advanced"/>
- <text name="choose_model_file_label">
+ <text name="Cache location">
Hochzuladende Modelldatei auswählen
</text>
<button label="Durchsuchen..." label_selected="Durchsuchen..." name="browse"/>
- <text name="support_collada_text">
+ <text name="Model types">
Second Life unterstützt COLLADA-Dateien (.dae).
</text>
- <text name="dimensions_label">
- Abmessungen (m):
- </text>
<text name="dimensions">
X Y Z
</text>
@@ -38,18 +35,15 @@
</panel>
</panel>
<panel name="optimize_panel">
- <panel name="optimize_header_panel">
- <text name="optimize_header_text">
+ <panel name="header_panel">
+ <text name="header_text">
Modell optimieren
</text>
</panel>
- <text name="optimize_hint">
+ <text name="description">
Wir haben das Modell auf Leistung optimiert. Sie können es bei Bedarf weiter anpassen.
</text>
- <panel name="optimize_content_panel">
- <text name="generating_lod_label">
- Detailstufe generieren
- </text>
+ <panel name="content">
<text name="high_detail_text">
Detailstufe generieren: Hoch
</text>
@@ -64,123 +58,64 @@
</text>
</panel>
<panel name="content2">
- <text name="optimize_performance_text">
- Leistung
- </text>
- <text name="optimize_faster_rendering_text">
- Schnellere Darstellung
-Weniger Details
-Niedrigeres Prim-Gewicht
- </text>
- <text name="optimize_accuracy_text">
- Genauigkeit
- </text>
- <text name="optimize_slower_rendering_text">
- Langsamere Darstellung
-Mehr Details
-Höheres Prim-Gewicht
- </text>
- <text name="accuracy_slider_mark1">
- &apos;
- </text>
- <text name="accuracy_slider_mark2">
- &apos;
- </text>
- <text name="accuracy_slider_mark3">
- &apos;
- </text>
<button label="Geometrie neu berechnen" name="recalculate_geometry_btn"/>
- <text name="geometry_preview_label">
+ <text name="lod_label">
Geometrievorschau
</text>
<combo_box name="preview_lod_combo" tool_tip="Detailstufe zur Anzeige in Vorschaudarstellung">
- <combo_item name="preview_lod_high">
+ <combo_item name="high">
Viel Details
</combo_item>
- <combo_item name="preview_lod_medium">
+ <combo_item name="medium">
Mittlere Details
</combo_item>
- <combo_item name="preview_lod_low">
+ <combo_item name="low">
Wenig Details
</combo_item>
- <combo_item name="preview_lod_lowest">
+ <combo_item name="lowest">
Wenigste Details
</combo_item>
</combo_box>
</panel>
</panel>
<panel name="physics_panel">
- <panel name="physics_header_panel">
- <text name="physics_header_text">
+ <panel name="header_panel">
+ <text name="header_text">
Physik anpassen
</text>
</panel>
- <text name="physics_hint">
+ <text name="description">
Wir erstellen eine Form für die Außenhülle des Modells. Passen Sie die Detailstufe der Form wie für den beabsichtigten Zweck erforderlich an.
</text>
- <panel name="physics_content_panel">
- <text name="physics_performance_text">
- Leistung
- </text>
- <text name="physics_faster_rendering_text">
- Schnellere Darstellung
-Weniger Details
-Niedrigeres Prim-Gewicht
- </text>
- <text name="physics_accuracy_text">
- Genauigkeit
- </text>
- <text name="physics_slower_dendering_text">
- Langsamere Darstellung
-Mehr Details
-Höheres Prim-Gewicht
- </text>
- <text name="physics_example_1">
- Beispiele:
-Mobile Objekte
-Fliegende Objekte
-Fahrzeuge
- </text>
- <text name="physics_example_2">
- Beispiele:
-Kleine statische Objekte
-Objekte mit weniger Details
-Einfache Möbel
- </text>
- <text name="physics_example_3">
- Beispiele:
-Statische Objekte
-Objekte mit viel Details
-Gebäude
- </text>
+ <panel name="content">
<button label="Physik neu berechnen" name="recalculate_physics_btn"/>
<button label="Neu berechnen..." name="recalculating_physics_btn"/>
- <text name="physics_preview_label">
+ <text name="lod_label">
Physikvorschau
</text>
<combo_box name="preview_lod_combo2" tool_tip="Detailstufe zur Anzeige in Vorschaudarstellung">
- <combo_item name="preview_lod2_high">
+ <combo_item name="high">
Viel Details
</combo_item>
- <combo_item name="preview_lod2_medium">
+ <combo_item name="medium">
Mittlere Details
</combo_item>
- <combo_item name="preview_lod2_low">
+ <combo_item name="low">
Wenig Details
</combo_item>
- <combo_item name="preview_lod2_lowest">
+ <combo_item name="lowest">
Wenigste Details
</combo_item>
</combo_box>
</panel>
</panel>
<panel name="review_panel">
- <panel name="review_header_panel">
- <text name="review_header_text">
+ <panel name="header_panel">
+ <text name="header_text">
Überprüfen
</text>
</panel>
- <panel name="review_content_panel">
+ <panel name="content">
<text name="review_prim_equiv">
Auswirkung auf Parzelle/Region: Prim-Äquivalenzwert [EQUIV]
</text>
@@ -193,8 +128,8 @@ Gebäude
</panel>
</panel>
<panel name="upload_panel">
- <panel name="upload_header_panel">
- <text name="upload_header_text">
+ <panel name="header_panel">
+ <text name="header_text">
Upload abgeschlossen
</text>
</panel>
diff --git a/indra/newview/skins/default/xui/de/floater_moveview.xml b/indra/newview/skins/default/xui/de/floater_moveview.xml
index 4333392582..c1c8271310 100644
--- a/indra/newview/skins/default/xui/de/floater_moveview.xml
+++ b/indra/newview/skins/default/xui/de/floater_moveview.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="move_floater">
+<floater name="move_floater" title="GEHEN / RENNEN / FLIEGEN">
<string name="walk_forward_tooltip">
Vorwärts gehen (Nach-oben-Pfeil oder W drücken)
</string>
@@ -58,14 +58,14 @@
Fliegen
</string>
<panel name="panel_actions">
- <button label="" label_selected="" name="move up btn" tool_tip="Nach oben fliegen, „E&quot; drücken"/>
<button label="" label_selected="" name="turn left btn" tool_tip="Nach links (Links-Pfeil oder A drücken)"/>
<joystick_slide name="move left btn" tool_tip="Nach links gehen (Umschalt + Links-Pfeil oder A drücken)"/>
- <button label="" label_selected="" name="move down btn" tool_tip="Nach unten fliegen, „C&quot; drücken"/>
<button label="" label_selected="" name="turn right btn" tool_tip="Nach rechts (Rechts-Pfeil oder D drücken)"/>
<joystick_slide name="move right btn" tool_tip="Nach rechts fliegen (Umschalt + Rechts-Pfeil oder D drücken)"/>
<joystick_turn name="forward btn" tool_tip="Vorwärts gehen (Nach-oben-Pfeil oder W drücken)"/>
<joystick_turn name="backward btn" tool_tip="Rückwärts gehen (Nach-Unten-Pfeil oder S drücken)"/>
+ <button label="" label_selected="" name="move up btn" tool_tip="Nach oben fliegen, „E&quot; drücken"/>
+ <button label="" label_selected="" name="move down btn" tool_tip="Nach unten fliegen, „C&quot; drücken"/>
</panel>
<panel name="panel_modes">
<button label="" name="mode_walk_btn" tool_tip="Gehen"/>
diff --git a/indra/newview/skins/default/xui/de/floater_my_appearance.xml b/indra/newview/skins/default/xui/de/floater_my_appearance.xml
new file mode 100644
index 0000000000..e26b2434cc
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/floater_my_appearance.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_my_appearance" title="AUSSEHEN">
+ <panel label="Aussehen bearbeiten" name="main_panel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_my_inventory.xml b/indra/newview/skins/default/xui/de/floater_my_inventory.xml
new file mode 100644
index 0000000000..0cfa17562e
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/floater_my_inventory.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_my_inventory" title="INVENTAR"/>
diff --git a/indra/newview/skins/default/xui/de/floater_nearby_chat.xml b/indra/newview/skins/default/xui/de/floater_nearby_chat.xml
index bbb4114200..2aabbb18f2 100644
--- a/indra/newview/skins/default/xui/de/floater_nearby_chat.xml
+++ b/indra/newview/skins/default/xui/de/floater_nearby_chat.xml
@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="nearby_chat" title="CHAT IN DER NÄHE">
- <check_box label="Chat übersetzen (Service von Google)" name="translate_chat_checkbox"/>
+ <check_box label="Chat übersetzen" name="translate_chat_checkbox"/>
</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_object_weights.xml b/indra/newview/skins/default/xui/de/floater_object_weights.xml
new file mode 100644
index 0000000000..e6641d3d18
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/floater_object_weights.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="object_weights" title="ERWEITERT">
+ <floater.string name="nothing_selected" value="--"/>
+ <text name="selected_text" value="AUSGEWÄHLT"/>
+ <text name="objects" value="--"/>
+ <text name="objects_label" value="Objekte"/>
+ <text name="prims" value="--"/>
+ <text name="prims_label" value="Primitive"/>
+ <text name="weights_of_selected_text" value="GEWICHT DER AUSGEWÄHLTEN"/>
+ <text name="download" value="--"/>
+ <text name="download_label" value="Herunterladen"/>
+ <text name="physics" value="--"/>
+ <text name="physics_label" value="Physik"/>
+ <text name="server" value="--"/>
+ <text name="server_label" value="Server"/>
+ <text name="display" value="--"/>
+ <text name="display_label" value="Anzeige"/>
+ <text name="land_impacts_text" value="AUSWIRKUNGEN AUF LAND"/>
+ <text name="selected" value="--"/>
+ <text name="selected_label" value="Ausgewählt"/>
+ <text name="rezzed_on_land" value="--"/>
+ <text name="rezzed_on_land_label" value="Auf Land gerezzt"/>
+ <text name="remaining_capacity" value="--"/>
+ <text name="remaining_capacity_label" value="Verbleibende Kapazität"/>
+ <text name="total_capacity" value="--"/>
+ <text name="total_capacity_label" value="Gesamtkapazität"/>
+ <text name="help_SLURL" value="[secondlife:///app/help/object_weights Was ist das?...]"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_outfit_save_as.xml b/indra/newview/skins/default/xui/de/floater_outfit_save_as.xml
index 8c110e5516..7481e6d4b7 100644
--- a/indra/newview/skins/default/xui/de/floater_outfit_save_as.xml
+++ b/indra/newview/skins/default/xui/de/floater_outfit_save_as.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="modal container" title="Outfit speichern">
+<floater name="modal container" title="OUTFIT SPEICHERN">
<button label="Speichern" label_selected="Speichern" name="Save"/>
<button label="Abbrechen" label_selected="Abbrechen" name="Cancel"/>
<text name="Save item as:">
diff --git a/indra/newview/skins/default/xui/de/floater_people.xml b/indra/newview/skins/default/xui/de/floater_people.xml
new file mode 100644
index 0000000000..fd1db148ac
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/floater_people.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_people" title="LEUTE">
+ <panel_container name="main_panel">
+ <panel label="Gruppenprofil" name="panel_group_info_sidetray"/>
+ <panel label="Blockierte Einwohner und Objekte" name="panel_block_list_sidetray"/>
+ </panel_container>
+</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_picks.xml b/indra/newview/skins/default/xui/de/floater_picks.xml
new file mode 100644
index 0000000000..2521920e83
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/floater_picks.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_picks" title="Auswahlen"/>
diff --git a/indra/newview/skins/default/xui/de/floater_places.xml b/indra/newview/skins/default/xui/de/floater_places.xml
new file mode 100644
index 0000000000..80a1490afd
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/floater_places.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_places" title="ORTE">
+ <panel label="Orte" name="main_panel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_snapshot.xml b/indra/newview/skins/default/xui/de/floater_snapshot.xml
index ae68c71a80..798461c007 100644
--- a/indra/newview/skins/default/xui/de/floater_snapshot.xml
+++ b/indra/newview/skins/default/xui/de/floater_snapshot.xml
@@ -3,73 +3,63 @@
<floater.string name="unknown">
unbekannt
</floater.string>
- <radio_group label="Fototyp" name="snapshot_type_radio">
- <radio_item label="E-Mail" name="postcard"/>
- <radio_item label="Mein Inventar ([AMOUNT] L$)" name="texture"/>
- <radio_item label="Auf meinem Computer speichern" name="local"/>
- </radio_group>
+ <string name="postcard_progress_str">
+ E-Mail senden
+ </string>
+ <string name="profile_progress_str">
+ Posten
+ </string>
+ <string name="inventory_progress_str">
+ Speichern im Inventar
+ </string>
+ <string name="local_progress_str">
+ Speichern auf Computer
+ </string>
+ <string name="profile_succeeded_str">
+ Bild hochgeladen
+ </string>
+ <string name="postcard_succeeded_str">
+ E-Mail gesendet!
+ </string>
+ <string name="inventory_succeeded_str">
+ Im Inventar gespeichert!
+ </string>
+ <string name="local_succeeded_str">
+ Auf Computer gespeichert!
+ </string>
+ <string name="profile_failed_str">
+ Fehler beim Hochladen des Bilds in Ihr Profil.
+ </string>
+ <string name="postcard_failed_str">
+ Fehler beim Senden der E-Mail.
+ </string>
+ <string name="inventory_failed_str">
+ Fehler beim Speichern im Inventar.
+ </string>
+ <string name="local_failed_str">
+ Fehler beim Speichern auf dem Computer.
+ </string>
+ <button name="advanced_options_btn" tool_tip="Erweiterte Optionen"/>
+ <text name="image_res_text">
+ [WIDTH] x [HEIGHT] px
+ </text>
<text name="file_size_label">
[SIZE] KB
</text>
- <button label="Foto aktualisieren" name="new_snapshot_btn"/>
- <button label="Senden" name="send_btn"/>
- <button label="Speichern ([AMOUNT] L$)" name="upload_btn"/>
- <flyout_button label="Speichern" name="save_btn" tool_tip="Bild als Datei speichern">
- <flyout_button.item label="Speichern" name="save_item"/>
- <flyout_button.item label="Speichern unter..." name="saveas_item"/>
- </flyout_button>
- <button label="Mehr" name="more_btn" tool_tip="Erweiterte Optionen"/>
- <button label="Weniger" name="less_btn" tool_tip="Erweiterte Optionen"/>
- <button label="Abbrechen" name="discard_btn"/>
- <text name="type_label2">
- Größe
- </text>
- <text name="format_label">
- Format
- </text>
- <combo_box label="Auflösung" name="postcard_size_combo">
- <combo_box.item label="Aktuelles Fenster" 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="Benutzerdefiniert" name="Custom"/>
- </combo_box>
- <combo_box label="Auflösung" name="texture_size_combo">
- <combo_box.item label="Aktuelles Fenster" name="CurrentWindow"/>
- <combo_box.item label="Klein (128x128)" name="Small(128x128)"/>
- <combo_box.item label="Mittel (256x256)" name="Medium(256x256)"/>
- <combo_box.item label="Groß (512x512)" name="Large(512x512)"/>
- <combo_box.item label="Benutzerdefiniert" name="Custom"/>
- </combo_box>
- <combo_box label="Auflösung" name="local_size_combo">
- <combo_box.item label="Aktuelles Fenster" name="CurrentWindow"/>
- <combo_box.item label="320x240" name="320x240"/>
- <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="1280x1024" name="1280x1024"/>
- <combo_box.item label="1600x1200" name="1600x1200"/>
- <combo_box.item label="Benutzerdefiniert" name="Custom"/>
- </combo_box>
- <combo_box label="Format" name="local_format_combo">
- <combo_box.item label="PNG" name="PNG"/>
- <combo_box.item label="JPEG" name="JPEG"/>
- <combo_box.item label="BMP" name="BMP"/>
- </combo_box>
- <spinner label="Breite" name="snapshot_width"/>
- <spinner label="Größe" 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">
- Aufnehmen:
- </text>
- <combo_box label="Bildlayer" name="layer_types">
- <combo_box.item label="Farben" name="Colors"/>
- <combo_box.item label="Tiefe" name="Depth"/>
- </combo_box>
- <check_box label="Schnittstelle" name="ui_check"/>
- <check_box label="HUDs" name="hud_check"/>
- <check_box label="Nach dem Speichern offen lassen" name="keep_open_check"/>
- <check_box label="Frame einfrieren (Vollbild)" name="freeze_frame_check"/>
- <check_box label="Automatisch aktualisieren" name="auto_snapshot_check"/>
+ <panel name="advanced_options_panel">
+ <text name="advanced_options_label">
+ ERWEITERTE OPTIONEN
+ </text>
+ <text name="layer_type_label">
+ Aufnahme:
+ </text>
+ <combo_box label="Bildebenen" name="layer_types">
+ <combo_box.item label="Farben" name="Colors"/>
+ <combo_box.item label="Tiefe" name="Depth"/>
+ </combo_box>
+ <check_box label="Schnittstelle" name="ui_check"/>
+ <check_box label="HUDs" name="hud_check"/>
+ <check_box label="Standbild (Vollbild)" name="freeze_frame_check"/>
+ <check_box label="Automatisch aktualisieren" name="auto_snapshot_check"/>
+ </panel>
</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_sound_devices.xml b/indra/newview/skins/default/xui/de/floater_sound_devices.xml
index 7575ad9e2a..22ccb2c1a2 100644
--- a/indra/newview/skins/default/xui/de/floater_sound_devices.xml
+++ b/indra/newview/skins/default/xui/de/floater_sound_devices.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_sound_devices" title="Audiogeräte">
+<floater name="floater_sound_devices" title="SOUNDGERÄTE">
<text name="voice_label">
Voice-Chat
</text>
diff --git a/indra/newview/skins/default/xui/de/floater_stats.xml b/indra/newview/skins/default/xui/de/floater_stats.xml
index 1eb2dd4288..f6dc9fe15d 100644
--- a/indra/newview/skins/default/xui/de/floater_stats.xml
+++ b/indra/newview/skins/default/xui/de/floater_stats.xml
@@ -10,8 +10,8 @@
</stat_view>
<stat_view label="Erweitert" name="advanced">
<stat_view label="Darstellung" name="render">
- <stat_bar label="Gezeichnete KTris" name="ktrisframe"/>
- <stat_bar label="Gezeichnete KTris" name="ktrissec"/>
+ <stat_bar label="Pro Frame gezeichnete KTris" name="ktrisframe"/>
+ <stat_bar label="Pro Sek. gezeichnete KTris" name="ktrissec"/>
<stat_bar label="Objektanzahl" name="objs"/>
<stat_bar label="Neue Objekte" name="newobjs"/>
</stat_view>
@@ -32,7 +32,7 @@
<stat_bar label="Ebenen" name="layerskbitstat"/>
<stat_bar label="Tatsächlicher Eingang" name="actualinkbitstat"/>
<stat_bar label="Tatsächlicher Ausgang" name="actualoutkbitstat"/>
- <stat_bar label="VFS Ausstehende Ops" name="vfspendingoperations"/>
+ <stat_bar label="Ausstehende Vorgänge im VFS" name="vfspendingoperations"/>
</stat_view>
</stat_view>
<stat_view label="Simulator" name="sim">
@@ -64,6 +64,14 @@
<stat_bar label="Agent-Zeit" name="simagentmsec"/>
<stat_bar label="Bilder-Zeit" name="simimagesmsec"/>
<stat_bar label="Skript-Zeit" name="simscriptmsec"/>
+ <stat_bar label="Verbleib. Zeit" name="simsparemsec"/>
+ <stat_view label="Zeitdetails (ms)" name="timedetails">
+ <stat_bar label="Physik-Schritt" name="simsimphysicsstepmsec"/>
+ <stat_bar label="Phys. Formen aktualisieren" name="simsimphysicsshapeupdatemsec"/>
+ <stat_bar label="Physik – andere" name="simsimphysicsothermsec"/>
+ <stat_bar label="Schlafzeit" name="simsleepmsec"/>
+ <stat_bar label="Pump IO" name="simpumpiomsec"/>
+ </stat_view>
</stat_view>
</stat_view>
</container_view>
diff --git a/indra/newview/skins/default/xui/de/floater_tools.xml b/indra/newview/skins/default/xui/de/floater_tools.xml
index 49b133e10f..cf1d03f32d 100644
--- a/indra/newview/skins/default/xui/de/floater_tools.xml
+++ b/indra/newview/skins/default/xui/de/floater_tools.xml
@@ -25,10 +25,10 @@
Klicken und ziehen, um Land auszuwählen
</floater.string>
<floater.string name="status_selectcount">
- [OBJ_COUNT] Objekte ([PRIM_COUNT] Prims [PE_STRING]) ausgewählt
+ [OBJ_COUNT] Objekte ausgewählt, Auswirkung auf Land [LAND_IMPACT]
</floater.string>
- <floater.string name="status_selectprimequiv">
- , Prim-Äquivalenz [SEL_WEIGHT]
+ <floater.string name="status_remaining_capacity">
+ Verbleibende Kapazität [LAND_CAPACITY].
</floater.string>
<button label="" label_selected="" name="button focus" tool_tip="Fokus"/>
<button label="" label_selected="" name="button move" tool_tip="Verschieben"/>
@@ -105,8 +105,8 @@
<text name="selection_empty">
Nichts ausgewählt.
</text>
- <text name="selection_weight">
- Physikgewicht [PHYS_WEIGHT], Darstellungskosten [DISP_WEIGHT].
+ <text name="remaining_capacity">
+ [CAPACITY_STRING] [secondlife:///app/openfloater/object_weights Weitere Infos]
</text>
<tab_container name="Object Info Tabs">
<panel label="Allgemein" name="General">
@@ -322,7 +322,6 @@
Naht
</text>
<combo_box name="sculpt type control">
- <combo_box.item label="(keiner)" name="None"/>
<combo_box.item label="Kugel" name="Sphere"/>
<combo_box.item label="Torus" name="Torus"/>
<combo_box.item label="Fläche" name="Plane"/>
diff --git a/indra/newview/skins/default/xui/de/floater_toybox.xml b/indra/newview/skins/default/xui/de/floater_toybox.xml
new file mode 100644
index 0000000000..90e50804d6
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/floater_toybox.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Toybox" title="SYMBOLLEISTENSCHALTFLÄCHEN">
+ <text name="toybox label 1">
+ Sie können Schaltflächen durch Ziehen zu Symbolleisten hinzufügen oder daraus entfernen.
+ </text>
+ <text name="toybox label 2">
+ Je nach Einstellung erscheinen Schaltflächen wie dargestellt oder nur als Symbol.
+ </text>
+ <button label="Alle Symbolleisten leeren" label_selected="Alle Symbolleisten leeren" name="btn_clear_all"/>
+ <button label="Standards wiederherstellen" label_selected="Standards wiederherstellen" name="btn_restore_defaults"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_translation_settings.xml b/indra/newview/skins/default/xui/de/floater_translation_settings.xml
new file mode 100644
index 0000000000..3d5d1d46a8
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/floater_translation_settings.xml
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_translation_settings" title="ÜBERSETZUNGSEINSTELLUNGEN FÜR CHATS">
+ <string name="bing_api_key_not_verified">
+ Bing-AppID nicht verifiziert. Versuchen Sie es erneut.
+ </string>
+ <string name="google_api_key_not_verified">
+ Google-API-Schlüssel nicht verifiziert. Versuchen Sie es erneut.
+ </string>
+ <string name="bing_api_key_verified">
+ Bing-AppID verifiziert.
+ </string>
+ <string name="google_api_key_verified">
+ Google-API-Schlüssel verifiziert.
+ </string>
+ <check_box label="Maschinenübersetzung beim Chatten aktivieren" name="translate_chat_checkbox"/>
+ <text name="translate_language_label">
+ Chat übersetzen in:
+ </text>
+ <combo_box name="translate_language_combo">
+ <combo_box.item label="Systemstandard" name="System Default Language"/>
+ <combo_box.item label="English (Englisch)" name="English"/>
+ <combo_box.item label="Dansk (Dänisch)" name="Danish"/>
+ <combo_box.item label="Deutsch" name="German"/>
+ <combo_box.item label="Español (Spanisch)" name="Spanish"/>
+ <combo_box.item label="Français (Französisch)" name="French"/>
+ <combo_box.item label="Italiano (Italienisch)" name="Italian"/>
+ <combo_box.item label="Magyar (Ungarisch)" name="Hungarian"/>
+ <combo_box.item label="Nederlands (Holländisch)" name="Dutch"/>
+ <combo_box.item label="Polski (Polnisch)" name="Polish"/>
+ <combo_box.item label="Português (Portugiesisch)" name="Portugese"/>
+ <combo_box.item label="РуÑÑкий (Russisch)" name="Russian"/>
+ <combo_box.item label="Türkçe (Türkisch)" name="Turkish"/>
+ <combo_box.item label="УкраїнÑька (Ukrainisch)" name="Ukrainian"/>
+ <combo_box.item label="中文 (正體) (Chinesisch)" name="Chinese"/>
+ <combo_box.item label="日本語 (Japanisch)" name="Japanese"/>
+ <combo_box.item label="한국어 (Koreanisch)" name="Korean"/>
+ </combo_box>
+ <text name="tip">
+ Übersetzungsservice auswählen:
+ </text>
+ <radio_group name="translation_service_rg">
+ <radio_item initial_value="bing" label="Bing Translator" name="bing"/>
+ <radio_item initial_value="google" label="Google Translate" name="google"/>
+ </radio_group>
+ <text name="bing_api_key_label">
+ Bing-[http://www.bing.com/developers/createapp.aspx AppID]:
+ </text>
+ <button label="Verifizieren" name="verify_bing_api_key_btn"/>
+ <text name="google_api_key_label">
+ Google-[http://code.google.com/apis/language/translate/v2/getting_started.html#auth API-Schlüssel]:
+ </text>
+ <button label="Verifizieren" name="verify_google_api_key_btn"/>
+ <text name="google_links_text">
+ [http://code.google.com/apis/language/translate/v2/pricing.html Pricing] | [https://code.google.com/apis/console Statistik]
+ </text>
+ <button label="OK" name="ok_btn"/>
+ <button label="Abbrechen" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_voice_controls.xml b/indra/newview/skins/default/xui/de/floater_voice_controls.xml
index c97852b6e7..5efda4136e 100644
--- a/indra/newview/skins/default/xui/de/floater_voice_controls.xml
+++ b/indra/newview/skins/default/xui/de/floater_voice_controls.xml
@@ -1,16 +1,16 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_voice_controls" title="Voice-Steuerung">
+<floater name="floater_voice_controls" title="SPRACHSTEUERUNGEN">
<string name="title_nearby">
- VOICE IN DER NÄHE
+ VOICE-EINSTELLUNGEN
</string>
<string name="title_group">
- Gruppengespräch mit [GROUP]
+ GRUPPENGESPRÄCH MIT [GROUP]
</string>
<string name="title_adhoc">
- Konferenzgespräch
+ KONFERENZGESPRÄCH
</string>
<string name="title_peer_2_peer">
- Gespräch mit [NAME]
+ GESPRÄCH MIT [NAME]
</string>
<string name="no_one_near">
Es ist niemand in der Nähe, der Voice aktiviert hat.
diff --git a/indra/newview/skins/default/xui/de/inspect_group.xml b/indra/newview/skins/default/xui/de/inspect_group.xml
index d85ca7ce4d..60fa8ff0d8 100644
--- a/indra/newview/skins/default/xui/de/inspect_group.xml
+++ b/indra/newview/skins/default/xui/de/inspect_group.xml
@@ -26,7 +26,7 @@ Hoch solln sie leben! Elche forever! Und auch Mungos!
<text name="group_cost">
Mitgliedschaft: 123 L$
</text>
- <button label="Zusammen" name="join_btn"/>
+ <button label="Beitreten" name="join_btn"/>
<button label="Verlassen" name="leave_btn"/>
<button label="Profil anzeigen" name="view_profile_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/de/menu_bottomtray.xml b/indra/newview/skins/default/xui/de/menu_bottomtray.xml
index da36be59d0..cb0082f944 100644
--- a/indra/newview/skins/default/xui/de/menu_bottomtray.xml
+++ b/indra/newview/skins/default/xui/de/menu_bottomtray.xml
@@ -8,7 +8,7 @@
<menu_item_check label="Schaltfläche „Bauen“" name="ShowBuildButton"/>
<menu_item_check label="Schaltfläche „Suchen“" name="ShowSearchButton"/>
<menu_item_check label="Schaltfläche „Karte“" name="ShowWorldMapButton"/>
- <menu_item_check label="Schaltfläche „Minikarte“" name="ShowMiniMapButton"/>
+ <menu_item_check label="Minikarten-Schaltfläche" name="ShowMiniMapButton"/>
<menu_item_call label="Ausschneiden" name="NearbyChatBar_Cut"/>
<menu_item_call label="Kopieren" name="NearbyChatBar_Copy"/>
<menu_item_call label="Einfügen" name="NearbyChatBar_Paste"/>
diff --git a/indra/newview/skins/default/xui/de/menu_hide_navbar.xml b/indra/newview/skins/default/xui/de/menu_hide_navbar.xml
index 9acf96dc6d..33d55e85bd 100644
--- a/indra/newview/skins/default/xui/de/menu_hide_navbar.xml
+++ b/indra/newview/skins/default/xui/de/menu_hide_navbar.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu name="hide_navbar_menu">
- <menu_item_check label="Navigationsleiste anzeigen" name="ShowNavbarNavigationPanel"/>
+ <menu_item_check label="Navigations- und Favoritenleiste anzeigen" name="ShowNavbarNavigationPanel"/>
<menu_item_check label="Favoritenleiste anzeigen" name="ShowNavbarFavoritesPanel"/>
<menu_item_check label="Mini-Standortleiste anzeigen" name="ShowMiniLocationPanel"/>
</menu>
diff --git a/indra/newview/skins/default/xui/de/menu_login.xml b/indra/newview/skins/default/xui/de/menu_login.xml
index d932234cd1..c90205fbe4 100644
--- a/indra/newview/skins/default/xui/de/menu_login.xml
+++ b/indra/newview/skins/default/xui/de/menu_login.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu_bar name="Login Menu">
<menu label="Ich" name="File">
- <menu_item_call label="Einstellungen" name="Preferences..."/>
+ <menu_item_call label="Einstellungen..." name="Preferences..."/>
<menu_item_call label="[APP_NAME] schließen" name="Quit"/>
</menu>
<menu label="Hilfe" name="Help">
diff --git a/indra/newview/skins/default/xui/de/menu_toolbars.xml b/indra/newview/skins/default/xui/de/menu_toolbars.xml
new file mode 100644
index 0000000000..3fb48e26b2
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/menu_toolbars.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Toolbars Popup">
+ <menu_item_call label="Diese Schaltfläche entfernen" name="Remove button"/>
+ <menu_item_call label="Symbolleistenschaltflächen..." name="Choose Buttons"/>
+ <menu_item_check label="Symbole und Beschriftungen" name="icons_with_text"/>
+ <menu_item_check label="Nur Symbole" name="icons_only"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/de/menu_viewer.xml b/indra/newview/skins/default/xui/de/menu_viewer.xml
index 7c6918a4ee..a81874bee9 100644
--- a/indra/newview/skins/default/xui/de/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/de/menu_viewer.xml
@@ -1,54 +1,60 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu_bar name="Main Menu">
<menu label="Ich" name="Me">
- <menu_item_call label="Einstellungen" name="Preferences"/>
- <menu_item_call label="Meine Startseite" name="Manage My Account">
- <menu_item_call.on_click name="ManageMyAccount_url" parameter="WebLaunchJoinNow,http://secondlife.com/account/index.php?lang=de"/>
- </menu_item_call>
- <menu_item_call label="L$ kaufen" name="Buy and Sell L$"/>
- <menu_item_call label="Mein Profil" name="Profile"/>
- <menu_item_call label="Mein Aussehen" name="ChangeOutfit"/>
- <menu_item_check label="Mein Inventar" name="Inventory"/>
- <menu_item_check label="Mein Inventar" name="ShowSidetrayInventory"/>
- <menu_item_check label="Meine Gesten" name="Gestures"/>
- <menu_item_check label="Meine Stimme" name="ShowVoice"/>
+ <menu_item_call label="Profil..." name="Profile"/>
+ <menu_item_call label="Aussehen..." name="ChangeOutfit"/>
+ <menu_item_call label="Avatar auswählen..." name="Avatar Picker"/>
+ <menu_item_check label="Inventar..." name="Inventory"/>
+ <menu_item_call label="Neues Inventarfenster" name="NewInventoryWindow"/>
+ <menu_item_call label="Orte..." name="Places"/>
+ <menu_item_call label="Auswahlen..." name="Picks"/>
+ <menu_item_call label="Kamerasteuerungen..." name="Camera Controls"/>
<menu label="Bewegung" name="Movement">
<menu_item_call label="Hinsetzen" name="Sit Down Here"/>
<menu_item_check label="Fliegen" name="Fly"/>
<menu_item_check label="Immer rennen" name="Always Run"/>
<menu_item_call label="Animation meines Avatars stoppen" name="Stop Animating My Avatar"/>
</menu>
- <menu label="Mein Status" name="Status">
+ <menu label="Status" name="Status">
<menu_item_call label="Abwesend" name="Set Away"/>
<menu_item_call label="Beschäftigt" name="Set Busy"/>
</menu>
<menu_item_call label="Admin-Status anfordern" name="Request Admin Options"/>
<menu_item_call label="Admin-Status verlassen" name="Leave Admin Options"/>
+ <menu_item_call label="L$ kaufen" name="Buy and Sell L$"/>
+ <menu_item_call label="Kontoübersicht..." name="Manage My Account">
+ <menu_item_call.on_click name="ManageMyAccount_url" parameter="WebLaunchJoinNow,http://secondlife.com/account/index.php?lang=de"/>
+ </menu_item_call>
+ <menu_item_call label="Einstellungen..." name="Preferences"/>
+ <menu_item_call label="Symbolleistenschaltflächen..." name="Toolbars"/>
+ <menu_item_call label="Alle Steuerelemente ausblenden" name="Hide UI"/>
<menu_item_call label="[APP_NAME] schließen" name="Quit"/>
</menu>
<menu label="Unterhalten" name="Communicate">
- <menu_item_call label="Meine Freunde" name="My Friends"/>
- <menu_item_call label="Meine Gruppen" name="My Groups"/>
- <menu_item_check label="Chat in der Nähe" name="Nearby Chat"/>
+ <menu_item_check label="Chat..." name="Nearby Chat"/>
+ <menu_item_check label="Sprechen" name="Speak"/>
+ <menu_item_check label="Voice-Einstellungen..." name="Nearby Voice"/>
+ <menu_item_check label="Voice-Morphing..." name="ShowVoice"/>
+ <menu_item_check label="Gesten..." name="Gestures"/>
+ <menu_item_call label="Freunde" name="My Friends"/>
+ <menu_item_call label="Gruppen" name="My Groups"/>
<menu_item_call label="Leute in der Nähe" name="Active Speakers"/>
- <menu_item_check label="Stimme in der Nähe" name="Nearby Voice"/>
</menu>
<menu label="Welt" name="World">
- <menu_item_check label="Minikarte" name="Mini-Map"/>
+ <menu_item_call label="Landmarke für diesen Ort setzen" name="Create Landmark Here"/>
+ <menu_item_call label="Ziele..." name="Destinations"/>
<menu_item_check label="Karte" name="World Map"/>
+ <menu_item_check label="Minikarte" name="Mini-Map"/>
<menu_item_check label="Suchen" name="Search"/>
+ <menu_item_call label="Nach Hause teleportieren" name="Teleport Home"/>
+ <menu_item_call label="Hier als Zuhause wählen" name="Set Home to Here"/>
<menu_item_call label="Foto" name="Take Snapshot"/>
- <menu_item_call label="Landmarke für diesen Ort setzen" name="Create Landmark Here"/>
- <menu label="Ortsprofil" name="Land">
- <menu_item_call label="Ortsprofil" name="Place Profile"/>
- <menu_item_call label="Land-Info" name="About Land"/>
- <menu_item_call label="Region/Grundbesitz" name="Region/Estate"/>
- </menu>
+ <menu_item_call label="Ortsprofil" name="Place Profile"/>
+ <menu_item_call label="Landinformationen" name="About Land"/>
+ <menu_item_call label="Region/Grundbesitz" name="Region/Estate"/>
+ <menu_item_call label="Mein Landbesitz..." name="My Land"/>
<menu_item_call label="Dieses Land kaufen" name="Buy Land"/>
- <menu_item_call label="Mein Land" name="My Land"/>
<menu label="Anzeigen" name="LandShow">
- <menu_item_check label="Bewegungssteuerung" name="Movement Controls"/>
- <menu_item_check label="Ansichtsteuerung" name="Camera Controls"/>
<menu_item_check label="Bannlinien" name="Ban Lines"/>
<menu_item_check label="Strahlen" name="beacons"/>
<menu_item_check label="Grundstücksgrenzen" name="Property Lines"/>
@@ -57,16 +63,15 @@
<menu_item_check label="Parzelleneigenschaften" name="Parcel Properties"/>
<menu_item_check label="Menü „Erweitert“" name="Show Advanced Menu"/>
</menu>
- <menu_item_call label="Teleport nach Hause" name="Teleport Home"/>
- <menu_item_call label="Hier als Zuhause wählen" name="Set Home to Here"/>
<menu label="Sonne" name="Environment Settings">
<menu_item_call label="Sonnenaufgang" name="Sunrise"/>
<menu_item_call label="Mittag" name="Noon"/>
<menu_item_call label="Sonnenuntergang" name="Sunset"/>
<menu_item_call label="Mitternacht" name="Midnight"/>
+ <menu_item_call label="Regionseinstellungen verwenden" name="Use Region Settings"/>
</menu>
- <menu label="Umgebungs-Editor" name="Enviroment Editor">
- <menu_item_call label="Umgebungseinstellungen..." name="Enviroment Settings"/>
+ <menu label="Umwelt-Editor" name="Environment Editor">
+ <menu_item_call label="Umwelt-Einstellungen..." name="Environment Settings"/>
<menu label="Wasser-Voreinstellungen" name="Water Presets">
<menu_item_call label="Neue Voreinstellung..." name="new_water_preset"/>
<menu_item_call label="Voreinstellung bearbeiten..." name="edit_water_preset"/>
@@ -139,13 +144,14 @@
<menu_item_call label="Animation ([COST] L$)..." name="Upload Animation"/>
<menu_item_call label="Modell..." name="Upload Model"/>
<menu_item_call label="Mehrfach-Upload ([COST] L$ pro Datei)..." name="Bulk Upload"/>
+ <menu_item_call label="Hochlade-Berechtigungen (Standard) festlegen" name="perm prefs"/>
</menu>
<menu_item_call label="Rückgängig" name="Undo"/>
<menu_item_call label="Wiederholen" name="Redo"/>
</menu>
<menu label="Hilfe" name="Help">
+ <menu_item_call label="Anweisungen..." name="How To"/>
<menu_item_call label="[SECOND_LIFE]-Hilfe" name="Second Life Help"/>
- <menu_item_check label="Hinweise aktivieren" name="Enable Hints"/>
<menu_item_call label="Missbrauch melden" name="Report Abuse"/>
<menu_item_call label="Fehler melden" name="Report Bug"/>
<menu_item_call label="INFO ÜBER [APP_NAME]" name="About Second Life"/>
@@ -161,7 +167,7 @@
<menu label="Performance Tools" name="Performance Tools">
<menu_item_call label="Lag-Anzeige" name="Lag Meter"/>
<menu_item_check label="Statistikleiste" name="Statistics Bar"/>
- <menu_item_check label="Avatar-Darstellungskosten anzeigen" name="Avatar Rendering Cost"/>
+ <menu_item_check label="Zuggewicht für Avatare anzeigen" name="Avatar Rendering Cost"/>
</menu>
<menu label="Hervorhebung und Sichtbarkeit" name="Highlighting and Visibility">
<menu_item_check label="Pulsierender Strahl" name="Cheesy Beacon"/>
@@ -199,11 +205,10 @@
<menu_item_check label="Plugin Read Thread verwenden" name="Use Plugin Read Thread"/>
<menu_item_call label="Gruppen-Cache löschen" name="ClearGroupCache"/>
<menu_item_check label="Weiche Mausbewegung" name="Mouse Smoothing"/>
+ <menu_item_call label="Tasten freigeben" name="Release Keys"/>
<menu label="Tastaturkürzel" name="Shortcuts">
<menu_item_call label="Bild ([COST] L$)..." name="Upload Image"/>
<menu_item_check label="Suchen" name="Search"/>
- <menu_item_call label="Tasten freigeben" name="Release Keys"/>
- <menu_item_call label="UI-Größe auf Standard setzen" name="Set UI Size to Default"/>
<menu_item_check label="Erweitert-Menü anzeigen - veraltetet" name="Show Advanced Menu - legacy shortcut"/>
<menu_item_call label="Fenster schließen" name="Close Window"/>
<menu_item_call label="Alle Fenster schließen" name="Close All Windows"/>
@@ -289,6 +294,8 @@
<menu_item_check label="Lichter" name="Lights"/>
<menu_item_check label="Gelenkpunkte" name="Collision Skeleton"/>
<menu_item_check label="Raycast" name="Raycast"/>
+ <menu_item_check label="Windvektoren" name="Wind Vectors"/>
+ <menu_item_check label="Komplexität beim Rendern" name="rendercomplexity"/>
<menu_item_check label="Formen" name="Sculpt"/>
</menu>
<menu label="Rendering" name="Rendering">
@@ -300,7 +307,6 @@
<menu_item_check label="Licht und Schatten" name="Lighting and Shadows"/>
<menu_item_check label="Schatten von Sonne-/Mond-Projektoren" name="Shadows from Sun/Moon/Projectors"/>
<menu_item_check label="SSAO und Schattenglättung" name="SSAO and Shadow Smoothing"/>
- <menu_item_check label="Globale Beleuchtung (experimentell)" name="Global Illumination"/>
<menu_item_check label="Fehler in GL beseitigen" name="Debug GL"/>
<menu_item_check label="Fehler in Pipeline beseitigen" name="Debug Pipeline"/>
<menu_item_check label="Automatische Alpha-Masken (aufgeschoben)" name="Automatic Alpha Masks (deferred)"/>
diff --git a/indra/newview/skins/default/xui/de/notifications.xml b/indra/newview/skins/default/xui/de/notifications.xml
index 4c53c40d86..a34b938a7a 100644
--- a/indra/newview/skins/default/xui/de/notifications.xml
+++ b/indra/newview/skins/default/xui/de/notifications.xml
@@ -992,7 +992,7 @@ Sie sind nicht berechtigt, Land für die aktive Gruppe zu kaufen.
</form>
</notification>
<notification name="RemoveFromFriends">
- Möchten Sie [NAME] aus Ihrer Freundesliste entfernen?
+ Möchten Sie &lt;nolink&gt;[NAME]&lt;/nolink&gt; aus Ihrer Freundesliste entfernen?
<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
</notification>
<notification name="RemoveMultipleFromFriends">
@@ -1124,8 +1124,13 @@ Der Gruppe „[GROUP_NAME]“ [AREA] m² an Land schenken?
<notification name="DisplaySetToSafe">
Es wurden sichere Anzeige-Einstellungen gewählt, da die Option -safe verwendet wurde.
</notification>
- <notification name="DisplaySetToRecommended">
- Es wurden die für Ihre Systemkonfiguration empfohlenen Anzeige-Einstellungen gewählt.
+ <notification name="DisplaySetToRecommendedGPUChange">
+ Die Anzeigeeinstellungen wurden auf die empfohlenen Werte gesetzt, da Ihre Grafikkarte geändert wurde
+von „[LAST_GPU]“
+in „[THIS_GPU]“
+ </notification>
+ <notification name="DisplaySetToRecommendedFeatureChange">
+ Aufgrund einer Änderung des Rendersubsystems wurden die Anzeigeeinstellungen auf die empfohlenen Werte gesetzt.
</notification>
<notification name="ErrorMessage">
[ERROR_MESSAGE]
@@ -1443,7 +1448,7 @@ Zur Installation des Updates muss [APP_NAME] neu gestartet werden.
<usetemplate ignoretext="Bestätigen, bevor Objekte an Ihre Eigentümer zurückgegeben werden" name="okcancelignore" notext="Abbrechen" yestext="OK"/>
</notification>
<notification name="GroupLeaveConfirmMember">
- Sie sind Mitglied der Gruppe [GROUP].
+ Sie sind Mitglied der Gruppe &lt;nolink&gt;[GROUP]&lt;/nolink&gt;.
Diese Gruppe verlassen?
<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
</notification>
@@ -1925,6 +1930,18 @@ Inventarobjekt(e) verschieben?
Wirklich beenden?
<usetemplate ignoretext="Bestätigen, bevor Sitzung beendet wird" name="okcancelignore" notext="Nicht beenden" yestext="Beenden"/>
</notification>
+ <notification name="ConfirmRestoreToybox">
+ Durch diese Aktion werden Ihre Standardschaltflächen und -symbolleisten wiederhergestellt.
+
+Diese Aktion kann nicht rückgängig gemacht werden.
+ <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmClearAllToybox">
+ Durch diese Aktion werden alle Schaltflächen zurück in die Toolbox gestellt; die Symbolleisten sind leer.
+
+Diese Aktion kann nicht rückgängig gemacht werden.
+ <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
+ </notification>
<notification name="DeleteItems">
[QUESTION]
<usetemplate ignoretext="Vor dem Löschen von Objekten bestätigen" name="okcancelignore" notext="Abbrechen" yestext="OK"/>
@@ -2128,10 +2145,10 @@ Hierzu wird Ihr Webbrowser geöffnet.
Betreff: [SUBJECT], Nachricht: [MESSAGE]
</notification>
<notification name="FriendOnline">
- [NAME] ist online
+ &lt;nolink&gt;[NAME]&lt;/nolink&gt; ist online
</notification>
<notification name="FriendOffline">
- [NAME] ist offline
+ &lt;nolink&gt;[NAME]&lt;/nolink&gt; ist offline
</notification>
<notification name="AddSelfFriend">
Obwohl Sie ein sehr netter Mensch sind, können Sie sich nicht selbst als Freund hinzufügen.
@@ -2244,14 +2261,16 @@ Wählen Sie ein einzelnes Objekt aus.
Ihre Visitenkarte wurde abgelehnt.
</notification>
<notification name="TeleportToLandmark">
- Sie können an Positionen wie „[NAME]“ teleportieren, wenn Sie rechts in Ihrem Bildschirm die Tafel „Orte“ öffnen und dann die Registerkarte „Meine Landmarken“ auswählen.
-Klicken Sie auf eine Landmarke, um diese auszuwählen. Klicken Sie anschließend auf unten in der Registerkarte auf „Teleportieren“.
-(Sie können auch auf die Landmarke doppelt klicken oder mit rechts auf die Landmarke klicken und dann „Teleportieren“ auswählen).
+ Um zu Orten wie „[NAME]“ zu teleportieren, klicken Sie zuerst auf die Schaltfläche „Orte“
+ und dann im eingeblendeten Fenster auf die Registerkarte „Landmarken“. Klicken Sie auf
+ die gewünschte Landmarke und dann unten im Fenster auf „Teleportieren“.
+ (Sie können auch auf die Landmarke doppelklicken bzw. sie mit der rechten Maustaste ankklicken und dann
+ „Teleportieren“ wählen.)
</notification>
<notification name="TeleportToPerson">
- Sie können Einwohner wie „[NAME]“ kontaktieren, wenn Sie die Tafel „Leute“ auf der rechten Seite Ihres Bildschirms öffnen.
-Wählen Sie den Einwohner aus der Liste aus und klicken Sie unten auf „IM“.
-(Sie können auch auf den Namen doppelt klicken oder mit rechts auf den Namen klicken und dann „IM“ auswählen).
+ Um Einwohner wie „[NAME]“ zu kontaktieren, klicken Sie auf die Schaltfläche „Leute“, wählen Sie eingeblendeten Fenster einen Einwohner aus
+ und klicken Sie unten im Fenster auf „IM“.
+ (Sie können auch auf den Namen doppelklicken bzw. ihn mit der rechten Maustaste anklicken und dann „IM“ wählen.)
</notification>
<notification name="CantSelectLandFromMultipleRegions">
Land kann nicht über Servergrenzen hinweg ausgewählt werden.
@@ -2272,6 +2291,9 @@ Wählen Sie eine kleinere Landfläche.
<notification name="PaymentSent">
[MESSAGE]
</notification>
+ <notification name="PaymentFailure">
+ [MESSAGE]
+ </notification>
<notification name="EventNotification">
Event-Benachrichtigung:
@@ -2526,10 +2548,10 @@ Versuchen Sie es in einigen Minuten erneut.
</form>
</notification>
<notification name="FriendshipAccepted">
- [NAME] hat Ihr Freundschaftsangebot akzeptiert.
+ &lt;nolink&gt;[NAME]&lt;/nolink&gt; hat Ihr Freundschaftsangebot akzeptiert.
</notification>
<notification name="FriendshipDeclined">
- [NAME] hat Ihr Freundschaftsangebot abgelehnt.
+ &lt;nolink&gt;[NAME]&lt;/nolink&gt; hat Ihr Freundschaftsangebot abgelehnt.
</notification>
<notification name="FriendshipAcceptedByMe">
Ihr Freundschaftsangebot wurde angeommen.
@@ -3008,10 +3030,6 @@ Durch Ausblenden der Schaltfläche „Sprechen“ wird die Sprechfunktion deakti
<button name="cancel" text="Abbrechen"/>
</form>
</notification>
- <notification label="" name="ModeChange">
- Zum Wechsel des Modus müssen Sie das Programm beenden und neu starten.
- <usetemplate name="okcancelbuttons" notext="Nicht beenden" yestext="Beenden"/>
- </notification>
<notification label="" name="NoClassifieds">
Die Erstellung und Bearbeitung von Anzeigen ist nur im Modus „Erweitert“ möglich. Möchten Sie das Programm beenden und den Modus wechseln? Die Modusauswahl ist auf dem Anmeldebildschirm zu finden.
<usetemplate name="okcancelbuttons" notext="Nicht beenden" yestext="Beenden"/>
@@ -3056,6 +3074,10 @@ Durch Ausblenden der Schaltfläche „Sprechen“ wird die Sprechfunktion deakti
Die Suche ist nur im Modus „Erweitert“ möglich. Möchten Sie sich abmelden und den Modus wechseln?
<usetemplate name="okcancelbuttons" notext="Nicht beenden" yestext="Beenden"/>
</notification>
+ <notification label="" name="ConfirmHideUI">
+ Durch diese Aktion werden alle Menüelemente und Schaltflächen ausgeblendet. Um sie wieder anzuzeigen, klicken Sie erneut auf [SHORTCUT].
+ <usetemplate ignoretext="Vor Ausblenden der UI bestätigen" name="okcancelignore" notext="Abbrechen" yestext="OK"/>
+ </notification>
<global name="UnsupportedGLRequirements">
Ihr Computer entspricht nicht den Hardwareanforderungen von [APP_NAME]. [APP_NAME] setzt eine OpenGL-Grafikkarte mit Multitextur-Unterstützung voraus. Falls Ihre Grafikkarte diese Funktion unterstützt, installieren Sie die neuesten Treiber sowie die aktuellen Service Packs und Patches für Ihr Betriebssystem.
diff --git a/indra/newview/skins/default/xui/de/panel_chiclet_bar.xml b/indra/newview/skins/default/xui/de/panel_chiclet_bar.xml
new file mode 100644
index 0000000000..bcc6772bb9
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/panel_chiclet_bar.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="chiclet_bar">
+ <layout_stack name="toolbar_stack">
+ <layout_panel name="im_well_panel">
+ <chiclet_im_well name="im_well">
+ <button name="Unread IM messages" tool_tip="Unterhaltungen"/>
+ </chiclet_im_well>
+ </layout_panel>
+ <layout_panel name="notification_well_panel">
+ <chiclet_notification name="notification_well">
+ <button name="Unread" tool_tip="Benachrichtigungen"/>
+ </chiclet_notification>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_edit_skin.xml b/indra/newview/skins/default/xui/de/panel_edit_skin.xml
index f167f45e98..60f6919485 100644
--- a/indra/newview/skins/default/xui/de/panel_edit_skin.xml
+++ b/indra/newview/skins/default/xui/de/panel_edit_skin.xml
@@ -1,9 +1,9 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_skin_panel">
<panel name="avatar_skin_color_panel">
- <texture_picker label="Kopftattoo" name="Head Tattoos" tool_tip="Zum Auswählen eines Bildes hier klicken"/>
- <texture_picker label="Obere Tattoos" name="Upper Tattoos" tool_tip="Zum Auswählen eines Bildes hier klicken"/>
- <texture_picker label="Untere Tattoos" name="Lower Tattoos" tool_tip="Zum Auswählen eines Bildes hier klicken"/>
+ <texture_picker label="Kopf" name="Head" tool_tip="Klicken, um ein Bild zu wählen"/>
+ <texture_picker label="Oberkörper" name="Upper Body" tool_tip="Klicken, um ein Bild zu wählen"/>
+ <texture_picker label="Unterkörper" name="Lower Body" tool_tip="Klicken, um ein Bild zu wählen"/>
</panel>
<panel name="accordion_panel">
<accordion name="wearable_accordion">
diff --git a/indra/newview/skins/default/xui/de/panel_me.xml b/indra/newview/skins/default/xui/de/panel_me.xml
index 26b9812212..f49446fbbf 100644
--- a/indra/newview/skins/default/xui/de/panel_me.xml
+++ b/indra/newview/skins/default/xui/de/panel_me.xml
@@ -1,7 +1,4 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Mein Profil" name="panel_me">
- <tab_container name="tabs">
- <panel label="MEIN PROFIL" name="panel_profile"/>
- <panel label="MEINE AUSWAHL" name="panel_picks"/>
- </tab_container>
+ <panel label="MEINE AUSWAHLEN" name="panel_picks"/>
</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_my_profile.xml b/indra/newview/skins/default/xui/de/panel_my_profile.xml
deleted file mode 100644
index 89a4dfdaba..0000000000
--- a/indra/newview/skins/default/xui/de/panel_my_profile.xml
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Profil" name="panel_profile">
- <string name="CaptionTextAcctInfo">
- [ACCTTYPE]
-[PAYMENTINFO] [AGEVERIFICATION]
- </string>
- <string name="payment_update_link_url">
- http://www.secondlife.com/account/billing.php?lang=de-DE
- </string>
- <string name="partner_edit_link_url">
- http://www.secondlife.com/account/partners.php?lang=de
- </string>
- <string name="my_account_link_url" value="http://secondlife.com/my/account/index.php?lang=de-DE"/>
- <string name="no_partner_text" value="Keiner"/>
- <string name="no_group_text" value="Keiner"/>
- <string name="RegisterDateFormat">
- [REG_DATE] ([AGE])
- </string>
- <string name="name_text_args">
- [NAME]
- </string>
- <string name="display_name_text_args">
- [DISPLAY_NAME]
- </string>
- <layout_stack name="layout">
- <layout_panel name="profile_stack">
- <scroll_container name="profile_scroll">
- <panel name="scroll_content_panel">
- <panel name="second_life_image_panel">
- <text name="display_name_descr_text">
- Benutzername
- </text>
- <text name="name_descr_text">
- Anzeigename
- </text>
- <button label="Profil" name="see_profile_btn" tool_tip="Profil zu diesem Avatar anzeigen"/>
- </panel>
- </panel>
- </scroll_container>
- </layout_panel>
- </layout_stack>
-</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_navigation_bar.xml b/indra/newview/skins/default/xui/de/panel_navigation_bar.xml
index ee1a543aac..53794b6619 100644
--- a/indra/newview/skins/default/xui/de/panel_navigation_bar.xml
+++ b/indra/newview/skins/default/xui/de/panel_navigation_bar.xml
@@ -1,18 +1,23 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="navigation_bar">
- <panel name="navigation_panel">
- <pull_button name="back_btn" tool_tip="Zurück zum vorherigen Standort teleportieren"/>
- <pull_button name="forward_btn" tool_tip="Um einen Standort weiter teleportieren"/>
- <button name="home_btn" tool_tip="Zu meinem Zuhause teleportieren"/>
- <location_input label="Standort" name="location_combo"/>
- <search_combo_box label="Suche" name="search_combo_box" tool_tip="Suche">
- <combo_editor label="[SECOND_LIFE] durchsuchen" name="search_combo_editor"/>
- </search_combo_box>
- </panel>
- <favorites_bar name="favorite" tool_tip="Ziehen Sie Landmarken hier hin, damit Sie schnell zu Ihren Lieblingsplätzen in Second Life gelangen können!">
- <label name="favorites_bar_label" tool_tip="Ziehen Sie Landmarken hier hin, damit Sie schnell zu Ihren Lieblingsplätzen in Second Life gelangen können!">
- Favoritenleiste
- </label>
- <chevron_button name="&gt;&gt;" tool_tip="Mehr meiner Favoriten anzeigen"/>
- </favorites_bar>
+ <layout_stack name="nvp_stack">
+ <layout_panel name="navigation_layout_panel">
+ <panel name="navigation_panel">
+ <pull_button name="back_btn" tool_tip="Zum vorherigen Standort zurückgehen"/>
+ <pull_button name="forward_btn" tool_tip="Einen Standort weiter gehen"/>
+ <button name="home_btn" tool_tip="Zu meinem Zuhause teleportieren"/>
+ <location_input label="Standort" name="location_combo"/>
+ </panel>
+ </layout_panel>
+ <layout_panel name="favorites_layout_panel">
+ <favorites_bar name="favorite" tool_tip="Landmarken hierher ziehen für schnellen Zugriff auf Lieblingsorte in Second Life.">
+ <label name="favorites_bar_label" tool_tip="Landmarken hierher ziehen für schnellen Zugriff auf Lieblingsorte in Second Life.">
+ Favoritenleiste
+ </label>
+ <more_button name="&gt;&gt;" tool_tip="Mehr meiner Favoriten anzeigen">
+ Mehr â–¼
+ </more_button>
+ </favorites_bar>
+ </layout_panel>
+ </layout_stack>
</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_nearby_chat.xml b/indra/newview/skins/default/xui/de/panel_nearby_chat.xml
new file mode 100644
index 0000000000..2068c39024
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/panel_nearby_chat.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="nearby_chat">
+ <check_box label="Chat übersetzen" name="translate_chat_checkbox"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_notes.xml b/indra/newview/skins/default/xui/de/panel_notes.xml
deleted file mode 100644
index ef1961b63d..0000000000
--- a/indra/newview/skins/default/xui/de/panel_notes.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Notizen &amp; Privatsphäre" name="panel_notes">
- <layout_stack name="layout">
- <layout_panel name="notes_stack">
- <scroll_container name="profile_scroll">
- <panel name="profile_scroll_panel">
- <text name="status_message" value="Meine Notizen:"/>
- <text name="status_message2" value="Diese Person kann:"/>
- <check_box label="meinen Online-Status sehen." name="status_check"/>
- <check_box label="mich auf der Karte sehen." name="map_check"/>
- <check_box label="meine Objekte bearbeiten, löschen oder nehmen." name="objects_check"/>
- </panel>
- </scroll_container>
- </layout_panel>
- <layout_panel name="notes_buttons_panel">
- <layout_stack name="bottom_bar_ls">
- <layout_panel name="add_friend_btn_lp">
- <button label="Freund hinzufügen" name="add_friend" tool_tip="Dem Einwohner die Freundschaft anbieten"/>
- </layout_panel>
- <layout_panel name="im_btn_lp">
- <button label="IM" name="im" tool_tip="Instant Messenger öffnen"/>
- </layout_panel>
- <layout_panel name="call_btn_lp">
- <button label="Anrufen" name="call" tool_tip="Diesen Einwohner anrufen"/>
- </layout_panel>
- <layout_panel name="show_on_map_btn_lp">
- <button label="Karte" name="show_on_map_btn" tool_tip="Einwohner auf Karte anzeigen"/>
- </layout_panel>
- <layout_panel name="teleport_btn_lp">
- <button label="Teleportieren" name="teleport" tool_tip="Teleport anbieten"/>
- </layout_panel>
- </layout_stack>
- </layout_panel>
- </layout_stack>
-</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_postcard_message.xml b/indra/newview/skins/default/xui/de/panel_postcard_message.xml
new file mode 100644
index 0000000000..6eeef8af71
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/panel_postcard_message.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_postcard_message">
+ <text name="to_label">
+ An:
+ </text>
+ <text name="name_label">
+ Von:
+ </text>
+ <text name="subject_label">
+ Betreff:
+ </text>
+ <line_editor label="Betreff hier eingeben." name="subject_form"/>
+ <text name="msg_label">
+ Nachricht:
+ </text>
+ <text_editor name="msg_form">
+ Nachricht hier eingeben.
+ </text_editor>
+ <button label="Abbrechen" name="cancel_btn"/>
+ <button label="Senden" name="send_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_postcard_settings.xml b/indra/newview/skins/default/xui/de/panel_postcard_settings.xml
new file mode 100644
index 0000000000..c1a1c0cc46
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/panel_postcard_settings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_postcard_settings">
+ <combo_box label="Auflösung" name="postcard_size_combo">
+ <combo_box.item label="Aktuelles Fenster" 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="Benutzerdefiniert" name="Custom"/>
+ </combo_box>
+ <layout_stack name="postcard_image_params_ls">
+ <layout_panel name="postcard_image_size_lp">
+ <spinner label="Breite" name="postcard_snapshot_width"/>
+ <spinner label="Höhe" name="postcard_snapshot_height"/>
+ <check_box label="Seitenverhältnis beibehalten" name="postcard_keep_aspect_check"/>
+ </layout_panel>
+ <layout_panel name="postcard_image_format_quality_lp">
+ <slider label="Bildqualität" name="image_quality_slider"/>
+ <text name="image_quality_level">
+ ([QLVL])
+ </text>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_preferences_chat.xml b/indra/newview/skins/default/xui/de/panel_preferences_chat.xml
index ca8af27f58..746a561e6c 100644
--- a/indra/newview/skins/default/xui/de/panel_preferences_chat.xml
+++ b/indra/newview/skins/default/xui/de/panel_preferences_chat.xml
@@ -29,30 +29,5 @@
<check_box label="IM-Chats" name="EnableIMChatPopups" tool_tip="Markieren, um Popups zu sehen, wenn Instant Message eintrifft"/>
<spinner label="Lebenszeit von Toasts für Chat in der Nähe:" name="nearby_toasts_lifetime"/>
<spinner label="Ein-/Ausblenddauer von Toasts für Chat in der Nähe:" name="nearby_toasts_fadingtime"/>
- <check_box name="translate_chat_checkbox"/>
- <text name="translate_chb_label">
- Beim Chatten Maschinenübersetzung verwenden (von Google bereitgestellt)
- </text>
- <text name="translate_language_text">
- Chat übersetzen in:
- </text>
- <combo_box name="translate_language_combobox" width="200">
- <combo_box.item label="Systemstandard" name="System Default Language"/>
- <combo_box.item label="English (Englisch)" name="English"/>
- <combo_box.item label="Dansk (Dänisch)" name="Danish"/>
- <combo_box.item label="Deutsch" name="German"/>
- <combo_box.item label="Español (Spanisch)" name="Spanish"/>
- <combo_box.item label="Français (Französisch)" name="French"/>
- <combo_box.item label="Italiano (Italienisch)" name="Italian"/>
- <combo_box.item label="Magyar (Ungarisch)" name="Hungarian"/>
- <combo_box.item label="Nederlands (Holländisch)" name="Dutch"/>
- <combo_box.item label="Polski (Polnisch)" name="Polish"/>
- <combo_box.item label="Português (Portugiesisch)" name="Portugese"/>
- <combo_box.item label="РуÑÑкий (Russisch)" name="Russian"/>
- <combo_box.item label="Türkçe (Türkisch)" name="Turkish"/>
- <combo_box.item label="УкраїнÑька (Ukrainisch)" name="Ukrainian"/>
- <combo_box.item label="中文 (简体) (Chinesisch)" name="Chinese"/>
- <combo_box.item label="日本語 (Japanisch)" name="Japanese"/>
- <combo_box.item label="한국어 (Koreanisch)" name="Korean"/>
- </combo_box>
+ <button label="Übersetzungseinstellungen für Chats" name="ok_btn"/>
</panel>
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 79b2a544f9..979ccba48d 100644
--- a/indra/newview/skins/default/xui/de/panel_preferences_general.xml
+++ b/indra/newview/skins/default/xui/de/panel_preferences_general.xml
@@ -11,10 +11,12 @@
<combo_box.item label="Español (Spanisch) - Beta" name="Spanish"/>
<combo_box.item label="Français (Französisch) - Beta" name="French"/>
<combo_box.item label="Italiano (Italienisch) - Beta" name="Italian"/>
- <combo_box.item label="Nederlands (Niederländisch) - Beta" name="Dutch"/>
<combo_box.item label="Polski (Polnisch) - Beta" name="Polish"/>
<combo_box.item label="Português (Portugiesisch) - Beta" name="Portugese"/>
+ <combo_box.item label="РуÑÑкий (Russisch) – Beta" name="Russian"/>
+ <combo_box.item label="Türkçe (Türkisch) – Beta" name="Turkish"/>
<combo_box.item label="日本語 (Japanisch) - Beta" name="(Japanese)"/>
+ <combo_box.item label="正體中文 (Traditionelles Chinesisch) – Beta" name="Traditional Chinese"/>
</combo_box>
<text name="language_textbox2">
(Erfordert Neustart)
@@ -49,7 +51,6 @@
<check_box label="Gruppentitel" name="show_all_title_checkbox1" tool_tip="Gruppentitel wie „Vorstand“ oder „Mitglied“"/>
<check_box label="Freunde hervorheben" name="show_friends" tool_tip="Avatarnamen Ihrer Freunde hervorheben"/>
<check_box label="Anzeigenamen anzeigen" name="display_names_check" tool_tip="Aktivieren Sie diese Option, um Anzeigenamen in Chat, IM, Avatarnamen usw. zu verwenden."/>
- <check_box label="Viewer-UI-Tipps aktivieren" name="viewer_hints_check"/>
<text name="inworld_typing_rg_label">
Drücken von Buchstabentasten:
</text>
diff --git a/indra/newview/skins/default/xui/de/panel_preferences_move.xml b/indra/newview/skins/default/xui/de/panel_preferences_move.xml
index fb749a16d7..3e248f0bf0 100644
--- a/indra/newview/skins/default/xui/de/panel_preferences_move.xml
+++ b/indra/newview/skins/default/xui/de/panel_preferences_move.xml
@@ -7,18 +7,33 @@
</text>
<check_box label="Bauen/Bearbeiten" name="edit_camera_movement" tool_tip="Automatische Kamerapositionierung bei Wechsel in und aus dem Bearbeitungsmodus verwenden"/>
<check_box label="Aussehen" name="appearance_camera_movement" tool_tip="Automatische Kamerapositionierung im Bearbeitenmodus verwenden"/>
- <check_box initial_value="true" label="Seitenleiste" name="appearance_sidebar_positioning" tool_tip="Automatische Kameraposition für Seitenleiste verwenden"/>
+ <text name="keyboard_lbl">
+ Tastatur:
+ </text>
+ <check_box label="Mit Pfeiltasten bewegen" name="arrow_keys_move_avatar_check"/>
+ <check_box label="Drücken-drücken-halten, um zu rennen" name="tap_tap_hold_to_run"/>
+ <text name="mouse_lbl">
+ Maus:
+ </text>
<check_box label="Mich im Mouselook anzeigen" name="first_person_avatar_visible"/>
<text name=" Mouse Sensitivity">
Mausempfindlichkeit für Mouselook:
</text>
<check_box label="Umkehren" name="invert_mouse"/>
- <check_box label="Mit Pfeiltasten bewegen" name="arrow_keys_move_avatar_check"/>
- <check_box label="Drücken-drücken-halten, um zu rennen" name="tap_tap_hold_to_run"/>
- <check_box label="Doppelklicken:" name="double_click_chkbox"/>
- <radio_group name="double_click_action">
- <radio_item label="Teleportieren" name="radio_teleport"/>
- <radio_item label="Autopilot" name="radio_autopilot"/>
- </radio_group>
+ <text name="single_click_action_lbl">
+ Einmal auf Land klicken:
+ </text>
+ <combo_box name="single_click_action_combo">
+ <combo_box.item label="Keine Aktion" name="0"/>
+ <combo_box.item label="Zu angeklicktem Ort bewegen" name="1"/>
+ </combo_box>
+ <text name="double_click_action_lbl">
+ Auf Land doppelklicken:
+ </text>
+ <combo_box name="double_click_action_combo">
+ <combo_box.item label="Keine Aktion" name="0"/>
+ <combo_box.item label="Zu angeklicktem Ort bewegen" name="1"/>
+ <combo_box.item label="Zu angeklicktem Ort teleportieren" name="2"/>
+ </combo_box>
<button label="Andere Geräte" name="joystick_setup_button"/>
</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_preferences_setup.xml b/indra/newview/skins/default/xui/de/panel_preferences_setup.xml
index 8b18bf8659..8c7ea688d7 100644
--- a/indra/newview/skins/default/xui/de/panel_preferences_setup.xml
+++ b/indra/newview/skins/default/xui/de/panel_preferences_setup.xml
@@ -15,7 +15,7 @@
Web:
</text>
<radio_group name="use_external_browser">
- <radio_item label="Meinen Browser verwenden (IE, Firefox, Safari)" name="external" tool_tip="Standard Webbrowser des Systems verwenden, um die Hilfe, Weblinks usw. anzuzeigen. Bei Vollbildmodus nicht empfohlen." value="1"/>
+ <radio_item label="Meinen Browser verwenden (IE, Firefox, Safari)" name="external" tool_tip="Standard Webbrowser des Systems verwenden, um die Hilfe, Weblinks usw. anzuzeigen. Bei Vollbildmodus nicht empfohlen." value="true"/>
<radio_item label="Integrierten Browser verwenden" name="internal" tool_tip="Integrierten Webbrowser verwenden, um die Hilfe, Weblinks usw. anzuzeigen. Dieser Browser öffnet als neues Fenster innerhalb von [APP_NAME]." value=""/>
</radio_group>
<check_box initial_value="true" label="Plugins aktivieren" name="browser_plugins_enabled"/>
diff --git a/indra/newview/skins/default/xui/de/panel_profile.xml b/indra/newview/skins/default/xui/de/panel_profile.xml
deleted file mode 100644
index b4c6e67108..0000000000
--- a/indra/newview/skins/default/xui/de/panel_profile.xml
+++ /dev/null
@@ -1,74 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Profil" name="panel_profile">
- <string name="CaptionTextAcctInfo">
- [ACCTTYPE]
-[PAYMENTINFO] [AGEVERIFICATION]
- </string>
- <string name="payment_update_link_url">
- http://www.secondlife.com/account/billing.php?lang=de-DE
- </string>
- <string name="partner_edit_link_url">
- http://www.secondlife.com/account/partners.php?lang=de
- </string>
- <string name="my_account_link_url" value="http://secondlife.com/my/account/index.php?lang=de-DE"/>
- <string name="no_partner_text" value="Keiner"/>
- <string name="no_group_text" value="Keiner"/>
- <string name="RegisterDateFormat">
- [REG_DATE] ([AGE])
- </string>
- <string name="name_text_args">
- [NAME]
- </string>
- <string name="display_name_text_args">
- [DISPLAY_NAME]
- </string>
- <layout_stack name="layout">
- <layout_panel name="profile_stack">
- <scroll_container name="profile_scroll">
- <panel name="profile_scroll_panel">
- <panel name="second_life_image_panel">
- <text name="title_sl_descr_text" value="[SECOND_LIFE]:"/>
- </panel>
- <panel name="first_life_image_panel">
- <text name="title_rw_descr_text" value="Echtes Leben:"/>
- </panel>
- <text name="title_member_text" value="Einwohner seit:"/>
- <text name="title_acc_status_text" value="Kontostatus:"/>
- <text_editor name="acc_status_text">
- Einwohner. Keine Zahlungsinfo archiviert.
- Linden.
- </text_editor>
- <text name="title_partner_text" value="Partner:"/>
- <panel name="partner_data_panel">
- <text initial_value="(wird in Datenbank gesucht)" name="partner_text"/>
- </panel>
- <text name="title_groups_text" value="Gruppen:"/>
- </panel>
- </scroll_container>
- </layout_panel>
- </layout_stack>
- <layout_stack name="layout_verb_buttons">
- <layout_panel name="profile_buttons_panel">
- <layout_stack name="bottom_bar_ls">
- <layout_panel name="add_friend_btn_lp">
- <button label="Freund hinzufügen" name="add_friend" tool_tip="Dem Einwohner die Freundschaft anbieten"/>
- </layout_panel>
- <layout_panel name="im_btn_lp">
- <button label="IM" name="im" tool_tip="Instant Messenger öffnen"/>
- </layout_panel>
- <layout_panel name="call_btn_lp">
- <button label="Anrufen" name="call" tool_tip="Diesen Einwohner anrufen"/>
- </layout_panel>
- <layout_panel name="chat_btn_lp">
- <button label="Teleportieren" name="teleport" tool_tip="Teleport anbieten"/>
- </layout_panel>
- <layout_panel name="overflow_btn_lp">
- <menu_button label="â–¼" name="overflow_btn" tool_tip="Dem Einwohner Geld geben oder Inventar an den Einwohner schicken"/>
- </layout_panel>
- </layout_stack>
- </layout_panel>
- <layout_panel name="profile_me_buttons_panel">
- <button label="Profil bearbeiten" name="edit_profile_btn" tool_tip="Ihre persönlichen Informationen bearbeiten"/>
- </layout_panel>
- </layout_stack>
-</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
deleted file mode 100644
index 7e93bd1ede..0000000000
--- a/indra/newview/skins/default/xui/de/panel_profile_view.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="panel_target_profile">
- <string name="status_online">
- Online
- </string>
- <string name="status_offline">
- Offline
- </string>
- <text name="display_name_label" value="Anzeigename:"/>
- <text name="solo_username_label" value="Benutzername:"/>
- <text name="status" value="Online"/>
- <text name="user_name_small" value="Dieser Name ist ein ganz außerordentlich langer Name"/>
- <button name="copy_to_clipboard" tool_tip="In Zwischenablage kopieren"/>
- <text name="user_label" value="Benutzername:"/>
- <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"/>
- </tab_container>
-</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_snapshot_inventory.xml b/indra/newview/skins/default/xui/de/panel_snapshot_inventory.xml
new file mode 100644
index 0000000000..10827ce6f2
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/panel_snapshot_inventory.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_snapshot_inventory">
+ <text name="title">
+ In meinem Inventar speichern
+ </text>
+ <text name="hint_lbl">
+ Das Speichern eines Bilds in Ihrem Inventar kostet [UPLOAD_COST] L$. Um das Bild als Textur zu speichern, wählen Sie eines der quadratischen Formate aus.
+ </text>
+ <combo_box label="Auflösung" name="texture_size_combo">
+ <combo_box.item label="Aktuelles Fenster" name="CurrentWindow"/>
+ <combo_box.item label="Klein (128x128)" name="Small(128x128)"/>
+ <combo_box.item label="Mittel (256x256)" name="Medium(256x256)"/>
+ <combo_box.item label="Groß (512x512)" name="Large(512x512)"/>
+ <combo_box.item label="Benutzerdefiniert" name="Custom"/>
+ </combo_box>
+ <spinner label="Breite" name="inventory_snapshot_width"/>
+ <spinner label="Höhe" name="inventory_snapshot_height"/>
+ <check_box label="Seitenverhältnis beibehalten" name="inventory_keep_aspect_check"/>
+ <button label="Abbrechen" name="cancel_btn"/>
+ <button label="Speichern" name="save_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_snapshot_local.xml b/indra/newview/skins/default/xui/de/panel_snapshot_local.xml
new file mode 100644
index 0000000000..3aeae80388
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/panel_snapshot_local.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_snapshot_local">
+ <text name="title">
+ Auf meinem Computer speichern
+ </text>
+ <combo_box label="Auflösung" name="local_size_combo">
+ <combo_box.item label="Aktuelles Fenster" name="CurrentWindow"/>
+ <combo_box.item label="320x240" name="320x240"/>
+ <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="1280x1024" name="1280x1024"/>
+ <combo_box.item label="1600x1200" name="1600x1200"/>
+ <combo_box.item label="Benutzerdefiniert" name="Custom"/>
+ </combo_box>
+ <layout_stack name="local_image_params_ls">
+ <layout_panel name="local_image_size_lp">
+ <spinner label="Breite" name="local_snapshot_width"/>
+ <spinner label="Höhe" name="local_snapshot_height"/>
+ <check_box label="Seitenverhältnis beibehalten" name="local_keep_aspect_check"/>
+ </layout_panel>
+ <layout_panel name="local_image_format_quality_lp">
+ <combo_box label="Format" name="local_format_combo">
+ <combo_box.item label="PNG (verlustfrei)" name="PNG"/>
+ <combo_box.item label="JPEG" name="JPEG"/>
+ <combo_box.item label="BMP (verlustfrei)" name="BMP"/>
+ </combo_box>
+ <slider label="Bildqualität" name="image_quality_slider"/>
+ <text name="image_quality_level">
+ ([QLVL])
+ </text>
+ </layout_panel>
+ </layout_stack>
+ <button label="Abbrechen" name="cancel_btn"/>
+ <flyout_button label="Speichern" name="save_btn" tool_tip="Bild als Datei speichern">
+ <flyout_button.item label="Speichern" name="save_item"/>
+ <flyout_button.item label="Speichern unter..." name="saveas_item"/>
+ </flyout_button>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_snapshot_options.xml b/indra/newview/skins/default/xui/de/panel_snapshot_options.xml
new file mode 100644
index 0000000000..e1d8a5dc6d
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/panel_snapshot_options.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_snapshot_options">
+ <button label="In meinem Profil posten" name="save_to_profile_btn"/>
+ <button label="E-Mail" name="save_to_email_btn"/>
+ <button label="In meinem Inventar speichern ([AMOUNT] L$)" name="save_to_inventory_btn"/>
+ <button label="Auf meinem Computer speichern" name="save_to_computer_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_snapshot_postcard.xml b/indra/newview/skins/default/xui/de/panel_snapshot_postcard.xml
new file mode 100644
index 0000000000..c9afe86d7f
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/panel_snapshot_postcard.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_snapshot_postcard">
+ <string name="default_subject">
+ Postkarte aus [SECOND_LIFE].
+ </string>
+ <string name="default_message">
+ Sehen Sie mal!
+ </string>
+ <string name="upload_message">
+ Senden...
+ </string>
+ <text name="title">
+ E-Mail
+ </text>
+ <button label="Nachricht" name="message_btn"/>
+ <button label="Einstellungen" name="settings_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_snapshot_profile.xml b/indra/newview/skins/default/xui/de/panel_snapshot_profile.xml
new file mode 100644
index 0000000000..8d1c52dea8
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/panel_snapshot_profile.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_snapshot_profile">
+ <text name="title">
+ In meinem Profil posten
+ </text>
+ <combo_box label="Auflösung" name="profile_size_combo">
+ <combo_box.item label="Aktuelles Fenster" 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="Benutzerdefiniert" name="Custom"/>
+ </combo_box>
+ <layout_stack name="profile_image_params_ls">
+ <layout_panel name="profile_image_size_lp">
+ <spinner label="Breite" name="profile_snapshot_width"/>
+ <spinner label="Höhe" name="profile_snapshot_height"/>
+ <check_box label="Seitenverhältnis beibehalten" name="profile_keep_aspect_check"/>
+ </layout_panel>
+ <layout_panel name="profile_image_metadata_lp">
+ <text name="caption_label">
+ Bildunterschrift:
+ </text>
+ <check_box initial_value="true" label="Ort einschließen" name="add_location_cb"/>
+ </layout_panel>
+ </layout_stack>
+ <button label="Abbrechen" name="cancel_btn"/>
+ <button label="Posten" name="post_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_status_bar.xml b/indra/newview/skins/default/xui/de/panel_status_bar.xml
index e9de350ee7..2493d60df6 100644
--- a/indra/newview/skins/default/xui/de/panel_status_bar.xml
+++ b/indra/newview/skins/default/xui/de/panel_status_bar.xml
@@ -18,11 +18,8 @@
<panel name="balance_bg">
<text name="balance" tool_tip="Klicken, um L$-Guthaben zu aktualisieren" value="20 L$"/>
<button label="L$ kaufen" name="buyL" tool_tip="Hier klicken, um mehr L$ zu kaufen"/>
+ <button label="Einkaufen" name="goShop" tool_tip="Second Life-Marktplatz öffnen" width="85"/>
</panel>
- <combo_box name="mode_combo" tool_tip="Wählen Sie den gewünschten Modus aus. Basismodus: Second Life schnell und einfach erkunden und chatten. Erweiterter Modus: Zugriff auf zusätzliche Funktionen.">
- <combo_box.item label="Basismodus" name="Basic"/>
- <combo_box.item label="Erweiterter Modus" name="Advanced"/>
- </combo_box>
<text name="TimeText" tool_tip="Aktuelle Zeit (Pazifik)">
24:00 H PST
</text>
diff --git a/indra/newview/skins/default/xui/de/strings.xml b/indra/newview/skins/default/xui/de/strings.xml
index 435f3494b0..14e9fcdb7f 100644
--- a/indra/newview/skins/default/xui/de/strings.xml
+++ b/indra/newview/skins/default/xui/de/strings.xml
@@ -128,7 +128,7 @@
Die Zertifikatsunterschrift des Gridservers konnte nicht bestätigt werden. Bitte kontaktieren Sie Ihren Grid-Administrator.
</string>
<string name="LoginFailedNoNetwork">
- Netzwerk Fehler: Eine Verbindung konnte nicht hergestellt werden. Bitte überprüfen Sie Ihre Netzwerkverbindung.
+ Netzwerkfehler: Verbindung konnte nicht hergestellt werden. Bitte überprüfen Sie Ihre Netzwerkverbindung.
</string>
<string name="LoginFailed">
Anmeldung fehlgeschlagen
@@ -1214,7 +1214,7 @@ Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden.
Sie haben keine Kopie dieser Textur in Ihrem Inventar.
</string>
<string name="InventoryInboxNoItems">
- Objekte, die auf dem Marktplatz gekauft wurden, werden hierher geliefert.
+ Wenn Sie einen Artikel kaufen oder anderweitig erhalten, erscheint er hier, damit Sie ihn in einen Ordner in Ihrem Inventar ziehen bzw. löschen können, wenn Sie ihn nicht behalten möchten.
</string>
<string name="MarketplaceURL">
http://marketplace.[DOMAIN_NAME]
@@ -1276,6 +1276,9 @@ Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden.
<string name="Marketplace Error Internal Import">
Fehler: Bei diesem Artikel ist ein Problem aufgetreten. Versuchen Sie es später erneut.
</string>
+ <string name="Open landmarks">
+ Landmarken öffnen
+ </string>
<string name="no_transfer" value=" (kein Transferieren)"/>
<string name="no_modify" value=" (kein Bearbeiten)"/>
<string name="no_copy" value=" (kein Kopieren)"/>
@@ -1409,6 +1412,9 @@ Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden.
<string name="no_attachments">
Keine Anhänge getragen
</string>
+ <string name="Attachments remain">
+ Anhänge (noch [COUNT] Positionen frei)
+ </string>
<string name="Buy">
Kaufen
</string>
@@ -1535,6 +1541,12 @@ Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden.
<string name="Right Pec">
Rechts
</string>
+ <string name="Neck">
+ Hals
+ </string>
+ <string name="Avatar Center">
+ Avatar-Mitte
+ </string>
<string name="Invalid Attachment">
Ungültige Stelle für Anhang
</string>
@@ -4027,6 +4039,18 @@ Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich bitte an [SUPPORT_
<string name="you_paid_ldollars_no_name">
Sie haben [REASON] [AMOUNT] L$ bezahlt.
</string>
+ <string name="you_paid_failure_ldollars">
+ Sie haben [NAME] [AMOUNT] L$ [REASON] nicht bezahlt.
+ </string>
+ <string name="you_paid_failure_ldollars_no_info">
+ Sie haben [AMOUNT] L$ nicht bezahlt.
+ </string>
+ <string name="you_paid_failure_ldollars_no_reason">
+ Sie haben [NAME] [AMOUNT] L$ nicht bezahlt.
+ </string>
+ <string name="you_paid_failure_ldollars_no_name">
+ Sie haben [AMOUNT] L$ [REASON] nicht bezahlt.
+ </string>
<string name="for item">
für [ITEM]
</string>
@@ -4254,7 +4278,7 @@ Missbrauchsbericht
<string name="Female - Wow">
Weiblich - Wow
</string>
- <string name="/bow1">
+ <string name="/bow">
/verbeugen
</string>
<string name="/clap">
@@ -4437,6 +4461,12 @@ Setzen Sie den Editorpfad in Anführungszeichen
<string name="ExternalEditorFailedToRun">
Externer Editor konnte nicht ausgeführt werden.
</string>
+ <string name="TranslationFailed">
+ Übersetzung fehlgeschlagen: [REASON]
+ </string>
+ <string name="TranslationResponseParseError">
+ Fehler beim Parsen der Übersetzungsantwort.
+ </string>
<string name="Esc">
Esc
</string>
@@ -4767,4 +4797,196 @@ Setzen Sie den Editorpfad in Anführungszeichen
<string name="ParticleHiding">
Partikel werden ausgeblendet
</string>
+ <string name="Command_AboutLand_Label">
+ Landinformationen
+ </string>
+ <string name="Command_Appearance_Label">
+ Aussehen
+ </string>
+ <string name="Command_Avatar_Label">
+ Avatar
+ </string>
+ <string name="Command_Build_Label">
+ Bauen
+ </string>
+ <string name="Command_Chat_Label">
+ Chat
+ </string>
+ <string name="Command_Compass_Label">
+ Kompass
+ </string>
+ <string name="Command_Destinations_Label">
+ Ziele
+ </string>
+ <string name="Command_Gestures_Label">
+ Gesten
+ </string>
+ <string name="Command_HowTo_Label">
+ Infos
+ </string>
+ <string name="Command_Inventory_Label">
+ Inventar
+ </string>
+ <string name="Command_Map_Label">
+ Karte
+ </string>
+ <string name="Command_Marketplace_Label">
+ Marktplatz
+ </string>
+ <string name="Command_MiniMap_Label">
+ Minikarte
+ </string>
+ <string name="Command_Move_Label">
+ Gehen / Rennen / Fliegen
+ </string>
+ <string name="Command_People_Label">
+ Leute
+ </string>
+ <string name="Command_Picks_Label">
+ Auswahlen
+ </string>
+ <string name="Command_Places_Label">
+ Orte
+ </string>
+ <string name="Command_Preferences_Label">
+ Einstellungen
+ </string>
+ <string name="Command_Profile_Label">
+ Profil
+ </string>
+ <string name="Command_Search_Label">
+ Suchen
+ </string>
+ <string name="Command_Snapshot_Label">
+ Foto
+ </string>
+ <string name="Command_Speak_Label">
+ Sprechen
+ </string>
+ <string name="Command_View_Label">
+ Kamerasteuerungen
+ </string>
+ <string name="Command_Voice_Label">
+ Voice-Einstellungen
+ </string>
+ <string name="Command_AboutLand_Tooltip">
+ Informationen zu dem von Ihnen besuchten Land
+ </string>
+ <string name="Command_Appearance_Tooltip">
+ Avatar ändern
+ </string>
+ <string name="Command_Avatar_Tooltip">
+ Kompletten Avatar auswählen
+ </string>
+ <string name="Command_Build_Tooltip">
+ Objekte bauen und Terrain umformen
+ </string>
+ <string name="Command_Chat_Tooltip">
+ Mit Leuten in der Nähe chatten
+ </string>
+ <string name="Command_Compass_Tooltip">
+ Kompass
+ </string>
+ <string name="Command_Destinations_Tooltip">
+ Ziele von Interesse
+ </string>
+ <string name="Command_Gestures_Tooltip">
+ Gesten für Ihren Avatar
+ </string>
+ <string name="Command_HowTo_Tooltip">
+ Wie führe ich gängige Aufgaben aus?
+ </string>
+ <string name="Command_Inventory_Tooltip">
+ Ihr Eigentum anzeigen und benutzen
+ </string>
+ <string name="Command_Map_Tooltip">
+ Weltkarte
+ </string>
+ <string name="Command_Marketplace_Tooltip">
+ Einkaufen gehen
+ </string>
+ <string name="Command_MiniMap_Tooltip">
+ Leute in der Nähe anzeigen
+ </string>
+ <string name="Command_Move_Tooltip">
+ Ihren Avatar bewegen
+ </string>
+ <string name="Command_People_Tooltip">
+ Freunde, Gruppen und Leute in der Nähe
+ </string>
+ <string name="Command_Picks_Tooltip">
+ Orte, die in Ihrem Profil als Favoriten angezeigt werden sollen
+ </string>
+ <string name="Command_Places_Tooltip">
+ Von Ihnen gespeicherte Orte
+ </string>
+ <string name="Command_Preferences_Tooltip">
+ Einstellungen
+ </string>
+ <string name="Command_Profile_Tooltip">
+ Ihr Profil bearbeiten oder anzeigen
+ </string>
+ <string name="Command_Search_Tooltip">
+ Orte, Veranstaltungen, Leute finden
+ </string>
+ <string name="Command_Snapshot_Tooltip">
+ Foto aufnehmen
+ </string>
+ <string name="Command_Speak_Tooltip">
+ Über Ihr Mikrofon mit Leuten in der Nähe sprechen
+ </string>
+ <string name="Command_View_Tooltip">
+ Kamerawinkel ändern
+ </string>
+ <string name="Command_Voice_Tooltip">
+ Lautstärkeregler für Anrufe und Leute in Ihrer Nähe in SL
+ </string>
+ <string name="Toolbar_Bottom_Tooltip">
+ gegenwärtig in der unteren Symbolleiste
+ </string>
+ <string name="Toolbar_Left_Tooltip">
+ gegenwärtig in der linken Symbolleiste
+ </string>
+ <string name="Toolbar_Right_Tooltip">
+ gegenwärtig in der rechten Symbolleiste
+ </string>
+ <string name="Retain%">
+ % zurückbehalten
+ </string>
+ <string name="Detail">
+ Details
+ </string>
+ <string name="Better Detail">
+ Bessere Details
+ </string>
+ <string name="Surface">
+ Oberfläche
+ </string>
+ <string name="Solid">
+ Fest
+ </string>
+ <string name="Wrap">
+ Wickeln
+ </string>
+ <string name="Preview">
+ Vorschau
+ </string>
+ <string name="Normal">
+ Normal
+ </string>
+ <string name="snapshot_quality_very_low">
+ Sehr niedrig
+ </string>
+ <string name="snapshot_quality_low">
+ Niedrig
+ </string>
+ <string name="snapshot_quality_medium">
+ Mittel
+ </string>
+ <string name="snapshot_quality_high">
+ Hoch
+ </string>
+ <string name="snapshot_quality_very_high">
+ Sehr hoch
+ </string>
</strings>
diff --git a/indra/newview/skins/default/xui/de/teleport_strings.xml b/indra/newview/skins/default/xui/de/teleport_strings.xml
index 69c952c532..9cf381bacc 100644
--- a/indra/newview/skins/default/xui/de/teleport_strings.xml
+++ b/indra/newview/skins/default/xui/de/teleport_strings.xml
@@ -20,6 +20,10 @@ Wenn der Teleport dann immer noch nicht funktioniert, melden Sie sich bitte ab u
Das System konnte keine Teleport-Verbindung herstellen.
Versuchen Sie es später noch einmal.
</message>
+ <message name="NoHelpIslandTP">
+ Sie können nicht zurück nach Welcome Island teleportieren.
+Gehen Sie zu „Welcome Island Public“, um das Tutorial zu wiederholen.
+ </message>
<message name="noaccess_tport">
Sie haben leider keinen Zugang zu diesem Teleport-Ziel.
</message>
diff --git a/indra/newview/skins/default/xui/en/floater_about.xml b/indra/newview/skins/default/xui/en/floater_about.xml
index 3dd394bac1..c7e9ec781d 100644
--- a/indra/newview/skins/default/xui/en/floater_about.xml
+++ b/indra/newview/skins/default/xui/en/floater_about.xml
@@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater
+ open_positioning="centered"
legacy_header_height="18"
height="440"
layout="topleft"
@@ -23,7 +24,7 @@ Built with [COMPILER] version [COMPILER_VERSION]
name="AboutPosition">
You are at [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1] in [REGION] located at &lt;nolink&gt;[HOSTNAME]&lt;/nolink&gt; ([HOSTIP])
[SERVER_VERSION]
-[[SERVER_RELEASE_NOTES_URL] [ReleaseNotes]]
+[SERVER_RELEASE_NOTES_URL]
</floater.string>
<!-- *NOTE: Do not translate text like GPU, Graphics Card, etc -
@@ -59,6 +60,10 @@ Voice Server Version: [VOICE_VERSION]
name="AboutTraffic">
Packets Lost: [PACKETS_LOST,number,0]/[PACKETS_IN,number,0] ([PACKETS_PCT,number,1]%)
</floater.string>
+<floater.string
+ name="ErrorFetchingServerReleaseNotesURL">
+Error fetching server release notes URL.
+</floater.string>
<tab_container
follows="all"
top="25"
@@ -191,34 +196,36 @@ Dummy Name replaced at run time
top="5"
width="435"
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
-SDL Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga
-SSLeay Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
-xmlrpc-epi Copyright (C) 2000 Epinions, Inc.
-zlib Copyright (C) 1995-2002 Jean-loup Gailly and Mark Adler.
-google-perftools Copyright (c) 2005, Google Inc.
+ 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
+ SDL Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga
+ SSLeay Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
+ xmlrpc-epi Copyright (C) 2000 Epinions, Inc.
+ zlib Copyright (C) 1995-2002 Jean-loup Gailly and Mark Adler.
+ google-perftools Copyright (c) 2005, Google Inc.
+
+ Second Life Viewer uses Havok (TM) Physics. (c)Copyright 1999-2010 Havok.com Inc. (and its Licensors). All Rights Reserved. See www.havok.com for details.
-Second Life Viewer uses Havok (TM) Physics. (c)Copyright 1999-2010 Havok.com Inc. (and its Licensors). All Rights Reserved. See www.havok.com for details.
+ This software contains source code provided by NVIDIA Corporation.
-All rights reserved. See licenses.txt for details.
+ All rights reserved. See licenses.txt for details.
-Voice chat Audio coding: Polycom(R) Siren14(TM) (ITU-T Rec. G.722.1 Annex C)
- </text_editor>
+ Voice chat Audio coding: Polycom(R) Siren14(TM) (ITU-T Rec. G.722.1 Annex C)
+ </text_editor>
</panel>
</tab_container>
</floater>
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 e5dcc9bcb5..1d5a6740b7 100644
--- a/indra/newview/skins/default/xui/en/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/en/floater_about_land.xml
@@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater
+ open_positioning="cascading"
can_tear_off="false"
height="420"
layout="topleft"
@@ -486,7 +487,7 @@
name="DwellText"
top_delta="0"
width="186">
- 0
+ Loading...
</text>
<button
@@ -1205,10 +1206,6 @@ Only large parcels can be listed in search.
name="push_restrict_region_text">
No Pushing (Region Override)
</panel.string>
- <panel.string
- name="see_avs_text">
- See and chat with residents on this parcel
- </panel.string>
<text
type="string"
length="1"
@@ -1222,30 +1219,33 @@ Only large parcels can be listed in search.
width="278">
Allow other Residents to:
</text>
- <check_box
- height="16"
- label="Edit Terrain"
- layout="topleft"
- left="14"
- name="edit land check"
- tool_tip="If checked, anyone can terraform your land. It is best to leave this unchecked, as you can always edit your own land."
- top_pad="4"
- width="147i" />
- <check_box
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ left="20"
+ name="allow_label0"
+ width="150">
+ Fly:
+ </text>
+
+ <check_box
height="16"
- label="Fly"
+ label="Everyone"
layout="topleft"
name="check fly"
tool_tip="If checked, Residents can fly on your land. If unchecked, they can only fly into and over your land."
- left_pad="4"
- width="150" />
+ left_pad="2"
+ width="130" />
<text
type="string"
length="1"
follows="left|top"
height="16"
layout="topleft"
- left="14"
+ left="20"
name="allow_label2"
width="150">
Build:
@@ -1270,7 +1270,7 @@ Only large parcels can be listed in search.
follows="left|top"
height="16"
layout="topleft"
- left="14"
+ left="20"
name="allow_label3"
width="150">
Object Entry:
@@ -1297,7 +1297,7 @@ Only large parcels can be listed in search.
follows="left|top"
height="16"
layout="topleft"
- left="14"
+ left="20"
name="allow_label4"
width="150">
Run Scripts:
@@ -1318,49 +1318,47 @@ Only large parcels can be listed in search.
name="check group scripts"
top_delta="0"
width="70" />
- <text
- type="string"
- text_color="white"
- length="1"
- follows="left|top"
- height="16"
- layout="topleft"
- left="10"
- name="land_options_label"
- width="278">
- Land Options:
- </text>
- <check_box
+ <panel
+ bevel_style="none"
+ border="true"
+ top="146"
+ bottom="146"
+ follows="left|bottom|right"
+ left="20"
+ right="-20"/>
+ <check_box
height="16"
label="Safe (no damage)"
layout="topleft"
- left="14"
+ left="18"
name="check safe"
tool_tip="If checked, sets the land to Safe, disabling damage combat. If cleared, damage combat is enabled."
- top_pad="5"
+ top="130"
width="200" />
<check_box
height="16"
label="No Pushing"
layout="topleft"
- left_pad="5"
+ left_pad="35"
name="PushRestrictCheck"
tool_tip="Prevents scripts from pushing. Checking this option may be useful for preventing disruptive behavior on your land."
- top_delta="0"
+ top="130"
width="119" />
<check_box
height="16"
label="Show Place in Search (L$30/week)"
layout="topleft"
- left="14"
+ left="18"
name="ShowDirectoryCheck"
tool_tip="Let people see this parcel in search results"
+ top="150"
width="430" />
<combo_box
enabled="false"
height="23"
layout="topleft"
- left="30"
+ left="20"
+ top="194"
name="land category with adult"
visible="false"
width="140">
@@ -1425,7 +1423,8 @@ Only large parcels can be listed in search.
enabled="false"
height="23"
layout="topleft"
- left="30"
+ left="20"
+ top="194"
name="land category"
visible="false"
width="140">
@@ -1486,11 +1485,11 @@ Only large parcels can be listed in search.
height="16"
label="Moderate Content"
layout="topleft"
- left="14"
+ left="18"
name="MatureCheck"
- top="177"
+ top="170"
label_text.valign="center"
- label_text.v_pad="-5"
+ label_text.v_pad="-1"
tool_tip=" "
width="200" />
<text
@@ -1499,18 +1498,19 @@ Only large parcels can be listed in search.
follows="left|top"
height="16"
layout="topleft"
- left="10"
+ left="20"
name="Snapshot:"
text_color="white"
- top="220"
+ top="225"
width="200">
Snapshot:
</text>
<texture_picker
follows="left|top"
+ top_pad="0"
height="150"
layout="topleft"
- left="14"
+ left="20"
name="snapshot_ctrl"
fallback_image="default_land_picture.j2c"
tool_tip="Click to choose a picture"
@@ -1519,32 +1519,33 @@ Only large parcels can be listed in search.
type="string"
length="1"
follows="left|top"
- text_color="white"
- height="16"
+ text_color="LtGray"
+ height="32"
layout="topleft"
- left="230"
- top="174"
+ left="274"
+ top="150"
name="allow_label5"
- width="278">
- Allow Residents on other parcels to:
+ width="205"
+ wrap="true">
+ Avatars on other parcels can see and chat with avatars on this parcel
</text>
<check_box
height="16"
- label="See Avatars"
follows="top"
layout="topleft"
- left="230"
+ left="253"
+ top="150"
name="SeeAvatarsCheck"
- tool_tip="Allows residents on other parcels to see and chat with residents on this parcel, and you to see and chat with them."
- width="120" />
+ tool_tip="Allows avatars on other parcels to see and chat with avatars on this parcel, and you to see and chat with them."
+ width="10" />
<text
type="string"
length="1"
follows="left|top"
height="16"
layout="topleft"
- left="230"
- top="230"
+ left="255"
+ top="282"
text_color="white"
name="landing_point"
word_wrap="true"
@@ -1553,12 +1554,13 @@ Only large parcels can be listed in search.
</text>
<button
follows="right|top"
+ top_pad="0"
height="23"
label="Set"
label_selected="Set"
layout="topleft"
name="Set"
- left="230"
+ left="255"
tool_tip="Sets the landing point where visitors arrive. Sets to your avatar&apos;s location inside this parcel."
width="50" />
<button
@@ -1578,7 +1580,7 @@ Only large parcels can be listed in search.
follows="left|top"
height="16"
layout="topleft"
- left="230"
+ left="255"
top_pad="10"
name="Teleport Routing: "
width="200">
@@ -1588,7 +1590,7 @@ Only large parcels can be listed in search.
height="23"
layout="topleft"
name="landing type"
- top_pad="3"
+ top_pad="0"
tool_tip="Teleport Routing -- select how to handle teleports onto your land"
width="120">
<combo_box.item
@@ -1949,36 +1951,18 @@ Only large parcels can be listed in search.
name="access_estate_defined">
(Defined by the Estate)
</panel.string>
- <panel.string
- name="allow_public_access">
- Allow Public Access ([MATURITY]) (Note: Unchecking this will create ban lines)
- </panel.string>
<panel.string
name="estate_override">
One or more of these options is set at the estate level
</panel.string>
- <text
- type="string"
- length="1"
- follows="left|top"
- height="16"
- layout="topleft"
- left="10"
- name="Limit access to this parcel to:"
- text_color="White"
- top="10"
- width="400">
- Access To This Parcel
- </text>
<check_box
follows="top|left"
height="16"
layout="topleft"
- left_delta="0"
+ left="8"
name="public_access"
- top_pad="5"
- label_text.valign="center"
- label_text.v_pad="-2"
+ label="Allow Public Access (Unchecking this will create ban lines)"
+ top_pad="10"
width="278" />
<text
type="string"
@@ -1988,28 +1972,28 @@ Only large parcels can be listed in search.
layout="topleft"
left_delta="20"
name="Only Allow"
- top="49"
+ top="30"
width="325">
- Restrict Access to Residents verified by:
+ Allow access only to Residents who:
</text>
<check_box
follows="top|left"
height="16"
- label="Payment Information on File [ESTATE_PAYMENT_LIMIT]"
+ label="Have payment Information on File [ESTATE_PAYMENT_LIMIT]"
layout="topleft"
left_delta="0"
name="limit_payment"
- tool_tip="Ban unidentified Residents."
+ tool_tip="Residents must have payment information on file to access this parcel. See the [SUPPORT_SITE] for more information."
top_pad="4"
width="278" />
<check_box
follows="top|left"
height="16"
- label="Age Verification [ESTATE_AGE_LIMIT]"
+ label="Have been age-verified [ESTATE_AGE_LIMIT]"
layout="topleft"
left_delta="0"
name="limit_age_verified"
- tool_tip="Ban Residents who have not verified their age. See the [SUPPORT_SITE] for more information."
+ tool_tip="Residents must be age verified to access this parcel. See the [SUPPORT_SITE] for more information."
top_pad="4"
width="278" />
<check_box
@@ -2019,7 +2003,7 @@ Only large parcels can be listed in search.
left="8"
name="GroupCheck"
tool_tip="Set group in the General tab."
- top="109"
+ top="89"
width="278" />
<check_box
enabled="false"
diff --git a/indra/newview/skins/default/xui/en/floater_activeim.xml b/indra/newview/skins/default/xui/en/floater_activeim.xml
index 96fe0aa70c..b79c5d9a19 100644
--- a/indra/newview/skins/default/xui/en/floater_activeim.xml
+++ b/indra/newview/skins/default/xui/en/floater_activeim.xml
@@ -4,11 +4,8 @@
name="floater_activeim"
help_topic="floater_activeim"
title="ACTIVE IM"
- top="26"
- left="0"
height="22"
width="320"
- follows="right|bottom"
background_visible="true"
can_close="true"
can_dock="true"
diff --git a/indra/newview/skins/default/xui/en/floater_avatar.xml b/indra/newview/skins/default/xui/en/floater_avatar.xml
new file mode 100644
index 0000000000..82c3403008
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_avatar.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<floater
+ open_positioning="cascading"
+ ignore_ui_scale="false"
+ legacy_header_height="225"
+ can_minimize="true"
+ can_close="true"
+ can_resize="true"
+ min_height="230"
+ min_width="450"
+ height="230"
+ layout="topleft"
+ name="Avatar"
+ single_instance="true"
+ help_topic="avatar"
+ save_rect="true"
+ save_visibility="true"
+ title="CHOOSE AN AVATAR"
+ width="700">
+ <web_browser
+ top="25"
+ height="200"
+ width="700"
+ follows="all"
+ name="avatar_picker_contents"
+ trusted_content="true"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_avatar_picker.xml b/indra/newview/skins/default/xui/en/floater_avatar_picker.xml
index a11946d352..cbbbeb6094 100644
--- a/indra/newview/skins/default/xui/en/floater_avatar_picker.xml
+++ b/indra/newview/skins/default/xui/en/floater_avatar_picker.xml
@@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater
+ open_positioning="cascading"
legacy_header_height="18"
can_resize="true"
height="350"
diff --git a/indra/newview/skins/default/xui/en/floater_build_options.xml b/indra/newview/skins/default/xui/en/floater_build_options.xml
index c247a12e7a..35918e9705 100644
--- a/indra/newview/skins/default/xui/en/floater_build_options.xml
+++ b/indra/newview/skins/default/xui/en/floater_build_options.xml
@@ -1,7 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater
legacy_header_height="18"
- follows="right"
height="198"
layout="topleft"
name="build options floater"
@@ -37,7 +36,7 @@
layout="topleft"
left="10"
tool_tip="Grid opacity"
- name="grid_opacity_label"
+ name="grid_mode_label"
top_pad="30"
width="123">
Mode
diff --git a/indra/newview/skins/default/xui/en/floater_buy_currency.xml b/indra/newview/skins/default/xui/en/floater_buy_currency.xml
index 49ca6cc8ba..6afa24d04a 100644
--- a/indra/newview/skins/default/xui/en/floater_buy_currency.xml
+++ b/indra/newview/skins/default/xui/en/floater_buy_currency.xml
@@ -224,7 +224,7 @@
width="300"
height="30"
name="currency_links">
- [http://www.secondlife.com/my/account/payment_method_management.php payment method] | [http://www.secondlife.com/my/account/currency.php currency] | [http://www.secondlife.com/my/account/exchange_rates.php exchange rate]
+ [http://www.secondlife.com/my/account/payment_method_management.php payment method] | [http://www.secondlife.com/my/account/currency.php currency]
</text>
<text
type="string"
diff --git a/indra/newview/skins/default/xui/en/floater_buy_currency_html.xml b/indra/newview/skins/default/xui/en/floater_buy_currency_html.xml
index b9c415633f..0637eedfb2 100644
--- a/indra/newview/skins/default/xui/en/floater_buy_currency_html.xml
+++ b/indra/newview/skins/default/xui/en/floater_buy_currency_html.xml
@@ -23,6 +23,5 @@
right="-1"
top="1"
bottom="-1"
- ignore_ui_scale="false"
name="browser"/>
</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_camera.xml b/indra/newview/skins/default/xui/en/floater_camera.xml
index da2be18db6..4673c6def5 100644
--- a/indra/newview/skins/default/xui/en/floater_camera.xml
+++ b/indra/newview/skins/default/xui/en/floater_camera.xml
@@ -1,18 +1,20 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater
+ open_positioning="specified"
+ specified_left="458"
+ specified_bottom="80"
legacy_header_height="18"
- can_dock="true"
can_minimize="true"
- can_close="false"
- follows="bottom"
+ can_close="true"
height="164"
layout="topleft"
name="camera_floater"
help_topic="camera_floater"
- save_rect="true"
save_visibility="true"
- save_dock_state="true"
single_instance="true"
+ title="CAMERA CONTROLS"
+ chrome="true"
+ save_rect="true"
width="228">
<floater.string
name="rotate_tooltip">
@@ -27,18 +29,6 @@
Move Camera Up and Down, Left and Right
</floater.string>
<floater.string
- name="camera_modes_title">
- Camera modes
- </floater.string>
- <floater.string
- name="pan_mode_title">
- Orbit Zoom Pan
- </floater.string>
- <floater.string
- name="presets_mode_title">
- Preset Views
- </floater.string>
- <floater.string
name="free_mode_title">
View Object
</floater.string>
@@ -164,14 +154,10 @@
<joystick_rotate
follows="top|left"
height="78"
- image_selected="Cam_Rotate_In"
- image_unselected="Cam_Rotate_Out"
layout="topleft"
left="7"
- mouse_opaque="false"
name="cam_rotate_stick"
quadrant="left"
- scale_image="false"
sound_flags="3"
visible="true"
tool_tip="Orbit camera around focus"
diff --git a/indra/newview/skins/default/xui/en/floater_chat_bar.xml b/indra/newview/skins/default/xui/en/floater_chat_bar.xml
new file mode 100644
index 0000000000..63992462b3
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_chat_bar.xml
@@ -0,0 +1,84 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<floater
+ open_positioning="specified"
+ specified_left="10"
+ specified_bottom="10"
+ height="60"
+ layout="topleft"
+ legacy_header_height="25"
+ single_instance="true"
+ title="NEARBY CHAT"
+ save_rect="true"
+ save_visibility="true"
+ can_close="true"
+ can_minimize="true"
+ help_topic="chat_bar"
+ min_height="60"
+ min_width="150"
+ can_resize="true"
+ default_tab_group="1"
+ name="chat_bar"
+ width="300">
+ <panel
+ top="20"
+ class="panel_nearby_chat"
+ follow="all"
+ width="300"
+ height="0"
+ visible="false"
+ filename="panel_nearby_chat.xml"
+ name="nearby_chat" />
+ <panel width="300"
+ height="31"
+ left="0"
+ name="bottom_panel"
+ bottom="-1"
+ follows="left|right|bottom"
+ tab_group="1">
+ <line_editor
+ border_style="line"
+ border_thickness="1"
+ follows="left|right"
+ height="23"
+ label="Click here to chat."
+ layout="topleft"
+ left_delta="7"
+ left="0"
+ max_length_bytes="1023"
+ name="chat_box"
+ text_pad_left="5"
+ text_pad_right="25"
+ tool_tip="Press Enter to say, Ctrl+Enter to shout"
+ top="2"
+ width="255" />
+ <output_monitor
+ auto_update="true"
+ follows="right"
+ draw_border="false"
+ height="16"
+ layout="topleft"
+ left_pad="-24"
+ mouse_opaque="true"
+ name="chat_zone_indicator"
+ top="6"
+ visible="true"
+ width="20" />
+ <button
+ follows="right"
+ is_toggle="true"
+ width="20"
+ top="2"
+ layout="topleft"
+ left_pad="12"
+ image_disabled="ComboButton_UpOff"
+ image_unselected="ComboButton_UpOff"
+ image_selected="ComboButton_On"
+ image_pressed="ComboButton_UpSelected"
+ image_pressed_selected="ComboButton_Selected"
+ height="23"
+ chrome="true"
+ name="show_nearby_chat"
+ tool_tip="Shows/hides nearby chat log">
+ </button>
+ </panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_color_picker.xml b/indra/newview/skins/default/xui/en/floater_color_picker.xml
index 421f3a72c6..e06d10606a 100644
--- a/indra/newview/skins/default/xui/en/floater_color_picker.xml
+++ b/indra/newview/skins/default/xui/en/floater_color_picker.xml
@@ -2,7 +2,6 @@
<floater
legacy_header_height="18"
can_minimize="false"
- follows="left|top"
height="380"
layout="topleft"
name="ColorPicker"
diff --git a/indra/newview/skins/default/xui/en/floater_critical.xml b/indra/newview/skins/default/xui/en/floater_critical.xml
index 05c958e051..13b15bf724 100644
--- a/indra/newview/skins/default/xui/en/floater_critical.xml
+++ b/indra/newview/skins/default/xui/en/floater_critical.xml
@@ -6,7 +6,7 @@
height="500"
layout="topleft"
name="modal container"
- open_centered="true"
+ open_positioning="centered"
width="600">
<button
height="20"
diff --git a/indra/newview/skins/default/xui/en/floater_destinations.xml b/indra/newview/skins/default/xui/en/floater_destinations.xml
new file mode 100644
index 0000000000..373114a1eb
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_destinations.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<floater
+ open_positioning="cascading"
+ ignore_ui_scale="false"
+ legacy_header_height="225"
+ can_minimize="true"
+ can_close="true"
+ user_resize="true"
+ can_resize="true"
+ min_height="230"
+ min_width="350"
+ height="230"
+ layout="topleft"
+ name="Destinations"
+ single_instance="true"
+ help_topic="destinations"
+ save_rect="true"
+ save_visibility="true"
+ title="DESTINATIONS"
+ width="840">
+ <web_browser
+ top="25"
+ height="200"
+ width="840"
+ follows="all"
+ name="destination_guide_contents"
+ trusted_content="true"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_event.xml b/indra/newview/skins/default/xui/en/floater_event.xml
index 7ed020f832..cf61b7d24d 100644
--- a/indra/newview/skins/default/xui/en/floater_event.xml
+++ b/indra/newview/skins/default/xui/en/floater_event.xml
@@ -1,6 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater
- follows="all"
height="400"
can_resize="true"
help_topic="event_details"
diff --git a/indra/newview/skins/default/xui/en/floater_gesture.xml b/indra/newview/skins/default/xui/en/floater_gesture.xml
index 9f5e6828d2..b96a94a849 100644
--- a/indra/newview/skins/default/xui/en/floater_gesture.xml
+++ b/indra/newview/skins/default/xui/en/floater_gesture.xml
@@ -1,5 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater
+ open_positioning="cascading"
+ save_rect="true"
legacy_header_height="18"
can_resize="true"
height="465"
@@ -7,7 +9,6 @@
help_topic="gestures"
title="GESTURES"
background_visible="true"
- follows="all"
label="Places"
layout="topleft"
min_height="350"
diff --git a/indra/newview/skins/default/xui/en/floater_hardware_settings.xml b/indra/newview/skins/default/xui/en/floater_hardware_settings.xml
index 05f4c52b95..66bb9d3cea 100644
--- a/indra/newview/skins/default/xui/en/floater_hardware_settings.xml
+++ b/indra/newview/skins/default/xui/en/floater_hardware_settings.xml
@@ -35,7 +35,7 @@
height="12"
layout="topleft"
left="10"
- name="Antialiasing:"
+ name="antialiasing label"
top_pad="7"
width="188">
Antialiasing:
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 de6d586f72..cd075abc41 100644
--- a/indra/newview/skins/default/xui/en/floater_help_browser.xml
+++ b/indra/newview/skins/default/xui/en/floater_help_browser.xml
@@ -1,9 +1,8 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater
+ open_positioning="cascading"
legacy_header_height="18"
can_resize="true"
- left="10000"
- bottom="10000"
height="600"
layout="topleft"
min_height="150"
@@ -35,7 +34,6 @@
left_delta="0"
top_delta="0"
name="external_controls"
- user_resize="false"
width="620">
<web_browser
trusted_content="true"
diff --git a/indra/newview/skins/default/xui/en/floater_how_to.xml b/indra/newview/skins/default/xui/en/floater_how_to.xml
new file mode 100644
index 0000000000..8c0077a8cc
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_how_to.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<floater
+ legacy_header_height="18"
+ can_resize="true"
+ can_minimize="true"
+ height="775"
+ layout="topleft"
+ min_height="360"
+ left="10000"
+ top="10"
+ min_width="335"
+ name="floater_how_to"
+ help_topic="how_to"
+ single_instance="true"
+ save_rect="true"
+ title="HOW TO"
+ width="780"
+ filename="floater_web_content.xml"/> \ No newline at end of file
diff --git a/indra/newview/skins/default/xui/en/floater_hud.xml b/indra/newview/skins/default/xui/en/floater_hud.xml
index 99a6a95828..e2d860881a 100644
--- a/indra/newview/skins/default/xui/en/floater_hud.xml
+++ b/indra/newview/skins/default/xui/en/floater_hud.xml
@@ -8,6 +8,7 @@
help_topic="floater_hud"
save_rect="true"
save_visibility="true"
+ chrome="true"
title="TUTORIAL"
width="362">
<web_browser
diff --git a/indra/newview/skins/default/xui/en/floater_im_session.xml b/indra/newview/skins/default/xui/en/floater_im_session.xml
index a371e98322..ca73883e53 100644
--- a/indra/newview/skins/default/xui/en/floater_im_session.xml
+++ b/indra/newview/skins/default/xui/en/floater_im_session.xml
@@ -3,12 +3,10 @@
legacy_header_height="18"
background_visible="true"
default_tab_group="1"
- follows="all"
- height="350"
+ height="355"
+ help_topic="floater_im_box"
layout="topleft"
- left="0"
name="panel_im"
- top="0"
can_dock="false"
can_minimize="true"
can_close="true"
@@ -18,7 +16,7 @@
min_width="250"
min_height="190">
<layout_stack
- animate="false"
+ animate="true"
default_tab_group="2"
follows="all"
height="320"
@@ -34,8 +32,7 @@
min_width="115"
width="150"
height="320"
- auto_resize="false"
- user_resize="false">
+ auto_resize="false">
<panel
name="panel_im_control_panel"
layout="topleft"
diff --git a/indra/newview/skins/default/xui/en/floater_inventory.xml b/indra/newview/skins/default/xui/en/floater_inventory.xml
deleted file mode 100644
index ba2e0d3277..0000000000
--- a/indra/newview/skins/default/xui/en/floater_inventory.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater
- legacy_header_height="18"
- auto_tile="true"
- can_resize="true"
- height="563"
- layout="topleft"
- min_height="150"
- min_width="240"
- name="Inventory"
- help_topic="inventory"
- save_rect="true"
- save_visibility="true"
- single_instance="false"
- title="MY INVENTORY"
- width="467">
- <panel
- bottom="560"
- class="panel_main_inventory"
- filename="panel_main_inventory.xml"
- follows="all"
- layout="topleft"
- left="0"
- label="Inventory Panel"
- name="Inventory Panel"
- top="15"
- width="467" />
-</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_inventory_item_properties.xml b/indra/newview/skins/default/xui/en/floater_inventory_item_properties.xml
index 0cf07926c2..adef066aef 100644
--- a/indra/newview/skins/default/xui/en/floater_inventory_item_properties.xml
+++ b/indra/newview/skins/default/xui/en/floater_inventory_item_properties.xml
@@ -1,7 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater
legacy_header_height="18"
- auto_tile="true"
height="340"
layout="topleft"
name="item properties"
diff --git a/indra/newview/skins/default/xui/en/floater_land_holdings.xml b/indra/newview/skins/default/xui/en/floater_land_holdings.xml
index 0b9ae3c9f3..3737294ebe 100644
--- a/indra/newview/skins/default/xui/en/floater_land_holdings.xml
+++ b/indra/newview/skins/default/xui/en/floater_land_holdings.xml
@@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater
+ open_positioning="centered"
legacy_header_height="18"
height="430"
layout="topleft"
diff --git a/indra/newview/skins/default/xui/en/floater_live_lsleditor.xml b/indra/newview/skins/default/xui/en/floater_live_lsleditor.xml
index 1f192f9b28..5cd7cd196d 100644
--- a/indra/newview/skins/default/xui/en/floater_live_lsleditor.xml
+++ b/indra/newview/skins/default/xui/en/floater_live_lsleditor.xml
@@ -4,7 +4,6 @@
bevel_style="none"
border_style="line"
can_resize="true"
- follows="left|top"
height="580"
layout="topleft"
min_height="271"
diff --git a/indra/newview/skins/default/xui/en/floater_lsl_guide.xml b/indra/newview/skins/default/xui/en/floater_lsl_guide.xml
index c9d87f158f..e9676777f4 100644
--- a/indra/newview/skins/default/xui/en/floater_lsl_guide.xml
+++ b/indra/newview/skins/default/xui/en/floater_lsl_guide.xml
@@ -2,7 +2,6 @@
<floater
legacy_header_height="18"
can_resize="true"
- follows="left|top"
height="400"
layout="topleft"
min_height="271"
diff --git a/indra/newview/skins/default/xui/en/floater_map.xml b/indra/newview/skins/default/xui/en/floater_map.xml
index ae99fa8dd5..3eeebcf120 100644
--- a/indra/newview/skins/default/xui/en/floater_map.xml
+++ b/indra/newview/skins/default/xui/en/floater_map.xml
@@ -1,22 +1,18 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater
- bg_alpha_image_overlay="DkGray_66"
- legacy_header_height="0"
+ open_positioning="cascading"
can_minimize="true"
can_resize="true"
- follows="top|right"
- height="174"
+ chrome="true"
+ height="200"
layout="topleft"
min_height="128"
min_width="128"
name="Map"
- title=""
+ title="MINI-MAP"
help_topic="map"
save_rect="true"
save_visibility="true"
- single_instance="true"
- left="0"
- top="0"
width="200">
<floater.string
name="ToolTipMsg">
@@ -27,17 +23,16 @@
[REGION](Double-click to teleport, shift-drag to pan)
</floater.string>
<floater.string name="mini_map_caption">
- MINIMAP
+ Mini-map
</floater.string>
<net_map
- bg_color="NetMapBackgroundColor"
follows="top|left|bottom|right"
layout="topleft"
left="0"
mouse_opaque="false"
name="Net Map"
width="200"
- height="218"
+ height="200"
top="0"/>
<text
type="string"
@@ -49,7 +44,7 @@
name="floater_map_north"
right="10"
text_color="1 1 1 0.7"
- top="209">
+ top="189">
N
</text>
<text
@@ -62,7 +57,7 @@
name="floater_map_east"
right="10"
text_color="1 1 1 0.7"
- top="209">
+ top="189">
E
</text>
<text
@@ -75,7 +70,7 @@
name="floater_map_west"
right="11"
text_color="1 1 1 0.7"
- top="195">
+ top="175">
W
</text>
<text
@@ -88,7 +83,7 @@
name="floater_map_south"
right="10"
text_color="1 1 1 0.7"
- top="209">
+ top="189">
S
</text>
<text
@@ -101,7 +96,7 @@
name="floater_map_southeast"
right="20"
text_color="1 1 1 0.7"
- top="209">
+ top="189">
SE
</text>
<text
@@ -114,7 +109,7 @@
name="floater_map_northeast"
right="20"
text_color="1 1 1 0.7"
- top="209">
+ top="189">
NE
</text>
<text
@@ -127,7 +122,7 @@
name="floater_map_southwest"
right="20"
text_color="1 1 1 0.7"
- top="209">
+ top="189">
SW
</text>
<text
@@ -140,7 +135,7 @@
name="floater_map_northwest"
right="20"
text_color="1 1 1 0.7"
- top="209">
+ top="189">
NW
</text>
</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_media_browser.xml b/indra/newview/skins/default/xui/en/floater_media_browser.xml
index 5a1f920398..ce788654aa 100644
--- a/indra/newview/skins/default/xui/en/floater_media_browser.xml
+++ b/indra/newview/skins/default/xui/en/floater_media_browser.xml
@@ -9,7 +9,6 @@
name="floater_about"
help_topic="floater_about"
save_rect="true"
- auto_tile="true"
title="MEDIA BROWSER"
width="820">
<floater.string
@@ -38,7 +37,6 @@
min_height="20"
name="nav_controls"
top="400"
- user_resize="false"
width="800">
<button
follows="left|top"
@@ -114,7 +112,6 @@
min_height="20"
name="time_controls"
top_delta="0"
- user_resize="false"
width="800">
<button
follows="left|top"
@@ -172,7 +169,6 @@
min_height="20"
name="parcel_owner_controls"
top_delta="0"
- user_resize="false"
width="540">
<button
enabled="false"
@@ -194,7 +190,6 @@
left_delta="0"
name="external_controls"
top_delta="0"
- user_resize="false"
width="540">
<web_browser
bottom="-30"
diff --git a/indra/newview/skins/default/xui/en/floater_media_settings.xml b/indra/newview/skins/default/xui/en/floater_media_settings.xml
index 681731b0da..0e03c0ab6d 100644
--- a/indra/newview/skins/default/xui/en/floater_media_settings.xml
+++ b/indra/newview/skins/default/xui/en/floater_media_settings.xml
@@ -10,7 +10,6 @@
enabled="true"
width="365"
height="535"
- left="330"
min_height="535"
min_width="365"
mouse_opaque="true"
diff --git a/indra/newview/skins/default/xui/en/floater_mem_leaking.xml b/indra/newview/skins/default/xui/en/floater_mem_leaking.xml
index 28a29c42aa..fb7d09a21e 100644
--- a/indra/newview/skins/default/xui/en/floater_mem_leaking.xml
+++ b/indra/newview/skins/default/xui/en/floater_mem_leaking.xml
@@ -2,7 +2,6 @@
<floater
legacy_header_height="18"
can_minimize="false"
- follows="left|top"
height="175"
layout="topleft"
name="MemLeak"
diff --git a/indra/newview/skins/default/xui/en/floater_merchant_outbox.xml b/indra/newview/skins/default/xui/en/floater_merchant_outbox.xml
new file mode 100644
index 0000000000..6f387f4800
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_merchant_outbox.xml
@@ -0,0 +1,152 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<floater
+ open_positioning="cascading"
+ can_close="true"
+ can_resize="true"
+ height="440"
+ help_topic="floater_merchant_outbox"
+ min_width="300"
+ min_height="200"
+ name="floater_merchant_outbox"
+ save_rect="true"
+ save_visibility="false"
+ reuse_instance="true"
+ title="MERCHANT OUTBOX"
+ width="333">
+ <string name="OutboxFolderCount0"></string>
+ <string name="OutboxFolderCount1">1 folder</string>
+ <string name="OutboxFolderCountN">[NUM] folders</string>
+ <string name="OutboxImporting">Sending folders...</string>
+ <string name="OutboxInitializing">Initializing...</string>
+ <panel
+ follows="all"
+ layout="topleft"
+ left="0"
+ top="0"
+ label=""
+ height="440"
+ width="333">
+ <panel
+ follows="all"
+ left="10"
+ bottom="370"
+ width="313"
+ top="0"
+ bg_opaque_color="InventoryBackgroundColor">
+ <panel
+ name="outbox_inventory_placeholder_panel"
+ follows="all"
+ layout="topleft"
+ top="0"
+ left="0"
+ width="308"
+ height="370"
+ bg_opaque_color="InventoryBackgroundColor">
+ <text
+ name="outbox_inventory_placeholder_title"
+ type="string"
+ follows="top|left|right"
+ layout="topleft"
+ top="10"
+ left="0"
+ width="308"
+ height="25"
+ wrap="true"
+ halign="center"
+ font="SansSerifBold">
+ Loading...
+ </text>
+ <text
+ name="outbox_inventory_placeholder_text"
+ type="string"
+ follows="top|left|right"
+ layout="topleft"
+ top="35"
+ left="0"
+ width="308"
+ height="130"
+ wrap="true"
+ halign="left" />
+ </panel>
+ </panel>
+ <panel
+ follows="bottom|left|right"
+ left="10"
+ bottom="435"
+ width="313"
+ top="370">
+ <panel
+ name="outbox_generic_drag_target"
+ mouse_opaque="false"
+ follows="all"
+ top="5"
+ left="5"
+ width="303"
+ height="25"
+ background_visible="false"
+ bg_alpha_color="EmphasisColor_35"
+ border="true"
+ bevel_style="in"
+ visible="true">
+ <text
+ type="string"
+ follows="all"
+ layout="topleft"
+ top="6"
+ height="20"
+ left="5"
+ width="293"
+ halign="center"
+ font="SansSerifMedium"
+ font_shadow="hard"
+ valign="bottom">
+ Drag items here to create folders
+ </text>
+ </panel>
+ <text
+ name="outbox_folder_count"
+ type="string"
+ follows="all"
+ layout="topleft"
+ top="40"
+ left="5"
+ width="150"
+ height="20"
+ wrap="true"
+ halign="left"
+ valign="bottom"
+ font="SansSerif" />
+ <button
+ label="Send to Marketplace"
+ tool_tip="Push to my Marketplace Storefront"
+ is_toggle="false"
+ name="outbox_import_btn"
+ follows="bottom|right"
+ tab_stop="false"
+ halign="center"
+ top="37"
+ left="160"
+ height="25"
+ width="150"
+ enabled="false" />
+ </panel>
+ <layout_stack name="import_progress_indicator" orientation="vertical" left="0" height="440" top="0" width="333" follows="all" visible="false">
+ <layout_panel />
+ <layout_panel height="24" auto_resize="false">
+ <layout_stack orientation="horizontal" left="0" height="24" top="0" width="333" follows="all">
+ <layout_panel width="0" />
+ <layout_panel width="24" auto_resize="false">
+ <loading_indicator
+ height="24"
+ layout="topleft"
+ left="0"
+ top="0"
+ width="24" />
+ </layout_panel>
+ <layout_panel width="0" />
+ </layout_stack>
+ </layout_panel>
+ <layout_panel />
+ </layout_stack>
+ </panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_model_preview.xml b/indra/newview/skins/default/xui/en/floater_model_preview.xml
index 2eea286c8b..eebc5ddc72 100755..100644
--- a/indra/newview/skins/default/xui/en/floater_model_preview.xml
+++ b/indra/newview/skins/default/xui/en/floater_model_preview.xml
@@ -1,11 +1,12 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater can_close="true" can_drag_on_left="false" can_minimize="false"
can_resize="false" height="480" min_height="480" min_width="940"
- name="Model Preview" title="Upload Model" width="940"
+ name="Model Preview" title="UPLOAD MODEL" width="940"
help_topic="upload_model" >
<string name="status_idle"></string>
<string name="status_parse_error">Error: Dae parsing issue - see log for details.</string>
+ <string name="status_material_mismatch">Error: Material of model is not a subset of reference model.</string>
<string name="status_reading_file">Loading...</string>
<string name="status_generating_meshes">Generating Meshes...</string>
<string name="status_vertex_number_overflow">Error: Vertex number is more than 65534, aborted!</string>
@@ -789,7 +790,7 @@
<check_box name="physics_use_hull" follows="left|top" width="130" left_pad="5" height="20" label="Use Convex Hull"/> -->
</panel>
- <!-- ==== STEP 2: Analyse ==== -->
+ <!-- ==== STEP 2: Analyze ==== -->
<view_border
bevel_style="none"
follows="top|left"
@@ -818,7 +819,7 @@
name="method_label"
text_color="White"
top_pad="0">
- Step 2: Analyse
+ Step 2: Analyze
</text>
<text
follows="top|left"
diff --git a/indra/newview/skins/default/xui/en/floater_model_wizard.xml b/indra/newview/skins/default/xui/en/floater_model_wizard.xml
index b5a5ff5342..62b8c5f96e 100644
--- a/indra/newview/skins/default/xui/en/floater_model_wizard.xml
+++ b/indra/newview/skins/default/xui/en/floater_model_wizard.xml
@@ -108,7 +108,7 @@
height="22"
top_pad="15"
width="505"
- name="header_panel"
+ name="choose_file_header_panel"
bg_opaque_color="DkGray2"
background_visible="true"
background_opaque="true"
@@ -117,7 +117,7 @@
width="200"
left="10"
top="3"
- name="header_text"
+ name="choose_file_header_text"
text_color="White"
height="10"
font="SansSerifBig"
@@ -130,7 +130,7 @@
left="15"
height="310"
width="505"
- name="content"
+ name="choose_file_content"
bg_opaque_color="DkGray2"
background_visible="true"
background_opaque="true">
@@ -199,7 +199,7 @@
height="10"
layout="topleft"
left="10"
- name="Cache location"
+ name="Model types"
width="320">
Second Life supports COLLADA (.dae) files
</text>
@@ -287,7 +287,7 @@
<panel
height="22"
top_pad="15"
- name="header_panel"
+ name="optimize_header_panel"
width="505"
bg_opaque_color="DkGray2"
background_visible="true"
@@ -296,7 +296,7 @@
<text
width="200"
left="10"
- name="header_text"
+ name="optimize_header_text"
top="3"
text_color="White"
height="10"
@@ -311,7 +311,7 @@
height="20"
font="SansSerifSmall"
layout="topleft"
- name="description"
+ name="optimize_description"
word_wrap="true"
left_delta="5">
We have optimized the model for performance. Adjust it further if you wish.
@@ -322,7 +322,7 @@
left="15"
height="270"
width="505"
- name="content"
+ name="optimize_content"
bg_opaque_color="DkGray2"
background_visible="true"
background_opaque="true">
@@ -497,7 +497,7 @@ Higher prim weight</text>
<panel
height="22"
top_pad="15"
- name="header_panel"
+ name="physics_header_panel"
width="505"
bg_opaque_color="DkGray2"
background_visible="true"
@@ -506,7 +506,7 @@ Higher prim weight</text>
<text
width="200"
left="10"
- name="header_text"
+ name="physics_header_text"
top="3"
height="10"
font="SansSerifBig"
@@ -521,7 +521,7 @@ Higher prim weight</text>
height="50"
font="SansSerifSmall"
layout="topleft"
- name="description"
+ name="physics_description"
word_wrap="true"
left_delta="5">
We will create a shape for the outer hull of the model. Adjust the shape's detail level as needed for the intended purpose of your model.
@@ -531,7 +531,7 @@ Higher prim weight</text>
left="15"
height="270"
width="505"
- name="content"
+ name="physics_content"
bg_opaque_color="DkGray2"
background_visible="true"
background_opaque="true">
@@ -635,7 +635,7 @@ Buildings</text>
<panel
height="22"
top_pad="15"
- name="header_panel"
+ name="review_header_panel"
width="505"
bg_opaque_color="DkGray2"
background_visible="true"
@@ -644,7 +644,7 @@ Buildings</text>
<text
width="200"
left="10"
- name="header_text"
+ name="review_header_text"
text_color="White"
top="3"
height="10"
@@ -658,7 +658,7 @@ Buildings</text>
left="15"
height="310"
width="505"
- name="content"
+ name="review_content"
bg_opaque_color="DkGray2"
background_visible="true"
background_opaque="true">
@@ -706,7 +706,7 @@ Buildings</text>
<panel
height="22"
top_pad="15"
- name="header_panel"
+ name="upload_header_panel"
width="505"
bg_opaque_color="DkGray2"
background_visible="true"
@@ -715,7 +715,7 @@ Buildings</text>
<text
width="200"
left="10"
- name="header_text"
+ name="upload_header_text"
top="3"
text_color="White"
height="10"
diff --git a/indra/newview/skins/default/xui/en/floater_moveview.xml b/indra/newview/skins/default/xui/en/floater_moveview.xml
index 6f29255a6b..065dab0413 100644
--- a/indra/newview/skins/default/xui/en/floater_moveview.xml
+++ b/indra/newview/skins/default/xui/en/floater_moveview.xml
@@ -1,17 +1,21 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater
+ open_positioning="specified"
+ specified_left="320"
+ specified_bottom="80"
legacy_header_height="18"
- can_dock="true"
+ can_dock="false"
can_minimize="true"
- can_close="false"
- follows="bottom"
+ can_close="true"
height="110"
layout="topleft"
name="move_floater"
help_topic="move_floater"
save_rect="true"
save_visibility="true"
- save_dock_state="true"
+ single_instance="true"
+ chrome="true"
+ title="WALK / RUN / FLY"
width="133">
<string
name="walk_forward_tooltip">
diff --git a/indra/newview/skins/default/xui/en/floater_my_appearance.xml b/indra/newview/skins/default/xui/en/floater_my_appearance.xml
new file mode 100644
index 0000000000..1c4b25a7b0
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_my_appearance.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+
+<floater
+ open_positioning="cascading"
+ legacy_header_height="18"
+ can_resize="true"
+ height="588"
+ layout="topleft"
+ name="floater_my_appearance"
+ help_topic="appearance"
+ save_rect="true"
+ single_instance="true"
+ reuse_instance="true"
+ title="APPEARANCE"
+ min_height="440"
+ min_width="333"
+ width="333">
+ <panel
+ top="18"
+ class="sidepanel_appearance"
+ name="main_panel"
+ filename="sidepanel_appearance.xml"
+ label="Edit Appearance"
+ font="SansSerifBold"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_my_inventory.xml b/indra/newview/skins/default/xui/en/floater_my_inventory.xml
new file mode 100644
index 0000000000..cd0b59dc51
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_my_inventory.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<floater
+ open_positioning="cascading"
+ can_close="true"
+ can_resize="true"
+ height="570"
+ help_topic="sidebar_inventory"
+ min_width="333"
+ min_height="440"
+ name="floater_my_inventory"
+ save_rect="true"
+ save_visibility="true"
+ reuse_instance="true"
+ title="INVENTORY"
+ width="333" >
+ <panel
+ class="sidepanel_inventory"
+ name="main_panel"
+ filename="sidepanel_inventory.xml"
+ follows="all"
+ top="0"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_my_web_profile.xml b/indra/newview/skins/default/xui/en/floater_my_web_profile.xml
new file mode 100644
index 0000000000..df46fc198f
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_my_web_profile.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<floater name="floater_my_web_profile"
+ help_topic="web_profile"
+ width="780"
+ height="775"
+ save_rect="true"
+ single_instance="true"
+ reuse_instance="false"
+ filename="floater_web_content.xml"/> \ No newline at end of file
diff --git a/indra/newview/skins/default/xui/en/floater_nearby_chat.xml b/indra/newview/skins/default/xui/en/floater_nearby_chat.xml
deleted file mode 100644
index ab966dbb0e..0000000000
--- a/indra/newview/skins/default/xui/en/floater_nearby_chat.xml
+++ /dev/null
@@ -1,50 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater
- border_visible="false"
- border="false"
- legacy_header_height="18"
- can_minimize="true"
- can_tear_off="false"
- can_resize="true"
- can_drag_on_left="false"
- can_close="false"
- can_dock="true"
- bevel_style="in"
- height="300"
- min_width="235"
- layout="topleft"
- name="nearby_chat"
- help_topic="nearby_chat"
- save_rect="true"
- title="NEARBY CHAT"
- save_dock_state="true"
- save_visibility="true"
- single_instance="true"
- width="320">
- <check_box
- bottom_delta="36"
- control_name="TranslateChat"
- enabled="true"
- height="16"
- label="Translate chat (powered by Google)"
- layout="topleft"
- left="5"
- name="translate_chat_checkbox"
- width="230" />
- <chat_history
- parse_urls="true"
- bg_readonly_color="ChatHistoryBgColor"
- bg_writeable_color="ChatHistoryBgColor"
- follows="all"
- left="5"
- top_delta="17"
- layout="topleft"
- height="260"
- name="chat_history"
- parse_highlights="true"
- text_color="ChatHistoryTextColor"
- text_readonly_color="ChatHistoryTextColor"
- right_widget_pad="5"
- left_widget_pad="0"
- width="315" />
-</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_outfit_save_as.xml b/indra/newview/skins/default/xui/en/floater_outfit_save_as.xml
index 068737494f..bbe280582b 100644
--- a/indra/newview/skins/default/xui/en/floater_outfit_save_as.xml
+++ b/indra/newview/skins/default/xui/en/floater_outfit_save_as.xml
@@ -4,7 +4,7 @@
can_minimize="false"
height="100"
layout="topleft"
- title="Save Outfit"
+ title="SAVE OUTFIT"
name="modal container"
width="240">
<button
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 9db6568ee3..ffbb6aa28b 100644
--- a/indra/newview/skins/default/xui/en/floater_outgoing_call.xml
+++ b/indra/newview/skins/default/xui/en/floater_outgoing_call.xml
@@ -8,6 +8,7 @@
layout="topleft"
name="outgoing call"
help_topic="outgoing_call"
+ save_dock_state="true"
title="CALLING"
width="410">
<floater.string
diff --git a/indra/newview/skins/default/xui/en/floater_people.xml b/indra/newview/skins/default/xui/en/floater_people.xml
new file mode 100644
index 0000000000..d6d8431150
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_people.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
+
+<floater
+ open_positioning="cascading"
+ can_close="true"
+ can_resize="true"
+ height="570"
+ help_topic="sidebar_people"
+ min_height="440"
+ min_width="333"
+ layout="topleft"
+ name="floater_people"
+ save_rect="true"
+ single_instance="true"
+ reuse_instance="true"
+ title="PEOPLE"
+ width="333">
+ <panel_container
+ default_panel_name="panel_people"
+ follows="all"
+ height="570"
+ name="main_panel"
+ width="333">
+ <panel
+ class="panel_people"
+ name="panel_people"
+ filename="panel_people.xml"/>
+ <panel
+ class="panel_group_info_sidetray"
+ name="panel_group_info_sidetray"
+ filename="panel_group_info_sidetray.xml"
+ label="Group Profile"
+ font="SansSerifBold"/>
+ <panel
+ class="panel_block_list_sidetray"
+ name="panel_block_list_sidetray"
+ filename="panel_block_list_sidetray.xml"
+ label="Blocked Residents &amp; Objects"
+ font="SansSerifBold"/>
+ </panel_container>
+</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_picks.xml b/indra/newview/skins/default/xui/en/floater_picks.xml
new file mode 100644
index 0000000000..7882116662
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_picks.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<floater
+ open_positioning="cascading"
+ can_close="true"
+ can_resize="true"
+ height="572"
+ help_topic="sidebar_me"
+ min_width="333"
+ min_height="440"
+ name="floater_picks"
+ save_rect="true"
+ save_visibility="true"
+ reuse_instance="true"
+ title="Picks"
+ width="333" >
+ <panel
+ class="panel_me"
+ name="main_panel"
+ filename="panel_me.xml"
+ follows="all"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_places.xml b/indra/newview/skins/default/xui/en/floater_places.xml
new file mode 100644
index 0000000000..ccceac0a7b
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_places.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+
+<floater
+ open_positioning="cascading"
+ legacy_header_height="18"
+ can_resize="true"
+ height="588"
+ layout="topleft"
+ name="floater_places"
+ help_topic="floater_places"
+ save_rect="true"
+ reuse_instance="true"
+ title="PLACES"
+ min_height="440"
+ min_width="333"
+ width="333">
+ <panel
+ top="18"
+ class="panel_places"
+ name="main_panel"
+ filename="panel_places.xml"
+ label="Places"
+ font="SansSerifBold"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_postcard.xml b/indra/newview/skins/default/xui/en/floater_postcard.xml
deleted file mode 100644
index c756661ffc..0000000000
--- a/indra/newview/skins/default/xui/en/floater_postcard.xml
+++ /dev/null
@@ -1,150 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater
- legacy_header_height="18"
- auto_tile="true"
- can_minimize="false"
- can_resize="true"
- height="380"
- layout="topleft"
- min_height="380"
- min_width="490"
- name="Postcard"
- help_topic="postcard"
- title="EMAIL SNAPSHOT"
- width="490">
- <floater.string
- name="default_subject">
- Postcard from [SECOND_LIFE].
- </floater.string>
- <floater.string
- name="default_message">
- Check this out!
- </floater.string>
- <floater.string
- name="upload_message">
- Sending...
- </floater.string>
- <text
- type="string"
- length="1"
- bottom="35"
- follows="top|left"
- font="SansSerif"
- layout="topleft"
- left="12"
- name="to_label">
- Recipient&apos;s Email:
- </text>
- <line_editor
- control_name="LastPostcardRecipient"
- follows="left|top"
- height="20"
- layout="topleft"
- left_delta="148"
- name="to_form"
- top_delta="-4"
- width="150" />
- <text
- type="string"
- length="1"
- bottom_delta="23"
- follows="top|left"
- font="SansSerif"
- layout="topleft"
- left="12"
- name="from_label">
- Your Email:
- </text>
- <line_editor
- follows="left|top"
- height="20"
- layout="topleft"
- left_delta="148"
- name="from_form"
- top_delta="-4"
- width="150" />
- <text
- type="string"
- length="1"
- bottom_delta="23"
- follows="top|left"
- font="SansSerif"
- layout="topleft"
- left="12"
- name="name_label">
- Your Name:
- </text>
- <line_editor
- follows="left|top"
- height="20"
- layout="topleft"
- left_delta="148"
- max_length_bytes="100"
- name="name_form"
- top_delta="-4"
- width="150" />
- <text
- type="string"
- length="1"
- bottom_delta="23"
- follows="top|left"
- font="SansSerif"
- layout="topleft"
- left="12"
- name="subject_label">
- Subject:
- </text>
- <line_editor
- follows="left|top"
- height="20"
- label="Type your subject here."
- layout="topleft"
- left_delta="148"
- max_length_bytes="100"
- name="subject_form"
- top_delta="-4"
- width="150" />
- <text
- type="string"
- length="1"
- bottom_delta="23"
- follows="top|left"
- font="SansSerif"
- layout="topleft"
- left="12"
- name="msg_label">
- Message:
- </text>
- <text_editor
- type="string"
- length="1"
- follows="left|top|right|bottom"
- height="140"
- layout="topleft"
- left_delta="0"
- max_length="700"
- name="msg_form"
- word_wrap="true"
- top_pad="10"
- width="420">
- Type your message here.
- </text_editor>
- <button
- follows="right|bottom"
- height="23"
- label="Cancel"
- layout="topleft"
- name="cancel_btn"
- right="-10"
- top="350"
- width="100" />
- <button
- follows="right|bottom"
- height="23"
- label="Send"
- layout="topleft"
- left_delta="-106"
- name="send_btn"
- top_delta="0"
- width="100" />
-</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_preferences.xml b/indra/newview/skins/default/xui/en/floater_preferences.xml
index dcfa8bc060..402868bb97 100644
--- a/indra/newview/skins/default/xui/en/floater_preferences.xml
+++ b/indra/newview/skins/default/xui/en/floater_preferences.xml
@@ -1,12 +1,13 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater
legacy_header_height="18"
- open_centered="true"
+ open_positioning="centered"
default_tab_group="1"
height="460"
layout="topleft"
name="Preferences"
help_topic="preferences"
+ save_rect="true"
single_instance="true"
title="PREFERENCES"
width="658">
diff --git a/indra/newview/skins/default/xui/en/floater_preview_animation.xml b/indra/newview/skins/default/xui/en/floater_preview_animation.xml
index 65efc46c71..8427c7b06f 100644
--- a/indra/newview/skins/default/xui/en/floater_preview_animation.xml
+++ b/indra/newview/skins/default/xui/en/floater_preview_animation.xml
@@ -1,7 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater
legacy_header_height="18"
- auto_tile="true"
height="85"
layout="topleft"
name="preview_anim"
diff --git a/indra/newview/skins/default/xui/en/floater_preview_gesture.xml b/indra/newview/skins/default/xui/en/floater_preview_gesture.xml
index 478ae5f53f..8baa0a56f7 100644
--- a/indra/newview/skins/default/xui/en/floater_preview_gesture.xml
+++ b/indra/newview/skins/default/xui/en/floater_preview_gesture.xml
@@ -1,7 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater
legacy_header_height="18"
- auto_tile="true"
height="460"
layout="topleft"
name="gesture_preview"
@@ -362,4 +361,4 @@
name="save_btn"
top_delta="0"
width="80" />
-</floater> \ No newline at end of file
+</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_preview_notecard.xml b/indra/newview/skins/default/xui/en/floater_preview_notecard.xml
index 8c9e1d52b3..be3b2d179d 100644
--- a/indra/newview/skins/default/xui/en/floater_preview_notecard.xml
+++ b/indra/newview/skins/default/xui/en/floater_preview_notecard.xml
@@ -1,10 +1,8 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater
legacy_header_height="18"
- auto_tile="true"
can_resize="true"
default_tab_group="1"
- follows="left|top"
height="361"
layout="topleft"
min_height="243"
diff --git a/indra/newview/skins/default/xui/en/floater_preview_sound.xml b/indra/newview/skins/default/xui/en/floater_preview_sound.xml
index 62ef4c3097..83a1f5a96f 100644
--- a/indra/newview/skins/default/xui/en/floater_preview_sound.xml
+++ b/indra/newview/skins/default/xui/en/floater_preview_sound.xml
@@ -1,7 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater
legacy_header_height="18"
- auto_tile="true"
height="85"
layout="topleft"
name="preview_sound"
diff --git a/indra/newview/skins/default/xui/en/floater_preview_texture.xml b/indra/newview/skins/default/xui/en/floater_preview_texture.xml
index a79d2f63cb..137e278ddc 100644
--- a/indra/newview/skins/default/xui/en/floater_preview_texture.xml
+++ b/indra/newview/skins/default/xui/en/floater_preview_texture.xml
@@ -1,9 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater
legacy_header_height="18"
- auto_tile="true"
can_resize="true"
- follows="left|top"
height="350"
layout="topleft"
min_height="200"
diff --git a/indra/newview/skins/default/xui/en/floater_publish_classified.xml b/indra/newview/skins/default/xui/en/floater_publish_classified.xml
index 6ce9ed6e77..322e34272c 100644
--- a/indra/newview/skins/default/xui/en/floater_publish_classified.xml
+++ b/indra/newview/skins/default/xui/en/floater_publish_classified.xml
@@ -36,7 +36,7 @@ Remember, Classified fees are non-refundable.
left="15"
value="50"
min_val="50"
- max_val="99999"
+ max_val="999999"
name="price_for_listing"
top_pad="10"
tool_tip="Price for listing."
diff --git a/indra/newview/skins/default/xui/en/floater_script.xml b/indra/newview/skins/default/xui/en/floater_script.xml
index 12ade86b5f..bd4edb81c8 100644
--- a/indra/newview/skins/default/xui/en/floater_script.xml
+++ b/indra/newview/skins/default/xui/en/floater_script.xml
@@ -2,12 +2,9 @@
<floater
legacy_header_height="18"
background_visible="true"
- follows="left|top|right|bottom"
height="250"
layout="topleft"
- left="0"
name="script_floater"
- top="0"
can_dock="true"
can_minimize="true"
visible="false"
diff --git a/indra/newview/skins/default/xui/en/floater_script_debug_panel.xml b/indra/newview/skins/default/xui/en/floater_script_debug_panel.xml
index ce96ea232e..b5dd2f97b9 100644
--- a/indra/newview/skins/default/xui/en/floater_script_debug_panel.xml
+++ b/indra/newview/skins/default/xui/en/floater_script_debug_panel.xml
@@ -2,7 +2,6 @@
<floater
legacy_header_height="18"
can_resize="true"
- follows="left|top|right|bottom"
height="200"
layout="topleft"
name="script"
diff --git a/indra/newview/skins/default/xui/en/floater_script_preview.xml b/indra/newview/skins/default/xui/en/floater_script_preview.xml
index 8c03b56040..91a9e67e4c 100644
--- a/indra/newview/skins/default/xui/en/floater_script_preview.xml
+++ b/indra/newview/skins/default/xui/en/floater_script_preview.xml
@@ -1,7 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater
legacy_header_height="18"
- auto_tile="true"
can_resize="true"
height="570"
layout="topleft"
diff --git a/indra/newview/skins/default/xui/en/floater_script_queue.xml b/indra/newview/skins/default/xui/en/floater_script_queue.xml
index 60a26fcf1d..f4aca7bb3d 100644
--- a/indra/newview/skins/default/xui/en/floater_script_queue.xml
+++ b/indra/newview/skins/default/xui/en/floater_script_queue.xml
@@ -1,7 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater
legacy_header_height="18"
- auto_tile="true"
can_resize="true"
height="400"
layout="topleft"
diff --git a/indra/newview/skins/default/xui/en/floater_search.xml b/indra/newview/skins/default/xui/en/floater_search.xml
index eaf575fc08..dd818e2e06 100644
--- a/indra/newview/skins/default/xui/en/floater_search.xml
+++ b/indra/newview/skins/default/xui/en/floater_search.xml
@@ -1,18 +1,18 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater
+ open_positioning="cascading"
legacy_header_height="18"
- can_resize="true"
+ can_resize="true"
height="775"
- layout="topleft"
- min_height="400"
+ layout="topleft"
+ min_height="400"
min_width="500"
- name="floater_web_content"
- help_topic="floater_web_content"
- save_rect="true"
- auto_tile="true"
- save_visibility="true"
+ name="floater_search"
+ help_topic="floater_search"
+ save_rect="true"
+ save_visibility="true"
title=""
initial_mime_type="text/html"
width="780"
- tab_stop="true"
+ tab_stop="true"
filename="floater_web_content.xml"/>
diff --git a/indra/newview/skins/default/xui/en/floater_snapshot.xml b/indra/newview/skins/default/xui/en/floater_snapshot.xml
index 89a0c4c287..0c38283d59 100644
--- a/indra/newview/skins/default/xui/en/floater_snapshot.xml
+++ b/indra/newview/skins/default/xui/en/floater_snapshot.xml
@@ -1,403 +1,373 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater
+ open_positioning="cascading"
legacy_header_height="18"
- can_minimize="false"
+ can_minimize="true"
can_close="true"
- follows="left|top"
- height="520"
+ height="500"
layout="topleft"
name="Snapshot"
help_topic="snapshot"
save_rect="true"
- save_visibility="true"
+ save_visibility="false"
title="SNAPSHOT PREVIEW"
- width="245">
+ width="470">
<floater.string
name="unknown">
unknown
</floater.string>
- <radio_group
- height="70"
- label="Snapshot type"
- layout="topleft"
- left="10"
- name="snapshot_type_radio"
- top="20"
- width="205">
-<!--
- <radio_item
- height="16"
- label="Share to Web"
- layout="topleft"
- name="share_to_web"
- top_pad="0" />
--->
- <radio_item
- height="16"
- label="Email"
- layout="topleft"
- name="postcard"
- top_pad="2" />
- <radio_item
- height="16"
- label="My inventory (L$[AMOUNT])"
- layout="topleft"
- name="texture"
- top_pad="2" />
- <radio_item
- height="16"
- label="Save to my computer"
- layout="topleft"
- name="local"
- top_pad="2" />
- </radio_group>
- <ui_ctrl
- height="90"
- width="125"
- layout="topleft"
- name="thumbnail_placeholder"
- top_pad="6"
- follows="left|top"
- left="10"
- />
- <text
- type="string"
- font="SansSerifSmall"
- length="1"
- follows="left|top"
- height="14"
- layout="topleft"
- right="-5"
- left_delta="0"
- halign="right"
- name="file_size_label"
- top_pad="8"
- width="195">
- [SIZE] KB
- </text>
- <button
- follows="left|top"
- height="22"
- image_overlay="Refresh_Off"
- layout="topleft"
- left="10"
- name="new_snapshot_btn"
- width="23" />
- <button
- follows="left|top"
- height="23"
- label="Send"
- layout="topleft"
- left_pad="5"
- right="-5"
- name="send_btn"
- width="100" />
+ <string
+ name="postcard_progress_str">
+ Sending Email
+ </string>
+ <string
+ name="profile_progress_str">
+ Posting
+ </string>
+ <string
+ name="inventory_progress_str">
+ Saving to Inventory
+ </string>
+ <string
+ name="local_progress_str">
+ Saving to Computer
+ </string>
+ <string
+ name="profile_succeeded_str">
+ Image uploaded
+ </string>
+ <string
+ name="postcard_succeeded_str">
+ Email Sent!
+ </string>
+ <string
+ name="inventory_succeeded_str">
+ Saved to Inventory!
+ </string>
+ <string
+ name="local_succeeded_str">
+ Saved to Computer!
+ </string>
+ <string
+ name="profile_failed_str">
+ Failed to upload image to your Profile Feed.
+ </string>
+ <string
+ name="postcard_failed_str">
+ Failed to send email.
+ </string>
+ <string
+ name="inventory_failed_str">
+ Failed to save to inventory.
+ </string>
+ <string
+ name="local_failed_str">
+ Failed to save to computer.
+ </string>
<button
follows="left|top"
height="23"
- label="Save (L$[AMOUNT])"
+ image_overlay="TabIcon_Close_Off"
layout="topleft"
- right="-5"
- name="upload_btn"
- top_delta="0"
- width="110" />
- <flyout_button
- follows="left|top"
- height="23"
- label="Save"
- layout="topleft"
- right="-5"
- name="save_btn"
- tool_tip="Save image to a file"
- top_delta="0"
- width="100">
- <flyout_button.item
- label="Save"
- name="save_item"
- value="save" />
- <flyout_button.item
- label="Save As..."
- name="saveas_item"
- value="save as" />
- </flyout_button>
- <button
- follows="left|top"
- height="23"
- label="More"
- layout="topleft"
- left="10"
- name="more_btn"
+ left="236"
+ name="advanced_options_btn"
tool_tip="Advanced options"
- width="80" />
- <button
- follows="left|top"
- height="23"
- label="Less"
- layout="topleft"
- left_delta="0"
- name="less_btn"
- tool_tip="Advanced options"
- top_delta="0"
- width="80" />
- <button
- follows="left|top"
- height="23"
- label="Cancel"
- layout="topleft"
- right="-5"
- left_pad="5"
- name="discard_btn"
- width="110" />
- <text
- type="string"
- length="1"
- follows="top|left"
- height="12"
- layout="topleft"
- left="10"
- name="type_label2"
- top_pad="5"
- width="127">
- Size
- </text>
- <text
- type="string"
- length="1"
- follows="top|left"
- height="12"
- layout="topleft"
- left_pad="5"
- name="format_label"
- top_delta="0"
- width="70">
- Format
- </text>
- <combo_box
- height="23"
- label="Resolution"
- layout="topleft"
- left="10"
- name="postcard_size_combo"
- width="120">
- <combo_box.item
- label="Current Window"
- name="CurrentWindow"
- value="[i0,i0]" />
- <combo_box.item
- label="640x480"
- name="640x480"
- value="[i640,i480]" />
- <combo_box.item
- label="800x600"
- name="800x600"
- value="[i800,i600]" />
- <combo_box.item
- label="1024x768"
- name="1024x768"
- value="[i1024,i768]" />
- <combo_box.item
- label="Custom"
- name="Custom"
- value="[i-1,i-1]" />
- </combo_box>
- <combo_box
- height="23"
- label="Resolution"
- layout="topleft"
- left_delta="0"
- name="texture_size_combo"
- top_delta="0"
- width="127">
- <combo_box.item
- label="Current Window"
- name="CurrentWindow"
- value="[i0,i0]" />
- <combo_box.item
- label="Small (128x128)"
- name="Small(128x128)"
- value="[i128,i128]" />
- <combo_box.item
- label="Medium (256x256)"
- name="Medium(256x256)"
- value="[i256,i256]" />
- <combo_box.item
- label="Large (512x512)"
- name="Large(512x512)"
- value="[i512,i512]" />
- <combo_box.item
- label="Custom"
- name="Custom"
- value="[i-1,i-1]" />
- </combo_box>
- <combo_box
- height="23"
- label="Resolution"
- layout="topleft"
- left_delta="0"
- name="local_size_combo"
- top_delta="0"
- width="127">
- <combo_box.item
- label="Current Window"
- name="CurrentWindow"
- value="[i0,i0]" />
- <combo_box.item
- label="320x240"
- name="320x240"
- value="[i320,i240]" />
- <combo_box.item
- label="640x480"
- name="640x480"
- value="[i640,i480]" />
- <combo_box.item
- label="800x600"
- name="800x600"
- value="[i800,i600]" />
- <combo_box.item
- label="1024x768"
- name="1024x768"
- value="[i1024,i768]" />
- <combo_box.item
- label="1280x1024"
- name="1280x1024"
- value="[i1280,i1024]" />
- <combo_box.item
- label="1600x1200"
- name="1600x1200"
- value="[i1600,i1200]" />
- <combo_box.item
- label="Custom"
- name="Custom"
- value="[i-1,i-1]" />
- </combo_box>
- <combo_box
- height="23"
- label="Format"
- layout="topleft"
- left_pad="5"
- name="local_format_combo"
- width="70">
- <combo_box.item
- label="PNG"
- name="PNG" />
- <combo_box.item
- label="JPEG"
- name="JPEG" />
- <combo_box.item
- label="BMP"
- name="BMP" />
- </combo_box>
- <spinner
- allow_text_entry="false"
- decimal_digits="0"
- follows="left|top"
- height="20"
- increment="32"
- label="Width"
- label_width="40"
- layout="topleft"
- left="10"
- max_val="6016"
- min_val="32"
- name="snapshot_width"
- top_pad="10"
- width="95" />
- <spinner
- allow_text_entry="false"
- decimal_digits="0"
- follows="left|top"
- height="20"
- increment="32"
- label="Height"
- label_width="40"
- layout="topleft"
- left_pad="5"
- max_val="6016"
- min_val="32"
- name="snapshot_height"
- top_delta="0"
- width="95" />
- <check_box
- bottom_delta="20"
- label="Constrain proportions"
- layout="topleft"
- left="10"
- name="keep_aspect_check" />
- <slider
- decimal_digits="0"
- follows="left|top"
- height="15"
- increment="1"
- initial_value="75"
- label="Image quality"
- label_width="124"
- layout="topleft"
- left_delta="0"
- max_val="100"
- name="image_quality_slider"
- top_pad="5"
- width="228" />
- <text
- type="string"
- length="1"
+ top="25"
+ width="23" />
+ <ui_ctrl
+ height="160"
+ width="250"
+ layout="topleft"
+ name="thumbnail_placeholder"
+ top="50"
+ follows="left|top"
+ left="10">
+ <panel
+ background_visible="true"
+ bg_alpha_color="0.9 1 0.9 1"
+ follows="left|top"
+ font="SansSerifLarge"
+ halign="center"
+ height="20"
+ layout="topleft"
+ left="0"
+ length="1"
+ name="succeeded_panel"
+ right="-1"
+ top="0"
+ type="string"
+ visible="false">
+ <text
+ follows="all"
+ font="SansSerif"
+ halign="center"
+ height="18"
+ layout="topleft"
+ left="1"
+ length="1"
+ name="succeeded_lbl"
+ right="-1"
+ text_color="0.2 0.5 0.2 1"
+ top="4"
+ translate="false"
+ type="string">
+ Succeeded
+ </text>
+ </panel>
+ <panel
+ background_visible="true"
+ bg_alpha_color="1 0.9 0.9 1"
+ follows="left|top"
+ font="SansSerifLarge"
+ halign="center"
+ height="20"
+ layout="topleft"
+ left_delta="0"
+ length="1"
+ name="failed_panel"
+ right="-1"
+ top="0"
+ type="string"
+ visible="false">
+ <text
+ follows="all"
+ font="SansSerif"
+ halign="center"
+ height="18"
+ layout="topleft"
+ left="1"
+ length="1"
+ name="failed_lbl"
+ right="-1"
+ text_color="0.5 0.2 0.2 1"
+ top="4"
+ translate="false"
+ type="string">
+ Failed
+ </text>
+ </panel>
+ <loading_indicator
+ follows="left|top"
+ height="48"
+ layout="topleft"
+ name="working_indicator"
+ left="101"
+ top="46"
+ visible="false"
+ width="48" />
+ <text
+ follows="left|top|right"
+ font="SansSerifBold"
+ height="14"
+ layout="topleft"
+ left="5"
+ length="1"
+ halign="center"
+ name="working_lbl"
+ right="-5"
+ top="98"
+ translate="false"
+ type="string"
+ visible="false"
+ width="130">
+ Working
+ </text>
+ <button
+ follows="left|top"
+ height="22"
+ image_overlay="Refresh_Off"
+ layout="topleft"
+ left="20"
+ name="new_snapshot_btn"
+ bottom="-20"
+ visible="false"
+ width="22" />
+ <text
+ follows="left|top"
+ font="SansSerifBold"
+ halign="left"
+ height="18"
+ layout="topleft"
+ left_pad="10"
+ length="1"
+ name="refresh_lbl"
+ right="-5"
+ text_color="red"
+ top_delta="0"
+ translate="false"
+ type="string"
+ visible="false"
+ width="130">
+ Refresh to save.
+ </text>
+ </ui_ctrl>
+ <view_border
+ bevel_style="in"
+ height="21"
+ width="250"
+ layout="topleft"
+ name="img_info_border"
+ top_pad="3"
+ follows="left|top"
+ left_delta="0"
+ />
+ <text
+ type="string"
+ font="SansSerifSmall"
+ length="1"
+ follows="left|top"
+ height="14"
+ layout="topleft"
+ left_delta="5"
+ halign="left"
+ name="image_res_text"
+ top_delta="5"
+ width="100">
+ [WIDTH] x [HEIGHT] px
+ </text>
+ <text
+ follows="left|top"
+ font="SansSerifSmall"
+ height="14"
+ layout="topleft"
+ left="200"
+ length="1"
+ halign="right"
+ name="file_size_label"
+ top_delta="0"
+ type="string"
+ width="50">
+ [SIZE] KB
+ </text>
+ <panel_container
follows="left|top"
- height="13"
- layout="topleft"
- left="10"
- name="layer_type_label"
- top_pad="5"
- width="50">
- Capture:
- </text>
- <combo_box
- height="23"
- label="Image Layers"
+ height="260"
layout="topleft"
- left="30"
- name="layer_types"
- width="145">
- <combo_box.item
- label="Colors"
- name="Colors"
- value="colors" />
- <combo_box.item
- label="Depth"
- name="Depth"
- value="depth" />
- </combo_box>
- <check_box
- label="Interface"
- layout="topleft"
- left="30"
- top_pad="10"
- width="180"
- name="ui_check" />
- <check_box
- label="HUDs"
- layout="topleft"
- left="30"
+ left="0"
+ name="panel_container"
+ default_panel_name="panel_snapshot_options"
top_pad="10"
- width="180"
- name="hud_check" />
- <check_box
- label="Keep open after saving"
- layout="topleft"
- left="10"
- top_pad="8"
- width="180"
- name="keep_open_check" />
- <check_box
- label="Freeze frame (fullscreen)"
- layout="topleft"
- left="10"
- top_pad="8"
- width="180"
- name="freeze_frame_check" />
- <check_box
- label="Auto-refresh"
+ width="270">
+ <panel
+ class="llpanelsnapshotoptions"
+ filename="panel_snapshot_options.xml"
+ follows="all"
+ layout="topleft"
+ left="0"
+ name="panel_snapshot_options"
+ top="0" />
+ <panel
+ class="llpanelsnapshotprofile"
+ follows="all"
+ layout="topleft"
+ name="panel_snapshot_profile"
+ filename="panel_snapshot_profile.xml" />
+ <panel
+ class="llpanelsnapshotpostcard"
+ follows="all"
+ layout="topleft"
+ name="panel_snapshot_postcard"
+ filename="panel_snapshot_postcard.xml" />
+ <panel
+ class="llpanelsnapshotinventory"
+ follows="all"
+ layout="topleft"
+ name="panel_snapshot_inventory"
+ filename="panel_snapshot_inventory.xml" />
+ <panel
+ class="llpanelsnapshotlocal"
+ follows="all"
+ layout="topleft"
+ name="panel_snapshot_local"
+ filename="panel_snapshot_local.xml" />
+ </panel_container>
+ <panel
+ height="295"
layout="topleft"
- left="10"
- top_pad="8"
- width="180"
- name="auto_snapshot_check" />
+ left="270"
+ name="advanced_options_panel"
+ top="20"
+ width="200">
+ <text
+ type="string"
+ font="SansSerifSmall"
+ length="1"
+ follows="left|top"
+ height="14"
+ layout="topleft"
+ left="10"
+ halign="left"
+ name="advanced_options_label"
+ right="-10"
+ top="10">
+ ADVANCED OPTIONS
+ </text>
+ <view_border
+ bevel_style="in"
+ follows="left|top|right"
+ height="1"
+ left="10"
+ layout="topleft"
+ name="advanced_options_hr"
+ right="-10"
+ top_pad="5"
+ />
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="13"
+ layout="topleft"
+ left="10"
+ name="layer_type_label"
+ top_pad="10"
+ width="50">
+ Capture:
+ </text>
+ <combo_box
+ follows="left|top|right"
+ height="23"
+ label="Image Layers"
+ layout="topleft"
+ left="30"
+ name="layer_types"
+ right="-10">
+ <combo_box.item
+ label="Colors"
+ name="Colors"
+ value="colors" />
+ <combo_box.item
+ label="Depth"
+ name="Depth"
+ value="depth" />
+ </combo_box>
+ <check_box
+ label="Interface"
+ layout="topleft"
+ left="30"
+ top_pad="10"
+ width="180"
+ name="ui_check" />
+ <check_box
+ label="HUDs"
+ layout="topleft"
+ left="30"
+ top_pad="10"
+ width="180"
+ name="hud_check" />
+ <check_box
+ label="Freeze frame (fullscreen)"
+ layout="topleft"
+ left="10"
+ top_pad="8"
+ width="180"
+ name="freeze_frame_check" />
+ <check_box
+ label="Auto-refresh"
+ layout="topleft"
+ left="10"
+ top_pad="8"
+ width="180"
+ name="auto_snapshot_check" />
+ </panel>
</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_sound_devices.xml b/indra/newview/skins/default/xui/en/floater_sound_devices.xml
index 74e01f359c..dec0e9b6c6 100644
--- a/indra/newview/skins/default/xui/en/floater_sound_devices.xml
+++ b/indra/newview/skins/default/xui/en/floater_sound_devices.xml
@@ -6,6 +6,7 @@
can_minimize="true"
can_resize="false"
can_close="false"
+ chrome="true"
save_dock_state="true"
save_visibility="true"
save_rect="true"
@@ -14,7 +15,7 @@
height="164"
layout="topleft"
name="floater_sound_devices"
- title="Sound Devices"
+ title="SOUND DEVICES"
width="490">
<panel
layout="topleft"
diff --git a/indra/newview/skins/default/xui/en/floater_stats.xml b/indra/newview/skins/default/xui/en/floater_stats.xml
index b87cb9a433..2fd932786b 100644
--- a/indra/newview/skins/default/xui/en/floater_stats.xml
+++ b/indra/newview/skins/default/xui/en/floater_stats.xml
@@ -2,7 +2,6 @@
<floater
legacy_header_height="18"
can_resize="true"
- follows="top|right"
height="400"
layout="topleft"
name="Statistics"
@@ -10,7 +9,7 @@
save_rect="true"
save_visibility="true"
title="STATISTICS"
- width="250">
+ width="260">
<scroll_container
follows="top|left|bottom|right"
height="380"
@@ -19,15 +18,16 @@
name="statistics_scroll"
reserve_scroll_corner="true"
top="20"
- width="250">
- <container_view
- follows="top|left|bottom|right"
- height="378"
- layout="topleft"
- left="2"
- name="statistics_view"
- top="20"
- width="230" >
+ width="260">
+ <container_view
+ follows="top|left|bottom|right"
+ height="378"
+ layout="topleft"
+ left="2"
+ name="statistics_view"
+ top="20"
+ width="245" >
+ <!--Basic Section-->
<stat_view
name="basic"
label="Basic"
@@ -39,9 +39,9 @@
unit_label="fps"
stat="fpsstat"
bar_min="0"
- bar_max="45"
- tick_spacing="7.5"
- label_spacing="15.0"
+ bar_max="60"
+ tick_spacing="6"
+ label_spacing="12"
precision="1"
show_bar="true"
show_history="true">
@@ -52,9 +52,10 @@
unit_label="kbps"
stat="kbitstat"
bar_min="0"
- bar_max="900"
- tick_spacing="100"
- label_spacing="300"
+ bar_max="5000"
+ tick_spacing="500"
+ label_spacing="1000"
+ precision="0"
show_bar="true"
show_history="false">
</stat_bar>
@@ -65,9 +66,9 @@
stat="packetslostpercentstat"
bar_min="0"
bar_max="5"
- tick_spacing="1"
+ tick_spacing="0.5"
label_spacing="1"
- precision="1"
+ precision="3"
show_per_sec="false"
show_bar="false"
show_mean="true">
@@ -78,15 +79,17 @@
unit_label="msec"
stat="simpingstat"
bar_min="0"
- bar_max="1000"
- tick_spacing="100"
- label_spacing="200"
+ bar_max="5000"
+ tick_spacing="500"
+ label_spacing="1000"
+ precision="0"
show_bar="false"
show_per_sec="false"
show_mean="false">
</stat_bar>
</stat_view>
- <stat_view
+ <!--Advanced Section-->
+ <stat_view
name="advanced"
label="Advanced"
show_label="true"
@@ -98,37 +101,39 @@
setting="OpenDebugStatRender">
<stat_bar
name="ktrisframe"
- label="KTris Drawn"
+ label="KTris Drawn per Frame"
unit_label="/fr"
stat="trianglesdrawnstat"
bar_min="0"
- bar_max="500"
- tick_spacing="100"
- label_spacing="500"
- precision="1"
- show_per_sec="false">
- </stat_bar>
+ bar_max="10000"
+ tick_spacing="1000"
+ label_spacing="2000"
+ precision="0"
+ show_per_sec="false"
+ show_bar="false">
+ </stat_bar>
<stat_bar
name="ktrissec"
- label="KTris Drawn"
+ label="KTris Drawn per Sec"
unit_label="/sec"
stat="trianglesdrawnstat"
bar_min="0"
- bar_max="3000"
- tick_spacing="250"
- label_spacing="1000"
- precision="1">
- </stat_bar>
+ bar_max="200000"
+ tick_spacing="25000"
+ label_spacing="50000"
+ precision="0"
+ show_bar="false">
+ </stat_bar>
<stat_bar
name="objs"
label="Total Objects"
unit_label=""
stat="numobjectsstat"
bar_min="0"
- bar_max="3000"
- tick_spacing="250"
- label_spacing="1000"
- precision="1"
+ bar_max="50000"
+ tick_spacing="5000"
+ label_spacing="10000"
+ precision="0"
show_per_sec="false"
show_bar="false">
</stat_bar>
@@ -138,13 +143,14 @@
unit_label="/sec"
stat="numnewobjectsstat"
bar_min="0"
- bar_max="1000"
- tick_spacing="100"
- label_spacing="500"
+ bar_max="2000"
+ tick_spacing="200"
+ label_spacing="400"
show_per_sec="true"
show_bar="false">
</stat_bar>
</stat_view>
+ <!--Texture Stats-->
<stat_view
name="texture"
label="Texture"
@@ -182,8 +188,9 @@
tick_spacing="100.f"
label_spacing="200.f"
precision="1"
- show_per_sec="false" >
- </stat_bar>
+ show_per_sec="false"
+ show_bar="false">
+ </stat_bar>
<stat_bar
name="formattedmemstat"
@@ -194,8 +201,9 @@
tick_spacing="100.f"
label_spacing="200.f"
precision="1"
- show_per_sec="false" >
- </stat_bar>
+ show_per_sec="false"
+ show_bar="false">
+ </stat_bar>
<stat_bar
name="rawmemstat"
@@ -206,8 +214,9 @@
tick_spacing="100.f"
label_spacing="200.f"
precision="1"
- show_per_sec="false" >
- </stat_bar>
+ show_per_sec="false"
+ show_bar="false">
+ </stat_bar>
<stat_bar
name="glboundmemstat"
@@ -218,10 +227,11 @@
tick_spacing="100.f"
label_spacing="200.f"
precision="1"
- show_per_sec="false" >
- </stat_bar>
+ show_per_sec="false"
+ show_bar="false">
+ </stat_bar>
</stat_view>
-
+ <!--Network Stats-->
<stat_view
name="network"
label="Network"
@@ -232,6 +242,11 @@
label="Packets In"
stat="packetsinstat"
unit_label="/sec"
+ bar_min="0.f"
+ bar_max="1024.f"
+ tick_spacing="128.f"
+ label_spacing="256.f"
+ precision="1"
show_bar="false">
</stat_bar>
@@ -239,7 +254,12 @@
name="packetsoutstat"
label="Packets Out"
stat="packetsoutstat"
- unit_label="/sec"
+ unit_label="/sec"
+ bar_min="0.f"
+ bar_max="1024.f"
+ tick_spacing="128.f"
+ label_spacing="256.f"
+ precision="1"
show_bar="false" >
</stat_bar>
@@ -247,7 +267,12 @@
name="objectkbitstat"
label="Objects"
stat="objectkbitstat"
- unit_label="kbps"
+ unit_label="kbps"
+ bar_min="0.f"
+ bar_max="1024.f"
+ tick_spacing="128.f"
+ label_spacing="256.f"
+ precision="1"
show_bar="false" >
</stat_bar>
@@ -255,7 +280,12 @@
name="texturekbitstat"
label="Texture"
stat="texturekbitstat"
- unit_label="kbps"
+ unit_label="kbps"
+ bar_min="0.f"
+ bar_max="1024.f"
+ tick_spacing="128.f"
+ label_spacing="256.f"
+ precision="1"
show_bar="false" >
</stat_bar>
@@ -263,7 +293,12 @@
name="assetkbitstat"
label="Asset"
stat="assetkbitstat"
- unit_label="kbps"
+ unit_label="kbps"
+ bar_min="0.f"
+ bar_max="1024.f"
+ tick_spacing="128.f"
+ label_spacing="256.f"
+ precision="1"
show_bar="false" >
</stat_bar>
@@ -271,7 +306,12 @@
name="layerskbitstat"
label="Layers"
stat="layerskbitstat"
- unit_label="kbps"
+ unit_label="kbps"
+ bar_min="0.f"
+ bar_max="1024.f"
+ tick_spacing="128.f"
+ label_spacing="256.f"
+ precision="1"
show_bar="false" >
</stat_bar>
@@ -279,12 +319,13 @@
name="actualinkbitstat"
label="Actual In"
stat="actualinkbitstat"
- unit_label="kbps"
- bar_min="0.f"
- bar_max="1024.f"
- tick_spacing="128.f"
- label_spacing="256.f"
- show_bar="true"
+ unit_label="kbps"
+ bar_min="0.f"
+ bar_max="1024.f"
+ tick_spacing="128.f"
+ label_spacing="256.f"
+ precision="1"
+ show_bar="false"
show_history="false" >
</stat_bar>
@@ -292,26 +333,27 @@
name="actualoutkbitstat"
label="Actual Out"
stat="actualoutkbitstat"
- unit_label="kbps"
- bar_min="0.f"
- bar_max="512.f"
- tick_spacing="128.f"
- label_spacing="256.f"
- show_bar="true"
+ unit_label="kbps"
+ bar_min="0.f"
+ bar_max="1024.f"
+ tick_spacing="128.f"
+ label_spacing="256.f"
+ precision="1"
+ show_bar="false"
show_history="false">
</stat_bar>
<stat_bar
name="vfspendingoperations"
- label="VFS Pending Ops"
+ label="VFS Pending Operations"
stat="vfspendingoperations"
- unit_label=" "
+ unit_label=" Ops."
show_per_sec="false"
show_bar="false" >
</stat_bar>
</stat_view>
</stat_view>
-
+ <!--Sim Stats-->
<stat_view
name="sim"
label="Simulator"
@@ -321,11 +363,11 @@
name="simtimedilation"
label="Time Dilation"
stat="simtimedilation"
- precision="2"
+ precision="3"
bar_min="0.f"
bar_max="1.f"
- tick_spacing="0.25f"
- label_spacing="0.5f"
+ tick_spacing="0.16666f"
+ label_spacing="0.33333f"
show_per_sec="false"
show_bar="false"
show_mean="false" >
@@ -335,10 +377,11 @@
name="simfps"
label="Sim FPS"
stat="simfps"
+ precision="1"
bar_min="0.f"
- bar_max="200.f"
- tick_spacing="20.f"
- label_spacing="100.f"
+ bar_max="45.f"
+ tick_spacing="7.5f"
+ label_spacing="15.f"
show_per_sec="false"
show_bar="false"
show_mean="false" >
@@ -350,9 +393,9 @@
stat="simphysicsfps"
precision="1"
bar_min="0.f"
- bar_max="66.f"
- tick_spacing="33.f"
- label_spacing="33.f"
+ bar_max="45.f"
+ tick_spacing="7.5.f"
+ label_spacing="15.f"
show_per_sec="false"
show_bar="false"
show_mean="false" >
@@ -369,8 +412,8 @@
precision="0"
bar_min="0.f"
bar_max="500.f"
- tick_spacing="10.f"
- label_spacing="40.f"
+ tick_spacing="50.f"
+ label_spacing="100.f"
show_per_sec="false"
show_bar="false"
show_mean="false" >
@@ -383,8 +426,8 @@
precision="0"
bar_min="0.f"
bar_max="500.f"
- tick_spacing="10.f"
- label_spacing="40.f"
+ tick_spacing="50.f"
+ label_spacing="100.f"
show_per_sec="false"
show_bar="false"
show_mean="false" >
@@ -395,7 +438,7 @@
label="Memory Allocated"
stat="physicsmemoryallocated"
unit_label="MB"
- precision="0"
+ precision="1"
bar_min="0.f"
bar_max="1024.f"
tick_spacing="128.f"
@@ -468,9 +511,9 @@
stat="simactiveobjects"
precision="0"
bar_min="0.f"
- bar_max="800.f"
- tick_spacing="100.f"
- label_spacing="200.f"
+ bar_max="5000.f"
+ tick_spacing="750.f"
+ label_spacing="1250.f"
show_per_sec="false"
show_bar="false"
show_mean="false" >
@@ -482,9 +525,9 @@
stat="simactivescripts"
precision="0"
bar_min="0.f"
- bar_max="800.f"
- tick_spacing="100.f"
- label_spacing="200.f"
+ bar_max="15000.f"
+ tick_spacing="1875.f"
+ label_spacing="3750.f"
show_per_sec="false"
show_bar="false"
show_mean="false" >
@@ -497,9 +540,9 @@
unit_label="eps"
precision="0"
bar_min="0.f"
- bar_max="20000.f"
- tick_spacing="2500.f"
- label_spacing="5000.f"
+ bar_max="5000.f"
+ tick_spacing="750.f"
+ label_spacing="1250.f"
show_per_sec="false"
show_bar="false"
show_mean="false" >
@@ -568,7 +611,7 @@
label="Total Unacked Bytes"
stat="simtotalunackedbytes"
unit_label="kb"
- precision="0"
+ precision="1"
bar_min="0.f"
bar_max="100000.f"
tick_spacing="25000.f"
@@ -587,7 +630,7 @@
label="Total Frame Time"
stat="simframemsec"
unit_label="ms"
- precision="1"
+ precision="3"
bar_min="0.f"
bar_max="40.f"
tick_spacing="10.f"
@@ -602,7 +645,7 @@
label="Net Time"
stat="simnetmsec"
unit_label="ms"
- precision="1"
+ precision="3"
bar_min="0.f"
bar_max="40.f"
tick_spacing="10.f"
@@ -617,7 +660,7 @@
label="Physics Time"
stat="simsimphysicsmsec"
unit_label="ms"
- precision="1"
+ precision="3"
bar_min="0.f"
bar_max="40.f"
tick_spacing="10.f"
@@ -632,7 +675,7 @@
label="Simulation Time"
stat="simsimothermsec"
unit_label="ms"
- precision="1"
+ precision="3"
bar_min="0.f"
bar_max="40.f"
tick_spacing="10.f"
@@ -647,7 +690,7 @@
label="Agent Time"
stat="simagentmsec"
unit_label="ms"
- precision="1"
+ precision="3"
bar_min="0.f"
bar_max="40.f"
tick_spacing="10.f"
@@ -662,7 +705,7 @@
label="Images Time"
stat="simimagesmsec"
unit_label="ms"
- precision="1"
+ precision="3"
bar_min="0.f"
bar_max="40.f"
tick_spacing="10.f"
@@ -677,7 +720,7 @@
label="Script Time"
stat="simscriptmsec"
unit_label="ms"
- precision="1"
+ precision="3"
bar_min="0.f"
bar_max="40.f"
tick_spacing="10.f"
@@ -686,6 +729,97 @@
show_bar="false"
show_mean="false" >
</stat_bar>
+
+ <stat_bar
+ name="simsparemsec"
+ label="Spare Time"
+ stat="simsparemsec"
+ unit_label="ms"
+ precision="3"
+ bar_min="0.f"
+ bar_max="40.f"
+ tick_spacing="10.f"
+ label_spacing="20.f"
+ show_per_sec="false"
+ show_bar="false"
+ show_mean="false" >
+ </stat_bar>
+ <!--2nd level time blocks under 'Details' second-->
+ <stat_view
+ name="timedetails"
+ label="Time Details (ms)"
+ show_label="true">
+ <stat_bar
+ name="simsimphysicsstepmsec"
+ label=" Physics Step"
+ stat="simsimphysicsstepmsec"
+ unit_label="ms"
+ precision="3"
+ bar_min="0.f"
+ bar_max="40.f"
+ tick_spacing="10.f"
+ label_spacing="20.f"
+ show_per_sec="false"
+ show_bar="false"
+ show_mean="false" >
+ </stat_bar>
+ <stat_bar
+ name="simsimphysicsshapeupdatemsec"
+ label=" Update Phys Shapes"
+ stat="simsimphysicsshapeupdatemsec"
+ unit_label="ms"
+ precision="3"
+ bar_min="0.f"
+ bar_max="40.f"
+ tick_spacing="10.f"
+ label_spacing="20.f"
+ show_per_sec="false"
+ show_bar="false"
+ show_mean="false" >
+ </stat_bar>
+ <stat_bar
+ name="simsimphysicsothermsec"
+ label=" Physics Other"
+ stat="simsimphysicsothermsec"
+ unit_label="ms"
+ precision="3"
+ bar_min="0.f"
+ bar_max="40.f"
+ tick_spacing="10.f"
+ label_spacing="20.f"
+ show_per_sec="false"
+ show_bar="false"
+ show_mean="false" >
+ </stat_bar>
+ <stat_bar
+ name="simsleepmsec"
+ label=" Sleep Time"
+ stat="simsleepmsec"
+ unit_label="ms"
+ precision="3"
+ bar_min="0.f"
+ bar_max="40.f"
+ tick_spacing="10.f"
+ label_spacing="20.f"
+ show_per_sec="false"
+ show_bar="false"
+ show_mean="false" >
+ </stat_bar>
+ <stat_bar
+ name="simpumpiomsec"
+ label=" Pump IO"
+ stat="simpumpiomsec"
+ unit_label="ms"
+ precision="3"
+ bar_min="0.f"
+ bar_max="40.f"
+ tick_spacing="10.f"
+ label_spacing="20.f"
+ show_per_sec="false"
+ show_bar="false"
+ show_mean="false" >
+ </stat_bar>
+ </stat_view>
</stat_view>
</stat_view>
</container_view>
diff --git a/indra/newview/skins/default/xui/en/floater_sys_well.xml b/indra/newview/skins/default/xui/en/floater_sys_well.xml
index 005952f3f2..ecedb27438 100644
--- a/indra/newview/skins/default/xui/en/floater_sys_well.xml
+++ b/indra/newview/skins/default/xui/en/floater_sys_well.xml
@@ -2,9 +2,6 @@
<floater
legacy_header_height="18"
bevel_style="in"
- left="0"
- top="0"
- follows="right|bottom"
layout="topleft"
name="sys_well_window"
help_topic="notification_chiclet"
@@ -18,6 +15,7 @@
can_resize="true"
can_drag_on_left="false"
can_dock="true"
+ save_dock_state="true"
save_visibility="true"
single_instance="true"
>
diff --git a/indra/newview/skins/default/xui/en/floater_telehub.xml b/indra/newview/skins/default/xui/en/floater_telehub.xml
index da412ed8a0..547613fb67 100644
--- a/indra/newview/skins/default/xui/en/floater_telehub.xml
+++ b/indra/newview/skins/default/xui/en/floater_telehub.xml
@@ -4,7 +4,6 @@
legacy_header_height="18"
height="250"
layout="topleft"
- left="300"
name="telehub"
help_topic="telehub"
title="TELEHUB"
diff --git a/indra/newview/skins/default/xui/en/floater_test_button.xml b/indra/newview/skins/default/xui/en/floater_test_button.xml
index bf0a774e76..9bc05107a2 100644
--- a/indra/newview/skins/default/xui/en/floater_test_button.xml
+++ b/indra/newview/skins/default/xui/en/floater_test_button.xml
@@ -78,7 +78,6 @@
<button
bottom_delta="30"
height="23"
- highlight_color="EmphasisColor"
label="Highlight"
layout="topleft"
name="highlight_color_button" />
diff --git a/indra/newview/skins/default/xui/en/floater_test_layout_stacks.xml b/indra/newview/skins/default/xui/en/floater_test_layout_stacks.xml
new file mode 100644
index 0000000000..f95f21e63a
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_test_layout_stacks.xml
@@ -0,0 +1,206 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<floater
+ can_resize="true"
+ can_close="true"
+ bevel_style="in"
+ height="300"
+ layout="topleft"
+ min_height="40"
+ min_width="420"
+ name="Test Floater"
+ title="LAYOUTSTACK TESTS"
+ width="420">
+ <layout_stack name="test_stack"
+ left="0"
+ top="0"
+ width="100"
+ height="250"
+ follows="left|top|bottom"
+ orientation="vertical">
+ <layout_panel name="flex"
+ auto_resize="true"
+ user_resize="true"
+ bg_alpha_color="blue"
+ height="11"
+ min_height="0"
+ background_visible="true">
+ <text follows="top|left|right" halign="center" text_color="white">flex</text>
+ </layout_panel>
+ <layout_panel name="flex"
+ auto_resize="true"
+ user_resize="true"
+ bg_alpha_color="blue"
+ height="11"
+ min_height="0"
+ background_visible="true">
+ <text follows="top|left|right" halign="center" text_color="white">flex</text>
+ </layout_panel>
+ </layout_stack>
+ <layout_stack name="test_stack"
+ left_pad="5"
+ top="0"
+ width="100"
+ height="250"
+ follows="left|top|bottom"
+ orientation="vertical">
+ <layout_panel name="flex"
+ auto_resize="true"
+ user_resize="true"
+ bg_alpha_color="blue"
+ height="100"
+ background_visible="true">
+ <text follows="top|left|right" halign="center" text_color="white">flex</text>
+ </layout_panel>
+ <layout_panel name="flex"
+ auto_resize="true"
+ user_resize="true"
+ visible="false"
+ bg_alpha_color="blue"
+ height="100"
+ background_visible="true">
+ <text follows="top|left|right" halign="center" text_color="white">flex</text>
+ </layout_panel>
+ <layout_panel name="fixed"
+ auto_resize="false"
+ user_resize="true"
+ height="50"
+ min_height="10"
+ bg_alpha_color="green"
+ background_visible="true">
+ <text follows="top|left|right" halign="center" text_color="black">fixed</text>
+ </layout_panel>
+ <layout_panel name="fixed"
+ auto_resize="false"
+ user_resize="true"
+ height="50"
+ min_height="10"
+ bg_alpha_color="green"
+ background_visible="true">
+ <text follows="top|left|right" halign="center" text_color="black">fixed</text>
+ </layout_panel>
+ <layout_panel name="flex"
+ auto_resize="true"
+ user_resize="true"
+ bg_alpha_color="blue"
+ height="100"
+ background_visible="true">
+ <text follows="top|left|right" halign="center" text_color="white">flex</text>
+ </layout_panel>
+ <layout_panel name="flex"
+ auto_resize="true"
+ user_resize="true"
+ bg_alpha_color="blue"
+ height="100"
+ background_visible="true">
+ <text follows="top|left|right" halign="center" text_color="white">flex</text>
+ </layout_panel>
+ <layout_panel name="flex"
+ auto_resize="true"
+ user_resize="true"
+ bg_alpha_color="blue"
+ height="100"
+ background_visible="true">
+ <text follows="top|left|right" halign="center" text_color="white">flex</text>
+ </layout_panel>
+ <layout_panel name="flex"
+ auto_resize="true"
+ user_resize="true"
+ bg_alpha_color="blue"
+ height="100"
+ visible="true"
+ background_visible="true">
+ <text follows="top|left|right" halign="center" text_color="white">flex</text>
+ </layout_panel>
+ </layout_stack>
+ <layout_stack name="test_stack"
+ left_pad="5"
+ top="0"
+ width="100"
+ height="250"
+ follows="left|top|bottom"
+ orientation="vertical">
+ <layout_panel name="flex"
+ auto_resize="true"
+ user_resize="true"
+ height="11"
+ bg_alpha_color="blue"
+ background_visible="true">
+ <text follows="top|left|right" halign="center" text_color="white">flex</text>
+ </layout_panel>
+ <layout_panel name="fixed"
+ auto_resize="false"
+ user_resize="true"
+ height="50"
+ bg_alpha_color="green"
+ background_visible="true">
+ <text follows="top|left|right" halign="center" text_color="black">fixed</text>
+ </layout_panel>
+ <layout_panel name="flex"
+ auto_resize="true"
+ user_resize="true"
+ bg_alpha_color="blue"
+ height="11"
+ background_visible="true">
+ <text follows="top|left|right" halign="center" text_color="white">flex</text>
+ </layout_panel>
+ </layout_stack>
+ <layout_stack name="test_stack"
+ left_pad="5"
+ top="0"
+ width="100"
+ height="250"
+ follows="left|top|bottom"
+ orientation="vertical">
+ <layout_panel name="fixed"
+ auto_resize="false"
+ user_resize="true"
+ height="50"
+ bg_alpha_color="green"
+ background_visible="true">
+ <text follows="top|left|right" halign="center" text_color="black">fixed</text>
+ </layout_panel>
+ <layout_panel name="fixed"
+ auto_resize="false"
+ user_resize="true"
+ height="50"
+ bg_alpha_color="green"
+ background_visible="true">
+ <text follows="top|left|right" halign="center" text_color="black">fixed</text>
+ </layout_panel>
+ <layout_panel name="fixed"
+ auto_resize="false"
+ user_resize="true"
+ height="50"
+ bg_alpha_color="green"
+ background_visible="true">
+ <text follows="top|left|right" halign="center" text_color="black">fixed</text>
+ </layout_panel>
+ <layout_panel name="flex"
+ auto_resize="true"
+ user_resize="true"
+ bg_alpha_color="blue"
+ height="11"
+ min_height="0"
+ background_visible="true">
+ <text follows="top|left|right" halign="center" text_color="white">flex</text>
+ </layout_panel>
+ <layout_panel name="flex"
+ auto_resize="true"
+ user_resize="true"
+ bg_alpha_color="blue"
+ height="11"
+ min_height="0"
+ background_visible="true">
+ <text follows="top|left|right" halign="center" text_color="white">flex</text>
+ </layout_panel>
+ <layout_panel name="flex"
+ auto_resize="true"
+ user_resize="true"
+ bg_alpha_color="blue"
+ height="11"
+ min_height="0"
+ background_visible="true">
+ <text follows="top|left|right" halign="center" text_color="white">flex</text>
+ </layout_panel>
+ </layout_stack>
+</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_test_toolbar.xml b/indra/newview/skins/default/xui/en/floater_test_toolbar.xml
new file mode 100644
index 0000000000..067c1fed82
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_test_toolbar.xml
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<floater
+ legacy_header_height="18"
+ can_resize="true"
+ height="500"
+ layout="topleft"
+ name="floater_test_toolbar"
+ translate="false"
+ width="500">
+ <toolbar name="test_toolbar_top"
+ button_display_mode="icons_with_text"
+ follows="left|right|top"
+ height="50"
+ width="500"
+ left="0"
+ top="20"
+ min_button_width="0"
+ max_button_width="100"
+ side="top">
+ <command name="avatar"/>
+ <command name="build"/>
+ <command name="chat"/>
+ </toolbar>
+ <toolbar name="test_toolbar_left"
+ button_display_mode="icons_with_text"
+ follows="left|bottom|top"
+ height="380"
+ width="200"
+ left="0"
+ top="70"
+ min_button_width="100"
+ side="left">
+ <command name="avatar"/>
+ <command name="build"/>
+ <command name="chat"/>
+ </toolbar>
+ <toolbar name="test_toolbar_right"
+ button_display_mode="icons_with_text"
+ follows="right|bottom|top"
+ height="380"
+ width="200"
+ right="500"
+ top="70"
+ side="right">
+ <command name="avatar"/>
+ <command name="build"/>
+ <command name="chat"/>
+ </toolbar>
+ <toolbar name="test_toolbar_bottom"
+ button_display_mode="icons_with_text"
+ follows="left|right|bottom"
+ height="50"
+ width="500"
+ left="0"
+ bottom="500"
+ min_button_width="100"
+ side="bottom">
+ <command name="avatar"/>
+ <command name="build"/>
+ <command name="chat"/>
+ </toolbar>
+</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_tools.xml b/indra/newview/skins/default/xui/en/floater_tools.xml
index 9b02f7d273..f9147ea650 100644
--- a/indra/newview/skins/default/xui/en/floater_tools.xml
+++ b/indra/newview/skins/default/xui/en/floater_tools.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater
+ open_positioning="cascading"
legacy_header_height="18"
- follows="left|top|right"
height="580"
layout="topleft"
bg_opaque_image="Window_NoTitle_Foreground"
@@ -515,7 +515,8 @@
image_disabled_selected="Object_Grass"
image_selected="Object_Grass_Selected"
image_unselected="Object_Grass"
- image_overlay_color="Red"
+ image_overlay_color="1 0 0 .75"
+ image_overlay_selected_color="1 0 0 1"
layout="topleft"
left_delta="29"
name="ToolGrass"
@@ -789,6 +790,7 @@
tab_min_width="40"
tab_position="top"
tab_height="25"
+ open_tabs_on_drag_and_drop="true"
top="173"
width="295">
diff --git a/indra/newview/skins/default/xui/en/floater_toybox.xml b/indra/newview/skins/default/xui/en/floater_toybox.xml
new file mode 100644
index 0000000000..72e6187a14
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_toybox.xml
@@ -0,0 +1,114 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<floater
+ can_close="true"
+ can_dock="false"
+ can_minimize="false"
+ can_resize="false"
+ default_tab_group="1"
+ height="375"
+ help_topic="toybox"
+ layout="topleft"
+ legacy_header_height="18"
+ name="Toybox"
+ open_positioning="centered"
+ save_rect="true"
+ single_instance="true"
+ title="TOOLBAR BUTTONS"
+ width="650">
+ <text
+ follows="left|top"
+ font="SansSerifMedium"
+ valign="bottom"
+ halign="left"
+ height="20"
+ layout="topleft"
+ left="20"
+ length="1"
+ name="toybox label 1"
+ right="-20"
+ top="35"
+ type="string">
+ Add or remove buttons by dragging them to or from the toolbars.
+ </text>
+ <text
+ follows="left|top"
+ font="SansSerifMedium"
+ valign="bottom"
+ halign="left"
+ height="20"
+ layout="topleft"
+ left="20"
+ length="1"
+ name="toybox label 2"
+ right="-20"
+ top="55"
+ type="string">
+ Buttons will appear as shown or as icon-only depending on each toolbar's settings.
+ </text>
+ <toolbar
+ bottom="310"
+ button_display_mode="icons_with_text"
+ follows="all"
+ left="20"
+ button_icon_and_text.button_width.max="140"
+ button_icon_and_text.button_width.min="70"
+ name="toybox_toolbar"
+ pad_left="5"
+ pad_right="5"
+ pad_top="5"
+ pad_bottom="5"
+ pad_between="15"
+ read_only="true"
+ right="-20"
+ side="top"
+ top="85">
+ <button_panel background_visible="false" />
+ <button_icon_and_text image_unselected="PushButton_Off"
+ image_selected="PushButton_Off"
+ image_disabled_selected="PushButton_Disabled"
+ image_disabled="PushButton_Disabled"
+ label_color="ButtonLabelColor"
+ label_color_selected="ButtonLabelColor"
+ label_color_disabled="ButtonLabelDisabledColor"
+ label_color_disabled_selected="ButtonLabelDisabledColor"
+ image_color="ButtonImageColor"
+ image_color_disabled="ButtonImageColor"
+ flash_color="ButtonUnselectedFgColor"
+ halign="left"
+ hover_glow_amount="0.15"
+ sound_flags="0"
+ display_pressed_state="false" />
+ </toolbar>
+ <panel
+ bevel_style="none"
+ border="true"
+ bottom="311"
+ follows="left|bottom|right"
+ left="20"
+ right="-20"
+ top="311" />
+ <button
+ follows="left|bottom|right"
+ height="23"
+ label="Clear all toolbars"
+ label_selected="Clear all toolbars"
+ layout="topleft"
+ left="185"
+ name="btn_clear_all"
+ top="330"
+ width="130">
+ <button.commit_callback function="Toybox.ClearAll" />
+ </button>
+ <button
+ follows="left|bottom|right"
+ height="23"
+ label="Restore defaults"
+ label_selected="Restore defaults"
+ layout="topleft"
+ left="335"
+ name="btn_restore_defaults"
+ top="330"
+ width="130">
+ <button.commit_callback function="Toybox.RestoreDefaults" />
+ </button>
+</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_translation_settings.xml b/indra/newview/skins/default/xui/en/floater_translation_settings.xml
new file mode 100644
index 0000000000..a212ce7889
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_translation_settings.xml
@@ -0,0 +1,244 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<floater
+ legacy_header_height="18"
+ height="310"
+ layout="topleft"
+ name="floater_translation_settings"
+ help_topic="translation_settings"
+ save_rect="true"
+ title="CHAT TRANSLATION SETTINGS"
+ width="485">
+
+ <string name="bing_api_key_not_verified">Bing appID not verified. Please try again.</string>
+ <string name="google_api_key_not_verified">Google API key not verified. Please try again.</string>
+
+ <string name="bing_api_key_verified">Bing appID verified.</string>
+ <string name="google_api_key_verified">Google API key verified.</string>
+
+ <check_box
+ height="16"
+ label="Enable machine translation while chatting"
+ layout="topleft"
+ left="10"
+ name="translate_chat_checkbox"
+ top="30"
+ width="20" />
+ <text
+ height="20"
+ follows="left|top"
+ layout="topleft"
+ left="40"
+ name="translate_language_label"
+ top_pad="20"
+ width="130">
+ Translate chat into:
+ </text>
+ <combo_box
+ allow_text_entry="true"
+ follows="left|top"
+ height="23"
+ left_pad="10"
+ max_chars="135"
+ mouse_opaque="true"
+ name="translate_language_combo"
+ top_delta="-5"
+ width="190">
+ <combo_box.item
+ label="System Default"
+ name="System Default Language"
+ value="default" />
+ <combo_box.item
+ label="English"
+ name="English"
+ value="en" />
+ <!-- After "System Default" and "English", please keep the rest of these combo_box.items in alphabetical order by the first character in the string. -->
+ <combo_box.item
+ label="Dansk (Danish)"
+ name="Danish"
+ value="da" />
+ <combo_box.item
+ label="Deutsch (German)"
+ name="German"
+ value="de" />
+ <combo_box.item
+ label="Español (Spanish)"
+ name="Spanish"
+ value="es" />
+ <combo_box.item
+ label="Français (French)"
+ name="French"
+ value="fr" />
+ <combo_box.item
+ label="Italiano (Italian)"
+ name="Italian"
+ value="it" />
+ <combo_box.item
+ label="Magyar (Hungarian)"
+ name="Hungarian"
+ value="hu" />
+ <combo_box.item
+ label="Nederlands (Dutch)"
+ name="Dutch"
+ value="nl" />
+ <combo_box.item
+ label="Polski (Polish)"
+ name="Polish"
+ value="pl" />
+ <combo_box.item
+ label="Português (Portuguese)"
+ name="Portugese"
+ value="pt" />
+ <combo_box.item
+ label="РуÑÑкий (Russian)"
+ name="Russian"
+ value="ru" />
+ <combo_box.item
+ label="Türkçe (Turkish)"
+ name="Turkish"
+ value="tr" />
+ <combo_box.item
+ label="УкраїнÑька (Ukrainian)"
+ name="Ukrainian"
+ value="uk" />
+ <combo_box.item
+ label="中文 (正體) (Chinese)"
+ name="Chinese"
+ value="zh" />
+ <combo_box.item
+ label="日本語 (Japanese)"
+ name="Japanese"
+ value="ja" />
+ <combo_box.item
+ label="한국어 (Korean)"
+ name="Korean"
+ value="ko" />
+ </combo_box>
+
+ <text
+ follows="top|left|right"
+ height="15"
+ layout="topleft"
+ left="40"
+ name="tip"
+ top_pad="20"
+ width="330"
+ wrap="true">
+ Choose translation service:
+ </text>
+
+ <radio_group
+ follows="top|left"
+ height="80"
+ layout="topleft"
+ left_delta="10"
+ name="translation_service_rg"
+ top_pad="20"
+ width="320">
+ <radio_item
+ initial_value="bing"
+ label="Bing Translator"
+ layout="topleft"
+ name="bing" />
+ <radio_item
+ initial_value="google"
+ label="Google Translate"
+ layout="topleft"
+ name="google"
+ top_pad="55" />
+ </radio_group>
+
+ <text
+ type="string"
+ length="1"
+ follows="top|right"
+ height="20"
+ layout="topleft"
+ left="70"
+ name="bing_api_key_label"
+ top_pad="-55"
+ width="85">
+ Bing [http://www.bing.com/developers/createapp.aspx AppID]:
+ </text>
+ <line_editor
+ default_text="Enter Bing AppID and click &quot;Verify&quot;"
+ follows="top|left"
+ height="20"
+ layout="topleft"
+ left_pad="10"
+ max_length_chars="50"
+ top_delta="-4"
+ name="bing_api_key"
+ width="210" />
+ <button
+ follows="left|top"
+ height="23"
+ label="Verify"
+ layout="topleft"
+ left_pad="10"
+ name="verify_bing_api_key_btn"
+ top_delta="-2"
+ width="90" />
+
+ <text
+ follows="top|right"
+ height="20"
+ layout="topleft"
+ left="70"
+ length="1"
+ name="google_api_key_label"
+ top_pad="50"
+ type="string"
+ width="85">
+ Google [http://code.google.com/apis/language/translate/v2/getting_started.html#auth API key]:
+ </text>
+ <line_editor
+ default_text="Enter Google API key and click &quot;Verify&quot;"
+ follows="top|left"
+ height="20"
+ layout="topleft"
+ left_pad="10"
+ max_length_chars="50"
+ top_delta="-4"
+ name="google_api_key"
+ width="210" />
+ <button
+ follows="left|top"
+ height="23"
+ label="Verify"
+ layout="topleft"
+ left_pad="10"
+ name="verify_google_api_key_btn"
+ top_delta="-2"
+ width="90" />
+
+ <text
+ follows="top|right"
+ height="20"
+ layout="topleft"
+ left="185"
+ length="1"
+ name="google_links_text"
+ top_delta="-23"
+ type="string"
+ width="100">
+ [http://code.google.com/apis/language/translate/v2/pricing.html Pricing] | [https://code.google.com/apis/console Stats]
+ </text>
+
+ <button
+ follows="left|top"
+ height="23"
+ label="OK"
+ layout="topleft"
+ right="-120"
+ name="ok_btn"
+ top="-30"
+ width="100" />
+ <button
+ follows="left|top"
+ height="23"
+ label="Cancel"
+ layout="topleft"
+ left_pad="10"
+ name="cancel_btn"
+ width="100" />
+</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_ui_preview.xml b/indra/newview/skins/default/xui/en/floater_ui_preview.xml
index 3921cfcd2c..06d4327293 100644
--- a/indra/newview/skins/default/xui/en/floater_ui_preview.xml
+++ b/indra/newview/skins/default/xui/en/floater_ui_preview.xml
@@ -22,6 +22,7 @@ or specifying its path in the "Editor Path" field.</string>
layout="topleft"
left="0"
mouse_opaque="false"
+ default_tab_group="1"
name="main_panel"
right="750"
top="0">
@@ -196,6 +197,7 @@ or specifying its path in the "Editor Path" field.</string>
left="10"
name="name_list"
right="-10"
+ tab_group="1"
search_column="1"
top="80">
<scroll_list.columns
diff --git a/indra/newview/skins/default/xui/en/floater_voice_controls.xml b/indra/newview/skins/default/xui/en/floater_voice_controls.xml
index f017a7ace6..cea19ec75c 100644
--- a/indra/newview/skins/default/xui/en/floater_voice_controls.xml
+++ b/indra/newview/skins/default/xui/en/floater_voice_controls.xml
@@ -1,15 +1,17 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater
+ open_positioning="cascading"
can_resize="true"
can_minimize="true"
- can_close="false"
+ can_close="true"
+ chrome="true"
height="205"
layout="topleft"
min_height="124"
min_width="190"
name="floater_voice_controls"
help_topic="floater_voice_controls"
- title="Voice Controls"
+ title="VOICE CONTROLS"
save_dock_state="true"
save_visibility="true"
save_rect="true"
@@ -17,19 +19,19 @@
width="282">
<string
name="title_nearby">
- NEARBY VOICE
+ VOICE SETTINGS
</string>
<string
name="title_group">
- Group Call with [GROUP]
+ GROUP CALL WITH [GROUP]
</string>
<string
name="title_adhoc">
- Conference Call
+ CONFERENCE CALL
</string>
<string
name="title_peer_2_peer">
- Call with [NAME]
+ CALL WITH [NAME]
</string>
<string
name="no_one_near">
@@ -47,9 +49,9 @@
width="263">
<layout_panel
follows="top|left|right"
- user_resize="false"
auto_resize="false"
layout="topleft"
+ min_height="20"
height="20"
name="my_panel">
<avatar_icon
@@ -86,7 +88,7 @@
visible="true"
width="20" />
</layout_panel>
- <layout_panel name="leave_call_panel" height="26" auto_resize="false">
+ <layout_panel name="leave_call_panel" height="26" min_height="26" auto_resize="false">
<layout_stack
clip="true"
follows="left|top|right"
@@ -107,7 +109,6 @@
</layout_panel>
<layout_panel
auto_resize="false"
- user_resize="false"
follows="top|right"
height="23"
visible="true"
@@ -130,7 +131,7 @@
top_pad="0"
height="132"
name="callers_panel"
- user_resize="false"
+ auto_resize="true"
width="280">
<avatar_list
follows="all"
diff --git a/indra/newview/skins/default/xui/en/floater_voice_effect.xml b/indra/newview/skins/default/xui/en/floater_voice_effect.xml
index 2c754cd8d0..77fb21e27c 100644
--- a/indra/newview/skins/default/xui/en/floater_voice_effect.xml
+++ b/indra/newview/skins/default/xui/en/floater_voice_effect.xml
@@ -7,7 +7,6 @@
help_topic="voice_effects"
title="VOICE MORPHING"
background_visible="true"
- follows="all"
label="Places"
layout="topleft"
min_height="360"
diff --git a/indra/newview/skins/default/xui/en/floater_web_content.xml b/indra/newview/skins/default/xui/en/floater_web_content.xml
index 0eda9ae62a..cea10adca8 100644
--- a/indra/newview/skins/default/xui/en/floater_web_content.xml
+++ b/indra/newview/skins/default/xui/en/floater_web_content.xml
@@ -9,7 +9,6 @@
name="floater_web_content"
help_topic="floater_web_content"
save_rect="true"
- auto_tile="true"
title=""
initial_mime_type="text/html"
width="780">
@@ -32,7 +31,6 @@
min_height="20"
name="nav_controls"
top="400"
- user_resize="false"
width="770">
<button
image_overlay="Arrow_Left_Off"
@@ -161,7 +159,6 @@
left_delta="0"
name="external_controls"
top_delta="0"
- user_resize="false"
auto_resize="true"
width="585">
<web_browser
@@ -174,8 +171,7 @@
</layout_panel>
<layout_panel name="status_bar"
height="23"
- auto_resize="false"
- user_resize="false">
+ auto_resize="false">
<text
type="string"
length="200"
diff --git a/indra/newview/skins/default/xui/en/floater_web_profile.xml b/indra/newview/skins/default/xui/en/floater_web_profile.xml
new file mode 100644
index 0000000000..d0225f78a9
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_web_profile.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<floater name="floater_web_profile"
+ help_topic="web_profile"
+ width="780"
+ height="775"
+ filename="floater_web_content.xml"/> \ No newline at end of file
diff --git a/indra/newview/skins/default/xui/en/floater_world_map.xml b/indra/newview/skins/default/xui/en/floater_world_map.xml
index 019e7cd032..56d79f62c7 100644
--- a/indra/newview/skins/default/xui/en/floater_world_map.xml
+++ b/indra/newview/skins/default/xui/en/floater_world_map.xml
@@ -2,7 +2,7 @@
<floater
legacy_header_height="18"
can_resize="true"
- open_centered="true"
+ open_positioning="centered"
height="600"
layout="topleft"
min_height="520"
@@ -468,7 +468,7 @@
left="3"
top_pad="7"
mouse_opaque="true"
- name="region_icon"
+ name="location_icon"
width="16" />
<search_editor
follows="top|right"
diff --git a/indra/newview/skins/default/xui/en/inspect_remote_object.xml b/indra/newview/skins/default/xui/en/inspect_remote_object.xml
index ef3dd844cd..e83257d2a0 100644
--- a/indra/newview/skins/default/xui/en/inspect_remote_object.xml
+++ b/indra/newview/skins/default/xui/en/inspect_remote_object.xml
@@ -36,7 +36,7 @@
height="16"
left="8"
name="object_owner_label"
- width="55"
+ width="65"
top_pad="12">
Owner:
</text>
diff --git a/indra/newview/skins/default/xui/en/main_view.xml b/indra/newview/skins/default/xui/en/main_view.xml
index a7d1aa963c..a87027a113 100644
--- a/indra/newview/skins/default/xui/en/main_view.xml
+++ b/indra/newview/skins/default/xui/en/main_view.xml
@@ -11,130 +11,66 @@
<layout_stack border_size="0"
follows="all"
mouse_opaque="false"
- height="749"
+ height="768"
name="menu_stack"
orientation="vertical"
- top="19">
+ top="0">
+ <layout_panel mouse_opaque="true"
+ follows="left|right|top"
+ name="status_bar_container"
+ tab_stop="false"
+ height="19"
+ left="0"
+ top="0"
+ width="1024"
+ auto_resize="false"
+ visible="true">
+ <view mouse_opaque="false"
+ follows="all"
+ name="menu_bar_holder"
+ left="0"
+ top="0"
+ width="1024"
+ height="19"/>
+ </layout_panel>
<layout_panel auto_resize="false"
- height="60"
+ height="34"
mouse_opaque="false"
name="nav_bar_container"
tab_stop="false"
width="1024"
- user_resize="false"
- visible="false">
- </layout_panel>
- <layout_panel auto_resize="true"
+ visible="false"/>
+ <layout_panel auto_resize="true"
follows="all"
height="500"
layout="topleft"
mouse_opaque="false"
tab_stop="false"
- name="hud"
+ name="world_panel"
width="1024">
- <layout_stack border_size="0"
- follows="all"
- height="500"
- left="0"
- mouse_opaque="false"
- name="hud_stack"
- orientation="horizontal"
- top="0"
- width="1024">
- <layout_panel auto_resize="true"
- follows="all"
- height="500"
- layout="topleft"
- mouse_opaque="false"
- tab_stop="false"
- name="non_side_tray_view"
- user_resize="false"
- width="500">
- <view bottom="500"
- follows="all"
- height="500"
- left="0"
- mouse_opaque="false"
- name="world_view_rect"
- width="500"/>
- <layout_stack border_size="0"
- bottom="500"
- follows="all"
- height="500"
- left="0"
- mouse_opaque="false"
- name="world_stack"
- orientation="vertical">
- <layout_panel auto_resize="true"
- follows="all"
- height="500"
- layout="topleft"
- tab_stop="false"
- mouse_opaque="false"
- user_resize="false"
- name="hud container"
- width="500">
- <view top="0"
- follows="all"
- height="500"
- left="0"
- mouse_opaque="false"
- name="floater_snap_region"
- width="500"/>
- <panel follows="left|top"
- height="19"
- left="0"
- mouse_opaque="false"
- name="topinfo_bar_container"
- tab_stop="false"
- top="0"
- visible="false"
- width="1024"/>
- <panel follows="right|top|bottom"
- height="500"
- mouse_opaque="false"
- name="side_bar_tabs"
- right="500"
- tab_stop="false"
- top="0"
- width="32"/>
- <panel bottom="500"
- follows="left|right|bottom"
- height="25"
- left="0"
- mouse_opaque="false"
- tab_stop="false"
- name="stand_stop_flying_container"
- visible="false"
- width="500"/>
- </layout_panel>
- <layout_panel auto_resize="false"
- min_height="33"
- height="33"
- mouse_opaque="false"
- name="bottom_tray_container"
- visible="false"/>
- </layout_stack>
- </layout_panel>
- <!-- side tray -->
- <layout_panel auto_resize="false"
- follows="top|bottom"
- height="500"
- min_width="333"
- mouse_opaque="false"
- tab_stop="false"
- name="side_tray_container"
- user_resize="false"
- visible="false"
- width="333"/>
- </layout_stack>
+ <view top="0"
+ follows="all"
+ height="500"
+ left="0"
+ mouse_opaque="false"
+ name="world_view_rect"
+ width="1024"/>
+ <panel follows="left|top|right"
+ height="19"
+ left="0"
+ mouse_opaque="false"
+ name="topinfo_bar_container"
+ tab_stop="false"
+ top="0"
+ visible="false"
+ width="1024"/>
<panel top="0"
- follows="all"
- height="500"
- mouse_opaque="false"
- name="login_panel_holder"
- width="1024"/>
-
+ left="0"
+ follows="all"
+ height="500"
+ mouse_opaque="false"
+ name="login_panel_holder"
+ width="1024"/>
<debug_view follows="all"
left="0"
top="0"
@@ -142,45 +78,27 @@
height="500"
name="DebugView"
width="1024"/>
-
- <panel follows="all"
+ <floater_view follows="all"
height="500"
left="0"
mouse_opaque="false"
- name="floater_view_holder"
+ name="Floater View"
tab_group="-1"
tab_stop="false"
top="0"
- width="1024">
- <floater_view follows="all"
- height="500"
- left="0"
- mouse_opaque="false"
- name="Floater View"
- tab_group="-1"
- tab_stop="false"
- top="0"
- width="1024"/>
- </panel>
+ width="1024"/>
+ <panel name="toolbar_view_holder"
+ follows="all"
+ layout="topleft"
+ height="500"
+ width="1024"
+ top="0"
+ left="0"
+ mouse_opaque="false"
+ tab_stop="false"/>
</layout_panel>
</layout_stack>
- <panel mouse_opaque="false"
- follows="left|right|top"
- name="status_bar_container"
- tab_stop="false"
- height="19"
- left="0"
- top="0"
- width="1024"
- visible="false"/>
-
- <view mouse_opaque="false"
- follows="all"
- name="menu_bar_holder"
- left="0"
- top="0"
- width="1024"
- height="768"/>
+
<panel top="0"
follows="all"
mouse_opaque="false"
diff --git a/indra/newview/skins/default/xui/en/menu_bottomtray.xml b/indra/newview/skins/default/xui/en/menu_bottomtray.xml
deleted file mode 100644
index 07dabe1909..0000000000
--- a/indra/newview/skins/default/xui/en/menu_bottomtray.xml
+++ /dev/null
@@ -1,163 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<menu
- height="201"
- layout="topleft"
- left="100"
- mouse_opaque="false"
- name="hide_camera_move_controls_menu"
- top="624"
- visible="false"
- width="128">
- <menu_item_check
- label="Speak Button"
- layout="topleft"
- name="EnableVoiceChat">
- <menu_item_check.on_click
- function="ToggleControl"
- parameter="EnableVoiceChat" />
- <menu_item_check.on_check
- function="CheckControl"
- parameter="EnableVoiceChat" />
- </menu_item_check>
- <menu_item_check
- label="Gesture button"
- layout="topleft"
- name="ShowGestureButton">
- <menu_item_check.on_click
- function="ToggleControl"
- parameter="ShowGestureButton" />
- <menu_item_check.on_check
- function="CheckControl"
- parameter="ShowGestureButton" />
- </menu_item_check>
- <menu_item_check
- label="Move button"
- layout="topleft"
- name="ShowMoveButton">
- <menu_item_check.on_click
- function="ToggleControl"
- parameter="ShowMoveButton" />
- <menu_item_check.on_check
- function="CheckControl"
- parameter="ShowMoveButton" />
- </menu_item_check>
- <menu_item_check
- label="View button"
- layout="topleft"
- name="ShowCameraButton">
- <menu_item_check.on_click
- function="ToggleControl"
- parameter="ShowCameraButton" />
- <menu_item_check.on_check
- function="CheckControl"
- parameter="ShowCameraButton" />
- </menu_item_check>
- <menu_item_check
- label="Snapshot button"
- layout="topleft"
- name="ShowSnapshotButton">
- <menu_item_check.on_click
- function="ToggleControl"
- parameter="ShowSnapshotButton" />
- <menu_item_check.on_check
- function="CheckControl"
- parameter="ShowSnapshotButton" />
- </menu_item_check>
- <menu_item_check
- label="Build button"
- layout="topleft"
- name="ShowBuildButton">
- <menu_item_check.on_click
- function="ToggleControl"
- parameter="ShowBuildButton" />
- <menu_item_check.on_check
- function="CheckControl"
- parameter="ShowBuildButton" />
- </menu_item_check>
- <menu_item_check
- label="Search button"
- layout="topleft"
- name="ShowSearchButton">
- <menu_item_check.on_click
- function="ToggleControl"
- parameter="ShowSearchButton" />
- <menu_item_check.on_check
- function="CheckControl"
- parameter="ShowSearchButton" />
- </menu_item_check>
- <menu_item_check
- label="Map button"
- layout="topleft"
- name="ShowWorldMapButton">
- <menu_item_check.on_click
- function="ToggleControl"
- parameter="ShowWorldMapButton" />
- <menu_item_check.on_check
- function="CheckControl"
- parameter="ShowWorldMapButton" />
- </menu_item_check>
- <menu_item_check
- label="Mini-Map button"
- layout="topleft"
- name="ShowMiniMapButton">
- <menu_item_check.on_click
- function="ToggleControl"
- parameter="ShowMiniMapButton" />
- <menu_item_check.on_check
- function="CheckControl"
- parameter="ShowMiniMapButton" />
- </menu_item_check>
- <menu_item_separator
- name="Separator" />
- <menu_item_call
- label="Cut"
- name="NearbyChatBar_Cut">
- <menu_item_call.on_click
- function="NearbyChatBar.Action"
- parameter="cut" />
- <menu_item_call.on_enable
- function="NearbyChatBar.EnableMenuItem"
- parameter="can_cut" />
- </menu_item_call>
- <menu_item_call
- label="Copy"
- name="NearbyChatBar_Copy">
- <menu_item_call.on_click
- function="NearbyChatBar.Action"
- parameter="copy" />
- <menu_item_call.on_enable
- function="NearbyChatBar.EnableMenuItem"
- parameter="can_copy" />
- </menu_item_call>
- <menu_item_call
- label="Paste"
- name="NearbyChatBar_Paste">
- <menu_item_call.on_click
- function="NearbyChatBar.Action"
- parameter="paste" />
- <menu_item_call.on_enable
- function="NearbyChatBar.EnableMenuItem"
- parameter="can_paste" />
- </menu_item_call>
- <menu_item_call
- label="Delete"
- name="NearbyChatBar_Delete">
- <menu_item_call.on_click
- function="NearbyChatBar.Action"
- parameter="delete" />
- <menu_item_call.on_enable
- function="NearbyChatBar.EnableMenuItem"
- parameter="can_delete" />
- </menu_item_call>
- <menu_item_call
- label="Select All"
- name="NearbyChatBar_Select_All">
- <menu_item_call.on_click
- function="NearbyChatBar.Action"
- parameter="select_all" />
- <menu_item_call.on_enable
- function="NearbyChatBar.EnableMenuItem"
- parameter="can_select_all" />
- </menu_item_call>
-
-</menu>
diff --git a/indra/newview/skins/default/xui/en/menu_edit.xml b/indra/newview/skins/default/xui/en/menu_edit.xml
index fab76c497c..99061e089a 100644
--- a/indra/newview/skins/default/xui/en/menu_edit.xml
+++ b/indra/newview/skins/default/xui/en/menu_edit.xml
@@ -6,6 +6,7 @@
<menu_item_call
label="Undo"
name="Undo"
+ allow_key_repeat="true"
shortcut="control|Z">
<menu_item_call.on_click
function="Edit.Undo" />
@@ -15,6 +16,7 @@
<menu_item_call
label="Redo"
name="Redo"
+ allow_key_repeat="true"
shortcut="control|Y">
<menu_item_call.on_click
function="Edit.Redo" />
@@ -43,6 +45,7 @@
<menu_item_call
label="Paste"
name="Paste"
+ allow_key_repeat="true"
shortcut="control|V">
<menu_item_call.on_click
function="Edit.Paste" />
diff --git a/indra/newview/skins/default/xui/en/menu_hide_navbar.xml b/indra/newview/skins/default/xui/en/menu_hide_navbar.xml
index 3f38d734b9..b517fd7957 100644
--- a/indra/newview/skins/default/xui/en/menu_hide_navbar.xml
+++ b/indra/newview/skins/default/xui/en/menu_hide_navbar.xml
@@ -9,7 +9,7 @@
visible="false"
width="128">
<menu_item_check
- label="Show Navigation Bar"
+ label="Show Navigation &amp; Favorites Bar"
layout="topleft"
name="ShowNavbarNavigationPanel">
<on_click
@@ -20,17 +20,6 @@
parameter="ShowNavbarNavigationPanel" />
</menu_item_check>
<menu_item_check
- label="Show Favorites Bar"
- layout="topleft"
- name="ShowNavbarFavoritesPanel">
- <on_click
- function="ToggleControl"
- parameter="ShowNavbarFavoritesPanel" />
- <on_check
- function="CheckControl"
- parameter="ShowNavbarFavoritesPanel" />
- </menu_item_check>
- <menu_item_check
label="Show Mini-Location Bar"
layout="topleft"
name="ShowMiniLocationPanel">
diff --git a/indra/newview/skins/default/xui/en/menu_inspect_object_gear.xml b/indra/newview/skins/default/xui/en/menu_inspect_object_gear.xml
index f818ebe2d7..63e154697b 100644
--- a/indra/newview/skins/default/xui/en/menu_inspect_object_gear.xml
+++ b/indra/newview/skins/default/xui/en/menu_inspect_object_gear.xml
@@ -114,6 +114,15 @@
function="Object.EnableMute" />
</menu_item_call>
<menu_item_call
+ label="Unblock"
+ layout="topleft"
+ name="unblock">
+ <menu_item_call.on_click
+ function="Object.Mute" />
+ <menu_item_call.on_visible
+ function="Object.EnableUnmute" />
+ </menu_item_call>
+ <menu_item_call
label="Zoom In"
layout="topleft"
name="zoom_in">
diff --git a/indra/newview/skins/default/xui/en/menu_inventory.xml b/indra/newview/skins/default/xui/en/menu_inventory.xml
index fb85e5278a..ef4a1bc061 100644
--- a/indra/newview/skins/default/xui/en/menu_inventory.xml
+++ b/indra/newview/skins/default/xui/en/menu_inventory.xml
@@ -686,12 +686,12 @@
parameter="copy_to_outbox" />
</menu_item_call>
<menu_item_call
- label="Move to Merchant Outbox"
+ label="Send to Marketplace"
layout="topleft"
- name="Merchant Move">
+ name="Marketplace Send">
<menu_item_call.on_click
function="Inventory.DoToSelected"
- parameter="move_to_outbox" />
+ parameter="send_to_marketplace" />
</menu_item_call>
<menu_item_call
label="--no options--"
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 0f42000ae7..e91f5af3d5 100644
--- a/indra/newview/skins/default/xui/en/menu_inventory_add.xml
+++ b/indra/newview/skins/default/xui/en/menu_inventory_add.xml
@@ -3,6 +3,7 @@
layout="topleft"
left="0"
mouse_opaque="false"
+ can_tear_off="true"
name="menu_inventory_add"
visible="false">
<menu
diff --git a/indra/newview/skins/default/xui/en/menu_login.xml b/indra/newview/skins/default/xui/en/menu_login.xml
index 4c4ff3e5c4..101e104eab 100644
--- a/indra/newview/skins/default/xui/en/menu_login.xml
+++ b/indra/newview/skins/default/xui/en/menu_login.xml
@@ -13,7 +13,7 @@
tear_off="true"
name="File">
<menu_item_call
- label="Preferences"
+ label="Preferences..."
name="Preferences..."
shortcut="control|P">
<menu_item_call.on_click
@@ -93,14 +93,6 @@
parameter="ui_preview" />
</menu_item_call>
<menu_item_separator />
- <!-- Broken
- <menu_item_call
- label="Show Side Tray"
- name="Show Side Tray">
- <menu_item_call.on_click
- function="Advanced.ShowSideTray" />
- </menu_item_call>
- -->
<menu
create_jump_keys="true"
label="UI Tests"
@@ -175,13 +167,6 @@
function="Floater.Show"
parameter="message_critical" />
</menu_item_call>
- <menu_item_call
- label="Media Browser Test"
- name="Web Browser Test">
- <menu_item_call.on_click
- function="Advanced.WebBrowserTest"
- parameter="http://join.secondlife.com/"/>
- </menu_item_call>
<menu_item_call
label="Web Content Floater Debug Test"
name="Web Content Floater Debug Test">
@@ -189,7 +174,58 @@
function="Advanced.WebContentTest"
parameter="http://google.com"/>
</menu_item_call>
- <menu_item_check
+ <menu
+ create_jump_keys="true"
+ label="Set Logging Level"
+ name="Set Logging Level"
+ tear_off="true">
+ <menu_item_check
+ label="Debug">
+ <menu_item_check.on_check
+ function="Develop.CheckLoggingLevel"
+ parameter="0" />
+ <menu_item_check.on_click
+ function="Develop.SetLoggingLevel"
+ parameter="0" />
+ </menu_item_check>
+ <menu_item_check
+ label="Info">
+ <menu_item_check.on_check
+ function="Develop.CheckLoggingLevel"
+ parameter="1" />
+ <menu_item_check.on_click
+ function="Develop.SetLoggingLevel"
+ parameter="1" />
+ </menu_item_check>
+ <menu_item_check
+ label="Warning">
+ <menu_item_check.on_check
+ function="Develop.CheckLoggingLevel"
+ parameter="2" />
+ <menu_item_check.on_click
+ function="Develop.SetLoggingLevel"
+ parameter="2" />
+ </menu_item_check>
+ <menu_item_check
+ label="Error">
+ <menu_item_check.on_check
+ function="Develop.CheckLoggingLevel"
+ parameter="3" />
+ <menu_item_check.on_click
+ function="Develop.SetLoggingLevel"
+ parameter="3" />
+ </menu_item_check>
+ <menu_item_check
+ label="None">
+ <menu_item_check.on_check
+ function="Develop.CheckLoggingLevel"
+ parameter="4" />
+ <menu_item_check.on_click
+ function="Develop.SetLoggingLevel"
+ parameter="4" />
+ </menu_item_check>
+ </menu>
+ <menu_item_check
label="Show Grid Picker"
name="Show Grid Picker"
visible="false"
diff --git a/indra/newview/skins/default/xui/en/menu_mode_change.xml b/indra/newview/skins/default/xui/en/menu_mode_change.xml
deleted file mode 100644
index 87d1a0a7a2..0000000000
--- a/indra/newview/skins/default/xui/en/menu_mode_change.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<toggleable_menu
- name="Mode Change">
- <menu_item_check
- label="Basic"
- name="BasicMode">
- <on_check
- function="CheckSessionSettings"
- parameter="settings_minimal.xml" />
- <on_click
- function="ChangeMode"
- parameter="basic"/>
- </menu_item_check>
- <menu_item_check
- label="Advanced"
- name="AdvancedMode">
- <on_check
- function="CheckSessionSettings"
- parameter="" />
- <on_click
- function="ChangeMode"
- parameter="advanced"/>
- </menu_item_check>
- </toggleable_menu>
diff --git a/indra/newview/skins/default/xui/en/menu_people_friends_view_sort.xml b/indra/newview/skins/default/xui/en/menu_people_friends_view_sort.xml
index 29eeb93ac1..b452f96e7a 100644
--- a/indra/newview/skins/default/xui/en/menu_people_friends_view_sort.xml
+++ b/indra/newview/skins/default/xui/en/menu_people_friends_view_sort.xml
@@ -42,6 +42,6 @@
</menu_item_check>
<menu_item_separator layout="topleft" />
<menu_item_call name="show_blocked_list" label="Show Blocked Residents &amp; Objects">
- <menu_item_call.on_click function="SideTray.ShowPanel" parameter="panel_block_list_sidetray" />
+ <menu_item_call.on_click function="People.Friends.ViewSort.Action" parameter="panel_block_list_sidetray" />
</menu_item_call>
</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/en/menu_people_nearby_view_sort.xml b/indra/newview/skins/default/xui/en/menu_people_nearby_view_sort.xml
index 65bd2793b6..614dd693c5 100644
--- a/indra/newview/skins/default/xui/en/menu_people_nearby_view_sort.xml
+++ b/indra/newview/skins/default/xui/en/menu_people_nearby_view_sort.xml
@@ -52,6 +52,6 @@
</menu_item_check>
<menu_item_separator layout="topleft" />
<menu_item_call name="show_blocked_list" label="Show Blocked Residents &amp; Objects">
- <menu_item_call.on_click function="SideTray.ShowPanel" userdata="panel_block_list_sidetray" />
+ <menu_item_call.on_click function="People.Nearby.ViewSort.Action" userdata="panel_block_list_sidetray" />
</menu_item_call>
</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/en/menu_people_recent_view_sort.xml b/indra/newview/skins/default/xui/en/menu_people_recent_view_sort.xml
index 0634e3bd3b..485a5a658c 100644
--- a/indra/newview/skins/default/xui/en/menu_people_recent_view_sort.xml
+++ b/indra/newview/skins/default/xui/en/menu_people_recent_view_sort.xml
@@ -34,6 +34,6 @@
</menu_item_check>
<menu_item_separator layout="topleft" />
<menu_item_call name="show_blocked_list" label="Show Blocked Residents &amp; Objects">
- <menu_item_call.on_click function="SideTray.ShowPanel" userdata="panel_block_list_sidetray" />
+ <menu_item_call.on_click function="People.Recent.ViewSort.Action" userdata="panel_block_list_sidetray" />
</menu_item_call>
</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/en/menu_toolbars.xml b/indra/newview/skins/default/xui/en/menu_toolbars.xml
new file mode 100644
index 0000000000..fbe40a7244
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/menu_toolbars.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<context_menu
+ layout="topleft"
+ name="Toolbars Popup"
+ visible="false">
+ <menu_item_call label="Remove this button"
+ layout="topleft"
+ name="Remove button">
+ <menu_item_call.on_click function="Toolbars.RemoveSelectedCommand" />
+ </menu_item_call>
+ <menu_item_separator layout="topleft" />
+ <menu_item_call label="Toolbar buttons..."
+ layout="topleft"
+ name="Choose Buttons">
+ <menu_item_call.on_click function="Floater.Show"
+ parameter="toybox" />
+ </menu_item_call>
+ <menu_item_separator layout="topleft" />
+ <menu_item_check label="Icons and labels"
+ layout="topleft"
+ name="icons_with_text">
+ <on_click function="Toolbars.EnableSetting"
+ parameter="icons_with_text" />
+ <on_check function="Toolbars.CheckSetting"
+ parameter="icons_with_text" />
+ </menu_item_check>
+ <menu_item_check label="Icons only"
+ layout="topleft"
+ name="icons_only">
+ <on_click function="Toolbars.EnableSetting"
+ parameter="icons_only" />
+ <on_check function="Toolbars.CheckSetting"
+ parameter="icons_only" />
+ </menu_item_check>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml
index 16f48f3a4e..1d11abcf73 100644
--- a/indra/newview/skins/default/xui/en/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/en/menu_viewer.xml
@@ -8,8 +8,170 @@
label="Me"
name="Me"
tear_off="true">
+ <menu_item_call
+ label="Profile..."
+ name="Profile">
+ <menu_item_call.on_click
+ function="ShowAgentProfile"
+ parameter="agent" />
+ </menu_item_call>
+ <menu_item_call
+ label="Appearance..."
+ name="ChangeOutfit">
+ <menu_item_call.on_click
+ function="CustomizeAvatar" />
+ <menu_item_call.on_enable
+ function="Edit.EnableCustomizeAvatar" />
+ </menu_item_call>
+ <menu_item_call
+ label="Choose an avatar..."
+ name="Avatar Picker">
+ <menu_item_call.on_click
+ function="Floater.ToggleOrBringToFront"
+ parameter="avatar" />
+ </menu_item_call>
+ <menu_item_separator/>
+ <menu_item_check
+ label="Inventory..."
+ name="Inventory"
+ shortcut="control|I"
+ visible="true">
+ <menu_item_check.on_check
+ function="Floater.Visible"
+ parameter="inventory" />
+ <menu_item_check.on_click
+ function="Floater.Toggle"
+ parameter="inventory" />
+ </menu_item_check>
+ <menu_item_call
+ label="New Inventory Window"
+ name="NewInventoryWindow"
+ shortcut="control|shift|I"
+ visible="false">
+ <menu_item_call.on_click
+ function="Inventory.NewWindow"
+ parameter="" />
+ </menu_item_call>
+ <menu_item_call
+ label="Places..."
+ name="Places">
+ <menu_item_call.on_click
+ function="Floater.ToggleOrBringToFront"
+ parameter="places" />
+ </menu_item_call>
+ <menu_item_call
+ label="Picks..."
+ name="Picks">
+ <menu_item_call.on_click
+ function="Floater.ToggleOrBringToFront"
+ parameter="picks" />
+ </menu_item_call>
+ <menu_item_separator/>
+ <menu_item_call
+ label="Camera Controls..."
+ name="Camera Controls">
+ <menu_item_call.on_click
+ function="Floater.ToggleOrBringToFront"
+ parameter="camera" />
+ </menu_item_call>
+ <menu
+ create_jump_keys="true"
+ label="Movement"
+ name="Movement"
+ tear_off="true">
<menu_item_call
- label="Preferences"
+ label="Sit Down"
+ layout="topleft"
+ shortcut="alt|shift|S"
+ name="Sit Down Here">
+ <menu_item_call.on_click
+ function="Self.SitDown"
+ parameter="" />
+ <menu_item_call.on_enable
+ function="Self.EnableSitDown" />
+ </menu_item_call>
+ <menu_item_check
+ label="Fly"
+ name="Fly"
+ shortcut="Home">
+ <menu_item_check.on_check
+ function="Agent.getFlying" />
+ <menu_item_check.on_click
+ function="Agent.toggleFlying" />
+ <menu_item_check.on_enable
+ function="Agent.enableFlying" />
+ </menu_item_check>
+ <menu_item_check
+ label="Always Run"
+ name="Always Run"
+ shortcut="control|R">
+ <menu_item_check.on_check
+ function="World.CheckAlwaysRun" />
+ <menu_item_check.on_click
+ function="World.AlwaysRun" />
+ </menu_item_check>
+ <menu_item_call
+ label="Stop Animating Me"
+ name="Stop Animating My Avatar">
+ <menu_item_call.on_click
+ function="Tools.StopAllAnimations" />
+ </menu_item_call>
+ <menu_item_call
+ label="Walk / run / fly..."
+ name="Walk / run / fly">
+ <menu_item_call.on_click
+ function="Floater.ToggleOrBringToFront"
+ parameter="moveview" />
+ </menu_item_call>
+ </menu>
+
+ <menu
+ create_jump_keys="true"
+ label="Status"
+ name="Status"
+ tear_off="true">
+ <menu_item_call
+ label="Away"
+ name="Set Away">
+ <menu_item_call.on_click
+ function="World.SetAway" />
+ </menu_item_call>
+ <menu_item_call
+ label="Busy"
+ name="Set Busy">
+ <menu_item_call.on_click
+ function="World.SetBusy"/>
+ </menu_item_call>
+ </menu>
+
+ <menu_item_separator/>
+
+ <menu_item_call
+ label="Buy L$..."
+ name="Buy and Sell L$">
+ <menu_item_call.on_click
+ function="BuyCurrency" />
+ </menu_item_call>
+ <menu_item_call
+ label="Merchant Outbox..."
+ name="MerchantOutbox">
+ <menu_item_call.on_click
+ function="Floater.ToggleOrBringToFront"
+ parameter="outbox" />
+ </menu_item_call>
+ <menu_item_call
+ label="Account dashboard..."
+ name="Manage My Account">
+ <menu_item_call.on_click
+ function="PromptShowURL"
+ name="ManageMyAccount_url"
+ parameter="WebLaunchJoinNow,http://secondlife.com/account/" />
+ </menu_item_call>
+
+ <menu_item_separator/>
+
+ <menu_item_call
+ label="Preferences..."
name="Preferences"
shortcut="control|P">
<menu_item_call.on_click
@@ -17,178 +179,96 @@
parameter="preferences" />
</menu_item_call>
<menu_item_call
- label="My Dashboard"
- name="Manage My Account">
- <menu_item_call.on_click
- function="PromptShowURL"
- name="ManageMyAccount_url"
- parameter="WebLaunchJoinNow,http://secondlife.com/account/" />
- </menu_item_call>
- <menu_item_call
- label="Buy L$"
- name="Buy and Sell L$">
+ label="Toolbar buttons..."
+ name="Toolbars"
+ shortcut="control|T">
<menu_item_call.on_click
- function="BuyCurrency" />
+ function="Floater.Toggle"
+ parameter="toybox" />
</menu_item_call>
+ <menu_item_call
+ label="Hide all controls"
+ name="Hide UI"
+ shortcut="control|shift|U">
+ <menu_item_call.on_click
+ function="View.ToggleUI" />
+ </menu_item_call>
<menu_item_separator/>
<menu_item_call
- label="My Profile"
- name="Profile">
- <menu_item_call.on_click
- function="ShowAgentProfile"
- parameter="agent" />
- </menu_item_call>
- <menu_item_call
- label="My Appearance"
- name="ChangeOutfit">
+ label="Exit [APP_NAME]"
+ name="Quit"
+ shortcut="control|Q">
<menu_item_call.on_click
- function="CustomizeAvatar" />
- <menu_item_call.on_enable
- function="Edit.EnableCustomizeAvatar" />
+ function="File.Quit" />
</menu_item_call>
+ </menu>
+ <menu
+ create_jump_keys="true"
+ label="Communicate"
+ name="Communicate"
+ tear_off="true">
<menu_item_check
- label="My Inventory"
- name="Inventory"
- shortcut="control|shift|I"
- visible="false">
+ label="Chat..."
+ name="Nearby Chat"
+ shortcut="control|H"
+ use_mac_ctrl="true">
<menu_item_check.on_check
function="Floater.Visible"
- parameter="inventory" />
+ parameter="chat_bar" />
<menu_item_check.on_click
function="Floater.Toggle"
- parameter="inventory" />
+ parameter="chat_bar" />
</menu_item_check>
<menu_item_check
- label="My Inventory"
- name="ShowSidetrayInventory"
- shortcut="control|I"
- visible="true">
+ label="Speak"
+ name="Speak">
<menu_item_check.on_check
- function="SidetrayPanelVisible"
- parameter="sidepanel_inventory" />
+ function="Agent.IsMicrophoneOn"
+ parameter="speak" />
+ <menu_item_check.on_enable
+ function="Agent.IsActionAllowed"
+ parameter="speak" />
<menu_item_check.on_click
- function="ShowSidetrayPanel"
- parameter="sidepanel_inventory" />
+ function="Agent.ToggleMicrophone"
+ parameter="speak" />
</menu_item_check>
<menu_item_check
- label="My Gestures"
- name="Gestures"
- shortcut="control|G">
+ label="Voice settings..."
+ name="Nearby Voice">
<menu_item_check.on_check
function="Floater.Visible"
- parameter="gestures" />
+ parameter="voice_controls" />
<menu_item_check.on_click
function="Floater.Toggle"
- parameter="gestures" />
+ parameter="voice_controls" />
</menu_item_check>
<menu_item_check
- label="My Voice"
+ label="Voice morphing..."
name="ShowVoice"
visibility_control="VoiceMorphingEnabled">
<menu_item_check.on_check
function="Floater.Visible"
- Parameter="voice_effect" />
+ parameter="voice_effect" />
<menu_item_check.on_click
function="Floater.Toggle"
parameter="voice_effect" />
</menu_item_check>
- <menu
- create_jump_keys="true"
- label="Movement"
- name="Movement"
- tear_off="true">
- <menu_item_call
- label="Sit Down"
- layout="topleft"
- shortcut="alt|shift|S"
- name="Sit Down Here">
- <menu_item_call.on_click
- function="Self.SitDown"
- parameter="" />
- <menu_item_call.on_enable
- function="Self.EnableSitDown" />
- </menu_item_call>
- <menu_item_check
- label="Fly"
- name="Fly"
- shortcut="Home">
- <menu_item_check.on_check
- function="Agent.getFlying" />
- <menu_item_check.on_click
- function="Agent.toggleFlying" />
- <menu_item_check.on_enable
- function="Agent.enableFlying" />
- </menu_item_check>
- <menu_item_check
- label="Always Run"
- name="Always Run"
- shortcut="control|R">
- <menu_item_check.on_check
- function="World.CheckAlwaysRun" />
- <menu_item_check.on_click
- function="World.AlwaysRun" />
- </menu_item_check>
- <menu_item_call
- label="Stop Animating Me"
- name="Stop Animating My Avatar">
- <menu_item_call.on_click
- function="Tools.StopAllAnimations" />
- </menu_item_call>
- </menu>
- <menu
- create_jump_keys="true"
- label="My Status"
- name="Status"
- tear_off="true">
- <menu_item_call
- label="Away"
- name="Set Away">
- <menu_item_call.on_click
- function="World.SetAway" />
- </menu_item_call>
- <menu_item_call
- label="Busy"
- name="Set Busy">
- <menu_item_call.on_click
- function="World.SetBusy"/>
- </menu_item_call>
- </menu>
- <menu_item_call
- label="Request Admin Status"
- name="Request Admin Options"
- shortcut="control|alt|G"
- visible="false">
- <menu_item_call.on_click
- function="Advanced.RequestAdminStatus" />
- </menu_item_call>
- <menu_item_call
- label="Leave Admin Status"
- name="Leave Admin Options"
- shortcut="control|alt|shift|G"
- visible="false">
- <menu_item_call.on_click
- function="Advanced.LeaveAdminStatus" />
- </menu_item_call>
-
+ <menu_item_check
+ label="Gestures..."
+ name="Gestures"
+ shortcut="control|G">
+ <menu_item_check.on_check
+ function="Floater.Visible"
+ parameter="gestures" />
+ <menu_item_check.on_click
+ function="Floater.Toggle"
+ parameter="gestures" />
+ </menu_item_check>
<menu_item_separator/>
-
- <menu_item_call
- label="Exit [APP_NAME]"
- name="Quit"
- shortcut="control|Q">
- <menu_item_call.on_click
- function="File.Quit" />
- </menu_item_call>
- </menu>
- <menu
- create_jump_keys="true"
- label="Communicate"
- name="Communicate"
- tear_off="true">
<menu_item_call
- label="My Friends"
+ label="Friends"
name="My Friends"
shortcut="control|shift|F">
<menu_item_call.on_click
@@ -196,71 +276,44 @@
parameter="friends_panel" />
</menu_item_call>
<menu_item_call
- label="My Groups"
+ label="Groups"
name="My Groups"
shortcut="control|shift|G">
<menu_item_call.on_click
function="SideTray.PanelPeopleTab"
parameter="groups_panel" />
</menu_item_call>
-
- <menu_item_separator/>
-
- <!--menu_item_call
- label="Chat"
- name="Chat">
- <menu_item_call.on_click
- function="World.Chat" />
- </menu_item_call-->
- <menu_item_check
- label="Nearby Chat"
- name="Nearby Chat"
- shortcut="control|H"
- use_mac_ctrl="true">
- <menu_item_check.on_check
- function="Floater.Visible"
- parameter="nearby_chat" />
- <menu_item_check.on_click
- function="Floater.Toggle"
- parameter="nearby_chat" />
- </menu_item_check>
<menu_item_call
- label="Nearby People"
+ label="Nearby people"
name="Active Speakers"
shortcut="control|shift|A">
<menu_item_call.on_click
- function="SideTray.PanelPeopleTab"
- parameter="nearby_panel" />
- </menu_item_call>
- <menu_item_check
- label="Nearby Voice"
- name="Nearby Voice">
- <menu_item_check.on_check
- function="Floater.Visible"
- parameter="voice_controls" />
- <menu_item_check.on_click
- function="Floater.Toggle"
- parameter="voice_controls" />
- </menu_item_check>
+ function="SideTray.PanelPeopleTab"
+ parameter="nearby_panel" />
+ </menu_item_call>
</menu>
<menu
create_jump_keys="true"
label="World"
name="World"
tear_off="true">
- <menu_item_check
- label="Mini-Map"
- name="Mini-Map"
- shortcut="control|shift|M">
- <menu_item_check.on_check
- function="Floater.Visible"
- parameter="mini_map" />
- <menu_item_check.on_click
- function="Floater.Toggle"
- parameter="mini_map" />
- </menu_item_check>
- <menu_item_check
- label="World Map"
+ <menu_item_call
+ label="Landmark This Place"
+ name="Create Landmark Here">
+ <menu_item_call.on_click
+ function="World.CreateLandmark" />
+ <menu_item_call.on_enable
+ function="World.EnableCreateLandmark" />
+ </menu_item_call>
+ <menu_item_call
+ label="Destinations..."
+ name="Destinations">
+ <menu_item_call.on_click
+ function="Floater.ToggleOrBringToFront"
+ parameter="destinations" />
+ </menu_item_call>
+ <menu_item_check
+ label="World map"
name="World Map"
shortcut="control|M"
use_mac_ctrl="true">
@@ -271,6 +324,17 @@
function="Floater.Toggle"
parameter="world_map" />
</menu_item_check>
+ <menu_item_check
+ label="Mini-map"
+ name="Mini-Map"
+ shortcut="control|shift|M">
+ <menu_item_check.on_check
+ function="Floater.Visible"
+ parameter="mini_map" />
+ <menu_item_check.on_click
+ function="Floater.Toggle"
+ parameter="mini_map" />
+ </menu_item_check>
<menu_item_check
label="Search"
name="Search"
@@ -282,6 +346,25 @@
function="Floater.Toggle"
parameter="search" />
</menu_item_check>
+ <menu_item_separator/>
+ <menu_item_call
+ label="Teleport home"
+ name="Teleport Home"
+ shortcut="control|shift|H">
+ <menu_item_call.on_click
+ function="World.TeleportHome" />
+ <menu_item_call.on_enable
+ function="World.EnableTeleportHome" />
+ </menu_item_call>
+ <menu_item_call
+ label="Set home to here"
+ name="Set Home to Here">
+ <menu_item_call.on_click
+ function="World.SetHomeLocation" />
+ <menu_item_call.on_enable
+ function="World.EnableSetHomeLocation" />
+ </menu_item_call>
+ <menu_item_separator/>
<menu_item_call
label="Snapshot"
name="Take Snapshot"
@@ -290,82 +373,51 @@
function="Floater.Show"
parameter="snapshot" />
</menu_item_call>
- <menu_item_call
- label="Landmark This Place"
- name="Create Landmark Here">
- <menu_item_call.on_click
- function="World.CreateLandmark" />
- <menu_item_call.on_enable
- function="World.EnableCreateLandmark" />
- </menu_item_call>
- <menu
- create_jump_keys="true"
- label="Place Profile"
- name="Land"
- tear_off="true">
+ <menu_item_separator/>
<menu_item_call
- label="Place Profile"
+ label="Place profile"
layout="topleft"
name="Place Profile">
<menu_item_call.on_click
function="World.PlaceProfile" />
</menu_item_call>
<menu_item_call
- label="About Land"
+ label="About land"
name="About Land">
<menu_item_call.on_click
function="Floater.Show"
parameter="about_land" />
</menu_item_call>
<menu_item_call
- label="Region/Estate"
+ label="Region / Estate"
name="Region/Estate">
<menu_item_call.on_click
function="Floater.Show"
parameter="region_info" />
</menu_item_call>
- </menu>
+ <menu_item_call
+ label="My land holdings..."
+ name="My Land">
+ <menu_item_call.on_click
+ function="Floater.Show"
+ parameter="land_holdings" />
+ </menu_item_call>
+ <menu_item_call
+ label="Buy this land"
+ name="Buy Land">
+ <menu_item_call.on_click
+ function="Land.Buy" />
+ <menu_item_call.on_enable
+ function="World.EnableBuyLand" />
+ </menu_item_call>
<menu_item_separator/>
- <menu_item_call
- label="Buy This Land"
- name="Buy Land">
- <menu_item_call.on_click
- function="Land.Buy" />
- <menu_item_call.on_enable
- function="World.EnableBuyLand" />
- </menu_item_call>
- <menu_item_call
- label="My Land"
- name="My Land">
- <menu_item_call.on_click
- function="Floater.Show"
- parameter="land_holdings" />
- </menu_item_call>
<menu
create_jump_keys="true"
label="Show"
name="LandShow"
tear_off="true">
- <menu_item_check
- label="Move Controls"
- name="Movement Controls">
- <menu_item_check.on_check
- function="Floater.Visible"
- parameter="moveview" />
- <menu_item_check.on_click
- function="World.Toggle.MovementControls" />
- </menu_item_check>
- <menu_item_check
- label="View Controls"
- name="Camera Controls">
- <menu_item_check.on_check
- function="Floater.Visible"
- parameter="camera" />
- <menu_item_check.on_click
- function="World.Toggle.CameraControls" />
- </menu_item_check>
<menu_item_check
label="Ban Lines"
name="Ban Lines">
@@ -438,24 +490,6 @@
</menu>
<menu_item_separator/>
-
- <menu_item_call
- label="Teleport Home"
- name="Teleport Home"
- shortcut="control|shift|H">
- <menu_item_call.on_click
- function="World.TeleportHome" />
- <menu_item_call.on_enable
- function="World.EnableTeleportHome" />
- </menu_item_call>
- <menu_item_call
- label="Set Home to Here"
- name="Set Home to Here">
- <menu_item_call.on_click
- function="World.SetHomeLocation" />
- <menu_item_call.on_enable
- function="World.EnableSetHomeLocation" />
- </menu_item_call>
<!-- <menu_item_check
label="Show Navigation Bar"
name="ShowNavbarNavigationPanel">
@@ -478,12 +512,10 @@
</menu_item_check>
<menu_item_separator/>-->
- <menu_item_separator/>
-
<menu
create_jump_keys="true"
label="Sun"
- name="Environment Settings"
+ name="Sun"
tear_off="true">
<menu_item_call
label="Sunrise"
@@ -515,18 +547,26 @@
function="World.EnvSettings"
parameter="midnight" />
</menu_item_call>
+ <menu_item_separator/>
+ <menu_item_call
+ label="Use Region Settings"
+ name="Use Region Settings">
+ <menu_item_call.on_click
+ function="World.EnvSettings"
+ parameter="region" />
+ </menu_item_call>
</menu>
<menu
create_jump_keys="true"
- label="Enviroment Editor"
- name="Enviroment Editor"
+ label="Environment Editor"
+ name="Environment Editor"
tear_off="true">
<menu_item_call
- label="Enviroment Settings..."
- name="Enviroment Settings">
+ label="Environment Settings..."
+ name="Environment Settings">
<menu_item_call.on_click
function="World.EnvSettings"
parameter="editor"/>
@@ -1104,6 +1144,7 @@
enabled="false"
label="Undo"
name="Undo"
+ allow_key_repeat="true"
shortcut="control|Z">
<on_click
function="Edit.Undo"
@@ -1115,6 +1156,7 @@
enabled="false"
label="Redo"
name="Redo"
+ allow_key_repeat="true"
shortcut="control|Y">
<on_click
function="Edit.Redo"
@@ -1129,6 +1171,13 @@
name="Help"
tear_off="true">
<menu_item_call
+ label="How to..."
+ name="How To">
+ <menu_item_call.on_click
+ function="Help.ToggleHowTo"
+ parameter="" />
+ </menu_item_call>
+ <menu_item_call
label="[SECOND_LIFE] Help"
name="Second Life Help"
shortcut="F1">
@@ -1136,14 +1185,6 @@
function="ShowHelp"
parameter="f1_help" />
</menu_item_call>
- <menu_item_check
- label="Enable Hints"
- name="Enable Hints">
- <on_check
- control="EnableUIHints"/>
- <on_click
- function="ToggleUIHints"/>
- </menu_item_check>
<!-- <menu_item_call
label="Tutorial"
name="Tutorial">
@@ -1401,7 +1442,7 @@
tear_off="true">
<menu_item_check
label="Simple"
- name="Simple"
+ name="Rendering Type Simple"
shortcut="control|alt|shift|1">
<menu_item_check.on_check
function="Advanced.CheckRenderType"
@@ -1412,7 +1453,7 @@
</menu_item_check>
<menu_item_check
label="Alpha"
- name="Alpha"
+ name="Rendering Type Alpha"
shortcut="control|alt|shift|2">
<menu_item_check.on_check
function="Advanced.CheckRenderType"
@@ -1423,7 +1464,7 @@
</menu_item_check>
<menu_item_check
label="Tree"
- name="Tree"
+ name="Rendering Type Tree"
shortcut="control|alt|shift|3">
<menu_item_check.on_check
function="Advanced.CheckRenderType"
@@ -1434,7 +1475,7 @@
</menu_item_check>
<menu_item_check
label="Avatars"
- name="Character"
+ name="Rendering Type Character"
shortcut="control|alt|shift|4">
<menu_item_check.on_check
function="Advanced.CheckRenderType"
@@ -1445,7 +1486,7 @@
</menu_item_check>
<menu_item_check
label="Surface Patch"
- name="Surface Patch"
+ name="Rendering Type Surface Patch"
shortcut="control|alt|shift|5">
<menu_item_check.on_check
function="Advanced.CheckRenderType"
@@ -1456,7 +1497,7 @@
</menu_item_check>
<menu_item_check
label="Sky"
- name="Sky"
+ name="Rendering Type Sky"
shortcut="control|alt|shift|6">
<menu_item_check.on_check
function="Advanced.CheckRenderType"
@@ -1467,7 +1508,7 @@
</menu_item_check>
<menu_item_check
label="Water"
- name="Water"
+ name="Rendering Type Water"
shortcut="control|alt|shift|7">
<menu_item_check.on_check
function="Advanced.CheckRenderType"
@@ -1478,7 +1519,7 @@
</menu_item_check>
<menu_item_check
label="Ground"
- name="Ground"
+ name="Rendering Type Ground"
shortcut="control|alt|shift|8">
<menu_item_check.on_check
function="Advanced.CheckRenderType"
@@ -1489,7 +1530,7 @@
</menu_item_check>
<menu_item_check
label="Volume"
- name="Volume"
+ name="Rendering Type Volume"
shortcut="control|alt|shift|9">
<menu_item_check.on_check
function="Advanced.CheckRenderType"
@@ -1500,7 +1541,7 @@
</menu_item_check>
<menu_item_check
label="Grass"
- name="Grass"
+ name="Rendering Type Grass"
shortcut="control|alt|shift|0">
<menu_item_check.on_check
function="Advanced.CheckRenderType"
@@ -1511,7 +1552,7 @@
</menu_item_check>
<menu_item_check
label="Clouds"
- name="Clouds"
+ name="Rendering Type Clouds"
shortcut="control|alt|shift|-">
<menu_item_check.on_check
function="Advanced.CheckRenderType"
@@ -1522,7 +1563,7 @@
</menu_item_check>
<menu_item_check
label="Particles"
- name="Particles"
+ name="Rendering Type Particles"
shortcut="control|alt|shift|=">
<menu_item_check.on_check
function="Advanced.CheckRenderType"
@@ -1533,7 +1574,7 @@
</menu_item_check>
<menu_item_check
label="Bump"
- name="Bump"
+ name="Rendering Type Bump"
shortcut="control|alt|shift|\">
<menu_item_check.on_check
function="Advanced.CheckRenderType"
@@ -1550,7 +1591,7 @@
tear_off="true">
<menu_item_check
label="UI"
- name="UI"
+ name="ToggleUI"
shortcut="control|alt|F1">
<menu_item_check.on_check
function="Advanced.CheckFeature"
@@ -1664,36 +1705,6 @@
function="ToggleControl"
parameter="MouseSmooth" />
</menu_item_check>
-
- <menu_item_separator/>
-
- <menu
- create_jump_keys="true"
- label="Shortcuts"
- name="Shortcuts"
- tear_off="true"
- visible="false">
- <menu_item_call
- label="Image (L$[COST])..."
- 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"
- name="Search"
- shortcut="control|F">
- <menu_item_check.on_check
- function="Floater.Visible"
- parameter="search" />
- <menu_item_check.on_click
- function="Floater.Toggle"
- parameter="search" />
- </menu_item_check>
<menu_item_call
enabled="false"
label="Release Keys"
@@ -1705,12 +1716,14 @@
function="Tools.EnableReleaseKeys"
parameter="" />
</menu_item_call>
- <menu_item_call
- label="Set UI Size to Default"
- name="Set UI Size to Default">
- <menu_item_call.on_click
- function="View.DefaultUISize" />
- </menu_item_call>
+ <menu_item_separator/>
+
+ <menu
+ create_jump_keys="true"
+ label="Shortcuts"
+ name="Shortcuts"
+ tear_off="true"
+ visible="false">
<!-- This second, alternative shortcut for Show Advanced Menu is for backward compatibility. The main shortcut has been changed so it's Linux-friendly, where the old shortcut is typically eaten by the window manager. -->
<menu_item_check
label="Show Advanced Menu - legacy shortcut"
@@ -1797,55 +1810,6 @@
<menu_item_separator/>
- <menu
- create_jump_keys="true"
- label="Select Build Tool"
- name="Select Tool"
- tear_off="true">
- <menu_item_call
- label="Focus Tool"
- name="Focus"
- shortcut="control|1">
- <menu_item_call.on_click
- function="Tools.SelectTool"
- parameter="focus" />
- </menu_item_call>
- <menu_item_call
- label="Move Tool"
- name="Move"
- shortcut="control|2">
- <menu_item_call.on_click
- function="Tools.SelectTool"
- parameter="move" />
- </menu_item_call>
- <menu_item_call
- label="Edit Tool"
- name="Edit"
- shortcut="control|3">
- <menu_item_call.on_click
- function="Tools.SelectTool"
- parameter="edit" />
- </menu_item_call>
- <menu_item_call
- label="Create Tool"
- name="Create"
- shortcut="control|4">
- <menu_item_call.on_click
- function="Tools.SelectTool"
- parameter="create" />
- </menu_item_call>
- <menu_item_call
- label="Land Tool"
- name="Land"
- shortcut="control|5">
- <menu_item_call.on_click
- function="Tools.SelectTool"
- parameter="land" />
- </menu_item_call>
- </menu>
-
- <menu_item_separator/>
-
<menu_item_call
label="Zoom In"
name="Zoom In"
@@ -2435,6 +2399,16 @@
function="Advanced.ToggleInfoDisplay"
parameter="raycast" />
</menu_item_check>
+ <menu_item_check
+ label="Wind Vectors"
+ name="Wind Vectors">
+ <menu_item_check.on_check
+ function="Advanced.CheckInfoDisplay"
+ parameter="wind vectors" />
+ <menu_item_check.on_click
+ function="Advanced.ToggleInfoDisplay"
+ parameter="wind vectors" />
+ </menu_item_check>
<menu_item_check
label="Render Complexity"
name="rendercomplexity">
@@ -2445,6 +2419,16 @@
function="Advanced.ToggleInfoDisplay"
parameter="rendercomplexity" />
</menu_item_check>
+ <menu_item_check
+ label="Attachment Bytes"
+ name="attachment bytes">
+ <menu_item_check.on_check
+ function="Advanced.CheckInfoDisplay"
+ parameter="attachment bytes" />
+ <menu_item_check.on_click
+ function="Advanced.ToggleInfoDisplay"
+ parameter="attachment bytes" />
+ </menu_item_check>
<menu_item_check
label="Sculpt"
name="Sculpt">
@@ -2549,19 +2533,6 @@
<menu_item_check.on_enable
function="Advanced.EnableRenderDeferredOptions" />
</menu_item_check>
- <menu_item_check
- label=" Global Illumination (experimental)"
- name="Global Illumination">
- <menu_item_check.on_check
- function="CheckControl"
- parameter="RenderDeferredGI" />
- <menu_item_check.on_click
- function="ToggleControl"
- parameter="RenderDeferredGI" />
- <menu_item_check.on_enable
- function="Advanced.EnableRenderDeferredOptions" />
- </menu_item_check>
-
<menu_item_separator />
<menu_item_check
@@ -2811,7 +2782,7 @@
<menu
create_jump_keys="true"
label="World"
- name="World"
+ name="DevelopWorld"
tear_off="true">
<menu_item_check
label="Sim Sun Override"
@@ -2824,16 +2795,6 @@
parameter="SkyOverrideSimSunPosition" />
</menu_item_check>
<menu_item_check
- label="Cheesy Beacon"
- name="Cheesy Beacon">
- <menu_item_check.on_check
- function="CheckControl"
- parameter="CheesyBeacon" />
- <menu_item_check.on_click
- function="ToggleControl"
- parameter="CheesyBeacon" />
- </menu_item_check>
- <menu_item_check
label="Fixed Weather"
name="Fixed Weather">
<menu_item_check.on_check
@@ -3057,7 +3018,7 @@
tear_off="true">
<menu_item_call
label="Iris"
- name="Iris">
+ name="Grab Iris">
<menu_item_call.on_click
function="Advanced.GrabBakedTexture"
parameter="iris" />
@@ -3067,7 +3028,7 @@
</menu_item_call>
<menu_item_call
label="Head"
- name="Head">
+ name="Grab Head">
<menu_item_call.on_click
function="Advanced.GrabBakedTexture"
parameter="head" />
@@ -3077,7 +3038,7 @@
</menu_item_call>
<menu_item_call
label="Upper Body"
- name="Upper Body">
+ name="Grab Upper Body">
<menu_item_call.on_click
function="Advanced.GrabBakedTexture"
parameter="upper" />
@@ -3087,7 +3048,7 @@
</menu_item_call>
<menu_item_call
label="Lower Body"
- name="Lower Body">
+ name="Grab Lower Body">
<menu_item_call.on_click
function="Advanced.GrabBakedTexture"
parameter="lower" />
@@ -3097,7 +3058,7 @@
</menu_item_call>
<menu_item_call
label="Skirt"
- name="Skirt">
+ name="Grab Skirt">
<menu_item_call.on_click
function="Advanced.GrabBakedTexture"
parameter="skirt" />
@@ -3327,6 +3288,57 @@
function="ToggleControl"
parameter="ShowConsoleWindow" />
</menu_item_check>
+ <menu
+ create_jump_keys="true"
+ label="Set Logging Level"
+ name="Set Logging Level"
+ tear_off="true">
+ <menu_item_check
+ label="Debug">
+ <menu_item_check.on_check
+ function="Develop.CheckLoggingLevel"
+ parameter="0" />
+ <menu_item_check.on_click
+ function="Develop.SetLoggingLevel"
+ parameter="0" />
+ </menu_item_check>
+ <menu_item_check
+ label="Info">
+ <menu_item_check.on_check
+ function="Develop.CheckLoggingLevel"
+ parameter="1" />
+ <menu_item_check.on_click
+ function="Develop.SetLoggingLevel"
+ parameter="1" />
+ </menu_item_check>
+ <menu_item_check
+ label="Warning">
+ <menu_item_check.on_check
+ function="Develop.CheckLoggingLevel"
+ parameter="2" />
+ <menu_item_check.on_click
+ function="Develop.SetLoggingLevel"
+ parameter="2" />
+ </menu_item_check>
+ <menu_item_check
+ label="Error">
+ <menu_item_check.on_check
+ function="Develop.CheckLoggingLevel"
+ parameter="3" />
+ <menu_item_check.on_click
+ function="Develop.SetLoggingLevel"
+ parameter="3" />
+ </menu_item_check>
+ <menu_item_check
+ label="None">
+ <menu_item_check.on_check
+ function="Develop.CheckLoggingLevel"
+ parameter="4" />
+ <menu_item_check.on_click
+ function="Develop.SetLoggingLevel"
+ parameter="4" />
+ </menu_item_check>
+ </menu>
<menu_item_separator/>
@@ -3365,10 +3377,11 @@
<menu
create_jump_keys="true"
label="Object"
+ name="AdminObject"
tear_off="true">
<menu_item_call
label="Take Copy"
- name="Take Copy"
+ name="Admin Take Copy"
shortcut="control|alt|shift|O">
<menu_item_call.on_click
function="Admin.ForceTakeCopy" />
@@ -3637,7 +3650,7 @@
<menu
create_jump_keys="true"
label="Help"
- name="Help"
+ name="DeprecatedHelp"
tear_off="true">
<menu_item_call
label="Official Linden Blog"
diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml
index 64438fe614..af75d49353 100644
--- a/indra/newview/skins/default/xui/en/notifications.xml
+++ b/indra/newview/skins/default/xui/en/notifications.xml
@@ -203,34 +203,80 @@ Save changes to current clothing/body part?
icon="alertmodal.tga"
name="ConfirmNoCopyToOutbox"
type="alertmodal">
- You don't have permission to copy this item to the Marketplace Outbox. Are you sure you want to move the following item?
- [ITEM_NAME]
+You don't have permission to copy one or more of these items to the Merchant Outbox. You can move them or leave them behind.
+ <usetemplate
+ name="okcancelbuttons"
+ notext="Don't move item(s)"
+ yestext="Move item(s)"/>
+ </notification>
+
+ <notification
+ icon="OutboxStatus_Success"
+ name="OutboxFolderCreated"
+ type="outbox">
+ <unique/>
+A new folder has been created for each item you have transferred into the top level of your Merchant Outbox.
+
+ <usetemplate
+ ignoretext="A new folder was created in the Merchant Outbox"
+ name="okignore"
+ yestext="OK"/>
+ </notification>
+
+ <notification
+ icon="OutboxStatus_Success"
+ name="OutboxImportComplete"
+ type="outbox">
+Success
+
+All folders were successfully sent to the Marketplace.
+
<usetemplate
- name="okcancelbuttons"
- notext="No"
- yestext="Yes"/>
- </notification>
+ ignoretext="All folders sent to the Marketplace"
+ name="okignore"
+ yestext="OK"/>
+ </notification>
<notification
- icon="alertmodal.tga"
- name="OutboxUploadComplete"
- type="alertmodal">
-Marketplace upload complete.
+ icon="OutboxStatus_Warning"
+ name="OutboxImportHadErrors"
+ type="outbox">
+Some folders did not transfer
+
+Errors occurred when some folders were sent to the Marketplace. Those folders are still in your Merchant Outbox.
+
+See the [[MARKETPLACE_IMPORTS_URL] error log] for more information.
+
<usetemplate
name="okbutton"
- yestext="Hooray!"/>
+ yestext="OK"/>
</notification>
<notification
- icon="alertmodal.tga"
- name="OutboxUploadHadErrors"
- type="alertmodal">
-Marketplace upload completed with errors! Please correct the problems in your outbox and retry. Thanks.
+ icon="OutboxStatus_Error"
+ name="OutboxImportFailed"
+ type="outbox">
+Transfer failed
+
+No folders were sent to the Marketplace because of a system or network error. Try again later.
+
<usetemplate
name="okbutton"
- yestext="Boo!"/>
+ yestext="OK"/>
</notification>
+ <notification
+ icon="OutboxStatus_Error"
+ name="OutboxInitFailed"
+ type="outbox">
+Marketplace initialization failed
+
+Initialization with the Marketplace failed because of a system or network error. Try again later.
+
+ <usetemplate
+ name="okbutton"
+ yestext="OK"/>
+ </notification>
<notification
@@ -2297,8 +2343,8 @@ Would you be my friend?
icon="alertmodal.tga"
label="Save Outfit"
name="SaveOutfitAs"
- type="alertmodal"
- unique="true">
+ type="alertmodal">
+ <unique/>
Save what I'm wearing as a new Outfit:
<tag>confirm</tag>
<form name="form">
@@ -2369,7 +2415,7 @@ Would you be my friend?
name="RemoveFromFriends"
type="alertmodal">
<tag>friendship</tag>
-Do you want to remove [NAME] from your Friends List?
+Do you want to remove &lt;nolink&gt;[NAME]&lt;/nolink&gt; from your Friends List?
<tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
@@ -2665,9 +2711,18 @@ Display settings have been set to safe levels because you have specified the -sa
<notification
icon="alertmodal.tga"
- name="DisplaySetToRecommended"
+ name="DisplaySetToRecommendedGPUChange"
type="alertmodal">
-Display settings have been set to recommended levels based on your system configuration.
+Display settings have been set to recommended levels because your graphics card changed
+from &apos;[LAST_GPU]&apos;
+to &apos;[THIS_GPU]&apos;
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="DisplaySetToRecommendedFeatureChange"
+ type="alertmodal">
+Display settings have been set to recommended levels because of a change to the rendering subsystem.
</notification>
<notification
@@ -3400,7 +3455,7 @@ Are you sure you want to return the selected objects to their owners? Transferab
icon="alert.tga"
name="GroupLeaveConfirmMember"
type="alert">
-You are currently a member of the group [GROUP].
+You are currently a member of the group &lt;nolink&gt;[GROUP]&lt;/nolink&gt;.
Leave Group?
<tag>group</tag>
<tag>confirm</tag>
@@ -4611,8 +4666,8 @@ Go to your [http://secondlife.com/account/ Dashboard] to see your account histor
<notification
icon="alertmodal.tga"
name="ConfirmQuit"
- type="alertmodal"
- unique="true">
+ type="alertmodal">
+ <unique/>
Are you sure you want to quit?
<tag>confirm</tag>
<usetemplate
@@ -4624,9 +4679,37 @@ Are you sure you want to quit?
<notification
icon="alertmodal.tga"
+ name="ConfirmRestoreToybox"
+ type="alertmodal">
+ <unique/>
+This action will restore your default buttons and toolbars.
+
+You cannot undo this action.
+ <usetemplate
+ name="okcancelbuttons"
+ notext="Cancel"
+ yestext="OK"/>
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="ConfirmClearAllToybox"
+ type="alertmodal">
+ <unique/>
+This action will return all buttons to the toolbox and your toolbars will be empty.
+
+You cannot undo this action.
+ <usetemplate
+ name="okcancelbuttons"
+ notext="Cancel"
+ yestext="OK"/>
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
name="DeleteItems"
- type="alertmodal"
- unique="true">
+ type="alertmodal">
+ <unique/>
[QUESTION]
<tag>confirm</tag>
<usetemplate
@@ -4639,8 +4722,9 @@ Are you sure you want to quit?
<notification
icon="alertmodal.tga"
name="HelpReportAbuseEmailLL"
- type="alert"
- unique="true">
+ type="alert">
+ <unique/>
+
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.
@@ -5123,7 +5207,7 @@ Topic: [SUBJECT], Message: [MESSAGE]
name="FriendOnline"
type="notifytip">
<tag>friendship</tag>
-[NAME] is Online
+&lt;nolink&gt;[NAME]&lt;/nolink&gt; is Online
</notification>
<notification
@@ -5131,7 +5215,7 @@ Topic: [SUBJECT], Message: [MESSAGE]
name="FriendOffline"
type="notifytip">
<tag>friendship</tag>
-[NAME] is Offline
+&lt;nolink&gt;[NAME]&lt;/nolink&gt; is Offline
</notification>
<notification
@@ -5408,21 +5492,23 @@ Your calling card was declined.
</notification>
<notification
- icon="notifytip.tga"
- name="TeleportToLandmark"
- type="notifytip">
-You can teleport to locations like &apos;[NAME]&apos; by opening the Places panel on the right side of your screen, and then select the Landmarks tab.
-Click on any landmark to select it, then click &apos;Teleport&apos; at the bottom of the panel.
-(You can also double-click on the landmark, or right-click it and choose &apos;Teleport&apos;.)
+ icon="notifytip.tga"
+ name="TeleportToLandmark"
+ type="notifytip">
+ To teleport to locations like &apos;[NAME]&apos;, click on the &quot;Places&quot; button,
+ then select the Landmarks tab in the window that opens. Click on any
+ landmark to select it, then click &apos;Teleport&apos; at the bottom of the window.
+ (You can also double-click on the landmark, or right-click it and
+ choose &apos;Teleport&apos;.)
</notification>
<notification
icon="notifytip.tga"
name="TeleportToPerson"
type="notifytip">
-You can contact Residents like &apos;[NAME]&apos; by opening the People panel on the right side of your screen.
-Select the Resident from the list, then click &apos;IM&apos; at the bottom of the panel.
-(You can also double-click on their name in the list, or right-click and choose &apos;IM&apos;).
+ To contact Residents like &apos;[NAME]&apos;, click on the &quot;People&quot; button , select a Resident from the window that opens, then click &apos;IM&apos; at the
+ bottom of the window.
+ (You can also double-click on their name in the list, or right-click and choose &apos;IM&apos;).
</notification>
<notification
@@ -5476,6 +5562,15 @@ Please select at least one type of content to search (General, Moderate, or Adul
[MESSAGE]
</notification>
+ <notification
+ icon="notify.tga"
+ name="PaymentFailure"
+ persist="true"
+ type="notify">
+ <tag>funds</tag>
+[MESSAGE]
+ </notification>
+
<!-- EventNotification couldn't be persist since server decide is it necessary to notify
user about subscribed event via LLEventNotifier-->
<notification
@@ -5615,8 +5710,8 @@ Message from [NAME]:
icon="notify.tga"
name="NotSafe"
persist="true"
- type="notify"
- unique="true">
+ type="notify">
+ <unique/>
This land has damage enabled.
You can be hurt here. If you die, you will be teleported to your home location.
</notification>
@@ -5625,8 +5720,8 @@ You can be hurt here. If you die, you will be teleported to your home location.
icon="notify.tga"
name="NoFly"
persist="true"
- type="notify"
- unique="true">
+ type="notify">
+ <unique/>
<tag>fail</tag>
This area has flying disabled.
You can&apos;t fly here.
@@ -5636,8 +5731,8 @@ You can&apos;t fly here.
icon="notify.tga"
name="PushRestricted"
persist="true"
- type="notify"
- unique="true">
+ type="notify">
+ <unique/>
This area does not allow pushing. You can&apos;t push others here unless you own the land.
</notification>
@@ -5645,8 +5740,8 @@ This area does not allow pushing. You can&apos;t push others here unless you own
icon="notify.tga"
name="NoVoice"
persist="true"
- type="notify"
- unique="true">
+ type="notify">
+ <unique/>
This area has voice chat disabled. You won&apos;t be able to hear anyone talking.
<tag>voice</tag>
</notification>
@@ -5655,8 +5750,8 @@ This area has voice chat disabled. You won&apos;t be able to hear anyone talking
icon="notify.tga"
name="NoBuild"
persist="true"
- type="notify"
- unique="true">
+ type="notify">
+ <unique/>
This area has building disabled. You can&apos;t build or rez objects here.
</notification>
@@ -5664,8 +5759,8 @@ This area has building disabled. You can&apos;t build or rez objects here.
icon="notify.tga"
name="SeeAvatars"
persist="true"
- type="notify"
- unique="true">
+ type="notify">
+ <unique/>
This parcel hides avatars and text chat from another parcel. You can&apos;t see other residents outside the parcel, and those outside are not able to see you. Regular text chat on channel 0 is also blocked.
</notification>
@@ -6131,7 +6226,7 @@ Your object named &lt;nolink&gt;[OBJECTFROMNAME]&lt;/nolink&gt; has given you th
name="FriendshipAccepted"
type="offer">
<tag>friendship</tag>
-[NAME] accepted your friendship offer.
+&lt;nolink&gt;[NAME]&lt;/nolink&gt; accepted your friendship offer.
</notification>
<notification
@@ -6140,7 +6235,7 @@ Your object named &lt;nolink&gt;[OBJECTFROMNAME]&lt;/nolink&gt; has given you th
persist="true"
type="notify">
<tag>friendship</tag>
-[NAME] declined your friendship offer.
+&lt;nolink&gt;[NAME]&lt;/nolink&gt; declined your friendship offer.
</notification>
<notification
@@ -6553,8 +6648,8 @@ The voice call you are trying to join, [VOICE_CHANNEL_NAME], has reached maximum
<notification
icon="notifytip.tga"
name="ProximalVoiceChannelFull"
- type="notifytip"
- unique="true">
+ type="notifytip">
+ <unique/>
We&apos;re sorry. This area has reached maximum capacity for voice conversations. Please try to use voice in another area.
<tag>fail</tag>
<tag>voice</tag>
@@ -6622,8 +6717,8 @@ Failed to connect to [VOICE_CHANNEL_NAME], please try again later. You will now
duration="10"
icon="notifytip.tga"
name="VoiceLoginRetry"
- type="notifytip"
- unique="true">
+ type="notifytip">
+ <unique/>
We are creating a voice channel for you. This may take up to one minute.
<tag>status</tag>
<tag>voice</tag>
@@ -6634,8 +6729,8 @@ We are creating a voice channel for you. This may take up to one minute.
name="VoiceEffectsExpired"
sound="UISndAlert"
persist="true"
- type="notify"
- unique="true">
+ type="notify">
+ <unique/>
One or more of your subscribed Voice Morphs has expired.
[[URL] Click here] to renew your subscription.
<tag>fail</tag>
@@ -6647,8 +6742,8 @@ One or more of your subscribed Voice Morphs has expired.
name="VoiceEffectsExpiredInUse"
sound="UISndAlert"
persist="true"
- type="notify"
- unique="true">
+ type="notify">
+ <unique/>
The active Voice Morph has expired, your normal voice settings have been applied.
[[URL] Click here] to renew your subscription.
<tag>fail</tag>
@@ -6660,8 +6755,8 @@ The active Voice Morph has expired, your normal voice settings have been applied
name="VoiceEffectsWillExpire"
sound="UISndAlert"
persist="true"
- type="notify"
- unique="true">
+ type="notify">
+ <unique/>
One or more of your Voice Morphs will expire in less than [INTERVAL] days.
[[URL] Click here] to renew your subscription.
<tag>fail</tag>
@@ -6673,8 +6768,8 @@ One or more of your Voice Morphs will expire in less than [INTERVAL] days.
name="VoiceEffectsNew"
sound="UISndAlert"
persist="true"
- type="notify"
- unique="true">
+ type="notify">
+ <unique/>
New Voice Morphs are available!
<tag>voice</tag>
</notification>
@@ -6899,6 +6994,26 @@ With the following Residents:
<usetemplate
name="okcancelbuttons"
notext="Cancel"
+ yestext="OK"/>
+ </notification>
+
+ <notification
+ icon="notifytip.tga"
+ name="ShareFolderConfirmation"
+ type="alertmodal">
+Only one folder at a time can be shared.
+
+Are you sure you want to share the following items:
+
+&lt;nolink&gt;[ITEMS]&lt;/nolink&gt;
+
+With the following Residents:
+
+[RESIDENTS]
+ <tag>confirm</tag>
+ <usetemplate
+ name="okcancelbuttons"
+ notext="Cancel"
yestext="Ok"/>
</notification>
@@ -7075,8 +7190,9 @@ Are you sure you want to leave this call?
ignoretext="Confirm before I leave call"
name="okcancelignore"
notext="No"
- yestext="Yes"
- unique="true"/>
+ yestext="Yes">
+ <unique/>
+ </usetemplate>
</notification>
<notification
@@ -7094,32 +7210,32 @@ Mute everyone?
<usetemplate
ignoretext="Confirm before I mute all participants in a group call"
name="okcancelignore"
- yestext="Ok"
- notext="Cancel"
- unique="true"/>
+ yestext="OK"
+ notext="Cancel">
+ <unique/>
+ </usetemplate>
</notification>
<notification
name="HintChat"
label="Chat"
- type="hint"
- unique="true">
+ type="hint">
+ <unique/>
To join the conversation, type into the chat field below.
</notification>
<notification
name="HintSit"
-
label="Stand"
- type="hint"
- unique="true">
+ type="hint">
+ <unique/>
To stand up and exit the sitting position, click the Stand button.
</notification>
<notification
name="HintSpeak"
label="Speak"
- type="hint"
- unique="true">
+ type="hint">
+ <unique/>
Click the Speak button to turn your microphone on and off.
Click on the up arrow to see the voice control panel.
@@ -7130,32 +7246,32 @@ Hiding the Speak button will disable the voice feature.
<notification
name="HintDestinationGuide"
label="Explore the World"
- type="hint"
- unique="true">
+ type="hint">
+ <unique/>
The Destination Guide contains thousands of new places to discover. Select a location and choose Teleport to start exploring.
</notification>
<notification
name="HintSidePanel"
label="Side Panel"
- type="hint"
- unique="true">
+ type="hint">
+ <unique/>
Get quick access to your inventory, outfits, profiles and more in the side panel.
</notification>
<notification
name="HintMove"
label="Move"
- type="hint"
- unique="true">
+ type="hint">
+ <unique/>
To walk or run, open the Move Panel and use the directional arrows to navigate. You can also use the directional keys on your keyboard.
</notification>
<notification
name="HintMoveClick"
label=""
- type="hint"
- unique="true">
+ type="hint">
+ <unique/>
1. Click to Walk
Click anywhere on the ground to walk to that spot.
@@ -7167,8 +7283,8 @@ Click and drag anywhere on the world to rotate your view
<notification
name="HintDisplayName"
label="Display Name"
- type="hint"
- unique="true">
+ type="hint">
+ <unique/>
Set your customizable display name here. This is in addition to your unique username, which can't be changed. You can change how you see other people's names in your preferences.
</notification>
@@ -7176,8 +7292,8 @@ Click and drag anywhere on the world to rotate your view
<notification
name="HintView"
label="View"
- type="hint"
- unique="true">
+ type="hint">
+ <unique/>
To change your camera view, use the Orbit and Pan controls. Reset your view by pressing Escape or walking.
<tag>custom_skin</tag>
</notification>
@@ -7185,16 +7301,16 @@ Click and drag anywhere on the world to rotate your view
<notification
name="HintInventory"
label="Inventory"
- type="hint"
- unique="true">
+ type="hint">
+ <unique/>
Check your inventory to find items. Newest items can be easily found in the Recent tab.
</notification>
<notification
name="HintLindenDollar"
label="You've got Linden Dollars!"
- type="hint"
- unique="true">
+ type="hint">
+ <unique/>
Here's your current balance of L$. Click Buy L$ to purchase more Linden Dollars.
<tag>funds</tag>
</notification>
@@ -7381,23 +7497,10 @@ The site at &apos;&lt;nolink&gt;[HOST_NAME]&lt;/nolink&gt;&apos; in realm &apos;
</notification>
<notification
- name="ModeChange"
- label=""
- type="alertmodal"
- unique="true">
- Changing modes requires you to quit and restart.
- <tag>confirm</tag>
- <usetemplate
- name="okcancelbuttons"
- yestext="Quit"
- notext="Don't Quit"/>
- </notification>
-
- <notification
name="NoClassifieds"
label=""
- type="alertmodal"
- unique="true">
+ type="alertmodal">
+ <unique/>
<tag>fail</tag>
<tag>confirm</tag>
Creation and editing of Classifieds is only available in Advanced mode. Would you like to quit and change modes? The mode selector can be found on the login screen.
@@ -7410,8 +7513,8 @@ The site at &apos;&lt;nolink&gt;[HOST_NAME]&lt;/nolink&gt;&apos; in realm &apos;
<notification
name="NoGroupInfo"
label=""
- type="alertmodal"
- unique="true">
+ type="alertmodal">
+ <unique/>
<tag>fail</tag>
<tag>confirm</tag>
Creation and editing of Groups is only available in Advanced mode. Would you like to quit and change modes? The mode selector can be found on the login screen.
@@ -7424,8 +7527,8 @@ The site at &apos;&lt;nolink&gt;[HOST_NAME]&lt;/nolink&gt;&apos; in realm &apos;
<notification
name="NoPlaceInfo"
label=""
- type="alertmodal"
- unique="true">
+ type="alertmodal">
+ <unique/>
<tag>fail</tag>
<tag>confirm</tag>
Viewing place profile is only available in Advanced mode. Would you like to quit and change modes? The mode selector can be found on the login screen.
@@ -7438,8 +7541,8 @@ The site at &apos;&lt;nolink&gt;[HOST_NAME]&lt;/nolink&gt;&apos; in realm &apos;
<notification
name="NoPicks"
label=""
- type="alertmodal"
- unique="true">
+ type="alertmodal">
+ <unique/>
<tag>fail</tag>
<tag>confirm</tag>
Creation and editing of Picks is only available in Advanced mode. Would you like to quit and change modes? The mode selector can be found on the login screen.
@@ -7452,8 +7555,8 @@ The site at &apos;&lt;nolink&gt;[HOST_NAME]&lt;/nolink&gt;&apos; in realm &apos;
<notification
name="NoWorldMap"
label=""
- type="alertmodal"
- unique="true">
+ type="alertmodal">
+ <unique/>
<tag>fail</tag>
<tag>confirm</tag>
Viewing of the world map is only available in Advanced mode. Would you like to quit and change modes? The mode selector can be found on the login screen.
@@ -7466,8 +7569,8 @@ The site at &apos;&lt;nolink&gt;[HOST_NAME]&lt;/nolink&gt;&apos; in realm &apos;
<notification
name="NoVoiceCall"
label=""
- type="alertmodal"
- unique="true">
+ type="alertmodal">
+ <unique/>
<tag>fail</tag>
<tag>confirm</tag>
Voice calls are only available in Advanced mode. Would you like to logout and change modes?
@@ -7480,8 +7583,8 @@ The site at &apos;&lt;nolink&gt;[HOST_NAME]&lt;/nolink&gt;&apos; in realm &apos;
<notification
name="NoAvatarShare"
label=""
- type="alertmodal"
- unique="true">
+ type="alertmodal">
+ <unique/>
<tag>fail</tag>
<tag>confirm</tag>
Sharing is only available in Advanced mode. Would you like to logout and change modes?
@@ -7494,8 +7597,8 @@ The site at &apos;&lt;nolink&gt;[HOST_NAME]&lt;/nolink&gt;&apos; in realm &apos;
<notification
name="NoAvatarPay"
label=""
- type="alertmodal"
- unique="true">
+ type="alertmodal">
+ <unique/>
<tag>fail</tag>
<tag>confirm</tag>
Paying other residents is only available in Advanced mode. Would you like to logout and change modes?
@@ -7508,8 +7611,8 @@ The site at &apos;&lt;nolink&gt;[HOST_NAME]&lt;/nolink&gt;&apos; in realm &apos;
<notification
name="NoInventory"
label=""
- type="alertmodal"
- unique="true">
+ type="alertmodal">
+ <unique/>
<tag>fail</tag>
<tag>confirm</tag>
Viewing inventory is only available in Advanced mode. Would you like to logout and change modes?
@@ -7522,8 +7625,8 @@ The site at &apos;&lt;nolink&gt;[HOST_NAME]&lt;/nolink&gt;&apos; in realm &apos;
<notification
name="NoAppearance"
label=""
- type="alertmodal"
- unique="true">
+ type="alertmodal">
+ <unique/>
<tag>fail</tag>
<tag>confirm</tag>
The appearance editor is only available in Advanced mode. Would you like to logout and change modes?
@@ -7536,8 +7639,8 @@ The site at &apos;&lt;nolink&gt;[HOST_NAME]&lt;/nolink&gt;&apos; in realm &apos;
<notification
name="NoSearch"
label=""
- type="alertmodal"
- unique="true">
+ type="alertmodal">
+ <unique/>
<tag>fail</tag>
<tag>confirm</tag>
Search is only available in Advanced mode. Would you like to logout and change modes?
@@ -7547,6 +7650,20 @@ The site at &apos;&lt;nolink&gt;[HOST_NAME]&lt;/nolink&gt;&apos; in realm &apos;
notext="Don't Quit"/>
</notification>
+ <notification
+ name="ConfirmHideUI"
+ label=""
+ type="alertmodal">
+ <unique/>
+ <tag>confirm</tag>
+ This action will hide all menu items and buttons. To get them back, click [SHORTCUT] again.
+ <usetemplate
+ name="okcancelignore"
+ yestext="OK"
+ notext="Cancel"
+ ignoretext="Confirm before hiding UI"/>
+ </notification>
+
<global name="UnsupportedGLRequirements">
You do not appear to have the proper hardware requirements for [APP_NAME]. [APP_NAME] requires an OpenGL graphics card that has multitexture support. If this is the case, you may want to make sure that you have the latest drivers for your graphics card, and service packs and patches for your operating system.
diff --git a/indra/newview/skins/default/xui/en/outfit_accordion_tab.xml b/indra/newview/skins/default/xui/en/outfit_accordion_tab.xml
index 20ff492c0f..2a24c74feb 100644
--- a/indra/newview/skins/default/xui/en/outfit_accordion_tab.xml
+++ b/indra/newview/skins/default/xui/en/outfit_accordion_tab.xml
@@ -10,7 +10,7 @@
name="Mockup Tab"
selection_enabled="true"
tab_stop="false"
- title="Mockup Tab"
+ title="MOCKUP TAB"
translate="false"
width="0">
<wearable_items_list
diff --git a/indra/newview/skins/default/xui/en/panel_adhoc_control_panel.xml b/indra/newview/skins/default/xui/en/panel_adhoc_control_panel.xml
index e70abc0975..d68fa6ca6c 100644
--- a/indra/newview/skins/default/xui/en/panel_adhoc_control_panel.xml
+++ b/indra/newview/skins/default/xui/en/panel_adhoc_control_panel.xml
@@ -27,8 +27,7 @@
mouse_opaque="false"
width="147"
top="0"
- name="speakers_list_panel"
- user_resize="false">
+ name="speakers_list_panel">
<avatar_list
color="DkGray2"
follows="all"
@@ -50,7 +49,6 @@
min_height="25"
width="130"
name="call_btn_panel"
- user_resize="false"
visible="false">
<button
follows="all"
@@ -58,7 +56,7 @@
label="Call"
name="call_btn"
width="130"
- top="5" />
+ top="0" />
</layout_panel>
<layout_panel
auto_resize="false"
@@ -68,14 +66,13 @@
min_height="25"
width="130"
name="end_call_btn_panel"
- user_resize="false"
visible="false">
<button
follows="all"
height="20"
label="Leave Call"
name="end_call_btn"
- top="5"/>
+ top="0"/>
</layout_panel>
<layout_panel
auto_resize="false"
@@ -85,14 +82,13 @@
min_height="25"
width="130"
name="voice_ctrls_btn_panel"
- user_resize="false"
visible="false">
<button
follows="all"
height="20"
label="Voice Controls"
name="voice_ctrls_btn"
- top="5"
+ top="0"
use_ellipses="true" />
</layout_panel>
</layout_stack>
diff --git a/indra/newview/skins/default/xui/en/panel_bottomtray.xml b/indra/newview/skins/default/xui/en/panel_bottomtray.xml
deleted file mode 100644
index ec5853649e..0000000000
--- a/indra/newview/skins/default/xui/en/panel_bottomtray.xml
+++ /dev/null
@@ -1,530 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<panel
- background_visible="true"
- bg_alpha_color="DkGray"
- bg_opaque_color="DkGray"
- chrome="true"
- follows="left|bottom|right"
- focus_root="true"
- height="33"
- layout="topleft"
- left="0"
- name="bottom_tray"
- top="28"
- width="1310">
- <string
- name="DragIndicationImageName"
- value="Accordion_ArrowOpened_Off" />
- <string
- name="SpeakBtnToolTip"
- value="Turns microphone on/off" />
- <string
- name="VoiceControlBtnToolTip"
- value="Shows/hides voice control panel" />
- <layout_stack
- border_size="0"
- clip="false"
- follows="all"
- height="28"
- layout="topleft"
- left="0"
- mouse_opaque="false"
- name="toolbar_stack"
- orientation="horizontal"
- top="0"
- width="1310">
- <layout_panel
- auto_resize="false"
- user_resize="false"
- min_width="2"
- width="2" />
- <layout_panel
- auto_resize="false"
- layout="topleft"
- max_width="320"
- min_width="214"
- height="28"
- mouse_opaque="false"
- name="chat_bar_layout_panel"
- user_resize="true"
- width="250" >
- <panel
- name="chat_bar"
- filename="panel_nearby_chat_bar.xml"
- left="0"
- height="28"
- width="248"
- top="0"
- mouse_opaque="false"
- follows="left|right"
- />
- </layout_panel>
- <!--
- This 5px Panel is an indicator of where the resize handle is.
- The panel provides a gap between the resize handle icon and a button to the right.
- -->
- <layout_panel
- auto_resize="false"
- layout="topleft"
- max_width="5"
- min_width="5"
- name="chat_bar_resize_handle_panel"
- user_resize="false"
- width="5">
- <icon
- follows="top|right"
- height="25"
- image_name="ChatBarHandle"
- layout="topleft"
- left="-7"
- name="resize_handle"
- top="4"
- width="5" />
- </layout_panel>
- <layout_panel
- auto_resize="false"
- follows="left|right"
- height="28"
- layout="topleft"
- min_height="28"
- min_width="59"
- mouse_opaque="false"
- name="speak_panel"
- top_delta="0"
- user_resize="false"
- width="108">
- <talk_button
- follows="left|right"
- height="23"
- layout="topleft"
- left="0"
- name="talk"
- top="5"
- width="105">
- <show_button
- tab_stop="true">
- <init_callback
- function="Button.SetDockableFloaterToggle"
- parameter="voice_controls" />
- </show_button>
- <!-- do not remove halign attribute with default value. otherwise it can't be overridden in other locales.
- & pad_right is default value for long label which can be right aligned. See EXT-6318 -->
- <speak_button
- halign="center"
- label="Speak"
- label_selected="Speak"
- name="speak_btn"
- pad_right="20"
- tab_stop="true"
- use_ellipses="true" />
- </talk_button>
- </layout_panel>
- <layout_panel
- auto_resize="false"
- follows="right"
- height="28"
- layout="topleft"
- min_height="28"
- min_width="65"
- mouse_opaque="false"
- name="gesture_panel"
- top_delta="0"
- user_resize="false"
- width="85">
- <gesture_combo_list
- follows="left|right"
- height="23"
- label="Gesture"
- layout="topleft"
- left="0"
- name="Gesture"
- tool_tip="Shows/hides gestures"
- top="5"
- width="82">
- <combo_button
- pad_right="10"
- use_ellipses="true" />
- <combo_list
- page_lines="17" />
- </gesture_combo_list>
- </layout_panel>
- <layout_panel
- auto_resize="false"
- follows="right"
- height="28"
- layout="topleft"
- min_height="28"
- min_width="52"
- mouse_opaque="false"
- name="movement_panel"
- user_resize="false"
- width="83">
- <bottomtray_button
- follows="left|right"
- height="23"
- image_pressed="PushButton_Press"
- image_pressed_selected="PushButton_Selected_Press"
- image_selected="PushButton_Selected_Press"
- is_toggle="true"
- label="Move"
- layout="topleft"
- name="movement_btn"
- tool_tip="Shows/hides movement controls"
- top="5"
- use_ellipses="true"
- width="80">
- <init_callback
- function="Button.SetDockableFloaterToggle"
- parameter="moveview" />
- </bottomtray_button>
-
- </layout_panel>
- <layout_panel
- auto_resize="false"
- follows="left|right"
- height="28"
- layout="topleft"
- min_height="28"
- min_width="52"
- mouse_opaque="false"
- name="cam_panel"
- user_resize="false"
- width="83">
- <bottomtray_button
- follows="left|right"
- height="23"
- image_pressed="PushButton_Press"
- image_pressed_selected="PushButton_Selected_Press"
- image_selected="PushButton_Selected_Press"
- is_toggle="true"
- label="View"
- layout="topleft"
- left="0"
- name="camera_btn"
- tool_tip="Shows/hides camera controls"
- top="5"
- use_ellipses="true"
- width="80">
- <init_callback
- function="Button.SetDockableFloaterToggle"
- parameter="camera" />
- </bottomtray_button>
- </layout_panel>
- <layout_panel
- auto_resize="false"
- follows="left|right"
- height="28"
- layout="topleft"
- min_width="40"
- mouse_opaque="false"
- name="snapshot_panel"
- user_resize="false"
- width="39">
- <bottomtray_button
- follows="left|right"
- height="23"
- image_overlay="Snapshot_Off"
- image_pressed="PushButton_Press"
- image_pressed_selected="PushButton_Selected_Press"
- image_selected="PushButton_Selected_Press"
- is_toggle="true"
- layout="topleft"
- left="0"
- name="snapshots"
- tool_tip="Take snapshot"
- top="5"
- width="36">
- <init_callback
- function="Button.SetFloaterToggle"
- parameter="snapshot" />
- </bottomtray_button>
- </layout_panel>
- <layout_panel
- auto_resize="false"
- follows="left|right"
- height="28"
- layout="topleft"
- min_height="28"
- min_width="52"
- mouse_opaque="false"
- name="build_btn_panel"
- user_resize="false"
- width="83">
- <!--*FIX: Build Floater is not opened with default registration. Will be fixed soon.
-Disabled for now.
--->
- <bottomtray_button
- follows="left|right"
- height="23"
- image_pressed="PushButton_Press"
- image_pressed_selected="PushButton_Selected_Press"
- image_selected="PushButton_Selected_Press"
- is_toggle="true"
- label="Build"
- layout="topleft"
- left="0"
- name="build_btn"
- tool_tip="Shows/hides Build Tools"
- top="5"
- use_ellipses="true"
- width="80">
- <commit_callback
- function="Build.Toggle"
- parameter="build" />
- </bottomtray_button>
- </layout_panel>
- <layout_panel
- auto_resize="false"
- follows="left|right"
- height="28"
- layout="topleft"
- min_height="28"
- min_width="52"
- mouse_opaque="false"
- name="search_btn_panel"
- user_resize="false"
- width="83">
- <bottomtray_button
- follows="left|right"
- height="23"
- image_pressed="PushButton_Press"
- image_pressed_selected="PushButton_Selected_Press"
- image_selected="PushButton_Selected_Press"
- is_toggle="true"
- label="Search"
- layout="topleft"
- left="0"
- name="search_btn"
- tool_tip="Shows/hides Search"
- top="5"
- use_ellipses="true"
- width="80">
- <init_callback
- function="Button.SetFloaterToggle"
- parameter="search" />
- </bottomtray_button>
- </layout_panel>
- <layout_panel
- auto_resize="false"
- follows="left|right"
- height="28"
- layout="topleft"
- min_height="28"
- min_width="52"
- mouse_opaque="false"
- name="world_map_btn_panel"
- user_resize="false"
- width="83">
- <bottomtray_button
- follows="left|right"
- height="23"
- image_pressed="PushButton_Press"
- image_pressed_selected="PushButton_Selected_Press"
- image_selected="PushButton_Selected_Press"
- is_toggle="true"
- label="Map"
- layout="topleft"
- left="0"
- name="world_map_btn"
- tool_tip="Shows/hides World Map"
- top="5"
- use_ellipses="true"
- width="80">
- <init_callback
- function="Button.SetFloaterToggle"
- parameter="world_map" />
- </bottomtray_button>
- </layout_panel>
- <layout_panel
- auto_resize="false"
- follows="left|right"
- height="28"
- layout="topleft"
- min_height="28"
- min_width="62"
- mouse_opaque="false"
- name="mini_map_btn_panel"
- user_resize="false"
- width="83">
- <bottomtray_button
- follows="left|right"
- height="23"
- image_pressed="PushButton_Press"
- image_pressed_selected="PushButton_Selected_Press"
- image_selected="PushButton_Selected_Press"
- is_toggle="true"
- label="Mini-Map"
- layout="topleft"
- left="0"
- name="mini_map_btn"
- tool_tip="Shows/hides Mini-Map"
- top="5"
- use_ellipses="true"
- width="80">
- <init_callback
- function="Button.SetFloaterToggle"
- parameter="mini_map" />
- </bottomtray_button>
- </layout_panel>
- <layout_panel
- follows="left|right"
- height="30"
- layout="topleft"
- min_width="95"
- mouse_opaque="false"
- name="chiclet_list_panel"
- top="0"
- user_resize="false"
- width="189">
-<!--*NOTE: min_width of the chiclet_panel (chiclet_list) must be the same
-as for parent layout_panel (chiclet_list_panel) to resize bottom tray properly. EXT-991-->
- <chiclet_panel
- chiclet_padding="4"
- follows="left|right"
- height="24"
- layout="topleft"
- left="1"
- min_width="95"
- mouse_opaque="false"
- name="chiclet_list"
- top="7"
- width="189">
- <button
- auto_resize="true"
- follows="right"
- height="29"
- image_hover_selected="SegmentedBtn_Left_Over"
- image_hover_unselected="SegmentedBtn_Left_Over"
- image_overlay="Arrow_Small_Left"
- image_pressed="SegmentedBtn_Left_Press"
- image_pressed_selected="SegmentedBtn_Left_Press"
- image_selected="SegmentedBtn_Left_Off"
- image_unselected="SegmentedBtn_Left_Off"
- layout="topleft"
- name="chicklet_left_scroll_button"
- tab_stop="false"
- top="-28"
- visible="false"
- width="7" />
- <button
- auto_resize="true"
- follows="right"
- height="29"
- image_hover_selected="SegmentedBtn_Right_Over"
- image_hover_unselected="SegmentedBtn_Right_Over"
- image_overlay="Arrow_Small_Right"
- image_pressed="SegmentedBtn_Right_Press"
- image_pressed_selected="SegmentedBtn_Right_Press"
- image_selected="SegmentedBtn_Right_Off"
- image_unselected="SegmentedBtn_Right_Off"
- layout="topleft"
- name="chicklet_right_scroll_button"
- tab_stop="false"
- top="-28"
- visible="false"
- width="7" />
- </chiclet_panel>
- </layout_panel>
- <layout_panel auto_resize="false"
- user_resize="false"
- width="4"
- min_width="4"/>
- <layout_panel
- auto_resize="false"
- follows="right"
- height="28"
- layout="topleft"
- min_height="28"
- min_width="37"
- name="im_well_panel"
- top="0"
- user_resize="false"
- width="37">
- <chiclet_im_well
- follows="right"
- height="28"
- layout="topleft"
- left="0"
- max_displayed_count="99"
- name="im_well"
- top="0"
- width="35">
- <!--
-Emulate 4 states of button by background images, see details in EXT-3147. The same should be for notification_well button
-xml attribute Description
-image_unselected "Unlit" - there are no new messages
-image_selected "Unlit" + "Selected" - there are no new messages and the Well is open
-image_pressed "Lit" - there are new messages
-image_pressed_selected "Lit" + "Selected" - there are new messages and the Well is open
- -->
- <button
- auto_resize="true"
- follows="right"
- halign="center"
- height="23"
- image_overlay="Unread_IM"
- image_overlay_alignment="center"
- image_pressed="WellButton_Lit"
- image_pressed_selected="WellButton_Lit_Selected"
- image_selected="PushButton_Press"
- label_color="Black"
- left="0"
- name="Unread IM messages"
- tool_tip="Conversations"
- width="34">
- <init_callback
- function="Button.SetDockableFloaterToggle"
- parameter="im_well_window" />
- </button>
- </chiclet_im_well>
- </layout_panel>
- <layout_panel
- auto_resize="false"
- follows="right"
- height="28"
- layout="topleft"
- min_height="28"
- min_width="37"
- name="notification_well_panel"
- top="0"
- user_resize="false"
- width="37">
- <chiclet_notification
- follows="right"
- height="23"
- layout="topleft"
- left="0"
- max_displayed_count="99"
- name="notification_well"
- top="5"
- width="35">
- <button
- auto_resize="true"
- bottom_pad="3"
- follows="right"
- halign="center"
- height="23"
- image_overlay="Notices_Unread"
- image_overlay_alignment="center"
- image_pressed="WellButton_Lit"
- image_pressed_selected="WellButton_Lit_Selected"
- image_selected="PushButton_Press"
- label_color="Black"
- left="0"
- name="Unread"
- tool_tip="Notifications"
- width="34">
- <init_callback
- function="Button.SetDockableFloaterToggle"
- parameter="notification_well_window" />
- </button>
- </chiclet_notification>
- </layout_panel>
- <layout_panel
- auto_resize="false"
- user_resize="false"
- min_width="4"
- name="DUMMY2"
- width="8" />
- </layout_stack>
-</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_bottomtray_lite.xml b/indra/newview/skins/default/xui/en/panel_bottomtray_lite.xml
index b5e1a5f16d..f4722b05d6 100644
--- a/indra/newview/skins/default/xui/en/panel_bottomtray_lite.xml
+++ b/indra/newview/skins/default/xui/en/panel_bottomtray_lite.xml
@@ -31,7 +31,6 @@
width="1000">
<layout_panel
auto_resize="false"
- user_resize="false"
min_width="2"
width="2" />
<layout_panel
@@ -40,8 +39,7 @@
height="28"
layout="topleft"
width="310"
- min_width="188"
- user_resize="false">
+ min_width="188">
<panel
left="0"
filename="panel_nearby_chat_bar.xml"
@@ -61,8 +59,7 @@
width="82"
top_delta="0"
min_width="52"
- name="gesture_panel"
- user_resize="false">
+ name="gesture_panel">
<gesture_combo_list
follows="left|right"
height="23"
@@ -80,7 +77,6 @@
</layout_panel>
<layout_panel
auto_resize="false"
- user_resize="false"
min_width="3"
name="after_gesture_panel"
width="3"/>
diff --git a/indra/newview/skins/default/xui/en/panel_chat_item.xml b/indra/newview/skins/default/xui/en/panel_chat_item.xml
index 34c6e02684..6af1105400 100644
--- a/indra/newview/skins/default/xui/en/panel_chat_item.xml
+++ b/indra/newview/skins/default/xui/en/panel_chat_item.xml
@@ -2,7 +2,7 @@
<!-- All our XML is utf-8 encoded. -->
<panel
name="instant_message"
- width="315"
+ width="300"
height="180"
follows="all">
<avatar_icon
@@ -22,6 +22,7 @@
text_color="white"
word_wrap="true"
mouse_opaque="true"
+ valign="bottom"
name="msg_text">
</text_chat>
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_chiclet_bar.xml b/indra/newview/skins/default/xui/en/panel_chiclet_bar.xml
new file mode 100644
index 0000000000..ff0146490b
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_chiclet_bar.xml
@@ -0,0 +1,173 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel
+ background_visible="false"
+ chrome="true"
+ follows="left|top|right"
+ height="30"
+ layout="topleft"
+ mouse_opaque="false"
+ name="chiclet_bar"
+ width="1310">
+ <layout_stack
+ border_size="0"
+ clip="false"
+ follows="all"
+ height="30"
+ layout="topleft"
+ left="0"
+ mouse_opaque="false"
+ name="toolbar_stack"
+ orientation="horizontal"
+ top="0"
+ width="1310">
+ <layout_panel
+ follows="left|right"
+ height="30"
+ layout="topleft"
+ min_width="95"
+ mouse_opaque="false"
+ name="chiclet_list_panel"
+ auto_resize="true"
+ top="0"
+ width="189">
+ <chiclet_panel
+ chiclet_padding="4"
+ follows="left|right"
+ height="24"
+ layout="topleft"
+ left="1"
+ min_width="95"
+ mouse_opaque="false"
+ name="chiclet_list"
+ top="7"
+ width="189">
+ <button
+ auto_resize="false"
+ follows="right"
+ height="29"
+ image_hover_selected="SegmentedBtn_Left_Over"
+ image_hover_unselected="SegmentedBtn_Left_Over"
+ image_overlay="Arrow_Small_Left"
+ image_pressed="SegmentedBtn_Left_Press"
+ image_pressed_selected="SegmentedBtn_Left_Press"
+ image_selected="SegmentedBtn_Left_Off"
+ image_unselected="SegmentedBtn_Left_Off"
+ layout="topleft"
+ name="chicklet_left_scroll_button"
+ tab_stop="false"
+ top="-28"
+ visible="false"
+ width="12" />
+ <button
+ auto_resize="false"
+ follows="right"
+ height="29"
+ image_hover_selected="SegmentedBtn_Right_Over"
+ image_hover_unselected="SegmentedBtn_Right_Over"
+ image_overlay="Arrow_Small_Right"
+ image_pressed="SegmentedBtn_Right_Press"
+ image_pressed_selected="SegmentedBtn_Right_Press"
+ image_selected="SegmentedBtn_Right_Off"
+ image_unselected="SegmentedBtn_Right_Off"
+ layout="topleft"
+ name="chicklet_right_scroll_button"
+ tab_stop="false"
+ top="-28"
+ visible="false"
+ width="12" />
+ </chiclet_panel>
+ </layout_panel>
+ <layout_panel auto_resize="false"
+ width="4"
+ min_width="4"/>
+ <layout_panel
+ auto_resize="false"
+ follows="right"
+ height="28"
+ layout="topleft"
+ min_height="28"
+ min_width="37"
+ name="im_well_panel"
+ top="0"
+ width="37">
+ <chiclet_im_well
+ follows="right"
+ height="28"
+ layout="topleft"
+ left="0"
+ max_displayed_count="99"
+ name="im_well"
+ top="0"
+ width="35">
+ <!--
+Emulate 4 states of button by background images, see details in EXT-3147. The same should be for notification_well button
+xml attribute Description
+image_unselected "Unlit" - there are no new messages
+image_selected "Unlit" + "Selected" - there are no new messages and the Well is open
+image_pressed "Lit" - there are new messages
+image_pressed_selected "Lit" + "Selected" - there are new messages and the Well is open
+ -->
+ <button
+ auto_resize="false"
+ follows="right"
+ halign="center"
+ height="23"
+ image_overlay="Unread_IM"
+ image_overlay_alignment="center"
+ image_pressed="WellButton_Lit"
+ image_pressed_selected="WellButton_Lit_Selected"
+ image_selected="PushButton_Press"
+ label_color="Black"
+ left="0"
+ name="Unread IM messages"
+ tool_tip="Conversations"
+ width="34">
+ <init_callback
+ function="Button.SetDockableFloaterToggle"
+ parameter="im_well_window" />
+ </button>
+ </chiclet_im_well>
+ </layout_panel>
+ <layout_panel
+ auto_resize="false"
+ follows="right"
+ height="28"
+ layout="topleft"
+ min_height="28"
+ min_width="37"
+ name="notification_well_panel"
+ top="0"
+ width="37">
+ <chiclet_notification
+ follows="right"
+ height="23"
+ layout="topleft"
+ left="0"
+ max_displayed_count="99"
+ name="notification_well"
+ top="5"
+ width="35">
+ <button
+ auto_resize="false"
+ bottom_pad="3"
+ follows="right"
+ halign="center"
+ height="23"
+ image_overlay="Notices_Unread"
+ image_overlay_alignment="center"
+ image_pressed="WellButton_Lit"
+ image_pressed_selected="WellButton_Lit_Selected"
+ image_selected="PushButton_Press"
+ label_color="Black"
+ left="0"
+ name="Unread"
+ tool_tip="Notifications"
+ width="34">
+ <init_callback
+ function="Button.SetDockableFloaterToggle"
+ parameter="notification_well_window" />
+ </button>
+ </chiclet_notification>
+ </layout_panel>
+ </layout_stack>
+</panel>
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 6c8d994bc6..d4a2745d1d 100644
--- a/indra/newview/skins/default/xui/en/panel_classified_info.xml
+++ b/indra/newview/skins/default/xui/en/panel_classified_info.xml
@@ -289,8 +289,7 @@
left="0"
top="0"
width="290"
- height="16"
- user_resize="false">
+ height="16">
<text
follows="left|top"
font.style="BOLD"
@@ -327,8 +326,7 @@
left="0"
top="0"
width="290"
- height="16"
- user_resize="false">
+ height="16">
<text
follows="left|top"
font.style="BOLD"
@@ -357,8 +355,7 @@
left="0"
top="0"
width="290"
- height="215"
- user_resize="false">
+ height="215">
<text
auto_resize="false"
follows="left|top"
@@ -416,7 +413,6 @@
layout="bottomleft"
left="0"
name="layout_panel1"
- user_resize="false"
auto_resize="true"
width="101">
<button
@@ -436,7 +432,6 @@
layout="bottomleft"
left_pad="3"
name="show_on_map_btn_lp"
- user_resize="false"
auto_resize="true"
width="100">
<button
@@ -455,7 +450,6 @@
layout="bottomleft"
left_pad="3"
name="edit_btn_lp"
- user_resize="false"
auto_resize="true"
width="101">
<button
diff --git a/indra/newview/skins/default/xui/en/panel_cof_wearables.xml b/indra/newview/skins/default/xui/en/panel_cof_wearables.xml
index beea53437a..aa8e3d07a6 100644
--- a/indra/newview/skins/default/xui/en/panel_cof_wearables.xml
+++ b/indra/newview/skins/default/xui/en/panel_cof_wearables.xml
@@ -37,6 +37,7 @@
top="0"
width="311" />
</accordion_tab>
+ <!-- The Attachments title is overwritten by the definition of "Attachments remain" in strings.xml -->
<accordion_tab
layout="topleft"
name="tab_attachments"
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 e512d63f9e..3509eaa285 100644
--- a/indra/newview/skins/default/xui/en/panel_edit_classified.xml
+++ b/indra/newview/skins/default/xui/en/panel_edit_classified.xml
@@ -319,7 +319,6 @@
layout="bottomleft"
left="0"
name="save_changes_btn_lp"
- user_resize="false"
auto_resize="true"
width="156">
<button
@@ -339,7 +338,6 @@
layout="bottomleft"
left_pad="3"
name="show_on_map_btn_lp"
- user_resize="false"
auto_resize="true"
width="157">
<button
diff --git a/indra/newview/skins/default/xui/en/panel_edit_jacket.xml b/indra/newview/skins/default/xui/en/panel_edit_jacket.xml
index 8e8d8e6505..0f8c37c691 100644
--- a/indra/newview/skins/default/xui/en/panel_edit_jacket.xml
+++ b/indra/newview/skins/default/xui/en/panel_edit_jacket.xml
@@ -32,7 +32,7 @@
name="Upper Fabric"
tool_tip="Click to choose a picture"
top="10"
- width="74" >
+ width="75" >
<texture_picker.commit_callback
function="TexturePicker.Commit" />
</texture_picker>
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 2ec2e03e8c..0faa1598b1 100644
--- a/indra/newview/skins/default/xui/en/panel_edit_pick.xml
+++ b/indra/newview/skins/default/xui/en/panel_edit_pick.xml
@@ -201,7 +201,6 @@
layout="topleft"
left="0"
name="layout_panel1"
- user_resize="false"
auto_resize="true"
width="150">
<button
@@ -221,7 +220,6 @@
layout="topleft"
left_pad="4"
name="layout_panel2"
- user_resize="false"
auto_resize="true"
width="146">
<button
diff --git a/indra/newview/skins/default/xui/en/panel_edit_profile.xml b/indra/newview/skins/default/xui/en/panel_edit_profile.xml
index 442eb8c28d..2c7c8133d1 100644
--- a/indra/newview/skins/default/xui/en/panel_edit_profile.xml
+++ b/indra/newview/skins/default/xui/en/panel_edit_profile.xml
@@ -435,7 +435,6 @@
layout="bottomleft"
name="save_changes_btn_lp"
top="0"
- user_resize="false"
auto_resize="true"
width="153">
<button
@@ -456,7 +455,6 @@
left_pad="3"
name="show_on_map_btn_lp"
top="0"
- user_resize="false"
auto_resize="true"
width="154">
<button
diff --git a/indra/newview/skins/default/xui/en/panel_edit_skin.xml b/indra/newview/skins/default/xui/en/panel_edit_skin.xml
index 45591ba2ad..b61f65a3d1 100644
--- a/indra/newview/skins/default/xui/en/panel_edit_skin.xml
+++ b/indra/newview/skins/default/xui/en/panel_edit_skin.xml
@@ -27,10 +27,10 @@
default_image_name="Default"
follows="left|top"
height="80"
- label="Head Tattoos"
+ label="Head"
layout="topleft"
left="25"
- name="Head Tattoos"
+ name="Head"
tool_tip="Click to choose a picture"
top="10"
width="74" >
@@ -43,10 +43,10 @@
default_image_name="Default"
follows="left|top"
height="80"
- label="Upper Tattoos"
+ label="Upper body"
layout="topleft"
left_pad="20"
- name="Upper Tattoos"
+ name="Upper Body"
tool_tip="Click to choose a picture"
top="10"
width="74" >
@@ -59,10 +59,10 @@
default_image_name="Default"
follows="left|top"
height="80"
- label="Lower Tattoos"
+ label="Lower body"
layout="topleft"
left_pad="20"
- name="Lower Tattoos"
+ name="Lower Body"
tool_tip="Click to choose a picture"
top="10"
width="74" >
diff --git a/indra/newview/skins/default/xui/en/panel_edit_wearable.xml b/indra/newview/skins/default/xui/en/panel_edit_wearable.xml
index c8764a6a84..69a692e2c4 100644
--- a/indra/newview/skins/default/xui/en/panel_edit_wearable.xml
+++ b/indra/newview/skins/default/xui/en/panel_edit_wearable.xml
@@ -454,7 +454,6 @@
left="0"
mouse_opaque="false"
name="save_as_btn_lp"
- user_resize="false"
auto_resize="true"
width="154">
<button
@@ -474,7 +473,6 @@
left_pad="3"
mouse_opaque="false"
name="revert_btn_lp"
- user_resize="false"
auto_resize="true"
width="152">
<button
diff --git a/indra/newview/skins/default/xui/en/panel_group_control_panel.xml b/indra/newview/skins/default/xui/en/panel_group_control_panel.xml
index c1dc2aaaf7..ad10e53a4e 100644
--- a/indra/newview/skins/default/xui/en/panel_group_control_panel.xml
+++ b/indra/newview/skins/default/xui/en/panel_group_control_panel.xml
@@ -26,8 +26,7 @@
mouse_opaque="false"
width="145"
top="0"
- name="speakers_list_panel"
- user_resize="false">
+ name="speakers_list_panel">
<avatar_list
color="DkGray2"
follows="all"
@@ -48,8 +47,7 @@
layout="topleft"
min_height="28"
width="130"
- name="group_info_btn_panel"
- user_resize="false">
+ name="group_info_btn_panel">
<button
follows="left|right|bottom"
height="23"
@@ -66,8 +64,7 @@
layout="topleft"
min_height="28"
width="130"
- name="call_btn_panel"
- user_resize="false">
+ name="call_btn_panel">
<button
follows="all"
height="23"
@@ -84,7 +81,6 @@
min_height="28"
width="130"
name="end_call_btn_panel"
- user_resize="false"
visible="false">
<button
follows="all"
@@ -101,7 +97,6 @@
min_height="28"
width="130"
name="voice_ctrls_btn_panel"
- user_resize="false"
visible="false">
<button
follows="all"
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 ec3f3b48bc..206496cc0e 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
@@ -97,6 +97,7 @@ background_visible="true"
follows="all"
layout="topleft"
auto_resize="true"
+ user_resize="true"
height="513"
width="313">
<accordion
@@ -195,7 +196,6 @@ background_visible="true"
layout="bottomleft"
left="0"
name="btn_refresh_lp"
- user_resize="false"
auto_resize="false"
width="24">
<button
@@ -215,7 +215,6 @@ background_visible="true"
layout="bottomleft"
left_pad="3"
name="btn_chat_lp"
- user_resize="false"
auto_resize="true"
width="91">
<button
@@ -234,7 +233,6 @@ background_visible="true"
layout="bottomleft"
left_pad="3"
name="call_btn_lp"
- user_resize="false"
auto_resize="true"
width="91">
<button
@@ -255,7 +253,6 @@ background_visible="true"
layout="bottomleft"
left_pad="3"
name="btn_apply_lp"
- user_resize="false"
auto_resize="true"
width="91">
<button
diff --git a/indra/newview/skins/default/xui/en/panel_group_land_money.xml b/indra/newview/skins/default/xui/en/panel_group_land_money.xml
index eff674c628..d4da55e32e 100644
--- a/indra/newview/skins/default/xui/en/panel_group_land_money.xml
+++ b/indra/newview/skins/default/xui/en/panel_group_land_money.xml
@@ -272,6 +272,7 @@
top="0"
width="313">
<text_editor
+ font="Monospace"
enabled="false"
type="string"
follows="all"
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 9f73b7c540..8fcd6ccbaf 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
@@ -32,8 +32,7 @@
min_height="20"
width="140"
name="view_profile_btn_panel"
- top="0"
- user_resize="false">
+ top="0" >
<button
follows="left|top|right"
height="23"
@@ -49,8 +48,7 @@
layout="topleft"
min_height="25"
width="140"
- name="add_friend_btn_panel"
- user_resize="false">
+ name="add_friend_btn_panel">
<button
follows="left|top|right"
height="23"
@@ -66,8 +64,7 @@
layout="topleft"
min_height="25"
width="140"
- name="teleport_btn_panel"
- user_resize="false">
+ name="teleport_btn_panel">
<button
auto_resize="false"
follows="left|top|right"
@@ -84,8 +81,7 @@
layout="topleft"
min_height="25"
width="140"
- name="share_btn_panel"
- user_resize="false">
+ name="share_btn_panel">
<button
auto_resize="true"
follows="left|top|right"
@@ -101,8 +97,7 @@
layout="topleft"
min_height="25"
width="140"
- name="pay_btn_panel"
- user_resize="false">
+ name="pay_btn_panel">
<button
auto_resize="true"
follows="left|top|right"
@@ -118,8 +113,7 @@
layout="topleft"
min_height="25"
width="140"
- name="call_btn_panel"
- user_resize="false">
+ name="call_btn_panel">
<button
follows="left|top|right"
height="23"
@@ -135,7 +129,6 @@
min_height="25"
width="140"
name="end_call_btn_panel"
- user_resize="false"
visible="false">
<button
follows="left|top|right"
@@ -152,7 +145,6 @@
min_height="25"
width="140"
name="voice_ctrls_btn_panel"
- user_resize="false"
visible="false">
<button
follows="left|top|right"
@@ -169,7 +161,6 @@
layout="topleft"
min_height="0"
width="140"
- name="spacer"
- user_resize="false" />
+ name="spacer"/>
</layout_stack>
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_landmarks.xml b/indra/newview/skins/default/xui/en/panel_landmarks.xml
index 23d8cb11ca..2a5933e3e9 100644
--- a/indra/newview/skins/default/xui/en/panel_landmarks.xml
+++ b/indra/newview/skins/default/xui/en/panel_landmarks.xml
@@ -114,7 +114,6 @@
height="25"
layout="topleft"
name="options_gear_btn_panel"
- user_resize="false"
width="32">
<menu_button
follows="bottom|left"
@@ -135,7 +134,6 @@
height="25"
layout="topleft"
name="add_btn_panel"
- user_resize="false"
width="32">
<button
follows="bottom|left"
@@ -156,7 +154,6 @@
height="25"
layout="topleft"
name="dummy_panel"
- user_resize="false"
width="212">
<icon
follows="bottom|left|right"
@@ -173,7 +170,6 @@
height="25"
layout="topleft"
name="trash_btn_panel"
- user_resize="false"
width="31">
<dnd_button
follows="bottom|left"
diff --git a/indra/newview/skins/default/xui/en/panel_login.xml b/indra/newview/skins/default/xui/en/panel_login.xml
index 1c3e08d59b..223326dd06 100644
--- a/indra/newview/skins/default/xui/en/panel_login.xml
+++ b/indra/newview/skins/default/xui/en/panel_login.xml
@@ -22,17 +22,17 @@ top="600"
<!-- *NOTE: Custom resize logic for login_html in llpanellogin.cpp -->
<web_browser
tab_stop="false"
-trusted_content="true"
-bg_opaque_color="Black"
-border_visible="false"
-bottom="600"
-follows="all"
-left="0"
-name="login_html"
-start_url=""
-top="0"
-height="600"
- width="980" />
+ trusted_content="true"
+ bg_opaque_color="Black"
+ border_visible="false"
+ bottom="600"
+ follows="all"
+ left="0"
+ name="login_html"
+ start_url=""
+ top="0"
+ height="600"
+ width="980"/>
<layout_stack
follows="left|bottom|right"
name="login_widgets"
@@ -48,7 +48,6 @@ name="login"
layout="topleft"
width="705"
min_width="705"
-user_resize="false"
height="80">
<text
follows="left|bottom"
@@ -120,33 +119,6 @@ label="Remember password"
follows="left|bottom"
font="SansSerifSmall"
height="15"
- left_pad="10"
- name="mode_selection_text"
- top="20"
- width="130">
- Mode:
- </text>
- <combo_box
- follows="left|bottom"
- height="23"
- max_chars="128"
- tool_tip="Select your mode. Choose Basic for fast, easy exploration and chat. Choose Advanced to access more features."
- top_pad="0"
- name="mode_combo"
- width="110">
- <combo_box.item
- label="Basic"
- name="Basic"
- value="settings_minimal.xml" />
- <combo_box.item
- label="Advanced"
- name="Advanced"
- value="" />
- </combo_box>
- <text
- follows="left|bottom"
- font="SansSerifSmall"
- height="15"
left_pad="8"
name="start_location_text"
top="20"
@@ -192,7 +164,6 @@ follows="right|bottom"
name="links"
width="205"
min_width="205"
-user_resize="false"
height="80">
<text
follows="right|bottom"
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 e6c5110999..d6d8b2a83e 100644
--- a/indra/newview/skins/default/xui/en/panel_main_inventory.xml
+++ b/indra/newview/skins/default/xui/en/panel_main_inventory.xml
@@ -1,6 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel
- background_visible="true"
default_tab_group="1"
follows="all"
height="423"
@@ -51,10 +50,6 @@
top="18"
width="303" />
<tab_container
- bg_alpha_color="DkGray"
- bg_opaque_color="DkGray"
- background_visible="true"
- background_opaque="true"
follows="all"
halign="center"
height="339"
@@ -71,7 +66,6 @@
bg_opaque_color="DkGray2"
bg_alpha_color="DkGray2"
background_visible="true"
- background_opaque="true"
border="false"
bevel_style="none"
follows="all"
@@ -90,7 +84,6 @@
bg_opaque_color="DkGray2"
bg_alpha_color="DkGray2"
background_visible="true"
- background_opaque="true"
border="false"
bevel_style="none"
follows="all"
@@ -119,7 +112,6 @@
height="25"
layout="topleft"
name="options_gear_btn_panel"
- user_resize="false"
width="32">
<menu_button
follows="bottom|left"
@@ -140,7 +132,6 @@
height="25"
layout="topleft"
name="add_btn_panel"
- user_resize="false"
width="32">
<button
follows="bottom|left"
@@ -161,7 +152,6 @@
height="25"
layout="topleft"
name="dummy_panel"
- user_resize="false"
width="212">
<icon
follows="bottom|left|right"
@@ -178,7 +168,6 @@
height="25"
layout="topleft"
name="trash_btn_panel"
- user_resize="false"
width="31">
<dnd_button
follows="bottom|left"
diff --git a/indra/newview/skins/default/xui/en/panel_me.xml b/indra/newview/skins/default/xui/en/panel_me.xml
index 84b5d11ba7..23e7814cad 100644
--- a/indra/newview/skins/default/xui/en/panel_me.xml
+++ b/indra/newview/skins/default/xui/en/panel_me.xml
@@ -10,43 +10,10 @@
name="panel_me"
top="0"
width="333">
- <!--<text
- type="string"
- follows="top|left|right"
- font="SansSerifHugeBold"
- height="20"
- layout="topleft"
- left="15"
- name="user_name"
- text_color="white"
- top="0"
- mouse_opaque="true"
- width="280">
- (Loading...)
- </text> -->
- <tab_container
- follows="all"
- height="555"
- halign="center"
- layout="topleft"
- left="5"
- name="tabs"
- tab_min_width="95"
- tab_height="30"
- tab_position="top"
- top_pad="10"
- width="317">
- <panel
- class="panel_my_profile"
- filename="panel_my_profile.xml"
- label="MY PROFILE"
- help_topic="panel_my_profile_tab"
- name="panel_profile" />
- <panel
- class="panel_picks"
- filename="panel_picks.xml"
- label="MY PICKS"
- help_topic="panel_my_picks_tab"
- name="panel_picks" />
- </tab_container>
+ <panel
+ class="panel_picks"
+ filename="panel_picks.xml"
+ label="MY PICKS"
+ help_topic="panel_my_picks_tab"
+ name="panel_picks"/>
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_my_profile.xml b/indra/newview/skins/default/xui/en/panel_my_profile.xml
deleted file mode 100644
index 4bd2235cda..0000000000
--- a/indra/newview/skins/default/xui/en/panel_my_profile.xml
+++ /dev/null
@@ -1,146 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<panel
- follows="all"
- height="535"
- label="Profile"
- layout="topleft"
- left="0"
- name="panel_profile"
- top="0"
- width="315">
- <string
- name="CaptionTextAcctInfo">
- [ACCTTYPE]
-[PAYMENTINFO] [AGEVERIFICATION]
- </string>
- <string
- name="payment_update_link_url">
- http://www.secondlife.com/account/billing.php?lang=en
- </string>
- <string
- name="partner_edit_link_url">
- http://www.secondlife.com/account/partners.php?lang=en
- </string>
- <string
- name="my_account_link_url"
- value="http://secondlife.com/account" />
- <string
- name="no_partner_text"
- value="None" />
- <string
- name="no_group_text"
- value="None" />
- <string
- name="RegisterDateFormat">
- [REG_DATE] ([AGE])
- </string>
- <string
- name="name_text_args">
- [NAME]
- </string>
- <string
- name="display_name_text_args">
- [DISPLAY_NAME]
- </string>
- <layout_stack
- name="layout"
- orientation="vertical"
- follows="all"
- layout="topleft"
- left="0"
- top="0"
- height="510"
- width="315"
- border_size="0">
- <layout_panel
- name="profile_stack"
- follows="all"
- layout="topleft"
- top="0"
- left="0"
- height="492"
- user_resize="false"
- width="315">
- <scroll_container
- color="DkGray2"
- follows="all"
- layout="topleft"
- left="0"
- name="profile_scroll"
- opaque="true"
- height="488"
- width="315"
- top="0">
- <panel
- layout="topleft"
- follows="left|top|right"
- height="488"
- name="scroll_content_panel"
- top="0"
- left="0"
- width="297">
- <panel
- follows="left|top|right"
- height="117"
- layout="topleft"
- left="10"
- name="second_life_image_panel"
- top="0"
- width="297">
-
- <texture_picker
- allow_no_texture="true"
- default_image_name="None"
- enabled="false"
- fallback_image="Generic_Person_Large"
- follows="top|left"
- height="124"
- layout="topleft"
- left="3"
- name="2nd_life_pic"
- top="10"
- width="102" />
-
- <text
- follows="left|top|right"
- font="SansSerifLarge"
- font.style="BOLD"
- height="15"
- layout="topleft"
- left_pad="10"
- name="display_name_descr_text"
- text_color="0.7 0.7 0.7 1.0"
- top_delta="0"
- width="280" >
- User name
- </text>
-
- <text
- follows="left|top|right"
- font.style="BOLD"
- height="15"
- layout="topleft"
- left_delta="0"
- name="name_descr_text"
- text_color="0.4 0.4 0.4 1.0"
- top_delta="20"
- width="280">
- Display Name
- </text>
-
- <button
- follows="bottom"
- height="23"
- left_delta="0"
- top_delta="20"
- label="Profile"
- name="see_profile_btn"
- tool_tip="See profile for this avatar"
- width="120" />
-
- </panel>
- </panel>
- </scroll_container>
- </layout_panel>
- </layout_stack>
-</panel>
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 51ffec4727..4bf420b79f 100644
--- a/indra/newview/skins/default/xui/en/panel_navigation_bar.xml
+++ b/indra/newview/skins/default/xui/en/panel_navigation_bar.xml
@@ -5,21 +5,21 @@
bg_opaque_color="MouseGray"
follows="left|top|right"
focus_root="true"
- height="60"
+ height="34"
layout="topleft"
name="navigation_bar"
chrome="true"
- width="600">
+ width="800">
<icon
follows="all"
image_name="NavBar_BG"
mouse_opaque="false"
name="bg_icon"
scale_image="true"
- visible="true"
+ visible="false"
left="0"
top="0"
- height="60"
+ height="34"
width="600"/>
<icon
follows="all"
@@ -30,7 +30,7 @@
visible="false"
left="0"
top="0"
- height="60"
+ height="34"
width="600"/>
<icon
follows="all"
@@ -41,146 +41,163 @@
visible="false"
left="0"
top="0"
- height="60"
+ height="34"
width="600"/>
- <panel
- background_visible="false"
- follows="left|top|right"
- top="3"
- height="23"
- layout="topleft"
- name="navigation_panel"
- width="600">
- <pull_button
- follows="left|top"
- direction="down"
- height="23"
- image_overlay="Arrow_Left_Off"
- image_bottom_pad="1"
- layout="topleft"
- left="10"
- name="back_btn"
- tool_tip="Go back to previous location"
- top="2"
- width="31" />
- <pull_button
- follows="left|top"
- direction="down"
- height="23"
- image_overlay="Arrow_Right_Off"
- image_bottom_pad="1"
- layout="topleft"
- left_pad="0"
- name="forward_btn"
- tool_tip="Go forward one location"
- top_delta="0"
- width="31" />
- <button
- follows="left|top"
- height="23"
- image_bottom_pad="1"
- image_overlay="Home_Off"
- layout="topleft"
- left_pad="7"
- name="home_btn"
- tool_tip="Teleport to my home location"
- top_delta="0"
- width="32" />
- <location_input
- follows="left|right|top"
- halign="right"
- height="23"
- label="Location"
- layout="topleft"
- left_pad="7"
- max_chars="254"
- mouse_opaque="false"
- name="location_combo"
- top_delta="0"
- width="226">
- <combo_list
- mouse_wheel_opaque="true"/>
- <!-- *TODO: Delete. Let the location_input use the correct art sizes.
- <location_input.add_landmark_button
- height="18"
- name="location_combo_add"
- width="20" />
- <location_input.info_button
- height="18"
- name="location_combo_info"
- width="20" />
- -->
- </location_input>
- <!-- <button -->
- <!-- follows="right|top" -->
- <!-- height="20" -->
- <!-- image_disabled="TextField_Search_Off" -->
- <!-- image_disabled_selected="TextField_Search_Off" -->
- <!-- image_hover_selected="TextField_Search_Off" -->
- <!-- image_hover_unselected="TextField_Search_Off" -->
- <!-- image_selected="TextField_Search_Off" -->
- <!-- image_unselected="TextField_Search_Off" -->
- <!-- layout="topleft" -->
- <!-- left_pad="5" -->
- <!-- mouse_opaque="false" -->
- <!-- name="search_bg" -->
- <!-- top_delta="0" -->
- <!-- width="168" /> -->
- <search_combo_box
- follows="right|top"
- halign="right"
- height="23"
- label="Search"
- layout="topleft"
- right="-10"
- mouse_opaque="false"
- name="search_combo_box"
- tool_tip="Search"
- top_delta="0"
- width="244" >
- <combo_editor
- label="Search [SECOND_LIFE]"
- name="search_combo_editor"/>
- <combo_list
- draw_border="true"
- border.highlight_light_color="FocusColor"
- border.highlight_dark_color="FocusColor"
- border.shadow_light_color="FocusColor"
- border.shadow_dark_color="FocusColor"
- mouse_wheel_opaque="true" />
- </search_combo_box>
- </panel>
- <favorites_bar
- follows="left|right|top"
- font="SansSerifSmall"
- height="15"
- layout="topleft"
- left="0"
- name="favorite"
- image_drag_indication="Accordion_ArrowOpened_Off"
- bottom="55"
- tool_tip="Drag Landmarks here for quick access to your favorite places in Second Life!"
- width="590">
- <label
- follows="left|top"
- height="15"
- layout="topleft"
- left="10"
- name="favorites_bar_label"
- text_color="LtGray"
- tool_tip="Drag Landmarks here for quick access to your favorite places in Second Life!"
- top="12"
- width="102">
- Favorites Bar
- </label>
- <chevron_button name=">>"
- image_unselected="TabIcon_Close_Off"
- image_selected="TabIcon_Close_Off"
- tab_stop="false"
- follows="left|bottom"
- tool_tip="Show more of My Favorites"
- width="15"
- top="15"
- height="15"/>
- </favorites_bar>
+ <icon
+ follows="all"
+ image_name="NavBar Separator"
+ mouse_opaque="false"
+ name="separator_image"
+ scale_image="true"
+ left="0"
+ top="0"
+ width="800"
+ height="2"/>
+ <layout_stack
+ follows="all"
+ height="34"
+ layout="topleft"
+ border_size="0"
+ resize_bar_overlap="3"
+ left="0"
+ mouse_opaque="false"
+ name="nvp_stack"
+ orientation="horizontal"
+ top="0"
+ width="800">
+ <layout_panel
+ follows="top|left"
+ layout="topleft"
+ auto_resize="true"
+ user_resize="true"
+ min_width="480"
+ name="navigation_layout_panel"
+ width="480">
+ <panel
+ background_visible="false"
+ follows="left|top|right"
+ top="3"
+ height="23"
+ layout="topleft"
+ left="0"
+ name="navigation_panel"
+ width="480">
+ <pull_button
+ follows="left|top"
+ direction="down"
+ height="23"
+ image_overlay="Arrow_Left_Off"
+ image_bottom_pad="1"
+ layout="topleft"
+ left="10"
+ name="back_btn"
+ tool_tip="Go back to previous location"
+ top="2"
+ width="31" />
+ <pull_button
+ follows="left|top"
+ direction="down"
+ height="23"
+ image_overlay="Arrow_Right_Off"
+ image_bottom_pad="1"
+ layout="topleft"
+ left_pad="0"
+ name="forward_btn"
+ tool_tip="Go forward one location"
+ top_delta="0"
+ width="31" />
+ <button
+ follows="left|top"
+ height="23"
+ image_bottom_pad="1"
+ image_overlay="Home_Off"
+ layout="topleft"
+ left_pad="7"
+ name="home_btn"
+ tool_tip="Teleport to my home location"
+ top_delta="0"
+ width="32" />
+ <location_input
+ follows="all"
+ halign="right"
+ height="23"
+ label="Location"
+ layout="topleft"
+ left_pad="7"
+ max_chars="254"
+ mouse_opaque="false"
+ name="location_combo"
+ top_delta="0"
+ width="355">
+ <combo_list
+ mouse_wheel_opaque="true"/>
+ </location_input>
+ </panel>
+ <icon
+ follows="top|right"
+ height="25"
+ image_name="ChatBarHandle"
+ layout="topleft"
+ left="-3"
+ name="resize_handle"
+ top="4"
+ width="5" />
+ </layout_panel>
+ <layout_panel
+ follows="top|left"
+ layout="topleft"
+ auto_resize="true"
+ user_resize="true"
+ min_width="315"
+ name="favorites_layout_panel"
+ width="315">
+ <icon
+ follows="top|left"
+ height="25"
+ image_name="ChatBarHandle"
+ layout="topleft"
+ left="-318"
+ name="resize_handle"
+ top="4"
+ width="5" />
+
+ <favorites_bar
+ follows="left|right|top"
+ font="SansSerifSmall"
+ height="20"
+ layout="topleft"
+ left="0"
+ top="4"
+ name="favorite"
+ image_drag_indication="Accordion_ArrowOpened_Off"
+ tool_tip="Drag Landmarks here for quick access to your favorite places in Second Life!"
+ width="311">
+ <label
+ follows="left|top"
+ height="15"
+ layout="topleft"
+ left="10"
+ name="favorites_bar_label"
+ text_color="LtGray"
+ tool_tip="Drag Landmarks here for quick access to your favorite places in Second Life!"
+ top="12"
+ width="102">
+ Favorites Bar
+ </label>
+ <!-- More button actually is a text box. -->
+ <more_button
+ follows="left|bottom"
+ name=">>"
+ tab_stop="false"
+ tool_tip="Show more of My Favorites"
+ top="13"
+ width="50"
+ bottom="0"
+ valign="bottom">
+ More &#9660;
+ </more_button>
+ </favorites_bar>
+ </layout_panel>
+
+ </layout_stack>
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_nearby_chat.xml b/indra/newview/skins/default/xui/en/panel_nearby_chat.xml
new file mode 100644
index 0000000000..d492f9bd68
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_nearby_chat.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel
+ height="300"
+ follows="all"
+ layout="topleft"
+ name="nearby_chat"
+ help_topic="nearby_chat"
+ width="320">
+ <check_box
+ bottom_delta="36"
+ control_name="TranslateChat"
+ enabled="true"
+ height="16"
+ label="Translate chat"
+ layout="topleft"
+ left="5"
+ name="translate_chat_checkbox"
+ width="230" />
+ <chat_history
+ parse_urls="true"
+ bg_readonly_color="ChatHistoryBgColor"
+ bg_writeable_color="ChatHistoryBgColor"
+ follows="all"
+ left="5"
+ top_delta="17"
+ layout="topleft"
+ height="260"
+ name="chat_history"
+ parse_highlights="true"
+ text_color="ChatHistoryTextColor"
+ text_readonly_color="ChatHistoryTextColor"
+ right_widget_pad="5"
+ left_widget_pad="0"
+ width="315" />
+</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_nearby_media.xml b/indra/newview/skins/default/xui/en/panel_nearby_media.xml
index bfc503f05b..d1cb64f7ad 100644
--- a/indra/newview/skins/default/xui/en/panel_nearby_media.xml
+++ b/indra/newview/skins/default/xui/en/panel_nearby_media.xml
@@ -196,7 +196,6 @@
name="stop"
mouse_opaque="false"
auto_resize="false"
- user_resize="false"
layout="topleft"
top="0"
height="22"
@@ -224,7 +223,6 @@
name="play"
mouse_opaque="false"
auto_resize="false"
- user_resize="false"
layout="topleft"
top="0"
height="22"
@@ -252,7 +250,6 @@
name="pause"
mouse_opaque="false"
auto_resize="false"
- user_resize="false"
layout="topleft"
top="0"
min_width="22"
@@ -279,7 +276,6 @@
name="volume_slider_ctrl"
mouse_opaque="false"
auto_resize="true"
- user_resize="false"
follows="left|right"
layout="topleft"
top="0"
@@ -304,7 +300,6 @@
name="mute"
mouse_opaque="false"
auto_resize="false"
- user_resize="false"
layout="topleft"
top="0"
height="72"
@@ -333,7 +328,6 @@
name="zoom"
mouse_opaque="false"
auto_resize="false"
- user_resize="false"
layout="topleft"
top="0"
height="28"
@@ -361,7 +355,6 @@
name="unzoom"
mouse_opaque="false"
auto_resize="false"
- user_resize="false"
layout="topleft"
top="0"
min_width="21"
@@ -388,8 +381,7 @@
<layout_panel
name="right_bookend"
width="0"
- mouse_opaque="false"
- user_resize="false" />
+ mouse_opaque="false"/>
</layout_stack>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_notes.xml b/indra/newview/skins/default/xui/en/panel_notes.xml
deleted file mode 100644
index 124b1cfc6b..0000000000
--- a/indra/newview/skins/default/xui/en/panel_notes.xml
+++ /dev/null
@@ -1,236 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<panel
- follows="all"
- height="515"
- label="Notes &amp; Privacy"
- layout="topleft"
- left="0"
- name="panel_notes"
- top="0"
- width="313"
->
- <layout_stack
- name="layout"
- orientation="vertical"
- follows="all"
- layout="topleft"
- left="0"
- top="0"
- height="517"
- width="313"
- border_size="0">
- <layout_panel
- name="notes_stack"
- follows="all"
- layout="topleft"
- top="0"
- left="0"
- height="450"
- width="313">
- <scroll_container
- color="DkGray2"
- follows="all"
- layout="topleft"
- left="0"
- name="profile_scroll"
- opaque="true"
- height="450"
- width="313"
- top="0">
- <panel
- height="450"
- layout="topleft"
- name="profile_scroll_panel"
- top="0"
- left="0"
- width="303">
- <text
- follows="left|top"
- font.style="BOLD"
- height="16"
- layout="topleft"
- left="11"
- name="status_message"
- text_color="white"
- top="10"
- value="My private notes:"
- width="293" />
- <text_editor
- follows="left|top"
- height="120"
- layout="topleft"
- left="12"
- max_length="1000"
- name="notes_edit"
- text_color="DkGray"
- top_pad="3"
- width="288"
- word_wrap="true" />
- <text
- follows="left|top"
- font.style="BOLD"
- height="16"
- layout="topleft"
- left="11"
- name="status_message2"
- text_color="white"
- top_pad="20"
- value="Allow this person to:"
- width="293" />
- <check_box
- enabled="false"
- height="16"
- label="See my online status"
- layout="topleft"
- left="10"
- name="status_check"
- width="293" />
- <check_box
- enabled="false"
- height="16"
- label="See me on the map"
- layout="topleft"
- left="10"
- name="map_check"
- width="293" />
- <check_box
- enabled="false"
- height="16"
- label="Edit, delete or take my objects"
- layout="topleft"
- left="10"
- name="objects_check"
- width="293" />
- </panel>
- </scroll_container>
- </layout_panel>
- <layout_panel
- follows="bottom|left"
- height="30"
- layout="topleft"
- left="0"
- name="notes_buttons_panel"
- auto_resize="false"
- width="313">
-
- <layout_stack
- follows="bottom|left|right"
- height="23"
- layout="topleft"
- name="bottom_bar_ls"
- left="2"
- orientation="horizontal"
- top_pad="5"
- width="309">
-
- <layout_panel
- follows="bottom|left|right"
- height="23"
- layout="bottomleft"
- left="0"
- name="add_friend_btn_lp"
- user_resize="false"
- auto_resize="true"
- width="118">
- <button
- follows="bottom|left|right"
- height="23"
- label="Add Friend"
- layout="topleft"
- left="1"
- mouse_opaque="false"
- name="add_friend"
- tool_tip="Offer friendship to the Resident"
- top="0"
- width="117" />
- </layout_panel>
-
- <layout_panel
- follows="bottom|left|right"
- height="23"
- layout="bottomleft"
- left_pad="3"
- name="im_btn_lp"
- user_resize="false"
- auto_resize="true"
- width="22">
- <button
- follows="bottom|left|right"
- height="23"
- label="IM"
- layout="topleft"
- name="im"
- tool_tip="Open instant message session"
- top="0"
- left="1"
- width="21" />
- </layout_panel>
-
- <layout_panel
- follows="bottom|left|right"
- height="23"
- layout="bottomleft"
- left_pad="3"
- name="call_btn_lp"
- user_resize="false"
- auto_resize="true"
- width="52">
- <button
- follows="bottom|left|right"
- height="23"
- label="Call"
- layout="topleft"
- name="call"
- tool_tip="Call this Resident"
- left="1"
- top="0"
- use_ellipses="true"
- width="51" />
- </layout_panel>
-
- <layout_panel
- follows="bottom|left|right"
- height="23"
- layout="bottomleft"
- left_pad="3"
- name="show_on_map_btn_lp"
- user_resize="false"
- auto_resize="true"
- width="46">
- <button
- enabled="false"
- follows="bottom|left|right"
- height="23"
- label="Map"
- layout="topleft"
- name="show_on_map_btn"
- tool_tip="Show the Resident on the map"
- top="0"
- left="1"
- width="45" />
- </layout_panel>
-
- <layout_panel
- follows="bottom|left|right"
- height="23"
- layout="bottomleft"
- left_pad="3"
- name="teleport_btn_lp"
- user_resize="false"
- auto_resize="true"
- width="81">
- <button
- follows="bottom|left|right"
- height="23"
- label="Teleport"
- layout="topleft"
- name="teleport"
- tool_tip="Offer teleport"
- left="1"
- top="0"
- width="80" />
- </layout_panel>
- </layout_stack>
- </layout_panel>
- </layout_stack>
-</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_notification.xml b/indra/newview/skins/default/xui/en/panel_notification.xml
index 59ead84127..f6f62ac54e 100644
--- a/indra/newview/skins/default/xui/en/panel_notification.xml
+++ b/indra/newview/skins/default/xui/en/panel_notification.xml
@@ -9,6 +9,8 @@
layout="topleft"
left="0"
name="notification_panel"
+ chrome="true"
+ show_title="false"
top="0"
height="140"
translate="false"
diff --git a/indra/newview/skins/default/xui/en/panel_outbox_inventory.xml b/indra/newview/skins/default/xui/en/panel_outbox_inventory.xml
index 66117615e4..a3d39e55af 100644
--- a/indra/newview/skins/default/xui/en/panel_outbox_inventory.xml
+++ b/indra/newview/skins/default/xui/en/panel_outbox_inventory.xml
@@ -8,7 +8,6 @@
bg_opaque_color="DkGray2"
bg_alpha_color="DkGray2"
background_visible="true"
- background_opaque="true"
border="false"
bevel_style="none"
show_item_link_overlays="true"
diff --git a/indra/newview/skins/default/xui/en/panel_outfit_edit.xml b/indra/newview/skins/default/xui/en/panel_outfit_edit.xml
index e1cd78bad8..b61f110e32 100644
--- a/indra/newview/skins/default/xui/en/panel_outfit_edit.xml
+++ b/indra/newview/skins/default/xui/en/panel_outfit_edit.xml
@@ -198,7 +198,6 @@ It is calculated as border_size + 2*UIResizeBarOverlap
height="154"
name="add_button_and_combobox"
width="311"
- user_resize="false"
visible="true">
<!-- List containing items from the COF and Base outfit -->
@@ -271,8 +270,7 @@ It is calculated as border_size + 2*UIResizeBarOverlap
height="30"
name="filter_panel"
width="311"
- visible="false"
- user_resize="false">
+ visible="false">
<filter_editor
background_image="TextField_Search_Off"
@@ -515,7 +513,6 @@ It is calculated as border_size + 2*UIResizeBarOverlap
left="0"
mouse_opaque="false"
name="save_btn_lp"
- user_resize="false"
auto_resize="true"
width="156">
<button
@@ -550,7 +547,6 @@ It is calculated as border_size + 2*UIResizeBarOverlap
left_pad="3"
mouse_opaque="false"
name="revert_btn_lp"
- user_resize="false"
auto_resize="true"
width="147">
<button
diff --git a/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml b/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml
index 2ad2416179..405d9513db 100644
--- a/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml
+++ b/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml
@@ -84,7 +84,6 @@
left="0"
mouse_opaque="false"
name="save_btn_lp"
- user_resize="false"
auto_resize="true"
width="156">
<button
@@ -118,7 +117,6 @@
left_pad="3"
mouse_opaque="false"
name="wear_btn_lp"
- user_resize="false"
auto_resize="true"
width="147">
<button
diff --git a/indra/newview/skins/default/xui/en/panel_people.xml b/indra/newview/skins/default/xui/en/panel_people.xml
index 0ebfd9c037..98c7c49ff4 100644
--- a/indra/newview/skins/default/xui/en/panel_people.xml
+++ b/indra/newview/skins/default/xui/en/panel_people.xml
@@ -284,7 +284,6 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M
height="25"
layout="topleft"
name="options_gear_btn_panel"
- user_resize="false"
width="32">
<menu_button
follows="bottom|left"
@@ -305,7 +304,6 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M
height="25"
layout="topleft"
name="add_btn_panel"
- user_resize="false"
width="32">
<button
follows="bottom|left"
@@ -326,7 +324,6 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M
height="25"
layout="topleft"
name="dummy_panel"
- user_resize="false"
width="210">
<icon
follows="bottom|left|right"
@@ -343,7 +340,6 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M
height="25"
layout="topleft"
name="trash_btn_panel"
- user_resize="false"
width="31">
<dnd_button
follows="bottom|left"
@@ -602,7 +598,6 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M
layout="bottomleft"
left="0"
name="view_profile_btn_lp"
- user_resize="false"
auto_resize="true"
width="68">
<button
@@ -623,7 +618,6 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M
layout="bottomleft"
left_pad="3"
name="im_btn_lp"
- user_resize="false"
auto_resize="true"
width="41">
<button
@@ -644,7 +638,6 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M
layout="bottomleft"
left_pad="3"
name="call_btn_lp"
- user_resize="false"
auto_resize="true"
width="52">
<button
@@ -665,7 +658,6 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M
layout="bottomleft"
left_pad="3"
name="share_btn_lp"
- user_resize="false"
auto_resize="true"
width="66">
<button
@@ -686,7 +678,6 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M
layout="bottomleft"
left_pad="3"
name="teleport_btn_lp"
- user_resize="false"
auto_resize="true"
width="77">
<button
@@ -720,7 +711,6 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M
left="0"
mouse_opaque="false"
name="group_info_btn_lp"
- user_resize="false"
auto_resize="true"
width="108">
<button
@@ -743,7 +733,6 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M
left_pad="3"
mouse_opaque="false"
name="chat_btn_lp"
- user_resize="false"
auto_resize="true"
width="101">
<button
@@ -766,7 +755,6 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M
left_pad="3"
mouse_opaque="false"
name="group_call_btn_lp"
- user_resize="false"
auto_resize="true"
width="96">
<button
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 7daa52b2d9..79d190e1e0 100644
--- a/indra/newview/skins/default/xui/en/panel_pick_info.xml
+++ b/indra/newview/skins/default/xui/en/panel_pick_info.xml
@@ -117,7 +117,7 @@
</scroll_container>
<panel
follows="left|right|bottom"
- height="35"
+ height="23"
layout="topleft"
top_pad="5"
left="8"
@@ -139,7 +139,6 @@
layout="bottomleft"
left="0"
name="layout_panel1"
- user_resize="false"
auto_resize="true"
width="101">
<button
@@ -158,7 +157,6 @@
layout="bottomleft"
left_pad="3"
name="show_on_map_btn_lp"
- user_resize="false"
auto_resize="true"
width="100">
<button
@@ -177,7 +175,6 @@
layout="bottomleft"
left_pad="3"
name="edit_btn_lp"
- user_resize="false"
auto_resize="true"
width="101">
<button
diff --git a/indra/newview/skins/default/xui/en/panel_picks.xml b/indra/newview/skins/default/xui/en/panel_picks.xml
index 87e263726d..8def96cada 100644
--- a/indra/newview/skins/default/xui/en/panel_picks.xml
+++ b/indra/newview/skins/default/xui/en/panel_picks.xml
@@ -4,12 +4,12 @@ bg_opaque_color="DkGray2"
background_visible="true"
background_opaque="true"
follows="all"
- height="548"
+ height="571"
label="Picks"
layout="topleft"
- left="0"
+ left="8"
name="panel_picks"
- top="0"
+ top_pad="0"
width="313">
<string
name="no_picks"
@@ -30,7 +30,7 @@ bg_opaque_color="DkGray2"
<accordion
fit_parent="true"
follows="all"
- height="485"
+ height="514"
layout="topleft"
left="0"
name="accordion"
@@ -81,10 +81,10 @@ bg_opaque_color="DkGray2"
left="1"
height="27"
label="bottom_panel"
- layout="bottom"
+ layout="topleft"
name="edit_panel"
- top_pad="-2"
- width="313">
+ top_pad="0"
+ width="312">
<layout_stack
follows="bottom|left|right"
@@ -102,7 +102,6 @@ bg_opaque_color="DkGray2"
layout="bottomleft"
left="0"
name="gear_menu_btn"
- user_resize="false"
auto_resize="true"
width="51">
<button
@@ -124,7 +123,6 @@ bg_opaque_color="DkGray2"
height="18"
layout="bottomleft"
name="trash_btn_lp"
- user_resize="false"
auto_resize="true"
width="18">
<button
@@ -149,8 +147,9 @@ bg_opaque_color="DkGray2"
follows="bottom|left|right"
layout="topleft"
left="0"
- height="40"
+ height="30"
name="buttons_cucks"
+ top_pad="0"
width="313">
<layout_stack
@@ -169,7 +168,6 @@ bg_opaque_color="DkGray2"
layout="topleft"
left="0"
name="info_btn_lp"
- user_resize="false"
auto_resize="true"
top="0"
width="95">
@@ -191,7 +189,6 @@ bg_opaque_color="DkGray2"
layout="bottomleft"
left_pad="2"
name="teleport_btn_lp"
- user_resize="false"
auto_resize="true"
width="117">
<button
@@ -211,7 +208,6 @@ bg_opaque_color="DkGray2"
height="28"
layout="bottomleft"
name="show_on_map_btn_lp"
- user_resize="false"
auto_resize="true"
left_pad="2"
width="90">
diff --git a/indra/newview/skins/default/xui/en/panel_place_profile.xml b/indra/newview/skins/default/xui/en/panel_place_profile.xml
index e280115bda..308acf0c0c 100644
--- a/indra/newview/skins/default/xui/en/panel_place_profile.xml
+++ b/indra/newview/skins/default/xui/en/panel_place_profile.xml
@@ -238,7 +238,6 @@
mouse_opaque="false"
name="here_panel"
top="0"
- user_resize="false"
width="60">
<icon
follows="top|left"
@@ -259,7 +258,6 @@
mouse_opaque="false"
name="for_sale_panel"
top="0"
- user_resize="false"
width="60">
<icon
follows="top|left"
diff --git a/indra/newview/skins/default/xui/en/panel_places.xml b/indra/newview/skins/default/xui/en/panel_places.xml
index 5d7334f780..f169dbb702 100644
--- a/indra/newview/skins/default/xui/en/panel_places.xml
+++ b/indra/newview/skins/default/xui/en/panel_places.xml
@@ -92,7 +92,6 @@ background_visible="true"
left="0"
mouse_opaque="false"
name="lp1"
- user_resize="false"
auto_resize="true"
width="193">
@@ -115,7 +114,6 @@ background_visible="true"
left="0"
mouse_opaque="false"
name="teleport_btn_lp"
- user_resize="false"
auto_resize="true"
width="109">
<button
@@ -137,7 +135,6 @@ background_visible="true"
left_pad="3"
mouse_opaque="false"
name="chat_btn_lp"
- user_resize="false"
auto_resize="true"
width="86">
<button
@@ -161,7 +158,6 @@ background_visible="true"
left_pad="0"
mouse_opaque="false"
name="lp2"
- user_resize="false"
auto_resize="true"
width="116">
@@ -185,7 +181,6 @@ background_visible="true"
left_pad="0"
mouse_opaque="false"
name="edit_btn_lp"
- user_resize="false"
auto_resize="true"
width="84">
<button
@@ -202,17 +197,16 @@ background_visible="true"
</layout_panel>
<layout_panel
- follows="bottom|left|right"
+ follows="bottom|right"
height="23"
layout="bottomleft"
left_pad="0"
mouse_opaque="false"
name="overflow_btn_lp"
- user_resize="false"
auto_resize="true"
width="24">
<menu_button
- follows="bottom|left|right"
+ follows="bottom|right"
height="23"
image_disabled="ComboButton_UpOff"
image_unselected="ComboButton_UpOff"
@@ -246,7 +240,6 @@ background_visible="true"
left_pad="3"
mouse_opaque="false"
name="profile_btn_lp"
- user_resize="false"
auto_resize="true"
width="102">
<button
@@ -283,7 +276,6 @@ background_visible="true"
mouse_opaque="false"
name="close_btn_lp"
top="0"
- user_resize="false"
auto_resize="true"
width="51">
<button
@@ -324,7 +316,6 @@ background_visible="true"
mouse_opaque="false"
name="save_btn_lp"
top="0"
- user_resize="false"
auto_resize="true"
width="153">
<button
@@ -347,7 +338,6 @@ background_visible="true"
mouse_opaque="false"
name="cancel_btn_lp"
top="0"
- user_resize="false"
auto_resize="true"
width="154">
<button
diff --git a/indra/newview/skins/default/xui/en/panel_postcard_message.xml b/indra/newview/skins/default/xui/en/panel_postcard_message.xml
new file mode 100644
index 0000000000..ab2a42ea01
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_postcard_message.xml
@@ -0,0 +1,125 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel
+ height="380"
+ layout="topleft"
+ name="panel_postcard_message"
+ width="490">
+ <text
+ type="string"
+ length="1"
+ bottom="35"
+ follows="top|left"
+ font="SansSerif"
+ height="16"
+ layout="topleft"
+ left="12"
+ name="to_label"
+ top="10"
+ width="60">
+ To:
+ </text>
+ <line_editor
+ control_name="LastPostcardRecipient"
+ follows="left|top|right"
+ height="20"
+ layout="topleft"
+ left_pad="10"
+ name="to_form"
+ right="-10"
+ top_delta="-4" />
+ <text
+ type="string"
+ length="1"
+ bottom_delta="23"
+ follows="top|left"
+ font="SansSerif"
+ height="16"
+ layout="topleft"
+ left="12"
+ name="name_label"
+ width="60">
+ From:
+ </text>
+ <line_editor
+ follows="left|top|right"
+ height="20"
+ layout="topleft"
+ left_pad="10"
+ max_length_bytes="100"
+ name="name_form"
+ right="-10"
+ top_delta="-4" />
+ <text
+ type="string"
+ length="1"
+ bottom_delta="23"
+ follows="top|left"
+ font="SansSerif"
+ height="16"
+ layout="topleft"
+ left="12"
+ name="subject_label"
+ width="60">
+ Subject:
+ </text>
+ <line_editor
+ follows="left|top|right"
+ height="20"
+ label="Type your subject here."
+ layout="topleft"
+ left_pad="10"
+ max_length_bytes="100"
+ name="subject_form"
+ right="-10"
+ top_delta="-4" />
+ <text
+ type="string"
+ length="1"
+ bottom_delta="23"
+ follows="top|left|right"
+ font="SansSerif"
+ layout="topleft"
+ left="12"
+ name="msg_label"
+ right="-10">
+ Message:
+ </text>
+ <text_editor
+ type="string"
+ length="1"
+ follows="left|top|right"
+ height="60"
+ layout="topleft"
+ left_delta="0"
+ max_length="700"
+ name="msg_form"
+ right="-10"
+ top_pad="10"
+ word_wrap="true">
+ Type your message here.
+ </text_editor>
+ <button
+ follows="right|bottom"
+ height="23"
+ label="Cancel"
+ layout="topleft"
+ name="cancel_btn"
+ right="-32"
+ top="350"
+ width="100">
+ <button.commit_callback
+ function="Postcard.Cancel" />
+ </button>
+ <button
+ follows="right|bottom"
+ height="23"
+ label="Send"
+ layout="topleft"
+ left_delta="-106"
+ name="send_btn"
+ top_delta="0"
+ width="100">
+ <button.commit_callback
+ function="Postcard.Send" />
+ </button>
+</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_postcard_settings.xml b/indra/newview/skins/default/xui/en/panel_postcard_settings.xml
new file mode 100644
index 0000000000..e9427a2388
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_postcard_settings.xml
@@ -0,0 +1,135 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel
+ height="380"
+ layout="topleft"
+ name="panel_postcard_settings"
+ width="490">
+ <combo_box
+ follows="left|top|right"
+ height="23"
+ label="Resolution"
+ layout="topleft"
+ left="10"
+ name="postcard_size_combo"
+ right="-10"
+ top_pad="10">
+ <combo_box.item
+ label="Current Window"
+ name="CurrentWindow"
+ value="[i0,i0]" />
+ <combo_box.item
+ label="640x480"
+ name="640x480"
+ value="[i640,i480]" />
+ <combo_box.item
+ label="800x600"
+ name="800x600"
+ value="[i800,i600]" />
+ <combo_box.item
+ label="1024x768"
+ name="1024x768"
+ value="[i1024,i768]" />
+ <combo_box.item
+ label="Custom"
+ name="Custom"
+ value="[i-1,i-1]" />
+ </combo_box>
+ <layout_stack
+ animate="false"
+ follows="all"
+ height="275"
+ layout="bottomleft"
+ name="postcard_image_params_ls"
+ left_delta="0"
+ orientation="vertical"
+ top_pad="10"
+ right="-10">
+ <layout_panel
+ follows="top|left|right"
+ height="60"
+ layout="topleft"
+ left="0"
+ name="postcard_image_size_lp"
+ auto_resize="false"
+ top="0"
+ right="-1"
+ visible="true">
+ <spinner
+ allow_text_entry="false"
+ decimal_digits="0"
+ follows="left|top"
+ height="20"
+ increment="32"
+ label="Width"
+ label_width="40"
+ layout="topleft"
+ left="10"
+ max_val="6016"
+ min_val="32"
+ name="postcard_snapshot_width"
+ top_pad="10"
+ width="95" />
+ <spinner
+ allow_text_entry="false"
+ decimal_digits="0"
+ follows="left|top"
+ height="20"
+ increment="32"
+ label="Height"
+ label_width="40"
+ layout="topleft"
+ left_pad="5"
+ max_val="6016"
+ min_val="32"
+ name="postcard_snapshot_height"
+ top_delta="0"
+ width="95" />
+ <check_box
+ bottom_delta="20"
+ follows="left|top"
+ label="Constrain proportions"
+ layout="topleft"
+ left="10"
+ name="postcard_keep_aspect_check" />
+ </layout_panel>
+ <layout_panel
+ follows="top|left|right"
+ height="23"
+ layout="topleft"
+ left="0"
+ name="postcard_image_format_quality_lp"
+ auto_resize="true"
+ top="0"
+ right="-1"
+ visible="true">
+ <slider
+ decimal_digits="0"
+ follows="left|top"
+ height="15"
+ increment="1"
+ initial_value="75"
+ label="Image quality"
+ label_width="80"
+ layout="topleft"
+ left="0"
+ max_val="100"
+ name="image_quality_slider"
+ top_pad="7"
+ width="190" />
+ <text
+ type="string"
+ follows="left|top"
+ font="SansSerifSmall"
+ length="1"
+ height="14"
+ layout="topleft"
+ left_pad="-5"
+ halign="left"
+ name="image_quality_level"
+ top_delta="0"
+ width="60">
+ ([QLVL])
+ </text>
+ </layout_panel>
+ </layout_stack>
+</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 ea09286592..caf7fc85f5 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_chat.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_chat.xml
@@ -204,119 +204,16 @@
name="nearby_toasts_fadingtime"
top_pad="3"
width="325" />
-
- <check_box
- control_name="TranslateChat"
- enabled="true"
- height="16"
- layout="topleft"
- left="30"
- name="translate_chat_checkbox"
- top_pad="5"
- width="400" />
- <!-- *HACK
- After storm-1109 will be fixed: instead of using this text_box, word_wrap should be applied for "translate_chat_checkbox" check_box's label.-->
- <text
- follows="top|left"
- height="15"
- layout="topleft"
- left="50"
- name="translate_chb_label"
- top_delta="1"
- width="450"
- wrap="true">
- Use machine translation while chatting (powered by Google)
- </text>
- <text
- top_pad="20"
- name="translate_language_text"
- follows="left|top"
- layout="topleft"
- left_delta="20"
- height="20"
- width="110">
- Translate chat into:
- </text>
- <combo_box
- allow_text_entry="true"
- bottom_delta="3"
- control_name="TranslateLanguage"
- enabled="true"
- follows="left|top"
- height="23"
- left_delta="110"
- max_chars="135"
- mouse_opaque="true"
- name="translate_language_combobox"
- width="146">
- <combo_box.item
- label="System Default"
- name="System Default Language"
- value="default" />
- <combo_box.item
- label="English"
- name="English"
- value="en" />
- <!-- After "System Default" and "English", please keep the rest of these combo_box.items in alphabetical order by the first character in the string. -->
- <combo_box.item
- label="Dansk (Danish)"
- name="Danish"
- value="da" />
- <combo_box.item
- label="Deutsch (German)"
- name="German"
- value="de" />
- <combo_box.item
- label="Español (Spanish)"
- name="Spanish"
- value="es" />
- <combo_box.item
- label="Français (French)"
- name="French"
- value="fr" />
- <combo_box.item
- label="Italiano (Italian)"
- name="Italian"
- value="it" />
- <combo_box.item
- label="Magyar (Hungarian)"
- name="Hungarian"
- value="hu" />
- <combo_box.item
- label="Nederlands (Dutch)"
- name="Dutch"
- value="nl" />
- <combo_box.item
- label="Polski (Polish)"
- name="Polish"
- value="pl" />
- <combo_box.item
- label="Português (Portuguese)"
- name="Portugese"
- value="pt" />
- <combo_box.item
- label="РуÑÑкий (Russian)"
- name="Russian"
- value="ru" />
- <combo_box.item
- label="Türkçe (Turkish)"
- name="Turkish"
- value="tr" />
- <combo_box.item
- label="УкраїнÑька (Ukrainian)"
- name="Ukrainian"
- value="uk" />
- <combo_box.item
- label="中文 (简体) (Chinese)"
- name="Chinese"
- value="zh" />
- <combo_box.item
- label="日本語 (Japanese)"
- name="Japanese"
- value="ja" />
- <combo_box.item
- label="한국어 (Korean)"
- name="Korean"
- value="ko" />
- </combo_box>
+ <button
+ follows="left|top"
+ height="23"
+ label="Chat Translation Settings"
+ layout="topleft"
+ left="30"
+ name="ok_btn"
+ top="-40"
+ width="170">
+ <button.commit_callback
+ function="Pref.TranslationSettings" />
+ </button>
</panel> \ No newline at end of file
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_general.xml b/indra/newview/skins/default/xui/en/panel_preferences_general.xml
index 9c718fdb87..9827180aa7 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_general.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_general.xml
@@ -67,11 +67,6 @@
value="it" />
<combo_box.item
enabled="true"
- label="Nederlands (Dutch) - Beta"
- name="Dutch"
- value="nl" />
- <combo_box.item
- enabled="true"
label="Polski (Polish) - Beta"
name="Polish"
value="pl" />
@@ -82,9 +77,24 @@
value="pt" />
<combo_box.item
enabled="true"
+ label="РуÑÑкий (Russian) - Beta"
+ name="Russian"
+ value="ru" />
+ <combo_box.item
+ enabled="true"
+ label="Türkçe (Turkish) - Beta"
+ name="Turkish"
+ value="tr" />
+ <combo_box.item
+ enabled="true"
label="日本語 (Japanese) - Beta"
name="(Japanese)"
value="ja" />
+ <combo_box.item
+ enabled="true"
+ label="正體中文 (Traditional Chinese) - Beta"
+ name="Traditional Chinese"
+ value="zh" />
</combo_box>
<text
font="SansSerifSmall"
@@ -410,7 +420,7 @@
follows="left|top"
height="29"
layout="topleft"
- left="50"
+ left="30"
name="busy_response"
width="470"
word_wrap="true">
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_move.xml b/indra/newview/skins/default/xui/en/panel_preferences_move.xml
index 1a8aae7f91..d9067b41c7 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_move.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_move.xml
@@ -86,16 +86,6 @@
name="appearance_camera_movement"
tool_tip="Use automatic camera positioning while in edit mode"
width="242" />
- <check_box
- control_name="SidebarCameraMovement"
- follows="left|top"
- height="16"
- initial_value="true"
- label="Sidebar"
- layout="topleft"
- name="appearance_sidebar_positioning"
- tool_tip="Use automatic camera positioning for sidebar"
- width="242" />
<icon
follows="left|top"
height="18"
@@ -105,16 +95,61 @@
mouse_opaque="false"
visible="true"
width="18"
- top_pad="2"
+ top_pad="10"
left="30" />
+ <text
+ follows="left|top"
+ type="string"
+ length="1"
+ height="10"
+ layout="topleft"
+ left="78"
+ name="keyboard_lbl"
+ width="270"
+ top_delta="2">
+ Keyboard:
+ </text>
+ <check_box
+ control_name="ArrowKeysAlwaysMove"
+ follows="left|top"
+ height="20"
+ label="Arrow keys always move me"
+ layout="topleft"
+ left_delta="5"
+ name="arrow_keys_move_avatar_check"
+ width="237"
+ top_pad="5"/>
+ <check_box
+ control_name="AllowTapTapHoldRun"
+ follows="left|top"
+ height="20"
+ label="Tap-tap-hold to run"
+ layout="topleft"
+ left_delta="0"
+ name="tap_tap_hold_to_run"
+ width="237"
+ top_pad="0"/>
+ <text
+ follows="left|top"
+ type="string"
+ length="1"
+ height="10"
+ layout="topleft"
+ left="78"
+ name="mouse_lbl"
+ width="270"
+ top_pad="15">
+ Mouse:
+ </text>
<check_box
control_name="FirstPersonAvatarVisible"
follows="left|top"
height="20"
label="Show me in Mouselook"
layout="topleft"
- left_pad="30"
+ left_delta="5"
name="first_person_avatar_visible"
+ top_pad="5"
width="256" />
<text
type="string"
@@ -136,7 +171,7 @@
initial_value="2"
layout="topleft"
show_text="false"
- left_pad="5"
+ left_pad="0"
max_val="15"
name="mouse_sensitivity"
top_delta="-1"
@@ -150,63 +185,70 @@
name="invert_mouse"
top_delta="0"
width="128" />
- <check_box
- control_name="ArrowKeysAlwaysMove"
+ <text
follows="left|top"
- height="20"
- label="Arrow keys always move me"
+ type="string"
+ length="1"
+ height="10"
layout="topleft"
- left="78"
- name="arrow_keys_move_avatar_check"
- width="237"
- top_pad="10"/>
- <check_box
- control_name="AllowTapTapHoldRun"
- follows="left|top"
- height="20"
- label="Tap-tap-hold to run"
+ left="86"
+ name="single_click_action_lbl"
+ width="150"
+ top_pad="20">
+ Single click on land:
+ </text>
+ <combo_box
+ height="23"
layout="topleft"
- left_delta="0"
- name="tap_tap_hold_to_run"
- width="237"
- top_pad="0"/>
- <check_box
+ left_pad="10"
+ top_delta="-6"
+ name="single_click_action_combo"
+ width="200">
+ <combo_box.item
+ label="No action"
+ name="0"
+ value="0"/>
+ <combo_box.item
+ label="Move to clicked point"
+ name="1"
+ value="1"/>
+ <combo_box.commit_callback
+ function="Pref.ClickActionChange"/>
+ </combo_box>
+ <text
follows="left|top"
- height="20"
- label="Double-Click to:"
+ type="string"
+ length="1"
+ height="10"
layout="topleft"
- left_delta="0"
- name="double_click_chkbox"
- width="237"
- top_pad="0">
- <check_box.commit_callback
- function="Pref.CommitDoubleClickChekbox"/>
- </check_box>
- <radio_group
- height="20"
- layout="topleft"
- left_delta="17"
- top_pad="2"
- name="double_click_action">
- <radio_item
- height="16"
- label="Teleport"
- layout="topleft"
- left="0"
- name="radio_teleport"
- top_delta="20"
- width="110" />
- <radio_item
- height="16"
- label="Auto-pilot"
- left_pad="0"
- layout="topleft"
- name="radio_autopilot"
- top_delta="0"
- width="75" />
- <radio_group.commit_callback
- function="Pref.CommitRadioDoubleClick"/>
- </radio_group>
+ left="86"
+ name="double_click_action_lbl"
+ width="150"
+ top_pad="12">
+ Double click on land:
+ </text>
+ <combo_box
+ height="23"
+ layout="topleft"
+ left_pad="10"
+ top_delta="-6"
+ name="double_click_action_combo"
+ width="200">
+ <combo_box.item
+ label="No action"
+ name="0"
+ value="0"/>
+ <combo_box.item
+ label="Move to clicked point"
+ name="1"
+ value="1"/>
+ <combo_box.item
+ label="Teleport to clicked point"
+ name="2"
+ value="2"/>
+ <combo_box.commit_callback
+ function="Pref.ClickActionChange"/>
+ </combo_box>
<button
height="23"
label="Other Devices"
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 47236c1a48..587c461bee 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml
@@ -59,7 +59,6 @@
top_pad="30"
width="350" />
<check_box
- enabled_control="EnableVoiceChat"
control_name="VoiceCallsFriendsOnly"
height="16"
label="Only friends and groups can call or IM me"
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_setup.xml b/indra/newview/skins/default/xui/en/panel_preferences_setup.xml
index a7078ce2e1..4aeea8823e 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_setup.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_setup.xml
@@ -122,7 +122,7 @@
layout="topleft"
left_delta="0"
name="external"
- value="1"
+ value="true"
top="0"
tool_tip="Use the default system web browser for help, web links, etc. Not recommended if running full screen."
width="480" />
diff --git a/indra/newview/skins/default/xui/en/panel_prim_media_controls.xml b/indra/newview/skins/default/xui/en/panel_prim_media_controls.xml
index 273c252474..198ccd6e2f 100644
--- a/indra/newview/skins/default/xui/en/panel_prim_media_controls.xml
+++ b/indra/newview/skins/default/xui/en/panel_prim_media_controls.xml
@@ -31,8 +31,7 @@
width="0"
name="left_bookend_bottom"
mouse_opaque="false"
- layout="topleft"
- user_resize="false" />
+ layout="topleft"/>
<layout_panel
name="media_progress_indicator"
mouse_opaque="false"
@@ -41,7 +40,6 @@
left="0"
top="0"
auto_resize="false"
- user_resize="false"
min_width="100"
width="200">
<progress_bar
@@ -59,8 +57,7 @@
name="right_bookend_bottom"
width="0"
mouse_opaque="false"
- layout="topleft"
- user_resize="false" />
+ layout="topleft"/>
</layout_stack>
<layout_stack
name="media_controls"
@@ -79,13 +76,11 @@
top="0"
width="0"
mouse_opaque="false"
- layout="topleft"
- user_resize="false" />
+ layout="topleft"/>
<layout_panel
name="back"
top="0"
auto_resize="false"
- user_resize="false"
layout="topleft"
mouse_opaque="false"
min_width="22"
@@ -114,7 +109,6 @@
name="fwd"
mouse_opaque="false"
auto_resize="false"
- user_resize="false"
layout="topleft"
min_width="22"
top="0"
@@ -142,7 +136,6 @@
name="home"
mouse_opaque="false"
auto_resize="false"
- user_resize="false"
layout="topleft"
top="0"
height="22"
@@ -170,7 +163,6 @@
name="media_stop"
mouse_opaque="false"
auto_resize="false"
- user_resize="false"
layout="topleft"
top="0"
height="22"
@@ -198,7 +190,6 @@
name="reload"
mouse_opaque="false"
auto_resize="false"
- user_resize="false"
layout="topleft"
top="0"
height="22"
@@ -226,7 +217,6 @@
name="stop"
mouse_opaque="false"
auto_resize="false"
- user_resize="false"
layout="topleft"
top="0"
height="22"
@@ -254,7 +244,6 @@
name="play"
mouse_opaque="false"
auto_resize="false"
- user_resize="false"
layout="topleft"
top="0"
height="22"
@@ -282,7 +271,6 @@
name="pause"
mouse_opaque="false"
auto_resize="false"
- user_resize="false"
layout="topleft"
top="0"
min_width="22"
@@ -310,7 +298,6 @@
name="media_address"
mouse_opaque="false"
auto_resize="true"
- user_resize="false"
height="24"
follows="left|right|bottom"
layout="topleft"
@@ -343,8 +330,7 @@
layout="topleft"
width="16"
mouse_opaque="false"
- auto_resize="false"
- user_resize="false">
+ auto_resize="false">
<icon
name="media_whitelist_flag"
follows="top|right"
@@ -358,8 +344,7 @@
layout="topleft"
width="16"
mouse_opaque="false"
- auto_resize="false"
- user_resize="false">
+ auto_resize="false">
<icon
name="media_secure_lock_flag"
height="16"
@@ -374,7 +359,6 @@
name="media_play_position"
mouse_opaque="false"
auto_resize="true"
- user_resize="false"
follows="left|right"
layout="topleft"
top="0"
@@ -399,7 +383,6 @@
name="skip_back"
mouse_opaque="false"
auto_resize="false"
- user_resize="false"
layout="topleft"
top="0"
min_width="22"
@@ -428,7 +411,6 @@
name="skip_forward"
mouse_opaque="false"
auto_resize="false"
- user_resize="false"
layout="topleft"
top="0"
min_width="22"
@@ -455,7 +437,6 @@
name="media_volume"
mouse_opaque="false"
auto_resize="false"
- user_resize="false"
layout="topleft"
top="0"
height="72"
@@ -511,7 +492,6 @@
name="zoom_frame"
mouse_opaque="false"
auto_resize="false"
- user_resize="false"
layout="topleft"
top="0"
height="28"
@@ -539,7 +519,6 @@
name="close"
mouse_opaque="false"
auto_resize="false"
- user_resize="false"
layout="topleft"
top="0"
min_width="21"
@@ -567,7 +546,6 @@
name="new_window"
mouse_opaque="false"
auto_resize="false"
- user_resize="false"
layout="topleft"
top="0"
min_width="22"
@@ -596,8 +574,7 @@
mouse_opaque="false"
top="0"
width="0"
- layout="topleft"
- user_resize="false" />
+ layout="topleft"/>
</layout_stack>
<panel
name="media_region"
diff --git a/indra/newview/skins/default/xui/en/panel_profile.xml b/indra/newview/skins/default/xui/en/panel_profile.xml
deleted file mode 100644
index f5a9daa994..0000000000
--- a/indra/newview/skins/default/xui/en/panel_profile.xml
+++ /dev/null
@@ -1,458 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<panel
- follows="all"
- height="430"
- label="Profile"
- layout="topleft"
- left="0"
- name="panel_profile"
- top="0"
- width="317">
- <string
- name="CaptionTextAcctInfo">
- [ACCTTYPE]
-[PAYMENTINFO] [AGEVERIFICATION]
- </string>
- <string
- name="payment_update_link_url">
- http://www.secondlife.com/account/billing.php?lang=en
- </string>
- <string
- name="partner_edit_link_url">
- http://www.secondlife.com/account/partners.php?lang=en
- </string>
- <string
- name="my_account_link_url"
- value="http://secondlife.com/account" />
- <string
- name="no_partner_text"
- value="None" />
- <string
- name="no_group_text"
- value="None" />
- <string
- name="RegisterDateFormat">
- [REG_DATE] ([AGE])
- </string>
- <string
- name="name_text_args">
- [NAME]
- </string>
- <string
- name="display_name_text_args">
- [DISPLAY_NAME]
- </string>
- <layout_stack
- name="layout"
- orientation="vertical"
- follows="all"
- layout="topleft"
- left="0"
- top="0"
- height="400"
- width="317"
- border_size="0">
- <layout_panel
- name="profile_stack"
- follows="all"
- layout="topleft"
- top="0"
- left="0"
- height="400"
- width="317">
- <scroll_container
- color="DkGray2"
- follows="all"
- layout="topleft"
- left="0"
- name="profile_scroll"
- opaque="true"
- height="400"
- width="317"
- top="0">
- <panel
- layout="topleft"
- follows="left|top|right"
- height="505"
- min_height="505"
- name="profile_scroll_panel"
- top="0"
- left="0"
- width="297">
- <panel
- follows="left|top|right"
- height="124"
- layout="topleft"
- left="13"
- name="second_life_image_panel"
- top="0"
- width="297">
- <texture_picker
- allow_no_texture="true"
- default_image_name="None"
- enabled="false"
- fallback_image="Generic_Person_Large"
- follows="top|left"
- height="124"
- layout="topleft"
- left="0"
- name="2nd_life_pic"
- top="10"
- width="102" />
- <text
- follows="left|top|right"
- font.style="BOLD"
- height="15"
- layout="topleft"
- left_pad="10"
- name="title_sl_descr_text"
- text_color="white"
- top_delta="0"
- value="[SECOND_LIFE]:"
- width="180" />
- <expandable_text
- follows="left|top|right"
- height="97"
- layout="topleft"
- left="107"
- textbox.max_length="512"
- textbox.show_context_menu="true"
- name="sl_description_edit"
- top_pad="-3"
- translate="false"
- width="180"
- expanded_bg_visible="true"
- expanded_bg_color="DkGray">
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean viverra orci et justo sagittis aliquet.Nullamma lesuada mauris sit amet ipsum. adipiscing elit. Ae nean viverra orci et justo sagittis aliquet. Nullam malesuada mauris sit amet ipsum. adipiscing elit. Aenean viverra orci et justo sagittis aliquet. Nullam malesuada mauris sit amet ipsum.
- </expandable_text>
- </panel>
- <panel
- follows="left|top|right"
- height="124"
- layout="topleft"
- top_pad="0"
- left="13"
- name="first_life_image_panel"
- width="297">
- <texture_picker
- allow_no_texture="true"
- default_image_name="None"
- enabled="false"
- fallback_image="Generic_Person_Large"
- follows="top|left"
- height="124"
- layout="topleft"
- left="0"
- name="real_world_pic"
- width="102" />
- <text
- follows="left|top|right"
- font.style="BOLD"
- height="15"
- layout="topleft"
- left_pad="10"
- name="title_rw_descr_text"
- text_color="white"
- top_delta="0"
- value="Real World:"
- width="180" />
- <expandable_text
- follows="left|top|right"
- height="97"
- layout="topleft"
- left="107"
- textbox.max_length="512"
- textbox.show_context_menu="true"
- name="fl_description_edit"
- top_pad="-3"
- translate="false"
- width="180"
- expanded_bg_visible="true"
- expanded_bg_color="DkGray">
- Lorem ipsum dolor sit amet, consectetur adlkjpiscing elit moose moose. Aenean viverra orci et justo sagittis aliquet. Nullam malesuada mauris sit amet. adipiscing elit. Aenean rigviverra orci et justo sagittis aliquet. Nullam malesuada mauris sit amet sorbet ipsum. adipiscing elit. Aenean viverra orci et justo sagittis aliquet. Nullam malesuada mauris sit amet ipsum.
- </expandable_text>
- </panel>
- <text
- follows="left|top"
- height="15"
- font.style="BOLD"
- font="SansSerifMedium"
- layout="topleft"
- left="10"
- name="homepage_edit"
- top_pad="0"
- translate="false"
- value="http://librarianavengers.org"
- width="300"
- word_wrap="false"
- use_ellipses="true" />
- <text
- follows="left|top"
- font.style="BOLD"
- height="10"
- layout="topleft"
- left="10"
- name="title_member_text"
- text_color="white"
- top_pad="10"
- value="Resident Since:"
- width="300" />
- <text_editor
- allow_scroll="false"
- bg_visible="false"
- follows="left|top"
- h_pad="0"
- height="15"
- layout="topleft"
- left="10"
- name="register_date"
- read_only="true"
- translate="false"
- v_pad="0"
- value="05/31/2376"
- width="300"
- word_wrap="true" />
- <text
- follows="left|top"
- font.style="BOLD"
- height="15"
- layout="topleft"
- left="10"
- name="title_acc_status_text"
- text_color="white"
- top_pad="5"
- value="Account Status:"
- width="300" />
- <!-- <text
- type="string"
- follows="left|top"
- font="SansSerifSmall"
- height="15"
- layout="topleft"
- left_pad="10"
- name="my_account_link"
- top_delta="0"
- value="Go to Dashboard"
- width="100"/> -->
- <text_editor
- allow_scroll="false"
- bg_visible="false"
- follows="left|top"
- h_pad="0"
- height="28"
- layout="topleft"
- left="10"
- name="acc_status_text"
- read_only="true"
- top_pad="0"
- translate="false"
- v_pad="0"
- width="300"
- word_wrap="true">
- Resident. No payment info on file.
- Linden.
- </text_editor>
- <text
- follows="left|top"
- font.style="BOLD"
- height="15"
- layout="topleft"
- left="10"
- name="title_partner_text"
- text_color="white"
- top_pad="3"
- value="Partner:"
- width="300" />
- <panel
- follows="left|top"
- height="15"
- layout="topleft"
- left="10"
- name="partner_data_panel"
- top_pad="0"
- width="300">
- <text
- follows="left|top"
- height="10"
- initial_value="(retrieving)"
- layout="topleft"
- left="0"
- parse_urls="true"
- name="partner_text"
- top="0"
- use_ellipses="true"
- width="300" />
- </panel>
- <text
- follows="left|top"
- font.style="BOLD"
- height="13"
- layout="topleft"
- left="10"
- name="title_groups_text"
- text_color="white"
- top_pad="3"
- value="Groups:"
- width="300" />
- <expandable_text
- follows="all"
- height="103"
- layout="topleft"
- left="7"
- name="sl_groups"
- textbox.max_length="512"
- textbox.show_context_menu="true"
- top_pad="0"
- translate="false"
- width="290"
- expanded_bg_visible="true"
- expanded_bg_color="DkGray">
- Lorem ipsum dolor sit amet, consectetur adlkjpiscing elit moose moose. Aenean viverra orci et justo sagittis aliquet. Nullam malesuada mauris sit amet. adipiscing elit. Aenean rigviverra orci et justo sagittis aliquet. Nullam malesuada mauris sit amet sorbet ipsum. adipiscing elit. Aenean viverra orci et justo sagittis aliquet. Nullam malesuada mauris sit amet ipsum. Aenean viverra tulip moosetop. Slan de heelish marfnik tooplod. Sum sum to whop de wompam booster copm.
- </expandable_text>
- </panel>
- </scroll_container>
- </layout_panel>
-
-</layout_stack>
-
- <layout_stack
- name="layout_verb_buttons"
- orientation="horizontal"
- follows="bottom|left|right"
- layout="topleft"
- left="2"
- top_pad="1"
- height="30"
- width="315"
- border_size="0">
- <layout_panel
- follows="bottom|left"
- height="30"
- layout="topleft"
- name="profile_buttons_panel"
- top="0"
- auto_resize="false"
- width="317">
-
- <layout_stack
- follows="bottom|left|right"
- height="23"
- layout="topleft"
- name="bottom_bar_ls"
- left="0"
- orientation="horizontal"
- top_pad="5"
- width="317">
-
- <layout_panel
- follows="bottom|left|right"
- height="23"
- layout="bottomleft"
- left="0"
- name="add_friend_btn_lp"
- user_resize="false"
- auto_resize="true"
- width="121">
- <button
- follows="bottom|left|right"
- height="23"
- label="Add Friend"
- layout="topleft"
- left="1"
- mouse_opaque="false"
- name="add_friend"
- tool_tip="Offer friendship to the Resident"
- top="0"
- width="120" />
- </layout_panel>
-
- <layout_panel
- follows="bottom|left|right"
- height="23"
- layout="bottomleft"
- left_pad="3"
- name="im_btn_lp"
- user_resize="false"
- auto_resize="true"
- width="22">
- <button
- follows="bottom|left|right"
- height="23"
- label="IM"
- layout="topleft"
- name="im"
- tool_tip="Open instant message session"
- top="0"
- left="1"
- width="21" />
- </layout_panel>
-
- <layout_panel
- follows="bottom|left|right"
- height="23"
- layout="bottomleft"
- left_pad="3"
- name="call_btn_lp"
- user_resize="false"
- auto_resize="true"
- width="52">
- <button
- follows="bottom|left|right"
- height="23"
- label="Call"
- layout="topleft"
- name="call"
- tool_tip="Call this Resident"
- left="1"
- top="0"
- use_ellipses="true"
- width="51" />
- </layout_panel>
-
- <layout_panel
- follows="bottom|left|right"
- height="23"
- layout="bottomleft"
- left_pad="3"
- name="chat_btn_lp"
- user_resize="false"
- auto_resize="true"
- width="93">
- <button
- follows="bottom|left|right"
- height="23"
- label="Teleport"
- layout="topleft"
- name="teleport"
- tool_tip="Offer teleport"
- left="1"
- top="0"
- use_ellipses="true"
- width="92" />
- </layout_panel>
-
- <layout_panel
- follows="bottom|left|right"
- height="23"
- layout="bottomleft"
- left_pad="3"
- name="overflow_btn_lp"
- user_resize="false"
- auto_resize="false"
- width="24">
- <menu_button
- follows="bottom|left|right"
- height="23"
- label="â–¼"
- layout="topleft"
- name="overflow_btn"
- tool_tip="Pay money to or share inventory with the Resident"
- left="1"
- top="0"
- width="23" />
- </layout_panel>
- </layout_stack>
- </layout_panel>
- </layout_stack>
-
-</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_profile_view.xml b/indra/newview/skins/default/xui/en/panel_profile_view.xml
deleted file mode 100644
index 646875b52e..0000000000
--- a/indra/newview/skins/default/xui/en/panel_profile_view.xml
+++ /dev/null
@@ -1,162 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<panel
- background_visible="true"
- follows="all"
- height="570"
- layout="topleft"
- min_height="350"
- name="panel_target_profile"
- left="0"
- width="333">
- <string
- name="status_online">
- Online
- </string>
- <string
- name="status_offline">
- Offline
- </string>
- <button
- follows="top|left"
- height="24"
- image_hover_unselected="BackButton_Over"
- image_pressed="BackButton_Press"
- image_unselected="BackButton_Off"
- layout="topleft"
- name="back"
- left="10"
- tab_stop="false"
- top="2"
- width="30"
- use_draw_context_alpha="false" />
- <text
- top="10"
- follows="top|left"
- height="13"
- layout="topleft"
- left="45"
- name="display_name_label"
- text_color="LtGray"
- value="Display Name:"
- width="80" />
- <text
- top_delta="0"
- follows="top|left"
- height="13"
- layout="topleft"
- left="45"
- name="solo_username_label"
- text_color="LtGray"
- value="Username:"
- visible="false"
- width="80" />
- <text
- follows="top|right"
- halign="right"
- height="13"
- layout="topleft"
- right="-15"
- name="status"
- text_color="LtGray_50"
- top_delta="0"
- value="Online"
- width="150" />
- <text
- follows="top|left|right"
- font="SansSerifBigBold"
- height="29"
- layout="topleft"
- left="45"
- name="user_name_small"
- text_color="LtGray"
- top="22"
- value="Jack oh look at me this is a super duper long name"
- use_ellipses="true"
- word_wrap="true"
- visible="false"
- width="255" />
- <text
- follows="top|left|right"
- font="SansSerifHugeBold"
- height="27"
- layout="topleft"
- left="45"
- name="user_name"
- text_color="LtGray"
- translate="false"
- top="25"
- value="TestString PleaseIgnore"
- visible="true"
- use_ellipses="true"
- width="258" />
- <button
- name="copy_to_clipboard"
- layout="topleft"
- follows="top|right"
- image_overlay="Copy"
- top_delta="0"
- right="-15"
- height="21"
- width="21"
- tab_stop="false"
- tool_tip="Copy to Clipboard"/>
- <text
- follows="top|left"
- height="13"
- layout="topleft"
- left="45"
- name="user_label"
- text_color="LtGray"
- top_pad="10"
- value="Username:"
- width="70" />
- <text
- follows="top|left"
- height="20"
- layout="topleft"
- left_pad="0"
- name="user_slid"
- text_color="EmphasisColor"
- font="SansSerifBold"
- top_delta="-2"
- translate="false"
- use_ellipses="true"
- value="teststring.pleaseignore"
- width="195"
- wrap="true "/>
- <tab_container
- follows="all"
- height="489"
- halign="center"
- layout="topleft"
- left="5"
- min_width="333"
- name="tabs"
- tab_min_width="80"
- tab_height="30"
- tab_position="top"
- top_pad="5"
- width="317">
- <panel
- class="panel_profile"
- filename="panel_profile.xml"
- label="PROFILE"
- layout="topleft"
- help_topic="profile_profile_tab"
- name="panel_profile" />
- <panel
- class="panel_picks"
- filename="panel_picks.xml"
- label="PICKS"
- layout="topleft"
- help_topic="profile_picks_tab"
- name="panel_picks" />
- <panel
- class="panel_notes"
- filename="panel_notes.xml"
- label="NOTES &amp; PRIVACY"
- layout="topleft"
- help_topic="profile_notes_tab"
- name="panel_notes" />
- </tab_container>
-</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_progress.xml b/indra/newview/skins/default/xui/en/panel_progress.xml
index 4535c56339..860caf2d21 100644
--- a/indra/newview/skins/default/xui/en/panel_progress.xml
+++ b/indra/newview/skins/default/xui/en/panel_progress.xml
@@ -12,45 +12,43 @@
height="768"
layout="topleft"
left="0"
- name="stack1"
+ name="horizontal_centering"
orientation="horizontal"
top="0"
width="1024">
<layout_panel
layout="topleft"
min_width="10"
- name="panel1"
- user_resize="false"
+ name="left"
width="150" />
<layout_panel
height="768"
layout="topleft"
- min_width="640"
- name="panel2"
- user_resize="false"
- width="640">
+ min_width="670"
+ name="center"
+ width="670">
<layout_stack
follows="left|right|top|bottom"
height="768"
layout="topleft"
left="0"
orientation="vertical"
- name="stack2"
+ name="vertical_centering"
top="0"
- width="640">
+ width="670">
<layout_panel
height="200"
layout="topleft"
min_height="10"
name="panel3"
- width="640" />
+ width="670" />
<layout_panel
auto_resize="false"
height="250"
layout="topleft"
min_height="250"
name="panel4"
- width="640">
+ width="670">
<icon
color="LoginProgressBoxCenterColor"
follows="left|right|bottom|top"
@@ -59,7 +57,7 @@
layout="topleft"
left="0"
top="0"
- width="640" />
+ width="670" />
<text
follows="left|right|top"
font="SansSerifHuge"
@@ -71,7 +69,7 @@
name="title_text"
text_color="LoginProgressBoxTextColor"
top_delta="50"
- width="593" />
+ right="-47"/>
<text
follows="left|right|top"
font="SansSerif"
@@ -83,7 +81,7 @@
name="progress_text"
text_color="LoginProgressBoxTextColor"
top_pad="5"
- width="593"
+ right="-47"
word_wrap="true"/>
<progress_bar
bottom="115"
@@ -106,7 +104,7 @@
name="message_text"
text_color="LoginProgressBoxTextColor"
top="145"
- width="550"
+ right="-90"
word_wrap="true"/>
</layout_panel>
<layout_panel
@@ -114,14 +112,13 @@
layout="topleft"
min_width="10"
name="panel5"
- width="640" />
+ width="670" />
</layout_stack>
</layout_panel>
<layout_panel
layout="topleft"
min_width="10"
- name="panel6"
- user_resize="false"
+ name="right"
width="150" />
</layout_stack>
<button
diff --git a/indra/newview/skins/default/xui/en/panel_region_covenant.xml b/indra/newview/skins/default/xui/en/panel_region_covenant.xml
index 2b2ea78fac..112f12500d 100644
--- a/indra/newview/skins/default/xui/en/panel_region_covenant.xml
+++ b/indra/newview/skins/default/xui/en/panel_region_covenant.xml
@@ -57,7 +57,7 @@
mouse_opaque="false"
name="estate_name_text"
top_delta="0"
- width="150">
+ width="350">
mainland
</text>
<text
@@ -79,7 +79,7 @@
mouse_opaque="false"
name="estate_owner_text"
top_delta="0"
- width="150">
+ width="350">
(none)
</text>
<text
@@ -107,13 +107,13 @@
<text_editor
enabled="false"
follows="left|top"
- height="100"
+ height="180"
layout="topleft"
- left="110"
+ left="10"
max_length="65535"
name="covenant_editor"
- top_delta="30"
- width="340"
+ top_delta="20"
+ width="460"
word_wrap="true">
There is no Covenant provided for this Estate.
</text_editor>
diff --git a/indra/newview/skins/default/xui/en/panel_region_debug.xml b/indra/newview/skins/default/xui/en/panel_region_debug.xml
index 15df095efa..4550603134 100644
--- a/indra/newview/skins/default/xui/en/panel_region_debug.xml
+++ b/indra/newview/skins/default/xui/en/panel_region_debug.xml
@@ -174,31 +174,31 @@
<button
follows="left|top"
height="20"
- label="Get Top Scripts..."
+ label="Restart Region"
layout="topleft"
- left="10"
- name="top_scripts_btn"
- tool_tip="List of objects spending the most time running scripts"
- top_pad="5"
+ left_pad="155"
+ name="restart_btn"
+ tool_tip="Give 2 minute countdown and restart region"
+ top_delta="0"
width="150" />
<button
follows="left|top"
height="20"
- label="Restart Region"
+ label="Get Top Scripts..."
layout="topleft"
left="10"
- name="restart_btn"
- tool_tip="Give 2 minute countdown and restart region"
+ name="top_scripts_btn"
+ tool_tip="List of objects spending the most time running scripts"
top_pad="5"
- width="130" />
+ width="150" />
<button
follows="left|top"
height="20"
label="Delay Restart"
layout="topleft"
- left="10"
+ left_pad="155"
name="cancel_restart_btn"
tool_tip="Delay region restart by one hour"
- top_pad="5"
- width="130" />
+ top_delta="0"
+ width="150" />
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_region_estate.xml b/indra/newview/skins/default/xui/en/panel_region_estate.xml
index 6b28639a77..bfd796a62b 100644
--- a/indra/newview/skins/default/xui/en/panel_region_estate.xml
+++ b/indra/newview/skins/default/xui/en/panel_region_estate.xml
@@ -134,26 +134,26 @@
name="Only Allow"
top_delta="-30"
width="278">
- Restrict Access to accounts verified by:
+ Allow access only to Residents who:
</text>
<check_box
follows="top|left"
height="16"
- label="Payment Information on File"
+ label="Have payment information on file"
layout="topleft"
left_delta="0"
name="limit_payment"
- tool_tip="Ban unidentified Residents"
+ tool_tip="Residents must have payment information on file to access this estate. See the [SUPPORT_SITE] for more information."
top_pad="2"
width="278" />
<check_box
follows="top|left"
height="16"
- label="Age Verification"
+ label="Have been age-verified"
layout="topleft"
left_delta="0"
name="limit_age_verified"
- tool_tip="Ban Residents who have not verified their age. See the [SUPPORT_SITE] for more information."
+ tool_tip="Residents must be age verified to access this estate. See the [SUPPORT_SITE] for more information."
top_pad="2"
width="278" />
diff --git a/indra/newview/skins/default/xui/en/panel_script_ed.xml b/indra/newview/skins/default/xui/en/panel_script_ed.xml
index 8d42024386..f6a8af0973 100644
--- a/indra/newview/skins/default/xui/en/panel_script_ed.xml
+++ b/indra/newview/skins/default/xui/en/panel_script_ed.xml
@@ -54,12 +54,22 @@
label="Save"
layout="topleft"
name="Save" />
- <menu_item_separator
- layout="topleft" />
- <menu_item_call
- label="Revert All Changes"
- layout="topleft"
- name="Revert All Changes" />
+ <menu_item_separator
+ layout="topleft" />
+ <menu_item_call
+ label="Revert All Changes"
+ layout="topleft"
+ name="Revert All Changes" />
+ <menu_item_separator
+ layout="topleft" />
+ <menu_item_call
+ label="Load from file..."
+ layout="topleft"
+ name="LoadFromFile" />
+ <menu_item_call
+ label="Save to file..."
+ layout="topleft"
+ name="SaveToFile" />
</menu>
<menu
top="0"
diff --git a/indra/newview/skins/default/xui/en/panel_side_tray.xml b/indra/newview/skins/default/xui/en/panel_side_tray.xml
deleted file mode 100644
index 0f330a7b98..0000000000
--- a/indra/newview/skins/default/xui/en/panel_side_tray.xml
+++ /dev/null
@@ -1,174 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<!-- Side tray cannot show background because it is always
- partially on screen to hold tab buttons. -->
-<side_tray
- name="sidebar"
- background_visible="false"
- mouse_opaque="true"
- width="333"
- collapsed="true"
->
- <!-- Individual tabs must show background to have seemless
- appearance up to tray panel header word like "Home".
- Embedded panels are inset by a pixel and so their
- backgrounds will not block the world fully. -->
-
- <sidetray_tab
- name="sidebar_openclose"
- help_topic="sidebar_openclose"
- tab_title="Toggle Sidebar"
- description="Toggle Sidebar."
- image="TabIcon_Open_Off"
- image_selected="TabIcon_Close_Off"
- mouse_opaque="false"
- background_visible="true"
- >
- <panel /> <!-- dummy panel, never to actually be seen -->
- </sidetray_tab>
-
- <sidetray_tab
- name="sidebar_home"
- help_topic="sidebar_home"
- tab_title="Home"
- description="Home."
- image="TabIcon_Home_Off"
- image_selected="TabIcon_Home_Selected"
- mouse_opaque="false"
- background_visible="true"
- >
- <panel
- class="panel_sidetray_home"
- name="panel_home"
- filename="panel_sidetray_home_tab.xml"
- label="home"
- />
- </sidetray_tab>
-
- <sidetray_tab
- name="sidebar_me"
- help_topic="sidebar_me"
- tab_title="My Profile"
- description="Edit your public profile and Picks."
- image="TabIcon_Me_Off"
- image_selected="TabIcon_Me_Selected"
- mouse_opaque="false"
- background_visible="true"
- >
- <panel_container
- name="panel_container"
- default_panel_name="panel_me"
- width="333"
- >
- <panel
- class="panel_me"
- name="panel_me"
- filename="panel_me.xml"
- label="Me"
- />
-
- </panel_container>
- </sidetray_tab>
-
- <sidetray_tab
- name="sidebar_people"
- help_topic="sidebar_people"
- tab_title="People"
- description="Find your friends, contacts and people nearby."
- image="TabIcon_People_Off"
- image_selected="TabIcon_People_Selected"
- mouse_opaque="false"
- background_visible="true"
- >
- <panel_container
- name="panel_container"
- default_panel_name="panel_people"
- width="333"
- >
- <panel
- class="panel_people"
- name="panel_people"
- filename="panel_people.xml"
- />
- <panel
- class="panel_profile_view"
- name="panel_profile_view"
- filename="panel_profile_view.xml"
- />
- <panel
- class="panel_group_info_sidetray"
- name="panel_group_info_sidetray"
- filename="panel_group_info_sidetray.xml"
- label="Group Profile"
- font="SansSerifBold"
- />
- <panel
- class="panel_block_list_sidetray"
- name="panel_block_list_sidetray"
- filename="panel_block_list_sidetray.xml"
- label="Blocked Residents &amp; Objects"
- font="SansSerifBold"
- />
-
- </panel_container>
- </sidetray_tab>
-
- <sidetray_tab
- name="sidebar_places"
- help_topic="sidebar_places"
- tab_title="Places"
- label="Places"
- description="Find places to go and places you&apos;ve visited before."
- image="TabIcon_Places_Off"
- image_selected="TabIcon_Places_Selected"
- mouse_opaque="false"
- background_visible="true"
- >
- <panel
- class="panel_places"
- name="panel_places"
- filename="panel_places.xml"
- label="Places"
- font="SansSerifBold"
- />
- </sidetray_tab>
-
- <sidetray_tab
- name="sidebar_inventory"
- help_topic="sidebar_inventory"
- tab_title="My Inventory"
- description="Browse your inventory."
- image="TabIcon_Things_Off"
- image_selected="TabIcon_Things_Selected"
- mouse_opaque="false"
- background_visible="true"
- >
- <badge location="top_left" location_percent_vcenter="50" location_percent_hcenter="95" />
- <panel
- class="sidepanel_inventory"
- name="sidepanel_inventory"
- filename="sidepanel_inventory.xml"
- label="Edit Inventory"
- font="SansSerifBold"
- />
- </sidetray_tab>
-
- <sidetray_tab
- name="sidebar_appearance"
- help_topic="sidebar_appearance"
- tab_title="My Appearance"
- description="Change your appearance and current look."
- image="TabIcon_Appearance_Off"
- image_selected="TabIcon_Appearance_Selected"
- mouse_opaque="false"
- background_visible="true"
- >
- <panel
- class="sidepanel_appearance"
- name="sidepanel_appearance"
- filename="sidepanel_appearance.xml"
- label="Edit Appearance"
- font="SansSerifBold"
- />
- </sidetray_tab>
-
-</side_tray>
diff --git a/indra/newview/skins/default/xui/en/panel_snapshot_inventory.xml b/indra/newview/skins/default/xui/en/panel_snapshot_inventory.xml
new file mode 100644
index 0000000000..9057ebb65e
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_snapshot_inventory.xml
@@ -0,0 +1,147 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel
+ height="380"
+ layout="topleft"
+ name="panel_snapshot_inventory"
+ width="490">
+ <icon
+ follows="top|left"
+ height="18"
+ image_name="Snapshot_Inventory"
+ layout="topleft"
+ left="12"
+ mouse_opaque="true"
+ name="title_icon"
+ top="5"
+ width="18" />
+ <text
+ follows="top|left|right"
+ font="SansSerifBold"
+ height="20"
+ layout="topleft"
+ left_pad="12"
+ length="1"
+ name="title"
+ right="-10"
+ text_color="white"
+ type="string"
+ top_delta="5">
+ Save to My Inventory
+ </text>
+ <view_border
+ bevel_style="in"
+ follows="left|top|right"
+ height="1"
+ left="10"
+ layout="topleft"
+ name="hr"
+ right="-10"
+ top_pad="5"
+ />
+ <text
+ bottom="35"
+ follows="top|left|right"
+ font="SansSerif"
+ height="56"
+ layout="topleft"
+ left="12"
+ length="1"
+ name="hint_lbl"
+ top_pad="10"
+ type="string"
+ word_wrap="true">
+ Saving an image to your inventory costs L$[UPLOAD_COST]. To save your image as a texture select one of the square formats.
+ </text>
+ <combo_box
+ follows="top|left|right"
+ height="23"
+ label="Resolution"
+ layout="topleft"
+ left_delta="0"
+ name="texture_size_combo"
+ right="-10"
+ top_pad="10">
+ <combo_box.item
+ label="Current Window"
+ name="CurrentWindow"
+ value="[i0,i0]" />
+ <combo_box.item
+ label="Small (128x128)"
+ name="Small(128x128)"
+ value="[i128,i128]" />
+ <combo_box.item
+ label="Medium (256x256)"
+ name="Medium(256x256)"
+ value="[i256,i256]" />
+ <combo_box.item
+ label="Large (512x512)"
+ name="Large(512x512)"
+ value="[i512,i512]" />
+ <combo_box.item
+ label="Custom"
+ name="Custom"
+ value="[i-1,i-1]" />
+ </combo_box>
+ <spinner
+ allow_text_entry="false"
+ decimal_digits="0"
+ follows="left|top"
+ height="20"
+ increment="32"
+ label="Width"
+ label_width="40"
+ layout="topleft"
+ left="10"
+ max_val="6016"
+ min_val="32"
+ name="inventory_snapshot_width"
+ top_pad="10"
+ width="95" />
+ <spinner
+ allow_text_entry="false"
+ decimal_digits="0"
+ follows="left|top"
+ height="20"
+ increment="32"
+ label="Height"
+ label_width="40"
+ layout="topleft"
+ left_pad="5"
+ max_val="6016"
+ min_val="32"
+ name="inventory_snapshot_height"
+ top_delta="0"
+ width="95" />
+ <check_box
+ bottom_delta="20"
+ follows="left|top"
+ label="Constrain proportions"
+ layout="topleft"
+ left="10"
+ name="inventory_keep_aspect_check"
+ visible="false" />
+ <button
+ follows="right|bottom"
+ height="23"
+ label="Cancel"
+ layout="topleft"
+ name="cancel_btn"
+ right="-32"
+ top="350"
+ width="100">
+ <button.commit_callback
+ function="Inventory.Cancel" />
+ </button>
+ <button
+ follows="right|bottom"
+ height="23"
+ label="Save"
+ layout="topleft"
+ left_delta="-106"
+ name="save_btn"
+ top_delta="0"
+ width="100">
+ <button.commit_callback
+ function="Inventory.Save" />
+ </button>
+</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_snapshot_local.xml b/indra/newview/skins/default/xui/en/panel_snapshot_local.xml
new file mode 100644
index 0000000000..b966358f18
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_snapshot_local.xml
@@ -0,0 +1,234 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel
+ height="380"
+ layout="topleft"
+ name="panel_snapshot_local"
+ width="490">
+ <icon
+ follows="top|left"
+ height="18"
+ image_name="Snapshot_Download"
+ layout="topleft"
+ left="12"
+ mouse_opaque="true"
+ name="title_icon"
+ top="5"
+ width="18" />
+ <text
+ follows="top|left|right"
+ font="SansSerifBold"
+ height="20"
+ layout="topleft"
+ left_pad="12"
+ length="1"
+ name="title"
+ right="-10"
+ text_color="white"
+ type="string"
+ top_delta="4">
+ Save to My Computer
+ </text>
+ <view_border
+ bevel_style="in"
+ follows="left|top|right"
+ height="1"
+ left="10"
+ layout="topleft"
+ name="hr"
+ right="-10"
+ top_pad="5"
+ />
+ <combo_box
+ follows="left|top|right"
+ height="23"
+ label="Resolution"
+ layout="topleft"
+ left_delta="0"
+ name="local_size_combo"
+ right="-10"
+ top_pad="10">
+ <combo_box.item
+ label="Current Window"
+ name="CurrentWindow"
+ value="[i0,i0]" />
+ <combo_box.item
+ label="320x240"
+ name="320x240"
+ value="[i320,i240]" />
+ <combo_box.item
+ label="640x480"
+ name="640x480"
+ value="[i640,i480]" />
+ <combo_box.item
+ label="800x600"
+ name="800x600"
+ value="[i800,i600]" />
+ <combo_box.item
+ label="1024x768"
+ name="1024x768"
+ value="[i1024,i768]" />
+ <combo_box.item
+ label="1280x1024"
+ name="1280x1024"
+ value="[i1280,i1024]" />
+ <combo_box.item
+ label="1600x1200"
+ name="1600x1200"
+ value="[i1600,i1200]" />
+ <combo_box.item
+ label="Custom"
+ name="Custom"
+ value="[i-1,i-1]" />
+ </combo_box>
+ <layout_stack
+ animate="false"
+ follows="all"
+ height="275"
+ layout="bottomleft"
+ name="local_image_params_ls"
+ left_delta="0"
+ orientation="vertical"
+ top_pad="10"
+ right="-10">
+ <layout_panel
+ follows="top|left|right"
+ height="60"
+ layout="topleft"
+ left="0"
+ name="local_image_size_lp"
+ auto_resize="false"
+ top="0"
+ right="-1"
+ visible="true">
+ <spinner
+ allow_text_entry="false"
+ decimal_digits="0"
+ follows="left|top"
+ height="20"
+ increment="32"
+ label="Width"
+ label_width="40"
+ layout="topleft"
+ left="10"
+ max_val="6016"
+ min_val="32"
+ name="local_snapshot_width"
+ top_pad="10"
+ width="95" />
+ <spinner
+ allow_text_entry="false"
+ decimal_digits="0"
+ follows="left|top"
+ height="20"
+ increment="32"
+ label="Height"
+ label_width="40"
+ layout="topleft"
+ left_pad="5"
+ max_val="6016"
+ min_val="32"
+ name="local_snapshot_height"
+ top_delta="0"
+ width="95" />
+ <check_box
+ bottom_delta="20"
+ follows="left|top"
+ label="Constrain proportions"
+ layout="topleft"
+ left="10"
+ name="local_keep_aspect_check" />
+ </layout_panel>
+ <layout_panel
+ follows="top|left|right"
+ height="23"
+ layout="topleft"
+ left="0"
+ name="local_image_format_quality_lp"
+ auto_resize="true"
+ top="0"
+ right="-1"
+ visible="true">
+ <combo_box
+ follows="left|top"
+ height="23"
+ label="Format"
+ layout="topleft"
+ left_delta="0"
+ name="local_format_combo"
+ top_pad="0"
+ width="120">
+ <combo_box.item
+ label="PNG (Lossless)"
+ name="PNG"
+ value="PNG" />
+ <combo_box.item
+ label="JPEG"
+ name="JPEG"
+ value="JPEG" />
+ <combo_box.item
+ label="BMP (Lossless)"
+ name="BMP"
+ value="BMP" />
+ </combo_box>
+ <slider
+ decimal_digits="0"
+ follows="left|top"
+ height="15"
+ increment="1"
+ initial_value="75"
+ label="Image quality"
+ label_width="80"
+ layout="topleft"
+ left="10"
+ max_val="100"
+ name="image_quality_slider"
+ top_pad="7"
+ width="200" />
+ <text
+ type="string"
+ follows="left|top"
+ font="SansSerifSmall"
+ length="1"
+ height="14"
+ layout="topleft"
+ left_pad="-5"
+ halign="left"
+ name="image_quality_level"
+ top_delta="0"
+ width="60">
+ ([QLVL])
+ </text>
+ </layout_panel>
+ </layout_stack>
+ <button
+ follows="right|bottom"
+ height="23"
+ label="Cancel"
+ layout="topleft"
+ name="cancel_btn"
+ right="-32"
+ top="350"
+ width="100">
+ <button.commit_callback
+ function="Local.Cancel" />
+ </button>
+ <flyout_button
+ follows="right|bottom"
+ height="23"
+ label="Save"
+ layout="topleft"
+ left_delta="-106"
+ name="save_btn"
+ tool_tip="Save image to a file"
+ top_delta="0"
+ width="100">
+ <flyout_button.item
+ label="Save"
+ name="save_item"
+ value="save" />
+ <flyout_button.item
+ label="Save As..."
+ name="saveas_item"
+ value="save as" />
+ </flyout_button>
+</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_snapshot_options.xml b/indra/newview/skins/default/xui/en/panel_snapshot_options.xml
new file mode 100644
index 0000000000..d2f29ade44
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_snapshot_options.xml
@@ -0,0 +1,84 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel
+ follows="all"
+ height="240"
+ layout="topleft"
+ name="panel_snapshot_options"
+ width="490">
+ <button
+ follows="left|top|right"
+ font="SansSerif"
+ halign="left"
+ height="38"
+ image_overlay="Snapshot_Profile"
+ image_overlay_alignment="left"
+ image_top_pad="-2"
+ imgoverlay_label_space="10"
+ label="Post to My Profile Feed"
+ layout="topleft"
+ left="10"
+ name="save_to_profile_btn"
+ pad_left="10"
+ right="-10"
+ top="5">
+ <button.commit_callback
+ function="Snapshot.SaveToProfile" />
+ </button>
+ <button
+ follows="left|top|right"
+ font="SansSerif"
+ halign="left"
+ height="38"
+ image_overlay="Snapshot_Email"
+ image_overlay_alignment="left"
+ image_top_pad="-2"
+ imgoverlay_label_space="10"
+ label="Email"
+ layout="topleft"
+ left_delta="0"
+ name="save_to_email_btn"
+ pad_left="10"
+ right="-10"
+ top_pad="10">
+ <button.commit_callback
+ function="Snapshot.SaveToEmail" />
+ </button>
+ <button
+ follows="left|top|right"
+ font="SansSerif"
+ halign="left"
+ height="38"
+ image_overlay="Snapshot_Inventory"
+ image_overlay_alignment="left"
+ image_top_pad="-2"
+ imgoverlay_label_space="10"
+ label="Save to My Inventory (L$[AMOUNT])"
+ layout="topleft"
+ left_delta="0"
+ name="save_to_inventory_btn"
+ pad_left="10"
+ right="-10"
+ top_pad="10">
+ <button.commit_callback
+ function="Snapshot.SaveToInventory" />
+ </button>
+ <button
+ follows="left|top|right"
+ font="SansSerif"
+ halign="left"
+ height="38"
+ image_overlay="Snapshot_Download"
+ image_overlay_alignment="left"
+ image_top_pad="-2"
+ imgoverlay_label_space="10"
+ label="Save to My Computer"
+ layout="topleft"
+ left_delta="0"
+ name="save_to_computer_btn"
+ pad_left="10"
+ right="-10"
+ top_pad="10">
+ <button.commit_callback
+ function="Snapshot.SaveToComputer" />
+ </button>
+</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_snapshot_postcard.xml b/indra/newview/skins/default/xui/en/panel_snapshot_postcard.xml
new file mode 100644
index 0000000000..ebba292a93
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_snapshot_postcard.xml
@@ -0,0 +1,99 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel
+ height="380"
+ layout="topleft"
+ name="panel_snapshot_postcard"
+ width="490">
+ <string
+ name="default_subject">
+ Postcard from [SECOND_LIFE].
+ </string>
+ <string
+ name="default_message">
+ Check this out!
+ </string>
+ <string
+ name="upload_message">
+ Sending...
+ </string>
+ <icon
+ follows="top|left"
+ height="18"
+ image_name="Snapshot_Email"
+ layout="topleft"
+ left="12"
+ mouse_opaque="true"
+ name="title_icon"
+ top="5"
+ width="18" />
+ <text
+ follows="top|left|right"
+ font="SansSerifBold"
+ height="20"
+ layout="topleft"
+ left_pad="12"
+ length="1"
+ name="title"
+ right="-10"
+ text_color="white"
+ type="string"
+ top_delta="3">
+ Email
+ </text>
+ <button
+ follows="right|top"
+ height="23"
+ is_toggle="true"
+ label="Message"
+ layout="topleft"
+ name="message_btn"
+ right="-82"
+ top_delta="-7"
+ width="70">
+ <button.commit_callback
+ function="Postcard.Message" />
+ </button>
+ <button
+ follows="right|top"
+ height="23"
+ is_toggle="true"
+ label="Settings"
+ layout="topleft"
+ name="settings_btn"
+ top_delta="0"
+ right="-10"
+ width="70">
+ <button.commit_callback
+ function="Postcard.Settings" />
+ </button>
+ <view_border
+ bevel_style="in"
+ follows="left|top|right"
+ height="1"
+ left="10"
+ layout="topleft"
+ name="hr"
+ right="-10"
+ top_pad="5"
+ />
+ <panel_container
+ follows="all"
+ height="340"
+ layout="topleft"
+ left="0"
+ name="postcard_panel_container"
+ default_panel_name="panel_postcard_message"
+ top_pad="10"
+ width="490">
+ <panel
+ follows="all"
+ layout="topleft"
+ name="panel_postcard_message"
+ filename="panel_postcard_message.xml" />
+ <panel
+ follows="all"
+ layout="topleft"
+ name="panel_postcard_settings"
+ filename="panel_postcard_settings.xml" />
+ </panel_container>
+</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_snapshot_profile.xml b/indra/newview/skins/default/xui/en/panel_snapshot_profile.xml
new file mode 100644
index 0000000000..5bd383b81e
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_snapshot_profile.xml
@@ -0,0 +1,198 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel
+ height="380"
+ layout="topleft"
+ name="panel_snapshot_profile"
+ width="490">
+ <icon
+ follows="top|left"
+ height="18"
+ image_name="Snapshot_Profile"
+ layout="topleft"
+ left="12"
+ mouse_opaque="true"
+ name="title_icon"
+ top="5"
+ width="18" />
+ <text
+ follows="top|left|right"
+ font="SansSerifBold"
+ height="20"
+ layout="topleft"
+ left_pad="12"
+ length="1"
+ name="title"
+ right="-10"
+ text_color="white"
+ type="string"
+ top_delta="4">
+ Post to My Profile Feed
+ </text>
+ <view_border
+ bevel_style="in"
+ follows="left|top|right"
+ height="1"
+ left="10"
+ layout="topleft"
+ name="hr"
+ right="-10"
+ top_pad="5"
+ />
+ <combo_box
+ follows="left|top"
+ height="23"
+ label="Resolution"
+ layout="topleft"
+ left_delta="0"
+ name="profile_size_combo"
+ top_pad="10"
+ width="250">
+ <combo_box.item
+ label="Current Window"
+ name="CurrentWindow"
+ value="[i0,i0]" />
+ <combo_box.item
+ label="640x480"
+ name="640x480"
+ value="[i640,i480]" />
+ <combo_box.item
+ label="800x600"
+ name="800x600"
+ value="[i800,i600]" />
+ <combo_box.item
+ label="1024x768"
+ name="1024x768"
+ value="[i1024,i768]" />
+ <combo_box.item
+ label="Custom"
+ name="Custom"
+ value="[i-1,i-1]" />
+ </combo_box>
+ <layout_stack
+ animate="false"
+ follows="all"
+ height="270"
+ layout="bottomleft"
+ name="profile_image_params_ls"
+ left_delta="0"
+ orientation="vertical"
+ top_pad="10"
+ right="-10">
+ <layout_panel
+ follows="top|left|right"
+ height="55"
+ layout="topleft"
+ left="0"
+ name="profile_image_size_lp"
+ auto_resize="false"
+ top="0"
+ right="-1"
+ visible="true">
+ <spinner
+ allow_text_entry="false"
+ decimal_digits="0"
+ follows="left|top"
+ height="20"
+ increment="32"
+ label="Width"
+ label_width="40"
+ layout="topleft"
+ left="10"
+ max_val="6016"
+ min_val="32"
+ name="profile_snapshot_width"
+ top_pad="10"
+ width="95" />
+ <spinner
+ allow_text_entry="false"
+ decimal_digits="0"
+ follows="left|top"
+ height="20"
+ increment="32"
+ label="Height"
+ label_width="40"
+ layout="topleft"
+ left_pad="5"
+ max_val="6016"
+ min_val="32"
+ name="profile_snapshot_height"
+ top_delta="0"
+ width="95" />
+ <check_box
+ bottom_delta="20"
+ label="Constrain proportions"
+ layout="topleft"
+ left="10"
+ name="profile_keep_aspect_check" />
+ </layout_panel>
+ <layout_panel
+ follows="top|left|right"
+ height="200"
+ layout="topleft"
+ left="0"
+ name="profile_image_metadata_lp"
+ auto_resize="true"
+ top="0"
+ right="-1"
+ visible="true">
+ <text
+ length="1"
+ follows="top|left|right"
+ font="SansSerif"
+ height="16"
+ layout="topleft"
+ left="0"
+ name="caption_label"
+ right="-10"
+ top_pad="0"
+ type="string">
+ Caption:
+ </text>
+ <text_editor
+ follows="all"
+ height="155"
+ layout="topleft"
+ left_delta="0"
+ length="1"
+ max_length="700"
+ name="caption"
+ right="-10"
+ top_pad="5"
+ type="string"
+ word_wrap="true">
+ </text_editor>
+ <check_box
+ follows="left|bottom"
+ initial_value="true"
+ label="Include location"
+ layout="topleft"
+ left_delta="0"
+ name="add_location_cb"
+ top_pad="15" />
+ </layout_panel>
+ </layout_stack>
+ <button
+ follows="right|bottom"
+ height="23"
+ label="Cancel"
+ layout="topleft"
+ name="cancel_btn"
+ right="-32"
+ top="350"
+ width="100">
+ <button.commit_callback
+ function="PostToProfile.Cancel" />
+ </button>
+ <button
+ follows="right|bottom"
+ height="23"
+ label="Post"
+ layout="topleft"
+ left_delta="-106"
+ name="post_btn"
+ top_delta="0"
+ width="100">
+ <button.commit_callback
+ function="PostToProfile.Send" />
+ </button>
+</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_status_bar.xml b/indra/newview/skins/default/xui/en/panel_status_bar.xml
index 5894abd03b..d453a970e7 100644
--- a/indra/newview/skins/default/xui/en/panel_status_bar.xml
+++ b/indra/newview/skins/default/xui/en/panel_status_bar.xml
@@ -2,7 +2,7 @@
<panel
background_opaque="true"
background_visible="true"
- bg_opaque_color="MouseGray"
+ bg_opaque_color="DkGray"
chrome="true"
follows="top|right"
height="19"
@@ -35,14 +35,11 @@
</panel.string>
<panel
height="18"
- left="-355"
- width="95"
+ left="-370"
+ width="160"
top="1"
follows="right|top"
- name="balance_bg"
- bg_visible="true"
- background_opaque="true"
- bg_opaque_image="bevel_background">
+ name="balance_bg">
<text
halign="center"
font="SansSerifSmall"
@@ -60,11 +57,11 @@
halign="center"
font="SansSerifSmall"
follows="right|top|bottom"
- image_hover_unselected="buy_over"
- image_unselected="buy_off"
- image_pressed="buy_press"
+ image_hover_unselected="PushButton_Over"
+ image_unselected="PushButton_Off"
+ image_pressed="PushButton_Press"
height="18"
- label="BUY L$"
+ label="Buy L$"
label_color="White"
left_pad="0"
label_shadow="true"
@@ -73,40 +70,41 @@
pad_bottom="2"
tool_tip="Click to buy more L$"
top="0"
- width="55" />
+ width="80" />
+ <button
+ halign="left"
+ font="SansSerifSmall"
+ follows="right|top|bottom"
+ imgoverlay_label_space="7"
+ image_overlay="Command_MiniCart_Icon"
+ image_overlay_alignment="left"
+ image_hover_unselected="PushButton_Over"
+ image_unselected="PushButton_Off"
+ image_pressed="PushButton_Press"
+ height="18"
+ label="Shop"
+ label_color="White"
+ left_pad="0"
+ label_shadow="true"
+ name="goShop"
+ pad_bottom="2"
+ tool_tip="Open Second Life Marketplace"
+ top="0"
+ width="65" />
</panel>
- <combo_box
- follows="right|top"
- drop_down_button.pad_left="10"
- left_pad="5"
- top="0"
- width="120"
- height="20"
- name="mode_combo"
- tool_tip="Select your mode. Choose Basic for fast, easy exploration and chat. Choose Advanced to access more features."
- >
- <combo_box.item
- label="Basic Mode"
- name="Basic"
- value="settings_minimal.xml" />
- <combo_box.item
- label="Advanced Mode"
- name="Advanced"
- value="" />
- </combo_box>
<text
- left_pad="5"
type="string"
font="SansSerifSmall"
text_readonly_color="TimeTextColor"
follows="right|top"
- halign="center"
+ halign="right"
height="16"
top="5"
layout="topleft"
+ left_pad="0"
name="TimeText"
tool_tip="Current time (Pacific)"
- width="75">
+ width="145">
24:00 AM PST
</text>
<button
@@ -117,7 +115,7 @@
image_pressed="Pause_Press"
image_pressed_selected="Play_Press"
is_toggle="true"
- left_pad="10"
+ left_pad="15"
top="1"
name="media_toggle_btn"
tool_tip="Start/Stop All Media (Music, Video, Web pages)"
diff --git a/indra/newview/skins/default/xui/en/panel_toast.xml b/indra/newview/skins/default/xui/en/panel_toast.xml
index 42f64c3a76..062c403a26 100644
--- a/indra/newview/skins/default/xui/en/panel_toast.xml
+++ b/indra/newview/skins/default/xui/en/panel_toast.xml
@@ -10,6 +10,7 @@
-->
<floater
+ open_positioning="none"
legacy_header_height="0"
header_height="0"
name="toast"
@@ -20,7 +21,6 @@
width="310"
left="0"
top="0"
- follows="right|bottom"
background_visible="false"
bg_opaque_image="Toast_Over"
bg_alpha_image="Toast_Background"
diff --git a/indra/newview/skins/default/xui/en/panel_toolbar_view.xml b/indra/newview/skins/default/xui/en/panel_toolbar_view.xml
new file mode 100644
index 0000000000..58911bed56
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_toolbar_view.xml
@@ -0,0 +1,159 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<toolbar_view
+ follows="all"
+ layout="topleft"
+ name="toolbar view"
+ height="500"
+ width="1024"
+ left="0"
+ top="0"
+ mouse_opaque="false"
+ tab_stop="false"
+ visible="true">
+ <layout_stack name="bottom_toolbar_stack"
+ orientation="vertical"
+ left="0"
+ top="0"
+ width="1024"
+ height="500"
+ follows="all"
+ mouse_opaque="false">
+ <layout_panel name="vertical_toolbar_panel"
+ auto_resize="true"
+ width="1024"
+ height="500"
+ mouse_opaque="false">
+ <layout_stack name="vertical_toolbar_stack"
+ orientation="horizontal"
+ left="0"
+ top="0"
+ width="1024"
+ height="500"
+ follows="all"
+ mouse_opaque="false">
+ <layout_panel name="left_toolbar_panel"
+ auto_resize="false"
+ height="500"
+ width="30"
+ mouse_opaque="false">
+ <toolbar follows="left|top|bottom"
+ button_panel.bg_opaque_image="Rounded_Rect_Right"
+ name="toolbar_left"
+ width="30"
+ left="0"
+ top="10"
+ bottom="-10"
+ side="left"
+ button_display_mode="icons_only">
+ <icon layout="topleft"
+ height="15"
+ width="28"
+ follows="left|top"
+ top="20"
+ left="10"
+ tab_stop="false"
+ visible="false"
+ image_name="Caret_Left_Icon"
+ name="caret" />
+ </toolbar>
+ </layout_panel>
+ <layout_panel name="non_toolbar_panel"
+ auto_resize="true"
+ mouse_opaque="false"
+ height="100"
+ width="200">
+ <view top="0"
+ follows="all"
+ height="100"
+ left="0"
+ mouse_opaque="false"
+ name="floater_snap_region"
+ width="200"/>
+ <view top="0"
+ follows="left|top|bottom"
+ height="100"
+ left="0"
+ mouse_opaque="false"
+ name="minimized_floaters_region"
+ width="160"/>
+ <panel follows="left|top|right"
+ layout="topleft"
+ height="30"
+ left_pad="10"
+ mouse_opaque="false"
+ name="chiclet_container"
+ tab_stop="false"
+ top="0"
+ bg_visible="false"
+ width="20">
+ </panel>
+ <panel bottom="100"
+ follows="left|right|bottom"
+ height="25"
+ left="0"
+ mouse_opaque="false"
+ tab_stop="false"
+ name="stand_stop_flying_container"
+ visible="false"
+ width="200"/>
+ </layout_panel>
+ <layout_panel name="right_toolbar_panel"
+ auto_resize="false"
+ height="500"
+ width="30"
+ mouse_opaque="false">
+ <toolbar
+ button_panel.bg_opaque_image="Rounded_Rect_Left"
+ follows="right|top|bottom"
+ name="toolbar_right"
+ width="30"
+ left="0"
+ top="10"
+ bottom="-10"
+ side="right"
+ button_display_mode="icons_only">
+ <icon layout="topleft"
+ height="15"
+ width="28"
+ follows="left|top"
+ top="20"
+ left="10"
+ tab_stop="false"
+ visible="false"
+ image_name="Caret_Right_Icon"
+ name="caret" />
+ </toolbar>
+ </layout_panel>
+ </layout_stack>
+ </layout_panel>
+ <layout_panel name="bottom_toolbar_panel"
+ auto_resize="false"
+ height="30"
+ width="1024"
+ mouse_opaque="false">
+ <toolbar layout="topleft"
+ button_panel.bg_opaque_image="Rounded_Rect_Top"
+ name="toolbar_bottom"
+ height="30"
+ left="40"
+ right="-40"
+ top="0"
+ side="bottom"
+ follows="left|right|bottom"
+ button_display_mode="icons_with_text"
+ visible="true">
+ <icon layout="topleft"
+ height="28"
+ width="15"
+ follows="left|top"
+ top="20"
+ left="10"
+ tab_stop="false"
+ visible="false"
+ use_draw_context_alpha="false"
+ image_name="Caret_Bottom_Icon"
+ name="caret" />
+ </toolbar>
+ </layout_panel>
+ </layout_stack>
+</toolbar_view>
diff --git a/indra/newview/skins/default/xui/en/panel_topinfo_bar.xml b/indra/newview/skins/default/xui/en/panel_topinfo_bar.xml
index 79f29777ce..fc527f5f9d 100644
--- a/indra/newview/skins/default/xui/en/panel_topinfo_bar.xml
+++ b/indra/newview/skins/default/xui/en/panel_topinfo_bar.xml
@@ -4,7 +4,7 @@
background_opaque="false"
bg_opaque_color="Black_50"
bg_alpha_color="Black_50"
- follows="left|top|right"
+ follows="left|top"
height="19"
layout="topleft"
name="topinfo_bar"
diff --git a/indra/newview/skins/default/xui/en/sidepanel_inventory.xml b/indra/newview/skins/default/xui/en/sidepanel_inventory.xml
index 7a176ff367..29aa6d1039 100644
--- a/indra/newview/skins/default/xui/en/sidepanel_inventory.xml
+++ b/indra/newview/skins/default/xui/en/sidepanel_inventory.xml
@@ -1,6 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel
- background_visible="true"
follows="all"
height="570"
label="Things"
@@ -30,11 +29,12 @@
width="330">
<layout_panel
name="main_inventory_layout_panel"
- layout="topleft"
+ layout="topleft"
+ auto_resize="true"
+ user_resize="true"
min_dim="150"
width="330"
follows="bottom|left|right"
- user_resize="false"
height="300">
<panel
class="panel_main_inventory"
@@ -48,39 +48,18 @@
height="300"
width="330" />
</layout_panel>
- <layout_panel
- width="330"
- layout="topleft"
- auto_resize="true"
- user_resize="false"
- follows="bottom|left|right"
- name="inbox_outbox_layout_panel"
- visible="false"
- min_dim="35"
- max_dim="235"
- expanded_min_dim="125"
- height="235">
- <layout_stack
- follows="left|right|top|bottom"
- layout="topleft"
- left="0"
- top="0"
- orientation="vertical"
- name="inbox_outbox_layout_stack"
- height="235"
- width="330">
- <layout_panel
+ <layout_panel
width="330"
- layout="topleft"
+ layout="topleft"
auto_resize="true"
- user_resize="false"
+ user_resize="true"
follows="left|right|top"
name="inbox_layout_panel"
visible="false"
min_dim="35"
- max_dim="200"
+ max_dim="235"
expanded_min_dim="90"
- height="200">
+ height="235">
<panel
follows="all"
layout="topleft"
@@ -89,13 +68,13 @@
class="panel_marketplace_inbox"
top="0"
label=""
- height="200"
+ height="235"
width="330">
- <string name="InboxLabelWithArg">Received Items ([NUM])</string>
- <string name="InboxLabelNoArg">Received Items</string>
+ <string name="InboxLabelWithArg">Received items ([NUM])</string>
+ <string name="InboxLabelNoArg">Received items</string>
<button
- label="Received Items"
- font="SansSerifMedium"
+ label="Received items"
+ font="SansSerifMedium"
name="inbox_btn"
height="35"
width="308"
@@ -122,18 +101,18 @@
halign="right"
top_pad="0"
width="300">
- [NUM] New
+ [NUM] new
</text>
<panel
follows="all"
left="10"
- bottom="200"
+ bottom="235"
width="308"
top="35"
bg_opaque_color="InventoryBackgroundColor"
background_visible="true"
background_opaque="true"
- tool_tip="Drag and drop items to your inventory to manage and use them"
+ tool_tip="Drag and drop items to your inventory to use them"
>
<text
name="inbox_inventory_placeholder"
@@ -143,7 +122,7 @@
top="0"
left="0"
width="308"
- height="165"
+ height="200"
wrap="true"
halign="center">
Purchases from the marketplace will be delivered here.
@@ -151,139 +130,6 @@
</panel>
</panel>
</layout_panel>
- <layout_panel
- width="330"
- layout="topleft"
- auto_resize="true"
- user_resize="false"
- follows="all"
- name="outbox_layout_panel"
- visible="false"
- min_dim="35"
- max_dim="200"
- expanded_min_dim="90"
- height="200">
- <panel
- follows="all"
- layout="topleft"
- left="0"
- name="marketplace_outbox"
- class="panel_marketplace_outbox"
- top="0"
- label=""
- height="200"
- width="330">
- <string name="OutboxLabelWithArg">Merchant Outbox ([NUM])</string>
- <string name="OutboxLabelNoArg">Merchant Outbox</string>
- <button
- label="Merchant Outbox"
- font="SansSerifMedium"
- name="outbox_btn"
- height="35"
- width="308"
- image_unselected="MarketplaceBtn_Off"
- image_selected="MarketplaceBtn_Selected"
- halign="left"
- handle_right_mouse="false"
- follows="top|left|right"
- is_toggle="true"
- tab_stop="false"
- pad_left="35"
- top="0"
- left="10" />
- <button
- image_unselected="OutboxPush_Off"
- image_selected="OutboxPush_Selected"
- image_hover_selected="OutboxPush_Selected_Over"
- image_hover_unselected="OutboxPush_Over"
- image_disabled_selected="OutboxPush_Selected_Disabled"
- image_disabled="OutboxPush_Disabled"
- image_pressed="OutboxPush_Press"
- image_pressed_selected="OutboxPush_Selected_Press"
- label=""
- tool_tip="Push to my Marketplace Storefront"
- is_toggle="false"
- name="outbox_sync_btn"
- follows="top|right"
- tab_stop="false"
- halign="center"
- top="6"
- left="-50"
- height="23"
- width="32"
- enabled="false" />
- <loading_indicator
- follows="top|right"
- name="outbox_sync_indicator"
- top="6"
- left="-50"
- height="23"
- width="32"
- images_per_sec="1.15"
- tab_stop="false"
- visible="false">
- <images>
- <image name="OutboxPush_Progress_1"/>
- <image name="OutboxPush_Progress_2"/>
- <image name="OutboxPush_Progress_3"/>
- <image name="OutboxPush_Progress_4"/>
- <image name="OutboxPush_Progress_5"/>
- <image name="OutboxPush_Progress_6"/>
- </images>
- </loading_indicator>
- <panel
- follows="all"
- left="10"
- bottom="200"
- width="308"
- top="35"
- bg_opaque_color="InventoryBackgroundColor"
- background_visible="true"
- background_opaque="true"
- >
- <panel
- name="outbox_inventory_placeholder_panel"
- follows="all"
- layout="topleft"
- top="0"
- left="0"
- width="308"
- height="165"
- bg_opaque_color="InventoryBackgroundColor"
- background_visible="true"
- background_opaque="true"
- >
- <text
- name="outbox_inventory_placeholder_title"
- type="string"
- follows="all"
- layout="topleft"
- top="10"
- left="0"
- width="308"
- height="25"
- wrap="true"
- halign="center"
- font="SansSerifBold">
- Loading...
- </text>
- <text
- name="outbox_inventory_placeholder_text"
- type="string"
- follows="all"
- layout="topleft"
- top="35"
- left="0"
- width="308"
- height="130"
- wrap="true"
- halign="left" />
- </panel>
- </panel>
- </panel>
- </layout_panel>
- </layout_stack>
- </layout_panel>
</layout_stack>
<panel
follows="bottom|left|right"
@@ -310,7 +156,6 @@
left="0"
mouse_opaque="false"
name="info_btn_lp"
- user_resize="false"
auto_resize="true"
width="101">
<button
@@ -332,7 +177,6 @@
left_pad="1"
mouse_opaque="false"
name="share_btn_lp"
- user_resize="false"
auto_resize="true"
width="100">
<button
@@ -354,7 +198,6 @@
left_pad="1"
mouse_opaque="false"
name="shop_btn_lp"
- user_resize="false"
auto_resize="true"
width="100">
<button
@@ -404,8 +247,7 @@
</layout_stack>
</panel>
</panel>
-
-<panel
+ <panel
follows="all"
layout="topleft"
left="0"
@@ -418,8 +260,7 @@
visible="false"
width="330">
</panel>
-
-<panel
+ <panel
follows="all"
layout="topleft"
left="0"
diff --git a/indra/newview/skins/default/xui/en/sidepanel_task_info.xml b/indra/newview/skins/default/xui/en/sidepanel_task_info.xml
index c2394a3fa2..6600339ad7 100644
--- a/indra/newview/skins/default/xui/en/sidepanel_task_info.xml
+++ b/indra/newview/skins/default/xui/en/sidepanel_task_info.xml
@@ -55,7 +55,7 @@
Mixed Sale
</panel.string>
<button
- follows="top|right"
+ follows="top|left"
height="24"
image_hover_unselected="BackButton_Over"
image_pressed="BackButton_Press"
diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml
index 5d2db8cc4c..4bc72be49b 100644
--- a/indra/newview/skins/default/xui/en/strings.xml
+++ b/indra/newview/skins/default/xui/en/strings.xml
@@ -16,16 +16,16 @@
<string name="StartupDetectingHardware">Detecting hardware...</string>
<string name="StartupLoading">Loading [APP_NAME]...</string>
<string name="StartupClearingCache">Clearing cache...</string>
- <string name="StartupInitializingTextureCache">Initializing Texture Cache...</string>
+ <string name="StartupInitializingTextureCache">Initializing texture cache...</string>
<string name="StartupInitializingVFS">Initializing VFS...</string>
- <string name="StartupRequireDriverUpdate">Graphics Initialization Failed. Please Update Your Graphics Driver!</string>
+ <string name="StartupRequireDriverUpdate">Graphics initialization failed. Please update your graphics driver!</string>
<!-- progress -->
<string name="ProgressRestoring">Restoring...</string>
- <string name="ProgressChangingResolution">Changing Resolution...</string>
+ <string name="ProgressChangingResolution">Changing resolution...</string>
<!-- Legacy strings, almost never used -->
- <string name="Fullbright">Fullbright (Legacy)</string> <!-- used in the Build > materials dropdown-->
+ <string name="Fullbright">Fullbright (legacy)</string> <!-- used in the Build > materials dropdown-->
<!-- Login -->
<string name="LoginInProgress">Logging in. [APP_NAME] may appear frozen. Please wait.</string>
@@ -35,11 +35,11 @@
<string name="LoginAttempt">Previous login attempt failed. Logging in, attempt [NUMBER]</string>
<string name="LoginPrecaching">Loading world...</string>
<string name="LoginInitializingBrowser">Initializing embedded web browser...</string>
- <string name="LoginInitializingMultimedia">Initializing multimedia...</string>
- <string name="LoginInitializingFonts">Loading fonts...</string>
- <string name="LoginVerifyingCache">Verifying cache files (can take 60-90 seconds)...</string>
- <string name="LoginProcessingResponse">Processing Response...</string>
- <string name="LoginInitializingWorld">Initializing World...</string>
+ <string name="LoginInitializingMultimedia">Initializing multimedia...</string>
+ <string name="LoginInitializingFonts">Loading fonts...</string>
+ <string name="LoginVerifyingCache">Verifying cache files (can take 60-90 seconds)...</string>
+ <string name="LoginProcessingResponse">Processing response...</string>
+ <string name="LoginInitializingWorld">Initializing world...</string>
<string name="LoginDecodingImages">Decoding images...</string>
<string name="LoginInitializingQuicktime">Initializing QuickTime...</string>
<string name="LoginQuicktimeNotFound">QuickTime not found - unable to initialize.</string>
@@ -49,14 +49,14 @@
<string name="LoginWaitingForRegionHandshake">Waiting for region handshake...</string>
<string name="LoginConnectingToRegion">Connecting to region...</string>
<string name="LoginDownloadingClothing">Downloading clothing...</string>
- <string name="InvalidCertificate">The server returned an invalid or corrupt certificate. Please contact the Grid administrator.</string>
- <string name="CertInvalidHostname">An invalid hostname was used to access the server, please check your SLURL or Grid hostname.</string>
- <string name="CertExpired">The certificate returned by the Grid appears to be expired. Please check your system clock, or contact your Grid administrator.</string>
- <string name="CertKeyUsage">The certificate returned by the server could not be used for SSL. Please contact your Grid administrator.</string>
- <string name="CertBasicConstraints">Too many certificates were in the servers Certificate chain. Please contact your Grid administrator.</string>
- <string name="CertInvalidSignature">The certificate signature returned by the Grid server could not be verified. Please contact your Grid administrator.</string>
-
- <string name="LoginFailedNoNetwork">Network Error: Could not establish connection, please check your network connection.</string>
+ <string name="InvalidCertificate">The server returned an invalid or corrupt certificate. Please contact the Grid administrator.</string>
+ <string name="CertInvalidHostname">An invalid hostname was used to access the server, please check your SLURL or Grid hostname.</string>
+ <string name="CertExpired">The certificate returned by the Grid appears to be expired. Please check your system clock, or contact your Grid administrator.</string>
+ <string name="CertKeyUsage">The certificate returned by the server could not be used for SSL. Please contact your Grid administrator.</string>
+ <string name="CertBasicConstraints">Too many certificates were in the servers Certificate chain. Please contact your Grid administrator.</string>
+ <string name="CertInvalidSignature">The certificate signature returned by the Grid server could not be verified. Please contact your Grid administrator.</string>
+
+ <string name="LoginFailedNoNetwork">Network error: Could not establish connection, please check your network connection.</string>
<string name="LoginFailed">Login failed.</string>
<string name="Quit">Quit</string>
<string name="create_account_url">http://join.secondlife.com/</string>
@@ -88,7 +88,7 @@ We are very sorry for the inconvenience.</string>
Logins are currently restricted to employees only.
Check www.secondlife.com/status for updates.</string>
<string name="LoginFailedPremiumOnly">Second Life logins are temporarily restricted in order to make sure that those in-world have the best possible experience.
-
+
People with free accounts will not be able to access Second Life during this time, to make room for those who have paid for Second Life.</string>
<string name="LoginFailedComputerProhibited">Second Life cannot be accessed from this computer.
If you feel this is an error, please contact
@@ -164,10 +164,18 @@ Please try logging in again in a minute.</string>
<string name="TooltipLand">Land:</string>
<string name="TooltipMustSingleDrop">Only a single item can be dragged here</string>
<string name="TooltipPrice" value="L$[AMOUNT]: "/>
- <string name="TooltipOutboxNoTransfer">One or more of these objects cannot be sold or transferred to another user.</string>
- <string name="TooltipOutboxWorn">You are wearing one or more of these objects. Remove them from your avatar and try moving them again.</string>
- <string name="TooltipOutboxFolderLevels">This folder has too many levels of subfolders. Rearrange the interior folders to a maximum of 4 levels deep (Root Folder contains A contains B contains C).</string>
- <string name="TooltipOutboxTooManyObjects">This folder contains more than 200 objects. Box some of the items to reduce the object count.</string>
+
+ <string name="TooltipOutboxDragToWorld">You can not rez items in your merchant outbox</string>
+ <string name="TooltipOutboxNoTransfer">One or more of these objects cannot be sold or transferred.</string>
+ <string name="TooltipOutboxNotInInventory">Your merchant outbox can only accept items directly from your inventory</string>
+ <string name="TooltipOutboxWorn">You can not put items you are wearing into your merchant outbox</string>
+ <string name="TooltipOutboxCallingCard">You can not put calling cards into your merchant outbox</string>
+ <string name="TooltipOutboxFolderLevels">Depth of nested folders exceeds 3</string>
+ <string name="TooltipOutboxTooManyFolders">Subfolder count in top-level folder exceeds 20</string>
+ <string name="TooltipOutboxTooManyObjects">Item count in top-level folder exceeds 200</string>
+
+ <string name="TooltipDragOntoOwnChild">You can't move a folder into its child</string>
+ <string name="TooltipDragOntoSelf">You can't move a folder into itself</string>
<!-- tooltips for Urls -->
<string name="TooltipHttpUrl">Click to view this web page</string>
@@ -188,7 +196,7 @@ Please try logging in again in a minute.</string>
<string name="TooltipObjectIMUrl">Click to view this object's description</string>
<string name="TooltipMapUrl">Click to view this location on a map</string>
<string name="TooltipSLAPP">Click to run the secondlife:// command</string>
- <string name="CurrentURL" value=" CurrentURL: [CurrentURL]" />
+ <string name="CurrentURL" value=" CurrentURL: [CurrentURL]" />
<!-- text for SLURL labels -->
<string name="SLurlLabelTeleport">Teleport to</string>
@@ -427,9 +435,10 @@ Please try logging in again in a minute.</string>
<string name="compressed_image_files">Compressed Images</string>
<string name="load_files">Load Files</string>
<string name="choose_the_directory">Choose Directory</string>
+ <string name="script_files">Scripts</string>
- <!-- LSL Usage Hover Tips -->
- <!-- NOTE: For now these are set as translate="false", until DEV-40761 is implemented (to internationalize the rest of tooltips in the same window).
+ <!-- LSL Usage Hover Tips -->
+ <!-- NOTE: For now these are set as translate="false", until DEV-40761 is implemented (to internationalize the rest of tooltips in the same window).
This has no effect on viewer code, but prevents Linden Lab internal localization tool from scraping these strings. -->
<string name="LSLTipSleepTime" translate="false">
Sleeps script for [SLEEP_TIME] seconds.
@@ -1950,7 +1959,7 @@ Returns a string with the requested data about the region
<string name="physics">Physics</string>
<string name="invalid">invalid</string>
<string name="none">none</string>
-
+
<!-- Not Worn Wearable Types -->
<string name="shirt_not_worn">Shirt not worn</string>
<string name="pants_not_worn">Pants not worn</string>
@@ -1987,7 +1996,7 @@ Returns a string with the requested data about the region
<!-- Wearable List-->
<string name="NewWearable">New [WEARABLE_ITEM]</string>
-
+
<!-- LLGroupNotify -->
<!-- used in the construction of a Group Notice blue dialog box, buttons, tooltip etc. Seems to be no longer utilized by code in Viewer 2.0 -->
<string name="next">Next</string>
@@ -2028,29 +2037,35 @@ Returns a string with the requested data about the region
<string name="PlacesNoMatchingItems">Didn't find what you're looking for? Try [secondlife:///app/search/places/[SEARCH_TERM] 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 this texture in your inventory</string>
- <string name="InventoryInboxNoItems">Items purchased through the marketplace will be delivered here.</string>
- <string name="MarketplaceURL">http://marketplace.[DOMAIN_NAME]</string>
- <string name="MarketplaceURL_CreateStore">http://marketplace.[DOMAIN_NAME]/create_store</string>
- <string name="MarketplaceURL_LearnMore">http://marketplace.[DOMAIN_NAME]/learn_more</string>
- <string name="InventoryOutboxCreationErrorTitle">Your Merchant Outbox is not properly configured</string>
- <string name="InventoryOutboxCreationErrorTooltip">Merchant Outbox configuration error</string>
- <string name="InventoryOutboxCreationError">Please contact Customer Service to correct the problem.</string>
- <string name="InventoryOutboxNotMerchantTitle">Anyone can sell items on the Marketplace</string>
- <string name="InventoryOutboxNotMerchantTooltip">Become a merchant!</string>
- <string name="InventoryOutboxNotMerchant">[[MARKETPLACE_URL] The Second Life Marketplace] offers more than one million virtual products for sale, all of them created by Residents. You, too, can sell items you create, as well as some of the items you have purchased. It’s easy and setup is free. [[LEARN_MORE_URL] Learn more] or [[CREATE_STORE_URL] create a store] on the Marketplace to get started.</string>
- <string name="InventoryOutboxNoItemsTitle">A new way to send items to the Marketplace</string>
- <string name="InventoryOutboxNoItemsTooltip">Drag and drop items here to prepare them for sale on the Marketplace</string>
- <string name="InventoryOutboxNoItems">Drag items or folders that you wish to sell into this area. A copy of the item will appear, leaving your inventory unchanged, unless you have dragged a no-copy item. When you are ready to send the items to the Marketplace, click the Upload button. Once your items have been moved to your Marketplace Inventory, they will disappear from this folder.</string>
+ <string name="InventoryInboxNoItems">Your Marketplace purchases will appear here. You may then drag them into your inventory to use them.</string>
+ <string name="MarketplaceURL">https://marketplace.[MARKETPLACE_DOMAIN_NAME]/</string>
+ <string name="MarketplaceURL_CreateStore">http://community.secondlife.com/t5/English-Knowledge-Base/Selling-in-the-Marketplace/ta-p/700193#Section_.4</string>
+ <string name="MarketplaceURL_Dashboard">https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/dashboard</string>
+ <string name="MarketplaceURL_Imports">https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/imports</string>
+ <string name="MarketplaceURL_LearnMore">https://marketplace.[MARKETPLACE_DOMAIN_NAME]/learn_more</string>
+ <string name="InventoryOutboxNotMerchantTitle">Anyone can sell items on the Marketplace.</string>
+ <string name="InventoryOutboxNotMerchantTooltip"></string>
+ <string name="InventoryOutboxNotMerchant">
+If you'd like to become a merchant, you'll need to [[MARKETPLACE_CREATE_STORE_URL] create a Marketplace store].
+ </string>
+ <string name="InventoryOutboxNoItemsTitle">Your outbox is empty.</string>
+ <string name="InventoryOutboxNoItemsTooltip"></string>
+ <string name="InventoryOutboxNoItems">
+Drag folders to this area and click "Send to Marketplace" to list them for sale on the [[MARKETPLACE_DASHBOARD_URL] Marketplace].
+ </string>
<string name="Marketplace Error None">No errors</string>
<string name="Marketplace Error Not Merchant">Error: Before sending items to the Marketplace you will need to set yourself up as a merchant (free of charge).</string>
<string name="Marketplace Error Empty Folder">Error: This folder has no contents.</string>
- <string name="Marketplace Error Unassociated Products">Error: This item failed to upload because your merchant account has too many items unassociated with products. To fix this error, login to the marketplace website and reduce your unassociated item count.</string>
+ <string name="Marketplace Error Unassociated Products">Error: This item failed to upload because your merchant account has too many items unassociated with products. To fix this error, log in to the marketplace website and reduce your unassociated item count.</string>
+
<string name="Marketplace Error Object Limit">Error: This item contains too many objects. Fix this error by placing objects together in boxes to reduce the total count to less than 200.</string>
<string name="Marketplace Error Folder Depth">Error: This item contains too many levels of nested folders. Reorganize it to a maximum of 3 levels of nested folders.</string>
<string name="Marketplace Error Unsellable Item">Error: This item can not be sold on the marketplace.</string>
<string name="Marketplace Error Internal Import">Error: There was a problem with this item. Try again later.</string>
+ <string name="Open landmarks">Open landmarks</string>
+
<!-- use value="" because they have preceding spaces -->
<string name="no_transfer" value=" (no transfer)" />
<string name="no_modify" value=" (no modify)" />
@@ -2131,6 +2146,7 @@ Returns a string with the requested data about the region
<string name="InvFolder All">All</string>
<string name="no_attachments">No attachments worn</string>
+ <string name="Attachments remain">Attachments ([COUNT] slots remain)</string>
<!-- inventory FVBridge -->
<!-- This is used in llpanelinventory.cpp when constructing a context menu for an item for Sale -->
@@ -2181,6 +2197,8 @@ Returns a string with the requested data about the region
<string name="Stomach">Stomach</string>
<string name="Left Pec">Left Pec</string>
<string name="Right Pec">Right Pec</string>
+ <string name="Neck">Neck</string>
+ <string name="Avatar Center">Avatar Center</string>
<string name="Invalid Attachment">Invalid Attachment Point</string>
<!-- Avatar age computation, see LLDateUtil::ageFromDate -->
@@ -2309,7 +2327,7 @@ Returns a string with the requested data about the region
<string name="ScriptLimitsRequestWrongRegion">Error: script information is only available in your current region</string>
<string name="ScriptLimitsRequestWaiting">Retrieving information...</string>
<string name="ScriptLimitsRequestDontOwnParcel">You do not have permission to examine this parcel</string>
-
+
<string name="SITTING_ON">Sitting On</string>
<string name="ATTACH_CHEST">Chest</string>
<string name="ATTACH_HEAD">Head</string>
@@ -2349,7 +2367,7 @@ Returns a string with the requested data about the region
<string name="ATTACH_HUD_BOTTOM_LEFT">HUD Bottom Left</string>
<string name="ATTACH_HUD_BOTTOM">HUD Bottom</string>
<string name="ATTACH_HUD_BOTTOM_RIGHT">HUD Bottom Right</string>
-
+
<!-- script editor -->
<string name="CursorPos">Line [LINE], Column [COLUMN]</string>
@@ -2362,7 +2380,7 @@ Returns a string with the requested data about the region
<!-- panel contents -->
<string name="PanelContentsTooltip">Content of object</string>
- <string name="PanelContentsNewScript">New Script</string>
+ <string name="PanelContentsNewScript">New Script</string>
<!-- panel preferences general -->
<string name="BusyModeResponseDefault">The Resident you messaged is in &apos;busy mode&apos; which means they have requested not to be disturbed. Your message will still be shown in their IM panel for later viewing.</string>
@@ -2392,7 +2410,7 @@ Returns a string with the requested data about the region
<!-- panel classified -->
<string name="ClassifiedClicksTxt">Clicks: [TELEPORT] teleport, [MAP] map, [PROFILE] profile</string>
<string name="ClassifiedUpdateAfterPublish">(will update after publish)</string>
-
+
<!-- panel picks -->
<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="NoAvatarPicksClassifiedsText">User has no picks or classifieds</string>
@@ -3269,7 +3287,7 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
You have blocked this Resident. Sending a message will automatically unblock them.
</string>
<!--Some times string name is getting from the body of server response.
- For ex.: from gIMMgr::showSessionStartError in the LLViewerChatterBoxSessionStartReply::post.
+ For ex.: from gIMMgr::showSessionStartError in the LLViewerChatterBoxSessionStartReply::post.
In case of the EXT-3115 issue 'generic' is passed into the gIMMgr::showSessionStartError as a string name.
Also there are some other places where "generic" is used.
So, let add string with name="generic" with the same value as "generic_request_error" -->
@@ -3295,7 +3313,7 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
You are not a session moderator.
</string>
<!--Some times string name is getting from the body of server response.
- For ex.: from gIMMgr::showSessionStartError in the LLViewerChatterBoxSessionStartReply::post.
+ For ex.: from gIMMgr::showSessionStartError in the LLViewerChatterBoxSessionStartReply::post.
In case of the EXT-3562 issue 'muted' is passed into the gIMMgr::showSessionStartError as a string name.
So, let add string with name="muted" with the same value as "muted_error" -->
<string name="muted">
@@ -3308,12 +3326,12 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
Unable to add users to chat session with [RECIPIENT].
</string>
<!--Some times string name is getting from the body of server response.
- For ex.: from gIMMgr::showSessionStartError in the LLViewerChatterBoxSessionStartReply::post.
+ For ex.: from gIMMgr::showSessionStartError in the LLViewerChatterBoxSessionStartReply::post.
In case of the EXT-3562 issue 'message' is passed into the gIMMgr::showSessionStartError as a string name.
So, let add string with name="message" with the same value as "message_session_event" -->
<string name="message">
Unable to send your message to the chat session with [RECIPIENT].
- </string>
+ </string>
<string name="message_session_event">
Unable to send your message to the chat session with [RECIPIENT].
</string>
@@ -3321,7 +3339,7 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
Error while moderating.
</string>
<!--Some times string name is getting from the body of server response.
- For ex.: from gIMMgr::showSessionStartError in the LLViewerChatterBoxSessionStartReply::post.
+ For ex.: from gIMMgr::showSessionStartError in the LLViewerChatterBoxSessionStartReply::post.
In case of the EXT-3459 issue 'removed' is passed into the gIMMgr::showSessionStartError as a string name.
So, let add string with name="removed" with the same value as "removed_from_group" -->
<string name="removed">
@@ -3342,9 +3360,9 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
<string name="session_initialization_timed_out_error">
The session initialization is timed out
</string>
-
+
<string name="Home position set.">Home position set.</string>
-
+
<string name="voice_morphing_url">http://secondlife.com/landing/voicemorphing</string>
<!-- Financial operations strings -->
@@ -3354,6 +3372,10 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
<string name="you_paid_ldollars_no_info">You paid L$[AMOUNT].</string>
<string name="you_paid_ldollars_no_reason">You paid [NAME] L$[AMOUNT].</string>
<string name="you_paid_ldollars_no_name">You paid L$[AMOUNT] [REASON].</string>
+ <string name="you_paid_failure_ldollars">You failed to pay [NAME] L$[AMOUNT] [REASON].</string>
+ <string name="you_paid_failure_ldollars_no_info">You failed to pay L$[AMOUNT].</string>
+ <string name="you_paid_failure_ldollars_no_reason">You failed to pay [NAME] L$[AMOUNT].</string>
+ <string name="you_paid_failure_ldollars_no_name">You failed to pay L$[AMOUNT] [REASON].</string>
<string name="for item">for [ITEM]</string>
<string name="for a parcel of land">for a parcel of land</string>
<string name="for a land access pass">for a land access pass</string>
@@ -3362,20 +3384,20 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
<string name="to join a group">to join a group</string>
<string name="to upload">to upload</string>
<string name="to publish a classified ad">to publish a classified ad</string>
-
+
<string name="giving">Giving L$ [AMOUNT]</string>
<string name="uploading_costs">Uploading costs L$ [AMOUNT]</string>
<string name="this_costs">This costs L$ [AMOUNT]</string>
<string name="buying_selected_land">Buying selected land for L$ [AMOUNT]</string>
<string name="this_object_costs">This object costs L$ [AMOUNT]</string>
-
+
<string name="group_role_everyone">Everyone</string>
<string name="group_role_officers">Officers</string>
<string name="group_role_owners">Owners</string>
<string name="group_member_status_online">Online</string>
<string name="uploading_abuse_report">Uploading...
-
+
Abuse Report</string>
<!-- names for new inventory items-->
@@ -3439,7 +3461,7 @@ Abuse Report</string>
<string name="Female - Stick tougue out">Female - Stick tougue out</string>
<string name="Female - Wow">Female - Wow</string>
- <string name="/bow1">/bow1</string>
+ <string name="/bow">/bow</string>
<string name="/clap">/clap</string>
<string name="/count">/count</string>
<string name="/extinguish">/extinguish</string>
@@ -3469,23 +3491,23 @@ Abuse Report</string>
<!-- birth date format shared by avatar inspector and profile panels -->
<string name="AvatarBirthDateFormat">[mthnum,datetime,slt]/[day,datetime,slt]/[year,datetime,slt]</string>
-
+
<string name="DefaultMimeType">none/none</string>
<string name="texture_load_dimensions_error">Can't load images larger than [WIDTH]*[HEIGHT]</string>
<!-- language specific white-space characters, delimiters, spacers, item separation symbols -->
<string name="sentences_separator" value=" "></string>
<string name="words_separator" value=", "/>
-
+
<string name="server_is_down">
Despite our best efforts, something unexpected has gone wrong.
- Please check status.secondlifegrid.net to see if there is a known problem with the service.
+ Please check status.secondlifegrid.net to see if there is a known problem with the service.
If you continue to experience problems, please check your network and firewall setup.
</string>
- <!-- overriding datetime formating.
- didn't translate if this is not needed for current localization
+ <!-- overriding datetime formating.
+ didn't translate if this is not needed for current localization
-->
<string name="dateTimeWeekdaysNames">Sunday:Monday:Tuesday:Wednesday:Thursday:Friday:Saturday</string>
<string name="dateTimeWeekdaysShortNames">Sun:Mon:Tue:Wed:Thu:Fri:Sat</string>
@@ -3518,7 +3540,7 @@ Abuse Report</string>
<string name="DeleteItem">Delete selected item?</string>
<string name="EmptyOutfitText">There are no items in this outfit</string>
-
+
<!-- External editor status codes -->
<string name="ExternalEditorNotSet">Select an editor using the ExternalEditor setting.</string>
<string name="ExternalEditorNotFound">Cannot find the external editor you specified.
@@ -3527,6 +3549,10 @@ Try enclosing path to the editor with double quotes.
<string name="ExternalEditorCommandParseError">Error parsing the external editor command.</string>
<string name="ExternalEditorFailedToRun">External editor failed to run.</string>
+ <!-- Machine translation of chat messahes -->
+ <string name="TranslationFailed">Translation failed: [REASON]</string>
+ <string name="TranslationResponseParseError">Error parsing translation response.</string>
+
<!-- Key names begin -->
<string name="Esc">Esc</string>
<string name="Space">Space</string>
@@ -3650,8 +3676,66 @@ Try enclosing path to the editor with double quotes.
<string name="BeaconSound">Viewing sound beacons (yellow)</string>
<string name="BeaconMedia">Viewing media beacons (white)</string>
<string name="ParticleHiding">Hiding Particles</string>
-
- <!-- Mesh UI terms -->
+
+ <!-- commands -->
+
+ <string name="Command_AboutLand_Label">About land</string>
+ <string name="Command_Appearance_Label">Appearance</string>
+ <string name="Command_Avatar_Label">Avatar</string>
+ <string name="Command_Build_Label">Build</string>
+ <string name="Command_Chat_Label">Chat</string>
+ <string name="Command_Compass_Label">Compass</string>
+ <string name="Command_Destinations_Label">Destinations</string>
+ <string name="Command_Gestures_Label">Gestures</string>
+ <string name="Command_HowTo_Label">How to</string>
+ <string name="Command_Inventory_Label">Inventory</string>
+ <string name="Command_Map_Label">Map</string>
+ <string name="Command_Marketplace_Label">Marketplace</string>
+ <string name="Command_MiniMap_Label">Mini-map</string>
+ <string name="Command_Move_Label">Walk / run / fly</string>
+ <string name="Command_Outbox_Label">Merchant outbox</string>
+ <string name="Command_People_Label">People</string>
+ <string name="Command_Picks_Label">Picks</string>
+ <string name="Command_Places_Label">Places</string>
+ <string name="Command_Preferences_Label">Preferences</string>
+ <string name="Command_Profile_Label">Profile</string>
+ <string name="Command_Search_Label">Search</string>
+ <string name="Command_Snapshot_Label">Snapshot</string>
+ <string name="Command_Speak_Label">Speak</string>
+ <string name="Command_View_Label">Camera controls</string>
+ <string name="Command_Voice_Label">Voice settings</string>
+
+ <string name="Command_AboutLand_Tooltip">Information about the land you're visiting</string>
+ <string name="Command_Appearance_Tooltip">Change your avatar</string>
+ <string name="Command_Avatar_Tooltip">Choose a complete avatar</string>
+ <string name="Command_Build_Tooltip">Building objects and reshaping terrain</string>
+ <string name="Command_Chat_Tooltip">Chat with people nearby using text</string>
+ <string name="Command_Compass_Tooltip">Compass</string>
+ <string name="Command_Destinations_Tooltip">Destinations of interest</string>
+ <string name="Command_Gestures_Tooltip">Gestures for your avatar</string>
+ <string name="Command_HowTo_Tooltip">How to do common tasks</string>
+ <string name="Command_Inventory_Tooltip">View and use your belongings</string>
+ <string name="Command_Map_Tooltip">Map of the world</string>
+ <string name="Command_Marketplace_Tooltip">Go shopping</string>
+ <string name="Command_MiniMap_Tooltip">Show nearby people</string>
+ <string name="Command_Move_Tooltip">Moving your avatar</string>
+ <string name="Command_Outbox_Tooltip">Transfer items to your marketplace for sale</string>
+ <string name="Command_People_Tooltip">Friends, groups, and nearby people</string>
+ <string name="Command_Picks_Tooltip">Places to show as favorites in your profile</string>
+ <string name="Command_Places_Tooltip">Places you've saved</string>
+ <string name="Command_Preferences_Tooltip">Preferences</string>
+ <string name="Command_Profile_Tooltip">Edit or view your profile</string>
+ <string name="Command_Search_Tooltip">Find places, events, people</string>
+ <string name="Command_Snapshot_Tooltip">Take a picture</string>
+ <string name="Command_Speak_Tooltip">Speak with people nearby using your microphone</string>
+ <string name="Command_View_Tooltip">Changing camera angle</string>
+ <string name="Command_Voice_Tooltip">Volume controls for calls and people near you in world</string>
+
+ <string name="Toolbar_Bottom_Tooltip">currently in your bottom toolbar</string>
+ <string name="Toolbar_Left_Tooltip" >currently in your left toolbar</string>
+ <string name="Toolbar_Right_Tooltip" >currently in your right toolbar</string>
+
+ <!-- Mesh UI terms -->
<string name="Retain%">Retain%</string>
<string name="Detail">Detail</string>
<string name="Better Detail">Better Detail</string>
@@ -3661,4 +3745,11 @@ Try enclosing path to the editor with double quotes.
<string name="Preview">Preview</string>
<string name="Normal">Normal</string>
+ <!-- Snapshot image quality levels -->
+ <string name="snapshot_quality_very_low">Very Low</string>
+ <string name="snapshot_quality_low">Low</string>
+ <string name="snapshot_quality_medium">Medium</string>
+ <string name="snapshot_quality_high">High</string>
+ <string name="snapshot_quality_very_high">Very High</string>
+
</strings>
diff --git a/indra/newview/skins/default/xui/en/teleport_strings.xml b/indra/newview/skins/default/xui/en/teleport_strings.xml
index bae821d3b5..dce6b8dd6d 100644
--- a/indra/newview/skins/default/xui/en/teleport_strings.xml
+++ b/indra/newview/skins/default/xui/en/teleport_strings.xml
@@ -20,6 +20,10 @@ If you still cannot teleport, please log out and log back in to resolve the prob
Sorry, but system was unable to complete the teleport connection.
Try again in a moment.
</message>
+ <message name="NoHelpIslandTP">
+You cannot teleport back to Welcome Island.
+Go to &apos;Welcome Island Public&apos; to repeat the tutorial.
+ </message>
<message name="noaccess_tport">
Sorry, you do not have access to that teleport destination.
</message>
diff --git a/indra/newview/skins/default/xui/en/widgets/button.xml b/indra/newview/skins/default/xui/en/widgets/button.xml
index 61d36468d7..e2baba92a3 100644
--- a/indra/newview/skins/default/xui/en/widgets/button.xml
+++ b/indra/newview/skins/default/xui/en/widgets/button.xml
@@ -15,7 +15,6 @@
label_color_selected="ButtonLabelSelectedColor"
label_color_disabled="ButtonLabelDisabledColor"
label_color_disabled_selected="ButtonLabelSelectedDisabledColor"
- highlight_color="ButtonUnselectedFgColor"
image_color="ButtonImageColor"
image_color_disabled="ButtonImageColor"
flash_color="ButtonFlashBgColor"
@@ -27,5 +26,9 @@
scale_image="true"
handle_right_mouse="true"
use_draw_context_alpha="true"
- held_down_delay.seconds="0.5">
+ held_down_delay.seconds="0.5"
+ button_flash_count="8"
+ button_flash_rate="1.25"
+ display_pressed_state="true"
+ >
</button>
diff --git a/indra/newview/skins/default/xui/en/widgets/chiclet_im_adhoc.xml b/indra/newview/skins/default/xui/en/widgets/chiclet_im_adhoc.xml
index 413ca1d1ef..0e29ed0d0b 100644
--- a/indra/newview/skins/default/xui/en/widgets/chiclet_im_adhoc.xml
+++ b/indra/newview/skins/default/xui/en/widgets/chiclet_im_adhoc.xml
@@ -12,13 +12,20 @@
tab_stop="false"
width="25" />
<chiclet_im_adhoc.speaker
- auto_update="true"
- draw_border="false"
- height="23"
- left="25"
- name="speaker"
- visible="false"
- width="20" />
+ image_mute="Parcel_VoiceNo_Light"
+ image_off="VoicePTT_Off_Dark"
+ image_on="VoicePTT_On_Dark"
+ image_level_1="VoicePTT_Lvl1_Dark"
+ image_level_2="VoicePTT_Lvl2_Dark"
+ image_level_3="VoicePTT_Lvl3_Dark"
+ auto_update="true"
+ draw_border="false"
+ height="24"
+ left="25"
+ bottom="1"
+ name="speaker"
+ visible="false"
+ width="20" />
<chiclet_im_adhoc.avatar_icon
bottom="3"
follows="left|top|bottom"
diff --git a/indra/newview/skins/default/xui/en/widgets/chiclet_im_group.xml b/indra/newview/skins/default/xui/en/widgets/chiclet_im_group.xml
index 372a89cbc7..77011139bf 100644
--- a/indra/newview/skins/default/xui/en/widgets/chiclet_im_group.xml
+++ b/indra/newview/skins/default/xui/en/widgets/chiclet_im_group.xml
@@ -12,13 +12,20 @@
tab_stop="false"
width="25" />
<chiclet_im_group.speaker
- auto_update="true"
- draw_border="false"
- height="25"
- left="25"
- name="speaker"
- visible="false"
- width="20" />
+ image_mute="Parcel_VoiceNo_Light"
+ image_off="VoicePTT_Off_Dark"
+ image_on="VoicePTT_On_Dark"
+ image_level_1="VoicePTT_Lvl1_Dark"
+ image_level_2="VoicePTT_Lvl2_Dark"
+ image_level_3="VoicePTT_Lvl3_Dark"
+ auto_update="true"
+ draw_border="false"
+ height="24"
+ left="25"
+ bottom="1"
+ name="speaker"
+ visible="false"
+ width="20" />
<chiclet_im_group.group_icon
bottom="3"
default_icon="Generic_Group"
diff --git a/indra/newview/skins/default/xui/en/widgets/chiclet_im_p2p.xml b/indra/newview/skins/default/xui/en/widgets/chiclet_im_p2p.xml
index d27c14f4e7..8b56a8f0f6 100644
--- a/indra/newview/skins/default/xui/en/widgets/chiclet_im_p2p.xml
+++ b/indra/newview/skins/default/xui/en/widgets/chiclet_im_p2p.xml
@@ -12,13 +12,20 @@
tab_stop="false"
width="25"/>
<chiclet_im_p2p.speaker
- auto_update="true"
- draw_border="false"
- height="23"
- left="25"
- name="speaker"
- visible="false"
- width="20" />
+ image_mute="Parcel_VoiceNo_Light"
+ image_off="VoicePTT_Off_Dark"
+ image_on="VoicePTT_On_Dark"
+ image_level_1="VoicePTT_Lvl1_Dark"
+ image_level_2="VoicePTT_Lvl2_Dark"
+ image_level_3="VoicePTT_Lvl3_Dark"
+ auto_update="true"
+ draw_border="false"
+ height="24"
+ left="25"
+ bottom="1"
+ name="speaker"
+ visible="false"
+ width="20" />
<chiclet_im_p2p.avatar_icon
bottom="3"
color="white"
diff --git a/indra/newview/skins/default/xui/en/widgets/floater.xml b/indra/newview/skins/default/xui/en/widgets/floater.xml
index 2e5ebafe46..adbb183317 100644
--- a/indra/newview/skins/default/xui/en/widgets/floater.xml
+++ b/indra/newview/skins/default/xui/en/widgets/floater.xml
@@ -1,7 +1,9 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<!-- See also settings.xml UIFloater* settings for configuration -->
-<floater
+<floater
name="floater"
+ open_positioning="none"
+ layout="topleft"
bg_opaque_color="FloaterFocusBackgroundColor"
bg_alpha_color="FloaterDefaultBackgroundColor"
bg_opaque_image="Window_Foreground"
diff --git a/indra/newview/skins/default/xui/en/widgets/inbox_folder_view_item.xml b/indra/newview/skins/default/xui/en/widgets/inbox_folder_view_item.xml
new file mode 100644
index 0000000000..7a7a6e9a09
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/widgets/inbox_folder_view_item.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<inbox_folder_view_item
+ item_height="20"
+ item_top_pad="4"
+ selection_image="Rounded_Square"
+ >
+ <new_badge
+ label="New"
+ label_offset_horiz="-1"
+ location="right"
+ padding_horiz="12.5"
+ padding_vert="2"
+ location_offset_hcenter="-23"
+ border_image="New_Tag_Border"
+ border_color="DkGray2"
+ image="New_Tag_Background"
+ image_color="Black"
+ />
+</inbox_folder_view_item>
diff --git a/indra/newview/skins/default/xui/en/widgets/joystick_rotate.xml b/indra/newview/skins/default/xui/en/widgets/joystick_rotate.xml
new file mode 100644
index 0000000000..a190da3909
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/widgets/joystick_rotate.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<joystick_rotate
+ image_selected="Cam_Rotate_In"
+ image_unselected="Cam_Rotate_Out"
+ scale_image="false"
+ mouse_opaque="false"
+ held_down_delay.seconds="0"/>
diff --git a/indra/newview/skins/default/xui/en/widgets/outbox_folder_view_folder.xml b/indra/newview/skins/default/xui/en/widgets/outbox_folder_view_folder.xml
index 0792996107..d19c47f54f 100644
--- a/indra/newview/skins/default/xui/en/widgets/outbox_folder_view_folder.xml
+++ b/indra/newview/skins/default/xui/en/widgets/outbox_folder_view_folder.xml
@@ -6,14 +6,4 @@
item_top_pad="4"
selection_image="Rounded_Square"
>
- <error_badge
- label=" "
- label_offset_horiz="-1"
- location="right"
- padding_horiz="12.5"
- padding_vert="2"
- location_offset_hcenter="-23"
- image="Error_Tag_Background"
- image_color="Black"
- />
</outbox_folder_view_folder>
diff --git a/indra/newview/skins/default/xui/en/widgets/outbox_inventory_panel.xml b/indra/newview/skins/default/xui/en/widgets/outbox_inventory_panel.xml
index e3f2072819..3964569da2 100644
--- a/indra/newview/skins/default/xui/en/widgets/outbox_inventory_panel.xml
+++ b/indra/newview/skins/default/xui/en/widgets/outbox_inventory_panel.xml
@@ -1,2 +1,2 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<outbox_inventory_panel show_load_status="false" />
+<outbox_inventory_panel show_empty_message="false" show_load_status="false" />
diff --git a/indra/newview/skins/default/xui/en/widgets/toolbar.xml b/indra/newview/skins/default/xui/en/widgets/toolbar.xml
new file mode 100644
index 0000000000..0aa478ace9
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/widgets/toolbar.xml
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<toolbar pad_left="1"
+ pad_right="1"
+ pad_top="1"
+ pad_bottom="1"
+ pad_between="1"
+ min_girth="24"
+ mouse_opaque="false"
+ read_only="false">
+ <button_panel name="button_panel"
+ bg_opaque_image="Rounded_Rect"
+ background_visible="true"
+ bg_opaque_image_overlay="MouseGray"
+ background_opaque="true"/>
+ <button_icon_and_text imgoverlay_label_space="7"
+ label_color_selected="White"
+ halign="left"
+ image_pressed="PushButton_Press"
+ image_pressed_selected="PushButton_Selected_Press"
+ image_selected="PushButton_Selected_Press"
+ image_disabled_selected="PushButton_Selected_Disabled"
+ image_disabled="PushButton_Disabled"
+ button_width.min="70"
+ button_width.max="140"
+ desired_height="24"
+ pad_left="10"
+ pad_right="10"
+ follows="left|top"
+ chrome="true"
+ image_overlay_alignment="left"
+ use_ellipses="true"
+ auto_resize="true"
+ button_flash_count="99999"
+ button_flash_rate="1.0"
+ flash_color="EmphasisColor"/>
+ <button_icon pad_left="10"
+ pad_right="10"
+ image_bottom_pad="10"
+ image_top_pad="10"
+ image_pressed="PushButton_Press"
+ image_pressed_selected="PushButton_Selected_Press"
+ image_selected="PushButton_Selected_Press"
+ image_disabled_selected="PushButton_Selected_Disabled"
+ image_disabled="PushButton_Disabled"
+ desired_height="38"
+ button_width.min="38"
+ button_width.max="38"
+ follows="left|top"
+ label=""
+ halign="left"
+ chrome="true"
+ use_ellipses="true"
+ auto_resize="true"
+ button_flash_count="99999"
+ button_flash_rate="1.0"
+ flash_color="EmphasisColor"/>
+</toolbar>
diff --git a/indra/newview/skins/default/xui/en/widgets/window_shade.xml b/indra/newview/skins/default/xui/en/widgets/window_shade.xml
new file mode 100644
index 0000000000..23eb2f13fb
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/widgets/window_shade.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<window_shade shade_color="0 0 0 0.5"/>
diff --git a/indra/newview/skins/default/xui/es/floater_about.xml b/indra/newview/skins/default/xui/es/floater_about.xml
index 93bb8444b4..307b61133f 100644
--- a/indra/newview/skins/default/xui/es/floater_about.xml
+++ b/indra/newview/skins/default/xui/es/floater_about.xml
@@ -10,7 +10,7 @@
<floater.string name="AboutPosition">
Estás en la posición [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1], de [REGION], alojada en &lt;nolink&gt;[HOSTNAME]&lt;/nolink&gt; ([HOSTIP])
[SERVER_VERSION]
-[[SERVER_RELEASE_NOTES_URL] [ReleaseNotes]]
+[SERVER_RELEASE_NOTES_URL]
</floater.string>
<floater.string name="AboutSystem">
CPU: [CPU]
@@ -37,6 +37,9 @@ Versión del servidor de voz: [VOICE_VERSION]
<floater.string name="AboutTraffic">
Paquetes perdidos: [PACKETS_LOST,number,0]/[PACKETS_IN,number,0] ([PACKETS_PCT,number,1]%)
</floater.string>
+ <floater.string name="ErrorFetchingServerReleaseNotesURL">
+ Error al obtener la URL de las notas de la versión del servidor.
+ </floater.string>
<tab_container name="about_tab">
<panel label="Información" name="support_panel">
<button label="Copiar al portapapeles" name="copy_btn" width="165"/>
@@ -64,32 +67,34 @@ Versión del servidor de voz: [VOICE_VERSION]
<panel label="Licencias" name="licenses_panel">
<text_editor name="credits_editor">
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 y 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
-SDL Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga
-SSLeay Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
-xmlrpc-epi Copyright (C) 2000 Epinions, Inc.
-zlib Copyright (C) 1995-2002 Jean-loup Gailly y Mark Adler.
-google-perftools Copyright (c) 2005, Google Inc.
+ 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
+ SDL Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga
+ SSLeay Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
+ xmlrpc-epi Copyright (C) 2000 Epinions, Inc.
+ zlib Copyright (C) 1995-2002 Jean-loup Gailly and Mark Adler.
+ google-perftools Copyright (c) 2005, Google Inc.
+
+ El visor de Second Life usa Havok (TM) Physics. (c)Copyright 1999-2010 Havok.com Inc. (y sus licenciadores). Reservados todos los derechos. Vea los detalles en www.havok.com.
-El visor de Second Life utiliza Havok (TM) Physics. (c)Copyright 1999-2010 Havok.com Inc. (y los propietarios de las licencias). Reservados todos los derechos. Consulta www.havok.com si deseas obtener más información.
+ Este software contiene código fuente suministrado por NVIDIA Corporation.
-Reservados todos los derechos. Consulta las licencias en .txt si deseas obtener más información.
+ Reservados todos los derechos. Consulte los detalles en licenses.txt.
-Codificación de sonido del chat de voz: Polycom(R) Siren14(TM) (ITU-T Rec. G.722.1 Annex C)
+ Codificación del audio del chat de voz: 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/es/floater_about_land.xml b/indra/newview/skins/default/xui/es/floater_about_land.xml
index 83749fc535..6b8a1ff906 100644
--- a/indra/newview/skins/default/xui/es/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/es/floater_about_land.xml
@@ -130,7 +130,7 @@ Vaya al menú Mundo &gt; Acerca del terreno o seleccione otra parcela para ver s
Tráfico:
</text>
<text name="DwellText">
- 0
+ Cargando...
</text>
<button label="Comprar terreno" left="130" name="Buy Land..." width="125"/>
<button label="Venta Linden" name="Linden Sale..." tool_tip="El terreno debe estar en propiedad, con contenido, y no estar en subasta."/>
@@ -213,19 +213,19 @@ Vaya al menú Mundo &gt; Acerca del terreno o seleccione otra parcela para ver s
Plus de objetos en la región: [BONUS]
</text>
<text name="Simulator primitive usage:">
- Uso de primitivas:
+ Capacidad de la región:
</text>
<text name="objects_available">
[COUNT] de un máx. de [MAX] ([AVAILABLE] disponibles)
</text>
<text name="Primitives parcel supports:">
- Prims que admite la parcela:
+ Capacidad del terreno de la parcela:
</text>
<text name="object_contrib_text">
[COUNT]
</text>
<text name="Primitives on parcel:">
- Prims en la parcela:
+ Impacto en el terreno de la parcela:
</text>
<text name="total_objects_text">
[COUNT]
@@ -309,13 +309,15 @@ Sólo las parcelas más grandes pueden listarse en la búsqueda.
Sin &apos;empujones&apos; (prevalece lo marcado en la región)
</panel.string>
<panel.string name="see_avs_text">
- Ver a los residentes de esta parcela y chatear con ellos
+ Los avatares de otras parcelas pueden ver
</panel.string>
<text name="allow_label">
Permitir a otros Residentes:
</text>
- <check_box label="Editar el terreno" name="edit land check" tool_tip="Si se marca, cualquiera podrá modificar su terreno. Mejor dejarlo desmarcado, pues usted siempre puede modificar su terreno."/>
- <check_box label="Volar" name="check fly" tool_tip="Si se marca, los residentes podrán volar en su terreno. Si no, sólo podrán volar al cruzarlo o hasta que aterricen en él."/>
+ <text name="allow_label0">
+ Volar:
+ </text>
+ <check_box label="Todos" name="check fly" tool_tip="Si se marca, los residentes podrán volar en su terreno. Si no, sólo podrán volar al cruzarlo o hasta que aterricen en él."/>
<text name="allow_label2">
Crear objetos:
</text>
@@ -331,9 +333,6 @@ Sólo las parcelas más grandes pueden listarse en la búsqueda.
</text>
<check_box label="Todos los residentes" name="check other scripts"/>
<check_box label="El grupo" name="check group scripts"/>
- <text name="land_options_label">
- Opciones del terreno:
- </text>
<check_box label="Seguro (sin daño)" name="check safe" tool_tip="Si se marca, convierte el terreno en &apos;seguro&apos;, desactivando el daño en combate. Si no, se activa el daño en combate."/>
<check_box label="Sin &apos;empujones&apos;" name="PushRestrictCheck" tool_tip="Previene scripts que empujen. Marcando esta opción prevendrá que en su terreno haya comportamientos destructivos."/>
<check_box label="Mostrar el sitio en la búsqueda (30 L$/semana)" name="ShowDirectoryCheck" tool_tip="Let people see this parcel in search results"/>
@@ -374,9 +373,9 @@ Sólo las parcelas más grandes pueden listarse en la búsqueda.
</text>
<texture_picker label="" name="snapshot_ctrl" tool_tip="Pulse para elegir una imagen"/>
<text name="allow_label5">
- Permitir a los residentes de otras parcelas:
+ a los avatares de esta parcela y chatear con ellos
</text>
- <check_box label="Ver los avatares" name="SeeAvatarsCheck" tool_tip="Permite que los residentes de otras parcelas vean a los residentes de ésta y chateen con ellos, y también que tú puedas verles y chatear con ellos."/>
+ <check_box label="Ver los avatares" name="SeeAvatarsCheck" tool_tip="Permite que los avatares de otras parcelas vean a los avatares de ésta y chateen con ellos, y también que tú puedas verles y chatear con ellos."/>
<text name="landing_point">
Punto de llegada: [LANDING]
</text>
diff --git a/indra/newview/skins/default/xui/es/floater_avatar.xml b/indra/newview/skins/default/xui/es/floater_avatar.xml
new file mode 100644
index 0000000000..21d202309f
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/floater_avatar.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Avatar" title="ELIGE UN AVATAR"/>
diff --git a/indra/newview/skins/default/xui/es/floater_buy_currency.xml b/indra/newview/skins/default/xui/es/floater_buy_currency.xml
index 43bbf0b70f..2c8848265f 100644
--- a/indra/newview/skins/default/xui/es/floater_buy_currency.xml
+++ b/indra/newview/skins/default/xui/es/floater_buy_currency.xml
@@ -46,7 +46,7 @@
[AMT] L$
</text>
<text name="currency_links">
- [http://www.secondlife.com/my/account/payment_method_management.php método de pago] | [http://www.secondlife.com/my/account/currency.php moneda] | [http://www.secondlife.com/my/account/exchange_rates.php tipo de cambio]
+ [http://www.secondlife.com/my/account/payment_method_management.php método de pago] | [http://www.secondlife.com/my/account/currency.php moneda]
</text>
<text name="exchange_rate_note">
Vuelve a escribir la cantidad para ver el tipo de cambio más reciente.
diff --git a/indra/newview/skins/default/xui/es/floater_buy_land.xml b/indra/newview/skins/default/xui/es/floater_buy_land.xml
index 9d33b69de9..005fe90318 100644
--- a/indra/newview/skins/default/xui/es/floater_buy_land.xml
+++ b/indra/newview/skins/default/xui/es/floater_buy_land.xml
@@ -160,7 +160,7 @@ para cubrir esta parcela.
Podrá o no unirse o dividirse.
</text>
<text name="covenant_text">
- Debes aceptar el Contrato del Estado:
+ Debes aceptar el Contrato del estado:
</text>
<text left="470" name="covenant_timestamp_text"/>
<text_editor name="covenant_editor">
diff --git a/indra/newview/skins/default/xui/es/floater_camera.xml b/indra/newview/skins/default/xui/es/floater_camera.xml
index 04f743b659..b0704ab788 100644
--- a/indra/newview/skins/default/xui/es/floater_camera.xml
+++ b/indra/newview/skins/default/xui/es/floater_camera.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="camera_floater" title="">
+<floater name="camera_floater" title="CONTROLES DE LA CÃMARA">
<floater.string name="rotate_tooltip">
Girar la cámara alrededor de lo enfocado
</floater.string>
@@ -9,15 +9,6 @@
<floater.string name="move_tooltip">
Mover la cámara arriba y abajo, izquierda y derecha
</floater.string>
- <floater.string name="camera_modes_title">
- Modos de cámara
- </floater.string>
- <floater.string name="pan_mode_title">
- Orbital - Zoom - Panorámica
- </floater.string>
- <floater.string name="presets_mode_title">
- Vistas predefinidas
- </floater.string>
<floater.string name="free_mode_title">
Centrar el objeto
</floater.string>
diff --git a/indra/newview/skins/default/xui/es/floater_chat_bar.xml b/indra/newview/skins/default/xui/es/floater_chat_bar.xml
new file mode 100644
index 0000000000..2e94805057
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/floater_chat_bar.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="chat_bar" title="CHAT">
+ <panel name="bottom_panel">
+ <line_editor label="Pulsa aquí para chatear." name="chat_box" tool_tip="Pulsa Enter para decirlo o Ctrl+Enter para gritarlo"/>
+ <button name="show_nearby_chat" tool_tip="Muestra o esconde el registro del chat"/>
+ </panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_destinations.xml b/indra/newview/skins/default/xui/es/floater_destinations.xml
new file mode 100644
index 0000000000..df18698d2f
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/floater_destinations.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Destinations" title="DESTINOS"/>
diff --git a/indra/newview/skins/default/xui/es/floater_fast_timers.xml b/indra/newview/skins/default/xui/es/floater_fast_timers.xml
new file mode 100644
index 0000000000..eeb39583ef
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/floater_fast_timers.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="fast_timers">
+ <string name="pause">
+ Pausa
+ </string>
+ <string name="run">
+ Correr
+ </string>
+ <button label="Pausa" name="pause_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_hardware_settings.xml b/indra/newview/skins/default/xui/es/floater_hardware_settings.xml
index 0150241d9a..b96076836b 100644
--- a/indra/newview/skins/default/xui/es/floater_hardware_settings.xml
+++ b/indra/newview/skins/default/xui/es/floater_hardware_settings.xml
@@ -4,7 +4,7 @@
Filtrado:
</text>
<check_box label="Filtrado anisotrópico (más lento si se activa)" name="ani"/>
- <text name="Antialiasing:">
+ <text name="antialiasing label">
Antialiasing:
</text>
<combo_box label="Antialiasing" name="fsaa" width="94">
diff --git a/indra/newview/skins/default/xui/es/floater_how_to.xml b/indra/newview/skins/default/xui/es/floater_how_to.xml
new file mode 100644
index 0000000000..4a57dc3643
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/floater_how_to.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_how_to" title="CÓMO"/>
diff --git a/indra/newview/skins/default/xui/es/floater_map.xml b/indra/newview/skins/default/xui/es/floater_map.xml
index 370b7f5053..69f638418e 100644
--- a/indra/newview/skins/default/xui/es/floater_map.xml
+++ b/indra/newview/skins/default/xui/es/floater_map.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Map" title="">
+<floater name="Map" title="MINIMAPA">
<floater.string name="ToolTipMsg">
[REGIÓN](Haz doble clic para abrir el mapa y pulsa la tecla Mayús y arrastra para obtener una vista panorámica)
</floater.string>
@@ -7,7 +7,7 @@
[REGION](Pulsa dos veces para teleportarte, pulsa mayús y arrastra para obtener una panorámica)
</floater.string>
<floater.string name="mini_map_caption">
- MINIMAPA
+ Minimapa
</floater.string>
<text label="N" name="floater_map_north" text="N">
N
diff --git a/indra/newview/skins/default/xui/es/floater_model_preview.xml b/indra/newview/skins/default/xui/es/floater_model_preview.xml
index 36f988b25f..ab3ba5aed7 100644
--- a/indra/newview/skins/default/xui/es/floater_model_preview.xml
+++ b/indra/newview/skins/default/xui/es/floater_model_preview.xml
@@ -1,10 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Model Preview" title="Cargar modelo">
- <string name="status_idle">
- Inactivo
- </string>
+<floater name="Model Preview" title="SUBIR MODELO">
+ <string name="status_idle"/>
<string name="status_parse_error">
- Problema de análisis de DAE - consulta los datos en el registro.
+ Error: Problema de análisis de DAE - consulta los datos en el registro.
+ </string>
+ <string name="status_material_mismatch">
+ Error: el material del modelo no es un subconjunto del modelo de referencia.
</string>
<string name="status_reading_file">
Cargando...
@@ -51,6 +52,9 @@
<string name="mesh_status_missing_lod">
Falta un nivel de detalle requerido.
</string>
+ <string name="mesh_status_invalid_material_list">
+ Los materiales con niveles de detalle no son un subconjunto del modelo de referencia.
+ </string>
<string name="layer_all">
Todo
</string>
@@ -63,188 +67,211 @@
<string name="tbd">
TBD
</string>
- <text name="name_label">
- Nombre:
- </text>
- <text name="lod_label">
- Vista previa:
- </text>
- <combo_box name="preview_lod_combo" tool_tip="Nivel de detalle disponible en la vista previa">
- <combo_item name="high">
- Nivel de detalle: Alto
- </combo_item>
- <combo_item name="medium">
- Nivel de detalle: Media
- </combo_item>
- <combo_item name="low">
- Nivel de detalle: Bajo
- </combo_item>
- <combo_item name="lowest">
- Nivel de detalle: Mínimo
- </combo_item>
- </combo_box>
- <text name="warning_title">
- ATENCIÓN:
- </text>
- <text name="warning_message">
- No podrás terminar de subir este modelo a los servidores de Second Life. [[VURL] Averigua cómo] puedes obtener autorización para subir modelos de malla.
- </text>
- <text name="weights_text">
- Descargar:
-Física:
-Servidor:
-
-Equiv. en prims:
- </text>
- <text name="weights">
- [ST]
-[PH]
-[SIM]
-
-[EQ]
- </text>
- <tab_container name="import_tab">
- <panel label="Nivel de detalle" name="lod_panel">
- <text name="lod_table_header">
- Seleccionar nivel de detalle:
- </text>
- <text name="high_label" value="Alto"/>
- <text name="high_triangles" value="0"/>
- <text name="high_vertices" value="0"/>
- <text name="medium_label" value="Media"/>
- <text name="medium_triangles" value="0"/>
- <text name="medium_vertices" value="0"/>
- <text name="low_label" value="Bajo"/>
- <text name="low_triangles" value="0"/>
- <text name="low_vertices" value="0"/>
- <text name="lowest_label" value="Mínimo"/>
- <text name="lowest_triangles" value="0"/>
- <text name="lowest_vertices" value="0"/>
- <text name="lod_table_footer">
- Nivel de detalle: [DETALLE]
- </text>
- <radio_group name="lod_file_or_limit" value="lod_from_file">
- <radio_item label="Cargar desde el archivo" name="lod_from_file"/>
- <radio_item label="Generar automáticamente" name="lod_auto_generate"/>
- <radio_item label="Ninguno" name="lod_none"/>
- </radio_group>
- <button label="Examinar..." name="lod_browse"/>
- <combo_box name="lod_mode">
- <combo_item name="triangle_limit">
- Límite de triángulo
- </combo_item>
- <combo_item name="error_threshold">
- Margen de error
- </combo_item>
- </combo_box>
- <text name="build_operator_text">
- Crear operador:
- </text>
- <text name="queue_mode_text">
- Modo de cola:
- </text>
- <combo_box name="build_operator">
- <combo_item name="edge_collapse">
- Cerrar bordes
- </combo_item>
- <combo_item name="half_edge_collapse">
- Cerrar la mitad de los bordes
- </combo_item>
- </combo_box>
- <combo_box name="queue_mode">
- <combo_item name="greedy">
- Egoísta
- </combo_item>
- <combo_item name="lazy">
- Vago
- </combo_item>
- <combo_item name="independent">
- Independiente
- </combo_item>
- </combo_box>
- <text name="border_mode_text">
- Modo de borde:
+ <panel name="left_panel">
+ <panel name="model_name_representation_panel">
+ <text name="name_label">
+ Nombre del modelo:
</text>
- <text name="share_tolderance_text">
- Tolerancia de uso compartido:
+ <text name="model_category_label">
+ Este modelo representa...
</text>
- <combo_box name="border_mode">
- <combo_item name="border_unlock">
- Desbloquear
- </combo_item>
- <combo_item name="border_lock">
- Lock
- </combo_item>
+ <combo_box name="model_category_combo">
+ <combo_item label="Elegir uno..." name="Choose one"/>
+ <combo_item label="Forma del avatar" name="Avatar shape"/>
+ <combo_item label="Anexo del avatar" name="Avatar attachment"/>
+ <combo_item label="Objeto en movimiento (vehículo, animal)" name="Moving object (vehicle, animal)"/>
+ <combo_item label="Componente de construcción" name="Building Component"/>
+ <combo_item label="Grande, sin movimiento, etc." name="Large, non moving etc"/>
+ <combo_item label="Más pequeño, sin movimiento, etc." name="Smaller, non-moving etc"/>
+ <combo_item label="No es exactamente ninguno de estos" name="Not really any of these"/>
</combo_box>
- <text name="crease_label">
- Ãngulo de marca:
- </text>
- <spinner name="crease_angle" value="75"/>
</panel>
- <panel label="Física" name="physics_panel">
- <panel name="physics geometry">
- <radio_group name="physics_load_radio" value="physics_load_from_file">
- <radio_item label="Archivo:" name="physics_load_from_file"/>
- <radio_item label="Utilizar nivel de detalle:" name="physics_use_lod"/>
- </radio_group>
- <combo_box name="physics_lod_combo" tool_tip="Nivel de detalle para forma física">
- <combo_item name="physics_lowest">
- Mínimo
- </combo_item>
- <combo_item name="physics_low">
- Bajo
- </combo_item>
- <combo_item name="physics_medium">
- Media
- </combo_item>
- <combo_item name="physics_high">
- Alto
- </combo_item>
- </combo_box>
- <button label="Examinar..." name="physics_browse"/>
- </panel>
- <panel name="physics analysis">
- <slider label="Leve:" name="Smooth"/>
- <check_box label="Cerrar agujeros (lento)" name="Close Holes (Slow)"/>
- <button label="Analizar" name="Decompose"/>
- <button label="Cancelar" name="decompose_cancel"/>
+ <tab_container name="import_tab">
+ <panel label="Nivel de detalle" name="lod_panel" title="Nivel de detalle">
+ <text initial_value="Origen" name="source" value="Origen"/>
+ <text initial_value="Triángulos" name="triangles" value="Triángulos"/>
+ <text initial_value="Vértices" name="vertices" value="Vértices"/>
+ <text initial_value="Alto" name="high_label" value="Alto"/>
+ <button label="Buscar..." name="lod_browse_high"/>
+ <text initial_value="0" name="high_triangles" value="0"/>
+ <text initial_value="0" name="high_vertices" value="0"/>
+ <text initial_value="Medio" name="medium_label" value="Medio"/>
+ <button label="Buscar..." name="lod_browse_medium"/>
+ <text initial_value="0" name="medium_triangles" value="0"/>
+ <text initial_value="0" name="medium_vertices" value="0"/>
+ <text initial_value="Bajo" name="low_label" value="Bajo"/>
+ <button label="Buscar..." name="lod_browse_low"/>
+ <text initial_value="0" name="low_triangles" value="0"/>
+ <text initial_value="0" name="low_vertices" value="0"/>
+ <text initial_value="Mínimo" name="lowest_label" value="Mínimo"/>
+ <button label="Buscar..." name="lod_browse_lowest"/>
+ <text initial_value="0" name="lowest_triangles" value="0"/>
+ <text initial_value="0" name="lowest_vertices" value="0"/>
+ <check_box label="Generar normales" name="gen_normals"/>
+ <text initial_value="Ãngulo de pliegue:" name="crease_label" value="Ãngulo de pliegue:"/>
+ <spinner name="crease_angle" value="75"/>
</panel>
- <panel name="physics simplification">
- <slider label="Pases:" name="Combine Quality"/>
- <slider label="Escala de detalle:" name="Detail Scale"/>
- <slider label="Retener:" name="Retain%"/>
- <button label="Simplificar" name="Simplify"/>
- <button label="Cancelar" name="simplify_cancel"/>
+ <panel label="Física" name="physics_panel">
+ <panel name="physics geometry">
+ <text name="first_step_name">
+ Paso 1: Nivel de detalle
+ </text>
+ <combo_box name="physics_lod_combo" tool_tip="Niveles de detalle para utilizar con la forma física">
+ <combo_item name="choose_one">
+ Elegir uno...
+ </combo_item>
+ <combo_item name="physics_high">
+ Alto
+ </combo_item>
+ <combo_item name="physics_medium">
+ Medio
+ </combo_item>
+ <combo_item name="physics_low">
+ Bajo
+ </combo_item>
+ <combo_item name="physics_lowest">
+ Mínimo
+ </combo_item>
+ <combo_item name="load_from_file">
+ De archivo
+ </combo_item>
+ </combo_box>
+ <button label="Buscar..." name="physics_browse"/>
+ </panel>
+ <panel name="physics analysis">
+ <text name="method_label">
+ Paso 2: Analizar
+ </text>
+ <text name="analysis_method_label">
+ Método:
+ </text>
+ <text name="quality_label">
+ Calidad:
+ </text>
+ <text name="smooth_method_label">
+ Leve:
+ </text>
+ <check_box label="Cerrar agujeros" name="Close Holes (Slow)"/>
+ <button label="Analizar" name="Decompose"/>
+ <button label="Cancelar" name="decompose_cancel"/>
+ </panel>
+ <panel name="physics simplification">
+ <text name="second_step_label">
+ Paso 3: Simplificar
+ </text>
+ <text name="simp_method_header">
+ Método:
+ </text>
+ <text name="pass_method_header">
+ Pases:
+ </text>
+ <text name="Detail Scale label">
+ Escala de detalle:
+ </text>
+ <text name="Retain%_label">
+ Retención:
+ </text>
+ <combo_box name="Combine Quality" value="1"/>
+ <button label="Simplificar" name="Simplify"/>
+ <button label="Cancelar" name="simplify_cancel"/>
+ </panel>
+ <panel name="physics info">
+ <text name="results_text">
+ Resultados:
+ </text>
+ <text name="physics_triangles">
+ Triángulos: [TRIANGLES],
+ </text>
+ <text name="physics_points">
+ Vértices: [POINTS],
+ </text>
+ <text name="physics_hulls">
+ Apariencias: [HULLS]
+ </text>
+ </panel>
</panel>
- <panel name="physics info">
- <slider label="Ampliación de vista previa:" name="physics_explode"/>
- <text name="physics_triangles">
- Triángulos: [TRIÃNGULOS]
+ <panel label="Opciones de subida" name="modifiers_panel">
+ <text name="scale_label">
+ Escala (1=sin ajuste de escala):
</text>
- <text name="physics_points">
- Intersecciones: [PUNTOS]
+ <spinner name="import_scale" value="1.0"/>
+ <text name="dimensions_label">
+ Dimensiones:
</text>
- <text name="physics_hulls">
- Aspecto exterior: [ASPECTO EXTERIOR]
+ <text name="import_dimensions">
+ [X] X [Y] X [Z]
</text>
+ <check_box label="Incluir texturas" name="upload_textures"/>
+ <text name="include_label">
+ Solo para modelos de avatar:
+ </text>
+ <check_box label="Incluir el peso de la piel" name="upload_skin"/>
+ <check_box label="Incluir posturas de las articulaciones" name="upload_joints"/>
+ <text name="pelvis_offset_label">
+ Desplazamiento Z (subir o bajar el avatar):
+ </text>
+ <spinner name="pelvis_offset" value="0.0"/>
</panel>
- </panel>
- <panel label="Modificadores" name="modifiers_panel">
- <spinner name="import_scale" value="1.0"/>
- <text name="import_dimensions">
- [X] x [Y] x [Z] m
+ </tab_container>
+ <panel name="weights_and_warning_panel">
+ <button label="Calcular pesos y precio" name="calculate_btn" tool_tip="Calcular pesos y precio"/>
+ <button label="Cancelar" name="cancel_btn"/>
+ <button label="subir" name="ok_btn" tool_tip="Subir al simulador"/>
+ <button label="Limpiar la configuración y reiniciar el formulario" name="reset_btn"/>
+ <text name="upload_fee">
+ Precio de subida: L$ [FEE]
+ </text>
+ <text name="prim_weight">
+ Impacto en el terreno: [EQ]
+ </text>
+ <text name="download_weight">
+ Descargar: [ST]
+ </text>
+ <text name="physics_weight">
+ Física: [PH]
+ </text>
+ <text name="server_weight">
+ Servidor: [SIM]
+ </text>
+ <text name="warning_title">
+ NOTA:
+ </text>
+ <text name="warning_message">
+ No tienes derechos para subir modelos de malla. [[VURL] Averigua cómo] puedes obtener la autorización.
+ </text>
+ <text name="status">
+ [STATUS]
</text>
- <check_box label="Texturas" name="upload_textures"/>
- <check_box label="Peso de la piel" name="upload_skin"/>
- <check_box label="Posturas de las articulaciones" name="upload_joints"/>
- <spinner name="pelvis_offset" value="0.0"/>
</panel>
- </tab_container>
- <text name="upload_fee">
- Precio de subida: L$ [FEE]
+ </panel>
+ <text name="lod_label">
+ Vista previa:
</text>
- <button label="Establecer en valores predeterminados" name="reset_btn" tool_tip="Establecer en valores predeterminados"/>
- <button label="Calcular pesos y precio" name="calculate_btn" tool_tip="Calcular pesos y precio"/>
- <button label="Subir" name="ok_btn" tool_tip="Cargar al simulador"/>
- <button label="Cancelar" name="cancel_btn"/>
+ <panel name="right_panel">
+ <combo_box name="preview_lod_combo" tool_tip="LOD para ver en renderizado de prueba">
+ <combo_item name="high">
+ Alto
+ </combo_item>
+ <combo_item name="medium">
+ Media
+ </combo_item>
+ <combo_item name="low">
+ Bajo
+ </combo_item>
+ <combo_item name="lowest">
+ Mínimo
+ </combo_item>
+ </combo_box>
+ <text name="label_display">
+ Mostrar...
+ </text>
+ <check_box label="Bordes" name="show_edges"/>
+ <check_box label="Física" name="show_physics"/>
+ <check_box label="Texturas" name="show_textures"/>
+ <check_box label="Pesos de la piel" name="show_skin_weight"/>
+ <check_box label="Articulaciones" name="show_joint_positions"/>
+ <text name="physics_explode_label">
+ Ampliación de vista previa:
+ </text>
+ </panel>
</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_model_wizard.xml b/indra/newview/skins/default/xui/es/floater_model_wizard.xml
index 86de557ed9..e27db5a1c4 100644
--- a/indra/newview/skins/default/xui/es/floater_model_wizard.xml
+++ b/indra/newview/skins/default/xui/es/floater_model_wizard.xml
@@ -6,26 +6,23 @@
<button label="2. Optimizar" name="optimize_btn"/>
<button label="1. Seleccionar archivo" name="choose_file_btn"/>
<panel name="choose_file_panel">
- <panel name="choose_file_header_panel">
- <text name="choose_file_header_text">
+ <panel name="header_panel">
+ <text name="header_text">
Elige el archivo de modelo
</text>
</panel>
- <panel name="choose_file_content_panel">
+ <panel name="content">
<text name="advanced_users_text">
Usuarios avanzados: si tienes experiencia con las herramientas de creación de contenidos 3D, quizá te interese utilizar la función de subida avanzada.
</text>
<button label="Cambiar al modo Avanzado" name="switch_to_advanced"/>
- <text name="choose_model_file_label">
+ <text name="Cache location">
Elige el archivo de modelo que deseas subir
</text>
<button label="Buscar..." label_selected="Buscar..." name="browse"/>
- <text name="support_collada_text">
+ <text name="Model types">
‎Second Life admite los archivos COLLADA (.dae)
</text>
- <text name="dimensions_label">
- Dimensiones (metros):
- </text>
<text name="dimensions">
X Y Z
</text>
@@ -38,18 +35,15 @@
</panel>
</panel>
<panel name="optimize_panel">
- <panel name="optimize_header_panel">
- <text name="optimize_header_text">
+ <panel name="header_panel">
+ <text name="header_text">
Optimizar el modelo
</text>
</panel>
- <text name="optimize_hint">
+ <text name="description">
Hemos optimizado el rendimiento del modelo, pero puedes ajustarlo más si lo deseas.
</text>
- <panel name="optimize_content_panel">
- <text name="generating_lod_label">
- Generando el nivel de detalle
- </text>
+ <panel name="content">
<text name="high_detail_text">
Generar el nivel de detalle: Alto
</text>
@@ -64,123 +58,64 @@
</text>
</panel>
<panel name="content2">
- <text name="optimize_performance_text">
- Rendimiento
- </text>
- <text name="optimize_faster_rendering_text">
- Renderizado más rápido
-Menos detalles
-Menos peso de prim
- </text>
- <text name="optimize_accuracy_text">
- Precisión
- </text>
- <text name="optimize_slower_rendering_text">
- Renderizado más lento
-Más detalles
-Más peso de prim
- </text>
- <text name="accuracy_slider_mark1">
- &apos;
- </text>
- <text name="accuracy_slider_mark2">
- &apos;
- </text>
- <text name="accuracy_slider_mark3">
- &apos;
- </text>
<button label="Recalcular la geometría" name="recalculate_geometry_btn"/>
- <text name="geometry_preview_label">
+ <text name="lod_label">
Vista previa de geometría
</text>
<combo_box name="preview_lod_combo" tool_tip="LOD para ver en renderizado de prueba">
- <combo_item name="preview_lod_high">
+ <combo_item name="high">
Detalle alto
</combo_item>
- <combo_item name="preview_lod_medium">
+ <combo_item name="medium">
Detalles medios
</combo_item>
- <combo_item name="preview_lod_low">
+ <combo_item name="low">
Detalle bajo
</combo_item>
- <combo_item name="preview_lod_lowest">
+ <combo_item name="lowest">
Detalles mínimos
</combo_item>
</combo_box>
</panel>
</panel>
<panel name="physics_panel">
- <panel name="physics_header_panel">
- <text name="physics_header_text">
+ <panel name="header_panel">
+ <text name="header_text">
Ajustar la física
</text>
</panel>
- <text name="physics_hint">
+ <text name="description">
Crearemos una forma para la apariencia exterior del modelo. Ajusta el nivel de detalle de la forma según se necesite para el propósito proyectado del modelo.
</text>
- <panel name="physics_content_panel">
- <text name="physics_performance_text">
- Rendimiento
- </text>
- <text name="physics_faster_rendering_text">
- Renderizado más rápido
-Menos detalles
-Menos peso de prim
- </text>
- <text name="physics_accuracy_text">
- Precisión
- </text>
- <text name="physics_slower_dendering_text">
- Renderizado más lento
-Más detalles
-Más peso de prim
- </text>
- <text name="physics_example_1">
- Ejemplos:
-Objetos en movimiento
-Objetos voladores
-Vehículos
- </text>
- <text name="physics_example_2">
- Ejemplos:
-Objetos estáticos pequeños
-Objetos con menos detalles
-Muebles sencillos
- </text>
- <text name="physics_example_3">
- Ejemplos:
-Objetos estáticos
-Objetos con detalles
-Edificios
- </text>
+ <panel name="content">
<button label="Recalcular física" name="recalculate_physics_btn"/>
<button label="Recalculando..." name="recalculating_physics_btn"/>
- <text name="physics_preview_label">
+ <text name="lod_label">
Prueba de física
</text>
<combo_box name="preview_lod_combo2" tool_tip="LOD para ver en renderizado de prueba">
- <combo_item name="preview_lod2_high">
+ <combo_item name="high">
Detalle alto
</combo_item>
- <combo_item name="preview_lod2_medium">
+ <combo_item name="medium">
Detalles medios
</combo_item>
- <combo_item name="preview_lod2_low">
+ <combo_item name="low">
Detalle bajo
</combo_item>
- <combo_item name="preview_lod2_lowest">
+ <combo_item name="lowest">
Detalles mínimos
</combo_item>
</combo_box>
</panel>
</panel>
<panel name="review_panel">
- <panel name="review_header_panel">
- <text name="review_header_text">
+ <panel name="header_panel">
+ <text name="header_text">
Revisar
</text>
</panel>
- <panel name="review_content_panel">
+ <panel name="content">
<text name="review_prim_equiv">
Impacto en la parcela/región: [EQUIV] equivalentes en prim
</text>
@@ -193,8 +128,8 @@ Edificios
</panel>
</panel>
<panel name="upload_panel">
- <panel name="upload_header_panel">
- <text name="upload_header_text">
+ <panel name="header_panel">
+ <text name="header_text">
Subida finalizada
</text>
</panel>
diff --git a/indra/newview/skins/default/xui/es/floater_moveview.xml b/indra/newview/skins/default/xui/es/floater_moveview.xml
index 258f84c361..0e7b950bd3 100644
--- a/indra/newview/skins/default/xui/es/floater_moveview.xml
+++ b/indra/newview/skins/default/xui/es/floater_moveview.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="move_floater">
+<floater name="move_floater" title="CAMINAR / CORRER / VOLAR">
<string name="walk_forward_tooltip">
Caminar hacia adelante (cursor arriba o W)
</string>
@@ -58,14 +58,14 @@
Volar
</string>
<panel name="panel_actions">
- <button label="" label_selected="" name="move up btn" tool_tip="Volar (pulsa E para subir)"/>
<button label="" label_selected="" name="turn left btn" tool_tip="Girar a la izq. (cursor izq. o A)"/>
<joystick_slide name="move left btn" tool_tip="Caminar a la izq. (pulsa Mayúsculas + cursor izq. o A)"/>
- <button label="" label_selected="" name="move down btn" tool_tip="Volar (pulsa C para descender)"/>
<button label="" label_selected="" name="turn right btn" tool_tip="Girar a la der. (cursor der. o D)"/>
<joystick_slide name="move right btn" tool_tip="Caminar a la der. (pulsa Mayúsculas + cursor der. o D)"/>
<joystick_turn name="forward btn" tool_tip="Caminar hacia adelante (cursor arriba o W)"/>
<joystick_turn name="backward btn" tool_tip="Caminar de espaldas (cursor abajo o S)"/>
+ <button label="" label_selected="" name="move up btn" tool_tip="Volar (pulsa E para subir)"/>
+ <button label="" label_selected="" name="move down btn" tool_tip="Volar (pulsa C para descender)"/>
</panel>
<panel name="panel_modes">
<button label="" name="mode_walk_btn" tool_tip="Modo de caminar"/>
diff --git a/indra/newview/skins/default/xui/es/floater_my_appearance.xml b/indra/newview/skins/default/xui/es/floater_my_appearance.xml
new file mode 100644
index 0000000000..774babf04e
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/floater_my_appearance.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_my_appearance" title="APARIENCIA">
+ <panel label="Modificar la apariencia" name="main_panel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_my_inventory.xml b/indra/newview/skins/default/xui/es/floater_my_inventory.xml
new file mode 100644
index 0000000000..0efd9f1c6d
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/floater_my_inventory.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_my_inventory" title="INVENTARIO"/>
diff --git a/indra/newview/skins/default/xui/es/floater_nearby_chat.xml b/indra/newview/skins/default/xui/es/floater_nearby_chat.xml
index 1fee9ab056..b3b8cdcfff 100644
--- a/indra/newview/skins/default/xui/es/floater_nearby_chat.xml
+++ b/indra/newview/skins/default/xui/es/floater_nearby_chat.xml
@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="nearby_chat" title="CHAT">
- <check_box label="Traducir chat (mediante Google)" name="translate_chat_checkbox"/>
+ <check_box label="Traducir chat" name="translate_chat_checkbox"/>
</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_object_weights.xml b/indra/newview/skins/default/xui/es/floater_object_weights.xml
new file mode 100644
index 0000000000..50c4f0518d
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/floater_object_weights.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="object_weights" title="AVANZADAS">
+ <floater.string name="nothing_selected" value="--"/>
+ <text name="selected_text" value="SELECCIONADOS"/>
+ <text name="objects" value="--"/>
+ <text name="objects_label" value="Objetos"/>
+ <text name="prims" value="--"/>
+ <text name="prims_label" value="Primitivas"/>
+ <text name="weights_of_selected_text" value="PESOS DE SELECCIONADOS"/>
+ <text name="download" value="--"/>
+ <text name="download_label" value="Descargar"/>
+ <text name="physics" value="--"/>
+ <text name="physics_label" value="Física"/>
+ <text name="server" value="--"/>
+ <text name="server_label" value="Servidor"/>
+ <text name="display" value="--"/>
+ <text name="display_label" value="Mostrar"/>
+ <text name="land_impacts_text" value="IMPACTOS EN EL TERRENO"/>
+ <text name="selected" value="--"/>
+ <text name="selected_label" value="Seleccionados"/>
+ <text name="rezzed_on_land" value="--"/>
+ <text name="rezzed_on_land_label" value="Colocados en el terreno"/>
+ <text name="remaining_capacity" value="--"/>
+ <text name="remaining_capacity_label" value="Capacidad restante"/>
+ <text name="total_capacity" value="--"/>
+ <text name="total_capacity_label" value="Capacidad total"/>
+ <text name="help_SLURL" value="[secondlife:///app/help/object_weights ¿Qué es todo esto?...]"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_outfit_save_as.xml b/indra/newview/skins/default/xui/es/floater_outfit_save_as.xml
new file mode 100644
index 0000000000..f48d0d2d0c
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/floater_outfit_save_as.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="modal container" title="GUARDAR EL VESTUARIO"/>
diff --git a/indra/newview/skins/default/xui/es/floater_people.xml b/indra/newview/skins/default/xui/es/floater_people.xml
new file mode 100644
index 0000000000..f5a3eab008
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/floater_people.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_people" title="GENTE">
+ <panel_container name="main_panel">
+ <panel label="Perfil del grupo" name="panel_group_info_sidetray"/>
+ <panel label="Residentes y objetos ignorados" name="panel_block_list_sidetray"/>
+ </panel_container>
+</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_picks.xml b/indra/newview/skins/default/xui/es/floater_picks.xml
new file mode 100644
index 0000000000..255aa5dcdc
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/floater_picks.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_picks" title="Destacados"/>
diff --git a/indra/newview/skins/default/xui/es/floater_places.xml b/indra/newview/skins/default/xui/es/floater_places.xml
new file mode 100644
index 0000000000..12c6548205
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/floater_places.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_places" title="LUGARES">
+ <panel label="Lugares" name="main_panel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_snapshot.xml b/indra/newview/skins/default/xui/es/floater_snapshot.xml
index eafc623ea9..23078b3a55 100644
--- a/indra/newview/skins/default/xui/es/floater_snapshot.xml
+++ b/indra/newview/skins/default/xui/es/floater_snapshot.xml
@@ -3,73 +3,63 @@
<floater.string name="unknown">
desconocido
</floater.string>
- <radio_group label="Tipo de foto" name="snapshot_type_radio">
- <radio_item label="Correo-e" name="postcard"/>
- <radio_item label="Mi inventario ([AMOUNT] L$)" name="texture"/>
- <radio_item label="Guardar en mi ordenador" name="local"/>
- </radio_group>
+ <string name="postcard_progress_str">
+ Enviando el correo electrónico
+ </string>
+ <string name="profile_progress_str">
+ Publicando
+ </string>
+ <string name="inventory_progress_str">
+ Guardando en el inventario
+ </string>
+ <string name="local_progress_str">
+ Guardando en el equipo
+ </string>
+ <string name="profile_succeeded_str">
+ Imagen subida
+ </string>
+ <string name="postcard_succeeded_str">
+ Correo electrónico enviado
+ </string>
+ <string name="inventory_succeeded_str">
+ ¡Guardado en el inventario!
+ </string>
+ <string name="local_succeeded_str">
+ ¡Guardado en el equipo!
+ </string>
+ <string name="profile_failed_str">
+ Error al subir la imagen a los comentarios de tu perfil.
+ </string>
+ <string name="postcard_failed_str">
+ Error al enviar el correo electrónico.
+ </string>
+ <string name="inventory_failed_str">
+ Error al guardar en el inventario.
+ </string>
+ <string name="local_failed_str">
+ Error al guardar en el equipo.
+ </string>
+ <button name="advanced_options_btn" tool_tip="Opciones avanzadas"/>
+ <text name="image_res_text">
+ [WIDTH] x [HEIGHT] px
+ </text>
<text name="file_size_label">
[SIZE] kB
</text>
- <button label="Actualizar la foto" name="new_snapshot_btn"/>
- <button label="Enviar" name="send_btn"/>
- <button label="Ahorro ([AMOUNT] L$)" name="upload_btn"/>
- <flyout_button label="Guardar" name="save_btn" tool_tip="Guardar la imagen en un archivo">
- <flyout_button.item label="Guardar" name="save_item"/>
- <flyout_button.item label="Guardar como..." name="saveas_item"/>
- </flyout_button>
- <button label="Más" name="more_btn" tool_tip="Opciones avanzadas"/>
- <button label="Menos" name="less_btn" tool_tip="Opciones avanzadas"/>
- <button label="Cancelar" name="discard_btn"/>
- <text name="type_label2">
- Tamaño
- </text>
- <text name="format_label">
- Formato
- </text>
- <combo_box label="Resolución" name="postcard_size_combo">
- <combo_box.item label="Ventana actual" 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="Personalizado" name="Custom"/>
- </combo_box>
- <combo_box label="Resolución" name="texture_size_combo">
- <combo_box.item label="Ventana actual" name="CurrentWindow"/>
- <combo_box.item label="Pequeña (128x128)" name="Small(128x128)"/>
- <combo_box.item label="Mediana (256x256)" name="Medium(256x256)"/>
- <combo_box.item label="Grande (512x512)" name="Large(512x512)"/>
- <combo_box.item label="Personalizado" name="Custom"/>
- </combo_box>
- <combo_box label="Resolución" name="local_size_combo">
- <combo_box.item label="Ventana actual" name="CurrentWindow"/>
- <combo_box.item label="320x240" name="320x240"/>
- <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="1280x1024" name="1280x1024"/>
- <combo_box.item label="1600x1200" name="1600x1200"/>
- <combo_box.item label="Personalizado" name="Custom"/>
- </combo_box>
- <combo_box label="Formato" name="local_format_combo">
- <combo_box.item label="PNG" name="PNG"/>
- <combo_box.item label="JPEG" name="JPEG"/>
- <combo_box.item label="BMP" name="BMP"/>
- </combo_box>
- <spinner label="Ancho" name="snapshot_width"/>
- <spinner label="Altura" name="snapshot_height"/>
- <check_box label="Mantener las proporciones" name="keep_aspect_check"/>
- <slider label="Calidad de la imagen" name="image_quality_slider"/>
- <text name="layer_type_label">
- Captura:
- </text>
- <combo_box label="Capas de imagen" name="layer_types">
- <combo_box.item label="Colores" name="Colors"/>
- <combo_box.item label="Profundidad" name="Depth"/>
- </combo_box>
- <check_box label="Interfaz" name="ui_check"/>
- <check_box label="HUDs" name="hud_check"/>
- <check_box label="Mantener abierto después de guardar" name="keep_open_check"/>
- <check_box label="Congelar la toma (pantalla completa)" name="freeze_frame_check"/>
- <check_box label="Actualizar automáticamente" name="auto_snapshot_check"/>
+ <panel name="advanced_options_panel">
+ <text name="advanced_options_label">
+ OPCIONES AVANZADAS
+ </text>
+ <text name="layer_type_label">
+ Captura:
+ </text>
+ <combo_box label="Capas de imagen" name="layer_types">
+ <combo_box.item label="Colores" name="Colors"/>
+ <combo_box.item label="Profundidad" name="Depth"/>
+ </combo_box>
+ <check_box label="Interfaz" name="ui_check"/>
+ <check_box label="HUDs" name="hud_check"/>
+ <check_box label="Congelar la toma (pantalla completa)" name="freeze_frame_check"/>
+ <check_box label="Actualizar automáticamente" name="auto_snapshot_check"/>
+ </panel>
</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_sound_devices.xml b/indra/newview/skins/default/xui/es/floater_sound_devices.xml
index a5ffbd517a..0291f9e796 100644
--- a/indra/newview/skins/default/xui/es/floater_sound_devices.xml
+++ b/indra/newview/skins/default/xui/es/floater_sound_devices.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_sound_devices" title="Dispositivos de sonido">
+<floater name="floater_sound_devices" title="DISPOSITIVOS DE SONIDO">
<text name="voice_label">
Chat de voz
</text>
diff --git a/indra/newview/skins/default/xui/es/floater_stats.xml b/indra/newview/skins/default/xui/es/floater_stats.xml
index 5f4fabf375..ba4af2e866 100644
--- a/indra/newview/skins/default/xui/es/floater_stats.xml
+++ b/indra/newview/skins/default/xui/es/floater_stats.xml
@@ -10,8 +10,8 @@
</stat_view>
<stat_view label="Avanzado" name="advanced">
<stat_view label="Renderización" name="render">
- <stat_bar label="KTris generados" name="ktrisframe"/>
- <stat_bar label="KTris generados" name="ktrissec"/>
+ <stat_bar label="KTris generados por fotograma" name="ktrisframe"/>
+ <stat_bar label="KTris generados por segundo" name="ktrissec"/>
<stat_bar label="Objetos en total" name="objs"/>
<stat_bar label="Objetos nuevos" name="newobjs"/>
</stat_view>
@@ -43,18 +43,6 @@
<stat_bar label="Pin de objetos" name="physicspinnedtasks"/>
<stat_bar label="Objetos con bajo nivel de detalle" name="physicslodtasks"/>
<stat_bar label="Memoria asignada" name="physicsmemoryallocated"/>
- <stat_bar label="Agentes: actual./seg." name="simagentups"/>
- <stat_bar label="Agentes del grid principal" name="simmainagents"/>
- <stat_bar label="Agentes secundarios" name="simchildagents"/>
- <stat_bar label="Objetos" name="simobjects"/>
- <stat_bar label="Objetos activos" name="simactiveobjects"/>
- <stat_bar label="Scripts activos" name="simactivescripts"/>
- <stat_bar label="Eventos de scripts" name="simscripteps"/>
- <stat_bar label="Paquetes salientes" name="siminpps"/>
- <stat_bar label="Paquetes entrantes" name="simoutpps"/>
- <stat_bar label="Descargas pendientes" name="simpendingdownloads"/>
- <stat_bar label="Subidas pendientes" name="simpendinguploads"/>
- <stat_bar label="Total de bytes no reconocidos" name="simtotalunackedbytes"/>
</stat_view>
<stat_view label="Tiempo (ms)" name="simperf">
<stat_bar label="Tiempo total de los frames" name="simframemsec"/>
@@ -64,6 +52,14 @@
<stat_bar label="Tiempo de los agentes" name="simagentmsec"/>
<stat_bar label="Tiempo de las imágenes" name="simimagesmsec"/>
<stat_bar label="Tiempo de los scripts" name="simscriptmsec"/>
+ <stat_bar label="Tiempo libre" name="simsparemsec"/>
+ <stat_view label="Datos de tiempo (ms)" name="timedetails">
+ <stat_bar label="Paso de física" name="simsimphysicsstepmsec"/>
+ <stat_bar label="Actualizar formas físicas" name="simsimphysicsshapeupdatemsec"/>
+ <stat_bar label="Otros (Física)" name="simsimphysicsothermsec"/>
+ <stat_bar label="Tiempo de suspensión" name="simsleepmsec"/>
+ <stat_bar label="E/S bombeo" name="simpumpiomsec"/>
+ </stat_view>
</stat_view>
</stat_view>
</container_view>
diff --git a/indra/newview/skins/default/xui/es/floater_tools.xml b/indra/newview/skins/default/xui/es/floater_tools.xml
index f6e246ebae..650b4b457d 100644
--- a/indra/newview/skins/default/xui/es/floater_tools.xml
+++ b/indra/newview/skins/default/xui/es/floater_tools.xml
@@ -25,10 +25,10 @@
Pulsa y arrastra para seleccionar el terreno.
</floater.string>
<floater.string name="status_selectcount">
- [OBJ_COUNT] objetos ( [PRIM_COUNT] prims[PE_STRING] ) seleccionados
+ [OBJ_COUNT] objetos seleccionados, impacto en el terreno [LAND_IMPACT]
</floater.string>
- <floater.string name="status_selectprimequiv">
- , [SEL_WEIGHT] equivalentes en prim
+ <floater.string name="status_remaining_capacity">
+ Capacidad restante [LAND_CAPACITY].
</floater.string>
<button label="" label_selected="" name="button focus" tool_tip="Visión"/>
<button label="" label_selected="" name="button move" tool_tip="Mover"/>
@@ -105,8 +105,8 @@
<text name="selection_empty">
No está seleccionado nada.
</text>
- <text name="selection_weight">
- Peso de física [PHYS_WEIGHT], Coste de renderizado [DISP_WEIGHT].
+ <text name="remaining_capacity">
+ [CAPACITY_STRING] [secondlife:///app/openfloater/object_weights Más información]
</text>
<tab_container name="Object Info Tabs" tab_max_width="62" tab_min_width="30" width="288">
<panel label="General" name="General">
@@ -319,7 +319,6 @@
Tipo de unión
</text>
<combo_box name="sculpt type control">
- <combo_box.item label="(ninguna)" name="None"/>
<combo_box.item label="Esfera" name="Sphere"/>
<combo_box.item label="Toroide" name="Torus"/>
<combo_box.item label="Plano" name="Plane"/>
diff --git a/indra/newview/skins/default/xui/es/floater_toybox.xml b/indra/newview/skins/default/xui/es/floater_toybox.xml
new file mode 100644
index 0000000000..7275b0546b
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/floater_toybox.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Toybox" title="BOTONES DE LA BARRA DE HERRAMIENTAS">
+ <text name="toybox label 1">
+ Puedes agregar o quitar botones arrastrándolos a las barras de herramientas o desde ellas.
+ </text>
+ <text name="toybox label 2">
+ Los botones aparecerán como se muestra o solo como iconos, según la configuración de cada barra de herramientas.
+ </text>
+ <button label="Quitar todas las barras de herramientas" label_selected="Quitar todas las barras de herramientas" name="btn_clear_all"/>
+ <button label="Restaurar valores predeterminados" label_selected="Restaurar valores predeterminados" name="btn_restore_defaults"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_translation_settings.xml b/indra/newview/skins/default/xui/es/floater_translation_settings.xml
new file mode 100644
index 0000000000..765c9a05a2
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/floater_translation_settings.xml
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_translation_settings" title="CONFIGURACIÓN DE LA TRADUCCIÓN DEL CHAT">
+ <string name="bing_api_key_not_verified">
+ appID de Bing no se ha confirmado. Vuelve a intentarlo.
+ </string>
+ <string name="google_api_key_not_verified">
+ La clave de API de Google no se ha confirmado. Vuelve a intentarlo.
+ </string>
+ <string name="bing_api_key_verified">
+ appID de Bing se ha confirmado.
+ </string>
+ <string name="google_api_key_verified">
+ La clave de API de Google se ha confirmado.
+ </string>
+ <check_box label="Activar la traducción automática durante el chat" name="translate_chat_checkbox"/>
+ <text name="translate_language_label">
+ Traducir el chat al:
+ </text>
+ <combo_box name="translate_language_combo">
+ <combo_box.item label="Predeterminado del sistema" name="System Default Language"/>
+ <combo_box.item label="Inglés" name="English"/>
+ <combo_box.item label="Dansk (danés)" name="Danish"/>
+ <combo_box.item label="Deutsch (alemán)" name="German"/>
+ <combo_box.item label="Español (español)" name="Spanish"/>
+ <combo_box.item label="Français (francés)" name="French"/>
+ <combo_box.item label="Italiano (italiano)" name="Italian"/>
+ <combo_box.item label="Magyar (húngaro)" name="Hungarian"/>
+ <combo_box.item label="Nederlands (neerlandés)" name="Dutch"/>
+ <combo_box.item label="Polski (polaco)" name="Polish"/>
+ <combo_box.item label="Português (portugués)" name="Portugese"/>
+ <combo_box.item label="РуÑÑкий (ruso)" name="Russian"/>
+ <combo_box.item label="Türkçe (turco)" name="Turkish"/>
+ <combo_box.item label="УкраїнÑька (ucraniano)" name="Ukrainian"/>
+ <combo_box.item label="中文 (正體) (Chino)" name="Chinese"/>
+ <combo_box.item label="日本語 (japonés)" name="Japanese"/>
+ <combo_box.item label="한국어 (coreano)" name="Korean"/>
+ </combo_box>
+ <text name="tip">
+ Elige el servicio de traducción:
+ </text>
+ <radio_group name="translation_service_rg">
+ <radio_item initial_value="bing" label="Bing Translator" name="bing"/>
+ <radio_item initial_value="google" label="Traductor de Google" name="google"/>
+ </radio_group>
+ <text name="bing_api_key_label">
+ [http://www.bing.com/developers/createapp.aspx AppID] de Bing:
+ </text>
+ <button label="Verificar" name="verify_bing_api_key_btn"/>
+ <text name="google_api_key_label">
+ [http://code.google.com/apis/language/translate/v2/getting_started.html#auth Clave de API] de Google:
+ </text>
+ <button label="Verificar" name="verify_google_api_key_btn"/>
+ <text name="google_links_text">
+ [http://code.google.com/apis/language/translate/v2/pricing.html Precios] | [https://code.google.com/apis/console Estadísticas]
+ </text>
+ <button label="OK" name="ok_btn"/>
+ <button label="Cancelar" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_voice_controls.xml b/indra/newview/skins/default/xui/es/floater_voice_controls.xml
index f02855123c..eff21239be 100644
--- a/indra/newview/skins/default/xui/es/floater_voice_controls.xml
+++ b/indra/newview/skins/default/xui/es/floater_voice_controls.xml
@@ -1,16 +1,16 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_voice_controls" title="Controles de Voz">
+<floater name="floater_voice_controls" title="CONTROLES DE LA VOZ">
<string name="title_nearby">
- CHAT DE VOZ
+ CONFIGURACIÓN DE VOZ
</string>
<string name="title_group">
- Multiconferencia de voz con [GROUP]
+ MULTICONFERENCIA DE VOZ CON [GROUP]
</string>
<string name="title_adhoc">
- Multiconferencia de voz
+ MULTICONFERENCIA DE VOZ
</string>
<string name="title_peer_2_peer">
- Llamada: [NAME]
+ LLAMADA A [NAME]
</string>
<string name="no_one_near">
Nadie cercano tiene activada la voz
diff --git a/indra/newview/skins/default/xui/es/menu_hide_navbar.xml b/indra/newview/skins/default/xui/es/menu_hide_navbar.xml
index 22a1873234..9945908c4f 100644
--- a/indra/newview/skins/default/xui/es/menu_hide_navbar.xml
+++ b/indra/newview/skins/default/xui/es/menu_hide_navbar.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu name="hide_navbar_menu">
- <menu_item_check label="Mostrar la barra de navegación" name="ShowNavbarNavigationPanel"/>
+ <menu_item_check label="Mostrar la barra de navegación y de favoritos" name="ShowNavbarNavigationPanel"/>
<menu_item_check label="Mostrar la barra de favoritos" name="ShowNavbarFavoritesPanel"/>
<menu_item_check label="Mostrar mini-barra de ubicación" name="ShowMiniLocationPanel"/>
</menu>
diff --git a/indra/newview/skins/default/xui/es/menu_login.xml b/indra/newview/skins/default/xui/es/menu_login.xml
index cabcacaed5..e3abf7ad62 100644
--- a/indra/newview/skins/default/xui/es/menu_login.xml
+++ b/indra/newview/skins/default/xui/es/menu_login.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu_bar name="Login Menu">
<menu label="Yo" name="File">
- <menu_item_call label="Preferencias" name="Preferences..."/>
+ <menu_item_call label="Preferencias..." name="Preferences..."/>
<menu_item_call label="Salir de [APP_NAME]" name="Quit"/>
</menu>
<menu label="Ayuda" name="Help">
diff --git a/indra/newview/skins/default/xui/es/menu_toolbars.xml b/indra/newview/skins/default/xui/es/menu_toolbars.xml
new file mode 100644
index 0000000000..63f3dc43bd
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/menu_toolbars.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Toolbars Popup">
+ <menu_item_call label="Quitar este botón" name="Remove button"/>
+ <menu_item_call label="Botones de la barra de herramientas..." name="Choose Buttons"/>
+ <menu_item_check label="Iconos y etiquetas" name="icons_with_text"/>
+ <menu_item_check label="Solo iconos" name="icons_only"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/es/menu_viewer.xml b/indra/newview/skins/default/xui/es/menu_viewer.xml
index bc8a5731ab..4762e3f4a4 100644
--- a/indra/newview/skins/default/xui/es/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/es/menu_viewer.xml
@@ -1,54 +1,60 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu_bar name="Main Menu">
<menu label="Yo" name="Me">
- <menu_item_call label="Preferencias" name="Preferences"/>
- <menu_item_call label="Mi panel de control" name="Manage My Account">
- <menu_item_call.on_click name="ManageMyAccount_url" parameter="WebLaunchJoinNow,http://secondlife.com/account/index.php?lang=es"/>
- </menu_item_call>
- <menu_item_call label="Comprar L$" name="Buy and Sell L$"/>
- <menu_item_call label="Mi perfil" name="Profile"/>
- <menu_item_call label="Mi apariencia" name="ChangeOutfit"/>
- <menu_item_check label="Mi Inventario" name="Inventory"/>
- <menu_item_check label="Mi Inventario" name="ShowSidetrayInventory"/>
- <menu_item_check label="Mis gestos" name="Gestures"/>
- <menu_item_check label="Mi voz" name="ShowVoice"/>
+ <menu_item_call label="Perfil..." name="Profile"/>
+ <menu_item_call label="Apariencia" name="ChangeOutfit"/>
+ <menu_item_call label="Elige un avatar..." name="Avatar Picker"/>
+ <menu_item_check label="Inventario..." name="Inventory"/>
+ <menu_item_call label="Nueva ventana del inventario" name="NewInventoryWindow"/>
+ <menu_item_call label="Lugares..." name="Places"/>
+ <menu_item_call label="Destacados..." name="Picks"/>
+ <menu_item_call label="Controles de la cámara..." name="Camera Controls"/>
<menu label="Movimiento" name="Movement">
<menu_item_call label="Sentarte" name="Sit Down Here"/>
<menu_item_check label="Volar" name="Fly"/>
<menu_item_check label="Correr siempre" name="Always Run"/>
<menu_item_call label="Parar mis animaciones" name="Stop Animating My Avatar"/>
</menu>
- <menu label="Mi estado" name="Status">
+ <menu label="Estado" name="Status">
<menu_item_call label="Ausente" name="Set Away"/>
<menu_item_call label="Ocupado" name="Set Busy"/>
</menu>
<menu_item_call label="Solicitar estatus de Administrador" name="Request Admin Options"/>
<menu_item_call label="Dejar el estatus de Administrador" name="Leave Admin Options"/>
+ <menu_item_call label="Comprar L$" name="Buy and Sell L$"/>
+ <menu_item_call label="Panel de control de la cuenta..." name="Manage My Account">
+ <menu_item_call.on_click name="ManageMyAccount_url" parameter="WebLaunchJoinNow,http://secondlife.com/account/index.php?lang=es"/>
+ </menu_item_call>
+ <menu_item_call label="Preferencias..." name="Preferences"/>
+ <menu_item_call label="Botones de la barra de herramientas..." name="Toolbars"/>
+ <menu_item_call label="Ocultar todos los controles" name="Hide UI"/>
<menu_item_call label="Salir de [APP_NAME]" name="Quit"/>
</menu>
<menu label="Comunicarme" name="Communicate">
- <menu_item_call label="Mis amigos" name="My Friends"/>
- <menu_item_call label="Mis grupos" name="My Groups"/>
- <menu_item_check label="Chat" name="Nearby Chat"/>
+ <menu_item_check label="Chat..." name="Nearby Chat"/>
+ <menu_item_check label="Hablar" name="Speak"/>
+ <menu_item_check label="Configuración de voz..." name="Nearby Voice"/>
+ <menu_item_check label="Transformación de voz..." name="ShowVoice"/>
+ <menu_item_check label="Gestos..." name="Gestures"/>
+ <menu_item_call label="Amigos" name="My Friends"/>
+ <menu_item_call label="Grupos" name="My Groups"/>
<menu_item_call label="Gente cerca" name="Active Speakers"/>
- <menu_item_check label="Chat de voz" name="Nearby Voice"/>
</menu>
<menu label="Mundo" name="World">
- <menu_item_check label="Minimapa" name="Mini-Map"/>
+ <menu_item_call label="Crear un hito de este sitio" name="Create Landmark Here"/>
+ <menu_item_call label="Destinos..." name="Destinations"/>
<menu_item_check label="Mapa del mundo" name="World Map"/>
+ <menu_item_check label="Minimapa" name="Mini-Map"/>
<menu_item_check label="Buscar" name="Search"/>
+ <menu_item_call label="Teleportar a la Base" name="Teleport Home"/>
+ <menu_item_call label="Fijar mi Base aquí" name="Set Home to Here"/>
<menu_item_call label="Foto" name="Take Snapshot"/>
- <menu_item_call label="Crear un hito de este sitio" name="Create Landmark Here"/>
- <menu label="Perfil del lugar" name="Land">
- <menu_item_call label="Perfil del lugar" name="Place Profile"/>
- <menu_item_call label="Acerca del terreno" name="About Land"/>
- <menu_item_call label="Región/Estado" name="Region/Estate"/>
- </menu>
+ <menu_item_call label="Perfil del lugar" name="Place Profile"/>
+ <menu_item_call label="Acerca del terreno" name="About Land"/>
+ <menu_item_call label="Región/Estado" name="Region/Estate"/>
+ <menu_item_call label="Mis terrenos..." name="My Land"/>
<menu_item_call label="Comprar este terreno" name="Buy Land"/>
- <menu_item_call label="Mi terreno" name="My Land"/>
<menu label="Mostrar" name="LandShow">
- <menu_item_check label="Controles del movimiento" name="Movement Controls"/>
- <menu_item_check label="Controles de la cámara" name="Camera Controls"/>
<menu_item_check label="Líneas de prohibición" name="Ban Lines"/>
<menu_item_check label="Balizas" name="beacons"/>
<menu_item_check label="Límites de las parcelas" name="Property Lines"/>
@@ -57,16 +63,15 @@
<menu_item_check label="Propiedades de la parcela" name="Parcel Properties"/>
<menu_item_check label="Menú Avanzado" name="Show Advanced Menu"/>
</menu>
- <menu_item_call label="Teleportar a la Base" name="Teleport Home"/>
- <menu_item_call label="Fijar mi Base aquí" name="Set Home to Here"/>
<menu label="Sol" name="Environment Settings">
<menu_item_call label="Amanecer" name="Sunrise"/>
<menu_item_call label="Mediodía" name="Noon"/>
<menu_item_call label="Atardecer" name="Sunset"/>
<menu_item_call label="Medianoche" name="Midnight"/>
+ <menu_item_call label="Usar configuración de región" name="Use Region Settings"/>
</menu>
- <menu label="Editor de entorno" name="Enviroment Editor">
- <menu_item_call label="Configuración de entorno..." name="Enviroment Settings"/>
+ <menu label="Editor de entorno" name="Environment Editor">
+ <menu_item_call label="Configuración del entorno..." name="Environment Settings"/>
<menu label="Agua predefinida" name="Water Presets">
<menu_item_call label="Nuevo predefinido..." name="new_water_preset"/>
<menu_item_call label="Editar predefinido..." name="edit_water_preset"/>
@@ -139,13 +144,14 @@
<menu_item_call label="Animación ([COST] L$)..." name="Upload Animation"/>
<menu_item_call label="Modelo..." name="Upload Model"/>
<menu_item_call label="Masivo ([COST] L$ por archivo)..." name="Bulk Upload"/>
+ <menu_item_call label="Configurar los permisos por defecto de subida" name="perm prefs"/>
</menu>
<menu_item_call label="Deshacer" name="Undo"/>
<menu_item_call label="Rehacer" name="Redo"/>
</menu>
<menu label="Ayuda" name="Help">
+ <menu_item_call label="Cómo..." name="How To"/>
<menu_item_call label="Ayuda de [SECOND_LIFE]" name="Second Life Help"/>
- <menu_item_check label="Permitir consejos" name="Enable Hints"/>
<menu_item_call label="Denunciar una infracción" name="Report Abuse"/>
<menu_item_call label="Informar de un fallo" name="Report Bug"/>
<menu_item_call label="Acerca de [APP_NAME]" name="About Second Life"/>
@@ -161,7 +167,7 @@
<menu label="Herramientas de rendimiento" name="Performance Tools">
<menu_item_call label="Medidor de lag" name="Lag Meter"/>
<menu_item_check label="Estadísticas" name="Statistics Bar"/>
- <menu_item_check label="Mostrar cuánto cuesta renderizar el avatar" name="Avatar Rendering Cost"/>
+ <menu_item_check label="Mostrar el peso del dibujo de los avatares" name="Avatar Rendering Cost"/>
</menu>
<menu label="Realzado y Visibilidad" name="Highlighting and Visibility">
<menu_item_check label="Baliza con destellos" name="Cheesy Beacon"/>
@@ -198,11 +204,10 @@
<menu_item_check label="Usar Plugin Read Thread" name="Use Plugin Read Thread"/>
<menu_item_call label="Vaciar la caché de grupo" name="ClearGroupCache"/>
<menu_item_check label="Vista subjetiva suavizada" name="Mouse Smoothing"/>
+ <menu_item_call label="Recuperar las teclas" name="Release Keys"/>
<menu label="Atajos de teclado" name="Shortcuts">
<menu_item_call label="Imagen ([COST] L$)..." name="Upload Image"/>
<menu_item_check label="Buscar" name="Search"/>
- <menu_item_call label="Recuperar las teclas" name="Release Keys"/>
- <menu_item_call label="Interfaz en el tamaño predeterminado" name="Set UI Size to Default"/>
<menu_item_check label="Mostrar el menú Avanzado - acceso directo antiguo" name="Show Advanced Menu - legacy shortcut"/>
<menu_item_call label="Cerrar la ventana" name="Close Window"/>
<menu_item_call label="Cerrar todas las ventanas" name="Close All Windows"/>
@@ -271,6 +276,8 @@
<menu_item_check label="Actualizar el tipo" name="Update Type"/>
<menu_item_check label="Información sobre el nivel de detalle" name="LOD Info"/>
<menu_item_check label="Crear cola" name="Build Queue"/>
+ <menu_item_check label="Vectores de viento" name="Wind Vectors"/>
+ <menu_item_check label="Complejidad del renderizado" name="rendercomplexity"/>
<menu_item_check label="Esculpir" name="Sculpt"/>
</menu>
<menu label="Rendering" name="Rendering">
@@ -279,7 +286,6 @@
<menu_item_check label="Luces y sombras" name="Lighting and Shadows"/>
<menu_item_check label="Sombras del sol/la luna/proyectores" name="Shadows from Sun/Moon/Projectors"/>
<menu_item_check label="SSAO y sombras suavizadas" name="SSAO and Shadow Smoothing"/>
- <menu_item_check label="Iluminación global (experimental)" name="Global Illumination"/>
<menu_item_check label="Capas alfa automáticas (deferidas)" name="Automatic Alpha Masks (deferred)"/>
<menu_item_check label="Capas alfa automáticas (no deferidas)" name="Automatic Alpha Masks (non-deferred)"/>
<menu_item_check label="Animation Textures" name="Animation Textures"/>
diff --git a/indra/newview/skins/default/xui/es/notifications.xml b/indra/newview/skins/default/xui/es/notifications.xml
index 4fb29b9427..e0a20683c5 100644
--- a/indra/newview/skins/default/xui/es/notifications.xml
+++ b/indra/newview/skins/default/xui/es/notifications.xml
@@ -981,7 +981,7 @@ no tienes el permiso de comprar terreno para el grupo que tienes activado actual
</form>
</notification>
<notification name="RemoveFromFriends">
- ¿Quieres eliminar a [NAME] de tu lista de amigos?
+ ¿Quieres eliminar a &lt;nolink&gt;[NAME]&lt;/nolink&gt; de tu lista de amigos?
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
</notification>
<notification name="RemoveMultipleFromFriends">
@@ -1114,8 +1114,13 @@ El precio de compra del terreno no se le devolverá al propietario. Si se vende
<notification name="DisplaySetToSafe">
Las configuraciones que se muestran se han fijado en los niveles guardados, pues especificaste la opción de guardarlos.
</notification>
- <notification name="DisplaySetToRecommended">
- Las configuraciones que se muestran se han fijado en los niveles recomendados para la configuración de tu sistema.
+ <notification name="DisplaySetToRecommendedGPUChange">
+ La configuración de pantalla se ha establecido en los niveles recomendados porque tu tarjeta de gráficos ha cambiado
+de &apos;[LAST_GPU]&apos;
+a &apos;[THIS_GPU]&apos;
+ </notification>
+ <notification name="DisplaySetToRecommendedFeatureChange">
+ La configuración de pantalla se ha establecido en los niveles recomendados a causa de un cambio en el subsistema de renderizado.
</notification>
<notification name="ErrorMessage">
[ERROR_MESSAGE]
@@ -1437,7 +1442,7 @@ Debemos reiniciar [APP_NAME] para instalar la actualización.
<usetemplate ignoretext="Confirmar antes de devolver objetos a sus propietarios." name="okcancelignore" notext="Cancelar" yestext="OK"/>
</notification>
<notification name="GroupLeaveConfirmMember">
- Actualmente, eres miembro del grupo [GROUP].
+ Actualmente, eres miembro del grupo &lt;nolink&gt;[GROUP]&lt;/nolink&gt;.
¿Dejar el grupo?
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
</notification>
@@ -1919,6 +1924,18 @@ Dado que estos objetos tienen scripts, moverlos a tu inventario puede provocar u
¿Estás seguro de que quieres salir?
<usetemplate ignoretext="Confirmar antes de salir" name="okcancelignore" notext="No salir" yestext="Salir"/>
</notification>
+ <notification name="ConfirmRestoreToybox">
+ Esta acción restaurará los botones y barras de herramientas predeterminados.
+
+Esta acción no se puede deshacer.
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmClearAllToybox">
+ Esta acción volverá a colocar todos los botones a la caja de herramientas y las barras de herramientas aparecerán vacías.
+
+Esta acción no se puede deshacer.
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
<notification name="DeleteItems">
[QUESTION]
<usetemplate ignoretext="Confirmar antes de eliminar elementos" name="okcancelignore" notext="Cancelar" yestext="OK"/>
@@ -2122,10 +2139,10 @@ Al hacerlo se iniciará el navegador web.
Asunto: [SUBJECT], Mensaje: [MESSAGE]
</notification>
<notification name="FriendOnline">
- [NAME] está conectado
+ &lt;nolink&gt;[NAME]&lt;/nolink&gt; está conectado
</notification>
<notification name="FriendOffline">
- [NAME] está desconectado
+ &lt;nolink&gt;[NAME]&lt;/nolink&gt; está desconectado
</notification>
<notification name="AddSelfFriend">
Aunque eres muy agradable, no puedes añadirte como amigo a ti mismo.
@@ -2238,14 +2255,16 @@ Por favor, selecciona un sólo objeto.
Se ha rehusado tu tarjeta de visita.
</notification>
<notification name="TeleportToLandmark">
- Puedes teleportarte a lugares como &apos;[NAME]&apos; abriendo el panel Lugares -a la derecha de tu pantalla- y seleccionando la sección Hitos.
-Pulsa en un hito para seleccionarlo, y, luego, pulsa &apos;Teleportar&apos; en la parte inferior del panel.
-(También puedes pulsar dos veces en el hito o pulsarlo con el botón derecho del ratón y elegir &apos;Teleportar&apos;.)
+ Para teleportarte a lugares como &apos;[NAME]&apos;, pulsa el botón &quot;Lugares&quot;,
+ y selecciona la pestaña Hitos en la ventana que se abre. Pulsa en un
+ hito para seleccionarlo y luego pulsa &apos;Teleportar&apos; en la parte inferior de la ventana.
+ (También puedes pulsar dos veces en el hito o pulsarlo con el botón derecho del ratón y
+ elegir &apos;Teleportar&apos;.)
</notification>
<notification name="TeleportToPerson">
- Puedes contactar con un Residente como &apos;[NAME]&apos; abriendo el panel Gente en el lado derecho de tu pantalla.
-Elige al Residente de la lista y pulsa &apos;MI&apos; en la parte inferior del panel.
-(También puedes pulsar dos veces en su nombre o pulsarlo con el botón derecho y elegir &apos;MI&apos;).
+ Para ponerte en contacto con Residentes como &apos;[NAME]&apos;, pulsa el botón &quot;Gente&quot;, selecciona un Residente en la ventana que se abre y después pulsa en &apos;MI&apos; en
+ la parte inferior de la ventana.
+ (También puedes pulsar dos veces en su nombre o pulsarlo con el botón derecho y elegir &apos;MI&apos;).
</notification>
<notification name="CantSelectLandFromMultipleRegions">
No puedes seleccionar un terreno que cruce las fronteras entre servidores.
@@ -2266,6 +2285,9 @@ Inténtalo seleccionando un trozo más pequeño de terreno.
<notification name="PaymentSent">
[MESSAGE]
</notification>
+ <notification name="PaymentFailure">
+ [MESSAGE]
+ </notification>
<notification name="EventNotification">
Notificación de un evento:
@@ -2520,10 +2542,10 @@ Por favor, vuelve a intentarlo en unos momentos.
</form>
</notification>
<notification name="FriendshipAccepted">
- [NAME] ha aceptado tu oferta de amistad.
+ &lt;nolink&gt;[NAME]&lt;/nolink&gt; ha aceptado tu ofrecimiento de amistad.
</notification>
<notification name="FriendshipDeclined">
- [NAME] ha rehusado tu oferta de amistad.
+ &lt;nolink&gt;[NAME]&lt;/nolink&gt; ha rechazado tu ofrecimiento de amistad.
</notification>
<notification name="FriendshipAcceptedByMe">
Aceptado el ofrecimiento de amistad.
@@ -2999,10 +3021,6 @@ Al ocultar el botón Hablar se desactiva la función de voz.
<button name="cancel" text="Cancelar"/>
</form>
</notification>
- <notification label="" name="ModeChange">
- Para cambiar de modo tienes que salir y reiniciar.
- <usetemplate name="okcancelbuttons" notext="No salir" yestext="Salir"/>
- </notification>
<notification label="" name="NoClassifieds">
La creación y edición de clasificados sólo está disponible en el modo Avanzado. ¿Quieres salir y cambiar de modo? El selector de modo se encuentra en la pantalla de inicio de sesión.
<usetemplate name="okcancelbuttons" notext="No salir" yestext="Salir"/>
@@ -3047,6 +3065,10 @@ Al ocultar el botón Hablar se desactiva la función de voz.
Las búsquedas solo están disponibles en el modo Avanzado. ¿Quieres cerrar sesión y cambiar de modo?
<usetemplate name="okcancelbuttons" notext="No salir" yestext="Salir"/>
</notification>
+ <notification label="" name="ConfirmHideUI">
+ Esta acción ocultará todos los botones y elementos de menú. Para restaurarlos, pulsa otra vez en [SHORTCUT].
+ <usetemplate ignoretext="Confirmar antes de ocultar la IU" name="okcancelignore" notext="Cancelar" yestext="OK"/>
+ </notification>
<global name="UnsupportedGLRequirements">
Parece que no tienes el hardware apropiado para [APP_NAME]. [APP_NAME] requiere una tarjeta gráfica OpenGL que admita texturas múltiples (&apos;multitexture support&apos;). Si la tienes, comprueba que tienes los últimos &apos;drivers&apos; para tu tarjeta gráfica, así como los últimos parches y &apos;service packs&apos; para tu sistema operativo.
diff --git a/indra/newview/skins/default/xui/es/panel_chiclet_bar.xml b/indra/newview/skins/default/xui/es/panel_chiclet_bar.xml
new file mode 100644
index 0000000000..eaaa5dbe78
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_chiclet_bar.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="chiclet_bar">
+ <layout_stack name="toolbar_stack">
+ <layout_panel name="im_well_panel">
+ <chiclet_im_well name="im_well">
+ <button name="Unread IM messages" tool_tip="Conversaciones"/>
+ </chiclet_im_well>
+ </layout_panel>
+ <layout_panel name="notification_well_panel">
+ <chiclet_notification name="notification_well">
+ <button name="Unread" tool_tip="Notificaciones"/>
+ </chiclet_notification>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_edit_skin.xml b/indra/newview/skins/default/xui/es/panel_edit_skin.xml
index 501ecfb4de..8d895a6152 100644
--- a/indra/newview/skins/default/xui/es/panel_edit_skin.xml
+++ b/indra/newview/skins/default/xui/es/panel_edit_skin.xml
@@ -1,9 +1,9 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_skin_panel">
<panel name="avatar_skin_color_panel">
- <texture_picker label="Tatuajes de la cabeza" name="Head Tattoos" tool_tip="Pulsa para elegir una imagen"/>
- <texture_picker label="Tatuajes superiores" name="Upper Tattoos" tool_tip="Pulsa para elegir una imagen"/>
- <texture_picker label="Tatuajes inferiores" name="Lower Tattoos" tool_tip="Pulsa para elegir una imagen"/>
+ <texture_picker label="Cabeza" name="Head" tool_tip="Pulsa para elegir una imagen"/>
+ <texture_picker label="Parte superior del cuerpo" name="Upper Body" tool_tip="Pulsa para elegir una imagen"/>
+ <texture_picker label="Parte inferior del cuerpo" name="Lower Body" tool_tip="Pulsa para elegir una imagen"/>
</panel>
<panel name="accordion_panel">
<accordion name="wearable_accordion">
diff --git a/indra/newview/skins/default/xui/es/panel_me.xml b/indra/newview/skins/default/xui/es/panel_me.xml
index ed253904aa..850cd6ec71 100644
--- a/indra/newview/skins/default/xui/es/panel_me.xml
+++ b/indra/newview/skins/default/xui/es/panel_me.xml
@@ -1,7 +1,4 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Mi perfil" name="panel_me">
- <tab_container name="tabs">
- <panel label="MI PERFIL" name="panel_profile"/>
- <panel label="MIS DESTACADOS" name="panel_picks"/>
- </tab_container>
+ <panel label="MIS DESTACADOS" name="panel_picks"/>
</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_my_profile.xml b/indra/newview/skins/default/xui/es/panel_my_profile.xml
deleted file mode 100644
index 29e5e6f652..0000000000
--- a/indra/newview/skins/default/xui/es/panel_my_profile.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Perfil" name="panel_profile">
- <string name="no_partner_text" value="Ninguno/a"/>
- <string name="no_group_text" value="Ninguno"/>
- <string name="RegisterDateFormat">
- [REG_DATE] ([AGE])
- </string>
- <string name="name_text_args">
- [NAME]
- </string>
- <string name="display_name_text_args">
- [DISPLAY_NAME]
- </string>
- <layout_stack name="layout">
- <layout_panel name="profile_stack">
- <scroll_container name="profile_scroll">
- <panel name="scroll_content_panel">
- <panel name="second_life_image_panel">
- <text name="display_name_descr_text">
- Nombre de usuario
- </text>
- <text name="name_descr_text">
- Nombre mostrado
- </text>
- <button label="Perfil" name="see_profile_btn" tool_tip="Ver el perfil de este avatar"/>
- </panel>
- </panel>
- </scroll_container>
- </layout_panel>
- </layout_stack>
-</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_navigation_bar.xml b/indra/newview/skins/default/xui/es/panel_navigation_bar.xml
index 293c9ef1d9..d36c6283bc 100644
--- a/indra/newview/skins/default/xui/es/panel_navigation_bar.xml
+++ b/indra/newview/skins/default/xui/es/panel_navigation_bar.xml
@@ -1,18 +1,23 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="navigation_bar">
- <panel name="navigation_panel">
- <pull_button name="back_btn" tool_tip="Volver a la localización anterior"/>
- <pull_button name="forward_btn" tool_tip="Ir una localización adelante"/>
- <button name="home_btn" tool_tip="Teleportar a mi Base"/>
- <location_input label="Localización" name="location_combo"/>
- <search_combo_box label="Buscar" name="search_combo_box" tool_tip="Buscar">
- <combo_editor label="Buscar en [SECOND_LIFE]" name="search_combo_editor"/>
- </search_combo_box>
- </panel>
- <favorites_bar name="favorite" tool_tip="¡Accede rápidamente a tus lugares favoritos de Second Life arrastrando hitos hasta aquí!">
- <label name="favorites_bar_label" tool_tip="¡Accede rápidamente a tus lugares favoritos de Second Life arrastrando hitos hasta aquí!">
- Barra de Favoritos
- </label>
- <chevron_button name="&gt;&gt;" tool_tip="Ver más de Mis favoritos"/>
- </favorites_bar>
+ <layout_stack name="nvp_stack">
+ <layout_panel name="navigation_layout_panel">
+ <panel name="navigation_panel">
+ <pull_button name="back_btn" tool_tip="Volver a la localización anterior"/>
+ <pull_button name="forward_btn" tool_tip="Ir una localización adelante"/>
+ <button name="home_btn" tool_tip="Teleportar a mi Base"/>
+ <location_input label="Lugar" name="location_combo"/>
+ </panel>
+ </layout_panel>
+ <layout_panel name="favorites_layout_panel">
+ <favorites_bar name="favorite" tool_tip="¡Accede rápidamente a tus lugares favoritos de Second Life arrastrando hitos hasta aquí!">
+ <label name="favorites_bar_label" tool_tip="¡Accede rápidamente a tus lugares favoritos de Second Life arrastrando hitos hasta aquí!">
+ Barra de Favoritos
+ </label>
+ <more_button name="&gt;&gt;" tool_tip="Ver más de Mis favoritos">
+ Más ▼
+ </more_button>
+ </favorites_bar>
+ </layout_panel>
+ </layout_stack>
</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_nearby_chat.xml b/indra/newview/skins/default/xui/es/panel_nearby_chat.xml
new file mode 100644
index 0000000000..4220ab3c9f
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_nearby_chat.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="nearby_chat">
+ <check_box label="Traducir el chat" name="translate_chat_checkbox"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_notes.xml b/indra/newview/skins/default/xui/es/panel_notes.xml
deleted file mode 100644
index 00d4caf468..0000000000
--- a/indra/newview/skins/default/xui/es/panel_notes.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Notas y Privacidad" name="panel_notes">
- <layout_stack name="layout">
- <layout_panel name="notes_stack">
- <scroll_container name="profile_scroll">
- <panel name="profile_scroll_panel">
- <text name="status_message" value="Mis notas privadas:"/>
- <text name="status_message2" value="Permitir que esta persona:"/>
- <check_box label="Vea si estoy conectado" name="status_check"/>
- <check_box label="Me vea en el mapa" name="map_check"/>
- <check_box label="Edite, borre o coja mis objetos" name="objects_check"/>
- </panel>
- </scroll_container>
- </layout_panel>
- <layout_panel name="notes_buttons_panel">
- <layout_stack name="bottom_bar_ls">
- <layout_panel name="add_friend_btn_lp">
- <button label="Añadir como amigo" name="add_friend" tool_tip="Ofrecer amistad a este Residente"/>
- </layout_panel>
- <layout_panel name="im_btn_lp">
- <button label="MI" name="im" tool_tip="Abrir una sesión de mensajes instantáneos"/>
- </layout_panel>
- <layout_panel name="call_btn_lp">
- <button label="Llamar" name="call" tool_tip="Llamar a este Residente"/>
- </layout_panel>
- <layout_panel name="show_on_map_btn_lp">
- <button label="Mapa" name="show_on_map_btn" tool_tip="Mostrar al Residente en el mapa"/>
- </layout_panel>
- <layout_panel name="teleport_btn_lp">
- <button label="Teleporte" name="teleport" tool_tip="Ofrecer teleporte"/>
- </layout_panel>
- </layout_stack>
- </layout_panel>
- </layout_stack>
-</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_people.xml b/indra/newview/skins/default/xui/es/panel_people.xml
index 2fcbb00aed..a9d38dca25 100644
--- a/indra/newview/skins/default/xui/es/panel_people.xml
+++ b/indra/newview/skins/default/xui/es/panel_people.xml
@@ -76,7 +76,7 @@
<button label="Compartir" name="share_btn" tool_tip="Compartir un objeto del inventario"/>
</layout_panel>
<layout_panel name="teleport_btn_lp">
- <button label="Teleportarte" name="teleport_btn" tool_tip="Ofrecer teleporte"/>
+ <button label="Teleporte" name="teleport_btn" tool_tip="Ofrecer teleporte"/>
</layout_panel>
</layout_stack>
<layout_stack name="bottom_bar_ls1">
diff --git a/indra/newview/skins/default/xui/es/panel_pick_info.xml b/indra/newview/skins/default/xui/es/panel_pick_info.xml
index a1259cf483..3450279b4a 100644
--- a/indra/newview/skins/default/xui/es/panel_pick_info.xml
+++ b/indra/newview/skins/default/xui/es/panel_pick_info.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="panel_pick_info">
- <text name="title" value="Información del destacado"/>
+ <text name="title" value="Datos del destacado"/>
<scroll_container name="profile_scroll">
<panel name="scroll_content_panel">
<text_editor name="pick_name" value="[nombre]"/>
diff --git a/indra/newview/skins/default/xui/es/panel_postcard_message.xml b/indra/newview/skins/default/xui/es/panel_postcard_message.xml
new file mode 100644
index 0000000000..7316d91f5c
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_postcard_message.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_postcard_message">
+ <text name="to_label">
+ Hasta:
+ </text>
+ <text name="name_label">
+ Desde:
+ </text>
+ <text name="subject_label">
+ Asunto:
+ </text>
+ <line_editor label="Escribe aquí el asunto." name="subject_form"/>
+ <text name="msg_label">
+ Mensaje:
+ </text>
+ <text_editor name="msg_form">
+ Escribe aquí tu mensaje.
+ </text_editor>
+ <button label="Cancelar" name="cancel_btn"/>
+ <button label="Enviar" name="send_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_postcard_settings.xml b/indra/newview/skins/default/xui/es/panel_postcard_settings.xml
new file mode 100644
index 0000000000..3931319447
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_postcard_settings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_postcard_settings">
+ <combo_box label="Resolución" name="postcard_size_combo">
+ <combo_box.item label="Ventana actual" 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="Personalizado" name="Custom"/>
+ </combo_box>
+ <layout_stack name="postcard_image_params_ls">
+ <layout_panel name="postcard_image_size_lp">
+ <spinner label="Ancho" name="postcard_snapshot_width"/>
+ <spinner label="Altura" name="postcard_snapshot_height"/>
+ <check_box label="Mantener las proporciones" name="postcard_keep_aspect_check"/>
+ </layout_panel>
+ <layout_panel name="postcard_image_format_quality_lp">
+ <slider label="Calidad de la imagen" name="image_quality_slider"/>
+ <text name="image_quality_level">
+ ([QLVL])
+ </text>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_preferences_chat.xml b/indra/newview/skins/default/xui/es/panel_preferences_chat.xml
index d8fd43469d..aea9b9ce4a 100644
--- a/indra/newview/skins/default/xui/es/panel_preferences_chat.xml
+++ b/indra/newview/skins/default/xui/es/panel_preferences_chat.xml
@@ -29,30 +29,5 @@
<check_box label="Chats de MI" name="EnableIMChatPopups" tool_tip="Activa esta casilla para ver una ventana emergente cada vez que recibas un mensaje instantáneo"/>
<spinner label="Duración de los interlocutores favoritos:" name="nearby_toasts_lifetime"/>
<spinner label="Tiempo de los otros interlocutores:" name="nearby_toasts_fadingtime"/>
- <check_box name="translate_chat_checkbox"/>
- <text name="translate_chb_label">
- Usar en el chat el traductor automático de Google
- </text>
- <text name="translate_language_text">
- Traducir el chat al:
- </text>
- <combo_box name="translate_language_combobox">
- <combo_box.item label="Predeterminado del sistema" name="System Default Language"/>
- <combo_box.item label="English (inglés)" name="English"/>
- <combo_box.item label="Dansk (danés)" name="Danish"/>
- <combo_box.item label="Deutsch (alemán)" name="German"/>
- <combo_box.item label="Español" name="Spanish"/>
- <combo_box.item label="Français (francés)" name="French"/>
- <combo_box.item label="Italiano (italiano)" name="Italian"/>
- <combo_box.item label="Magyar (húngaro)" name="Hungarian"/>
- <combo_box.item label="Nederlands (neerlandés)" name="Dutch"/>
- <combo_box.item label="Polski (polaco)" name="Polish"/>
- <combo_box.item label="Português (portugués)" name="Portugese"/>
- <combo_box.item label="РуÑÑкий (ruso)" name="Russian"/>
- <combo_box.item label="Türkçe (turco)" name="Turkish"/>
- <combo_box.item label="УкраїнÑька (ucraniano)" name="Ukrainian"/>
- <combo_box.item label="中文 (简体) (chino)" name="Chinese"/>
- <combo_box.item label="日本語 (japonés)" name="Japanese"/>
- <combo_box.item label="한국어 (coreano)" name="Korean"/>
- </combo_box>
+ <button label="Configuración de la traducción del chat" name="ok_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_preferences_general.xml b/indra/newview/skins/default/xui/es/panel_preferences_general.xml
index e725e4a05a..4fc163f5b6 100644
--- a/indra/newview/skins/default/xui/es/panel_preferences_general.xml
+++ b/indra/newview/skins/default/xui/es/panel_preferences_general.xml
@@ -11,10 +11,12 @@
<combo_box.item label="Español - Beta" name="Spanish"/>
<combo_box.item label="Français (Francés) - Beta" name="French"/>
<combo_box.item label="Italiano - Beta" name="Italian"/>
- <combo_box.item label="Nederlands (Neerlandés) - Beta" name="Dutch"/>
<combo_box.item label="Polski (Polaco) - Beta" name="Polish"/>
<combo_box.item label="Português (portugués) - Beta" name="Portugese"/>
+ <combo_box.item label="РуÑÑкий (Ruso) - Beta" name="Russian"/>
+ <combo_box.item label="Türkçe (Turco) - Beta" name="Turkish"/>
<combo_box.item label="日本語 (Japonés) - Beta" name="(Japanese)"/>
+ <combo_box.item label="正體中文 (Chino tradicional) - Beta" name="Traditional Chinese"/>
</combo_box>
<text name="language_textbox2">
(requiere reiniciar)
@@ -49,7 +51,6 @@
<check_box label="Títulos de grupos" name="show_all_title_checkbox1" tool_tip="Mostrar títulos de grupos, como Jefe o Miembro"/>
<check_box label="Realzar amigos" name="show_friends" tool_tip="Realzar las etiquetas de los nombres de tus amigos"/>
<check_box label="Ver nombres mostrados" name="display_names_check" tool_tip="Comprobar para utilizar nombres mostrados en chat, MI, etiquetas de nombres, etc."/>
- <check_box label="Permitir los consejos de la IU del visor" name="viewer_hints_check"/>
<text name="inworld_typing_rg_label">
Si pulsas las teclas de letras:
</text>
diff --git a/indra/newview/skins/default/xui/es/panel_preferences_move.xml b/indra/newview/skins/default/xui/es/panel_preferences_move.xml
index d95e167361..b2ff6b61c2 100644
--- a/indra/newview/skins/default/xui/es/panel_preferences_move.xml
+++ b/indra/newview/skins/default/xui/es/panel_preferences_move.xml
@@ -7,18 +7,33 @@
</text>
<check_box label="Construir/Editar" name="edit_camera_movement" tool_tip="Usar el posicionamiento automático de la cámara al entrar en o salir del modo de edición"/>
<check_box label="Apariencia" name="appearance_camera_movement" tool_tip="Usar el posicionamiento automático de la cámara mientras se está editando"/>
- <check_box initial_value="verdadero" label="Barra lateral" name="appearance_sidebar_positioning" tool_tip="Usar el posicionamiento automático de la cámara para la barra lateral"/>
+ <text name="keyboard_lbl">
+ Teclado:
+ </text>
+ <check_box label="Las teclas del cursor siempre para moverme" name="arrow_keys_move_avatar_check"/>
+ <check_box label="Correr siempre: atajo de teclado" name="tap_tap_hold_to_run"/>
+ <text name="mouse_lbl">
+ Ratón:
+ </text>
<check_box label="Verme en vista subjetiva" name="first_person_avatar_visible"/>
<text name=" Mouse Sensitivity">
Sensibilidad del ratón en la Vista subjetiva:
</text>
<check_box label="Invertir" name="invert_mouse"/>
- <check_box label="Las teclas del cursor siempre para moverme" name="arrow_keys_move_avatar_check"/>
- <check_box label="Correr siempre: atajo de teclado" name="tap_tap_hold_to_run"/>
- <check_box label="Haz doble clic para:" name="double_click_chkbox"/>
- <radio_group name="double_click_action">
- <radio_item label="Teleportarte" name="radio_teleport"/>
- <radio_item label="Piloto automático" name="radio_autopilot"/>
- </radio_group>
+ <text name="single_click_action_lbl">
+ Un clic en el terreno:
+ </text>
+ <combo_box name="single_click_action_combo">
+ <combo_box.item label="Ninguna acción" name="0"/>
+ <combo_box.item label="Ir al punto seleccionado" name="1"/>
+ </combo_box>
+ <text name="double_click_action_lbl">
+ Doble clic en el terreno:
+ </text>
+ <combo_box name="double_click_action_combo">
+ <combo_box.item label="Ninguna acción" name="0"/>
+ <combo_box.item label="Ir al punto seleccionado" name="1"/>
+ <combo_box.item label="Teleportarte al punto seleccionado" name="2"/>
+ </combo_box>
<button label="Otros dispositivos" name="joystick_setup_button"/>
</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_preferences_setup.xml b/indra/newview/skins/default/xui/es/panel_preferences_setup.xml
index 3de18654b5..81a29dae5a 100644
--- a/indra/newview/skins/default/xui/es/panel_preferences_setup.xml
+++ b/indra/newview/skins/default/xui/es/panel_preferences_setup.xml
@@ -15,7 +15,7 @@
Web:
</text>
<radio_group name="use_external_browser">
- <radio_item label="Usar mi navegador (IE, Firefox, Safari)" name="external" tool_tip="Usa tu navegador por defecto para ayuda, enlaces web, etc. No es aconsejable si estás a pantalla completa." value="1"/>
+ <radio_item label="Usar mi navegador (IE, Firefox, Safari)" name="external" tool_tip="Usa tu navegador por defecto para ayuda, enlaces web, etc. No es aconsejable si estás a pantalla completa." value="true"/>
<radio_item label="Usar el navegador incorporado" name="internal" tool_tip="Usa el navegador incorporado para ayuda, enlaces web, etc. Este navegador se abre en una nueva ventana dentro de [APP_NAME]." value=""/>
</radio_group>
<check_box initial_value="true" label="Activar plugins" name="browser_plugins_enabled"/>
diff --git a/indra/newview/skins/default/xui/es/panel_profile.xml b/indra/newview/skins/default/xui/es/panel_profile.xml
deleted file mode 100644
index 334c0541af..0000000000
--- a/indra/newview/skins/default/xui/es/panel_profile.xml
+++ /dev/null
@@ -1,70 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Perfil" name="panel_profile">
- <string name="CaptionTextAcctInfo">
- [ACCTTYPE]
-[PAYMENTINFO] [AGEVERIFICATION]
- </string>
- <string name="payment_update_link_url">
- http://www.secondlife.com/account/billing.php?lang=es-ES
- </string>
- <string name="partner_edit_link_url">
- http://www.secondlife.com/account/partners.php?lang=es
- </string>
- <string name="my_account_link_url" value="http://secondlife.com/my/account/index.php?lang=es-ES"/>
- <string name="no_partner_text" value="Ninguno"/>
- <string name="no_group_text" value="Ninguno"/>
- <string name="RegisterDateFormat">
- [REG_DATE] ([AGE])
- </string>
- <string name="name_text_args">
- [NAME]
- </string>
- <string name="display_name_text_args">
- [DISPLAY_NAME]
- </string>
- <layout_stack name="layout">
- <layout_panel name="profile_stack">
- <scroll_container name="profile_scroll">
- <panel name="profile_scroll_panel">
- <panel name="second_life_image_panel">
- <text name="title_sl_descr_text" value="[SECOND_LIFE]:"/>
- </panel>
- <panel name="first_life_image_panel">
- <text name="title_rw_descr_text" value="Mundo real:"/>
- </panel>
- <text name="title_member_text" value="Residente desde:"/>
- <text name="title_acc_status_text" value="Estado de la cuenta:"/>
- <text name="title_partner_text" value="Compañero/a:"/>
- <panel name="partner_data_panel">
- <text initial_value="(obteniendo)" name="partner_text"/>
- </panel>
- <text name="title_groups_text" value="Grupos:"/>
- </panel>
- </scroll_container>
- </layout_panel>
- </layout_stack>
- <layout_stack name="layout_verb_buttons">
- <layout_panel name="profile_buttons_panel">
- <layout_stack name="bottom_bar_ls">
- <layout_panel name="add_friend_btn_lp">
- <button label="Añadir como amigo" name="add_friend" tool_tip="Ofrecer amistad a este Residente"/>
- </layout_panel>
- <layout_panel name="im_btn_lp">
- <button label="MI" name="im" tool_tip="Abrir una sesión de mensajes instantáneos"/>
- </layout_panel>
- <layout_panel name="call_btn_lp">
- <button label="Llamar" name="call" tool_tip="Llamar a este Residente"/>
- </layout_panel>
- <layout_panel name="chat_btn_lp">
- <button label="Teleporte" name="teleport" tool_tip="Ofrecer teleporte"/>
- </layout_panel>
- <layout_panel name="overflow_btn_lp">
- <menu_button label="▼" name="overflow_btn" tool_tip="Pagar dinero al Residente o compartir algo del inventario con él"/>
- </layout_panel>
- </layout_stack>
- </layout_panel>
- <layout_panel name="profile_me_buttons_panel">
- <button label="Editar el perfil" name="edit_profile_btn" tool_tip="Modificar tu información personal"/>
- </layout_panel>
- </layout_stack>
-</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_profile_view.xml b/indra/newview/skins/default/xui/es/panel_profile_view.xml
deleted file mode 100644
index cb374dee52..0000000000
--- a/indra/newview/skins/default/xui/es/panel_profile_view.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="panel_target_profile">
- <string name="status_online">
- Conectado/a
- </string>
- <string name="status_offline">
- Desconectado/a
- </string>
- <text name="display_name_label" value="Nombre mostrado:"/>
- <text name="solo_username_label" value="Nombre de usuario:"/>
- <text name="status" value="Conectado/a"/>
- <text name="user_name_small" value="Jack, ¿has visto esto? Es un nombre larguísimo."/>
- <button name="copy_to_clipboard" tool_tip="Copiar al portapapeles"/>
- <text name="user_label" value="Nombre de usuario:"/>
- <tab_container name="tabs">
- <panel label="PERFIL" name="panel_profile"/>
- <panel label="DESTACADOS" name="panel_picks"/>
- <panel label="NOTAS Y PRIVACIDAD" name="panel_notes"/>
- </tab_container>
-</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_region_estate.xml b/indra/newview/skins/default/xui/es/panel_region_estate.xml
index c51c3815d1..3d0de4f083 100644
--- a/indra/newview/skins/default/xui/es/panel_region_estate.xml
+++ b/indra/newview/skins/default/xui/es/panel_region_estate.xml
@@ -10,7 +10,7 @@
(desconocido)
</text>
<text name="owner_text">
- Propietario del Estado:
+ Propietario del estado:
</text>
<text name="estate_owner">
(desconocido)
@@ -39,7 +39,7 @@
</string>
<button label="?" name="abuse_email_address_help"/>
<button label="Aplicar" name="apply_btn"/>
- <button label="Expulsar a un Residente del Estado..." name="kick_user_from_estate_btn"/>
+ <button label="Expulsar a un Residente del estado..." name="kick_user_from_estate_btn"/>
<button label="Enviar un mensaje al estado..." name="message_estate_btn"/>
<text name="estate_manager_label">
Administradores del estado:
diff --git a/indra/newview/skins/default/xui/es/panel_snapshot_inventory.xml b/indra/newview/skins/default/xui/es/panel_snapshot_inventory.xml
new file mode 100644
index 0000000000..12c74b5cd1
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_snapshot_inventory.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_snapshot_inventory">
+ <text name="title">
+ Guardar en mi inventario
+ </text>
+ <text name="hint_lbl">
+ Guardar una imagen en el inventario cuesta [UPLOAD_COST] L$. Para guardar una imagen como una textura, selecciona uno de los formatos cuadrados.
+ </text>
+ <combo_box label="Resolución" name="texture_size_combo">
+ <combo_box.item label="Ventana actual" name="CurrentWindow"/>
+ <combo_box.item label="Pequeña (128x128)" name="Small(128x128)"/>
+ <combo_box.item label="Mediana (256x256)" name="Medium(256x256)"/>
+ <combo_box.item label="Grande (512x512)" name="Large(512x512)"/>
+ <combo_box.item label="Personalizado" name="Custom"/>
+ </combo_box>
+ <spinner label="Ancho" name="inventory_snapshot_width"/>
+ <spinner label="Altura" name="inventory_snapshot_height"/>
+ <check_box label="Mantener las proporciones" name="inventory_keep_aspect_check"/>
+ <button label="Cancelar" name="cancel_btn"/>
+ <button label="Guardar" name="save_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_snapshot_local.xml b/indra/newview/skins/default/xui/es/panel_snapshot_local.xml
new file mode 100644
index 0000000000..08c45d2e76
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_snapshot_local.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_snapshot_local">
+ <text name="title">
+ Guardar en mi ordenador
+ </text>
+ <combo_box label="Resolución" name="local_size_combo">
+ <combo_box.item label="Ventana actual" name="CurrentWindow"/>
+ <combo_box.item label="320x240" name="320x240"/>
+ <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="1280x1024" name="1280x1024"/>
+ <combo_box.item label="1600x1200" name="1600x1200"/>
+ <combo_box.item label="Personalizado" name="Custom"/>
+ </combo_box>
+ <layout_stack name="local_image_params_ls">
+ <layout_panel name="local_image_size_lp">
+ <spinner label="Ancho" name="local_snapshot_width"/>
+ <spinner label="Altura" name="local_snapshot_height"/>
+ <check_box label="Mantener las proporciones" name="local_keep_aspect_check"/>
+ </layout_panel>
+ <layout_panel name="local_image_format_quality_lp">
+ <combo_box label="Formato" name="local_format_combo">
+ <combo_box.item label="PNG (sin pérdida)" name="PNG"/>
+ <combo_box.item label="JPEG" name="JPEG"/>
+ <combo_box.item label="BMP (sin pérdida)" name="BMP"/>
+ </combo_box>
+ <slider label="Calidad de la imagen" name="image_quality_slider"/>
+ <text name="image_quality_level">
+ ([QLVL])
+ </text>
+ </layout_panel>
+ </layout_stack>
+ <button label="Cancelar" name="cancel_btn"/>
+ <flyout_button label="Guardar" name="save_btn" tool_tip="Guardar la imagen en un archivo">
+ <flyout_button.item label="Guardar" name="save_item"/>
+ <flyout_button.item label="Guardar como..." name="saveas_item"/>
+ </flyout_button>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_snapshot_options.xml b/indra/newview/skins/default/xui/es/panel_snapshot_options.xml
new file mode 100644
index 0000000000..2b2584f66c
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_snapshot_options.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_snapshot_options">
+ <button label="Publicar en los comentarios de Mi perfil" name="save_to_profile_btn"/>
+ <button label="Correo-e" name="save_to_email_btn"/>
+ <button label="Guardar en Mi inventario ([AMOUNT] L$)" name="save_to_inventory_btn"/>
+ <button label="Guardar en mi ordenador" name="save_to_computer_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_snapshot_postcard.xml b/indra/newview/skins/default/xui/es/panel_snapshot_postcard.xml
new file mode 100644
index 0000000000..649d547ba0
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_snapshot_postcard.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_snapshot_postcard">
+ <string name="default_subject">
+ Postal desde [SECOND_LIFE].
+ </string>
+ <string name="default_message">
+ ¡Mira esto!
+ </string>
+ <string name="upload_message">
+ Enviando...
+ </string>
+ <text name="title">
+ Correo-e
+ </text>
+ <button label="Mensaje" name="message_btn"/>
+ <button label="Ajustes" name="settings_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_snapshot_profile.xml b/indra/newview/skins/default/xui/es/panel_snapshot_profile.xml
new file mode 100644
index 0000000000..6a0bc22d68
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_snapshot_profile.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_snapshot_profile">
+ <text name="title">
+ Publicar en los comentarios de Mi perfil
+ </text>
+ <combo_box label="Resolución" name="profile_size_combo">
+ <combo_box.item label="Ventana actual" 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="Personalizado" name="Custom"/>
+ </combo_box>
+ <layout_stack name="profile_image_params_ls">
+ <layout_panel name="profile_image_size_lp">
+ <spinner label="Ancho" name="profile_snapshot_width"/>
+ <spinner label="Altura" name="profile_snapshot_height"/>
+ <check_box label="Mantener las proporciones" name="profile_keep_aspect_check"/>
+ </layout_panel>
+ <layout_panel name="profile_image_metadata_lp">
+ <text name="caption_label">
+ Título:
+ </text>
+ <check_box initial_value="true" label="Incluir ubicación" name="add_location_cb"/>
+ </layout_panel>
+ </layout_stack>
+ <button label="Cancelar" name="cancel_btn"/>
+ <button label="Publicar" name="post_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_status_bar.xml b/indra/newview/skins/default/xui/es/panel_status_bar.xml
index 0391258b75..79b2c32b23 100644
--- a/indra/newview/skins/default/xui/es/panel_status_bar.xml
+++ b/indra/newview/skins/default/xui/es/panel_status_bar.xml
@@ -17,12 +17,9 @@
</panel.string>
<panel name="balance_bg">
<text name="balance" tool_tip="Haz clic para actualizar tu saldo en L$" value="20 L$"/>
- <button label="COMPRAR L$" name="buyL" tool_tip="Pulsa para comprar más L$"/>
+ <button label="Comprar L$" name="buyL" tool_tip="Pulsa para comprar más L$"/>
+ <button label="Comprar" name="goShop" tool_tip="Abrir el mercado de Second Life" width="80"/>
</panel>
- <combo_box name="mode_combo" tool_tip="Selecciona el modo. Elige Básico para una exploración rápida y fácil y para chatear. Elige Avanzado para tener acceso a más funciones.">
- <combo_box.item label="Modo Básico" name="Basic"/>
- <combo_box.item label="Modo Avanzado" name="Advanced"/>
- </combo_box>
<text name="TimeText" tool_tip="Hora actual (Pacífico)">
24:00 AM PST
</text>
diff --git a/indra/newview/skins/default/xui/es/sidepanel_inventory.xml b/indra/newview/skins/default/xui/es/sidepanel_inventory.xml
index aae9bfc113..79d0cb84e8 100644
--- a/indra/newview/skins/default/xui/es/sidepanel_inventory.xml
+++ b/indra/newview/skins/default/xui/es/sidepanel_inventory.xml
@@ -14,7 +14,7 @@
</string>
<button label="Objetos recibidos" name="inbox_btn"/>
<text name="inbox_fresh_new_count">
- [NUM] Nuevos
+ [NUM] nuevos
</text>
<panel tool_tip="Drag and drop items to your inventory to manage and use them">
<text name="inbox_inventory_placeholder">
diff --git a/indra/newview/skins/default/xui/es/strings.xml b/indra/newview/skins/default/xui/es/strings.xml
index cc044ba416..2a6f32f84f 100644
--- a/indra/newview/skins/default/xui/es/strings.xml
+++ b/indra/newview/skins/default/xui/es/strings.xml
@@ -34,6 +34,9 @@
<string name="ProgressChangingResolution">
Cambiando la resolución...
</string>
+ <string name="Fullbright">
+ Brillo al máximo (antiguo)
+ </string>
<string name="LoginInProgress">
Iniciando la sesión. [APP_NAME] debe de aparecer congelado. Por favor, espere.
</string>
@@ -116,7 +119,7 @@
No se pudo verificar la firma del certificado devuelta por el servidor de la cuadrícula. Ponte en contacto con el administrador de la cuadrícula.
</string>
<string name="LoginFailedNoNetwork">
- Error de red: no se ha podido conectar; por favor, revisa tu conexión a Internet.
+ Error de red: no se ha podido conectar; por favor, revisa tu conexión a internet.
</string>
<string name="LoginFailed">
Error en el inicio de sesión.
@@ -583,6 +586,9 @@ Intenta iniciar sesión de nuevo en unos instantes.
<string name="mesh">
red
</string>
+ <string name="AvatarEditingAppearance">
+ (Edición de Apariencia)
+ </string>
<string name="AvatarAway">
Ausente
</string>
@@ -1193,7 +1199,7 @@ Intenta iniciar sesión de nuevo en unos instantes.
No tienes en tu inventario una copia de esta textura
</string>
<string name="InventoryInboxNoItems">
- Aquí se entregarán los objetos comprados en el mercado.
+ Cuando compres un objeto o lo recibas por otra vía, aparecerá aquí, para que puedas arrastrarlo a una carpeta de tu inventario o eliminarlo si no deseas conservarlo.
</string>
<string name="MarketplaceURL">
http://marketplace.[DOMAIN_NAME]
@@ -1255,6 +1261,9 @@ Intenta iniciar sesión de nuevo en unos instantes.
<string name="Marketplace Error Internal Import">
Error: Este objeto tiene un problema. Vuelve a intentarlo más tarde.
</string>
+ <string name="Open landmarks">
+ Abrir hitos
+ </string>
<string name="no_transfer" value="(no transferible)"/>
<string name="no_modify" value="(no modificable)"/>
<string name="no_copy" value="(no copiable)"/>
@@ -1382,6 +1391,9 @@ Intenta iniciar sesión de nuevo en unos instantes.
<string name="no_attachments">
No tienes puestos anexos
</string>
+ <string name="Attachments remain">
+ Anexos (quedan [COUNT] ranuras)
+ </string>
<string name="Buy">
Comprar
</string>
@@ -1508,6 +1520,12 @@ Intenta iniciar sesión de nuevo en unos instantes.
<string name="Right Pec">
Pecho derecho
</string>
+ <string name="Neck">
+ Cuello
+ </string>
+ <string name="Avatar Center">
+ Centro del avatar
+ </string>
<string name="Invalid Attachment">
Punto de colocación no válido
</string>
@@ -3835,6 +3853,9 @@ Si sigues recibiendo este mensaje, contacta con [SUPPORT_SITE].
<string name="inventory_item_offered-im">
Ofrecido el item del inventario
</string>
+ <string name="share_alert">
+ Arrastra los ítems desde el invenbtario hasta aquí
+ </string>
<string name="no_session_message">
(La sesión de MI no existe)
</string>
@@ -3931,6 +3952,18 @@ Si sigues recibiendo este mensaje, contacta con [SUPPORT_SITE].
<string name="you_paid_ldollars_no_name">
Has pagado [AMOUNT] L$ por [REASON].
</string>
+ <string name="you_paid_failure_ldollars">
+ No has pagado a [NAME] [AMOUNT] L$ [REASON].
+ </string>
+ <string name="you_paid_failure_ldollars_no_info">
+ No has pagado [AMOUNT] L$.
+ </string>
+ <string name="you_paid_failure_ldollars_no_reason">
+ No has pagado a [NAME] [AMOUNT] L$.
+ </string>
+ <string name="you_paid_failure_ldollars_no_name">
+ No has pagado [AMOUNT] L$ [REASON].
+ </string>
<string name="for item">
para [ITEM]
</string>
@@ -4158,8 +4191,8 @@ Denuncia de infracción
<string name="Female - Wow">
Mujer - Admiración
</string>
- <string name="/bow1">
- /reverencia1
+ <string name="/bow">
+ /reverencia
</string>
<string name="/clap">
/aplaudir
@@ -4341,6 +4374,12 @@ Inténtalo incluyendo la ruta de acceso al editor entre comillas
<string name="ExternalEditorFailedToRun">
Error al ejecutar el editor externo.
</string>
+ <string name="TranslationFailed">
+ Error al traducir: [REASON]
+ </string>
+ <string name="TranslationResponseParseError">
+ Error al analizar la respuesta de la traducción.
+ </string>
<string name="Esc">
Esc
</string>
@@ -4671,4 +4710,196 @@ Inténtalo incluyendo la ruta de acceso al editor entre comillas
<string name="ParticleHiding">
Ocultando las partículas
</string>
+ <string name="Command_AboutLand_Label">
+ Acerca del terreno
+ </string>
+ <string name="Command_Appearance_Label">
+ Apariencia
+ </string>
+ <string name="Command_Avatar_Label">
+ Avatar
+ </string>
+ <string name="Command_Build_Label">
+ Construir
+ </string>
+ <string name="Command_Chat_Label">
+ Chat
+ </string>
+ <string name="Command_Compass_Label">
+ Brújula
+ </string>
+ <string name="Command_Destinations_Label">
+ Destinos
+ </string>
+ <string name="Command_Gestures_Label">
+ Gestos
+ </string>
+ <string name="Command_HowTo_Label">
+ Cómo
+ </string>
+ <string name="Command_Inventory_Label">
+ Inventario
+ </string>
+ <string name="Command_Map_Label">
+ Mapa
+ </string>
+ <string name="Command_Marketplace_Label">
+ Mercado
+ </string>
+ <string name="Command_MiniMap_Label">
+ Minimapa
+ </string>
+ <string name="Command_Move_Label">
+ Caminar / Correr / Volar
+ </string>
+ <string name="Command_People_Label">
+ Gente
+ </string>
+ <string name="Command_Picks_Label">
+ Destacados
+ </string>
+ <string name="Command_Places_Label">
+ Lugares
+ </string>
+ <string name="Command_Preferences_Label">
+ Preferencias
+ </string>
+ <string name="Command_Profile_Label">
+ Perfil
+ </string>
+ <string name="Command_Search_Label">
+ Buscar
+ </string>
+ <string name="Command_Snapshot_Label">
+ Foto
+ </string>
+ <string name="Command_Speak_Label">
+ Hablar
+ </string>
+ <string name="Command_View_Label">
+ Controles de la cámara
+ </string>
+ <string name="Command_Voice_Label">
+ Configuración de voz
+ </string>
+ <string name="Command_AboutLand_Tooltip">
+ Información sobre el terreno que vas a visitar
+ </string>
+ <string name="Command_Appearance_Tooltip">
+ Cambiar tu avatar
+ </string>
+ <string name="Command_Avatar_Tooltip">
+ Elegir un avatar completo
+ </string>
+ <string name="Command_Build_Tooltip">
+ Construir objetos y modificar la forma del terreno
+ </string>
+ <string name="Command_Chat_Tooltip">
+ Habla por chat de texto con las personas próximas
+ </string>
+ <string name="Command_Compass_Tooltip">
+ Brújula
+ </string>
+ <string name="Command_Destinations_Tooltip">
+ Destinos de interés
+ </string>
+ <string name="Command_Gestures_Tooltip">
+ Gestos para tu avatar
+ </string>
+ <string name="Command_HowTo_Tooltip">
+ Cómo hacer las tareas habituales
+ </string>
+ <string name="Command_Inventory_Tooltip">
+ Ver y usar tus pertenencias
+ </string>
+ <string name="Command_Map_Tooltip">
+ Mapa del mundo
+ </string>
+ <string name="Command_Marketplace_Tooltip">
+ Ir de compras
+ </string>
+ <string name="Command_MiniMap_Tooltip">
+ Mostrar la gente que está cerca
+ </string>
+ <string name="Command_Move_Tooltip">
+ Desplazando el avatar
+ </string>
+ <string name="Command_People_Tooltip">
+ Amigos, grupos y personas próximas
+ </string>
+ <string name="Command_Picks_Tooltip">
+ Lugares que se mostrarán como favoritos en tu perfil
+ </string>
+ <string name="Command_Places_Tooltip">
+ Lugares que has guardado
+ </string>
+ <string name="Command_Preferences_Tooltip">
+ Preferencias
+ </string>
+ <string name="Command_Profile_Tooltip">
+ Consulta o edita tu perfil
+ </string>
+ <string name="Command_Search_Tooltip">
+ Buscar lugares, eventos y personas
+ </string>
+ <string name="Command_Snapshot_Tooltip">
+ Tomar una fotografía
+ </string>
+ <string name="Command_Speak_Tooltip">
+ Utiliza el micrófono para hablar con las personas próximas
+ </string>
+ <string name="Command_View_Tooltip">
+ Cambiando el ángulo de la cámara
+ </string>
+ <string name="Command_Voice_Tooltip">
+ Controles de volumen para las llamadas y la gente que se encuentre cerca de ti en el mundo virtual
+ </string>
+ <string name="Toolbar_Bottom_Tooltip">
+ actualmente en tu barra de herramientas inferior
+ </string>
+ <string name="Toolbar_Left_Tooltip">
+ actualmente en tu barra de herramientas izquierda
+ </string>
+ <string name="Toolbar_Right_Tooltip">
+ actualmente en tu barra de herramientas derecha
+ </string>
+ <string name="Retain%">
+ % retención
+ </string>
+ <string name="Detail">
+ Detalle
+ </string>
+ <string name="Better Detail">
+ Mejor detalle
+ </string>
+ <string name="Surface">
+ Superficie
+ </string>
+ <string name="Solid">
+ Sólido
+ </string>
+ <string name="Wrap">
+ Envoltura
+ </string>
+ <string name="Preview">
+ Vista previa
+ </string>
+ <string name="Normal">
+ Normal
+ </string>
+ <string name="snapshot_quality_very_low">
+ Muy bajo
+ </string>
+ <string name="snapshot_quality_low">
+ Bajo
+ </string>
+ <string name="snapshot_quality_medium">
+ Medio
+ </string>
+ <string name="snapshot_quality_high">
+ Alto
+ </string>
+ <string name="snapshot_quality_very_high">
+ Muy alto
+ </string>
</strings>
diff --git a/indra/newview/skins/default/xui/es/teleport_strings.xml b/indra/newview/skins/default/xui/es/teleport_strings.xml
index e0e0061729..a23d9c43d0 100644
--- a/indra/newview/skins/default/xui/es/teleport_strings.xml
+++ b/indra/newview/skins/default/xui/es/teleport_strings.xml
@@ -19,6 +19,10 @@ Si sigues recibiendo este mensaje, por favor, acude al [SUPPORT_SITE].
Lo sentimos, pero el sistema no ha podido completar el teleporte.
Vuelva a intentarlo en un momento.
</message>
+ <message name="NoHelpIslandTP">
+ No te puedes volver a teleportar a la isla de bienvenida.
+Para repetir el tutorial, visita la isla de bienvenida pública.
+ </message>
<message name="noaccess_tport">
Lo sentimos, pero no tienes acceso al destino de este teleporte.
</message>
diff --git a/indra/newview/skins/default/xui/fr/floater_about.xml b/indra/newview/skins/default/xui/fr/floater_about.xml
index d088cb3244..4409949584 100644
--- a/indra/newview/skins/default/xui/fr/floater_about.xml
+++ b/indra/newview/skins/default/xui/fr/floater_about.xml
@@ -8,9 +8,9 @@
Compilé avec [COMPILER] version [COMPILER_VERSION]
</floater.string>
<floater.string name="AboutPosition">
- Vous êtes à [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1] dans [REGION] se trouvant à &lt;nolink&gt;[HOSTNAME]&lt;/nolink&gt; ([HOSTIP])
+ Vous êtes à [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1] dans [REGION], se trouvant à &lt;nolink&gt;[HOSTNAME]&lt;/nolink&gt; ([HOSTIP])
[SERVER_VERSION]
-[[SERVER_RELEASE_NOTES_URL] [ReleaseNotes]]
+[SERVER_RELEASE_NOTES_URL]
</floater.string>
<floater.string name="AboutSystem">
CPU : [CPU]
@@ -37,6 +37,9 @@ Version serveur vocal : [VOICE_VERSION]
<floater.string name="AboutTraffic">
Paquets perdus : [PACKETS_LOST,number,0]/[PACKETS_IN,number,0] ([PACKETS_PCT,number,1]%)
</floater.string>
+ <floater.string name="ErrorFetchingServerReleaseNotesURL">
+ Erreur lors de la récupération de l&apos;URL des notes de version du serveur.
+ </floater.string>
<tab_container name="about_tab">
<panel label="Infos" name="support_panel">
<button label="Copier dans le presse-papiers" name="copy_btn"/>
@@ -64,32 +67,34 @@ Version serveur vocal : [VOICE_VERSION]
<panel label="Licences" name="licenses_panel">
<text_editor name="credits_editor">
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 et 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
-SDL Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga
-SSLeay Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
-xmlrpc-epi Copyright (C) 2000 Epinions, Inc.
-zlib Copyright (C) 1995-2002 Jean-loup Gailly et Mark Adler.
-google-perftools Copyright (c) 2005, Google Inc.
+ 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 et 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
+ SDL Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga
+ SSLeay Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
+ xmlrpc-epi Copyright (C) 2000 Epinions, Inc.
+ zlib Copyright (C) 1995-2002 Jean-loup Gailly et Mark Adler.
+ google-perftools Copyright (c) 2005, Google Inc.
+
+ Le client Second Life utilise Havok (TM) Physics. (c)Copyright 1999-2010 Havok.com Inc. (et ses concédants de licence). Tous droits réservés. Pour plus de détails, consultez le site Web www.havok.com.
-Le client Second Life utilise Havok (TM) Physics. (c)Copyright 1999-2010 Havok.com Inc. (et ses concédants de licence). Tous droits réservés. Pour plus de détails, consultez le site Web www.havok.com.
+ Ce logiciel contient du code source fourni par NVIDIA Corporation.
-Tous droits réservés. Voir licenses.txt pour plus d&apos;informations.
+ Tous droits réservés. Voir licenses.txt pour plus d&apos;informations.
-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 55dd913a22..b554a0a892 100644
--- a/indra/newview/skins/default/xui/fr/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/fr/floater_about_land.xml
@@ -132,7 +132,7 @@
Trafic :
</text>
<text name="DwellText">
- 0
+ Chargement...
</text>
<button label="Acheter du terrain" label_selected="Acheter le terrain..." left_delta="60" name="Buy Land..." width="125"/>
<button label="Vente Linden" label_selected="Vente Linden..." name="Linden Sale..." tool_tip="Le terrain doit être la propriété d&apos;un résident, avoir un contenu défini et ne pas être aux enchères."/>
@@ -217,19 +217,19 @@ ou divisé.
Facteur Bonus objets : [BONUS]
</text>
<text name="Simulator primitive usage:">
- Utilisation des primitives :
+ Capacité de la région :
</text>
<text name="objects_available">
[COUNT] sur [MAX] ([AVAILABLE] disponibles)
</text>
<text name="Primitives parcel supports:">
- Prims max. sur la parcelle :
+ Capacité de la parcelle :
</text>
<text name="object_contrib_text">
[COUNT]
</text>
<text name="Primitives on parcel:">
- Prims sur la parcelle :
+ Impact sur la parcelle :
</text>
<text name="total_objects_text">
[COUNT]
@@ -313,13 +313,15 @@ Seules les parcelles de grande taille peuvent apparaître dans la recherche.
Pas de bousculades (les règles de la région priment)
</panel.string>
<panel.string name="see_avs_text">
- Voir et chatter avec les résidents sur cette parcelle
+ Les avatars sur les autres parcelles peuvent voir
</panel.string>
<text name="allow_label">
Autoriser les autres résidents à :
</text>
- <check_box label="Modifier le terrain" name="edit land check" tool_tip="Si cette option est cochée, n&apos;importe qui peut terraformer votre terrain. Il vaut mieux ne pas cocher cette option pour toujours pouvoir modifer votre propre terrain."/>
- <check_box label="Voler" name="check fly" tool_tip="Si cette option est cochée, les résidents peuvent voler sur votre terrain. Si elle n&apos;est pas cochée, ils ne pourront voler que lorsqu&apos;ils arrivent et passent au dessus de votre terrain."/>
+ <text name="allow_label0">
+ Voler :
+ </text>
+ <check_box label="Tous" name="check fly" tool_tip="Si cette option est cochée, les résidents peuvent voler sur votre terrain. Si elle n&apos;est pas cochée, ils ne pourront voler que lorsqu&apos;ils arrivent et passent au dessus de votre terrain."/>
<text name="allow_label2">
Construire :
</text>
@@ -335,9 +337,6 @@ Seules les parcelles de grande taille peuvent apparaître dans la recherche.
</text>
<check_box label="Tous" name="check other scripts"/>
<check_box label="Groupe" name="check group scripts"/>
- <text name="land_options_label">
- Options du terrain :
- </text>
<check_box label="Sécurisé (pas de dégâts)" name="check safe" tool_tip="Si cette option est cochée, le terrain est sécurisé et il n&apos;y pas de risques de dommages causés par des combats. Si elle est décochée, des dommages causés par les combats peuvent avoir lieu."/>
<check_box label="Pas de bousculades" name="PushRestrictCheck" tool_tip="Empêche l&apos;utilisation de scripts causant des bousculades. Cette option est utile pour empêcher les comportements abusifs sur votre terrain."/>
<check_box label="Afficher le lieu dans la recherche (30 L$/semaine)" name="ShowDirectoryCheck" tool_tip="Afficher la parcelle dans les résultats de recherche"/>
@@ -378,9 +377,9 @@ Seules les parcelles de grande taille peuvent apparaître dans la recherche.
</text>
<texture_picker label="" name="snapshot_ctrl" tool_tip="Cliquez pour sélectionner une image"/>
<text name="allow_label5">
- Autoriser les résidents sur les autres parcelles à :
+ et chatter avec les avatars sur cette parcelle
</text>
- <check_box label="Voir les avatars" name="SeeAvatarsCheck" tool_tip="Permettre aux résidents présents sur d&apos;autres parcelles de voir et chatter avec les résidents présents sur cette parcelle et vous permettre de les voir et de chatter avec eux."/>
+ <check_box label="Voir les avatars" name="SeeAvatarsCheck" tool_tip="Permettre aux avatars présents sur d&apos;autres parcelles de voir et chatter avec les avatars présents sur cette parcelle et à vous de les voir et de chatter avec eux."/>
<text name="landing_point">
Lieu d&apos;arrivée : [LANDING]
</text>
diff --git a/indra/newview/skins/default/xui/fr/floater_avatar.xml b/indra/newview/skins/default/xui/fr/floater_avatar.xml
new file mode 100644
index 0000000000..7cbb50a3d6
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/floater_avatar.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Avatar" title="CHOISIR UN AVATAR"/>
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 b3acc83078..148a5a35d2 100644
--- a/indra/newview/skins/default/xui/fr/floater_buy_currency.xml
+++ b/indra/newview/skins/default/xui/fr/floater_buy_currency.xml
@@ -22,10 +22,10 @@ le Lindex...
<text name="currency_action">
Je veux acheter
</text>
- <text name="currency_label" left="308">
+ <text left="308" name="currency_label">
L$
</text>
- <line_editor label="L$" name="currency_amt" width="65" left_pad="-85">
+ <line_editor label="L$" left_pad="-85" name="currency_amt" width="65">
1234
</line_editor>
<text name="buying_label">
@@ -47,13 +47,13 @@ le Lindex...
[AMT] L$
</text>
<text name="currency_links">
- [http://www.secondlife.com/my/account/payment_method_management.php?lang=fr-FR mode de paiement] | [http://www.secondlife.com/my/account/currency.php?lang=fr-FR devise] | [http://www.secondlife.com/my/account/exchange_rates.php?lang=fr-FR taux de change]
+ [http://www.secondlife.com/my/account/payment_method_management.php mode de paiement] | [http://www.secondlife.com/my/account/currency.php devise]
</text>
<text name="exchange_rate_note">
Saisissez à nouveau le montant pour voir le taux de change actuel.
</text>
<text name="purchase_warning_repurchase">
- Confirmer cet achat n'achète que des L$, pas l'objet.
+ Confirmer cet achat n&apos;achète que des L$, pas l&apos;objet.
</text>
<text bottom_delta="16" name="purchase_warning_notenough">
Vous n&apos;achetez pas assez de L$. Veuillez augmenter le montant.
diff --git a/indra/newview/skins/default/xui/fr/floater_camera.xml b/indra/newview/skins/default/xui/fr/floater_camera.xml
index 1d62a89ff2..f2b0ee8af3 100644
--- a/indra/newview/skins/default/xui/fr/floater_camera.xml
+++ b/indra/newview/skins/default/xui/fr/floater_camera.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="camera_floater">
+<floater name="camera_floater" title="PARAMÈTRES DE LA CAMÉRA">
<floater.string name="rotate_tooltip">
Faire tourner la caméra autour du point central
</floater.string>
@@ -9,15 +9,6 @@
<floater.string name="move_tooltip">
Déplacer la caméra vers le haut et le bas, la gauche et la droite
</floater.string>
- <floater.string name="camera_modes_title">
- Modes
- </floater.string>
- <floater.string name="pan_mode_title">
- Rotation - Zoom - Panoramique
- </floater.string>
- <floater.string name="presets_mode_title">
- Préréglages
- </floater.string>
<floater.string name="free_mode_title">
Voir l&apos;objet
</floater.string>
diff --git a/indra/newview/skins/default/xui/fr/floater_chat_bar.xml b/indra/newview/skins/default/xui/fr/floater_chat_bar.xml
new file mode 100644
index 0000000000..c7d27c0589
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/floater_chat_bar.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="chat_bar" title="CHAT PRÈS DE MOI">
+ <panel name="bottom_panel">
+ <line_editor label="Cliquer ici pour chatter." name="chat_box" tool_tip="Appuyer sur Entrée pour dire, Ctrl-Entrée pour crier"/>
+ <button name="show_nearby_chat" tool_tip="Affiche/Masque le journal de chats près de vous"/>
+ </panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_destinations.xml b/indra/newview/skins/default/xui/fr/floater_destinations.xml
new file mode 100644
index 0000000000..25e6c90a8e
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/floater_destinations.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Destinations" title="DESTINATIONS"/>
diff --git a/indra/newview/skins/default/xui/fr/floater_fast_timers.xml b/indra/newview/skins/default/xui/fr/floater_fast_timers.xml
new file mode 100644
index 0000000000..0100b10557
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/floater_fast_timers.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="fast_timers">
+ <string name="pause">
+ Pauser
+ </string>
+ <string name="run">
+ Courir
+ </string>
+ <button label="Pauser" name="pause_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_hardware_settings.xml b/indra/newview/skins/default/xui/fr/floater_hardware_settings.xml
index 8ad301823b..2bc76e0c63 100644
--- a/indra/newview/skins/default/xui/fr/floater_hardware_settings.xml
+++ b/indra/newview/skins/default/xui/fr/floater_hardware_settings.xml
@@ -4,7 +4,7 @@
Filtres :
</text>
<check_box label="Filtre anisotrope (plus lent si activé)" name="ani"/>
- <text name="Antialiasing:">
+ <text name="antialiasing label">
Anti-aliasing :
</text>
<combo_box label="Anti-aliasing" name="fsaa" width="84">
diff --git a/indra/newview/skins/default/xui/fr/floater_how_to.xml b/indra/newview/skins/default/xui/fr/floater_how_to.xml
new file mode 100644
index 0000000000..a414212ba0
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/floater_how_to.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_how_to" title="AIDE RAPIDE"/>
diff --git a/indra/newview/skins/default/xui/fr/floater_map.xml b/indra/newview/skins/default/xui/fr/floater_map.xml
index 8675fb8ef9..dbd3dd9406 100644
--- a/indra/newview/skins/default/xui/fr/floater_map.xml
+++ b/indra/newview/skins/default/xui/fr/floater_map.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Map" title="">
+<floater name="Map" title="Mini-carte">
<floater.string name="ToolTipMsg">
[REGION](Carte : double-clic ; Panoramique : Maj + faire glisser)
</floater.string>
@@ -7,7 +7,7 @@
[REGION](Téléportation : double-clic ; Panoramique : Maj + faire glisser)
</floater.string>
<floater.string name="mini_map_caption">
- MINI-CARTE
+ Mini-carte
</floater.string>
<text label="N" name="floater_map_north" text="N">
N
diff --git a/indra/newview/skins/default/xui/fr/floater_model_preview.xml b/indra/newview/skins/default/xui/fr/floater_model_preview.xml
index 2b8e441ef0..a3b50351ae 100644
--- a/indra/newview/skins/default/xui/fr/floater_model_preview.xml
+++ b/indra/newview/skins/default/xui/fr/floater_model_preview.xml
@@ -1,10 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Model Preview" title="Chargement du modèle">
- <string name="status_idle">
- Inactif
- </string>
+<floater name="Model Preview" title="CHARGEMENT DU MODELE">
+ <string name="status_idle"/>
<string name="status_parse_error">
- Problème d&apos;analyse de fichier .dae ; reportez-vous au journal pour plus de détails.
+ Erreur : Problème d&apos;analyse de fichier .dae ; reportez-vous au journal pour plus de détails.
+ </string>
+ <string name="status_material_mismatch">
+ Erreur : le matériau du modèle ne correspond pas à un sous-ensemble du modèle de référence.
</string>
<string name="status_reading_file">
Chargement...
@@ -51,6 +52,9 @@
<string name="mesh_status_missing_lod">
Niveau de détail requis manquant.
</string>
+ <string name="mesh_status_invalid_material_list">
+ Les options du niveau de détail ne sont pas une sous-ensemble d&apos;un modèle de référence.
+ </string>
<string name="layer_all">
Tout
</string>
@@ -63,188 +67,211 @@
<string name="tbd">
TBD
</string>
- <text name="name_label">
- Nom :
- </text>
- <text name="lod_label">
- Aperçu :
- </text>
- <combo_box name="preview_lod_combo" tool_tip="Niveau de détail à afficher en rendu d&apos;aperçu.">
- <combo_item name="high">
- Niveau de détail : Élevé
- </combo_item>
- <combo_item name="medium">
- Niveau de détail : Moyen
- </combo_item>
- <combo_item name="low">
- Niveau de détail : Faible
- </combo_item>
- <combo_item name="lowest">
- Niveau de détail : Le plus faible
- </combo_item>
- </combo_box>
- <text name="warning_title">
- AVERTISSEMENT :
- </text>
- <text name="warning_message">
- Vous ne pourrez pas effectuer le chargement final du modèle sur les serveurs Second Life. [[VURL] Découvrez comment] activer le chargement des modèles de maillage.
- </text>
- <text name="weights_text">
- Téléchargement :
-Propriétés physiques :
-Serveur :
-
-Équiv. en prims :
- </text>
- <text name="weights">
- [ST]
-[PH]
-[SIM]
-
-[EQ]
- </text>
- <tab_container name="import_tab">
- <panel label="Niveau de détail" name="lod_panel">
- <text name="lod_table_header">
- Sélectionner le niveau de détail :
- </text>
- <text name="high_label" value="Élevé"/>
- <text name="high_triangles" value="0"/>
- <text name="high_vertices" value="0"/>
- <text name="medium_label" value="Moyen"/>
- <text name="medium_triangles" value="0"/>
- <text name="medium_vertices" value="0"/>
- <text name="low_label" value="Faible"/>
- <text name="low_triangles" value="0"/>
- <text name="low_vertices" value="0"/>
- <text name="lowest_label" value="Le plus faible"/>
- <text name="lowest_triangles" value="0"/>
- <text name="lowest_vertices" value="0"/>
- <text name="lod_table_footer">
- Niveau de détail : [DETAIL]
- </text>
- <radio_group name="lod_file_or_limit" value="lod_from_file">
- <radio_item label="Charger depuis un fichier" name="lod_from_file"/>
- <radio_item label="Générer automatiquement" name="lod_auto_generate"/>
- <radio_item label="Aucun" name="lod_none"/>
- </radio_group>
- <button label="Parcourir..." name="lod_browse"/>
- <combo_box name="lod_mode">
- <combo_item name="triangle_limit">
- Triangles max.
- </combo_item>
- <combo_item name="error_threshold">
- Seuil d&apos;erreur
- </combo_item>
- </combo_box>
- <text name="build_operator_text">
- Opér. construction :
- </text>
- <text name="queue_mode_text">
- Mode file d&apos;attente :
- </text>
- <combo_box name="build_operator">
- <combo_item name="edge_collapse">
- Fusion (nouveau sommet)
- </combo_item>
- <combo_item name="half_edge_collapse">
- Fusion (un des sommets)
- </combo_item>
- </combo_box>
- <combo_box name="queue_mode">
- <combo_item name="greedy">
- Glouton
- </combo_item>
- <combo_item name="lazy">
- Paresseux
- </combo_item>
- <combo_item name="independent">
- Indépendant
- </combo_item>
- </combo_box>
- <text name="border_mode_text">
- Mode bord :
+ <panel name="left_panel">
+ <panel name="model_name_representation_panel">
+ <text name="name_label">
+ Nom du modèle :
</text>
- <text name="share_tolderance_text">
- Tolérance partage :
+ <text name="model_category_label">
+ Ce modèle représente...
</text>
- <combo_box name="border_mode">
- <combo_item name="border_unlock">
- Déverrouiller
- </combo_item>
- <combo_item name="border_lock">
- Verrouiller
- </combo_item>
+ <combo_box name="model_category_combo">
+ <combo_item label="Choisir une option..." name="Choose one"/>
+ <combo_item label="Silhouette de l&apos;avatar" name="Avatar shape"/>
+ <combo_item label="Éléments attachés aux avatars" name="Avatar attachment"/>
+ <combo_item label="Objet mobile (véhicule, animal)" name="Moving object (vehicle, animal)"/>
+ <combo_item label="Éléments pour la construction" name="Building Component"/>
+ <combo_item label="Important, immobile etc." name="Large, non moving etc"/>
+ <combo_item label="Plus petit, immobile etc." name="Smaller, non-moving etc"/>
+ <combo_item label="Aucun" name="Not really any of these"/>
</combo_box>
- <text name="crease_label">
- Angle pli :
- </text>
- <spinner name="crease_angle" value="75"/>
</panel>
- <panel label="Propriétés physiques" name="physics_panel">
- <panel name="physics geometry">
- <radio_group name="physics_load_radio" value="physics_load_from_file">
- <radio_item label="Fichier :" name="physics_load_from_file"/>
- <radio_item label="Utiliser le niveau de détail :" name="physics_use_lod"/>
- </radio_group>
- <combo_box name="physics_lod_combo" tool_tip="Niveau de détail à utiliser pour la forme physique.">
- <combo_item name="physics_lowest">
- Le plus faible
- </combo_item>
- <combo_item name="physics_low">
- Faible
- </combo_item>
- <combo_item name="physics_medium">
- Moyen
- </combo_item>
- <combo_item name="physics_high">
- Élevé
- </combo_item>
- </combo_box>
- <button label="Parcourir..." name="physics_browse"/>
- </panel>
- <panel name="physics analysis">
- <slider label="Lissage :" name="Smooth"/>
- <check_box label="Fermer les trous (lent)" name="Close Holes (Slow)"/>
- <button label="Analyser" name="Decompose"/>
- <button label="Annuler" name="decompose_cancel"/>
+ <tab_container name="import_tab">
+ <panel label="Niveau de détail" name="lod_panel" title="Niveau de détail">
+ <text initial_value="Source" name="source" value="Source"/>
+ <text initial_value="Triangles" name="triangles" value="Triangles"/>
+ <text initial_value="Sommets" name="vertices" value="Sommets"/>
+ <text initial_value="Élevé" name="high_label" value="Élevé"/>
+ <button label="Parcourir..." name="lod_browse_high"/>
+ <text initial_value="0" name="high_triangles" value="0"/>
+ <text initial_value="0" name="high_vertices" value="0"/>
+ <text initial_value="Moyen" name="medium_label" value="Moyen"/>
+ <button label="Parcourir..." name="lod_browse_medium"/>
+ <text initial_value="0" name="medium_triangles" value="0"/>
+ <text initial_value="0" name="medium_vertices" value="0"/>
+ <text initial_value="Faible" name="low_label" value="Faible"/>
+ <button label="Parcourir..." name="lod_browse_low"/>
+ <text initial_value="0" name="low_triangles" value="0"/>
+ <text initial_value="0" name="low_vertices" value="0"/>
+ <text initial_value="Le plus faible" name="lowest_label" value="Le plus faible"/>
+ <button label="Parcourir..." name="lod_browse_lowest"/>
+ <text initial_value="0" name="lowest_triangles" value="0"/>
+ <text initial_value="0" name="lowest_vertices" value="0"/>
+ <check_box label="Génération de normales" name="gen_normals"/>
+ <text initial_value="Angle pli :" name="crease_label" value="Angle pli :"/>
+ <spinner name="crease_angle" value="75"/>
</panel>
- <panel name="physics simplification">
- <slider label="Passes :" name="Combine Quality"/>
- <slider label="Échelle de détail :" name="Detail Scale"/>
- <slider label="Retenue :" name="Retain%"/>
- <button label="Simplifier" name="Simplify"/>
- <button label="Annuler" name="simplify_cancel"/>
+ <panel label="Propriétés physiques" name="physics_panel">
+ <panel name="physics geometry">
+ <text name="first_step_name">
+ Étape 1 : Niveau de détail
+ </text>
+ <combo_box name="physics_lod_combo" tool_tip="Niveau de détail à utiliser pour la forme des propriétés physiques.">
+ <combo_item name="choose_one">
+ Choisir une option...
+ </combo_item>
+ <combo_item name="physics_high">
+ Élevé
+ </combo_item>
+ <combo_item name="physics_medium">
+ Moyen
+ </combo_item>
+ <combo_item name="physics_low">
+ Faible
+ </combo_item>
+ <combo_item name="physics_lowest">
+ Le plus faible
+ </combo_item>
+ <combo_item name="load_from_file">
+ Du fichier
+ </combo_item>
+ </combo_box>
+ <button label="Parcourir..." name="physics_browse"/>
+ </panel>
+ <panel name="physics analysis">
+ <text name="method_label">
+ Étape 2 : Analyser
+ </text>
+ <text name="analysis_method_label">
+ Moyen :
+ </text>
+ <text name="quality_label">
+ Qualité :
+ </text>
+ <text name="smooth_method_label">
+ Lissage :
+ </text>
+ <check_box label="Fermer les trous" name="Close Holes (Slow)"/>
+ <button label="Analyser" name="Decompose"/>
+ <button label="Annuler" name="decompose_cancel"/>
+ </panel>
+ <panel name="physics simplification">
+ <text name="second_step_label">
+ Étape 3 : Simplifier
+ </text>
+ <text name="simp_method_header">
+ Moyen :
+ </text>
+ <text name="pass_method_header">
+ Passes :
+ </text>
+ <text name="Detail Scale label">
+ Échelle de détail :
+ </text>
+ <text name="Retain%_label">
+ Retenue :
+ </text>
+ <combo_box name="Combine Quality" value="1"/>
+ <button label="Simplifier" name="Simplify"/>
+ <button label="Annuler" name="simplify_cancel"/>
+ </panel>
+ <panel name="physics info">
+ <text name="results_text">
+ Résultats :
+ </text>
+ <text name="physics_triangles">
+ Triangles : [TRIANGLES],
+ </text>
+ <text name="physics_points">
+ Sommets : [POINTS]
+ </text>
+ <text name="physics_hulls">
+ Enveloppes : [HULLS]
+ </text>
+ </panel>
</panel>
- <panel name="physics info">
- <slider label="Décomposition de l&apos;aperçu :" name="physics_explode"/>
- <text name="physics_triangles">
- Triangles : [TRIANGLES]
+ <panel label="Option de chargement" name="modifiers_panel">
+ <text name="scale_label">
+ Echelle (1 = pas d&apos;échelle) :
</text>
- <text name="physics_points">
- Sommets : [POINTS]
+ <spinner name="import_scale" value="1.0"/>
+ <text name="dimensions_label">
+ Dimensions :
</text>
- <text name="physics_hulls">
- Enveloppes : [HULLS]
+ <text name="import_dimensions">
+ [X] X [Y] X [Z]
</text>
+ <check_box label="Inclure les textures" name="upload_textures"/>
+ <text name="include_label">
+ Pour les modèles d&apos;avatar uniquement :
+ </text>
+ <check_box label="Inclure la pondération de la peau :" name="upload_skin"/>
+ <check_box label="Inclure la position des articulations :" name="upload_joints"/>
+ <text name="pelvis_offset_label">
+ Décalage Z (élever ou abaisser l&apos;avatar) :
+ </text>
+ <spinner name="pelvis_offset" value="0.0"/>
</panel>
- </panel>
- <panel label="Modificateurs" name="modifiers_panel">
- <spinner name="import_scale" value="1.0"/>
- <text name="import_dimensions">
- [X] x [Y] x [Z] m
+ </tab_container>
+ <panel name="weights_and_warning_panel">
+ <button label="Calculer les poids et les frais." name="calculate_btn" tool_tip="Calculer les poids et les frais."/>
+ <button label="Annuler" name="cancel_btn"/>
+ <button label="Charger le modèle" name="ok_btn" tool_tip="Charger dans le simulateur"/>
+ <button label="Effacer les paramètres et réinitialiser le formulaire" name="reset_btn"/>
+ <text name="upload_fee">
+ Frais de chargement : [FEE] L$
+ </text>
+ <text name="prim_weight">
+ Impact sur le terrain : [EQ]
+ </text>
+ <text name="download_weight">
+ Téléchargement : [ST]
+ </text>
+ <text name="physics_weight">
+ Propriétés physiques : [PH]
+ </text>
+ <text name="server_weight">
+ Serveur : [SIM]
+ </text>
+ <text name="warning_title">
+ Remarque :
+ </text>
+ <text name="warning_message">
+ Vous n&apos;avez pas la permission de charger des modèles de maillage. [[VURL] Savoir comment] obtenir la permission.
+ </text>
+ <text name="status">
+ [STATUS]
</text>
- <check_box label="Textures" name="upload_textures"/>
- <check_box label="Pondération de la peau" name="upload_skin"/>
- <check_box label="Position des articulations" name="upload_joints"/>
- <spinner name="pelvis_offset" value="0.0"/>
</panel>
- </tab_container>
- <text name="upload_fee">
- Frais de chargement : [FEE] L$
+ </panel>
+ <text name="lod_label">
+ Aperçu :
</text>
- <button label="Réinitialiser" name="reset_btn" tool_tip="Rétablir les paramètres par défaut."/>
- <button label="Calculer poids et frais" name="calculate_btn" tool_tip="Calculer les poids et les frais."/>
- <button label="Charger" name="ok_btn" tool_tip="Charger dans le simulateur."/>
- <button label="Annuler" name="cancel_btn"/>
+ <panel name="right_panel">
+ <combo_box name="preview_lod_combo" tool_tip="Niveau de détail à afficher en rendu d&apos;aperçu.">
+ <combo_item name="high">
+ Élevé
+ </combo_item>
+ <combo_item name="medium">
+ Moyen
+ </combo_item>
+ <combo_item name="low">
+ Faible
+ </combo_item>
+ <combo_item name="lowest">
+ Le plus faible
+ </combo_item>
+ </combo_box>
+ <text name="label_display">
+ Afficher...
+ </text>
+ <check_box label="Coins" name="show_edges"/>
+ <check_box label="Propriétés physiques" name="show_physics"/>
+ <check_box label="Textures" name="show_textures"/>
+ <check_box label="Pondération de la peau" name="show_skin_weight"/>
+ <check_box label="Articulations" name="show_joint_positions"/>
+ <text name="physics_explode_label">
+ Décomposition de l&apos;aperçu :
+ </text>
+ </panel>
</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_model_wizard.xml b/indra/newview/skins/default/xui/fr/floater_model_wizard.xml
index f564b6f71a..63feb1d403 100644
--- a/indra/newview/skins/default/xui/fr/floater_model_wizard.xml
+++ b/indra/newview/skins/default/xui/fr/floater_model_wizard.xml
@@ -6,26 +6,23 @@
<button label="2. Optimisation" name="optimize_btn"/>
<button label="1. Sélection du fichier" name="choose_file_btn"/>
<panel name="choose_file_panel">
- <panel name="choose_file_header_panel">
- <text name="choose_file_header_text">
+ <panel name="header_panel">
+ <text name="header_text">
Choisir un fichier de modèle
</text>
</panel>
- <panel name="choose_file_content_panel">
+ <panel name="content">
<text name="advanced_users_text">
Utilisateurs expérimentés : si vous êtes habitué à utiliser des outils de création de contenu en 3D, l&apos;outil de chargement avancé est mis à votre disposition.
</text>
<button label="Passer à Avancé" name="switch_to_advanced"/>
- <text name="choose_model_file_label">
+ <text name="Cache location">
Choisir un fichier de modèle à charger
</text>
<button label="Parcourir..." label_selected="Parcourir..." name="browse"/>
- <text name="support_collada_text">
+ <text name="Model types">
Second Life prend en charge les fichiers COLLADA (.dae).
</text>
- <text name="dimensions_label">
- Dimensions (mètres) :
- </text>
<text name="dimensions">
X Y Z
</text>
@@ -38,18 +35,15 @@
</panel>
</panel>
<panel name="optimize_panel">
- <panel name="optimize_header_panel">
- <text name="optimize_header_text">
+ <panel name="header_panel">
+ <text name="header_text">
Optimiser le modèle
</text>
</panel>
- <text name="optimize_hint">
+ <text name="description">
Le modèle a été optimisé en termes de performances. Vous pouvez l&apos;ajuster si vous le souhaitez.
</text>
- <panel name="optimize_content_panel">
- <text name="generating_lod_label">
- Génération du niveau de détail
- </text>
+ <panel name="content">
<text name="high_detail_text">
Générer le niveau de détail : Élevé
</text>
@@ -64,123 +58,64 @@
</text>
</panel>
<panel name="content2">
- <text name="optimize_performance_text">
- Performances
- </text>
- <text name="optimize_faster_rendering_text">
- Rendu plus rapide
-Moins de détail
-Poids en prims inférieur
- </text>
- <text name="optimize_accuracy_text">
- Précision
- </text>
- <text name="optimize_slower_rendering_text">
- Rendu plus lent
-Plus de détail
-Poids en prims supérieur
- </text>
- <text name="accuracy_slider_mark1">
- &apos;
- </text>
- <text name="accuracy_slider_mark2">
- &apos;
- </text>
- <text name="accuracy_slider_mark3">
- &apos;
- </text>
<button label="Recalcul géométrique" name="recalculate_geometry_btn"/>
- <text name="geometry_preview_label">
+ <text name="lod_label">
Aperçu de la géométrie
</text>
<combo_box name="preview_lod_combo" tool_tip="Niveau de détail à afficher en rendu d&apos;aperçu.">
- <combo_item name="preview_lod_high">
+ <combo_item name="high">
Niveau de détail élevé
</combo_item>
- <combo_item name="preview_lod_medium">
+ <combo_item name="medium">
Niveau de détail moyen
</combo_item>
- <combo_item name="preview_lod_low">
+ <combo_item name="low">
Niveau de détail faible
</combo_item>
- <combo_item name="preview_lod_lowest">
+ <combo_item name="lowest">
Niveau de détail le plus faible
</combo_item>
</combo_box>
</panel>
</panel>
<panel name="physics_panel">
- <panel name="physics_header_panel">
- <text name="physics_header_text">
+ <panel name="header_panel">
+ <text name="header_text">
Ajuster les propriétés physiques
</text>
</panel>
- <text name="physics_hint">
+ <text name="description">
Une forme va être créée pour l&apos;enveloppe externe du modèle. Ajustez le niveau de détail de la forme en fonction de l&apos;objectif souhaité pour votre modèle.
</text>
- <panel name="physics_content_panel">
- <text name="physics_performance_text">
- Performances
- </text>
- <text name="physics_faster_rendering_text">
- Rendu plus rapide
-Moins de détail
-Poids en prims inférieur
- </text>
- <text name="physics_accuracy_text">
- Précision
- </text>
- <text name="physics_slower_dendering_text">
- Rendu plus lent
-Plus de détail
-Poids en prims supérieur
- </text>
- <text name="physics_example_1">
- Exemples :
-Objets mobiles
-Objets volants
-Véhicules
- </text>
- <text name="physics_example_2">
- Exemples :
-Petits objets statiques
-Objets moins détaillés
-Mobilier simple
- </text>
- <text name="physics_example_3">
- Exemples :
-Objets statiques
-Objets détaillés
-Bâtiments
- </text>
+ <panel name="content">
<button label="Recalcul physique" name="recalculate_physics_btn"/>
<button label="Recalcul en cours..." name="recalculating_physics_btn"/>
- <text name="physics_preview_label">
+ <text name="lod_label">
Aperçu des propriétés physiques
</text>
<combo_box name="preview_lod_combo2" tool_tip="Niveau de détail à afficher en rendu d&apos;aperçu.">
- <combo_item name="preview_lod2_high">
+ <combo_item name="high">
Niveau de détail élevé
</combo_item>
- <combo_item name="preview_lod2_medium">
+ <combo_item name="medium">
Niveau de détail moyen
</combo_item>
- <combo_item name="preview_lod2_low">
+ <combo_item name="low">
Niveau de détail faible
</combo_item>
- <combo_item name="preview_lod2_lowest">
+ <combo_item name="lowest">
Niveau de détail le plus faible
</combo_item>
</combo_box>
</panel>
</panel>
<panel name="review_panel">
- <panel name="review_header_panel">
- <text name="review_header_text">
+ <panel name="header_panel">
+ <text name="header_text">
Vérification
</text>
</panel>
- <panel name="review_content_panel">
+ <panel name="content">
<text name="review_prim_equiv">
Impact sur la parcelle/région : équivalent à [EQUIV] prims
</text>
@@ -193,8 +128,8 @@ Bâtiments
</panel>
</panel>
<panel name="upload_panel">
- <panel name="upload_header_panel">
- <text name="upload_header_text">
+ <panel name="header_panel">
+ <text name="header_text">
Chargement terminé
</text>
</panel>
diff --git a/indra/newview/skins/default/xui/fr/floater_moveview.xml b/indra/newview/skins/default/xui/fr/floater_moveview.xml
index c0f3864b81..853af2afdf 100644
--- a/indra/newview/skins/default/xui/fr/floater_moveview.xml
+++ b/indra/newview/skins/default/xui/fr/floater_moveview.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="move_floater">
+<floater name="move_floater" title="MARCHER / COURIR / VOLER">
<string name="walk_forward_tooltip">
Marcher en avant (appuyer sur la flèche vers le haut ou W)
</string>
@@ -58,14 +58,14 @@
Voler
</string>
<panel name="panel_actions">
- <button label="" label_selected="" name="move up btn" tool_tip="Voler vers le haut (touche E)"/>
<button label="" label_selected="" name="turn left btn" tool_tip="Tourner à gauche (appuyer sur la flèche de gauche ou sur A)"/>
<joystick_slide name="move left btn" tool_tip="Marcher vers la gauche (Maj+Flèche gauche ou touche A)"/>
- <button label="" label_selected="" name="move down btn" tool_tip="Voler vers le bas (touche C)"/>
<button label="" label_selected="" name="turn right btn" tool_tip="Tourner à droite (appuyer sur la flèche de droite ou sur D)"/>
<joystick_slide name="move right btn" tool_tip="Marcher vers la droite (Maj+Flèche droite ou touche D)"/>
<joystick_turn name="forward btn" tool_tip="Marcher en avant (appuyer sur la flèche vers le haut ou W)"/>
<joystick_turn name="backward btn" tool_tip="Marcher en arrière (appuyer sur la flèche vers le bas ou S)"/>
+ <button label="" label_selected="" name="move up btn" tool_tip="Voler vers le haut (touche E)"/>
+ <button label="" label_selected="" name="move down btn" tool_tip="Voler vers le bas (touche C)"/>
</panel>
<panel name="panel_modes">
<button label="" name="mode_walk_btn" tool_tip="Mode marche"/>
diff --git a/indra/newview/skins/default/xui/fr/floater_my_appearance.xml b/indra/newview/skins/default/xui/fr/floater_my_appearance.xml
new file mode 100644
index 0000000000..53ff58e307
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/floater_my_appearance.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_my_appearance" title="APPARENCE">
+ <panel label="Changer d&apos;apparence" name="main_panel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_my_inventory.xml b/indra/newview/skins/default/xui/fr/floater_my_inventory.xml
new file mode 100644
index 0000000000..d514d08081
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/floater_my_inventory.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_my_inventory" title="INVENTAIRE"/>
diff --git a/indra/newview/skins/default/xui/fr/floater_nearby_chat.xml b/indra/newview/skins/default/xui/fr/floater_nearby_chat.xml
index 9b1b21c434..8bbd34baae 100644
--- a/indra/newview/skins/default/xui/fr/floater_nearby_chat.xml
+++ b/indra/newview/skins/default/xui/fr/floater_nearby_chat.xml
@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="nearby_chat" title="CHAT PRÈS DE MOI">
- <check_box label="Traduction du chat (fournie par Google)" name="translate_chat_checkbox"/>
+ <check_box label="Traduction du chat" name="translate_chat_checkbox"/>
</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_object_weights.xml b/indra/newview/skins/default/xui/fr/floater_object_weights.xml
new file mode 100644
index 0000000000..2667188308
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/floater_object_weights.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="object_weights" title="AVANCÉ">
+ <floater.string name="nothing_selected" value="--"/>
+ <text name="selected_text" value="SÉLECTION"/>
+ <text name="objects" value="--"/>
+ <text name="objects_label" value="Objets"/>
+ <text name="prims" value="--"/>
+ <text name="prims_label" value="Prims"/>
+ <text name="weights_of_selected_text" value="POIDS DE LA SÉLECTION"/>
+ <text name="download" value="--"/>
+ <text name="download_label" value="Téléchargement"/>
+ <text name="physics" value="--"/>
+ <text name="physics_label" value="Physique"/>
+ <text name="server" value="--"/>
+ <text name="server_label" value="Serveur"/>
+ <text name="display" value="--"/>
+ <text name="display_label" value="Affichage"/>
+ <text name="land_impacts_text" value="IMPACTS SUR LE TERRAIN"/>
+ <text name="selected" value="--"/>
+ <text name="selected_label" value="Sélection"/>
+ <text name="rezzed_on_land" value="--"/>
+ <text name="rezzed_on_land_label" value="Rezzés sur le terrain"/>
+ <text name="remaining_capacity" value="--"/>
+ <text name="remaining_capacity_label" value="Capacité restante"/>
+ <text name="total_capacity" value="--"/>
+ <text name="total_capacity_label" value="Capacité totale"/>
+ <text name="help_SLURL" value="[secondlife:///app/help/object_weights De quoi s&apos;agit-il ?...]"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_outfit_save_as.xml b/indra/newview/skins/default/xui/fr/floater_outfit_save_as.xml
index d77dfbdf82..72018f5de5 100644
--- a/indra/newview/skins/default/xui/fr/floater_outfit_save_as.xml
+++ b/indra/newview/skins/default/xui/fr/floater_outfit_save_as.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="modal container" title="Enregistrer la tenue">
+<floater name="modal container" title="SAUVEGARDER LA TENUE">
<button label="Enregistrer" label_selected="Enregistrer" name="Save"/>
<button label="Annuler" label_selected="Annuler" name="Cancel"/>
<text name="Save item as:">
diff --git a/indra/newview/skins/default/xui/fr/floater_people.xml b/indra/newview/skins/default/xui/fr/floater_people.xml
new file mode 100644
index 0000000000..58701c06b2
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/floater_people.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_people" title="PERSONNES">
+ <panel_container name="main_panel">
+ <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>
+</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_picks.xml b/indra/newview/skins/default/xui/fr/floater_picks.xml
new file mode 100644
index 0000000000..f058ff668b
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/floater_picks.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_picks" title="Favoris"/>
diff --git a/indra/newview/skins/default/xui/fr/floater_places.xml b/indra/newview/skins/default/xui/fr/floater_places.xml
new file mode 100644
index 0000000000..9e649aca47
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/floater_places.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_places" title="LIEUX">
+ <panel label="Lieux" name="main_panel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_preview_animation.xml b/indra/newview/skins/default/xui/fr/floater_preview_animation.xml
index a9407abfde..fdd2ac8beb 100644
--- a/indra/newview/skins/default/xui/fr/floater_preview_animation.xml
+++ b/indra/newview/skins/default/xui/fr/floater_preview_animation.xml
@@ -6,6 +6,6 @@
<text name="desc txt">
Description :
</text>
- <button label="Jouer dans Second Life" label_selected="Stop" name="Anim play btn" tool_tip="Lire cette animation de façon à ce que les autres puissent la voir" width="131"/>
- <button label="Jouer localement" label_selected="Stop" left="160" name="Anim audition btn" tool_tip="Lire cette animation de façon à ce que vous soyez la seule personne à pouvoir la voir" width="120"/>
+ <button label="Exécuter dans Second Life" label_selected="Stop" name="Anim play btn" tool_tip="Lire cette animation de façon à ce que les autres puissent la voir" width="131"/>
+ <button label="Exécuter localement" label_selected="Stop" left="160" name="Anim audition btn" tool_tip="Lire cette animation de façon à ce que vous soyez la seule personne à pouvoir la voir" width="120"/>
</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_snapshot.xml b/indra/newview/skins/default/xui/fr/floater_snapshot.xml
index 34d0957b46..9244051edc 100644
--- a/indra/newview/skins/default/xui/fr/floater_snapshot.xml
+++ b/indra/newview/skins/default/xui/fr/floater_snapshot.xml
@@ -1,75 +1,65 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Snapshot" title="APERÇU DE LA PHOTO" width="247">
+<floater name="Snapshot" title="APERÇU DE LA PHOTO">
<floater.string name="unknown">
inconnu
</floater.string>
- <radio_group label="Type de photo" name="snapshot_type_radio">
- <radio_item label="E-mail" name="postcard"/>
- <radio_item label="Mon inventaire ([AMOUNT] L$)" name="texture"/>
- <radio_item label="Enregistrer sur mon ordinateur" name="local"/>
- </radio_group>
+ <string name="postcard_progress_str">
+ Envoi par e-mail
+ </string>
+ <string name="profile_progress_str">
+ Publication
+ </string>
+ <string name="inventory_progress_str">
+ Enregistrement dans l&apos;inventaire
+ </string>
+ <string name="local_progress_str">
+ Enregistrement sur l&apos;ordinateur
+ </string>
+ <string name="profile_succeeded_str">
+ Image chargée
+ </string>
+ <string name="postcard_succeeded_str">
+ Envoi par e-mail effectué !
+ </string>
+ <string name="inventory_succeeded_str">
+ Enregistrement dans l&apos;inventaire effectué !
+ </string>
+ <string name="local_succeeded_str">
+ Enregistrement sur l&apos;ordinateur effectué !
+ </string>
+ <string name="profile_failed_str">
+ Échec de chargement de l&apos;image sur le flux de votre profil.
+ </string>
+ <string name="postcard_failed_str">
+ Échec d&apos;envoi par e-mail.
+ </string>
+ <string name="inventory_failed_str">
+ Échec d&apos;enregistrement dans l&apos;inventaire.
+ </string>
+ <string name="local_failed_str">
+ Échec d&apos;enregistrement sur l&apos;ordinateur.
+ </string>
+ <button name="advanced_options_btn" tool_tip="Options avancées"/>
+ <text name="image_res_text">
+ [WIDTH] x [HEIGHT] px
+ </text>
<text name="file_size_label">
[SIZE] Ko
</text>
- <button label="Rafraîchir" name="new_snapshot_btn"/>
- <button label="Envoyer" name="send_btn"/>
- <button label="Enreg. ([AMOUNT] L$)" name="upload_btn"/>
- <flyout_button label="Enregistrer" name="save_btn" tool_tip="Enregistrer l&apos;image sous forme de fichier">
- <flyout_button.item label="Enregistrer" name="save_item"/>
- <flyout_button.item label="Enregistrer sous..." name="saveas_item"/>
- </flyout_button>
- <button label="Plus" name="more_btn" tool_tip="Options avancées"/>
- <button label="Moins" name="less_btn" tool_tip="Options avancées"/>
- <button label="Annuler" name="discard_btn"/>
- <text name="type_label2">
- Taille
- </text>
- <text name="format_label">
- Format
- </text>
- <combo_box label="Résolution" name="postcard_size_combo">
- <combo_box.item label="Fenêtre actuelle" name="CurrentWindow"/>
- <combo_box.item label="640 x 480" name="640x480"/>
- <combo_box.item label="800 x 600" name="800x600"/>
- <combo_box.item label="1 024 x 768" name="1024x768"/>
- <combo_box.item label="Personnalisée" name="Custom"/>
- </combo_box>
- <combo_box label="Résolution" name="texture_size_combo">
- <combo_box.item label="Fenêtre actuelle" name="CurrentWindow"/>
- <combo_box.item label="Petite (128 x 128)" name="Small(128x128)"/>
- <combo_box.item label="Moyenne (256 x 256)" name="Medium(256x256)"/>
- <combo_box.item label="Grande (512 x 512)" name="Large(512x512)"/>
- <combo_box.item label="Personnalisée" name="Custom"/>
- </combo_box>
- <combo_box label="Résolution" name="local_size_combo">
- <combo_box.item label="Fenêtre actuelle" name="CurrentWindow"/>
- <combo_box.item label="320 x 240" name="320x240"/>
- <combo_box.item label="640 x 480" name="640x480"/>
- <combo_box.item label="800 x 600" name="800x600"/>
- <combo_box.item label="1 024 x 768" name="1024x768"/>
- <combo_box.item label="1 280 x 1 024" name="1280x1024"/>
- <combo_box.item label="1 600 x 1 200" name="1600x1200"/>
- <combo_box.item label="Personnalisée" name="Custom"/>
- </combo_box>
- <combo_box label="Format" name="local_format_combo">
- <combo_box.item label="PNG" name="PNG"/>
- <combo_box.item label="JPEG" name="JPEG"/>
- <combo_box.item label="BMP" name="BMP"/>
- </combo_box>
- <spinner label="Larg." name="snapshot_width"/>
- <spinner label="Haut." name="snapshot_height"/>
- <check_box label="Contraindre les proportions" name="keep_aspect_check"/>
- <slider label="Qualité de l&apos;image" name="image_quality_slider"/>
- <text name="layer_type_label">
- Capturer :
- </text>
- <combo_box label="Couches d&apos;images" name="layer_types">
- <combo_box.item label="Couleurs" name="Colors"/>
- <combo_box.item label="Profondeur" name="Depth"/>
- </combo_box>
- <check_box label="Interface" name="ui_check"/>
- <check_box label="HUD" name="hud_check"/>
- <check_box label="Garder ouvert après enregistrement" name="keep_open_check"/>
- <check_box label="Arrêt sur image (plein écran)" name="freeze_frame_check"/>
- <check_box label="Actualisation automatique" name="auto_snapshot_check"/>
+ <panel name="advanced_options_panel">
+ <text name="advanced_options_label">
+ OPTIONS AVANCÉES
+ </text>
+ <text name="layer_type_label">
+ Capturer :
+ </text>
+ <combo_box label="Couches d&apos;images" name="layer_types">
+ <combo_box.item label="Couleurs" name="Colors"/>
+ <combo_box.item label="Profondeur" name="Depth"/>
+ </combo_box>
+ <check_box label="Interface" name="ui_check"/>
+ <check_box label="HUD" name="hud_check"/>
+ <check_box label="Arrêt sur image (plein écran)" name="freeze_frame_check"/>
+ <check_box label="Actualisation automatique" name="auto_snapshot_check"/>
+ </panel>
</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_sound_devices.xml b/indra/newview/skins/default/xui/fr/floater_sound_devices.xml
index 9e2e4333aa..080ade9dd4 100644
--- a/indra/newview/skins/default/xui/fr/floater_sound_devices.xml
+++ b/indra/newview/skins/default/xui/fr/floater_sound_devices.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_sound_devices" title="Périphériques audio">
+<floater name="floater_sound_devices" title="PERIPHERIQUES AUDIO">
<text name="voice_label">
Chat vocal
</text>
diff --git a/indra/newview/skins/default/xui/fr/floater_stats.xml b/indra/newview/skins/default/xui/fr/floater_stats.xml
index 3c19bb2608..2ce2e6dcd5 100644
--- a/indra/newview/skins/default/xui/fr/floater_stats.xml
+++ b/indra/newview/skins/default/xui/fr/floater_stats.xml
@@ -10,8 +10,8 @@
</stat_view>
<stat_view label="Avancées" name="advanced">
<stat_view label="Rendu" name="render">
- <stat_bar label="KTris Drawn" name="ktrisframe"/>
- <stat_bar label="KTris Drawn" name="ktrissec"/>
+ <stat_bar label="KTris par image" name="ktrisframe"/>
+ <stat_bar label="KTris par s" name="ktrissec"/>
<stat_bar label="Objets totaux" name="objs"/>
<stat_bar label="Nouveaux objets" name="newobjs"/>
</stat_view>
@@ -32,13 +32,13 @@
<stat_bar label="Couches" name="layerskbitstat"/>
<stat_bar label="Arrivés" name="actualinkbitstat"/>
<stat_bar label="Sortis" name="actualoutkbitstat"/>
- <stat_bar label="Ops VFS en attente" name="vfspendingoperations"/>
+ <stat_bar label="Opérations VFS en attente" name="vfspendingoperations"/>
</stat_view>
</stat_view>
<stat_view label="Simulateur" name="sim">
<stat_bar label="Dilatation temporelle" name="simtimedilation"/>
<stat_bar label="FPS sim" name="simfps"/>
- <stat_bar label="Propriétés physiques FPS" name="simphysicsfps"/>
+ <stat_bar label="FPS physique" name="simphysicsfps"/>
<stat_view label="Détails des propriétés physiques" name="physicsdetail">
<stat_bar label="Objets fixés" name="physicspinnedtasks"/>
<stat_bar label="Objets LOD faibles" name="physicslodtasks"/>
@@ -53,17 +53,25 @@
<stat_bar label="Événements de scripts" name="simscripteps"/>
<stat_bar label="Paquets en entrée" name="siminpps"/>
<stat_bar label="Paquets en sortie" name="simoutpps"/>
- <stat_bar label="En attente des téléchargements" name="simpendingdownloads"/>
- <stat_bar label="En attente des chargements" name="simpendinguploads"/>
+ <stat_bar label="Téléchargements en attente" name="simpendingdownloads"/>
+ <stat_bar label="Chargements en attente" name="simpendinguploads"/>
<stat_bar label="Total Unacked Bytes" name="simtotalunackedbytes"/>
<stat_view label="Temps (ms)" name="simperf">
- <stat_bar label="Durée du cadre totale" name="simframemsec"/>
+ <stat_bar label="Durée totale de l'image" name="simframemsec"/>
<stat_bar label="Durée nette" name="simnetmsec"/>
- <stat_bar label="Durée physique" name="simsimphysicsmsec"/>
- <stat_bar label="Durée de la simulation" name="simsimothermsec"/>
- <stat_bar label="Durée de l&apos;avatar" name="simagentmsec"/>
+ <stat_bar label="Durée sim (physique)" name="simsimphysicsmsec"/>
+ <stat_bar label="Durée sim (autre)" name="simsimothermsec"/>
+ <stat_bar label="Durée des avatars" name="simagentmsec"/>
<stat_bar label="Durée des images" name="simimagesmsec"/>
- <stat_bar label="Durée du script" name="simscriptmsec"/>
+ <stat_bar label="Durée des scripts" name="simscriptmsec"/>
+ <stat_bar label="Temps d&apos;inactivité" name="simsparemsec"/>
+ <stat_view label="Détails Temps (ms)" name="timedetails">
+ <stat_bar label="Etape propr. physiques" name="simsimphysicsstepmsec"/>
+ <stat_bar label="Mettre à jour les formes phys" name="simsimphysicsshapeupdatemsec"/>
+ <stat_bar label="Propriétés physiques Autre" name="simsimphysicsothermsec"/>
+ <stat_bar label="Temps de sommeil" name="simsleepmsec"/>
+ <stat_bar label="Pump IO" name="simpumpiomsec"/>
+ </stat_view>
</stat_view>
</stat_view>
</container_view>
diff --git a/indra/newview/skins/default/xui/fr/floater_tools.xml b/indra/newview/skins/default/xui/fr/floater_tools.xml
index bf687c412b..af5678ff0e 100644
--- a/indra/newview/skins/default/xui/fr/floater_tools.xml
+++ b/indra/newview/skins/default/xui/fr/floater_tools.xml
@@ -25,10 +25,10 @@
Cliquez et faites glisser pour sélectionner le terrain.
</floater.string>
<floater.string name="status_selectcount">
- [OBJ_COUNT] objets ( [PRIM_COUNT] prims[PE_STRING] ) sélectionnés
+ [OBJ_COUNT] objets sélectionnés, impact sur le terrain [LAND_IMPACT]
</floater.string>
- <floater.string name="status_selectprimequiv">
- , équiv. prims de [SEL_WEIGHT]
+ <floater.string name="status_remaining_capacity">
+ Capacité restante [LAND_CAPACITY].
</floater.string>
<button label="" label_selected="" name="button focus" tool_tip="Mise au point"/>
<button label="" label_selected="" name="button move" tool_tip="Déplacer"/>
@@ -105,8 +105,8 @@
<text name="selection_empty">
Aucune sélection effectuée.
</text>
- <text name="selection_weight">
- Poids physique [PHYS_WEIGHT], Coût de rendu [DISP_WEIGHT].
+ <text name="remaining_capacity">
+ [CAPACITY_STRING] [secondlife:///app/openfloater/object_weights Plus d'infos]
</text>
<tab_container name="Object Info Tabs">
<panel label="Général" name="General">
@@ -319,7 +319,6 @@
Type de raccord
</text>
<combo_box name="sculpt type control">
- <combo_box.item label="(aucun)" name="None"/>
<combo_box.item label="Sphère" name="Sphere"/>
<combo_box.item label="Tore" name="Torus"/>
<combo_box.item label="Plan" name="Plane"/>
diff --git a/indra/newview/skins/default/xui/fr/floater_toybox.xml b/indra/newview/skins/default/xui/fr/floater_toybox.xml
new file mode 100644
index 0000000000..f99d3d30b5
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/floater_toybox.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Toybox" title="BOUTONS DES BARRES D&apos;OUTILS">
+ <text name="toybox label 1">
+ Ajouter ou supprimer des boutons : les faire glisser vers ou depuis les barres d&apos;outils.
+ </text>
+ <text name="toybox label 2">
+ Ils s&apos;afficheront comme indiqué ou comme des icônes, selon les paramètres de barre d&apos;outils.
+ </text>
+ <button label="Effacer tout" label_selected="Effacer tout" name="btn_clear_all"/>
+ <button label="Valeurs par défaut" label_selected="Valeurs par défaut" name="btn_restore_defaults"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_translation_settings.xml b/indra/newview/skins/default/xui/fr/floater_translation_settings.xml
new file mode 100644
index 0000000000..c7582f110f
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/floater_translation_settings.xml
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_translation_settings" title="TRADUCTION AUTOMATIQUE">
+ <string name="bing_api_key_not_verified">
+ ID d&apos;application Bing non vérifié. Veuillez réessayer.
+ </string>
+ <string name="google_api_key_not_verified">
+ Clé d&apos;API Google non vérifiée. Veuillez réessayer.
+ </string>
+ <string name="bing_api_key_verified">
+ ID d&apos;application Bing vérifié.
+ </string>
+ <string name="google_api_key_verified">
+ Clé d&apos;API Google vérifiée.
+ </string>
+ <check_box label="Activer la traduction automatique lors des chats" name="translate_chat_checkbox"/>
+ <text name="translate_language_label">
+ Traduire les chats en :
+ </text>
+ <combo_box name="translate_language_combo">
+ <combo_box.item label="Langue système par défaut" name="System Default Language"/>
+ <combo_box.item label="English (Anglais)" name="English"/>
+ <combo_box.item label="Dansk (Danois)" name="Danish"/>
+ <combo_box.item label="Deutsch (Allemand)" name="German"/>
+ <combo_box.item label="Español (Espagnol)" name="Spanish"/>
+ <combo_box.item label="Français" name="French"/>
+ <combo_box.item label="Italiano (Italien)" name="Italian"/>
+ <combo_box.item label="Magyar (Hongrois)" name="Hungarian"/>
+ <combo_box.item label="Nederlands (Néerlandais)" name="Dutch"/>
+ <combo_box.item label="Polski (Polonais)" name="Polish"/>
+ <combo_box.item label="Português (Portugais)" name="Portugese"/>
+ <combo_box.item label="РуÑÑкий (Russe)" name="Russian"/>
+ <combo_box.item label="Türkçe (Turc)" name="Turkish"/>
+ <combo_box.item label="УкраїнÑька (Ukrainien)" name="Ukrainian"/>
+ <combo_box.item label="中文 (正體) (Chinois)" name="Chinese"/>
+ <combo_box.item label="日本語 (Japonais)" name="Japanese"/>
+ <combo_box.item label="한국어 (Coréen)" name="Korean"/>
+ </combo_box>
+ <text name="tip">
+ Choisir le service à utiliser :
+ </text>
+ <radio_group name="translation_service_rg">
+ <radio_item initial_value="bing" label="Bing Translator" name="bing"/>
+ <radio_item initial_value="google" label="Google Translate" name="google"/>
+ </radio_group>
+ <text name="bing_api_key_label">
+ [http://www.bing.com/developers/createapp.aspx ID d&apos;application] Bing :
+ </text>
+ <button label="Vérifier" name="verify_bing_api_key_btn"/>
+ <text name="google_api_key_label">
+ [http://code.google.com/apis/language/translate/v2/getting_started.html#auth Clé d&apos;API] Google :
+ </text>
+ <button label="Vérifier" name="verify_google_api_key_btn"/>
+ <text name="google_links_text">
+ [http://code.google.com/apis/language/translate/v2/pricing.html Tarification] | [https://code.google.com/apis/console Statistiques]
+ </text>
+ <button label="OK" name="ok_btn"/>
+ <button label="Annuler" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_voice_controls.xml b/indra/newview/skins/default/xui/fr/floater_voice_controls.xml
index d4f07a0a25..fc4de4a5a6 100644
--- a/indra/newview/skins/default/xui/fr/floater_voice_controls.xml
+++ b/indra/newview/skins/default/xui/fr/floater_voice_controls.xml
@@ -1,16 +1,16 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_voice_controls" title="Contrôles vocaux">
+<floater name="floater_voice_controls" title="CONTROLES DE LA VOIX">
<string name="title_nearby">
- CHAT VOCAL PRÈS DE VOUS
+ PARAMÈTRES VOCAUX
</string>
<string name="title_group">
- Appel de groupe avec [GROUP]
+ APPEL DE GROUPE AVEC [GROUP]
</string>
<string name="title_adhoc">
- Téléconférence
+ CONFÉRENCE
</string>
<string name="title_peer_2_peer">
- Appel avec [NAME]
+ APPEL AVEC [NAME]
</string>
<string name="no_one_near">
Il n&apos;y a personne près de vous avec le chat vocal activé
diff --git a/indra/newview/skins/default/xui/fr/menu_group_plus.xml b/indra/newview/skins/default/xui/fr/menu_group_plus.xml
index 0db5afedc7..ad76f11d79 100644
--- a/indra/newview/skins/default/xui/fr/menu_group_plus.xml
+++ b/indra/newview/skins/default/xui/fr/menu_group_plus.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu name="menu_group_plus">
- <menu_item_call label="Rejoindre des groupes..." name="item_join"/>
+ <menu_item_call label="Rejoindre un groupe..." name="item_join"/>
<menu_item_call label="Nouveau groupe..." name="item_new"/>
</menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_hide_navbar.xml b/indra/newview/skins/default/xui/fr/menu_hide_navbar.xml
index 20af901ddc..09c9f5084a 100644
--- a/indra/newview/skins/default/xui/fr/menu_hide_navbar.xml
+++ b/indra/newview/skins/default/xui/fr/menu_hide_navbar.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu name="hide_navbar_menu">
- <menu_item_check label="Afficher la barre de navigation" name="ShowNavbarNavigationPanel"/>
+ <menu_item_check label="Afficher la barre de navigation &amp; favoris" name="ShowNavbarNavigationPanel"/>
<menu_item_check label="Afficher la barre des favoris" name="ShowNavbarFavoritesPanel"/>
<menu_item_check label="Afficher la mini-barre d&apos;emplacement" name="ShowMiniLocationPanel"/>
</menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_inventory.xml b/indra/newview/skins/default/xui/fr/menu_inventory.xml
index 53df8d11da..403111c4de 100644
--- a/indra/newview/skins/default/xui/fr/menu_inventory.xml
+++ b/indra/newview/skins/default/xui/fr/menu_inventory.xml
@@ -71,7 +71,7 @@
<menu_item_call label="Jouer dans Second Life" name="Animation Play"/>
<menu_item_call label="Jouer localement" name="Animation Audition"/>
<menu_item_call label="Envoyer un message instantané" name="Send Instant Message"/>
- <menu_item_call label="Offrir de téléporter..." name="Offer Teleport..."/>
+ <menu_item_call label="Proposer une téléportation..." name="Offer Teleport..."/>
<menu_item_call label="Démarrer le chat conférence" name="Conference Chat"/>
<menu_item_call label="Activer" name="Activate"/>
<menu_item_call label="Désactiver" name="Deactivate"/>
diff --git a/indra/newview/skins/default/xui/fr/menu_login.xml b/indra/newview/skins/default/xui/fr/menu_login.xml
index 6b96a16e75..8210c1be51 100644
--- a/indra/newview/skins/default/xui/fr/menu_login.xml
+++ b/indra/newview/skins/default/xui/fr/menu_login.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu_bar name="Login Menu">
<menu label="Moi" name="File">
- <menu_item_call label="Préférences" name="Preferences..."/>
+ <menu_item_call label="Préférences..." name="Preferences..."/>
<menu_item_call label="Quitter [APP_NAME]" name="Quit"/>
</menu>
<menu label="Aide" name="Help">
diff --git a/indra/newview/skins/default/xui/fr/menu_people_nearby_view_sort.xml b/indra/newview/skins/default/xui/fr/menu_people_nearby_view_sort.xml
index 0aad174fbd..8bb466b8d6 100644
--- a/indra/newview/skins/default/xui/fr/menu_people_nearby_view_sort.xml
+++ b/indra/newview/skins/default/xui/fr/menu_people_nearby_view_sort.xml
@@ -5,5 +5,5 @@
<menu_item_check label="Trier par distance" name="sort_distance"/>
<menu_item_check label="Afficher les icônes des résidents" name="view_icons"/>
<menu_item_check label="Afficher la carte" name="view_map"/>
- <menu_item_call label="Afficher les résidents et les objets interdits" name="show_blocked_list"/>
+ <menu_item_call label="Afficher les résidents et les objets ignorés" name="show_blocked_list"/>
</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_toolbars.xml b/indra/newview/skins/default/xui/fr/menu_toolbars.xml
new file mode 100644
index 0000000000..f74d206d56
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/menu_toolbars.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Toolbars Popup">
+ <menu_item_call label="Supprimer ce bouton" name="Remove button"/>
+ <menu_item_call label="Boutons des barres d&apos;outils..." name="Choose Buttons"/>
+ <menu_item_check label="Icônes et libellés" name="icons_with_text"/>
+ <menu_item_check label="Icônes uniquement" name="icons_only"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_viewer.xml b/indra/newview/skins/default/xui/fr/menu_viewer.xml
index cf1dac2f3a..9303815c30 100644
--- a/indra/newview/skins/default/xui/fr/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/fr/menu_viewer.xml
@@ -1,54 +1,60 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu_bar name="Main Menu">
<menu label="Moi" name="Me">
- <menu_item_call label="Préférences" name="Preferences"/>
- <menu_item_call label="Ma Page d&apos;accueil" name="Manage My Account">
- <menu_item_call.on_click name="ManageMyAccount_url" parameter="WebLaunchJoinNow,http://secondlife.com/account/index.php?lang=fr"/>
- </menu_item_call>
- <menu_item_call label="Acheter des L$" name="Buy and Sell L$"/>
- <menu_item_call label="Mon profil" name="Profile"/>
- <menu_item_call label="Mon apparence" name="ChangeOutfit"/>
- <menu_item_check label="Mon inventaire" name="Inventory"/>
- <menu_item_check label="Mon inventaire" name="ShowSidetrayInventory"/>
- <menu_item_check label="Mes gestes" name="Gestures"/>
- <menu_item_check label="Ma voix" name="ShowVoice"/>
+ <menu_item_call label="Profil..." name="Profile"/>
+ <menu_item_call label="Apparence..." name="ChangeOutfit"/>
+ <menu_item_call label="Choisir un avatar..." name="Avatar Picker"/>
+ <menu_item_check label="Inventaire..." name="Inventory"/>
+ <menu_item_call label="Nouvelle fenêtre d&apos;inventaire" name="NewInventoryWindow"/>
+ <menu_item_call label="Endroits..." name="Places"/>
+ <menu_item_call label="Favoris..." name="Picks"/>
+ <menu_item_call label="Paramètres de la caméra..." name="Camera Controls"/>
<menu label="Déplacement" name="Movement">
<menu_item_call label="M&apos;asseoir" name="Sit Down Here"/>
<menu_item_check label="Voler" name="Fly"/>
<menu_item_check label="Toujours courir" name="Always Run"/>
<menu_item_call label="Arrêter mon animation" name="Stop Animating My Avatar"/>
</menu>
- <menu label="Mon statut" name="Status">
+ <menu label="Statut" name="Status">
<menu_item_call label="Absent" name="Set Away"/>
<menu_item_call label="Occupé" name="Set Busy"/>
</menu>
<menu_item_call label="Demander le statut Admin" name="Request Admin Options"/>
<menu_item_call label="Quitter le statut Admin" name="Leave Admin Options"/>
+ <menu_item_call label="Acheter des L$" name="Buy and Sell L$"/>
+ <menu_item_call label="Page d&apos;accueil du compte..." name="Manage My Account">
+ <menu_item_call.on_click name="ManageMyAccount_url" parameter="WebLaunchJoinNow,http://secondlife.com/account/index.php?lang=fr"/>
+ </menu_item_call>
+ <menu_item_call label="Préférences..." name="Preferences"/>
+ <menu_item_call label="Boutons des barres d&apos;outils..." name="Toolbars"/>
+ <menu_item_call label="Masquer tous les contrôles" name="Hide UI"/>
<menu_item_call label="Quitter [APP_NAME]" name="Quit"/>
</menu>
<menu label="Communiquer" name="Communicate">
- <menu_item_call label="Mes amis" name="My Friends"/>
- <menu_item_call label="Mes groupes" name="My Groups"/>
- <menu_item_check label="Chat près de moi" name="Nearby Chat"/>
- <menu_item_call label="Personnes près de moi" name="Active Speakers"/>
- <menu_item_check label="Chat vocal près de vous" name="Nearby Voice"/>
+ <menu_item_check label="Chat..." name="Nearby Chat"/>
+ <menu_item_check label="Parler" name="Speak"/>
+ <menu_item_check label="Paramètres vocaux..." name="Nearby Voice"/>
+ <menu_item_check label="Effet de voix..." name="ShowVoice"/>
+ <menu_item_check label="Gestes..." name="Gestures"/>
+ <menu_item_call label="Amis" name="My Friends"/>
+ <menu_item_call label="Groupes" name="My Groups"/>
+ <menu_item_call label="Personnes près de vous" name="Active Speakers"/>
</menu>
<menu label="Monde" name="World">
- <menu_item_check label="Mini-carte" name="Mini-Map"/>
+ <menu_item_call label="Créer un repère pour ce lieu" name="Create Landmark Here"/>
+ <menu_item_call label="Destinations..." name="Destinations"/>
<menu_item_check label="Carte du monde" name="World Map"/>
+ <menu_item_check label="Mini-carte" name="Mini-Map"/>
<menu_item_check label="Rechercher" name="Search"/>
+ <menu_item_call label="Me téléporter chez moi" name="Teleport Home"/>
+ <menu_item_call label="Définir le domicile ici" name="Set Home to Here"/>
<menu_item_call label="Photo" name="Take Snapshot"/>
- <menu_item_call label="Créer un repère pour ce lieu" name="Create Landmark Here"/>
- <menu label="Profil du lieu" name="Land">
- <menu_item_call label="Profil du lieu" name="Place Profile"/>
- <menu_item_call label="À propos du terrain" name="About Land"/>
- <menu_item_call label="Région/Domaine" name="Region/Estate"/>
- </menu>
+ <menu_item_call label="Profil du lieu" name="Place Profile"/>
+ <menu_item_call label="À propos du terrain" name="About Land"/>
+ <menu_item_call label="Région/Domaine" name="Region/Estate"/>
+ <menu_item_call label="Mes terrains..." name="My Land"/>
<menu_item_call label="Acheter ce terrain" name="Buy Land"/>
- <menu_item_call label="Mes terrains" name="My Land"/>
<menu label="Afficher" name="LandShow">
- <menu_item_check label="Contrôles de mouvement" name="Movement Controls"/>
- <menu_item_check label="Contrôles d’affichage" name="Camera Controls"/>
<menu_item_check label="Lignes d&apos;interdiction" name="Ban Lines"/>
<menu_item_check label="Balises" name="beacons"/>
<menu_item_check label="Limites du terrain" name="Property Lines"/>
@@ -57,16 +63,15 @@
<menu_item_check label="Propriétés de la parcelle" name="Parcel Properties"/>
<menu_item_check label="Menu Avancé" name="Show Advanced Menu"/>
</menu>
- <menu_item_call label="Me téléporter chez moi" name="Teleport Home"/>
- <menu_item_call label="Définir le domicile ici" name="Set Home to Here"/>
<menu label="Luminosité" name="Environment Settings">
<menu_item_call label="Aube" name="Sunrise"/>
<menu_item_call label="Milieu de journée" name="Noon"/>
<menu_item_call label="Coucher de soleil" name="Sunset"/>
<menu_item_call label="Minuit" name="Midnight"/>
+ <menu_item_call label="Utiliser les réglages de la région" name="Use Region Settings"/>
</menu>
- <menu label="Éditeur d&apos;environnement" name="Enviroment Editor">
- <menu_item_call label="Paramètres d&apos;environnement..." name="Enviroment Settings"/>
+ <menu label="Éditeur d&apos;environnement" name="Environment Editor">
+ <menu_item_call label="Paramètres d&apos;environnement..." name="Environment Settings"/>
<menu label="Préréglages de l&apos;eau" name="Water Presets">
<menu_item_call label="Nouveau préréglage..." name="new_water_preset"/>
<menu_item_call label="Modifier un préréglage..." name="edit_water_preset"/>
@@ -139,13 +144,14 @@
<menu_item_call label="Animation ([COST] L$)..." name="Upload Animation"/>
<menu_item_call label="Modèle..." name="Upload Model"/>
<menu_item_call label="Lot ([COST] L$ par fichier)..." name="Bulk Upload"/>
+ <menu_item_call label="Définir les droits de chargement par défaut" name="perm prefs"/>
</menu>
<menu_item_call label="Annuler" name="Undo"/>
<menu_item_call label="Refaire" name="Redo"/>
</menu>
<menu label="Aide" name="Help">
+ <menu_item_call label="Aide rapide..." name="How To"/>
<menu_item_call label="Aide de [SECOND_LIFE]" name="Second Life Help"/>
- <menu_item_check label="Activer les astuces" name="Enable Hints"/>
<menu_item_call label="Signaler une infraction" name="Report Abuse"/>
<menu_item_call label="Signaler un bug" name="Report Bug"/>
<menu_item_call label="À propos de [APP_NAME]" name="About Second Life"/>
@@ -161,7 +167,7 @@
<menu label="Outils de performance" name="Performance Tools">
<menu_item_call label="Mesure du lag" name="Lag Meter"/>
<menu_item_check label="Barre de statistiques" name="Statistics Bar"/>
- <menu_item_check label="Afficher le coût de rendu de l&apos;avatar" name="Avatar Rendering Cost"/>
+ <menu_item_check label="Afficher le poids de dessin pour les avatars" name="Avatar Rendering Cost"/>
</menu>
<menu label="Surbrillance et visibilité" name="Highlighting and Visibility">
<menu_item_check label="Balise animée" name="Cheesy Beacon"/>
@@ -199,11 +205,10 @@
<menu_item_check label="Utiliser le thread de lecture de plug-in" name="Use Plugin Read Thread"/>
<menu_item_call label="Effacer le cache du groupe" name="ClearGroupCache"/>
<menu_item_check label="Effet de lissage de la souris" name="Mouse Smoothing"/>
+ <menu_item_call label="Libérer les touches" name="Release Keys"/>
<menu label="Raccourcis" name="Shortcuts">
<menu_item_call label="Image ([COST] L$)..." name="Upload Image"/>
<menu_item_check label="Rechercher" name="Search"/>
- <menu_item_call label="Relâcher les touches" name="Release Keys"/>
- <menu_item_call label="Taille de l&apos;interface par défaut" name="Set UI Size to Default"/>
<menu_item_check label="Afficher le menu Avancé - raccourci existant" name="Show Advanced Menu - legacy shortcut"/>
<menu_item_call label="Fermer la fenêtre" name="Close Window"/>
<menu_item_call label="Fermer toutes les fenêtres" name="Close All Windows"/>
@@ -289,6 +294,8 @@
<menu_item_check label="Lumières" name="Lights"/>
<menu_item_check label="Squelette de collision" name="Collision Skeleton"/>
<menu_item_check label="Rayons" name="Raycast"/>
+ <menu_item_check label="Vecteurs de vent" name="Wind Vectors"/>
+ <menu_item_check label="Complexité du rendu" name="rendercomplexity"/>
<menu_item_check label="Sculpture" name="Sculpt"/>
</menu>
<menu label="Rendu" name="Rendering">
@@ -300,7 +307,6 @@
<menu_item_check label="Éclairage et ombres" name="Lighting and Shadows"/>
<menu_item_check label="Ombres du soleil/de la lune/des projecteurs" name="Shadows from Sun/Moon/Projectors"/>
<menu_item_check label="SSAO et lissage des ombres" name="SSAO and Shadow Smoothing"/>
- <menu_item_check label="Illumination globale (expérimental)" name="Global Illumination"/>
<menu_item_check label="Débogage GL" name="Debug GL"/>
<menu_item_check label="Débogage pipeline" name="Debug Pipeline"/>
<menu_item_check label="Masques alpha automatiques (différés)" name="Automatic Alpha Masks (deferred)"/>
@@ -318,7 +324,7 @@
<menu_item_check label="Pauser l&apos;avatar" name="AgentPause"/>
<menu_item_call label="Activer le journal des messages" name="Enable Message Log"/>
<menu_item_call label="Désactiver le journal des messages" name="Disable Message Log"/>
- <menu_item_check label="Velocity Interpolate Objects" name="Velocity Interpolate Objects"/>
+ <menu_item_check label="Objets d&apos;interpolation de vitesse" name="Velocity Interpolate Objects"/>
<menu_item_check label="Interpolation ping des positions des objets" name="Ping Interpolate Object Positions"/>
<menu_item_call label="Abandonner un paquet" name="Drop a Packet"/>
</menu>
@@ -335,7 +341,7 @@
<menu_item_check label="Ignorer les paramètres du soleil de la sim" name="Sim Sun Override"/>
<menu_item_check label="Balise animée" name="Cheesy Beacon"/>
<menu_item_check label="Météo fixe" name="Fixed Weather"/>
- <menu_item_call label="Dump Region Object Cache" name="Dump Region Object Cache"/>
+ <menu_item_call label="Vidage de cache d&apos;objet de la région" name="Dump Region Object Cache"/>
</menu>
<menu label="Interface" name="UI">
<menu_item_call label="Test du navigateur de médias" name="Web Browser Test"/>
diff --git a/indra/newview/skins/default/xui/fr/notifications.xml b/indra/newview/skins/default/xui/fr/notifications.xml
index 1389c49f5b..2f9bf23bc4 100644
--- a/indra/newview/skins/default/xui/fr/notifications.xml
+++ b/indra/newview/skins/default/xui/fr/notifications.xml
@@ -980,7 +980,7 @@ Proposer à [NAME] de devenir votre ami(e) ?
</form>
</notification>
<notification name="RemoveFromFriends">
- Voulez-vous supprimer [NAME] de votre liste d&apos;amis ?
+ Voulez-vous supprimer &lt;nolink&gt;[NAME]&lt;/nolink&gt; de votre liste d&apos;amis ?
<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
</notification>
<notification name="RemoveMultipleFromFriends">
@@ -1105,8 +1105,13 @@ Céder ces [AREA] m² de terrain au groupe [GROUP_NAME] ?
<notification name="DisplaySetToSafe">
Les paramètres d&apos;affichage sont au niveau le plus sûr, comme vous l&apos;aviez indiqué.
</notification>
- <notification name="DisplaySetToRecommended">
- Vos paramètres d&apos;affichage ont été réglés avec une marge de sécurité en fonction de votre configuration système.
+ <notification name="DisplaySetToRecommendedGPUChange">
+ Les paramètres d&apos;affichage ont été modifiés selon les niveaux recommandés car votre carte graphique
+[LAST_GPU] a été remplacée
+par une carte [THIS_GPU].
+ </notification>
+ <notification name="DisplaySetToRecommendedFeatureChange">
+ Les paramètres d&apos;affichage ont été modifiés selon les niveaux recommandés en raison d&apos;un changement relatif au sous-système de rendu.
</notification>
<notification name="ErrorMessage">
[ERROR_MESSAGE]
@@ -1428,7 +1433,7 @@ Version [VERSION]
<usetemplate ignoretext="Confirmer avant de rendre les objets à leurs propriétaires" name="okcancelignore" notext="Annuler" yestext="OK"/>
</notification>
<notification name="GroupLeaveConfirmMember">
- Vous êtes actuellement membre du groupe [GROUP].
+ Vous êtes actuellement membre du groupe &lt;nolink&gt;[GROUP]&lt;/nolink&gt;.
Quitter le groupe ?
<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
</notification>
@@ -1909,6 +1914,18 @@ Déplacer les objets de l&apos;inventaire ?
Êtes-vous certain de vouloir quitter ?
<usetemplate ignoretext="Confirmer avant de quitter" name="okcancelignore" notext="Ne pas quitter" yestext="Quitter"/>
</notification>
+ <notification name="ConfirmRestoreToybox">
+ Cette action rétablira vos boutons et barres d&apos;outils par défaut.
+
+Vous ne pouvez pas l&apos;annuler.
+ <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmClearAllToybox">
+ Cette action replacera tous les boutons dans la boîte à outils de sorte que vos barres d&apos;outils seront vides.
+
+Vous ne pouvez pas l&apos;annuler.
+ <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
+ </notification>
<notification name="DeleteItems">
[QUESTION]
<usetemplate ignoretext="Confirmer avant de supprimer des articles" name="okcancelignore" notext="Annuler" yestext="OK"/>
@@ -2113,10 +2130,10 @@ Cette opération lancera votre navigateur Web.
Sujet : [SUBJECT], Message : [MESSAGE]
</notification>
<notification name="FriendOnline">
- [NAME] est en ligne
+ &lt;nolink&gt;[NAME]&lt;/nolink&gt; est en ligne
</notification>
<notification name="FriendOffline">
- [NAME] est hors ligne
+ &lt;nolink&gt;[NAME]&lt;/nolink&gt; est hors ligne
</notification>
<notification name="AddSelfFriend">
Même si vous êtes extrêmement sympathique, vous ne pouvez pas devenir ami avec vous-même.
@@ -2230,14 +2247,16 @@ Veuillez sélectionner un seul objet.
Votre carte de visite a été refusée.
</notification>
<notification name="TeleportToLandmark">
- Vous pouvez vous téléporter vers des endroits comme [NAME] en ouvrant le panneau Lieux sur le côté droit de votre écran, puis en sélectionnant l&apos;onglet Repères.
-Cliquez sur le repère de votre choix pour le sélectionner, puis sur Téléporter en bas du panneau.
-(Vous pouvez aussi double-cliquer sur le repère ou cliquer dessus avec le bouton droit de la souris et sélectionner Téléporter.)
+ Pour vous téléporter vers un lieu tel que [NAME], cliquez sur le bouton Endroits,
+ puis sélectionnez l&apos;onglet Repères dans la fenêtre qui s&apos;ouvre. Cliquez sur n&apos;importe quel
+ repère pour le sélectionner, puis sur Téléportation en bas de la fenêtre.
+ (Vous pouvez aussi double-cliquer sur le repère ou cliquer-droit dessus et
+ choisir Téléportation).
</notification>
<notification name="TeleportToPerson">
- Vous pouvez contacter des résidents comme [NAME] en ouvrant le panneau Résidents sur le côté droit de votre écran.
-Sélectionnez le résident de votre choix dans la liste, puis cliquez sur IM en bas du panneau.
-(Vous pouvez aussi double-cliquer sur le nom du résident dans la liste ou cliquer dessus avec le bouton droit de la souris et sélectionner IM.)
+ Pour contacter un résident tel que [NAME], cliquez sur le bouton Personnes, sélectionnez le résident dans la fenêtre qui s&apos;ouvre, puis cliquez sur IM en
+ bas de la fenêtre.
+ (Vous pouvez aussi double-cliquer sur le nom du résident dans la liste ou cliquer-droit dessus et choisir IM.)
</notification>
<notification name="CantSelectLandFromMultipleRegions">
Vous ne pouvez pas sélectionner de terrain en dehors des limites du serveur.
@@ -2258,6 +2277,9 @@ Veuillez sélectionner un terrain plus petit.
<notification name="PaymentSent">
[MESSAGE]
</notification>
+ <notification name="PaymentFailure">
+ [MESSAGE]
+ </notification>
<notification name="EventNotification">
Avis d&apos;événement :
@@ -2512,10 +2534,10 @@ Veuillez réessayer dans quelques minutes.
</form>
</notification>
<notification name="FriendshipAccepted">
- [NAME] a accepté votre amitié.
+ &lt;nolink&gt;[NAME]&lt;/nolink&gt; a accepté votre amitié.
</notification>
<notification name="FriendshipDeclined">
- [NAME] a refusé votre amitié.
+ &lt;nolink&gt;[NAME]&lt;/nolink&gt; a refusé votre amitié.
</notification>
<notification name="FriendshipAcceptedByMe">
Amitié acceptée.
@@ -2792,7 +2814,7 @@ Voir le fichier journal pour plus de détails.
avec les résidents suivants :
[RESIDENTS] ?
- <usetemplate name="okcancelbuttons" notext="Annuler" yestext="Ok"/>
+ <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
</notification>
<notification name="ItemsShared">
Articles partagés.
@@ -2882,7 +2904,7 @@ Les résidents rejoignant l&apos;appel ultérieurement seront également
ignorés, même si vous quittez l&apos;appel.
Ignorer les autres ?
- <usetemplate ignoretext="Confirmer avant d&apos;ignorer les autres lors d&apos;un appel de groupe" name="okcancelignore" notext="Annuler" yestext="Ok"/>
+ <usetemplate ignoretext="Confirmer avant d&apos;ignorer les autres lors d&apos;un appel de groupe" name="okcancelignore" notext="Annuler" yestext="OK"/>
</notification>
<notification label="Chat" name="HintChat">
Pour participer à la conversation, saisissez du texte dans le champ de chat situé en dessous.
@@ -2995,10 +3017,6 @@ Cliquez sur un point dans le monde et faites glisser votre souris pour faire tou
<button name="cancel" text="Annuler"/>
</form>
</notification>
- <notification label="" name="ModeChange">
- Vous devez quitter et redémarrer l&apos;application afin de changer de mode.
- <usetemplate name="okcancelbuttons" notext="Ne pas quitter" yestext="Quitter"/>
- </notification>
<notification label="" name="NoClassifieds">
Pour créer et modifier des petites annonces, vous devez utiliser le mode Avancé. Voulez-vous quitter l&apos;application afin de changer de mode ? Le sélecteur de mode se trouve sur l&apos;écran de connexion.
<usetemplate name="okcancelbuttons" notext="Ne pas quitter" yestext="Quitter"/>
@@ -3043,6 +3061,10 @@ Cliquez sur un point dans le monde et faites glisser votre souris pour faire tou
La recherche est uniquement disponible en mode Avancé. Voulez-vous quitter l&apos;application afin de changer de mode ?
<usetemplate name="okcancelbuttons" notext="Ne pas quitter" yestext="Quitter"/>
</notification>
+ <notification label="" name="ConfirmHideUI">
+ Cette action masquera tous les boutons et articles de menu. Pour les récupérer, cliquez de nouveau sur [SHORTCUT].
+ <usetemplate ignoretext="Confirmer avant de masquer l&apos;interface" name="okcancelignore" notext="Annuler" yestext="OK"/>
+ </notification>
<global name="UnsupportedGLRequirements">
Vous semblez ne pas avoir le matériel requis pour utiliser [APP_NAME]. [APP_NAME] requiert une carte graphique OpenGL avec une prise en charge du multitexturing. Si vous avez une telle carte, assurez-vous que vous avez aussi les pilotes les plus récents pour la carte, ainsi que les service packs et les patchs pour votre système d&apos;exploitation.
diff --git a/indra/newview/skins/default/xui/fr/panel_chiclet_bar.xml b/indra/newview/skins/default/xui/fr/panel_chiclet_bar.xml
new file mode 100644
index 0000000000..de21996404
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_chiclet_bar.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="chiclet_bar">
+ <layout_stack name="toolbar_stack">
+ <layout_panel name="im_well_panel">
+ <chiclet_im_well name="im_well">
+ <button name="Unread IM messages" tool_tip="Conversations"/>
+ </chiclet_im_well>
+ </layout_panel>
+ <layout_panel name="notification_well_panel">
+ <chiclet_notification name="notification_well">
+ <button name="Unread" tool_tip="Notifications"/>
+ </chiclet_notification>
+ </layout_panel>
+ </layout_stack>
+</panel>
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 9640adcdf8..f5f2738319 100644
--- a/indra/newview/skins/default/xui/fr/panel_edit_skin.xml
+++ b/indra/newview/skins/default/xui/fr/panel_edit_skin.xml
@@ -1,9 +1,9 @@
<?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" width="76"/>
- <texture_picker label="Tatouage haut" name="Upper Tattoos" tool_tip="Cliquez pour sélectionner une image" width="80"/>
- <texture_picker label="Tatouage bas" name="Lower Tattoos" tool_tip="Cliquez pour sélectionner une image"/>
+ <texture_picker label="Tête" name="Head" tool_tip="Cliquer pour sélectionner une image."/>
+ <texture_picker label="Haut du corps" name="Upper Body" tool_tip="Cliquer pour sélectionner une image."/>
+ <texture_picker label="Bas du corps" name="Lower Body" tool_tip="Cliquer pour sélectionner une image."/>
</panel>
<panel name="accordion_panel">
<accordion name="wearable_accordion">
diff --git a/indra/newview/skins/default/xui/fr/panel_me.xml b/indra/newview/skins/default/xui/fr/panel_me.xml
index 219e5801f2..5676986228 100644
--- a/indra/newview/skins/default/xui/fr/panel_me.xml
+++ b/indra/newview/skins/default/xui/fr/panel_me.xml
@@ -1,7 +1,4 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Mon profil" name="panel_me">
- <tab_container name="tabs">
- <panel label="MON PROFIL" name="panel_profile"/>
- <panel label="MES FAVORIS" name="panel_picks"/>
- </tab_container>
+ <panel label="MES FAVORIS" name="panel_picks"/>
</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_my_profile.xml b/indra/newview/skins/default/xui/fr/panel_my_profile.xml
deleted file mode 100644
index 5207c5a28e..0000000000
--- a/indra/newview/skins/default/xui/fr/panel_my_profile.xml
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Profil" name="panel_profile">
- <string name="CaptionTextAcctInfo">
- [ACCTTYPE]
-[PAYMENTINFO] [AGEVERIFICATION]
- </string>
- <string name="payment_update_link_url">
- http://www.secondlife.com/account/billing.php?lang=en
- </string>
- <string name="partner_edit_link_url">
- http://www.secondlife.com/account/partners.php?lang=en
- </string>
- <string name="my_account_link_url" value="http://secondlife.com/account"/>
- <string name="no_partner_text" value="Aucun"/>
- <string name="no_group_text" value="Aucun"/>
- <string name="RegisterDateFormat">
- [REG_DATE] ([AGE])
- </string>
- <string name="name_text_args">
- [NAME]
- </string>
- <string name="display_name_text_args">
- [DISPLAY_NAME]
- </string>
- <layout_stack name="layout">
- <layout_panel name="profile_stack">
- <scroll_container name="profile_scroll">
- <panel name="scroll_content_panel">
- <panel name="second_life_image_panel">
- <text name="display_name_descr_text">
- Nom d&apos;utilisateur
- </text>
- <text name="name_descr_text">
- Nom d&apos;affichage
- </text>
- <button label="Profil" name="see_profile_btn" tool_tip="Afficher le profil de cet avatar."/>
- </panel>
- </panel>
- </scroll_container>
- </layout_panel>
- </layout_stack>
-</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_navigation_bar.xml b/indra/newview/skins/default/xui/fr/panel_navigation_bar.xml
index 45caf2323d..ecb1e9813a 100644
--- a/indra/newview/skins/default/xui/fr/panel_navigation_bar.xml
+++ b/indra/newview/skins/default/xui/fr/panel_navigation_bar.xml
@@ -1,18 +1,23 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="navigation_bar">
- <panel name="navigation_panel">
- <pull_button name="back_btn" tool_tip="Revenir à l&apos;emplacement précédent"/>
- <pull_button name="forward_btn" tool_tip="Avancer d&apos;un emplacement"/>
- <button name="home_btn" tool_tip="Me téléporter jusqu&apos;à mon domicile"/>
- <location_input label="Emplacement" name="location_combo"/>
- <search_combo_box label="Rechercher" name="search_combo_box" tool_tip="Rechercher">
- <combo_editor label="Rechercher dans [SECOND_LIFE]" name="search_combo_editor"/>
- </search_combo_box>
- </panel>
- <favorites_bar name="favorite" tool_tip="Faites glisser des repères ici pour un accès rapide à vos lieux favoris dans Second Life.">
- <label name="favorites_bar_label" tool_tip="Faites glisser des repères ici pour un accès rapide à vos lieux favoris dans Second Life.">
- Favoris
- </label>
- <chevron_button name="&gt;&gt;" tool_tip="Afficher d&apos;avantage de Favoris"/>
- </favorites_bar>
+ <layout_stack name="nvp_stack">
+ <layout_panel name="navigation_layout_panel">
+ <panel name="navigation_panel">
+ <pull_button name="back_btn" tool_tip="Revenir à l’emplacement précédent"/>
+ <pull_button name="forward_btn" tool_tip="Avancer d’un emplacement"/>
+ <button name="home_btn" tool_tip="Me téléporter jusqu’à mon domicile"/>
+ <location_input label="Endroit" name="location_combo"/>
+ </panel>
+ </layout_panel>
+ <layout_panel name="favorites_layout_panel">
+ <favorites_bar name="favorite" tool_tip="Faites glisser des repères ici pour un accès rapide à vos lieux favoris dans Second Life.">
+ <label name="favorites_bar_label" tool_tip="Faites glisser des repères ici pour un accès rapide à vos endroits favoris dans Second Life.">
+ Barre des Favoris
+ </label>
+ <more_button name="&gt;&gt;" tool_tip="Afficher d&apos;avantage de Favoris">
+ Plus â–¼
+ </more_button>
+ </favorites_bar>
+ </layout_panel>
+ </layout_stack>
</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_nearby_chat.xml b/indra/newview/skins/default/xui/fr/panel_nearby_chat.xml
new file mode 100644
index 0000000000..00bd6e81ae
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_nearby_chat.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="nearby_chat">
+ <check_box label="Traduire le chat" name="translate_chat_checkbox"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_notes.xml b/indra/newview/skins/default/xui/fr/panel_notes.xml
deleted file mode 100644
index 1b44bc4b73..0000000000
--- a/indra/newview/skins/default/xui/fr/panel_notes.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Notes/Perso" name="panel_notes">
- <layout_stack name="layout">
- <layout_panel name="notes_stack">
- <scroll_container name="profile_scroll">
- <panel name="profile_scroll_panel">
- <text name="status_message" value="Mes notes perso :"/>
- <text name="status_message2" value="Autoriser cette personne à :"/>
- <check_box label="Afficher mon statut en ligne" name="status_check"/>
- <check_box label="Me situer sur la carte" name="map_check"/>
- <check_box label="Modifier, supprimer ou prendre mes objets" name="objects_check"/>
- </panel>
- </scroll_container>
- </layout_panel>
- <layout_panel name="notes_buttons_panel">
- <layout_stack name="bottom_bar_ls">
- <layout_panel name="add_friend_btn_lp">
- <button label="Devenir amis" name="add_friend" tool_tip="Proposer à ce résident de devenir votre ami"/>
- </layout_panel>
- <layout_panel name="im_btn_lp">
- <button label="IM" name="im" tool_tip="Ouvrir une session IM"/>
- </layout_panel>
- <layout_panel name="call_btn_lp">
- <button label="Appeler" name="call" tool_tip="Appeler ce résident"/>
- </layout_panel>
- <layout_panel name="show_on_map_btn_lp">
- <button label="Carte" name="show_on_map_btn" tool_tip="Afficher le résident sur la carte"/>
- </layout_panel>
- <layout_panel name="teleport_btn_lp">
- <button label="Téléporter" name="teleport" tool_tip="Proposer une téléportation"/>
- </layout_panel>
- </layout_stack>
- </layout_panel>
- </layout_stack>
-</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_postcard_message.xml b/indra/newview/skins/default/xui/fr/panel_postcard_message.xml
new file mode 100644
index 0000000000..0f8397cfb4
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_postcard_message.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_postcard_message">
+ <text name="to_label">
+ À :
+ </text>
+ <text name="name_label">
+ De :
+ </text>
+ <text name="subject_label">
+ Objet :
+ </text>
+ <line_editor label="Saisir ici votre objet" name="subject_form"/>
+ <text name="msg_label">
+ Message :
+ </text>
+ <text_editor name="msg_form">
+ Saisir ici votre message
+ </text_editor>
+ <button label="Annuler" name="cancel_btn"/>
+ <button label="Envoyer" name="send_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_postcard_settings.xml b/indra/newview/skins/default/xui/fr/panel_postcard_settings.xml
new file mode 100644
index 0000000000..6f4e9c23f9
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_postcard_settings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_postcard_settings">
+ <combo_box label="Résolution" name="postcard_size_combo">
+ <combo_box.item label="Fenêtre actuelle" name="CurrentWindow"/>
+ <combo_box.item label="640 x 480" name="640x480"/>
+ <combo_box.item label="800 x 600" name="800x600"/>
+ <combo_box.item label="1 024 x 768" name="1024x768"/>
+ <combo_box.item label="Personnalisée" name="Custom"/>
+ </combo_box>
+ <layout_stack name="postcard_image_params_ls">
+ <layout_panel name="postcard_image_size_lp">
+ <spinner label="Largeur" name="postcard_snapshot_width"/>
+ <spinner label="Hauteur" name="postcard_snapshot_height"/>
+ <check_box label="Conserver les proportions" name="postcard_keep_aspect_check"/>
+ </layout_panel>
+ <layout_panel name="postcard_image_format_quality_lp">
+ <slider label="Qualité de l&apos;image" name="image_quality_slider"/>
+ <text name="image_quality_level">
+ ([QLVL])
+ </text>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_chat.xml b/indra/newview/skins/default/xui/fr/panel_preferences_chat.xml
index e9e6e6350f..76ed237451 100644
--- a/indra/newview/skins/default/xui/fr/panel_preferences_chat.xml
+++ b/indra/newview/skins/default/xui/fr/panel_preferences_chat.xml
@@ -8,7 +8,7 @@
<radio_item label="Moyenne" name="radio2" value="1"/>
<radio_item label="Grande" name="radio3" value="2"/>
</radio_group>
- <check_box initial_value="true" label="Jouer l&apos;animation clavier quand vous écrivez" name="play_typing_animation"/>
+ <check_box initial_value="true" label="Exécuter l&apos;animation clavier quand vous écrivez" name="play_typing_animation"/>
<check_box label="M&apos;envoyer les IM par e-mail une fois déconnecté" name="send_im_to_email"/>
<check_box label="Activer l&apos;historique des chats et des IM en texte brut" name="plain_text_chat_history"/>
<check_box label="Bulles de chat" name="bubble_text_chat"/>
@@ -29,30 +29,5 @@
<check_box label="Chats IM" name="EnableIMChatPopups" tool_tip="Cocher cette case pour qu&apos;un popup s&apos;affiche à réception d&apos;un message instantané."/>
<spinner label="Durée de vie du popup Chat près de moi :" name="nearby_toasts_lifetime"/>
<spinner label="Disparition progressive du popup Chat près de moi :" name="nearby_toasts_fadingtime"/>
- <check_box name="translate_chat_checkbox"/>
- <text name="translate_chb_label">
- Utiliser la traduction automatique lors des chats (fournie par Google)
- </text>
- <text name="translate_language_text">
- Traduire le chat en :
- </text>
- <combo_box name="translate_language_combobox">
- <combo_box.item label="Choix par défaut" name="System Default Language"/>
- <combo_box.item label="English (Anglais)" name="English"/>
- <combo_box.item label="Dansk (Danois)" name="Danish"/>
- <combo_box.item label="Deutsch (Allemand)" name="German"/>
- <combo_box.item label="Español (Espagnol)" name="Spanish"/>
- <combo_box.item label="Français" name="French"/>
- <combo_box.item label="Italiano (Italien)" name="Italian"/>
- <combo_box.item label="Magyar (Hongrois)" name="Hungarian"/>
- <combo_box.item label="Nederlands (Néerlandais)" name="Dutch"/>
- <combo_box.item label="Polski (Polonais)" name="Polish"/>
- <combo_box.item label="Português (Portugais)" name="Portugese"/>
- <combo_box.item label="РуÑÑкий (Russe)" name="Russian"/>
- <combo_box.item label="Türkçe (Turc)" name="Turkish"/>
- <combo_box.item label="УкраїнÑька (Ukrainien)" name="Ukrainian"/>
- <combo_box.item label="中文 (简体) (Chinois)" name="Chinese"/>
- <combo_box.item label="日本語 (Japonais)" name="Japanese"/>
- <combo_box.item label="한국어 (Coréen)" name="Korean"/>
- </combo_box>
+ <button label="Traduction automatique" name="ok_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_general.xml b/indra/newview/skins/default/xui/fr/panel_preferences_general.xml
index 2786798173..66b84af3aa 100644
--- a/indra/newview/skins/default/xui/fr/panel_preferences_general.xml
+++ b/indra/newview/skins/default/xui/fr/panel_preferences_general.xml
@@ -11,10 +11,12 @@
<combo_box.item label="Español (Espagnol) - Bêta" name="Spanish"/>
<combo_box.item label="Français - Bêta" name="French"/>
<combo_box.item label="Italiano (Italien) - Bêta" name="Italian"/>
- <combo_box.item label="Nederlands (Néerlandais) - Bêta" name="Dutch"/>
<combo_box.item label="Polski (Polonais) - Bêta" name="Polish"/>
<combo_box.item label="Português (Portugais) - Bêta" name="Portugese"/>
+ <combo_box.item label="РуÑÑкий (Russe) - Bêta" name="Russian"/>
+ <combo_box.item label="Türkçe (Turc) - Bêta" name="Turkish"/>
<combo_box.item label="日本語 (Japonais) - Bêta" name="(Japanese)"/>
+ <combo_box.item label="正體中文 (Chinois traditionnel) - Bêta" name="Traditional Chinese"/>
</combo_box>
<text name="language_textbox2">
(redémarrage requis)
@@ -49,7 +51,6 @@
<check_box label="Titres de groupe" name="show_all_title_checkbox1" tool_tip="Afficher les titres de groupe, comme Officier ou Membre."/>
<check_box label="Mettre mes amis en surbrillance" name="show_friends" tool_tip="Mettre en surbrillance l&apos;affichage des noms de vos amis."/>
<check_box label="Voir les noms d&apos;affichage" name="display_names_check" tool_tip="Cocher pour utiliser les noms d&apos;affichage dans les chats, les IM, l&apos;affichage des noms, etc."/>
- <check_box label="Activer les astuces de l&apos;interface" name="viewer_hints_check"/>
<text name="inworld_typing_rg_label">
Appuyer sur les touches lettre :
</text>
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 5bf2ef72f5..a738b2d43f 100644
--- a/indra/newview/skins/default/xui/fr/panel_preferences_graphics1.xml
+++ b/indra/newview/skins/default/xui/fr/panel_preferences_graphics1.xml
@@ -51,7 +51,7 @@
<combo_box.item label="Tous les objets et avatars" name="3"/>
<combo_box.item label="Tout" name="4"/>
</combo_box>
- <slider label="Propriétés physiques de l&apos;avatar :" name="AvatarPhysicsDetail"/>
+ <slider label="Prop. physiques avatar :" name="AvatarPhysicsDetail"/>
<text name="AvatarPhysicsDetailText">
Faible
</text>
@@ -102,8 +102,8 @@
Rendu du terrain :
</text>
<radio_group name="TerrainDetailRadio">
- <radio_item label="Bas" name="0"/>
- <radio_item label="Haut" name="2"/>
+ <radio_item label="Faible" name="0"/>
+ <radio_item label="Élevé" name="2"/>
</radio_group>
--&gt;
</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_move.xml b/indra/newview/skins/default/xui/fr/panel_preferences_move.xml
index 5f1b206a39..94d7322b22 100644
--- a/indra/newview/skins/default/xui/fr/panel_preferences_move.xml
+++ b/indra/newview/skins/default/xui/fr/panel_preferences_move.xml
@@ -7,18 +7,33 @@
</text>
<check_box label="Construire/Modifier" name="edit_camera_movement" tool_tip="Utiliser le positionnement automatique de la caméra lorsque vous entrez en mode de modification et le quittez."/>
<check_box label="Apparence" name="appearance_camera_movement" tool_tip="Utiliser le positionnement automatique de la caméra en mode de modification."/>
- <check_box initial_value="true" label="Panneau latéral" name="appearance_sidebar_positioning" tool_tip="Utiliser le positionnement automatique de la caméra pour le panneau latéral."/>
+ <text name="keyboard_lbl">
+ Clavier :
+ </text>
+ <check_box label="Les touches de direction me font toujours me déplacer" name="arrow_keys_move_avatar_check"/>
+ <check_box label="Appuyer deux fois et maintenir enfoncé pour courir" name="tap_tap_hold_to_run"/>
+ <text name="mouse_lbl">
+ Souris :
+ </text>
<check_box label="Afficher en vue subjective" name="first_person_avatar_visible"/>
<text name=" Mouse Sensitivity">
Sensibilité de la souris en vue subjective :
</text>
<check_box label="Inverser" name="invert_mouse"/>
- <check_box label="Les touches de direction me font toujours me déplacer" name="arrow_keys_move_avatar_check"/>
- <check_box label="Appuyer deux fois et maintenir enfoncé pour courir" name="tap_tap_hold_to_run"/>
- <check_box label="Double-cliquer pour :" name="double_click_chkbox"/>
- <radio_group name="double_click_action">
- <radio_item label="Téléportation" name="radio_teleport"/>
- <radio_item label="Pilotage auto" name="radio_autopilot"/>
- </radio_group>
+ <text name="single_click_action_lbl">
+ Clic simple sur le terrain :
+ </text>
+ <combo_box name="single_click_action_combo">
+ <combo_box.item label="Aucune action" name="0"/>
+ <combo_box.item label="Déplacement vers le clic" name="1"/>
+ </combo_box>
+ <text name="double_click_action_lbl">
+ Double-clic sur le terrain :
+ </text>
+ <combo_box name="double_click_action_combo">
+ <combo_box.item label="Aucune action" name="0"/>
+ <combo_box.item label="Déplacement vers le double clic" name="1"/>
+ <combo_box.item label="Téléportation vers le double clic" name="2"/>
+ </combo_box>
<button label="Autres accessoires" name="joystick_setup_button"/>
</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/fr/panel_preferences_privacy.xml
index 202ec779f5..cf1a374da6 100644
--- a/indra/newview/skins/default/xui/fr/panel_preferences_privacy.xml
+++ b/indra/newview/skins/default/xui/fr/panel_preferences_privacy.xml
@@ -3,9 +3,9 @@
<panel.string name="log_in_to_change">
se connecter pour changer
</panel.string>
- <button label="Vider le cache" name="clear_cache" tool_tip="Effacer l&apos;image de connexion, le dernier lieu, l&apos;historique des téléportations et la texture du cache."/>
+ <button label="Vider l'historique" name="clear_cache" tool_tip="Effacer le cache de l&apos;image de connexion, du dernier lieu, de l&apos;historique des téléportations, Web et de texture."/>
<text name="cache_size_label_l">
- (Endroits, images, web, historique des recherches)
+ (endroits, images, web, historique des recherches)
</text>
<check_box label="M&apos;afficher dans les résultats de recherche" name="online_searchresults"/>
<check_box label="Seuls mes amis et groupes voient quand je suis en ligne" name="online_visibility"/>
@@ -20,7 +20,7 @@
<check_box label="Inclure la date et l&apos;heure pour chaque ligne du journal de chat" name="show_timestamps_check_im"/>
<check_box label="Inclure la date dans le nom du fichier journal" name="logfile_name_datestamp"/>
<text name="log_path_desc">
- Emplacement :
+ Emplacement journaux :
</text>
<line_editor left="308" name="log_path_string" right="-20"/>
<button label="Parcourir" label_selected="Parcourir" name="log_path_button" width="150"/>
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 82780c27c5..83303950dc 100644
--- a/indra/newview/skins/default/xui/fr/panel_preferences_setup.xml
+++ b/indra/newview/skins/default/xui/fr/panel_preferences_setup.xml
@@ -15,7 +15,7 @@
Web :
</text>
<radio_group name="use_external_browser">
- <radio_item label="Utiliser mon navigateur (IE, Firefox, Safari)" name="external" tool_tip="Utiliser le navigateur web système par défaut pour l&apos;aide, les liens etc. Non recommandé en mode plein écran." value="1"/>
+ <radio_item label="Utiliser mon navigateur (IE, Firefox, Safari)" name="external" tool_tip="Utiliser le navigateur web système par défaut pour l&apos;aide, les liens etc. Non recommandé en mode plein écran." value="true"/>
<radio_item label="Utiliser le navigateur intégré" name="internal" tool_tip="Utilisez le navigateur intégré pour obtenir de l&apos;aide, ouvrir des liens, etc. Ce navigateur s&apos;ouvre dans [APP_NAME]." value=""/>
</radio_group>
<check_box initial_value="true" label="Activer les plugins" name="browser_plugins_enabled"/>
diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_sound.xml b/indra/newview/skins/default/xui/fr/panel_preferences_sound.xml
index deaec2e14f..37eb6bbeb0 100644
--- a/indra/newview/skins/default/xui/fr/panel_preferences_sound.xml
+++ b/indra/newview/skins/default/xui/fr/panel_preferences_sound.xml
@@ -17,9 +17,9 @@
<check_box label="Activé" name="enable_media"/>
<slider label="Chat vocal" name="Voice Volume"/>
<check_box label="Activé" name="enable_voice_check"/>
- <check_box label="Autoriser la lecture automatique du média" name="media_auto_play_btn" tool_tip="Cochez pour autoriser la lecture automatique du média" value="true"/>
- <check_box label="Lecture du média aux autres avatars" name="media_show_on_others_btn" tool_tip="Décochez pour masquer le média aux autres avatars près de vous" value="true"/>
- <check_box label="Lire les sons des gestes" name="gesture_audio_play_btn" tool_tip="Cochez cette case pour entendre les sons associés aux gestes." value="true"/>
+ <check_box label="Autoriser la lecture automatique du média" name="media_auto_play_btn" tool_tip="Cocher pour autoriser la lecture automatique du média." value="true"/>
+ <check_box label="Lire le média attaché aux autres avatars" name="media_show_on_others_btn" tool_tip="Décocher pour masquer le média attaché aux autres avatars près de vous." value="true"/>
+ <check_box label="Lire les sons des gestes" name="gesture_audio_play_btn" tool_tip="Cocher cette case pour entendre les sons associés aux gestes." value="true"/>
<text name="voice_chat_settings">
Paramètres du chat vocal
</text>
diff --git a/indra/newview/skins/default/xui/fr/panel_prim_media_controls.xml b/indra/newview/skins/default/xui/fr/panel_prim_media_controls.xml
index f16fcebd02..ad744b7760 100644
--- a/indra/newview/skins/default/xui/fr/panel_prim_media_controls.xml
+++ b/indra/newview/skins/default/xui/fr/panel_prim_media_controls.xml
@@ -13,10 +13,10 @@
</layout_stack>
<layout_stack name="media_controls">
<layout_panel name="back">
- <button name="back_btn" tool_tip="Naviguer en arrière"/>
+ <button name="back_btn" tool_tip="Précédente"/>
</layout_panel>
<layout_panel name="fwd">
- <button name="fwd_btn" tool_tip="Naviguer vers l&apos;avant"/>
+ <button name="fwd_btn" tool_tip="Suivante"/>
</layout_panel>
<layout_panel name="home">
<button name="home_btn" tool_tip="Page d&apos;accueil"/>
@@ -34,7 +34,7 @@
<button name="play_btn" tool_tip="Lire le média"/>
</layout_panel>
<layout_panel name="pause">
- <button name="pause_btn" tool_tip="Pauser le média"/>
+ <button name="pause_btn" tool_tip="Mettre le média sur pause"/>
</layout_panel>
<layout_panel name="media_address">
<line_editor name="media_address_url" tool_tip="URL du média"/>
@@ -48,7 +48,7 @@
</layout_stack>
</layout_panel>
<layout_panel name="media_play_position">
- <slider_bar initial_value="0.5" name="media_play_slider" tool_tip="Progrès de la lecture du film"/>
+ <slider_bar initial_value="0.5" name="media_play_slider" tool_tip="Progression de la lecture du film"/>
</layout_panel>
<layout_panel name="skip_back">
<button name="skip_back_btn" tool_tip="Reculer"/>
diff --git a/indra/newview/skins/default/xui/fr/panel_profile.xml b/indra/newview/skins/default/xui/fr/panel_profile.xml
deleted file mode 100644
index 9aa6fe97a1..0000000000
--- a/indra/newview/skins/default/xui/fr/panel_profile.xml
+++ /dev/null
@@ -1,74 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Profil" name="panel_profile">
- <string name="CaptionTextAcctInfo">
- [ACCTTYPE]
-[PAYMENTINFO] [AGEVERIFICATION]
- </string>
- <string name="payment_update_link_url">
- http://www.secondlife.com/account/billing.php?lang=fr-FR
- </string>
- <string name="partner_edit_link_url">
- http://www.secondlife.com/account/partners.php?lang=fr
- </string>
- <string name="my_account_link_url" value="http://secondlife.com/my/account/index.php?lang=fr-FR"/>
- <string name="no_partner_text" value="Aucun"/>
- <string name="no_group_text" value="Aucun"/>
- <string name="RegisterDateFormat">
- [REG_DATE] ([AGE])
- </string>
- <string name="name_text_args">
- [NAME]
- </string>
- <string name="display_name_text_args">
- [DISPLAY_NAME]
- </string>
- <layout_stack name="layout">
- <layout_panel name="profile_stack">
- <scroll_container name="profile_scroll">
- <panel name="profile_scroll_panel">
- <panel name="second_life_image_panel">
- <text name="title_sl_descr_text" value="[SECOND_LIFE]:"/>
- </panel>
- <panel name="first_life_image_panel">
- <text name="title_rw_descr_text" value="Vie réelle :"/>
- </panel>
- <text name="title_member_text" value="Résident depuis :"/>
- <text name="title_acc_status_text" value="Statut du compte :"/>
- <text_editor name="acc_status_text">
- Résident. Aucune info de paiement enregistrée.
- Linden.
- </text_editor>
- <text name="title_partner_text" value="Partenaire :"/>
- <panel name="partner_data_panel">
- <text initial_value="(récupération en cours)" name="partner_text"/>
- </panel>
- <text name="title_groups_text" value="Groupes :"/>
- </panel>
- </scroll_container>
- </layout_panel>
- </layout_stack>
- <layout_stack name="layout_verb_buttons">
- <layout_panel name="profile_buttons_panel">
- <layout_stack name="bottom_bar_ls">
- <layout_panel name="add_friend_btn_lp">
- <button label="Devenir amis" name="add_friend" tool_tip="Proposer à ce résident de devenir votre ami"/>
- </layout_panel>
- <layout_panel name="im_btn_lp">
- <button label="IM" name="im" tool_tip="Ouvrir une session IM"/>
- </layout_panel>
- <layout_panel name="call_btn_lp">
- <button label="Appeler" name="call" tool_tip="Appeler ce résident"/>
- </layout_panel>
- <layout_panel name="chat_btn_lp">
- <button label="Téléporter" name="teleport" tool_tip="Proposer une téléportation"/>
- </layout_panel>
- <layout_panel name="overflow_btn_lp">
- <menu_button label="▼" name="overflow_btn" tool_tip="Payer le résident ou partager l&apos;inventaire avec lui"/>
- </layout_panel>
- </layout_stack>
- </layout_panel>
- <layout_panel name="profile_me_buttons_panel">
- <button label="Modifier le profil" name="edit_profile_btn" tool_tip="Modifier vos informations personnelles"/>
- </layout_panel>
- </layout_stack>
-</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_profile_view.xml b/indra/newview/skins/default/xui/fr/panel_profile_view.xml
deleted file mode 100644
index 76ba44e899..0000000000
--- a/indra/newview/skins/default/xui/fr/panel_profile_view.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="panel_target_profile">
- <string name="status_online">
- En ligne
- </string>
- <string name="status_offline">
- Hors ligne
- </string>
- <text name="display_name_label" value="Nom d&apos;affichage :"/>
- <text name="solo_username_label" value="Nom d&apos;utilisateur :"/>
- <text name="status" value="En ligne"/>
- <text name="user_name_small" value="Jack oh look at me this is a super duper long name"/>
- <button name="copy_to_clipboard" tool_tip="Copier dans le presse-papiers"/>
- <text name="user_label" value="Nom d&apos;utilisateur :"/>
- <tab_container name="tabs">
- <panel label="PROFIL" name="panel_profile"/>
- <panel label="FAVORIS" name="panel_picks"/>
- <panel label="NOTES/PERSO" name="panel_notes"/>
- </tab_container>
-</panel>
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 cb4a74e142..733c3f9a22 100644
--- a/indra/newview/skins/default/xui/fr/panel_region_debug.xml
+++ b/indra/newview/skins/default/xui/fr/panel_region_debug.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Débugger" name="Debug">
+<panel label="Débogage" name="Debug">
<text name="region_text_lbl">
Région :
</text>
diff --git a/indra/newview/skins/default/xui/fr/panel_snapshot_inventory.xml b/indra/newview/skins/default/xui/fr/panel_snapshot_inventory.xml
new file mode 100644
index 0000000000..4454d2475e
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_snapshot_inventory.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_snapshot_inventory">
+ <text name="title">
+ Enregistrer dans mon inventaire
+ </text>
+ <text name="hint_lbl">
+ L&apos;enregistrement d&apos;une image dans votre inventaire coûte [UPLOAD_COST] L$. Pour enregistrer votre image sous forme de texture, sélectionnez l&apos;un des formats carrés.
+ </text>
+ <combo_box label="Résolution" name="texture_size_combo">
+ <combo_box.item label="Fenêtre actuelle" name="CurrentWindow"/>
+ <combo_box.item label="Petite (128 x 128)" name="Small(128x128)"/>
+ <combo_box.item label="Moyenne (256 x 256)" name="Medium(256x256)"/>
+ <combo_box.item label="Grande (512 x 512)" name="Large(512x512)"/>
+ <combo_box.item label="Personnalisée" name="Custom"/>
+ </combo_box>
+ <spinner label="Largeur" name="inventory_snapshot_width"/>
+ <spinner label="Hauteur" name="inventory_snapshot_height"/>
+ <check_box label="Conserver les proportions" name="inventory_keep_aspect_check"/>
+ <button label="Annuler" name="cancel_btn"/>
+ <button label="Enregistrer" name="save_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_snapshot_local.xml b/indra/newview/skins/default/xui/fr/panel_snapshot_local.xml
new file mode 100644
index 0000000000..41264521fd
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_snapshot_local.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_snapshot_local">
+ <text name="title">
+ Enregistrer sur mon ordinateur
+ </text>
+ <combo_box label="Résolution" name="local_size_combo">
+ <combo_box.item label="Fenêtre actuelle" name="CurrentWindow"/>
+ <combo_box.item label="320 x 240" name="320x240"/>
+ <combo_box.item label="640 x 480" name="640x480"/>
+ <combo_box.item label="800 x 600" name="800x600"/>
+ <combo_box.item label="1 024 x 768" name="1024x768"/>
+ <combo_box.item label="1 280 x 1 024" name="1280x1024"/>
+ <combo_box.item label="1 600 x 1 200" name="1600x1200"/>
+ <combo_box.item label="Personnalisée" name="Custom"/>
+ </combo_box>
+ <layout_stack name="local_image_params_ls">
+ <layout_panel name="local_image_size_lp">
+ <spinner label="Largeur" name="local_snapshot_width"/>
+ <spinner label="Hauteur" name="local_snapshot_height"/>
+ <check_box label="Conserver les proportions" name="local_keep_aspect_check"/>
+ </layout_panel>
+ <layout_panel name="local_image_format_quality_lp">
+ <combo_box label="Format" name="local_format_combo">
+ <combo_box.item label="PNG (sans perte)" name="PNG"/>
+ <combo_box.item label="JPEG" name="JPEG"/>
+ <combo_box.item label="BMP (sans perte)" name="BMP"/>
+ </combo_box>
+ <slider label="Qualité de l&apos;image" name="image_quality_slider"/>
+ <text name="image_quality_level">
+ ([QLVL])
+ </text>
+ </layout_panel>
+ </layout_stack>
+ <button label="Annuler" name="cancel_btn"/>
+ <flyout_button label="Enregistrer" name="save_btn" tool_tip="Enregistrer l&apos;image dans un fichier.">
+ <flyout_button.item label="Enregistrer" name="save_item"/>
+ <flyout_button.item label="Enregistrer sous..." name="saveas_item"/>
+ </flyout_button>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_snapshot_options.xml b/indra/newview/skins/default/xui/fr/panel_snapshot_options.xml
new file mode 100644
index 0000000000..db3fcbeac9
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_snapshot_options.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_snapshot_options">
+ <button label="Publier sur le flux de mon profil" name="save_to_profile_btn"/>
+ <button label="Envoyer par e-mail" name="save_to_email_btn"/>
+ <button label="Enregistrer dans mon inventaire ([AMOUNT] L$)" name="save_to_inventory_btn"/>
+ <button label="Enregistrer sur mon ordinateur" name="save_to_computer_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_snapshot_postcard.xml b/indra/newview/skins/default/xui/fr/panel_snapshot_postcard.xml
new file mode 100644
index 0000000000..bb23b52850
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_snapshot_postcard.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_snapshot_postcard">
+ <string name="default_subject">
+ Carte postale de [SECOND_LIFE].
+ </string>
+ <string name="default_message">
+ Ouvrez-moi !
+ </string>
+ <string name="upload_message">
+ Envoi en cours...
+ </string>
+ <text name="title">
+ Envoyer par e-mail
+ </text>
+ <button label="Message" name="message_btn"/>
+ <button label="Paramètres" name="settings_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_snapshot_profile.xml b/indra/newview/skins/default/xui/fr/panel_snapshot_profile.xml
new file mode 100644
index 0000000000..427ffe2113
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_snapshot_profile.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_snapshot_profile">
+ <text name="title">
+ Publier sur le flux de mon profil
+ </text>
+ <combo_box label="Résolution" name="profile_size_combo">
+ <combo_box.item label="Fenêtre actuelle" name="CurrentWindow"/>
+ <combo_box.item label="640 x 480" name="640x480"/>
+ <combo_box.item label="800 x 600" name="800x600"/>
+ <combo_box.item label="1 024 x 768" name="1024x768"/>
+ <combo_box.item label="Personnalisée" name="Custom"/>
+ </combo_box>
+ <layout_stack name="profile_image_params_ls">
+ <layout_panel name="profile_image_size_lp">
+ <spinner label="Largeur" name="profile_snapshot_width"/>
+ <spinner label="Hauteur" name="profile_snapshot_height"/>
+ <check_box label="Conserver les proportions" name="profile_keep_aspect_check"/>
+ </layout_panel>
+ <layout_panel name="profile_image_metadata_lp">
+ <text name="caption_label">
+ Légende :
+ </text>
+ <check_box initial_value="true" label="Inclure l&apos;endroit" name="add_location_cb"/>
+ </layout_panel>
+ </layout_stack>
+ <button label="Annuler" name="cancel_btn"/>
+ <button label="Publier" name="post_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_status_bar.xml b/indra/newview/skins/default/xui/fr/panel_status_bar.xml
index 2dd5c06e4d..c0d59a3182 100644
--- a/indra/newview/skins/default/xui/fr/panel_status_bar.xml
+++ b/indra/newview/skins/default/xui/fr/panel_status_bar.xml
@@ -17,15 +17,12 @@
</panel.string>
<panel name="balance_bg">
<text name="balance" tool_tip="Cliquer sur ce bouton pour actualiser votre solde en L$." value="20 L$"/>
- <button label="ACHETER L$" name="buyL" tool_tip="Cliquer pour acheter plus de L$"/>
+ <button label="Acheter L$" name="buyL" tool_tip="Cliquer pour acheter plus de L$."/>
+ <button label="Achats" name="goShop" tool_tip="Ouvrir la Place du marché Second Life." width="75"/>
</panel>
- <combo_box name="mode_combo" tool_tip="Sélectionnez un mode. Pour une exploration facile et rapide avec chat, choisissez Basique. Pour accéder à plus de fonctionnalités, choisissez Avancé.">
- <combo_box.item label="Mode basique" name="Basic"/>
- <combo_box.item label="Mode avancé" name="Advanced"/>
- </combo_box>
<text name="TimeText" tool_tip="Heure actuelle (Pacifique)">
00h00 PST
</text>
- <button name="media_toggle_btn" tool_tip="Arrêter tous les médias (musique, vidéo, pages web)"/>
- <button name="volume_btn" tool_tip="Contrôle du volume global"/>
+ <button name="media_toggle_btn" tool_tip="Arrêter tous les médias (musique, vidéo, pages web)."/>
+ <button name="volume_btn" tool_tip="Régler le volume global."/>
</panel>
diff --git a/indra/newview/skins/default/xui/fr/strings.xml b/indra/newview/skins/default/xui/fr/strings.xml
index 7d349f27a6..d959a96565 100644
--- a/indra/newview/skins/default/xui/fr/strings.xml
+++ b/indra/newview/skins/default/xui/fr/strings.xml
@@ -1214,7 +1214,7 @@ Veuillez réessayer de vous connecter dans une minute.
Vous n&apos;avez pas de copie de cette texture dans votre inventaire
</string>
<string name="InventoryInboxNoItems">
- Ici seront livrés les articles achetés sur la Place du marché.
+ Lorsque vous achetez ou recevez un article, il s&apos;affiche ici. Vous pouvez alors le faire glisser vers un dossier de votre inventaire ou le supprimer si vous ne souhaitez pas le conserver.
</string>
<string name="MarketplaceURL">
http://marketplace.[DOMAIN_NAME]
@@ -1276,6 +1276,9 @@ Veuillez réessayer de vous connecter dans une minute.
<string name="Marketplace Error Internal Import">
Erreur : un problème est survenu concernant cet article. Veuillez réessayer ultérieurement.
</string>
+ <string name="Open landmarks">
+ Ouvrir les repères
+ </string>
<string name="no_transfer" value=" (pas de transfert)"/>
<string name="no_modify" value=" (pas de modification)"/>
<string name="no_copy" value=" (pas de copie)"/>
@@ -1409,6 +1412,9 @@ Veuillez réessayer de vous connecter dans une minute.
<string name="no_attachments">
Aucun élément attaché porté
</string>
+ <string name="Attachments remain">
+ Éléments attachés ([COUNT] emplacements restants)
+ </string>
<string name="Buy">
Acheter
</string>
@@ -1535,6 +1541,12 @@ Veuillez réessayer de vous connecter dans une minute.
<string name="Right Pec">
Pectoral droit
</string>
+ <string name="Neck">
+ Cou
+ </string>
+ <string name="Avatar Center">
+ Centre de l&apos;avatar
+ </string>
<string name="Invalid Attachment">
Point d&apos;attache non valide
</string>
@@ -2510,7 +2522,7 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE].
Effet max.
</string>
<string name="Breast Physics InOut Spring">
- Vibration
+ Élasticité
</string>
<string name="Breast Physics InOut Gain">
Amplification
@@ -2522,7 +2534,7 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE].
Effet max.
</string>
<string name="Breast Physics UpDown Spring">
- Vibration
+ Élasticité
</string>
<string name="Breast Physics UpDown Gain">
Amplification
@@ -2534,7 +2546,7 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE].
Effet max.
</string>
<string name="Breast Physics LeftRight Spring">
- Vibration
+ Élasticité
</string>
<string name="Breast Physics LeftRight Gain">
Amplification
@@ -2558,7 +2570,7 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE].
Effet max.
</string>
<string name="Belly Physics UpDown Spring">
- Vibration
+ Élasticité
</string>
<string name="Belly Physics UpDown Gain">
Amplification
@@ -2582,7 +2594,7 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE].
Effet max.
</string>
<string name="Butt Physics UpDown Spring">
- Vibration
+ Élasticité
</string>
<string name="Butt Physics UpDown Gain">
Amplification
@@ -2594,7 +2606,7 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE].
Effet max.
</string>
<string name="Butt Physics LeftRight Spring">
- Vibration
+ Élasticité
</string>
<string name="Butt Physics LeftRight Gain">
Amplification
@@ -4027,6 +4039,18 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE].
<string name="you_paid_ldollars_no_name">
Vous avez payé à [AMOUNT] L$ [REASON].
</string>
+ <string name="you_paid_failure_ldollars">
+ Votre paiement de [AMOUNT] L$ à [NAME] [REASON] a échoué.
+ </string>
+ <string name="you_paid_failure_ldollars_no_info">
+ Votre paiement de [AMOUNT] L$ a échoué.
+ </string>
+ <string name="you_paid_failure_ldollars_no_reason">
+ Votre paiement de [AMOUNT] L$ à [NAME] a échoué.
+ </string>
+ <string name="you_paid_failure_ldollars_no_name">
+ Votre paiement de [AMOUNT] L$ [REASON] a échoué.
+ </string>
<string name="for item">
pour l&apos;article suivant : [ITEM]
</string>
@@ -4254,7 +4278,7 @@ de l&apos;infraction signalée
<string name="Female - Wow">
Femme - Ouah !
</string>
- <string name="/bow1">
+ <string name="/bow">
/s&apos;incliner
</string>
<string name="/clap">
@@ -4437,6 +4461,12 @@ Essayez avec le chemin d&apos;accès à l&apos;éditeur entre guillemets doubles
<string name="ExternalEditorFailedToRun">
Échec d&apos;exécution de l&apos;éditeur externe.
</string>
+ <string name="TranslationFailed">
+ Échec de traduction : [REASON]
+ </string>
+ <string name="TranslationResponseParseError">
+ Erreur lors de l&apos;analyse de la réponse relative à la traduction.
+ </string>
<string name="Esc">
Échap
</string>
@@ -4767,4 +4797,196 @@ Essayez avec le chemin d&apos;accès à l&apos;éditeur entre guillemets doubles
<string name="ParticleHiding">
Masquage des particules
</string>
+ <string name="Command_AboutLand_Label">
+ À propos du terrain
+ </string>
+ <string name="Command_Appearance_Label">
+ Apparence
+ </string>
+ <string name="Command_Avatar_Label">
+ Avatar
+ </string>
+ <string name="Command_Build_Label">
+ Construire
+ </string>
+ <string name="Command_Chat_Label">
+ Chat
+ </string>
+ <string name="Command_Compass_Label">
+ Boussole
+ </string>
+ <string name="Command_Destinations_Label">
+ Destinations
+ </string>
+ <string name="Command_Gestures_Label">
+ Gestes
+ </string>
+ <string name="Command_HowTo_Label">
+ Aide rapide
+ </string>
+ <string name="Command_Inventory_Label">
+ Inventaire
+ </string>
+ <string name="Command_Map_Label">
+ Carte
+ </string>
+ <string name="Command_Marketplace_Label">
+ Place du marché
+ </string>
+ <string name="Command_MiniMap_Label">
+ Mini-carte
+ </string>
+ <string name="Command_Move_Label">
+ Marcher / Courir / Voler
+ </string>
+ <string name="Command_People_Label">
+ Personnes
+ </string>
+ <string name="Command_Picks_Label">
+ Favoris
+ </string>
+ <string name="Command_Places_Label">
+ Lieux
+ </string>
+ <string name="Command_Preferences_Label">
+ Préférences
+ </string>
+ <string name="Command_Profile_Label">
+ Profil
+ </string>
+ <string name="Command_Search_Label">
+ Recherche
+ </string>
+ <string name="Command_Snapshot_Label">
+ Photo
+ </string>
+ <string name="Command_Speak_Label">
+ Parler
+ </string>
+ <string name="Command_View_Label">
+ Paramètres de la caméra
+ </string>
+ <string name="Command_Voice_Label">
+ Paramètres vocaux
+ </string>
+ <string name="Command_AboutLand_Tooltip">
+ Information sur le terrain que vous visitez
+ </string>
+ <string name="Command_Appearance_Tooltip">
+ Modifier votre avatar
+ </string>
+ <string name="Command_Avatar_Tooltip">
+ Choisir un avatar complet
+ </string>
+ <string name="Command_Build_Tooltip">
+ Construction d&apos;objets et remodelage du terrain
+ </string>
+ <string name="Command_Chat_Tooltip">
+ Parler aux personnes près de vous par chat écrit
+ </string>
+ <string name="Command_Compass_Tooltip">
+ Boussole
+ </string>
+ <string name="Command_Destinations_Tooltip">
+ Destinations intéressantes
+ </string>
+ <string name="Command_Gestures_Tooltip">
+ Gestes de votre avatar
+ </string>
+ <string name="Command_HowTo_Tooltip">
+ Comment effectuer les opérations courantes
+ </string>
+ <string name="Command_Inventory_Tooltip">
+ Afficher et utiliser vos possessions
+ </string>
+ <string name="Command_Map_Tooltip">
+ Carte du monde
+ </string>
+ <string name="Command_Marketplace_Tooltip">
+ Faire du shopping
+ </string>
+ <string name="Command_MiniMap_Tooltip">
+ Afficher les personnes près de vous
+ </string>
+ <string name="Command_Move_Tooltip">
+ Faire bouger votre avatar
+ </string>
+ <string name="Command_People_Tooltip">
+ Amis, groupes et personnes près de vous
+ </string>
+ <string name="Command_Picks_Tooltip">
+ Lieux à afficher comme favoris dans votre profil
+ </string>
+ <string name="Command_Places_Tooltip">
+ Lieux enregistrés
+ </string>
+ <string name="Command_Preferences_Tooltip">
+ Préférences
+ </string>
+ <string name="Command_Profile_Tooltip">
+ Modifier ou afficher votre profil
+ </string>
+ <string name="Command_Search_Tooltip">
+ Trouver des lieux, personnes, événements
+ </string>
+ <string name="Command_Snapshot_Tooltip">
+ Prendre une photo
+ </string>
+ <string name="Command_Speak_Tooltip">
+ Parler aux personnes près de vous en utilisant votre micro
+ </string>
+ <string name="Command_View_Tooltip">
+ Changer l&apos;angle de la caméra
+ </string>
+ <string name="Command_Voice_Tooltip">
+ Commandes de réglage du volume des appels et des personnes près de vous dans Second Life.
+ </string>
+ <string name="Toolbar_Bottom_Tooltip">
+ actuellement dans la barre d&apos;outils du bas
+ </string>
+ <string name="Toolbar_Left_Tooltip">
+ actuellement dans la barre d&apos;outils de gauche
+ </string>
+ <string name="Toolbar_Right_Tooltip">
+ actuellement dans la barre d&apos;outils de droite
+ </string>
+ <string name="Retain%">
+ Garder%
+ </string>
+ <string name="Detail">
+ Détail
+ </string>
+ <string name="Better Detail">
+ Meilleur détail
+ </string>
+ <string name="Surface">
+ Surface
+ </string>
+ <string name="Solid">
+ Solide
+ </string>
+ <string name="Wrap">
+ Wrap
+ </string>
+ <string name="Preview">
+ Aperçu
+ </string>
+ <string name="Normal">
+ Normal
+ </string>
+ <string name="snapshot_quality_very_low">
+ Très faible
+ </string>
+ <string name="snapshot_quality_low">
+ Faible
+ </string>
+ <string name="snapshot_quality_medium">
+ Moyenne
+ </string>
+ <string name="snapshot_quality_high">
+ Élevée
+ </string>
+ <string name="snapshot_quality_very_high">
+ Très élevée
+ </string>
</strings>
diff --git a/indra/newview/skins/default/xui/fr/teleport_strings.xml b/indra/newview/skins/default/xui/fr/teleport_strings.xml
index 7c291c0984..d0c74ff353 100644
--- a/indra/newview/skins/default/xui/fr/teleport_strings.xml
+++ b/indra/newview/skins/default/xui/fr/teleport_strings.xml
@@ -20,6 +20,10 @@ Si vous ne parvenez toujours pas à être téléporté, déconnectez-vous puis r
Désolé, la connexion vers votre lieu de téléportation n&apos;a pas abouti.
Veuillez réessayer dans un moment.
</message>
+ <message name="NoHelpIslandTP">
+ Vous ne pouvez pas vous téléporter à nouveau vers Welcome Island.
+Pour recommencer le didacticiel, accédez à Welcome Island Public.
+ </message>
<message name="noaccess_tport">
Désolé, vous n&apos;avez pas accès à cette destination.
</message>
diff --git a/indra/newview/skins/default/xui/it/floater_about.xml b/indra/newview/skins/default/xui/it/floater_about.xml
index db4dbe02e2..39114b7bf7 100644
--- a/indra/newview/skins/default/xui/it/floater_about.xml
+++ b/indra/newview/skins/default/xui/it/floater_about.xml
@@ -8,9 +8,9 @@
Generato con [COMPILER] versione [COMPILER_VERSION]
</floater.string>
<floater.string name="AboutPosition">
- Tu sei [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1] in [REGION] located at &lt;nolink&gt;[HOSTNAME]&lt;/nolink&gt; ([HOSTIP])
+ Tu sei [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1] in [REGION] che si trova a &lt;nolink&gt;[HOSTNAME]&lt;/nolink&gt; ([HOSTIP])
[SERVER_VERSION]
-[[SERVER_RELEASE_NOTES_URL] [ReleaseNotes]]
+[SERVER_RELEASE_NOTES_URL]
</floater.string>
<floater.string name="AboutSystem">
CPU: [CPU]
@@ -37,6 +37,9 @@ Versione Server voice: [VOICE_VERSION]
<floater.string name="AboutTraffic">
Pacchetti perduti: [PACKETS_LOST,number,0]/[PACKETS_IN,number,0] ([PACKETS_PCT,number,1]%) Informazioni
</floater.string>
+ <floater.string name="ErrorFetchingServerReleaseNotesURL">
+ Errore nel recupero URL note rilascio versione
+ </floater.string>
<tab_container name="about_tab">
<panel label="Informazioni" name="support_panel">
<button label="Copia negli appunti" name="copy_btn"/>
@@ -64,32 +67,34 @@ Versione Server voice: [VOICE_VERSION]
<panel label="Licenze" name="licenses_panel">
<text_editor name="credits_editor">
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
-SDL Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga
-SSLeay Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
-xmlrpc-epi Copyright (C) 2000 Epinions, Inc.
-zlib Copyright (C) 1995-2002 Jean-loup Gailly and Mark Adler.
-google-perftools Copyright (c) 2005, Google Inc.
+ 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
+ SDL Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga
+ SSLeay Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
+ xmlrpc-epi Copyright (C) 2000 Epinions, Inc.
+ zlib Copyright (C) 1995-2002 Jean-loup Gailly and Mark Adler.
+ google-perftools Copyright (c) 2005, Google Inc.
+
+ Il Viewer Second Life utilizza Havok (TM) Physics. (c)Copyright 1999-2010 Havok.com Inc. (e licenziatari). Tutti i diritti riservati. Per informazioni dettagliate, vedere www.havok.com.
-Il Viewer Second Life utilizza Havok (TM) Physics. (c)Copyright 1999-2010 Havok.com Inc. (e licenziatari). Tutti i diritti riservati. Per informazioni dettagliate, vedere www.havok.com.
+ Questo software contiene codice sorgente fornito da NVIDIA Corporation.
-Tutti i diritti riservati. Per informazioni dettagliate, vedere licenses.txt.
+ Tutti i diritti riservati. Per informazioni dettagliate, vedere licenses.txt.
-Codifica audio chat vocale: Polycom(R) Siren14(TM) (ITU-T Rec. G.722.1 Annex C)
+ Codifica audio chat vocale: 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/it/floater_about_land.xml b/indra/newview/skins/default/xui/it/floater_about_land.xml
index cf0f8f2f6f..528cf185fc 100644
--- a/indra/newview/skins/default/xui/it/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/it/floater_about_land.xml
@@ -133,7 +133,7 @@ Vai al menu Mondo &gt; Informazioni sul terreno oppure seleziona un altro appezz
Traffico:
</text>
<text name="DwellText" width="140">
- 0
+ Caricamento in corso...
</text>
<button label="Acquista il terreno..." label_selected="Acquista il terreno..." left="130" name="Buy Land..." width="125"/>
<button label="Vendita Linden" name="Linden Sale..." tool_tip="La terra deve essere di proprietà, con contenuto impostato, e non già messa all&apos;asta."/>
@@ -218,19 +218,19 @@ o suddivisa.
Fattore bonus degli oggetti della regione: [BONUS]
</text>
<text name="Simulator primitive usage:">
- Uso delle primitive:
+ Capacità regione:
</text>
<text name="objects_available">
[COUNT] dei [MAX] ([AVAILABLE] dsponibili)
</text>
<text name="Primitives parcel supports:">
- Oggetti che il terreno supporta:
+ Capacità lotto di terreno:
</text>
<text name="object_contrib_text">
[COUNT]
</text>
<text name="Primitives on parcel:">
- Oggetti sul terreno:
+ Impatto lotto di terreno:
</text>
<text name="total_objects_text">
[COUNT]
@@ -314,13 +314,15 @@ Solamente terreni più grandi possono essere abilitati nella ricerca.
Nessuna spinta (Impostazione regionale)
</panel.string>
<panel.string name="see_avs_text">
- Vedi i residenti in questo lotto e chatta con loro
+ Gli avatar in altri lotti possono vedere
</panel.string>
<text name="allow_label">
Permetti ad altri residenti di:
</text>
- <check_box label="Modificare il terreno" name="edit land check" tool_tip="Se spuntata, chiunque può terraformare il tuo terreno. È preferibile lasciare questa opzione non spuntata, dato che sarai comunque in grado di modificare il tuo terreno."/>
- <check_box label="Permetti il volo" name="check fly" tool_tip="Se spuntato, gli altri residenti potranno volare sul tuo terreno. Se non spuntato, potranno solamente arrivare in volo o sorvolare il terreno."/>
+ <text name="allow_label0">
+ Vola:
+ </text>
+ <check_box label="Tutti" name="check fly" tool_tip="Se spuntato, gli altri residenti potranno volare sul tuo terreno. Se non spuntato, potranno solamente arrivare in volo o sorvolare il terreno."/>
<text name="allow_label2">
Creare oggetti:
</text>
@@ -336,9 +338,6 @@ Solamente terreni più grandi possono essere abilitati nella ricerca.
</text>
<check_box label="Tutti i residenti" name="check other scripts"/>
<check_box label="Gruppo" name="check group scripts"/>
- <text name="land_options_label">
- Opzioni per il terreno:
- </text>
<check_box label="Sicuro (senza danno)" name="check safe" tool_tip="Se spuntato, imposta il terreno su &apos;sicuro&apos;, disabilitando i danni da combattimento. Se non spuntato, viene abilitato il combattimento con danni."/>
<check_box label="Nessuna spinta" name="PushRestrictCheck" tool_tip="Previeni i colpi. Selezionare questa opzione può essere utile per prevenire comportamenti dannosi sul tuo terreno."/>
<check_box label="Mostra luogo nella ricerca (30 L$/settimana)" name="ShowDirectoryCheck" tool_tip="Consenti che il lotto sia visto nei risultati di ricerca"/>
@@ -379,9 +378,9 @@ Solamente terreni più grandi possono essere abilitati nella ricerca.
</text>
<texture_picker label="" name="snapshot_ctrl" tool_tip="Clicca per scegliere una immagine"/>
<text name="allow_label5">
- Permetti ai residenti in altri lotti di:
+ e chattare con avatar in questo lotto
</text>
- <check_box label="Vedi avatar" name="SeeAvatarsCheck" tool_tip="Consente ai residenti in altri lotti di vedere i residenti in questo lotto e chattare con loro, e ti consente di vederli e chattare con loro."/>
+ <check_box label="Vedi avatar" name="SeeAvatarsCheck" tool_tip="Consente ad avatar in altri lotti di vedere e chattare con avatar in questo lotto e viceversa."/>
<text name="landing_point">
Punto di atterraggio: [LANDING]
</text>
diff --git a/indra/newview/skins/default/xui/it/floater_avatar.xml b/indra/newview/skins/default/xui/it/floater_avatar.xml
new file mode 100644
index 0000000000..d7445cfb2b
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/floater_avatar.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Avatar" title="SELEZIONA UN AVATAR"/>
diff --git a/indra/newview/skins/default/xui/it/floater_buy_currency.xml b/indra/newview/skins/default/xui/it/floater_buy_currency.xml
index 635b56d37a..743969f557 100644
--- a/indra/newview/skins/default/xui/it/floater_buy_currency.xml
+++ b/indra/newview/skins/default/xui/it/floater_buy_currency.xml
@@ -46,7 +46,7 @@
[AMT]L$
</text>
<text name="currency_links">
- [http://www.secondlife.com/my/account/payment_method_management.php payment method] | [http://www.secondlife.com/my/account/currency.php currency] | [http://www.secondlife.com/my/account/exchange_rates.php exchange rate]
+ [http://www.secondlife.com/my/account/payment_method_management.php metodo di pagamento] | [http://www.secondlife.com/my/account/currency.php valuta]
</text>
<text name="exchange_rate_note">
Riscrivi l&apos;importo per vedere l&apos;ultimo tasso al cambio.
diff --git a/indra/newview/skins/default/xui/it/floater_camera.xml b/indra/newview/skins/default/xui/it/floater_camera.xml
index 3fdf4f48a2..be03857bc9 100644
--- a/indra/newview/skins/default/xui/it/floater_camera.xml
+++ b/indra/newview/skins/default/xui/it/floater_camera.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="camera_floater" title="">
+<floater name="camera_floater" title="CONTROLLI FOTOCAMERA">
<floater.string name="rotate_tooltip">
Ruota la telecamera Intorno all&apos;Inquadratura
</floater.string>
@@ -9,15 +9,6 @@
<floater.string name="move_tooltip">
Muovi la telecamera su e giù e a sinistra e destra
</floater.string>
- <floater.string name="camera_modes_title">
- Modalità della fotocamera
- </floater.string>
- <floater.string name="pan_mode_title">
- Ruota visuale - Ingrandisci - Panoramica
- </floater.string>
- <floater.string name="presets_mode_title">
- Visuali predefinite
- </floater.string>
<floater.string name="free_mode_title">
Vedi oggetto
</floater.string>
diff --git a/indra/newview/skins/default/xui/it/floater_chat_bar.xml b/indra/newview/skins/default/xui/it/floater_chat_bar.xml
new file mode 100644
index 0000000000..94c85b50c8
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/floater_chat_bar.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="chat_bar" title="CHAT NEI DINTORNI">
+ <panel name="bottom_panel">
+ <line_editor label="Clicca qui per la chat." name="chat_box" tool_tip="Premi Invio per parlare, Ctrl+Invio per gridare"/>
+ <button name="show_nearby_chat" tool_tip="Mostra/Nasconde il registro della chat nei dintorni"/>
+ </panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_destinations.xml b/indra/newview/skins/default/xui/it/floater_destinations.xml
new file mode 100644
index 0000000000..242403e431
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/floater_destinations.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Destinations" title="DESTINAZIONI"/>
diff --git a/indra/newview/skins/default/xui/it/floater_fast_timers.xml b/indra/newview/skins/default/xui/it/floater_fast_timers.xml
new file mode 100644
index 0000000000..52ab6b0c3d
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/floater_fast_timers.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="fast_timers">
+ <string name="pause">
+ Pausa
+ </string>
+ <string name="run">
+ Correre
+ </string>
+ <button label="Pausa" name="pause_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_hardware_settings.xml b/indra/newview/skins/default/xui/it/floater_hardware_settings.xml
index 561f8dbf34..5d3ae04a4d 100644
--- a/indra/newview/skins/default/xui/it/floater_hardware_settings.xml
+++ b/indra/newview/skins/default/xui/it/floater_hardware_settings.xml
@@ -4,7 +4,7 @@
Filtraggio:
</text>
<check_box label="Filtraggio Anisotropico (rallenta se attivato)" name="ani"/>
- <text name="Antialiasing:">
+ <text name="antialiasing label">
Antialiasing:
</text>
<combo_box label="Antialiasing" name="fsaa" width="94">
diff --git a/indra/newview/skins/default/xui/it/floater_how_to.xml b/indra/newview/skins/default/xui/it/floater_how_to.xml
new file mode 100644
index 0000000000..8f0e210571
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/floater_how_to.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_how_to" title="ISTRUZIONI"/>
diff --git a/indra/newview/skins/default/xui/it/floater_map.xml b/indra/newview/skins/default/xui/it/floater_map.xml
index bf19ba6674..5e4e4abca4 100644
--- a/indra/newview/skins/default/xui/it/floater_map.xml
+++ b/indra/newview/skins/default/xui/it/floater_map.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Map" title="">
+<floater name="Map" title="MINI MAPPA">
<floater.string name="ToolTipMsg">
[REGION](Fai doppio clic per aprire la Mappa, premi il tasto Maiusc e trascina per la panoramica)
</floater.string>
@@ -7,7 +7,7 @@
[REGION](Fai doppio clic per teleportarti, premi il tasto Maiusc e trascina per la panoramica)
</floater.string>
<floater.string name="mini_map_caption">
- MINI MAPPA
+ Mini mappa
</floater.string>
<text label="N" name="floater_map_north" text="N">
N
diff --git a/indra/newview/skins/default/xui/it/floater_model_preview.xml b/indra/newview/skins/default/xui/it/floater_model_preview.xml
index 931fe7d382..ca36fd2def 100644
--- a/indra/newview/skins/default/xui/it/floater_model_preview.xml
+++ b/indra/newview/skins/default/xui/it/floater_model_preview.xml
@@ -1,10 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Model Preview" title="Carica modello">
- <string name="status_idle">
- Pausa
- </string>
+<floater name="Model Preview" title="CARICAMENTO MODELLO">
+ <string name="status_idle"/>
<string name="status_parse_error">
- Problema nell&apos;elaborazione DAE - vedi il registro per informazioni al riguardo.
+ Errore: Errore elaborazione Dae - vedere il registro per informazioni dettagliate.
+ </string>
+ <string name="status_material_mismatch">
+ Errore: il materiale del modello non è un sottoinsieme del modello di riferimento.
</string>
<string name="status_reading_file">
Caricamento in corso...
@@ -51,6 +52,9 @@
<string name="mesh_status_missing_lod">
Livello di dettaglio minimo mancante.
</string>
+ <string name="mesh_status_invalid_material_list">
+ I materiali per il livello di dettaglio non sono un sottoinsieme del modello di riferimento.
+ </string>
<string name="layer_all">
Tutto
</string>
@@ -63,188 +67,211 @@
<string name="tbd">
Da definire
</string>
- <text name="name_label">
- Nome:
- </text>
- <text name="lod_label">
- Anteprima:
- </text>
- <combo_box name="preview_lod_combo" tool_tip="Livello di dettaglio per anteprima rendering">
- <combo_item name="high">
- Livello di dettaglio: Alto
- </combo_item>
- <combo_item name="medium">
- Livello di dettaglio: Medio
- </combo_item>
- <combo_item name="low">
- Livello di dettaglio: Basso
- </combo_item>
- <combo_item name="lowest">
- Livello di dettaglio: Bassissimo
- </combo_item>
- </combo_box>
- <text name="warning_title">
- ATTENZIONE:
- </text>
- <text name="warning_message">
- Non sarà possibile completare il caricamento finale di questo modello sui server di Second Life. [[VURL] Scopri come] ricevere l&apos;autorizzazione per il caricamento dei modelli con reticolo.
- </text>
- <text name="weights_text">
- Download:
-Fisica:
-Server:
-
-Prim equivalenti:
- </text>
- <text name="weights">
- [ST]
-[PH]
-[SIM]
-
-[EQ]
- </text>
- <tab_container name="import_tab">
- <panel label="Livello di dettaglio" name="lod_panel">
- <text name="lod_table_header">
- Seleziona livello di dettaglio:
- </text>
- <text name="high_label" value="Alto"/>
- <text name="high_triangles" value="0"/>
- <text name="high_vertices" value="0"/>
- <text name="medium_label" value="Medio"/>
- <text name="medium_triangles" value="0"/>
- <text name="medium_vertices" value="0"/>
- <text name="low_label" value="Basso"/>
- <text name="low_triangles" value="0"/>
- <text name="low_vertices" value="0"/>
- <text name="lowest_label" value="Bassissimo"/>
- <text name="lowest_triangles" value="0"/>
- <text name="lowest_vertices" value="0"/>
- <text name="lod_table_footer">
- Livello di dettaglio: [DETAIL]
- </text>
- <radio_group name="lod_file_or_limit" value="lod_from_file">
- <radio_item label="Carica da file" name="lod_from_file"/>
- <radio_item label="Genera automaticamente" name="lod_auto_generate"/>
- <radio_item label="Nessuno" name="lod_none"/>
- </radio_group>
- <button label="Sfoglia..." name="lod_browse"/>
- <combo_box name="lod_mode">
- <combo_item name="triangle_limit">
- Limite triangoli
- </combo_item>
- <combo_item name="error_threshold">
- Limite errori
- </combo_item>
- </combo_box>
- <text name="build_operator_text">
- Operatore costruzione:
- </text>
- <text name="queue_mode_text">
- Modalità di coda:
- </text>
- <combo_box name="build_operator">
- <combo_item name="edge_collapse">
- Collassa bordo
- </combo_item>
- <combo_item name="half_edge_collapse">
- Collassa mezzo bordo
- </combo_item>
- </combo_box>
- <combo_box name="queue_mode">
- <combo_item name="greedy">
- Ingordo
- </combo_item>
- <combo_item name="lazy">
- Pigro
- </combo_item>
- <combo_item name="independent">
- Indipendente
- </combo_item>
- </combo_box>
- <text name="border_mode_text">
- Modalità bordo:
+ <panel name="left_panel">
+ <panel name="model_name_representation_panel">
+ <text name="name_label">
+ Nome modello:
</text>
- <text name="share_tolderance_text">
- Tolleranza condivisione:
+ <text name="model_category_label">
+ Questo modello rappresenta...
</text>
- <combo_box name="border_mode">
- <combo_item name="border_unlock">
- Sblocca
- </combo_item>
- <combo_item name="border_lock">
- Blocca
- </combo_item>
+ <combo_box name="model_category_combo">
+ <combo_item label="Seleziona uno..." name="Choose one"/>
+ <combo_item label="Forma avatar" name="Avatar shape"/>
+ <combo_item label="Elemento collegato all&apos;avatar" name="Avatar attachment"/>
+ <combo_item label="Oggetto mobile (veicolo, animale)" name="Moving object (vehicle, animal)"/>
+ <combo_item label="Componente edificio" name="Building Component"/>
+ <combo_item label="Grande, immobile, ecc." name="Large, non moving etc"/>
+ <combo_item label="Piccolo, immobile, ecc." name="Smaller, non-moving etc"/>
+ <combo_item label="Nessuno di questi" name="Not really any of these"/>
</combo_box>
- <text name="crease_label">
- Angolo piega:
- </text>
- <spinner name="crease_angle" value="75"/>
</panel>
- <panel label="Fisica" name="physics_panel">
- <panel name="physics geometry">
- <radio_group name="physics_load_radio" value="physics_load_from_file">
- <radio_item label="File:" name="physics_load_from_file"/>
- <radio_item label="Usa livello di dettaglio:" name="physics_use_lod"/>
- </radio_group>
- <combo_box name="physics_lod_combo" tool_tip="Livello di dettaglio per forma fisica">
- <combo_item name="physics_lowest">
- Bassissimo
- </combo_item>
- <combo_item name="physics_low">
- Basso
- </combo_item>
- <combo_item name="physics_medium">
- Medio
- </combo_item>
- <combo_item name="physics_high">
- Alto
- </combo_item>
- </combo_box>
- <button label="Sfoglia..." name="physics_browse"/>
- </panel>
- <panel name="physics analysis">
- <slider label="Liscia:" name="Smooth"/>
- <check_box label="Chiudi fori (lento)" name="Close Holes (Slow)"/>
- <button label="Analizza" name="Decompose"/>
- <button label="Annulla" name="decompose_cancel"/>
+ <tab_container name="import_tab">
+ <panel label="Livello di dettaglio" name="lod_panel" title="Livello di dettaglio">
+ <text initial_value="Fonte" name="source" value="Fonte"/>
+ <text initial_value="Triangoli" name="triangles" value="Triangoli"/>
+ <text initial_value="Vertici" name="vertices" value="Vertici"/>
+ <text initial_value="Alto" name="high_label" value="Alto"/>
+ <button label="Sfoglia..." name="lod_browse_high"/>
+ <text initial_value="0" name="high_triangles" value="0"/>
+ <text initial_value="0" name="high_vertices" value="0"/>
+ <text initial_value="Medio" name="medium_label" value="Medio"/>
+ <button label="Sfoglia..." name="lod_browse_medium"/>
+ <text initial_value="0" name="medium_triangles" value="0"/>
+ <text initial_value="0" name="medium_vertices" value="0"/>
+ <text initial_value="Basso" name="low_label" value="Basso"/>
+ <button label="Sfoglia..." name="lod_browse_low"/>
+ <text initial_value="0" name="low_triangles" value="0"/>
+ <text initial_value="0" name="low_vertices" value="0"/>
+ <text initial_value="Bassissimo" name="lowest_label" value="Bassissimo"/>
+ <button label="Sfoglia..." name="lod_browse_lowest"/>
+ <text initial_value="0" name="lowest_triangles" value="0"/>
+ <text initial_value="0" name="lowest_vertices" value="0"/>
+ <check_box label="Genera normali" name="gen_normals"/>
+ <text initial_value="Angolo piega:" name="crease_label" value="Angolo piega:"/>
+ <spinner name="crease_angle" value="75"/>
</panel>
- <panel name="physics simplification">
- <slider label="Passaggi:" name="Combine Quality"/>
- <slider label="Scala dettagli:" name="Detail Scale"/>
- <slider label="Mantieni:" name="Retain%"/>
- <button label="Semplifica" name="Simplify"/>
- <button label="Annulla" name="simplify_cancel"/>
+ <panel label="Fisica" name="physics_panel">
+ <panel name="physics geometry">
+ <text name="first_step_name">
+ Passaggio 1: Livello di dettaglio
+ </text>
+ <combo_box name="physics_lod_combo" tool_tip="Livello di dettaglio per forma fisica">
+ <combo_item name="choose_one">
+ Seleziona uno...
+ </combo_item>
+ <combo_item name="physics_high">
+ Alto
+ </combo_item>
+ <combo_item name="physics_medium">
+ Medio
+ </combo_item>
+ <combo_item name="physics_low">
+ Basso
+ </combo_item>
+ <combo_item name="physics_lowest">
+ Bassissimo
+ </combo_item>
+ <combo_item name="load_from_file">
+ Da file
+ </combo_item>
+ </combo_box>
+ <button label="Sfoglia..." name="physics_browse"/>
+ </panel>
+ <panel name="physics analysis">
+ <text name="method_label">
+ Passaggio 2: Analizza
+ </text>
+ <text name="analysis_method_label">
+ Metodo:
+ </text>
+ <text name="quality_label">
+ Qualità:
+ </text>
+ <text name="smooth_method_label">
+ Liscia:
+ </text>
+ <check_box label="Chiudi fori" name="Close Holes (Slow)"/>
+ <button label="Analizza" name="Decompose"/>
+ <button label="Annulla" name="decompose_cancel"/>
+ </panel>
+ <panel name="physics simplification">
+ <text name="second_step_label">
+ Passaggio 3: Semplifica
+ </text>
+ <text name="simp_method_header">
+ Metodo:
+ </text>
+ <text name="pass_method_header">
+ Passaggi:
+ </text>
+ <text name="Detail Scale label">
+ Scala dettagli:
+ </text>
+ <text name="Retain%_label">
+ Mantieni:
+ </text>
+ <combo_box name="Combine Quality" value="1"/>
+ <button label="Semplifica" name="Simplify"/>
+ <button label="Annulla" name="simplify_cancel"/>
+ </panel>
+ <panel name="physics info">
+ <text name="results_text">
+ Risultati:
+ </text>
+ <text name="physics_triangles">
+ Triangoli: [TRIANGLES],
+ </text>
+ <text name="physics_points">
+ Vertici: [POINTS],
+ </text>
+ <text name="physics_hulls">
+ Scafi: [HULLS]
+ </text>
+ </panel>
</panel>
- <panel name="physics info">
- <slider label="Ampiezza anteprima:" name="physics_explode"/>
- <text name="physics_triangles">
- Triangoli: [TRIANGLES]
+ <panel label="Carica opzioni" name="modifiers_panel">
+ <text name="scale_label">
+ Scala (1=nessuna scala):
</text>
- <text name="physics_points">
- Vertici: [POINTS]
+ <spinner name="import_scale" value="1.0"/>
+ <text name="dimensions_label">
+ Dimensioni:
</text>
- <text name="physics_hulls">
- Inviluppi: [HULLS]
+ <text name="import_dimensions">
+ [X] X [Y] X [Z]
</text>
+ <check_box label="Includi texture" name="upload_textures"/>
+ <text name="include_label">
+ Solo per modelli avatar:
+ </text>
+ <check_box label="Includi peso pelle" name="upload_skin"/>
+ <check_box label="Includi posizioni giunti" name="upload_joints"/>
+ <text name="pelvis_offset_label">
+ Spostamento Z (sposta l&apos;avatar in alto o in basso):
+ </text>
+ <spinner name="pelvis_offset" value="0.0"/>
</panel>
- </panel>
- <panel label="Modificatori" name="modifiers_panel">
- <spinner name="import_scale" value="1.0"/>
- <text name="import_dimensions">
- [X] x [Y] x [Z] m
+ </tab_container>
+ <panel name="weights_and_warning_panel">
+ <button label="Calcolare pesi e tariffa" name="calculate_btn" tool_tip="Calcolare pesi e tariffa"/>
+ <button label="Annulla" name="cancel_btn"/>
+ <button label="Carica" name="ok_btn" tool_tip="Carica al simulatore"/>
+ <button label="Annulla impostazioni e ripristina modulo" name="reset_btn"/>
+ <text name="upload_fee">
+ Costo caricamento: L$ [FEE]
+ </text>
+ <text name="prim_weight">
+ Impatto sul terreno: [EQ]
+ </text>
+ <text name="download_weight">
+ Download: [ST]
+ </text>
+ <text name="physics_weight">
+ Fisica: [PH]
+ </text>
+ <text name="server_weight">
+ Server: [SIM]
+ </text>
+ <text name="warning_title">
+ NOTA:
+ </text>
+ <text name="warning_message">
+ Non hai l&apos;autorizzazione per caricare i modelli di reticolo. [[VURL] Scopri come] ottenere la certificazione.
+ </text>
+ <text name="status">
+ [STATUS]
</text>
- <check_box label="Texture" name="upload_textures"/>
- <check_box label="Peso pelle" name="upload_skin"/>
- <check_box label="Posizioni giunti" name="upload_joints"/>
- <spinner name="pelvis_offset" value="0.0"/>
</panel>
- </tab_container>
- <text name="upload_fee">
- Costo caricamento: L$ [FEE]
+ </panel>
+ <text name="lod_label">
+ Anteprima:
</text>
- <button label="Imposta sui valori predefiniti" name="reset_btn" tool_tip="Imposta sui valori predefiniti"/>
- <button label="Calcolare pesi e tariffa" name="calculate_btn" tool_tip="Calcolare pesi e tariffa"/>
- <button label="Carica sul server" name="ok_btn" tool_tip="Carica al simulatore"/>
- <button label="Annulla" name="cancel_btn"/>
+ <panel name="right_panel">
+ <combo_box name="preview_lod_combo" tool_tip="Livello di dettaglio per anteprima rendering">
+ <combo_item name="high">
+ Alto
+ </combo_item>
+ <combo_item name="medium">
+ Medio
+ </combo_item>
+ <combo_item name="low">
+ Basso
+ </combo_item>
+ <combo_item name="lowest">
+ Bassissimo
+ </combo_item>
+ </combo_box>
+ <text name="label_display">
+ Visualizzazione...
+ </text>
+ <check_box label="Bordi" name="show_edges"/>
+ <check_box label="Fisica" name="show_physics"/>
+ <check_box label="Texture" name="show_textures"/>
+ <check_box label="Pesi pelle" name="show_skin_weight"/>
+ <check_box label="Giunti" name="show_joint_positions"/>
+ <text name="physics_explode_label">
+ Anteprima spaziatura:
+ </text>
+ </panel>
</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_model_wizard.xml b/indra/newview/skins/default/xui/it/floater_model_wizard.xml
index dbf41e2daf..7c1b13c18f 100644
--- a/indra/newview/skins/default/xui/it/floater_model_wizard.xml
+++ b/indra/newview/skins/default/xui/it/floater_model_wizard.xml
@@ -6,26 +6,23 @@
<button label="2. Ottimizza" name="optimize_btn"/>
<button label="1. Seleziona file" name="choose_file_btn"/>
<panel name="choose_file_panel">
- <panel name="choose_file_header_panel">
- <text name="choose_file_header_text">
+ <panel name="header_panel">
+ <text name="header_text">
Seleziona file modello
</text>
</panel>
- <panel name="choose_file_content_panel">
+ <panel name="content">
<text name="advanced_users_text">
Utenti avanzati: Gli utenti che hanno dimestichezza con gli strumenti di creazione 3D possono usare le opzioni di caricamento avanzate.
</text>
<button label="Passa a modalità avanzata" name="switch_to_advanced"/>
- <text name="choose_model_file_label">
+ <text name="Cache location">
Scegli il file del modello da caricare
</text>
<button label="Sfoglia..." label_selected="Sfoglia..." name="browse"/>
- <text name="support_collada_text">
+ <text name="Model types">
Second Life supporta file COLLADA (.dae)
</text>
- <text name="dimensions_label">
- Dimensioni (metri):
- </text>
<text name="dimensions">
X Y Z
</text>
@@ -38,18 +35,15 @@
</panel>
</panel>
<panel name="optimize_panel">
- <panel name="optimize_header_panel">
- <text name="optimize_header_text">
+ <panel name="header_panel">
+ <text name="header_text">
Ottimizza modello
</text>
</panel>
- <text name="optimize_hint">
+ <text name="description">
Abbiamo ottimizzato il modello per migliorare le prestazioni. Se necessario, può essere regolato ulteriormente.
</text>
- <panel name="optimize_content_panel">
- <text name="generating_lod_label">
- Generazione livello di dettaglio
- </text>
+ <panel name="content">
<text name="high_detail_text">
Genera livello di dettaglio: Alto
</text>
@@ -64,123 +58,64 @@
</text>
</panel>
<panel name="content2">
- <text name="optimize_performance_text">
- Prestazioni
- </text>
- <text name="optimize_faster_rendering_text">
- Rendering più veloce
-Meno dettagli
-Peso prim più basso
- </text>
- <text name="optimize_accuracy_text">
- Fedeltà
- </text>
- <text name="optimize_slower_rendering_text">
- Rendering più lento
-Più dettagli
-Peso prim più elevato
- </text>
- <text name="accuracy_slider_mark1">
- &apos;
- </text>
- <text name="accuracy_slider_mark2">
- &apos;
- </text>
- <text name="accuracy_slider_mark3">
- &apos;
- </text>
<button label="Ricalcola geometria" name="recalculate_geometry_btn"/>
- <text name="geometry_preview_label">
+ <text name="lod_label">
Anteprima geometria
</text>
<combo_box name="preview_lod_combo" tool_tip="Livello di dettaglio per anteprima rendering">
- <combo_item name="preview_lod_high">
+ <combo_item name="high">
Molti dettagli
</combo_item>
- <combo_item name="preview_lod_medium">
+ <combo_item name="medium">
Dettagli medi
</combo_item>
- <combo_item name="preview_lod_low">
+ <combo_item name="low">
Meno dettagli
</combo_item>
- <combo_item name="preview_lod_lowest">
+ <combo_item name="lowest">
Dettaglio minimo
</combo_item>
</combo_box>
</panel>
</panel>
<panel name="physics_panel">
- <panel name="physics_header_panel">
- <text name="physics_header_text">
+ <panel name="header_panel">
+ <text name="header_text">
Modifica fisica
</text>
</panel>
- <text name="physics_hint">
+ <text name="description">
Verrà creata una forma per lo scafo esterno del modello. Regola il livello di dettaglio della forma in base al fine desiderato del modello.
</text>
- <panel name="physics_content_panel">
- <text name="physics_performance_text">
- Prestazioni
- </text>
- <text name="physics_faster_rendering_text">
- Rendering più veloce
-Meno dettagli
-Peso prim più basso
- </text>
- <text name="physics_accuracy_text">
- Fedeltà
- </text>
- <text name="physics_slower_dendering_text">
- Rendering più lento
-Più dettagli
-Peso prim più elevato
- </text>
- <text name="physics_example_1">
- Esempi:
-Oggetti in movimento
-Oggetti in volo
-Veicoli
- </text>
- <text name="physics_example_2">
- Esempi:
-Piccoli oggetti statici
-Oggetti meno dettagliati
-Mobili semplici
- </text>
- <text name="physics_example_3">
- Esempi:
-Oggetti statici
-Oggetti dettagliati
-Edifici
- </text>
+ <panel name="content">
<button label="Ricalcola fisica" name="recalculate_physics_btn"/>
<button label="Ricalcolo in corso..." name="recalculating_physics_btn"/>
- <text name="physics_preview_label">
+ <text name="lod_label">
Anteprima fisica
</text>
<combo_box name="preview_lod_combo2" tool_tip="Livello di dettaglio per anteprima rendering">
- <combo_item name="preview_lod2_high">
+ <combo_item name="high">
Molti dettagli
</combo_item>
- <combo_item name="preview_lod2_medium">
+ <combo_item name="medium">
Dettagli medi
</combo_item>
- <combo_item name="preview_lod2_low">
+ <combo_item name="low">
Meno dettagli
</combo_item>
- <combo_item name="preview_lod2_lowest">
+ <combo_item name="lowest">
Dettaglio minimo
</combo_item>
</combo_box>
</panel>
</panel>
<panel name="review_panel">
- <panel name="review_header_panel">
- <text name="review_header_text">
+ <panel name="header_panel">
+ <text name="header_text">
Rivedi
</text>
</panel>
- <panel name="review_content_panel">
+ <panel name="content">
<text name="review_prim_equiv">
Impatto sul lotto o sulla regione: [EQUIV] prim equivalenti
</text>
@@ -193,8 +128,8 @@ Edifici
</panel>
</panel>
<panel name="upload_panel">
- <panel name="upload_header_panel">
- <text name="upload_header_text">
+ <panel name="header_panel">
+ <text name="header_text">
Caricamento completato
</text>
</panel>
diff --git a/indra/newview/skins/default/xui/it/floater_moveview.xml b/indra/newview/skins/default/xui/it/floater_moveview.xml
index cdafdb0089..1237bd06a9 100644
--- a/indra/newview/skins/default/xui/it/floater_moveview.xml
+++ b/indra/newview/skins/default/xui/it/floater_moveview.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="move_floater">
+<floater name="move_floater" title="CAMMINA / CORRI / VOLA">
<string name="walk_forward_tooltip">
Cammina in avanti (premi freccia su o W)
</string>
@@ -58,14 +58,14 @@
Vola
</string>
<panel name="panel_actions">
- <button label="" label_selected="" name="move up btn" tool_tip="Vola in alto (premi E)"/>
<button label="" label_selected="" name="turn left btn" tool_tip="Gira a sinistra (premi freccia sinistra o A)"/>
<joystick_slide name="move left btn" tool_tip="Cammina a sinistra (premi Maiusc + freccia sinistra o A)"/>
- <button label="" label_selected="" name="move down btn" tool_tip="Vola in basso (premi C)"/>
<button label="" label_selected="" name="turn right btn" tool_tip="Gira a destra (premi freccia destra o D)"/>
<joystick_slide name="move right btn" tool_tip="Cammina a destra (premi Maiusc + freccia destra o D)"/>
<joystick_turn name="forward btn" tool_tip="Cammina in avanti (premi freccia su o W)"/>
<joystick_turn name="backward btn" tool_tip="Cammina indietro (premi freccia giù o S)"/>
+ <button label="" label_selected="" name="move up btn" tool_tip="Vola in alto (premi E)"/>
+ <button label="" label_selected="" name="move down btn" tool_tip="Vola in basso (premi C)"/>
</panel>
<panel name="panel_modes">
<button label="" name="mode_walk_btn" tool_tip="Modalità cammina"/>
diff --git a/indra/newview/skins/default/xui/it/floater_my_appearance.xml b/indra/newview/skins/default/xui/it/floater_my_appearance.xml
new file mode 100644
index 0000000000..39ddd6186a
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/floater_my_appearance.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_my_appearance" title="ASPETTO">
+ <panel label="Modifica aspetto" name="main_panel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_my_inventory.xml b/indra/newview/skins/default/xui/it/floater_my_inventory.xml
new file mode 100644
index 0000000000..0efd9f1c6d
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/floater_my_inventory.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_my_inventory" title="INVENTARIO"/>
diff --git a/indra/newview/skins/default/xui/it/floater_nearby_chat.xml b/indra/newview/skins/default/xui/it/floater_nearby_chat.xml
index 4c41df8a62..9e81899880 100644
--- a/indra/newview/skins/default/xui/it/floater_nearby_chat.xml
+++ b/indra/newview/skins/default/xui/it/floater_nearby_chat.xml
@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="nearby_chat" title="CHAT NEI DINTORNI">
- <check_box label="Traduci chat (tecnologia Google)" name="translate_chat_checkbox"/>
+ <check_box label="Traduci chat" name="translate_chat_checkbox"/>
</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_object_weights.xml b/indra/newview/skins/default/xui/it/floater_object_weights.xml
new file mode 100644
index 0000000000..fdcb732dee
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/floater_object_weights.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="object_weights" title="AVANZATE">
+ <floater.string name="nothing_selected" value="--"/>
+ <text name="selected_text" value="SELEZIONATI"/>
+ <text name="objects" value="--"/>
+ <text name="objects_label" value="Oggetti"/>
+ <text name="prims" value="--"/>
+ <text name="prims_label" value="Prim"/>
+ <text name="weights_of_selected_text" value="PESO ELEMENTI SELEZIONATI"/>
+ <text name="download" value="--"/>
+ <text name="download_label" value="Scarica"/>
+ <text name="physics" value="--"/>
+ <text name="physics_label" value="Fisica"/>
+ <text name="server" value="--"/>
+ <text name="server_label" value="Server"/>
+ <text name="display" value="--"/>
+ <text name="display_label" value="Visualizzazione"/>
+ <text name="land_impacts_text" value="IMPATTO TERRENO"/>
+ <text name="selected" value="--"/>
+ <text name="selected_label" value="Selezionati"/>
+ <text name="rezzed_on_land" value="--"/>
+ <text name="rezzed_on_land_label" value="Rezzati sul terreno"/>
+ <text name="remaining_capacity" value="--"/>
+ <text name="remaining_capacity_label" value="Capacità restante"/>
+ <text name="total_capacity" value="--"/>
+ <text name="total_capacity_label" value="Capacità totale"/>
+ <text name="help_SLURL" value="[secondlife:///app/help/object_weights Di cosa si tratta?...]"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_outfit_save_as.xml b/indra/newview/skins/default/xui/it/floater_outfit_save_as.xml
new file mode 100644
index 0000000000..55bb5adb1e
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/floater_outfit_save_as.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="modal container" title="SALVA ABITO"/>
diff --git a/indra/newview/skins/default/xui/it/floater_people.xml b/indra/newview/skins/default/xui/it/floater_people.xml
new file mode 100644
index 0000000000..1acc3cbf19
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/floater_people.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_people" title="PERSONE">
+ <panel_container name="main_panel">
+ <panel label="Profilo del gruppo" name="panel_group_info_sidetray"/>
+ <panel label="Residenti e oggetti bloccati" name="panel_block_list_sidetray"/>
+ </panel_container>
+</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_picks.xml b/indra/newview/skins/default/xui/it/floater_picks.xml
new file mode 100644
index 0000000000..dfc539da66
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/floater_picks.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_picks" title="Preferiti"/>
diff --git a/indra/newview/skins/default/xui/it/floater_places.xml b/indra/newview/skins/default/xui/it/floater_places.xml
new file mode 100644
index 0000000000..cd46cf8b59
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/floater_places.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_places" title="LUOGHI">
+ <panel label="Luoghi" name="main_panel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_snapshot.xml b/indra/newview/skins/default/xui/it/floater_snapshot.xml
index 5bff19e8d7..bff6081bdf 100644
--- a/indra/newview/skins/default/xui/it/floater_snapshot.xml
+++ b/indra/newview/skins/default/xui/it/floater_snapshot.xml
@@ -1,75 +1,65 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Snapshot" title="ANTEPRIMA FOTOGRAFIA" width="247">
+<floater name="Snapshot" title="ANTEPRIMA FOTOGRAFIA">
<floater.string name="unknown">
sconosciuto
</floater.string>
- <radio_group label="Tipo di fotografia" name="snapshot_type_radio">
- <radio_item label="E-mail" name="postcard"/>
- <radio_item label="Il mio inventario (L$[AMOUNT])" name="texture"/>
- <radio_item label="Salva sul mio computer" name="local"/>
- </radio_group>
+ <string name="postcard_progress_str">
+ Invio e-mail in corso
+ </string>
+ <string name="profile_progress_str">
+ Caricamento post
+ </string>
+ <string name="inventory_progress_str">
+ Salva nell&apos;inventario
+ </string>
+ <string name="local_progress_str">
+ Salvataggio sul computer in corso
+ </string>
+ <string name="profile_succeeded_str">
+ Immagine caricata
+ </string>
+ <string name="postcard_succeeded_str">
+ E-mail inviata.
+ </string>
+ <string name="inventory_succeeded_str">
+ Salvato nell&apos;inventario.
+ </string>
+ <string name="local_succeeded_str">
+ Salvato sul computer.
+ </string>
+ <string name="profile_failed_str">
+ Caricamento immagine sul feed del profilo non riuscito.
+ </string>
+ <string name="postcard_failed_str">
+ Invio e-mail non riuscito.
+ </string>
+ <string name="inventory_failed_str">
+ Non salvato nell&apos;inventario.
+ </string>
+ <string name="local_failed_str">
+ Non salvato sul computer.
+ </string>
+ <button name="advanced_options_btn" tool_tip="Opzioni Avanzate"/>
+ <text name="image_res_text">
+ [WIDTH] x [HEIGHT] px
+ </text>
<text name="file_size_label">
[SIZE] KB
</text>
- <button label="Aggiorna la fotografia" name="new_snapshot_btn"/>
- <button label="Invia" name="send_btn"/>
- <button label="Salva ([AMOUNT] L$)" name="upload_btn"/>
- <flyout_button label="Salva" name="save_btn" tool_tip="Salva immagine come file">
- <flyout_button.item label="Salva" name="save_item"/>
- <flyout_button.item label="Salva con nome..." name="saveas_item"/>
- </flyout_button>
- <button label="Altro" name="more_btn" tool_tip="Opzioni Avanzate"/>
- <button label="Meno" name="less_btn" tool_tip="Opzioni Avanzate"/>
- <button label="Annulla" name="discard_btn"/>
- <text name="type_label2">
- Dimensioni
- </text>
- <text name="format_label">
- Formato
- </text>
- <combo_box label="Risoluzione" name="postcard_size_combo">
- <combo_box.item label="Finestra attuale" 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="Personalizza" name="Custom"/>
- </combo_box>
- <combo_box label="Risoluzione" name="texture_size_combo">
- <combo_box.item label="Finestra attuale" name="CurrentWindow"/>
- <combo_box.item label="Piccola (128x128)" name="Small(128x128)"/>
- <combo_box.item label="Media (256x256)" name="Medium(256x256)"/>
- <combo_box.item label="Grande (512x512)" name="Large(512x512)"/>
- <combo_box.item label="Personalizza" name="Custom"/>
- </combo_box>
- <combo_box label="Risoluzione" name="local_size_combo">
- <combo_box.item label="Finestra attuale" name="CurrentWindow"/>
- <combo_box.item label="320x240" name="320x240"/>
- <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="1280x1024" name="1280x1024"/>
- <combo_box.item label="1600x1200" name="1600x1200"/>
- <combo_box.item label="Personalizza" name="Custom"/>
- </combo_box>
- <combo_box label="Formato" name="local_format_combo">
- <combo_box.item label="PNG" name="PNG"/>
- <combo_box.item label="JPEG" name="JPEG"/>
- <combo_box.item label="BMP" name="BMP"/>
- </combo_box>
- <spinner label="Larghezza" name="snapshot_width"/>
- <spinner label="Altezza" name="snapshot_height"/>
- <check_box label="Mantieni le proporzioni" name="keep_aspect_check"/>
- <slider label="Qualità dell&apos;immagine" name="image_quality_slider"/>
- <text name="layer_type_label">
- Cattura:
- </text>
- <combo_box label="Layer dell&apos;immagine" name="layer_types">
- <combo_box.item label="Colori" name="Colors"/>
- <combo_box.item label="Profondità" name="Depth"/>
- </combo_box>
- <check_box label="Interfaccia" name="ui_check"/>
- <check_box label="HUD" name="hud_check"/>
- <check_box label="Tieni aperta dopo il salvataggio" name="keep_open_check"/>
- <check_box label="Congela il frame (tutto schermo)" name="freeze_frame_check"/>
- <check_box label="Aggiornamento automatico" name="auto_snapshot_check"/>
+ <panel name="advanced_options_panel">
+ <text name="advanced_options_label">
+ OPZIONI AVANZATE
+ </text>
+ <text name="layer_type_label">
+ Cattura:
+ </text>
+ <combo_box label="Layer dell&apos;immagine" name="layer_types">
+ <combo_box.item label="Colori" name="Colors"/>
+ <combo_box.item label="Profondità" name="Depth"/>
+ </combo_box>
+ <check_box label="Interfaccia" name="ui_check"/>
+ <check_box label="HUD" name="hud_check"/>
+ <check_box label="Congela il frame (tutto schermo)" name="freeze_frame_check"/>
+ <check_box label="Aggiornamento automatico" name="auto_snapshot_check"/>
+ </panel>
</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_sound_devices.xml b/indra/newview/skins/default/xui/it/floater_sound_devices.xml
index df4b8f4878..9799b48d89 100644
--- a/indra/newview/skins/default/xui/it/floater_sound_devices.xml
+++ b/indra/newview/skins/default/xui/it/floater_sound_devices.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_sound_devices" title="Dispositivi sonori">
+<floater name="floater_sound_devices" title="DISPOSITIVI AUDIO">
<text name="voice_label">
Chat vocale
</text>
diff --git a/indra/newview/skins/default/xui/it/floater_stats.xml b/indra/newview/skins/default/xui/it/floater_stats.xml
index aed2a03a21..ad6ef6b54b 100644
--- a/indra/newview/skins/default/xui/it/floater_stats.xml
+++ b/indra/newview/skins/default/xui/it/floater_stats.xml
@@ -10,8 +10,8 @@
</stat_view>
<stat_view label="Avanzata" name="advanced">
<stat_view label="Render" name="render">
- <stat_bar label="KTris disegnate" name="ktrisframe"/>
- <stat_bar label="KTris disegnate" name="ktrissec"/>
+ <stat_bar label="KTris disegnato per fotogramma" name="ktrisframe"/>
+ <stat_bar label="KTris disegnato per secondo" name="ktrissec"/>
<stat_bar label="Totale oggetti" name="objs"/>
<stat_bar label="Nuovi oggetti" name="newobjs"/>
</stat_view>
@@ -32,7 +32,7 @@
<stat_bar label="Layer" name="layerskbitstat"/>
<stat_bar label="Effettivi in ingresso" name="actualinkbitstat"/>
<stat_bar label="Effettivi in uscita" name="actualoutkbitstat"/>
- <stat_bar label="Operazioni pendenti VFS" name="vfspendingoperations"/>
+ <stat_bar label="Operazioni VFS in sospeso" name="vfspendingoperations"/>
</stat_view>
</stat_view>
<stat_view label="Simulatore" name="sim">
@@ -43,18 +43,6 @@
<stat_bar label="Oggetti pinzati" name="physicspinnedtasks"/>
<stat_bar label="Oggetti a basso LOD" name="physicslodtasks"/>
<stat_bar label="Memoria allocata" name="physicsmemoryallocated"/>
- <stat_bar label="Aggiornamenti agenti al sec" name="simagentups"/>
- <stat_bar label="Avatar principali" name="simmainagents"/>
- <stat_bar label="Avatar secondari" name="simchildagents"/>
- <stat_bar label="Oggetti" name="simobjects"/>
- <stat_bar label="Oggetti attivi" name="simactiveobjects"/>
- <stat_bar label="Script attivi" name="simactivescripts"/>
- <stat_bar label="Eventi di script" name="simscripteps"/>
- <stat_bar label="Pacchetti in ingresso" name="siminpps"/>
- <stat_bar label="Pacchetti in uscita" name="simoutpps"/>
- <stat_bar label="Download in attesa" name="simpendingdownloads"/>
- <stat_bar label="Caricamenti in attesa" name="simpendinguploads"/>
- <stat_bar label="Numero totale byte non confermati (Unacked)" name="simtotalunackedbytes"/>
</stat_view>
<stat_view label="Tempo (ms)" name="simperf">
<stat_bar label="Tempo totale Frame" name="simframemsec"/>
@@ -64,6 +52,14 @@
<stat_bar label="Tempo avatar" name="simagentmsec"/>
<stat_bar label="Tempo immagini" name="simimagesmsec"/>
<stat_bar label="Tempo script" name="simscriptmsec"/>
+ <stat_bar label="Tempo libero" name="simsparemsec"/>
+ <stat_view label="Dettagli tempo (ms)" name="timedetails">
+ <stat_bar label="Passaggio fisica" name="simsimphysicsstepmsec"/>
+ <stat_bar label="Aggiorna forme fisica" name="simsimphysicsshapeupdatemsec"/>
+ <stat_bar label="Altro fisica" name="simsimphysicsothermsec"/>
+ <stat_bar label="Tempo pausa" name="simsleepmsec"/>
+ <stat_bar label="IO pompa" name="simpumpiomsec"/>
+ </stat_view>
</stat_view>
</stat_view>
</container_view>
diff --git a/indra/newview/skins/default/xui/it/floater_tools.xml b/indra/newview/skins/default/xui/it/floater_tools.xml
index d3b1503742..0d981e2424 100644
--- a/indra/newview/skins/default/xui/it/floater_tools.xml
+++ b/indra/newview/skins/default/xui/it/floater_tools.xml
@@ -25,10 +25,10 @@
Clicca e trascina per selezionare il terreno
</floater.string>
<floater.string name="status_selectcount">
- [OBJ_COUNT] oggetti ( [PRIM_COUNT] prim [PE_STRING] ) selezionati
+ [OBJ_COUNT] oggetti selezionati, impatto terreno [LAND_IMPACT]
</floater.string>
- <floater.string name="status_selectprimequiv">
- , [SEL_WEIGHT] prim equivalenti
+ <floater.string name="status_remaining_capacity">
+ Capacità restante [LAND_CAPACITY].
</floater.string>
<button label="" label_selected="" name="button focus" tool_tip="Ingrandisci"/>
<button label="" label_selected="" name="button move" tool_tip="Sposta"/>
@@ -106,8 +106,8 @@
<text name="selection_empty">
Nessuna selezione.
</text>
- <text name="selection_weight">
- Peso fisica [PHYS_WEIGHT], costo rendering [DISP_WEIGHT].
+ <text name="remaining_capacity">
+ [CAPACITY_STRING] [secondlife:///app/openfloater/object_weights Maggiori informazioni]
</text>
<tab_container name="Object Info Tabs">
<panel label="Generale" name="General">
@@ -326,7 +326,6 @@
Tipo di congiunzione
</text>
<combo_box name="sculpt type control">
- <combo_box.item label="(nessuna)" name="None"/>
<combo_box.item label="Sferica" name="Sphere"/>
<combo_box.item label="Toroidale" name="Torus"/>
<combo_box.item label="Piana" name="Plane"/>
diff --git a/indra/newview/skins/default/xui/it/floater_toybox.xml b/indra/newview/skins/default/xui/it/floater_toybox.xml
new file mode 100644
index 0000000000..269e2831d0
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/floater_toybox.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Toybox" title="PULSANTI BARRA STRUMENTI">
+ <text name="toybox label 1">
+ Aggiungere o rimuovere pulsanti trascinandoli dentro o fuori dalle barre strumenti.
+ </text>
+ <text name="toybox label 2">
+ I pulsanti verranno visualizzati come mostrato o solo come icone, a seconda delle impostazioni della singola barra degli strumenti.
+ </text>
+ <button label="Cancella tutte le barre strumenti" label_selected="Cancella tutte le barre strumenti" name="btn_clear_all"/>
+ <button label="Ripristina predefiniti" label_selected="Ripristina predefiniti" name="btn_restore_defaults"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_translation_settings.xml b/indra/newview/skins/default/xui/it/floater_translation_settings.xml
new file mode 100644
index 0000000000..a0a34da723
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/floater_translation_settings.xml
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_translation_settings" title="IMPOSTAZIONI TRADUZIONE CHAT">
+ <string name="bing_api_key_not_verified">
+ appID Bing non verificato. Riprova.
+ </string>
+ <string name="google_api_key_not_verified">
+ Chiave API Google non verificata. Riprova.
+ </string>
+ <string name="bing_api_key_verified">
+ appID Bing verificato.
+ </string>
+ <string name="google_api_key_verified">
+ Chiave API Google verificata.
+ </string>
+ <check_box label="Usa la traduzione meccanica durante le chat" name="translate_chat_checkbox"/>
+ <text name="translate_language_label">
+ Traduci chat in:
+ </text>
+ <combo_box name="translate_language_combo">
+ <combo_box.item label="Predefinito di sistema" name="System Default Language"/>
+ <combo_box.item label="English (Inglese)" name="English"/>
+ <combo_box.item label="Dansk (Danese)" name="Danish"/>
+ <combo_box.item label="Deutsch (Tedesco)" name="German"/>
+ <combo_box.item label="Español (Spagnolo)" name="Spanish"/>
+ <combo_box.item label="Français (Francese)" name="French"/>
+ <combo_box.item label="Italiano" name="Italian"/>
+ <combo_box.item label="Magyar (Ungherese)" name="Hungarian"/>
+ <combo_box.item label="Nederlands (Olandese)" name="Dutch"/>
+ <combo_box.item label="Polski (Polacco)" name="Polish"/>
+ <combo_box.item label="Português (Portoghese)" name="Portugese"/>
+ <combo_box.item label="РуÑÑкий (Russo)" name="Russian"/>
+ <combo_box.item label="Türkçe (Turco)" name="Turkish"/>
+ <combo_box.item label="УкраїнÑька (Ucraino)" name="Ukrainian"/>
+ <combo_box.item label="中文 (正體) (Cinese)" name="Chinese"/>
+ <combo_box.item label="日本語 (Giapponese)" name="Japanese"/>
+ <combo_box.item label="한국어 (Coreano)" name="Korean"/>
+ </combo_box>
+ <text name="tip">
+ Seleziona il servizio di traduzione:
+ </text>
+ <radio_group name="translation_service_rg">
+ <radio_item initial_value="bing" label="Bing Translator" name="bing"/>
+ <radio_item initial_value="google" label="Google Translate" name="google"/>
+ </radio_group>
+ <text name="bing_api_key_label">
+ Bing [http://www.bing.com/developers/createapp.aspx AppID]:
+ </text>
+ <button label="Verifica" name="verify_bing_api_key_btn"/>
+ <text name="google_api_key_label">
+ Google [http://code.google.com/apis/language/translate/v2/getting_started.html#auth API key]:
+ </text>
+ <button label="Verifica" name="verify_google_api_key_btn"/>
+ <text name="google_links_text">
+ [http://code.google.com/apis/language/translate/v2/pricing.html Prezzi] | [https://code.google.com/apis/console Statistiche]
+ </text>
+ <button label="OK" name="ok_btn"/>
+ <button label="Annulla" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_voice_controls.xml b/indra/newview/skins/default/xui/it/floater_voice_controls.xml
index 0f0467757d..77973eef1e 100644
--- a/indra/newview/skins/default/xui/it/floater_voice_controls.xml
+++ b/indra/newview/skins/default/xui/it/floater_voice_controls.xml
@@ -1,16 +1,16 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_voice_controls" title="Regolazione voce">
+<floater name="floater_voice_controls" title="CONTROLLI VOCE">
<string name="title_nearby">
- VOCE NEI DINTORNI
+ IMPOSTAZIONI VOCE
</string>
<string name="title_group">
- Chiamata di gruppo con [GROUP]
+ CHIAMATA DI GRUPPO CON [GROUP]
</string>
<string name="title_adhoc">
- Chiamata in conferenza
+ CHIAMATA IN CONFERENZA
</string>
<string name="title_peer_2_peer">
- Chiamata con [NAME]
+ CHIAMATA CON [NAME]
</string>
<string name="no_one_near">
Nessuno nei dintorni ha attivato la funzione voce
diff --git a/indra/newview/skins/default/xui/it/menu_hide_navbar.xml b/indra/newview/skins/default/xui/it/menu_hide_navbar.xml
index 2c2c6c4bc5..48f6691fd8 100644
--- a/indra/newview/skins/default/xui/it/menu_hide_navbar.xml
+++ b/indra/newview/skins/default/xui/it/menu_hide_navbar.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu name="hide_navbar_menu">
- <menu_item_check label="Mostra la barra di navigazione" name="ShowNavbarNavigationPanel"/>
+ <menu_item_check label="Mostra navigazione e barra dei Preferiti" name="ShowNavbarNavigationPanel"/>
<menu_item_check label="Mostra la barra dei Preferiti" name="ShowNavbarFavoritesPanel"/>
<menu_item_check label="Mostra mini barra del luogo" name="ShowMiniLocationPanel"/>
</menu>
diff --git a/indra/newview/skins/default/xui/it/menu_login.xml b/indra/newview/skins/default/xui/it/menu_login.xml
index fe8bf703aa..834db974da 100644
--- a/indra/newview/skins/default/xui/it/menu_login.xml
+++ b/indra/newview/skins/default/xui/it/menu_login.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu_bar name="Login Menu">
<menu label="Io" name="File">
- <menu_item_call label="Preferenze" name="Preferences..."/>
+ <menu_item_call label="Preferenze..." name="Preferences..."/>
<menu_item_call label="Esci da [APP_NAME]" name="Quit"/>
</menu>
<menu label="Aiuto" name="Help">
diff --git a/indra/newview/skins/default/xui/it/menu_toolbars.xml b/indra/newview/skins/default/xui/it/menu_toolbars.xml
new file mode 100644
index 0000000000..604ca763d1
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/menu_toolbars.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Toolbars Popup">
+ <menu_item_call label="Rimuovi questo pulsante" name="Remove button"/>
+ <menu_item_call label="Pulsanti barra strumenti..." name="Choose Buttons"/>
+ <menu_item_check label="Icone ed etichette" name="icons_with_text"/>
+ <menu_item_check label="Solo icone" name="icons_only"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/it/menu_viewer.xml b/indra/newview/skins/default/xui/it/menu_viewer.xml
index 7e3b344117..5140d2b1ec 100644
--- a/indra/newview/skins/default/xui/it/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/it/menu_viewer.xml
@@ -1,54 +1,60 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu_bar name="Main Menu">
<menu label="Io" name="Me">
- <menu_item_call label="Preferenze" name="Preferences"/>
- <menu_item_call label="Il mio Dashboard" name="Manage My Account">
- <menu_item_call.on_click name="ManageMyAccount_url" parameter="WebLaunchJoinNow,http://secondlife.com/account/index.php?lang=it"/>
- </menu_item_call>
- <menu_item_call label="Compra L$" name="Buy and Sell L$"/>
- <menu_item_call label="Il mio profilo" name="Profile"/>
- <menu_item_call label="Il mio aspetto" name="ChangeOutfit"/>
- <menu_item_check label="Il mio inventario" name="Inventory"/>
- <menu_item_check label="Il mio inventario" name="ShowSidetrayInventory"/>
- <menu_item_check label="Le mie gesture" name="Gestures"/>
- <menu_item_check label="La mia voce" name="ShowVoice"/>
+ <menu_item_call label="Profilo..." name="Profile"/>
+ <menu_item_call label="Aspetto fisico..." name="ChangeOutfit"/>
+ <menu_item_call label="Scegli un avatar..." name="Avatar Picker"/>
+ <menu_item_check label="Inventario..." name="Inventory"/>
+ <menu_item_call label="Nuova finestra inventario" name="NewInventoryWindow"/>
+ <menu_item_call label="Luoghi..." name="Places"/>
+ <menu_item_call label="Preferiti..." name="Picks"/>
+ <menu_item_call label="Controlli fotocamera..." name="Camera Controls"/>
<menu label="Spostamento" name="Movement">
<menu_item_call label="Siedi" name="Sit Down Here"/>
<menu_item_check label="Vola" name="Fly"/>
<menu_item_check label="Corri sempre" name="Always Run"/>
<menu_item_call label="Ferma animazione" name="Stop Animating My Avatar"/>
</menu>
- <menu label="Il mio stato" name="Status">
+ <menu label="Stato" name="Status">
<menu_item_call label="Assente" name="Set Away"/>
<menu_item_call label="Non disponibile" name="Set Busy"/>
</menu>
<menu_item_call label="Richiedi diritti Admin" name="Request Admin Options"/>
<menu_item_call label="Lascia stato Admin" name="Leave Admin Options"/>
+ <menu_item_call label="Compra L$" name="Buy and Sell L$"/>
+ <menu_item_call label="Dashboard dell&apos;account..." name="Manage My Account">
+ <menu_item_call.on_click name="ManageMyAccount_url" parameter="WebLaunchJoinNow,http://secondlife.com/account/index.php?lang=it"/>
+ </menu_item_call>
+ <menu_item_call label="Preferenze..." name="Preferences"/>
+ <menu_item_call label="Pulsanti barra strumenti..." name="Toolbars"/>
+ <menu_item_call label="Nascondi tutti i controlli" name="Hide UI"/>
<menu_item_call label="Esci da [APP_NAME]" name="Quit"/>
</menu>
<menu label="Comunica" name="Communicate">
- <menu_item_call label="I miei amici..." name="My Friends"/>
- <menu_item_call label="I miei gruppi" name="My Groups"/>
- <menu_item_check label="Chat nei dintorni" name="Nearby Chat"/>
+ <menu_item_check label="Chat..." name="Nearby Chat"/>
+ <menu_item_check label="Parla" name="Speak"/>
+ <menu_item_check label="Impostazioni voce..." name="Nearby Voice"/>
+ <menu_item_check label="Manipolazione voce..." name="ShowVoice"/>
+ <menu_item_check label="Gesture..." name="Gestures"/>
+ <menu_item_call label="Amici" name="My Friends"/>
+ <menu_item_call label="Gruppi" name="My Groups"/>
<menu_item_call label="Persone vicine" name="Active Speakers"/>
- <menu_item_check label="Voce nei dintorni" name="Nearby Voice"/>
</menu>
<menu label="Mondo" name="World">
+ <menu_item_call label="Crea punto di riferimento per questo luogo" name="Create Landmark Here"/>
+ <menu_item_call label="Destinazioni..." name="Destinations"/>
+ <menu_item_check label="Mappamondo" name="World Map"/>
<menu_item_check label="Mini mappa" name="Mini-Map"/>
- <menu_item_check label="Mappa del mondo" name="World Map"/>
<menu_item_check label="Cerca" name="Search"/>
+ <menu_item_call label="Teleport a Casa" name="Teleport Home"/>
+ <menu_item_call label="Imposta come Casa mia" name="Set Home to Here"/>
<menu_item_call label="Istantanea" name="Take Snapshot"/>
- <menu_item_call label="Crea punto di riferimento per questo luogo" name="Create Landmark Here"/>
- <menu label="Profilo del luogo" name="Land">
- <menu_item_call label="Profilo del luogo" name="Place Profile"/>
- <menu_item_call label="Informazioni sui terreni" name="About Land"/>
- <menu_item_call label="Regione/proprietà immobiliare" name="Region/Estate"/>
- </menu>
+ <menu_item_call label="Profilo del luogo" name="Place Profile"/>
+ <menu_item_call label="Informazioni sul terreno" name="About Land"/>
+ <menu_item_call label="Regione/proprietà immobiliare" name="Region/Estate"/>
+ <menu_item_call label="Terreni posseduti..." name="My Land"/>
<menu_item_call label="Acquista questo terreno" name="Buy Land"/>
- <menu_item_call label="Il mio terreno" name="My Land"/>
<menu label="Mostra" name="LandShow">
- <menu_item_check label="Comandi del movimento" name="Movement Controls"/>
- <menu_item_check label="Comandi visualizzazione" name="Camera Controls"/>
<menu_item_check label="Linee di divieto" name="Ban Lines"/>
<menu_item_check label="Marcatori" name="beacons"/>
<menu_item_check label="Linee di confine" name="Property Lines"/>
@@ -57,29 +63,28 @@
<menu_item_check label="Proprietà del lotto" name="Parcel Properties"/>
<menu_item_check label="Menu Avanzato" name="Show Advanced Menu"/>
</menu>
- <menu_item_call label="Teleport a Casa" name="Teleport Home"/>
- <menu_item_call label="Imposta come Casa mia" name="Set Home to Here"/>
<menu label="Sole" name="Environment Settings">
<menu_item_call label="Alba" name="Sunrise"/>
<menu_item_call label="Mezzogiorno" name="Noon"/>
<menu_item_call label="Tramonto" name="Sunset"/>
<menu_item_call label="Mezzanotte" name="Midnight"/>
+ <menu_item_call label="Usa impostazioni regione" name="Use Region Settings"/>
</menu>
- <menu label="Editor ambiente" name="Enviroment Editor">
- <menu_item_call label="Impostazioni ambiente..." name="Enviroment Settings"/>
+ <menu label="Editor ambiente" name="Environment Editor">
+ <menu_item_call label="Impostazioni ambiente..." name="Environment Settings"/>
<menu label="Valori predefiniti acqua" name="Water Presets">
<menu_item_call label="Nuovo valore predefinito..." name="new_water_preset"/>
- <menu_item_call label="Modifica valori predefiniti..." name="edit_water_preset"/>
+ <menu_item_call label="Modifica valore predefinito..." name="edit_water_preset"/>
<menu_item_call label="Cancella valore predefinito..." name="delete_water_preset"/>
</menu>
<menu label="Valori predefiniti cielo" name="Sky Presets">
<menu_item_call label="Nuovo valore predefinito..." name="new_sky_preset"/>
- <menu_item_call label="Modifica valori predefiniti..." name="edit_sky_preset"/>
+ <menu_item_call label="Modifica valore predefinito..." name="edit_sky_preset"/>
<menu_item_call label="Cancella valore predefinito..." name="delete_sky_preset"/>
</menu>
- <menu label="Valori predefiniti giornata" name="Day Presets">
+ <menu label="Valori predefiniti giorno" name="Day Presets">
<menu_item_call label="Nuovo valore predefinito..." name="new_day_preset"/>
- <menu_item_call label="Modifica valori predefiniti..." name="edit_day_preset"/>
+ <menu_item_call label="Modifica valore predefinito..." name="edit_day_preset"/>
<menu_item_call label="Cancella valore predefinito..." name="delete_day_preset"/>
</menu>
</menu>
@@ -139,13 +144,14 @@
<menu_item_call label="Animazione ([COST] L$)..." name="Upload Animation"/>
<menu_item_call label="Modella..." name="Upload Model"/>
<menu_item_call label="In blocco ([COST] L$ per file)..." name="Bulk Upload"/>
+ <menu_item_call label="Definisci diritti di caricamento predefiniti" name="perm prefs"/>
</menu>
<menu_item_call label="Annulla" name="Undo"/>
<menu_item_call label="Ripeti" name="Redo"/>
</menu>
<menu label="Aiuto" name="Help">
+ <menu_item_call label="Istruzioni..." name="How To"/>
<menu_item_call label="Aiuto di [SECOND_LIFE]" name="Second Life Help"/>
- <menu_item_check label="Attiva suggerimenti" name="Enable Hints"/>
<menu_item_call label="Segnala abuso" name="Report Abuse"/>
<menu_item_call label="Segnala bug" name="Report Bug"/>
<menu_item_call label="Informazioni su [APP_NAME]" name="About Second Life"/>
@@ -161,7 +167,7 @@
<menu label="Strumenti di performance" name="Performance Tools">
<menu_item_call label="Misuratore lag" name="Lag Meter"/>
<menu_item_check label="Barra statistiche" name="Statistics Bar"/>
- <menu_item_check label="Mostra costo di rendering dell&apos;avatar" name="Avatar Rendering Cost"/>
+ <menu_item_check label="Mostra peso visualizzazione per avatar" name="Avatar Rendering Cost"/>
</menu>
<menu label="Evidenziazione e visibilità" name="Highlighting and Visibility">
<menu_item_check label="Effetto marcatore lampeggiante" name="Cheesy Beacon"/>
@@ -198,11 +204,10 @@
<menu_item_check label="Usa thread lettura plugin" name="Use Plugin Read Thread"/>
<menu_item_call label="Pulisci cache di gruppo" name="ClearGroupCache"/>
<menu_item_check label="Fluidità mouse" name="Mouse Smoothing"/>
+ <menu_item_call label="Rilascia tasti" name="Release Keys"/>
<menu label="Scorciatoie" name="Shortcuts">
<menu_item_call label="Immagine ([COST]L$)..." name="Upload Image"/>
<menu_item_check label="Cerca" name="Search"/>
- <menu_item_call label="Rilascia tasti" name="Release Keys"/>
- <menu_item_call label="Imposta dimensioni dell&apos;interfaccia sui valori predefiniti" name="Set UI Size to Default"/>
<menu_item_check label="Mostra menu Avanzato - tasti di scelta rapida esistenti" name="Show Advanced Menu - legacy shortcut"/>
<menu_item_call label="Chiudi finestra" name="Close Window"/>
<menu_item_call label="Chiudi tutte le finestre" name="Close All Windows"/>
@@ -271,6 +276,8 @@
<menu_item_check label="Aggiorna tipo" name="Update Type"/>
<menu_item_check label="Info livello dettaglio" name="LOD Info"/>
<menu_item_check label="Crea coda" name="Build Queue"/>
+ <menu_item_check label="Vettori vento" name="Wind Vectors"/>
+ <menu_item_check label="Complessità rendering" name="rendercomplexity"/>
<menu_item_check label="Scolpisci" name="Sculpt"/>
</menu>
<menu label="Rendering" name="Rendering">
@@ -279,7 +286,6 @@
<menu_item_check label="Luci e ombre" name="Lighting and Shadows"/>
<menu_item_check label="Ombra dal sole, dalla luna e dai proiettori" name="Shadows from Sun/Moon/Projectors"/>
<menu_item_check label="SSAO e ombre fluide" name="SSAO and Shadow Smoothing"/>
- <menu_item_check label="Illuminazione globale (sperimentale)" name="Global Illumination"/>
<menu_item_check label="Maschera alfa automatica (differita)" name="Automatic Alpha Masks (deferred)"/>
<menu_item_check label="Maschera alfa automatica (non differita)" name="Automatic Alpha Masks (non-deferred)"/>
<menu_item_check label="Texture delle animazioni" name="Animation Textures"/>
diff --git a/indra/newview/skins/default/xui/it/notifications.xml b/indra/newview/skins/default/xui/it/notifications.xml
index ab9de43e6e..fcc515186d 100644
--- a/indra/newview/skins/default/xui/it/notifications.xml
+++ b/indra/newview/skins/default/xui/it/notifications.xml
@@ -978,7 +978,7 @@ Offri l&apos;amicizia a [NAME]?
</form>
</notification>
<notification name="RemoveFromFriends">
- Vuoi rimuovere [NAME] dalla lista dei tuoi amici?
+ Vuoi rimuovere &lt;nolink&gt;[NAME]&lt;/nolink&gt; dalla lista dei tuoi amici?
<usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
</notification>
<notification name="RemoveMultipleFromFriends">
@@ -1110,8 +1110,13 @@ Cedere questi [AREA] m² di terreno al gruppo &apos;[GROUP_NAME]&apos;?
<notification name="DisplaySetToSafe">
Le impostazioni dello schermo sono state impostate a valori di sicurezza perchè hai specificato l&apos;opzione -safe.
</notification>
- <notification name="DisplaySetToRecommended">
- Le impostazioni dello schermo sono state impostate a valori ottimali basati sulla tua configurazione di sistema.
+ <notification name="DisplaySetToRecommendedGPUChange">
+ Le impostazioni di visualizzazione sono ai livelli consigliati a causa di un cambiamento nella scheda grafica
+da &apos;[LAST_GPU]&apos;
+a &apos;[THIS_GPU]&apos;
+ </notification>
+ <notification name="DisplaySetToRecommendedFeatureChange">
+ Le impostazioni di visualizzazione sono ai livelli consigliati a causa di un cambiamento nel sottosistema di rendering.
</notification>
<notification name="ErrorMessage">
[ERROR_MESSAGE]
@@ -1432,7 +1437,7 @@ Per installare l&apos;aggiornamento è necessario riavviare [APP_NAME].
<usetemplate ignoretext="Conferma prima di restituire gli oggetti ai relativi proprietari" name="okcancelignore" notext="Annulla" yestext="OK"/>
</notification>
<notification name="GroupLeaveConfirmMember">
- Sei attualmente un membro del gruppo [GROUP].
+ Sei attualmente un membro del gruppo &lt;nolink&gt;[GROUP]&lt;/nolink&gt;.
Vuoi lasciare il gruppo?
<usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
</notification>
@@ -1915,6 +1920,18 @@ Trasferisci gli elementi nell&apos;inventario?
Confermi di voler uscire?
<usetemplate ignoretext="Conferma prima di uscire" name="okcancelignore" notext="Non uscire" yestext="Esci"/>
</notification>
+ <notification name="ConfirmRestoreToybox">
+ Questa azione ripristina pulsanti e barre degli strumenti predefinite.
+
+Questa azione non può essere ripristinata
+ <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmClearAllToybox">
+ Questa azione riporterà tutti i pulsanti nella casella strumenti. Le barre degli strumenti saranno vuote.
+
+Questa azione non può essere ripristinata
+ <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
+ </notification>
<notification name="DeleteItems">
[QUESTION]
<usetemplate ignoretext="Conferma prima di cancellare gli elementi" name="okcancelignore" notext="Annulla" yestext="OK"/>
@@ -2119,10 +2136,10 @@ Verrà avviato il browser Web.
Oggetto: [SUBJECT], Messaggio: [MESSAGE]
</notification>
<notification name="FriendOnline">
- [NAME] è Online
+ &lt;nolink&gt;[NAME]&lt;/nolink&gt; è online
</notification>
<notification name="FriendOffline">
- [NAME] è Offline
+ &lt;nolink&gt;[NAME]&lt;/nolink&gt; è offline
</notification>
<notification name="AddSelfFriend">
Anche se sei molto simpatico, non puoi aggiungere te stesso all&apos;elenco degli amici.
@@ -2235,14 +2252,16 @@ Seleziona solo un oggetto.
Il tuo biglietto da visita non è stato accettato.
</notification>
<notification name="TeleportToLandmark">
- Puoi teleportarti alle ubicazioni come &apos;[NAME]&apos; aprendo il pannello Luoghi sul lato destro dello schermo, quindi selezionare la scheda Punti di riferimento.
-Clicca su un punto di riferimento per selezionarlo, quindi clicca su Teleport sul lato inferiore del pannello.
-(Puoi anche fare doppio clic sul punto di riferimento oppure cliccare su di esso con il tasto destro del mouse e scegliere Teleport.)
+ Per teleportarti a luoghi come &apos;[NAME]&apos;, clicca sul pulsante &quot;Luoghi&quot;,
+ quindi seleziona la scheda Punti di riferimento nel pannello che viene aperto. Clicca su qualsiasi
+ unto di riferimento per selezionarlo, quindi clicca su Teleport sul lato inferiore del pannello.
+ (Puoi anche fare doppio clic sul punto di riferimento oppure cliccare su di esso con il tasto destro del mouse e
+ scegliere Teleport.)
</notification>
<notification name="TeleportToPerson">
- Puoi contattare il residente &apos;[NAME]&apos; aprendo il pannello Persone nel lato destro del tuo schermo.
-Seleziona il residente dall&apos;elenco, clicca su &apos;IM&apos; in basso nel pannello.
-(Puoi anche fare doppio clic sul nome nell&apos;elenco oppure fare clic con il pulsante destro del mouse e selezionare &apos;IM&apos;).
+ Per contattare Residenti come &apos;[NAME]&apos;, clicca sul pulsante &quot;Persone&quot;, seleziona un Residente nel pannello che viene aperto, quindi clicca su &apos;IM&apos; in
+ basso nel pannello.
+ (Puoi anche fare doppio clic sul nome nell&apos;elenco oppure fare clic con il pulsante destro del mouse e selezionare &apos;IM&apos;).
</notification>
<notification name="CantSelectLandFromMultipleRegions">
Non è possibile selezionare il terreno attraverso i confini del server.
@@ -2263,6 +2282,9 @@ Prova a selezionare una parte di terreno più piccola.
<notification name="PaymentSent">
[MESSAGE]
</notification>
+ <notification name="PaymentFailure">
+ [MESSAGE]
+ </notification>
<notification name="EventNotification">
Notifica eventi:
@@ -2514,10 +2536,10 @@ Riprova tra qualche istante.
</form>
</notification>
<notification name="FriendshipAccepted">
- [NAME] ha accettato la tua offerta di amicizia.
+ &lt;nolink&gt;[NAME]&lt;/nolink&gt; ha accettato la tua richiesta di amicizia.
</notification>
<notification name="FriendshipDeclined">
- [NAME] ha rifiutato la tua offerta di amicizia.
+ &lt;nolink&gt;[NAME]&lt;/nolink&gt; ha rifiutato la tua richiesta di amicizia.
</notification>
<notification name="FriendshipAcceptedByMe">
Offerta di amicizia accettata.
@@ -2794,7 +2816,7 @@ Per informazioni dettagliate, vedi il file del registro.
Con i seguenti residenti?
[RESIDENTS]
- <usetemplate name="okcancelbuttons" notext="Annulla" yestext="Ok"/>
+ <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
</notification>
<notification name="ItemsShared">
Gli oggetti sono stati condivisi.
@@ -2884,7 +2906,7 @@ In questo modo verrà disattivato l&apos;audio anche di tutti i residenti che si
uniscono alla chiamata in un secondo momento, anche dopo che tu ti fossi scollegato.
Disattiva audio di tutti?
- <usetemplate ignoretext="Conferma prima di disattivare l&apos;audio di tutti i partecipanti alla chiamata di gruppo" name="okcancelignore" notext="Annulla" yestext="Ok"/>
+ <usetemplate ignoretext="Conferma prima di disattivare l&apos;audio di tutti i partecipanti alla chiamata di gruppo" name="okcancelignore" notext="Annulla" yestext="OK"/>
</notification>
<notification label="Chat" name="HintChat">
Per partecipare alla conversazione, digita nel campo chat in basso.
@@ -2997,10 +3019,6 @@ Clicca e trascina dovunque nel mondo per ruotare la visuale
<button name="cancel" text="Annulla"/>
</form>
</notification>
- <notification label="" name="ModeChange">
- Per cambiare la modalità è necessario uscire e riavviare.
- <usetemplate name="okcancelbuttons" notext="Non uscire" yestext="Esci"/>
- </notification>
<notification label="" name="NoClassifieds">
La creazione e la modifica degli annunci sono disponibili solo in modalità Avanzata. Uscire e cambiare la modalità? Sulla schermata di accesso si può selezionare la modalità.
<usetemplate name="okcancelbuttons" notext="Non uscire" yestext="Esci"/>
@@ -3045,6 +3063,10 @@ Clicca e trascina dovunque nel mondo per ruotare la visuale
La ricerca è disponibile solo in modalità Avanzata. Eseguire il logout e cambiare la modalità?
<usetemplate name="okcancelbuttons" notext="Non uscire" yestext="Esci"/>
</notification>
+ <notification label="" name="ConfirmHideUI">
+ Questa azione cancellerà tutte le voci di menu e i pulsanti. Per visualizzarli nuovamente cliccare ancora [SHORTCUT].
+ <usetemplate ignoretext="Conferma prima di nascondere l&apos;interfaccia" name="okcancelignore" notext="Annulla" yestext="OK"/>
+ </notification>
<global name="UnsupportedGLRequirements">
Non sembra che tu abbia i requisiti hardware adeguati per [APP_NAME]. [APP_NAME] richiede una scheda grafica OpenGL con supporto multitexture. Se ne hai una in dotazione, accertati di avere i driver, i service pack e i patch più recenti per la scheda grafica e per il sistema operativo.
diff --git a/indra/newview/skins/default/xui/it/panel_chiclet_bar.xml b/indra/newview/skins/default/xui/it/panel_chiclet_bar.xml
new file mode 100644
index 0000000000..66bf3f140f
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/panel_chiclet_bar.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="chiclet_bar">
+ <layout_stack name="toolbar_stack">
+ <layout_panel name="im_well_panel">
+ <chiclet_im_well name="im_well">
+ <button name="Unread IM messages" tool_tip="Conversazioni"/>
+ </chiclet_im_well>
+ </layout_panel>
+ <layout_panel name="notification_well_panel">
+ <chiclet_notification name="notification_well">
+ <button name="Unread" tool_tip="Notifiche"/>
+ </chiclet_notification>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_edit_skin.xml b/indra/newview/skins/default/xui/it/panel_edit_skin.xml
index a15489b333..466eff2708 100644
--- a/indra/newview/skins/default/xui/it/panel_edit_skin.xml
+++ b/indra/newview/skins/default/xui/it/panel_edit_skin.xml
@@ -1,9 +1,9 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_skin_panel">
<panel name="avatar_skin_color_panel">
- <texture_picker label="Tatuaggi testa" name="Head Tattoos" tool_tip="Clicca per scegliere una fotografia"/>
- <texture_picker label="Tatuaggi superiori" name="Upper Tattoos" tool_tip="Clicca per scegliere una fotografia"/>
- <texture_picker label="Tatuaggi inferiori" name="Lower Tattoos" tool_tip="Clicca per scegliere una fotografia"/>
+ <texture_picker label="Testa" name="Head" tool_tip="Clicca per scegliere una fotografia"/>
+ <texture_picker label="Parte superiore del corpo" name="Upper Body" tool_tip="Clicca per scegliere una fotografia"/>
+ <texture_picker label="Parte inferiore del corpo" name="Lower Body" tool_tip="Clicca per scegliere una fotografia"/>
</panel>
<panel name="accordion_panel">
<accordion name="wearable_accordion">
diff --git a/indra/newview/skins/default/xui/it/panel_me.xml b/indra/newview/skins/default/xui/it/panel_me.xml
index 66601aa165..a134f6f1de 100644
--- a/indra/newview/skins/default/xui/it/panel_me.xml
+++ b/indra/newview/skins/default/xui/it/panel_me.xml
@@ -1,7 +1,4 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Il mio profilo" name="panel_me">
- <tab_container name="tabs">
- <panel label="IL MIO PROFILO" name="panel_profile"/>
- <panel label="I MIEI PREFERITI" name="panel_picks"/>
- </tab_container>
+ <panel label="I MIEI PREFERITI" name="panel_picks"/>
</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_my_profile.xml b/indra/newview/skins/default/xui/it/panel_my_profile.xml
deleted file mode 100644
index 094b97962f..0000000000
--- a/indra/newview/skins/default/xui/it/panel_my_profile.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Profilo" name="panel_profile">
- <string name="no_partner_text" value="Nessuno"/>
- <string name="no_group_text" value="Nessuno"/>
- <string name="RegisterDateFormat">
- [REG_DATE] ([AGE])
- </string>
- <string name="name_text_args">
- [NAME]
- </string>
- <string name="display_name_text_args">
- [DISPLAY_NAME]
- </string>
- <layout_stack name="layout">
- <layout_panel name="profile_stack">
- <scroll_container name="profile_scroll">
- <panel name="scroll_content_panel">
- <panel name="second_life_image_panel">
- <text name="display_name_descr_text">
- Nome utente
- </text>
- <text name="name_descr_text">
- Nome visualizzato
- </text>
- <button label="Profilo" name="see_profile_btn" tool_tip="Visualizza profilo per questo avatar"/>
- </panel>
- </panel>
- </scroll_container>
- </layout_panel>
- </layout_stack>
-</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_navigation_bar.xml b/indra/newview/skins/default/xui/it/panel_navigation_bar.xml
index 8e72167759..0299e2a532 100644
--- a/indra/newview/skins/default/xui/it/panel_navigation_bar.xml
+++ b/indra/newview/skins/default/xui/it/panel_navigation_bar.xml
@@ -1,18 +1,23 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="navigation_bar">
- <panel name="navigation_panel">
- <pull_button name="back_btn" tool_tip="Torna al luogo precedente"/>
- <pull_button name="forward_btn" tool_tip="Procedi un luogo in avanti"/>
- <button name="home_btn" tool_tip="Teleport a casa"/>
- <location_input label="Posizione" name="location_combo"/>
- <search_combo_box label="Cerca" name="search_combo_box" tool_tip="Cerca">
- <combo_editor label="Cerca [SECOND_LIFE]" name="search_combo_editor"/>
- </search_combo_box>
- </panel>
- <favorites_bar name="favorite" tool_tip="Trascina qui i punti di riferimento per un accesso rapido ai tuoi posti preferiti in Second Life.">
- <label name="favorites_bar_label" tool_tip="Trascina qui i punti di riferimento per un accesso rapido ai tuoi posti preferiti in Second Life.">
- Barra dei Preferiti
- </label>
- <chevron_button name="&gt;&gt;" tool_tip="Mostra altri Preferiti"/>
- </favorites_bar>
+ <layout_stack name="nvp_stack">
+ <layout_panel name="navigation_layout_panel">
+ <panel name="navigation_panel">
+ <pull_button name="back_btn" tool_tip="Torna al luogo precedente"/>
+ <pull_button name="forward_btn" tool_tip="Procedi un luogo in avanti"/>
+ <button name="home_btn" tool_tip="Teleport a casa"/>
+ <location_input label="Posizione" name="location_combo"/>
+ </panel>
+ </layout_panel>
+ <layout_panel name="favorites_layout_panel">
+ <favorites_bar name="favorite" tool_tip="Trascina qui i punti di riferimento per un accesso rapido ai tuoi posti preferiti in Second Life.">
+ <label name="favorites_bar_label" tool_tip="Trascina qui i punti di riferimento per un accesso rapido ai tuoi posti preferiti in Second Life.">
+ Barra dei Preferiti
+ </label>
+ <more_button name="&gt;&gt;" tool_tip="Mostra altri Preferiti">
+ Altro â–¼
+ </more_button>
+ </favorites_bar>
+ </layout_panel>
+ </layout_stack>
</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_nearby_chat.xml b/indra/newview/skins/default/xui/it/panel_nearby_chat.xml
new file mode 100644
index 0000000000..1b529e2737
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/panel_nearby_chat.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="nearby_chat">
+ <check_box label="Traduci chat" name="translate_chat_checkbox"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_notes.xml b/indra/newview/skins/default/xui/it/panel_notes.xml
deleted file mode 100644
index e127138277..0000000000
--- a/indra/newview/skins/default/xui/it/panel_notes.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Note e Privacy" name="panel_notes">
- <layout_stack name="layout">
- <layout_panel name="notes_stack">
- <scroll_container name="profile_scroll">
- <panel name="profile_scroll_panel">
- <text name="status_message" value="Le mie note private:"/>
- <text name="status_message2" value="Consenti a questa persona di:"/>
- <check_box label="Vedere se sono online" name="status_check"/>
- <check_box label="Vedermi sulla mappa" name="map_check"/>
- <check_box label="Modificare, eliminare o prendere i miei oggetti" name="objects_check"/>
- </panel>
- </scroll_container>
- </layout_panel>
- <layout_panel name="notes_buttons_panel">
- <layout_stack name="bottom_bar_ls">
- <layout_panel name="add_friend_btn_lp">
- <button label="Aggiungi come amico" name="add_friend" tool_tip="Offri amicizia a questo residente"/>
- </layout_panel>
- <layout_panel name="im_btn_lp">
- <button label="IM" name="im" tool_tip="Apri una sessione messaggio istantaneo"/>
- </layout_panel>
- <layout_panel name="call_btn_lp">
- <button label="Chiama" name="call" tool_tip="Chiama questo residente"/>
- </layout_panel>
- <layout_panel name="show_on_map_btn_lp">
- <button label="Mappa" name="show_on_map_btn" tool_tip="Mostra il residente sulla mappa"/>
- </layout_panel>
- <layout_panel name="teleport_btn_lp">
- <button label="Teleport" name="teleport" tool_tip="Offri teleport"/>
- </layout_panel>
- </layout_stack>
- </layout_panel>
- </layout_stack>
-</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_postcard_message.xml b/indra/newview/skins/default/xui/it/panel_postcard_message.xml
new file mode 100644
index 0000000000..c720f4822d
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/panel_postcard_message.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_postcard_message">
+ <text name="to_label">
+ A:
+ </text>
+ <text name="name_label">
+ Da:
+ </text>
+ <text name="subject_label">
+ Oggetto:
+ </text>
+ <line_editor label="Digita qui l&apos;oggetto." name="subject_form"/>
+ <text name="msg_label">
+ Messaggio:
+ </text>
+ <text_editor name="msg_form">
+ Digita qui il messaggio.
+ </text_editor>
+ <button label="Annulla" name="cancel_btn"/>
+ <button label="Invia" name="send_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_postcard_settings.xml b/indra/newview/skins/default/xui/it/panel_postcard_settings.xml
new file mode 100644
index 0000000000..6a586c4415
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/panel_postcard_settings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_postcard_settings">
+ <combo_box label="Risoluzione" name="postcard_size_combo">
+ <combo_box.item label="Finestra attuale" 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="Personalizza" name="Custom"/>
+ </combo_box>
+ <layout_stack name="postcard_image_params_ls">
+ <layout_panel name="postcard_image_size_lp">
+ <spinner label="Larghezza" name="postcard_snapshot_width"/>
+ <spinner label="Altezza" name="postcard_snapshot_height"/>
+ <check_box label="Mantieni le proporzioni" name="postcard_keep_aspect_check"/>
+ </layout_panel>
+ <layout_panel name="postcard_image_format_quality_lp">
+ <slider label="Qualità dell&apos;immagine" name="image_quality_slider"/>
+ <text name="image_quality_level">
+ ([QLVL])
+ </text>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_preferences_chat.xml b/indra/newview/skins/default/xui/it/panel_preferences_chat.xml
index 2834d520d1..7f5992b584 100644
--- a/indra/newview/skins/default/xui/it/panel_preferences_chat.xml
+++ b/indra/newview/skins/default/xui/it/panel_preferences_chat.xml
@@ -29,30 +29,5 @@
<check_box label="Chat IM" name="EnableIMChatPopups" tool_tip="Seleziona per vedere una finestra popup quando arriva un messaggio IM"/>
<spinner label="Durata chat vicine:" name="nearby_toasts_lifetime"/>
<spinner label="Durata dissolvenza chat vicine:" name="nearby_toasts_fadingtime"/>
- <check_box label="Use machine translation while chatting (powered by Google)" name="translate_chat_checkbox"/>
- <text name="translate_chb_label">
- Usa la traduzione meccanica durante le chat (tecnologia Google)
- </text>
- <text name="translate_language_text" width="110">
- Traduci chat in:
- </text>
- <combo_box name="translate_language_combobox" width="146">
- <combo_box.item label="Default di sistema" name="System Default Language"/>
- <combo_box.item label="English (Inglese)" name="English"/>
- <combo_box.item label="Dansk (Danese)" name="Danish"/>
- <combo_box.item label="Deutsch (Tedesco)" name="German"/>
- <combo_box.item label="Español (Spagnolo)" name="Spanish"/>
- <combo_box.item label="Français (Francese)" name="French"/>
- <combo_box.item label="Italiano" name="Italian"/>
- <combo_box.item label="Magyar (Ungherese)" name="Hungarian"/>
- <combo_box.item label="Nederlands (Olandese)" name="Dutch"/>
- <combo_box.item label="Polski (Polacco)" name="Polish"/>
- <combo_box.item label="Português (Portoghese)" name="Portugese"/>
- <combo_box.item label="РуÑÑкий (Russo)" name="Russian"/>
- <combo_box.item label="Türkçe (Turco)" name="Turkish"/>
- <combo_box.item label="УкраїнÑька (Ucraino)" name="Ukrainian"/>
- <combo_box.item label="中文 (简体) (Cinese)" name="Chinese"/>
- <combo_box.item label="日本語 (Giapponese)" name="Japanese"/>
- <combo_box.item label="한국어 (Coreano)" name="Korean"/>
- </combo_box>
+ <button label="Impostazioni traduzione chat" name="ok_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_preferences_general.xml b/indra/newview/skins/default/xui/it/panel_preferences_general.xml
index c576b5f9d8..90a833471c 100644
--- a/indra/newview/skins/default/xui/it/panel_preferences_general.xml
+++ b/indra/newview/skins/default/xui/it/panel_preferences_general.xml
@@ -11,10 +11,12 @@
<combo_box.item label="Español (Spagnolo) - Beta" name="Spanish"/>
<combo_box.item label="Français (Francese) - Beta" name="French"/>
<combo_box.item label="Italiano - Beta" name="Italian"/>
- <combo_box.item label="Nederlands (Olandese) - Beta" name="Dutch"/>
<combo_box.item label="Polski (Polacco) - Beta" name="Polish"/>
<combo_box.item label="Português (Portoghese) - Beta" name="Portugese"/>
+ <combo_box.item label="РуÑÑкий (Russo) - Beta" name="Russian"/>
+ <combo_box.item label="Türkçe (Turco) - Beta" name="Turkish"/>
<combo_box.item label="日本語 (Giapponese) - Beta" name="(Japanese)"/>
+ <combo_box.item label="正體中文 (Cinese tradizionale) - Beta" name="Traditional Chinese"/>
</combo_box>
<text name="language_textbox2">
(Richiede il riavvio)
@@ -49,7 +51,6 @@
<check_box label="TItoli gruppo" name="show_all_title_checkbox1" tool_tip="Mostra titoli di gruppo, come Funzionario o Membro"/>
<check_box label="Evidenzia amici" name="show_friends" tool_tip="Evidenzia le etichette dei nomi dei tuoi amici"/>
<check_box label="Mostra nomi visualizzati" name="display_names_check" tool_tip="Seleziona per visualizzare i nomi in chat, IM, etichette, ecc."/>
- <check_box label="Attiva suggerimenti UI Viewer" name="viewer_hints_check"/>
<text name="inworld_typing_rg_label">
Premere i tasti lettera:
</text>
diff --git a/indra/newview/skins/default/xui/it/panel_preferences_move.xml b/indra/newview/skins/default/xui/it/panel_preferences_move.xml
index 56d75bb3e3..8d172bb8bb 100644
--- a/indra/newview/skins/default/xui/it/panel_preferences_move.xml
+++ b/indra/newview/skins/default/xui/it/panel_preferences_move.xml
@@ -7,18 +7,33 @@
</text>
<check_box label="Costruire/Modificare" name="edit_camera_movement" tool_tip="Utilizza il posizionamento automatico della fotocamera entrando o uscendo dalla modalità modifica"/>
<check_box label="Aspetto fisico" name="appearance_camera_movement" tool_tip="Utilizza il posizionamento automatico della camera in modalità modifica"/>
- <check_box initial_value="vero" label="Barra laterale" name="appearance_sidebar_positioning" tool_tip="Utilizza il posizionamento automatico della fotocamera per la barra laterale"/>
+ <text name="keyboard_lbl">
+ Tastiera:
+ </text>
+ <check_box label="Le frecce di direzione mi fanno sempre spostare" name="arrow_keys_move_avatar_check"/>
+ <check_box label="Doppio click e tieni premuto per correre" name="tap_tap_hold_to_run"/>
+ <text name="mouse_lbl">
+ Mouse:
+ </text>
<check_box label="Mostra in modalità Mouselook" name="first_person_avatar_visible"/>
<text name=" Mouse Sensitivity">
Sensibilità mouse visuale soggettiva:
</text>
<check_box label="Inverti" name="invert_mouse"/>
- <check_box label="Le frecce di direzione mi fanno sempre spostare" name="arrow_keys_move_avatar_check"/>
- <check_box label="Doppio click e tieni premuto per correre" name="tap_tap_hold_to_run"/>
- <check_box label="Doppio clic per:" name="double_click_chkbox"/>
- <radio_group name="double_click_action">
- <radio_item label="Teleport" name="radio_teleport"/>
- <radio_item label="Autopilota" name="radio_autopilot"/>
- </radio_group>
+ <text name="single_click_action_lbl">
+ Un solo clic sul terreno:
+ </text>
+ <combo_box name="single_click_action_combo">
+ <combo_box.item label="Nessuna azione" name="0"/>
+ <combo_box.item label="Passa al punto cliccato" name="1"/>
+ </combo_box>
+ <text name="double_click_action_lbl">
+ Doppio clic sul terreno:
+ </text>
+ <combo_box name="double_click_action_combo">
+ <combo_box.item label="Nessuna azione" name="0"/>
+ <combo_box.item label="Passa al punto cliccato" name="1"/>
+ <combo_box.item label="Teleport al punto cliccato" name="2"/>
+ </combo_box>
<button label="Altri dispositivi" name="joystick_setup_button"/>
</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_preferences_setup.xml b/indra/newview/skins/default/xui/it/panel_preferences_setup.xml
index bf78432110..0189d47f45 100644
--- a/indra/newview/skins/default/xui/it/panel_preferences_setup.xml
+++ b/indra/newview/skins/default/xui/it/panel_preferences_setup.xml
@@ -15,7 +15,7 @@
Web:
</text>
<radio_group name="use_external_browser">
- <radio_item label="Usa il mio browser (IE, Firefox, Safari)" name="external" tool_tip="Utilizza il browser Web predefinito di sistema per l&apos;aiuto, per i link Web e così via. Sconsigliato durante l&apos;esecuzione a tutto schermo." value="1"/>
+ <radio_item label="Usa il mio browser (IE, Firefox, Safari)" name="external" tool_tip="Utilizza il browser Web predefinito di sistema per l&apos;aiuto, per i link Web e così via. Sconsigliato durante l&apos;esecuzione a tutto schermo." value="true"/>
<radio_item label="Utilizza il browser Web integrato" name="internal" tool_tip="Utilizza il browser Web integrato per l&apos;aiuto, per i link Web e così via. Questo browser si apre in una nuova finestra in [APP_NAME]." value=""/>
</radio_group>
<check_box initial_value="true" label="Abilita plugin" name="browser_plugins_enabled"/>
diff --git a/indra/newview/skins/default/xui/it/panel_profile.xml b/indra/newview/skins/default/xui/it/panel_profile.xml
deleted file mode 100644
index 309937c5a0..0000000000
--- a/indra/newview/skins/default/xui/it/panel_profile.xml
+++ /dev/null
@@ -1,70 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Profilo" name="panel_profile">
- <string name="CaptionTextAcctInfo">
- [ACCTTYPE]
-[PAYMENTINFO] [AGEVERIFICATION]
- </string>
- <string name="payment_update_link_url">
- http://www.secondlife.com/account/billing.php?lang=it-IT
- </string>
- <string name="partner_edit_link_url">
- http://www.secondlife.com/account/partners.php?lang=it
- </string>
- <string name="my_account_link_url" value="http://secondlife.com/my/account/index.php?lang=it-IT"/>
- <string name="no_partner_text" value="Nessuno"/>
- <string name="no_group_text" value="Nessuno"/>
- <string name="RegisterDateFormat">
- [REG_DATE] ([AGE])
- </string>
- <string name="name_text_args">
- [NAME]
- </string>
- <string name="display_name_text_args">
- [DISPLAY_NAME]
- </string>
- <layout_stack name="layout">
- <layout_panel name="profile_stack">
- <scroll_container name="profile_scroll">
- <panel name="profile_scroll_panel">
- <panel name="second_life_image_panel">
- <text name="title_sl_descr_text" value="[SECOND_LIFE]:"/>
- </panel>
- <panel name="first_life_image_panel">
- <text name="title_rw_descr_text" value="Mondo reale:"/>
- </panel>
- <text name="title_member_text" value="Residente dal:"/>
- <text name="title_acc_status_text" value="Stato account:"/>
- <text name="title_partner_text" value="Partner:"/>
- <panel name="partner_data_panel">
- <text initial_value="(recupero)" name="partner_text"/>
- </panel>
- <text name="title_groups_text" value="Gruppi:"/>
- </panel>
- </scroll_container>
- </layout_panel>
- </layout_stack>
- <layout_stack name="layout_verb_buttons">
- <layout_panel name="profile_buttons_panel">
- <layout_stack name="bottom_bar_ls">
- <layout_panel name="add_friend_btn_lp">
- <button label="Aggiungi come amico" name="add_friend" tool_tip="Offri amicizia a questo residente"/>
- </layout_panel>
- <layout_panel name="im_btn_lp">
- <button label="IM" name="im" tool_tip="Apri una sessione messaggio istantaneo"/>
- </layout_panel>
- <layout_panel name="call_btn_lp">
- <button label="Chiama" name="call" tool_tip="Chiama questo residente"/>
- </layout_panel>
- <layout_panel name="chat_btn_lp">
- <button label="Teleport" name="teleport" tool_tip="Offri teleport"/>
- </layout_panel>
- <layout_panel name="overflow_btn_lp">
- <menu_button label="â–¼" name="overflow_btn" tool_tip="Paga del denaro o condividi qualcosa dall&apos;inventario con il residente"/>
- </layout_panel>
- </layout_stack>
- </layout_panel>
- <layout_panel name="profile_me_buttons_panel">
- <button label="Modifica profilo" name="edit_profile_btn" tool_tip="Modifica le tue informazioni personali"/>
- </layout_panel>
- </layout_stack>
-</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_profile_view.xml b/indra/newview/skins/default/xui/it/panel_profile_view.xml
deleted file mode 100644
index 409eb5d1f4..0000000000
--- a/indra/newview/skins/default/xui/it/panel_profile_view.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="panel_target_profile">
- <string name="status_online">
- Online
- </string>
- <string name="status_offline">
- Offline
- </string>
- <text name="display_name_label" value="Nome visualizzato:"/>
- <text name="solo_username_label" value="Nome utente:"/>
- <text name="status" value="Online"/>
- <text name="user_name_small" value="Jack guarda quanto è lungo questo splendido nome"/>
- <text name="user_name" value="Jack Linden"/>
- <button name="copy_to_clipboard" tool_tip="Copia negli appunti"/>
- <text name="user_label" value="Nome utente:"/>
- <text name="user_slid" value="jack.linden"/>
- <tab_container name="tabs">
- <panel label="PROFILO" name="panel_profile"/>
- <panel label="LUOGHI CONSIGLIATI" name="panel_picks"/>
- <panel label="NOTE E PRIVACY" name="panel_notes"/>
- </tab_container>
-</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_snapshot_inventory.xml b/indra/newview/skins/default/xui/it/panel_snapshot_inventory.xml
new file mode 100644
index 0000000000..c9245029b7
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/panel_snapshot_inventory.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_snapshot_inventory">
+ <text name="title">
+ Salva nell&apos;inventario
+ </text>
+ <text name="hint_lbl">
+ Salvare un&apos;immagine nell&apos;inventario costa L$[UPLOAD_COST]. Per salvare l&apos;immagine come texture, selezionare uno dei formati quadrati.
+ </text>
+ <combo_box label="Risoluzione" name="texture_size_combo">
+ <combo_box.item label="Finestra attuale" name="CurrentWindow"/>
+ <combo_box.item label="Piccola (128x128)" name="Small(128x128)"/>
+ <combo_box.item label="Media (256x256)" name="Medium(256x256)"/>
+ <combo_box.item label="Grande (512x512)" name="Large(512x512)"/>
+ <combo_box.item label="Personalizza" name="Custom"/>
+ </combo_box>
+ <spinner label="Larghezza" name="inventory_snapshot_width"/>
+ <spinner label="Altezza" name="inventory_snapshot_height"/>
+ <check_box label="Mantieni le proporzioni" name="inventory_keep_aspect_check"/>
+ <button label="Annulla" name="cancel_btn"/>
+ <button label="Salva" name="save_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_snapshot_local.xml b/indra/newview/skins/default/xui/it/panel_snapshot_local.xml
new file mode 100644
index 0000000000..4b725b68f9
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/panel_snapshot_local.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_snapshot_local">
+ <text name="title">
+ Salva sul mio computer
+ </text>
+ <combo_box label="Risoluzione" name="local_size_combo">
+ <combo_box.item label="Finestra attuale" name="CurrentWindow"/>
+ <combo_box.item label="320x240" name="320x240"/>
+ <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="1280x1024" name="1280x1024"/>
+ <combo_box.item label="1600x1200" name="1600x1200"/>
+ <combo_box.item label="Personalizza" name="Custom"/>
+ </combo_box>
+ <layout_stack name="local_image_params_ls">
+ <layout_panel name="local_image_size_lp">
+ <spinner label="Larghezza" name="local_snapshot_width"/>
+ <spinner label="Altezza" name="local_snapshot_height"/>
+ <check_box label="Mantieni le proporzioni" name="local_keep_aspect_check"/>
+ </layout_panel>
+ <layout_panel name="local_image_format_quality_lp">
+ <combo_box label="Formato" name="local_format_combo">
+ <combo_box.item label="PNG (senza perdite)" name="PNG"/>
+ <combo_box.item label="JPEG" name="JPEG"/>
+ <combo_box.item label="BMP (senza perdite)" name="BMP"/>
+ </combo_box>
+ <slider label="Qualità dell&apos;immagine" name="image_quality_slider"/>
+ <text name="image_quality_level">
+ ([QLVL])
+ </text>
+ </layout_panel>
+ </layout_stack>
+ <button label="Annulla" name="cancel_btn"/>
+ <flyout_button label="Salva" name="save_btn" tool_tip="Salva immagine come file">
+ <flyout_button.item label="Salva" name="save_item"/>
+ <flyout_button.item label="Salva con nome..." name="saveas_item"/>
+ </flyout_button>
+</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_snapshot_options.xml b/indra/newview/skins/default/xui/it/panel_snapshot_options.xml
new file mode 100644
index 0000000000..f2d42c5197
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/panel_snapshot_options.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_snapshot_options">
+ <button label="Invia post al feed del mio profilo" name="save_to_profile_btn"/>
+ <button label="E-mail" name="save_to_email_btn"/>
+ <button label="Salva nell&apos;inventario (L$[AMOUNT])" name="save_to_inventory_btn"/>
+ <button label="Salva sul mio computer" name="save_to_computer_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_snapshot_postcard.xml b/indra/newview/skins/default/xui/it/panel_snapshot_postcard.xml
new file mode 100644
index 0000000000..3703b97e6c
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/panel_snapshot_postcard.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_snapshot_postcard">
+ <string name="default_subject">
+ Cartolina da [SECOND_LIFE].
+ </string>
+ <string name="default_message">
+ Dai un&apos;occhiata!
+ </string>
+ <string name="upload_message">
+ Invio...
+ </string>
+ <text name="title">
+ E-mail
+ </text>
+ <button label="Messaggio" name="message_btn"/>
+ <button label="Impostazioni" name="settings_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_snapshot_profile.xml b/indra/newview/skins/default/xui/it/panel_snapshot_profile.xml
new file mode 100644
index 0000000000..2cdbf97049
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/panel_snapshot_profile.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_snapshot_profile">
+ <text name="title">
+ Invia post al feed del mio profilo
+ </text>
+ <combo_box label="Risoluzione" name="profile_size_combo">
+ <combo_box.item label="Finestra attuale" 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="Personalizza" name="Custom"/>
+ </combo_box>
+ <layout_stack name="profile_image_params_ls">
+ <layout_panel name="profile_image_size_lp">
+ <spinner label="Larghezza" name="profile_snapshot_width"/>
+ <spinner label="Altezza" name="profile_snapshot_height"/>
+ <check_box label="Mantieni le proporzioni" name="profile_keep_aspect_check"/>
+ </layout_panel>
+ <layout_panel name="profile_image_metadata_lp">
+ <text name="caption_label">
+ Didascalia:
+ </text>
+ <check_box initial_value="true" label="Includi luogo" name="add_location_cb"/>
+ </layout_panel>
+ </layout_stack>
+ <button label="Annulla" name="cancel_btn"/>
+ <button label="Post" name="post_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_status_bar.xml b/indra/newview/skins/default/xui/it/panel_status_bar.xml
index 0569107999..4abc90113f 100644
--- a/indra/newview/skins/default/xui/it/panel_status_bar.xml
+++ b/indra/newview/skins/default/xui/it/panel_status_bar.xml
@@ -17,12 +17,9 @@
</panel.string>
<panel name="balance_bg">
<text name="balance" tool_tip="Clicca per aggiornare il tuo saldo in L$" value="L$ 20"/>
- <button label="ACQUISTA L$" name="buyL" tool_tip="Clicca per acquistare più L$"/>
+ <button label="Acquista L$" name="buyL" tool_tip="Clicca per acquistare più L$"/>
+ <button label="Acquisti" name="goShop" tool_tip="Apri Mercato Second Life" width="75"/>
</panel>
- <combo_box name="mode_combo" tool_tip="Seleziona la modalità. Seleziona Di base per esplorare facilmente e rapidamente e per la chat. Seleziona Avanzata per accedere ad altre funzionalità.">
- <combo_box.item label="Modalità di base" name="Basic"/>
- <combo_box.item label="Modalità Avanzata" name="Advanced"/>
- </combo_box>
<text name="TimeText" tool_tip="Orario attuale (Pacifico)">
24:00, ora del Pacifico
</text>
diff --git a/indra/newview/skins/default/xui/it/sidepanel_inventory.xml b/indra/newview/skins/default/xui/it/sidepanel_inventory.xml
index 54fa6df407..5d6c7681f9 100644
--- a/indra/newview/skins/default/xui/it/sidepanel_inventory.xml
+++ b/indra/newview/skins/default/xui/it/sidepanel_inventory.xml
@@ -14,7 +14,7 @@
</string>
<button label="Oggetti ricevuti" name="inbox_btn"/>
<text name="inbox_fresh_new_count">
- [NUM] Nuovo
+ [NUM] nuovi
</text>
<panel tool_tip="Drag and drop items to your inventory to manage and use them">
<text name="inbox_inventory_placeholder">
diff --git a/indra/newview/skins/default/xui/it/strings.xml b/indra/newview/skins/default/xui/it/strings.xml
index 9918934e12..c81dd0f55d 100644
--- a/indra/newview/skins/default/xui/it/strings.xml
+++ b/indra/newview/skins/default/xui/it/strings.xml
@@ -40,6 +40,9 @@
<string name="ProgressChangingResolution">
Modifica della risoluzione...
</string>
+ <string name="Fullbright">
+ Luminosità massima (vers. precedente)
+ </string>
<string name="LoginInProgress">
In connessione. [APP_NAME] può sembrare rallentata. Attendi.
</string>
@@ -74,7 +77,7 @@
Elaborazione risposta...
</string>
<string name="LoginInitializingWorld">
- Inizializzazione...
+ Inizializzazione mondo...
</string>
<string name="LoginDecodingImages">
Decodifica immagini...
@@ -589,6 +592,9 @@ Prova ad accedere nuovamente tra un minuto.
<string name="mesh">
reticolo
</string>
+ <string name="AvatarEditingAppearance">
+ (Modifica Aspetto)
+ </string>
<string name="AvatarAway">
Assente
</string>
@@ -1199,7 +1205,7 @@ Prova ad accedere nuovamente tra un minuto.
Non hai una copia di questa texture nel tuo inventario
</string>
<string name="InventoryInboxNoItems">
- Gli elementi acquistati attraverso il mercato verranno consegnati qui
+ Quando acquisti o ricevi un oggetto, verrà visualizzato qui per permetterti di trascinarlo in una cartella dell&apos;inventario o di cancellarlo se non desideri mantenerlo.
</string>
<string name="MarketplaceURL">
http://marketplace.[DOMAIN_NAME]/learn_more
@@ -1261,6 +1267,9 @@ Prova ad accedere nuovamente tra un minuto.
<string name="Marketplace Error Internal Import">
Errore: problema con questo elemento. Riprova più tardi.
</string>
+ <string name="Open landmarks">
+ Apri luoghi di riferimento
+ </string>
<string name="no_transfer" value="(nessun trasferimento)"/>
<string name="no_modify" value="(nessuna modifica)"/>
<string name="no_copy" value="(nessuna copia)"/>
@@ -1388,6 +1397,9 @@ Prova ad accedere nuovamente tra un minuto.
<string name="no_attachments">
Nessun allegato indossato
</string>
+ <string name="Attachments remain">
+ Allegati ([COUNT] spazi restanti)
+ </string>
<string name="Buy">
Acquista
</string>
@@ -1514,6 +1526,12 @@ Prova ad accedere nuovamente tra un minuto.
<string name="Right Pec">
Petto destro
</string>
+ <string name="Neck">
+ Collo
+ </string>
+ <string name="Avatar Center">
+ Centro avatar
+ </string>
<string name="Invalid Attachment">
Punto di collegamento non valido
</string>
@@ -3931,6 +3949,18 @@ Se il messaggio persiste, contatta [SUPPORT_SITE].
<string name="you_paid_ldollars_no_name">
Hai pagato L$ [AMOUNT] [REASON].
</string>
+ <string name="you_paid_failure_ldollars">
+ Non hai pagato [NAME] L$[AMOUNT] [REASON].
+ </string>
+ <string name="you_paid_failure_ldollars_no_info">
+ Non hai pagato L$ [AMOUNT].
+ </string>
+ <string name="you_paid_failure_ldollars_no_reason">
+ Non hai pagato [NAME] L$[AMOUNT].
+ </string>
+ <string name="you_paid_failure_ldollars_no_name">
+ Non hai pagato L$ [AMOUNT] [REASON].
+ </string>
<string name="for item">
per [ITEM]
</string>
@@ -4158,7 +4188,7 @@ Segnala abuso
<string name="Female - Wow">
Femmina - Accipicchia
</string>
- <string name="/bow1">
+ <string name="/bow">
/inchino
</string>
<string name="/clap">
@@ -4341,6 +4371,12 @@ Prova a racchiudere il percorso dell&apos;editor in doppie virgolette.
<string name="ExternalEditorFailedToRun">
L&apos;editor esterno non è stato avviato.
</string>
+ <string name="TranslationFailed">
+ Traduzione non riuscita: [REASON]
+ </string>
+ <string name="TranslationResponseParseError">
+ Errore di elaborazione della risposta della traduzione.
+ </string>
<string name="Esc">
Esc
</string>
@@ -4671,4 +4707,196 @@ Prova a racchiudere il percorso dell&apos;editor in doppie virgolette.
<string name="ParticleHiding">
Particelle nascoste
</string>
+ <string name="Command_AboutLand_Label">
+ Informazioni sul terreno
+ </string>
+ <string name="Command_Appearance_Label">
+ Aspetto fisico
+ </string>
+ <string name="Command_Avatar_Label">
+ Avatar
+ </string>
+ <string name="Command_Build_Label">
+ Costruisci
+ </string>
+ <string name="Command_Chat_Label">
+ Chat
+ </string>
+ <string name="Command_Compass_Label">
+ Bussola
+ </string>
+ <string name="Command_Destinations_Label">
+ Destinazioni
+ </string>
+ <string name="Command_Gestures_Label">
+ Gesture
+ </string>
+ <string name="Command_HowTo_Label">
+ Istruzioni
+ </string>
+ <string name="Command_Inventory_Label">
+ Inventario
+ </string>
+ <string name="Command_Map_Label">
+ Mappa
+ </string>
+ <string name="Command_Marketplace_Label">
+ Mercato
+ </string>
+ <string name="Command_MiniMap_Label">
+ Mini mappa
+ </string>
+ <string name="Command_Move_Label">
+ Cammina / corri / vola
+ </string>
+ <string name="Command_People_Label">
+ Persone
+ </string>
+ <string name="Command_Picks_Label">
+ Preferiti
+ </string>
+ <string name="Command_Places_Label">
+ Luoghi
+ </string>
+ <string name="Command_Preferences_Label">
+ Preferenze
+ </string>
+ <string name="Command_Profile_Label">
+ Profilo
+ </string>
+ <string name="Command_Search_Label">
+ Ricerca
+ </string>
+ <string name="Command_Snapshot_Label">
+ Istantanea
+ </string>
+ <string name="Command_Speak_Label">
+ Parla
+ </string>
+ <string name="Command_View_Label">
+ Controlli fotocamera
+ </string>
+ <string name="Command_Voice_Label">
+ Impostazioni voce
+ </string>
+ <string name="Command_AboutLand_Tooltip">
+ Informazioni sul terreno che visiti
+ </string>
+ <string name="Command_Appearance_Tooltip">
+ Cambia l&apos;avatar
+ </string>
+ <string name="Command_Avatar_Tooltip">
+ Seleziona un avatar completo
+ </string>
+ <string name="Command_Build_Tooltip">
+ Costruzione oggetti e modifica terreno
+ </string>
+ <string name="Command_Chat_Tooltip">
+ Chatta con persone vicine usando il testo
+ </string>
+ <string name="Command_Compass_Tooltip">
+ Bussola
+ </string>
+ <string name="Command_Destinations_Tooltip">
+ Destinazioni interessanti
+ </string>
+ <string name="Command_Gestures_Tooltip">
+ Gesti per il tuo avatar
+ </string>
+ <string name="Command_HowTo_Tooltip">
+ Come eseguire le attività più comuni
+ </string>
+ <string name="Command_Inventory_Tooltip">
+ Visualizza e usa le tue cose
+ </string>
+ <string name="Command_Map_Tooltip">
+ Mappa del mondo
+ </string>
+ <string name="Command_Marketplace_Tooltip">
+ Vai allo shopping
+ </string>
+ <string name="Command_MiniMap_Tooltip">
+ Mostra le persone vicine
+ </string>
+ <string name="Command_Move_Tooltip">
+ Movimento avatar
+ </string>
+ <string name="Command_People_Tooltip">
+ Amici, gruppi e persone vicine
+ </string>
+ <string name="Command_Picks_Tooltip">
+ Luoghi da mostrare come preferiti nel profilo
+ </string>
+ <string name="Command_Places_Tooltip">
+ Luoghi salvati
+ </string>
+ <string name="Command_Preferences_Tooltip">
+ Preferenze
+ </string>
+ <string name="Command_Profile_Tooltip">
+ Modifica o visualizza il tuo profilo
+ </string>
+ <string name="Command_Search_Tooltip">
+ Trova luoghi, eventi, persone
+ </string>
+ <string name="Command_Snapshot_Tooltip">
+ Scatta una foto
+ </string>
+ <string name="Command_Speak_Tooltip">
+ Parla con persone vicine usando il microfono
+ </string>
+ <string name="Command_View_Tooltip">
+ Modifica angolo fotocamera
+ </string>
+ <string name="Command_Voice_Tooltip">
+ I controlli per il volume per le chiamate e per le persone nelle vicinanze nel mondo virtuale
+ </string>
+ <string name="Toolbar_Bottom_Tooltip">
+ attualmente nella barra degli strumenti in basso
+ </string>
+ <string name="Toolbar_Left_Tooltip">
+ attualmente nella barra degli strumenti a sinistra
+ </string>
+ <string name="Toolbar_Right_Tooltip">
+ attualmente nella barra degli strumenti a destra
+ </string>
+ <string name="Retain%">
+ Mantieni%
+ </string>
+ <string name="Detail">
+ Dettagli
+ </string>
+ <string name="Better Detail">
+ Migliori dettagli
+ </string>
+ <string name="Surface">
+ Superficie
+ </string>
+ <string name="Solid">
+ Solido
+ </string>
+ <string name="Wrap">
+ Involucro
+ </string>
+ <string name="Preview">
+ Anteprima
+ </string>
+ <string name="Normal">
+ Normale
+ </string>
+ <string name="snapshot_quality_very_low">
+ Molto basso
+ </string>
+ <string name="snapshot_quality_low">
+ Basso
+ </string>
+ <string name="snapshot_quality_medium">
+ Medio
+ </string>
+ <string name="snapshot_quality_high">
+ Alto
+ </string>
+ <string name="snapshot_quality_very_high">
+ Molto alto
+ </string>
</strings>
diff --git a/indra/newview/skins/default/xui/it/teleport_strings.xml b/indra/newview/skins/default/xui/it/teleport_strings.xml
index 7a1046abd3..f485212290 100644
--- a/indra/newview/skins/default/xui/it/teleport_strings.xml
+++ b/indra/newview/skins/default/xui/it/teleport_strings.xml
@@ -18,6 +18,10 @@ Se si continua a visualizzare questo messaggio, consulta la pagina [SUPPORT_SITE
<message name="timeout_tport">
Spiacenti, il sistema non riesce a completare il teletrasporto. Riprova tra un attimo.
</message>
+ <message name="NoHelpIslandTP">
+ Non puoi teleportarti nuovamente a Welcome Island.
+Per ripetere l&apos;esercitazione, visita &apos;Welcome Island Public&apos;.
+ </message>
<message name="noaccess_tport">
Spiacenti, ma non hai accesso nel luogo di destinazione richiesto.
</message>
diff --git a/indra/newview/skins/default/xui/ja/floater_about.xml b/indra/newview/skins/default/xui/ja/floater_about.xml
index 47bb2455cf..3c7a210a22 100644
--- a/indra/newview/skins/default/xui/ja/floater_about.xml
+++ b/indra/newview/skins/default/xui/ja/floater_about.xml
@@ -10,7 +10,7 @@
<floater.string name="AboutPosition">
ã‚ãªãŸã®ç¾åœ¨åœ°ã¯ã€[POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1] ã® [REGION] ã§ã™ã€‚ä½ç½®ã¯ &lt;nolink&gt;[HOSTNAME]&lt;/nolink&gt; ã§ã™ã€‚([HOSTIP])
[SERVER_VERSION]
-[[SERVER_RELEASE_NOTES_URL] [リリースノート]]
+[SERVER_RELEASE_NOTES_URL]
</floater.string>
<floater.string name="AboutSystem">
CPU: [CPU]
@@ -37,6 +37,9 @@ Qt Webkit ãƒãƒ¼ã‚¸ãƒ§ãƒ³ï¼š [QT_WEBKIT_VERSION]
<floater.string name="AboutTraffic">
パケットロス: [PACKETS_LOST,number,0]/[PACKETS_IN,number,0] ([PACKETS_PCT,number,1]%)
</floater.string>
+ <floater.string name="ErrorFetchingServerReleaseNotesURL">
+ サーãƒãƒ¼ã®ãƒªãƒªãƒ¼ã‚¹ãƒŽãƒ¼ãƒˆã® URL ã‚’å–得中ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚
+ </floater.string>
<tab_container name="about_tab">
<panel label="情報" name="support_panel">
<button label="クリップボードã«ã‚³ãƒ”ー" name="copy_btn"/>
@@ -87,6 +90,8 @@ google-perftools Copyright (c) 2005, Google Inc.
Second Life ビューワã§ã¯ Havok (TM) Physics ãŒä½¿ç”¨ã•れã¦ã„ã¾ã™ã€‚(c)Copyright 1999-2010 Havok.com Inc. (and its Licensors).無断複写・複製・転載をç¦ã˜ã¾ã™ã€‚詳細ã«ã¤ã„ã¦ã¯ www.havok.com ã‚’ã”å‚ç…§ãã ã•ã„。
+ã“ã®ã‚½ãƒ•トウェアã«ã¯ã€NVIDIA Corporation ã«ã‚ˆã‚‹ã‚½ãƒ¼ã‚¹ã‚³ãƒ¼ãƒ‰ãŒå«ã¾ã‚Œã¾ã™ã€‚
+
無断複写・複製・転載をç¦ã˜ã¾ã™ã€‚詳細ã«ã¤ã„ã¦ã¯ licenses.txt ã‚’ã”å‚ç…§ãã ã•ã„。
ボイスãƒãƒ£ãƒƒãƒˆã®ã‚ªãƒ¼ãƒ‡ã‚£ã‚ªã‚³ãƒ¼ãƒ‡ã‚£ãƒ³ã‚°ï¼šPolycom(R) Siren14(TM) (ITU-T Rec.G.722.1 Annex C)
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 e870a8ace9..816a6ff203 100644
--- a/indra/newview/skins/default/xui/ja/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/ja/floater_about_land.xml
@@ -130,7 +130,7 @@
交通é‡:
</text>
<text name="DwellText">
- 誤
+ ローディング...
</text>
<button label="土地ã®è³¼å…¥" label_selected="土地を購入..." left="130" name="Buy Land..." width="100"/>
<button label="リンデンセール" label_selected="Linden セール..." name="Linden Sale..." tool_tip="åœŸåœ°ãŒæ‰€æœ‰ã•れã¦ãŠã‚Šã€ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ãŒè¨­å®šã•れã¦ã„ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚オークションã®å¯¾è±¡ã«ãªã£ã¦ã„ãªã„ã“ã¨ã‚‚å¿…è¦æ¡ä»¶ã§ã™ã€‚"/>
@@ -214,19 +214,19 @@
オブジェクトボーナス: [BONUS]
</text>
<text name="Simulator primitive usage:">
- プリム使用状æ³ï¼š
+ リージョン(地域)ã®è¨±å®¹æ•°ï¼š
</text>
<text name="objects_available">
[MAX] ã®å†… [COUNT] ([AVAILABLE] 利用å¯èƒ½ï¼‰
</text>
<text name="Primitives parcel supports:">
- 区画ã§ã‚µãƒãƒ¼ãƒˆã•れるプリム数:
+ 区画ã®è¨±å®¹æ•°ï¼š
</text>
<text name="object_contrib_text">
[COUNT]
</text>
<text name="Primitives on parcel:">
- 区画上ã®ãƒ—リム数:
+ 区画ã®è² è·ï¼š
</text>
<text name="total_objects_text">
[COUNT]
@@ -311,13 +311,15 @@
ãƒ—ãƒƒã‚·ãƒ¥ç¦æ­¢ (地域設定優先)
</panel.string>
<panel.string name="see_avs_text">
- ã“ã®åŒºç”»ã«ã„ã‚‹ä½äººã¨ä¼šã£ã¦ãƒãƒ£ãƒƒãƒˆã™ã‚‹
+ ä»–ã®åŒºç”»ã«ã„ã‚‹ã‚¢ãƒã‚¿ãƒ¼ã¯ã€
</panel.string>
<text name="allow_label">
ä»–ã®ä½äººã¸ã®è¨±å¯ï¼š
</text>
- <check_box label="地形を編集" name="edit land check" tool_tip="ãƒã‚§ãƒƒã‚¯ã‚’入れるã¨ã€ä»–人ãŒã‚ãªãŸã®åœŸåœ°ã®åœ°å½¢ç·¨é›†ã‚’行ã†ã“ã¨ãŒå¯èƒ½ã¨ãªã‚Šã¾ã™ã€‚ã“ã®ã‚ªãƒ—ションã®ãƒã‚§ãƒƒã‚¯ã‚’外ã—ã¦ãŠãã“ã¨ã‚’ãŠã™ã™ã‚ã—ã¾ã™ã€‚外ã—ãŸçŠ¶æ…‹ã§ã‚ãªãŸã®åœŸåœ°ã®åœ°å½¢ç·¨é›†ãŒå¯èƒ½ã§ã™ã€‚"/>
- <check_box label="飛行" name="check fly" tool_tip="ãƒã‚§ãƒƒã‚¯ã‚’入れるã¨ã“ã®åœŸåœ°ã§ã®é£›è¡ŒãŒå¯èƒ½ã¨ãªã‚Šã¾ã™ã€‚ãƒã‚§ãƒƒã‚¯ã‚’外ã™ã¨åœŸåœ°ã«å…¥ã‚‹éš›ã¨é€šã‚ŠéŽãŽã‚‹ã¨ãã®ã¿é£›è¡Œå¯èƒ½ã¨ãªã‚Šã¾ã™ã€‚"/>
+ <text name="allow_label0">
+ 飛行:
+ </text>
+ <check_box label="全員" name="check fly" tool_tip="ãƒã‚§ãƒƒã‚¯ã‚’入れるã¨ã“ã®åœŸåœ°ã§ã®é£›è¡ŒãŒå¯èƒ½ã¨ãªã‚Šã¾ã™ã€‚ãƒã‚§ãƒƒã‚¯ã‚’外ã™ã¨åœŸåœ°ã«å…¥ã‚‹éš›ã¨é€šã‚ŠéŽãŽã‚‹ã¨ãã®ã¿é£›è¡Œå¯èƒ½ã¨ãªã‚Šã¾ã™ã€‚"/>
<text name="allow_label2">
制作:
</text>
@@ -333,9 +335,6 @@
</text>
<check_box label="全員" name="check other scripts"/>
<check_box label="グループ" name="check group scripts"/>
- <text name="land_options_label">
- 土地オプション:
- </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="ã“ã®åŒºç”»ã‚’æ¤œç´¢çµæžœã«è¡¨ç¤ºã—ã¾ã™"/>
@@ -376,9 +375,9 @@
</text>
<texture_picker label="" name="snapshot_ctrl" tool_tip="写真をクリックã—ã¦é¸æŠž"/>
<text name="allow_label5">
- ä»–ã®åŒºç”»ã«ã„ã‚‹ä½äººã¸ã®è¨±å¯ï¼š
+ ã“ã®åŒºç”»ã«ã„ã‚‹ã‚¢ãƒã‚¿ãƒ¼ã«ä¼šã£ã¦ãƒãƒ£ãƒƒãƒˆã§ãã¾ã™
</text>
- <check_box label="ã‚¢ãƒã‚¿ãƒ¼ã‚’表示" name="SeeAvatarsCheck" tool_tip="ä»–ã®åŒºç”»ã®ä½äººãŒã€ã“ã®åŒºç”»ã«ã„ã‚‹ä½äººã«ä¼šã£ã¦ãƒãƒ£ãƒƒãƒˆã™ã‚‹ã“ã¨ã‚’許å¯ã—ã€ã‚ãªãŸã‚‚ãれらä½äººã«ä¼šã£ã¦ãƒãƒ£ãƒƒãƒˆã§ãるよã†ã«ã—ã¾ã™ã€‚"/>
+ <check_box label="ã‚¢ãƒã‚¿ãƒ¼ã‚’表示" name="SeeAvatarsCheck" tool_tip="ä»–ã®åŒºç”»ã®ã‚¢ãƒã‚¿ãƒ¼ãŒã€ã“ã®åŒºç”»ã«ã„ã‚‹ã‚¢ãƒã‚¿ãƒ¼ã«ä¼šã£ã¦ãƒãƒ£ãƒƒãƒˆã™ã‚‹ã“ã¨ã‚’許å¯ã—ã€ã‚ãªãŸã‚‚ãれらアãƒã‚¿ãƒ¼ã«ä¼šã£ã¦ãƒãƒ£ãƒƒãƒˆã§ãるよã†ã«ã—ã¾ã™ã€‚"/>
<text name="landing_point">
ç€åœ°ç‚¹: [LANDING]
</text>
diff --git a/indra/newview/skins/default/xui/ja/floater_avatar.xml b/indra/newview/skins/default/xui/ja/floater_avatar.xml
new file mode 100644
index 0000000000..d289580506
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/floater_avatar.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Avatar" title="ã‚¢ãƒã‚¿ãƒ¼ã‚’é¸æŠž"/>
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 22af6e0ea2..a472f163e3 100644
--- a/indra/newview/skins/default/xui/ja/floater_buy_currency.xml
+++ b/indra/newview/skins/default/xui/ja/floater_buy_currency.xml
@@ -46,7 +46,7 @@
L$ [AMT]
</text>
<text name="currency_links">
- [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 æ›ç®—レート]
+ [http://www.secondlife.com/my/account/payment_method_management.php 支払方法] | [http://www.secondlife.com/my/account/currency.php 通貨]
</text>
<text name="exchange_rate_note">
金é¡ã‚’å†å…¥åŠ›ã—ã¦æœ€æ–°æ›ç®—レートを確èªã—ã¾ã™ã€‚
diff --git a/indra/newview/skins/default/xui/ja/floater_camera.xml b/indra/newview/skins/default/xui/ja/floater_camera.xml
index 71a20c8e18..982e5ce42b 100644
--- a/indra/newview/skins/default/xui/ja/floater_camera.xml
+++ b/indra/newview/skins/default/xui/ja/floater_camera.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="camera_floater">
+<floater name="camera_floater" title="カメラã®ã‚³ãƒ³ãƒˆãƒ­ãƒ¼ãƒ«">
<floater.string name="rotate_tooltip">
フォーカスを中心ã«ã‚«ãƒ¡ãƒ©ã‚’回転
</floater.string>
@@ -9,15 +9,6 @@
<floater.string name="move_tooltip">
カメラを上下左å³ã«ç§»å‹•
</floater.string>
- <floater.string name="camera_modes_title">
- カメラモード
- </floater.string>
- <floater.string name="pan_mode_title">
- 旋回 - ズーム - 水平・垂直移動
- </floater.string>
- <floater.string name="presets_mode_title">
- 事å‰è¨­å®šã®è¦–野
- </floater.string>
<floater.string name="free_mode_title">
オブジェクトを見る
</floater.string>
diff --git a/indra/newview/skins/default/xui/ja/floater_chat_bar.xml b/indra/newview/skins/default/xui/ja/floater_chat_bar.xml
new file mode 100644
index 0000000000..504cea5931
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/floater_chat_bar.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="chat_bar" title="è¿‘ãã®ãƒãƒ£ãƒƒãƒˆ">
+ <panel name="bottom_panel">
+ <line_editor label="ã“ã“をクリックã—ã¦ãƒãƒ£ãƒƒãƒˆã‚’é–‹å§‹ã—ã¾ã™ã€‚" name="chat_box" tool_tip="Enter キーを押ã—ã¦è©±ã—ã€Ctrl + Enter キーã§å«ã³ã¾ã™ã€‚"/>
+ <button name="show_nearby_chat" tool_tip="è¿‘ãã®ãƒãƒ£ãƒƒãƒˆãƒ­ã‚°ã‚’表示・éžè¡¨ç¤º"/>
+ </panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_destinations.xml b/indra/newview/skins/default/xui/ja/floater_destinations.xml
new file mode 100644
index 0000000000..b7f6ad4d4e
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/floater_destinations.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Destinations" title="行ãå…ˆ"/>
diff --git a/indra/newview/skins/default/xui/ja/floater_fast_timers.xml b/indra/newview/skins/default/xui/ja/floater_fast_timers.xml
new file mode 100644
index 0000000000..5f538ecdb0
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/floater_fast_timers.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="fast_timers">
+ <string name="pause">
+ ä¸€æ™‚åœæ­¢
+ </string>
+ <string name="run">
+ èµ°ã‚‹
+ </string>
+ <button label="ä¸€æ™‚åœæ­¢" name="pause_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_hardware_settings.xml b/indra/newview/skins/default/xui/ja/floater_hardware_settings.xml
index ffafbaf3b6..1b6558a9eb 100644
--- a/indra/newview/skins/default/xui/ja/floater_hardware_settings.xml
+++ b/indra/newview/skins/default/xui/ja/floater_hardware_settings.xml
@@ -4,8 +4,8 @@
フィルタリング:
</text>
<check_box label="異方的フィルタリング(有効ã«ã™ã‚‹ã¨é€Ÿåº¦ãŒä½Žä¸‹ã—ã¾ã™ï¼‰" name="ani"/>
- <text name="Antialiasing:">
- アンãƒã‚¨ã‚¤ãƒªã‚¢ã‚·ãƒ³ã‚°:
+ <text name="antialiasing label">
+ アンãƒã‚¨ã‚¤ãƒªã‚¢ã‚·ãƒ³ã‚°ï¼š
</text>
<combo_box label="アンãƒã‚¨ã‚¤ãƒªã‚¢ã‚·ãƒ³ã‚°" name="fsaa">
<combo_box.item label="無効" name="FSAADisabled"/>
diff --git a/indra/newview/skins/default/xui/ja/floater_how_to.xml b/indra/newview/skins/default/xui/ja/floater_how_to.xml
new file mode 100644
index 0000000000..4cebe27226
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/floater_how_to.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_how_to" title="ãƒã‚¦ãƒ„ー"/>
diff --git a/indra/newview/skins/default/xui/ja/floater_map.xml b/indra/newview/skins/default/xui/ja/floater_map.xml
index ff5a25fd7b..1122203446 100644
--- a/indra/newview/skins/default/xui/ja/floater_map.xml
+++ b/indra/newview/skins/default/xui/ja/floater_map.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Map" title="">
+<floater name="Map" title="ミニマップ">
<floater.string name="ToolTipMsg">
[REGION](ダブルクリックã§åœ°å›³ã‚’é–‹ã。Shiftâ€ãƒ‰ãƒ©ãƒƒã‚°ã§æ°´å¹³ãƒ»åž‚直移動)
</floater.string>
diff --git a/indra/newview/skins/default/xui/ja/floater_model_preview.xml b/indra/newview/skins/default/xui/ja/floater_model_preview.xml
index 07667bb697..c9ff0e29cb 100644
--- a/indra/newview/skins/default/xui/ja/floater_model_preview.xml
+++ b/indra/newview/skins/default/xui/ja/floater_model_preview.xml
@@ -1,10 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Model Preview" title="モデルをアップロード">
- <string name="status_idle">
- 待機状態
- </string>
+<floater name="Model Preview" title="モデルウィザード">
+ <string name="status_idle"/>
<string name="status_parse_error">
- Dae ã«å•題ãŒè¦‹ã¤ã‹ã‚Šã¾ã—㟠- 詳細ã«ã¤ã„ã¦ã¯ãƒ­ã‚°ã‚’ã”å‚ç…§ãã ã•ã„。
+ エラー:Dae ã«å•題ãŒè¦‹ã¤ã‹ã‚Šã¾ã—㟠- 詳細ã«ã¤ã„ã¦ã¯ãƒ­ã‚°ã‚’ã”å‚ç…§ãã ã•ã„。
+ </string>
+ <string name="status_material_mismatch">
+ ã‚¨ãƒ©ãƒ¼ï¼šãƒ¢ãƒ‡ãƒ«ã®ææ–™ã¯å‚考モデルã®ã‚µãƒ–セットã§ã¯ã‚りã¾ã›ã‚“。
</string>
<string name="status_reading_file">
ローディング...
@@ -51,6 +52,9 @@
<string name="mesh_status_missing_lod">
å¿…è¦ãªæç”»è©³ç´°åº¦ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。
</string>
+ <string name="mesh_status_invalid_material_list">
+ LOD 付ãã®ææ–™ã¯å‚考モデルã®ã‚µãƒ–セットã§ã¯ã‚りã¾ã›ã‚“。
+ </string>
<string name="layer_all">
å…¨ã¦
</string>
@@ -63,188 +67,211 @@
<string name="tbd">
未定
</string>
- <text name="name_label">
- åå‰ï¼š
- </text>
- <text name="lod_label">
- プレビュー:
- </text>
- <combo_box name="preview_lod_combo" tool_tip="プレビュー表示ã®LOD設定">
- <combo_item name="high">
- æç”»è©³ç´°åº¦ï¼šé«˜
- </combo_item>
- <combo_item name="medium">
- æç”»è©³ç´°åº¦ï¼šä¸­
- </combo_item>
- <combo_item name="low">
- æç”»è©³ç´°åº¦ï¼šä½Ž
- </combo_item>
- <combo_item name="lowest">
- æç”»è©³ç´°åº¦ï¼šæœ€ä½Ž
- </combo_item>
- </combo_box>
- <text name="warning_title">
- 警告:
- </text>
- <text name="warning_message">
- ã“ã®ãƒ¢ãƒ‡ãƒ«ã‚’ Second Life サーãƒãƒ¼ã«ã‚¢ãƒƒãƒ—ロードã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。メッシュモデルã®ã‚¢ãƒƒãƒ—ロード手順ã«ã¤ã„ã¦ã¯ [[VURL] ã“ã¡ã‚‰ã‚’å‚ç…§ã—ã¦ãã ã•ã„]。
- </text>
- <text name="weights_text">
- ダウンロード:
-ç‰©ç†æ¼”算:
-サーãƒãƒ¼è² è·ï¼š
-
-プリムæ›ç®—:
- </text>
- <text name="weights">
- [ST]
-[PH]
-[SIM]
-
-[EQ]
- </text>
- <tab_container name="import_tab">
- <panel label="æç”»è©³ç´°åº¦" name="lod_panel">
- <text name="lod_table_header">
- æç”»è©³ç´°åº¦ã‚’é¸æŠžï¼š
- </text>
- <text name="high_label" value="高"/>
- <text name="high_triangles" value="0"/>
- <text name="high_vertices" value="0"/>
- <text name="medium_label" value="中"/>
- <text name="medium_triangles" value="0"/>
- <text name="medium_vertices" value="0"/>
- <text name="low_label" value="低"/>
- <text name="low_triangles" value="0"/>
- <text name="low_vertices" value="0"/>
- <text name="lowest_label" value="最低"/>
- <text name="lowest_triangles" value="0"/>
- <text name="lowest_vertices" value="0"/>
- <text name="lod_table_footer">
- æç”»è©³ç´°åº¦ï¼š [DETAIL]
- </text>
- <radio_group name="lod_file_or_limit" value="lod_from_file">
- <radio_item label="ファイルã‹ã‚‰ãƒ­ãƒ¼ãƒ‰" name="lod_from_file"/>
- <radio_item label="自動作æˆ" name="lod_auto_generate"/>
- <radio_item label="ãªã—" name="lod_none"/>
- </radio_group>
- <button label="å‚ç…§" name="lod_browse"/>
- <combo_box name="lod_mode">
- <combo_item name="triangle_limit">
- 三角形ã®é™åº¦æ•°
- </combo_item>
- <combo_item name="error_threshold">
- エラーã—ãã„値
- </combo_item>
- </combo_box>
- <text name="build_operator_text">
- 制作演算å­ï¼š
- </text>
- <text name="queue_mode_text">
- キューモード:
- </text>
- <combo_box name="build_operator">
- <combo_item name="edge_collapse">
- 稜ã®å®Œå…¨è¤‡åˆ
- </combo_item>
- <combo_item name="half_edge_collapse">
- 稜ã®åŠè¤‡åˆ
- </combo_item>
- </combo_box>
- <combo_box name="queue_mode">
- <combo_item name="greedy">
- グリーディ
- </combo_item>
- <combo_item name="lazy">
- レイジー
- </combo_item>
- <combo_item name="independent">
- インディペンデント
- </combo_item>
- </combo_box>
- <text name="border_mode_text">
- 境界線モード:
+ <panel name="left_panel">
+ <panel name="model_name_representation_panel">
+ <text name="name_label">
+ モデルå:
</text>
- <text name="share_tolderance_text">
- 共有誤差:
+ <text name="model_category_label">
+ ã“ã®ãƒ¢ãƒ‡ãƒ«ã¯...
</text>
- <combo_box name="border_mode">
- <combo_item name="border_unlock">
- ロック解除
- </combo_item>
- <combo_item name="border_lock">
- ロック
- </combo_item>
+ <combo_box name="model_category_combo">
+ <combo_item label="1ã¤ã‚’é¸æŠž..." name="Choose one"/>
+ <combo_item label="ã‚¢ãƒã‚¿ãƒ¼ã®å½¢" name="Avatar shape"/>
+ <combo_item label="ã‚¢ãƒã‚¿ãƒ¼ã®ã‚¢ã‚¿ãƒƒãƒãƒ¡ãƒ³ãƒˆ" name="Avatar attachment"/>
+ <combo_item label="å‹•ãオブジェクト(車ã€å‹•物)" name="Moving object (vehicle, animal)"/>
+ <combo_item label="制作用コンãƒãƒ¼ãƒãƒ³ãƒˆ" name="Building Component"/>
+ <combo_item label="大型ã€ä¸å‹•ã€ç­‰" name="Large, non moving etc"/>
+ <combo_item label="ã‚„ã‚„å°åž‹ã€ä¸å‹•ã€ç­‰" name="Smaller, non-moving etc"/>
+ <combo_item label="ã„ãšã‚Œã«ã‚‚該当ã—ãªã„" name="Not really any of these"/>
</combo_box>
- <text name="crease_label">
- 折れ角度:
- </text>
- <spinner name="crease_angle" value="75"/>
</panel>
- <panel label="物ç†åŠ¹æžœ" name="physics_panel">
- <panel name="physics geometry">
- <radio_group name="physics_load_radio" value="physics_load_from_file">
- <radio_item label="ファイル:" name="physics_load_from_file"/>
- <radio_item label="æ¬¡ã®æç”»è©³ç´°åº¦ã‚’ä½¿ç”¨ï¼š" name="physics_use_lod"/>
- </radio_group>
- <combo_box name="physics_lod_combo" tool_tip="実åƒã«é©ç”¨ã™ã‚‹LOD">
- <combo_item name="physics_lowest">
- 最低
- </combo_item>
- <combo_item name="physics_low">
- 低
- </combo_item>
- <combo_item name="physics_medium">
- 中
- </combo_item>
- <combo_item name="physics_high">
- 高
- </combo_item>
- </combo_box>
- <button label="å‚ç…§" name="physics_browse"/>
- </panel>
- <panel name="physics analysis">
- <slider label="滑らã‹ã•:" name="Smooth"/>
- <check_box label="ç©´ã‚’é–‰ã˜ã‚‹ï¼ˆã‚¹ãƒ­ãƒ¼ï¼‰" name="Close Holes (Slow)"/>
- <button label="分æž" name="Decompose"/>
- <button label="å–り消ã—" name="decompose_cancel"/>
+ <tab_container name="import_tab">
+ <panel label="æç”»è©³ç´°åº¦" name="lod_panel" title="æç”»è©³ç´°åº¦">
+ <text initial_value="データæº" name="source" value="データæº"/>
+ <text initial_value="三角形" name="triangles" value="三角形"/>
+ <text initial_value="頂点" name="vertices" value="頂点"/>
+ <text initial_value="高" name="high_label" value="高"/>
+ <button label="å‚ç…§" name="lod_browse_high"/>
+ <text initial_value="0" name="high_triangles" value="0"/>
+ <text initial_value="0" name="high_vertices" value="0"/>
+ <text initial_value="中" name="medium_label" value="中"/>
+ <button label="å‚ç…§" name="lod_browse_medium"/>
+ <text initial_value="0" name="medium_triangles" value="0"/>
+ <text initial_value="0" name="medium_vertices" value="0"/>
+ <text initial_value="低" name="low_label" value="低"/>
+ <button label="å‚ç…§" name="lod_browse_low"/>
+ <text initial_value="0" name="low_triangles" value="0"/>
+ <text initial_value="0" name="low_vertices" value="0"/>
+ <text initial_value="最低" name="lowest_label" value="最低"/>
+ <button label="å‚ç…§" name="lod_browse_lowest"/>
+ <text initial_value="0" name="lowest_triangles" value="0"/>
+ <text initial_value="0" name="lowest_vertices" value="0"/>
+ <check_box label="ノーマルã®ä½œæˆ" name="gen_normals"/>
+ <text initial_value="折れ角度:" name="crease_label" value="折れ角度:"/>
+ <spinner name="crease_angle" value="75"/>
</panel>
- <panel name="physics simplification">
- <slider label="パス:" name="Combine Quality"/>
- <slider label="詳細度:" name="Detail Scale"/>
- <slider label="ç¶­æŒçŽ‡ï¼š" name="Retain%"/>
- <button label="å˜ç´”化" name="Simplify"/>
- <button label="å–り消ã—" name="simplify_cancel"/>
+ <panel label="物ç†åŠ¹æžœ" name="physics_panel">
+ <panel name="physics geometry">
+ <text name="first_step_name">
+ 手順1:æç”»è©³ç´°åº¦
+ </text>
+ <combo_box name="physics_lod_combo" tool_tip="実åƒã«é©ç”¨ã™ã‚‹LOD">
+ <combo_item name="choose_one">
+ 1ã¤ã‚’é¸æŠž...
+ </combo_item>
+ <combo_item name="physics_high">
+ 高
+ </combo_item>
+ <combo_item name="physics_medium">
+ 中
+ </combo_item>
+ <combo_item name="physics_low">
+ 低
+ </combo_item>
+ <combo_item name="physics_lowest">
+ 最低
+ </combo_item>
+ <combo_item name="load_from_file">
+ ファイルã‹ã‚‰
+ </combo_item>
+ </combo_box>
+ <button label="å‚ç…§" name="physics_browse"/>
+ </panel>
+ <panel name="physics analysis">
+ <text name="method_label">
+ 手順2:分æž
+ </text>
+ <text name="analysis_method_label">
+ 方法:
+ </text>
+ <text name="quality_label">
+ å“質:
+ </text>
+ <text name="smooth_method_label">
+ 滑らã‹ã•:
+ </text>
+ <check_box label="ç©´ã‚’é–‰ã˜ã‚‹" name="Close Holes (Slow)"/>
+ <button label="分æž" name="Decompose"/>
+ <button label="å–り消ã—" name="decompose_cancel"/>
+ </panel>
+ <panel name="physics simplification">
+ <text name="second_step_label">
+ 手順3:å˜ç´”化
+ </text>
+ <text name="simp_method_header">
+ 方法:
+ </text>
+ <text name="pass_method_header">
+ パス:
+ </text>
+ <text name="Detail Scale label">
+ 詳細度:
+ </text>
+ <text name="Retain%_label">
+ ç¶­æŒçŽ‡ï¼š
+ </text>
+ <combo_box name="Combine Quality" value="1"/>
+ <button label="å˜ç´”化" name="Simplify"/>
+ <button label="å–り消ã—" name="simplify_cancel"/>
+ </panel>
+ <panel name="physics info">
+ <text name="results_text">
+ çµæžœï¼š
+ </text>
+ <text name="physics_triangles">
+ 三角形:[TRIANGLES],
+ </text>
+ <text name="physics_points">
+ 頂点:[POINTS],
+ </text>
+ <text name="physics_hulls">
+ 外殻構造:[HULLS]
+ </text>
+ </panel>
</panel>
- <panel name="physics info">
- <slider label="プレビュースプレッド:" name="physics_explode"/>
- <text name="physics_triangles">
- 三角形: [TRIANGLES]
+ <panel label="アップロードã®ã‚ªãƒ—ション" name="modifiers_panel">
+ <text name="scale_label">
+ スケール(1=増減ãªã—):
</text>
- <text name="physics_points">
- 頂点: [POINTS]
+ <spinner name="import_scale" value="1.0"/>
+ <text name="dimensions_label">
+ サイズ:
</text>
- <text name="physics_hulls">
- 外殻構造: [HULLS]
+ <text name="import_dimensions">
+ [X] X [Y] X [Z]
</text>
+ <check_box label="テクスãƒãƒ£ã‚’å«ã‚€" name="upload_textures"/>
+ <text name="include_label">
+ ã‚¢ãƒã‚¿ãƒ¼ãƒ¢ãƒ‡ãƒ«å°‚用:
+ </text>
+ <check_box label="スキンã®é‡ã•ã‚’å«ã‚€" name="upload_skin"/>
+ <check_box label="ジョイントãƒã‚¸ã‚·ãƒ§ãƒ³ã‚’å«ã‚€" name="upload_joints"/>
+ <text name="pelvis_offset_label">
+ Z オフセット(アãƒã‚¿ãƒ¼ã‚’上下調整):
+ </text>
+ <spinner name="pelvis_offset" value="0.0"/>
</panel>
- </panel>
- <panel label="修飾å­" name="modifiers_panel">
- <spinner name="import_scale" value="1.0"/>
- <text name="import_dimensions">
- [X] x [Y] x [Z] m
+ </tab_container>
+ <panel name="weights_and_warning_panel">
+ <button label="ã‚¦ã‚§ã‚¤ãƒˆã¨æ–™é‡‘ã®è¨ˆç®—" name="calculate_btn" tool_tip="ã‚¦ã‚§ã‚¤ãƒˆã¨æ–™é‡‘ã®è¨ˆç®—"/>
+ <button label="å–り消ã—" name="cancel_btn"/>
+ <button label="アップロード" name="ok_btn" tool_tip="シミュレーターã«ã‚¢ãƒƒãƒ—ロード"/>
+ <button label="設定をクリアã—ã¦ãƒ•ォームをリセット" name="reset_btn"/>
+ <text name="upload_fee">
+ アップロード料金:L$ [FEE]
+ </text>
+ <text name="prim_weight">
+ 土地ã®è² è·ï¼š[EQ]
+ </text>
+ <text name="download_weight">
+ ダウンロード:[ST]
+ </text>
+ <text name="physics_weight">
+ ç‰©ç†æ¼”算:[PH]
+ </text>
+ <text name="server_weight">
+ サーãƒãƒ¼è² è·ï¼š[SIM]
+ </text>
+ <text name="warning_title">
+ ã”æ³¨æ„:
+ </text>
+ <text name="warning_message">
+ メッシュモデルをアップロードã™ã‚‹æ¨©åˆ©ãŒã‚りã¾ã›ã‚“。権利ã®å–得方法ã«ã¤ã„ã¦ã¯ [[VURL]] ã“ã¡ã‚‰ã‚’å‚ç…§ã—ã¦ãã ã•ã„。
+ </text>
+ <text name="status">
+ [STATUS]
</text>
- <check_box label="テクスãƒãƒ£" name="upload_textures"/>
- <check_box label="スキンã®é‡ã•" name="upload_skin"/>
- <check_box label="ジョイントãƒã‚¸ã‚·ãƒ§ãƒ³" name="upload_joints"/>
- <spinner name="pelvis_offset" value="0.0"/>
</panel>
- </tab_container>
- <text name="upload_fee">
- アップロード料金:L$ [FEE]
+ </panel>
+ <text name="lod_label">
+ プレビュー:
</text>
- <button label="デフォルトã«è¨­å®š" name="reset_btn" tool_tip="デフォルトã«è¨­å®š"/>
- <button label="ã‚¦ã‚§ã‚¤ãƒˆã¨æ–™é‡‘ã®è¨ˆç®—" name="calculate_btn" tool_tip="ã‚¦ã‚§ã‚¤ãƒˆã¨æ–™é‡‘ã®è¨ˆç®—"/>
- <button label="アップロード" name="ok_btn" tool_tip="シミュレーターã«ã‚¢ãƒƒãƒ—ロード"/>
- <button label="å–り消ã—" name="cancel_btn"/>
+ <panel name="right_panel">
+ <combo_box name="preview_lod_combo" tool_tip="プレビュー表示㮠LOD 設定">
+ <combo_item name="high">
+ 高
+ </combo_item>
+ <combo_item name="medium">
+ 中
+ </combo_item>
+ <combo_item name="low">
+ 低
+ </combo_item>
+ <combo_item name="lowest">
+ 最低
+ </combo_item>
+ </combo_box>
+ <text name="label_display">
+ ディスプレイ...
+ </text>
+ <check_box label="稜" name="show_edges"/>
+ <check_box label="物ç†åŠ¹æžœ" name="show_physics"/>
+ <check_box label="テクスãƒãƒ£" name="show_textures"/>
+ <check_box label="スキンã®é‡ã•" name="show_skin_weight"/>
+ <check_box label="ジョイント" name="show_joint_positions"/>
+ <text name="physics_explode_label">
+ プレビュースプレッド:
+ </text>
+ </panel>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_model_wizard.xml b/indra/newview/skins/default/xui/ja/floater_model_wizard.xml
index 2f336fcbde..6aaa9a42a5 100644
--- a/indra/newview/skins/default/xui/ja/floater_model_wizard.xml
+++ b/indra/newview/skins/default/xui/ja/floater_model_wizard.xml
@@ -6,26 +6,23 @@
<button label="2. 最é©åŒ–" name="optimize_btn"/>
<button label="1. ãƒ•ã‚¡ã‚¤ãƒ«ã‚’é¸æŠž" name="choose_file_btn"/>
<panel name="choose_file_panel">
- <panel name="choose_file_header_panel">
- <text name="choose_file_header_text">
+ <panel name="header_panel">
+ <text name="header_text">
ãƒ¢ãƒ‡ãƒ«ãƒ•ã‚¡ã‚¤ãƒ«ã‚’é¸æŠž
</text>
</panel>
- <panel name="choose_file_content_panel">
+ <panel name="content">
<text name="advanced_users_text">
上級ユーザーã®å ´åˆï¼š3D コンテンツã®åˆ¶ä½œãƒ„ãƒ¼ãƒ«ã‚’ä½¿ã„æ…£ã‚ŒãŸæ–¹ã¯ã€é«˜åº¦ãªã‚¢ãƒƒãƒ—ローダーもãŠè©¦ã—ãã ã•ã„。
</text>
<button label="アドãƒãƒ³ã‚¹ãƒ¢ãƒ¼ãƒ‰ã«åˆ‡ã‚Šæ›¿ãˆã‚‹" name="switch_to_advanced"/>
- <text name="choose_model_file_label">
+ <text name="Cache location">
アップロードã™ã‚‹ãƒ¢ãƒ‡ãƒ«ãƒ•ァイルã®é¸æŠž
</text>
<button label="å‚ç…§" label_selected="å‚ç…§" name="browse"/>
- <text name="support_collada_text">
+ <text name="Model types">
Second Life 㯠COLLADA (.dae) ファイルをサãƒãƒ¼ãƒˆã—ã¾ã™ã€‚
</text>
- <text name="dimensions_label">
- サイズ(メートル):
- </text>
<text name="dimensions">
X Y Z
</text>
@@ -38,18 +35,15 @@
</panel>
</panel>
<panel name="optimize_panel">
- <panel name="optimize_header_panel">
- <text name="optimize_header_text">
+ <panel name="header_panel">
+ <text name="header_text">
モデルを最é©åŒ–
</text>
</panel>
- <text name="optimize_hint">
+ <text name="description">
パフォーマンスをé‡è¦–ã—ã¦ãƒ¢ãƒ‡ãƒ«ã‚’最é©åŒ–ã—ã¾ã—ãŸã€‚å¿…è¦ã«å¿œã˜ã¦èª¿æ•´ã—ã¦ãã ã•ã„。
</text>
- <panel name="optimize_content_panel">
- <text name="generating_lod_label">
- æ¬¡ã®æç”»è©³ç´°åº¦ã‚’ä½œæˆ
- </text>
+ <panel name="content">
<text name="high_detail_text">
æ¬¡ã®æç”»è©³ç´°åº¦ã‚’ä½œæˆï¼šé«˜
</text>
@@ -64,123 +58,64 @@
</text>
</panel>
<panel name="content2">
- <text name="optimize_performance_text">
- パフォーマンス
- </text>
- <text name="optimize_faster_rendering_text">
- レンダリング速度ã®å‘上
-詳細度ã®ä½Žä¸‹
-プリムæ›ç®—ウェイトã®è»½æ¸›
- </text>
- <text name="optimize_accuracy_text">
- 正確ã•
- </text>
- <text name="optimize_slower_rendering_text">
- レンダリング速度ã®ä½Žä¸‹
-詳細化
-プリムæ›ç®—ウェイトã®å¢—加
- </text>
- <text name="accuracy_slider_mark1">
- &apos;
- </text>
- <text name="accuracy_slider_mark2">
- &apos;
- </text>
- <text name="accuracy_slider_mark3">
- &apos;
- </text>
<button label="ジオメトリをå†è¨ˆç®—" name="recalculate_geometry_btn"/>
- <text name="geometry_preview_label">
+ <text name="lod_label">
ジオメトリã®ãƒ—レビュー
</text>
<combo_box name="preview_lod_combo" tool_tip="プレビュー表示㮠LOD 設定">
- <combo_item name="preview_lod_high">
+ <combo_item name="high">
高ã„詳細度
</combo_item>
- <combo_item name="preview_lod_medium">
+ <combo_item name="medium">
中ã®è©³ç´°åº¦
</combo_item>
- <combo_item name="preview_lod_low">
+ <combo_item name="low">
低ã„詳細度
</combo_item>
- <combo_item name="preview_lod_lowest">
+ <combo_item name="lowest">
最低ã®è©³ç´°åº¦
</combo_item>
</combo_box>
</panel>
</panel>
<panel name="physics_panel">
- <panel name="physics_header_panel">
- <text name="physics_header_text">
+ <panel name="header_panel">
+ <text name="header_text">
物ç†ä½œç”¨ã®èª¿æ•´
</text>
</panel>
- <text name="physics_hint">
+ <text name="description">
モデルã®å¤–殻構造ã®ã‚·ã‚§ã‚¤ãƒ—ã¯å¼Šç¤¾ãŒä½œæˆã—ã¾ã™ã€‚モデルã®ç›®çš„ã«å¿œã˜ã¦ã‚·ã‚§ã‚¤ãƒ—ã®è©³ç´°åº¦ã‚’調整ã—ã¦ãã ã•ã„。
</text>
- <panel name="physics_content_panel">
- <text name="physics_performance_text">
- パフォーマンス
- </text>
- <text name="physics_faster_rendering_text">
- レンダリング速度ã®å‘上
-詳細度ã®ä½Žä¸‹
-プリムæ›ç®—ウェイトã®è»½æ¸›
- </text>
- <text name="physics_accuracy_text">
- 正確
- </text>
- <text name="physics_slower_dendering_text">
- レンダリング速度ã®ä½Žä¸‹
-詳細化
-プリムæ›ç®—ウェイトã®å¢—加
- </text>
- <text name="physics_example_1">
- 例:
-å‹•ãオブジェクト
-飛行オブジェクト
-車
- </text>
- <text name="physics_example_2">
- 例:
-å°ã•ãªé™æ­¢ã‚ªãƒ–ジェクト
-比較的詳細度ã®ä½Žã„オブジェクト
-シンプルãªå®¶å…·
- </text>
- <text name="physics_example_3">
- 例:
-陿­¢ã‚ªãƒ–ジェクト
-詳細ãªã‚ªãƒ–ジェクト
-建物
- </text>
+ <panel name="content">
<button label="ç‰©ç†æ¼”算ウェイトをå†è¨ˆç®—" name="recalculate_physics_btn"/>
<button label="å†è¨ˆç®—中..." name="recalculating_physics_btn"/>
- <text name="physics_preview_label">
+ <text name="lod_label">
物ç†ä½œç”¨ã®ãƒ—レビュー
</text>
<combo_box name="preview_lod_combo2" tool_tip="プレビュー表示㮠LOD 設定">
- <combo_item name="preview_lod2_high">
+ <combo_item name="high">
高ã„詳細度
</combo_item>
- <combo_item name="preview_lod2_medium">
+ <combo_item name="medium">
中ã®è©³ç´°åº¦
</combo_item>
- <combo_item name="preview_lod2_low">
+ <combo_item name="low">
低ã„詳細度
</combo_item>
- <combo_item name="preview_lod2_lowest">
+ <combo_item name="lowest">
最低ã®è©³ç´°åº¦
</combo_item>
</combo_box>
</panel>
</panel>
<panel name="review_panel">
- <panel name="review_header_panel">
- <text name="review_header_text">
+ <panel name="header_panel">
+ <text name="header_text">
確èª
</text>
</panel>
- <panel name="review_content_panel">
+ <panel name="content">
<text name="review_prim_equiv">
区画/リージョンã¸ã®è² è·ï¼š[EQUIV] プリムæ›ç®—値
</text>
@@ -193,8 +128,8 @@
</panel>
</panel>
<panel name="upload_panel">
- <panel name="upload_header_panel">
- <text name="upload_header_text">
+ <panel name="header_panel">
+ <text name="header_text">
アップロード完了
</text>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/floater_moveview.xml b/indra/newview/skins/default/xui/ja/floater_moveview.xml
index 57ab32f486..aed3b78a14 100644
--- a/indra/newview/skins/default/xui/ja/floater_moveview.xml
+++ b/indra/newview/skins/default/xui/ja/floater_moveview.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="move_floater">
+<floater name="move_floater" title="歩行 / 走行 / 飛行">
<string name="walk_forward_tooltip">
å‰ã«é€²ã‚€ï¼ˆä¸ŠçŸ¢å°ã‹ W を押ã™ï¼‰
</string>
@@ -58,14 +58,14 @@
飛ã¶
</string>
<panel name="panel_actions">
- <button label="" label_selected="" name="move up btn" tool_tip="上ã«ç§»å‹•(E を押ã™ï¼‰"/>
<button label="" label_selected="" name="turn left btn" tool_tip="左をå‘ã(左矢å°ã‹ A を押ã™ï¼‰"/>
<joystick_slide name="move left btn" tool_tip="å·¦ã«æ­©ã(Shift + 左矢å°ã‹ A を押ã™ï¼‰"/>
- <button label="" label_selected="" name="move down btn" tool_tip="下ã«ç§»å‹•(C を押ã™ï¼‰"/>
<button label="" label_selected="" name="turn right btn" tool_tip="å³ã‚’å‘ã(å³çŸ¢å°ã‹ D を押ã™ï¼‰"/>
<joystick_slide name="move right btn" tool_tip="å³ã«æ­©ã(Shift + å³çŸ¢å°ã‹ D を押ã™ï¼‰"/>
<joystick_turn name="forward btn" tool_tip="å‰ã«é€²ã‚€ï¼ˆä¸ŠçŸ¢å°ã‹ W を押ã™ï¼‰"/>
<joystick_turn name="backward btn" tool_tip="後ã‚ã«æ­©ã(下矢å°ã‹ S を押ã™ï¼‰"/>
+ <button label="" label_selected="" name="move up btn" tool_tip="上ã«ç§»å‹•(E を押ã™ï¼‰"/>
+ <button label="" label_selected="" name="move down btn" tool_tip="下ã«ç§»å‹•(C を押ã™ï¼‰"/>
</panel>
<panel name="panel_modes">
<button label="" name="mode_walk_btn" tool_tip="歩行モード"/>
diff --git a/indra/newview/skins/default/xui/ja/floater_my_appearance.xml b/indra/newview/skins/default/xui/ja/floater_my_appearance.xml
new file mode 100644
index 0000000000..c9a0ecefd7
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/floater_my_appearance.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_my_appearance" title="容姿">
+ <panel label="容姿ã®ç·¨é›†" name="main_panel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_my_inventory.xml b/indra/newview/skins/default/xui/ja/floater_my_inventory.xml
new file mode 100644
index 0000000000..c6a789b63b
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/floater_my_inventory.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_my_inventory" title="æŒã¡ç‰©"/>
diff --git a/indra/newview/skins/default/xui/ja/floater_nearby_chat.xml b/indra/newview/skins/default/xui/ja/floater_nearby_chat.xml
index a29c6a0630..bcddcc6907 100644
--- a/indra/newview/skins/default/xui/ja/floater_nearby_chat.xml
+++ b/indra/newview/skins/default/xui/ja/floater_nearby_chat.xml
@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="nearby_chat" title="è¿‘ãã®ãƒãƒ£ãƒƒãƒˆ">
- <check_box label="ãƒãƒ£ãƒƒãƒˆã‚’翻訳(Google翻訳)" name="translate_chat_checkbox"/>
+ <check_box label="ãƒãƒ£ãƒƒãƒˆã‚’翻訳" name="translate_chat_checkbox"/>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_object_weights.xml b/indra/newview/skins/default/xui/ja/floater_object_weights.xml
new file mode 100644
index 0000000000..3bd9b6b069
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/floater_object_weights.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="object_weights" title="詳ã—ã„設定">
+ <floater.string name="nothing_selected" value="--"/>
+ <text name="selected_text" value="é¸æŠžæ¸ˆ"/>
+ <text name="objects" value="--"/>
+ <text name="objects_label" value="オブジェクト"/>
+ <text name="prims" value="--"/>
+ <text name="prims_label" value="プリム"/>
+ <text name="weights_of_selected_text" value="é¸æŠžæ¸ˆã¿é …ç›®ã®ã‚¦ã‚¨ã‚¤ãƒˆ"/>
+ <text name="download" value="--"/>
+ <text name="download_label" value="ダウンロード"/>
+ <text name="physics" value="--"/>
+ <text name="physics_label" value="物ç†åŠ¹æžœ"/>
+ <text name="server" value="--"/>
+ <text name="server_label" value="サーãƒãƒ¼"/>
+ <text name="display" value="--"/>
+ <text name="display_label" value="ディスプレイ"/>
+ <text name="land_impacts_text" value="土地ã®è² è·"/>
+ <text name="selected" value="--"/>
+ <text name="selected_label" value="é¸æŠžæ¸ˆ"/>
+ <text name="rezzed_on_land" value="--"/>
+ <text name="rezzed_on_land_label" value="土地㫠Rez 済ã¿"/>
+ <text name="remaining_capacity" value="--"/>
+ <text name="remaining_capacity_label" value="残りã®è¨±å®¹æ•°"/>
+ <text name="total_capacity" value="--"/>
+ <text name="total_capacity_label" value="許容åˆè¨ˆ"/>
+ <text name="help_SLURL" value="[secondlife:///app/help/object_weights オブジェクトã®ã‚¦ã‚§ã‚¤ãƒˆã¨ã¯ï¼Ÿ]"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_people.xml b/indra/newview/skins/default/xui/ja/floater_people.xml
new file mode 100644
index 0000000000..08bee88103
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/floater_people.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_people" title="人">
+ <panel_container name="main_panel">
+ <panel label="グループ情報" name="panel_group_info_sidetray"/>
+ <panel label="ブロックã•れãŸä½äººã¨ã‚ªãƒ–ジェクト" name="panel_block_list_sidetray"/>
+ </panel_container>
+</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_picks.xml b/indra/newview/skins/default/xui/ja/floater_picks.xml
new file mode 100644
index 0000000000..359585eb86
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/floater_picks.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_picks" title="ピック"/>
diff --git a/indra/newview/skins/default/xui/ja/floater_places.xml b/indra/newview/skins/default/xui/ja/floater_places.xml
new file mode 100644
index 0000000000..0d167444db
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/floater_places.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_places" title="場所">
+ <panel label="場所" name="main_panel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_snapshot.xml b/indra/newview/skins/default/xui/ja/floater_snapshot.xml
index 05a10f9f6d..cf4732a68e 100644
--- a/indra/newview/skins/default/xui/ja/floater_snapshot.xml
+++ b/indra/newview/skins/default/xui/ja/floater_snapshot.xml
@@ -3,73 +3,63 @@
<floater.string name="unknown">
䏿˜Ž
</floater.string>
- <radio_group label="スナップショットã®ç¨®é¡ž" name="snapshot_type_radio">
- <radio_item label="メール" name="postcard"/>
- <radio_item label="æŒã¡ç‰©ï¼ˆL$[AMOUNT])" name="texture"/>
- <radio_item label="コンピューターã«ä¿å­˜" name="local"/>
- </radio_group>
+ <string name="postcard_progress_str">
+ メールã®é€ä¿¡
+ </string>
+ <string name="profile_progress_str">
+ 投稿
+ </string>
+ <string name="inventory_progress_str">
+ æŒã¡ç‰©ã«ä¿å­˜
+ </string>
+ <string name="local_progress_str">
+ コンピュータã«ä¿å­˜
+ </string>
+ <string name="profile_succeeded_str">
+ ç”»åƒãŒã‚¢ãƒƒãƒ—ロードã•れã¾ã—ãŸ
+ </string>
+ <string name="postcard_succeeded_str">
+ メールãŒé€ä¿¡ã•れã¾ã—ãŸ
+ </string>
+ <string name="inventory_succeeded_str">
+ æŒã¡ç‰©ã«ä¿å­˜ã•れã¾ã—ãŸ
+ </string>
+ <string name="local_succeeded_str">
+ コンピュータã«ä¿å­˜ã•れã¾ã—ãŸ
+ </string>
+ <string name="profile_failed_str">
+ プロフィールフィードã«ç”»åƒã‚’アップロードã§ãã¾ã›ã‚“ã§ã—ãŸã€‚
+ </string>
+ <string name="postcard_failed_str">
+ メールをé€ä¿¡ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚
+ </string>
+ <string name="inventory_failed_str">
+ æŒã¡ç‰©ã«ä¿å­˜ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚
+ </string>
+ <string name="local_failed_str">
+ コンピュータã«ä¿å­˜ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚
+ </string>
+ <button name="advanced_options_btn" tool_tip="詳ã—ã„設定"/>
+ <text name="image_res_text">
+ [WIDTH] x [HEIGHT] px
+ </text>
<text name="file_size_label">
[SIZE] キロãƒã‚¤ãƒˆ
</text>
- <button label="スナップショットを更新" name="new_snapshot_btn"/>
- <button label="é€ä¿¡" name="send_btn"/>
- <button label="ä¿å­˜ï¼ˆL$[AMOUNT])" name="upload_btn"/>
- <flyout_button label="ä¿å­˜" name="save_btn" tool_tip="ç”»åƒã‚’ファイルã«ä¿å­˜">
- <flyout_button.item label="ä¿å­˜" name="save_item"/>
- <flyout_button.item label="別åã§ä¿å­˜..." name="saveas_item"/>
- </flyout_button>
- <button label="詳細" name="more_btn" tool_tip="詳ã—ã„設定"/>
- <button label="簡易" name="less_btn" tool_tip="詳ã—ã„設定"/>
- <button label="å–り消ã—" name="discard_btn"/>
- <text name="type_label2">
- サイズ
- </text>
- <text name="format_label">
- 書å¼
- </text>
- <combo_box label="è§£åƒåº¦" name="postcard_size_combo">
- <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="å°ï¼ˆ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="320x240" name="320x240"/>
- <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="1280x1024" name="1280x1024"/>
- <combo_box.item label="1600x1200" name="1600x1200"/>
- <combo_box.item label="カスタム" name="Custom"/>
- </combo_box>
- <combo_box label="書å¼" name="local_format_combo">
- <combo_box.item label="PNG" name="PNG"/>
- <combo_box.item label="JPEG" name="JPEG"/>
- <combo_box.item label="BMP" name="BMP"/>
- </combo_box>
- <spinner label="å¹…" name="snapshot_width"/>
- <spinner label="高ã•" name="snapshot_height"/>
- <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"/>
- <combo_box.item label="深度" name="Depth"/>
- </combo_box>
- <check_box label="インターフェース" name="ui_check"/>
- <check_box label="HUD" name="hud_check"/>
- <check_box label="ä¿å­˜å¾Œã‚‚ã“ã®ã¾ã¾" name="keep_open_check"/>
- <check_box label="ç”»é¢å…¨ä½“ã‚’é™æ­¢" name="freeze_frame_check"/>
- <check_box label="自動更新" name="auto_snapshot_check"/>
+ <panel name="advanced_options_panel">
+ <text name="advanced_options_label">
+ 詳ã—ã„設定
+ </text>
+ <text name="layer_type_label">
+ キャプãƒãƒ£ï¼š
+ </text>
+ <combo_box label="ç”»åƒãƒ¬ã‚¤ãƒ¤ãƒ¼" name="layer_types">
+ <combo_box.item label="色" name="Colors"/>
+ <combo_box.item label="深度" name="Depth"/>
+ </combo_box>
+ <check_box label="インターフェース" name="ui_check"/>
+ <check_box label="HUD" name="hud_check"/>
+ <check_box label="ç”»é¢å…¨ä½“ã‚’é™æ­¢" name="freeze_frame_check"/>
+ <check_box label="自動更新" name="auto_snapshot_check"/>
+ </panel>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_stats.xml b/indra/newview/skins/default/xui/ja/floater_stats.xml
index 97927776c7..6a1f34cfd8 100644
--- a/indra/newview/skins/default/xui/ja/floater_stats.xml
+++ b/indra/newview/skins/default/xui/ja/floater_stats.xml
@@ -10,8 +10,8 @@
</stat_view>
<stat_view label="アドãƒãƒ³ã‚¹" name="advanced">
<stat_view label="æç”»" name="render">
- <stat_bar label="KTris æç”»" name="ktrisframe"/>
- <stat_bar label="KTris æç”»" name="ktrissec"/>
+ <stat_bar label="フレームã”ã¨ã® KTris æç”»" name="ktrisframe"/>
+ <stat_bar label="ç§’ã”ã¨ã® KTris æç”»" name="ktrissec"/>
<stat_bar label="オブジェクトåˆè¨ˆ" name="objs"/>
<stat_bar label="æ–°è¦ã‚ªãƒ–ジェクト" name="newobjs"/>
</stat_view>
@@ -64,6 +64,14 @@
<stat_bar label="エージェント時間" name="simagentmsec"/>
<stat_bar label="イメージ時間" name="simimagesmsec"/>
<stat_bar label="スクリプト時間" name="simscriptmsec"/>
+ <stat_bar label="余暇" name="simsparemsec"/>
+ <stat_view label="時間ã®è©³ç´°ï¼ˆms)" name="timedetails">
+ <stat_bar label="物ç†åŠ¹æžœã®å˜ä½" name="simsimphysicsstepmsec"/>
+ <stat_bar label="物ç†å½¢çŠ¶ã‚’æ›´æ–°" name="simsimphysicsshapeupdatemsec"/>
+ <stat_bar label="ä»–ã®ç‰©ç†åŠ¹æžœ" name="simsimphysicsothermsec"/>
+ <stat_bar label="スリープ時間" name="simsleepmsec"/>
+ <stat_bar label="ãƒãƒ³ãƒ— I/O" name="simpumpiomsec"/>
+ </stat_view>
</stat_view>
</stat_view>
</container_view>
diff --git a/indra/newview/skins/default/xui/ja/floater_tools.xml b/indra/newview/skins/default/xui/ja/floater_tools.xml
index a8b5febd54..8eddf55a44 100644
--- a/indra/newview/skins/default/xui/ja/floater_tools.xml
+++ b/indra/newview/skins/default/xui/ja/floater_tools.xml
@@ -25,10 +25,10 @@
土地をクリックã—ã€ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦é¸æŠž
</floater.string>
<floater.string name="status_selectcount">
- [OBJ_COUNT] 個ã®ã‚ªãƒ–ジェクト([PRIM_COUNT] 個ã®ãƒ—リム [PE_STRING])ãŒé¸æŠžã•れã¦ã„ã¾ã™
+ é¸æŠžã•れã¦ã„るオブジェクト㯠[OBJ_COUNT] 個ã€åœŸåœ°ã®è² è·ã¯ [LAND_IMPACT]
</floater.string>
- <floater.string name="status_selectprimequiv">
- , [SEL_WEIGHT] プリムæ›ç®—値
+ <floater.string name="status_remaining_capacity">
+ 残りã®è¨±å®¹æ•° [LAND_CAPACITY]。
</floater.string>
<button label="" label_selected="" name="button focus" tool_tip="フォーカス"/>
<button label="" label_selected="" name="button move" tool_tip="å‹•ã‹ã™"/>
@@ -105,8 +105,8 @@
<text name="selection_empty">
ä½•ã‚‚é¸æŠžã•れã¦ã„ã¾ã›ã‚“。
</text>
- <text name="selection_weight">
- ç‰©ç†æ¼”算ウェイト [PHYS_WEIGHT]ã€ãƒ¬ãƒ³ãƒ€ãƒªãƒ³ã‚°ã‚³ã‚¹ãƒˆ [DISP_WEIGHT]。
+ <text name="remaining_capacity">
+ [CAPACITY_STRING] [secondlife:///app/openfloater/object_weights 詳細]
</text>
<tab_container name="Object Info Tabs">
<panel label="一般" name="General">
@@ -325,7 +325,6 @@
縫ã„ç›®ã®ã‚¿ã‚¤ãƒ—
</text>
<combo_box name="sculpt type control">
- <combo_box.item label="(ãªã—)" name="None"/>
<combo_box.item label="çƒä½“" name="Sphere"/>
<combo_box.item label="トーラス" name="Torus"/>
<combo_box.item label="å¹³é¢" name="Plane"/>
diff --git a/indra/newview/skins/default/xui/ja/floater_toybox.xml b/indra/newview/skins/default/xui/ja/floater_toybox.xml
new file mode 100644
index 0000000000..682352ec82
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/floater_toybox.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Toybox" title="ツールãƒãƒ¼ã®ãƒœã‚¿ãƒ³">
+ <text name="toybox label 1">
+ ボタンをツールãƒãƒ¼ã«è¿½åŠ ã¾ãŸã¯å‰Šé™¤ã™ã‚‹ã«ã¯ãƒœã‚¿ãƒ³ã‚’ドラッグã—ã¾ã™ã€‚
+ </text>
+ <text name="toybox label 2">
+ å„ツールãƒãƒ¼ã®è¨­å®šã«å¿œã˜ã¦ã€ãƒœã‚¿ãƒ³ã¯ä»¥ä¸‹ã®ã‚ˆã†ã«è¡¨ç¤ºã•れãŸã‚Šã€ã‚¢ã‚¤ã‚³ãƒ³ã®ã¿ã§è¡¨ç¤ºã•れã¾ã™ã€‚
+ </text>
+ <button label="ツールãƒãƒ¼ã‚’å…¨ã¦ã‚¯ãƒªã‚¢" label_selected="ツールãƒãƒ¼ã‚’å…¨ã¦ã‚¯ãƒªã‚¢" name="btn_clear_all"/>
+ <button label="デフォルト設定を復元" label_selected="デフォルト設定を復元" name="btn_restore_defaults"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_translation_settings.xml b/indra/newview/skins/default/xui/ja/floater_translation_settings.xml
new file mode 100644
index 0000000000..27143086ac
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/floater_translation_settings.xml
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_translation_settings" title="ãƒãƒ£ãƒƒãƒˆã®ç¿»è¨³è¨­å®š">
+ <string name="bing_api_key_not_verified">
+ Bing appID ã‚’èªè¨¼ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。
+ </string>
+ <string name="google_api_key_not_verified">
+ Google API キーをèªè¨¼ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。
+ </string>
+ <string name="bing_api_key_verified">
+ Bing appID ãŒèªè¨¼ã•れã¾ã—ãŸã€‚
+ </string>
+ <string name="google_api_key_verified">
+ Google API キーãŒèªè¨¼ã•れã¾ã—ãŸã€‚
+ </string>
+ <check_box label="ãƒãƒ£ãƒƒãƒˆä¸­ã®æ©Ÿæ¢°ç¿»è¨³æ©Ÿèƒ½ã‚’有効ã«ã™ã‚‹" name="translate_chat_checkbox"/>
+ <text name="translate_language_label">
+ 翻訳ã™ã‚‹è¨€èªžï¼š
+ </text>
+ <combo_box name="translate_language_combo">
+ <combo_box.item label="システム標準" name="System Default Language"/>
+ <combo_box.item label="英語" name="English"/>
+ <combo_box.item label="Dansk(デンマーク語)" name="Danish"/>
+ <combo_box.item label="Deutsch(ドイツ語)" name="German"/>
+ <combo_box.item label="Español(スペイン語)" name="Spanish"/>
+ <combo_box.item label="Français(フランス語)" name="French"/>
+ <combo_box.item label="Italiano(イタリア語)" name="Italian"/>
+ <combo_box.item label="Magyar(ãƒãƒ³ã‚¬ãƒªãƒ¼èªžï¼‰" name="Hungarian"/>
+ <combo_box.item label="Nederlands(オランダ語)" name="Dutch"/>
+ <combo_box.item label="Polski(ãƒãƒ¼ãƒ©ãƒ³ãƒ‰èªžï¼‰" name="Polish"/>
+ <combo_box.item label="Português(ãƒãƒ«ãƒˆã‚¬ãƒ«èªžï¼‰" name="Portugese"/>
+ <combo_box.item label="РуÑÑкий(ロシア語)" name="Russian"/>
+ <combo_box.item label="Türkçe(トルコ語)" name="Turkish"/>
+ <combo_box.item label="УкраїнÑька (ウクライナ語)" name="Ukrainian"/>
+ <combo_box.item label="中文 (正體) (中国語)" name="Chinese"/>
+ <combo_box.item label="日本語(日本語)" name="Japanese"/>
+ <combo_box.item label="한국어(韓国語)" name="Korean"/>
+ </combo_box>
+ <text name="tip">
+ ç¿»è¨³ã‚µãƒ¼ãƒ“ã‚¹ã‚’é¸æŠžã—ã¦ãã ã•ã„:
+ </text>
+ <radio_group name="translation_service_rg">
+ <radio_item initial_value="bing" label="Bing Translator" name="bing"/>
+ <radio_item initial_value="google" label="Google Translate" name="google"/>
+ </radio_group>
+ <text name="bing_api_key_label">
+ Bing AppID [http://www.bing.com/developers/createapp.aspx AppID]:
+ </text>
+ <button label="èªè¨¼" name="verify_bing_api_key_btn"/>
+ <text name="google_api_key_label">
+ Google API key [http://code.google.com/apis/language/translate/v2/getting_started.html#auth API key]:
+ </text>
+ <button label="èªè¨¼" name="verify_google_api_key_btn"/>
+ <text name="google_links_text">
+ [http://code.google.com/apis/language/translate/v2/pricing.html 価格] | [https://code.google.com/apis/console 統計]
+ </text>
+ <button label="OK" name="ok_btn"/>
+ <button label="å–り消ã—" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_voice_controls.xml b/indra/newview/skins/default/xui/ja/floater_voice_controls.xml
index f12648f208..f7d3fd11e0 100644
--- a/indra/newview/skins/default/xui/ja/floater_voice_controls.xml
+++ b/indra/newview/skins/default/xui/ja/floater_voice_controls.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="floater_voice_controls" title="ボイスコントロール">
<string name="title_nearby">
- è¿‘ãã®ãƒœã‚¤ã‚¹
+ ボイス設定
</string>
<string name="title_group">
[GROUP] ã¨ã‚°ãƒ«ãƒ¼ãƒ—コール
@@ -10,7 +10,7 @@
コンファレンスコール
</string>
<string name="title_peer_2_peer">
- [NAME] ã§ã‚³ãƒ¼ãƒ«
+ [NAME] ã¨ã‚³ãƒ¼ãƒ«
</string>
<string name="no_one_near">
è¿‘ãã«ãƒœã‚¤ã‚¹ã‚’有効ã«ã—ã¦ã„る人ã¯ã„ã¾ã›ã‚“。
diff --git a/indra/newview/skins/default/xui/ja/menu_hide_navbar.xml b/indra/newview/skins/default/xui/ja/menu_hide_navbar.xml
index 3a1ae49700..2e633ae1b2 100644
--- a/indra/newview/skins/default/xui/ja/menu_hide_navbar.xml
+++ b/indra/newview/skins/default/xui/ja/menu_hide_navbar.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu name="hide_navbar_menu">
- <menu_item_check label="ナビゲーションãƒãƒ¼ã‚’表示" name="ShowNavbarNavigationPanel"/>
+ <menu_item_check label="ナビゲーションãƒãƒ¼ã¨ãŠæ°—ã«å…¥ã‚Šãƒãƒ¼ã‚’表示" name="ShowNavbarNavigationPanel"/>
<menu_item_check label="ãŠæ°—ã«å…¥ã‚Šãƒãƒ¼ã‚’表示" name="ShowNavbarFavoritesPanel"/>
<menu_item_check label="「場所ã€ã®ãƒŸãƒ‹ãƒ•ィールドを表示" name="ShowMiniLocationPanel"/>
</menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_login.xml b/indra/newview/skins/default/xui/ja/menu_login.xml
index dca872e9b8..4c88f17f3d 100644
--- a/indra/newview/skins/default/xui/ja/menu_login.xml
+++ b/indra/newview/skins/default/xui/ja/menu_login.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu_bar name="Login Menu">
<menu label="ミー" name="File">
- <menu_item_call label="環境設定" name="Preferences..."/>
+ <menu_item_call label="環境設定..." name="Preferences..."/>
<menu_item_call label="[APP_NAME] を終了" name="Quit"/>
</menu>
<menu label="ヘルプ" name="Help">
diff --git a/indra/newview/skins/default/xui/ja/menu_toolbars.xml b/indra/newview/skins/default/xui/ja/menu_toolbars.xml
new file mode 100644
index 0000000000..d5363a5131
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/menu_toolbars.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Toolbars Popup">
+ <menu_item_call label="ã“ã®ãƒœã‚¿ãƒ³ã‚’削除" name="Remove button"/>
+ <menu_item_call label="ツールãƒãƒ¼ã®ãƒœã‚¿ãƒ³..." name="Choose Buttons"/>
+ <menu_item_check label="アイコンã¨ãƒ©ãƒ™ãƒ«" name="icons_with_text"/>
+ <menu_item_check label="アイコンã®ã¿" name="icons_only"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_viewer.xml b/indra/newview/skins/default/xui/ja/menu_viewer.xml
index edce5c50fc..ef3261f1d4 100644
--- a/indra/newview/skins/default/xui/ja/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/ja/menu_viewer.xml
@@ -1,54 +1,60 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu_bar name="Main Menu">
<menu label="ミー" name="Me">
- <menu_item_call label="環境設定" name="Preferences"/>
- <menu_item_call label="マイアカウント" name="Manage My Account">
- <menu_item_call.on_click name="ManageMyAccount_url" parameter="WebLaunchJoinNow,http://secondlife.com/account/index.php?lang=ja"/>
- </menu_item_call>
- <menu_item_call label="L$ ã®è³¼å…¥" name="Buy and Sell L$"/>
- <menu_item_call label="プロフィール" name="Profile"/>
- <menu_item_call label="容姿" name="ChangeOutfit"/>
- <menu_item_check label="æŒã¡ç‰©" name="Inventory"/>
- <menu_item_check label="æŒã¡ç‰©" name="ShowSidetrayInventory"/>
- <menu_item_check label="ジェスãƒãƒ£ãƒ¼" name="Gestures"/>
- <menu_item_check label="マイボイス" name="ShowVoice"/>
+ <menu_item_call label="プロフィール..." name="Profile"/>
+ <menu_item_call label="容姿..." name="ChangeOutfit"/>
+ <menu_item_call label="ã‚¢ãƒã‚¿ãƒ¼ã‚’é¸æŠž..." name="Avatar Picker"/>
+ <menu_item_check label="æŒã¡ç‰©..." name="Inventory"/>
+ <menu_item_call label="æ–°ã—ã„æŒã¡ç‰©ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦" name="NewInventoryWindow"/>
+ <menu_item_call label="場所..." name="Places"/>
+ <menu_item_call label="ピック..." name="Picks"/>
+ <menu_item_call label="カメラコントロール..." name="Camera Controls"/>
<menu label="ムーブメント" name="Movement">
<menu_item_call label="座る" name="Sit Down Here"/>
<menu_item_check label="飛ã¶" name="Fly"/>
<menu_item_check label="常ã«èµ°ã‚‹" name="Always Run"/>
<menu_item_call label="ç§ã®ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã‚’åœæ­¢ã™ã‚‹" name="Stop Animating My Avatar"/>
</menu>
- <menu label="ログイン状態" name="Status">
+ <menu label="ログイン" name="Status">
<menu_item_call label="一時退席中" name="Set Away"/>
<menu_item_call label="å–り込ã¿ä¸­" name="Set Busy"/>
</menu>
<menu_item_call label="管ç†è€…権é™ã®ãƒªã‚¯ã‚¨ã‚¹ãƒˆ" name="Request Admin Options"/>
<menu_item_call label="管ç†è€…ステータス解除" name="Leave Admin Options"/>
+ <menu_item_call label="L$ ã®è³¼å…¥" name="Buy and Sell L$"/>
+ <menu_item_call label="マイアカウント..." name="Manage My Account">
+ <menu_item_call.on_click name="ManageMyAccount_url" parameter="WebLaunchJoinNow,http://secondlife.com/account/index.php?lang=ja"/>
+ </menu_item_call>
+ <menu_item_call label="環境設定..." name="Preferences"/>
+ <menu_item_call label="ツールãƒãƒ¼ã®ãƒœã‚¿ãƒ³..." name="Toolbars"/>
+ <menu_item_call label="å…¨ã¦ã®ã‚³ãƒ³ãƒˆãƒ­ãƒ¼ãƒ«ã‚’éžè¡¨ç¤ºã«ã™ã‚‹" name="Hide UI"/>
<menu_item_call label="[APP_NAME] を終了" name="Quit"/>
</menu>
<menu label="コミュニケーション" name="Communicate">
+ <menu_item_check label="ãƒãƒ£ãƒƒãƒˆ..." name="Nearby Chat"/>
+ <menu_item_check label="話ã™" name="Speak"/>
+ <menu_item_check label="ボイス設定..." name="Nearby Voice"/>
+ <menu_item_check label="ボイスモーフィング..." name="ShowVoice"/>
+ <menu_item_check label="ジェスãƒãƒ£ãƒ¼..." name="Gestures"/>
<menu_item_call label="フレンド" name="My Friends"/>
- <menu_item_call label="所属グループ" name="My Groups"/>
- <menu_item_check label="è¿‘ãã®ãƒãƒ£ãƒƒãƒˆ" name="Nearby Chat"/>
+ <menu_item_call label="グループ" name="My Groups"/>
<menu_item_call label="è¿‘ãã«ã„る人" name="Active Speakers"/>
- <menu_item_check label="è¿‘ãã®ãƒœã‚¤ã‚¹" name="Nearby Voice"/>
</menu>
<menu label="世界" name="World">
- <menu_item_check label="ミニマップ" name="Mini-Map"/>
+ <menu_item_call label="ç¾åœ¨åœ°ã‚’ランドマーク" name="Create Landmark Here"/>
+ <menu_item_call label="行ãå…ˆ..." name="Destinations"/>
<menu_item_check label="世界地図" name="World Map"/>
+ <menu_item_check label="ミニマップ" name="Mini-Map"/>
<menu_item_check label="検索" name="Search"/>
+ <menu_item_call label="ホームã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆ" name="Teleport Home"/>
+ <menu_item_call label="ç¾åœ¨åœ°ã‚’ホームã«è¨­å®š" name="Set Home to Here"/>
<menu_item_call label="スナップショット" name="Take Snapshot"/>
- <menu_item_call label="ç¾åœ¨åœ°ã‚’ランドマーク" name="Create Landmark Here"/>
- <menu label="場所ã®ãƒ—ロフィール" name="Land">
- <menu_item_call label="場所ã®ãƒ—ロフィール" name="Place Profile"/>
- <menu_item_call label="土地情報" name="About Land"/>
- <menu_item_call label="地域 / ä¸å‹•産" name="Region/Estate"/>
- </menu>
+ <menu_item_call label="場所ã®ãƒ—ロフィール" name="Place Profile"/>
+ <menu_item_call label="土地情報" name="About Land"/>
+ <menu_item_call label="地域 / ä¸å‹•産" name="Region/Estate"/>
+ <menu_item_call label="ä¿æœ‰åœ°..." name="My Land"/>
<menu_item_call label="ã“ã®åœŸåœ°ã‚’購入" name="Buy Land"/>
- <menu_item_call label="自分ã®åœŸåœ°" name="My Land"/>
<menu label="表示" name="LandShow">
- <menu_item_check label="移動コントロール" name="Movement Controls"/>
- <menu_item_check label="カメラコントロール" name="Camera Controls"/>
<menu_item_check label="ç«‹å…¥ç¦æ­¢ãƒ©ã‚¤ãƒ³" name="Ban Lines"/>
<menu_item_check label="ビーコン(標識)" name="beacons"/>
<menu_item_check label="プロパティ境界線" name="Property Lines"/>
@@ -57,16 +63,15 @@
<menu_item_check label="区画プロパティ" name="Parcel Properties"/>
<menu_item_check label="アドãƒãƒ³ã‚¹ãƒ¡ãƒ‹ãƒ¥ãƒ¼" name="Show Advanced Menu"/>
</menu>
- <menu_item_call label="ホームã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆ" name="Teleport Home"/>
- <menu_item_call label="ç¾åœ¨åœ°ã‚’ホームã«è¨­å®š" name="Set Home to Here"/>
<menu label="太陽" name="Environment Settings">
<menu_item_call label="æ—¥ã®å‡º" name="Sunrise"/>
<menu_item_call label="æ­£åˆ" name="Noon"/>
<menu_item_call label="日没" name="Sunset"/>
<menu_item_call label="深夜" name="Midnight"/>
+ <menu_item_call label="リージョンã®è¨­å®šã‚’使用" name="Use Region Settings"/>
</menu>
- <menu label="自然環境エディター" name="Enviroment Editor">
- <menu_item_call label="環境ã®è¨­å®š..." name="Enviroment Settings"/>
+ <menu label="自然環境エディター" name="Environment Editor">
+ <menu_item_call label="自然環境ã®è¨­å®š..." name="Environment Settings"/>
<menu label="æ°´ã®äº‹å‰è¨­å®š" name="Water Presets">
<menu_item_call label="æ–°ã—ã„事å‰è¨­å®š..." name="new_water_preset"/>
<menu_item_call label="事å‰è¨­å®šã‚’編集..." name="edit_water_preset"/>
@@ -139,13 +144,14 @@
<menu_item_call label="アニメーション(L$[COST])..." name="Upload Animation"/>
<menu_item_call label="モデル" name="Upload Model"/>
<menu_item_call label="一括 (ファイルã«ã¤ãL$[COST])..." name="Bulk Upload"/>
+ <menu_item_call label="デフォルトã®ã‚¢ãƒƒãƒ—ロード権é™ã‚’設定" name="perm prefs"/>
</menu>
<menu_item_call label="å…ƒã«æˆ»ã™" name="Undo"/>
<menu_item_call label="やり直ã—" name="Redo"/>
</menu>
<menu label="ヘルプ" name="Help">
+ <menu_item_call label="ãƒã‚¦ãƒ„ー..." name="How To"/>
<menu_item_call label="[SECOND_LIFE] ヘルプ" name="Second Life Help"/>
- <menu_item_check label="ヒントを有効ã«ã™ã‚‹" name="Enable Hints"/>
<menu_item_call label="嫌ãŒã‚‰ã›ã‚’報告ã™ã‚‹" name="Report Abuse"/>
<menu_item_call label="ãƒã‚°ã‚’報告ã™ã‚‹" name="Report Bug"/>
<menu_item_call label="[APP_NAME] ã«ã¤ã„ã¦" name="About Second Life"/>
@@ -161,7 +167,7 @@
<menu label="パフォーマンスツール" name="Performance Tools">
<menu_item_call label="ラグ計測器" name="Lag Meter"/>
<menu_item_check label="統計ãƒãƒ¼" name="Statistics Bar"/>
- <menu_item_check label="ã‚¢ãƒã‚¿ãƒ¼ã®ãƒ¬ãƒ³ãƒ€ãƒªãƒ³ã‚°ã‚³ã‚¹ãƒˆã‚’表示ã™ã‚‹" name="Avatar Rendering Cost"/>
+ <menu_item_check label="ã‚¢ãƒã‚¿ãƒ¼ã®æç”»ã‚¦ã‚§ã‚¤ãƒˆã‚’表示" name="Avatar Rendering Cost"/>
</menu>
<menu label="ãƒã‚¤ãƒ©ã‚¤ãƒˆã¨ç›®ã«è¦‹ãˆã‚‹ã‚‚ã®" name="Highlighting and Visibility">
<menu_item_check label="ãƒãƒ¼ã‚¸ãƒ¼ãƒ“ーコン" name="Cheesy Beacon"/>
@@ -199,11 +205,10 @@
<menu_item_check label="Use Plugin Read Thread" name="Use Plugin Read Thread"/>
<menu_item_call label="グループキャッシュã®ã‚¯ãƒªã‚¢" name="ClearGroupCache"/>
<menu_item_check label="マウスã®å¹³æ»‘化" name="Mouse Smoothing"/>
+ <menu_item_call label="リリースキー" name="Release Keys"/>
<menu label="ショートカット" name="Shortcuts">
<menu_item_call label="ç”»åƒ ï¼ˆL$ [COST] )..." name="Upload Image"/>
<menu_item_check label="検索" name="Search"/>
- <menu_item_call label="キーをリリース" name="Release Keys"/>
- <menu_item_call label="UI ã®ã‚µã‚¤ã‚ºã‚’デフォルトã«è¨­å®šã™ã‚‹" name="Set UI Size to Default"/>
<menu_item_check label="アドãƒãƒ³ã‚¹ãƒ¡ãƒ‹ãƒ¥ãƒ¼ã‚’表示 - レガシーã®ã‚·ãƒ§ãƒ¼ãƒˆã‚«ãƒƒãƒˆ" name="Show Advanced Menu - legacy shortcut"/>
<menu_item_call label="ウィンドウを閉ã˜ã‚‹" name="Close Window"/>
<menu_item_call label="å…¨ã¦ã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã‚’é–‰ã˜ã‚‹" name="Close All Windows"/>
@@ -289,6 +294,8 @@
<menu_item_check label="å…‰" name="Lights"/>
<menu_item_check label="骨組ã¿ã®è¡çªåˆ¤å®š" name="Collision Skeleton"/>
<menu_item_check label="レイキャスト" name="Raycast"/>
+ <menu_item_check label="風ã®ãƒ™ã‚¯ãƒˆãƒ«" name="Wind Vectors"/>
+ <menu_item_check label="æç”»ã®è©³ç´°åº¦" name="rendercomplexity"/>
<menu_item_check label="スカルプト" name="Sculpt"/>
</menu>
<menu label="レンダリング" name="Rendering">
@@ -300,7 +307,6 @@
<menu_item_check label="å…‰ã¨å½±" name="Lighting and Shadows"/>
<menu_item_check label="太陽・月・プロジェクタã‹ã‚‰ã®å½±" name="Shadows from Sun/Moon/Projectors"/>
<menu_item_check label="SSAO ã¨å½±ã®å¹³æ»‘化" name="SSAO and Shadow Smoothing"/>
- <menu_item_check label="グローãƒãƒ«ã‚¤ãƒ«ãƒŸãƒãƒ¼ã‚·ãƒ§ãƒ³ï¼ˆè©¦é¨“段階)" name="Global Illumination"/>
<menu_item_check label="GL デãƒãƒƒã‚°" name="Debug GL"/>
<menu_item_check label="経路をデãƒãƒƒã‚°" name="Debug Pipeline"/>
<menu_item_check label="自動アルファマスク(é…延)" name="Automatic Alpha Masks (deferred)"/>
diff --git a/indra/newview/skins/default/xui/ja/notifications.xml b/indra/newview/skins/default/xui/ja/notifications.xml
index c138aeb383..20468c8c2a 100644
--- a/indra/newview/skins/default/xui/ja/notifications.xml
+++ b/indra/newview/skins/default/xui/ja/notifications.xml
@@ -1010,7 +1010,7 @@ L$ ã¯è¿”金ã•れã¾ã›ã‚“。
</form>
</notification>
<notification name="RemoveFromFriends">
- フレンドリストã‹ã‚‰ [NAME] を削除ã—ã¾ã™ã‹ï¼Ÿ
+ フレンドリストã‹ã‚‰ &lt;nolink&gt;[NAME]&lt;/nolink&gt; を削除ã—ã¾ã™ã‹ï¼Ÿ
<usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
</notification>
<notification name="RemoveMultipleFromFriends">
@@ -1144,8 +1144,13 @@ L$ ã¯è¿”金ã•れã¾ã›ã‚“。
-safe オプションを指定ã—ãŸã®ã§ã€
表示設定ã¯ã‚»ãƒ¼ãƒ•レベルã«è¨­å®šã•れã¦ã„ã¾ã™ã€‚
</notification>
- <notification name="DisplaySetToRecommended">
- 表示設定ã¯ã€ã‚ãªãŸã®ã‚·ã‚¹ãƒ†ãƒ æ§‹æˆã«åŸºã¥ã„ã¦æŽ¨å¥¨ã•れãŸãƒ¬ãƒ™ãƒ«ã«è¨­å®šã•れã¦ã„ã¾ã™ã€‚
+ <notification name="DisplaySetToRecommendedGPUChange">
+ グラフィックã®å¤‰æ›´ã«ã‚ˆã‚Šã€ç”»é¢è¨­å®šã¯æŽ¨å¥¨ãƒ¬ãƒ™ãƒ«ã«è¨­å®šã•れã¾ã—ãŸã€‚
+&apos;[LAST_GPU]&apos; ã‹ã‚‰
+&apos;[THIS_GPU]&apos; ã¾ã§
+ </notification>
+ <notification name="DisplaySetToRecommendedFeatureChange">
+ レンダリングサブシステムã®å¤‰æ›´ã«ã‚ˆã‚Šã€ç”»é¢è¨­å®šã¯æŽ¨å¥¨ãƒ¬ãƒ™ãƒ«ã«è¨­å®šã•れã¾ã—ãŸã€‚
</notification>
<notification name="ErrorMessage">
[ERROR_MESSAGE]
@@ -1467,7 +1472,7 @@ http://secondlife.com/download ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンロードã
<usetemplate ignoretext="オブジェクトを所有者ã«è¿”å´ã™ã‚‹å‰ã®ç¢ºèª" name="okcancelignore" notext="å–り消ã—" yestext="OK"/>
</notification>
<notification name="GroupLeaveConfirmMember">
- ç¾åœ¨ã‚ãªãŸã¯ [GROUP] ã®ãƒ¡ãƒ³ãƒãƒ¼ã§ã™ã€‚
+ ç¾åœ¨ã‚ãªãŸã¯ &lt;nolink&gt;[GROUP]&lt;/nolink&gt; ã®ãƒ¡ãƒ³ãƒãƒ¼ã§ã™ã€‚
ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—を抜ã‘ã¾ã™ã‹ï¼Ÿ
<usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
</notification>
@@ -1953,6 +1958,18 @@ Adult 専用リージョンã«å…¥ã‚‹ã«ã¯ã€ä½äººã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆãŒå¹´é½¢ç¢
終了ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚ç¶šã‘ã¾ã™ã‹ï¼Ÿ
<usetemplate ignoretext="終了時ã®ç¢ºèª" name="okcancelignore" notext="終了ã—ãªã„" yestext="終了"/>
</notification>
+ <notification name="ConfirmRestoreToybox">
+ ã“ã®æ“作を実行ã™ã‚‹ã¨ã€ãƒ‡ãƒ•ォルト設定ã®ãƒœã‚¿ãƒ³ã¨ãƒ„ールãƒãƒ¼ãŒå¾©å…ƒã•れã¾ã™ã€‚
+
+ã“ã®æ“作ã¯å…ƒã«æˆ»ã›ã¾ã›ã‚“。
+ <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmClearAllToybox">
+ ã“ã®æ“作ã«ã‚ˆã‚Šã€å…¨ã¦ã®ãƒœã‚¿ãƒ³ã¯ãƒ„ãƒ¼ãƒ«ãƒœãƒƒã‚¯ã‚¹ã«æˆ»ã‚Šã€ãƒ„ールãƒãƒ¼ã¯ç©ºã«ãªã‚Šã¾ã™ã€‚
+
+ã“ã®æ“作ã¯å…ƒã«æˆ»ã›ã¾ã›ã‚“。
+ <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
+ </notification>
<notification name="DeleteItems">
[QUESTION]
<usetemplate ignoretext="アイテムを削除ã™ã‚‹å‰ã®ç¢ºèª" name="okcancelignore" notext="å–り消ã—" yestext="OK"/>
@@ -2161,10 +2178,10 @@ Web ページã«ãƒªãƒ³ã‚¯ã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚¢ã‚¯ã‚»ã
ä»¶å: [SUBJECT]ã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ï¼š [MESSAGE]
</notification>
<notification name="FriendOnline">
- [NAME] ã¯ã‚ªãƒ³ãƒ©ã‚¤ãƒ³ä¸­ã§ã™
+ &lt;nolink&gt;[NAME]&lt;/nolink&gt; ã¯ã‚ªãƒ³ãƒ©ã‚¤ãƒ³ã§ã™
</notification>
<notification name="FriendOffline">
- [NAME] ã¯ã‚ªãƒ•ライン中ã§ã™
+ &lt;nolink&gt;[NAME]&lt;/nolink&gt; ã¯ã‚ªãƒ•ラインã§ã™
</notification>
<notification name="AddSelfFriend">
残念ãªãŒã‚‰è‡ªåˆ†è‡ªèº«ã‚’フレンド登録ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。
@@ -2278,13 +2295,15 @@ Web ページã«ãƒªãƒ³ã‚¯ã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚¢ã‚¯ã‚»ã
ã‚³ãƒ¼ãƒªãƒ³ã‚°ã‚«ãƒ¼ãƒ‰ãŒæ‹’å¦ã•れã¾ã—ãŸã€‚
</notification>
<notification name="TeleportToLandmark">
- ç”»é¢å³ã®ã€Œå ´æ‰€ã€ãƒ‘ãƒãƒ«ã‚’é–‹ã„ã¦ã€ã€Œãƒ©ãƒ³ãƒ‰ãƒžãƒ¼ã‚¯ã€ã‚¿ãƒ–ã‚’é¸ã¶ã¨ã€[NAME] ã¨ã„ã£ãŸå ´æ‰€ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã§ãã¾ã™ã€‚
-好ããªãƒ©ãƒ³ãƒ‰ãƒžãƒ¼ã‚¯ã‚’クリックã—ã¦é¸ã³ã€æ¬¡ã«ãƒ‘ãƒãƒ«ä¸‹ã®ã€Œãƒ†ãƒ¬ãƒãƒ¼ãƒˆã€ã‚’クリックã—ã¾ã™ã€‚
-(ランドマークをダブルクリックã€ã¾ãŸã¯å³ã‚¯ãƒªãƒƒã‚¯ã—ã¦ã€Œãƒ†ãƒ¬ãƒãƒ¼ãƒˆã€ã‚’é¸ã‚“ã§ã‚‚åŒã˜ã§ã™ã€‚)
+ [NAME] ãªã©ã®å ´æ‰€ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã™ã‚‹ã«ã¯ã€ã€Œå ´æ‰€ã€ãƒœã‚¿ãƒ³ã‚’クリックã—ã¦ã‹ã‚‰ã€
+表示ã•れãŸã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã§ã€Œãƒ©ãƒ³ãƒ‰ãƒžãƒ¼ã‚¯ã€ã‚¿ãƒ–ã‚’é¸æŠžã—ã¾ã™ã€‚ランドマークを
+ã„ãšã‚Œã‹ 1 ã¤é¸æŠžã—ã¦ã‹ã‚‰ã€ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ä¸‹éƒ¨ã«ã‚る「テレãƒãƒ¼ãƒˆã€ã‚’クリックã—ã¾ã™ã€‚
+(ã“ã®æ“作ã¯ã€ãƒ©ãƒ³ãƒ‰ãƒžãƒ¼ã‚¯ã‚’ダブルクリックã™ã‚‹ã‹ã€å³ã‚¯ãƒªãƒƒã‚¯ã—ã¦
+「テレãƒãƒ¼ãƒˆã€ã‚’é¸æŠžã—ã¦å®Ÿè¡Œã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚)
</notification>
<notification name="TeleportToPerson">
- ç”»é¢å³ã®ã€Œäººã€ãƒ‘ãƒãƒ«ã‚’é–‹ã„ã¦ã€[NAME] ã¨ã„ã£ãŸä½äººã«é€£çµ¡ã‚’å–ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚
-リストã‹ã‚‰ä½äººã‚’é¸æŠžã—ã¦ã€ãƒ‘ãƒãƒ«ä¸‹ã®ã€ŒIMã€ã‚’クリックã—ã¾ã™ã€‚
+ [NAME] ã®ã‚ˆã†ãªä½äººã«é€£çµ¡ã‚’ã¨ã‚‹ã«ã¯ã€ã€Œäººã€ãƒœã‚¿ãƒ³ã‚’クリックã—ã€è¡¨ç¤ºã•れるウィンドウã§ã€Œä½äººã€ã‚’é¸æŠžã—ã¦ã‹ã‚‰ã€
+ウィンドウ下部ã«ã‚る「IMã€ã‚’クリックã—ã¾ã™ã€‚
(リストã®åå‰ã‚’ダブルクリックã€ã¾ãŸã¯å³ã‚¯ãƒªãƒƒã‚¯ã—ã¦ã€ŒIMã€ã‚’é¸ã‚“ã§ã‚‚åŒã˜ã§ã™ã€‚)
</notification>
<notification name="CantSelectLandFromMultipleRegions">
@@ -2306,6 +2325,9 @@ Web ページã«ãƒªãƒ³ã‚¯ã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚¢ã‚¯ã‚»ã
<notification name="PaymentSent">
[MESSAGE]
</notification>
+ <notification name="PaymentFailure">
+ [MESSAGE]
+ </notification>
<notification name="EventNotification">
イベント通知:
@@ -2561,10 +2583,10 @@ Web ページã«ãƒªãƒ³ã‚¯ã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚¢ã‚¯ã‚»ã
</form>
</notification>
<notification name="FriendshipAccepted">
- [NAME]ã¯ã€ãƒ•レンド登録をå—ã‘入れã¾ã—ãŸã€‚
+ &lt;nolink&gt;[NAME]&lt;/nolink&gt; ã¯ã‚ãªãŸã‹ã‚‰ã®å‹äººç™»éŒ²ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’å—諾ã—ã¾ã—ãŸã€‚
</notification>
<notification name="FriendshipDeclined">
- [NAME]ã¯ã€ãƒ•レンド登録を断りã¾ã—ãŸã€‚
+ &lt;nolink&gt;[NAME]&lt;/nolink&gt; ã¯ã‚ãªãŸã‹ã‚‰ã®å‹äººç™»éŒ²ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’æ‹’å¦ã—ã¾ã—ãŸã€‚
</notification>
<notification name="FriendshipAcceptedByMe">
フレンドã®ç™»éŒ²ä¾é ¼ãŒæ‰¿èªã•れã¾ã—ãŸã€‚
@@ -3041,10 +3063,6 @@ M キーを押ã—ã¦å¤‰æ›´ã—ã¾ã™ã€‚
<button name="cancel" text="å–り消ã—"/>
</form>
</notification>
- <notification label="" name="ModeChange">
- モードを変更ã™ã‚‹ã«ã¯çµ‚了ã—ã¦å†èµ·å‹•ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚
- <usetemplate name="okcancelbuttons" notext="終了ã—ãªã„" yestext="終了"/>
- </notification>
<notification label="" name="NoClassifieds">
クラシファイド広告ã®ä½œæˆã¨ç·¨é›†ã¯ã‚¢ãƒ‰ãƒãƒ³ã‚¹ãƒ¢ãƒ¼ãƒ‰ã§ã®ã¿åˆ©ç”¨ã§ãã¾ã™ã€‚終了ã—ã¦ãƒ¢ãƒ¼ãƒ‰ã‚’変更ã—ã¾ã™ã‹ï¼Ÿãƒ¢ãƒ¼ãƒ‰ã¯ãƒ­ã‚°ã‚¤ãƒ³ç”»é¢ã§é¸æŠžã§ãã¾ã™ã€‚
<usetemplate name="okcancelbuttons" notext="終了ã—ãªã„" yestext="終了"/>
@@ -3089,6 +3107,10 @@ M キーを押ã—ã¦å¤‰æ›´ã—ã¾ã™ã€‚
検索ã¯ã‚¢ãƒ‰ãƒãƒ³ã‚¹ãƒ¢ãƒ¼ãƒ‰ã§ã®ã¿åˆ©ç”¨ã§ãã¾ã™ã€‚ログアウトã—ã¦ãƒ¢ãƒ¼ãƒ‰ã‚’変更ã—ã¾ã™ã‹ï¼Ÿ
<usetemplate name="okcancelbuttons" notext="終了ã—ãªã„" yestext="終了"/>
</notification>
+ <notification label="" name="ConfirmHideUI">
+ ã“ã®æ“作ã«ã‚ˆã‚Šã€å…¨ã¦ã®ãƒ¡ãƒ‹ãƒ¥ãƒ¼é …ç›®ã¨ãƒœã‚¿ãƒ³ãŒéžè¡¨ç¤ºã«ãªã‚Šã¾ã™ã€‚å†ã³è¡¨ç¤ºã™ã‚‹ã«ã¯ [SHORTCUT] ã‚’ã‚‚ã†ä¸€åº¦ã‚¯ãƒªãƒƒã‚¯ã—ã¦ãã ã•ã„。
+ <usetemplate ignoretext="UI ã‚’éžè¡¨ç¤ºã«ã™ã‚‹å‰ã«ç¢ºèª" name="okcancelignore" notext="å–り消ã—" yestext="OK"/>
+ </notification>
<global name="UnsupportedGLRequirements">
[APP_NAME] ã«å¿…è¦ãªãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ãŒãªã„よã†ã§ã™ã€‚ [APP_NAME] ã«ã¯ãƒžãƒ«ãƒãƒ†ã‚¯ã‚¹ãƒãƒ£ã‚’サãƒãƒ¼ãƒˆã™ã‚‹ OpenGL グラフィックカードãŒå¿…è¦ã§ã™ã€‚ ãŠä½¿ã„ã®ã‚°ãƒ©ãƒ•ã‚£ãƒƒã‚¯ã‚«ãƒ¼ãƒ‰ã®æœ€æ–°ãƒ‰ãƒ©ã‚¤ãƒãŒã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•れã¦ã„ã‚‹ã‹ã©ã†ã‹ã€ã‚ªãƒšãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°ã‚·ã‚¹ãƒ†ãƒ ã®ã‚µãƒ¼ãƒ“スパックã¨ãƒ‘ッãƒãŒå…¥ã£ã¦ã„ã‚‹ã‹ã‚’ã”確èªãã ã•ã„。
diff --git a/indra/newview/skins/default/xui/ja/panel_chiclet_bar.xml b/indra/newview/skins/default/xui/ja/panel_chiclet_bar.xml
new file mode 100644
index 0000000000..6717ba9ba3
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_chiclet_bar.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="chiclet_bar">
+ <layout_stack name="toolbar_stack">
+ <layout_panel name="im_well_panel">
+ <chiclet_im_well name="im_well">
+ <button name="Unread IM messages" tool_tip="会話"/>
+ </chiclet_im_well>
+ </layout_panel>
+ <layout_panel name="notification_well_panel">
+ <chiclet_notification name="notification_well">
+ <button name="Unread" tool_tip="通知"/>
+ </chiclet_notification>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_edit_skin.xml b/indra/newview/skins/default/xui/ja/panel_edit_skin.xml
index 2c554dad94..7573132576 100644
--- a/indra/newview/skins/default/xui/ja/panel_edit_skin.xml
+++ b/indra/newview/skins/default/xui/ja/panel_edit_skin.xml
@@ -1,9 +1,9 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_skin_panel">
<panel name="avatar_skin_color_panel">
- <texture_picker label="頭部ã®ã‚¿ãƒˆã‚¥ãƒ¼" name="Head Tattoos" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠž"/>
- <texture_picker label="上部ã®ã‚¿ãƒˆã‚¥ãƒ¼" name="Upper Tattoos" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠž"/>
- <texture_picker label="下部ã®ã‚¿ãƒˆã‚¥ãƒ¼" name="Lower Tattoos" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠž"/>
+ <texture_picker label="é ­" name="Head" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/>
+ <texture_picker label="上åŠèº«" name="Upper Body" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/>
+ <texture_picker label="下åŠèº«" name="Lower Body" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/>
</panel>
<panel name="accordion_panel">
<accordion name="wearable_accordion">
diff --git a/indra/newview/skins/default/xui/ja/panel_me.xml b/indra/newview/skins/default/xui/ja/panel_me.xml
index dda5bc0009..896bbff0ee 100644
--- a/indra/newview/skins/default/xui/ja/panel_me.xml
+++ b/indra/newview/skins/default/xui/ja/panel_me.xml
@@ -1,7 +1,4 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="マイ プロフィール" name="panel_me">
- <tab_container name="tabs">
- <panel label="マイ プロフィール" name="panel_profile"/>
- <panel label="マイ ピック" name="panel_picks"/>
- </tab_container>
+ <panel label="マイ ピック" name="panel_picks"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_my_profile.xml b/indra/newview/skins/default/xui/ja/panel_my_profile.xml
deleted file mode 100644
index a0d99ba5a8..0000000000
--- a/indra/newview/skins/default/xui/ja/panel_my_profile.xml
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="プロフィール" name="panel_profile">
- <string name="CaptionTextAcctInfo">
- [ACCTTYPE]
-[PAYMENTINFO] [AGEVERIFICATION]
- </string>
- <string name="payment_update_link_url">
- http://www.secondlife.com/account/billing.php?lang=ja
- </string>
- <string name="partner_edit_link_url">
- http://www.secondlife.com/account/billing.php?lang=ja
- </string>
- <string name="my_account_link_url" value="http://secondlife.com/account"/>
- <string name="no_partner_text" value="ãªã—"/>
- <string name="no_group_text" value="ãªã—"/>
- <string name="RegisterDateFormat">
- [REG_DATE] ([AGE])
- </string>
- <string name="name_text_args">
- [NAME]
- </string>
- <string name="display_name_text_args">
- [DISPLAY_NAME]
- </string>
- <layout_stack name="layout">
- <layout_panel name="profile_stack">
- <scroll_container name="profile_scroll">
- <panel name="scroll_content_panel">
- <panel name="second_life_image_panel">
- <text name="display_name_descr_text">
- ユーザーå
- </text>
- <text name="name_descr_text">
- 表示å
- </text>
- <button label="プロフィール" name="see_profile_btn" tool_tip="ã“ã®ã‚¢ãƒã‚¿ãƒ¼ã®ãƒ—ロフィールを表示"/>
- </panel>
- </panel>
- </scroll_container>
- </layout_panel>
- </layout_stack>
-</panel>
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 0426c4fe9a..51402b2e00 100644
--- a/indra/newview/skins/default/xui/ja/panel_navigation_bar.xml
+++ b/indra/newview/skins/default/xui/ja/panel_navigation_bar.xml
@@ -1,18 +1,23 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="navigation_bar">
- <panel name="navigation_panel">
- <pull_button name="back_btn" tool_tip="å‰ã®å ´æ‰€ã¸æˆ»ã‚Šã¾ã™"/>
- <pull_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="検索">
- <combo_editor label="[SECOND_LIFE] を検索:" name="search_combo_editor"/>
- </search_combo_box>
- </panel>
- <favorites_bar name="favorite" tool_tip="ランドマークをã“ã“ã«ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦ã€Second Lifeã®ãŠæ°—ã«å…¥ã‚Šã®å ´æ‰€ã«ç´ æ—©ãアクセスï¼">
- <label name="favorites_bar_label" tool_tip="ランドマークをã“ã“ã«ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦ã€Second Lifeã®ãŠæ°—ã«å…¥ã‚Šã®å ´æ‰€ã«ç´ æ—©ãアクセスï¼">
- ãŠæ°—ã«å…¥ã‚Šãƒãƒ¼
- </label>
- <chevron_button name="&gt;&gt;" tool_tip="ãŠæ°—ã«å…¥ã‚Šã‚’ã‚‚ã£ã¨è¡¨ç¤º"/>
- </favorites_bar>
+ <layout_stack name="nvp_stack">
+ <layout_panel name="navigation_layout_panel">
+ <panel name="navigation_panel">
+ <pull_button name="back_btn" tool_tip="å‰ã®å ´æ‰€"/>
+ <pull_button name="forward_btn" tool_tip="次ã®å ´æ‰€"/>
+ <button name="home_btn" tool_tip="「ホームã€ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã—ã¾ã™"/>
+ <location_input label="所在地" name="location_combo"/>
+ </panel>
+ </layout_panel>
+ <layout_panel name="favorites_layout_panel">
+ <favorites_bar name="favorite" tool_tip="ランドマークをã“ã“ã«ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦ã€Second Lifeã®ãŠæ°—ã«å…¥ã‚Šã®å ´æ‰€ã«ç´ æ—©ãアクセスï¼">
+ <label name="favorites_bar_label" tool_tip="ランドマークをã“ã“ã«ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦ã€Second Lifeã®ãŠæ°—ã«å…¥ã‚Šã®å ´æ‰€ã«ç´ æ—©ãアクセスï¼">
+ ãŠæ°—ã«å…¥ã‚Šãƒãƒ¼
+ </label>
+ <more_button name="&gt;&gt;" tool_tip="ãŠæ°—ã«å…¥ã‚Šã‚’ã‚‚ã£ã¨è¡¨ç¤º">
+ 詳細 ▼
+ </more_button>
+ </favorites_bar>
+ </layout_panel>
+ </layout_stack>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_nearby_chat.xml b/indra/newview/skins/default/xui/ja/panel_nearby_chat.xml
new file mode 100644
index 0000000000..aca055bb43
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_nearby_chat.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="nearby_chat">
+ <check_box label="ãƒãƒ£ãƒƒãƒˆã‚’翻訳" name="translate_chat_checkbox"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_notes.xml b/indra/newview/skins/default/xui/ja/panel_notes.xml
deleted file mode 100644
index aa6d823c59..0000000000
--- a/indra/newview/skins/default/xui/ja/panel_notes.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="メモã¨ãƒ—ライãƒã‚·ãƒ¼" name="panel_notes">
- <layout_stack name="layout">
- <layout_panel name="notes_stack">
- <scroll_container name="profile_scroll">
- <panel name="profile_scroll_panel">
- <text name="status_message" value="個人的メモ:"/>
- <text name="status_message2" value="ã“ã®äººã«è¨±å¯ï¼š"/>
- <check_box label="オンライン状態ã®ç¢ºèª" name="status_check"/>
- <check_box label="地図ã§å±…場所を確èª" name="map_check"/>
- <check_box label="ç§ã®ã‚ªãƒ–ジェクトã®ç·¨é›†ãƒ»å‰Šé™¤ãƒ»å–å¾—" name="objects_check"/>
- </panel>
- </scroll_container>
- </layout_panel>
- <layout_panel name="notes_buttons_panel">
- <layout_stack name="bottom_bar_ls">
- <layout_panel name="add_friend_btn_lp">
- <button label="フレンド登録" name="add_friend" tool_tip="フレンド登録を申ã—出ã¾ã™"/>
- </layout_panel>
- <layout_panel name="im_btn_lp">
- <button label="IM" name="im" tool_tip="インスタントメッセージを開ãã¾ã™"/>
- </layout_panel>
- <layout_panel name="call_btn_lp">
- <button label="コール" name="call" tool_tip="ã“ã®ä½äººã«ã‚³ãƒ¼ãƒ«ã™ã‚‹"/>
- </layout_panel>
- <layout_panel name="show_on_map_btn_lp">
- <button label="地図" name="show_on_map_btn" tool_tip="ä½äººã‚’地図上ã§è¡¨ç¤ºã™ã‚‹"/>
- </layout_panel>
- <layout_panel name="teleport_btn_lp">
- <button label="テレãƒãƒ¼ãƒˆ" name="teleport" tool_tip="テレãƒãƒ¼ãƒˆã‚’é€ã‚Šã¾ã™"/>
- </layout_panel>
- </layout_stack>
- </layout_panel>
- </layout_stack>
-</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_postcard_message.xml b/indra/newview/skins/default/xui/ja/panel_postcard_message.xml
new file mode 100644
index 0000000000..b7c3f48557
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_postcard_message.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_postcard_message">
+ <text name="to_label">
+ 終:
+ </text>
+ <text name="name_label">
+ 始:
+ </text>
+ <text name="subject_label">
+ ä»¶å:
+ </text>
+ <line_editor label="ä»¶åã‚’ã“ã“ã«å…¥åŠ›ã—ã¦ãã ã•ã„。" name="subject_form"/>
+ <text name="msg_label">
+ メッセージ:
+ </text>
+ <text_editor name="msg_form">
+ メッセージをã“ã“ã«å…¥åŠ›ã—ã¦ãã ã•ã„。
+ </text_editor>
+ <button label="å–り消ã—" name="cancel_btn"/>
+ <button label="é€ä¿¡" name="send_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_postcard_settings.xml b/indra/newview/skins/default/xui/ja/panel_postcard_settings.xml
new file mode 100644
index 0000000000..314aaef7fd
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_postcard_settings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_postcard_settings">
+ <combo_box label="è§£åƒåº¦" name="postcard_size_combo">
+ <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>
+ <layout_stack name="postcard_image_params_ls">
+ <layout_panel name="postcard_image_size_lp">
+ <spinner label="å¹…" name="postcard_snapshot_width"/>
+ <spinner label="高ã•" name="postcard_snapshot_height"/>
+ <check_box label="縦横比ã®å›ºå®š" name="postcard_keep_aspect_check"/>
+ </layout_panel>
+ <layout_panel name="postcard_image_format_quality_lp">
+ <slider label="画質" name="image_quality_slider"/>
+ <text name="image_quality_level">
+ ([QLVL])
+ </text>
+ </layout_panel>
+ </layout_stack>
+</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 5038140ce5..75bf28a3c8 100644
--- a/indra/newview/skins/default/xui/ja/panel_preferences_chat.xml
+++ b/indra/newview/skins/default/xui/ja/panel_preferences_chat.xml
@@ -29,30 +29,5 @@
<check_box label="IM ãƒãƒ£ãƒƒãƒˆ" name="EnableIMChatPopups" tool_tip="ã“ã‚Œã‚’é¸æŠžã™ã‚‹ã¨ã€ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ãƒˆãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’å—ä¿¡ã—ãŸéš›ã«ãƒãƒƒãƒ—アップãŒè¡¨ç¤ºã•れã¾ã™"/>
<spinner label="è¿‘ãã®ãƒãƒ£ãƒƒãƒˆãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒè¡¨ç¤ºã•れる長ã•:" name="nearby_toasts_lifetime"/>
<spinner label="è¿‘ãã®ãƒãƒ£ãƒƒãƒˆãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒæ¶ˆãˆã‚‹ã¾ã§ã®é•·ã•:" name="nearby_toasts_fadingtime"/>
- <check_box label="Use machine translation while chatting (powered by Google)" name="translate_chat_checkbox"/>
- <text name="translate_chb_label">
- ãƒãƒ£ãƒƒãƒˆä¸­ã«å†…容を機械翻訳ã™ã‚‹ï¼ˆGoogle翻訳)
- </text>
- <text name="translate_language_text">
- 翻訳ã™ã‚‹è¨€èªžï¼š
- </text>
- <combo_box name="translate_language_combobox">
- <combo_box.item label="システム標準" name="System Default Language"/>
- <combo_box.item label="English(英語)" name="English"/>
- <combo_box.item label="Dansk(デンマーク語)" name="Danish"/>
- <combo_box.item label="Deutsch(ドイツ語)" name="German"/>
- <combo_box.item label="Español(スペイン語)" name="Spanish"/>
- <combo_box.item label="Français(フランス語)" name="French"/>
- <combo_box.item label="Italiano(イタリア語)" name="Italian"/>
- <combo_box.item label="Magyar(ãƒãƒ³ã‚¬ãƒªãƒ¼èªžï¼‰" name="Hungarian"/>
- <combo_box.item label="Nederlands(オランダ語)" name="Dutch"/>
- <combo_box.item label="Polski(ãƒãƒ¼ãƒ©ãƒ³ãƒ‰èªžï¼‰" name="Polish"/>
- <combo_box.item label="Português(ãƒãƒ«ãƒˆã‚¬ãƒ«èªžï¼‰" name="Portugese"/>
- <combo_box.item label="РуÑÑкий(ロシア語)" name="Russian"/>
- <combo_box.item label="Türkçe(トルコ語)" name="Turkish"/>
- <combo_box.item label="УкраїнÑька(ウクライナ語)" name="Ukrainian"/>
- <combo_box.item label="中文 (简体)(中国語)" name="Chinese"/>
- <combo_box.item label="日本語" name="Japanese"/>
- <combo_box.item label="한국어(韓国語)" name="Korean"/>
- </combo_box>
+ <button label="ãƒãƒ£ãƒƒãƒˆã®ç¿»è¨³è¨­å®š" name="ok_btn"/>
</panel>
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 e4091972d6..91e1514e49 100644
--- a/indra/newview/skins/default/xui/ja/panel_preferences_general.xml
+++ b/indra/newview/skins/default/xui/ja/panel_preferences_general.xml
@@ -11,10 +11,12 @@
<combo_box.item label="Español (スペイン語) – ベータ" name="Spanish"/>
<combo_box.item label="Français (フランス語) – ベータ" name="French"/>
<combo_box.item label="Italiano (イタリア語) - ベータ" name="Italian"/>
- <combo_box.item label="Nederlands (オランダ語) - ベータ" name="Dutch"/>
<combo_box.item label="Polski (ãƒãƒ¼ãƒ©ãƒ³ãƒ‰èªžï¼‰ - ベータ" name="Polish"/>
<combo_box.item label="Português(ãƒãƒ«ãƒˆã‚¬ãƒ«èªžï¼‰ - ベータ" name="Portugese"/>
+ <combo_box.item label="РуÑÑкий (ロシア語) - ベータ" name="Russian"/>
+ <combo_box.item label="Türkçe (トルコ語) - ベータ" name="Turkish"/>
<combo_box.item label="日本語 – ベータ" name="(Japanese)"/>
+ <combo_box.item label="正體中文(簡体字中国語)- ベータ版" name="Traditional Chinese"/>
</combo_box>
<text name="language_textbox2">
(å†èµ·å‹•後ã«å映)
@@ -49,7 +51,6 @@
<check_box label="グループタイトル" name="show_all_title_checkbox1" tool_tip="オフィサーã¾ãŸã¯ãƒ¡ãƒ³ãƒãƒ¼ãªã©ã€ã‚°ãƒ«ãƒ¼ãƒ—タイトルを表示"/>
<check_box label="フレンドをãƒã‚¤ãƒ©ã‚¤ãƒˆè¡¨ç¤º" name="show_friends" tool_tip="フレンドã®åå‰ã‚’ãƒã‚¤ãƒ©ã‚¤ãƒˆè¡¨ç¤º"/>
<check_box label="表示åを表示" name="display_names_check" tool_tip="ã“ã‚Œã‚’é¸æŠžã™ã‚‹ã¨ã€ãƒãƒ£ãƒƒãƒˆã€IM ãªã©ã§è¡¨ç¤ºåãŒè¡¨ç¤ºã•れã¾ã™ã€‚"/>
- <check_box label="ビューワ㮠UI ヒントを有効ã«ã™ã‚‹" name="viewer_hints_check"/>
<text name="inworld_typing_rg_label">
文字キーを押ã—ã¦æ¬¡ã®æ“作:
</text>
diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_move.xml b/indra/newview/skins/default/xui/ja/panel_preferences_move.xml
index 806bcfc14a..121bebfd52 100644
--- a/indra/newview/skins/default/xui/ja/panel_preferences_move.xml
+++ b/indra/newview/skins/default/xui/ja/panel_preferences_move.xml
@@ -7,18 +7,33 @@
</text>
<check_box label="制作・編集" name="edit_camera_movement" tool_tip="編集モードã®ã‚ªãƒ³ãƒ»ã‚ªãƒ•ã®åˆ‡ã‚Šæ›¿ãˆã«ã€è‡ªå‹•カメラãƒã‚¸ã‚·ãƒ§ãƒ³ã‚’使ã„ã¾ã™"/>
<check_box label="容姿" name="appearance_camera_movement" tool_tip="編集モードã«å…¥ã£ãŸã¨ãã«ã€è‡ªå‹•カメラãƒã‚¸ã‚·ãƒ§ãƒ³ã‚’使ã„ã¾ã™"/>
- <check_box initial_value="true" label="サイドãƒãƒ¼" name="appearance_sidebar_positioning" tool_tip="サイドãƒãƒ¼ã«è‡ªå‹•カメラãƒã‚¸ã‚·ãƒ§ãƒ³ã‚’使ã„ã¾ã™"/>
+ <text name="keyboard_lbl">
+ キーボード:
+ </text>
+ <check_box label="常ã«ã‚­ãƒ¼æ“作ã§å‹•ãよã†ã«ã™ã‚‹" name="arrow_keys_move_avatar_check"/>
+ <check_box label="上矢å°ã‚­ãƒ¼2度押ã—+長押ã—ã§èµ°ã‚‹" name="tap_tap_hold_to_run"/>
+ <text name="mouse_lbl">
+ マウス:
+ </text>
<check_box label="一人称視点ã§è¡¨ç¤ºã™ã‚‹" name="first_person_avatar_visible"/>
<text name=" Mouse Sensitivity">
一人称視点ã®ãƒžã‚¦ã‚¹ã®æ„Ÿåº¦ï¼š
</text>
<check_box label="切り替ãˆ" name="invert_mouse"/>
- <check_box label="常ã«ã‚­ãƒ¼æ“作ã§å‹•ãよã†ã«ã™ã‚‹" name="arrow_keys_move_avatar_check"/>
- <check_box label="上矢å°ã‚­ãƒ¼2度押ã—+長押ã—ã§èµ°ã‚‹" name="tap_tap_hold_to_run"/>
- <check_box label="ãƒ€ãƒ–ãƒ«ã‚¯ãƒªãƒƒã‚¯ã§æ¬¡ã®æ“作:" name="double_click_chkbox"/>
- <radio_group name="double_click_action">
- <radio_item label="テレãƒãƒ¼ãƒˆ" name="radio_teleport"/>
- <radio_item label="自動追跡" name="radio_autopilot"/>
- </radio_group>
+ <text name="single_click_action_lbl">
+ 土地をシングルクリック:
+ </text>
+ <combo_box name="single_click_action_combo">
+ <combo_box.item label="動作ãªã—" name="0"/>
+ <combo_box.item label="クリックã•れãŸåœ°ç‚¹ã«ç§»å‹•" name="1"/>
+ </combo_box>
+ <text name="double_click_action_lbl">
+ 土地をダブルクリック:
+ </text>
+ <combo_box name="double_click_action_combo">
+ <combo_box.item label="動作ãªã—" name="0"/>
+ <combo_box.item label="クリックã•れãŸåœ°ç‚¹ã«ç§»å‹•" name="1"/>
+ <combo_box.item label="クリックã•れãŸåœ°ç‚¹ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆ" name="2"/>
+ </combo_box>
<button label="ãã®ä»–ã®ãƒ‡ã‚£ãƒã‚¤ã‚¹" name="joystick_setup_button"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_setup.xml b/indra/newview/skins/default/xui/ja/panel_preferences_setup.xml
index 7877c0495f..d90a1632ab 100644
--- a/indra/newview/skins/default/xui/ja/panel_preferences_setup.xml
+++ b/indra/newview/skins/default/xui/ja/panel_preferences_setup.xml
@@ -15,7 +15,7 @@
Web:
</text>
<radio_group name="use_external_browser">
- <radio_item label="指定ã®ãƒ–ラウザ(IE ã‚„ Firefox)を使用" name="external" tool_tip="デフォルトã®ã‚·ã‚¹ãƒ†ãƒ  Web ブラウザã§ãƒ˜ãƒ«ãƒ—ã‚„ Web リンク先ãªã©ã‚’見ã¾ã™ã€‚全画é¢ã§èµ·å‹•中ã«ã¯ãŠã™ã™ã‚ã—ã¾ã›ã‚“。" value="1"/>
+ <radio_item label="指定ã®ãƒ–ラウザ(IE ã‚„ Firefox)を使用" name="external" tool_tip="デフォルトã®ã‚·ã‚¹ãƒ†ãƒ  Web ブラウザã§ãƒ˜ãƒ«ãƒ—ã‚„ Web リンク先ãªã©ã‚’見ã¾ã™ã€‚全画é¢ã§èµ·å‹•中ã«ã¯ãŠã™ã™ã‚ã—ã¾ã›ã‚“。" value="true"/>
<radio_item label="内蔵ブラウザを使用" name="internal" tool_tip="内蔵ブラウザã§ãƒ˜ãƒ«ãƒ—ã‚„ Web リンクãªã©ã‚’見ã¾ã™ã€‚[APP_NAME] å†…ã«æ–°ã—ã„ウィンドウã§ã“ã®ãƒ–ラウザãŒé–‹ãã¾ã™ã€‚" value=""/>
</radio_group>
<check_box initial_value="true" label="プラグインを有効ã«ã™ã‚‹" name="browser_plugins_enabled"/>
diff --git a/indra/newview/skins/default/xui/ja/panel_profile.xml b/indra/newview/skins/default/xui/ja/panel_profile.xml
deleted file mode 100644
index 1acad9f81a..0000000000
--- a/indra/newview/skins/default/xui/ja/panel_profile.xml
+++ /dev/null
@@ -1,74 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="プロフィール" name="panel_profile">
- <string name="CaptionTextAcctInfo">
- [ACCTTYPE]
-[PAYMENTINFO] [AGEVERIFICATION]
- </string>
- <string name="payment_update_link_url">
- http://www.secondlife.com/account/billing.php?lang=ja-JP
- </string>
- <string name="partner_edit_link_url">
- http://www.secondlife.com/account/partners.php?lang=ja
- </string>
- <string name="my_account_link_url" value="http://secondlife.com/my/account/index.php?lang=ja-JP"/>
- <string name="no_partner_text" value="ãªã—"/>
- <string name="no_group_text" value="ãªã—"/>
- <string name="RegisterDateFormat">
- [REG_DATE] ([AGE])
- </string>
- <string name="name_text_args">
- [NAME]
- </string>
- <string name="display_name_text_args">
- [DISPLAY_NAME]
- </string>
- <layout_stack name="layout">
- <layout_panel name="profile_stack">
- <scroll_container name="profile_scroll">
- <panel name="profile_scroll_panel">
- <panel name="second_life_image_panel">
- <text name="title_sl_descr_text" value="[SECOND_LIFE]:"/>
- </panel>
- <panel name="first_life_image_panel">
- <text name="title_rw_descr_text" value="ç¾å®Ÿä¸–界:"/>
- </panel>
- <text name="title_member_text" value="ä½äººç™»éŒ²ï¼š"/>
- <text name="title_acc_status_text" value="アカウントã®çŠ¶æ…‹ï¼š"/>
- <text_editor name="acc_status_text">
- ä½äººã€‚ 支払情報未登録。
- リンデン。
- </text_editor>
- <text name="title_partner_text" value="パートナー:"/>
- <panel name="partner_data_panel">
- <text initial_value="(å–得中)" name="partner_text"/>
- </panel>
- <text name="title_groups_text" value="グループ:"/>
- </panel>
- </scroll_container>
- </layout_panel>
- </layout_stack>
- <layout_stack name="layout_verb_buttons">
- <layout_panel name="profile_buttons_panel">
- <layout_stack name="bottom_bar_ls">
- <layout_panel name="add_friend_btn_lp">
- <button label="フレンド登録" name="add_friend" tool_tip="フレンド登録を申ã—出ã¾ã™"/>
- </layout_panel>
- <layout_panel name="im_btn_lp">
- <button label="IM" name="im" tool_tip="インスタントメッセージを開ãã¾ã™"/>
- </layout_panel>
- <layout_panel name="call_btn_lp">
- <button label="コール" name="call" tool_tip="ã“ã®ä½äººã«ã‚³ãƒ¼ãƒ«ã™ã‚‹"/>
- </layout_panel>
- <layout_panel name="chat_btn_lp">
- <button label="テレãƒãƒ¼ãƒˆ" name="teleport" tool_tip="テレãƒãƒ¼ãƒˆã‚’é€ã‚Šã¾ã™"/>
- </layout_panel>
- <layout_panel name="overflow_btn_lp">
- <menu_button label="â–¼" name="overflow_btn" tool_tip="ä½äººã«ãŠé‡‘を渡ã™ã‹æŒã¡ç‰©ã‚’共有ã—ã¾ã™"/>
- </layout_panel>
- </layout_stack>
- </layout_panel>
- <layout_panel name="profile_me_buttons_panel">
- <button label="プロフィールã®ç·¨é›†" name="edit_profile_btn" tool_tip="å€‹äººçš„ãªæƒ…報を編集ã—ã¾ã™"/>
- </layout_panel>
- </layout_stack>
-</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_profile_view.xml b/indra/newview/skins/default/xui/ja/panel_profile_view.xml
deleted file mode 100644
index 5cb6575773..0000000000
--- a/indra/newview/skins/default/xui/ja/panel_profile_view.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="panel_target_profile">
- <string name="status_online">
- オンライン
- </string>
- <string name="status_offline">
- オフライン
- </string>
- <text name="display_name_label" value="表示å:"/>
- <text name="solo_username_label" value="ユーザーå:"/>
- <text name="status" value="オンライン"/>
- <text name="user_name_small" value="Jack oh look at me this is a super duper long name"/>
- <text name="user_name" value="Jack Linden"/>
- <button name="copy_to_clipboard" tool_tip="クリップボードã«ã‚³ãƒ”ー"/>
- <text name="user_label" value="ユーザーå:"/>
- <text name="user_slid" value="jack.linden"/>
- <tab_container name="tabs">
- <panel label="プロフィール" name="panel_profile"/>
- <panel label="ピック" name="panel_picks"/>
- <panel label="メモã¨ãƒ—ライãƒã‚·ãƒ¼" name="panel_notes"/>
- </tab_container>
-</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_snapshot_inventory.xml b/indra/newview/skins/default/xui/ja/panel_snapshot_inventory.xml
new file mode 100644
index 0000000000..46f2b0a3f9
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_snapshot_inventory.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_snapshot_inventory">
+ <text name="title">
+ 「æŒã¡ç‰©ã€ã«ä¿å­˜
+ </text>
+ <text name="hint_lbl">
+ ç”»åƒã‚’æŒã¡ç‰©ã«ä¿å­˜ã™ã‚‹ã«ã¯ L$[UPLOAD_COST] ã®è²»ç”¨ãŒã‹ã‹ã‚Šã¾ã™ã€‚ç”»åƒã‚’テクスãƒãƒ£ã¨ã—ã¦ä¿å­˜ã™ã‚‹ã«ã¯å¹³æ–¹å½¢å¼ã® 1 ã¤ã‚’é¸æŠžã—ã¦ãã ã•ã„。
+ </text>
+ <combo_box label="è§£åƒåº¦" name="texture_size_combo">
+ <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>
+ <spinner label="å¹…" name="inventory_snapshot_width"/>
+ <spinner label="高ã•" name="inventory_snapshot_height"/>
+ <check_box label="縦横比ã®å›ºå®š" name="inventory_keep_aspect_check"/>
+ <button label="å–り消ã—" name="cancel_btn"/>
+ <button label="ä¿å­˜" name="save_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_snapshot_local.xml b/indra/newview/skins/default/xui/ja/panel_snapshot_local.xml
new file mode 100644
index 0000000000..cb658fb6c9
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_snapshot_local.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_snapshot_local">
+ <text name="title">
+ コンピューターã«ä¿å­˜
+ </text>
+ <combo_box label="è§£åƒåº¦" name="local_size_combo">
+ <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"/>
+ <combo_box.item label="1024x768" name="1024x768"/>
+ <combo_box.item label="1280x1024" name="1280x1024"/>
+ <combo_box.item label="1600x1200" name="1600x1200"/>
+ <combo_box.item label="カスタム" name="Custom"/>
+ </combo_box>
+ <layout_stack name="local_image_params_ls">
+ <layout_panel name="local_image_size_lp">
+ <spinner label="å¹…" name="local_snapshot_width"/>
+ <spinner label="高ã•" name="local_snapshot_height"/>
+ <check_box label="縦横比ã®å›ºå®š" name="local_keep_aspect_check"/>
+ </layout_panel>
+ <layout_panel name="local_image_format_quality_lp">
+ <combo_box label="書å¼" name="local_format_combo">
+ <combo_box.item label="PNG(å¯é€†åœ§ç¸®ï¼‰" name="PNG"/>
+ <combo_box.item label="JPEG" name="JPEG"/>
+ <combo_box.item label="BMP(å¯é€†åœ§ç¸®ï¼‰" name="BMP"/>
+ </combo_box>
+ <slider label="画質" name="image_quality_slider"/>
+ <text name="image_quality_level">
+ ([QLVL])
+ </text>
+ </layout_panel>
+ </layout_stack>
+ <button label="å–り消ã—" name="cancel_btn"/>
+ <flyout_button label="ä¿å­˜" name="save_btn" tool_tip="ç”»åƒã‚’ファイルã«ä¿å­˜">
+ <flyout_button.item label="ä¿å­˜" name="save_item"/>
+ <flyout_button.item label="別åã§ä¿å­˜..." name="saveas_item"/>
+ </flyout_button>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_snapshot_options.xml b/indra/newview/skins/default/xui/ja/panel_snapshot_options.xml
new file mode 100644
index 0000000000..cd5b7590ad
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_snapshot_options.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_snapshot_options">
+ <button label="ãƒ—ãƒ­ãƒ•ã‚£ãƒ¼ãƒ«ãƒ•ã‚£ãƒ¼ãƒ‰ã«æŠ•ç¨¿ã™ã‚‹" name="save_to_profile_btn"/>
+ <button label="メール" name="save_to_email_btn"/>
+ <button label="æŒã¡ç‰©ã«ä¿å­˜ï¼ˆL$[Amount])" name="save_to_inventory_btn"/>
+ <button label="コンピューターã«ä¿å­˜" name="save_to_computer_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_snapshot_postcard.xml b/indra/newview/skins/default/xui/ja/panel_snapshot_postcard.xml
new file mode 100644
index 0000000000..1ddd723840
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_snapshot_postcard.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_snapshot_postcard">
+ <string name="default_subject">
+ [SECOND_LIFE] ã‹ã‚‰ã®ãƒã‚¹ãƒˆã‚«ãƒ¼ãƒ‰ã§ã™ã€‚
+ </string>
+ <string name="default_message">
+ ãœã²ã”覧ãã ã•ã„ï¼
+ </string>
+ <string name="upload_message">
+ é€ä¿¡ä¸­...
+ </string>
+ <text name="title">
+ メール
+ </text>
+ <button label="メッセージ" name="message_btn"/>
+ <button label="設定" name="settings_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_snapshot_profile.xml b/indra/newview/skins/default/xui/ja/panel_snapshot_profile.xml
new file mode 100644
index 0000000000..b860a6afe9
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_snapshot_profile.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_snapshot_profile">
+ <text name="title">
+ ãƒ—ãƒ­ãƒ•ã‚£ãƒ¼ãƒ«ãƒ•ã‚£ãƒ¼ãƒ‰ã«æŠ•ç¨¿ã™ã‚‹
+ </text>
+ <combo_box label="è§£åƒåº¦" name="profile_size_combo">
+ <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>
+ <layout_stack name="profile_image_params_ls">
+ <layout_panel name="profile_image_size_lp">
+ <spinner label="å¹…" name="profile_snapshot_width"/>
+ <spinner label="高ã•" name="profile_snapshot_height"/>
+ <check_box label="縦横比ã®å›ºå®š" name="profile_keep_aspect_check"/>
+ </layout_panel>
+ <layout_panel name="profile_image_metadata_lp">
+ <text name="caption_label">
+ キャプション:
+ </text>
+ <check_box initial_value="true" label="場所をå«ã‚€" name="add_location_cb"/>
+ </layout_panel>
+ </layout_stack>
+ <button label="å–り消ã—" name="cancel_btn"/>
+ <button label="投稿" name="post_btn"/>
+</panel>
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 35c1148cc1..4fb876f690 100644
--- a/indra/newview/skins/default/xui/ja/panel_status_bar.xml
+++ b/indra/newview/skins/default/xui/ja/panel_status_bar.xml
@@ -18,11 +18,8 @@
<panel name="balance_bg">
<text name="balance" tool_tip="クリックã—㦠L$ 残高を更新" value="L$20"/>
<button label="L$ ã®è³¼å…¥" name="buyL" tool_tip="クリックã—㦠L$ を購入ã—ã¾ã™"/>
+ <button label="店" name="goShop" tool_tip="Second Life マーケットプレイスを開ã" width="40"/>
</panel>
- <combo_box name="mode_combo" tool_tip="ãƒ¢ãƒ¼ãƒ‰ã‚’é¸æŠžã—ã¾ã™ã€‚ベーシックモードã§ã¯æŽ¢ç´¢ã‚„ãƒãƒ£ãƒƒãƒˆã‚’ã™ã°ã‚„ãç°¡å˜ã«å®Ÿè¡Œã§ãã€ã‚¢ãƒ‰ãƒãƒ³ã‚¹ãƒ¢ãƒ¼ãƒ‰ã§ã¯ã€ã‚ˆã‚Šå¤šãã®æ©Ÿèƒ½ãŒåˆ©ç”¨ã§ãã¾ã™ã€‚">
- <combo_box.item label="ベーシックモード" name="Basic"/>
- <combo_box.item label="アドãƒãƒ³ã‚¹ãƒ¢ãƒ¼ãƒ‰" name="Advanced"/>
- </combo_box>
<text name="TimeText" tool_tip="ç¾åœ¨æ™‚刻(太平洋)">
24:00 AM PST
</text>
diff --git a/indra/newview/skins/default/xui/ja/strings.xml b/indra/newview/skins/default/xui/ja/strings.xml
index 41dc098ba2..c6b033ed95 100644
--- a/indra/newview/skins/default/xui/ja/strings.xml
+++ b/indra/newview/skins/default/xui/ja/strings.xml
@@ -77,10 +77,10 @@
キャッシュファイルを検証ã—ã¦ã„ã¾ã™ï¼ˆæ‰€è¦æ™‚間㯠60 ~ 90 秒)...
</string>
<string name="LoginProcessingResponse">
- 応答を処ç†ã—ã¦ã„ã¾ã™...
+ 対応を処ç†ä¸­ã§ã™...
</string>
<string name="LoginInitializingWorld">
- ãƒ¯ãƒ¼ãƒ«ãƒ‰ã‚’åˆæœŸåŒ–ã—ã¦ã„ã¾ã™...
+ ãƒ¯ãƒ¼ãƒ«ãƒ‰ã‚’åˆæœŸåŒ–中ã§ã™...
</string>
<string name="LoginDecodingImages">
ç”»åƒã‚’デコードã—ã¦ã„ã¾ã™...
@@ -128,7 +128,7 @@
グリッドサーãƒãƒ¼ãŒè¿”ã—ãŸè¨¼æ˜Žæ›¸ã®ç½²åã‚’èªè¨¼ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚グリッドã®ç®¡ç†è€…ã«ãŠå•ã„åˆã‚ã›ãã ã•ã„。
</string>
<string name="LoginFailedNoNetwork">
- ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚¨ãƒ©ãƒ¼ï¼š 接続を確立ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ãŠä½¿ã„ã®ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯æŽ¥ç¶šã‚’ã”確èªãã ã•ã„。
+ ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚¨ãƒ©ãƒ¼ï¼šæŽ¥ç¶šã‚’確立ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ãŠä½¿ã„ã®ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯æŽ¥ç¶šã‚’ã”確èªãã ã•ã„。
</string>
<string name="LoginFailed">
ログインã«å¤±æ•—ã—ã¾ã—ãŸã€‚
@@ -1214,7 +1214,7 @@ support@secondlife.com ã«ãŠå•ã„åˆã‚ã›ãã ã•ã„。
「æŒã¡ç‰©ã€å†…ã«ã“ã®ãƒ†ã‚¯ã‚¹ãƒãƒ£ã®ã‚³ãƒ”ーãŒã‚りã¾ã›ã‚“
</string>
<string name="InventoryInboxNoItems">
- マーケットプレイスã§è³¼å…¥ã—ãŸå•†å“ã¯ã“ã“ã«é…é”ã•れã¾ã™ã€‚
+ 購入ã™ã‚‹ãªã©ã—ã¦å–å¾—ã—ãŸã‚¢ã‚¤ãƒ†ãƒ ã‚„商å“ã¯ã“ã“ã«è¡¨ç¤ºã•ã‚Œã€æŒã¡ç‰©ã®ãƒ•ォルダã«ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦ç§»å‹•ã™ã‚‹ã“ã¨ã‚‚ã§ãれã°ã€è¦ã‚‰ãªããªã£ãŸå ´åˆã«ã¯å‰Šé™¤ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚
</string>
<string name="MarketplaceURL">
http://marketplace.[DOMAIN_NAME]
@@ -1276,6 +1276,9 @@ support@secondlife.com ã«ãŠå•ã„åˆã‚ã›ãã ã•ã„。
<string name="Marketplace Error Internal Import">
エラー:ã“ã®å•†å“ã«é–¢ã—ã¦å•題ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ã—ã°ã‚‰ãã—ã¦ã‹ã‚‰ãŠè©¦ã—ãã ã•ã„。
</string>
+ <string name="Open landmarks">
+ ランドマークを開ã
+ </string>
<string name="no_transfer" value=" (å†è²©ãƒ»ãƒ—レゼントä¸å¯ï¼‰"/>
<string name="no_modify" value=" (編集ä¸å¯ï¼‰"/>
<string name="no_copy" value=" (コピーä¸å¯ï¼‰"/>
@@ -1409,6 +1412,9 @@ support@secondlife.com ã«ãŠå•ã„åˆã‚ã›ãã ã•ã„。
<string name="no_attachments">
ç€ç”¨ã—ã¦ã„るアタッãƒãƒ¡ãƒ³ãƒˆã¯ã‚りã¾ã›ã‚“
</string>
+ <string name="Attachments remain">
+ アタッãƒãƒ¡ãƒ³ãƒˆï¼ˆæ®‹ã‚Šã®ã‚¹ãƒ­ãƒƒãƒˆæ•°ï¼š[COUNT])
+ </string>
<string name="Buy">
è²·ã†
</string>
@@ -1535,6 +1541,12 @@ support@secondlife.com ã«ãŠå•ã„åˆã‚ã›ãã ã•ã„。
<string name="Right Pec">
å³èƒ¸ç­‹
</string>
+ <string name="Neck">
+ 首
+ </string>
+ <string name="Avatar Center">
+ ã‚¢ãƒã‚¿ãƒ¼ã®ä¸­å¤®
+ </string>
<string name="Invalid Attachment">
装ç€å…ˆãŒæ­£ã—ãã‚りã¾ã›ã‚“
</string>
@@ -4027,6 +4039,18 @@ www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンロードã—ã¦ãã ã
<string name="you_paid_ldollars_no_name">
L$ [AMOUNT] を支払ã„ã¾ã—ãŸï¼š[REASON]
</string>
+ <string name="you_paid_failure_ldollars">
+ [NAME] ã« [REASON] ã®ä»£é‡‘ L$ [AMOUNT] を支払ãˆã¾ã›ã‚“ã§ã—ãŸã€‚
+ </string>
+ <string name="you_paid_failure_ldollars_no_info">
+ L$ [AMOUNT] を支払ãˆã¾ã›ã‚“ã§ã—ãŸã€‚
+ </string>
+ <string name="you_paid_failure_ldollars_no_reason">
+ [NAME] ã« L$ [AMOUNT] を支払ãˆã¾ã›ã‚“ã§ã—ãŸã€‚
+ </string>
+ <string name="you_paid_failure_ldollars_no_name">
+ [REASON] 㮠代金 L$ [AMOUNT] を支払ãˆã¾ã›ã‚“ã§ã—ãŸã€‚
+ </string>
<string name="for item">
[ITEM] å‘ã‘
</string>
@@ -4254,8 +4278,8 @@ www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンロードã—ã¦ãã ã
<string name="Female - Wow">
女性 - Wow
</string>
- <string name="/bow1">
- /bow1
+ <string name="/bow">
+ /ãŠã˜ãŽã™ã‚‹
</string>
<string name="/clap">
/æ‹æ‰‹
@@ -4437,6 +4461,12 @@ www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンロードã—ã¦ãã ã
<string name="ExternalEditorFailedToRun">
外部エディターを実行ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚
</string>
+ <string name="TranslationFailed">
+ 翻訳ã§ãã¾ã›ã‚“ã§ã—ãŸï¼š[REASON]
+ </string>
+ <string name="TranslationResponseParseError">
+ 翻訳ã®å¿œç­”ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚
+ </string>
<string name="Esc">
Esc
</string>
@@ -4767,4 +4797,196 @@ www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンロードã—ã¦ãã ã
<string name="ParticleHiding">
パーティクルをéžè¡¨ç¤º
</string>
+ <string name="Command_AboutLand_Label">
+ 土地情報
+ </string>
+ <string name="Command_Appearance_Label">
+ 容姿
+ </string>
+ <string name="Command_Avatar_Label">
+ ã‚¢ãƒã‚¿ãƒ¼
+ </string>
+ <string name="Command_Build_Label">
+ 制作
+ </string>
+ <string name="Command_Chat_Label">
+ ãƒãƒ£ãƒƒãƒˆ
+ </string>
+ <string name="Command_Compass_Label">
+ コンパス
+ </string>
+ <string name="Command_Destinations_Label">
+ 行ãå…ˆ
+ </string>
+ <string name="Command_Gestures_Label">
+ ジェスãƒãƒ£ãƒ¼
+ </string>
+ <string name="Command_HowTo_Label">
+ ãƒã‚¦ãƒ„ー
+ </string>
+ <string name="Command_Inventory_Label">
+ æŒã¡ç‰©
+ </string>
+ <string name="Command_Map_Label">
+ 地図
+ </string>
+ <string name="Command_Marketplace_Label">
+ マーケットプレイス
+ </string>
+ <string name="Command_MiniMap_Label">
+ ミニマップ
+ </string>
+ <string name="Command_Move_Label">
+ 歩行 / 走行 / 飛行
+ </string>
+ <string name="Command_People_Label">
+ 人
+ </string>
+ <string name="Command_Picks_Label">
+ ピック
+ </string>
+ <string name="Command_Places_Label">
+ 場所
+ </string>
+ <string name="Command_Preferences_Label">
+ 環境設定
+ </string>
+ <string name="Command_Profile_Label">
+ プロフィール
+ </string>
+ <string name="Command_Search_Label">
+ 検索
+ </string>
+ <string name="Command_Snapshot_Label">
+ スナップショット
+ </string>
+ <string name="Command_Speak_Label">
+ 話ã™
+ </string>
+ <string name="Command_View_Label">
+ カメラコントロール
+ </string>
+ <string name="Command_Voice_Label">
+ ボイス設定
+ </string>
+ <string name="Command_AboutLand_Tooltip">
+ 訪å•å…ˆã«é–¢ã™ã‚‹æƒ…å ±
+ </string>
+ <string name="Command_Appearance_Tooltip">
+ ã‚¢ãƒã‚¿ãƒ¼ã‚’変更
+ </string>
+ <string name="Command_Avatar_Tooltip">
+ ã‚¢ãƒã‚¿ãƒ¼ä¸€å¼ã‚’é¸æŠž
+ </string>
+ <string name="Command_Build_Tooltip">
+ オブジェクトã®åˆ¶ä½œã¨åœ°å½¢ã®å¤‰å½¢
+ </string>
+ <string name="Command_Chat_Tooltip">
+ è¿‘ãã®äººã¨æ–‡å­—ãƒãƒ£ãƒƒãƒˆã™ã‚‹
+ </string>
+ <string name="Command_Compass_Tooltip">
+ コンパス
+ </string>
+ <string name="Command_Destinations_Tooltip">
+ 行ã£ã¦ã¿ãŸã„場所
+ </string>
+ <string name="Command_Gestures_Tooltip">
+ ã‚¢ãƒã‚¿ãƒ¼ã®ã‚¸ã‚§ã‚¹ãƒãƒ£ãƒ¼
+ </string>
+ <string name="Command_HowTo_Tooltip">
+ 一般的タスクã®å®Ÿè¡Œæ–¹æ³•
+ </string>
+ <string name="Command_Inventory_Tooltip">
+ æŒã¡ç‰©ã‚’表示・使用
+ </string>
+ <string name="Command_Map_Tooltip">
+ 世界地図
+ </string>
+ <string name="Command_Marketplace_Tooltip">
+ ショッピングã«å‡ºæŽ›ã‘ã‚‹
+ </string>
+ <string name="Command_MiniMap_Tooltip">
+ è¿‘ãã®äººã‚’表示ã™ã‚‹
+ </string>
+ <string name="Command_Move_Tooltip">
+ ã‚¢ãƒã‚¿ãƒ¼ã®ç§»å‹•
+ </string>
+ <string name="Command_People_Tooltip">
+ フレンドã€ã‚°ãƒ«ãƒ¼ãƒ—ã€è¿‘ãã®äºº
+ </string>
+ <string name="Command_Picks_Tooltip">
+ プロフィールã§ç´¹ä»‹ã™ã‚‹ãŠæ°—ã«å…¥ã‚Šã®å ´æ‰€
+ </string>
+ <string name="Command_Places_Tooltip">
+ ä¿å­˜æ¸ˆã¿ã®å ´æ‰€
+ </string>
+ <string name="Command_Preferences_Tooltip">
+ 環境設定
+ </string>
+ <string name="Command_Profile_Tooltip">
+ プロフィールを編集・表示
+ </string>
+ <string name="Command_Search_Tooltip">
+ 場所ã€ã‚¤ãƒ™ãƒ³ãƒˆã€äººã‚’検索
+ </string>
+ <string name="Command_Snapshot_Tooltip">
+ ピクãƒãƒ£ã‚’撮る
+ </string>
+ <string name="Command_Speak_Tooltip">
+ マイクを使ã£ã¦è¿‘ãã®äººã¨è©±ã™
+ </string>
+ <string name="Command_View_Tooltip">
+ カメラã®è§’度を変更
+ </string>
+ <string name="Command_Voice_Tooltip">
+ インワールドã§ã®ã‚³ãƒ¼ãƒ«ã‚„è¿‘ãã«ã„る人ã®éŸ³é‡èª¿æ•´
+ </string>
+ <string name="Toolbar_Bottom_Tooltip">
+ ç¾åœ¨ã€ä¸‹ã®ãƒ„ールãƒãƒ¼ã«ã‚りã¾ã™
+ </string>
+ <string name="Toolbar_Left_Tooltip">
+ ç¾åœ¨ã€å·¦ã®ãƒ„ールãƒãƒ¼ã«ã‚りã¾ã™
+ </string>
+ <string name="Toolbar_Right_Tooltip">
+ ç¾åœ¨ã€å³ã®ãƒ„ールãƒãƒ¼ã«ã‚りã¾ã™
+ </string>
+ <string name="Retain%">
+ ç¶­æŒçއ
+ </string>
+ <string name="Detail">
+ 詳細
+ </string>
+ <string name="Better Detail">
+ ã‚‚ã£ã¨è©³ã—ã
+ </string>
+ <string name="Surface">
+ 表é¢
+ </string>
+ <string name="Solid">
+ ソリッド
+ </string>
+ <string name="Wrap">
+ ラップ
+ </string>
+ <string name="Preview">
+ プレビュー
+ </string>
+ <string name="Normal">
+ 普通
+ </string>
+ <string name="snapshot_quality_very_low">
+ éžå¸¸ã«ä½Žã„
+ </string>
+ <string name="snapshot_quality_low">
+ 低
+ </string>
+ <string name="snapshot_quality_medium">
+ 中
+ </string>
+ <string name="snapshot_quality_high">
+ 高
+ </string>
+ <string name="snapshot_quality_very_high">
+ éžå¸¸ã«é«˜ã„
+ </string>
</strings>
diff --git a/indra/newview/skins/default/xui/ja/teleport_strings.xml b/indra/newview/skins/default/xui/ja/teleport_strings.xml
index 2f67d43707..6c69c7a231 100644
--- a/indra/newview/skins/default/xui/ja/teleport_strings.xml
+++ b/indra/newview/skins/default/xui/ja/teleport_strings.xml
@@ -20,6 +20,10 @@
申ã—訳ã”ã–ã„ã¾ã›ã‚“ãŒã€ã‚·ã‚¹ãƒ†ãƒ ã¯ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã®æŽ¥ç¶šã‚’完了ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚
ã‚‚ã†å°‘ã—後ã§ã‚„り直ã—ã¦ãã ã•ã„。
</message>
+ <message name="NoHelpIslandTP">
+ ウェルカムアイランドã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã§æˆ»ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。
+「Welcome Island Publicã€ã«è¡Œãå†åº¦ãƒãƒ¥ãƒ¼ãƒˆãƒªã‚¢ãƒ«ã‚’行ã£ã¦ãã ã•ã„。
+ </message>
<message name="noaccess_tport">
残念ãªãŒã‚‰ã€ãã®ãƒ†ãƒ¬ãƒãƒ¼ãƒˆç›®çš„地ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ãŒã‚りã¾ã›ã‚“。
</message>
diff --git a/indra/newview/skins/default/xui/nl/floater_about.xml b/indra/newview/skins/default/xui/nl/floater_about.xml
deleted file mode 100644
index 4e22d865fe..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_about.xml
+++ /dev/null
@@ -1,81 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_about" title="OVER [CAPITALIZED_APP_NAME]">
- <floater.string name="AboutHeader">
- [APP_NAME] [VIEWER_VERSION_0].[VIEWER_VERSION_1].[VIEWER_VERSION_2] ([VIEWER_VERSION_3]) [BUILD_DATE] [BUILD_TIME] ([CHANNEL])
-[[VIEWER_RELEASE_NOTES_URL] [ReleaseNotes]]
- </floater.string>
- <floater.string name="AboutCompiler">
- Gemaakt met [COMPILER] versie [COMPILER_VERSION]
- </floater.string>
- <floater.string name="AboutPosition">
- U bent op [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1] in [REGION] gelegen op &lt;nolink&gt;[HOSTNAME]&lt;/nolink&gt; ([HOSTIP])
-[SERVER_VERSION]
-[[SERVER_RELEASE_NOTES_URL] [ReleaseNotes]]
- </floater.string>
- <floater.string name="AboutSystem">
- CPU: [CPU]
-Geheugen: [MEMORY_MB] MB
-OS Versie: [OS_VERSION]
-Grafische Kaard Vendor: [GRAPHICS_CARD_VENDOR]
-Grafische Kaard: [GRAPHICS_CARD]
- </floater.string>
- <floater.string name="AboutDriver">
- Windows Grafische Driver Versie: [GRAPHICS_DRIVER_VERSION]
- </floater.string>
- <floater.string name="AboutLibs">
- OpenGL Versie: [OPENGL_VERSION]
-
-libcurl Versie: [LIBCURL_VERSION]
-J2C Decoder Versie: [J2C_VERSION]
-Audio Driver Versie: [AUDIO_DRIVER_VERSION]
-Qt Webkit Versie: [QT_WEBKIT_VERSION]
-Vivox Versie: [VIVOX_VERSION]
- </floater.string>
- <floater.string name="none">
- (none)
- </floater.string>
- <floater.string name="AboutTraffic">
- Pakketten Verloren: [PACKETS_LOST,number,0]/[PACKETS_IN,number,0] ([PACKETS_PCT,number,1]%)
- </floater.string>
- <tab_container name="about_tab">
- <panel label="Info" name="support_panel">
- <button label="Kopiëren naar Klembord" name="copy_btn"/>
- </panel>
- <panel label="Credits" name="credits_panel">
- <text_editor name="credits_editor">
- Second Life wordt u aangeboden door Philip, Tessa, Andrew, Cory, James, Ben, Char, Charlie, Colin, Dan, Daniel, Doug, Eric, Hamlet, Haney, Eve, Hunter, Ian, Jeff, Jennifer, Jim, John, Lee, Mark, Peter, Phoenix, Richard, Robin, Xenon, Steve, Tanya, Eddie, Avi, Frank, Bruce, Aaron, Alice, Bob, Debra, Eileen, Helen, Janet, Louie, Leviathania, Stefan, Ray, Kevin, Tom, Mikeb, MikeT, Burgess, Elena, Tracy, Bill, Todd, Ryan, Zach, Sarah, Nova, Tim, Stephanie, Michael, Evan, Nicolas, Catherine, Rachelle, Dave, Holly, Bub, Kelly, Magellan, Ramzi, Don, Sabin, Jill, Rheya, Jeska, Torley, Kona, Callum, Charity, Ventrella, Jack, Vektor, Iris, Chris, Nicole, Mick, Reuben, Blue, Babbage, Yedwab, Deana, Lauren, Brent, Pathfinder, Chadrick, Altruima, Jesse, Teeny, Monroe, Icculus, David, Tess, Lizzie, Patsy, Isaac, Lawrence, Cyn, Bo, Gia, Annette, Marius, Tbone, Jonathan, Karen, Ginsu, Satoko, Yuko, Makiko, Thomas, Harry, Seth, Alexei, Brian, Guy, Runitai, Ethan, Data, Cornelius, Kenny, Swiss, Zero, Natria, Wendy, Stephen, Teeple, Thumper, Lucy, Dee, Mia, Liana, Warren, Branka, Aura, beez, Milo, Hermia, Red, Thrax, Joe, Sally, Magenta, Mogura, Paul, Jose, Rejean, Henrik, Lexie, Amber, Logan, Xan, Nora, Morpheus, Donovan, Leyla, MichaelFrancis, Beast, Cube, Bucky, Joshua, Stryfe, Harmony, Teresa, Claudia, Walker, Glenn, Fritz, Fordak, June, Cleopetra, Jean, Ivy, Betsy, Roosevelt, Spike, Ken, Which, Tofu, Chiyo, Rob, Zee, dustin, George, Del, Matthew, Cat, Jacqui, Lightfoot, Adrian, Viola, Alfred, Noel, Irfan, Sunil, Yool, Rika, Jane, Xtreme, Frontier, a2, Neo, Siobhan, Yoz, Justin, Elle, Qarl, Benjamin, Isabel, Gulliver, Everett, Christopher, Izzy, Stephany, Garry, Sejong, Sean, Tobin, Iridium, Meta, Anthony, Jeremy, JP, Jake, Maurice, Madhavi, Leopard, Kyle, Joon, Kari, Bert, Belinda, Jon, Kristi, Bridie, Pramod, KJ, Socrates, Maria, Ivan, Aric, Yamasaki, Adreanne, Jay, MitchK, Ceren, Coco, Durl, Jenny, Periapse, Kartic, Storrs, Lotte, Sandy, Rohn, Colossus, Zen, BigPapi, Brad, Pastrami, Kurz, Mani, Neuro, Jaime, MJ, Rowan, Sgt, Elvis, Gecko, Samuel, Sardonyx, Leo, Bryan, Niko, Soft, Poppy, Rachel, Aki, Angelo, Banzai, Alexa, Sue, CeeLo, Bender, CG, Gillian, Pelle, Nick, Echo, Zara, Christine, Shamiran, Emma, Blake, Keiko, Plexus, Joppa, Sidewinder, Erica, Ashlei, Twilight, Kristen, Brett, Q, Enus, Simon, Bevis, Kraft, Kip, Chandler, Ron, LauraP, Ram, KyleJM, Scouse, Prospero, Melissa, Marty, Nat, Hamilton, Kend, Lordan, Jimmy, Kosmo, Seraph, Green, Ekim, Wiggo, JT, Rome, Doris, Miz, Benoc, Whump, Trinity, Patch, Kate, TJ, Bao, Joohwan, Christy, Sofia, Matias, Cogsworth, Johan, Oreh, Cheah, Angela, Brandy, Mango, Lan, Aleks, Gloria, Heidy, Mitchell, Space, Colton, Bambers, Einstein, Maggie, Malbers, Rose, Winnie, Stella, Milton, Rothman, Niall, Marin, Allison, Katie, Dawn, Katt, Dusty, Kalpana, Judy, Andrea, Ambroff, Infinity, Gail, Rico, Raymond, Yi, William, Christa, M, Teagan, Scout, Molly, Dante, Corr, Dynamike, Usi, Kaylee, Vidtuts, Lil, Danica, Sascha, Kelv, Jacob, Nya, Rodney, Brandon, Elsie, Blondin, Grant, Katrin, Nyx, Gabriel, Locklainn, Claire, Devin, Minerva, Monty, Austin, Bradford, Si, Keira, H, Caitlin, Dita, Makai, Jenn, Ann, Meredith, Clare, Joy, Praveen, Cody, Edmund, Ruthe, Sirena, Gayathri, Spider, FJ, Davidoff, Tian, Jennie, Louise, Oskar, Landon, Noelle, Jarv, Ingrid, Al, Sommer, Doc, Aria, Huin, Gray, Lili, Vir, DJ, Yang, T, Simone, Maestro, Scott, Charlene, Quixote, Amanda, Susan, Zed, Anne, Enkidu, Esbee, Joroan, Katelin, Roxie, Tay, Scarlet, Kevin, Johnny, Wolfgang, Andren, Bob, Howard, Merov, Rand, Ray, Michon, Newell, Galen, Dessie, Les, Michon, Jenelle, Geo, Siz, Shapiro, Pete, Calyle, Selene, Allen, Phoebe, Goldin, Kimmora, Dakota, Slaton, Lindquist, Zoey, Hari, Othello, Rohit, Sheldon, Petra, Viale, Gordon, Kaye, Pink, Ferny, Emerson, Davy, Bri, Chan, Juan, Robert, Terrence, Nathan, Carl and many others.
-
-Een &apos;Dank u&apos; voor de volgende bewoners voor het helpen zorgdragen dat dit de beste versie tot nu toe is: able whitman, Adeon Writer, adonaira aabye, Aeron Kohime, Agathos Frascati, Aimee Trescothick, Aleric Inglewood, Alissa Sabre, Aminom Marvin, Angela Talamasca, Aralara Rajal, Armin Weatherwax, Ashrilyn Hayashida, Athanasius Skytower, Aura Dirval, Barney Boomslang, Biancaluce Robbiani, Biker Offcourse, Borg Capalini, Bulli Schumann, catherine pfeffer, Chalice Yao, Corre Porta, Court Goodman, Cummere Mayo, Dale Innis, Darien Caldwell, Darjeeling Schoonhoven, Daten Thielt, dimentox travanti, Dirk Talamasca, Drew Dwi, Duckless Vandyke, Elanthius Flagstaff, Electro Burnstein, emiley tomsen, Escort DeFarge, Eva Rau, Ezian Ecksol, Fire Centaur, Fluf Fredriksson, Francisco Koolhoven, Frontera Thor, Frungi Stastny, Gally Young, gearsawe stonecutter, Gigs Taggart, Gordon Wendt, Gudmund Shepherd, Gypsy Paz, Harleen Gretzky, Henri Beauchamp, Inma Rau, Irene Muni, Aralara Rajal, Aura Dirval, Cayu Cluny, Eva Rau, FreeSL Aeon, Frontera Thor, Inma Rau, Lunita Savira, Minerva Memel, Polo Gufler, Xiki Luik, Iskar Ariantho, Jacek Antonelli, JB Kraft, Jessicka Graves, Joeseph Albanese, Joshua Philgarlic, Khyota Wulluf, kirstenlee Cinquetti, Latif Khalifa, Lex Neva, Lilibeth Andree, Lisa Lowe, Lunita Savira, Loosey Demonia, lum pfohl, Marcos Fonzarelli, MartinRJ Fayray, Marusame Arai, Matthew Dowd, Maya Remblai, McCabe Maxsted, Meghan Dench, Melchoir Tokhes, Menos Short, Michelle2 Zenovka, Mimika Oh, Minerva Memel, Mm Alder, Ochi Wolfe, Omei Turnbull, Pesho Replacement, Phantom Ninetails, phoenixflames kukulcan, Polo Gufler, prez pessoa, princess niven, Prokofy Neva, Qie Niangao, Rem Beattie, RodneyLee Jessop, Saijanai Kuhn, Seg Baphomet, Sergen Davies, Shirley Marquez, SignpostMarv Martin, Sindy Tsure, Sira Arbizu, Skips Jigsaw, Sougent Harrop, Spritely Pixel, Squirrel Wood, StarSong Bright, Subversive Writer, Sugarcult Dagger, Sylumm Grigorovich, Tammy Nowotny, Tanooki Darkes, Tayra Dagostino, Theoretical Chemistry, Thickbrick Sleaford, valerie rosewood, Vex Streeter, Vixen Heron, Whoops Babii, Winter Ventura, Xiki Luik, Yann Dufaux, Yina Yao, Yukinoroh Kamachi, Zolute Infinity, Zwagoth Klaar
-
-
-
-To be a success in business, be daring, be first, be different. --Henry Marchant
- </text_editor>
- </panel>
- <panel label="Licenties" name="licenses_panel">
- <text_editor name="credits_editor">
- 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)
-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.
-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.
-SDL Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga
-SSLeay Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
-xmlrpc-epi Copyright (C) 2000 Epinions, Inc.
-zlib Copyright (C) 1995-2002 Jean-loup Gailly and Mark Adler.
-google-perftools Copyright (c) 2005, Google Inc.
-
-All rights reserved. See licenses.txt for details.
-
-Voice chat Audio coding: Polycom(R) Siren14(TM) (ITU-T Rec. G.722.1 Annex C)
- </text_editor>
- </panel>
- </tab_container>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_about_land.xml b/indra/newview/skins/default/xui/nl/floater_about_land.xml
deleted file mode 100644
index f336e53e05..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_about_land.xml
+++ /dev/null
@@ -1,488 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floaterland" title="OVER LAND">
- <tab_container name="landtab">
- <panel label="Algemeen" name="land_general_panel">
- <text name="Name:">
- Naam:
- </text>
- <text name="Description:">
- Omschrijving:
- </text>
- <text name="LandType">
- Type:
- </text>
- <text name="LandTypeText" left="102">
- Mainland / Homestead
- </text>
- <text name="ContentRating" width="98">
- Inhoudscategorie:
- </text>
- <text name="ContentRatingText" left="102">
- Adult
- </text>
- <text name="Owner:">
- Eigenaar:
- </text>
- <text name="OwnerText" left="102" width="242"/>
- <button label="Profiel" name="Profile..."/>
- <text name="Group:">
- Groep:
- </text>
- <text left="102" name="GroupText" width="242"/>
- <button label="Instellen" name="Set..."/>
- <check_box label="Overdracht aan groep toestaan" name="check deed" tool_tip="Een groepofficier kan dit land aan de groep overdragen, zodat het ondersteund wordt door de landallocatie van de groep."/>
- <button label="Overdragen" name="Deed..." tool_tip="U mag alleen land overdragen indien u een officier bent in de geselecteerde groep."/>
- <check_box label="Eigenaar maakt bijdrage met overdracht" name="check contrib" tool_tip="Wanneer het land is overgedragen aan de groep, draagt de voormalig eigenaar voldoende landtoewijzing bij om het te ondersteunen."/>
- <text name="For Sale:">
- Te koop:
- </text>
- <text name="Not for sale.">
- Niet te koop.
- </text>
- <text name="For Sale: Price L$[PRICE].">
- Prijs: L$[PRICE] (L$[PRICE_PER_SQM]/m²).
- </text>
- <button label="Verkoop land" name="Sell Land..."/>
- <text name="For sale to">
- Te koop voor: [BUYER]
- </text>
- <text name="Sell with landowners objects in parcel.">
- Objecten opgenomen in verkoop
- </text>
- <text name="Selling with no objects in parcel.">
- Objecten niet opgenomen in verkoop
- </text>
- <button label="Annuleer landverkoop" label_selected="Annuleer landverkoop" name="Cancel Land Sale"/>
- <text name="Claimed:">
- Geclaimd:
- </text>
- <text name="DateClaimText">
- Tue Aug 15 13:47:25 2006
- </text>
- <text name="PriceLabel">
- Gebied:
- </text>
- <text name="PriceText">
- 4048 m²
- </text>
- <text name="Traffic:">
- Verkeer:
- </text>
- <text name="DwellText">
- 0
- </text>
- <button left="130" width="125" label="Koop land..." label_selected="Koop land..." name="Buy Land..."/>
- <button label="Koop voor groep" name="Buy For Group..."/>
- <button left="130" width="125" label="Koop toegangspas..." label_selected="Koop toegangspas..." name="Buy Pass..." tool_tip="Een toegangspas geeft u tijdelijk toegang tot dit land."/>
- <button label="Land Afstaan" name="Abandon Land..."/>
- <button label="Land terugvorderen" name="Reclaim Land..."/>
- <button label="Lindenverkoop" name="Linden Sale..." tool_tip="Land moet in bezit zijn, de inhoud moet ingesteld zijn en niet al ter veiling zijn aangeboden."/>
- <panel.string name="new users only">
- Alleen nieuwe gebruikers
- </panel.string>
- <panel.string name="anyone">
- Iedereen
- </panel.string>
- <panel.string name="area_text">
- Gebied
- </panel.string>
- <panel.string name="area_size_text">
- [AREA] m²
- </panel.string>
- <panel.string name="auction_id_text">
- Veiling ID: [ID]
- </panel.string>
- <panel.string name="need_tier_to_modify">
- U dient uw aankoop te goedkeuren voor u dit land kunt wijzigen.
- </panel.string>
- <panel.string name="group_owned_text">
- (Groepseigendom)
- </panel.string>
- <panel.string name="profile_text">
- Profiel...
- </panel.string>
- <panel.string name="info_text">
- Informatie...
- </panel.string>
- <panel.string name="public_text">
- (public)
- </panel.string>
- <panel.string name="none_text">
- (none)
- </panel.string>
- <panel.string name="sale_pending_text">
- (Verkoop bezig)
- </panel.string>
- <panel.string name="no_selection_text">
- Geen perceel geselecteerd. Ga naar Wereld menu &gt; Over land of selecteer een ander perceel om zijn details te tonen.
- </panel.string>
- </panel>
- <panel label="Convenant" name="land_covenant_panel">
- <text name="estate_section_lbl">
- Estate:
- </text>
- <text name="estate_name_lbl">
- Naam:
- </text>
- <text name="estate_name_text">
- mainland
- </text>
- <text name="estate_owner_lbl">
- Eigenaar:
- </text>
- <text name="estate_owner_text">
- (none)
- </text>
- <text_editor name="covenant_editor">
- Er is geen convenant voorzien voor dit estate.
- </text_editor>
- <text name="covenant_timestamp_text">
- Laatst gewijzigd Wed Dec 31 16:00:00 1969
- </text>
- <text name="region_section_lbl">
- Regio:
- </text>
- <text name="region_name_lbl">
- Naam:
- </text>
- <text name="region_name_text">
- leyla
- </text>
- <text name="region_landtype_lbl">
- Type:
- </text>
- <text name="region_landtype_text">
- Mainland / Homestead
- </text>
- <text name="region_maturity_lbl">
- Inhoudscategorie:
- </text>
- <text name="region_maturity_text">
- Adult
- </text>
- <text name="resellable_lbl">
- Doorverkopen:
- </text>
- <text name="resellable_clause">
- Land in deze regio mag niet worden doorverkocht.
- </text>
- <text name="changeable_lbl">
- Opsplitsen:
- </text>
- <text name="changeable_clause">
- Land in deze regio mag niet worden samengevoegd/opgesplitst.
- </text>
- <panel.string name="can_resell">
- Aangekocht land in deze regio mag worden doorverkocht.
- </panel.string>
- <panel.string name="can_not_resell">
- Aangekocht land in deze regio mag niet worden doorverkocht.
- </panel.string>
- <panel.string name="can_change">
- Aangekocht land in deze regio mag worden samengevoegd of
-opgedeeld.
- </panel.string>
- <panel.string name="can_not_change">
- Aangekocht land in deze regio mag niet worden samengevoegd
-of opgedeeld.
- </panel.string>
- </panel>
- <panel label="Objecten" name="land_objects_panel">
- <text name="parcel_object_bonus">
- Regio object bonus factor: [BONUS]
- </text>
- <text name="Simulator primitive usage:">
- Simulator primitieven gebruik:
- </text>
- <text name="objects_available">
- [COUNT] van [MAX] ([AVAILABLE] beschikbaar)
- </text>
- <panel.string name="objects_available_text">
- [COUNT] van [MAX] ([AVAILABLE] beschikbaar)
- </panel.string>
- <panel.string name="objects_deleted_text">
- [COUNT] van [MAX] ([DELETED] zullen worden verwijderd)
- </panel.string>
- <text name="Primitives parcel supports:">
- Primitieven ondersteund door perceel:
- </text>
- <text name="object_contrib_text">
- [COUNT]
- </text>
- <text name="Primitives on parcel:">
- Primitieven op perceel:
- </text>
- <text name="total_objects_text" >
- [COUNT]
- </text>
- <text name="Owned by parcel owner:" >
- Eigendom van perceeleigenaar:
- </text>
- <text name="owner_objects_text" >
- [COUNT]
- </text>
- <button label="Toon" label_selected="Toon" name="ShowOwner"/>
- <button label="Retourneren" name="ReturnOwner..." tool_tip="Retourneer objecten naar hun eigenaren."/>
- <text name="Set to group:" >
- Groep toewijzen:
- </text>
- <text name="group_objects_text" >
- [COUNT]
- </text>
- <button label="Toon" label_selected="Toon" name="ShowGroup"/>
- <button label="Retourneren" name="ReturnGroup..." tool_tip="Retourneer objecten naar hun eigenaren."/>
- <text name="Owned by others:">
- Eigendom van anderen:
- </text>
- <text name="other_objects_text" >
- [COUNT]
- </text>
- <button label="Toon" label_selected="Toon" name="ShowOther"/>
- <button label="Retourneren" name="ReturnOther..." tool_tip="Retourneer objecten naar hun eigenaren."/>
- <text name="Selected / sat upon:">
- Geselecteerd/Er op gezeten
- </text>
- <text name="selected_objects_text" >
- [COUNT]
- </text>
- <text name="Autoreturn">
- Objecten van andere inwoners automatisch retourneren (minuten):
- (0 om uit te schakelen)
- </text>
- <line_editor name="clean other time"/>
- <text name="Object Owners:">
- Objecteigenaren:
- </text>
- <button label="Ververs lijst" label_selected="Ververs lijst" name="Refresh List"/>
- <button label="Retourneer objecten" name="Return objects..."/>
- <name_list name="owner list">
- <column label="Type" name="type"/>
- <column label="Naam" name="name"/>
- <column label="Aantal" name="count"/>
- <column label="Meest recent" name="mostrecent"/>
- </name_list>
- </panel>
- <panel label="Opties" name="land_options_panel">
- <text name="allow_label">
- Andere inwoners toestaan te:
- </text>
- <check_box label="Terrein bewerken" name="edit land check" tool_tip="Indien aangevinkt, kan iedereen uw terrein bewerken. Het is het beste om dit uit te laten staan, omdat u zelf altijd uw eigen land kunt bewerken."/>
- <check_box label="Maak landmarkering" name="check landmark"/>
- <check_box label="Vliegen" name="check fly" tool_tip="Indien aangevinkt, kunnen inwoners op uw land vliegen. Indien niet aangevinkt, kunnen ze alleen het land binnenvliegen of eroverheen vliegen."/>
- <text name="allow_label2">
- Maak objecten:
- </text>
- <check_box label="Alle inwoners" name="edit objects check"/>
- <check_box label="Groep" name="edit group objects check"/>
- <text name="allow_label3">
- Objecten binnenlaten:
- </text>
- <check_box label="Alle inwoners" name="all object entry check"/>
- <check_box label="Groep" name="group object entry check"/>
- <text name="allow_label4">
- Scripts uitvoeren:
- </text>
- <check_box label="Alle inwoners" name="check other scripts"/>
- <check_box label="Groep" name="check group scripts"/>
- <text name="land_options_label">
- Landopties:
- </text>
- <check_box label="Veilig (geen letsel)" name="check safe" tool_tip="Indien aangevinkt, wordt het land op Veilig ingesteld, waarmee letselgevechten worden uitgeschakeld. Indien niet aangevinkt, is letsel ingeschakeld."/>
- <check_box label="Niet duwen" name="PushRestrictCheck" tool_tip="Weerhoudt scripts van duwen. Het aanvinken van deze optie kan handig zijn om storend gedrag op uw land te voorkomen."/>
- <check_box label="Toon plaats in Zoeken (L$30/week) onder" name="ShowDirectoryCheck" tool_tip="Laat mensen dit perceel zien in zoekresultaten."/>
- <panel.string name="search_enabled_tooltip">
- Laat mensen dit perceel zien in zoekresultaten
- </panel.string>
- <panel.string name="search_disabled_small_tooltip">
- Deze optie is uitgeschakeld, omdat dit gebied 128 m² of kleiner is. Alleen grote percelen kunnen worden opgenomen in Zoeken.
- </panel.string>
- <panel.string name="search_disabled_permissions_tooltip">
- Deze optie is uitgeschakeld omdat u de opties van dit perceel niet kunt wijzigen.
- </panel.string>
- <combo_box name="land category with adult">
- <combo_box.item name="item0" label="Alle Categorieën"
- />
- <combo_box.item name="item1" label="Linden locatie"
- />
- <combo_box.item name="item2" label="Adult"
- />
- <combo_box.item name="item3" label="Kunst &amp; Cultuur"
- />
- <combo_box.item name="item4" label="Zakelijk"
- />
- <combo_box.item name="item5" label="Educatief"
- />
- <combo_box.item name="item6" label="Spelen"
- />
- <combo_box.item name="item7" label="Ontmoetingsplaats"
- />
- <combo_box.item name="item8" label="Nieuwkomervriendelijk"
- />
- <combo_box.item name="item9" label="Parken &amp; natuur"
- />
- <combo_box.item name="item10" label="Woongebied"
- />
- <combo_box.item name="item11" label="Winkelen"
- />
- <combo_box.item name="item12" label="Anders"
- />
- </combo_box>
- <combo_box name="land category">
- <combo_box.item name="item0" label="Alle categorieën"
- />
- <combo_box.item name="item1" label="Linden Locatie"
- />
- <combo_box.item name="item3" label="Kunst &amp; Cultuur"
- />
- <combo_box.item name="item4" label="Zakelijk"
- />
- <combo_box.item name="item5" label="Educatief"
- />
- <combo_box.item name="item6" label="Spelen"
- />
- <combo_box.item name="item7" label="Ontmoetingsplaats"
- />
- <combo_box.item name="item8" label="Nieuwkomervriendelijk"
- />
- <combo_box.item name="item9" label="Parken &amp; Natuur"
- />
- <combo_box.item name="item10" label="Woongebied"
- />
- <combo_box.item name="item11" label="Winkelen"
- />
- <combo_box.item name="item12" label="Anders"
- />
- </combo_box>
- <button label="?" label_selected="?" name="?"/>
- <check_box label="Mature inhoud" name="MatureCheck" tool_tip=" "/>
- <panel.string name="mature_check_mature">
- Mature inhoud
- </panel.string>
- <panel.string name="mature_check_adult">
- Adult inhoud
- </panel.string>
- <panel.string name="mature_check_mature_tooltip">
- Uw perceelinformatie of -inhoud wordt beschouwd als mature.
- </panel.string>
- <panel.string name="mature_check_adult_tooltip">
- Uw perceelinformatie of -inhoud wordt beschouwd als adult.
- </panel.string>
- <text name="Snapshot:">
- Foto:
- </text>
- <texture_picker label="" name="snapshot_ctrl" tool_tip="Klik om een afbeelding te kiezen"/>
- <text name="landing_point">
- Landingsplaats: [LANDING]
- </text>
- <panel.string name="landing_point_none">
- (none)
- </panel.string>
- <button label="Instellen" label_selected="Instellen" name="Set" tool_tip="Stelt het landingspunt in waar bezoekers arriveren. Wordt ingesteld op uw avatar&apos;s positie binnen dit perceel."/>
- <button label="Opschonen" label_selected="Opschonen" name="Clear" tool_tip="Landingspunt leegmaken"/>
- <text name="Teleport Routing: ">
- Teleport routering:
- </text>
- <combo_box name="landing type" tool_tip="Teleport routering -- selecteer hoe teleports naar uw land moeten worden afgehandeld.">
- <combo_box.item name="Blocked" label="Geblokkeerd"
- />
- <combo_box.item name="LandingPoint" label="Landingsplaats"
- />
- <combo_box.item name="Anywhere" label="Overal"
- />
- </combo_box>
- <panel.string name="push_restrict_text">
- Niet duwen
- </panel.string>
- <panel.string name="push_restrict_region_text">
- Niet duwen (ingesteld op regio)
- </panel.string>
- </panel>
- <panel label="Media" name="land_media_panel">
- <text name="with media:">
- Media type:
- </text>
- <combo_box name="media type" tool_tip="Specificeer of de URL een film, webpagina of andere media is"/>
- <text name="at URL:">
- Media URL:
- </text>
- <button label="Instellen" name="set_media_url"/>
- <text name="Description:">
- Omschrijving:
- </text>
- <line_editor name="url_description" tool_tip="Tekst wordt naast afspelen/laden knop weergegeven"/>
- <text name="Media texture:">
- Vervang
-textuur:
- </text>
- <texture_picker label="" name="media texture" tool_tip="Klik om een afbeelding te kiezen"/>
- <text name="replace_texture_help">
- (Objecten die deze textuur gebruiken zullen de film
-of de webpagina tonen nadat u het afspelen-pijltje
-hebt geklikt.)
- </text>
- <text name="Options:">
- Media opties:
- </text>
- <check_box label="Automatisch schalen" name="media_auto_scale" tool_tip="Het aanvinken van deze optie zal de inhoud voor dit perceel automatisch schalen. Het kan enigszins trager zijn en de visuele kwaliteit kan iets lager zijn, maar er zal geen andere textuurschaling of uitlijning nodig zijn."/>
- <check_box label="Herhaal media" name="media_loop" tool_tip="Speel media af in een lus. Wanneer de media klaar is met afspelen zal het herstarten vanaf het begin."/>
- <text name="media_size" tool_tip="Grootte om webmedia weer te geven, laat op 0 staan voor standaard." width="120">
- Media grootte:
- </text>
- <spinner left_delta="90" name="media_size_width" tool_tip="Grootte om webmedia weer te geven, laat op 0 staan voor standaard."/>
- <spinner name="media_size_height" tool_tip="Grootte om webmedia weer te geven, laat op 0 staan voor standaard."/>
- <text name="pixels">
- pixels
- </text>
- <text name="MusicURL:">
- Muziek URL:
- </text>
- <text name="Sound:">
- Geluid:
- </text>
- <check_box label="Beperk gebaar- en objectgeluiden tot dit perceel" name="check sound local"/>
- <button label="?" label_selected="?" name="?"/>
- <text name="Voice settings:">
- Voice:
- </text>
- <check_box label="Voice inschakelen" name="parcel_enable_voice_channel"/>
- <check_box label="Voice inschakelen (ingesteld in Estate)" name="parcel_enable_voice_channel_is_estate_disabled"/>
- <check_box label="Beperk voice tot dit perceel" name="parcel_enable_voice_channel_parcel"/>
- </panel>
- <panel label="Toegang" name="land_access_panel">
- <text name="Limit access to this parcel to:">
- Toegang tot dit perceel
- </text>
- <check_box label="Publieke toegang toestaan" name="public_access"/>
- <text name="Only Allow">
- Blokkeer toegang door:
- </text>
- <check_box label="Inwoners die geen betalingsinformatie hebben gegeven aan Linden Lab" name="limit_payment" tool_tip="Verban ongeïdentificeerde inwoners."/>
- <check_box label="Inwoners die geen leeftijdgeverifieerde volwassenen zijn" name="limit_age_verified" tool_tip="Verban inwoners die hun leeftijd niet geverifieerd hebben. Zie support.secondlife.com voor meer informatie."/>
- <panel.string name="estate_override">
- Een of meer van deze opties is op estate-niveau ingesteld
- </panel.string>
- <check_box label="Groepstoegang toestaan: [GROUP]" name="GroupCheck" tool_tip="Stel de groep in op het tabblad Algemeen"/>
- <check_box label="Verkoop toegangspassen aan:" name="PassCheck" tool_tip="Tijdelijke toegang tot dit perceel toestaan"/>
- <combo_box name="pass_combo" left_delta="190">
- <combo_box.item name="Anyone" label="Iedereen"
- />
- <combo_box.item name="Group" label="Groep"
- />
- </combo_box>
- <spinner label="Prijs in L$:" name="PriceSpin" label_width="168" />
- <spinner label="Toegangsuren" name="HoursSpin" label_width="168" />
- <text label="Altijd toestaan" name="AllowedText">
- Toegestane inwoners
- </text>
- <name_list name="AccessList" tool_tip="([LISTED] vermeld, [MAX] max)"/>
- <button label="Toevoegen..." label_selected="Toevoegen..." name="add_allowed"/>
- <button label="Verwijderen" label_selected="Verwijderen" name="remove_allowed"/>
- <text label="Verbannen" name="BanCheck">
- Verbannen inwoners
- </text>
- <name_list name="BannedList" tool_tip="([LISTED] vermeld, [MAX] max)"/>
- <button label="Toevoegen..." label_selected="Toevoegen..." name="add_banned"/>
- <button label="Verwijderen" label_selected="Verwijderen" name="remove_banned"/>
- </panel>
- </tab_container>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_animation_preview.xml b/indra/newview/skins/default/xui/nl/floater_animation_preview.xml
deleted file mode 100644
index f4e9908150..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_animation_preview.xml
+++ /dev/null
@@ -1,85 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Animation Preview" title="">
- <text name="name_label">
- Naam:
- </text>
- <text name="description_label">
- Omschrijving:
- </text>
- <spinner label="Prioriteit" name="priority" tool_tip="Bepaalt welke andere animaties kunnen worden overschaduwd door deze animatie."/>
- <check_box label="Herhalen" name="loop_check" tool_tip="Laat deze animatie herhalen."/>
- <spinner label="In(%)" name="loop_in_point" tool_tip="Instellen punt in de animatie waar de herhaling begint."/>
- <spinner label="Uit(%)" name="loop_out_point" tool_tip="Instellen punt in in de animatie waar de herhaling eindigt."/>
- <text name="hand_label">
- Houding van Hand
- </text>
- <combo_box label="" left_delta="100" width="176" name="hand_pose_combo" tool_tip="Bepaalt wat handen doen tijdens een animatie." left="300">
- <combo_box.item name="Spread" label="Gespreid"/>
- <combo_box.item name="Relaxed" label="Ontspannen"/>
- <combo_box.item name="PointBoth" label="Wijzen Beide"/>
- <combo_box.item name="Fist" label="Vuist"/>
- <combo_box.item name="RelaxedLeft" label="Ontspannen Links"/>
- <combo_box.item name="PointLeft" label="Wijzen Links"/>
- <combo_box.item name="FistLeft" label="Vuist Links"/>
- <combo_box.item name="RelaxedRight" label="Ontspannen Rechts"/>
- <combo_box.item name="PointRight" label="Wijzen Rechts"/>
- <combo_box.item name="FistRight" label="Vuist Rechts"/>
- <combo_box.item name="SaluteRight" label="Salueren Rechts"/>
- <combo_box.item name="Typing" label="Typen"/>
- <combo_box.item name="PeaceRight" label="Peace Rechts"/>
- </combo_box>
- <text name="emote_label">
- Expressie
- </text>
- <combo_box label="" left_delta="100" width="176" name="emote_combo" tool_tip="Bepaalt wat het gezicht doet tijdens de animatie.">
- <combo_box.item name="[None]" label="Geen]"/>
- <combo_box.item name="Aaaaah" label="Aaaaah"/>
- <combo_box.item name="Afraid" label="Bang"/>
- <combo_box.item name="Angry" label="Boos"/>
- <combo_box.item name="BigSmile" label="Brede Lach"/>
- <combo_box.item name="Bored" label="Verveeld"/>
- <combo_box.item name="Cry" label="Huilen"/>
- <combo_box.item name="Disdain" label="Minachting"/>
- <combo_box.item name="Embarrassed" label="Beschaamd"/>
- <combo_box.item name="Frown" label="Frons"/>
- <combo_box.item name="Kiss" label="Kus"/>
- <combo_box.item name="Laugh" label="Lachen"/>
- <combo_box.item name="Plllppt" label="Plllppt"/>
- <combo_box.item name="Repulsed" label="Afkeer"/>
- <combo_box.item name="Sad" label="Verdrietig"/>
- <combo_box.item name="Shrug" label="Onverschillig"/>
- <combo_box.item name="Smile" label="Glimlach"/>
- <combo_box.item name="Surprise" label="Verrassing"/>
- <combo_box.item name="Wink" label="Knipoog"/>
- <combo_box.item name="Worry" label="Bezorgd"/>
- </combo_box>
- <text name="preview_label">
- Voorvertoning
- </text>
- <combo_box label="" left_delta="100" width="176" name="preview_base_anim" tool_tip="Gebruik dit om het gedrag van uw animatie te testen terwijl uw avatar veelvoorkomende acties uitvoert.">
- <combo_box.item name="Standing" label="Staand"/>
- <combo_box.item name="Walking" label="Lopend"/>
- <combo_box.item name="Sitting" label="Zittend"/>
- <combo_box.item name="Flying" label="Vliegend"/>
- </combo_box>
- <spinner label="Invloeitijd (sec)" label_width="125" name="ease_in_time" tool_tip="Hoeveelheid tijd (in seconden) waarover animaties invloeien." width="192"/>
- <spinner bottom_delta="-20" label="Uitvloeitijd (sec)" label_width="125" left="10" name="ease_out_time" tool_tip="Hoeveelheid tijd (in seconden) waarover animaties uitvloeien." width="192"/>
- <button bottom_delta="-32" label="" name="play_btn" tool_tip="Start/pauzeer uw animatie."/>
- <button label="" name="stop_btn" tool_tip="Stop het afspelen van Uw animatie"/>
- <text name="bad_animation_text">
- Niet in staat om het animatiebestand te lezen. Wij
-raden u aan bestanden te gebruiken die vanuit
-Poser 4 zijn geëxporteerd.
- </text>
- <button label="Annuleren" name="cancel_btn"/>
- <button label="Upload (L$[AMOUNT])" name="ok_btn" width="140" left_delta="-155"/>
- <string name="failed_to_initialize">
- Het initialiseren van de beweging is mislukt.
- </string>
- <string name="anim_too_long">
- het animatiebestand heeft een lengte van [LENGTH] seconden. De maximale lengte van een animatie is [MAX_LENGTH] seconden.
- </string>
- <string name="failed_file_read">
- Kan animatiebestand niet lezen. [STATUS]
- </string>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_auction.xml b/indra/newview/skins/default/xui/nl/floater_auction.xml
deleted file mode 100644
index 611024699b..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_auction.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_auction" title="START LINDEN LAND VERKOOP">
- <check_box label="Voeg geel selectie kader toe" name="fence_check"/>
- <button label="Foto" label_selected="Foto" name="snapshot_btn"/>
- <button label="OK" label_selected="OK" name="ok_btn"/>
- <string name="already for sale">
- U kunt geen percelen veilen die al te koop staan.
- </string>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_avatar_picker.xml b/indra/newview/skins/default/xui/nl/floater_avatar_picker.xml
deleted file mode 100644
index 260cc8e98f..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_avatar_picker.xml
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="avatarpicker" title="KIES INWONER">
- <tab_container name="ResidentChooserTabs">
- <panel label="Zoeken" name="SearchPanel">
- <text name="InstructSearchResidentName">
- Type een deel van de naam van de inwoner:
- </text>
- <button label="Zoek" label_selected="Zoek" name="Find"/>
- </panel>
- <panel label="Visitekaartjes" name="CallingCardsPanel">
- <text name="InstructSelectCallingCard">
- Selecteer een visitekaartje:
- </text>
- </panel>
- <panel label="In mijn buurt" name="NearMePanel">
- <text name="InstructSelectResident">
- Selecteer een inwoner
-in de buurt:
- </text>
- <button label="Vernieuw lijst" label_selected="Ververs lijst" name="Refresh"/>
- <slider label="Afstand" name="near_me_range" bottom_delta="-36"/>
- <text name="meters">
- Meters
- </text>
- <scroll_list bottom_delta="-169" height="159" name="NearMe" />
- </panel>
- </tab_container>
- <button label="Selecteer" label_selected="Selecteer" name="Select"/>
- <button label="Annuleren" label_selected="Annuleren" name="Cancel"/>
- <string name="not_found">
- &apos;[TEXT]&apos; niet gevonden
- </string>
- <string name="no_one_near">
- Niemand in de buurt
- </string>
- <string name="no_results">
- Geen resultaten
- </string>
- <string name="searching">
- Zoeken...
- </string>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_avatar_textures.xml b/indra/newview/skins/default/xui/nl/floater_avatar_textures.xml
deleted file mode 100644
index a44db95b5b..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_avatar_textures.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="avatar_texture_debug" title="AVATAR TEXTUREN">
- <text name="baked_label">
- Baked texturen
- </text>
- <text name="composite_label">
- Samengestelde texturen
- </text>
- <texture_picker label="Hoofd" name="baked_head"/>
- <texture_picker label="Make-up" name="head_bodypaint"/>
- <texture_picker label="Haar" name="hair"/>
- <button label="Dump" label_selected="Dump" name="Dump"/>
- <texture_picker label="Ogen" name="baked_eyes"/>
- <texture_picker label="Oog" name="eye_texture"/>
- <texture_picker label="Bovenlichaam" name="baked_upper_body"/>
- <texture_picker label="Bovenlichaam tatoeage" name="upper_bodypaint"/>
- <texture_picker label="Onderhemd" name="undershirt"/>
- <texture_picker label="Handschoenen" name="gloves"/>
- <texture_picker label="Hemd" name="shirt"/>
- <texture_picker label="Bovenkant jas" name="upper_jacket"/>
- <texture_picker label="Onderlichaam" name="baked_lower_body"/>
- <texture_picker label="Onderlichaam tatoeage" name="lower_bodypaint"/>
- <texture_picker label="Onderbroek" name="underpants"/>
- <texture_picker label="Sokken" name="socks"/>
- <texture_picker label="Schoenen" name="shoes"/>
- <texture_picker label="Broek" name="pants"/>
- <texture_picker label="Jas" name="jacket"/>
- <texture_picker label="Rok" name="baked_skirt"/>
- <texture_picker label="Rok" name="skirt_texture"/>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_beacons.xml b/indra/newview/skins/default/xui/nl/floater_beacons.xml
deleted file mode 100644
index ecc485e354..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_beacons.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="beacons" title="BAKENS">
- <panel name="beacons_panel">
- <check_box label="Gescripte objecten met alleen Aanraken" name="touch_only"/>
- <check_box label="Gescripte objecten" name="scripted"/>
- <check_box label="Fysieke objecten" name="physical"/>
- <check_box label="Geluidsbronnen" name="sounds"/>
- <check_box label="Particlebronnen" name="particles"/>
- <check_box label="Markeringen weergeven" name="highlights"/>
- <check_box label="Bakens weergeven" name="beacons"/>
- <text name="beacon_width_label">
- Bakenbreedte:
- </text>
- </panel>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_build_options.xml b/indra/newview/skins/default/xui/nl/floater_build_options.xml
deleted file mode 100644
index 53b60167bb..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_build_options.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="build options floater" title="GRID OPTIES">
- <spinner label="Grid eenheid (meters)" name="GridResolution" width="180" label_width="122"/>
- <spinner label="Grid extensies (meters)" name="GridDrawSize" width="180" label_width="122"/>
- <check_box label="Sub-eenheid snap Inschakelen" name="GridSubUnit"/>
- <check_box label="Toon dwarsdoorsnede" name="GridCrossSection"/>
- <slider label="Grid opaakheid" name="GridOpacity"/>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_bulk_perms.xml b/indra/newview/skins/default/xui/nl/floater_bulk_perms.xml
deleted file mode 100644
index 5374ffc26a..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_bulk_perms.xml
+++ /dev/null
@@ -1,44 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floaterbulkperms" title="BULK WIJZIGEN INHOUD PERMISSIES">
- <text name="applyto">
- Inhoud Typen
- </text>
- <check_box label="Animatie" name="check_animation"/>
- <check_box label="Lichaamsdelen" name="check_bodypart"/>
- <check_box label="Kleding" name="check_clothing"/>
- <check_box label="Gebaren" name="check_gesture"/>
- <check_box label="Landmarkeringen" name="check_landmark"/>
- <check_box label="Notitiekaarten" name="check_notecard"/>
- <check_box label="Objecten" name="check_object"/>
- <check_box label="Scripts" name="check_script"/>
- <check_box label="Geluiden" name="check_sound"/>
- <check_box label="Texturen" name="check_texture"/>
- <button label="Alles aanvinken" label_selected="Alles" name="check_all"/>
- <button label="Alles ontvinken" label_selected="Geen" name="check_none"/>
- <text name="newperms">
- Nieuwe permissies
- </text>
- <check_box label="Delen met groep" name="share_with_group"/>
- <check_box label="Iedereen mag kopiëren" name="everyone_copy"/>
- <text name="NextOwnerLabel">
- Volgende eigenaar kan:
- </text>
- <check_box label="Wijzigen" name="next_owner_modify"/>
- <check_box label="Kopiëren" name="next_owner_copy"/>
- <check_box label="Verkopen/Weggeven" name="next_owner_transfer"/>
- <button label="Help" name="help"/>
- <button label="Toepassen" name="apply"/>
- <button label="Sluiten" name="close"/>
- <string name="nothing_to_modify_text">
- Selectie bevat geen bewerkbare inhoud.
- </string>
- <string name="status_text">
- Permissies instellen op [NAME]
- </string>
- <string name="start_text">
- Starten permissie wijzigings verzoeken...
- </string>
- <string name="done_text">
- Beïndigd permissie wijzigings verzoeken.
- </string>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_bumps.xml b/indra/newview/skins/default/xui/nl/floater_bumps.xml
deleted file mode 100644
index 516b59658d..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_bumps.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_bumps" title="BOTSINGEN, DUWEN &amp; SLAAN">
- <string name="none_detected">
- Geen gedetecteerd
- </string>
- <string name="bump">
- [TIME] [NAME] botste tegen u aan
- </string>
- <string name="llpushobject">
- [TIME] [NAME] duwde u met een script
- </string>
- <string name="selected_object_collide">
- [TIME] [NAME] raakte u met een object
- </string>
- <string name="scripted_object_collide">
- [TIME] [NAME] raakte u met een gescript object
- </string>
- <string name="physical_object_collide">
- [TIME] [NAME] raakte u met een fysiek object
- </string>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_buy_contents.xml b/indra/newview/skins/default/xui/nl/floater_buy_contents.xml
deleted file mode 100644
index 4c0ff7d04a..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_buy_contents.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_buy_contents" title="KOOP INHOUD">
- <text name="contains_text">
- [NAME] bevat:
- </text>
- <text name="buy_text">
- Koop voor L$[AMOUNT] van [NAME]?
- </text>
- <button label="Annuleren" label_selected="Annuleren" name="cancel_btn" width="73"/>
- <button label="Koop" label_selected="Koop" name="buy_btn"/>
- <check_box label="Draag kleding nu" name="wear_check"/>
- <string name="no_copy_text">
- (niet kopiëren)
- </string>
- <string name="no_modify_text">
- (niet wijzigen)
- </string>
- <string name="no_transfer_text">
- (niet overdragen)
- </string>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_buy_currency.xml b/indra/newview/skins/default/xui/nl/floater_buy_currency.xml
deleted file mode 100644
index 6ee5cc5341..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_buy_currency.xml
+++ /dev/null
@@ -1,68 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="buy currency" title="KOOP VALUTA">
- <text name="info_buying">
- Valuta kopen
- </text>
- <text name="info_cannot_buy">
- Kan nu niet kopen
- </text>
- <text name="info_need_more">
- U heeft meer valuta nodig:
- </text>
- <text name="error_message">
- Er klopt iets niet.
- </text>
- <button label="Ga naar website" name="error_web"/>
- <text name="contacting">
- Contact maken met Lindex…
- </text>
- <text name="buy_action_unknown">
- Koop L$ op de LindeX valutabeurs
- </text>
- <text name="buy_action">
- [NAME] L$ [PRICE]
- </text>
- <text name="currency_action" width="48">
- Koop L$
- </text>
- <line_editor name="currency_amt" left_delta="53" width="75">
- 1234
- </line_editor>
- <text name="currency_est" left_delta="80">
- voor ong. [LOCALAMOUNT]
- </text>
- <text name="getting_data">
- Data ophalen…
- </text>
- <text name="balance_label">
- U heeft momenteel
- </text>
- <text name="balance_amount">
- L$ [AMT]
- </text>
- <text name="buying_label">
- U koopt
- </text>
- <text name="buying_amount">
- L$ [AMT]
- </text>
- <text name="total_label">
- Uw saldo zal zijn:
- </text>
- <text name="total_amount">
- L$ [AMT]
- </text>
- <text name="purchase_warning_repurchase" right="-8">
- Het bevestigen van deze aankoop zal alleen de valuta
-kopen. U dient de bewerking opnieuw uit te voeren.
- </text>
- <text name="purchase_warning_notenough" right="-8">
- U koopt niet voldoende valuta.
-Verhoog de hoeveelheid die gekocht moet worden.
- </text>
- <button label="Annuleren" name="cancel_btn"/>
- <button label="Kopen" name="buy_btn"/>
- <string name="buy_currency">
- Koop L$ [LINDENS] voor ong. [LOCALAMOUNT]
- </string>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_buy_land.xml b/indra/newview/skins/default/xui/nl/floater_buy_land.xml
deleted file mode 100644
index 04990e78db..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_buy_land.xml
+++ /dev/null
@@ -1,235 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="buy land" title="KOOP LAND">
- <text name="region_name_label">
- Regio:
- </text>
- <text name="region_name_text">
- (onbekend)
- </text>
- <text name="region_type_label">
- Type:
- </text>
- <text name="region_type_text">
- (onbekend)
- </text>
- <text name="estate_name_label">
- Estate:
- </text>
- <text name="estate_name_text">
- (onbekend)
- </text>
- <text name="estate_owner_label">
- Estate eigenaar:
- </text>
- <text name="estate_owner_text">
- (onbekend)
- </text>
- <text name="resellable_changeable_label">
- Aangekocht land in deze regio:
- </text>
- <text name="resellable_clause">
- Mag niet worden doorverkocht
- </text>
- <text name="changeable_clause">
- Mag niet worden samengevoegd/opgesplitst
- </text>
- <text name="covenant_text">
- U moet instemmen met het estate convenant:
- </text>
- <text left="470" name="covenant_timestamp_text"/>
- <text_editor name="covenant_editor">
- Laden...
- </text_editor>
- <check_box label="Ik ga akkoord met het hierboven &#10;beschreven convenant." name="agree_covenant"/>
- <text name="info_parcel_label">
- Perceel:
- </text>
- <text name="info_parcel">
- Scotopteryx 138,204
- </text>
- <text name="info_size_label">
- Grootte:
- </text>
- <text name="info_size">
- 1024 m²
- </text>
- <text name="info_price_label">
- Prijs:
- </text>
- <text name="info_price">
- L$ 1500
-(L$ 1.1/m²)
-verkocht met objecten
- </text>
- <text name="info_action">
- Het kopen van dit land zal:
- </text>
- <text name="error_message">
- Er is iets niet in orde.
- </text>
- <button label="Ga naar website" name="error_web"/>
- <text name="account_action">
- U upgraden naar een premium lidmaatschap
- </text>
- <text name="account_reason">
- Alleen premiumleden kunnen land bezitten.
- </text>
- <combo_box name="account_level">
- <combo_box.item name="US$9.95/month,billedmonthly" label="US$9.95/maand, gefactureerd per maand"/>
- <combo_box.item name="US$7.50/month,billedquarterly" label="US$7.50/maand, gefactureerd per kwartaal"/>
- <combo_box.item name="US$6.00/month,billedannually" label="US$6.00/maand, gefactureerd per jaar"/>
- </combo_box>
- <text name="land_use_action">
- Verhoog uw maandelijkse landgebruikskosten tot US$ 40/maand
- </text>
- <text name="land_use_reason">
- U bezit 1309 m² land.
-Dit perceel omvat 512 m² land.
- </text>
- <text name="purchase_action">
- Betaal Joe Resident L$4000 voor het land
- </text>
- <text name="currency_reason">
- U heeft L$2,100.
- </text>
- <text name="currency_action">
- Koop extra L$
- </text>
- <line_editor name="currency_amt">
- 1000
- </line_editor>
- <text name="currency_est">
- voor ong. US$ [AMOUNT2]
- </text>
- <text name="currency_balance">
- U heeft L$2,100.
- </text>
- <check_box label="Verwijder [AMOUNT] vierkante meters van uw groepsbijdrage." name="remove_contribution"/>
- <button label="Aankopen" name="buy_btn"/>
- <button label="Annuleren" name="cancel_btn"/>
- <string name="can_resell">
- Mag worden doorverkocht.
- </string>
- <string name="can_not_resell">
- Mag niet worden doorverkocht.
- </string>
- <string name="can_change">
- Mag worden samengevoegd of opgedeeld.
- </string>
- <string name="can_not_change">
- Mag niet worden samengevoegd of opgedeeld.
- </string>
- <string name="cant_buy_for_group">
- U heeft geen permissie om land te kopen voor uw actieve groep.
- </string>
- <string name="no_land_selected">
- Geen land geselecteerd
- </string>
- <string name="multiple_parcels_selected">
- Meerdere verschillende percelen geselecteerd. Probeer een kleiner gebied te selecteren.
- </string>
- <string name="no_permission">
- U heeft geen permissie om land te kopen voor uw actieve groep.
- </string>
- <string name="parcel_not_for_sale">
- Het geselecteerde perceel is niet te koop.
- </string>
- <string name="group_already_owns">
- De groep is al eigenaar van het perceel.
- </string>
- <string name="you_already_own">
- U bent al eigenaar van het perceel
- </string>
- <string name="set_to_sell_to_other">
- Het geselecteerde perceel staat te koop voor een andere partij.
- </string>
- <string name="no_public_land">
- Het geselecteerde gebied heeft geen publiek land.
- </string>
- <string name="not_owned_by_you">
- Land dat het eigendom is van een andere gebruiker is geselecteerd. Probeer een kleiner gebied te selecteren.
- </string>
- <string name="processing">
- Uw aankoop wordt verwerkt...
-
-(Dit kan een minuut of twee duren.)
- </string>
- <string name="fetching_error">
- Er is een fout opgetreden tijdens het ophalen van informatie over het kopen van het land.
- </string>
- <string name="buying_will">
- Het kopen van dit land zal:
- </string>
- <string name="buying_for_group">
- Land voor groep kopen zal:
- </string>
- <string name="cannot_buy_now">
- Kan nu niet kopen:
- </string>
- <string name="not_for_sale">
- Niet te koop:
- </string>
- <string name="none_needed">
- geen benodigd
- </string>
- <string name="must_upgrade">
- Uw account moet geüpgrade worden om land te bezitten.
- </string>
- <string name="cant_own_land">
- Uw account kan land bezitten.
- </string>
- <string name="land_holdings">
- U bezit [BUYER] vierkante meters land.
- </string>
- <string name="pay_to_for_land">
- Betaal L$ [AMOUNT] aan [SELLER] voor dit land
- </string>
- <string name="buy_for_US">
- Koop L$ [AMOUNT] voor ong. US$ [AMOUNT2],
- </string>
- <string name="parcel_meters">
- Dit perceel is [AMOUNT] vierkante meters.
- </string>
- <string name="premium_land">
- Dit land is premium, en zal worden belast als [AMOUNT] vierkante meters.
- </string>
- <string name="discounted_land">
- Dit land is gedisconteerd, en zal worden belast als [AMOUNT] vierkante meters.
- </string>
- <string name="meters_supports_object">
- [AMOUNT] vierkante meter
-ondersteunt [AMOUNT2] objecten
- </string>
- <string name="sold_with_objects">
- verkocht met objecten
- </string>
- <string name="sold_without_objects">
- objecten niet inbegrepen
- </string>
- <string name="info_price_string">
- L$ [PRICE]
-(L$ [PRICE_PER_SQM]/m²)
-[SOLD_WITH_OBJECTS]
- </string>
- <string name="insufficient_land_credits">
- De groep [GROUP] heeft voldoende bijdrage van landgebruikcredits nodig om dit perceel te dekken voordat de aankoop kan worden afgerond.
- </string>
- <string name="have_enough_lindens">
- U heeft L$ [AMOUNT], wat genoeg is om dit land te kopen.
- </string>
- <string name="not_enough_lindens">
- U heeft slechts L$ [AMOUNT], en hebt L$ [AMOUNT2] meer nodig.
- </string>
- <string name="balance_left">
- Na de aankoop zult u nog L$ [AMOUNT] over hebben.
- </string>
- <string name="balance_needed">
- U dient minstens L$ [AMOUNT] te kopen om dit land te kunnen veroorloven.
- </string>
- <string name="no_parcel_selected">
- (geen perceel geselecteerd)
- </string>
- <string name="buy_currency">
- Koop L$ [AMOUNT] voor ong. US$ [USD]
- </string>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_buy_object.xml b/indra/newview/skins/default/xui/nl/floater_buy_object.xml
deleted file mode 100644
index 5d2d9dd3d0..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_buy_object.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="contents" title="KOOP EEN KOPIE VAN OBJECT">
- <text name="contents_text">
- en zijn inhoud:
- </text>
- <text name="buy_text">
- Koop voor L$[AMOUNT] van [NAME]?
- </text>
- <button label="Annuleren" label_selected="Annuleren" name="cancel_btn"/>
- <button label="Koop" label_selected="Koop" name="buy_btn"/>
- <string name="title_buy_text">
- Koop
- </string>
- <string name="title_buy_copy_text">
- Koop een kopie van
- </string>
- <string name="no_copy_text">
- (niet kopiëren)
- </string>
- <string name="no_modify_text">
- (niet wijzigen)
- </string>
- <string name="no_transfer_text">
- (niet overdragen)
- </string>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_camera.xml b/indra/newview/skins/default/xui/nl/floater_camera.xml
deleted file mode 100644
index 81a3ed8a58..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_camera.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="camera_floater" title="">
- <floater.string name="rotate_tooltip">
- Roteer camera rond focus
- </floater.string>
- <floater.string name="zoom_tooltip">
- Zoom camera naar focus
- </floater.string>
- <floater.string name="move_tooltip">
- Beweeg camera omhoog en omlaag, links en rechts
- </floater.string>
- <panel name="controls">
- <joystick_track name="cam_track_stick" tool_tip="Beweeg camera omhoog en omlaag, links en rechts"/>
- <joystick_zoom name="zoom" tool_tip="Zoom camera naar focus"/>
- </panel>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_choose_group.xml b/indra/newview/skins/default/xui/nl/floater_choose_group.xml
deleted file mode 100644
index 8d54d62d2d..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_choose_group.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="groups" title="GROEPEN">
- <text name="groupdesc">
- Kies een groep:
- </text>
- <button label="OK" label_selected="OK" name="OK"/>
- <button label="Annuleren" label_selected="Annuleren" name="Cancel"/>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_color_picker.xml b/indra/newview/skins/default/xui/nl/floater_color_picker.xml
deleted file mode 100644
index 9b61af0710..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_color_picker.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="ColorPicker" title="KLEURKIEZER">
- <text name="r_val_text">
- Rood:
- </text>
- <text name="g_val_text">
- Groen:
- </text>
- <text name="b_val_text">
- Blauw:
- </text>
- <text name="h_val_text">
- Hue:
- </text>
- <text name="s_val_text">
- Sat:
- </text>
- <text name="l_val_text">
- Lum:
- </text>
- <check_box label="Direct toepassen" name="apply_immediate"/>
- <button label="Annuleren" label_selected="Annuleren" name="cancel_btn"/>
- <button label="Selecteer" label_selected="Selecteer" name="select_btn"/>
- <text name="Current color:">
- Huidige kleur:
- </text>
- <text name="(Drag below to save.)">
- (Sleep naar beneden
- om op te slaan)
- </text>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_critical.xml b/indra/newview/skins/default/xui/nl/floater_critical.xml
deleted file mode 100644
index 90790fe108..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_critical.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="modal container" title="">
- <button label="Doorgaan" label_selected="Doorgaan" name="Continue"/>
- <button label="Annuleren" label_selected="Annuleren" name="Cancel"/>
- <text name="tos_heading">
- Leest u alstublieft het volgende bericht zorgvuldig door.
- </text>
- <text_editor name="tos_text">
- TOS_TEXT
- </text_editor>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_event.xml b/indra/newview/skins/default/xui/nl/floater_event.xml
deleted file mode 100644
index 45ec58abdf..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_event.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater
- follows="all"
- height="400"
- can_resize="true"
- help_topic="event_details"
- label="Event"
- layout="topleft"
- name="Event"
- save_rect="true"
- save_visibility="false"
- title="EVENT DETAILS"
- width="600">
- <floater.string
- name="loading_text">
- Laden...
- </floater.string>
- <floater.string
- name="done_text">
- Done
- </floater.string>
- <web_browser
- trusted_content="true"
- follows="left|right|top|bottom"
- layout="topleft"
- left="10"
- name="browser"
- height="365"
- width="580"
- top="0"/>
- <text
- follows="bottom|left"
- height="16"
- layout="topleft"
- left_delta="0"
- name="status_text"
- top_pad="10"
- width="150" />
-</floater>
-
diff --git a/indra/newview/skins/default/xui/nl/floater_font_test.xml b/indra/newview/skins/default/xui/nl/floater_font_test.xml
deleted file mode 100644
index 31e53e7fba..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_font_test.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="contents" title="LETTERTYPETEST">
- <text name="linea">
- Overschrijf test, zou hier moeten verschijnen als Times (vanuit default/xui/en-us).
- </text>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_gesture.xml b/indra/newview/skins/default/xui/nl/floater_gesture.xml
deleted file mode 100644
index 4fa994c69e..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_gesture.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="gestures" title="ACTIEVE GEBAREN">
- <text name="help_label">
- Dubbelklik een gebaar om animaties en geluiden af te spelen
- </text>
- <scroll_list name="gesture_list">
- <column label="Trigger" name="trigger"/>
- <column label="Toets" name="shortcut"/>
- <column label="Naam" name="name"/>
- </scroll_list>
- <button label="Nieuw" name="new_gesture_btn"/>
- <button label="Bewerken" name="edit_btn"/>
- <button label="Afspelen" name="play_btn"/>
- <button label="Stop" name="stop_btn"/>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_hardware_settings.xml b/indra/newview/skins/default/xui/nl/floater_hardware_settings.xml
deleted file mode 100644
index b27a96f15c..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_hardware_settings.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Hardware Settings Floater" title="HARDWARE INSTELLINGEN">
- <text name="Filtering:">
- Filtering:
- </text>
- <check_box label="Anisotropische filtering (langzamer indien ingeschakeld)" name="ani" left="100"/>
- <text name="Antialiasing:">
- Anti-alias:
- </text>
- <combo_box label="Anti-alias" name="fsaa" width="120" left="100">
- <combo_box.item name="FSAADisabled" label="Uitgeschakeld"/>
- <combo_box.item name="2x" label="2x"/>
- <combo_box.item name="4x" label="4x"/>
- <combo_box.item name="8x" label="8x"/>
- <combo_box.item name="16x" label="16x"/>
- </combo_box>
- <spinner label="Gamma:" name="gamma" label_width="88" width="170"/>
- <text name="(brightness, lower is brighter)" left="182">
- (helderheid, lager is helderder, 0=gebruik standaardwaarde)
- </text>
- <text name="Enable VBO:">
- VBO inschakelen:
- </text>
- <check_box label="OpenGL Vertex Buffer Objects inschakelen" name="vbo" tool_tip="Dit inschakelen op moderne hardware geeft een prestatiewinst. Oudere hardware heeft echter vaak een slechte implementatie van VBO&apos;s en u kunt crashes ondervinden wanneer dit is ingeschakeld."/>
- <slider label="Textuurgeheugen (MB):" name="GrapicsCardTextureMemory" tool_tip="Hoeveelheid geheugen dat voor texturen toegewezen wordt. Standaard wordt de hoeveelheid geheugen van de videokaart gebruikt. Het verminderen van deze waarde kan de prestaties verbeteren, maar kan ook texturen wazig maken."/>
- <spinner label="Mistafstandsratio:" name="fog"/>
- <button label="OK" label_selected="OK" name="OK"/>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_hud.xml b/indra/newview/skins/default/xui/nl/floater_hud.xml
deleted file mode 100644
index 8ef7de1b02..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_hud.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_hud" title="HANDLEIDING"/>
diff --git a/indra/newview/skins/default/xui/nl/floater_image_preview.xml b/indra/newview/skins/default/xui/nl/floater_image_preview.xml
deleted file mode 100644
index 06596c20aa..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_image_preview.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Image Preview" title="">
- <text name="name_label">
- Naam:
- </text>
- <text name="description_label">
- Omschrijving:
- </text>
- <text name="preview_label">
- Toon voorbeeld van
-afbeelding als:
- </text>
- <combo_box label="Kledingtype" name="clothing_type_combo">
- <combo_box.item name="Image" label="Afbeelding"/>
- <combo_box.item name="Hair" label="Haar"/>
- <combo_box.item name="FemaleHead" label="Vrouwelijk hoofd"/>
- <combo_box.item name="FemaleUpperBody" label="Vrouwelijk bovenlichaam"/>
- <combo_box.item name="FemaleLowerBody" label="Vrouwelijk onderlichaam"/>
- <combo_box.item name="MaleHead" label="Mannelijk hoofd"/>
- <combo_box.item name="MaleUpperBody" label="Mannelijk onderlichaam"/>
- <combo_box.item name="MaleLowerBody" label="Mannelijk bovenlichaam"/>
- <combo_box.item name="Skirt" label="Rok"/>
- <combo_box.item name="SculptedPrim" label="Sculpted prim"/>
- </combo_box>
- <text name="bad_image_text">
- Kan afbeelding niet lezen.
-
-Probeer het op te slaan als een 24 bit Targa (.tga).
- </text>
- <check_box label="Gebruik verliesloze compressie" name="lossless_check"/>
- <button label="Annuleren" name="cancel_btn"/>
- <button label="Upload (L$[AMOUNT])" name="ok_btn" width="140"/>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_inspect.xml b/indra/newview/skins/default/xui/nl/floater_inspect.xml
deleted file mode 100644
index 6a0885b57f..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_inspect.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="inspect" title="OBJECTEN INSPECTEREN">
- <scroll_list name="object_list" tool_tip="Selecteer een object van deze lijst om het in-wereld te markeren">
- <column label="Objectnaam" name="object_name"/>
- <column label="Eigenaar" name="owner_name"/>
- <column label="Maker" name="creator_name"/>
- <column label="Aanmaakdatum" name="creation_date"/>
- </scroll_list>
- <button label="Toon profiel eigenaar..." label_selected="" name="button owner" tool_tip="Bekijk het profiel van de eigenaar van het gemarkeerde object"/>
- <button label="Toon profiel maker..." label_selected="" name="button creator" tool_tip="Bekijk het profiel van de originele maker van het gemarkeerde object"/>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_inventory.xml b/indra/newview/skins/default/xui/nl/floater_inventory.xml
deleted file mode 100644
index a69039d811..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_inventory.xml
+++ /dev/null
@@ -1,47 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Inventory" title="INVENTARIS">
- <search_editor label="Typ hier om te zoeken" name="inventory search editor"/>
- <tab_container name="inventory filter tabs">
- <inventory_panel label="Alle items" name="All Items"/>
- <inventory_panel label="Recente items" name="Recent Items"/>
- </tab_container>
- <menu_bar name="Inventory Menu">
- <menu label="Bestand" name="File">
- <menu_item_call label="Open" name="Open"/>
- <menu_item_call label="Nieuw venster" name="New Window"/>
- <menu_item_call label="Toon filters" name="Show Filters"/>
- <menu_item_call label="Filters opnieuw instellen" name="Reset Current"/>
- <menu_item_call label="Alle mappen sluiten" name="Close All Folders"/>
- <menu_item_call label="Prullenbak legen" name="Empty Trash"/>
- </menu>
- <menu label="Maak" name="Create">
- <menu_item_call label="Nieuwe map" name="New Folder"/>
- <menu_item_call label="Nieuw script" name="New Script"/>
- <menu_item_call label="Nieuwe notitie" name="New Note"/>
- <menu_item_call label="Nieuw gebaar" name="New Gesture"/>
- <menu name="New Clothes">
- <menu_item_call label="Nieuw hemd" name="New Shirt"/>
- <menu_item_call label="Nieuwe broek" name="New Pants"/>
- <menu_item_call label="Nieuwe schoenen" name="New Shoes"/>
- <menu_item_call label="Nieuwe sokken" name="New Socks"/>
- <menu_item_call label="Nieuwe jas" name="New Jacket"/>
- <menu_item_call label="Nieuwe rok" name="New Skirt"/>
- <menu_item_call label="Nieuwe handschoenen" name="New Gloves"/>
- <menu_item_call label="Nieuw onderhemd" name="New Undershirt"/>
- <menu_item_call label="Nieuwe onderbroek" name="New Underpants"/>
- </menu>
- <menu name="New Body Parts">
- <menu_item_call label="Nieuwe postuur" name="New Shape"/>
- <menu_item_call label="Nieuwe huid" name="New Skin"/>
- <menu_item_call label="Nieuw haar" name="New Hair"/>
- <menu_item_call label="Nieuwe ogen" name="New Eyes"/>
- </menu>
- </menu>
- <menu label="Sorteren" name="Sort">
- <menu_item_check label="Op naam" name="By Name"/>
- <menu_item_check label="Op datum" name="By Date"/>
- <menu_item_check label="Mappen altijd op naam" name="Folders Always By Name"/>
- <menu_item_check label="Systeemmappen naar de bovenkant" name="System Folders To Top"/>
- </menu>
- </menu_bar>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_inventory_item_properties.xml b/indra/newview/skins/default/xui/nl/floater_inventory_item_properties.xml
deleted file mode 100644
index 81a823acd4..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_inventory_item_properties.xml
+++ /dev/null
@@ -1,75 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="item properties" title="INVENTARISITEM EIGENSCHAPPEN">
- <text name="LabelItemNameTitle">
- Naam:
- </text>
- <text name="LabelItemDescTitle">
- Omschrijving:
- </text>
- <text name="LabelCreatorTitle">
- Maker:
- </text>
- <button label="Profiel..." label_selected="" name="BtnCreator"/>
- <text name="LabelOwnerTitle">
- Eigenaar
- </text>
- <button label="Profiel..." label_selected="" name="BtnOwner"/>
- <text name="LabelAcquiredTitle">
- Verworven:
- </text>
- <text name="LabelAcquiredDate">
- Wed May 24 12:50:46 2006
- </text>
- <text name="OwnerLabel">
- U kunt:
- </text>
- <check_box label="Wijzigen" name="CheckOwnerModify"/>
- <check_box label="Kopiëren" name="CheckOwnerCopy"/>
- <check_box label="Doorverkopen/weggeven" name="CheckOwnerTransfer"/>
- <text name="BaseMaskDebug">
- B:
- </text>
- <text name="OwnerMaskDebug">
- E:
- </text>
- <text name="GroupMaskDebug">
- G:
- </text>
- <text name="EveryoneMaskDebug">
- I:
- </text>
- <text name="NextMaskDebug">
- V:
- </text>
- <check_box label="Delen met groep" name="CheckShareWithGroup"/>
- <check_box label="Iedereen mag kopiëren" name="CheckEveryoneCopy"/>
- <text name="NextOwnerLabel" width="130">
- Volgende eigenaar kan:
- </text>
- <check_box label="Wijzigen" name="CheckNextOwnerModify"/>
- <check_box label="Kopiëren" name="CheckNextOwnerCopy"/>
- <check_box label="Doorverkopen/weggeven" name="CheckNextOwnerTransfer"/>
- <text name="SaleLabel">
- Markeer item:
- </text>
- <check_box label="Te koop" name="CheckPurchase"/>
- <radio_group name="RadioSaleType">
- <radio_item name="radio" label="Origineel" />
- <radio_item name="radio2" label="Kopiëren" />
- </radio_group>
- <text name="TextPrice">
- Prijs: L$
- </text>
- <string name="unknown">
- (onbekend)
- </string>
- <string name="public">
- (public)
- </string>
- <string name="you_can">
- U kunt:
- </string>
- <string name="owner_can">
- Eigenaar kan:
- </string>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_inventory_view_finder.xml b/indra/newview/skins/default/xui/nl/floater_inventory_view_finder.xml
deleted file mode 100644
index 097ebda8b7..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_inventory_view_finder.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Inventory Finder" title="INVENTORY_RECENT_ITEMS">
- <check_box label="Animatie" name="check_animation"/>
- <check_box label="Visitekaartjes" name="check_calling_card"/>
- <check_box label="Kleding" name="check_clothing"/>
- <check_box label="Gebaren" name="check_gesture"/>
- <check_box label="Landmarkeringen" name="check_landmark"/>
- <check_box label="Notitiekaarten" name="check_notecard"/>
- <check_box label="Objecten" name="check_object"/>
- <check_box label="Scripts" name="check_script"/>
- <check_box label="Geluiden" name="check_sound"/>
- <check_box label="Texturen" name="check_texture"/>
- <check_box label="Foto&apos;s" name="check_snapshot"/>
- <button label="Alles" label_selected="Alles" name="All"/>
- <button label="Geen" label_selected="Geen" name="None"/>
- <check_box label="Altijd mappen tonen" name="check_show_empty"/>
- <check_box label="Sinds logoff" name="check_since_logoff"/>
- <text name="- OR -">
- - OF -
- </text>
- <spinner label="Uren geleden" name="spin_hours_ago" width="144" label_width="80"/>
- <spinner label="Dagen geleden" name="spin_days_ago" width="144" label_width="80"/>
- <button label="Sluiten" label_selected="Sluiten" name="Close"/>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_joystick.xml b/indra/newview/skins/default/xui/nl/floater_joystick.xml
deleted file mode 100644
index 1d590dc1f3..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_joystick.xml
+++ /dev/null
@@ -1,80 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Joystick" title="JOYSTICK CONFIGURATIE">
- <check_box name="enable_joystick" width="80" label="Joystick inschakelen:"/>
- <text left="146" name="joystick_type" width="360"/>
- <spinner label="X-as mapping" name="JoystickAxis1"/>
- <spinner label="Y-as mapping" name="JoystickAxis2"/>
- <spinner label="Z-as mapping" name="JoystickAxis0"/>
- <spinner label="Stampen mapping" name="JoystickAxis4"/>
- <spinner label="Gieren mapping" name="JoystickAxis5"/>
- <spinner label="Rollen mapping" name="JoystickAxis3"/>
- <spinner label="Zoom mapping" name="JoystickAxis6"/>
- <check_box label="Directe zoom" name="ZoomDirect"/>
- <check_box label="3D Cursor" name="Cursor3D"/>
- <check_box label="Automatisch niveau" name="AutoLeveling"/>
- <text name="Control Modes:">
- Besturingsmodi:
- </text>
- <check_box name="JoystickAvatarEnabled" label="Avatar"/>
- <check_box name="JoystickBuildEnabled" label="Bouwen"/>
- <check_box name="JoystickFlycamEnabled" label="Vliegcamera"/>
- <text name="XScale">
- X schaal
- </text>
- <text name="YScale">
- Y schaal
- </text>
- <text name="ZScale">
- Z schaal
- </text>
- <text name="PitchScale">
- Stampen schaal
- </text>
- <text name="YawScale">
- Gieren schaal
- </text>
- <text name="RollScale">
- Rollen schaal
- </text>
- <text name="XDeadZone">
- X dode zone
- </text>
- <text name="YDeadZone">
- Y dode zone
- </text>
- <text name="ZDeadZone">
- Z dode zone
- </text>
- <text name="PitchDeadZone">
- Stampen dode zone
- </text>
- <text name="YawDeadZone">
- Gieren dode zone
- </text>
- <text name="RollDeadZone">
- Rollen dode zone
- </text>
- <text name="Feathering">
- Feathering
- </text>
- <text name="ZoomScale2">
- Zoomschaal
- </text>
- <text name="ZoomDeadZone">
- Zoom dode zone
- </text>
- <button label="SpaceNavigator standaardwaarden" name="SpaceNavigatorDefaults" width="200" font="SansSerifSmall"/>
- <button label="OK" label_selected="OK" name="ok_btn"/>
- <button label="Annuleren" label_selected="Annuleren" name="cancel_btn" left_delta="110"/>
- <stat_view label="Joystick monitor" name="axis_view">
- <stat_bar label="As 0" name="axis0"/>
- <stat_bar label="As 1" name="axis1"/>
- <stat_bar label="As 2" name="axis2"/>
- <stat_bar label="As 3" name="axis3"/>
- <stat_bar label="As 4" name="axis4"/>
- <stat_bar label="As 5" name="axis5"/>
- </stat_view>
- <string name="NoDevice">
- Geen apparaat gedetecteerd
- </string>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_lagmeter.xml b/indra/newview/skins/default/xui/nl/floater_lagmeter.xml
deleted file mode 100644
index e3943c2470..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_lagmeter.xml
+++ /dev/null
@@ -1,152 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_lagmeter" title="LAG METER">
- <button label="" label_selected="" name="client_lagmeter" tool_tip="Client lag status"/>
- <text name="client">
- Client:
- </text>
- <text name="client_text">
- Normaal
- </text>
- <button label="" label_selected="" name="network_lagmeter" tool_tip="Netwerklag status"/>
- <text name="network">
- Netwerk:
- </text>
- <text name="network_text">
- Normaal
- </text>
- <button label="" label_selected="" name="server_lagmeter" tool_tip="Serverlag status"/>
- <text name="server">
- Server:
- </text>
- <text name="server_text">
- Normaal
- </text>
- <button label="?" name="server_help"/>
- <button label="&gt;&gt;" name="minimize"/>
- <string name="max_title_msg">
- Lag meter
- </string>
- <string name="max_width_px">
- 360
- </string>
- <string name="min_title_msg">
- Lag
- </string>
- <string name="min_width_px">
- 90
- </string>
- <string name="client_text_msg">
- Client
- </string>
- <string name="client_frame_rate_critical_fps">
- 10
- </string>
- <string name="client_frame_rate_warning_fps">
- 15
- </string>
- <string name="client_frame_time_window_bg_msg">
- Normaal, venster op achtergrond
- </string>
- <string name="client_frame_time_critical_msg">
- Client framerate onder [CLIENT_FRAME_RATE_CRITICAL]
- </string>
- <string name="client_frame_time_warning_msg">
- Client framerate tussen [CLIENT_FRAME_RATE_CRITICAL] en [CLIENT_FRAME_RATE_WARNING]
- </string>
- <string name="client_frame_time_normal_msg">
- Normaal
- </string>
- <string name="client_draw_distance_cause_msg">
- Mogelijke oorzaak: Zichtbereik te hoog ingesteld
- </string>
- <string name="client_texture_loading_cause_msg">
- Mogelijke oorzaak: Afbeeldingen worden geladen
- </string>
- <string name="client_texture_memory_cause_msg">
- Mogelijke oorzaak: Teveel afbeeldingen in geheugen
- </string>
- <string name="client_complex_objects_cause_msg">
- Mogelijke oorzaak: Teveel complexe objecten in de scene
- </string>
- <string name="network_text_msg">
- Netwerk
- </string>
- <string name="network_packet_loss_critical_pct">
- 10
- </string>
- <string name="network_packet_loss_warning_pct">
- 5
- </string>
- <string name="network_packet_loss_critical_msg">
- Verbinding verliest meer dan [NETWORK_PACKET_LOSS_CRITICAL]% van de pakketten
- </string>
- <string name="network_packet_loss_warning_msg">
- Verbinding verliest [NETWORK_PACKET_LOSS_WARNING]%-[NETWORK_PACKET_LOSS_CRITICAL]% van de pakketten
- </string>
- <string name="network_performance_normal_msg">
- Normaal
- </string>
- <string name="network_ping_critical_ms">
- 600
- </string>
- <string name="network_ping_warning_ms">
- 300
- </string>
- <string name="network_ping_critical_msg">
- Verbinding pingtijd is meer dan [NETWORK_PING_CRITICAL] ms
- </string>
- <string name="network_ping_warning_msg">
- Verbinding pingtijd is [NETWORK_PING_WARNING]-[NETWORK_PING_CRITICAL] ms
- </string>
- <string name="network_packet_loss_cause_msg">
- Mogelijk slechte verbinding of &apos;Bandbreedte&apos; voorkeur te hoog.
- </string>
- <string name="network_ping_cause_msg">
- Mogelijk slechte verbinding of applicatie voor bestandsdeling.
- </string>
- <string name="server_text_msg">
- Server
- </string>
- <string name="server_frame_rate_critical_fps">
- 20
- </string>
- <string name="server_frame_rate_warning_fps">
- 30
- </string>
- <string name="server_single_process_max_time_ms">
- 20
- </string>
- <string name="server_frame_time_critical_msg">
- Simulator framerate onder [SERVER_FRAME_RATE_CRITICAL]
- </string>
- <string name="server_frame_time_warning_msg">
- Simulator framerate tussen [SERVER_FRAME_RATE_CRITICAL] en [SERVER_FRAME_RATE_WARNING]
- </string>
- <string name="server_frame_time_normal_msg">
- Normaal
- </string>
- <string name="server_physics_cause_msg">
- Mogelijke oorzaak: Teveel fysieke objecten
- </string>
- <string name="server_scripts_cause_msg">
- Mogelijke oorzaak: Teveel gescripte objecten
- </string>
- <string name="server_net_cause_msg">
- Mogelijke oorzaak: Teveel netwerkverkeer
- </string>
- <string name="server_agent_cause_msg">
- Mogelijke oorzaak: Teveel mensen verplaatsen zich in de regio
- </string>
- <string name="server_images_cause_msg">
- Mogelijke oorzaak: Teveel afbeeldingberekeningen
- </string>
- <string name="server_generic_cause_msg">
- Mogelijke oorzaak: Simulatorbelasting is te hoog
- </string>
- <string name="smaller_label">
- &gt;&gt;
- </string>
- <string name="bigger_label">
- &lt;&lt;
- </string>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_land_holdings.xml b/indra/newview/skins/default/xui/nl/floater_land_holdings.xml
deleted file mode 100644
index 5cf66ed0c4..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_land_holdings.xml
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="land holdings floater" title="MIJN LAND">
- <scroll_list name="parcel list">
- <column label="Perceelnaam" name="name"/>
- <column label="Regio" name="location"/>
- <column label="Type" name="type"/>
- <column label="Gebied" name="area"/>
- </scroll_list>
- <button label="Teleport" label_selected="Teleport" name="Teleport" tool_tip="Teleport naar het centrum van dit land."/>
- <button label="Toon op kaart" label_selected="Toon op kaart" name="Show on Map" tool_tip="Toon dit land op de wereldkaart"/>
- <text name="contrib_label">
- Bijdragen aan uw groepen:
- </text>
- <scroll_list name="grant list">
- <column label="Groep" name="group"/>
- <column label="Gebied" name="area"/>
- </scroll_list>
- <text name="allowed_label">
- Toegestane landbezittingen in het huidige betaalschema:
- </text>
- <text name="allowed_text">
- [AREA] m²
- </text>
- <text name="current_label">
- Huidige landbezittingen:
- </text>
- <text name="current_text">
- [AREA] m²
- </text>
- <text name="available_label">
- Beschikbaar voor landaankopen:
- </text>
- <text name="available_text">
- [AREA] m²
- </text>
- <string name="area_string">
- [AREA] m²
- </string>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_live_lsleditor.xml b/indra/newview/skins/default/xui/nl/floater_live_lsleditor.xml
deleted file mode 100644
index 98a0362ce1..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_live_lsleditor.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="script ed float" title="SCRIPT: NIEUW SCRIPT">
- <button label="Herstarten" label_selected="Herstarten" name="Reset"/>
- <check_box label="Uitvoeren" name="running" left="4"/>
- <check_box label="Mono" name="mono"/>
- <string name="not_allowed">
- U bent niet bevoegd om dit script in te zien
- </string>
- <string name="script_running">
- Uitvoeren
- </string>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_lsl_guide.xml b/indra/newview/skins/default/xui/nl/floater_lsl_guide.xml
deleted file mode 100644
index 27b3ff834e..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_lsl_guide.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="script ed float" title="LSL WIKI">
- <check_box label="Volg cursor" name="lock_check"/>
- <combo_box label="Vergrendelen" name="history_combo"/>
- <button label="Terug" name="back_btn"/>
- <button label="Vooruit" name="fwd_btn"/>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_map.xml b/indra/newview/skins/default/xui/nl/floater_map.xml
deleted file mode 100644
index 29af36e50c..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_map.xml
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Map">
- <floater.string name="mini_map_north">
- N
- </floater.string>
- <floater.string name="mini_map_east">
- O
- </floater.string>
- <floater.string name="mini_map_west">
- W
- </floater.string>
- <floater.string name="mini_map_south">
- Z
- </floater.string>
- <floater.string name="mini_map_southeast">
- ZO
- </floater.string>
- <floater.string name="mini_map_northeast">
- NO
- </floater.string>
- <floater.string name="mini_map_southwest">
- ZW
- </floater.string>
- <floater.string name="mini_map_northwest">
- NW
- </floater.string>
- <text label="N" name="floater_map_north" text="N">
- N
- </text>
- <text label="O" name="floater_map_east" text="O">
- O
- </text>
- <text label="W" name="floater_map_west" text="W">
- W
- </text>
- <text label="Z" name="floater_map_south" text="Z">
- Z
- </text>
- <text label="ZO" name="floater_map_southeast" text="ZO">
- ZO
- </text>
- <text label="NO" name="floater_map_northeast" text="NO">
- NO
- </text>
- <text label="ZW" name="floater_map_southwest" text="ZW">
- ZW
- </text>
- <text label="NW" name="floater_map_northwest" text="NW">
- NW
- </text>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_media_browser.xml b/indra/newview/skins/default/xui/nl/floater_media_browser.xml
deleted file mode 100644
index 12f693bf33..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_media_browser.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_about" title="MEDIA VERKENNER">
- <layout_stack name="stack1">
- <layout_panel name="nav_controls">
- <button label="Terug" name="back"/>
- <button label="Vooruit" name="forward"/>
- <button label="Herladen" name="reload"/>
- <button label="Ga" name="go"/>
- </layout_panel>
- <layout_panel name="parcel_owner_controls">
- <button label="Stuur huidige URL naar perceel" name="assign"/>
- </layout_panel>
- <layout_panel name="external_controls">
- <button label="Open in mijn webbrowser" name="open_browser"/>
- <check_box label="Altijd in mijn webbrowser openen" name="open_always"/>
- <button label="Sluiten" name="close"/>
- </layout_panel>
- </layout_stack>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_mem_leaking.xml b/indra/newview/skins/default/xui/nl/floater_mem_leaking.xml
deleted file mode 100644
index d0b25587b6..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_mem_leaking.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="MemLeak" title="GEHEUGENLEK SIMULATIE">
- <spinner label="Leksnelheid (bytes per frame):" name="leak_speed"/>
- <spinner label="Max gelekt geheugen (MB):" name="max_leak"/>
- <text name="total_leaked_label">
- Huidig gelekt geheugen: [SIZE] KB
- </text>
- <text name="note_label_1">
- [NOTE1]
- </text>
- <text name="note_label_2">
- [NOTE2]
- </text>
- <button label="Start" name="start_btn"/>
- <button label="Stop" name="stop_btn"/>
- <button label="Vrijgeven" name="release_btn"/>
- <button label="Sluiten" name="close_btn"/>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_moveview.xml b/indra/newview/skins/default/xui/nl/floater_moveview.xml
deleted file mode 100644
index 8a6a874e49..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_moveview.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="move_floater">
-<panel name="panel_actions">
- <button label="" label_selected="" name="turn left btn" tool_tip="Draai links"/>
- <button label="" label_selected="" name="turn right btn" tool_tip="Draai rechts"/>
- <button label="" label_selected="" name="move up btn" tool_tip="Spring of vlieg omhoog"/>
- <button label="" label_selected="" name="move down btn" tool_tip="Kruip of vlieg omlaag"/>
- <joystick_slide name="slide left btn" tool_tip="Verplaats links"/>
- <joystick_slide name="slide right btn" tool_tip="Verplaats rechts"/>
- <joystick_turn name="forward btn" tool_tip="Verplaats vooruit"/>
- <joystick_turn name="backward btn" tool_tip="Verplaats achteruit"/>
-</panel>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_mute_object.xml b/indra/newview/skins/default/xui/nl/floater_mute_object.xml
deleted file mode 100644
index edea63b42c..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_mute_object.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="mute by name" title="BLOKKEER VOORWERP BIJ NAAM">
- <text bottom_delta="-40" name="message">
- Blokkeer een Voorwerp:
- </text>
- <line_editor bottom_delta="-58" name="object_name">
- Object naam
- </line_editor>
- <text name="note">
- * Blokkeerd alleen object tekst, niet de geluiden
- </text>
- <button label="Ok" name="OK"/>
- <button label="Annuleren" name="Cancel"/>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_openobject.xml b/indra/newview/skins/default/xui/nl/floater_openobject.xml
deleted file mode 100644
index 832c63403d..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_openobject.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="objectcontents" title="OBJECT INHOUD">
- <text name="object_name">
- [DESC]:
- </text>
- <button label="Kopiëren naar inventaris" label_selected="Kopiëren naar inventaris" name="copy_to_inventory_button" width="140"/>
- <button label="Kopiëren en dragen" label_selected="Kopiëren en dragen" name="copy_and_wear_button" left="164"/>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_pay.xml b/indra/newview/skins/default/xui/nl/floater_pay.xml
deleted file mode 100644
index f2b34d78d7..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_pay.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Give Money" title="">
- <button label="L$1" label_selected="L$1" name="fastpay 1"/>
- <button label="L$5" label_selected="L$5" name="fastpay 5"/>
- <button label="L$10" label_selected="L$10" name="fastpay 10"/>
- <button label="L$20" label_selected="L$20" name="fastpay 20"/>
- <button label="Betaal" label_selected="Betaal" name="pay btn"/>
- <button label="Annuleren" label_selected="Annuleren" name="cancel btn"/>
- <text name="payee_label" width="100">
- Betaal inwoner:
- </text>
- <text name="payee_name" left="110">
- Test Name That Is Extremely Long To Check Clipping
- </text>
- <text name="fastpay text">
- Snel betalen:
- </text>
- <text name="amount text">
- Bedrag:
- </text>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_pay_object.xml b/indra/newview/skins/default/xui/nl/floater_pay_object.xml
deleted file mode 100644
index 11fa6d4a44..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_pay_object.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Give Money" title="">
- <text name="payee_group" left="5" width="90" halign="left">
- Betaal groep:
- </text>
- <text name="payee_resident" left="5" width="90" halign="left">
- Betaal inwoner:
- </text>
- <text name="payee_name" left="100" width="200">
- Ericacita Moostopolison
- </text>
- <text name="object_name_label" left="5" width="90" halign="left">
- Via object:
- </text>
- <text name="object_name_text" left="100" width="200">
- ...
- </text>
- <text name="fastpay text" halign="left">
- Snel betalen:
- </text>
- <text name="amount text">
- Bedrag:
- </text>
- <button label="L$1" label_selected="L$1" name="fastpay 1"/>
- <button label="L$5" label_selected="L$5" name="fastpay 5"/>
- <button label="L$10" label_selected="L$10" name="fastpay 10"/>
- <button label="L$20" label_selected="L$20" name="fastpay 20"/>
- <button label="Betaal" label_selected="Betaal" name="pay btn"/>
- <button label="Annuleren" label_selected="Annuleren" name="cancel btn"/>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_perm_prefs.xml b/indra/newview/skins/default/xui/nl/floater_perm_prefs.xml
deleted file mode 100644
index f946c42678..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_perm_prefs.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="perm prefs" title="STANDAARD UPLOAD PERMISSIES">
- <panel label="Permissies" name="permissions">
- <button label="?" label_selected="?" name="help"/>
- <check_box label="Delen met groep" name="share_with_group"/>
- <check_box label="Iedereen mag kopiëren" name="everyone_copy"/>
- <text name="NextOwnerLabel">
- Volgende eigenaar kan:
- </text>
- <check_box label="Wijzigen" name="next_owner_modify"/>
- <check_box label="Kopiëren" name="next_owner_copy"/>
- <check_box label="Verkopen/weggeven" name="next_owner_transfer" left_delta="80"/>
- </panel>
- <button label="OK" label_selected="OK" name="ok"/>
- <button label="Annuleren" label_selected="Annuleren" name="cancel"/>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_post_process.xml b/indra/newview/skins/default/xui/nl/floater_post_process.xml
deleted file mode 100644
index e627f81a70..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_post_process.xml
+++ /dev/null
@@ -1,53 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Post-Process Floater" title="NABEWERKINGINSTELLINGEN">
- <tab_container name="Post-Process Tabs">
- <panel label="Kleurfilter" name="wmiColorFilterPanel">
- <check_box label="Inschakelen" name="wmiColorFilterToggle"/>
- <text name="wmiColorFilterBrightnessText">
- Helderheid
- </text>
- <text name="wmiColorFilterSaturationText">
- Verzadiging
- </text>
- <text name="wmiColorFilterContrastText">
- Contrast
- </text>
- <text name="wmiColorFilterBaseText">
- Contrastbasiskleur
- </text>
- <slider label="R" name="wmiColorFilterBaseR"/>
- <slider label="G" name="wmiColorFilterBaseG"/>
- <slider label="B" name="wmiColorFilterBaseB"/>
- <slider label="I" name="wmiColorFilterBaseI"/>
- </panel>
- <panel label="Nachtvisie" name="wmiNightVisionPanel">
- <check_box label="Inschakelen" name="wmiNightVisionToggle"/>
- <text name="wmiNightVisionBrightMultText">
- Lichtversterking
- </text>
- <text name="wmiNightVisionNoiseSizeText">
- Ruisgrootte
- </text>
- <text name="wmiNightVisionNoiseStrengthText">
- Ruissterkte
- </text>
- </panel>
- <panel label="Bloom" name="wmiBloomPanel">
- <check_box label="Inschakelen" name="wmiBloomToggle"/>
- <text name="wmiBloomExtractText">
- Lichtsterkte extractie
- </text>
- <text name="wmiBloomSizeText">
- Bloom-grootte
- </text>
- <text name="wmiBloomStrengthText">
- Bloom-sterkte
- </text>
- </panel>
- <panel label="Extra&apos;s" name="Extras">
- <button label="LaadEffect" label_selected="LaadEffect" name="PPLoadEffect"/>
- <button label="Effect opslaan" label_selected="Effect opslaan" name="PPSaveEffect"/>
- <line_editor label="Effectnaam" name="PPEffectNameEditor"/>
- </panel>
- </tab_container>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_postcard.xml b/indra/newview/skins/default/xui/nl/floater_postcard.xml
deleted file mode 100644
index c2d092fdd4..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_postcard.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Postcard" title="EMAIL FOTO">
- <text name="to_label">
- Ontvanger e-mail:
- </text>
- <text name="from_label">
- Uw e-mail:
- </text>
- <text name="name_label">
- Uw naam:
- </text>
- <text name="subject_label">
- Onderwerp:
- </text>
- <line_editor label="Type hier uw onderwerp." name="subject_form"/>
- <text name="msg_label">
- Bericht:
- </text>
- <text_editor name="msg_form">
- Type hier uw bericht.
- </text_editor>
- <text name="fine_print">
- Indien uw ontvanger deelneemt aan SL, zult u een verwijzingsbonus ontvangen.
- </text>
- <button label="Annuleren" name="cancel_btn"/>
- <button label="Verzenden" name="send_btn"/>
- <string name="default_subject">
- Ansichtkaart uit [SECOND_LIFE]
- </string>
- <string name="default_message">
- Kom dit zien!
- </string>
- <string name="upload_message">
- Verzenden...
- </string>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_preferences.xml b/indra/newview/skins/default/xui/nl/floater_preferences.xml
deleted file mode 100644
index 6fc8005fd2..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_preferences.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Preferences" title="VOORKEUREN">
- <button label="OK" label_selected="OK" name="OK"/>
- <button label="Annuleren" label_selected="Annuleren" name="Cancel"/>
- <button label="Toepassen" label_selected="Toepassen" name="Apply"/>
- <button label="Over" label_selected="Over" name="About..."/>
- <button label="Help" label_selected="Help" name="Help"/>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_preview_animation.xml b/indra/newview/skins/default/xui/nl/floater_preview_animation.xml
deleted file mode 100644
index 0634452d96..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_preview_animation.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="preview_anim">
- <text name="desc txt">
- Omschrijving:
- </text>
- <button label="Afspelen in wereld" label_selected="Stop" name="Anim play btn" tool_tip="Speel deze animatie af, zodat anderen hem kunnen zien." width="120"/>
- <button label="Lokaal afspelen" label_selected="Stop" name="Anim audition btn" tool_tip="Speel deze animatie af, zodat alleen u hem kunt zien." width="110"/>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_preview_gesture.xml b/indra/newview/skins/default/xui/nl/floater_preview_gesture.xml
deleted file mode 100644
index c6b301841a..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_preview_gesture.xml
+++ /dev/null
@@ -1,58 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="gesture_preview">
- <string name="stop_txt">
- Stop
- </string>
- <string name="preview_txt">
- Voorbeeld
- </string>
- <string name="none_text">
- -- Geen --
- </string>
- <text name="desc_label">
- Omschrijving:
- </text>
- <text name="trigger_label">
- Trigger:
- </text>
- <text name="replace_text" tool_tip="Vervang de startseinwoorden door deze woorden. Bijvoorbeeld, startsein &apos;hallo&apos; vervang door &apos;hoi&apos; zal de chat &apos;Ik wilde hallo zeggen&apos; veranderen in &apos;Ik wilde hoi zeggen&apos;, waarbij tevens het gebaar afgespeeld zal worden!">
- Vervangen door:
- </text>
- <line_editor name="replace_editor" tool_tip="Vervang de startseinwoorden door deze woorden. Bijvoorbeeld, startsein &apos;hallo&apos; vervang door &apos;hoi&apos; zal de chat &apos;Ik wilde hallo zeggen&apos; veranderen in &apos;Ik wilde hoi zeggen&apos;, waarbij tevens het gebaar afgespeeld zal worden."/>
- <text name="key_label">
- Snelkoppeling toets:
- </text>
- <combo_box label="Geen" name="modifier_combo" left="136" width="56"/>
- <combo_box label="Geen" name="key_combo" width="56"/>
- <text name="library_label">
- Bibliotheek:
- </text>
- <text name="steps_label">
- Stappen:
- </text>
- <scroll_list name="library_list" width="94">
- Animatie
-Geluid
-Chat
-Wacht
- </scroll_list>
- <button label="Toevoegen &gt;&gt;" name="add_btn" left="124" width="87"/>
- <button label="Beweeg omhoog" name="up_btn" width="106" left_delta="-9"/>
- <button label="Beweeg omlaag" name="down_btn" width="106"/>
- <button label="Verwijderen" name="delete_btn" width="84" left_delta="9"/>
- <scroll_list left="226" name="step_list" width="205" />
- <text name="help_label">
- Alle stappen gebeuren tegelijkertijd,
-tenzij u wachtstappen toevoegt.
- </text>
- <text left="230" name="options_text" width="200" />
- <radio_group name="animation_trigger_type">
- <radio_item name="start" label="Start" />
- <radio_item name="stop" label="Stop" />
- </radio_group>
- <check_box label="tot alle animaties zijn afgelopen" name="wait_anim_check"/>
- <check_box label="tijd in seconden" name="wait_time_check"/>
- <check_box label="Actief" name="active_check" tool_tip="Actieve gebaren kunnen worden gestart door het zeggen van hun startseinwoorden of door het indrukken van hun sneltoetsen. Gebaren worden gewoonlijk inactief wanneer er een conflict is in de koppeling van de sneltoetsen"/>
- <button label="Voorbeeld" name="preview_btn"/>
- <button label="Opslaan" name="save_btn"/>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_preview_notecard.xml b/indra/newview/skins/default/xui/nl/floater_preview_notecard.xml
deleted file mode 100644
index f97d1fe6ba..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_preview_notecard.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="preview notecard" title="NEUS">
- <button label="Opslaan" label_selected="Opslaan" name="Save"/>
- <text name="desc txt">
- Omschrijving:
- </text>
- <text_editor name="Notecard Editor">
- Laden…
- </text_editor>
- <string name="no_object">
- Kan object dat deze notitie bevat niet vinden.
- </string>
- <string name="not_allowed">
- U heeft geen toestemming om deze notitie te bekijken
- </string>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_preview_sound.xml b/indra/newview/skins/default/xui/nl/floater_preview_sound.xml
deleted file mode 100644
index f168f3ed32..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_preview_sound.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="preview_sound">
- <text name="desc txt">
- Omschrijving:
- </text>
- <button label="Lokaal afspelen" label_selected="Lokaal afspelen" name="Sound audition btn" tool_tip="Speel dit geluid of zodat alleen u het kunt horen."/>
- <button label="In wereld afspelen" label_selected="In wereld afspelen" name="Sound play btn" tool_tip="Speel dit geluid of zodat anderen het kunnen horen."/>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_preview_texture.xml b/indra/newview/skins/default/xui/nl/floater_preview_texture.xml
deleted file mode 100644
index c4a06b7b6f..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_preview_texture.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="preview_texture">
- <text name="desc txt">
- Omschrijving:
- </text>
- <text name="dimensions">
- Afmetingen: [WIDTH] x [HEIGHT]
- </text>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_region_info.xml b/indra/newview/skins/default/xui/nl/floater_region_info.xml
deleted file mode 100644
index 0a98da3b4e..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_region_info.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="regioninfo" title="REGIO/ESTATE"/>
diff --git a/indra/newview/skins/default/xui/nl/floater_report_abuse.xml b/indra/newview/skins/default/xui/nl/floater_report_abuse.xml
deleted file mode 100644
index a50773c2b3..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_report_abuse.xml
+++ /dev/null
@@ -1,103 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_report_abuse" title="MISBRUIK RAPPORTEREN">
- <floater.string name="Screenshot">
- Schermafbeelding
- </floater.string>
- <check_box label="Gebruik deze schermafbeelding" name="screen_check"/>
- <text name="reporter_title" width="110">
- Rapporteur:
- </text>
- <text left_delta="70" name="reporter_field">
- Loremipsum Dolorsitamut Longnamez
- </text>
- <text name="sim_title">
- Regio:
- </text>
- <text left_delta="70" name="sim_field">
- Regionaam
- </text>
- <text name="pos_title">
- Positie:
- </text>
- <text left_delta="70" name="pos_field">
- {128.1, 128.1, 15.4}
- </text>
- <text name="select_object_label">
- Klik de knop, vervolgens het misbruik voorwerp:
- </text>
- <button label="" label_selected="" name="pick_btn" tool_tip="Objectkiezer - Identificeer een object als het onderwerp van dit rapport"/>
- <text name="object_name_label">
- voorwerp:
- </text>
- <text name="object_name" width="120">
- Consetetur Sadipscing
- </text>
- <text name="owner_name_label">
- Eigenaar:
- </text>
- <text name="owner_name">
- Hendrerit Vulputate Kamawashi Longname
- </text>
- <combo_box name="category_combo" tool_tip="Categorie -- selecteer de categorie die dit rapport het best beschrijft">
- <combo_box.item label="Selecteer categorie" name="Select_category"/>
- <combo_box.item label="Leeftijd &gt; Leeftijd spelen" name="Age__Age_play"/>
- <combo_box.item label="Leeftijd &gt; Volwassen inwoner in Teen Second Life" name="Age__Adult_resident_on_Teen_Second_Life"/>
- <combo_box.item label="Leeftijd &gt; Minderjarige inwoner buiten Teen Second Life" name="Age__Underage_resident_outside_of_Teen_Second_Life"/>
- <combo_box.item label="Aanval &gt; Gevechtszandbak / onveilig gebied" name="Assault__Combat_sandbox___unsafe_area"/>
- <combo_box.item label="Aanval &gt; Veilig gebied" name="Assault__Safe_area"/>
- <combo_box.item label="Aanval &gt; Zandbak voor het testen van wapens" name="Assault__Weapons_testing_sandbox"/>
- <combo_box.item label="Handel &gt; Product of dienst is niet geleverd" name="Commerce__Failure_to_deliver_product_or_service"/>
- <combo_box.item label="Openbaring &gt; Echte wereld informatie" name="Disclosure__Real_world_information"/>
- <combo_box.item label="Openbaring &gt; Op afstand chat afluisteren" name="Disclosure__Remotely_monitoring chat"/>
- <combo_box.item label="Openbaring &gt; Second Life informatie/chat/IMs" name="Disclosure__Second_Life_information_chat_IMs"/>
- <combo_box.item label="Vredebreuk &gt; Oneerlijk gebruik van regiomiddelen" name="Disturbing_the_peace__Unfair_use_of_region_resources"/>
- <combo_box.item label="Vredebreuk &gt; Excessieve gescripte objecten" name="Disturbing_the_peace__Excessive_scripted_objects"/>
- <combo_box.item label="Vredebreuk &gt; Objecten laten rondslingeren" name="Disturbing_the_peace__Object_littering"/>
- <combo_box.item label="Vredebreuk &gt; Herhaalde spam" name="Disturbing_the_peace__Repetitive_spam"/>
- <combo_box.item label="Vredebreuk &gt; Ongewenste reclame-spam" name="Disturbing_the_peace__Unwanted_advert_spam"/>
- <combo_box.item label="Fraude &gt; L$" name="Fraud__L$"/>
- <combo_box.item label="Fraude &gt; Land" name="Fraud__Land"/>
- <combo_box.item label="Fraude &gt; Piramideschema of kettingbrief" name="Fraud__Pyramid_scheme_or_chain_letter"/>
- <combo_box.item label="Fraude &gt; US$" name="Fraud__US$"/>
- <combo_box.item label="Intimidatie &gt; Reclameverzamelingen / visuele spam" name="Harassment__Advert_farms___visual_spam"/>
- <combo_box.item label="Intimidatie &gt; Individuen of groepen in diskrediet brengen" name="Harassment__Defaming_individuals_or_groups"/>
- <combo_box.item label="Intimidatie &gt; Beweging verhinderen" name="Harassment__Impeding_movement"/>
- <combo_box.item label="Intimidatie &gt; Seksuele intimidatie" name="Harassment__Sexual_harassment"/>
- <combo_box.item label="Intimidatie &gt; Anderen uitnodigen/aanzetten tot het schenden van de ToS" name="Harassment__Solicting_inciting_others_to_violate_ToS"/>
- <combo_box.item label="Intimidatie &gt; Verbaal misbruik" name="Harassment__Verbal_abuse"/>
- <combo_box.item label="Onfatsoenlijkheid &gt; Globaal beledigende inhoud of gedrag" name="Indecency__Broadly_offensive_content_or_conduct"/>
- <combo_box.item label="Onfatsoenlijkheid &gt; Ongepaste avatar naam" name="Indecency__Inappropriate_avatar_name"/>
- <combo_box.item label="Onfatsoenlijkheid &gt; Ongepaste inhoud of gedrag in een PG regio" name="Indecency__Mature_content_in_PG_region"/>
- <combo_box.item label="Onfatsoenlijkheid &gt; Ongepaste inhoud of gedrag in een Mature regio" name="Indecency__Inappropriate_content_in_Mature_region"/>
- <combo_box.item label="Inbreuk op intellectueel eigendom &gt; Verwijderen van inhoud" name="Intellectual_property_infringement_Content_Removal"/>
- <combo_box.item label="Inbreuk op intellectueel eigendom &gt; CopyBot of misbruik van permissies" name="Intellectual_property_infringement_CopyBot_or_Permissions_Exploit"/>
- <combo_box.item label="Intolerantie" name="Intolerance"/>
- <combo_box.item label="Land &gt; Misbruik van zandbakmiddelen" name="Land__Abuse_of_sandbox_resources"/>
- <combo_box.item label="Land &gt; Indringing &gt; Objecten/texturen" name="Land__Encroachment__Objects_textures"/>
- <combo_box.item label="Land &gt; Indringing &gt; Particles" name="Land__Encroachment__Particles"/>
- <combo_box.item label="Land &gt; Indringing &gt; Bomen/planten" name="Land__Encroachment__Trees_plants"/>
- <combo_box.item label="Weddenschappen/gokken" name="Wagering_gambling"/>
- <combo_box.item label="Anders" name="Other"/>
- </combo_box>
- <text name="abuser_name_title">
- Misbruikernaam:
- </text>
- <button label="Kies inwoner" label_selected="" name="select_abuser" tool_tip="Selecteer de naam van de misbruiker uit een lijst"/>
- <text name="abuser_name_title2">
- Locatie van misbruik:
- </text>
- <text name="sum_title">
- Samenvatting:
- </text>
- <text name="dscr_title">
- Details:
- </text>
- <text name="bug_aviso">
- Wees zo specifiek mogelijk
- </text>
- <text name="incomplete_title">
- Let Op: Onvolledige verslagen zullen niet worden onderzocht
- </text>
- <button label="Misbruik rapporteren" label_selected="Misbruik rapporteren" name="send_btn"/>
- <button label="Annuleren" label_selected="Annuleren" name="cancel_btn"/>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_script_debug.xml b/indra/newview/skins/default/xui/nl/floater_script_debug.xml
deleted file mode 100644
index 15e57f30d6..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_script_debug.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<multi_floater name="script debug floater" title="Script waarschuwing/fout">
- <tab_container name="Preview Tabs">
- <floater label="Script" name="all_scripts" title="[ALL SCRIPTS]"/>
- </tab_container>
-</multi_floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_script_preview.xml b/indra/newview/skins/default/xui/nl/floater_script_preview.xml
deleted file mode 100644
index bd57e27b77..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_script_preview.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="preview lsl text" title="SCRIPT: ROTATIESCRIPT">
- <text name="desc txt">
- Omschrijving:
- </text>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_script_queue.xml b/indra/newview/skins/default/xui/nl/floater_script_queue.xml
deleted file mode 100644
index f79ad8faf3..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_script_queue.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="queue" title="VOORTGANG OPNIEUW INSTELLEN">
- <button label="Sluiten" label_selected="Sluiten" name="close"/>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_script_search.xml b/indra/newview/skins/default/xui/nl/floater_script_search.xml
deleted file mode 100644
index cf502c6f4d..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_script_search.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="script search" title="SCRIPT ZOEKEN">
- <check_box label="Niet hoofdlettergevoelig" name="case_text"/>
- <button label="Zoeken" label_selected="Zoeken" name="search_btn" left="4"/>
- <button label="Vervangen" label_selected="Vervangen" name="replace_btn" left="100"/>
- <button label="Alles vervangen" label_selected="Alles vervangen" name="replace_all_btn" width="100" left="196"/>
- <text name="txt">
- Zoeken
- </text>
- <text name="txt2" width="130">
- Vervangen
- </text>
- <line_editor left="65" name="search_text" width="230" />
- <line_editor left="65" name="replace_text" width="230" />
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_select_key.xml b/indra/newview/skins/default/xui/nl/floater_select_key.xml
deleted file mode 100644
index c8daa10ab6..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_select_key.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="modal container" title="">
- <button label="Annuleren" label_selected="Annuleren" name="Cancel"/>
- <text name="Save item as:" left="12" width="220">
- Druk op een toets om die te selecteren
- </text>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_sell_land.xml b/indra/newview/skins/default/xui/nl/floater_sell_land.xml
deleted file mode 100644
index 468a383cfc..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_sell_land.xml
+++ /dev/null
@@ -1,65 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="sell land" title="VERKOOP LAND">
- <scroll_container name="profile_scroll">
- <panel name="scroll_content_panel">
- <text name="info_parcel_label">
- Perceel:
- </text>
- <text name="info_parcel">
- PERCEEL NAAM
- </text>
- <text name="info_size_label">
- Grootte:
- </text>
- <text name="info_size">
- [AREA] m²
- </text>
- <text height="28" name="info_action" bottom_delta="-57">
- Om dit perceel te
-verkopen:
- </text>
- <icon bottom_delta="-86" name="step_price" />
- <text name="price_label">
- Stel een prijs in:
- </text>
- <text name="price_text">
- Kies een geschikte prijs voor dit land.
- </text>
- <text name="price_ld">
- L$
- </text>
- <text name="price_per_m">
- (L$[PER_METER] per vierkante meter)
- </text>
- <text name="sell_to_label">
- Verkoop het land aan:
- </text>
- <text name="sell_to_text">
- Kies of u aan iedereen wil verkopen of een specifieke koper.
- </text>
- <combo_box name="sell_to">
- <combo_box.item name="--selectone--" label="selecteer een --"/>
- <combo_box.item name="Anyone" label="Iedereen"/>
- <combo_box.item name="Specificuser:" label="Specifieke gebruiker:"/>
- </combo_box>
- <button label="Selecteren..." name="sell_to_select_agent"/>
- <text name="sell_objects_label">
- Verkoop de objecten samen met het land?
- </text>
- <text name="sell_objects_text">
- Overdraagbare objecten die eigendom zijn van de landeigenaar
-zullen van eigenaar veranderen.
- </text>
- <radio_group name="sell_objects" bottom_delta="-58">
- <radio_item name="no" label="Nee, behoud het eigendom van objecten" />
- <radio_item name="yes" label="Ja, verkoop objecten met het land" />
- </radio_group>
- <button label="Toon objecten" name="show_objects"/>
- <text name="nag_message_label">
- ONTHOUD: Alle verkopen zijn definitief.
- </text>
- <button label="Zet het land te koop" name="sell_btn"/>
- <button label="Annuleren" name="cancel_btn"/>
- </panel>
- </scroll_container>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_settings_debug.xml b/indra/newview/skins/default/xui/nl/floater_settings_debug.xml
deleted file mode 100644
index 4d95f0a828..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_settings_debug.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="settings_debug" title="DEBUG INSTELLINGEN">
- <combo_box name="boolean_combo">
- <combo_box.item name="TRUE" label="TRUE"/>
- <combo_box.item name="FALSE" label="FALSE"/>
- </combo_box>
- <color_swatch label="Kleur" name="color_swatch"/>
- <spinner label="x" name="val_spinner_1"/>
- <spinner label="x" name="val_spinner_2"/>
- <spinner label="x" name="val_spinner_3"/>
- <spinner label="x" name="val_spinner_4"/>
- <button label="Opnieuw instellen naar standaard" name="default_btn" width="210"/>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_snapshot.xml b/indra/newview/skins/default/xui/nl/floater_snapshot.xml
deleted file mode 100644
index 251f3690da..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_snapshot.xml
+++ /dev/null
@@ -1,79 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Snapshot" title="FOTOVOORBEELD">
- <text name="type_label">
- Fotobestemming
- </text>
- <radio_group label="Fototype" name="snapshot_type_radio">
- <radio_item name="postcard" label="Verzend via e-mail" />
- <radio_item name="texture" label="Opslaan in uw inventaris (L$[AMOUNT])" />
- <radio_item name="local" label="Opslaan op uw harde schijf" />
- </radio_group>
- <text name="file_size_label">
- Bestandsgrootte: [SIZE] KB
- </text>
- <button label="Ververs foto" name="new_snapshot_btn"/>
- <button label="Verzenden" name="send_btn"/>
- <button label="Opslaan (L$[AMOUNT])" name="upload_btn"/>
- <flyout_button label="Opslaan" name="save_btn" tool_tip="Afbeelding in een bestand opslaan">
- <flyout_button_item name="save_item" label="Opslaan"/>
- <flyout_button_item name="saveas_item" label="Opslaan als..."/>
- </flyout_button>
- <button label="Annuleren" name="discard_btn"/>
- <button label="Meer &gt;&gt;" name="more_btn" tool_tip="Geavanceerde opties"/>
- <button label="&lt;&lt; Minder" name="less_btn" tool_tip="Geavanceerde opties"/>
- <text name="type_label2">
- Grootte
- </text>
- <text name="format_label">
- Formaat
- </text>
- <combo_box label="Resolutie" name="postcard_size_combo">
- <combo_box.item name="CurrentWindow" label="Huidig venster"/>
- <combo_box.item name="640x480" label="640x480"/>
- <combo_box.item name="800x600" label="800x600"/>
- <combo_box.item name="1024x768" label="1024x768"/>
- <combo_box.item name="Custom" label="Aangepast"/>
- </combo_box>
- <combo_box label="Resolutie" name="texture_size_combo">
- <combo_box.item name="CurrentWindow" label="Huidig venster"/>
- <combo_box.item name="Small(128x128)" label="Klein (128x128)"/>
- <combo_box.item name="Medium(256x256)" label="Middel (256x256)"/>
- <combo_box.item name="Large(512x512)" label="Groot (512x512)"/>
- <combo_box.item name="Custom" label="Aangepast"/>
- </combo_box>
- <combo_box label="Resolutie" name="local_size_combo">
- <combo_box.item name="CurrentWindow" label="Huidig venster"/>
- <combo_box.item name="320x240" label="320x240"/>
- <combo_box.item name="640x480" label="640x480"/>
- <combo_box.item name="800x600" label="800x600"/>
- <combo_box.item name="1024x768" label="1024x768"/>
- <combo_box.item name="1280x1024" label="1280x1024"/>
- <combo_box.item name="1600x1200" label="1600x1200"/>
- <combo_box.item name="Custom" label="Aangepast"/>
- </combo_box>
- <combo_box label="Formaat" name="local_format_combo">
- <combo_box.item name="PNG" label="PNG"/>
- <combo_box.item name="JPEG" label="JPEG"/>
- <combo_box.item name="BMP" label="BMP"/>
- </combo_box>
- <spinner label="Breedte" name="snapshot_width" label_width="48" width="100"/>
- <spinner label="Hoogte" name="snapshot_height" label_width="41" width="95" left="114"/>
- <check_box label="Beperk verhoudingen" name="keep_aspect_check"/>
- <slider label="Afbeeldingkwaliteit" name="image_quality_slider"/>
- <text name="layer_type_label" width="100">
- Vastleggen:
- </text>
- <combo_box label="Afbeeldingslagen" name="layer_types" width="130" left="76">
- <combo_box.item name="Colors" label="Kleuren"/>
- <combo_box.item name="Depth" label="Diepte"/>
- <combo_box.item name="ObjectMattes" label="Object matheid"/>
- </combo_box>
- <check_box label="Toon interface in foto" name="ui_check"/>
- <check_box label="Toon HUD objecten in foto" name="hud_check"/>
- <check_box label="Open houden na opslaan" name="keep_open_check"/>
- <check_box label="Frame bevriezen" name="freeze_frame_check"/>
- <check_box label="Automatisch verversen" name="auto_snapshot_check"/>
- <string name="unknown">
- onbekend
- </string>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_sound_preview.xml b/indra/newview/skins/default/xui/nl/floater_sound_preview.xml
deleted file mode 100644
index 13cb832d57..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_sound_preview.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Sound Preview" title="SOUND.WAV">
- <text name="name_label">
- Naam:
- </text>
- <text name="description_label">
- Omschrijving:
- </text>
- <button label="Annuleren" label_selected="Annuleren" name="cancel_btn"/>
- <button label="Upload (L$[AMOUNT])" label_selected="Upload (L$[AMOUNT])" name="ok_btn"/>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_stats.xml b/indra/newview/skins/default/xui/nl/floater_stats.xml
deleted file mode 100644
index 0db3f76735..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_stats.xml
+++ /dev/null
@@ -1,71 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Statistics" title="STATISTIEKEN">
- <scroll_container name="statistics_scroll">
- <container_view name="statistics_view">
- <stat_view label="Basis" name="basic">
- <stat_bar label="FPS" name="fps"/>
- <stat_bar label="Bandbreedte" name="bandwidth"/>
- <stat_bar label="Pakket Verlies" name="packet_loss"/>
- <stat_bar label="Ping Sim" name="ping"/>
- </stat_view>
- <stat_view label="Geavanceerd" name="advanced">
- <stat_view label="Weergeven" name="render">
- <stat_bar label="KTris Tekenen" name="ktrisframe"/>
- <stat_bar label="KTris Tekenen" name="ktrissec"/>
- <stat_bar label="Totaal Voorwerpen" name="objs"/>
- <stat_bar label="Nieuwe Voorwerpen" name="newobjs"/>
- </stat_view>
- <stat_view label="Textuur" name="texture">
- <stat_bar label="Count" name="numimagesstat"/>
- <stat_bar label="Raw Count" name="numrawimagesstat"/>
- <stat_bar label="GL Mem" name="gltexmemstat"/>
- <stat_bar label="Formatted Mem" name="formattedmemstat"/>
- <stat_bar label="Raw Mem" name="rawmemstat"/>
- <stat_bar label="Bound Mem" name="glboundmemstat"/>
- </stat_view>
- <stat_view label="Netwerk" name="network">
- <stat_bar label="Pakketten In" name="packetsinstat"/>
- <stat_bar label="Pakketten Uit" name="packetsoutstat"/>
- <stat_bar label="Voorwerpen" name="objectkbitstat"/>
- <stat_bar label="Textuur" name="texturekbitstat"/>
- <stat_bar label="Bezit" name="assetkbitstat"/>
- <stat_bar label="Lagen" name="layerskbitstat"/>
- <stat_bar label="Daadwerkelijk In" name="actualinkbitstat"/>
- <stat_bar label="Daadwerkelijk Out" name="actualoutkbitstat"/>
- <stat_bar label="VFS Pending Ops" name="vfspendingoperations"/>
- </stat_view>
- </stat_view>
- <stat_view label="Simulator" name="sim">
- <stat_bar label="Tijd Dilatatie" name="simtimedilation"/>
- <stat_bar label="Sim FPS" name="simfps"/>
- <stat_bar label="Physics FPS" name="simphysicsfps"/>
- <stat_view label="Physics Details" name="physicsdetail">
- <stat_bar label="Pinned Objects" name="physicspinnedtasks"/>
- <stat_bar label="Low LOD Objects" name="physicslodtasks"/>
- <stat_bar label="Memory Allocated" name="physicsmemoryallocated"/>
- <stat_bar label="Agent Updates/Sec" name="simagentups"/>
- <stat_bar label="Main Agents" name="simmainagents"/>
- <stat_bar label="Child Agents" name="simchildagents"/>
- <stat_bar label="Voorwerpen" name="simobjects"/>
- <stat_bar label="Actieve Voorwerpen" name="simactiveobjects"/>
- <stat_bar label="Actieve Scripts" name="simactivescripts"/>
- <stat_bar label="Actieve Evenementen" name="simscripteps"/>
- <stat_bar label="Pakketten In" name="siminpps"/>
- <stat_bar label="Pakketten Uit" name="simoutpps"/>
- <stat_bar label="Wachtende Downloads" name="simpendingdownloads"/>
- <stat_bar label="Wachtende Uploads" name="simpendinguploads"/>
- <stat_bar label="Total Unacked Bytes" name="simtotalunackedbytes"/>
- </stat_view>
- <stat_view label="Tijd (ms)" name="simperf">
- <stat_bar label="Totale Frame Tijd" name="simframemsec"/>
- <stat_bar label="Net Time" name="simnetmsec"/>
- <stat_bar label="Physics Time" name="simsimphysicsmsec"/>
- <stat_bar label="Simulatie Tijd" name="simsimothermsec"/>
- <stat_bar label="Agent Tijd" name="simagentmsec"/>
- <stat_bar label="Plaatjes Tijd" name="simimagesmsec"/>
- <stat_bar label="Script Tijd" name="simscriptmsec"/>
- </stat_view>
- </stat_view>
- </container_view>
- </scroll_container>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_telehub.xml b/indra/newview/skins/default/xui/nl/floater_telehub.xml
deleted file mode 100644
index 7b745d967c..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_telehub.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="telehub" title="TELEHUB" width="292">
- <text name="status_text_connected">
- Telehub verbonden met object [OBJECT]
- </text>
- <text name="status_text_not_connected">
- Geen telehub verbonden.
- </text>
- <text name="help_text_connected">
- Om te verwijderen, klik Verbinding verbreken
- </text>
- <text name="help_text_not_connected">
- Selecteer objecten klik Verbind telehub
- </text>
- <button label="Verbind telehub" name="connect_btn"/>
- <button label="Verbinding verbreken" name="disconnect_btn" width="128"/>
- <text name="spawn_points_text">
- Spawnpunten (posities, niet objecten):
- </text>
- <scroll_list bottom_delta="-44" draw_border="true" follows="left|top"
- height="40" left="10" multi_select="false" name="spawn_points_list"
- width="230" />
-
- <button label="Spawn toevoegen" name="add_spawn_point_btn"/>
- <button label="Verwijder Spawn" name="remove_spawn_point_btn"/>
- <text name="spawn_point_help" width="290">
- Selecteer object en klik Toevoegen om positie
-te specificeren. U kunt het object daarna verplaatsen
-of verwijderen. Posities zijn relatief ten opzichte
-van het middelpunt van de telehub. Selecteer een
-item in de lijst om de positie in de wereld te tonen.
- </text>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_texture_ctrl.xml b/indra/newview/skins/default/xui/nl/floater_texture_ctrl.xml
deleted file mode 100644
index c8caa8caf4..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_texture_ctrl.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="texture picker" title="KIES: TEXTUUR">
- <string name="choose_picture">
- Klik om een afbeelding te kiezen
- </string>
- <text name="Multiple">
- Meerdere
- </text>
- <text name="unknown">
- Afmetingen: [DIMENSIONS]
- </text>
- <button label="Standaard" label_selected="Standaard" name="Default" width="70"/>
- <button label="Geen" label_selected="Geen" name="None" left="80"/>
- <button label="Blanco" label_selected="Blanco" name="Blank"/>
- <check_box label="Toon mappen" name="show_folders_check"/>
- <search_editor label="Type hier om te zoeken" name="inventory search editor"/>
- <check_box label="Direct toepassen" name="apply_immediate_check"/>
- <button label="Annuleren" label_selected="Annuleren" name="Cancel"/>
- <button label="Selecteren" label_selected="Selecteren" name="Select"/>
- <string name="pick title">
- Kies:
- </string>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_tools.xml b/indra/newview/skins/default/xui/nl/floater_tools.xml
deleted file mode 100644
index 98339383e4..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_tools.xml
+++ /dev/null
@@ -1,567 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="toolbox floater" title="" short_title="BOUWEN" height="592">
- <button label="" label_selected="" name="button focus" tool_tip="Focus"/>
- <button label="" label_selected="" name="button move" tool_tip="Verplaats"/>
- <button label="" label_selected="" name="button edit" tool_tip="Bewerk"/>
- <button label="" label_selected="" name="button create" tool_tip="Maak"/>
- <button label="" label_selected="" name="button land" tool_tip="Land"/>
- <radio_group name="focus_radio_group">
- <radio_item label="Zoom" name="radio zoom"/>
- <radio_item label="Roteren (Ctrl)" name="radio orbit"/>
- <radio_item label="Verplaatsen (Ctrl-Shift)" name="radio pan"/>
- </radio_group>
- <radio_group name="move_radio_group">
- <radio_item label="Verplaatsen" name="radio move"/>
- <radio_item label="Optillen (Ctrl)" name="radio lift"/>
- <radio_item label="Roteren (Ctrl-Shift)" name="radio spin"/>
- </radio_group>
- <radio_group name="edit_radio_group">
- <radio_item label="Positie" name="radio position"/>
- <radio_item label="Roteren (Ctrl)" name="radio rotate"/>
- <radio_item label="Uitrekken (Ctrl-Shift)" name="radio stretch"/>
- <radio_item label="Selecteer textuur" name="radio select face"/>
- </radio_group>
- <check_box label="Bewerk gekoppelde onderdelen" name="checkbox edit linked parts"/>
- <text name="text ruler mode">
- Liniaal:
- </text>
- <combo_box name="combobox grid mode">
- <combo_box.item name="World" label="Wereld"
- />
- <combo_box.item name="Local" label="Lokaal"
- />
- <combo_box.item name="Reference" label="Referentie"
- />
- </combo_box>
- <check_box left="136" name="checkbox uniform"/>
- <text name="checkbox uniform label">
- Beide zijden uitrekken
- </text>
- <check_box left="136" label="Texturen uitrekken" name="checkbox stretch textures"/>
- <check_box left="136" label="Gebruik grid" name="checkbox snap to grid"/>
- <button label="Opties..." label_selected="Opties..." name="Options..." height="18" bottom_delta="-15"/>
- <text name="text status" width="280">
- Sleep om te verplaatsen, Shift-slepen om te kopiëren
- </text>
- <button label="" label_selected="" name="ToolCube" tool_tip="Kubus"/>
- <button label="" label_selected="" name="ToolPrism" tool_tip="Prisma"/>
- <button label="" label_selected="" name="ToolPyramid" tool_tip="Piramide"/>
- <button label="" label_selected="" name="ToolTetrahedron" tool_tip="Tetrahedron"/>
- <button label="" label_selected="" name="ToolCylinder" tool_tip="Cilinder"/>
- <button label="" label_selected="" name="ToolHemiCylinder" tool_tip="Halve cilinder"/>
- <button label="" label_selected="" name="ToolCone" tool_tip="Kegel"/>
- <button label="" label_selected="" name="ToolHemiCone" tool_tip="Halve kegel"/>
- <button label="" label_selected="" name="ToolSphere" tool_tip="Bol"/>
- <button label="" label_selected="" name="ToolHemiSphere" tool_tip="Halve bol"/>
- <button label="" label_selected="" name="ToolTorus" tool_tip="Torus"/>
- <button label="" label_selected="" name="ToolTube" tool_tip="Buis"/>
- <button label="" label_selected="" name="ToolRing" tool_tip="Ring"/>
- <button label="" label_selected="" name="ToolTree" tool_tip="Boom"/>
- <button label="" label_selected="" name="ToolGrass" tool_tip="Gras"/>
- <check_box label="Behoud geselecteerd" name="checkbox sticky"/>
- <check_box label="Kopiëer Selectie" name="checkbox copy selection"/>
- <check_box label="Middelpunt" name="checkbox copy centers"/>
- <check_box label="Roteer" name="checkbox copy rotates"/>
- <radio_group name="land_radio_group">
- <radio_item label="Selecteer land" name="radio select land"/>
- <radio_item label="Vlak maken" name="radio flatten"/>
- <radio_item label="Verhogen" name="radio raise"/>
- <radio_item label="Verlagen" name="radio lower"/>
- <radio_item label="Egaliseren" name="radio smooth"/>
- <radio_item label="Opruwen" name="radio noise"/>
- <radio_item label="Herstellen" name="radio revert"/>
- </radio_group>
- <button label="Toepassen" label_selected="Toepassen" name="button apply to selection" tool_tip="Wijzig geselecteerd land"/>
- <text name="Bulldozer:">
- Bulldozer:
- </text>
- <text name="Dozer Size:">
- Grootte
- </text>
- <text name="Strength:">
- Sterkte
- </text>
- <text name="obj_count" top_pad="20">
- Geselecteerde objecten: [COUNT]
- </text>
- <text name="prim_count">
- primitieven: [COUNT]
- </text>
- <tab_container name="Object Info Tabs" tab_max_width="62" tab_min_width="30" top="185">
- <panel label="Algemeen" name="General">
- <text name="Name:">
- Naam:
- </text>
- <text name="Description:">
- Omschrijving:
- </text>
- <text name="Creator:">
- Maker:
- </text>
- <button label="Profiel..." label_selected="Profiel..." name="button creator profile"/>
- <text name="Owner:">
- Eigenaar:
- </text>
- <button label="Profiel..." label_selected="Profiel..." name="button owner profile"/>
- <text name="Group:">
- Groep:
- </text>
- <text name="Group Name Proxy">
- De Lindens
- </text>
- <button label="Instellen..." label_selected="Instellen..." name="button set group"/>
- <text name="Permissions:">
- Permissies:
- </text>
-
- <check_box label="Deel met groep" name="checkbox share with group" tool_tip="Alle leden van de ingestelde groep toestaan om te delen en uw permissies voor dit object te gebruiken. U moet &apos;Overdragen&apos; om rolbeperkingen in te schakelen."/>
- <string name="text deed continued">
- Overdragen...
- </string>
- <string name="text deed">
- Overdragen
- </string>
- <button label="Overdragen..." label_selected="Overdragen..." name="button deed" tool_tip="Groepgedeelde objecten kunnen door een groepofficier worden overgedragen"/>
- <check_box label="Iedereen mag verplaatsen" name="checkbox allow everyone move"/>
- <check_box label="Iedereen mag kopiëren" name="checkbox allow everyone copy"/>
- <check_box label="Toon in zoeken" name="search_check" tool_tip="Laat mensen dit object zien in zoekresultaten"/>
- <check_box label="Te koop" name="checkbox for sale"/>
- <text name="Cost">
- Prijs: L$
- </text>
- <combo_box name="sale type">
- <combo_box.item label="Kopie" name="Copy"/>
- <combo_box.item label="Inhoud" name="Contents"/>
- <combo_box.item label="Origineel" name="Original"/>
- </combo_box>
-
- <text name="label click action">
- Wanneer links-geklikt:
- </text>
- <combo_box name="clickaction">
- <combo_box.item name="Touch/grab(default)" label="Aanraken/pakken (standaard)"
- />
- <combo_box.item name="Sitonobject" label="Zit op object"
- />
- <combo_box.item name="Buyobject" label="Koop object"
- />
- <combo_box.item name="Payobject" label="Betaal object"
- />
- <combo_box.item name="Open" label="Open"
- />
- <combo_box.item name="Play" label="Perceelmedia afspelen"
- />
- <combo_box.item name="Opemmedia" label="Perceelmedia openen"
- />
- </combo_box>
- <panel name="perms_build">
- <text name="perm_modify">
- U kunt dit object wijzigen
- </text>
- <text name="B:">
- B:
- </text>
- <text name="O:">
- O:
- </text>
- <text name="G:">
- G:
- </text>
- <text name="E:">
- E:
- </text>
- <text name="N:">
- N:
- </text>
- <text name="F:">
- F:
- </text>
- <text name="Next owner can:">
- Volgende eigenaar kan:
- </text>
- <check_box label="Wijzigen" name="checkbox next owner can modify"/>
- <check_box label="Kopiëren" name="checkbox next owner can copy" left_delta="80"/>
- <check_box name="checkbox next owner can transfer" left_delta="67"/>
- </panel>
- <string name="text modify info 1">
- U kunt dit object wijzigen
- </string>
- <string name="text modify info 2">
- U kunt deze objecten wijzigen
- </string>
- <string name="text modify info 3">
- U kunt dit object niet wijzigen
- </string>
- <string name="text modify info 4">
- U kunt deze objecten niet wijzigen
- </string>
- <string name="text modify warning">
- U moet het hele object selecteren om permissies in te stellen
- </string>
- <string name="Cost Default">
- Prijs: L$
- </string>
- <string name="Cost Total">
- Totale Prijs: L$
- </string>
- <string name="Cost Per Unit">
- Prijs per: L$
- </string>
- <string name="Cost Mixed">
- Gemengde prijs
- </string>
- <string name="Sale Mixed">
- Gemengde verkoop
- </string>
- </panel>
- <panel label="Object" name="Object">
- <text name="select_single">
- Selecteer slechts één primitief om parameters te bewerken
- </text>
- <text name="edit_object">
- Bewerk object parameters:
- </text>
- <check_box label="Vergrendeld" name="checkbox locked" tool_tip="Voorkomt het verplaatsen of verwijderen van objecten. Regelmatig handig tijdens het bouwen om onbedoelde bewerkingen te voorkomen."/>
- <check_box label="Fysiek" name="Physical Checkbox Ctrl" tool_tip="Staat toe dat objecten geduwd worden en worden beïnvloed door de zwaartekracht"/>
- <check_box label="Tijdelijk" name="Temporary Checkbox Ctrl" tool_tip="Zorgt ervoor dat het object 1 minuut na creatie wordt verwijderd."/>
- <check_box label="Fantoom" name="Phantom Checkbox Ctrl" tool_tip="Zorgt ervoor dat objecten niet kunnen botsen met andere objecten of avatars"/>
- <text name="label position">
- Positie (meters)
- </text>
- <spinner label="X" name="Pos X"/>
- <spinner label="Y" name="Pos Y"/>
- <spinner label="Z" name="Pos Z"/>
- <text name="label size">
- Grootte (meters)
- </text>
- <spinner label="X" name="Scale X"/>
- <spinner label="Y" name="Scale Y"/>
- <spinner label="Z" name="Scale Z"/>
- <text name="label rotation">
- Rotatie (graden)
- </text>
- <spinner label="X" name="Rot X"/>
- <spinner label="Y" name="Rot Y"/>
- <spinner label="Z" name="Rot Z"/>
- <text name="label material">
- Materiaal
- </text>
- <combo_box name="material">
- <combo_box.item name="Stone" label="Steen"
- />
- <combo_box.item name="Metal" label="Metaal"
- />
- <combo_box.item name="Glass" label="Glas"
- />
- <combo_box.item name="Wood" label="Hout"
- />
- <combo_box.item name="Flesh" label="Vlees"
- />
- <combo_box.item name="Plastic" label="Plastic"
- />
- <combo_box.item name="Rubber" label="Rubber"
- />
- </combo_box>
- <text name="label basetype">
- Bouwbloktype
- </text>
- <combo_box name="comboBaseType">
- <combo_box.item name="Box" label="Kubus"
- />
- <combo_box.item name="Cylinder" label="Cilinder"
- />
- <combo_box.item name="Prism" label="Prisma"
- />
- <combo_box.item name="Sphere" label="Bol"
- />
- <combo_box.item name="Torus" label="Torus"
- />
- <combo_box.item name="Tube" label="Buis"
- />
- <combo_box.item name="Ring" label="Ring"
- />
- <combo_box.item name="Sculpted" label="Sculpted"
- />
- </combo_box>
- <text name="text cut">
- Uitsnede begin en einde
- </text>
- <spinner label="B" name="cut begin"/>
- <spinner label="E" name="cut end"/>
- <text name="text hollow">
- Hol
- </text>
- <text name="text skew">
- Verschuiven
- </text>
- <text name="Hollow Shape">
- Holtevorm
- </text>
- <combo_box name="hole">
- <combo_box.item name="Default" label="Standaard"
- />
- <combo_box.item name="Circle" label="Cirkel"
- />
- <combo_box.item name="Square" label="Vierkant"
- />
- <combo_box.item name="Triangle" label="Driehoek"
- />
- </combo_box>
- <text name="text twist">
- Verdraai begin en einde
- </text>
- <spinner label="B" name="Twist Begin"/>
- <spinner label="E" name="Twist End"/>
- <text name="scale_taper">
- Knijpen
- </text>
- <text name="scale_hole">
- Gatgrootte
- </text>
- <spinner label="X" name="Taper Scale X"/>
- <spinner label="Y" name="Taper Scale Y"/>
- <text name="text topshear">
- Bovenkant verschuiven
- </text>
- <spinner label="X" name="Shear X"/>
- <spinner label="Y" name="Shear Y"/>
- <text name="advanced_cut">
- Profielsnede begin en einde
- </text>
- <text name="advanced_dimple">
- Deuk begin en einde
- </text>
- <text name="advanced_slice">
- Uitsnede begin en einde
- </text>
- <spinner label="B" name="Path Limit Begin"/>
- <spinner label="E" name="Path Limit End"/>
- <text name="text taper2">
- Knijpen
- </text>
- <spinner label="X" name="Taper X"/>
- <spinner label="Y" name="Taper Y"/>
- <text name="text radius delta">
- Straal
- </text>
- <text name="text revolutions" width="84">
- Omwentelingen
- </text>
- <texture_picker label="Sculpt textuur" name="sculpt texture control" tool_tip="Klik om een afbeelding te kiezen"/>
- <check_box label="Spiegelen" name="sculpt mirror control" tool_tip="Spiegelt de sculpted prim om de X-as"/>
- <check_box label="Binnenstebuiten" name="sculpt invert control" tool_tip="Inverteert de normalen van de sculpted prim, zodat deze binnenstebuiten verschijnt."/>
- <text name="label sculpt type">
- Hechtingstype
- </text>
- <combo_box name="sculpt type control">
- <combo_box.item name="None" label="(geen)"
- />
- <combo_box.item name="Sphere" label="Bol"
- />
- <combo_box.item name="Torus" label="Torus"
- />
- <combo_box.item name="Plane" label="Vlak"
- />
- <combo_box.item name="Cylinder" label="Cilinder"
- />
- </combo_box>
- </panel>
- <panel label="Kenmerken" name="Features">
- <text name="select_single">
- Selecteer slechts één primitief om kenmerken te bewerken
- </text>
- <text name="edit_object">
- Bewerk objectkenmerken:
- </text>
- <check_box label="Flexibiliteit" name="Flexible1D Checkbox Ctrl" tool_tip="Staat toe dat objecten kunnen buigen om de Z-as. (alleen aan de client kant)"/>
- <spinner label="Zachtheid" name="FlexNumSections" width="143" label_width="80"/>
- <spinner label="Zwaartekracht" name="FlexGravity" width="143" label_width="80"/>
- <spinner label="Slepen" name="FlexFriction" width="143" label_width="80"/>
- <spinner label="Wind" name="FlexWind" width="143" label_width="80"/>
- <spinner label="Spanning" name="FlexTension" width="143" label_width="80"/>
- <spinner label="Kracht X" name="FlexForceX" width="143" label_width="80"/>
- <spinner label="Kracht Y" name="FlexForceY" width="143" label_width="80"/>
- <spinner label="Kracht Z" name="FlexForceZ" width="143" label_width="80"/>
- <check_box label="Licht" name="Light Checkbox Ctrl" tool_tip="Zorgt dat het object licht uitstraalt"/>
- <text name="label color">
- Kleur
- </text>
- <color_swatch label="" name="colorswatch" tool_tip="Klik om kleurkiezer to openen"/>
- <spinner label="Intensiteit" name="Light Intensity"/>
- <spinner label="Straal" name="Light Radius"/>
- <spinner label="Uitstraling" name="Light Falloff"/>
- </panel>
- <panel label="Textuur" name="Texture">
- <texture_picker label="Textuur" name="texture control" tool_tip="Klik om een afbeelding te kiezen"/>
- <color_swatch label="Kleur" name="colorswatch" tool_tip="Klik om kleurkiezer to openen"/>
- <text name="color trans" width="100">
- Transparantie %
- </text>
- <text name="glow label">
- Gloed
- </text>
- <check_box label="Volledige helderheid" name="checkbox fullbright" left_delta="-10"/>
- <text name="tex gen">
- Mapping
- </text>
- <combo_box name="combobox texgen">
- <combo_box.item name="Default" label="Standaard"
- />
- <combo_box.item name="Planar" label="Vlak"
- />
- </combo_box>
- <text name="label shininess">
- Glans
- </text>
- <combo_box name="combobox shininess">
- <combo_box.item name="None" label="Geen"
- />
- <combo_box.item name="Low" label="Laag"
- />
- <combo_box.item name="Medium" label="Middel"
- />
- <combo_box.item name="High" label="Hoog"
- />
- </combo_box>
- <text name="label bumpiness">
- Bumpiness
- </text>
- <combo_box name="combobox bumpiness">
- <combo_box.item name="None" label="Geen"
- />
- <combo_box.item name="Brightness" label="Helderheid"
- />
- <combo_box.item name="Darkness" label="Donkerheid"
- />
- <combo_box.item name="woodgrain" label="Houtnerf"
- />
- <combo_box.item name="bark" label="Schors"
- />
- <combo_box.item name="bricks" label="Stenen"
- />
- <combo_box.item name="checker" label="Dambord"
- />
- <combo_box.item name="concrete" label="Beton"
- />
- <combo_box.item name="crustytile" label="gebarsten tegels"
- />
- <combo_box.item name="cutstone" label="natuursteen"
- />
- <combo_box.item name="discs" label="schijven"
- />
- <combo_box.item name="gravel" label="grind"
- />
- <combo_box.item name="petridish" label="petrischaal"
- />
- <combo_box.item name="siding" label="wandpaneel"
- />
- <combo_box.item name="stonetile" label="plavuizen"
- />
- <combo_box.item name="stucco" label="stucwerk"
- />
- <combo_box.item name="suction" label="zuignappen"
- />
- <combo_box.item name="weave" label="weven"
- />
- </combo_box>
- <text name="tex scale">
- Herhalingen per zijde
- </text>
- <spinner label="Horizontaal (U)" name="TexScaleU"/>
- <check_box label="Omkeren" name="checkbox flip s"/>
- <spinner label="Verticaal (V)" name="TexScaleV"/>
- <check_box label="Omkeren" name="checkbox flip t"/>
- <text name="tex rotate">
- Rotatie (graden)
- </text>
- <string name="string repeats per meter">
- Herhalingen per meter
- </string>
- <string name="string repeats per face">
- Herhalingen per zijde
- </string>
- <text name="rpt">
- Herhalingen per m
- </text>
- <button label="Toepassen" label_selected="Toepassen" name="button apply"/>
- <text name="tex offset">
- Verplaatsing
- </text>
- <spinner label="Horizontaal (U)" name="TexOffsetU"/>
- <spinner label="Verticaal (V)" name="TexOffsetV"/>
- <text name="textbox autofix">
- Mediatextuur uitlijnen
-(moet eerst laden)
- </text>
- <button label="Uitlijnen" label_selected="Uitlijnen" name="button align" left="155" />
- </panel>
- <panel label="Inhoud" name="Contents">
- <button label="Nieuw script" label_selected="Nieuw script" name="button new script"/>
- <button label="Permissies" name="button permissions"/>
- <panel name="ContentsInventory" width="272" />
- </panel>
- </tab_container>
- <panel name="land info panel">
- <text name="label_parcel_info">
- Perceel Informatie
- </text>
- <text name="label_area_price">
- Prijs: L$[PRICE] voor [AREA] m².
- </text>
- <text name="label_area">
- Gebied: [AREA] m².
- </text>
- <button label="Over land..." label_selected="Over land..." name="button about land"/>
- <check_box label="Toon Eigenaren" name="checkbox show owners" tool_tip="Kleur percelen op basis van hun eigendom: &#10;&#10;Groen = Uw land &#10;Aqua = Land van uw groep &#10;Rood = Eigendom van anderen &#10;Geel = Te koop &#10;Paars = Ter veiling &#10;Grijs = Openbaar"/>
- <button label="?" label_selected="?" name="button show owners help" left_delta="105"/>
- <text name="label_parcel_modify">
- Wijzig Perceel
- </text>
- <button label="Opdelen" label_selected="Opdelen" name="button subdivide land"/>
- <button label="Samenvoegen" label_selected="Samenvoegen" name="button join land"/>
- <text name="label_parcel_trans">
- Landtransacties
- </text>
- <button label="Koop land" label_selected="Koop land" name="button buy land"/>
- <button label="Land Afstaan" label_selected="Land Afstaan" name="button abandon land"/>
- </panel>
- <floater.string name="status_rotate">
- Sleep de gekleurde banden om het object te roteren
- </floater.string>
- <floater.string name="status_scale">
- Klik en sleep om de geselecteerde zijde uit te rekken.
- </floater.string>
- <floater.string name="status_move">
- Sleep om te verplaatsen, Shift-slepen om te kopiëren
- </floater.string>
- <floater.string name="status_modifyland">
- Klik en houd vast om land te wijzigen
- </floater.string>
- <floater.string name="status_camera">
- Klik en sleep om beeld te wijzigen
- </floater.string>
- <floater.string name="status_grab">
- Sleep om te verplaatsen, Ctrl om op te tillen, Ctrl-Shift om te roteren.
- </floater.string>
- <floater.string name="status_place">
- Klik in-wereld om te bouwen
- </floater.string>
- <floater.string name="status_selectland">
- Klik en sleep om land te selecteren
- </floater.string>
- <floater.string name="grid_screen_text">
- Scherm
- </floater.string>
- <floater.string name="grid_local_text">
- Lokaal
- </floater.string>
- <floater.string name="grid_world_text">
- Wereld
- </floater.string>
- <floater.string name="grid_reference_text">
- Referentie
- </floater.string>
- <floater.string name="grid_attachment_text">
- Bevestiging
- </floater.string>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_top_objects.xml b/indra/newview/skins/default/xui/nl/floater_top_objects.xml
deleted file mode 100644
index 2bbb701df8..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_top_objects.xml
+++ /dev/null
@@ -1,55 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="top_objects" title="LADEN…">
- <text name="title_text">
- Laden…
- </text>
- <scroll_list name="objects_list">
- <column label="Score" name="score" width="84"/>
- <column label="Naam" name="name" width="84"/>
- <column label="Eigenaar" name="owner" width="84"/>
- <column label="Locatie" name="location" width="84"/>
- <column label="Tijd" name="time" width="84"/>
- <column label="Mono tijd" name="mono_time" width="84"/>
- </scroll_list>
- <text name="id_text" left="2">
- Object ID:
- </text>
- <button label="Toon baken" name="show_beacon_btn"/>
- <text name="obj_name_text" left="2">
- Object naam:
- </text>
- <button label="Filter" name="filter_object_btn"/>
- <text name="owner_name_text" left="2">
- Eigenaar naam:
- </text>
- <button label="Filter" name="filter_owner_btn"/>
- <button label="Geselecteerde retourneren" name="return_selected_btn" width="170"/>
- <button label="Alles retourneren" name="return_all_btn" left="190"/>
- <button label="Geselecteerde uitschakelen" name="disable_selected_btn" width="170"/>
- <button label="Alles uitschakelen" name="disable_all_btn" left="190"/>
- <button label="Verversen" name="refresh_btn"/>
- <string name="top_scripts_title">
- Top scripts
- </string>
- <string name="top_scripts_text">
- [COUNT] scripts besteden in totaal [TIME] ms
- </string>
- <string name="scripts_score_label">
- Tijd
- </string>
- <string name="scripts_mono_time_label">
- Mono tijd
- </string>
- <string name="top_colliders_title">
- Top botsingen
- </string>
- <string name="top_colliders_text">
- Top [COUNT] objecten die veel mogelijke botsingen ervaren.
- </string>
- <string name="colliders_score_label">
- Score
- </string>
- <string name="none_descriptor">
- Geen gevonden.
- </string>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_tos.xml b/indra/newview/skins/default/xui/nl/floater_tos.xml
deleted file mode 100644
index d71412664c..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_tos.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="modal container" title="">
- <button label="Doorgaan" label_selected="Doorgaan" name="Continue"/>
- <button label="Annuleren" label_selected="Annuleren" name="Cancel"/>
- <check_box label="Ik ga akkoord met de voorwaarden van service" name="agree_chk"/>
- <text name="tos_heading">
- Leest u alstublieft de volgende voorwaarden van service door. Om door te gaan met inloggen in
-[SECOND_LIFE] dient u de overeenkomst te accepteren.
- </text>
- <text_editor name="tos_text">
- TOS_TEXT
- </text_editor>
- <string name="real_url">
- http://secondlife.com/app/tos/
- </string>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_url_entry.xml b/indra/newview/skins/default/xui/nl/floater_url_entry.xml
deleted file mode 100644
index 6926f09390..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_url_entry.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="url_entry" title="">
- <text name="media_label">
- Media URL:
- </text>
- <button label="OK" name="ok_btn"/>
- <button label="Annuleren" name="cancel_btn" width="80"/>
- <button label="Leegmaken" name="clear_btn" width="80"/>
- <text name="loading_label">
- Laden…
- </text>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_world_map.xml b/indra/newview/skins/default/xui/nl/floater_world_map.xml
deleted file mode 100644
index 2fee2ecf05..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_world_map.xml
+++ /dev/null
@@ -1,54 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="worldmap" title="WERELDKAART">
- <tab_container name="maptab">
- <panel label="Objecten" name="objects_mapview"/>
- <panel label="Terrein" name="terrain_mapview"/>
- </tab_container>
- <text name="you_label">
- U
- </text>
- <icon left="1058" name="home"/>
- <text name="home_label">
- Thuis
- </text>
- <text name="auction_label">
- Veiling
- </text>
- <text name="land_for_sale_label">
- Land te koop
- </text>
- <button width="122" left="1116" label="Ga naar Thuislocatie" label_selected="Ga naar Thuislocatie" name="Go Home" tool_tip="Teleport naar uw thuislocatie"/>
- <check_box label="Inwoner" name="people_chk"/>
- <check_box label="Infohub" name="infohub_chk"/>
- <check_box label="Telehub" name="telehubchk"/>
- <check_box label="Land te koop" name="land_for_sale_chk"/>
- <text name="events_label">
- Evenementen:
- </text>
- <check_box label="PG" name="event_chk"/>
- <check_box label="Mature" name="events_mature_chk"/>
- <check_box label="Adult" name="events_adult_chk"/>
- <combo_box label="Online vrienden" name="friend combo" tool_tip="Vriend die op kaart getoond wordt">
- <combo_box.item name="item1" label="Online vrienden"/>
- </combo_box>
- <combo_box label="Landmarkeringen" name="landmark combo" tool_tip="Landmarkering die op kaart getoond wordt">
- <combo_box.item name="item1" label="Landmarkeringen"/>
- </combo_box>
- <line_editor label="Zoek op regionaam" name="location" tool_tip="Type de naam van een regio"/>
- <button label="Zoeken" name="DoSearch" tool_tip="Zoek naar regio"/>
- <text name="search_label">
- Zoekresultaten
- </text>
- <text name="location_label">
- Locatie:
- </text>
- <spinner name="spin x" tool_tip="X coördinaat van de locatie die op de kaart getoond wordt"/>
- <spinner name="spin y" tool_tip="Y coördinaat van de locatie die op de kaart getoond wordt"/>
- <spinner name="spin z" tool_tip="Z coördinaat van de locatie die op de kaart getoond wordt"/>
- <button label="Teleport" label_selected="Teleport" name="Teleport" tool_tip="Teleport naar geselecteerde locatie"/>
- <button label="Toon bestemming" label_selected="Toon bestemming" name="Show Destination" tool_tip="Centreer kaart op geselecteerde locatie"/>
- <button label="Verwijder" label_selected="Verwijder" name="Clear" tool_tip="Stop volgen"/>
- <button label="Toon mijn locatie" label_selected="Toon mijn locatie" name="Show My Location" tool_tip="Centreer kaart op de locatie van uw avatar"/>
- <button label="Kopieer SLurl naar klembord" name="copy_slurl" tool_tip="Kopieert huidige locatie als SLurl, zodat deze op het web gebruikt kan worden."/>
- <slider label="Zoom" name="zoom slider"/>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/language_settings.xml b/indra/newview/skins/default/xui/nl/language_settings.xml
deleted file mode 100644
index 40f4d9178a..0000000000
--- a/indra/newview/skins/default/xui/nl/language_settings.xml
+++ /dev/null
@@ -1,57 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<!-- This file contains strings that used to be hardcoded in the source.-->
-<strings>
-
- <!-- Locale Information -->
- <string name="MicrosoftLocale">dutch</string>
- <string name="MacLocale">nl_NL.UTF-8</string>
- <string name="DarwinLocale">nl_NL.UTF-8</string>
- <string name="LinuxLocale">nl_NL.UTF-8</string>
-
- <!--
- datetimeToCodes["wkday"] = "%a"; // Thu
- datetimeToCodes["weekday"] = "%A"; // Thursday
- datetimeToCodes["year4"] = "%Y"; // 2009
- datetimeToCodes["year"] = "%Y"; // 2009
- datetimeToCodes["year2"] = "%y"; // 09
- datetimeToCodes["mth"] = "%b"; // Aug
- datetimeToCodes["month"] = "%B"; // August
- datetimeToCodes["mthnum"] = "%m"; // 08
- datetimeToCodes["day"] = "%d"; // 31
- datetimeToCodes["sday"] = "%-d"; // 9
- datetimeToCodes["hour24"] = "%H"; // 14
- datetimeToCodes["hour"] = "%H"; // 14
- datetimeToCodes["hour12"] = "%I"; // 02
- datetimeToCodes["min"] = "%M"; // 59
- datetimeToCodes["ampm"] = "%p"; // AM
- datetimeToCodes["second"] = "%S"; // 59
- datetimeToCodes["timezone"] = "%Z"; // PST
- -->
-
- <string name="TimeHour">hour,datetime,slt</string>
- <string name="TimeMin">min,datetime,slt</string>
- <string name="TimeYear">year,datetime,slt</string>
- <string name="TimeDay">day,datetime,slt</string>
- <string name="TimeMonth">mthnum,datetime,slt</string>
- <string name="TimeWeek">wkday,datetime,slt</string>
- <string name="TimeAMPM">ampm,datetime,slt</string>
- <string name="TimeHour12">hour12,datetime,slt</string>
-
- <string name="LTimeMthNum">mthnum,datetime,local</string>
- <string name="LTimeWeek">wkday,datetime,local</string>
- <string name="LTimeMonth">mth,datetime,local</string>
- <string name="LTimeDay">day,datetime,local</string>
- <string name="LTimeSec">second,datetime,local</string>
- <string name="LTimeHour">hour,datetime,local</string>
- <string name="LTimeMin">min,datetime,local</string>
- <string name="LTimeYear">year,datetime,local</string>
-
- <string name="UTCTimeWeek">weekday,datetime,utc</string>
- <string name="UTCTimeDay">day,datetime,utc</string>
- <string name="UTCTimeMth">mth,datetime,utc</string>
- <string name="UTCTimeYr">year,datetime,utc</string>
- <string name="UTCTimeHr">hour,datetime,utc</string>
- <string name="UTCTimeMin">min,datetime,utc</string>
- <string name="UTCTimeSec">second,datetime,utc</string>
- <string name="UTCTimeTimezone">timezone,datetime,utc</string>
-</strings>
diff --git a/indra/newview/skins/default/xui/nl/menu_inventory.xml b/indra/newview/skins/default/xui/nl/menu_inventory.xml
deleted file mode 100644
index c3b47cbddb..0000000000
--- a/indra/newview/skins/default/xui/nl/menu_inventory.xml
+++ /dev/null
@@ -1,82 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Popup">
- <menu_item_call label="Koop" name="Task Buy"/>
- <menu_item_call label="Open" name="Task Open"/>
- <menu_item_call label="Afspelen" name="Task Play"/>
- <menu_item_call label="Eigenschappen" name="Task Properties"/>
- <menu_item_call label="Hernoemen" name="Task Rename"/>
- <menu_item_call label="Verwijderen" name="Task Remove"/>
- <menu_item_call label="Prullenbak legen" name="Empty Trash"/>
- <menu_item_call label="Verloren en gevonden leegmaken" name="Empty Lost And Found"/>
- <menu_item_call label="Nieuwe map" name="New Folder"/>
- <menu_item_call label="Nieuw script" name="New Script"/>
- <menu_item_call label="Nieuwe notitie" name="New Note"/>
- <menu_item_call label="Nieuw gebaar" name="New Gesture"/>
- <menu label="Nieuwe Kleding" name="New Clothes">
- <menu_item_call label="Nieuw shirt" name="New Shirt"/>
- <menu_item_call label="Nieuwe broek" name="New Pants"/>
- <menu_item_call label="Nieuwe schoenen" name="New Shoes"/>
- <menu_item_call label="Nieuwe sokken" name="New Socks"/>
- <menu_item_call label="Nieuwe jas" name="New Jacket"/>
- <menu_item_call label="Nieuwe rok" name="New Skirt"/>
- <menu_item_call label="Nieuwe handschoenen" name="New Gloves"/>
- <menu_item_call label="Nieuw onderhemd" name="New Undershirt"/>
- <menu_item_call label="Nieuwe onderbroek" name="New Underpants"/>
- <menu_item_call label="Nieuw Alpha Masker" name="New Alpha Mask"/>
- <menu_item_call label="Nieuwe Tattoo" name="New Tattoo"/>
- </menu>
- <menu label="Nieuwe Lichaamsdelen" name="New Body Parts">
- <menu_item_call label="Nieuwe postuur" name="New Shape"/>
- <menu_item_call label="Nieuwe huid" name="New Skin"/>
- <menu_item_call label="Nieuw haar" name="New Hair"/>
- <menu_item_call label="Nieuwe ogen" name="New Eyes"/>
- </menu>
- <menu label="Change Type" name="Change Type">
- <menu_item_call label="Standaard" name="Default"/>
- <menu_item_call label="Handschoenen" name="Gloves"/>
- <menu_item_call label="Jas" name="Jacket"/>
- <menu_item_call label="Broek" name="Pants"/>
- <menu_item_call label="Vorm" name="Shape"/>
- <menu_item_call label="Schoenen" name="Shoes"/>
- <menu_item_call label="Overhemd" name="Shirt"/>
- <menu_item_call label="Rok" name="Skirt"/>
- <menu_item_call label="Onderbroek" name="Underpants"/>
- <menu_item_call label="Onderhemd" name="Undershirt"/>
- </menu>
- <menu_item_call label="Teleport" name="Landmark Open"/>
- <menu_item_call label="Open" name="Animation Open"/>
- <menu_item_call label="Open" name="Sound Open"/>
- <menu_item_call label="Verwijderen item" name="Purge Item"/>
- <menu_item_call label="Herstellen item" name="Restore Item"/>
- <menu_item_call label="Ga Naar Link" name="Goto Link"/>
- <menu_item_call label="Open" name="Open"/>
- <menu_item_call label="Eigenschappen" name="Properties"/>
- <menu_item_call label="Hernoemen" name="Rename"/>
- <menu_item_call label="Kopieer asset UUID" name="Copy Asset UUID"/>
- <menu_item_call label="Kopiëren" name="Copy"/>
- <menu_item_call label="Plakken" name="Paste"/>
- <menu_item_call label="Plak Als Link" name="Paste As Link"/>
- <menu_item_call label="Verwijderen" name="Delete"/>
- <menu_item_call label="Items uitdoen" name="Take Off Items"/>
- <menu_item_call label="Voeg toe aan kleding" name="Add To Outfit"/>
- <menu_item_call label="Vervang kleding" name="Replace Outfit"/>
- <menu_item_call label="Start conferentie chat" name="Conference Chat Folder"/>
- <menu_item_call label="Afspelen" name="Sound Play"/>
- <menu_item_call label="Over Landmark" name="About Landmark"/>
- <menu_item_call label="In wereld afspelen" name="Animation Play"/>
- <menu_item_call label="Lokaal afspelen" name="Animation Audition"/>
- <menu_item_call label="Stuur instant message" name="Send Instant Message"/>
- <menu_item_call label="Bied teleport aan…" name="Offer Teleport..."/>
- <menu_item_call label="Start conferentie chat" name="Conference Chat"/>
- <menu_item_call label="Activeren" name="Activate"/>
- <menu_item_call label="Deactiveren" name="Deactivate"/>
- <menu_item_call label="Opslaan Als" name="Save As"/>
- <menu_item_call label="Losmaken van jezelf" name="Detach From Yourself"/>
- <menu_item_call label="Dragen" name="Object Wear"/>
- <menu label="Bevestigen aan" name="Attach To"/>
- <menu label="Bevestigen aan HUD" name="Attach To HUD"/>
- <menu_item_call label="Bewerken" name="Wearable Edit"/>
- <menu_item_call label="Dragen" name="Wearable Wear"/>
- <menu_item_call label="Uitdoen" name="Take Off"/>
- <menu_item_call label="--geen opties--" name="--no options--"/>
-</menu>
diff --git a/indra/newview/skins/default/xui/nl/menu_inventory_add.xml b/indra/newview/skins/default/xui/nl/menu_inventory_add.xml
deleted file mode 100644
index 09330b9597..0000000000
--- a/indra/newview/skins/default/xui/nl/menu_inventory_add.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_inventory_add">
- <menu label="Upload" name="upload">
- <menu_item_call label="Plaatje (L$[COST])..." name="Upload Image"/>
- <menu_item_call label="Geluid (L$[COST])..." name="Upload Sound"/>
- <menu_item_call label="Animatie (L$[COST])..." name="Upload Animation"/>
- <menu_item_call label="Bulk (L$[COST] per bestand)..." name="Bulk Upload"/>
- </menu>
- <menu_item_call label="Nieuwe Map" name="New Folder"/>
- <menu_item_call label="Nieuw Script" name="New Script"/>
- <menu_item_call label="Nieuw Notitie" name="New Note"/>
- <menu_item_call label="Nieuw Gebaar" name="New Gesture"/>
- <menu label="Nieuwe Kleding" name="New Clothes">
- <menu_item_call label="Nieuw Overhemd" name="New Shirt"/>
- <menu_item_call label="Nieuwe Broek" name="New Pants"/>
- <menu_item_call label="Nieuwe Schoenen" name="New Shoes"/>
- <menu_item_call label="Nieuwe Sokken" name="New Socks"/>
- <menu_item_call label="Nieuw Jas" name="New Jacket"/>
- <menu_item_call label="Nieuw Rok" name="New Skirt"/>
- <menu_item_call label="Nieuwe Handschoenen" name="New Gloves"/>
- <menu_item_call label="Nieuw Hemd" name="New Undershirt"/>
- <menu_item_call label="Nieuwe Onderbroek" name="New Underpants"/>
- <menu_item_call label="Nieuwe Alpha" name="New Alpha"/>
- <menu_item_call label="Nieuwe Tattoo" name="New Tattoo"/>
- </menu>
- <menu label="Nieuwe Lichaamsdelen" name="New Body Parts">
- <menu_item_call label="Nieuwe Vorm" name="New Shape"/>
- <menu_item_call label="Nieuwe Huid" name="New Skin"/>
- <menu_item_call label="Nieuw Haar" name="New Hair"/>
- <menu_item_call label="Nieuwe Ogen" name="New Eyes"/>
- </menu>
-</menu>
diff --git a/indra/newview/skins/default/xui/nl/menu_login.xml b/indra/newview/skins/default/xui/nl/menu_login.xml
deleted file mode 100644
index 987b82b128..0000000000
--- a/indra/newview/skins/default/xui/nl/menu_login.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu_bar name="Login Menu">
- <menu label="Bestand" name="File">
- <menu_item_call label="Afsluiten" name="Quit"/>
- </menu>
- <menu label="Bewerken" name="Edit">
- <menu_item_call label="Voorkeuren..." name="Preferences..."/>
- </menu>
- <menu label="Help" name="Help">
- <menu_item_call label="[SECOND_LIFE] Help" name="Second Life Help"/>
- <menu_item_call label="Over [APP_NAME]..." name="About Second Life..."/>
- </menu>
-</menu_bar>
diff --git a/indra/newview/skins/default/xui/nl/menu_mini_map.xml b/indra/newview/skins/default/xui/nl/menu_mini_map.xml
deleted file mode 100644
index f7c09660ea..0000000000
--- a/indra/newview/skins/default/xui/nl/menu_mini_map.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Popup">
- <menu_item_call label="Zoom dichtbij" name="Zoom Close"/>
- <menu_item_call label="Zoom gemiddeld" name="Zoom Medium"/>
- <menu_item_call label="Zoom veraf" name="Zoom Far"/>
- <menu_item_call label="Stop volgen" name="Stop Tracking"/>
- <menu_item_call label="Profiel..." name="Profile"/>
-</menu>
diff --git a/indra/newview/skins/default/xui/nl/menu_picks.xml b/indra/newview/skins/default/xui/nl/menu_picks.xml
deleted file mode 100644
index 2e53dbda58..0000000000
--- a/indra/newview/skins/default/xui/nl/menu_picks.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Picks">
- <menu_item_call label="Info" name="pick_info"/>
- <menu_item_call label="Bewerken" name="pick_edit"/>
- <menu_item_call label="Teleport" name="pick_teleport"/>
- <menu_item_call label="Kaart" name="pick_map"/>
- <menu_item_call label="Verweideren" name="pick_delete"/>
-</context_menu>
diff --git a/indra/newview/skins/default/xui/nl/menu_places_gear_landmark.xml b/indra/newview/skins/default/xui/nl/menu_places_gear_landmark.xml
deleted file mode 100644
index dab5a388d7..0000000000
--- a/indra/newview/skins/default/xui/nl/menu_places_gear_landmark.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_ladmark_gear">
- <menu_item_call label="Teleport" name="teleport"/>
- <menu_item_call label="Meer Informatie" name="more_info"/>
- <menu_item_call label="Toon op Kaart" name="show_on_map"/>
- <menu_item_call label="Voeg Landmark Toe" name="add_landmark"/>
- <menu_item_call label="Voeg Map Toe" name="add_folder"/>
- <menu_item_call label="Knippen" name="cut"/>
- <menu_item_call label="Kopieër Landmark" name="copy_landmark"/>
- <menu_item_call label="Kopieër SLurl" name="copy_slurl"/>
- <menu_item_call label="Plakken" name="paste"/>
- <menu_item_call label="Hernoemen" name="rename"/>
- <menu_item_call label="Verweideren" name="delete"/>
- <menu_item_call label="Alle mappen uitvouwen" name="expand_all"/>
- <menu_item_call label="Alle mappen samenvouwen" name="collapse_all"/>
- <menu_item_check label="Sorteer bij Datum" name="sort_by_date"/>
- <menu_item_call label="Maak Favoriet" name="create_pick"/>
-</menu>
diff --git a/indra/newview/skins/default/xui/nl/menu_slurl.xml b/indra/newview/skins/default/xui/nl/menu_slurl.xml
deleted file mode 100644
index 48a4698d0c..0000000000
--- a/indra/newview/skins/default/xui/nl/menu_slurl.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Popup">
- <menu_item_call label="Over URL" name="about_url"/>
- <menu_item_call label="Teleport naar URL" name="teleport_to_url"/>
- <menu_item_call label="Toon op kaart" name="show_on_map"/>
-</menu>
diff --git a/indra/newview/skins/default/xui/nl/menu_viewer.xml b/indra/newview/skins/default/xui/nl/menu_viewer.xml
deleted file mode 100644
index 6d5c833610..0000000000
--- a/indra/newview/skins/default/xui/nl/menu_viewer.xml
+++ /dev/null
@@ -1,207 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu_bar name="Main Menu">
- <menu label="Bestand" name="File">
- <tearoff_menu label="~~~~~~~~~~~" name="~~~~~~~~~~~"/>
- <menu label="Upload" name="upload">
- <menu_item_call label="Afbeelding (L$[COST])..." name="Upload Image"/>
- <menu_item_call label="Geluid (L$[COST])..." name="Upload Sound"/>
- <menu_item_call label="Animatie (L$[COST])..." name="Upload Animation"/>
- <menu_item_call label="Bulk (L$[COST] per bestand)..." name="Bulk Upload"/>
- <menu_item_separator label="-----------" name="separator"/>
- <menu_item_call label="Standaard permissies instellen..." name="perm prefs"/>
- </menu>
- <menu_item_separator label="-----------" name="separator"/>
- <menu_item_call label="Sluit venster" name="Close Window"/>
- <menu_item_call label="Sluit alle vensters" name="Close All Windows"/>
- <menu_item_separator label="-----------" name="separator2"/>
- <menu_item_call label="Textuur opslaan als..." name="Save Texture As..."/>
- <menu_item_separator label="-----------" name="separator3"/>
- <menu_item_call label="Maak foto" name="Take Snapshot"/>
- <menu_item_call label="Foto naar harde schijf" name="Snapshot to Disk"/>
- <menu_item_separator label="-----------" name="separator4"/>
- <menu_item_call label="Afsluiten" name="Quit"/>
- </menu>
- <menu label="Bewerken" name="Edit">
- <menu_item_call label="Ongedaan maken" name="Undo"/>
- <menu_item_call label="Herhalen" name="Redo"/>
- <menu_item_separator label="-----------" name="separator"/>
- <menu_item_call label="Knippen" name="Cut"/>
- <menu_item_call label="Kopiëren" name="Copy"/>
- <menu_item_call label="Plakken" name="Paste"/>
- <menu_item_call label="Verwijderen" name="Delete"/>
- <menu_item_separator label="-----------" name="separator2"/>
- <menu_item_call label="Zoeken..." name="Search..."/>
- <menu_item_separator label="-----------" name="separator3"/>
- <menu_item_call label="Alles selecteren" name="Select All"/>
- <menu_item_call label="Deselecteren" name="Deselect"/>
- <menu_item_separator label="-----------" name="separator4"/>
- <menu_item_call label="Dupliceren" name="Duplicate"/>
- <menu_item_separator label="-----------" name="separator5"/>
- <menu label="Bevestig object" name="Attach Object"/>
- <menu label="Object losmaken" name="Detach Object"/>
- <menu label="Kleding uitdoen" name="Take Off Clothing">
- <menu_item_call label="Hemd" name="Shirt"/>
- <menu_item_call label="Broek" name="Pants"/>
- <menu_item_call label="Schoenen" name="Shoes"/>
- <menu_item_call label="Sokken" name="Socks"/>
- <menu_item_call label="Jas" name="Jacket"/>
- <menu_item_call label="Handschoenen" name="Gloves"/>
- <menu_item_call label="Onderhemd" name="Menu Undershirt"/>
- <menu_item_call label="Onderbroek" name="Menu Underpants"/>
- <menu_item_call label="Rok" name="Skirt"/>
- <menu_item_call label="Alle kleding" name="All Clothes"/>
- </menu>
- <menu_item_separator label="-----------" name="separator6"/>
- <menu_item_call label="Gebaren..." name="Gestures..."/>
- <menu_item_call label="Profiel..." name="Profile..."/>
- <menu_item_call label="Uiterlijk..." name="Appearance..."/>
- <menu_item_separator label="-----------" name="separator7"/>
- <menu_item_check label="Vrienden..." name="Friends..."/>
- <menu_item_call label="Groepen..." name="Groups..."/>
- <menu_item_separator label="-----------" name="separator8"/>
- <menu_item_call label="Voorkeuren..." name="Preferences..."/>
- </menu>
- <menu label="Weergave" name="View">
- <tearoff_menu label="~~~~~~~~~~~" name="~~~~~~~~~~~"/>
- <menu_item_call label="Mouselook" name="Mouselook"/>
- <menu_item_check label="Bouwen" name="Build"/>
- <menu_item_check label="Joystick vliegcamera" name="Joystick Flycam"/>
- <menu_item_call label="Weergave opnieuw instellen" name="Reset View"/>
- <menu_item_call label="Kijk naar laatste geklets" name="Look at Last Chatter"/>
- <menu_item_separator label="-----------" name="separator"/>
- <menu_item_check label="Werkbalk" name="Toolbar"/>
- <menu_item_check label="Lokale chat" name="Chat History"/>
- <menu_item_check label="Communiceren" name="Instant Message"/>
- <menu_item_check label="Inventaris" name="Inventory"/>
- <menu_item_check label="Actieve sprekers" name="Active Speakers"/>
- <menu_item_check label="Negeerlijst" name="Mute List"/>
- <menu_item_separator label="-----------" name="separator2"/>
- <menu_item_check label="Camerabediening" name="Camera Controls"/>
- <menu_item_check label="Bewegingsbediening" name="Movement Controls"/>
- <menu_item_check label="Wereldkaart" name="World Map"/>
- <menu_item_check label="Mini-kaart" name="Mini-Map"/>
- <menu_item_separator label="-----------" name="separator3"/>
- <menu_item_check label="Statistiekenbalk" name="Statistics Bar"/>
- <menu_item_check label="Eigendomlijnen" name="Property Lines"/>
- <menu_item_check label="Banlijnen" name="Banlines"/>
- <menu_item_check label="Landeigenaren" name="Land Owners"/>
- <menu_item_separator label="-----------" name="separator4"/>
- <menu label="Tooltips" name="Hover Tips">
- <menu_item_check label="Toon tips" name="Show Tips"/>
- <menu_item_separator label="-----------" name="separator"/>
- <menu_item_check label="Land tips" name="Land Tips"/>
- <menu_item_check label="Tips voor alle objecten" name="Tips On All Objects"/>
- </menu>
- <menu_item_check label="Markeer transparant" name="Highlight Transparent"/>
- <menu_item_check label="Bakens" name="beacons"/>
- <menu_item_check label="Verberg particles" name="Hide Particles"/>
- <menu_item_check label="Toon HUD bevestigingen" name="Show HUD Attachments"/>
- <menu_item_separator label="-----------" name="separator5"/>
- <menu_item_call label="Inzoomen" name="Zoom In"/>
- <menu_item_call label="Zoom standaard" name="Zoom Default"/>
- <menu_item_call label="Uitzoomen" name="Zoom Out"/>
- <menu_item_separator label="-----------" name="separator6"/>
- <menu_item_call label="Schakelen naar volledig scherm" name="Toggle Fullscreen"/>
- <menu_item_call label="UI grootte naar standaard instellen" name="Set UI Size to Default"/>
- </menu>
- <menu label="Wereld" name="World">
- <menu_item_call label="Chat" name="Chat"/>
- <menu_item_check label="Altijd rennen" name="Always Run"/>
- <menu_item_check label="Vliegen" name="Fly"/>
- <menu_item_separator label="-----------" name="separator"/>
- <menu_item_call label="Maak hier landmarkering" name="Create Landmark Here"/>
- <menu_item_call label="Thuis hier instellen" name="Set Home to Here"/>
- <menu_item_separator label="-----------" name="separator2"/>
- <menu_item_call label="Teleport naar huis" name="Teleport Home"/>
- <menu_item_separator label="-----------" name="separator3"/>
- <menu_item_call label="Afwezig instellen" name="Set Away"/>
- <menu_item_call label="Niet-storen instellen" name="Set Busy"/>
- <menu_item_call label="Stop het animeren van mijn avatar" name="Stop Animating My Avatar"/>
- <menu_item_call label="Toetsen vrijgeven" name="Release Keys"/>
- <menu_item_separator label="-----------" name="separator4"/>
- <menu_item_call label="Account geschiedenis..." name="Account History..."/>
- <menu_item_call label="Beheer mijn account" name="Manage My Account..."/>
- <menu_item_call label="Koop L$..." name="Buy and Sell L$..."/>
- <menu_item_separator label="-----------" name="separator5"/>
- <menu_item_call label="Mijn land..." name="My Land..."/>
- <menu_item_call label="Over land..." name="About Land..."/>
- <menu_item_call label="Koop land..." name="Buy Land..."/>
- <menu_item_call label="Regio/Estate..." name="Region/Estate..."/>
- <menu_item_separator label="-----------" name="separator6"/>
- <menu label="Omgeving instellingen" name="Environment Settings">
- <menu_item_call label="Zonsopgang" name="Sunrise"/>
- <menu_item_call label="Middag" name="Noon"/>
- <menu_item_call label="Zonsondergang" name="Sunset"/>
- <menu_item_call label="Middernacht" name="Midnight"/>
- <menu_item_call label="Herstel naar regiostandaard" name="Revert to Region Default"/>
- <menu_item_separator label="-----------" name="separator"/>
- <menu_item_call label="Omgeving editor" name="Environment Editor"/>
- </menu>
- </menu>
- <menu label="Gereedschappen" name="Tools">
- <menu label="Selecteergereedschap" name="Select Tool">
- <menu_item_call label="Focus" name="Focus"/>
- <menu_item_call label="Verplaatsen" name="Move"/>
- <menu_item_call label="Bewerken" name="Edit"/>
- <menu_item_call label="Maak" name="Create"/>
- <menu_item_call label="Land" name="Land"/>
- </menu>
- <menu_item_separator label="-----------" name="separator"/>
- <menu_item_check label="Selecteer alleen mijn objecten" name="Select Only My Objects"/>
- <menu_item_check label="Selecteer alleen verplaatsbare objecten" name="Select Only Movable Objects"/>
- <menu_item_check label="Selecteer op omgeving" name="Select By Surrounding"/>
- <menu_item_check label="Toon verborgen selectie" name="Show Hidden Selection"/>
- <menu_item_check label="Toon lichtradius voor selectie" name="Show Light Radius for Selection"/>
- <menu_item_check label="Toon selectiestraal" name="Show Selection Beam"/>
- <menu_item_separator label="-----------" name="separator2"/>
- <menu_item_check label="Snap aan grid" name="Snap to Grid"/>
- <menu_item_call label="Snap object XY aan grid" name="Snap Object XY to Grid"/>
- <menu_item_call label="Gebruik selectie voor grid" name="Use Selection for Grid"/>
- <menu_item_call label="Gridopties..." name="Grid Options..."/>
- <menu_item_separator label="-----------" name="separator3"/>
- <menu_item_check label="Bewerk gekoppelde delen" name="Edit Linked Parts"/>
- <menu_item_call label="Koppel" name="Link"/>
- <menu_item_call label="Ontkoppel" name="Unlink"/>
- <menu_item_separator label="-----------" name="separator4"/>
- <menu_item_call label="Focus op selectie" name="Focus on Selection"/>
- <menu_item_call label="Zoom naar selectie" name="Zoom to Selection"/>
- <menu_item_call label="Koop object" name="Menu Object Take">
- <on_enable userdata="Koop,Neem" name="EnableBuyOrTake"/>
- </menu_item_call>
- <menu_item_call label="Neem kopie" name="Take Copy"/>
- <menu_item_call label="Object terug opslaan in objectinhoud" name="Save Object Back to Object Contents"/>
- <menu_item_separator label="-----------" name="separator6"/>
- <menu_item_call label="Toon script waarschuwing/fout venster" name="Show Script Warning/Error Window"/>
- <menu label="Hercompileer scripts in selectie" name="Recompile Scripts in Selection">
- <menu_item_call label="Mono" name="Mono"/>
- <menu_item_call label="LSL" name="LSL"/>
- </menu>
- <menu_item_call label="Scripts in selectie opnieuw instellen" name="Reset Scripts in Selection"/>
- <menu_item_call label="Scripts in selectie instellen op uitvoeren" name="Set Scripts to Running in Selection"/>
- <menu_item_call label="Scripts in selectie instellen op niet uitvoeren" name="Set Scripts to Not Running in Selection"/>
- </menu>
- <menu label="Help" name="Help">
- <menu_item_call label="[SECOND_LIFE] Help" name="Second Life Help"/>
- <menu_item_call label="Handleiding" name="Tutorial"/>
- <menu_item_separator label="-----------" name="separator"/>
- <menu_item_call label="Officiële Linden blog..." name="Official Linden Blog..."/>
- <menu_item_separator label="-----------" name="separator2"/>
- <menu_item_call label="Scripting portaal..." name="Scripting Portal..."/>
- <menu_item_separator label="-----------" name="separator3"/>
- <menu_item_call label="Rapporteer misbruik..." name="Report Abuse..."/>
- <menu_item_call label="Botsingen, duwen &amp; slaan" name="Bumps, Pushes &amp;amp; Hits..."/>
- <menu_item_call label="Lag Meter" name="Lag Meter"/>
- <menu_item_separator label="-----------" name="separator7"/>
- <menu label="Bug rapporteren" name="Bug Reporting">
- <menu_item_call label="Publieke problemenlijst..." name="Public Issue Tracker..."/>
- <menu_item_call label="Publieke problemenlijst help" name="Publc Issue Tracker Help..."/>
- <menu_item_separator label="-----------" name="separator7"/>
- <menu_item_call label="Bug rapporteren 101" name="Bug Reporing 101..."/>
- <menu_item_call label="Beveiligingsbevindingen..." name="Security Issues..."/>
- <menu_item_call label="Kwaliteitsbeheersing Wiki..." name="QA Wiki..."/>
- <menu_item_separator label="-----------" name="separator9"/>
- <menu_item_call label="Rapporteer bug..." name="Report Bug..."/>
- </menu>
- <menu_item_call label="Over [APP_NAME]..." name="About Second Life..."/>
- </menu>
-</menu_bar>
diff --git a/indra/newview/skins/default/xui/nl/mime_types.xml b/indra/newview/skins/default/xui/nl/mime_types.xml
deleted file mode 100644
index ba5de136a0..0000000000
--- a/indra/newview/skins/default/xui/nl/mime_types.xml
+++ /dev/null
@@ -1,230 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<mimetypes name="default">
- <widgetset name="web">
- <label name="web_label">
- Web Inhoud
- </label>
- <tooltip name="web_tooltip">
- Deze locatie bevat Web inhoud
- </tooltip>
- <playtip name="web_playtip">
- Toon Web inhoud
- </playtip>
- </widgetset>
- <widgetset name="movie">
- <label name="movie_label">
- Film
- </label>
- <tooltip name="movie_tooltip">
- Hier kan een film afgespeeld worden
- </tooltip>
- <playtip name="movie_playtip">
- Afspelen film
- </playtip>
- </widgetset>
- <widgetset name="none">
- <label name="none_label">
- Geen Inhoud
- </label>
- <tooltip name="none_tooltip">
- Geen media hier
- </tooltip>
- </widgetset>
- <widgetset name="image">
- <label name="image_label">
- Afbeelding
- </label>
- <tooltip name="image_tooltip">
- Er is een afbeelding op deze locatie
- </tooltip>
- <playtip name="image_playtip">
- Bekijk de afbeelding van deze locatie
- </playtip>
- </widgetset>
- <widgetset name="audio">
- <label name="audio_label">
- Audio
- </label>
- <tooltip name="audio_tooltip">
- Er is audio op deze locatie
- </tooltip>
- <playtip name="audio_playtip">
- Speel de audio van deze locatie af
- </playtip>
- </widgetset>
- <scheme name="rtsp">
- <label name="rtsp_label">
- Real Time Streaming
- </label>
- </scheme>
- <mimetype name="blank">
- <label name="blank_label">
- - Geen -
- </label>
- </mimetype>
- <mimetype name="none/none">
- <label name="none/none_label">
- - Geen -
- </label>
- </mimetype>
- <mimetype name="audio/*">
- <label name="audio2_label">
- Audio
- </label>
- </mimetype>
- <mimetype name="video/*">
- <label name="video2_label">
- Video
- </label>
- </mimetype>
- <mimetype name="image/*">
- <label name="image2_label">
- Afbeelding
- </label>
- </mimetype>
- <mimetype name="video/vnd.secondlife.qt.legacy">
- <label name="vnd.secondlife.qt.legacy_label">
- Film (QuickTime)
- </label>
- </mimetype>
- <mimetype name="application/javascript">
- <label name="application/javascript_label">
- Javascript
- </label>
- </mimetype>
- <mimetype name="application/ogg">
- <label name="application/ogg_label">
- Ogg Audio/Video
- </label>
- </mimetype>
- <mimetype name="application/pdf">
- <label name="application/pdf_label">
- PDF Document
- </label>
- </mimetype>
- <mimetype name="application/postscript">
- <label name="application/postscript_label">
- Postscript Document
- </label>
- </mimetype>
- <mimetype name="application/rtf">
- <label name="application/rtf_label">
- Rich Text (RTF)
- </label>
- </mimetype>
- <mimetype name="application/smil">
- <label name="application/smil_label">
- Synchronized Multimedia Integration Language (SMIL)
- </label>
- </mimetype>
- <mimetype name="application/xhtml+xml">
- <label name="application/xhtml+xml_label">
- Web Pagina (XHTML)
- </label>
- </mimetype>
- <mimetype name="application/x-director">
- <label name="application/x-director_label">
- Macromedia Director
- </label>
- </mimetype>
- <mimetype name="application/x-shockwave-flash">
- <label name="application/x-shockwave-flash_label">
- Flash
- </label>
- </mimetype>
- <mimetype name="audio/mid">
- <label name="audio/mid_label">
- Audio (MIDI)
- </label>
- </mimetype>
- <mimetype name="audio/mpeg">
- <label name="audio/mpeg_label">
- Audio (MP3)
- </label>
- </mimetype>
- <mimetype name="audio/x-aiff">
- <label name="audio/x-aiff_label">
- Audio (AIFF)
- </label>
- </mimetype>
- <mimetype name="audio/x-wav">
- <label name="audio/x-wav_label">
- Audio (WAV)
- </label>
- </mimetype>
- <mimetype name="image/bmp">
- <label name="image/bmp_label">
- Afbeelding (BMP)
- </label>
- </mimetype>
- <mimetype name="image/gif">
- <label name="image/gif_label">
- Afbeelding (GIF)
- </label>
- </mimetype>
- <mimetype name="image/jpeg">
- <label name="image/jpeg_label">
- Afbeelding (JPEG)
- </label>
- </mimetype>
- <mimetype name="image/png">
- <label name="image/png_label">
- Afbeelding (PNG)
- </label>
- </mimetype>
- <mimetype name="image/svg+xml">
- <label name="image/svg+xml_label">
- Afbeelding (SVG)
- </label>
- </mimetype>
- <mimetype name="image/tiff">
- <label name="image/tiff_label">
- Afbeelding (TIFF)
- </label>
- </mimetype>
- <mimetype name="text/html">
- <label name="text/html_label">
- Web Pagina
- </label>
- </mimetype>
- <mimetype name="text/plain">
- <label name="text/plain_label">
- Tekst
- </label>
- </mimetype>
- <mimetype name="text/xml">
- <label name="text/xml_label">
- XML
- </label>
- </mimetype>
- <mimetype name="video/mpeg">
- <label name="video/mpeg_label">
- Film (MPEG)
- </label>
- </mimetype>
- <mimetype name="video/mp4">
- <label name="video/mp4_label">
- Film (MP4)
- </label>
- </mimetype>
- <mimetype name="video/quicktime">
- <label name="video/quicktime_label">
- Film (QuickTime)
- </label>
- </mimetype>
- <mimetype name="video/x-ms-asf">
- <label name="video/x-ms-asf_label">
- Film (Windows Media ASF)
- </label>
- </mimetype>
- <mimetype name="video/x-ms-wmv">
- <label name="video/x-ms-wmv_label">
- Film (Windows Media WMV)
- </label>
- </mimetype>
- <mimetype name="video/x-msvideo">
- <label name="video/x-msvideo_label">
- Film (AVI)
- </label>
- </mimetype>
-</mimetypes>
diff --git a/indra/newview/skins/default/xui/nl/notifications.xml b/indra/newview/skins/default/xui/nl/notifications.xml
deleted file mode 100644
index 06e6d8ae7a..0000000000
--- a/indra/newview/skins/default/xui/nl/notifications.xml
+++ /dev/null
@@ -1,3044 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<notifications>
- <global name="skipnexttime">
- Toon mij dit niet meer.
- </global>
- <global name="alwayschoose">
- Kies altijd deze optie
- </global>
- <global name="implicitclosebutton">
- Sluiten
- </global>
- <template name="okbutton">
- <form>
- <button
- name="OK"
- text="$yestext"/>
- </form>
- </template>
-
- <template name="okignore">
- <form>
- <button
- name="OK"
- text="$yestext"/>
- <ignore text="$ignoretext"/>
- </form>
- </template>
-
- <template name="okcancelbuttons">
- <form>
- <button
- name="OK"
- text="$yestext"/>
- <button
- name="Cancel"
- text="$notext"/>
- </form>
- </template>
-
- <template name="okcancelignore">
- <form>
- <button
- name="OK"
- text="$yestext"/>
- <button
- name="Cancel"
- text="$notext"/>
- <ignore text="$ignoretext"/>
- </form>
- </template>
-
- <template name="okhelpbuttons">
- <form>
- <button
- name="OK"
- text="$yestext"/>
- <button
- name="Help"
- text="$helptext"/>
- </form>
- </template>
-
- <template name="yesnocancelbuttons">
- <form>
- <button
- name="Yes"
- text="$yestext"/>
- <button
- name="No"
- text="$notext"/>
- <button
- name="Cancel"
- text="$canceltext"/>
- </form>
- </template>
- <notification functor="GenericAcknowledge" label="Onbekende waarschuwingsboodschap" name="MissingAlert">
- Uw versie van [APP_NAME] weet niet hoe het de waarschuwingsboodschap die zojuist ontvangen is moet weergeven.
-
-Foutdetails: De waarschuwing genaamd &apos;[_NAME]&apos; is niet gevonden in notifications.xml.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="FloaterNotFound">
- Reële waarde fout: Kon de volgende controllers niet vinden:
-
-[CONTROLS]
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="TutorialNotFound">
- Er is momenteel geen handleiding beschikbaar.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="GenericAlert">
- [MESSAGE]
- </notification>
- <notification name="GenericAlertYesCancel">
- [MESSAGE]
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="Ja"/>
- </notification>
- <notification name="BadInstallation">
- Er is een fout opgetreden tijdens het bijwerken van [APP_NAME]. Download alstublieft de meest recente versie van secondlife.com
- <usetemplate
- name="okbutton"
- yestext="OK"/>
- </notification>
- <notification name="LoginFailedNoNetwork">
- Netwerkfout: Kan geen verbinding opzetten.
-&apos;[DIAGNOSTIC]&apos;
-Controleer alstublieft uw netwerkverbinding.
- <usetemplate
- name="okbutton"
- yestext="OK"/>
- </notification>
- <notification name="MessageTemplateNotFound">
- Berichtsjabloon [PATH] niet gevonden.
- <usetemplate
- name="okbutton"
- yestext="OK"/>
- </notification>
- <notification name="WearableSave">
- Wijzigingen aan huidig kledingstuk/lichaamsdeel opslaan?
- <usetemplate canceltext="Annuleren" name="yesnocancelbuttons" notext="Niet Opslaan" yestext="Opslaan"/>
- </notification>
- <notification name="CompileQueueSaveText">
- Er was een probleem met het uploaden van de tekst van een script vanwege de volgende reden: [REASON]. Probeer het alstublieft later nog eens.
- </notification>
- <notification name="CompileQueueSaveBytecode">
- Er was een probleem met het uploaden van het gecompileerde script vanwege de volgende reden: [REASON]. Probeer het alstublieft later nog eens.
- </notification>
- <notification name="WriteAnimationFail">
- Er was een probleem met het wegschrijven van animatie gegevens. Probeer het alstublieft later nog eens.
- </notification>
- <notification name="UploadAuctionSnapshotFail">
- Er was een probleem met het uploaden van de veiling foto vanwege de volgende reden: [REASON]
- </notification>
- <notification name="UnableToViewContentsMoreThanOne">
- Het is niet mogelijk om de inhoud van meer dan één item tegelijk te zien.
-Kies alstublieft slechts één item en probeer het opnieuw.
- </notification>
- <notification name="SaveClothingBodyChanges">
- Wijzigingen aan kledingstuk/lichaamsdeel opslaan?
- <usetemplate canceltext="Annuleren" name="yesnocancelbuttons" notext="Niet Opslaan" yestext="Alles Opslaan"/>
- </notification>
- <notification name="GrantModifyRights">
- Het geven van wijzigingsrechten aan een andere inwoner, maakt het voor hun mogelijk om elk willekeurig object te wijzigen, te verwijderen of om WILLEKEURIGE objecten die u in wereld heeft terug te nemen. Wees HEEL voorzichtig met het uitgeven van dit recht.
-Wilt u wijzigingsrechten aan [FIRST_NAME] [LAST_NAME] geven?
- <usetemplate name="okcancelbuttons" notext="Nee" yestext="Ja"/>
- </notification>
- <notification name="GrantModifyRightsMultiple">
- Het geven van wijzigingsrechten aan een andere inwoner, maakt het voor hun mogelijk elk WILLEKEURIG object te wijzigen die u in wereld heeft. Wees HEEL voorzichtig met het uitgeven van dit recht.
-Wilt u wijzigingsrechten aan de geselecteerde inwoners geven?
- <usetemplate name="okcancelbuttons" notext="Nee" yestext="Ja"/>
- </notification>
- <notification name="RevokeModifyRights">
- Wilt u de wijzigingsrechten voor [FIRST_NAME] [LAST_NAME] terugnemen?
- <usetemplate name="okcancelbuttons" notext="Nee" yestext="Ja"/>
- </notification>
- <notification name="RevokeModifyRightsMultiple">
- Wilt u de wijzigingsrechten voor de geselecteerde inwoners terugnemen?
- <usetemplate name="okcancelbuttons" notext="Nee" yestext="Ja"/>
- </notification>
- <notification name="UnableToCreateGroup">
- Kan geen groep aanmaken.
-[MESSAGE]
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="PanelGroupApply">
- [NEEDS_APPLY_MESSAGE]
-[WANT_APPLY_MESSAGE]
- <usetemplate canceltext="Annuleren" name="yesnocancelbuttons" notext="Wijzigingen Negeren" yestext="Wijzigingen Toepassen"/>
- </notification>
- <notification name="MustSpecifyGroupNoticeSubject">
- U moet een onderwerp opgeven om dit bericht te kunnen versturen.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="AddGroupOwnerWarning">
- U staat op het punt groepsleden de rol [ROLE_NAME] te geven.
-Leden kunnen niet van die groep worden verwijderd.
-De leden moeten zichzelf ontheffen uit deze rol.
-Weet u zeker dat u door wilt gaan?
- <usetemplate ignoretext="Wanneer u groepsleden toevoegt aan de eigenaren rol" name="okcancelignore" notext="Nee" yestext="Ja"/>
- </notification>
- <notification name="AssignDangerousActionWarning">
- U staat op het punt de Bekwaamheid &apos;[ACTION_NAME]&apos; aan de Rol &apos;[ROLE_NAME]&apos; toe te voegen.
-
- *WAARSCHUWING*
- Elk lid in de Rol met deze Bekwaamheid kan zichzelf - en elk ander lid - Rollen geven die meer mogelijkheden hebben dan waar zij nu over beschikken, zichzelf daarmee verheffend tot bijna eigenaar mogelijkheden. Weet zeker waar u mee bezig bent alvorens deze Bekwaamheid toe te kennen.
-
-Deze Bekwaamheid toevoegen aan &apos;[ROLE_NAME]&apos;?
- <usetemplate name="okcancelbuttons" notext="Nee" yestext="Ja"/>
- </notification>
- <notification name="AssignDangerousAbilityWarning">
- U staat op het punt de Bekwaamheid &apos;[ACTION_NAME]&apos; aan de Rol &apos;[ROLE_NAME]&apos; toe te voegen.
-
- *WAARSCHUWING*
- Elk lid in de Rol met deze Bekwaamheid kan zichzelf - en elk ander lid - alle Bekwaamheden geven, zich daarmee verheffend tot bijna Eigenaar mogelijkheden.
-
-Deze Bekwaamheid toevoegen aan &apos;[ROLE_NAME]&apos;?
- <usetemplate name="okcancelbuttons" notext="Nee" yestext="Ja"/>
- </notification>
- <notification name="ClickPublishHelpLand">
- Het selecteren van de &quot;Publiceer in Zoeken&quot; optie
-Het aan vinken van deze optie zal:
-- dit perceel weergeven in de zoek resultaten
-- de publieke objecten van dit perceel weergeven
-- dit perceel in web zoeken weergeven
- </notification>
- <notification name="ClickSoundHelpLand">
- Media en muziek kunnen alleen binnen het perceel ervaren worden. Geluid- en voice-opties kunnen worden beperkt tot het perceel of zullen worden gehoord door inwoners buiten het perceel, gebaseerd op hun inhoudscategorie. Ga naar de kennisbank om meer te leren over hoe deze opties ingesteld kunnen worden.
- <url name="url">
- https://support.secondlife.com/ics/support/default.asp?deptID=4417&amp;task=knowledge&amp;questionID=5046
- </url>
- <usetemplate
- name="okcancelbuttons"
- yestext="Ga naar kennisbank"
- notext="Sluiten" />
- </notification>
- <notification name="ClickSearchHelpAll">
- Zoekresultaten zijn georganiseerd op basis van het tabblad waar u zich in bevindt, uw inhoudscategorie, de gekozen categorie en andere factoren. Kijk alstublieft in de kennisbank voor meer details.
- <url name="url">
- https://support.secondlife.com/ics/support/default.asp?deptID=4417&amp;task=knowledge&amp;questionID=4722
- </url>
- <usetemplate
- name="okcancelbuttons"
- yestext="Ga naar kennisbank"
- notext="Sluiten" />
- </notification>
- <notification name="ClickPublishHelpLandDisabled">
- U kunt dit perceel niet zichtbaar maken in zoeken omdat het zich in een regio bevindt dat dit niet toelaat
- </notification>
- <notification name="ClickPublishHelpAvatar">
- Het selecteren van &quot;Weergeven in Zoeken&quot; zal weergeven:
-- mijn profiel in de zoek resultaten
-- een link naar mijn profiel in de publieke groep pagina&apos;s
- </notification>
- <notification name="ClickPartnerHelpAvatar">
- U kunt een andere Inwoner ten huwelijk vragen of een bestaand partner schap verbreken via de [SECOND_LIFE] website.
-
-Naar de [SECOND_LIFE] website gaan voor meer informatie over partner schap?
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="Ga naar Pagina"/>
- </notification>
- <notification name="ClickUploadHelpPermissions">
- Uw standaard permissies werken mogelijk niet in oudere regio&apos;s.
- </notification>
- <notification name="ClickWebProfileHelpAvatar">
- Als een Inwoner een web profiel URL heeft ingesteld:
-* Klik op &apos;Laden&apos; om de pagina in deze web tab te zien.
-* Klik op Laden &gt; &apos;In externe browser&apos; om de pagina in uw standaard browser te zien
-* Klik op Laden &gt; &apos;Thuis pagina URL&apos; om terug te keren naar het web profiel van deze Inwoner indien U verder genavigeerd bent.
-
-Indien u uw eigen profiel bekijkt, kunt U elke willekeurige URL opgeven als uw web profiel en op OK klikken om het in te stellen.
-Andere Inwoners kunnen de door U opgegeven URL bezoeken indien zij uw profiel bekijken.
- </notification>
- <notification name="JoinGroupCanAfford">
- Deelname aan deze groep kost L$[COST].
-Wilt u doorgaan?
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="Deelnemen"/>
- </notification>
- <notification name="JoinGroupCannotAfford">
- Deelname aan deze groep kost L$[COST].
-U heeft niet genoeg L$ om deel te kunnen nemen aan deze groep.
- </notification>
- <notification name="LandBuyPass">
- Voor L$[COST] krijgt u toegang tot het land (&apos;[PARCEL_NAME]&apos;) voor de duur van [TIME] uur.
-
-Een pas kopen?
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="SalePriceRestriction">
- De verkoopprijs moet ingesteld staan op meer dan L$0 indien u aan iemand verkoopt.
-Kies een individu indien u het voor L$0 verkoopt.
- </notification>
- <notification name="ConfirmLandSaleChange">
- De geselecteerde [LAND_SIZE] m² land is te koop gezet.
-Uw verkoopprijs is L$[SALE_PRICE] en zal geautoriseerd worden voor verkoop door [NAME].
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="ConfirmLandSaleToAnyoneChange">
- ATTENTIE: Het aanklikken van &apos;verkoop aan iedereen&apos; zal uw land beschikbaar maken aan de gehele [SECOND_LIFE] gemeenschap, zo ook diegenen niet in deze regio!
-
-De geselecteerde [LAND_SIZE] m² land is te koop gezet.
-Uw verkoopprijs is L$[SALE_PRICE] en zal geautoriseerd worden voor verkoop door [NAME].
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="ReturnObjectsDeededToGroup">
- Weet u zeker dat u alle met de groep &apos;[NAME]&apos; gedeelde objecten van dit perceel wilt retourneren naar de inventaris van hun vorige eigenaren?
-
-*WAARSCHUWING* Dit zal alle niet-overdraagbare aan de groep toegekende objecten verwijderen!
-
-Objecten: [N]
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="ReturnObjectsOwnedByUser">
- Weet u zeker dat u alle objecten van Inwoner &apos;[NAME]&apos; op dit perceel wilt retourneren naar hun inventaris?
-
-Objecten: [N]
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="ReturnObjectsOwnedBySelf">
- Weet u zeker dat u al uw eigen objecten op dit perceel wilt retourneren naar uw inventaris?
-
-Objecten: [N]
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="ReturnObjectsNotOwnedBySelf">
- Weet u zeker dat u alle objecten op dit perceel die geen eigendom van u zijn wilt retourneren naar de inventaris van hun eigenaren?
-Overdraagbare objecten toegekend aan de groep zullen worden geretourneerd naar de oorspronkelijke eigenaren.
-
-*WAARSCHUWING* Dit zal alle niet-overdraagbare aan de groep toegekende objecten verwijderen!
-
-Objecten: [N]
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="ReturnObjectsNotOwnedByUser">
- Weet u zeker dat u alle objecten op dit perceel die GEEN eigendom zijn van [NAME] wilt retourneren naar de inventaris van hun eigenaar? Overdraagbare objecten toegekend aan de groep zullen worden geretourneerd naar de oorspronkelijke eigenaren.
-
-*WAARSCHUWING* Dit zal alle niet-overdraagbare aan de groep toegekende objecten verwijderen!
-
-Objecten: [N]
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="ReturnAllTopObjects">
- Weet u zeker dat u alle weergegeven objecten wilt retourneren naar de inventaris van hun eigenaar?
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="DisableAllTopObjects">
- Weet u zeker dat u alle objecten in deze regio uit wilt schakelen?
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="ReturnObjectsNotOwnedByGroup">
- Alle objecten op dit perceel die NIET gedeeld worden met de groep [NAME] retourneren naar hun eigenaren?
-
-Objecten: [N]
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="UnableToDisableOutsideScripts">
- Kan scripts niet uitschakelen.
-Voor de hele regio is letsel ingeschakeld.
-Scripts moeten toegestaan worden om wapens te kunnen laten werken.
- </notification>
- <notification name="MustBeInParcel">
- U moet binnen een perceel staan om het Landings Punt in te stellen.
- </notification>
- <notification name="PromptRecipientEmail">
- Geef alstublieft een geldig email adres op van de ontvanger(s).
- </notification>
- <notification name="PromptSelfEmail">
- Voer uw email adres in.
- </notification>
- <notification name="PromptMissingSubjMsg">
- Foto e-mailen met het standaard onderwerp of bericht?
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="ErrorProcessingSnapshot">
- Fout opgetreden met het verwerken van de foto gegevens
- </notification>
- <notification name="ErrorEncodingSnapshot">
- Fout opgetreden met het coderen van de foto.
- </notification>
- <notification name="ErrorUploadingPostcard">
- Er is een probleem met het verzenden van de foto vanwege de volgende reden: [REASON]
- </notification>
- <notification name="ErrorUploadingReportScreenshot">
- Er is een probleem met het uploaden van de rapport foto vanwege de volgende reden: [REASON]
- </notification>
- <notification name="MustAgreeToLogIn">
- U moet akkoord gaan met de Voorwaarden van Dienstverlening (Terms of Service) om in te kunnen loggen in [SECOND_LIFE].
- </notification>
- <notification name="CouldNotPutOnOutfit">
- Kon de outfit niet aan doen.
-De outfit folder bevat geen kleding, lichaamsdelen of externe bevestigingen.
- </notification>
- <notification name="CannotWearTrash">
- U kunt geen kleding of lichaamsdelen aan trekken die zich in de vuilnisbak bevinden.
- </notification>
- <notification name="CannotWearInfoNotComplete">
- U kunt dat item niet aantrekken omdat het nog niet geladen is. Probeer het over een minuut opnieuw.
- </notification>
- <notification name="MustHaveAccountToLogIn">
- Oeps! Iets is nog leeg.
-U moet zowel de voornaam als de achternaam van uw avatar opgeven.
-
-U heeft een account nodig om [SECOND_LIFE] binnen te gaan. Wilt u er nu een maken?
- <url name="url">
- https://join.secondlife.com/index.php?lang=nl-NL
- </url>
- <usetemplate name="okcancelbuttons" notext="Probeer het opnieuw" yestext="Maak een nieuw account"/>
- </notification>
- <notification name="AddClassified">
- Geclassificeerde advertenties verschijnen een week lang in de &apos;Advertentie&apos; sectie van de Zoek gids en op www.secondlife.com.
-Vul uw advertentie in en klik op &apos;Publiceer...&apos; om het toe te voegen aan de gids.
-Er zal u om een prijs worden gevraagd als u deze gaat publiceren.
-Indien u meer betaald zal uw advertentie hoger in de lijst verschijnen en ook hoger als men op sleutelwoorden zoekt.
- <usetemplate ignoretext="Indien u een advertentie toevoegt" name="okcancelignore" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="DeleteClassified">
- Advertentie &apos;[NAME]&apos; verwijderen?
-Betaalde advertentiekosten zullen niet worden terug gestort.
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="ClassifiedSave">
- Wijzigingen in advertentie [NAME] opslaan?
- <usetemplate canceltext="Annuleren" name="yesnocancelbuttons" notext="Niet Opslaan" yestext="Opslaan"/>
- </notification>
- <notification name="DeleteAvatarPick">
- Favoriet [PICK] verwijderen?
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="PromptGoToEventsPage">
- Naar de [SECOND_LIFE] evenementen web pagina gaan?
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="SelectProposalToView">
- Kies alstublieft een voorstel om in te zien.
- </notification>
- <notification name="SelectHistoryItemToView">
- Kies alstublieft een geschiedenis item om in te zien.
- </notification>
- <notification name="ResetShowNextTimeDialogs">
- Wilt u alle Pop-Up&apos;s opnieuw inschakelen die u eerder aanmerkte als &apos;Laat mij niet opnieuw zien&apos;?
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="SkipShowNextTimeDialogs">
- Wilt u alle Pop-Up&apos;s uitschakelen die overgeslagen kunnen worden?
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="CacheWillClear">
- De cache zal geleegd worden als u [APP_NAME] opnieuw start.
- </notification>
- <notification name="CacheWillBeMoved">
- De cache zal verplaatst worden als u [APP_NAME] opnieuw start.
-Opmerking: Dit zal de Cache legen.
- </notification>
- <notification name="ChangeConnectionPort">
- Poort instelling zullen effect hebben nadat u [APP_NAME] opnieuw start.
- </notification>
- <notification name="ChangeSkin">
- De nieuwe skin zal verschijnen nadat u [APP_NAME] opnieuw start.
- </notification>
- <notification name="GoToAuctionPage">
- Ga naar de [SECOND_LIFE] web pagina om de veiling details te zien of een bod uit te brengen.
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="SaveChanges">
- Wijzigingen Opslaan?
- <usetemplate canceltext="Annuleren" name="yesnocancelbuttons" notext="Niet Opslaan" yestext="Opslaan"/>
- </notification>
- <notification name="GestureSaveFailedTooManySteps">
- Gebaar opslaan is niet gelukt.
-Dit gebaar heeft te veel stappen.
-Probeer enkele stappen te verwijderen en opnieuw op te slaan.
- </notification>
- <notification name="GestureSaveFailedTryAgain">
- Gebaar opslaan is niet gelukt. Probeer het over enkele ogenblikken opnieuw.
- </notification>
- <notification name="GestureSaveFailedObjectNotFound">
- Kon het gebaar niet opslaan omdat het object of bijbehorende object niet in de inventaris kon worden gevonden.
-
-Het object kan buiten bereik of mogelijk verwijderd zijn.
- </notification>
- <notification name="GestureSaveFailedReason">
- Er was een probleem met het opslaan van het gebaar vanwege de volgende reden: [REASON]. Probeert u het gebaar later nogmaals op te slaan.
- </notification>
- <notification name="SaveNotecardFailObjectNotFound">
- Kon de notitiekaart niet opslaan omdat het object of bijbehorende object niet in de inventaris kon worden gevonden.
-
-Het object kan buiten bereik of mogelijk verwijderd zijn.
- </notification>
- <notification name="SaveNotecardFailReason">
- Er was een probleem met het opslaan van de notitiekaart vanwege de volgende reden: [REASON]. Probeert u de notitiekaart later nogmaals op te slaan.
- </notification>
- <notification name="ScriptCannotUndo">
- Kon niet alle wijzigingen ongedaan maken in uw versie van het script.
-Wilt u de laatst op de server opgeslagen versie laden?
-(**Waarschuwing** Deze operatie kan niet ongedaan gemaakt worden.)
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="SaveScriptFailReason">
- Er was een probleem met het opslaan van een script vanwege de volgende reden: [REASON]. Probeert u het script later nogmaals op te slaan.
- </notification>
- <notification name="SaveScriptFailObjectNotFound">
- Kon het script niet opslaan omdat het object waar het in zit niet gevonden kon worden.
-Het object kan buiten bereik of mogelijk verwijderd zijn.
- </notification>
- <notification name="SaveBytecodeFailReason">
- Er was een probleem met het opslaan van een gecompileerd script vanwege de volgende reden: [REASON]. Probeert u het script later nogmaals op te slaan.
- </notification>
- <notification name="CouldNotStartStopScript">
- Kon het script niet starten of stoppen omdat het object wat het in zit niet gevonden kon worden.
-Het object kan buiten bereik of mogelijk verwijderd zijn.
- </notification>
- <notification name="CannotDownloadFile">
- Kon het bestand niet downloaden
- </notification>
- <notification name="CannotWriteFile">
- Kan niet naar bestand [[FILE]] schrijven
- </notification>
- <notification name="UnsupportedHardware">
- Waarschuwing: Uw systeem voldoet niet aan de [APP_NAME] minimum systeem eisen. Indien u [APP_NAME] gebruikt, ervaart u mogelijk slechte prestaties. Helaas kunnen we geen technische ondersteuning geven voor niet ondersteunde configuraties.
-
-MINSPECS
-Wilt u [_URL] bezoeken voor meer informatie?
- <url name="url" option="0">
- http://secondlife.com/support/sysreqs.php?lang=nl
- </url>
- <usetemplate ignoretext="Indien niet ondersteunde hardware gedetecteerd" name="okcancelignore" notext="Nee" yestext="Ja"/>
- </notification>
- <notification name="UnknownGPU">
- Uw systeem heeft een grafische kaart die bij ons nog niet bekend is op dit moment.
-
-Dit is vaak het geval met nieuwe hardware waarbij wij nog niet de kans gehad hebben om het te testen. [APP_NAME] zal mogelijk naar behoren functioneren, doch het kan zijn dat u uw grafische instellingen naar geschiktere waarden zult moeten instellen.
-(Bewerken menu &gt; Voorkeuren &gt; Grafisch).
- <form name="form">
- <ignore name="ignore" text="Indien een onbekende grafische kaart gedetecteerd"/>
- </form>
- </notification>
- <notification name="DisplaySettingsNoShaders">
- [APP_NAME] is gestopt bij het initialiseren van de grafische stuurprogramma&apos;s.
-Grafische kwaliteit zal op zijn laagst worden ingesteld om veel voorkomende fouten met stuurprogramma&apos;s te vermijden.
-Dit zal sommige grafische opties uitschakelen.
-Wij adviseren u de stuurprogramma&apos;s van uw grafische kaart bij te werken.
-Grafische kwaliteit kan verhoogd worden in Voorkeuren &gt; Grafisch.
- </notification>
- <notification name="RegionNoTerraforming">
- De regio [REGION] staat geen land aanpassingen toe.
- </notification>
- <notification name="CannotCopyWarning">
- U heeft geen permissie dit item te kopiëren en zult het kwijtraken als u het weg geeft. Wilt u dit item echt aanbieden?
- <usetemplate name="okcancelbuttons" notext="Nee" yestext="Ja"/>
- </notification>
- <notification name="CannotGiveItem">
- Kan inventaris item niet geven.
- </notification>
- <notification name="TransactionCancelled">
- Transactie afgebroken.
- </notification>
- <notification name="TooManyItems">
- Kan niet meer dan 42 items in één enkele inventaris overdracht geven.
- </notification>
- <notification name="NoItems">
- U heeft geen permissie de geselecteerde items over te dragen.
- </notification>
- <notification name="CannotCopyCountItems">
- U heeft geen permissie om [COUNT] geselecteerde items te kopiëren. U zult deze items uit uw inventaris kwijtraken.
-Weet u zeker dat u deze items wilt geven?
- <usetemplate name="okcancelbuttons" notext="Nee" yestext="Ja"/>
- </notification>
- <notification name="CannotGiveCategory">
- U heeft geen permissie de geselecteerde map over te dragen.
- </notification>
- <notification name="FreezeAvatar">
- Avatar bevriezen?
-Hij of zij zal zich tijdelijk niet kunnen bewegen, praten of interactie kunnen hebben met de wereld.
- <usetemplate canceltext="Annuleren" name="yesnocancelbuttons" notext="Ontdooien" yestext="Bevriezen"/>
- </notification>
- <notification name="FreezeAvatarFullname">
- Bevries [AVATAR_NAME]?
-Hij of zij zal zich tijdelijk niet kunnen bewegen, praten of interactie kunnen hebben met de wereld.
- <usetemplate canceltext="Annuleren" name="yesnocancelbuttons" notext="Ontdooien" yestext="Bevriezen"/>
- </notification>
- <notification name="EjectAvatarFullname">
- [AVATAR_NAME] van uw land verwijderen?
- <usetemplate canceltext="Annuleren" name="yesnocancelbuttons" notext="Verwijderen en Bannen" yestext="Verwijderen"/>
- </notification>
- <notification name="EjectAvatarNoBan">
- Deze avatar van u land verwijderen?
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="Verwijder"/>
- </notification>
- <notification name="EjectAvatarFullnameNoBan">
- [AVATAR_NAME] van uw land verwijderen?
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="Verwijder"/>
- </notification>
- <notification name="AcquireErrorTooManyObjects">
- VERWERVINGS FOUT: Te veel objecten geselecteerd
- </notification>
- <notification name="AcquireErrorObjectSpan">
- VERWERVINGS FOUT: Objecten beslaan meer dan één regio.
-Verplaats alstublieft alle objecten die u wilt verwerven naar dezelfde regio.
- </notification>
- <notification name="PromptGoToCurrencyPage">
- [EXTRA]
-
-Naar [_URL] gaan voor informatie over de aankoop L$?
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="UnableToLinkObjects">
- Kon deze [COUNT] objecten niet linken.
-U kunt maximaal [MAX] objecten linken.
- </notification>
- <notification name="CannotLinkIncompleteSet">
- U kunt alleen complete sets van objecten linken en moet meer dan één object selecteren.
- </notification>
- <notification name="CannotLinkModify">
- Kon niet linken omdat u geen wijziging permissies heeft op alle objecten.
-
-Wees er van overtuigd dat er geen enkele geblokkeerd is en dat ze allen uw eigendom zijn.
- </notification>
- <notification name="CannotLinkDifferentOwners">
- Kon niet linken omdat niet alle objecten dezelfde eigenaar hebben.
-
-Wees er van overtuigd dat alle objecten uw eigendom zijn.
- </notification>
- <notification name="NoFileExtension">
- Geen bestandsextensie voor het bestand: &apos;[FILE]&apos;
-
-Zorg dat het bestand de juiste bestandsextensie heeft.
- </notification>
- <notification name="InvalidFileExtension">
- Ongeldige bestandsextensie [EXTENSION]
-Verwacht [VALIDS]
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="CannotUploadSoundFile">
- Kon het geüploade geluidsbestand niet openen om te lezen:
-[FILE]
- </notification>
- <notification name="SoundFileNotRIFF">
- Het bestand lijkt geen RIFF WAVE bestand te zijn:
-[FILE]
- </notification>
- <notification name="SoundFileNotPCM">
- Het bestand lijkt geen PCM WAVE audio bestand te zijn:
-[FILE]
- </notification>
- <notification name="SoundFileInvalidChannelCount">
- Het bestand heeft een ongeldig aantal kanalen (moet mono of stereo zijn):
-[FILE]
- </notification>
- <notification name="SoundFileInvalidSampleRate">
- Het bestand lijkt geen ondersteund sample rate te hebben (moet 44.1k zijn):
-[FILE]
- </notification>
- <notification name="SoundFileInvalidWordSize">
- Het bestand lijkt geen ondersteund word size te hebben (moet 8 of 16 bit zijn):
-[FILE]
- </notification>
- <notification name="SoundFileInvalidHeader">
- Kon geen &apos;data&apos; chunk in WAV header vinden:
-[FILE]
- </notification>
- <notification name="SoundFileInvalidTooLong">
- Audio bestand is te lang (10 seconden maximum):
-[FILE]
- </notification>
- <notification name="ProblemWithFile">
- Probleem met bestand [FILE]:
-
-[ERROR]
- </notification>
- <notification name="CannotOpenTemporarySoundFile">
- Kon geen tijdelijk gecomprimeerd geluidsbestand openen om naar toe te schrijven: [FILE]
- </notification>
- <notification name="UnknownVorbisEncodeFailure">
- Onbekende Vorbis codeer fout in: [FILE]
- </notification>
- <notification name="CannotEncodeFile">
- Kan bestand niet coderen: [FILE]
- </notification>
- <notification name="CorruptResourceFile">
- Beschadigd bron bestand: [FILE]
- </notification>
- <notification name="UnknownResourceFileVersion">
- Onbekende Linden bronbestandsversie in bestand: [FILE]
- </notification>
- <notification name="UnableToCreateOutputFile">
- Niet mogelijk om uitvoerbestand te maken: [FILE]
- </notification>
- <notification name="DoNotSupportBulkAnimationUpload">
- Wij ondersteunen momenteel geen bulk upload van animatie bestanden.
- </notification>
- <notification name="CannotUploadReason">
- Niet mogelijk om bestand [FILE] te uploaden vanwege de volgende reden: [REASON]
-Probeer het later opnieuw.
- </notification>
- <notification name="CannotCreateLandmarkNotOwner">
- U kunt hier geen land markering maken omdat de eigenaar van het land dit niet toestaat.
- </notification>
- <notification name="CannotRecompileSelectObjectsNoScripts">
- Niet mogelijk om te &apos;her compileren&apos;.
-Selecteer een object met een script.
- </notification>
- <notification name="CannotRecompileSelectObjectsNoPermission">
- Niet mogelijk om te &apos;hercompileren&apos;.
-
-Selecteer objecten met scripts waarvan u permissie heeft deze aan te passen.
- </notification>
- <notification name="CannotResetSelectObjectsNoScripts">
- Kan geen &apos;Opnieuw instellen&apos; uitvoeren.
-
-Selecteer objecten met scripts.
- </notification>
- <notification name="CannotResetSelectObjectsNoPermission">
- Kan geen &apos;Opnieuw instellen&apos; uitvoeren.
-
-Selecte objecten met scripts waarvan u permissie heeft deze aan te passen.
- </notification>
- <notification name="CannotSetRunningSelectObjectsNoScripts">
- Kan geen enkele scripts instellen op &apos;Uitvoeren&apos;.
-
-Selecteer objecten met scripts.
- </notification>
- <notification name="CannotSetRunningNotSelectObjectsNoScripts">
- Kan geen enkele scripts instellen op &apos;Niet uitvoeren&apos;.
-
-Selecteer objecten met scripts.
- </notification>
- <notification name="NoFrontmostFloater">
- Geen voorgaande floating waarde om op te slaan.
- </notification>
- <notification name="SeachFilteredOnShortWords">
- Uw zoek opdracht was aangepast en de woorden die te kort waren zijn verwijderd.
-
-Gezocht naar: [FINALQUERY]
- </notification>
- <notification name="SeachFilteredOnShortWordsEmpty">
- Uw zoek termen waren te kort en er is geen zoekopdracht uitgevoerd.
- </notification>
- <notification name="CouldNotTeleportReason">
- Kon niet Teleporteren.
-[REASON]
- </notification>
-
- <notification name="invalid_tport">
-Er is een probleem opgetreden bij het verwerken van uw verzoek voor een teleport. U dient wellicht opnieuw in te loggen voor uw kunt teleporteren. Wanneer u deze boodschap blijft ontvangen, controleert u dan alstublieft de Tech Support FAQ op:
-www.secondlife.com/support
- </notification>
- <notification name="invalid_region_handoff">
-Er is een probleem opgetreden bij het oversteken naar een andere regio. U dient wellicht opnieuw in te loggen voor uw kunt oversteken naar andere regio&apos;s. Wanneer u deze boodschap blijft ontvangen, controleert u dan alstublieft de Tech Support FAQ op:
-www.secondlife.com/support
- </notification>
- <notification name="blocked_tport">
-Sorry, teleport is momenteel geblokkeerd. Probeer het zo meteen opnieuw. Indien u nog steeds niet kunt teleporteren, log dan alstublieft uit en weer in om het probleem te verhelpen.
- </notification>
- <notification name="nolandmark_tport">
-Sorry, het systeem was niet in staat de bestemming van de landmarkering te vinden.
- </notification>
- <notification name="timeout_tport">
-Sorry, het systeem was niet in staat om de teleport verbinding af te ronden. Probeer het zo meteen nog een keer.
- </notification>
- <notification name="noaccess_tport">
-Sorry, u heeft geen toegang tot die teleportbestemming.
- </notification>
- <notification name="missing_attach_tport">
-Uw bevestigingen zijn nog niet gearriveerd. Probeer nog een aantal seconden te wachten of log uit en weer in voor u probeert te teleporteren.
- </notification>
- <notification name="too_many_uploads_tport">
-De assetwachtrij in deze regio is momenteel volgelopen, dus uw teleportverzoek zal niet tijdig afgerond kunnen worden. Probeer het alstublieft opnieuw over een aantal minuten of ga naar een minder druk gebied.
- </notification>
- <notification name="expired_tport">
-Sorry, het systeem was niet in staat uw teleportverzoek tijdig af te ronden. Probeer het alstublieft opnieuw over een aantal minuten.
- </notification>
- <notification name="expired_region_handoff">
-Sorry, het systeem was niet in staat om het oversteken naar een andere regio tijdig af te ronden. Probeer het alstublieft opnieuw over een aantal minuten.
- </notification>
- <notification name="no_host">
-Kan teleportbestemming niet vinden. De bestemming is mogelijk tijdelijk niet beschikbaar of bestaat niet meer. Probeer het alstublieft opnieuw over een aantal minuten.
- </notification>
- <notification name="no_inventory_host">
-Het inventarissysteem is momenteel niet beschikbaar.
- </notification>
-
- <notification name="CannotSetLandOwnerNothingSelected">
- Kan landeigenaar niet instellen:
-Geen perceel geselecteerd.
- </notification>
- <notification name="CannotSetLandOwnerMultipleRegions">
- Kon geen land eigendom forceren omdat de selectie meerder regio&apos;s omvat.
-Selecteer alstublieft een kleiner gebied en probeer het opnieuw.
- </notification>
- <notification name="ForceOwnerAuctionWarning">
- Dit perceel staat voor veiling aangemerkt. Eigendom forceren zal de veiling afbreking en kan potentieel een aantal inwoners niet erg blij maken als het bieden al is begonnen. Eigendom forceren?
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="CannotContentifyNothingSelected">
- Unable to contentify:
-Geen perceel geselecteerd.
- </notification>
- <notification name="CannotContentifyNoRegion">
- Unable to contentify:
-Geen regio geselecteerd.
- </notification>
- <notification name="CannotReleaseLandNothingSelected">
- Kan land niet afstaan:
-Geen perceel geselecteerd.
- </notification>
- <notification name="CannotReleaseLandNoRegion">
- Kan land niet afstaan:
-kan de regio niet vinden.
- </notification>
- <notification name="CannotBuyLandNothingSelected">
- Kan land niet kopen:
-Geen perceel geselecteerd.
- </notification>
- <notification name="CannotBuyLandNoRegion">
- Kan land niet kopen:
-Kan de regio niet vinden waar dit land zich bevind.
- </notification>
- <notification name="CannotCloseFloaterBuyLand">
- U kunt het Koop Land venster niet sluiten totdat [APP_NAME] de prijs van de transactie geschat heeft.
- </notification>
- <notification name="CannotDeedLandNothingSelected">
- Kan land niet toekennen:
-Geen perceel geselecteerd.
- </notification>
- <notification name="CannotDeedLandNoGroup">
- Kan land niet toekennen:
-Geen groep geselecteerd.
- </notification>
- <notification name="CannotDeedLandNoRegion">
- Kan land niet toekennen:
-Kan de regio niet vinden waar dit land zich bevind.
- </notification>
- <notification name="CannotDeedLandMultipleSelected">
- Kan land niet toekennen:
-Meerder percelen geselecteerd.
-
-Probeer één enkel perceel te selecteren.
- </notification>
- <notification name="ParcelCanPlayMedia">
- Deze locatie van streaming media afspelen.
-
-Streaming media vereisen een snelle internet verbinding.
-
-Streaming media afspelen wanneer beschikbaar?
-(U kunt deze optie later wijzigen onder Preferenties &gt; Audio &amp; Video.)
- <usetemplate name="okcancelbuttons" notext="Uitschakelen" yestext="Media Afspelen"/>
- </notification>
- <notification name="CannotDeedLandWaitingForServer">
- Kan land niet toekennen:
-Wacht op de server om eigendom te rapporteren.
-
-Probeer het alstublieft opnieuw.
- </notification>
- <notification name="CannotDeedLandNoTransfer">
- Kan land niet toekennen:
-De regio [REGION] staat geen overdracht van land toe.
- </notification>
- <notification name="CannotReleaseLandWatingForServer">
- Kan land niet afstaan:
-Wacht op server om de perceel informatie bij te werken.
-
-Probeer het over enkele ogenblikken opnieuw.
- </notification>
- <notification name="CannotReleaseLandSelected">
- Kan land niet afstaan:
-Niet alle geselecteerde percelen zijn uw eigendom.
-
-Kies alstublieft één perceel.
- </notification>
- <notification name="CannotReleaseLandDontOwn">
- Kan land niet afstaan:
-U heeft geen permissie dit perceel vrij te geven.
-Percelen in uw eigendom verschijnen in groen.
- </notification>
- <notification name="CannotReleaseLandRegionNotFound">
- Kan land niet afstaan:
-Kan de regio niet vinden waar dit land zich bevind.
- </notification>
- <notification name="CannotReleaseLandNoTransfer">
- Kan land niet afstaan:
-De regio [REGION] staat geen overdracht van land toe.
- </notification>
- <notification name="CannotReleaseLandPartialSelection">
- Kan land niet afstaan:
-U moet het gehele perceel selecteren om het vrij te kunnen geven.
-
-Selecteer het gehele perceel of deel het eerst op.
- </notification>
- <notification name="ReleaseLandWarning">
- U staat op het punt om [AREA] m² land af te staan.
-Met het afstaan van dit perceel zal het uit uw land houderschapsoverzicht verdwijnen, maar zal u geen L$ toekennen.
-
-Dit land afstaan?
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="CannotDivideLandNothingSelected">
- Kan land niet opdelen:
-
-Geen percelen geselecteerd.
- </notification>
- <notification name="CannotDivideLandPartialSelection">
- Kan land niet opdelen:
-
-U heeft het gehele perceel geselecteerd.
-Probeer een deel van het perceel te selecteren.
- </notification>
- <notification name="LandDivideWarning">
- Opdelen zal het perceel in twee delen verdelen en elk perceel kan zijn eigen instellingen hebben. Sommige instellingen zullen naar de standaard waarden terugkeren als de operatie voltooid is.
-
-Land opdelen?
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="CannotDivideLandNoRegion">
- Kan het land niet opdelen:
-Kan de regio niet vinden waar dit land zich bevind.
- </notification>
- <notification name="CannotJoinLandNoRegion">
- Kan land niet verbinden:
-Kan de regio niet vinden waar dit land zich bevind.
- </notification>
- <notification name="CannotJoinLandNothingSelected">
- Kan land niet verbinden:
-Geen perceel geselecteerd.
- </notification>
- <notification name="CannotJoinLandEntireParcelSelected">
- Kan land niet verbinden:
-U heeft slechts één perceel geselecteerd.
-
-Selecteer land over beide percelen.
- </notification>
- <notification name="CannotJoinLandSelection">
- Kan land niet verbinden:
-U moet meer dan één perceel selecteren.
-
-Selecteer land over beide percelen.
- </notification>
- <notification name="JoinLandWarning">
- Het verbinding van dit land zal één groot perceel opleveren uit alle percelen die de rechthoek doorkruisen.
-U zult de naam en opties van het nieuwe perceel opnieuw in moeten stellen.
-
-Land verbinden?
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="ShowOwnersHelp">
- Toon eigenaren:
-Kleur percelen om het eigenaarstype te tonen.
-
-Groen = Uw land
-Aqua = Land van uw groep
-Rood = Eigendom van anderen
-Geel = Te koop
-Paars = Ter veiling
-Grijs = Openbaar
- </notification>
- <notification name="ConfirmNotecardSave">
- Deze notitiekaart zal moet worden opgeslagen voordat het item kan worden gekopieerd of bekeken. Notitiekaart opslaan?
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="ConfirmItemCopy">
- Dit item naar uw inventaris kopiëren?
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="Kopiëren"/>
- </notification>
- <notification name="ResolutionSwitchFail">
- Mislukt om resolutie te verwisselen van [RESX] naar [RESY]
- </notification>
- <notification name="ErrorUndefinedGrasses">
- Fout: Onbekend gras: [SPECIES]
- </notification>
- <notification name="ErrorUndefinedTrees">
- Fout: Onbekende bomen: [SPECIES]
- </notification>
- <notification name="CannotSaveWearableOutOfSpace">
- Kon &apos;[NAME]&apos; niet opslaan voor draagbaar item. U zult wat ruimte moeten maken op uw computer en het draagbare item opnieuw op moeten slaan.
- </notification>
- <notification name="CannotSaveToAssetStore">
- Kon [NAME] niet opslaan in centrale (asset) opslag.
-Meestal is dit een tijdelijk probleem.
-Wijzig en sla het draagbaar item over een paar minuten opnieuw op.
- </notification>
- <notification name="YouHaveBeenLoggedOut">
- U bent uitgelogd uit [SECOND_LIFE]:
-[MESSAGE]
-U kunt uw bestaande IM en chat bekijken door te klikken op &apos;Toon IM &amp; Chat&apos;. Anders, klik op Afsluiten om [APP_NAME] direct te verlaten.
- <usetemplate name="okcancelbuttons" notext="Afsluiten" yestext="Toon IM &amp; Chat"/>
- </notification>
- <notification name="OnlyOfficerCanBuyLand">
- Kan land niet voor de groep kopen:
-U heeft geen permissie land te kopen voor de actieve groep.
- </notification>
- <notification label="Vriend Toevoegen" name="AddFriend">
- Vrienden kunnen elkaar permissie geven om elkaar te volgen op de Kaart en om Online status updates te verkrijgen.
-
-Vriendschap aanbieden aan [NAME]?
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification label="Vriend Toevoegen" name="AddFriendWithMessage">
- Vrienden kunnen elkaar permissie geven om elkaar te volgen op de Kaart en om Online status updates te verkrijgen.
-
-Vriendschap aanbieden aan [NAME]?
- <form name="form">
- <input name="message">
- Wilt U mijn vriend zijn?
- </input>
- <button name="Offer" text="OK"/>
- <button name="Cancel" text="Annuleren"/>
- </form>
- </notification>
- <notification name="RemoveFromFriends">
- Wilt u [FIRST_NAME] [LAST_NAME] van uw Vriend lijst verwijderen?
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="RemoveMultipleFromFriends">
- Wilt u meerder vrienden van uw Vrienden lijst verwijderen?
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="GodDeleteAllScriptedPublicObjectsByUser">
- Weet u zeker dat u alle gescripte objecten wilt verwijderen eigendom van
-** [AVATAR_NAME] **
-op allen hun land in deze sim?
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="GodDeleteAllScriptedObjectsByUser">
- Weet u zeker dat u ALLE gescripte objecten wilt VERWIJDEREN eigendom van
-** [AVATAR_NAME] **
-op AL het land in deze sim?
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="GodDeleteAllObjectsByUser">
- Weet u zeker, dat u ALLE objecten (gescript of niet) wilt VERWIJDEREN eigendom van
-** [AVATAR_NAME] **
-op AL het LAND in deze sim?
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="BlankClassifiedName">
- U moet een naam opgeven voor uw advertentie.
- </notification>
- <notification name="MinClassifiedPrice">
- De prijs voor weergave moet minimaal L$[MIN_PRICE] zijn.
-
-Voor alstublieft een hoger bedrag in.
- </notification>
- <notification name="ConfirmObjectDeleteLock">
- Ten minste één van de geselecteerde items is geblokkeerd.
-
-Weet u zeker dat u deze items wilt verwijderen?
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="ConfirmObjectDeleteNoCopy">
- Ten minste één van de geselecteerde items is niet kopieerbaar.
-
-Weet u zeker dat u deze items wilt verwijderen?
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="ConfirmObjectDeleteNoOwn">
- Tenminste één van de geselecteerde items is niet uw eigendom.
-
-Weet u zeker dat u deze items wilt verwijderen?
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="ConfirmObjectDeleteLockNoCopy">
- Ten minste één item is geblokkeerd.
-Ten minste één item is niet kopieerbaar.
-
-Weet u zeker dat u deze items wilt verwijderen?
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="ConfirmObjectDeleteLockNoOwn">
- Ten minste één item is geblokkeerd.
-Tenminste één object is niet uw eigendom.
-
-Weet u zeker dat u deze items wilt verwijderen?
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="ConfirmObjectDeleteNoCopyNoOwn">
- Ten minste één object is niet kopieerbaar.
-Tenminste één object is niet uw eigendom.
-
-Weet u zeker dat u deze items wilt verwijderen?
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="ConfirmObjectDeleteLockNoCopyNoOwn">
- Ten minste één item is geblokkeerd.
-Ten minste één item is niet kopieerbaar.
-Tenminste één object is niet uw eigendom.
-
-Weet u zeker dat u deze items wilt verwijderen?
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="ConfirmObjectTakeLock">
- Ten minste één object is geblokkeerd.
-
-Weet u zeker dat u deze items terug wilt nemen?
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="ConfirmObjectTakeNoOwn">
- Niet alle objecten die u terug neemt zijn uw eigendom.
-Indien u verder gaat, worden de permissies van de volgende eigenaar er op toegepast en beperkt het u mogelijk het aan te passen of te kopiëren.
-
-Weet u zeker dat u deze items terug wilt nemen?
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="ConfirmObjectTakeLockNoOwn">
- Ten minste één object is geblokkeerd.
-Niet alle objecten die u terug neemt zijn uw eigendom.
-Indien u verder gaat, worden de permissies van de volgende eigenaar er op toegepast en beperkt het u mogelijk het aan te passen of te kopiëren.
-Echter, U kunt de huidige selectie wel terugnemen.
-
-Weet u zeker dat u deze items terug wilt nemen?
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="CantBuyLandAcrossMultipleRegions">
- Kan het land niet kopen omdat het meerder regio&apos;s omvat.
-
-Kiest u alstublieft een kleiner gebied en probeer het opnieuw.
- </notification>
- <notification name="DeedLandToGroup">
- Voor het overdragen van dit perceel zal de groep voldoen land gebruikscredit moeten hebben en onderhouden.
-Het aankoop bedrag zal niet naar de eigenaar worden terug gestort.
-Indien een overgedragen perceel wordt verkocht, zal het verkoop bedrag gelijkmatig over de groepsleden worden verdeeld.
-
-Deze [AREA] m² land overdragen aan de groep &apos;[GROUP_NAME]&apos;?
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="DeedLandToGroupWithContribution">
- Voor het overdragen van dit perceel zal de groep voldoen land gebruikscredit moeten hebben en onderhouden.
-De overdracht zal een simultane land contributie verlangen van de groep van &apos;[FIRST_NAME] [LAST_NAME]&apos;.
-Het aankoop bedrag zal niet naar de eigenaar worden terug gestort.
-Indien een overgedragen perceel wordt verkocht, zal het verkoop bedrag gelijkmatig over de groepsleden worden verdeeld.
-
-Deze [AREA] m² land overdragen aan de groep &apos;[GROUP_NAME]&apos;?
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="DisplaySetToSafe">
- Weergave instellingen zijn op veilige waarden ingesteld omdat u de -save optie op heeft gegeven.
- </notification>
- <notification name="DisplaySetToRecommended">
- Weergave instellingen zijn ingesteld op geadviseerde waarden, gebaseerd op uw systeem configuratie.
- </notification>
- <notification name="ErrorMessage">
- [ERROR_MESSAGE]
- </notification>
- <notification name="AvatarMoved">
- Uw [TYPE] locatie is momenteel niet beschikbaar.
-[HELP]
-U bent naar een nabij gelegen regio verplaatst.
- </notification>
- <notification name="ClothingLoading">
- Uw kleding wordt nog steeds geladen.
-U kunt [SECOND_LIFE] normaal gebruiken en anderen zullen u correct zien.
- <form name="form">
- <ignore name="ignore" text="Indien kleding een erg lange tijd in beslag neemt om de laden"/>
- </form>
- </notification>
- <notification name="FirstRun">
- [APP_NAME] installatie compleet.
-
-Als dit de eerste keer is dat u [SECOND_LIFE] gebruikt, zult u een account aan moeten maken voordat u in kan loggen.
-Terugkeren naar [https://join.secondlife.com/index.php?lang=nl-NL secondlife.com] om een nieuw account aan te maken?
- <usetemplate name="okcancelbuttons" notext="Doorgaan" yestext="Nieuw Account..."/>
- </notification>
- <notification name="LoginPacketNeverReceived">
- Wij hebben problemen verbinding te maken. Er zou een probleem kunnen zijn met uw internet verbinding of met de [SECOND_LIFE] servers.
-
-U kunt uw internet verbinding controleren en het over een paar minuten opnieuw proberen, op Help klikken om verbinding te maken met onze support website, of klik op Teleporteren om een poging te doen naar uw thuis locatie te teleporteren.
- <form name="form">
- <button name="OK" text="OK"/>
- <button name="Help" text="Help"/>
- <button name="Teleport" text="Teleport"/>
- </form>
- </notification>
- <notification name="WelcomeChooseSex">
- Uw avatar zal over enkele ogenblikken verschijnen.
-
-Gebruik de pijltjestoetsen om te lopen.
-Druk op elk gewenst moment op F1 voor Help en om meer te leren over [SECOND_LIFE].
-Kies alstublieft een mannelijk of vrouwelijke avatar. U kunt later nog van gedachten veranderen.
- <usetemplate name="okcancelbuttons" notext="Vrouw" yestext="Man"/>
- </notification>
- <notification name="NotEnoughCurrency">
- [NAME] L$ [PRICE] U heeft niet genoeg L$ om dit te doen.
- </notification>
- <notification name="GrantedModifyRights">
- U heeft het recht verkregen om objecten van [FIRST_NAME] [LAST_NAME] te wijzigen.
- </notification>
- <notification name="RevokedModifyRights">
- Uw recht om objecten van [FIRST_NAME] [LAST_NAME] is ingetrokken.
- </notification>
- <notification name="FlushMapVisibilityCaches">
- Dit zal de Kaart cache van deze regio opschonen.
-
-Dit is eigenlijk alleen nuttig voor debugging.
-(In productie, wacht 5 minuten, dan zal de Kaart van iedereen bijgewerkt worden als ze opnieuw verbinden.)
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="BuyOneObjectOnly">
- Kan niet meer dan één object tegelijkertijd kopen. Selecteer alstublieft slechts één object en probeer opnieuw.
- </notification>
- <notification name="OnlyCopyContentsOfSingleItem">
- Kan niet de inhoud van meer dan één item per keer kopiëren.
-Kies alstublieft slechts één object en probeer het opnieuw.
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="KickUsersFromRegion">
- Alle Inwoners in deze regio naar de thuis locatie Teleporteren?
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="EstateObjectReturn">
- Weet u zeker dat u alle objecten wilt retourneren eigendom van [USER_NAME] ?
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="InvalidTerrainBitDepth">
- Kon de regio textuur niet plaatsen:
-Terrein textuur [TEXTURE_NUM] heeft een ongeldige bit diepte van [TEXTURE_BIT_DEPTH].
-
-Vervang de textuur [TEXTURE_NUM] met een 24-bit 512x512 of een kleinere afbeelding, klik dan op opnieuw op &quot;Toepassen&quot;.
- </notification>
- <notification name="InvalidTerrainSize">
- Kon de regio textuur niet plaatsen:
-Terrein textuur [TEXTURE_NUM] is te groot met [TEXTURE_SIZE_X]x[TEXTURE_SIZE_Y].
-
-Vervang de textuur [TEXTURE_NUM] met een 24-bit 512x512 of een kleinere afbeelding, klik dan op opnieuw op &quot;Toepassen&quot;.
- </notification>
- <notification name="RawUploadStarted">
- Upload gestart. Het kan tot twee minuten duren, afhankelijk van u verbindings snelheid.
- </notification>
- <notification name="ConfirmBakeTerrain">
- Wilt u werkelijk het huidige terrein &apos;baken&apos;, dit als middelpunt voor de verhoog/verlaag limieten instellen en als standaard instellen voor het &apos;Herstel&apos; gereedschap?
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="MaxAllowedAgentOnRegion">
- U kunt slechts [MAX_AGENTS] Toegestane Inwoners hebben.
- </notification>
- <notification name="MaxBannedAgentsOnRegion">
- U kunt slechts [MAX_BANNED] Verbannen Inwoners hebben.
- </notification>
- <notification name="MaxAgentOnRegionBatch">
- Een poging [NUM_ADDED] agents toe te voegen is mislukt:
-Overstijgt de [MAX_AGENTS] [LIST_TYPE] limiet met [NUM_EXCESS].
- </notification>
- <notification name="MaxAllowedGroupsOnRegion">
- U kunt slechts [MAX_GROUPS] Toegestane Groepen hebben.
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="Bake"/>
- </notification>
- <notification name="MaxManagersOnRegion">
- U kunt slechts [MAX_MANAGER] Estate Beheerders hebben.
- </notification>
- <notification name="OwnerCanNotBeDenied">
- Kan de estate eigenaar niet aan de Verbannen lijst van het estate toe voegen.
- </notification>
- <notification name="CanNotChangeAppearanceUntilLoaded">
- Kan het Uiterlijk niet veranderen totdat kleding en Postuur geladen zijn.
- </notification>
- <notification name="ClassifiedMustBeAlphanumeric">
- De naam van uw advertentie moet beginnen met een letter van A tot Z of een nummer.
-Leestekens zijn niet toegestaan.
- </notification>
- <notification name="CantSetBuyObject">
- Kan Koop Object niet instellen omdat het object niet te koop is.
-Zet het object alstublieft te koop en probeer het opnieuw.
- </notification>
- <notification name="FinishedRawDownload">
- Download van raw terrein bestand geëindigd naar:
-[DOWNLOAD_PATH].
- </notification>
- <notification name="DownloadWindowsMandatory">
- Een nieuwe versie van [APP_NAME] is beschikbaar.
-[MESSAGE]
-U moet deze update downloaden om [APP_NAME] te kunnen gebruiken.
- <usetemplate name="okcancelbuttons" notext="Afsluiten" yestext="Download"/>
- </notification>
- <notification name="DownloadWindows">
- Een bijgewerkte versie van [APP_NAME] is beschikbaar.
-[MESSAGE]
-Deze update is niet vereist, maar wij raden aan dat u het installeert om de prestaties en stabiliteit te verbeteren.
- <usetemplate name="okcancelbuttons" notext="Doorgaan" yestext="Download"/>
- </notification>
- <notification name="DownloadWindowsReleaseForDownload">
- Een bijgewerkte versie van [APP_NAME] is beschikbaar.
-[MESSAGE]
-Deze update is niet vereist, maar wij raden aan dat u het installeert om de prestaties en stabiliteit te verbeteren.
- <usetemplate name="okcancelbuttons" notext="Doorgaan" yestext="Download"/>
- </notification>
- <notification name="DownloadMacMandatory">
- Een nieuwe versie van [APP_NAME] is beschikbaar.
-[MESSAGE]
-U moet deze update downloaden om [APP_NAME] te kunnen gebruiken.
-
-Downloaden naar uw Applicatie Data map?
- <usetemplate name="okcancelbuttons" notext="Afsluiten" yestext="Download"/>
- </notification>
- <notification name="DownloadMac">
- Een bijgewerkte versie van [APP_NAME] is beschikbaar.
-[MESSAGE]
-Deze update is niet vereist, maar wij raden aan dat u het installeert om de prestaties en stabiliteit te verbeteren.
-
-Downloaden naar uw Applicatie Data map?
- <usetemplate name="okcancelbuttons" notext="Doorgaan" yestext="Download"/>
- </notification>
- <notification name="DownloadMacReleaseForDownload">
- Een bijgewerkte versie van [APP_NAME] is beschikbaar.
-[MESSAGE]
-Deze update is niet vereist, maar wij raden aan dat u het installeert om de prestaties en stabiliteit te verbeteren.
-
-Downloaden naar uw Applicatie Data map?
- <usetemplate name="okcancelbuttons" notext="Doorgaan" yestext="Download"/>
- </notification>
- <notification name="DeedObjectToGroup">
- Dit object overdragen aan de groep zal de groep:
-* L$ ontvangen als betaald in het object
- <usetemplate ignoretext="Bij objecten die overgedragen worden aan groepen" name="okcancelignore" notext="Annuleren" yestext="Overdragen"/>
- </notification>
- <notification name="WebLaunchExternalTarget">
- Uw systeem browser openen om deze inhoud te bekijken?
- <usetemplate ignoretext="Bij openen van systeem browser om de webpagina te bekijken" name="okcancelignore" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="WebLaunchJoinNow">
- Naar www.secondlife.com gaan om uw account te beheren?
- <usetemplate ignoretext="Bij openen van webbrowser om uw account te beheren" name="okcancelignore" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="WebLaunchSecurityIssues">
- Bezoek de [SECOND_LIFE] Wiki voor details over hoe een Veiligheids Probleem (Security Issue) te rapporteren.
- <usetemplate ignoretext="Bij openen webbrowser om de Veiligheids Problemen Wiki (Security Issues Wiki) te bekijken" name="okcancelignore" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="WebLaunchQAWiki">
- Bezoek de [SECOND_LIFE] QA Wiki (Kwaliteitsbeheersing Wiki).
- <usetemplate ignoretext="Bij openen webbrowser om de QA Wiki (Kwaliteitsbeheersing Wiki) te bekijken" name="okcancelignore" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="WebLaunchPublicIssue">
- Bezoek de [SECOND_LIFE] Publieke problemenlijst, waar u Bugs en andere Problemen kunt rapporteren.
- <usetemplate ignoretext="Bij openen webbrowser om de Publieke problemenlijst te bekijken" name="okcancelignore" notext="Annuleren" yestext="Ga naar pagina"/>
- </notification>
- <notification name="WebLaunchPublicIssueHelp">
- Bezoek de [SECOND_LIFE] Wiki voor informatie over het gebruik van de Publieke problemenlijst.
- <usetemplate ignoretext="Bij openen webbrowser om de Publieke problemenlijst Wiki te bekijken" name="okcancelignore" notext="Annuleren" yestext="Ga naar pagina"/>
- </notification>
- <notification name="WebLaunchSupportWiki">
- Ga naar de Officiële Linden Blog voor het laatste Nieuws en Informatie.
- <usetemplate ignoretext="Bij openen webbrowser om de blog te bekijken" name="okcancelignore" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="WebLaunchLSLGuide">
- Naar de Script Gids gaan voor hulp met scripten?
- <usetemplate ignoretext="Bij openen webbrowser om de Script Gids te bekijken" name="okcancelignore" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="WebLaunchLSLWiki">
- Naar de LSL Portaal gaan voor hulp met scripten?
- <usetemplate ignoretext="Bij openen webbrowser om de LSL Portal te bekijken" name="okcancelignore" notext="Annuleren" yestext="Ga naar pagina"/>
- </notification>
- <notification name="ReturnToOwner">
- Weet u zeker dat u de geselecteerde objecten wilt retourneren naar de eigenaren?
-Overdraagbare toegekende objecten zullen naar de oorspronkelijke eigenaren worden geretourneerd.
-
-*WAARSCHUWING* Niet overdraagbare toegekende objecten zullen worden verwijderd!
- <usetemplate ignoretext="Bij retourneren objecten naar de eigenaren" name="okcancelignore" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="GroupLeaveConfirmMember">
- U bent momenteel een lid van de groep [GROUP].
-Groep Verlaten?
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="ConfirmKick">
- Weet u HEEL ZEKER dat u alle gebruikers uit het grid wilt verwijderen?
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="Verwijder Alle Gebruikers"/>
- </notification>
- <notification name="MuteLinden">
- Sorry, u kunt geen Linden Negeren
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="CannotStartAuctionAlreadyForSale">
- U kunt geen veiling starten op een perceel dat al te koop is gezet. Schakel de landverkoop uit wanneer u zeker bent dat u een veiling wil starten.
- </notification>
- <notification label="Negeren van object mislukt" name="MuteByNameFailed">
- U heeft deze naam al genegeerd.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="RemoveItemWarn">
- Alhoewel toegestaan, verwijderen van de inhoud kan het object beschadigen. Wilt u dit item verwijderen?
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="CantOfferCallingCard">
- Kan op dit moment geen visitekaart aanbieden. Probeer het alstublieft later opnieuw.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="CantOfferFriendship">
- Kan op dit moment geen vriendschap aanbieden. Probeer het alstublieft later opnieuw.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="BusyModeSet">
- Niet Storen modus ingesteld.
-
-Chat and instant messages zullen verborgen blijven. Instant messages zullen uw Niet Storen melding krijgen. Alle teleport aanbiedingen zullen worden afgewezen. Alle inventaris aanbiedingen zullen in uw Vuilnisbak terecht komen.
- <usetemplate ignoretext="Bij instellen Niet Storen modus" name="okignore" yestext="OK"/>
- </notification>
- <notification name="JoinedTooManyGroupsMember">
- U ben lid van teveel groepen om lid te worden van een andere. Verlaat op zijn minst één groep alvorens lid te worden van een andere of weiger de lidmaatschap aanbieding.
-Om een groep te verlaten, selecteer de &apos;Groep..&apos; optie via het &apos;Bewerken&apos; menu.
-
-[NAME] heeft u uitgenodigd om lid te worden van de groep als algemeen lid.
-
-[INVITE]
- <usetemplate name="okcancelbuttons" notext="Afslaan" yestext="Lid worden"/>
- </notification>
- <notification name="KickUser">
- Verwijder deze gebruiker met welk bericht?
- <form name="form">
- <input name="message">
- Een administrator heeft u uitgelogd.
- </input>
- <button name="OK" text="OK"/>
- <button name="Cancel" text="Annuleren"/>
- </form>
- </notification>
- <notification name="KickAllUsers">
- Verwijder iedereen momenteel op het grid met welk bericht?
- <form name="form">
- <input name="message">
- Een administrator heeft u uitgelogd.
- </input>
- <button name="OK" text="OK"/>
- <button name="Cancel" text="Annuleren"/>
- </form>
- </notification>
- <notification name="FreezeUser">
- Bevries deze gebruiker met welk bericht?
- <form name="form">
- <input name="message">
- U bent bevroren. U kunt zich niet verplaatsen of praten. Een administrator zal contact met u opnemen via instant message (IM).
- </input>
- <button name="OK" text="OK"/>
- <button name="Cancel" text="Annuleren"/>
- </form>
- </notification>
- <notification name="UnFreezeUser">
- Ontdooi deze gebruiker met welk bericht?
- <form name="form">
- <input name="message">
- U bent niet langer bevroren.
- </input>
- <button name="OK" text="OK"/>
- <button name="Cancel" text="Annuleren"/>
- </form>
- </notification>
- <notification name="OfferTeleport">
- Een Teleport aanbieden naar uw locatie met welk bericht?
- <form name="form">
- <input name="message">
- Voeg u bij mij in [REGION]
- </input>
- <button name="OK" text="OK"/>
- <button name="Cancel" text="Annuleren"/>
- </form>
- </notification>
- <notification name="OfferTeleportFromGod">
- God beveel gebruiker naar uw locatie?
- <form name="form">
- <input name="message">
- Voeg u bij mij in [REGION]
- </input>
- <button name="OK" text="OK"/>
- <button name="Cancel" text="Annuleren"/>
- </form>
- </notification>
- <notification name="TeleportFromLandmark">
- Weet u zeker dat u wilt teleporteren?
- <usetemplate ignoretext="Bij teleporteren via een landmarkering in inventaris" name="okcancelignore" notext="Annuleren" yestext="Teleporteren"/>
- </notification>
- <notification label="Bericht iedereen in uw Estate" name="MessageEstate">
- Type een kort bericht om naar iedereen sturen die momenteel in uw Estate aanwezig is.
- <form name="form">
- <input name="message"/>
- <button name="OK" text="OK"/>
- <button name="Cancel" text="Annuleren"/>
- </form>
- </notification>
- <notification label="Wijzig Linden Estate" name="ChangeLindenEstate">
- U staat op het punt een Linden beheerde Estate te wijzigen mainland, teen grid, orientation, etc.).
-
-Dit is EXTREEM GEVAARLIJK om het fundamenteel de gebruikers ervaring kan aantasten.
-Op het mainland zal het duizenden regionen wijzigen en de spaceserver kan storingen vertonen.
-
-Doorgaan?
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification label="Wijzig Linden Estate Toegang" name="ChangeLindenAccess">
- U staat op het punt de toegangslijst van een Linden Estate eigendom aan te passen (mainland, teen grid, orientation, etc.).
-
-Dit is GEVAARLIJK en zou alleen gedaan moeten worden om de hack toe te staan om objecten/L$ over te dragen in/uit het grid.
-Het zal het duizenden regionen wijzigen en de spaceserver kan storingen vertonen.
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification label="Selecteer Estate" name="EstateAllowedAgentAdd">
- Alleen aan toegangslijst voor dit Estate toevoegen of voor [ALL_ESTATES]?
- <usetemplate canceltext="Annuleren" name="yesnocancelbuttons" notext="Alle Estates" yestext="Dit Estate"/>
- </notification>
- <notification label="Selecteer Estate" name="EstateAllowedAgentRemove">
- Verwijderen van toegangslijst voor alleen dit Estate of voor [ALL_ESTATES]?
- <usetemplate canceltext="Annuleren" name="yesnocancelbuttons" notext="Alle Estates" yestext="Dit Estate"/>
- </notification>
- <notification label="Selecteer Estate" name="EstateAllowedGroupAdd">
- Alleen aan groeps toegangslijst voor dit Estate toevoegen of voor [ALL_ESTATES]?
- <usetemplate canceltext="Annuleren" name="yesnocancelbuttons" notext="Alle Estates" yestext="Dit Estate"/>
- </notification>
- <notification label="Selecteer Estate" name="EstateAllowedGroupRemove">
- Verwijderen van groeps toegangslijst voor alleen dit Estate of voor [ALL_ESTATES]?
- <usetemplate canceltext="Annuleren" name="yesnocancelbuttons" notext="Alle Estates" yestext="Dit Estate"/>
- </notification>
- <notification label="Selecteer Estate" name="EstateBannedAgentAdd">
- Weiger toegang voor alleen dit Estate of voor [ALL_ESTATES]?
- <usetemplate canceltext="Annuleren" name="yesnocancelbuttons" notext="Alle Estates" yestext="Dit Estate"/>
- </notification>
- <notification label="Selecteer Estate" name="EstateBannedAgentRemove">
- Deze Inwoner van de ban lijst voor toegang voor alleen dit Estate verwijderen of voor [ALL_ESTATES]?
- <usetemplate canceltext="Annuleren" name="yesnocancelbuttons" notext="Alle Estates" yestext="Dit Estate"/>
- </notification>
- <notification label="Selecteer Estate" name="EstateManagerAdd">
- Estate beheerder toevoegen voor alleen dit Estate of voor [ALL_ESTATES]?
- <usetemplate canceltext="Annuleren" name="yesnocancelbuttons" notext="Alle Estates" yestext="Dit Estate"/>
- </notification>
- <notification label="Selecteer Estate" name="EstateManagerRemove">
- Estate beheerder verwijderen voor alleen dit Estate of voor [ALL_ESTATES]?
- <usetemplate canceltext="Annuleren" name="yesnocancelbuttons" notext="Alle Estates" yestext="Dit Estate"/>
- </notification>
- <notification label="Bevestig Verwijderen" name="EstateKickUser">
- Verwijder [EVIL_USER] van deze Estate?
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="EstateChangeCovenant">
- Weet u zeker dat u de Estate Convenant wilt wijzigen?
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="RegionEntryAccessBlocked">
- U wordt niet in die regio toegelaten vanwege uw inhoudscategorie. Dit kan het gevolg zijn van een gebrek aan informatie die uw leeftijd valideert.
-
-Verifieer alstublieft dat u de nieuwste viewer heeft geïnstalleerd en ga naar de kennisbank voor details over het betreden van gebieden met deze inhoudscategorie.
- <usetemplate
- name="okbutton"
- yestext="OK"/>
- </notification>
- <notification name="RegionEntryAccessBlocked_KB">
- U wordt niet in die regio toegelaten vanwege uw inhoudscategorie.
-
-Ga naar de kennisbank voor meer informatie over inhoudscategorieën?
- <url name="url">
- https://support.secondlife.com/ics/support/default.asp?deptID=4417&amp;task=knowledge&amp;questionID=6010
- </url>
- <usetemplate
- name="okcancelignore"
- yestext="Ga naar kennisbank"
- notext="Sluiten"
- ignoretext="Wanneer regiotoegang wordt geblokkeerd vanwege de inhoudscategorie"/>
- </notification>
- <notification name="RegionEntryAccessBlocked_Notify">
- U wordt niet in die regio toegelaten vanwege uw inhoudscategorie.
- </notification>
- <notification name="RegionEntryAccessBlocked_Change">
- U wordt niet in die regio toegelaten vanwege uw inhoudscategorie.
-
-U kunt klikken op &apos;Wijzig voorkeur&apos; om uw inhoudscategorie voorkeur nu te verhogen en toegelaten te worden. U zult in staat zijn om [REGIONMATURITY] inhoud te zoeken en benaderen vanaf dit moment. Wanneer u later deze instelling wilt wijzigen, ga dan naar Bewerken &gt; Voorkeuren... &gt; Algemeen.
- <form name="form">
- <button
- name="OK"
- text="Wijzig voorkeur"/>
- <button
- default="true"
- name="Cancel"
- text="Sluiten"/>
- <ignore name="ignore" text="Wanneer regiotoegang wordt geblokkeerd vanwege de inhoudscategorie voorkeur"/>
- </form>
- </notification>
- <notification name="LandClaimAccessBlocked">
- U kunt dit land niet opeisen vanwege uw inhoudscategorie. Dit kan het gevolg zijn van een gebrek aan informatie die uw leeftijd valideert.
-
-Verifieer alstublieft dat u de nieuwste viewer heeft geïnstalleerd en ga naar de kennisbank voor details over het betreden van gebieden met deze inhoudscategorie.
- <usetemplate
- name="okbutton"
- yestext="OK"/>
- </notification>
- <notification name="LandClaimAccessBlocked_KB">
- U kunt dit land niet opeisen vanwege uw inhoudscategorie.
-
-Ga naar de kennisbank voor meer informatie over inhoudscategorieën?
- <url name="url">
- https://support.secondlife.com/ics/support/default.asp?deptID=4417&amp;task=knowledge&amp;questionID=6010
- </url>
- <usetemplate
- name="okcancelignore"
- yestext="Ga naar kennisbank"
- notext="Sluiten"
- ignoretext="Wanneer het opeisen van land wordt geblokkeerd vanwege de inhoudscategorie"/>
- </notification>
- <notification name="LandClaimAccessBlocked_Notify">
- U kunt dit land niet opeisen vanwege uw inhoudscategorie.
- </notification>
- <notification name="LandClaimAccessBlocked_Change">
- U kunt dit land niet opeisen vanwege uw inhoudscategorie voorkeur.
-
-U kunt klikken op &apos;Wijzig voorkeur&apos; om uw inhoudscategorie voorkeur nu te verhogen en toegang te krijgen om binnen te treden. U zult in staat zijn om [REGIONMATURITY] inhoud vanaf nu te zoeken en benaderen. Wanneer u deze instelling later terug wilt zetten, gaat u naar Bewerken &gt; Voorkeuren... &gt; Algemeen.
- <usetemplate
- name="okcancelignore"
- yestext="Wijzig voorkeur"
- notext="Sluiten"
- ignoretext="Wanneer het opeisen van land wordt geblokkeerd vanwege de inhoudscategorie voorkeur"/>
- </notification>
- <notification name="LandBuyAccessBlocked">
- U kunt dit land niet kopen vanwege uw inhoudscategorie. Dit kan het gevolg zijn van een gebrek aan informatie die uw leeftijd valideert.
-
-Verifieer alstublieft of u de nieuwste viewer heeft geïnstalleerd en ga naar de kennisbank voor details over het betreden van gebieden met deze inhoudscategorie.
- <usetemplate
- name="okbutton"
- yestext="OK"/>
- </notification>
- <notification name="LandBuyAccessBlocked_KB">
- U kunt dit land niet kopen vanwege uw inhoudscategorie.
-
-Ga naar de kennisbank voor meer informatie over inhoudscategorieën?
- <url name="url">
- https://support.secondlife.com/ics/support/default.asp?deptID=4417&amp;task=knowledge&amp;questionID=6010
- </url>
- <usetemplate
- name="okcancelignore"
- yestext="Ga naar kennisbank"
- notext="Sluiten"
- ignoretext="Wanneer een landaankoop wordt geblokkeerd vanwege de inhoudscategorie"/>
- </notification>
- <notification name="LandBuyAccessBlocked_Notify">
- U kunt dit land niet kopen vanwege uw inhoudscategorie.
- </notification>
- <notification name="LandBuyAccessBlocked_Change">
- U kunt dit land niet kopen vanwege uw inhoudscategorie voorkeur.
-
-U kunt klikken op &apos;Wijzig voorkeur&apos; om uw inhoudscategorie voorkeur nu te verhogen en toegang te krijgen om binnen te treden. U zult in staat zijn om [REGIONMATURITY] inhoud vanaf nu te zoeken en benaderen. Wanneer u deze instelling later terug wilt zetten, gaat u naar Bewerken &gt; Voorkeuren... &gt; Algemeen.
- <usetemplate
- name="okcancelignore"
- yestext="Wijzig voorkeur"
- notext="Sluiten"
- ignoretext="Wanneer een landaankoop wordt geblokkeerd vanwege de inhoudscategorie voorkeur"/>
- </notification>
- <notification name="TooManyPrimsSelected">
- &quot;Er zijn teveel prims geselecteerd. Selecteer alstublieft [MAX_PRIM_COUNT] of minder prims en probeer opnieuw.&quot;
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="ProblemImportingEstateCovenant">
- Probleem met importeren Estate Convenant.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="ProblemAddingEstateManager">
- Problemen met het toevoegen van een Estate beheerder. Eén of meer Estates kunnen een volle beheerders lijst hebben.
- </notification>
- <notification name="ProblemAddingEstateGeneric">
- Problemen met toevoegen aan deze Estate lijst. Eén of meer Estates kunnen een volle lijst hebben.
- </notification>
- <notification name="UnableToLoadNotecardAsset">
- Kan de asset van de notitiekaart op dit moment niet laden.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="NotAllowedToViewNotecard">
- Onvoldoende rechten om de notitiekaart in te zien geassocieerd met het opgevraagde asset ID.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="MissingNotecardAssetID">
- Asset ID voor de notitiekaart ontbreekt in de database.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="PublishClassified">
- Bedenk: kosten voor advertenties worden niet terugbetaald.
-
-Advertentie nu Publiceren voor L$[AMOUNT]?
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="SetClassifiedMature">
- Bevat deze advertentie Mature inhoud?
- <usetemplate
- canceltext="Annuleren"
- name="yesnocancelbuttons"
- notext="Nee"
- yestext="Ja"/>
- </notification>
- <notification name="SetGroupMature">
- Bevat deze groep Mature inhoud?
- <usetemplate
- canceltext="Annuleren"
- name="yesnocancelbuttons"
- notext="Nee"
- yestext="Ja"/>
- </notification>
- <notification label="Bevestig herstart" name="ConfirmRestart">
- Wilt u deze regio echt binnen 2 minuten herstarten?
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification label="Bericht iedereen in deze regio" name="MessageRegion">
- Type een kort bericht om naar iedereen sturen die momenteel in regio aanwezig is.
- <form name="form">
- <input name="message"/>
- <button name="OK" text="OK"/>
- <button name="Cancel" text="Annuleren"/>
- </form>
- </notification>
- <notification label="Weiger Land aanpassingen" name="HelpRegionBlockTerraform">
- Indien dit aan gevinkt kunnen landeigenaren geen terrein bewerkingen doen op hun land, ongeacht de per perceel ingestelde waarde voor &apos;Wijzig Terrein&apos;
-
-Standaard: uitgeschakeld
- </notification>
- <notification label="Blokkeer Vliegen" name="HelpRegionBlockFly">
- Indien dit is aan gevinkt kunnen personen niet vliegen in deze regio ongeacht de per perceel ingestelde waarde &apos;Vliegen&apos;
-
-Standaard: uitgeschakeld
- </notification>
- <notification label="Bulkwijzigen Inhoudpermissies" name="HelpBulkPermission">
- Het Bulkpermissiesgereedschap helpt u om snel de permissies op meerdere items in de inhoud van het geselecteerde object te wijzigen. Let echter op dat u alleen de permissies op de items in de Inhoud van de geselecteerde objecten instelt -- niet de permissies van het containerobject zelf.
-
-Merk ook op dat de permissies niet worden toegepast op de geneste inhoud van de items in Inhoud. Uw verzoek werkt alleen op items precies één niveau diep.
-
-U kunt selectief kiezen welke soorten objecten te wijzigen door gebruik te maken van de checklist onder &apos;Inhoud Types&apos; hier. Foto&apos;s worden opgenomen wanneer u Texturen selecteert.
-
-* Dit gereedschap is alleen succesvol in het wijzigen van permissies op objecten die u mag wijzigen.
-* U kunt geen &apos;Volgende Eigenaar&apos; permissies toekennen die u niet al bezit.
-* De &apos;Volgende Eigenaar&apos; permissies zijn slechts verzoeken. Indien een item niet alle nieuwe permissies kan overnemen, zal geen van zijn permissies wijzigen.
-
-Wanneer u klaar bent om de permissies in bulk te wijzigen, klik dan &apos;Toepassen&apos; en wacht tot de resultaten worden weergegeven.
-
-Indien u het Bulkpermissies venster sluit terwijl permissies gewijzigd worden, zal de verwerking gestopt worden.
- </notification>
- <notification label="Sta Letsel Toe" name="HelpRegionAllowDamage">
- Indien dit is aan gevinkt stelt het Letsel systeem in voor alle percelen, ongeacht de individuele instellingen op de percelen. Indien uitgeschakeld, kunnen perceel eigenaren het Letsel systeem op hun perceel activeren.
-
-Standaard: uitgeschakeld
- </notification>
- <notification label="Agent Limiet" name="HelpRegionAgentLimit">
- Stelt het maximale aantal toegestane avatars in voor deze regio.
-De prestaties kunnen variëren afhankelijk van het aantal aanwezige avatars.
-
-Standaard: 40
- </notification>
- <notification label="Object Bonus" name="HelpRegionObjectBonus">
- De Object Bonus is een vermeerderaar voor primitieven op een willekeurig perceel.
-Het bereik is van 1 tot 10. Ingesteld op &apos;1&apos; kan elk 512m² perceel 117 objecten bevatten. Ingesteld op &apos;2&apos; kan elk 512m² perceel 234 objecten bevatten, enzovoort. Het maximale aantal objecten blijft 15.000, ongeacht wat de Object Bonus is. Denk er aan, dat eenmaal ingesteld, het verlagen van de Object Bonus het retourneren of verwijderen van objecten tot gevolg kan hebben.
-
-Standaard: 1.0
- </notification>
- <notification label="Inhoudscategorie:" name="HelpRegionMaturity">
- Stelt de inhoudscategorie van de regio in, zoals getoond in de menubalk bovenaan de viewer van elke inwoner en in tooltips op de wereldkaart wanneer de aanwijzer boven deze regio zweeft. Deze instelling heeft ook invloed op de toegang tot deze regio en zoekresultaten. Andere inwoners kunnen alleen regio&apos;s binnengaan of zoekresultaten zien met dezelfde inhoudscategorie als die zij zelf hebben gekozen in hun voorkeuren.
-
-Het kan enige tijd duren voordat deze wijziging zichtbaar is op de wereldkaart.
- </notification>
- <notification label="Beperk Duwen" name="HelpRegionRestrictPushObject">
- Deze instelling stelt de hele regio in op beperkte duwen permissies.
-Indien aan gevinkt kunnen Inwoners alleen door hun zelf geduwd worden of door de perceel eigenaar.
-
-(Push (Duwen) verwijst naar de llPushObject() LSL functie)
-
-Standaard: Uitgeschakeld
- </notification>
- <notification label="Perceel Samenvoegen/Opsplitsen" name="HelpParcelChanges">
- Deze instelling stel in of percelen die niet van de estate eigenaar zijn kunnen worden samengevoegd of opgesplitst.
-
-Indien niet aan gevinkt:
- * Alleen Estate eigenaren of beheerders kunnen percelen samenvoegen op opsplitsen.
- * Zij kunnen alleen percelen samenvoegen of opsplitsen die eigendom zijn van de eigenaar of van een groep met de juiste bevoegdheden.
-
-Indien aan gevinkt:
- * Alle perceel eigenaren kunnen percelen samenvoegen of opsplitsen die zij bezitten.
- * Voor percelen in Groep eigendom, kunnen alleen zij met de juiste rechten percelen samenvoegen of opsplitsen.
-
-Standaard: Ingeschakeld
- </notification>
- <notification label="Niet in Zoeken tonen" name="HelpRegionSearch">
- Deze optie aan vinken zal perceel eigenaren blokkeren hun perceel in Zoeken te tonen.
-
-Standaard: Uitgeschakeld
- </notification>
- <notification label="Regio Volwassenen Gewijzigd" name="RegionMaturityChange">
- De Volwassen instelling voor deze regio is bijgewerkt.
-Het kan enige tijd duren voordat de wijziging zichtbaar is op de Kaart.
- </notification>
- <notification label="Land Herverkoop" name="HelpRegionLandResell">
- Estate eigenaren en beheerders kunnen elk stuk land verkopen in eigendom van de Estate eigenaar.
-
-Indien deze optie niet is aan gevinkt, kunnen kopers hun land in deze regio niet verkopen.
-Indien deze optie is aan gevinkt, kunnen kopers hun land in deze regio verkopen.
-
-Standaard: Niet toestaan
- </notification>
- <notification label="Scripts Uitschakelen" name="HelpRegionDisableScripts">
- Indien de sim prestaties slecht zijn, kan een script de oorzaak zijn. Open de Statistieken balk (Ctrl+Shift+1). Kijk naar de Simulator Fysieke FPS. Indien het lager is dan 45, open dan het Tijd paneel onderaan de Statistieken balk. Indien de Script Tijd 25 ms of hoger is, klik dan op de Top Scripts knop. U krijgt dan een naam en lokatie van scripts die mogelijk de slechte prestaties veroorzaken.
-
-Het aan vinken van Scripts Uitschakelen en vervolgens op de Toepassen knop drukken, zal tijdelijk alle scripts in deze regio uitschakelen. U zult dit mogelijk moeten doen om naar de lokatie te gaan van het &apos;top script&apos;. Eenmaal aangekomen, onderzoek dan of het script het probleem veroorzaakt. U zult mogelijk de eigenaar willen contacteren of het object willen retourneren c.q. verwijderen.
-Verwijder het vinkje van Scripts Uitschakelen en klik op Toepassen om scripts weer te reactiveren in de regio.
-
-Standaard: Uitgeschakeld
- </notification>
- <notification label="Botsingen Uitschakelen" name="HelpRegionDisableCollisions">
- Indien de sim prestaties slecht zijn, kunnen fysieke objecten de oorzaak zijn. Open de Statistieken balk (Ctrl+Shift+1). Kijk naar de Simulator Fysieke FPS. Indien het lager is dan 45, open dan het Tijd paneel onderaan de Statistieken balk. Indien de Sim Tijd (Fysiek) 20 ms of hoger is, klik dan op de Toon Top Botsingen knop. U krijgt dan een naam en lokatie van de fysieke objecten die mogelijk de slecht prestaties veroorzaken.
-
-Het aan vinken van de Botsingen Uitschakelen knop en vervolgens op de Toepassen knop drukken, zal tijdelijk object-object botsingen uitschakelen. U zult dit mogelijk moeten doen om naar de lokatie te gaan van de &apos;top botsingen&apos;. Eenmaal aangekomen, onderzoek dan het object. Botst het constant met andere objecten? U zult mogelijk de eigenaar willen contacteren of het object willen retourneren c.q. verwijderen.
-Verwijder het vinkje van Botsingen Uitschakelen en klik op Toepassen om botsingen weer te reactiveren in de regio.
-
-Standaard: Uitgeschakeld
- </notification>
- <notification label="Fysiek Uitschakelen" name="HelpRegionDisablePhysics">
- Fysiek Uitschakelen is gelijkwaardig aan Botsingen Uitschakelen, alleen alle fysieke simulatie is uitgeschakeld. Dit betekend dat niet alleen alle objecten zullen stoppen met botsen, maar ook dat avatars zich niet meer kunnen bewegen.
-
-Dit zou alleen gebruikt moeten worden als het uitschakelen van Botsingen niet genoeg prestatie winst geeft om een fysiek probleem of top botsingen te onderzoeken.
-
-Indien u klaar bent, wees er dan zeker van Fysiek weer in te schakelen, anders kunnen avatars zich niet meer bewegen.
-
-Standaard: Uitgeschakeld
- </notification>
- <notification label="Top Botsingen" name="HelpRegionTopColliders">
- Toon een lijst van objecten van het grootste aantal potentiële object-object botsingen.
-Deze objecten kunnen een trage prestatie veroorzaken. Selecteer Beeld &gt; Statistieken Balk en kijk onder Simulator &gt; Tijd &gt; Sim Tijd (Fysiek) om te zien of meer dan 20 ms wordt gespendeerd aan fysiek.
- </notification>
- <notification label="Top Scripts" name="HelpRegionTopScripts">
- Toon een lijst van objecten die de meeste tijd besteden aan het uitvoeren van LSL scripts.
-Deze objecten kunnen een trage prestatie veroorzaken. Selecteer Beeld &gt; Statistieken Balk en kijk onder Simulator &gt; Tijd &gt; Script Tijd om te zien of meer dan 25 ms wordt gespendeerd aan scripts.
- </notification>
- <notification label="Herstart Regio" name="HelpRegionRestart">
- Herstart het server proces van de regio na een twee minuten waarschuwing.
-Alle Inwoners van de regio zullen de verbinding kwijt raken. De regio zal alle gegevens bewaren en zou binnen 90 seconden weer operabel moeten zijn.
-
-De regio herstarten zou de meeste prestatie problemen moeten verhelpen en zou normaal gesproken alleen gebruikt moeten worden indien aangegeven.
- </notification>
- <notification label="Water Hoogte" name="HelpRegionWaterHeight">
- Dit is de hoogte in meters waarop het water verschijnt.
-Als deze instelling anders is dan 20 en u heeft water aan de rand van de wereld of u heeft &apos;ontbrekend&apos; water, zal er een gat zichtbaar zijn.
-
-Standaard: 20
- </notification>
- <notification label="Terrein Ophogen" name="HelpRegionTerrainRaise">
- Dit is de hoogte in meters dat perceel eigenaren hun terrein kunnen verhogen boven de standaard &apos;baked&apos; terrein hoogte.
-
-Standaard: 4
- </notification>
- <notification label="Terrein Verlagen" name="HelpRegionTerrainLower">
- Dit is de hoogte in meters dat perceel eigenaren hun terrein kunnen verlagen onder de standaard &apos;baked&apos; terrein hoogte.
-
-Standaard: -4
- </notification>
- <notification label="Upload RAW Terrein" name="HelpRegionUploadRaw">
- Deze knop upload een .RAW bestand naar de regio waar u zich bevindt.
-Het bestand moet de juiste afmetingen hebben (RGB, 256x256) en 13 kanalen.
-De beste manier om een terrein bestand te maken is het downloaden van een bestaand RAW bestand. Een goede eerste stap is om het rode kanaal (land hoogte) aan te passen en dat te uploaden.
-
-De upload kan tot 45 seconden in beslag nemen. Bedenk dat het uploaden van een terrein bestand de objecten reeds aanwezig op het land *niet* zal verplaatsen, alleen het terrein zelf en de permissies geassocieerd met de percelen. Dit kan resulteren in objecten die ondergronds gaan.
-
-Voor meer informatie over het wijzigen van de hoogte velden, raadpleeg F1 Help.
- </notification>
- <notification label="Download RAW Terrein" name="HelpRegionDownloadRaw">
- Deze knop download een bestand welke de hoogte veld gegevens, perceel afmetingen, perceel te koop status en sommige perceel permissies bevat voor deze regio.
-Indien u het bestand opent in een programma als Photoshop, moet u de document afmetingen opgeven, welk RGB, 256x256 met 13 kanalen is. Dit terrein bestand kan op geen enkele andere manier worden geopend.
-
-Voor meer informatie over het wijzigen van de hoogte velden, raadpleeg F1 Help.
- </notification>
- <notification label="Gebruik Estate Zon" name="HelpRegionUseEstateSun">
- Dit aan vinken zorgt er voor dat de zon positie overeen komt met de zon positie in de rest van het Estate.
-
-Standaard: Ingeschakeld
- </notification>
- <notification label="Vaste Zon" name="HelpRegionFixedSun">
- Dit aan vinken stelt de zon in op de positie van de Fase schuif knop en stopt het verder bewegen van de zon.
-
-Standaard: Uitgeschakeld
- </notification>
- <notification label="Bake Terrein" name="HelpRegionBakeTerrain">
- Deze knop slaat de huidige vorm van het terrein op als nieuwe standaard voor de regio. Eenmaal baked, kan het land terugkeren naar de opgeslagen vorm wanneer u of anderen gebruik maken van de Wijzig Terrein &apos;Terugkeer&apos; optie. Het baked terrein is ook het uitgangspunt voor de terrein verhogings- en verlagingslimieten.
- </notification>
- <notification label="Estate Beheerders" name="HelpEstateEstateManager">
- Een Estate Beheerder is een Inwoner aan wie u de controle over de regio en estate instellingen heeft uitbesteed. De Estate Beheerder kan de instellingen wijzigen in deze panels, behalve het uploaden, downloaden en terrein bakken. In bijzonder kunnen zij Inwoners toestaan of verbannen van het Estate.
-
-Estate Beheerders kunnen alleen toegevoegd of verwijderd worden door de eigenaar van het Estate, niet door elkaar. Gebruik alstublieft alleen Inwoners die u kunt vertrouwen als Estate Beheerders, omdat uiteindelijk u verantwoordelijk bent voor hun acties.
- </notification>
- <notification label="Gebruik Globale Tijd" name="HelpEstateUseGlobalTime">
- Dit aan vinken zorgt ervoor dat de zon in uw estate dezelfde positie volgt als in Linden-eigendom &apos;mainland&apos; Estates.
-
-Standaard: aan
- </notification>
- <notification label="Vaste Zon" name="HelpEstateFixedSun">
- Dit aan vinken stelt de zon in op de positie van de Fase schuif knop en stopt het verder bewegen van de zon.
- </notification>
- <notification label="Publieke Toegang" name="HelpEstateExternallyVisible">
- Dit aan vinken geeft aan dat Inwoners die in andere Estates zijn, deze Estate kunnen bezoeken zonder op de Toegangs lijst te staan.
-
-Standaard: Ingeschakeld
- </notification>
- <notification label="Direct Teleporteren Toestaan" name="HelpEstateAllowDirectTeleport">
- Indien aan gevinkt staat het Inwoners toe om direct te Teleporteren naar elke plek in uw Estate. Indien niet aan gevinkt kunnen Inwoners Teleporteren naar de dichtstbijzijnde telehub.
-
-Standaard: Uitgeschakeld
- </notification>
- <notification label="Toegang Toestaan" name="HelpEstateAllowResident">
- Toegang tot dit Estate zal gelimiteerd zijn tot Inwoners in deze lijst en onderstaande groepen. Deze instelling is allen beschikbaar indien Publieke Toegang niet is aan gevinkt.
- </notification>
- <notification label="Groeps Toegang Toestaan" name="HelpEstateAllowGroup">
- Toegang tot dit Estate zal gelimiteerd worden tot groepen in deze lijst en elke Inwoner bovenaan. Deze Instelling is alleen beschikbaar als Publieke Toegang niet is aan gevinkt.
- </notification>
- <notification label="Misbruik Email Adres" name="HelpEstateAbuseEmailAddress">
- Dit instellen met een geldig email adres zal misbruik rapporten op dit Estate doen versturen naar dat adres.
-Indien u het leeg laat, zullen misbruik rapporten alleen verzonden worden naar Linden Lab.
- </notification>
- <notification label="Toegang Weigeren" name="HelpEstateBanResident">
- Inwoners in deze lijst zijn de toegang geweigerd in uw Estate, ongeacht elke andere instelling.
- </notification>
- <notification label="Voice Chat Toestaan" name="HelpEstateVoiceChat">
- Percelen in dit Estate kunnen hun eigen Voice kanalen hebben waarin Inwoners die in de buurt van elkaar zijn, elkaar kunnen horen en met elkaar kunnen praten.
-
-Standaard: Uitgeschakeld
- </notification>
- <notification label="Voice Versie Ongelijkheid" name="VoiceVersionMismatch">
- Deze versie van [APP_NAME] is niet compatibel met de Voice spraak optie in deze regio. Om Voice Chat goed te laten functioneren, moet u [APP_NAME] bijwerken.
- </notification>
- <notification label="Estate Convenant" name="HelpEstateCovenant">
- Het instellen van een Estate Convenant maakt het u mogelijk om percelen in het Estate te verkopen. Indien de Convenant niet is ingesteld kunt u het niet verkopen. Een notitiekaart voor uw Convenant kan leeg zijn indien u geen regels wilt instellen, advies aan kopers wilt geven of iets anders in relatie tot het land wilt mededelen voor als men het koopt.
-
-Een Convenant kan gebruikt worden als u regels wilt mededelen, richtlijnen, culturele informatie of simpelweg uw eigen verwachtingen aan prospect kopers.
-Dit kan zoneren bevatten, bouw reglementen, betaal opties of elke andere vorm van informatie waarvan u het belangrijk vind dat de nieuwe eigenaar het heeft gezien en mee akkoord is gegaan alvorens het te kopen.
-
-De koper moet instemmen met de Convenant middels het aan vinken van het kadertje alvorens zij de aankoop af kunnen ronden. Estate Overeenkomsten zijn altijd zichtbaar in het Over Land dialoog venster voor elk perceel dat er eentje ingesteld heeft staan.
- </notification>
- <notification label="Kan Geen Objecten Kopen" name="BuyObjectOneOwner">
- Kan geen objecten van verschillende eigenaren tegelijk kopen.
-
-Kies alstublieft slechts één object en probeer het opnieuw.
- </notification>
- <notification label="Kan Inhoud Niet Kopen" name="BuyContentsOneOnly">
- Kan geen inhoud kopen van meer dan één object tegelijk.
-
-Kies alstublieft slechts één object en probeer het opnieuw.
- </notification>
- <notification label="Kan Inhoud Niet Kopen" name="BuyContentsOneOwner">
- Kan geen inhoud kopen van verschillende eigenaren tegelijk.
-
-Kies alstublieft slechts één object en probeer het opnieuw.
- </notification>
- <notification name="BuyOriginal">
- Koop originele object van [OWNER] voor L$[PRICE]?
-U zult de eigenaar worden van dit object.
-U kunt het dan:
- Wijzigen: [MODIFYPERM]
- Kopiëren: [COPYPERM]
- Verkopen of Weggeven: [RESELLPERM]
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="BuyOriginalNoOwner">
- Koop originele object voor L$[PRICE]?
-U zult de eigenaar worden van dit object.
-U kunt het dan:
- Wijzigen: [MODIFYPERM]
- Kopiëren: [COPYPERM]
- Verkopen of Weggeven: [RESELLPERM]
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="BuyCopy">
- Koop een kopie van [OWNER] voor L$[PRICE]?
-Het object zal gekopieerd worden naar uw inventaris.
-U kunt het dan:
- Wijzigen: [MODIFYPERM]
- Kopiëren: [COPYPERM]
- Verkopen of Weggeven: [RESELLPERM]
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="BuyCopyNoOwner">
- Koop een kopie voor L$[PRICE]?
-Het object zal gekopieerd worden naar uw inventaris.
-U kunt het dan:
- Wijzigen: [MODIFYPERM]
- Kopiëren: [COPYPERM]
- Verkopen of Weggeven: [RESELLPERM]
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="BuyContents">
- Koop de inhoud van [OWNER] voor L$[PRICE]?
-De inhoud zal naar uw inventaris gekopieerd worden.
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="BuyContentsNoOwner">
- Koop de inhoud voor L$[PRICE]?
-De inhoud zal naar uw inventaris gekopieerd worden.
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="ConfirmPurchase">
- Deze transactie zal:
-[ACTION]
-
-Weet u zeker dat u verder wilt gaan met deze aankoop?
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="ConfirmPurchasePassword">
- Deze transactie zal:
-[ACTION]
-
-Weet u zeker dat u verder wilt gaan met deze aankoop?
-Voer alstublieft opnieuw uw wachtwoord in en klik op OK.
- <form name="form">
- <input name="message"/>
- <button name="ConfirmPurchase" text="OK"/>
- <button name="Cancel" text="Annuleren"/>
- </form>
- </notification>
- <notification name="SetPickLocation">
- Opmerking:
-
-U heeft de locatie van deze Favoriet bijgewerkt, maar andere details blijven ongewijzigd.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="MoveInventoryFromObject">
- U heeft &apos;niet kopieerbare&apos; items geselecteerd.
-Deze items zullen worden verplaatst naar uw inventaris, niet gekopieerd.
-
-Verplaats de inventaris item(s)?
- <usetemplate ignoretext="Wanneer niet kopieerbare inventaris uit objecten verplaatst wordt" name="okcancelignore" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="MoveInventoryFromScriptedObject">
- U heeft &apos;niet kopieerbare&apos; inventaris items geselecteerd.
-Deze items zullen verplaatst worden naar uw inventaris, niet gekopieerd.
-Omdat deze objecten scripts bevatten, kan het verplaatsen naar uw inventaris er voor zorgen dat het object niet meer werkt.
-inventaris item(s) verplaatsen?
- <usetemplate ignoretext="Indien verplaatsen &apos;niet kopieerbare&apos; inventaris van gescripte objecten" name="okcancelignore" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="ClickActionNotPayable">
- Waarschuwing: Het &apos;Betaal object&apos; aan klik actie is ingesteld, maar het zal alleen werken als er een script is toegevoegd met een money() event.
- <form name="form">
- <ignore name="ignore" text="Indien instellen &apos;Betaal&apos; op objecten zonder money() events"/>
- </form>
- </notification>
- <notification name="OpenObjectCannotCopy">
- Er zitten geen items in dit object die u kunt kopiëren.
- </notification>
- <notification name="WebLaunchAccountHistory">
- Naar de [SECOND_LIFE] web site gaan om uw account geschiedenis te bekijken?
- <usetemplate ignoretext="Bij laden van de account geschiedenis webpagina" name="okcancelignore" notext="Annuleren" yestext="Ga naar pagina"/>
- </notification>
- <notification name="ClickOpenF1Help">
- De [SECOND_LIFE] Support Web site bezoeken?
- <usetemplate ignoretext="Bij bezoeken van de [SECOND_LIFE] Support Website." name="okcancelignore" notext="Annuleren" yestext="Ga"/>
- </notification>
- <notification name="ConfirmQuit">
- Weet u zeker dat u wilt afsluiten?
- <usetemplate ignoretext="Bij afsluiten [APP_NAME]." name="okcancelignore" notext="Doorgaan" yestext="Afsluiten"/>
- </notification>
- <notification name="HelpReportAbuseEmailLL">
- Gebruik dit gereedschap om overtredingen van de Voorwaarden voor Service (Terms of Service) en Gemeenschaps Standaarden (Community Standards)te rapporteren. Zie:
-
-http://secondlife.com/corporate/tos.php
-http://secondlife.com/corporate/cs.php
-
-Alle gerapporteerde misbruiken van de Voorwaarden voor Service en Gemeenschaps Standaarden zullen worden onderzocht en opgelost. U kunt de incident oplossing in de Incidenten Rapportage zien op:
-
-http://secondlife.com/support/incidentreport.php
- </notification>
- <notification name="HelpReportAbuseEmailEO">
- BELANGRIJK: Dit rapport zal naar de eigenaar van deze regio gaan en niet naar Linden Lab!
-
-Als een service aan Inwoners en bezoekers heeft de eigenaar van deze regio er voor gekozen om rapporten vanuit deze regio zelf te ontvangen en af te handelen. Linden Lab zal geen onderzoek doen naar rapporten die u indient vanaf deze locatie.
-
-De regio eigenaar zal de rapporten afhandelen op basis van de regels geldend voor deze regio zoals weergegeven in het Estate Convenant (Bekijk Convenants door naar Wereld te gaan in het menu en te kiezen voor Over Land).
-
-De afhandeling van dit rapport is alleen van toepassing op deze regio.
-Toegang van Inwoners tot andere gebieden van [SECOND_LIFE] zullen niet beïnvloed worden door de uitkomst van dit rapport. Alleen Linden Lab kan de toegang tot geheel [SECOND_LIFE] beperken.
- </notification>
- <notification name="HelpReportAbuseSelectCategory">
- Selecteer alstublieft een categorie voor dit misbruik rapport.
-
-Het selecteren van een categorie helpt ons met het archiveren en verwerken van misbruik rapporten.
- </notification>
- <notification name="HelpReportAbuseAbuserNameEmpty">
- Geef alstublieft een naam op van de misbruiker.
-
-Een accurate waarde opgeven helpt ons met het archiveren en verwerken van misbruik rapporten.
- </notification>
- <notification name="HelpReportAbuseAbuserLocationEmpty">
- Geef alstublieft een locatie op waar het misbruik plaats vond.
-
-Een accurate waarde opgeven helpt ons met het archiveren en verwerken van misbruik rapporten.
- </notification>
- <notification name="HelpReportAbuseSummaryEmpty">
- Geef alstublieft een korte samenvatting op van het misbruik dat plaats vond.
-
-Een accurate waarde opgeven helpt ons met het archiveren en verwerken van misbruik rapporten.
- </notification>
- <notification name="HelpReportAbuseDetailsEmpty">
- Geef alstublieft een gedetailleerde omschrijving van het misbruik dat plaats vond.
-
-Wees zo specifiek als mogelijk, inclusief namen en details van het incident waarover u rapporteert.
-
-Het opgeven van een accurate omschrijving helpt ons met het archiveren en verwerken van misbruik rapporten.
- </notification>
- <notification name="HelpReportAbuseContainsCopyright">
- Beste Inwoner,
-
-Het lijkt er op dat u intellectueel eigendoms misbruik rapporteert. Wees er alstublieft van overtuigd dat u dit correct rapporteert:
-
-(1) Het Misbruik Proces. U kunt een misbruik rapport indienen als u er van overtuigd bent dat een Inwoner het [SECOND_LIFE] permissie systeem uitbuit, bijvoorbeeld door gebruik van CopyBot of soortgelijke gereedschappen, daarmee de intellectuele eigendoms rechten overtredend. Het Abuse Team onderzoekt en zal passende maatregelen uitvaardigen tegen gedrag dat de [SECOND_LIFE] Gemeenschaps Standaarden overtreedt. Echter, het Abuse Team zal geen actie ondernemen en niet reageren op verzoeken om inhoud te verwijderen uit de [SECOND_LIFE] wereld.
-
-(2) Het DMCA of Inhoud Verwijder Proces. Voor een verzoek tot verwijdering van inhoud in [SECOND_LIFE], MOET u een geldige berichtgeving van misbruik indienen zoals voorzien in onze DMCA beleid op http://secondlife.com/corporate/dmca.php.
-
-Indien u nog steeds door wilt gaan met het misbruik proces, sluit dan alstublieft dit venster en maak het indienen van uw rapport af. U zult mogelijk een specifieke catagorie moeten kiezen &apos;CopyBot of Permissie Uitbuiting&apos;.
-
-Dank U,
-Linden Lab
- </notification>
- <notification name="FailedRequirementsCheck">
- De volgende vereiste componenten ontbreken van [FLOATER]:
-[COMPONENTS]
- </notification>
- <notification label="Vervang Bestaande Bevestiging" name="ReplaceAttachment">
- Er is al een object bevestigd op dit punt aan uw lichaam.
-Wilt u dit vervangen met het geselecteerde object?
- <form name="form">
- <ignore name="ignore" save_option="true" text="Bij vervangen van bestaande bevestigingen"/>
- <button name="Yes" text="OK"/>
- <button name="No" text="Annuleren"/>
- </form>
- </notification>
- <notification label="Niet Storen Modus Waarschuwing" name="BusyModePay">
- U bevind zich in Niet Storen Modus, hetgeen inhoudt dat u geen enkele items kunt ontvangen voor deze betaling.
-
-Wilt u de Niet Storen Modus verlaten voordat u deze transactie completeert?
- <form name="form">
- <ignore name="ignore" save_option="true" text="Bij betalen van een persoon of object in Niet Storen modus"/>
- <button name="Yes" text="OK"/>
- <button name="No" text="Annuleren"/>
- </form>
- </notification>
- <notification name="ConfirmEmptyTrash">
- Weet u zeker dat u de inhoud van uw vuilnisbak map permanent wilt verwijderen?
- <usetemplate ignoretext="Bij verwijderen van de inhoud uit de inventaris vuilnisbak map" name="okcancelignore" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="ConfirmClearBrowserCache">
- Weet u zeker dat u uw browsercache wilt legen?
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="Ja"/>
- </notification>
- <notification name="ConfirmClearCookies">
- Weet u zeker dat u al uw cookies wilt verwijderen?
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="Ja"/>
- </notification>
- <notification name="ConfirmClearMediaUrlList">
- Weet u zeker dat u uw lijst met al de opgeslagen URL&apos;s wilt verwijderen?
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="Ja"/>
- </notification>
- <notification name="ConfirmEmptyLostAndFound">
- Weet u zeker dat u de inhoud van de Verloren en Gevonden map permanent wilt verwijderen?
- <usetemplate ignoretext="Bij legen van uw inventaris Verloren en Gevonden map" name="okcancelignore" notext="Nee" yestext="Ja"/>
- </notification>
- <notification name="CopySLURL">
- De volgende SLurl is gekopieerd naar uw klem bord:
-[SLURL]
-
-Plaats het in een web pagina om anderen eenvoudig toegang te verschaffen naar de locatie of test het zelf door het te plakken in de adres balk van uw web browser.
- <form name="form">
- <ignore name="ignore" text="Bij kopiëren van een SLurl naar het klem bord"/>
- </form>
- </notification>
- <notification name="GraphicsPreferencesHelp">
- Dit venster bepaald de venster afmetingen, resolutie en kwaliteit van de client&apos;s grafische weergave. De Voorkeuren &gt; Grafische interface laat u kiezen uit vier grafische niveaus: Laag, Middel, Hoog en Ultra. U kunt ook uw grafische instellingen aanpassen met het aan vinken van het Aangepast vakje en de volgende instellingen manipuleren:
-
-Shaders: In of uitschakelen van de verschillende typen pixel shaders.
-
-Reflectiedetail: Stelt het type objecten in hetgeen water kan reflecteren.
-
-Avatarweergave: Stelt de opties in die van invloed zijn op hoe de client een avatar zal renderen.
-
-Zichtbereik: Beïnvloed tot hoe ver objecten vanaf uw zichtpunt worden weergegeven in de scène.
-
-Maximaal Aantal Particles: Stelt het maximaal aantal particles in die u tegelijk kunt zien op uw scherm.
-
-Nabewerkingskwaliteit: Stelt de resolutie in waarmee Gloei wordt weergegeven.
-
-Maasdetail: Stelt de hoeveelheid detail of het aantal driehoeken in gebruikt voor de weergave van bepaalde objecten. Een hogere waarde zal langer nemen om weer te gegeven, maar zorgen voor objecten met meer detail.
-
-Lichtdetail: Bepaald welke typen lichten u wenst weer te geven.
-
-Terreindetail: Stelt de hoeveelheid detail in die u wilt zien voor het terrein textuur.
- </notification>
- <notification name="WLSavePresetAlert">
- Wilt u de opgeslagen voor instellingen overschrijven?
- <usetemplate name="okcancelbuttons" notext="Nee" yestext="Ja"/>
- </notification>
- <notification name="WLDeletePresetAlert">
- Wilt u [SKY] verwijderen?
- <usetemplate name="okcancelbuttons" notext="Nee" yestext="Ja"/>
- </notification>
- <notification name="WLNoEditDefault">
- U kunt de standaard instellingen niet wijzigen of verwijderen.
- </notification>
- <notification name="WLMissingSky">
- Dit dag cyclus bestand heeft een ontbrekend lucht bestand: [SKY].
- </notification>
- <notification name="PPSaveEffectAlert">
- Voorbewerkingeffecten bestaan. Wilt u ze alsnog overschrijven?
- <usetemplate name="okcancelbuttons" notext="Nee" yestext="Ja"/>
- </notification>
- <notification name="HelpEditSky">
- Wijzig de WindLight schuif knoppen en maak en sla een set van luchten op.
- </notification>
- <notification name="HelpEditDayCycle">
- Bepaald de luchten te gebruiken gedurende de dag.
- </notification>
- <notification name="EnvSettingsHelpButton">
- Deze instelling bepalen hoe de omgeving er uit ziet op uw computer. Uw grafische kaart zal grafische shaders moeten ondersteunen om toegang te krijgen tot alle instellingen.
-
-Wijzig de &quot;Tijd van de Dag&quot; schuif knop om de fase van de dag lokaal in de viewer aan te passen.
-
-Wijzig de &quot;Wolken Dichtheid&quot; schuif knop om de hoeveelheid wolken die de lucht bedekken in te stellen.
-
-Kies een kleur in de &quot;Water Kleur&quot; kleuren kiezer om de kleur van het water aan te passen.
-
-Wijzig de &quot;Water Mist&quot; schuif knop om de dichtheid van de mist onder water in te stellen.
-
-Klik op &quot;Gebruik Estate Tijd&quot; om de tijd van de dag te herstellen naar de huidige tijd en die te volgen.
-
-Klik op &quot;Geavanceerde Lucht&quot; om de editor op te roepen voor geavanceerde instellingen voor de lucht.
-
-Klik op &quot;Geavanceerd Water&quot; om de editor op te roepen voor geavanceerde instellingen voor water.
- </notification>
- <notification name="HelpDayCycle">
- De Dag Cyclus Editor geeft u controle over de lucht gedurende de [SECOND_LIFE]&apos;s dag/nacht cyclus. Dit is de cyclus die gebruikt wordt in de Basis Omgeving Editor&apos;s Tijd van de Dag schuif knop.
-
-De Dag Cyclus Editor werkt beter met het instellen van gemarkeerde frames. Dit zijn nodes (weergegeven als grijze blips in de tijd weergave) die Hemel voorinstelling met zich geassocieerd hebben. Als de Tijd van de Dag voortschrijdt, &quot;animeert&quot; de WindLight Hemel als het interpoleert tussen de gemarkeerde frames.
-
-De gele pijlen boven de tijdlijn representeert uw huidige zicht, gebaseerd op de Tijd van de Dag. Klik en sleep deze om te zien hoe uw dag zal animeren. U kunt gemarkeerde frames toe voegen of verwijderen middels het indrukken van de Frame Toevoegen of Frame Verwijderen knoppen, rechts van de tijdlijn.
-
-U kunt de tijds positie van een gemarkeerd frame instellen door het te slepen over de tijdlijn of middels het handmatig invullen van de Gemarkeerde Frame Instellingen. Binnen de Gemarkeerde Frame Instellingen krijgt u de mogelijkheid het gemarkeerde frame te associëren met de respectievelijke WindLight voorinstelling.
-
-De lengte van de Cyclus bepaald de totale tijdsduur van een &quot;dag&quot;. Stelt u dit in op een lage waarde (bijv. twee minuten) betekend dat uw volledig 24 uurs tijdlijn zal animeren in slechts twee minuten! Als u tevreden bent met uw tijdlijn en gemarkeerde frame cyclus, gebruik dan de Start en Stop knoppen om het resultaat voor te beschouwen. Onthoud dat u ook de gele tijd indicator pijl boven de tijdlijn kunt bewegen om de animatie cyclus interactief te bekijken. Het gebruik van de Estate Tijd knop zal de lengte en tijd van uw dag synchroniseren met de Estate&apos;s dag cyclus.
-
-Als u tevreden bent met uw Dag Cyclus, kunt het opslaan en laden met de Test Dag Opslaan en Laad Test Dag knoppen. Merk op, dat wij momenteel slechts één Dag Cyclus toestaan.
- </notification>
- <notification name="HelpBlueHorizon">
- Gebruik de Rood/Groen/Blauw schuif knoppen om de kleur van de hemel aan te passen. U kunt de Intensiteit (I) schuif knop gebruiken om alle drie de schuif knoppen tegelijk te bewegen.
- </notification>
- <notification name="HelpHazeHorizon">
- Nevel Horizon is één van de meest handige parameters voor de algehele belichting in de scène. Het is effectief om de vele belichting instellingen te simuleren, zoals wit-vlakken van de zon en donkere gesloten iris instellingen.
- </notification>
- <notification name="HelpBlueDensity">
- Blauw Dichtheid beïnvloed de algehele kleur verzadiging van de hemel en mist. Indien u de Intensiteit (I) schuif knop naar rechts schuift, zullen de kleuren lichter en sprekender worden. Indien u het geheel naar links schuift, worden de kleuren doffer, uiteindelijk vervagend naar zwart en wit. Als u de hemel kleur nauwkeurig wilt uitbalanceren, kunt u de individuele elementen van verzadiging instellen door gebruik van de Rood/Groen/Blauw (RGB) schuif knoppen.
- </notification>
- <notification name="HelpHazeDensity">
- Nevel Dichtheid bepaald de hoeveelheid dofheid, grijze nevel in de atmosfeer. Het is effectief om scènes met veel rook of zelf gemaakte vervuiling te simuleren. Het is ook effectief voor het simuleren van nevel en mist.
- </notification>
- <notification name="HelpDensityMult">
- De Dichtheid Vermeerderaar kan gebruikt worden om de algehele dichtheid van de atmosfeer te beïnvloeden.
-Bij lagere instelling creëert het een gevoel van &quot;dunne lucht&quot; en met hogere instellingen een dik zwaar smog effect.
- </notification>
- <notification name="HelpDistanceMult">
- Stelt de WindLight&apos;s waargenomen afstand in. Een waarde van nul stopt de invloed van WindLight op terrein en objecten. Waarden groter dan 1 simuleren grotere afstanden voor dikkere atmosferische effecten.
- </notification>
- <notification name="HelpMaxAltitude">
- Maximale Hoogte bepaald de hoogte calculaties die WindLight uitvoert bij het berekenen van de atmosferische belichting. Later op de dag is het handig om de &quot;diepte&quot; van de zonsondergang weergave in te stellen.
- </notification>
- <notification name="HelpSunlightColor">
- Stelt de kleur en intensiteit in van direct licht in de scène.
- </notification>
- <notification name="HelpSunAmbient">
- Stelt de kleur en intensiteit in van het omgevings atmosferische licht in de scène.
- </notification>
- <notification name="HelpSunGlow">
- De Afmeting schuif knop stelt de afmeting van de zon in.
-De Focus schuif knop bepaald de wazigheid van de zon aan de hemel.
- </notification>
- <notification name="HelpSceneGamma">
- Wijzigt de verdeling van licht op het scherm in licht of donker.
- </notification>
- <notification name="HelpStarBrightness">
- Wijzigt de helderheid van sterren aan de hemel.
- </notification>
- <notification name="HelpTimeOfDay">
- Bepaald de locatie van de zon aan de hemel.
-Gelijkwaardig aan elevatie.
- </notification>
- <notification name="HelpEastAngle">
- Bepaald de locatie van de zon aan de hemel.
-Gelijkwaardig aan azimut.
- </notification>
- <notification name="HelpCloudColor">
- Wijzigt de kleur van de wolken. Het is algemeen aanbevolen deze wit-achtig te houden, maar hé, heb plezier als u dit wilt.
- </notification>
- <notification name="HelpCloudDetail">
- Bepaald het detail plaatje als laag bovenop het basis wolken plaatje. X en Y bepalen de positie. D (Dichtheid) bepaald hoe wollig of verspreid de wolken verschijnen.
- </notification>
- <notification name="HelpCloudDensity">
- Geeft u de mogelijkheid de positie van wolken met de X en Y schuif knoppen in te stellen en hoe dicht ze zijn met de D schuif knop.
- </notification>
- <notification name="HelpCloudCoverage">
- Bepaald hoeveel de wolken de hemel bedekken.
- </notification>
- <notification name="HelpCloudScale">
- Bepaald de schaal van het wolken plaatje op de hemelboog.
- </notification>
- <notification name="HelpCloudScrollX">
- Bepaald de snelheid van de wolken terwijl zij in X richting bewegen.
- </notification>
- <notification name="HelpCloudScrollY">
- Bepaald de snelheid van de wolken terwijl zij in Y richting bewegen.
- </notification>
- <notification name="HelpClassicClouds">
- Vink dit aan voor weergave van [SECOND_LIFE]&apos;s oudere klassieke wolken als toevoeging op WindLight&apos;s wolken.
- </notification>
- <notification name="HelpWaterFogColor">
- Kiest de kleur van de onder water nevel.
- </notification>
- <notification name="HelpWaterFogDensity">
- Bepaald hoe dicht de water nevel is en hoe ver u kunt zien onder water.
- </notification>
- <notification name="HelpUnderWaterFogMod">
- Past het effect aan van de Nevel Dichtheid Exponent om zo te bepalen hoe ver uw avatar onder water kan zien.
- </notification>
- <notification name="HelpWaterGlow">
- Bepaald hoeveel het oppervlak van het water gloeit.
- </notification>
- <notification name="HelpWaterNormalScale">
- Bepaald de schaling van de drie wavelets (golf patronen) die samen water vormen.
- </notification>
- <notification name="HelpWaterFresnelScale">
- Bepaald hoeveel licht er wordt gereflecteerd onder verschillende hoeken.
- </notification>
- <notification name="HelpWaterFresnelOffset">
- Bepaald de hoeveelheid licht intensiteit welke wordt gereflecteerd.
- </notification>
- <notification name="HelpWaterScaleAbove">
- Bepaald hoeveel licht er wordt weerkaatst wanneer van bovenop het water oppervlak gezien.
- </notification>
- <notification name="HelpWaterScaleBelow">
- Bepaald hoeveel licht er wordt weerkaatst wanneer van onder het water oppervlak gezien.
- </notification>
- <notification name="HelpWaterBlurMultiplier">
- Bepaald hoe golven en reflectie worden ge mixed.
- </notification>
- <notification name="HelpWaterNormalMap">
- Bepaald welke Normaal map gelaagd is over het water om de reflectie/weerkaatsing te bepalen.
- </notification>
- <notification name="HelpWaterWave1">
- Bepaald waar en hoe snel de grote schaal versie van de Normaal map beweegt in X en Y richting.
- </notification>
- <notification name="HelpWaterWave2">
- Bepaald waar en hoe snel de kleine schaal versie van de Normaal map beweegt in X en Y richting.
- </notification>
- <notification name="NewSkyPreset">
- Geef een naam op voor de nieuwe lucht.
- <form name="form">
- <input name="message">
- Nieuwe Voorinstelling
- </input>
- <button name="OK" text="OK"/>
- <button name="Cancel" text="Annuleren"/>
- </form>
- </notification>
- <notification name="ExistsSkyPresetAlert">
- Voorinstelling bestaat al!
- </notification>
- <notification name="NewWaterPreset">
- Geef een naam voor de nieuwe voorinstelling van water.
- <form name="form">
- <input name="message">
- Nieuwe Voorinstelling
- </input>
- <button name="OK" text="OK"/>
- <button name="Cancel" text="Annuleren"/>
- </form>
- </notification>
- <notification name="ExistsWaterPresetAlert">
- Voorinstelling bestaat al!
- </notification>
- <notification name="WaterNoEditDefault">
- u kunt de standaard voorinstelling niet wijzigen of verwijderen.
- </notification>
- <notification name="ChatterBoxSessionStartError">
- Kan geen nieuwe chat sessie starten met [RECIPIENT].
-[REASON]
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="ChatterBoxSessionEventError">
- [EVENT]
-[REASON]
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="ForceCloseChatterBoxSession">
- Uw chat sessie met [NAME] zal moeten worden gesloten.
-[REASON]
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="Cannot_Purchase_an_Attachment">
- Items kunnen niet worden gekocht indien ze deel uit maken van een Bevestiging.
- </notification>
- <notification label="Over verzoeken voor debet permissies" name="DebitPermissionDetails">
- Toestemming geven aan dit script geeft het object een onbeperkte permissie om Linden dollars (L$) uit uw account te nemen!
-Om dit recht in te trekken, moet de object eigenaar het object verwijderen of de scripts in het object opnieuw instellen.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="AutoWearNewClothing">
- Wilt u de kleding items die u maakt automatisch aantrekken?
- <usetemplate ignoretext="Automatisch nieuwe kleding aantrekken" name="okcancelignore" notext="Nee" yestext="Ja"/>
- </notification>
- <notification name="NotAgeVerified">
- U moet leeftijd geverifieerd zijn om toegang te verkrijgen tot dit perceel.
-Wilt u de [SECOND_LIFE] website bezoeken om uw leeftijd te verifiëren?
-
-[_URL]
- <url name="url" option="0">
- https://secondlife.com/account/verification.php
- </url>
- <usetemplate ignoretext="Waarschuw voor gebrek aan leeftijd verificatie" name="okcancelignore" notext="Nee" yestext="Ja"/>
- </notification>
- <notification name="Cannot enter parcel: no payment info on file">
- Dit perceel verlangd dat u betaal informatie geregistreerd hebt staan alvorens toegang te verkrijgen.
-Wilt u de [SECOND_LIFE] website bezoeken om dit in te stellen?
-
-[_URL]
- <url name="url" option="0">
- https://secondlife.com/account/index.php?lang=nl
- </url>
- <usetemplate ignoretext="Waarschuw voor gebrek aan betaal informatie" name="okcancelignore" notext="Nee" yestext="Ja"/>
- </notification>
- <notification name="MissingString">
- De tekst [STRING_NAME] ontbreekt in strings.xml
- </notification>
- <notification name="SystemMessageTip">
- [MESSAGE]
- </notification>
- <notification name="Cancelled">
- Geannuleerd
- </notification>
- <notification name="CancelledSit">
- Zitten geannuleerd
- </notification>
- <notification name="CancelledAttach">
- Bevestigen geannuleerd
- </notification>
- <notification name="ReplacedMissingWearable">
- Missend kleding/lichaamsdeel is vervangen door standaard.
- </notification>
- <notification name="GroupNotice">
- Onderwerp: [SUBJECT], Bericht: [MESSAGE]
- </notification>
- <notification name="FriendOnline">
- [NAME] is Online
- </notification>
- <notification name="FriendOffline">
- [NAME] is Offline
- </notification>
- <notification name="AddSelfFriend">
- U kunt uzelf niet als vriend toevoegen.
- </notification>
- <notification name="UploadingAuctionSnapshot">
- In-wereld en website foto&apos;s worden geüpload...
-(Duurt ongeveer 5 minuten.)
- </notification>
- <notification name="UploadPayment">
- U heeft L$[AMOUNT] betaald om te uploaden.
- </notification>
- <notification name="UploadWebSnapshotDone">
- Upload van website foto is gereed.
- </notification>
- <notification name="UploadSnapshotDone">
- Upload van in-wereld foto is gereed.
- </notification>
- <notification name="TerrainDownloaded">
- Terrain.raw gedownload
- </notification>
- <notification name="GestureMissing">
- Gebaar [NAME] mist in de database.
- </notification>
- <notification name="UnableToLoadGesture">
- Kan gebaar [NAME] niet laden. Probeer het a.u.b. opnieuw.
- </notification>
- <notification name="LandmarkMissing">
- Landmarkering mist in de database.
- </notification>
- <notification name="UnableToLoadLandmark">
- Kan landmarkering niet laden. Probeer het a.u.b. opnieuw.
- </notification>
- <notification name="CapsKeyOn">
- Uw Caps Lock toets staat aan. Aangezien dit effect heeft op het wachtwoord dat u intypt, zult u het wellicht willen uitzetten.
- </notification>
- <notification name="NotecardMissing">
- Notitiekaart mist in de database.
- </notification>
- <notification name="NotecardNoPermissions">
- Onvoldoende permissies om de notitiekaart te bekijken.
- </notification>
- <notification name="RezItemNoPermissions">
- Onvoldoende permissies om het object te rezzen.
- </notification>
- <notification name="UnableToLoadNotecard">
- Kan op dit moment notitiekaart inhoud niet laden.
- </notification>
- <notification name="ScriptMissing">
- Script mist in de database.
- </notification>
- <notification name="ScriptNoPermissions">
- Onvoldoende permissies om het script te bekijken.
- </notification>
- <notification name="UnableToLoadScript">
- Kan script niet laden. Probeer het a.u.b. opnieuw.
- </notification>
- <notification name="IncompleteInventory">
- De complete inhoud die u aanbiedt is nog niet lokaal beschikbaar. Probeer die items over een minuut nogmaals aan te bieden.
- </notification>
- <notification name="CannotModifyProtectedCategories">
- U kunt geen beschermde categorieën wijzigen.
- </notification>
- <notification name="CannotRemoveProtectedCategories">
- U kunt geen beschermde categorieën verwijderen.
- </notification>
- <notification name="UnableToBuyWhileDownloading">
- Niet mogelijk te kopen terwijl objectdata wordt gedownload. Probeer het alstublieft opnieuw.
- </notification>
- <notification name="UnableToLinkWhileDownloading">
- Niet mogelijk om te koppelen terwijl objectdata wordt gedownload. Probeer het alstublieft opnieuw.
- </notification>
- <notification name="CannotBuyObjectsFromDifferentOwners">
- Kan geen objecten van meerdere eigenaren op hetzelfde moment kopen. Selecteer alstublieft een enkel object.
- </notification>
- <notification name="ObjectNotForSale">
- Object lijkt niet te koop.
- </notification>
- <notification name="EnteringGodMode">
- God modus binnengaan, niveau [LEVEL]
- </notification>
- <notification name="LeavingGodMode">
- God modus verlaten, niveau [LEVEL]
- </notification>
- <notification name="CopyFailed">
- Kopiëren mislukt omdat u geen kopieerpermissie bezit.
- </notification>
- <notification name="InventoryAccepted">
- [NAME] heeft uw inventarisaanbod geaccepteerd.
- </notification>
- <notification name="InventoryDeclined">
- [NAME] heeft uw inventarisaanbod afgewezen.
- </notification>
- <notification name="ObjectMessage">
- [NAME]: [MESSAGE]
- </notification>
- <notification name="CallingCardAccepted">
- Uw visitekaartje is geaccepteerd.
- </notification>
- <notification name="CallingCardDeclined">
- Uw visite kaart is afgewezen.
- </notification>
- <notification name="TeleportToLandmark">
- Nu u het mainland bereikt heeft, kunt u teleporteren naar locaties als &apos;[NAME]&apos; door op de Inventaris knop rechtsonder in uw scherm te klikken en dan de Landmarkeringen map te selecteren. Dubbelklik op de landmarkering en klik op Teleport om ernaartoe te reizen.
- </notification>
- <notification name="TeleportToPerson">
- Nu u het mainland bereikt heeft, kunt u contact opnemen met inwoners als &apos;[NAME]&apos; door op de Inventaris knop rechtsonder in uw scherm te klikken en dan de Visitekaartjes map te selecteren. Dubbelklik op het visitekaartje, klik op Instant Message en type een bericht.
- </notification>
- <notification name="CantSelectLandFromMultipleRegions">
- Kan geen land selecteren over servergrenzen.
-Probeer een kleiner stuk land te selecteren.
- </notification>
- <notification name="SearchWordBanned">
- Sommige termen in uw zoekopdracht werden uitgesloten vanwege inhoudbeperkingen zoals beschreven in de Gemeenschap Standaarden.
- </notification>
- <notification name="NoContentToSearch">
- Selecteer alstublieft minstens een type inhoud om te zoeken (PG, Mature of Adult).
- </notification>
- <notification name="GroupVote">
- [NAME] heeft voorgesteld om te stemmen over:
-[MESSAGE]
- <form name="form">
- <button name="VoteNow" text="Stem Nu"/>
- <button name="Later" text="Later"/>
- </form>
- </notification>
- <notification name="SystemMessage">
- [MESSAGE]
- </notification>
- <notification name="EventNotification">
- Evenement Bericht:
-
-[NAME]
-[DATE]
- <form name="form">
- <button name="Details" text="Omschrijving"/>
- <button name="Cancel" text="Annuleren"/>
- </form>
- </notification>
- <notification name="TransferObjectsHighlighted">
- Alle objecten op dit perceel die zullen worden overgedragen aan de koper van dit perceel zijn nu opgelicht.
-
-* Bomen en grassen die worden overgedragen zijn niet opgelicht.
- <form name="form">
- <button name="Done" text="Gereed"/>
- </form>
- </notification>
- <notification name="DeactivatedGesturesTrigger">
- Deactiveren van gebaren met dezelfde trigger:
-[NAMES]
- </notification>
- <notification name="NoQuickTime">
- De QuickTime software van Apple schijnt niet op uw systeem geïnstalleerd te zijn.
-Indien u streaming media wilt zien op percelen die dit ondersteunen, dient u naar de QuickTime webpagina te gaan (http://www.apple.com/QuickTime) en de QuickTime Player te installeren.
- </notification>
- <notification name="OwnedObjectsReturned">
- De objecten die uw eigendom zijn op het geselecteerde perceel zijn geretourneerd naar uw inventaris.
- </notification>
- <notification name="OtherObjectsReturned">
- De objecten op het geselecteerde perceel dat het eigendom is van [NAME], zijn geretourneerd naar zijn of haar inventaris.
- </notification>
- <notification name="OtherObjectsReturned2">
- De objecten op het geselecteerde perceel dat het eigendom is van inwoner &apos;[NAME]&apos;, zijn geretourneerd naar hun eigenaar.
- </notification>
- <notification name="GroupObjectsReturned">
- De objecten op het geselecteerde perceel dat gedeeld is met de groep [GROUPNAME] zijn geretourneerd naar de inventaris van hun eigenaar.
-Overdraagbare objecten die eigendom zijn van de groep zijn geretourneerd naar hun voormalige eigenaren.
-Niet-overdraagbare objecten die eigendom zijn van de groep zijn verwijderd.
- </notification>
- <notification name="UnOwnedObjectsReturned">
- De objecten op het geselecteerde perceel die NIET uw eigendom zijn, zijn geretourneerd naar hun eigenaren.
- </notification>
- <notification name="NotSafe">
- Op dit land is letsel ingeschakeld (&apos;niet veilig&apos;).
-U kunt hier letsel oplopen. Indien u sterft, zult u naar uw thuis locatie worden geteleporteerd.
- </notification>
- <notification name="NoFly">
- Op dit land is vliegen uitgeschakeld (&apos;niet vliegen&apos;).
-U kunt hier niet vliegen.
- </notification>
- <notification name="PushRestricted">
- Dit land is &apos;Niet Duwen&apos;.
-U kunt geen anderen duwen, tenzij u het land bezit.
- </notification>
- <notification name="NoVoice">
- Op dit land is voice uitgeschakeld.
- </notification>
- <notification name="NoBuild">
- Op dit land is bouwen uitgeschakeld (&apos;niet bouwen&apos;).
-U kunt hier geen objecten creëren.
- </notification>
- <notification name="ScriptsStopped">
- Een beheerder heeft scripts in deze regio tijdelijk gestopt.
- </notification>
- <notification name="ScriptsNotRunning">
- In deze regio worden geen scripts uitgevoerd.
- </notification>
- <notification name="NoOutsideScripts">
- Op dit land zijn externe scripts uitgeschakeld (geen externe scripts).
-Geen scripts zullen worden uitgevoerd, behalve scripts die toebehoren aan de landeigenaar.
- </notification>
- <notification name="ClaimPublicLand">
- Kan alleen publiek land claimen in de regio waar u aanwezig bent.
- </notification>
- <notification name="RegionTPAccessBlocked">
- U bent niet toegestaan in die regio vanwege uw inhoudscategorie. Wellicht dient u uw leeftijd te valideren en/of de nieuwste viewer te installeren.
-
-Gaat u alstublieft naar de kennisbank voor details over het betreden van gebieden met deze inhoudscategorie.
- </notification>
- <notification name="URBannedFromRegion">
- U bent uit deze regio verbannen.
- </notification>
- <notification name="NoTeenGridAccess">
- Uw account kan geen verbinding maken met deze teen grid regio.
- </notification>
- <notification name="NoHelpIslandTP">
- U kunt niet terug teleporteren naar Help Island. Ga naar &apos;Help Island Public&apos; om de handleiding te herhalen.
- </notification>
- <notification name="ImproperPaymentStatus">
- U heeft niet de juiste betalingstatus om deze regio binnen te gaan.
- </notification>
- <notification name="MustGetAgeRegion">
- U moet leeftijd geverifieerd zijn om deze regio binnen te gaan.
- </notification>
- <notification name="MustGetAgeParcel">
- U moet leeftijd geverifieerd zijn om dit perceel binnen te gaan.
- </notification>
- <notification name="NoDestRegion">
- Geen bestemmingsregio gevonden.
- </notification>
- <notification name="NotAllowedInDest">
- U wordt niet op de bestemming toegelaten.
- </notification>
- <notification name="RegionParcelBan">
- Kan niet naar de regio oversteken in een verbannen perceel. Probeer het op een andere manier.
- </notification>
- <notification name="TelehubRedirect">
- U bent doorverwezen naar een telehub.
- </notification>
- <notification name="CouldntTPCloser">
- Kan niet dichter bij bestemming teleporteren.
- </notification>
- <notification name="TPCancelled">
- Teleport geannuleerd.
- </notification>
- <notification name="FullRegionTryAgain">
- De regio die u probeert binnen te gaan is momenteel vol.
-Probeer het alstublieft opnieuw over enkele ogenblikken.
- </notification>
- <notification name="GeneralFailure">
- Algemene fout.
- </notification>
- <notification name="RoutedWrongRegion">
- Gerouteerd naar de verkeerde regio. Probeer het alstublieft opnieuw.
- </notification>
- <notification name="NoValidAgentID">
- Geen geldige agent ID.
- </notification>
- <notification name="NoValidSession">
- Geen geldige sessie ID.
- </notification>
- <notification name="NoValidCircuit">
- Geen geldige circuit code.
- </notification>
- <notification name="NoValidTimestamp">
- Geen geldige tijdstempel.
- </notification>
- <notification name="NoPendingConnection">
- Kan wachtende verbinding niet maken.
- </notification>
- <notification name="InternalUsherError">
- Er is een interne fout opgetreden terwijl geprobeerd werd u naar uw teleportbestemming te begeleiden. [SECOND_LIFE] heeft op dit moment mogelijk problemen met de dienstverlening.
- </notification>
- <notification name="NoGoodTPDestination">
- Kan geen goede teleportbestemming vinden in deze regio.
- </notification>
- <notification name="InternalErrorRegionResolver">
- Er is een interne fout opgetreden terwijl de globale coördinaten voor uw teleportverzoek werden bepaald. [SECOND_LIFE] heeft op dit moment mogelijk problemen met de dienstverlening.
- </notification>
- <notification name="NoValidLanding">
- Er kon geen geldig landingspunt worden gevonden.
- </notification>
- <notification name="NoValidParcel">
- Geen geldig perceel kon gevonden worden.
- </notification>
- <notification name="ObjectGiveItem">
- Een object genaamd &lt;nolink&gt;[OBJECTFROMNAME]&lt;/nolink&gt;, eigendom van [NAME_SLURL], heeft u een [OBJECTTYPE] genaamd &lt;nolink&gt;[ITEM_SLURL]&lt;/nolink&gt; gegeven.
- <form name="form">
- <button name="Keep" text="Behouden"/>
- <button name="Discard" text="Afwijzen"/>
- <button name="Mute" text="Negeren"/>
- </form>
- </notification>
- <notification name="ObjectGiveItemUnknownUser">
- Een object genaamd [OBJECTFROMNAME], eigendom van (een onbekende gebruiker), heeft u een [OBJECTTYPE] genaamd [OBJECTNAME] gegeven.
- <form name="form">
- <button name="Keep" text="Behouden"/>
- <button name="Discard" text="Afwijzen"/>
- <button name="Mute" text="Negeren"/>
- </form>
- </notification>
- <notification name="UserGiveItem">
- [NAME] heeft u een [OBJECTTYPE] genaamd &apos;[OBJECTNAME]&apos; gegeven.
- <form name="form">
- <button name="Keep" text="Behouden"/>
- <button name="Discard" text="Afwijzen"/>
- <button name="Mute" text="Negeren"/>
- </form>
- </notification>
- <notification name="GodMessage">
- [NAME]
-[MESSAGE]
- </notification>
- <notification name="JoinGroup">
- [MESSAGE]
- <form name="form">
- <button name="Join" text="Deelnemen"/>
- <button name="Decline" text="Afwijzen"/>
- <button name="Info" text="Info"/>
- </form>
- </notification>
- <notification name="TeleportOffered">
- [NAME] heeft aangeboden u te teleporteren naar zijn of haar locatie:
-
-[MESSAGE]
- <form name="form">
- <button name="Teleport" text="Teleport"/>
- <button name="Cancel" text="Annuleren"/>
- </form>
- </notification>
- <notification name="GotoURL">
- [MESSAGE]
-[URL]
- <form name="form">
- <button name="Later" text="Later"/>
- <button name="GoNow..." text="Ga Nu..."/>
- </form>
- </notification>
- <notification name="OfferFriendship">
- [NAME] biedt vriendschap aan.
-
-[MESSAGE]
-
-(Standaard zult u in staat zijn om elkaars online status te zien.)
- <form name="form">
- <button name="Accept" text="Accepteren"/>
- <button name="Decline" text="Afwijzen"/>
- </form>
- </notification>
- <notification name="OfferFriendshipNoMessage">
- [NAME] biedt vriendschap aan.
-
-(Standaard zult u in staat zijn om elkaars online status te zien.)
- <form name="form">
- <button name="Accept" text="Accepteren"/>
- <button name="Decline" text="Afwijzen"/>
- </form>
- </notification>
- <notification name="FriendshipAccepted">
- [NAME] heeft uw vriendschapsaanbod geaccepteerd.
- </notification>
- <notification name="FriendshipDeclined">
- [NAME] heeft uw vriendschapsaanbod afgewezen.
- </notification>
- <notification name="OfferCallingCard">
- [NAME] biedt zijn/haar visitekaartje aan.
-Dit zal een bladwijzer in uw inventaris toevoegen zodat u deze inwoner snel kunt een IM kunt sturen.
- <form name="form">
- <button name="Accept" text="Accepteren"/>
- <button name="Decline" text="Afwijzen"/>
- </form>
- </notification>
- <notification name="RegionRestartMinutes">
- De regio zal over [MINUTES] minuten herstarten.
-Indien u in deze regio blijft, zult u worden uitgelogd.
- </notification>
- <notification name="RegionRestartSeconds">
- De regio zal over [SECONDS] seconden herstarten.
-Indien u in deze regio blijft, zult u worden uitgelogd.
- </notification>
- <notification name="LoadWebPage">
- Laad webpagina [URL]?
-
-[MESSAGE]
-
-Van object: [OBJECTNAME], eigenaar: [NAME]?
- <form name="form">
- <button name="Gotopage" text="Laden"/>
- <button name="Cancel" text="Annuleren"/>
- </form>
- </notification>
- <notification name="FailedToFindWearableUnnamed">
- Kon [TYPE] niet in de database vinden.
- </notification>
- <notification name="FailedToFindWearable">
- Kon [TYPE] genaamd [DESC] niet in de database vinden.
- </notification>
- <notification name="InvalidWearable">
- Het item dat u probeert te dragen gebruikt een kenmerk dat uw viewer niet kan lezen. Upgrade u alstublieft uw versie van [APP_NAME] om dit item te dragen.
- </notification>
- <notification name="ScriptQuestion">
- [OBJECTNAME]&apos;, een object van &apos;[NAME]&apos;, wil graag:
-
-[QUESTIONS]
-Is dit OK?
- <form name="form">
- <button name="Yes" text="Ja"/>
- <button name="No" text="Nee"/>
- <button name="Mute" text="Negeren"/>
- </form>
- </notification>
- <notification name="ScriptQuestionCaution">
- [OBJECTNAME]&apos;, een object van &apos;[NAME]&apos;, wil graag
-
-[QUESTIONS]
-Indien u dit object en zijn maker niet vertrouwt, zou u het verzoek moeten weigeren. Klik de Details knop voor additionele informatie.
-
-Dit verzoek inwilligen?
- <form name="form">
- <button name="Grant" text="Inwilligen"/>
- <button name="Deny" text="Weigeren"/>
- <button name="Details" text="Details..."/>
- </form>
- </notification>
- <notification name="ScriptDialog">
- [NAME]&apos;s &apos;&lt;nolink&gt;[TITLE]&lt;/nolink&gt;&apos;
-[MESSAGE]
- <form name="form">
- <button name="Ignore" text="Negeren"/>
- </form>
- </notification>
- <notification name="ScriptDialogGroup">
- [GROUPNAME]&apos;s &apos;[TITLE]&apos;
-[MESSAGE]
- <form name="form">
- <button name="Ignore" text="Negeren"/>
- </form>
- </notification>
- <notification name="FirstBalanceIncrease">
- U heeft zojuist L$[AMOUNT] ontvangen.
-Objecten en andere gebruikers kunnen u L$ geven.
-Uw saldo wordt in de rechterbovenhoek van het scherm getoond.
- </notification>
- <notification name="FirstBalanceDecrease">
- U heeft zojuist L$[AMOUNT] betaald.
-Uw saldo wordt in de rechterbovenhoek van het scherm getoond.
- </notification>
- <notification name="FirstSit">
- U zit.
-Gebruik de pijltjestoetsen (of AWSD) of uw gezichtsveld te wijzigen.
-Klik de &apos;Sta Op&apos; knop om op te staan.
- </notification>
- <notification name="FirstMap">
- Klik en sleep om de kaart te verplaatsen.
-Dubbelklik om te teleporteren.
-Gebruik de bedieningselementen aan de rechterkant om dingen te vinden en verschillende achtergronden te tonen.
- </notification>
- <notification name="FirstBuild">
- U kunt nieuwe objecten bouwen in sommige gebieden van [SECOND_LIFE].
-Gebruik de gereedschappen in de linkerbovenhoek om te bouwen en probeer Ctrl en Alt ingedrukt te houden om snel tussen gereedschappen te wisselen.
-Druk Esc om te stoppen met bouwen.
- </notification>
- <notification name="FirstLeftClickNoHit">
- Links-klikken werkt in op speciale objecten.
-Indien de muisaanwijzer verandert in een hand, kunt u interacteren met het object.
-Rechts-klikken toont altijd een menu van dingen die u kunt doen.
- </notification>
- <notification name="FirstTeleport">
- Deze regio staat geen point-to-point teleport toe, dus u bent naar de dichtstbijzijnde telehub getransporteerd.
-Uw bestemming is gemarkeerd met een groot baken.
-Volg de rode pijl naar het baken, of klik de pijl om het baken te verwijderen.
- </notification>
- <notification name="FirstOverrideKeys">
- Uw bewegingstoetsen worden nu door een object afgehandeld.
-Probeer de pijltjestoetsen of AWSD om te zien wat ze doen.
-Sommige objecten (zoals geweren) vereisen dat u in mouselook gaat om ze te gebruiken.
-Druk &apos;M&apos; om dit te doen.
- </notification>
- <notification name="FirstAppearance">
- U bent uw uiterlijk aan het bewerken.
-Gebruik de pijltjestoetsen om uw gezichtsveld te draaien en te zoomen.
-Druk &apos;Alles Opslaan&apos; om uw uiterlijk op te slaan wanneer u klaar bent.
-U kunt uw uiterlijk zo vaak als u wil bewerken.
- </notification>
- <notification name="FirstInventory">
- Dit is uw inventaris, die objecten, notitiekaarten, kleding en andere eigendommen bevat.
-* Om een object of een kleding-map te dragen, sleep het op uzelf.
-* Om een object in de wereld te brengen, sleep het op de grond.
-* Om een notitiekaart te lezen, dubbelklik erop.
- </notification>
- <notification name="FirstSandbox">
- Dit is een zandbak regio.
-Objecten die u hier bouwt, kunnen worden verwijderd nadat u het gebied verlaat. Zandbakken schonen op regelmatige basis, kijk alstublieft naar de informatie aan de bovenkant van het scherm, naast de regionaam.
-
-Zandbak regio&apos;s zijn ongewoon en gemarkeerd met borden.
- </notification>
- <notification name="FirstFlexible">
- Dit object is flexibel.
-Flexibele objecten mogen niet fysiek zijn en moeten fantoom zijn tot de &apos;flexibel&apos; checkbox wordt uitgezet.
- </notification>
- <notification name="FirstDebugMenus">
- U heeft het menu Geavanceerd geactiveerd.
-Dit menu bevat opties die handig zijn voor ontwikkelaars tijdens het debuggen van [SECOND_LIFE].
-Om dit menu in en uit te schakelen drukt u binnen Windows Ctrl+Alt+D. Met een Mac drukt u &#8997;&#8984;D.
- </notification>
- <notification name="FirstSculptedPrim">
- U bent een sculpted prim aan het bewerken.
-Sculpted prims vereisen een speciaal textuur om hun vorm te bepalen.
-U kunt voorbeelden van sculpt-texturen in de inventaris bibliotheek vinden.
- </notification>
- <notification name="FirstMedia">
- U bent begonnen met het afspelen van media. In het Voorkeurenvenster, onder Audio / Video, kan media worden ingesteld om automatisch te beginnen met afspelen. Let op dat dit een beveiligingsrisico kan zijn voor media sites die u niet vertrouwt.
- </notification>
- <notification name="MaxListSelectMessage">
- U mag slecht maximaal [MAX_SELECT] items van deze lijst kiezen.
- </notification>
- <notification name="VoiceInviteP2P">
- [NAME] nodigt u uit voor een Voice chat gesprek.
-Klik Accepteren om deel te nemen aan dit gesprek of Afwijzen om de uitnodiging af te wijzen. Klik Negeren om deze persoon te negeren.
- <form name="form">
- <button name="Accept" text="Accepteren"/>
- <button name="Decline" text="Afwijzen"/>
- <button name="Mute" text="Negeren"/>
- </form>
- </notification>
- <notification name="AutoUnmuteByIM">
- Er is een instant message naar [NAME] gestuurd, waardoor deze automatisch van de negeerlijst is gehaald.
- </notification>
- <notification name="AutoUnmuteByMoney">
- Er is geld gegeven aan [NAME], waardoor deze automatisch van de negeerlijst is gehaald.
- </notification>
- <notification name="AutoUnmuteByInventory">
- Er is inventaris aangeboden aan [NAME], waardoor deze automatisch van de negeerlijst is gehaald.
- </notification>
- <notification name="VoiceInviteGroup">
- [NAME] doet nu mee met een Voice chat gesprek binnen de groep [GROUP].
-Klik Accepteren om deel te nemen aan het gesprek of Afwijzen om de uitnodiging af te wijzen. Klik Negeren om deze persoon te negeren.
- <form name="form">
- <button name="Accept" text="Accepteren"/>
- <button name="Decline" text="Afwijzen"/>
- <button name="Mute" text="Negeren"/>
- </form>
- </notification>
- <notification name="VoiceInviteAdHoc">
- [NAME] doet nu mee met een Voice chat gesprek binnen een conferentie chat.
-Klik Accepteren om deel te nemen aan het gesprek of Afwijzen om de uitnodiging af te wijzen. Klik Negeren om deze persoon te negeren.
- <form name="form">
- <button name="Accept" text="Accepteren"/>
- <button name="Decline" text="Afwijzen"/>
- <button name="Mute" text="Negeren"/>
- </form>
- </notification>
- <notification name="InviteAdHoc">
- [NAME] nodigt u uit voor een conferentie chat.
-Klik Accepteren om deel te nemen aan de chat of Afwijzen om de uitnodiging af te wijzen. Klik Negeren om deze persoon te negeren.
- <form name="form">
- <button name="Accept" text="Accepteren"/>
- <button name="Decline" text="Afwijzen"/>
- <button name="Mute" text="Negeren"/>
- </form>
- </notification>
- <notification name="VoiceChannelFull">
- Het voice gesprek waaraan u probeert deel te nemen, [VOICE_CHANNEL_NAME], heeft zijn maximale capaciteit bereikt. Probeert u het alstublieft later nog een keer.
- </notification>
- <notification name="ProximalVoiceChannelFull">
- Onze excuses. Dit gebied heeft zijn maximale capaciteit voor voice conversaties bereikt. Probeert u alstublieft voice te gebruiken in een ander gebied.
- </notification>
- <notification name="VoiceChannelDisconnected">
- U bent niet meer verbonden met [VOICE_CHANNEL_NAME]. U zult weer worden verbonden met spatiale voice chat.
- </notification>
- <notification name="VoiceChannelDisconnectedP2P">
- [VOICE_CHANNEL_NAME] heeft het gesprek beëindigd. U zult weer worden verbonden met spatiale voice chat.
- </notification>
- <notification name="P2PCallDeclined">
- [VOICE_CHANNEL_NAME] heeft uw oproep afgewezen. U zult weer worden verbonden met spatiale voice chat.
- </notification>
- <notification name="P2PCallNoAnswer">
- [VOICE_CHANNEL_NAME] is niet beschikbaar om uw oproep aan te nemen. U zult weer worden verbonden met spatiale voice chat.
- </notification>
- <notification name="VoiceChannelJoinFailed">
- Verbinden met [VOICE_CHANNEL_NAME] is mislukt, probeert u het later alstublieft nog een keer. U zult weer worden verbonden met spatiale voice chat.
- </notification>
- <notification name="VoiceLoginRetry">
- We zijn bezig om een voice kanaal voor u te maken. Dit kan tot een minuut duren.
- </notification>
- <notification name="Cannot enter parcel: not a group member">
- Kan het perceel niet betreden, u bent geen lid van de juiste groep.
- </notification>
- <notification name="Cannot enter parcel: banned">
- Kan het perceel niet betreden, u bent verbannen.
- </notification>
- <notification name="Cannot enter parcel: not on access list">
- Kan het perceel niet betreden, u staat niet op de toegangslijst.
- </notification>
- <notification name="VoiceNotAllowed">
- U heeft geen permissie om met voice chat te verbinden voor [VOICE_CHANNEL_NAME].
- </notification>
- <notification name="VoiceCallGenericError">
- Er is een fout opgetreden tijdens het verbinden met voice chat voor [VOICE_CHANNEL_NAME]. Probeert u het later alstublieft opnieuw.
- </notification>
- <notification name="UnableToOpenCommandURL">
- De URL die u heeft geklikt kan niet binnen deze webbrowser worden geopend.
- </notification>
- <global name="UnsupportedCPU">
- - Uw Processor snelheid (CPU) voldoet niet aan de minimale eisen.
- </global>
- <global name="UnsupportedGLRequirements">
- U heeft mogelijk niet de vereiste hardware voor [APP_NAME]. [APP_NAME] verlangd een OpenGL grafische kaart die multi-texture ondersteund. Indien dat het geval is, overtuig u er dan van dat u de laatste stuurprogramma&apos;s voor uw grafische kaart, service packs en patches voor uw Operating systeem heeft.
-
-Indien u problemen blijft houden, bezoek dan: http://www.secondlife.com/support
- </global>
- <global name="UnsupportedCPUAmount">
- 796
- </global>
- <global name="UnsupportedRAMAmount">
- 510
- </global>
- <global name="UnsupportedGPU">
- - Uw grafische kaart voldoet niet aan de minimale eisen.
- </global>
- <global name="UnsupportedRAM">
- - Uw systeem geheugen voldoet niet aan de minimale eisen.
- </global>
- <global name="PermYes">
- Ja
- </global>
- <global name="PermNo">
- Nee
- </global>
-</notifications>
diff --git a/indra/newview/skins/default/xui/nl/panel_block_list_sidetray.xml b/indra/newview/skins/default/xui/nl/panel_block_list_sidetray.xml
deleted file mode 100644
index 38018a3626..0000000000
--- a/indra/newview/skins/default/xui/nl/panel_block_list_sidetray.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="block_list_panel">
- <text name="title_text">
- Blokkeer Lijst
- </text>
- <scroll_list name="blocked" tool_tip="Lijst van momenteel geblokkeerde bewoners"/>
- <button label="Blokkeer Bewoner..." label_selected="Blokkeer Bewoner..." name="Block resident..." tool_tip="Kies een bewoner om te blokkeren"/>
- <button label="Blokkeer object bij naam..." label_selected="Blokkeer object bij naam..." name="Block object by name..."/>
- <button label="Deblokkeren" label_selected="Deblokkeren" name="Unblock" tool_tip="Verweider bewoner of object uit blokkeer lijst"/>
-</panel>
diff --git a/indra/newview/skins/default/xui/nl/panel_edit_profile.xml b/indra/newview/skins/default/xui/nl/panel_edit_profile.xml
deleted file mode 100644
index fffdb9e8df..0000000000
--- a/indra/newview/skins/default/xui/nl/panel_edit_profile.xml
+++ /dev/null
@@ -1,45 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<panel name="edit_profile_panel">
- <string name="CaptionTextAcctInfo">
- [ACCTTYPE] [PAYMENTINFO] [AGEVERIFICATION]
- </string>
- <string name="AcctTypeResident"
- value="Inwoner" />
- <string name="AcctTypeTrial"
- value="Proef" />
- <string name="AcctTypeCharterMember"
- value="Charter lid" />
- <string name="AcctTypeEmployee"
- value="Linden Lab werknemer" />
- <string name="PaymentInfoUsed"
- value="Betalingsinformatie gebruikt" />
- <string name="PaymentInfoOnFile"
- value="Betalingsinformatie aanwezig" />
- <string name="NoPaymentInfoOnFile"
- value="Geen betalingsinfo aanwezig" />
- <string name="AgeVerified"
- value="Leeftijd geverifieerd" />
- <string name="NotAgeVerified"
- value="Leeftijd niet geverifieerd" />
- <string name="partner_edit_link_url">
- http://www.secondlife.com/account/partners.php?lang=nl
- </string>
- <panel name="scroll_content_panel">
- <panel name="data_panel" >
- <panel name="lifes_images_panel">
- <panel name="second_life_image_panel">
- <text name="second_life_photo_title_text">
- [SECOND_LIFE]:
- </text>
- </panel>
- </panel>
- <text name="title_partner_text" value="Partner:"/>
- <panel name="partner_data_panel">
- <text name="partner_text"/>
- </panel>
- <text name="text_box3">
- Antwoord bij Niet Storen:
- </text>
- </panel>
- </panel>
-</panel>
diff --git a/indra/newview/skins/default/xui/nl/panel_group_general.xml b/indra/newview/skins/default/xui/nl/panel_group_general.xml
deleted file mode 100644
index 2a0fe03232..0000000000
--- a/indra/newview/skins/default/xui/nl/panel_group_general.xml
+++ /dev/null
@@ -1,72 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Algemeen" name="general_tab">
- <string name="help_text">
- Het tabblad Algemeen bevat algemene informatie over deze groep, een lijst met eigenaren en zichtbare leden, algemene groepsvoorkeuren en ledenopties.
-
-Laat uw muis boven de opties zweven voor meer help.
- </string>
- <string name="group_info_unchanged">
- Algemene groepsinformatie is gewijzigd.
- </string>
- <button label="?" label_selected="?" name="help_button"/>
- <line_editor label="Typ uw nieuwe groepsnaam hier" name="group_name_editor"/>
- <text name="group_name">
- Typ uw nieuwe groepsnaam hier
- </text>
- <text name="prepend_founded_by">
- Opgericht door
- </text>
- <text name="founder_name" left_delta="84">
- (wachten)
- </text>
- <text name="group_charter_label" width="244">
- Groepcharter
- </text>
- <texture_picker label="Groepinsigne" name="insignia" tool_tip="Klik om een afbeelding te kiezen"/>
- <text_editor name="charter" width="244">
- Groepcharter
- </text_editor>
- <button label="Deelnemen (L$0)" label_selected="Deelnemen (L$0)" name="join_button"/>
- <button label="Gedetailleerde weergave" label_selected="Gedetailleerde weergave" name="info_button" width="154"/>
- <text name="text_owners_and_visible_members">
- Eigenaren en zichtbare leden
- </text>
- <text name="text_owners_are_shown_in_bold">
- (Eigenaren worden vet getoond)
- </text>
- <name_list name="visible_members">
- <name_list.columns label="Lidnaam" name="name"/>
- <name_list.columns label="Titel" name="title"/>
- <name_list.columns label="Laatste login" name="online"/>
- </name_list>
- <text name="text_group_preferences">
- Groepvoorkeuren
- </text>
- <panel name="preferences_container">
- <check_box label="Toon in zoeken" name="show_in_group_list" tool_tip="Stelt in of deze groep zichtbaar is in de zoekresultaten."/>
- <check_box label="Vrije toegang" name="open_enrollement" tool_tip="Stelt in of deze groep toestaat dat nieuwe leden lid kunnen worden zonder uitgenodigd te zijn."/>
- <check_box label="Contributiebijdrage:" name="check_enrollment_fee" tool_tip="Stelt in of er een contributiebijdrage vereist is om lid te worden van de groep."/>
- <spinner name="spin_enrollment_fee" tool_tip="Nieuwe leden moeten deze bijdrage betalen om deel te nemen aan de groep wanneer &quot;Contributie bijdrage&quot; is aangevinkt." width="58" left_delta="142"/>
- <combo_box name="group_mature_check" tool_tip="Stelt in of uw groepsinformatie als mature beschouwd wordt.">
- <combo_box.item name="select_mature" label="- Selecteer -"/>
- <combo_box.item name="mature" label="Mature inhoud"/>
- <combo_box.item name="pg" label="PG inhoud"/>
- </combo_box>
- <panel name="title_container">
- <text name="active_title_label">
- Mijn actieve titel
- </text>
- <combo_box name="active_title" tool_tip="Stelt de titel in die in uw avatar&apos;s naamlabel verschijnt wanneer deze groep actief is."/>
- </panel>
- <check_box label="Ontvang groepsberichten" name="receive_notices" tool_tip="Stelt in of u berichten van deze groep wilt ontvangen. Verwijder het vinkje wanneer u spam ontvangt van deze groep." left_delta="-4"/>
- <check_box label="Toon deze groep in mijn profiel" name="list_groups_in_profile" tool_tip="Stelt in of u deze groep in uw profiel wil laten zien"/>
- </panel>
- <string name="incomplete_member_data_str">
- Ledendata ophalen
- </string>
- <string name="confirm_group_create_str">
- Het maken van deze groep zal u L$ 100 kosten. Weet u ECHT héél zeker dat u L$ 100 wilt betalen om deze groep te maken?
-
-WEES U ER VAN BEWUST, dat als er niemand binnen 48 uur lid wordt van deze groep, deze weer ontmanteld zal worden. Hierbij zal ook de groepsnaam onbeschikbaar blijven voor toekomstig gebruik!
- </string>
-</panel>
diff --git a/indra/newview/skins/default/xui/nl/panel_group_invite.xml b/indra/newview/skins/default/xui/nl/panel_group_invite.xml
deleted file mode 100644
index e012d88ff5..0000000000
--- a/indra/newview/skins/default/xui/nl/panel_group_invite.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Nodig een lid uit" name="invite_panel">
- <text name="help_text">
- U kunt meerdere inwoners selecteren
-om voor uw groep uit te nodigen. Klik
-&apos;Open inwonerkiezer&apos; om te starten.
- </text>
- <button label="Open inwonerkiezer" name="add_button" tool_tip=""/>
- <name_list name="invitee_list" tool_tip="Houd de Ctrl-toets vast en klik de namen van de inwoners om meerdere te selecteren."/>
- <button label="Verwijder geselecteerden van lijst" name="remove_button" tool_tip="Verwijderd hierboven geselecteerde inwoners van de uitnodigingslijst."/>
- <text name="role_text">
- Kies welke rol aan hen wordt
-toegewezen:
- </text>
- <combo_box name="role_name" tool_tip="Kies uit de lijst met rollen waarvoor u toestemming heeft om leden toe te wijzen." bottom_delta="-30"/>
- <button label="Verzend uitnodigingen" name="ok_button"/>
- <button label="Annuleren" name="cancel_button"/>
- <string name="confirm_invite_owner_str">
- Weet u zeker dat u een (een) nieuwe eigenaar(s) wilt uitnodigen? Deze actie is permanent!
- </string>
- <string name="loading">
- (laden...)
- </string>
-</panel>
diff --git a/indra/newview/skins/default/xui/nl/panel_group_land_money.xml b/indra/newview/skins/default/xui/nl/panel_group_land_money.xml
deleted file mode 100644
index 43babafdf8..0000000000
--- a/indra/newview/skins/default/xui/nl/panel_group_land_money.xml
+++ /dev/null
@@ -1,84 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Land &amp; L$" name="land_money_tab">
- <string name="help_text">
- Percelen in groepseigendom worden getoond, samen met bijdragedetails. Een waarschuwing verschijnt totdat Totaal Land In Gebruik minder dan of gelijk aan de totale bijdrage is. De Planning, Details en Verkopen tabbladen verschaffen meer informatie over de financiën van de groep.
- </string>
- <button label="?" name="help_button"/>
- <string name="cant_view_group_land_text">
- U heeft geen permissie om land te bekijken dat eigendom van de groep is.
- </string>
- <string name="cant_view_group_accounting_text">
- U heeft geen permissie om accounting informatie van de groep te bekijken.
- </string>
- <string name="loading_txt">
- Laden...
- </string>
- <text name="group_land_heading" width="260">
- Land in eigendom van groep
- </text>
- <scroll_list name="group_parcel_list">
- <column label="Perceelnaam" name="name"/>
- <column label="Regio" name="location"/>
- <column label="Type" name="type"/>
- <column label="Gebied" name="area"/>
- </scroll_list>
- <button label="Toon op kaart" label_selected="Toon op kaart" name="map_button"/>
- <text name="total_contributed_land_label">
- Totale bijdrage:
- </text>
- <text name="total_contributed_land_value" width="200">
- [AREA] m²
- </text>
- <text name="total_land_in_use_label">
- Totaal land in gebruik:
- </text>
- <text name="total_land_in_use_value">
- [AREA] m²
- </text>
- <text name="land_available_label">
- Land beschikbaar:
- </text>
- <text name="land_available_value">
- [AREA] m²
- </text>
- <text name="your_contribution_label">
- Uw bijdrage:
- </text>
- <string name="land_contrib_error">
- Niet in staat uw landbijdrage in te stellen.
- </string>
- <text name="your_contribution_units">
- ( m² )
- </text>
- <text name="your_contribution_max_value">
- ([AMOUNT] max)
- </text>
- <text name="group_over_limit_text">
- Groepsleden moeten landcredits bijdragen om het gebruikte land
-te ondersteunen.
- </text>
- <text name="group_money_heading">
- Groep L$
- </text>
- <tab_container name="group_money_tab_container">
- <panel label="Planning" name="group_money_planning_tab">
- <text_editor name="group_money_planning_text">
- Berekenen...
- </text_editor>
- </panel>
- <panel label="Details" name="group_money_details_tab">
- <text_editor name="group_money_details_text">
- Berekenen...
- </text_editor>
- <button label="&lt; Eerder" label_selected="&lt; Eerder" name="earlier_details_button" tool_tip="Ga terug in de tijd"/>
- <button label="Later &gt;" label_selected="Later &gt;" name="later_details_button" tool_tip="Ga vooruit in de tijd"/>
- </panel>
- <panel label="Verkopen" name="group_money_sales_tab">
- <text_editor name="group_money_sales_text">
- Berekenen...
- </text_editor>
- <button label="&lt; Eerder" label_selected="&lt; Eerder" name="earlier_sales_button" tool_tip="Ga terug in de tijd"/>
- <button label="Later &gt;" label_selected="Later &gt;" name="later_sales_button" tool_tip="Ga vooruit in de tijd"/>
- </panel>
- </tab_container>
-</panel>
diff --git a/indra/newview/skins/default/xui/nl/panel_group_notices.xml b/indra/newview/skins/default/xui/nl/panel_group_notices.xml
deleted file mode 100644
index a1929bb5e1..0000000000
--- a/indra/newview/skins/default/xui/nl/panel_group_notices.xml
+++ /dev/null
@@ -1,62 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Berichten" name="notices_tab">
- <string name="help_text">
- Berichten vormen een snelle manier om met een groep te communiceren door een bericht en optioneel een bevestigd item af te leveren. Berichten gaan alleen naar groepsleden in rollen die de mogelijkheid hebben om berichten te ontvangen. U kunt berichten uitzetten in de tab Algemeen.
- </string>
- <string name="no_notices_text">
- Er zijn geen oude berichten.
- </string>
- <button label="?" label_selected="?" name="help_button"/>
- <text name="lbl">
- Groepsberichtenarchief
- </text>
- <text name="lbl2">
- Berichten worden 14 dagen bewaard. Berichtenlijsten zijn gelimiteerd tot 200 berichten groep per dag.
- </text>
- <scroll_list name="notice_list">
- <column label="Onderwerp" name="subject"/>
- <column label="Van" name="from"/>
- <column label="Datum" name="date"/>
- </scroll_list>
- <text name="notice_list_none_found">
- Geen gevonden.
- </text>
- <button label="Maak nieuw bericht" label_selected="Maak nieuw bericht" name="create_new_notice"/>
- <button label="Verversen" label_selected="Ververs lijst" name="refresh_notices"/>
- <panel label="Maak nieuw bericht" name="panel_create_new_notice">
- <text name="lbl">
- Maak een bericht
- </text>
- <text name="lbl2">
- U kunt een enkel item aan een bericht toevoegen door het van uw inventaris naar dit paneel te slepen. Bevestigde items moeten kopieerbaar en overdraagbaar zijn en u kunt geen mappen versturen.
- </text>
- <text name="lbl3">
- Onderwerp:
- </text>
- <text name="lbl4">
- Bericht:
- </text>
- <text name="lbl5">
- Bevestig:
- </text>
- <button label="Verwijder bevestiging" label_selected="Verwijder bevestiging" name="remove_attachment"/>
- <button label="Verzend bericht" label_selected="Verzend bericht" name="send_notice"/>
- <panel name="drop_target" tool_tip="Sleep een inventarisitem op het berichtvenster om het met het bericht mee te sturen. U dient permissie te hebben om het object te kopiëren en over te dragen wilt u het met het bericht mee kunnen sturen."/>
- </panel>
- <panel label="Bekijk oud bericht" name="panel_view_past_notice">
- <text name="lbl">
- Gearchiveerd bericht
- </text>
- <text name="lbl2">
- Om een nieuw bericht te sturen, klik de &apos;Maak nieuw bericht&apos; knop hierboven.
- </text>
- <text name="lbl3">
- Onderwerp:
- </text>
- <text name="lbl4">
- Bericht:
- </text>
- <button label="Open bevestiging" label_selected="Open bevestiging" name="open_attachment" width="118"/>
- <line_editor left="128" name="view_inventory_name" width="256"/>
- </panel>
-</panel>
diff --git a/indra/newview/skins/default/xui/nl/panel_group_roles.xml b/indra/newview/skins/default/xui/nl/panel_group_roles.xml
deleted file mode 100644
index 507906c0d7..0000000000
--- a/indra/newview/skins/default/xui/nl/panel_group_roles.xml
+++ /dev/null
@@ -1,101 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Leden &amp; Rollen" name="roles_tab">
- <panel.string name="default_needs_apply_text">
- Er zijn niet opgeslagen veranderingen op de huidige tab
- </panel.string>
- <panel.string name="want_apply_text">
- Wilt u deze wijzigingen opslaan?
- </panel.string>
- <tab_container height="164" name="roles_tab_container">
- <panel height="148" label="LEDEN" name="members_sub_tab" tool_tip="Leden">
- <panel.string name="help_text">
- U kunt Rollen aan Leden toewijzen of van Leden afnemen. Selecteer meerdere Leden door de Ctrl toets ingedrukt te houden en op hun namen te klikken.
- </panel.string>
- <filter_editor label="Filter Leden" name="filter_input"/>
- <name_list bottom_delta="-105" height="104" name="member_list">
- <name_list.columns label="Lid Naam" name="name"/>
- <name_list.columns label="Donaties" name="donated"/>
- <name_list.columns label="Laatste Login" name="online"/>
- </name_list>
- <button label="Uitnodigen" name="member_invite"/>
- <button label="Uitwerpen" name="member_eject"/>
- </panel>
- <panel height="148" label="ROLLEN" name="roles_sub_tab">
- <panel.string name="help_text">
- Rollen hebben een titel en een toegestane lijst met Vaardigheden die Leden kunnen uitvoeren. Leden kunnen tot 1 of meer Rollen behoren. Een groep kan tot 10 Rollen bevatten, inclusief de Iedereen en Eigenaren Rollen.
- </panel.string>
- <panel.string name="cant_delete_role">
- De &apos;Iedereen&apos; en &apos;Eigenaren&apos; Rollen zijn speciaal en kunnen niet verwijderd worden.
- </panel.string>
- <panel.string name="power_folder_icon">
- Inv_FolderClosed
- </panel.string>
- <filter_editor label="Filter Rollen" name="filter_input"/>
- <scroll_list bottom_delta="-104" height="104" name="role_list">
- <scroll_list.columns label="Rol" name="name"/>
- <scroll_list.columns label="Titel" name="title"/>
- <scroll_list.columns label="Leden" name="members"/>
- </scroll_list>
- <button label="Nieuwe Rol..." name="role_create"/>
- <button label="Rol Verwijderen" name="role_delete"/>
- </panel>
- <panel height="148" label="VAARDIGHEDEN" name="actions_sub_tab" tool_tip="Je kan een vaardigheid&apos;s beschrijving en welke Rollen en Leden kunnen uitvoeren van de Vaardigheid.">
- <panel.string name="help_text">
- Mogelijkheden stellen leden in staat om specifieke dingen in een groep te doen. Er is een brede variëteit aan Mogelijkheden.
- </panel.string>
- <filter_editor label="Filter Vaardigheden" name="filter_input"/>
- <scroll_list bottom_delta="-120" height="118" name="action_list" tool_tip="Selecteer een Vaardigheid om meer details te bekijken"/>
- </panel>
- </tab_container>
- <panel name="members_footer">
- <text name="static">
- Toegekende Rollen
- </text>
- <text name="static2">
- Toegestane Mogelijkheden
- </text>
- <scroll_list name="member_allowed_actions" tool_tip="Voor details van elke Toegestane Vaardigheid in de Mogelijkheden tab"/>
- </panel>
- <panel name="roles_footer">
- <text name="static">
- Naam
- </text>
- <line_editor name="role_name">
- Werknemers
- </line_editor>
- <text name="static3">
- Titel
- </text>
- <line_editor name="role_title">
- (wachten)
- </line_editor>
- <text name="static2">
- Omschrijving
- </text>
- <text_editor name="role_description">
- (wachten)
- </text_editor>
- <text name="static4">
- Toegewezen Rollen
- </text>
- <check_box label="Leden Onthullen" name="role_visible_in_list" tool_tip="Bepaalt of leden van deze rol zichtbaar zijn in de Algemeen tab voor mensen buiten de groep."/>
- <text name="static5" tool_tip="Een lijst met Mogelijkheden die de geselecteerd rol kan uitvoeren.">
- Toegestane Mogelijkheden
- </text>
- <scroll_list name="role_allowed_actions" tool_tip="For details of each allowed ability see the abilities tab"/>
- </panel>
- <panel name="actions_footer">
- <text name="static">
- Vaardigheid omschrijving
- </text>
- <text_editor name="action_description">
- Dit is de Mogelijkheid &apos;Werp Leden uit deze Groep&apos;. Alleen een Eigenaar kan een andere Eigenaar uitwerpen.
- </text_editor>
- <text name="static2">
- Rollen met deze vaardigheid
- </text>
- <text name="static3">
- Leden met deze vaardigheid
- </text>
- </panel>
-</panel>
diff --git a/indra/newview/skins/default/xui/nl/panel_login.xml b/indra/newview/skins/default/xui/nl/panel_login.xml
deleted file mode 100644
index bcc888061f..0000000000
--- a/indra/newview/skins/default/xui/nl/panel_login.xml
+++ /dev/null
@@ -1,41 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="panel_login">
- <panel.string name="create_account_url">
- http://join.secondlife.com/index.php?lang=nl-NL
- </panel.string>
- <panel.string name="forgot_password_url">
- http://secondlife.com/account/request.php?lang=nl-NL
- </panel.string>
- <panel name="login_widgets">
- <text name="first_name_text">
- Voornaam:
- </text>
- <line_editor name="first_name_edit" tool_tip="[SECOND_LIFE] Voornaam"/>
- <text name="last_name_text">
- Achternaam:
- </text>
- <line_editor name="last_name_edit" tool_tip="[SECOND_LIFE] Achternaam"/>
- <text name="password_text">
- Paswoord:
- </text>
- <button label="Inloggen" label_selected="Inloggen" name="connect_btn"/>
- <text name="start_location_text">
- Start locatie:
- </text>
- <combo_box name="start_location_combo">
- <combo_box.item label="Mijn Laatste Locatie" name="MyLastLocation"/>
- <combo_box.item label="Mijn Thuis" name="MyHome"/>
- <combo_box.item label="&lt;Tik regio naam&gt;" name="Typeregionname"/>
- </combo_box>
- <check_box label="Onthoud paswoord" name="remember_check"/>
- <text name="create_new_account_text">
- Maak een nieuwe account
- </text>
- <text name="forgot_password_text">
- Naam of paswoord vergeten?
- </text>
- <text name="channel_text">
- [VERSION]
- </text>
- </panel>
-</panel>
diff --git a/indra/newview/skins/default/xui/nl/panel_main_inventory.xml b/indra/newview/skins/default/xui/nl/panel_main_inventory.xml
deleted file mode 100644
index c533cc20c0..0000000000
--- a/indra/newview/skins/default/xui/nl/panel_main_inventory.xml
+++ /dev/null
@@ -1,64 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Dingen" name="main inventory panel">
- <panel.string name="Title">
- Dingen
- </panel.string>
- <filter_editor label="Filter" name="inventory search editor"/>
- <tab_container name="inventory filter tabs">
- <inventory_panel label="Alle Voorwerpen" name="All Items"/>
- <inventory_panel label="Recente Voorwerpen" name="Recent Items"/>
- </tab_container>
- <panel name="bottom_panel">
- <button name="options_gear_btn" tool_tip="Toon extra opties"/>
- <button name="add_btn" tool_tip="Voeg nieuw voorwerp toe"/>
- <dnd_button name="trash_btn" tool_tip="Remove selected item"/>
- </panel>
- <menu_bar name="Inventory Menu">
- <menu label="Bestand" name="File">
- <menu_item_call label="Open" name="Open"/>
- <menu label="Upload" name="upload">
- <menu_item_call label="Plaatje (L$[COST])..." name="Upload Image"/>
- <menu_item_call label="Geluid (L$[COST])..." name="Upload Sound"/>
- <menu_item_call label="Animatie (L$[COST])..." name="Upload Animation"/>
- <menu_item_call label="Bulk (L$[COST] per bestand)..." name="Bulk Upload"/>
- </menu>
- <menu_item_call label="Nieuw Venster" name="New Window"/>
- <menu_item_call label="Toon Filters" name="Show Filters"/>
- <menu_item_call label="Reset Filters" name="Reset Current"/>
- <menu_item_call label="Sluit Alle Mappen" name="Close All Folders"/>
- <menu_item_call label="Prullenbak Leegmaken" name="Empty Trash"/>
- <menu_item_call label="Leeg Verloren En Gevonden" name="Empty Lost And Found"/>
- </menu>
- <menu label="Maken" name="Create">
- <menu_item_call label="Nieuwe Map" name="New Folder"/>
- <menu_item_call label="Nieuw Script" name="New Script"/>
- <menu_item_call label="Nieuwe Notitie" name="New Note"/>
- <menu_item_call label="Nieuw Gebaar" name="New Gesture"/>
- <menu label="Nieuwe Kleding" name="New Clothes">
- <menu_item_call label="Nieuw Overhemd" name="New Shirt"/>
- <menu_item_call label="Nieuwe Broek" name="New Pants"/>
- <menu_item_call label="Nieuwe Schoenen" name="New Shoes"/>
- <menu_item_call label="Nieuwe Sokken" name="New Socks"/>
- <menu_item_call label="Nieuwe Jas" name="New Jacket"/>
- <menu_item_call label="Nieuwe Rok" name="New Skirt"/>
- <menu_item_call label="Nieuwe Handschoenen" name="New Gloves"/>
- <menu_item_call label="Nieuw Hemd" name="New Undershirt"/>
- <menu_item_call label="Nieuwe Onderbroek" name="New Underpants"/>
- <menu_item_call label="Nieuwe Alpha" name="New Alpha"/>
- <menu_item_call label="Nieuwe Tattoo" name="New Tattoo"/>
- </menu>
- <menu label="Nieuwe Lichaamsdelen" name="New Body Parts">
- <menu_item_call label="Nieuwe Vorm" name="New Shape"/>
- <menu_item_call label="Nieuwe Huid" name="New Skin"/>
- <menu_item_call label="Nieuw Haar" name="New Hair"/>
- <menu_item_call label="Nieuwe Ogen" name="New Eyes"/>
- </menu>
- </menu>
- <menu label="Sorteer" name="Sort">
- <menu_item_check label="Bij Naam" name="By Name"/>
- <menu_item_check label="Bij Datum" name="By Date"/>
- <menu_item_check label="Mappen Altijd Op Naam" name="Folders Always By Name"/>
- <menu_item_check label="Syteemmappen Naar Boven" name="System Folders To Top"/>
- </menu>
- </menu_bar>
-</panel>
diff --git a/indra/newview/skins/default/xui/nl/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/nl/panel_preferences_advanced.xml
deleted file mode 100644
index 6626c57472..0000000000
--- a/indra/newview/skins/default/xui/nl/panel_preferences_advanced.xml
+++ /dev/null
@@ -1,48 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<panel name="advanced">
- <panel.string name="resolution_format">
- [RES_X] x [RES_Y]
- </panel.string>
- <panel.string name="aspect_ratio_text">
- [NUM]:[DEN]
- </panel.string>
- <check_box label="Bubble chat" name="bubble_text_chat"/>
- <color_swatch name="background" tool_tip="Kies kleur voor bubble chat"/>
- <slider label="Opaciteit" name="bubble_chat_opacity"/>
- <text name="AspectRatioLabel1" tool_tip="breedte / hoogte">
- Beeldverhouding
- </text>
- <combo_box name="aspect_ratio" tool_tip="breedte / hoogte">
- <combo_box.item label="4:3 (Standaard beeldbuis)" name="item1"/>
- <combo_box.item label="5:4 (1280x1024 LCD)" name="item2"/>
- <combo_box.item label="8:5 (Breedbeeld)" name="item3"/>
- <combo_box.item label="16:9 (Breedbeeld)" name="item4"/>
- </combo_box>
- <check_box label="Automatisch detecteren" name="aspect_auto_detect"/>
- <text name="heading1">
- Camera:
- </text>
- <slider label="Kijkhoek" name="camera_fov"/>
- <slider label="Afstand" name="camera_offset_scale"/>
- <text name="heading2">
- Automatisch positionering voor:
- </text>
- <check_box label="Maken/Bewerken" name="edit_camera_movement" tool_tip="Gebruik automatische camera positionering bij ingaan en verlaten van Bewerk modus."/>
- <check_box label="Uiterlijk" name="appearance_camera_movement" tool_tip="Gebruik automatische camera positionering wanneer in bewerk modus"/>
- <text name="heading3">
- Avatars:
- </text>
- <check_box label="Toon mij in Muis Modus" name="first_person_avatar_visible"/>
- <check_box label="Pijltjestoetsen bewegen mij altijd" name="arrow_keys_move_avatar_check"/>
- <check_box label="Tik-tik-vasthouden om te rennen" name="tap_tap_hold_to_run"/>
- <check_box label="Beweeg avatar lippen tijdens het praten" name="enable_lip_sync"/>
- <check_box label="Toon script fouten" name="show_script_errors"/>
- <radio_group name="show_location">
- <radio_item label="In chat" name="0"/>
- <radio_item label="In een venster" name="1"/>
- </radio_group>
- <check_box label="Toggle modus voor microfoon wanneer ik de spreek toets indruk:" name="push_to_talk_toggle_check" tool_tip="Wanneer in toggle mode, drukt u éénmaal op de ontspanner toets om de microfoon in-of uitschakelen. Wanneer niet in toggle mode, kan de microfoon uitzendingen uw stem alleen tijdens de ontspanner wordt ingedrukt."/>
- <line_editor label="Push-to-Speak trigger" name="modifier_combo"/>
- <button label="Plaats Toets" name="set_voice_hotkey_button"/>
- <button label="Middelste Muis Knop" name="set_voice_middlemouse_button"/>
-</panel>
diff --git a/indra/newview/skins/default/xui/nl/panel_preferences_alerts.xml b/indra/newview/skins/default/xui/nl/panel_preferences_alerts.xml
deleted file mode 100644
index d3174a703d..0000000000
--- a/indra/newview/skins/default/xui/nl/panel_preferences_alerts.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Pop-ups" name="popups" title="Pop-ups">
- <text name="tell_me_label">
- Vertel mij:
- </text>
- <check_box label="Wanneer ik L$ spendeer of krijg" name="notify_money_change_checkbox"/>
- <check_box label="Wanneer mijn vrienden in- of uit-loggen" name="friends_online_notify_checkbox"/>
- <text name="show_label">
- Toon altijd deze waarschuwingen:
- </text>
- <text name="dont_show_label">
- Toon nooit deze waarschuwingen:
- </text>
-</panel>
diff --git a/indra/newview/skins/default/xui/nl/panel_preferences_chat.xml b/indra/newview/skins/default/xui/nl/panel_preferences_chat.xml
deleted file mode 100644
index 84f385c86b..0000000000
--- a/indra/newview/skins/default/xui/nl/panel_preferences_chat.xml
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Tekst chat" name="chat">
- <radio_group name="chat_font_size">
- <radio_item label="Klein" name="radio"/>
- <radio_item label="Middel" name="radio2"/>
- <radio_item label="Groot" name="radio3"/>
- </radio_group>
- <color_swatch label="U" name="user"/>
- <text name="text_box1">
- U
- </text>
- <color_swatch label="Anderen" name="agent"/>
- <text name="text_box2">
- Anderen
- </text>
- <color_swatch label="IM" name="im"/>
- <text name="text_box3">
- IM
- </text>
- <color_swatch label="Systeem" name="system"/>
- <text name="text_box4">
- Systeem
- </text>
- <color_swatch label="Fouten" name="script_error"/>
- <text name="text_box5">
- Fouten
- </text>
- <color_swatch label="Objecten" name="objects"/>
- <text name="text_box6">
- Objecten
- </text>
- <color_swatch label="Eigenaar" name="owner"/>
- <text name="text_box7">
- Eigenaar
- </text>
- <color_swatch label="URL&apos;s" name="links"/>
- <text name="text_box9">
- URL&apos;s
- </text>
- <check_box initial_value="true" label="Speel typeanimatie tijdens chat" name="play_typing_animation"/>
- <check_box label="Email mij IMs wanneer ik offline ben" name="send_im_to_email"/>
-</panel>
diff --git a/indra/newview/skins/default/xui/nl/panel_preferences_general.xml b/indra/newview/skins/default/xui/nl/panel_preferences_general.xml
deleted file mode 100644
index 7be570b27f..0000000000
--- a/indra/newview/skins/default/xui/nl/panel_preferences_general.xml
+++ /dev/null
@@ -1,90 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Algemeen" name="general_panel">
- <combo_box name="start_location_combo">
- <combo_box.item name="MyHome" tool_tip="Log standaard in op mijn thuislocatie." label="Mijn thuis"/>
- <combo_box.item name="MyLastLocation" tool_tip="Log standaard in op mijn laatste locatie." label="Mijn laatste locatie"/>
- </combo_box>
- <check_box label="Toon startlocatie op loginscherm" name="show_location_checkbox"/>
- <combo_box name="fade_out_combobox">
- <combo_box.item name="Never" label="Nooit"/>
- <combo_box.item name="Show Temporarily" label="Toon tijdelijk"/>
- <combo_box.item name="Always" label="Altijd"/>
- </combo_box>
- <check_box label="Kleine avatarnamen" name="small_avatar_names_checkbox"/>
- <check_box label="Verberg mijn naam op mijn scherm" name="show_my_name_checkbox"/>
- <text name="group_titles_textbox">
- Groepstitels:
- </text>
- <check_box label="Verberg alle groepstitels" name="show_all_title_checkbox"/>
- <check_box label="Verberg mijn groepstitel" name="show_my_title_checkbox"/>
- <color_swatch label="" name="effect_color_swatch" tool_tip="Klik om de kleurkiezer te openen"/>
- <text name="UI Size:">
- UI grootte:
- </text>
- <check_box label="Gebruik resolutie onafhankelijke schaal" name="ui_auto_scale"/>
- <spinner label="Afwezigheidtijdsduur:" name="afk_timeout_spinner"/>
- <check_box label="Waarschuwen wanneer L$ worden uitgegeven of ontvangen" name="notify_money_change_checkbox"/>
- <text name="maturity_desired_label">
- Inhoudscategorie:
- </text>
- <text name="maturity_desired_prompt">
- Ik wil toegang tot inhoud die is beoordeeld als:
- </text>
- <combo_box name="maturity_desired_combobox">
- <combo_box.item name="Desired_Adult" label="PG, Mature en Adult"/>
- <combo_box.item name="Desired_Mature" label="PG en Mature"/>
- <combo_box.item name="Desired_PG" label="PG"/>
- </combo_box>
- <text name="maturity_desired_textbox">
- PG
- </text>
- <text name="start_location_textbox">
- Startlocatie:
- </text>
- <text name="show_names_textbox">
- Toon namen:
- </text>
- <text name="effects_color_textbox">
- Kleur voor mijn effecten:
- </text>
- <text name="seconds_textbox">
- seconden
- </text>
- <text name="crash_report_textbox">
- Crash rapporten:
- </text>
- <text name="language_textbox">
- Taal:
- </text>
- <text name="language_textbox2">
- (Vereist herstart)
- </text>
- <string name="region_name_prompt">
- &lt; Type regionaam &gt;
- </string>
- <combo_box name="crash_behavior_combobox">
- <combo_box.item name="Askbeforesending" label="Vraag voor verzenden"/>
- <combo_box.item name="Alwayssend" label="Altijd verzenden"/>
- <combo_box.item name="Neversend" label="Nooit verzenden"/>
- </combo_box>
- <combo_box name="language_combobox">
- <combo_box.item name="System Default Language" label="Systeemstandaard"/>
- <combo_box.item name="English" label="Engels (English)"/>
- <combo_box.item name="Danish" label="Dansk (Deens) - Bèta"/>
- <combo_box.item name="Deutsch(German)" label="Deutsch (Duits) - Bèta"/>
- <combo_box.item name="Spanish" label="Español (Spaans) - Bèta"/>
- <combo_box.item name="French" label="Français (Frans) - Bèta"/>
- <combo_box.item name="Italian" label="Italiano (Italiaans) - Bèta"/>
- <combo_box.item name="Hungarian" label="Magyar (Hongaars) - Bèta"/>
- <combo_box.item name="Dutch" label="Nederlands - Bèta"/>
- <combo_box.item name="Polish" label="Polski (Pools) - Bèta"/>
- <combo_box.item name="Portugese" label="Português (Portugees) - Bèta"/>
- <combo_box.item name="Russian" label="РуÑÑкий (Russisch) - Bèta"/>
- <combo_box.item name="Turkish" label="Türkçe (Turks) - Bèta"/>
- <combo_box.item name="Ukrainian" label="УкраїнÑька (Oekraïens) - Bèta"/>
- <combo_box.item name="Chinese" label="中文 (简体) (Chinees) - Bèta"/>
- <combo_box.item name="(Japanese)" label="日本語 (Japans) - Bèta"/>
- <combo_box.item name="(Korean)" label="한국어 (Koreaans) - Bèta"/>
- </combo_box>
- <check_box label="Deel taal met objecten" name="language_is_public" tool_tip="Dit laat in-wereld objecten uw voorkeurstaal weten."/>
-</panel>
diff --git a/indra/newview/skins/default/xui/nl/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/nl/panel_preferences_graphics1.xml
deleted file mode 100644
index 8f4244e222..0000000000
--- a/indra/newview/skins/default/xui/nl/panel_preferences_graphics1.xml
+++ /dev/null
@@ -1,145 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Grafisch" name="Display panel">
- <button label="?" name="GraphicsPreferencesHelpButton"/>
- <check_box label="Voer Second Life uit in een venster" name="windowed mode"/>
- <text_editor name="FullScreenInfo" bottom="-56" height="40" width="480">
- Wanneer niet aangevinkt, zal de viewer in volledig-scherm modus getoond worden wanneer u inlogt.
- </text_editor>
- <text name="WindowSizeLabel">
- Venstergrootte:
- </text>
- <combo_box name="windowsize combo" left="115" >
- <combo_box.item name="640x480" label="640x480"/>
- <combo_box.item name="800x600" label="800x600"/>
- <combo_box.item name="720x480" label="720x480 (NTSC)"/>
- <combo_box.item name="768x576" label="768x576 (PAL)"/>
- <combo_box.item name="1024x768" label="1024x768"/>
- </combo_box>
- <text name="DisplayResLabel" width="100">
- Weergaveresolutie:
- </text>
- <combo_box left="115" name="fullscreen combo" />
- <text name="AspectRatioLabel1" tool_tip="breedte / hoogte" width="100">
- Beeldverhouding:
- </text>
- <combo_box name="aspect_ratio" tool_tip="breedte / hoogte" left="115" >
- <combo_box.item name="4:3(StandardCRT)" label="4:3 (Standaard beeldbuis)"/>
- <combo_box.item name="5:4(1280x1024LCD)" label="5:4 (1280x1024 LCD)"/>
- <combo_box.item name="8:5(Widescreen)" label="8:5 (Breedbeeld)"/>
- <combo_box.item name="16:9(Widescreen)" label="16:9 (Breedbeeld)"/>
- </combo_box>
- <check_box label="Verhouding automatisch detecteren" name="aspect_auto_detect" left="275" />
- <text name="HigherText">
- Kwaliteit en
- </text>
- <text name="QualityText">
- Prestatie:
- </text>
- <text name="FasterText">
- Sneller
- </text>
- <text name="ShadersPrefText">
- Laag
- </text>
- <text name="ShadersPrefText2">
- Middel
- </text>
- <text name="ShadersPrefText3">
- Hoog
- </text>
- <text name="ShadersPrefText4">
- Ultra
- </text>
- <text name="HigherText2">
- Hogere
- </text>
- <text name="QualityText2">
- Kwaliteit
- </text>
- <check_box label="Aangepast" name="CustomSettings"/>
- <panel name="CustomGraphics Panel">
- <text name="ShadersText">
- Shaders:
- </text>
- <check_box label="Bump mapping en glans" name="BumpShiny"/>
- <check_box label="Basis shaders" name="BasicShaders" tool_tip="Het uitschakelen van deze optie kan voorkomen dat sommige drivers voor grafische kaarten crashen."/>
- <check_box label="Atmosferische shaders" name="WindLightUseAtmosShaders"/>
- <check_box label="Waterreflecties" name="Reflections"/>
- <text name="ReflectionDetailText">
- Reflectiedetail:
- </text>
- <radio_group name="ReflectionDetailRadio">
- <radio_item name="0" label="Terrein en bomen" />
- <radio_item name="1" label="Alle statische objecten" />
- <radio_item name="2" label="Alle avatars en objecten" />
- <radio_item name="3" label="Alles" />
- </radio_group>
- <text name="AvatarRenderingText">
- Avatarweergave:
- </text>
- <check_box label="Avatar schimmen" name="AvatarImpostors"/>
- <check_box label="Hardware Skinning" name="AvatarVertexProgram"/>
- <check_box label="Avatar kleding" name="AvatarCloth"/>
- <text name="DrawDistanceMeterText1">
- m
- </text>
- <text name="DrawDistanceMeterText2">
- m
- </text>
- <slider label="Zichtbereik:" name="DrawDistance"/>
- <slider label="Max. aantal particles:" name="MaxParticleCount"/>
- <slider label="Nabewerkingskwaliteit:" name="RenderPostProcess"/>
- <text name="MeshDetailText">
- Maasdetail:
- </text>
- <slider label=" Objecten:" name="ObjectMeshDetail"/>
- <slider label=" Flexibele prims:" name="FlexibleMeshDetail"/>
- <slider label=" Bomen:" name="TreeMeshDetail"/>
- <slider label=" Avatars:" name="AvatarMeshDetail"/>
- <slider label=" Terrein:" name="TerrainMeshDetail"/>
- <slider label=" Lucht:" name="SkyMeshDetail"/>
- <text name="PostProcessText">
- Laag
- </text>
- <text name="ObjectMeshDetailText">
- Laag
- </text>
- <text name="FlexibleMeshDetailText">
- Laag
- </text>
- <text name="TreeMeshDetailText">
- Laag
- </text>
- <text name="AvatarMeshDetailText">
- Laag
- </text>
- <text name="TerrainMeshDetailText">
- Laag
- </text>
- <text name="SkyMeshDetailText">
- Laag
- </text>
- <text name="LightingDetailText">
- Lichtdetail:
- </text>
- <radio_group name="LightingDetailRadio">
- <radio_item name="SunMoon" label="Alleen zon en maan" />
- <radio_item name="LocalLights" label="Lokale lichten in de buurt" />
- </radio_group>
- <text name="TerrainDetailText">
- Terreindetail:
- </text>
- <radio_group name="TerrainDetailRadio">
- <radio_item name="0" label="Laag" />
- <radio_item name="2" label="Hoog" />
- </radio_group>
- </panel>
- <button label="Aanbevolen instellingen" name="Defaults"/>
- <button label="Hardware opties" label_selected="Hardware opties" name="GraphicsHardwareButton"/>
- <panel.string name="resolution_format">
- [RES_X] x [RES_Y]
- </panel.string>
- <panel.string name="aspect_ratio_text">
- [NUM]:[DEN]
- </panel.string>
-</panel>
diff --git a/indra/newview/skins/default/xui/nl/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/nl/panel_preferences_privacy.xml
deleted file mode 100644
index c2014bf0cb..0000000000
--- a/indra/newview/skins/default/xui/nl/panel_preferences_privacy.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Communicatie" name="im">
- <text name="text_box">
- Mijn online status:
- </text>
- <check_box left="140" label="Allen mijn vrienden en groepen kunnen zien wanneer ik online ben" name="online_visibility"/>
- <text name="text_box2">
- IM opties:
- </text>
- <string name="log_in_to_change">
- log in om te wijzigen
- </string>
- <check_box left="140" label="Stuur IM naar Email ([EMAIL])" name="send_im_to_email"/>
- <check_box left="140" label="Voeg IM toe in chatconsole" name="include_im_in_chat_console"/>
- <check_box left="140" label="Toon tijdstempels in IM" name="show_timestamps_check"/>
- <check_box left="140" label="Toon melding bij vriend online" name="friends_online_notify_checkbox"/>
- <text name="text_box3">
- Antwoord bij
-Niet Storen:
- </text>
- <text name="text_box4">
- Log opties:
- </text>
- <check_box label="Bewaar een log van IM op mijn computer" name="log_instant_messages"/>
- <check_box label="Toon tijdstempels in IM-log" name="log_instant_messages_timestamp"/>
- <check_box label="Toon het einde van de laatste IM conversatie" name="log_show_history"/>
- <check_box label="Bewaar een log van lokale chat op mijn computer" name="log_chat"/>
- <check_box label="Toon tijdstempels in lokale chatlog" name="log_chat_timestamp"/>
- <check_box label="Toon binnenkomende IM in lokale chatlog" name="log_chat_IM"/>
- <check_box label="Voeg datum toe aan tijdstempels" name="log_date_timestamp"/>
- <button label="Wijzig pad" label_selected="Wijzig pad" name="log_path_button"/>
-</panel>
diff --git a/indra/newview/skins/default/xui/nl/panel_preferences_setup.xml b/indra/newview/skins/default/xui/nl/panel_preferences_setup.xml
deleted file mode 100644
index f9f58befe8..0000000000
--- a/indra/newview/skins/default/xui/nl/panel_preferences_setup.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Invoer &amp; Camera" name="Input panel">
- <text name=" Mouselook Options:">
- Mouselook opties:
- </text>
- <text name=" Mouse Sensitivity:">
- Muis gevoeligheid:
- </text>
- <check_box label="Muisbeweging omkeren" name="invert_mouse"/>
- <text name=" Auto Fly Options:">
- Automatisch vliegen
-opties:
- </text>
- <check_box label="Vlieg/Land bij indrukken Page Up/Page Down" name="automatic_fly"/>
- <text name=" Camera Options:">
- Camera opties:
- </text>
- <text name="camera_fov_label">
- Camera Zichthoek
- </text>
- <text name="Camera Follow Distance:">
- Camera volgafstand:
- </text>
- <check_box label="Automatische camerabeweging bij bewerken" name="edit_camera_movement" tool_tip="Gebruik automatische camerapositionering bij het betreden en verlaten van de bewerken modus"/>
- <check_box label="Automatische camerabeweging bij uiterlijk bewerken" name="appearance_camera_movement" tool_tip="Gebruik automatische camerapositionering in de bewerken modus"/>
- <text name="text2">
- Avatar weergave opties:
- </text>
- <check_box label="Toon avatar in mouselook" name="first_person_avatar_visible"/>
- <button label="Joystick instellingen" name="joystick_setup_button"/>
-</panel>
diff --git a/indra/newview/skins/default/xui/nl/panel_preferences_sound.xml b/indra/newview/skins/default/xui/nl/panel_preferences_sound.xml
deleted file mode 100644
index 5ded015868..0000000000
--- a/indra/newview/skins/default/xui/nl/panel_preferences_sound.xml
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Geluid" name="Preference Media panel">
- <slider label="Hoofd volume" name="System Volume"/>
- <check_box initial_value="true" name="mute_when_minimized"/>
- <text name="mute_chb_label">Dempen indien geminimaliseerd</text>
- <slider label="Omliggend" name="Wind Volume"/>
- <slider label="Knoppen" name="UI Volume"/>
- <slider label="Media" name="Media Volume"/>
- <slider label="Geluids effecten" name="SFX Volume"/>
- <slider label="Streamen van muziek" name="Music Volume"/>
- <check_box label="Voice" name="enable_voice_check"/>
- <slider label="Voice" name="Voice Volume"/>
- <text name="Listen from">
- Luisteren vanuit:
- </text>
- <radio_group name="ear_location">
- <radio_item label="Camera positie" name="0"/>
- <radio_item label="Avatar positie" name="1"/>
- </radio_group>
- <button label="Input/Output Apparaten" name="device_settings_btn"/>
- <panel label="Apparaat Instellingen" name="device_settings_panel">
- <panel.string name="default_text">
- Standaard
- </panel.string>
- <text name="Input">
- Input
- </text>
- <text name="My volume label">
- Mijn volume:
- </text>
- <slider_bar initial_value="1.0" name="mic_volume_slider" tool_tip="Verander de volume door gebruik te nemen van deze schuifknop"/>
- <text name="wait_text">
- Even geduld
- </text>
- <text name="Output">
- Output
- </text>
- </panel>
-</panel>
diff --git a/indra/newview/skins/default/xui/nl/panel_region_covenant.xml b/indra/newview/skins/default/xui/nl/panel_region_covenant.xml
deleted file mode 100644
index adfc62dd22..0000000000
--- a/indra/newview/skins/default/xui/nl/panel_region_covenant.xml
+++ /dev/null
@@ -1,84 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Convenant" name="Covenant">
- <text name="estate_section_lbl">
- Estate:
- </text>
- <text name="estate_name_lbl">
- Naam:
- </text>
- <text name="estate_name_text">
- mainland
- </text>
- <text name="estate_owner_lbl">
- Eigenaar:
- </text>
- <text name="estate_owner_text">
- (geen)
- </text>
- <text name="estate_cov_lbl">
- Convenant:
- </text>
- <text name="covenant_timestamp_text">
- Laatst gewijzigd Wed Dec 31 16:00:00 1969
- </text>
- <button label="?" name="covenant_help"/>
- <text_editor name="covenant_editor" bottom="-247" height="162">
- Er is geen convenant voor deze estate.
- </text_editor>
- <button label="Opnieuw instellen" name="reset_covenant" right="460" width="110"/>
- <text name="covenant_help_text" bottom="-25">
- Wijzigingen in het convenant zullen in alle percelen van het estate
- zichtbaar zijn.
- </text>
- <text name="covenant_instructions" bottom_delta="-36" >
- Sleep en deponeer een notitiekaart om het convenant voor deze
- estate te wijzigen.
- </text>
- <text name="region_section_lbl" bottom_delta="-36" >
- Regio:
- </text>
- <text name="region_name_lbl">
- Naam:
- </text>
- <text name="region_name_text">
- leyla
- </text>
- <text name="region_landtype_lbl">
- Type:
- </text>
- <text name="region_landtype_text">
- Mainland / Homestead
- </text>
- <text name="region_maturity_lbl">
- Inhoudscategorie:
- </text>
- <text name="region_maturity_text">
- Adult
- </text>
- <text name="resellable_lbl">
- Doorverkopen:
- </text>
- <text name="resellable_clause">
- Land in deze regio mag niet worden doorverkocht.
- </text>
- <text name="changeable_lbl">
- Opsplitsen:
- </text>
- <text name="changeable_clause">
- Land in deze regio mag niet worden samengevoegd/opgesplitst.
- </text>
- <string name="can_resell">
- Aangekocht land in deze regio mag worden doorverkocht.
- </string>
- <string name="can_not_resell">
- Aangekocht land in deze regio mag niet worden doorverkocht.
- </string>
- <string name="can_change">
- Aangekocht land in deze regio mag worden gecombineerd of
-opgedeeld.
- </string>
- <string name="can_not_change">
- Aangekocht land in deze regio mag niet worden gecombineerd
-of opgedeeld.
- </string>
-</panel>
diff --git a/indra/newview/skins/default/xui/nl/panel_region_debug.xml b/indra/newview/skins/default/xui/nl/panel_region_debug.xml
deleted file mode 100644
index 9fad8e478a..0000000000
--- a/indra/newview/skins/default/xui/nl/panel_region_debug.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Debug" name="Debug">
- <text name="region_text_lbl">
- Regio:
- </text>
- <text name="region_text">
- onbekend
- </text>
- <check_box label="Schakel scripts uit" name="disable_scripts_check" tool_tip="Schakel alle scripts in deze regio uit"/>
- <button label="?" name="disable_scripts_help"/>
- <check_box label="Schakel botsingen uit" name="disable_collisions_check" tool_tip="Schakel alle niet-avatar botsingen in deze regio uit"/>
- <button label="?" name="disable_collisions_help"/>
- <check_box label="Fysiek uitschakelen" name="disable_physics_check" tool_tip="Alle fysiek in deze regio uitschakelen"/>
- <button label="?" name="disable_physics_help"/>
- <button label="Toepassen" name="apply_btn"/>
- <text name="objret_text_lbl">
- Object retourneren
- </text>
- <text name="resident_text_lbl">
- Inwoner:
- </text>
- <line_editor name="target_avatar_name">
- (none)
- </line_editor>
- <button label="Kies..." name="choose_avatar_btn"/>
- <text name="options_text_lbl">
- Opties:
- </text>
- <check_box label="Retourneer alleen objecten die scripts bevatten." name="return_scripts" tool_tip="Retourneer alleen objecten met scripts."/>
- <check_box label="Retourneer alleen die objecten op het land van iemand anders" name="return_other_land" tool_tip="Retourneer alleen objecten die zich op land bevinden dat aan iemand anders toebehoort"/>
- <check_box label="Retourneer objecten in alle regio&apos;s van dit estate" name="return_estate_wide" tool_tip="Retourneer objecten in alle regio&apos;s van dit estate"/>
- <button label="Retourneren" name="return_btn"/>
- <button label="Toon top botsingen..." name="top_colliders_btn" tool_tip="Lijst met objecten die de meeste mogelijke botsingen ondergaan"/>
- <button label="?" name="top_colliders_help"/>
- <button label="Toon top scripts..." name="top_scripts_btn" tool_tip="Lijst met objecten die de meeste tijd besteden met het uitvoeren van scripts"/>
- <button label="?" name="top_scripts_help"/>
- <button label="Herstart regio" name="restart_btn" tool_tip="Geef een 2 minuten afteltijd en herstart de regio."/>
- <button label="?" name="restart_help"/>
- <button label="Vertraag herstart" name="cancel_restart_btn" tool_tip="Vertraag herstart met een uur"/>
-</panel>
diff --git a/indra/newview/skins/default/xui/nl/panel_region_estate.xml b/indra/newview/skins/default/xui/nl/panel_region_estate.xml
deleted file mode 100644
index 08b68c8d30..0000000000
--- a/indra/newview/skins/default/xui/nl/panel_region_estate.xml
+++ /dev/null
@@ -1,70 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Estate" name="Estate">
- <text name="estate_help_text">
- Wijzigingen van instellingen op dit tabblad
-zullen alle regio&apos;s in de estate beïnvloeden.
- </text>
- <text name="estate_text">
- Estate:
- </text>
- <text name="estate_name">
- (onbekend)
- </text>
- <text name="owner_text">
- Eigenaar:
- </text>
- <text name="estate_owner">
- (onbekend)
- </text>
- <check_box label="Gebruik globale tijd" name="use_global_time_check"/>
- <button label="?" name="use_global_time_help"/>
- <check_box label="Vaste zon" name="fixed_sun_check"/>
- <button label="?" name="fixed_sun_help"/>
- <slider label="Fase" name="sun_hour_slider"/>
- <check_box label="Publieke toegang toestaan" name="externally_visible_check"/>
- <button label="?" name="externally_visible_help"/>
- <text name="Only Allow">
- Beperk toegang tot:
- </text>
- <check_box label="Inwoners met betalingsinformatie opgeslagen" name="limit_payment" tool_tip="Verban ongeïdentificeerde inwoners."/>
- <check_box label="Leeftijdgeverifieerde volwassenen" name="limit_age_verified" tool_tip="Verban inwoners die hun leeftijd niet geverifieerd hebben. Zie support.secondlife.com voor meer informatie." bottom_delta="-30"/>
- <check_box label="Voice chat toestaan" name="voice_chat_check"/>
- <button label="?" name="voice_chat_help"/>
- <check_box label="Directe teleport toestaan" name="allow_direct_teleport"/>
- <button label="?" name="allow_direct_teleport_help"/>
- <text name="abuse_email_text" bottom_delta="-23">
- Misbruik e-mail adres:
- </text>
- <line_editor bottom_delta="-14" name="abuse_email_address" />
- <string name="email_unsupported">
- Optie niet ondersteund
- </string>
- <button label="?" name="abuse_email_address_help"/>
- <button label="Toepassen" name="apply_btn" bottom_delta="-22"/>
- <button label="Gebruiker verwijderen van estate..." name="kick_user_from_estate_btn"/>
- <button label="Zend bericht naar estate..." name="message_estate_btn"/>
- <text name="estate_manager_label">
- Estate beheerders:
- </text>
- <button label="?" name="estate_manager_help"/>
- <button label="Verwijderen..." name="remove_estate_manager_btn"/>
- <button label="Toevoegen..." name="add_estate_manager_btn"/>
- <text name="allow_resident_label">
- Toegestane inwoners:
- </text>
- <button label="?" name="allow_resident_help"/>
- <button label="Verwijderen..." name="remove_allowed_avatar_btn"/>
- <button label="Toevoegen..." name="add_allowed_avatar_btn"/>
- <text name="allow_group_label">
- Toegestane groepen
- </text>
- <button label="?" name="allow_group_help"/>
- <button label="Verwijderen..." name="remove_allowed_group_btn"/>
- <button label="Toevoegen..." name="add_allowed_group_btn"/>
- <text name="ban_resident_label">
- Verbannen inwoners:
- </text>
- <button label="?" name="ban_resident_help"/>
- <button label="Verwijderen..." name="remove_banned_avatar_btn"/>
- <button label="Toevoegen..." name="add_banned_avatar_btn"/>
-</panel>
diff --git a/indra/newview/skins/default/xui/nl/panel_region_general.xml b/indra/newview/skins/default/xui/nl/panel_region_general.xml
deleted file mode 100644
index 74480ed0a4..0000000000
--- a/indra/newview/skins/default/xui/nl/panel_region_general.xml
+++ /dev/null
@@ -1,53 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Regio" name="General">
- <text name="region_text_lbl">
- Regio:
- </text>
- <text name="region_text">
- onbekend
- </text>
- <text name="version_channel_text_lbl">
- Versie:
- </text>
- <text name="version_channel_text">
- onbekend
- </text>
- <text name="region_type_lbl">
- Type:
- </text>
- <text name="region_type">
- onbekend
- </text>
- <check_box label="Blokkeer terreinbewerking" name="block_terraform_check"/>
- <button label="?" name="terraform_help"/>
- <check_box label="Blokkeer vliegen" name="block_fly_check"/>
- <button label="?" name="fly_help"/>
- <check_box label="Letsel toestaan" name="allow_damage_check"/>
- <button label="?" name="damage_help"/>
- <check_box label="Duwen Uitschakelen" name="restrict_pushobject"/>
- <button label="?" name="restrict_pushobject_help"/>
- <check_box label="Landverkoop toestaan" name="allow_land_resell_check"/>
- <button label="?" name="land_resell_help"/>
- <check_box label="Samenvoegen/opsplitsen land toestaan" name="allow_parcel_changes_check"/>
- <button label="?" name="parcel_changes_help" left="240"/>
- <check_box label="Blokkeer zichtbaarheid land in zoeken" name="block_parcel_search_check" tool_tip="Laat mensen deze regio en zijn percelen in zoekresultaten zien"/>
- <button label="?" name="parcel_search_help" left="240"/>
- <spinner label="Agent limiet" name="agent_limit_spin"/>
- <button label="?" name="agent_limit_help"/>
- <spinner label="Object bonus" name="object_bonus_spin"/>
- <button label="?" name="object_bonus_help"/>
- <text label="Volwassenheid" name="access_text">
- Inhoudscategorie:
- </text>
- <combo_box label="Mature" name="access_combo">
- <combo_box.item label="Adult" name="Adult"/>
- <combo_box.item label="Mature" name="Mature"/>
- <combo_box.item label="PG" name="PG"/>
- </combo_box>
- <button label="?" name="access_help"/>
- <button label="Toepassen" name="apply_btn"/>
- <button label="Teleport één gebruiker naar thuislocatie…" name="kick_btn"/>
- <button label="Teleport alle gebruikers naar thuislocatie…" name="kick_all_btn"/>
- <button label="Zend bericht naar regio…" name="im_btn"/>
- <button label="Beheer telehub…" name="manage_telehub_btn"/>
-</panel>
diff --git a/indra/newview/skins/default/xui/nl/panel_region_terrain.xml b/indra/newview/skins/default/xui/nl/panel_region_terrain.xml
deleted file mode 100644
index a79bcc0eb5..0000000000
--- a/indra/newview/skins/default/xui/nl/panel_region_terrain.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Terrein" name="Terrain">
- <text name="region_text_lbl">
- Regio:
- </text>
- <text name="region_text">
- onbekend
- </text>
- <spinner label="Waterhoogte" name="water_height_spin"/>
- <button label="?" name="water_height_help"/>
- <spinner label="Terrein verhooglimiet" name="terrain_raise_spin"/>
- <button label="?" name="terrain_raise_help"/>
- <spinner label="Terrein verlaaglimiet" name="terrain_lower_spin"/>
- <button label="?" name="terrain_lower_help"/>
- <check_box label="Gebruik estate zon" name="use_estate_sun_check"/>
- <button label="?" name="use_estate_sun_help"/>
- <check_box label="Vaste zon" name="fixed_sun_check"/>
- <button label="?" name="fixed_sun_help"/>
- <slider label="Fase" name="sun_hour_slider"/>
- <button label="Toepassen" name="apply_btn"/>
- <button label="Download RAW terrein..." name="download_raw_btn" tool_tip="Alleen beschikbaar voor estate-eigenaren, niet beheerders"/>
- <button label="?" name="download_raw_help"/>
- <button label="Upload RAW terrein..." name="upload_raw_btn" tool_tip="Alleen beschikbaar voor estate-eigenaren, niet beheerders"/>
- <button label="?" name="upload_raw_help"/>
- <button label="Bake terrein" name="bake_terrain_btn" tool_tip="Huidig terrein instellen als middelpunt voor verhoog/verlaag limieten"/>
- <button label="?" name="bake_terrain_help"/>
-</panel>
diff --git a/indra/newview/skins/default/xui/nl/panel_region_texture.xml b/indra/newview/skins/default/xui/nl/panel_region_texture.xml
deleted file mode 100644
index ff10e20b7c..0000000000
--- a/indra/newview/skins/default/xui/nl/panel_region_texture.xml
+++ /dev/null
@@ -1,57 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Grond texturen" name="Textures">
- <text name="region_text_lbl">
- Regio:
- </text>
- <text name="region_text">
- onbekend
- </text>
- <text name="detail_texture_text">
- Terreintexturen (vereist 512x512, 24 bit .tga bestanden)
- </text>
- <text name="height_text_lbl">
- 1 (Laag)
- </text>
- <text name="height_text_lbl2">
- 2
- </text>
- <text name="height_text_lbl3">
- 3
- </text>
- <text name="height_text_lbl4">
- 4 (Hoog)
- </text>
- <text name="height_text_lbl5">
- Textuur hoogtebereiken
- </text>
- <text name="height_text_lbl6">
- Zuidwest
- </text>
- <text name="height_text_lbl7">
- Noordwest
- </text>
- <text name="height_text_lbl8">
- Zuidoost
- </text>
- <text name="height_text_lbl9">
- Noordoost
- </text>
- <spinner label="Laag" name="height_start_spin_0"/>
- <spinner label="Laag" name="height_start_spin_1"/>
- <spinner label="Laag" name="height_start_spin_2"/>
- <spinner label="Laag" name="height_start_spin_3"/>
- <spinner label="Hoog" name="height_range_spin_0"/>
- <spinner label="Hoog" name="height_range_spin_1"/>
- <spinner label="Hoog" name="height_range_spin_2"/>
- <spinner label="Hoog" name="height_range_spin_3"/>
- <text name="height_text_lbl10">
- Deze waardes vertegenwoordigen het mengbereik voor bovenstaande texturen.
- </text>
- <text name="height_text_lbl11">
- Gemeten in meters, is de LOW waarde de MAXIMUM hoogte van textuur #1,
- </text>
- <text name="height_text_lbl12">
- en de HIGH waarde is de MINIMUM hoogte van textuur #4.
- </text>
- <button label="Toepassen" name="apply_btn"/>
-</panel>
diff --git a/indra/newview/skins/default/xui/nl/panel_scrolling_param.xml b/indra/newview/skins/default/xui/nl/panel_scrolling_param.xml
deleted file mode 100644
index 8487ff999a..0000000000
--- a/indra/newview/skins/default/xui/nl/panel_scrolling_param.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="LLScrollingPanelParam">
- <text name="Loading...">
- Laden...
- </text>
- <text name="Loading...2">
- Laden...
- </text>
- <slider label="[DESC]" name="param slider"/>
-</panel>
diff --git a/indra/newview/skins/default/xui/nl/panel_status_bar.xml b/indra/newview/skins/default/xui/nl/panel_status_bar.xml
deleted file mode 100644
index 1d68d25f66..0000000000
--- a/indra/newview/skins/default/xui/nl/panel_status_bar.xml
+++ /dev/null
@@ -1,38 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="status">
- <text name="ParcelNameText" tool_tip="Naam van het landperceel waar u staat. Klik voor &apos;Over land&apos;.">
- Hier komt de naam van het perceel
- </text>
- <text name="BalanceText" tool_tip="Account saldo">
- Laden...
- </text>
- <button label="" label_selected="" name="buycurrency" tool_tip="Koop valuta"/>
- <text name="TimeText" tool_tip="Huidige tijd (Pacifisch)">
- -3
- </text>
- <string name="StatBarDaysOfWeek">
- Zondag:Maandag:Dinsdag:Woensdag:Donderdag:Vrijdag:Zaterdag
- </string>
- <string name="StatBarMonthsOfYear">
- Januari:Februari:Maart:April:Mei:Juni:Juli:Augustus:September:Oktober:November:December
- </string>
- <button label="" label_selected="" name="scriptout" tool_tip="Script waarschuwingen en fouten"/>
- <button label="" label_selected="" name="health" tool_tip="Letsel"/>
- <text name="HealthText" tool_tip="Letsel">
- 1
- </text>
- <button label="" label_selected="" name="no_fly" tool_tip="Vliegen niet toegestaan"/>
- <button label="" label_selected="" name="no_build" tool_tip="Bouwen/rezzen niet toegestaan"/>
- <button label="" label_selected="" name="no_scripts" tool_tip="Scripts niet toegestaan"/>
- <button label="" label_selected="" name="restrictpush" tool_tip="Niet duwen"/>
- <button label="" label_selected="" name="status_no_voice" tool_tip="Voice is niet beschikbaar hier"/>
- <button label="" label_selected="" name="buyland" tool_tip="Koop dit perceel"/>
- <line_editor label="Zoeken" name="search_editor" tool_tip="Doorzoek [SECOND_LIFE]"/>
- <button label="" label_selected="" name="search_btn" tool_tip="Doorzoek [SECOND_LIFE]"/>
- <string name="packet_loss_tooltip">
- Pakketten verlies
- </string>
- <string name="bandwidth_tooltip">
- Bandbreedte
- </string>
-</panel>
diff --git a/indra/newview/skins/default/xui/nl/panel_world_map.xml b/indra/newview/skins/default/xui/nl/panel_world_map.xml
deleted file mode 100644
index d9a0b66fbc..0000000000
--- a/indra/newview/skins/default/xui/nl/panel_world_map.xml
+++ /dev/null
@@ -1,57 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="world_map">
- <panel.string name="Loading">
- Laden...
- </panel.string>
- <panel.string name="InvalidLocation">
- Ongeldige Locatie
- </panel.string>
- <panel.string name="world_map_north">
- N
- </panel.string>
- <panel.string name="world_map_east">
- O
- </panel.string>
- <panel.string name="world_map_west">
- W
- </panel.string>
- <panel.string name="world_map_south">
- Z
- </panel.string>
- <panel.string name="world_map_southeast">
- ZO
- </panel.string>
- <panel.string name="world_map_northeast">
- NO
- </panel.string>
- <panel.string name="world_map_southwest">
- ZW
- </panel.string>
- <panel.string name="world_map_northwest">
- NW
- </panel.string>
- <text label="N" name="floater_map_north" text="N">
- N
- </text>
- <text label="O" name="floater_map_east" text="O">
- O
- </text>
- <text label="W" name="floater_map_west" text="W">
- W
- </text>
- <text label="Z" name="floater_map_south" text="Z">
- Z
- </text>
- <text label="ZO" name="floater_map_southeast" text="ZO">
- ZO
- </text>
- <text label="NO" name="floater_map_northeast" text="NO">
- NO
- </text>
- <text label="ZW" name="floater_map_southwest" text="ZW">
- ZW
- </text>
- <text label="NW" name="floater_map_northwest" text="NW">
- NW
- </text>
-</panel>
diff --git a/indra/newview/skins/default/xui/nl/role_actions.xml b/indra/newview/skins/default/xui/nl/role_actions.xml
deleted file mode 100644
index 1f0a6e4235..0000000000
--- a/indra/newview/skins/default/xui/nl/role_actions.xml
+++ /dev/null
@@ -1,76 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<role_actions>
- <action_set description="Deze Mogelijkheden regelen het toevoegen en verwijderen van Groepsleden, en om aan te geven dat nieuwe Leden lid kunnen worden zonder uitnodiging." name="Membership">
- <action description="Personen uitnodigen voor deze Groep" longdescription="Personen uitnodigen voor deze Groep door de 'Uitnodigen Nieuwe Leden...' knop in de leden &amp; Rollen tab &gt; Leden sub-tab." name="member invite"/>
- <action description="Leden uit deze Groep zetten" longdescription="Leden uit deze Groep zetten door de 'Uit Groep Zetten' knop in de leden tab &amp; Rollen tab &gt; Leden sub-tab. Een Eigenaar kan iedereen uit de groep zetten behalve een andere Eigenaar. Als je geen Eigenaar bent, kan een Lid worden uitgezet als, en alleen als, het Lid deel uitmaakt van de Iedereen Rol, en NIET van andere Rollen. Om Leden uit Rollen te verwijderen, moet je de 'Leden uit Rollen Verwijderen' mogelijkheid hebben." name="member eject"/>
- <action description="Selecteer 'Vrije Toegang' en wijzig 'Contibutie Bijdrage'" longdescription="Selecteer 'Vrije Toegang' zodat nieuwe Leden lid kunnen worden zonder uitnodiging, en wijzig 'Contributie Bijdrage' in de Groep Voorkeuren sectie van de Algemene tab." name="member options"/>
- </action_set>
- <action_set description="Deze Mogelijkheden regelen het toevoegen, verwijderen, en wijzigen van Groepsrollen, toevoegen en verwijderen van Leden in Rollen, en toewijzen van Mogelijkheden aan Rollen." name="Roles">
- <action description="Creëren nieuwe Rollen" longdescription="Creëren nieuwe Rollen in de Leden &amp; Rollen tab &gt; Rollen sub-tab." name="role create"/>
- <action description="Verwijderen Rollen" longdescription="Verwijderen Rollen in de Leden &amp; Rollen tab &gt; Rollen sub-tab." name="role delete"/>
- <action description="Wijzigen Rol-naam, titel, beschrijving, en of de Rol leden publiekelijk zichtbaar zijn" longdescription="Wijzigen Rol-naam, titel, beschrijving, en of de Rol leden publiekelijk zichtbaar zijn. Dit kan worden gedaan onderaan de de Leden &amp; Rollen tab &gt; Rollen sub-tab na de selectie van een rol." name="role properties"/>
- <action description="Toewijzen Leden aan Toewijzers Rollen" longdescription="Toewijzen Leden aan Rollen in de Toegewezen Rollen sectie van de Leden &amp; Rol tab &gt; Leden sub-tab. Een Lid met deze Mogelijkheid kan alleen Leden toevoegen aan een Rol waartoe men zelf al behoort." name="role assign member limited"/>
- <action description="Toewijzen Leden aan Alle Rollen" longdescription="Toewijzen van Leden aan Alle Rollen in the Toegewezen Rollen sectie van de Leden &amp; Rollen tab &gt; Leden sub-tab. *WAARSCHUWING* Ieder Lid in een Rol met deze Mogelijkheid kan zichzelf--en ieder ander niet-Eigenaar Lid--toewijzen aan rollen met meer rechten dan zijzelf op dat moment hebben, hierdoor ontstaat de mogelijkheid om zichzelf bijna-Eigenaar rechten toewijzen. Wees er zeker van en controleer voordat deze Mogelijkheid wordt toegekend." name="role assign member"/>
- <action description="Verwijderen Leden uit Rollen" longdescription="Verwijderen Leden uit Rollen in the Toegewezen Rollen sectie van de Leden &amp; Rollen tab &gt; Leden sub-tab. Eigenaars kunnen niet worcen verwijderd." name="role remove member"/>
- <action description="Toewijzen en Verwijderen Mogelijkheden in Rollen" longdescription="Toewijzen en Verwijderen Mogelijkheden in Rollen in de Toegestane Mogelijkheden van de Leden &amp; Rollen tab &gt; Leden sub-tab. *WAARSCHUWING* Ieder Lid in een Rol met deze Mogelijkheid kan kan zichzelf--en ieder ander niet-Eigenaar Lid--toewijzen aan rollen met meer rechten dan zijzelf op dat moment hebben, hierdoor ontstaat de mogelijkheid om zichzelf bijna-Eigenaar rechten toewijzen. Wees er zeker van en controleer voordat deze Mogelijkheid wordt toegekend." name="role change actions"/>
- </action_set>
- <action_set description="Deze Mogelijkheden regelen het wijzigen van de Groepsidentiteit, zoals het veranderen van publieke zichtbaarheid, charter en insigne." name="Group Identity">
- <action description="Wijzigen Charter, Insigne, en 'Toon in zoeken'" longdescription="Wijzigen Charter, Insigne, en 'Toon in zoeken'. Dit kan worden gedaan in de Algemeen tab." name="group change identity"/>
- </action_set>
- <action_set description="Deze Mogelijkheden regelen het overdragen, wijzigen, en verkopen van land dat in bezit is van deze groep. Om naar het Over Land venster te gaan, rechts-klik de grond selecteer 'Over Land...', of klik op de perceel info in de menubalk." name="Parcel Management">
- <action description="Land overdragen en land kopen voor groep" longdescription="Land overdragen en land kopen voor groep. Dit kan worden gedaan in Over Land &gt; Algemeen tab." name="land deed"/>
- <action description="Land overdragen aan Govenor Linden" longdescription="Land overdragen aan Govenor Linden. *WAARSCHUWING* Ieder Lid in een Rol met deze Mogelijkheid kan land in eigendom van de groep laten vervallen in Over Land &gt; Algemeen tab, teruggeven in Linden eigendom zonder verkoop! Wees er zeker van en controleer voordat deze Mogelijkheid wordt toegekend." name="land release"/>
- <action description="Activeer land te koop info" longdescription="Activeer land te koop info. *WAARSCHUWING* Ieder Lid in een Rol met deze Mogelijkheid kan land in eigendom van de groep verkopen in Over Land &gt; Algemeen tab als ze dat willen! Wees er zeker van en controleer voordat deze Mogelijkheid wordt toegekend." name="land set sale info"/>
- <action description="Opdelen en samenvoegen van percelen" longdescription="Opdelen en samenvoegen van percelen. Dit kan worden gedaan door rechts klikken op de grond, 'Terrein Bewerken, en de muis te slepen naar het land om een selectie te maken. Om te verdelen, selecteer wat je wil splitsen en klik 'Opdelen...'. Om samen te voegen, selecteer twee of meer aaneengesloten percelen en klik 'Samenvoegen...'." name="land divide join"/>
- </action_set>
- <action_set description="Deze Mogelijkheden regelen het veranderen van de perceelnaam en publicatie instelling, zichtbaarheid in 'Tonen in zoeken', en landingspunt &amp; TP routering." name="Parcel Identity">
- <action description="Selecteer 'Tonen in zoeken' en instellen categorie" longdescription="Selecteer 'Tonen in zoeken' en instellen van de categorie voor een perceel in Over Land &gt; Opties tab." name="land find places"/>
- <action description="Veranderen perceel naam, omschrijving, en 'Tonen in zoeken' instellingen" longdescription="Veranderen perceel naam, omschrijving en 'Tonen in zoeken' instellingen. Dit kan worden gedaan in Overland &gt; Opties tab." name="land change identity"/>
- <action description="Instellen landingsplaats en instellen teleport routering" longdescription="Op een perceel in groepseigendom, Leden in een Rol met die mogelijkheid kunnen een landingsplaats instellen om te bepalen waar inkomende teleports aankomen, en ook een teleport routering instelling voor meer controle. Dit kan worden gedaan in About Land &gt; Opties tab." name="land set landing point"/>
- </action_set>
- <action_set description="Deze Mogelijkheden regelen het aanpassen van perceel opties, zoals 'Maak Objecten', 'Bewerken Terrein', en muziek &amp; media instellingen." name="Parcel Settings">
- <action description="Veranderen muziek &amp; media instellingen" longdescription="Veranderen streaming muziek en film instellingen in Over Land&gt; Media tab." name="land change media"/>
- <action description="Instellen 'Bewerken Terrein'" longdescription="Instellen 'Bewerken Terrein'. *WAARSCHUWING* Over Land &gt; Opties tab &gt; Bewerken Terrein staat toe dat iedereen de vorm van het terrein kan aanpassen, en Linden planten kan plaatsen en verplaatsen. Wees er zeker van en controleer voordat deze Mogelijkheid wordt toegekend. Bewerken terrein kan worden aangezet in Over Land&gt; Opties tab." name="land edit"/>
- <action description="Instellen diversen Over Land &gt; Optie instellingen" longdescription="Instellen 'Veilig (geen letsel)', 'Vliegen' and andere Inwoners toestaan om: 'Objecten te maken', 'Terrein te bewerken', en 'Scripts uit te voeren' op land in groepseigendom in Over Land &gt; Opties tab." name="land options"/>
- </action_set>
- <action_set description="Deze Mogelijkheden regelend de toestemming voor leden om beperkingen te omzeilen op percelen in groepseigendom." name="Parcel Powers">
- <action description="'Bewerken Terrein' altijd toestaan" longdescription="Leden in een Rol met deze Mogelijkheid kunnen terrein bewerken op een perceel in groepseigendom, zelfs als de optie uitstaat in Over Land &gt; Opties tab." name="land allow edit land"/>
- <action description="'Vliegen' altijd toestaan" longdescription="Leden in een Rol met deze Mogelijkheid kunnen vliegen op een perceel in groepseigendom, zelfs als de optie uitstaat in Over Land &gt; Opties tab." name="land allow fly"/>
- <action description="'Maak Objecten' altijd toestaan" longdescription="Leden in een Rol met deze Mogelijkheid kunnen objecten maken op een perceel in groepseigendom, zelfs als de optie uitstaat in Over Land &gt; Opties tab." name="land allow create"/>
- <action description="'Maak Landmarkering' altijd toestaan" longdescription="Leden in een Rol met deze Mogelijkheid kunnen een landmarkering maken op een perceel in groepseigendom, zelfs als de optie uitstaat in Over Land &gt; Opties tab." name="land allow landmark"/>
- <action description="Toestaan 'Thuis hier Instellen' op land in groepseigendom" longdescription="Leden in een Rol met deze Mogelijkheid kunnen gebruik maken van Wereld menu &gt; Thuis hier Instellen op een perceel afgestaan aan deze groep." name="land allow set home"/>
- </action_set>
- <action_set description="Deze Mogelijkheden regelen het toestaan of beperken van toegang van percelen in groepseigendom, inclusief het bevriezen en verbannen van Inwoners." name="Parcel Access">
- <action description="Beheren perceel Toegang lijsten" longdescription="Beheren perceel Toegang lijsten in Over Land &gt; Toegang tab." name="land manage allowed"/>
- <action description="Beheren perceel Verbannen lijst" longdescription="Beheren perceel Verbannen lijst in Over Land &gt; Verbannen tab." name="land manage banned"/>
- <action description="Veranderen perceel 'Verkoop toegangspassen...' instellingen" longdescription="Verandere perceel 'Verkoop toegangspassen...'instellingen" name="land manage passes"/>
- <action description="Uitwerpen en bevriezen Inwoners op percelen" longdescription="Leden in een Rol met deze mogelijkheid kunnen een onwelkome Inwoners aanpakken op een perceel in groepseigendom door een rechter-klik op deze inwoner &gt; en 'Uitwerpen...'of 'Bevriezen...'te selecteren." name="land admin"/>
- </action_set>
- <action_set description="Deze Mogelijkheden regelen de toestemming voor leden om objecten te retourneren en Linden planten te plaatsen en te verplaatsen. Dit is nuttig voor Leden om rommel op te ruimen en landschappen te maken, echter het moet ook met omzichtigheid worden gebruikt, omdat er geen herstelfunktie is voor retourneren objecten." name="Parcel Content">
- <action description="Retourneren objecten in groepseigendom" longdescription="Retourneren van objecten die in eigendom zijn van de groep op percelen in groepseigendom in Over Land &gt; Objecten tab." name="land return group owned"/>
- <action description="Retourneren objecten toegewezen aan de groep" longdescriotion="Retourneren van objecten die aan de groep zijn toegewezen op percelen in groepseigendom in Over Land &gt; Objecten tab." name="land return group set"/>
- <action description="Retourneren objecten die niet van de groep zijn" longdescription="Retourneren objecten die niet van de groep zijn op percelen in groepeigendom in Over Land &gt; Objecten tab." name="land return non group"/>
- <action description="Landschappen maken met Linden planten" longdescription="Landschappen maken om Linden bomen, planten en grassen te plaatsen en te verplaatsen. Deze opties zijn te vinden in de inventaris Library &gt; Objects folder of ze kunnen worden gemaakt via de Bouwen knop." name="land gardening"/>
- </action_set>
- <action_set description="Deze Mogelijkheden regelen het afstaan, wijzigen, en verkopen van objecten in groepseigendom. Deze veranderingen worden gedaan in Bewerken Gereedschap &gt; Algemeen tab. Rechts-klik een object en selecteer Bewerken om de instellingen ervan te bekijken." name="Object Management">
- <action description="Overdragen objecten aan groep" longdescription="Overdragen objecten aan groep in de Bewerkings Hulpmiddelen &gt; Algemeen tab." name="object deed"/>
- <action description="Manipuleren (verplaatsen, copieren, wijzigen) van objecten in groepseigendom" longdescription="Manipuleren (verplaatsen, copieren, wijzigen) van objecten in groepseigendom in de Bewerkings Hulpmiddelen &gt; Algemeen tab." name="object manipulate"/>
- <action description="Te koop zetten van objecten in groepseigendom" longdescription="Te koop zetten van objecten in groepseigendom in de Bewerkings Hulpmiddelen &gt; Algemeen tab." name="object set sale"/>
- </action_set>
- <action_set description="Deze Mogelijkheden regelen dat Leden groepsverplichtingen betalen en groepsdividenden ontvangen, en toegang beperken tot de financiele historie van de groep." name="Accounting">
- <action description="Betalen groepsverplichtingen en ontvangen van groepsdividenden" longdescription="Leden in een Rol met deze mogelijkheid betalen groepsverplichtingen en ontvangen groepsdividenden automatisch. Dit betekent dat ze een deel ontvangen van de verkoop van land in groepseigendom die dagelijks worden verdeeld, maar ook dat ze bijdragen aan zaken zoals lijstbijdrage voor het perceel." name="accounting accountable"/>
- </action_set>
- <action_set description="Deze Mogelijkheden regelen de toestemming dat Leden Groepsberichten kunnen versturen, ontvangen en inzien." name="Notices">
- <action description="Versturen Berichten" longdescription="Leden in een Rol met deze Mogelijkheid kunnen Berichten versturen in Groep Informatie &gt; Berichten tab." name="notices send"/>
- <action description="Ontvangen Berichten en inzien van oude Berichten" longdescription="Leden in een Rol met deze Mogelijkheid kunnen Berichten ontvangen en oude Berichten inzien in Groep Informatie &gt; Berichten tab." name="notices receive"/>
- </action_set>
- <action_set description="Deze Mogelijkheden regelen de toestemming dat Leden Voorstellen kunnen maken, Voorstellen kunnen inzien, en het stemverloop kunnen bekijken." name="Proposals">
- <action description="Maken Voorstellen" longdescription="Leden in een Rol met deze Mogelijkheid kunnen Voorstellen maken waarop kan worden gestemd in Groep Informatie &gt; Voorstellen tab." name="proposal start"/>
- <action description="Stemmen op Voorstellen" longdescription="Leden in een Rol met deze Mogelijkheid kunnen stemmen op Voorstellen in Groep Informatie &gt; Voorstellen tab." name="proposal vote"/>
- </action_set>
- <action_set description="Deze Mogelijkheden regelen de toegang (en de beperking ervan) tot groep chat sessies en groep voice chat." name="Chat">
- <action description="Deelname aan Groep Chat" longdescription="Leden in een Rol met deze Mogelijkheid kunnen deelnemen aan groep chat sessies, zowel voor tekst als voice." name="join group chat"/>
- <action description="Deelname aan Groep Voice Chat" longdescription="Leden in een Rol met deze Mogelijkheid kunnen deelnemen aan groep voice chat sessies. OPMERKING: De Deelname Group Chat is vereist om toegang te krijgen to de voice chat sessie." name="join voice chat"/>
- <action description="Modereren Groep Chat" longdescription="Leden in een Rol met deze Mogelijkheid kunnen toegang en deelname controleren in groep voice en tekst chat sessies." name="moderate group chat"/>
- </action_set>
-</role_actions> \ No newline at end of file
diff --git a/indra/newview/skins/default/xui/nl/strings.xml b/indra/newview/skins/default/xui/nl/strings.xml
deleted file mode 100644
index ca6b8eb521..0000000000
--- a/indra/newview/skins/default/xui/nl/strings.xml
+++ /dev/null
@@ -1,3247 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<!-- This file contains strings that used to be hardcoded in the source.
- It is only for those strings which do not belong in a floater.
- For example, the strings used in avatar chat bubbles, and strings
- that are returned from one component and may appear in many places-->
-<strings>
- <string name="SUPPORT_SITE">
- Second Life Ondersteunings Portaal
- </string>
- <string name="StartupDetectingHardware">
- Detecteert hardware...
- </string>
- <string name="StartupLoading">
- Laden
- </string>
- <string name="LoginInProgress">
- Inloggen. Het kan lijken dat [APP_NAME] is vastgelopen. Wacht u alstublieft... .
- </string>
- <string name="LoginInProgressNoFrozen">
- Inloggen...
- </string>
- <string name="LoginAuthenticating">
- Authenticeren
- </string>
- <string name="LoginMaintenance">
- Account onderhoud wordt uitgevoerd...
- </string>
- <string name="LoginAttempt">
- Vorige loginpoging is mislukt. Inloggen, poging [NUMBER]
- </string>
- <string name="LoginPrecaching">
- Wereld laden...
- </string>
- <string name="LoginInitializingBrowser">
- Geïntegreerde web browser initialiseren...
- </string>
- <string name="LoginInitializingMultimedia">
- Multimedia initialiseren...
- </string>
- <string name="LoginInitializingFonts">
- Lettertypen laden...
- </string>
- <string name="LoginVerifyingCache">
- Veriveren cache bestanden (kan 60-90 seconden duren)...
- </string>
- <string name="LoginProcessingResponse">
- Reactie Verwerken...
- </string>
- <string name="LoginInitializingWorld">
- Wereld initialiseren...
- </string>
- <string name="LoginDecodingImages">
- Afbeeldingen decoderen...
- </string>
- <string name="LoginInitializingQuicktime">
- QuickTime initialiseren...
- </string>
- <string name="LoginQuicktimeNotFound">
- QuickTime niet gevonden - kan niet initialiseren.
- </string>
- <string name="LoginQuicktimeOK">
- QuickTime succesvol geïnitialiseerd.
- </string>
- <string name="LoginWaitingForRegionHandshake">
- Wachten op overeenstemming met regio...
- </string>
- <string name="LoginConnectingToRegion">
- Verbinden met regio...
- </string>
- <string name="LoginDownloadingClothing">
- Kleding downloaden...
- </string>
- <string name="LoginFailedNoNetwork">
- Netwerk Fout: Kon geen verbinding maken, kijk uw nerwerk connectie na alstublieft.
- </string>
- <string name="Quit">
- Afsluiten
- </string>
- <string name="create_account_url">
- http://join.secondlife.com/index.php?lang=nl-NL
- </string>
- <string name="AgentLostConnection">
- Deze regio kan problemen ondervinden. Controleer alstublieft uw verbinding met het internet.
- </string>
- <string name="TooltipPerson">
- Persoon
- </string>
- <string name="TooltipNoName">
- (geen naam)
- </string>
- <string name="TooltipOwner">
- Eigenaar:
- </string>
- <string name="TooltipPublic">
- Openbaar
- </string>
- <string name="TooltipIsGroup">
- (Groep)
- </string>
- <string name="TooltipForSaleL$">
- Te koop: L$[AMOUNT]
- </string>
- <string name="TooltipFlagGroupBuild">
- Groep bouwen
- </string>
- <string name="TooltipFlagNoBuild">
- Niet bouwen
- </string>
- <string name="TooltipFlagNoEdit">
- Groep bouwen
- </string>
- <string name="TooltipFlagNotSafe">
- Niet veilig
- </string>
- <string name="TooltipFlagNoFly">
- Niet vliegen
- </string>
- <string name="TooltipFlagGroupScripts">
- Groep scripts
- </string>
- <string name="TooltipFlagNoScripts">
- Geen scripts
- </string>
- <string name="TooltipLand">
- Land:
- </string>
- <string name="TooltipMustSingleDrop">
- Slechts een enkel item kan hier naartoe gesleept worden
- </string>
- <string name="TooltipHttpUrl">
- Klik om deze web pagina te bekijken
- </string>
- <string name="TooltipSLURL">
- Klik om deze locatie informatie te bekijken
- </string>
- <string name="TooltipAgentUrl">
- Klik om deze inwoner zijn profiel te bekijken
- </string>
- <string name="TooltipGroupUrl">
- Klik om deze groeps informatie te bekijken
- </string>
- <string name="TooltipEventUrl">
- Klik om deze evenement informatie te bekijken
- </string>
- <string name="TooltipClassifiedUrl">
- Klik om deze advertentie te bekijken
- </string>
- <string name="TooltipParcelUrl">
- Klik om deze perceel informatie te bekijken
- </string>
- <string name="TooltipTeleportUrl">
- Klik om naar deze lokatie te teleporteren
- </string>
- <string name="TooltipObjectIMUrl">
- Klik om deze object informatie te bekijken
- </string>
- <string name="TooltipMapUrl">
- Klik om deze locatie op een map te bekijken
- </string>
- <string name="TooltipSLAPP">
- Klik om het secondlife:// commando te starten
- </string>
- <string name="CurrentURL" value="HuidigeURL: [HuidigeURL]"/>
- <string name="SLurlLabelTeleport">
- Teleporteer naar
- </string>
- <string name="SLurlLabelShowOnMap">
- Toon Map voor
- </string>
- <string name="BUTTON_CLOSE_DARWIN">
- Sluiten (⌘W)
- </string>
- <string name="BUTTON_CLOSE_WIN">
- Sluiten (Ctrl+W)
- </string>
- <string name="BUTTON_RESTORE">
- Restore
- </string>
- <string name="BUTTON_MINIMIZE">
- Minimaliseren
- </string>
- <string name="BUTTON_TEAR_OFF">
- Afscheuren
- </string>
- <string name="BUTTON_DOCK">
- Koppelen
- </string>
- <string name="BUTTON_UNDOCK">
- Loskoppelen
- </string>
- <string name="BUTTON_HELP">
- Toon Help
- </string>
- <string name="Searching">
- Zoeken...
- </string>
- <string name="NoneFound">
- Geen gevonden.
- </string>
- <string name="RetrievingData">
- Ophalen...
- </string>
- <string name="ReleaseNotes">
- Release Notes
- </string>
- <string name="LoadingData">
- Laden...
- </string>
- <string name="AvatarNameNobody">
- (niemand)
- </string>
- <string name="AvatarNameWaiting">
- (wachten)
- </string>
- <string name="AvatarNameHippos">
- (hippos)
- </string>
- <string name="GroupNameNone">
- (geen)
- </string>
- <string name="AssetErrorNone">
- Geen fout
- </string>
- <string name="AssetErrorRequestFailed">
- Asset verzoek: mislukt
- </string>
- <string name="AssetErrorNonexistentFile">
- Asset verzoek: niet-bestaand bestand
- </string>
- <string name="AssetErrorNotInDatabase">
- Asset verzoek: asset niet gevonden in de database
- </string>
- <string name="AssetErrorEOF">
- Einde van bestand
- </string>
- <string name="AssetErrorCannotOpenFile">
- Kan bestand niet openen
- </string>
- <string name="AssetErrorFileNotFound">
- Bestand niet gevonden
- </string>
- <string name="AssetErrorTCPTimeout">
- Bestandsoverdracht time-out
- </string>
- <string name="AssetErrorCircuitGone">
- Circuit verdwenen
- </string>
- <string name="AssetErrorPriceMismatch">
- Viewer en server zijn het niet eens over de prijs.
- </string>
- <string name="AssetErrorUnknownStatus">
- Onbekende status
- </string>
- <string name="texture">
- textuur
- </string>
- <string name="sound">
- geluid
- </string>
- <string name="calling card">
- visitekaart
- </string>
- <string name="landmark">
- landmarkering
- </string>
- <string name="legacy script">
- legacy script
- </string>
- <string name="clothing">
- kleding
- </string>
- <string name="object">
- object
- </string>
- <string name="note card">
- notecard
- </string>
- <string name="folder">
- map
- </string>
- <string name="root">
- root
- </string>
- <string name="lsl2 script">
- LSL2 script
- </string>
- <string name="lsl bytecode">
- LSL bytecode
- </string>
- <string name="tga texture">
- tga textuur
- </string>
- <string name="body part">
- lichaamsdeel
- </string>
- <string name="snapshot">
- foto
- </string>
- <string name="lost and found">
- Verloren en Gevonden
- </string>
- <string name="targa image">
- targa plaatje
- </string>
- <string name="trash">
- Prullenbak
- </string>
- <string name="jpeg image">
- jpeg plaatje
- </string>
- <string name="animation">
- animatie
- </string>
- <string name="gesture">
- gebaar
- </string>
- <string name="simstate">
- simstate
- </string>
- <string name="favorite">
- favorieten
- </string>
- <string name="symbolic link">
- link
- </string>
- <string name="AvatarAway">
- Afwezig
- </string>
- <string name="AvatarBusy">
- Bezet
- </string>
- <string name="AvatarMuted">
- Genegeerd
- </string>
- <string name="anim_express_afraid">
- Bang
- </string>
- <string name="anim_express_anger">
- Boos
- </string>
- <string name="anim_away">
- Afwezig
- </string>
- <string name="anim_backflip">
- Salto achterwaarts
- </string>
- <string name="anim_express_laugh">
- Daverende lach
- </string>
- <string name="anim_express_toothsmile">
- Grote lach
- </string>
- <string name="anim_blowkiss">
- Blaas kus
- </string>
- <string name="anim_express_bored">
- Verveeld
- </string>
- <string name="anim_bow">
- Buigen
- </string>
- <string name="anim_clap">
- Klappen
- </string>
- <string name="anim_courtbow">
- Hof buiging
- </string>
- <string name="anim_express_cry">
- Huilen
- </string>
- <string name="anim_dance1">
- Dansen 1
- </string>
- <string name="anim_dance2">
- Dansen 2
- </string>
- <string name="anim_dance3">
- Dansen 3
- </string>
- <string name="anim_dance4">
- Dansen 4
- </string>
- <string name="anim_dance5">
- Dansen 5
- </string>
- <string name="anim_dance6">
- Dansen 6
- </string>
- <string name="anim_dance7">
- Dansen 7
- </string>
- <string name="anim_dance8">
- Dansen 8
- </string>
- <string name="anim_express_disdain">
- Minachting
- </string>
- <string name="anim_drink">
- Drinken
- </string>
- <string name="anim_express_embarrased">
- Beschaamd
- </string>
- <string name="anim_angry_fingerwag">
- Vinger opsteken
- </string>
- <string name="anim_fist_pump">
- Vuist pompen
- </string>
- <string name="anim_yoga_float">
- Zwevende Yoga
- </string>
- <string name="anim_express_frown">
- Fronsen
- </string>
- <string name="anim_impatient">
- Ongeduldig
- </string>
- <string name="anim_jumpforjoy">
- Vreugdesprong
- </string>
- <string name="anim_kissmybutt">
- Kus mijn reet
- </string>
- <string name="anim_express_kiss">
- Kussen
- </string>
- <string name="anim_laugh_short">
- Lachen
- </string>
- <string name="anim_musclebeach">
- Spieren tonen
- </string>
- <string name="anim_no_unhappy">
- Nee (ongelukkig)
- </string>
- <string name="anim_no_head">
- Nee
- </string>
- <string name="anim_nyanya">
- Nya-nya-nya
- </string>
- <string name="anim_punch_onetwo">
- Een-twee stomp
- </string>
- <string name="anim_express_open_mouth">
- Open mond
- </string>
- <string name="anim_peace">
- Vrede
- </string>
- <string name="anim_point_you">
- Wijzen naar ander
- </string>
- <string name="anim_point_me">
- Wijzen naar jezelf
- </string>
- <string name="anim_punch_l">
- Stomp links
- </string>
- <string name="anim_punch_r">
- Stomp rechts
- </string>
- <string name="anim_rps_countdown">
- SPS tellen
- </string>
- <string name="anim_rps_paper">
- SPS papier
- </string>
- <string name="anim_rps_rock">
- SPS steen
- </string>
- <string name="anim_rps_scissors">
- SPS schaar
- </string>
- <string name="anim_express_repulsed">
- Afkeer
- </string>
- <string name="anim_kick_roundhouse_r">
- Ronddraaiende trap
- </string>
- <string name="anim_express_sad">
- Droevig
- </string>
- <string name="anim_salute">
- Groet
- </string>
- <string name="anim_shout">
- Roepen
- </string>
- <string name="anim_express_shrug">
- Schouders ophalen
- </string>
- <string name="anim_express_smile">
- Glimlachen
- </string>
- <string name="anim_smoke_idle">
- Roken inactief
- </string>
- <string name="anim_smoke_inhale">
- Roken inhaleren
- </string>
- <string name="anim_smoke_throw_down">
- Roken neergooien
- </string>
- <string name="anim_express_surprise">
- Verrassing
- </string>
- <string name="anim_sword_strike_r">
- Zwaardslag
- </string>
- <string name="anim_angry_tantrum">
- Woedeaanval
- </string>
- <string name="anim_express_tongue_out">
- Tong uitsteken
- </string>
- <string name="anim_hello">
- Zwaaien
- </string>
- <string name="anim_whisper">
- Fluisteren
- </string>
- <string name="anim_whistle">
- Fluiten
- </string>
- <string name="anim_express_wink">
- Knipogen
- </string>
- <string name="anim_wink_hollywood">
- Knipogen (Hollywood)
- </string>
- <string name="anim_express_worry">
- Bezorgd
- </string>
- <string name="anim_yes_happy">
- Ja (vrolijk)
- </string>
- <string name="anim_yes_head">
- Ja
- </string>
- <string name="texture_loading">
- Laden...
- </string>
- <string name="worldmap_offline">
- Off line
- </string>
- <string name="worldmap_results_none_found">
- Geen gevonden.
- </string>
- <string name="Ok">
- OK
- </string>
- <string name="Premature end of file">
- Vroegtijdig eind van bestand
- </string>
- <string name="ST_NO_JOINT">
- Kan niet ROOT of JOINT vinden.
- </string>
- <string name="whisper">
- fluistert:
- </string>
- <string name="shout">
- schreeuwt:
- </string>
- <string name="ringing">
- Verbinden met in-wereld voice chat...
- </string>
- <string name="connected">
- Verbonden
- </string>
- <string name="unavailable">
- Voice is niet beschikbaar op uw huidige locatie
- </string>
- <string name="hang_up">
- Verbinding met in-wereld voicechat verbroken
- </string>
- <string name="ScriptQuestionCautionChatGranted">
- &apos;[OBJECTNAME]&apos;, een object van &apos;[OWNERNAME]&apos;, gevestigd in [REGIONNAME] op [REGIONPOS], is toestemming verleend om te: [PERMISSIONS].
- </string>
- <string name="ScriptQuestionCautionChatDenied">
- &apos;[OBJECTNAME]&apos;, een object van &apos;[OWNERNAME]&apos;, gevestigd in [REGIONNAME] op [REGIONPOS], is toestemming geweigerd om te: [PERMISSIONS].
- </string>
- <string name="ScriptTakeMoney">
- Linden dollars (L$) van u wegnemen
- </string>
- <string name="ActOnControlInputs">
- Acteren op uw bedieningsinvoer
- </string>
- <string name="RemapControlInputs">
- Uw bedieningsinvoer herdefiniëren
- </string>
- <string name="AnimateYourAvatar">
- Animeer uw avatar
- </string>
- <string name="AttachToYourAvatar">
- Bevestig aan uw avatar
- </string>
- <string name="ReleaseOwnership">
- Eigendom vrijgeven en openbaar worden
- </string>
- <string name="LinkAndDelink">
- Koppelen met en ontkoppelen van andere objecten
- </string>
- <string name="AddAndRemoveJoints">
- Toevoegen en verwijderen koppelingen met andere objecten
- </string>
- <string name="ChangePermissions">
- Wijzig zijn permissies
- </string>
- <string name="TrackYourCamera">
- Volg uw camera
- </string>
- <string name="ControlYourCamera">
- Bedien uw camera
- </string>
- <string name="SIM_ACCESS_PG">
- PG
- </string>
- <string name="SIM_ACCESS_MATURE">
- Mature
- </string>
- <string name="SIM_ACCESS_ADULT">
- Adult
- </string>
- <string name="SIM_ACCESS_DOWN">
- Offline
- </string>
- <string name="SIM_ACCESS_MIN">
- Onbekend
- </string>
- <string name="land_type_unknown">
- (onbekend)
- </string>
- <string name="all_files">
- Alle bestanden
- </string>
- <string name="sound_files">
- Geluiden
- </string>
- <string name="animation_files">
- Animaties
- </string>
- <string name="image_files">
- Afbeeldingen
- </string>
- <string name="save_file_verb">
- Opslaan
- </string>
- <string name="load_file_verb">
- Laden
- </string>
- <string name="targa_image_files">
- Targa afbeeldingen
- </string>
- <string name="bitmap_image_files">
- Bitmap afbeeldingen
- </string>
- <string name="avi_movie_file">
- AVI Film bestand
- </string>
- <string name="xaf_animation_file">
- XAF Anim bestand
- </string>
- <string name="xml_file">
- XML bestand
- </string>
- <string name="raw_file">
- RAW bestand
- </string>
- <string name="compressed_image_files">
- Gecomprimeerde afbeeldingen
- </string>
- <string name="load_files">
- Laad bestanden
- </string>
- <string name="choose_the_directory">
- Kies folder
- </string>
- <string name="AvatarSetNotAway">
- Niet Afwezig Instellen
- </string>
- <string name="AvatarSetAway">
- Afwezig Instellen
- </string>
- <string name="AvatarSetNotBusy">
- Niet Bezig Instellen
- </string>
- <string name="AvatarSetBusy">
- Bezig Instellen
- </string>
- <string name="shape">
- Postuur
- </string>
- <string name="skin">
- Huid
- </string>
- <string name="hair">
- Haar
- </string>
- <string name="eyes">
- Ogen
- </string>
- <string name="shirt">
- Hemd
- </string>
- <string name="pants">
- Broek
- </string>
- <string name="shoes">
- Schoenen
- </string>
- <string name="socks">
- Sokken
- </string>
- <string name="jacket">
- Jas
- </string>
- <string name="gloves">
- Handschoenen
- </string>
- <string name="undershirt">
- onderhemd
- </string>
- <string name="underpants">
- Onderbroek
- </string>
- <string name="skirt">
- Rok
- </string>
- <string name="alpha">
- Alpha
- </string>
- <string name="tattoo">
- Tattoo
- </string>
- <string name="invalid">
- ongeldig
- </string>
- <string name="next">
- Volgende
- </string>
- <string name="ok">
- OK
- </string>
- <string name="GroupNotifyGroupNotice">
- Groep Mededeling
- </string>
- <string name="GroupNotifyGroupNotices">
- Groep Mededelingen
- </string>
- <string name="GroupNotifySentBy">
- Verzonden Door:
- </string>
- <string name="GroupNotifyAttached">
- Bijgevoegt:
- </string>
- <string name="GroupNotifyViewPastNotices">
- Bekijk alle mededelingen en bijlages van verzonden Mededelingen in het verleden
- </string>
- <string name="GroupNotifyOpenAttachment">
- Open Bijlage
- </string>
- <string name="GroupNotifySaveAttachment">
- Sla Bijlage Op
- </string>
- <string name="TeleportOffer">
- Teleporteer Aanbieding
- </string>
- <string name="StartUpNotification">
- [%d] Nieuwe mededelingen aangekomen terwijl u weg was ...
- </string>
- <string name="StartUpNotifications">
- [%d] Nieuwe mededelingen aangekomen terwijl u weg was ...
- </string>
- <string name="OverflowInfoChannelString">
- U heeft [%d] meer mededelingen
- </string>
- <string name="BodyPartsRightArm">
- Rechter Arm
- </string>
- <string name="BodyPartsHead">
- Hoofd
- </string>
- <string name="BodyPartsLeftArm">
- Linker Arm
- </string>
- <string name="BodyPartsLeftLeg">
- Linker Been
- </string>
- <string name="BodyPartsTorso">
- Torso
- </string>
- <string name="BodyPartsRightLeg">
- Rechter Been
- </string>
- <string name="GraphicsQualityLow">
- Laag
- </string>
- <string name="GraphicsQualityMid">
- Middel
- </string>
- <string name="GraphicsQualityHigh">
- Hoog
- </string>
- <string name="LeaveMouselook">
- Druk op ESC om terug te keren naar Wereld Zicht
- </string>
- <string name="InventoryNoMatchingItems">
- Geen overeenkomende objecten gevonden in de voorraad.
- </string>
- <string name="InventoryNoTexture">
- Je hebt geen kopie van deze texture in je inventaris
- </string>
- <string name="no_transfer" value="(no transfer)"/>
- <string name="no_modify" value="(no modify)"/>
- <string name="no_copy" value="(no copy)"/>
- <string name="worn" value="(worn)"/>
- <string name="link" value="(link)"/>
- <string name="broken_link" value="(broken_link)&quot;"/>
- <string name="LoadingContents">
- Loading contents...
- </string>
- <string name="NoContents">
- No contents
- </string>
- <string name="WornOnAttachmentPoint" value="(worn on [ATTACHMENT_POINT])"/>
- <string name="Chat" value="Chat :"/>
- <string name="Sound" value="Geluid :"/>
- <string name="Wait" value="--- Wachten :"/>
- <string name="AnimFlagStop" value="Stop Animatie :"/>
- <string name="AnimFlagStart" value="Start Animatie :"/>
- <string name="Wave" value="Wave"/>
- <string name="HelloAvatar" value="Hallo, avatar!"/>
- <string name="ViewAllGestures" value="Bekijk alles &gt;"/>
- <string name="Animations" value="Animaties,"/>
- <string name="Calling Cards" value="Calling Cards,"/>
- <string name="Clothing" value="Kleding,"/>
- <string name="Gestures" value="Gestures,"/>
- <string name="Landmarks" value="Landmarks,"/>
- <string name="Notecards" value="Notecards,"/>
- <string name="Objects" value="Objecten,"/>
- <string name="Scripts" value="Scripts,"/>
- <string name="Sounds" value="Geluiden,"/>
- <string name="Textures" value="Textures,"/>
- <string name="Snapshots" value="Snapshots,"/>
- <string name="No Filters" value="Nee"/>
- <string name="Since Logoff" value="- Sinds Afmelden"/>
- <string name="InvFolder My Inventory">
- Mijn Inventaris
- </string>
- <string name="InvFolder Library">
- Bibliotheek
- </string>
- <string name="InvFolder Textures">
- Textures
- </string>
- <string name="InvFolder Sounds">
- Geluiden
- </string>
- <string name="InvFolder Calling Cards">
- Calling Cards
- </string>
- <string name="InvFolder Landmarks">
- Landmarks
- </string>
- <string name="InvFolder Scripts">
- Scripts
- </string>
- <string name="InvFolder Clothing">
- Kleding
- </string>
- <string name="InvFolder Objects">
- Objecten
- </string>
- <string name="InvFolder Notecards">
- Notecards
- </string>
- <string name="InvFolder New Folder">
- Nieuwe Map
- </string>
- <string name="InvFolder Inventory">
- Inventaris
- </string>
- <string name="InvFolder Uncompressed Images">
- Ongecomprimeerde Afbeeldingen
- </string>
- <string name="InvFolder Body Parts">
- Lichaams Delen
- </string>
- <string name="InvFolder Trash">
- Afval
- </string>
- <string name="InvFolder Photo Album">
- Foto Album
- </string>
- <string name="InvFolder Lost And Found">
- Verloren en Gevonden
- </string>
- <string name="InvFolder Uncompressed Sounds">
- Ongecomprimeerde Geluiden
- </string>
- <string name="InvFolder Animations">
- Animaties
- </string>
- <string name="InvFolder Gestures">
- Gebaren
- </string>
- <string name="InvFolder Favorite">
- Mijn Favorieten
- </string>
- <string name="InvFolder favorite">
- Mijn Favorieten
- </string>
- <string name="InvFolder Current Outfit">
- Huidige Uitrusting
- </string>
- <string name="InvFolder My Outfits">
- Mijn Uitrustingen
- </string>
- <string name="InvFolder Friends">
- Vrienden
- </string>
- <string name="InvFolder All">
- Alles
- </string>
- <string name="Buy">
- Koop
- </string>
- <string name="BuyforL$">
- Koop voor L$
- </string>
- <string name="Stone">
- Steen
- </string>
- <string name="Metal">
- Metaal
- </string>
- <string name="Glass">
- Glas
- </string>
- <string name="Wood">
- Hout
- </string>
- <string name="Flesh">
- Vlees
- </string>
- <string name="Plastic">
- Plastic
- </string>
- <string name="Rubber">
- Rubber
- </string>
- <string name="Light">
- Licht
- </string>
- <string name="KBShift">
- Shift
- </string>
- <string name="KBCtrl">
- Ctrl
- </string>
- <string name="Chest">
- Borstkas
- </string>
- <string name="Skull">
- Schedel
- </string>
- <string name="Left Shoulder">
- Linker Schouder
- </string>
- <string name="Right Shoulder">
- Rechter Schouder
- </string>
- <string name="Left Hand">
- Linker Hand
- </string>
- <string name="Right Hand">
- Rechter Hand
- </string>
- <string name="Left Foot">
- Linker Voet
- </string>
- <string name="Right Foot">
- Rechter Voet
- </string>
- <string name="Spine">
- Ruggegraat
- </string>
- <string name="Pelvis">
- Bekken
- </string>
- <string name="Mouth">
- Mond
- </string>
- <string name="Chin">
- Kin
- </string>
- <string name="Left Ear">
- Linker Oor
- </string>
- <string name="Right Ear">
- Rechter Oor
- </string>
- <string name="Left Eyeball">
- Linker Oogbal
- </string>
- <string name="Right Eyeball">
- Rechter Oogbal
- </string>
- <string name="Nose">
- Neus
- </string>
- <string name="R Upper Arm">
- R Boven Arm
- </string>
- <string name="R Forearm">
- R Onder Arm
- </string>
- <string name="L Upper Arm">
- L Boven Arm
- </string>
- <string name="L Forearm">
- L Onder Arm
- </string>
- <string name="Right Hip">
- Rechter Heup
- </string>
- <string name="R Upper Leg">
- R Boven Been
- </string>
- <string name="R Lower Leg">
- R Onder Been
- </string>
- <string name="Left Hip">
- Linker Heub
- </string>
- <string name="L Upper Leg">
- L Boven Been
- </string>
- <string name="L Lower Leg">
- L Onder Been
- </string>
- <string name="Stomach">
- Maag
- </string>
- <string name="Left Pec">
- Left Pec
- </string>
- <string name="Right Pec">
- Right Pec
- </string>
- <string name="YearsMonthsOld">
- [AGEYEARS] [AGEMONTHS] oud
- </string>
- <string name="YearsOld">
- [AGEYEARS] oud
- </string>
- <string name="MonthsOld">
- [AGEMONTHS] oud
- </string>
- <string name="WeeksOld">
- [AGEWEEKS] oud
- </string>
- <string name="DaysOld">
- [AGEDAYS] oud
- </string>
- <string name="TodayOld">
- Vandaag toegetreden
- </string>
- <string name="AgeYearsA">
- [COUNT] jaar
- </string>
- <string name="AgeYearsB">
- [COUNT] jaar
- </string>
- <string name="AgeYearsC">
- [COUNT] jaar
- </string>
- <string name="AgeMonthsA">
- [COUNT] maand
- </string>
- <string name="AgeMonthsB">
- [COUNT] maanden
- </string>
- <string name="AgeMonthsC">
- [COUNT] maanden
- </string>
- <string name="AgeWeeksA">
- [COUNT] week
- </string>
- <string name="AgeWeeksB">
- [COUNT] weken
- </string>
- <string name="AgeWeeksC">
- [COUNT] weken
- </string>
- <string name="AgeDaysA">
- [COUNT] dag
- </string>
- <string name="AgeDaysB">
- [COUNT] dagen
- </string>
- <string name="AgeDaysC">
- [COUNT] dagen
- </string>
- <string name="GroupMembersA">
- [COUNT] lid
- </string>
- <string name="GroupMembersB">
- [COUNT] leden
- </string>
- <string name="GroupMembersC">
- [COUNT] leden
- </string>
- <string name="AcctTypeResident">
- bewoner
- </string>
- <string name="AcctTypeTrial">
- Trial
- </string>
- <string name="AcctTypeCharterMember">
- Charter Member
- </string>
- <string name="AcctTypeEmployee">
- Linden Lab Werknemer
- </string>
- <string name="PaymentInfoUsed">
- Betalings info gebruikt
- </string>
- <string name="PaymentInfoOnFile">
- Betalings info op bestand
- </string>
- <string name="NoPaymentInfoOnFile">
- Geen betalings info op bestand
- </string>
- <string name="AgeVerified">
- Leeftijd gecontroleerd
- </string>
- <string name="NotAgeVerified">
- Niet leeftijd gecontroleerd
- </string>
- <string name="Center 2">
- Centrum 2
- </string>
- <string name="Top Right">
- Rechts Boven
- </string>
- <string name="Top">
- Boven
- </string>
- <string name="Top Left">
- Links Boven
- </string>
- <string name="Center">
- Centrum
- </string>
- <string name="Bottom Left">
- Links beneden
- </string>
- <string name="Bottom">
- Beneden
- </string>
- <string name="Bottom Right">
- Rechts beneden
- </string>
- <string name="CompileQueueDownloadedCompiling">
- Dedownload, nu samenstellen
- </string>
- <string name="CompileQueueScriptNotFound">
- Script niet gevonden op server.
- </string>
- <string name="CompileQueueProblemDownloading">
- Problem downloading
- </string>
- <string name="CompileQueueInsufficientPermDownload">
- Onvoldoende rechten om een script te downloaden.
- </string>
- <string name="CompileQueueInsufficientPermFor">
- Onvoldoende rechten voor
- </string>
- <string name="CompileQueueUnknownFailure">
- Onbekende fout te downloaden
- </string>
- <string name="CompileQueueTitle">
- Hercompilatie vooruitgang
- </string>
- <string name="CompileQueueStart">
- Hercompilatie
- </string>
- <string name="ResetQueueTitle">
- Reset Vooruitgang
- </string>
- <string name="ResetQueueStart">
- reset
- </string>
- <string name="RunQueueTitle">
- Set Running Progress
- </string>
- <string name="RunQueueStart">
- set running
- </string>
- <string name="NotRunQueueTitle">
- Set Not Running Progress
- </string>
- <string name="NotRunQueueStart">
- set not running
- </string>
- <string name="CompileSuccessful">
- Compileren succesvol!
- </string>
- <string name="CompileSuccessfulSaving">
- Compileren succesvol, opslaan...
- </string>
- <string name="SaveComplete">
- Opslaan gereed.
- </string>
- <string name="ObjectOutOfRange">
- Script (object buiten het bereik)
- </string>
- <string name="GodToolsObjectOwnedBy">
- Object [OBJECT] eigendom van [OWNER]
- </string>
- <string name="GroupsNone">
- geen
- </string>
- <string name="Group" value="(group)"/>
- <string name="Unknown">
- (Unknown)
- </string>
- <string name="SummaryForTheWeek" value="Samenvatting voor deze week, vanaf "/>
- <string name="NextStipendDay" value=". The next stipend day is "/>
- <string name="GroupIndividualShare" value="Groep Individueel Aandeel"/>
- <string name="Balance">
- Banksaldo
- </string>
- <string name="Credits">
- Credits
- </string>
- <string name="Debits">
- Debiteert
- </string>
- <string name="Total">
- Totaal
- </string>
- <string name="NoGroupDataFound">
- Geen groep gegevens gevonden voor groep
- </string>
- <string name="IMParentEstate">
- parent estate
- </string>
- <string name="IMMainland">
- mainland
- </string>
- <string name="IMTeen">
- tiener
- </string>
- <string name="RegionInfoError">
- fout
- </string>
- <string name="RegionInfoAllEstatesOwnedBy">
- all estates owned by [OWNER]
- </string>
- <string name="RegionInfoAllEstatesYouOwn">
- all estates that you own
- </string>
- <string name="RegionInfoAllEstatesYouManage">
- all estates that you manage for [OWNER]
- </string>
- <string name="RegionInfoAllowedResidents">
- Toegestane bewoners: ([ALLOWEDAGENTS], max [MAXACCESS])
- </string>
- <string name="RegionInfoAllowedGroups">
- Toegestane groepen: ([ALLOWEDGROUPS], max [MAXACCESS])
- </string>
- <string name="CursorPos">
- Lijn [LINE], Column [COLUMN]
- </string>
- <string name="PanelDirCountFound">
- [COUNT] gevonden
- </string>
- <string name="PanelContentsNewScript">
- Nieuw Script
- </string>
- <string name="MuteByName">
- (by name)
- </string>
- <string name="MuteAgent">
- (resident)
- </string>
- <string name="MuteObject">
- (object)
- </string>
- <string name="MuteGroup">
- (group)
- </string>
- <string name="RegionNoCovenant">
- There is no Covenant provided for this Estate.
- </string>
- <string name="RegionNoCovenantOtherOwner">
- There is no Covenant provided for this Estate. The land on this estate is being sold by the Estate owner, not Linden Lab. Please contact the Estate Owner for sales details.
- </string>
- <string name="covenant_last_modified" value="Laatst bewerkt: " />
- <string name="none_text" value="(none)"/>
- <string name="never_text" value="(never)"/>
- <string name="GroupOwned">
- Groep Eigendom
- </string>
- <string name="Public">
- Openbaar
- </string>
- <string name="ClassifiedClicksTxt">
- Klikken: [TELEPORT] teleport, [MAP] map, [PROFILE] profiel
- </string>
- <string name="ClassifiedUpdateAfterPublish">
- (zal bijwerken na publiceren)
- </string>
- <string name="MultiPreviewTitle">
- Preview
- </string>
- <string name="MultiPropertiesTitle">
- Eigenschappen
- </string>
- <string name="InvOfferAnObjectNamed">
- Een object genaamd
- </string>
- <string name="InvOfferOwnedByGroup">
- Eigendom van groep
- </string>
- <string name="InvOfferOwnedByUnknownGroup">
- Eigendom van een onbekende groep
- </string>
- <string name="InvOfferOwnedBy">
- Eigendom van
- </string>
- <string name="InvOfferOwnedByUnknownUser">
- Eigendom van onbekende gebruiker
- </string>
- <string name="InvOfferGaveYou">
- gaf je
- </string>
- <string name="InvOfferYouDecline">
- You decline
- </string>
- <string name="InvOfferFrom">
- van
- </string>
- <string name="GroupMoneyTotal">
- Totaal
- </string>
- <string name="GroupMoneyBought">
- kocht
- </string>
- <string name="GroupMoneyPaidYou">
- betaald u
- </string>
- <string name="GroupMoneyPaidInto">
- gestort
- </string>
- <string name="GroupMoneyBoughtPassTo">
- bought pass to
- </string>
- <string name="GroupMoneyPaidFeeForEvent">
- betaalde vergoeding voor evenement
- </string>
- <string name="GroupMoneyPaidPrizeForEvent">
- betaalde prijs voor evenement
- </string>
- <string name="GroupMoneyBalance">
- Banksaldo
- </string>
- <string name="GroupMoneyCredits">
- Credits
- </string>
- <string name="GroupMoneyDebits">
- Debiteert
- </string>
- <string name="ViewerObjectContents">
- Inhoud
- </string>
- <string name="AcquiredItems">
- Verworven objecten
- </string>
- <string name="Cancel">
- Annuleren
- </string>
- <string name="UploadingCosts">
- Uploading [%s] kosten
- </string>
- <string name="UnknownFileExtension">
- Onbekende extensie [.%s]
-Verwacht .wav, .tga, .bmp, .jpg, .jpeg, or .bvh
- </string>
- <string name="AddLandmarkNavBarMenu">
- Voeg Landmark toe...
- </string>
- <string name="EditLandmarkNavBarMenu">
- Bewerk Landmark...
- </string>
- <string name="accel-mac-control">
- ⌃
- </string>
- <string name="accel-mac-command">
- ⌘
- </string>
- <string name="accel-mac-option">
- ⌥
- </string>
- <string name="accel-mac-shift">
- ⇧
- </string>
- <string name="accel-win-control">
- Ctrl+
- </string>
- <string name="accel-win-alt">
- Alt+
- </string>
- <string name="accel-win-shift">
- Shift+
- </string>
- <string name="FileSaved">
- Bestand Opgeslagen
- </string>
- <string name="Receiving">
- Ontvangen
- </string>
- <string name="AM">
- AM
- </string>
- <string name="PM">
- PM
- </string>
- <string name="PST">
- PST
- </string>
- <string name="PDT">
- PDT
- </string>
- <string name="Direction_Forward">
- Vooruit
- </string>
- <string name="Direction_Left">
- Links
- </string>
- <string name="Direction_Right">
- Rechts
- </string>
- <string name="Direction_Back">
- Achteruit
- </string>
- <string name="Direction_North">
- Noord
- </string>
- <string name="Direction_South">
- Zuid
- </string>
- <string name="Direction_West">
- West
- </string>
- <string name="Direction_East">
- Oost
- </string>
- <string name="Direction_Up">
- Omhoog
- </string>
- <string name="Direction_Down">
- Omlaag
- </string>
- <string name="Any Category">
- Elke Categorie
- </string>
- <string name="Shopping">
- Boodschappen
- </string>
- <string name="Land Rental">
- Land Verhuur
- </string>
- <string name="Property Rental">
- Verhuur van onroerend goed
- </string>
- <string name="Special Attraction">
- Speciale Attractie
- </string>
- <string name="New Products">
- Nieuwe Producten
- </string>
- <string name="Employment">
- Employment
- </string>
- <string name="Wanted">
- Gezocht
- </string>
- <string name="Service">
- Service
- </string>
- <string name="Personal">
- Personal
- </string>
- <string name="None">
- Geen
- </string>
- <string name="Linden Location">
- Linden locatie
- </string>
- <string name="Adult">
- Adult
- </string>
- <string name="Arts&amp;Culture">
- Kunst &amp; Cultuur
- </string>
- <string name="Business">
- Zakelijk
- </string>
- <string name="Educational">
- Educatief
- </string>
- <string name="Gaming">
- Spelen
- </string>
- <string name="Hangout">
- Ontmoetingsplaats
- </string>
- <string name="Newcomer Friendly">
- Nieuwkomervriendelijk
- </string>
- <string name="Parks&amp;Nature">
- Parken &amp; natuur
- </string>
- <string name="Residential">
- Woongebied
- </string>
- <string name="Stage">
- Stage
- </string>
- <string name="Other">
- Anders
- </string>
- <string name="Any">
- Any
- </string>
- <string name="You">
- Jij
- </string>
- <string name="Multiple Media">
- Meerdere Media
- </string>
- <string name="Play Media">
- Play/Pause Media
- </string>
- <string name="MBCmdLineError">
- An error was found parsing the command line.
-Please see: http://wiki.secondlife.com/wiki/Client_parameters
-Error:
- </string>
- <string name="MBCmdLineUsg">
- [APP_NAME] Command line usage:
- </string>
- <string name="MBUnableToAccessFile">
- [APP_NAME] is unable to access a file that it needs.
-
-This can be because you somehow have multiple copies running, or your system incorrectly thinks a file is open.
-If this message persists, restart your computer and try again.
-If it continues to persist, you may need to completely uninstall [APP_NAME] and reinstall it.
- </string>
- <string name="MBFatalError">
- Fatal Error
- </string>
- <string name="MBRequiresAltiVec">
- [APP_NAME] requires a processor with AltiVec (G4 or later).
- </string>
- <string name="MBAlreadyRunning">
- [APP_NAME] is already running.
-Check your task bar for a minimized copy of the program.
-If this message persists, restart your computer.
- </string>
- <string name="MBFrozenCrashed">
- [APP_NAME] appears to have frozen or crashed on the previous run.
-Would you like to send a crash report?
- </string>
- <string name="MBAlert">
- Alert
- </string>
- <string name="MBNoDirectX">
- [APP_NAME] is unable to detect DirectX 9.0b or greater.
-[APP_NAME] uses DirectX to detect hardware and/or outdated drivers that can cause stability problems, poor performance and crashes. While you can run [APP_NAME] without it, we highly recommend running with DirectX 9.0b.
-
-Do you wish to continue?
- </string>
- <string name="MBWarning">
- Warning
- </string>
- <string name="MBNoAutoUpdate">
- Automatic updating is not yet implemented for Linux.
-Please download the latest version from www.secondlife.com.
- </string>
- <string name="MBRegClassFailed">
- RegisterClass failed
- </string>
- <string name="MBError">
- Error
- </string>
- <string name="MBFullScreenErr">
- Unable to run fullscreen at [WIDTH] x [HEIGHT].
-Running in window.
- </string>
- <string name="MBDestroyWinFailed">
- Shutdown Error while destroying window (DestroyWindow() failed)
- </string>
- <string name="MBShutdownErr">
- Shutdown Error
- </string>
- <string name="MBDevContextErr">
- Can&apos;t make GL device context
- </string>
- <string name="MBPixelFmtErr">
- Can&apos;t find suitable pixel format
- </string>
- <string name="MBPixelFmtDescErr">
- Can&apos;t get pixel format description
- </string>
- <string name="MBTrueColorWindow">
- [APP_NAME] requires True Color (32-bit) to run.
-Please go to your computer&apos;s display settings and set the color mode to 32-bit.
- </string>
- <string name="MBAlpha">
- [APP_NAME] is unable to run because it can&apos;t get an 8 bit alpha channel. Usually this is due to video card driver issues.
-Please make sure you have the latest video card drivers installed.
-Also be sure your monitor is set to True Color (32-bit) in Control Panels &gt; Display &gt; Settings.
-If you continue to receive this message, contact the [SUPPORT_SITE].
- </string>
- <string name="MBPixelFmtSetErr">
- Can&apos;t set pixel format
- </string>
- <string name="MBGLContextErr">
- Can&apos;t create GL rendering context
- </string>
- <string name="MBGLContextActErr">
- Can&apos;t activate GL rendering context
- </string>
- <string name="MBVideoDrvErr">
- [APP_NAME] is unable to run because your video card drivers did not install properly, are out of date, or are for unsupported hardware. Please make sure you have the latest video card drivers and even if you do have the latest, try reinstalling them.
-
-If you continue to receive this message, contact the [SUPPORT_SITE].
- </string>
- <string name="5 O&apos;Clock Shadow">
- Stoppels
- </string>
- <string name="All White">
- Alles Wit
- </string>
- <string name="Anime Eyes">
- Ogen Animeren
- </string>
- <string name="Arced">
- Gebogen
- </string>
- <string name="Arm Length">
- Arm Lengte
- </string>
- <string name="Attached">
- Bijgevoegt
- </string>
- <string name="Attached Earlobes">
- Bijgevoegde Oorlellen
- </string>
- <string name="Back Bangs">
- Achterkant Pony
- </string>
- <string name="Back Bangs Down">
- Achterkant Pony Neer
- </string>
- <string name="Back Bangs Up">
- Achterkant Pony Omhoog
- </string>
- <string name="Back Fringe">
- Achterkant Franje
- </string>
- <string name="Back Hair">
- Achterkant Haar
- </string>
- <string name="Back Hair Down">
- Achterkant Haar Neer
- </string>
- <string name="Back Hair Up">
- Achterkant Haar Omhoog
- </string>
- <string name="Baggy">
- Oogwallen
- </string>
- <string name="Bangs">
- Pony
- </string>
- <string name="Bangs Down">
- Pony Neer
- </string>
- <string name="Bangs Up">
- Pony Omhoog
- </string>
- <string name="Beady Eyes">
- Kraaloogjes
- </string>
- <string name="Belly Size">
- Buik Grootte
- </string>
- <string name="Big">
- Groot
- </string>
- <string name="Big Butt">
- Grote Kont
- </string>
- <string name="Big Eyeball">
- Grote Oogbol
- </string>
- <string name="Big Hair Back">
- Haar Volume Achter
- </string>
- <string name="Big Hair Front">
- Haar Volume Voor
- </string>
- <string name="Big Hair Top">
- Haar Volume Boven
- </string>
- <string name="Big Head">
- Groot Hoofd
- </string>
- <string name="Big Pectorals">
- Groote Borstspieren
- </string>
- <string name="Big Spikes">
- Grote Stekels
- </string>
- <string name="Black">
- Zwart
- </string>
- <string name="Blonde">
- Blond
- </string>
- <string name="Blonde Hair">
- Blond Haar
- </string>
- <string name="Blush">
- Blozen
- </string>
- <string name="Blush Color">
- Bloos Kleur
- </string>
- <string name="Blush Opacity">
- Bloos Opaciteit
- </string>
- <string name="Body Definition">
- Lichaam Definitie
- </string>
- <string name="Body Fat">
- Lichaam vet
- </string>
- <string name="Body Freckles">
- Lichaam Sproeten
- </string>
- <string name="Body Thick">
- Lichaam Dik
- </string>
- <string name="Body Thickness">
- Lichaam Dikte
- </string>
- <string name="Body Thin">
- Lichaam Dun
- </string>
- <string name="Bow Legged">
- Boog Benen
- </string>
- <string name="Breast Buoyancy">
- Borst Drijfvermogen
- </string>
- <string name="Breast Cleavage">
- Borst Splijting
- </string>
- <string name="Breast Size">
- Borst Grootte
- </string>
- <string name="Bridge Width">
- Brug Breedte
- </string>
- <string name="Broad">
- Breed
- </string>
- <string name="Brow Size">
- Wenkbrauw Grootte
- </string>
- <string name="Bug Eyes">
- Insect Ogen
- </string>
- <string name="Bugged Eyes">
- Insect Ogen
- </string>
- <string name="Bulbous">
- Bolle
- </string>
- <string name="Bulbous Nose">
- Bolle Neus
- </string>
- <string name="Bushy Eyebrows">
- Borstelige Wenkbrauwen
- </string>
- <string name="Bushy Hair">
- Borstelig Haar
- </string>
- <string name="Butt Size">
- Kont Grootte
- </string>
- <string name="bustle skirt">
- Bustle Skirt
- </string>
- <string name="no bustle">
- No Bustle
- </string>
- <string name="more bustle">
- More Bustle
- </string>
- <string name="Chaplin">
- Smalle Snor
- </string>
- <string name="Cheek Bones">
- Jukbeenderen
- </string>
- <string name="Chest Size">
- Borst Grootte
- </string>
- <string name="Chin Angle">
- Kin Hoek
- </string>
- <string name="Chin Cleft">
- Gespleten Kin
- </string>
- <string name="Chin Curtains">
- Kin Gordijnen
- </string>
- <string name="Chin Depth">
- Kin Diepte
- </string>
- <string name="Chin Heavy">
- Kin Zware
- </string>
- <string name="Chin In">
- Kin In
- </string>
- <string name="Chin Out">
- Kin uit
- </string>
- <string name="Chin-Neck">
- Kin-Nek
- </string>
- <string name="Clear">
- Opschonen
- </string>
- <string name="Cleft">
- Gespleten
- </string>
- <string name="Close Set Eyes">
- Close Set Eyes
- </string>
- <string name="Closed">
- Gesloten
- </string>
- <string name="Closed Back">
- Gesloten Achterkant
- </string>
- <string name="Closed Front">
- Gesloten Voorkant
- </string>
- <string name="Closed Left">
- Gesloten Links
- </string>
- <string name="Closed Right">
- Gesloten Rechts
- </string>
- <string name="Coin Purse">
- Verminder Grootte
- </string>
- <string name="Collar Back">
- Kraag Achterkant
- </string>
- <string name="Collar Front">
- Kraag Voorkant
- </string>
- <string name="Corner Down">
- Hoek Omlaag
- </string>
- <string name="Corner Normal">
- Hoek Normaal
- </string>
- <string name="Corner Up">
- Hoek Omhoog
- </string>
- <string name="Creased">
- Gevouwen
- </string>
- <string name="Crooked Nose">
- Kromte Neus
- </string>
- <string name="Cropped Hair">
- Bijgesneden Haar
- </string>
- <string name="Cuff Flare">
- Cuff Flare
- </string>
- <string name="Dark">
- Donker
- </string>
- <string name="Dark Green">
- Donker Groen
- </string>
- <string name="Darker">
- Donkerder
- </string>
- <string name="Deep">
- Diep
- </string>
- <string name="Default Heels">
- Standaard Hielen
- </string>
- <string name="Default Toe">
- Standaard Teen
- </string>
- <string name="Dense">
- Dicht
- </string>
- <string name="Dense hair">
- Dicht haar
- </string>
- <string name="Double Chin">
- Dubbele Kin
- </string>
- <string name="Downturned">
- Downturned
- </string>
- <string name="Duffle Bag">
- Vergroot Grootte
- </string>
- <string name="Ear Angle">
- Oor Hoek
- </string>
- <string name="Ear Size">
- Oor Grootte
- </string>
- <string name="Ear Tips">
- Oor Punten
- </string>
- <string name="Egg Head">
- Ei Hoofd
- </string>
- <string name="Eye Bags">
- Oog Zakken
- </string>
- <string name="Eye Color">
- Oog Kleur
- </string>
- <string name="Eye Depth">
- Oog Diepte
- </string>
- <string name="Eye Lightness">
- Oog Lichtheid
- </string>
- <string name="Eye Opening">
- Oog Opening
- </string>
- <string name="Eye Pop">
- Asymmetrisch
- </string>
- <string name="Eye Size">
- Oog Grootte
- </string>
- <string name="Eye Spacing">
- Oog Afstand
- </string>
- <string name="Eyeball Size">
- Oogbal Grootte
- </string>
- <string name="Eyebrow Arc">
- Wenkbrauw Boog
- </string>
- <string name="Eyebrow Density">
- Wenkbrauw Dichtheid
- </string>
- <string name="Eyebrow Height">
- Wenkbrauw Hoogte
- </string>
- <string name="Eyebrow Points">
- Wenkbrauw Punten
- </string>
- <string name="Eyebrow Size">
- Eyebrow Grootte
- </string>
- <string name="Eyelash Length">
- Eyelash Lengte
- </string>
- <string name="Eyeliner">
- Eyeliner
- </string>
- <string name="Eyeliner Color">
- Eyeliner Kleur
- </string>
- <string name="Eyes Back">
- Ogen Achteruit
- </string>
- <string name="Eyes Bugged">
- Insect Ogen
- </string>
- <string name="Eyes Forward">
- Ogen Vooruit
- </string>
- <string name="Eyes Long Head">
- Eyes Long Head
- </string>
- <string name="Eyes Shear Left Up">
- Eyes Shear Left Up
- </string>
- <string name="Eyes Shear Right Up">
- Eyes Shear Right Up
- </string>
- <string name="Eyes Short Head">
- Eyes Short Head
- </string>
- <string name="Eyes Spread">
- Eyes Spread
- </string>
- <string name="Eyes Sunken">
- Ingevallen Ogen
- </string>
- <string name="Eyes Together">
- Ogen Bij Elkaar
- </string>
- <string name="Face Shear">
- Gezicht Gelijkheid
- </string>
- <string name="Facial Definition">
- Gezichts Definitie
- </string>
- <string name="Far Set Eyes">
- Ogen Uit Elkaar
- </string>
- <string name="Fat">
- Dik
- </string>
- <string name="Fat Head">
- Dik Hoofd
- </string>
- <string name="Fat Lips">
- Dikke Lippen
- </string>
- <string name="Fat Lower">
- Fat Lower
- </string>
- <string name="Fat Lower Lip">
- Fat Lower Lip
- </string>
- <string name="Fat Torso">
- Fat Torso
- </string>
- <string name="Fat Upper">
- Fat Upper
- </string>
- <string name="Fat Upper Lip">
- Dikke Boven Lip
- </string>
- <string name="Female">
- Vrouw
- </string>
- <string name="Fingerless">
- Vingerloos
- </string>
- <string name="Fingers">
- Vingers
- </string>
- <string name="Flared Cuffs">
- Verbrede Vorm
- </string>
- <string name="Flat">
- Plat
- </string>
- <string name="Flat Butt">
- Platte Kont
- </string>
- <string name="Flat Head">
- Plat Hoofd
- </string>
- <string name="Flat Toe">
- Platte Teen
- </string>
- <string name="Foot Size">
- Voet Grootte
- </string>
- <string name="Forehead Angle">
- Voorhoofd Hoek
- </string>
- <string name="Forehead Heavy">
- Zwaar Voorhoofd
- </string>
- <string name="Freckles">
- Sproeten
- </string>
- <string name="Front Bangs Down">
- Voorkant Pony Omlaag
- </string>
- <string name="Front Bangs Up">
- Voorkant Pony Omhoog
- </string>
- <string name="Front Fringe">
- Voorste Rand
- </string>
- <string name="Front Hair">
- Gezichtshaar
- </string>
- <string name="Front Hair Down">
- Gezichtshaar Omlaag
- </string>
- <string name="Front Hair Up">
- Gezichtshaar Omhoog
- </string>
- <string name="Full Back">
- Volle Achterkant
- </string>
- <string name="Full Eyeliner">
- Volle Eyeliner
- </string>
- <string name="Full Front">
- Volle Voorkant
- </string>
- <string name="Full Hair Sides">
- Full Hair Sides
- </string>
- <string name="Full Sides">
- Volle Zijkanten
- </string>
- <string name="Glossy">
- Glanzend
- </string>
- <string name="Glove Fingers">
- Vinger Handschoenen
- </string>
- <string name="Glove Length">
- Handschoen Lengte
- </string>
- <string name="Hair">
- Haar
- </string>
- <string name="Hair Back">
- Haar: Zwart
- </string>
- <string name="Hair Front">
- Haar: Voorkant
- </string>
- <string name="Hair Sides">
- Haar: Zijkant
- </string>
- <string name="Hair Sweep">
- Hair Sweep
- </string>
- <string name="Hair Thickess">
- Haar Dikheid
- </string>
- <string name="Hair Thickness">
- Hair Dikheid
- </string>
- <string name="Hair Tilt">
- Hair Tilt
- </string>
- <string name="Hair Tilted Left">
- Hair Tilted Left
- </string>
- <string name="Hair Tilted Right">
- Hair Tilted Right
- </string>
- <string name="Hair Volume">
- Haar: Volume
- </string>
- <string name="Hand Size">
- Hand Grootte
- </string>
- <string name="Handlebars">
- Handlebars
- </string>
- <string name="Head Length">
- Hoofd Lengte
- </string>
- <string name="Head Shape">
- Hoofd Vorm
- </string>
- <string name="Head Size">
- Hooft Grootte
- </string>
- <string name="Head Stretch">
- Hoofd Uitrekken
- </string>
- <string name="Heel Height">
- Hiel Hoogte
- </string>
- <string name="Heel Shape">
- Hiel Vorm
- </string>
- <string name="Height">
- Hoogte
- </string>
- <string name="High">
- Hoog
- </string>
- <string name="High Heels">
- Hoge Hielen
- </string>
- <string name="High Jaw">
- Hoge Kaak
- </string>
- <string name="High Platforms">
- High Platforms
- </string>
- <string name="High and Tight">
- Hoog en Strak
- </string>
- <string name="Higher">
- Hoger
- </string>
- <string name="Hip Length">
- Heup Lengte
- </string>
- <string name="Hip Width">
- Heup Breedte
- </string>
- <string name="In">
- Naar Binnen
- </string>
- <string name="In Shdw Color">
- Binnenste Schaduw Kleur
- </string>
- <string name="In Shdw Opacity">
- Binnenste Schaduw Opaciteit
- </string>
- <string name="Inner Eye Corner">
- Binnenste Oog Hoek
- </string>
- <string name="Inner Eye Shadow">
- Binnenste Oog Schaduw
- </string>
- <string name="Inner Shadow">
- Binnenste Schaduw
- </string>
- <string name="Jacket Length">
- Jas Lengte
- </string>
- <string name="Jacket Wrinkles">
- Jas Rimpels
- </string>
- <string name="Jaw Angle">
- Kaak Hoek
- </string>
- <string name="Jaw Jut">
- Jaw Jut
- </string>
- <string name="Jaw Shape">
- Kaak Vorm
- </string>
- <string name="Join">
- Samenvoegen
- </string>
- <string name="Jowls">
- Kaken
- </string>
- <string name="Knee Angle">
- Knie Hoek
- </string>
- <string name="Knock Kneed">
- Knieën Naar binnen
- </string>
- <string name="Large">
- Fors
- </string>
- <string name="Large Hands">
- Grote Handen
- </string>
- <string name="Left Part">
- Linker Deel
- </string>
- <string name="Leg Length">
- Been Lengte
- </string>
- <string name="Leg Muscles">
- Been Spieren
- </string>
- <string name="Less">
- Minder
- </string>
- <string name="Less Body Fat">
- Minder Lichaams Vet
- </string>
- <string name="Less Curtains">
- Less Curtains
- </string>
- <string name="Less Freckles">
- Minder Sproeten
- </string>
- <string name="Less Full">
- Minder Vol
- </string>
- <string name="Less Gravity">
- Minder Zwaartekracht
- </string>
- <string name="Less Love">
- Less Love
- </string>
- <string name="Less Muscles">
- Minder Spieren
- </string>
- <string name="Less Muscular">
- Minder Spieren
- </string>
- <string name="Less Rosy">
- Minder Rooskleurig
- </string>
- <string name="Less Round">
- Minder Rond
- </string>
- <string name="Less Saddle">
- Minder Heupen
- </string>
- <string name="Less Square">
- Minder Vierkant
- </string>
- <string name="Less Volume">
- Minder Volume
- </string>
- <string name="Less soul">
- Minder Ziel
- </string>
- <string name="Lighter">
- Lichter
- </string>
- <string name="Lip Cleft">
- Gespleten Lip
- </string>
- <string name="Lip Cleft Depth">
- Gespleten Lip Diepte
- </string>
- <string name="Lip Fullness">
- Lip Volheid
- </string>
- <string name="Lip Pinkness">
- Rozeheid Lippen
- </string>
- <string name="Lip Ratio">
- Lip Ratio
- </string>
- <string name="Lip Thickness">
- Lip Dikheid
- </string>
- <string name="Lip Width">
- Lip Breedte
- </string>
- <string name="Lipgloss">
- Lipgloss
- </string>
- <string name="Lipstick">
- Lipstick
- </string>
- <string name="Lipstick Color">
- Lipstick Kleur
- </string>
- <string name="Long">
- Lang
- </string>
- <string name="Long Head">
- Lang Hoofd
- </string>
- <string name="Long Hips">
- Lange Heupen
- </string>
- <string name="Long Legs">
- Lange Benen
- </string>
- <string name="Long Neck">
- Lange Nek
- </string>
- <string name="Long Pigtails">
- Long Pigtails
- </string>
- <string name="Long Ponytail">
- Lange Paardenstaart
- </string>
- <string name="Long Torso">
- Lang Torso
- </string>
- <string name="Long arms">
- Lange Armen
- </string>
- <string name="Longcuffs">
- Longcuffs
- </string>
- <string name="Loose Pants">
- Losse Broek
- </string>
- <string name="Loose Shirt">
- Los Shirt
- </string>
- <string name="Loose Sleeves">
- Losse Mouwen
- </string>
- <string name="Love Handles">
- Love Handles
- </string>
- <string name="Low">
- Laag
- </string>
- <string name="Low Heels">
- Lage Hielen
- </string>
- <string name="Low Jaw">
- Lage Kaak
- </string>
- <string name="Low Platforms">
- Lage Platforms
- </string>
- <string name="Low and Loose">
- Laag en Los
- </string>
- <string name="Lower">
- Lager
- </string>
- <string name="Lower Bridge">
- Lagere Brug
- </string>
- <string name="Lower Cheeks">
- Lagere Wangen
- </string>
- <string name="Male">
- Man
- </string>
- <string name="Middle Part">
- Middelste Deel
- </string>
- <string name="More">
- Meer
- </string>
- <string name="More Blush">
- Meer Blozen
- </string>
- <string name="More Body Fat">
- Meer Lichaams Vet
- </string>
- <string name="More Curtains">
- More Curtains
- </string>
- <string name="More Eyeshadow">
- Meer Oogshadow
- </string>
- <string name="More Freckles">
- Meer Sproeten
- </string>
- <string name="More Full">
- Meer Vol
- </string>
- <string name="More Gravity">
- Meer Zwaartekracht
- </string>
- <string name="More Lipstick">
- Meer Lippenstift
- </string>
- <string name="More Love">
- Meer Lovehandels
- </string>
- <string name="More Lower Lip">
- Meer Onder Lip
- </string>
- <string name="More Muscles">
- Meer Spieren
- </string>
- <string name="More Muscular">
- Meer Spieren
- </string>
- <string name="More Rosy">
- More Rosy
- </string>
- <string name="More Round">
- Meer Rond
- </string>
- <string name="More Saddle">
- Meer Heupen
- </string>
- <string name="More Sloped">
- Meer Hellend
- </string>
- <string name="More Square">
- Meer Vierkant
- </string>
- <string name="More Upper Lip">
- Meer Boven Lip
- </string>
- <string name="More Vertical">
- Meer Verticaal
- </string>
- <string name="More Volume">
- Meer Volume
- </string>
- <string name="More soul">
- Meer ziel
- </string>
- <string name="Moustache">
- Snor
- </string>
- <string name="Mouth Corner">
- Mond Hoek
- </string>
- <string name="Mouth Position">
- Mond Positie
- </string>
- <string name="Mowhawk">
- Hanekam
- </string>
- <string name="Muscular">
- Gespiert
- </string>
- <string name="Mutton Chops">
- Mutton Chops
- </string>
- <string name="Nail Polish">
- Nagel Lak
- </string>
- <string name="Nail Polish Color">
- Nagel Lak Kleur
- </string>
- <string name="Narrow">
- Smal
- </string>
- <string name="Narrow Back">
- Smalle Achterkant
- </string>
- <string name="Narrow Front">
- Smalle Voorkant
- </string>
- <string name="Narrow Lips">
- Smalle Lippen
- </string>
- <string name="Natural">
- Natural
- </string>
- <string name="Neck Length">
- Nek Lengte
- </string>
- <string name="Neck Thickness">
- Nek Dikheid
- </string>
- <string name="No Blush">
- Geen Bloos
- </string>
- <string name="No Eyeliner">
- Geen Eyeliner
- </string>
- <string name="No Eyeshadow">
- Geen Oogschaduw
- </string>
- <string name="No Heels">
- Geen Hakken
- </string>
- <string name="No Lipgloss">
- Geen Lipgloss
- </string>
- <string name="No Lipstick">
- Geen Lippenstift
- </string>
- <string name="No Part">
- Geen Deel
- </string>
- <string name="No Polish">
- Geen Glans
- </string>
- <string name="No Red">
- Geen Rood
- </string>
- <string name="No Spikes">
- Geen Stekels
- </string>
- <string name="No White">
- Geen Wit
- </string>
- <string name="No Wrinkles">
- Geen Rimpels
- </string>
- <string name="Normal Lower">
- Normaal Onder
- </string>
- <string name="Normal Upper">
- Normaal Boven
- </string>
- <string name="Nose Left">
- Neus Links
- </string>
- <string name="Nose Right">
- Neus Rechts
- </string>
- <string name="Nose Size">
- Neus Grootte
- </string>
- <string name="Nose Thickness">
- Neus Dickheid
- </string>
- <string name="Nose Tip Angle">
- Neus Top Hoek
- </string>
- <string name="Nose Tip Shape">
- Neus Top Vorm
- </string>
- <string name="Nose Width">
- Neus Breedte
- </string>
- <string name="Nostril Division">
- Nostril Division
- </string>
- <string name="Nostril Width">
- Neusgat Breedte
- </string>
- <string name="Old">
- Oud
- </string>
- <string name="Opaque">
- Ondoorzichtig
- </string>
- <string name="Open">
- Open
- </string>
- <string name="Open Back">
- Open Achterkant
- </string>
- <string name="Open Front">
- Open Voorkant
- </string>
- <string name="Open Left">
- Open Links
- </string>
- <string name="Open Right">
- Open Rechts
- </string>
- <string name="Orange">
- Oranje
- </string>
- <string name="Out">
- Uit
- </string>
- <string name="Out Shdw Color">
- Buitenste Schaduw Kleur
- </string>
- <string name="Out Shdw Opacity">
- Buitenste Schaduw Opaciteit
- </string>
- <string name="Outer Eye Corner">
- Buitenste Oog Hoek
- </string>
- <string name="Outer Eye Shadow">
- Buitenste Oog Schaduw
- </string>
- <string name="Outer Shadow">
- Buitenste Schaduw
- </string>
- <string name="Overbite">
- Overbeet
- </string>
- <string name="Package">
- Genitaliën
- </string>
- <string name="Painted Nails">
- Gelakte Nagels
- </string>
- <string name="Pale">
- Dof
- </string>
- <string name="Pants Crotch">
- Broek Kruis
- </string>
- <string name="Pants Fit">
- Broek Passend
- </string>
- <string name="Pants Length">
- Broek Lengte
- </string>
- <string name="Pants Waist">
- Broek Teille
- </string>
- <string name="Pants Wrinkles">
- Broek Rimpels
- </string>
- <string name="Part">
- Deel
- </string>
- <string name="Part Bangs">
- Part Bangs
- </string>
- <string name="Pectorals">
- Borstspieren
- </string>
- <string name="Pigment">
- Pigment
- </string>
- <string name="Pigtails">
- Pigtails
- </string>
- <string name="Pink">
- Roze
- </string>
- <string name="Pinker">
- Rozer
- </string>
- <string name="Platform Height">
- Platform Hoogte
- </string>
- <string name="Platform Width">
- Platform Breedte
- </string>
- <string name="Pointy">
- Puntig
- </string>
- <string name="Pointy Heels">
- Puntige Hielen
- </string>
- <string name="Pointy Toe">
- Puntige Tenen
- </string>
- <string name="Ponytail">
- Paardenstaard
- </string>
- <string name="Poofy Skirt">
- Poofy Skirt
- </string>
- <string name="Pop Left Eye">
- Asymmetrisch Links
- </string>
- <string name="Pop Right Eye">
- Asymmetrisch Rechts
- </string>
- <string name="Puffy">
- Opgezwollen
- </string>
- <string name="Puffy Eyelids">
- Opgezwollen Oogleden
- </string>
- <string name="Rainbow Color">
- Regenboog Kleur
- </string>
- <string name="Red Hair">
- Rood Haar
- </string>
- <string name="Red Skin">
- Rode Huid
- </string>
- <string name="Regular">
- Normaal
- </string>
- <string name="Regular Muscles">
- Normale Spieren
- </string>
- <string name="Right Part">
- Rechter Deel
- </string>
- <string name="Rosy Complexion">
- Rosy Complexion
- </string>
- <string name="Round">
- Rond
- </string>
- <string name="Round Forehead">
- Rond Voorhoofd
- </string>
- <string name="Ruddiness">
- Rossige kleur
- </string>
- <string name="Ruddy">
- Rossig
- </string>
- <string name="Rumpled Hair">
- Rumpled Hair
- </string>
- <string name="Saddle Bags">
- Saddle Bags
- </string>
- <string name="Saddlebags">
- Saddlebags
- </string>
- <string name="Scrawny">
- Magere
- </string>
- <string name="Scrawny Leg">
- Mager Been
- </string>
- <string name="Separate">
- Scheiden
- </string>
- <string name="Shading">
- Shading
- </string>
- <string name="Shadow hair">
- Schaduw Haar
- </string>
- <string name="Shallow">
- Ondiep
- </string>
- <string name="Shear Back">
- Shear Back
- </string>
- <string name="Shear Face">
- Shear Face
- </string>
- <string name="Shear Front">
- Shear Front
- </string>
- <string name="Shear Left">
- Shear Left
- </string>
- <string name="Shear Left Up">
- Shear Left Up
- </string>
- <string name="Shear Right">
- Shear Right
- </string>
- <string name="Shear Right Up">
- Shear Right Up
- </string>
- <string name="Sheared Back">
- Sheared Back
- </string>
- <string name="Sheared Front">
- Sheared Front
- </string>
- <string name="Shift Left">
- Verplaats Links
- </string>
- <string name="Shift Mouth">
- Verplaats Mond
- </string>
- <string name="Shift Right">
- Verplaats Rechts
- </string>
- <string name="Shirt Bottom">
- Hemd Onderkant
- </string>
- <string name="Shirt Fit">
- Hemd Passend
- </string>
- <string name="Shirt Wrinkles">
- Hemd Rimpels
- </string>
- <string name="Shoe Height">
- Schoen Hoogte
- </string>
- <string name="Short">
- Kort
- </string>
- <string name="Short Arms">
- Korte Armen
- </string>
- <string name="Short Legs">
- Korte Benen
- </string>
- <string name="Short Neck">
- Korte Nek
- </string>
- <string name="Short Pigtails">
- Short Pigtails
- </string>
- <string name="Short Ponytail">
- Korte Paardenstaart
- </string>
- <string name="Short Sideburns">
- Korte Bakkebaarden
- </string>
- <string name="Short Torso">
- Korte Torso
- </string>
- <string name="Short hips">
- Korte Heupen
- </string>
- <string name="Shoulders">
- Shouders
- </string>
- <string name="Side Bangs">
- Side Bangs
- </string>
- <string name="Side Bangs Down">
- Side Bangs Down
- </string>
- <string name="Side Bangs Up">
- Side Bangs Up
- </string>
- <string name="Side Fringe">
- Side Fringe
- </string>
- <string name="Sideburns">
- Bakkebaarden
- </string>
- <string name="Sides Hair">
- Sides Hair
- </string>
- <string name="Sides Hair Down">
- Sides Hair Down
- </string>
- <string name="Sides Hair Up">
- Sides Hair Up
- </string>
- <string name="Skinny">
- Broodmager
- </string>
- <string name="Skinny Neck">
- Smalle Nek
- </string>
- <string name="Skirt Fit">
- Skirt Fit
- </string>
- <string name="Skirt Length">
- Rok Lengte
- </string>
- <string name="Slanted Forehead">
- Schuin voorhoofd
- </string>
- <string name="Sleeve Length">
- Mouw Lengte
- </string>
- <string name="Sleeve Looseness">
- Mouw Losheid
- </string>
- <string name="Slit Back">
- Spleet: Achter
- </string>
- <string name="Slit Front">
- Spleet: Voor
- </string>
- <string name="Slit Left">
- Spleet: Links
- </string>
- <string name="Slit Right">
- Spleet: Rechts
- </string>
- <string name="Small">
- Klein
- </string>
- <string name="Small Hands">
- Kleine Handen
- </string>
- <string name="Small Head">
- Klein Hoofd
- </string>
- <string name="Smooth">
- Glad
- </string>
- <string name="Smooth Hair">
- Glad Haar
- </string>
- <string name="Socks Length">
- Sok Lengte
- </string>
- <string name="Some">
- enkele
- </string>
- <string name="Soulpatch">
- Soulpatch
- </string>
- <string name="Sparse">
- Schaars
- </string>
- <string name="Spiked Hair">
- Puntig Haar
- </string>
- <string name="Square">
- Vierkant
- </string>
- <string name="Square Toe">
- Vierkante Teen
- </string>
- <string name="Squash Head">
- Squash Head
- </string>
- <string name="Squash/Stretch Head">
- Squash/Stretch Head
- </string>
- <string name="Stretch Head">
- Uitgerekt Hoofd
- </string>
- <string name="Sunken">
- Verzonken
- </string>
- <string name="Sunken Chest">
- Verzonken Borstkas
- </string>
- <string name="Sunken Eyes">
- Verzonken Ogen
- </string>
- <string name="Sweep Back">
- Sweep Back
- </string>
- <string name="Sweep Forward">
- Sweep Forward
- </string>
- <string name="Swept Back">
- Swept Back
- </string>
- <string name="Swept Back Hair">
- Swept Back Hair
- </string>
- <string name="Swept Forward">
- Swept Forward
- </string>
- <string name="Swept Forward Hair">
- Swept Forward Hair
- </string>
- <string name="Tall">
- Lang
- </string>
- <string name="Taper Back">
- Spits Achter
- </string>
- <string name="Taper Front">
- Spits Voor
- </string>
- <string name="Thick Heels">
- Dikke Hielen
- </string>
- <string name="Thick Neck">
- Dikke Nek
- </string>
- <string name="Thick Toe">
- Dikke Teen
- </string>
- <string name="Thickness">
- Dikheid
- </string>
- <string name="Thin">
- Dun
- </string>
- <string name="Thin Eyebrows">
- Dunne Wenkbrouwen
- </string>
- <string name="Thin Lips">
- Dunne Lippen
- </string>
- <string name="Thin Nose">
- Dunne Neus
- </string>
- <string name="Tight Chin">
- Strakke Kin
- </string>
- <string name="Tight Cuffs">
- Strakke Manchetten
- </string>
- <string name="Tight Pants">
- Strakke Broek
- </string>
- <string name="Tight Shirt">
- Strak Hemd
- </string>
- <string name="Tight Skirt">
- Strakke Rok
- </string>
- <string name="Tight Sleeves">
- Strakke Mouwen
- </string>
- <string name="Tilt Left">
- Tilt Left
- </string>
- <string name="Tilt Right">
- Tilt Right
- </string>
- <string name="Toe Shape">
- Teen Vorm
- </string>
- <string name="Toe Thickness">
- Teen Dikheid
- </string>
- <string name="Torso Length">
- Borstkas Lengte
- </string>
- <string name="Torso Muscles">
- Borstkas Spieren
- </string>
- <string name="Torso Scrawny">
- Magere Borstkas
- </string>
- <string name="Unattached">
- Niet Verbonden
- </string>
- <string name="Uncreased">
- Uncreased
- </string>
- <string name="Underbite">
- onderbeet
- </string>
- <string name="Unnatural">
- Onnatuurlijk
- </string>
- <string name="Upper Bridge">
- Boven Brug
- </string>
- <string name="Upper Cheeks">
- Bovenste Wangen
- </string>
- <string name="Upper Chin Cleft">
- Bovenste Kin Gespleten
- </string>
- <string name="Upper Eyelid Fold">
- Bovenste Ooglid Gevouwen
- </string>
- <string name="Upturned">
- Omgekeerde
- </string>
- <string name="Very Red">
- Erg Rood
- </string>
- <string name="Waist Height">
- Taille Hoogte
- </string>
- <string name="Well-Fed">
- Goed Gevoed
- </string>
- <string name="White Hair">
- Wit Haar
- </string>
- <string name="Wide">
- Breed
- </string>
- <string name="Wide Back">
- Breede Achterkant
- </string>
- <string name="Wide Front">
- Breed Voorkant
- </string>
- <string name="Wide Lips">
- Breed Lippen
- </string>
- <string name="Wild">
- Wild
- </string>
- <string name="Wrinkles">
- Rimpels
- </string>
- <string name="LocationCtrlAddLandmarkTooltip">
- Add to My Landmarks
- </string>
- <string name="LocationCtrlEditLandmarkTooltip">
- Edit My Landmark
- </string>
- <string name="LocationCtrlInfoBtnTooltip">
- See more info about the current location
- </string>
- <string name="LocationCtrlComboBtnTooltip">
- My location history
- </string>
- <string name="UpdaterWindowTitle">
- [APP_NAME] Update
- </string>
- <string name="UpdaterNowUpdating">
- Now updating [APP_NAME]...
- </string>
- <string name="UpdaterNowInstalling">
- Installing [APP_NAME]...
- </string>
- <string name="UpdaterUpdatingDescriptive">
- Your [APP_NAME] Viewer is being updated to the latest release. This may take some time, so please be patient.
- </string>
- <string name="UpdaterProgressBarTextWithEllipses">
- Downloading update...
- </string>
- <string name="UpdaterProgressBarText">
- Downloading update
- </string>
- <string name="UpdaterFailDownloadTitle">
- Failed to download update
- </string>
- <string name="UpdaterFailUpdateDescriptive">
- An error occurred while updating [APP_NAME]. Please download the latest version from www.secondlife.com.
- </string>
- <string name="UpdaterFailInstallTitle">
- Failed to install update
- </string>
- <string name="UpdaterFailStartTitle">
- Failed to start viewer
- </string>
- <string name="IM_logging_string">
- -- Instant message logging enabled --
- </string>
- <string name="IM_typing_start_string">
- [NAME] is typing...
- </string>
- <string name="Unnamed">
- (Unnamed)
- </string>
- <string name="IM_moderated_chat_label">
- (Moderated: Voices off by default)
- </string>
- <string name="IM_unavailable_text_label">
- Text chat is not available for this call.
- </string>
- <string name="IM_muted_text_label">
- Your text chat has been disabled by a Group Moderator.
- </string>
- <string name="IM_default_text_label">
- Click here to instant message.
- </string>
- <string name="IM_to_label">
- To
- </string>
- <string name="IM_moderator_label">
- (Moderator)
- </string>
- <string name="only_user_message">
- U bent de enige gebruiker in deze sessie.
- </string>
- <string name="offline_message">
- [NAME] is offline.
- </string>
- <string name="invite_message">
- Klik de [BUTTON NAME] knop om deze voicechat te accepteren/verbinden.
- </string>
- <string name="generic_request_error">
- Fout tijdens het maken van het verzoek, probeer het later nog een keer.
- </string>
- <string name="insufficient_perms_error">
- U heeft niet voldoende permissies.
- </string>
- <string name="session_does_not_exist_error">
- De sessie bestaat niet meer
- </string>
- <string name="no_ability_error">
- U beschikt niet over die mogelijkheid.
- </string>
- <string name="no_ability">
- U beschikt niet over die mogelijkheid.
- </string>
- <string name="not_a_mod_error">
- U bent geen sessie moderateur
- </string>
- <string name="muted_error">
- Een groepsmoderator heeft uw textchat uitgeschakeld.
- </string>
- <string name="add_session_event">
- Kan geen gebruikers toevoegen aan chatsessie met [RECIPIENT].
- </string>
- <string name="message_session_event">
- Kan uw bericht niet versturen naar de chatsessie met [RECIPIENT].
- </string>
- <string name="removed_from_group">
- U bent verwijderd uit de groep.
- </string>
- <string name="close_on_no_ability">
- U heeft niet langer de mogelijkheid om in deze chatsessie te zijn.
- </string>
-</strings>
diff --git a/indra/newview/skins/default/xui/nl/teleport_strings.xml b/indra/newview/skins/default/xui/nl/teleport_strings.xml
deleted file mode 100644
index 12a81447c0..0000000000
--- a/indra/newview/skins/default/xui/nl/teleport_strings.xml
+++ /dev/null
@@ -1,75 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<teleport_messages>
- <message_set name="errors">
- <message name="invalid_tport">
- Probleem ondervonden bij het verwerken van uw verzoek voor een teleport. Het kan nodig zijn om opnieuw in te loggen voordat u kunt teleporteren.
-Als u dit bericht blijft krijgen, controleert u dan alstublieft [SUPPORT_SITE].
- </message>
- <message name="invalid_region_handoff">
- Er is een probleem opgetreden bij het oversteken naar een andere regio. U dient wellicht opnieuw in te loggen voor uw kunt oversteken naar andere regio&apos;s.
-Als u dit bericht blijft krijgen, controleert u dan alstublieft [SUPPORT_SITE].
- </message>
- <message name="blocked_tport">
- Sorry, teleport is momenteel geblokkeerd. Probeer het zo meteen opnieuw. Indien u nog steeds niet kunt teleporteren, log dan alstublieft uit en weer in om het probleem te verhelpen.
- </message>
- <message name="nolandmark_tport">
- Sorry, het systeem was niet in staat de bestemming van de landmarkering te vinden.
- </message>
- <message name="timeout_tport">
- Sorry, het systeem was niet in staat om de teleport verbinding af te ronden. Probeer het zo meteen nog een keer.
- </message>
- <message name="noaccess_tport">
- Sorry, u heeft geen toegang tot die teleportbestemming.
- </message>
- <message name="missing_attach_tport">
- Uw bevestigingen zijn nog niet gearriveerd. Probeer nog een aantal seconden te wachten of log uit en weer in voor u probeert te teleporteren.
- </message>
- <message name="too_many_uploads_tport">
- De assetwachtrij in deze regio is momenteel volgelopen, dus uw teleportverzoek zal niet tijdig afgerond kunnen worden. Probeer het alstublieft opnieuw over een aantal minuten of ga naar een minder druk gebied.
- </message>
- <message name="expired_tport">
- Sorry, het systeem was niet in staat uw teleportverzoek tijdig af te ronden. Probeer het alstublieft opnieuw over een aantal minuten.
- </message>
- <message name="expired_region_handoff">
- Sorry, het systeem was niet in staat om het oversteken naar een andere regio tijdig af te ronden. Probeer het alstublieft opnieuw over een aantal minuten.
- </message>
- <message name="no_host">
- Kan teleportbestemming niet vinden. De bestemming is mogelijk tijdelijk niet beschikbaar of bestaat niet meer. Probeer het alstublieft opnieuw over een aantal minuten.
- </message>
- <message name="no_inventory_host">
- Het inventarissysteem is momenteel niet beschikbaar.
- </message>
- </message_set>
- <message_set name="progress">
- <message name="sending_dest">
- Verzenden naar bestemming
- </message>
- <message name="redirecting">
- U wordt doorverwezen naar andere locatie.
- </message>
- <message name="relaying">
- Omschakelen naar bestemming.
- </message>
- <message name="sending_home">
- Thuislocatieverzoek verzenden
- </message>
- <message name="sending_landmark">
- Landmarkeringlocatieverzoek verzenden
- </message>
- <message name="completing">
- Teleport voltooien
- </message>
- <message name="resolving">
- Bestemming bepalen.
- </message>
- <message name="contacting">
- Contact maken met nieuwe regio.
- </message>
- <message name="arriving">
- Arriveren…
- </message>
- <message name="requesting">
- Teleport aanvragen…
- </message>
- </message_set>
-</teleport_messages>
diff --git a/indra/newview/skins/default/xui/pl/floater_about.xml b/indra/newview/skins/default/xui/pl/floater_about.xml
index 637325ddd0..409429ffaa 100644
--- a/indra/newview/skins/default/xui/pl/floater_about.xml
+++ b/indra/newview/skins/default/xui/pl/floater_about.xml
@@ -10,7 +10,7 @@
<floater.string name="AboutPosition">
Położenie [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1] w [REGION] zlokalizowanym w &lt;nolink&gt;[HOSTNAME]&lt;/nolink&gt; ([HOSTIP])
[SERVER_VERSION]
-[[SERVER_RELEASE_NOTES_URL] [ReleaseNotes]]
+[SERVER_RELEASE_NOTES_URL]
</floater.string>
<floater.string name="AboutSystem">
Procesor: [CPU]
diff --git a/indra/newview/skins/default/xui/pl/floater_buy_currency.xml b/indra/newview/skins/default/xui/pl/floater_buy_currency.xml
index f2a6579dc3..3e51761b37 100644
--- a/indra/newview/skins/default/xui/pl/floater_buy_currency.xml
+++ b/indra/newview/skins/default/xui/pl/floater_buy_currency.xml
@@ -46,7 +46,7 @@
[AMT]L$
</text>
<text name="currency_links">
- [http://www.secondlife.com/my/account/payment_method_management.php metoda płatności] | [http://www.secondlife.com/my/account/currency.php waluta] | [http://www.secondlife.com/my/account/exchange_rates.php kurs wymiany]
+ [http://www.secondlife.com/my/account/payment_method_management.php metoda płatności] | [http://www.secondlife.com/my/account/currency.php waluta]
</text>
<text name="exchange_rate_note">
Wpisz ponownie kwotę aby zobaczyć ostatni kurs wymiany.
diff --git a/indra/newview/skins/default/xui/pl/floater_camera.xml b/indra/newview/skins/default/xui/pl/floater_camera.xml
index 5b9dd47616..60f3cd0fff 100644
--- a/indra/newview/skins/default/xui/pl/floater_camera.xml
+++ b/indra/newview/skins/default/xui/pl/floater_camera.xml
@@ -9,15 +9,6 @@
<floater.string name="move_tooltip">
Poruszaj kamerą w dół/górę oraz w prawo/lewo
</floater.string>
- <floater.string name="camera_modes_title">
- Ustawienia
- </floater.string>
- <floater.string name="pan_mode_title">
- W prawo lub w lewo
- </floater.string>
- <floater.string name="presets_mode_title">
- Ustaw widok
- </floater.string>
<floater.string name="free_mode_title">
Zobacz obiekt
</floater.string>
diff --git a/indra/newview/skins/default/xui/pl/floater_nearby_chat.xml b/indra/newview/skins/default/xui/pl/floater_nearby_chat.xml
index 7dc3e1f22e..214d465f1c 100644
--- a/indra/newview/skins/default/xui/pl/floater_nearby_chat.xml
+++ b/indra/newview/skins/default/xui/pl/floater_nearby_chat.xml
@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="nearby_chat" title="CZAT LOKALNY">
- <check_box label="Tłumaczenie czatu (wspierane przez Google)" name="translate_chat_checkbox"/>
+ <check_box label="Tłumaczenie czatu" name="translate_chat_checkbox"/>
</floater>
diff --git a/indra/newview/skins/default/xui/pl/menu_viewer.xml b/indra/newview/skins/default/xui/pl/menu_viewer.xml
index fe4662c5a2..24c961fa26 100644
--- a/indra/newview/skins/default/xui/pl/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/pl/menu_viewer.xml
@@ -20,8 +20,6 @@
<menu_item_call label="Tryb oddalenia" name="Set Away"/>
<menu_item_call label="Tryb pracy" name="Set Busy"/>
</menu>
- <menu_item_call label="Zażądaj statusu administratora" name="Request Admin Options"/>
- <menu_item_call label="Wyłącz atatus administratora" name="Leave Admin Options"/>
<menu_item_call label="Wyłącz [APP_NAME]" name="Quit"/>
</menu>
<menu label="Komunikacja" name="Communicate">
@@ -36,11 +34,10 @@
<menu_item_check label="Szukaj" name="Search"/>
<menu_item_call label="Zrób zdjęcie" name="Take Snapshot"/>
<menu_item_call label="Zapamiętaj to miejsce (LM)" name="Create Landmark Here"/>
- <menu label="Miejsce" name="Land">
- <menu_item_call label="Profil miejsca" name="Place Profile"/>
- <menu_item_call label="O posiadłości" name="About Land"/>
- <menu_item_call label="Region/MajÄ…tek" name="Region/Estate"/>
- </menu>
+ <menu_item_separator/>
+ <menu_item_call label="Profil miejsca" name="Place Profile"/>
+ <menu_item_call label="O posiadłości" name="About Land"/>
+ <menu_item_call label="Region/MajÄ…tek" name="Region/Estate"/>
<menu_item_call label="Kup posiadłość" name="Buy Land"/>
<menu_item_call label="Moje posiadłości" name="My Land"/>
<menu label="Pokaż" name="LandShow">
@@ -56,7 +53,7 @@
</menu>
<menu_item_call label="Teleportuj do Miejsca Startu" name="Teleport Home"/>
<menu_item_call label="Ustaw Miejsce Startu" name="Set Home to Here"/>
- <menu label="Słońce" name="Environment Settings">
+ <menu label="Słońce" name="Sun">
<menu_item_call label="Wschód Słońca" name="Sunrise"/>
<menu_item_call label="Południe" name="Noon"/>
<menu_item_call label="Zachód Słońca" name="Sunset"/>
@@ -119,6 +116,7 @@
<menu_item_call label="dźwięk (L$[COST])..." name="Upload Sound"/>
<menu_item_call label="animacjÄ™ (L$[COST])..." name="Upload Animation"/>
<menu_item_call label="zbiór plików (L$[COST] za jeden plik)..." name="Bulk Upload"/>
+ <menu_item_call label="Ustaw domyślne pozwolenia ładowania" name="perm prefs"/>
</menu>
<menu_item_call label="Cofnij" name="Undo"/>
<menu_item_call label="Ponów" name="Redo"/>
@@ -152,22 +150,22 @@
<menu_item_check label="Pokaż celownik myszki" name="ShowCrosshairs"/>
</menu>
<menu label="Rodzaje renderowania" name="Rendering Types">
- <menu_item_check label="Podstawowe" name="Simple"/>
- <menu_item_check label="Maska alpha" name="Alpha"/>
- <menu_item_check label="Drzewo" name="Tree"/>
- <menu_item_check label="Awatary" name="Character"/>
- <menu_item_check label="Płaszczyzna powierzchni" name="SurfacePath"/>
- <menu_item_check label="Niebo" name="Sky"/>
- <menu_item_check label="Woda" name="Water"/>
- <menu_item_check label="Ziemia" name="Ground"/>
- <menu_item_check label="Głośność" name="Volume"/>
- <menu_item_check label="Trawa" name="Grass"/>
- <menu_item_check label="Chmury" name="Clouds"/>
- <menu_item_check label="CzÄ…steczki" name="Particles"/>
- <menu_item_check label="Zderzenie" name="Bump"/>
+ <menu_item_check label="Podstawowe" name="Rendering Type Simple"/>
+ <menu_item_check label="Maska alpha" name="Rendering Type Alpha"/>
+ <menu_item_check label="Drzewo" name="Rendering Type Tree"/>
+ <menu_item_check label="Awatary" name="Rendering Type Character"/>
+ <menu_item_check label="Płaszczyzna powierzchni" name="Rendering Type Surface Patch"/>
+ <menu_item_check label="Niebo" name="Rendering Type Sky"/>
+ <menu_item_check label="Woda" name="Rendering Type Water"/>
+ <menu_item_check label="Ziemia" name="Rendering Type Ground"/>
+ <menu_item_check label="Głośność" name="Rendering Type Volume"/>
+ <menu_item_check label="Trawa" name="Rendering Type Grass"/>
+ <menu_item_check label="Chmury" name="Rendering Type Clouds"/>
+ <menu_item_check label="CzÄ…steczki" name="Rendering Type Particles"/>
+ <menu_item_check label="Zderzenie" name="Rendering Type Bump"/>
</menu>
<menu label="Opcje renderowania" name="Rendering Features">
- <menu_item_check label="UI" name="UI"/>
+ <menu_item_check label="UI" name="ToggleUI"/>
<menu_item_check label="Zaznaczone" name="Selected"/>
<menu_item_check label="Podświetlenie" name="Highlighted"/>
<menu_item_check label="Tekstury dynamiczne" name="Dynamic Textures"/>
@@ -179,10 +177,7 @@
<menu_item_call label="Wyczyść bufor danych grupy" name="ClearGroupCache"/>
<menu_item_check label="Wygładzanie ruchu myszki" name="Mouse Smoothing"/>
<menu label="Skróty" name="Shortcuts">
- <menu_item_call label="Obraz (L$[COST])..." name="Upload Image"/>
- <menu_item_check label="Szukaj" name="Search"/>
<menu_item_call label="Zwolnij klawisze" name="Release Keys"/>
- <menu_item_call label="Domyślne ustawienia rozmiaru interfejsu" name="Set UI Size to Default"/>
<menu_item_check label="Pokaż menu Zaawansowane - skrót" name="Show Advanced Menu - legacy shortcut"/>
<menu_item_call label="Zamknij okno" name="Close Window"/>
<menu_item_call label="Zamknij wszystkie okna" name="Close All Windows"/>
@@ -191,13 +186,6 @@
<menu_item_check label="Wolna kamera" name="Joystick Flycam"/>
<menu_item_call label="Reset widoku" name="Reset View"/>
<menu_item_call label="Zobacz ostatniego rozmówcę" name="Look at Last Chatter"/>
- <menu label="Wybierz narzędzie budowania" name="Select Tool">
- <menu_item_call label="Narzędzie ogniskowej" name="Focus"/>
- <menu_item_call label="Narzędzie ruchu" name="Move"/>
- <menu_item_call label="Narzędzie edycji" name="Edit"/>
- <menu_item_call label="Stwórz narzędzie" name="Create"/>
- <menu_item_call label="Narzędzia posiadłości" name="Land"/>
- </menu>
<menu_item_call label="Przybliż" name="Zoom In"/>
<menu_item_call label="Domyślne przybliżenie" name="Zoom Default"/>
<menu_item_call label="Oddal" name="Zoom Out"/>
@@ -266,9 +254,8 @@
<menu_item_call label="Upuść pakiet pamięci" name="Drop a Packet"/>
</menu>
<menu_item_call label="Zderzenia, popchnięcia &amp; uderzenia" name="Bumps, Pushes &amp;amp; Hits"/>
- <menu label="Åšwiat" name="World">
+ <menu label="Åšwiat" name="DevelopWorld">
<menu_item_check label="Domyślne ustawienia środowiska Regionu" name="Sim Sun Override"/>
- <menu_item_check label="Efekty emiterów" name="Cheesy Beacon"/>
<menu_item_check label="Ustalona pogoda" name="Fixed Weather"/>
<menu_item_call label="Zachowaj bufor pamięci obiektów regionu" name="Dump Region Object Cache"/>
</menu>
@@ -290,11 +277,11 @@
</menu>
<menu label="Awatar" name="Character">
<menu label="Przesuń bakowaną teksturę" name="Grab Baked Texture">
- <menu_item_call label="Tęczówka oka" name="Iris"/>
- <menu_item_call label="Głowa" name="Head"/>
- <menu_item_call label="Górna część ciała" name="Upper Body"/>
- <menu_item_call label="Dolna część ciała" name="Lower Body"/>
- <menu_item_call label="Spódnica" name="Skirt"/>
+ <menu_item_call label="Tęczówka oka" name="Grab Iris"/>
+ <menu_item_call label="Głowa" name="Grab Head"/>
+ <menu_item_call label="Górna część ciała" name="Grab Upper Body"/>
+ <menu_item_call label="Dolna część ciała" name="Grab Lower Body"/>
+ <menu_item_call label="Spódnica" name="Grab Skirt"/>
</menu>
<menu label="Testy postaci" name="Character Tests">
<menu_item_call label="Przesuń geometrię postaci" name="Toggle Character Geometry"/>
@@ -315,8 +302,8 @@
<menu_item_check label="Pokaż menu administratora" name="View Admin Options"/>
</menu>
<menu label="Administrator" name="Admin">
- <menu label="Object">
- <menu_item_call label="Weź kopię" name="Take Copy"/>
+ <menu label="Object" name="AdminObject">
+ <menu_item_call label="Weź kopię" name="Admin Take Copy"/>
<menu_item_call label="Reset właściciela" name="Force Owner To Me"/>
<menu_item_call label="Reset przyzwolenia właściciela" name="Force Owner Permissive"/>
<menu_item_call label="Usuń" name="Delete"/>
diff --git a/indra/newview/skins/default/xui/pl/notifications.xml b/indra/newview/skins/default/xui/pl/notifications.xml
index 7d3225ea31..0194293642 100644
--- a/indra/newview/skins/default/xui/pl/notifications.xml
+++ b/indra/newview/skins/default/xui/pl/notifications.xml
@@ -946,7 +946,7 @@ Zaproponować znajomość [NAME]?
</form>
</notification>
<notification name="RemoveFromFriends">
- Czy chcesz usunąć [NAME] z listy znajomych?
+ Czy chcesz usunąć &lt;nolink&gt;[NAME]&lt;/nolink&gt; z listy znajomych?
<usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
</notification>
<notification name="RemoveMultipleFromFriends">
@@ -1385,7 +1385,7 @@ W celu instalacji aktualizacji musi zostać wykonany restart [APP_NAME].
<usetemplate ignoretext="Potwierdź zanim zwrócisz obiekty do ich właścicieli" name="okcancelignore" notext="Anuluj" yestext="OK"/>
</notification>
<notification name="GroupLeaveConfirmMember">
- Jesteś członkiem grupy [GROUP].
+ Jesteś członkiem grupy &lt;nolink&gt;[GROUP]&lt;/nolink&gt;.
Chcesz opuścić grupę?
<usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
</notification>
@@ -2078,10 +2078,10 @@ Zamieść go na stronie internetowej żeby umożliwić innym łatwy dostęp do t
Temat: [SUBJECT], Treść: [MESSAGE]
</notification>
<notification name="FriendOnline">
- [NAME] jest w Second Life
+ &lt;nolink&gt;[NAME]&lt;/nolink&gt; jest w Second Life
</notification>
<notification name="FriendOffline">
- [NAME] opuszcza Second Life
+ &lt;nolink&gt;[NAME]&lt;/nolink&gt; opuszcza Second Life
</notification>
<notification name="AddSelfFriend">
Nie możesz dodać siebie do listy znajomych.
@@ -2458,10 +2458,10 @@ Spróbuj ponowanie za kilka minut.
</form>
</notification>
<notification name="FriendshipAccepted">
- Twoja propozycja znajomości została przyjęta przez [NAME].
+ Twoja propozycja znajomości została przyjęta przez &lt;nolink&gt;[NAME]&lt;/nolink&gt;.
</notification>
<notification name="FriendshipDeclined">
- Twoja propozycja znajomości została odrzucona przez [NAME].
+ Twoja propozycja znajomości została odrzucona przez &lt;nolink&gt;[NAME]&lt;/nolink&gt;.
</notification>
<notification name="FriendshipAcceptedByMe">
Propozycja znajomości została zaakceptowana.
diff --git a/indra/newview/skins/default/xui/pl/panel_my_profile.xml b/indra/newview/skins/default/xui/pl/panel_my_profile.xml
deleted file mode 100644
index cdc833241d..0000000000
--- a/indra/newview/skins/default/xui/pl/panel_my_profile.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Profil" name="panel_profile">
- <string name="no_partner_text" value="Żadne"/>
- <string name="no_group_text" value="Żadne"/>
- <string name="RegisterDateFormat">
- [REG_DATE] ([AGE])
- </string>
- <string name="name_text_args">
- [NAME]
- </string>
- <string name="display_name_text_args">
- [DISPLAY_NAME]
- </string>
- <layout_stack name="layout">
- <layout_panel name="profile_stack">
- <scroll_container name="profile_scroll">
- <panel name="scroll_content_panel">
- <panel name="second_life_image_panel">
- <text name="display_name_descr_text">
- Nazwa użytkownika
- </text>
- <text name="name_descr_text">
- Wyświetlana nazwa
- </text>
- <button label="Profil" name="see_profile_btn" tool_tip="Zobacz profil tego awatara"/>
- </panel>
- </panel>
- </scroll_container>
- </layout_panel>
- </layout_stack>
-</panel>
diff --git a/indra/newview/skins/default/xui/pl/panel_notes.xml b/indra/newview/skins/default/xui/pl/panel_notes.xml
deleted file mode 100644
index 571171d64c..0000000000
--- a/indra/newview/skins/default/xui/pl/panel_notes.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Notatki &amp; Prywatność" name="panel_notes">
- <layout_stack name="layout">
- <layout_panel name="notes_stack">
- <scroll_container name="profile_scroll">
- <panel name="profile_scroll_panel">
- <text name="status_message" value="Notatki:"/>
- <text name="status_message2" value="Pozwól tej osobie na:"/>
- <check_box label="Widzenie mojego statusu" name="status_check"/>
- <check_box label="Lokalizowanie mnie na mapie" name="map_check"/>
- <check_box label="Edytowanie, kasowanie lub zabieranie moich obiektów" name="objects_check"/>
- </panel>
- </scroll_container>
- </layout_panel>
- <layout_panel name="notes_buttons_panel">
- <layout_stack name="bottom_bar_ls">
- <layout_panel name="add_friend_btn_lp">
- <button label="Dodaj do Znajomych" name="add_friend" tool_tip="Zaoferuj znajomość Rezydentowi"/>
- </layout_panel>
- <layout_panel name="im_btn_lp">
- <button label="IM" name="im" tool_tip="Otwórz wiadomości IM"/>
- </layout_panel>
- <layout_panel name="call_btn_lp">
- <button label="Dzwoń" name="call" tool_tip="Zadzwoń do Rezydenta"/>
- </layout_panel>
- <layout_panel name="show_on_map_btn_lp">
- <button label="Mapa" name="show_on_map_btn" tool_tip="Pokaż Rezydenta na mapie"/>
- </layout_panel>
- <layout_panel name="teleport_btn_lp">
- <button label="Teleportuj" name="teleport" tool_tip="Teleportuj"/>
- </layout_panel>
- </layout_stack>
- </layout_panel>
- </layout_stack>
-</panel>
diff --git a/indra/newview/skins/default/xui/pl/panel_preferences_chat.xml b/indra/newview/skins/default/xui/pl/panel_preferences_chat.xml
index 3251099f74..7fd1029e6a 100644
--- a/indra/newview/skins/default/xui/pl/panel_preferences_chat.xml
+++ b/indra/newview/skins/default/xui/pl/panel_preferences_chat.xml
@@ -31,7 +31,7 @@
<spinner label="Czas znikania czatu w pobliżu:" name="nearby_toasts_fadingtime"/>
<check_box name="translate_chat_checkbox"/>
<text name="translate_chb_label">
- Użyj translatora podczas rozmowy (wspierany przez Google)
+ Użyj translatora podczas rozmowy
</text>
<text name="translate_language_text">
Przetłumacz czat na:
@@ -51,7 +51,7 @@
<combo_box.item label="РуÑÑкий (Rosyjski)" name="Russian"/>
<combo_box.item label="Türkçe (Turecki)" name="Turkish"/>
<combo_box.item label="УкраїнÑька (UkraiÅ„ski)" name="Ukrainian"/>
- <combo_box.item label="中文 (简体) (Chiński)" name="Chinese"/>
+ <combo_box.item label="中文 (正體) (Chiński)" name="Chinese"/>
<combo_box.item label="日本語 (Japoński)" name="Japanese"/>
<combo_box.item label="한국어 (Koreański)" name="Korean"/>
</combo_box>
diff --git a/indra/newview/skins/default/xui/pl/panel_preferences_general.xml b/indra/newview/skins/default/xui/pl/panel_preferences_general.xml
index 44dcb2112c..fff56eab6e 100644
--- a/indra/newview/skins/default/xui/pl/panel_preferences_general.xml
+++ b/indra/newview/skins/default/xui/pl/panel_preferences_general.xml
@@ -11,7 +11,6 @@
<combo_box.item label="Español (Hiszpański) - Beta" name="Spanish"/>
<combo_box.item label="Français (Francuski) - Beta" name="French"/>
<combo_box.item label="Italiano (Włoski) - Beta" name="Italian"/>
- <combo_box.item label="Nederlands (Niderlandzki) - Beta" name="Dutch"/>
<combo_box.item label="Polski - Beta" name="Polish"/>
<combo_box.item label="Português (Portugalski) - Beta" name="Portugese"/>
<combo_box.item label="日本語 (Japoński) - Beta" name="(Japanese)"/>
diff --git a/indra/newview/skins/default/xui/pl/panel_profile.xml b/indra/newview/skins/default/xui/pl/panel_profile.xml
deleted file mode 100644
index 77dd951bc4..0000000000
--- a/indra/newview/skins/default/xui/pl/panel_profile.xml
+++ /dev/null
@@ -1,59 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Profil" name="panel_profile">
- <string name="no_partner_text" value="Brak"/>
- <string name="no_group_text" value="Żadne"/>
- <string name="RegisterDateFormat">
- [REG_DATE] ([AGE])
- </string>
- <string name="name_text_args">
- [NAME]
- </string>
- <string name="display_name_text_args">
- [DISPLAY_NAME]
- </string>
- <layout_stack name="layout">
- <layout_panel name="profile_stack">
- <scroll_container name="profile_scroll">
- <panel name="profile_scroll_panel">
- <panel name="second_life_image_panel">
- <text name="title_sl_descr_text" value="[SECOND_LIFE]:"/>
- </panel>
- <panel name="first_life_image_panel">
- <text name="title_rw_descr_text" value="Życie#1:"/>
- </panel>
- <text name="title_member_text" value="Urodziny:"/>
- <text name="title_acc_status_text" value="Konto:"/>
- <text name="title_partner_text" value="Partner:"/>
- <panel name="partner_data_panel">
- <text initial_value="(przetwarzanie)" name="partner_text"/>
- </panel>
- <text name="title_groups_text" value="Grupy:"/>
- </panel>
- </scroll_container>
- </layout_panel>
- </layout_stack>
- <layout_stack name="layout_verb_buttons">
- <layout_panel name="profile_buttons_panel">
- <layout_stack name="bottom_bar_ls">
- <layout_panel name="add_friend_btn_lp">
- <button label="Poznaj" name="add_friend" tool_tip="Zaproponuj znajomość Rezydentowi"/>
- </layout_panel>
- <layout_panel name="im_btn_lp">
- <button label="IM" name="im" tool_tip="Otwórz wiadomości IM"/>
- </layout_panel>
- <layout_panel name="call_btn_lp">
- <button label="Dzwoń" name="call" tool_tip="Zadzwoń do tego Rezydenta"/>
- </layout_panel>
- <layout_panel name="chat_btn_lp">
- <button label="Teleportuj" name="teleport" tool_tip="Teleportuj"/>
- </layout_panel>
- <layout_panel name="overflow_btn_lp">
- <menu_button label="▼" name="overflow_btn" tool_tip="Zapłać lub udostępnij obiekt Rezydentowi"/>
- </layout_panel>
- </layout_stack>
- </layout_panel>
- <layout_panel name="profile_me_buttons_panel">
- <button label="Edytuj profil" name="edit_profile_btn" tool_tip="Edytuj informacje o sobie"/>
- </layout_panel>
- </layout_stack>
-</panel>
diff --git a/indra/newview/skins/default/xui/pl/panel_profile_view.xml b/indra/newview/skins/default/xui/pl/panel_profile_view.xml
deleted file mode 100644
index 1fd6bc1d10..0000000000
--- a/indra/newview/skins/default/xui/pl/panel_profile_view.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="panel_target_profile">
- <string name="status_online">
- Obecnie w SL
- </string>
- <string name="status_offline">
- Nieaktywny
- </string>
- <text name="display_name_label" value="Wyświetlana nazwa:"/>
- <text name="solo_username_label" value="Nazwa użytkownika:"/>
- <text name="status" value="Obecnie w SL"/>
- <text name="user_name_small" value="Jack oh look at me this is a super duper long name"/>
- <button name="copy_to_clipboard" tool_tip="Kopiuj do schowka"/>
- <text name="user_label" value="Nazwa użytkownika:"/>
- <tab_container name="tabs">
- <panel label="PROFIL" name="panel_profile"/>
- <panel label="ULUBIONE" name="panel_picks"/>
- <panel label="NOTATKI &amp; PRYWATNOŚĆ" name="panel_notes"/>
- </tab_container>
-</panel>
diff --git a/indra/newview/skins/default/xui/pl/strings.xml b/indra/newview/skins/default/xui/pl/strings.xml
index 6a8309cca5..f6dec8536b 100644
--- a/indra/newview/skins/default/xui/pl/strings.xml
+++ b/indra/newview/skins/default/xui/pl/strings.xml
@@ -423,6 +423,9 @@
<string name="symbolic folder link">
link folderu
</string>
+ <string name="AvatarEditingAppearance">
+ (Edycja WyglÄ…d)
+ </string>
<string name="AvatarAway">
Åšpi
</string>
diff --git a/indra/newview/skins/default/xui/pl/teleport_strings.xml b/indra/newview/skins/default/xui/pl/teleport_strings.xml
index 57fb55bf4c..0366c3fdbc 100644
--- a/indra/newview/skins/default/xui/pl/teleport_strings.xml
+++ b/indra/newview/skins/default/xui/pl/teleport_strings.xml
@@ -19,6 +19,10 @@ Jeśli nadal nie możesz się teleportować wyloguj się i ponownie zaloguj.
<message name="timeout_tport">
Przepraszamy, ale nie udało się przeprowadzić teleportacji. Spróbuj jeszcze raz.
</message>
+ <message name="NoHelpIslandTP">
+ Brak możliwości ponownej teleportacji do Welcome Island.
+Odwiedź &apos;Welcome Island Public&apos; by powtórzyć szkolenie.
+ </message>
<message name="noaccess_tport">
Przepraszamy, ale nie masz dostępu do miejsca docelowego.
</message>
diff --git a/indra/newview/skins/default/xui/pt/floater_about.xml b/indra/newview/skins/default/xui/pt/floater_about.xml
index 508635cd6e..e843e56090 100644
--- a/indra/newview/skins/default/xui/pt/floater_about.xml
+++ b/indra/newview/skins/default/xui/pt/floater_about.xml
@@ -7,9 +7,9 @@
Construído com [COMPILER] versão [COMPILER_VERSION]
</floater.string>
<floater.string name="AboutPosition">
- Você está em [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1] em [REGION] localizado em &lt;nolink&gt;[HOSTNAME]&lt;/nolink&gt;([HOSTIP])
+ Você está em [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1] em [REGION] localizado em [HOSTNAME]&lt;/nolink&gt;([HOSTIP])
[SERVER_VERSION]
-[[SERVER_RELEASE_NOTES_URL] [ReleaseNotes]]
+[SERVER_RELEASE_NOTES_URL]
</floater.string>
<floater.string name="AboutSystem">
CPU: [CPU]
@@ -36,6 +36,9 @@ Versão do servidor de voz: [VOICE_VERSION]
<floater.string name="AboutTraffic">
Packets Lost: [PACKETS_LOST,number,0]/[PACKETS_IN,number,0] ([PACKETS_PCT,number,1]%)
</floater.string>
+ <floater.string name="ErrorFetchingServerReleaseNotesURL">
+ Erro ao obter URL de notas de versão do servidor.
+ </floater.string>
<tab_container name="about_tab">
<panel label="Info" name="support_panel">
<button label="Copiar" name="copy_btn"/>
@@ -62,13 +65,35 @@ Versão do servidor de voz: [VOICE_VERSION]
</panel>
<panel label="Licenças" name="licenses_panel">
<text_editor name="credits_editor">
- 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 SDL Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga SSLeay Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) xmlrpc-epi Copyright (C) 2000 Epinions, Inc. zlib Copyright (C) 1995-2002 Jean-loup Gailly and Mark Adler. google-perftools Copyright (c) 2005, Google Inc.
+ 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 e 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
+ SDL Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga
+ SSLeay Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
+ xmlrpc-epi Copyright (C) 2000 Epinions, Inc.
+ zlib Copyright (C) 1995-2002 Jean-loup Gailly and Mark Adler.
+ google-perftools Copyright (c) 2005, Google Inc.
+
+ O Visualizador do Second Life usa Havok (TM) Physics. (c)Copyright 1999-2010 Havok.com Inc. (e seus Licenciantes). Todos os direitos reservados. Consulte www.havok.com para obter detalhes.
-O Second Life Viewer usa Havok (TM) Physics. (c)Copyright 1999-2010 Havok.com Inc. (e licenciadores). Todos os direitos reservados. Mais detalhes em www.havok.com
+ Este software contém código fonte fornecido pela NVIDIA Corporation.
-Todos os direitos reservados. Mais detalhes em licenses.txt.
+ Todos os direitos reservados. Consulte licenses.txt para obter detalhes.
-Codificação do áudio de bate-papo de voz: Polycom(R) Siren14(TM) (ITU-T Rec. G.722.1 Annex C)
+ Codificação de áudio da conversa com voz: 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/pt/floater_about_land.xml b/indra/newview/skins/default/xui/pt/floater_about_land.xml
index 514c7382f8..30d4b0290c 100644
--- a/indra/newview/skins/default/xui/pt/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/pt/floater_about_land.xml
@@ -130,7 +130,7 @@ Vá para o menu Mundo &gt; Sobre o terreno ou selecione outro lote para mostrar
Tráfego:
</text>
<text name="DwellText">
- 0
+ Carregando...
</text>
<button label="Comprar terreno..." label_selected="Comprar terreno..." left="130" name="Buy Land..." width="125"/>
<button label="Venda Linden" name="Linden Sale..." tool_tip="O terreno precisa ser possuído, estar com o conteúdo configurado e não estar pronto para leilão."/>
@@ -213,19 +213,19 @@ Vá para o menu Mundo &gt; Sobre o terreno ou selecione outro lote para mostrar
Fator de bônus para objetos na região: [BONUS]
</text>
<text name="Simulator primitive usage:">
- Uso de prims:
+ Capacidade da região:
</text>
<text name="objects_available">
[COUNT] de [MAX] ([AVAILABLE] disponíveis)
</text>
<text name="Primitives parcel supports:">
- Prims suportados pelo lote:
+ Capacidade do lote do terreno:
</text>
<text name="object_contrib_text">
[COUNT]
</text>
<text name="Primitives on parcel:">
- Prims no lote:
+ Impacto no lote do terreno:
</text>
<text name="total_objects_text">
[COUNT]
@@ -309,13 +309,15 @@ Apenas lotes maiores podem ser listados na busca.
Proibido empurrar (regulamento da região)
</panel.string>
<panel.string name="see_avs_text">
- Veja e bata papo com os residentes deste terreno
+ Avatares em outros lotes podem ver
</panel.string>
<text name="allow_label">
Autorizar outros residentes a:
</text>
- <check_box label="Editar terreno" name="edit land check" tool_tip="Se ativado, qualquer um pode modificar o terreno. É melhor deixar esta opção desativada, uma vez que você sempre pode editar seu próprio terreno."/>
- <check_box label="Voar" name="check fly" tool_tip="Se ativado, residentes podem voar sobre seu terreno. Se desativado, eles podem voar apenas até chegar ou sobrevoar o seu terreno."/>
+ <text name="allow_label0">
+ Voar:
+ </text>
+ <check_box label="Todos" name="check fly" tool_tip="Se ativado, residentes podem voar sobre seu terreno. Se desativado, eles podem voar apenas até chegar ou sobrevoar o seu terreno."/>
<text name="allow_label2">
Criar objetos:
</text>
@@ -331,9 +333,6 @@ Apenas lotes maiores podem ser listados na busca.
</text>
<check_box label="Residentes" name="check other scripts"/>
<check_box label="Grupo" name="check group scripts"/>
- <text name="land_options_label">
- Opções do terreno:
- </text>
<check_box label="Seguro (sem danos)" name="check safe" tool_tip="Se ativado, ajusta o terreno para Seguro, impedindo lutas com danos. Se não ativado, lutas com danos é habilitado."/>
<check_box label="Proibido empurrar" name="PushRestrictCheck" tool_tip="Evita scripts que empurram. Ativar essa opção ajuda a prevenir comportamentos desordeiros no seu terreno."/>
<check_box label="Mostrar terreno nos resultados de busca (L$30/semana)" name="ShowDirectoryCheck" tool_tip="Permitir que as pessoas vejam este terreno nos resultados de busca"/>
@@ -374,9 +373,9 @@ Apenas lotes maiores podem ser listados na busca.
</text>
<texture_picker label="" name="snapshot_ctrl" tool_tip="Clique para escolher uma imagem"/>
<text name="allow_label5">
- Permitir que residentes de outros terrenos:
+ e bater papo com avatares neste lote
</text>
- <check_box label="Ver avatares" name="SeeAvatarsCheck" tool_tip="Permite que residentes de outros terrenos vejam e conversem com os residentes deste terreno e vice-versa."/>
+ <check_box label="Ver avatares" name="SeeAvatarsCheck" tool_tip="Permite que os avatares em outros lotes vejam e batam papo com avatares neste lote. Você poderá vê-los e conversar com eles."/>
<text name="landing_point">
Ponto de Aterrissagem: [LANDING]
</text>
diff --git a/indra/newview/skins/default/xui/pt/floater_avatar.xml b/indra/newview/skins/default/xui/pt/floater_avatar.xml
new file mode 100644
index 0000000000..168cdacae1
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/floater_avatar.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Avatar" title="ESCOLHA UM AVATAR"/>
diff --git a/indra/newview/skins/default/xui/pt/floater_buy_currency.xml b/indra/newview/skins/default/xui/pt/floater_buy_currency.xml
index a737212b50..2845a29e1d 100644
--- a/indra/newview/skins/default/xui/pt/floater_buy_currency.xml
+++ b/indra/newview/skins/default/xui/pt/floater_buy_currency.xml
@@ -46,7 +46,7 @@
L$ [AMT]
</text>
<text name="currency_links">
- [http://www.secondlife.com/my/account/payment_method_management.php payment method] | [http://www.secondlife.com/my/account/currency.php currency] | [http://www.secondlife.com/my/account/exchange_rates.php exchange rate]
+ [http://www.secondlife.com/my/account/payment_method_management.php método de pagamento] | [http://www.secondlife.com/my/account/currency.php moeda]
</text>
<text name="exchange_rate_note">
Digite o valor novamente para ver o câmbio atual.
diff --git a/indra/newview/skins/default/xui/pt/floater_camera.xml b/indra/newview/skins/default/xui/pt/floater_camera.xml
index 4f3729c623..9cda01c187 100644
--- a/indra/newview/skins/default/xui/pt/floater_camera.xml
+++ b/indra/newview/skins/default/xui/pt/floater_camera.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="camera_floater" title="">
+<floater name="camera_floater" title="CONTROLES DA CÂMERA">
<floater.string name="rotate_tooltip">
Girar a Câmera ao redor do Foco
</floater.string>
@@ -9,15 +9,6 @@
<floater.string name="move_tooltip">
Mover a Câmera para Cima e para Baixo, para a Esquerda e para a Direita
</floater.string>
- <floater.string name="camera_modes_title">
- Modos de câmera
- </floater.string>
- <floater.string name="pan_mode_title">
- Pan zoom orbital
- </floater.string>
- <floater.string name="presets_mode_title">
- Ângulos predefinidos
- </floater.string>
<floater.string name="free_mode_title">
Visualizar objeto
</floater.string>
diff --git a/indra/newview/skins/default/xui/pt/floater_chat_bar.xml b/indra/newview/skins/default/xui/pt/floater_chat_bar.xml
new file mode 100644
index 0000000000..72016c6b40
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/floater_chat_bar.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="chat_bar" title="BATE-PAPO LOCAL">
+ <panel name="bottom_panel">
+ <line_editor label="Clique aqui para bater papo." name="chat_box" tool_tip="Tecle Enter para falar, Ctrl+Enter para gritar"/>
+ <button name="show_nearby_chat" tool_tip="Mostra/oculta o histórico do bate-papo local"/>
+ </panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_destinations.xml b/indra/newview/skins/default/xui/pt/floater_destinations.xml
new file mode 100644
index 0000000000..df18698d2f
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/floater_destinations.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Destinations" title="DESTINOS"/>
diff --git a/indra/newview/skins/default/xui/pt/floater_fast_timers.xml b/indra/newview/skins/default/xui/pt/floater_fast_timers.xml
new file mode 100644
index 0000000000..eeb39583ef
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/floater_fast_timers.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="fast_timers">
+ <string name="pause">
+ Pausa
+ </string>
+ <string name="run">
+ Correr
+ </string>
+ <button label="Pausa" name="pause_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_hardware_settings.xml b/indra/newview/skins/default/xui/pt/floater_hardware_settings.xml
index 8c95a3b548..1bc2bce768 100644
--- a/indra/newview/skins/default/xui/pt/floater_hardware_settings.xml
+++ b/indra/newview/skins/default/xui/pt/floater_hardware_settings.xml
@@ -4,7 +4,7 @@
Filtragem:
</text>
<check_box label="Filtragem Anisotrópica (mais lento quando habilitada)" name="ani"/>
- <text name="Antialiasing:">
+ <text name="antialiasing label">
Suavização:
</text>
<combo_box label="Suavização" name="fsaa" width="94">
diff --git a/indra/newview/skins/default/xui/pt/floater_how_to.xml b/indra/newview/skins/default/xui/pt/floater_how_to.xml
new file mode 100644
index 0000000000..15c4946cb0
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/floater_how_to.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_how_to" title="COMO"/>
diff --git a/indra/newview/skins/default/xui/pt/floater_map.xml b/indra/newview/skins/default/xui/pt/floater_map.xml
index faf9c7c170..8233f2a43f 100644
--- a/indra/newview/skins/default/xui/pt/floater_map.xml
+++ b/indra/newview/skins/default/xui/pt/floater_map.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Map" title="">
+<floater name="Map" title="MINI MAPA">
<floater.string name="ToolTipMsg">
[REGION](Clique duas vezes para abrir o mapa, shift+arraste para a visão pan)
</floater.string>
@@ -7,7 +7,7 @@
[REGION](Clique duas vezes para teletransportar, shift+arraste para a visão pan)
</floater.string>
<floater.string name="mini_map_caption">
- MINIMAPA
+ Mini Mapa
</floater.string>
<text label="N" name="floater_map_north" text="N">
N
diff --git a/indra/newview/skins/default/xui/pt/floater_model_preview.xml b/indra/newview/skins/default/xui/pt/floater_model_preview.xml
index 4a537fafb1..8960500831 100644
--- a/indra/newview/skins/default/xui/pt/floater_model_preview.xml
+++ b/indra/newview/skins/default/xui/pt/floater_model_preview.xml
@@ -1,10 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Model Preview" title="Carregar modelo">
- <string name="status_idle">
- Inativo
- </string>
+<floater name="Model Preview" title="CARREGAR MODELO">
+ <string name="status_idle"/>
<string name="status_parse_error">
- Dae parsing - erro, detalhes no log.
+ Erro: Problema ao analisar .dae - consulte log para obter detalhes.
+ </string>
+ <string name="status_material_mismatch">
+ Erro: o material do modelo não é um subconjunto do modelo de referência.
</string>
<string name="status_reading_file">
Carregando...
@@ -51,6 +52,9 @@
<string name="mesh_status_missing_lod">
Falta o nível de detalhamento necessário.
</string>
+ <string name="mesh_status_invalid_material_list">
+ Materiais LOD não são um subconjunto de modelo de referência.
+ </string>
<string name="layer_all">
Tudo
</string>
@@ -63,188 +67,211 @@
<string name="tbd">
A ser definido
</string>
- <text name="name_label">
- Nome:
- </text>
- <text name="lod_label">
- Visualizar
- </text>
- <combo_box name="preview_lod_combo" tool_tip="LOD para ver no renderizador de pré-visualização">
- <combo_item name="high">
- Nível de detalhamento: Alto
- </combo_item>
- <combo_item name="medium">
- Nível de detalhamento: Média
- </combo_item>
- <combo_item name="low">
- Nível de detalhamento: Baixo
- </combo_item>
- <combo_item name="lowest">
- Nível de detalhamento: Mais baixo
- </combo_item>
- </combo_box>
- <text name="warning_title">
- AVISO:
- </text>
- <text name="warning_message">
- Não será possível concluir o upload final desse modelo para os servidores do Second Life. [[VURL] Saiba como] ativar o upload de modelos mesh.
- </text>
- <text name="weights_text">
- Download:
-Físico:
-Servidor:
-
-Equivalente em prims:
- </text>
- <text name="weights">
- [ST]
-[PH]
-[SIM]
-
-[EQ]
- </text>
- <tab_container name="import_tab">
- <panel label="Nível de detalhamento:" name="lod_panel">
- <text name="lod_table_header">
- Selecione o nível de detalhamento:
- </text>
- <text name="high_label" value="Alto"/>
- <text name="high_triangles" value="0"/>
- <text name="high_vertices" value="0"/>
- <text name="medium_label" value="Médio"/>
- <text name="medium_triangles" value="0"/>
- <text name="medium_vertices" value="0"/>
- <text name="low_label" value="Baixo"/>
- <text name="low_triangles" value="0"/>
- <text name="low_vertices" value="0"/>
- <text name="lowest_label" value="Mais baixo"/>
- <text name="lowest_triangles" value="0"/>
- <text name="lowest_vertices" value="0"/>
- <text name="lod_table_footer">
- Nível de detalhamento: [DETAIL]
- </text>
- <radio_group name="lod_file_or_limit" value="lod_from_file">
- <radio_item label="Carregar de arquivo" name="lod_from_file"/>
- <radio_item label="Gerar automaticamente" name="lod_auto_generate"/>
- <radio_item label="Nenhum" name="lod_none"/>
- </radio_group>
- <button label="Procurar..." name="lod_browse"/>
- <combo_box name="lod_mode">
- <combo_item name="triangle_limit">
- Limite de triângulo
- </combo_item>
- <combo_item name="error_threshold">
- Limite de erro
- </combo_item>
- </combo_box>
- <text name="build_operator_text">
- Operador de construção:
- </text>
- <text name="queue_mode_text">
- Modo de fila:
- </text>
- <combo_box name="build_operator">
- <combo_item name="edge_collapse">
- Queda na borda
- </combo_item>
- <combo_item name="half_edge_collapse">
- Meia queda na borda
- </combo_item>
- </combo_box>
- <combo_box name="queue_mode">
- <combo_item name="greedy">
- Egoísta
- </combo_item>
- <combo_item name="lazy">
- Preguiçoso
- </combo_item>
- <combo_item name="independent">
- Independente
- </combo_item>
- </combo_box>
- <text name="border_mode_text">
- Modo da borda:
+ <panel name="left_panel">
+ <panel name="model_name_representation_panel">
+ <text name="name_label">
+ Nome do modelo:
</text>
- <text name="share_tolderance_text">
- Tolerância com compartilhamento:
+ <text name="model_category_label">
+ Esse modelo representa...
</text>
- <combo_box name="border_mode">
- <combo_item name="border_unlock">
- Desbloquear
- </combo_item>
- <combo_item name="border_lock">
- Bloquear
- </combo_item>
+ <combo_box name="model_category_combo">
+ <combo_item label="Escolher uma..." name="Choose one"/>
+ <combo_item label="Forma do avatar" name="Avatar shape"/>
+ <combo_item label="Anexo de avatar" name="Avatar attachment"/>
+ <combo_item label="Objeto em movimento (veículo, animal)" name="Moving object (vehicle, animal)"/>
+ <combo_item label="Material de construção" name="Building Component"/>
+ <combo_item label="Grande, sem movimentação etc" name="Large, non moving etc"/>
+ <combo_item label="Menor, sem movimentação etc" name="Smaller, non-moving etc"/>
+ <combo_item label="Nenhuma dessas, na verdade" name="Not really any of these"/>
</combo_box>
- <text name="crease_label">
- Ângulo da dobra:
- </text>
- <spinner name="crease_angle" value="75"/>
</panel>
- <panel label="Física" name="physics_panel">
- <panel name="physics geometry">
- <radio_group name="physics_load_radio" value="physics_load_from_file">
- <radio_item label="Arquivo:" name="physics_load_from_file"/>
- <radio_item label="Nível de detalhamento:" name="physics_use_lod"/>
- </radio_group>
- <combo_box name="physics_lod_combo" tool_tip="LOD para forma física">
- <combo_item name="physics_lowest">
- Mais baixo
- </combo_item>
- <combo_item name="physics_low">
- Baixo
- </combo_item>
- <combo_item name="physics_medium">
- Médio
- </combo_item>
- <combo_item name="physics_high">
- Alto
- </combo_item>
- </combo_box>
- <button label="Procurar..." name="physics_browse"/>
- </panel>
- <panel name="physics analysis">
- <slider label="Alisar:" name="Smooth"/>
- <check_box label="Tapar buracos (lento)" name="Close Holes (Slow)"/>
- <button label="Analisar" name="Decompose"/>
- <button label="Cancelar" name="decompose_cancel"/>
+ <tab_container name="import_tab">
+ <panel label="Nível de detalhe" name="lod_panel" title="Nível de detalhe">
+ <text initial_value="Origem" name="source" value="Origem"/>
+ <text initial_value="Triângulos" name="triangles" value="Triângulos"/>
+ <text initial_value="Vértices" name="vertices" value="Vértices"/>
+ <text initial_value="Alto" name="high_label" value="Alto"/>
+ <button label="Procurar..." name="lod_browse_high"/>
+ <text initial_value="0" name="high_triangles" value="0"/>
+ <text initial_value="0" name="high_vertices" value="0"/>
+ <text initial_value="Médio" name="medium_label" value="Médio"/>
+ <button label="Procurar..." name="lod_browse_medium"/>
+ <text initial_value="0" name="medium_triangles" value="0"/>
+ <text initial_value="0" name="medium_vertices" value="0"/>
+ <text initial_value="Baixo" name="low_label" value="Baixo"/>
+ <button label="Procurar..." name="lod_browse_low"/>
+ <text initial_value="0" name="low_triangles" value="0"/>
+ <text initial_value="0" name="low_vertices" value="0"/>
+ <text initial_value="Mais baixo" name="lowest_label" value="Mais baixo"/>
+ <button label="Procurar..." name="lod_browse_lowest"/>
+ <text initial_value="0" name="lowest_triangles" value="0"/>
+ <text initial_value="0" name="lowest_vertices" value="0"/>
+ <check_box label="Gerar normais" name="gen_normals"/>
+ <text initial_value="Ângulo de dobra:" name="crease_label" value="Ângulo de dobra:"/>
+ <spinner name="crease_angle" value="75"/>
</panel>
- <panel name="physics simplification">
- <slider label="Demãos:" name="Combine Quality"/>
- <slider label="Escala do detalhamento:" name="Detail Scale"/>
- <slider label="Manter:" name="Retain%"/>
- <button label="Simplificar" name="Simplify"/>
- <button label="Cancelar" name="simplify_cancel"/>
+ <panel label="Físico" name="physics_panel">
+ <panel name="physics geometry">
+ <text name="first_step_name">
+ Etapa 1: Nível de detalhe
+ </text>
+ <combo_box name="physics_lod_combo" tool_tip="LOD a ser usada para forma física">
+ <combo_item name="choose_one">
+ Escolher uma...
+ </combo_item>
+ <combo_item name="physics_high">
+ Alto
+ </combo_item>
+ <combo_item name="physics_medium">
+ Médio
+ </combo_item>
+ <combo_item name="physics_low">
+ Baixo
+ </combo_item>
+ <combo_item name="physics_lowest">
+ Mais baixo
+ </combo_item>
+ <combo_item name="load_from_file">
+ Do arquivo
+ </combo_item>
+ </combo_box>
+ <button label="Procurar..." name="physics_browse"/>
+ </panel>
+ <panel name="physics analysis">
+ <text name="method_label">
+ Etapa 2: Analisar
+ </text>
+ <text name="analysis_method_label">
+ Método:
+ </text>
+ <text name="quality_label">
+ Qualidade:
+ </text>
+ <text name="smooth_method_label">
+ Liso:
+ </text>
+ <check_box label="Fechar orifícios" name="Close Holes (Slow)"/>
+ <button label="Analisar" name="Decompose"/>
+ <button label="Cancelar" name="decompose_cancel"/>
+ </panel>
+ <panel name="physics simplification">
+ <text name="second_step_label">
+ Etapa 3: Simplificar
+ </text>
+ <text name="simp_method_header">
+ Método:
+ </text>
+ <text name="pass_method_header">
+ Passes:
+ </text>
+ <text name="Detail Scale label">
+ Escala de detalhes:
+ </text>
+ <text name="Retain%_label">
+ Reter:
+ </text>
+ <combo_box name="Combine Quality" value="1"/>
+ <button label="Simplificar" name="Simplify"/>
+ <button label="Cancelar" name="simplify_cancel"/>
+ </panel>
+ <panel name="physics info">
+ <text name="results_text">
+ Resultados:
+ </text>
+ <text name="physics_triangles">
+ Triângulos: [TRIANGLES],
+ </text>
+ <text name="physics_points">
+ Vértices: [POINTS],
+ </text>
+ <text name="physics_hulls">
+ Corpos: [HULLS]
+ </text>
+ </panel>
</panel>
- <panel name="physics info">
- <slider label="Visualizar:" name="physics_explode"/>
- <text name="physics_triangles">
- Triângulos: [TRIANGLES]
+ <panel label="Carregar opções" name="modifiers_panel">
+ <text name="scale_label">
+ Escala (1=sem escala):
</text>
- <text name="physics_points">
- Vértices: [POINTS]
+ <spinner name="import_scale" value="1.0"/>
+ <text name="dimensions_label">
+ Dimensões:
</text>
- <text name="physics_hulls">
- Hulls: [HULLS]
+ <text name="import_dimensions">
+ [X] X [Y] X [Z]
</text>
+ <check_box label="Incluir texturas" name="upload_textures"/>
+ <text name="include_label">
+ Somente para modelos de avatar:
+ </text>
+ <check_box label="Incluir peso da pele" name="upload_skin"/>
+ <check_box label="Incluir posições de junções" name="upload_joints"/>
+ <text name="pelvis_offset_label">
+ Desvio Z (subir ou baixar avatar):
+ </text>
+ <spinner name="pelvis_offset" value="0.0"/>
</panel>
- </panel>
- <panel label="Modificadores" name="modifiers_panel">
- <spinner name="import_scale" value="1.0"/>
- <text name="import_dimensions">
- [X] x [Y] x [Z] m
+ </tab_container>
+ <panel name="weights_and_warning_panel">
+ <button label="Calcular pesos e tarifa" name="calculate_btn" tool_tip="Calcular pesos e tarifa"/>
+ <button label="Cancelar" name="cancel_btn"/>
+ <button label="Upload" name="ok_btn" tool_tip="Carregar no simulador"/>
+ <button label="Limpar configurações e redefinir formulário" name="reset_btn"/>
+ <text name="upload_fee">
+ Tarifa de upload: L$ [FEE]
+ </text>
+ <text name="prim_weight">
+ Impacto no terreno: [EQ]
+ </text>
+ <text name="download_weight">
+ Download: [ST]
+ </text>
+ <text name="physics_weight">
+ Físico: [PH]
+ </text>
+ <text name="server_weight">
+ Servidor: [SIM]
+ </text>
+ <text name="warning_title">
+ NOTA:
+ </text>
+ <text name="warning_message">
+ Você não tem direito para fazer upload de modelos mesh. [[VURL] Saiba como] obter certificado.
+ </text>
+ <text name="status">
+ [STATUS]
</text>
- <check_box label="Texturas" name="upload_textures"/>
- <check_box label="Peso da pele" name="upload_skin"/>
- <check_box label="Posição das juntas" name="upload_joints"/>
- <spinner name="pelvis_offset" value="0.0"/>
</panel>
- </tab_container>
- <text name="upload_fee">
- Tarifa de upload: L$ [FEE]
+ </panel>
+ <text name="lod_label">
+ Visualizar
</text>
- <button label="Definir como padrão" name="reset_btn" tool_tip="Definir como padrão"/>
- <button label="Calcular pesos e tarifa" name="calculate_btn" tool_tip="Calcular pesos e tarifa"/>
- <button label="Upload" name="ok_btn" tool_tip="Carregar no simulador"/>
- <button label="Cancelar" name="cancel_btn"/>
+ <panel name="right_panel">
+ <combo_box name="preview_lod_combo" tool_tip="LOD para exibir na renderização de visualização">
+ <combo_item name="high">
+ Alto
+ </combo_item>
+ <combo_item name="medium">
+ Médio
+ </combo_item>
+ <combo_item name="low">
+ Baixo
+ </combo_item>
+ <combo_item name="lowest">
+ Mais baixo
+ </combo_item>
+ </combo_box>
+ <text name="label_display">
+ Visualização...
+ </text>
+ <check_box label="Limites" name="show_edges"/>
+ <check_box label="Físico" name="show_physics"/>
+ <check_box label="Texturas" name="show_textures"/>
+ <check_box label="Pesos de pele" name="show_skin_weight"/>
+ <check_box label="Junções" name="show_joint_positions"/>
+ <text name="physics_explode_label">
+ Visualizar extensão:
+ </text>
+ </panel>
</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_model_wizard.xml b/indra/newview/skins/default/xui/pt/floater_model_wizard.xml
index a67a66a446..498058f933 100644
--- a/indra/newview/skins/default/xui/pt/floater_model_wizard.xml
+++ b/indra/newview/skins/default/xui/pt/floater_model_wizard.xml
@@ -6,26 +6,23 @@
<button label="2. Otimizar" name="optimize_btn"/>
<button label="1. Selecionra arquivo" name="choose_file_btn"/>
<panel name="choose_file_panel">
- <panel name="choose_file_header_panel">
- <text name="choose_file_header_text">
+ <panel name="header_panel">
+ <text name="header_text">
Escolher arquivo de modelo
</text>
</panel>
- <panel name="choose_file_content_panel">
+ <panel name="content">
<text name="advanced_users_text">
Usuários avançados: se você estiver familiarizado com ferramentas de criação de conteúdo 3D, use o Advanced Uploader.
</text>
<button label="Trocar para avançado" name="switch_to_advanced"/>
- <text name="choose_model_file_label">
+ <text name="Cache location">
Escolha o arquivo de modelo para upload
</text>
<button label="Procurar..." label_selected="Procurar..." name="browse"/>
- <text name="support_collada_text">
+ <text name="Model types">
O Second Life oferece suporte a arquivos COLLADA (.dae)
</text>
- <text name="dimensions_label">
- Dimensões (metros):
- </text>
<text name="dimensions">
X Y Z
</text>
@@ -38,18 +35,15 @@
</panel>
</panel>
<panel name="optimize_panel">
- <panel name="optimize_header_panel">
- <text name="optimize_header_text">
+ <panel name="header_panel">
+ <text name="header_text">
Otimizar modelo
</text>
</panel>
- <text name="optimize_hint">
+ <text name="description">
O modelo foi ajustado para desempenho. Faça novos ajustes, se desejar.
</text>
- <panel name="optimize_content_panel">
- <text name="generating_lod_label">
- Gerar nível de detalhes
- </text>
+ <panel name="content">
<text name="high_detail_text">
Gerar nível de detalhes: Alto
</text>
@@ -64,123 +58,64 @@
</text>
</panel>
<panel name="content2">
- <text name="optimize_performance_text">
- Desempenho
- </text>
- <text name="optimize_faster_rendering_text">
- Renderização mais rápida
-Menos detalhes
-Peso menor do prim
- </text>
- <text name="optimize_accuracy_text">
- Precisão
- </text>
- <text name="optimize_slower_rendering_text">
- Renderização mais lenta
-Mais detalhes
-Peso maior do prim
- </text>
- <text name="accuracy_slider_mark1">
- &apos;
- </text>
- <text name="accuracy_slider_mark2">
- &apos;
- </text>
- <text name="accuracy_slider_mark3">
- &apos;
- </text>
<button label="Recalcular geometria" name="recalculate_geometry_btn"/>
- <text name="geometry_preview_label">
+ <text name="lod_label">
Visualização da geometria
</text>
<combo_box name="preview_lod_combo" tool_tip="LOD para exibir na renderização de visualização">
- <combo_item name="preview_lod_high">
+ <combo_item name="high">
Máximo de detalhes
</combo_item>
- <combo_item name="preview_lod_medium">
+ <combo_item name="medium">
Detalhes médios
</combo_item>
- <combo_item name="preview_lod_low">
+ <combo_item name="low">
Poucos detalhes
</combo_item>
- <combo_item name="preview_lod_lowest">
+ <combo_item name="lowest">
Mínimo de detalhes
</combo_item>
</combo_box>
</panel>
</panel>
<panel name="physics_panel">
- <panel name="physics_header_panel">
- <text name="physics_header_text">
+ <panel name="header_panel">
+ <text name="header_text">
Ajustar físico
</text>
</panel>
- <text name="physics_hint">
+ <text name="description">
Criaremos uma forma para o corpo externo do modelo. Ajuste o nível de detalhes como necessário para a finalidade desejada de seu modelo.
</text>
- <panel name="physics_content_panel">
- <text name="physics_performance_text">
- Desempenho
- </text>
- <text name="physics_faster_rendering_text">
- Renderização mais rápida
-Menos detalhes
-Peso menor do prim
- </text>
- <text name="physics_accuracy_text">
- Precisão
- </text>
- <text name="physics_slower_dendering_text">
- Renderização mais lenta
-Mais detalhes
-Peso maior do prim
- </text>
- <text name="physics_example_1">
- Exemplos:
-Objetos em movimento
-Objetos voadores
-Veículos
- </text>
- <text name="physics_example_2">
- Exemplos:
-Objetos estáticos pequenos
-Objetos menos detalhados
-Mobília simples
- </text>
- <text name="physics_example_3">
- Exemplos:
-Objetos estáticos
-Objetos detalhados
-Construções
- </text>
+ <panel name="content">
<button label="Recalcular físico" name="recalculate_physics_btn"/>
<button label="Recalculando..." name="recalculating_physics_btn"/>
- <text name="physics_preview_label">
+ <text name="lod_label">
Visualização do físico
</text>
<combo_box name="preview_lod_combo2" tool_tip="LOD para exibir na renderização de visualização">
- <combo_item name="preview_lod2_high">
+ <combo_item name="high">
Máximo de detalhes
</combo_item>
- <combo_item name="preview_lod2_medium">
+ <combo_item name="medium">
Detalhes médios
</combo_item>
- <combo_item name="preview_lod2_low">
+ <combo_item name="low">
Poucos detalhes
</combo_item>
- <combo_item name="preview_lod2_lowest">
+ <combo_item name="lowest">
Mínimo de detalhes
</combo_item>
</combo_box>
</panel>
</panel>
<panel name="review_panel">
- <panel name="review_header_panel">
- <text name="review_header_text">
+ <panel name="header_panel">
+ <text name="header_text">
Revisar
</text>
</panel>
- <panel name="review_content_panel">
+ <panel name="content">
<text name="review_prim_equiv">
Impacto no lote/região: [EQUIV] equivalentes de prim
</text>
@@ -193,8 +128,8 @@ Construções
</panel>
</panel>
<panel name="upload_panel">
- <panel name="upload_header_panel">
- <text name="upload_header_text">
+ <panel name="header_panel">
+ <text name="header_text">
Upload concluído
</text>
</panel>
diff --git a/indra/newview/skins/default/xui/pt/floater_moveview.xml b/indra/newview/skins/default/xui/pt/floater_moveview.xml
index b1dc65e3af..728357a400 100644
--- a/indra/newview/skins/default/xui/pt/floater_moveview.xml
+++ b/indra/newview/skins/default/xui/pt/floater_moveview.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="move_floater">
+<floater name="move_floater" title="ANDAR/CORRER/VOAR">
<string name="walk_forward_tooltip">
Andar para frente (flecha para cima ou W)
</string>
@@ -58,14 +58,14 @@
Voar
</string>
<panel name="panel_actions">
- <button label="" label_selected="" name="move up btn" tool_tip="Voar para cima (tecla E)"/>
<button label="" label_selected="" name="turn left btn" tool_tip="Virar à esquerda (flecha ESQ ou A)"/>
<joystick_slide name="move left btn" tool_tip="Andar para a esquerda (Shift + Seta esquerda ou A)"/>
- <button label="" label_selected="" name="move down btn" tool_tip="Voar para baixo (tecla C)"/>
<button label="" label_selected="" name="turn right btn" tool_tip="Virar à direita (flecha DIR ou D)"/>
<joystick_slide name="move right btn" tool_tip="Andar para a direita (Shift + Seta direita ou D)"/>
<joystick_turn name="forward btn" tool_tip="Andar para frente (flecha para cima ou W)"/>
<joystick_turn name="backward btn" tool_tip="Andar para trás (flecha para baixo ou S)"/>
+ <button label="" label_selected="" name="move up btn" tool_tip="Voar para cima (tecla E)"/>
+ <button label="" label_selected="" name="move down btn" tool_tip="Voar para baixo (tecla C)"/>
</panel>
<panel name="panel_modes">
<button label="" name="mode_walk_btn" tool_tip="Modo caminhar"/>
diff --git a/indra/newview/skins/default/xui/pt/floater_my_appearance.xml b/indra/newview/skins/default/xui/pt/floater_my_appearance.xml
new file mode 100644
index 0000000000..38e06d2aed
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/floater_my_appearance.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_my_appearance" title="APARÊNCIA">
+ <panel label="Editar aparência" name="main_panel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_my_inventory.xml b/indra/newview/skins/default/xui/pt/floater_my_inventory.xml
new file mode 100644
index 0000000000..71d8682758
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/floater_my_inventory.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_my_inventory" title="INVENTÃRIO"/>
diff --git a/indra/newview/skins/default/xui/pt/floater_nearby_chat.xml b/indra/newview/skins/default/xui/pt/floater_nearby_chat.xml
index 60edfa505f..653861f7d8 100644
--- a/indra/newview/skins/default/xui/pt/floater_nearby_chat.xml
+++ b/indra/newview/skins/default/xui/pt/floater_nearby_chat.xml
@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="nearby_chat" title="Bate-papo local">
- <check_box label="Traduzir bate-papo (via Google)" name="translate_chat_checkbox"/>
+ <check_box label="Traduzir bate-papo" name="translate_chat_checkbox"/>
</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_object_weights.xml b/indra/newview/skins/default/xui/pt/floater_object_weights.xml
new file mode 100644
index 0000000000..45bd1c7127
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/floater_object_weights.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="object_weights" title="AVANÇADO">
+ <floater.string name="nothing_selected" value="--"/>
+ <text name="selected_text" value="SELECIONADO"/>
+ <text name="objects" value="--"/>
+ <text name="objects_label" value="Objetos"/>
+ <text name="prims" value="--"/>
+ <text name="prims_label" value="Prims"/>
+ <text name="weights_of_selected_text" value="PESOS DOS SELECIONADOS"/>
+ <text name="download" value="--"/>
+ <text name="download_label" value="Baixar"/>
+ <text name="physics" value="--"/>
+ <text name="physics_label" value="Físico"/>
+ <text name="server" value="--"/>
+ <text name="server_label" value="Servidor"/>
+ <text name="display" value="--"/>
+ <text name="display_label" value="Visualização"/>
+ <text name="land_impacts_text" value="IMPACTOS NO TERRENO"/>
+ <text name="selected" value="--"/>
+ <text name="selected_label" value="Selecionado"/>
+ <text name="rezzed_on_land" value="--"/>
+ <text name="rezzed_on_land_label" value="Resolução no terreno"/>
+ <text name="remaining_capacity" value="--"/>
+ <text name="remaining_capacity_label" value="Capacidade restante"/>
+ <text name="total_capacity" value="--"/>
+ <text name="total_capacity_label" value="Capacidade total"/>
+ <text name="help_SLURL" value="[secondlife:///app/help/object_weights What is all this?...]"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_outfit_save_as.xml b/indra/newview/skins/default/xui/pt/floater_outfit_save_as.xml
new file mode 100644
index 0000000000..60d4d3dc5c
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/floater_outfit_save_as.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="modal container" title="SALVAR LOOK"/>
diff --git a/indra/newview/skins/default/xui/pt/floater_people.xml b/indra/newview/skins/default/xui/pt/floater_people.xml
new file mode 100644
index 0000000000..10a516ee36
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/floater_people.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_people" title="PESSOAS">
+ <panel_container name="main_panel">
+ <panel label="Perfil do grupo" name="panel_group_info_sidetray"/>
+ <panel label="Residentes e objetos bloqueados" name="panel_block_list_sidetray"/>
+ </panel_container>
+</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_picks.xml b/indra/newview/skins/default/xui/pt/floater_picks.xml
new file mode 100644
index 0000000000..9766196319
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/floater_picks.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_picks" title="Destaques"/>
diff --git a/indra/newview/skins/default/xui/pt/floater_places.xml b/indra/newview/skins/default/xui/pt/floater_places.xml
new file mode 100644
index 0000000000..12c6548205
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/floater_places.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_places" title="LUGARES">
+ <panel label="Lugares" name="main_panel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_snapshot.xml b/indra/newview/skins/default/xui/pt/floater_snapshot.xml
index d62fe3dd20..4110e69068 100644
--- a/indra/newview/skins/default/xui/pt/floater_snapshot.xml
+++ b/indra/newview/skins/default/xui/pt/floater_snapshot.xml
@@ -3,73 +3,63 @@
<floater.string name="unknown">
desconhecido
</floater.string>
- <radio_group label="Tipo de foto" name="snapshot_type_radio">
- <radio_item label="Email" name="postcard"/>
- <radio_item label="Meu inventário (L$[AMOUNT])" name="texture"/>
- <radio_item label="Salvar no meu PC" name="local"/>
- </radio_group>
+ <string name="postcard_progress_str">
+ Enviando e-mail
+ </string>
+ <string name="profile_progress_str">
+ Postando
+ </string>
+ <string name="inventory_progress_str">
+ Salvando no inventário
+ </string>
+ <string name="local_progress_str">
+ Salvo no computador
+ </string>
+ <string name="profile_succeeded_str">
+ Imagem carregada
+ </string>
+ <string name="postcard_succeeded_str">
+ E-mail enviado!
+ </string>
+ <string name="inventory_succeeded_str">
+ Salvo no inventário!
+ </string>
+ <string name="local_succeeded_str">
+ Salvo no computador!
+ </string>
+ <string name="profile_failed_str">
+ Falha ao carregar a imagem no feed do seu perfil.
+ </string>
+ <string name="postcard_failed_str">
+ Falha ao enviar e-mail.
+ </string>
+ <string name="inventory_failed_str">
+ Falha ao salvar no inventário.
+ </string>
+ <string name="local_failed_str">
+ Falha ao salvar no computador.
+ </string>
+ <button name="advanced_options_btn" tool_tip="Opções avançadas"/>
+ <text name="image_res_text">
+ [WIDTH] x [HEIGHT] px
+ </text>
<text name="file_size_label">
[TAMANHO] KB
</text>
- <button label="Atualizar a foto" name="new_snapshot_btn"/>
- <button label="Enviar" name="send_btn"/>
- <button label="Economize (L$[AMOUNT])" name="upload_btn"/>
- <flyout_button label="Salvar" name="save_btn" tool_tip="Salvar imagem em um arquivo">
- <flyout_button.item label="Salvar" name="save_item"/>
- <flyout_button.item label="Salvar como..." name="saveas_item"/>
- </flyout_button>
- <button label="Mais" name="more_btn" tool_tip="Opções avançadas"/>
- <button label="Menos" name="less_btn" tool_tip="Opções avançadas"/>
- <button label="Cancelar" name="discard_btn"/>
- <text name="type_label2">
- Tamanho
- </text>
- <text name="format_label">
- Formato
- </text>
- <combo_box label="Resolução" name="postcard_size_combo">
- <combo_box.item label="Janela atual" 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="Customizado" name="Custom"/>
- </combo_box>
- <combo_box label="Resolução" name="texture_size_combo">
- <combo_box.item label="Janela atual" name="CurrentWindow"/>
- <combo_box.item label="Pequeno (128x128)" name="Small(128x128)"/>
- <combo_box.item label="Médio (256x256)" name="Medium(256x256)"/>
- <combo_box.item label="Grande (512x512)" name="Large(512x512)"/>
- <combo_box.item label="Customizado" name="Custom"/>
- </combo_box>
- <combo_box label="Resolução" name="local_size_combo">
- <combo_box.item label="Janela atual" name="CurrentWindow"/>
- <combo_box.item label="320x240" name="320x240"/>
- <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="1280x1024" name="1280x1024"/>
- <combo_box.item label="1600x1200" name="1600x1200"/>
- <combo_box.item label="Customizado" name="Custom"/>
- </combo_box>
- <combo_box label="Formato" name="local_format_combo">
- <combo_box.item label="PNG" name="PNG"/>
- <combo_box.item label="JPEG" name="JPEG"/>
- <combo_box.item label="BMP" name="BMP"/>
- </combo_box>
- <spinner label="Largura" name="snapshot_width"/>
- <spinner label="Altura" name="snapshot_height"/>
- <check_box label="Limitar proproções" name="keep_aspect_check"/>
- <slider label="Qualidade da imagem" name="image_quality_slider"/>
- <text name="layer_type_label">
- Capturar:
- </text>
- <combo_box label="Camadas da imagem" name="layer_types">
- <combo_box.item label="Cores" name="Colors"/>
- <combo_box.item label="Profundidade" name="Depth"/>
- </combo_box>
- <check_box label="Interface" name="ui_check"/>
- <check_box label="HUDs" name="hud_check"/>
- <check_box label="Deixar aberto depois de salvo" name="keep_open_check"/>
- <check_box label="Gerar quadro (tela inteira)" name="freeze_frame_check"/>
- <check_box label="Atualizar" name="auto_snapshot_check"/>
+ <panel name="advanced_options_panel">
+ <text name="advanced_options_label">
+ OPÇÕES AVANÇADAS
+ </text>
+ <text name="layer_type_label">
+ Capturar:
+ </text>
+ <combo_box label="Camadas da imagem" name="layer_types">
+ <combo_box.item label="Cores" name="Colors"/>
+ <combo_box.item label="Profundidade" name="Depth"/>
+ </combo_box>
+ <check_box label="Interface" name="ui_check"/>
+ <check_box label="HUDs" name="hud_check"/>
+ <check_box label="Gerar quadro (tela inteira)" name="freeze_frame_check"/>
+ <check_box label="Atualização automática" name="auto_snapshot_check"/>
+ </panel>
</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_sound_devices.xml b/indra/newview/skins/default/xui/pt/floater_sound_devices.xml
index 0e6d923778..948d727540 100644
--- a/indra/newview/skins/default/xui/pt/floater_sound_devices.xml
+++ b/indra/newview/skins/default/xui/pt/floater_sound_devices.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_sound_devices" title="Dispositivos de áudio">
+<floater name="floater_sound_devices" title="DISPOSITIVOS DE SOM">
<text name="voice_label">
Bate-papo de voz
</text>
diff --git a/indra/newview/skins/default/xui/pt/floater_stats.xml b/indra/newview/skins/default/xui/pt/floater_stats.xml
index 11589b31b6..f0a053ebe3 100644
--- a/indra/newview/skins/default/xui/pt/floater_stats.xml
+++ b/indra/newview/skins/default/xui/pt/floater_stats.xml
@@ -10,8 +10,8 @@
</stat_view>
<stat_view label="Avançado" name="advanced">
<stat_view label="Render" name="render">
- <stat_bar label="KTris Drawn" name="ktrisframe"/>
- <stat_bar label="KTris Drawn" name="ktrissec"/>
+ <stat_bar label="KTris desenhados por quadro" name="ktrisframe"/>
+ <stat_bar label="KTris desenhados por segundo" name="ktrissec"/>
<stat_bar label="Total Objects" name="objs"/>
<stat_bar label="New Objects" name="newobjs"/>
</stat_view>
@@ -32,7 +32,7 @@
<stat_bar label="Layers" name="layerskbitstat"/>
<stat_bar label="Actual In" name="actualinkbitstat"/>
<stat_bar label="Actual Out" name="actualoutkbitstat"/>
- <stat_bar label="VFS Pending Ops" name="vfspendingoperations"/>
+ <stat_bar label="Operações pendentes do VFS" name="vfspendingoperations"/>
</stat_view>
</stat_view>
<stat_view label="Simulator" name="sim">
@@ -43,18 +43,6 @@
<stat_bar label="Pinned Objects" name="physicspinnedtasks"/>
<stat_bar label="Low LOD Objects" name="physicslodtasks"/>
<stat_bar label="Memory Allocated" name="physicsmemoryallocated"/>
- <stat_bar label="Agent Updates/Sec" name="simagentups"/>
- <stat_bar label="Main Agents" name="simmainagents"/>
- <stat_bar label="Child Agents" name="simchildagents"/>
- <stat_bar label="Objects" name="simobjects"/>
- <stat_bar label="Active Objects" name="simactiveobjects"/>
- <stat_bar label="Active Scripts" name="simactivescripts"/>
- <stat_bar label="Script Events" name="simscripteps"/>
- <stat_bar label="Packets In" name="siminpps"/>
- <stat_bar label="Packets Out" name="simoutpps"/>
- <stat_bar label="Pending Downloads" name="simpendingdownloads"/>
- <stat_bar label="Pending Uploads" name="simpendinguploads"/>
- <stat_bar label="Total Unacked Bytes" name="simtotalunackedbytes"/>
</stat_view>
<stat_view label="Time (ms)" name="simperf">
<stat_bar label="Total Frame Time" name="simframemsec"/>
@@ -64,6 +52,14 @@
<stat_bar label="Agent Time" name="simagentmsec"/>
<stat_bar label="Images Time" name="simimagesmsec"/>
<stat_bar label="Script Time" name="simscriptmsec"/>
+ <stat_bar label="Tempo restante" name="simsparemsec"/>
+ <stat_view label="Detalhes de tempo (ms)" name="timedetails">
+ <stat_bar label="Etapa física" name="simsimphysicsstepmsec"/>
+ <stat_bar label="Atualizar formas físicas" name="simsimphysicsshapeupdatemsec"/>
+ <stat_bar label="Física - outros" name="simsimphysicsothermsec"/>
+ <stat_bar label="Tempo de espera" name="simsleepmsec"/>
+ <stat_bar label="Bombear ES" name="simpumpiomsec"/>
+ </stat_view>
</stat_view>
</stat_view>
</container_view>
diff --git a/indra/newview/skins/default/xui/pt/floater_tools.xml b/indra/newview/skins/default/xui/pt/floater_tools.xml
index 6850bf2d7c..f35f31f5f7 100644
--- a/indra/newview/skins/default/xui/pt/floater_tools.xml
+++ b/indra/newview/skins/default/xui/pt/floater_tools.xml
@@ -25,10 +25,10 @@
Clicar e arrastar para selecionar a terra
</floater.string>
<floater.string name="status_selectcount">
- [OBJ_COUNT] objetos ( [PRIM_COUNT] prims[PE_STRING] ) selecionados
+ [OBJ_COUNT] objetos selecionados, impacto no terreno [LAND_IMPACT]
</floater.string>
- <floater.string name="status_selectprimequiv">
- , [SEL_WEIGHT] equivalentes de prims
+ <floater.string name="status_remaining_capacity">
+ Capacidade restante [LAND_CAPACITY].
</floater.string>
<button label="" label_selected="" name="button focus" tool_tip="Foco"/>
<button label="" label_selected="" name="button move" tool_tip="Mover"/>
@@ -105,8 +105,8 @@
<text name="selection_empty">
Nada selecionado.
</text>
- <text name="selection_weight">
- Peso do físico [PHYS_WEIGHT], custo de renderização [DISP_WEIGHT].
+ <text name="remaining_capacity">
+ [CAPACITY_STRING] [secondlife:///app/openfloater/object_weights More info]
</text>
<tab_container name="Object Info Tabs" tab_max_width="60" tab_min_width="30" width="288">
<panel label="Comum" name="General">
@@ -319,7 +319,6 @@
Tipo costura
</text>
<combo_box name="sculpt type control">
- <combo_box.item label="(nenhum)" name="None"/>
<combo_box.item label="Esfera" name="Sphere"/>
<combo_box.item label="Toróide" name="Torus"/>
<combo_box.item label="Plano" name="Plane"/>
diff --git a/indra/newview/skins/default/xui/pt/floater_toybox.xml b/indra/newview/skins/default/xui/pt/floater_toybox.xml
new file mode 100644
index 0000000000..3677c3b1f5
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/floater_toybox.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Toybox" title="BOTÕES DA BARRA DE FERRAMENTAS">
+ <text name="toybox label 1">
+ Adicione ou remova botões arrastando-os para dentro ou para fora das barras de ferramentas.
+ </text>
+ <text name="toybox label 2">
+ Os botões aparecerão como mostrado ou somente como ícone, dependendo das configurações de cada barra de ferramentas.
+ </text>
+ <button label="Limpar todas as barras de ferramentas" label_selected="Limpar todas as barras de ferramentas" name="btn_clear_all"/>
+ <button label="Restaurar padrão" label_selected="Restaurar padrão" name="btn_restore_defaults"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_translation_settings.xml b/indra/newview/skins/default/xui/pt/floater_translation_settings.xml
new file mode 100644
index 0000000000..1955599a81
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/floater_translation_settings.xml
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_translation_settings" title="CONFIGURAÇÕES DE TRADUÇÃO DE BATE-PAPO">
+ <string name="bing_api_key_not_verified">
+ appID do Bing não verificada. Tente novamente.
+ </string>
+ <string name="google_api_key_not_verified">
+ Chave do API do Google não verificada. Tente novamente.
+ </string>
+ <string name="bing_api_key_verified">
+ appID do Bing verificada.
+ </string>
+ <string name="google_api_key_verified">
+ Chave do API do Google verificada.
+ </string>
+ <check_box label="Permitir a tradução de máquina durante o bate-papo" name="translate_chat_checkbox"/>
+ <text name="translate_language_label">
+ Traduzir bate-papo para:
+ </text>
+ <combo_box name="translate_language_combo">
+ <combo_box.item label="Padrão" name="System Default Language"/>
+ <combo_box.item label="Inglês" name="English"/>
+ <combo_box.item label="Dansk (Dinamarquês)" name="Danish"/>
+ <combo_box.item label="Deutsch (Alemão)" name="German"/>
+ <combo_box.item label="Español (Espanhol)" name="Spanish"/>
+ <combo_box.item label="Français (Francês)" name="French"/>
+ <combo_box.item label="Italiano (Italiano)" name="Italian"/>
+ <combo_box.item label="Magyar (Húngaro)" name="Hungarian"/>
+ <combo_box.item label="Nederlands (Holandês)" name="Dutch"/>
+ <combo_box.item label="Polski (Polonês)" name="Polish"/>
+ <combo_box.item label="Português (Português)" name="Portugese"/>
+ <combo_box.item label="РуÑÑкий (Russo)" name="Russian"/>
+ <combo_box.item label="Türkçe (Turco)" name="Turkish"/>
+ <combo_box.item label="УкраїнÑька (Ucraniano)" name="Ukrainian"/>
+ <combo_box.item label="中文 (简体) (Chinês)" name="Chinese"/>
+ <combo_box.item label="日本語 (Japonês)" name="Japanese"/>
+ <combo_box.item label="한국어 (Coreano)" name="Korean"/>
+ </combo_box>
+ <text name="tip">
+ Escolha o serviço de tradução:
+ </text>
+ <radio_group name="translation_service_rg">
+ <radio_item initial_value="bing" label="Bing Translator" name="bing"/>
+ <radio_item initial_value="google" label="Google Translate" name="google"/>
+ </radio_group>
+ <text name="bing_api_key_label">
+ [http://www.bing.com/developers/createapp.aspx AppID] do Bing:
+ </text>
+ <button label="Verificar" name="verify_bing_api_key_btn"/>
+ <text name="google_api_key_label">
+ [http://code.google.com/apis/language/translate/v2/getting_started.html#auth Chave API] do Google:
+ </text>
+ <button label="Verificar" name="verify_google_api_key_btn"/>
+ <text name="google_links_text">
+ [http://code.google.com/apis/language/translate/v2/pricing.html Preços] | [https://code.google.com/apis/console Estatísticas]
+ </text>
+ <button label="OK" name="ok_btn"/>
+ <button label="Cancelar" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_voice_controls.xml b/indra/newview/skins/default/xui/pt/floater_voice_controls.xml
index fed60c9afa..745a7d0e00 100644
--- a/indra/newview/skins/default/xui/pt/floater_voice_controls.xml
+++ b/indra/newview/skins/default/xui/pt/floater_voice_controls.xml
@@ -1,16 +1,16 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_voice_controls" title="Controles de voz">
+<floater name="floater_voice_controls" title="CONTROLES DE VOZ">
<string name="title_nearby">
- VOZ LOCAL
+ CONFIGURAÇÕES DE VOZ
</string>
<string name="title_group">
- Ligação de grupo com [GROUP]
+ LIGAÇÃO DE GRUPO COM [GROUP]
</string>
<string name="title_adhoc">
- Teleconferência
+ TELECONFERÊNCIA
</string>
<string name="title_peer_2_peer">
- Ligação para [NAME]
+ LIGAÇÃO PARA [NAME]
</string>
<string name="no_one_near">
Ninguém por perto ativou a voz
diff --git a/indra/newview/skins/default/xui/pt/inspect_avatar.xml b/indra/newview/skins/default/xui/pt/inspect_avatar.xml
index a199c58c15..19244d9b27 100644
--- a/indra/newview/skins/default/xui/pt/inspect_avatar.xml
+++ b/indra/newview/skins/default/xui/pt/inspect_avatar.xml
@@ -5,10 +5,10 @@
-->
<floater name="inspect_avatar">
<string name="Subtitle">
- [IDADE]
+ [AGE]
</string>
<string name="Details">
- [PERFIL_SL]
+ [SL_PROFILE]
</string>
<text name="user_details">
This is my second life description and I really think it is great. But for some reason my description is super extra long because I like to talk a whole lot
diff --git a/indra/newview/skins/default/xui/pt/menu_bottomtray.xml b/indra/newview/skins/default/xui/pt/menu_bottomtray.xml
index 7585160954..4598b8ab25 100644
--- a/indra/newview/skins/default/xui/pt/menu_bottomtray.xml
+++ b/indra/newview/skins/default/xui/pt/menu_bottomtray.xml
@@ -8,7 +8,7 @@
<menu_item_check label="Botão Construir" name="ShowBuildButton"/>
<menu_item_check label="Botão Buscar" name="ShowSearchButton"/>
<menu_item_check label="Botão Mapa" name="ShowWorldMapButton"/>
- <menu_item_check label="Botão do Mini Mapa" name="ShowMiniMapButton"/>
+ <menu_item_check label="Botão do Mini mapa" name="ShowMiniMapButton"/>
<menu_item_call label="Cortar" name="NearbyChatBar_Cut"/>
<menu_item_call label="Copiar" name="NearbyChatBar_Copy"/>
<menu_item_call label="Colar" name="NearbyChatBar_Paste"/>
diff --git a/indra/newview/skins/default/xui/pt/menu_hide_navbar.xml b/indra/newview/skins/default/xui/pt/menu_hide_navbar.xml
index c2b063193e..5f6bd096a8 100644
--- a/indra/newview/skins/default/xui/pt/menu_hide_navbar.xml
+++ b/indra/newview/skins/default/xui/pt/menu_hide_navbar.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu name="hide_navbar_menu">
- <menu_item_check label="Mostrar barra de navegação" name="ShowNavbarNavigationPanel"/>
+ <menu_item_check label="Mostrar barra de navegação e de favoritos" name="ShowNavbarNavigationPanel"/>
<menu_item_check label="Mostrar barra de favoritos" name="ShowNavbarFavoritesPanel"/>
<menu_item_check label="Mostrar minibarra de localização" name="ShowMiniLocationPanel"/>
</menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_login.xml b/indra/newview/skins/default/xui/pt/menu_login.xml
index 1d3fa48fb3..94195f1b8c 100644
--- a/indra/newview/skins/default/xui/pt/menu_login.xml
+++ b/indra/newview/skins/default/xui/pt/menu_login.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu_bar name="Login Menu">
<menu label="Eu" name="File">
- <menu_item_call label="Preferências" name="Preferences..."/>
+ <menu_item_call label="Preferências..." name="Preferences..."/>
<menu_item_call label="Sair do [APP_NAME]" name="Quit"/>
</menu>
<menu label="Ajuda" name="Help">
diff --git a/indra/newview/skins/default/xui/pt/menu_toolbars.xml b/indra/newview/skins/default/xui/pt/menu_toolbars.xml
new file mode 100644
index 0000000000..b58a1a6e4f
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/menu_toolbars.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Toolbars Popup">
+ <menu_item_call label="Remover este botão" name="Remove button"/>
+ <menu_item_call label="Botões da barra de ferramentas..." name="Choose Buttons"/>
+ <menu_item_check label="Ãcones e rótulos" name="icons_with_text"/>
+ <menu_item_check label="Somente ícones" name="icons_only"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_viewer.xml b/indra/newview/skins/default/xui/pt/menu_viewer.xml
index e1d066261a..119a3bdcfe 100644
--- a/indra/newview/skins/default/xui/pt/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/pt/menu_viewer.xml
@@ -1,54 +1,60 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu_bar name="Main Menu">
<menu label="Eu" name="Me">
- <menu_item_call label="Preferências" name="Preferences"/>
- <menu_item_call label="Meu painel" name="Manage My Account">
- <menu_item_call.on_click name="ManageMyAccount_url" parameter="WebLaunchJoinNow,http://secondlife.com/account/index.php?lang=pt"/>
- </menu_item_call>
- <menu_item_call label="Comprar L$" name="Buy and Sell L$"/>
- <menu_item_call label="Meu perfil" name="Profile"/>
- <menu_item_call label="Minha aparência" name="ChangeOutfit"/>
- <menu_item_check label="Meu inventário" name="Inventory"/>
- <menu_item_check label="Meu inventário" name="ShowSidetrayInventory"/>
- <menu_item_check label="Meus gestos" name="Gestures"/>
- <menu_item_check label="Minha voz" name="ShowVoice"/>
+ <menu_item_call label="Perfil..." name="Profile"/>
+ <menu_item_call label="Aparência..." name="ChangeOutfit"/>
+ <menu_item_call label="Selecione um avatar..." name="Avatar Picker"/>
+ <menu_item_check label="Inventário..." name="Inventory"/>
+ <menu_item_call label="Nova janela de inventário" name="NewInventoryWindow"/>
+ <menu_item_call label="Lugares..." name="Places"/>
+ <menu_item_call label="Destaques..." name="Picks"/>
+ <menu_item_call label="Controles da câmera..." name="Camera Controls"/>
<menu label="Movimentos" name="Movement">
<menu_item_call label="Sentar" name="Sit Down Here"/>
<menu_item_check label="Voar" name="Fly"/>
<menu_item_check label="Correr sempre" name="Always Run"/>
<menu_item_call label="Parar minha animação" name="Stop Animating My Avatar"/>
</menu>
- <menu label="Meu status" name="Status">
+ <menu label="Status" name="Status">
<menu_item_call label="Ausente" name="Set Away"/>
<menu_item_call label="Ocupado" name="Set Busy"/>
</menu>
<menu_item_call label="Request Admin Status" name="Request Admin Options"/>
<menu_item_call label="Sair do modo admin" name="Leave Admin Options"/>
+ <menu_item_call label="Comprar L$" name="Buy and Sell L$"/>
+ <menu_item_call label="Painel da conta..." name="Manage My Account">
+ <menu_item_call.on_click name="ManageMyAccount_url" parameter="WebLaunchJoinNow,http://secondlife.com/account/index.php?lang=pt"/>
+ </menu_item_call>
+ <menu_item_call label="Preferências..." name="Preferences"/>
+ <menu_item_call label="Botões da barra de ferramentas..." name="Toolbars"/>
+ <menu_item_call label="Ocultar todos os controles" name="Hide UI"/>
<menu_item_call label="Sair do [APP_NAME]" name="Quit"/>
</menu>
<menu label="Comunicar" name="Communicate">
- <menu_item_call label="Meus amigos" name="My Friends"/>
- <menu_item_call label="Meus grupos" name="My Groups"/>
- <menu_item_check label="Bate-papo local" name="Nearby Chat"/>
- <menu_item_call label="Pessoas por perto" name="Active Speakers"/>
- <menu_item_check label="Voz por perto" name="Nearby Voice"/>
+ <menu_item_check label="Bate-papo..." name="Nearby Chat"/>
+ <menu_item_check label="Falar" name="Speak"/>
+ <menu_item_check label="Configurações de voz..." name="Nearby Voice"/>
+ <menu_item_check label="Distorção de voz..." name="ShowVoice"/>
+ <menu_item_check label="Gestos..." name="Gestures"/>
+ <menu_item_call label="Amigos" name="My Friends"/>
+ <menu_item_call label="Grupos" name="My Groups"/>
+ <menu_item_call label="Pessoas próximas" name="Active Speakers"/>
</menu>
<menu label="Mundo" name="World">
- <menu_item_check label="Mini Mapa" name="Mini-Map"/>
+ <menu_item_call label="Criar marco deste lugar" name="Create Landmark Here"/>
+ <menu_item_call label="Destinos..." name="Destinations"/>
<menu_item_check label="Mapa-múndi" name="World Map"/>
+ <menu_item_check label="Mini Mapa" name="Mini-Map"/>
<menu_item_check label="Busca" name="Search"/>
+ <menu_item_call label="Teletransportar para início" name="Teleport Home"/>
+ <menu_item_call label="Definir como casa" name="Set Home to Here"/>
<menu_item_call label="Foto" name="Take Snapshot"/>
- <menu_item_call label="Criar marco deste lugar" name="Create Landmark Here"/>
- <menu label="Perfil da região" name="Land">
- <menu_item_call label="Perfil da região" name="Place Profile"/>
- <menu_item_call label="Sobre terrenos" name="About Land"/>
- <menu_item_call label="Região/Propriedade" name="Region/Estate"/>
- </menu>
+ <menu_item_call label="Perfil da região" name="Place Profile"/>
+ <menu_item_call label="Sobre terrenos" name="About Land"/>
+ <menu_item_call label="Região/Propriedade" name="Region/Estate"/>
+ <menu_item_call label="Meus terrenos..." name="My Land"/>
<menu_item_call label="Comprar este terreno" name="Buy Land"/>
- <menu_item_call label="Meus terrenos" name="My Land"/>
<menu label="Mostrar" name="LandShow">
- <menu_item_check label="Controles de movimento" name="Movement Controls"/>
- <menu_item_check label="Ver controles" name="Camera Controls"/>
<menu_item_check label="Limites" name="Ban Lines"/>
<menu_item_check label="Balizas" name="beacons"/>
<menu_item_check label="Limites do imóvel" name="Property Lines"/>
@@ -57,30 +63,29 @@
<menu_item_check label="Propriedades do lote" name="Parcel Properties"/>
<menu_item_check label="Menu avançado" name="Show Advanced Menu"/>
</menu>
- <menu_item_call label="Teletransportar para meu início" name="Teleport Home"/>
- <menu_item_call label="Definir como Início" name="Set Home to Here"/>
<menu label="Sol" name="Environment Settings">
<menu_item_call label="Amanhecer" name="Sunrise"/>
<menu_item_call label="Meio-dia" name="Noon"/>
<menu_item_call label="Pôr-do-Sol" name="Sunset"/>
<menu_item_call label="Meia-noite" name="Midnight"/>
- </menu>
- <menu label="Editor de ambientes" name="Enviroment Editor">
- <menu_item_call label="Configurações de ambiente..." name="Enviroment Settings"/>
- <menu label="Pré-configurações de água" name="Water Presets">
- <menu_item_call label="Nova pré-configuração..." name="new_water_preset"/>
- <menu_item_call label="Editar pré-configuração..." name="edit_water_preset"/>
- <menu_item_call label="Excluir pré-configuração..." name="delete_water_preset"/>
+ <menu_item_call label="Usar configurações da região" name="Use Region Settings"/>
+ </menu>
+ <menu label="Editor de ambientes" name="Environment Editor">
+ <menu_item_call label="Configurações do ambiente..." name="Environment Settings"/>
+ <menu label="Predefinições da água" name="Water Presets">
+ <menu_item_call label="Nova predefinição..." name="new_water_preset"/>
+ <menu_item_call label="Editar predefinição..." name="edit_water_preset"/>
+ <menu_item_call label="Excluir predefinição..." name="delete_water_preset"/>
</menu>
- <menu label="Pré-configurações de céu" name="Sky Presets">
- <menu_item_call label="Nova pré-configuração..." name="new_sky_preset"/>
- <menu_item_call label="Editar pré-configuração..." name="edit_sky_preset"/>
- <menu_item_call label="Excluir pré-configuração..." name="delete_sky_preset"/>
+ <menu label="Predefinições de céu" name="Sky Presets">
+ <menu_item_call label="Nova predefinição..." name="new_sky_preset"/>
+ <menu_item_call label="Editar predefinição..." name="edit_sky_preset"/>
+ <menu_item_call label="Excluir predefinição..." name="delete_sky_preset"/>
</menu>
- <menu label="Pré-configurações de dias" name="Day Presets">
- <menu_item_call label="Nova pré-configuração..." name="new_day_preset"/>
- <menu_item_call label="Editar pré-configuração..." name="edit_day_preset"/>
- <menu_item_call label="Excluir pré-configuração..." name="delete_day_preset"/>
+ <menu label="Predefinições do dia" name="Day Presets">
+ <menu_item_call label="Nova predefinição..." name="new_day_preset"/>
+ <menu_item_call label="Editar predefinição..." name="edit_day_preset"/>
+ <menu_item_call label="Excluir predefinição..." name="delete_day_preset"/>
</menu>
</menu>
</menu>
@@ -95,7 +100,7 @@
</menu>
<menu_item_call label="Link" name="Link"/>
<menu_item_call label="Desconectar links" name="Unlink"/>
- <menu_item_check label="Edit Linked Parts" name="Edit Linked Parts"/>
+ <menu_item_check label="Editar partes linkadas" name="Edit Linked Parts"/>
<menu label="Selecionar partes conectadas" name="Select Linked Parts">
<menu_item_call label="Selecionar próxima parte" name="Select Next Part"/>
<menu_item_call label="Selecionar parte anterior" name="Select Previous Part"/>
@@ -109,7 +114,7 @@
<menu_item_call label="Pegar" name="Menu Object Take"/>
<menu_item_call label="Pegar uma cópia" name="Take Copy"/>
<menu_item_call label="Salvar no meu inventário" name="Save Object Back to My Inventory"/>
- <menu_item_call label="Save Back to Object Contents" name="Save Object Back to Object Contents"/>
+ <menu_item_call label="Salvar objeto de volta aos conteúdos do objeto" name="Save Object Back to Object Contents"/>
<menu_item_call label="Devolver objeto" name="Return Object back to Owner"/>
</menu>
<menu label="Scripts" name="Scripts">
@@ -139,13 +144,14 @@
<menu_item_call label="Animação (L$[COST])..." name="Upload Animation"/>
<menu_item_call label="Modelar..." name="Upload Model"/>
<menu_item_call label="Volume (L$[COST] por arquivo)..." name="Bulk Upload"/>
+ <menu_item_call label="Autorizações de upload padrão" name="perm prefs"/>
</menu>
<menu_item_call label="Desfazer" name="Undo"/>
<menu_item_call label="Repetir" name="Redo"/>
</menu>
<menu label="Ajuda" name="Help">
+ <menu_item_call label="Como..." name="How To"/>
<menu_item_call label="[SECOND_LIFE] Ajuda" name="Second Life Help"/>
- <menu_item_check label="Ativar dicas" name="Enable Hints"/>
<menu_item_call label="Denunciar abuso" name="Report Abuse"/>
<menu_item_call label="Relatar bug" name="Report Bug"/>
<menu_item_call label="Sobre [APP_NAME]" name="About Second Life"/>
@@ -161,11 +167,11 @@
<menu label="Ferramentas de desempenho" name="Performance Tools">
<menu_item_call label="Medidor de lag" name="Lag Meter"/>
<menu_item_check label="Barra de estatísticas" name="Statistics Bar"/>
- <menu_item_check label="Carga de renderização de avatar" name="Avatar Rendering Cost"/>
+ <menu_item_check label="Mostrar peso do desenho para avatares" name="Avatar Rendering Cost"/>
</menu>
<menu label="Realces e visibilidade" name="Highlighting and Visibility">
<menu_item_check label="Efeito baliza piscando" name="Cheesy Beacon"/>
- <menu_item_check label="Hide Particles" name="Hide Particles"/>
+ <menu_item_check label="Esconder partículas" name="Hide Particles"/>
<menu_item_check label="Ocultar seleções" name="Hide Selected"/>
<menu_item_check label="Realçar transparentes" name="Highlight Transparent"/>
<menu_item_check label="Mostrar anexos HUD" name="Show HUD Attachments"/>
@@ -183,7 +189,7 @@
<menu_item_check label="Volume" name="Volume"/>
<menu_item_check label="Grama" name="Grass"/>
<menu_item_check label="Nuvens" name="Clouds"/>
- <menu_item_check label="Particles" name="Particles"/>
+ <menu_item_check label="Partículas" name="Particles"/>
<menu_item_check label="Elevação" name="Bump"/>
</menu>
<menu label="Recursos de renderização" name="Rendering Features">
@@ -198,11 +204,10 @@
<menu_item_check label="Usar plugin de leitura de threads" name="Use Plugin Read Thread"/>
<menu_item_call label="Limpar cache de grupo" name="ClearGroupCache"/>
<menu_item_check label="Smoothing de mouse" name="Mouse Smoothing"/>
+ <menu_item_call label="Liberar teclas" name="Release Keys"/>
<menu label="Atalhos" name="Shortcuts">
<menu_item_call label="Imagem (L$[COST])..." name="Upload Image"/>
<menu_item_check label="Busca" name="Search"/>
- <menu_item_call label="Soltar objeto" name="Release Keys"/>
- <menu_item_call label="Interface tamanho padrão" name="Set UI Size to Default"/>
<menu_item_check label="Mostrar menu avançado - atalho antigo" name="Show Advanced Menu - legacy shortcut"/>
<menu_item_call label="Fechar janela" name="Close Window"/>
<menu_item_call label="Fechar todas as janelas" name="Close All Windows"/>
@@ -271,6 +276,8 @@
<menu_item_check label="Tipo de atualização" name="Update Type"/>
<menu_item_check label="Dados LOD" name="LOD Info"/>
<menu_item_check label="Fila de construção" name="Build Queue"/>
+ <menu_item_check label="Vetores de vento" name="Wind Vectors"/>
+ <menu_item_check label="Renderizar complexidade" name="rendercomplexity"/>
<menu_item_check label="Esculpir" name="Sculpt"/>
</menu>
<menu label="Rendering" name="Rendering">
@@ -279,7 +286,6 @@
<menu_item_check label="Iluminação e sombras" name="Lighting and Shadows"/>
<menu_item_check label="Sombras da projeção do sol/lua" name="Shadows from Sun/Moon/Projectors"/>
<menu_item_check label="SSAO e sombra suave" name="SSAO and Shadow Smoothing"/>
- <menu_item_check label="Iluminação global (fase experimental)" name="Global Illumination"/>
<menu_item_check label="Máscaras alpha automáticas (adiadas)" name="Automatic Alpha Masks (deferred)"/>
<menu_item_check label="Máscaras alpha automáticas (sem adiar)" name="Automatic Alpha Masks (non-deferred)"/>
<menu_item_check label="Texturas de animação" name="Animation Textures"/>
diff --git a/indra/newview/skins/default/xui/pt/notifications.xml b/indra/newview/skins/default/xui/pt/notifications.xml
index 70d882822d..2c5ccd6e19 100644
--- a/indra/newview/skins/default/xui/pt/notifications.xml
+++ b/indra/newview/skins/default/xui/pt/notifications.xml
@@ -973,7 +973,7 @@ Oferecer amizade para [NAME]?
</form>
</notification>
<notification name="RemoveFromFriends">
- Remover [NAME] da sua lista de amigos?
+ Deseja remover &lt;nolink&gt;[NAME]&lt;/nolink&gt; da sua lista de amigos?
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Remover"/>
</notification>
<notification name="RemoveMultipleFromFriends">
@@ -1099,8 +1099,13 @@ Doar este terreno de [AREA] m² para o grupo &apos;[GROUP_NAME]&apos;?
<notification name="DisplaySetToSafe">
Configurações de display foram ajustadas para níveis de segurança porque você especificou -- opção de segurança.
</notification>
- <notification name="DisplaySetToRecommended">
- Configurações de display foram ajustadas para nível recomendado baseado na configuração do seu sistema.
+ <notification name="DisplaySetToRecommendedGPUChange">
+ As configurações de tela foram definidas nos níveis recomendados porque sua placa de vídeo foi alterada
+de &apos;[LAST_GPU]&apos;
+para &apos;[THIS_GPU]&apos;
+ </notification>
+ <notification name="DisplaySetToRecommendedFeatureChange">
+ As configurações de tela foram definidas nos níveis recomendados por causa de uma alteração no subsistema de renderização.
</notification>
<notification name="ErrorMessage">
[ERROR_MESSAGE]
@@ -1419,7 +1424,7 @@ Para instalar a atualização, será preciso reiniciar o [APP_NAME].
<usetemplate ignoretext="Confirmar antes de devolver objetos a seus donos" name="okcancelignore" notext="Cancelar" yestext="Retornar"/>
</notification>
<notification name="GroupLeaveConfirmMember">
- Você é atualmente um membro do grupo [GROUP].
+ Você é atualmente um membro do grupo &lt;nolink&gt;[GROUP]&lt;/nolink&gt;.
Sair do grupo?
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Sair"/>
</notification>
@@ -1899,6 +1904,18 @@ Mover para o inventário o(s) item(s)?
Tem certeza que deseja sair?
<usetemplate ignoretext="Confirmar antes de sair" name="okcancelignore" notext="Não sair" yestext="Sair"/>
</notification>
+ <notification name="ConfirmRestoreToybox">
+ Essa ação irá restaurar os botões e barras de ferramenta padrão.
+
+Não é possível desfazer essa ação.
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmClearAllToybox">
+ Essa ação fará com que todos os botões voltem para a caixa de ferramentas e suas barras de ferramentas ficarão vazias.
+
+Não é possível desfazer essa ação.
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
<notification name="DeleteItems">
[QUESTION]
<usetemplate ignoretext="Confirmar antes de excluir" name="okcancelignore" notext="Cancelar" yestext="OK"/>
@@ -2103,10 +2120,10 @@ Isso abrirá o seu navegador.
Assunto: [SUBJECT], Mensagem: [MESSAGE]
</notification>
<notification name="FriendOnline">
- [NAME] está online
+ &lt;nolink&gt;[NAME]&lt;/nolink&gt; está online
</notification>
<notification name="FriendOffline">
- [NAME] está offline
+ &lt;nolink&gt;[NAME]&lt;/nolink&gt; está offline
</notification>
<notification name="AddSelfFriend">
Você é o máximo! Mesmo assim, não dá para adicionar a si mesmo(a) como amigo(a).
@@ -2219,14 +2236,16 @@ Selecione só um objeto.
Seu cartão de visita foi negado.
</notification>
<notification name="TeleportToLandmark">
- Para se teletransportar para lugares como &apos;[NAME]&apos;, abra o painel &apos;Lugares&apos; à direita da tela e selecione a guia Marcos.
-Basta clicar em qualquer marco e depois clicar em &apos;Teletransportar&apos; na parte inferior da tela.
-(Também é possível clicar duas vezes no marco, ou clicar no marco com o botão direito e selecionar &apos;Teletransportar&apos;.)
+ Para se teletransportar para locais como &apos;[NAME]&apos;, clique no botão &quot;Lugares&quot;,
+ e selecione a guia Marcos na janela que é exibida. Clique em qualquer
+ marco para selecioná-lo e em seguida em &apos;Teletransportar&apos; na parte inferior da tela.
+ (Também é possível clicar duas vezes sobre o marco ou clicar com o botão direito do mouse sobre ele
+ e selecionar &apos;Teletransportar&apos;.)
</notification>
<notification name="TeleportToPerson">
- Para entrar em contato com residentes como &apos;&apos;[NAME]&apos;, abra o painel &apos;Pessoas&apos; à direita da tela.
-Selecione o residente da lista e clique em &apos;MI&apos; na parte de baixo do painel.
-(Também é possível clicar duas vezes no nome, ou clicar no nome com o botão direito e selecionar &apos;MI&apos;.)
+ Para entrar em contato com residentes como &apos;[NAME]&apos;, clique no botão &quot;Pessoas&quot;, selecione um residente na janela que é exibida e clique em &apos;MI&apos; na
+ parte inferior da janela.
+ (Também é possível clicar duas vezes no nome, ou clicar no nome com o botão direito e selecionar &apos;MI&apos;.)
</notification>
<notification name="CantSelectLandFromMultipleRegions">
Impossível selecionar terra nas fronteiras do servidor. Tente selecionar um pedaço menor de terra.
@@ -2246,6 +2265,9 @@ Selecione o residente da lista e clique em &apos;MI&apos; na parte de baixo do p
<notification name="PaymentSent">
[MESSAGE]
</notification>
+ <notification name="PaymentFailure">
+ [MESSAGE]
+ </notification>
<notification name="EventNotification">
Notificação de evento:
@@ -2495,10 +2517,10 @@ Cada um pode ver o status do outro (definição padrão).
</form>
</notification>
<notification name="FriendshipAccepted">
- [NAME] aceitou seu convite de amizade.
+ &lt;nolink&gt;[NAME]&lt;/nolink&gt; aceitou sua oferta de amizade.
</notification>
<notification name="FriendshipDeclined">
- [NAME] recusou seu convite de amizade
+ &lt;nolink&gt;[NAME]&lt;/nolink&gt; rejeitou sua oferta de amizade.
</notification>
<notification name="FriendshipAcceptedByMe">
Oferta de amizada aceita.
@@ -2976,10 +2998,6 @@ Se o botão Falar for ocultado, o recurso de voz será desabilitado.
<button name="cancel" text="Cancelar"/>
</form>
</notification>
- <notification label="" name="ModeChange">
- Para alterar o modo, é preciso fechar e reiniciar.
- <usetemplate name="okcancelbuttons" notext="Não sair" yestext="Sair"/>
- </notification>
<notification label="" name="NoClassifieds">
É preciso usar o modo Avançado para criar e editar anúncios classificados. Desejar sair para mudar o modo? Selecione o modo na tela de login.
<usetemplate name="okcancelbuttons" notext="Não sair" yestext="Sair"/>
@@ -3024,6 +3042,10 @@ Se o botão Falar for ocultado, o recurso de voz será desabilitado.
É preciso estar no modo Avançado para fazer pesquisas. Deseja sair para mudar o modo?
<usetemplate name="okcancelbuttons" notext="Não sair" yestext="Sair"/>
</notification>
+ <notification label="" name="ConfirmHideUI">
+ Essa ação irá ocultar todos os itens de menu e botões. Para trazê-los de volta, clique em [SHORTCUT] novamente.
+ <usetemplate ignoretext="Confirmar antes de ocultar interface" name="okcancelignore" notext="Cancelar" yestext="OK"/>
+ </notification>
<global name="UnsupportedGLRequirements">
Aparentemente a sua máquina não atende os requisitos de hardware do [APP_NAME]. [APP_NAME] requer placas de vídeo OpenGL com suporte a multitexturas. Se sua place de vídeo tiver este perfil, atualize o driver da placa de vídeo, assim como patches e service packs do sistema operacional.
diff --git a/indra/newview/skins/default/xui/pt/panel_chiclet_bar.xml b/indra/newview/skins/default/xui/pt/panel_chiclet_bar.xml
new file mode 100644
index 0000000000..0551d9cba6
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_chiclet_bar.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="chiclet_bar">
+ <layout_stack name="toolbar_stack">
+ <layout_panel name="im_well_panel">
+ <chiclet_im_well name="im_well">
+ <button name="Unread IM messages" tool_tip="Conversas"/>
+ </chiclet_im_well>
+ </layout_panel>
+ <layout_panel name="notification_well_panel">
+ <chiclet_notification name="notification_well">
+ <button name="Unread" tool_tip="Notificações"/>
+ </chiclet_notification>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_edit_skin.xml b/indra/newview/skins/default/xui/pt/panel_edit_skin.xml
index f3d88123f2..d00aa2dc66 100644
--- a/indra/newview/skins/default/xui/pt/panel_edit_skin.xml
+++ b/indra/newview/skins/default/xui/pt/panel_edit_skin.xml
@@ -1,9 +1,9 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_skin_panel">
<panel name="avatar_skin_color_panel">
- <texture_picker label="Tatuagens na cabeça" name="Head Tattoos" tool_tip="Selecionar imagem"/>
- <texture_picker label="Tatuagem parte de cima" name="Upper Tattoos" tool_tip="Selecionar imagem"/>
- <texture_picker label="Tatuagem de baixo" name="Lower Tattoos" tool_tip="Selecionar imagem"/>
+ <texture_picker label="Cabeça" name="Head" tool_tip="Selecionar imagem"/>
+ <texture_picker label="Cintura acima" name="Upper Body" tool_tip="Selecionar imagem"/>
+ <texture_picker label="Cintura para baixo" name="Lower Body" tool_tip="Selecionar imagem"/>
</panel>
<panel name="accordion_panel">
<accordion name="wearable_accordion">
diff --git a/indra/newview/skins/default/xui/pt/panel_me.xml b/indra/newview/skins/default/xui/pt/panel_me.xml
index 412f75ca78..281c886bd4 100644
--- a/indra/newview/skins/default/xui/pt/panel_me.xml
+++ b/indra/newview/skins/default/xui/pt/panel_me.xml
@@ -1,7 +1,4 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Meu perfil" name="panel_me">
- <tab_container name="tabs">
- <panel label="MEU PERFIL" name="panel_profile"/>
- <panel label="MEUS DESTAQUES" name="panel_picks"/>
- </tab_container>
+ <panel label="MEUS DESTAQUES" name="panel_picks"/>
</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_my_profile.xml b/indra/newview/skins/default/xui/pt/panel_my_profile.xml
deleted file mode 100644
index aa15a2445d..0000000000
--- a/indra/newview/skins/default/xui/pt/panel_my_profile.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Perfil" name="panel_profile">
- <string name="no_partner_text" value="Nenhum"/>
- <string name="no_group_text" value="Nenhum"/>
- <string name="RegisterDateFormat">
- [REG_DATE] ([AGE])
- </string>
- <string name="name_text_args">
- [NAME]
- </string>
- <string name="display_name_text_args">
- [DISPLAY_NAME]
- </string>
- <layout_stack name="layout">
- <layout_panel name="profile_stack">
- <scroll_container name="profile_scroll">
- <panel name="scroll_content_panel">
- <panel name="second_life_image_panel">
- <text name="display_name_descr_text">
- Nome de usuário
- </text>
- <text name="name_descr_text">
- Nome de tela
- </text>
- <button label="Perfil" name="see_profile_btn" tool_tip="Ver o perfil deste avatar"/>
- </panel>
- </panel>
- </scroll_container>
- </layout_panel>
- </layout_stack>
-</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_navigation_bar.xml b/indra/newview/skins/default/xui/pt/panel_navigation_bar.xml
index 01930bf3b3..4fa5436805 100644
--- a/indra/newview/skins/default/xui/pt/panel_navigation_bar.xml
+++ b/indra/newview/skins/default/xui/pt/panel_navigation_bar.xml
@@ -1,18 +1,23 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="navigation_bar">
- <panel name="navigation_panel">
- <pull_button name="back_btn" tool_tip="Voltar para região anterior"/>
- <pull_button name="forward_btn" tool_tip="Avançar uma região"/>
- <button name="home_btn" tool_tip="Teletransportar para meu início"/>
- <location_input label="Onde" name="location_combo"/>
- <search_combo_box label="Busca" name="search_combo_box" tool_tip="Busca">
- <combo_editor label="Buscar no [SECOND_LIFE]" name="search_combo_editor"/>
- </search_combo_box>
- </panel>
- <favorites_bar name="favorite" tool_tip="Arraste marcos para cá para acessar seus lugares preferidos do Second Life!">
- <label name="favorites_bar_label" tool_tip="Arraste marcos para cá para acessar seus lugares preferidos do Second Life!">
- Barra Destaques
- </label>
- <chevron_button name="&gt;&gt;" tool_tip="Mostrar mais favoritos"/>
- </favorites_bar>
+ <layout_stack name="nvp_stack">
+ <layout_panel name="navigation_layout_panel">
+ <panel name="navigation_panel">
+ <pull_button name="back_btn" tool_tip="Voltar para região anterior"/>
+ <pull_button name="forward_btn" tool_tip="Avançar uma região"/>
+ <button name="home_btn" tool_tip="Teletransportar para meu início"/>
+ <location_input label="Onde" name="location_combo"/>
+ </panel>
+ </layout_panel>
+ <layout_panel name="favorites_layout_panel">
+ <favorites_bar name="favorite" tool_tip="Arraste marcos para cá para acessar seus lugares preferidos do Second Life!">
+ <label name="favorites_bar_label" tool_tip="Arraste marcos para cá para acessar seus lugares preferidos do Second Life!">
+ Barra Destaques
+ </label>
+ <more_button name="&gt;&gt;" tool_tip="Mostrar mais favoritos">
+ Mais â–¼
+ </more_button>
+ </favorites_bar>
+ </layout_panel>
+ </layout_stack>
</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_nearby_chat.xml b/indra/newview/skins/default/xui/pt/panel_nearby_chat.xml
new file mode 100644
index 0000000000..15470dc94a
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_nearby_chat.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="nearby_chat">
+ <check_box label="Traduzir bate-papo" name="translate_chat_checkbox"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_notes.xml b/indra/newview/skins/default/xui/pt/panel_notes.xml
deleted file mode 100644
index c15e838b34..0000000000
--- a/indra/newview/skins/default/xui/pt/panel_notes.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Anotações e Privacidade" name="panel_notes">
- <layout_stack name="layout">
- <layout_panel name="notes_stack">
- <scroll_container name="profile_scroll">
- <panel name="profile_scroll_panel">
- <text name="status_message" value="Minhas anotações privadas:"/>
- <text name="status_message2" value="Deixar esta pessoa:"/>
- <check_box label="Ver meu status" name="status_check"/>
- <check_box label="Ver minha localização no mapa" name="map_check"/>
- <check_box label="Pegar, editar ou excluir objetos meus" name="objects_check"/>
- </panel>
- </scroll_container>
- </layout_panel>
- <layout_panel name="notes_buttons_panel">
- <layout_stack name="bottom_bar_ls">
- <layout_panel name="add_friend_btn_lp">
- <button label="Adicionar amigo" name="add_friend" tool_tip="Oferecer amizade ao residente"/>
- </layout_panel>
- <layout_panel name="im_btn_lp">
- <button label="MI" name="im" tool_tip="Abrir sessão de mensagem instantânea"/>
- </layout_panel>
- <layout_panel name="call_btn_lp">
- <button label="Ligar" name="call" tool_tip="Ligar para este residente"/>
- </layout_panel>
- <layout_panel name="show_on_map_btn_lp">
- <button label="Mapa" name="show_on_map_btn" tool_tip="Exibir o residente no mapa"/>
- </layout_panel>
- <layout_panel name="teleport_btn_lp">
- <button label="Teletransportar" name="teleport" tool_tip="Oferecer teletransporte"/>
- </layout_panel>
- </layout_stack>
- </layout_panel>
- </layout_stack>
-</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_postcard_message.xml b/indra/newview/skins/default/xui/pt/panel_postcard_message.xml
new file mode 100644
index 0000000000..9cde810430
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_postcard_message.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_postcard_message">
+ <text name="to_label">
+ Para:
+ </text>
+ <text name="name_label">
+ De:
+ </text>
+ <text name="subject_label">
+ Assunto:
+ </text>
+ <line_editor label="Digite aqui o assunto." name="subject_form"/>
+ <text name="msg_label">
+ Mensagem:
+ </text>
+ <text_editor name="msg_form">
+ Digite aqui a mensagem.
+ </text_editor>
+ <button label="Cancelar" name="cancel_btn"/>
+ <button label="Enviar" name="send_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_postcard_settings.xml b/indra/newview/skins/default/xui/pt/panel_postcard_settings.xml
new file mode 100644
index 0000000000..3088b9a996
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_postcard_settings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_postcard_settings">
+ <combo_box label="Resolução" name="postcard_size_combo">
+ <combo_box.item label="Janela atual" 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="Customizado" name="Custom"/>
+ </combo_box>
+ <layout_stack name="postcard_image_params_ls">
+ <layout_panel name="postcard_image_size_lp">
+ <spinner label="Largura" name="postcard_snapshot_width"/>
+ <spinner label="Altura" name="postcard_snapshot_height"/>
+ <check_box label="Limitar proporções" name="postcard_keep_aspect_check"/>
+ </layout_panel>
+ <layout_panel name="postcard_image_format_quality_lp">
+ <slider label="Qualidade da imagem" name="image_quality_slider"/>
+ <text name="image_quality_level">
+ ([QLVL])
+ </text>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_preferences_chat.xml b/indra/newview/skins/default/xui/pt/panel_preferences_chat.xml
index e5aa42aae0..c5a4febb0e 100644
--- a/indra/newview/skins/default/xui/pt/panel_preferences_chat.xml
+++ b/indra/newview/skins/default/xui/pt/panel_preferences_chat.xml
@@ -29,30 +29,5 @@
<check_box label="Bate-papos de MI" name="EnableIMChatPopups" tool_tip="Exibir pop-up de mensagens instantâneas novas"/>
<spinner label="Transição de avisos de bate-papos por perto:" name="nearby_toasts_lifetime"/>
<spinner label="Transição de avisos de bate-papos por perto:" name="nearby_toasts_fadingtime"/>
- <check_box name="translate_chat_checkbox"/>
- <text name="translate_chb_label">
- Traduzir bate-papo automaticamente (via Google)
- </text>
- <text name="translate_language_text">
- Traduzir bate-papo para:
- </text>
- <combo_box name="translate_language_combobox">
- <combo_box.item label="Padrão" name="System Default Language"/>
- <combo_box.item label="English (Inglês)" name="English"/>
- <combo_box.item label="Dansk (Dinamarquês)" name="Danish"/>
- <combo_box.item label="Deutsch (Alemão)" name="German"/>
- <combo_box.item label="Español (Espanhol)" name="Spanish"/>
- <combo_box.item label="Français (Francês)" name="French"/>
- <combo_box.item label="Italiano (Italiano)" name="Italian"/>
- <combo_box.item label="Magyar (Húngaro)" name="Hungarian"/>
- <combo_box.item label="Nederlands (Holandês)" name="Dutch"/>
- <combo_box.item label="Polski (Polonês)" name="Polish"/>
- <combo_box.item label="Português (Português)" name="Portugese"/>
- <combo_box.item label="РуÑÑкий (Russo)" name="Russian"/>
- <combo_box.item label="Türkçe (Turco)" name="Turkish"/>
- <combo_box.item label="УкраїнÑька (Ucraniano)" name="Ukrainian"/>
- <combo_box.item label="中文 (简体) (Chinês)" name="Chinese"/>
- <combo_box.item label="日本語 (Japonês)" name="Japanese"/>
- <combo_box.item label="한국어 (Coreano)" name="Korean"/>
- </combo_box>
+ <button label="Configurações de tradução de bate-papo" name="ok_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_preferences_general.xml b/indra/newview/skins/default/xui/pt/panel_preferences_general.xml
index deeb917e82..c53aa7d5f7 100644
--- a/indra/newview/skins/default/xui/pt/panel_preferences_general.xml
+++ b/indra/newview/skins/default/xui/pt/panel_preferences_general.xml
@@ -11,10 +11,12 @@
<combo_box.item label="Español (Espanhol) - Beta" name="Spanish"/>
<combo_box.item label="Français (Francês) - Beta" name="French"/>
<combo_box.item label="Italiano - Beta" name="Italian"/>
- <combo_box.item label="Nederlands (Holandês) - Beta" name="Dutch"/>
<combo_box.item label="Polski (Polonês) - Beta" name="Polish"/>
<combo_box.item label="Português (Português) - Beta" name="Portugese"/>
+ <combo_box.item label="РуÑÑкий (Russo) - Beta" name="Russian"/>
+ <combo_box.item label="Türkçe (Turco) - Beta" name="Turkish"/>
<combo_box.item label="日本語 (Japonês) - Beta" name="(Japanese)"/>
+ <combo_box.item label="正體中文 (Chinês tradicional) - Beta" name="Traditional Chinese"/>
</combo_box>
<text name="language_textbox2">
(Reinicie para trocar de idioma)
@@ -49,7 +51,6 @@
<check_box label="Cargos do grupo" name="show_all_title_checkbox1" tool_tip="Mostrar os títulos de cargos, como membro ou diretor"/>
<check_box label="Realçar amigos" name="show_friends" tool_tip="Realçar nomes de tela de amigos"/>
<check_box label="Ver nomes de tela" name="display_names_check" tool_tip="Usar nome de tela no bate-papo, MI, etc."/>
- <check_box label="Exibir dicas da interface" name="viewer_hints_check"/>
<text name="inworld_typing_rg_label">
Teclas de letras:
</text>
diff --git a/indra/newview/skins/default/xui/pt/panel_preferences_move.xml b/indra/newview/skins/default/xui/pt/panel_preferences_move.xml
index 1a4c271827..fa6f5f5851 100644
--- a/indra/newview/skins/default/xui/pt/panel_preferences_move.xml
+++ b/indra/newview/skins/default/xui/pt/panel_preferences_move.xml
@@ -7,18 +7,33 @@
</text>
<check_box label="Construir/Editar" name="edit_camera_movement" tool_tip="Use o posicionamento automático da câmera quando entrar e sair do modo de edição"/>
<check_box label="Aparência" name="appearance_camera_movement" tool_tip="Use o posicionamento automático da câmera quando em modo de edição"/>
- <check_box initial_value="verdadeiro" label="Barra lateral" name="appearance_sidebar_positioning" tool_tip="Usar posicionamento automático da câmera na barra lateral"/>
+ <text name="keyboard_lbl">
+ Teclado:
+ </text>
+ <check_box label="Teclas de seta sempre me movem" name="arrow_keys_move_avatar_check"/>
+ <check_box label="Dê dois toques e pressione para correr" name="tap_tap_hold_to_run"/>
+ <text name="mouse_lbl">
+ Mouse:
+ </text>
<check_box label="Mostre-me em visão de mouse" name="first_person_avatar_visible"/>
<text name=" Mouse Sensitivity">
Sensibilidade do mouse:
</text>
<check_box label="Inverter" name="invert_mouse"/>
- <check_box label="Teclas de seta sempre me movem" name="arrow_keys_move_avatar_check"/>
- <check_box label="Dê dois toques e pressione para correr" name="tap_tap_hold_to_run"/>
- <check_box label="Dar dois cliques para:" name="double_click_chkbox"/>
- <radio_group name="double_click_action">
- <radio_item label="Teletransportar" name="radio_teleport"/>
- <radio_item label="Piloto automático" name="radio_autopilot"/>
- </radio_group>
+ <text name="single_click_action_lbl">
+ Clique único no terreno:
+ </text>
+ <combo_box name="single_click_action_combo">
+ <combo_box.item label="Nenhuma ação" name="0"/>
+ <combo_box.item label="Mover para ponto clicado" name="1"/>
+ </combo_box>
+ <text name="double_click_action_lbl">
+ Clique duplo no terreno:
+ </text>
+ <combo_box name="double_click_action_combo">
+ <combo_box.item label="Nenhuma ação" name="0"/>
+ <combo_box.item label="Mover para ponto clicado" name="1"/>
+ <combo_box.item label="Teletransportar para ponto clicado" name="2"/>
+ </combo_box>
<button label="Outros dispositivos" name="joystick_setup_button"/>
</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_preferences_setup.xml b/indra/newview/skins/default/xui/pt/panel_preferences_setup.xml
index 9259c0ed56..ebbd63138a 100644
--- a/indra/newview/skins/default/xui/pt/panel_preferences_setup.xml
+++ b/indra/newview/skins/default/xui/pt/panel_preferences_setup.xml
@@ -15,7 +15,7 @@
Web:
</text>
<radio_group name="use_external_browser">
- <radio_item label="Usar meu navegador (IE, Firefox, Safari)" name="external" tool_tip="Use o navegador incluso para consultar a ajuda, abrir links da web, etc. Uso em tela inteira não recomendado." value="1"/>
+ <radio_item label="Usar meu navegador (IE, Firefox, Safari)" name="external" tool_tip="Use o navegador incluso para consultar a ajuda, abrir links da web, etc. Uso em tela inteira não recomendado." value="true"/>
<radio_item label="Usar navegador incluso" name="internal" tool_tip="Use este navegador para consultar a ajuda, abrir links da web, etc. As janelas abrem dentro do [APP_NAME]." value=""/>
</radio_group>
<check_box initial_value="true" label="Habilitar plugins" name="browser_plugins_enabled"/>
diff --git a/indra/newview/skins/default/xui/pt/panel_profile.xml b/indra/newview/skins/default/xui/pt/panel_profile.xml
deleted file mode 100644
index 075ef55dee..0000000000
--- a/indra/newview/skins/default/xui/pt/panel_profile.xml
+++ /dev/null
@@ -1,70 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Perfil" name="panel_profile">
- <string name="CaptionTextAcctInfo">
- [ACCTTYPE]
-[PAYMENTINFO] [AGEVERIFICATION]
- </string>
- <string name="payment_update_link_url">
- http://www.secondlife.com/account/billing.php?lang=pt-BR
- </string>
- <string name="partner_edit_link_url">
- http://www.secondlife.com/account/partners.php?lang=pt
- </string>
- <string name="my_account_link_url" value="http://secondlife.com/my/account/index.php?lang=pt-BR"/>
- <string name="no_partner_text" value="Ninguém"/>
- <string name="no_group_text" value="Nenhum"/>
- <string name="RegisterDateFormat">
- [REG_DATE] ([AGE])
- </string>
- <string name="name_text_args">
- [NAME]
- </string>
- <string name="display_name_text_args">
- [DISPLAY_NAME]
- </string>
- <layout_stack name="layout">
- <layout_panel name="profile_stack">
- <scroll_container name="profile_scroll">
- <panel name="profile_scroll_panel">
- <panel name="second_life_image_panel">
- <text name="title_sl_descr_text" value="[SECOND_LIFE]:"/>
- </panel>
- <panel name="first_life_image_panel">
- <text name="title_rw_descr_text" value="Mundo real:"/>
- </panel>
- <text name="title_member_text" value="Residente desde:"/>
- <text name="title_acc_status_text" value="Conta:"/>
- <text name="title_partner_text" value="Parceiro(a):"/>
- <panel name="partner_data_panel">
- <text initial_value="(pesquisando)" name="partner_text"/>
- </panel>
- <text name="title_groups_text" value="Grupos:"/>
- </panel>
- </scroll_container>
- </layout_panel>
- </layout_stack>
- <layout_stack name="layout_verb_buttons">
- <layout_panel name="profile_buttons_panel">
- <layout_stack name="bottom_bar_ls">
- <layout_panel name="add_friend_btn_lp">
- <button label="Adicionar amigo" name="add_friend" tool_tip="Oferecer amizade ao residente"/>
- </layout_panel>
- <layout_panel name="im_btn_lp">
- <button label="MI" name="im" tool_tip="Abrir sessão de mensagem instantânea"/>
- </layout_panel>
- <layout_panel name="call_btn_lp">
- <button label="Ligar" name="call" tool_tip="Ligar para este residente"/>
- </layout_panel>
- <layout_panel name="chat_btn_lp">
- <button label="Teletransportar" name="teleport" tool_tip="Oferecer teletransporte"/>
- </layout_panel>
- <layout_panel name="overflow_btn_lp">
- <menu_button label="▼" name="overflow_btn" tool_tip="Pagar ou compartilhar inventário com o residente"/>
- </layout_panel>
- </layout_stack>
- </layout_panel>
- <layout_panel name="profile_me_buttons_panel">
- <button label="Editar perfil" name="edit_profile_btn" tool_tip="Editar dados pessoais"/>
- </layout_panel>
- </layout_stack>
-</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_profile_view.xml b/indra/newview/skins/default/xui/pt/panel_profile_view.xml
deleted file mode 100644
index d81ee08e6c..0000000000
--- a/indra/newview/skins/default/xui/pt/panel_profile_view.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="panel_target_profile">
- <string name="status_online">
- Conectado
- </string>
- <string name="status_offline">
- Desconectado
- </string>
- <text name="display_name_label" value="Nome de tela:"/>
- <text name="solo_username_label" value="Nome de usuário:"/>
- <text name="status" value="Conectado"/>
- <text name="user_name_small" value="Jack oh look at me this is a super duper long name"/>
- <button name="copy_to_clipboard" tool_tip="Copiar para área de transferência"/>
- <text name="user_label" value="Nome de usuário:"/>
- <tab_container name="tabs">
- <panel label="PERFIL" name="panel_profile"/>
- <panel label="DESTAQUES" name="panel_picks"/>
- <panel label="ANOTAÇÕES E PRIVACIDADE" name="panel_notes"/>
- </tab_container>
-</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_snapshot_inventory.xml b/indra/newview/skins/default/xui/pt/panel_snapshot_inventory.xml
new file mode 100644
index 0000000000..3c4bb18687
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_snapshot_inventory.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_snapshot_inventory">
+ <text name="title">
+ Salvar no meu inventário
+ </text>
+ <text name="hint_lbl">
+ Salvar uma imagem em seu inventário custa L$[UPLOAD_COST]. Para salvar sua imagem como uma textura, selecione um dos formatos quadrados.
+ </text>
+ <combo_box label="Resolução" name="texture_size_combo">
+ <combo_box.item label="Janela atual" name="CurrentWindow"/>
+ <combo_box.item label="Pequeno (128x128)" name="Small(128x128)"/>
+ <combo_box.item label="Médio (256x256)" name="Medium(256x256)"/>
+ <combo_box.item label="Grande (512x512)" name="Large(512x512)"/>
+ <combo_box.item label="Customizado" name="Custom"/>
+ </combo_box>
+ <spinner label="Largura" name="inventory_snapshot_width"/>
+ <spinner label="Altura" name="inventory_snapshot_height"/>
+ <check_box label="Limitar proporções" name="inventory_keep_aspect_check"/>
+ <button label="Cancelar" name="cancel_btn"/>
+ <button label="Salvar" name="save_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_snapshot_local.xml b/indra/newview/skins/default/xui/pt/panel_snapshot_local.xml
new file mode 100644
index 0000000000..36b5b0cbe6
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_snapshot_local.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_snapshot_local">
+ <text name="title">
+ Salvar no meu PC
+ </text>
+ <combo_box label="Resolução" name="local_size_combo">
+ <combo_box.item label="Janela atual" name="CurrentWindow"/>
+ <combo_box.item label="320x240" name="320x240"/>
+ <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="1280x1024" name="1280x1024"/>
+ <combo_box.item label="1600x1200" name="1600x1200"/>
+ <combo_box.item label="Customizado" name="Custom"/>
+ </combo_box>
+ <layout_stack name="local_image_params_ls">
+ <layout_panel name="local_image_size_lp">
+ <spinner label="Largura" name="local_snapshot_width"/>
+ <spinner label="Altura" name="local_snapshot_height"/>
+ <check_box label="Limitar proporções" name="local_keep_aspect_check"/>
+ </layout_panel>
+ <layout_panel name="local_image_format_quality_lp">
+ <combo_box label="Formato" name="local_format_combo">
+ <combo_box.item label="PNG (sem perda)" name="PNG"/>
+ <combo_box.item label="JPEG" name="JPEG"/>
+ <combo_box.item label="BMP (sem perda)" name="BMP"/>
+ </combo_box>
+ <slider label="Qualidade da imagem" name="image_quality_slider"/>
+ <text name="image_quality_level">
+ ([QLVL])
+ </text>
+ </layout_panel>
+ </layout_stack>
+ <button label="Cancelar" name="cancel_btn"/>
+ <flyout_button label="Salvar" name="save_btn" tool_tip="Salvar imagem em um arquivo">
+ <flyout_button.item label="Salvar" name="save_item"/>
+ <flyout_button.item label="Salvar como..." name="saveas_item"/>
+ </flyout_button>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_snapshot_options.xml b/indra/newview/skins/default/xui/pt/panel_snapshot_options.xml
new file mode 100644
index 0000000000..7f1452e992
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_snapshot_options.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_snapshot_options">
+ <button label="Postar no feed do meu perfil" name="save_to_profile_btn"/>
+ <button label="E-mail" name="save_to_email_btn"/>
+ <button label="Salvar em Meu inventário (L$[AMOUNT])" name="save_to_inventory_btn"/>
+ <button label="Salvar no meu PC" name="save_to_computer_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_snapshot_postcard.xml b/indra/newview/skins/default/xui/pt/panel_snapshot_postcard.xml
new file mode 100644
index 0000000000..12a648f600
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_snapshot_postcard.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_snapshot_postcard">
+ <string name="default_subject">
+ Postal do [SECOND_LIFE].
+ </string>
+ <string name="default_message">
+ Confira!
+ </string>
+ <string name="upload_message">
+ Enviando...
+ </string>
+ <text name="title">
+ E-mail
+ </text>
+ <button label="Mensagem" name="message_btn"/>
+ <button label="Configurações" name="settings_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_snapshot_profile.xml b/indra/newview/skins/default/xui/pt/panel_snapshot_profile.xml
new file mode 100644
index 0000000000..095b8fc75d
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_snapshot_profile.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_snapshot_profile">
+ <text name="title">
+ Postar no feed do meu perfil
+ </text>
+ <combo_box label="Resolução" name="profile_size_combo">
+ <combo_box.item label="Janela atual" 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="Customizado" name="Custom"/>
+ </combo_box>
+ <layout_stack name="profile_image_params_ls">
+ <layout_panel name="profile_image_size_lp">
+ <spinner label="Largura" name="profile_snapshot_width"/>
+ <spinner label="Altura" name="profile_snapshot_height"/>
+ <check_box label="Limitar proporções" name="profile_keep_aspect_check"/>
+ </layout_panel>
+ <layout_panel name="profile_image_metadata_lp">
+ <text name="caption_label">
+ Legenda:
+ </text>
+ <check_box initial_value="true" label="Incluir local" name="add_location_cb"/>
+ </layout_panel>
+ </layout_stack>
+ <button label="Cancelar" name="cancel_btn"/>
+ <button label="Postar" name="post_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_status_bar.xml b/indra/newview/skins/default/xui/pt/panel_status_bar.xml
index 0d0f8cbf19..22853f0643 100644
--- a/indra/newview/skins/default/xui/pt/panel_status_bar.xml
+++ b/indra/newview/skins/default/xui/pt/panel_status_bar.xml
@@ -18,11 +18,8 @@
<panel name="balance_bg">
<text name="balance" tool_tip="Atualizar saldo de L$" value="L$20"/>
<button label="Comprar L$" name="buyL" tool_tip="Comprar mais L$"/>
+ <button label="Comprar" name="goShop" tool_tip="Abrir Mercado do Second Life" width="80"/>
</panel>
- <combo_box name="mode_combo" tool_tip="Selecione o modo. O modo Básico é mais rápido e ideal para explorar e conversar. Use o modo Avançado para acessar mais recursos.">
- <combo_box.item label="Modo básico" name="Basic"/>
- <combo_box.item label="Modo avançado" name="Advanced"/>
- </combo_box>
<text name="TimeText" tool_tip="Hora atual (Pacífico)">
24:00 AM PST
</text>
diff --git a/indra/newview/skins/default/xui/pt/strings.xml b/indra/newview/skins/default/xui/pt/strings.xml
index cffe92461b..4babd9cc43 100644
--- a/indra/newview/skins/default/xui/pt/strings.xml
+++ b/indra/newview/skins/default/xui/pt/strings.xml
@@ -34,6 +34,9 @@
<string name="ProgressChangingResolution">
Alterando a resolução...
</string>
+ <string name="Fullbright">
+ Fullbright (antigo)
+ </string>
<string name="LoginInProgress">
Fazendo login. [APP_NAME] pode parecer congelado. Por favor, aguarde.
</string>
@@ -116,7 +119,7 @@
A assinatura do certificado dado pelo servidor do Grid não pôde ser verificada. Contate o administrador do seu Grid.
</string>
<string name="LoginFailedNoNetwork">
- Erro de rede: Não foi possível estabelecer a conexão, verifique sua conexão de rede.
+ Erro de rede: Falha de conexão: verifique sua conexão à internet.
</string>
<string name="LoginFailed">
Falha do login.
@@ -544,6 +547,9 @@ Titulares de contas gratuitas não poderão acessar o Second Life para acomodar
<string name="mesh">
mesh
</string>
+ <string name="AvatarEditingAppearance">
+ (Edição Aparência)
+ </string>
<string name="AvatarAway">
Distante
</string>
@@ -1154,7 +1160,7 @@ Titulares de contas gratuitas não poderão acessar o Second Life para acomodar
Você não possui uma cópia desta textura no seu inventário
</string>
<string name="InventoryInboxNoItems">
- Compras do marketplace serão entregues aqui.
+ Quando você comprar ou receber um item, ele aparecerá aqui para que você possa arrastá-lo para uma pasta em seu inventário ou excluí-lo caso não queira mantê-lo.
</string>
<string name="MarketplaceURL">
http://marketplace.[DOMAIN_NAME]
@@ -1216,6 +1222,9 @@ Titulares de contas gratuitas não poderão acessar o Second Life para acomodar
<string name="Marketplace Error Internal Import">
Erro: ocorreu um problema com este item. Tente novamente mais tarde.
</string>
+ <string name="Open landmarks">
+ Marcos abertos
+ </string>
<string name="no_transfer" value="(não transferível)"/>
<string name="no_modify" value="(não modificável)"/>
<string name="no_copy" value="(não copiável)"/>
@@ -1343,6 +1352,9 @@ Titulares de contas gratuitas não poderão acessar o Second Life para acomodar
<string name="no_attachments">
Nenhum anexo vestido
</string>
+ <string name="Attachments remain">
+ Anexos ([COUNT] slots permanecem)
+ </string>
<string name="Buy">
Comprar
</string>
@@ -1469,6 +1481,12 @@ Titulares de contas gratuitas não poderão acessar o Second Life para acomodar
<string name="Right Pec">
Peitoral D
</string>
+ <string name="Neck">
+ Pescoço
+ </string>
+ <string name="Avatar Center">
+ Centro do avatar
+ </string>
<string name="Invalid Attachment">
Ponto de encaixe inválido
</string>
@@ -3877,16 +3895,28 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
[NAME] lhe pagou L$ [AMOUNT]
</string>
<string name="you_paid_ldollars">
- You pagou L$[AMOUNT] por [REASON] a [NAME].
+ Você pagou L$[AMOUNT] por [REASON] a [NAME].
</string>
<string name="you_paid_ldollars_no_info">
Você acaba de pagar L$[AMOUNT].
</string>
<string name="you_paid_ldollars_no_reason">
- You pagou L$[AMOUNT] a [NAME].
+ Você pagou L$[AMOUNT] a [NAME].
</string>
<string name="you_paid_ldollars_no_name">
- You pagou L$[AMOUNT] por [REASON].
+ Você pagou L$[AMOUNT] por [REASON].
+ </string>
+ <string name="you_paid_failure_ldollars">
+ Você não pagou L$[AMOUNT] a [NAME] referentes a [REASON].
+ </string>
+ <string name="you_paid_failure_ldollars_no_info">
+ Você não pagou L$[AMOUNT].
+ </string>
+ <string name="you_paid_failure_ldollars_no_reason">
+ Você não pagou L$[AMOUNT] a [NAME].
+ </string>
+ <string name="you_paid_failure_ldollars_no_name">
+ Você não pagou L$[AMOUNT] referentes a [REASON].
</string>
<string name="for item">
por [ITEM]
@@ -4115,7 +4145,7 @@ Denunciar abuso
<string name="Female - Wow">
Wow - feminino
</string>
- <string name="/bow1">
+ <string name="/bow">
/reverência
</string>
<string name="/clap">
@@ -4298,6 +4328,12 @@ Tente colocar o caminho do editor entre aspas.
<string name="ExternalEditorFailedToRun">
Falha de execução do editor externo.
</string>
+ <string name="TranslationFailed">
+ Falha na tradução: [REASON]
+ </string>
+ <string name="TranslationResponseParseError">
+ Erro ao analisar resposta de tradução.
+ </string>
<string name="Esc">
Esc
</string>
@@ -4628,4 +4664,196 @@ Tente colocar o caminho do editor entre aspas.
<string name="ParticleHiding">
Ocultar partículas
</string>
+ <string name="Command_AboutLand_Label">
+ Sobre terrenos
+ </string>
+ <string name="Command_Appearance_Label">
+ Aparência
+ </string>
+ <string name="Command_Avatar_Label">
+ Avatar
+ </string>
+ <string name="Command_Build_Label">
+ Construir
+ </string>
+ <string name="Command_Chat_Label">
+ Bate-papo
+ </string>
+ <string name="Command_Compass_Label">
+ Bússola
+ </string>
+ <string name="Command_Destinations_Label">
+ Destinos
+ </string>
+ <string name="Command_Gestures_Label">
+ Gestos
+ </string>
+ <string name="Command_HowTo_Label">
+ Como
+ </string>
+ <string name="Command_Inventory_Label">
+ Inventário
+ </string>
+ <string name="Command_Map_Label">
+ Mapa
+ </string>
+ <string name="Command_Marketplace_Label">
+ Mercado
+ </string>
+ <string name="Command_MiniMap_Label">
+ Mini Mapa
+ </string>
+ <string name="Command_Move_Label">
+ Andar/correr/voar
+ </string>
+ <string name="Command_People_Label">
+ Pessoas
+ </string>
+ <string name="Command_Picks_Label">
+ Destaques
+ </string>
+ <string name="Command_Places_Label">
+ Lugares
+ </string>
+ <string name="Command_Preferences_Label">
+ Preferências
+ </string>
+ <string name="Command_Profile_Label">
+ Perfil
+ </string>
+ <string name="Command_Search_Label">
+ Buscar
+ </string>
+ <string name="Command_Snapshot_Label">
+ Foto
+ </string>
+ <string name="Command_Speak_Label">
+ Falar
+ </string>
+ <string name="Command_View_Label">
+ Controles da câmera
+ </string>
+ <string name="Command_Voice_Label">
+ Configurações de voz
+ </string>
+ <string name="Command_AboutLand_Tooltip">
+ Informações sobre o terreno que você está visitando
+ </string>
+ <string name="Command_Appearance_Tooltip">
+ Mudar seu avatar
+ </string>
+ <string name="Command_Avatar_Tooltip">
+ Escolha um avatar completo
+ </string>
+ <string name="Command_Build_Tooltip">
+ Construindo objetos e redimensionando terreno
+ </string>
+ <string name="Command_Chat_Tooltip">
+ Bater papo com pessoas próximas usando texto
+ </string>
+ <string name="Command_Compass_Tooltip">
+ Bússola
+ </string>
+ <string name="Command_Destinations_Tooltip">
+ Destinos de interesse
+ </string>
+ <string name="Command_Gestures_Tooltip">
+ Gestos para seu avatar
+ </string>
+ <string name="Command_HowTo_Tooltip">
+ Como executar tarefas comuns
+ </string>
+ <string name="Command_Inventory_Tooltip">
+ Exibir e usar seus pertences
+ </string>
+ <string name="Command_Map_Tooltip">
+ Mapa-múndi
+ </string>
+ <string name="Command_Marketplace_Tooltip">
+ Faça compras
+ </string>
+ <string name="Command_MiniMap_Tooltip">
+ Mostrar quem está aqui
+ </string>
+ <string name="Command_Move_Tooltip">
+ Movendo seu avatar
+ </string>
+ <string name="Command_People_Tooltip">
+ Amigos, grupos e pessoas próximas
+ </string>
+ <string name="Command_Picks_Tooltip">
+ Lugares mostrados como favoritos em seu perfil
+ </string>
+ <string name="Command_Places_Tooltip">
+ Lugares salvos
+ </string>
+ <string name="Command_Preferences_Tooltip">
+ Preferências
+ </string>
+ <string name="Command_Profile_Tooltip">
+ Edite ou visualize seu perfil
+ </string>
+ <string name="Command_Search_Tooltip">
+ Encontre lugares, eventos, pessoas
+ </string>
+ <string name="Command_Snapshot_Tooltip">
+ Tirar uma foto
+ </string>
+ <string name="Command_Speak_Tooltip">
+ Fale com pessoas próximas usando seu microfone
+ </string>
+ <string name="Command_View_Tooltip">
+ Alterar o ângulo da câmera
+ </string>
+ <string name="Command_Voice_Tooltip">
+ Controles de volume das chamadas e pessoas próximas a você no mundo virtual
+ </string>
+ <string name="Toolbar_Bottom_Tooltip">
+ atualmente na sua barra de ferramentas inferior
+ </string>
+ <string name="Toolbar_Left_Tooltip">
+ atualmente na sua barra de ferramentas esquerda
+ </string>
+ <string name="Toolbar_Right_Tooltip">
+ atualmente na sua barra de ferramentas direita
+ </string>
+ <string name="Retain%">
+ Reter%
+ </string>
+ <string name="Detail">
+ Detalhe
+ </string>
+ <string name="Better Detail">
+ Detalhamento maior
+ </string>
+ <string name="Surface">
+ Superfície
+ </string>
+ <string name="Solid">
+ Sólido
+ </string>
+ <string name="Wrap">
+ Conclusão
+ </string>
+ <string name="Preview">
+ Visualizar
+ </string>
+ <string name="Normal">
+ Normal
+ </string>
+ <string name="snapshot_quality_very_low">
+ Muito baixo
+ </string>
+ <string name="snapshot_quality_low">
+ Baixo
+ </string>
+ <string name="snapshot_quality_medium">
+ Médio
+ </string>
+ <string name="snapshot_quality_high">
+ Alto
+ </string>
+ <string name="snapshot_quality_very_high">
+ Muito alto
+ </string>
</strings>
diff --git a/indra/newview/skins/default/xui/pt/teleport_strings.xml b/indra/newview/skins/default/xui/pt/teleport_strings.xml
index 11ea0f4195..3fb77a02d2 100644
--- a/indra/newview/skins/default/xui/pt/teleport_strings.xml
+++ b/indra/newview/skins/default/xui/pt/teleport_strings.xml
@@ -18,6 +18,10 @@ Se você continuar a receber esta mensagem, por favor consulte o [SUPPORT_SITE].
<message name="timeout_tport">
Desculpe, não foi possível para o sistema executar o teletransporte. Tente novamente dentro de alguns instantes.
</message>
+ <message name="NoHelpIslandTP">
+ Não é possível se teletransportar de volta à Ilha Welcome.
+Vá para a &apos;Ilha Welcome Pública&apos; para repetir o tutorial.
+ </message>
<message name="noaccess_tport">
Desculpe, você não tem acesso ao destino deste teletransporte.
</message>
diff --git a/indra/newview/skins/default/xui/ru/floater_aaa.xml b/indra/newview/skins/default/xui/ru/floater_aaa.xml
new file mode 100644
index 0000000000..aa18a4a4a3
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_aaa.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Test Floater" title="ТЕСТИРОВÐТЬ ОКÐО">
+ <string name="test_the_vlt">
+ Эта Ñтрока CHANGE2 извлечена.
+ </string>
+ <string name="testing_eli">
+ Проверка изменений.
+ </string>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_about.xml b/indra/newview/skins/default/xui/ru/floater_about.xml
new file mode 100644
index 0000000000..119f104906
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_about.xml
@@ -0,0 +1,97 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_about" title="О [CAPITALIZED_APP_NAME]">
+ <floater.string name="AboutHeader">
+ [APP_NAME] [VIEWER_VERSION_0].[VIEWER_VERSION_1].[VIEWER_VERSION_2] ([VIEWER_VERSION_3]) [BUILD_DATE] [BUILD_TIME] ([CHANNEL])
+[[VIEWER_RELEASE_NOTES_URL] [ReleaseNotes]]
+ </floater.string>
+ <floater.string name="AboutCompiler">
+ ИÑпользован компилÑтор [COMPILER], верÑÐ¸Ñ [COMPILER_VERSION]
+ </floater.string>
+ <floater.string name="AboutPosition">
+ Ð’Ñ‹ в точке [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1] в регионе «[REGION]», раÑположенном на &lt;nolink&gt;[HOSTNAME]&lt;/nolink&gt; ([HOSTIP])
+[SERVER_VERSION]
+[SERVER_RELEASE_NOTES_URL]
+ </floater.string>
+ <floater.string name="AboutSystem">
+ ЦП: [CPU]
+ПамÑть: [MEMORY_MB] МБ
+ВерÑÐ¸Ñ ÐžÐ¡: [OS_VERSION]
+Производитель графичеÑкой платы: [GRAPHICS_CARD_VENDOR]
+ГрафичеÑÐºÐ°Ñ Ð¿Ð»Ð°Ñ‚Ð°: [GRAPHICS_CARD]
+ </floater.string>
+ <floater.string name="AboutDriver">
+ ВерÑÐ¸Ñ Ð³Ñ€Ð°Ñ„Ð¸Ñ‡ÐµÑкого драйвера Windows: [GRAPHICS_DRIVER_VERSION]
+ </floater.string>
+ <floater.string name="AboutLibs">
+ ВерÑÐ¸Ñ OpenGL: [OPENGL_VERSION]
+ВерÑÐ¸Ñ libcurl: [LIBCURL_VERSION]
+ВерÑÐ¸Ñ Ð´ÐµÐºÐ¾Ð´ÐµÑ€Ð° J2C: [J2C_VERSION]
+ВерÑÐ¸Ñ Ð´Ñ€Ð°Ð¹Ð²ÐµÑ€Ð° звука: [AUDIO_DRIVER_VERSION]
+ВерÑÐ¸Ñ Qt Webkit: [QT_WEBKIT_VERSION]
+ВерÑÐ¸Ñ Ð³Ð¾Ð»Ð¾Ñового Ñервера: [VOICE_VERSION]
+ </floater.string>
+ <floater.string name="none">
+ (нет)
+ </floater.string>
+ <floater.string name="AboutTraffic">
+ ПотерÑно пакетов: [PACKETS_LOST,number,0]/[PACKETS_IN,number,0] ([PACKETS_PCT,number,1]%)
+ </floater.string>
+ <floater.string name="ErrorFetchingServerReleaseNotesURL">
+ Ошибка при получении URL-адреÑа заметок о выпуÑке Ñервера.
+ </floater.string>
+ <tab_container name="about_tab">
+ <panel label="Данные" name="support_panel">
+ <button label="Копировать в буфер обмена" name="copy_btn"/>
+ </panel>
+ <panel label="Создатели" name="credits_panel">
+ <text name="linden_intro">
+ Игра Second Life разработана лабораторией Lindens:
+ </text>
+ <text name="contrib_intro">
+ в напиÑании открытого кода учаÑтвовали:
+ </text>
+ <text_editor name="contrib_names">
+ ПÑевдо-Ð¸Ð¼Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¾ при запуÑке
+ </text_editor>
+ <text name="trans_intro">
+ перевод:
+ </text>
+ <text_editor name="trans_names">
+ ПÑевдо-Ð¸Ð¼Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¾ при запуÑке
+ </text_editor>
+ </panel>
+ <panel label="Лицензии" name="licenses_panel">
+ <text_editor name="credits_editor">
+ 3Dconnexion SDK (C) 1992-2007 3Dconnexion
+ APR (C) 2000-2004 The Apache Software Foundation
+ Collada DOM (C) 2005 Sony Computer Entertainment Inc.
+ cURL (C) 1996-2002, Daniel Stenberg, (daniel@haxx.se)
+ DBus/dbus-glib (C) 2002, 2003 CodeFactory AB / (C) 2003, 2004 Red Hat, Inc.
+ expat (C) 1998, 1999, 2000 Thai Open Source Software Center Ltd.
+ FreeType (C) 1996-2002, The FreeType Project (www.freetype.org).
+ GL (C) 1999-2004 Brian Paul.
+ GLOD (C) 2003-04 Jonathan Cohen, Nat Duca, Chris Niski, УниверÑитет Джона ГопкинÑа и David Luebke, Brenden Schubert, УниверÑитет Вирджинии.
+ google-perftools (c) 2005, Google Inc.
+ Havok.com(TM) (C) 1999-2001, Telekinesys Research Limited.
+ jpeg2000 (C) 2001, David Taubman, УниверÑитет Ðового Южного УÑльÑа (UNSW)
+ jpeglib (C) 1991-1998, Thomas G. Lane.
+ ogg/vorbis (C) 2001, Xiphophorus
+ OpenSSL (C) 1998-2002 The OpenSSL Project.
+ PCRE (c) 1997-2008, КембриджÑкий универÑитет
+ SDL (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga
+ SSLeay (C) 1995-1998 Eric Young (eay@cryptsoft.com)
+ xmlrpc-epi (C) 2000 Epinions, Inc.
+ zlib (C) 1995-2002 Jean-loup Gailly и Mark Adler.
+ google-perftools (c) 2005, Google Inc.
+
+ Ð’ клиенте Second Life иÑпользуетÑÑ Ñ‚ÐµÑ…Ð½Ð¾Ð»Ð¾Ð³Ð¸Ñ Havok (TM) Physics. (C) 1999-2010 Havok.com Inc. (и лицензиары компании). Ð’Ñе права защищены. Подробнее Ñм. веб-Ñайт www.havok.com.
+
+ Это программное обеÑпечение Ñодержит иÑходный код, предоÑтавленный корпорацией NVIDIA.
+
+ Ð’Ñе права защищены. Подробные ÑÐ²ÐµÐ´ÐµÐ½Ð¸Ñ Ñм. в файле licenses.txt.
+
+ Кодирование звука Ð´Ð»Ñ Ð³Ð¾Ð»Ð¾Ñового чата: Polycom(R) Siren14(TM) (ITU-T Rec. G.722.1 Annex C)
+ </text_editor>
+ </panel>
+ </tab_container>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_about_land.xml b/indra/newview/skins/default/xui/ru/floater_about_land.xml
new file mode 100644
index 0000000000..46414a530a
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_about_land.xml
@@ -0,0 +1,489 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floaterland" title="О ЗЕМЛЕ">
+ <floater.string name="maturity_icon_general">
+ &quot;Parcel_PG_Dark&quot;
+ </floater.string>
+ <floater.string name="maturity_icon_moderate">
+ &quot;Parcel_M_Dark&quot;
+ </floater.string>
+ <floater.string name="maturity_icon_adult">
+ &quot;Parcel_R_Dark&quot;
+ </floater.string>
+ <floater.string name="Minutes">
+ [MINUTES] мин
+ </floater.string>
+ <floater.string name="Minute">
+ минута
+ </floater.string>
+ <floater.string name="Seconds">
+ [SECONDS] Ñ
+ </floater.string>
+ <floater.string name="Remaining">
+ оÑталоÑÑŒ
+ </floater.string>
+ <tab_container name="landtab">
+ <panel label="ОСÐОВÐЫЕ" name="land_general_panel">
+ <panel.string name="new users only">
+ Только новые жители
+ </panel.string>
+ <panel.string name="anyone">
+ Ð’Ñе
+ </panel.string>
+ <panel.string name="area_text">
+ Площадь
+ </panel.string>
+ <panel.string name="area_size_text">
+ [AREA] м²
+ </panel.string>
+ <panel.string name="auction_id_text">
+ ID аукциона: [ID]
+ </panel.string>
+ <panel.string name="need_tier_to_modify">
+ Ð’Ñ‹ должны подтвердить покупку, чтобы изменÑть Ñту землю.
+ </panel.string>
+ <panel.string name="group_owned_text">
+ (СобÑтвенноÑть группы)
+ </panel.string>
+ <panel.string name="profile_text">
+ Профиль
+ </panel.string>
+ <panel.string name="info_text">
+ ИнформациÑ
+ </panel.string>
+ <panel.string name="public_text">
+ (публичное)
+ </panel.string>
+ <panel.string name="none_text">
+ (нет)
+ </panel.string>
+ <panel.string name="sale_pending_text">
+ (Ожидание продажи)
+ </panel.string>
+ <panel.string name="no_selection_text">
+ УчаÑток не выбран.
+ </panel.string>
+ <panel.string name="time_stamp_template">
+ [wkday,datetime,local], [day,datetime,local] [mth,datetime,local] [year,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local]
+ </panel.string>
+ <text name="Name:">
+ Ðазвание:
+ </text>
+ <text name="Description:">
+ ОпиÑание:
+ </text>
+ <text name="LandType">
+ Тип:
+ </text>
+ <text name="LandTypeText">
+ Материк / помеÑтье
+ </text>
+ <text name="ContentRating">
+ Рейтинг:
+ </text>
+ <text name="ContentRatingText">
+ ВзроÑлый
+ </text>
+ <text name="Owner:">
+ Владелец:
+ </text>
+ <text name="Group:">
+ Группа:
+ </text>
+ <button label="Задать" name="Set..."/>
+ <check_box label="Разрешить передачу земли группе" name="check deed" tool_tip="ДолжноÑтное лицо группы может передать Ñту землю группе Ñ ÑƒÑ‡ÐµÑ‚Ð¾Ð¼ ÑущеÑтвующего взноÑа."/>
+ <button label="Сделка" name="Deed..." tool_tip="Ð’Ñ‹ можете передать землю только еÑли вы ÑвлÑетеÑÑŒ должноÑтным лицом выбранной группы."/>
+ <check_box label="Владелец делает взноÑÑ‹ при передаче" name="check contrib" tool_tip="Когда Ð·ÐµÐ¼Ð»Ñ Ð¿ÐµÑ€ÐµÐ´Ð°ÐµÑ‚ÑÑ Ð³Ñ€ÑƒÐ¿Ð¿Ðµ, бывший владелец делает взноÑ, доÑтаточный Ð´Ð»Ñ Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶ÐºÐ¸ земли."/>
+ <text name="For Sale:">
+ Ð”Ð»Ñ Ð¿Ñ€Ð¾Ð´Ð°Ð¶Ð¸:
+ </text>
+ <text name="Not for sale.">
+ Ðе Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð´Ð°Ð¶Ð¸
+ </text>
+ <text name="For Sale: Price L$[PRICE].">
+ Цена: L$[PRICE] (L$[PRICE_PER_SQM]/м²)
+ </text>
+ <button label="Продать землю" name="Sell Land..."/>
+ <text name="For sale to">
+ Продажа длÑ: [BUYER]
+ </text>
+ <text name="Sell with landowners objects in parcel.">
+ Объекты продаютÑÑ Ð²Ð¼ÐµÑте Ñ Ð·ÐµÐ¼Ð»ÐµÐ¹
+ </text>
+ <text name="Selling with no objects in parcel.">
+ Объекты не продаютÑÑ Ð²Ð¼ÐµÑте Ñ Ð·ÐµÐ¼Ð»ÐµÐ¹
+ </text>
+ <button label="Отменить продажу земли" label_selected="Отменить продажу земли" name="Cancel Land Sale"/>
+ <text name="Claimed:">
+ СобÑтвенноÑть Ñ:
+ </text>
+ <text name="DateClaimText">
+ Ð’Ñ‚ 15 Ðвг 13:47:25 2006
+ </text>
+ <text name="PriceLabel">
+ Площадь:
+ </text>
+ <text name="PriceText">
+ 4048 м²
+ </text>
+ <text name="Traffic:">
+ ПоÑещаемоÑть:
+ </text>
+ <text name="DwellText">
+ Загрузка...
+ </text>
+ <button label="Купить землю" name="Buy Land..."/>
+ <button label="Продать Ð´Ð»Ñ Linden" name="Linden Sale..." tool_tip="Ð—ÐµÐ¼Ð»Ñ Ð´Ð¾Ð»Ð¶Ð½Ð° быть в ÑобÑтвенноÑти, иметь заданное Ñодержимое и не быть выÑтавленной на аукцион,"/>
+ <button label="Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ Ñкриптах" name="Scripts..."/>
+ <button label="Купить Ð´Ð»Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ñ‹" name="Buy For Group..."/>
+ <button label="Купить пропуÑк" name="Buy Pass..." tool_tip="ПропуÑк дает вам временный доÑтуп на Ñту землю."/>
+ <button label="ОтказатьÑÑ Ð¾Ñ‚ земли" name="Abandon Land..."/>
+ <button label="ПриÑвоить землю" name="Reclaim Land..."/>
+ </panel>
+ <panel label="СОГЛÐШЕÐИЕ" name="land_covenant_panel">
+ <panel.string name="can_resell">
+ ÐšÑƒÐ¿Ð»ÐµÐ½Ð½Ð°Ñ Ð² Ñтом регионе Ð·ÐµÐ¼Ð»Ñ Ð¼Ð¾Ð¶ÐµÑ‚ быть перепродана.
+ </panel.string>
+ <panel.string name="can_not_resell">
+ ÐšÑƒÐ¿Ð»ÐµÐ½Ð½Ð°Ñ Ð² Ñтом регионе Ð·ÐµÐ¼Ð»Ñ Ð½Ðµ может быть перепродана.
+ </panel.string>
+ <panel.string name="can_change">
+ ÐšÑƒÐ¿Ð»ÐµÐ½Ð½Ð°Ñ Ð² Ñтом регионе Ð·ÐµÐ¼Ð»Ñ Ð¼Ð¾Ð¶ÐµÑ‚ быть объединена или разделена.
+ </panel.string>
+ <panel.string name="can_not_change">
+ ÐšÑƒÐ¿Ð»ÐµÐ½Ð½Ð°Ñ Ð² Ñтом регионе Ð·ÐµÐ¼Ð»Ñ Ð½Ðµ может быть объединена или разделена.
+ </panel.string>
+ <text name="estate_section_lbl">
+ Землевладение:
+ </text>
+ <text name="estate_name_text">
+ материк
+ </text>
+ <text name="estate_owner_lbl">
+ Владелец:
+ </text>
+ <text name="estate_owner_text">
+ (нет)
+ </text>
+ <text_editor name="covenant_editor">
+ Ðет ÑÐ¾Ð³Ð»Ð°ÑˆÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ñтого землевладениÑ.
+ </text_editor>
+ <text name="covenant_timestamp_text">
+ ПоÑледние Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¡Ñ€ 31 Дек 16:00:00 1969
+ </text>
+ <text name="region_section_lbl">
+ Регион:
+ </text>
+ <text name="region_name_text">
+ Эрикавиль
+ </text>
+ <text name="region_landtype_lbl">
+ Тип:
+ </text>
+ <text name="region_landtype_text">
+ Материк / помеÑтье
+ </text>
+ <text name="region_maturity_lbl">
+ Рейтинг:
+ </text>
+ <text name="region_maturity_text">
+ ВзроÑлый
+ </text>
+ <text name="resellable_lbl">
+ Перепродажа:
+ </text>
+ <text name="resellable_clause">
+ Ð—ÐµÐ¼Ð»Ñ Ð² Ñтом регионе не может быть перепродана.
+ </text>
+ <text name="changeable_lbl">
+ Разделение:
+ </text>
+ <text name="changeable_clause">
+ Ð—ÐµÐ¼Ð»Ñ Ð² Ñтом регионе не может быть объединена или разделена.
+ </text>
+ </panel>
+ <panel label="ОБЪЕКТЫ" name="land_objects_panel">
+ <panel.string name="objects_available_text">
+ [COUNT] из [MAX] ([AVAILABLE] доÑтупно)
+ </panel.string>
+ <panel.string name="objects_deleted_text">
+ [COUNT] из [MAX] ([DELETED] будет удалено)
+ </panel.string>
+ <text name="parcel_object_bonus">
+ БонуÑный множитель Ð´Ð»Ñ Ð¾Ð±ÑŠÐµÐºÑ‚Ð¾Ð²: [BONUS]
+ </text>
+ <text name="Simulator primitive usage:">
+ ЕмкоÑть региона:
+ </text>
+ <text name="objects_available">
+ [COUNT] из [MAX] ([AVAILABLE] доÑтупно)
+ </text>
+ <text name="Primitives parcel supports:">
+ ЕмкоÑть учаÑтка:
+ </text>
+ <text name="object_contrib_text">
+ [COUNT]
+ </text>
+ <text name="Primitives on parcel:">
+ ВоздейÑтвие учаÑтка:
+ </text>
+ <text name="total_objects_text">
+ [COUNT]
+ </text>
+ <text name="Owned by parcel owner:">
+ СобÑтвенноÑть владельца:
+ </text>
+ <text name="owner_objects_text">
+ [COUNT]
+ </text>
+ <button label="Показать" label_selected="Показать" name="ShowOwner"/>
+ <button label="Возврат" name="ReturnOwner..." tool_tip="Вернуть объекты их владельцам."/>
+ <text name="Set to group:">
+ УÑтановлено группой:
+ </text>
+ <text name="group_objects_text">
+ [COUNT]
+ </text>
+ <button label="Показать" label_selected="Показать" name="ShowGroup"/>
+ <button label="Возврат" name="ReturnGroup..." tool_tip="Вернуть объекты их владельцам."/>
+ <text name="Owned by others:">
+ СобÑтвенноÑть других:
+ </text>
+ <text name="other_objects_text">
+ [COUNT]
+ </text>
+ <button label="Показать" label_selected="Показать" name="ShowOther"/>
+ <button label="Возврат" name="ReturnOther..." tool_tip="Вернуть объекты их владельцам."/>
+ <text name="Selected / sat upon:">
+ Выбрано / транÑпорт:
+ </text>
+ <text name="selected_objects_text">
+ [COUNT]
+ </text>
+ <text name="Autoreturn">
+ Ðвтовозвращение объектов других жителей (в минутах, 0 – отключено):
+ </text>
+ <text name="Object Owners:">
+ Владельцы объектов:
+ </text>
+ <button name="Refresh List" tool_tip="Обновить ÑпиÑок объектов"/>
+ <button label="Вернуть объекты" name="Return objects..."/>
+ <name_list name="owner list">
+ <name_list.columns label="Тип" name="type"/>
+ <name_list.columns label="Ðазвание" name="name"/>
+ <name_list.columns label="Кол-во" name="count"/>
+ <name_list.columns label="ПоÑледний объект" name="mostrecent"/>
+ </name_list>
+ </panel>
+ <panel label="ÐÐСТРОЙКИ" name="land_options_panel">
+ <panel.string name="search_enabled_tooltip">
+ Позволить людÑм видеть учаÑток в результатах поиÑка
+ </panel.string>
+ <panel.string name="search_disabled_small_tooltip">
+ Этот параметр недоÑтупен, потому площадь учаÑтка не превышает 128 м².
+Только большие учаÑтки могут быть показаны в поиÑке.
+ </panel.string>
+ <panel.string name="search_disabled_permissions_tooltip">
+ Этот параметр недоÑтупен, потому что вы не можете изменÑть его на Ñтом учаÑтке.
+ </panel.string>
+ <panel.string name="mature_check_mature">
+ Умеренный контент
+ </panel.string>
+ <panel.string name="mature_check_adult">
+ Контент Ð´Ð»Ñ Ð²Ð·Ñ€Ð¾Ñлых
+ </panel.string>
+ <panel.string name="mature_check_mature_tooltip">
+ Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¸Ð»Ð¸ Ñодержимое вашего учаÑтка раÑцениваетÑÑ ÐºÐ°Ðº moderate.
+ </panel.string>
+ <panel.string name="mature_check_adult_tooltip">
+ Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¸Ð»Ð¸ Ñодержимое вашего учаÑтка раÑцениваетÑÑ ÐºÐ°Ðº adult.
+ </panel.string>
+ <panel.string name="landing_point_none">
+ (нет)
+ </panel.string>
+ <panel.string name="push_restrict_text">
+ Ðе толкать
+ </panel.string>
+ <panel.string name="push_restrict_region_text">
+ Ðе толкать (наÑтройки региона)
+ </panel.string>
+ <panel.string name="see_avs_text">
+ Ðватары Ñ Ð´Ñ€ÑƒÐ³Ð¸Ñ… учаÑтков могут видеть
+ </panel.string>
+ <text name="allow_label">
+ Позволить другим жителÑм:
+ </text>
+ <text name="allow_label0">
+ Полет:
+ </text>
+ <check_box label="Ð’Ñе" name="check fly" tool_tip="ЕÑли отмечено, жители Ñмогут летать над вашей землей. ЕÑли не отметить, они Ñмогут только прилетать и пролетать мимо земли."/>
+ <text name="allow_label2">
+ СтроительÑтво:
+ </text>
+ <check_box label="Ð’Ñе" name="edit objects check"/>
+ <check_box label="Группа" name="edit group objects check"/>
+ <text name="allow_label3">
+ Проникновение объектов:
+ </text>
+ <check_box label="Ð’Ñе" name="all object entry check"/>
+ <check_box label="Группа" name="group object entry check"/>
+ <text name="allow_label4">
+ ЗапуÑкать Ñкрипты:
+ </text>
+ <check_box label="Ð’Ñе" name="check other scripts"/>
+ <check_box label="Группа" name="check group scripts"/>
+ <check_box label="БезопаÑно (нет повреждений)" name="check safe" 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"/>
+ <combo_box.item label="ВзроÑлый" name="item2"/>
+ <combo_box.item label="ИÑкуÑÑтво и культура" name="item3"/>
+ <combo_box.item label="БизнеÑ" name="item4"/>
+ <combo_box.item label="Образование" name="item5"/>
+ <combo_box.item label="Игры" name="item6"/>
+ <combo_box.item label="МеÑта вÑтреч" name="item7"/>
+ <combo_box.item label="Ð”Ð»Ñ Ð½Ð¾Ð²Ð¸Ñ‡ÐºÐ¾Ð²" name="item8"/>
+ <combo_box.item label="Парки и природа" name="item9"/>
+ <combo_box.item label="Проживание" name="item10"/>
+ <combo_box.item label="Покупки" name="item11"/>
+ <combo_box.item label="Ðренда" name="item13"/>
+ <combo_box.item label="Другое" name="item12"/>
+ </combo_box>
+ <combo_box name="land category">
+ <combo_box.item label="Ð›ÑŽÐ±Ð°Ñ ÐºÐ°Ñ‚ÐµÐ³Ð¾Ñ€Ð¸Ñ" name="item0"/>
+ <combo_box.item label="МеÑто Linden" name="item1"/>
+ <combo_box.item label="ИÑкуÑÑтво и культура" name="item3"/>
+ <combo_box.item label="БизнеÑ" name="item4"/>
+ <combo_box.item label="Образование" name="item5"/>
+ <combo_box.item label="Игры" name="item6"/>
+ <combo_box.item label="МеÑта вÑтреч" name="item7"/>
+ <combo_box.item label="Ð”Ð»Ñ Ð½Ð¾Ð²Ð¸Ñ‡ÐºÐ¾Ð²" name="item8"/>
+ <combo_box.item label="Парки и природа" name="item9"/>
+ <combo_box.item label="Проживание" name="item10"/>
+ <combo_box.item label="Покупки" name="item11"/>
+ <combo_box.item label="Ðренда" name="item13"/>
+ <combo_box.item label="Другое" name="item12"/>
+ </combo_box>
+ <check_box label="Умеренный контент" name="MatureCheck" tool_tip=" "/>
+ <text name="Snapshot:">
+ Снимок:
+ </text>
+ <texture_picker name="snapshot_ctrl" tool_tip="Щелкните Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° изображениÑ"/>
+ <text name="allow_label5">
+ аватары на Ñтом учаÑтке и общатьÑÑ Ñ Ð½Ð¸Ð¼Ð¸
+ </text>
+ <check_box label="Видны аватары" name="SeeAvatarsCheck" tool_tip="Ðватары Ñ Ð´Ñ€ÑƒÐ³Ð¸Ñ… учаÑтков Ñмогут видеть аватары на Ñтом учаÑтке и общатьÑÑ Ñ Ð½Ð¸Ð¼Ð¸ в чате, а вы также Ñможете видеть их и общатьÑÑ Ñ Ð½Ð¸Ð¼Ð¸."/>
+ <text name="landing_point">
+ В точку телепортации: [LANDING]
+ </text>
+ <button label="Задать" label_selected="Задать" name="Set" tool_tip="УÑтановить точку телепортации, в которую будут прибывать поÑетители, СтавитÑÑ Ð² меÑте вашего аватара на Ñтом учаÑтке."/>
+ <button label="ЧиÑто" label_selected="ЧиÑто" name="Clear" tool_tip="Удалить данные о точке телепортации"/>
+ <text name="Teleport Routing: ">
+ Вариант телепортации:
+ </text>
+ <combo_box name="landing type" tool_tip="Вариант телепортации – выберите, каким образом будет производитьÑÑ Ñ‚ÐµÐ»ÐµÐ¿Ð¾Ñ€Ñ‚Ð°Ñ†Ð¸Ñ Ð½Ð° вашу землю">
+ <combo_box.item label="Ð’ черном ÑпиÑке" name="Blocked"/>
+ <combo_box.item label="В точку телепортации" name="LandingPoint"/>
+ <combo_box.item label="Ð’ любое меÑто" name="Anywhere"/>
+ </combo_box>
+ </panel>
+ <panel label="МЕДИÐ" name="land_media_panel">
+ <text name="with media:">
+ Тип:
+ </text>
+ <combo_box name="media type" tool_tip="Укажите, чем ÑвлÑетÑÑ ÑÑылка – видео, веб-Ñтраница или другое медиа"/>
+ <text name="at URL:">
+ Дом. Ñтраница:
+ </text>
+ <button label="Задать" name="set_media_url"/>
+ <text name="Description:">
+ ОпиÑание:
+ </text>
+ <line_editor name="url_description" tool_tip="ТекÑÑ‚, показываемый Ñ€Ñдом Ñ ÐºÐ½Ð¾Ð¿ÐºÐ¾Ð¹ проигрываниÑ/загрузки"/>
+ <text name="Media texture:">
+ Замена текÑтуры:
+ </text>
+ <texture_picker name="media texture" tool_tip="Щелкните Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° изображениÑ"/>
+ <text name="replace_texture_help">
+ Объект, иÑпользующий Ñту текÑтуру, будет показывать видео или веб-Ñтраницу поÑле Ð½Ð°Ð¶Ð°Ñ‚Ð¸Ñ ÐºÐ½Ð¾Ð¿ÐºÐ¸ проигрываниÑ. Щелкните на миниатюре Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° другой текÑтуры.
+ </text>
+ <check_box label="ÐвтомаÑштабирование" name="media_auto_scale" tool_tip="Ð’ результате уÑтановки Ñтого флажка контент Ð´Ð»Ñ Ñтого учаÑтка автоматичеÑки маÑштабируетÑÑ. Это проиÑходит немного медленнее и в более низком качеÑтве изображениÑ, но не требуетÑÑ Ð¼Ð°Ñштабирование и выравнивание текÑтуры."/>
+ <text name="media_size" tool_tip="Размер Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð²ÐµÐ±-медиа, по умолчанию – 0.">
+ Размер:
+ </text>
+ <spinner name="media_size_width" tool_tip="Размер Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð²ÐµÐ±-медиа, по умолчанию – 0."/>
+ <spinner name="media_size_height" tool_tip="Размер Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð²ÐµÐ±-медиа, по умолчанию – 0."/>
+ <text name="pixels">
+ пикÑ.
+ </text>
+ <text name="Options:">
+ Опции:
+ </text>
+ <check_box label="Цикл" name="media_loop" tool_tip="Проигрывать медиа в цикле. По завершении Ð¿Ñ€Ð¾Ð¸Ð³Ñ€Ñ‹Ð²Ð°Ð½Ð¸Ñ Ð¼ÐµÐ´Ð¸Ð° оно запуÑтитÑÑ Ñ Ð½Ð°Ñ‡Ð°Ð»Ð°."/>
+ </panel>
+ <panel label="ЗВУК" name="land_audio_panel">
+ <text name="MusicURL:">
+ URL музыки:
+ </text>
+ <text name="Sound:">
+ Звук:
+ </text>
+ <check_box label="Запретить звуки от жеÑтов и объектов на Ñтом учаÑтке" name="check sound local"/>
+ <text name="Avatar Sounds:">
+ Звуки аватара:
+ </text>
+ <check_box label="Ð’Ñе" name="all av sound check"/>
+ <check_box label="Группа" name="group av sound check"/>
+ <text name="Voice settings:">
+ ГолоÑ:
+ </text>
+ <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_local"/>
+ </panel>
+ <panel label="ДОСТУП" name="land_access_panel">
+ <panel.string name="access_estate_defined">
+ (Определено на землевладении)
+ </panel.string>
+ <panel.string name="allow_public_access">
+ Разрешить общий доÑтуп ([MATURITY]) (СнÑтие приведет к Ñозданию линий запрета)
+ </panel.string>
+ <panel.string name="estate_override">
+ ЧаÑть Ñтих параметров уÑтановлена на уровне землевладениÑ
+ </panel.string>
+ <text name="Limit access to this parcel to:">
+ ДоÑтуп на Ñтот учаÑток
+ </text>
+ <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="Разрешить временный доÑтуп к учаÑтку."/>
+ <combo_box name="pass_combo">
+ <combo_box.item label="Ð’Ñе" name="Anyone"/>
+ <combo_box.item label="Группа" name="Group"/>
+ </combo_box>
+ <spinner label="Цена в L$:" name="PriceSpin"/>
+ <spinner label="ЧаÑÑ‹ доÑтупа:" name="HoursSpin"/>
+ <panel name="Allowed_layout_panel">
+ <text label="Ð’Ñегда разрешено" name="AllowedText">
+ Допущенные жители
+ </text>
+ <name_list name="AccessList" tool_tip="([LISTED] в ÑпиÑке, [MAX] макÑимум)"/>
+ <button label="Добавить" name="add_allowed"/>
+ <button label="Удалить" label_selected="Удалить" name="remove_allowed"/>
+ </panel>
+ <panel name="Banned_layout_panel">
+ <text label="Бан" name="BanCheck">
+ Забаненные жители
+ </text>
+ <name_list name="BannedList" tool_tip="([LISTED] в ÑпиÑке, [MAX] макÑимум)"/>
+ <button label="Добавить" name="add_banned"/>
+ <button label="Удалить" label_selected="Удалить" name="remove_banned"/>
+ </panel>
+ </panel>
+ </tab_container>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_activeim.xml b/indra/newview/skins/default/xui/ru/floater_activeim.xml
new file mode 100644
index 0000000000..adfa277822
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_activeim.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_activeim" title="ÐКТИВÐОЕ СООБЩЕÐИЕ"/>
diff --git a/indra/newview/skins/default/xui/ru/floater_animation_preview.xml b/indra/newview/skins/default/xui/ru/floater_animation_preview.xml
new file mode 100644
index 0000000000..b7075fbf97
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_animation_preview.xml
@@ -0,0 +1,183 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Animation Preview">
+ <floater.string name="failed_to_initialize">
+ Ðевозможно инициализировать движение
+ </floater.string>
+ <floater.string name="anim_too_long">
+ Длина файла анимации: [LENGTH] Ñ.
+МакÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ð´Ð»Ð¸Ð½Ð° анимации: [MAX_LENGTH] Ñ.
+ </floater.string>
+ <floater.string name="failed_file_read">
+ Ðевозможно прочитать файл анимации.
+[STATUS]
+ </floater.string>
+ <floater.string name="E_ST_OK">
+ ОК
+ </floater.string>
+ <floater.string name="E_ST_EOF">
+ Преждевременный конец файла.
+ </floater.string>
+ <floater.string name="E_ST_NO_CONSTRAINT">
+ Ðе могу прочитать определение ограничений.
+ </floater.string>
+ <floater.string name="E_ST_NO_FILE">
+ Ðе удалоÑÑŒ открыть BVH-файл.
+ </floater.string>
+ <floater.string name="E_ST_NO_HIER">
+ Ðеправильный заголовок HIERARCHY.
+ </floater.string>
+ <floater.string name="E_ST_NO_JOINT">
+ Ðе удалоÑÑŒ найти ROOT или JOINT.
+ </floater.string>
+ <floater.string name="E_ST_NO_NAME">
+ Ðе удалоÑÑŒ получить Ð¸Ð¼Ñ JOINT.
+ </floater.string>
+ <floater.string name="E_ST_NO_OFFSET">
+ Ðе удалоÑÑŒ найти OFFSET.
+ </floater.string>
+ <floater.string name="E_ST_NO_CHANNELS">
+ Ðе удалоÑÑŒ найти CHANNELS.
+ </floater.string>
+ <floater.string name="E_ST_NO_ROTATION">
+ Ðе удалоÑÑŒ получить порÑдок вращениÑ.
+ </floater.string>
+ <floater.string name="E_ST_NO_AXIS">
+ Ðе удалоÑÑŒ получить оÑи вращениÑ.
+ </floater.string>
+ <floater.string name="E_ST_NO_MOTION">
+ Ðе удалоÑÑŒ найти MOTION.
+ </floater.string>
+ <floater.string name="E_ST_NO_FRAMES">
+ Ðе удалоÑÑŒ получить количеÑтво кадров.
+ </floater.string>
+ <floater.string name="E_ST_NO_FRAME_TIME">
+ Ðе удалоÑÑŒ получить Ð²Ñ€ÐµÐ¼Ñ ÐºÐ°Ð´Ñ€Ð°.
+ </floater.string>
+ <floater.string name="E_ST_NO_POS">
+ Ðе удалоÑÑŒ получить Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ position.
+ </floater.string>
+ <floater.string name="E_ST_NO_ROT">
+ Ðе удалоÑÑŒ получить Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ rotation.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_FILE">
+ Ðе удалоÑÑŒ открыть файл перевода.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_HEADER">
+ Ðе удалоÑÑŒ прочитать заголовок перевода.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_NAME">
+ Ðе удалоÑÑŒ прочитать имена перевода.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_IGNORE">
+ Ðе удалоÑÑŒ прочитать значение перевода ignore.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_RELATIVE">
+ Ðе удалоÑÑŒ прочитать значение перевода relative.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_OUTNAME">
+ Ðе удалоÑÑŒ прочитать значение перевода outname.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_MATRIX">
+ Ðе удалоÑÑŒ прочитать матрицу перевода.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_MERGECHILD">
+ Ðе удалоÑÑŒ получить Ð¸Ð¼Ñ mergechild.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_MERGEPARENT">
+ Ðе удалоÑÑŒ получить Ð¸Ð¼Ñ mergeparent.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_PRIORITY">
+ Ðе удалоÑÑŒ получить значение priority.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_LOOP">
+ Ðе удалоÑÑŒ получить значение loop.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_EASEIN">
+ Ðе удалоÑÑŒ получить Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ easeIn.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_EASEOUT">
+ Ðе удалоÑÑŒ получить Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ easeOut.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_HAND">
+ Ðе удалоÑÑŒ получить значение hand morph.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_EMOTE">
+ Ðе удалоÑÑŒ прочитать Ð¸Ð¼Ñ emote.
+ </floater.string>
+ <floater.string name="E_ST_BAD_ROOT">
+ Ðеверное Ð¸Ð¼Ñ ÐºÐ¾Ñ€Ð½ÐµÐ²Ð¾Ð³Ð¾ ÑоединениÑ, должно быть «hip».
+ </floater.string>
+ <text name="name_label">
+ Ðазвание:
+ </text>
+ <text name="description_label">
+ ОпиÑание:
+ </text>
+ <spinner label="Приоритет" name="priority" tool_tip="УправлÑет тем, как другие анимации могут перекрыватьÑÑ Ñтой"/>
+ <check_box label="Цикл" name="loop_check" tool_tip="Делает анимацию зацикленной"/>
+ <spinner label="Ðачало(%)" name="loop_in_point" tool_tip="УÑтанавливает точку возврата цикла"/>
+ <spinner label="Конец(%)" name="loop_out_point" tool_tip="УÑтанавливает точку конца цикла"/>
+ <text name="hand_label">
+ Положение пальцев
+ </text>
+ <combo_box name="hand_pose_combo" tool_tip="Контролирует положение пальцев во Ð²Ñ€ÐµÐ¼Ñ Ð°Ð½Ð¸Ð¼Ð°Ñ†Ð¸Ð¸">
+ <combo_box.item label="Разведены" name="Spread"/>
+ <combo_box.item label="РаÑÑлаблены" name="Relaxed"/>
+ <combo_box.item label="Указывают" name="PointBoth"/>
+ <combo_box.item label="Сжаты в кулаки" name="Fist"/>
+ <combo_box.item label="Левые раÑÑлаблены" name="RelaxedLeft"/>
+ <combo_box.item label="Левые указывают" name="PointLeft"/>
+ <combo_box.item label="Левые в кулак" name="FistLeft"/>
+ <combo_box.item label="Правые раÑÑлаблены" name="RelaxedRight"/>
+ <combo_box.item label="Правые указывают" name="PointRight"/>
+ <combo_box.item label="Правые в кулак" name="FistRight"/>
+ <combo_box.item label="Правые в приветÑтвии" name="SaluteRight"/>
+ <combo_box.item label="Печатают" name="Typing"/>
+ <combo_box.item label="Правые «V»" name="PeaceRight"/>
+ </combo_box>
+ <text name="emote_label">
+ Выражение лица
+ </text>
+ <combo_box name="emote_combo" tool_tip="Контролирует выражение лица во Ð²Ñ€ÐµÐ¼Ñ Ð°Ð½Ð¸Ð¼Ð°Ñ†Ð¸Ð¸">
+ <item label="(нет)" name="[None]" value=""/>
+ <item label="Ðаааах" name="Aaaaah" value="Ðаааах"/>
+ <item label="БоитÑÑ" name="Afraid" value="БоитÑÑ"/>
+ <item label="ЗлитÑÑ" name="Angry" value="ЗлитÑÑ"/>
+ <item label="Широко улыбаетÑÑ" name="BigSmile" value="Широко улыбаетÑÑ"/>
+ <item label="Скучает" name="Bored" value="Скучает"/>
+ <item label="Плачет" name="Cry" value="Плачет"/>
+ <item label="Презирает" name="Disdain" value="Презирает"/>
+ <item label="СмущаетÑÑ" name="Embarrassed" value="СмущаетÑÑ"/>
+ <item label="ХмуритÑÑ" name="Frown" value="ХмуритÑÑ"/>
+ <item label="Целует" name="Kiss" value="Целует"/>
+ <item label="СмеетÑÑ" name="Laugh" value="СмеетÑÑ"/>
+ <item label="ДразнитÑÑ" name="Plllppt" value="ДразнитÑÑ"/>
+ <item label="Ðе ÑоглашаетÑÑ" name="Repulsed" value="Ðе ÑоглашаетÑÑ"/>
+ <item label="ГруÑтит" name="Sad" value="ГруÑтит"/>
+ <item label="Ðе понимает" name="Shrug" value="Ðе понимает"/>
+ <item label="УлыбаетÑÑ" name="Smile" value="УлыбаетÑÑ"/>
+ <item label="УдивлÑетÑÑ" name="Surprise" value="УдивлÑетÑÑ"/>
+ <item label="Подмигивает" name="Wink" value="Подмигивает"/>
+ <item label="БеÑпокоитÑÑ" name="Worry" value="БеÑпокоитÑÑ"/>
+ </combo_box>
+ <text name="preview_label">
+ ПроÑмотр во времÑ
+ </text>
+ <combo_box name="preview_base_anim" tool_tip="ПроÑмотр вашей анимации во Ð²Ñ€ÐµÐ¼Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð°Ð²Ð°Ñ‚Ð°Ñ€Ð¾Ð¼ дейÑтвий.">
+ <item label="СтоÑние" name="Standing" value="СтоÑние"/>
+ <item label="Ходьба" name="Walking" value="Ходьба"/>
+ <item label="Сидение" name="Sitting" value="Сидение"/>
+ <item label="Полет" name="Flying" value="Полет"/>
+ </combo_box>
+ <spinner label="Вход (Ñек.)" name="ease_in_time" tool_tip="КоличеÑтво времени (в Ñекундах) Ð´Ð»Ñ Ð²Ñ…Ð¾Ð´Ð° в Ñтартовое положение"/>
+ <spinner label="Выход (Ñек.)" name="ease_out_time" tool_tip="КоличеÑтво времени (в Ñекундах) Ð´Ð»Ñ Ð²Ñ‹Ñ…Ð¾Ð´Ð° из анимации"/>
+ <button name="play_btn" tool_tip="Проиграть анимацию"/>
+ <button name="pause_btn" tool_tip="ПриоÑтановить анимацию"/>
+ <button name="stop_btn" tool_tip="ОÑтановить проигрывание анимации"/>
+ <text name="bad_animation_text">
+ Ðевозможно прочитать файл анимации.
+РекомендуетÑÑ Ð¸Ñпользовать BVH-файлы, ÑкÑпортированные из Poser 4.
+ </text>
+ <button label="Передать (L$[AMOUNT])" name="ok_btn"/>
+ <button label="Отмена" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_auction.xml b/indra/newview/skins/default/xui/ru/floater_auction.xml
new file mode 100644
index 0000000000..d84dc2e941
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_auction.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_auction" title="ÐÐЧÐТЬ ПРОДÐЖУ ЗЕМЛИ ЛИÐДЕÐОВ">
+ <floater.string name="already for sale">
+ ÐÐµÐ»ÑŒÐ·Ñ Ð²Ñ‹Ñтавить на аукцион учаÑтки, которые уже продаютÑÑ.
+ </floater.string>
+ <check_box initial_value="иÑтина" label="Ð’ÐºÐ»ÑŽÑ‡Ð°Ñ Ð¶ÐµÐ»Ñ‚ÑƒÑŽ ограду вокруг выбранного учаÑтка" name="fence_check"/>
+ <button label="Снимок" label_selected="Снимок" name="snapshot_btn"/>
+ <button label="Купить может каждый" label_selected="Купить может каждый" name="sell_to_anyone_btn"/>
+ <button label="ОчиÑтить наÑтройки" label_selected="ОчиÑтить наÑтройки" name="reset_parcel_btn"/>
+ <button label="Ðачать аукцион" label_selected="Ðачать аукцион" name="start_auction_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_avatar.xml b/indra/newview/skins/default/xui/ru/floater_avatar.xml
new file mode 100644
index 0000000000..b480af9345
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_avatar.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Avatar" title="ВЫБЕРИТЕ ÐÐ’ÐТÐР"/>
diff --git a/indra/newview/skins/default/xui/ru/floater_avatar_picker.xml b/indra/newview/skins/default/xui/ru/floater_avatar_picker.xml
new file mode 100644
index 0000000000..edcc35d2b9
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_avatar_picker.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="avatarpicker" title="ВЫБЕРИТЕ ЖИТЕЛЯ">
+ <floater.string name="not_found">
+ ТекÑÑ‚ «[TEXT]» не найден
+ </floater.string>
+ <floater.string name="no_one_near">
+ РÑдом никого нет
+ </floater.string>
+ <floater.string name="no_results">
+ Ðет результатов
+ </floater.string>
+ <floater.string name="searching">
+ ПоиÑк...
+ </floater.string>
+ <string name="Select">
+ Выбрать
+ </string>
+ <string name="Close">
+ Закрыть
+ </string>
+ <tab_container name="ResidentChooserTabs">
+ <panel label="ПоиÑк" name="SearchPanel">
+ <text name="InstructSearchResidentName">
+ Ðаберите чаÑть имени жителÑ:
+ </text>
+ <button label="Перейти" label_selected="Перейти" name="Find"/>
+ <scroll_list name="SearchResults">
+ <columns label="Ðазвание" name="name"/>
+ <columns label="Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ" name="username"/>
+ </scroll_list>
+ </panel>
+ <panel label="ДрузьÑ" name="FriendsPanel">
+ <text name="InstructSelectFriend">
+ Выберите жителÑ:
+ </text>
+ </panel>
+ <panel label="РÑдом Ñо мной" name="NearMePanel">
+ <text name="InstructSelectResident">
+ Выберите Ð¶Ð¸Ñ‚ÐµÐ»Ñ Ð¿Ð¾Ð±Ð»Ð¸Ð·Ð¾Ñти:
+ </text>
+ <slider label="РаÑÑтоÑние" name="near_me_range"/>
+ <text name="meters">
+ Метров
+ </text>
+ <scroll_list name="NearMe">
+ <columns label="Ðазвание" name="name"/>
+ <columns label="Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ" name="username"/>
+ </scroll_list>
+ </panel>
+ </tab_container>
+ <button label="ОК" label_selected="ОК" name="ok_btn"/>
+ <button label="Отмена" label_selected="Отмена" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_avatar_textures.xml b/indra/newview/skins/default/xui/ru/floater_avatar_textures.xml
new file mode 100644
index 0000000000..cb39f66247
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_avatar_textures.xml
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="avatar_texture_debug" title="ТЕКСТУРЫ ÐÐ’ÐТÐРÐ">
+ <floater.string name="InvalidAvatar">
+ ÐЕПРÐВИЛЬÐЫЙ ÐÐ’ÐТÐР
+ </floater.string>
+ <scroll_container name="profile_scroll">
+ <panel name="scroll_content_panel">
+ <text name="label">
+ Сброшенные
+ТекÑтуры
+ </text>
+ <text name="composite_label">
+ Сложные
+ТекÑтуры
+ </text>
+ <button label="Вывод ID на конÑоль" label_selected="Вывод" name="Dump"/>
+ <panel name="scroll_content_panel">
+ <texture_picker label="ВолоÑÑ‹" name="hair-baked"/>
+ <texture_picker label="ВолоÑÑ‹" name="hair_grain"/>
+ <texture_picker label="Ðльфа волоÑ" name="hair_alpha"/>
+ <texture_picker label="Голова" name="head-baked"/>
+ <texture_picker label="МакиÑж" name="head_bodypaint"/>
+ <texture_picker label="Ðльфа головы" name="head_alpha"/>
+ <texture_picker label="Тату головы" name="head_tattoo"/>
+ <texture_picker label="Глаза" name="eyes-baked"/>
+ <texture_picker label="Глаз" name="eyes_iris"/>
+ <texture_picker label="Ðльфа глаз" name="eyes_alpha"/>
+ <texture_picker label="ВерхнÑÑ Ñ‡Ð°Ñть тела" name="upper-baked"/>
+ <texture_picker label="РаÑкраÑка верхней чаÑти тела" name="upper_bodypaint"/>
+ <texture_picker label="Майка" name="upper_undershirt"/>
+ <texture_picker label="Перчатки" name="upper_gloves"/>
+ <texture_picker label="Рубашка" name="upper_shirt"/>
+ <texture_picker label="Верх пиджака" name="upper_jacket"/>
+ <texture_picker label="Ðльфа верха" name="upper_alpha"/>
+ <texture_picker label="Тату верха" name="upper_tattoo"/>
+ <texture_picker label="ÐижнÑÑ Ñ‡Ð°Ñть тела" name="lower-baked"/>
+ <texture_picker label="РаÑкраÑка нижней чаÑти тела" name="lower_bodypaint"/>
+ <texture_picker label="ТруÑÑ‹" name="lower_underpants"/>
+ <texture_picker label="ÐоÑки" name="lower_socks"/>
+ <texture_picker label="Обувь" name="lower_shoes"/>
+ <texture_picker label="Брюки" name="lower_pants"/>
+ <texture_picker label="Пиджак" name="lower_jacket"/>
+ <texture_picker label="Ðльфа низа" name="lower_alpha"/>
+ <texture_picker label="Тату низа" name="lower_tattoo"/>
+ <texture_picker label="Юбка" name="skirt-baked"/>
+ <texture_picker label="Юбка" name="skirt"/>
+ </panel>
+ </panel>
+ </scroll_container>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_beacons.xml b/indra/newview/skins/default/xui/ru/floater_beacons.xml
new file mode 100644
index 0000000000..38d257ff81
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_beacons.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="beacons" title="МЕТКИ">
+ <panel name="beacons_panel">
+ <text name="label_show">
+ Показать:
+ </text>
+ <check_box label="Метки" name="beacons"/>
+ <check_box label="ПодÑветку" name="highlights"/>
+ <text name="beacon_width_label" tool_tip="Ширина меток">
+ Ширина:
+ </text>
+ <text name="label_objects">
+ Ð”Ð»Ñ Ñтих объектов:
+ </text>
+ <check_box label="ФизичеÑкий" name="physical"/>
+ <check_box label="Скриптовые" name="scripted"/>
+ <check_box label="Только каÑание" name="touch_only"/>
+ <check_box label="ИÑточники звука" name="sounds"/>
+ <check_box label="ИÑточники чаÑтиц" name="particles"/>
+ <check_box label="ИÑточники медиа" name="moapbeacon"/>
+ </panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_build_options.xml b/indra/newview/skins/default/xui/ru/floater_build_options.xml
new file mode 100644
index 0000000000..9dd01dc823
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_build_options.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="build options floater" title="ÐÐСТРОЙКИ СЕТКИ">
+ <floater.string name="grid_screen_text">
+ Экран
+ </floater.string>
+ <floater.string name="grid_local_text">
+ ЛокальнаÑ
+ </floater.string>
+ <floater.string name="grid_world_text">
+ Мир
+ </floater.string>
+ <floater.string name="grid_reference_text">
+ Точка отÑчета
+ </floater.string>
+ <floater.string name="grid_attachment_text">
+ ПриÑоединение
+ </floater.string>
+ <text name="grid_mode_label" tool_tip="ПрозрачноÑть Ñетки">
+ Режим
+ </text>
+ <combo_box name="combobox grid mode" tool_tip="Выберите тип линейки Ñетки Ð´Ð»Ñ Ñ€Ð°Ð·Ð¼ÐµÑ‰ÐµÐ½Ð¸Ñ Ð¾Ð±ÑŠÐµÐºÑ‚Ð°">
+ <combo_box.item label="Ð’ÑемирнаÑ" name="World"/>
+ <combo_box.item label="Ð›Ð¾ÐºÐ°Ð»ÑŒÐ½Ð°Ñ Ñетка" name="Local"/>
+ <combo_box.item label="ÐšÐ¾Ð¾Ñ€Ð´Ð¸Ð½Ð°Ñ‚Ð½Ð°Ñ Ñетка" name="Reference"/>
+ </combo_box>
+ <spinner label="Единицы (метры)" name="GridResolution"/>
+ <spinner label="ПроÑтранÑтво (метры)" name="GridDrawSize"/>
+ <check_box label="ПривÑзывать к ÑубъÑчейкам" name="GridSubUnit"/>
+ <check_box label="Показывать плоÑкоÑть переÑечениÑ" name="GridCrossSection"/>
+ <text name="grid_opacity_label" tool_tip="ПрозрачноÑть Ñетки">
+ ПрозрачноÑть:
+ </text>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_bulk_perms.xml b/indra/newview/skins/default/xui/ru/floater_bulk_perms.xml
new file mode 100644
index 0000000000..ccf13cf02a
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_bulk_perms.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floaterbulkperms" title="ИЗМЕÐИТЬ РÐЗРЕШЕÐИЯ ÐРИСПОЛЬЗОВÐÐИЕ КОÐТЕÐТÐ">
+ <floater.string name="nothing_to_modify_text">
+ Ð’ выбранной облаÑти нет контента, который можно изменÑть.
+ </floater.string>
+ <floater.string name="status_text">
+ Задание разрешений Ð´Ð»Ñ [NAME]
+ </floater.string>
+ <floater.string name="start_text">
+ Создание запроÑа на изменение разрешений...
+ </floater.string>
+ <floater.string name="done_text">
+ Выполненные запроÑÑ‹ на изменение разрешений.
+ </floater.string>
+ <icon name="icon_animation" tool_tip="ÐнимациÑ"/>
+ <icon name="icon_bodypart" tool_tip="ЧаÑти тела"/>
+ <icon name="icon_clothing" tool_tip="Одежда"/>
+ <icon name="icon_gesture" tool_tip="ЖеÑты"/>
+ <icon name="icon_notecard" tool_tip="Заметки"/>
+ <icon name="icon_object" tool_tip="Объекты"/>
+ <icon name="icon_script" tool_tip="Скрипты"/>
+ <icon name="icon_sound" tool_tip="Звуки"/>
+ <icon name="icon_texture" tool_tip="ТекÑтуры"/>
+ <button label="√ Ð’Ñе" name="check_all"/>
+ <button label="ОчиÑтить" label_selected="Ðет" name="check_none"/>
+ <text name="newperms">
+ Ðовые Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ð½Ð° контент
+ </text>
+ <text name="GroupLabel">
+ Группа:
+ </text>
+ <check_box label="ПоделитьÑÑ" name="share_with_group"/>
+ <text name="AnyoneLabel">
+ Ð’Ñе:
+ </text>
+ <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 initial_value="иÑтина" label="Передать" name="next_owner_transfer" tool_tip="Следующий владелец может отдать или перепродать объект"/>
+ <button label="ОК" name="apply"/>
+ <button label="Отмена" name="close"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_bumps.xml b/indra/newview/skins/default/xui/ru/floater_bumps.xml
new file mode 100644
index 0000000000..f81f728290
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_bumps.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_bumps" title="СТОЛКÐОВЕÐИЯ, ТОЛЧКИ И УДÐРЫ">
+ <floater.string name="none_detected">
+ Ðичего не обнаружено
+ </floater.string>
+ <floater.string name="bump">
+ [TIME] [NAME] ÑтолкнулÑÑ Ñ Ð²Ð°Ð¼Ð¸
+ </floater.string>
+ <floater.string name="llpushobject">
+ [TIME] [NAME] толкнул Ð²Ð°Ñ Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ Ñкрипта
+ </floater.string>
+ <floater.string name="selected_object_collide">
+ [TIME] [NAME] ударил Ð²Ð°Ñ Ð¾Ð±ÑŠÐµÐºÑ‚Ð¾Ð¼
+ </floater.string>
+ <floater.string name="scripted_object_collide">
+ [TIME] [NAME] ударил Ð²Ð°Ñ Ñкриптовым объектом
+ </floater.string>
+ <floater.string name="physical_object_collide">
+ [TIME] [NAME] ударил Ð²Ð°Ñ Ñ„Ð¸Ð·Ð¸Ñ‡ÐµÑким объектом
+ </floater.string>
+ <floater.string name="timeStr">
+ [[hour,datetime,slt]:[min,datetime,slt]]
+ </floater.string>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_buy_contents.xml b/indra/newview/skins/default/xui/ru/floater_buy_contents.xml
new file mode 100644
index 0000000000..b1d66ae14d
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_buy_contents.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_buy_contents" title="ПОКУПКРСОДЕРЖИМОГО">
+ <floater.string name="no_copy_text">
+ (не копируетÑÑ)
+ </floater.string>
+ <floater.string name="no_modify_text">
+ (не изменÑетÑÑ)
+ </floater.string>
+ <floater.string name="no_transfer_text">
+ (не передаетÑÑ)
+ </floater.string>
+ <text name="contains_text">
+ &lt;nolink&gt;[NAME]&lt;/nolink&gt; Ñодержит:
+ </text>
+ <text name="buy_text">
+ Купить за L$[AMOUNT] у Ð¶Ð¸Ñ‚ÐµÐ»Ñ [NAME]?
+ </text>
+ <check_box label="Ðадеть одежду ÑейчаÑ" name="wear_check"/>
+ <button label="Купить" label_selected="Купить" name="buy_btn"/>
+ <button label="Отмена" label_selected="Отмена" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_buy_currency.xml b/indra/newview/skins/default/xui/ru/floater_buy_currency.xml
new file mode 100644
index 0000000000..87e8bd524e
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_buy_currency.xml
@@ -0,0 +1,66 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="buy currency" title="КУПИТЬ L$">
+ <floater.string name="buy_currency">
+ Купить L$ [LINDENS] примерно за [LOCALAMOUNT]
+ </floater.string>
+ <text name="info_need_more">
+ Вам нужно больше L$
+ </text>
+ <text name="contacting">
+ Соединение Ñ LindeX...
+ </text>
+ <text name="info_buying">
+ Купить L$
+ </text>
+ <text name="balance_label">
+ У Ð¼ÐµÐ½Ñ ÐµÑть
+ </text>
+ <text name="balance_amount">
+ L$ [AMT]
+ </text>
+ <text name="currency_action">
+ Я хочу купить
+ </text>
+ <text name="currency_label">
+ L$
+ </text>
+ <line_editor label="L$" name="currency_amt">
+ 1234
+ </line_editor>
+ <text name="buying_label">
+ По цене
+ </text>
+ <text name="currency_est">
+ примерно [LOCALAMOUNT]
+ </text>
+ <text name="getting_data">
+ ПодÑчет...
+ </text>
+ <text name="buy_action">
+ [ACTION]
+ </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 ÑпоÑоб оплаты] | [http://www.secondlife.com/my/account/currency.php деньги]
+ </text>
+ <text name="exchange_rate_note">
+ Повторно введите Ñумму, чтобы увидеть новый обменный курÑ.
+ </text>
+ <text name="purchase_warning_repurchase">
+ Подтверждение Ñтой Ñделки приведет к покупке L$, а не объектов.
+ </text>
+ <text name="purchase_warning_notenough">
+ Ð’Ñ‹ не приобрели доÑтаточного количеÑтва L$. Увеличьте количеÑтво.
+ </text>
+ <button label="ПриобреÑти" name="buy_btn"/>
+ <button label="Отмена" name="cancel_btn"/>
+ <text name="info_cannot_buy">
+ ÐÐµÐ»ÑŒÐ·Ñ ÐºÑƒÐ¿Ð¸Ñ‚ÑŒ
+ </text>
+ <button label="Продолжить в Интернете" name="error_web"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_buy_currency_html.xml b/indra/newview/skins/default/xui/ru/floater_buy_currency_html.xml
new file mode 100644
index 0000000000..ac8ad469fb
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_buy_currency_html.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_buy_currency_html" title="КУПИТЬ Ð’ÐЛЮТУ"/>
diff --git a/indra/newview/skins/default/xui/ru/floater_buy_land.xml b/indra/newview/skins/default/xui/ru/floater_buy_land.xml
new file mode 100644
index 0000000000..907a795393
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_buy_land.xml
@@ -0,0 +1,233 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="buy land" title="КУПИТЬ ЗЕМЛЮ">
+ <floater.string name="can_resell">
+ Может быть перепродана.
+ </floater.string>
+ <floater.string name="can_not_resell">
+ Ðе может быть перепродана.
+ </floater.string>
+ <floater.string name="can_change">
+ Может быть объединена или разделена.
+ </floater.string>
+ <floater.string name="can_not_change">
+ Ðе может быть объединена или разделена.
+ </floater.string>
+ <floater.string name="cant_buy_for_group">
+ У Ð²Ð°Ñ Ð½ÐµÑ‚ прав на покупку земли Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ¹ активной группы.
+ </floater.string>
+ <floater.string name="no_land_selected">
+ Ðет выбранной земли.
+ </floater.string>
+ <floater.string name="multiple_parcels_selected">
+ Выбрано неÑколько разных учаÑтков.
+Попробуйте выбрать облаÑть поменьше.
+ </floater.string>
+ <floater.string name="no_permission">
+ У Ð²Ð°Ñ Ð½ÐµÑ‚ прав на покупку земли Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ¹ активной группы.
+ </floater.string>
+ <floater.string name="parcel_not_for_sale">
+ Выбранный учаÑток земли не Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð´Ð°Ð¶Ð¸.
+ </floater.string>
+ <floater.string name="group_already_owns">
+ Группа уже владеет учаÑтком.
+ </floater.string>
+ <floater.string name="you_already_own">
+ Ð’Ñ‹ уже владеете учаÑтком.
+ </floater.string>
+ <floater.string name="set_to_sell_to_other">
+ Выбранный учаÑток земли выÑтавлен на продажу Ð´Ð»Ñ Ð´Ñ€ÑƒÐ³Ð¸Ñ… людей.
+ </floater.string>
+ <floater.string name="no_public_land">
+ Ð’ выбранной облаÑти нет публичных земель.
+ </floater.string>
+ <floater.string name="not_owned_by_you">
+ Выбрана землÑ, Ð¿Ñ€Ð¸Ð½Ð°Ð´Ð»ÐµÐ¶Ð°Ñ‰Ð°Ñ Ð´Ñ€ÑƒÐ³Ð¾Ð¼Ñƒ жителю.
+Попробуйте выбрать облаÑть поменьше.
+ </floater.string>
+ <floater.string name="processing">
+ Обработка вашей покупки...
+
+(Ñто может занÑть неÑколько минут).
+ </floater.string>
+ <floater.string name="fetching_error">
+ Возникла ошибка при запроÑе информации о покупке земли.
+ </floater.string>
+ <floater.string name="buying_will">
+ Покупка Ñтой земли будет:
+ </floater.string>
+ <floater.string name="buying_for_group">
+ Покупка земли Ð´Ð»Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ñ‹ будет:
+ </floater.string>
+ <floater.string name="cannot_buy_now">
+ Ð¡ÐµÐ¹Ñ‡Ð°Ñ ÐºÑƒÐ¿Ð¸Ñ‚ÑŒ нельзÑ:
+ </floater.string>
+ <floater.string name="not_for_sale">
+ Ðе Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð´Ð°Ð¶Ð¸:
+ </floater.string>
+ <floater.string name="none_needed">
+ не требуетÑÑ
+ </floater.string>
+ <floater.string name="must_upgrade">
+ Ваш аккаунт должен быть улучшен Ð´Ð»Ñ ÑпоÑобноÑти Ð²Ð»Ð°Ð´ÐµÐ½Ð¸Ñ Ð·ÐµÐ¼Ð»ÐµÐ¹.
+ </floater.string>
+ <floater.string name="cant_own_land">
+ Ваш аккаунт позволÑет владеть землей.
+ </floater.string>
+ <floater.string name="land_holdings">
+ Вы владеете [BUYER] м² земли.
+ </floater.string>
+ <floater.string name="pay_to_for_land">
+ Заплатить продавцу [SELLER] L$[AMOUNT] за Ñту землю
+ </floater.string>
+ <floater.string name="buy_for_US">
+ Купить L$ [AMOUNT] примерно за [LOCAL_AMOUNT],
+ </floater.string>
+ <floater.string name="parcel_meters">
+ Размер учаÑтка – [AMOUNT] м²
+ </floater.string>
+ <floater.string name="premium_land">
+ Эта Ð·ÐµÐ¼Ð»Ñ â€“ премиум-клаÑÑа, и будет заÑчитана как [AMOUNT] м².
+ </floater.string>
+ <floater.string name="discounted_land">
+ Эта Ð·ÐµÐ¼Ð»Ñ Ñо Ñкидкой, и будет заÑчитана как [AMOUNT] м².
+ </floater.string>
+ <floater.string name="meters_supports_object">
+ [AMOUNT] м²
+поддерживает [AMOUNT2] объектов
+ </floater.string>
+ <floater.string name="sold_with_objects">
+ продано Ñ Ð¾Ð±ÑŠÐµÐºÑ‚Ð°Ð¼Ð¸
+ </floater.string>
+ <floater.string name="sold_without_objects">
+ объекты не включены
+ </floater.string>
+ <floater.string name="info_price_string">
+ L$ [PRICE]
+(L$ [PRICE_PER_SQM]/м²)
+[SOLD_WITH_OBJECTS]
+ </floater.string>
+ <floater.string name="insufficient_land_credits">
+ Группе [GROUP] понадобитÑÑ Ð²Ñ‹Ð¿Ð»Ð°Ñ‚Ð¸Ñ‚ÑŒ доÑтаточную Ñумму Ð´Ð»Ñ Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶ÐºÐ¸ Ñтой земли, чтобы покрыть учаÑток до Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ Ð¿Ð¾ÐºÑƒÐ¿ÐºÐ¸.
+ </floater.string>
+ <floater.string name="have_enough_lindens">
+ У Ð²Ð°Ñ ÐµÑть L$ [AMOUNT], которых доÑтаточно Ð´Ð»Ñ Ð¿Ð¾ÐºÑƒÐ¿ÐºÐ¸ Ñтой земли.
+ </floater.string>
+ <floater.string name="not_enough_lindens">
+ У Ð²Ð°Ñ ÐµÑть только L$ [AMOUNT], не хватает L$ [AMOUNT2].
+ </floater.string>
+ <floater.string name="balance_left">
+ ПоÑле покупки у Ð²Ð°Ñ Ð¾ÑтанетÑÑ L$ [AMOUNT].
+ </floater.string>
+ <floater.string name="balance_needed">
+ Вам нужно приобреÑти как минимум L$ [AMOUNT], чтобы позволить Ñебе Ñту землю.
+ </floater.string>
+ <floater.string name="no_parcel_selected">
+ (учаÑток не выбран)
+ </floater.string>
+ <text name="region_name_label">
+ Регион:
+ </text>
+ <text name="region_name_text">
+ (неизвеÑтно)
+ </text>
+ <text name="region_type_label">
+ Тип:
+ </text>
+ <text name="region_type_text">
+ (неизвеÑтно)
+ </text>
+ <text name="estate_name_label">
+ Землевладение:
+ </text>
+ <text name="estate_name_text">
+ (неизвеÑтно)
+ </text>
+ <text name="estate_owner_label">
+ Землевладелец:
+ </text>
+ <text name="estate_owner_text">
+ (неизвеÑтно)
+ </text>
+ <text name="resellable_changeable_label">
+ ÐŸÑ€Ð¸Ð¾Ð±Ñ€ÐµÑ‚ÐµÐ½Ð½Ð°Ñ Ð² Ñтом регионе землÑ:
+ </text>
+ <text name="resellable_clause">
+ Может или не может быть перепродана.
+ </text>
+ <text name="changeable_clause">
+ Может или не может быть объединена или разделена.
+ </text>
+ <text name="covenant_text">
+ Ð’Ñ‹ должны принÑть Ñоглашение по землевладению:
+ </text>
+ <text_editor name="covenant_editor">
+ Загрузка...
+ </text_editor>
+ <check_box label="Я принимаю Ñоглашение, определенное выше." name="agree_covenant"/>
+ <text name="info_parcel_label">
+ УчаÑток:
+ </text>
+ <text name="info_parcel">
+ Scotopteryx 138,204
+ </text>
+ <text name="info_size_label">
+ Размер:
+ </text>
+ <text name="info_size">
+ 1024 м²
+ </text>
+ <text name="info_price_label">
+ Цена:
+ </text>
+ <text name="info_price">
+ L$ 1500
+(L$ 1,1/м²)
+продано Ñ Ð¾Ð±ÑŠÐµÐºÑ‚Ð°Ð¼Ð¸
+ </text>
+ <text name="info_action">
+ Покупка Ñтой земли будет:
+ </text>
+ <text name="error_message">
+ Что-то не правильно.
+ </text>
+ <button label="Перейти на Ñайт" name="error_web"/>
+ <text name="account_action">
+ Улучшить ваш аккаунт до ÑƒÑ€Ð¾Ð²Ð½Ñ Premium.
+ </text>
+ <text name="account_reason">
+ Только премиум-учаÑтники могут владеть землей.
+ </text>
+ <combo_box name="account_level">
+ <combo_box.item label="9,95 долл. СШÐ/меÑ, оплачиваетÑÑ ÐµÐ¶ÐµÐ¼ÐµÑÑчно" name="US$9.95/month,billedmonthly"/>
+ <combo_box.item label="7,50 долл. СШÐ/меÑ, оплачиваетÑÑ ÐµÐ¶ÐµÐºÐ²Ð°Ñ€Ñ‚Ð°Ð»ÑŒÐ½Ð¾" name="US$7.50/month,billedquarterly"/>
+ <combo_box.item label="6,00 долл. СШÐ/меÑ, оплачиваетÑÑ ÐµÐ¶ÐµÐ³Ð¾Ð´Ð½Ð¾" name="US$6.00/month,billedannually"/>
+ </combo_box>
+ <text name="land_use_action">
+ Увеличит вашу меÑÑчную оплату на US$ 40/меÑ.
+ </text>
+ <text name="land_use_reason">
+ Вы владеете 1309 м² земли.
+Ð’ Ñтом учаÑтке 512 м² земли.
+ </text>
+ <text name="purchase_action">
+ Заплатить жителю Joe L$ 4000 за землю
+ </text>
+ <text name="currency_reason">
+ У Ð²Ð°Ñ L$ 2100.
+ </text>
+ <text name="currency_action">
+ Покупка L$
+ </text>
+ <line_editor name="currency_amt">
+ 1000
+ </line_editor>
+ <text name="currency_est">
+ обойдетÑÑ Ð¿Ñ€Ð¸Ð¼ÐµÑ€Ð½Ð¾ в [LOCAL_AMOUNT]
+ </text>
+ <text name="currency_balance">
+ У Ð²Ð°Ñ L$ 2100.
+ </text>
+ <check_box label="Удалить [AMOUNT] м² взноÑа из группы." name="remove_contribution"/>
+ <button label="Покупка" name="buy_btn"/>
+ <button label="Отмена" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_buy_object.xml b/indra/newview/skins/default/xui/ru/floater_buy_object.xml
new file mode 100644
index 0000000000..d25f9eccc2
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_buy_object.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="contents" title="КУПИТЬ КОПИЮ ОБЪЕКТÐ">
+ <floater.string name="title_buy_text">
+ Купить
+ </floater.string>
+ <floater.string name="title_buy_copy_text">
+ Купить копию
+ </floater.string>
+ <floater.string name="no_copy_text">
+ (не копируетÑÑ)
+ </floater.string>
+ <floater.string name="no_modify_text">
+ (не изменÑетÑÑ)
+ </floater.string>
+ <floater.string name="no_transfer_text">
+ (не передаетÑÑ)
+ </floater.string>
+ <text name="contents_text">
+ Содержимое:
+ </text>
+ <text name="buy_text">
+ Купить за L$[AMOUNT] у пользователÑ:
+ </text>
+ <text name="buy_name_text">
+ [NAME]?
+ </text>
+ <button label="Купить" label_selected="Купить" name="buy_btn"/>
+ <button label="Отмена" label_selected="Отмена" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_camera.xml b/indra/newview/skins/default/xui/ru/floater_camera.xml
new file mode 100644
index 0000000000..52e7c62e06
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_camera.xml
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="camera_floater" title="УПРÐВЛЕÐИЕ КÐМЕРОЙ">
+ <floater.string name="rotate_tooltip">
+ Повернуть камеру вокруг точки фокуÑировки
+ </floater.string>
+ <floater.string name="zoom_tooltip">
+ Приблизить/отдалить камеру отноÑительно точки фокуÑировки
+ </floater.string>
+ <floater.string name="move_tooltip">
+ ПеремеÑтить камеру вверх, вниз, влево или вправо
+ </floater.string>
+ <floater.string name="free_mode_title">
+ Смотреть на объект
+ </floater.string>
+ <panel name="controls">
+ <panel name="preset_views_list">
+ <panel_camera_item name="front_view">
+ <panel_camera_item.text name="front_view_text">
+ Вид Ñпереди
+ </panel_camera_item.text>
+ </panel_camera_item>
+ <panel_camera_item name="group_view">
+ <panel_camera_item.text name="side_view_text">
+ Вид Ñбоку
+ </panel_camera_item.text>
+ </panel_camera_item>
+ <panel_camera_item name="rear_view">
+ <panel_camera_item.text name="rear_view_text">
+ Вид Ñзади
+ </panel_camera_item.text>
+ </panel_camera_item>
+ </panel>
+ <panel name="camera_modes_list">
+ <panel_camera_item name="object_view">
+ <panel_camera_item.text name="object_view_text">
+ ОÑмотр объекта
+ </panel_camera_item.text>
+ </panel_camera_item>
+ <panel_camera_item name="mouselook_view">
+ <panel_camera_item.text name="mouselook_view_text">
+ Обзор Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ мыши
+ </panel_camera_item.text>
+ </panel_camera_item>
+ </panel>
+ <panel name="zoom">
+ <joystick_rotate name="cam_rotate_stick" tool_tip="Повернуть камеру вокруг точки фокуÑировки"/>
+ <slider_bar name="zoom_slider" tool_tip="Приблизить/отдалить камеру отноÑительно точки фокуÑировки"/>
+ <joystick_track name="cam_track_stick" tool_tip="ПеремеÑтить камеру вверх, вниз, влево или вправо"/>
+ </panel>
+ </panel>
+ <panel name="buttons">
+ <button label="" name="presets_btn" tool_tip="Стандартные наÑтройки"/>
+ <button label="" name="pan_btn" tool_tip="Вращение, приближение, Ñдвиг"/>
+ <button label="" name="avatarview_btn" tool_tip="Режимы камеры"/>
+ </panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_chat_bar.xml b/indra/newview/skins/default/xui/ru/floater_chat_bar.xml
new file mode 100644
index 0000000000..79b7b033fb
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_chat_bar.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="chat_bar" title="ЛОКÐЛЬÐЫЙ ЧÐТ">
+ <panel name="bottom_panel">
+ <line_editor label="Щелкните здеÑÑŒ Ð´Ð»Ñ Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ." name="chat_box" tool_tip="Ðажмите Enter, чтобы Ñказать, Ctrl+Enter, чтобы прокричать"/>
+ <button name="show_nearby_chat" tool_tip="Показать/Ñкрыть лог локального чата"/>
+ </panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_choose_group.xml b/indra/newview/skins/default/xui/ru/floater_choose_group.xml
new file mode 100644
index 0000000000..ab8350f539
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_choose_group.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="groups" title="ГРУППЫ">
+ <text name="groupdesc">
+ Выберите группу:
+ </text>
+ <button label="OK" label_selected="OK" name="OK"/>
+ <button label="Отмена" label_selected="Отмена" name="Cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_color_picker.xml b/indra/newview/skins/default/xui/ru/floater_color_picker.xml
new file mode 100644
index 0000000000..b7034bef0b
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_color_picker.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="ColorPicker" title="ВЫБОР ЦВЕТÐ">
+ <text name="r_val_text">
+ КраÑный:
+ </text>
+ <text name="g_val_text">
+ Зеленый:
+ </text>
+ <text name="b_val_text">
+ Синий:
+ </text>
+ <text name="h_val_text">
+ Оттенок:
+ </text>
+ <text name="s_val_text">
+ ÐаÑыщен.:
+ </text>
+ <text name="l_val_text">
+ ЯркоÑть:
+ </text>
+ <check_box label="Применить ÑейчаÑ" name="apply_immediate"/>
+ <button label="ОК" label_selected="ОК" name="select_btn"/>
+ <button label="Отмена" label_selected="Отмена" name="cancel_btn"/>
+ <text name="Current color:">
+ Текущий цвет:
+ </text>
+ <text name="(Drag below to save.)">
+ (Перетащите вниз Ð´Ð»Ñ ÑохранениÑ)
+ </text>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_critical.xml b/indra/newview/skins/default/xui/ru/floater_critical.xml
new file mode 100644
index 0000000000..bc64f3a83e
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_critical.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="modal container">
+ <button label="Продолжить" label_selected="Продолжить" name="Continue"/>
+ <text name="tos_heading">
+ Внимательно прочитайте Ñледующее Ñообщение.
+ </text>
+ <text_editor name="tos_text">
+ TOS_TEXT
+ </text_editor>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_delete_env_preset.xml b/indra/newview/skins/default/xui/ru/floater_delete_env_preset.xml
new file mode 100644
index 0000000000..3303a4f4c1
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_delete_env_preset.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+<floater name="Delete Env Preset" title="УДÐЛЕÐИЕ ÐÐСТРОЙКИ СРЕДЫ">
+ <string name="title_water">
+ Удалить наÑтройку воды
+ </string>
+ <string name="title_sky">
+ Удалить наÑтройку неба
+ </string>
+ <string name="title_day_cycle">
+ Удалить Ñуточный цикл
+ </string>
+ <string name="label_water">
+ ÐаÑтройка:
+ </string>
+ <string name="label_sky">
+ ÐаÑтройка:
+ </string>
+ <string name="label_day_cycle">
+ Суточный цикл:
+ </string>
+ <string name="msg_confirm_deletion">
+ ДейÑтвительно удалить выбранную наÑтройку?
+ </string>
+ <string name="msg_sky_is_referenced">
+ ÐÐµÐ»ÑŒÐ·Ñ ÑƒÐ´Ð°Ð»Ð¸Ñ‚ÑŒ наÑтройку, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð¸ÑпользуетÑÑ Ð² Ñуточных циклах.
+ </string>
+ <string name="combo_label">
+ -Выбор наÑтройки-
+ </string>
+ <text name="label">
+ ÐаÑтройка:
+ </text>
+ <button label="Удалить" name="delete"/>
+ <button label="Отмена" name="cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_destinations.xml b/indra/newview/skins/default/xui/ru/floater_destinations.xml
new file mode 100644
index 0000000000..5ba0841564
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_destinations.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Destinations" title="ПУÐКТЫ"/> \ No newline at end of file
diff --git a/indra/newview/skins/default/xui/ru/floater_display_name.xml b/indra/newview/skins/default/xui/ru/floater_display_name.xml
new file mode 100644
index 0000000000..feb8a2721f
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_display_name.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Display Name" title="СМЕÐРЭКРÐÐÐОГО ИМЕÐИ">
+ <text name="info_text">
+ ИмÑ, которое вы даете аватару, называетÑÑ Ñкранным именем. Ð’Ñ‹ можете менÑть его раз в неделю.
+ </text>
+ <text name="lockout_text">
+ Ð’Ñ‹ не можете менÑть Ñкранное Ð¸Ð¼Ñ Ð´Ð¾: [TIME].
+ </text>
+ <text name="set_name_label">
+ Ðовое Ñкранное имÑ:
+ </text>
+ <text name="name_confirm_label">
+ Ðаберите новое Ð¸Ð¼Ñ ÐµÑ‰Ðµ раз Ð´Ð»Ñ Ð¿Ð¾Ð´Ñ‚Ð²ÐµÑ€Ð¶Ð´ÐµÐ½Ð¸Ñ:
+ </text>
+ <button label="Сохранить" name="save_btn" tool_tip="Сохранить ваше новое Ñкранное имÑ"/>
+ <button label="СброÑ" name="reset_btn" tool_tip="Сменить Ñкранное Ð¸Ð¼Ñ Ð½Ð° Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ"/>
+ <button label="Отмена" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_edit_day_cycle.xml b/indra/newview/skins/default/xui/ru/floater_edit_day_cycle.xml
new file mode 100644
index 0000000000..61d708c567
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_edit_day_cycle.xml
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Edit Day cycle" title="Изменить Ñуточный цикл">
+ <string name="title_new">
+ Создать Ñуточный цикл
+ </string>
+ <string name="title_edit">
+ Изменить Ñуточный цикл
+ </string>
+ <string name="hint_new">
+ Введите Ð¸Ð¼Ñ Ñуточного цикла, задайте его параметры Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ Ñлементов ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¸ нажмите кнопку «Сохранить».
+ </string>
+ <string name="hint_edit">
+ Чтобы изменить Ñуточный цикл, задайте его параметры Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ Ñлементов ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð½Ð¸Ð¶Ðµ и нажмите кнопку «Сохранить».
+ </string>
+ <string name="combo_label">
+ -Выбор наÑтройки-
+ </string>
+ <text name="label">
+ Ð˜Ð¼Ñ Ð½Ð°Ñтройки:
+ </text>
+ <text name="note">
+ Примечание. ЕÑли изменить Ð¸Ð¼Ñ Ð½Ð°Ñтройки, будет Ñоздана Ð½Ð¾Ð²Ð°Ñ Ð½Ð°Ñтройка, а Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² ÑущеÑтвующей не будут Ñохранены.
+ </text>
+ <text name="hint_item1">
+ - Ð”Ð»Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð½Ð°Ñтроек неба и времени выберите ÑоответÑтвующую вкладку.
+ </text>
+ <text name="hint_item2">
+ - Чтобы задать Ð²Ñ€ÐµÐ¼Ñ Ð¿ÐµÑ€ÐµÑ…Ð¾Ð´Ð¾Ð², перетаÑкивайте вкладки.
+ </text>
+ <text name="hint_item3">
+ - Скребок Ñлужит Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñмотра Ñуточного цикла.
+ </text>
+ <panel name="day_cycle_slider_panel">
+ <multi_slider initial_value="0" name="WLTimeSlider"/>
+ <multi_slider initial_value="0" name="WLDayCycleKeys"/>
+ <button label="+ отметку" label_selected="+ отметку" name="WLAddKey"/>
+ <button label="- отметку" label_selected="- отметку" name="WLDeleteKey"/>
+ <text name="WL12am">
+ 12 ночи
+ </text>
+ <text name="WL3am">
+ 3 ночи
+ </text>
+ <text name="WL6am">
+ 6 утра
+ </text>
+ <text name="WL9amHash">
+ 9 утра
+ </text>
+ <text name="WL12pmHash">
+ 12 днÑ
+ </text>
+ <text name="WL3pm">
+ 3 днÑ
+ </text>
+ <text name="WL6pm">
+ 6 вечера
+ </text>
+ <text name="WL9pm">
+ 9 вечера
+ </text>
+ <text name="WL12am2">
+ 12 ночи
+ </text>
+ <text name="WL12amHash">
+ |
+ </text>
+ <text name="WL3amHash">
+ I
+ </text>
+ <text name="WL6amHash">
+ |
+ </text>
+ <text name="WL9amHash2">
+ I
+ </text>
+ <text name="WL12pmHash2">
+ |
+ </text>
+ <text name="WL3pmHash">
+ I
+ </text>
+ <text name="WL6pmHash">
+ |
+ </text>
+ <text name="WL9pmHash">
+ I
+ </text>
+ <text name="WL12amHash2">
+ |
+ </text>
+ </panel>
+ <text name="WLCurKeyPresetText">
+ Ðебо:
+ </text>
+ <combo_box label="Стандарт" name="WLSkyPresets"/>
+ <text name="WLCurKeyTimeText">
+ ВремÑ:
+ </text>
+ <time name="time" value="6:00"/>
+ <check_box label="УÑтановить как новый Ñуточный цикл" name="make_default_cb"/>
+ <button label="Сохранить" name="save"/>
+ <button label="Отмена" name="cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_edit_sky_preset.xml b/indra/newview/skins/default/xui/ru/floater_edit_sky_preset.xml
new file mode 100644
index 0000000000..354120ea72
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_edit_sky_preset.xml
@@ -0,0 +1,143 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Edit Sky Preset" title="Изменить наÑтройку неба">
+ <string name="title_new">
+ Создать наÑтройку неба
+ </string>
+ <string name="title_edit">
+ Изменить наÑтройку неба
+ </string>
+ <string name="hint_new">
+ Введите Ð¸Ð¼Ñ Ð½Ð°Ñтройки, задайте ее параметры Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ Ñлементов ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¸ нажмите кнопку «Сохранить».
+ </string>
+ <string name="hint_edit">
+ Чтобы изменить наÑтройку неба, задайте ее параметры Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ Ñлементов ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¸ нажмите кнопку «Сохранить».
+ </string>
+ <string name="combo_label">
+ -Выбор наÑтройки-
+ </string>
+ <text name="hint">
+ Чтобы изменить наÑтройку, задайте ее параметры Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ Ñлементов ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¸ нажмите кнопку «Сохранить».
+ </text>
+ <text name="label">
+ Ð˜Ð¼Ñ Ð½Ð°Ñтройки:
+ </text>
+ <text name="note">
+ Примечание. ЕÑли изменить Ð¸Ð¼Ñ Ð½Ð°Ñтройки, будет Ñоздана Ð½Ð¾Ð²Ð°Ñ Ð½Ð°Ñтройка, а Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² ÑущеÑтвующей не будут Ñохранены.
+ </text>
+ <tab_container name="WindLight Tabs">
+ <panel label="ÐТМОСФЕРÐ" name="Atmosphere">
+ <text name="BHText">
+ Голубой горизонт
+ </text>
+ <text name="BDensText">
+ Дымка на горизонте
+ </text>
+ <text name="BDensText2">
+ ÐаÑыщенноÑть голубого
+ </text>
+ <text name="HDText">
+ ПлотноÑть дымки
+ </text>
+ <text name="DensMultText">
+ КоÑффициент плотноÑти
+ </text>
+ <text name="WLDistanceMultText">
+ КоÑффициент раÑÑтоÑниÑ
+ </text>
+ <text name="MaxAltText">
+ МакÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ð²Ñ‹Ñота
+ </text>
+ </panel>
+ <panel label="ОСВЕЩЕÐИЕ" name="Lighting">
+ <text name="SLCText">
+ Цвет Ñолнца/луны
+ </text>
+ <text name="WLAmbientText">
+ РаÑÑеÑнное
+ </text>
+ <text name="SunGlowText">
+ СиÑние Ñолнца
+ </text>
+ <slider label="ФокуÑ" name="WLGlowB"/>
+ <slider label="Размер" name="WLGlowR"/>
+ <text name="WLStarText">
+ ЯркоÑть звезд
+ </text>
+ <text name="SceneGammaText">
+ Гамма-ÐºÐ¾Ñ€Ñ€ÐµÐºÑ†Ð¸Ñ Ñцены
+ </text>
+ <text name="TODText">
+ Положение Ñолнца/луны
+ </text>
+ <multi_slider initial_value="0" name="WLSunPos"/>
+ <text name="WL12amHash">
+ |
+ </text>
+ <text name="WL6amHash">
+ |
+ </text>
+ <text name="WL12pmHash2">
+ |
+ </text>
+ <text name="WL6pmHash">
+ |
+ </text>
+ <text name="WL12amHash2">
+ |
+ </text>
+ <text name="WL12am">
+ 12 ночи
+ </text>
+ <text name="WL6am">
+ 6 утра
+ </text>
+ <text name="WL12pmHash">
+ 12 днÑ
+ </text>
+ <text name="WL6pm">
+ 6 вечера
+ </text>
+ <text name="WL12am2">
+ 12 ночи
+ </text>
+ <time name="WLDayTime" value="6:00"/>
+ <text name="WLEastAngleText">
+ Смещение отн. воÑтока
+ </text>
+ </panel>
+ <panel label="ОБЛÐКÐ" name="Clouds">
+ <text name="WLCloudColorText">
+ Цвет
+ </text>
+ <text name="WLCloudColorText2">
+ Положение и плотноÑть
+ </text>
+ <slider label="X" name="WLCloudX"/>
+ <slider label="Y" name="WLCloudY"/>
+ <slider label="П" name="WLCloudDensity"/>
+ <text name="WLCloudCoverageText">
+ ОблачноÑть
+ </text>
+ <text name="WLCloudScaleText">
+ Размеры
+ </text>
+ <text name="WLCloudDetailText">
+ Детали (положение/плотноÑть)
+ </text>
+ <slider label="X" name="WLCloudDetailX"/>
+ <slider label="Y" name="WLCloudDetailY"/>
+ <slider label="П" name="WLCloudDetailDensity"/>
+ <text name="WLCloudScrollXText">
+ СкороÑть по X
+ </text>
+ <check_box label="Ðа меÑте" name="WLCloudLockX"/>
+ <text name="WLCloudScrollYText">
+ СкороÑть по Y
+ </text>
+ <check_box label="Ðа меÑте" name="WLCloudLockY"/>
+ </panel>
+ </tab_container>
+ <check_box label="Применить Ñту наÑтройку неба" name="make_default_cb"/>
+ <button label="Сохранить" name="save"/>
+ <button label="Отмена" name="cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_edit_water_preset.xml b/indra/newview/skins/default/xui/ru/floater_edit_water_preset.xml
new file mode 100644
index 0000000000..f6def86380
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_edit_water_preset.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Edit Water Preset" title="Изменить наÑтройку воды">
+ <string name="title_new">
+ Создать наÑтройку воды
+ </string>
+ <string name="title_edit">
+ Изменение наÑтройки воды
+ </string>
+ <string name="hint_new">
+ Введите Ð¸Ð¼Ñ Ð½Ð°Ñтройки, задайте ее параметры Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ Ñлементов ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¸ нажмите кнопку «Сохранить».
+ </string>
+ <string name="hint_edit">
+ Чтобы изменить наÑтройку воды, задайте параметры Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ Ñлементов ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¸ нажмите кнопку «Сохранить».
+ </string>
+ <string name="combo_label">
+ -Выбор наÑтройки-
+ </string>
+ <text name="hint">
+ Чтобы изменить наÑтройку, задайте ее параметры Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ Ñлементов ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¸ нажмите кнопку «Сохранить».
+ </text>
+ <text name="label">
+ Ð˜Ð¼Ñ Ð½Ð°Ñтройки:
+ </text>
+ <text name="note">
+ Примечание. ЕÑли изменить Ð¸Ð¼Ñ Ð½Ð°Ñтройки, будет Ñоздана Ð½Ð¾Ð²Ð°Ñ Ð½Ð°Ñтройка, а Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² ÑущеÑтвующей не будут Ñохранены.
+ </text>
+ <panel name="panel_water_preset">
+ <text name="water_color_label">
+ Оттенок
+ </text>
+ <text name="water_fog_density_label">
+ ПрозрачноÑть
+ </text>
+ <text name="underwater_fog_modifier_label">
+ Изменение прозрачноÑти
+ </text>
+ <text name="BHText">
+ Ðаправление больших волн
+ </text>
+ <slider label="X" name="WaterWave1DirX"/>
+ <slider label="Y" name="WaterWave1DirY"/>
+ <text name="BDensText">
+ Степень Ð¾Ñ‚Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð·Ñ‹Ð±Ð¸
+ </text>
+ <text name="HDText">
+ Отражение
+ </text>
+ <text name="FresnelOffsetText">
+ Ð£Ð³Ð»Ð¾Ð²Ð°Ñ Ð·Ð°Ð²Ð¸ÑимоÑть
+ </text>
+ <text name="BHText2">
+ Ðаправление Ñ€Ñби
+ </text>
+ <slider label="X" name="WaterWave2DirX"/>
+ <slider label="Y" name="WaterWave2DirY"/>
+ <text name="DensMultText">
+ Преломление (над водой)
+ </text>
+ <text name="WaterScaleBelowText">
+ Преломление (под водой)
+ </text>
+ <text name="MaxAltText">
+ Размытие
+ </text>
+ <text name="BHText3">
+ Карта поверхноÑти
+ </text>
+ </panel>
+ <check_box label="Применить Ñту наÑтройку воды" name="make_default_cb"/>
+ <button label="Сохранить" name="save"/>
+ <button label="Отмена" name="cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_env_settings.xml b/indra/newview/skins/default/xui/ru/floater_env_settings.xml
new file mode 100644
index 0000000000..a3e77d61de
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_env_settings.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Environment Editor Floater" title="РЕДÐКТОР СРЕДЫ">
+ <floater.string name="timeStr">
+ [hour,datetime,utc]:[min,datetime,utc]
+ </floater.string>
+ <text name="EnvTimeText">
+ Ð’Ñ€ÐµÐ¼Ñ Ñуток
+ </text>
+ <text name="EnvTimeText2">
+ 12:00
+ </text>
+ <text name="EnvCloudText">
+ ОблачноÑть
+ </text>
+ <text name="EnvWaterColorText">
+ Цвет воды
+ </text>
+ <color_swatch name="EnvWaterColor" tool_tip="Щелкните Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° цвета"/>
+ <text name="EnvWaterFogText">
+ Водный туман
+ </text>
+ <button label="ИÑпользовать Ð²Ñ€ÐµÐ¼Ñ Ð² землевладении" name="EnvUseEstateTimeButton"/>
+ <button label="Улучшенное небо" name="EnvAdvancedSkyButton"/>
+ <button label="Ð£Ð»ÑƒÑ‡ÑˆÐµÐ½Ð½Ð°Ñ Ð²Ð¾Ð´Ð°" name="EnvAdvancedWaterButton"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_environment_settings.xml b/indra/newview/skins/default/xui/ru/floater_environment_settings.xml
new file mode 100644
index 0000000000..d752c08cbb
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_environment_settings.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Environment Editor Floater" title="ÐÐСТРОЙКИ СРЕДЫ">
+ <text name="note">
+ Приведенные ниже параметры позволÑÑŽÑ‚ наÑтроить Ñреду клиента.
+ </text>
+ <radio_group name="region_settings_radio_group">
+ <radio_item label="ИÑпользовать наÑтройки региона" name="use_region_settings"/>
+ <radio_item label="ÐаÑтроить Ñреду" name="use_my_settings"/>
+ </radio_group>
+ <panel name="user_environment_settings">
+ <text name="note">
+ Примечание. Ваши перÑональные наÑтройки не видны другим пользователÑм.
+ </text>
+ <text name="water_settings_title">
+ ÐаÑтройка воды
+ </text>
+ <combo_box name="water_settings_preset_combo">
+ <combo_box.item label="-Выбор наÑтройки-" name="item0"/>
+ </combo_box>
+ <text name="sky_dayc_settings_title">
+ Ðебо и Ñуточный цикл
+ </text>
+ <radio_group name="sky_dayc_settings_radio_group">
+ <radio_item label="Ðебо не менÑетÑÑ" name="my_sky_settings"/>
+ <radio_item label="Суточный цикл" name="my_dayc_settings"/>
+ </radio_group>
+ <combo_box name="sky_settings_preset_combo">
+ <combo_box.item label="-Выбор наÑтройки-" name="item0"/>
+ </combo_box>
+ <combo_box name="dayc_settings_preset_combo">
+ <combo_box.item label="-Выбор наÑтройки-" name="item0"/>
+ </combo_box>
+ </panel>
+ <button label="ОК" name="ok_btn"/>
+ <button label="Отмена" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_event.xml b/indra/newview/skins/default/xui/ru/floater_event.xml
new file mode 100644
index 0000000000..5c5bcc6d09
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_event.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater label="Событие" name="Event" title="СВЕДЕÐИЯ О СОБЫТИИ">
+ <floater.string name="loading_text">
+ Загрузка...
+ </floater.string>
+ <floater.string name="done_text">
+ Готово
+ </floater.string>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_fast_timers.xml b/indra/newview/skins/default/xui/ru/floater_fast_timers.xml
new file mode 100644
index 0000000000..20936b8494
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_fast_timers.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="fast_timers">
+ <string name="pause">
+ Пауза
+ </string>
+ <string name="run">
+ Бег
+ </string>
+ <button label="Пауза" name="pause_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_font_test.xml b/indra/newview/skins/default/xui/ru/floater_font_test.xml
new file mode 100644
index 0000000000..b51732d3f1
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_font_test.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="contents" title="ТЕСТ ШРИФТОВ"/>
diff --git a/indra/newview/skins/default/xui/ru/floater_gesture.xml b/indra/newview/skins/default/xui/ru/floater_gesture.xml
new file mode 100644
index 0000000000..759d81b2c6
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_gesture.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater label="МеÑта" name="gestures" title="ЖЕСТЫ">
+ <floater.string name="loading">
+ Загрузка...
+ </floater.string>
+ <floater.string name="playing">
+ (проигрываетÑÑ)
+ </floater.string>
+ <floater.string name="copy_name">
+ ÐšÐ¾Ð¿Ð¸Ñ [COPY_NAME]
+ </floater.string>
+ <scroll_list name="gesture_list">
+ <scroll_list.columns label="Ðазвание" name="name"/>
+ <scroll_list.columns label="Чат" name="trigger"/>
+ <scroll_list.columns label="Клавиша" name="shortcut"/>
+ </scroll_list>
+ <panel label="bottom_panel" name="bottom_panel">
+ <menu_button name="gear_btn" tool_tip="Дополнительные параметры"/>
+ <button name="new_gesture_btn" tool_tip="Создать новый жеÑÑ‚"/>
+ <button name="activate_btn" tool_tip="Ðктивировать/деактивировать выбранный жеÑÑ‚"/>
+ <button name="del_btn" tool_tip="Удалить Ñтот жеÑÑ‚"/>
+ </panel>
+ <button label="Изменить" name="edit_btn"/>
+ <button label="Проиграть" name="play_btn"/>
+ <button label="Стоп" name="stop_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_god_tools.xml b/indra/newview/skins/default/xui/ru/floater_god_tools.xml
new file mode 100644
index 0000000000..81329475aa
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_god_tools.xml
@@ -0,0 +1,96 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="godtools floater" title="ИÐСТРУМЕÐТЫ ТВОРЦÐ">
+ <tab_container name="GodTools Tabs">
+ <panel label="Сетка" name="grid">
+ <button label="Обновить кÑш данных карты Ñтого региона" label_selected="Обновить кÑш данных карты Ñтого региона" name="Flush This Region&apos;s Map Visibility Caches"/>
+ </panel>
+ <panel label="Регион" name="region">
+ <text name="Region Name:">
+ Ðазвание региона:
+ </text>
+ <check_box label="Ð‘ÑƒÑ„ÐµÑ€Ð½Ð°Ñ Ð·Ð¾Ð½Ð°" name="check prelude" tool_tip="Сделать Ñтот регион буферной зоной"/>
+ <check_box label="Солнце на меÑте" name="check fixed sun" tool_tip="ФикÑÐ°Ñ†Ð¸Ñ Ð¿Ð¾Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ñолнца (как в меню «Регион/Землевладение &gt; Ландшафт»)"/>
+ <check_box label="Ð¡Ð±Ñ€Ð¾Ñ Ð´Ð¾Ð¼Ð° при телепортации" name="check reset home" tool_tip="Дом жителей, которые телепортируютÑÑ Ð¾Ñ‚Ñюда, будет там, куда они телепортируютÑÑ."/>
+ <check_box label="Видимый" name="check visible" tool_tip="Сделать регион видимым не только Ð´Ð»Ñ Ñ‚Ð²Ð¾Ñ€Ñ†Ð¾Ð²"/>
+ <check_box label="ПовреждениÑ" name="check damage" tool_tip="Сделать возможными Ð¿Ð¾Ð²Ñ€ÐµÐ¶Ð´ÐµÐ½Ð¸Ñ Ð² регионе"/>
+ <check_box label="Блокировать отÑлеживание трафика" name="block dwell" tool_tip="Выберите, чтобы Ð´Ð»Ñ Ñ€ÐµÐ³Ð¸Ð¾Ð½Ð° не отÑлеживалÑÑ Ñ‚Ñ€Ð°Ñ„Ð¸Ðº"/>
+ <check_box label="Запретить терраформирование" name="block terraform" tool_tip="Выберите, чтобы жители не могли изменÑть ландшафт Ñвоей земли"/>
+ <check_box label="ПеÑочница" name="is sandbox" tool_tip="Выберите, ÑвлÑетÑÑ Ð»Ð¸ Ñтот регион «пеÑочницей»"/>
+ <button label="ЗафикÑировать пределы" label_selected="ЗафикÑировать пределы" name="Bake Terrain" tool_tip="Сохранить текущий ландшафт как Ñтандартный"/>
+ <button label="Вернуть ландшафт" label_selected="Вернуть ландшафт" name="Revert Terrain" tool_tip="Заменить текущий ландшафт ландшафтом по умолчанию"/>
+ <button label="ПоменÑть ландшафты" label_selected="ПоменÑть ландшафты" name="Swap Terrain" tool_tip="ПоменÑть меÑтами текущий ландшафт и ландшафт по умолчанию"/>
+ <text name="estate id">
+ ИД землевладениÑ:
+ </text>
+ <text name="parent id">
+ ИД родового объекта:
+ </text>
+ <line_editor name="parentestate" tool_tip="Родовое землевладение Ð´Ð»Ñ Ñтого региона"/>
+ <text name="Grid Pos: ">
+ Полож. Ñетки:
+ </text>
+ <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$ за м²:
+ </text>
+ <button label="Обновить" label_selected="Обновить" name="Refresh" tool_tip="Обновление приведенной выше информации"/>
+ <button label="Применить" label_selected="Применить" name="Apply" tool_tip="Применить вÑе Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð²Ñ‹ÑˆÐµ"/>
+ <button label="Выбрать регион" label_selected="Выбрать регион" name="Select Region" tool_tip="Выбор вÑего региона Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ инÑтрумента Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð»Ð°Ð½Ð´ÑˆÐ°Ñ„Ñ‚Ð°"/>
+ <button label="ÐвтоÑохранение" label_selected="ÐвтоÑохранение" name="Autosave now" tool_tip="Сохранить в каталоге автоÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ ÑоÑтоÑние в архиве Gzip"/>
+ </panel>
+ <panel label="Объекты" name="objects">
+ <panel.string name="no_target">
+ (нет перÑонажа)
+ </panel.string>
+ <text name="Region Name:">
+ Ðазвание региона:
+ </text>
+ <text name="region name">
+ УÑльÑ
+ </text>
+ <check_box label="Отключить Ñкрипты" name="disable scripts" tool_tip="Отключение вÑех Ñкриптов в Ñтом регионе"/>
+ <check_box label="Отключить ÑтолкновениÑ" name="disable collisions" tool_tip="Отключение Ñтолкновений не-агентов в Ñтом регионе"/>
+ <check_box label="Отключить физику" name="disable physics" tool_tip="Отключение вÑех физичеÑких параметров в Ñтом регионе"/>
+ <button label="Применить" label_selected="Применить" name="Apply" tool_tip="Применить вÑе Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð²Ñ‹ÑˆÐµ"/>
+ <button label="Задать перÑонаж" label_selected="Задать перÑонаж" name="Set Target" tool_tip="Выберите аватар-перÑонаж Ð´Ð»Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð¾Ð±ÑŠÐµÐºÑ‚Ð°"/>
+ <text name="target_avatar_name">
+ (нет перÑонажа)
+ </text>
+ <button label="Удалить принадлежащие перÑонажу объекты Ñо Ñкриптами на чужой земле" label_selected="Удалить принадлежащие перÑонажу объекты Ñо Ñкриптами на чужой земле" name="Delete Target&apos;s Scripted Objects On Others Land" tool_tip="Удаление вÑех объектов Ñо Ñкриптами, принадлежащих перÑонажу, на земле, не принадлежащей перÑонажу. «Ðе копируемые» объекты будут возвращены."/>
+ <button label="Удалить принадлежащие перÑонажу объекты Ñо Ñкриптами на *вÑех* землÑÑ…" label_selected="Удалить принадлежащие перÑонажу объекты Ñо Ñкриптами на *вÑех* землÑÑ…" name="Delete Target&apos;s Scripted Objects On *Any* Land" tool_tip="Удаление вÑех объектов Ñо Ñкриптами, принадлежащих перÑонажу, в Ñтом регионе. «Ðе копируемые» объекты будут возвращены."/>
+ <button label="Удалить *ВСЕ* объекты перÑонажа" label_selected="Удалить *ВСЕ* объекты перÑонажа" name="Delete *ALL* Of Target&apos;s Objects" tool_tip="Удаление вÑех объектов, принадлежащих перÑонажу, в Ñтом регионе. «Ðе копируемые» объекты будут возвращены."/>
+ <button label="Самые активные учаÑтники Ñтолкновений" label_selected="Самые активные учаÑтники Ñтолкновений" name="Get Top Colliders" tool_tip="СпиÑок объектов, Ð´Ð»Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ñ… наблюдаетÑÑ Ð±Ð¾Ð»ÑŒÑˆÐµ вÑего детализированных обратных вызовов"/>
+ <button label="Загрузить лучшие Ñкрипты" label_selected="Загрузить лучшие Ñкрипты" name="Get Top Scripts" tool_tip="СпиÑок объектов, в которых Ñкрипты выполнÑÑŽÑ‚ÑÑ Ð´Ð¾Ð»ÑŒÑˆÐµ вÑего"/>
+ <button label="Сводка по Ñкриптам" label_selected="Сводка по Ñкриптам" name="Scripts digest" tool_tip="СпиÑок вÑех Ñкриптов Ñ Ñ‡Ð¸Ñлом иÑпользований по каждому из них"/>
+ </panel>
+ <panel label="ЗапроÑ" name="request">
+ <text name="Destination:">
+ Пункт назначениÑ:
+ </text>
+ <combo_box name="destination">
+ <combo_box.item label="назначенный" name="item1"/>
+ <combo_box.item label="текущий регион" name="item2"/>
+ </combo_box>
+ <text name="Request:">
+ ЗапроÑ:
+ </text>
+ <combo_box name="request">
+ <combo_box.item label="учаÑтники Ñтолкновений &lt;steps&gt;" name="item1"/>
+ <combo_box.item label="Ñкрипты: &lt;count&gt;,&lt;optional pattern&gt;" name="item2"/>
+ <combo_box.item label="объекты &lt;pattern&gt;" name="item3"/>
+ <combo_box.item label="выложить &lt;asset_id&gt;" name="item4"/>
+ </combo_box>
+ <text name="Parameter:">
+ Параметр:
+ </text>
+ <button label="Ñделать запроÑ" label_selected="Сделать запроÑ" name="Make Request"/>
+ </panel>
+ </tab_container>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_hardware_settings.xml b/indra/newview/skins/default/xui/ru/floater_hardware_settings.xml
new file mode 100644
index 0000000000..7400f1df3b
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_hardware_settings.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Hardware Settings Floater" title="ÐППÐРÐТÐЫЕ ÐÐСТРОЙКИ">
+ <text name="Filtering:">
+ ФильтрациÑ:
+ </text>
+ <check_box label="ÐÐ½Ð¸Ð·Ð¾Ñ‚Ñ€Ð¾Ð¿Ð½Ð°Ñ Ñ„Ð¸Ð»ÑŒÑ‚Ñ€Ð°Ñ†Ð¸Ñ (медленнее, еÑли включено)" name="ani"/>
+ <text name="antialiasing label">
+ Сглаживание:
+ </text>
+ <combo_box label="Сглаживание" name="fsaa">
+ <combo_box.item label="Выключено" name="FSAADisabled"/>
+ <combo_box.item label="2x" name="2x"/>
+ <combo_box.item label="4x" name="4x"/>
+ <combo_box.item label="8x" name="8x"/>
+ <combo_box.item label="16x" name="16x"/>
+ </combo_box>
+ <text name="antialiasing restart">
+ (требуетÑÑ Ð¿ÐµÑ€ÐµÐ·Ð°Ð¿ÑƒÑк)
+ </text>
+ <spinner label="Гамма:" name="gamma"/>
+ <text name="(brightness, lower is brighter)">
+ (чем меньше, тем Ñрче. 0 – ÑркоÑть по умолчанию)
+ </text>
+ <text name="Enable VBO:">
+ Включить VBO:
+ </text>
+ <check_box initial_value="иÑтина" label="Включить объекты вершинных буферов OpenGL" name="vbo" tool_tip="Включение Ñтого параметра на Ñовременном оборудовании даÑÑ‚ увеличение производительноÑти. Однако на Ñтаром оборудовании Ñто может привеÑти к Ñбою приложениÑ."/>
+ <slider label="ПамÑть Ð´Ð»Ñ Ñ‚ÐµÐºÑтур (Мб):" name="GraphicsCardTextureMemory" tool_tip="КоличеÑтво памÑти, отводимое Ð´Ð»Ñ Ñ‚ÐµÐºÑтур. По умолчанию равно памÑти видеокарты. Уменьшение поможет увеличить производительноÑть, но текÑтуры могут Ñтать размытыми."/>
+ <spinner label="ДиÑÑ‚Ð°Ð½Ñ†Ð¸Ñ Ñ‚ÑƒÐ¼Ð°Ð½Ð°:" name="fog"/>
+ <button label="OK" label_selected="OK" name="OK"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_help_browser.xml b/indra/newview/skins/default/xui/ru/floater_help_browser.xml
new file mode 100644
index 0000000000..2f560340ed
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_help_browser.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_help_browser" title="ОБЗОР СПРÐВКИ">
+ <floater.string name="loading_text">
+ Загрузка...
+ </floater.string>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_how_to.xml b/indra/newview/skins/default/xui/ru/floater_how_to.xml
new file mode 100644
index 0000000000..52525e5d33
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_how_to.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_how_to" title="ПОМОЩЬ"/>
diff --git a/indra/newview/skins/default/xui/ru/floater_hud.xml b/indra/newview/skins/default/xui/ru/floater_hud.xml
new file mode 100644
index 0000000000..b05113bfe0
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_hud.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_hud" title="УЧЕБÐИК"/>
diff --git a/indra/newview/skins/default/xui/ru/floater_im_container.xml b/indra/newview/skins/default/xui/ru/floater_im_container.xml
new file mode 100644
index 0000000000..b147cfa2b3
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_im_container.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<multi_floater name="floater_im_box" title="ОБЩЕÐИЕ"/>
diff --git a/indra/newview/skins/default/xui/ru/floater_im_session.xml b/indra/newview/skins/default/xui/ru/floater_im_session.xml
new file mode 100644
index 0000000000..604d9dc6d3
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_im_session.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="panel_im">
+ <layout_stack name="im_panels">
+ <layout_panel>
+ <line_editor label="Кому" name="chat_editor"/>
+ </layout_panel>
+ </layout_stack>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_image_preview.xml b/indra/newview/skins/default/xui/ru/floater_image_preview.xml
new file mode 100644
index 0000000000..dbc4c32b98
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_image_preview.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Image Preview">
+ <text name="name_label">
+ Ðазвание:
+ </text>
+ <text name="description_label">
+ ОпиÑание:
+ </text>
+ <text name="preview_label">
+ Показать изображение как:
+ </text>
+ <combo_box label="Тип одежды" name="clothing_type_combo">
+ <item label="Изображение" name="Image" value="Изображение"/>
+ <item label="ВолоÑÑ‹" name="Hair" value="ВолоÑÑ‹"/>
+ <item label="ЖенÑÐºÐ°Ñ Ð³Ð¾Ð»Ð¾Ð²Ð°" name="FemaleHead" value="ЖенÑÐºÐ°Ñ Ð³Ð¾Ð»Ð¾Ð²Ð°"/>
+ <item label="ВерхнÑÑ Ñ‡Ð°Ñть тела женщины" name="FemaleUpperBody" value="ВерхнÑÑ Ñ‡Ð°Ñть тела женщины"/>
+ <item label="ÐижнÑÑ Ñ‡Ð°Ñть тела женщины" name="FemaleLowerBody" value="ÐижнÑÑ Ñ‡Ð°Ñть тела женщины"/>
+ <item label="МужÑÐºÐ°Ñ Ð³Ð¾Ð»Ð¾Ð²Ð°" name="MaleHead" value="МужÑÐºÐ°Ñ Ð³Ð¾Ð»Ð¾Ð²Ð°"/>
+ <item label="ВерхнÑÑ Ñ‡Ð°Ñть тела мужчины" name="MaleUpperBody" value="ВерхнÑÑ Ñ‡Ð°Ñть тела мужчины"/>
+ <item label="ÐижнÑÑ Ñ‡Ð°Ñть тела мужчины" name="MaleLowerBody" value="ÐижнÑÑ Ñ‡Ð°Ñть тела мужчины"/>
+ <item label="Юбка" name="Skirt" value="Юбка"/>
+ <item label="Скульптурный примитив" name="SculptedPrim" value="Скульптурный примитив"/>
+ </combo_box>
+ <text name="bad_image_text">
+ Ðевозможно прочитать изображение.
+Попробуйте Ñохранить изображение как 24-битный TGA-файл (Targa).
+ </text>
+ <check_box label="ИÑпользовать Ñжатие без потерь" name="lossless_check"/>
+ <button label="Отмена" name="cancel_btn"/>
+ <button label="Передать (L$[AMOUNT])" name="ok_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_import_collada.xml b/indra/newview/skins/default/xui/ru/floater_import_collada.xml
new file mode 100644
index 0000000000..122315cb26
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_import_collada.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Import Collada" title="Импорт Ñцены">
+ <text name="mesh count">
+ Мешей: [COUNT]
+ </text>
+ <text name="texture count">
+ ТекÑтур: [COUNT]
+ </text>
+ <text name="status">
+ СтатуÑ: [STATUS]
+ </text>
+ <button label="Отмена" name="cancel"/>
+ <button label="ОК" name="ok"/>
+ <string name="status_idle">
+ Ðеактивно
+ </string>
+ <string name="status_uploading">
+ ПередаетÑÑ [NAME]
+ </string>
+ <string name="status_creating">
+ СоздаетÑÑ Ð¾Ð±ÑŠÐµÐºÑ‚ [NAME]
+ </string>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_incoming_call.xml b/indra/newview/skins/default/xui/ru/floater_incoming_call.xml
new file mode 100644
index 0000000000..072c20147d
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_incoming_call.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="incoming call" title="ВходÑщий звонок">
+ <floater.string name="lifetime">
+ 5
+ </floater.string>
+ <floater.string name="localchat">
+ Локальный голоÑовой чат
+ </floater.string>
+ <floater.string name="anonymous">
+ анонимно
+ </floater.string>
+ <floater.string name="VoiceInviteP2P">
+ вызывает.
+ </floater.string>
+ <floater.string name="VoiceInviteAdHoc">
+ теперь учаÑтвует в групповом голоÑовом чате.
+ </floater.string>
+ <floater.string name="VoiceInviteGroup">
+ приÑоединилÑÑ (-лаÑÑŒ) к голоÑовому каналу «[GROUP]».
+ </floater.string>
+ <floater.string name="VoiceInviteQuestionGroup">
+ Хотите выйти из чата «[CURRENT_CHAT]» и приÑоединитьÑÑ Ðº звонку «[GROUP]»?
+ </floater.string>
+ <floater.string name="VoiceInviteQuestionDefault">
+ Хотите выйти из чата «[CURRENT_CHAT]» и приÑоединитьÑÑ Ðº Ñтому голоÑовому чату?
+ </floater.string>
+ <text name="question">
+ Хотите выйти из чата «[CURRENT_CHAT]» и приÑоединитьÑÑ Ðº Ñтому голоÑовому чату?
+ </text>
+ <button label="ПринÑть" label_selected="ПринÑть" name="Accept"/>
+ <button label="Отклонить" label_selected="Отклонить" name="Reject"/>
+ <button label="Ðачать IM" name="Start IM"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_inspect.xml b/indra/newview/skins/default/xui/ru/floater_inspect.xml
new file mode 100644
index 0000000000..f7bb981575
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_inspect.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="inspect" title="ИÐСПЕКТИРОВÐÐИЕ ОБЪЕКТОВ">
+ <floater.string name="timeStamp">
+ [wkday,datetime,local], [day,datetime,local] [mth,datetime,local] [year,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.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="Показывает профиль ÑÐ¾Ð·Ð´Ð°Ñ‚ÐµÐ»Ñ Ð¿Ð¾Ð´Ñвеченного объекта"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_inventory.xml b/indra/newview/skins/default/xui/ru/floater_inventory.xml
new file mode 100644
index 0000000000..35cbcf177d
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_inventory.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Inventory" title="МОЙ ИÐВЕÐТÐРЬ">
+ <panel label="Панель инвентарÑ" name="Inventory Panel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_inventory_item_properties.xml b/indra/newview/skins/default/xui/ru/floater_inventory_item_properties.xml
new file mode 100644
index 0000000000..9021b71fe2
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_inventory_item_properties.xml
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="item properties" title="СВОЙСТВРПРЕДМЕТÐ">
+ <floater.string name="unknown">
+ (неизвеÑтно)
+ </floater.string>
+ <floater.string name="public">
+ (публичное)
+ </floater.string>
+ <floater.string name="you_can">
+ Вы можете:
+ </floater.string>
+ <floater.string name="owner_can">
+ Владелец может:
+ </floater.string>
+ <floater.string name="acquiredDate">
+ [wkday,datetime,local], [day,datetime,local] [mth,datetime,local] [year,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local]
+ </floater.string>
+ <text name="LabelItemNameTitle">
+ Ðазвание:
+ </text>
+ <text name="LabelItemDescTitle">
+ ОпиÑание:
+ </text>
+ <text name="LabelCreatorTitle">
+ Создатель:
+ </text>
+ <button label="Профиль…" name="BtnCreator"/>
+ <text name="LabelOwnerTitle">
+ Владелец:
+ </text>
+ <button label="Профиль…" name="BtnOwner"/>
+ <text name="LabelAcquiredTitle">
+ Приобретено:
+ </text>
+ <text name="LabelAcquiredDate">
+ Ср 24 Май 12:50:46 2006
+ </text>
+ <text name="OwnerLabel">
+ Ð’Ñ‹:
+ </text>
+ <check_box label="Изменить" name="CheckOwnerModify"/>
+ <check_box label="Копировать" name="CheckOwnerCopy"/>
+ <check_box label="Перепродать" name="CheckOwnerTransfer"/>
+ <text name="AnyoneLabel">
+ Ð’Ñе:
+ </text>
+ <check_box label="Копировать" name="CheckEveryoneCopy"/>
+ <text name="GroupLabel">
+ Группа:
+ </text>
+ <check_box label="ПоделитьÑÑ" name="CheckShareWithGroup"/>
+ <text name="NextOwnerLabel">
+ Следующий владелец:
+ </text>
+ <check_box label="Изменить" name="CheckNextOwnerModify"/>
+ <check_box label="Копировать" name="CheckNextOwnerCopy"/>
+ <check_box label="Перепродать" name="CheckNextOwnerTransfer"/>
+ <check_box label="Ð”Ð»Ñ Ð¿Ñ€Ð¾Ð´Ð°Ð¶Ð¸" name="CheckPurchase"/>
+ <combo_box name="combobox sale copy">
+ <combo_box.item label="Копировать" name="Copy"/>
+ <combo_box.item label="Оригинал" name="Original"/>
+ </combo_box>
+ <spinner label="Цена:" name="Edit Cost"/>
+ <text name="CurrencySymbol">
+ L$
+ </text>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_inventory_view_finder.xml b/indra/newview/skins/default/xui/ru/floater_inventory_view_finder.xml
new file mode 100644
index 0000000000..02068c57b8
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_inventory_view_finder.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Inventory Finder" title="INVENTORY_RECENT_ITEMS">
+ <check_box label="ÐнимациÑ" name="check_animation"/>
+ <check_box label="Визитки" name="check_calling_card"/>
+ <check_box label="Одежда" name="check_clothing"/>
+ <check_box label="ЖеÑты" name="check_gesture"/>
+ <check_box label="Закладки" name="check_landmark"/>
+ <check_box label="Меши" name="check_mesh"/>
+ <check_box label="Заметки" name="check_notecard"/>
+ <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_snapshot"/>
+ <button label="Ð’Ñе" label_selected="Ð’Ñе" name="All"/>
+ <button label="Ðет" label_selected="Ðет" name="None"/>
+ <check_box label="Ð’Ñегда показывать папки" name="check_show_empty"/>
+ <check_box label="С момента выхода" name="check_since_logoff"/>
+ <text name="- OR -">
+ - ИЛИ -
+ </text>
+ <spinner label="ЧаÑов назад" name="spin_hours_ago"/>
+ <spinner label="Дней назад" name="spin_days_ago"/>
+ <button label="Закрыть" label_selected="Закрыть" name="Close"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_joystick.xml b/indra/newview/skins/default/xui/ru/floater_joystick.xml
new file mode 100644
index 0000000000..66568563da
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_joystick.xml
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Joystick" title="КОÐФИГУРÐЦИЯ ДЖОЙСТИКÐ">
+ <floater.string name="NoDevice">
+ уÑтройÑтво не выбрано
+ </floater.string>
+ <check_box label="Вкл. джойÑтик:" name="enable_joystick"/>
+ <spinner label="Ðаложение по X" name="JoystickAxis1"/>
+ <spinner label="Ðаложение по Y" name="JoystickAxis2"/>
+ <spinner label="Ðаложение по Z" name="JoystickAxis0"/>
+ <spinner label="Ð. уклонов" name="JoystickAxis4"/>
+ <spinner label="Ð. Ñгибов" name="JoystickAxis5"/>
+ <spinner label="Ð. вращениÑ" name="JoystickAxis3"/>
+ <spinner label="Ð. маÑштабир." name="JoystickAxis6"/>
+ <check_box label="МаÑштабирование" name="ZoomDirect"/>
+ <check_box label="3D курÑор" name="Cursor3D"/>
+ <check_box label="Ðвтоуровень" name="AutoLeveling"/>
+ <text name="Control Modes:">
+ Режимы управлениÑ:
+ </text>
+ <check_box label="Ðватар" name="JoystickAvatarEnabled"/>
+ <check_box label="Стройка" name="JoystickBuildEnabled"/>
+ <check_box label="Камера" name="JoystickFlycamEnabled"/>
+ <stat_view label="Монитор джойÑтика" name="axis_view">
+ <stat_bar label="ОÑÑŒ 0" name="axis0"/>
+ <stat_bar label="ОÑÑŒ 1" name="axis1"/>
+ <stat_bar label="ОÑÑŒ 2" name="axis2"/>
+ <stat_bar label="ОÑÑŒ 3" name="axis3"/>
+ <stat_bar label="ОÑÑŒ 4" name="axis4"/>
+ <stat_bar label="ОÑÑŒ 5" name="axis5"/>
+ </stat_view>
+ <text name="XScale">
+ МаÑштаб по X
+ </text>
+ <text name="YScale">
+ МаÑштаб по Y
+ </text>
+ <text name="ZScale">
+ МаÑштаб по Z
+ </text>
+ <text name="PitchScale">
+ МаÑштаб уклона
+ </text>
+ <text name="YawScale">
+ МаÑштаб Ñгиба
+ </text>
+ <text name="RollScale">
+ МаÑштаб вращениÑ
+ </text>
+ <text name="XDeadZone">
+ ÐÐµÐ²Ð¸Ð´Ð¸Ð¼Ð°Ñ Ð·Ð¾Ð½Ð° по X
+ </text>
+ <text name="YDeadZone">
+ ÐÐµÐ²Ð¸Ð´Ð¸Ð¼Ð°Ñ Ð·Ð¾Ð½Ð° по Y
+ </text>
+ <text name="ZDeadZone">
+ ÐÐµÐ²Ð¸Ð´Ð¸Ð¼Ð°Ñ Ð·Ð¾Ð½Ð° по Z
+ </text>
+ <text name="PitchDeadZone">
+ Ðевид. зона уклона
+ </text>
+ <text name="YawDeadZone">
+ Ðевид. зона Ñгиба
+ </text>
+ <text name="RollDeadZone">
+ Ðевид. зона вращениÑ
+ </text>
+ <text name="Feathering">
+ Размывка краев
+ </text>
+ <text name="ZoomScale2">
+ МаÑштаб
+ </text>
+ <text name="ZoomDeadZone">
+ Ðевид. зона маÑшт.
+ </text>
+ <button label="Стандартные Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ SpaceNavigator" name="SpaceNavigatorDefaults"/>
+ <button label="OK" label_selected="OK" name="ok_btn"/>
+ <button label="Отмена" label_selected="Отмена" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_lagmeter.xml b/indra/newview/skins/default/xui/ru/floater_lagmeter.xml
new file mode 100644
index 0000000000..c420006a03
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_lagmeter.xml
@@ -0,0 +1,151 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_lagmeter" title="УРОВЕÐЬ ЛÐГОВ">
+ <floater.string name="max_title_msg">
+ Уровень лагов
+ </floater.string>
+ <floater.string name="max_width_px">
+ 360
+ </floater.string>
+ <floater.string name="min_title_msg">
+ Лаг
+ </floater.string>
+ <floater.string name="min_width_px">
+ 90
+ </floater.string>
+ <floater.string name="client_text_msg">
+ Клиент
+ </floater.string>
+ <floater.string name="client_frame_rate_critical_fps">
+ 10
+ </floater.string>
+ <floater.string name="client_frame_rate_warning_fps">
+ 15
+ </floater.string>
+ <floater.string name="client_frame_time_window_bg_msg">
+ Ðормально, окно в фоне
+ </floater.string>
+ <floater.string name="client_frame_time_critical_msg">
+ ЧаÑтота кадров клиента ниже [CLIENT_FRAME_RATE_CRITICAL]
+ </floater.string>
+ <floater.string name="client_frame_time_warning_msg">
+ ЧаÑтота кадров клиента от [CLIENT_FRAME_RATE_CRITICAL] до [CLIENT_FRAME_RATE_WARNING]
+ </floater.string>
+ <floater.string name="client_frame_time_normal_msg">
+ Ðормально
+ </floater.string>
+ <floater.string name="client_draw_distance_cause_msg">
+ Ð’Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð°Ñ Ð¿Ñ€Ð¸Ñ‡Ð¸Ð½Ð°: дальноÑть отриÑовки Ñлишком велика
+ </floater.string>
+ <floater.string name="client_texture_loading_cause_msg">
+ Ð’Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð°Ñ Ð¿Ñ€Ð¸Ñ‡Ð¸Ð½Ð°: загрузка изображений
+ </floater.string>
+ <floater.string name="client_texture_memory_cause_msg">
+ Ð’Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð°Ñ Ð¿Ñ€Ð¸Ñ‡Ð¸Ð½Ð°: Ñлишком много изображений в памÑти
+ </floater.string>
+ <floater.string name="client_complex_objects_cause_msg">
+ Ð’Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð°Ñ Ð¿Ñ€Ð¸Ñ‡Ð¸Ð½Ð°: Ñлишком много Ñложных объектов в Ñцене
+ </floater.string>
+ <floater.string name="network_text_msg">
+ Сеть
+ </floater.string>
+ <floater.string name="network_packet_loss_critical_pct">
+ 10
+ </floater.string>
+ <floater.string name="network_packet_loss_warning_pct">
+ 5
+ </floater.string>
+ <floater.string name="network_packet_loss_critical_msg">
+ Сеть терÑет более [NETWORK_PACKET_LOSS_CRITICAL]% пакетов
+ </floater.string>
+ <floater.string name="network_packet_loss_warning_msg">
+ Сеть терÑет [NETWORK_PACKET_LOSS_WARNING]–[NETWORK_PACKET_LOSS_CRITICAL]% пакетов
+ </floater.string>
+ <floater.string name="network_performance_normal_msg">
+ Ðормально
+ </floater.string>
+ <floater.string name="network_ping_critical_ms">
+ 600
+ </floater.string>
+ <floater.string name="network_ping_warning_ms">
+ 300
+ </floater.string>
+ <floater.string name="network_ping_critical_msg">
+ Пинг ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð±Ð¾Ð»ÐµÐµ [NETWORK_PING_CRITICAL] мÑ
+ </floater.string>
+ <floater.string name="network_ping_warning_msg">
+ Пинг ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ [NETWORK_PING_WARNING]–[NETWORK_PING_CRITICAL] мÑ
+ </floater.string>
+ <floater.string name="network_packet_loss_cause_msg">
+ Возможно, плохое Ñоединение, или параметр «Ширина канала» Ñлишком велик.
+ </floater.string>
+ <floater.string name="network_ping_cause_msg">
+ Возможно, плохое Ñоединение или еÑть работающие файлообменные программы.
+ </floater.string>
+ <floater.string name="server_text_msg">
+ Сервер
+ </floater.string>
+ <floater.string name="server_frame_rate_critical_fps">
+ 20
+ </floater.string>
+ <floater.string name="server_frame_rate_warning_fps">
+ 30
+ </floater.string>
+ <floater.string name="server_single_process_max_time_ms">
+ 20
+ </floater.string>
+ <floater.string name="server_frame_time_critical_msg">
+ ЧаÑтота кадров Ñервера ниже [SERVER_FRAME_RATE_CRITICAL]
+ </floater.string>
+ <floater.string name="server_frame_time_warning_msg">
+ ЧаÑтота кадров Ñервера [SERVER_FRAME_RATE_CRITICAL]–[SERVER_FRAME_RATE_WARNING]
+ </floater.string>
+ <floater.string name="server_frame_time_normal_msg">
+ Ðормально
+ </floater.string>
+ <floater.string name="server_physics_cause_msg">
+ Ð’Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð°Ñ Ð¿Ñ€Ð¸Ñ‡Ð¸Ð½Ð°: Ñлишком много физичеÑких объектов
+ </floater.string>
+ <floater.string name="server_scripts_cause_msg">
+ Ð’Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð°Ñ Ð¿Ñ€Ð¸Ñ‡Ð¸Ð½Ð°: Ñлишком много Ñкриптовых объектов
+ </floater.string>
+ <floater.string name="server_net_cause_msg">
+ Ð’Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð°Ñ Ð¿Ñ€Ð¸Ñ‡Ð¸Ð½Ð°: Ñлишком большой Ñетевой трафик
+ </floater.string>
+ <floater.string name="server_agent_cause_msg">
+ Ð’Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð°Ñ Ð¿Ñ€Ð¸Ñ‡Ð¸Ð½Ð°: Ñлишком много людей в регионе
+ </floater.string>
+ <floater.string name="server_images_cause_msg">
+ Ð’Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð°Ñ Ð¿Ñ€Ð¸Ñ‡Ð¸Ð½Ð°: Ñлишком много изображений
+ </floater.string>
+ <floater.string name="server_generic_cause_msg">
+ Ð’Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð°Ñ Ð¿Ñ€Ð¸Ñ‡Ð¸Ð½Ð°: Ñервер Ñильно загружен
+ </floater.string>
+ <floater.string name="smaller_label">
+ &gt;&gt;
+ </floater.string>
+ <floater.string name="bigger_label">
+ &lt;&lt;
+ </floater.string>
+ <button name="client_lagmeter" tool_tip="Уровень лагов клиента"/>
+ <text name="client">
+ Клиент
+ </text>
+ <text name="client_text">
+ Ðормально
+ </text>
+ <button name="network_lagmeter" tool_tip="Уровень лагов Ñети"/>
+ <text name="network">
+ Сеть
+ </text>
+ <text name="network_text">
+ Ðормально
+ </text>
+ <button name="server_lagmeter" tool_tip="Уровень лагов Ñервера"/>
+ <text name="server">
+ Сервер
+ </text>
+ <text name="server_text">
+ Ðормально
+ </text>
+ <button label="&gt;&gt;" name="minimize" tool_tip="Переключение размера"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_land_holdings.xml b/indra/newview/skins/default/xui/ru/floater_land_holdings.xml
new file mode 100644
index 0000000000..17d347867d
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_land_holdings.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="land holdings floater" title="МОЯ ЗЕМЛЯ">
+ <floater.string name="area_string">
+ [AREA] м²
+ </floater.string>
+ <scroll_list name="parcel list">
+ <scroll_list.columns label="УчаÑток" name="name"/>
+ <scroll_list.columns label="Регион" name="location"/>
+ <scroll_list.columns label="Тип" name="type"/>
+ <scroll_list.columns label="Площадь" name="area"/>
+ </scroll_list>
+ <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">
+ <scroll_list.columns label="Группа" name="group"/>
+ <scroll_list.columns label="Площадь" name="area"/>
+ </scroll_list>
+ <text name="allowed_label">
+ Разрешенный размер владений Ð´Ð»Ñ Ñ‚ÐµÐºÑƒÑ‰ÐµÐ³Ð¾ плана оплат:
+ </text>
+ <text name="allowed_text">
+ [AREA] м²
+ </text>
+ <text name="current_label">
+ Текущий размер владений:
+ </text>
+ <text name="current_text">
+ [AREA] м²
+ </text>
+ <text name="available_label">
+ ДоÑтупно Ð´Ð»Ñ Ð¿Ñ€Ð¸Ð¾Ð±Ñ€ÐµÑ‚ÐµÐ½Ð¸Ñ:
+ </text>
+ <text name="available_text">
+ [AREA] м²
+ </text>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_live_lsleditor.xml b/indra/newview/skins/default/xui/ru/floater_live_lsleditor.xml
new file mode 100644
index 0000000000..d8047fc045
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_live_lsleditor.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="script ed float" title="СКРИПТ: СОЗДÐТЬ СКРИПТ">
+ <floater.string name="not_allowed">
+ Ð’Ñ‹ не можете проÑматривать и изменÑть Ñтот Ñкрипт, поÑкольку Ð´Ð»Ñ Ð½ÐµÐ³Ð¾ выбрана ÐºÐ°Ñ‚ÐµÐ³Ð¾Ñ€Ð¸Ñ Â«Ð½Ðµ копируемые». Ð”Ð»Ñ Ð¿Ñ€Ð¾Ñмотра или Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ñкрипта в объекте нужны полные права доÑтупа.
+ </floater.string>
+ <floater.string name="script_running">
+ ВыполнÑетÑÑ
+ </floater.string>
+ <floater.string name="Title">
+ СКРИПТ: [NAME]
+ </floater.string>
+ <button label="СброÑ" label_selected="СброÑ" name="Reset"/>
+ <check_box initial_value="иÑтина" label="ВыполнÑетÑÑ" name="running"/>
+ <check_box initial_value="иÑтина" label="Моно" name="mono"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_lsl_guide.xml b/indra/newview/skins/default/xui/ru/floater_lsl_guide.xml
new file mode 100644
index 0000000000..95a3b8b2a0
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_lsl_guide.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="script ed float" title="СПРÐВКРПО LSL">
+ <check_box label="КурÑор" name="lock_check"/>
+ <combo_box label="Блокировка" name="history_combo"/>
+ <button label="Ðазад" name="back_btn"/>
+ <button label="Вперед" name="fwd_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_map.xml b/indra/newview/skins/default/xui/ru/floater_map.xml
new file mode 100644
index 0000000000..59ceb0a773
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_map.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Map" title="МИÐИКÐРТÐ">
+ <floater.string name="ToolTipMsg">
+ [REGION](Двойной щелчок открывает карту, shift+перетÑгивание – обзор)
+ </floater.string>
+ <floater.string name="AltToolTipMsg">
+ [REGION](Двойной щелчок – телепортациÑ, shift+перетÑгивание – обзор)
+ </floater.string>
+ <floater.string name="mini_map_caption">
+ Миникарта
+ </floater.string>
+ <text label="С" name="floater_map_north">
+ С
+ </text>
+ <text label="E" name="floater_map_east">
+ E
+ </text>
+ <text label="З" name="floater_map_west">
+ З
+ </text>
+ <text label="Ю" name="floater_map_south">
+ Ю
+ </text>
+ <text label="ЮВ" name="floater_map_southeast">
+ ЮВ
+ </text>
+ <text label="СВ" name="floater_map_northeast">
+ СВ
+ </text>
+ <text label="ЮЗ" name="floater_map_southwest">
+ ЮЗ
+ </text>
+ <text label="СЗ" name="floater_map_northwest">
+ СЗ
+ </text>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_media_browser.xml b/indra/newview/skins/default/xui/ru/floater_media_browser.xml
new file mode 100644
index 0000000000..d1fc105046
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_media_browser.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_about" title="БРÐУЗЕР ДЛЯ ПРОСМОТРРМЕДИÐ">
+ <floater.string name="home_page_url">
+ http://www.secondlife.com
+ </floater.string>
+ <floater.string name="support_page_url">
+ http://support.secondlife.com
+ </floater.string>
+ <layout_stack name="stack1">
+ <layout_panel name="nav_controls">
+ <button label="Ðазад" name="back"/>
+ <button label="Вперед" name="forward"/>
+ <button label="Обновить" name="reload"/>
+ <button label="Перейти" name="go"/>
+ </layout_panel>
+ <layout_panel name="time_controls">
+ <button label="назад" name="rewind"/>
+ <button label="оÑтановить" name="stop"/>
+ <button label="вперед" name="seek"/>
+ </layout_panel>
+ <layout_panel name="parcel_owner_controls">
+ <button label="Отправить текущую Ñтраницу на учаÑток" name="assign"/>
+ </layout_panel>
+ <layout_panel name="external_controls">
+ <button label="Открыть в моем браузере" name="open_browser"/>
+ <check_box label="Ð’Ñегда открывать в моем браузере" name="open_always"/>
+ <button label="Закрыть" name="close"/>
+ </layout_panel>
+ </layout_stack>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_media_settings.xml b/indra/newview/skins/default/xui/ru/floater_media_settings.xml
new file mode 100644
index 0000000000..1515cbb3b8
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_media_settings.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="media_settings" title="ÐÐСТРОЙКИ МЕДИÐ">
+ <button label="OK" label_selected="OK" name="OK"/>
+ <button label="Отмена" label_selected="Отмена" name="Cancel"/>
+ <button label="Применить" label_selected="Применить" name="Apply"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_mem_leaking.xml b/indra/newview/skins/default/xui/ru/floater_mem_leaking.xml
new file mode 100644
index 0000000000..7aa5c27cde
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_mem_leaking.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="MemLeak" title="ИМИТÐЦИЯ УТЕЧКИ ПÐМЯТИ">
+ <spinner label="СкороÑть утечки (байтов за кадр):" name="leak_speed"/>
+ <spinner label="МакÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ ÑƒÑ‚ÐµÑ‡ÐºÐ° памÑти (Мб):" name="max_leak"/>
+ <text name="total_leaked_label">
+ Ð¢ÐµÐºÑƒÑ‰Ð°Ñ ÑƒÑ‚ÐµÑ‡ÐºÐ° памÑти: [SIZE] КБ
+ </text>
+ <text name="note_label_1">
+ [NOTE1]
+ </text>
+ <text name="note_label_2">
+ [NOTE2]
+ </text>
+ <button label="Старт" name="start_btn"/>
+ <button label="Стоп" name="stop_btn"/>
+ <button label="ОÑвободить" name="release_btn"/>
+ <button label="Закрыть" name="close_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_model_preview.xml b/indra/newview/skins/default/xui/ru/floater_model_preview.xml
new file mode 100644
index 0000000000..5bb96b8de4
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_model_preview.xml
@@ -0,0 +1,277 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Model Preview" title="ПЕРЕДÐЧРМОДЕЛИ">
+ <string name="status_idle"/>
+ <string name="status_parse_error">
+ Ошибка. Проблема при анализе файла DAE – Ñм. подробноÑти в журнале.
+ </string>
+ <string name="status_material_mismatch">
+ Ошибка. Материал модели не входит в Ñталонную модель.
+ </string>
+ <string name="status_reading_file">
+ Загрузка...
+ </string>
+ <string name="status_generating_meshes">
+ СоздаютÑÑ Ð¼ÐµÑˆÐ¸...
+ </string>
+ <string name="status_vertex_number_overflow">
+ Ошибка. ЧиÑло вершин превышает 65534. Прервано.
+ </string>
+ <string name="bad_element">
+ Ошибка: недопуÑтимый Ñлемент
+ </string>
+ <string name="high">
+ Ð’Ñ‹Ñокий
+ </string>
+ <string name="medium">
+ Средний
+ </string>
+ <string name="low">
+ Ðизкий
+ </string>
+ <string name="lowest">
+ Самый низкий
+ </string>
+ <string name="mesh_status_good">
+ ДоÑтавлено!
+ </string>
+ <string name="mesh_status_na">
+ Ð/Д
+ </string>
+ <string name="mesh_status_none">
+ Ðет
+ </string>
+ <string name="mesh_status_submesh_mismatch">
+ ОтличаетÑÑ Ñ‡Ð¸Ñло текÑтурируемых граней на уровнÑÑ… детализации.
+ </string>
+ <string name="mesh_status_mesh_mismatch">
+ ОтличаетÑÑ Ñ‡Ð¸Ñло ÑкземплÑров меша на уровнÑÑ… детализации.
+ </string>
+ <string name="mesh_status_too_many_vertices">
+ Слишком много вершин на уровне детализации.
+ </string>
+ <string name="mesh_status_missing_lod">
+ ОтÑутÑтвует необходимый уровень детализации.
+ </string>
+ <string name="mesh_status_invalid_material_list">
+ Материалы ÑƒÑ€Ð¾Ð²Ð½Ñ Ð´ÐµÑ‚Ð°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ð¸ не входÑÑ‚ в Ñталонную модель.
+ </string>
+ <string name="layer_all">
+ Ð’Ñе
+ </string>
+ <string name="decomposing">
+ Ðнализ...
+ </string>
+ <string name="simplifying">
+ Упрощение...
+ </string>
+ <string name="tbd">
+ Позже
+ </string>
+ <panel name="left_panel">
+ <panel name="model_name_representation_panel">
+ <text name="name_label">
+ Ð˜Ð¼Ñ Ð¼Ð¾Ð´ÐµÐ»Ð¸:
+ </text>
+ <text name="model_category_label">
+ Эта модель предÑтавлÑет...
+ </text>
+ <combo_box name="model_category_combo">
+ <combo_item label="Выберите вариант..." name="Choose one"/>
+ <combo_item label="Форма аватара" name="Avatar shape"/>
+ <combo_item label="ПриÑоединение аватара" name="Avatar attachment"/>
+ <combo_item label="Подвижный объект (машина, животное)" name="Moving object (vehicle, animal)"/>
+ <combo_item label="Строительный компонент" name="Building Component"/>
+ <combo_item label="БольшаÑ, Ð½ÐµÐ¿Ð¾Ð´Ð²Ð¸Ð¶Ð½Ð°Ñ Ð¸ Ñ‚.д." name="Large, non moving etc"/>
+ <combo_item label="МалаÑ, Ð½ÐµÐ¿Ð¾Ð´Ð²Ð¸Ð¶Ð½Ð°Ñ Ð¸ Ñ‚.д." name="Smaller, non-moving etc"/>
+ <combo_item label="Ðи один из них" name="Not really any of these"/>
+ </combo_box>
+ </panel>
+ <tab_container name="import_tab">
+ <panel label="Уровень детализации" name="lod_panel" title="Уровень детализации">
+ <text initial_value="ИÑточник" name="source" value="ИÑточник"/>
+ <text initial_value="Треугольники" name="triangles" value="Треугольники"/>
+ <text initial_value="Вершины" name="vertices" value="Вершины"/>
+ <text initial_value="Ð’Ñ‹Ñокий" name="high_label" value="Ð’Ñ‹Ñокий"/>
+ <button label="Обзор..." name="lod_browse_high"/>
+ <text initial_value="0" name="high_triangles" value="0"/>
+ <text initial_value="0" name="high_vertices" value="0"/>
+ <text initial_value="Средний" name="medium_label" value="Средний"/>
+ <button label="Обзор..." name="lod_browse_medium"/>
+ <text initial_value="0" name="medium_triangles" value="0"/>
+ <text initial_value="0" name="medium_vertices" value="0"/>
+ <text initial_value="Ðизкий" name="low_label" value="Ðизкий"/>
+ <button label="Обзор..." name="lod_browse_low"/>
+ <text initial_value="0" name="low_triangles" value="0"/>
+ <text initial_value="0" name="low_vertices" value="0"/>
+ <text initial_value="Самый низкий" name="lowest_label" value="Самый низкий"/>
+ <button label="Обзор..." name="lod_browse_lowest"/>
+ <text initial_value="0" name="lowest_triangles" value="0"/>
+ <text initial_value="0" name="lowest_vertices" value="0"/>
+ <check_box label="Генерировать нормали" name="gen_normals"/>
+ <text initial_value="Угол Ñгиба:" name="crease_label" value="Угол Ñгиба:"/>
+ <spinner name="crease_angle" value="75"/>
+ </panel>
+ <panel label="Физика" name="physics_panel">
+ <panel name="physics geometry">
+ <text name="first_step_name">
+ Шаг 1. Уровень детализации
+ </text>
+ <combo_box name="physics_lod_combo" tool_tip="Уровень детализации Ð´Ð»Ñ Ñ„Ð¸Ð·Ð¸Ñ‡ÐµÑкой формы">
+ <combo_item name="choose_one">
+ Выберите вариант...
+ </combo_item>
+ <combo_item name="physics_high">
+ Ð’Ñ‹Ñокое
+ </combo_item>
+ <combo_item name="physics_medium">
+ Средний
+ </combo_item>
+ <combo_item name="physics_low">
+ Ðизкий
+ </combo_item>
+ <combo_item name="physics_lowest">
+ Самый низкий
+ </combo_item>
+ <combo_item name="load_from_file">
+ Из файла
+ </combo_item>
+ </combo_box>
+ <button label="Обзор..." name="physics_browse"/>
+ </panel>
+ <panel name="physics analysis">
+ <text name="method_label">
+ 2 Ñтап. Ðнализ
+ </text>
+ <text name="analysis_method_label">
+ Метод:
+ </text>
+ <text name="quality_label">
+ КачеÑтво:
+ </text>
+ <text name="smooth_method_label">
+ ГладкоÑть:
+ </text>
+ <check_box label="Закрыть отверÑтиÑ" name="Close Holes (Slow)"/>
+ <button label="Ðнализ" name="Decompose"/>
+ <button label="Отмена" name="decompose_cancel"/>
+ </panel>
+ <panel name="physics simplification">
+ <text name="second_step_label">
+ Шаг 3. Упрощение
+ </text>
+ <text name="simp_method_header">
+ Метод:
+ </text>
+ <text name="pass_method_header">
+ Проходов:
+ </text>
+ <text name="Detail Scale label">
+ МаÑштаб деталей:
+ </text>
+ <text name="Retain%_label">
+ СохранÑть:
+ </text>
+ <combo_box name="Combine Quality" value="1"/>
+ <button label="Упрощение" name="Simplify"/>
+ <button label="Отмена" name="simplify_cancel"/>
+ </panel>
+ <panel name="physics info">
+ <text name="results_text">
+ Результаты:
+ </text>
+ <text name="physics_triangles">
+ Треугольников: [TRIANGLES],
+ </text>
+ <text name="physics_points">
+ Вершин: [POINTS],
+ </text>
+ <text name="physics_hulls">
+ Оболочек: [HULLS]
+ </text>
+ </panel>
+ </panel>
+ <panel label="Параметры передачи" name="modifiers_panel">
+ <text name="scale_label">
+ МаÑштаб (1=не маÑштабировать):
+ </text>
+ <spinner name="import_scale" value="1.0"/>
+ <text name="dimensions_label">
+ Размеры:
+ </text>
+ <text name="import_dimensions">
+ [X] X [Y] X [Z]
+ </text>
+ <check_box label="Включить текÑтуры" name="upload_textures"/>
+ <text name="include_label">
+ Только Ð´Ð»Ñ Ð¼Ð¾Ð´ÐµÐ»ÐµÐ¹ аватаров:
+ </text>
+ <check_box label="Включить Ð²ÐµÑ ÐºÐ¾Ð¶Ð¸" name="upload_skin"/>
+ <check_box label="Включить Ð¿Ð¾Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ ÑуÑтавов" name="upload_joints"/>
+ <text name="pelvis_offset_label">
+ Смещение по Z (поднÑть или опуÑтить аватар):
+ </text>
+ <spinner name="pelvis_offset" value="0.0"/>
+ </panel>
+ </tab_container>
+ <panel name="weights_and_warning_panel">
+ <button label="РаÑÑчитать Ð²ÐµÑ Ð¸ плату" name="calculate_btn" tool_tip="РаÑÑчитать Ð²ÐµÑ Ð¸ плату"/>
+ <button label="Отмена" name="cancel_btn"/>
+ <button label="Передать" name="ok_btn" tool_tip="Передать в ÑимулÑтор"/>
+ <button label="ОчиÑтить наÑтройки и ÑброÑить форму" name="reset_btn"/>
+ <text name="upload_fee">
+ Плата за передачу: L$ [FEE]
+ </text>
+ <text name="prim_weight">
+ ВлиÑние земли: [EQ]
+ </text>
+ <text name="download_weight">
+ Загрузка: [ST]
+ </text>
+ <text name="physics_weight">
+ Физика: [PH]
+ </text>
+ <text name="server_weight">
+ Сервер: [SIM]
+ </text>
+ <text name="warning_title">
+ ПРИМЕЧÐÐИЕ.
+ </text>
+ <text name="warning_message">
+ У Ð²Ð°Ñ Ð½ÐµÑ‚ прав на передачу Ñеточных моделей. [[VURL] Узнайте, как] получить их.
+ </text>
+ <text name="status">
+ [STATUS]
+ </text>
+ </panel>
+ </panel>
+ <text name="lod_label">
+ ПроÑмотр:
+ </text>
+ <panel name="right_panel">
+ <combo_box name="preview_lod_combo" tool_tip="Уровень детализации при предварительном проÑмотре">
+ <combo_item name="high">
+ Ð’Ñ‹Ñокий
+ </combo_item>
+ <combo_item name="medium">
+ Среднее
+ </combo_item>
+ <combo_item name="low">
+ Ðизкий
+ </combo_item>
+ <combo_item name="lowest">
+ Самый низкий
+ </combo_item>
+ </combo_box>
+ <text name="label_display">
+ Показать...
+ </text>
+ <check_box label="Ребра" name="show_edges"/>
+ <check_box label="Физика" name="show_physics"/>
+ <check_box label="ТекÑтуры" name="show_textures"/>
+ <check_box label="Ð’ÐµÑ ÐºÐ¾Ð¶Ð¸" name="show_skin_weight"/>
+ <check_box label="СуÑтавы" name="show_joint_positions"/>
+ <text name="physics_explode_label">
+ ПроÑмотр разложениÑ:
+ </text>
+ </panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_model_wizard.xml b/indra/newview/skins/default/xui/ru/floater_model_wizard.xml
new file mode 100644
index 0000000000..5b03dd2c73
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_model_wizard.xml
@@ -0,0 +1,208 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Model Wizard" title="ПЕРЕДÐТЬ МÐСТЕР МОДЕЛИРОВÐÐИЯ">
+ <button label="5. Передать" name="upload_btn"/>
+ <button label="4. ПроÑмотр" name="review_btn"/>
+ <button label="3. Физика" name="physics_btn"/>
+ <button label="2. Оптимизировать" name="optimize_btn"/>
+ <button label="1. Выбрать файл" name="choose_file_btn"/>
+ <panel name="choose_file_panel">
+ <panel name="header_panel">
+ <text name="header_text">
+ Выберите файл модели
+ </text>
+ </panel>
+ <panel name="content">
+ <text name="advanced_users_text">
+ ПользователÑм в раÑширенном режиме: еÑли вы умеете Ñоздавать трехмерные графичеÑкие объекты, то, возможно, захотите воÑпользоватьÑÑ ÑредÑтвом Advanced Uploader, которое предоÑтавлÑет раÑширенные возможноÑти передачи объектов.
+ </text>
+ <button label="Перейти в раÑширенный режим" name="switch_to_advanced"/>
+ <text name="Cache location">
+ Выберите файл модели Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‡Ð¸
+ </text>
+ <button label="Обзор..." label_selected="Обзор..." name="browse"/>
+ <text name="Model types">
+ Ð’ Second Life поддерживаютÑÑ Ñ„Ð°Ð¹Ð»Ñ‹ COLLADA (.dae)
+ </text>
+ <text name="dimensions">
+ X Y Z
+ </text>
+ <text name="warning_label">
+ Ð’ÐИМÐÐИЕ!
+ </text>
+ <text name="warning_text">
+ Ð’Ñ‹ не Ñможете завершить передачу Ñтой модели на Ñерверы Second Life. [secondlife:///app/floater/learn_more Узнайте, как] наÑтроить в вашем аккаунте передачу Ñеточных моделей.
+ </text>
+ </panel>
+ </panel>
+ <panel name="optimize_panel">
+ <panel name="header_panel">
+ <text name="header_text">
+ Оптимизировать модель
+ </text>
+ </panel>
+ <text name="description">
+ Мы оптимизировали модель Ð´Ð»Ñ Ð¿Ð¾Ð²Ñ‹ÑˆÐµÐ½Ð¸Ñ Ð±Ñ‹ÑтродейÑтвиÑ. По желанию можно выполнить дополнительную наÑтройку.
+ </text>
+ <panel name="content">
+ <text name="high_detail_text">
+ Создать уровень детализации: выÑокий
+ </text>
+ <text name="medium_detail_text">
+ Создать уровень детализации: Ñредний
+ </text>
+ <text name="low_detail_text">
+ Создать уровень детализации: низкий
+ </text>
+ <text name="lowest_detail_text">
+ Создать уровень детализации: Ñамый низкий
+ </text>
+ </panel>
+ <panel name="content2">
+ <button label="ПереÑчитать геометрию" name="recalculate_geometry_btn"/>
+ <text name="lod_label">
+ ПроÑмотр геометрии
+ </text>
+ <combo_box name="preview_lod_combo" tool_tip="Ð”ÐµÑ‚Ð°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð¿Ñ€Ð¸ предварительном проÑмотре">
+ <combo_item name="high">
+ Детально
+ </combo_item>
+ <combo_item name="medium">
+ СреднÑÑ Ð´ÐµÑ‚Ð°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñ
+ </combo_item>
+ <combo_item name="low">
+ Мало деталей
+ </combo_item>
+ <combo_item name="lowest">
+ Минимум деталей
+ </combo_item>
+ </combo_box>
+ </panel>
+ </panel>
+ <panel name="physics_panel">
+ <panel name="header_panel">
+ <text name="header_text">
+ ÐаÑтроить физику
+ </text>
+ </panel>
+ <text name="description">
+ Мы Ñоздадим форму Ð´Ð»Ñ Ð²Ð½ÐµÑˆÐ½ÐµÐ³Ð¾ каркаÑа модели. ÐаÑтройте уровень детализации формы в ÑоответÑтвии Ñ Ñ†ÐµÐ»Ñми, Ð´Ð»Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ñ… предназначена модель.
+ </text>
+ <panel name="content">
+ <button label="ПереÑчитать физику" name="recalculate_physics_btn"/>
+ <button label="ПереÑчет..." name="recalculating_physics_btn"/>
+ <text name="lod_label">
+ ПроÑмотр физики
+ </text>
+ <combo_box name="preview_lod_combo2" tool_tip="Уровень детализации при предварительном проÑмотре">
+ <combo_item name="high">
+ Детально
+ </combo_item>
+ <combo_item name="medium">
+ СреднÑÑ Ð´ÐµÑ‚Ð°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñ
+ </combo_item>
+ <combo_item name="low">
+ Мало деталей
+ </combo_item>
+ <combo_item name="lowest">
+ Минимум деталей
+ </combo_item>
+ </combo_box>
+ </panel>
+ </panel>
+ <panel name="review_panel">
+ <panel name="header_panel">
+ <text name="header_text">
+ ПроÑмотр
+ </text>
+ </panel>
+ <panel name="content">
+ <text name="review_prim_equiv">
+ ВоздейÑтвие на учаÑток/регион: Ñквивалент в примитивах: [EQUIV]
+ </text>
+ <text name="review_fee">
+ За передачу Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ Ñчета будет ÑнÑта плата в размере L$[FEE].
+ </text>
+ <text name="review_confirmation">
+ Ðажав кнопку «Передать», вы подтверждаете, что у Ð²Ð°Ñ ÐµÑть надлежащие права на вÑе ÑоÑтавлÑющие модели.
+ </text>
+ </panel>
+ </panel>
+ <panel name="upload_panel">
+ <panel name="header_panel">
+ <text name="header_text">
+ Передача завершена
+ </text>
+ </panel>
+ <text name="model_uploaded_text">
+ Ваша модель передана.
+ </text>
+ <text name="inventory_text">
+ ÐаходитÑÑ Ð² папке «Объекты» вашего инвентарÑ.
+ </text>
+ <text name="charged_fee">
+ С вашего Ñчета ÑнÑто: L$[FEE].
+ </text>
+ </panel>
+ <button label="&lt;&lt; Ðазад" name="back"/>
+ <button label="Далее &gt;&gt;" name="next"/>
+ <button label="РаÑÑчитать Ð²ÐµÑ Ð¸ плату &gt;&gt;" name="calculate"/>
+ <button label="РаÑчет..." name="calculating"/>
+ <button label="Передать" name="upload" tool_tip="Передать в ÑимулÑтор"/>
+ <button label="Отмена" name="cancel"/>
+ <button label="Закрыть" name="close"/>
+ <spinner name="import_scale" value="1.0"/>
+ <string name="status_idle">
+ Ðеактивно
+ </string>
+ <string name="status_parse_error">
+ Проблема при анализе файла DAE – Ñм. подробноÑти в журнале.
+ </string>
+ <string name="status_reading_file">
+ Загрузка...
+ </string>
+ <string name="status_generating_meshes">
+ СоздаютÑÑ Ð¼ÐµÑˆÐ¸...
+ </string>
+ <string name="status_vertex_number_overflow">
+ Ошибка. ЧиÑло вершин превышает 65534. Прервано.
+ </string>
+ <string name="bad_element">
+ Ошибка: недопуÑтимый Ñлемент
+ </string>
+ <string name="high">
+ выÑокий
+ </string>
+ <string name="medium">
+ Ñредний
+ </string>
+ <string name="low">
+ низкий
+ </string>
+ <string name="lowest">
+ Ñамый низкий
+ </string>
+ <string name="mesh_status_good">
+ ДоÑтавлено!
+ </string>
+ <string name="mesh_status_na">
+ Ð/Д
+ </string>
+ <string name="mesh_status_none">
+ Ðет
+ </string>
+ <string name="mesh_status_submesh_mismatch">
+ ОтличаетÑÑ Ñ‡Ð¸Ñло текÑтурируемых граней на уровнÑÑ… детализации.
+ </string>
+ <string name="mesh_status_mesh_mismatch">
+ ОтличаетÑÑ Ñ‡Ð¸Ñло ÑкземплÑров меша на уровнÑÑ… детализации.
+ </string>
+ <string name="mesh_status_too_many_vertices">
+ Слишком много вершин на уровне детализации.
+ </string>
+ <string name="mesh_status_missing_lod">
+ ОтÑутÑтвует необходимый уровень детализации.
+ </string>
+ <string name="layer_all">
+ Ð’Ñе
+ </string>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_moveview.xml b/indra/newview/skins/default/xui/ru/floater_moveview.xml
new file mode 100644
index 0000000000..cb1fda1a1f
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_moveview.xml
@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="move_floater" title="ХОДЬБР/ БЕГ / ПОЛЕТ">
+ <string name="walk_forward_tooltip">
+ Идти вперед (нажмите Ñтрелку вверх или клавишу W)
+ </string>
+ <string name="walk_back_tooltip">
+ Идти назад (нажмите Ñтрелку вниз или клавишу S)
+ </string>
+ <string name="walk_left_tooltip">
+ Идти налево (нажмите Shift + Ñтрелку влево или клавишу A)
+ </string>
+ <string name="walk_right_tooltip">
+ Идти направо (нажмите Shift + Ñтрелку вправо или клавишу D)
+ </string>
+ <string name="run_forward_tooltip">
+ Бежать вперед (нажмите Ñтрелку вверх или клавишу W)
+ </string>
+ <string name="run_back_tooltip">
+ Бежать назад (нажмите Ñтрелку вниз или клавишу S)
+ </string>
+ <string name="run_left_tooltip">
+ Бежать налево (нажмите Shift + Ñтрелку влево или клавишу A)
+ </string>
+ <string name="run_right_tooltip">
+ Бежать направо (нажмите Shift + Ñтрелку вправо или клавишу D)
+ </string>
+ <string name="fly_forward_tooltip">
+ Лететь вперед (нажмите Ñтрелку вверх или клавишу W)
+ </string>
+ <string name="fly_back_tooltip">
+ Лететь назад (нажмите Ñтрелку вниз или клавишу S)
+ </string>
+ <string name="fly_left_tooltip">
+ Лететь налево (нажмите Shift + Ñтрелку влево или клавишу A)
+ </string>
+ <string name="fly_right_tooltip">
+ Лететь направо (нажмите Shift + Ñтрелку вправо или клавишу D)
+ </string>
+ <string name="fly_up_tooltip">
+ Лететь вверх (нажмите клавишу E)
+ </string>
+ <string name="fly_down_tooltip">
+ Лететь вниз (нажмите клавишу C)
+ </string>
+ <string name="jump_tooltip">
+ Прыгнуть (нажмите клавишу E)
+ </string>
+ <string name="crouch_tooltip">
+ ПриÑеÑть (нажмите клавишу C)
+ </string>
+ <string name="walk_title">
+ Ходьба
+ </string>
+ <string name="run_title">
+ Бег
+ </string>
+ <string name="fly_title">
+ Полет
+ </string>
+ <panel name="panel_actions">
+ <button name="turn left btn" tool_tip="Поворот налево (нажмите Ñтрелку влево или клавишу A)"/>
+ <joystick_slide name="move left btn" tool_tip="Идти налево (нажмите Shift + Ñтрелку влево или клавишу A)"/>
+ <button name="turn right btn" tool_tip="Поворот направо (нажмите Ñтрелку вправо или клавишу D)"/>
+ <joystick_slide name="move right btn" tool_tip="Идти направо (нажмите Shift + Ñтрелку вправо или клавишу D)"/>
+ <joystick_turn name="forward btn" tool_tip="Идти вперед (нажмите Ñтрелку вверх или клавишу W)"/>
+ <joystick_turn name="backward btn" tool_tip="Идти назад (нажмите Ñтрелку вниз или клавишу S)"/>
+ <button name="move up btn" tool_tip="Лететь вверх (нажмите клавишу E)"/>
+ <button name="move down btn" tool_tip="Лететь вниз (нажмите клавишу C)"/>
+ </panel>
+ <panel name="panel_modes">
+ <button label="" name="mode_walk_btn" tool_tip="Режим ходьбы"/>
+ <button label="" name="mode_run_btn" tool_tip="Режим бега"/>
+ <button label="" name="mode_fly_btn" tool_tip="Режим полета"/>
+ </panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_mute_object.xml b/indra/newview/skins/default/xui/ru/floater_mute_object.xml
new file mode 100644
index 0000000000..44177acb53
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_mute_object.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="block by name" title="Ð’ ЧЕРÐЫЙ СПИСОК">
+ <text name="message">
+ ВнеÑти в черный ÑпиÑок объект:
+ </text>
+ <line_editor name="object_name">
+ Ðазвание объекта
+ </line_editor>
+ <text name="note">
+ * БлокируютÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¾Ð±ÑŠÐµÐºÑ‚Ð°, но не звуки
+ </text>
+ <button label="ОК" name="OK"/>
+ <button label="Отмена" name="Cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_my_appearance.xml b/indra/newview/skins/default/xui/ru/floater_my_appearance.xml
new file mode 100644
index 0000000000..b90d80f3fd
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_my_appearance.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_my_appearance" title="Ð’ÐЕШÐОСТЬ">
+ <panel label="Изменить внешний вид" name="main_panel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_my_inventory.xml b/indra/newview/skins/default/xui/ru/floater_my_inventory.xml
new file mode 100644
index 0000000000..534d2a5774
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_my_inventory.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_my_inventory" title="ИÐВЕÐТÐРЬ"/>
diff --git a/indra/newview/skins/default/xui/ru/floater_nearby_chat.xml b/indra/newview/skins/default/xui/ru/floater_nearby_chat.xml
new file mode 100644
index 0000000000..184c753e40
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_nearby_chat.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="nearby_chat" title="ЛОКÐЛЬÐЫЙ ЧÐТ">
+ <check_box label="Перевод чата" name="translate_chat_checkbox"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_notification.xml b/indra/newview/skins/default/xui/ru/floater_notification.xml
new file mode 100644
index 0000000000..c3e299202c
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_notification.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="notification" title="КОÐСОЛЬ УВЕДОМЛЕÐИЙ">
+ <text_editor name="payload">
+ Загрузка...
+ </text_editor>
+ <combo_box label="Ответ" name="response"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_notifications_console.xml b/indra/newview/skins/default/xui/ru/floater_notifications_console.xml
new file mode 100644
index 0000000000..bd836590e1
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_notifications_console.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="notifications_console" title="КОÐСОЛЬ УВЕДОМЛЕÐИЙ">
+ <combo_box label="Выбор типа уведомлениÑ" name="notification_types"/>
+ <button label="Добавить" name="add_notification"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_object_weights.xml b/indra/newview/skins/default/xui/ru/floater_object_weights.xml
new file mode 100644
index 0000000000..41e0118732
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_object_weights.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="object_weights" title="ДОПОЛÐИТЕЛЬÐО">
+ <floater.string name="nothing_selected" value="--"/>
+ <text name="selected_text" value="ВЫБРÐÐО"/>
+ <text name="objects" value="--"/>
+ <text name="objects_label" value="Объекты"/>
+ <text name="prims" value="--"/>
+ <text name="prims_label" value="Примитивы"/>
+ <text name="weights_of_selected_text" value="ВЕС ВЫБРÐÐÐОГО"/>
+ <text name="download" value="--"/>
+ <text name="download_label" value="Загрузить"/>
+ <text name="physics" value="--"/>
+ <text name="physics_label" value="Физика"/>
+ <text name="server" value="--"/>
+ <text name="server_label" value="Сервер"/>
+ <text name="display" value="--"/>
+ <text name="display_label" value="Показать"/>
+ <text name="land_impacts_text" value="ВОЗДЕЙСТВИЕ ÐРЗЕМЛЮ"/>
+ <text name="selected" value="--"/>
+ <text name="selected_label" value="Выбрано"/>
+ <text name="rezzed_on_land" value="--"/>
+ <text name="rezzed_on_land_label" value="Выложено на землю"/>
+ <text name="remaining_capacity" value="--"/>
+ <text name="remaining_capacity_label" value="ОÑтаток емкоÑти"/>
+ <text name="total_capacity" value="--"/>
+ <text name="total_capacity_label" value="ÐžÐ±Ñ‰Ð°Ñ ÐµÐ¼ÐºÐ¾Ñть"/>
+ <text name="help_SLURL" value="[secondlife:///app/help/object_weights Что Ñто такое?...]"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_openobject.xml b/indra/newview/skins/default/xui/ru/floater_openobject.xml
new file mode 100644
index 0000000000..5da308eecb
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_openobject.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="objectcontents" title="СОДЕРЖИМОЕ ОБЪЕКТÐ">
+ <text name="object_name">
+ [DESC]:
+ </text>
+ <button label="Копировать в инвентарь" label_selected="Копировать в инвентарь" name="copy_to_inventory_button"/>
+ <button label="Копировать и надеть" label_selected="Копировать и надеть" name="copy_and_wear_button"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_outfit_save_as.xml b/indra/newview/skins/default/xui/ru/floater_outfit_save_as.xml
new file mode 100644
index 0000000000..301206e473
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_outfit_save_as.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="modal container" title="СОХРÐÐИТЬ КОСТЮМ">
+ <button label="Сохранить" label_selected="Сохранить" name="Save"/>
+ <button label="Отмена" label_selected="Отмена" name="Cancel"/>
+ <text name="Save item as:">
+ Сохранить текущую одежду
+как новый коÑтюм
+ </text>
+ <line_editor name="name ed">
+ [DESC] (новый)
+ </line_editor>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_outgoing_call.xml b/indra/newview/skins/default/xui/ru/floater_outgoing_call.xml
new file mode 100644
index 0000000000..5e50a75b85
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_outgoing_call.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="outgoing call" title="ЗВОÐОК">
+ <floater.string name="lifetime">
+ 5
+ </floater.string>
+ <floater.string name="localchat">
+ Ближайший голоÑовой чат
+ </floater.string>
+ <floater.string name="anonymous">
+ анонимный
+ </floater.string>
+ <floater.string name="VoiceInviteP2P">
+ звонит.
+ </floater.string>
+ <floater.string name="VoiceInviteAdHoc">
+ приÑоединилÑÑ Ðº ÑеанÑу голоÑового чата Ñ ÐºÐ¾Ð½Ñ„ÐµÑ€ÐµÐ½Ñ†Ð¸ÐµÐ¹.
+ </floater.string>
+ <text name="connecting">
+ Подключение к [CALLEE_NAME]
+ </text>
+ <text name="calling">
+ Вызов [CALLEE_NAME]
+ </text>
+ <text name="noanswer">
+ Ðет ответа. Повторите попытку позже.
+ </text>
+ <text name="nearby">
+ Вы были отключены от [VOICE_CHANNEL_NAME]. [RECONNECT_NEARBY]
+ </text>
+ <text name="nearby_P2P_by_other">
+ Вызов завершен. [RECONNECT_NEARBY]
+ </text>
+ <text name="nearby_P2P_by_agent">
+ Вы завершили вызов. [RECONNECT_NEARBY]
+ </text>
+ <text name="leaving">
+ Выход из [CURRENT_CHAT].
+ </text>
+ <button label="Отмена" label_selected="Отмена" name="Cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_pay.xml b/indra/newview/skins/default/xui/ru/floater_pay.xml
new file mode 100644
index 0000000000..1471a7e133
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_pay.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Give Money">
+ <string name="payee_group">
+ Заплатить группе
+ </string>
+ <string name="payee_resident">
+ Заплатить жителю
+ </string>
+ <text name="payee_name">
+ Слишком длинное теÑтовое Ð¸Ð¼Ñ Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ¸ обрезаниÑ
+ </text>
+ <button label="L$1" label_selected="L$1" name="fastpay 1"/>
+ <button label="L$5" label_selected="L$5" name="fastpay 5"/>
+ <button label="L$10" label_selected="L$10" name="fastpay 10"/>
+ <button label="L$20" label_selected="L$20" name="fastpay 20"/>
+ <text name="amount text">
+ Или введите количеÑтво:
+ </text>
+ <button label="Заплатить" label_selected="Заплатить" name="pay btn"/>
+ <button label="Отмена" label_selected="Отмена" name="cancel btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_pay_object.xml b/indra/newview/skins/default/xui/ru/floater_pay_object.xml
new file mode 100644
index 0000000000..7d2da44ac1
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_pay_object.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Give Money">
+ <string name="payee_group">
+ Заплатить группе
+ </string>
+ <string name="payee_resident">
+ Заплатить жителю
+ </string>
+ <text name="payee_name">
+ Ericacita Moostopolison
+ </text>
+ <text name="object_name_label">
+ Через объект:
+ </text>
+ <icon name="icon_object" tool_tip="Объекты"/>
+ <text name="object_name_text">
+ Мой офигенный объект Ñ Ð½ÐµÑпичеÑки длинным названием
+ </text>
+ <button label="L$1" label_selected="L$1" name="fastpay 1"/>
+ <button label="L$5" label_selected="L$5" name="fastpay 5"/>
+ <button label="L$10" label_selected="L$10" name="fastpay 10"/>
+ <button label="L$20" label_selected="L$20" name="fastpay 20"/>
+ <text name="amount text">
+ Или введите количеÑтво:
+ </text>
+ <button label="Заплатить" label_selected="Заплатить" name="pay btn"/>
+ <button label="Отмена" label_selected="Отмена" name="cancel btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_people.xml b/indra/newview/skins/default/xui/ru/floater_people.xml
new file mode 100644
index 0000000000..7abc34986a
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_people.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_people" title="ЛЮДИ">
+ <panel_container name="main_panel">
+ <panel label="Профиль группы" name="panel_group_info_sidetray"/>
+ <panel label="Черный ÑпиÑок жителей и объектов" name="panel_block_list_sidetray"/>
+ </panel_container>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_perm_prefs.xml b/indra/newview/skins/default/xui/ru/floater_perm_prefs.xml
new file mode 100644
index 0000000000..a704b87bd1
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_perm_prefs.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="perm prefs" title="СТÐÐДÐРТÐЫЕ РÐЗРЕШЕÐИЯ ÐРПЕРЕДÐЧУ">
+ <panel label="РазрешениÑ" name="permissions">
+ <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 initial_value="иÑтина" label="перепродавать/отдавать" name="next_owner_transfer"/>
+ </panel>
+ <button label="ОК" label_selected="ОК" name="ok"/>
+ <button label="Отмена" label_selected="Отмена" name="cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_picks.xml b/indra/newview/skins/default/xui/ru/floater_picks.xml
new file mode 100644
index 0000000000..e0ae8d6f03
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_picks.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_picks" title="Подборка"/>
diff --git a/indra/newview/skins/default/xui/ru/floater_places.xml b/indra/newview/skins/default/xui/ru/floater_places.xml
new file mode 100644
index 0000000000..2a22a855ef
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_places.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_places" title="МЕСТÐ">
+ <panel label="МеÑта" name="main_panel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_post_process.xml b/indra/newview/skins/default/xui/ru/floater_post_process.xml
new file mode 100644
index 0000000000..ae97670548
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_post_process.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Post-Process Floater" title="ÐÐСТРОЙКИ ПОСЛЕДУЮЩЕЙ ОБРÐБОТКИ">
+ <tab_container name="Post-Process Tabs">
+ <panel label="Цветовой фильтр" name="wmiColorFilterPanel">
+ <check_box label="Вкл." name="wmiColorFilterToggle"/>
+ <text name="wmiColorFilterBrightnessText">
+ ЯркоÑть
+ </text>
+ <text name="wmiColorFilterSaturationText">
+ ÐаÑыщенноÑть
+ </text>
+ <text name="wmiColorFilterContrastText">
+ КонтраÑтноÑть
+ </text>
+ <text name="wmiColorFilterBaseText">
+ ОÑновной цвет контраÑтноÑти
+ </text>
+ <slider label="К" name="wmiColorFilterBaseR"/>
+ <slider label="З" name="wmiColorFilterBaseG"/>
+ <slider label="С" name="wmiColorFilterBaseB"/>
+ <slider label="И" name="wmiColorFilterBaseI"/>
+ </panel>
+ <panel label="Ðочное видение" name="wmiNightVisionPanel">
+ <check_box label="Вкл." name="wmiNightVisionToggle"/>
+ <text name="wmiNightVisionBrightMultText">
+ КоÑффициент уÑÐ¸Ð»ÐµÐ½Ð¸Ñ Ñвета
+ </text>
+ <text name="wmiNightVisionNoiseSizeText">
+ Размер иÑкажений
+ </text>
+ <text name="wmiNightVisionNoiseStrengthText">
+ МощноÑть иÑкажений
+ </text>
+ </panel>
+ <panel label="Ореол" name="wmiBloomPanel">
+ <check_box label="Вкл." name="wmiBloomToggle"/>
+ <text name="wmiBloomExtractText">
+ ЯркоÑть Ñвета
+ </text>
+ <text name="wmiBloomSizeText">
+ Размер ореола
+ </text>
+ <text name="wmiBloomStrengthText">
+ МощноÑть ореола
+ </text>
+ </panel>
+ <panel label="Дополнительно" name="Extras">
+ <button label="Загрузить Ñффект" label_selected="Загрузить Ñффект" name="PPLoadEffect"/>
+ <button label="Сохранить Ñффект" label_selected="Сохранить Ñффект" name="PPSaveEffect"/>
+ <line_editor label="Ðазвание Ñффекта" name="PPEffectNameEditor"/>
+ </panel>
+ </tab_container>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_postcard.xml b/indra/newview/skins/default/xui/ru/floater_postcard.xml
new file mode 100644
index 0000000000..889d219511
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_postcard.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Postcard" title="ПОСЛÐТЬ СÐИМОК ПО EMAIL">
+ <floater.string name="default_subject">
+ Открытка из [SECOND_LIFE].
+ </floater.string>
+ <floater.string name="default_message">
+ Побывай здеÑÑŒ!
+ </floater.string>
+ <floater.string name="upload_message">
+ Отправка...
+ </floater.string>
+ <text name="to_label">
+ Email получателÑ:
+ </text>
+ <text name="from_label">
+ Ваш Email:
+ </text>
+ <text name="name_label">
+ Ваше имÑ:
+ </text>
+ <text name="subject_label">
+ Тема:
+ </text>
+ <line_editor label="Введите тему пиÑьма." name="subject_form"/>
+ <text name="msg_label">
+ Сообщение:
+ </text>
+ <text_editor name="msg_form">
+ Введите текÑÑ‚ пиÑьма.
+ </text_editor>
+ <button label="Отмена" name="cancel_btn"/>
+ <button label="Отправить" name="send_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_preferences.xml b/indra/newview/skins/default/xui/ru/floater_preferences.xml
new file mode 100644
index 0000000000..fc244b9d8b
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_preferences.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Preferences" title="ÐÐСТРОЙКИ">
+ <button label="ОК" label_selected="ОК" name="OK"/>
+ <button label="Отмена" label_selected="Отмена" name="Cancel"/>
+ <tab_container name="pref core">
+ <panel label="Общие" name="general"/>
+ <panel label="Графика" name="display"/>
+ <panel label="Звук и медиа" name="audio"/>
+ <panel label="Чат" name="chat"/>
+ <panel label="Движение и обзор" name="move"/>
+ <panel label="УведомлениÑ" name="msgs"/>
+ <panel label="Цвета" name="colors"/>
+ <panel label="ПриватноÑть" name="im"/>
+ <panel label="КонфигурациÑ" name="input"/>
+ <panel label="Дополнительно" name="advanced1"/>
+ </tab_container>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_preferences_proxy.xml b/indra/newview/skins/default/xui/ru/floater_preferences_proxy.xml
new file mode 100644
index 0000000000..4eecfedf17
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_preferences_proxy.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Proxy Settings Floater" title="ÐаÑтройки прокÑи-Ñервера">
+ <check_box initial_value="ложь" label="ИÑпользовать HTTP-прокÑи Ð´Ð»Ñ Ð²ÐµÐ±-Ñтраниц" name="web_proxy_enabled"/>
+ <text name="http_proxy_label">
+ HTTP-прокÑи:
+ </text>
+ <line_editor name="web_proxy_editor" tool_tip="Ð˜Ð¼Ñ DNS или IP-Ð°Ð´Ñ€ÐµÑ HTTP-прокÑи, который Ñледует иÑпользовать."/>
+ <spinner label="Ðомер порта:" name="web_proxy_port" tool_tip="Порт HTTP-прокÑи, который Ñледует иÑпользовать."/>
+ <check_box label="ИÑпользовать Ð´Ð»Ñ Ñ‚Ñ€Ð°Ñ„Ð¸ÐºÐ° UDP прокÑи-Ñервер SOCKS 5" name="socks_proxy_enabled"/>
+ <text name="socks5_proxy_label">
+ Сервер SOCKS 5:
+ </text>
+ <line_editor name="socks_proxy_editor" tool_tip="Ð˜Ð¼Ñ DNS или IP-Ð°Ð´Ñ€ÐµÑ Ð¿Ñ€Ð¾ÐºÑи-Ñервера SOCKS 5, который Ñледует иÑпользовать."/>
+ <spinner label="Ðомер порта:" name="socks_proxy_port" tool_tip="Порт прокÑи-Ñервера SOCKS 5, который Ñледует иÑпользовать."/>
+ <text name="socks_auth_label">
+ ÐÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ SOCKS:
+ </text>
+ <radio_group name="socks5_auth_type">
+ <radio_item label="Без аутентификации" name="Socks5NoAuth" tool_tip="ÐÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ Ð½Ð° прокÑи-Ñервере SOCKS 5 не требуетÑÑ." value="Ðет"/>
+ <radio_item label="Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ/пароль" name="Socks5UserPass" tool_tip="Ðа прокÑи-Ñервере SOCKS 5 требуетÑÑ Ð°ÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ (Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¸ пароль)." value="UserPass"/>
+ </radio_group>
+ <text name="socks5_username_label">
+ Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ:
+ </text>
+ <text name="socks5_password_label">
+ Пароль:
+ </text>
+ <line_editor name="socks5_username" tool_tip="Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð´Ð»Ñ Ð°ÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ð¸ на Ñервере SOCKS 5"/>
+ <line_editor name="socks5_password" tool_tip="Пароль Ð´Ð»Ñ Ð°ÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ð¸ на Ñервере SOCKS 5"/>
+ <text name="other_proxy_label">
+ Другой прокÑи-Ñервер HTTP-трафика:
+ </text>
+ <radio_group name="other_http_proxy_type">
+ <radio_item label="Ðе иÑпользовать прокÑи" name="OtherNoProxy" tool_tip="HTTP-трафик, не ÑвÑзанный Ñ Ð²ÐµÐ±-Ñайтами, ÐЕ будет передаватьÑÑ Ð½Ð° прокÑи-Ñервер." value="Ðет"/>
+ <radio_item label="ИÑпользовать HTTP-прокÑи" name="OtherHTTPProxy" tool_tip="HTTP-трафик, не ÑвÑзанный Ñ Ð²ÐµÐ±-узлами, будет передаватьÑÑ Ñ‡ÐµÑ€ÐµÐ· наÑтроенный веб-прокÑи." value="Веб"/>
+ <radio_item label="ИÑпользовать Ñервер SOCKS 5" name="OtherSocksProxy" tool_tip="HTTP-трафик, не ÑвÑзанный Ñ Ð²ÐµÐ±-узлами, будет передаватьÑÑ Ñ‡ÐµÑ€ÐµÐ· наÑтроенный Ñервер Socks 5." value="SOCKS"/>
+ </radio_group>
+ <button label="ОК" label_selected="ОК" name="OK"/>
+ <button label="Отмена" label_selected="Отмена" name="Cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_preview_animation.xml b/indra/newview/skins/default/xui/ru/floater_preview_animation.xml
new file mode 100644
index 0000000000..a1fabedb85
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_preview_animation.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="preview_anim">
+ <floater.string name="Title">
+ ÐнимациÑ: [NAME]
+ </floater.string>
+ <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="Проигрывание Ñтой анимации можете видеть только вы"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_preview_gesture.xml b/indra/newview/skins/default/xui/ru/floater_preview_gesture.xml
new file mode 100644
index 0000000000..fde2cea00e
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_preview_gesture.xml
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="gesture_preview">
+ <floater.string name="step_anim">
+ ВоÑпроизвеÑти анимацию:
+ </floater.string>
+ <floater.string name="step_sound">
+ ВоÑпроизвеÑти звук:
+ </floater.string>
+ <floater.string name="step_chat">
+ Сказать в чат:
+ </floater.string>
+ <floater.string name="step_wait">
+ Ждать:
+ </floater.string>
+ <floater.string name="stop_txt">
+ Стоп
+ </floater.string>
+ <floater.string name="preview_txt">
+ Предварительный проÑмотр
+ </floater.string>
+ <floater.string name="none_text">
+ - Ðичего -
+ </floater.string>
+ <floater.string name="Title">
+ ЖеÑÑ‚: [NAME]
+ </floater.string>
+ <text name="desc_label">
+ ОпиÑание:
+ </text>
+ <text name="trigger_label">
+ Сигнал:
+ </text>
+ <text name="replace_text" tool_tip="Заменить Ñигнальное Ñлово Ñтими Ñловами. Ðапример, еÑли Ñигнал – «здравÑтвуйте», а заменитель – «привет», то при вводе в чат фразы «Я хотел Ñказать здравÑтвуйте» поÑвитÑÑ Â«Ð¯ хотел Ñказать привет» вмеÑте Ñ Ð¶ÐµÑтом.">
+ Заменитель:
+ </text>
+ <line_editor name="replace_editor" tool_tip="Заменить Ñигнальное Ñлово Ñтими Ñловами. Ðапример, еÑли Ñигнал – «здравÑтвуйте», а заменитель – «привет», то при вводе в чат фразы «Я хотел Ñказать здравÑтвуйте» поÑвитÑÑ Â«Ð¯ хотел Ñказать привет» вмеÑте Ñ Ð¶ÐµÑтом."/>
+ <text name="key_label">
+ ГорÑÑ‡Ð°Ñ ÐºÐ»Ð°Ð²Ð¸ÑˆÐ°:
+ </text>
+ <combo_box label="Ðет" name="modifier_combo"/>
+ <combo_box label="Ðет" name="key_combo"/>
+ <text name="library_label">
+ Библиотека:
+ </text>
+ <scroll_list name="library_list">
+ <scroll_list.rows name="action_animation" value="ÐнимациÑ"/>
+ <scroll_list.rows name="action_sound" value="Звук"/>
+ <scroll_list.rows name="action_chat" value="Чат"/>
+ <scroll_list.rows name="action_wait" value="Ожидание"/>
+ </scroll_list>
+ <button label="Добавить &gt;&gt;" name="add_btn"/>
+ <text name="steps_label">
+ Шаги:
+ </text>
+ <button label="Вверх" name="up_btn"/>
+ <button label="Вниз" name="down_btn"/>
+ <button label="Удалить" name="delete_btn"/>
+ <text name="options_text">
+ (параметры)
+ </text>
+ <radio_group name="animation_trigger_type">
+ <radio_item label="Старт" name="start"/>
+ <radio_item label="Стоп" name="stop"/>
+ </radio_group>
+ <check_box label="до Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ Ð°Ð½Ð¸Ð¼Ð°Ñ†Ð¸Ð¸" name="wait_anim_check"/>
+ <check_box label="Ð²Ñ€ÐµÐ¼Ñ Ð² Ñекундах:" name="wait_time_check"/>
+ <text name="help_label">
+ Ð’Ñе шаги выполнÑÑŽÑ‚ÑÑ Ð¾Ð´Ð½Ð¾Ð²Ñ€ÐµÐ¼ÐµÐ½Ð½Ð¾, еÑли только вы не добавите шаги ожиданиÑ.
+ </text>
+ <check_box label="Ðктивный" name="active_check" tool_tip="Ðктивные жеÑты можно включить путем ввода их триггеров в чат или нажатием горÑчих клавиш. ЖеÑты обычно ÑтановÑÑ‚ÑÑ Ð½ÐµÐ°ÐºÑ‚Ð¸Ð²Ð½Ñ‹Ð¼Ð¸, еÑли возникает конфликт клавиш."/>
+ <button label="Предварительный проÑмотр" name="preview_btn"/>
+ <button label="Сохранить" name="save_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_preview_notecard.xml b/indra/newview/skins/default/xui/ru/floater_preview_notecard.xml
new file mode 100644
index 0000000000..2f39d4a4a4
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_preview_notecard.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="preview notecard" title="ЗÐМЕТКÐ:">
+ <floater.string name="no_object">
+ Ðевозможно найти объект, Ñодержащий Ñту заметку.
+ </floater.string>
+ <floater.string name="not_allowed">
+ У Ð²Ð°Ñ Ð½ÐµÑ‚ прав Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñмотра заметки.
+ </floater.string>
+ <floater.string name="Title">
+ Заметка: [NAME]
+ </floater.string>
+ <text name="desc txt">
+ ОпиÑание:
+ </text>
+ <text_editor name="Notecard Editor">
+ Загрузка...
+ </text_editor>
+ <button label="Сохранить" label_selected="Сохранить" name="Save"/>
+ <button label="Удалить" label_selected="Удалить" name="Delete"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_preview_sound.xml b/indra/newview/skins/default/xui/ru/floater_preview_sound.xml
new file mode 100644
index 0000000000..691b2f3e82
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_preview_sound.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="preview_sound">
+ <floater.string name="Title">
+ Звук: [NAME]
+ </floater.string>
+ <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="ВоÑпроизведение Ñтого звука могу Ñлышать только Ñ"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_preview_texture.xml b/indra/newview/skins/default/xui/ru/floater_preview_texture.xml
new file mode 100644
index 0000000000..c9cb87282a
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_preview_texture.xml
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="preview_texture">
+ <floater.string name="Title">
+ ТекÑтура: [NAME]
+ </floater.string>
+ <floater.string name="Copy">
+ Копировать в инвентарь
+ </floater.string>
+ <text name="desc txt">
+ ОпиÑание:
+ </text>
+ <text name="dimensions">
+ [WIDTH]x[HEIGHT] пикÑелей
+ </text>
+ <text name="aspect_ratio">
+ Соотношение Ñторон
+ </text>
+ <combo_box name="combo_aspect_ratio" tool_tip="ПроÑмотр Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ñ Ð´Ñ€ÑƒÐ³Ð¸Ð¼ Ñоотношением Ñторон">
+ <combo_item name="Unconstrained">
+ Без ограничениÑ
+ </combo_item>
+ <combo_item name="1:1" tool_tip="Символ группы или профиль в реальном мире">
+ 1:1
+ </combo_item>
+ <combo_item name="4:3" tool_tip="Профиль Ð´Ð»Ñ [SECOND_LIFE]">
+ 4:3
+ </combo_item>
+ <combo_item name="10:7" tool_tip="Реклама, поиÑк и закладки">
+ 10:7
+ </combo_item>
+ <combo_item name="3:2" tool_tip="О земле">
+ 3:2
+ </combo_item>
+ <combo_item name="16:10">
+ 16:10
+ </combo_item>
+ <combo_item name="16:9" tool_tip="Профиль подборки">
+ 16:9
+ </combo_item>
+ <combo_item name="2:1">
+ 2:1
+ </combo_item>
+ </combo_box>
+ <button label="OK" name="Keep"/>
+ <button label="Удалить" name="Discard"/>
+ <button label="Сохранить как" name="save_tex_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_price_for_listing.xml b/indra/newview/skins/default/xui/ru/floater_price_for_listing.xml
new file mode 100644
index 0000000000..fd513c8cdb
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_price_for_listing.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="price_for_listing" title="ОПУБЛИКОВÐТЬ РЕКЛÐМУ">
+ <text name="explanation_text">
+ Ваша реклама будет дейÑтвительна в течение недели Ñ Ð¼Ð¾Ð¼ÐµÐ½Ñ‚Ð° публикации.
+
+ÐŸÐ¾Ð·Ð¸Ñ†Ð¸Ñ Ð¾Ð±ÑŠÑÐ²Ð»ÐµÐ½Ð¸Ñ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÑетÑÑ ÑƒÐ¿Ð»Ð°Ñ‡ÐµÐ½Ð½Ð¾Ð¹ за него Ñуммой.
+
+Чем выше плата за объÑвление, тем выше оно раÑположено в ÑпиÑке и тем легче его найти.
+ </text>
+ <text name="price_text">
+ Цена за объÑвление:
+ </text>
+ <text name="price_symbol">
+ L$
+ </text>
+ <button label="ОК" name="set_price_btn"/>
+ <button label="Отмена" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_publish_classified.xml b/indra/newview/skins/default/xui/ru/floater_publish_classified.xml
new file mode 100644
index 0000000000..b9e33d6e22
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_publish_classified.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="publish_classified" title="ÐŸÑƒÐ±Ð»Ð¸ÐºÐ°Ñ†Ð¸Ñ Ñ€ÐµÐºÐ»Ð°Ð¼Ñ‹">
+ <text name="explanation_text">
+ Ваша реклама будет дейÑтвительна в течение недели Ñ Ð¼Ð¾Ð¼ÐµÐ½Ñ‚Ð° публикации.
+
+Помните, оплата за рекламу не возвращаетÑÑ.
+ </text>
+ <spinner label="Цена: L$" name="price_for_listing" tool_tip="Цена за размещение." value="50"/>
+ <button label="Опубликовать" name="publish_btn"/>
+ <button label="Отмена" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_region_debug_console.xml b/indra/newview/skins/default/xui/ru/floater_region_debug_console.xml
new file mode 100644
index 0000000000..d413a0bdcc
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_region_debug_console.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="region_debug_console" title="Отладка региона"/>
diff --git a/indra/newview/skins/default/xui/ru/floater_region_info.xml b/indra/newview/skins/default/xui/ru/floater_region_info.xml
new file mode 100644
index 0000000000..011b58e385
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_region_info.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="regioninfo" title="РЕГИОÐ/ЗЕМЛЕВЛÐДЕÐИЕ"/>
diff --git a/indra/newview/skins/default/xui/ru/floater_report_abuse.xml b/indra/newview/skins/default/xui/ru/floater_report_abuse.xml
new file mode 100644
index 0000000000..6fdbdacadc
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_report_abuse.xml
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_report_abuse" title="ПОЖÐЛОВÐТЬСЯ">
+ <floater.string name="Screenshot">
+ Снимок
+ </floater.string>
+ <check_box label="ИÑпользовать Ñтот Ñнимок" name="screen_check"/>
+ <text name="reporter_title">
+ Ðвтор:
+ </text>
+ <text name="sim_title">
+ Регион:
+ </text>
+ <text name="sim_field">
+ Ðазвание региона
+ </text>
+ <text name="pos_title">
+ Координаты:
+ </text>
+ <text name="pos_field">
+ {128.1, 128.1, 15.4}
+ </text>
+ <text name="select_object_label">
+ Ðажмите кнопку, затем объект-нарушитель:
+ </text>
+ <button name="pick_btn" tool_tip="Захват объекта – определÑет объект как Ñубъект Ñтого ÑообщениÑ"/>
+ <text name="object_name_label">
+ Объект:
+ </text>
+ <text name="owner_name_label">
+ Владелец:
+ </text>
+ <combo_box name="category_combo" tool_tip="ÐšÐ°Ñ‚ÐµÐ³Ð¾Ñ€Ð¸Ñ â€“ выберите категорию, наиболее подходÑщую по типу нарушениÑ">
+ <combo_box.item label="Выберите категорию" name="Select_category"/>
+ <combo_box.item label="ВозраÑÑ‚ &gt; Игровой возраÑÑ‚" name="Age__Age_play"/>
+ <combo_box.item label="ВозраÑÑ‚ &gt; ВзроÑлый житель в Second Life Ð´Ð»Ñ Ð¿Ð¾Ð´Ñ€Ð¾Ñтков" name="Age__Adult_resident_on_Teen_Second_Life"/>
+ <combo_box.item label="ВозраÑÑ‚ &gt; Малолетний житель в Second Life Ð´Ð»Ñ Ð¿Ð¾Ð´Ñ€Ð¾Ñтков" name="Age__Underage_resident_outside_of_Teen_Second_Life"/>
+ <combo_box.item label="Ðападение &gt; Ð‘Ð¾ÐµÐ²Ð°Ñ Â«Ð¿ÐµÑочница»/небезопаÑÐ½Ð°Ñ Ð¾Ð±Ð»Ð°Ñть" name="Assault__Combat_sandbox___unsafe_area"/>
+ <combo_box.item label="Ðападение &gt; БезопаÑÐ½Ð°Ñ Ð¾Ð±Ð»Ð°Ñть" name="Assault__Safe_area"/>
+ <combo_box.item label="Ðападение &gt; «ПеÑочница» иÑÐ¿Ñ‹Ñ‚Ð°Ð½Ð¸Ñ Ð¾Ñ€ÑƒÐ¶Ð¸Ñ" name="Assault__Weapons_testing_sandbox"/>
+ <combo_box.item label="ÐšÐ¾Ð¼Ð¼ÐµÑ€Ñ†Ð¸Ñ &gt; Ðе удалоÑÑŒ доÑтавить продукт или уÑлугу" name="Commerce__Failure_to_deliver_product_or_service"/>
+ <combo_box.item label="РаÑкрытие &gt; Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ реальном мире" name="Disclosure__Real_world_information"/>
+ <combo_box.item label="РаÑкрытие &gt; Удаленный контроль чата" name="Disclosure__Remotely_monitoring chat"/>
+ <combo_box.item label="РаÑкрытие &gt; ИнформациÑ/чат/мгновенные ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Second Life" name="Disclosure__Second_Life_information_chat_IMs"/>
+ <combo_box.item label="Ðарушение порÑдка &gt; ÐедоброÑовеÑтное иÑпользование реÑурÑов региона" name="Disturbing_the_peace__Unfair_use_of_region_resources"/>
+ <combo_box.item label="Ðарушение порÑдка &gt; Избыточно Ñкриптовые объекты" name="Disturbing_the_peace__Excessive_scripted_objects"/>
+ <combo_box.item label="Ðарушение порÑдка &gt; РазбраÑывание объектов" name="Disturbing_the_peace__Object_littering"/>
+ <combo_box.item label="Ðарушение порÑдка &gt; ПоÑтоÑнный Ñпам" name="Disturbing_the_peace__Repetitive_spam"/>
+ <combo_box.item label="Ðарушение порÑдка &gt; ÐÐµÐ¶ÐµÐ»Ð°Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ñ€ÐµÐºÐ»Ð°Ð¼Ð°" name="Disturbing_the_peace__Unwanted_advert_spam"/>
+ <combo_box.item label="МошенничеÑтво &gt; L$" name="Fraud__L$"/>
+ <combo_box.item label="МошенничеÑтво &gt; ЗемлÑ" name="Fraud__Land"/>
+ <combo_box.item label="МошенничеÑтво &gt; «Пирамида» или «пиÑьмо ÑчаÑтьÑ»" name="Fraud__Pyramid_scheme_or_chain_letter"/>
+ <combo_box.item label="МошенничеÑтво &gt; US$" name="Fraud__US$"/>
+ <combo_box.item label="БеÑпокойÑтво &gt; Ð ÐµÐºÐ»Ð°Ð¼Ð½Ð°Ñ Ñ„ÐµÑ€Ð¼Ð°/видимый Ñпам" name="Harassment__Advert_farms___visual_spam"/>
+ <combo_box.item label="БеÑпокойÑтво &gt; Клевета на отдельных лиц или группы" name="Harassment__Defaming_individuals_or_groups"/>
+ <combo_box.item label="БеÑпокойÑтво &gt; ПрепÑÑ‚Ñтвие движению" name="Harassment__Impeding_movement"/>
+ <combo_box.item label="БеÑпокойÑтво &gt; СекÑуальное домогательÑтво" name="Harassment__Sexual_harassment"/>
+ <combo_box.item label="БеÑпокойÑтво &gt; ПодÑтрекательÑтво
/призыв к нарушению лицензионного ÑоглашениÑ" name="Harassment__Solicting_inciting_others_to_violate_ToS"/>
+ <combo_box.item label="БеÑпокойÑтво &gt; ОÑкорбление Ñловом" name="Harassment__Verbal_abuse"/>
+ <combo_box.item label="ÐеприÑтойноÑть &gt; Откровенно оÑкорбительное Ñодержимое или поведение" name="Indecency__Broadly_offensive_content_or_conduct"/>
+ <combo_box.item label="ÐеприÑтойноÑть &gt; Ðекорректное Ð¸Ð¼Ñ Ð°Ð²Ð°Ñ‚Ð°Ñ€Ð°" name="Indecency__Inappropriate_avatar_name"/>
+ <combo_box.item label="ÐеприÑтойноÑть &gt; Ðекорректное Ñодержимое или поведение в регионе PG" name="Indecency__Mature_content_in_PG_region"/>
+ <combo_box.item label="ÐеприÑтойноÑть &gt; Ðекорректное Ñодержимое или поведение в регионе Moderate" name="Indecency__Inappropriate_content_in_Mature_region"/>
+ <combo_box.item label="Ðарушение прав интеллектуальной ÑобÑтвенноÑти &gt; Удаление Ñодержимого" name="Intellectual_property_infringement_Content_Removal"/>
+ <combo_box.item label="Ðарушение прав интеллектуальной ÑобÑтвенноÑти &gt; CopyBot или нарушение разрешений" name="Intellectual_property_infringement_CopyBot_or_Permissions_Exploit"/>
+ <combo_box.item label="ÐетерпимоÑть" name="Intolerance"/>
+ <combo_box.item label="Ð—ÐµÐ¼Ð»Ñ &gt; Злоупотребление реÑурÑами «пеÑочницы»" name="Land__Abuse_of_sandbox_resources"/>
+ <combo_box.item label="Ð—ÐµÐ¼Ð»Ñ &gt; ПоÑÑгательÑтво &gt; Объекты/текÑтуры" name="Land__Encroachment__Objects_textures"/>
+ <combo_box.item label="Ð—ÐµÐ¼Ð»Ñ &gt; ПоÑÑгательÑтво &gt; ЧаÑтицы" name="Land__Encroachment__Particles"/>
+ <combo_box.item label="Ð—ÐµÐ¼Ð»Ñ &gt; ПоÑÑгательÑтво &gt; ДеревьÑ/раÑтениÑ" name="Land__Encroachment__Trees_plants"/>
+ <combo_box.item label="Пари/азартные игры" name="Wagering_gambling"/>
+ <combo_box.item label="Другое" name="Other"/>
+ </combo_box>
+ <text name="abuser_name_title">
+ Ð˜Ð¼Ñ Ð½Ð°Ñ€ÑƒÑˆÐ¸Ñ‚ÐµÐ»Ñ:
+ </text>
+ <button label="Выбор" name="select_abuser" tool_tip="Выбор имени Ð½Ð°Ñ€ÑƒÑˆÐ¸Ñ‚ÐµÐ»Ñ Ð¸Ð· ÑпиÑка"/>
+ <text name="abuser_name_title2">
+ МеÑто нарушениÑ:
+ </text>
+ <text name="sum_title">
+ Краткое опиÑание:
+ </text>
+ <text name="dscr_title">
+ ПодробноÑти:
+ </text>
+ <text name="bug_aviso">
+ Опишите проблему макÑимально подробно
+ </text>
+ <text name="incomplete_title">
+ * Ðеполные заÑÐ²Ð»ÐµÐ½Ð¸Ñ Ð½Ðµ будут раÑÑматриватьÑÑ
+ </text>
+ <button label="Жалоба" label_selected="Жалоба" name="send_btn"/>
+ <button label="Отмена" label_selected="Отмена" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_script_debug.xml b/indra/newview/skins/default/xui/ru/floater_script_debug.xml
new file mode 100644
index 0000000000..b91fc4e4ff
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_script_debug.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<multi_floater name="script debug floater" title="ПредупреждениÑ/ошибки Ñкриптов"/>
diff --git a/indra/newview/skins/default/xui/ru/floater_script_debug_panel.xml b/indra/newview/skins/default/xui/ru/floater_script_debug_panel.xml
new file mode 100644
index 0000000000..e70a30fa24
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_script_debug_panel.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="script" short_title="[ALL SCRIPTS]" title="[ALL SCRIPTS]"/>
diff --git a/indra/newview/skins/default/xui/ru/floater_script_limits.xml b/indra/newview/skins/default/xui/ru/floater_script_limits.xml
new file mode 100644
index 0000000000..7805eac03b
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_script_limits.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="scriptlimits" title="ИÐФОРМÐЦИЯ О СКРИПТÐÐ¥"/>
diff --git a/indra/newview/skins/default/xui/ru/floater_script_preview.xml b/indra/newview/skins/default/xui/ru/floater_script_preview.xml
new file mode 100644
index 0000000000..78cefb7aa7
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_script_preview.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="preview lsl text" title="СКРИПТ: ROTATION SCRIPT">
+ <floater.string name="Title">
+ СКРИПТ: [NAME]
+ </floater.string>
+ <text name="desc txt">
+ ОпиÑание:
+ </text>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_script_queue.xml b/indra/newview/skins/default/xui/ru/floater_script_queue.xml
new file mode 100644
index 0000000000..4f2e389b19
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_script_queue.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="queue" title="СБРОСИТЬ ПРОГРЕСС">
+ <floater.string name="Starting">
+ ЗапуÑк [START] объектов (объектов: [COUNT]).
+ </floater.string>
+ <floater.string name="Done">
+ Готово.
+ </floater.string>
+ <floater.string name="Resetting">
+ СброÑ
+ </floater.string>
+ <floater.string name="Running">
+ Запущен
+ </floater.string>
+ <floater.string name="NotRunning">
+ Ðе запущен
+ </floater.string>
+ <button label="Закрыть" label_selected="Закрыть" name="close"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_script_search.xml b/indra/newview/skins/default/xui/ru/floater_script_search.xml
new file mode 100644
index 0000000000..fc040f6593
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_script_search.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="script search" title="ПОИСК В СКРИПТЕ">
+ <check_box label="Без учета региÑтра" name="case_text"/>
+ <button label="ПоиÑк" label_selected="ПоиÑк" name="search_btn"/>
+ <button label="Заменить" label_selected="Заменить" name="replace_btn"/>
+ <button label="Заменить вÑе" label_selected="Заменить вÑе" name="replace_all_btn"/>
+ <text name="txt">
+ ПоиÑк
+ </text>
+ <text name="txt2">
+ Заменить
+ </text>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_search.xml b/indra/newview/skins/default/xui/ru/floater_search.xml
new file mode 100644
index 0000000000..405a6598ac
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_search.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_search" title="">
+ <floater.string name="loading_text">
+ Загрузка...
+ </floater.string>
+ <floater.string name="done_text">
+ Готово
+ </floater.string>
+ <layout_stack name="stack1">
+ <layout_panel name="browser_layout">
+ <text name="refresh_search">
+ Повторить поиÑк, чтобы показать текущий уровень творца
+ </text>
+ </layout_panel>
+ </layout_stack>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_select_key.xml b/indra/newview/skins/default/xui/ru/floater_select_key.xml
new file mode 100644
index 0000000000..99c2b9a2c4
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_select_key.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="modal container">
+ <text name="Save item as:">
+ Ðажмите клавишу Ð´Ð»Ñ Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ/Ð²Ñ‹ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ñ€ÐµÑ‡Ð¸.
+ </text>
+ <button label="Отмена" label_selected="Отмена" name="Cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_sell_land.xml b/indra/newview/skins/default/xui/ru/floater_sell_land.xml
new file mode 100644
index 0000000000..e15f761101
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_sell_land.xml
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="sell land" title="ПРОДÐЖРЗЕМЛИ">
+ <scroll_container name="profile_scroll">
+ <panel name="scroll_content_panel">
+ <text name="info_parcel_label">
+ УчаÑток:
+ </text>
+ <text name="info_parcel">
+ ÐÐЗВÐÐИЕ УЧÐСТКÐ
+ </text>
+ <text name="info_size_label">
+ Размер:
+ </text>
+ <text name="info_size">
+ [AREA] м²
+ </text>
+ <text name="info_action">
+ Чтобы продать Ñтот учаÑток:
+ </text>
+ <text name="price_label">
+ 1. Ðазначьте цену:
+ </text>
+ <text name="price_text">
+ УÑтановите уÑтраивающую Ð²Ð°Ñ Ñ†ÐµÐ½Ñƒ.
+ </text>
+ <text name="price_ld">
+ L$
+ </text>
+ <line_editor name="price">
+ 0
+ </line_editor>
+ <text name="price_per_m">
+ (L$[PER_METER] за м²)
+ </text>
+ <text name="sell_to_label">
+ 2. Продажа земли:
+ </text>
+ <text name="sell_to_text">
+ Укажите, кому будете продавать землю.
+ </text>
+ <combo_box name="sell_to">
+ <combo_box.item label="- выберите -" name="--selectone--"/>
+ <combo_box.item label="Ð’Ñе" name="Anyone"/>
+ <combo_box.item label="Конкретному жителю:" name="Specificuser:"/>
+ </combo_box>
+ <button label="Выбрать" name="sell_to_select_agent"/>
+ <text name="sell_objects_label">
+ 3. Продать объекты вмеÑте Ñ Ð·ÐµÐ¼Ð»ÐµÐ¹?
+ </text>
+ <text name="sell_objects_text">
+ Перемещаемые объекты хозÑина Ñтой земли изменÑÑ‚ владельца?
+ </text>
+ <radio_group name="sell_objects">
+ <radio_item label="Ðет, Ñохранить владение объектами" name="no"/>
+ <radio_item label="Да, продать объекты вмеÑте Ñ Ð·ÐµÐ¼Ð»ÐµÐ¹" name="yes"/>
+ </radio_group>
+ <button label="Показать объекты" name="show_objects"/>
+ <text name="nag_message_label">
+ ПОМÐИТЕ: продажи Ð½ÐµÐ»ÑŒÐ·Ñ Ð¾Ñ‚Ð¼ÐµÐ½Ð¸Ñ‚ÑŒ.
+ </text>
+ <button label="Ð’Ñ‹Ñтавить землю на продажу" name="sell_btn"/>
+ <button label="Отмена" name="cancel_btn"/>
+ </panel>
+ </scroll_container>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_settings_debug.xml b/indra/newview/skins/default/xui/ru/floater_settings_debug.xml
new file mode 100644
index 0000000000..7db014ef53
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_settings_debug.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="settings_debug" title="ÐÐСТРОЙКИ ОТЛÐДКИ">
+ <radio_group name="boolean_combo">
+ <radio_item label="ИСТИÐÐ" name="TRUE" value="иÑтина"/>
+ <radio_item label="ЛОЖЬ" name="FALSE" value=""/>
+ </radio_group>
+ <color_swatch label="Цвет" name="val_color_swatch"/>
+ <spinner label="x" name="val_spinner_1"/>
+ <spinner label="x" name="val_spinner_2"/>
+ <spinner label="x" name="val_spinner_3"/>
+ <spinner label="x" name="val_spinner_4"/>
+ <button label="Ð¡Ð±Ñ€Ð¾Ñ Ð² Ñтандартное значение" name="default_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_snapshot.xml b/indra/newview/skins/default/xui/ru/floater_snapshot.xml
new file mode 100644
index 0000000000..7e88630b32
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_snapshot.xml
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Snapshot" title="ПРОСМОТР СÐИМКÐ">
+ <floater.string name="unknown">
+ неизвеÑтно
+ </floater.string>
+ <string name="postcard_progress_str">
+ Отправка пиÑьма
+ </string>
+ <string name="profile_progress_str">
+ ПубликациÑ
+ </string>
+ <string name="inventory_progress_str">
+ Сохранение в -инвентарь
+ </string>
+ <string name="local_progress_str">
+ Сохранение на компьютере
+ </string>
+ <string name="profile_succeeded_str">
+ Изображение отправлено
+ </string>
+ <string name="postcard_succeeded_str">
+ ПиÑьмо отправлено!
+ </string>
+ <string name="inventory_succeeded_str">
+ Сохранено в инвентаре!
+ </string>
+ <string name="local_succeeded_str">
+ Сохранено на компьютере!
+ </string>
+ <string name="profile_failed_str">
+ Ðе удалоÑÑŒ передать изображение в ваш профиль.
+ </string>
+ <string name="postcard_failed_str">
+ Ðе удалоÑÑŒ отправить пиÑьмо.
+ </string>
+ <string name="inventory_failed_str">
+ Ðе удалоÑÑŒ Ñохранить в инвентаре.
+ </string>
+ <string name="local_failed_str">
+ Ðе удалоÑÑŒ Ñохранить на компьютере.
+ </string>
+ <button name="advanced_options_btn" tool_tip="Дополнительные параметры"/>
+ <text name="image_res_text">
+ [WIDTH] x [HEIGHT] пикÑ.
+ </text>
+ <text name="file_size_label">
+ [SIZE] КБ
+ </text>
+ <panel name="advanced_options_panel">
+ <text name="advanced_options_label">
+ ДОПОЛÐИТЕЛЬÐЫЕ ПÐРÐМЕТРЫ
+ </text>
+ <text name="layer_type_label">
+ Захват:
+ </text>
+ <combo_box label="Слои изображениÑ" name="layer_types">
+ <combo_box.item label="Цвета" name="Colors"/>
+ <combo_box.item label="Глубина" name="Depth"/>
+ </combo_box>
+ <check_box label="ИнтерфейÑ" name="ui_check"/>
+ <check_box label="Данные в игре" name="hud_check"/>
+ <check_box label="Стоп-кадр (полноÑкранный)" name="freeze_frame_check"/>
+ <check_box label="Ðвтообновление" name="auto_snapshot_check"/>
+ </panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_sound_devices.xml b/indra/newview/skins/default/xui/ru/floater_sound_devices.xml
new file mode 100644
index 0000000000..fc8de858cd
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_sound_devices.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_sound_devices" title="ЗВУКОВЫЕ УСТРОЙСТВÐ">
+ <text name="voice_label">
+ ГолоÑовой чат
+ </text>
+ <check_box label="Включен" name="enable_voice"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_sound_preview.xml b/indra/newview/skins/default/xui/ru/floater_sound_preview.xml
new file mode 100644
index 0000000000..6fdb12b76b
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_sound_preview.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Sound Preview" title="SOUND.WAV">
+ <text name="name_label">
+ Ðазвание:
+ </text>
+ <text name="description_label">
+ ОпиÑание:
+ </text>
+ <button label="Передать (L$[AMOUNT])" name="ok_btn"/>
+ <button label="Отмена" label_selected="Отмена" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_stats.xml b/indra/newview/skins/default/xui/ru/floater_stats.xml
new file mode 100644
index 0000000000..b1f60c8029
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_stats.xml
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Statistics" title="СТÐТИСТИКÐ">
+ <scroll_container name="statistics_scroll">
+ <container_view name="statistics_view">
+ <stat_view label="БазоваÑ" name="basic">
+ <stat_bar label="Кадров/Ñ" name="fps"/>
+ <stat_bar label="Ширина канала" name="bandwidth"/>
+ <stat_bar label="Потери пакетов" name="packet_loss"/>
+ <stat_bar label="Пинг" name="ping"/>
+ </stat_view>
+ <stat_view label="Дополнительно" name="advanced">
+ <stat_view label="ОтриÑовка" name="render">
+ <stat_bar label="Треугольников на кадр" name="ktrisframe"/>
+ <stat_bar label="Треугольников в Ñекунду" name="ktrissec"/>
+ <stat_bar label="Ð’Ñего объектов" name="objs"/>
+ <stat_bar label="Ðовых объектов" name="newobjs"/>
+ </stat_view>
+ <stat_view label="ТекÑтура" name="texture">
+ <stat_bar label="КоличеÑтво" name="numimagesstat"/>
+ <stat_bar label="Ðеобраб. изображений" name="numrawimagesstat"/>
+ <stat_bar label="ПамÑть GL" name="gltexmemstat"/>
+ <stat_bar label="Ð¤Ð¾Ñ€Ð¼Ð°Ñ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð½Ð°Ñ Ð¿Ð°Ð¼Ñть" name="formattedmemstat"/>
+ <stat_bar label="ÐÐµÑ„Ð¾Ñ€Ð¼Ð°Ñ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð½Ð°Ñ Ð¿Ð°Ð¼Ñть" name="rawmemstat"/>
+ <stat_bar label="Ограничение памÑти" name="glboundmemstat"/>
+ </stat_view>
+ <stat_view label="Сеть" name="network">
+ <stat_bar label="ВходÑщие пакеты" name="packetsinstat"/>
+ <stat_bar label="ИÑходÑщие пакеты" name="packetsoutstat"/>
+ <stat_bar label="Объекты" name="objectkbitstat"/>
+ <stat_bar label="ТекÑтура" name="texturekbitstat"/>
+ <stat_bar label="Ðктив" name="assetkbitstat"/>
+ <stat_bar label="Слои" name="layerskbitstat"/>
+ <stat_bar label="ДейÑтвительный ввод" name="actualinkbitstat"/>
+ <stat_bar label="ДейÑтвительный вывод" name="actualoutkbitstat"/>
+ <stat_bar label="Ожидающие операции VFS" name="vfspendingoperations"/>
+ </stat_view>
+ </stat_view>
+ <stat_view label="СимулÑтор" name="sim">
+ <stat_bar label="Замедление времени" name="simtimedilation"/>
+ <stat_bar label="СимулÑциÑ: кадров/Ñ" name="simfps"/>
+ <stat_bar label="Физика: кадров/Ñ" name="simphysicsfps"/>
+ <stat_view label="ФизичеÑкие данные" name="physicsdetail">
+ <stat_bar label="Закрепленные объекты" name="physicspinnedtasks"/>
+ <stat_bar label="Объекты Ñ Ð½Ð¸Ð·ÐºÐ¾Ð¹ детализацией" name="physicslodtasks"/>
+ <stat_bar label="Ð’Ñ‹Ð´ÐµÐ»ÐµÐ½Ð½Ð°Ñ Ð¿Ð°Ð¼Ñть" name="physicsmemoryallocated"/>
+ </stat_view>
+ <stat_bar label="Обновлений агента/Ñ" name="simagentups"/>
+ <stat_bar label="ОÑновные агенты" name="simmainagents"/>
+ <stat_bar label="Дочерние агенты" name="simchildagents"/>
+ <stat_bar label="Объекты" name="simobjects"/>
+ <stat_bar label="Ðктивные объекты" name="simactiveobjects"/>
+ <stat_bar label="Ðктивные Ñкрипты" name="simactivescripts"/>
+ <stat_bar label="Ð¡Ð¾Ð±Ñ‹Ñ‚Ð¸Ñ Ñкрипта" name="simscripteps"/>
+ <stat_bar label="ВходÑщие пакеты" name="siminpps"/>
+ <stat_bar label="ИÑходÑщие пакеты" name="simoutpps"/>
+ <stat_bar label="Отложенные загрузки" name="simpendingdownloads"/>
+ <stat_bar label="Отложенные передачи" name="simpendinguploads"/>
+ <stat_bar label="Общий нераÑпакованный объем (байт)" name="simtotalunackedbytes"/>
+ <stat_view label="Ð’Ñ€ÐµÐ¼Ñ (мÑ)" name="simperf">
+ <stat_bar label="Общее Ð²Ñ€ÐµÐ¼Ñ ÐºÐ°Ð´Ñ€Ð°" name="simframemsec"/>
+ <stat_bar label="ЧиÑтое времÑ" name="simnetmsec"/>
+ <stat_bar label="Ð’Ñ€ÐµÐ¼Ñ Ð½Ð° физику" name="simsimphysicsmsec"/>
+ <stat_bar label="Ð’Ñ€ÐµÐ¼Ñ Ð½Ð° ÑимулÑцию" name="simsimothermsec"/>
+ <stat_bar label="Ð’Ñ€ÐµÐ¼Ñ Ð½Ð° клиент" name="simagentmsec"/>
+ <stat_bar label="Ð’Ñ€ÐµÐ¼Ñ Ð½Ð° изображениÑ" name="simimagesmsec"/>
+ <stat_bar label="Ð’Ñ€ÐµÐ¼Ñ Ð½Ð° Ñкрипт" name="simscriptmsec"/>
+ <stat_bar label="Резервное времÑ" name="simsparemsec"/>
+ <stat_view label="Данные времени (мÑ)" name="timedetails">
+ <stat_bar label="Шаг физики" name="simsimphysicsstepmsec"/>
+ <stat_bar label="Обновить физ. формы" name="simsimphysicsshapeupdatemsec"/>
+ <stat_bar label="Физика - прочее" name="simsimphysicsothermsec"/>
+ <stat_bar label="Ð’Ñ€ÐµÐ¼Ñ Ñна" name="simsleepmsec"/>
+ <stat_bar label="Ввод/вывод" name="simpumpiomsec"/>
+ </stat_view>
+ </stat_view>
+ </stat_view>
+ </container_view>
+ </scroll_container>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_sys_well.xml b/indra/newview/skins/default/xui/ru/floater_sys_well.xml
new file mode 100644
index 0000000000..b6975ac9ab
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_sys_well.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="sys_well_window" title="УВЕДОМЛЕÐИЯ">
+ <string name="title_im_well_window">
+ ОБЩЕÐИЕ
+ </string>
+ <string name="title_notification_well_window">
+ УВЕДОМЛЕÐИЯ
+ </string>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_telehub.xml b/indra/newview/skins/default/xui/ru/floater_telehub.xml
new file mode 100644
index 0000000000..799fd57b5b
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_telehub.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- Explicit left edge to avoid overlapping build tools -->
+<floater name="telehub" title="ТЕЛЕХÐБ">
+ <text name="status_text_connected">
+ Телехаб подключен к объекту [OBJECT]
+ </text>
+ <text name="status_text_not_connected">
+ Телехаб не подключен.
+ </text>
+ <text name="help_text_connected">
+ Ð”Ð»Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð½Ð°Ð¶Ð¼Ð¸Ñ‚Ðµ «Отключить».
+ </text>
+ <text name="help_text_not_connected">
+ Выберите объект и нажмите «Подключить телехаб».
+ </text>
+ <button label="Подключить телехаб" name="connect_btn"/>
+ <button label="Отключить" name="disconnect_btn"/>
+ <text name="spawn_points_text">
+ Точки поÑÐ²Ð»ÐµÐ½Ð¸Ñ (позиции, а не объекты):
+ </text>
+ <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/ru/floater_texture_ctrl.xml b/indra/newview/skins/default/xui/ru/floater_texture_ctrl.xml
new file mode 100644
index 0000000000..d55daea836
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_texture_ctrl.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="texture picker" title="ВЫБРÐТЬ: ТЕКСТУРУ">
+ <floater.string name="choose_picture">
+ Щелкните Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° изображениÑ
+ </floater.string>
+ <floater.string name="pick title">
+ Выбрать:
+ </floater.string>
+ <text name="Multiple">
+ ÐеÑколько текÑтур
+ </text>
+ <text name="unknown">
+ Размер: [DIMENSIONS]
+ </text>
+ <button label="По умолчанию" label_selected="По умолчанию" name="Default"/>
+ <button label="Ðет" label_selected="Ðет" name="None"/>
+ <button label="ОчиÑтить" label_selected="ОчиÑтить" name="Blank"/>
+ <check_box initial_value="иÑтина" label="Применить ÑейчаÑ" name="apply_immediate_check"/>
+ <filter_editor label="Фильтровать текÑтуры" name="inventory search editor"/>
+ <check_box initial_value="ложь" label="Показывать папки" name="show_folders_check"/>
+ <button label="ОК" label_selected="ОК" name="Select"/>
+ <button label="Отмена" label_selected="Отмена" name="Cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_tools.xml b/indra/newview/skins/default/xui/ru/floater_tools.xml
new file mode 100644
index 0000000000..eb9083f7fc
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_tools.xml
@@ -0,0 +1,491 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="toolbox floater" short_title="ИÐСТРУМЕÐТЫ ДЛЯ СТРОИТЕЛЬСТВÐ">
+ <floater.string name="status_rotate">
+ ПеретÑгивайте цветные полоÑÑ‹ Ð´Ð»Ñ Ð²Ñ€Ð°Ñ‰ÐµÐ½Ð¸Ñ Ð¾Ð±ÑŠÐµÐºÑ‚Ð°
+ </floater.string>
+ <floater.string name="status_scale">
+ Щелкните и перетащите Ð´Ð»Ñ Ñ€Ð°ÑÑ‚ÑÐ¶ÐµÐ½Ð¸Ñ Ð²Ñ‹Ð±Ñ€Ð°Ð½Ð½Ð¾Ð¹ Ñтороны
+ </floater.string>
+ <floater.string name="status_move">
+ Перемещение: перетащить, копирование: перетащить при нажатой клавише Shift
+ </floater.string>
+ <floater.string name="status_modifyland">
+ Щелкните и удерживайте Ð´Ð»Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð·ÐµÐ¼Ð»Ð¸
+ </floater.string>
+ <floater.string name="status_camera">
+ Щелкните и перетащите Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ¼ÐµÑ‰ÐµÐ½Ð¸Ñ ÐºÐ°Ð¼ÐµÑ€Ñ‹
+ </floater.string>
+ <floater.string name="status_grab">
+ Перемещение: перетащить, подъем: нажать Ctrl, вращение: нажать Ctrl+Shift
+ </floater.string>
+ <floater.string name="status_place">
+ Щелкните Ð´Ð»Ñ ÑозданиÑ
+ </floater.string>
+ <floater.string name="status_selectland">
+ Щелкните и перетащите Ð´Ð»Ñ Ð²Ñ‹Ð´ÐµÐ»ÐµÐ½Ð¸Ñ Ð·ÐµÐ¼Ð»Ð¸
+ </floater.string>
+ <floater.string name="status_selectcount">
+ Выбрано объектов: [OBJ_COUNT], влиÑние на землю [LAND_IMPACT]
+ </floater.string>
+ <floater.string name="status_remaining_capacity">
+ ОÑтаток емкоÑти [LAND_CAPACITY].
+ </floater.string>
+ <button name="button focus" tool_tip="ФокуÑ"/>
+ <button name="button move" tool_tip="ПеремеÑтить"/>
+ <button name="button edit" tool_tip="Изменить"/>
+ <button name="button create" tool_tip="Создать"/>
+ <button name="button land" tool_tip="ЗемлÑ"/>
+ <text name="text status">
+ Перемещение: перетащить, копирование: перетащить при нажатой клавише Shift
+ </text>
+ <radio_group name="focus_radio_group">
+ <radio_item label="Увеличение" name="radio zoom"/>
+ <radio_item label="Вращение (Ctrl)" name="radio orbit"/>
+ <radio_item label="Сдвиг (Ctrl+Shift)" name="radio pan"/>
+ </radio_group>
+ <slider_bar initial_value="0.125" name="slider zoom"/>
+ <radio_group name="move_radio_group">
+ <radio_item label="ПеремеÑтить" name="radio move"/>
+ <radio_item label="Подъем (Ctrl)" name="radio lift"/>
+ <radio_item label="Вращение (Ctrl+Shift)" name="radio spin"/>
+ </radio_group>
+ <radio_group name="edit_radio_group">
+ <radio_item label="ПеремеÑтить" name="radio position"/>
+ <radio_item label="Вращение (Ctrl)" name="radio rotate"/>
+ <radio_item label="РаÑÑ‚Ñжка (Ctrl+Shift)" name="radio stretch"/>
+ <radio_item label="Выбор грани" name="radio select face"/>
+ </radio_group>
+ <check_box label="Редактировать объединенные" name="checkbox edit linked parts"/>
+ <button label="Объединить" name="link_btn"/>
+ <button label="Разъединить" name="unlink_btn"/>
+ <text label="РаÑÑ‚Ñжка обеих Ñторон" name="checkbox uniform label">
+ РаÑÑ‚Ñжка обеих Ñторон
+ </text>
+ <check_box initial_value="иÑтина" label="РаÑÑ‚Ñгивать текÑтуры" name="checkbox stretch textures"/>
+ <check_box initial_value="иÑтина" label="ПривÑзка" name="checkbox snap to grid"/>
+ <button label="Параметры..." name="Options..." tool_tip="Дополнительные параметры Ñетки"/>
+ <button name="ToolCube" tool_tip="Куб"/>
+ <button name="ToolPrism" tool_tip="Призма"/>
+ <button name="ToolPyramid" tool_tip="Пирамида"/>
+ <button name="ToolTetrahedron" tool_tip="ТетраÑдр"/>
+ <button name="ToolCylinder" tool_tip="Цилиндр"/>
+ <button name="ToolHemiCylinder" tool_tip="Полуцилиндр"/>
+ <button name="ToolCone" tool_tip="КонуÑ"/>
+ <button name="ToolHemiCone" tool_tip="ПолуконуÑ"/>
+ <button name="ToolSphere" tool_tip="Сфера"/>
+ <button name="ToolHemiSphere" tool_tip="ПолуÑфера"/>
+ <button name="ToolTorus" tool_tip="Тор"/>
+ <button name="ToolTube" tool_tip="Труба"/>
+ <button name="ToolRing" tool_tip="Кольцо"/>
+ <button name="ToolTree" tool_tip="Дерево"/>
+ <button name="ToolGrass" tool_tip="Трава"/>
+ <check_box label="Держать инÑтрумент" name="checkbox sticky"/>
+ <check_box label="Копировать выдел." name="checkbox copy selection"/>
+ <check_box initial_value="иÑтина" label="Центрир. копию" name="checkbox copy centers"/>
+ <check_box label="Повернуть копию" name="checkbox copy rotates"/>
+ <radio_group name="land_radio_group">
+ <radio_item label="Выбрать землю" name="radio select land"/>
+ <radio_item label="ВыровнÑть" name="radio flatten"/>
+ <radio_item label="ПоднÑть" name="radio raise"/>
+ <radio_item label="Ðиже" name="radio lower"/>
+ <radio_item label="Гладко" name="radio smooth"/>
+ <radio_item label="Огрубить" name="radio noise"/>
+ <radio_item label="ВоÑÑтановить" name="radio revert"/>
+ </radio_group>
+ <text name="Bulldozer:">
+ Бульдозер:
+ </text>
+ <text name="Dozer Size:">
+ Размер
+ </text>
+ <slider_bar initial_value="2.0" name="slider brush size"/>
+ <text name="Strength:">
+ Сила
+ </text>
+ <slider_bar initial_value="0.00" name="slider force"/>
+ <button label="Применить" label_selected="Применить" name="button apply to selection" tool_tip="Изменить выбранную землю"/>
+ <text name="selection_empty">
+ Ðе выбрано.
+ </text>
+ <text name="remaining_capacity">
+ [CAPACITY_STRING] [secondlife:///app/openfloater/object_weights Ð”Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ]
+ </text>
+ <tab_container name="Object Info Tabs">
+ <panel label="Общие" name="General">
+ <panel.string name="text deed continued">
+ Сделка
+ </panel.string>
+ <panel.string name="text deed">
+ Сделка
+ </panel.string>
+ <panel.string name="text modify info 1">
+ Этот объект можно изменÑть
+ </panel.string>
+ <panel.string name="text modify info 2">
+ Эти объекты можно изменÑть
+ </panel.string>
+ <panel.string name="text modify info 3">
+ Этот объект Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ð·Ð¼ÐµÐ½Ñть
+ </panel.string>
+ <panel.string name="text modify info 4">
+ Эти объекты Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ð·Ð¼ÐµÐ½Ñть
+ </panel.string>
+ <panel.string name="text modify warning">
+ Чтобы задать права доÑтупа, нужно выделить объект целиком
+ </panel.string>
+ <panel.string name="Cost Default">
+ Цена: L$
+ </panel.string>
+ <panel.string name="Cost Total">
+ Ð’Ñего: L$
+ </panel.string>
+ <panel.string name="Cost Per Unit">
+ Цена за: L$
+ </panel.string>
+ <panel.string name="Cost Mixed">
+ Ð¡Ð¼ÐµÑˆÐ°Ð½Ð½Ð°Ñ Ñ†ÐµÐ½Ð°
+ </panel.string>
+ <panel.string name="Sale Mixed">
+ Ð¡Ð¼ÐµÑˆÐ°Ð½Ð½Ð°Ñ Ð¿Ñ€Ð¾Ð´Ð°Ð¶Ð°
+ </panel.string>
+ <text name="Name:">
+ Ðазвание:
+ </text>
+ <text name="Description:">
+ ОпиÑание:
+ </text>
+ <text name="Creator:">
+ Создатель:
+ </text>
+ <text name="Owner:">
+ Владелец:
+ </text>
+ <text name="Group:">
+ Группа:
+ </text>
+ <name_box initial_value="Загрузка..." name="Group Name Proxy"/>
+ <button name="button set group" tool_tip="Выберите группу Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‡Ð¸ ей прав доÑтупа к объекту"/>
+ <check_box label="ПоделитьÑÑ" name="checkbox share with group" tool_tip="Позволить вÑем учаÑтникам выбранной группы получить уÑтановленные вам права на Ñтот объект. Ð”Ð»Ñ Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ñ€Ð¾Ð»ÐµÐ²Ñ‹Ñ… ограничений необходимо произвеÑти Ñделку."/>
+ <button label="Сделка" label_selected="Сделка" name="button deed" tool_tip="Ð’ результате Ñделки объект передаетÑÑ Ð³Ñ€ÑƒÐ¿Ð¿Ðµ, при Ñтом права на него будут ÑоответÑтвовать правам Ñледующего владельца. Переданный группе объект может передаватьÑÑ Ð´Ð¾Ð»Ð¶Ð½Ð¾Ñтным лицом группы."/>
+ <text name="label click action">
+ По щелчку:
+ </text>
+ <combo_box name="clickaction">
+ <combo_box.item label="КоÑнутьÑÑ (по умолчанию)" name="Touch/grab(default)"/>
+ <combo_box.item label="СеÑть на объект" name="Sitonobject"/>
+ <combo_box.item label="Купить объект" name="Buyobject"/>
+ <combo_box.item label="Заплатить за объект" name="Payobject"/>
+ <combo_box.item label="Открыть" name="Open"/>
+ <combo_box.item label="Увеличение" name="Zoom"/>
+ </combo_box>
+ <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="Original"/>
+ </combo_box>
+ <spinner label="Цена: L$" name="Edit Cost"/>
+ <check_box label="Показать в поиÑке" name="search_check" tool_tip="Показывать объект в результатах поиÑка"/>
+ <panel name="perms_build">
+ <text name="perm_modify">
+ Этот объект можно изменÑть
+ </text>
+ <text name="Anyone can:">
+ Ð’Ñе:
+ </text>
+ <check_box label="ПеремеÑтить" name="checkbox allow everyone move"/>
+ <check_box label="Копировать" name="checkbox allow everyone copy"/>
+ <text name="Next owner can:">
+ Следующий владелец:
+ </text>
+ <check_box label="ИзменÑть" name="checkbox next owner can modify"/>
+ <check_box label="Копировать" name="checkbox next owner can copy"/>
+ <check_box label="Передать" name="checkbox next owner can transfer" tool_tip="Следующий владелец может отдать или перепродать объект"/>
+ <text name="B:">
+ Ð:
+ </text>
+ <text name="O:">
+ O:
+ </text>
+ <text name="G:">
+ G:
+ </text>
+ <text name="E:">
+ Ð’:
+ </text>
+ <text name="N:">
+ С:
+ </text>
+ <text name="F:">
+ F:
+ </text>
+ </panel>
+ </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="Temporary Checkbox Ctrl" tool_tip="Приводит к автоматичеÑкому удалению объекта через минуту поÑле ÑозданиÑ."/>
+ <check_box label="Фантомный" name="Phantom Checkbox Ctrl" tool_tip="Предотвращает Ñтолкновение объекта Ñ Ð´Ñ€ÑƒÐ³Ð¸Ð¼Ð¸ объектами или аватарами."/>
+ <text name="label position">
+ ÐŸÐ¾Ð·Ð¸Ñ†Ð¸Ñ (метры)
+ </text>
+ <spinner label="X" name="Pos X"/>
+ <spinner label="Y" name="Pos Y"/>
+ <spinner label="Z" name="Pos Z"/>
+ <text name="label size">
+ Размер (метры)
+ </text>
+ <spinner label="X" name="Scale X"/>
+ <spinner label="Y" name="Scale Y"/>
+ <spinner label="Z" name="Scale Z"/>
+ <text name="label rotation">
+ Поворот (градуÑÑ‹)
+ </text>
+ <spinner label="X" name="Rot X"/>
+ <spinner label="Y" name="Rot Y"/>
+ <spinner label="Z" name="Rot Z"/>
+ <combo_box name="comboBaseType">
+ <combo_box.item label="Коробка" name="Box"/>
+ <combo_box.item label="Цилиндр" name="Cylinder"/>
+ <combo_box.item label="Призма" name="Prism"/>
+ <combo_box.item label="Сфера" name="Sphere"/>
+ <combo_box.item label="Тор" name="Torus"/>
+ <combo_box.item label="Труба" name="Tube"/>
+ <combo_box.item label="Кольцо" name="Ring"/>
+ <combo_box.item label="Скульптурный" name="Sculpted"/>
+ </combo_box>
+ <text name="text cut">
+ Разрез (начало/конец)
+ </text>
+ <spinner label="B" name="cut begin"/>
+ <spinner label="Ð’" name="cut end"/>
+ <text name="text hollow">
+ ПолоÑть
+ </text>
+ <text name="text skew">
+ Спираль
+ </text>
+ <text name="Hollow Shape">
+ Форма полоÑти
+ </text>
+ <combo_box name="hole">
+ <combo_box.item label="По умолчанию" name="Default"/>
+ <combo_box.item label="КруглаÑ" name="Circle"/>
+ <combo_box.item label="КвадратнаÑ" name="Square"/>
+ <combo_box.item label="ТреугольнаÑ" name="Triangle"/>
+ </combo_box>
+ <text name="text twist">
+ Скручивание
+ </text>
+ <spinner label="С" name="Twist Begin"/>
+ <spinner label="E" name="Twist End"/>
+ <text name="scale_taper">
+ КонуÑный Ñрез
+ </text>
+ <text name="scale_hole">
+ Размер отверÑтиÑ
+ </text>
+ <spinner label="X" name="Taper Scale X"/>
+ <spinner label="Y" name="Taper Scale Y"/>
+ <text name="text topshear">
+ Сдвиг вершины
+ </text>
+ <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="С" name="Path Limit Begin"/>
+ <spinner label="E" name="Path Limit End"/>
+ <text name="text taper2">
+ КонуÑный Ñрез
+ </text>
+ <spinner label="X" name="Taper X"/>
+ <spinner label="Y" name="Taper Y"/>
+ <text name="text radius delta">
+ РадиуÑ
+ </text>
+ <text name="text revolutions">
+ Обороты
+ </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="Инвертировать нормали Ñкульптурного примитива, «вывернув» его наизнанку"/>
+ <text name="label sculpt type">
+ Тип Ñтыковки
+ </text>
+ <combo_box name="sculpt type control">
+ <combo_box.item label="По Ñфере" name="Sphere"/>
+ <combo_box.item label="По тору" name="Torus"/>
+ <combo_box.item label="По плоÑкоÑти" name="Plane"/>
+ <combo_box.item label="По цилиндру" name="Cylinder"/>
+ </combo_box>
+ </panel>
+ <panel label="ОÑобенноÑти" name="Features">
+ <panel.string name="None">
+ Ðет
+ </panel.string>
+ <panel.string name="Prim">
+ Примитив
+ </panel.string>
+ <panel.string name="Convex Hull">
+ Ð¡Ð»Ð¾Ð¶Ð½Ð°Ñ Ð¾Ð±Ð¾Ð»Ð¾Ñ‡ÐºÐ°
+ </panel.string>
+ <text name="select_single">
+ Выберите только один примитив Ð´Ð»Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¾ÑобенноÑтей.
+ </text>
+ <text name="edit_object">
+ Изменение оÑобенноÑтей объекта:
+ </text>
+ <check_box label="ГибкоÑть" name="Flexible1D Checkbox Ctrl" tool_tip="Объект может изгибатьÑÑ Ð¿Ð¾ оÑи Z (наÑтройки на Ñтороне клиента)"/>
+ <spinner label="МÑгкоÑть" name="FlexNumSections"/>
+ <spinner label="ГравитациÑ" name="FlexGravity"/>
+ <spinner label="ПаруÑноÑть" name="FlexFriction"/>
+ <spinner label="Ветер" name="FlexWind"/>
+ <spinner label="УпругоÑть" name="FlexTension"/>
+ <spinner label="X-дейÑтвие" name="FlexForceX"/>
+ <spinner label="Y-дейÑтвие" name="FlexForceY"/>
+ <spinner label="Z-дейÑтвие" name="FlexForceZ"/>
+ <check_box label="Свет" name="Light Checkbox Ctrl" tool_tip="Объект будет излучать Ñвет"/>
+ <color_swatch name="colorswatch" tool_tip="Щелкните Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° цвета"/>
+ <texture_picker label="" name="light texture control" tool_tip="Щелкните Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° проецируемого Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ (дейÑтвует только Ñ Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ð¾Ð¹ отложенной отриÑовкой)"/>
+ <spinner label="ИнтенÑивноÑть" name="Light Intensity"/>
+ <spinner label="Угол обзора" name="Light FOV"/>
+ <spinner label="РадиуÑ" name="Light Radius"/>
+ <spinner label="ФокуÑ" name="Light Focus"/>
+ <spinner label="ОÑлабление" name="Light Falloff"/>
+ <spinner label="Окружение" name="Light Ambiance"/>
+ <text name="label physicsshapetype">
+ Тип физич. формы:
+ </text>
+ <combo_box name="Physics Shape Type Combo Ctrl" tool_tip="Выберите тип физичеÑкой формы"/>
+ <combo_box name="material">
+ <combo_box.item label="Камень" name="Stone"/>
+ <combo_box.item label="Металл" name="Metal"/>
+ <combo_box.item label="Стекло" name="Glass"/>
+ <combo_box.item label="Дерево" name="Wood"/>
+ <combo_box.item label="Плоть" name="Flesh"/>
+ <combo_box.item label="ПлаÑтик" name="Plastic"/>
+ <combo_box.item label="Резина" name="Rubber"/>
+ </combo_box>
+ <spinner label="ГравитациÑ" name="Physics Gravity"/>
+ <spinner label="Трение" name="Physics Friction"/>
+ <spinner label="ПлотноÑть в 100 кг/м^3" name="Physics Density"/>
+ <spinner label="ВоÑÑтанавливаемоÑть" name="Physics Restitution"/>
+ </panel>
+ <panel label="ТекÑтура" name="Texture">
+ <panel.string name="string repeats per meter">
+ Повторений на метр
+ </panel.string>
+ <panel.string name="string repeats per face">
+ Повторений на грань
+ </panel.string>
+ <texture_picker label="ТекÑтура" name="texture control" tool_tip="Щелкните Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° изображениÑ"/>
+ <color_swatch label="Цвет" name="colorswatch" tool_tip="Щелкните Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° цвета"/>
+ <text name="color trans">
+ ПрозрачноÑть %
+ </text>
+ <text name="glow label">
+ Свечение
+ </text>
+ <check_box label="СобÑтв. ÑркоÑть" name="checkbox fullbright"/>
+ <text name="tex gen">
+ Ðаложение
+ </text>
+ <combo_box name="combobox texgen">
+ <combo_box.item label="По умолчанию" name="Default"/>
+ <combo_box.item label="Ðа плоÑкоÑть" name="Planar"/>
+ </combo_box>
+ <text name="label shininess">
+ БлеÑк
+ </text>
+ <combo_box name="combobox shininess">
+ <combo_box.item label="Ðет" name="None"/>
+ <combo_box.item label="Ðизко" name="Low"/>
+ <combo_box.item label="Средний" name="Medium"/>
+ <combo_box.item label="Ð’Ñ‹Ñоко" name="High"/>
+ </combo_box>
+ <text name="label bumpiness">
+ РельефноÑть
+ </text>
+ <combo_box name="combobox bumpiness">
+ <combo_box.item label="Ðет" name="None"/>
+ <combo_box.item label="ЯркоÑть" name="Brightness"/>
+ <combo_box.item label="По темному" name="Darkness"/>
+ <combo_box.item label="дерево" name="woodgrain"/>
+ <combo_box.item label="кора" name="bark"/>
+ <combo_box.item label="кирпич" name="bricks"/>
+ <combo_box.item label="ÑˆÐ°Ñ…Ð¼Ð°Ñ‚Ð½Ð°Ñ Ð´Ð¾Ñка" name="checker"/>
+ <combo_box.item label="бетон" name="concrete"/>
+ <combo_box.item label="ÑÑ‚Ð°Ñ€Ð°Ñ Ð¿Ð»Ð¸Ñ‚ÐºÐ°" name="crustytile"/>
+ <combo_box.item label="теÑаный камень" name="cutstone"/>
+ <combo_box.item label="диÑки" name="discs"/>
+ <combo_box.item label="гравий" name="gravel"/>
+ <combo_box.item label="чашка Петри" name="petridish"/>
+ <combo_box.item label="Ñайдинг" name="siding"/>
+ <combo_box.item label="ÐºÐ°Ð¼ÐµÐ½Ð½Ð°Ñ Ð¿Ð»Ð¸Ñ‚ÐºÐ°" name="stonetile"/>
+ <combo_box.item label="штукатурка" name="stucco"/>
+ <combo_box.item label="приÑоÑка" name="suction"/>
+ <combo_box.item label="переплетение" name="weave"/>
+ </combo_box>
+ <check_box initial_value="ложь" label="СоглаÑование" name="checkbox planar align" tool_tip="СоглаÑование текÑтур на вÑех выбранных граних по поÑледней выбранной грани. Должно быть выбрано наложение по плоÑкоÑÑ‚Ñм."/>
+ <text name="rpt">
+ Повторов на грань
+ </text>
+ <spinner label="По горизонтали (U)" name="TexScaleU"/>
+ <check_box label="Разворот" name="checkbox flip s"/>
+ <spinner label="По вертикали (V)" name="TexScaleV"/>
+ <check_box label="Разворот" name="checkbox flip t"/>
+ <spinner label="Вращение˚" name="TexRot"/>
+ <spinner label="Повторов на метр" name="rptctrl"/>
+ <button label="Применить" label_selected="Применить" name="button apply"/>
+ <text name="tex offset">
+ Сдвиг текÑтуры
+ </text>
+ <spinner label="По горизонтали (U)" name="TexOffsetU"/>
+ <spinner label="По вертикали (V)" name="TexOffsetV"/>
+ <panel name="Add_Media">
+ <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="МаÑштабирование медиа-текÑтуры (Ñначала нужно загрузить)"/>
+ </panel>
+ </panel>
+ <panel label="Контент" name="Contents">
+ <button label="Создать Ñкрипт" label_selected="Создать Ñкрипт" name="button new script"/>
+ <button label="РазрешениÑ" name="button permissions"/>
+ </panel>
+ </tab_container>
+ <panel name="land info panel">
+ <text name="label_parcel_info">
+ Даные об учаÑтке
+ </text>
+ <text name="label_area_price">
+ Цена: L$[PRICE] за [AREA] м²
+ </text>
+ <text name="label_area">
+ Площадь: [AREA] м²
+ </text>
+ <button label="О земле" label_selected="О земле" name="button about land"/>
+ <check_box label="Показать владельцев" name="checkbox show owners" tool_tip="Цвет учаÑтка в завиÑимоÑти от типа владениÑ: зеленый = ваша землÑ; голубой = Ð·ÐµÐ¼Ð»Ñ Ð²Ð°ÑˆÐµÐ¹ группы; краÑный = Ñ‡ÑƒÐ¶Ð°Ñ Ð·ÐµÐ¼Ð»Ñ; желтый = Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð´Ð°Ð¶Ð¸; фиолетовый = Ð´Ð»Ñ Ð°ÑƒÐºÑ†Ð¸Ð¾Ð½Ð°; Ñерый = общаÑ"/>
+ <text name="label_parcel_modify">
+ Изменение учаÑтка
+ </text>
+ <button label="Разделить" label_selected="Разделить" name="button subdivide land"/>
+ <button label="Объединить" label_selected="Объединить" name="button join land"/>
+ <text name="label_parcel_trans">
+ ДейÑÑ‚Ð²Ð¸Ñ Ñ Ð·ÐµÐ¼Ð»ÐµÐ¹
+ </text>
+ <button label="Купить землю" label_selected="Купить землю" name="button buy land"/>
+ <button label="ОтказатьÑÑ Ð¾Ñ‚ земли" label_selected="ОтказатьÑÑ Ð¾Ñ‚ земли" name="button abandon land"/>
+ </panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_top_objects.xml b/indra/newview/skins/default/xui/ru/floater_top_objects.xml
new file mode 100644
index 0000000000..a6ffe5c030
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_top_objects.xml
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="top_objects" title="Лучшие объекты">
+ <floater.string name="top_scripts_title">
+ Лучшие Ñкрипты
+ </floater.string>
+ <floater.string name="top_scripts_text">
+ [COUNT] Ñкриптов длительноÑтью [TIME] мÑ
+ </floater.string>
+ <floater.string name="scripts_score_label">
+ ВремÑ
+ </floater.string>
+ <floater.string name="scripts_mono_time_label">
+ Ð’Ñ€ÐµÐ¼Ñ Ð¼Ð¾Ð½Ð¾
+ </floater.string>
+ <floater.string name="top_colliders_title">
+ Лучшие ÑтолкновениÑ
+ </floater.string>
+ <floater.string name="top_colliders_text">
+ Лучшие [COUNT] объектов, подвергающиеÑÑ Ð¿Ð¾Ñ‚ÐµÐ½Ñ†Ð¸Ð°Ð»ÑŒÐ½Ñ‹Ð¼ ÑтолкновениÑм
+ </floater.string>
+ <floater.string name="colliders_score_label">
+ Очки
+ </floater.string>
+ <floater.string name="none_descriptor">
+ Ðе найдено.
+ </floater.string>
+ <text name="title_text">
+ Загрузка...
+ </text>
+ <scroll_list name="objects_list">
+ <scroll_list.columns label="Очки" name="score"/>
+ <scroll_list.columns label="Ðазвание" name="name"/>
+ <scroll_list.columns label="Владелец" name="owner"/>
+ <scroll_list.columns label="МеÑто" name="location"/>
+ <scroll_list.columns label="ВремÑ" name="time"/>
+ <scroll_list.columns label="Ð’Ñ€ÐµÐ¼Ñ Ð¼Ð¾Ð½Ð¾" name="mono_time"/>
+ <scroll_list.columns label="URL-адреÑа" name="URLs"/>
+ </scroll_list>
+ <text name="id_text">
+ ID объекта:
+ </text>
+ <button label="Показать метку" name="show_beacon_btn"/>
+ <text name="obj_name_text">
+ Ðазвание объекта:
+ </text>
+ <button label="Фильтр" name="filter_object_btn"/>
+ <text name="owner_name_text">
+ Владелец:
+ </text>
+ <button label="Фильтр" name="filter_owner_btn"/>
+ <button label="Вернуть выбранное" name="return_selected_btn"/>
+ <button label="Вернуть вÑе" name="return_all_btn"/>
+ <button label="Отключить выбранное" name="disable_selected_btn"/>
+ <button label="Отключить вÑе" name="disable_all_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_tos.xml b/indra/newview/skins/default/xui/ru/floater_tos.xml
new file mode 100644
index 0000000000..bd72f6b308
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_tos.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="modal container">
+ <floater.string name="real_url">
+ http://secondlife.com/app/tos/
+ </floater.string>
+ <floater.string name="loading_url">
+ data:text/html,%3Chtml%3E%3Chead%3E%3C/head%3E%3Cbody text=%22000000%22%3E%3Ch2%3E Loading %3Ca%20target%3D%22_external%22%20href%3D%22http%3A//secondlife.com/app/tos/%22%3ETerms%20of%20Service%3C/a%3E...%3C/h2%3E %3C/body%3E %3C/html%3E
+ </floater.string>
+ <button label="Продолжить" label_selected="Продолжить" name="Continue"/>
+ <button label="Отмена" label_selected="Отмена" name="Cancel"/>
+ <check_box label="Я принимаю уÑÐ»Ð¾Ð²Ð¸Ñ ÐŸÐ¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÑŒÑкого ÑÐ¾Ð³Ð»Ð°ÑˆÐµÐ½Ð¸Ñ Ð¸ Политики конфиденциальноÑти" name="agree_chk"/>
+ <text name="tos_heading">
+ Внимательно прочитайте ПользовательÑкое Ñоглашение и Политику конфиденциальноÑти. Ð”Ð»Ñ Ð²Ñ…Ð¾Ð´Ð° в [SECOND_LIFE] вы должны ÑоглаÑитьÑÑ Ñ ÑƒÑловиÑми ÑоглашениÑ.
+ </text>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_toybox.xml b/indra/newview/skins/default/xui/ru/floater_toybox.xml
new file mode 100644
index 0000000000..a4754ad7ab
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_toybox.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Toybox" title="КÐОПКИ ПÐÐЕЛИ ИÐСТРУМЕÐТОВ">
+ <text name="toybox label 1">
+ Добавьте или удалите кнопки, перетÑÐ³Ð¸Ð²Ð°Ñ Ð¸Ñ… на панели инÑтрументов или Ñ Ð½Ð¸Ñ….
+ </text>
+ <text name="toybox label 2">
+ Кнопки будут отображены в иÑходном виде или в виде значков, в завиÑимоÑти от наÑтроек каждой панели инÑтрументов.
+ </text>
+ <button label="ОчиÑтить вÑе панели" label_selected="ОчиÑтить вÑе панели" name="btn_clear_all"/>
+ <button label="Вернуть Ñтандартные" label_selected="Вернуть Ñтандартные" name="btn_restore_defaults"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_translation_settings.xml b/indra/newview/skins/default/xui/ru/floater_translation_settings.xml
new file mode 100644
index 0000000000..ad280a50dd
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_translation_settings.xml
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_translation_settings" title="ÐÐСТРОЙКИ ПЕРЕВОДРЧÐТÐ">
+ <string name="bing_api_key_not_verified">
+ Bing appID не подтвержден. Повторите попытку.
+ </string>
+ <string name="google_api_key_not_verified">
+ Ключ Google API не подтвержден. Повторите попытку.
+ </string>
+ <string name="bing_api_key_verified">
+ Bing appID подтвержден.
+ </string>
+ <string name="google_api_key_verified">
+ Ключ Google API подтвержден.
+ </string>
+ <check_box label="Включить машинный перевод при чате" name="translate_chat_checkbox"/>
+ <text name="translate_language_label">
+ Переводить чат на:
+ </text>
+ <combo_box name="translate_language_combo">
+ <combo_box.item label="Ñзык ÑиÑтемы" name="System Default Language"/>
+ <combo_box.item label="английÑкий" name="English"/>
+ <combo_box.item label="датÑкий" name="Danish"/>
+ <combo_box.item label="немецкий" name="German"/>
+ <combo_box.item label="иÑпанÑкий" name="Spanish"/>
+ <combo_box.item label="французÑкий" name="French"/>
+ <combo_box.item label="итальÑнÑкий" name="Italian"/>
+ <combo_box.item label="венгерÑкий" name="Hungarian"/>
+ <combo_box.item label="нидерландÑкий" name="Dutch"/>
+ <combo_box.item label="польÑкий" name="Polish"/>
+ <combo_box.item label="португальÑкий" name="Portugese"/>
+ <combo_box.item label="руÑÑкий" name="Russian"/>
+ <combo_box.item label="турецкий" name="Turkish"/>
+ <combo_box.item label="украинÑкий" name="Ukrainian"/>
+ <combo_box.item label="китайÑкий" name="Chinese"/>
+ <combo_box.item label="ÑпонÑкий" name="Japanese"/>
+ <combo_box.item label="корейÑкий" name="Korean"/>
+ </combo_box>
+ <text name="tip">
+ Выберите ÑÐµÑ€Ð²Ð¸Ñ Ð¿ÐµÑ€ÐµÐ²Ð¾Ð´Ð°:
+ </text>
+ <radio_group name="translation_service_rg">
+ <radio_item initial_value="bing" label="Bing Translator" name="bing"/>
+ <radio_item initial_value="google" label="Google Translate" name="google"/>
+ </radio_group>
+ <text name="bing_api_key_label">
+ Bing [http://www.bing.com/developers/createapp.aspx AppID]:
+ </text>
+ <button label="Подтвердить" name="verify_bing_api_key_btn"/>
+ <text name="google_api_key_label">
+ Google [http://code.google.com/apis/language/translate/v2/getting_started.html#auth Ключ API]:
+ </text>
+ <button label="Подтвердить" name="verify_google_api_key_btn"/>
+ <text name="google_links_text">
+ [http://code.google.com/apis/language/translate/v2/pricing.html Цены] | [https://code.google.com/apis/console СтатиÑтика]
+ </text>
+ <button label="OK" name="ok_btn"/>
+ <button label="Отмена" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_url_entry.xml b/indra/newview/skins/default/xui/ru/floater_url_entry.xml
new file mode 100644
index 0000000000..59f8dd0c31
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_url_entry.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="url_entry">
+ <text name="media_label">
+ URL-Ð°Ð´Ñ€ÐµÑ Ð¼ÑƒÐ»ÑŒÑ‚Ð¸Ð¼ÐµÐ´Ð¸Ð¹Ð½Ð¾Ð³Ð¾ реÑурÑа:
+ </text>
+ <button label="ОК" name="ok_btn"/>
+ <button label="Отмена" name="cancel_btn"/>
+ <button label="ОчиÑтить" name="clear_btn"/>
+ <text name="loading_label">
+ Загрузка...
+ </text>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_voice_controls.xml b/indra/newview/skins/default/xui/ru/floater_voice_controls.xml
new file mode 100644
index 0000000000..2b23086062
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_voice_controls.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_voice_controls" title="УПРÐВЛЕÐИЕ ГОЛОСОМ">
+ <string name="title_nearby">
+ ÐÐСТРОЙКИ ГОЛОСÐ
+ </string>
+ <string name="title_group">
+ ЗВОÐОК ГРУППЕ [GROUP]
+ </string>
+ <string name="title_adhoc">
+ КОÐФЕРЕÐЦИЯ
+ </string>
+ <string name="title_peer_2_peer">
+ ЗВОÐОК ПОЛЬЗОВÐТЕЛЮ [NAME]
+ </string>
+ <string name="no_one_near">
+ Ðет никого Ñ Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ‹Ð¼ голоÑом
+ </string>
+ <layout_stack name="my_call_stack">
+ <layout_panel name="my_panel">
+ <text name="user_text" value="Мой аватар:"/>
+ </layout_panel>
+ <layout_panel name="leave_call_panel">
+ <layout_stack name="voice_effect_and_leave_call_stack">
+ <layout_panel name="leave_call_btn_panel">
+ <button label="Прервать звонок" name="leave_call_btn"/>
+ </layout_panel>
+ </layout_stack>
+ </layout_panel>
+ </layout_stack>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_voice_effect.xml b/indra/newview/skins/default/xui/ru/floater_voice_effect.xml
new file mode 100644
index 0000000000..d4bf615fe4
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_voice_effect.xml
@@ -0,0 +1,138 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater label="МеÑта" name="voice_effects" title="ИЗМЕÐЕÐИЕ ГОЛОСÐ">
+ <string name="no_voice_effect">
+ (Ðет Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð³Ð¾Ð»Ð¾Ñа)
+ </string>
+ <string name="active_voice_effect">
+ (Ðктивно)
+ </string>
+ <string name="unsubscribed_voice_effect">
+ (Ðет подпиÑки)
+ </string>
+ <string name="new_voice_effect">
+ (Ðовый!)
+ </string>
+ <string name="effect_Arena">
+ Arena
+ </string>
+ <string name="effect_Beast">
+ Beast
+ </string>
+ <string name="effect_Buff">
+ Buff
+ </string>
+ <string name="effect_Buzz">
+ Buzz
+ </string>
+ <string name="effect_Camille">
+ Camille
+ </string>
+ <string name="effect_Creepy">
+ Creepy
+ </string>
+ <string name="effect_CreepyBot">
+ CreepyBot
+ </string>
+ <string name="effect_Cyber">
+ Cyber
+ </string>
+ <string name="effect_DeepBot">
+ DeepBot
+ </string>
+ <string name="effect_Demon">
+ Demon
+ </string>
+ <string name="effect_Flirty">
+ Flirty
+ </string>
+ <string name="effect_Foxy">
+ Foxy
+ </string>
+ <string name="effect_Halloween_2010_Bonus">
+ БонуÑ_за_Ð¥Ñллоуин_2010
+ </string>
+ <string name="effect_Helium">
+ Helium
+ </string>
+ <string name="effect_Husky">
+ Husky
+ </string>
+ <string name="effect_Intercom">
+ ВнутреннÑÑ ÑвÑзь
+ </string>
+ <string name="effect_Macho">
+ Macho
+ </string>
+ <string name="effect_Micro">
+ Micro
+ </string>
+ <string name="effect_Mini">
+ Mini
+ </string>
+ <string name="effect_Nano">
+ Nano
+ </string>
+ <string name="effect_Nightmare">
+ Nightmare
+ </string>
+ <string name="effect_PopBot">
+ PopBot
+ </string>
+ <string name="effect_Rachel">
+ Rachel
+ </string>
+ <string name="effect_Radio">
+ Radio
+ </string>
+ <string name="effect_Robot">
+ Robot
+ </string>
+ <string name="effect_Roxanne">
+ Roxanne
+ </string>
+ <string name="effect_Sabrina">
+ Sabrina
+ </string>
+ <string name="effect_Samantha">
+ Samantha
+ </string>
+ <string name="effect_Sexy">
+ Sexy
+ </string>
+ <string name="effect_Shorty">
+ Shorty
+ </string>
+ <string name="effect_Sneaky">
+ Sneaky
+ </string>
+ <string name="effect_Stallion">
+ Stallion
+ </string>
+ <string name="effect_Sultry">
+ Sultry
+ </string>
+ <string name="effect_Thunder">
+ Thunder
+ </string>
+ <string name="effect_Vixen">
+ Vixen
+ </string>
+ <string name="effect_WhinyBot">
+ WhinyBot
+ </string>
+ <text name="preview_text">
+ ПроÑлушивание
+ </text>
+ <text name="status_text">
+ Запишите образец, затем щелкните, чтобы уÑлышать, как будет звучать голоÑ.
+ </text>
+ <button label="ЗапиÑÑŒ" name="record_btn" tool_tip="ЗапиÑать образец вашего голоÑа."/>
+ <button label="Стоп" name="record_stop_btn"/>
+ <text name="voice_morphing_link">
+ [[URL] ПодпиÑатьÑÑ]
+ </text>
+ <scroll_list name="voice_effect_list" tool_tip="Запишите образец вашего голоÑа, затем щелкните, чтобы проÑлушать Ñффект.">
+ <scroll_list.columns label="Ðазвание голоÑа" name="name"/>
+ <scroll_list.columns label="ИÑтекает" name="expires"/>
+ </scroll_list>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_water.xml b/indra/newview/skins/default/xui/ru/floater_water.xml
new file mode 100644
index 0000000000..5030351f5b
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_water.xml
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Water Floater" title="РÐСШИРЕÐÐЫЙ РЕДÐКТОР ВОДЫ">
+ <floater.string name="WLDefaultWaterNames">
+ По умолчанию:глÑнец:пруд:туман:Second Plague:SNAKE!!!:Valdez
+ </floater.string>
+ <text name="KeyFramePresetsText">
+ ÐаÑтройки воды:
+ </text>
+ <button label="Создать" label_selected="Создать" name="WaterNewPreset"/>
+ <button label="Сохранить" label_selected="Сохранить" name="WaterSavePreset"/>
+ <button label="Удалить" label_selected="Удалить" name="WaterDeletePreset"/>
+ <tab_container name="Water Tabs">
+ <panel label="ÐÐСТРОЙКИ" name="Settings">
+ <text name="BHText">
+ Цвет водного тумана
+ </text>
+ <color_swatch name="WaterFogColor" tool_tip="Щелкните Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° цвета"/>
+ <text name="WaterFogDensText">
+ ПлотноÑть тумана
+ </text>
+ <text name="WaterUnderWaterFogModText">
+ Подводный туман
+ </text>
+ <text name="BDensText">
+ Уровень Ð¾Ñ‚Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð²Ð¾Ð»Ð½
+ </text>
+ <slider label="1" name="WaterNormalScaleX"/>
+ <slider label="2" name="WaterNormalScaleY"/>
+ <slider label="3" name="WaterNormalScaleZ"/>
+ <text name="HDText">
+ МаÑштаб ФренелÑ
+ </text>
+ <text name="FresnelOffsetText">
+ Сдвиг ФренелÑ
+ </text>
+ <text name="DensMultText">
+ Преломление над водой
+ </text>
+ <text name="WaterScaleBelowText">
+ Преломление под водой
+ </text>
+ <text name="MaxAltText">
+ КоÑффициент размытиÑ
+ </text>
+ </panel>
+ <panel label="ИЗОБРÐЖЕÐИЕ" name="Waves">
+ <text name="BHText">
+ Ðаправление больших волн
+ </text>
+ <text name="WaterWave1DirXText">
+ X
+ </text>
+ <text name="WaterWave1DirYText">
+ Y
+ </text>
+ <text name="BHText2">
+ Ðаправление маленьких волн
+ </text>
+ <text name="WaterWave2DirXText">
+ X
+ </text>
+ <text name="WaterWave2DirYText">
+ Y
+ </text>
+ <text name="BHText3">
+ Карта поверхноÑти
+ </text>
+ </panel>
+ </tab_container>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_web_content.xml b/indra/newview/skins/default/xui/ru/floater_web_content.xml
new file mode 100644
index 0000000000..403ab0ef5d
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_web_content.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_web_content" title="">
+ <layout_stack name="stack1">
+ <layout_panel name="nav_controls">
+ <button name="back" tool_tip="Ðазад"/>
+ <button name="forward" tool_tip="Вперед"/>
+ <button name="stop" tool_tip="ОÑтановить"/>
+ <button name="reload" tool_tip="Обновить"/>
+ <combo_box name="address" tool_tip="Введите URL-Ð°Ð´Ñ€ÐµÑ Ñтраницы"/>
+ <icon name="media_secure_lock_flag" tool_tip="БезопаÑный проÑмотр"/>
+ <button name="popexternal" tool_tip="Открыть текущий URL-Ð°Ð´Ñ€ÐµÑ Ð² вашем браузере"/>
+ </layout_panel>
+ </layout_stack>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_whitelist_entry.xml b/indra/newview/skins/default/xui/ru/floater_whitelist_entry.xml
new file mode 100644
index 0000000000..811a2756fa
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_whitelist_entry.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="whitelist_entry" title="БЕЛЫЙ СПИСОК">
+ <text name="media_label">
+ Введите URL-Ð°Ð´Ñ€ÐµÑ Ð¸Ð»Ð¸ шаблон URL-адреÑа Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð² ÑпиÑок разрешенных доменов
+ </text>
+ <line_editor name="whitelist_entry" tool_tip="Введите URL-Ð°Ð´Ñ€ÐµÑ Ð¸Ð»Ð¸ шаблон URL-адреÑа в белый ÑпиÑок"/>
+ <button label="OK" name="ok_btn"/>
+ <button label="Отмена" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_windlight_options.xml b/indra/newview/skins/default/xui/ru/floater_windlight_options.xml
new file mode 100644
index 0000000000..bbb37aaaa0
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_windlight_options.xml
@@ -0,0 +1,167 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="WindLight floater" title="РÐСШИРЕÐÐЫЙ РЕДÐКТОР ÐЕБÐ">
+ <floater.string name="WLDefaultSkyNames">
+ A-12AM:A-12PM:A-3AM:A-3PM:A-4.30PM:A-6AM:A-6PM:A-9AM:A-9PM:Barcelona:Blizzard:Blue Midday:Coastal Afternoon:Coastal Sunset:Default:Desert Sunset:Fine Day:Fluffy Big Clouds:Foggy:Funky Funky:Funky Funky Funky:Gelatto:Ghost:Incongruent Truths:Midday 1:Midday 2:Midday 3:Midday 4:Night:Pirate:Purple:Sailor&apos;s Delight:Sheer Sensuality
+ </floater.string>
+ <text name="KeyFramePresetsText">
+ ÐаÑтройки неба:
+ </text>
+ <button label="ÐоваÑ" label_selected="ÐоваÑ" name="WLNewPreset"/>
+ <button label="Сохранить" label_selected="Сохранить" name="WLSavePreset"/>
+ <button label="Удалить" label_selected="Удалить" name="WLDeletePreset"/>
+ <button label="Редактор Ñуточных циклов" label_selected="Редактор Ñуточных циклов" name="WLDayCycleMenuButton"/>
+ <tab_container name="WindLight Tabs">
+ <panel label="ÐТМОСФЕРÐ" name="Atmosphere">
+ <text name="BHText">
+ Голубой горизонт
+ </text>
+ <text name="BHText2">
+ R
+ </text>
+ <text name="BHText3">
+ G
+ </text>
+ <text name="BHText4">
+ B
+ </text>
+ <text name="BHText5">
+ I
+ </text>
+ <text name="BDensText">
+ Дымка на горизонте
+ </text>
+ <text name="BDensText2">
+ ÐаÑыщенноÑть голубого
+ </text>
+ <text name="BHText6">
+ R
+ </text>
+ <text name="BHText7">
+ G
+ </text>
+ <text name="BHText8">
+ B
+ </text>
+ <text name="BHText9">
+ I
+ </text>
+ <text name="HDText">
+ ПлотноÑть дымки
+ </text>
+ <text name="DensMultText">
+ КоÑффициент плотноÑти
+ </text>
+ <text name="WLDistanceMultText">
+ КоÑффициент раÑÑтоÑниÑ
+ </text>
+ <text name="MaxAltText">
+ МакÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ð²Ñ‹Ñота
+ </text>
+ </panel>
+ <panel label="ОСВЕЩЕÐИЕ" name="Lighting">
+ <text name="SLCText">
+ Цвет Ñолнца/луны
+ </text>
+ <text name="BHText">
+ R
+ </text>
+ <text name="BHText2">
+ G
+ </text>
+ <text name="BHText3">
+ B
+ </text>
+ <text name="BHText4">
+ I
+ </text>
+ <text name="TODText">
+ Положение Ñолнца/луны
+ </text>
+ <text name="WLAmbientText">
+ РаÑÑеÑнное
+ </text>
+ <text name="BHText5">
+ R
+ </text>
+ <text name="BHText6">
+ G
+ </text>
+ <text name="BHText7">
+ B
+ </text>
+ <text name="BHText8">
+ I
+ </text>
+ <text name="WLEastAngleText">
+ Смещение отноÑительно воÑтока
+ </text>
+ <text name="SunGlowText">
+ СиÑние Ñолнца
+ </text>
+ <slider label="ФокуÑ" name="WLGlowB"/>
+ <slider label="Размер" name="WLGlowR"/>
+ <text name="SceneGammaText">
+ Гамма-ÐºÐ¾Ñ€Ñ€ÐµÐºÑ†Ð¸Ñ Ñцены
+ </text>
+ <text name="WLStarText">
+ ЯркоÑть звезд
+ </text>
+ </panel>
+ <panel label="ОБЛÐКÐ" name="Clouds">
+ <text name="WLCloudColorText">
+ Цвет
+ </text>
+ <text name="BHText">
+ R
+ </text>
+ <text name="BHText2">
+ G
+ </text>
+ <text name="BHText3">
+ B
+ </text>
+ <text name="BHText4">
+ I
+ </text>
+ <text name="WLCloudColorText2">
+ Положение и плотноÑть
+ </text>
+ <text name="BHText5">
+ X
+ </text>
+ <text name="BHText6">
+ Y
+ </text>
+ <text name="BHText7">
+ П
+ </text>
+ <text name="WLCloudCoverageText">
+ ОблачноÑть
+ </text>
+ <text name="WLCloudScaleText">
+ Размеры
+ </text>
+ <text name="WLCloudDetailText">
+ Ð”ÐµÑ‚Ð°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñ (положение/плотноÑть)
+ </text>
+ <text name="BHText8">
+ X
+ </text>
+ <text name="BHText9">
+ Y
+ </text>
+ <text name="BHText10">
+ П
+ </text>
+ <text name="WLCloudScrollXText">
+ СкороÑть по X
+ </text>
+ <check_box label="Ðа меÑте" name="WLCloudLockX"/>
+ <text name="WLCloudScrollYText">
+ СкороÑть по Y
+ </text>
+ <check_box label="Ðа меÑте" name="WLCloudLockY"/>
+ <check_box label="Создать клаÑÑичеÑкие облака" name="DrawClassicClouds"/>
+ </panel>
+ </tab_container>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_window_size.xml b/indra/newview/skins/default/xui/ru/floater_window_size.xml
new file mode 100644
index 0000000000..24865a6ba5
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_window_size.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="window_size" title="РÐЗМЕР ОКÐÐ">
+ <string name="resolution_format">
+ [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"/>
+ <combo_box.item label="1024 x 768" name="item1"/>
+ <combo_box.item label="1280 x 720 (720p)" name="item2"/>
+ <combo_box.item label="1920 x 1080 (1080p)" name="item3"/>
+ </combo_box>
+ <button label="Задать" name="set_btn"/>
+ <button label="Отмена" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_world_map.xml b/indra/newview/skins/default/xui/ru/floater_world_map.xml
new file mode 100644
index 0000000000..ef8dfe22ae
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_world_map.xml
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="worldmap" title="КÐРТРМИРÐ">
+ <panel name="layout_panel_1">
+ <text name="events_label">
+ ОбозначениÑ
+ </text>
+ </panel>
+ <panel name="layout_panel_2">
+ <button name="Show My Location" tool_tip="Центрировать карту на позиции моего аватара"/>
+ <text name="me_label">
+ Я
+ </text>
+ <text name="person_label">
+ Люди
+ </text>
+ <text name="infohub_label">
+ Инфохаб
+ </text>
+ <text name="land_sale_label">
+ Продажа земли
+ </text>
+ <text name="auction_label">
+ Ñ Ð°ÑƒÐºÑ†Ð¸Ð¾Ð½Ð°
+ </text>
+ <text name="by_owner_label">
+ владельцем
+ </text>
+ <button name="Go Home" tool_tip="Ð¢ÐµÐ»ÐµÐ¿Ð¾Ñ€Ñ‚Ð°Ñ†Ð¸Ñ Ð´Ð¾Ð¼Ð¾Ð¹"/>
+ <text name="Home_label">
+ Дом
+ </text>
+ <text name="events_label">
+ СобытиÑ:
+ </text>
+ <text name="pg_label">
+ Общие
+ </text>
+ <check_box initial_value="иÑтина" name="events_mature_chk"/>
+ <text name="events_mature_label">
+ Умеренные
+ </text>
+ <text name="events_adult_label">
+ Ð”Ð»Ñ Ð²Ð·Ñ€Ð¾Ñлых
+ </text>
+ </panel>
+ <panel name="layout_panel_3">
+ <text name="find_on_map_label">
+ Ðайти на карте
+ </text>
+ </panel>
+ <panel name="layout_panel_4">
+ <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.item label="Мои закладки" name="item1"/>
+ </combo_box>
+ <search_editor label="Ðазвание региона" name="location" tool_tip="Введите название региона"/>
+ <button label="ПоиÑк" name="DoSearch" tool_tip="ПоиÑк региона"/>
+ <button name="Clear" tool_tip="ОчиÑтить отÑлеживание и ÑброÑить карту до Ñтандартного вида"/>
+ <text name="events_label">
+ МеÑто:
+ </text>
+ <button label="ТелепортациÑ" name="Teleport" tool_tip="Ð¢ÐµÐ»ÐµÐ¿Ð¾Ñ€Ñ‚Ð°Ñ†Ð¸Ñ Ð² выбранное меÑто"/>
+ <button label="Копировать URL SL" name="copy_slurl" tool_tip="Копировать текущее меÑто в виде URL-адреÑа SL Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² интернете."/>
+ <button label="Показать выбранное" name="Show Destination" tool_tip="Центрировать карту на выбранном меÑте"/>
+ </panel>
+ <panel name="layout_panel_5">
+ <text name="zoom_label">
+ Увеличение
+ </text>
+ </panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/inspect_avatar.xml b/indra/newview/skins/default/xui/ru/inspect_avatar.xml
new file mode 100644
index 0000000000..e38ae967cc
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/inspect_avatar.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!--
+ Not can_close / no title to avoid window chrome
+ Single instance - only have one at a time, recycle it each spawn
+-->
+<floater name="inspect_avatar">
+ <string name="Subtitle">
+ [AGE]
+ </string>
+ <string name="Details">
+ [SL_PROFILE]
+ </string>
+ <text name="user_subtitle" value="11 меÑÑцев и 3 Ð´Ð½Ñ Ð½Ð°Ð·Ð°Ð´"/>
+ <text name="user_details">
+ Это мое опиÑание Second Life и Ñ Ð´ÑƒÐ¼Ð°ÑŽ, что оно великолепно. Ðо почему-то из-за моей любви к долгим разговорам оно оказалоÑÑŒ Ñлишком длинным
+ </text>
+ <slider name="volume_slider" tool_tip="ГромкоÑть голоÑа" value="0.5"/>
+ <button label="Добавить в друзьÑ" name="add_friend_btn"/>
+ <button label="IM" name="im_btn"/>
+ <button label="Профиль" name="view_profile_btn"/>
+ <panel name="moderator_panel">
+ <button label="Отключить голоÑ" name="disable_voice"/>
+ <button label="Включить голоÑ" name="enable_voice"/>
+ </panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/inspect_group.xml b/indra/newview/skins/default/xui/ru/inspect_group.xml
new file mode 100644
index 0000000000..ca600b0a1f
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/inspect_group.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!--
+ Not can_close / no title to avoid window chrome
+ Single instance - only have one at a time, recycle it each spawn
+-->
+<floater name="inspect_group">
+ <string name="PrivateGroup">
+ ЧаÑÑ‚Ð½Ð°Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ð°
+ </string>
+ <string name="FreeToJoin">
+ БеÑплатное вÑтупление
+ </string>
+ <string name="CostToJoin">
+ L$[AMOUNT] за вÑтупление
+ </string>
+ <string name="YouAreMember">
+ Ð’Ñ‹ учаÑтник группы
+ </string>
+ <text name="group_subtitle">
+ 123 учаÑтника
+ </text>
+ <text name="group_details">
+ Группа жителей, которые могут Ñоздавать комнату Ñ Ð»Ð¾Ñем.
+БойÑÑ Ð»Ð¾ÑÑ! БойÑÑ! И мангуÑта тоже!
+ </text>
+ <text name="group_cost">
+ L$123 за вÑтупление
+ </text>
+ <button label="Ð’Ñтупить" name="join_btn"/>
+ <button label="Покинуть" name="leave_btn"/>
+ <button label="Смотреть профиль" name="view_profile_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/inspect_object.xml b/indra/newview/skins/default/xui/ru/inspect_object.xml
new file mode 100644
index 0000000000..1a43357cd3
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/inspect_object.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!--
+ Not can_close / no title to avoid window chrome
+ Single instance - only have one at a time, recycle it each spawn
+-->
+<floater name="inspect_object">
+ <string name="Creator">
+ От [CREATOR]
+ </string>
+ <string name="CreatorAndOwner">
+ От [CREATOR]
+Владелец [OWNER]
+ </string>
+ <string name="Price">
+ L$[AMOUNT]
+ </string>
+ <string name="PriceFree">
+ БеÑплатно!
+ </string>
+ <string name="Touch">
+ КоÑнутьÑÑ
+ </string>
+ <string name="Sit">
+ СеÑть
+ </string>
+ <text name="object_creator">
+ от secondlife:///app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/about
+владелец secondlife:///app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/about
+ </text>
+ <text name="price_text">
+ L$30,000
+ </text>
+ <icon name="secure_browsing" tool_tip="БезопаÑный проÑмотр"/>
+ <text name="object_media_url">
+ http://www.superdupertest.com
+ </text>
+ <button label="Купить" name="buy_btn"/>
+ <button label="Заплатить" name="pay_btn"/>
+ <button label="ВзÑть копию" name="take_free_copy_btn"/>
+ <button label="КоÑнутьÑÑ" name="touch_btn"/>
+ <button label="СеÑть" name="sit_btn"/>
+ <button label="Открыто" name="open_btn"/>
+ <button label="Больше" name="more_info_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/inspect_remote_object.xml b/indra/newview/skins/default/xui/ru/inspect_remote_object.xml
new file mode 100644
index 0000000000..eec4817f02
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/inspect_remote_object.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!--
+ Not can_close / no title to avoid window chrome
+ Single instance - only have one at a time, recycle it each spawn
+-->
+<floater name="inspect_remote_object">
+ <text name="object_name">
+ Проверка очень длинного имени объекта. О боже, поверить не могу что Ð¸Ð¼Ñ Ñтого объекта может быть таким длинным, чеÑтно!
+ </text>
+ <text name="object_owner_label">
+ Владелец:
+ </text>
+ <text name="object_owner">
+ ДлинноеимÑаватара ДжонÑонзначитÑынджона
+ </text>
+ <text name="object_slurl">
+ http://slurl.com/Ahern/50/50/50
+ </text>
+ <button label="Карта" name="map_btn"/>
+ <button label="Заблокировать" name="block_btn"/>
+ <button label="Закрыть" name="close_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/menu_add_wearable_gear.xml b/indra/newview/skins/default/xui/ru/menu_add_wearable_gear.xml
new file mode 100644
index 0000000000..786e571527
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_add_wearable_gear.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="Add Wearable Gear Menu">
+ <menu_item_check label="Сортировать по времени" name="sort_by_most_recent"/>
+ <menu_item_check label="Сортировать по имени" name="sort_by_name"/>
+ <menu_item_check label="Сортировать по типу" name="sort_by_type"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_attachment_other.xml b/indra/newview/skins/default/xui/ru/menu_attachment_other.xml
new file mode 100644
index 0000000000..fb1c24448b
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_attachment_other.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- *NOTE: See also menu_avatar_other.xml -->
+<context_menu name="Avatar Pie">
+ <menu_item_call label="Смотреть профиль" name="Profile..."/>
+ <menu_item_call label="Ð’ друзьÑ" name="Add Friend"/>
+ <menu_item_call label="IM" name="Send IM..."/>
+ <menu_item_call label="Звонок" name="Call"/>
+ <menu_item_call label="ПриглаÑить в группу" name="Invite..."/>
+ <menu_item_call label="Заблокировать" name="Avatar Mute"/>
+ <menu_item_call label="ПожаловатьÑÑ" name="abuse"/>
+ <menu_item_call label="Заморозить" name="Freeze..."/>
+ <menu_item_call label="Выкинуть" name="Eject..."/>
+ <menu_item_call label="Отладка текÑтур" name="Debug..."/>
+ <menu_item_call label="Приблизить" name="Zoom In"/>
+ <menu_item_call label="Заплатить" name="Pay..."/>
+ <menu_item_call label="Профиль объекта" name="Object Inspect"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_attachment_self.xml b/indra/newview/skins/default/xui/ru/menu_attachment_self.xml
new file mode 100644
index 0000000000..f241b48871
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_attachment_self.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Attachment Pie">
+ <menu_item_call label="КоÑнутьÑÑ" name="Attachment Object Touch"/>
+ <menu_item_call label="Изменить" name="Edit..."/>
+ <menu_item_call label="ОтÑоединить" name="Detach"/>
+ <menu_item_call label="СеÑть" name="Sit Down Here"/>
+ <menu_item_call label="Ð’Ñтать" name="Stand Up"/>
+ <menu_item_call label="Мой внешний вид" name="Change Outfit"/>
+ <menu_item_call label="Изменить коÑтюм" name="Edit Outfit"/>
+ <menu_item_call label="Изменить фигуру" name="Edit My Shape"/>
+ <menu_item_call label="Мои друзьÑ" name="Friends..."/>
+ <menu_item_call label="Мои группы" name="Groups..."/>
+ <menu_item_call label="Мой профиль" name="Profile..."/>
+ <menu_item_call label="Отладка текÑтур" name="Debug..."/>
+ <menu_item_call label="БроÑить" name="Drop"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_avatar_icon.xml b/indra/newview/skins/default/xui/ru/menu_avatar_icon.xml
new file mode 100644
index 0000000000..ac2b4be003
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_avatar_icon.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Avatar Icon Menu">
+ <menu_item_call label="Открыть профиль" name="Show Profile"/>
+ <menu_item_call label="Отправить Ñообщение..." name="Send IM"/>
+ <menu_item_call label="Добавить в друзьÑ..." name="Add Friend"/>
+ <menu_item_call label="Удалить из друзей..." name="Remove Friend"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_avatar_other.xml b/indra/newview/skins/default/xui/ru/menu_avatar_other.xml
new file mode 100644
index 0000000000..fb283c9d80
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_avatar_other.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- *NOTE: See also menu_attachment_other.xml -->
+<context_menu name="Avatar Pie">
+ <menu_item_call label="Смотреть профиль" name="Profile..."/>
+ <menu_item_call label="Ð’ друзьÑ" name="Add Friend"/>
+ <menu_item_call label="IM" name="Send IM..."/>
+ <menu_item_call label="Звонок" name="Call"/>
+ <menu_item_call label="ПриглаÑить в группу" name="Invite..."/>
+ <menu_item_call label="Заблокировать" name="Avatar Mute"/>
+ <menu_item_call label="ПожаловатьÑÑ" name="abuse"/>
+ <menu_item_call label="Заморозить" name="Freeze..."/>
+ <menu_item_call label="Выкинуть" name="Eject..."/>
+ <menu_item_call label="Отладка текÑтур" name="Debug..."/>
+ <menu_item_call label="Приблизить" name="Zoom In"/>
+ <menu_item_call label="Заплатить" name="Pay..."/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_avatar_self.xml b/indra/newview/skins/default/xui/ru/menu_avatar_self.xml
new file mode 100644
index 0000000000..b72f3dcc42
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_avatar_self.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Self Pie">
+ <menu_item_call label="СеÑть" name="Sit Down Here"/>
+ <menu_item_call label="Ð’Ñтать" name="Stand Up"/>
+ <context_menu label="СнÑть" name="Take Off &gt;">
+ <context_menu label="одежду" name="Clothes &gt;">
+ <menu_item_call label="рубашку" name="Shirt"/>
+ <menu_item_call label="брюки" name="Pants"/>
+ <menu_item_call label="юбку" name="Skirt"/>
+ <menu_item_call label="обувь" name="Shoes"/>
+ <menu_item_call label="ноÑки" name="Socks"/>
+ <menu_item_call label="пиджак" name="Jacket"/>
+ <menu_item_call label="перчатки" name="Gloves"/>
+ <menu_item_call label="майку" name="Self Undershirt"/>
+ <menu_item_call label="труÑÑ‹" name="Self Underpants"/>
+ <menu_item_call label="тату" name="Self Tattoo"/>
+ <menu_item_call label="физичеÑкие данные" name="Self Physics"/>
+ <menu_item_call label="альфа-маÑку" name="Self Alpha"/>
+ <menu_item_call label="вÑÑŽ одежду" name="All Clothes"/>
+ </context_menu>
+ <context_menu label="данные в игре" name="Object Detach HUD"/>
+ <context_menu label="ОтÑоединить" name="Object Detach"/>
+ <menu_item_call label="ОтÑоединить вÑе" name="Detach All"/>
+ </context_menu>
+ <menu_item_call label="Мой внешний вид" name="Chenge Outfit"/>
+ <menu_item_call label="Изменить коÑтюм" name="Edit Outfit"/>
+ <menu_item_call label="Изменить фигуру" name="Edit My Shape"/>
+ <menu_item_call label="Мои друзьÑ" name="Friends..."/>
+ <menu_item_call label="Мои группы" name="Groups..."/>
+ <menu_item_call label="Мой профиль" name="Profile..."/>
+ <menu_item_call label="Отладка текÑтур" name="Debug..."/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_bottomtray.xml b/indra/newview/skins/default/xui/ru/menu_bottomtray.xml
new file mode 100644
index 0000000000..fa3558945b
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_bottomtray.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="hide_camera_move_controls_menu">
+ <menu_item_check label="Кнопка разговора" name="EnableVoiceChat"/>
+ <menu_item_check label="Кнопка жеÑтов" name="ShowGestureButton"/>
+ <menu_item_check label="Кнопка движениÑ" name="ShowMoveButton"/>
+ <menu_item_check label="Кнопка камеры" name="ShowCameraButton"/>
+ <menu_item_check label="Кнопка Ñнимка" name="ShowSnapshotButton"/>
+ <menu_item_check label="Кнопка ÑтроительÑтва" name="ShowBuildButton"/>
+ <menu_item_check label="Кнопка поиÑка" name="ShowSearchButton"/>
+ <menu_item_check label="Кнопка карты" name="ShowWorldMapButton"/>
+ <menu_item_check label="Кнопка миникарты" name="ShowMiniMapButton"/>
+ <menu_item_call label="Вырезать" name="NearbyChatBar_Cut"/>
+ <menu_item_call label="Копировать" name="NearbyChatBar_Copy"/>
+ <menu_item_call label="Ð’Ñтавить" name="NearbyChatBar_Paste"/>
+ <menu_item_call label="Удалить" name="NearbyChatBar_Delete"/>
+ <menu_item_call label="Выделить вÑе" name="NearbyChatBar_Select_All"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_cof_attachment.xml b/indra/newview/skins/default/xui/ru/menu_cof_attachment.xml
new file mode 100644
index 0000000000..72d1bc52b5
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_cof_attachment.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="COF Attachment">
+ <menu_item_call label="ОтÑоединить" name="detach"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_cof_body_part.xml b/indra/newview/skins/default/xui/ru/menu_cof_body_part.xml
new file mode 100644
index 0000000000..ee0a0c70ed
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_cof_body_part.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="COF Body">
+ <menu_item_call label="Заменить" name="replace"/>
+ <menu_item_call label="Изменить" name="edit"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_cof_clothing.xml b/indra/newview/skins/default/xui/ru/menu_cof_clothing.xml
new file mode 100644
index 0000000000..bbdf4fd0d4
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_cof_clothing.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="COF Clothing">
+ <menu_item_call label="СнÑть" name="take_off"/>
+ <menu_item_call label="Изменить" name="edit"/>
+ <menu_item_call label="Заменить" name="replace"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_cof_gear.xml b/indra/newview/skins/default/xui/ru/menu_cof_gear.xml
new file mode 100644
index 0000000000..0332c03a04
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_cof_gear.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="Gear COF">
+ <menu label="ÐÐ¾Ð²Ð°Ñ Ð¾Ð´ÐµÐ¶Ð´Ð°" name="COF.Gear.New_Clothes"/>
+ <menu label="Ðовые чаÑти тела" name="COF.Geear.New_Body_Parts"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_edit.xml b/indra/newview/skins/default/xui/ru/menu_edit.xml
new file mode 100644
index 0000000000..0dddea9c04
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_edit.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu label="Изменить" name="Edit">
+ <menu_item_call label="Отменить" name="Undo"/>
+ <menu_item_call label="Вернуть" name="Redo"/>
+ <menu_item_call label="Вырезать" name="Cut"/>
+ <menu_item_call label="Копировать" name="Copy"/>
+ <menu_item_call label="Ð’Ñтавить" name="Paste"/>
+ <menu_item_call label="Удалить" name="Delete"/>
+ <menu_item_call label="Дублировать" name="Duplicate"/>
+ <menu_item_call label="Выделить вÑе" name="Select All"/>
+ <menu_item_call label="Отменить выделение" name="Deselect"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_favorites.xml b/indra/newview/skins/default/xui/ru/menu_favorites.xml
new file mode 100644
index 0000000000..074be06ba9
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_favorites.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Popup">
+ <menu_item_call label="Телепорт" name="Teleport To Landmark"/>
+ <menu_item_call label="Смотреть/изменить закладку" name="Landmark Open"/>
+ <menu_item_call label="Копировать URL-Ð°Ð´Ñ€ÐµÑ SL" name="Copy slurl"/>
+ <menu_item_call label="Показать на карте" name="Show On Map"/>
+ <menu_item_call label="Копировать" name="Landmark Copy"/>
+ <menu_item_call label="Ð’Ñтавить" name="Landmark Paste"/>
+ <menu_item_call label="Удалить" name="Delete"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_gesture_gear.xml b/indra/newview/skins/default/xui/ru/menu_gesture_gear.xml
new file mode 100644
index 0000000000..d0b68cefbd
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_gesture_gear.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="menu_gesture_gear">
+ <menu_item_call label="Добавить в избранное/удалить" name="activate"/>
+ <menu_item_call label="Копировать" name="copy_gesture"/>
+ <menu_item_call label="Ð’Ñтавить" name="paste"/>
+ <menu_item_call label="Копировать UUID" name="copy_uuid"/>
+ <menu_item_call label="Сохранить в текущий коÑтюм" name="save_to_outfit"/>
+ <menu_item_call label="Изменить" name="edit_gesture"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_group_plus.xml b/indra/newview/skins/default/xui/ru/menu_group_plus.xml
new file mode 100644
index 0000000000..edd012b964
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_group_plus.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_group_plus">
+ <menu_item_call label="ПриÑоединитьÑÑ Ðº группе..." name="item_join"/>
+ <menu_item_call label="ÐÐ¾Ð²Ð°Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ð°..." name="item_new"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_hide_navbar.xml b/indra/newview/skins/default/xui/ru/menu_hide_navbar.xml
new file mode 100644
index 0000000000..34e5f4c0e4
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_hide_navbar.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="hide_navbar_menu">
+ <menu_item_check label="Показать панель навигации и избранного" name="ShowNavbarNavigationPanel"/>
+ <menu_item_check label="Показать панель избранного" name="ShowNavbarFavoritesPanel"/>
+ <menu_item_check label="Показать мини-панель меÑтоположениÑ" name="ShowMiniLocationPanel"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_im_well_button.xml b/indra/newview/skins/default/xui/ru/menu_im_well_button.xml
new file mode 100644
index 0000000000..5a5bde61b9
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_im_well_button.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="IM Well Button Context Menu">
+ <menu_item_call label="Закрыть вÑе" name="Close All"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_imchiclet_adhoc.xml b/indra/newview/skins/default/xui/ru/menu_imchiclet_adhoc.xml
new file mode 100644
index 0000000000..8b60a585ab
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_imchiclet_adhoc.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="IMChiclet AdHoc Menu">
+ <menu_item_call label="Завершить ÑеанÑ" name="End Session"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_imchiclet_group.xml b/indra/newview/skins/default/xui/ru/menu_imchiclet_group.xml
new file mode 100644
index 0000000000..766b3847a7
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_imchiclet_group.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="IMChiclet Group Menu">
+ <menu_item_call label="Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ группе" name="Show Profile"/>
+ <menu_item_call label="Показать ÑеанÑ" name="Chat"/>
+ <menu_item_call label="Завершить ÑеанÑ" name="End Session"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_imchiclet_p2p.xml b/indra/newview/skins/default/xui/ru/menu_imchiclet_p2p.xml
new file mode 100644
index 0000000000..a33f6d5be8
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_imchiclet_p2p.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="IMChiclet P2P Menu">
+ <menu_item_call label="Смотреть профиль" name="Show Profile"/>
+ <menu_item_call label="Ð’ друзьÑ" name="Add Friend"/>
+ <menu_item_call label="Показать ÑеанÑ" name="Send IM"/>
+ <menu_item_call label="Завершить ÑеанÑ" name="End Session"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_inspect_avatar_gear.xml b/indra/newview/skins/default/xui/ru/menu_inspect_avatar_gear.xml
new file mode 100644
index 0000000000..957609a7a3
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_inspect_avatar_gear.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<toggleable_menu name="Gear Menu">
+ <menu_item_call label="Смотреть профиль" name="view_profile"/>
+ <menu_item_call label="Ð’ друзьÑ" name="add_friend"/>
+ <menu_item_call label="IM" name="im"/>
+ <menu_item_call label="Звонок" name="call"/>
+ <menu_item_call label="Телепорт" name="teleport"/>
+ <menu_item_call label="ПриглаÑить в группу" name="invite_to_group"/>
+ <menu_item_call label="Заблокировать" name="block"/>
+ <menu_item_call label="Разблокировать" name="unblock"/>
+ <menu_item_call label="ПожаловатьÑÑ" name="report"/>
+ <menu_item_call label="Заморозить" name="freeze"/>
+ <menu_item_call label="Выкинуть" name="eject"/>
+ <menu_item_call label="Выкинуть" name="kick"/>
+ <menu_item_call label="Поддержка" name="csr"/>
+ <menu_item_call label="Отладка текÑтур" name="debug"/>
+ <menu_item_call label="Ðайти на карте" name="find_on_map"/>
+ <menu_item_call label="Приблизить" name="zoom_in"/>
+ <menu_item_call label="Заплатить" name="pay"/>
+ <menu_item_call label="ПоделитьÑÑ" name="share"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_inspect_object_gear.xml b/indra/newview/skins/default/xui/ru/menu_inspect_object_gear.xml
new file mode 100644
index 0000000000..a72b2bef23
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_inspect_object_gear.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<toggleable_menu name="Gear Menu">
+ <menu_item_call label="КоÑнутьÑÑ" name="touch"/>
+ <menu_item_call label="СеÑть" name="sit"/>
+ <menu_item_call label="Заплатить" name="pay"/>
+ <menu_item_call label="Купить" name="buy"/>
+ <menu_item_call label="ВзÑть" name="take"/>
+ <menu_item_call label="ВзÑть копию" name="take_copy"/>
+ <menu_item_call label="Открыть" name="open"/>
+ <menu_item_call label="Изменить" name="edit"/>
+ <menu_item_call label="Ðадеть" name="wear"/>
+ <menu_item_call label="Добавить" name="add"/>
+ <menu_item_call label="ПожаловатьÑÑ" name="report"/>
+ <menu_item_call label="Заблокировать" name="block"/>
+ <menu_item_call label="Приблизить" name="zoom_in"/>
+ <menu_item_call label="Удалить" name="remove"/>
+ <menu_item_call label="Ð”Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ" name="more_info"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_inspect_self_gear.xml b/indra/newview/skins/default/xui/ru/menu_inspect_self_gear.xml
new file mode 100644
index 0000000000..901bb615e0
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_inspect_self_gear.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="Self Pie">
+ <menu_item_call label="СеÑть" name="Sit Down Here"/>
+ <menu_item_call label="Ð’Ñтать" name="Stand Up"/>
+ <context_menu label="СнÑть" name="Take Off &gt;">
+ <context_menu label="одежду" name="Clothes &gt;">
+ <menu_item_call label="рубашку" name="Shirt"/>
+ <menu_item_call label="брюки" name="Pants"/>
+ <menu_item_call label="юбку" name="Skirt"/>
+ <menu_item_call label="обувь" name="Shoes"/>
+ <menu_item_call label="ноÑки" name="Socks"/>
+ <menu_item_call label="пиджак" name="Jacket"/>
+ <menu_item_call label="перчатки" name="Gloves"/>
+ <menu_item_call label="майку" name="Self Undershirt"/>
+ <menu_item_call label="труÑÑ‹" name="Self Underpants"/>
+ <menu_item_call label="тату" name="Self Tattoo"/>
+ <menu_item_call label="альфа-маÑку" name="Self Alpha"/>
+ <menu_item_call label="вÑÑŽ одежду" name="All Clothes"/>
+ </context_menu>
+ <context_menu label="данные в игре" name="Object Detach HUD"/>
+ <context_menu label="ОтÑоединить" name="Object Detach"/>
+ <menu_item_call label="ОтÑоединить вÑе" name="Detach All"/>
+ </context_menu>
+ <menu_item_call label="Сменить коÑтюм" name="Chenge Outfit"/>
+ <menu_item_call label="Изменить коÑтюм" name="Edit Outfit"/>
+ <menu_item_call label="Изменить фигуру" name="Edit My Shape"/>
+ <menu_item_call label="Мои друзьÑ" name="Friends..."/>
+ <menu_item_call label="Мои группы" name="Groups..."/>
+ <menu_item_call label="Мой профиль" name="Profile..."/>
+ <menu_item_call label="Отладка текÑтур" name="Debug..."/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_inv_offer_chiclet.xml b/indra/newview/skins/default/xui/ru/menu_inv_offer_chiclet.xml
new file mode 100644
index 0000000000..95d162d7fe
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_inv_offer_chiclet.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="InvOfferChiclet Menu">
+ <menu_item_call label="Закрыть" name="Close"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_inventory.xml b/indra/newview/skins/default/xui/ru/menu_inventory.xml
new file mode 100644
index 0000000000..4eeb1e46c2
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_inventory.xml
@@ -0,0 +1,89 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Popup">
+ <menu_item_call label="ПоделитьÑÑ" name="Share"/>
+ <menu_item_call label="Купить" name="Task Buy"/>
+ <menu_item_call label="Открыть" name="Task Open"/>
+ <menu_item_call label="ВоÑпроизвеÑти" name="Task Play"/>
+ <menu_item_call label="СвойÑтва" name="Task Properties"/>
+ <menu_item_call label="Переименовать" name="Task Rename"/>
+ <menu_item_call label="Удалить" name="Task Remove"/>
+ <menu_item_call label="ОчиÑтить корзину" name="Empty Trash"/>
+ <menu_item_call label="ОчиÑтить бюро находок" name="Empty Lost And Found"/>
+ <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 Gesture"/>
+ <menu label="ÐÐ¾Ð²Ð°Ñ Ð¾Ð´ÐµÐ¶Ð´Ð°" name="New Clothes">
+ <menu_item_call label="ÐÐ¾Ð²Ð°Ñ Ñ€ÑƒÐ±Ð°ÑˆÐºÐ°" name="New Shirt"/>
+ <menu_item_call label="Ðовые брюки" name="New Pants"/>
+ <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 Gloves"/>
+ <menu_item_call label="ÐÐ¾Ð²Ð°Ñ Ð¼Ð°Ð¹ÐºÐ°" name="New Undershirt"/>
+ <menu_item_call label="Ðовые труÑÑ‹" name="New Underpants"/>
+ <menu_item_call label="ÐÐ¾Ð²Ð°Ñ Ð°Ð»ÑŒÑ„Ð°-маÑка" name="New Alpha Mask"/>
+ <menu_item_call label="Ðовое тату" name="New Tattoo"/>
+ <menu_item_call label="ÐÐ¾Ð²Ð°Ñ Ñ„Ð¸Ð·Ð¸ÐºÐ°" name="New Physics"/>
+ </menu>
+ <menu label="Ðовые чаÑти тела" name="New Body Parts">
+ <menu_item_call label="ÐÐ¾Ð²Ð°Ñ Ñ„Ð¸Ð³ÑƒÑ€Ð°" name="New Shape"/>
+ <menu_item_call label="ÐÐ¾Ð²Ð°Ñ ÐºÐ¾Ð¶Ð°" name="New Skin"/>
+ <menu_item_call label="Ðовые волоÑÑ‹" name="New Hair"/>
+ <menu_item_call label="Ðовые глаза" name="New Eyes"/>
+ </menu>
+ <menu label="Сменить тип" name="Change Type">
+ <menu_item_call label="По умолчанию" name="Default"/>
+ <menu_item_call label="Перчатки" name="Gloves"/>
+ <menu_item_call label="Пиджак" name="Jacket"/>
+ <menu_item_call label="Брюки" name="Pants"/>
+ <menu_item_call label="Фигура" name="Shape"/>
+ <menu_item_call label="Обувь" name="Shoes"/>
+ <menu_item_call label="Рубашка" name="Shirt"/>
+ <menu_item_call label="Юбка" name="Skirt"/>
+ <menu_item_call label="ТруÑÑ‹" name="Underpants"/>
+ <menu_item_call label="Майка" name="Undershirt"/>
+ </menu>
+ <menu_item_call label="Телепорт" name="Landmark Open"/>
+ <menu_item_call label="Открыть" name="Animation Open"/>
+ <menu_item_call label="Открыть" name="Sound Open"/>
+ <menu_item_call label="Сменить текущий коÑтюм" name="Replace Outfit"/>
+ <menu_item_call label="Добавить к текущему коÑтюму" name="Add To Outfit"/>
+ <menu_item_call label="Убрать из текущего коÑтюма" name="Remove From Outfit"/>
+ <menu_item_call label="Ðайти оригинал" name="Find Original"/>
+ <menu_item_call label="Удалить навÑегда" name="Purge Item"/>
+ <menu_item_call label="ВоÑÑтановить вещь" name="Restore Item"/>
+ <menu_item_call label="Открыть" name="Open"/>
+ <menu_item_call label="Открыть оригинал" name="Open Original"/>
+ <menu_item_call label="СвойÑтва" name="Properties"/>
+ <menu_item_call label="Переименовать" name="Rename"/>
+ <menu_item_call label="Копировать UUID актива" name="Copy Asset UUID"/>
+ <menu_item_call label="Копировать" name="Copy"/>
+ <menu_item_call label="Ð’Ñтавить" name="Paste"/>
+ <menu_item_call label="Ð’Ñтавить как ÑÑылку" name="Paste As Link"/>
+ <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="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="Отправить IM-Ñообщение" 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"/>
+ <menu_item_call label="Сохранить как" name="Save As"/>
+ <menu_item_call label="ОтÑоединить от ÑебÑ" name="Detach From Yourself"/>
+ <menu_item_call label="Ðадеть" name="Wearable And Object Wear"/>
+ <menu label="ПриÑоединить к" name="Attach To"/>
+ <menu label="ПриÑоединить к данным в игре" name="Attach To HUD"/>
+ <menu_item_call label="Изменить" name="Wearable Edit"/>
+ <menu_item_call label="Добавить" name="Wearable Add"/>
+ <menu_item_call label="СнÑть" name="Take Off"/>
+ <menu_item_call label="Копировать в «Торговые иÑходÑщие»" name="Merchant Copy"/>
+ <menu_item_call label="ПеремеÑтить в «Торговые иÑходÑщие»" name="Merchant Move"/>
+ <menu_item_call label="- нет дейÑтвий -" name="--no options--"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_inventory_add.xml b/indra/newview/skins/default/xui/ru/menu_inventory_add.xml
new file mode 100644
index 0000000000..9a240c653e
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_inventory_add.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_inventory_add">
+ <menu label="Передать" name="upload">
+ <menu_item_call label="Изображение (L$[COST])..." name="Upload Image"/>
+ <menu_item_call label="Звук (L$[COST])..." name="Upload Sound"/>
+ <menu_item_call label="ÐÐ½Ð¸Ð¼Ð°Ñ†Ð¸Ñ (L$[COST])..." name="Upload Animation"/>
+ <menu_item_call label="Модель..." name="Upload Model"/>
+ <menu_item_call label="МаÑтер моделированиÑ..." name="Upload Model Wizard"/>
+ <menu_item_call label="Ð’Ñе Ñразу (L$[COST] за файл)..." name="Bulk Upload"/>
+ <menu_item_call label="УÑтановить Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ð½Ð° передачу по умолчанию" name="perm prefs"/>
+ </menu>
+ <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 Gesture"/>
+ <menu label="ÐÐ¾Ð²Ð°Ñ Ð¾Ð´ÐµÐ¶Ð´Ð°" name="New Clothes">
+ <menu_item_call label="ÐÐ¾Ð²Ð°Ñ Ñ€ÑƒÐ±Ð°ÑˆÐºÐ°" name="New Shirt"/>
+ <menu_item_call label="Ðовые брюки" name="New Pants"/>
+ <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 Gloves"/>
+ <menu_item_call label="ÐÐ¾Ð²Ð°Ñ Ð¼Ð°Ð¹ÐºÐ°" name="New Undershirt"/>
+ <menu_item_call label="Ðовые труÑÑ‹" name="New Underpants"/>
+ <menu_item_call label="ÐÐ¾Ð²Ð°Ñ Ð°Ð»ÑŒÑ„Ð°-маÑка" name="New Alpha"/>
+ <menu_item_call label="Ðовое тату" name="New Tattoo"/>
+ <menu_item_call label="ÐÐ¾Ð²Ð°Ñ Ñ„Ð¸Ð·Ð¸ÐºÐ°" name="New Physics"/>
+ </menu>
+ <menu label="Ðовые чаÑти тела" name="New Body Parts">
+ <menu_item_call label="ÐÐ¾Ð²Ð°Ñ Ñ„Ð¸Ð³ÑƒÑ€Ð°" name="New Shape"/>
+ <menu_item_call label="ÐÐ¾Ð²Ð°Ñ ÐºÐ¾Ð¶Ð°" name="New Skin"/>
+ <menu_item_call label="Ðовые волоÑÑ‹" name="New Hair"/>
+ <menu_item_call label="Ðовые глаза" name="New Eyes"/>
+ </menu>
+</menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_inventory_gear_default.xml b/indra/newview/skins/default/xui/ru/menu_inventory_gear_default.xml
new file mode 100644
index 0000000000..9fc0b6d44e
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_inventory_gear_default.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="menu_gear_default">
+ <menu_item_call label="Ðовое окно инвентарÑ" name="new_window"/>
+ <menu_item_check label="Сортировать по имени" name="sort_by_name"/>
+ <menu_item_check label="Сортировать по времени" name="sort_by_recent"/>
+ <menu_item_check label="Ð’Ñегда Ñортировать папки по имени" name="sort_folders_by_name"/>
+ <menu_item_check label="Показывать ÑиÑтемные папки вверху" name="sort_system_folders_to_top"/>
+ <menu_item_call label="Показать фильтры" name="show_filters"/>
+ <menu_item_call label="СброÑить фильтры" name="reset_filters"/>
+ <menu_item_call label="Закрыть вÑе папки" name="close_folders"/>
+ <menu_item_call label="ОчиÑтить бюро находок" name="empty_lostnfound"/>
+ <menu_item_call label="Сохранить текÑтуру как" name="Save Texture As"/>
+ <menu_item_call label="ПоделитьÑÑ" name="Share"/>
+ <menu_item_call label="Ðайти оригинал" name="Find Original"/>
+ <menu_item_call label="Ðайти вÑе ÑÑылки" name="Find All Links"/>
+ <menu_item_call label="ОчиÑтить корзину" name="empty_trash"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_land.xml b/indra/newview/skins/default/xui/ru/menu_land.xml
new file mode 100644
index 0000000000..89889d7bf6
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_land.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Land Pie">
+ <menu_item_call label="О земле" name="Place Information..."/>
+ <menu_item_call label="СеÑть здеÑÑŒ" name="Sit Here"/>
+ <menu_item_call label="Купить Ñту землю" name="Land Buy"/>
+ <menu_item_call label="Купить пропуÑк" name="Land Buy Pass"/>
+ <menu_item_call label="СтроительÑтво" name="Create"/>
+ <menu_item_call label="Изменить ландшафт" name="Edit Terrain"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_landmark.xml b/indra/newview/skins/default/xui/ru/menu_landmark.xml
new file mode 100644
index 0000000000..24b60f9d86
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_landmark.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="landmark_overflow_menu">
+ <menu_item_call label="Копировать URL SL" name="copy"/>
+ <menu_item_call label="Удалить" name="delete"/>
+ <menu_item_call label="Создать подборку" name="pick"/>
+ <menu_item_call label="Добавить в любимые" name="add_to_favbar"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_login.xml b/indra/newview/skins/default/xui/ru/menu_login.xml
new file mode 100644
index 0000000000..aa3570f176
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_login.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu_bar name="Login Menu">
+ <menu label="Я" name="File">
+ <menu_item_call label="ÐаÑтройки..." name="Preferences..."/>
+ <menu_item_call label="Выход из [APP_NAME]" name="Quit"/>
+ </menu>
+ <menu label="Справка" name="Help">
+ <menu_item_call label="Справка [SECOND_LIFE]" name="Second Life Help"/>
+ <menu_item_call label="О [APP_NAME]" name="About Second Life"/>
+ </menu>
+ <menu_item_check label="Показать меню отладки" name="Show Debug Menu"/>
+ <menu label="Отладка" name="Debug">
+ <menu_item_call label="ÐаÑтройки отладки" name="Debug Settings"/>
+ <menu_item_call label="ÐаÑтройки интерфейÑа/цвета" 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="TOS"/>
+ <menu_item_call label="Показать Ñообщение об ошибке" name="Critical"/>
+ <menu_item_call label="Проверка медиабраузера" name="Web Browser Test"/>
+ <menu_item_call label="ТеÑÑ‚ отладки плавающего окна Ñ Ð²ÐµÐ±-контентом" name="Web Content Floater Debug Test"/>
+ <menu_item_check label="Выбор Ñетки" name="Show Grid Picker"/>
+ <menu_item_call label="КонÑоль уведомлений" name="Show Notifications Console"/>
+ </menu>
+</menu_bar>
diff --git a/indra/newview/skins/default/xui/ru/menu_media_ctrl.xml b/indra/newview/skins/default/xui/ru/menu_media_ctrl.xml
new file mode 100644
index 0000000000..d7485b02af
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_media_ctrl.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="media ctrl context menu">
+ <menu_item_call label="Вырезать" name="Cut"/>
+ <menu_item_call label="Копировать" name="Copy"/>
+ <menu_item_call label="Ð’Ñтавить" name="Paste"/>
+ <menu_item_call label="Открыть веб-инÑпектор" name="open_webinspector"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_mini_map.xml b/indra/newview/skins/default/xui/ru/menu_mini_map.xml
new file mode 100644
index 0000000000..6b3db11609
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_mini_map.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Popup">
+ <menu_item_call label="Близко" name="Zoom Close"/>
+ <menu_item_call label="Средне" name="Zoom Medium"/>
+ <menu_item_call label="Далеко" name="Zoom Far"/>
+ <menu_item_call label="СброÑить увеличение" name="Zoom Default"/>
+ <menu_item_check label="Вращать карту" name="Rotate Map"/>
+ <menu_item_check label="Ðвтоцентрирование" name="Auto Center"/>
+ <menu_item_call label="ОÑтановить Ñлежение" name="Stop Tracking"/>
+ <menu_item_call label="Карта мира" name="World Map"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_mode_change.xml b/indra/newview/skins/default/xui/ru/menu_mode_change.xml
new file mode 100644
index 0000000000..25d6e9af27
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_mode_change.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="Mode Change">
+ <menu_item_check label="ОÑновной" name="BasicMode"/>
+ <menu_item_check label="РаÑширенный" name="AdvancedMode"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_model_import_gear_default.xml b/indra/newview/skins/default/xui/ru/menu_model_import_gear_default.xml
new file mode 100644
index 0000000000..5ae5e7dfbc
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_model_import_gear_default.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="model_menu_gear_default">
+ <menu_item_check label="Показать грани" name="show_edges"/>
+ <menu_item_check label="Показать физику" name="show_physics"/>
+ <menu_item_check label="Показать текÑтуры" name="show_textures"/>
+ <menu_item_check label="Показать Ð²ÐµÑ ÐºÐ¾Ð¶Ð¸" name="show_skin_weight"/>
+ <menu_item_check label="Показать положение Ñочленений" name="show_joint_positions"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_navbar.xml b/indra/newview/skins/default/xui/ru/menu_navbar.xml
new file mode 100644
index 0000000000..2dd0c0df36
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_navbar.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Navbar Menu">
+ <menu_item_check label="Показать координаты" name="Show Coordinates"/>
+ <menu_item_check label="Показать ÑвойÑтва учаÑтка" name="Show Parcel Properties"/>
+ <menu_item_call label="Закладка" name="Landmark"/>
+ <menu_item_call label="Вырезать" name="Cut"/>
+ <menu_item_call label="Копировать" name="Copy"/>
+ <menu_item_call label="Ð’Ñтавить" name="Paste"/>
+ <menu_item_call label="Удалить" name="Delete"/>
+ <menu_item_call label="Выделить вÑе" name="Select All"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_nearby_chat.xml b/indra/newview/skins/default/xui/ru/menu_nearby_chat.xml
new file mode 100644
index 0000000000..4b5346d083
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_nearby_chat.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="NearBy Chat Menu">
+ <menu_item_call label="Показать находÑщихÑÑ Ð½ÐµÐ¿Ð¾Ð´Ð°Ð»ÐµÐºÑƒ людей..." name="nearby_people"/>
+ <menu_item_check label="Показать блокируемый текÑÑ‚" name="muted_text"/>
+ <menu_item_check label="Показать значки друзей" name="show_buddy_icons"/>
+ <menu_item_check label="Показать имена" name="show_names"/>
+ <menu_item_check label="Показать значки и имена" name="show_icons_and_names"/>
+ <menu_item_call label="Размер шрифта" name="font_size"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_notification_well_button.xml b/indra/newview/skins/default/xui/ru/menu_notification_well_button.xml
new file mode 100644
index 0000000000..4d067e232a
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_notification_well_button.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Notification Well Button Context Menu">
+ <menu_item_call label="Закрыть вÑе" name="Close All"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_object.xml b/indra/newview/skins/default/xui/ru/menu_object.xml
new file mode 100644
index 0000000000..d6abfd12a2
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_object.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Object Pie">
+ <menu_item_call label="КоÑнутьÑÑ" name="Object Touch"/>
+ <menu_item_call label="Изменить" name="Edit..."/>
+ <menu_item_call label="СтроительÑтво" name="Build"/>
+ <menu_item_call label="Открыто" name="Open"/>
+ <menu_item_call label="СеÑть здеÑÑŒ" name="Object Sit"/>
+ <menu_item_call label="Ð’Ñтать" name="Object Stand Up"/>
+ <menu_item_call label="Профиль объекта" name="Object Inspect"/>
+ <menu_item_call label="Приблизить" name="Zoom In"/>
+ <context_menu label="Ðадеть" name="Put On">
+ <menu_item_call label="Ðадеть" name="Wear"/>
+ <menu_item_call label="Добавить" name="Add"/>
+ <context_menu label="ПриÑоединить" name="Object Attach"/>
+ <context_menu label="ПриÑоединить HUD" name="Object Attach HUD"/>
+ </context_menu>
+ <context_menu label="Управление" name="Remove">
+ <menu_item_call label="Жалоба" name="Report Abuse..."/>
+ <menu_item_call label="Заблокировать" name="Object Mute"/>
+ <menu_item_call label="Возврат" name="Return..."/>
+ </context_menu>
+ <menu_item_call label="ВзÑть" name="Pie Object Take"/>
+ <menu_item_call label="ВзÑть копию" name="Take Copy"/>
+ <menu_item_call label="Заплатить" name="Pay..."/>
+ <menu_item_call label="Купить" name="Buy..."/>
+ <menu_item_call label="Удалить" name="Delete"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_object_icon.xml b/indra/newview/skins/default/xui/ru/menu_object_icon.xml
new file mode 100644
index 0000000000..6229b2e72f
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_object_icon.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Object Icon Menu">
+ <menu_item_call label="Профиль объекта..." name="Object Profile"/>
+ <menu_item_call label="Блокировать..." name="Block"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_outfit_gear.xml b/indra/newview/skins/default/xui/ru/menu_outfit_gear.xml
new file mode 100644
index 0000000000..93dbd7d6a7
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_outfit_gear.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="Gear Outfit">
+ <menu_item_call label="Ðадеть – Заменить текущий коÑтюм" name="wear"/>
+ <menu_item_call label="Ðадеть – Добавить к текущему коÑтюму" name="wear_add"/>
+ <menu_item_call label="СнÑть – Убрать из текущего коÑтюма" name="take_off"/>
+ <menu label="ÐÐ¾Ð²Ð°Ñ Ð¾Ð´ÐµÐ¶Ð´Ð°" name="New Clothes">
+ <menu_item_call label="ÐÐ¾Ð²Ð°Ñ Ñ€ÑƒÐ±Ð°ÑˆÐºÐ°" name="New Shirt"/>
+ <menu_item_call label="Ðовые брюки" name="New Pants"/>
+ <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 Gloves"/>
+ <menu_item_call label="ÐÐ¾Ð²Ð°Ñ Ð¼Ð°Ð¹ÐºÐ°" name="New Undershirt"/>
+ <menu_item_call label="Ðовые труÑÑ‹" name="New Underpants"/>
+ <menu_item_call label="ÐÐ¾Ð²Ð°Ñ Ð°Ð»ÑŒÑ„Ð°-маÑка" name="New Alpha"/>
+ <menu_item_call label="ÐÐ¾Ð²Ð°Ñ Ñ„Ð¸Ð·Ð¸ÐºÐ°" name="New Physics"/>
+ <menu_item_call label="Ðовое тату" name="New Tattoo"/>
+ </menu>
+ <menu label="Ðовые чаÑти тела" name="New Body Parts">
+ <menu_item_call label="ÐÐ¾Ð²Ð°Ñ Ñ„Ð¸Ð³ÑƒÑ€Ð°" name="New Shape"/>
+ <menu_item_call label="ÐÐ¾Ð²Ð°Ñ ÐºÐ¾Ð¶Ð°" name="New Skin"/>
+ <menu_item_call label="Ðовые волоÑÑ‹" name="New Hair"/>
+ <menu_item_call label="Ðовые глаза" name="New Eyes"/>
+ </menu>
+ <menu_item_call label="Переименовать коÑтюм" name="rename"/>
+ <menu_item_call label="Удалить коÑтюм" name="delete_outfit"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_outfit_tab.xml b/indra/newview/skins/default/xui/ru/menu_outfit_tab.xml
new file mode 100644
index 0000000000..46404195b9
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_outfit_tab.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Outfit">
+ <menu_item_call label="Ðадеть – Заменить текущий коÑтюм" name="wear_replace"/>
+ <menu_item_call label="Ðадеть – Добавить к текущему коÑтюму" name="wear_add"/>
+ <menu_item_call label="СнÑть – Убрать из текущего коÑтюма" name="take_off"/>
+ <menu_item_call label="Изменить коÑтюм" name="edit"/>
+ <menu_item_call label="Переименовать коÑтюм" name="rename"/>
+ <menu_item_call label="Удалить коÑтюм" name="delete"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_participant_list.xml b/indra/newview/skins/default/xui/ru/menu_participant_list.xml
new file mode 100644
index 0000000000..932ad5bacf
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_participant_list.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Participant List Context Menu">
+ <menu_item_check label="Сортировать по имени" name="SortByName"/>
+ <menu_item_check label="Сортировать по недавно говорившим" name="SortByRecentSpeakers"/>
+ <menu_item_call label="Открыть профиль" name="View Profile"/>
+ <menu_item_call label="Добавить в друзьÑ" name="Add Friend"/>
+ <menu_item_call label="IM" name="IM"/>
+ <menu_item_call label="Звонок" name="Call"/>
+ <menu_item_call label="ПоделитьÑÑ" name="Share"/>
+ <menu_item_call label="Заплатить" name="Pay"/>
+ <menu_item_check label="Показывать значки учаÑтников" name="View Icons"/>
+ <menu_item_check label="Блокировать голоÑ" name="Block/Unblock"/>
+ <menu_item_check label="Блокировать текÑÑ‚" name="MuteText"/>
+ <context_menu label="Параметры модератора" name="Moderator Options">
+ <menu_item_check label="Разрешить текÑтовый чат" name="AllowTextChat"/>
+ <menu_item_call label="Заглушить Ñтого учаÑтника" name="ModerateVoiceMuteSelected"/>
+ <menu_item_call label="Позволить говорить Ñтому учаÑтнику" name="ModerateVoiceUnMuteSelected"/>
+ <menu_item_call label="Заглушить вÑех" name="ModerateVoiceMute"/>
+ <menu_item_call label="Позволить говорить вÑем" name="ModerateVoiceUnmute"/>
+ </context_menu>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_people_friends_view_sort.xml b/indra/newview/skins/default/xui/ru/menu_people_friends_view_sort.xml
new file mode 100644
index 0000000000..0fa252aa99
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_people_friends_view_sort.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="menu_group_plus">
+ <menu_item_check label="Сортировать по имени" name="sort_name"/>
+ <menu_item_check label="Сортировать по ÑтатуÑу" name="sort_status"/>
+ <menu_item_check label="Показывать значки" name="view_icons"/>
+ <menu_item_check label="Показывать разрешенные дейÑтвиÑ" name="view_permissions"/>
+ <menu_item_call label="Показать черный ÑпиÑок" name="show_blocked_list"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_people_groups.xml b/indra/newview/skins/default/xui/ru/menu_people_groups.xml
new file mode 100644
index 0000000000..e734a83ef0
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_people_groups.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_group_plus">
+ <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="Leave"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_people_groups_view_sort.xml b/indra/newview/skins/default/xui/ru/menu_people_groups_view_sort.xml
new file mode 100644
index 0000000000..0358068db9
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_people_groups_view_sort.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="menu_group_plus">
+ <menu_item_check label="Показывать значки группы" name="Display Group Icons"/>
+ <menu_item_call label="Покинуть выбранную группу" name="Leave Selected Group"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_people_nearby.xml b/indra/newview/skins/default/xui/ru/menu_people_nearby.xml
new file mode 100644
index 0000000000..ebce959044
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_people_nearby.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Avatar Context Menu">
+ <menu_item_call label="Смотреть профиль" name="View Profile"/>
+ <menu_item_call label="Ð’ друзьÑ" name="Add Friend"/>
+ <menu_item_call label="Удалить из друзей" name="Remove Friend"/>
+ <menu_item_call label="IM" name="IM"/>
+ <menu_item_call label="Звонок" name="Call"/>
+ <menu_item_call label="Карта" name="Map"/>
+ <menu_item_call label="ПоделитьÑÑ" name="Share"/>
+ <menu_item_call label="Заплатить" name="Pay"/>
+ <menu_item_check label="Черный ÑпиÑок" name="Block/Unblock"/>
+ <menu_item_call label="Предложить телепорт" name="teleport"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_people_nearby_multiselect.xml b/indra/newview/skins/default/xui/ru/menu_people_nearby_multiselect.xml
new file mode 100644
index 0000000000..0e8e0d4053
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_people_nearby_multiselect.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Multi-Selected People Context Menu">
+ <menu_item_call label="Добавить в друзьÑ" name="Add Friends"/>
+ <menu_item_call label="Удалить из друзей" name="Remove Friend"/>
+ <menu_item_call label="IM" name="IM"/>
+ <menu_item_call label="Звонок" name="Call"/>
+ <menu_item_call label="ПоделитьÑÑ" name="Share"/>
+ <menu_item_call label="Заплатить" name="Pay"/>
+ <menu_item_call label="Предложить телепорт" name="teleport"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_people_nearby_view_sort.xml b/indra/newview/skins/default/xui/ru/menu_people_nearby_view_sort.xml
new file mode 100644
index 0000000000..4589815f6b
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_people_nearby_view_sort.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="menu_group_plus">
+ <menu_item_check label="Сортировать по недавно говорившим" name="sort_by_recent_speakers"/>
+ <menu_item_check label="Сортировать по имени" name="sort_name"/>
+ <menu_item_check label="Сортировать по раÑÑтоÑнию" name="sort_distance"/>
+ <menu_item_check label="Показывать значки учаÑтников" name="view_icons"/>
+ <menu_item_check label="Смотреть карту" name="view_map"/>
+ <menu_item_call label="Показать черный ÑпиÑок жителей и объектов" name="show_blocked_list"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_people_recent_view_sort.xml b/indra/newview/skins/default/xui/ru/menu_people_recent_view_sort.xml
new file mode 100644
index 0000000000..2ac83ffe52
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_people_recent_view_sort.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="menu_group_plus">
+ <menu_item_check label="Сортировать по времени" name="sort_most"/>
+ <menu_item_check label="Сортировать по имени" name="sort_name"/>
+ <menu_item_check label="Показывать значки людей" name="view_icons"/>
+ <menu_item_call label="Показать черный ÑпиÑок" name="show_blocked_list"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_picks.xml b/indra/newview/skins/default/xui/ru/menu_picks.xml
new file mode 100644
index 0000000000..839c7411a6
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_picks.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Picks">
+ <menu_item_call label="Данные" name="pick_info"/>
+ <menu_item_call label="Изменить" name="pick_edit"/>
+ <menu_item_call label="Телепорт" name="pick_teleport"/>
+ <menu_item_call label="Карта" name="pick_map"/>
+ <menu_item_call label="Удалить" name="pick_delete"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_picks_plus.xml b/indra/newview/skins/default/xui/ru/menu_picks_plus.xml
new file mode 100644
index 0000000000..1bc4078179
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_picks_plus.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="picks_plus_menu">
+ <menu_item_call label="ÐÐ¾Ð²Ð°Ñ Ð¿Ð¾Ð´Ð±Ð¾Ñ€ÐºÐ°" name="create_pick"/>
+ <menu_item_call label="ÐÐ¾Ð²Ð°Ñ Ñ€ÐµÐºÐ»Ð°Ð¼Ð°" name="create_classified"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_place.xml b/indra/newview/skins/default/xui/ru/menu_place.xml
new file mode 100644
index 0000000000..ee8878c131
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_place.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="place_overflow_menu">
+ <menu_item_call label="ПоÑтавить закладку" name="landmark"/>
+ <menu_item_call label="Создать подборку" name="pick"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_place_add_button.xml b/indra/newview/skins/default/xui/ru/menu_place_add_button.xml
new file mode 100644
index 0000000000..b1a38fb9eb
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_place_add_button.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_folder_gear">
+ <menu_item_call label="Добавить папку" name="add_folder"/>
+ <menu_item_call label="Добавить закладку" name="add_landmark"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_places_gear_folder.xml b/indra/newview/skins/default/xui/ru/menu_places_gear_folder.xml
new file mode 100644
index 0000000000..25df8c5d19
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_places_gear_folder.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="menu_folder_gear">
+ <menu_item_call label="Добавить закладку" name="add_landmark"/>
+ <menu_item_call label="Добавить папку" name="add_folder"/>
+ <menu_item_call label="ВоÑÑтановить предмет" name="restore_item"/>
+ <menu_item_call label="Вырезать" name="cut"/>
+ <menu_item_call label="Копировать" name="copy_folder"/>
+ <menu_item_call label="Ð’Ñтавить" name="paste"/>
+ <menu_item_call label="Переименовать" name="rename"/>
+ <menu_item_call label="Удалить" name="delete"/>
+ <menu_item_call label="Открыть" name="expand"/>
+ <menu_item_call label="Закрыть" name="collapse"/>
+ <menu_item_call label="Открыть вÑе папки" name="expand_all"/>
+ <menu_item_call label="Закрыть вÑе папки" name="collapse_all"/>
+ <menu_item_check label="Сортировать по дате" name="sort_by_date"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_places_gear_landmark.xml b/indra/newview/skins/default/xui/ru/menu_places_gear_landmark.xml
new file mode 100644
index 0000000000..b1ebd4af83
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_places_gear_landmark.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="menu_ladmark_gear">
+ <menu_item_call label="Телепорт" name="teleport"/>
+ <menu_item_call label="Подробнее" name="more_info"/>
+ <menu_item_call label="Показать на карте" name="show_on_map"/>
+ <menu_item_call label="Добавить закладку" name="add_landmark"/>
+ <menu_item_call label="Добавить папку" name="add_folder"/>
+ <menu_item_call label="ВоÑÑтановить вещь" name="restore_item"/>
+ <menu_item_call label="Вырезать" name="cut"/>
+ <menu_item_call label="Копировать закладку" name="copy_landmark"/>
+ <menu_item_call label="Копировать URL SL" name="copy_slurl"/>
+ <menu_item_call label="Ð’Ñтавить" name="paste"/>
+ <menu_item_call label="Переименовать" name="rename"/>
+ <menu_item_call label="Удалить" name="delete"/>
+ <menu_item_call label="Развернуть вÑе папки" name="expand_all"/>
+ <menu_item_call label="Свернуть вÑе папки" name="collapse_all"/>
+ <menu_item_check label="Сортировать по дате" name="sort_by_date"/>
+ <menu_item_call label="Создать подборку" name="create_pick"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_profile_overflow.xml b/indra/newview/skins/default/xui/ru/menu_profile_overflow.xml
new file mode 100644
index 0000000000..1865fead7b
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_profile_overflow.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="profile_overflow_menu">
+ <menu_item_call label="Карта" name="show_on_map"/>
+ <menu_item_call label="Заплатить" name="pay"/>
+ <menu_item_call label="ПоделитьÑÑ" name="share"/>
+ <menu_item_call label="Заблокировать" name="block"/>
+ <menu_item_call label="Разблокировать" name="unblock"/>
+ <menu_item_call label="Выкинуть" name="kick"/>
+ <menu_item_call label="Заморозить" name="freeze"/>
+ <menu_item_call label="Разморозить" name="unfreeze"/>
+ <menu_item_call label="CSR" name="csr"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_save_outfit.xml b/indra/newview/skins/default/xui/ru/menu_save_outfit.xml
new file mode 100644
index 0000000000..88947e1433
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_save_outfit.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="save_outfit_menu">
+ <menu_item_call label="Сохранить" name="save_outfit"/>
+ <menu_item_call label="Сохранить как" name="save_as_new_outfit"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_script_chiclet.xml b/indra/newview/skins/default/xui/ru/menu_script_chiclet.xml
new file mode 100644
index 0000000000..6cacff3870
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_script_chiclet.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="ScriptChiclet Menu">
+ <menu_item_call label="Закрыть" name="Close"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_slurl.xml b/indra/newview/skins/default/xui/ru/menu_slurl.xml
new file mode 100644
index 0000000000..f02549055c
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_slurl.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Popup">
+ <menu_item_call label="О ÑÑылке" name="about_url"/>
+ <menu_item_call label="ТелепортироватьÑÑ Ð¿Ð¾ ÑÑылке" name="teleport_to_url"/>
+ <menu_item_call label="Карта" name="show_on_map"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_teleport_history_gear.xml b/indra/newview/skins/default/xui/ru/menu_teleport_history_gear.xml
new file mode 100644
index 0000000000..332f2784b9
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_teleport_history_gear.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="Teleport History Gear Context Menu">
+ <menu_item_call label="Открыть вÑе папки" name="Expand all folders"/>
+ <menu_item_call label="Закрыть вÑе папки" name="Collapse all folders"/>
+ <menu_item_call label="ОчиÑтить иÑторию телепортаций" name="Clear Teleport History"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_teleport_history_item.xml b/indra/newview/skins/default/xui/ru/menu_teleport_history_item.xml
new file mode 100644
index 0000000000..6a22fd00dc
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_teleport_history_item.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Teleport History Item Context Menu">
+ <menu_item_call label="Телепорт" name="Teleport"/>
+ <menu_item_call label="ИнформациÑ" name="More Information"/>
+ <menu_item_call label="Копировать в буфер обмена" name="CopyToClipboard"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_teleport_history_tab.xml b/indra/newview/skins/default/xui/ru/menu_teleport_history_tab.xml
new file mode 100644
index 0000000000..9b2434a310
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_teleport_history_tab.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Teleport History Item Context Menu">
+ <menu_item_call label="Открыть" name="TabOpen"/>
+ <menu_item_call label="Закрыть" name="TabClose"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_text_editor.xml b/indra/newview/skins/default/xui/ru/menu_text_editor.xml
new file mode 100644
index 0000000000..113dd85318
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_text_editor.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Text editor context menu">
+ <menu_item_call label="Вырезать" name="Cut"/>
+ <menu_item_call label="Копировать" name="Copy"/>
+ <menu_item_call label="Ð’Ñтавить" name="Paste"/>
+ <menu_item_call label="Удалить" name="Delete"/>
+ <menu_item_call label="Выделить вÑе" name="Select All"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_toolbars.xml b/indra/newview/skins/default/xui/ru/menu_toolbars.xml
new file mode 100644
index 0000000000..aa05dbc390
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_toolbars.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Toolbars Popup">
+ <menu_item_call label="Удалить Ñту кнопку" name="Remove button"/>
+ <menu_item_call label="Кнопки панели инÑтрументов..." name="Choose Buttons"/>
+ <menu_item_check label="Значки и подпиÑи" name="icons_with_text"/>
+ <menu_item_check label="Только значки" name="icons_only"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_topinfobar.xml b/indra/newview/skins/default/xui/ru/menu_topinfobar.xml
new file mode 100644
index 0000000000..76cadbe5a4
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_topinfobar.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_topinfobar">
+ <menu_item_check label="Показать координаты" name="Show Coordinates"/>
+ <menu_item_check label="Показать ÑвойÑтва учаÑтка" name="Show Parcel Properties"/>
+ <menu_item_call label="Закладка" name="Landmark"/>
+ <menu_item_call label="Копировать" name="Copy"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_url_agent.xml b/indra/newview/skins/default/xui/ru/menu_url_agent.xml
new file mode 100644
index 0000000000..0ba3ee152a
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_url_agent.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Показать профиль жителÑ" name="show_agent"/>
+ <menu_item_call label="Копировать название в буфер обмена" name="url_copy_label"/>
+ <menu_item_call label="Копировать URL-Ð°Ð´Ñ€ÐµÑ SL в буфер обмена" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_url_group.xml b/indra/newview/skins/default/xui/ru/menu_url_group.xml
new file mode 100644
index 0000000000..f25e2a7eb8
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_url_group.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Показать информацию группы" name="show_group"/>
+ <menu_item_call label="Копировать группу в буфер обмена" name="url_copy_label"/>
+ <menu_item_call label="Копировать URL-Ð°Ð´Ñ€ÐµÑ SL в буфер обмена" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_url_http.xml b/indra/newview/skins/default/xui/ru/menu_url_http.xml
new file mode 100644
index 0000000000..781211b16f
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_url_http.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Открыть веб-Ñтраницу" name="url_open"/>
+ <menu_item_call label="Открыть во внутреннем браузере" name="url_open_internal"/>
+ <menu_item_call label="Открыть во внешнем браузере" name="url_open_external"/>
+ <menu_item_call label="Копировать URL-Ð°Ð´Ñ€ÐµÑ Ð² буфер обмена" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_url_inventory.xml b/indra/newview/skins/default/xui/ru/menu_url_inventory.xml
new file mode 100644
index 0000000000..6127bf9868
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_url_inventory.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Показать вещь из инвентарÑ" name="show_item"/>
+ <menu_item_call label="Копировать название в буфер обмена" name="url_copy_label"/>
+ <menu_item_call label="Копировать URL-Ð°Ð´Ñ€ÐµÑ SL в буфер обмена" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_url_map.xml b/indra/newview/skins/default/xui/ru/menu_url_map.xml
new file mode 100644
index 0000000000..bbf64f20e9
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_url_map.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Показать на карте" name="show_on_map"/>
+ <menu_item_call label="Телепорт в меÑтоположение" name="teleport_to_location"/>
+ <menu_item_call label="Копировать URL-Ð°Ð´Ñ€ÐµÑ SL в буфер обмена" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_url_objectim.xml b/indra/newview/skins/default/xui/ru/menu_url_objectim.xml
new file mode 100644
index 0000000000..6e7800d3f5
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_url_objectim.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Показать информацию об объекте" name="show_object"/>
+ <menu_item_call label="Показать на карте" name="show_on_map"/>
+ <menu_item_call label="Телепорт в меÑтоположение объекта" name="teleport_to_object"/>
+ <menu_item_call label="Копировать название объекта в буфер обмена" name="url_copy_label"/>
+ <menu_item_call label="Копировать URL-Ð°Ð´Ñ€ÐµÑ SL в буфер обмена" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_url_parcel.xml b/indra/newview/skins/default/xui/ru/menu_url_parcel.xml
new file mode 100644
index 0000000000..84a679703a
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_url_parcel.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Показать информацию об учаÑтке" name="show_parcel"/>
+ <menu_item_call label="Показать на карте" name="show_on_map"/>
+ <menu_item_call label="Копировать URL-Ð°Ð´Ñ€ÐµÑ SL в буфер обмена" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_url_slapp.xml b/indra/newview/skins/default/xui/ru/menu_url_slapp.xml
new file mode 100644
index 0000000000..3d582ea2c5
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_url_slapp.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Выполнить команду" name="run_slapp"/>
+ <menu_item_call label="Копировать URL-Ð°Ð´Ñ€ÐµÑ SL в буфер обмена" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_url_slurl.xml b/indra/newview/skins/default/xui/ru/menu_url_slurl.xml
new file mode 100644
index 0000000000..cbceafea21
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_url_slurl.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Показать информацию о меÑте" name="show_place"/>
+ <menu_item_call label="Показать на карте" name="show_on_map"/>
+ <menu_item_call label="Телепорт в меÑтоположение" name="teleport_to_location"/>
+ <menu_item_call label="Копировать URL-Ð°Ð´Ñ€ÐµÑ SL в буфер обмена" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_url_teleport.xml b/indra/newview/skins/default/xui/ru/menu_url_teleport.xml
new file mode 100644
index 0000000000..2ecde09383
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_url_teleport.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Ð¢ÐµÐ»ÐµÐ¿Ð¾Ñ€Ñ‚Ð°Ñ†Ð¸Ñ Ð² Ñто меÑто" name="teleport"/>
+ <menu_item_call label="Показать на карте" name="show_on_map"/>
+ <menu_item_call label="Копировать URL-Ð°Ð´Ñ€ÐµÑ SL в буфер" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_viewer.xml b/indra/newview/skins/default/xui/ru/menu_viewer.xml
new file mode 100644
index 0000000000..93d0166568
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_viewer.xml
@@ -0,0 +1,460 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu_bar name="Main Menu">
+ <menu label="Я" name="Me">
+ <menu_item_call label="Профиль…" name="Profile"/>
+ <menu_item_call label="ВнешноÑть..." name="ChangeOutfit"/>
+ <menu_item_call label="Выберите аватар..." name="Avatar Picker"/>
+ <menu_item_check label="Инвентарь..." name="Inventory"/>
+ <menu_item_call label="Ðовое окно инвентарÑ" name="NewInventoryWindow"/>
+ <menu_item_call label="МеÑта..." name="Places"/>
+ <menu_item_call label="Подборка..." name="Picks"/>
+ <menu_item_call label="Управление камерой..." name="Camera Controls"/>
+ <menu label="Движение" name="Movement">
+ <menu_item_call label="СеÑть" name="Sit Down Here"/>
+ <menu_item_check label="Полет" name="Fly"/>
+ <menu_item_check label="Ð’Ñегда бегать" name="Always Run"/>
+ <menu_item_call label="ОÑтановить анимацию" name="Stop Animating My Avatar"/>
+ </menu>
+ <menu label="СтатуÑ" name="Status">
+ <menu_item_call label="Ðет на меÑте" name="Set Away"/>
+ <menu_item_call label="Ðе беÑпокоить" name="Set Busy"/>
+ </menu>
+ <menu_item_call label="Ð—Ð°Ð¿Ñ€Ð¾Ñ ÑтатуÑа админиÑтратора" name="Request Admin Options"/>
+ <menu_item_call label="Выход из ÑтатуÑа админиÑтратора" name="Leave Admin Options"/>
+ <menu_item_call label="Купить L$" name="Buy and Sell L$"/>
+ <menu_item_call label="Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ð¾Ð½Ð½Ð°Ñ Ð¿Ð°Ð½ÐµÐ»ÑŒ аккаунта..." name="Manage My Account"/>
+ <menu_item_call label="ÐаÑтройки..." name="Preferences"/>
+ <menu_item_call label="Кнопки панели инÑтрументов..." name="Toolbars"/>
+ <menu_item_call label="Скрыть вÑе Ñлементы управлениÑ" name="Hide UI"/>
+ <menu_item_call label="Выход из [APP_NAME]" name="Quit"/>
+ </menu>
+ <menu label="Общение" name="Communicate">
+ <menu_item_check label="Чат..." name="Nearby Chat"/>
+ <menu_item_check label="Говорить" name="Speak"/>
+ <menu_item_check label="ÐаÑтройки голоÑа..." name="Nearby Voice"/>
+ <menu_item_check label="Изменение голоÑа..." name="ShowVoice"/>
+ <menu_item_check label="ЖеÑты..." name="Gestures"/>
+ <menu_item_call label="ДрузьÑ" name="My Friends"/>
+ <menu_item_call label="Группы" name="My Groups"/>
+ <menu_item_call label="Люди неподалеку" name="Active Speakers"/>
+ </menu>
+ <menu label="Мир" name="World">
+ <menu_item_call label="Добавить закладку на Ñто меÑто" name="Create Landmark Here"/>
+ <menu_item_call label="Пункты..." name="Destinations"/>
+ <menu_item_check label="Карта мира" name="World Map"/>
+ <menu_item_check label="Миникарта" name="Mini-Map"/>
+ <menu_item_check label="ПоиÑк" name="Search"/>
+ <menu_item_call label="Ð¢ÐµÐ»ÐµÐ¿Ð¾Ñ€Ñ‚Ð°Ñ†Ð¸Ñ Ð´Ð¾Ð¼Ð¾Ð¹" name="Teleport Home"/>
+ <menu_item_call label="УÑтановить дом здеÑÑŒ" name="Set Home to Here"/>
+ <menu_item_call label="Снимок" name="Take Snapshot"/>
+ <menu_item_call label="Профиль меÑта" name="Place Profile"/>
+ <menu_item_call label="О земле" name="About Land"/>
+ <menu_item_call label="Регион/землевладение" name="Region/Estate"/>
+ <menu_item_call label="Мои владениÑ..." name="My Land"/>
+ <menu_item_call label="Купить Ñту землю" name="Buy Land"/>
+ <menu label="Показать" name="LandShow">
+ <menu_item_check label="Линии запрета" name="Ban Lines"/>
+ <menu_item_check label="Метки" name="beacons"/>
+ <menu_item_check label="Границы ÑобÑтвенноÑти" name="Property Lines"/>
+ <menu_item_check label="Владельцы земли" name="Land Owners"/>
+ <menu_item_check label="Координаты" name="Coordinates"/>
+ <menu_item_check label="СвойÑтва учаÑтка" name="Parcel Properties"/>
+ <menu_item_check label="Меню «Дополнительно»" name="Show Advanced Menu"/>
+ </menu>
+ <menu label="Солнце" name="Environment Settings">
+ <menu_item_call label="ВоÑход" name="Sunrise"/>
+ <menu_item_call label="Полдень" name="Noon"/>
+ <menu_item_call label="Закат" name="Sunset"/>
+ <menu_item_call label="Полночь" name="Midnight"/>
+ <menu_item_call label="ИÑпользовать наÑтройки региона" name="Use Region Settings"/>
+ </menu>
+ <menu label="Редактор Ñреды" name="Environment Editor">
+ <menu_item_call label="ÐаÑтройки Ñреды..." name="Environment Settings"/>
+ <menu label="ÐаÑтройки воды" name="Water Presets">
+ <menu_item_call label="Создать наÑтройку..." name="new_water_preset"/>
+ <menu_item_call label="Изменить наÑтройку..." name="edit_water_preset"/>
+ <menu_item_call label="Удалить наÑтройку..." name="delete_water_preset"/>
+ </menu>
+ <menu label="ÐаÑтройки неба" name="Sky Presets">
+ <menu_item_call label="Создать наÑтройку..." name="new_sky_preset"/>
+ <menu_item_call label="Изменить наÑтройку..." name="edit_sky_preset"/>
+ <menu_item_call label="Удалить наÑтройку..." name="delete_sky_preset"/>
+ </menu>
+ <menu label="Суточные наÑтройки" name="Day Presets">
+ <menu_item_call label="Создать наÑтройку..." name="new_day_preset"/>
+ <menu_item_call label="Изменить наÑтройку..." name="edit_day_preset"/>
+ <menu_item_call label="Удалить наÑтройку..." name="delete_day_preset"/>
+ </menu>
+ </menu>
+ </menu>
+ <menu label="СтроительÑтво" name="BuildTools">
+ <menu_item_check label="СтроительÑтво" name="Show Build Tools"/>
+ <menu label="Выбрать инÑтрументы" name="Select Tool">
+ <menu_item_call label="ФокуÑ" name="Focus"/>
+ <menu_item_call label="Перемещение" name="Move"/>
+ <menu_item_call label="Редактирование" name="Edit"/>
+ <menu_item_call label="Создание" name="Create"/>
+ <menu_item_call label="ЗемлÑ" name="Land"/>
+ </menu>
+ <menu_item_call label="Объединить" name="Link"/>
+ <menu_item_call label="Разъединить" name="Unlink"/>
+ <menu_item_check label="Редактировать объединенные чаÑти" name="Edit Linked Parts"/>
+ <menu label="Выбрать объединенные чаÑти" name="Select Linked Parts">
+ <menu_item_call label="Выбрать Ñледующую" name="Select Next Part"/>
+ <menu_item_call label="Выбрать предыдущую" name="Select Previous Part"/>
+ <menu_item_call label="Включить Ñледующую" name="Include Next Part"/>
+ <menu_item_call label="Включить предыдущую" name="Include Previous Part"/>
+ </menu>
+ <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 Buy"/>
+ <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 Object Contents"/>
+ <menu_item_call label="Вернуть объект" name="Return Object back to Owner"/>
+ </menu>
+ <menu label="Скрипты" name="Scripts">
+ <menu_item_call label="Перекомпилировать Ñкрипты (Mono)" name="Mono"/>
+ <menu_item_call label="Перекомпилировать Ñкрипты (LSL)" name="LSL"/>
+ <menu_item_call label="Ð¡Ð±Ñ€Ð¾Ñ Ñкриптов" name="Reset Scripts"/>
+ <menu_item_call label="ЗапуÑтить Ñкрипты" name="Set Scripts to Running"/>
+ <menu_item_call label="ОÑтановить Ñкрипты" name="Set Scripts to Not Running"/>
+ </menu>
+ <menu label="Параметры" name="Options">
+ <menu_item_check label="Показать раÑширенные разрешениÑ" name="DebugPermissions"/>
+ <menu_item_check label="Выбирать только мои объекты" name="Select Only My Objects"/>
+ <menu_item_check label="Выбирать только перемещаемые объекты" name="Select Only Movable Objects"/>
+ <menu_item_check label="Выбор близлежащих" name="Select By Surrounding"/>
+ <menu_item_check label="ВыделÑть контуры выбранного" name="Show Selection Outlines"/>
+ <menu_item_check label="Показывать Ñкрытые выбранные объекты" name="Show Hidden Selection"/>
+ <menu_item_check label="Показать Ñ€Ð°Ð´Ð¸ÑƒÑ Ð¾ÑÐ²ÐµÑ‰ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð²Ñ‹Ð±Ñ€Ð°Ð½Ð½Ñ‹Ñ…" name="Show Light Radius for Selection"/>
+ <menu_item_check label="Показать луч выбора" name="Show Selection Beam"/>
+ <menu_item_check label="ПривÑзка к Ñетке" name="Snap to Grid"/>
+ <menu_item_call label="Сдвиг к ближайшему узлу XY Ñетки" name="Snap Object XY to Grid"/>
+ <menu_item_call label="ИÑпользовать выбранное Ð´Ð»Ñ Ñетки" name="Use Selection for Grid"/>
+ <menu_item_call label="Параметры Ñетки" name="Grid Options"/>
+ </menu>
+ <menu label="Передача" name="Upload">
+ <menu_item_call label="Изображение (L$[COST])..." name="Upload Image"/>
+ <menu_item_call label="Звук (L$[COST])..." name="Upload Sound"/>
+ <menu_item_call label="ÐÐ½Ð¸Ð¼Ð°Ñ†Ð¸Ñ (L$[COST])..." name="Upload Animation"/>
+ <menu_item_call label="Модель..." name="Upload Model"/>
+ <menu_item_call label="Ð’Ñе Ñразу (L$[COST] за файл)..." name="Bulk Upload"/>
+ <menu_item_call label="УÑтановить Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ð½Ð° передачу по умолчанию" name="perm prefs"/>
+ </menu>
+ <menu_item_call label="Отменить" name="Undo"/>
+ <menu_item_call label="Вернуть" name="Redo"/>
+ </menu>
+ <menu label="Справка" name="Help">
+ <menu_item_call label="ИнÑтрукции..." name="How To"/>
+ <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="О [APP_NAME]" name="About Second Life"/>
+ </menu>
+ <menu label="Дополнительно" name="Advanced">
+ <menu_item_call label="Обновить текÑтуры" name="Rebake Texture"/>
+ <menu_item_call label="СброÑить размер интерфейÑа" name="Set UI Size to Default"/>
+ <menu_item_call label="Задать размер окна..." name="Set Window Size..."/>
+ <menu_item_check label="Ограничение раÑÑтоÑÐ½Ð¸Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð°" name="Limit Select Distance"/>
+ <menu_item_check label="Отключить ограничение камеры" name="Disable Camera Distance"/>
+ <menu_item_check label="Снимок выÑокого разрешениÑ" name="HighResSnapshot"/>
+ <menu_item_check label="Тихое Ñоздание Ñнимка" name="QuietSnapshotsToDisk"/>
+ <menu label="ПроизводительноÑть" name="Performance Tools">
+ <menu_item_call label="Запаздывание" name="Lag Meter"/>
+ <menu_item_check label="СтатиÑтика" name="Statistics Bar"/>
+ <menu_item_check label="Показать Ð²ÐµÑ Ð¾Ñ‚Ñ€Ð¸Ñовки Ð´Ð»Ñ Ð°Ð²Ð°Ñ‚Ð°Ñ€Ð¾Ð²" name="Avatar Rendering Cost"/>
+ </menu>
+ <menu label="ПодÑветка и видимоÑть" name="Highlighting and Visibility">
+ <menu_item_check label="Мигающий маÑк" name="Cheesy Beacon"/>
+ <menu_item_check label="Скрыть чаÑтицы" name="Hide Particles"/>
+ <menu_item_check label="Скрыть выбранное" name="Hide Selected"/>
+ <menu_item_check label="ПодÑветка прозрачного" name="Highlight Transparent"/>
+ <menu_item_check label="Показывать приÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ HUD" name="Show HUD Attachments"/>
+ <menu_item_check label="Показывать прицел при обзоре мышью" name="ShowCrosshairs"/>
+ </menu>
+ <menu label="Типы визуализации" name="Rendering Types">
+ <menu_item_check label="ОбычнаÑ" name="Simple"/>
+ <menu_item_check label="Ðльфа" name="Alpha"/>
+ <menu_item_check label="Дерево" name="Tree"/>
+ <menu_item_check label="Ðватары" name="Character"/>
+ <menu_item_check label="ИÑправление поверхноÑти" name="Surface Patch"/>
+ <menu_item_check label="Ðебо" name="Sky"/>
+ <menu_item_check label="Вода" name="Water"/>
+ <menu_item_check label="ЗемлÑ" name="Ground"/>
+ <menu_item_check label="Объем" name="Volume"/>
+ <menu_item_check label="Трава" name="Grass"/>
+ <menu_item_check label="Облака" name="Clouds"/>
+ <menu_item_check label="ЧаÑтицы" name="Particles"/>
+ <menu_item_check label="Рельефное" name="Bump"/>
+ </menu>
+ <menu label="Функции визуализации" name="Rendering Features">
+ <menu_item_check label="Ð˜Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ" name="UI"/>
+ <menu_item_check label="Выбрано" name="Selected"/>
+ <menu_item_check label="Выделено" name="Highlighted"/>
+ <menu_item_check label="ДинамичеÑкие текÑтуры" name="Dynamic Textures"/>
+ <menu_item_check label="Тени от ног" name="Foot Shadows"/>
+ <menu_item_check label="Туман" name="Fog"/>
+ <menu_item_check label="Проверить данные FR" name="Test FRInfo"/>
+ <menu_item_check label="Гибкие объекты" name="Flexible Objects"/>
+ </menu>
+ <menu_item_check label="ИÑпользовать поток Ð´Ð»Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡Ð°ÐµÐ¼Ñ‹Ñ… модулей" name="Use Plugin Read Thread"/>
+ <menu_item_call label="ОчиÑтить кÑш группы" name="ClearGroupCache"/>
+ <menu_item_check label="Сглаживание мышью" name="Mouse Smoothing"/>
+ <menu_item_call label="ОÑвободить клавиши" name="Release Keys"/>
+ <menu label="ГорÑчие клавиши" name="Shortcuts">
+ <menu_item_call label="Изображение (L$[COST])..." name="Upload Image"/>
+ <menu_item_check label="ПоиÑк" name="Search"/>
+ <menu_item_check label="Показать меню «Дополнительно» - Ñтарое Ñочетание клавиш" name="Show Advanced Menu - legacy shortcut"/>
+ <menu_item_call label="Закрыть окно" name="Close Window"/>
+ <menu_item_call label="Закрыть вÑе окна" name="Close All Windows"/>
+ <menu_item_call label="Сохранить Ñнимок на диÑке" name="Snapshot to Disk"/>
+ <menu_item_call label="Обзор мышью" name="Mouselook"/>
+ <menu_item_check label="Обзор джойÑтиком" name="Joystick Flycam"/>
+ <menu_item_call label="Ð¡Ð±Ñ€Ð¾Ñ Ð¾Ð±Ð·Ð¾Ñ€Ð°" name="Reset View"/>
+ <menu_item_call label="Смотреть на поÑледнего говорившего" name="Look at Last Chatter"/>
+ <menu label="Выбрать инÑтрументы" name="Select Tool">
+ <menu_item_call label="ФокуÑ" name="Focus"/>
+ <menu_item_call label="Перемещение" name="Move"/>
+ <menu_item_call label="Редактирование" name="Edit"/>
+ <menu_item_call label="Создание" name="Create"/>
+ <menu_item_call label="ЗемлÑ" name="Land"/>
+ </menu>
+ <menu_item_call label="Приблизить" name="Zoom In"/>
+ <menu_item_call label="Стандартный маÑштаб" name="Zoom Default"/>
+ <menu_item_call label="Отодвинуть" name="Zoom Out"/>
+ </menu>
+ <menu_item_call label="Отладочные наÑтройки" name="Debug Settings"/>
+ <menu_item_check label="Показать меню разработчика" name="Debug Mode"/>
+ </menu>
+ <menu label="Разработка" name="Develop">
+ <menu label="КонÑоли" name="Consoles">
+ <menu_item_check label="КонÑоль текÑтур" name="Texture Console"/>
+ <menu_item_check label="КонÑоль отладки" name="Debug Console"/>
+ <menu_item_call label="КонÑоль уведомлений" name="Notifications"/>
+ <menu_item_check label="КонÑоль размера текÑтуры" name="Texture Size"/>
+ <menu_item_check label="КонÑоль категории текÑтуры" name="Texture Category"/>
+ <menu_item_check label="Оперативные таймеры" name="Fast Timers"/>
+ <menu_item_check label="ПамÑть" name="Memory"/>
+ <menu_item_check label="СтатиÑтика по Ñцене" name="Scene Statistics"/>
+ <menu_item_call label="Данные о регионе на конÑоль отладки" name="Region Info to Debug Console"/>
+ <menu_item_call label="Данны о группе на конÑоль отладки" name="Group Info to Debug Console"/>
+ <menu_item_call label="Данные о ÑпоÑобноÑÑ‚ÑÑ… на конÑоль отладки" name="Capabilities Info to Debug Console"/>
+ <menu_item_check label="Камера" name="Camera"/>
+ <menu_item_check label="Ветер" name="Wind"/>
+ <menu_item_check label="Угол обзора" name="FOV"/>
+ <menu_item_check label="Значок" name="Badge"/>
+ </menu>
+ <menu label="Показать данные" name="Display Info">
+ <menu_item_check label="Показать времÑ" name="Show Time"/>
+ <menu_item_check label="Показывать цену передачи" name="Show Upload Cost"/>
+ <menu_item_check label="Показать данные по отриÑовке" name="Show Render Info"/>
+ <menu_item_check label="Показать данные о текÑтурах" name="Show Texture Info"/>
+ <menu_item_check label="Показать матрицы" name="Show Matrices"/>
+ <menu_item_check label="Показать цвет под курÑором" name="Show Color Under Cursor"/>
+ <menu_item_check label="Показать памÑть" name="Show Memory"/>
+ <menu_item_check label="Показать закрытые данные о памÑти" name="Show Private Mem Info"/>
+ <menu_item_check label="Показать Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¾Ð±ÑŠÐµÐºÑ‚Ð¾Ð²" name="Show Updates"/>
+ </menu>
+ <menu label="Принудительно вызвать ошибку" name="Force Errors">
+ <menu_item_call label="Принудительно перейти в точку оÑтанова" name="Force Breakpoint"/>
+ <menu_item_call label="Принудительно вызвать ошибку LL и Ñбой" name="Force LLError And Crash"/>
+ <menu_item_call label="Принудительный неправильный доÑтуп к памÑти" name="Force Bad Memory Access"/>
+ <menu_item_call label="Принудительное зацикливание" name="Force Infinite Loop"/>
+ <menu_item_call label="Принудительный Ñбой драйвера" name="Force Driver Carsh"/>
+ <menu_item_call label="Принудительное иÑключение" name="Force Software Exception"/>
+ <menu_item_call label="Принудительно отключить клиент" name="Force Disconnect Viewer"/>
+ <menu_item_call label="Имитировать утечку памÑти" name="Memory Leaking Simulation"/>
+ </menu>
+ <menu label="ТеÑты визуализации" name="Render Tests">
+ <menu_item_check label="Сдвиг камеры" name="Camera Offset"/>
+ <menu_item_check label="Ð¡Ð»ÑƒÑ‡Ð°Ð¹Ð½Ð°Ñ Ñ‡Ð°Ñтота кадров" name="Randomize Framerate"/>
+ <menu_item_check label="ПериодичеÑкое замедление кадров" name="Periodic Slow Frame"/>
+ <menu_item_check label="ТеÑÑ‚ кадров" name="Frame Test"/>
+ </menu>
+ <menu label="Визуализировать метаданные" name="Render Metadata">
+ <menu_item_check label="Рамки" name="Bounding Boxes"/>
+ <menu_item_check label="Ðормали" name="Normals"/>
+ <menu_item_check label="Октадерево" name="Octree"/>
+ <menu_item_check label="Тень от уÑеченной пирамиды" name="Shadow Frusta"/>
+ <menu_item_check label="ФизичеÑкие формы" name="Physics Shapes"/>
+ <menu_item_check label="Смыкание" name="Occlusion"/>
+ <menu_item_check label="Ð’Ð¸Ð·ÑƒÐ°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð¿Ð¾Ñ€Ñ†Ð¸Ñми" name="Render Batches"/>
+ <menu_item_check label="Тип обновлениÑ" name="Update Type"/>
+ <menu_item_check label="ÐÐ½Ð¸Ð¼Ð°Ñ†Ð¸Ñ Ñ‚ÐµÐºÑтуры" name="Texture Anim"/>
+ <menu_item_check label="Приоритет текÑтуры" name="Texture Priority"/>
+ <menu_item_check label="Площадь текÑтуры" name="Texture Area"/>
+ <menu_item_check label="Площадь грани" name="Face Area"/>
+ <menu_item_check label="Данные об уровнÑÑ… детализации" name="LOD Info"/>
+ <menu_item_check label="Очередь поÑтроителÑ" name="Build Queue"/>
+ <menu_item_check label="ОÑвещение" name="Lights"/>
+ <menu_item_check label="ÐšÐ°Ñ€ÐºÐ°Ñ Ñтолкновений" name="Collision Skeleton"/>
+ <menu_item_check label="Лучи" name="Raycast"/>
+ <menu_item_check label="ÐÐ°Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð²ÐµÑ‚Ñ€Ð°" name="Wind Vectors"/>
+ <menu_item_check label="СложноÑть визуализации" name="rendercomplexity"/>
+ <menu_item_check label="Лепка" name="Sculpt"/>
+ </menu>
+ <menu label="ВизуализациÑ" name="Rendering">
+ <menu_item_check label="ОÑи" name="Axes"/>
+ <menu_item_check label="КаÑательный базиÑ" name="Tangent Basis"/>
+ <menu_item_call label="Ð’Ñ‹Ð±Ñ€Ð°Ð½Ð½Ð°Ñ Ñ‚ÐµÐºÑтура в оÑнове" name="Selected Texture Info Basis"/>
+ <menu_item_check label="КаркаÑ" name="Wireframe"/>
+ <menu_item_check label="Смыкание объектов" name="Object-Object Occlusion"/>
+ <menu_item_check label="ОÑвещение и тени" name="Lighting and Shadows"/>
+ <menu_item_check label="Тени от Ñолнца, луны и прожекторов" name="Shadows from Sun/Moon/Projectors"/>
+ <menu_item_check label="SSAO и Ñглаживание теней" name="SSAO and Shadow Smoothing"/>
+ <menu_item_check label="Отладка GL" name="Debug GL"/>
+ <menu_item_check label="Отладка конвейера" name="Debug Pipeline"/>
+ <menu_item_check label="ÐвтоматичеÑкие альфа-маÑки (отложенные)" name="Automatic Alpha Masks (deferred)"/>
+ <menu_item_check label="ÐвтоматичеÑкие альфа-маÑки (не отложенные)" name="Automatic Alpha Masks (non-deferred)"/>
+ <menu_item_check label="ТекÑтуры анимаций" name="Animation Textures"/>
+ <menu_item_check label="Отключить текÑтуры" name="Disable Textures"/>
+ <menu_item_check label="ТекÑтуры в полном разрешении" name="Rull Res Textures"/>
+ <menu_item_check label="Проверить текÑтуры" name="Audit Textures"/>
+ <menu_item_check label="ÐÑ‚Ð»Ð°Ñ Ñ‚ÐµÐºÑтур (ÑкÑÐ¿ÐµÑ€Ð¸Ð¼ÐµÐ½Ñ‚Ð°Ð»ÑŒÐ½Ð°Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ)" name="Texture Atlas"/>
+ <menu_item_check label="Ð’Ð¸Ð·ÑƒÐ°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð¿Ñ€Ð¸Ñоединенных иÑточников Ñвета" name="Render Attached Lights"/>
+ <menu_item_check label="Ð’Ð¸Ð·ÑƒÐ°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð¿Ñ€Ð¸Ñоединенных чаÑтиц" name="Render Attached Particles"/>
+ <menu_item_check label="ПарÑщие ÑветÑщиеÑÑ Ð¾Ð±ÑŠÐµÐºÑ‚Ñ‹" name="Hover Glow Objects"/>
+ </menu>
+ <menu label="Сеть" name="Network">
+ <menu_item_check label="ПриоÑтановить клиент" name="AgentPause"/>
+ <menu_item_call label="Включить журнал Ñообщений" name="Enable Message Log"/>
+ <menu_item_call label="Отключить журнал Ñообщений" name="Disable Message Log"/>
+ <menu_item_check label="СкороÑть интерполÑции объектов" name="Velocity Interpolate Objects"/>
+ <menu_item_check label="Прикрепить объекты Ð´Ð»Ñ Ð¸Ð½Ñ‚ÐµÑ€Ð¿Ð¾Ð»Ñции" name="Ping Interpolate Object Positions"/>
+ <menu_item_call label="ОпуÑтить пакет" name="Drop a Packet"/>
+ </menu>
+ <menu_item_call label="Дамп камеры Ñо Ñкриптами" name="Dump Scripted Camera"/>
+ <menu_item_call label="СтолкновениÑ, толчки и удары" name="Bumps, Pushes &amp;amp; Hits"/>
+ <menu label="Диктофон" name="Recorder">
+ <menu_item_call label="Ðачать воÑпроизведение" name="Start Playback"/>
+ <menu_item_call label="ОÑтановить воÑпроизведение" name="Stop Playback"/>
+ <menu_item_check label="Зациклить воÑпроизведение" name="Loop Playback"/>
+ <menu_item_call label="Ðачать запиÑÑŒ" name="Start Record"/>
+ <menu_item_call label="ОÑтановить запиÑÑŒ" name="Stop Record"/>
+ </menu>
+ <menu label="Мир" name="World">
+ <menu_item_check label="Перекрытие Ñолнца в ÑимулÑторе" name="Sim Sun Override"/>
+ <menu_item_check label="Мигающий маÑк" name="Cheesy Beacon"/>
+ <menu_item_check label="ÐÐµÐ¸Ð·Ð¼ÐµÐ½Ð½Ð°Ñ Ð¿Ð¾Ð³Ð¾Ð´Ð°" name="Fixed Weather"/>
+ <menu_item_call label="Вывод кÑша региональных объектов" name="Dump Region Object Cache"/>
+ </menu>
+ <menu label="Ð˜Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ" name="UI">
+ <menu_item_call label="Проверка медиабраузера" name="Web Browser Test"/>
+ <menu_item_call label="Браузер Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñмотра веб-контента" name="Web Content Browser"/>
+ <menu_item_call label="Вывод SelectMgr" name="Dump SelectMgr"/>
+ <menu_item_call label="Вывод инвентарÑ" name="Dump Inventory"/>
+ <menu_item_call label="Вывод таймеров" name="Dump Timers"/>
+ <menu_item_call label="Вывод ÑредÑтва фокуÑировки" name="Dump Focus Holder"/>
+ <menu_item_call label="Печать информации о выбранных объектах" name="Print Selected Object Info"/>
+ <menu_item_call label="Печать информации об агенте" name="Print Agent Info"/>
+ <menu_item_call label="СтатиÑтичеÑÐºÐ°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ памÑти" name="Memory Stats"/>
+ <menu_item_check label="КонÑоль отладки региона" name="Region Debug Console"/>
+ <menu_item_check label="Отладка SelectMgr" name="Debug SelectMgr"/>
+ <menu_item_check label="Отладка щелчков мышью" name="Debug Clicks"/>
+ <menu_item_check label="Отладка обзора" name="Debug Views"/>
+ <menu_item_check label="Отладка контекÑтных окон к названиÑм" name="Debug Name Tooltips"/>
+ <menu_item_check label="Отладка выполнÑемых Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ мыши дейÑтвий" name="Debug Mouse Events"/>
+ <menu_item_check label="Отладка клавиш" name="Debug Keys"/>
+ <menu_item_check label="Отладка WindowProc" name="Debug WindowProc"/>
+ </menu>
+ <menu label="XUI" name="XUI">
+ <menu_item_call label="Обновить наÑтройки цветов" name="Reload Color Settings"/>
+ <menu_item_call label="Показать проверку шрифтов" name="Show Font Test"/>
+ <menu_item_check label="Показать имена XUI" name="Show XUI Names"/>
+ <menu_item_call label="Отправить теÑтовое Ñообщение" name="Send Test IMs"/>
+ <menu_item_call label="ОчиÑтить кÑши имен" name="Flush Names Caches"/>
+ </menu>
+ <menu label="Ðватар" name="Character">
+ <menu label="Захват запеченных текÑтур" name="Grab Baked Texture">
+ <menu_item_call label="Радужка" name="Iris"/>
+ <menu_item_call label="Голова" name="Head"/>
+ <menu_item_call label="ВерхнÑÑ Ñ‡Ð°Ñть тела" name="Upper Body"/>
+ <menu_item_call label="ÐижнÑÑ Ñ‡Ð°Ñть тела" name="Lower Body"/>
+ <menu_item_call label="Юбка" name="Skirt"/>
+ </menu>
+ <menu label="Проверка перÑонажа" name="Character Tests">
+ <menu_item_call label="Внешний вид в XML" name="Appearance To XML"/>
+ <menu_item_call label="Ðктивировать геометрию перÑонажа" name="Toggle Character Geometry"/>
+ <menu_item_call label="Проверка мужчины" name="Test Male"/>
+ <menu_item_call label="Проверка женщины" name="Test Female"/>
+ <menu_item_call label="Ðктивировать PG-контент" name="Toggle PG"/>
+ <menu_item_check label="Разрешить выбор аватара" name="Allow Select Avatar"/>
+ </menu>
+ <menu_item_call label="Скинуть параметры" name="Force Params to Default"/>
+ <menu_item_check label="Данные об анимации" name="Animation Info"/>
+ <menu_item_check label="ÐÐ½Ð¸Ð¼Ð°Ñ†Ð¸Ñ Ð¼ÐµÐ´Ð»ÐµÐ½Ð½Ñ‹Ñ… движений" name="Slow Motion Animations"/>
+ <menu_item_check label="Показать взглÑд" name="Show Look At"/>
+ <menu_item_check label="Показать указание" name="Show Point At"/>
+ <menu_item_check label="Отладка обновленных движений ÑуÑтавов" name="Debug Joint Updates"/>
+ <menu_item_check label="Отключить детализацию" name="Disable LOD"/>
+ <menu_item_check label="Отладка видимоÑти перÑонажа" name="Debug Character Vis"/>
+ <menu_item_check label="Показать Ñкелет" name="Show Collision Skeleton"/>
+ <menu_item_check label="Отобразить дейÑтвие агента" name="Display Agent Target"/>
+ --&gt;
+ <menu_item_call label="Вывод приÑоединений" name="Dump Attachments"/>
+ <menu_item_call label="Отладка текÑтур аватара" name="Debug Avatar Textures"/>
+ <menu_item_call label="Вывод локальных текÑтур" name="Dump Local Textures"/>
+ </menu>
+ <menu_item_check label="ТекÑтуры HTTP" name="HTTP Textures"/>
+ <menu_item_check label="Инвентарь HTTP" name="HTTP Inventory"/>
+ <menu_item_call label="Сжатие изображений" name="Compress Images"/>
+ <menu_item_check label="Вывод минидампа при отладке" name="Output Debug Minidump"/>
+ <menu_item_check label="Окно конÑоли при Ñледующем запуÑке" name="Console Window"/>
+ <menu_item_call label="Ð—Ð°Ð¿Ñ€Ð¾Ñ ÑтатуÑа админиÑтратора" name="Request Admin Options"/>
+ <menu_item_call label="Выход из ÑтатуÑа админиÑтратора" name="Leave Admin Options"/>
+ <menu_item_check label="Показать меню админиÑтратора" name="View Admin Options"/>
+ </menu>
+ <menu label="ÐдминиÑтратор" name="Admin">
+ <menu label="Object">
+ <menu_item_call label="ВзÑть копию" name="Take Copy"/>
+ <menu_item_call label="Ðазначить ÑÐµÐ±Ñ Ð²Ð»Ð°Ð´ÐµÐ»ÑŒÑ†ÐµÐ¼" name="Force Owner To Me"/>
+ <menu_item_call label="Ðазначить полноправным владельцем" name="Force Owner Permissive"/>
+ <menu_item_call label="Удалить" name="Delete"/>
+ <menu_item_call label="Ðа меÑте" name="Lock"/>
+ <menu_item_call label="Получить ID активов" name="Get Assets IDs"/>
+ </menu>
+ <menu label="УчаÑток" name="Parcel">
+ <menu_item_call label="Ðазначить ÑÐµÐ±Ñ Ð²Ð»Ð°Ð´ÐµÐ»ÑŒÑ†ÐµÐ¼" name="Owner To Me"/>
+ <menu_item_call label="Задать Ð´Ð»Ñ ÐºÐ¾Ð½Ñ‚ÐµÐ½Ñ‚Ð° Linden" name="Set to Linden Content"/>
+ <menu_item_call label="ÐŸÑ€ÐµÑ‚ÐµÐ½Ð·Ð¸Ñ Ð½Ð° публичную землю" name="Claim Public Land"/>
+ </menu>
+ <menu label="Регион" name="Region">
+ <menu_item_call label="Вывод временных данных актива" name="Dump Temp Asset Data"/>
+ <menu_item_call label="Сохранить ÑоÑтоÑние региона" name="Save Region State"/>
+ </menu>
+ <menu_item_call label="ИнÑтрументы творца" name="God Tools"/>
+ </menu>
+ <menu label="ÐдминиÑтратор" name="Deprecated">
+ <menu label="ПриÑоединить объект" name="Attach Object"/>
+ <menu label="ОтÑоединить объект" name="Detach Object"/>
+ <menu label="СнÑть одежду" name="Take Off Clothing">
+ <menu_item_call label="Рубашка" name="Shirt"/>
+ <menu_item_call label="Брюки" name="Pants"/>
+ <menu_item_call label="Обувь" name="Shoes"/>
+ <menu_item_call label="ÐоÑки" name="Socks"/>
+ <menu_item_call label="Пиджак" name="Jacket"/>
+ <menu_item_call label="Перчатки" name="Gloves"/>
+ <menu_item_call label="Майка" name="Menu Undershirt"/>
+ <menu_item_call label="ТруÑÑ‹" name="Menu Underpants"/>
+ <menu_item_call label="Юбка" name="Skirt"/>
+ <menu_item_call label="Ðльфа" name="Alpha"/>
+ <menu_item_call label="Тату" name="Tattoo"/>
+ <menu_item_call label="Физика" name="Physics"/>
+ <menu_item_call label="Ð’ÑÑ Ð¾Ð´ÐµÐ¶Ð´Ð°" name="All Clothes"/>
+ </menu>
+ <menu label="Справка" name="Help">
+ <menu_item_call label="Официальный блог Linden" name="Official Linden Blog"/>
+ <menu_item_call label="Портал Ñкриптов" name="Scripting Portal"/>
+ <menu label="Сообщение об ошибке" name="Bug Reporting">
+ <menu_item_call label="ОбщедоÑтупное ÑредÑтво отÑÐ»ÐµÐ¶Ð¸Ð²Ð°Ð½Ð¸Ñ Ð¿Ñ€Ð¾Ð±Ð»ÐµÐ¼" name="Public Issue Tracker"/>
+ <menu_item_call label="Справка по общедоÑтупному ÑредÑтву отÑÐ»ÐµÐ¶Ð¸Ð²Ð°Ð½Ð¸Ñ Ð¿Ñ€Ð¾Ð±Ð»ÐµÐ¼" name="Publc Issue Tracker Help"/>
+ <menu_item_call label="Сообщение об ошибке 101" name="Bug Reporing 101"/>
+ <menu_item_call label="Проблемы безопаÑноÑти" name="Security Issues"/>
+ <menu_item_call label="QA Wiki" name="QA Wiki"/>
+ </menu>
+ </menu>
+ </menu>
+</menu_bar>
diff --git a/indra/newview/skins/default/xui/ru/menu_wearable_list_item.xml b/indra/newview/skins/default/xui/ru/menu_wearable_list_item.xml
new file mode 100644
index 0000000000..2832e17b7d
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_wearable_list_item.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Outfit Wearable Context Menu">
+ <menu_item_call label="Заменить" name="wear_replace"/>
+ <menu_item_call label="Ðадеть" name="wear_wear"/>
+ <menu_item_call label="Добавить" name="wear_add"/>
+ <menu_item_call label="СнÑть / отÑоединить" name="take_off_or_detach"/>
+ <menu_item_call label="ОтÑоединить" name="detach"/>
+ <context_menu label="ПриÑоединить" name="wearable_attach_to"/>
+ <context_menu label="ПриÑоединить к данным в игре" name="wearable_attach_to_hud"/>
+ <menu_item_call label="СнÑть" name="take_off"/>
+ <menu_item_call label="Изменить" name="edit"/>
+ <menu_item_call label="Профиль объекта" name="object_profile"/>
+ <menu_item_call label="Показать оригинал" name="show_original"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_wearing_gear.xml b/indra/newview/skins/default/xui/ru/menu_wearing_gear.xml
new file mode 100644
index 0000000000..c2351fbfff
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_wearing_gear.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="Gear Wearing">
+ <menu_item_call label="Изменить коÑтюм" name="edit"/>
+ <menu_item_call label="СнÑть" name="takeoff"/>
+ <menu_item_call label="Копировать ÑпиÑок коÑтюмов в буфер обмена" name="copy"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_wearing_tab.xml b/indra/newview/skins/default/xui/ru/menu_wearing_tab.xml
new file mode 100644
index 0000000000..f178b39c77
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_wearing_tab.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Wearing">
+ <menu_item_call label="СнÑть" name="take_off"/>
+ <menu_item_call label="ОтÑоединить" name="detach"/>
+ <menu_item_call label="Изменить коÑтюм" name="edit"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/ru/mime_types.xml b/indra/newview/skins/default/xui/ru/mime_types.xml
new file mode 100644
index 0000000000..7ed23b5d53
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/mime_types.xml
@@ -0,0 +1,217 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<mimetypes name="default">
+ <widgetset name="web">
+ <label name="web_label">
+ Веб-контент
+ </label>
+ <tooltip name="web_tooltip">
+ Ð’ Ñтом меÑте еÑть веб-контент
+ </tooltip>
+ <playtip name="web_playtip">
+ Показать веб-контент
+ </playtip>
+ </widgetset>
+ <widgetset name="movie">
+ <label name="movie_label">
+ Видео
+ </label>
+ <tooltip name="movie_tooltip">
+ ЗдеÑÑŒ еÑть видео
+ </tooltip>
+ <playtip name="movie_playtip">
+ Показать видео
+ </playtip>
+ </widgetset>
+ <widgetset name="image">
+ <label name="image_label">
+ Картинка
+ </label>
+ <tooltip name="image_tooltip">
+ Ð’ Ñтом меÑте еÑть картинка
+ </tooltip>
+ <playtip name="image_playtip">
+ Показать картинку Ð´Ð»Ñ Ñтого меÑта
+ </playtip>
+ </widgetset>
+ <widgetset name="audio">
+ <label name="audio_label">
+ Звук
+ </label>
+ <tooltip name="audio_tooltip">
+ Ð’ Ñтом меÑте еÑть звук
+ </tooltip>
+ <playtip name="audio_playtip">
+ ВоÑпроизвеÑти звук Ð´Ð»Ñ Ñтого меÑта
+ </playtip>
+ </widgetset>
+ <scheme name="rtsp">
+ <label name="rtsp_label">
+ Поток RealTime
+ </label>
+ </scheme>
+ <mimetype name="blank">
+ <label name="blank_label">
+ - Ðичего -
+ </label>
+ </mimetype>
+ <mimetype name="none/none">
+ <label name="none/none_label">
+ - Ðичего -
+ </label>
+ </mimetype>
+ <mimetype name="audio/*">
+ <label name="audio2_label">
+ Звук
+ </label>
+ </mimetype>
+ <mimetype name="video/*">
+ <label name="video2_label">
+ Видео
+ </label>
+ </mimetype>
+ <mimetype name="image/*">
+ <label name="image2_label">
+ Картинка
+ </label>
+ </mimetype>
+ <mimetype name="video/vnd.secondlife.qt.legacy">
+ <label name="vnd.secondlife.qt.legacy_label">
+ Видео (QuickTime)
+ </label>
+ </mimetype>
+ <mimetype name="application/javascript">
+ <label name="application/javascript_label">
+ Javascript
+ </label>
+ </mimetype>
+ <mimetype name="application/ogg">
+ <label name="application/ogg_label">
+ Звук/видео Ogg
+ </label>
+ </mimetype>
+ <mimetype name="application/pdf">
+ <label name="application/pdf_label">
+ Документ PDF
+ </label>
+ </mimetype>
+ <mimetype name="application/postscript">
+ <label name="application/postscript_label">
+ Документ Postscript
+ </label>
+ </mimetype>
+ <mimetype name="application/rtf">
+ <label name="application/rtf_label">
+ Документ RTF
+ </label>
+ </mimetype>
+ <mimetype name="application/smil">
+ <label name="application/smil_label">
+ Документ SMIL
+ </label>
+ </mimetype>
+ <mimetype name="application/xhtml+xml">
+ <label name="application/xhtml+xml_label">
+ Веб-Ñтраница (XHTML)
+ </label>
+ </mimetype>
+ <mimetype name="application/x-director">
+ <label name="application/x-director_label">
+ Macromedia Director
+ </label>
+ </mimetype>
+ <mimetype name="audio/mid">
+ <label name="audio/mid_label">
+ Звук (MIDI)
+ </label>
+ </mimetype>
+ <mimetype name="audio/mpeg">
+ <label name="audio/mpeg_label">
+ Звук (MP3)
+ </label>
+ </mimetype>
+ <mimetype name="audio/x-aiff">
+ <label name="audio/x-aiff_label">
+ Звук (AIFF)
+ </label>
+ </mimetype>
+ <mimetype name="audio/x-wav">
+ <label name="audio/x-wav_label">
+ Звук (WAV)
+ </label>
+ </mimetype>
+ <mimetype name="image/bmp">
+ <label name="image/bmp_label">
+ Изображение (BMP)
+ </label>
+ </mimetype>
+ <mimetype name="image/gif">
+ <label name="image/gif_label">
+ Изображение (GIF)
+ </label>
+ </mimetype>
+ <mimetype name="image/jpeg">
+ <label name="image/jpeg_label">
+ Изображение (JPEG)
+ </label>
+ </mimetype>
+ <mimetype name="image/png">
+ <label name="image/png_label">
+ Изображение (PNG)
+ </label>
+ </mimetype>
+ <mimetype name="image/svg+xml">
+ <label name="image/svg+xml_label">
+ Изображение (SVG)
+ </label>
+ </mimetype>
+ <mimetype name="image/tiff">
+ <label name="image/tiff_label">
+ Изображение (TIFF)
+ </label>
+ </mimetype>
+ <mimetype name="text/html">
+ <label name="text/html_label">
+ Веб-Ñтраница
+ </label>
+ </mimetype>
+ <mimetype name="text/plain">
+ <label name="text/plain_label">
+ ТекÑÑ‚
+ </label>
+ </mimetype>
+ <mimetype name="text/xml">
+ <label name="text/xml_label">
+ XML
+ </label>
+ </mimetype>
+ <mimetype name="video/mpeg">
+ <label name="video/mpeg_label">
+ Видео (MPEG)
+ </label>
+ </mimetype>
+ <mimetype name="video/mp4">
+ <label name="video/mp4_label">
+ Видео (MP4)
+ </label>
+ </mimetype>
+ <mimetype name="video/quicktime">
+ <label name="video/quicktime_label">
+ Видео (QuickTime)
+ </label>
+ </mimetype>
+ <mimetype name="video/x-ms-asf">
+ <label name="video/x-ms-asf_label">
+ Видео (Windows Media ASF)
+ </label>
+ </mimetype>
+ <mimetype name="video/x-ms-wmv">
+ <label name="video/x-ms-wmv_label">
+ Видео (Windows Media WMV)
+ </label>
+ </mimetype>
+ <mimetype name="video/x-msvideo">
+ <label name="video/x-msvideo_label">
+ Видео (AVI)
+ </label>
+ </mimetype>
+</mimetypes>
diff --git a/indra/newview/skins/default/xui/ru/mime_types_linux.xml b/indra/newview/skins/default/xui/ru/mime_types_linux.xml
new file mode 100644
index 0000000000..a42b0bb9cc
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/mime_types_linux.xml
@@ -0,0 +1,217 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<mimetypes name="default">
+ <widgetset name="web">
+ <label name="web_label">
+ Веб-контент
+ </label>
+ <tooltip name="web_tooltip">
+ Ð’ Ñтом меÑте еÑть веб-контент
+ </tooltip>
+ <playtip name="web_playtip">
+ Показать веб-контент
+ </playtip>
+ </widgetset>
+ <widgetset name="movie">
+ <label name="movie_label">
+ Видео
+ </label>
+ <tooltip name="movie_tooltip">
+ ЗдеÑÑŒ еÑть видео
+ </tooltip>
+ <playtip name="movie_playtip">
+ Показать видео
+ </playtip>
+ </widgetset>
+ <widgetset name="image">
+ <label name="image_label">
+ Изображение
+ </label>
+ <tooltip name="image_tooltip">
+ Ð’ Ñтом меÑте еÑть картинка
+ </tooltip>
+ <playtip name="image_playtip">
+ Показать картинку Ð´Ð»Ñ Ñтого меÑта
+ </playtip>
+ </widgetset>
+ <widgetset name="audio">
+ <label name="audio_label">
+ Звук
+ </label>
+ <tooltip name="audio_tooltip">
+ Ð’ Ñтом меÑте еÑть звук
+ </tooltip>
+ <playtip name="audio_playtip">
+ ВоÑпроизвеÑти звук Ð´Ð»Ñ Ñтого меÑта
+ </playtip>
+ </widgetset>
+ <scheme name="rtsp">
+ <label name="rtsp_label">
+ Поток RealTime
+ </label>
+ </scheme>
+ <mimetype name="blank">
+ <label name="blank_label">
+ - Ðичего -
+ </label>
+ </mimetype>
+ <mimetype name="none/none">
+ <label name="none/none_label">
+ - Ðичего -
+ </label>
+ </mimetype>
+ <mimetype name="audio/*">
+ <label name="audio2_label">
+ Звук
+ </label>
+ </mimetype>
+ <mimetype name="video/*">
+ <label name="video2_label">
+ Видео
+ </label>
+ </mimetype>
+ <mimetype name="image/*">
+ <label name="image2_label">
+ Изображение
+ </label>
+ </mimetype>
+ <mimetype name="video/vnd.secondlife.qt.legacy">
+ <label name="vnd.secondlife.qt.legacy_label">
+ Видео (QuickTime)
+ </label>
+ </mimetype>
+ <mimetype name="application/javascript">
+ <label name="application/javascript_label">
+ Javascript
+ </label>
+ </mimetype>
+ <mimetype name="application/ogg">
+ <label name="application/ogg_label">
+ Звук/видео Ogg
+ </label>
+ </mimetype>
+ <mimetype name="application/pdf">
+ <label name="application/pdf_label">
+ Документ PDF
+ </label>
+ </mimetype>
+ <mimetype name="application/postscript">
+ <label name="application/postscript_label">
+ Документ Postscript
+ </label>
+ </mimetype>
+ <mimetype name="application/rtf">
+ <label name="application/rtf_label">
+ Документ RTF
+ </label>
+ </mimetype>
+ <mimetype name="application/smil">
+ <label name="application/smil_label">
+ Документ SMIL
+ </label>
+ </mimetype>
+ <mimetype name="application/xhtml+xml">
+ <label name="application/xhtml+xml_label">
+ Веб-Ñтраница (XHTML)
+ </label>
+ </mimetype>
+ <mimetype name="application/x-director">
+ <label name="application/x-director_label">
+ Macromedia Director
+ </label>
+ </mimetype>
+ <mimetype name="audio/mid">
+ <label name="audio/mid_label">
+ Звук (MIDI)
+ </label>
+ </mimetype>
+ <mimetype name="audio/mpeg">
+ <label name="audio/mpeg_label">
+ Звук (MP3)
+ </label>
+ </mimetype>
+ <mimetype name="audio/x-aiff">
+ <label name="audio/x-aiff_label">
+ Звук (AIFF)
+ </label>
+ </mimetype>
+ <mimetype name="audio/x-wav">
+ <label name="audio/x-wav_label">
+ Звук (WAV)
+ </label>
+ </mimetype>
+ <mimetype name="image/bmp">
+ <label name="image/bmp_label">
+ Изображение (BMP)
+ </label>
+ </mimetype>
+ <mimetype name="image/gif">
+ <label name="image/gif_label">
+ Изображение (GIF)
+ </label>
+ </mimetype>
+ <mimetype name="image/jpeg">
+ <label name="image/jpeg_label">
+ Изображение (JPEG)
+ </label>
+ </mimetype>
+ <mimetype name="image/png">
+ <label name="image/png_label">
+ Изображение (PNG)
+ </label>
+ </mimetype>
+ <mimetype name="image/svg+xml">
+ <label name="image/svg+xml_label">
+ Изображение (SVG)
+ </label>
+ </mimetype>
+ <mimetype name="image/tiff">
+ <label name="image/tiff_label">
+ Изображение (TIFF)
+ </label>
+ </mimetype>
+ <mimetype name="text/html">
+ <label name="text/html_label">
+ Веб-Ñтраница
+ </label>
+ </mimetype>
+ <mimetype name="text/plain">
+ <label name="text/plain_label">
+ ТекÑÑ‚
+ </label>
+ </mimetype>
+ <mimetype name="text/xml">
+ <label name="text/xml_label">
+ XML
+ </label>
+ </mimetype>
+ <mimetype name="video/mpeg">
+ <label name="video/mpeg_label">
+ Видео (MPEG)
+ </label>
+ </mimetype>
+ <mimetype name="video/mp4">
+ <label name="video/mp4_label">
+ Видео (MP4)
+ </label>
+ </mimetype>
+ <mimetype name="video/quicktime">
+ <label name="video/quicktime_label">
+ Видео (QuickTime)
+ </label>
+ </mimetype>
+ <mimetype name="video/x-ms-asf">
+ <label name="video/x-ms-asf_label">
+ Видео (Windows Media ASF)
+ </label>
+ </mimetype>
+ <mimetype name="video/x-ms-wmv">
+ <label name="video/x-ms-wmv_label">
+ Видео (Windows Media WMV)
+ </label>
+ </mimetype>
+ <mimetype name="video/x-msvideo">
+ <label name="video/x-msvideo_label">
+ Видео (AVI)
+ </label>
+ </mimetype>
+</mimetypes>
diff --git a/indra/newview/skins/default/xui/ru/mime_types_mac.xml b/indra/newview/skins/default/xui/ru/mime_types_mac.xml
new file mode 100644
index 0000000000..7ed23b5d53
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/mime_types_mac.xml
@@ -0,0 +1,217 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<mimetypes name="default">
+ <widgetset name="web">
+ <label name="web_label">
+ Веб-контент
+ </label>
+ <tooltip name="web_tooltip">
+ Ð’ Ñтом меÑте еÑть веб-контент
+ </tooltip>
+ <playtip name="web_playtip">
+ Показать веб-контент
+ </playtip>
+ </widgetset>
+ <widgetset name="movie">
+ <label name="movie_label">
+ Видео
+ </label>
+ <tooltip name="movie_tooltip">
+ ЗдеÑÑŒ еÑть видео
+ </tooltip>
+ <playtip name="movie_playtip">
+ Показать видео
+ </playtip>
+ </widgetset>
+ <widgetset name="image">
+ <label name="image_label">
+ Картинка
+ </label>
+ <tooltip name="image_tooltip">
+ Ð’ Ñтом меÑте еÑть картинка
+ </tooltip>
+ <playtip name="image_playtip">
+ Показать картинку Ð´Ð»Ñ Ñтого меÑта
+ </playtip>
+ </widgetset>
+ <widgetset name="audio">
+ <label name="audio_label">
+ Звук
+ </label>
+ <tooltip name="audio_tooltip">
+ Ð’ Ñтом меÑте еÑть звук
+ </tooltip>
+ <playtip name="audio_playtip">
+ ВоÑпроизвеÑти звук Ð´Ð»Ñ Ñтого меÑта
+ </playtip>
+ </widgetset>
+ <scheme name="rtsp">
+ <label name="rtsp_label">
+ Поток RealTime
+ </label>
+ </scheme>
+ <mimetype name="blank">
+ <label name="blank_label">
+ - Ðичего -
+ </label>
+ </mimetype>
+ <mimetype name="none/none">
+ <label name="none/none_label">
+ - Ðичего -
+ </label>
+ </mimetype>
+ <mimetype name="audio/*">
+ <label name="audio2_label">
+ Звук
+ </label>
+ </mimetype>
+ <mimetype name="video/*">
+ <label name="video2_label">
+ Видео
+ </label>
+ </mimetype>
+ <mimetype name="image/*">
+ <label name="image2_label">
+ Картинка
+ </label>
+ </mimetype>
+ <mimetype name="video/vnd.secondlife.qt.legacy">
+ <label name="vnd.secondlife.qt.legacy_label">
+ Видео (QuickTime)
+ </label>
+ </mimetype>
+ <mimetype name="application/javascript">
+ <label name="application/javascript_label">
+ Javascript
+ </label>
+ </mimetype>
+ <mimetype name="application/ogg">
+ <label name="application/ogg_label">
+ Звук/видео Ogg
+ </label>
+ </mimetype>
+ <mimetype name="application/pdf">
+ <label name="application/pdf_label">
+ Документ PDF
+ </label>
+ </mimetype>
+ <mimetype name="application/postscript">
+ <label name="application/postscript_label">
+ Документ Postscript
+ </label>
+ </mimetype>
+ <mimetype name="application/rtf">
+ <label name="application/rtf_label">
+ Документ RTF
+ </label>
+ </mimetype>
+ <mimetype name="application/smil">
+ <label name="application/smil_label">
+ Документ SMIL
+ </label>
+ </mimetype>
+ <mimetype name="application/xhtml+xml">
+ <label name="application/xhtml+xml_label">
+ Веб-Ñтраница (XHTML)
+ </label>
+ </mimetype>
+ <mimetype name="application/x-director">
+ <label name="application/x-director_label">
+ Macromedia Director
+ </label>
+ </mimetype>
+ <mimetype name="audio/mid">
+ <label name="audio/mid_label">
+ Звук (MIDI)
+ </label>
+ </mimetype>
+ <mimetype name="audio/mpeg">
+ <label name="audio/mpeg_label">
+ Звук (MP3)
+ </label>
+ </mimetype>
+ <mimetype name="audio/x-aiff">
+ <label name="audio/x-aiff_label">
+ Звук (AIFF)
+ </label>
+ </mimetype>
+ <mimetype name="audio/x-wav">
+ <label name="audio/x-wav_label">
+ Звук (WAV)
+ </label>
+ </mimetype>
+ <mimetype name="image/bmp">
+ <label name="image/bmp_label">
+ Изображение (BMP)
+ </label>
+ </mimetype>
+ <mimetype name="image/gif">
+ <label name="image/gif_label">
+ Изображение (GIF)
+ </label>
+ </mimetype>
+ <mimetype name="image/jpeg">
+ <label name="image/jpeg_label">
+ Изображение (JPEG)
+ </label>
+ </mimetype>
+ <mimetype name="image/png">
+ <label name="image/png_label">
+ Изображение (PNG)
+ </label>
+ </mimetype>
+ <mimetype name="image/svg+xml">
+ <label name="image/svg+xml_label">
+ Изображение (SVG)
+ </label>
+ </mimetype>
+ <mimetype name="image/tiff">
+ <label name="image/tiff_label">
+ Изображение (TIFF)
+ </label>
+ </mimetype>
+ <mimetype name="text/html">
+ <label name="text/html_label">
+ Веб-Ñтраница
+ </label>
+ </mimetype>
+ <mimetype name="text/plain">
+ <label name="text/plain_label">
+ ТекÑÑ‚
+ </label>
+ </mimetype>
+ <mimetype name="text/xml">
+ <label name="text/xml_label">
+ XML
+ </label>
+ </mimetype>
+ <mimetype name="video/mpeg">
+ <label name="video/mpeg_label">
+ Видео (MPEG)
+ </label>
+ </mimetype>
+ <mimetype name="video/mp4">
+ <label name="video/mp4_label">
+ Видео (MP4)
+ </label>
+ </mimetype>
+ <mimetype name="video/quicktime">
+ <label name="video/quicktime_label">
+ Видео (QuickTime)
+ </label>
+ </mimetype>
+ <mimetype name="video/x-ms-asf">
+ <label name="video/x-ms-asf_label">
+ Видео (Windows Media ASF)
+ </label>
+ </mimetype>
+ <mimetype name="video/x-ms-wmv">
+ <label name="video/x-ms-wmv_label">
+ Видео (Windows Media WMV)
+ </label>
+ </mimetype>
+ <mimetype name="video/x-msvideo">
+ <label name="video/x-msvideo_label">
+ Видео (AVI)
+ </label>
+ </mimetype>
+</mimetypes>
diff --git a/indra/newview/skins/default/xui/ru/notifications.xml b/indra/newview/skins/default/xui/ru/notifications.xml
new file mode 100644
index 0000000000..04f2f6b486
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/notifications.xml
@@ -0,0 +1,3092 @@
+<?xml version="1.0" encoding="utf-8"?>
+<notifications>
+ <global name="skipnexttime">
+ Больше не показывать
+ </global>
+ <global name="alwayschoose">
+ Ð’Ñегда выбирать Ñту опцию
+ </global>
+ <global name="implicitclosebutton">
+ Закрыть
+ </global>
+ <template name="okbutton">
+ <form>
+ <button name="OK_okbutton" text="$yestext"/>
+ </form>
+ </template>
+ <template name="okignore">
+ <form>
+ <button name="OK_okignore" text="$yestext"/>
+ </form>
+ </template>
+ <template name="okcancelbuttons">
+ <form>
+ <button name="OK_okcancelbuttons" text="$yestext"/>
+ <button name="Cancel_okcancelbuttons" text="$notext"/>
+ </form>
+ </template>
+ <template name="okcancelignore">
+ <form>
+ <button name="OK_okcancelignore" text="$yestext"/>
+ <button name="Cancel_okcancelignore" text="$notext"/>
+ </form>
+ </template>
+ <template name="okhelpbuttons">
+ <form>
+ <button name="OK_okhelpbuttons" text="$yestext"/>
+ <button name="Help" text="$helptext"/>
+ </form>
+ </template>
+ <template name="yesnocancelbuttons">
+ <form>
+ <button name="Yes" text="$yestext"/>
+ <button name="No" text="$notext"/>
+ <button name="Cancel_yesnocancelbuttons" text="$canceltext"/>
+ </form>
+ </template>
+ <notification label="ÐеизвеÑтное уведомление" name="MissingAlert">
+ Ваша верÑÐ¸Ñ [APP_NAME] не знает, как отобразить полученное уведомление. УбедитеÑÑŒ, что у Ð²Ð°Ñ ÑƒÑтановлена поÑледнÑÑ Ð²ÐµÑ€ÑÐ¸Ñ ÐºÐ»Ð¸ÐµÐ½Ñ‚Ð°.
+
+ПодробноÑти ошибки: уведомление под названием «[_NAME]» не было найдено в notifications.xml.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="FloaterNotFound">
+ Ошибка окна: не найдены Ñледующие Ñлементы управлениÑ:
+
+[CONTROLS]
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="TutorialNotFound">
+ Ð¡ÐµÐ¹Ñ‡Ð°Ñ Ð½ÐµÑ‚ доÑтупных учебников.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="GenericAlert">
+ [MESSAGE]
+ </notification>
+ <notification name="GenericAlertYesCancel">
+ [MESSAGE]
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="Да"/>
+ </notification>
+ <notification name="BadInstallation">
+ Произошла ошибка при обновлении [APP_NAME]. [http://get.secondlife.com Загрузите поÑледнюю верÑию] клиента.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="LoginFailedNoNetwork">
+ Ðе удалоÑÑŒ подключитьÑÑ Ðº [SECOND_LIFE_GRID].
+ «[DIAGNOSTIC]»
+УбедитеÑÑŒ, что подключение к интернету работает нормально.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="MessageTemplateNotFound">
+ Шаблон ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ [PATH] не найден.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="WearableSave">
+ Сохранить Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ñ‚ÐµÐ¿ÐµÑ€ÐµÑˆÐ½ÐµÐ¹ одежды/чаÑти тела?
+ <usetemplate canceltext="Отмена" name="yesnocancelbuttons" notext="Ðе ÑохранÑть" yestext="Сохранить"/>
+ </notification>
+ <notification name="ConfirmNoCopyToOutbox">
+ У Ð²Ð°Ñ Ð½ÐµÑ‚ прав Ð´Ð»Ñ ÐºÐ¾Ð¿Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ñтого Ñлемента в иÑходÑщую папку магазина. Ð’Ñ‹ дейÑтвительно хотите перемеÑтить Ñледующий Ñлемент?
+ [ITEM_NAME]
+ <usetemplate name="okcancelbuttons" notext="Ðет" yestext="Да"/>
+ </notification>
+ <notification name="OutboxUploadComplete">
+ Передача магазина завершена.
+ <usetemplate name="okbutton" yestext="Ура!"/>
+ </notification>
+ <notification name="OutboxUploadHadErrors">
+ Передача магазина выполнена Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ°Ð¼Ð¸! УÑтраните проблемы в иÑходÑщей папке и повторите передачу. СпаÑибо!
+ <usetemplate name="okbutton" yestext="Бу-у-у!"/>
+ </notification>
+ <notification name="CompileQueueSaveText">
+ Ошибка при передаче текÑта Ñкрипта по Ñледующей причине: [REASON]. Повторите попытку позже.
+ </notification>
+ <notification name="CompileQueueSaveBytecode">
+ Ошибка при передаче Ñкомпилированного Ñкрипта по Ñледующей причине: [REASON]. Повторите попытку позже.
+ </notification>
+ <notification name="WriteAnimationFail">
+ Ошибка при запиÑи данных анимации. Повторите попытку позже.
+ </notification>
+ <notification name="UploadAuctionSnapshotFail">
+ Ошибка при передаче Ñнимка аукциона по Ñледующей причине: [REASON]
+ </notification>
+ <notification name="UnableToViewContentsMoreThanOne">
+ Ðевозможно проÑмотреть Ñодержимое неÑкольких объектов одновременно.
+Выберите один объект и повторите попытку.
+ </notification>
+ <notification name="SaveClothingBodyChanges">
+ Сохранить вÑе Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² одежде/чаÑÑ‚ÑÑ… тела?
+ <usetemplate canceltext="Отмена" name="yesnocancelbuttons" notext="Ðе ÑохранÑть" yestext="Сохранить вÑе"/>
+ </notification>
+ <notification name="FriendsAndGroupsOnly">
+ Жители, которые не ÑвлÑÑŽÑ‚ÑÑ Ð²Ð°ÑˆÐ¸Ð¼Ð¸ друзьÑми, не будут знать, что вы игнорируете их звонки и ÑообщениÑ.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="FavoritesOnLogin">
+ Примечание. ПоÑле Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ñтой опции вÑе пользователи данного компьютера Ñмогут увидеть ÑпиÑок ваших избранных меÑÑ‚.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="GrantModifyRights">
+ ПредоÑтавление другому жителю прав на изменение позволит ему изменÑть, удалÑть или брать ЛЮБЫЕ ваши объекты. Будьте ОЧЕÐЬ оÑторожны Ñ Ð¿Ñ€ÐµÐ´Ð¾Ñтавлением такого разрешениÑ.
+Дать пользователю [NAME] права на изменение?
+ <usetemplate name="okcancelbuttons" notext="Ðет" yestext="Да"/>
+ </notification>
+ <notification name="GrantModifyRightsMultiple">
+ ПредоÑтавление другому жителю прав на изменение позволит ему изменÑть ЛЮБЫЕ ваши объекты. Будьте ОЧЕÐЬ оÑторожны Ñ Ð¿Ñ€ÐµÐ´Ð¾Ñтавлением такого разрешениÑ.
+Дать права на изменение выбранным жителÑм?
+ <usetemplate name="okcancelbuttons" notext="Ðет" yestext="Да"/>
+ </notification>
+ <notification name="RevokeModifyRights">
+ Отобрать у Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ [NAME] права на изменение?
+ <usetemplate name="okcancelbuttons" notext="Ðет" yestext="Да"/>
+ </notification>
+ <notification name="RevokeModifyRightsMultiple">
+ Отобрать у выбранных жителей права на изменение?
+ <usetemplate name="okcancelbuttons" notext="Ðет" yestext="Да"/>
+ </notification>
+ <notification name="UnableToCreateGroup">
+ Ðевозможно Ñоздать группу.
+[MESSAGE]
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="PanelGroupApply">
+ [NEEDS_APPLY_MESSAGE]
+[WANT_APPLY_MESSAGE]
+ <usetemplate canceltext="Отмена" name="yesnocancelbuttons" notext="Игнорировать изменениÑ" yestext="Применить изменениÑ"/>
+ </notification>
+ <notification name="MustSpecifyGroupNoticeSubject">
+ Ðеобходимо указать тему Ð´Ð»Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²ÐºÐ¸ группового уведомлениÑ.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="AddGroupOwnerWarning">
+ Ð’Ñ‹ ÑобираетеÑÑŒ добавить учаÑтников группы в роль [ROLE_NAME].
+Удалить учаÑтников из Ñтой роли нельзÑ.
+УчаÑтники Ñами должны отказатьÑÑ Ð¾Ñ‚ нее.
+Продолжить?
+ <usetemplate ignoretext="Подтверждать перед добавлением нового владельца группы" name="okcancelignore" notext="Ðет" yestext="Да"/>
+ </notification>
+ <notification name="AssignDangerousActionWarning">
+ Ð’Ñ‹ ÑобираетеÑÑŒ добавить ÑпоÑобноÑть «[ACTION_NAME]» к роли «[ROLE_NAME]».
+
+ *ПРЕДУПРЕЖДЕÐИЕ*
+ Ð’Ñе учаÑтники роли Ñ Ñтой ÑпоÑобноÑтью могут приÑваивать Ñебе и вÑем другим учаÑтникам более выÑокие роли, чем у них ÑÐµÐ¹Ñ‡Ð°Ñ ÐµÑть, и даже подниматьÑÑ Ð´Ð¾ ÑƒÑ€Ð¾Ð²Ð½Ñ Ð²Ð»Ð°Ð´ÐµÐ»ÑŒÑ†Ð°. Прежде чем назначить Ñту ÑпоÑобноÑть, убедитеÑÑŒ в целеÑообразноÑти Ñтого.
+
+Добавить Ñту ÑпоÑобноÑть к роли «[ROLE_NAME]»?
+ <usetemplate name="okcancelbuttons" notext="Ðет" yestext="Да"/>
+ </notification>
+ <notification name="AssignDangerousAbilityWarning">
+ Ð’Ñ‹ ÑобираетеÑÑŒ добавить ÑпоÑобноÑть «[ACTION_NAME]» к роли «[ROLE_NAME]».
+
+ *ПРЕДУПРЕЖДЕÐИЕ*
+ Ð’Ñе учаÑтники роли Ñ Ñтой ÑпоÑобноÑтью могут приÑваивать Ñебе и вÑем другим учаÑтникам вÑе ÑпоÑобноÑти и даже подниматьÑÑ Ð´Ð¾ ÑƒÑ€Ð¾Ð²Ð½Ñ Ð²Ð»Ð°Ð´ÐµÐ»ÑŒÑ†Ð°.
+
+Добавить Ñту ÑпоÑобноÑть к роли «[ROLE_NAME]»?
+ <usetemplate name="okcancelbuttons" notext="Ðет" yestext="Да"/>
+ </notification>
+ <notification name="AttachmentDrop">
+ Ð’Ñ‹ ÑобираетеÑÑŒ ÑброÑить Ñвое приÑоединение.
+ Продолжить?
+ <usetemplate ignoretext="Подтверждать перед ÑброÑом приÑоединений" name="okcancelignore" notext="Ðет" yestext="Да"/>
+ </notification>
+ <notification name="JoinGroupCanAfford">
+ Ð’Ñтупление в Ñту группу Ñтоит L$[COST].
+Продолжить?
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="Ð’Ñтупить"/>
+ </notification>
+ <notification name="JoinGroupNoCost">
+ Ð’Ñ‹ вÑтупаете в группу [NAME].
+Продолжить?
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="Ð’Ñтупить"/>
+ </notification>
+ <notification name="JoinGroupCannotAfford">
+ Ð’Ñтупление в Ñту группу Ñтоит L$[COST].
+У Ð²Ð°Ñ Ð½Ðµ хватает L$ Ð´Ð»Ñ Ð²ÑтуплениÑ.
+ </notification>
+ <notification name="CreateGroupCost">
+ Создание Ñтой группы Ñтоит L$100.
+Ð’ группе должно быть более одного учаÑтника, иначе она будет удалена.
+ПриглаÑите учаÑтников в ближайшие 48 чаÑов.
+ <usetemplate canceltext="Отмена" name="okcancelbuttons" notext="Отмена" yestext="Создать группу за L$100"/>
+ </notification>
+ <notification name="LandBuyPass">
+ За L$[COST] вы можете находитьÑÑ Ð½Ð° Ñтой земле («[PARCEL_NAME]») в течение [TIME] чаÑов. Купить пропуÑк?
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="SalePriceRestriction">
+ При продаже любому пользователю цена продажи должна быть больше L$0.
+Выберите пользователÑ, чтобы продать ему за L$0.
+ </notification>
+ <notification name="ConfirmLandSaleChange">
+ Выбранные [LAND_SIZE] м² земли выÑтавлÑÑŽÑ‚ÑÑ Ð½Ð° продажу.
+Ваша цена продажи: $[SALE_PRICE], разрешена продажа Ð´Ð»Ñ [NAME].
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmLandSaleToAnyoneChange">
+ Ð’ÐИМÐÐИЕ! При выборе «продавать кому угодно» ваша Ð·ÐµÐ¼Ð»Ñ Ñтанет доÑтупной вÑему ÑообщеÑтву [SECOND_LIFE], даже тем, кто находитÑÑ Ð½Ðµ в Ñтом регионе.
+
+Выбранные [LAND_SIZE] м² земли выÑтавлÑÑŽÑ‚ÑÑ Ð½Ð° продажу.
+Ваша цена продажи: $[SALE_PRICE], разрешена продажа Ð´Ð»Ñ [NAME].
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="ReturnObjectsDeededToGroup">
+ Ð’Ñ‹ дейÑтвительно хотите вернуть вÑе объекты, переданные группе «[NAME]» на Ñтом земельном учаÑтке, обратно в инвентарь их прежних владельцев?
+
+*ПРЕДУПРЕЖДЕÐИЕ* Ð’Ñе непереноÑимые объекты, предоÑтавленные Ñтой группе, будут удалены!
+
+Объекты: [N]
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="ReturnObjectsOwnedByUser">
+ Ð’Ñ‹ дейÑтвительно хотите вернуть вÑе объекты, принадлежащие жителю «[NAME]» на Ñтом земельном учаÑтке, в его инвентарь?
+
+Объекты: [N]
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="ReturnObjectsOwnedBySelf">
+ Ð’Ñ‹ дейÑтвительно хотите вернуть вÑе принадлежащие вам объекты на Ñтом земельном учаÑтке в Ñвой инвентарь?
+
+Объекты: [N]
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="ReturnObjectsNotOwnedBySelf">
+ Ð’Ñ‹ дейÑтвительно хотите вернуть вÑе ÐЕ принадлежащие вам объекты на Ñтом учаÑтке в инвентарь их владельцев?
+ПереноÑимые объекты, предоÑтавленные группе, будут возвращены прежним владельцам.
+
+*ПРЕДУПРЕЖДЕÐИЕ* Ð’Ñе непереноÑимые объекты, предоÑтавленные Ñтой группе, будут удалены!
+
+Объекты: [N]
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="ReturnObjectsNotOwnedByUser">
+ Ð’Ñ‹ дейÑтвительно хотите вернуть вÑе объекты, ÐЕ принадлежащие пользователю [NAME], на Ñтом земельном учаÑтке, обратно в инвентарь их владельцев?
+ПереноÑимые объекты, предоÑтавленные группе, будут возвращены прежним владельцам.
+
+*ПРЕДУПРЕЖДЕÐИЕ* Ð’Ñе непереноÑимые объекты, предоÑтавленные Ñтой группе, будут удалены!
+
+Объекты: [N]
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="ReturnAllTopObjects">
+ Ð’Ñ‹ дейÑтвительно хотите вернуть вÑе объекты из ÑпиÑка в инвентарь их владельцев?
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="DisableAllTopObjects">
+ Ð’Ñ‹ дейÑтвительно хотите отключить вÑе объекты в Ñтом регионе?
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="ReturnObjectsNotOwnedByGroup">
+ Вернуть вÑе объекты на Ñтом земельном учаÑтке, ÐЕ переданные группе «[NAME]», их владельцам?
+
+Объекты: [N]
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="UnableToDisableOutsideScripts">
+ ÐÐµÐ»ÑŒÐ·Ñ Ð¾Ñ‚ÐºÐ»ÑŽÑ‡Ð¸Ñ‚ÑŒ Ñкрипты.
+Во вÑем Ñтом регионе включены боевые повреждениÑ.
+Чтобы оружие дейÑтвовало, Ñкрипты должны выполнÑтьÑÑ.
+ </notification>
+ <notification name="MultipleFacesSelected">
+ Выбрано неÑколько граней.
+ЕÑли продолжить Ñто дейÑтвие, на каждой выбранной грани объекта будет размещено по отдельному ÑкземплÑру медиа.
+Чтобы помеÑтить медиа только на одну грань, выберите команду «Выбор грани» и щелкните нужную грань объекта, затем нажмите «Добавить».
+ <usetemplate ignoretext="Медиа будет помещено на неÑколько выбранных граней" name="okcancelignore" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="MustBeInParcel">
+ Чтобы уÑтановить точку телепортации, вы должны находитьÑÑ Ð½Ð° учаÑтке.
+ </notification>
+ <notification name="PromptRecipientEmail">
+ Введите правильный Ð°Ð´Ñ€ÐµÑ email получателÑ.
+ </notification>
+ <notification name="PromptSelfEmail">
+ Введите Ñвой Ð°Ð´Ñ€ÐµÑ email.
+ </notification>
+ <notification name="PromptMissingSubjMsg">
+ Отправить Ñнимок Ñ Ñ‚ÐµÐ¼Ð¾Ð¹ или Ñообщением по умолчанию?
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="ErrorProcessingSnapshot">
+ Ошибка при обработке данных Ñнимка
+ </notification>
+ <notification name="ErrorEncodingSnapshot">
+ Ошибка при кодировке Ñнимка.
+ </notification>
+ <notification name="ErrorUploadingPostcard">
+ Ошибка при отправке Ñнимка по Ñледующей причине: [REASON]
+ </notification>
+ <notification name="ErrorUploadingReportScreenshot">
+ Ошибка при передаче Ñнимка отчета по Ñледующей причине: [REASON]
+ </notification>
+ <notification name="MustAgreeToLogIn">
+ Ð”Ð»Ñ Ð²Ñ…Ð¾Ð´Ð° в [SECOND_LIFE] вы должны принÑть уÑÐ»Ð¾Ð²Ð¸Ñ ÐŸÐ¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÑŒÑкого ÑоглашениÑ.
+ </notification>
+ <notification name="CouldNotPutOnOutfit">
+ Ðе удалоÑÑŒ надеть коÑтюм.
+Папка коÑтюмов не Ñодержит одежды, чаÑтей тела или приÑоединений.
+ </notification>
+ <notification name="CannotWearTrash">
+ ÐÐµÐ»ÑŒÐ·Ñ Ð½Ð°Ð´ÐµÑ‚ÑŒ одежду или чаÑть тела, еÑли они находÑÑ‚ÑÑ Ð² корзине
+ </notification>
+ <notification name="MaxAttachmentsOnOutfit">
+ Ðе удалоÑÑŒ приÑоединить объект.
+Превышен лимит приÑоединений ([MAX_ATTACHMENTS] объектов). Сначала отÑоедините другой объект.
+ </notification>
+ <notification name="CannotWearInfoNotComplete">
+ ÐÐµÐ»ÑŒÐ·Ñ Ð½Ð°Ð´ÐµÑ‚ÑŒ Ñту вещь, так как она еще не загружена. Повторите попытку через минуту.
+ </notification>
+ <notification name="MustHaveAccountToLogIn">
+ Ðй-Ñй-Ñй! Что-то оÑталоÑÑŒ незаполненным.
+Ðеобходимо ввеÑти Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ аватара.
+
+Ð”Ð»Ñ Ð²Ñ…Ð¾Ð´Ð° в [SECOND_LIFE] нужен аккаунт. Создать его?
+ <url name="url">
+ http://join.secondlife.com/
+ </url>
+ <usetemplate name="okcancelbuttons" notext="Повторить попытку" yestext="Создать новый аккаунт"/>
+ </notification>
+ <notification name="InvalidCredentialFormat">
+ Введите Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¸Ð»Ð¸ Ð¸Ð¼Ñ Ð¸ фамилию вашего аватара в поле Â«Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ», затем Ñнова войдите в программу.
+ </notification>
+ <notification name="DeleteClassified">
+ Удалить рекламу «[NAME]»?
+Плата за нее не будет возвращена.
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="DeleteMedia">
+ Ð’Ñ‹ ÑобираетеÑÑŒ удалить медиа, ÑвÑзанное Ñ Ñтой гранью.
+Продолжить?
+ <usetemplate ignoretext="Подтверждать перед удалением медиа из объекта" name="okcancelignore" notext="Ðет" yestext="Да"/>
+ </notification>
+ <notification name="ClassifiedSave">
+ Сохранить Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² рекламе [NAME]?
+ <usetemplate canceltext="Отмена" name="yesnocancelbuttons" notext="Ðе ÑохранÑть" yestext="Сохранить"/>
+ </notification>
+ <notification name="ClassifiedInsufficientFunds">
+ ÐедоÑтаточно денег Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ñ€ÐµÐºÐ»Ð°Ð¼Ñ‹.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="DeleteAvatarPick">
+ Удалить подборку &lt;nolink&gt;[PICK]&lt;/nolink&gt;?
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="DeleteOutfits">
+ Удалить выбранный коÑтюм?
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="PromptGoToEventsPage">
+ Перейти на веб-Ñтраницу Ñобытий [SECOND_LIFE]?
+ <url name="url">
+ http://secondlife.com/events/
+ </url>
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="SelectProposalToView">
+ Выберите предложение Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñмотра.
+ </notification>
+ <notification name="SelectHistoryItemToView">
+ Выберите пункт журнала Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñмотра.
+ </notification>
+ <notification name="CacheWillClear">
+ КÑш будет очищен поÑле перезапуÑка [APP_NAME].
+ </notification>
+ <notification name="CacheWillBeMoved">
+ КÑш будет перемещен поÑле перезапуÑка [APP_NAME].
+Примечание. При Ñтом кÑш будет очищен.
+ </notification>
+ <notification name="ChangeConnectionPort">
+ ÐаÑтройки порта начнут дейÑтвовать поÑле перезапуÑка [APP_NAME].
+ </notification>
+ <notification name="ChangeSkin">
+ ÐÐ¾Ð²Ð°Ñ ÐºÐ¾Ð¶Ð° будет видна поÑле перезапуÑка [APP_NAME].
+ </notification>
+ <notification name="ChangeLanguage">
+ Смена Ñзыка вÑтупит в Ñилу поÑле перезапуÑка [APP_NAME].
+ </notification>
+ <notification name="GoToAuctionPage">
+ Перейти на веб-Ñтраницу [SECOND_LIFE], чтобы поÑмотреть подробноÑти аукциона или Ñделать Ñтавку?
+ <url name="url">
+ http://secondlife.com/auctions/auction-detail.php?id=[AUCTION_ID]
+ </url>
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="SaveChanges">
+ Сохранить изменениÑ?
+ <usetemplate canceltext="Отмена" name="yesnocancelbuttons" notext="Ðе ÑохранÑть" yestext="Сохранить"/>
+ </notification>
+ <notification name="GestureSaveFailedTooManySteps">
+ Ðе удалоÑÑŒ Ñохранить жеÑÑ‚.
+ЖеÑÑ‚ Ñодержит Ñлишком много Ñтапов.
+Попробуйте удалить некоторые Ñтапы и повторите Ñохранение.
+ </notification>
+ <notification name="GestureSaveFailedTryAgain">
+ Ðе удалоÑÑŒ Ñохранить жеÑÑ‚. Повторите попытку через минуту.
+ </notification>
+ <notification name="GestureSaveFailedObjectNotFound">
+ Ðе удалоÑÑŒ Ñохранить жеÑÑ‚: не найден объект или ÑвÑзанный Ñ Ð½Ð¸Ð¼ инвентарь.
+Возможно, объект находитÑÑ Ð²Ð½Ðµ допуÑтимого диапазона или удален.
+ </notification>
+ <notification name="GestureSaveFailedReason">
+ Ошибка при Ñохранении жеÑта по Ñледующей причине: [REASON]. Попробуйте Ñохранить жеÑÑ‚ через некоторое времÑ.
+ </notification>
+ <notification name="SaveNotecardFailObjectNotFound">
+ Ðе удалоÑÑŒ Ñохранить заметку: не найден объект или ÑвÑзанный Ñ Ð½Ð¸Ð¼ инвентарь.
+Возможно, объект находитÑÑ Ð²Ð½Ðµ допуÑтимого диапазона или удален.
+ </notification>
+ <notification name="SaveNotecardFailReason">
+ Ошибка при Ñохранении заметки по Ñледующей причине: [REASON]. Попробуйте Ñохранить заметку через некоторое времÑ.
+ </notification>
+ <notification name="ScriptCannotUndo">
+ Ðе удалоÑÑŒ отменить вÑе Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² вашей верÑии Ñкрипта.
+Загрузить поÑледнюю Ñохраненную на Ñервере верÑию?
+(**Предупреждение** Эту операцию Ð½ÐµÐ»ÑŒÐ·Ñ Ð¾Ñ‚Ð¼ÐµÐ½Ð¸Ñ‚ÑŒ.)
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="SaveScriptFailReason">
+ Ошибка при Ñохранении Ñкрипта по Ñледующей причине: [REASON]. Попробуйте Ñохранить Ñкрипт через некоторое времÑ.
+ </notification>
+ <notification name="SaveScriptFailObjectNotFound">
+ Ðе удалоÑÑŒ Ñохранить Ñкрипт: не найден объект, в котором он находитÑÑ.
+Возможно, объект находитÑÑ Ð²Ð½Ðµ допуÑтимого диапазона или удален.
+ </notification>
+ <notification name="SaveBytecodeFailReason">
+ Ошибка при Ñохранении Ñкомпилированного Ñкрипта по Ñледующей причине: [REASON]. Попробуйте Ñохранить Ñкрипт через некоторое времÑ.
+ </notification>
+ <notification name="StartRegionEmpty">
+ Ðй-Ñй-Ñй, ваш Ñтартовый регион не определен.
+Введите название региона в поле «МеÑто Ñтарта» или выберите в качеÑтве меÑта Ñтарта «Мое поÑледнее меÑтоположение» или «Мой дом».
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="CouldNotStartStopScript">
+ Ðе удаетÑÑ Ð·Ð°Ð¿ÑƒÑтить или оÑтановить Ñкрипт: не найден объект, в котором он находитÑÑ.
+Возможно, объект находитÑÑ Ð²Ð½Ðµ допуÑтимого диапазона или удален.
+ </notification>
+ <notification name="CannotDownloadFile">
+ Ðевозможно загрузить файл
+ </notification>
+ <notification name="CannotWriteFile">
+ Ðевозможно запиÑать файл [[FILE]]
+ </notification>
+ <notification name="UnsupportedHardware">
+ К вашему Ñведению: ваш компьютер не ÑоответÑтвует минимальным ÑиÑтемным требованиÑм [APP_NAME]. Это может привеÑти к Ñнижению производительноÑти. К Ñожалению, [SUPPORT_SITE] не оказывает техничеÑкую поддержку Ð´Ð»Ñ Ð½ÐµÐ¿Ð¾Ð´Ð´ÐµÑ€Ð¶Ð¸Ð²Ð°ÐµÐ¼Ñ‹Ñ… конфигураций ÑиÑтем.
+
+Ðайти более подробную информацию на [_URL]?
+ <url name="url">
+ http://www.secondlife.com/corporate/sysreqs.php
+ </url>
+ <usetemplate ignoretext="Оборудование моего компьютера не поддерживаетÑÑ" name="okcancelignore" notext="Ðет" yestext="Да"/>
+ </notification>
+ <notification name="UnknownGPU">
+ Ð’ вашей ÑиÑтеме уÑтановлена графичеÑÐºÐ°Ñ ÐºÐ°Ñ€Ñ‚Ð°, которую [APP_NAME] не может раÑпознать.
+Так чаÑто бывает, еÑли новое оборудование еще не было проверено на работу Ñ [APP_NAME]. Скорее вÑего, оно будет работать нормально, но, возможно, придетÑÑ Ð¾Ñ‚Ñ€ÐµÐ³ÑƒÐ»Ð¸Ñ€Ð¾Ð²Ð°Ñ‚ÑŒ параметры графики.
+(Я &gt; ÐаÑтройки &gt; Графика).
+ <form name="form">
+ <ignore name="ignore" text="Ðе удаетÑÑ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»Ð¸Ñ‚ÑŒ мою графичеÑкую карту"/>
+ </form>
+ </notification>
+ <notification name="DisplaySettingsNoShaders">
+ Произошел Ñбой [APP_NAME] при инициализации графичеÑкого драйвера.
+Будет уÑтановлено низкое качеÑтво графики, чтобы избежать некоторых раÑпроÑтраненных ошибок графики. При Ñтом некоторые графичеÑкие функции не будут работать.
+Рекомендуем обновить драйверы графичеÑкой карты.
+ПовыÑить качеÑтво графики можно в меню «ÐаÑтройки &gt; Графика».
+ </notification>
+ <notification name="RegionNoTerraforming">
+ В регионе [REGION] не разрешен терраформинг.
+ </notification>
+ <notification name="CannotCopyWarning">
+ У Ð²Ð°Ñ Ð½ÐµÑ‚ Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ð½Ð° копирование Ñледующих предметов:
+[ITEMS]
+ЕÑли вы отдадите Ñти вещи, их больше не будет в вашем инвентаре. Ð’Ñ‹ дейÑтвительно хотите предложить Ñти предметы?
+ <usetemplate name="okcancelbuttons" notext="Ðет" yestext="Да"/>
+ </notification>
+ <notification name="CannotGiveItem">
+ Ðевозможно отдать предмет из инвентарÑ.
+ </notification>
+ <notification name="TransactionCancelled">
+ Сделка отменена.
+ </notification>
+ <notification name="TooManyItems">
+ ÐÐµÐ»ÑŒÐ·Ñ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‚ÑŒ более 42 предметов за одну переÑылку.
+ </notification>
+ <notification name="NoItems">
+ У Ð²Ð°Ñ Ð½ÐµÑ‚ Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ð½Ð° передачу выбранных предметов.
+ </notification>
+ <notification name="CannotCopyCountItems">
+ У Ð²Ð°Ñ Ð½ÐµÑ‚ Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ð½Ð° копирование [COUNT] выбранных предметов. Эти предметы иÑчезнут из вашего инвентарÑ.
+Ð’Ñ‹ дейÑтвительно хотите отдать их?
+ <usetemplate name="okcancelbuttons" notext="Ðет" yestext="Да"/>
+ </notification>
+ <notification name="CannotGiveCategory">
+ У Ð²Ð°Ñ Ð½ÐµÑ‚ Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ð½Ð° передачу выбранной папки.
+ </notification>
+ <notification name="FreezeAvatar">
+ Заморозить Ñтот аватар?
+У него временно иÑчезнет ÑпоÑобноÑть перемещатьÑÑ, говорить и взаимодейÑтвовать Ñ Ð¼Ð¸Ñ€Ð¾Ð¼.
+ <usetemplate canceltext="Отмена" name="yesnocancelbuttons" notext="Разморозить" yestext="Заморозить"/>
+ </notification>
+ <notification name="FreezeAvatarFullname">
+ Заморозить [AVATAR_NAME]?
+У него временно иÑчезнет ÑпоÑобноÑть перемещатьÑÑ, говорить и взаимодейÑтвовать Ñ Ð¼Ð¸Ñ€Ð¾Ð¼.
+ <usetemplate canceltext="Отмена" name="yesnocancelbuttons" notext="Разморозить" yestext="Заморозить"/>
+ </notification>
+ <notification name="EjectAvatarFullname">
+ Выкинуть [AVATAR_NAME] Ñ Ð²Ð°ÑˆÐµÐ¹ земли?
+ <usetemplate canceltext="Отмена" name="yesnocancelbuttons" notext="Выкинуть и запретить доÑтуп" yestext="Выкинуть"/>
+ </notification>
+ <notification name="EjectAvatarNoBan">
+ Выкинуть Ñтот аватар Ñ Ð²Ð°ÑˆÐµÐ¹ земли?
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="Выкинуть"/>
+ </notification>
+ <notification name="EjectAvatarFullnameNoBan">
+ Выкинуть [AVATAR_NAME] Ñ Ð²Ð°ÑˆÐµÐ¹ земли?
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="Выкинуть"/>
+ </notification>
+ <notification name="EjectAvatarFromGroup">
+ Ð’Ñ‹ иÑключили аватар [AVATAR_NAME] из группы [GROUP_NAME]
+ </notification>
+ <notification name="AcquireErrorTooManyObjects">
+ ОШИБКРПРИОБРЕТЕÐИЯ: выбрано Ñлишком много объектов.
+ </notification>
+ <notification name="AcquireErrorObjectSpan">
+ ОШИБКРПРИОБРЕТЕÐИЯ: объекты охватывают более одного региона.
+ПеремеÑтите вÑе приобретаемые объекты в один регион.
+ </notification>
+ <notification name="PromptGoToCurrencyPage">
+ [EXTRA]
+
+Ðайти информацию по покупке L$ на [_URL]?
+ <url name="url">
+ http://secondlife.com/app/currency/
+ </url>
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="UnableToLinkObjects">
+ Ðевозможно объединить Ñти [COUNT] объектов.
+Можно объединÑть не более [MAX] объектов.
+ </notification>
+ <notification name="CannotLinkIncompleteSet">
+ Можно объединÑть только полные наборы объектов, и Ð´Ð»Ñ Ñтого Ñледует выбрать более одного объекта.
+ </notification>
+ <notification name="CannotLinkModify">
+ Ðевозможно объединить объекты: у Ð²Ð°Ñ Ð½ÐµÑ‚ прав на изменение вÑех объектов.
+
+УбедитеÑÑŒ, что вÑе объекты разблокированы и что вы владеете вÑеми ими.
+ </notification>
+ <notification name="CannotLinkDifferentOwners">
+ Ðевозможно объединить объекты: не у вÑех объектов один владелец.
+
+УбедитеÑÑŒ, что вы владеете вÑеми выбранными объектами.
+ </notification>
+ <notification name="NoFileExtension">
+ У файла отÑутÑтвует раÑширение: «[FILE]»
+
+УбедитеÑÑŒ, что файл имеет правильное раÑширение.
+ </notification>
+ <notification name="InvalidFileExtension">
+ Ðеверное раÑширение файла [EXTENSION]
+ОжидаетÑÑ [VALIDS]
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="CannotUploadSoundFile">
+ Ðе удалоÑÑŒ открыть Ð´Ð»Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ Ð·Ð°Ð³Ñ€ÑƒÐ¶ÐµÐ½Ð½Ñ‹Ð¹ звуковой файл:
+[FILE]
+ </notification>
+ <notification name="SoundFileNotRIFF">
+ По-видимому, Ñто не файл RIFF WAVE:
+[FILE]
+ </notification>
+ <notification name="SoundFileNotPCM">
+ По-видимому, Ñто не звуковой файл PCM WAVE:
+[FILE]
+ </notification>
+ <notification name="SoundFileInvalidChannelCount">
+ Ð’ файле неправильное количеÑтво каналов (должно быть моно или Ñтерео):
+[FILE]
+ </notification>
+ <notification name="SoundFileInvalidSampleRate">
+ По-видимому, файл не имеет поддерживаемой чаÑтоты диÑкретизации (должна быть 44,1 кГц):
+[FILE]
+ </notification>
+ <notification name="SoundFileInvalidWordSize">
+ По-видимому, в файле иÑпользуетÑÑ Ð½ÐµÐ¿Ð¾Ð´Ð´ÐµÑ€Ð¶Ð¸Ð²Ð°ÐµÐ¼Ñ‹Ð¹ размер Ñлова (должен быть 8 или 16 бит):
+[FILE]
+ </notification>
+ <notification name="SoundFileInvalidHeader">
+ Ðе найден фрагмент «data» в заголовке WAV-файла:
+[FILE]
+ </notification>
+ <notification name="SoundFileInvalidChunkSize">
+ Ðеправильный размер фрагмента в WAV-файле:
+[FILE]
+ </notification>
+ <notification name="SoundFileInvalidTooLong">
+ Ðудиофайл Ñлишком длинный (макÑимум 10 Ñекунд):
+[FILE]
+ </notification>
+ <notification name="ProblemWithFile">
+ Проблема Ñ Ñ„Ð°Ð¹Ð»Ð¾Ð¼ [FILE]:
+
+[ERROR]
+ </notification>
+ <notification name="CannotOpenTemporarySoundFile">
+ Ðе удалоÑÑŒ открыть Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи временно Ñжатый звуковой файл: [FILE]
+ </notification>
+ <notification name="UnknownVorbisEncodeFailure">
+ ÐеизвеÑÑ‚Ð½Ð°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ° кодировки Vorbis в файле: [FILE]
+ </notification>
+ <notification name="CannotEncodeFile">
+ Ðевозможно закодировать файл: [FILE]
+ </notification>
+ <notification name="CorruptedProtectedDataStore">
+ Ðевозможно ввеÑти ваши Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¸ пароль. Возможно, вы изменили наÑтройки Ñети.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="CorruptResourceFile">
+ Поврежден файл реÑурÑов: [FILE]
+ </notification>
+ <notification name="UnknownResourceFileVersion">
+ ÐеизвеÑÑ‚Ð½Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ Ñ„Ð°Ð¹Ð»Ð° реÑурÑов Linden: [FILE]
+ </notification>
+ <notification name="UnableToCreateOutputFile">
+ Ðевозможно Ñоздать выходной файл: [FILE]
+ </notification>
+ <notification name="DoNotSupportBulkAnimationUpload">
+ [APP_NAME] пока не поддерживает маÑÑовую передачу файлов анимации.
+ </notification>
+ <notification name="CannotUploadReason">
+ Ðевозможно передать [FILE] по Ñледующей причине: [REASON]
+Повторите попытку позже.
+ </notification>
+ <notification name="LandmarkCreated">
+ Ð’Ñ‹ добавили закладку «[LANDMARK_NAME]» в Ñвою папку [FOLDER_NAME].
+ </notification>
+ <notification name="LandmarkAlreadyExists">
+ Ðа Ñто меÑто уже поÑтавлена закладка.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="CannotCreateLandmarkNotOwner">
+ Ð’Ñ‹ не можете поÑтавить здеÑÑŒ закладку: владелец земли не разрешает Ñтого.
+ </notification>
+ <notification name="CannotRecompileSelectObjectsNoScripts">
+ Ðевозможно произвеÑти перекомпилÑцию.
+Выберите объект Ñо Ñценарием.
+ </notification>
+ <notification name="CannotRecompileSelectObjectsNoPermission">
+ Ðевозможно произвеÑти перекомпилÑцию.
+
+Выберите объекты Ñо ÑценариÑми, которые вам разрешено изменÑть.
+ </notification>
+ <notification name="CannotResetSelectObjectsNoScripts">
+ Ðевозможно произвеÑти ÑброÑ.
+
+Выберите объекты Ñо ÑценариÑми.
+ </notification>
+ <notification name="CannotResetSelectObjectsNoPermission">
+ Ðевозможно произвеÑти ÑброÑ.
+
+Выберите объекты Ñо ÑценариÑми, которые вам разрешено изменÑть.
+ </notification>
+ <notification name="CannotOpenScriptObjectNoMod">
+ Ðевозможно открыть Ñкрипт в объекте Ñ Ð·Ð°Ð¿Ñ€ÐµÑ‰ÐµÐ½Ð½Ñ‹Ð¼ изменением.
+ </notification>
+ <notification name="CannotSetRunningSelectObjectsNoScripts">
+ Ðевозможно запуÑтить Ñкрипты.
+
+Выберите объекты Ñо ÑценариÑми.
+ </notification>
+ <notification name="CannotSetRunningNotSelectObjectsNoScripts">
+ Ðевозможно оÑтановить Ñкрипты.
+
+Выберите объекты Ñо ÑценариÑми.
+ </notification>
+ <notification name="NoFrontmostFloater">
+ Ðет Ñамого переднего окна Ð´Ð»Ñ ÑохранениÑ.
+ </notification>
+ <notification name="SeachFilteredOnShortWords">
+ Ваш поиÑковый Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð±Ñ‹Ð» изменен, и Ñлишком короткие Ñлова были удалены.
+
+Выполнен поиÑк: [FINALQUERY]
+ </notification>
+ <notification name="SeachFilteredOnShortWordsEmpty">
+ Ваша поиÑÐºÐ¾Ð²Ð°Ñ Ñ„Ñ€Ð°Ð·Ð° была Ñлишком короткой. ПоиÑк не был выполнен.
+ </notification>
+ <notification name="CouldNotTeleportReason">
+ Ошибка телепортации.
+[REASON]
+ </notification>
+ <notification name="invalid_tport">
+ При запроÑе телепортации возникла проблема. Возможно, Ð´Ð»Ñ Ñ‚ÐµÐ»ÐµÐ¿Ð¾Ñ€Ñ‚Ð°Ñ†Ð¸Ð¸ придетÑÑ Ð¿Ð¾Ð²Ñ‚Ð¾Ñ€Ð¸Ñ‚ÑŒ вход в программу.
+ЕÑли данное Ñообщение повторитÑÑ, поÑетите Ñайт [SUPPORT_SITE].
+ </notification>
+ <notification name="invalid_region_handoff">
+ При переÑечении границы региона возникла проблема. Возможно, Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÑÐµÑ‡ÐµÐ½Ð¸Ñ Ð³Ñ€Ð°Ð½Ð¸Ñ†Ñ‹ придетÑÑ Ð¿Ð¾Ð²Ñ‚Ð¾Ñ€Ð¸Ñ‚ÑŒ вход в программу.
+ЕÑли данное Ñообщение повторитÑÑ, поÑетите Ñайт [SUPPORT_SITE].
+ </notification>
+ <notification name="blocked_tport">
+ Ð¢ÐµÐ»ÐµÐ¿Ð¾Ñ€Ñ‚Ð°Ñ†Ð¸Ñ ÑÐµÐ¹Ñ‡Ð°Ñ Ð·Ð°Ð±Ð»Ð¾ÐºÐ¸Ñ€Ð¾Ð²Ð°Ð½Ð°. Повторите попытку позже. ЕÑли вÑе равно не удаетÑÑ Ñ‚ÐµÐ»ÐµÐ¿Ð¾Ñ€Ñ‚Ð¸Ñ€Ð¾Ð²Ð°Ñ‚ÑŒÑÑ, выйдите из программы и войдите Ñнова, чтобы уÑтранить проблему.
+ </notification>
+ <notification name="nolandmark_tport">
+ СиÑтеме не удалоÑÑŒ определить пункт Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð·Ð°ÐºÐ»Ð°Ð´ÐºÐ¸.
+ </notification>
+ <notification name="timeout_tport">
+ СиÑтеме не удалоÑÑŒ выполнить подключение телепорта. Повторите попытку позже.
+ </notification>
+ <notification name="noaccess_tport">
+ У Ð²Ð°Ñ Ð½ÐµÑ‚ доÑтупа в пункт Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ñтого телепорта.
+ </notification>
+ <notification name="missing_attach_tport">
+ Ваши приÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ ÐµÑ‰Ðµ не доÑтавлены. Подождите неÑколько Ñекунд либо выйдите из программы и войдите Ñнова, прежде чем повторить попытку телепортации.
+ </notification>
+ <notification name="too_many_uploads_tport">
+ Очередь активов в данном регионе заполнена, поÑтому ваш Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° телепортацию не будет выполнен Ñвоевременно. Повторите попытку через неÑколько минут или перейдите в менее загруженный регион.
+ </notification>
+ <notification name="expired_tport">
+ СиÑтеме не удалоÑÑŒ Ñвоевременно выполнить ваш Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° телепортацию. Повторите попытку через неÑколько минут.
+ </notification>
+ <notification name="expired_region_handoff">
+ СиÑтеме не удалоÑÑŒ Ñвоевременно выполнить ваше переÑечение границы. Повторите попытку через неÑколько минут.
+ </notification>
+ <notification name="no_host">
+ Ðе удалоÑÑŒ найти точку Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ñ‚ÐµÐ»ÐµÐ¿Ð¾Ñ€Ñ‚Ð°. Возможно, пункт Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð²Ñ€ÐµÐ¼ÐµÐ½Ð½Ð¾ недоÑтупен или уже не ÑущеÑтвует. Повторите попытку через неÑколько минут.
+ </notification>
+ <notification name="no_inventory_host">
+ СиÑтема Ð¸Ð½Ð²ÐµÐ½Ñ‚Ð°Ñ€Ñ ÑÐµÐ¹Ñ‡Ð°Ñ Ð½ÐµÐ´Ð¾Ñтупна.
+ </notification>
+ <notification name="CannotSetLandOwnerNothingSelected">
+ Ðевозможно назначить владельца земли:
+УчаÑток не выбран.
+ </notification>
+ <notification name="CannotSetLandOwnerMultipleRegions">
+ Ðевозможно уÑтановить владение над землей, потому что выделение захватывает неÑколько регионов. Выберите меньшую облаÑть и повторите попытку.
+ </notification>
+ <notification name="ForceOwnerAuctionWarning">
+ Этот учаÑток выÑтавлен на аукцион. При попытке завладеть землей аукцион будет отменен и, возможно, некоторые жители понеÑут ущерб, еÑли Ñтавки уже были Ñделаны.
+Завладеть?
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="CannotContentifyNothingSelected">
+ Ðевозможно удовлетворить требование:
+УчаÑток не выбран.
+ </notification>
+ <notification name="CannotContentifyNoRegion">
+ Ðевозможно удовлетворить требование:
+Регион не выбран.
+ </notification>
+ <notification name="CannotReleaseLandNothingSelected">
+ Ðевозможно отказатьÑÑ Ð¾Ñ‚ земли:
+УчаÑток не выбран.
+ </notification>
+ <notification name="CannotReleaseLandNoRegion">
+ Ðевозможно отказатьÑÑ Ð¾Ñ‚ земли:
+Регион не найден.
+ </notification>
+ <notification name="CannotBuyLandNothingSelected">
+ Ðевозможно купить землю:
+УчаÑток не выбран.
+ </notification>
+ <notification name="CannotBuyLandNoRegion">
+ Ðевозможно купить землю:
+Ðе удаетÑÑ Ð½Ð°Ð¹Ñ‚Ð¸ регион, в котором находитÑÑ Ñта землÑ.
+ </notification>
+ <notification name="CannotCloseFloaterBuyLand">
+ ÐÐµÐ»ÑŒÐ·Ñ Ð·Ð°ÐºÑ€Ñ‹Ñ‚ÑŒ окно покупки земли, пока [APP_NAME] определÑет ÑтоимоÑть Ñтой транзакции.
+ </notification>
+ <notification name="CannotDeedLandNothingSelected">
+ Ðевозможно передать землю:
+УчаÑток не выбран.
+ </notification>
+ <notification name="CannotDeedLandNoGroup">
+ Ðевозможно передать землю:
+Группа не выбрана.
+ </notification>
+ <notification name="CannotDeedLandNoRegion">
+ Ðевозможно передать землю:
+Ðе удаетÑÑ Ð½Ð°Ð¹Ñ‚Ð¸ регион, в котором находитÑÑ Ñта землÑ.
+ </notification>
+ <notification name="CannotDeedLandMultipleSelected">
+ Ðевозможно передать землю:
+Выбрано неÑколько учаÑтков.
+
+Попробуйте выбрать один учаÑток.
+ </notification>
+ <notification name="CannotDeedLandWaitingForServer">
+ Ðевозможно передать землю:
+Ожидание, пока Ñервер Ñообщит о владении.
+
+Повторите попытку.
+ </notification>
+ <notification name="CannotDeedLandNoTransfer">
+ Ðевозможно передать землю:
+В регионе [REGION] не разрешена передача земли.
+ </notification>
+ <notification name="CannotReleaseLandWatingForServer">
+ Ðевозможно отказатьÑÑ Ð¾Ñ‚ земли:
+Ожидание, пока Ñервер обновит информацию об учаÑтке.
+
+Повторите попытку через неÑколько Ñекунд.
+ </notification>
+ <notification name="CannotReleaseLandSelected">
+ Ðевозможно отказатьÑÑ Ð¾Ñ‚ земли:
+Ð’Ñ‹ не владеете вÑеми выбранными учаÑтками.
+
+Выберите один учаÑток.
+ </notification>
+ <notification name="CannotReleaseLandDontOwn">
+ Ðевозможно отказатьÑÑ Ð¾Ñ‚ земли:
+У Ð²Ð°Ñ Ð½ÐµÑ‚ прав на оÑвобождение Ñтого учаÑтка.
+УчаÑтки, которыми вы владеете, показаны зеленым цветом.
+ </notification>
+ <notification name="CannotReleaseLandRegionNotFound">
+ Ðевозможно отказатьÑÑ Ð¾Ñ‚ земли:
+Ðе удаетÑÑ Ð½Ð°Ð¹Ñ‚Ð¸ регион, в котором находитÑÑ Ñта землÑ.
+ </notification>
+ <notification name="CannotReleaseLandNoTransfer">
+ Ðевозможно отказатьÑÑ Ð¾Ñ‚ земли:
+В регионе [REGION] не разрешена передача земли.
+ </notification>
+ <notification name="CannotReleaseLandPartialSelection">
+ Ðевозможно отказатьÑÑ Ð¾Ñ‚ земли:
+Чтобы оÑвободить учаÑток, нужно выбрать его целиком.
+
+Выберите веÑÑŒ учаÑток или Ñначала разделите его.
+ </notification>
+ <notification name="ReleaseLandWarning">
+ Ð’Ñ‹ ÑобираетеÑÑŒ отказатьÑÑ Ð¾Ñ‚ [AREA] м² земли.
+При оÑвобождении Ñтого учаÑтка он будет иÑключен из ваших владений, но не принеÑет вам L$.
+
+ОÑвободить Ñту землю?
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="CannotDivideLandNothingSelected">
+ Ðевозможно разделить землю:
+
+УчаÑтки не выбраны.
+ </notification>
+ <notification name="CannotDivideLandPartialSelection">
+ Ðевозможно разделить землю:
+
+Выбран веÑÑŒ учаÑток.
+Попробуйте выбрать чаÑть учаÑтка.
+ </notification>
+ <notification name="LandDivideWarning">
+ Разделение Ñтой земли приведет к разделению учаÑтка надвое, и Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ учаÑтка можно будет задать отдельные наÑтройки. Ðекоторые наÑтройки поÑле Ñ€Ð°Ð·Ð´ÐµÐ»ÐµÐ½Ð¸Ñ Ð±ÑƒÐ´ÑƒÑ‚ возвращены к значениÑм по умолчанию.
+
+Разделить землю?
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="CannotDivideLandNoRegion">
+ Ðевозможно разделить землю:
+Ðе удаетÑÑ Ð½Ð°Ð¹Ñ‚Ð¸ регион, в котором находитÑÑ Ñта землÑ.
+ </notification>
+ <notification name="CannotJoinLandNoRegion">
+ Ðевозможно объединить землю:
+Ðе удаетÑÑ Ð½Ð°Ð¹Ñ‚Ð¸ регион, в котором находитÑÑ Ñта землÑ.
+ </notification>
+ <notification name="CannotJoinLandNothingSelected">
+ Ðевозможно объединить землю:
+УчаÑтки не выбраны.
+ </notification>
+ <notification name="CannotJoinLandEntireParcelSelected">
+ Ðевозможно объединить землю:
+Выбран только один учаÑток.
+
+Выберите землю на обоих учаÑтках.
+ </notification>
+ <notification name="CannotJoinLandSelection">
+ Ðевозможно объединить землю:
+Следует выбрать более одного учаÑтка.
+
+Выберите землю на обоих учаÑтках.
+ </notification>
+ <notification name="JoinLandWarning">
+ Объединение земли приведет к Ñозданию одного большого учаÑтка изо вÑех учаÑтков, переÑекающих выбранный прÑмоугольник.
+ПотребуетÑÑ ÑброÑить Ð¸Ð¼Ñ Ð¸ наÑтройки нового учаÑтка.
+
+Объединить землю?
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmNotecardSave">
+ Эта заметка должна быть Ñохранена до того, как предмет Ñможет быть Ñкопирован или проÑмотрен. Сохранить заметку?
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmItemCopy">
+ Копировать Ñтот предмет в ваш инвентарь?
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="Копировать"/>
+ </notification>
+ <notification name="ResolutionSwitchFail">
+ Ðе удалоÑÑŒ Ñменить разрешение на [RESX] Ñ… [RESY]
+ </notification>
+ <notification name="ErrorUndefinedGrasses">
+ Ошибка. Ðе определена трава: [SPECIES]
+ </notification>
+ <notification name="ErrorUndefinedTrees">
+ Ошибка. Ðе определены деревьÑ: [SPECIES]
+ </notification>
+ <notification name="CannotSaveWearableOutOfSpace">
+ Ðевозможно Ñохранить «[NAME]» в файл одежды. ОÑвободите меÑто на компьютере и Ñохраните одежду Ñнова.
+ </notification>
+ <notification name="CannotSaveToAssetStore">
+ Ðевозможно Ñохранить «[NAME]» в центральном хранилище активов.
+Обычно Ñто Ð²Ñ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ Ð½ÐµÐ¿Ð¾Ð»Ð°Ð´ÐºÐ°. ИÑправьте наÑтройки и Ñохраните одежду Ñнова через неÑколько минут.
+ </notification>
+ <notification name="YouHaveBeenLoggedOut">
+ Черт! Ð’Ð°Ñ Ð²Ñ‹ÐºÐ¸Ð½ÑƒÐ»Ð¾ из [SECOND_LIFE]
+ [MESSAGE]
+ <usetemplate name="okcancelbuttons" notext="Выйти" yestext="ПроÑмотреть IM и чат"/>
+ </notification>
+ <notification name="OnlyOfficerCanBuyLand">
+ Ðевозможно купить землю Ð´Ð»Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ñ‹:
+У Ð²Ð°Ñ Ð½ÐµÑ‚ прав на покупку земли Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ¹ активной группы.
+ </notification>
+ <notification label="Добавить друга" name="AddFriendWithMessage">
+ Ð”Ñ€ÑƒÐ·ÑŒÑ Ð¼Ð¾Ð³ÑƒÑ‚ давать Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð¾Ñ‚ÑÐ»ÐµÐ¶Ð¸Ð²Ð°Ð½Ð¸Ñ Ñвоего Ð¿Ð¾Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð½Ð° карте и приема обновлений ÑтатуÑа в Ñети.
+
+Предложить дружбу жителю [NAME]?
+ <form name="form">
+ <input name="message">
+ Хочешь быть моим другом?
+ </input>
+ <button name="Offer" text="OK"/>
+ <button name="Cancel" text="Отмена"/>
+ </form>
+ </notification>
+ <notification label="Сохранить коÑтюм" name="SaveOutfitAs">
+ Сохранить текущую одежду как новый коÑтюм:
+ <form name="form">
+ <input name="message">
+ [DESC] (новый)
+ </input>
+ <button name="OK" text="OK"/>
+ <button name="Cancel" text="Отмена"/>
+ </form>
+ </notification>
+ <notification label="Сохранить одежду?" name="SaveWearableAs">
+ Сохранить предмет в инвентаре как:
+ <form name="form">
+ <input name="message">
+ [DESC] (новый)
+ </input>
+ <button name="OK" text="OK"/>
+ <button name="Cancel" text="Отмена"/>
+ </form>
+ </notification>
+ <notification label="Переименовать коÑтюм" name="RenameOutfit">
+ Ðовое название коÑтюма:
+ <form name="form">
+ <input name="new_name">
+ [NAME]
+ </input>
+ <button name="OK" text="OK"/>
+ <button name="Cancel" text="Отмена"/>
+ </form>
+ </notification>
+ <notification name="RemoveFromFriends">
+ Удалить Ð¶Ð¸Ñ‚ÐµÐ»Ñ &lt;nolink&gt;[NAME]&lt;/nolink&gt; из вашего ÑпиÑка друзей?
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="RemoveMultipleFromFriends">
+ Удалить неÑкольких жителей из вашего ÑпиÑка друзей?
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="GodDeleteAllScriptedPublicObjectsByUser">
+ Ð’Ñ‹ дейÑтвительно хотите удалить вÑе Ñкриптовые объекты, принадлежащие
+** [AVATAR_NAME] **
+на вÑей оÑтальной земле в Ñтом ÑимулÑторе?
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="GodDeleteAllScriptedObjectsByUser">
+ Ð’Ñ‹ дейÑтвительно хотите УДÐЛИТЬ ВСЕ Ñкриптовые объекты, принадлежащие
+** [AVATAR_NAME] **
+на ВСЕЙ ЗЕМЛЕ в Ñтом ÑимулÑторе?
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="GodDeleteAllObjectsByUser">
+ Ð’Ñ‹ дейÑтвительно хотите УДÐЛИТЬ ВСЕ объекты (Ñкриптовые и прочие), принадлежащие
+** [AVATAR_NAME] **
+на ВСЕЙ ЗЕМЛЕ в Ñтом ÑимулÑторе?
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="BlankClassifiedName">
+ Ðеобходимо указать Ð¸Ð¼Ñ Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ¹ рекламы.
+ </notification>
+ <notification name="MinClassifiedPrice">
+ СтоимоÑть Ñ€Ð°Ð·Ð¼ÐµÑ‰ÐµÐ½Ð¸Ñ Ñ€ÐµÐºÐ»Ð°Ð¼Ñ‹ должна быть как минимум L$[MIN_PRICE].
+
+Введите более выÑокую цену.
+ </notification>
+ <notification name="ConfirmItemDeleteHasLinks">
+ ИмеетÑÑ ÑÑылка, ÑƒÐºÐ°Ð·Ñ‹Ð²Ð°ÑŽÑ‰Ð°Ñ ÐºÐ°Ðº минимум на один из выбранных вами предметов. ЕÑли удалить Ñтот предмет, его ÑÑылки переÑтанут работать. ÐаÑтоÑтельно рекомендуетÑÑ Ñначала удалить ÑÑылки.
+
+ДейÑтвительно удалить Ñти предметы?
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmObjectDeleteLock">
+ Как минимум один из выбранных вами предметов ÑвлÑетÑÑ Ñ„Ð¸ÐºÑированным.
+
+ДейÑтвительно удалить Ñти предметы?
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmObjectDeleteNoCopy">
+ Как минимум один из выбранных вами предметов не ÑвлÑетÑÑ ÐºÐ¾Ð¿Ð¸Ñ€ÑƒÐµÐ¼Ñ‹Ð¼.
+
+ДейÑтвительно удалить Ñти предметы?
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmObjectDeleteNoOwn">
+ Как минимум один из выбранных вами предметов не принадлежит вам.
+
+ДейÑтвительно удалить Ñти предметы?
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmObjectDeleteLockNoCopy">
+ Как минимум один объект фикÑирован.
+Как минимум один объект не копируемый.
+
+ДейÑтвительно удалить Ñти предметы?
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmObjectDeleteLockNoOwn">
+ Как минимум один объект фикÑирован.
+Вы не владеете по крайней мере одним объектом.
+
+ДейÑтвительно удалить Ñти предметы?
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmObjectDeleteNoCopyNoOwn">
+ Как минимум один объект не копируемый.
+Вы не владеете по крайней мере одним объектом.
+
+ДейÑтвительно удалить Ñти предметы?
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmObjectDeleteLockNoCopyNoOwn">
+ Как минимум один объект фикÑирован.
+Как минимум один объект не копируемый.
+Вы не владеете по крайней мере одним объектом.
+
+ДейÑтвительно удалить Ñти предметы?
+ <usetemplate name="okcancelbuttons" notext="отмена" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmObjectTakeLock">
+ Как минимум один объект фикÑирован.
+
+ДейÑтвительно взÑть Ñти предметы?
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmObjectTakeNoOwn">
+ Ð’Ñ‹ не ÑвлÑетеÑÑŒ владельцем вÑех объектов, которые ÑобираетеÑÑŒ взÑть.
+ЕÑли продолжить, будут применены Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ñледующего владельца, которые могут ограничить вашу ÑпоÑобноÑть изменÑть или копировать Ñти объекты.
+
+ДейÑтвительно взÑть Ñти предметы?
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmObjectTakeLockNoOwn">
+ Как минимум один объект фикÑирован.
+Ð’Ñ‹ не ÑвлÑетеÑÑŒ владельцем вÑех объектов, которые ÑобираетеÑÑŒ взÑть.
+ЕÑли продолжить, будут применены Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ñледующего владельца, которые могут ограничить вашу ÑпоÑобноÑть изменÑть или копировать Ñти объекты.
+Ð’ то же Ð²Ñ€ÐµÐ¼Ñ Ð²Ñ‹ можете взÑть объекты, выбранные ÑейчаÑ.
+
+ДейÑтвительно взÑть Ñти предметы?
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="CantBuyLandAcrossMultipleRegions">
+ Ðевозможно купить землю, потому что выделение охватывает неÑколько регионов.
+
+Выберите меньшую облаÑть и повторите попытку.
+ </notification>
+ <notification name="DeedLandToGroup">
+ ПоÑле передачи Ñтого учаÑтка группе потребуетÑÑ Ð´Ð¾Ñтаточное количеÑтво финанÑов Ð´Ð»Ñ Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶ÐºÐ¸ данной земли.
+СтоимоÑть покупки земли не возвращаетÑÑ Ð²Ð»Ð°Ð´ÐµÐ»ÑŒÑ†Ñƒ. ЕÑли переданный учаÑток продаетÑÑ, выручка за нее равномерно раÑпределÑетÑÑ Ð¼ÐµÐ¶Ð´Ñƒ учаÑтниками группы.
+
+Передать Ñти [AREA] м² земли группе «[GROUP_NAME]»?
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="DeedLandToGroupWithContribution">
+ ПоÑле передачи Ñтого учаÑтка группе потребуетÑÑ Ð´Ð¾Ñтаточное количеÑтво финанÑов Ð´Ð»Ñ Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶ÐºÐ¸ данной земли.
+Передача будет включать одновременный земельный Ð²Ð·Ð½Ð¾Ñ Ð² группу от Ð¶Ð¸Ñ‚ÐµÐ»Ñ Â«[NAME]».
+СтоимоÑть покупки земли не возвращаетÑÑ Ð²Ð»Ð°Ð´ÐµÐ»ÑŒÑ†Ñƒ. ЕÑли переданный учаÑток продаетÑÑ, выручка за нее равномерно раÑпределÑетÑÑ Ð¼ÐµÐ¶Ð´Ñƒ учаÑтниками группы.
+
+Передать Ñти [AREA] м² земли группе «[GROUP_NAME]»?
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="DisplaySetToSafe">
+ УÑтановлен безопаÑный уровень наÑтроек отображениÑ, так как указан параметр -safe.
+ </notification>
+ <notification name="DisplaySetToRecommendedGPUChange">
+ УÑтановлен рекомендуемый уровень наÑтроек отображениÑ, так как графичеÑÐºÐ°Ñ ÐºÐ°Ñ€Ñ‚Ð° изменена:
+Ñ Â«[LAST_GPU]»
+на «[THIS_GPU]»
+ </notification>
+ <notification name="DisplaySetToRecommendedFeatureChange">
+ УÑтановлен рекомендуемый уровень наÑтроек отображениÑ, так как подÑиÑтема визуализации изменена.
+ </notification>
+ <notification name="ErrorMessage">
+ [ERROR_MESSAGE]
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="AvatarMovedDesired">
+ Требуемое вами меÑтоположение ÑÐµÐ¹Ñ‡Ð°Ñ Ð½ÐµÐ´Ð¾Ñтупно.
+Ð’Ñ‹ перемещены в ÑоÑедний регион.
+ </notification>
+ <notification name="AvatarMovedLast">
+ Ваше поÑледнее меÑтоположение ÑÐµÐ¹Ñ‡Ð°Ñ Ð½ÐµÐ´Ð¾Ñтупно.
+Ð’Ñ‹ перемещены в ÑоÑедний регион.
+ </notification>
+ <notification name="AvatarMovedHome">
+ Ваше домашнее меÑтоположение ÑÐµÐ¹Ñ‡Ð°Ñ Ð½ÐµÐ´Ð¾Ñтупно.
+Ð’Ñ‹ перемещены в ÑоÑедний регион.
+Возможно, потребуетÑÑ Ð·Ð°Ð´Ð°Ñ‚ÑŒ новое домашнее меÑтоположение.
+ </notification>
+ <notification name="ClothingLoading">
+ Ваша одежда вÑе еще загружаетÑÑ.
+Ð’Ñ‹ можете иÑпользовать [SECOND_LIFE] как обычно, другие пользователи будут видеть Ð²Ð°Ñ Ð½Ð¾Ñ€Ð¼Ð°Ð»ÑŒÐ½Ð¾.
+ <form name="form">
+ <ignore name="ignore" text="Загрузка одежды занимает значительное времÑ"/>
+ </form>
+ </notification>
+ <notification name="FirstRun">
+ УÑтановка [APP_NAME] завершена.
+
+ЕÑли вы иÑпользуете [SECOND_LIFE] впервые, Ð´Ð»Ñ Ð²Ñ…Ð¾Ð´Ð° в программу вам потребуетÑÑ Ñоздать аккаунт.
+ВернутьÑÑ Ð½Ð° [http://join.secondlife.com secondlife.com] Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð°ÐºÐºÐ°ÑƒÐ½Ñ‚Ð°?
+ <usetemplate name="okcancelbuttons" notext="Продолжить" yestext="Создать аккаунт..."/>
+ </notification>
+ <notification name="LoginPacketNeverReceived">
+ Возникли неполадки при подключении. Возможно, проблема Ñ Ð²Ð°ÑˆÐ¸Ð¼ подключением к интернету или [SECOND_LIFE_GRID].
+
+Варианты ваших дейÑтвий: проверьте подключение к интернету и повторите попытку через неÑколько минут, нажмите кнопку «Справка» Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÑ…Ð¾Ð´Ð° к [SUPPORT_SITE] или кнопку «ТелепортациÑ», чтобы телепортироватьÑÑ Ð´Ð¾Ð¼Ð¾Ð¹.
+ <url name="url">
+ http://secondlife.com/support/
+ </url>
+ <form name="form">
+ <button name="OK" text="OK"/>
+ <button name="Help" text="Справка"/>
+ <button name="Teleport" text="ТелепортациÑ"/>
+ </form>
+ </notification>
+ <notification name="WelcomeChooseSex">
+ Ваш перÑонаж поÑвитÑÑ Ñ‡ÐµÑ€ÐµÐ· мгновение.
+
+Ð”Ð»Ñ Ñ…Ð¾Ð´ÑŒÐ±Ñ‹ нажимайте клавиши Ñо Ñтрелками.
+Ð’ любой момент можно нажать клавишу F1 Ð´Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ñправки или информации о [SECOND_LIFE].
+Выберите мужÑкой или женÑкий аватар. Этот выбор затем можно будет изменить.
+ <usetemplate name="okcancelbuttons" notext="Женщина" yestext="Мужчина"/>
+ </notification>
+ <notification name="CantTeleportToGrid">
+ Ðе удалоÑÑŒ телепортироватьÑÑ Ð² [SLURL]: Ñто меÑто находитÑÑ Ð½Ð° другой Ñетке ([GRID]), а не на текущей ([CURRENT_GRID]). Закройте программу и попробуйте еще раз.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="GeneralCertificateError">
+ Ðе удалоÑÑŒ подключитьÑÑ Ðº Ñерверу.
+[REASON]
+
+Тема: [SUBJECT_NAME_STRING]
+Издатель: [ISSUER_NAME_STRING]
+ДейÑтвительно Ñ: [VALID_FROM]
+ДейÑтвительно по: [VALID_TO]
+Отпечаток MD5: [SHA1_DIGEST]
+Отпечаток SHA1: [MD5_DIGEST]
+ИÑпользование ключа: [KEYUSAGE]
+РаÑширенное иÑпользование ключа: [EXTENDEDKEYUSAGE]
+Идентификатор ключа темы: [SUBJECTKEYIDENTIFIER]
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="TrustCertificateError">
+ Центр Ñертификации Ð´Ð»Ñ Ñтого Ñервера неизвеÑтен.
+
+Ð¡Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¾ Ñертификате:
+Тема: [SUBJECT_NAME_STRING]
+Издатель: [ISSUER_NAME_STRING]
+ДейÑтвительно Ñ: [VALID_FROM]
+ДейÑтвительно по: [VALID_TO]
+Отпечаток MD5: [SHA1_DIGEST]
+Отпечаток SHA1: [MD5_DIGEST]
+ИÑпользование ключа: [KEYUSAGE]
+РаÑширенное иÑпользование ключа: [EXTENDEDKEYUSAGE]
+Идентификатор ключа темы: [SUBJECTKEYIDENTIFIER]
+
+ДоверÑть Ñтому центру Ñертификации?
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="ДоверÑть"/>
+ </notification>
+ <notification name="NotEnoughCurrency">
+ [NAME] L$ [PRICE] У Ð²Ð°Ñ Ð½ÐµÐ´Ð¾Ñтаточно L$ Ð´Ð»Ñ Ñтого.
+ </notification>
+ <notification name="GrantedModifyRights">
+ [NAME] дал(а) вам разрешение на редактирование Ñвоих объектов.
+ </notification>
+ <notification name="RevokedModifyRights">
+ Ваше право на изменение объектов [NAME] отозвано
+ </notification>
+ <notification name="FlushMapVisibilityCaches">
+ КÑши карт данного региона будут очищены.
+Это полезно только Ð´Ð»Ñ Ñ†ÐµÐ»ÐµÐ¹ отладки.
+(Ð’ рабочей верÑии надо подождать 5 минут, затем карта каждого Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð±ÑƒÐ´ÐµÑ‚ обновлена поÑле входа в программу.)
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="BuyOneObjectOnly">
+ ÐÐµÐ»ÑŒÐ·Ñ ÐºÑƒÐ¿Ð¸Ñ‚ÑŒ неÑколько объектов одновременно. Выберите один объект и повторите попытку.
+ </notification>
+ <notification name="OnlyCopyContentsOfSingleItem">
+ ÐÐµÐ»ÑŒÐ·Ñ ÐºÐ¾Ð¿Ð¸Ñ€Ð¾Ð²Ð°Ñ‚ÑŒ Ñодержимое неÑкольких объектов одновременно.
+Выберите один объект и повторите попытку.
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="KickUsersFromRegion">
+ Телепортировать вÑех жителей в Ñтом регионе домой?
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="EstateObjectReturn">
+ Ð’Ñ‹ дейÑтвительно хотите вернуть объекты, принадлежащие [USER_NAME]?
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="InvalidTerrainBitDepth">
+ Ðе удалоÑÑŒ задать текÑтуры региона:
+у текÑтуры [TEXTURE_NUM] Ð½ÐµÐ¿Ñ€Ð°Ð²Ð¸Ð»ÑŒÐ½Ð°Ñ Ð±Ð¸Ñ‚Ð¾Ð²Ð°Ñ Ð³Ð»ÑƒÐ±Ð¸Ð½Ð° [TEXTURE_BIT_DEPTH].
+
+Замените текÑтуру [TEXTURE_NUM] на 24-битное изображение размером 512x512 или меньше и Ñнова нажмите кнопку «Применить».
+ </notification>
+ <notification name="InvalidTerrainSize">
+ Ðе удалоÑÑŒ задать текÑтуры региона:
+у текÑтуры [TEXTURE_NUM] Ñлишком большой размер [TEXTURE_SIZE_X]x[TEXTURE_SIZE_Y].
+
+Замените текÑтуру [TEXTURE_NUM] на 24-битное изображение размером 512x512 или меньше и Ñнова нажмите кнопку «Применить».
+ </notification>
+ <notification name="RawUploadStarted">
+ ÐачалаÑÑŒ передача. Она может занÑть до двух минут, в завиÑимоÑти от ÑкороÑти ÑоединениÑ.
+ </notification>
+ <notification name="ConfirmBakeTerrain">
+ Ð’Ñ‹ дейÑтвительно хотите зафикÑировать текущий ландшафт, Ñделать его выÑоту Ñредней точкой Ð´Ð»Ñ Ð²ÐµÑ€Ñ…Ð½ÐµÐ¹ и нижней точек ландшафта и принÑть по умолчанию Ð´Ð»Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ð¸ «Вернуть»?
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="MaxAllowedAgentOnRegion">
+ У Ð²Ð°Ñ Ð¼Ð¾Ð¶ÐµÑ‚ быть не более [MAX_AGENTS] допущенных жителей.
+ </notification>
+ <notification name="MaxBannedAgentsOnRegion">
+ У Ð²Ð°Ñ Ð¼Ð¾Ð¶ÐµÑ‚ быть не более [MAX_BANNED] забаненных жителей.
+ </notification>
+ <notification name="MaxAgentOnRegionBatch">
+ Ðе удалоÑÑŒ добавить [NUM_ADDED] агентов:
+превышен лимит [MAX_AGENTS] [LIST_TYPE] на [NUM_EXCESS].
+ </notification>
+ <notification name="MaxAllowedGroupsOnRegion">
+ У Ð²Ð°Ñ Ð¼Ð¾Ð¶ÐµÑ‚ быть не более [MAX_GROUPS] допущенных групп.
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="ЗафикÑировать"/>
+ </notification>
+ <notification name="MaxManagersOnRegion">
+ У Ð²Ð°Ñ Ð¼Ð¾Ð¶ÐµÑ‚ быть не более [MAX_MANAGER] менеджеров землевладениÑ.
+ </notification>
+ <notification name="OwnerCanNotBeDenied">
+ ÐÐµÐ»ÑŒÐ·Ñ Ð´Ð¾Ð±Ð°Ð²Ð¸Ñ‚ÑŒ землевладельца в ÑпиÑок забаненных жителей его же земли.
+ </notification>
+ <notification name="CanNotChangeAppearanceUntilLoaded">
+ ÐÐµÐ»ÑŒÐ·Ñ Ð¸Ð·Ð¼ÐµÐ½Ñть внешноÑть, пока загружаютÑÑ Ð¾Ð´ÐµÐ¶Ð´Ð° и фигура.
+ </notification>
+ <notification name="ClassifiedMustBeAlphanumeric">
+ Ðазвание вашей рекламы должно начинатьÑÑ Ñ Ð±ÑƒÐºÐ²Ñ‹ A - Z или цифры. ИÑпользовать знаки Ð¿Ñ€ÐµÐ¿Ð¸Ð½Ð°Ð½Ð¸Ñ Ð½Ðµ разрешено.
+ </notification>
+ <notification name="CantSetBuyObject">
+ Ðевозможно задать покупку объекта, потому что Ñтот объект не Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð´Ð°Ð¶Ð¸.
+Задайте продажу объекта и повторите попытку.
+ </notification>
+ <notification name="FinishedRawDownload">
+ Завершена загрузка файла ландшафта:
+[DOWNLOAD_PATH].
+ </notification>
+ <notification name="DownloadWindowsMandatory">
+ ПоÑвилаÑÑŒ Ð½Ð¾Ð²Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ [APP_NAME].
+[MESSAGE]
+Это обновление необходимо загрузить Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ [APP_NAME].
+ <usetemplate name="okcancelbuttons" notext="Выйти" yestext="Загрузить"/>
+ </notification>
+ <notification name="DownloadWindows">
+ ПоÑвилоÑÑŒ обновление Ð´Ð»Ñ [APP_NAME].
+[MESSAGE]
+УÑтанавливать Ñто обновление не обÑзательно, но рекомендуетÑÑ Ð´Ð»Ñ Ð¿Ð¾Ð²Ñ‹ÑˆÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾Ð¸Ð·Ð²Ð¾Ð´Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ñти и ÑтабильноÑти.
+ <usetemplate name="okcancelbuttons" notext="Продолжить" yestext="Загрузить"/>
+ </notification>
+ <notification name="DownloadWindowsReleaseForDownload">
+ ПоÑвилоÑÑŒ обновление Ð´Ð»Ñ [APP_NAME].
+[MESSAGE]
+УÑтанавливать Ñто обновление не обÑзательно, но рекомендуетÑÑ Ð´Ð»Ñ Ð¿Ð¾Ð²Ñ‹ÑˆÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾Ð¸Ð·Ð²Ð¾Ð´Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ñти и ÑтабильноÑти.
+ <usetemplate name="okcancelbuttons" notext="Продолжить" yestext="Загрузить"/>
+ </notification>
+ <notification name="DownloadLinuxMandatory">
+ ПоÑвилаÑÑŒ Ð½Ð¾Ð²Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ [APP_NAME].
+[MESSAGE]
+Это обновление необходимо загрузить Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ [APP_NAME].
+ <usetemplate name="okcancelbuttons" notext="Выйти" yestext="Загрузить"/>
+ </notification>
+ <notification name="DownloadLinux">
+ ПоÑвилоÑÑŒ обновление Ð´Ð»Ñ [APP_NAME].
+[MESSAGE]
+УÑтанавливать Ñто обновление не обÑзательно, но рекомендуетÑÑ Ð´Ð»Ñ Ð¿Ð¾Ð²Ñ‹ÑˆÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾Ð¸Ð·Ð²Ð¾Ð´Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ñти и ÑтабильноÑти.
+ <usetemplate name="okcancelbuttons" notext="Продолжить" yestext="Загрузить"/>
+ </notification>
+ <notification name="DownloadLinuxReleaseForDownload">
+ ПоÑвилоÑÑŒ обновление Ð´Ð»Ñ [APP_NAME].
+[MESSAGE]
+УÑтанавливать Ñто обновление не обÑзательно, но рекомендуетÑÑ Ð´Ð»Ñ Ð¿Ð¾Ð²Ñ‹ÑˆÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾Ð¸Ð·Ð²Ð¾Ð´Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ñти и ÑтабильноÑти.
+ <usetemplate name="okcancelbuttons" notext="Продолжить" yestext="Загрузить"/>
+ </notification>
+ <notification name="DownloadMacMandatory">
+ ПоÑвилаÑÑŒ Ð½Ð¾Ð²Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ [APP_NAME].
+[MESSAGE]
+Это обновление необходимо загрузить Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ [APP_NAME].
+
+Загрузить его в папку приложений?
+ <usetemplate name="okcancelbuttons" notext="Выйти" yestext="Загрузить"/>
+ </notification>
+ <notification name="DownloadMac">
+ ПоÑвилоÑÑŒ обновление Ð´Ð»Ñ [APP_NAME].
+[MESSAGE]
+УÑтанавливать Ñто обновление не обÑзательно, но рекомендуетÑÑ Ð´Ð»Ñ Ð¿Ð¾Ð²Ñ‹ÑˆÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾Ð¸Ð·Ð²Ð¾Ð´Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ñти и ÑтабильноÑти.
+
+Загрузить его в папку приложений?
+ <usetemplate name="okcancelbuttons" notext="Продолжить" yestext="Загрузить"/>
+ </notification>
+ <notification name="DownloadMacReleaseForDownload">
+ ПоÑвилоÑÑŒ обновление Ð´Ð»Ñ [APP_NAME].
+[MESSAGE]
+УÑтанавливать Ñто обновление не обÑзательно, но рекомендуетÑÑ Ð´Ð»Ñ Ð¿Ð¾Ð²Ñ‹ÑˆÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾Ð¸Ð·Ð²Ð¾Ð´Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ñти и ÑтабильноÑти.
+
+Загрузить его в папку приложений?
+ <usetemplate name="okcancelbuttons" notext="Продолжить" yestext="Загрузить"/>
+ </notification>
+ <notification name="FailedUpdateInstall">
+ Произошла ошибка при уÑтановке обновлениÑ.
+Загрузите новую верÑию программы на Ñайте
+http://secondlife.com/download.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="FailedRequiredUpdateInstall">
+ Ðе удалоÑÑŒ уÑтановить обÑзательное обновление.
+Ð’Ñ‹ не Ñможете войти в [APP_NAME], пока обновление не будет уÑтановлено.
+
+Загрузите новую верÑию программы на Ñайте
+http://secondlife.com/download.
+ <usetemplate name="okbutton" yestext="Выйти"/>
+ </notification>
+ <notification name="UpdaterServiceNotRunning">
+ ПоÑвилиÑÑŒ обÑзательные Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ¹ верÑии Second Life.
+
+Загрузите Ñто обновление на Ñайте http://www.secondlife.com/downloads
+или уÑтановите его ÑейчаÑ.
+ <usetemplate name="okcancelbuttons" notext="Выйти из Second Life" yestext="Загрузить и уÑтановить ÑейчаÑ"/>
+ </notification>
+ <notification name="DownloadBackgroundTip">
+ Загружено обновление Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ¹ верÑии [APP_NAME].
+ВерÑÐ¸Ñ [VERSION]. [[RELEASE_NOTES_FULL_URL] Ð¡Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¾Ð± Ñтом обновлении]
+ <usetemplate name="okcancelbuttons" notext="Позже..." yestext="УÑтановите обновление и перезапуÑтите [APP_NAME]"/>
+ </notification>
+ <notification name="DownloadBackgroundDialog">
+ Загружено обновление Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ¹ верÑии [APP_NAME].
+ВерÑÐ¸Ñ [VERSION]. [[RELEASE_NOTES_FULL_URL] Ð¡Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¾Ð± Ñтом обновлении]
+ <usetemplate name="okcancelbuttons" notext="Позже..." yestext="УÑтановите обновление и перезапуÑтите [APP_NAME]"/>
+ </notification>
+ <notification name="RequiredUpdateDownloadedVerboseDialog">
+ Загружено обÑзательное обновление.
+ВерÑÐ¸Ñ [VERSION]
+
+Ðеобходимо перезапуÑтить [APP_NAME] Ð´Ð»Ñ ÑƒÑтановки обновлениÑ.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="RequiredUpdateDownloadedDialog">
+ Ðеобходимо перезапуÑтить [APP_NAME] Ð´Ð»Ñ ÑƒÑтановки обновлениÑ.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="DeedObjectToGroup">
+ Ð’ результате передачи Ñтого объекта группа:
+* Получит L$ в уплату за объект
+ <usetemplate ignoretext="Подтверждать перед передачей объекта группе" name="okcancelignore" notext="Отмена" yestext="Передать"/>
+ </notification>
+ <notification name="WebLaunchExternalTarget">
+ Открыть браузер Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñмотра Ñтого контента?
+ <usetemplate ignoretext="ЗапуÑтить браузер Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñмотра веб-Ñтраницы" name="okcancelignore" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="WebLaunchJoinNow">
+ Перейти на [http://secondlife.com/account/ информационную панель] Ð´Ð»Ñ ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð²Ð°ÑˆÐ¸Ð¼ аккаунтом?
+ <usetemplate ignoretext="ЗапуÑтить браузер Ð´Ð»Ñ ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð°ÐºÐºÐ°ÑƒÐ½Ñ‚Ð¾Ð¼" name="okcancelignore" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="WebLaunchSecurityIssues">
+ Прочитайте на вики-Ñтранице [SECOND_LIFE] о том, как Ñообщить о проблеме Ñ Ð±ÐµÐ·Ð¾Ð¿Ð°ÑноÑтью.
+ <usetemplate ignoretext="ЗапуÑтить браузер Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñмотра инÑтрукций в Ñлучае проблем Ñ Ð±ÐµÐ·Ð¾Ð¿Ð°ÑноÑтью" name="okcancelignore" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="WebLaunchQAWiki">
+ ПоÑетите вики-Ñтраницу вопроÑов и ответов по [SECOND_LIFE].
+ <usetemplate ignoretext="ЗапуÑтить браузер Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñмотра вики-Ñтраницы вопроÑов и ответов" name="okcancelignore" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="WebLaunchPublicIssue">
+ ПоÑетите Ñтраницу общедоÑтупного ÑредÑтва иÑÑÐ»ÐµÐ´Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ñ€Ð¾Ð±Ð»ÐµÐ¼ [SECOND_LIFE], на котором можно Ñообщить об ошибках и других проблемах.
+ <usetemplate ignoretext="ЗапуÑтить браузер Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¾Ð±Ñ‰ÐµÐ´Ð¾Ñтупного ÑредÑтва иÑÑÐ»ÐµÐ´Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ñ€Ð¾Ð±Ð»ÐµÐ¼" name="okcancelignore" notext="Отмена" yestext="Перейти на Ñтраницу"/>
+ </notification>
+ <notification name="WebLaunchSupportWiki">
+ Перейти на официальный блог Linden Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñмотра Ñвежих новоÑтей и прочей информации.
+ <usetemplate ignoretext="ЗапуÑтить браузер Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñмотра блога" name="okcancelignore" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="WebLaunchLSLGuide">
+ Открыть руководÑтво по Ñкриптам Ð´Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ñправки?
+ <usetemplate ignoretext="ЗапуÑтить браузер Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñмотра руководÑтва по Ñкриптам" name="okcancelignore" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="WebLaunchLSLWiki">
+ ПоÑетить портал LSL Ð´Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ñправки по Ñкриптам?
+ <usetemplate ignoretext="ЗапуÑтить браузер Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñмотра портала LSL" name="okcancelignore" notext="Отмена" yestext="Перейти на Ñтраницу"/>
+ </notification>
+ <notification name="ReturnToOwner">
+ Ð’Ñ‹ дейÑтвительно хотите вернуть выбранные объекты их владельцам? ПереноÑимые переданные объекты будут возвращены прежним владельцам.
+
+*ПРЕДУПРЕЖДЕÐИЕ* ÐепереноÑимые переданные объекты будут удалены!
+ <usetemplate ignoretext="Подтверждать перед возвратом объектов владельцам" name="okcancelignore" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="GroupLeaveConfirmMember">
+ Ð’Ñ‹ ÑвлÑетеÑÑŒ учаÑтником группы &lt;nolink&gt;[GROUP]&lt;/nolink&gt;.
+Хотите покинуть группу?
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmKick">
+ Ð’Ñ‹ ДЕЙСТВИТЕЛЬÐО хотите выброÑить вÑех жителей Ñ Ñетки?
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="ВыброÑить вÑех жителей"/>
+ </notification>
+ <notification name="MuteLinden">
+ Заблокировать Linden нельзÑ.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="CannotStartAuctionAlreadyForSale">
+ ÐÐµÐ»ÑŒÐ·Ñ Ð²Ñ‹Ñтавить на аукцион учаÑток, который уже продаетÑÑ. Отмените продажу учаÑтка, еÑли дейÑтвительно хотите начать аукцион.
+ </notification>
+ <notification label="Ðе удалоÑÑŒ блокировать объект по имени" name="MuteByNameFailed">
+ Ð’Ñ‹ уже внеÑли Ñто Ð¸Ð¼Ñ Ð² черный ÑпиÑок.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="RemoveItemWarn">
+ Удаление Ñодержимого, Ñ…Ð¾Ñ‚Ñ Ñто и разрешено, может повредить объект. Хотите удалить Ñтот предмет?
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="CantOfferCallingCard">
+ Ð¡ÐµÐ¹Ñ‡Ð°Ñ Ð½ÐµÐ²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ предложить визитку. Повторите попытку через минуту.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="CantOfferFriendship">
+ Ð¡ÐµÐ¹Ñ‡Ð°Ñ Ð½ÐµÐ²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ предложить дружбу. Повторите попытку через минуту.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="BusyModeSet">
+ УÑтановлен режим «ЗанÑт».
+Ð¡Ð¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ñ‡Ð°Ñ‚Ð° и IM будут Ñкрыты. Ðа IM-ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð±ÑƒÐ´ÐµÑ‚ возвращатьÑÑ Ð·Ð°Ð´Ð°Ð½Ð½Ñ‹Ð¹ ответ в режиме «ЗанÑт». Ð’Ñе Ð¿Ñ€ÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ñ‚ÐµÐ»ÐµÐ¿Ð¾Ñ€Ñ‚Ð°Ñ†Ð¸Ð¸ будут отклонÑтьÑÑ. Ð’Ñе Ð¿Ñ€ÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¸Ð½Ð²ÐµÐ½Ñ‚Ð°Ñ€Ñ Ð±ÑƒÐ´ÑƒÑ‚ направлены в корзину.
+ <usetemplate ignoretext="Смена моего ÑтатуÑа на режим «ЗанÑт»" name="okignore" yestext="OK"/>
+ </notification>
+ <notification name="JoinedTooManyGroupsMember">
+ ДоÑтигнуто макÑимальное количеÑтво групп. Выйдите из другой группы, прежде чем вÑтупать в Ñту, или отклоните предложение.
+[NAME] приглаÑил(а) Ð²Ð°Ñ Ð² группу.
+ <usetemplate name="okcancelbuttons" notext="Отклонить" yestext="Ð’Ñтупить"/>
+ </notification>
+ <notification name="JoinedTooManyGroups">
+ ДоÑтигнуто макÑимальное количеÑтво групп. Выйдите из другой группы, прежде чем вÑтупать в Ñту или Ñоздавать новую группу.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="KickUser">
+ ВыброÑить Ñтого Ð¶Ð¸Ñ‚ÐµÐ»Ñ Ñ Ñ‚Ð°ÐºÐ¸Ð¼ Ñообщением?
+ <form name="form">
+ <input name="message">
+ ÐдминиÑтратор вывел Ð²Ð°Ñ Ð¸Ð· программы.
+ </input>
+ <button name="OK" text="OK"/>
+ <button name="Cancel" text="Отмена"/>
+ </form>
+ </notification>
+ <notification name="KickAllUsers">
+ ВыброÑить вÑех жителей, которые ÑÐµÐ¹Ñ‡Ð°Ñ ÐµÑть на Ñетке, Ñ Ñ‚Ð°ÐºÐ¸Ð¼ Ñообщением?
+ <form name="form">
+ <input name="message">
+ ÐдминиÑтратор вывел Ð²Ð°Ñ Ð¸Ð· программы.
+ </input>
+ <button name="OK" text="OK"/>
+ <button name="Cancel" text="Отмена"/>
+ </form>
+ </notification>
+ <notification name="FreezeUser">
+ Заморозить Ñтого Ð¶Ð¸Ñ‚ÐµÐ»Ñ Ñ Ñ‚Ð°ÐºÐ¸Ð¼ Ñообщением?
+ <form name="form">
+ <input name="message">
+ Ð’Ñ‹ заморожены. Ð’Ñ‹ не можете двигатьÑÑ Ð¸ беÑедовать в чате. ÐдминиÑтратор ÑвÑжетÑÑ Ñ Ð²Ð°Ð¼Ð¸ в ÑеанÑе мгновенных Ñообщений (IM).
+ </input>
+ <button name="OK" text="OK"/>
+ <button name="Cancel" text="Отмена"/>
+ </form>
+ </notification>
+ <notification name="UnFreezeUser">
+ Разморозить Ñтого Ð¶Ð¸Ñ‚ÐµÐ»Ñ Ñ Ñ‚Ð°ÐºÐ¸Ð¼ Ñообщением?
+ <form name="form">
+ <input name="message">
+ Вы больше не заморожены.
+ </input>
+ <button name="OK" text="OK"/>
+ <button name="Cancel" text="Отмена"/>
+ </form>
+ </notification>
+ <notification name="SetDisplayNameSuccess">
+ Привет, [DISPLAY_NAME]!
+
+Как и в реальной жизни, должно пройти какое-то времÑ, прежде чем вÑе узнают ваше новое имÑ. Подождите неÑколько дней, пока [http://wiki.secondlife.com/wiki/Setting_your_display_name ваше Ð¸Ð¼Ñ Ð½Ðµ будет обновлено] в объектах, Ñкриптах, поиÑке и Ñ‚.д.
+ </notification>
+ <notification name="SetDisplayNameBlocked">
+ Ð’Ñ‹ не можете Ñменить Ñвое Ñкранное имÑ. ЕÑли вы Ñчитаете, что Ñто ошибка, обратитеÑÑŒ в Ñлужбу поддержки.
+ </notification>
+ <notification name="SetDisplayNameFailedLength">
+ Это Ð¸Ð¼Ñ Ñлишком длинное. Экранное Ð¸Ð¼Ñ Ð¼Ð¾Ð¶ÐµÑ‚ Ñодержать не более [LENGTH] Ñимволов.
+
+Сократите имÑ.
+ </notification>
+ <notification name="SetDisplayNameFailedGeneric">
+ Ðе удалоÑÑŒ Ñменить ваше Ñкранное имÑ. Повторите попытку позже.
+ </notification>
+ <notification name="SetDisplayNameMismatch">
+ Введенные Ñкранные имена не Ñовпадают. Введите их еще раз.
+ </notification>
+ <notification name="AgentDisplayNameUpdateThresholdExceeded">
+ Вам надо подождать, прежде чем вы Ñможете Ñменить Ñвое Ñкранное имÑ.
+
+См. http://wiki.secondlife.com/wiki/Setting_your_display_name
+
+Повторите попытку позже.
+ </notification>
+ <notification name="AgentDisplayNameSetBlocked">
+ ÐÐµÐ»ÑŒÐ·Ñ Ð·Ð°Ð´Ð°Ñ‚ÑŒ указанное вами имÑ. Оно Ñодержит запрещенное Ñлово.
+
+ Попробуйте указать другое имÑ.
+ </notification>
+ <notification name="AgentDisplayNameSetInvalidUnicode">
+ Выбранное вами Ñкранное Ð¸Ð¼Ñ Ñодержит недопуÑтимые Ñимволы.
+ </notification>
+ <notification name="AgentDisplayNameSetOnlyPunctuation">
+ Ваше Ñкранное Ð¸Ð¼Ñ ÐºÑ€Ð¾Ð¼Ðµ знаков Ð¿Ñ€ÐµÐ¿Ð¸Ð½Ð°Ð½Ð¸Ñ Ð´Ð¾Ð»Ð¶Ð½Ð¾ Ñодержать буквы.
+ </notification>
+ <notification name="DisplayNameUpdate">
+ [OLD_NAME] ([SLID]) теперь ноÑит Ð¸Ð¼Ñ [NEW_NAME].
+ </notification>
+ <notification name="OfferTeleport">
+ Предложить телепортацию к вам Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²ÐºÐ¾Ð¹ ÑообщениÑ?
+ <form name="form">
+ <input name="message">
+ ПриÑоединитьÑÑ ÐºÐ¾ мне в [REGION]
+ </input>
+ <button name="OK" text="OK"/>
+ <button name="Cancel" text="Отмена"/>
+ </form>
+ </notification>
+ <notification name="TooManyTeleportOffers">
+ Попытка Ñделать [OFFERS] предложений телепортации, что больше лимита ([LIMIT]).
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="OfferTeleportFromGod">
+ Творец вызывает Ð¶Ð¸Ñ‚ÐµÐ»Ñ Ðº вам?
+ <form name="form">
+ <input name="message">
+ ПриÑоединитьÑÑ ÐºÐ¾ мне в [REGION]
+ </input>
+ <button name="OK" text="OK"/>
+ <button name="Cancel" text="Отмена"/>
+ </form>
+ </notification>
+ <notification name="TeleportFromLandmark">
+ Ð’Ñ‹ дейÑтвительно хотите телепортироватьÑÑ Ð² &lt;nolink&gt;[LOCATION]&lt;/nolink&gt;?
+ <usetemplate ignoretext="Подтверждать телепортацию на закладку" name="okcancelignore" notext="Отмена" yestext="ТелепортациÑ"/>
+ </notification>
+ <notification name="TeleportToPick">
+ ТелепортироватьÑÑ Ð² [PICK]?
+ <usetemplate ignoretext="Подтверждать телепортацию на меÑто в подборке" name="okcancelignore" notext="Отмена" yestext="ТелепортациÑ"/>
+ </notification>
+ <notification name="TeleportToClassified">
+ ТелепортироватьÑÑ Ð² [CLASSIFIED]?
+ <usetemplate ignoretext="Подтверждать телепортацию на меÑто в рекламном объÑвлении" name="okcancelignore" notext="Отмена" yestext="ТелепортациÑ"/>
+ </notification>
+ <notification name="TeleportToHistoryEntry">
+ ТелепортироватьÑÑ Ð² [HISTORY_ENTRY]?
+ <usetemplate ignoretext="Подтверждать телепортацию на меÑто в журнале" name="okcancelignore" notext="Отмена" yestext="ТелепортациÑ"/>
+ </notification>
+ <notification label="Сообщение вÑем в моем землевладении" name="MessageEstate">
+ Введите краткое объÑвление Ð´Ð»Ñ Ð²Ñех жителей, которые ÑÐµÐ¹Ñ‡Ð°Ñ Ð½Ð°Ñ…Ð¾Ð´ÑÑ‚ÑÑ Ð² вашем землевладении.
+ <form name="form">
+ <button name="OK" text="OK"/>
+ <button name="Cancel" text="Отмена"/>
+ </form>
+ </notification>
+ <notification label="Изменить землевладение Linden" name="ChangeLindenEstate">
+ Ð’Ñ‹ ÑобираетеÑÑŒ изменить землевладение, которое принадлежит компании Linden (материк, Ñетку Ð´Ð»Ñ Ð¿Ð¾Ð´Ñ€Ð¾Ñтков, ориентацию и Ñ‚.д.).
+
+Это ОЧЕÐЬ ОПÐСÐО, так как Ñерьезно повлиÑет на огромное количеÑтво жителей. Ваше изменение раÑпроÑтранитÑÑ Ð½Ð° тыÑÑчи регионов материка и вызовет Ñбой Ñервера.
+
+Ðачать?
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification label="Изменить доÑтуп к землевладению Linden" name="ChangeLindenAccess">
+ Ð’Ñ‹ ÑобираетеÑÑŒ изменить ÑпиÑок доÑтупа к землевладению, которое принадлежит компании Linden (материк, Ñетка Ð´Ð»Ñ Ð¿Ð¾Ð´Ñ€Ð¾Ñтков, Ð¾Ñ€Ð¸ÐµÐ½Ñ‚Ð°Ñ†Ð¸Ñ Ð¸ Ñ‚.д.).
+
+Это дейÑтвие ОПÐСÐО и допуÑкаетÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ Ð´Ð»Ñ ÑƒÑÑ‚Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð½Ð°Ñ€ÑƒÑˆÐµÐ½Ð¸Ñ, которое позволÑет вводить и выводить объекты и L$ из Ñетки.
+Ваше изменение раÑпроÑтранитÑÑ Ð½Ð° тыÑÑчи регионов и вызовет Ñбой Ñервера.
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification label="Выбрать землевладение" name="EstateAllowedAgentAdd">
+ ВнеÑти в ÑпиÑок допущенных только Ð´Ð»Ñ Ñтого Ð·ÐµÐ¼Ð»ÐµÐ²Ð»Ð°Ð´ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ Ð´Ð»Ñ [ALL_ESTATES]?
+ <usetemplate canceltext="Отмена" name="yesnocancelbuttons" notext="Ð”Ð»Ñ Ð²Ñех землевладений" yestext="Ð”Ð»Ñ Ñтого землевладениÑ"/>
+ </notification>
+ <notification label="Выбрать землевладение" name="EstateAllowedAgentRemove">
+ Удалить из ÑпиÑка допущенных только Ð´Ð»Ñ Ñтого Ð·ÐµÐ¼Ð»ÐµÐ²Ð»Ð°Ð´ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ Ð´Ð»Ñ [ALL_ESTATES]?
+ <usetemplate canceltext="Отмена" name="yesnocancelbuttons" notext="Ð”Ð»Ñ Ð²Ñех землевладений" yestext="Ð”Ð»Ñ Ñтого землевладениÑ"/>
+ </notification>
+ <notification label="Выбрать землевладение" name="EstateAllowedGroupAdd">
+ ВнеÑти в групповой ÑпиÑок допущенных только Ð´Ð»Ñ Ñтого Ð·ÐµÐ¼Ð»ÐµÐ²Ð»Ð°Ð´ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ Ð´Ð»Ñ [ALL_ESTATES]?
+ <usetemplate canceltext="Отмена" name="yesnocancelbuttons" notext="Ð”Ð»Ñ Ð²Ñех землевладений" yestext="Ð”Ð»Ñ Ñтого землевладениÑ"/>
+ </notification>
+ <notification label="Выбрать землевладение" name="EstateAllowedGroupRemove">
+ Удалить из группового ÑпиÑка допущенных только Ð´Ð»Ñ Ñтого Ð·ÐµÐ¼Ð»ÐµÐ²Ð»Ð°Ð´ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ Ð´Ð»Ñ [ALL_ESTATES]?
+ <usetemplate canceltext="Отмена" name="yesnocancelbuttons" notext="Ð”Ð»Ñ Ð²Ñех землевладений" yestext="Ð”Ð»Ñ Ñтого землевладениÑ"/>
+ </notification>
+ <notification label="Выбрать землевладение" name="EstateBannedAgentAdd">
+ Запретить доÑтуп только Ð´Ð»Ñ Ñтого Ð·ÐµÐ¼Ð»ÐµÐ²Ð»Ð°Ð´ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ Ð´Ð»Ñ [ALL_ESTATES]?
+ <usetemplate canceltext="Отмена" name="yesnocancelbuttons" notext="Ð”Ð»Ñ Ð²Ñех землевладений" yestext="Ð”Ð»Ñ Ñтого землевладениÑ"/>
+ </notification>
+ <notification label="Выбрать землевладение" name="EstateBannedAgentRemove">
+ Удалить Ñтого Ð¶Ð¸Ñ‚ÐµÐ»Ñ Ð¸Ð· ÑпиÑка запрета доÑтупа только Ð´Ð»Ñ Ñтого Ð·ÐµÐ¼Ð»ÐµÐ²Ð»Ð°Ð´ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ Ð´Ð»Ñ [ALL_ESTATES]?
+ <usetemplate canceltext="Отмена" name="yesnocancelbuttons" notext="Ð”Ð»Ñ Ð²Ñех землевладений" yestext="Ð”Ð»Ñ Ñтого землевладениÑ"/>
+ </notification>
+ <notification label="Выбрать землевладение" name="EstateManagerAdd">
+ Добавить менеджера только Ð´Ð»Ñ Ñтого Ð·ÐµÐ¼Ð»ÐµÐ²Ð»Ð°Ð´ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ Ð´Ð»Ñ [ALL_ESTATES]?
+ <usetemplate canceltext="Отмена" name="yesnocancelbuttons" notext="Ð”Ð»Ñ Ð²Ñех землевладений" yestext="Ð”Ð»Ñ Ñтого землевладениÑ"/>
+ </notification>
+ <notification label="Выбрать землевладение" name="EstateManagerRemove">
+ Удалить менеджера только Ð´Ð»Ñ Ñтого Ð·ÐµÐ¼Ð»ÐµÐ²Ð»Ð°Ð´ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ Ð´Ð»Ñ [ALL_ESTATES]?
+ <usetemplate canceltext="Отмена" name="yesnocancelbuttons" notext="Ð”Ð»Ñ Ð²Ñех землевладений" yestext="Ð”Ð»Ñ Ñтого землевладениÑ"/>
+ </notification>
+ <notification label="Подтвердить выбраÑывание" name="EstateKickUser">
+ ВыброÑить Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ [EVIL_USER] из Ñтого землевладениÑ?
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="EstateChangeCovenant">
+ Ð’Ñ‹ дейÑтвительно хотите изменить Ñоглашение по землевладению?
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="RegionEntryAccessBlocked">
+ Вам Ð½ÐµÐ»ÑŒÐ·Ñ Ð±Ñ‹Ñ‚ÑŒ в Ñтом регионе из-за вашего рейтинга зрелоÑти. Возможно, Ñто результат недоÑтатка информации, подтверждающей ваш возраÑÑ‚.
+
+УбедитеÑÑŒ, что у Ð²Ð°Ñ ÑƒÑтановлена поÑледнÑÑ Ð²ÐµÑ€ÑÐ¸Ñ ÐºÐ»Ð¸ÐµÐ½Ñ‚Ð°, и прочитайте в Базе знаний о доÑтупе к облаÑÑ‚Ñм Ñ Ñтим рейтингом зрелоÑти.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="RegionEntryAccessBlocked_KB">
+ Вам Ð½ÐµÐ»ÑŒÐ·Ñ Ð±Ñ‹Ñ‚ÑŒ в Ñтом регионе из-за вашего рейтинга зрелоÑти.
+
+Перейти в Базу знаний и ознакомитьÑÑ Ñ Ñ€ÐµÐ¹Ñ‚Ð¸Ð½Ð³Ð°Ð¼Ð¸ зрелоÑти?
+ <url name="url">
+ http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview
+ </url>
+ <usetemplate ignoretext="Я не могу войти в Ñтот регион из-за ограничений по рейтингу зрелоÑти" name="okcancelignore" notext="Закрыть" yestext="Перейти в Базу знаний"/>
+ </notification>
+ <notification name="RegionEntryAccessBlocked_Notify">
+ Вам Ð½ÐµÐ»ÑŒÐ·Ñ Ð±Ñ‹Ñ‚ÑŒ в Ñтом регионе из-за вашего рейтинга зрелоÑти.
+ </notification>
+ <notification name="RegionEntryAccessBlocked_Change">
+ Вам Ð½ÐµÐ»ÑŒÐ·Ñ Ð±Ñ‹Ñ‚ÑŒ в Ñтом регионе из-за вашей наÑтройки рейтинга зрелоÑти.
+
+Ð”Ð»Ñ Ð²Ñ…Ð¾Ð´Ð° в желаемый регион измените наÑтройку рейтинга зрелоÑти. ПоÑле Ñтого вам будет разрешено иÑкать и проÑматривать контент [REGIONMATURITY]. Ð”Ð»Ñ Ð¾Ñ‚Ð¼ÐµÐ½Ñ‹ изменений выберите команды «Я &gt; ÐаÑтройки &gt; Общие».
+ <form name="form">
+ <button name="OK" text="Изменить наÑтройку"/>
+ <button name="Cancel" text="Закрыть"/>
+ <ignore name="ignore" text="Ð’Ñ‹Ð±Ñ€Ð°Ð½Ð½Ð°Ñ Ð¼Ð½Ð¾Ð¹ наÑтройка рейтинга запрещает мне вход в регион"/>
+ </form>
+ </notification>
+ <notification name="PreferredMaturityChanged">
+ Теперь ваша наÑтройка рейтинга зрелоÑти: [RATING].
+ </notification>
+ <notification name="LandClaimAccessBlocked">
+ Ð’Ñ‹ не можете претендовать на Ñту землю из-за вашего рейтинга зрелоÑти. Возможно, Ñто результат недоÑтатка информации, подтверждающей ваш возраÑÑ‚.
+
+УбедитеÑÑŒ, что у Ð²Ð°Ñ ÑƒÑтановлена поÑледнÑÑ Ð²ÐµÑ€ÑÐ¸Ñ ÐºÐ»Ð¸ÐµÐ½Ñ‚Ð°, и прочитайте в Базе знаний о доÑтупе к облаÑÑ‚Ñм Ñ Ñтим рейтингом зрелоÑти.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="LandClaimAccessBlocked_KB">
+ Ð’Ñ‹ не можете претендовать на Ñту землю из-за вашего рейтинга зрелоÑти.
+
+Перейти в Базу знаний и ознакомитьÑÑ Ñ Ñ€ÐµÐ¹Ñ‚Ð¸Ð½Ð³Ð°Ð¼Ð¸ зрелоÑти?
+ <url name="url">
+ http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview
+ </url>
+ <usetemplate ignoretext="Я не могу претендовать на Ñту землю из-за ограничений по рейтингу зрелоÑти" name="okcancelignore" notext="Закрыть" yestext="Перейти в Базу знаний"/>
+ </notification>
+ <notification name="LandClaimAccessBlocked_Notify">
+ Ð’Ñ‹ не можете претендовать на Ñту землю из-за вашего рейтинга зрелоÑти.
+ </notification>
+ <notification name="LandClaimAccessBlocked_Change">
+ Ð’Ñ‹ не можете претендовать на Ñту землю из-за вашей наÑтройки рейтинга зрелоÑти.
+
+Ðажмите кнопку «Изменить наÑтройку», чтобы повыÑить Ñвой рейтинг зрелоÑти. ПоÑле Ñтого вам будет разрешено иÑкать и проÑматривать контент [REGIONMATURITY]. ЕÑли в будущем понадобитÑÑ Ð¾Ñ‚Ð¼ÐµÐ½Ð¸Ñ‚ÑŒ Ñто изменение, выберите команды «Я &gt; ÐаÑтройки &gt; Общие».
+ <usetemplate ignoretext="Ð’Ñ‹Ð±Ñ€Ð°Ð½Ð½Ð°Ñ Ð¼Ð½Ð¾Ð¹ наÑтройка рейтинга запрещает мне претендовать на землю" name="okcancelignore" notext="Закрыть" yestext="Изменить наÑтройку"/>
+ </notification>
+ <notification name="LandBuyAccessBlocked">
+ Ð’Ñ‹ не можете купить Ñту землю из-за вашего рейтинга зрелоÑти. Возможно, Ñто результат недоÑтатка информации, подтверждающей ваш возраÑÑ‚.
+
+УбедитеÑÑŒ, что у Ð²Ð°Ñ ÑƒÑтановлена поÑледнÑÑ Ð²ÐµÑ€ÑÐ¸Ñ ÐºÐ»Ð¸ÐµÐ½Ñ‚Ð°, и прочитайте в Базе знаний о доÑтупе к облаÑÑ‚Ñм Ñ Ñтим рейтингом зрелоÑти.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="LandBuyAccessBlocked_KB">
+ Ð’Ñ‹ не можете купить Ñту землю из-за вашего рейтинга зрелоÑти.
+
+Перейти в Базу знаний и ознакомитьÑÑ Ñ Ñ€ÐµÐ¹Ñ‚Ð¸Ð½Ð³Ð°Ð¼Ð¸ зрелоÑти?
+ <url name="url">
+ http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview
+ </url>
+ <usetemplate ignoretext="Я не могу купить Ñту землю из-за ограничений по рейтингу зрелоÑти" name="okcancelignore" notext="Закрыть" yestext="Перейти в Базу знаний"/>
+ </notification>
+ <notification name="LandBuyAccessBlocked_Notify">
+ Ð’Ñ‹ не можете купить Ñту землю из-за вашего рейтинга зрелоÑти.
+ </notification>
+ <notification name="LandBuyAccessBlocked_Change">
+ Ð’Ñ‹ не можете купить Ñту землю из-за выбранного вами рейтинга зрелоÑти.
+
+Ðажмите кнопку «Изменить наÑтройку», чтобы повыÑить Ñвой рейтинг зрелоÑти. ПоÑле Ñтого вам будет разрешено иÑкать и проÑматривать контент [REGIONMATURITY]. ЕÑли в будущем понадобитÑÑ Ð¾Ñ‚Ð¼ÐµÐ½Ð¸Ñ‚ÑŒ Ñто изменение, выберите команды «Я &gt; ÐаÑтройки &gt; Общие».
+ <usetemplate ignoretext="Ð’Ñ‹Ð±Ñ€Ð°Ð½Ð½Ð°Ñ Ð¼Ð½Ð¾Ð¹ наÑтройка рейтинга запрещает мне покупать землю" name="okcancelignore" notext="Закрыть" yestext="Изменить наÑтройку"/>
+ </notification>
+ <notification name="TooManyPrimsSelected">
+ Выбрано Ñлишком много примитивов. Выберите [MAX_PRIM_COUNT] или меньше примитивов и повторите попытку.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="ProblemImportingEstateCovenant">
+ Проблема при импорте ÑÐ¾Ð³Ð»Ð°ÑˆÐµÐ½Ð¸Ñ Ð¾ землевладении.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="ProblemAddingEstateManager">
+ Проблема при добавлении нового менеджера землевладениÑ. Возможно, в одном или неÑкольких землевладениÑÑ… ÑпиÑок менеджеров уже заполнен.
+ </notification>
+ <notification name="ProblemAddingEstateGeneric">
+ Проблема при добавлении в Ñтот ÑпиÑок землевладениÑ. Возможно, в одном или неÑкольких землевладениÑÑ… ÑпиÑок уже заполнен.
+ </notification>
+ <notification name="UnableToLoadNotecardAsset">
+ Ð¡ÐµÐ¹Ñ‡Ð°Ñ Ð½ÐµÐ²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ загрузить актив заметки.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="NotAllowedToViewNotecard">
+ ÐедоÑтаточно прав Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñмотра заметки, ÑвÑзанной Ñ Ñ‚Ñ€ÐµÐ±ÑƒÐµÐ¼Ñ‹Ð¼ идентификатором актива.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="MissingNotecardAssetID">
+ Идентификатор актива Ð´Ð»Ñ Ð·Ð°Ð¼ÐµÑ‚ÐºÐ¸ отÑутÑтвует в базе данных.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="PublishClassified">
+ Помните, что плата за рекламу не возвращаетÑÑ.
+
+Опубликовать Ñто рекламное объÑвление за L$[AMOUNT]?
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="SetClassifiedMature">
+ Содержит ли Ñта реклама умеренный контент?
+ <usetemplate canceltext="Отмена" name="yesnocancelbuttons" notext="Ðет" yestext="Да"/>
+ </notification>
+ <notification name="SetGroupMature">
+ Содержит ли Ñта группа умеренный контент?
+ <usetemplate canceltext="Отмена" name="yesnocancelbuttons" notext="Ðет" yestext="Да"/>
+ </notification>
+ <notification label="Подтвердить перезапуÑк" name="ConfirmRestart">
+ Ð’Ñ‹ дейÑтвительно хотите перезапуÑтить Ñтот регион через 2 минуты?
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification label="Сообщение Ð´Ð»Ñ Ð²Ñех в Ñтом регионе" name="MessageRegion">
+ Введите краткое объÑвление Ð´Ð»Ñ Ð²Ñех жителей в Ñтом регионе.
+ <form name="form">
+ <button name="OK" text="OK"/>
+ <button name="Cancel" text="Отмена"/>
+ </form>
+ </notification>
+ <notification label="Изменен рейтинг зрелоÑти региона" name="RegionMaturityChange">
+ Рейтинг зрелоÑти Ð´Ð»Ñ Ñтого региона будет обновлен.
+Отображение Ñтого Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð½Ð° карте может занÑть некоторое времÑ.
+
+Ð”Ð»Ñ Ð²Ñ…Ð¾Ð´Ð° в регионы Ð´Ð»Ñ Ð²Ð·Ñ€Ð¾Ñлых у Ð¶Ð¸Ñ‚ÐµÐ»Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ быть подтвержденный аккаунт: либо Ñ Ð¿Ð¾Ð´Ñ‚Ð²ÐµÑ€Ð¶Ð´ÐµÐ½Ð¸ÐµÐ¼ возраÑта, либо Ñ Ð¿Ð¾Ð´Ñ‚Ð²ÐµÑ€Ð¶Ð´ÐµÐ½Ð¸ÐµÐ¼ оплаты.
+ </notification>
+ <notification label="ÐеÑоответÑтвие верÑии голоÑа" name="VoiceVersionMismatch">
+ Ð”Ð°Ð½Ð½Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ [APP_NAME] неÑовмеÑтима Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸ÐµÐ¹ голоÑового чата в Ñтом регионе. Ð”Ð»Ñ Ð¿Ñ€Ð°Ð²Ð¸Ð»ÑŒÐ½Ð¾Ð¹ работы голоÑового чата необходимо обновить [APP_NAME].
+ </notification>
+ <notification label="ÐÐµÐ»ÑŒÐ·Ñ ÐºÑƒÐ¿Ð¸Ñ‚ÑŒ объекты" name="BuyObjectOneOwner">
+ ÐÐµÐ»ÑŒÐ·Ñ ÐºÑƒÐ¿Ð¸Ñ‚ÑŒ объекты одновременно у разных владельцев.
+Выберите один объект и повторите попытку.
+ </notification>
+ <notification label="ÐÐµÐ»ÑŒÐ·Ñ ÐºÑƒÐ¿Ð¸Ñ‚ÑŒ Ñодержимое" name="BuyContentsOneOnly">
+ ÐÐµÐ»ÑŒÐ·Ñ ÐºÑƒÐ¿Ð¸Ñ‚ÑŒ Ñодержимое неÑкольких объектов одновременно.
+Выберите один объект и повторите попытку.
+ </notification>
+ <notification label="ÐÐµÐ»ÑŒÐ·Ñ ÐºÑƒÐ¿Ð¸Ñ‚ÑŒ Ñодержимое" name="BuyContentsOneOwner">
+ ÐÐµÐ»ÑŒÐ·Ñ ÐºÑƒÐ¿Ð¸Ñ‚ÑŒ объекты одновременно у разных владельцев.
+Выберите один объект и повторите попытку.
+ </notification>
+ <notification name="BuyOriginal">
+ Купить оригинальный объект от [OWNER] за L$[PRICE]?
+Ð’Ñ‹ Ñтанете владельцем Ñтого объекта.
+Ð’Ñ‹ Ñможете:
+ изменÑть: [MODIFYPERM]
+ копировать: [COPYPERM]
+ перепродавать или отдавать объект: [RESELLPERM]
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="BuyOriginalNoOwner">
+ Купить оригинальный объект за L$[PRICE]?
+Ð’Ñ‹ Ñтанете владельцем Ñтого объекта.
+Ð’Ñ‹ Ñможете:
+ изменÑть: [MODIFYPERM]
+ копировать: [COPYPERM]
+ перепродавать или отдавать объект: [RESELLPERM]
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="BuyCopy">
+ Купить копию от [OWNER] за L$[PRICE]?
+Объект будет Ñкопирован в ваш инвентарь.
+Ð’Ñ‹ Ñможете:
+ изменÑть: [MODIFYPERM]
+ копировать: [COPYPERM]
+ перепродавать или отдавать объект: [RESELLPERM]
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="BuyCopyNoOwner">
+ Купить копию за L$[PRICE]?
+Объект будет Ñкопирован в ваш инвентарь.
+Ð’Ñ‹ Ñможете:
+ изменÑть: [MODIFYPERM]
+ копировать: [COPYPERM]
+ перепродавать или отдавать объект: [RESELLPERM]
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="BuyContents">
+ Купить Ñодержимое от [OWNER] за L$[PRICE]?
+Оно будет Ñкопировано в ваш инвентарь.
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="BuyContentsNoOwner">
+ Купить Ñодержимое за L$[PRICE]?
+Оно будет Ñкопировано в ваш инвентарь.
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmPurchase">
+ ДейÑтвие Ñтой транзакции:
+[ACTION]
+
+ДейÑтвительно Ñовершить Ñту покупку?
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmPurchasePassword">
+ ДейÑтвие Ñтой транзакции:
+[ACTION]
+
+ДейÑтвительно Ñовершить Ñту покупку?
+Введите Ñвой пароль и нажмите «OK».
+ <form name="form">
+ <button name="ConfirmPurchase" text="OK"/>
+ <button name="Cancel" text="Отмена"/>
+ </form>
+ </notification>
+ <notification name="SetPickLocation">
+ Примечание.
+Ð’Ñ‹ изменили меÑтоположение Ñтой подборки, но оÑтальные данные Ñохранили прежние значениÑ.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="MoveInventoryFromObject">
+ Вы выбрали «не копируемые» предметы.
+Они будут перемещены в ваш инвентарь, а не Ñкопированы.
+
+ПеремеÑтить предмет(Ñ‹)?
+ <usetemplate ignoretext="Предупреждать перед перемещением «не копируемых» предметов из объекта" name="okcancelignore" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="MoveInventoryFromScriptedObject">
+ Ð’Ñ‹ выбрали «не копируемые» предметы. Они будут перемещены в ваш инвентарь, а не Ñкопированы.
+Так как объект ÑвлÑетÑÑ Ñкриптовым, перемещение предметов в ваш инвентарий может вызвать ошибки Ñкрипта.
+
+ПеремеÑтить предмет(Ñ‹)?
+ <usetemplate ignoretext="Предупреждать перед перемещением «не копируемых» предметов, которые могут повредить Ñкриптовый объект" name="okcancelignore" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="ClickActionNotPayable">
+ Предупреждение. Задано дейÑтвие по щелчку «Заплатить за объект», но оно будет работать, только еÑли добавлен Ñкрипт Ñ Ñобытием money().
+ <form name="form">
+ <ignore name="ignore" text="УÑтановлено дейÑтвие «Заплатить за объект» при поÑтроении объекта без Ñкрипта money()"/>
+ </form>
+ </notification>
+ <notification name="OpenObjectCannotCopy">
+ Ð’ Ñтом объекте нет вещей, которые вам разрешено копировать.
+ </notification>
+ <notification name="WebLaunchAccountHistory">
+ Перейти на [http://secondlife.com/account/ информационную панель], чтобы увидеть иÑторию аккаунта?
+ <usetemplate ignoretext="ЗапуÑтить браузер Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñмотра иÑтории аккаунта" name="okcancelignore" notext="Отмена" yestext="Перейти на Ñтраницу"/>
+ </notification>
+ <notification name="ConfirmQuit">
+ Выйти из программы?
+ <usetemplate ignoretext="Подтверждать перед выходом" name="okcancelignore" notext="Ðе выходить" yestext="Выйти"/>
+ </notification>
+ <notification name="ConfirmRestoreToybox">
+ Это дейÑтвие приведет к воÑÑтановлению Ñтандартных кнопок и панелей инÑтрументов.
+
+Это дейÑтвие Ð½ÐµÐ»ÑŒÐ·Ñ Ð¾Ñ‚Ð¼ÐµÐ½Ð¸Ñ‚ÑŒ.
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmClearAllToybox">
+ Это дейÑтвие возвращает вÑе кнопки в инÑтрументарий, а панели инÑтрументов ÑтановÑÑ‚ÑÑ Ð¿ÑƒÑтыми.
+
+Это дейÑтвие Ð½ÐµÐ»ÑŒÐ·Ñ Ð¾Ñ‚Ð¼ÐµÐ½Ð¸Ñ‚ÑŒ.
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="DeleteItems">
+ [QUESTION]
+ <usetemplate ignoretext="Подтверждать перед удалением предметов" name="okcancelignore" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="HelpReportAbuseEmailLL">
+ Этот инÑтрумент Ñлужит Ð´Ð»Ñ ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð¾ нарушениÑÑ… [http://secondlife.com/corporate/tos.php ПользовательÑкого ÑоглашениÑ] и [http://secondlife.com/corporate/cs.php Ñтандартов ÑообщеÑтва].
+
+Ð’Ñе нарушениÑ, о которых поÑтупили такие уведомлениÑ, раÑÑледуютÑÑ Ð¸ уÑтранÑÑŽÑ‚ÑÑ.
+ </notification>
+ <notification name="HelpReportAbuseSelectCategory">
+ Выберите категорию Ð´Ð»Ñ Ñтого ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð¾ нарушении.
+Категории облегчают региÑтрацию и обработку уведомлений.
+ </notification>
+ <notification name="HelpReportAbuseAbuserNameEmpty">
+ Введите Ð¸Ð¼Ñ Ð½Ð°Ñ€ÑƒÑˆÐ¸Ñ‚ÐµÐ»Ñ.
+ТочноÑть ÑƒÐºÐ°Ð·Ð°Ð½Ð¸Ñ Ð¾Ð±Ð»ÐµÐ³Ñ‡Ð°ÐµÑ‚ региÑтрацию и обработку уведомлений.
+ </notification>
+ <notification name="HelpReportAbuseAbuserLocationEmpty">
+ Укажите меÑто, в котором произошло нарушение.
+ТочноÑть ÑƒÐºÐ°Ð·Ð°Ð½Ð¸Ñ Ð¾Ð±Ð»ÐµÐ³Ñ‡Ð°ÐµÑ‚ региÑтрацию и обработку уведомлений.
+ </notification>
+ <notification name="HelpReportAbuseSummaryEmpty">
+ Введите краткое опиÑание нарушениÑ.
+ТочноÑть опиÑÐ°Ð½Ð¸Ñ Ð¾Ð±Ð»ÐµÐ³Ñ‡Ð°ÐµÑ‚ региÑтрацию и обработку уведомлений.
+ </notification>
+ <notification name="HelpReportAbuseDetailsEmpty">
+ Введите подробное опиÑание нарушениÑ.
+Укажите как можно больше конкретных деталей, Ð²ÐºÐ»ÑŽÑ‡Ð°Ñ Ð¸Ð¼ÐµÐ½Ð° и подробноÑти проиÑшеÑтвиÑ, о котором вы Ñообщаете.
+ТочноÑть опиÑÐ°Ð½Ð¸Ñ Ð¾Ð±Ð»ÐµÐ³Ñ‡Ð°ÐµÑ‚ региÑтрацию и обработку уведомлений.
+ </notification>
+ <notification name="HelpReportAbuseContainsCopyright">
+ Уважаемый житель!
+
+Ð’Ñ‹ уведомлÑете о нарушении прав интеллектуальной ÑобÑтвенноÑти. УбедитеÑÑŒ, что ваше уведомление ÑоÑтавлено правильно:
+
+(1) ПроцеÑÑ Ñ€ÐµÐ³Ð¸Ñтрации нарушениÑ. Ð’Ñ‹ можете отправить уведомление о нарушении, еÑли Ñчитаете, что какой-либо житель злоупотреблÑет ÑиÑтемой разрешений [SECOND_LIFE], например, Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ CopyBot или аналогичных инÑтрументов копированиÑ, и нарушает таким образом права интеллектуальной ÑобÑтвенноÑти. Ðаш отдел борьбы Ñ Ð½Ð°Ñ€ÑƒÑˆÐµÐ½Ð¸Ñми раÑÑледует такие Ñлучаи и принимает ÑоответÑтвующие диÑциплинарные меры к нарушителÑм [http://secondlife.com/corporate/tos.php ПользовательÑкого ÑоглашениÑ] или [http://secondlife.com/corporate/cs.php Ñтандартов ÑообщеÑтва] [SECOND_LIFE] . Однако отдел борьбы Ñ Ð½Ð°Ñ€ÑƒÑˆÐµÐ½Ð¸Ñми не раÑÑматривает проÑьбы об удалении контента из мира [SECOND_LIFE] и не отвечает на них.
+
+(2) ПроцеÑÑ DMCA или ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ ÐºÐ¾Ð½Ñ‚ÐµÐ½Ñ‚Ð°. Ð”Ð»Ñ Ð·Ð°Ð¿Ñ€Ð¾Ñа об удалении контента из [SECOND_LIFE] Ñледует ОБЯЗÐТЕЛЬÐО предÑтавить дейÑтвительное уведомление о нарушении в ÑоответÑтвии Ñ Ñ‚Ñ€ÐµÐ±Ð¾Ð²Ð°Ð½Ð¸Ñми нашей [http://secondlife.com/corporate/dmca.php политики DMCA].
+
+ЕÑли вы вÑе же хотите продолжить процеÑÑ Ñ€ÐµÐ³Ð¸Ñтрации нарушениÑ, закройте Ñто окно, ÑоÑтавьте уведомление и отправьте его. При необходимоÑти выберите категорию «CopyBot или нарушение разрешений».
+
+С уважением,
+
+ÐºÐ¾Ð¼Ð¿Ð°Ð½Ð¸Ñ Linden Lab
+ </notification>
+ <notification name="FailedRequirementsCheck">
+ [FLOATER] не Ñодержит Ñледующих обÑзательных компонентов:
+[COMPONENTS]
+ </notification>
+ <notification label="Замена ÑущеÑтвующего приÑоединениÑ" name="ReplaceAttachment">
+ К Ñтой точке вашего тела уже приÑоединен другой объект.
+Заменить его выбранным объектом?
+ <form name="form">
+ <ignore name="ignore" text="Замена ÑущеÑтвующего приÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð²Ñ‹Ð±Ñ€Ð°Ð½Ð½Ñ‹Ð¼ предметом"/>
+ <button ignore="ЗаменÑть автоматичеÑки" name="Yes" text="OK"/>
+ <button ignore="Ðе заменÑть" name="No" text="Отмена"/>
+ </form>
+ </notification>
+ <notification label="Предупреждение о режиме «ЗанÑт»" name="BusyModePay">
+ У Ð²Ð°Ñ Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½ режим «ЗанÑт», поÑтому вы не получите никаких предметов, предлагаемых в обмен на Ñтот платеж.
+
+Хотите отключить режим «ЗанÑт» до Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ Ñтой транзакции?
+ <form name="form">
+ <ignore name="ignore" text="Я ÑобираюÑÑŒ заплатить за Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¸Ð»Ð¸ объект, когда включен режим «ЗанÑт»"/>
+ <button ignore="Ð’Ñегда отключать режим «ЗанÑт»" name="Yes" text="OK"/>
+ <button ignore="Ðе отключать режим «ЗанÑт»" name="No" text="Отмена"/>
+ </form>
+ </notification>
+ <notification name="ConfirmDeleteProtectedCategory">
+ Папка «[FOLDERNAME]» ÑвлÑетÑÑ ÑиÑтемной. Удаление ÑиÑтемных папок может привеÑти к неÑтабильноÑти. ДейÑтвительно удалить Ñту папку?
+ <usetemplate ignoretext="Подтверждать перед удалением ÑиÑтемной папки" name="okcancelignore" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmEmptyTrash">
+ Ð’Ñ‹ дейÑтвительно хотите необратимо удалить Ñодержимое корзины?
+ <usetemplate ignoretext="Подтверждать перед опорожнением корзины инвентарÑ" name="okcancelignore" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmClearBrowserCache">
+ Ð’Ñ‹ дейÑтвительно хотите удалить журнал Ñвоих перемещений, веб-Ñтраниц и поиÑка?
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmClearCache">
+ Ð’Ñ‹ дейÑтвительно хотите очиÑтить кÑш программы?
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmClearCookies">
+ Ð’Ñ‹ дейÑтвительно хотите удалить файлы cookie?
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="Да"/>
+ </notification>
+ <notification name="ConfirmClearMediaUrlList">
+ Ð’Ñ‹ дейÑтвительно хотите очиÑтить ÑпиÑок Ñохраненных URL-адреÑов?
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="Да"/>
+ </notification>
+ <notification name="ConfirmEmptyLostAndFound">
+ Ð’Ñ‹ дейÑтвительно хотите необратимо удалить Ñодержимое Бюро находок?
+ <usetemplate ignoretext="Подтверждать перед опорожнением Бюро находок инвентарÑ" name="okcancelignore" notext="Ðет" yestext="Да"/>
+ </notification>
+ <notification name="CopySLURL">
+ Данный SLurl был Ñкопирован в буфер обмена:
+ [SLURL]
+
+Создайте ÑÑылку на него на веб-Ñтранице Ð´Ð»Ñ Ð¾Ð±Ð»ÐµÐ³Ñ‡ÐµÐ½Ð¸Ñ Ð´Ð¾Ñтупа к Ñтому меÑту или ÑамоÑтоÑтельно вÑтавьте его в адреÑную Ñтроку любого браузера.
+ <form name="form">
+ <ignore name="ignore" text="SLurl Ñкопирован в буфер обмена"/>
+ </form>
+ </notification>
+ <notification name="WLSavePresetAlert">
+ Хотите заменить Ñохраненные наÑтройки?
+ <usetemplate name="okcancelbuttons" notext="Ðет" yestext="Да"/>
+ </notification>
+ <notification name="WLNoEditDefault">
+ Ð’Ñ‹ не можете редактировать или удалÑть наÑтройку по умолчанию.
+ </notification>
+ <notification name="WLMissingSky">
+ Этот файл Ñуточного цикла ÑÑылаетÑÑ Ð½Ð° отÑутÑтвующий файл неба: [SKY].
+ </notification>
+ <notification name="WLRegionApplyFail">
+ Ðе удалоÑÑŒ применить наÑтройки к региону. Попробуйте покинуть регион, а затем вернутьÑÑ Ð² него. Причина неполадки: [FAIL_REASON]
+ </notification>
+ <notification name="EnvCannotDeleteLastDayCycleKey">
+ Ðевозможно удалить поÑледний ключ в Ñтом Ñуточном цикле: пуÑтой Ñуточный цикл не разрешен. Следует изменить поÑледний оÑтавшийÑÑ ÐºÐ»ÑŽÑ‡, а не удалÑть его и Ñоздавать новый.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="DayCycleTooManyKeyframes">
+ Ð’ Ñтот Ñуточный цикл больше Ð½ÐµÐ»ÑŒÐ·Ñ Ð´Ð¾Ð±Ð°Ð²Ð»Ñть ключевые кадры. Суточные циклы облаÑти [SCOPE] могут Ñодержать не больше [MAX] ключевых кадров.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="EnvUpdateRate">
+ ÐаÑтройки окружающей Ñреды региона можно обновлÑть не чаще, чем раз в [WAIT] Ñекунд. Подождите Ñто Ð²Ñ€ÐµÐ¼Ñ Ð¸Ð»Ð¸ дольше и повторите попытку.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="PPSaveEffectAlert">
+ СущеÑтвует Ñффект поÑÑ‚-процеÑÑинга. Заменить его?
+ <usetemplate name="okcancelbuttons" notext="Ðет" yestext="Да"/>
+ </notification>
+ <notification name="ChatterBoxSessionStartError">
+ Ðевозможно начать новый ÑÐµÐ°Ð½Ñ Ñ‡Ð°Ñ‚Ð° Ñ [RECIPIENT].
+[REASON]
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="ChatterBoxSessionEventError">
+ [EVENT]
+[REASON]
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="ForceCloseChatterBoxSession">
+ Ваш ÑÐµÐ°Ð½Ñ Ñ‡Ð°Ñ‚Ð° Ñ [NAME] будет закрыт.
+[REASON]
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="Cannot_Purchase_an_Attachment">
+ Ð’Ñ‹ не можете купить объект, пока он приÑоединен.
+ </notification>
+ <notification label="О запроÑах на разрешение дебетованиÑ" name="DebitPermissionDetails">
+ ПринÑтие Ñтого запроÑа дает Ñкрипту поÑтоÑнное разрешение на ÑнÑтие Linden-долларов (L$) Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ Ñчета. Ð”Ð»Ñ Ð¾Ñ‚Ð·Ñ‹Ð²Ð° Ñтого Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ð²Ð»Ð°Ð´ÐµÐ»ÐµÑ† объекта должен удалить объект или ÑброÑить Ñкрипты в нем.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="AutoWearNewClothing">
+ Ð’Ñ‹ хотите автоматичеÑки надевать Ñоздаваемую вами одежду?
+ <usetemplate ignoretext="Ðадевать одежду, Ñоздаваемую при редактировании моей внешноÑти" name="okcancelignore" notext="Ðет" yestext="Да"/>
+ </notification>
+ <notification name="NotAgeVerified">
+ ДоÑтуп к контенту и облаÑÑ‚Ñм Ð´Ð»Ñ Ð²Ð·Ñ€Ð¾Ñлых в Second Life разрешен только Ñ 18 лет. ПоÑетите нашу Ñтраницу проверки возраÑта и подтвердите, что вам уже иÑполнилоÑÑŒ 18.
+Страница будет открыта в браузере.
+
+[_URL]
+ <url name="url">
+ https://secondlife.com/my/account/verification.php
+ </url>
+ <usetemplate ignoretext="Мой возраÑÑ‚ не подтвержден" name="okcancelignore" notext="Отмена" yestext="Перейти к проверке возраÑта"/>
+ </notification>
+ <notification name="Cannot enter parcel: no payment info on file">
+ Ð”Ð»Ñ Ð¿Ð¾ÑÐµÑ‰ÐµÐ½Ð¸Ñ Ñтой облаÑти необходимо зарегиÑтрировать платеж. Перейти на веб-Ñайт [SECOND_LIFE] и ввеÑти Ñту информацию?
+
+[_URL]
+ <url name="url">
+ https://secondlife.com/account/
+ </url>
+ <usetemplate ignoretext="У Ð¼ÐµÐ½Ñ Ð½Ðµ зарегиÑтрирована Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ платежах" name="okcancelignore" notext="Ðет" yestext="Да"/>
+ </notification>
+ <notification name="MissingString">
+ Строка [STRING_NAME] отÑутÑтвует в strings.xml
+ </notification>
+ <notification name="SystemMessageTip">
+ [MESSAGE]
+ </notification>
+ <notification name="IMSystemMessageTip">
+ [MESSAGE]
+ </notification>
+ <notification name="Cancelled">
+ Отменено
+ </notification>
+ <notification name="CancelledSit">
+ ÐžÑ‚Ð¼ÐµÐ½ÐµÐ½Ð½Ð°Ñ Ð¿Ð¾Ñадка
+ </notification>
+ <notification name="CancelledAttach">
+ Отмененное приÑоединение
+ </notification>
+ <notification name="ReplacedMissingWearable">
+ ОтÑутÑÑ‚Ð²ÑƒÑŽÑ‰Ð°Ñ Ð¾Ð´ÐµÐ¶Ð´Ð°/чаÑть тела заменена вещью по умолчанию.
+ </notification>
+ <notification name="GroupNotice">
+ Раздел: [SUBJECT], Ñообщение: [MESSAGE]
+ </notification>
+ <notification name="FriendOnline">
+ &lt;nolink&gt;[NAME]&lt;/nolink&gt; в Ñети
+ </notification>
+ <notification name="FriendOffline">
+ &lt;nolink&gt;[NAME]&lt;/nolink&gt; не в Ñети
+ </notification>
+ <notification name="AddSelfFriend">
+ Ð’Ñ‹ лучше вÑех, но Ð½ÐµÐ»ÑŒÐ·Ñ Ð´Ð¾Ð±Ð°Ð²Ð¸Ñ‚ÑŒ в Ð´Ñ€ÑƒÐ·ÑŒÑ ÑÐµÐ±Ñ Ñамого.
+ </notification>
+ <notification name="UploadingAuctionSnapshot">
+ Передача Ñнимков мира и веб-Ñайта...
+(Занимает около 5 мин.)
+ </notification>
+ <notification name="UploadPayment">
+ Вы заплатили L$[AMOUNT] за передачу.
+ </notification>
+ <notification name="UploadWebSnapshotDone">
+ Передача Ñнимка веб-Ñайта завершена.
+ </notification>
+ <notification name="UploadSnapshotDone">
+ Передача Ñнимка мира завершена.
+ </notification>
+ <notification name="TerrainDownloaded">
+ Загрузка Terrain.raw завершена
+ </notification>
+ <notification name="GestureMissing">
+ ЖеÑта [NAME] нет в базе данных.
+ </notification>
+ <notification name="UnableToLoadGesture">
+ Ðевозможно загрузить жеÑÑ‚ [NAME].
+ </notification>
+ <notification name="LandmarkMissing">
+ Закладки нет в базе данных.
+ </notification>
+ <notification name="UnableToLoadLandmark">
+ Ðевозможно загрузить закладку. Повторите попытку.
+ </notification>
+ <notification name="CapsKeyOn">
+ Включен режим CAPS LOCK.
+Пароль может быть введен неправильно.
+ </notification>
+ <notification name="NotecardMissing">
+ Заметки нет в базе данных.
+ </notification>
+ <notification name="NotecardNoPermissions">
+ У Ð²Ð°Ñ Ð½ÐµÑ‚ прав Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñмотра Ñтой заметки.
+ </notification>
+ <notification name="RezItemNoPermissions">
+ ÐедоÑтаточно разрешений Ð´Ð»Ñ Ð²Ñ‹ÐºÐ»Ð°Ð´Ñ‹Ð²Ð°Ð½Ð¸Ñ Ð¾Ð±ÑŠÐµÐºÑ‚Ð°.
+ </notification>
+ <notification name="IMAcrossParentEstates">
+ Ðевозможно отправить Ñообщение из одного родительÑкого Ð·ÐµÐ¼Ð»ÐµÐ²Ð»Ð°Ð´ÐµÐ½Ð¸Ñ Ð² другое.
+ </notification>
+ <notification name="TransferInventoryAcrossParentEstates">
+ Ðевозможно перенеÑти инвентарь из одного родительÑкого Ð·ÐµÐ¼Ð»ÐµÐ²Ð»Ð°Ð´ÐµÐ½Ð¸Ñ Ð² другое.
+ </notification>
+ <notification name="UnableToLoadNotecard">
+ Ðевозможно загрузить заметку.
+Повторите попытку.
+ </notification>
+ <notification name="ScriptMissing">
+ Скрипта нет в базе данных.
+ </notification>
+ <notification name="ScriptNoPermissions">
+ ÐедоÑтаточно разрешений Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñмотра Ñкрипта.
+ </notification>
+ <notification name="UnableToLoadScript">
+ Ðевозможно загрузить Ñкрипт. Повторите попытку.
+ </notification>
+ <notification name="IncompleteInventory">
+ Ð’Ñе предлагаемое вами Ñодержимое еще не доÑтупно в данном меÑте. Попробуйте вновь предложить Ñти вещи через минуту.
+ </notification>
+ <notification name="CannotModifyProtectedCategories">
+ Защищенные категории Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ð·Ð¼ÐµÐ½Ñть.
+ </notification>
+ <notification name="CannotRemoveProtectedCategories">
+ Защищенные категории Ð½ÐµÐ»ÑŒÐ·Ñ ÑƒÐ´Ð°Ð»Ñть.
+ </notification>
+ <notification name="UnableToBuyWhileDownloading">
+ Покупка во Ð²Ñ€ÐµÐ¼Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÐ¸ данных объекта невозможна.
+Повторите попытку.
+ </notification>
+ <notification name="UnableToLinkWhileDownloading">
+ Создание ÑвÑзи во Ð²Ñ€ÐµÐ¼Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÐ¸ данных объекта невозможно.
+Повторите попытку.
+ </notification>
+ <notification name="CannotBuyObjectsFromDifferentOwners">
+ Можно купить объекты за один раз только у одного владельца.
+Выберите один объект.
+ </notification>
+ <notification name="ObjectNotForSale">
+ Этот объект не Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð´Ð°Ð¶Ð¸.
+ </notification>
+ <notification name="EnteringGodMode">
+ Переход в режим творца, уровень [LEVEL]
+ </notification>
+ <notification name="LeavingGodMode">
+ Переход из режима творца, уровень [LEVEL]
+ </notification>
+ <notification name="CopyFailed">
+ У Ð²Ð°Ñ Ð½ÐµÑ‚ прав на копирование Ñтого предмета.
+ </notification>
+ <notification name="InventoryAccepted">
+ [NAME] получил(а) ваше предложение инвентарÑ.
+ </notification>
+ <notification name="InventoryDeclined">
+ [NAME] отклонил(а) ваше предложение инвентарÑ.
+ </notification>
+ <notification name="ObjectMessage">
+ [NAME]: [MESSAGE]
+ </notification>
+ <notification name="CallingCardAccepted">
+ Ваша визитка принÑта.
+ </notification>
+ <notification name="CallingCardDeclined">
+ Ваша визитка отклонена.
+ </notification>
+ <notification name="TeleportToLandmark">
+ Ð”Ð»Ñ Ñ‚ÐµÐ»ÐµÐ¿Ð¾Ñ€Ñ‚Ð°Ñ†Ð¸Ð¸ в другое меÑто, например «[NAME]», нажмите кнопку «МеÑта»,
+ затем в открывшемÑÑ Ð¾ÐºÐ½Ðµ выберите вкладку «Закладки». Щелкните любую
+ закладку, чтобы выбрать ее, а затем нажмите кнопку «ТелепортациÑ» внизу окна.
+ (Также можно дважды щелкнуть закладку или щелкнуть ее правой кнопкой мыши и
+ выбрать команду «ТелепортациÑ».)
+ </notification>
+ <notification name="TeleportToPerson">
+ Чтобы обратитьÑÑ Ðº жителю, например «[NAME]», нажмите кнопку «Люди», выберите Ð¶Ð¸Ñ‚ÐµÐ»Ñ Ð² поÑвившемÑÑ Ð¾ÐºÐ½Ðµ и нажмите кнопку
+ «IM» внизу окна.
+ (Также можно дважды щелкнуть Ð¸Ð¼Ñ Ð¶Ð¸Ñ‚ÐµÐ»Ñ Ð² ÑпиÑке или щелкнуть его правой кнопкой мыши и выбрать команду «IM».)
+ </notification>
+ <notification name="CantSelectLandFromMultipleRegions">
+ ÐÐµÐ»ÑŒÐ·Ñ Ð²Ñ‹Ð±Ñ€Ð°Ñ‚ÑŒ землю Ñ Ð¾Ð±ÐµÐ¸Ñ… Ñторон границы между Ñерверами.
+Попробуйте выбрать учаÑток поменьше.
+ </notification>
+ <notification name="SearchWordBanned">
+ Ðекоторые Ñлова иÑключены из вашего поиÑкового запроÑа из-за ограничений контента, уÑтановленных в Ñтандартах ÑообщеÑтва.
+ </notification>
+ <notification name="NoContentToSearch">
+ Выберите Ñ…Ð¾Ñ‚Ñ Ð±Ñ‹ один тип контента Ð´Ð»Ñ Ð¿Ð¾Ð¸Ñка («Общий», «Умеренный» или Â«Ð”Ð»Ñ Ð²Ð·Ñ€Ð¾Ñлых»).
+ </notification>
+ <notification name="SystemMessage">
+ [MESSAGE]
+ </notification>
+ <notification name="PaymentReceived">
+ [MESSAGE]
+ </notification>
+ <notification name="PaymentSent">
+ [MESSAGE]
+ </notification>
+ <notification name="PaymentFailure">
+ [MESSAGE]
+ </notification>
+ <notification name="EventNotification">
+ Уведомление о Ñобытии:
+
+[NAME]
+[DATE]
+ <form name="form">
+ <button name="Details" text="ПодробноÑти"/>
+ <button name="Cancel" text="Отмена"/>
+ </form>
+ </notification>
+ <notification name="TransferObjectsHighlighted">
+ Ð’Ñе объекты на Ñтом учаÑтке, которые будут переданы его покупателю, выделены цветом.
+
+* Передаваемые Ð´ÐµÑ€ÐµÐ²ÑŒÑ Ð¸ трава не выделÑÑŽÑ‚ÑÑ.
+ <form name="form">
+ <button name="Done" text="Готово"/>
+ </form>
+ </notification>
+ <notification name="DeactivatedGesturesTrigger">
+ Деактивированные жеÑты Ñ Ñ‚ÐµÐ¼ же триггером:
+[NAMES]
+ </notification>
+ <notification name="NoQuickTime">
+ Ð’ вашей ÑиÑтеме не уÑтановлено программное обеÑпечение Apple QuickTime.
+Ð”Ð»Ñ Ð¿Ñ€Ð¾Ñмотра потокового медиа на учаÑтках, которые поддерживают его, перейдите на Ñайт [http://www.apple.com/quicktime QuickTime] и уÑтановите QuickTime Player.
+ </notification>
+ <notification name="NoPlugin">
+ Ðе найден медиа-плагин Ð´Ð»Ñ Ð¾Ð±Ñ€Ð°Ð±Ð¾Ñ‚ÐºÐ¸ данных типа MIME «[MIME_TYPE]». Медиа Ñтого типа будет недоÑтупно.
+ </notification>
+ <notification name="MediaPluginFailed">
+ Ошибка Ñледующего медиа-плагина:
+ [PLUGIN]
+
+ПереуÑтановите плагин или обратитеÑÑŒ к его разработчику, еÑли ошибки возникают Ñнова.
+ <form name="form">
+ <ignore name="ignore" text="Ðе удалоÑÑŒ запуÑтить медиа-плагин"/>
+ </form>
+ </notification>
+ <notification name="OwnedObjectsReturned">
+ Принадлежащие вам объекты на выбранном земельном учаÑтке возвращены в ваш инвентарь.
+ </notification>
+ <notification name="OtherObjectsReturned">
+ Принадлежащие [NAME] объекты на выбранном земельном учаÑтке возвращены в его инвентарь.
+ </notification>
+ <notification name="OtherObjectsReturned2">
+ Принадлежащие жителю «[NAME]» объекты на выбранном земельном учаÑтке возвращены владельцу.
+ </notification>
+ <notification name="GroupObjectsReturned">
+ Переданные группе [GROUPNAME] объекты на выбранном земельном учаÑтке возвращены в инвентарь владельцев.
+ПереноÑимые переданные объекты возвращены прежним владельцам.
+ÐепереноÑимые объекты, переданные группе, удалены.
+ </notification>
+ <notification name="UnOwnedObjectsReturned">
+ Объекты на выбранном земельном учаÑтке, ÐЕ принадлежащие вам, возвращены владельцам.
+ </notification>
+ <notification name="ServerObjectMessage">
+ Сообщение от [NAME]:
+&lt;nolink&gt;[MSG]&lt;/nolink&gt;
+ </notification>
+ <notification name="NotSafe">
+ Ðа Ñтой земле разрешены повреждениÑ.
+ЗдеÑÑŒ вы можете поÑтрадать. ЕÑли вы умрете, вы будете телепортированы в ваше домашнее меÑтоположение.
+ </notification>
+ <notification name="NoFly">
+ Ð’ Ñтой облаÑти запрещены полеты.
+Ð’Ñ‹ не Ñможете здеÑÑŒ летать.
+ </notification>
+ <notification name="PushRestricted">
+ Ð’ Ñтой облаÑти запрещено толкатьÑÑ. ЗдеÑÑŒ вы не можете никого толкать, только еÑли не ÑвлÑетеÑÑŒ владельцем земли.
+ </notification>
+ <notification name="NoVoice">
+ Ð’ Ñтой облаÑти запрещен голоÑовой чат. ЗдеÑÑŒ вы не уÑлышите ничью речь.
+ </notification>
+ <notification name="NoBuild">
+ Ð’ Ñтой облаÑти запрещено ÑтроительÑтво. ЗдеÑÑŒ вы не Ñможете Ñтроить или выкладывать объекты.
+ </notification>
+ <notification name="SeeAvatars">
+ Ðа Ñтом учаÑтке аватары и текÑтовый чат Ñкрыты от другого учаÑтка. Жителей за пределами Ñтого учаÑтка не будет видно, а они не будут видеть ваÑ. Обычный текÑтовый чат на канале 0 также блокируетÑÑ.
+ </notification>
+ <notification name="ScriptsStopped">
+ ÐдминиÑтратор временно оÑтановил вÑе Ñкрипты в Ñтом регионе.
+ </notification>
+ <notification name="ScriptsNotRunning">
+ Ð’ Ñтом регионе не работают любые Ñкрипты.
+ </notification>
+ <notification name="NoOutsideScripts">
+ Ðа Ñтой земле запрещены внешние Ñкрипты.
+
+ЗдеÑÑŒ будут работать только Ñкрипты, принадлежащие владельцу земли.
+ </notification>
+ <notification name="ClaimPublicLand">
+ Ð’Ñ‹ можете претендовать на публичную землю только в регионе, в котором вы находитеÑÑŒ.
+ </notification>
+ <notification name="RegionTPAccessBlocked">
+ Вам Ð½ÐµÐ»ÑŒÐ·Ñ Ð±Ñ‹Ñ‚ÑŒ в Ñтом регионе из-за вашего рейтинга зрелоÑти. Подтвердите Ñвой возраÑÑ‚ и/или уÑтановите поÑледнюю верÑию клиента.
+
+Прочитайте в Базе знаний о доÑтупе к облаÑÑ‚Ñм Ñ Ñтим рейтингом зрелоÑти.
+ </notification>
+ <notification name="URBannedFromRegion">
+ Вы забанены в регионе.
+ </notification>
+ <notification name="NoTeenGridAccess">
+ Ваш аккаунт не может подключитьÑÑ Ðº Ñтому региону Ñетки Ð´Ð»Ñ Ð¿Ð¾Ð´Ñ€Ð¾Ñтков.
+ </notification>
+ <notification name="ImproperPaymentStatus">
+ У Ð²Ð°Ñ Ð½ÐµÑ‚ необходимого ÑтатуÑа оплаты Ð´Ð»Ñ Ð²Ñ…Ð¾Ð´Ð° в Ñтот регион.
+ </notification>
+ <notification name="MustGetAgeRgion">
+ Ð”Ð»Ñ Ð²Ñ…Ð¾Ð´Ð° в Ñтот регион необходимо подтверждение возраÑта.
+ </notification>
+ <notification name="MustGetAgeParcel">
+ Ð”Ð»Ñ Ð²Ñ…Ð¾Ð´Ð° на Ñтот учаÑток необходимо подтверждение возраÑта.
+ </notification>
+ <notification name="NoDestRegion">
+ Ðе найден регион назначениÑ.
+ </notification>
+ <notification name="NotAllowedInDest">
+ Вам не разрешен доÑтуп в пункт назначениÑ.
+ </notification>
+ <notification name="RegionParcelBan">
+ ÐÐµÐ»ÑŒÐ·Ñ Ð¿ÐµÑ€ÐµÑечь границу региона по пути на забаненный учаÑток. Выберите другой путь.
+ </notification>
+ <notification name="TelehubRedirect">
+ Вы перенаправлены на телехаб.
+ </notification>
+ <notification name="CouldntTPCloser">
+ Ðе удалоÑÑŒ телепортироватьÑÑ Ð±Ð»Ð¸Ð¶Ðµ к пункту назначениÑ.
+ </notification>
+ <notification name="TPCancelled">
+ Ð¢ÐµÐ»ÐµÐ¿Ð¾Ñ€Ñ‚Ð°Ñ†Ð¸Ñ Ð¾Ñ‚Ð¼ÐµÐ½ÐµÐ½Ð°.
+ </notification>
+ <notification name="FullRegionTryAgain">
+ Попытка входа в регион, который ÑÐµÐ¹Ñ‡Ð°Ñ Ð·Ð°Ð¿Ð¾Ð»Ð½ÐµÐ½.
+Повторите попытку через неÑколько минут.
+ </notification>
+ <notification name="GeneralFailure">
+ Общий Ñбой.
+ </notification>
+ <notification name="RoutedWrongRegion">
+ Ðаправление в неверный регион. Повторите попытку.
+ </notification>
+ <notification name="NoValidAgentID">
+ Ðет подходÑщего идентификатора агента.
+ </notification>
+ <notification name="NoValidSession">
+ Ðет подходÑщего идентификатора ÑеанÑа.
+ </notification>
+ <notification name="NoValidCircuit">
+ Ðет подходÑщего кода канала.
+ </notification>
+ <notification name="NoValidTimestamp">
+ Ðет подходÑщей метки времени.
+ </notification>
+ <notification name="NoPendingConnection">
+ Ðевозможно Ñоздать отложенное Ñоединение.
+ </notification>
+ <notification name="InternalUsherError">
+ ВнутреннÑÑ Ð¾ÑˆÐ¸Ð±ÐºÐ° при попытке подключить агента-провожатого.
+ </notification>
+ <notification name="NoGoodTPDestination">
+ Ðе удалоÑÑŒ найти подходÑщую точку Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ñ‚ÐµÐ»ÐµÐ¿Ð¾Ñ€Ñ‚Ð° в Ñтом регионе.
+ </notification>
+ <notification name="InternalErrorRegionResolver">
+ ВнутреннÑÑ Ð¾ÑˆÐ¸Ð±ÐºÐ° при попытке активировать раÑÐ¿Ð¾Ð·Ð½Ð°Ð²Ð°Ñ‚ÐµÐ»Ñ Ñ€ÐµÐ³Ð¸Ð¾Ð½Ð°.
+ </notification>
+ <notification name="NoValidLanding">
+ Ðе удалоÑÑŒ найти подходÑщую точку приземлениÑ.
+ </notification>
+ <notification name="NoValidParcel">
+ Ðе удалоÑÑŒ найти подходÑщий учаÑток.
+ </notification>
+ <notification name="ObjectGiveItem">
+ Объект &lt;nolink&gt;[OBJECTFROMNAME]&lt;/nolink&gt;, которым владеет [NAME_SLURL], дал вам Ñтот [OBJECTTYPE]:
+&lt;nolink&gt;[ITEM_SLURL]&lt;/nolink&gt;
+ <form name="form">
+ <button name="Keep" text="ОÑтавить"/>
+ <button name="Discard" text="Удалить"/>
+ <button name="Mute" text="Блокировать владельца"/>
+ </form>
+ </notification>
+ <notification name="OwnObjectGiveItem">
+ Ваш объект &lt;nolink&gt;[OBJECTFROMNAME]&lt;/nolink&gt; дал вам Ñтот [OBJECTTYPE]:
+&lt;nolink&gt;[ITEM_SLURL]&lt;/nolink&gt;
+ <form name="form">
+ <button name="Keep" text="ОÑтавить"/>
+ <button name="Discard" text="Удалить"/>
+ </form>
+ </notification>
+ <notification name="UserGiveItem">
+ [NAME_SLURL] дал(а) вам Ñтот [OBJECTTYPE]:
+[ITEM_SLURL]
+ <form name="form">
+ <button name="Show" text="Показать"/>
+ <button name="Discard" text="Удалить"/>
+ <button name="Mute" text="Заблокировать"/>
+ </form>
+ </notification>
+ <notification name="GodMessage">
+ [NAME]
+
+[MESSAGE]
+ </notification>
+ <notification name="JoinGroup">
+ [MESSAGE]
+ <form name="form">
+ <button name="Join" text="Ð’Ñтупить"/>
+ <button name="Decline" text="Отклонить"/>
+ <button name="Info" text="ИнформациÑ"/>
+ </form>
+ </notification>
+ <notification name="TeleportOffered">
+ [NAME_SLURL] предложил(а) телепортировать Ð²Ð°Ñ Ðº Ñебе:
+
+[MESSAGE] - [MATURITY_STR] &lt;icon&gt;[MATURITY_ICON]&lt;/icon&gt;
+ <form name="form">
+ <button name="Teleport" text="ТелепортациÑ"/>
+ <button name="Cancel" text="Отмена"/>
+ </form>
+ </notification>
+ <notification name="TeleportOfferSent">
+ Предложение телепортации отправлено [TO_NAME]
+ </notification>
+ <notification name="GotoURL">
+ [MESSAGE]
+[URL]
+ <form name="form">
+ <button name="Later" text="Позже"/>
+ <button name="GoNow..." text="Перейти ÑейчаÑ..."/>
+ </form>
+ </notification>
+ <notification name="OfferFriendship">
+ [NAME_SLURL] предлагает дружить.
+
+[MESSAGE]
+
+(По умолчанию вы будете видеть ÑÑ‚Ð°Ñ‚ÑƒÑ Ð´Ñ€ÑƒÐ³ друга.)
+ <form name="form">
+ <button name="Accept" text="ПринÑть"/>
+ <button name="Decline" text="Отклонить"/>
+ </form>
+ </notification>
+ <notification name="FriendshipOffered">
+ Вы предложили дружить пользователю [TO_NAME]
+ </notification>
+ <notification name="OfferFriendshipNoMessage">
+ [NAME_SLURL] предлагает дружить.
+
+(По умолчанию вы будете видеть ÑÑ‚Ð°Ñ‚ÑƒÑ Ð´Ñ€ÑƒÐ³ друга.)
+ <form name="form">
+ <button name="Accept" text="ПринÑть"/>
+ <button name="Decline" text="Отклонить"/>
+ </form>
+ </notification>
+ <notification name="FriendshipAccepted">
+ &lt;nolink&gt;[NAME]&lt;/nolink&gt; принÑл(а) ваше предложение дружить.
+ </notification>
+ <notification name="FriendshipDeclined">
+ &lt;nolink&gt;[NAME]&lt;/nolink&gt; отклонил(а) ваше предложение дружить.
+ </notification>
+ <notification name="FriendshipAcceptedByMe">
+ Предложение дружить принÑто.
+ </notification>
+ <notification name="FriendshipDeclinedByMe">
+ Предложение дружить отклонено.
+ </notification>
+ <notification name="OfferCallingCard">
+ [NAME] предлагает Ñвою визитку.
+При Ñтом в вашем инвентаре поÑвитÑÑ Ð·Ð°ÐºÐ»Ð°Ð´ÐºÐ° Ð´Ð»Ñ Ð±Ñ‹Ñтрой ÑвÑзи Ñ Ñтим жителем.
+ <form name="form">
+ <button name="Accept" text="ПринÑть"/>
+ <button name="Decline" text="Отклонить"/>
+ </form>
+ </notification>
+ <notification name="RegionRestartMinutes">
+ Этот регион будет перезапущен через [MINUTES] мин.
+ЕÑли вы оÑтанетеÑÑŒ в Ñтом регионе, вы выйдете из программы.
+ </notification>
+ <notification name="RegionRestartSeconds">
+ Этот регион будет перезапущен через [SECONDS] Ñек.
+ЕÑли вы оÑтанетеÑÑŒ в Ñтом регионе, вы выйдете из программы.
+ </notification>
+ <notification name="LoadWebPage">
+ Загрузить веб-Ñтраницу [URL]?
+
+[MESSAGE]
+
+Из объекта: &lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;, владелец: [NAME]?
+ <form name="form">
+ <button name="Gotopage" text="Перейти на Ñтраницу"/>
+ <button name="Cancel" text="Отмена"/>
+ </form>
+ </notification>
+ <notification name="FailedToFindWearableUnnamed">
+ Ðе удалоÑÑŒ найти [TYPE] в базе данных.
+ </notification>
+ <notification name="FailedToFindWearable">
+ Ðе удалоÑÑŒ найти [TYPE] Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ [DESC] в базе данных.
+ </notification>
+ <notification name="InvalidWearable">
+ Попытка надеть предмет, функцию которого программа не может раÑпознать. Обновите Ñвою верÑию [APP_NAME] Ð´Ð»Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñтим предметом.
+ </notification>
+ <notification name="ScriptQuestion">
+ Объект «&lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;», владелец которого – «[NAME]», желает:
+
+[QUESTIONS]
+Это правильно?
+ <form name="form">
+ <button name="Yes" text="Да"/>
+ <button name="No" text="Ðет"/>
+ <button name="Mute" text="Заблокировать"/>
+ </form>
+ </notification>
+ <notification name="ScriptQuestionCaution">
+ Объект «&lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;», владелец которого – «[NAME]», желает:
+
+[QUESTIONS]
+ЕÑли вы не доверÑете Ñтому объекту или его Ñоздателю, отклоните запроÑ.
+
+ПринÑть Ñтот запроÑ?
+ <form name="form">
+ <button name="Grant" text="ПринÑть"/>
+ <button name="Deny" text="Отклонить"/>
+ <button name="Details" text="ПодробноÑти..."/>
+ </form>
+ </notification>
+ <notification name="ScriptDialog">
+ [NAME] – «&lt;nolink&gt;[TITLE]&lt;/nolink&gt;»
+[MESSAGE]
+ <form name="form">
+ <button name="Mute" text="Блокировать"/>
+ <button name="Ignore" text="Игнорировать"/>
+ </form>
+ </notification>
+ <notification name="ScriptDialogGroup">
+ [GROUPNAME] – «&lt;nolink&gt;[TITLE]&lt;/nolink&gt;»
+[MESSAGE]
+ <form name="form">
+ <button name="Mute" text="Блокировать"/>
+ <button name="Ignore" text="Игнорировать"/>
+ </form>
+ </notification>
+ <notification name="BuyLindenDollarSuccess">
+ Благодарим за оплату!
+
+По окончании обработки Ð±Ð°Ð»Ð°Ð½Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ Ñчета в L$ будет обновлен. ЕÑли обработка займет более 20 мин, ваша Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ð¸Ñ Ð¼Ð¾Ð¶ÐµÑ‚ быть отменена. Ð’ Ñтом Ñлучае Ñумма платежа будет запиÑана на ваш Ð±Ð°Ð»Ð°Ð½Ñ Ð² долларах СШÐ.
+
+СоÑтоÑние ваших платежей можно проверить на Ñтранице «Журнал транзакций» на вашей [http://secondlife.com/account/ информационной панели].
+ </notification>
+ <notification name="FirstOverrideKeys">
+ Ваши клавиши Ð¿ÐµÑ€ÐµÐ¼ÐµÑ‰ÐµÐ½Ð¸Ñ Ñ‚ÐµÐ¿ÐµÑ€ÑŒ обрабатываютÑÑ Ð¾Ð±ÑŠÐµÐºÑ‚Ð¾Ð¼.
+Попробуйте иÑпользовать клавиши Ñо Ñтрелками или AWSD.
+Ð”Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð½ÐµÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ñ… объектов (например, оружиÑ) необходимо перейти в режим обзора мышью.
+Ð”Ð»Ñ Ñтого нажмите клавишу «M».
+ </notification>
+ <notification name="FirstSandbox">
+ Это облаÑть-пеÑочница, в которой жители учатÑÑ ÑтроительÑтву.
+
+ПоÑтроенные вами предметы удалÑÑŽÑ‚ÑÑ Ð¿Ñ€Ð¸ вашем выходе из пеÑочницы, поÑтому не забывайте щелкать их правой кнопкой мыши и выбирать команду «ВзÑть» Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ½Ð¾Ñа ваших творений в инвентарь.
+ </notification>
+ <notification name="MaxListSelectMessage">
+ Ð’ Ñтом ÑпиÑке можно выбрать не более [MAX_SELECT] пунктов.
+ </notification>
+ <notification name="VoiceInviteP2P">
+ [NAME] приглашает Ð²Ð°Ñ Ð² голоÑовой чат.
+Ðажмите кнопку «ПринÑть» Ð´Ð»Ñ Ð¿Ñ€Ð¸ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ðº чату или «Отклонить» Ð´Ð»Ñ Ð¾Ñ‚ÐºÐ°Ð·Ð° от приглашениÑ. Ðажмите «Заблокировать» Ð´Ð»Ñ Ð±Ð»Ð¾ÐºÐ¸Ñ€Ð¾Ð²ÐºÐ¸ Ñтого абонента.
+ <form name="form">
+ <button name="Accept" text="ПринÑть"/>
+ <button name="Decline" text="Отклонить"/>
+ <button name="Mute" text="Заблокировать"/>
+ </form>
+ </notification>
+ <notification name="AutoUnmuteByIM">
+ [NAME] отправил(а) вам мгновенное Ñообщение и был(а) автоматичеÑки разблокирован(а).
+ </notification>
+ <notification name="AutoUnmuteByMoney">
+ [NAME] получил(а) деньги и был(а) автоматичеÑки разблокирован(а).
+ </notification>
+ <notification name="AutoUnmuteByInventory">
+ [NAME] предложил(а) инвентарь и был(а) автоматичеÑки разблокирован(а).
+ </notification>
+ <notification name="VoiceInviteGroup">
+ [NAME] вÑтупил(а) в голоÑовой чат Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ð¾Ð¹ [GROUP].
+Ðажмите кнопку «ПринÑть» Ð´Ð»Ñ Ð¿Ñ€Ð¸ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ðº чату или «Отклонить» Ð´Ð»Ñ Ð¾Ñ‚ÐºÐ°Ð·Ð° от приглашениÑ. Ðажмите «Заблокировать» Ð´Ð»Ñ Ð±Ð»Ð¾ÐºÐ¸Ñ€Ð¾Ð²ÐºÐ¸ Ñтого абонента.
+ <form name="form">
+ <button name="Accept" text="ПринÑть"/>
+ <button name="Decline" text="Отклонить"/>
+ <button name="Mute" text="Заблокировать"/>
+ </form>
+ </notification>
+ <notification name="VoiceInviteAdHoc">
+ [NAME] вÑтупил(а) в голоÑовой чат Ñ ÐºÐ¾Ð½Ñ„ÐµÑ€ÐµÐ½Ñ†Ð¸ÐµÐ¹.
+Ðажмите кнопку «ПринÑть» Ð´Ð»Ñ Ð¿Ñ€Ð¸ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ðº чату или «Отклонить» Ð´Ð»Ñ Ð¾Ñ‚ÐºÐ°Ð·Ð° от приглашениÑ. Ðажмите «Заблокировать» Ð´Ð»Ñ Ð±Ð»Ð¾ÐºÐ¸Ñ€Ð¾Ð²ÐºÐ¸ Ñтого абонента.
+ <form name="form">
+ <button name="Accept" text="ПринÑть"/>
+ <button name="Decline" text="Отклонить"/>
+ <button name="Mute" text="Заблокировать"/>
+ </form>
+ </notification>
+ <notification name="InviteAdHoc">
+ [NAME] приглашает Ð²Ð°Ñ Ð² чат Ñ ÐºÐ¾Ð½Ñ„ÐµÑ€ÐµÐ½Ñ†Ð¸ÐµÐ¹.
+Ðажмите кнопку «ПринÑть» Ð´Ð»Ñ Ð¿Ñ€Ð¸ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ðº чату или «Отклонить» Ð´Ð»Ñ Ð¾Ñ‚ÐºÐ°Ð·Ð° от приглашениÑ. Ðажмите «Заблокировать» Ð´Ð»Ñ Ð±Ð»Ð¾ÐºÐ¸Ñ€Ð¾Ð²ÐºÐ¸ Ñтого абонента.
+ <form name="form">
+ <button name="Accept" text="ПринÑть"/>
+ <button name="Decline" text="Отклонить"/>
+ <button name="Mute" text="Заблокировать"/>
+ </form>
+ </notification>
+ <notification name="VoiceChannelFull">
+ Ð’Ñ‹ пытаетеÑÑŒ подключитьÑÑ Ðº голоÑовому чату [VOICE_CHANNEL_NAME], в котором уже доÑтигнута макÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ ÐµÐ¼ÐºÐ¾Ñть. Повторите попытку позже.
+ </notification>
+ <notification name="ProximalVoiceChannelFull">
+ ПриноÑим извинениÑ. Ð’ Ñтой облаÑти уже доÑтигнута макÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ ÐµÐ¼ÐºÐ¾Ñть голоÑовых чатов. Попробуйте иÑпользовать Ð³Ð¾Ð»Ð¾Ñ Ð² другой облаÑти.
+ </notification>
+ <notification name="VoiceChannelDisconnected">
+ Ð’Ñ‹ были отключены от [VOICE_CHANNEL_NAME]. Будет уÑтановлено подключение к локальному голоÑовому чату.
+ </notification>
+ <notification name="VoiceChannelDisconnectedP2P">
+ [VOICE_CHANNEL_NAME] завершил вызов. Будет уÑтановлено подключение к локальному голоÑовому чату.
+ </notification>
+ <notification name="P2PCallDeclined">
+ [VOICE_CHANNEL_NAME] отклонил ваш вызов. Будет уÑтановлено подключение к локальному голоÑовому чату.
+ </notification>
+ <notification name="P2PCallNoAnswer">
+ [VOICE_CHANNEL_NAME] не может принÑть ваш вызов. Будет уÑтановлено подключение к локальному голоÑовому чату.
+ </notification>
+ <notification name="VoiceChannelJoinFailed">
+ Ðе удалоÑÑŒ подключитьÑÑ Ðº [VOICE_CHANNEL_NAME], повторите попытку позже. Будет уÑтановлено подключение к локальному голоÑовому чату.
+ </notification>
+ <notification name="VoiceLoginRetry">
+ СоздаетÑÑ Ð³Ð¾Ð»Ð¾Ñовой канал Ð´Ð»Ñ Ð²Ð°Ñ. Создание займет не больше минуты.
+ </notification>
+ <notification name="VoiceEffectsExpired">
+ ИÑтек Ñрок дейÑÑ‚Ð²Ð¸Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ или неÑкольких типов Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð³Ð¾Ð»Ð¾Ñа, на которые вы подпиÑаны.
+[[URL] Щелкните здеÑÑŒ], чтобы обновить подпиÑку.
+ </notification>
+ <notification name="VoiceEffectsExpiredInUse">
+ ИÑтек Ñрок дейÑÑ‚Ð²Ð¸Ñ Ð°ÐºÑ‚Ð¸Ð²Ð½Ð¾Ð³Ð¾ типа Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð³Ð¾Ð»Ð¾Ñа, применены наÑтройки вашего обычного голоÑа.
+[[URL] Щелкните здеÑÑŒ], чтобы обновить подпиÑку.
+ </notification>
+ <notification name="VoiceEffectsWillExpire">
+ Срок дейÑÑ‚Ð²Ð¸Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ или неÑкольких ваших типов Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð³Ð¾Ð»Ð¾Ñа иÑтекает через [INTERVAL] дней или раньше.
+[[URL] Щелкните здеÑÑŒ], чтобы обновить подпиÑку.
+ </notification>
+ <notification name="VoiceEffectsNew">
+ ПоÑвилиÑÑŒ новые типы Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð³Ð¾Ð»Ð¾Ñа!
+ </notification>
+ <notification name="Cannot enter parcel: not a group member">
+ Эту облаÑть могут поÑещать только учаÑтники определенной группы.
+ </notification>
+ <notification name="Cannot enter parcel: banned">
+ ÐÐµÐ»ÑŒÐ·Ñ Ð²Ð¾Ð¹Ñ‚Ð¸ на учаÑток, вы забанены.
+ </notification>
+ <notification name="Cannot enter parcel: not on access list">
+ ÐÐµÐ»ÑŒÐ·Ñ Ð²Ð¾Ð¹Ñ‚Ð¸ на учаÑток, Ð²Ð°Ñ Ð½ÐµÑ‚ в ÑпиÑке доÑтупа.
+ </notification>
+ <notification name="VoiceNotAllowed">
+ У Ð²Ð°Ñ Ð½ÐµÑ‚ Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ð½Ð° подключение к голоÑовому чату Ð´Ð»Ñ [VOICE_CHANNEL_NAME].
+ </notification>
+ <notification name="VoiceCallGenericError">
+ Ошибка при попытке Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ðº голоÑовому чату Ð´Ð»Ñ [VOICE_CHANNEL_NAME]. Повторите попытку позже.
+ </notification>
+ <notification name="UnsupportedCommandSLURL">
+ Щелчок на неподдерживаемом SLurl.
+ </notification>
+ <notification name="BlockedSLURL">
+ SLurl получен от ненадежного браузера и заблокирован по ÑоображениÑм безопаÑноÑти.
+ </notification>
+ <notification name="ThrottledSLURL">
+ ÐеÑколько SLurl получены от ненадежного браузера за короткое времÑ.
+Ð”Ð»Ñ Ð±ÐµÐ·Ð¾Ð¿Ð°ÑноÑти они будут заблокированы на неÑколько Ñекунд.
+ </notification>
+ <notification name="IMToast">
+ [MESSAGE]
+ <form name="form">
+ <button name="respondbutton" text="Ответить"/>
+ </form>
+ </notification>
+ <notification name="ConfirmCloseAll">
+ Ð’Ñ‹ дейÑтвительно хотите закрыть вÑе окна IM?
+ <usetemplate ignoretext="Подтверждать перед закрытием вÑех окон IM" name="okcancelignore" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="AttachmentSaved">
+ ПриÑоединение Ñохранено.
+ </notification>
+ <notification name="UnableToFindHelpTopic">
+ Ðевозможно найти раздел Ñправки Ð´Ð»Ñ Ñтого Ñлемента.
+ </notification>
+ <notification name="ObjectMediaFailure">
+ Ошибка Ñервера: обновление или ошибка медиа.
+«[ERROR]»
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="TextChatIsMutedByModerator">
+ Ваш текÑтовый чат заглушен модератором.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="VoiceIsMutedByModerator">
+ Ваш Ð³Ð¾Ð»Ð¾Ñ Ð·Ð°Ð³Ð»ÑƒÑˆÐµÐ½ модератором.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="UploadCostConfirmation">
+ Эта передача будет Ñтоить L$[PRICE]. Продолжить передачу?
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="Передать"/>
+ </notification>
+ <notification name="ConfirmClearTeleportHistory">
+ Ð’Ñ‹ дейÑтвительно хотите удалить Ñвой журнал телепортаций?
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="BottomTrayButtonCanNotBeShown">
+ Ð’Ñ‹Ð±Ñ€Ð°Ð½Ð½Ð°Ñ ÐºÐ½Ð¾Ð¿ÐºÐ° не может быть показана ÑейчаÑ.
+Кнопка поÑвитÑÑ, когда Ð´Ð»Ñ Ð½ÐµÐµ будет доÑтаточно меÑта.
+ </notification>
+ <notification name="ShareNotification">
+ Выберите жителей, чтобы поделитьÑÑ Ñ Ð½Ð¸Ð¼Ð¸.
+ </notification>
+ <notification name="MeshUploadError">
+ Ðе удалоÑÑŒ передать [LABEL]: [MESSAGE] [IDENTIFIER]
+
+ПодробноÑти Ñм. в файле журнала.
+ </notification>
+ <notification name="MeshUploadPermError">
+ Ошибка при запроÑе разрешений на передачу меша.
+ </notification>
+ <notification name="RegionCapabilityRequestError">
+ Ðе удаетÑÑ Ð¿Ð¾Ð»ÑƒÑ‡Ð¸Ñ‚ÑŒ возможноÑть региона &apos;[CAPABILITY]&apos;.
+ </notification>
+ <notification name="ShareItemsConfirmation">
+ Ð’Ñ‹ дейÑтвительно хотите поделитьÑÑ Ð¿Ñ€ÐµÐ´Ð¼ÐµÑ‚Ð°Ð¼Ð¸:
+
+&lt;nolink&gt;[ITEMS]&lt;/nolink&gt;
+
+Со Ñледующими жителÑми:
+
+[RESIDENTS]
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="ItemsShared">
+ Предметы уÑпешно розданы.
+ </notification>
+ <notification name="DeedToGroupFail">
+ Передача группе не удалаÑÑŒ.
+ </notification>
+ <notification name="ReleaseLandThrottled">
+ Ð¡ÐµÐ¹Ñ‡Ð°Ñ Ð½ÐµÐ»ÑŒÐ·Ñ Ð¾Ñ‚ÐºÐ°Ð·Ð°Ñ‚ÑŒÑÑ Ð¾Ñ‚ учаÑтка «[PARCEL_NAME]».
+ </notification>
+ <notification name="ReleasedLandWithReclaim">
+ Земельный учаÑток «[PARCEL_NAME]» площадью [AREA] м² оÑвобожден.
+
+У Ð²Ð°Ñ ÐµÑть [RECLAIM_PERIOD] ч, чтобы вернуть его за L$0. ПоÑле Ñтого учаÑток будет выÑтавлен на Ñвободную продажу.
+ </notification>
+ <notification name="ReleasedLandNoReclaim">
+ Земельный учаÑток «[PARCEL_NAME]» площадью [AREA] м² оÑвобожден.
+
+Теперь его может купить кто угодно.
+ </notification>
+ <notification name="AvatarRezNotification">
+ ( [EXISTENCE] Ñек. жизни )
+Ðватар «[NAME]» Ñтал виден через [TIME] Ñек.
+ </notification>
+ <notification name="AvatarRezSelfBakedDoneNotification">
+ ( [EXISTENCE] Ñек. жизни )
+Ð’Ñ‹ закончили приготовление Ñвоего коÑтюма через [TIME] Ñек.
+ </notification>
+ <notification name="AvatarRezSelfBakedUpdateNotification">
+ ( [EXISTENCE] Ñек. жизни )
+Ð’Ñ‹ отправили обновление Ñвоей внешноÑти через [TIME] Ñек.
+[STATUS]
+ </notification>
+ <notification name="AvatarRezCloudNotification">
+ ( [EXISTENCE] Ñек. жизни )
+Ðватар «[NAME]» Ñтал облаком.
+ </notification>
+ <notification name="AvatarRezArrivedNotification">
+ ( [EXISTENCE] Ñек. жизни )
+Ðватар «[NAME]» поÑвилÑÑ.
+ </notification>
+ <notification name="AvatarRezLeftCloudNotification">
+ ( [EXISTENCE] Ñек. жизни )
+Ðватар «[NAME]» Ñтал облаком через [TIME] Ñек.
+ </notification>
+ <notification name="AvatarRezEnteredAppearanceNotification">
+ ( [EXISTENCE] Ñек. жизни )
+Ðватар «[NAME]» перешел в режим внешноÑти.
+ </notification>
+ <notification name="AvatarRezLeftAppearanceNotification">
+ ( [EXISTENCE] Ñек. жизни )
+Ðватар «[NAME]» вышел из режима внешноÑти.
+ </notification>
+ <notification name="NoConnect">
+ Возникли проблемы ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸ иÑпользовании [PROTOCOL] [HOSTID].
+Проверьте наÑтройки Ñети и брандмауÑра.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="NoVoiceConnect">
+ Возникли проблемы ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ñ Ð³Ð¾Ð»Ð¾Ñовым Ñервером:
+
+[HOSTID]
+
+ГолоÑÐ¾Ð²Ð°Ñ ÑвÑзь будет недоÑтупна.
+Проверьте наÑтройки Ñети и брандмауÑра.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="AvatarRezLeftNotification">
+ ( [EXISTENCE] Ñек. жизни )
+Ðватар «[NAME]» полноÑтью загружен.
+ </notification>
+ <notification name="AvatarRezSelfBakedTextureUploadNotification">
+ ( [EXISTENCE] Ñек. жизни )
+Ð’Ñ‹ передали готовую текÑтуру [RESOLUTION] Ð´Ð»Ñ Â«[BODYREGION]» через [TIME] Ñек.
+ </notification>
+ <notification name="AvatarRezSelfBakedTextureUpdateNotification">
+ ( [EXISTENCE] Ñек. жизни )
+Ð’Ñ‹ локально обновили готовую текÑтуру [RESOLUTION] Ð´Ð»Ñ Â«[BODYREGION]» через [TIME] Ñек.
+ </notification>
+ <notification name="ConfirmLeaveCall">
+ ДейÑтвительно покинуть Ñтот разговор?
+ <usetemplate ignoretext="Подтверждать перед выходом из разговора" name="okcancelignore" notext="Ðет" yestext="Да"/>
+ </notification>
+ <notification name="ConfirmMuteAll">
+ Ð’Ñ‹ решили заглушить вÑех учаÑтников группового разговора.
+Ð’ результате будут заглушены также вÑе жители, которые приÑоединилиÑÑŒ к разговору
+позже, даже поÑле того, как вы покинули разговор.
+
+Заглушить вÑех?
+ <usetemplate ignoretext="Подтверждать перед заглушением вÑех учаÑтников группового разговора" name="okcancelignore" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification label="Чат" name="HintChat">
+ Чтобы приÑоединитьÑÑ Ðº чату, введите Ñлова в поле чата ниже.
+ </notification>
+ <notification label="Ð’Ñтать" name="HintSit">
+ Чтобы вÑтать на ноги и покинуть ÑидÑчее положение, нажмите кнопку «ВÑтать».
+ </notification>
+ <notification label="Говорить" name="HintSpeak">
+ Ðажмите кнопку «Говорить», чтобы включить или выключить микрофон.
+
+Щелкните направленную вверх Ñтрелку, чтобы открыть панель ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð³Ð¾Ð»Ð¾Ñом.
+
+При Ñкрытии кнопки «Говорить» голоÑÐ¾Ð²Ð°Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ð¾Ñ‚ÐºÐ»ÑŽÑ‡Ð°ÐµÑ‚ÑÑ.
+ </notification>
+ <notification label="ИÑÑледование мира" name="HintDestinationGuide">
+ Путеводитель по пунктам Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ñодержит тыÑÑчи новых меÑÑ‚, в которых вы можете побывать. Выберите меÑто и нажмите кнопку «ТелепортациÑ», чтобы начать иÑÑледование.
+ </notification>
+ <notification label="Ð‘Ð¾ÐºÐ¾Ð²Ð°Ñ Ð¿Ð°Ð½ÐµÐ»ÑŒ" name="HintSidePanel">
+ БыÑтрый доÑтуп к вашему инвентарю, коÑтюмам, профилю и многому другому открываетÑÑ Ð½Ð° боковой панели.
+ </notification>
+ <notification label="Перемещение" name="HintMove">
+ Чтобы пойти или побежать, откройте панель Ð¿ÐµÑ€ÐµÐ¼ÐµÑ‰ÐµÐ½Ð¸Ñ Ð¸ иÑпользуйте кнопки Ñо Ñтрелками. Также можно нажимать клавиши Ñо Ñтрелками на клавиатуре.
+ </notification>
+ <notification label="" name="HintMoveClick">
+ 1. Щелкните Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÑ…Ð¾Ð´Ð°
+Щелкните какую-нибудь точку на земле, чтобы перейти в Ñто меÑто.
+
+2. Щелкните и перетащите Ð´Ð»Ñ Ð¿Ð¾Ð²Ð¾Ñ€Ð¾Ñ‚Ð° Ð¿Ð¾Ð»Ñ Ð·Ñ€ÐµÐ½Ð¸Ñ
+Щелкните любую точку в мире и перетащите ее мышью, чтобы повернуть поле зрениÑ.
+ </notification>
+ <notification label="Экранное имÑ" name="HintDisplayName">
+ Задайте здеÑÑŒ Ñвое Ñкранное имÑ. Это Ð¸Ð¼Ñ Ð¼Ð¾Ð¶Ð½Ð¾ изменÑть, в отличие от вашего уникального имени пользователÑ. Отображение Ð´Ð»Ñ Ð²Ð°Ñ Ð¸Ð¼ÐµÐ½ других людей можно изменить в ваших наÑтройках.
+ </notification>
+ <notification label="Камера" name="HintView">
+ Ð”Ð»Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð²Ð¸Ð´Ð° из камеры иÑпользуйте инÑтрументы «Вращение» и «Сдвиг». При нажатии клавиши Esc или переходе вид из камеры возвращаетÑÑ Ðº иÑходному ÑоÑтоÑнию.
+ </notification>
+ <notification label="Инвентарь" name="HintInventory">
+ Ð’ вашем инвентаре можно иÑкать разнообразные вещи. Самые новые вещи предÑтавлены на вкладке «Ðедавние».
+ </notification>
+ <notification label="Вы получили Linden-доллары!" name="HintLindenDollar">
+ Вот ваш текущий Ð±Ð°Ð»Ð°Ð½Ñ Ð² L$. Чтобы купить еще Linden-долларов, щелкните «Купить L$».
+ </notification>
+ <notification name="LowMemory">
+ ÐедоÑтаточный размер пула памÑти. Ðекоторые функции Second Life отключены во избежание ÑÐ±Ð¾Ñ Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ. Закройте другие приложениÑ. ЕÑли неполадка не иÑчезнет, перезапуÑтите SL.
+ </notification>
+ <notification name="ForceQuitDueToLowMemory">
+ Через 30 Ñекунд Second Life завершит работу: нехватка памÑти.
+ </notification>
+ <notification name="PopupAttempt">
+ Ð’Ñплывающее окно Ð½ÐµÐ»ÑŒÐ·Ñ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚ÑŒ.
+ <form name="form">
+ <ignore name="ignore" text="Разрешить вÑе вÑплывающие окна"/>
+ <button name="open" text="Открыть вÑплывающее окно"/>
+ </form>
+ </notification>
+ <notification name="SOCKS_NOT_PERMITTED">
+ ПрокÑи SOCKS 5 &quot;[HOST]:[PORT]&quot; отклонил попытку подключениÑ; не разрешено набором правил.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="SOCKS_CONNECT_ERROR">
+ ПрокÑи SOCKS 5 &quot;[HOST]:[PORT]&quot; отклонил попытку подключениÑ; не удалоÑÑŒ открыть канал TCP.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="SOCKS_NOT_ACCEPTABLE">
+ ПрокÑи SOCKS 5 &quot;[HOST]:[PORT]&quot; отклонил выбранную ÑиÑтему проверки подлинноÑти.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="SOCKS_AUTH_FAIL">
+ ПрокÑи SOCKS 5 &quot;[HOST]:[PORT]&quot; Ñообщает, что ваши учетные данные неверны.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="SOCKS_UDP_FWD_NOT_GRANTED">
+ ПрокÑи SOCKS 5 &quot;[HOST]:[PORT]&quot; отклонил Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð¾Ð±ÑŠÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ UDP.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="SOCKS_HOST_CONNECT_FAILED">
+ Ðе удалоÑÑŒ подключитьÑÑ Ðº прокÑи-Ñерверу SOCKS 5 &quot;[HOST]:[PORT]&quot;.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="SOCKS_UNKNOWN_STATUS">
+ ÐеизвеÑÑ‚Ð½Ð°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ° прокÑи Ñ Ñервером &quot;[HOST]:[PORT]&quot;.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="SOCKS_INVALID_HOST">
+ Ðеверный Ð°Ð´Ñ€ÐµÑ Ð¿Ñ€Ð¾ÐºÑи SOCKS или порт &quot;[HOST]:[PORT]&quot;.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="SOCKS_BAD_CREDS">
+ Ðеверное Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¸Ð»Ð¸ пароль SOCKS 5.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="PROXY_INVALID_HTTP_HOST">
+ Ðеверный Ð°Ð´Ñ€ÐµÑ Ð¿Ñ€Ð¾ÐºÑи HTTP или порт &quot;[HOST]:[PORT]&quot;.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="PROXY_INVALID_SOCKS_HOST">
+ Ðеверный Ð°Ð´Ñ€ÐµÑ Ð¿Ñ€Ð¾ÐºÑи SOCKS или порт &quot;[HOST]:[PORT]&quot;.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="ChangeProxySettings">
+ ÐаÑтройки прокÑи начнут дейÑтвовать поÑле перезапуÑка [APP_NAME].
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="AuthRequest">
+ Сайт по адреÑу «&lt;nolink&gt;[HOST_NAME]&lt;/nolink&gt;» в царÑтве «in realm &apos;[REALM]» требует имени Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¸ паролÑ.
+ <form name="form">
+ <input name="username" text="Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ"/>
+ <input name="password" text="Пароль"/>
+ <button name="ok" text="ОтоÑлать"/>
+ <button name="cancel" text="Отмена"/>
+ </form>
+ </notification>
+ <notification label="" name="NoClassifieds">
+ Создание и редактирование рекламы доÑтупно только в раÑширенном режиме. Выйти из программы и Ñменить режим? Меню Ñмены режима находитÑÑ Ð½Ð° Ñкране входа.
+ <usetemplate name="okcancelbuttons" notext="Ðе выходить" yestext="Выйти"/>
+ </notification>
+ <notification label="" name="NoGroupInfo">
+ Создание и редактирование групп доÑтупно только в раÑширенном режиме. Выйти из программы и Ñменить режим? Меню Ñмены режима находитÑÑ Ð½Ð° Ñкране входа.
+ <usetemplate name="okcancelbuttons" notext="Ðе выходить" yestext="Выйти"/>
+ </notification>
+ <notification label="" name="NoPlaceInfo">
+ ПроÑмотр Ð¿Ñ€Ð¾Ñ„Ð¸Ð»Ñ Ð¼ÐµÑта доÑтупен только в раÑширенном режиме. Выйти из программы и Ñменить режим? Меню Ñмены режима находитÑÑ Ð½Ð° Ñкране входа.
+ <usetemplate name="okcancelbuttons" notext="Ðе выходить" yestext="Выход"/>
+ </notification>
+ <notification label="" name="NoPicks">
+ Создание и редактирование подборки доÑтупно только в раÑширенном режиме. Выйти из программы и Ñменить режим? Меню Ñмены режима находитÑÑ Ð½Ð° Ñкране входа.
+ <usetemplate name="okcancelbuttons" notext="Ðе выходить" yestext="Выйти"/>
+ </notification>
+ <notification label="" name="NoWorldMap">
+ ПроÑмотр карты мира доÑтупен только в раÑширенном режиме. Выйти из программы и Ñменить режим? Меню Ñмены режима находитÑÑ Ð½Ð° Ñкране входа.
+ <usetemplate name="okcancelbuttons" notext="Ðе выходить" yestext="Выйти"/>
+ </notification>
+ <notification label="" name="NoVoiceCall">
+ ГолоÑовые вызовы доÑтупны только в раÑширенном режиме. Выйти из программы и Ñменить режим?
+ <usetemplate name="okcancelbuttons" notext="Ðе выходить" yestext="Выйти"/>
+ </notification>
+ <notification label="" name="NoAvatarShare">
+ Общее пользование доÑтупно только в раÑширенном режиме. Выйти из программы и Ñменить режим?
+ <usetemplate name="okcancelbuttons" notext="Ðе выходить" yestext="Выйти"/>
+ </notification>
+ <notification label="" name="NoAvatarPay">
+ Платежи другим жителÑм доÑтупны только в раÑширенном режиме. Выйти из программы и Ñменить режим?
+ <usetemplate name="okcancelbuttons" notext="Ðе выходить" yestext="Выйти"/>
+ </notification>
+ <notification label="" name="NoInventory">
+ ПроÑмотр Ð¸Ð½Ð²ÐµÐ½Ñ‚Ð°Ñ€Ñ Ð´Ð¾Ñтупен только в раÑширенном режиме. Выйти из программы и Ñменить режим?
+ <usetemplate name="okcancelbuttons" notext="Ðе выходить" yestext="Выход"/>
+ </notification>
+ <notification label="" name="NoAppearance">
+ Редактор внешнего вида доÑтупен только в раÑширенном режиме. Выйти из программы и Ñменить режим?
+ <usetemplate name="okcancelbuttons" notext="Ðе выходить" yestext="Выход"/>
+ </notification>
+ <notification label="" name="NoSearch">
+ ПоиÑк доÑтупен только в раÑширенном режиме. Выйти из программы и Ñменить режим?
+ <usetemplate name="okcancelbuttons" notext="Ðе выходить" yestext="Выход"/>
+ </notification>
+ <notification label="" name="ConfirmHideUI">
+ Это дейÑтвие приведет к Ñкрытию вÑех меню и кнопок. Чтобы вернуть их, щелкните [SHORTCUT] Ñнова.
+ <usetemplate ignoretext="Подтверждать перед Ñкрытием интерфейÑа" name="okcancelignore" notext="Отмена" yestext="OK"/>
+ </notification>
+ <global name="UnsupportedGLRequirements">
+ По-видимому, ваше оборудование не удовлетворÑет требованиÑм [APP_NAME]. Ð”Ð»Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹ [APP_NAME] необходима графичеÑÐºÐ°Ñ ÐºÐ°Ñ€Ñ‚Ð° OpenGL Ñ Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶ÐºÐ¾Ð¹ мультитекÑтур. ЕÑли у Ð²Ð°Ñ ÐµÑть Ñ‚Ð°ÐºÐ°Ñ ÐºÐ°Ñ€Ñ‚Ð°, убедитеÑÑŒ, что уÑтановлены новейшие верÑии драйверов Ð´Ð»Ñ Ð½ÐµÐµ и пакеты обновлений и иÑÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ð¾Ð½Ð½Ð¾Ð¹ ÑиÑтемы.
+
+ЕÑли неполадки продолжаютÑÑ, поÑетите Ñайт [SUPPORT_SITE].
+ </global>
+ <global name="UnsupportedCPUAmount">
+ 796
+ </global>
+ <global name="UnsupportedRAMAmount">
+ 510
+ </global>
+ <global name="UnsupportedGPU">
+ - ГрафичеÑÐºÐ°Ñ ÐºÐ°Ñ€Ñ‚Ð° вашего компьютера не удовлетворÑет минимальным требованиÑм.
+ </global>
+ <global name="UnsupportedRAM">
+ - СиÑÑ‚ÐµÐ¼Ð½Ð°Ñ Ð¿Ð°Ð¼Ñть вашего компьютера не удовлетворÑет минимальным требованиÑм.
+ </global>
+ <global name="You can only set your &apos;Home Location&apos; on your land or at a mainland Infohub.">
+ ЕÑли у Ð²Ð°Ñ ÐµÑть учаÑток земли, вы можете Ñделать его Ñвоим домом (домашним меÑтоположением).
+ЕÑли нет, поÑмотрите на карту и найдите меÑта, подпиÑанные «Инфохаб».
+ </global>
+ <global name="You died and have been teleported to your home location">
+ Ð’Ñ‹ умерли и были телепортированы в ваше домашнее меÑтоположение.
+ </global>
+</notifications>
diff --git a/indra/newview/skins/default/xui/ru/panel_active_object_row.xml b/indra/newview/skins/default/xui/ru/panel_active_object_row.xml
new file mode 100644
index 0000000000..825f9a6229
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_active_object_row.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_activeim_row">
+ <text name="object_name">
+ Объект без имени
+ </text>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_adhoc_control_panel.xml b/indra/newview/skins/default/xui/ru/panel_adhoc_control_panel.xml
new file mode 100644
index 0000000000..ae2240593d
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_adhoc_control_panel.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_im_control_panel">
+ <layout_stack name="vertical_stack">
+ <layout_panel name="call_btn_panel">
+ <button label="Звонок" name="call_btn"/>
+ </layout_panel>
+ <layout_panel name="end_call_btn_panel">
+ <button label="Прервать звонок" name="end_call_btn"/>
+ </layout_panel>
+ <layout_panel name="voice_ctrls_btn_panel">
+ <button label="Управление голоÑом" name="voice_ctrls_btn"/>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_avatar_list_item.xml b/indra/newview/skins/default/xui/ru/panel_avatar_list_item.xml
new file mode 100644
index 0000000000..75e396222f
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_avatar_list_item.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="avatar_list_item">
+ <string name="FormatSeconds">
+ [COUNT] Ñ
+ </string>
+ <string name="FormatMinutes">
+ [COUNT] мин
+ </string>
+ <string name="FormatHours">
+ [COUNT] ч
+ </string>
+ <string name="FormatDays">
+ [COUNT] д
+ </string>
+ <string name="FormatWeeks">
+ [COUNT] нед
+ </string>
+ <string name="FormatMonths">
+ [COUNT] меÑ
+ </string>
+ <string name="FormatYears">
+ [COUNT] г
+ </string>
+ <text name="avatar_name" value="(загрузка)"/>
+ <text name="last_interaction" value="0 Ñ"/>
+ <icon name="permission_edit_theirs_icon" tool_tip="Ð’Ñ‹ можете изменÑть объекты Ñтого друга"/>
+ <icon name="permission_edit_mine_icon" tool_tip="Этот друг может изменÑть, удалÑть или брать ваши объекты"/>
+ <icon name="permission_map_icon" tool_tip="Этот друг может видеть Ð²Ð°Ñ Ð½Ð° карте"/>
+ <icon name="permission_online_icon" tool_tip="Этот друг может видеть ваш ÑÑ‚Ð°Ñ‚ÑƒÑ Ð² Ñети"/>
+ <button name="profile_btn" tool_tip="Смотреть профиль"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_avatar_tag.xml b/indra/newview/skins/default/xui/ru/panel_avatar_tag.xml
new file mode 100644
index 0000000000..03c164affd
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_avatar_tag.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="avatar_tag_notification">
+ <panel name="msg_caption">
+ <text name="sender_tag_name">
+ ТеÑтер Ðнжела
+ </text>
+ <text name="tag_time" value="23:30"/>
+ </panel>
+ <text_editor name="msg_text">
+ ШуÑтрый бурый Ð»Ð¸Ñ Ð¿ÐµÑ€ÐµÐ¿Ñ€Ñ‹Ð³Ð¸Ð²Ð°ÐµÑ‚ через ленивого пÑа.
+ </text_editor>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_block_list_sidetray.xml b/indra/newview/skins/default/xui/ru/panel_block_list_sidetray.xml
new file mode 100644
index 0000000000..214ca8bf3a
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_block_list_sidetray.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="block_list_panel">
+ <text name="title_text">
+ Черный ÑпиÑок
+ </text>
+ <scroll_list name="blocked" tool_tip="СпиÑок заблокированных жителей"/>
+ <button label="Заблокировать жителÑ" name="Block resident..." tool_tip="Выберите Ð¶Ð¸Ñ‚ÐµÐ»Ñ Ð´Ð»Ñ Ð±Ð»Ð¾ÐºÐ¸Ñ€Ð¾Ð²ÐºÐ¸"/>
+ <button label="Блокировать объект по имени" name="Block object by name..." tool_tip="Выберите объект Ð´Ð»Ñ Ð±Ð»Ð¾ÐºÐ¸Ñ€Ð¾Ð²ÐºÐ¸ по имени"/>
+ <button label="Разблокировать" name="Unblock" tool_tip="Удалить объект или Ð¶Ð¸Ñ‚ÐµÐ»Ñ Ð¸Ð· ÑпиÑка заблокированных"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_body_parts_list_item.xml b/indra/newview/skins/default/xui/ru/panel_body_parts_list_item.xml
new file mode 100644
index 0000000000..20a99500b6
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_body_parts_list_item.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="wearable_item">
+ <text name="item_name" value="..."/>
+ <panel name="btn_lock" tool_tip="У Ð²Ð°Ñ Ð½ÐµÑ‚ прав Ð´Ð»Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ"/>
+ <panel name="btn_edit_panel">
+ <button name="btn_edit" tool_tip="Изменить фигуру"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_bodyparts_list_button_bar.xml b/indra/newview/skins/default/xui/ru/panel_bodyparts_list_button_bar.xml
new file mode 100644
index 0000000000..f7d31813f9
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_bodyparts_list_button_bar.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="clothing_list_button_bar_panel">
+ <button label="Перейти" name="switch_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_bottomtray.xml b/indra/newview/skins/default/xui/ru/panel_bottomtray.xml
new file mode 100644
index 0000000000..ebf6c4264b
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_bottomtray.xml
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="bottom_tray">
+ <string name="DragIndicationImageName" value="Accordion_ArrowOpened_Off"/>
+ <string name="SpeakBtnToolTip" value="Включить/выключить микрофон"/>
+ <string name="VoiceControlBtnToolTip" value="Показать/Ñкрыть панель ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð³Ð¾Ð»Ð¾Ñом"/>
+ <layout_stack name="toolbar_stack">
+ <layout_panel name="speak_panel">
+ <talk_button name="talk">
+ <speak_button label="Говорить" label_selected="Говорить" name="speak_btn"/>
+ </talk_button>
+ </layout_panel>
+ <layout_panel name="gesture_panel">
+ <gesture_combo_list label="ЖеÑты" name="Gesture" tool_tip="Показать/Ñкрыть жеÑты"/>
+ </layout_panel>
+ <layout_panel name="movement_panel">
+ <bottomtray_button label="Перемещение" name="movement_btn" tool_tip="Показать/Ñкрыть панель ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð´Ð²Ð¸Ð¶ÐµÐ½Ð¸ÐµÐ¼"/>
+ </layout_panel>
+ <layout_panel name="cam_panel">
+ <bottomtray_button label="Камера" name="camera_btn" tool_tip="Показать/Ñкрыть управление камерой"/>
+ </layout_panel>
+ <layout_panel name="snapshot_panel">
+ <bottomtray_button name="snapshots" tool_tip="Сделать Ñнимок"/>
+ </layout_panel>
+ <layout_panel name="build_btn_panel">
+ <bottomtray_button label="СтроительÑтво" name="build_btn" tool_tip="Показать/Ñкрыть инÑтрументы"/>
+ </layout_panel>
+ <layout_panel name="search_btn_panel">
+ <bottomtray_button label="ПоиÑк" name="search_btn" tool_tip="Показать/Ñкрыть поиÑк"/>
+ </layout_panel>
+ <layout_panel name="world_map_btn_panel">
+ <bottomtray_button label="Карта" name="world_map_btn" tool_tip="Показать/Ñкрыть карту мира"/>
+ </layout_panel>
+ <layout_panel name="mini_map_btn_panel">
+ <bottomtray_button label="Миникарта" name="mini_map_btn" tool_tip="Показать/Ñкрыть миникарту"/>
+ </layout_panel>
+ <layout_panel name="im_well_panel">
+ <chiclet_im_well name="im_well">
+ <button name="Unread IM messages" tool_tip="Общение"/>
+ </chiclet_im_well>
+ </layout_panel>
+ <layout_panel name="notification_well_panel">
+ <chiclet_notification name="notification_well">
+ <button name="Unread" tool_tip="УведомлениÑ"/>
+ </chiclet_notification>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_bottomtray_lite.xml b/indra/newview/skins/default/xui/ru/panel_bottomtray_lite.xml
new file mode 100644
index 0000000000..bcdff112c5
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_bottomtray_lite.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="bottom_tray_lite">
+ <layout_stack name="toolbar_stack_lite">
+ <layout_panel name="gesture_panel">
+ <gesture_combo_list label="ЖеÑты" name="Gesture" tool_tip="Показать/Ñкрыть жеÑты"/>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_chat_header.xml b/indra/newview/skins/default/xui/ru/panel_chat_header.xml
new file mode 100644
index 0000000000..7916bf5155
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_chat_header.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="im_header" name="im_header">
+ <text name="time_box" value="23:30"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_chiclet_bar.xml b/indra/newview/skins/default/xui/ru/panel_chiclet_bar.xml
new file mode 100644
index 0000000000..f203ecde4b
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_chiclet_bar.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="chiclet_bar">
+ <layout_stack name="toolbar_stack">
+ <layout_panel name="im_well_panel">
+ <chiclet_im_well name="im_well">
+ <button name="Unread IM messages" tool_tip="Разговоры"/>
+ </chiclet_im_well>
+ </layout_panel>
+ <layout_panel name="notification_well_panel">
+ <chiclet_notification name="notification_well">
+ <button name="Unread" tool_tip="УведомлениÑ"/>
+ </chiclet_notification>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_classified_info.xml b/indra/newview/skins/default/xui/ru/panel_classified_info.xml
new file mode 100644
index 0000000000..c7fd0ad42f
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_classified_info.xml
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_classified_info">
+ <panel.string name="type_mature">
+ Moderate-контент
+ </panel.string>
+ <panel.string name="type_pg">
+ General-контент
+ </panel.string>
+ <panel.string name="l$_price">
+ L$[PRICE]
+ </panel.string>
+ <panel.string name="click_through_text_fmt">
+ Телепорт [TELEPORT], карта [MAP], профиль [PROFILE]
+ </panel.string>
+ <panel.string name="date_fmt">
+ [day,datetime,slt].[mthnum,datetime,slt].[year,datetime,slt]
+ </panel.string>
+ <panel.string name="auto_renew_on">
+ Включено
+ </panel.string>
+ <panel.string name="auto_renew_off">
+ Выключено
+ </panel.string>
+ <text name="title" value="Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ рекламе"/>
+ <scroll_container name="profile_scroll">
+ <panel name="scroll_content_panel">
+ <text_editor name="classified_name" value="[название]"/>
+ <text name="classified_location_label" value="МеÑто:"/>
+ <text_editor name="classified_location" value="[загрузка...]"/>
+ <text name="content_type_label" value="Тип контента:"/>
+ <text_editor name="content_type" value="[тип контента]"/>
+ <text name="category_label" value="КатегориÑ:"/>
+ <text_editor name="category" value="[категориÑ]"/>
+ <text name="creation_date_label" value="Дата ÑозданиÑ:"/>
+ <text_editor name="creation_date" tool_tip="Дата ÑозданиÑ" value="[дата]"/>
+ <text name="price_for_listing_label" value="СтоимоÑть размещениÑ:"/>
+ <text_editor name="price_for_listing" tool_tip="СтоимоÑть размещениÑ." value="[цена]"/>
+ <layout_stack name="descr_stack">
+ <layout_panel name="clickthrough_layout_panel">
+ <text name="click_through_label" value="Переходы:"/>
+ <text_editor name="click_through_text" tool_tip="Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ переходах" value="[переходы]"/>
+ </layout_panel>
+ <layout_panel name="price_layout_panel">
+ <text name="auto_renew_label" value="Ðвтооплата:"/>
+ <text name="auto_renew" value="Включено"/>
+ </layout_panel>
+ <layout_panel name="descr_layout_panel">
+ <text name="classified_desc_label" value="ОпиÑание:"/>
+ <text_editor name="classified_desc" value="[опиÑание]"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+ </scroll_container>
+ <panel name="buttons">
+ <layout_stack name="layout_stack1">
+ <layout_panel name="layout_panel1">
+ <button label="ТелепортациÑ" name="teleport_btn"/>
+ </layout_panel>
+ <layout_panel name="show_on_map_btn_lp">
+ <button label="Карта" name="show_on_map_btn"/>
+ </layout_panel>
+ <layout_panel name="edit_btn_lp">
+ <button label="Изменить" name="edit_btn"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_clothing_list_button_bar.xml b/indra/newview/skins/default/xui/ru/panel_clothing_list_button_bar.xml
new file mode 100644
index 0000000000..cc3f7feb83
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_clothing_list_button_bar.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="clothing_list_button_bar_panel">
+ <button label="Добавить +" name="add_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_clothing_list_item.xml b/indra/newview/skins/default/xui/ru/panel_clothing_list_item.xml
new file mode 100644
index 0000000000..98d4fd8b47
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_clothing_list_item.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="wearable_item">
+ <button name="btn_delete" tool_tip="Убрать из коÑтюма"/>
+ <text name="item_name" value="..."/>
+ <panel name="btn_lock" tool_tip="У Ð²Ð°Ñ Ð½ÐµÑ‚ прав Ð´Ð»Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ"/>
+ <panel name="btn_edit_panel">
+ <button name="btn_edit" tool_tip="Изменить предметы одежды"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_cof_wearables.xml b/indra/newview/skins/default/xui/ru/panel_cof_wearables.xml
new file mode 100644
index 0000000000..9e1bc4b5c4
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_cof_wearables.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="cof_wearables">
+ <accordion name="cof_wearables_accordion">
+ <accordion_tab name="tab_clothing" title="Одежда"/>
+ <accordion_tab name="tab_attachments" title="ПриÑоединениÑ"/>
+ <accordion_tab name="tab_body_parts" title="ЧаÑти тела"/>
+ </accordion>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_deletable_wearable_list_item.xml b/indra/newview/skins/default/xui/ru/panel_deletable_wearable_list_item.xml
new file mode 100644
index 0000000000..762baa2052
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_deletable_wearable_list_item.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="deletable_wearable_item">
+ <button name="btn_delete" tool_tip="Убрать из коÑтюма"/>
+ <text name="item_name" value="..."/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_dummy_clothing_list_item.xml b/indra/newview/skins/default/xui/ru/panel_dummy_clothing_list_item.xml
new file mode 100644
index 0000000000..dc9d678edd
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_dummy_clothing_list_item.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="dummy_clothing_item">
+ <text name="item_name" value="..."/>
+ <panel name="btn_add_panel">
+ <button name="btn_add" tool_tip="Добавить другие вещи Ñтого типа"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_edit_alpha.xml b/indra/newview/skins/default/xui/ru/panel_edit_alpha.xml
new file mode 100644
index 0000000000..7cde4099ef
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_edit_alpha.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_alpha_panel">
+ <scroll_container name="avatar_alpha_color_panel_scroll">
+ <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="Ðльфа глаз" name="Eye Alpha" tool_tip="Щелкните Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° изображениÑ"/>
+ <texture_picker label="Ðльфа волоÑ" name="Hair Alpha" tool_tip="Щелкните Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° изображениÑ"/>
+ </panel>
+ </scroll_container>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_edit_classified.xml b/indra/newview/skins/default/xui/ru/panel_edit_classified.xml
new file mode 100644
index 0000000000..a2f06dbadf
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_edit_classified.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Изменить рекламу" name="panel_edit_classified">
+ <panel.string name="location_notice">
+ (будет обновлено поÑле ÑохранениÑ)
+ </panel.string>
+ <string name="publish_label">
+ Опубликовать
+ </string>
+ <string name="save_label">
+ Сохранить
+ </string>
+ <text name="title">
+ Изменить рекламу
+ </text>
+ <scroll_container name="profile_scroll">
+ <panel name="scroll_content_panel">
+ <panel name="snapshot_panel">
+ <icon label="" name="edit_icon" tool_tip="Щелкните Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° изображениÑ"/>
+ </panel>
+ <text name="Name:">
+ Ðазвание:
+ </text>
+ <text name="description_label">
+ ОпиÑание:
+ </text>
+ <text name="location_label">
+ МеÑто:
+ </text>
+ <text name="classified_location">
+ загрузка...
+ </text>
+ <button label="ИÑпользовать текущее меÑто" name="set_to_curr_location_btn"/>
+ <text name="category_label" value="КатегориÑ:"/>
+ <text name="content_type_label" value="Тип контента:"/>
+ <icons_combo_box label="General-контент" name="content_type">
+ <icons_combo_box.item label="Moderate-контент" name="mature_ci" value="Mature-контент"/>
+ <icons_combo_box.item label="General-контент" name="pg_ci" value="PG-контент"/>
+ </icons_combo_box>
+ <check_box label="ÐвтоматичеÑÐºÐ°Ñ Ð¾Ð¿Ð»Ð°Ñ‚Ð° каждую неделю" name="auto_renew"/>
+ <text name="price_for_listing_label" value="СтоимоÑть размещениÑ:"/>
+ <spinner label="L$" name="price_for_listing" tool_tip="СтоимоÑть размещениÑ." value="50"/>
+ </panel>
+ </scroll_container>
+ <panel label="bottom_panel" name="bottom_panel">
+ <layout_stack name="bottom_panel_ls">
+ <layout_panel name="save_changes_btn_lp">
+ <button label="[LABEL]" name="save_changes_btn"/>
+ </layout_panel>
+ <layout_panel name="show_on_map_btn_lp">
+ <button label="Отмена" name="cancel_btn"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_edit_eyes.xml b/indra/newview/skins/default/xui/ru/panel_edit_eyes.xml
new file mode 100644
index 0000000000..84e1204b5d
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_edit_eyes.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_eyes_panel">
+ <panel name="avatar_eye_color_panel">
+ <texture_picker label="Радужка" name="Iris" tool_tip="Щелкните Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° изображениÑ"/>
+ </panel>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="eyes_main_tab" title="Глаза"/>
+ </accordion>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_edit_gloves.xml b/indra/newview/skins/default/xui/ru/panel_edit_gloves.xml
new file mode 100644
index 0000000000..561777745e
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_edit_gloves.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_gloves_panel">
+ <panel name="avatar_gloves_color_panel">
+ <texture_picker label="ТекÑтура" name="Fabric" tool_tip="Щелкните Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° изображениÑ"/>
+ <color_swatch label="Цвет/оттенок" name="Color/Tint" tool_tip="Щелкните Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° цвета"/>
+ </panel>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="gloves_main_tab" title="Перчатки"/>
+ </accordion>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_edit_hair.xml b/indra/newview/skins/default/xui/ru/panel_edit_hair.xml
new file mode 100644
index 0000000000..d5e67ddf87
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_edit_hair.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_hair_panel">
+ <panel name="avatar_hair_color_panel">
+ <texture_picker label="ТекÑтура" name="Texture" tool_tip="Щелкните Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° изображениÑ"/>
+ </panel>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="hair_color_tab" title="Цвет"/>
+ <accordion_tab name="hair_style_tab" title="Стиль"/>
+ <accordion_tab name="hair_eyebrows_tab" title="Брови"/>
+ <accordion_tab name="hair_facial_tab" title="ВолоÑÑ‹ на лице"/>
+ </accordion>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_edit_jacket.xml b/indra/newview/skins/default/xui/ru/panel_edit_jacket.xml
new file mode 100644
index 0000000000..2f5a437e69
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_edit_jacket.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_jacket_panel">
+ <panel name="avatar_jacket_color_panel">
+ <texture_picker label="ТекÑтура верха" name="Upper Fabric" tool_tip="Щелкните Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° изображениÑ"/>
+ <texture_picker label="ТекÑтура низа" name="Lower Fabric" tool_tip="Щелкните Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° изображениÑ"/>
+ <color_swatch label="Цвет/оттенок" name="Color/Tint" tool_tip="Щелкните Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° цвета"/>
+ </panel>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="jacket_main_tab" title="Пиджак"/>
+ </accordion>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_edit_pants.xml b/indra/newview/skins/default/xui/ru/panel_edit_pants.xml
new file mode 100644
index 0000000000..4970c93801
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_edit_pants.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_pants_panel">
+ <panel name="avatar_pants_color_panel">
+ <texture_picker label="ТекÑтура" name="Fabric" tool_tip="Щелкните Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° изображениÑ"/>
+ <color_swatch label="Цвет/оттенок" name="Color/Tint" tool_tip="Щелкните Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° цвета"/>
+ </panel>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="pants_main_tab" title="Брюки"/>
+ </accordion>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_edit_physics.xml b/indra/newview/skins/default/xui/ru/panel_edit_physics.xml
new file mode 100644
index 0000000000..da4ebb154d
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_edit_physics.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_physics_panel">
+ <panel label="" name="accordion_panel">
+ <accordion name="physics_accordion">
+ <accordion_tab name="physics_breasts_updown_tab" title="Груди прыгают"/>
+ <accordion_tab name="physics_breasts_inout_tab" title="Ложбинка между грудей"/>
+ <accordion_tab name="physics_breasts_leftright_tab" title="Груди покачиваютÑÑ"/>
+ <accordion_tab name="physics_belly_tab" title="Живот прыгает"/>
+ <accordion_tab name="physics_butt_tab" title="Ягодицы прыгают"/>
+ <accordion_tab name="physics_butt_leftright_tab" title="Ягодицы покачиваютÑÑ"/>
+ <accordion_tab name="physics_advanced_tab" title="Дополнительные параметры"/>
+ </accordion>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_edit_pick.xml b/indra/newview/skins/default/xui/ru/panel_edit_pick.xml
new file mode 100644
index 0000000000..6be1448ac5
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_edit_pick.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Изменить подборку" name="panel_edit_pick">
+ <panel.string name="location_notice">
+ (будет обновлено поÑле ÑохранениÑ)
+ </panel.string>
+ <text name="title">
+ Изменить подборку
+ </text>
+ <scroll_container name="profile_scroll">
+ <panel name="scroll_content_panel">
+ <icon label="" name="edit_icon" tool_tip="Щелкните Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° изображениÑ"/>
+ <text name="Name:">
+ Ðазвание:
+ </text>
+ <text name="description_label">
+ ОпиÑание:
+ </text>
+ <text name="location_label">
+ МеÑто:
+ </text>
+ <text name="pick_location">
+ загрузка…
+ </text>
+ <button label="ПоÑтавить текущее меÑто" name="set_to_curr_location_btn"/>
+ </panel>
+ </scroll_container>
+ <panel label="bottom_panel" name="bottom_panel">
+ <layout_stack name="layout_stack1">
+ <layout_panel name="layout_panel1">
+ <button label="Сохранить подборку" name="save_changes_btn"/>
+ </layout_panel>
+ <layout_panel name="layout_panel2">
+ <button label="Отмена" name="cancel_btn"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_edit_profile.xml b/indra/newview/skins/default/xui/ru/panel_edit_profile.xml
new file mode 100644
index 0000000000..e9a6a781db
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_edit_profile.xml
@@ -0,0 +1,68 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Редактирование профилÑ" name="edit_profile_panel">
+ <string name="CaptionTextAcctInfo">
+ [ACCTTYPE]
+[PAYMENTINFO] [AGEVERIFICATION]
+ </string>
+ <string name="RegisterDateFormat">
+ [REG_DATE] ([AGE])
+ </string>
+ <string name="AcctTypeResident" value="Житель"/>
+ <string name="AcctTypeTrial" value="ГоÑть"/>
+ <string name="AcctTypeCharterMember" value="Учредитель"/>
+ <string name="AcctTypeEmployee" value="Сотрудник Linden Lab"/>
+ <string name="PaymentInfoUsed" value="ИÑпользована Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ платежах"/>
+ <string name="PaymentInfoOnFile" value="ЗарегиÑтрирована Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ платежах"/>
+ <string name="NoPaymentInfoOnFile" value="Ðе зарегиÑтрирована Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ платежах"/>
+ <string name="AgeVerified" value="ВозраÑÑ‚ проверен"/>
+ <string name="NotAgeVerified" value="ВозраÑÑ‚ не проверен"/>
+ <string name="partner_edit_link_url">
+ http://www.secondlife.com/account/partners.php?lang=en
+ </string>
+ <string name="my_account_link_url">
+ http://secondlife.com/my
+ </string>
+ <string name="no_partner_text" value="Ðет"/>
+ <scroll_container name="profile_scroll">
+ <panel name="scroll_content_panel">
+ <panel name="data_panel">
+ <text name="display_name_label" value="Экранное имÑ:"/>
+ <text name="solo_username_label" value="Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ:"/>
+ <button name="set_name" tool_tip="Задать Ñкранное имÑ"/>
+ <text name="user_label" value="Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ:"/>
+ <panel name="lifes_images_panel">
+ <panel name="second_life_image_panel">
+ <text name="second_life_photo_title_text" value="[SECOND_LIFE]:"/>
+ </panel>
+ <icon label="" name="2nd_life_edit_icon" tool_tip="Щелкните Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° изображениÑ"/>
+ </panel>
+ <panel name="first_life_image_panel">
+ <text name="real_world_photo_title_text" value="Реальный мир:"/>
+ </panel>
+ <icon label="" name="real_world_edit_icon" tool_tip="Щелкните Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° изображениÑ"/>
+ <text name="title_homepage_text">
+ ДомашнÑÑ Ñтраница:
+ </text>
+ <line_editor name="homepage_edit" value="http://"/>
+ <text name="title_acc_status_text" value="Мой аккаунт:"/>
+ <text_editor name="acc_status_text" value="Житель. В файле нет информации о платежах."/>
+ <text name="my_account_link" value="[[URL] Перейти на информационную панель]"/>
+ <text name="title_partner_text" value="Мой партнер:"/>
+ <panel name="partner_data_panel">
+ <text initial_value="(получение информации)" name="partner_text"/>
+ </panel>
+ <text name="partner_edit_link" value="[[URL] Редактировать]"/>
+ </panel>
+ </panel>
+ </scroll_container>
+ <panel name="profile_me_buttons_panel">
+ <layout_stack name="bottom_panel_ls">
+ <layout_panel name="save_changes_btn_lp">
+ <button label="Сохранить изменениÑ" name="save_btn"/>
+ </layout_panel>
+ <layout_panel name="show_on_map_btn_lp">
+ <button label="Отмена" name="cancel_btn"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_edit_shape.xml b/indra/newview/skins/default/xui/ru/panel_edit_shape.xml
new file mode 100644
index 0000000000..312ad593a1
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_edit_shape.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_shape_panel">
+ <string name="meters">
+ м
+ </string>
+ <string name="feet">
+ футов
+ </string>
+ <string name="height">
+ РоÑÑ‚:
+ </string>
+ <panel label="Рубашка" name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="shape_body_tab" title="Тело"/>
+ <accordion_tab name="shape_head_tab" title="Голова"/>
+ <accordion_tab name="shape_eyes_tab" title="Глаза"/>
+ <accordion_tab name="shape_ears_tab" title="Уши"/>
+ <accordion_tab name="shape_nose_tab" title="ÐоÑ"/>
+ <accordion_tab name="shape_mouth_tab" title="Рот"/>
+ <accordion_tab name="shape_chin_tab" title="Подбородок"/>
+ <accordion_tab name="shape_torso_tab" title="ТорÑ"/>
+ <accordion_tab name="shape_legs_tab" title="Ðоги"/>
+ </accordion>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_edit_shirt.xml b/indra/newview/skins/default/xui/ru/panel_edit_shirt.xml
new file mode 100644
index 0000000000..d576a2cd2f
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_edit_shirt.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_shirt_panel">
+ <panel name="avatar_shirt_color_panel">
+ <texture_picker label="ТекÑтура" name="Fabric" tool_tip="Щелкните Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° изображениÑ"/>
+ <color_swatch label="Цвет/оттенок" name="Color/Tint" tool_tip="Щелкните Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° цвета"/>
+ </panel>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="shirt_main_tab" title="Рубашка"/>
+ </accordion>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_edit_shoes.xml b/indra/newview/skins/default/xui/ru/panel_edit_shoes.xml
new file mode 100644
index 0000000000..f6d7029108
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_edit_shoes.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_shoes_panel">
+ <panel name="avatar_shoes_color_panel">
+ <texture_picker label="ТекÑтура" name="Fabric" tool_tip="Щелкните Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° изображениÑ"/>
+ <color_swatch label="Цвет/оттенок" name="Color/Tint" tool_tip="Щелкните Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° цвета"/>
+ </panel>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="shoes_main_tab" title="Обувь"/>
+ </accordion>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_edit_skin.xml b/indra/newview/skins/default/xui/ru/panel_edit_skin.xml
new file mode 100644
index 0000000000..f5a5339afe
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_edit_skin.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_skin_panel">
+ <panel name="avatar_skin_color_panel">
+ <texture_picker label="Голова" name="Head" tool_tip="Щелкните Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° изображениÑ"/>
+ <texture_picker label="ВерхнÑÑ Ñ‡Ð°Ñть тела" name="Upper Body" tool_tip="Щелкните Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° изображениÑ"/>
+ <texture_picker label="ÐижнÑÑ Ñ‡Ð°Ñть тела" name="Lower Body" tool_tip="Щелкните Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° изображениÑ"/>
+ </panel>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="skin_color_tab" title="Цвет кожи"/>
+ <accordion_tab name="skin_face_tab" title="ОÑобенноÑти лица"/>
+ <accordion_tab name="skin_makeup_tab" title="МакиÑж"/>
+ <accordion_tab name="skin_body_tab" title="ОÑобенноÑти тела"/>
+ </accordion>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_edit_skirt.xml b/indra/newview/skins/default/xui/ru/panel_edit_skirt.xml
new file mode 100644
index 0000000000..909946e577
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_edit_skirt.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_skirt_panel">
+ <panel name="avatar_skirt_color_panel">
+ <texture_picker label="ТекÑтура" name="Fabric" tool_tip="Щелкните Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° изображениÑ"/>
+ <color_swatch label="Цвет/оттенок" name="Color/Tint" tool_tip="Щелкните Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° цвета"/>
+ </panel>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="skirt_main_tab" title="Юбка"/>
+ </accordion>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_edit_socks.xml b/indra/newview/skins/default/xui/ru/panel_edit_socks.xml
new file mode 100644
index 0000000000..2827fbc028
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_edit_socks.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_socks_panel">
+ <panel name="avatar_socks_color_panel">
+ <texture_picker label="ТекÑтура" name="Fabric" tool_tip="Щелкните Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° изображениÑ"/>
+ <color_swatch label="Цвет/оттенок" name="Color/Tint" tool_tip="Щелкните Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° цвета"/>
+ </panel>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="socks_main_tab" title="ÐоÑки"/>
+ </accordion>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_edit_tattoo.xml b/indra/newview/skins/default/xui/ru/panel_edit_tattoo.xml
new file mode 100644
index 0000000000..874d5f8bc4
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_edit_tattoo.xml
@@ -0,0 +1,9 @@
+<?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="Щелкните картинку, чтобы выбрать ее"/>
+ <color_swatch label="Цвет/оттенок" name="Color/Tint" tool_tip="Щелкните Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° цвета"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_edit_underpants.xml b/indra/newview/skins/default/xui/ru/panel_edit_underpants.xml
new file mode 100644
index 0000000000..f2f6e5e516
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_edit_underpants.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_underpants_panel">
+ <panel name="avatar_underpants_color_panel">
+ <texture_picker label="ТекÑтура" name="Fabric" tool_tip="Щелкните Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° изображениÑ"/>
+ <color_swatch label="Цвет/оттенок" name="Color/Tint" tool_tip="Щелкните Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° цвета"/>
+ </panel>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="underpants_main_tab" title="ТруÑÑ‹"/>
+ </accordion>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_edit_undershirt.xml b/indra/newview/skins/default/xui/ru/panel_edit_undershirt.xml
new file mode 100644
index 0000000000..6f84c6cec2
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_edit_undershirt.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_undershirt_panel">
+ <panel name="avatar_undershirt_color_panel">
+ <texture_picker label="ТекÑтура" name="Fabric" tool_tip="Щелкните Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° изображениÑ"/>
+ <color_swatch label="Цвет/оттенок" name="Color/Tint" tool_tip="Щелкните Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° цвета"/>
+ </panel>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="undershirt_main_tab" title="Майка"/>
+ </accordion>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_edit_wearable.xml b/indra/newview/skins/default/xui/ru/panel_edit_wearable.xml
new file mode 100644
index 0000000000..79130a9c80
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_edit_wearable.xml
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Можно надеть" name="panel_edit_wearable">
+ <string name="edit_shape_title">
+ Изменение фигуры
+ </string>
+ <string name="edit_skin_title">
+ Изменение кожи
+ </string>
+ <string name="edit_hair_title">
+ Изменение волоÑ
+ </string>
+ <string name="edit_eyes_title">
+ Изменение глаз
+ </string>
+ <string name="edit_shirt_title">
+ Изменение рубашки
+ </string>
+ <string name="edit_pants_title">
+ Изменение брюк
+ </string>
+ <string name="edit_shoes_title">
+ Изменение обуви
+ </string>
+ <string name="edit_socks_title">
+ Изменение ноÑков
+ </string>
+ <string name="edit_jacket_title">
+ Изменение пиджака
+ </string>
+ <string name="edit_skirt_title">
+ Изменение юбки
+ </string>
+ <string name="edit_gloves_title">
+ Изменение перчаток
+ </string>
+ <string name="edit_undershirt_title">
+ Изменение майки
+ </string>
+ <string name="edit_underpants_title">
+ Изменение труÑов
+ </string>
+ <string name="edit_alpha_title">
+ Изменение альфа-маÑки
+ </string>
+ <string name="edit_tattoo_title">
+ Изменение тату
+ </string>
+ <string name="edit_physics_title">
+ Изменение физики
+ </string>
+ <string name="shape_desc_text">
+ Фигура:
+ </string>
+ <string name="skin_desc_text">
+ Кожа:
+ </string>
+ <string name="hair_desc_text">
+ ВолоÑÑ‹:
+ </string>
+ <string name="eyes_desc_text">
+ Глаза:
+ </string>
+ <string name="shirt_desc_text">
+ Рубашка:
+ </string>
+ <string name="pants_desc_text">
+ Брюки:
+ </string>
+ <string name="shoes_desc_text">
+ Обувь:
+ </string>
+ <string name="socks_desc_text">
+ ÐоÑки:
+ </string>
+ <string name="jacket_desc_text">
+ Пиджак:
+ </string>
+ <string name="skirt_desc_text">
+ Юбка:
+ </string>
+ <string name="gloves_desc_text">
+ Перчатки:
+ </string>
+ <string name="undershirt_desc_text">
+ Майка:
+ </string>
+ <string name="underpants_desc_text">
+ ТруÑÑ‹:
+ </string>
+ <string name="alpha_desc_text">
+ Ðльфа-маÑка:
+ </string>
+ <string name="tattoo_desc_text">
+ Тату:
+ </string>
+ <string name="physics_desc_text">
+ Физика:
+ </string>
+ <labeled_back_button label="Сохранить" name="back_btn" tool_tip="ВернутьÑÑ Ðº изменению коÑтюма"/>
+ <text name="edit_wearable_title" value="Изменение фигуры"/>
+ <panel label="Рубашка" name="wearable_type_panel">
+ <text name="description_text" value="Фигура:"/>
+ <radio_group name="sex_radio">
+ <radio_item label="" name="sex_male" tool_tip="Мужчина" value="1"/>
+ <radio_item label="" name="sex_female" tool_tip="Женщина" value="0"/>
+ </radio_group>
+ <icon name="male_icon" tool_tip="Мужчина"/>
+ <icon name="female_icon" tool_tip="Женщина"/>
+ </panel>
+ <panel name="button_panel">
+ <layout_stack name="button_panel_ls">
+ <layout_panel name="save_as_btn_lp">
+ <button label="Сохранить как" name="save_as_button"/>
+ </layout_panel>
+ <layout_panel name="revert_btn_lp">
+ <button label="Отменить изменениÑ" name="revert_button"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_group_control_panel.xml b/indra/newview/skins/default/xui/ru/panel_group_control_panel.xml
new file mode 100644
index 0000000000..2e6f3502b6
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_group_control_panel.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_im_control_panel">
+ <layout_stack name="vertical_stack">
+ <layout_panel name="group_info_btn_panel">
+ <button label="Профиль группы" name="group_info_btn"/>
+ </layout_panel>
+ <layout_panel name="call_btn_panel">
+ <button label="Звонок группе" name="call_btn"/>
+ </layout_panel>
+ <layout_panel name="end_call_btn_panel">
+ <button label="Прервать звонок" name="end_call_btn"/>
+ </layout_panel>
+ <layout_panel name="voice_ctrls_btn_panel">
+ <button label="Открыть голоÑовое управление" name="voice_ctrls_btn"/>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_group_general.xml b/indra/newview/skins/default/xui/ru/panel_group_general.xml
new file mode 100644
index 0000000000..4d7e1c9fff
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_group_general.xml
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Общие" name="general_tab">
+ <panel.string name="help_text">
+ Вкладка «Общие» Ñодержит общие ÑÐ²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¾ данной группе, ÑпиÑок учаÑтников, общие наÑтройки группы и параметры учаÑтников.
+Чтобы получить Ñправку, наведите курÑор мыши на параметр.
+ </panel.string>
+ <panel.string name="group_info_unchanged">
+ ÐžÐ±Ñ‰Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ группе изменена
+ </panel.string>
+ <panel.string name="incomplete_member_data_str">
+ Получение данных учаÑтника
+ </panel.string>
+ <panel name="group_info_top">
+ <texture_picker label="" name="insignia" tool_tip="Щелкните Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° изображениÑ"/>
+ <text name="prepend_founded_by">
+ ОÑнователь:
+ </text>
+ <text name="join_cost_text">
+ БеÑплатно
+ </text>
+ <button label="ПРИСОЕДИÐИТЬСЯ!" name="btn_join"/>
+ </panel>
+ <text_editor name="charter">
+ УÑтав группы
+ </text_editor>
+ <name_list name="visible_members">
+ <name_list.columns label="УчаÑтник" name="name"/>
+ <name_list.columns label="Титул" name="title"/>
+ <name_list.columns label="СтатуÑ" name="status"/>
+ </name_list>
+ <text name="my_group_settngs_label">
+ Я
+ </text>
+ <text name="active_title_label">
+ Титул:
+ </text>
+ <combo_box name="active_title" tool_tip="УÑтановить титул, который будет показан вмеÑте Ñ Ð²Ð°ÑˆÐ¸Ð¼ именем, когда Ñта группа активна."/>
+ <check_box label="Получать ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð¾Ñ‚ группы" name="receive_notices" tool_tip="Включите, еÑли хотите получать ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð¾Ñ‚ Ñтой группы. Снимите Ñтот флажок, еÑли группа шлет вам нежелательные ÑообщениÑ."/>
+ <check_box label="Показывать в моем профиле" name="list_groups_in_profile" tool_tip="Включите, еÑли хотите, чтобы группа отображалаÑÑŒ в вашем профиле"/>
+ <panel name="preferences_container">
+ <text name="group_settngs_label">
+ Группа
+ </text>
+ <check_box label="ÐžÑ‚ÐºÑ€Ñ‹Ñ‚Ð°Ñ Ñ€ÐµÐ³Ð¸ÑтрациÑ" name="open_enrollement" tool_tip="УÑтанавливаетÑÑ, еÑли в Ñтой группе можно зарегиÑтрироватьÑÑ Ð±ÐµÐ· приглашениÑ."/>
+ <check_box label="ÐŸÐ»Ð°Ñ‚Ð½Ð°Ñ Ñ€ÐµÐ³Ð¸ÑтрациÑ" name="check_enrollment_fee" tool_tip="УÑтанавливаетÑÑ, еÑли в Ñтой группе требуетÑÑ Ð¾Ð¿Ð»Ð°Ñ‚Ð° за вÑтупление."/>
+ <spinner label="L$" name="spin_enrollment_fee" tool_tip="Ðовые учаÑтники должны будут оплатить взноÑ, еÑли региÑÑ‚Ñ€Ð°Ñ†Ð¸Ñ Ð¿Ð»Ð°Ñ‚Ð½Ð°Ñ."/>
+ <combo_box name="group_mature_check" tool_tip="УÑтанавливает, Ñодержит ли группа информацию категории умеренной дозволенноÑти">
+ <combo_item name="select_mature">
+ - Выберите рейтинг зрелоÑти -
+ </combo_item>
+ <combo_box.item label="Умеренный контент" name="mature"/>
+ <combo_box.item label="Общий контент" name="pg"/>
+ </combo_box>
+ <check_box initial_value="иÑтина" label="Показать в поиÑке" name="show_in_group_list" tool_tip="Позволить людÑм видеть Ñту группу в результатах поиÑка"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_group_info_sidetray.xml b/indra/newview/skins/default/xui/ru/panel_group_info_sidetray.xml
new file mode 100644
index 0000000000..d8cf1b4756
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_group_info_sidetray.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Профиль группы" name="GroupInfo">
+ <panel.string name="default_needs_apply_text">
+ ЕÑть неÑохраненные изменениÑ
+ </panel.string>
+ <panel.string name="want_apply_text">
+ Ð’Ñ‹ хотите Ñохранить Ñти изменениÑ?
+ </panel.string>
+ <panel.string name="group_join_btn">
+ ПриÑоединитьÑÑ (L$[AMOUNT])
+ </panel.string>
+ <panel.string name="group_join_free">
+ БеÑплатно
+ </panel.string>
+ <panel name="group_info_top">
+ <text_editor name="group_name" value="(Загрузка...)"/>
+ <line_editor label="Введите здеÑÑŒ название новой группы" name="group_name_editor"/>
+ </panel>
+ <layout_stack name="layout">
+ <layout_panel name="group_accordions">
+ <accordion name="groups_accordion">
+ <accordion_tab name="group_general_tab" title="Общие"/>
+ <accordion_tab name="group_roles_tab" title="Роли"/>
+ <accordion_tab name="group_notices_tab" title="УведомлениÑ"/>
+ <accordion_tab name="group_land_tab" title="ЗемлÑ/активы"/>
+ </accordion>
+ </layout_panel>
+ </layout_stack>
+ <layout_stack name="button_row_ls">
+ <layout_panel name="btn_chat_lp">
+ <button label="Чат" name="btn_chat"/>
+ </layout_panel>
+ <layout_panel name="call_btn_lp">
+ <button label="Звонок группе" name="btn_call" tool_tip="Звонок Ñтой группе"/>
+ </layout_panel>
+ <layout_panel name="btn_apply_lp">
+ <button label="Сохранить" label_selected="Сохранить" name="btn_apply"/>
+ <button label="Создать группу" name="btn_create" tool_tip="Создать новую группу"/>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_group_invite.xml b/indra/newview/skins/default/xui/ru/panel_group_invite.xml
new file mode 100644
index 0000000000..3041046041
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_group_invite.xml
@@ -0,0 +1,27 @@
+<?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">
+ (загрузка…)
+ </panel.string>
+ <panel.string name="already_in_group">
+ ÐеÑколько выбранных жителей уже ÑоÑтоÑÑ‚ в группе. Им Ð¿Ñ€Ð¸Ð³Ð»Ð°ÑˆÐµÐ½Ð¸Ñ Ð½Ðµ были отправлены.
+ </panel.string>
+ <text name="help_text">
+ Можно выбрать неÑколько жителей Ð´Ð»Ñ Ð¿Ñ€Ð¸Ð³Ð»Ð°ÑˆÐµÐ½Ð¸Ñ Ð² группу. Чтобы начать, щелкните «Выбрать жителей».
+ </text>
+ <button label="Выбрать жителей" name="add_button"/>
+ <name_list name="invitee_list" tool_tip="Чтобы выбрать неÑколько жителей, нажмите и удерживайте клавишу CTRL, а затем щелкните их имена"/>
+ <button label="Удалить выбранных из ÑпиÑка" name="remove_button" tool_tip="Удаление выбранных жителей из ÑпиÑка приглашенных"/>
+ <text name="role_text">
+ Выберите назначаемую им роль:
+ </text>
+ <combo_box name="role_name" tool_tip="Выберите в ÑпиÑке роли, которые вы можете назначать учаÑтникам"/>
+ <button label="Отправить приглашениÑ" name="ok_button"/>
+ <button label="Отмена" name="cancel_button"/>
+ <string name="GroupInvitation">
+ Групповое приглашение
+ </string>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_group_land_money.xml b/indra/newview/skins/default/xui/ru/panel_group_land_money.xml
new file mode 100644
index 0000000000..9235aa2f69
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_group_land_money.xml
@@ -0,0 +1,85 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Ð—ÐµÐ¼Ð»Ñ Ð¸ L$" name="land_money_tab">
+ <panel.string name="help_text">
+ ЕÑли общее количеÑтво иÑпользованной земли не превышает общий взноÑ, отобразитÑÑ Ð¿Ñ€ÐµÐ´ÑƒÐ¿Ñ€ÐµÐ¶Ð´ÐµÐ½Ð¸Ðµ.
+ </panel.string>
+ <panel.string name="cant_view_group_land_text">
+ У Ð²Ð°Ñ Ð½ÐµÑ‚ прав Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñмотра принадлежащей группе земли
+ </panel.string>
+ <panel.string name="epmty_view_group_land_text">
+ Ðет данных
+ </panel.string>
+ <panel.string name="cant_view_group_accounting_text">
+ У Ð²Ð°Ñ Ð½ÐµÑ‚ прав Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñмотра информации о Ñчетах группы.
+ </panel.string>
+ <panel.string name="loading_txt">
+ Загрузка...
+ </panel.string>
+ <panel.string name="land_contrib_error">
+ Ðе удаетÑÑ Ð·Ð°Ð´Ð°Ñ‚ÑŒ ваш земельный взноÑ
+ </panel.string>
+ <panel name="layout_panel_landmoney">
+ <scroll_list name="group_parcel_list">
+ <scroll_list.columns label="УчаÑток" name="name"/>
+ <scroll_list.columns label="Регион" name="location"/>
+ <scroll_list.columns label="Тип" name="type"/>
+ <scroll_list.columns label="Площадь" name="area"/>
+ <scroll_list.columns label="Скрыто" name="hidden"/>
+ </scroll_list>
+ <text name="total_contributed_land_label">
+ Общий взноÑ:
+ </text>
+ <text name="total_contributed_land_value">
+ [AREA] м²
+ </text>
+ <button label="Карта" label_selected="Карта" name="map_button"/>
+ <text name="total_land_in_use_label">
+ Ð’Ñего иÑпользуетÑÑ Ð·ÐµÐ¼Ð»Ð¸:
+ </text>
+ <text name="total_land_in_use_value">
+ [AREA] м²
+ </text>
+ <text name="land_available_label">
+ ДоÑтупно земли:
+ </text>
+ <text name="land_available_value">
+ [AREA] м²
+ </text>
+ <text name="your_contribution_label">
+ Ваш взноÑ:
+ </text>
+ <text name="your_contribution_units">
+ м²
+ </text>
+ <text name="your_contribution_max_value">
+ (макÑимум: [AMOUNT])
+ </text>
+ <text name="group_over_limit_text">
+ Ð”Ð»Ñ Ñффективного иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð·ÐµÐ¼Ð»Ð¸ нужно больше земельных кредитов
+ </text>
+ <text name="group_money_heading">
+ Группы L$
+ </text>
+ </panel>
+ <tab_container name="group_money_tab_container">
+ <panel label="ПЛÐÐИРОВÐÐИЕ" name="group_money_planning_tab">
+ <text_editor name="group_money_planning_text">
+ Загрузка...
+ </text_editor>
+ </panel>
+ <panel label="ДÐÐÐЫЕ" name="group_money_details_tab">
+ <text_editor name="group_money_details_text">
+ Загрузка...
+ </text_editor>
+ <button name="earlier_details_button" tool_tip="Ðазад"/>
+ <button name="later_details_button" tool_tip="Далее"/>
+ </panel>
+ <panel label="ПРОДÐЖИ" name="group_money_sales_tab">
+ <text_editor name="group_money_sales_text">
+ Загрузка...
+ </text_editor>
+ <button name="earlier_sales_button" tool_tip="Ðазад"/>
+ <button name="later_sales_button" tool_tip="Далее"/>
+ </panel>
+ </tab_container>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_group_list_item.xml b/indra/newview/skins/default/xui/ru/panel_group_list_item.xml
new file mode 100644
index 0000000000..7f000fb5a0
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_group_list_item.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="group_list_item">
+ <text name="group_name" value="ÐеизвеÑтно"/>
+ <button name="profile_btn" tool_tip="Смотреть профиль"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_group_notices.xml b/indra/newview/skins/default/xui/ru/panel_group_notices.xml
new file mode 100644
index 0000000000..8d20c4a96b
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_group_notices.xml
@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="УведомлениÑ" name="notices_tab">
+ <panel.string name="help_text">
+ Ð£Ð²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð·Ð²Ð¾Ð»ÑÑŽÑ‚ отправлÑть ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¸ вложенные объекты.
+Ð£Ð²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð»ÑƒÑ‡Ð°ÑŽÑ‚ только учаÑтники групп Ñ Ñ€Ð¾Ð»Ñми, которые дают право на получение уведомлений.
+Вы можете отключить получение уведомлений на вкладке «Общие».
+ </panel.string>
+ <panel.string name="no_notices_text">
+ Ðет Ñтарых уведомлений
+ </panel.string>
+ <text name="lbl2">
+ Ð£Ð²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ñ…Ñ€Ð°Ð½ÑÑ‚ÑÑ 14 дней.
+МакÑимум 200 уведомлений ежедневно
+ </text>
+ <scroll_list name="notice_list">
+ <scroll_list.columns label="Тема" name="subject"/>
+ <scroll_list.columns label="От кого" name="from"/>
+ <scroll_list.columns label="Дата" name="date"/>
+ </scroll_list>
+ <text name="notice_list_none_found">
+ Ðе найдено
+ </text>
+ <button label="Ðовое уведомление" name="create_new_notice" tool_tip="Создать уведомление"/>
+ <button name="refresh_notices" tool_tip="Обновить ÑпиÑок уведомлений"/>
+ <panel label="Создать уведомление" name="panel_create_new_notice">
+ <text name="lbl">
+ Создать уведомление
+ </text>
+ <text name="lbl3">
+ Тема:
+ </text>
+ <text name="lbl4">
+ Сообщение:
+ </text>
+ <text name="lbl5">
+ Вложение:
+ </text>
+ <text name="string">
+ Перетащите Ñюда предмет, чтобы вложить его:
+ </text>
+ <button label="Инвентарь" name="open_inventory" tool_tip="Открыть инвентарь"/>
+ <button name="remove_attachment" tool_tip="Удалить вложение из уведомлениÑ"/>
+ <button label="ПоÑлать" label_selected="ПоÑлать" name="send_notice"/>
+ <group_drop_target name="drop_target" tool_tip="Перетащите из Ð¸Ð½Ð²ÐµÐ½Ñ‚Ð°Ñ€Ñ Ð½Ð° Ñту панель предмет, чтобы отправить его вмеÑте Ñ Ñообщением. У Ð²Ð°Ñ Ð´Ð¾Ð»Ð¶Ð½Ð¾ быть разрешение на копирование и передачу Ñтого предмета."/>
+ </panel>
+ <panel label="Смотреть Ñтарые уведомлениÑ" name="panel_view_past_notice">
+ <text name="lbl">
+ Ðрхивные уведомлениÑ
+ </text>
+ <text name="lbl2">
+ Чтобы поÑлать новое уведомление, нажмите кнопку +
+ </text>
+ <text name="lbl3">
+ Тема:
+ </text>
+ <text name="lbl4">
+ Сообщение:
+ </text>
+ <button label="Открыть вложение" name="open_attachment"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_group_notify.xml b/indra/newview/skins/default/xui/ru/panel_group_notify.xml
new file mode 100644
index 0000000000..1aee7a7f61
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_group_notify.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="instant_message" name="panel_group_notify">
+ <string name="message_max_lines_count" value="7"/>
+ <string name="subject_font" value="SANSSERIF_BIG"/>
+ <string name="date_font" value="SANSSERIF"/>
+ <panel label="заголовок" name="header">
+ <text name="title" value="Ð˜Ð¼Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²Ð¸Ñ‚ÐµÐ»Ñ/название группы"/>
+ </panel>
+ <text_editor name="message" value="Ñообщение"/>
+ <text name="attachment" value="Вложение"/>
+ <button label="ОК" name="btn_ok"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_group_roles.xml b/indra/newview/skins/default/xui/ru/panel_group_roles.xml
new file mode 100644
index 0000000000..c57f21679f
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_group_roles.xml
@@ -0,0 +1,95 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="УчаÑтники и роли" name="roles_tab">
+ <panel.string name="default_needs_apply_text">
+ ЕÑть неÑохраненные изменениÑ
+ </panel.string>
+ <panel.string name="want_apply_text">
+ Хотите Ñохранить изменениÑ?
+ </panel.string>
+ <tab_container name="roles_tab_container">
+ <panel label="УЧÐСТÐИКИ" name="members_sub_tab" tool_tip="УчаÑтники">
+ <panel.string name="help_text">
+ Можно добавлÑть или удалÑть роли, назначенные учаÑтникам.
+Чтобы выбрать неÑколько учаÑтников, удерживайте клавишу CTRL и
+щелкайте нужные имена.
+ </panel.string>
+ <panel.string name="donation_area">
+ [AREA] м²
+ </panel.string>
+ <filter_editor label="Фильтр учаÑтников" name="filter_input"/>
+ <name_list name="member_list">
+ <name_list.columns label="УчаÑтник" name="name"/>
+ <name_list.columns label="Вклад" name="donated"/>
+ <name_list.columns label="СтатуÑ" name="online"/>
+ </name_list>
+ <button label="ПриглаÑить" name="member_invite"/>
+ <button label="Выкинуть" name="member_eject"/>
+ </panel>
+ <panel label="РОЛИ" name="roles_sub_tab">
+ <panel.string name="help_text">
+ У ролей еÑть название и ÑпиÑок ÑпоÑобноÑтей,
+доÑтупных учаÑтникам. У учаÑтников может быть
+одна или неÑколько ролей. У группы может быть до 10 ролей,
+в том чиÑле роли «ВÑе» и «Владелец».
+ </panel.string>
+ <panel.string name="cant_delete_role">
+ Роли «ВÑе» и «Владелец» ÑвлÑÑŽÑ‚ÑÑ Ð¾Ñобыми и не могут быть удалены.
+ </panel.string>
+ <filter_editor label="Фильтр ролей" name="filter_input"/>
+ <scroll_list name="role_list">
+ <scroll_list.columns label="Роль" name="name"/>
+ <scroll_list.columns label="Ðазвание" name="title"/>
+ <scroll_list.columns label="#" name="members"/>
+ </scroll_list>
+ <button label="Создать роль" name="role_create"/>
+ <button label="Удалить роль" name="role_delete"/>
+ </panel>
+ <panel label="СПОСОБÐОСТИ" name="actions_sub_tab" tool_tip="Можно проÑмотреть опиÑание ÑпоÑобноÑти, а также какие учаÑтники и роли ею обладают.">
+ <panel.string name="help_text">
+ СпоÑобноÑти позволÑÑŽÑ‚ учаÑтникам, которым назначены ÑоответÑтвующие роли, выполнÑть оÑобые
+дейÑÑ‚Ð²Ð¸Ñ Ð² группе. ИмеетÑÑ ÑˆÐ¸Ñ€Ð¾ÐºÐ¸Ð¹ выбор ÑпоÑобноÑтей.
+ </panel.string>
+ <filter_editor label="Фильтр ÑпоÑобноÑтей" name="filter_input"/>
+ <scroll_list name="action_list" tool_tip="Выберите ÑпоÑобноÑть, чтобы проÑмотреть данные о ней"/>
+ </panel>
+ </tab_container>
+ <panel name="members_footer">
+ <text name="static">
+ Ðазначенные роли
+ </text>
+ <text name="static2">
+ ДоÑтупные ÑпоÑобноÑти
+ </text>
+ <scroll_list name="member_allowed_actions" tool_tip="Данные о каждой доÑтупной ÑпоÑобноÑти Ñм. на вкладке «СпоÑобноÑти»"/>
+ </panel>
+ <panel name="roles_footer">
+ <text name="static">
+ Ð˜Ð¼Ñ Ñ€Ð¾Ð»Ð¸
+ </text>
+ <text name="static3">
+ Ðазвание роли
+ </text>
+ <text name="static2">
+ ОпиÑание
+ </text>
+ <text name="static4">
+ Ðазначенные учаÑтники
+ </text>
+ <check_box label="Показывать учаÑтников" name="role_visible_in_list" tool_tip="ОпределÑет, будут ли учаÑтники Ñтой роли видны на вкладке «ОÑновные» жителÑм, которые не входÑÑ‚ в группу."/>
+ <text name="static5">
+ ДоÑтупные ÑпоÑобноÑти
+ </text>
+ <scroll_list name="role_allowed_actions" tool_tip="Данные о каждой доÑтупной ÑпоÑобноÑти Ñм. на вкладке «СпоÑобноÑти»"/>
+ </panel>
+ <panel name="actions_footer">
+ <text_editor name="action_description">
+ Это ÑпоÑобноÑть «ИÑключать учаÑтников из группы». Владельца может иÑключить только другой владелец.
+ </text_editor>
+ <text name="static2">
+ Роли Ñ Ñтой ÑпоÑобноÑтью
+ </text>
+ <text name="static3">
+ УчаÑтники Ñ Ñтой ÑпоÑобноÑтью
+ </text>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_im_control_panel.xml b/indra/newview/skins/default/xui/ru/panel_im_control_panel.xml
new file mode 100644
index 0000000000..2a23cdb800
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_im_control_panel.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_im_control_panel">
+ <layout_stack name="button_stack">
+ <layout_panel name="view_profile_btn_panel">
+ <button label="Профиль" name="view_profile_btn"/>
+ </layout_panel>
+ <layout_panel name="add_friend_btn_panel">
+ <button label="Добавить в друзьÑ" name="add_friend_btn"/>
+ </layout_panel>
+ <layout_panel name="teleport_btn_panel">
+ <button label="ТелепортациÑ" name="teleport_btn" tool_tip="Предложить телепортацию Ñтому жителю"/>
+ </layout_panel>
+ <layout_panel name="share_btn_panel">
+ <button label="ПоделитьÑÑ" name="share_btn"/>
+ </layout_panel>
+ <layout_panel name="pay_btn_panel">
+ <button label="Заплатить" name="pay_btn"/>
+ </layout_panel>
+ <layout_panel name="call_btn_panel">
+ <button label="Звонок" name="call_btn"/>
+ </layout_panel>
+ <layout_panel name="end_call_btn_panel">
+ <button label="Завершить звонок" name="end_call_btn"/>
+ </layout_panel>
+ <layout_panel name="voice_ctrls_btn_panel">
+ <button label="Управление голоÑом" name="voice_ctrls_btn"/>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_instant_message.xml b/indra/newview/skins/default/xui/ru/panel_instant_message.xml
new file mode 100644
index 0000000000..cf9bc7fccb
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_instant_message.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="im_panel" name="im_panel">
+ <string name="message_max_lines_count">
+ 6
+ </string>
+ <panel label="im_header" name="im_header">
+ <text name="time_box" value="23:30"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_inventory_item.xml b/indra/newview/skins/default/xui/ru/panel_inventory_item.xml
new file mode 100644
index 0000000000..d18047fbcf
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_inventory_item.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="inventory_item">
+ <text name="item_name" value="..."/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_landmark_info.xml b/indra/newview/skins/default/xui/ru/panel_landmark_info.xml
new file mode 100644
index 0000000000..f4febd49cd
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_landmark_info.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="landmark_info">
+ <string name="title_create_landmark" value="Создать закладку"/>
+ <string name="title_edit_landmark" value="Изменить закладку"/>
+ <string name="title_landmark" value="Закладка"/>
+ <string name="not_available" value="(неизвеÑтно)"/>
+ <string name="unknown" value="(неизвеÑтно)"/>
+ <string name="public" value="(публичное)"/>
+ <string name="server_update_text">
+ Ðеобходимо обновление Ñервера, чтобы Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ñтала доÑтупна.
+ </string>
+ <string name="server_error_text">
+ Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾Ð± Ñтом меÑте ÑÐµÐ¹Ñ‡Ð°Ñ Ð½ÐµÐ´Ð¾Ñтупна. Повторите попытку позже.
+ </string>
+ <string name="server_forbidden_text">
+ Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾Ð± Ñтом меÑте недоÑтупна, поÑкольку у Ð²Ð°Ñ Ð½ÐµÑ‚ прав на ее проÑмотр. Узнайте о Ñвоих правах, ÑвÑзавшиÑÑŒ Ñ Ð²Ð»Ð°Ð´ÐµÐ»ÑŒÑ†ÐµÐ¼ учаÑтка.
+ </string>
+ <string name="acquired_date">
+ [wkday,datetime,local], [day,datetime,local] [mth,datetime,local] [year,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local]
+ </string>
+ <button name="back_btn" tool_tip="Ðазад"/>
+ <text name="title" value="Профиль меÑта"/>
+ <scroll_container name="place_scroll">
+ <panel name="scrolling_panel">
+ <text name="region_title" value="Образец_региона"/>
+ <text name="parcel_title" value="Пример учаÑтка, длина имени (145, 228, 26)"/>
+ <expandable_text name="description" value="Du waltz die spritz"/>
+ <text name="maturity_value" value="неизвеÑтно"/>
+ <panel name="landmark_info_panel">
+ <text name="owner_label" value="Владелец:"/>
+ <text name="creator_label" value="Создатель:"/>
+ <text name="created_label" value="Создано:"/>
+ </panel>
+ <panel name="landmark_edit_panel">
+ <text name="title_label" value="Ðазвание:"/>
+ <text name="notes_label" value="Мои заметки:"/>
+ <text name="folder_label" value="РаÑположение закладки:"/>
+ </panel>
+ </panel>
+ </scroll_container>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_landmarks.xml b/indra/newview/skins/default/xui/ru/panel_landmarks.xml
new file mode 100644
index 0000000000..7d684cd479
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_landmarks.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="Landmarks">
+ <accordion name="landmarks_accordion">
+ <accordion_tab name="tab_favorites" title="Избранное"/>
+ <accordion_tab name="tab_landmarks" title="Мои закладки"/>
+ <accordion_tab name="tab_inventory" title="Мой инвентарь"/>
+ <accordion_tab name="tab_library" title="Библиотека"/>
+ </accordion>
+ <panel name="bottom_panel">
+ <layout_stack name="bottom_panel">
+ <layout_panel name="options_gear_btn_panel">
+ <menu_button name="options_gear_btn" tool_tip="Показать дополнительные параметры"/>
+ </layout_panel>
+ <layout_panel name="add_btn_panel">
+ <button name="add_btn" tool_tip="Добавить новую закладку"/>
+ </layout_panel>
+ <layout_panel name="trash_btn_panel">
+ <dnd_button name="trash_btn" tool_tip="Удалить выбранную закладку"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_login.xml b/indra/newview/skins/default/xui/ru/panel_login.xml
new file mode 100644
index 0000000000..7928191fa6
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_login.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_login">
+ <panel.string name="create_account_url">
+ http://join.secondlife.com/
+ </panel.string>
+ <panel.string name="forgot_password_url">
+ http://secondlife.com/account/request.php
+ </panel.string>
+ <layout_stack name="login_widgets">
+ <layout_panel name="login">
+ <text name="username_text">
+ Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ:
+ </text>
+ <combo_box name="username_combo" tool_tip="Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ, которое вы выбрали при региÑтрации, например, «bobsmith12» или «Steller Sunshine»"/>
+ <text name="password_text">
+ Пароль:
+ </text>
+ <check_box label="Запомнить пароль" name="remember_check"/>
+ <button label="Войти" name="connect_btn"/>
+ <text name="mode_selection_text">
+ Режим:
+ </text>
+ <combo_box name="mode_combo" tool_tip="Выберите режим. ОÑновной – Ð´Ð»Ñ Ð±Ñ‹Ñтрого и проÑтого Ð¾Ð·Ð½Ð°ÐºÐ¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ñ Ð¸Ð³Ñ€Ð¾Ð¹, а также общениÑ. РаÑширенный – Ð´Ð»Ñ Ð´Ð¾Ñтупа к более широким возможноÑÑ‚Ñм.">
+ <combo_box.item label="ОÑновной" name="Basic"/>
+ <combo_box.item label="РаÑширенный" name="Advanced"/>
+ </combo_box>
+ <text name="start_location_text">
+ МеÑто Ñтарта:
+ </text>
+ <combo_box name="start_location_combo">
+ <combo_box.item label="ПоÑледнее меÑтоположение" name="MyLastLocation"/>
+ <combo_box.item label="Мой дом" name="MyHome"/>
+ <combo_box.item label="&lt;Введите название региона&gt;" name="Typeregionname"/>
+ </combo_box>
+ </layout_panel>
+ <layout_panel name="links">
+ <text name="create_new_account_text">
+ РегиÑтрациÑ
+ </text>
+ <text name="forgot_password_text">
+ Забыли Ð¸Ð¼Ñ Ð¸Ð»Ð¸ пароль?
+ </text>
+ <text name="login_help">
+ Ðужна помощь при входе?
+ </text>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_main_inventory.xml b/indra/newview/skins/default/xui/ru/panel_main_inventory.xml
new file mode 100644
index 0000000000..80a67371af
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_main_inventory.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Вещи" name="main inventory panel">
+ <panel.string name="ItemcountFetching">
+ Обнаружено [ITEM_COUNT] вещей... [FILTER]
+ </panel.string>
+ <panel.string name="ItemcountCompleted">
+ [ITEM_COUNT] вещей [FILTER]
+ </panel.string>
+ <text name="ItemcountText">
+ Вещи:
+ </text>
+ <filter_editor label="Фильтр Ð´Ð»Ñ Ð¸Ð½Ð²ÐµÐ½Ñ‚Ð°Ñ€Ñ" name="inventory search editor"/>
+ <tab_container name="inventory filter tabs">
+ <inventory_panel label="МОЙ ИÐВЕÐТÐРЬ" name="All Items"/>
+ <recent_inventory_panel label="ÐЕДÐÐ’ÐИЕ" name="Recent Items"/>
+ </tab_container>
+ <layout_stack name="bottom_panel">
+ <layout_panel name="options_gear_btn_panel">
+ <menu_button name="options_gear_btn" tool_tip="Показать дополнительные параметры"/>
+ </layout_panel>
+ <layout_panel name="add_btn_panel">
+ <button name="add_btn" tool_tip="Добавить новую вещь"/>
+ </layout_panel>
+ <layout_panel name="trash_btn_panel">
+ <dnd_button name="trash_btn" tool_tip="Удалить выбранную вещь"/>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_me.xml b/indra/newview/skins/default/xui/ru/panel_me.xml
new file mode 100644
index 0000000000..21a125af87
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_me.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Мой профиль" name="panel_me">
+ <panel label="МОЯ ПОДБОРКÐ" name="panel_picks"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_media_settings_general.xml b/indra/newview/skins/default/xui/ru/panel_media_settings_general.xml
new file mode 100644
index 0000000000..6dc435db20
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_media_settings_general.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Общие" name="Media Settings General">
+ <text name="home_label">
+ ДомашнÑÑ Ñтраница:
+ </text>
+ <text name="home_fails_whitelist_label">
+ (Эта Ñтраница не определена в белом ÑпиÑке)
+ </text>
+ <line_editor name="home_url" tool_tip="ДомашнÑÑ Ñтраница Ð´Ð»Ñ Ñтого медиа-иÑточника"/>
+ <text name="preview_label">
+ Предварительный проÑмотр
+ </text>
+ <text name="current_url_label">
+ Ð¢ÐµÐºÑƒÑ‰Ð°Ñ Ñтраница:
+ </text>
+ <text name="current_url" tool_tip="Ð¢ÐµÐºÑƒÑ‰Ð°Ñ Ñтраница Ð´Ð»Ñ Ñтого медиа-иÑточника" value=""/>
+ <button label="СброÑ" name="current_url_reset_btn"/>
+ <check_box initial_value="ложь" label="ÐвтоматичеÑкое зацикливание" name="auto_loop"/>
+ <check_box initial_value="ложь" label="Ð ÐµÐ°ÐºÑ†Ð¸Ñ Ð½Ð° первый щелчок" name="first_click_interact"/>
+ <check_box initial_value="ложь" label="Ðвтоувеличение" name="auto_zoom"/>
+ <check_box initial_value="ложь" label="ÐвтоматичеÑкое проигрывание" name="auto_play"/>
+ <text name="media_setting_note">
+ Примечание. Жители могут переопределÑть Ñту наÑтройку.
+ </text>
+ <check_box initial_value="ложь" label="ÐвтомаÑштабирование на объекте" name="auto_scale"/>
+ <text name="size_label">
+ Размер:
+ </text>
+ <text name="X_label">
+ X
+ </text>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_media_settings_permissions.xml b/indra/newview/skins/default/xui/ru/panel_media_settings_permissions.xml
new file mode 100644
index 0000000000..680cba9c14
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_media_settings_permissions.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="ÐаÑтроить" name="Media settings for controls">
+ <text name="controls_label">
+ Элементы управлениÑ:
+ </text>
+ <combo_box name="controls">
+ <combo_item name="Standard">
+ Стандарт
+ </combo_item>
+ <combo_item name="Mini">
+ Минимум
+ </combo_item>
+ </combo_box>
+ <text name="owner_label">
+ Владелец
+ </text>
+ <check_box initial_value="ложь" label="Разрешить навигацию и взаимодейÑтвие" name="perms_owner_interact"/>
+ <check_box initial_value="ложь" label="Панель ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð²Ð¸Ð´Ð½Ð°" name="perms_owner_control"/>
+ <text name="group_label">
+ Группа:
+ </text>
+ <check_box initial_value="ложь" label="Разрешить навигацию и взаимодейÑтвие" name="perms_group_interact"/>
+ <check_box initial_value="ложь" label="Панель ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð²Ð¸Ð´Ð½Ð°" name="perms_group_control"/>
+ <text name="anyone_label">
+ вÑем
+ </text>
+ <check_box initial_value="ложь" label="Разрешить навигацию и взаимодейÑтвие" name="perms_anyone_interact"/>
+ <check_box initial_value="ложь" label="Панель ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð²Ð¸Ð´Ð½Ð°" name="perms_anyone_control"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_media_settings_security.xml b/indra/newview/skins/default/xui/ru/panel_media_settings_security.xml
new file mode 100644
index 0000000000..6b30dc799c
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_media_settings_security.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="БезопаÑноÑть" name="Media Settings Security">
+ <check_box initial_value="ложь" label="Разрешить доÑтуп к ÑÑылкам только по шаблону" name="whitelist_enable"/>
+ <text name="home_url_fails_some_items_in_whitelist">
+ Пункты, не подходÑщие Ð´Ð»Ñ Ð´Ð¾Ð¼Ð°ÑˆÐ½ÐµÐ¹ Ñтраницы, отмечены знаком:
+ </text>
+ <button label="Добавить" name="whitelist_add"/>
+ <button label="Удалить" name="whitelist_del"/>
+ <text name="home_url_fails_whitelist">
+ Внимание! ДомашнÑÑ Ñтраница, ÑƒÐºÐ°Ð·Ð°Ð½Ð½Ð°Ñ Ð½Ð° вкладке «Общие», не входит в белый ÑпиÑок. Она будет недоÑтупна до тех пор, пока не будет внеÑена Ð¿Ñ€Ð°Ð²Ð¸Ð»ÑŒÐ½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ.
+ </text>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_navigation_bar.xml b/indra/newview/skins/default/xui/ru/panel_navigation_bar.xml
new file mode 100644
index 0000000000..5e3de180f9
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_navigation_bar.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="navigation_bar">
+ <layout_stack name="nvp_stack">
+ <layout_panel name="navigation_layout_panel">
+ <panel name="navigation_panel">
+ <pull_button name="back_btn" tool_tip="ВернутьÑÑ Ð² предыдущее меÑто"/>
+ <pull_button name="forward_btn" tool_tip="Перейти в Ñледующее меÑто"/>
+ <button name="home_btn" tool_tip="Ð¢ÐµÐ»ÐµÐ¿Ð¾Ñ€Ñ‚Ð°Ñ†Ð¸Ñ Ð´Ð¾Ð¼Ð¾Ð¹"/>
+ <location_input label="МеÑто" name="location_combo"/>
+ </panel>
+ </layout_panel>
+ <layout_panel name="favorites_layout_panel">
+ <favorites_bar name="favorite" tool_tip="ПеретаÑкивайте Ñюда закладки, чтобы было удобнее переходить в любимые меÑта в Second Life!">
+ <label name="favorites_bar_label" tool_tip="ПеретаÑкивайте Ñюда закладки, чтобы было удобнее переходить в любимые меÑта в Second Life!">
+ Избранное
+ </label>
+ <more_button name="&gt;&gt;" tool_tip="Показать больше избранного">
+ Больше ▼
+ </more_button>
+ </favorites_bar>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_nearby_chat.xml b/indra/newview/skins/default/xui/ru/panel_nearby_chat.xml
new file mode 100644
index 0000000000..8e3aac38d2
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_nearby_chat.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="nearby_chat">
+ <check_box label="Переводить чат" name="translate_chat_checkbox"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_nearby_chat_bar.xml b/indra/newview/skins/default/xui/ru/panel_nearby_chat_bar.xml
new file mode 100644
index 0000000000..804ba7def7
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_nearby_chat_bar.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="chat_bar">
+ <line_editor label="Щелкните здеÑÑŒ Ð´Ð»Ñ Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ" name="chat_box" tool_tip="Ðажмите Enter, чтобы Ñказать, Ctrl+Enter, чтобы прокричать"/>
+ <button name="show_nearby_chat" tool_tip="Показать/Ñкрыть лог локального чата"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_nearby_media.xml b/indra/newview/skins/default/xui/ru/panel_nearby_media.xml
new file mode 100644
index 0000000000..3b23fc78f5
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_nearby_media.xml
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="nearby_media">
+ <string name="media_item_count_format">
+ (%ld предметов Ñ Ð¼ÐµÐ´Ð¸Ð°)
+ </string>
+ <string name="empty_item_text">
+ &lt;пуÑто&gt;
+ </string>
+ <string name="parcel_media_name">
+ Потоковое видео на учаÑтке
+ </string>
+ <string name="parcel_audio_name">
+ Потоковый звук на учаÑтке
+ </string>
+ <string name="playing_suffix">
+ (проигрываетÑÑ)
+ </string>
+ <panel name="minimized_controls">
+ <button label="Выключить вÑе" name="all_nearby_media_disable_btn" tool_tip="Выключить вÑе ближайшее медиа"/>
+ <button label="Включить вÑе" name="all_nearby_media_enable_btn" tool_tip="Включить вÑе ближайшее медиа"/>
+ <button name="open_prefs_btn" tool_tip="Открыть наÑтройки медиа"/>
+ <button label="Больше &gt;&gt;" label_selected="&lt;&lt; Меньше" name="more_btn" tool_tip="Дополнительное управление"/>
+ </panel>
+ <panel name="nearby_media_panel">
+ <text name="nearby_media_title">
+ Ближайшее медиа
+ </text>
+ <text name="show_text">
+ Показать:
+ </text>
+ <combo_box name="show_combo">
+ <combo_box.item label="Ð’Ñе" name="All"/>
+ <combo_box.item label="Ðа Ñтом учаÑтке" name="WithinParcel"/>
+ <combo_box.item label="За пределами Ñтого учаÑтка" name="OutsideParcel"/>
+ <combo_box.item label="Ðа других аватарах" name="OnOthers"/>
+ </combo_box>
+ <scroll_list name="media_list">
+ <scroll_list.columns label="РаÑÑтоÑние" name="media_proximity"/>
+ <scroll_list.columns label="ВидимоÑть" name="media_visibility"/>
+ <scroll_list.columns label="КлаÑÑ" name="media_class"/>
+ <scroll_list.columns label="Ðазвание" name="media_name"/>
+ <scroll_list.columns label="Отладка" name="media_debug"/>
+ </scroll_list>
+ <panel name="media_controls_panel">
+ <layout_stack name="media_controls">
+ <layout_panel name="stop">
+ <button name="stop_btn" tool_tip="ОÑтановить выбранное медиа"/>
+ </layout_panel>
+ <layout_panel name="play">
+ <button name="play_btn" tool_tip="Проиграть выбранное медиа"/>
+ </layout_panel>
+ <layout_panel name="pause">
+ <button name="pause_btn" tool_tip="ПриоÑтановить выбранное медиа"/>
+ </layout_panel>
+ <layout_panel name="volume_slider_ctrl">
+ <slider_bar initial_value="0.5" name="volume_slider" tool_tip="ГромкоÑть звука выбранного медиа"/>
+ </layout_panel>
+ <layout_panel name="mute">
+ <button name="mute_btn" tool_tip="Заглушить выбранное медиа"/>
+ </layout_panel>
+ <layout_panel name="zoom">
+ <button name="zoom_btn" tool_tip="Приблизить камеру к выбранному медиа"/>
+ </layout_panel>
+ <layout_panel name="unzoom">
+ <button name="unzoom_btn" tool_tip="Отдалить камеру от выбранного медиа"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_notify_textbox.xml b/indra/newview/skins/default/xui/ru/panel_notify_textbox.xml
new file mode 100644
index 0000000000..1ac88a01b3
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_notify_textbox.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="instant_message" name="panel_notify_textbox">
+ <string name="message_max_lines_count" value="7"/>
+ <panel label="info_panel" name="info_panel">
+ <text_editor name="message" value="Ñообщение"/>
+ </panel>
+ <panel label="control_panel" name="control_panel">
+ <button label="ОтоÑлать" name="btn_submit"/>
+ <button label="Игнорировать" name="ignore_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_online_status_toast.xml b/indra/newview/skins/default/xui/ru/panel_online_status_toast.xml
new file mode 100644
index 0000000000..fdc489f375
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_online_status_toast.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="friend_online_status" name="friend_online_status"/>
diff --git a/indra/newview/skins/default/xui/ru/panel_outbox_inventory.xml b/indra/newview/skins/default/xui/ru/panel_outbox_inventory.xml
new file mode 100644
index 0000000000..0095d48af9
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_outbox_inventory.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<outbox_inventory_panel name="inventory_outbox" tool_tip="Перетащите вещи Ñюда, чтобы подготовить их Ð´Ð»Ñ Ñ€Ð°Ð·Ð¼ÐµÑ‰ÐµÐ½Ð¸Ñ Ð½Ð° витрине вашего магазина"/>
diff --git a/indra/newview/skins/default/xui/ru/panel_outfit_edit.xml b/indra/newview/skins/default/xui/ru/panel_outfit_edit.xml
new file mode 100644
index 0000000000..91c03342a7
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_outfit_edit.xml
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- Side tray Outfit Edit panel -->
+<panel name="outfit_edit">
+ <string name="No Outfit" value="Ðет коÑтюма"/>
+ <string name="unsaved_changes" value="ÐеÑохраненные изменениÑ"/>
+ <string name="now_editing" value="Ð¡ÐµÐ¹Ñ‡Ð°Ñ Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€ÑƒÐµÑ‚ÑÑ"/>
+ <panel.string name="not_available">
+ (нет)
+ </panel.string>
+ <panel.string name="unknown">
+ (неизвеÑтно)
+ </panel.string>
+ <string name="Filter.All" value="Ð’Ñе"/>
+ <string name="Filter.Clothes/Body" value="Одежда/тело"/>
+ <string name="Filter.Objects" value="Объекты"/>
+ <string name="Filter.Clothing" value="Одежда"/>
+ <string name="Filter.Bodyparts" value="ЧаÑти тела"/>
+ <string name="replace_body_part" value="Щелкните Ð´Ð»Ñ Ð·Ð°Ð¼ÐµÐ½Ñ‹ текущей фигуры"/>
+ <text name="title" value="Изменить коÑтюм"/>
+ <panel name="header_panel">
+ <panel name="outfit_name_and_status">
+ <text name="status" value="Ð¡ÐµÐ¹Ñ‡Ð°Ñ Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€ÑƒÐµÑ‚ÑÑ…"/>
+ <text name="curr_outfit_name" value="[Текущий коÑтюм]"/>
+ </panel>
+ </panel>
+ <layout_stack name="im_panels">
+ <layout_panel name="outfit_wearables_panel">
+ <layout_stack name="filter_panels">
+ <layout_panel name="add_button_and_combobox">
+ <button label="Добавить…" name="show_add_wearables_btn" tool_tip="Открыть/закрыть"/>
+ </layout_panel>
+ <layout_panel name="filter_panel">
+ <filter_editor label="Фильтр Ð´Ð»Ñ Ð½Ð¾Ñимого инвентарÑ" name="look_item_filter"/>
+ </layout_panel>
+ </layout_stack>
+ </layout_panel>
+ <layout_panel name="add_wearables_panel">
+ <button label="ÐоÑÐ¸Ð¼Ð°Ñ Ð²ÐµÑ‰ÑŒ" name="plus_btn"/>
+ </layout_panel>
+ </layout_stack>
+ <panel name="no_add_wearables_button_bar">
+ <button name="shop_btn_1" tool_tip="ПоÑетите магазин Second Life. Также можно выбрать предмет надетой одежды и щелкнуть здеÑÑŒ, чтобы найти что-то похожее"/>
+ </panel>
+ <panel name="add_wearables_button_bar">
+ <button name="shop_btn_2" tool_tip="ПоÑетите магазин Second Life. Также можно выбрать предмет надетой одежды и щелкнуть здеÑÑŒ, чтобы найти что-то похожее"/>
+ </panel>
+ <panel name="save_revert_button_bar">
+ <layout_stack name="button_bar_ls">
+ <layout_panel name="save_btn_lp">
+ <button label="Сохранить" name="save_btn"/>
+ </layout_panel>
+ <layout_panel name="revert_btn_lp">
+ <button label="Отменить изменениÑ" name="revert_btn" tool_tip="ВернутьÑÑ Ðº поÑледней Ñохраненной верÑии"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_outfits_inventory.xml b/indra/newview/skins/default/xui/ru/panel_outfits_inventory.xml
new file mode 100644
index 0000000000..4d0e13fca2
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_outfits_inventory.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Вещи" name="Outfits">
+ <panel.string name="wear_outfit_tooltip">
+ Ðадеть выбранный коÑтюм
+ </panel.string>
+ <panel.string name="wear_items_tooltip">
+ Ðадеть выбранные вещи
+ </panel.string>
+ <tab_container name="appearance_tabs">
+ <panel label="МОИ КОСТЮМЫ" name="outfitslist_tab"/>
+ <panel label="ÐÐДЕТО" name="cof_tab"/>
+ </tab_container>
+ <panel name="bottom_panel">
+ <layout_stack name="bottom_panel_ls">
+ <layout_panel name="save_btn_lp">
+ <button label="Сохранить как" name="save_btn"/>
+ </layout_panel>
+ <layout_panel name="wear_btn_lp">
+ <button label="Ðадеть" name="wear_btn"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_outfits_inventory_gear_default.xml b/indra/newview/skins/default/xui/ru/panel_outfits_inventory_gear_default.xml
new file mode 100644
index 0000000000..96f4b4a893
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_outfits_inventory_gear_default.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_gear_default">
+ <menu_item_call label="Сменить текущий коÑтюм" name="wear"/>
+ <menu_item_call label="Убрать из текущего коÑтюма" name="remove"/>
+ <menu_item_call label="Переименовать" name="rename"/>
+ <menu_item_call label="Удалить ÑÑылку" name="remove_link"/>
+ <menu_item_call label="Удалить коÑтюм" name="delete"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/ru/panel_outfits_list.xml b/indra/newview/skins/default/xui/ru/panel_outfits_list.xml
new file mode 100644
index 0000000000..74551e4274
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_outfits_list.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="Outfits">
+ <accordion name="outfits_accordion">
+ <no_matched_tabs_text name="no_matched_outfits_msg" value="Ðе нашли того, что вам нужно? ВоÑпользуйтеÑÑŒ [secondlife:///app/search/all/[SEARCH_TERM] поиÑком]."/>
+ <no_visible_tabs_text name="no_outfits_msg" value="У Ð²Ð°Ñ Ð¿Ð¾ÐºÐ° нет никаких коÑтюмов. ВоÑпользуйтеÑÑŒ [secondlife:///app/search/all/ поиÑком]."/>
+ </accordion>
+ <panel name="bottom_panel">
+ <menu_button name="options_gear_btn" tool_tip="Показать дополнительные параметры"/>
+ <button name="trash_btn" tool_tip="Удалить выбранный коÑтюм"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_outfits_wearing.xml b/indra/newview/skins/default/xui/ru/panel_outfits_wearing.xml
new file mode 100644
index 0000000000..7ed6bf35c0
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_outfits_wearing.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="Wearing">
+ <panel name="bottom_panel">
+ <menu_button name="options_gear_btn" tool_tip="Показать дополнительные параметры"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_people.xml b/indra/newview/skins/default/xui/ru/panel_people.xml
new file mode 100644
index 0000000000..607921f2d6
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_people.xml
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- Side tray panel -->
+<panel label="Люди" name="people_panel">
+ <string name="no_recent_people" value="Ðет людей, говоривших недавно. Ищете, Ñ ÐºÐµÐ¼ пообщатьÑÑ? ВоÑпользуйтеÑÑŒ [secondlife:///app/search/people поиÑком] или [secondlife:///app/worldmap картой мира]."/>
+ <string name="no_filtered_recent_people" value="Ðе нашли того, что вам нужно? ВоÑпользуйтеÑÑŒ [secondlife:///app/search/people/[SEARCH_TERM] поиÑком]."/>
+ <string name="no_one_near" value="Ðикого нет Ñ€Ñдом. Ищете, Ñ ÐºÐµÐ¼ пообщатьÑÑ? ВоÑпользуйтеÑÑŒ [secondlife:///app/search/people поиÑком] или [secondlife:///app/worldmap картой мира]."/>
+ <string name="no_one_filtered_near" value="Ðе нашли того, что вам нужно? ВоÑпользуйтеÑÑŒ [secondlife:///app/search/people/[SEARCH_TERM] поиÑком]."/>
+ <string name="no_friends_online" value="Ðет друзей онлайн"/>
+ <string name="no_friends" value="Ðет друзей"/>
+ <string name="no_friends_msg">
+ Ðайдите друзей Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ [secondlife:///app/search/people поиÑка] или добавьте жителей в Ð´Ñ€ÑƒÐ·ÑŒÑ Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ правой кнопки мыши.
+Ищете, Ñ ÐºÐµÐ¼ пообщатьÑÑ? ВоÑпользуйтеÑÑŒ [secondlife:///app/worldmap картой мира].
+ </string>
+ <string name="no_filtered_friends_msg">
+ Ðе нашли того, что вам нужно? ВоÑпользуйтеÑÑŒ [secondlife:///app/search/people/[SEARCH_TERM] поиÑком].
+ </string>
+ <string name="people_filter_label" value="Фильтр Ð´Ð»Ñ Ð»ÑŽÐ´ÐµÐ¹"/>
+ <string name="groups_filter_label" value="Фильтр Ð´Ð»Ñ Ð³Ñ€ÑƒÐ¿Ð¿"/>
+ <string name="no_filtered_groups_msg" value="Ðе нашли того, что вам нужно? ВоÑпользуйтеÑÑŒ [secondlife:///app/search/groups/[SEARCH_TERM] поиÑком]."/>
+ <string name="no_groups_msg" value="Ищете группу, чтобы приÑоединитьÑÑ Ðº ней? ВоÑпользуйтеÑÑŒ [secondlife:///app/search/groups поиÑком]."/>
+ <string name="MiniMapToolTipMsg" value="[REGION](Двойной щелчок открывает карту, shift+перетÑгивание – обзор)"/>
+ <string name="AltMiniMapToolTipMsg" value="[REGION](Двойной щелчок – телепортациÑ, shift+перетÑгивание – обзор)"/>
+ <filter_editor label="Фильтр" name="filter_input"/>
+ <tab_container name="tabs">
+ <panel label="РЯДОМ" name="nearby_panel">
+ <panel label="bottom_panel" name="bottom_panel">
+ <menu_button name="nearby_view_sort_btn" tool_tip="Опции"/>
+ <button name="add_friend_btn" tool_tip="Добавить выбранного Ð¶Ð¸Ñ‚ÐµÐ»Ñ Ð² ÑпиÑок друзей"/>
+ </panel>
+ </panel>
+ <panel label="МОИ ДРУЗЬЯ" name="friends_panel">
+ <accordion name="friends_accordion">
+ <accordion_tab name="tab_online" title="Онлайн"/>
+ <accordion_tab name="tab_all" title="Ð’Ñе"/>
+ </accordion>
+ <panel label="bottom_panel" name="bottom_panel">
+ <layout_stack name="bottom_panel">
+ <layout_panel name="options_gear_btn_panel">
+ <menu_button name="friends_viewsort_btn" tool_tip="Показать дополнительные параметры"/>
+ </layout_panel>
+ <layout_panel name="add_btn_panel">
+ <button name="add_btn" tool_tip="Предложить жителю дружбу"/>
+ </layout_panel>
+ <layout_panel name="trash_btn_panel">
+ <dnd_button name="del_btn" tool_tip="Удалить выбранного Ð¶Ð¸Ñ‚ÐµÐ»Ñ Ð¸Ð· ÑпиÑка друзей"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+ </panel>
+ <panel label="МОИ ГРУППЫ" name="groups_panel">
+ <panel label="bottom_panel" name="bottom_panel">
+ <menu_button name="groups_viewsort_btn" tool_tip="Опции"/>
+ <button name="plus_btn" tool_tip="ПриÑоединитьÑÑ Ðº группе/Ñоздать новую группу"/>
+ <button name="activate_btn" tool_tip="Ðктивировать выбранную группу"/>
+ </panel>
+ </panel>
+ <panel label="ÐЕДÐÐ’ÐИЕ" name="recent_panel">
+ <panel label="bottom_panel" name="bottom_panel">
+ <menu_button name="recent_viewsort_btn" tool_tip="Опции"/>
+ <button name="add_friend_btn" tool_tip="Добавить выбранного Ð¶Ð¸Ñ‚ÐµÐ»Ñ Ð² ÑпиÑок друзей"/>
+ </panel>
+ </panel>
+ </tab_container>
+ <panel name="button_bar">
+ <layout_stack name="bottom_bar_ls">
+ <layout_panel name="view_profile_btn_lp">
+ <button label="Профиль" name="view_profile_btn" tool_tip="Показать изображение, группы и прочую информацию о жителе"/>
+ </layout_panel>
+ <layout_panel name="im_btn_lp">
+ <button label="IM" name="im_btn" tool_tip="Ðачать ÑÐµÐ°Ð½Ñ IM"/>
+ </layout_panel>
+ <layout_panel name="call_btn_lp">
+ <button label="Звонок" name="call_btn" tool_tip="Позвонить Ñтому жителю"/>
+ </layout_panel>
+ <layout_panel name="share_btn_lp">
+ <button label="ПоделитьÑÑ" name="share_btn" tool_tip="ПоделитьÑÑ Ð¾Ð±ÑŠÐµÐºÑ‚Ð¾Ð¼ из инвентарÑ"/>
+ </layout_panel>
+ <layout_panel name="teleport_btn_lp">
+ <button label="ТелепортациÑ" name="teleport_btn" tool_tip="Предложить телепортацию"/>
+ </layout_panel>
+ </layout_stack>
+ <layout_stack name="bottom_bar_ls1">
+ <layout_panel name="group_info_btn_lp">
+ <button label="Профиль группы" name="group_info_btn" tool_tip="Показать информацию о группе"/>
+ </layout_panel>
+ <layout_panel name="chat_btn_lp">
+ <button label="Групповой чат" name="chat_btn" tool_tip="Открыть ÑÐµÐ°Ð½Ñ Ñ‡Ð°Ñ‚Ð°"/>
+ </layout_panel>
+ <layout_panel name="group_call_btn_lp">
+ <button label="Звонок группе" name="group_call_btn" tool_tip="Позвонить Ñтой группе"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_pick_info.xml b/indra/newview/skins/default/xui/ru/panel_pick_info.xml
new file mode 100644
index 0000000000..373cf211fb
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_pick_info.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_pick_info">
+ <text name="title" value="О подборке"/>
+ <scroll_container name="profile_scroll">
+ <panel name="scroll_content_panel">
+ <text_editor name="pick_name" value="[название]"/>
+ <text_editor name="pick_location" value="[загрузка...]"/>
+ <text_editor name="pick_desc" value="[опиÑание]"/>
+ </panel>
+ </scroll_container>
+ <panel name="buttons">
+ <layout_stack name="layout_stack1">
+ <layout_panel name="layout_panel1">
+ <button label="Телепорт" name="teleport_btn"/>
+ </layout_panel>
+ <layout_panel name="show_on_map_btn_lp">
+ <button label="Карта" name="show_on_map_btn"/>
+ </layout_panel>
+ <layout_panel name="edit_btn_lp">
+ <button label="Изменить" name="edit_btn"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_picks.xml b/indra/newview/skins/default/xui/ru/panel_picks.xml
new file mode 100644
index 0000000000..d6770e0eeb
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_picks.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Подборка" name="panel_picks">
+ <string name="no_picks" value="Ðет подборки"/>
+ <string name="no_classifieds" value="Ðет рекламы"/>
+ <accordion name="accordion">
+ <accordion_tab name="tab_picks" title="Подборка"/>
+ <accordion_tab name="tab_classifieds" title="Реклама"/>
+ </accordion>
+ <panel label="bottom_panel" name="edit_panel">
+ <layout_stack name="edit_panel_ls">
+ <layout_panel name="gear_menu_btn">
+ <button name="new_btn" tool_tip="Создать подборку или рекламу на Ñтом меÑте"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+ <panel name="buttons_cucks">
+ <layout_stack name="buttons_cucks_ls">
+ <layout_panel name="info_btn_lp">
+ <button label="Данные" name="info_btn" tool_tip="Показать данные о подборке"/>
+ </layout_panel>
+ <layout_panel name="teleport_btn_lp">
+ <button label="ТелепортироватьÑÑ" name="teleport_btn" tool_tip="Ð¢ÐµÐ»ÐµÐ¿Ð¾Ñ€Ñ‚Ð°Ñ†Ð¸Ñ Ð² ÑоответÑтвующую облаÑть"/>
+ </layout_panel>
+ <layout_panel name="show_on_map_btn_lp">
+ <button label="Карта" name="show_on_map_btn" tool_tip="Показать ÑоответÑтвующую облаÑть на карте мира"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_place_profile.xml b/indra/newview/skins/default/xui/ru/panel_place_profile.xml
new file mode 100644
index 0000000000..b486b918ed
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_place_profile.xml
@@ -0,0 +1,118 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="place_profile">
+ <string name="on" value="Вкл."/>
+ <string name="off" value="Выкл."/>
+ <string name="anyone" value="Ð’Ñе"/>
+ <string name="available" value="доÑтупно"/>
+ <string name="allocated" value="раÑположено"/>
+ <string name="title_place" value="Профиль меÑта"/>
+ <string name="title_teleport_history" value="ИÑÑ‚Ð¾Ñ€Ð¸Ñ Ñ‚ÐµÐ»ÐµÐ¿Ð¾Ñ€Ñ‚Ð¾Ð²"/>
+ <string name="not_available" value="(нет)"/>
+ <string name="unknown" value="(неизвеÑтно)"/>
+ <string name="public" value="(публичное)"/>
+ <string name="none_text" value="(нет)"/>
+ <string name="sale_pending_text" value="(Ожидание продажи)"/>
+ <string name="group_owned_text" value="(СобÑтвенноÑть группы)"/>
+ <string name="price_text" value="L$"/>
+ <string name="area_text" value="м²"/>
+ <string name="all_residents_text" value="Ð’Ñе жители"/>
+ <string name="group_text" value="Группа"/>
+ <string name="can_resell">
+ ÐŸÑ€Ð¸Ð¾Ð±Ñ€ÐµÑ‚ÐµÐ½Ð½Ð°Ñ Ð² Ñтом регионе Ð·ÐµÐ¼Ð»Ñ Ð¼Ð¾Ð¶ÐµÑ‚ быть перепродана.
+ </string>
+ <string name="can_not_resell">
+ ÐŸÑ€Ð¸Ð¾Ð±Ñ€ÐµÑ‚ÐµÐ½Ð½Ð°Ñ Ð² Ñтом регионе Ð·ÐµÐ¼Ð»Ñ Ð½Ðµ может быть перепродана.
+ </string>
+ <string name="can_change">
+ ÐŸÑ€Ð¸Ð¾Ð±Ñ€ÐµÑ‚ÐµÐ½Ð½Ð°Ñ Ð² Ñтом регионе Ð·ÐµÐ¼Ð»Ñ Ð¼Ð¾Ð¶ÐµÑ‚ быть объединена или разделена.
+ </string>
+ <string name="can_not_change">
+ ÐŸÑ€Ð¸Ð¾Ð±Ñ€ÐµÑ‚ÐµÐ½Ð½Ð°Ñ Ð² Ñтом регионе Ð·ÐµÐ¼Ð»Ñ Ð½Ðµ может быть объединена или разделена.
+ </string>
+ <string name="server_update_text">
+ Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ меÑте недоÑтупна без Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ñервера.
+ </string>
+ <string name="server_error_text">
+ Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾Ð± Ñтом меÑте ÑÐµÐ¹Ñ‡Ð°Ñ Ð½ÐµÐ´Ð¾Ñтупна. Повторите попытку позже.
+ </string>
+ <string name="server_forbidden_text">
+ Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾Ð± Ñтом меÑте недоÑтупна из-за ограничений доÑтупа. СоглаÑуйте Ñвой уровень доÑтупа Ñ Ð²Ð»Ð°Ð´ÐµÐ»ÑŒÑ†ÐµÐ¼ учаÑтка.
+ </string>
+ <string name="acquired_date">
+ [wkday,datetime,local], [day,datetime,local] [mth,datetime,local] [year,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local]
+ </string>
+ <button name="back_btn" tool_tip="Ðазад"/>
+ <text name="title" value="Профиль меÑта"/>
+ <scroll_container name="place_scroll">
+ <panel name="scrolling_panel">
+ <text name="region_title" value="Образец_региона"/>
+ <text name="parcel_title" value="Образец_учаÑтка, название Long (145, 228, 26)"/>
+ <expandable_text name="description" value="Du waltz die spritz"/>
+ <text name="owner_label" value="Владелец:"/>
+ <text name="owner_value" value="ÐлекÑей СверхдлинноеимÑнов"/>
+ <text name="maturity_value" value="неизвеÑтен"/>
+ <accordion name="advanced_info_accordion">
+ <accordion_tab name="parcel_characteristics_tab" title="УчаÑток">
+ <panel name="parcel_characteristics_panel">
+ <text name="rating_label" value="Рейтинг:"/>
+ <text name="rating_value" value="неизвеÑтен"/>
+ <text name="voice_label" value="ГолоÑ:"/>
+ <text name="voice_value" value="Вкл."/>
+ <text name="fly_label" value="Полет:"/>
+ <text name="fly_value" value="Вкл."/>
+ <text name="push_label" value="Толкание:"/>
+ <text name="push_value" value="Выкл."/>
+ <text name="build_label" value="СтроительÑтво:"/>
+ <text name="build_value" value="Вкл."/>
+ <text name="scripts_label" value="Скрипты:"/>
+ <text name="scripts_value" value="Вкл."/>
+ <text name="damage_label" value="ПовреждениÑ:"/>
+ <text name="damage_value" value="Выкл."/>
+ <text name="see_avatars_label" value="Видеть аватары:"/>
+ <text name="see_avatars_value" value="Выкл."/>
+ <button label="О земле" name="about_land_btn"/>
+ </panel>
+ </accordion_tab>
+ <accordion_tab name="region_information_tab" title="Регион">
+ <panel name="region_information_panel">
+ <text name="region_name_label" value="Регион:"/>
+ <text name="region_name" value="ЛоÑоÑево"/>
+ <text name="region_type_label" value="Тип:"/>
+ <text name="region_type" value="ЛоÑоÑÑŒ"/>
+ <text name="region_rating_label" value="Рейтинг:"/>
+ <text name="region_rating" value="ВзроÑлый"/>
+ <text name="region_owner_label" value="Владелец:"/>
+ <text name="region_owner" value="лоÑоÑÑŒ Ван ЛоÑоÑÑŒ очень длинное Ð¸Ð¼Ñ Ð»Ð¾ÑоÑÑŒ"/>
+ <text name="region_group_label" value="Группа:"/>
+ <text name="region_group">
+ Крепкий лоÑоÑÑŒ из ЛоÑоÑево под УÑть-ЛоÑоÑинÑком
+ </text>
+ <button label="Регион/землевладение" name="region_info_btn"/>
+ </panel>
+ </accordion_tab>
+ <accordion_tab name="estate_information_tab" title="Землевладение">
+ <panel name="estate_information_panel">
+ <text name="estate_name_label" value="Землевладение:"/>
+ <text name="estate_rating_label" value="Рейтинг:"/>
+ <text name="estate_owner_label" value="Владелец:"/>
+ <text name="estate_owner" value="Длина имени владельца теÑта (длинное имÑ)"/>
+ <text name="covenant_label" value="Соглашение:"/>
+ </panel>
+ </accordion_tab>
+ <accordion_tab name="sales_tab" title="Ð”Ð»Ñ Ð¿Ñ€Ð¾Ð´Ð°Ð¶Ð¸">
+ <panel name="sales_panel">
+ <text name="sales_price_label" value="Цена:"/>
+ <text name="area_label" value="Площадь:"/>
+ <text name="traffic_label" value="ПоÑещаемоÑть:"/>
+ <text name="primitives_label" value="Примитивы:"/>
+ <text name="parcel_scripts_label" value="Скрипты:"/>
+ <text name="terraform_limits_label" value="Терраформирование:"/>
+ <text name="subdivide_label" value="СпоÑобноÑть разделениÑ/объединениÑ:"/>
+ <text name="resale_label" value="СпоÑобноÑть перепродажи:"/>
+ <text name="sale_to_label" value="Продажа длÑ:"/>
+ </panel>
+ </accordion_tab>
+ </accordion>
+ </panel>
+ </scroll_container>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_places.xml b/indra/newview/skins/default/xui/ru/panel_places.xml
new file mode 100644
index 0000000000..54837d3c0b
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_places.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="МеÑта" name="places panel">
+ <string name="landmarks_tab_title" value="МОИ ЗÐКЛÐДКИ"/>
+ <string name="teleport_history_tab_title" value="ИСТОРИЯ ТЕЛЕПОРТÐЦИЙ"/>
+ <filter_editor label="Фильтр Ð´Ð»Ñ Ð·Ð°ÐºÐ»Ð°Ð´Ð¾Ðº" name="Filter"/>
+ <panel name="button_panel">
+ <layout_stack name="bottom_bar_ls0">
+ <layout_panel name="lp1">
+ <layout_stack name="bottom_bar_ls1">
+ <layout_panel name="teleport_btn_lp">
+ <button label="ТелепортациÑ" name="teleport_btn" tool_tip="ТелепортироватьÑÑ Ð² выбранную облаÑть"/>
+ </layout_panel>
+ <layout_panel name="chat_btn_lp">
+ <button label="Карта" name="map_btn" tool_tip="Показать ÑоответÑтвующую облаÑть на карте мира"/>
+ </layout_panel>
+ </layout_stack>
+ </layout_panel>
+ <layout_panel name="lp2">
+ <layout_stack name="bottom_bar_ls3">
+ <layout_panel name="edit_btn_lp">
+ <button label="Изменить" name="edit_btn" tool_tip="Редактировать информацию о закладке"/>
+ </layout_panel>
+ <layout_panel name="overflow_btn_lp">
+ <menu_button name="overflow_btn" tool_tip="Показать дополнительные параметры"/>
+ </layout_panel>
+ </layout_stack>
+ <layout_stack name="bottom_bar_profile_ls">
+ <layout_panel name="profile_btn_lp">
+ <button label="Профиль" name="profile_btn" tool_tip="Показать профиль меÑта"/>
+ </layout_panel>
+ </layout_stack>
+ <layout_stack name="bottom_bar_close_ls3">
+ <layout_panel name="close_btn_lp">
+ <button label="Закрыть" name="close_btn"/>
+ </layout_panel>
+ </layout_stack>
+ </layout_panel>
+ </layout_stack>
+ <layout_stack name="bottom_bar_ls2">
+ <layout_panel name="save_btn_lp">
+ <button label="Сохранить" name="save_btn"/>
+ </layout_panel>
+ <layout_panel name="cancel_btn_lp">
+ <button label="Отмена" name="cancel_btn"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_postcard_message.xml b/indra/newview/skins/default/xui/ru/panel_postcard_message.xml
new file mode 100644
index 0000000000..70587d8090
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_postcard_message.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_postcard_message">
+ <text name="to_label">
+ Кому:
+ </text>
+ <text name="name_label">
+ От:
+ </text>
+ <text name="subject_label">
+ Тема:
+ </text>
+ <line_editor label="Введите тему пиÑьма." name="subject_form"/>
+ <text name="msg_label">
+ Сообщение:
+ </text>
+ <text_editor name="msg_form">
+ Введите текÑÑ‚ пиÑьма.
+ </text_editor>
+ <button label="Отмена" name="cancel_btn"/>
+ <button label="ПоÑлать" name="send_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_postcard_settings.xml b/indra/newview/skins/default/xui/ru/panel_postcard_settings.xml
new file mode 100644
index 0000000000..dc9d59008f
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_postcard_settings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_postcard_settings">
+ <combo_box label="Размер" name="postcard_size_combo">
+ <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>
+ <layout_stack name="postcard_image_params_ls">
+ <layout_panel name="postcard_image_size_lp">
+ <spinner label="Ширина" name="postcard_snapshot_width"/>
+ <spinner label="Ð’Ñ‹Ñота" name="postcard_snapshot_height"/>
+ <check_box label="СохранÑть пропорции" name="postcard_keep_aspect_check"/>
+ </layout_panel>
+ <layout_panel name="postcard_image_format_quality_lp">
+ <slider label="КачеÑтво изображениÑ" name="image_quality_slider"/>
+ <text name="image_quality_level">
+ ([QLVL])
+ </text>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/ru/panel_preferences_advanced.xml
new file mode 100644
index 0000000000..7d8ee96924
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_preferences_advanced.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<panel label="Дополнительно" name="advanced">
+ <panel.string name="aspect_ratio_text">
+ [NUM]:[DEN]
+ </panel.string>
+ <text name="Cache:">
+ КÑш:
+ </text>
+ <spinner label="Размер кÑша (64 - 9984 МБ)" name="cachesizespinner"/>
+ <text name="text_box5">
+ МБ
+ </text>
+ <button label="ОчиÑтить кÑш" label_selected="ОчиÑтить кÑш" name="clear_cache"/>
+ <text name="Cache location">
+ РаÑположение кÑша:
+ </text>
+ <button label="Обзор" label_selected="Обзор" name="set_cache"/>
+ <button label="РаÑположение по умолчанию" label_selected="РаÑположение по умолчанию" name="default_cache_location"/>
+ <text name="UI Size:">
+ ИнтерфейÑ:
+ </text>
+ <check_box label="Показывать ошибки Ñкрипта в:" name="show_script_errors"/>
+ <radio_group name="show_location">
+ <radio_item label="локальном чате" name="0"/>
+ <radio_item label="отдельном окне" name="1"/>
+ </radio_group>
+ <check_box label="Разрешить работу неÑкольких клиентов" name="allow_multiple_viewer_check"/>
+ <check_box label="Выбор Ñетки при входе" name="show_grid_selection_check"/>
+ <check_box label="Показывать раÑширенное меню" name="show_advanced_menu_check"/>
+ <check_box label="Показывать меню разработчика" name="show_develop_menu_check"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_preferences_alerts.xml b/indra/newview/skins/default/xui/ru/panel_preferences_alerts.xml
new file mode 100644
index 0000000000..9d7ae546fd
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_preferences_alerts.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Ð’Ñплывающие окна" name="popups">
+ <text name="tell_me_label">
+ Сообщать мне:
+ </text>
+ <check_box label="о раÑходах и доходах" name="notify_money_change_checkbox"/>
+ <check_box label="о входе и выходе моих друзей" name="friends_online_notify_checkbox"/>
+ <text name="show_label">
+ Ð’Ñегда показывать:
+ </text>
+ <text name="dont_show_label">
+ Ðикогда не показывать:
+ </text>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_preferences_chat.xml b/indra/newview/skins/default/xui/ru/panel_preferences_chat.xml
new file mode 100644
index 0000000000..a9d5569c7f
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_preferences_chat.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="ТекÑтовый чат" name="chat">
+ <text name="font_size">
+ Размер шрифта:
+ </text>
+ <radio_group name="chat_font_size">
+ <radio_item label="Мелкий" name="radio" value="0"/>
+ <radio_item label="Средний" name="radio2" value="1"/>
+ <radio_item label="Крупный" name="radio3" value="2"/>
+ </radio_group>
+ <check_box initial_value="иÑтина" label="ВоÑпроизводить анимацию ввода текÑта при общении" name="play_typing_animation"/>
+ <check_box label="ОтправлÑть мне ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¿Ð¾ почте, когда Ð¼ÐµÐ½Ñ Ð½ÐµÑ‚ в Ñети" name="send_im_to_email"/>
+ <check_box label="ВеÑти журнал текÑтового IM и чата" name="plain_text_chat_history"/>
+ <check_box label="Чат в пузырьках" name="bubble_text_chat"/>
+ <text name="show_ims_in_label">
+ Показывать ÑообщениÑ:
+ </text>
+ <text name="requires_restart_label">
+ (требуетÑÑ Ð¿ÐµÑ€ÐµÐ·Ð°Ð¿ÑƒÑк)
+ </text>
+ <radio_group name="chat_window" tool_tip="Показывать IM-ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð² отдельных окнах или же в одном окне Ñ Ð½ÐµÑколькими вкладками (требуетÑÑ Ð¿ÐµÑ€ÐµÐ·Ð°Ð¿ÑƒÑк)">
+ <radio_item label="В отдельных окнах" name="radio" value="0"/>
+ <radio_item label="Ðа вкладках" name="radio2" value="1"/>
+ </radio_group>
+ <text name="disable_toast_label">
+ Включить вÑплывающие ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ñ Ð½Ð¾Ð²Ñ‹Ð¼Ð¸ репликами в чате:
+ </text>
+ <check_box label="Групповой чат" name="EnableGroupChatPopups" tool_tip="Отображать вÑплывающие ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸ поÑвлении Ñообщений в групповом чате"/>
+ <check_box label="ТекÑтовые чаты" name="EnableIMChatPopups" tool_tip="Отображать вÑплывающие ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸ получении IM-Ñообщений"/>
+ <spinner label="Ð’Ñ€ÐµÐ¼Ñ Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð²Ñплывающих реплик:" name="nearby_toasts_lifetime"/>
+ <spinner label="Ð’Ñ€ÐµÐ¼Ñ Ð·Ð°Ñ‚ÑƒÑ…Ð°Ð½Ð¸Ñ Ð²Ñплывающих реплик:" name="nearby_toasts_fadingtime"/>
+ <button label="ÐаÑтройки перевода чата" name="ok_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_preferences_colors.xml b/indra/newview/skins/default/xui/ru/panel_preferences_colors.xml
new file mode 100644
index 0000000000..48c34fcbb2
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_preferences_colors.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Цвета" name="colors_panel">
+ <text name="effects_color_textbox">
+ Мои Ñффекты (луч выбора):
+ </text>
+ <color_swatch name="effect_color_swatch" tool_tip="Щелкните Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° цвета"/>
+ <text name="font_colors">
+ Цвета шрифтов чата:
+ </text>
+ <text name="text_box1">
+ Я
+ </text>
+ <text name="text_box2">
+ Другие
+ </text>
+ <text name="text_box3">
+ Объекты
+ </text>
+ <text name="text_box4">
+ СиÑтема
+ </text>
+ <text name="text_box5">
+ Ошибки
+ </text>
+ <text name="text_box10">
+ ПрÑмо
+ </text>
+ <text name="text_box7">
+ Владелец
+ </text>
+ <text name="text_box9">
+ URL-адреÑа
+ </text>
+ <text name="bubble_chat">
+ Цвет фона тегов имен (также Ð´Ð»Ñ Ñ‡Ð°Ñ‚Ð° в пузырьках):
+ </text>
+ <color_swatch name="background" tool_tip="Выберите цвет Ð´Ð»Ñ Ñ‚ÐµÐ³Ð¾Ð² имен"/>
+ <slider label="ВидимоÑть:" name="bubble_chat_opacity" tool_tip="Задайте непрозрачноÑть тегов имен"/>
+ <text name="floater_opacity">
+ ÐепрозрачноÑть окон:
+ </text>
+ <slider label="Ðктивные:" name="active"/>
+ <slider label="Ðеактивные:" name="inactive"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_preferences_general.xml b/indra/newview/skins/default/xui/ru/panel_preferences_general.xml
new file mode 100644
index 0000000000..d1bfedf2d8
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_preferences_general.xml
@@ -0,0 +1,76 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Общие" name="general_panel">
+ <text name="language_textbox">
+ Язык:
+ </text>
+ <combo_box name="language_combobox">
+ <combo_box.item label="Язык ÑиÑтемы" name="System Default Language"/>
+ <combo_box.item label="English - ÐнглийÑкий" name="English"/>
+ <combo_box.item label="Dansk – датÑкий (бета-верÑиÑ)" name="Danish"/>
+ <combo_box.item label="Deutsch – немецкий (бета-верÑиÑ)" name="Deutsch(German)"/>
+ <combo_box.item label="Español – иÑпанÑкий (бета-верÑиÑ)" name="Spanish"/>
+ <combo_box.item label="Français – французÑкий (бета-верÑиÑ)" name="French"/>
+ <combo_box.item label="Italiano – итальÑнÑкий (бета-верÑиÑ)" name="Italian"/>
+ <combo_box.item label="Polski – польÑкий (бета-верÑиÑ)" name="Polish"/>
+ <combo_box.item label="Português – португальÑкий (бета-верÑиÑ)" name="Portugese"/>
+ <combo_box.item label="РуÑÑкий (бета-верÑиÑ)" name="Russian"/>
+ <combo_box.item label="Türkçe - турецкий (бета-верÑиÑ)" name="Turkish"/>
+ <combo_box.item label="日本語 – ÑпонÑкий (бета-верÑиÑ)" name="(Japanese)"/>
+ <combo_box.item label="китайÑкий, традиционное пиÑьмо - бета-верÑиÑ" name="Traditional Chinese"/>
+ </combo_box>
+ <text name="language_textbox2">
+ (ТребуетÑÑ Ð¿ÐµÑ€ÐµÐ·Ð°Ð¿ÑƒÑк)
+ </text>
+ <text name="maturity_desired_prompt">
+ Показывать контент:
+ </text>
+ <combo_box name="maturity_desired_combobox">
+ <combo_box.item label="Общий, умеренный, Ð´Ð»Ñ Ð²Ð·Ñ€Ð¾Ñлых" name="Desired_Adult"/>
+ <combo_box.item label="Общий и умеренный" name="Desired_Mature"/>
+ <combo_box.item label="Общий" name="Desired_PG"/>
+ </combo_box>
+ <text name="start_location_textbox">
+ МеÑто Ñтарта:
+ </text>
+ <combo_box name="start_location_combo">
+ <combo_box.item label="Мое поÑледнее меÑто" name="MyLastLocation"/>
+ <combo_box.item label="Мой дом" name="MyHome"/>
+ </combo_box>
+ <check_box initial_value="иÑтина" label="Показывать на Ñкране входа" name="show_location_checkbox"/>
+ <text name="name_tags_textbox">
+ Теги имен:
+ </text>
+ <radio_group name="Name_Tag_Preference">
+ <radio_item label="Выкл." name="radio" value="0"/>
+ <radio_item label="Вкл." name="radio2" value="1"/>
+ <radio_item label="Временный показ" name="radio3" value="2"/>
+ </radio_group>
+ <check_box label="Мое имÑ" name="show_my_name_checkbox1"/>
+ <check_box label="Имена пользователей" name="show_slids" tool_tip="Показывать Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ, например, bobsmith123"/>
+ <check_box label="Титулы групп" name="show_all_title_checkbox1" tool_tip="Показывать титулы групп, например, Officer или Member"/>
+ <check_box label="ПодÑветка друзей" name="show_friends" tool_tip="ПодÑвечивать теги имен ваших друзей"/>
+ <check_box label="Экранные имена" name="display_names_check" tool_tip="Показывать Ñкранные имена в чате, IM, тегах имен и пр."/>
+ <text name="inworld_typing_rg_label">
+ Ðажатие клавиш Ñ Ð±ÑƒÐºÐ²Ð°Ð¼Ð¸:
+ </text>
+ <radio_group name="inworld_typing_preference">
+ <radio_item label="Ðачинает локальный чат" name="radio_start_chat" value="1"/>
+ <radio_item label="Приводит к перемещению (т. е. WASD)" name="radio_move" value="0"/>
+ </radio_group>
+ <text name="title_afk_text">
+ Задержка режима «Отошел»:
+ </text>
+ <combo_box label="Задержка режима «Отошел»:" name="afk">
+ <combo_box.item label="2 мин" name="item0"/>
+ <combo_box.item label="5 мин" name="item1"/>
+ <combo_box.item label="10 мин" name="item2"/>
+ <combo_box.item label="30 мин" name="item3"/>
+ <combo_box.item label="никогда" name="item4"/>
+ </combo_box>
+ <text name="text_box3">
+ Ответ в режиме «ЗанÑт»:
+ </text>
+ <text_editor name="busy_response">
+ log_in_to_change
+ </text_editor>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/ru/panel_preferences_graphics1.xml
new file mode 100644
index 0000000000..a7e826f5fc
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_preferences_graphics1.xml
@@ -0,0 +1,114 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Графика" name="Display panel">
+ <text name="QualitySpeed">
+ КачеÑтво и ÑкороÑть:
+ </text>
+ <text name="FasterText">
+ БыÑтрее
+ </text>
+ <text name="BetterText">
+ КачеÑтвенней
+ </text>
+ <text name="ShadersPrefText">
+ Ðизко
+ </text>
+ <text name="ShadersPrefText2">
+ Средне
+ </text>
+ <text name="ShadersPrefText3">
+ Ð’Ñ‹Ñоко
+ </text>
+ <text name="ShadersPrefText4">
+ Ультра
+ </text>
+ <panel label="Выбор графики" name="CustomGraphics Panel">
+ <text name="ShadersText">
+ Шейдеры:
+ </text>
+ <check_box initial_value="иÑтина" label="ПрозрачноÑть воды" name="TransparentWater"/>
+ <check_box initial_value="иÑтина" label="РельефноÑть и ÑиÑние" name="BumpShiny"/>
+ <check_box initial_value="иÑтина" label="Локальный Ñвет" name="LocalLights"/>
+ <check_box initial_value="иÑтина" label="Базовые шейдеры" name="BasicShaders" tool_tip="Отключение Ñтого параметра может предотвратить завиÑание некоторых видеокарт"/>
+ <check_box initial_value="иÑтина" label="ÐтмоÑферные шейдеры" name="WindLightUseAtmosShaders"/>
+ <check_box initial_value="иÑтина" label="ОÑвещение и тени" name="UseLightShaders"/>
+ <check_box initial_value="иÑтина" label="Объемный Ñвет" name="UseSSAO"/>
+ <check_box initial_value="иÑтина" label="Глубина полÑ" name="UseDoF"/>
+ <text name="shadows_label">
+ Тени:
+ </text>
+ <combo_box name="ShadowDetail">
+ <combo_box.item label="Ðет" name="0"/>
+ <combo_box.item label="Солнце/луна" name="1"/>
+ <combo_box.item label="Солнце/луна + оÑветители" name="2"/>
+ </combo_box>
+ <text name="reflection_label">
+ Вода отражает:
+ </text>
+ <combo_box name="Reflections">
+ <combo_box.item label="Минимум" name="0"/>
+ <combo_box.item label="Ландшафт и деревьÑ" name="1"/>
+ <combo_box.item label="Ð’Ñе Ñтатичные объекты" name="2"/>
+ <combo_box.item label="Ð’Ñе аватары и объекты" name="3"/>
+ <combo_box.item label="Ð’Ñе" name="4"/>
+ </combo_box>
+ <slider label="Физика аватара:" name="AvatarPhysicsDetail"/>
+ <text name="AvatarPhysicsDetailText">
+ Ðизко
+ </text>
+ <slider label="ДальноÑть отриÑовки:" name="DrawDistance"/>
+ <text name="DrawDistanceMeterText2">
+ м
+ </text>
+ <slider label="МакÑ. количеÑтво чаÑтиц:" name="MaxParticleCount"/>
+ <slider label="МакÑ. количеÑтво 3D-аватаров:" name="MaxNumberAvatarDrawn"/>
+ <slider label="КачеÑтво поÑтобработки:" name="RenderPostProcess"/>
+ <text name="MeshDetailText">
+ Ð”ÐµÑ‚Ð°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð¼ÐµÑˆÐ°:
+ </text>
+ <slider label="Объекты:" name="ObjectMeshDetail"/>
+ <slider label="Гибкие примитивы:" name="FlexibleMeshDetail"/>
+ <slider label="ДеревьÑ:" name="TreeMeshDetail"/>
+ <slider label="Ðватары:" name="AvatarMeshDetail"/>
+ <slider label="Ландшафт:" name="TerrainMeshDetail"/>
+ <slider label="Ðебо:" name="SkyMeshDetail"/>
+ <text name="PostProcessText">
+ Ðизко
+ </text>
+ <text name="ObjectMeshDetailText">
+ Ðизко
+ </text>
+ <text name="FlexibleMeshDetailText">
+ Ðизко
+ </text>
+ <text name="TreeMeshDetailText">
+ Ðизко
+ </text>
+ <text name="AvatarMeshDetailText">
+ Ðизко
+ </text>
+ <text name="TerrainMeshDetailText">
+ Ðизко
+ </text>
+ <text name="SkyMeshDetailText">
+ Ðизко
+ </text>
+ <text name="AvatarRenderingText">
+ ОтриÑовка аватара:
+ </text>
+ <check_box initial_value="иÑтина" label="ПлоÑкие аватары" name="AvatarImpostors"/>
+ <check_box initial_value="иÑтина" label="ÐÐ¿Ð¿Ð°Ñ€Ð°Ñ‚Ð½Ð°Ñ Ð¾Ñ‚Ñ€Ð¸Ñовка" name="AvatarVertexProgram"/>
+ <check_box initial_value="иÑтина" label="Одежда аватара" name="AvatarCloth"/>
+ <text name="TerrainDetailText">
+ Ландшафт:
+ </text>
+ <radio_group name="TerrainDetailRadio">
+ <radio_item label="Грубо" name="0"/>
+ <radio_item label="Детально" name="2"/>
+ </radio_group>
+ --&gt;
+ </panel>
+ <button label="Применить" label_selected="Применить" name="Apply"/>
+ <button label="СброÑ" name="Defaults"/>
+ <button label="Дополнительно" name="Advanced"/>
+ <button label="Ðппаратура" label_selected="Ðппаратура" name="GraphicsHardwareButton"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_preferences_move.xml b/indra/newview/skins/default/xui/ru/panel_preferences_move.xml
new file mode 100644
index 0000000000..a6e9b00f2a
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_preferences_move.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Перемещение" name="move_panel">
+ <slider label="Угол обзора" name="camera_fov"/>
+ <slider label="РаÑÑтоÑние" name="camera_offset_scale"/>
+ <text name="heading2">
+ ÐвтоматичеÑÐºÐ°Ñ ÑƒÑтановка позиции длÑ:
+ </text>
+ <check_box label="ÑозданиÑ/редактированиÑ" name="edit_camera_movement" tool_tip="ÐвтоматичеÑкое позиционирование камеры при входе в режим Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸ выходе из него"/>
+ <check_box label="внешноÑти" name="appearance_camera_movement" tool_tip="ÐвтоматичеÑкое позиционирование камеры в режиме редактированиÑ"/>
+ <text name="keyboard_lbl">
+ Клавиатура:
+ </text>
+ <check_box label="Клавиши Ñо Ñтрелками вÑегда перемещают менÑ" name="arrow_keys_move_avatar_check"/>
+ <check_box label="Бег поÑле двойного Ð½Ð°Ð¶Ð°Ñ‚Ð¸Ñ ÐºÐ»Ð°Ð²Ð¸ÑˆÐ¸" name="tap_tap_hold_to_run"/>
+ <text name="mouse_lbl">
+ Мышь:
+ </text>
+ <check_box label="Показывать Ð¼ÐµÐ½Ñ Ð¿Ñ€Ð¸ обзоре мышью" name="first_person_avatar_visible"/>
+ <text name=" Mouse Sensitivity">
+ ЧувÑтвительноÑть мыши:
+ </text>
+ <check_box label="Инвертировать" name="invert_mouse"/>
+ <text name="single_click_action_lbl">
+ Один щелчок на земле:
+ </text>
+ <combo_box name="single_click_action_combo">
+ <combo_box.item label="Без дейÑтвиÑ" name="0"/>
+ <combo_box.item label="Перемещение в точку щелчка" name="1"/>
+ </combo_box>
+ <text name="double_click_action_lbl">
+ Двойной щелчок на земле:
+ </text>
+ <combo_box name="double_click_action_combo">
+ <combo_box.item label="Без дейÑтвиÑ" name="0"/>
+ <combo_box.item label="Перемещение в точку щелчка" name="1"/>
+ <combo_box.item label="Ð¢ÐµÐ»ÐµÐ¿Ð¾Ñ€Ñ‚Ð°Ñ†Ð¸Ñ Ð² точку щелчка" name="2"/>
+ </combo_box>
+ <button label="Другие уÑтройÑтва" name="joystick_setup_button"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/ru/panel_preferences_privacy.xml
new file mode 100644
index 0000000000..20bb839eed
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_preferences_privacy.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="КоммуникациÑ" name="im">
+ <panel.string name="log_in_to_change">
+ войти Ð´Ð»Ñ Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ
+ </panel.string>
+ <button label="ОчиÑтить журнал" name="clear_cache" tool_tip="Удалить картинку при входе, поÑледнее меÑтоположение, журнал телепортаций, кÑш веб-документов и текÑтур"/>
+ <text name="cache_size_label_l">
+ (МеÑта, картинки, Ñтраницы, журнал поиÑка)
+ </text>
+ <check_box label="Показывать Ð¼ÐµÐ½Ñ Ð² результатах поиÑка" name="online_searchresults"/>
+ <check_box label="Только Ð´Ñ€ÑƒÐ·ÑŒÑ Ð¸ группы видÑÑ‚, когда Ñ Ð½Ð° ÑвÑзи" name="online_visibility"/>
+ <check_box label="Только Ð´Ñ€ÑƒÐ·ÑŒÑ Ð¸ группы могут звонить мне и отправлÑть IM" name="voice_call_friends_only_check"/>
+ <check_box label="Отключать микрофон по окончании разговора" name="auto_disengage_mic_check"/>
+ <check_box label="Показывать любимые закладки при входе (в меню «МеÑто Ñтарта»)" name="favorites_on_login_check"/>
+ <text name="Logs:">
+ Журналы чатов:
+ </text>
+ <check_box label="Хранить журналы чата на компьютере" name="log_nearby_chat"/>
+ <check_box label="Хранить журналы IM на компьютере" name="log_instant_messages"/>
+ <check_box label="Метка времени в каждой Ñтроке журнала чата" name="show_timestamps_check_im"/>
+ <check_box label="Метка времени в имени файла журнала." name="logfile_name_datestamp"/>
+ <text name="log_path_desc">
+ Папка журналов:
+ </text>
+ <button label="Обзор" label_selected="Обзор" name="log_path_button"/>
+ <button label="Черный ÑпиÑок" name="block_list"/>
+ <text name="block_list_label">
+ (Люди и (или) объекты, заблокированные вами)
+ </text>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_preferences_setup.xml b/indra/newview/skins/default/xui/ru/panel_preferences_setup.xml
new file mode 100644
index 0000000000..8e7fc71f0d
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_preferences_setup.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="КонфигурациÑ" name="Input panel">
+ <text name="Network:">
+ Сеть:
+ </text>
+ <text name="Maximum bandwidth">
+ МакÑ. ширина канала
+ </text>
+ <text name="text_box2">
+ Кбит/Ñ
+ </text>
+ <check_box label="Выбор порта" name="connection_port_enabled"/>
+ <spinner label="Ðомер порта:" name="connection_port"/>
+ <text name="Web:">
+ Браузер:
+ </text>
+ <radio_group name="use_external_browser">
+ <radio_item label="ИÑпользовать мой браузер (IE, Firefox, Safari)" name="external" tool_tip="Будет иÑпользоватьÑÑ Ð±Ñ€Ð°ÑƒÐ·ÐµÑ€, заданный в ÑиÑтеме по умолчанию. Ðе рекомендуетÑÑ, еÑли [APP_NAME] работает в полноÑкранном режиме." value="true"/>
+ <radio_item label="ИÑпользовать вÑтроенный браузер" name="internal" tool_tip="Ð”Ð»Ñ Ð¿Ñ€Ð¾Ñмотра Ñправки, ÑÑылок на веб-Ñтраницы и Ñ‚. д. будет иÑпользоватьÑÑ Ð²Ñтроенный браузер. Этот браузер открываетÑÑ ÐºÐ°Ðº новое окно в [APP_NAME]." value=""/>
+ </radio_group>
+ <check_box initial_value="иÑтина" label="Разрешить плагины" name="browser_plugins_enabled"/>
+ <check_box initial_value="иÑтина" label="Принимать файлы cookie" name="cookies_enabled"/>
+ <check_box initial_value="иÑтина" label="Разрешить Javascript" name="browser_javascript_enabled"/>
+ <check_box initial_value="ложь" label="Разрешить вÑплывающие окна" name="media_popup_enabled"/>
+ <text name="Software updates:">
+ ÐžÐ±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ ÐŸÐž:
+ </text>
+ <combo_box name="updater_service_combobox">
+ <combo_box.item label="УÑтанавливать автоматичеÑки" name="Install_automatically"/>
+ <combo_box.item label="Загружать и уÑтанавливать Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð²Ñ€ÑƒÑ‡Ð½ÑƒÑŽ" name="Install_manual"/>
+ </combo_box>
+ <text name="Proxy Settings:">
+ ÐаÑтройки прокÑи-Ñервера:
+ </text>
+ <button label="Задать наÑтройки" label_selected="Обзор" name="set_proxy"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_preferences_sound.xml b/indra/newview/skins/default/xui/ru/panel_preferences_sound.xml
new file mode 100644
index 0000000000..bf673750d2
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_preferences_sound.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Звуки" name="Preference Media panel">
+ <panel.string name="middle_mouse">
+ Ñреднюю кнопку мыши
+ </panel.string>
+ <slider label="ÐžÐ±Ñ‰Ð°Ñ Ð³Ñ€Ð¾Ð¼ÐºÐ¾Ñть" name="System Volume"/>
+ <check_box initial_value="иÑтина" name="mute_when_minimized"/>
+ <text name="mute_chb_label">
+ Заглушать, когда Ñвернуто
+ </text>
+ <slider label="Кнопки" name="UI Volume"/>
+ <slider label="Окружение" name="Wind Volume"/>
+ <slider label="Звуковые Ñффекты" name="SFX Volume"/>
+ <slider label="ÐŸÐ¾Ñ‚Ð¾ÐºÐ¾Ð²Ð°Ñ Ð¼ÑƒÐ·Ñ‹ÐºÐ°" name="Music Volume"/>
+ <check_box label="Включено" name="enable_music"/>
+ <slider label="Медиа" name="Media Volume"/>
+ <check_box label="Включено" name="enable_media"/>
+ <slider label="ГолоÑовой чат" name="Voice Volume"/>
+ <check_box label="Включено" name="enable_voice_check"/>
+ <check_box label="Разрешить автовоÑпроизведение медиа" name="media_auto_play_btn" tool_tip="УÑтановка флажка позволит вам автоматичеÑки воÑпроизводить медиа" value="иÑтина"/>
+ <check_box label="ВоÑпроизводить медиа, приÑоединенные к другому аватару" name="media_show_on_others_btn" tool_tip="СнÑтие флажка Ñкроет медиа, приÑоединенные к другому аватару" value="иÑтина"/>
+ <check_box label="Сопровождать жеÑты звуками" name="gesture_audio_play_btn" tool_tip="УÑтановите флажок, чтобы Ñлышать звуки при жеÑтах" value="иÑтина"/>
+ <text name="voice_chat_settings">
+ ÐаÑтройки голоÑового чата
+ </text>
+ <text name="Listen from">
+ Слушать Ñ:
+ </text>
+ <radio_group name="ear_location">
+ <radio_item label="Камеры" name="0"/>
+ <radio_item label="Ðватара" name="1"/>
+ </radio_group>
+ <check_box label="Губы аватара двигаютÑÑ Ð¿Ñ€Ð¸ разговоре" name="enable_lip_sync"/>
+ <check_box label="Включать/выключать микрофон, когда Ñ Ð½Ð°Ð¶Ð¸Ð¼Ð°ÑŽ:" name="push_to_talk_toggle_check" tool_tip="Ð’ режиме Ð¿ÐµÑ€ÐµÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ ÐžÐ”ÐОКРÐТÐОЕ нажатие и отпуÑкание данной клавиши включает/выключает микрофон. ЕÑли режим Ð¿ÐµÑ€ÐµÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð¾Ñ‚ÐºÐ»ÑŽÑ‡ÐµÐ½, то микрофон передает голоÑ, только когда клавиша нажата."/>
+ <line_editor label="Триггер Push-to-Speak" name="modifier_combo"/>
+ <button label="Задать клавишу" name="set_voice_hotkey_button"/>
+ <button name="set_voice_middlemouse_button" tool_tip="Ð¡Ð±Ñ€Ð¾Ñ Ð½Ð° Ñреднюю кнопку мыши"/>
+ <button label="УÑтройÑтва ввода-вывода" name="device_settings_btn"/>
+ <panel label="ÐаÑтройки уÑтройÑтва" name="device_settings_panel"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_prim_media_controls.xml b/indra/newview/skins/default/xui/ru/panel_prim_media_controls.xml
new file mode 100644
index 0000000000..76bb6518e9
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_prim_media_controls.xml
@@ -0,0 +1,91 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="MediaControls">
+ <string name="control_background_image_name">
+ Inspector_Background
+ </string>
+ <string name="skip_step">
+ 0.2
+ </string>
+ <string name="min_width">
+ 300
+ </string>
+ <string name="min_height">
+ 75
+ </string>
+ <string name="zoom_near_padding">
+ 1.0
+ </string>
+ <string name="zoom_medium_padding">
+ 1.1
+ </string>
+ <string name="zoom_far_padding">
+ 1.5
+ </string>
+ <string name="top_world_view_avoid_zone">
+ 50
+ </string>
+ <layout_stack name="progress_indicator_area">
+ <layout_panel name="media_progress_indicator">
+ <progress_bar name="media_progress_bar" tool_tip="Медиа загружаетÑÑ"/>
+ </layout_panel>
+ </layout_stack>
+ <layout_stack name="media_controls">
+ <layout_panel name="back">
+ <button name="back_btn" tool_tip="Ðазад"/>
+ </layout_panel>
+ <layout_panel name="fwd">
+ <button name="fwd_btn" tool_tip="Вперед"/>
+ </layout_panel>
+ <layout_panel name="home">
+ <button name="home_btn" tool_tip="ДомашнÑÑ Ñтраница"/>
+ </layout_panel>
+ <layout_panel name="media_stop">
+ <button name="media_stop_btn" tool_tip="ОÑтановить медиа"/>
+ </layout_panel>
+ <layout_panel name="reload">
+ <button name="reload_btn" tool_tip="Обновить"/>
+ </layout_panel>
+ <layout_panel name="stop">
+ <button name="stop_btn" tool_tip="ОÑтановить загрузку"/>
+ </layout_panel>
+ <layout_panel name="play">
+ <button name="play_btn" tool_tip="Проиграть медиа"/>
+ </layout_panel>
+ <layout_panel name="pause">
+ <button name="pause_btn" tool_tip="ПоÑтавить на паузу"/>
+ </layout_panel>
+ <layout_panel name="media_address">
+ <line_editor name="media_address_url" tool_tip="СÑылка на медиа"/>
+ <layout_stack name="media_address_url_icons">
+ <layout_panel>
+ <icon name="media_whitelist_flag" tool_tip="Включен белый ÑпиÑок"/>
+ </layout_panel>
+ <layout_panel>
+ <icon name="media_secure_lock_flag" tool_tip="БезопаÑный проÑмотр"/>
+ </layout_panel>
+ </layout_stack>
+ </layout_panel>
+ <layout_panel name="media_play_position">
+ <slider_bar initial_value="0.5" name="media_play_slider" tool_tip="Выполнение проÑмотра видео"/>
+ </layout_panel>
+ <layout_panel name="skip_back">
+ <button name="skip_back_btn" tool_tip="Шаг назад"/>
+ </layout_panel>
+ <layout_panel name="skip_forward">
+ <button name="skip_forward_btn" tool_tip="Шаг вперед"/>
+ </layout_panel>
+ <layout_panel name="media_volume">
+ <button name="media_mute_button" tool_tip="Приглушить медиа"/>
+ <slider name="volume_slider" tool_tip="ГромкоÑть медиа"/>
+ </layout_panel>
+ <layout_panel name="zoom_frame">
+ <button name="zoom_frame_btn" tool_tip="Приблизить к медиа"/>
+ </layout_panel>
+ <layout_panel name="close">
+ <button name="close_btn" tool_tip="Отодвинуть назад"/>
+ </layout_panel>
+ <layout_panel name="new_window">
+ <button name="new_window_btn" tool_tip="Открыть ÑÑылку в браузере"/>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_region_covenant.xml b/indra/newview/skins/default/xui/ru/panel_region_covenant.xml
new file mode 100644
index 0000000000..706a38f110
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_region_covenant.xml
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Соглашение" name="Covenant">
+ <panel.string name="can_resell">
+ ÐŸÑ€Ð¸Ð¾Ð±Ñ€ÐµÑ‚ÐµÐ½Ð½Ð°Ñ Ð² Ñтом регионе Ð·ÐµÐ¼Ð»Ñ Ð¼Ð¾Ð¶ÐµÑ‚ быть перепродана.
+ </panel.string>
+ <panel.string name="can_not_resell">
+ ÐŸÑ€Ð¸Ð¾Ð±Ñ€ÐµÑ‚ÐµÐ½Ð½Ð°Ñ Ð² Ñтом регионе Ð·ÐµÐ¼Ð»Ñ Ð½Ðµ может быть перепродана.
+ </panel.string>
+ <panel.string name="can_change">
+ ÐŸÑ€Ð¸Ð¾Ð±Ñ€ÐµÑ‚ÐµÐ½Ð½Ð°Ñ Ð² Ñтом регионе Ð·ÐµÐ¼Ð»Ñ Ð¼Ð¾Ð¶ÐµÑ‚ быть объединена или разделена.
+ </panel.string>
+ <panel.string name="can_not_change">
+ ÐŸÑ€Ð¸Ð¾Ð±Ñ€ÐµÑ‚ÐµÐ½Ð½Ð°Ñ Ð² Ñтом регионе Ð·ÐµÐ¼Ð»Ñ Ð½Ðµ может быть объединена или разделена.
+ </panel.string>
+ <text name="estate_section_lbl">
+ Землевладение
+ </text>
+ <text name="estate_name_lbl">
+ Ðазвание:
+ </text>
+ <text name="estate_name_text">
+ материк
+ </text>
+ <text name="estate_owner_lbl">
+ Владелец:
+ </text>
+ <text name="estate_owner_text">
+ (нет)
+ </text>
+ <text name="estate_cov_lbl">
+ Соглашение:
+ </text>
+ <text name="covenant_timestamp_text">
+ ПоÑледнее изменение: 31 Ð´ÐµÐºÐ°Ð±Ñ€Ñ 1969 г., Ñреда, 16:00:00
+ </text>
+ <text_editor name="covenant_editor">
+ Ðет ÑÐ¾Ð³Ð»Ð°ÑˆÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ñтого землевладениÑ.
+ </text_editor>
+ <button label="СброÑ" name="reset_covenant"/>
+ <text name="covenant_help_text">
+ Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² Ñоглашении будут показаны на вÑех учаÑтках Ñтого землевладениÑ.
+ </text>
+ <text name="covenant_instructions">
+ Перетащите Ñюда заметку, чтобы изменить Ñоглашение Ð´Ð»Ñ Ñтого землевладениÑ.
+ </text>
+ <text name="region_section_lbl">
+ Регион
+ </text>
+ <text name="region_name_lbl">
+ Ðазвание:
+ </text>
+ <text name="region_name_text">
+ Эрика
+ </text>
+ <text name="region_landtype_lbl">
+ Тип:
+ </text>
+ <text name="region_landtype_text">
+ Материк/помеÑтье
+ </text>
+ <text name="region_maturity_lbl">
+ Рейтинг:
+ </text>
+ <text name="region_maturity_text">
+ Ð”Ð»Ñ Ð²Ð·Ñ€Ð¾Ñлых
+ </text>
+ <text name="resellable_lbl">
+ Перепродажа:
+ </text>
+ <text name="resellable_clause">
+ Ð—ÐµÐ¼Ð»Ñ Ð² Ñтом регионе не может быть перепродана.
+ </text>
+ <text name="changeable_lbl">
+ Разделение:
+ </text>
+ <text name="changeable_clause">
+ Ð—ÐµÐ¼Ð»Ñ Ð² Ñтом регионе не может быть объединена или разделена.
+ </text>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_region_debug.xml b/indra/newview/skins/default/xui/ru/panel_region_debug.xml
new file mode 100644
index 0000000000..c21d2d7051
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_region_debug.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Отладка" name="Debug">
+ <text name="region_text_lbl">
+ Регион:
+ </text>
+ <text name="region_text">
+ неизвеÑтно
+ </text>
+ <check_box label="Отключить Ñкрипты" name="disable_scripts_check" tool_tip="Отключить вÑе Ñкрипты в Ñтом регионе"/>
+ <check_box label="Отключить ÑтолкновениÑ" name="disable_collisions_check" tool_tip="Отключить ÑÑ‚Ð¾Ð»ÐºÐ½Ð¾Ð²ÐµÐ½Ð¸Ñ Ð½Ðµ-аватаров в Ñтом регионе"/>
+ <check_box label="Отключить физику" name="disable_physics_check" tool_tip="Выключить вÑÑŽ физику в Ñтом регионе"/>
+ <button label="Применить" name="apply_btn"/>
+ <text name="objret_text_lbl">
+ Возврат объектов
+ </text>
+ <text name="resident_text_lbl">
+ Житель:
+ </text>
+ <line_editor name="target_avatar_name">
+ (нет)
+ </line_editor>
+ <button label="Выбор" name="choose_avatar_btn"/>
+ <text name="options_text_lbl">
+ Параметры:
+ </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="ВозвращаютÑÑ Ð¾Ð±ÑŠÐµÐºÑ‚Ñ‹ Ñо вÑех регионов, образующих Ñто землевладение"/>
+ <button label="Возврат" name="return_btn"/>
+ <button label="Самые активные учаÑтники Ñтолкновений..." name="top_colliders_btn" tool_tip="СпиÑок объектов, Ð´Ð»Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ñ… ÑÑ‚Ð¾Ð»ÐºÐ½Ð¾Ð²ÐµÐ½Ð¸Ñ Ð½Ð°Ð¸Ð±Ð¾Ð»ÐµÐµ вероÑтны"/>
+ <button label="СпиÑок лучших Ñкриптов..." name="top_scripts_btn" tool_tip="Объекты, в которых Ñкрипты выполнÑÑŽÑ‚ÑÑ Ð´Ð¾Ð»ÑŒÑˆÐµ вÑего"/>
+ <button label="Перезагрузить регион" name="restart_btn" tool_tip="ОтÑчитать 2 минуты и перезагрузить регион"/>
+ <button label="Отложить перезагрузку" name="cancel_restart_btn" tool_tip="Отложить перезагрузку региона на чаÑ"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_region_environment.xml b/indra/newview/skins/default/xui/ru/panel_region_environment.xml
new file mode 100644
index 0000000000..85be8f63bd
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_region_environment.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Среда" name="panel_env_info">
+ <text name="water_settings_title">
+ ÐаÑтройки воды и неба/Ñуточного цикла определÑÑŽÑ‚, каким поÑетители увидÑÑ‚ ваш регион. Дополнительно
+ </text>
+ <radio_group name="region_settings_radio_group">
+ <radio_item label="ИÑпользовать наÑтройки Second Life по умолчанию" name="use_sl_default_settings"/>
+ <radio_item label="ИÑпользовать Ñледующие наÑтройки" name="use_my_settings"/>
+ </radio_group>
+ <panel name="user_environment_settings">
+ <text name="water_settings_title">
+ ÐаÑтройка воды
+ </text>
+ <combo_box name="water_settings_preset_combo">
+ <combo_box.item label="-Выбор наÑтройки-" name="item0"/>
+ </combo_box>
+ <text name="sky_dayc_settings_title">
+ Ðебо/Ñуточный цикл
+ </text>
+ <radio_group name="sky_dayc_settings_radio_group">
+ <radio_item label="Ðебо не менÑетÑÑ" name="my_sky_settings"/>
+ <radio_item label="Суточный цикл" name="my_dayc_settings"/>
+ </radio_group>
+ <combo_box name="sky_settings_preset_combo">
+ <combo_box.item label="-Выбор наÑтройки-" name="item0"/>
+ </combo_box>
+ <combo_box name="dayc_settings_preset_combo">
+ <combo_box.item label="-Выбор наÑтройки-" name="item0"/>
+ </combo_box>
+ </panel>
+ <button label="Применить" name="apply_btn"/>
+ <button label="Отмена" name="cancel_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_region_estate.xml b/indra/newview/skins/default/xui/ru/panel_region_estate.xml
new file mode 100644
index 0000000000..27ec10b323
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_region_estate.xml
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Землевладение" name="Estate">
+ <text name="estate_help_text">
+ Изменение параметров на Ñтой вкладке повлиÑет на вÑе регионы Ñтого землевладениÑ.
+ </text>
+ <text name="estate_text">
+ Землевладение:
+ </text>
+ <text name="estate_name">
+ (неизвеÑтно)
+ </text>
+ <text name="owner_text">
+ Землевладелец:
+ </text>
+ <text name="estate_owner">
+ (неизвеÑтно)
+ </text>
+ <check_box label="Глобальное времÑ" name="use_global_time_check"/>
+ <check_box label="ФикÑированное" name="fixed_sun_check"/>
+ <slider label="Фаза" name="sun_hour_slider"/>
+ <check_box label="Разрешить общий доÑтуп" name="externally_visible_check"/>
+ <text name="Only Allow">
+ Разрешить доÑтуп только аккаунтам Ñ Ð¿Ð¾Ð´Ñ‚Ð²ÐµÑ€Ð¶Ð´ÐµÐ½Ð¸ÐµÐ¼:
+ </text>
+ <check_box label="Информации об оплате в файле" name="limit_payment" tool_tip="Банить нераÑпознанных жителей"/>
+ <check_box label="Проверка возраÑта" name="limit_age_verified" tool_tip="Банить жителей, не прошедших проверку возраÑта. Более Ð¿Ð¾Ð´Ñ€Ð¾Ð±Ð½Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð½Ð°Ñ…Ð¾Ð´Ð¸Ñ‚ÑÑ Ð·Ð´ÐµÑÑŒ: [SUPPORT_SITE]."/>
+ <check_box label="Разрешить голоÑовое общение" name="voice_chat_check"/>
+ <check_box label="Разрешить прÑмой телепорт" name="allow_direct_teleport"/>
+ <button label="Применить" name="apply_btn"/>
+ <button label="Сообщение в землевладение..." name="message_estate_btn"/>
+ <button label="Выкинуть Ð¶Ð¸Ñ‚ÐµÐ»Ñ Ñ Ð·ÐµÐ¼Ð»ÐµÐ²Ð»Ð°Ð´ÐµÐ½Ð¸Ñ..." name="kick_user_from_estate_btn"/>
+ <text name="estate_manager_label">
+ Менеджеры землевладениÑ:
+ </text>
+ <button label="Удалить..." name="remove_estate_manager_btn"/>
+ <button label="Добавить..." name="add_estate_manager_btn"/>
+ <text name="allow_resident_label">
+ Допущенные жители:
+ </text>
+ <button label="Удалить..." name="remove_allowed_avatar_btn"/>
+ <button label="Добавить..." name="add_allowed_avatar_btn"/>
+ <text name="allow_group_label">
+ Допущенные группы:
+ </text>
+ <button label="Удалить..." name="remove_allowed_group_btn"/>
+ <button label="Добавить..." name="add_allowed_group_btn"/>
+ <text name="ban_resident_label">
+ Забаненные жители:
+ </text>
+ <button label="Удалить..." name="remove_banned_avatar_btn"/>
+ <button label="Добавить..." name="add_banned_avatar_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_region_general.xml b/indra/newview/skins/default/xui/ru/panel_region_general.xml
new file mode 100644
index 0000000000..8559be6c9e
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_region_general.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Регион" name="General">
+ <text name="region_text_lbl">
+ Регион:
+ </text>
+ <text name="region_text">
+ неизвеÑтно
+ </text>
+ <text name="version_channel_text_lbl">
+ ВерÑиÑ:
+ </text>
+ <text name="version_channel_text">
+ неизвеÑтно
+ </text>
+ <text name="region_type_lbl">
+ Тип:
+ </text>
+ <text name="region_type">
+ неизвеÑтно
+ </text>
+ <check_box label="Запретить терраформирование" name="block_terraform_check"/>
+ <check_box label="Запретить полеты" name="block_fly_check"/>
+ <check_box label="Разрешить повреждениÑ" name="allow_damage_check"/>
+ <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="Отображать регион и его учаÑтки в результатах поиÑка"/>
+ <check_box label="Разрешить меши-объекты" name="mesh_rez_enabled_check" tool_tip="Разрешить жителÑм выкладывать меши в Ñтом регионе"/>
+ <spinner label="Лимит агентов" name="agent_limit_spin"/>
+ <spinner label="Льгота Ð´Ð»Ñ Ð¾Ð±ÑŠÐµÐºÑ‚Ð°" name="object_bonus_spin"/>
+ <text label="ДозволенноÑть" name="access_text">
+ КатегориÑ:
+ </text>
+ <icons_combo_box label="Умеренный" name="access_combo">
+ <icons_combo_box.item label="Ð”Ð»Ñ Ð²Ð·Ñ€Ð¾Ñлых" name="Adult" value="42"/>
+ <icons_combo_box.item label="Умеренный" name="Mature" value="21"/>
+ <icons_combo_box.item label="Общий" name="PG" value="13"/>
+ </icons_combo_box>
+ <button label="Применить" name="apply_btn"/>
+ <button label="Телепортировать домой одного жителÑ..." 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/ru/panel_region_terrain.xml b/indra/newview/skins/default/xui/ru/panel_region_terrain.xml
new file mode 100644
index 0000000000..af25565226
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_region_terrain.xml
@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Ландшафт" name="Terrain">
+ <text name="region_text_lbl">
+ Регион:
+ </text>
+ <text name="region_text">
+ неизвеÑтен
+ </text>
+ <spinner label="Уровень воды" name="water_height_spin"/>
+ <spinner label="Верх. точка ландшафта" name="terrain_raise_spin"/>
+ <spinner label="Ðиж. точка ландшафта" name="terrain_lower_spin"/>
+ <text name="detail_texture_text">
+ ТекÑтуры ландшафта (требованиÑ: 512x512, 24-битные, TGA)
+ </text>
+ <text name="height_text_lbl">
+ 1 (Ðиз)
+ </text>
+ <text name="height_text_lbl2">
+ 2
+ </text>
+ <text name="height_text_lbl3">
+ 3
+ </text>
+ <text name="height_text_lbl4">
+ 4 (Верх)
+ </text>
+ <text name="height_text_lbl5">
+ Диапазон выÑот текÑтур
+ </text>
+ <text name="height_text_lbl10">
+ Эти Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÑÑŽÑ‚ Ñтепень ÑÐ¼ÐµÑˆÐ¸Ð²Ð°Ð½Ð¸Ñ Ð½Ð°Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ñ… текÑтур.
+ </text>
+ <text name="height_text_lbl11">
+ ИзмерÑÑŽÑ‚ÑÑ Ð² метрах. Значение «Ðиз» – Ñто МÐКСИМÐЛЬÐÐЯ выÑота текÑтуры â„–1, а значение «Верх» – Ñто МИÐИМÐЛЬÐÐЯ выÑота текÑтуры â„–4.
+ </text>
+ <text name="height_text_lbl6">
+ Северо-запад
+ </text>
+ <text name="height_text_lbl7">
+ Северо-воÑток
+ </text>
+ <spinner label="Ðиз" name="height_start_spin_1"/>
+ <spinner label="Ðиз" name="height_start_spin_3"/>
+ <spinner label="Верх" name="height_range_spin_1"/>
+ <spinner label="Верх" name="height_range_spin_3"/>
+ <text name="height_text_lbl8">
+ Юго-запад
+ </text>
+ <text name="height_text_lbl9">
+ Юго-воÑток
+ </text>
+ <spinner label="Ðиз" name="height_start_spin_0"/>
+ <spinner label="Ðиз" name="height_start_spin_2"/>
+ <spinner label="Верх" name="height_range_spin_0"/>
+ <spinner label="Верх" name="height_range_spin_2"/>
+ <button label="Загрузить ландшафт RAW..." name="download_raw_btn" tool_tip="ДоÑтупно только землевладельцам, не менеджерам"/>
+ <button label="Передать ландшафт RAW..." name="upload_raw_btn" tool_tip="ДоÑтупно только землевладельцам, не менеджерам"/>
+ <button label="ЗафикÑировать пределы" name="bake_terrain_btn" tool_tip="УÑтановить выÑоту ландшафта по Ñредней точке между верхней и нижней точками"/>
+ <button label="Применить" name="apply_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_region_texture.xml b/indra/newview/skins/default/xui/ru/panel_region_texture.xml
new file mode 100644
index 0000000000..c4b35a536d
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_region_texture.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="ТекÑтуры земли" name="Textures">
+ <text name="region_text_lbl">
+ Регион:
+ </text>
+ <text name="region_text">
+ неизвеÑтен
+ </text>
+ <text name="detail_texture_text">
+ ТекÑтуры ландшафта (требованиÑ: 512x512, 24-битные TGA-файлы)
+ </text>
+ <text name="height_text_lbl">
+ 1 (низ)
+ </text>
+ <text name="height_text_lbl2">
+ 2
+ </text>
+ <text name="height_text_lbl3">
+ 3
+ </text>
+ <text name="height_text_lbl4">
+ 4 (верх)
+ </text>
+ <text name="height_text_lbl5">
+ Диапазон выÑот текÑтур
+ </text>
+ <text name="height_text_lbl6">
+ Северо-запад
+ </text>
+ <text name="height_text_lbl7">
+ Северо-воÑток
+ </text>
+ <spinner label="Ðиз" name="height_start_spin_1"/>
+ <spinner label="Ðиз" name="height_start_spin_3"/>
+ <spinner label="Верх" name="height_range_spin_1"/>
+ <spinner label="Верх" name="height_range_spin_3"/>
+ <text name="height_text_lbl8">
+ Юго-запад
+ </text>
+ <text name="height_text_lbl9">
+ Юго-воÑток
+ </text>
+ <spinner label="Ðиз" name="height_start_spin_0"/>
+ <spinner label="Ðиз" name="height_start_spin_2"/>
+ <spinner label="Верх" name="height_range_spin_0"/>
+ <spinner label="Верх" name="height_range_spin_2"/>
+ <text name="height_text_lbl10">
+ Эти Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶Ð°ÑŽÑ‚ диапазон Ð¿ÐµÑ€ÐµÐºÑ€Ñ‹Ñ‚Ð¸Ñ Ð²Ñ‹ÑˆÐµÑƒÐºÐ°Ð·Ð°Ð½Ð½Ñ‹Ñ… текÑтур.
+ </text>
+ <text name="height_text_lbl11">
+ ИзмерÑетÑÑ Ð² метрах, значение «Ðиз» – Ñто МÐКСИМÐЛЬÐÐЯ выÑота текÑтуры â„–1, значение «Верх» – Ñто МИÐИМÐЛЬÐÐЯ выÑота текÑтуры â„–4.
+ </text>
+ <button label="Применить" name="apply_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_script_ed.xml b/indra/newview/skins/default/xui/ru/panel_script_ed.xml
new file mode 100644
index 0000000000..1a9c512147
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_script_ed.xml
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="script panel">
+ <panel.string name="loading">
+ Загрузка...
+ </panel.string>
+ <panel.string name="can_not_view">
+ Ð’Ñ‹ не можете проÑматривать и изменÑть Ñтот Ñкрипт, поÑкольку Ð´Ð»Ñ Ð½ÐµÐ³Ð¾ выбрана ÐºÐ°Ñ‚ÐµÐ³Ð¾Ñ€Ð¸Ñ Â«Ð½Ðµ копируемые». Ð”Ð»Ñ Ð¿Ñ€Ð¾Ñмотра или Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ñкрипта в объекте нужны полные права доÑтупа.
+ </panel.string>
+ <panel.string name="public_objects_can_not_run">
+ ОбщедоÑтупные объекты не могут запуÑкать Ñкрипты
+ </panel.string>
+ <panel.string name="script_running">
+ ВыполнÑетÑÑ
+ </panel.string>
+ <panel.string name="Title">
+ Скрипт: [NAME]
+ </panel.string>
+ <panel.string name="external_editor_not_set">
+ Выберите редактор, задав переменную Ñреды LL_SCRIPT_EDITOR или параметр ExternalEditor.
+ </panel.string>
+ <menu_bar name="script_menu">
+ <menu label="Файл" name="File">
+ <menu_item_call label="Сохранить" name="Save"/>
+ <menu_item_call label="Отменить вÑе изменениÑ" name="Revert All Changes"/>
+ </menu>
+ <menu label="Изменить" name="Edit">
+ <menu_item_call label="Отменить" name="Undo"/>
+ <menu_item_call label="Вернуть" name="Redo"/>
+ <menu_item_call label="Вырезать" name="Cut"/>
+ <menu_item_call label="Копировать" name="Copy"/>
+ <menu_item_call label="Ð’Ñтавить" name="Paste"/>
+ <menu_item_call label="Выделить вÑе" name="Select All"/>
+ <menu_item_call label="СнÑть выделение" name="Deselect"/>
+ <menu_item_call label="ПоиÑк и замена..." name="Search / Replace..."/>
+ </menu>
+ <menu label="Справка" name="Help">
+ <menu_item_call label="Справка..." name="Help..."/>
+ <menu_item_call label="Справка по ключевым Ñловам..." name="Keyword Help..."/>
+ </menu>
+ </menu_bar>
+ <text_editor name="Script Editor">
+ Загрузка...
+ </text_editor>
+ <combo_box label="Ð’Ñтавить..." name="Insert..."/>
+ <button label="Сохранить" label_selected="Сохранить" name="Save_btn"/>
+ <button label="Изменить..." name="Edit_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_script_limits_my_avatar.xml b/indra/newview/skins/default/xui/ru/panel_script_limits_my_avatar.xml
new file mode 100644
index 0000000000..a06c465a2b
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_script_limits_my_avatar.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="МОЙ ÐÐ’ÐТÐР" name="script_limits_my_avatar_panel">
+ <text name="script_memory">
+ ПамÑть под Ñкрипты аватара
+ </text>
+ <text name="loading_text">
+ Загрузка...
+ </text>
+ <scroll_list name="scripts_list">
+ <scroll_list.columns label="Размер (КБ)" name="size"/>
+ <scroll_list.columns label="URL-адреÑа" name="urls"/>
+ <scroll_list.columns label="Ðазвание объекта" name="name"/>
+ <scroll_list.columns label="МеÑто" name="location"/>
+ </scroll_list>
+ <button label="Обновить ÑпиÑок" name="refresh_list_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_script_limits_region_memory.xml b/indra/newview/skins/default/xui/ru/panel_script_limits_region_memory.xml
new file mode 100644
index 0000000000..189e21fd2f
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_script_limits_region_memory.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="ПÐМЯТЬ РЕГИОÐÐ" name="script_limits_region_memory_panel">
+ <text name="script_memory">
+ ПамÑть под Ñкрипты на учаÑтке
+ </text>
+ <text name="loading_text">
+ Загрузка...
+ </text>
+ <scroll_list name="scripts_list">
+ <scroll_list.columns label="Размер (Кб)" name="size"/>
+ <scroll_list.columns label="URL-адреÑа" name="urls"/>
+ <scroll_list.columns label="Ðазвание объекта" name="name"/>
+ <scroll_list.columns label="Владелец объекта" name="owner"/>
+ <scroll_list.columns label="УчаÑток" name="parcel"/>
+ <scroll_list.columns label="МеÑто" name="location"/>
+ </scroll_list>
+ <button label="Обновить ÑпиÑок" name="refresh_list_btn"/>
+ <button label="ПодÑветить" name="highlight_btn"/>
+ <button label="Возврат" name="return_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_scrolling_param.xml b/indra/newview/skins/default/xui/ru/panel_scrolling_param.xml
new file mode 100644
index 0000000000..c25f92cb8d
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_scrolling_param.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="LLScrollingPanelParam">
+ <text name="Loading...">
+ Загрузка...
+ </text>
+ <text name="Loading...2">
+ Загрузка...
+ </text>
+ <slider label="[DESC]" name="param slider"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_scrolling_param_base.xml b/indra/newview/skins/default/xui/ru/panel_scrolling_param_base.xml
new file mode 100644
index 0000000000..fa659040ea
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_scrolling_param_base.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="LLScrollingPanelParamBase">
+ <slider label="[DESC]" name="param slider"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_side_tray.xml b/indra/newview/skins/default/xui/ru/panel_side_tray.xml
new file mode 100644
index 0000000000..10c5775291
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_side_tray.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- 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" tab_title="Открыть/закрыть боковую панель"/>
+ <sidetray_tab description="Дом." name="sidebar_home" tab_title="Дом">
+ <panel label="дом" name="panel_home"/>
+ </sidetray_tab>
+ <sidetray_tab description="Изменение Ñвоего Ð¿Ñ€Ð¾Ñ„Ð¸Ð»Ñ Ð¸ подборки." name="sidebar_me" tab_title="Мой профиль">
+ <panel_container name="panel_container">
+ <panel label="Я" name="panel_me"/>
+ </panel_container>
+ </sidetray_tab>
+ <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" tab_title="МеÑта">
+ <panel label="МеÑта" name="panel_places"/>
+ </sidetray_tab>
+ <sidetray_tab description="ПроÑмотрите Ñвой инвентарь." name="sidebar_inventory" tab_title="Мой инвентарь">
+ <panel label="Изменить инвентарь" name="sidepanel_inventory"/>
+ </sidetray_tab>
+ <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/ru/panel_side_tray_tab_caption.xml b/indra/newview/skins/default/xui/ru/panel_side_tray_tab_caption.xml
new file mode 100644
index 0000000000..1a260dc31f
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_side_tray_tab_caption.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="sidetray_tab_panel">
+ <text name="sidetray_tab_title" value="Ð‘Ð¾ÐºÐ¾Ð²Ð°Ñ Ð¿Ð°Ð½ÐµÐ»ÑŒ"/>
+ <button name="undock" tool_tip="ОтÑоединить"/>
+ <button name="dock" tool_tip="ПриÑоединить"/>
+ <button name="show_help" tool_tip="Показать Ñправку"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_snapshot_inventory.xml b/indra/newview/skins/default/xui/ru/panel_snapshot_inventory.xml
new file mode 100644
index 0000000000..53a150c9f9
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_snapshot_inventory.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_snapshot_inventory">
+ <text name="title">
+ Сохранить в моем инвентаре
+ </text>
+ <text name="hint_lbl">
+ Сохранение Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð² инвентаре Ñтоит L$[UPLOAD_COST]. Чтобы Ñохранить его как текÑтуру, выберите один из квадратных форматов.
+ </text>
+ <combo_box label="Размер" name="texture_size_combo">
+ <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>
+ <spinner label="Ширина" name="inventory_snapshot_width"/>
+ <spinner label="Ð’Ñ‹Ñота" name="inventory_snapshot_height"/>
+ <check_box label="СохранÑть пропорции" name="inventory_keep_aspect_check"/>
+ <button label="Отмена" name="cancel_btn"/>
+ <button label="Сохранить" name="save_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_snapshot_local.xml b/indra/newview/skins/default/xui/ru/panel_snapshot_local.xml
new file mode 100644
index 0000000000..446b9bb2fd
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_snapshot_local.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_snapshot_local">
+ <text name="title">
+ Сохранить на моем компьютере
+ </text>
+ <combo_box label="Размер" name="local_size_combo">
+ <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"/>
+ <combo_box.item label="1024x768" name="1024x768"/>
+ <combo_box.item label="1280x1024" name="1280x1024"/>
+ <combo_box.item label="1600x1200" name="1600x1200"/>
+ <combo_box.item label="Задать" name="Custom"/>
+ </combo_box>
+ <layout_stack name="local_image_params_ls">
+ <layout_panel name="local_image_size_lp">
+ <spinner label="Ширина" name="local_snapshot_width"/>
+ <spinner label="Ð’Ñ‹Ñота" name="local_snapshot_height"/>
+ <check_box label="СохранÑть пропорции" name="local_keep_aspect_check"/>
+ </layout_panel>
+ <layout_panel name="local_image_format_quality_lp">
+ <combo_box label="Формат" name="local_format_combo">
+ <combo_box.item label="PNG (без потерь)" name="PNG"/>
+ <combo_box.item label="JPEG" name="JPEG"/>
+ <combo_box.item label="BMP (без потерь)" name="BMP"/>
+ </combo_box>
+ <slider label="КачеÑтво изображениÑ" name="image_quality_slider"/>
+ <text name="image_quality_level">
+ ([QLVL])
+ </text>
+ </layout_panel>
+ </layout_stack>
+ <button label="Отмена" name="cancel_btn"/>
+ <flyout_button label="Сохранить" name="save_btn" tool_tip="Сохранить изображение в файл">
+ <flyout_button.item label="Сохранить" name="save_item"/>
+ <flyout_button.item label="Сохранить как..." name="saveas_item"/>
+ </flyout_button>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_snapshot_options.xml b/indra/newview/skins/default/xui/ru/panel_snapshot_options.xml
new file mode 100644
index 0000000000..250a76cd21
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_snapshot_options.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_snapshot_options">
+ <button label="ПомеÑтить в мой профиль" name="save_to_profile_btn"/>
+ <button label="Отправить по почте" name="save_to_email_btn"/>
+ <button label="Сохранить в моем инвентаре (L$[AMOUNT])" name="save_to_inventory_btn"/>
+ <button label="Сохранить на моем компьютере" name="save_to_computer_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_snapshot_postcard.xml b/indra/newview/skins/default/xui/ru/panel_snapshot_postcard.xml
new file mode 100644
index 0000000000..47f4caf8e3
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_snapshot_postcard.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_snapshot_postcard">
+ <string name="default_subject">
+ Открытка из [SECOND_LIFE].
+ </string>
+ <string name="default_message">
+ Побывай здеÑÑŒ!
+ </string>
+ <string name="upload_message">
+ Отправка...
+ </string>
+ <text name="title">
+ Электронное пиÑьмо
+ </text>
+ <button label="Сообщение" name="message_btn"/>
+ <button label="ÐаÑтройки" name="settings_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_snapshot_profile.xml b/indra/newview/skins/default/xui/ru/panel_snapshot_profile.xml
new file mode 100644
index 0000000000..79a9ef58d0
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_snapshot_profile.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_snapshot_profile">
+ <text name="title">
+ ПомеÑтить в мой профиль
+ </text>
+ <combo_box label="Размер" name="profile_size_combo">
+ <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>
+ <layout_stack name="profile_image_params_ls">
+ <layout_panel name="profile_image_size_lp">
+ <spinner label="Ширина" name="profile_snapshot_width"/>
+ <spinner label="Ð’Ñ‹Ñота" name="profile_snapshot_height"/>
+ <check_box label="СохранÑть пропорции" name="profile_keep_aspect_check"/>
+ </layout_panel>
+ <layout_panel name="profile_image_metadata_lp">
+ <text name="caption_label">
+ ПодпиÑÑŒ:
+ </text>
+ <check_box initial_value="true" label="Включить раÑположение" name="add_location_cb"/>
+ </layout_panel>
+ </layout_stack>
+ <button label="Отмена" name="cancel_btn"/>
+ <button label="Опубликовать" name="post_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_sound_devices.xml b/indra/newview/skins/default/xui/ru/panel_sound_devices.xml
new file mode 100644
index 0000000000..98dab288a3
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_sound_devices.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<panel label="ÐаÑтройки уÑтройÑтва" name="device_settings_panel">
+ <panel.string name="default_text">
+ По умолчанию
+ </panel.string>
+ <string name="name_no_device">
+ Ðет уÑтройÑтва
+ </string>
+ <string name="name_default_system_device">
+ СиÑтемное уÑтройÑтво по умолчанию
+ </string>
+ <text name="Input">
+ Вход
+ </text>
+ <text name="Output">
+ Выход
+ </text>
+ <text name="My volume label">
+ ÐœÐ¾Ñ Ð³Ñ€Ð¾Ð¼ÐºÐ¾Ñть:
+ </text>
+ <slider_bar initial_value="1.0" name="mic_volume_slider" tool_tip="Измените значение, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ð¿Ð¾Ð»Ð·ÑƒÐ½Ð¾Ðº"/>
+ <text name="wait_text">
+ Подождите
+ </text>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_stand_stop_flying.xml b/indra/newview/skins/default/xui/ru/panel_stand_stop_flying.xml
new file mode 100644
index 0000000000..81a2175fc3
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_stand_stop_flying.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- Width and height of this panel should be synchronized with "panel_modes" in the floater_moveview.xml-->
+<panel name="panel_stand_stop_flying">
+ <button label="Ð’Ñтать" name="stand_btn" tool_tip="Щелкните здеÑÑŒ, чтобы вÑтать."/>
+ <button label="Прекратить полет" name="stop_fly_btn" tool_tip="Прекратить полет"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_status_bar.xml b/indra/newview/skins/default/xui/ru/panel_status_bar.xml
new file mode 100644
index 0000000000..babe5811ac
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_status_bar.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="status">
+ <panel.string name="packet_loss_tooltip">
+ Потери пакетов
+ </panel.string>
+ <panel.string name="bandwidth_tooltip">
+ Ширина канала
+ </panel.string>
+ <panel.string name="time">
+ [hour, datetime, slt]:[min, datetime, slt] [timezone,datetime, slt]
+ </panel.string>
+ <panel.string name="timeTooltip">
+ [weekday, datetime, slt], [day, datetime, slt] [month, datetime, slt] [year, datetime, slt]
+ </panel.string>
+ <panel.string name="buycurrencylabel">
+ L$ [AMT]
+ </panel.string>
+ <panel name="balance_bg">
+ <text name="balance" tool_tip="Щелкните Ð´Ð»Ñ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ баланÑа L$" value="L$20"/>
+ <button label="Купить L$" name="buyL" tool_tip="Щелкните Ð´Ð»Ñ Ð¿Ð¾ÐºÑƒÐ¿ÐºÐ¸ L$"/>
+ <button label="Торговый центр" name="goShop" tool_tip="Открыть торговый центр Second Life" width="121"/>
+ </panel>
+ <text name="TimeText" tool_tip="Текущее Ð²Ñ€ÐµÐ¼Ñ (тихоокеанÑкое)">
+ 00:00 (тихоокеанÑкое времÑ)
+ </text>
+ <button name="media_toggle_btn" tool_tip="ЗапуÑк/оÑтановка вÑех медиа (музыка, видео, веб-Ñтраницы)"/>
+ <button name="volume_btn" tool_tip="РегулÑтор громкоÑти"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_teleport_history.xml b/indra/newview/skins/default/xui/ru/panel_teleport_history.xml
new file mode 100644
index 0000000000..c457bc2269
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_teleport_history.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="Teleport History">
+ <accordion name="history_accordion">
+ <no_matched_tabs_text name="no_matched_teleports_msg" value="Ðе нашли того, что вам нужно? ВоÑпользуйтеÑÑŒ [secondlife:///app/search/places/[SEARCH_TERM] поиÑком]."/>
+ <no_visible_tabs_text name="no_teleports_msg" value="ИÑÑ‚Ð¾Ñ€Ð¸Ñ Ñ‚ÐµÐ»ÐµÐ¿Ð¾Ñ€Ñ‚Ð¾Ð² пуÑта. ВоÑпользуйтеÑÑŒ [secondlife:///app/search/places/ поиÑком]."/>
+ <accordion_tab name="today" title="СегоднÑ"/>
+ <accordion_tab name="yesterday" title="Вчера"/>
+ <accordion_tab name="2_days_ago" title="2 Ð´Ð½Ñ Ð½Ð°Ð·Ð°Ð´"/>
+ <accordion_tab name="3_days_ago" title="3 Ð´Ð½Ñ Ð½Ð°Ð·Ð°Ð´"/>
+ <accordion_tab name="4_days_ago" title="4 Ð´Ð½Ñ Ð½Ð°Ð·Ð°Ð´"/>
+ <accordion_tab name="5_days_ago" title="5 дней назад"/>
+ <accordion_tab name="6_days_and_older" title="6 дней назад и раньше"/>
+ <accordion_tab name="1_month_and_older" title="1 меÑÑц назад и раньше"/>
+ <accordion_tab name="6_months_and_older" title="6 меÑÑцев назад и раньше"/>
+ </accordion>
+ <panel name="bottom_panel">
+ <menu_button name="gear_btn" tool_tip="Показать дополнительные параметры"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_teleport_history_item.xml b/indra/newview/skins/default/xui/ru/panel_teleport_history_item.xml
new file mode 100644
index 0000000000..90fb720068
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_teleport_history_item.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="teleport_history_item">
+ <text name="region" value="..."/>
+ <button name="profile_btn" tool_tip="Показать информацию"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_voice_effect.xml b/indra/newview/skins/default/xui/ru/panel_voice_effect.xml
new file mode 100644
index 0000000000..de0b38198f
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_voice_effect.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_voice_effect">
+ <string name="no_voice_effect">
+ Изменение голоÑа отключено
+ </string>
+ <string name="preview_voice_effects">
+ ПроÑлушать изменение голоÑа â–¶
+ </string>
+ <string name="get_voice_effects">
+ ПриобреÑти изменение голоÑа â–¶
+ </string>
+ <combo_box name="voice_effect" tool_tip="Выбор типа Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ñвоего голоÑа">
+ <combo_box.item label="Изменение голоÑа отключено" name="no_voice_effect"/>
+ </combo_box>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_world_map.xml b/indra/newview/skins/default/xui/ru/panel_world_map.xml
new file mode 100644
index 0000000000..0ab8720185
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_world_map.xml
@@ -0,0 +1,63 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="world_map">
+ <panel.string name="Loading">
+ Загрузка...
+ </panel.string>
+ <panel.string name="InvalidLocation">
+ Ðеправильное меÑто
+ </panel.string>
+ <panel.string name="world_map_north">
+ С
+ </panel.string>
+ <panel.string name="world_map_east">
+ Ð’
+ </panel.string>
+ <panel.string name="world_map_west">
+ З
+ </panel.string>
+ <panel.string name="world_map_south">
+ Ю
+ </panel.string>
+ <panel.string name="world_map_southeast">
+ ЮВ
+ </panel.string>
+ <panel.string name="world_map_northeast">
+ СВ
+ </panel.string>
+ <panel.string name="world_map_southwest">
+ ЮЗ
+ </panel.string>
+ <panel.string name="world_map_northwest">
+ СЗ
+ </panel.string>
+ <panel.string name="world_map_person">
+ 1 человек
+ </panel.string>
+ <panel.string name="world_map_people">
+ Людей: [NUMBER]
+ </panel.string>
+ <text label="С" name="floater_map_north">
+ С
+ </text>
+ <text label="Ð’" name="floater_map_east">
+ Ð’
+ </text>
+ <text label="З" name="floater_map_west">
+ З
+ </text>
+ <text label="Ю" name="floater_map_south">
+ Ю
+ </text>
+ <text label="ЮВ" name="floater_map_southeast">
+ ЮВ
+ </text>
+ <text label="СВ" name="floater_map_northeast">
+ СВ
+ </text>
+ <text label="ЮЗ" name="floater_map_southwest">
+ ЮЗ
+ </text>
+ <text label="СЗ" name="floater_map_northwest">
+ СЗ
+ </text>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/role_actions.xml b/indra/newview/skins/default/xui/ru/role_actions.xml
new file mode 100644
index 0000000000..b6ba818abd
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/role_actions.xml
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<role_actions>
+ <action_set description="Эти ÑпоÑобноÑти позволÑÑŽÑ‚ добавлÑть и удалÑть учаÑтников группы, а также вÑтупать в группы без приглашениÑ." name="Membership">
+ <action description="Приглашение людей в Ñту группу" longdescription="ПриглаÑите людей в группу Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ кнопки «ПриглаÑить» в разделе «Роли» на вкладке «УчаÑтники»." name="member invite" value="1"/>
+ <action description="Удаление учаÑтников из группы" longdescription="Удалите учаÑтников из группы Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ кнопки «Выкинуть» в разделе «Роли» на вкладке «УчаÑтники». Владелец может удалÑть вÑех, кроме другого владельца. ЕÑли вы не владелец, то удалить учаÑтника из группы можно только в том Ñлучае, еÑли ему назначена ТОЛЬКО роль «ВÑе». Чтобы удалÑть учаÑтников из ролей, необходима ÑпоÑобноÑть «Удаление учаÑтников из ролей»." name="member eject" value="2"/>
+ <action description="Включение-отключение Ñвободного вÑÑ‚ÑƒÐ¿Ð»ÐµÐ½Ð¸Ñ Ð¸ изменение платы за вÑтупление" longdescription="Включение-отключение Ñвободного вÑтуплениÑ, что обеÑпечит вÑтупление новых учаÑтников без приглашениÑ, а также изменение платы за вÑтупление в разделе «Общие»." name="member options" value="3"/>
+ </action_set>
+ <action_set description="Эти ÑпоÑобноÑти позволÑÑŽÑ‚ добавлÑть, удалÑть и изменÑть роли группы, добавлÑть и удалÑть учаÑтников ролей, а также назначать ролÑм ÑпоÑобноÑти." name="Roles">
+ <action description="Создание ролей" longdescription="Создавайте новые роли в разделе «Роли» на вкладке «Роли»." name="role create" value="4"/>
+ <action description="Удаление ролей" longdescription="УдалÑйте роли в разделе «Роли» на вкладке «Роли»." name="role delete" value="5"/>
+ <action description="Изменение названий, титулов, опиÑаний ролей, а также наÑтройка публичноÑти их учаÑтников" longdescription="Изменение названий, титулов, опиÑаний ролей, а также наÑтройка публичноÑти их учаÑтников. Это можно Ñделать в разделе «Роли», в нижней чаÑти вкладки «Роли» Ð´Ð»Ñ Ð²Ñ‹Ð±Ñ€Ð°Ð½Ð½Ð¾Ð¹ роли." name="role properties" value="6"/>
+ <action description="Ðазначение учаÑтникам ролей назначающего" longdescription="Ðазначьте учаÑтникам роли в ÑпиÑке «Ðазначенные роли» (раздел «Роли» &gt; вкладка «УчаÑтники»). УчаÑтник Ñ Ñтой ÑпоÑобноÑтью может добавлÑть учаÑтников только той роли, в которой ÑоÑтоит он Ñам." name="role assign member limited" value="7"/>
+ <action description="Ðазначение учаÑтников любой роли" longdescription="Ðазначение учаÑтникам любой роли в ÑпиÑке «Ðазначенные роли» (раздел «Роли» &gt; вкладка «УчаÑтники»). *ПРЕДУПРЕЖДЕÐИЕ* Любой учаÑтник роли Ñ Ñтой ÑпоÑобноÑтью может назначить Ñебе (и любому другому учаÑтнику, кроме владельца) роли Ñ Ð±Ð¾Ð»ÑŒÑˆÐ¸Ð¼Ð¸ возможноÑÑ‚Ñми, чем он имеет, и поднÑтьÑÑ Ð¿Ñ€Ð°ÐºÑ‚Ð¸Ñ‡ÐµÑки до ÑƒÑ€Ð¾Ð²Ð½Ñ Ð²Ð»Ð°Ð´ÐµÐ»ÑŒÑ†Ð°. Прежде чем назначить Ñту ÑпоÑобноÑть, убедитеÑÑŒ в целеÑообразноÑти Ñтого." name="role assign member" value="8"/>
+ <action description="Удаление учаÑтников из ролей" longdescription="УдалÑйте учаÑтников из ролей в ÑпиÑке «Ðазначенные роли» (раздел «Роли» &gt; вкладка «УчаÑтники»). Владельцев удалÑть нельзÑ." name="role remove member" value="9"/>
+ <action description="Ðазначение и удаление ÑпоÑобноÑтей ролей" longdescription="Ðазначайте и удалÑйте ÑпоÑобноÑти Ð´Ð»Ñ Ñ€Ð¾Ð»ÐµÐ¹ в ÑпиÑке «ДоÑтупные ÑпоÑобноÑти» (раздел «Роли» &gt; вкладка «Роли»). *ПРЕДУПРЕЖДЕÐИЕ* Любой учаÑтник роли Ñ Ñ‚Ð°ÐºÐ¾Ð¹ ÑпоÑобноÑтью может назначить Ñебе (и любому другому учаÑтнику, кроме владельца) вÑе роли, потенциально поднимаÑÑÑŒ практичеÑки до ÑƒÑ€Ð¾Ð²Ð½Ñ Ð²Ð»Ð°Ð´ÐµÐ»ÑŒÑ†Ð°. Прежде чем назначить Ñту ÑпоÑобноÑть, убедитеÑÑŒ в целеÑообразноÑти Ñтого." name="role change actions" value="10"/>
+ </action_set>
+ <action_set description="К Ñтим ÑпоÑобноÑÑ‚Ñм отноÑитÑÑ ÑпоÑобноÑть изменить характер группы, в том чиÑле общедоÑтупноÑть, уÑтав и Ñимвол." name="Group Identity">
+ <action description="Изменение уÑтава, Ñимвола и параметра «Показать в поиÑке»" longdescription="Изменение уÑтава, Ñимвола и параметра «Показать в поиÑке». Это можно выполнить в разделе «Общие»." name="group change identity" value="11"/>
+ </action_set>
+ <action_set description="К Ñтим ÑпоÑобноÑÑ‚Ñм отноÑитÑÑ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‡Ð°, изменение и продажа земли из владений группы. Чтобы открыть окно «О земле», щелкните правой кнопкой мыши землю и выберите «О земле» либо щелкните значок «i» на панели навигации." name="Parcel Management">
+ <action description="Передача земли и покупка земли Ð´Ð»Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ñ‹" longdescription="Передача земли и покупка земли Ð´Ð»Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ñ‹. Это можно выполнить в окне «О земле» на вкладке «Общие»." name="land deed" value="12"/>
+ <action description="Отказ от земли в пользу владелицы Linden" longdescription="Отказ от земли в пользу владелицы Linden. *ПРЕДУПРЕЖДЕÐИЕ* Любой учаÑтник роли Ñ Ñтой ÑпоÑобноÑтью может отказатьÑÑ Ð¾Ñ‚ земли группы в окне «О земле» на вкладке «Общие», вернув ее во владение Linden без продажи. Прежде чем назначить Ñту ÑпоÑобноÑть, убедитеÑÑŒ в целеÑообразноÑти Ñтого." name="land release" value="13"/>
+ <action description="ÐаÑтройка Ñведений о продаже земли" longdescription="ÐаÑтройка Ñведений о продаже земли. *ПРЕДУПРЕЖДЕÐИЕ* Любой учаÑтник роли Ñ Ñтой ÑпоÑобноÑтью при желании может продать землю группы в окне «О земле» на вкладке «Общие». Прежде чем назначить Ñту ÑпоÑобноÑть, убедитеÑÑŒ в целеÑообразноÑти Ñтого." name="land set sale info" value="14"/>
+ <action description="Разделение и объединение учаÑтков" longdescription="Разделение и объединение учаÑтков. Ðеобходимо щелкнуть землю правой кнопкой мыши, выбрать пункт «Изменить ландшафт» и перемеÑтить курÑор на выбираемую землю. Чтобы выполнить разделение, выберите разделÑемый учаÑток и щелкните «Разделить». Чтобы выполнить объединение, выберите неÑколько граничащих учаÑтков и щелкните «Объединить»." name="land divide join" value="15"/>
+ </action_set>
+ <action_set description="К Ñтим ÑпоÑобноÑÑ‚Ñм отноÑитÑÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ðµ Ð½Ð°Ð·Ð²Ð°Ð½Ð¸Ñ ÑƒÑ‡Ð°Ñтка и Ð¿ÑƒÐ±Ð»Ð¸ÐºÐ°Ñ†Ð¸Ñ Ð½Ð°Ñтроек, поиÑк видимых каталогов, а также наÑтройки точек и вариантов телепортации." name="Parcel Identity">
+ <action description="Включение-отключение показа меÑта в результатах поиÑка и наÑтройка категории" longdescription="Включить-отключить показ меÑта в результатах поиÑка и наÑтроить категорию учаÑтка можно в окне «О земле» на вкладке «Параметры»." name="land find places" value="17"/>
+ <action description="Изменение Ð½Ð°Ð·Ð²Ð°Ð½Ð¸Ñ Ð¸Ð»Ð¸ опиÑÐ°Ð½Ð¸Ñ ÑƒÑ‡Ð°Ñтка, наÑтройки «Показать меÑто в поиÑке»" longdescription="Изменение Ð½Ð°Ð·Ð²Ð°Ð½Ð¸Ñ Ð¸Ð»Ð¸ опиÑÐ°Ð½Ð¸Ñ ÑƒÑ‡Ð°Ñтка, наÑтройки «Показать меÑто в поиÑке». Это можно выполнить в окне «О земле» на вкладке «Параметры»." name="land change identity" value="18"/>
+ <action description="УÑтановка конечной точки и варианта телепортации" longdescription="УчаÑтники роли Ñ Ñтой ÑпоÑобноÑтью могут уÑтановить конечную точку телепортации на учаÑтке группы, а также задать вариант телепортации Ð´Ð»Ñ ÑƒÑÐ¸Ð»ÐµÐ½Ð¸Ñ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»Ñ. Это можно выполнить в окне «О земле» на вкладке «Параметры»." name="land set landing point" value="19"/>
+ </action_set>
+ <action_set description="К Ñтим ÑпоÑобноÑÑ‚Ñм отноÑитÑÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ðµ наÑтроек учаÑтка, в Ñ‚. ч. «Создать объекты», «Изменить ландшафт», а также наÑтройки музыки и медиа." name="Parcel Settings">
+ <action description="Изменение наÑтроек музыки и медиа" longdescription="Измените наÑтройки потоковой музыки и фильмов в окне «О земле» на вкладке «Медиа»." name="land change media" value="20"/>
+ <action description="Включение-отключение Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð»Ð°Ð½Ð´ÑˆÐ°Ñ„Ñ‚Ð°" longdescription="Включение-отключение Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð»Ð°Ð½Ð´ÑˆÐ°Ñ„Ñ‚Ð°. *ПРЕДУПРЕЖДЕÐИЕ* Выбрав параметры «О земле» &gt; вкладка «Параметры» &gt; «Изменить ландшафт», любой пользователь может изменить форму земли, а также размещать или перемещать раÑÑ‚ÐµÐ½Ð¸Ñ Linden. Прежде чем назначить Ñту ÑпоÑобноÑть, убедитеÑÑŒ в целеÑообразноÑти Ñтого. Изменить ландшафт можно в окне «О земле» на вкладке «Параметры»." name="land edit" value="21"/>
+ <action description="Включение-отключение различных наÑтроек «О земле &gt; Параметры»" longdescription="Ð’ окне «О земле» на вкладке «Параметры» можно включить-отключить параметр «БезопаÑно (нет повреждений)», «Полет» и разрешить другим жителÑм изменÑть ландшафт, ÑтроительÑтво, Ñоздавать закладки и запуÑкать Ñкрипты Ð´Ð»Ñ Ð·ÐµÐ¼Ð»Ð¸ группы." name="land options" value="22"/>
+ </action_set>
+ <action_set description="К Ñтим ÑпоÑобноÑÑ‚Ñм отноÑитÑÑ Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ðµ учаÑтникам обходить Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð½Ð° учаÑтках группы." name="Parcel Powers">
+ <action description="Ð’Ñегда разрешено изменение ландшафта" longdescription="УчаÑтники роли Ñ Ñтой ÑпоÑобноÑтью могут изменÑть ландшафт учаÑтка группы, даже еÑли Ñто отключено в окне «О земле» на вкладке «Параметры»." name="land allow edit land" value="23"/>
+ <action description="Ð’Ñегда разрешен полет" longdescription="УчаÑтники роли Ñ Ñтой ÑпоÑобноÑтью могут летать над учаÑтком группы, даже еÑли Ñто отключено в окне «О земле» на вкладке «Параметры»." name="land allow fly" value="24"/>
+ <action description="Ð’Ñегда разрешено Ñоздавать объекты" longdescription="УчаÑтники роли Ñ Ñтой ÑпоÑобноÑтью могут Ñоздавать объекты на учаÑтке группы, даже еÑли Ñто отключено в окне «О земле» на вкладке «Параметры»." name="land allow create" value="25"/>
+ <action description="Ð’Ñегда разрешено Ñоздавать закладки" longdescription="УчаÑтники роли Ñ Ñтой ÑпоÑобноÑтью могут помеÑтить закладку на учаÑтке группы, даже еÑли Ñто отключено в окне «О земле» на вкладке «Параметры»." name="land allow landmark" value="26"/>
+ <action description="Разрешено уÑтановить дом на земле группы" longdescription="УчаÑтники роли Ñ Ñ‚Ð°ÐºÐ¾Ð¹ ÑпоÑобноÑтью могут иÑпользовать меню «Мир &gt; Закладки &gt; УÑтановить дом здеÑь» Ð´Ð»Ñ ÑƒÑ‡Ð°Ñтка, переданного Ñтой группе." name="land allow set home" value="28"/>
+ <action description="Разрешена Ð¾Ñ€Ð°Ð³Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ Ñобытий на земле группы" longdescription="УчаÑтники роли Ñ Ñтой ÑпоÑобноÑтью могут выбрать учаÑтки группы в качеÑтве любимого меÑта при организации ÑобытиÑ." name="land allow host event" value="41"/>
+ </action_set>
+ <action_set description="К Ñтим ÑпоÑобноÑÑ‚Ñм отноÑитÑÑ Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ðµ или ограничение доÑтупа к учаÑткам группы, в Ñ‚ ч. заморозка и выбраÑывание жителей." name="Parcel Access">
+ <action description="Управление ÑпиÑками доÑтупа к учаÑтку" longdescription="УправлÑть ÑпиÑками доÑтупа к учаÑтку можно в окне «О земле» на вкладке «ДоÑтуп»." name="land manage allowed" value="29"/>
+ <action description="Управление ÑпиÑками запрета доÑтупа к учаÑтку" longdescription="УправлÑть ÑпиÑками запрета доÑтупа к учаÑтку можно в окне «О земле» на вкладке «ДоÑтуп»." name="land manage banned" value="30"/>
+ <action description="Изменение наÑтроек продажи пропуÑков на учаÑток" longdescription="Изменить наÑтройки продажи пропуÑков на учаÑток можно в окне «О земле» на вкладке «ДоÑтуп»." name="land manage passes" value="31"/>
+ <action description="ВыбраÑывание и заморозка жителей на учаÑтках" longdescription="УчаÑтники роли Ñ Ñтой ÑпоÑобноÑтью могут оперировать нежелательными жителÑми на учаÑтке группы, выбрав их правой кнопкой мыши и щелкнув «Выкинуть» или «Заморозить»." name="land admin" value="32"/>
+ </action_set>
+ <action_set description="К Ñтим ÑпоÑобноÑÑ‚Ñм отноÑитÑÑ Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ðµ учаÑтникам возвращать объекты, размещать и перемещать раÑÑ‚ÐµÐ½Ð¸Ñ Linden. Это удобно при уборке разброÑанных объектов и формировании ландшафта, но Ñледует Ñоблюдать оÑторожноÑть, так как возврат объектов не отменÑетÑÑ." name="Parcel Content">
+ <action description="Возврат объектов группы" longdescription="Вернуть объекты, принадлежащие группе, на учаÑтки группы можно в окне «О земле» на вкладке «Объекты»." name="land return group owned" value="48"/>
+ <action description="Возврат объектов, назначенных группе" longdescription="Вернуть объекты, назначенные группе, на учаÑтки группы можно в окне «О земле» на вкладке «Объекты»." name="land return group set" value="33"/>
+ <action description="Возврат объектов, не принадлежащих группе" longdescription="Вернуть объекты, не принадлежащие группе, на учаÑтки группы можно в окне «О земле» на вкладке «Объекты»." name="land return non group" value="34"/>
+ <action description="Формирование ландшафта Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ раÑтений Linden" longdescription="СпоÑобноÑть формировать ландшафт и перемещать деревьÑ, раÑÑ‚ÐµÐ½Ð¸Ñ Ð¸ траву Linden. Эти вещи находÑÑ‚ÑÑ Ð² папке Ð¸Ð½Ð²ÐµÐ½Ñ‚Ð°Ñ€Ñ Â«Ð‘Ð¸Ð±Ð»Ð¸Ð¾Ñ‚ÐµÐºÐ° &gt; Объекты», либо их можно Ñоздать Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ меню «СтроительÑтво»." name="land gardening" value="35"/>
+ </action_set>
+ <action_set description="К Ñтим ÑпоÑобноÑÑ‚Ñм отноÑитÑÑ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‡Ð°, изменение и продажа объектов группы. Ð”Ð»Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¸ÑпользуетÑÑ Ð²ÐºÐ»Ð°Ð´ÐºÐ° «Общие» в группе «ИнÑтрументы Ð´Ð»Ñ ÑтроительÑтва». Чтобы проÑмотреть наÑтройки, щелкните объект правой кнопкой и выберите пункт «Изменить»." name="Object Management">
+ <action description="Передача объектов группе" longdescription="Передать объекты группе можно на вкладке «Общие» в группе «ИнÑтрументы Ð´Ð»Ñ ÑтроительÑтва»." name="object deed" value="36"/>
+ <action description="Оперирование (перемещение, копирование, изменение) объектами группы" longdescription="Оперировать (перемещать, копировать, изменÑть) объекты группы можно на вкладке «Общие» в группе «ИнÑтрументы Ð´Ð»Ñ ÑтроительÑтва»." name="object manipulate" value="38"/>
+ <action description="Выбор объектов группы на продажу" longdescription="Выбрать объекты группы на продажу можно на вкладке «Общие» в группе «ИнÑтрументы Ð´Ð»Ñ ÑтроительÑтва»." name="object set sale" value="39"/>
+ </action_set>
+ <action_set description="Эти ÑпоÑобноÑти обÑзывают учаÑтников выплачивать задолженноÑти и дают право получать прибыли группы, а также ограничивают доÑтуп к журналу аккаунтов группы." name="Accounting">
+ <action description="Выплата задолженноÑтей и получение прибыли группы" longdescription="УчаÑтники роли Ñ Ñтой ÑпоÑобноÑтью будут автоматичеÑки выплачивать задолженноÑти и получать прибыль группы. Они будут получать чаÑть прибыли от продажи земель группы, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ñ€Ð°ÑпределÑетÑÑ ÐµÐ¶ÐµÐ´Ð½ÐµÐ²Ð½Ð¾, а также вноÑить плату, например, за ÑпиÑок учаÑтков." name="accounting accountable" value="40"/>
+ </action_set>
+ <action_set description="К Ñтим ÑпоÑобноÑÑ‚Ñм отноÑитÑÑ Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ðµ учаÑтникам отправлÑть, получать и проÑматривать ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð¾Ñ‚ группы." name="Notices">
+ <action description="Отправка уведомлений" longdescription="УчаÑтники роли Ñ Ñтой ÑпоÑобноÑтью могут отправлÑть уведомлениÑ, выбрав «Группа» &gt; раздел «УведомлениÑ»." name="notices send" value="42"/>
+ <action description="Получение новых и проÑмотр Ñтарых уведомлений" longdescription="УчаÑтники роли Ñ Ñтой ÑпоÑобноÑтью могут получать новые и проÑматривать Ñтарые уведомлениÑ, выбрав «Группа» &gt; раздел «УведомлениÑ»." name="notices receive" value="43"/>
+ </action_set>
+ <action_set description="К Ñтим ÑпоÑобноÑÑ‚Ñм отноÑитÑÑ Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ðµ или ограничение доÑтупа к ÑеанÑам чата и голоÑовому чату группы." name="Chat">
+ <action description="ПриÑоединение к чату группы" longdescription="УчаÑтники роли Ñ Ñтой ÑпоÑобноÑтью могут приÑоединÑтьÑÑ Ðº ÑеанÑам чата группы (текÑтового и голоÑового)." name="join group chat" value="16"/>
+ <action description="ПриÑоединение к голоÑовому чату группы" longdescription="УчаÑтники роли Ñ Ñтой ÑпоÑобноÑтью могут приÑоединÑтьÑÑ Ðº ÑеанÑам голоÑового чата группы. ПРИМЕЧÐÐИЕ. СпоÑобноÑть «ПриÑоединение к чату группы» необходима Ð´Ð»Ñ Ð´Ð¾Ñтупа к ÑеанÑам голоÑового чата." name="join voice chat" value="27"/>
+ <action description="Moderate-чат группы" longdescription="УчаÑтники роли Ñ Ñтой ÑпоÑобноÑтью могут контролировать доÑтуп и учаÑтие в ÑеанÑах текÑтового и голоÑового чата группы." name="moderate group chat" value="37"/>
+ </action_set>
+</role_actions>
diff --git a/indra/newview/skins/default/xui/ru/sidepanel_appearance.xml b/indra/newview/skins/default/xui/ru/sidepanel_appearance.xml
new file mode 100644
index 0000000000..a23f6134f2
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/sidepanel_appearance.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="КоÑтюмы" name="appearance panel">
+ <string name="No Outfit" value="Ðет коÑтюма"/>
+ <string name="Unsaved Changes" value="Ðе Ñохраненные изменениÑ"/>
+ <string name="Now Wearing" value="Ð¡ÐµÐ¹Ñ‡Ð°Ñ Ð½Ð°Ð´ÐµÑ‚Ð¾..."/>
+ <string name="Changing outfits" value="Смена коÑтюмов"/>
+ <panel name="panel_currentlook">
+ <button label="E" name="editappearance_btn"/>
+ <button label="O" name="openoutfit_btn"/>
+ <text name="currentlook_status">
+ (СтатуÑ)
+ </text>
+ <text name="currentlook_name">
+ Мой коÑтюм Ñ Ð¾Ñ‡ÐµÐ½ÑŒ длинным названием, например, ЛОСОСЬ
+ </text>
+ <button label="" name="edit_outfit_btn" tool_tip="Изменить коÑтюм"/>
+ </panel>
+ <filter_editor label="Фильтр Ð´Ð»Ñ ÐºÐ¾Ñтюмов" name="Filter"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/sidepanel_inventory.xml b/indra/newview/skins/default/xui/ru/sidepanel_inventory.xml
new file mode 100644
index 0000000000..a4150f6e2f
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/sidepanel_inventory.xml
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Вещи" name="objects panel">
+ <panel label="" name="sidepanel__inventory_panel">
+ <layout_stack name="inventory_layout_stack">
+ <layout_panel name="inbox_outbox_layout_panel">
+ <layout_stack name="inbox_outbox_layout_stack">
+ <layout_panel name="inbox_layout_panel">
+ <panel label="" name="marketplace_inbox">
+ <string name="InboxLabelWithArg">
+ Полученные вещи ([NUM])
+ </string>
+ <string name="InboxLabelNoArg">
+ Полученные вещи
+ </string>
+ <button label="Полученные вещи" name="inbox_btn"/>
+ <text name="inbox_fresh_new_count">
+ Ðовых: [NUM]
+ </text>
+ <panel tool_tip="Drag and drop items to your inventory to manage and use them">
+ <text name="inbox_inventory_placeholder">
+ Покупки из торгового центра будут доÑтавлены Ñюда.
+ </text>
+ </panel>
+ </panel>
+ </layout_panel>
+ <layout_panel name="outbox_layout_panel">
+ <panel label="" name="marketplace_outbox">
+ <string name="OutboxLabelWithArg">
+ Торговые иÑходÑщие ([NUM])
+ </string>
+ <string name="OutboxLabelNoArg">
+ Торговые иÑходÑщие
+ </string>
+ <button label="Торговые иÑходÑщие" name="outbox_btn"/>
+ <button label="" name="outbox_sync_btn" tool_tip="Ð’Ñ‹Ñтавить на витрину моего магазина"/>
+ <panel>
+ <panel name="outbox_inventory_placeholder_panel">
+ <text name="outbox_inventory_placeholder_title">
+ Загрузка...
+ </text>
+ </panel>
+ </panel>
+ </panel>
+ </layout_panel>
+ </layout_stack>
+ </layout_panel>
+ </layout_stack>
+ <panel name="button_panel">
+ <layout_stack name="button_panel_ls">
+ <layout_panel name="info_btn_lp">
+ <button label="Профиль" name="info_btn" tool_tip="Показать профиль объекта"/>
+ </layout_panel>
+ <layout_panel name="share_btn_lp">
+ <button label="ПоделитьÑÑ" name="share_btn" tool_tip="ПоделитьÑÑ Ð²ÐµÑ‰ÑŒÑŽ из инвентарÑ"/>
+ </layout_panel>
+ <layout_panel name="shop_btn_lp">
+ <button label="Торговый центр" name="shop_btn" tool_tip="Открыть Ñтраницу торгового центра"/>
+ <button label="Ðадеть" name="wear_btn" tool_tip="Ðадеть выбранный коÑтюм"/>
+ <button label="Проиграть" name="play_btn"/>
+ <button label="Телепорт" name="teleport_btn" tool_tip="ТелепортироватьÑÑ Ð² выбранную облаÑть"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/sidepanel_item_info.xml b/indra/newview/skins/default/xui/ru/sidepanel_item_info.xml
new file mode 100644
index 0000000000..62095acbaf
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/sidepanel_item_info.xml
@@ -0,0 +1,76 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="item properties" title="Профиль объекта">
+ <panel.string name="unknown">
+ (неизвеÑтно)
+ </panel.string>
+ <panel.string name="public">
+ (публичное)
+ </panel.string>
+ <panel.string name="you_can">
+ Вы можете:
+ </panel.string>
+ <panel.string name="owner_can">
+ Владелец может:
+ </panel.string>
+ <panel.string name="acquiredDate">
+ [wkday,datetime,local], [day,datetime,local] [mth,datetime,local] [year,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local]
+ </panel.string>
+ <panel.string name="origin_inventory">
+ (инвентарь)
+ </panel.string>
+ <panel.string name="origin_inworld">
+ (в мире)
+ </panel.string>
+ <text name="title" value="Профиль объекта"/>
+ <text name="origin" value="(инвентарь)"/>
+ <scroll_container name="item_profile_scroll">
+ <panel label="" name="item_profile">
+ <text name="LabelItemNameTitle">
+ Ðазвание:
+ </text>
+ <text name="LabelItemDescTitle">
+ ОпиÑание:
+ </text>
+ <text name="LabelCreatorTitle">
+ Создатель:
+ </text>
+ <text name="LabelOwnerTitle">
+ Владелец:
+ </text>
+ <text name="LabelAcquiredTitle">
+ Приобретено:
+ </text>
+ <panel name="perms_inv">
+ <text name="perm_modify">
+ Вы можете:
+ </text>
+ <check_box label="ИзменÑть" name="CheckOwnerModify"/>
+ <check_box label="Копировать" name="CheckOwnerCopy"/>
+ <check_box label="Передать" name="CheckOwnerTransfer"/>
+ <text name="AnyoneLabel">
+ Ð’Ñе:
+ </text>
+ <check_box label="Копировать" name="CheckEveryoneCopy"/>
+ <text name="GroupLabel">
+ Группа:
+ </text>
+ <check_box label="ПоделитьÑÑ" name="CheckShareWithGroup" tool_tip="Позволить вÑем учаÑтникам выбранной группы получить уÑтановленные вам права на Ñтот объект. Ð”Ð»Ñ Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ñ€Ð¾Ð»ÐµÐ²Ñ‹Ñ… ограничений необходимо произвеÑти Ñделку."/>
+ <text name="NextOwnerLabel">
+ Следующий владелец:
+ </text>
+ <check_box label="ИзменÑть" name="CheckNextOwnerModify"/>
+ <check_box label="Копировать" name="CheckNextOwnerCopy"/>
+ <check_box label="Передать" name="CheckNextOwnerTransfer" tool_tip="Следующий владелец может отдать или перепродать объект"/>
+ </panel>
+ <check_box label="Ð”Ð»Ñ Ð¿Ñ€Ð¾Ð´Ð°Ð¶Ð¸" name="CheckPurchase"/>
+ <combo_box name="combobox sale copy">
+ <combo_box.item label="Копировать" name="Copy"/>
+ <combo_box.item label="Оригинал" name="Original"/>
+ </combo_box>
+ <spinner label="Цена: L$" name="Edit Cost"/>
+ </panel>
+ </scroll_container>
+ <panel name="button_panel">
+ <button label="Отмена" name="cancel_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/sidepanel_task_info.xml b/indra/newview/skins/default/xui/ru/sidepanel_task_info.xml
new file mode 100644
index 0000000000..8e56dd80c0
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/sidepanel_task_info.xml
@@ -0,0 +1,123 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="object properties" title="Профиль объекта">
+ <panel.string name="text deed continued">
+ Сделка
+ </panel.string>
+ <panel.string name="text deed">
+ Сделка
+ </panel.string>
+ <panel.string name="text modify info 1">
+ Этот объект можно изменÑть
+ </panel.string>
+ <panel.string name="text modify info 2">
+ Эти объекты можно изменÑть
+ </panel.string>
+ <panel.string name="text modify info 3">
+ Этот объект Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ð·Ð¼ÐµÐ½Ñть
+ </panel.string>
+ <panel.string name="text modify info 4">
+ Эти объекты Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ð·Ð¼ÐµÐ½Ñть
+ </panel.string>
+ <panel.string name="text modify warning">
+ Этот объект Ñодержит объединенные чаÑти
+ </panel.string>
+ <panel.string name="Cost Default">
+ Цена: L$
+ </panel.string>
+ <panel.string name="Cost Total">
+ Ð’Ñего: L$
+ </panel.string>
+ <panel.string name="Cost Per Unit">
+ Цена за: L$
+ </panel.string>
+ <panel.string name="Cost Mixed">
+ Ð¡Ð¼ÐµÑˆÐ°Ð½Ð½Ð°Ñ Ñ†ÐµÐ½Ð°
+ </panel.string>
+ <panel.string name="Sale Mixed">
+ Ð¡Ð¼ÐµÑˆÐ°Ð½Ð½Ð°Ñ Ð¿Ñ€Ð¾Ð´Ð°Ð¶Ð°
+ </panel.string>
+ <text name="title" value="Профиль объекта"/>
+ <text name="where" value="(в мире)"/>
+ <panel label="" name="properties_panel">
+ <text name="Name:">
+ Ðазвание:
+ </text>
+ <text name="Description:">
+ ОпиÑание:
+ </text>
+ <text name="CreatorNameLabel">
+ Создатель:
+ </text>
+ <text name="Owner:">
+ Владелец:
+ </text>
+ <text name="Group_label">
+ Группа:
+ </text>
+ <button name="button set group" tool_tip="Выберите группу Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‡Ð¸ ей прав доÑтупа к объекту"/>
+ <name_box initial_value="Загрузка..." name="Group Name Proxy"/>
+ <button label="Сделка" label_selected="Сделка" name="button deed" tool_tip="Ð’ результате Ñделки объект передаетÑÑ Ð³Ñ€ÑƒÐ¿Ð¿Ðµ, при Ñтом права на него будут ÑоответÑтвовать правам Ñледующего владельца. Переданный группе объект может передаватьÑÑ Ð´Ð¾Ð»Ð¶Ð½Ð¾Ñтным лицом группы."/>
+ <text name="label click action">
+ ДейÑтвие по щелчку:
+ </text>
+ <combo_box name="clickaction">
+ <combo_box.item label="КоÑнутьÑÑ (по умолчанию)" name="Touch/grab(default)"/>
+ <combo_box.item label="СеÑть на объект" name="Sitonobject"/>
+ <combo_box.item label="Купить объект" name="Buyobject"/>
+ <combo_box.item label="Заплатить за объект" name="Payobject"/>
+ <combo_box.item label="Открыть" name="Open"/>
+ </combo_box>
+ <panel name="perms_inv">
+ <text name="perm_modify">
+ Этот объект можно изменÑть
+ </text>
+ <text name="Anyone can:">
+ Ð’Ñе:
+ </text>
+ <check_box label="Копировать" name="checkbox allow everyone copy"/>
+ <check_box label="ПеремеÑтить" name="checkbox allow everyone move"/>
+ <text name="GroupLabel">
+ Группа:
+ </text>
+ <check_box label="ПоделитьÑÑ" name="checkbox share with group" tool_tip="Позволить вÑем учаÑтникам выбранной группы получить уÑтановленные вам права на Ñтот объект. Ð”Ð»Ñ Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ñ€Ð¾Ð»ÐµÐ²Ñ‹Ñ… ограничений необходимо произвеÑти Ñделку."/>
+ <text name="NextOwnerLabel">
+ Следующий владелец:
+ </text>
+ <check_box label="ИзменÑть" name="checkbox next owner can modify"/>
+ <check_box label="Копировать" name="checkbox next owner can copy"/>
+ <check_box label="Передать" name="checkbox next owner can transfer" tool_tip="Следующий владелец может отдать или перепродать объект"/>
+ </panel>
+ <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="Original"/>
+ </combo_box>
+ <spinner label="Цена: L$" name="Edit Cost"/>
+ <check_box label="Показать в результатах поиÑка" name="search_check" tool_tip="Показывать объект в результатах поиÑка"/>
+ <text name="B:">
+ Ð:
+ </text>
+ <text name="O:">
+ O:
+ </text>
+ <text name="G:">
+ G:
+ </text>
+ <text name="E:">
+ Ð’:
+ </text>
+ <text name="N:">
+ С:
+ </text>
+ <text name="F:">
+ F:
+ </text>
+ </panel>
+ <panel name="button_panel">
+ <button label="Открыть" name="open_btn"/>
+ <button label="Заплатить" name="pay_btn"/>
+ <button label="Купить" name="buy_btn"/>
+ <button label="ПодробноÑти" name="details_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/strings.xml b/indra/newview/skins/default/xui/ru/strings.xml
new file mode 100644
index 0000000000..6d954139ff
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/strings.xml
@@ -0,0 +1,4997 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- This file contains strings that used to be hardcoded in the source.
+ It is only for those strings which do not belong in a floater.
+ For example, the strings used in avatar chat bubbles, and strings
+ that are returned from one component and may appear in many places-->
+<strings>
+ <string name="SECOND_LIFE">
+ Second Life
+ </string>
+ <string name="APP_NAME">
+ Second Life
+ </string>
+ <string name="CAPITALIZED_APP_NAME">
+ SECOND LIFE
+ </string>
+ <string name="SECOND_LIFE_GRID">
+ Сетка Second Life
+ </string>
+ <string name="SUPPORT_SITE">
+ Портал поддержки Second Life
+ </string>
+ <string name="StartupDetectingHardware">
+ Проверка оборудованиÑ...
+ </string>
+ <string name="StartupLoading">
+ ЗагружаетÑÑ [APP_NAME]...
+ </string>
+ <string name="StartupClearingCache">
+ ОчиÑтка кÑша...
+ </string>
+ <string name="StartupInitializingTextureCache">
+ Ð˜Ð½Ð¸Ñ†Ð¸Ð°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñ ÐºÑша текÑтур...
+ </string>
+ <string name="StartupInitializingVFS">
+ Ð˜Ð½Ð¸Ñ†Ð¸Ð°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð²Ð¸Ñ€Ñ‚ÑƒÐ°Ð»ÑŒÐ½Ð¾Ð¹ файловой ÑиÑтемы...
+ </string>
+ <string name="StartupRequireDriverUpdate">
+ Ошибка инициализации графики. Обновите графичеÑкий драйвер!
+ </string>
+ <string name="ProgressRestoring">
+ ВоÑÑтановление...
+ </string>
+ <string name="ProgressChangingResolution">
+ Изменение разрешениÑ...
+ </string>
+ <string name="Fullbright">
+ СобÑÑ‚Ð²ÐµÐ½Ð½Ð°Ñ ÑркоÑть (уÑтаревший параметр)
+ </string>
+ <string name="LoginInProgress">
+ Вход... Может показатьÑÑ, что программа [APP_NAME] завиÑла. Ожидайте.
+ </string>
+ <string name="LoginInProgressNoFrozen">
+ Вход...
+ </string>
+ <string name="LoginAuthenticating">
+ ÐутентификациÑ
+ </string>
+ <string name="LoginMaintenance">
+ Идет обÑлуживание аккаунта...
+ </string>
+ <string name="LoginAttempt">
+ ÐŸÑ€ÐµÐ´Ñ‹Ð´ÑƒÑ‰Ð°Ñ Ð¿Ð¾Ð¿Ñ‹Ñ‚ÐºÐ° входа была неудачной. Вход: попытка â„– [NUMBER]
+ </string>
+ <string name="LoginPrecaching">
+ Загрузка мира...
+ </string>
+ <string name="LoginInitializingBrowser">
+ Ð˜Ð½Ð¸Ñ†Ð¸Ð°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð²Ñтроенного веб-браузера...
+ </string>
+ <string name="LoginInitializingMultimedia">
+ Ð˜Ð½Ð¸Ñ†Ð¸Ð°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð¼ÑƒÐ»ÑŒÑ‚Ð¸Ð¼ÐµÐ´Ð¸Ð°...
+ </string>
+ <string name="LoginInitializingFonts">
+ Загрузка шрифтов...
+ </string>
+ <string name="LoginVerifyingCache">
+ Проверка файлов кÑша (может занÑть 60-90 Ñ)...
+ </string>
+ <string name="LoginProcessingResponse">
+ Обработка ответа...
+ </string>
+ <string name="LoginInitializingWorld">
+ Ð˜Ð½Ð¸Ñ†Ð¸Ð°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð¼Ð¸Ñ€Ð°...
+ </string>
+ <string name="LoginDecodingImages">
+ Декодирование изображений...
+ </string>
+ <string name="LoginInitializingQuicktime">
+ Ð˜Ð½Ð¸Ñ†Ð¸Ð°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñ QuickTime...
+ </string>
+ <string name="LoginQuicktimeNotFound">
+ QuickTime не найден – ошибка инициализации.
+ </string>
+ <string name="LoginQuicktimeOK">
+ УÑÐ¿ÐµÑˆÐ½Ð°Ñ Ð¸Ð½Ð¸Ñ†Ð¸Ð°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñ QuickTime.
+ </string>
+ <string name="LoginRequestSeedCapGrant">
+ Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾Ñтей региона...
+ </string>
+ <string name="LoginRetrySeedCapGrant">
+ Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾Ñтей региона, попытка [NUMBER]...
+ </string>
+ <string name="LoginWaitingForRegionHandshake">
+ УÑтанавливаетÑÑ ÑвÑзь Ñ Ñ€ÐµÐ³Ð¸Ð¾Ð½Ð¾Ð¼...
+ </string>
+ <string name="LoginConnectingToRegion">
+ Подключение к региону...
+ </string>
+ <string name="LoginDownloadingClothing">
+ Загрузка одежды...
+ </string>
+ <string name="InvalidCertificate">
+ Сервер возвратил недейÑтвительный или поврежденный Ñертификат. ОбратитеÑÑŒ к админиÑтратору Ñетки.
+ </string>
+ <string name="CertInvalidHostname">
+ Ð”Ð»Ñ Ð´Ð¾Ñтупа к Ñерверу иÑпользовалоÑÑŒ недейÑтвительное Ð¸Ð¼Ñ ÑƒÐ·Ð»Ð°. Проверьте URL-Ð°Ð´Ñ€ÐµÑ SL или Ð¸Ð¼Ñ ÑƒÐ·Ð»Ð° в Ñетке.
+ </string>
+ <string name="CertExpired">
+ Ð¡ÑƒÐ´Ñ Ð¿Ð¾ вÑему, иÑтек Ñрок дейÑÑ‚Ð²Ð¸Ñ Ñертификата, возвращенного Ñеткой. Проверьте времÑ, уÑтановленное в ÑиÑтеме, или обратитеÑÑŒ к админиÑтратору Ñетки.
+ </string>
+ <string name="CertKeyUsage">
+ Ðе удалоÑÑŒ иÑпользовать в протоколе SSL Ñертификат, возвращенный Ñервером. ОбратитеÑÑŒ к админиÑтратору Ñетки.
+ </string>
+ <string name="CertBasicConstraints">
+ Ð’ цепочке Ñертификатов Ñерверов Ñлишком много Ñертификатов. ОбратитеÑÑŒ к админиÑтратору Ñетки.
+ </string>
+ <string name="CertInvalidSignature">
+ Ðе удалоÑÑŒ проверить подпиÑÑŒ Ñертификата, возвращенного Ñервером Ñетки. ОбратитеÑÑŒ к админиÑтратору Ñетки.
+ </string>
+ <string name="LoginFailedNoNetwork">
+ Ошибка Ñети: не удалоÑÑŒ уÑтановить Ñоединение. Проверьте подключение к Ñети.
+ </string>
+ <string name="LoginFailed">
+ Ошибка входа.
+ </string>
+ <string name="Quit">
+ Выйти
+ </string>
+ <string name="create_account_url">
+ http://join.secondlife.com/
+ </string>
+ <string name="LoginFailedViewerNotPermitted">
+ У клиента, которым вы пользуетеÑÑŒ, больше нет доÑтупа к игре Second Life. Загрузить новую верÑию клиента можно по адреÑу
+http://secondlife.com/download
+
+Дополнительные ÑÐ²ÐµÐ´ÐµÐ½Ð¸Ñ Ñм. в разделе вопроÑов и ответов по адреÑу
+http://secondlife.com/viewer-access-faq
+ </string>
+ <string name="LoginIntermediateOptionalUpdateAvailable">
+ ДоÑтупно необÑзательное обновление клиента: [VERSION]
+ </string>
+ <string name="LoginFailedRequiredUpdate">
+ Ðеобходимо обновить клиент: [VERSION]
+ </string>
+ <string name="LoginFailedAlreadyLoggedIn">
+ С Ñтого клиента уже выполнен вход.
+ </string>
+ <string name="LoginFailedAuthenticationFailed">
+ Извините! Ðе удаетÑÑ Ð¾Ð±ÐµÑпечить ваш вход.
+УбедитеÑÑŒ, что вы правильно ввели:
+ * Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ (например, bobsmith12 или steller.sunshine)
+ * пароль
+Кроме того, убедитеÑÑŒ, что режим Caps Lock отключен.
+ </string>
+ <string name="LoginFailedPasswordChanged">
+ Ð’ качеÑтве меры предоÑторожноÑти ваш пароль изменен.
+Перейдите на Ñтраницу Ñвоего аккаунта по адреÑу http://secondlife.com/password
+и ответьте на контрольный вопроÑ, чтобы воÑÑтановить Ñвой пароль
+ПриноÑим Ð¸Ð·Ð²Ð¸Ð½ÐµÐ½Ð¸Ñ Ð·Ð° неудобÑтво.
+ </string>
+ <string name="LoginFailedPasswordReset">
+ Ð’ нашу ÑиÑтему внеÑены изменениÑ, поÑтому вам Ñледует воÑÑтановить Ñвой пароль.
+Перейдите на Ñтраницу Ñвоего аккаунта по адреÑу http://secondlife.com/password
+и ответьте на контрольный вопроÑ, чтобы воÑÑтановить Ñвой пароль
+ПриноÑим Ð¸Ð·Ð²Ð¸Ð½ÐµÐ½Ð¸Ñ Ð·Ð° неудобÑтво.
+ </string>
+ <string name="LoginFailedEmployeesOnly">
+ Сайт Second Life временно закрыт на техничеÑкое обÑлуживание.
+Ð’ данное Ð²Ñ€ÐµÐ¼Ñ Ð²Ñ…Ð¾Ð´Ð¸Ñ‚ÑŒ могут только Ñотрудники.
+Обновление ÑоÑтоÑÐ½Ð¸Ñ Ñм. на веб-Ñтранице www.secondlife.com/status.
+ </string>
+ <string name="LoginFailedPremiumOnly">
+ Вход в Second Life временно ограничен, чтобы обеÑпечить наилучшее времÑпровождение в игровом мире.
+
+Ð’ Ñто Ð²Ñ€ÐµÐ¼Ñ Ñƒ пользователей Ñ Ð±ÐµÑплатными аккаунтами не будет доÑтупа к Second Life, чтобы у тех, кто заплатил, было больше меÑта.
+ </string>
+ <string name="LoginFailedComputerProhibited">
+ ÐÐµÐ»ÑŒÐ·Ñ Ð²Ñ…Ð¾Ð´Ð¸Ñ‚ÑŒ в игру Second Life на Ñтом компьютере.
+ЕÑли вы Ñчитаете, что Ñто ошибка, отправьте Ñообщение по адреÑу
+support@secondlife.com.
+ </string>
+ <string name="LoginFailedAcountSuspended">
+ Ваш аккаунт не будет доÑтупен до
+[TIME] по тихоокеанÑкому времени.
+ </string>
+ <string name="LoginFailedAccountDisabled">
+ Ð’ данное Ð²Ñ€ÐµÐ¼Ñ Ð½Ð°Ð¼ не удаетÑÑ Ð²Ñ‹Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÑŒ ваш запроÑ.
+ОбратитеÑÑŒ за помощью в Ñлужбу поддержки Second Life по адреÑу http://secondlife.com/support.
+ЕÑли вам не удаетÑÑ Ð¸Ð·Ð¼ÐµÐ½Ð¸Ñ‚ÑŒ Ñвой пароль, позвоните по телефону (866) 476-9763.
+ </string>
+ <string name="LoginFailedTransformError">
+ При входе обнаружена неÑоглаÑованноÑть данных.
+Ðапишите ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¿Ð¾ адреÑу support@secondlife.com.
+ </string>
+ <string name="LoginFailedAccountMaintenance">
+ ВыполнÑетÑÑ Ð½ÐµÐ±Ð¾Ð»ÑŒÑˆÐ¾Ðµ обÑлуживание вашего аккаунта.
+Ваш аккаунт не будет доÑтупен до
+[TIME] по тихоокеанÑкому времени.
+ЕÑли вы Ñчитаете, что Ñто ошибка, отправьте Ñообщение по адреÑу support@secondlife.com.
+ </string>
+ <string name="LoginFailedPendingLogoutFault">
+ Ð’ ответ на Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð²Ñ‹Ñ…Ð¾Ð´Ð° ÑимулÑтор возвратил Ñообщение о Ñбое.
+ </string>
+ <string name="LoginFailedPendingLogout">
+ Ð’ ÑиÑтеме выполнÑетÑÑ Ð²Ñ‹Ñ…Ð¾Ð´ Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ аккаунта.
+Она будет недоÑтупна до
+[TIME] по тихоокеанÑкому времени.
+ </string>
+ <string name="LoginFailedUnableToCreateSession">
+ Ðе удаетÑÑ Ñоздать допуÑтимый ÑеанÑ.
+ </string>
+ <string name="LoginFailedUnableToConnectToSimulator">
+ Ðе удаетÑÑ Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡Ð¸Ñ‚ÑŒÑÑ Ðº ÑимулÑтору.
+ </string>
+ <string name="LoginFailedRestrictedHours">
+ Вы можете входить в Second Life только
+от [START] до [END] по тихоокеанÑкому времени.
+Заходите в Ñто времÑ.
+ЕÑли вы Ñчитаете, что Ñто ошибка, отправьте Ñообщение по адреÑу support@secondlife.com.
+ </string>
+ <string name="LoginFailedIncorrectParameters">
+ Ðеправильные параметры.
+ЕÑли вы Ñчитаете, что Ñто ошибка, отправьте Ñообщение по адреÑу support@secondlife.com.
+ </string>
+ <string name="LoginFailedFirstNameNotAlphanumeric">
+ Ð˜Ð¼Ñ Ð´Ð¾Ð»Ð¶Ð½Ð¾ ÑоÑтоÑть только из букв и цифр.
+ЕÑли вы Ñчитаете, что Ñто ошибка, отправьте Ñообщение по адреÑу support@secondlife.com.
+ </string>
+ <string name="LoginFailedLastNameNotAlphanumeric">
+ Ð¤Ð°Ð¼Ð¸Ð»Ð¸Ñ Ð´Ð¾Ð»Ð¶Ð½Ð° ÑоÑтоÑть только из букв и цифр.
+ЕÑли вы Ñчитаете, что Ñто ошибка, отправьте Ñообщение по адреÑу support@secondlife.com.
+ </string>
+ <string name="LogoutFailedRegionGoingOffline">
+ Регион переходит в автономный режим.
+Попробуйте повторно войти через минуту.
+ </string>
+ <string name="LogoutFailedAgentNotInRegion">
+ Ðгент отÑутÑтвует в регионе.
+Попробуйте повторно войти через минуту.
+ </string>
+ <string name="LogoutFailedPendingLogin">
+ Вход в регион выполнен в другом ÑеанÑе.
+Попробуйте повторно войти через минуту.
+ </string>
+ <string name="LogoutFailedLoggingOut">
+ Ð”Ð»Ñ Ñ€ÐµÐ³Ð¸Ð¾Ð½Ð° выполнен выход в предыдущем ÑеанÑе.
+Попробуйте повторно войти через минуту.
+ </string>
+ <string name="LogoutFailedStillLoggingOut">
+ Ð”Ð»Ñ Ñ€ÐµÐ³Ð¸Ð¾Ð½Ð° вÑе еще выполнÑетÑÑ Ð²Ñ‹Ñ…Ð¾Ð´ в предыдущем ÑеанÑе.
+Попробуйте повторно войти через минуту.
+ </string>
+ <string name="LogoutSucceeded">
+ Ð’ поÑледнем ÑеанÑе Ð´Ð»Ñ Ñ€ÐµÐ³Ð¸Ð¾Ð½Ð° выполнен выход.
+Попробуйте повторно войти через минуту.
+ </string>
+ <string name="LogoutFailedLogoutBegun">
+ Ð”Ð»Ñ Ñ€ÐµÐ³Ð¸Ð¾Ð½Ð° начат процеÑÑ Ð²Ñ‹Ñ…Ð¾Ð´Ð°.
+Попробуйте повторно войти через минуту.
+ </string>
+ <string name="LoginFailedLoggingOutSession">
+ Во Ð²Ñ€ÐµÐ¼Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ поÑледнего ÑеанÑа ÑиÑтема начала процедуру выхода.
+Попробуйте повторно войти через минуту.
+ </string>
+ <string name="AgentLostConnection">
+ Возможно, в Ñтом регионе возникли проблемы. Проверьте подключение к Интернету.
+ </string>
+ <string name="SavingSettings">
+ Сохранение наÑтроек...
+ </string>
+ <string name="LoggingOut">
+ ВыполнÑетÑÑ Ð²Ñ‹Ñ…Ð¾Ð´...
+ </string>
+ <string name="ShuttingDown">
+ Игра закрываетÑÑ...
+ </string>
+ <string name="YouHaveBeenDisconnected">
+ Произошло отключение от региона, в котором вы находилиÑÑŒ.
+ </string>
+ <string name="SentToInvalidRegion">
+ Ð’Ñ‹ отправлены в недейÑтвительный регион.
+ </string>
+ <string name="TestingDisconnect">
+ ТеÑтирование Ð¾Ñ‚ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ ÐºÐ»Ð¸ÐµÐ½Ñ‚Ð°
+ </string>
+ <string name="TooltipPerson">
+ Человек
+ </string>
+ <string name="TooltipNoName">
+ (нет имени)
+ </string>
+ <string name="TooltipOwner">
+ Владелец:
+ </string>
+ <string name="TooltipPublic">
+ ОбщедоÑтупно
+ </string>
+ <string name="TooltipIsGroup">
+ (группа)
+ </string>
+ <string name="TooltipForSaleL$">
+ ПродаетÑÑ: L$[AMOUNT]
+ </string>
+ <string name="TooltipFlagGroupBuild">
+ Стройка в ÑоÑтаве группы
+ </string>
+ <string name="TooltipFlagNoBuild">
+ Стройка запрещена
+ </string>
+ <string name="TooltipFlagNoEdit">
+ Стройка в ÑоÑтаве группы
+ </string>
+ <string name="TooltipFlagNotSafe">
+ ÐебезопаÑно
+ </string>
+ <string name="TooltipFlagNoFly">
+ Полеты запрещены
+ </string>
+ <string name="TooltipFlagGroupScripts">
+ Скрипты Ð´Ð»Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ñ‹
+ </string>
+ <string name="TooltipFlagNoScripts">
+ Скрипты запрещены
+ </string>
+ <string name="TooltipLand">
+ ЗемлÑ:
+ </string>
+ <string name="TooltipMustSingleDrop">
+ Сюда можно перетащить только одну вещь
+ </string>
+ <string name="TooltipPrice" value="L$[AMOUNT]:"/>
+ <string name="TooltipOutboxNoTransfer">
+ ЧаÑть Ñтих объектов Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€Ð¾Ð´Ð°Ñ‚ÑŒ, или они переданы другому пользователю.
+ </string>
+ <string name="TooltipOutboxWorn">
+ ЧаÑть Ñтих объектов на ваÑ. Снимите их Ñо Ñвоего аватара и попробуйте перемеÑтить их еще раз.
+ </string>
+ <string name="TooltipOutboxFolderLevels">
+ Ð’ Ñтой папке Ñлишком много уровней вложенных папок. Измените Ñтруктуру вложенных папок, ограничив ее глубину 4 уровнÑми (ÐºÐ¾Ñ€Ð½ÐµÐ²Ð°Ñ Ð¿Ð°Ð¿ÐºÐ°, вложенные папки ÑƒÑ€Ð¾Ð²Ð½Ñ Ð, вложенные в них папки ÑƒÑ€Ð¾Ð²Ð½Ñ Ð‘, вложенные в них папки ÑƒÑ€Ð¾Ð²Ð½Ñ Ð’).
+ </string>
+ <string name="TooltipOutboxTooManyObjects">
+ Эта папка Ñодержит более 200 объектов. Сложите некоторые вещи в коробки, чтобы уменьшить чиÑло объектов.
+ </string>
+ <string name="TooltipHttpUrl">
+ Щелкните, чтобы проÑмотреть Ñту веб-Ñтраницу
+ </string>
+ <string name="TooltipSLURL">
+ Щелкните, чтобы проÑмотреть информацию об Ñтом меÑте
+ </string>
+ <string name="TooltipAgentUrl">
+ Щелкните, чтобы проÑмотреть профиль Ñтого жителÑ
+ </string>
+ <string name="TooltipAgentInspect">
+ Узнать больше об Ñтом жителе
+ </string>
+ <string name="TooltipAgentMute">
+ Щелкните, чтобы не Ñлышать Ñтого жителÑ
+ </string>
+ <string name="TooltipAgentUnmute">
+ Щелкните, чтобы Ñлышать Ñтого жителÑ
+ </string>
+ <string name="TooltipAgentIM">
+ Щелкните, чтобы открыть личный чат Ñ Ñтим жителем
+ </string>
+ <string name="TooltipAgentPay">
+ Щелкните, чтобы заплатить жителю
+ </string>
+ <string name="TooltipAgentOfferTeleport">
+ Щелкните, чтобы предложить Ñтому жителю телепортацию
+ </string>
+ <string name="TooltipAgentRequestFriend">
+ Щелкните, чтобы предложить Ñтому жителю дружбу
+ </string>
+ <string name="TooltipGroupUrl">
+ Щелкните, чтобы проÑмотреть опиÑание группы
+ </string>
+ <string name="TooltipEventUrl">
+ Щелкните, чтобы проÑмотреть опиÑание ÑобытиÑ
+ </string>
+ <string name="TooltipClassifiedUrl">
+ Щелкните, чтобы проÑмотреть Ñту рекламу
+ </string>
+ <string name="TooltipParcelUrl">
+ Щелкните, чтобы поÑмотреть опиÑание учаÑтка
+ </string>
+ <string name="TooltipTeleportUrl">
+ Щелкните, чтобы телепортироватьÑÑ Ð² Ñто меÑто
+ </string>
+ <string name="TooltipObjectIMUrl">
+ Щелкните, открыть опиÑание Ñтого объекта
+ </string>
+ <string name="TooltipMapUrl">
+ Щелкните, чтобы поÑмотреть Ñто меÑто на карте
+ </string>
+ <string name="TooltipSLAPP">
+ Щелкните, чтобы выполнить команду secondlife://
+ </string>
+ <string name="CurrentURL" value="Текущий URL-адреÑ: [CurrentURL]"/>
+ <string name="SLurlLabelTeleport">
+ ТелепортироватьÑÑ Ð²
+ </string>
+ <string name="SLurlLabelShowOnMap">
+ Показать карту длÑ
+ </string>
+ <string name="SLappAgentMute">
+ Откл. звук
+ </string>
+ <string name="SLappAgentUnmute">
+ Вкл. звук
+ </string>
+ <string name="SLappAgentIM">
+ IM
+ </string>
+ <string name="SLappAgentPay">
+ Заплатить
+ </string>
+ <string name="SLappAgentOfferTeleport">
+ Предложить телепортацию в
+ </string>
+ <string name="SLappAgentRequestFriend">
+ Предложить дружбу
+ </string>
+ <string name="BUTTON_CLOSE_DARWIN">
+ Закрыть (⌘W)
+ </string>
+ <string name="BUTTON_CLOSE_WIN">
+ Закрыть (Ctrl+W)
+ </string>
+ <string name="BUTTON_CLOSE_CHROME">
+ Закрыть
+ </string>
+ <string name="BUTTON_RESTORE">
+ Развернуть
+ </string>
+ <string name="BUTTON_MINIMIZE">
+ Свернуть
+ </string>
+ <string name="BUTTON_TEAR_OFF">
+ Отделить
+ </string>
+ <string name="BUTTON_DOCK">
+ ПриÑоединить
+ </string>
+ <string name="BUTTON_HELP">
+ Показать Ñправку
+ </string>
+ <string name="Searching">
+ ПоиÑк...
+ </string>
+ <string name="NoneFound">
+ Ðичего не найдено.
+ </string>
+ <string name="RetrievingData">
+ Получение...
+ </string>
+ <string name="ReleaseNotes">
+ Заметки о выпуÑке
+ </string>
+ <string name="LoadingData">
+ Загрузка...
+ </string>
+ <string name="AvatarNameNobody">
+ (без имени)
+ </string>
+ <string name="AvatarNameWaiting">
+ (ожидание)
+ </string>
+ <string name="AvatarNameMultiple">
+ (неÑколько)
+ </string>
+ <string name="GroupNameNone">
+ (нет)
+ </string>
+ <string name="AvalineCaller">
+ [ORDER] абонента Avaline
+ </string>
+ <string name="AssetErrorNone">
+ Ошибок нет
+ </string>
+ <string name="AssetErrorRequestFailed">
+ Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð°ÐºÑ‚Ð¸Ð²Ð°: Ñбой
+ </string>
+ <string name="AssetErrorNonexistentFile">
+ Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð°ÐºÑ‚Ð¸Ð²Ð°: файл не ÑущеÑтвует
+ </string>
+ <string name="AssetErrorNotInDatabase">
+ Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð°ÐºÑ‚Ð¸Ð²Ð°: актив не найден в базе данных
+ </string>
+ <string name="AssetErrorEOF">
+ Конец файла
+ </string>
+ <string name="AssetErrorCannotOpenFile">
+ Ðе удаетÑÑ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚ÑŒ файл
+ </string>
+ <string name="AssetErrorFileNotFound">
+ Файл не найден
+ </string>
+ <string name="AssetErrorTCPTimeout">
+ Вышло Ð²Ñ€ÐµÐ¼Ñ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‡Ð¸ файла
+ </string>
+ <string name="AssetErrorCircuitGone">
+ Обрыв в канале
+ </string>
+ <string name="AssetErrorPriceMismatch">
+ Ðе доÑтигнута договоренноÑть по цене между клиентом и Ñервером
+ </string>
+ <string name="AssetErrorUnknownStatus">
+ ÐеизвеÑтный ÑтатуÑ
+ </string>
+ <string name="texture">
+ текÑтуру
+ </string>
+ <string name="sound">
+ звук
+ </string>
+ <string name="calling card">
+ визитку
+ </string>
+ <string name="landmark">
+ закладку
+ </string>
+ <string name="legacy script">
+ Ñтарый Ñкрипт
+ </string>
+ <string name="clothing">
+ одежду
+ </string>
+ <string name="object">
+ объект
+ </string>
+ <string name="note card">
+ заметку
+ </string>
+ <string name="folder">
+ папку
+ </string>
+ <string name="root">
+ корневой каталог
+ </string>
+ <string name="lsl2 script">
+ Ñкрипт LSL2
+ </string>
+ <string name="lsl bytecode">
+ байт-код LSL
+ </string>
+ <string name="tga texture">
+ текÑтуру TGA
+ </string>
+ <string name="body part">
+ чаÑть тела
+ </string>
+ <string name="snapshot">
+ Ñнимок
+ </string>
+ <string name="lost and found">
+ найденные вещи
+ </string>
+ <string name="targa image">
+ изображение TGA
+ </string>
+ <string name="trash">
+ Ñодержимое корзины
+ </string>
+ <string name="jpeg image">
+ изображение JPEG
+ </string>
+ <string name="animation">
+ анимацию
+ </string>
+ <string name="gesture">
+ жеÑÑ‚
+ </string>
+ <string name="simstate">
+ ÑоÑтоÑние ÑимулÑции
+ </string>
+ <string name="favorite">
+ избранное
+ </string>
+ <string name="symbolic link">
+ ÑÑылку
+ </string>
+ <string name="symbolic folder link">
+ ÑÑылку на папку
+ </string>
+ <string name="mesh">
+ Ñетка
+ </string>
+ <string name="AvatarEditingAppearance">
+ (внешний вид редактируетÑÑ)
+ </string>
+ <string name="AvatarAway">
+ Ðет на меÑте
+ </string>
+ <string name="AvatarBusy">
+ Ðе беÑпокоить
+ </string>
+ <string name="AvatarMuted">
+ Ð’ черном ÑпиÑке
+ </string>
+ <string name="anim_express_afraid">
+ Страх
+ </string>
+ <string name="anim_express_anger">
+ Гнев
+ </string>
+ <string name="anim_away">
+ Ðет на меÑте
+ </string>
+ <string name="anim_backflip">
+ Сальто назад
+ </string>
+ <string name="anim_express_laugh">
+ Хохот
+ </string>
+ <string name="anim_express_toothsmile">
+ Ð¨Ð¸Ñ€Ð¾ÐºÐ°Ñ ÑƒÐ»Ñ‹Ð±ÐºÐ°
+ </string>
+ <string name="anim_blowkiss">
+ Воздушный поцелуй
+ </string>
+ <string name="anim_express_bored">
+ Скука
+ </string>
+ <string name="anim_bow">
+ Поклон
+ </string>
+ <string name="anim_clap">
+ Хлопок
+ </string>
+ <string name="anim_courtbow">
+ Учтивый поклон
+ </string>
+ <string name="anim_express_cry">
+ Плач
+ </string>
+ <string name="anim_dance1">
+ Танец 1
+ </string>
+ <string name="anim_dance2">
+ Танец 2
+ </string>
+ <string name="anim_dance3">
+ Танец 3
+ </string>
+ <string name="anim_dance4">
+ Танец 4
+ </string>
+ <string name="anim_dance5">
+ Танец 5
+ </string>
+ <string name="anim_dance6">
+ Танец 6
+ </string>
+ <string name="anim_dance7">
+ Танец 7
+ </string>
+ <string name="anim_dance8">
+ Танец 8
+ </string>
+ <string name="anim_express_disdain">
+ Презрение
+ </string>
+ <string name="anim_drink">
+ Питьё
+ </string>
+ <string name="anim_express_embarrased">
+ Смущение
+ </string>
+ <string name="anim_angry_fingerwag">
+ Погрозить пальцем
+ </string>
+ <string name="anim_fist_pump">
+ Поднимание кулака
+ </string>
+ <string name="anim_yoga_float">
+ ПарÑщий Будда
+ </string>
+ <string name="anim_express_frown">
+ ХмуроÑть
+ </string>
+ <string name="anim_impatient">
+ Ðетерпение
+ </string>
+ <string name="anim_jumpforjoy">
+ Прыжок радоÑти
+ </string>
+ <string name="anim_kissmybutt">
+ Поцелуй в зад
+ </string>
+ <string name="anim_express_kiss">
+ Поцелуй
+ </string>
+ <string name="anim_laugh_short">
+ Смех
+ </string>
+ <string name="anim_musclebeach">
+ ДемонÑÑ‚Ñ€Ð°Ñ†Ð¸Ñ Ð¼ÑƒÑкулов
+ </string>
+ <string name="anim_no_unhappy">
+ ГруÑтный отказ
+ </string>
+ <string name="anim_no_head">
+ Отказ
+ </string>
+ <string name="anim_nyanya">
+ ÐÑ-нÑ-нÑ
+ </string>
+ <string name="anim_punch_onetwo">
+ Двойка руками
+ </string>
+ <string name="anim_express_open_mouth">
+ Открывание рта
+ </string>
+ <string name="anim_peace">
+ Дружелюбие
+ </string>
+ <string name="anim_point_you">
+ Указывание на кого-то
+ </string>
+ <string name="anim_point_me">
+ Указывание на ÑебÑ
+ </string>
+ <string name="anim_punch_l">
+ Удар левой рукой
+ </string>
+ <string name="anim_punch_r">
+ Удар правой рукой
+ </string>
+ <string name="anim_rps_countdown">
+ Счет в КÐБ
+ </string>
+ <string name="anim_rps_paper">
+ КÐБ – бумага
+ </string>
+ <string name="anim_rps_rock">
+ КÐБ – камень
+ </string>
+ <string name="anim_rps_scissors">
+ КÐБ – ножницы
+ </string>
+ <string name="anim_express_repulsed">
+ Отказ
+ </string>
+ <string name="anim_kick_roundhouse_r">
+ «Вертушка»
+ </string>
+ <string name="anim_express_sad">
+ ГруÑть
+ </string>
+ <string name="anim_salute">
+ ПриветÑтвие
+ </string>
+ <string name="anim_shout">
+ Крик
+ </string>
+ <string name="anim_express_shrug">
+ Пожимание плечами
+ </string>
+ <string name="anim_express_smile">
+ Улыбка
+ </string>
+ <string name="anim_smoke_idle">
+ Курение не в затÑжку
+ </string>
+ <string name="anim_smoke_inhale">
+ Курение в затÑжку
+ </string>
+ <string name="anim_smoke_throw_down">
+ БроÑить Ñигарету
+ </string>
+ <string name="anim_express_surprise">
+ Удивление
+ </string>
+ <string name="anim_sword_strike_r">
+ Удар мечом
+ </string>
+ <string name="anim_angry_tantrum">
+ Ð’Ñпышка гнева
+ </string>
+ <string name="anim_express_tongue_out">
+ Показ Ñзыка
+ </string>
+ <string name="anim_hello">
+ ПриветÑтвие рукой
+ </string>
+ <string name="anim_whisper">
+ Шепот
+ </string>
+ <string name="anim_whistle">
+ СвиÑÑ‚
+ </string>
+ <string name="anim_express_wink">
+ Подмигивание
+ </string>
+ <string name="anim_wink_hollywood">
+ Подмигивание по-голливудÑки
+ </string>
+ <string name="anim_express_worry">
+ БеÑпокойÑтво
+ </string>
+ <string name="anim_yes_happy">
+ РадоÑтное ÑоглаÑие
+ </string>
+ <string name="anim_yes_head">
+ СоглаÑие
+ </string>
+ <string name="texture_loading">
+ Загрузка...
+ </string>
+ <string name="worldmap_offline">
+ Ðе в Ñети
+ </string>
+ <string name="worldmap_item_tooltip_format">
+ [AREA] м² L$[PRICE]
+ </string>
+ <string name="worldmap_results_none_found">
+ Ðичего не найдено.
+ </string>
+ <string name="Ok">
+ ОК
+ </string>
+ <string name="Premature end of file">
+ Преждевременный конец файла
+ </string>
+ <string name="ST_NO_JOINT">
+ Ðе удаетÑÑ Ð½Ð°Ð¹Ñ‚Ð¸ объект ROOT или JOINT.
+ </string>
+ <string name="whisper">
+ шепчет:
+ </string>
+ <string name="shout">
+ кричит:
+ </string>
+ <string name="ringing">
+ Подключение к голоÑовому чату...
+ </string>
+ <string name="connected">
+ Подключение уÑтановлено
+ </string>
+ <string name="unavailable">
+ Ð’ Ñтом меÑте голоÑÐ¾Ð²Ð°Ñ ÑвÑзь недоÑтупна
+ </string>
+ <string name="hang_up">
+ Отключение от общего голоÑового чата
+ </string>
+ <string name="reconnect_nearby">
+ Будет уÑтановлено подключение к локальному голоÑовому чату
+ </string>
+ <string name="ScriptQuestionCautionChatGranted">
+ Объекту «[OBJECTNAME]», который принадлежит пользователю «[OWNERNAME]» и находитÑÑ Ð² [REGIONPOS] в регионе «[REGIONNAME]», предоÑтавлено разрешение: [PERMISSIONS].
+ </string>
+ <string name="ScriptQuestionCautionChatDenied">
+ Объекту «[OBJECTNAME]», который принадлежит пользователю «[OWNERNAME]» и находитÑÑ Ð² [REGIONPOS] в регионе «[REGIONNAME]», отказано в разрешении: [PERMISSIONS].
+ </string>
+ <string name="ScriptTakeMoney">
+ У Ð²Ð°Ñ Ð±ÐµÑ€ÑƒÑ‚ Linden-деньги
+ </string>
+ <string name="ActOnControlInputs">
+ ДейÑÑ‚Ð²Ð¸Ñ Ð¿Ñ€Ð¸ активации Ñлементов управлениÑ
+ </string>
+ <string name="RemapControlInputs">
+ Ðовое ÑопоÑтавление Ñлементов управлениÑ
+ </string>
+ <string name="AnimateYourAvatar">
+ Ðнимировать ваш аватар
+ </string>
+ <string name="AttachToYourAvatar">
+ Прикрепить к аватару
+ </string>
+ <string name="ReleaseOwnership">
+ ОтказатьÑÑ Ð¾Ñ‚ владениÑ, Ñделать вÑеобщим
+ </string>
+ <string name="LinkAndDelink">
+ СвÑзать или отменить ÑвÑзь Ñ Ð´Ñ€ÑƒÐ³Ð¸Ð¼Ð¸ объектами
+ </string>
+ <string name="AddAndRemoveJoints">
+ Добавление и удаление ÑвÑзей Ñ Ð´Ñ€ÑƒÐ³Ð¸Ð¼Ð¸ объектами
+ </string>
+ <string name="ChangePermissions">
+ Изменить разрешениÑ
+ </string>
+ <string name="TrackYourCamera">
+ Следить за камерой
+ </string>
+ <string name="ControlYourCamera">
+ УправлÑть камерой
+ </string>
+ <string name="NotConnected">
+ Ðет подключениÑ
+ </string>
+ <string name="SIM_ACCESS_PG">
+ Общий
+ </string>
+ <string name="SIM_ACCESS_MATURE">
+ Умеренный
+ </string>
+ <string name="SIM_ACCESS_ADULT">
+ Ð”Ð»Ñ Ð²Ð·Ñ€Ð¾Ñлых
+ </string>
+ <string name="SIM_ACCESS_DOWN">
+ Ðе в Ñети
+ </string>
+ <string name="SIM_ACCESS_MIN">
+ ÐеизвеÑтно
+ </string>
+ <string name="land_type_unknown">
+ (неизвеÑтно)
+ </string>
+ <string name="Estate / Full Region">
+ Землевладение/веÑÑŒ регион
+ </string>
+ <string name="Estate / Homestead">
+ Землевладение/помеÑтье
+ </string>
+ <string name="Mainland / Homestead">
+ Материк/помеÑтье
+ </string>
+ <string name="Mainland / Full Region">
+ Материк/веÑÑŒ регион
+ </string>
+ <string name="all_files">
+ Ð’Ñе файлы
+ </string>
+ <string name="sound_files">
+ Звуки
+ </string>
+ <string name="animation_files">
+ ÐнимациÑ
+ </string>
+ <string name="image_files">
+ ИзображениÑ
+ </string>
+ <string name="save_file_verb">
+ Сохранить
+ </string>
+ <string name="load_file_verb">
+ Загрузить
+ </string>
+ <string name="targa_image_files">
+ Ð˜Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ TGA
+ </string>
+ <string name="bitmap_image_files">
+ Ð˜Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ BMP
+ </string>
+ <string name="avi_movie_file">
+ Видео AVI
+ </string>
+ <string name="xaf_animation_file">
+ ÐÐ½Ð¸Ð¼Ð°Ñ†Ð¸Ñ XAF
+ </string>
+ <string name="xml_file">
+ XML-файл
+ </string>
+ <string name="raw_file">
+ RAW-файл
+ </string>
+ <string name="compressed_image_files">
+ ÐеÑжатые изображениÑ
+ </string>
+ <string name="load_files">
+ Загрузить файлы
+ </string>
+ <string name="choose_the_directory">
+ Выбрать каталог
+ </string>
+ <string name="AvatarSetNotAway">
+ Ðа меÑте
+ </string>
+ <string name="AvatarSetAway">
+ Ðет на меÑте
+ </string>
+ <string name="AvatarSetNotBusy">
+ Ðе занÑÑ‚(а)
+ </string>
+ <string name="AvatarSetBusy">
+ Ðе беÑпокоить
+ </string>
+ <string name="shape">
+ Фигура
+ </string>
+ <string name="skin">
+ Кожа
+ </string>
+ <string name="hair">
+ ВолоÑÑ‹
+ </string>
+ <string name="eyes">
+ Глаза
+ </string>
+ <string name="shirt">
+ Рубашка
+ </string>
+ <string name="pants">
+ Брюки
+ </string>
+ <string name="shoes">
+ Обувь
+ </string>
+ <string name="socks">
+ ÐоÑки
+ </string>
+ <string name="jacket">
+ Пиджак
+ </string>
+ <string name="gloves">
+ Перчатки
+ </string>
+ <string name="undershirt">
+ Майка
+ </string>
+ <string name="underpants">
+ ТруÑÑ‹
+ </string>
+ <string name="skirt">
+ Юбка
+ </string>
+ <string name="alpha">
+ Ðльфа-маÑка
+ </string>
+ <string name="tattoo">
+ Тату
+ </string>
+ <string name="physics">
+ ФизичеÑкие данные
+ </string>
+ <string name="invalid">
+ ошибка
+ </string>
+ <string name="none">
+ нет
+ </string>
+ <string name="shirt_not_worn">
+ Рубашка не надета
+ </string>
+ <string name="pants_not_worn">
+ Брюки не надеты
+ </string>
+ <string name="shoes_not_worn">
+ Обувь не надета
+ </string>
+ <string name="socks_not_worn">
+ ÐоÑки не надеты
+ </string>
+ <string name="jacket_not_worn">
+ Пиджак не надет
+ </string>
+ <string name="gloves_not_worn">
+ Перчатки не надеты
+ </string>
+ <string name="undershirt_not_worn">
+ Майка не надета
+ </string>
+ <string name="underpants_not_worn">
+ ТруÑÑ‹ не надеты
+ </string>
+ <string name="skirt_not_worn">
+ Юбка не надета
+ </string>
+ <string name="alpha_not_worn">
+ Ðльфа-маÑка не надета
+ </string>
+ <string name="tattoo_not_worn">
+ Тату не надето
+ </string>
+ <string name="physics_not_worn">
+ Физика не учитываетÑÑ
+ </string>
+ <string name="invalid_not_worn">
+ ошибка
+ </string>
+ <string name="create_new_shape">
+ Создать фигуру
+ </string>
+ <string name="create_new_skin">
+ Создать кожу
+ </string>
+ <string name="create_new_hair">
+ Создать волоÑÑ‹
+ </string>
+ <string name="create_new_eyes">
+ Создать глаза
+ </string>
+ <string name="create_new_shirt">
+ Создать рубашку
+ </string>
+ <string name="create_new_pants">
+ Создать брюки
+ </string>
+ <string name="create_new_shoes">
+ Создать обувь
+ </string>
+ <string name="create_new_socks">
+ Создать ноÑки
+ </string>
+ <string name="create_new_jacket">
+ Создать пиджак
+ </string>
+ <string name="create_new_gloves">
+ Создать перчатки
+ </string>
+ <string name="create_new_undershirt">
+ Создать майку
+ </string>
+ <string name="create_new_underpants">
+ Создать труÑÑ‹
+ </string>
+ <string name="create_new_skirt">
+ Создать юбку
+ </string>
+ <string name="create_new_alpha">
+ Создать альфа-маÑку
+ </string>
+ <string name="create_new_tattoo">
+ Создать тату
+ </string>
+ <string name="create_new_physics">
+ Создать физику
+ </string>
+ <string name="create_new_invalid">
+ ошибка
+ </string>
+ <string name="NewWearable">
+ Создать [WEARABLE_ITEM]
+ </string>
+ <string name="next">
+ Далее
+ </string>
+ <string name="ok">
+ ОК
+ </string>
+ <string name="GroupNotifyGroupNotice">
+ Групповое уведомление
+ </string>
+ <string name="GroupNotifyGroupNotices">
+ Групповые уведомлениÑ
+ </string>
+ <string name="GroupNotifySentBy">
+ Отправитель
+ </string>
+ <string name="GroupNotifyAttached">
+ Вложение:
+ </string>
+ <string name="GroupNotifyViewPastNotices">
+ ЗдеÑÑŒ можно проÑмотреть поÑледние ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ отказатьÑÑ Ð¾Ñ‚ их получениÑ.
+ </string>
+ <string name="GroupNotifyOpenAttachment">
+ Открыть вложение
+ </string>
+ <string name="GroupNotifySaveAttachment">
+ Сохранить вложение
+ </string>
+ <string name="TeleportOffer">
+ Предложена телепортациÑ
+ </string>
+ <string name="StartUpNotifications">
+ Пока вы отÑутÑтвовали, пришли новые уведомлениÑ.
+ </string>
+ <string name="OverflowInfoChannelString">
+ Других уведомлений: %d
+ </string>
+ <string name="BodyPartsRightArm">
+ ÐŸÑ€Ð°Ð²Ð°Ñ Ñ€ÑƒÐºÐ°
+ </string>
+ <string name="BodyPartsHead">
+ Голова
+ </string>
+ <string name="BodyPartsLeftArm">
+ Ð›ÐµÐ²Ð°Ñ Ñ€ÑƒÐºÐ°
+ </string>
+ <string name="BodyPartsLeftLeg">
+ Ð›ÐµÐ²Ð°Ñ Ð½Ð¾Ð³Ð°
+ </string>
+ <string name="BodyPartsTorso">
+ ТорÑ
+ </string>
+ <string name="BodyPartsRightLeg">
+ ÐŸÑ€Ð°Ð²Ð°Ñ Ð½Ð¾Ð³Ð°
+ </string>
+ <string name="GraphicsQualityLow">
+ низкаÑ
+ </string>
+ <string name="GraphicsQualityMid">
+ ÑреднÑÑ
+ </string>
+ <string name="GraphicsQualityHigh">
+ выÑокаÑ
+ </string>
+ <string name="LeaveMouselook">
+ Ðажмите ESC, чтобы вернутьÑÑ Ðº обычному обзору
+ </string>
+ <string name="InventoryNoMatchingItems">
+ Ðе нашли того, что вам нужно? ВоÑпользуйтеÑÑŒ [secondlife:///app/search/all/[SEARCH_TERM] поиÑком].
+ </string>
+ <string name="PlacesNoMatchingItems">
+ Ðе нашли того, что вам нужно? ВоÑпользуйтеÑÑŒ [secondlife:///app/search/places/[SEARCH_TERM] поиÑком].
+ </string>
+ <string name="FavoritesNoMatchingItems">
+ Перетащите Ñюда закладку, чтобы добавить ее в ÑпиÑок избранного.
+ </string>
+ <string name="InventoryNoTexture">
+ Ð’ вашем инвентаре нет копии Ñтой текÑтуры
+ </string>
+ <string name="InventoryInboxNoItems">
+ ЕÑли вы купите или как-то иначе получите предмет, он поÑвитÑÑ Ð·Ð´ÐµÑÑŒ. Его можно будет перетащить в папку вашего Ð¸Ð½Ð²ÐµÐ½Ñ‚Ð°Ñ€Ñ Ð¸Ð»Ð¸ удалить, еÑли он больше не нужен.
+ </string>
+ <string name="MarketplaceURL">
+ http://marketplace.[DOMAIN_NAME]
+ </string>
+ <string name="MarketplaceURL_CreateStore">
+ http://marketplace.[DOMAIN_NAME]/create_store
+ </string>
+ <string name="MarketplaceURL_LearnMore">
+ http://marketplace.[DOMAIN_NAME]/learn_more
+ </string>
+ <string name="InventoryOutboxCreationErrorTitle">
+ Папка «Торговые иÑходÑщие» наÑтроена неправильно
+ </string>
+ <string name="InventoryOutboxCreationErrorTooltip">
+ Ошибка конфигурации папки «Торговые иÑходÑщие»
+ </string>
+ <string name="InventoryOutboxCreationError">
+ Чтобы иÑправить Ñту проблему, обратитеÑÑŒ в Ñлужбу поддержки.
+ </string>
+ <string name="InventoryOutboxNotMerchantTitle">
+ Продавать вещи в торговом центре может кто угодно
+ </string>
+ <string name="InventoryOutboxNotMerchantTooltip">
+ Станьте торговцем!
+ </string>
+ <string name="InventoryOutboxNotMerchant">
+ [[MARKETPLACE_URL] Торговый центр Second Life] предлагает на продажу более миллиона виртуальных продуктов, и вÑе они Ñозданы жителÑми Second Life. Ð’Ñ‹ тоже можете продавать Ñозданные вами вещи, а также некоторые из вещей, купленных вами. Это ÑовÑем неÑложно. ÐаÑтройка выполнÑетÑÑ Ð±ÐµÑплатно. [[LEARN_MORE_URL] Узнайте подробноÑти] или [[CREATE_STORE_URL] Ñоздайте магазин] в торговом центре, чтобы начать торговлю.
+ </string>
+ <string name="InventoryOutboxNoItemsTitle">
+ Ðовый ÑпоÑоб отправки вещей в торговый центр
+ </string>
+ <string name="InventoryOutboxNoItemsTooltip">
+ Перетащите вещи Ñюда, чтобы подготовить их Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð´Ð°Ð¶Ð¸ в торговом центре
+ </string>
+ <string name="InventoryOutboxNoItems">
+ ПеретаÑкивайте в Ñту облаÑть вещи и папки, которые хотите продать. При перетаÑкивании ÑоздаетÑÑ ÐºÐ¾Ð¿Ð¸Ñ Ð²ÐµÑ‰Ð¸ (за иÑключением вещей, недоÑтупных Ð´Ð»Ñ ÐºÐ¾Ð¿Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ), поÑтому инвентарь не изменÑетÑÑ. Когда вÑе готово Ð´Ð»Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²ÐºÐ¸ вещей в торговый центр, нажмите кнопку «Передать». Вещи, перемещенные в инвентарь магазина, иÑчезают из Ñтой папки.
+ </string>
+ <string name="Marketplace Error None">
+ Ошибок нет
+ </string>
+ <string name="Marketplace Error Not Merchant">
+ Ошибка. Прежде чем отправлÑть вещи в магазин, необходимо зарегиÑтрироватьÑÑ ÐºÐ°Ðº торговец (беÑплатно).
+ </string>
+ <string name="Marketplace Error Empty Folder">
+ Ошибка. Ð’ Ñтой папке нет контента.
+ </string>
+ <string name="Marketplace Error Unassociated Products">
+ Ошибка. Ðе удаетÑÑ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‚ÑŒ Ñту вещь, поÑкольку в вашем торговом аккаунте Ñлишком много вещей, не ÑвÑзанных Ñ Ð¿Ñ€Ð¾Ð´ÑƒÐºÑ‚Ð°Ð¼Ð¸. Чтобы иÑправить Ñту ошибку, войдите на веб-Ñайт торгового центра и уменьшите чиÑло Ñвоих вещей, которые ни Ñ Ñ‡ÐµÐ¼ не ÑвÑзаны.
+ </string>
+ <string name="Marketplace Error Object Limit">
+ Ошибка. Эта вещь Ñодержит Ñлишком много объектов. ИÑправьте Ñту ошибку, Ñложив объекты в коробки и уменьшив их общее чиÑло (должно быть меньше 200).
+ </string>
+ <string name="Marketplace Error Folder Depth">
+ Ошибка. Эта вещь Ñодержит Ñлишком много уровней вложенных папок. Измените Ñтруктуру так, чтобы уровней вложенных папок было не более 3.
+ </string>
+ <string name="Marketplace Error Unsellable Item">
+ Ошибка. Эту вещь Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€Ð¾Ð´Ð°Ñ‚ÑŒ в магазине.
+ </string>
+ <string name="Marketplace Error Internal Import">
+ Ошибка. Эта вещь Ñоздает проблему. Повторите попытку позже.
+ </string>
+ <string name="Open landmarks">
+ Открыть закладки
+ </string>
+ <string name="no_transfer" value="(не передаетÑÑ)"/>
+ <string name="no_modify" value="(не изменÑетÑÑ)"/>
+ <string name="no_copy" value="(не копируетÑÑ)"/>
+ <string name="worn" value="(ноÑитÑÑ)"/>
+ <string name="link" value="(ÑÑылка)"/>
+ <string name="broken_link" value="(broken_link)"/>
+ <string name="LoadingContents">
+ Загрузка Ñодержимого...
+ </string>
+ <string name="NoContents">
+ Ðет контента
+ </string>
+ <string name="WornOnAttachmentPoint" value="(где ноÑитÑÑ: [ATTACHMENT_POINT])"/>
+ <string name="ActiveGesture" value="[GESLABEL] (активно)"/>
+ <string name="PermYes">
+ Да
+ </string>
+ <string name="PermNo">
+ Ðет
+ </string>
+ <string name="Chat Message" value="Чат:"/>
+ <string name="Sound" value="Звук:"/>
+ <string name="Wait" value="--- Ждите:"/>
+ <string name="AnimFlagStop" value="ОÑтановить анимацию:"/>
+ <string name="AnimFlagStart" value="Ðачать анимацию:"/>
+ <string name="Wave" value="ПриветÑтвие рукой"/>
+ <string name="GestureActionNone" value="Ðет"/>
+ <string name="HelloAvatar" value="Привет, аватар!"/>
+ <string name="ViewAllGestures" value="ПроÑмотреть вÑе &gt;&gt;"/>
+ <string name="GetMoreGestures" value="Дополнительно &gt;&gt;"/>
+ <string name="Animations" value="ÐнимациÑ,"/>
+ <string name="Calling Cards" value="Визитки,"/>
+ <string name="Clothing" value="Одежда,"/>
+ <string name="Gestures" value="ЖеÑты,"/>
+ <string name="Landmarks" value="Закладки,"/>
+ <string name="Notecards" value="Заметки,"/>
+ <string name="Objects" value="Объекты,"/>
+ <string name="Scripts" value="Скрипты,"/>
+ <string name="Sounds" value="Звуки,"/>
+ <string name="Textures" value="ТекÑтуры,"/>
+ <string name="Snapshots" value="Снимки,"/>
+ <string name="No Filters" value="Ðет"/>
+ <string name="Since Logoff" value="- С момента выхода"/>
+ <string name="InvFolder My Inventory">
+ Мой инвентарь
+ </string>
+ <string name="InvFolder Library">
+ Библиотека
+ </string>
+ <string name="InvFolder Textures">
+ ТекÑтуры
+ </string>
+ <string name="InvFolder Sounds">
+ Звуки
+ </string>
+ <string name="InvFolder Calling Cards">
+ Визитки
+ </string>
+ <string name="InvFolder Landmarks">
+ Закладки
+ </string>
+ <string name="InvFolder Scripts">
+ Скрипты
+ </string>
+ <string name="InvFolder Clothing">
+ Одежда
+ </string>
+ <string name="InvFolder Objects">
+ Объекты
+ </string>
+ <string name="InvFolder Notecards">
+ Заметки
+ </string>
+ <string name="InvFolder New Folder">
+ ÐÐ¾Ð²Ð°Ñ Ð¿Ð°Ð¿ÐºÐ°
+ </string>
+ <string name="InvFolder Inventory">
+ Инвентарь
+ </string>
+ <string name="InvFolder Uncompressed Images">
+ ÐеÑжатые изображениÑ
+ </string>
+ <string name="InvFolder Body Parts">
+ ЧаÑти тела
+ </string>
+ <string name="InvFolder Trash">
+ Корзина
+ </string>
+ <string name="InvFolder Photo Album">
+ Фотоальбом
+ </string>
+ <string name="InvFolder Lost And Found">
+ Бюро находок
+ </string>
+ <string name="InvFolder Uncompressed Sounds">
+ ÐеÑжатые звуки
+ </string>
+ <string name="InvFolder Animations">
+ ÐнимациÑ
+ </string>
+ <string name="InvFolder Gestures">
+ ЖеÑты
+ </string>
+ <string name="InvFolder Favorite">
+ Мое избранное
+ </string>
+ <string name="InvFolder favorite">
+ Мое избранное
+ </string>
+ <string name="InvFolder Current Outfit">
+ Текущий коÑтюм
+ </string>
+ <string name="InvFolder Initial Outfits">
+ Ðачальные коÑтюмы
+ </string>
+ <string name="InvFolder My Outfits">
+ Мои коÑтюмы
+ </string>
+ <string name="InvFolder Accessories">
+ ÐкÑеÑÑуары
+ </string>
+ <string name="InvFolder Meshes">
+ Меши
+ </string>
+ <string name="InvFolder Friends">
+ ДрузьÑ
+ </string>
+ <string name="InvFolder All">
+ Ð’Ñе
+ </string>
+ <string name="no_attachments">
+ Ðет прикрепленных объектов
+ </string>
+ <string name="Attachments remain">
+ ПриÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ (оÑталоÑÑŒ гнезд: [COUNT])
+ </string>
+ <string name="Buy">
+ Купить
+ </string>
+ <string name="BuyforL$">
+ Купить за L$
+ </string>
+ <string name="Stone">
+ Камень
+ </string>
+ <string name="Metal">
+ Металл
+ </string>
+ <string name="Glass">
+ Стекло
+ </string>
+ <string name="Wood">
+ Дерево
+ </string>
+ <string name="Flesh">
+ Плоть
+ </string>
+ <string name="Plastic">
+ ПлаÑтик
+ </string>
+ <string name="Rubber">
+ Резина
+ </string>
+ <string name="Light">
+ Светлый
+ </string>
+ <string name="KBShift">
+ SHIFT
+ </string>
+ <string name="KBCtrl">
+ CTRL
+ </string>
+ <string name="Chest">
+ Грудь
+ </string>
+ <string name="Skull">
+ Череп
+ </string>
+ <string name="Left Shoulder">
+ Левое плечо
+ </string>
+ <string name="Right Shoulder">
+ Правое плечо
+ </string>
+ <string name="Left Hand">
+ Ð›ÐµÐ²Ð°Ñ ÐºÐ¸Ñть
+ </string>
+ <string name="Right Hand">
+ ÐŸÑ€Ð°Ð²Ð°Ñ ÐºÐ¸Ñть
+ </string>
+ <string name="Left Foot">
+ Ð›ÐµÐ²Ð°Ñ ÑтупнÑ
+ </string>
+ <string name="Right Foot">
+ ÐŸÑ€Ð°Ð²Ð°Ñ ÑтупнÑ
+ </string>
+ <string name="Spine">
+ Позвоночник
+ </string>
+ <string name="Pelvis">
+ Таз
+ </string>
+ <string name="Mouth">
+ Рот
+ </string>
+ <string name="Chin">
+ Подбородок
+ </string>
+ <string name="Left Ear">
+ Левое ухо
+ </string>
+ <string name="Right Ear">
+ Правое ухо
+ </string>
+ <string name="Left Eyeball">
+ Левый глаз
+ </string>
+ <string name="Right Eyeball">
+ Правый глаз
+ </string>
+ <string name="Nose">
+ ÐоÑ
+ </string>
+ <string name="R Upper Arm">
+ Правое плечо
+ </string>
+ <string name="R Forearm">
+ Правое предплечье
+ </string>
+ <string name="L Upper Arm">
+ Левое плечо
+ </string>
+ <string name="L Forearm">
+ Левое предплечье
+ </string>
+ <string name="Right Hip">
+ Правое бедро
+ </string>
+ <string name="R Upper Leg">
+ Правое колено
+ </string>
+ <string name="R Lower Leg">
+ ÐŸÑ€Ð°Ð²Ð°Ñ Ð³Ð¾Ð»ÐµÐ½ÑŒ
+ </string>
+ <string name="Left Hip">
+ Левое бедро
+ </string>
+ <string name="L Upper Leg">
+ Левое колено
+ </string>
+ <string name="L Lower Leg">
+ Ð›ÐµÐ²Ð°Ñ Ð³Ð¾Ð»ÐµÐ½ÑŒ
+ </string>
+ <string name="Stomach">
+ Живот
+ </string>
+ <string name="Left Pec">
+ Ð›ÐµÐ²Ð°Ñ Ð³Ñ€ÑƒÐ´ÑŒ
+ </string>
+ <string name="Right Pec">
+ ÐŸÑ€Ð°Ð²Ð°Ñ Ð³Ñ€ÑƒÐ´ÑŒ
+ </string>
+ <string name="Neck">
+ ШеÑ
+ </string>
+ <string name="Avatar Center">
+ Центр аватара
+ </string>
+ <string name="Invalid Attachment">
+ ÐÐµÐ²ÐµÑ€Ð½Ð°Ñ Ñ‚Ð¾Ñ‡ÐºÐ° приÑоединениÑ
+ </string>
+ <string name="YearsMonthsOld">
+ [AGEYEARS] [AGEMONTHS]
+ </string>
+ <string name="YearsOld">
+ [AGEYEARS]
+ </string>
+ <string name="MonthsOld">
+ [AGEMONTHS]
+ </string>
+ <string name="WeeksOld">
+ [AGEWEEKS]
+ </string>
+ <string name="DaysOld">
+ [AGEDAYS]
+ </string>
+ <string name="TodayOld">
+ СегоднÑ
+ </string>
+ <string name="AgeYearsA">
+ [COUNT] год
+ </string>
+ <string name="AgeYearsB">
+ [COUNT] года
+ </string>
+ <string name="AgeYearsC">
+ [COUNT] лет
+ </string>
+ <string name="AgeMonthsA">
+ [COUNT] меÑÑц
+ </string>
+ <string name="AgeMonthsB">
+ [COUNT] меÑÑца
+ </string>
+ <string name="AgeMonthsC">
+ [COUNT] меÑÑцев
+ </string>
+ <string name="AgeWeeksA">
+ [COUNT] неделÑ
+ </string>
+ <string name="AgeWeeksB">
+ [COUNT] недели
+ </string>
+ <string name="AgeWeeksC">
+ [COUNT] недель
+ </string>
+ <string name="AgeDaysA">
+ [COUNT] день
+ </string>
+ <string name="AgeDaysB">
+ [COUNT] днÑ
+ </string>
+ <string name="AgeDaysC">
+ [COUNT] дней
+ </string>
+ <string name="GroupMembersA">
+ [COUNT] учаÑтник
+ </string>
+ <string name="GroupMembersB">
+ [COUNT] учаÑтника
+ </string>
+ <string name="GroupMembersC">
+ [COUNT] учаÑтников
+ </string>
+ <string name="AcctTypeResident">
+ Житель
+ </string>
+ <string name="AcctTypeTrial">
+ ГоÑть
+ </string>
+ <string name="AcctTypeCharterMember">
+ Учредитель
+ </string>
+ <string name="AcctTypeEmployee">
+ Сотрудник Linden Lab
+ </string>
+ <string name="PaymentInfoUsed">
+ ЕÑть Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ платежах
+ </string>
+ <string name="PaymentInfoOnFile">
+ ЕÑть зарегиÑтрир. Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ платежах
+ </string>
+ <string name="NoPaymentInfoOnFile">
+ Ðет информации о платежах
+ </string>
+ <string name="AgeVerified">
+ ВозраÑÑ‚ проверен
+ </string>
+ <string name="NotAgeVerified">
+ ВозраÑÑ‚ не проверен
+ </string>
+ <string name="Center 2">
+ В центре 2
+ </string>
+ <string name="Top Right">
+ Вверху Ñправа
+ </string>
+ <string name="Top">
+ Вверху
+ </string>
+ <string name="Top Left">
+ Вверху Ñлева
+ </string>
+ <string name="Center">
+ В центре
+ </string>
+ <string name="Bottom Left">
+ Внизу Ñлева
+ </string>
+ <string name="Bottom">
+ Внизу
+ </string>
+ <string name="Bottom Right">
+ Внизу Ñправа
+ </string>
+ <string name="CompileQueueDownloadedCompiling">
+ Загружено, компилируетÑÑ
+ </string>
+ <string name="CompileQueueScriptNotFound">
+ Скрипт не найден на Ñервере.
+ </string>
+ <string name="CompileQueueProblemDownloading">
+ Проблема при загрузке
+ </string>
+ <string name="CompileQueueInsufficientPermDownload">
+ ÐедоÑтаточно разрешений Ð´Ð»Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÐ¸ Ñкрипта.
+ </string>
+ <string name="CompileQueueInsufficientPermFor">
+ ÐедоÑтаточно разрешений длÑ
+ </string>
+ <string name="CompileQueueUnknownFailure">
+ ÐеизвеÑтный Ñбой загрузки
+ </string>
+ <string name="CompileQueueTitle">
+ Ход повторной компилÑции
+ </string>
+ <string name="CompileQueueStart">
+ Ñкомпилировать повторно
+ </string>
+ <string name="ResetQueueTitle">
+ Ход ÑброÑа
+ </string>
+ <string name="ResetQueueStart">
+ ÑброÑ
+ </string>
+ <string name="RunQueueTitle">
+ Ход запуÑка
+ </string>
+ <string name="RunQueueStart">
+ запуÑтить
+ </string>
+ <string name="NotRunQueueTitle">
+ Ход оÑтановки выполнениÑ
+ </string>
+ <string name="NotRunQueueStart">
+ прекратить выполнение
+ </string>
+ <string name="CompileSuccessful">
+ КомпилÑÑ†Ð¸Ñ ÑƒÑпешно выполнена!
+ </string>
+ <string name="CompileSuccessfulSaving">
+ КомпилÑÑ†Ð¸Ñ ÑƒÑпешно выполнена, ÑохранÑетÑÑ...
+ </string>
+ <string name="SaveComplete">
+ Сохранение завершено.
+ </string>
+ <string name="ObjectOutOfRange">
+ Скрипт (объект вне облаÑти)
+ </string>
+ <string name="GodToolsObjectOwnedBy">
+ Объект [OBJECT] Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ [OWNER]
+ </string>
+ <string name="GroupsNone">
+ нет
+ </string>
+ <string name="Group" value="(группа)"/>
+ <string name="Unknown">
+ (ÐеизвеÑтно)
+ </string>
+ <string name="SummaryForTheWeek" value="Сводка за неделю, Ð½Ð°Ñ‡Ð¸Ð½Ð°Ñ Ñ"/>
+ <string name="NextStipendDay" value="Дата очередного жалованиÑ:"/>
+ <string name="GroupPlanningDate">
+ [day,datetime,utc].[mthnum,datetime,utc].[year,datetime,utc]
+ </string>
+ <string name="GroupIndividualShare" value="Ð”Ð»Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ñ‹ ПерÑонально СовмеÑтно"/>
+ <string name="GroupColumn" value="Группа"/>
+ <string name="Balance">
+ БаланÑ
+ </string>
+ <string name="Credits">
+ РаÑход
+ </string>
+ <string name="Debits">
+ Приход
+ </string>
+ <string name="Total">
+ Итого
+ </string>
+ <string name="NoGroupDataFound">
+ Ðе найдены данные Ð´Ð»Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ñ‹
+ </string>
+ <string name="IMParentEstate">
+ родовое землевладение
+ </string>
+ <string name="IMMainland">
+ материк
+ </string>
+ <string name="IMTeen">
+ подроÑтковый
+ </string>
+ <string name="Anyone">
+ вÑе
+ </string>
+ <string name="RegionInfoError">
+ ошибка
+ </string>
+ <string name="RegionInfoAllEstatesOwnedBy">
+ вÑе Ð·ÐµÐ¼Ð»ÐµÐ²Ð»Ð°Ð´ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ [OWNER]
+ </string>
+ <string name="RegionInfoAllEstatesYouOwn">
+ вÑе ваши землевладениÑ
+ </string>
+ <string name="RegionInfoAllEstatesYouManage">
+ вÑе Ð·ÐµÐ¼Ð»ÐµÐ²Ð»Ð°Ð´ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ [OWNER], которыми вы управлÑете
+ </string>
+ <string name="RegionInfoAllowedResidents">
+ Допущенные жители: ([ALLOWEDAGENTS], не более [MAXACCESS])
+ </string>
+ <string name="RegionInfoAllowedGroups">
+ Допущенные группы: ([ALLOWEDGROUPS], не более [MAXACCESS])
+ </string>
+ <string name="ScriptLimitsParcelScriptMemory">
+ ПамÑть под Ñкрипты на учаÑтке
+ </string>
+ <string name="ScriptLimitsParcelsOwned">
+ УчаÑтков в ÑпиÑке: [PARCELS]
+ </string>
+ <string name="ScriptLimitsMemoryUsed">
+ ИÑпользуетÑÑ Ð¿Ð°Ð¼Ñти: [COUNT] КБ из [MAX] КБ; доÑтупно: [AVAILABLE] КБ
+ </string>
+ <string name="ScriptLimitsMemoryUsedSimple">
+ ИÑпользуетÑÑ Ð¿Ð°Ð¼Ñти: [COUNT] КБ
+ </string>
+ <string name="ScriptLimitsParcelScriptURLs">
+ URL-адреÑа Ñкрипта учаÑтков
+ </string>
+ <string name="ScriptLimitsURLsUsed">
+ ИÑпользуетÑÑ URL-адреÑов: [COUNT] из [MAX] (доÑтупно: [AVAILABLE])
+ </string>
+ <string name="ScriptLimitsURLsUsedSimple">
+ ИÑпользуетÑÑ URL-адреÑов: [COUNT]
+ </string>
+ <string name="ScriptLimitsRequestError">
+ Ошибка при запроÑе данных
+ </string>
+ <string name="ScriptLimitsRequestNoParcelSelected">
+ УчаÑток не выбран
+ </string>
+ <string name="ScriptLimitsRequestWrongRegion">
+ Ошибка. Ð¡Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¾ Ñкрипте доÑтупны только в текущем регионе
+ </string>
+ <string name="ScriptLimitsRequestWaiting">
+ Получение данных...
+ </string>
+ <string name="ScriptLimitsRequestDontOwnParcel">
+ У Ð²Ð°Ñ Ð½ÐµÑ‚ прав Ð´Ð»Ñ Ð¸ÑÑÐ»ÐµÐ´Ð¾Ð²Ð°Ð½Ð¸Ñ Ñтого учаÑтка
+ </string>
+ <string name="SITTING_ON">
+ Сидит на
+ </string>
+ <string name="ATTACH_CHEST">
+ Грудь
+ </string>
+ <string name="ATTACH_HEAD">
+ Голова
+ </string>
+ <string name="ATTACH_LSHOULDER">
+ Левое плечо
+ </string>
+ <string name="ATTACH_RSHOULDER">
+ Правое плечо
+ </string>
+ <string name="ATTACH_LHAND">
+ Ð›ÐµÐ²Ð°Ñ ÐºÐ¸Ñть
+ </string>
+ <string name="ATTACH_RHAND">
+ ÐŸÑ€Ð°Ð²Ð°Ñ ÐºÐ¸Ñть
+ </string>
+ <string name="ATTACH_LFOOT">
+ Ð›ÐµÐ²Ð°Ñ ÑтупнÑ
+ </string>
+ <string name="ATTACH_RFOOT">
+ ÐŸÑ€Ð°Ð²Ð°Ñ ÑтупнÑ
+ </string>
+ <string name="ATTACH_BACK">
+ Спина
+ </string>
+ <string name="ATTACH_PELVIS">
+ Таз
+ </string>
+ <string name="ATTACH_MOUTH">
+ Рот
+ </string>
+ <string name="ATTACH_CHIN">
+ Подбородок
+ </string>
+ <string name="ATTACH_LEAR">
+ Левое ухо
+ </string>
+ <string name="ATTACH_REAR">
+ Правое ухо
+ </string>
+ <string name="ATTACH_LEYE">
+ Левый глаз
+ </string>
+ <string name="ATTACH_REYE">
+ Правый глаз
+ </string>
+ <string name="ATTACH_NOSE">
+ ÐоÑ
+ </string>
+ <string name="ATTACH_RUARM">
+ Правое плечо
+ </string>
+ <string name="ATTACH_RLARM">
+ Правое предплечье
+ </string>
+ <string name="ATTACH_LUARM">
+ Левое плечо
+ </string>
+ <string name="ATTACH_LLARM">
+ Левое предплечье
+ </string>
+ <string name="ATTACH_RHIP">
+ Правое бедро
+ </string>
+ <string name="ATTACH_RULEG">
+ Правое колено
+ </string>
+ <string name="ATTACH_RLLEG">
+ ÐŸÑ€Ð°Ð²Ð°Ñ Ð³Ð¾Ð»ÐµÐ½ÑŒ
+ </string>
+ <string name="ATTACH_LHIP">
+ Левое бедро
+ </string>
+ <string name="ATTACH_LULEG">
+ Левое колено
+ </string>
+ <string name="ATTACH_LLLEG">
+ Ð›ÐµÐ²Ð°Ñ Ð³Ð¾Ð»ÐµÐ½ÑŒ
+ </string>
+ <string name="ATTACH_BELLY">
+ Живот
+ </string>
+ <string name="ATTACH_RPEC">
+ ÐŸÑ€Ð°Ð²Ð°Ñ Ð³Ñ€ÑƒÐ´ÑŒ
+ </string>
+ <string name="ATTACH_LPEC">
+ Ð›ÐµÐ²Ð°Ñ Ð³Ñ€ÑƒÐ´ÑŒ
+ </string>
+ <string name="ATTACH_HUD_CENTER_2">
+ Данные в игре в центре 2
+ </string>
+ <string name="ATTACH_HUD_TOP_RIGHT">
+ Данные в игре вверху Ñправа
+ </string>
+ <string name="ATTACH_HUD_TOP_CENTER">
+ Данные в игре вверху в центре
+ </string>
+ <string name="ATTACH_HUD_TOP_LEFT">
+ Данные в игре вверху Ñлева
+ </string>
+ <string name="ATTACH_HUD_CENTER_1">
+ Данные в игре в центре 1
+ </string>
+ <string name="ATTACH_HUD_BOTTOM_LEFT">
+ Данные в игре внизу Ñлева
+ </string>
+ <string name="ATTACH_HUD_BOTTOM">
+ Данные в игре внизу
+ </string>
+ <string name="ATTACH_HUD_BOTTOM_RIGHT">
+ Данные в игре внизу Ñправа
+ </string>
+ <string name="CursorPos">
+ Строка [LINE], Ñтолбец [COLUMN]
+ </string>
+ <string name="PanelDirCountFound">
+ Ðайдено: [COUNT]
+ </string>
+ <string name="PanelDirTimeStr">
+ [hour,datetime,slt]:[min,datetime,slt]
+ </string>
+ <string name="PanelDirEventsDateText">
+ [day,datetime,slt].[mthnum,datetime,slt]
+ </string>
+ <string name="PanelContentsTooltip">
+ Подключение к объекту
+ </string>
+ <string name="PanelContentsNewScript">
+ Ðовый Ñкрипт
+ </string>
+ <string name="BusyModeResponseDefault">
+ У адреÑата вашего ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð·Ð°Ð´Ð°Ð½ ÑÑ‚Ð°Ñ‚ÑƒÑ Â«Ðе беÑпокоить». Ваше Ñообщение вÑе равно будет отображено на панели IM Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñмотра позже.
+ </string>
+ <string name="MuteByName">
+ (по имени)
+ </string>
+ <string name="MuteAgent">
+ (Ð´Ð»Ñ Ð¶Ð¸Ñ‚ÐµÐ»Ñ)
+ </string>
+ <string name="MuteObject">
+ (Ð´Ð»Ñ Ð¾Ð±ÑŠÐµÐºÑ‚Ð°)
+ </string>
+ <string name="MuteGroup">
+ (Ð´Ð»Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ñ‹)
+ </string>
+ <string name="MuteExternal">
+ (внешний)
+ </string>
+ <string name="RegionNoCovenant">
+ Ðет ÑÐ¾Ð³Ð»Ð°ÑˆÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ñтого землевладениÑ.
+ </string>
+ <string name="RegionNoCovenantOtherOwner">
+ Ðет ÑÐ¾Ð³Ð»Ð°ÑˆÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ñтого землевладениÑ. Ð—ÐµÐ¼Ð»Ñ Ð² Ñтом землевладении продаетÑÑ ÐµÐ³Ð¾ владельцем, а не компанией Linden Lab. Чтобы узнать подробноÑти о продаже, обратитеÑÑŒ к землевладельцу.
+ </string>
+ <string name="covenant_last_modified" value="Дата поÑледнего изменениÑ:"/>
+ <string name="none_text" value="(нет)"/>
+ <string name="never_text" value="(никогда)"/>
+ <string name="GroupOwned">
+ СобÑтвенноÑть группы
+ </string>
+ <string name="Public">
+ ÐžÐ±Ñ‰Ð°Ñ ÑобÑтвенноÑть
+ </string>
+ <string name="LocalSettings">
+ Локальные наÑтройки
+ </string>
+ <string name="RegionSettings">
+ Региональные наÑтройки
+ </string>
+ <string name="ClassifiedClicksTxt">
+ Щелчки: телепорт [TELEPORT], карта [MAP], профиль [PROFILE]
+ </string>
+ <string name="ClassifiedUpdateAfterPublish">
+ (будет обновлено поÑле публикации)
+ </string>
+ <string name="NoPicksClassifiedsText">
+ Ð’Ñ‹ не Ñоздали подборки или рекламы. Ðажмите кнопку Ñо знаком «плюÑ» ниже, чтобы Ñоздать подборку или рекламу
+ </string>
+ <string name="NoAvatarPicksClassifiedsText">
+ У Ð¶Ð¸Ñ‚ÐµÐ»Ñ Ð½ÐµÑ‚ подборки или рекламы
+ </string>
+ <string name="PicksClassifiedsLoadingText">
+ Загрузка...
+ </string>
+ <string name="MultiPreviewTitle">
+ Предварительный проÑмотр
+ </string>
+ <string name="MultiPropertiesTitle">
+ СвойÑтва
+ </string>
+ <string name="InvOfferAnObjectNamed">
+ Объект Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼
+ </string>
+ <string name="InvOfferOwnedByGroup">
+ принадлежит группе
+ </string>
+ <string name="InvOfferOwnedByUnknownGroup">
+ принадлежит извеÑтной группе
+ </string>
+ <string name="InvOfferOwnedBy">
+ принадлежит
+ </string>
+ <string name="InvOfferOwnedByUnknownUser">
+ принадлежит неизвеÑтному пользователю
+ </string>
+ <string name="InvOfferGaveYou">
+ дал(а) вам
+ </string>
+ <string name="InvOfferDecline">
+ Ð’Ñ‹ не принÑли [DESC] от Ð¶Ð¸Ñ‚ÐµÐ»Ñ &lt;nolink&gt;[NAME]&lt;/nolink&gt;.
+ </string>
+ <string name="GroupMoneyTotal">
+ Итого
+ </string>
+ <string name="GroupMoneyBought">
+ куплено
+ </string>
+ <string name="GroupMoneyPaidYou">
+ уплачено вам
+ </string>
+ <string name="GroupMoneyPaidInto">
+ уплачено в
+ </string>
+ <string name="GroupMoneyBoughtPassTo">
+ куплен пропуÑк в
+ </string>
+ <string name="GroupMoneyPaidFeeForEvent">
+ уплачено за Ñобытие
+ </string>
+ <string name="GroupMoneyPaidPrizeForEvent">
+ выплачено призовых за Ñобытие
+ </string>
+ <string name="GroupMoneyBalance">
+ БаланÑ
+ </string>
+ <string name="GroupMoneyCredits">
+ РаÑход
+ </string>
+ <string name="GroupMoneyDebits">
+ Приход
+ </string>
+ <string name="GroupMoneyDate">
+ [weekday,datetime,utc], [day,datetime,utc] [mth,datetime,utc] [year,datetime,utc]
+ </string>
+ <string name="ViewerObjectContents">
+ Контент
+ </string>
+ <string name="AcquiredItems">
+ Купленные вещи
+ </string>
+ <string name="Cancel">
+ Отмена
+ </string>
+ <string name="UploadingCosts">
+ Передача [NAME] Ñтоит L$[AMOUNT]
+ </string>
+ <string name="BuyingCosts">
+ СтоимоÑть покупки: L$[AMOUNT]
+ </string>
+ <string name="UnknownFileExtension">
+ ÐеизвеÑтное раÑширение файла .%s
+ОжидаютÑÑ Ñ€Ð°ÑширениÑ: WAV, TGA, BMP, JPG, JPEG или BVH
+ </string>
+ <string name="MuteObject2">
+ Заблокировать
+ </string>
+ <string name="MuteAvatar">
+ Заблокировать
+ </string>
+ <string name="UnmuteObject">
+ Разблокировать
+ </string>
+ <string name="UnmuteAvatar">
+ Разблокировать
+ </string>
+ <string name="AddLandmarkNavBarMenu">
+ Добавить в мои закладки...
+ </string>
+ <string name="EditLandmarkNavBarMenu">
+ Изменить мою закладку...
+ </string>
+ <string name="accel-mac-control">
+ ⌃
+ </string>
+ <string name="accel-mac-command">
+ ⌘
+ </string>
+ <string name="accel-mac-option">
+ ⌥
+ </string>
+ <string name="accel-mac-shift">
+ ⇧
+ </string>
+ <string name="accel-win-control">
+ CTRL+
+ </string>
+ <string name="accel-win-alt">
+ ALT+
+ </string>
+ <string name="accel-win-shift">
+ SHIFT+
+ </string>
+ <string name="FileSaved">
+ Файл Ñохранен
+ </string>
+ <string name="Receiving">
+ Получение
+ </string>
+ <string name="AM">
+ до полуднÑ
+ </string>
+ <string name="PM">
+ поÑле полуднÑ
+ </string>
+ <string name="PST">
+ ТихоокеанÑкое времÑ
+ </string>
+ <string name="PDT">
+ Летнее тихоокеанÑкое времÑ
+ </string>
+ <string name="Direction_Forward">
+ Вперед
+ </string>
+ <string name="Direction_Left">
+ Влево
+ </string>
+ <string name="Direction_Right">
+ Вправо
+ </string>
+ <string name="Direction_Back">
+ Ðазад
+ </string>
+ <string name="Direction_North">
+ Север
+ </string>
+ <string name="Direction_South">
+ Юг
+ </string>
+ <string name="Direction_West">
+ Запад
+ </string>
+ <string name="Direction_East">
+ ВоÑток
+ </string>
+ <string name="Direction_Up">
+ Вверх
+ </string>
+ <string name="Direction_Down">
+ Вниз
+ </string>
+ <string name="Any Category">
+ Ð’Ñе категории
+ </string>
+ <string name="Shopping">
+ Покупки
+ </string>
+ <string name="Land Rental">
+ Ð—ÐµÐ¼ÐµÐ»ÑŒÐ½Ð°Ñ Ñ€ÐµÐ½Ñ‚Ð°
+ </string>
+ <string name="Property Rental">
+ Ðренда имущеÑтва
+ </string>
+ <string name="Special Attraction">
+ ОÑобое Ñобытие
+ </string>
+ <string name="New Products">
+ Ðовые продукты
+ </string>
+ <string name="Employment">
+ Род занÑтий
+ </string>
+ <string name="Wanted">
+ Хочу найти
+ </string>
+ <string name="Service">
+ УÑлуги
+ </string>
+ <string name="Personal">
+ Личное Ñообщение
+ </string>
+ <string name="None">
+ Ðет
+ </string>
+ <string name="Linden Location">
+ МеÑто Linden
+ </string>
+ <string name="Adult">
+ Ð”Ð»Ñ Ð²Ð·Ñ€Ð¾Ñлых
+ </string>
+ <string name="Arts&amp;Culture">
+ ИÑкуÑÑтво и культура
+ </string>
+ <string name="Business">
+ БизнеÑ
+ </string>
+ <string name="Educational">
+ Образование
+ </string>
+ <string name="Gaming">
+ Игры
+ </string>
+ <string name="Hangout">
+ МеÑта вÑтреч
+ </string>
+ <string name="Newcomer Friendly">
+ Ð”Ð»Ñ Ð½Ð¾Ð²Ð¸Ñ‡ÐºÐ¾Ð²
+ </string>
+ <string name="Parks&amp;Nature">
+ Парки и природа
+ </string>
+ <string name="Residential">
+ Проживание
+ </string>
+ <string name="Stage">
+ СтадиÑ
+ </string>
+ <string name="Other">
+ Другое
+ </string>
+ <string name="Rental">
+ Ðренда
+ </string>
+ <string name="Any">
+ Ð’Ñе
+ </string>
+ <string name="You">
+ Ð’Ñ‹
+ </string>
+ <string name=":">
+ :
+ </string>
+ <string name=",">
+ ,
+ </string>
+ <string name="...">
+ ...
+ </string>
+ <string name="***">
+ ***
+ </string>
+ <string name="(">
+ (
+ </string>
+ <string name=")">
+ )
+ </string>
+ <string name=".">
+ .
+ </string>
+ <string name="&apos;">
+ &apos;
+ </string>
+ <string name="---">
+ ---
+ </string>
+ <string name="Multiple Media">
+ ÐеÑколько иÑточников мультимедиа
+ </string>
+ <string name="Play Media">
+ Мультимедиа – воÑпроизведение/пауза
+ </string>
+ <string name="MBCmdLineError">
+ Ошибка при анализе командной Ñтроки.
+См.: http://wiki.secondlife.com/wiki/Client_parameters
+Ошибка:
+ </string>
+ <string name="MBCmdLineUsg">
+ ИÑпользование командной Ñтроки [APP_NAME]:
+ </string>
+ <string name="MBUnableToAccessFile">
+ Приложению [APP_NAME] не удаетÑÑ Ð¿Ð¾Ð»ÑƒÑ‡Ð¸Ñ‚ÑŒ доÑтуп к нужному файлу.
+Возможно, выполнÑетÑÑ Ð½ÐµÑколько копий или в ÑиÑтеме неправильно открыт файл.
+ЕÑли Ñто Ñообщение по-прежнему будет отображатьÑÑ, перезагрузите компьютер и повторите попытку.
+ЕÑли и Ñто не поможет, возможно, придетÑÑ Ð¿Ð¾Ð²Ñ‚Ð¾Ñ€Ð½Ð¾ уÑтановить приложение [APP_NAME].
+ </string>
+ <string name="MBFatalError">
+ ÐеуÑÑ‚Ñ€Ð°Ð½Ð¸Ð¼Ð°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ°
+ </string>
+ <string name="MBRequiresAltiVec">
+ Ð”Ð»Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹ [APP_NAME] необходим процеÑÑор Ñ Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶ÐºÐ¾Ð¹ AltiVec (верÑии G4 или более поздней).
+ </string>
+ <string name="MBAlreadyRunning">
+ [APP_NAME] уже выполнÑетÑÑ.
+Поищите значок программы на панели задач.
+ЕÑли Ñто Ñообщение по-прежнему будет отображатьÑÑ, перезагрузите компьютер.
+ </string>
+ <string name="MBFrozenCrashed">
+ По-видимому, при предыдущем запуÑке Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ [APP_NAME] оно завиÑло или в нем возник Ñбой.
+Отправить отчет о Ñбое?
+ </string>
+ <string name="MBAlert">
+ Уведомление
+ </string>
+ <string name="MBNoDirectX">
+ Приложению [APP_NAME] не удаетÑÑ Ð¾Ð±Ð½Ð°Ñ€ÑƒÐ¶Ð¸Ñ‚ÑŒ DirectX 9.0b или более поздних верÑий.
+Ð’ приложении [APP_NAME] иÑпользуетÑÑ DirectX Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ¸ Ð¾Ð±Ð¾Ñ€ÑƒÐ´Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸ выÑÐ²Ð»ÐµÐ½Ð¸Ñ ÑƒÑтаревших драйверов, из-за которых может ÑнизитьÑÑ ÑтабильноÑть работы и быÑтродейÑтвие, а также возникнуть Ñбои. ÐаÑтоÑтельно рекомендуетÑÑ ÑƒÑтановить DirectX 9.0b, Ñ…Ð¾Ñ‚Ñ Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ðµ [APP_NAME] работает и без Ñтого компонента.
+Продолжить?
+ </string>
+ <string name="MBWarning">
+ Внимание!
+ </string>
+ <string name="MBNoAutoUpdate">
+ Ð’ ОС Linux автоматичеÑкое обновление еще не реализовано.
+Загрузите новую верÑию на Ñайте www.secondlife.com.
+ </string>
+ <string name="MBRegClassFailed">
+ Ошибка RegisterClass
+ </string>
+ <string name="MBError">
+ Ошибка
+ </string>
+ <string name="MBFullScreenErr">
+ Ðевозможна работа в полноÑкранном режиме на Ñкране [WIDTH] x [HEIGHT].
+Запущено в окне.
+ </string>
+ <string name="MBDestroyWinFailed">
+ Ошибка Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹ при удалении окна (Ñбой функции DestroyWindow())
+ </string>
+ <string name="MBShutdownErr">
+ Ошибка Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹
+ </string>
+ <string name="MBDevContextErr">
+ Ðе удаетÑÑ Ñоздать контекÑÑ‚ уÑтройÑтва GL
+ </string>
+ <string name="MBPixelFmtErr">
+ Ðе удаетÑÑ Ð½Ð°Ð¹Ñ‚Ð¸ подходÑщий формат пикÑелей
+ </string>
+ <string name="MBPixelFmtDescErr">
+ Ðе удаетÑÑ Ð¿Ð¾Ð»ÑƒÑ‡Ð¸Ñ‚ÑŒ опиÑание формата пикÑелей
+ </string>
+ <string name="MBTrueColorWindow">
+ Ð”Ð»Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹ [APP_NAME] необходим режим True Color (32 бита).
+Задайте в наÑтройках диÑÐ¿Ð»ÐµÑ 32-битный режим цвета.
+ </string>
+ <string name="MBAlpha">
+ Ðе удаетÑÑ Ð·Ð°Ð¿ÑƒÑтить [APP_NAME] из-за отÑутÑÑ‚Ð²Ð¸Ñ Ð´Ð¾Ñтупа к 8-битному альфа-каналу. Обычно Ñта проблема возникает из-за неполадок Ñ Ð´Ñ€Ð°Ð¹Ð²ÐµÑ€Ð¾Ð¼ видеокарты.
+УÑтановите новые драйверы видеокарты.
+Также задайте Ð´Ð»Ñ Ð¼Ð¾Ð½Ð¸Ñ‚Ð¾Ñ€Ð° 32-битный режим True Color (Панель ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ &gt; Экран &gt; Параметры).
+ЕÑли Ñто Ñообщение продолжает отображатьÑÑ, обратитеÑÑŒ на Ñайт [SUPPORT_SITE].
+ </string>
+ <string name="MBPixelFmtSetErr">
+ Ðе удаетÑÑ Ð·Ð°Ð´Ð°Ñ‚ÑŒ формат пикÑелей
+ </string>
+ <string name="MBGLContextErr">
+ Ðе удаетÑÑ Ñоздать контекÑÑ‚ визуализации GL
+ </string>
+ <string name="MBGLContextActErr">
+ Ðе удаетÑÑ Ð°ÐºÑ‚Ð¸Ð²Ð¸Ñ€Ð¾Ð²Ð°Ñ‚ÑŒ контекÑÑ‚ визуализации GL
+ </string>
+ <string name="MBVideoDrvErr">
+ Ðе удаетÑÑ Ð·Ð°Ð¿ÑƒÑтить приложение [APP_NAME], поÑкольку драйверы видеокарты неправильно уÑтановлены, уÑтарели или предназначены Ð´Ð»Ñ Ð¾Ð±Ð¾Ñ€ÑƒÐ´Ð¾Ð²Ð°Ð½Ð¸Ñ, которое не поддерживаетÑÑ. УÑтановите или переуÑтановите поÑледние драйверы видеокарты.
+ЕÑли Ñто Ñообщение продолжает отображатьÑÑ, обратитеÑÑŒ на Ñайт [SUPPORT_SITE].
+ </string>
+ <string name="5 O&apos;Clock Shadow">
+ Жидкие
+ </string>
+ <string name="All White">
+ ПолноÑтью белые
+ </string>
+ <string name="Anime Eyes">
+ Глаза как в аниме
+ </string>
+ <string name="Arced">
+ Дугой
+ </string>
+ <string name="Arm Length">
+ Длина рук
+ </string>
+ <string name="Attached">
+ Прикреплено
+ </string>
+ <string name="Attached Earlobes">
+ ПрироÑшие мочки
+ </string>
+ <string name="Back Fringe">
+ Затылок
+ </string>
+ <string name="Baggy">
+ С мешками
+ </string>
+ <string name="Bangs">
+ Челки
+ </string>
+ <string name="Beady Eyes">
+ БуÑинки
+ </string>
+ <string name="Belly Size">
+ Размер живота
+ </string>
+ <string name="Big">
+ Большой
+ </string>
+ <string name="Big Butt">
+ Большой зад
+ </string>
+ <string name="Big Hair Back">
+ Пышные волоÑÑ‹: Ñзади
+ </string>
+ <string name="Big Hair Front">
+ Пышные волоÑÑ‹: Ñпереди
+ </string>
+ <string name="Big Hair Top">
+ Пышные волоÑÑ‹: Ñверху
+ </string>
+ <string name="Big Head">
+ Ð‘Ð¾Ð»ÑŒÑˆÐ°Ñ Ð³Ð¾Ð»Ð¾Ð²Ð°
+ </string>
+ <string name="Big Pectorals">
+ Ð’Ñ‹Ð¿ÑƒÐºÐ»Ð°Ñ Ð³Ñ€ÑƒÐ´ÑŒ
+ </string>
+ <string name="Big Spikes">
+ Большие «шипы»
+ </string>
+ <string name="Black">
+ Черный
+ </string>
+ <string name="Blonde">
+ Светлый
+ </string>
+ <string name="Blonde Hair">
+ Светлые волоÑÑ‹
+ </string>
+ <string name="Blush">
+ РумÑна
+ </string>
+ <string name="Blush Color">
+ Цвет румÑн
+ </string>
+ <string name="Blush Opacity">
+ ПрозрачноÑть румÑн
+ </string>
+ <string name="Body Definition">
+ Тип тела
+ </string>
+ <string name="Body Fat">
+ Ð–Ð¸Ñ€Ð¾Ð²Ð°Ñ Ð¿Ñ€Ð¾Ñлойка
+ </string>
+ <string name="Body Freckles">
+ ВеÑнушки
+ </string>
+ <string name="Body Thick">
+ Полное тело
+ </string>
+ <string name="Body Thickness">
+ Полнота
+ </string>
+ <string name="Body Thin">
+ Худое тело
+ </string>
+ <string name="Bow Legged">
+ Ðоги колеÑом
+ </string>
+ <string name="Breast Buoyancy">
+ Ð’Ñ‹Ñота груди
+ </string>
+ <string name="Breast Cleavage">
+ Ложбинка между грудей
+ </string>
+ <string name="Breast Size">
+ Размер груди
+ </string>
+ <string name="Bridge Width">
+ Ширина переноÑицы
+ </string>
+ <string name="Broad">
+ ШирокаÑ
+ </string>
+ <string name="Brow Size">
+ Размер надбровных дуг
+ </string>
+ <string name="Bug Eyes">
+ Выпученные глаза
+ </string>
+ <string name="Bugged Eyes">
+ Выпученные глаза
+ </string>
+ <string name="Bulbous">
+ Картошкой
+ </string>
+ <string name="Bulbous Nose">
+ ÐÐ¾Ñ ÐºÐ°Ñ€Ñ‚Ð¾ÑˆÐºÐ¾Ð¹
+ </string>
+ <string name="Breast Physics Mass">
+ МаÑÑа груди
+ </string>
+ <string name="Breast Physics Smoothing">
+ ГладкоÑть груди
+ </string>
+ <string name="Breast Physics Gravity">
+ ОбвиÑлоÑть груди
+ </string>
+ <string name="Breast Physics Drag">
+ ÐÑродинамика груди
+ </string>
+ <string name="Breast Physics InOut Max Effect">
+ ВерхнÑÑ Ð³Ñ€Ð°Ð½Ð¸Ñ†Ð°
+ </string>
+ <string name="Breast Physics InOut Spring">
+ УпругоÑть
+ </string>
+ <string name="Breast Physics InOut Gain">
+ Отклик
+ </string>
+ <string name="Breast Physics InOut Damping">
+ Затухание
+ </string>
+ <string name="Breast Physics UpDown Max Effect">
+ ВерхнÑÑ Ð³Ñ€Ð°Ð½Ð¸Ñ†Ð°
+ </string>
+ <string name="Breast Physics UpDown Spring">
+ УпругоÑть
+ </string>
+ <string name="Breast Physics UpDown Gain">
+ Отклик
+ </string>
+ <string name="Breast Physics UpDown Damping">
+ Затухание
+ </string>
+ <string name="Breast Physics LeftRight Max Effect">
+ ВерхнÑÑ Ð³Ñ€Ð°Ð½Ð¸Ñ†Ð°
+ </string>
+ <string name="Breast Physics LeftRight Spring">
+ УпругоÑть
+ </string>
+ <string name="Breast Physics LeftRight Gain">
+ Отклик
+ </string>
+ <string name="Breast Physics LeftRight Damping">
+ Затухание
+ </string>
+ <string name="Belly Physics Mass">
+ МаÑÑа живота
+ </string>
+ <string name="Belly Physics Smoothing">
+ ГладкоÑть живота
+ </string>
+ <string name="Belly Physics Gravity">
+ ОбвиÑлоÑть живота
+ </string>
+ <string name="Belly Physics Drag">
+ ИнертноÑть живота
+ </string>
+ <string name="Belly Physics UpDown Max Effect">
+ ВерхнÑÑ Ð³Ñ€Ð°Ð½Ð¸Ñ†Ð°
+ </string>
+ <string name="Belly Physics UpDown Spring">
+ УпругоÑть
+ </string>
+ <string name="Belly Physics UpDown Gain">
+ Отклик
+ </string>
+ <string name="Belly Physics UpDown Damping">
+ Затухание
+ </string>
+ <string name="Butt Physics Mass">
+ МаÑÑа зада
+ </string>
+ <string name="Butt Physics Smoothing">
+ ГладкоÑть зада
+ </string>
+ <string name="Butt Physics Gravity">
+ ОбвиÑлоÑть зада
+ </string>
+ <string name="Butt Physics Drag">
+ ИнертноÑть зада
+ </string>
+ <string name="Butt Physics UpDown Max Effect">
+ ВерхнÑÑ Ð³Ñ€Ð°Ð½Ð¸Ñ†Ð°
+ </string>
+ <string name="Butt Physics UpDown Spring">
+ УпругоÑть
+ </string>
+ <string name="Butt Physics UpDown Gain">
+ Отклик
+ </string>
+ <string name="Butt Physics UpDown Damping">
+ Затухание
+ </string>
+ <string name="Butt Physics LeftRight Max Effect">
+ ВерхнÑÑ Ð³Ñ€Ð°Ð½Ð¸Ñ†Ð°
+ </string>
+ <string name="Butt Physics LeftRight Spring">
+ УпругоÑть
+ </string>
+ <string name="Butt Physics LeftRight Gain">
+ Отклик
+ </string>
+ <string name="Butt Physics LeftRight Damping">
+ Затухание
+ </string>
+ <string name="Bushy Eyebrows">
+ КуÑтиÑтые брови
+ </string>
+ <string name="Bushy Hair">
+ Пышные
+ </string>
+ <string name="Butt Size">
+ Размер зада
+ </string>
+ <string name="Butt Gravity">
+ ОбвиÑлоÑть зада
+ </string>
+ <string name="bustle skirt">
+ Турнюр
+ </string>
+ <string name="no bustle">
+ Без турнюра
+ </string>
+ <string name="more bustle">
+ Большой турнюр
+ </string>
+ <string name="Chaplin">
+ «Чарли Чаплин»
+ </string>
+ <string name="Cheek Bones">
+ Скулы
+ </string>
+ <string name="Chest Size">
+ Размер грудной клетки
+ </string>
+ <string name="Chin Angle">
+ Угол подбородка
+ </string>
+ <string name="Chin Cleft">
+ Ямка на подбородке
+ </string>
+ <string name="Chin Curtains">
+ ШкиперÑÐºÐ°Ñ Ð±Ð¾Ñ€Ð¾Ð´ÐºÐ°
+ </string>
+ <string name="Chin Depth">
+ Толщина подбородка
+ </string>
+ <string name="Chin Heavy">
+ Мощный подбородок
+ </string>
+ <string name="Chin In">
+ Подбородок внутрь
+ </string>
+ <string name="Chin Out">
+ Подбородок наружу
+ </string>
+ <string name="Chin-Neck">
+ Переход от подбородка к шее
+ </string>
+ <string name="Clear">
+ ЧиÑтый
+ </string>
+ <string name="Cleft">
+ Ямка
+ </string>
+ <string name="Close Set Eyes">
+ Близко поÑаженные
+ </string>
+ <string name="Closed">
+ Закрыто
+ </string>
+ <string name="Closed Back">
+ Закрыто Ñзади
+ </string>
+ <string name="Closed Front">
+ Закрыто Ñпереди
+ </string>
+ <string name="Closed Left">
+ Закрыто Ñлева
+ </string>
+ <string name="Closed Right">
+ Закрыто Ñправа
+ </string>
+ <string name="Coin Purse">
+ Кошелек Ð´Ð»Ñ Ð¼ÐµÐ»Ð¾Ñ‡Ð¸
+ </string>
+ <string name="Collar Back">
+ Вырез Ñзади
+ </string>
+ <string name="Collar Front">
+ Вырез Ñпереди
+ </string>
+ <string name="Corner Down">
+ Уголки опущены
+ </string>
+ <string name="Corner Up">
+ Уголки поднÑты
+ </string>
+ <string name="Creased">
+ ИзмÑтый
+ </string>
+ <string name="Crooked Nose">
+ ИÑкривленный ноÑ
+ </string>
+ <string name="Cuff Flare">
+ Манжеты
+ </string>
+ <string name="Dark">
+ Темный
+ </string>
+ <string name="Dark Green">
+ Темно-зеленый
+ </string>
+ <string name="Darker">
+ Темнее
+ </string>
+ <string name="Deep">
+ Глубоко
+ </string>
+ <string name="Default Heels">
+ Стандартные каблуки
+ </string>
+ <string name="Dense">
+ ГуÑтые
+ </string>
+ <string name="Double Chin">
+ Двойной подбородок
+ </string>
+ <string name="Downturned">
+ Вниз
+ </string>
+ <string name="Duffle Bag">
+ Больше
+ </string>
+ <string name="Ear Angle">
+ ОттопыренноÑть ушей
+ </string>
+ <string name="Ear Size">
+ Размер ушей
+ </string>
+ <string name="Ear Tips">
+ Кончики ушей
+ </string>
+ <string name="Egg Head">
+ ЯйцеголовоÑть
+ </string>
+ <string name="Eye Bags">
+ Мешки под глазами
+ </string>
+ <string name="Eye Color">
+ Цвет глаз
+ </string>
+ <string name="Eye Depth">
+ Глубина глаз
+ </string>
+ <string name="Eye Lightness">
+ СветлоÑть глаз
+ </string>
+ <string name="Eye Opening">
+ ОткрытоÑть глаз
+ </string>
+ <string name="Eye Pop">
+ Вытаращить глаз
+ </string>
+ <string name="Eye Size">
+ Размер глаз
+ </string>
+ <string name="Eye Spacing">
+ РаÑÑтоÑние между глазами
+ </string>
+ <string name="Eyebrow Arc">
+ Ð›Ð¸Ð½Ð¸Ñ Ð±Ñ€Ð¾Ð²ÐµÐ¹
+ </string>
+ <string name="Eyebrow Density">
+ ГуÑтота бровей
+ </string>
+ <string name="Eyebrow Height">
+ Ð’Ñ‹Ñота бровей
+ </string>
+ <string name="Eyebrow Points">
+ Кончики бровей
+ </string>
+ <string name="Eyebrow Size">
+ Размер бровей
+ </string>
+ <string name="Eyelash Length">
+ Длина реÑниц
+ </string>
+ <string name="Eyeliner">
+ Подводка
+ </string>
+ <string name="Eyeliner Color">
+ Цвет подводки
+ </string>
+ <string name="Eyes Bugged">
+ Выпученные глаза
+ </string>
+ <string name="Face Shear">
+ ÐŸÐµÑ€ÐµÐºÐ¾Ñ Ð»Ð¸Ñ†Ð°
+ </string>
+ <string name="Facial Definition">
+ Черты лица
+ </string>
+ <string name="Far Set Eyes">
+ Широко раÑÑтавленные глаза
+ </string>
+ <string name="Fat Lips">
+ ТолÑтые губы
+ </string>
+ <string name="Female">
+ Женщина
+ </string>
+ <string name="Fingerless">
+ Без пальцев
+ </string>
+ <string name="Fingers">
+ С пальцами
+ </string>
+ <string name="Flared Cuffs">
+ С манжетами
+ </string>
+ <string name="Flat">
+ ПлоÑкие
+ </string>
+ <string name="Flat Butt">
+ ПлоÑкий зад
+ </string>
+ <string name="Flat Head">
+ ПлоÑÐºÐ°Ñ Ð³Ð¾Ð»Ð¾Ð²Ð°
+ </string>
+ <string name="Flat Toe">
+ ПлоÑкий ноÑок
+ </string>
+ <string name="Foot Size">
+ Размер Ñтупни
+ </string>
+ <string name="Forehead Angle">
+ Ðаклон лба
+ </string>
+ <string name="Forehead Heavy">
+ Мощный лоб
+ </string>
+ <string name="Freckles">
+ ВеÑнушки
+ </string>
+ <string name="Front Fringe">
+ Челка Ñпереди
+ </string>
+ <string name="Full Back">
+ ПолноÑтью назад
+ </string>
+ <string name="Full Eyeliner">
+ Подводка полноÑтью
+ </string>
+ <string name="Full Front">
+ ПолноÑтью наперед
+ </string>
+ <string name="Full Hair Sides">
+ ВолоÑÑ‹ по бокам
+ </string>
+ <string name="Full Sides">
+ По бокам
+ </string>
+ <string name="Glossy">
+ БлеÑÑ‚Ñщие
+ </string>
+ <string name="Glove Fingers">
+ Пальцы перчаток
+ </string>
+ <string name="Glove Length">
+ Длина перчаток
+ </string>
+ <string name="Hair">
+ ВолоÑÑ‹
+ </string>
+ <string name="Hair Back">
+ ВолоÑÑ‹: Ñзади
+ </string>
+ <string name="Hair Front">
+ ВолоÑÑ‹: Ñпереди
+ </string>
+ <string name="Hair Sides">
+ ВолоÑÑ‹: по бокам
+ </string>
+ <string name="Hair Sweep">
+ ВолоÑÑ‹ на глаза
+ </string>
+ <string name="Hair Thickess">
+ Толщина волоÑ
+ </string>
+ <string name="Hair Thickness">
+ Толщина волоÑ
+ </string>
+ <string name="Hair Tilt">
+ ЗачеÑ
+ </string>
+ <string name="Hair Tilted Left">
+ Ð—Ð°Ñ‡ÐµÑ Ð½Ð°Ð·Ð°Ð´
+ </string>
+ <string name="Hair Tilted Right">
+ Ð—Ð°Ñ‡ÐµÑ Ð²Ð¿Ñ€Ð°Ð²Ð¾
+ </string>
+ <string name="Hair Volume">
+ ВолоÑÑ‹: объем
+ </string>
+ <string name="Hand Size">
+ Размер киÑти
+ </string>
+ <string name="Handlebars">
+ Длинные уÑÑ‹
+ </string>
+ <string name="Head Length">
+ Длина головы
+ </string>
+ <string name="Head Shape">
+ Форма головы
+ </string>
+ <string name="Head Size">
+ Размер головы
+ </string>
+ <string name="Head Stretch">
+ ВытÑнутоÑть головы
+ </string>
+ <string name="Heel Height">
+ Ð’Ñ‹Ñота каблука
+ </string>
+ <string name="Heel Shape">
+ Форма каблука
+ </string>
+ <string name="Height">
+ РоÑÑ‚
+ </string>
+ <string name="High">
+ Ð’Ñ‹Ñокие
+ </string>
+ <string name="High Heels">
+ Ð’Ñ‹Ñокий каблук
+ </string>
+ <string name="High Jaw">
+ ЧелюÑть выÑоко
+ </string>
+ <string name="High Platforms">
+ Ð’Ñ‹ÑÐ¾ÐºÐ°Ñ Ð¿Ð»Ð°Ñ‚Ñ„Ð¾Ñ€Ð¼Ð°
+ </string>
+ <string name="High and Tight">
+ Ð’Ñ‹Ñокий и плотный
+ </string>
+ <string name="Higher">
+ Выше
+ </string>
+ <string name="Hip Length">
+ Длина бедер
+ </string>
+ <string name="Hip Width">
+ Ширина бедер
+ </string>
+ <string name="In">
+ Внутрь
+ </string>
+ <string name="In Shdw Color">
+ Цвет внутренних теней
+ </string>
+ <string name="In Shdw Opacity">
+ ПрозрачноÑть внутр. теней
+ </string>
+ <string name="Inner Eye Corner">
+ Внутренние уголки глаз
+ </string>
+ <string name="Inner Eye Shadow">
+ Тени на внутренних уголках
+ </string>
+ <string name="Inner Shadow">
+ Внутренние тени
+ </string>
+ <string name="Jacket Length">
+ Длина пиджака
+ </string>
+ <string name="Jacket Wrinkles">
+ СмÑтый пиджак
+ </string>
+ <string name="Jaw Angle">
+ Угол челюÑти
+ </string>
+ <string name="Jaw Jut">
+ Ð’Ñ‹Ñтупание челюÑти
+ </string>
+ <string name="Jaw Shape">
+ Форма челюÑти
+ </string>
+ <string name="Join">
+ Прикрепить
+ </string>
+ <string name="Jowls">
+ Щеки
+ </string>
+ <string name="Knee Angle">
+ Угол колен
+ </string>
+ <string name="Knock Kneed">
+ Колченогие
+ </string>
+ <string name="Large">
+ Больше
+ </string>
+ <string name="Large Hands">
+ Большие киÑти
+ </string>
+ <string name="Left Part">
+ Левый пробор
+ </string>
+ <string name="Leg Length">
+ Длина ног
+ </string>
+ <string name="Leg Muscles">
+ Мышцы на ногах
+ </string>
+ <string name="Less">
+ Меньше
+ </string>
+ <string name="Less Body Fat">
+ Меньше жира
+ </string>
+ <string name="Less Curtains">
+ Меньше борода
+ </string>
+ <string name="Less Freckles">
+ Меньше веÑнушек
+ </string>
+ <string name="Less Full">
+ Менее полное
+ </string>
+ <string name="Less Gravity">
+ Меньше притÑжениÑ
+ </string>
+ <string name="Less Love">
+ Меньше
+ </string>
+ <string name="Less Muscles">
+ Меньше мышц
+ </string>
+ <string name="Less Muscular">
+ Меньше мышц
+ </string>
+ <string name="Less Rosy">
+ Меньше румÑн
+ </string>
+ <string name="Less Round">
+ Меньше округлоÑти
+ </string>
+ <string name="Less Saddle">
+ Меньше
+ </string>
+ <string name="Less Square">
+ Меньше угловатоÑти
+ </string>
+ <string name="Less Volume">
+ Меньше объема
+ </string>
+ <string name="Less soul">
+ Меньше
+ </string>
+ <string name="Lighter">
+ Светлее
+ </string>
+ <string name="Lip Cleft">
+ Ямка между губ
+ </string>
+ <string name="Lip Cleft Depth">
+ Глубина Ñмки
+ </string>
+ <string name="Lip Fullness">
+ Полнота губ
+ </string>
+ <string name="Lip Pinkness">
+ РозоватоÑть губ
+ </string>
+ <string name="Lip Ratio">
+ ÐŸÑ€Ð¾Ð¿Ð¾Ñ€Ñ†Ð¸Ñ Ð³ÑƒÐ±
+ </string>
+ <string name="Lip Thickness">
+ Толщина губ
+ </string>
+ <string name="Lip Width">
+ Ширина губ
+ </string>
+ <string name="Lipgloss">
+ БлеÑк губ
+ </string>
+ <string name="Lipstick">
+ Ð“ÑƒÐ±Ð½Ð°Ñ Ð¿Ð¾Ð¼Ð°Ð´Ð°
+ </string>
+ <string name="Lipstick Color">
+ Цвет помады
+ </string>
+ <string name="Long">
+ Длиннее
+ </string>
+ <string name="Long Head">
+ Ð”Ð»Ð¸Ð½Ð½Ð°Ñ Ð³Ð¾Ð»Ð¾Ð²Ð°
+ </string>
+ <string name="Long Hips">
+ Длинные бедра
+ </string>
+ <string name="Long Legs">
+ Длинные ноги
+ </string>
+ <string name="Long Neck">
+ Ð”Ð»Ð¸Ð½Ð½Ð°Ñ ÑˆÐµÑ
+ </string>
+ <string name="Long Pigtails">
+ Длинные хвоÑты по бокам
+ </string>
+ <string name="Long Ponytail">
+ Длинный хвоÑÑ‚ Ñзади
+ </string>
+ <string name="Long Torso">
+ Длинный торÑ
+ </string>
+ <string name="Long arms">
+ Длинные руки
+ </string>
+ <string name="Loose Pants">
+ Свободные брюки
+ </string>
+ <string name="Loose Shirt">
+ Ð¡Ð²Ð¾Ð±Ð¾Ð´Ð½Ð°Ñ Ñ€ÑƒÐ±Ð°ÑˆÐºÐ°
+ </string>
+ <string name="Loose Sleeves">
+ Свободные рукава
+ </string>
+ <string name="Love Handles">
+ ÐžÑ‚Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð½Ð° талии
+ </string>
+ <string name="Low">
+ Ðизкие
+ </string>
+ <string name="Low Heels">
+ Ðизкий каблук
+ </string>
+ <string name="Low Jaw">
+ ЧелюÑть низко
+ </string>
+ <string name="Low Platforms">
+ ÐÐ¸Ð·ÐºÐ°Ñ Ð¿Ð»Ð°Ñ‚Ñ„Ð¾Ñ€Ð¼Ð°
+ </string>
+ <string name="Low and Loose">
+ Ðизкий и Ñвободный
+ </string>
+ <string name="Lower">
+ Ðиже
+ </string>
+ <string name="Lower Bridge">
+ Спинка ноÑа
+ </string>
+ <string name="Lower Cheeks">
+ Щеки ниже
+ </string>
+ <string name="Male">
+ Мужчина
+ </string>
+ <string name="Middle Part">
+ Пробор по центру
+ </string>
+ <string name="More">
+ Больше
+ </string>
+ <string name="More Blush">
+ Больше румÑн
+ </string>
+ <string name="More Body Fat">
+ Больше жира
+ </string>
+ <string name="More Curtains">
+ Больше борода
+ </string>
+ <string name="More Eyeshadow">
+ Больше теней
+ </string>
+ <string name="More Freckles">
+ Больше веÑнушек
+ </string>
+ <string name="More Full">
+ Более полное
+ </string>
+ <string name="More Gravity">
+ Большее притÑжение
+ </string>
+ <string name="More Lipstick">
+ Больше помады
+ </string>
+ <string name="More Love">
+ Больше
+ </string>
+ <string name="More Lower Lip">
+ Больше нижнÑÑ Ð³ÑƒÐ±Ð°
+ </string>
+ <string name="More Muscles">
+ Больше мышц
+ </string>
+ <string name="More Muscular">
+ Больше мышц
+ </string>
+ <string name="More Rosy">
+ Больше румÑнца
+ </string>
+ <string name="More Round">
+ Больше округлоÑти
+ </string>
+ <string name="More Saddle">
+ Больше
+ </string>
+ <string name="More Sloped">
+ Более наклонный
+ </string>
+ <string name="More Square">
+ Более квадратнаÑ
+ </string>
+ <string name="More Upper Lip">
+ Больше верхнÑÑ Ð³ÑƒÐ±Ð°
+ </string>
+ <string name="More Vertical">
+ Более вертикальный
+ </string>
+ <string name="More Volume">
+ Больше объема
+ </string>
+ <string name="More soul">
+ Больше
+ </string>
+ <string name="Moustache">
+ УÑÑ‹
+ </string>
+ <string name="Mouth Corner">
+ Угол рта
+ </string>
+ <string name="Mouth Position">
+ Положение рта
+ </string>
+ <string name="Mowhawk">
+ Ирокез
+ </string>
+ <string name="Muscular">
+ МуÑкулиÑтое
+ </string>
+ <string name="Mutton Chops">
+ Бакенбарды
+ </string>
+ <string name="Nail Polish">
+ Лак Ð´Ð»Ñ Ð½Ð¾Ð³Ñ‚ÐµÐ¹
+ </string>
+ <string name="Nail Polish Color">
+ Цвет лака
+ </string>
+ <string name="Narrow">
+ Узко
+ </string>
+ <string name="Narrow Back">
+ Узко Ñзади
+ </string>
+ <string name="Narrow Front">
+ Узкий перед
+ </string>
+ <string name="Narrow Lips">
+ Узкие губы
+ </string>
+ <string name="Natural">
+ ЕÑтеÑтвенный
+ </string>
+ <string name="Neck Length">
+ Длина шеи
+ </string>
+ <string name="Neck Thickness">
+ Толщина шеи
+ </string>
+ <string name="No Blush">
+ Без румÑн
+ </string>
+ <string name="No Eyeliner">
+ Без подводки
+ </string>
+ <string name="No Eyeshadow">
+ Без теней
+ </string>
+ <string name="No Lipgloss">
+ Без блеÑка
+ </string>
+ <string name="No Lipstick">
+ Без помады
+ </string>
+ <string name="No Part">
+ Без пробора
+ </string>
+ <string name="No Polish">
+ Без лака
+ </string>
+ <string name="No Red">
+ Ðе краÑные
+ </string>
+ <string name="No Spikes">
+ Без «шипов»
+ </string>
+ <string name="No White">
+ Ðет белого
+ </string>
+ <string name="No Wrinkles">
+ Без морщин
+ </string>
+ <string name="Normal Lower">
+ Ðиже обычного
+ </string>
+ <string name="Normal Upper">
+ Выше обычного
+ </string>
+ <string name="Nose Left">
+ ÐÐ¾Ñ Ð²Ð»ÐµÐ²Ð¾
+ </string>
+ <string name="Nose Right">
+ ÐÐ¾Ñ Ð²Ð¿Ñ€Ð°Ð²Ð¾
+ </string>
+ <string name="Nose Size">
+ Размер ноÑа
+ </string>
+ <string name="Nose Thickness">
+ Толщина ноÑа
+ </string>
+ <string name="Nose Tip Angle">
+ ЗагнутоÑть кончика ноÑа
+ </string>
+ <string name="Nose Tip Shape">
+ Форма кончика ноÑа
+ </string>
+ <string name="Nose Width">
+ Ширина ноÑа
+ </string>
+ <string name="Nostril Division">
+ Перегородка
+ </string>
+ <string name="Nostril Width">
+ Ширина ноздрей
+ </string>
+ <string name="Opaque">
+ Ðепрозрачный
+ </string>
+ <string name="Open">
+ Открыто
+ </string>
+ <string name="Open Back">
+ Открыто Ñзади
+ </string>
+ <string name="Open Front">
+ Открыто Ñпереди
+ </string>
+ <string name="Open Left">
+ Открыто Ñлева
+ </string>
+ <string name="Open Right">
+ Открыто Ñправа
+ </string>
+ <string name="Orange">
+ Оранжевый
+ </string>
+ <string name="Out">
+ Ðаружу
+ </string>
+ <string name="Out Shdw Color">
+ Цвет внешних теней
+ </string>
+ <string name="Out Shdw Opacity">
+ ПрозрачноÑть внеш. теней
+ </string>
+ <string name="Outer Eye Corner">
+ Внешние уголки глаз
+ </string>
+ <string name="Outer Eye Shadow">
+ Тени во внешних уголках
+ </string>
+ <string name="Outer Shadow">
+ Внешние тени
+ </string>
+ <string name="Overbite">
+ Глубокий прикуÑ
+ </string>
+ <string name="Package">
+ Гульфик
+ </string>
+ <string name="Painted Nails">
+ Покрашенные
+ </string>
+ <string name="Pale">
+ Бледный
+ </string>
+ <string name="Pants Crotch">
+ Шаг
+ </string>
+ <string name="Pants Fit">
+ Облегающие брюки
+ </string>
+ <string name="Pants Length">
+ Длина
+ </string>
+ <string name="Pants Waist">
+ Ð¢Ð°Ð»Ð¸Ñ Ð±Ñ€ÑŽÐº
+ </string>
+ <string name="Pants Wrinkles">
+ СмÑтоÑть брюк
+ </string>
+ <string name="Part">
+ Пробор
+ </string>
+ <string name="Part Bangs">
+ Челка Ñ Ð¿Ñ€Ð¾Ð±Ð¾Ñ€Ð¾Ð¼
+ </string>
+ <string name="Pectorals">
+ Грудные мышцы
+ </string>
+ <string name="Pigment">
+ ПигментациÑ
+ </string>
+ <string name="Pigtails">
+ ХвоÑты по бокам
+ </string>
+ <string name="Pink">
+ Розовый
+ </string>
+ <string name="Pinker">
+ Розовее
+ </string>
+ <string name="Platform Height">
+ Ð’Ñ‹Ñота платформы
+ </string>
+ <string name="Platform Width">
+ Ширина платформы
+ </string>
+ <string name="Pointy">
+ ОÑтрые
+ </string>
+ <string name="Pointy Heels">
+ ОÑтрый каблук
+ </string>
+ <string name="Ponytail">
+ ХвоÑÑ‚ Ñзади
+ </string>
+ <string name="Poofy Skirt">
+ ÐŸÑ‹ÑˆÐ½Ð°Ñ ÑŽÐ±ÐºÐ°
+ </string>
+ <string name="Pop Left Eye">
+ Левый глаз
+ </string>
+ <string name="Pop Right Eye">
+ Правый глаз
+ </string>
+ <string name="Puffy">
+ Пухлые
+ </string>
+ <string name="Puffy Eyelids">
+ ПрипухлоÑть век
+ </string>
+ <string name="Rainbow Color">
+ Цвета радуги
+ </string>
+ <string name="Red Hair">
+ Рыжие волоÑÑ‹
+ </string>
+ <string name="Regular">
+ Обычное
+ </string>
+ <string name="Right Part">
+ Правый пробор
+ </string>
+ <string name="Rosy Complexion">
+ Розовое лицо
+ </string>
+ <string name="Round">
+ Круглое
+ </string>
+ <string name="Ruddiness">
+ РумÑнец
+ </string>
+ <string name="Ruddy">
+ РумÑный
+ </string>
+ <string name="Rumpled Hair">
+ Взъерошенные
+ </string>
+ <string name="Saddle Bags">
+ Галифе
+ </string>
+ <string name="Scrawny Leg">
+ Ð¡ÑƒÑ…Ð¾Ð¿Ð°Ñ€Ð°Ñ Ð½Ð¾Ð³Ð°
+ </string>
+ <string name="Separate">
+ Разделить
+ </string>
+ <string name="Shallow">
+ Мелко
+ </string>
+ <string name="Shear Back">
+ Ð¡ÐºÐ¾Ñ Ñзади
+ </string>
+ <string name="Shear Face">
+ ÐŸÐµÑ€ÐµÐºÐ¾Ñ Ð»Ð¸Ñ†Ð°
+ </string>
+ <string name="Shear Front">
+ Ð¡ÐºÐ¾Ñ Ñпереди
+ </string>
+ <string name="Shear Left Up">
+ Ð¡ÐºÐ¾Ñ Ð²Ð»ÐµÐ²Ð¾ вверх
+ </string>
+ <string name="Shear Right Up">
+ Ð¡ÐºÐ¾Ñ Ð²Ð¿Ñ€Ð°Ð²Ð¾ вверх
+ </string>
+ <string name="Sheared Back">
+ Уменьшено Ñзади
+ </string>
+ <string name="Sheared Front">
+ Уменьшено Ñпереди
+ </string>
+ <string name="Shift Left">
+ Сдвинуть влево
+ </string>
+ <string name="Shift Mouth">
+ Сдвинуть рот
+ </string>
+ <string name="Shift Right">
+ Сдвинуть вправо
+ </string>
+ <string name="Shirt Bottom">
+ Ðиз рубашки
+ </string>
+ <string name="Shirt Fit">
+ Облегание рубашки
+ </string>
+ <string name="Shirt Wrinkles">
+ ПомÑтоÑть рубашки
+ </string>
+ <string name="Shoe Height">
+ Ð’Ñ‹Ñота обуви
+ </string>
+ <string name="Short">
+ Ðиже
+ </string>
+ <string name="Short Arms">
+ Короткие руки
+ </string>
+ <string name="Short Legs">
+ Короткие ноги
+ </string>
+ <string name="Short Neck">
+ ÐšÐ¾Ñ€Ð¾Ñ‚ÐºÐ°Ñ ÑˆÐµÑ
+ </string>
+ <string name="Short Pigtails">
+ Короткие хвоÑты по бокам
+ </string>
+ <string name="Short Ponytail">
+ Короткий хвоÑÑ‚ Ñзади
+ </string>
+ <string name="Short Sideburns">
+ Короткие баки
+ </string>
+ <string name="Short Torso">
+ Короткий торÑ
+ </string>
+ <string name="Short hips">
+ Короткие бедра
+ </string>
+ <string name="Shoulders">
+ Плечи
+ </string>
+ <string name="Side Fringe">
+ Челка набок
+ </string>
+ <string name="Sideburns">
+ Бакенбарды
+ </string>
+ <string name="Sides Hair">
+ ВолоÑÑ‹ по бокам
+ </string>
+ <string name="Sides Hair Down">
+ ВолоÑÑ‹ по бокам внизу
+ </string>
+ <string name="Sides Hair Up">
+ ВолоÑÑ‹ по бокам вверху
+ </string>
+ <string name="Skinny Neck">
+ Ð¥ÑƒÐ´Ð°Ñ ÑˆÐµÑ
+ </string>
+ <string name="Skirt Fit">
+ ÐžÐ±Ð»ÐµÐ³Ð°ÑŽÑ‰Ð°Ñ ÑŽÐ±ÐºÐ°
+ </string>
+ <string name="Skirt Length">
+ Длина юбки
+ </string>
+ <string name="Slanted Forehead">
+ Ðаклонный лоб
+ </string>
+ <string name="Sleeve Length">
+ Длина рукавов
+ </string>
+ <string name="Sleeve Looseness">
+ Ширина рукавов
+ </string>
+ <string name="Slit Back">
+ Разрез: Ñзади
+ </string>
+ <string name="Slit Front">
+ Разрез: Ñпереди
+ </string>
+ <string name="Slit Left">
+ Разрез: Ñлева
+ </string>
+ <string name="Slit Right">
+ Разрез: Ñправа
+ </string>
+ <string name="Small">
+ Меньше
+ </string>
+ <string name="Small Hands">
+ Маленькие киÑти
+ </string>
+ <string name="Small Head">
+ ÐœÐ°Ð»ÐµÐ½ÑŒÐºÐ°Ñ Ð³Ð¾Ð»Ð¾Ð²Ð°
+ </string>
+ <string name="Smooth">
+ Гладко
+ </string>
+ <string name="Smooth Hair">
+ Приглаженные
+ </string>
+ <string name="Socks Length">
+ Длина ноÑков
+ </string>
+ <string name="Soulpatch">
+ ЭÑпаньолка
+ </string>
+ <string name="Sparse">
+ Жидкие
+ </string>
+ <string name="Spiked Hair">
+ ПричеÑка «шипами»
+ </string>
+ <string name="Square">
+ Квадратный
+ </string>
+ <string name="Square Toe">
+ Квадратный ноÑок
+ </string>
+ <string name="Squash Head">
+ Голова-тыква
+ </string>
+ <string name="Stretch Head">
+ ВытÑнутоÑть головы
+ </string>
+ <string name="Sunken">
+ Впалые
+ </string>
+ <string name="Sunken Chest">
+ Ð’Ð¿Ð°Ð»Ð°Ñ Ð³Ñ€ÑƒÐ´ÑŒ
+ </string>
+ <string name="Sunken Eyes">
+ Впалые глаза
+ </string>
+ <string name="Sweep Back">
+ ЗачеÑанные назад
+ </string>
+ <string name="Sweep Forward">
+ ЗачеÑанные вперед
+ </string>
+ <string name="Tall">
+ Выше
+ </string>
+ <string name="Taper Back">
+ ÐšÐ¾Ð½ÑƒÑ Ñзади
+ </string>
+ <string name="Taper Front">
+ ÐšÐ¾Ð½ÑƒÑ Ñпереди
+ </string>
+ <string name="Thick Heels">
+ Широкий каблук
+ </string>
+ <string name="Thick Neck">
+ ТолÑÑ‚Ð°Ñ ÑˆÐµÑ
+ </string>
+ <string name="Thick Toe">
+ ТолÑтый ноÑок
+ </string>
+ <string name="Thin">
+ Тонкий
+ </string>
+ <string name="Thin Eyebrows">
+ Тонкие брови
+ </string>
+ <string name="Thin Lips">
+ Тонкие губы
+ </string>
+ <string name="Thin Nose">
+ Тонкий ноÑ
+ </string>
+ <string name="Tight Chin">
+ Тонкий подбородок
+ </string>
+ <string name="Tight Cuffs">
+ Манжеты на резинке
+ </string>
+ <string name="Tight Pants">
+ Облегающие брюки
+ </string>
+ <string name="Tight Shirt">
+ ÐžÐ±Ð»ÐµÐ³Ð°ÑŽÑ‰Ð°Ñ Ñ€ÑƒÐ±Ð°ÑˆÐºÐ°
+ </string>
+ <string name="Tight Skirt">
+ ÐžÐ±Ð»ÐµÐ³Ð°ÑŽÑ‰Ð°Ñ ÑŽÐ±ÐºÐ°
+ </string>
+ <string name="Tight Sleeves">
+ Облегающие рукава
+ </string>
+ <string name="Toe Shape">
+ Форма ноÑка
+ </string>
+ <string name="Toe Thickness">
+ Толщина ноÑка
+ </string>
+ <string name="Torso Length">
+ Длина торÑа
+ </string>
+ <string name="Torso Muscles">
+ МуÑкулиÑтоÑть торÑа
+ </string>
+ <string name="Torso Scrawny">
+ СухопароÑть торÑа
+ </string>
+ <string name="Unattached">
+ Ðе прикреплено
+ </string>
+ <string name="Uncreased">
+ Без Ñкладок
+ </string>
+ <string name="Underbite">
+ Мезиальный прикуÑ
+ </string>
+ <string name="Unnatural">
+ ÐееÑтеÑтвенный
+ </string>
+ <string name="Upper Bridge">
+ ПереноÑица
+ </string>
+ <string name="Upper Cheeks">
+ Щеки выше
+ </string>
+ <string name="Upper Chin Cleft">
+ Ямка на подбородке выше
+ </string>
+ <string name="Upper Eyelid Fold">
+ Складка верхнего века
+ </string>
+ <string name="Upturned">
+ Вверх
+ </string>
+ <string name="Very Red">
+ Очень краÑные
+ </string>
+ <string name="Waist Height">
+ Ð’Ñ‹Ñота талии
+ </string>
+ <string name="Well-Fed">
+ Упитанные
+ </string>
+ <string name="White Hair">
+ Белые волоÑÑ‹
+ </string>
+ <string name="Wide">
+ Широко
+ </string>
+ <string name="Wide Back">
+ Широко Ñзади
+ </string>
+ <string name="Wide Front">
+ Широкий перед
+ </string>
+ <string name="Wide Lips">
+ Широкие губы
+ </string>
+ <string name="Wild">
+ Безумный
+ </string>
+ <string name="Wrinkles">
+ Складки
+ </string>
+ <string name="LocationCtrlAddLandmarkTooltip">
+ Добавить в закладки
+ </string>
+ <string name="LocationCtrlEditLandmarkTooltip">
+ Изменить закладку
+ </string>
+ <string name="LocationCtrlInfoBtnTooltip">
+ ПоÑмотреть подробную информацию о текущем меÑте
+ </string>
+ <string name="LocationCtrlComboBtnTooltip">
+ ÐœÐ¾Ñ Ð¸ÑÑ‚Ð¾Ñ€Ð¸Ñ Ð¿Ð¾Ñещений
+ </string>
+ <string name="LocationCtrlForSaleTooltip">
+ Купить Ñту землю
+ </string>
+ <string name="LocationCtrlVoiceTooltip">
+ ГолоÑовое общение здеÑÑŒ недоÑтупно
+ </string>
+ <string name="LocationCtrlFlyTooltip">
+ Полеты запрещены
+ </string>
+ <string name="LocationCtrlPushTooltip">
+ ÐÐµÐ»ÑŒÐ·Ñ Ñ‚Ð¾Ð»ÐºÐ°Ñ‚ÑŒÑÑ
+ </string>
+ <string name="LocationCtrlBuildTooltip">
+ СтроительÑтво/выкладывание объектов не разрешено
+ </string>
+ <string name="LocationCtrlScriptsTooltip">
+ ЗапуÑкать Ñкрипты запрещено
+ </string>
+ <string name="LocationCtrlDamageTooltip">
+ Здоровье
+ </string>
+ <string name="LocationCtrlAdultIconTooltip">
+ ОблаÑть Ð´Ð»Ñ Ð²Ð·Ñ€Ð¾Ñлых
+ </string>
+ <string name="LocationCtrlModerateIconTooltip">
+ ОблаÑть умеренной дозволенноÑти
+ </string>
+ <string name="LocationCtrlGeneralIconTooltip">
+ ОблаÑть общей дозволенноÑти
+ </string>
+ <string name="LocationCtrlSeeAVsTooltip">
+ Ð’Ñе жители Ñ Ð´Ñ€ÑƒÐ³Ð¸Ñ… учаÑтков могут видеть аватары и общатьÑÑ Ð² чате
+ </string>
+ <string name="UpdaterWindowTitle">
+ Обновление [APP_NAME]
+ </string>
+ <string name="UpdaterNowUpdating">
+ ОбновлÑетÑÑ [APP_NAME]...
+ </string>
+ <string name="UpdaterNowInstalling">
+ УÑтанавливаетÑÑ [APP_NAME]...
+ </string>
+ <string name="UpdaterUpdatingDescriptive">
+ Клиент [APP_NAME] обновлÑетÑÑ Ð´Ð¾ поÑледнего выпуÑка. Это может занÑть какое-то времÑ. ПроÑвите терпение.
+ </string>
+ <string name="UpdaterProgressBarTextWithEllipses">
+ Загрузка обновлениÑ...
+ </string>
+ <string name="UpdaterProgressBarText">
+ ЗагружаетÑÑ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ðµ
+ </string>
+ <string name="UpdaterFailDownloadTitle">
+ Ðе удалоÑÑŒ загрузить обновление
+ </string>
+ <string name="UpdaterFailUpdateDescriptive">
+ При обновлении Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ [APP_NAME] возникла ошибка. Загрузите новую верÑию на Ñайте www.secondlife.com.
+ </string>
+ <string name="UpdaterFailInstallTitle">
+ Ðе удалоÑÑŒ уÑтановить обновление
+ </string>
+ <string name="UpdaterFailStartTitle">
+ Ðе удалоÑÑŒ запуÑтить клиент
+ </string>
+ <string name="ItemsComingInTooFastFrom">
+ [APP_NAME]: Из-за Ñлишком быÑтрого поÑÑ‚ÑƒÐ¿Ð»ÐµÐ½Ð¸Ñ Ñлементов Ñ [FROM_NAME] автоматичеÑкий проÑмотр отключен на [TIME] Ñ
+ </string>
+ <string name="ItemsComingInTooFast">
+ [APP_NAME]: из-за Ñлишком быÑтрого поÑÑ‚ÑƒÐ¿Ð»ÐµÐ½Ð¸Ñ Ñлементов автоматичеÑкий проÑмотр отключен на [TIME] Ñ
+ </string>
+ <string name="IM_logging_string">
+ -- Включена региÑÑ‚Ñ€Ð°Ñ†Ð¸Ñ Ñообщений IM --
+ </string>
+ <string name="IM_typing_start_string">
+ [NAME] вводит текÑÑ‚...
+ </string>
+ <string name="Unnamed">
+ (Без имени)
+ </string>
+ <string name="IM_moderated_chat_label">
+ (МодерируетÑÑ: голоÑа по умолчанию отключены)
+ </string>
+ <string name="IM_unavailable_text_label">
+ Во Ð²Ñ€ÐµÐ¼Ñ Ñтого звонка текÑтовый чат недоÑтупен.
+ </string>
+ <string name="IM_muted_text_label">
+ Ваш текÑтовый чат отключен модератором группы.
+ </string>
+ <string name="IM_default_text_label">
+ Щелкните здеÑÑŒ, чтобы Ñоздать IM-Ñообщение.
+ </string>
+ <string name="IM_to_label">
+ Кому
+ </string>
+ <string name="IM_moderator_label">
+ (Модератор)
+ </string>
+ <string name="Saved_message">
+ (Сохранено [LONG_TIMESTAMP])
+ </string>
+ <string name="answered_call">
+ Ðа ваш звонок ответили
+ </string>
+ <string name="you_started_call">
+ Ð’Ñ‹ начали голоÑовую беÑеду
+ </string>
+ <string name="you_joined_call">
+ Ð’Ñ‹ приÑоединилиÑÑŒ к голоÑовой беÑеде
+ </string>
+ <string name="name_started_call">
+ Житель [NAME] начал голоÑовую беÑеду
+ </string>
+ <string name="ringing-im">
+ ПриÑоединение к голоÑовой беÑеде...
+ </string>
+ <string name="connected-im">
+ Соединение уÑтановлено. Выберите команду «Прервать звонок», чтобы повеÑить трубку
+ </string>
+ <string name="hang_up-im">
+ ГолоÑовой звонок прерван
+ </string>
+ <string name="answering-im">
+ СоединÑетÑÑ...
+ </string>
+ <string name="conference-title">
+ Ð¡Ð¿Ð¾Ð½Ñ‚Ð°Ð½Ð½Ð°Ñ ÐºÐ¾Ð½Ñ„ÐµÑ€ÐµÐ½Ñ†Ð¸Ñ
+ </string>
+ <string name="conference-title-incoming">
+ ÐšÐ¾Ð½Ñ„ÐµÑ€ÐµÐ½Ñ†Ð¸Ñ Ñ Ð¶Ð¸Ñ‚ÐµÐ»ÐµÐ¼ [AGENT_NAME]
+ </string>
+ <string name="inventory_item_offered-im">
+ Предложено пополнить инвентарь
+ </string>
+ <string name="share_alert">
+ ПеретаÑкивайте вещи из Ð¸Ð½Ð²ÐµÐ½Ñ‚Ð°Ñ€Ñ Ñюда
+ </string>
+ <string name="no_session_message">
+ (Ð¡ÐµÐ°Ð½Ñ IM не ÑущеÑтвует)
+ </string>
+ <string name="only_user_message">
+ Вы – единÑтвенный пользователь в Ñтом ÑеанÑе.
+ </string>
+ <string name="offline_message">
+ [NAME] не в Ñети.
+ </string>
+ <string name="invite_message">
+ Ðажмите кнопку [BUTTON NAME], чтобы учаÑтвовать в Ñтом голоÑовом чате.
+ </string>
+ <string name="muted_message">
+ Ð’Ñ‹ заблокировали Ñтого жителÑ. ЕÑли отправить ему Ñообщение, блок автоматичеÑки ÑниметÑÑ.
+ </string>
+ <string name="generic">
+ Ошибка при запроÑе. Повторите попытку.
+ </string>
+ <string name="generic_request_error">
+ Ошибка при запроÑе. Повторите попытку.
+ </string>
+ <string name="insufficient_perms_error">
+ У Ð²Ð°Ñ Ð½ÐµÐ´Ð¾Ñтаточно разрешений.
+ </string>
+ <string name="session_does_not_exist_error">
+ Ð¡ÐµÐ°Ð½Ñ Ð±Ð¾Ð»ÑŒÑˆÐµ не ÑущеÑтвует
+ </string>
+ <string name="no_ability_error">
+ У Ð²Ð°Ñ Ð½ÐµÑ‚ Ñтой ÑпоÑобноÑти.
+ </string>
+ <string name="no_ability">
+ У Ð²Ð°Ñ Ð½ÐµÑ‚ Ñтой ÑпоÑобноÑти.
+ </string>
+ <string name="not_a_mod_error">
+ Вы – не модератор ÑеанÑа.
+ </string>
+ <string name="muted">
+ Модератор группы отключил Ð´Ð»Ñ Ð²Ð°Ñ Ñ‚ÐµÐºÑтовый чат.
+ </string>
+ <string name="muted_error">
+ Модератор группы отключил Ð´Ð»Ñ Ð²Ð°Ñ Ñ‚ÐµÐºÑтовый чат.
+ </string>
+ <string name="add_session_event">
+ Ðе удаетÑÑ Ð´Ð¾Ð±Ð°Ð²Ð¸Ñ‚ÑŒ пользователей в ÑÐµÐ°Ð½Ñ Ñ‡Ð°Ñ‚Ð° Ñ Ð¶Ð¸Ñ‚ÐµÐ»ÐµÐ¼ [RECIPIENT].
+ </string>
+ <string name="message">
+ Ðе удаетÑÑ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²Ð¸Ñ‚ÑŒ ваше Ñообщение в ÑÐµÐ°Ð½Ñ Ñ‡Ð°Ñ‚Ð° Ñ Ð¶Ð¸Ñ‚ÐµÐ»ÐµÐ¼ [RECIPIENT].
+ </string>
+ <string name="message_session_event">
+ Ðе удаетÑÑ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²Ð¸Ñ‚ÑŒ ваше Ñообщение в ÑÐµÐ°Ð½Ñ Ñ‡Ð°Ñ‚Ð° Ñ Ð¶Ð¸Ñ‚ÐµÐ»ÐµÐ¼ [RECIPIENT].
+ </string>
+ <string name="mute">
+ Ошибка при модерировании.
+ </string>
+ <string name="removed">
+ Ð’Ñ‹ иÑключены из группы.
+ </string>
+ <string name="removed_from_group">
+ Ð’Ñ‹ иÑключены из группы.
+ </string>
+ <string name="close_on_no_ability">
+ У Ð²Ð°Ñ Ð±Ð¾Ð»ÑŒÑˆÐµ нет возможноÑти учаÑтвовать в ÑеанÑе чата.
+ </string>
+ <string name="unread_chat_single">
+ [SOURCES] Ñказал что-то новое
+ </string>
+ <string name="unread_chat_multiple">
+ [SOURCES] Ñказал что-то новое
+ </string>
+ <string name="session_initialization_timed_out_error">
+ ИÑтекло Ð²Ñ€ÐµÐ¼Ñ Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ñ Ð¸Ð½Ð¸Ñ†Ð¸Ð°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ð¸ ÑеанÑа
+ </string>
+ <string name="Home position set.">
+ Задано положение дома.
+ </string>
+ <string name="voice_morphing_url">
+ http://secondlife.com/landing/voicemorphing
+ </string>
+ <string name="paid_you_ldollars">
+ Житель [NAME] заплатил вам L$[AMOUNT] за [REASON].
+ </string>
+ <string name="paid_you_ldollars_no_reason">
+ Житель [NAME] заплатил вам L$[AMOUNT].
+ </string>
+ <string name="you_paid_ldollars">
+ Вы заплатили жителю [NAME] L$[AMOUNT] за [REASON].
+ </string>
+ <string name="you_paid_ldollars_no_info">
+ Вы заплатили L$[AMOUNT].
+ </string>
+ <string name="you_paid_ldollars_no_reason">
+ Вы заплатили жителю [NAME] L$[AMOUNT].
+ </string>
+ <string name="you_paid_ldollars_no_name">
+ Вы заплатили L$[AMOUNT] за [REASON].
+ </string>
+ <string name="you_paid_failure_ldollars">
+ Ð’Ñ‹ не Ñмогли заплатить пользователю [NAME] L$[AMOUNT]: [REASON].
+ </string>
+ <string name="you_paid_failure_ldollars_no_info">
+ Ð’Ñ‹ не Ñмогли заплатить L$[AMOUNT]
+ </string>
+ <string name="you_paid_failure_ldollars_no_reason">
+ Ð’Ñ‹ не Ñмогли заплатить пользователю [NAME] L$[AMOUNT]
+ </string>
+ <string name="you_paid_failure_ldollars_no_name">
+ Ð’Ñ‹ не Ñмогли заплатить L$[AMOUNT]: [REASON].
+ </string>
+ <string name="for item">
+ за [ITEM]
+ </string>
+ <string name="for a parcel of land">
+ за земельный учаÑток
+ </string>
+ <string name="for a land access pass">
+ за пропуÑк на землю
+ </string>
+ <string name="for deeding land">
+ за передачу земли
+ </string>
+ <string name="to create a group">
+ за Ñоздание группы
+ </string>
+ <string name="to join a group">
+ за вÑтупление в группу
+ </string>
+ <string name="to upload">
+ за передачу по Ñети
+ </string>
+ <string name="to publish a classified ad">
+ за публикацию рекламы
+ </string>
+ <string name="giving">
+ Уплата L$[AMOUNT]
+ </string>
+ <string name="uploading_costs">
+ Передача Ñтоит L$[AMOUNT]
+ </string>
+ <string name="this_costs">
+ Это Ñтоит L$[AMOUNT]
+ </string>
+ <string name="buying_selected_land">
+ Покупка выбранной земли за L$[AMOUNT]
+ </string>
+ <string name="this_object_costs">
+ Этот объект Ñтоит L$[AMOUNT]
+ </string>
+ <string name="group_role_everyone">
+ Ð’Ñе
+ </string>
+ <string name="group_role_officers">
+ ДолжноÑтные лица
+ </string>
+ <string name="group_role_owners">
+ Владельцы
+ </string>
+ <string name="group_member_status_online">
+ Ð’ Ñети
+ </string>
+ <string name="uploading_abuse_report">
+ ЗагружаетÑÑ...
+
+Жалоба
+ </string>
+ <string name="New Shape">
+ ÐÐ¾Ð²Ð°Ñ Ñ„Ð¸Ð³ÑƒÑ€Ð°
+ </string>
+ <string name="New Skin">
+ ÐÐ¾Ð²Ð°Ñ ÐºÐ¾Ð¶Ð°
+ </string>
+ <string name="New Hair">
+ Ðовые волоÑÑ‹
+ </string>
+ <string name="New Eyes">
+ Ðовые глаза
+ </string>
+ <string name="New Shirt">
+ ÐÐ¾Ð²Ð°Ñ Ñ€ÑƒÐ±Ð°ÑˆÐºÐ°
+ </string>
+ <string name="New Pants">
+ Ðовые брюки
+ </string>
+ <string name="New Shoes">
+ ÐÐ¾Ð²Ð°Ñ Ð¾Ð±ÑƒÐ²ÑŒ
+ </string>
+ <string name="New Socks">
+ Ðовые ноÑки
+ </string>
+ <string name="New Jacket">
+ Ðовый пиджак
+ </string>
+ <string name="New Gloves">
+ Ðовые перчатки
+ </string>
+ <string name="New Undershirt">
+ ÐÐ¾Ð²Ð°Ñ Ð¼Ð°Ð¹ÐºÐ°
+ </string>
+ <string name="New Underpants">
+ Ðовые труÑÑ‹
+ </string>
+ <string name="New Skirt">
+ ÐÐ¾Ð²Ð°Ñ ÑŽÐ±ÐºÐ°
+ </string>
+ <string name="New Alpha">
+ ÐÐ¾Ð²Ð°Ñ Ð°Ð»ÑŒÑ„Ð°-маÑка
+ </string>
+ <string name="New Tattoo">
+ Ðовое тату
+ </string>
+ <string name="New Physics">
+ ÐÐ¾Ð²Ð°Ñ Ñ„Ð¸Ð·Ð¸ÐºÐ°
+ </string>
+ <string name="Invalid Wearable">
+ ÐÐµÐ»ÑŒÐ·Ñ Ð½Ð¾Ñить
+ </string>
+ <string name="New Gesture">
+ Ðовый жеÑÑ‚
+ </string>
+ <string name="New Script">
+ Ðовый Ñкрипт
+ </string>
+ <string name="New Note">
+ ÐÐ¾Ð²Ð°Ñ Ð·Ð°Ð¼ÐµÑ‚ÐºÐ°
+ </string>
+ <string name="New Folder">
+ ÐÐ¾Ð²Ð°Ñ Ð¿Ð°Ð¿ÐºÐ°
+ </string>
+ <string name="Contents">
+ Контент
+ </string>
+ <string name="Gesture">
+ ЖеÑÑ‚
+ </string>
+ <string name="Male Gestures">
+ МужÑкие жеÑты
+ </string>
+ <string name="Female Gestures">
+ ЖенÑкие жеÑты
+ </string>
+ <string name="Other Gestures">
+ Прочие жеÑты
+ </string>
+ <string name="Speech Gestures">
+ ЖеÑты в разговорах
+ </string>
+ <string name="Common Gestures">
+ Стандартные жеÑты
+ </string>
+ <string name="Male - Excuse me">
+ Мужчина – извинение
+ </string>
+ <string name="Male - Get lost">
+ Мужчина – ÑкройтеÑÑŒ
+ </string>
+ <string name="Male - Blow kiss">
+ Мужчина – воздушный поцелуй
+ </string>
+ <string name="Male - Boo">
+ Мужчина – фу!
+ </string>
+ <string name="Male - Bored">
+ Мужчина – Ñкука
+ </string>
+ <string name="Male - Hey">
+ Мужчина – Ñй!
+ </string>
+ <string name="Male - Laugh">
+ Мужчина – Ñмех
+ </string>
+ <string name="Male - Repulsed">
+ Мужчина – неприÑтие
+ </string>
+ <string name="Male - Shrug">
+ Мужчина – пожимает плечами
+ </string>
+ <string name="Male - Stick tougue out">
+ Мужчина – показывает Ñзык
+ </string>
+ <string name="Male - Wow">
+ Мужчина – ух ты!
+ </string>
+ <string name="Female - Chuckle">
+ Женщина – Ñмешок
+ </string>
+ <string name="Female - Cry">
+ Женщина – плач
+ </string>
+ <string name="Female - Embarrassed">
+ Женщина – Ñмущение
+ </string>
+ <string name="Female - Excuse me">
+ Женщина – извинение
+ </string>
+ <string name="Female - Get lost">
+ Женщина – ÑкройтеÑÑŒ
+ </string>
+ <string name="Female - Blow kiss">
+ Женщина – воздушный поцелуй
+ </string>
+ <string name="Female - Boo">
+ Женщина – фу!
+ </string>
+ <string name="Female - Bored">
+ Женщина – Ñкука
+ </string>
+ <string name="Female - Hey">
+ Женщина – Ñй!
+ </string>
+ <string name="Female - Hey baby">
+ Женщина – Ñй, бейби!
+ </string>
+ <string name="Female - Laugh">
+ Женщина – Ñмех
+ </string>
+ <string name="Female - Looking good">
+ Женщина – хорошо выглÑдишь
+ </string>
+ <string name="Female - Over here">
+ Женщина – Ñюда!
+ </string>
+ <string name="Female - Please">
+ Женщина – проÑьба
+ </string>
+ <string name="Female - Repulsed">
+ Женщина – неприÑтие
+ </string>
+ <string name="Female - Shrug">
+ Женщина – пожимает плечами
+ </string>
+ <string name="Female - Stick tougue out">
+ Женщина – показывает Ñзык
+ </string>
+ <string name="Female - Wow">
+ Женщина – ух ты!
+ </string>
+ <string name="/bow">
+ /поклонитьÑÑ
+ </string>
+ <string name="/clap">
+ /хлопнуть
+ </string>
+ <string name="/count">
+ /Ñчет
+ </string>
+ <string name="/extinguish">
+ /затушить
+ </string>
+ <string name="/kmb">
+ /поцелуй Ð¼ÐµÐ½Ñ Ð² зад
+ </string>
+ <string name="/muscle">
+ /Ñилач
+ </string>
+ <string name="/no">
+ /нет
+ </string>
+ <string name="/no!">
+ /нет!
+ </string>
+ <string name="/paper">
+ /бумага
+ </string>
+ <string name="/pointme">
+ /показать на ÑебÑ
+ </string>
+ <string name="/pointyou">
+ /показать на другого
+ </string>
+ <string name="/rock">
+ /камень
+ </string>
+ <string name="/scissor">
+ /ножницы
+ </string>
+ <string name="/smoke">
+ /курить
+ </string>
+ <string name="/stretch">
+ /потÑнутьÑÑ
+ </string>
+ <string name="/whistle">
+ /ÑвиÑтнуть
+ </string>
+ <string name="/yes">
+ /да
+ </string>
+ <string name="/yes!">
+ /о да!
+ </string>
+ <string name="afk">
+ отошел
+ </string>
+ <string name="dance1">
+ танец1
+ </string>
+ <string name="dance2">
+ танец2
+ </string>
+ <string name="dance3">
+ танец3
+ </string>
+ <string name="dance4">
+ танец4
+ </string>
+ <string name="dance5">
+ танец5
+ </string>
+ <string name="dance6">
+ танец6
+ </string>
+ <string name="dance7">
+ танец7
+ </string>
+ <string name="dance8">
+ танец8
+ </string>
+ <string name="AvatarBirthDateFormat">
+ [day,datetime,slt].[mthnum,datetime,slt].[year,datetime,slt]
+ </string>
+ <string name="DefaultMimeType">
+ нет/нет
+ </string>
+ <string name="texture_load_dimensions_error">
+ ÐÐµÐ»ÑŒÐ·Ñ Ð·Ð°Ð³Ñ€ÑƒÐ¶Ð°Ñ‚ÑŒ изображениÑ, размер которых превышает [WIDTH]*[HEIGHT]
+ </string>
+ <string name="words_separator" value=","/>
+ <string name="server_is_down">
+ ÐеÑÐ¼Ð¾Ñ‚Ñ€Ñ Ð½Ð° наши уÑилиÑ, что-то неожиданно пошло не так.
+ ОзнакомьтеÑÑŒ Ñ Ð¾Ð¿Ð¸Ñанием извеÑтных проблем в работе Ñтой Ñлужбы на Ñайте status.secondlifegrid.net.
+ ЕÑли проблемы продолжаютÑÑ, то проверьте подключение к Ñети и наÑтройки брандмауÑра.
+ </string>
+ <string name="dateTimeWeekdaysNames">
+ ВоÑкреÑенье:Понедельник:Вторник:Среда:Четверг:ПÑтница:Суббота
+ </string>
+ <string name="dateTimeWeekdaysShortNames">
+ Ð’Ñ:Пн:Ð’Ñ‚:Ср:Чт:Пт:Сб
+ </string>
+ <string name="dateTimeMonthNames">
+ Январь:Февраль:Март:Ðпрель:Май:Июнь:Июль:ÐвгуÑÑ‚:СентÑбрь:ОктÑбрь:ÐоÑбрь:Декабрь
+ </string>
+ <string name="dateTimeMonthShortNames">
+ Янв:Фев:Мар:Ðпр:Май:Июн:Июл:Ðвг:Сен:Окт:ÐоÑ:Дек
+ </string>
+ <string name="dateTimeDayFormat">
+ [MDAY]
+ </string>
+ <string name="dateTimeAM">
+ до полуднÑ
+ </string>
+ <string name="dateTimePM">
+ поÑле полуднÑ
+ </string>
+ <string name="LocalEstimateUSD">
+ [AMOUNT] US$
+ </string>
+ <string name="Membership">
+ ЧленÑтво
+ </string>
+ <string name="Roles">
+ Роли
+ </string>
+ <string name="Group Identity">
+ УдоÑтоверение группы
+ </string>
+ <string name="Parcel Management">
+ Управление учаÑтком
+ </string>
+ <string name="Parcel Identity">
+ УдоÑтоверение учаÑтка
+ </string>
+ <string name="Parcel Settings">
+ Параметры учаÑтка
+ </string>
+ <string name="Parcel Powers">
+ СпоÑобноÑти Ð´Ð»Ñ ÑƒÑ‡Ð°Ñтка
+ </string>
+ <string name="Parcel Access">
+ ДоÑтуп к учаÑтку
+ </string>
+ <string name="Parcel Content">
+ Содержимое на учаÑтке
+ </string>
+ <string name="Object Management">
+ Управление объектами
+ </string>
+ <string name="Accounting">
+ БухгалтериÑ
+ </string>
+ <string name="Notices">
+ УведомлениÑ
+ </string>
+ <string name="Chat">
+ Чат
+ </string>
+ <string name="DeleteItems">
+ Удалить выбранные объекты?
+ </string>
+ <string name="DeleteItem">
+ Удалить выбранный объект?
+ </string>
+ <string name="EmptyOutfitText">
+ Ð”Ð»Ñ Ñтого коÑтюма нет вещей
+ </string>
+ <string name="ExternalEditorNotSet">
+ Выберите редактор, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€ ExternalEditor.
+ </string>
+ <string name="ExternalEditorNotFound">
+ Ðе удаетÑÑ Ð½Ð°Ð¹Ñ‚Ð¸ указанный внешний редактор.
+Попробуйте взÑть путь к редактору в двойные кавычки
+(например &quot;/path to my/editor&quot; &quot;%s&quot;)
+ </string>
+ <string name="ExternalEditorCommandParseError">
+ Ошибка анализа командной Ñтроки Ð´Ð»Ñ Ð²Ð½ÐµÑˆÐ½ÐµÐ³Ð¾ редактора.
+ </string>
+ <string name="ExternalEditorFailedToRun">
+ Ðе удалоÑÑŒ запуÑтить внешний редактор.
+ </string>
+ <string name="TranslationFailed">
+ Ошибка телепортации: [REASON]
+ </string>
+ <string name="TranslationResponseParseError">
+ Ошибка при анализе ответа переводчика.
+ </string>
+ <string name="Esc">
+ ESC
+ </string>
+ <string name="Space">
+ ПРОБЕЛ
+ </string>
+ <string name="Enter">
+ ВВОД
+ </string>
+ <string name="Tab">
+ TAB
+ </string>
+ <string name="Ins">
+ INS
+ </string>
+ <string name="Del">
+ DEL
+ </string>
+ <string name="Backsp">
+ BACKSP
+ </string>
+ <string name="Shift">
+ SHIFT
+ </string>
+ <string name="Ctrl">
+ CTRL
+ </string>
+ <string name="Alt">
+ ALT
+ </string>
+ <string name="CapsLock">
+ CAPSLOCK
+ </string>
+ <string name="Left">
+ Стрелка влево
+ </string>
+ <string name="Right">
+ Стрелка вправо
+ </string>
+ <string name="Up">
+ Стрелка вверх
+ </string>
+ <string name="Down">
+ Стрелка вниз
+ </string>
+ <string name="Home">
+ HOME
+ </string>
+ <string name="End">
+ END
+ </string>
+ <string name="PgUp">
+ PgUp
+ </string>
+ <string name="PgDn">
+ PgDn
+ </string>
+ <string name="F1">
+ F1
+ </string>
+ <string name="F2">
+ F2
+ </string>
+ <string name="F3">
+ F3
+ </string>
+ <string name="F4">
+ F4
+ </string>
+ <string name="F5">
+ F5
+ </string>
+ <string name="F6">
+ F6
+ </string>
+ <string name="F7">
+ F7
+ </string>
+ <string name="F8">
+ F8
+ </string>
+ <string name="F9">
+ F9
+ </string>
+ <string name="F10">
+ F10
+ </string>
+ <string name="F11">
+ F11
+ </string>
+ <string name="F12">
+ F12
+ </string>
+ <string name="Add">
+ +
+ </string>
+ <string name="Subtract">
+ -
+ </string>
+ <string name="Multiply">
+ *
+ </string>
+ <string name="Divide">
+ /
+ </string>
+ <string name="PAD_DIVIDE">
+ PAD_DIVIDE
+ </string>
+ <string name="PAD_LEFT">
+ PAD_LEFT
+ </string>
+ <string name="PAD_RIGHT">
+ PAD_RIGHT
+ </string>
+ <string name="PAD_DOWN">
+ PAD_DOWN
+ </string>
+ <string name="PAD_UP">
+ PAD_UP
+ </string>
+ <string name="PAD_HOME">
+ PAD_HOME
+ </string>
+ <string name="PAD_END">
+ PAD_END
+ </string>
+ <string name="PAD_PGUP">
+ PAD_PGUP
+ </string>
+ <string name="PAD_PGDN">
+ PAD_PGDN
+ </string>
+ <string name="PAD_CENTER">
+ PAD_CENTER
+ </string>
+ <string name="PAD_INS">
+ PAD_INS
+ </string>
+ <string name="PAD_DEL">
+ PAD_DEL
+ </string>
+ <string name="PAD_Enter">
+ PAD_Enter
+ </string>
+ <string name="PAD_BUTTON0">
+ PAD_BUTTON0
+ </string>
+ <string name="PAD_BUTTON1">
+ PAD_BUTTON1
+ </string>
+ <string name="PAD_BUTTON2">
+ PAD_BUTTON2
+ </string>
+ <string name="PAD_BUTTON3">
+ PAD_BUTTON3
+ </string>
+ <string name="PAD_BUTTON4">
+ PAD_BUTTON4
+ </string>
+ <string name="PAD_BUTTON5">
+ PAD_BUTTON5
+ </string>
+ <string name="PAD_BUTTON6">
+ PAD_BUTTON6
+ </string>
+ <string name="PAD_BUTTON7">
+ PAD_BUTTON7
+ </string>
+ <string name="PAD_BUTTON8">
+ PAD_BUTTON8
+ </string>
+ <string name="PAD_BUTTON9">
+ PAD_BUTTON9
+ </string>
+ <string name="PAD_BUTTON10">
+ PAD_BUTTON10
+ </string>
+ <string name="PAD_BUTTON11">
+ PAD_BUTTON11
+ </string>
+ <string name="PAD_BUTTON12">
+ PAD_BUTTON12
+ </string>
+ <string name="PAD_BUTTON13">
+ PAD_BUTTON13
+ </string>
+ <string name="PAD_BUTTON14">
+ PAD_BUTTON14
+ </string>
+ <string name="PAD_BUTTON15">
+ PAD_BUTTON15
+ </string>
+ <string name="-">
+ -
+ </string>
+ <string name="=">
+ =
+ </string>
+ <string name="`">
+ `
+ </string>
+ <string name=";">
+ ;
+ </string>
+ <string name="[">
+ [
+ </string>
+ <string name="]">
+ ]
+ </string>
+ <string name="\">
+ \
+ </string>
+ <string name="0">
+ 0
+ </string>
+ <string name="1">
+ 1
+ </string>
+ <string name="2">
+ 2
+ </string>
+ <string name="3">
+ 3
+ </string>
+ <string name="4">
+ 4
+ </string>
+ <string name="5">
+ 5
+ </string>
+ <string name="6">
+ 6
+ </string>
+ <string name="7">
+ 7
+ </string>
+ <string name="8">
+ 8
+ </string>
+ <string name="9">
+ 9
+ </string>
+ <string name="A">
+ A
+ </string>
+ <string name="B">
+ B
+ </string>
+ <string name="C">
+ C
+ </string>
+ <string name="D">
+ D
+ </string>
+ <string name="E">
+ E
+ </string>
+ <string name="F">
+ F
+ </string>
+ <string name="G">
+ G
+ </string>
+ <string name="H">
+ H
+ </string>
+ <string name="I">
+ I
+ </string>
+ <string name="J">
+ J
+ </string>
+ <string name="K">
+ K
+ </string>
+ <string name="L">
+ L
+ </string>
+ <string name="M">
+ M
+ </string>
+ <string name="N">
+ N
+ </string>
+ <string name="O">
+ O
+ </string>
+ <string name="P">
+ P
+ </string>
+ <string name="Q">
+ Q
+ </string>
+ <string name="R">
+ R
+ </string>
+ <string name="S">
+ S
+ </string>
+ <string name="T">
+ T
+ </string>
+ <string name="U">
+ U
+ </string>
+ <string name="V">
+ V
+ </string>
+ <string name="W">
+ W
+ </string>
+ <string name="X">
+ X
+ </string>
+ <string name="Y">
+ Y
+ </string>
+ <string name="Z">
+ Z
+ </string>
+ <string name="BeaconParticle">
+ ПроÑмотр меток учаÑтков (Ñиние)
+ </string>
+ <string name="BeaconPhysical">
+ ПроÑмотр меток физичеÑких объектов (зеленые)
+ </string>
+ <string name="BeaconScripted">
+ ПроÑмотр меток объектов Ñо Ñкриптами (краÑные)
+ </string>
+ <string name="BeaconScriptedTouch">
+ ПроÑмотр меток объектов Ñо Ñкриптами и функцией каÑÐ°Ð½Ð¸Ñ (краÑные)
+ </string>
+ <string name="BeaconSound">
+ ПроÑмотр звуковых меток (желтые)
+ </string>
+ <string name="BeaconMedia">
+ ПроÑмотр медийных меток (белые)
+ </string>
+ <string name="ParticleHiding">
+ ЧаÑтицы Ñкрыты
+ </string>
+ <string name="Command_AboutLand_Label">
+ О земле
+ </string>
+ <string name="Command_Appearance_Label">
+ ВнешноÑть
+ </string>
+ <string name="Command_Avatar_Label">
+ Ðватар
+ </string>
+ <string name="Command_Build_Label">
+ СтроительÑтво
+ </string>
+ <string name="Command_Chat_Label">
+ Чат
+ </string>
+ <string name="Command_Compass_Label">
+ КомпаÑ
+ </string>
+ <string name="Command_Destinations_Label">
+ Пункты
+ </string>
+ <string name="Command_Gestures_Label">
+ ЖеÑты
+ </string>
+ <string name="Command_HowTo_Label">
+ ИнÑтрукции
+ </string>
+ <string name="Command_Inventory_Label">
+ Инвентарь
+ </string>
+ <string name="Command_Map_Label">
+ Карта
+ </string>
+ <string name="Command_Marketplace_Label">
+ Торговый центр
+ </string>
+ <string name="Command_MiniMap_Label">
+ Миникарта
+ </string>
+ <string name="Command_Move_Label">
+ Ходьба / бег / полет
+ </string>
+ <string name="Command_People_Label">
+ Люди
+ </string>
+ <string name="Command_Picks_Label">
+ Подборка
+ </string>
+ <string name="Command_Places_Label">
+ МеÑта
+ </string>
+ <string name="Command_Preferences_Label">
+ ÐаÑтройки
+ </string>
+ <string name="Command_Profile_Label">
+ Профиль
+ </string>
+ <string name="Command_Search_Label">
+ ПоиÑк
+ </string>
+ <string name="Command_Snapshot_Label">
+ Снимок
+ </string>
+ <string name="Command_Speak_Label">
+ Говорить
+ </string>
+ <string name="Command_View_Label">
+ Управление камерой
+ </string>
+ <string name="Command_Voice_Label">
+ ÐаÑтройки голоÑа
+ </string>
+ <string name="Command_AboutLand_Tooltip">
+ Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ поÑещаемой вами земле
+ </string>
+ <string name="Command_Appearance_Tooltip">
+ Изменить аватар
+ </string>
+ <string name="Command_Avatar_Tooltip">
+ Выбор аватара
+ </string>
+ <string name="Command_Build_Tooltip">
+ ПоÑтроение объектов и формирование ландшафта
+ </string>
+ <string name="Command_Chat_Tooltip">
+ ОбменивайтеÑÑŒ текÑтовыми репликами Ñ Ð»ÑŽÐ´ÑŒÐ¼Ð¸ вокруг ваÑ
+ </string>
+ <string name="Command_Compass_Tooltip">
+ КомпаÑ
+ </string>
+ <string name="Command_Destinations_Tooltip">
+ ИнтереÑные меÑта
+ </string>
+ <string name="Command_Gestures_Tooltip">
+ ЖеÑты Ð´Ð»Ñ Ð°Ð²Ð°Ñ‚Ð°Ñ€Ð°
+ </string>
+ <string name="Command_HowTo_Tooltip">
+ Выполнение типичных задач
+ </string>
+ <string name="Command_Inventory_Tooltip">
+ ПроÑмотр и иÑпользование вашего имущеÑтва
+ </string>
+ <string name="Command_Map_Tooltip">
+ Карта мира
+ </string>
+ <string name="Command_Marketplace_Tooltip">
+ Покупки
+ </string>
+ <string name="Command_MiniMap_Tooltip">
+ Показать людей поблизоÑти
+ </string>
+ <string name="Command_Move_Tooltip">
+ Перемещение аватара
+ </string>
+ <string name="Command_People_Tooltip">
+ ДрузьÑ, группы и люди поблизоÑти
+ </string>
+ <string name="Command_Picks_Tooltip">
+ МеÑта, которые будут показаны в вашем профиле как избранное
+ </string>
+ <string name="Command_Places_Tooltip">
+ Сохраненные вами меÑта
+ </string>
+ <string name="Command_Preferences_Tooltip">
+ ÐаÑтройки
+ </string>
+ <string name="Command_Profile_Tooltip">
+ Редактирование или проÑмотр вашего профилÑ
+ </string>
+ <string name="Command_Search_Tooltip">
+ ПоиÑк меÑÑ‚, Ñобытий, людей
+ </string>
+ <string name="Command_Snapshot_Tooltip">
+ Сделать Ñнимок
+ </string>
+ <string name="Command_Speak_Tooltip">
+ Говорите Ñ Ð»ÑŽÐ´ÑŒÐ¼Ð¸ вокруг Ð²Ð°Ñ Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ микрофона
+ </string>
+ <string name="Command_View_Tooltip">
+ Изменение угла камеры
+ </string>
+ <string name="Command_Voice_Tooltip">
+ Регулировка громкоÑти вызовов и разговоров Ñ Ð»ÑŽÐ´ÑŒÐ¼Ð¸ около ваÑ
+ </string>
+ <string name="Toolbar_Bottom_Tooltip">
+ ÑÐµÐ¹Ñ‡Ð°Ñ Ð½Ð° нижней панели инÑтрументов
+ </string>
+ <string name="Toolbar_Left_Tooltip">
+ ÑÐµÐ¹Ñ‡Ð°Ñ Ð½Ð° левой панели инÑтрументов
+ </string>
+ <string name="Toolbar_Right_Tooltip">
+ ÑÐµÐ¹Ñ‡Ð°Ñ Ð½Ð° правой панели инÑтрументов
+ </string>
+ <string name="Retain%">
+ ОÑтаток%
+ </string>
+ <string name="Detail">
+ ДетализациÑ
+ </string>
+ <string name="Better Detail">
+ Более детально
+ </string>
+ <string name="Surface">
+ ПоверхноÑть
+ </string>
+ <string name="Solid">
+ Сплошной
+ </string>
+ <string name="Wrap">
+ Оболочка
+ </string>
+ <string name="Preview">
+ Предварительный проÑмотр
+ </string>
+ <string name="Normal">
+ Ðормальный
+ </string>
+ <string name="snapshot_quality_very_low">
+ Очень низкий
+ </string>
+ <string name="snapshot_quality_low">
+ Ðизкий
+ </string>
+ <string name="snapshot_quality_medium">
+ Средний
+ </string>
+ <string name="snapshot_quality_high">
+ Ð’Ñ‹Ñокий
+ </string>
+ <string name="snapshot_quality_very_high">
+ Очень выÑокий
+ </string>
+</strings>
diff --git a/indra/newview/skins/default/xui/ru/teleport_strings.xml b/indra/newview/skins/default/xui/ru/teleport_strings.xml
new file mode 100644
index 0000000000..feff286111
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/teleport_strings.xml
@@ -0,0 +1,84 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<teleport_messages>
+ <message_set name="errors">
+ <message name="invalid_tport">
+ При запроÑе телепортации возникла проблема. Возможно, вам придетÑÑ Ð¿Ð¾Ð²Ñ‚Ð¾Ñ€Ð¸Ñ‚ÑŒ вход перед тем, как вы Ñможете телепортироватьÑÑ.
+ЕÑли данное Ñообщение повторитÑÑ, поÑетите Ñайт [SUPPORT_SITE].
+ </message>
+ <message name="invalid_region_handoff">
+ При переÑечении границы региона возникла проблема. Возможно, вам придетÑÑ Ð¿Ð¾Ð²Ñ‚Ð¾Ñ€Ð¸Ñ‚ÑŒ вход перед тем, как вы Ñможете перейти границу.
+ЕÑли данное Ñообщение повторитÑÑ, поÑетите Ñайт [SUPPORT_SITE].
+ </message>
+ <message name="blocked_tport">
+ Ð¢ÐµÐ»ÐµÐ¿Ð¾Ñ€Ñ‚Ð°Ñ†Ð¸Ñ ÑÐµÐ¹Ñ‡Ð°Ñ Ð·Ð°Ð±Ð»Ð¾ÐºÐ¸Ñ€Ð¾Ð²Ð°Ð½Ð°. Повторите попытку позже.
+ЕÑли вам вÑе равно не удаетÑÑ Ñ‚ÐµÐ»ÐµÐ¿Ð¾Ñ€Ñ‚Ð¸Ñ€Ð¾Ð²Ð°Ñ‚ÑŒÑÑ, выйдите и войдите в ÑиÑтему, чтобы уÑтранить проблему.
+ </message>
+ <message name="nolandmark_tport">
+ СиÑтеме не удалоÑÑŒ определить меÑто Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð·Ð°ÐºÐ»Ð°Ð´ÐºÐ¸.
+ </message>
+ <message name="timeout_tport">
+ СиÑтеме не удалоÑÑŒ выполнить подключение телепорта.
+Повторите попытку позже.
+ </message>
+ <message name="NoHelpIslandTP">
+ ТелепортироватьÑÑ Ð½Ð°Ð·Ð°Ð´ на ОÑтров Ð¿Ñ€Ð¸Ð±Ñ‹Ñ‚Ð¸Ñ Ð½ÐµÐ»ÑŒÐ·Ñ.
+Ð”Ð»Ñ Ð¿Ð¾Ð²Ñ‚Ð¾Ñ€ÐµÐ½Ð¸Ñ ÑƒÑ‡ÐµÐ±Ð½Ð¸ÐºÐ° перейдите на «ОÑтров Ð¿Ñ€Ð¸Ð±Ñ‹Ñ‚Ð¸Ñ - общий».
+ </message>
+ <message name="noaccess_tport">
+ У Ð²Ð°Ñ Ð½ÐµÑ‚ доÑтупа к точке Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ñтого телепорта.
+ </message>
+ <message name="missing_attach_tport">
+ Ваши приÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ ÐµÑ‰Ðµ не доÑтавлены. Подождите неÑколько Ñекунд либо выйдите и войдите в программу, прежде чем повторить попытку телепортации.
+ </message>
+ <message name="too_many_uploads_tport">
+ Очередь активов в данном регионе заполнена, поÑтому ваш Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° телепортацию не будет выполнен Ñвоевременно. Повторите попытку через неÑколько минут или перейдите в менее загруженный регион.
+ </message>
+ <message name="expired_tport">
+ СиÑтеме не удалоÑÑŒ Ñвоевременно выполнить ваш Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° телепортацию. Повторите попытку через неÑколько минут.
+ </message>
+ <message name="expired_region_handoff">
+ СиÑтеме не удалоÑÑŒ Ñвоевременно выполнить ваше переÑечение границы. Повторите попытку через неÑколько минут.
+ </message>
+ <message name="no_host">
+ Ðе удалоÑÑŒ найти точку Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ñ‚ÐµÐ»ÐµÐ¿Ð¾Ñ€Ñ‚Ð°. Возможно, назначение временно недоÑтупно или уже не ÑущеÑтвует. Повторите попытку через неÑколько минут.
+ </message>
+ <message name="no_inventory_host">
+ СиÑтема Ð¸Ð½Ð²ÐµÐ½Ñ‚Ð°Ñ€Ñ ÑÐµÐ¹Ñ‡Ð°Ñ Ð½ÐµÐ´Ð¾Ñтупна.
+ </message>
+ </message_set>
+ <message_set name="progress">
+ <message name="sending_dest">
+ Отправка по назначению.
+ </message>
+ <message name="redirecting">
+ Перенаправление в другое меÑто.
+ </message>
+ <message name="relaying">
+ Перенаправление по назначению.
+ </message>
+ <message name="sending_home">
+ Отправка запроÑа домашнего меÑтоположениÑ.
+ </message>
+ <message name="sending_landmark">
+ Отправка запроÑа меÑÑ‚Ð¾Ð¿Ð¾Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð·Ð°ÐºÐ»Ð°Ð´ÐºÐ¸.
+ </message>
+ <message name="completing">
+ Выполнение телепортации.
+ </message>
+ <message name="completed_from">
+ Выполнена Ñ‚ÐµÐ»ÐµÐ¿Ð¾Ñ€Ð°Ñ‚Ñ†Ð¸Ñ Ð¸Ð· [T_SLURL]
+ </message>
+ <message name="resolving">
+ Определение назначениÑ.
+ </message>
+ <message name="contacting">
+ Соединение Ñ Ð½Ð¾Ð²Ñ‹Ð¼ регионом.
+ </message>
+ <message name="arriving">
+ Прибытие…
+ </message>
+ <message name="requesting">
+ Ð—Ð°Ð¿Ñ€Ð¾Ñ Ñ‚ÐµÐ»ÐµÐ¿Ð¾Ñ€Ñ‚Ð°Ñ†Ð¸Ð¸â€¦
+ </message>
+ </message_set>
+</teleport_messages>
diff --git a/indra/newview/skins/default/xui/tr/floater_aaa.xml b/indra/newview/skins/default/xui/tr/floater_aaa.xml
new file mode 100644
index 0000000000..d663ec1a5b
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_aaa.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Test Floater" title="TEST GEZDİRİCİSİ">
+ <string name="test_the_vlt">
+ Bu CHANGE2 dizesi ayıklandı.
+ </string>
+ <string name="testing_eli">
+ Sadece test amaçlı. değişiklikler.
+ </string>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_about.xml b/indra/newview/skins/default/xui/tr/floater_about.xml
new file mode 100644
index 0000000000..8fa12ea759
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_about.xml
@@ -0,0 +1,98 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_about" title="[CAPITALIZED_APP_NAME] HAKKINDA">
+ <floater.string name="AboutHeader">
+ [APP_NAME] [VIEWER_VERSION_0].[VIEWER_VERSION_1].[VIEWER_VERSION_2] ([VIEWER_VERSION_3]) [BUILD_DATE] [BUILD_TIME] ([CHANNEL])
+[[VIEWER_RELEASE_NOTES_URL] [Sürüm Notları]]
+ </floater.string>
+ <floater.string name="AboutCompiler">
+ [COMPILER] [COMPILER_VERSION] sürümü ile oluşturuldu
+ </floater.string>
+ <floater.string name="AboutPosition">
+ &lt;nolink&gt;[HOSTNAME]&lt;/nolink&gt; ([HOSTIP]) üzerinde bulunan [REGION] içerisinde [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1] konumundasınız
+[SERVER_VERSION]
+[SERVER_RELEASE_NOTES_URL]
+ </floater.string>
+ <floater.string name="AboutSystem">
+ CPU: [CPU]
+Bellek: [MEMORY_MB] MB
+İşl. Sis. Sürümü: [OS_VERSION]
+Grafik Kartı Üreticisi: [GRAPHICS_CARD_VENDOR]
+Grafik Kartı: [GRAPHICS_CARD]
+ </floater.string>
+ <floater.string name="AboutDriver">
+ Windows Grafik Sürücüsü Sürümü: [GRAPHICS_DRIVER_VERSION]
+ </floater.string>
+ <floater.string name="AboutLibs">
+ OpenGL Sürümü: [OPENGL_VERSION]
+
+libcurl Sürümü: [LIBCURL_VERSION]
+J2C Kod Çözücü Sürümü: [J2C_VERSION]
+Ses Sürücüsü Sürümü: [AUDIO_DRIVER_VERSION]
+Qt Web Kit Sürümü: [QT_WEBKIT_VERSION]
+Ses Sunucusu Sürümü: [VOICE_VERSION]
+ </floater.string>
+ <floater.string name="none">
+ (hiçbiri)
+ </floater.string>
+ <floater.string name="AboutTraffic">
+ Kaybolan Paketler: [PACKETS_LOST,number,0]/[PACKETS_IN,number,0] ([PACKETS_PCT,number,1]%)
+ </floater.string>
+ <floater.string name="ErrorFetchingServerReleaseNotesURL">
+ Sunucu sürümü notları URL&apos;si alınırken hata oluştu.
+ </floater.string>
+ <tab_container name="about_tab">
+ <panel label="Bilgi" name="support_panel">
+ <button label="Panoya Kopyala" name="copy_btn"/>
+ </panel>
+ <panel label="Katkıda Bulunanlar" name="credits_panel">
+ <text name="linden_intro">
+ Second Life, Linden&apos;lar tarafından geliştirilmiştir:
+ </text>
+ <text name="contrib_intro">
+ Açık kaynak kod katkısında bulunanlar:
+ </text>
+ <text_editor name="contrib_names">
+ Geçici Ad çalıştırma sırasında değiştirilir
+ </text_editor>
+ <text name="trans_intro">
+ Çevirileri yapanlar:
+ </text>
+ <text_editor name="trans_names">
+ Geçici Ad çalıştırma sırasında değiştirilir
+ </text_editor>
+ </panel>
+ <panel label="Lisanslar" name="licenses_panel">
+ <text_editor name="credits_editor">
+ 3Dconnexion SDK Telif Hakkı (C) 1992-2007 3Dconnexion
+ APR Telif Hakkı (C) 2000-2004 The Apache Software Foundation
+ Collada DOM Telif Hakkı 2005 Sony Computer Entertainment Inc.
+ cURL Telif Hakkı (C) 1996-2002, Daniel Stenberg, (daniel@haxx.se)
+ DBus/dbus-glib Telif Hakkı (C) 2002, 2003 CodeFactory AB / Telif Hakkı (C) 2003, 2004 Red Hat, Inc.
+ expat Telif Hakkı (C) 1998, 1999, 2000 Thai Open Source Software Center Ltd.
+ FreeType Telif Hakkı (C) 1996-2002, The FreeType Project (www.freetype.org).
+ GL Telif Hakkı (C) 1999-2004 Brian Paul.
+ GLOD Telif Hakkı (C) 2003-04 Jonathan Cohen, Nat Duca, Chris Niski, Johns Hopkins University ve David Luebke, Brenden Schubert, University of Virginia.
+ google-perftools Telif Hakkı (c) 2005, Google Inc.
+ Havok.com(TM) Telif Hakkı (C) 1999-2001, Telekinesys Research Limited.
+ jpeg2000 Telif Hakkı (C) 2001, David Taubman, The University of New South Wales (UNSW)
+ jpeglib Telif Hakkı (C) 1991-1998, Thomas G. Lane.
+ ogg/vorbis Telif Hakkı (C) 2001, Xiphophorus
+ OpenSSL Telif Hakkı (C) 1998-2002 The OpenSSL Project.
+ PCRE Telif Hakkı (c) 1997-2008 University of Cambridge
+ SDL Telif Hakkı (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga
+ SSLeay Telif Hakkı (C) 1995-1998 Eric Young (eay@cryptsoft.com)
+ xmlrpc-epi Telif Hakkı (C) 2000 Epinions, Inc.
+ zlib Telif Hakkı (C) 1995-2002 Jean-loup Gailly ve Mark Adler.
+ google-perftools Telif Hakkı (c) 2005, Google Inc.
+
+ Second Life Görüntüleyicisi Havok (TM) Fizik motorunu kullanmaktadır. (c)Telif Hakkı 1999-2010 Havok.com Inc. (ve Lisans Verenleri). Tüm Hakları Saklıdır. Ayrıntılı bilgi için bkz. www.havok.com
+
+ Bu yazılımda NVIDIA Corporation tarafından sağlanan kaynak kod yer almaktadır.
+
+ Tüm hakları saklıdır. Ayrıntılı bilgi için bkz. licenses.txt
+
+ Sesli sohbet için Ses kodlaması: Polycom(R) Siren14(TM) (ITU-T Rec. G.722.1 Annex C)
+ </text_editor>
+ </panel>
+ </tab_container>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_about_land.xml b/indra/newview/skins/default/xui/tr/floater_about_land.xml
new file mode 100644
index 0000000000..dde658d64d
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_about_land.xml
@@ -0,0 +1,489 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floaterland" title="ARAZİ HAKKINDA">
+ <floater.string name="maturity_icon_general">
+ &quot;Parcel_PG_Dark&quot;
+ </floater.string>
+ <floater.string name="maturity_icon_moderate">
+ &quot;Parcel_M_Dark&quot;
+ </floater.string>
+ <floater.string name="maturity_icon_adult">
+ &quot;Parcel_R_Dark&quot;
+ </floater.string>
+ <floater.string name="Minutes">
+ [MINUTES] dakika
+ </floater.string>
+ <floater.string name="Minute">
+ dakika
+ </floater.string>
+ <floater.string name="Seconds">
+ [SECONDS] saniye
+ </floater.string>
+ <floater.string name="Remaining">
+ kaldı
+ </floater.string>
+ <tab_container name="landtab">
+ <panel label="GENEL" name="land_general_panel">
+ <panel.string name="new users only">
+ Sadece Yeni Sakinler
+ </panel.string>
+ <panel.string name="anyone">
+ Herkes
+ </panel.string>
+ <panel.string name="area_text">
+ Alan
+ </panel.string>
+ <panel.string name="area_size_text">
+ [AREA] m²
+ </panel.string>
+ <panel.string name="auction_id_text">
+ İhale Kimlik: [ID]
+ </panel.string>
+ <panel.string name="need_tier_to_modify">
+ Bu arazide değişiklik yapmak için satın alımınızı onaylamanız gerekir.
+ </panel.string>
+ <panel.string name="group_owned_text">
+ (Sahibi Olunan Grup)
+ </panel.string>
+ <panel.string name="profile_text">
+ Profil
+ </panel.string>
+ <panel.string name="info_text">
+ Bilgi
+ </panel.string>
+ <panel.string name="public_text">
+ (kamuya açık)
+ </panel.string>
+ <panel.string name="none_text">
+ (hiçbiri)
+ </panel.string>
+ <panel.string name="sale_pending_text">
+ (Satış Bekliyor)
+ </panel.string>
+ <panel.string name="no_selection_text">
+ Seçili parsel yok.
+ </panel.string>
+ <panel.string name="time_stamp_template">
+ [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]
+ </panel.string>
+ <text name="Name:">
+ Ad:
+ </text>
+ <text name="Description:">
+ Açıklama:
+ </text>
+ <text name="LandType">
+ Tür:
+ </text>
+ <text name="LandTypeText">
+ Anakara / Banliyö
+ </text>
+ <text name="ContentRating">
+ Seviye:
+ </text>
+ <text name="ContentRatingText">
+ YetiÅŸkin
+ </text>
+ <text name="Owner:">
+ Sahip:
+ </text>
+ <text name="Group:">
+ Grup:
+ </text>
+ <button label="Ayarla" name="Set..."/>
+ <check_box label="Gruba Devretmeye İzin Ver" name="check deed" tool_tip="Bir gurup görevlisi bu araziyi gruba devredebilir, bu nedenle grubun arazi tahsisiyle desteklenecektir."/>
+ <button label="Devret" name="Deed..." tool_tip="Sadece eğer seçilen grupta bir görevliyseniz arazi devredebilirsiniz."/>
+ <check_box label="Sahip Devirle Katkıda Bulunur" name="check contrib" tool_tip="Arazi gruba devredildiği zaman önceki sahip bunu desteklemek için yeterli miktarda arazi tahsisiyle katkıda bulunur."/>
+ <text name="For Sale:">
+ Satılık:
+ </text>
+ <text name="Not for sale.">
+ Satılık değil
+ </text>
+ <text name="For Sale: Price L$[PRICE].">
+ Fiyat: L$[PRICE] (L$[PRICE_PER_SQM]/m²)
+ </text>
+ <button label="Araziyi Sat" name="Sell Land..."/>
+ <text name="For sale to">
+ Şu Alıcıya Satılık: [BUYER]
+ </text>
+ <text name="Sell with landowners objects in parcel.">
+ Nesneler satışa dahildir
+ </text>
+ <text name="Selling with no objects in parcel.">
+ Nesneler satışa dahil değildir
+ </text>
+ <button label="Arazi Satışını İptal Et" label_selected="Arazi Satışını İptal Et" name="Cancel Land Sale"/>
+ <text name="Claimed:">
+ Alındı:
+ </text>
+ <text name="DateClaimText">
+ 15 Ağustos Salı 13:47:25 2006
+ </text>
+ <text name="PriceLabel">
+ Alan:
+ </text>
+ <text name="PriceText">
+ 4048 m²
+ </text>
+ <text name="Traffic:">
+ Trafik:
+ </text>
+ <text name="DwellText">
+ Yükleniyor...
+ </text>
+ <button label="Arazi Satın Al" name="Buy Land..."/>
+ <button label="Linden Satışı" name="Linden Sale..." tool_tip="Arazinin sahip olunması, içeriğinin ayarlanması ve ihaleye çıkmamış olması gerekir"/>
+ <button label="Komut Dosyası Bilgileri" name="Scripts..."/>
+ <button label="Grup İçin Satın Al" name="Buy For Group..."/>
+ <button label="Geçiş Hakkı Satın Al" name="Buy Pass..." tool_tip="Geçiş hakkı bu araziye geçici erişiminizi sağlar."/>
+ <button label="Araziyi Terket" name="Abandon Land..."/>
+ <button label="Araziyi Geri Kazan" name="Reclaim Land..."/>
+ </panel>
+ <panel label="SÖZLEŞME" name="land_covenant_panel">
+ <panel.string name="can_resell">
+ Bu bölgede satın alınan arazi tekrar satılabilir.
+ </panel.string>
+ <panel.string name="can_not_resell">
+ Bu bölgede satın alınan arazi tekrar satılamayabilir.
+ </panel.string>
+ <panel.string name="can_change">
+ Bu bölgede satın alınan arazi birleştirilebilir veya bölünebilir.
+ </panel.string>
+ <panel.string name="can_not_change">
+ Bu bölgede satın alınan arazi birleştirilemeyebilir veya bölünemeyebilir.
+ </panel.string>
+ <text name="estate_section_lbl">
+ Gayrimenkul:
+ </text>
+ <text name="estate_name_text">
+ anakara
+ </text>
+ <text name="estate_owner_lbl">
+ Sahip:
+ </text>
+ <text name="estate_owner_text">
+ (hiçbiri)
+ </text>
+ <text_editor name="covenant_editor">
+ Bu Gayrimenkul için Sözleşmesi yok.
+ </text_editor>
+ <text name="covenant_timestamp_text">
+ Son Değiştirme: 31 Ara, Çar 16:00:00 1969
+ </text>
+ <text name="region_section_lbl">
+ Bölge:
+ </text>
+ <text name="region_name_text">
+ EricaVille
+ </text>
+ <text name="region_landtype_lbl">
+ Tür:
+ </text>
+ <text name="region_landtype_text">
+ Anakara / Banliyö
+ </text>
+ <text name="region_maturity_lbl">
+ Seviye:
+ </text>
+ <text name="region_maturity_text">
+ YetiÅŸkin
+ </text>
+ <text name="resellable_lbl">
+ Tekrar Satış:
+ </text>
+ <text name="resellable_clause">
+ Bu bölgedeki arazi tekrar satılamayabilir.
+ </text>
+ <text name="changeable_lbl">
+ Böl:
+ </text>
+ <text name="changeable_clause">
+ Bu bölgedeki arazi birleştirilemeyebilir/bölünemeyebilir.
+ </text>
+ </panel>
+ <panel label="NESNELER" name="land_objects_panel">
+ <panel.string name="objects_available_text">
+ [COUNT] / [MAX] ([AVAILABLE]) uygun
+ </panel.string>
+ <panel.string name="objects_deleted_text">
+ [COUNT] / [MAX] ([SİLİNDİ] silinecek)
+ </panel.string>
+ <text name="parcel_object_bonus">
+ Bölge Nesne Bonusu Faktörü: [BONUS]
+ </text>
+ <text name="Simulator primitive usage:">
+ Bölge kapasitesi:
+ </text>
+ <text name="objects_available">
+ [COUNT] / [MAX] ([AVAILABLE]) uygun
+ </text>
+ <text name="Primitives parcel supports:">
+ Parsel arazi kapasitesi:
+ </text>
+ <text name="object_contrib_text">
+ [COUNT]
+ </text>
+ <text name="Primitives on parcel:">
+ Parsel arazi etkisi:
+ </text>
+ <text name="total_objects_text">
+ [COUNT]
+ </text>
+ <text name="Owned by parcel owner:">
+ Parsel sahibinin mülkiyetinde
+ </text>
+ <text name="owner_objects_text">
+ [COUNT]
+ </text>
+ <button label="Göster" label_selected="Göster" name="ShowOwner"/>
+ <button label="İade Et" name="ReturnOwner..." tool_tip="Nesneleri sahiplerine iade et."/>
+ <text name="Set to group:">
+ Gruba ayarı:
+ </text>
+ <text name="group_objects_text">
+ [COUNT]
+ </text>
+ <button label="Göster" label_selected="Göster" name="ShowGroup"/>
+ <button label="İade Et" name="ReturnGroup..." tool_tip="Nesneleri sahiplerine iade et."/>
+ <text name="Owned by others:">
+ Başkalarının mülkiyetinde:
+ </text>
+ <text name="other_objects_text">
+ [COUNT]
+ </text>
+ <button label="Göster" label_selected="Göster" name="ShowOther"/>
+ <button label="İade Et" name="ReturnOther..." tool_tip="Nesneleri sahiplerine iade et."/>
+ <text name="Selected / sat upon:">
+ Seçilen / üzerine oturulan:
+ </text>
+ <text name="selected_objects_text">
+ [COUNT]
+ </text>
+ <text name="Autoreturn">
+ Diğer Sakinlerin nesnelerini otomatik iade (dakika, kapalı için 0):
+ </text>
+ <text name="Object Owners:">
+ Nesne Sahipleri:
+ </text>
+ <button name="Refresh List" tool_tip="Nesne Listesini Yenile"/>
+ <button label="Nesneleri İade Et" name="Return objects..."/>
+ <name_list name="owner list">
+ <name_list.columns label="Tür" name="type"/>
+ <name_list.columns label="Ad" name="name"/>
+ <name_list.columns label="Sayım" name="count"/>
+ <name_list.columns label="En son" name="mostrecent"/>
+ </name_list>
+ </panel>
+ <panel label="SEÇENEKLER" name="land_options_panel">
+ <panel.string name="search_enabled_tooltip">
+ Arama sonuçlarında bu parsel görünsün
+ </panel.string>
+ <panel.string name="search_disabled_small_tooltip">
+ Bu seçenek etkin değil, çünkü bu parselin alanı 128 m² veya daha küçük.
+Sadece büyük parseller aramada görünür.
+ </panel.string>
+ <panel.string name="search_disabled_permissions_tooltip">
+ Bu seçenek etkin değil, çünkü bu parselin seçeneklerinde değişiklik yapamazsınız.
+ </panel.string>
+ <panel.string name="mature_check_mature">
+ Orta Seviyede İçerik
+ </panel.string>
+ <panel.string name="mature_check_adult">
+ Yetişkin İçeriği
+ </panel.string>
+ <panel.string name="mature_check_mature_tooltip">
+ Parsel bilgileriniz veya içeriğiniz orta olarak değerlendiriliyor.
+ </panel.string>
+ <panel.string name="mature_check_adult_tooltip">
+ Parsel bilgileriniz veya içeriğiniz yetişkin olarak değerlendiriliyor.
+ </panel.string>
+ <panel.string name="landing_point_none">
+ (hiçbiri)
+ </panel.string>
+ <panel.string name="push_restrict_text">
+ İtme Yok
+ </panel.string>
+ <panel.string name="push_restrict_region_text">
+ İtme Yok (Bölge Geçersiz Kılma)
+ </panel.string>
+ <panel.string name="see_avs_text">
+ DiÄŸer parsellerdeki avatarlar bu
+ </panel.string>
+ <text name="allow_label">
+ Sakinlere şunun için izin ver:
+ </text>
+ <text name="allow_label0">
+ Uçma:
+ </text>
+ <check_box label="Herkes" name="check fly" tool_tip="İşaretliyse Sakinler arazinizden uçabilir. İşaretli değilse, sadece arazinize ve arazinizin üzerinde uçabilir."/>
+ <text name="allow_label2">
+ İnşa Et:
+ </text>
+ <check_box label="Herkes" name="edit objects check"/>
+ <check_box label="Grup" name="edit group objects check"/>
+ <text name="allow_label3">
+ Nesne GiriÅŸi:
+ </text>
+ <check_box label="Herkes" name="all object entry check"/>
+ <check_box label="Grup" name="group object entry check"/>
+ <text name="allow_label4">
+ Komut Dosyalarını Çalıştır:
+ </text>
+ <check_box label="Herkes" name="check other scripts"/>
+ <check_box label="Grup" name="check group scripts"/>
+ <check_box label="Güvenli (hasar yok)" name="check safe" tool_tip="İşaretliyse, araziyi Güvenli moda getirerek hasar çarpışmasını etkinsizleştirir İşaretli değilse hasar çarpışması etkinleşir."/>
+ <check_box label="İtme Yok" name="PushRestrictCheck" tool_tip="Komut dosyalarının itmesini önler Bu seçeneğin işaretlenmesi arazinizdeki bozucu davranışları önlemeye yardımcı olabilir."/>
+ <check_box label="Konumu Arama sonuçlarında göster (L$30/hafta)" name="ShowDirectoryCheck" tool_tip="Arama sonuçlarında bu parsel görünsün"/>
+ <combo_box name="land category with adult">
+ <combo_box.item label="Herh. Bir Kategori" name="item0"/>
+ <combo_box.item label="Linden Konumu" name="item1"/>
+ <combo_box.item label="YetiÅŸkin" name="item2"/>
+ <combo_box.item label="Sanat ve Kültür" name="item3"/>
+ <combo_box.item label="İş" name="item4"/>
+ <combo_box.item label="EÄŸitim" name="item5"/>
+ <combo_box.item label="Oyun" name="item6"/>
+ <combo_box.item label="UÄŸrak Mekan" name="item7"/>
+ <combo_box.item label="Yeni Gelenlere Yardım Sunan" name="item8"/>
+ <combo_box.item label="Park ve DoÄŸa" name="item9"/>
+ <combo_box.item label="YerleÅŸim" name="item10"/>
+ <combo_box.item label="Alışveriş" name="item11"/>
+ <combo_box.item label="Kiralık" name="item13"/>
+ <combo_box.item label="DiÄŸer" name="item12"/>
+ </combo_box>
+ <combo_box name="land category">
+ <combo_box.item label="Herh. Bir Kategori" name="item0"/>
+ <combo_box.item label="Linden Konumu" name="item1"/>
+ <combo_box.item label="Sanat ve Kültür" name="item3"/>
+ <combo_box.item label="İş" name="item4"/>
+ <combo_box.item label="EÄŸitim" name="item5"/>
+ <combo_box.item label="Oyun" name="item6"/>
+ <combo_box.item label="UÄŸrak Mekan" name="item7"/>
+ <combo_box.item label="Yeni Gelenlere Yardım Sunan" name="item8"/>
+ <combo_box.item label="Park ve DoÄŸa" name="item9"/>
+ <combo_box.item label="YerleÅŸim" name="item10"/>
+ <combo_box.item label="Alışveriş" name="item11"/>
+ <combo_box.item label="Kiralık" name="item13"/>
+ <combo_box.item label="DiÄŸer" name="item12"/>
+ </combo_box>
+ <check_box label="Orta Seviyede İçerik" name="MatureCheck" tool_tip=" "/>
+ <text name="Snapshot:">
+ Anlık Görüntü:
+ </text>
+ <texture_picker name="snapshot_ctrl" tool_tip="Bir resim seçmek için tıklayın"/>
+ <text name="allow_label5">
+ bu parseldeki avatarları görebilir ve onlarla sohbet edebilir
+ </text>
+ <check_box label="Avatarları Gör" name="SeeAvatarsCheck" tool_tip="Diğer parsellerdeki avatarların bu parseldeki avatarları görmesine ve onlarla sohbet etmesine, sizin de onları görüp, onlarla sohbet etmenize imkan tanır."/>
+ <text name="landing_point">
+ İniş Noktası: [LANDING]
+ </text>
+ <button label="Ayarla" label_selected="Ayarla" name="Set" tool_tip="İniş noktasını konukların geldiği yere ayarla. avatarınızın konumunu bu parselin içine ayarlar."/>
+ <button label="Temizle" label_selected="Temizle" name="Clear" tool_tip="İniş noktasını temizle"/>
+ <text name="Teleport Routing: ">
+ Işınlama Rotası:
+ </text>
+ <combo_box name="landing type" tool_tip="Işınlama Rotası -- arazinize ışınlamaları nasıl kullanacağınızı seçin">
+ <combo_box.item label="EngellenmiÅŸ" name="Blocked"/>
+ <combo_box.item label="İniş Noktası" name="LandingPoint"/>
+ <combo_box.item label="Herhangi bir yere" name="Anywhere"/>
+ </combo_box>
+ </panel>
+ <panel label="ORTAM" name="land_media_panel">
+ <text name="with media:">
+ Tür:
+ </text>
+ <combo_box name="media type" tool_tip="URL&apos;nin bir film, web sayfası, ya da başka bir ortam olup olmadığını belirtin"/>
+ <text name="at URL:">
+ Ana Sayfa:
+ </text>
+ <button label="Ayarla" name="set_media_url"/>
+ <text name="Description:">
+ Açıklama:
+ </text>
+ <line_editor name="url_description" tool_tip="Yazılar oyna/yükle düğmesinin yanında gösterilir"/>
+ <text name="Media texture:">
+ Doku DeÄŸiÅŸtir:
+ </text>
+ <texture_picker name="media texture" tool_tip="Bir resim seçmek için tıklayın"/>
+ <text name="replace_texture_help">
+ Bu dokuyu kullanan nesneler, oynat okuna bastıktan sonra filmi veya web sayfasını gösterecektir. Farklı bir doku seçmek için pul resmi seçin.
+ </text>
+ <check_box label="Otomatik ölçekle" name="media_auto_scale" tool_tip="Bu seçeneğin işaretlenmesi bu parselin içeriğini otomatik olarak ölçeklendirecektir. Biraz yavaş ve görsel açıdan kalitesi biraz düşük olabilir, ancak başka doku ölçekleme veya ayarlama gerekmeyecektir."/>
+ <text name="media_size" tool_tip="Web ortamını oluşturmak için boyutlandır, varsayılan için 0 bırak.">
+ Büyüklük:
+ </text>
+ <spinner name="media_size_width" tool_tip="Web ortamını oluşturmak için boyutlandır, varsayılan için 0 bırak."/>
+ <spinner name="media_size_height" tool_tip="Web ortamını oluşturmak için boyutlandır, varsayılan için 0 bırak."/>
+ <text name="pixels">
+ piksel
+ </text>
+ <text name="Options:">
+ Seçenklr.:
+ </text>
+ <check_box label="Döngü" name="media_loop" tool_tip="Ortamı döngüsel olarak oynat. Ortamın oynatılması bittiğinde baştan tekrar başlayacaktır."/>
+ </panel>
+ <panel label="SES" name="land_audio_panel">
+ <text name="MusicURL:">
+ Müzik URL&apos;si:
+ </text>
+ <text name="Sound:">
+ Ses:
+ </text>
+ <check_box label="Mimik ve nesne seslerini bu parselle sınırla" name="check sound local"/>
+ <text name="Avatar Sounds:">
+ Avatar Sesleri:
+ </text>
+ <check_box label="Herkes" name="all av sound check"/>
+ <check_box label="Grup" name="group av sound check"/>
+ <text name="Voice settings:">
+ Sesli:
+ </text>
+ <check_box label="Sesi EtkinleÅŸtir" name="parcel_enable_voice_channel"/>
+ <check_box label="Sesi Etkinleştir (Gayrimenkul tarafından belirlenir)" name="parcel_enable_voice_channel_is_estate_disabled"/>
+ <check_box label="Sesi bu parselle sınırla" name="parcel_enable_voice_channel_local"/>
+ </panel>
+ <panel label="ERİŞİM" name="land_access_panel">
+ <panel.string name="access_estate_defined">
+ (Gayrimenkul tarafından tanımlanır)
+ </panel.string>
+ <panel.string name="allow_public_access">
+ Kamusal Erişime İzin Ver ([MATURITY]) (Not: İşaret kaldırılırsa yasaklama çizgileri oluşur)
+ </panel.string>
+ <panel.string name="estate_override">
+ Bu seçeneklerden biri veya daha fazlası gayrimenkul düzeyinde ayarlanır
+ </panel.string>
+ <text name="Limit access to this parcel to:">
+ Bu Parsele EriÅŸim
+ </text>
+ <text name="Only Allow">
+ Erişimi şununla doğrulanan Sakinlerle Sınırla:
+ </text>
+ <check_box label="Dosyadaki ödeme bilgileri [ESTATE_PAYMENT_LIMIT]" name="limit_payment" tool_tip="Tanınmayan Sakinleri Yasakla."/>
+ <check_box label="Yaş doğrulama [ESTATE_AGE_LIMIT]" name="limit_age_verified" tool_tip="Yaşını doğrulamayan Sakinleri yasakla Daha fazla bilgi için [SUPPORT_SITE] adresini ziyaret edin."/>
+ <check_box label="Grup Erişimine İzin Ver: [GROUP]" name="GroupCheck" tool_tip="Genel sekmesinde grup ayarla."/>
+ <check_box label="Geçiş haklr. şuna sat:" name="PassCheck" tool_tip="Bu parsele geçici erişim verir"/>
+ <combo_box name="pass_combo">
+ <combo_box.item label="Herkes" name="Anyone"/>
+ <combo_box.item label="Grup" name="Group"/>
+ </combo_box>
+ <spinner label="L$ olarak Fiyat:" name="PriceSpin"/>
+ <spinner label="EriÅŸim saatleri:" name="HoursSpin"/>
+ <panel name="Allowed_layout_panel">
+ <text label="Her Zaman İzin Ver" name="AllowedText">
+ İzin Verilen Sakinler
+ </text>
+ <name_list name="AccessList" tool_tip="([LISTED] listeli, [MAX] maksimum)"/>
+ <button label="Ekle" name="add_allowed"/>
+ <button label="Kaldır" label_selected="Kaldır" name="remove_allowed"/>
+ </panel>
+ <panel name="Banned_layout_panel">
+ <text label="Yasakla" name="BanCheck">
+ Yasaklı Sakinler
+ </text>
+ <name_list name="BannedList" tool_tip="([LISTED] listeli, [MAX] maksimum)"/>
+ <button label="Ekle" name="add_banned"/>
+ <button label="Kaldır" label_selected="Kaldır" name="remove_banned"/>
+ </panel>
+ </panel>
+ </tab_container>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_activeim.xml b/indra/newview/skins/default/xui/tr/floater_activeim.xml
new file mode 100644
index 0000000000..f3f66b942f
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_activeim.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_activeim" title="ETKİN Aİ"/>
diff --git a/indra/newview/skins/default/xui/tr/floater_animation_preview.xml b/indra/newview/skins/default/xui/tr/floater_animation_preview.xml
new file mode 100644
index 0000000000..f8800c674d
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_animation_preview.xml
@@ -0,0 +1,186 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Animation Preview">
+ <floater.string name="failed_to_initialize">
+ Hareket başlatılamadı
+ </floater.string>
+ <floater.string name="anim_too_long">
+ Animasyon dosyası [LENGTH] saniye uzunluğunda.
+
+Maksimum animasyon uzunluÄŸu [LENGTH] saniye.
+ </floater.string>
+ <floater.string name="failed_file_read">
+ Animasyon dosyası okunamadı.
+
+[STATUS]
+ </floater.string>
+ <floater.string name="E_ST_OK">
+ Tamam
+ </floater.string>
+ <floater.string name="E_ST_EOF">
+ Dosyanın zamanından önce sonu.
+ </floater.string>
+ <floater.string name="E_ST_NO_CONSTRAINT">
+ Kısıtlama tanımı okunamadı.
+ </floater.string>
+ <floater.string name="E_ST_NO_FILE">
+ BVH dosyası açılamadı.
+ </floater.string>
+ <floater.string name="E_ST_NO_HIER">
+ Geçersiz HİYERARŞİ üst bilgisi.
+ </floater.string>
+ <floater.string name="E_ST_NO_JOINT">
+ KÖK veya EKLEM bulunamadı.
+ </floater.string>
+ <floater.string name="E_ST_NO_NAME">
+ EKLEM adı alınamadı.
+ </floater.string>
+ <floater.string name="E_ST_NO_OFFSET">
+ OFSET bulunamadı.
+ </floater.string>
+ <floater.string name="E_ST_NO_CHANNELS">
+ KANALLAR bulunamadı.
+ </floater.string>
+ <floater.string name="E_ST_NO_ROTATION">
+ Döndürme sırası alınamadı.
+ </floater.string>
+ <floater.string name="E_ST_NO_AXIS">
+ Döndürme ekseni alınamadı.
+ </floater.string>
+ <floater.string name="E_ST_NO_MOTION">
+ HAREKET bulunamadı.
+ </floater.string>
+ <floater.string name="E_ST_NO_FRAMES">
+ kARE SAYISI alınamadı.
+ </floater.string>
+ <floater.string name="E_ST_NO_FRAME_TIME">
+ Kare zamanı alınamadı.
+ </floater.string>
+ <floater.string name="E_ST_NO_POS">
+ Konum değerleri alınamadı.
+ </floater.string>
+ <floater.string name="E_ST_NO_ROT">
+ Döndürme değerleri alınamadı.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_FILE">
+ Çeviri dosyası açılamadı.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_HEADER">
+ Çeviri üst bilgisi okunamadı.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_NAME">
+ Çeviri adları okunamadı.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_IGNORE">
+ Çeviri yoksay değeri okunamadı.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_RELATIVE">
+ Çeviri nisbi değeri okunamadı.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_OUTNAME">
+ Çeviri çıkış adı değeri okunamadı.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_MATRIX">
+ Çeviri matrisi okunamadı.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_MERGECHILD">
+ Birleştirme alt birim adı alınamadı.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_MERGEPARENT">
+ Birleştirme üst birim adı alınamadı.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_PRIORITY">
+ Öncelik değerleri alınamadı.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_LOOP">
+ Döngü (tekrar) değerleri alınamadı.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_EASEIN">
+ Easln (Yavaş Başlangıç) değerleri alınamadı.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_EASEOUT">
+ EaseOut (Yavaş Bitiş) değerleri alınamadı.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_HAND">
+ El şekillendirme değeri alınamadı.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_EMOTE">
+ Duygu ifadesi adı okunamadı.
+ </floater.string>
+ <floater.string name="E_ST_BAD_ROOT">
+ Yanlış kök eklem adı, &quot;kalça&quot; kullanın
+ </floater.string>
+ <text name="name_label">
+ Ad:
+ </text>
+ <text name="description_label">
+ Açıklama:
+ </text>
+ <spinner label="Öncelik" name="priority" tool_tip="Bu animasyonun diğer animasyonları geçersiz kılabileceği kontrolleri"/>
+ <check_box label="Döngü" name="loop_check" tool_tip="Bu animasyonun döngülenmesini (tekrarlanmasını) sağlar"/>
+ <spinner label="İç (%)" name="loop_in_point" tool_tip="Döngünün döndüğü animasyon noktasını belirler"/>
+ <spinner label="Dış (%)" name="loop_out_point" tool_tip="Animasyonda döngünün bittiği noktayı belirler"/>
+ <text name="hand_label">
+ El DuruÅŸu
+ </text>
+ <combo_box name="hand_pose_combo" tool_tip="Ellerin animasyon sırasında neler yaptığını kontrol eder">
+ <combo_box.item label="Yayılım" name="Spread"/>
+ <combo_box.item label="Rahat" name="Relaxed"/>
+ <combo_box.item label="Her İkisi de İşaret Ediyor" name="PointBoth"/>
+ <combo_box.item label="Yumruk" name="Fist"/>
+ <combo_box.item label="Sol Rahat" name="RelaxedLeft"/>
+ <combo_box.item label="Sol İşaret Ediyor" name="PointLeft"/>
+ <combo_box.item label="Sol Yumruk" name="FistLeft"/>
+ <combo_box.item label="SaÄŸ Rahat" name="RelaxedRight"/>
+ <combo_box.item label="Sağ İşaret Ediyor" name="PointRight"/>
+ <combo_box.item label="SaÄŸ Yumruk" name="FistRight"/>
+ <combo_box.item label="Sağı Selamlıyor" name="SaluteRight"/>
+ <combo_box.item label="Yazı Yazıyor" name="Typing"/>
+ <combo_box.item label="Sağ Barış" name="PeaceRight"/>
+ </combo_box>
+ <text name="emote_label">
+ İfade
+ </text>
+ <combo_box name="emote_combo" tool_tip="Yüzün animasyon sırasındaki ifadesini kontrol eder">
+ <item label="(Hiçbiri)" name="[None]" value=""/>
+ <item label="Aaaaah" name="Aaaaah" value="Aaaaah"/>
+ <item label="KorkmuÅŸ" name="Afraid" value="KorkmuÅŸ"/>
+ <item label="Kızgın" name="Angry" value="Kızgın"/>
+ <item label="Yaygın Gülümseyiş" name="BigSmile" value="Yaygın Gülümseyiş"/>
+ <item label="Canı Sıkılmış" name="Bored" value="Canı Sıkılmış"/>
+ <item label="AÄŸlama" name="Cry" value="AÄŸlama"/>
+ <item label="Dudak Bükme" name="Disdain" value="Dudak Bükme"/>
+ <item label="Utanmış" name="Embarrassed" value="Utanmış"/>
+ <item label="Kaş Çatma" name="Frown" value="Kaş Çatma"/>
+ <item label="Öpücük" name="Kiss" value="Öpücük"/>
+ <item label="Gülme" name="Laugh" value="Gülme"/>
+ <item label="Kahkaha" name="Plllppt" value="Kahkaha"/>
+ <item label="TiksinmiÅŸ" name="Repulsed" value="TiksinmiÅŸ"/>
+ <item label="Üzgün" name="Sad" value="Üzgün"/>
+ <item label="Omuz Silkme" name="Shrug" value="Omuz Silkme"/>
+ <item label="Gülümseme" name="Smile" value="Gülümseme"/>
+ <item label="Sürpriz" name="Surprise" value="Sürpriz"/>
+ <item label="Göz Kırpma" name="Wink" value="Göz Kırpma"/>
+ <item label="EndiÅŸelenme" name="Worry" value="EndiÅŸelenme"/>
+ </combo_box>
+ <text name="preview_label">
+ Şu sırada önizle
+ </text>
+ <combo_box name="preview_base_anim" tool_tip="Animasyon davranışınızı avatarınız genel hareketleri yaparken test etmek için bunu kullanın.">
+ <item label="Ayakta Duruyor" name="Standing" value="Ayakta Duruyor"/>
+ <item label="Yürüyor" name="Walking" value="Yürüyor"/>
+ <item label="Oturuyor" name="Sitting" value="Oturuyor"/>
+ <item label="Uçuyor" name="Flying" value="Uçuyor"/>
+ </combo_box>
+ <spinner label="Yavaş Başlangıç (saniye)" name="ease_in_time" tool_tip="Animasyonun kaynaştığı süre (saniye olarak)"/>
+ <spinner label="Yavaş Bitiş (saniye)" name="ease_out_time" tool_tip="Animasyonun ayrıştığı süre (saniye olarak)"/>
+ <button name="play_btn" tool_tip="Animasyonunu oynat"/>
+ <button name="pause_btn" tool_tip="Animasyonunu duraklat"/>
+ <button name="stop_btn" tool_tip="Animasyo oynatmayı durdur"/>
+ <text name="bad_animation_text">
+ Animasyon dosyası okunamadı.
+
+Poser 4&apos;ten aktarılan BHV dosyalarını tavsiye ederiz.
+ </text>
+ <button label="Karşıya Yükle (L$[AMOUNT])" name="ok_btn"/>
+ <button label="İptal" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_auction.xml b/indra/newview/skins/default/xui/tr/floater_auction.xml
new file mode 100644
index 0000000000..3c945a9c96
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_auction.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_auction" title="LINDEN ARAZİ SATIŞINI BAŞLAT">
+ <floater.string name="already for sale">
+ Zaten satışa çıkarılmış olan parselleri açık artırmaya sunamazsınız.
+ </floater.string>
+ <check_box initial_value="true" label="Sarı seçim çiti dahil edilsin" name="fence_check"/>
+ <button label="Anlık Görüntü" label_selected="Anlık Görüntü" name="snapshot_btn"/>
+ <button label="Herkese Sat" label_selected="Herkese Sat" name="sell_to_anyone_btn"/>
+ <button label="Ayarları Temizle" label_selected="Ayarları Temizle" name="reset_parcel_btn"/>
+ <button label="Açık Artırmayı Başlat" label_selected="Açık Artırmayı Başlat" name="start_auction_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_avatar.xml b/indra/newview/skins/default/xui/tr/floater_avatar.xml
new file mode 100644
index 0000000000..c6b14ba710
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_avatar.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Avatar" title="BİR AVATAR SEÇİN"/>
diff --git a/indra/newview/skins/default/xui/tr/floater_avatar_picker.xml b/indra/newview/skins/default/xui/tr/floater_avatar_picker.xml
new file mode 100644
index 0000000000..99c2aae5a3
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_avatar_picker.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="avatarpicker" title="SAKİNİ SEÇ">
+ <floater.string name="not_found">
+ &apos;[TEXT]&apos; bulunamadı
+ </floater.string>
+ <floater.string name="no_one_near">
+ Yakında kimse yok
+ </floater.string>
+ <floater.string name="no_results">
+ Sonuç yok
+ </floater.string>
+ <floater.string name="searching">
+ Arıyor...
+ </floater.string>
+ <string name="Select">
+ Seç
+ </string>
+ <string name="Close">
+ Kapat
+ </string>
+ <tab_container name="ResidentChooserTabs">
+ <panel label="Ara" name="SearchPanel">
+ <text name="InstructSearchResidentName">
+ Bir kişinin adının bir kısmını yazın:
+ </text>
+ <button label="Git" label_selected="Git" name="Find"/>
+ <scroll_list name="SearchResults">
+ <columns label="Ad" name="name"/>
+ <columns label="Kullanıcı Adı" name="username"/>
+ </scroll_list>
+ </panel>
+ <panel label="ArkadaÅŸlar" name="FriendsPanel">
+ <text name="InstructSelectFriend">
+ Bir kişiyi seçin:
+ </text>
+ </panel>
+ <panel label="Bana Yakın" name="NearMePanel">
+ <text name="InstructSelectResident">
+ Yakındaki bir kişiyi seçin:
+ </text>
+ <slider label="Mesafe" name="near_me_range"/>
+ <text name="meters">
+ Metre
+ </text>
+ <scroll_list name="NearMe">
+ <columns label="Ad" name="name"/>
+ <columns label="Kullanıcı Adı" name="username"/>
+ </scroll_list>
+ </panel>
+ </tab_container>
+ <button label="Tamam" label_selected="Tamam" name="ok_btn"/>
+ <button label="İptal" label_selected="İptal" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_avatar_textures.xml b/indra/newview/skins/default/xui/tr/floater_avatar_textures.xml
new file mode 100644
index 0000000000..b519cfa1a9
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_avatar_textures.xml
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="avatar_texture_debug" title="AVATAR DOKULARI">
+ <floater.string name="InvalidAvatar">
+ GEÇERSİZ AVATAR
+ </floater.string>
+ <scroll_container name="profile_scroll">
+ <panel name="scroll_content_panel">
+ <text name="label">
+ Kaydeildi
+Dokular
+ </text>
+ <text name="composite_label">
+ BirleÅŸik
+Dokular
+ </text>
+ <button label="Kimlikleri Konsole Yığ" label_selected="Yığ" name="Dump"/>
+ <panel name="scroll_content_panel">
+ <texture_picker label="Saç" name="hair-baked"/>
+ <texture_picker label="Saç" name="hair_grain"/>
+ <texture_picker label="Saç Alfası" name="hair_alpha"/>
+ <texture_picker label="BaÅŸ" name="head-baked"/>
+ <texture_picker label="Makyaj" name="head_bodypaint"/>
+ <texture_picker label="Baş Alfası" name="head_alpha"/>
+ <texture_picker label="Baş Dövmesi" name="head_tattoo"/>
+ <texture_picker label="Gözler" name="eyes-baked"/>
+ <texture_picker label="Göz" name="eyes_iris"/>
+ <texture_picker label="Göz Alfası" name="eyes_alpha"/>
+ <texture_picker label="Üst Gövde" name="upper-baked"/>
+ <texture_picker label="Üst GövdeBoya" name="upper_bodypaint"/>
+ <texture_picker label="Fanila" name="upper_undershirt"/>
+ <texture_picker label="Eldivenler" name="upper_gloves"/>
+ <texture_picker label="Gömlek" name="upper_shirt"/>
+ <texture_picker label="Üst Ceket" name="upper_jacket"/>
+ <texture_picker label="Yüksek Alfa" name="upper_alpha"/>
+ <texture_picker label="Üst Gövde Dövmesi" name="upper_tattoo"/>
+ <texture_picker label="Alt Gövde" name="lower-baked"/>
+ <texture_picker label="Alt GövdeBoya" name="lower_bodypaint"/>
+ <texture_picker label="Külot" name="lower_underpants"/>
+ <texture_picker label="Çoraplar" name="lower_socks"/>
+ <texture_picker label="Ayakkabılar" name="lower_shoes"/>
+ <texture_picker label="Pantolon" name="lower_pants"/>
+ <texture_picker label="Ceket" name="lower_jacket"/>
+ <texture_picker label="Düşük Alfa" name="lower_alpha"/>
+ <texture_picker label="Alt Gövde Dövmesi" name="lower_tattoo"/>
+ <texture_picker label="Etek" name="skirt-baked"/>
+ <texture_picker label="Etek" name="skirt"/>
+ </panel>
+ </panel>
+ </scroll_container>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_beacons.xml b/indra/newview/skins/default/xui/tr/floater_beacons.xml
new file mode 100644
index 0000000000..08ebf36be5
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_beacons.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="beacons" title="İŞARETLER">
+ <panel name="beacons_panel">
+ <text name="label_show">
+ Göster :
+ </text>
+ <check_box label="İşaretler" name="beacons"/>
+ <check_box label="Vurgulananlar" name="highlights"/>
+ <text name="beacon_width_label" tool_tip="İşaret genişliği">
+ GeniÅŸlik:
+ </text>
+ <text name="label_objects">
+ Bu nesneler için.
+ </text>
+ <check_box label="Fiziksel" name="physical"/>
+ <check_box label="Komut Dosyalı" name="scripted"/>
+ <check_box label="Sadece dokun" name="touch_only"/>
+ <check_box label="Ses kaynakları" name="sounds"/>
+ <check_box label="Parçacık kaynakları" name="particles"/>
+ <check_box label="Ortam kaynakları" name="moapbeacon"/>
+ </panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_build_options.xml b/indra/newview/skins/default/xui/tr/floater_build_options.xml
new file mode 100644
index 0000000000..5e77f6b168
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_build_options.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="build options floater" title="AĞ SEÇENEKLERİ">
+ <floater.string name="grid_screen_text">
+ Ekran
+ </floater.string>
+ <floater.string name="grid_local_text">
+ Yerel
+ </floater.string>
+ <floater.string name="grid_world_text">
+ Dünya
+ </floater.string>
+ <floater.string name="grid_reference_text">
+ Referans
+ </floater.string>
+ <floater.string name="grid_attachment_text">
+ Aksesuar
+ </floater.string>
+ <text name="grid_mode_label" tool_tip="Ağ geçirgenliği">
+ Mod
+ </text>
+ <combo_box name="combobox grid mode" tool_tip="Nesneyi konumlandırmak için ağ cetvelini seçin">
+ <combo_box.item label="Dünya ağı" name="World"/>
+ <combo_box.item label="Yerel aÄŸ" name="Local"/>
+ <combo_box.item label="Referans ağı" name="Reference"/>
+ </combo_box>
+ <spinner label="Birimler (metre)" name="GridResolution"/>
+ <spinner label="Kapsamlar (metre)" name="GridDrawSize"/>
+ <check_box label="Alt birimlere geç" name="GridSubUnit"/>
+ <check_box label="Çapraz kesitleri göster" name="GridCrossSection"/>
+ <text name="grid_opacity_label" tool_tip="Ağ geçirgenliği">
+ Geçirgenlik:
+ </text>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_bulk_perms.xml b/indra/newview/skins/default/xui/tr/floater_bulk_perms.xml
new file mode 100644
index 0000000000..1d929a2dd3
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_bulk_perms.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floaterbulkperms" title="İÇERİK İZİNLERİNİ DÜZENLE">
+ <floater.string name="nothing_to_modify_text">
+ Seçim içerisinde düzenlenebilir içerik yok.
+ </floater.string>
+ <floater.string name="status_text">
+ [NAME] üzerinde izinler ayarlanıyor
+ </floater.string>
+ <floater.string name="start_text">
+ İzin değişiklik talepleri başlatılıyor...
+ </floater.string>
+ <floater.string name="done_text">
+ İzin değişiklik talepleri sonlandırıldı.
+ </floater.string>
+ <icon name="icon_animation" tool_tip="Animasyon"/>
+ <icon name="icon_bodypart" tool_tip="Vücut Bölümleri"/>
+ <icon name="icon_clothing" tool_tip="Giysiler"/>
+ <icon name="icon_gesture" tool_tip="Mimikler"/>
+ <icon name="icon_notecard" tool_tip="Not Kartları"/>
+ <icon name="icon_object" tool_tip="Nesneler"/>
+ <icon name="icon_script" tool_tip="Komut Dosyaları"/>
+ <icon name="icon_sound" tool_tip="Sesler"/>
+ <icon name="icon_texture" tool_tip="Dokular"/>
+ <button label="√ Tümü" name="check_all"/>
+ <button label="Temizle" label_selected="Hiçbiri" name="check_none"/>
+ <text name="newperms">
+ Yeni İçerik İzinleri
+ </text>
+ <text name="GroupLabel">
+ Grup:
+ </text>
+ <check_box label="PaylaÅŸ" name="share_with_group"/>
+ <text name="AnyoneLabel">
+ Herkes:
+ </text>
+ <check_box label="Kopyala" name="everyone_copy"/>
+ <text name="NextOwnerLabel">
+ Sonraki sahip:
+ </text>
+ <check_box label="DeÄŸiÅŸtir" name="next_owner_modify"/>
+ <check_box label="Kopyala" name="next_owner_copy"/>
+ <check_box initial_value="true" label="Aktar" name="next_owner_transfer" tool_tip="Sonraki sahibi bu nesneyi verebilir veya tekrar satabilir"/>
+ <button label="Tamam" name="apply"/>
+ <button label="İptal" name="close"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_bumps.xml b/indra/newview/skins/default/xui/tr/floater_bumps.xml
new file mode 100644
index 0000000000..06ae3a2ec3
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_bumps.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_bumps" title="TOSLAMALAR, İTMELER VE VURMALAR">
+ <floater.string name="none_detected">
+ Hiçbiri tespit edilmedi
+ </floater.string>
+ <floater.string name="bump">
+ [TIME] [NAME] size tosladı
+ </floater.string>
+ <floater.string name="llpushobject">
+ [TIME] [NAME] bir komut dosyasıyla sizi itti
+ </floater.string>
+ <floater.string name="selected_object_collide">
+ [TIME] [NAME] bir nesneyle size vurdu
+ </floater.string>
+ <floater.string name="scripted_object_collide">
+ [TIME] [NAME] komut doyalı bir nesneyle size vurdu
+ </floater.string>
+ <floater.string name="physical_object_collide">
+ [TIME] [NAME] fiziki bir nesneyle size vurdu
+ </floater.string>
+ <floater.string name="timeStr">
+ [[hour,datetime,slt]:[min,datetime,slt]]
+ </floater.string>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_buy_contents.xml b/indra/newview/skins/default/xui/tr/floater_buy_contents.xml
new file mode 100644
index 0000000000..9012189ce5
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_buy_contents.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_buy_contents" title="İÇERİĞİ SATIN AL">
+ <floater.string name="no_copy_text">
+ (kopya yok)
+ </floater.string>
+ <floater.string name="no_modify_text">
+ (deÄŸiÅŸtirme yok)
+ </floater.string>
+ <floater.string name="no_transfer_text">
+ (aktarım yok)
+ </floater.string>
+ <text name="contains_text">
+ &lt;nolink&gt;[NAME]&lt;/nolink&gt; içeriği:
+ </text>
+ <text name="buy_text">
+ L$[AMOUNT] karşılığında [NAME]&apos;den satın alınsın mı?
+ </text>
+ <check_box label="Giysiyi ÅŸimdi giy" name="wear_check"/>
+ <button label="Satın Al" label_selected="Satın Al" name="buy_btn"/>
+ <button label="İptal" label_selected="İptal" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_buy_currency.xml b/indra/newview/skins/default/xui/tr/floater_buy_currency.xml
new file mode 100644
index 0000000000..d90985dcff
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_buy_currency.xml
@@ -0,0 +1,66 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="buy currency" title="L$ SATIN AL">
+ <floater.string name="buy_currency">
+ Yaklaşık [LOCALAMOUNT] karşılığında [LINDENS] L$ satın al
+ </floater.string>
+ <text name="info_need_more">
+ Daha fazla L$&apos;na ihtiyacınız var
+ </text>
+ <text name="contacting">
+ LindeX ile bağlantı kuruluyor...
+ </text>
+ <text name="info_buying">
+ L$ Satın Al
+ </text>
+ <text name="balance_label">
+ Sahip olduÄŸum miktar:
+ </text>
+ <text name="balance_amount">
+ L$ [AMT]
+ </text>
+ <text name="currency_action">
+ Satın almak istediğim miktar:
+ </text>
+ <text name="currency_label">
+ L$
+ </text>
+ <line_editor label="L$" name="currency_amt">
+ 1234
+ </line_editor>
+ <text name="buying_label">
+ Fiyatı:
+ </text>
+ <text name="currency_est">
+ yakl. [LOCALAMOUNT]
+ </text>
+ <text name="getting_data">
+ Hesaplanıyor...
+ </text>
+ <text name="buy_action">
+ [ACTION]
+ </text>
+ <text name="total_label">
+ Bakiye param ÅŸu kadar olacak:
+ </text>
+ <text name="total_amount">
+ L$ [AMT]
+ </text>
+ <text name="currency_links">
+ [http://www.secondlife.com/my/account/payment_method_management.php ödeme yöntemi] | [http://www.secondlife.com/my/account/currency.php para birimi]
+ </text>
+ <text name="exchange_rate_note">
+ En son döviz kurunu görmek için miktarı yeniden girin.
+ </text>
+ <text name="purchase_warning_repurchase">
+ Bu satın alma işlemini teyit ettiğinizde nesne değil, L$ satın alırsınız.
+ </text>
+ <text name="purchase_warning_notenough">
+ Yeterli L$ satın almıyorsunuz. Lütfen miktarı artırın.
+ </text>
+ <button label="Şimdi Satın Al" name="buy_btn"/>
+ <button label="İptal" name="cancel_btn"/>
+ <text name="info_cannot_buy">
+ Satın Alınamıyor
+ </text>
+ <button label="Web&apos;e devam et" name="error_web"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_buy_currency_html.xml b/indra/newview/skins/default/xui/tr/floater_buy_currency_html.xml
new file mode 100644
index 0000000000..98aaf50db0
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_buy_currency_html.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_buy_currency_html" title="PARA SATIN AL"/>
diff --git a/indra/newview/skins/default/xui/tr/floater_buy_land.xml b/indra/newview/skins/default/xui/tr/floater_buy_land.xml
new file mode 100644
index 0000000000..7b43af2ea4
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_buy_land.xml
@@ -0,0 +1,233 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="buy land" title="ARAZİ SATIN AL">
+ <floater.string name="can_resell">
+ Tekrar satılabilir.
+ </floater.string>
+ <floater.string name="can_not_resell">
+ Tekrar satılamaz.
+ </floater.string>
+ <floater.string name="can_change">
+ Eklenebilir veya bölünebilir.
+ </floater.string>
+ <floater.string name="can_not_change">
+ Eklenemez veya bölünemez.
+ </floater.string>
+ <floater.string name="cant_buy_for_group">
+ Etkin grubunuz adına arazi satın almak için gerekli izne sahip değilsiniz.
+ </floater.string>
+ <floater.string name="no_land_selected">
+ Seçili arazi yok.
+ </floater.string>
+ <floater.string name="multiple_parcels_selected">
+ Birden fazla farklı parsel seçildi.
+Daha küçük bir alan seçmeyi deneyin.
+ </floater.string>
+ <floater.string name="no_permission">
+ Etkin grubunuz adına arazi satın almak için gerekli izne sahip değilsiniz.
+ </floater.string>
+ <floater.string name="parcel_not_for_sale">
+ Seçilen parsel satılık değil.
+ </floater.string>
+ <floater.string name="group_already_owns">
+ Parsel zaten gruba ait.
+ </floater.string>
+ <floater.string name="you_already_own">
+ Parsel zaten size ait.
+ </floater.string>
+ <floater.string name="set_to_sell_to_other">
+ Seçilen parsel başka birisine satılmak için ayrılmış.
+ </floater.string>
+ <floater.string name="no_public_land">
+ Seçilen alanda kamu arazisi yok.
+ </floater.string>
+ <floater.string name="not_owned_by_you">
+ Başka bir Sakine ait arazi seçildi.
+Daha küçük bir alan seçmeyi deneyin.
+ </floater.string>
+ <floater.string name="processing">
+ Satın alımınız işleniyor...
+
+(Bu işlem bir iki dakika sürebilir.)
+ </floater.string>
+ <floater.string name="fetching_error">
+ Arazi alma bilgileri çekilirken hata oluştu.
+ </floater.string>
+ <floater.string name="buying_will">
+ Arazinin satın alınması sonucu:
+ </floater.string>
+ <floater.string name="buying_for_group">
+ Bu arazinin grup için satın alınması sonucu:
+ </floater.string>
+ <floater.string name="cannot_buy_now">
+ Şimdi satın alamaz:
+ </floater.string>
+ <floater.string name="not_for_sale">
+ Satılık değil:
+ </floater.string>
+ <floater.string name="none_needed">
+ hiç ihtiyaç yok
+ </floater.string>
+ <floater.string name="must_upgrade">
+ Arazi sahibi olmak için hesabınızın yükseltilmesi gerekir.
+ </floater.string>
+ <floater.string name="cant_own_land">
+ Hesabınız arazi sahibi olabilir.
+ </floater.string>
+ <floater.string name="land_holdings">
+ Elinizde [BUYER] m² arazi var.
+ </floater.string>
+ <floater.string name="pay_to_for_land">
+ Bu arazi için [SELLER]&apos;e L$[AMOUNT] ödeyin
+ </floater.string>
+ <floater.string name="buy_for_US">
+ Yaklaşık [LOCAL_AMOUNT] için L$[AMOUNT] satın al,
+ </floater.string>
+ <floater.string name="parcel_meters">
+ Bu parsel [AMOUNT] m²
+ </floater.string>
+ <floater.string name="premium_land">
+ Bu parsel primlidir ve [AMOUNT] m² olarak ücretlendirilecektir.
+ </floater.string>
+ <floater.string name="discounted_land">
+ Bu parsel indirimlidir ve [AMOUNT] m² olarak ücretlendirilecektir.
+ </floater.string>
+ <floater.string name="meters_supports_object">
+ [AMOUNT] m²
+[AMOUNT2] nesneyi destekler
+ </floater.string>
+ <floater.string name="sold_with_objects">
+ nesnelerle satılır
+ </floater.string>
+ <floater.string name="sold_without_objects">
+ nesneler dahil deÄŸildir
+ </floater.string>
+ <floater.string name="info_price_string">
+ L$[PRICE]
+(L$ [PRICE_PER_SQM]/m²)
+[SOLD_WITH_OBJECTS]
+ </floater.string>
+ <floater.string name="insufficient_land_credits">
+ [GROUP] grubu, satın almanın gerçekleşmesi için bu parselin fiyatını karşılamak amacıyla yeterli miktarda arazi kullanım kredisine ihtiyaç duyacaktır.
+ </floater.string>
+ <floater.string name="have_enough_lindens">
+ L$ [AMOUNT] sahibisiniz, bu da bu araziyi almaya yeter.
+ </floater.string>
+ <floater.string name="not_enough_lindens">
+ Sadece L$ [AMOUNT] sahibisiniz, L$ [AMOUNT2] kadar daha ihtiyacınız var.
+ </floater.string>
+ <floater.string name="balance_left">
+ Satın alımdan sonra elinizde L$ [AMOUNT] kalacak.
+ </floater.string>
+ <floater.string name="balance_needed">
+ Bu araziyi alabilmek için en az L$ [AMOUNT] almanız gerekir.
+ </floater.string>
+ <floater.string name="no_parcel_selected">
+ (seçili parsel yok)
+ </floater.string>
+ <text name="region_name_label">
+ Bölge:
+ </text>
+ <text name="region_name_text">
+ (bilinmiyor)
+ </text>
+ <text name="region_type_label">
+ Tür:
+ </text>
+ <text name="region_type_text">
+ (bilinmiyor)
+ </text>
+ <text name="estate_name_label">
+ Gayrimenkul:
+ </text>
+ <text name="estate_name_text">
+ (bilinmiyor)
+ </text>
+ <text name="estate_owner_label">
+ Gayrimenkul Sahibi:
+ </text>
+ <text name="estate_owner_text">
+ (bilinmiyor)
+ </text>
+ <text name="resellable_changeable_label">
+ Bu bölgede satın alınan arazi:
+ </text>
+ <text name="resellable_clause">
+ Tekrar satılabilir veya satılamaz.
+ </text>
+ <text name="changeable_clause">
+ Eklenebilir/bölünebilir veya eklenemez/bölünemez.
+ </text>
+ <text name="covenant_text">
+ Gayrimenkul Sözleşmesini kabul etmelisiniz:
+ </text>
+ <text_editor name="covenant_editor">
+ Yükleniyor...
+ </text_editor>
+ <check_box label="Yukarıda Tanımlanan Sözleşmeyi Kabul Ediyorum." name="agree_covenant"/>
+ <text name="info_parcel_label">
+ Parsel:
+ </text>
+ <text name="info_parcel">
+ Scotopteryx 138,204
+ </text>
+ <text name="info_size_label">
+ Büyüklük:
+ </text>
+ <text name="info_size">
+ 1.024 m²
+ </text>
+ <text name="info_price_label">
+ Fiyat:
+ </text>
+ <text name="info_price">
+ L$ 1500
+(L$ 1,1/m²)
+nesnelerle satılır
+ </text>
+ <text name="info_action">
+ Arazinin satın alınması sonucu:
+ </text>
+ <text name="error_message">
+ Bir ÅŸeyler yolunda deÄŸil.
+ </text>
+ <button label="Web sitesine git" name="error_web"/>
+ <text name="account_action">
+ Ücretli üyeliğini yükselt.
+ </text>
+ <text name="account_reason">
+ Sadece ücretli üyeler arazi sahibi olabilir.
+ </text>
+ <combo_box name="account_level">
+ <combo_box.item label="US$9,95/ay, aylık fatura edilir" name="US$9.95/month,billedmonthly"/>
+ <combo_box.item label="US$7,50/ay, üç aylık fatura edilir" name="US$7.50/month,billedquarterly"/>
+ <combo_box.item label="US$6,00/ay, yıllık fatura edilir" name="US$6.00/month,billedannually"/>
+ </combo_box>
+ <text name="land_use_action">
+ Aylık arazi kullanım ücretlerinizi US$40/aya çıkarın.
+ </text>
+ <text name="land_use_reason">
+ Elinizde 1309 m² arazi var.
+Bu parsel 512 m² arazidir.
+ </text>
+ <text name="purchase_action">
+ Arazi için Joe Sakine L$ 4000 ödeme yap
+ </text>
+ <text name="currency_reason">
+ L$ 2.100&apos;ünüz var.
+ </text>
+ <text name="currency_action">
+ İlave L$ satın al
+ </text>
+ <line_editor name="currency_amt">
+ 1000
+ </line_editor>
+ <text name="currency_est">
+ yaklaşık [LOCAL_AMOUNT] için
+ </text>
+ <text name="currency_balance">
+ L$ 2.100&apos;ünüz var.
+ </text>
+ <check_box label="[AMOUNT] m² katkıyı gruptan kaldır." name="remove_contribution"/>
+ <button label="Satın Al" name="buy_btn"/>
+ <button label="İptal" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_buy_object.xml b/indra/newview/skins/default/xui/tr/floater_buy_object.xml
new file mode 100644
index 0000000000..91ef05fb29
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_buy_object.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="contents" title="NESNENİN KOPYASINI SATIN AL">
+ <floater.string name="title_buy_text">
+ Satın Al
+ </floater.string>
+ <floater.string name="title_buy_copy_text">
+ Şunun bir kopyasını satın alın:
+ </floater.string>
+ <floater.string name="no_copy_text">
+ (kopya yok)
+ </floater.string>
+ <floater.string name="no_modify_text">
+ (deÄŸiÅŸtirme yok)
+ </floater.string>
+ <floater.string name="no_transfer_text">
+ (aktarım yok)
+ </floater.string>
+ <text name="contents_text">
+ İçeriği:
+ </text>
+ <text name="buy_text">
+ L$[AMOUNT] karşılığında şuradan satın alın:
+ </text>
+ <text name="buy_name_text">
+ [NAME]?
+ </text>
+ <button label="Satın Al" label_selected="Satın Al" name="buy_btn"/>
+ <button label="İptal" label_selected="İptal" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_camera.xml b/indra/newview/skins/default/xui/tr/floater_camera.xml
new file mode 100644
index 0000000000..22e2aa52c6
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_camera.xml
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="camera_floater" title="KAMERA DENETİMLERİ">
+ <floater.string name="rotate_tooltip">
+ Odak Etrafında Kamerayı Döndür
+ </floater.string>
+ <floater.string name="zoom_tooltip">
+ Kamerayı Odağa Yakınlaştır
+ </floater.string>
+ <floater.string name="move_tooltip">
+ Kamerayı Yukarı ve Aşağı, Sola ve Sağa Hareket Ettir
+ </floater.string>
+ <floater.string name="free_mode_title">
+ Nesneyi Göster
+ </floater.string>
+ <panel name="controls">
+ <panel name="preset_views_list">
+ <panel_camera_item name="front_view">
+ <panel_camera_item.text name="front_view_text">
+ Ön Görünüm
+ </panel_camera_item.text>
+ </panel_camera_item>
+ <panel_camera_item name="group_view">
+ <panel_camera_item.text name="side_view_text">
+ Yan Görünüm
+ </panel_camera_item.text>
+ </panel_camera_item>
+ <panel_camera_item name="rear_view">
+ <panel_camera_item.text name="rear_view_text">
+ Arkadan Görünüm
+ </panel_camera_item.text>
+ </panel_camera_item>
+ </panel>
+ <panel name="camera_modes_list">
+ <panel_camera_item name="object_view">
+ <panel_camera_item.text name="object_view_text">
+ Nesne Görünümü
+ </panel_camera_item.text>
+ </panel_camera_item>
+ <panel_camera_item name="mouselook_view">
+ <panel_camera_item.text name="mouselook_view_text">
+ Fare Üzerinden Görünüm
+ </panel_camera_item.text>
+ </panel_camera_item>
+ </panel>
+ <panel name="zoom">
+ <joystick_rotate name="cam_rotate_stick" tool_tip="Kamera odak etrafında yörüngede hareket etsin"/>
+ <slider_bar name="zoom_slider" tool_tip="Kamerayı odağa yakınlaştır"/>
+ <joystick_track name="cam_track_stick" tool_tip="Kamerayı yukarı ve aşağı, sola ve sağa hareket ettir"/>
+ </panel>
+ </panel>
+ <panel name="buttons">
+ <button label="" name="presets_btn" tool_tip="Ön Ayarlı Görünümler"/>
+ <button label="" name="pan_btn" tool_tip="Yörünge Değişimi - Yakınlaştırma - Kamerayı Çevirme"/>
+ <button label="" name="avatarview_btn" tool_tip="Kamera modları"/>
+ </panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_chat_bar.xml b/indra/newview/skins/default/xui/tr/floater_chat_bar.xml
new file mode 100644
index 0000000000..dee17b7bc4
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_chat_bar.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="chat_bar" title="YAKINDAKİ SOHBET">
+ <panel name="bottom_panel">
+ <line_editor label="Sohbet etmek için buraya tıklayın." name="chat_box" tool_tip="Söylemek için Enter, bağırmak için Ctrl+Enter yapın"/>
+ <button name="show_nearby_chat" tool_tip="yakın sohbet günlüğünü gösterir/gizler"/>
+ </panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_choose_group.xml b/indra/newview/skins/default/xui/tr/floater_choose_group.xml
new file mode 100644
index 0000000000..1bfc772f4a
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_choose_group.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="groups" title="GRUPLAR">
+ <text name="groupdesc">
+ Bir grup seç:
+ </text>
+ <button label="Tamam" label_selected="Tamam" name="OK"/>
+ <button label="İptal" label_selected="İptal" name="Cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_color_picker.xml b/indra/newview/skins/default/xui/tr/floater_color_picker.xml
new file mode 100644
index 0000000000..c9465fff83
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_color_picker.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="ColorPicker" title="RENK SEÇİCİ">
+ <text name="r_val_text">
+ Kırmızı:
+ </text>
+ <text name="g_val_text">
+ YeÅŸil:
+ </text>
+ <text name="b_val_text">
+ Mavi:
+ </text>
+ <text name="h_val_text">
+ Ton:
+ </text>
+ <text name="s_val_text">
+ Sat:
+ </text>
+ <text name="l_val_text">
+ Par:
+ </text>
+ <check_box label="Åžimdi uygula" name="apply_immediate"/>
+ <button label="Tamam" label_selected="Tamam" name="select_btn"/>
+ <button label="İptal" label_selected="İptal" name="cancel_btn"/>
+ <text name="Current color:">
+ Geçerli renk:
+ </text>
+ <text name="(Drag below to save.)">
+ (Kaydetmek için aşağıya sürükleyin)
+ </text>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_critical.xml b/indra/newview/skins/default/xui/tr/floater_critical.xml
new file mode 100644
index 0000000000..041a303bae
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_critical.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="modal container">
+ <button label="Devam Et" label_selected="Devam Et" name="Continue"/>
+ <text name="tos_heading">
+ Lütfen aşağıdaki iletiyi dikkatle okuyun.
+ </text>
+ <text_editor name="tos_text">
+ TOS_TEXT
+ </text_editor>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_delete_env_preset.xml b/indra/newview/skins/default/xui/tr/floater_delete_env_preset.xml
new file mode 100644
index 0000000000..915770f727
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_delete_env_preset.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+<floater name="Delete Env Preset" title="ORTAM ÖN AYARINI SİL">
+ <string name="title_water">
+ Su Ön Ayarını Sil
+ </string>
+ <string name="title_sky">
+ Gökyüzü Ön Ayarını Sil
+ </string>
+ <string name="title_day_cycle">
+ Gün Döngüsünü Sil
+ </string>
+ <string name="label_water">
+ Ön Ayar:
+ </string>
+ <string name="label_sky">
+ Ön Ayar:
+ </string>
+ <string name="label_day_cycle">
+ Gün döngüsü:
+ </string>
+ <string name="msg_confirm_deletion">
+ Seçili ön ayarı silmek istediğinize emin misiniz?
+ </string>
+ <string name="msg_sky_is_referenced">
+ Bazı gün döngüleri tarafından başvurulan bir ön ayar kaldırılamaz.
+ </string>
+ <string name="combo_label">
+ -Bir ön ayar seçin-
+ </string>
+ <text name="label">
+ Ön Ayar:
+ </text>
+ <button label="Sil" name="delete"/>
+ <button label="İptal" name="cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_destinations.xml b/indra/newview/skins/default/xui/tr/floater_destinations.xml
new file mode 100644
index 0000000000..4504366d63
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_destinations.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Destinations" title="HEDEF KONUMLAR"/>
diff --git a/indra/newview/skins/default/xui/tr/floater_display_name.xml b/indra/newview/skins/default/xui/tr/floater_display_name.xml
new file mode 100644
index 0000000000..e39be5a24b
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_display_name.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Display Name" title="EKRAN ADINI DEĞİŞTİR">
+ <text name="info_text">
+ Avatarınıza verdiğiniz ad, Ekran Adınız olarak değerlendirilir. Bunu haftada bir kere değiştirebilirsiniz.
+ </text>
+ <text name="lockout_text">
+ Ekran Adınızı şu saate kadar değiştiremezsiniz: [TIME].
+ </text>
+ <text name="set_name_label">
+ Yeni Ekran Adı:
+ </text>
+ <text name="name_confirm_label">
+ Onaylamak için yeni adınızı tekrar yazın:
+ </text>
+ <button label="Kaydet" name="save_btn" tool_tip="Yeni Ekran Adınızı kaydedin"/>
+ <button label="Sıfırla" name="reset_btn" tool_tip="Ekran Adını Kullanıcı Adıyla aynı yap"/>
+ <button label="İptal" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_edit_day_cycle.xml b/indra/newview/skins/default/xui/tr/floater_edit_day_cycle.xml
new file mode 100644
index 0000000000..4be1068dcc
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_edit_day_cycle.xml
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Edit Day cycle" title="Gün Döngüsünü Düzenle">
+ <string name="title_new">
+ Yeni Bir Gün Döngüsü Oluştur
+ </string>
+ <string name="title_edit">
+ Gün Döngüsünü Düzenle
+ </string>
+ <string name="hint_new">
+ Gün döngünüzü adlandırın, bunu oluşturmak için denetimleri ayarlayın ve &quot;Kaydet&quot; üzerine tıklayın.
+ </string>
+ <string name="hint_edit">
+ Gün döngünüzü düzenlemek için alttaki denetimleri ayarlayın ve &quot;Kaydet&quot; üzerine tıklayın.
+ </string>
+ <string name="combo_label">
+ -Bir ön ayar seçin-
+ </string>
+ <text name="label">
+ Ön Ayar Adı:
+ </text>
+ <text name="note">
+ Not: Ön ayarınızın adını değiştirirseniz, yeni bir ön ayar oluşturursunuz ve mevcut ön ayar değişmez.
+ </text>
+ <text name="hint_item1">
+ - Birine tıklayarak gökyüzü ayarlarını/zamanı düzenleyin.
+ </text>
+ <text name="hint_item2">
+ - Sekmelere tıklayıp sürükleyerek geçiş sürlrn. ayarlayın.
+ </text>
+ <text name="hint_item3">
+ - Gün döngünüzü önizlemek için fırçayı kullanın.
+ </text>
+ <panel name="day_cycle_slider_panel">
+ <multi_slider initial_value="0" name="WLTimeSlider"/>
+ <multi_slider initial_value="0" name="WLDayCycleKeys"/>
+ <button label="Anahtar Ekle" label_selected="Anahtar Ekle" name="WLAddKey"/>
+ <button label="Anahtarı Sil" label_selected="Anahtarı Sil" name="WLDeleteKey"/>
+ <text name="WL12am">
+ 12
+ </text>
+ <text name="WL3am">
+ 3
+ </text>
+ <text name="WL6am">
+ 6
+ </text>
+ <text name="WL9amHash">
+ 9
+ </text>
+ <text name="WL12pmHash">
+ 24
+ </text>
+ <text name="WL3pm">
+ 15
+ </text>
+ <text name="WL6pm">
+ 18
+ </text>
+ <text name="WL9pm">
+ 21
+ </text>
+ <text name="WL12am2">
+ 12
+ </text>
+ <text name="WL12amHash">
+ |
+ </text>
+ <text name="WL3amHash">
+ I
+ </text>
+ <text name="WL6amHash">
+ |
+ </text>
+ <text name="WL9amHash2">
+ I
+ </text>
+ <text name="WL12pmHash2">
+ |
+ </text>
+ <text name="WL3pmHash">
+ I
+ </text>
+ <text name="WL6pmHash">
+ |
+ </text>
+ <text name="WL9pmHash">
+ I
+ </text>
+ <text name="WL12amHash2">
+ |
+ </text>
+ </panel>
+ <text name="WLCurKeyPresetText">
+ Gökyüzü Ayarı:
+ </text>
+ <combo_box label="Ön Ayar" name="WLSkyPresets"/>
+ <text name="WLCurKeyTimeText">
+ Zaman:
+ </text>
+ <time name="time" value="6:00"/>
+ <check_box label="Bunu yeni gün döngüm yap" name="make_default_cb"/>
+ <button label="Kaydet" name="save"/>
+ <button label="İptal" name="cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_edit_sky_preset.xml b/indra/newview/skins/default/xui/tr/floater_edit_sky_preset.xml
new file mode 100644
index 0000000000..0e9f86148d
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_edit_sky_preset.xml
@@ -0,0 +1,143 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Edit Sky Preset" title="Gökyüzü Ön Ayarını Düzenle">
+ <string name="title_new">
+ Yeni Gökyüzü Ön Ayarı Oluştur
+ </string>
+ <string name="title_edit">
+ Gökyüzü Ön Ayarını Düzenle
+ </string>
+ <string name="hint_new">
+ Ön ayarınızı adlandırın, bunu oluşturmak için denetimleri ayarlayın ve &quot;Kaydet&quot; üzerine tıklayın.
+ </string>
+ <string name="hint_edit">
+ Gökyüzü ön ayarınızı düzenlemek için denetimleri ayarlayın ve &quot;Kaydet&quot; üzerine tıklayın.
+ </string>
+ <string name="combo_label">
+ -Bir ön ayar seçin-
+ </string>
+ <text name="hint">
+ Ön ayarınızı düzenlemek için denetimleri ayarlayın, sonra &quot;Kaydet&quot; üzerine tıklayın.
+ </text>
+ <text name="label">
+ Ön Ayar Adı:
+ </text>
+ <text name="note">
+ Not: Ön ayarınızın adını değiştirirseniz, yeni bir ön ayar oluşturursunuz ve mevcut ön ayar değişmez.
+ </text>
+ <tab_container name="WindLight Tabs">
+ <panel label="ATMOSFER" name="Atmosphere">
+ <text name="BHText">
+ Mavi Ufuk
+ </text>
+ <text name="BDensText">
+ Puslu Ufuk
+ </text>
+ <text name="BDensText2">
+ Mavi YoÄŸunluÄŸu
+ </text>
+ <text name="HDText">
+ Pus YoÄŸunluÄŸu
+ </text>
+ <text name="DensMultText">
+ Yoğunluk Çarpanı
+ </text>
+ <text name="WLDistanceMultText">
+ Mesafe Çarpanı
+ </text>
+ <text name="MaxAltText">
+ Maks İrtifa
+ </text>
+ </panel>
+ <panel label="AYDINLATMA" name="Lighting">
+ <text name="SLCText">
+ Güneş/Ay Rengi
+ </text>
+ <text name="WLAmbientText">
+ Ortam
+ </text>
+ <text name="SunGlowText">
+ Güneş Parlaması
+ </text>
+ <slider label="Odak" name="WLGlowB"/>
+ <slider label="Büyüklük" name="WLGlowR"/>
+ <text name="WLStarText">
+ Yıldız Parlaklığı
+ </text>
+ <text name="SceneGammaText">
+ Sahne Gaması
+ </text>
+ <text name="TODText">
+ Güneş/Ay Konumu
+ </text>
+ <multi_slider initial_value="0" name="WLSunPos"/>
+ <text name="WL12amHash">
+ |
+ </text>
+ <text name="WL6amHash">
+ |
+ </text>
+ <text name="WL12pmHash2">
+ |
+ </text>
+ <text name="WL6pmHash">
+ |
+ </text>
+ <text name="WL12amHash2">
+ |
+ </text>
+ <text name="WL12am">
+ 12
+ </text>
+ <text name="WL6am">
+ 6
+ </text>
+ <text name="WL12pmHash">
+ 24
+ </text>
+ <text name="WL6pm">
+ 18
+ </text>
+ <text name="WL12am2">
+ 12
+ </text>
+ <time name="WLDayTime" value="6:00"/>
+ <text name="WLEastAngleText">
+ Doğu Açısı
+ </text>
+ </panel>
+ <panel label="BULUTLAR" name="Clouds">
+ <text name="WLCloudColorText">
+ Bulut Rengi
+ </text>
+ <text name="WLCloudColorText2">
+ Bulut XY/YoÄŸunluÄŸu
+ </text>
+ <slider label="X" name="WLCloudX"/>
+ <slider label="Y" name="WLCloudY"/>
+ <slider label="D" name="WLCloudDensity"/>
+ <text name="WLCloudCoverageText">
+ Bulut Örtüsü
+ </text>
+ <text name="WLCloudScaleText">
+ Bulut Yüksekliği
+ </text>
+ <text name="WLCloudDetailText">
+ Bulut Ayrıntısı (XY/Yoğunluğu)
+ </text>
+ <slider label="X" name="WLCloudDetailX"/>
+ <slider label="Y" name="WLCloudDetailY"/>
+ <slider label="D" name="WLCloudDetailDensity"/>
+ <text name="WLCloudScrollXText">
+ Bulut Kaydırma X
+ </text>
+ <check_box label="Kilitle" name="WLCloudLockX"/>
+ <text name="WLCloudScrollYText">
+ Bulut Kaydırma Y
+ </text>
+ <check_box label="Kilitle" name="WLCloudLockY"/>
+ </panel>
+ </tab_container>
+ <check_box label="Bu ön ayarı yeni gökyüzü ayarım yap" name="make_default_cb"/>
+ <button label="Kaydet" name="save"/>
+ <button label="İptal" name="cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_edit_water_preset.xml b/indra/newview/skins/default/xui/tr/floater_edit_water_preset.xml
new file mode 100644
index 0000000000..2ddee32bad
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_edit_water_preset.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Edit Water Preset" title="Su Ön Ayarını Düzenle">
+ <string name="title_new">
+ Yeni Bir Su Ön Ayarı Oluştur
+ </string>
+ <string name="title_edit">
+ Bir Su Ön Ayarını Düzenle
+ </string>
+ <string name="hint_new">
+ Ön ayarınızı adlandırın, bunu oluşturmak için denetimleri ayarlayın ve &quot;Kaydet&quot; üzerine tıklayın.
+ </string>
+ <string name="hint_edit">
+ Su ön ayarınızı düzenlemek için denetimleri ayarlayın ve &quot;Kaydet&quot; üzerine tıklayın.
+ </string>
+ <string name="combo_label">
+ -Bir ön ayar seçin-
+ </string>
+ <text name="hint">
+ Ön ayarınızı düzenlemek için denetimleri ayarlayın, sonra &quot;Kaydet&quot; üzerine tıklayın.
+ </text>
+ <text name="label">
+ Ön Ayar Adı:
+ </text>
+ <text name="note">
+ Not: Ön ayarınızın adını değiştirirseniz, yeni bir ön ayar oluşturursunuz ve mevcut ön ayar değişmez.
+ </text>
+ <panel name="panel_water_preset">
+ <text name="water_color_label">
+ Su Pus Rengi
+ </text>
+ <text name="water_fog_density_label">
+ Pus Yoğunluk Üssü
+ </text>
+ <text name="underwater_fog_modifier_label">
+ Sualtı Pus Değiştiricisi
+ </text>
+ <text name="BHText">
+ Büyük Dalga Yönü
+ </text>
+ <slider label="X" name="WaterWave1DirX"/>
+ <slider label="Y" name="WaterWave1DirY"/>
+ <text name="BDensText">
+ Yansıma Dalgacığı Ölçeği
+ </text>
+ <text name="HDText">
+ Fresnel Ölçeği
+ </text>
+ <text name="FresnelOffsetText">
+ Fresnel Dengeleyicisi
+ </text>
+ <text name="BHText2">
+ Küçük Dalga Yönü
+ </text>
+ <slider label="X" name="WaterWave2DirX"/>
+ <slider label="Y" name="WaterWave2DirY"/>
+ <text name="DensMultText">
+ Yukarıdan Kırılma Ölçeği
+ </text>
+ <text name="WaterScaleBelowText">
+ Aşağıdan Kırılma Ölçeği
+ </text>
+ <text name="MaxAltText">
+ Bulanıklaştırma Çarpanı
+ </text>
+ <text name="BHText3">
+ Normal Harita
+ </text>
+ </panel>
+ <check_box label="Bu ön ayarı yeni su ayarım yap" name="make_default_cb"/>
+ <button label="Kaydet" name="save"/>
+ <button label="İptal" name="cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_env_settings.xml b/indra/newview/skins/default/xui/tr/floater_env_settings.xml
new file mode 100644
index 0000000000..d53629f6fe
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_env_settings.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Environment Editor Floater" title="ÇEVRE DÜZENLEYİCİ">
+ <floater.string name="timeStr">
+ [hour12,datetime,utc]:[min,datetime,utc] [ampm,datetime,utc]
+ </floater.string>
+ <text name="EnvTimeText">
+ Günün Saati
+ </text>
+ <text name="EnvTimeText2">
+ 12:00 PM
+ </text>
+ <text name="EnvCloudText">
+ Bulut Örtüsü
+ </text>
+ <text name="EnvWaterColorText">
+ Su Rengi
+ </text>
+ <color_swatch name="EnvWaterColor" tool_tip="Renk seçiciyi açmak için tıklayın"/>
+ <text name="EnvWaterFogText">
+ Su Sisi
+ </text>
+ <button label="Gayrimenkul Saati Kullan" name="EnvUseEstateTimeButton"/>
+ <button label="Gelişmiş Gökyüzü" name="EnvAdvancedSkyButton"/>
+ <button label="GeliÅŸmiÅŸ Su" name="EnvAdvancedWaterButton"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_environment_settings.xml b/indra/newview/skins/default/xui/tr/floater_environment_settings.xml
new file mode 100644
index 0000000000..e702da7e1b
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_environment_settings.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Environment Editor Floater" title="ORTAM AYARLARI">
+ <text name="note">
+ Görüntüleyiciniz için ortam ayarlarını özelleştirmek isterseniz aşağıdaki seçenekleri kullanın.
+ </text>
+ <radio_group name="region_settings_radio_group">
+ <radio_item label="Bölge ayarlarını kullanın" name="use_region_settings"/>
+ <radio_item label="Ortamımı özelleştir" name="use_my_settings"/>
+ </radio_group>
+ <panel name="user_environment_settings">
+ <text name="note">
+ Not: Özel ayarlarınız diğer kullanıcılar tarafından görülmez.
+ </text>
+ <text name="water_settings_title">
+ Su Ayarı
+ </text>
+ <combo_box name="water_settings_preset_combo">
+ <combo_box.item label="-Bir ön ayar seçin-" name="item0"/>
+ </combo_box>
+ <text name="sky_dayc_settings_title">
+ Gökyüzü/Gün Dön.
+ </text>
+ <radio_group name="sky_dayc_settings_radio_group">
+ <radio_item label="Sabit gökyüzü" name="my_sky_settings"/>
+ <radio_item label="Gün döngüsü" name="my_dayc_settings"/>
+ </radio_group>
+ <combo_box name="sky_settings_preset_combo">
+ <combo_box.item label="-Bir ön ayar seçin-" name="item0"/>
+ </combo_box>
+ <combo_box name="dayc_settings_preset_combo">
+ <combo_box.item label="-Bir ön ayar seçin-" name="item0"/>
+ </combo_box>
+ </panel>
+ <button label="Tamam" name="ok_btn"/>
+ <button label="İptal" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_event.xml b/indra/newview/skins/default/xui/tr/floater_event.xml
new file mode 100644
index 0000000000..60dece124b
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_event.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater label="Etkinlik" name="Event" title="ETKİNLİK AYRINTILARI">
+ <floater.string name="loading_text">
+ Yükleniyor...
+ </floater.string>
+ <floater.string name="done_text">
+ Tamamlandı
+ </floater.string>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_fast_timers.xml b/indra/newview/skins/default/xui/tr/floater_fast_timers.xml
new file mode 100644
index 0000000000..5736bda45e
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_fast_timers.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="fast_timers">
+ <string name="pause">
+ Duraklat
+ </string>
+ <string name="run">
+ KoÅŸ
+ </string>
+ <button label="Duraklat" name="pause_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_font_test.xml b/indra/newview/skins/default/xui/tr/floater_font_test.xml
new file mode 100644
index 0000000000..5371d5d2a4
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_font_test.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="contents" title="FONT TESTİ"/>
diff --git a/indra/newview/skins/default/xui/tr/floater_gesture.xml b/indra/newview/skins/default/xui/tr/floater_gesture.xml
new file mode 100644
index 0000000000..5f5d28ad6c
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_gesture.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater label="Yerler" name="gestures" title="MİMİKLER">
+ <floater.string name="loading">
+ Yükleniyor...
+ </floater.string>
+ <floater.string name="playing">
+ (Oynuyor)
+ </floater.string>
+ <floater.string name="copy_name">
+ [COPY_NAME] kopyası
+ </floater.string>
+ <scroll_list name="gesture_list">
+ <scroll_list.columns label="Ad" name="name"/>
+ <scroll_list.columns label="Sohbet" name="trigger"/>
+ <scroll_list.columns label="Anahtar" name="shortcut"/>
+ </scroll_list>
+ <panel label="bottom_panel" name="bottom_panel">
+ <menu_button name="gear_btn" tool_tip="İlave seçenekler"/>
+ <button name="new_gesture_btn" tool_tip="Yeni mimik yap"/>
+ <button name="activate_btn" tool_tip="Seçilen mimiği Etkinleştir/Devre Dışı Bırak"/>
+ <button name="del_btn" tool_tip="Bu mimiÄŸi sil"/>
+ </panel>
+ <button label="Düzenle" name="edit_btn"/>
+ <button label="Oyna" name="play_btn"/>
+ <button label="Durdur" name="stop_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_god_tools.xml b/indra/newview/skins/default/xui/tr/floater_god_tools.xml
new file mode 100644
index 0000000000..26e5ebd18b
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_god_tools.xml
@@ -0,0 +1,96 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="godtools floater" title="YÖNETİCİ ARAÇLARI">
+ <tab_container name="GodTools Tabs">
+ <panel label="AÄŸ" name="grid">
+ <button label="Bu Bölgenin Harita Görünürlük Önbelleklerini Temizle" label_selected="Bu Bölgenin Harita Görünürlük Önbelleklerini Temizle" name="Flush This Region&apos;s Map Visibility Caches"/>
+ </panel>
+ <panel label="Bölge" name="region">
+ <text name="Region Name:">
+ Bölge Adı:
+ </text>
+ <check_box label="Başlangıç" name="check prelude" tool_tip="Burayı başlangıç bölgesi yapmak için ayarlayın"/>
+ <check_box label="Sabit Güneş" name="check fixed sun" tool_tip="Güneş konumunu sabitleyin (Bölge/Gayrimenkul &gt; Yüzey için olduğu gibi"/>
+ <check_box label="Işınlanınca Ana Konumu Sıfırla" name="check reset home" tool_tip="Sakin ışınlanarak gittiğinde, ana konumlarını hedef konum olarak sıfırlayın."/>
+ <check_box label="Görünür" name="check visible" tool_tip="Yönetici olmayanların bölgeyi görmesi için bunu ayarlayın"/>
+ <check_box label="Hasar" name="check damage" tool_tip="Bölgede hasara imkan tanımak için bunu ayarlayın"/>
+ <check_box label="Trafik İzlemesini Engelle" name="block dwell" tool_tip="Bölgenin trafiği hesaplamaması için bunu ayarlayın"/>
+ <check_box label="Yer Şekillendirmeyi Engelle" name="block terraform" tool_tip="Kişilerin arazilerini şekillendirmesini engellemek için bunu ayarlayın"/>
+ <check_box label="Korumalı Alan" name="is sandbox" tool_tip="Bunun bir korumalı bölge olmasını açıp/kapayın"/>
+ <button label="Yüzeyi Kaydet" label_selected="Yüzeyi Kaydet" name="Bake Terrain" tool_tip="Mevcut yüzeyi varsayılan olarak kaydet"/>
+ <button label="Yüzeyi Geri Döndür" label_selected="Yüzeyi Geri Döndür" name="Revert Terrain" tool_tip="Mevcut yüzeyin yerine varsayılanı koy"/>
+ <button label="Yüzeyi Değiştir" label_selected="Yüzeyi Değiştir" name="Swap Terrain" tool_tip="Mevcut yüzeyi varsayılanla değiştir"/>
+ <text name="estate id">
+ Gayrimenkul KimliÄŸi:
+ </text>
+ <text name="parent id">
+ Ana Kimlik:
+ </text>
+ <line_editor name="parentestate" tool_tip="Burası bu bölge için ana gayrimenkuldur."/>
+ <text name="Grid Pos: ">
+ AÄŸ Konumu:
+ </text>
+ <line_editor name="gridposx" tool_tip="Burası bu bölge için ağdaki x konumudur"/>
+ <line_editor name="gridposy" tool_tip="Burası bu bölge için ağdaki y konumudur"/>
+ <text name="Redirect to Grid: ">
+ Ağa Tekrar Yönlendir:
+ </text>
+ <text name="billable factor text">
+ Faturalanabilir Çarpan:
+ </text>
+ <text name="land cost text">
+ m² başına L$:
+ </text>
+ <button label="Yenile" label_selected="Yenile" name="Refresh" tool_tip="Yukarıdaki bilgileri yenilemek için buraya tıklayın"/>
+ <button label="Uygula" label_selected="Uygula" name="Apply" tool_tip="Yukarıdaki herhangi bir değişikliği uygulamak için buraya tıklayın"/>
+ <button label="Bölge Seç" label_selected="Bölge Seç" name="Select Region" tool_tip="Arazi aracıyla tüm bölgeyi seçin"/>
+ <button label="Şimdi otomatik kaydet" label_selected="Şimdi otomatik kaydet" name="Autosave now" tool_tip="Gzip ile sıkıştırılmış halini otomatik kaydetme dizinine kaydedin"/>
+ </panel>
+ <panel label="Nesneler" name="objects">
+ <panel.string name="no_target">
+ (hedef yok)
+ </panel.string>
+ <text name="Region Name:">
+ Bölge Adı:
+ </text>
+ <text name="region name">
+ Welsh
+ </text>
+ <check_box label="Komut Dosyalarını Devre Dışı Bırak" name="disable scripts" tool_tip="Bu bölgedeki tüm komut dosyalarını devre dışı bırakmak için bunu ayarlayın"/>
+ <check_box label="Çarpışmaları Devre Dışı Bırak" name="disable collisions" tool_tip="Bu bölgedeki aracı dışı çarpışmaları devre dışı bırakmak için bunu ayarlayın"/>
+ <check_box label="Fiziği Devre Dışı Bırak" name="disable physics" tool_tip="Bu bölgedeki tüm fiziği devre dışı bırakmak için bunu ayarlayın"/>
+ <button label="Uygula" label_selected="Uygula" name="Apply" tool_tip="Yukarıdaki herhangi bir değişikliği uygulamak için buraya tıklayın"/>
+ <button label="Hedefi Ayarla" label_selected="Hedefi Ayarla" name="Set Target" tool_tip="Nesne silinmesi için hedef avatarı ayarlayın"/>
+ <text name="target_avatar_name">
+ (hedef yok)
+ </text>
+ <button label="Başkalarının Arazilerinde Hedefin Komut Dosyalı Nesnelerini Sil" label_selected="Başkalarının Arazilerinde Hedefin Komut Dosyalı Nesnelerini Sil" name="Delete Target&apos;s Scripted Objects On Others Land" tool_tip="Hedefe ait olmayan arazide hedefe ait olan tüm komut dosyalı nesneleri silin. (kopya yok) nesneler geri döndürülür."/>
+ <button label="Hedefin *Herhangi Bir* Arazideki Komut Dosyalı Nesnelerini Sil" label_selected="Hedefin *Herhangi Bir* Arazideki Komut Dosyalı Nesnelerini Sil" name="Delete Target&apos;s Scripted Objects On *Any* Land" tool_tip="Bu bölgede hedefe ait olan tüm komut dosyalı nesneleri silin. (kopya yok) nesneler geri döndürülür."/>
+ <button label="Hedefin *TÜM* Nesnelerini Sil" label_selected="Hedefin *TÜM* Nesnelerini Sil" name="Delete *ALL* Of Target&apos;s Objects" tool_tip="Bu bölgede hedefe ait olan tüm nesneleri silin. (kopya yok) nesneler geri döndürülür."/>
+ <button label="En Çok Çarpışanlar" label_selected="En Çok Çarpışanlar" name="Get Top Colliders" tool_tip="En dar fazda geri aramaları yaşayan nesnelerin listesini alır"/>
+ <button label="En Çok Komut Dsy. Çalştr." label_selected="En Çok Komut Dsy. Çalştr." name="Get Top Scripts" tool_tip="Komut dosyalarını çalıştırırken en çok zaman harcayan nesnelerin listesini alır"/>
+ <button label="Komut dosyaları özeti" label_selected="Komut dosyaları özeti" name="Scripts digest" tool_tip="Tüm komut dosyalarının ve her birinin ne kadar kullanıldığının listesini alır"/>
+ </panel>
+ <panel label="Talep" name="request">
+ <text name="Destination:">
+ Hedef Konum:
+ </text>
+ <combo_box name="destination">
+ <combo_box.item label="Seçim" name="item1"/>
+ <combo_box.item label="Aracı Bölgesi" name="item2"/>
+ </combo_box>
+ <text name="Request:">
+ Talep:
+ </text>
+ <combo_box name="request">
+ <combo_box.item label="çarpışanlar &lt;adımlar&gt;" name="item1"/>
+ <combo_box.item label="komut dosyaları &lt;sayım&gt;,&lt;opsiyonel desen&gt;" name="item2"/>
+ <combo_box.item label="nesneler &lt;desen&gt;" name="item3"/>
+ <combo_box.item label="&lt;asset_id&gt; oluÅŸtur" name="item4"/>
+ </combo_box>
+ <text name="Parameter:">
+ Parametre:
+ </text>
+ <button label="Talepte Bulun" label_selected="Talepte Bulun" name="Make Request"/>
+ </panel>
+ </tab_container>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_hardware_settings.xml b/indra/newview/skins/default/xui/tr/floater_hardware_settings.xml
new file mode 100644
index 0000000000..8e056b9b0d
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_hardware_settings.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Hardware Settings Floater" title="DONANIM AYARLARI">
+ <text name="Filtering:">
+ Filtreleme:
+ </text>
+ <check_box label="Anisotropik Filtreleme (etkinken daha yavaÅŸ)" name="ani"/>
+ <text name="antialiasing label">
+ Düzgünleştirme:
+ </text>
+ <combo_box label="Antialiasing" name="fsaa">
+ <combo_box.item label="Devre dışı" name="FSAADisabled"/>
+ <combo_box.item label="2x" name="2x"/>
+ <combo_box.item label="4x" name="4x"/>
+ <combo_box.item label="8x" name="8x"/>
+ <combo_box.item label="16x" name="16x"/>
+ </combo_box>
+ <text name="antialiasing restart">
+ (görüntülemeyi eniden başlatma gerekir)
+ </text>
+ <spinner label="Gama:" name="gamma"/>
+ <text name="(brightness, lower is brighter)">
+ (0 = varsayılan parlaklık, düşük = daha parlak)
+ </text>
+ <text name="Enable VBO:">
+ VBO EtkinleÅŸtir:
+ </text>
+ <check_box initial_value="true" label="OpenGL Vertex Tampon Nesnelerini Etkinleştir" name="vbo" tool_tip="Modern donanımlarda bunun etkinleştirilmesi performans artışı sağlar. Ancak, eski donanımlardaki VBO uygulamaları yetersizdir ve etkinleştirildiğinde bilgisayarınız çökebilir."/>
+ <slider label="Doku Belleği (MB):" name="GraphicsCardTextureMemory" tool_tip="Dokular için tahsis edilecek bellek miktarı. Varsayılan değer video kartı belleğidir. Bu değerin küçültülmesi performansı artırabilir, ama ayrıca dokuları bulanıklaştırabilir."/>
+ <spinner label="Sis Mesafe Oranı:" name="fog"/>
+ <button label="Tamam" label_selected="Tamam" name="OK"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_help_browser.xml b/indra/newview/skins/default/xui/tr/floater_help_browser.xml
new file mode 100644
index 0000000000..695f838936
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_help_browser.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_help_browser" title="YARDIM TARAYICISI">
+ <floater.string name="loading_text">
+ Yükleniyor...
+ </floater.string>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_how_to.xml b/indra/newview/skins/default/xui/tr/floater_how_to.xml
new file mode 100644
index 0000000000..a42fe0b122
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_how_to.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_how_to" title="NASIL YAPILIR"/>
diff --git a/indra/newview/skins/default/xui/tr/floater_hud.xml b/indra/newview/skins/default/xui/tr/floater_hud.xml
new file mode 100644
index 0000000000..09f119bbc1
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_hud.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_hud" title="ÖĞRETİCİ"/>
diff --git a/indra/newview/skins/default/xui/tr/floater_im_container.xml b/indra/newview/skins/default/xui/tr/floater_im_container.xml
new file mode 100644
index 0000000000..4451d1d309
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_im_container.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<multi_floater name="floater_im_box" title="SOHBETLER"/>
diff --git a/indra/newview/skins/default/xui/tr/floater_im_session.xml b/indra/newview/skins/default/xui/tr/floater_im_session.xml
new file mode 100644
index 0000000000..bed08b36c6
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_im_session.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="panel_im">
+ <layout_stack name="im_panels">
+ <layout_panel>
+ <line_editor label="Kime" name="chat_editor"/>
+ </layout_panel>
+ </layout_stack>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_image_preview.xml b/indra/newview/skins/default/xui/tr/floater_image_preview.xml
new file mode 100644
index 0000000000..a5963bdf63
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_image_preview.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Image Preview">
+ <text name="name_label">
+ Ad:
+ </text>
+ <text name="description_label">
+ Açıklama:
+ </text>
+ <text name="preview_label">
+ Görüntüyü şu şekilde önizle:
+ </text>
+ <combo_box label="Giysi Türü" name="clothing_type_combo">
+ <item label="Görüntü" name="Image" value="Görüntü"/>
+ <item label="Saç" name="Hair" value="Saç"/>
+ <item label="Kadın Kafası" name="FemaleHead" value="Kadın Kafası"/>
+ <item label="Kadın Üst Gövde" name="FemaleUpperBody" value="Kadın Üst Gövde"/>
+ <item label="Kadın Alt Gövde" name="FemaleLowerBody" value="Kadın Alt Gövde"/>
+ <item label="Erkek Kafası" name="MaleHead" value="Erkek Kafası"/>
+ <item label="Erkek Üst Gövde" name="MaleUpperBody" value="Erkek Üst Gövde"/>
+ <item label="Erkek Alt Gövde" name="MaleLowerBody" value="Erkek Alt Gövde"/>
+ <item label="Etek" name="Skirt" value="Etek"/>
+ <item label="ÅžekillendirilmiÅŸ Prim" name="SculptedPrim" value="ÅžekillendirilmiÅŸ Prim"/>
+ </combo_box>
+ <text name="bad_image_text">
+ Görüntü okunamadı
+
+Görüntüyü 24 bit Targa .tga olarak kaydetmeyi dene.
+ </text>
+ <check_box label="Kayıpsız sıkıştırmayı kullan" name="lossless_check"/>
+ <button label="İptal" name="cancel_btn"/>
+ <button label="Karşıya Yükle (L$[AMOUNT])" name="ok_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_import_collada.xml b/indra/newview/skins/default/xui/tr/floater_import_collada.xml
new file mode 100644
index 0000000000..1e77d1b376
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_import_collada.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Import Collada" title="Sahneyi İçeri Aktar">
+ <text name="mesh count">
+ Örgüler: [COUNT]
+ </text>
+ <text name="texture count">
+ Dokular: [COUNT]
+ </text>
+ <text name="status">
+ Durum: [STATUS]
+ </text>
+ <button label="İptal" name="cancel"/>
+ <button label="Tamam" name="ok"/>
+ <string name="status_idle">
+ BoÅŸta
+ </string>
+ <string name="status_uploading">
+ [NAME] karşıya yükleniyor
+ </string>
+ <string name="status_creating">
+ [NAME] nesnesi oluÅŸturuluyor
+ </string>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_incoming_call.xml b/indra/newview/skins/default/xui/tr/floater_incoming_call.xml
new file mode 100644
index 0000000000..adb03c2dff
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_incoming_call.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="incoming call" title="Gelen arama">
+ <floater.string name="lifetime">
+ 5
+ </floater.string>
+ <floater.string name="localchat">
+ Yakındaki Sesli Sohbet
+ </floater.string>
+ <floater.string name="anonymous">
+ anonim
+ </floater.string>
+ <floater.string name="VoiceInviteP2P">
+ arıyor.
+ </floater.string>
+ <floater.string name="VoiceInviteAdHoc">
+ bir Sesli Sohbet aramasına bir konferans araması ile katıldı.
+ </floater.string>
+ <floater.string name="VoiceInviteGroup">
+ &apos;[GROUP]&apos; ses kanalına şimdi katıldı.
+ </floater.string>
+ <floater.string name="VoiceInviteQuestionGroup">
+ [CURRENT_CHAT] sohbetinden ayrılıp, &apos;[GROUP]&apos; aramasına katılmak istiyor musunuz?
+ </floater.string>
+ <floater.string name="VoiceInviteQuestionDefault">
+ [CURRENT_CHAT] sohbetinden ayrılıp, bu sesli sohbete katılmak istiyor musunuz?
+ </floater.string>
+ <text name="question">
+ [CURRENT_CHAT] sohbetinden ayrılıp, bu sesli sohbete katılmak istiyor musunuz?
+ </text>
+ <button label="Kabul Et" label_selected="Kabul Et" name="Accept"/>
+ <button label="Reddet" label_selected="Reddet" name="Reject"/>
+ <button label="Aİ Başlat" name="Start IM"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_inspect.xml b/indra/newview/skins/default/xui/tr/floater_inspect.xml
new file mode 100644
index 0000000000..09130a31f3
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_inspect.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="inspect" title="NESNELERİ İNCELE">
+ <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="SL dünyasında vurgulamak için bu listedeki bir nesneyi seçin">
+ <scroll_list.columns label="Nesne Adı" name="object_name"/>
+ <scroll_list.columns label="Sahip Adı" name="owner_name"/>
+ <scroll_list.columns label="Oluşturanın Adı" name="creator_name"/>
+ <scroll_list.columns label="OluÅŸturma Tarihi" name="creation_date"/>
+ </scroll_list>
+ <button label="Sahip Profiline Bak..." name="button owner" tool_tip="Vurgulanan nesnenin sahibinin profiline bak"/>
+ <button label="Oluşturan Profiline Bak..." name="button creator" tool_tip="Vurgulanan nesneyi ilk oluşturanın profiline bak"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_inventory.xml b/indra/newview/skins/default/xui/tr/floater_inventory.xml
new file mode 100644
index 0000000000..cfb12d4b68
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_inventory.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Inventory" title="ENVANTERİM">
+ <panel label="Envanter Paneli" name="Inventory Panel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_inventory_item_properties.xml b/indra/newview/skins/default/xui/tr/floater_inventory_item_properties.xml
new file mode 100644
index 0000000000..e49fef1f46
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_inventory_item_properties.xml
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="item properties" title="ENVANTER ÖGESİ ÖZELLİKLERİ">
+ <floater.string name="unknown">
+ (bilinmiyor)
+ </floater.string>
+ <floater.string name="public">
+ (kamuya açık)
+ </floater.string>
+ <floater.string name="you_can">
+ Åžunu yapabilirsiniz:
+ </floater.string>
+ <floater.string name="owner_can">
+ Sahip ÅŸunu yapabilir:
+ </floater.string>
+ <floater.string name="acquiredDate">
+ [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]
+ </floater.string>
+ <text name="LabelItemNameTitle">
+ Ad:
+ </text>
+ <text name="LabelItemDescTitle">
+ Açıklama:
+ </text>
+ <text name="LabelCreatorTitle">
+ OluÅŸturan:
+ </text>
+ <button label="Profil..." name="BtnCreator"/>
+ <text name="LabelOwnerTitle">
+ Sahip:
+ </text>
+ <button label="Profil..." name="BtnOwner"/>
+ <text name="LabelAcquiredTitle">
+ Alınan:
+ </text>
+ <text name="LabelAcquiredDate">
+ 24 Mayıs Çarş 12:50:46 2006
+ </text>
+ <text name="OwnerLabel">
+ Siz:
+ </text>
+ <check_box label="Düzenle" name="CheckOwnerModify"/>
+ <check_box label="Kopyala" name="CheckOwnerCopy"/>
+ <check_box label="Tekrar Sat" name="CheckOwnerTransfer"/>
+ <text name="AnyoneLabel">
+ Herkes:
+ </text>
+ <check_box label="Kopyala" name="CheckEveryoneCopy"/>
+ <text name="GroupLabel">
+ Grup:
+ </text>
+ <check_box label="PaylaÅŸ" name="CheckShareWithGroup"/>
+ <text name="NextOwnerLabel">
+ Sonraki sahip:
+ </text>
+ <check_box label="Düzenle" name="CheckNextOwnerModify"/>
+ <check_box label="Kopyala" name="CheckNextOwnerCopy"/>
+ <check_box label="Tekrar Sat" name="CheckNextOwnerTransfer"/>
+ <check_box label="Satılık" name="CheckPurchase"/>
+ <combo_box name="combobox sale copy">
+ <combo_box.item label="Kopyala" name="Copy"/>
+ <combo_box.item label="Orijinal" name="Original"/>
+ </combo_box>
+ <spinner label="Fiyat:" name="Edit Cost"/>
+ <text name="CurrencySymbol">
+ L$
+ </text>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_inventory_view_finder.xml b/indra/newview/skins/default/xui/tr/floater_inventory_view_finder.xml
new file mode 100644
index 0000000000..9d1a556751
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_inventory_view_finder.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Inventory Finder" title="INVENTORY_RECENT_ITEMS">
+ <check_box label="Animasyon" name="check_animation"/>
+ <check_box label="Arama Kartları" name="check_calling_card"/>
+ <check_box label="Giysiler" name="check_clothing"/>
+ <check_box label="Mimikler" name="check_gesture"/>
+ <check_box label="Yer İmleri" name="check_landmark"/>
+ <check_box label="Örgüler" name="check_mesh"/>
+ <check_box label="Not Kartları" name="check_notecard"/>
+ <check_box label="Nesneler" name="check_object"/>
+ <check_box label="Komut Dosyaları" name="check_script"/>
+ <check_box label="Sesler" name="check_sound"/>
+ <check_box label="Dokular" name="check_texture"/>
+ <check_box label="Anlık Görüntüler" name="check_snapshot"/>
+ <button label="Tümü" label_selected="Tümü" name="All"/>
+ <button label="Hiçbiri" label_selected="Hiçbiri" name="None"/>
+ <check_box label="Klasörleri her zaman göster" name="check_show_empty"/>
+ <check_box label="Oturum Kapandıktan Beri" name="check_since_logoff"/>
+ <text name="- OR -">
+ - VEYA -
+ </text>
+ <spinner label="Saat Önce" name="spin_hours_ago"/>
+ <spinner label="Gün Önce" name="spin_days_ago"/>
+ <button label="Kapat" label_selected="Kapat" name="Close"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_joystick.xml b/indra/newview/skins/default/xui/tr/floater_joystick.xml
new file mode 100644
index 0000000000..4a27aac3c1
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_joystick.xml
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Joystick" title="OYUN ÇUBUĞU YAPILANDIRMA">
+ <floater.string name="NoDevice">
+ cihaz tespit edilmedi
+ </floater.string>
+ <check_box label="Oyun Çub. Etkşt:" name="enable_joystick"/>
+ <spinner label="X Eks. Haritalama" name="JoystickAxis1"/>
+ <spinner label="Y Eks. Haritalama" name="JoystickAxis2"/>
+ <spinner label="Z Eks. Haritalama" name="JoystickAxis0"/>
+ <spinner label="EÄŸim Haritalama" name="JoystickAxis4"/>
+ <spinner label="Düşey Sapma Haritalama" name="JoystickAxis5"/>
+ <spinner label="Tilt Haritalama" name="JoystickAxis3"/>
+ <spinner label="Zum Haritalama" name="JoystickAxis6"/>
+ <check_box label="DoÄŸrudan Zum" name="ZoomDirect"/>
+ <check_box label="3B İmleç" name="Cursor3D"/>
+ <check_box label="Otomatik Düzey" name="AutoLeveling"/>
+ <text name="Control Modes:">
+ Kontrol Modları:
+ </text>
+ <check_box label="Avatar" name="JoystickAvatarEnabled"/>
+ <check_box label="İnşa Et" name="JoystickBuildEnabled"/>
+ <check_box label="Flycam" name="JoystickFlycamEnabled"/>
+ <stat_view label="Oyun Çubuğu İzleme" name="axis_view">
+ <stat_bar label="Eksen 0" name="axis0"/>
+ <stat_bar label="Eksen 1" name="axis1"/>
+ <stat_bar label="Eksen 2" name="axis2"/>
+ <stat_bar label="Eksen 3" name="axis3"/>
+ <stat_bar label="Eksen 4" name="axis4"/>
+ <stat_bar label="Eksen 5" name="axis5"/>
+ </stat_view>
+ <text name="XScale">
+ X Ölçeği
+ </text>
+ <text name="YScale">
+ Y Ölçeği
+ </text>
+ <text name="ZScale">
+ Z Ölçeği
+ </text>
+ <text name="PitchScale">
+ Eğim Ölçeği
+ </text>
+ <text name="YawScale">
+ Düşey Sapma Ölçeği
+ </text>
+ <text name="RollScale">
+ Tilt Ölçeği
+ </text>
+ <text name="XDeadZone">
+ X Ölü Bölge
+ </text>
+ <text name="YDeadZone">
+ Y Ölü Bölge
+ </text>
+ <text name="ZDeadZone">
+ Z Ölü Bölge
+ </text>
+ <text name="PitchDeadZone">
+ Eğim Ölü Bölge
+ </text>
+ <text name="YawDeadZone">
+ Düşey Sapma Ölü Bölge
+ </text>
+ <text name="RollDeadZone">
+ Tilt Ölü Bölge
+ </text>
+ <text name="Feathering">
+ Uçlarda Rötuş
+ </text>
+ <text name="ZoomScale2">
+ Zum Ölçeği
+ </text>
+ <text name="ZoomDeadZone">
+ Zum Ölü Bölge
+ </text>
+ <button label="UzayNavigatörü Varsayılanlar" name="SpaceNavigatorDefaults"/>
+ <button label="Tamam" label_selected="Tamam" name="ok_btn"/>
+ <button label="İptal" label_selected="İptal" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_lagmeter.xml b/indra/newview/skins/default/xui/tr/floater_lagmeter.xml
new file mode 100644
index 0000000000..736c50be90
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_lagmeter.xml
@@ -0,0 +1,151 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_lagmeter" title="GECİKME ÖLÇER">
+ <floater.string name="max_title_msg">
+ Gecikme Ölçer
+ </floater.string>
+ <floater.string name="max_width_px">
+ 360
+ </floater.string>
+ <floater.string name="min_title_msg">
+ Gecikme
+ </floater.string>
+ <floater.string name="min_width_px">
+ 90
+ </floater.string>
+ <floater.string name="client_text_msg">
+ İstemci
+ </floater.string>
+ <floater.string name="client_frame_rate_critical_fps">
+ 10
+ </floater.string>
+ <floater.string name="client_frame_rate_warning_fps">
+ 15
+ </floater.string>
+ <floater.string name="client_frame_time_window_bg_msg">
+ Normal, pencere alt zeminde
+ </floater.string>
+ <floater.string name="client_frame_time_critical_msg">
+ İstemci kare hızı [CLIENT_FRAME_RATE_CRITICAL] altında
+ </floater.string>
+ <floater.string name="client_frame_time_warning_msg">
+ İstemci kare hızı [CLIENT_FRAME_RATE_CRITICAL] ile [CLIENT_FRAME_RATE_WARNING] arasınad
+ </floater.string>
+ <floater.string name="client_frame_time_normal_msg">
+ Normal
+ </floater.string>
+ <floater.string name="client_draw_distance_cause_msg">
+ Muhtemel neden: Çizme mesafesi çok yüksek
+ </floater.string>
+ <floater.string name="client_texture_loading_cause_msg">
+ Muhtemel neden: Görüntüler yükleniyor
+ </floater.string>
+ <floater.string name="client_texture_memory_cause_msg">
+ Muhtemel neden: Bellekte çok fazla görüntü
+ </floater.string>
+ <floater.string name="client_complex_objects_cause_msg">
+ Muhtemel neden: Sahnede çok fazla karmaşık nesne
+ </floater.string>
+ <floater.string name="network_text_msg">
+ AÄŸ
+ </floater.string>
+ <floater.string name="network_packet_loss_critical_pct">
+ 10
+ </floater.string>
+ <floater.string name="network_packet_loss_warning_pct">
+ 5
+ </floater.string>
+ <floater.string name="network_packet_loss_critical_msg">
+ Bağlantı paketlerin % [NETWORK_PACKET_LOSS_CRITICAL]&apos;sinden fazlasını bırakıyor
+ </floater.string>
+ <floater.string name="network_packet_loss_warning_msg">
+ Bağlantı paketlerin % [NETWORK_PACKET_LOSS_WARNING]%-[NETWORK_PACKET_LOSS_CRITICAL]&apos;sini bırakıyor
+ </floater.string>
+ <floater.string name="network_performance_normal_msg">
+ Normal
+ </floater.string>
+ <floater.string name="network_ping_critical_ms">
+ 600
+ </floater.string>
+ <floater.string name="network_ping_warning_ms">
+ 300
+ </floater.string>
+ <floater.string name="network_ping_critical_msg">
+ Bağlantı ping süresi [NETWORK_PING_CRITICAL] ms.den fazla
+ </floater.string>
+ <floater.string name="network_ping_warning_msg">
+ Bağlantı ping süresi [NETWORK_PING_WARNING]-[NETWORK_PING_CRITICAL] ms
+ </floater.string>
+ <floater.string name="network_packet_loss_cause_msg">
+ Muhtemel yetersiz bağlantı veya &apos;Bant Genişliği&apos; tercihi çok yüksek.
+ </floater.string>
+ <floater.string name="network_ping_cause_msg">
+ Muhtemel yetersiz bağlantı veya dosya paylaşım uygulaması.
+ </floater.string>
+ <floater.string name="server_text_msg">
+ Sunucu
+ </floater.string>
+ <floater.string name="server_frame_rate_critical_fps">
+ 20
+ </floater.string>
+ <floater.string name="server_frame_rate_warning_fps">
+ 30
+ </floater.string>
+ <floater.string name="server_single_process_max_time_ms">
+ 20
+ </floater.string>
+ <floater.string name="server_frame_time_critical_msg">
+ Simülatör kare hızı [SERVER_FRAME_RATE_CRITICAL] altında
+ </floater.string>
+ <floater.string name="server_frame_time_warning_msg">
+ Simülatör kare hızı [SERVER_FRAME_RATE_CRITICAL] ve [SERVER_FRAME_RATE_WARNING] arasında
+ </floater.string>
+ <floater.string name="server_frame_time_normal_msg">
+ Normal
+ </floater.string>
+ <floater.string name="server_physics_cause_msg">
+ Muhtemel Neden: Çok fazla fiziki nesne
+ </floater.string>
+ <floater.string name="server_scripts_cause_msg">
+ Muhtemel Neden: Çok fazla komut dosyalı nesne
+ </floater.string>
+ <floater.string name="server_net_cause_msg">
+ Muhtemel Neden: Çok fazla ağ trafiği
+ </floater.string>
+ <floater.string name="server_agent_cause_msg">
+ Muhtemel Neden: Bölgede hareket eden çok fazla insan var
+ </floater.string>
+ <floater.string name="server_images_cause_msg">
+ Muhtemel Neden: Çok fazla görüntü hesabı
+ </floater.string>
+ <floater.string name="server_generic_cause_msg">
+ Muhtemel Neden: Simülatör yükü çok ağır
+ </floater.string>
+ <floater.string name="smaller_label">
+ &gt;&gt;
+ </floater.string>
+ <floater.string name="bigger_label">
+ &lt;&lt;
+ </floater.string>
+ <button name="client_lagmeter" tool_tip="İstemci gecikme durumu"/>
+ <text name="client">
+ İstemci
+ </text>
+ <text name="client_text">
+ Normal
+ </text>
+ <button name="network_lagmeter" tool_tip="AÄŸ gecikme durumu"/>
+ <text name="network">
+ AÄŸ
+ </text>
+ <text name="network_text">
+ Normal
+ </text>
+ <button name="server_lagmeter" tool_tip="Sunucu gecikme durumu"/>
+ <text name="server">
+ Sunucu
+ </text>
+ <text name="server_text">
+ Normal
+ </text>
+ <button label="&gt;&gt;" name="minimize" tool_tip="Gezdirici büyüklüğünü değiştir"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_land_holdings.xml b/indra/newview/skins/default/xui/tr/floater_land_holdings.xml
new file mode 100644
index 0000000000..a075a93c1e
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_land_holdings.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="land holdings floater" title="ARAZİM">
+ <floater.string name="area_string">
+ [AREA] m²
+ </floater.string>
+ <scroll_list name="parcel list">
+ <scroll_list.columns label="Parsel" name="name"/>
+ <scroll_list.columns label="Bölge" name="location"/>
+ <scroll_list.columns label="Tür" name="type"/>
+ <scroll_list.columns label="Alan" name="area"/>
+ </scroll_list>
+ <button label="Işınla" label_selected="Işınla" name="Teleport" tool_tip="Bu arazinin merkezine ışınlama yapılsın."/>
+ <button label="Harita" label_selected="Harita" name="Show on Map" tool_tip="Bu arazi dünya haritasında gösterilsin"/>
+ <text name="contrib_label">
+ Gruplarınıza katkılar:
+ </text>
+ <scroll_list name="grant list">
+ <scroll_list.columns label="Grup" name="group"/>
+ <scroll_list.columns label="Alan" name="area"/>
+ </scroll_list>
+ <text name="allowed_label">
+ Mevcut ödeme planı kapsamında sahip olunmasına izin verilen araziler:
+ </text>
+ <text name="allowed_text">
+ [AREA] m²
+ </text>
+ <text name="current_label">
+ Åžu anda sahip olunan araziler:
+ </text>
+ <text name="current_text">
+ [AREA] m²
+ </text>
+ <text name="available_label">
+ Arazi satın alımı için kullanılabilir:
+ </text>
+ <text name="available_text">
+ [AREA] m²
+ </text>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_live_lsleditor.xml b/indra/newview/skins/default/xui/tr/floater_live_lsleditor.xml
new file mode 100644
index 0000000000..34c3e28a0b
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_live_lsleditor.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="script ed float" title="KOMUT DOSYASI: YENİ KOMUT DOSYASI">
+ <floater.string name="not_allowed">
+ Bu komut dosyasını görüntüleyemez veya düzenleyemezsiniz, çünkü &quot;kopyalanamaz&quot; olarak ayarlanmıştır. Bir nesnenin içerisindeki bir komut dosyasını görüntülemek veya düzenlemek için tam izinlere ihtiyacınız var.
+ </floater.string>
+ <floater.string name="script_running">
+ Çalışıyor
+ </floater.string>
+ <floater.string name="Title">
+ KOMUT DOSYASI: [NAME]
+ </floater.string>
+ <button label="Sıfırla" label_selected="Sıfırla" name="Reset"/>
+ <check_box initial_value="true" label="Çalışıyor" name="running"/>
+ <check_box initial_value="true" label="Mono" name="mono"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_lsl_guide.xml b/indra/newview/skins/default/xui/tr/floater_lsl_guide.xml
new file mode 100644
index 0000000000..0b898d6032
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_lsl_guide.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="script ed float" title="LSL REFERANSI">
+ <check_box label="İmleci izle" name="lock_check"/>
+ <combo_box label="Kilitle" name="history_combo"/>
+ <button label="Geri" name="back_btn"/>
+ <button label="İleri" name="fwd_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_map.xml b/indra/newview/skins/default/xui/tr/floater_map.xml
new file mode 100644
index 0000000000..7d6c314f04
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_map.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Map" title="MİNİ-HARİTA">
+ <floater.string name="ToolTipMsg">
+ [REGION](Haritayı açmak için çift tıkla, yatay hareket için shift çek)
+ </floater.string>
+ <floater.string name="AltToolTipMsg">
+ [REGION](Işınlamak için çift tıkla, yatay hareket için shift çek)
+ </floater.string>
+ <floater.string name="mini_map_caption">
+ Mini-harita
+ </floater.string>
+ <text label="K" name="floater_map_north">
+ K
+ </text>
+ <text label="E" name="floater_map_east">
+ E
+ </text>
+ <text label="B" name="floater_map_west">
+ B
+ </text>
+ <text label="G" name="floater_map_south">
+ G
+ </text>
+ <text label="GD" name="floater_map_southeast">
+ GD
+ </text>
+ <text label="KD" name="floater_map_northeast">
+ KD
+ </text>
+ <text label="GB" name="floater_map_southwest">
+ GB
+ </text>
+ <text label="KB" name="floater_map_northwest">
+ KB
+ </text>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_media_browser.xml b/indra/newview/skins/default/xui/tr/floater_media_browser.xml
new file mode 100644
index 0000000000..6cce4d59b8
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_media_browser.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_about" title="ORTAM TARAYICISI">
+ <floater.string name="home_page_url">
+ http://www.secondlife.com
+ </floater.string>
+ <floater.string name="support_page_url">
+ http://support.secondlife.com
+ </floater.string>
+ <layout_stack name="stack1">
+ <layout_panel name="nav_controls">
+ <button label="Geri" name="back"/>
+ <button label="İleri" name="forward"/>
+ <button label="Yeniden Yükle" name="reload"/>
+ <button label="Git" name="go"/>
+ </layout_panel>
+ <layout_panel name="time_controls">
+ <button label="baÅŸa sar" name="rewind"/>
+ <button label="durdur" name="stop"/>
+ <button label="ileri" name="seek"/>
+ </layout_panel>
+ <layout_panel name="parcel_owner_controls">
+ <button label="Mevcut Sayfayı Parsele Gönder" name="assign"/>
+ </layout_panel>
+ <layout_panel name="external_controls">
+ <button label="Web Tarayıcımda Aç" name="open_browser"/>
+ <check_box label="Her zaman web tarayıcımda aç" name="open_always"/>
+ <button label="Kapat" name="close"/>
+ </layout_panel>
+ </layout_stack>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_media_settings.xml b/indra/newview/skins/default/xui/tr/floater_media_settings.xml
new file mode 100644
index 0000000000..4205a0dbef
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_media_settings.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="media_settings" title="ORTAM AYARLARI">
+ <button label="Tamam" label_selected="Tamam" name="OK"/>
+ <button label="İptal" label_selected="İptal" name="Cancel"/>
+ <button label="Uygula" label_selected="Uygula" name="Apply"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_mem_leaking.xml b/indra/newview/skins/default/xui/tr/floater_mem_leaking.xml
new file mode 100644
index 0000000000..ba87ee99a4
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_mem_leaking.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="MemLeak" title="BİR BELLEK SIZINTISI BENZETİMİNİ GERÇEKLEŞTİR">
+ <spinner label="Sızıntı Hızı (çerçeve başına bayt):" name="leak_speed"/>
+ <spinner label="Maks Sızan Bellek (MB):" name="max_leak"/>
+ <text name="total_leaked_label">
+ Geçerli sızan bellek: [SIZE] KB
+ </text>
+ <text name="note_label_1">
+ [NOTE1]
+ </text>
+ <text name="note_label_2">
+ [NOTE2]
+ </text>
+ <button label="BaÅŸla" name="start_btn"/>
+ <button label="Durdur" name="stop_btn"/>
+ <button label="Bırak" name="release_btn"/>
+ <button label="Kapat" name="close_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_model_preview.xml b/indra/newview/skins/default/xui/tr/floater_model_preview.xml
new file mode 100644
index 0000000000..0c7cabc6ea
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_model_preview.xml
@@ -0,0 +1,277 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Model Preview" title="MODELİ KARŞIYA YÜKLE">
+ <string name="status_idle"/>
+ <string name="status_parse_error">
+ Hata: Tarih ayrıştırma sorunu - ayrıntılar için günlüğe bakın.
+ </string>
+ <string name="status_material_mismatch">
+ Hata: Modelin malzemesi, referans modelin bir alt kümesi değil.
+ </string>
+ <string name="status_reading_file">
+ Yükleniyor...
+ </string>
+ <string name="status_generating_meshes">
+ Örgüler Oluşturuluyor...
+ </string>
+ <string name="status_vertex_number_overflow">
+ Hata: Köşe numarası 65534&apos;ten fazla, işlem durduruldu!
+ </string>
+ <string name="bad_element">
+ Hata: Öğe geçersiz
+ </string>
+ <string name="high">
+ Yüksek
+ </string>
+ <string name="medium">
+ Orta
+ </string>
+ <string name="low">
+ Düşük
+ </string>
+ <string name="lowest">
+ En Düşük
+ </string>
+ <string name="mesh_status_good">
+ Uygula!
+ </string>
+ <string name="mesh_status_na">
+ G/D
+ </string>
+ <string name="mesh_status_none">
+ Hiçbiri
+ </string>
+ <string name="mesh_status_submesh_mismatch">
+ Ayrıntı seviyelerinde farklı sayıda dokulanabilir yüz var.
+ </string>
+ <string name="mesh_status_mesh_mismatch">
+ Ayrıntı seviyelerinde farklı sayıda örgü örneği var.
+ </string>
+ <string name="mesh_status_too_many_vertices">
+ Ayrıntı seviyesinde fazla sayıda köşe var.
+ </string>
+ <string name="mesh_status_missing_lod">
+ Gereken ayrıntı seviyesi eksik.
+ </string>
+ <string name="mesh_status_invalid_material_list">
+ Ayrıntı seviyesi malzemeleri, referans modelin bir alt kümesi değil.
+ </string>
+ <string name="layer_all">
+ Tümü
+ </string>
+ <string name="decomposing">
+ Çözümleniyor...
+ </string>
+ <string name="simplifying">
+ BasitleÅŸtiriliyor...
+ </string>
+ <string name="tbd">
+ ileride belirlenecektir
+ </string>
+ <panel name="left_panel">
+ <panel name="model_name_representation_panel">
+ <text name="name_label">
+ Model adı:
+ </text>
+ <text name="model_category_label">
+ Bu modelin temsil ettiÄŸi...
+ </text>
+ <combo_box name="model_category_combo">
+ <combo_item label="Birini Seçin..." name="Choose one"/>
+ <combo_item label="Avatar ÅŸekli" name="Avatar shape"/>
+ <combo_item label="Avatar aksesuarı" name="Avatar attachment"/>
+ <combo_item label="Hareket eden nesne (araç, hayvan)" name="Moving object (vehicle, animal)"/>
+ <combo_item label="Bina BileÅŸeni" name="Building Component"/>
+ <combo_item label="Büyük, hareketsiz, vs." name="Large, non moving etc"/>
+ <combo_item label="Daha küçük, hareketsiz, vs." name="Smaller, non-moving etc"/>
+ <combo_item label="Bunlardan herhangi biri deÄŸil" name="Not really any of these"/>
+ </combo_box>
+ </panel>
+ <tab_container name="import_tab">
+ <panel label="Ayrıntı Seviyesi" name="lod_panel" title="Ayrıntı Seviyesi">
+ <text initial_value="Kaynak" name="source" value="Kaynak"/>
+ <text initial_value="Üçgenler" name="triangles" value="Üçgenler"/>
+ <text initial_value="Köşeler" name="vertices" value="Köşeler"/>
+ <text initial_value="Yüksek" name="high_label" value="Yüksek"/>
+ <button label="Gözat..." name="lod_browse_high"/>
+ <text initial_value="0" name="high_triangles" value="0"/>
+ <text initial_value="0" name="high_vertices" value="0"/>
+ <text initial_value="Orta" name="medium_label" value="Orta"/>
+ <button label="Gözat..." name="lod_browse_medium"/>
+ <text initial_value="0" name="medium_triangles" value="0"/>
+ <text initial_value="0" name="medium_vertices" value="0"/>
+ <text initial_value="Düşük" name="low_label" value="Düşük"/>
+ <button label="Gözat..." name="lod_browse_low"/>
+ <text initial_value="0" name="low_triangles" value="0"/>
+ <text initial_value="0" name="low_vertices" value="0"/>
+ <text initial_value="En Düşük" name="lowest_label" value="En Düşük"/>
+ <button label="Gözat..." name="lod_browse_lowest"/>
+ <text initial_value="0" name="lowest_triangles" value="0"/>
+ <text initial_value="0" name="lowest_vertices" value="0"/>
+ <check_box label="Normalleri OluÅŸtur" name="gen_normals"/>
+ <text initial_value="Kıvrım Açısı:" name="crease_label" value="Kıvrım Açısı:"/>
+ <spinner name="crease_angle" value="75"/>
+ </panel>
+ <panel label="Fizik" name="physics_panel">
+ <panel name="physics geometry">
+ <text name="first_step_name">
+ 1. Adım: Ayrıntı Seviyesi
+ </text>
+ <combo_box name="physics_lod_combo" tool_tip="Fizik şekli için kullanılacak ayrıntı">
+ <combo_item name="choose_one">
+ Birini seçin...
+ </combo_item>
+ <combo_item name="physics_high">
+ Yüksek
+ </combo_item>
+ <combo_item name="physics_medium">
+ Orta
+ </combo_item>
+ <combo_item name="physics_low">
+ Düşük
+ </combo_item>
+ <combo_item name="physics_lowest">
+ En Düşük
+ </combo_item>
+ <combo_item name="load_from_file">
+ Dosyadan
+ </combo_item>
+ </combo_box>
+ <button label="Gözat..." name="physics_browse"/>
+ </panel>
+ <panel name="physics analysis">
+ <text name="method_label">
+ 2. Adım: Çözümle
+ </text>
+ <text name="analysis_method_label">
+ Yöntem:
+ </text>
+ <text name="quality_label">
+ Kalite:
+ </text>
+ <text name="smooth_method_label">
+ Düzeltme:
+ </text>
+ <check_box label="Delikleri Kapat" name="Close Holes (Slow)"/>
+ <button label="Çözümle" name="Decompose"/>
+ <button label="İptal" name="decompose_cancel"/>
+ </panel>
+ <panel name="physics simplification">
+ <text name="second_step_label">
+ 3. Adım: Basitleştir
+ </text>
+ <text name="simp_method_header">
+ Yöntem:
+ </text>
+ <text name="pass_method_header">
+ Geçişler:
+ </text>
+ <text name="Detail Scale label">
+ Ayrıntı ölçeği:
+ </text>
+ <text name="Retain%_label">
+ Koru:
+ </text>
+ <combo_box name="Combine Quality" value="1"/>
+ <button label="BasitleÅŸtir" name="Simplify"/>
+ <button label="İptal" name="simplify_cancel"/>
+ </panel>
+ <panel name="physics info">
+ <text name="results_text">
+ Sonuçlar:
+ </text>
+ <text name="physics_triangles">
+ Üçgenler: [TRIANGLES],
+ </text>
+ <text name="physics_points">
+ Köşeler: [POINTS],
+ </text>
+ <text name="physics_hulls">
+ Gövdeler: [HULLS]
+ </text>
+ </panel>
+ </panel>
+ <panel label="Karşıya yükleme seçenekleri" name="modifiers_panel">
+ <text name="scale_label">
+ Ölçek (1=ölçekleme yok):
+ </text>
+ <spinner name="import_scale" value="1.0"/>
+ <text name="dimensions_label">
+ Boyutlar:
+ </text>
+ <text name="import_dimensions">
+ [X] X [Y] X [Z]
+ </text>
+ <check_box label="Dokuları dahil et" name="upload_textures"/>
+ <text name="include_label">
+ Sadece avatar modelleri için:
+ </text>
+ <check_box label="Dış katman ağırlığını dahil et" name="upload_skin"/>
+ <check_box label="Eklem konumlarını dahil et" name="upload_joints"/>
+ <text name="pelvis_offset_label">
+ Z kayması (avatarı kaldırmak veya indirmek için):
+ </text>
+ <spinner name="pelvis_offset" value="0.0"/>
+ </panel>
+ </tab_container>
+ <panel name="weights_and_warning_panel">
+ <button label="Ağırlıkları ve ücreti hesapla" name="calculate_btn" tool_tip="Ağırlıkları ve ücreti hesapla"/>
+ <button label="İptal" name="cancel_btn"/>
+ <button label="Karşıya Yükle" name="ok_btn" tool_tip="Simülatöre karşıya yükle"/>
+ <button label="Ayarları temizle ve formu sıfırla" name="reset_btn"/>
+ <text name="upload_fee">
+ Karşıya yükleme ücreti: L$ [FEE]
+ </text>
+ <text name="prim_weight">
+ Arazi etkisi [EQ]
+ </text>
+ <text name="download_weight">
+ Karşıdan Yükle: [ST]
+ </text>
+ <text name="physics_weight">
+ Fizik: [PH]
+ </text>
+ <text name="server_weight">
+ Sunucu: [SIM]
+ </text>
+ <text name="warning_title">
+ NOT:
+ </text>
+ <text name="warning_message">
+ Örgü modellerini karşıya yüklemeye hakkınız yok. Nasıl onaylanacağınızı [[VURL] öğrenin].
+ </text>
+ <text name="status">
+ [STATUS]
+ </text>
+ </panel>
+ </panel>
+ <text name="lod_label">
+ Önizleme:
+ </text>
+ <panel name="right_panel">
+ <combo_box name="preview_lod_combo" tool_tip="Önizleme işlemesinde görülecek ayrıntı seviyesi">
+ <combo_item name="high">
+ Yüksek
+ </combo_item>
+ <combo_item name="medium">
+ Orta
+ </combo_item>
+ <combo_item name="low">
+ Düşük
+ </combo_item>
+ <combo_item name="lowest">
+ En Düşük
+ </combo_item>
+ </combo_box>
+ <text name="label_display">
+ Ekran...
+ </text>
+ <check_box label="Kenarlar" name="show_edges"/>
+ <check_box label="Fizik" name="show_physics"/>
+ <check_box label="Dokular" name="show_textures"/>
+ <check_box label="Dış katman ağırlıkları" name="show_skin_weight"/>
+ <check_box label="Eklemler" name="show_joint_positions"/>
+ <text name="physics_explode_label">
+ Önizleme Yayılımı:
+ </text>
+ </panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_model_wizard.xml b/indra/newview/skins/default/xui/tr/floater_model_wizard.xml
new file mode 100644
index 0000000000..b3c72ba2da
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_model_wizard.xml
@@ -0,0 +1,208 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Model Wizard" title="KARŞIYA MODEL YÜKLEME SİHİRBAZI">
+ <button label="5. Karşıya Yükle" name="upload_btn"/>
+ <button label="4. İncele" name="review_btn"/>
+ <button label="3. Fizik" name="physics_btn"/>
+ <button label="2. Optimize et" name="optimize_btn"/>
+ <button label="1. Dosya Seç" name="choose_file_btn"/>
+ <panel name="choose_file_panel">
+ <panel name="header_panel">
+ <text name="header_text">
+ Model dosyasını seçin
+ </text>
+ </panel>
+ <panel name="content">
+ <text name="advanced_users_text">
+ Gelişmiş kullanıcılar: Eğer 3B içerik oluşturma araçlarını kullanmayı biliyorsanız, Gelişmiş Karşıya Yükleyiciyi kullanmak isteyebilirsiniz.
+ </text>
+ <button label="Gelişmişe geç" name="switch_to_advanced"/>
+ <text name="Cache location">
+ Karşıya yüklenecek model dosyasını seçin
+ </text>
+ <button label="Gözat..." label_selected="Gözat..." name="browse"/>
+ <text name="Model types">
+ Second Life, COLLADA (.dae) dosyalarını destekler
+ </text>
+ <text name="dimensions">
+ X Y Z
+ </text>
+ <text name="warning_label">
+ UYARI:
+ </text>
+ <text name="warning_text">
+ Bu modelin Second Life sunucularına nihai karşıya yükleme adımını tamamlayamayacaksınız. Hesabınızı örgü modellerinin karşıya yüklenmesi için ayarlamanın [secondlife:///app/floater/learn_more nasıl yapılacağını öğrenin].
+ </text>
+ </panel>
+ </panel>
+ <panel name="optimize_panel">
+ <panel name="header_panel">
+ <text name="header_text">
+ Modeli optimize et
+ </text>
+ </panel>
+ <text name="description">
+ Modeli performans için optimize ettik. İstiyorsanız daha da ayarlayabilirsiniz.
+ </text>
+ <panel name="content">
+ <text name="high_detail_text">
+ Ayrıntı Seviyesi Oluştur: Yüksek
+ </text>
+ <text name="medium_detail_text">
+ Ayrıntı Seviyesi Oluştur: Orta
+ </text>
+ <text name="low_detail_text">
+ Ayrıntı Seviyesi Oluştur: Düşük
+ </text>
+ <text name="lowest_detail_text">
+ Ayrıntı Seviyesi Oluştur: En Düşük
+ </text>
+ </panel>
+ <panel name="content2">
+ <button label="Geometri hesaplarını tekrar yap" name="recalculate_geometry_btn"/>
+ <text name="lod_label">
+ Geometri önizleme
+ </text>
+ <combo_box name="preview_lod_combo" tool_tip="Önizleme işlemesinde görülecek ayrıntı seviyesi">
+ <combo_item name="high">
+ Çok ayrıntı
+ </combo_item>
+ <combo_item name="medium">
+ Orta düzey ayrıntı
+ </combo_item>
+ <combo_item name="low">
+ Az ayrıntı
+ </combo_item>
+ <combo_item name="lowest">
+ En az ayrıntı
+ </combo_item>
+ </combo_box>
+ </panel>
+ </panel>
+ <panel name="physics_panel">
+ <panel name="header_panel">
+ <text name="header_text">
+ Fizik ayarlarını yap
+ </text>
+ </panel>
+ <text name="description">
+ Modelin dış gövdesi için bir şekil oluşturacağız. Modelinizin amacına uygun olarak şeklin ayrıntı seviyesini belirleyin.
+ </text>
+ <panel name="content">
+ <button label="Fizik hesaplarını tekrar yap" name="recalculate_physics_btn"/>
+ <button label="Tekrar hesaplanıyor..." name="recalculating_physics_btn"/>
+ <text name="lod_label">
+ Fizik önizleme
+ </text>
+ <combo_box name="preview_lod_combo2" tool_tip="Önizleme işlemesinde görülecek ayrıntı seviyesi">
+ <combo_item name="high">
+ Çok ayrıntı
+ </combo_item>
+ <combo_item name="medium">
+ Orta düzey ayrıntı
+ </combo_item>
+ <combo_item name="low">
+ Az ayrıntı
+ </combo_item>
+ <combo_item name="lowest">
+ En az ayrıntı
+ </combo_item>
+ </combo_box>
+ </panel>
+ </panel>
+ <panel name="review_panel">
+ <panel name="header_panel">
+ <text name="header_text">
+ İncele
+ </text>
+ </panel>
+ <panel name="content">
+ <text name="review_prim_equiv">
+ Parsele/bölgeye etkisi: [EQUIV] prim eşdeğerleri
+ </text>
+ <text name="review_fee">
+ Hesabınızdan L$ [FEE] karşıya yükleme ücreti düşülecektir.
+ </text>
+ <text name="review_confirmation">
+ Karşıya yükleme düğmesine tıkladığınızda, modelde yer alan malzeme için ilgili haklara sahip olduğunuzu teyid edersiniz.
+ </text>
+ </panel>
+ </panel>
+ <panel name="upload_panel">
+ <panel name="header_panel">
+ <text name="header_text">
+ Karşıya yükleme bitti
+ </text>
+ </panel>
+ <text name="model_uploaded_text">
+ Modeliniz karşıya yüklendi.
+ </text>
+ <text name="inventory_text">
+ Bunu, envanterinizdeki Nesneler klasöründe bulacaksınız.
+ </text>
+ <text name="charged_fee">
+ Hesabınızdan L$ [FEE] düşüldü.
+ </text>
+ </panel>
+ <button label="&lt;&lt; Geri" name="back"/>
+ <button label="Sonraki &gt;&gt;" name="next"/>
+ <button label="Ağırlıkları ve ücreti hesapla &gt;&gt;" name="calculate"/>
+ <button label="Hesaplanıyor..." name="calculating"/>
+ <button label="Karşıya Yükle" name="upload" tool_tip="Simülatöre karşıya yükle"/>
+ <button label="İptal" name="cancel"/>
+ <button label="Kapat" name="close"/>
+ <spinner name="import_scale" value="1.0"/>
+ <string name="status_idle">
+ BoÅŸta
+ </string>
+ <string name="status_parse_error">
+ Dae ayrıştırma sorunu - ayrıntılar için günlüğe bakın.
+ </string>
+ <string name="status_reading_file">
+ Yükleniyor...
+ </string>
+ <string name="status_generating_meshes">
+ Örgüler Oluşturuluyor...
+ </string>
+ <string name="status_vertex_number_overflow">
+ Hata: Köşe numarası 65534&apos;ten fazla, işlem durduruldu!
+ </string>
+ <string name="bad_element">
+ Hata: Öğe geçersiz
+ </string>
+ <string name="high">
+ Yüksek
+ </string>
+ <string name="medium">
+ Orta
+ </string>
+ <string name="low">
+ Düşük
+ </string>
+ <string name="lowest">
+ En Düşük
+ </string>
+ <string name="mesh_status_good">
+ Uygula!
+ </string>
+ <string name="mesh_status_na">
+ G/D
+ </string>
+ <string name="mesh_status_none">
+ Hiçbiri
+ </string>
+ <string name="mesh_status_submesh_mismatch">
+ Ayrıntı seviyelerinde farklı sayıda dokulanabilir yüz var.
+ </string>
+ <string name="mesh_status_mesh_mismatch">
+ Ayrıntı seviyelerinde farklı sayıda örgü örneği var.
+ </string>
+ <string name="mesh_status_too_many_vertices">
+ Ayrıntı seviyesinde fazla sayıda köşe var.
+ </string>
+ <string name="mesh_status_missing_lod">
+ Gereken ayrıntı seviyesi eksik.
+ </string>
+ <string name="layer_all">
+ Tümü
+ </string>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_moveview.xml b/indra/newview/skins/default/xui/tr/floater_moveview.xml
new file mode 100644
index 0000000000..9226218a24
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_moveview.xml
@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="move_floater" title="YÜRÜ / KOŞ / UÇ">
+ <string name="walk_forward_tooltip">
+ İleri Yürü (Yukarı Okuna veya W&apos;ye basın)
+ </string>
+ <string name="walk_back_tooltip">
+ Geri Yürü (Aşağı Okuna veya S&apos;ye basın)
+ </string>
+ <string name="walk_left_tooltip">
+ Sola Yürü (Shift + Sol Oka veya A&apos;ya basın)
+ </string>
+ <string name="walk_right_tooltip">
+ Sağa Yürü (Shift + Sağ Oka veya D&apos;ye basın)
+ </string>
+ <string name="run_forward_tooltip">
+ İleri Koş (Yukarı Okuna veya W&apos;ye basın)
+ </string>
+ <string name="run_back_tooltip">
+ Geri Koş (Aşağı Okuna veya S&apos;ye basın)
+ </string>
+ <string name="run_left_tooltip">
+ Sola Koş (Shift + Sol Oka veya A&apos;ya basın)
+ </string>
+ <string name="run_right_tooltip">
+ Sağa Koş (Shift + Sağ Oka veya D&apos;ye basın)
+ </string>
+ <string name="fly_forward_tooltip">
+ İleri Uç (Yukarı Okuna veya W&apos;ye basın)
+ </string>
+ <string name="fly_back_tooltip">
+ Geri Uç (Aşağı Okuna veya S&apos;ye basın)
+ </string>
+ <string name="fly_left_tooltip">
+ Sola Uç (Shift + Sol Oka veya A&apos;ya basın)
+ </string>
+ <string name="fly_right_tooltip">
+ Sağa Uç (Shift + Sağ Oka veya D&apos;ye basın)
+ </string>
+ <string name="fly_up_tooltip">
+ Yukarı Uç (E&apos;ye basın)
+ </string>
+ <string name="fly_down_tooltip">
+ Aşağı Uç (C&apos;ye basın)
+ </string>
+ <string name="jump_tooltip">
+ Atla (E&apos;ye basın)
+ </string>
+ <string name="crouch_tooltip">
+ Çömel (C&apos;ye basın)
+ </string>
+ <string name="walk_title">
+ Yürü
+ </string>
+ <string name="run_title">
+ KoÅŸ
+ </string>
+ <string name="fly_title">
+ Uç
+ </string>
+ <panel name="panel_actions">
+ <button name="turn left btn" tool_tip="Sola Dön (Sol Oka veya A&apos;ya basın)"/>
+ <joystick_slide name="move left btn" tool_tip="Sola Yürü (Shift + Sol Oka veya A&apos;ya basın)"/>
+ <button name="turn right btn" tool_tip="Sağa Dön (Sağ Oka veya D&apos;ye basın)"/>
+ <joystick_slide name="move right btn" tool_tip="Sağa Yürü (Shift + Sağ Oka veya D&apos;ye basın)"/>
+ <joystick_turn name="forward btn" tool_tip="İleri Yürü (Yukarı Okuna veya W&apos;ye basın)"/>
+ <joystick_turn name="backward btn" tool_tip="Geri Yürü (Aşağı Okuna veya S&apos;ye basın)"/>
+ <button name="move up btn" tool_tip="Yukarı Uç (E&apos;ye basın)"/>
+ <button name="move down btn" tool_tip="Aşağı Uç (C&apos;ye basın)"/>
+ </panel>
+ <panel name="panel_modes">
+ <button label="" name="mode_walk_btn" tool_tip="Yürüme modu"/>
+ <button label="" name="mode_run_btn" tool_tip="KoÅŸma modu"/>
+ <button label="" name="mode_fly_btn" tool_tip="Uçma modu"/>
+ </panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_mute_object.xml b/indra/newview/skins/default/xui/tr/floater_mute_object.xml
new file mode 100644
index 0000000000..becad38a8e
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_mute_object.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="block by name" title="NESNEYİ ADINA GÖRE ENGELLE">
+ <text name="message">
+ Bir nesneyi engelle
+ </text>
+ <line_editor name="object_name">
+ Nesne adı
+ </line_editor>
+ <text name="note">
+ * Sadece nesne metnini engeller, sesleri engellemez
+ </text>
+ <button label="Tamam" name="OK"/>
+ <button label="İptal" name="Cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_my_appearance.xml b/indra/newview/skins/default/xui/tr/floater_my_appearance.xml
new file mode 100644
index 0000000000..4d71187a1f
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_my_appearance.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_my_appearance" title="GÖRÜNÜM">
+ <panel label="Görünümü Düzenle" name="main_panel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_my_inventory.xml b/indra/newview/skins/default/xui/tr/floater_my_inventory.xml
new file mode 100644
index 0000000000..8c62692a88
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_my_inventory.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_my_inventory" title="ENVANTER"/>
diff --git a/indra/newview/skins/default/xui/tr/floater_nearby_chat.xml b/indra/newview/skins/default/xui/tr/floater_nearby_chat.xml
new file mode 100644
index 0000000000..6b12ad0ef5
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_nearby_chat.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="nearby_chat" title="YAKINDAKİ SOHBET">
+ <check_box label="Sohbeti çevir" name="translate_chat_checkbox"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_notification.xml b/indra/newview/skins/default/xui/tr/floater_notification.xml
new file mode 100644
index 0000000000..89a56348f6
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_notification.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="notification" title="BİLDİRİMLER KONSOLU">
+ <text_editor name="payload">
+ Yükleniyor...
+ </text_editor>
+ <combo_box label="Yanıt" name="response"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_notifications_console.xml b/indra/newview/skins/default/xui/tr/floater_notifications_console.xml
new file mode 100644
index 0000000000..e4eaf2cf9e
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_notifications_console.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="notifications_console" title="BİLDİRİMLER KONSOLU">
+ <combo_box label="Bildirim türünü seç" name="notification_types"/>
+ <button label="Ekle" name="add_notification"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_object_weights.xml b/indra/newview/skins/default/xui/tr/floater_object_weights.xml
new file mode 100644
index 0000000000..b57943f666
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_object_weights.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="object_weights" title="GELİŞMİŞ">
+ <floater.string name="nothing_selected" value="--"/>
+ <text name="selected_text" value="SEÇİLİ"/>
+ <text name="objects" value="--"/>
+ <text name="objects_label" value="Nesneler"/>
+ <text name="prims" value="--"/>
+ <text name="prims_label" value="Primler"/>
+ <text name="weights_of_selected_text" value="SEÇİLENLERİN AĞIRLIKLARI"/>
+ <text name="download" value="--"/>
+ <text name="download_label" value="Karşıdan yükle"/>
+ <text name="physics" value="--"/>
+ <text name="physics_label" value="Fizik"/>
+ <text name="server" value="--"/>
+ <text name="server_label" value="Sunucu"/>
+ <text name="display" value="--"/>
+ <text name="display_label" value="Ekran"/>
+ <text name="land_impacts_text" value="ARAZİ ETKİLERİ"/>
+ <text name="selected" value="--"/>
+ <text name="selected_label" value="Seçili"/>
+ <text name="rezzed_on_land" value="--"/>
+ <text name="rezzed_on_land_label" value="Arazide oluÅŸturulmuÅŸ"/>
+ <text name="remaining_capacity" value="--"/>
+ <text name="remaining_capacity_label" value="Kalan kapasite"/>
+ <text name="total_capacity" value="--"/>
+ <text name="total_capacity_label" value="Toplam kapasite"/>
+ <text name="help_SLURL" value="[secondlife:///app/help/object_weights Bunların tümü ne?...]"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_openobject.xml b/indra/newview/skins/default/xui/tr/floater_openobject.xml
new file mode 100644
index 0000000000..9980aee97f
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_openobject.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="objectcontents" title="NESNE İÇERİKLERİ">
+ <text name="object_name">
+ [DESC]:
+ </text>
+ <button label="Envantere Kopyala" label_selected="Envantere Kopyala" name="copy_to_inventory_button"/>
+ <button label="Kopyala ve Giy" label_selected="Kopyala ve Giy" name="copy_and_wear_button"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_outfit_save_as.xml b/indra/newview/skins/default/xui/tr/floater_outfit_save_as.xml
new file mode 100644
index 0000000000..7a9f507c93
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_outfit_save_as.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="modal container" title="DIŞ GÖRÜNÜMÜ KAYDET">
+ <button label="Kaydet" label_selected="Kaydet" name="Save"/>
+ <button label="İptal" label_selected="İptal" name="Cancel"/>
+ <text name="Save item as:">
+ Üzerimdekileri yeni bir
+Dış Görünüm olarak kaydet:
+ </text>
+ <line_editor name="name ed">
+ [DESC] (yeni)
+ </line_editor>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_outgoing_call.xml b/indra/newview/skins/default/xui/tr/floater_outgoing_call.xml
new file mode 100644
index 0000000000..7ba4580f4f
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_outgoing_call.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="outgoing call" title="ARIYOR">
+ <floater.string name="lifetime">
+ 5
+ </floater.string>
+ <floater.string name="localchat">
+ Yakındaki Sesli Sohbet
+ </floater.string>
+ <floater.string name="anonymous">
+ anonim
+ </floater.string>
+ <floater.string name="VoiceInviteP2P">
+ arıyor.
+ </floater.string>
+ <floater.string name="VoiceInviteAdHoc">
+ bir Sesli Sohbet aramasına bir konferans araması ile katıldı.
+ </floater.string>
+ <text name="connecting">
+ [CALLEE_NAME] bağlanıyor
+ </text>
+ <text name="calling">
+ [CALLEE_NAME] aranıyor
+ </text>
+ <text name="noanswer">
+ Cevap Yok. Lütfen daha sonra tekrar deneyin.
+ </text>
+ <text name="nearby">
+ [VOICE_CHANNEL_NAME] ile bağlantınız kesildi. [RECONNECT_NEARBY]
+ </text>
+ <text name="nearby_P2P_by_other">
+ Aramanız bitti. [RECONNECT_NEARBY]
+ </text>
+ <text name="nearby_P2P_by_agent">
+ Aramayı bitirdiniz. [RECONNECT_NEARBY]
+ </text>
+ <text name="leaving">
+ [CURRENT_CHAT] bırakılıyor.
+ </text>
+ <button label="İptal" label_selected="İptal" name="Cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_pay.xml b/indra/newview/skins/default/xui/tr/floater_pay.xml
new file mode 100644
index 0000000000..6604e5c37a
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_pay.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Give Money">
+ <string name="payee_group">
+ Gruba Öde
+ </string>
+ <string name="payee_resident">
+ Sakine Öde
+ </string>
+ <text name="payee_name">
+ Kırpmayı Kontrol İçin Test Adı Çok Uzun
+ </text>
+ <button label="L$1" label_selected="L$1" name="fastpay 1"/>
+ <button label="L$5" label_selected="L$5" name="fastpay 5"/>
+ <button label="L$10" label_selected="L$10" name="fastpay 10"/>
+ <button label="L$20" label_selected="L$20" name="fastpay 20"/>
+ <text name="amount text">
+ veya tutarı seç:
+ </text>
+ <button label="Öde" label_selected="Öde" name="pay btn"/>
+ <button label="İptal" label_selected="İptal" name="cancel btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_pay_object.xml b/indra/newview/skins/default/xui/tr/floater_pay_object.xml
new file mode 100644
index 0000000000..7772d3b101
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_pay_object.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Give Money">
+ <string name="payee_group">
+ Gruba Öde
+ </string>
+ <string name="payee_resident">
+ Sakine Öde
+ </string>
+ <text name="payee_name">
+ Ericacita Moostopolison
+ </text>
+ <text name="object_name_label">
+ Nesne yoluyla:
+ </text>
+ <icon name="icon_object" tool_tip="Nesneler"/>
+ <text name="object_name_text">
+ Harika nesnem gerçekten uzun bir adla
+ </text>
+ <button label="L$1" label_selected="L$1" name="fastpay 1"/>
+ <button label="L$5" label_selected="L$5" name="fastpay 5"/>
+ <button label="L$10" label_selected="L$10" name="fastpay 10"/>
+ <button label="L$20" label_selected="L$20" name="fastpay 20"/>
+ <text name="amount text">
+ veya tutarı seç:
+ </text>
+ <button label="Öde" label_selected="Öde" name="pay btn"/>
+ <button label="İptal" label_selected="İptal" name="cancel btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_people.xml b/indra/newview/skins/default/xui/tr/floater_people.xml
new file mode 100644
index 0000000000..94a27bff57
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_people.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_people" title="KİŞİLER">
+ <panel_container name="main_panel">
+ <panel label="Grup Profili" name="panel_group_info_sidetray"/>
+ <panel label="EngellenmiÅŸ Sakinler ve Nesneler" name="panel_block_list_sidetray"/>
+ </panel_container>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_perm_prefs.xml b/indra/newview/skins/default/xui/tr/floater_perm_prefs.xml
new file mode 100644
index 0000000000..669b833c26
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_perm_prefs.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="perm prefs" title="VARSAYILAN KARŞIYA YÜKLEME İZİNLERİ">
+ <panel label="İzinler" name="permissions">
+ <check_box label="Grupla paylaÅŸ" name="share_with_group"/>
+ <check_box label="Herkese kopyalama izni ver" name="everyone_copy"/>
+ <text name="NextOwnerLabel">
+ Sonraki sahip ÅŸunu yapabilir:
+ </text>
+ <check_box label="DeÄŸiÅŸtir" name="next_owner_modify"/>
+ <check_box label="Kopyala" name="next_owner_copy"/>
+ <check_box initial_value="true" label="Tekrar sat/Ver" name="next_owner_transfer"/>
+ </panel>
+ <button label="Tamam" label_selected="Tamam" name="ok"/>
+ <button label="İptal" label_selected="İptal" name="cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_picks.xml b/indra/newview/skins/default/xui/tr/floater_picks.xml
new file mode 100644
index 0000000000..513a2e319a
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_picks.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_picks" title="Seçmeler"/>
diff --git a/indra/newview/skins/default/xui/tr/floater_places.xml b/indra/newview/skins/default/xui/tr/floater_places.xml
new file mode 100644
index 0000000000..4e09a699f6
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_places.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_places" title="YERLER">
+ <panel label="Yerler" name="main_panel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_post_process.xml b/indra/newview/skins/default/xui/tr/floater_post_process.xml
new file mode 100644
index 0000000000..5e419f8ffa
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_post_process.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Post-Process Floater" title="İŞLEM SONRASI AYARLARI">
+ <tab_container name="Post-Process Tabs">
+ <panel label="Renk Filtresi" name="wmiColorFilterPanel">
+ <check_box label="EtkinleÅŸtir" name="wmiColorFilterToggle"/>
+ <text name="wmiColorFilterBrightnessText">
+ Parlaklık
+ </text>
+ <text name="wmiColorFilterSaturationText">
+ Doygunluk
+ </text>
+ <text name="wmiColorFilterContrastText">
+ Kontrast
+ </text>
+ <text name="wmiColorFilterBaseText">
+ Kontrast Baz Rengi
+ </text>
+ <slider label="R" name="wmiColorFilterBaseR"/>
+ <slider label="G" name="wmiColorFilterBaseG"/>
+ <slider label="B" name="wmiColorFilterBaseB"/>
+ <slider label="I" name="wmiColorFilterBaseI"/>
+ </panel>
+ <panel label="Gece Görüşü" name="wmiNightVisionPanel">
+ <check_box label="EtkinleÅŸtir" name="wmiNightVisionToggle"/>
+ <text name="wmiNightVisionBrightMultText">
+ Işık Yükseltme Çarpanı
+ </text>
+ <text name="wmiNightVisionNoiseSizeText">
+ Gürültü Büyüklüğü
+ </text>
+ <text name="wmiNightVisionNoiseStrengthText">
+ Gürültü Gücü
+ </text>
+ </panel>
+ <panel label="Işıma" name="wmiBloomPanel">
+ <check_box label="EtkinleÅŸtir" name="wmiBloomToggle"/>
+ <text name="wmiBloomExtractText">
+ Parlaklık Çıkarma
+ </text>
+ <text name="wmiBloomSizeText">
+ Işıma Büyüklüğü
+ </text>
+ <text name="wmiBloomStrengthText">
+ Işıma Gücü
+ </text>
+ </panel>
+ <panel label="Ekstralar" name="Extras">
+ <button label="EfektYükle" label_selected="EfektYükle" name="PPLoadEffect"/>
+ <button label="EfektKaydet" label_selected="EfektKaydet" name="PPSaveEffect"/>
+ <line_editor label="Efekt Adı" name="PPEffectNameEditor"/>
+ </panel>
+ </tab_container>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_postcard.xml b/indra/newview/skins/default/xui/tr/floater_postcard.xml
new file mode 100644
index 0000000000..ef11c68afe
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_postcard.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Postcard" title="ANLIK GÖRÜNTÜYÜ E-POSTAYLA GÖNDER">
+ <floater.string name="default_subject">
+ SECOND_LIFE]&apos;dan posta kartı.
+ </floater.string>
+ <floater.string name="default_message">
+ Buna bakın!
+ </floater.string>
+ <floater.string name="upload_message">
+ Gönderiyor...
+ </floater.string>
+ <text name="to_label">
+ Alıcının E-postası:
+ </text>
+ <text name="from_label">
+ E-postanız:
+ </text>
+ <text name="name_label">
+ Adınız:
+ </text>
+ <text name="subject_label">
+ Konu:
+ </text>
+ <line_editor label="Konunuzu buraya yazın." name="subject_form"/>
+ <text name="msg_label">
+ İleti:
+ </text>
+ <text_editor name="msg_form">
+ İletinizi buraya yazın.
+ </text_editor>
+ <button label="İptal" name="cancel_btn"/>
+ <button label="Gönder" name="send_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_preferences.xml b/indra/newview/skins/default/xui/tr/floater_preferences.xml
new file mode 100644
index 0000000000..edb3c19b81
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_preferences.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Preferences" title="TERCİHLER">
+ <button label="Tamam" label_selected="Tamam" name="OK"/>
+ <button label="İptal" label_selected="İptal" name="Cancel"/>
+ <tab_container name="pref core">
+ <panel label="Genel" name="general"/>
+ <panel label="Grafikler" name="display"/>
+ <panel label="Ses ve Ortamlar" name="audio"/>
+ <panel label="Sohbet" name="chat"/>
+ <panel label="Hareket ve Görünümler" name="move"/>
+ <panel label="Bildirimler" name="msgs"/>
+ <panel label="Renkler" name="colors"/>
+ <panel label="Gizlilik" name="im"/>
+ <panel label="Ayarlar" name="input"/>
+ <panel label="GeliÅŸmiÅŸ" name="advanced1"/>
+ </tab_container>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_preferences_proxy.xml b/indra/newview/skins/default/xui/tr/floater_preferences_proxy.xml
new file mode 100644
index 0000000000..1c462e6ebf
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_preferences_proxy.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Proxy Settings Floater" title="Proxy Ayarları">
+ <check_box initial_value="false" label="Web sayfaları için HTTP Proxy kullan" name="web_proxy_enabled"/>
+ <text name="http_proxy_label">
+ HTTP Proxy:
+ </text>
+ <line_editor name="web_proxy_editor" tool_tip="Kullanmak istediğiniz HTTP proxy&apos;nin DNS adı veya IP adresi."/>
+ <spinner label="Port numarası:" name="web_proxy_port" tool_tip="Kullanmak istediğiniz HTTP proxy&apos;nin portu."/>
+ <check_box label="UDP trafiği için SOCKS 5 Proxy kullan" name="socks_proxy_enabled"/>
+ <text name="socks5_proxy_label">
+ SOCKS 5 Proxy:
+ </text>
+ <line_editor name="socks_proxy_editor" tool_tip="Kullanmak istediğiniz SOCKS 5 proxy&apos;nin DNS adı veya IP adresi."/>
+ <spinner label="Port numarası:" name="socks_proxy_port" tool_tip="Kullanmak istediğiniz SOCKS 5 proxy&apos;nin portu."/>
+ <text name="socks_auth_label">
+ SOCKS Kimlik DoÄŸrulama:
+ </text>
+ <radio_group name="socks5_auth_type">
+ <radio_item label="Kimlik Doğrulama Yok" name="Socks5NoAuth" tool_tip="Socks5 proxy&apos;si kimlik doğrulama gerektirmiyor." value="Hiçbiri"/>
+ <radio_item label="Kullanıcı Adı/Parola" name="Socks5UserPass" tool_tip="Socks5 proxy&apos;si kullanıcı adı/parola doğrulaması gerektiriyor." value="UserPass"/>
+ </radio_group>
+ <text name="socks5_username_label">
+ Kullanıcı Adı:
+ </text>
+ <text name="socks5_password_label">
+ Parola:
+ </text>
+ <line_editor name="socks5_username" tool_tip="SOCKS 5 sunucunuzda kimlik doğrulaması yapmak için kullanılan kullanıcı adı"/>
+ <line_editor name="socks5_password" tool_tip="SOCKS 5 sunucunuzda kimlik doğrulaması yapmak için kullanılan parola"/>
+ <text name="other_proxy_label">
+ DiÄŸer HTTP trafiÄŸi proxy&apos;si:
+ </text>
+ <radio_group name="other_http_proxy_type">
+ <radio_item label="Proxy kullanılmasın" name="OtherNoProxy" tool_tip="Web dışı HTTP trafiği herhangi bir proxy&apos;ye gönderilmez." value="Hiçbiri"/>
+ <radio_item label="HTTP Proxy&apos;si kullan" name="OtherHTTPProxy" tool_tip="Web dışı HTTP trafiği yapılandırılmış web proxy&apos;si üzerinden gönderilir." value="Web"/>
+ <radio_item label="SOCKS 5 Proxy&apos;si kullan" name="OtherSocksProxy" tool_tip="Web dışı HTTP trafiği yapılandırılmış Socks 5 proxy&apos;si üzerinden gönderilir." value="Socks"/>
+ </radio_group>
+ <button label="Tamam" label_selected="Tamam" name="OK"/>
+ <button label="İptal" label_selected="İptal" name="Cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_preview_animation.xml b/indra/newview/skins/default/xui/tr/floater_preview_animation.xml
new file mode 100644
index 0000000000..1c526c75f9
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_preview_animation.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="preview_anim">
+ <floater.string name="Title">
+ Animasyon: [NAME]
+ </floater.string>
+ <text name="desc txt">
+ Açıklama:
+ </text>
+ <button label="SL Dünyasında Oynat" label_selected="Durdur" name="Anim play btn" tool_tip="Bu animasyonu başkaları görebilecek şekilde oynatın"/>
+ <button label="Yerel Olarak Oynat" label_selected="Durdur" name="Anim audition btn" tool_tip="Bu animasyonu sadece kendinizin görebileceği şekilde oynatın"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_preview_gesture.xml b/indra/newview/skins/default/xui/tr/floater_preview_gesture.xml
new file mode 100644
index 0000000000..dc6f66f657
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_preview_gesture.xml
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="gesture_preview">
+ <floater.string name="step_anim">
+ Oynatılacak animasyon:
+ </floater.string>
+ <floater.string name="step_sound">
+ Çalınacak ses:
+ </floater.string>
+ <floater.string name="step_chat">
+ KonuÅŸulacak sohbet:
+ </floater.string>
+ <floater.string name="step_wait">
+ Bekle:
+ </floater.string>
+ <floater.string name="stop_txt">
+ Durdur
+ </floater.string>
+ <floater.string name="preview_txt">
+ Önizleme
+ </floater.string>
+ <floater.string name="none_text">
+ -- Hiçbiri --
+ </floater.string>
+ <floater.string name="Title">
+ Mimik: [NAME]
+ </floater.string>
+ <text name="desc_label">
+ Açıklama:
+ </text>
+ <text name="trigger_label">
+ Tetikleyici:
+ </text>
+ <text name="replace_text" tool_tip="Tetikleyici kelimelerinin yerine bunları koyun. Örneğin, &apos;merhaba&apos; yerine &apos;naber&apos; konulması tetikleyicisi ile &quot;merhaba demek istemiştim&quot; sohbeti &quot;naber demek istemiştim olacak ve mimik gerçekleştirilecektir!">
+ Yerine ÅŸunu koy:
+ </text>
+ <line_editor name="replace_editor" tool_tip="Tetikleyici kelimelerinin yerine bunları koyun. Örneğin, &apos;merhaba&apos; yerine &apos;naber&apos; konulması tetikleyicisi ile &quot;merhaba demek istemiştim&quot; sohbeti &quot;naber demek istemiştim olacak ve mimik gerçekleştirilecektir"/>
+ <text name="key_label">
+ Kısayol Tuşu:
+ </text>
+ <combo_box label="Hiçbiri" name="modifier_combo"/>
+ <combo_box label="Hiçbiri" name="key_combo"/>
+ <text name="library_label">
+ Kütüphane:
+ </text>
+ <scroll_list name="library_list">
+ <scroll_list.rows name="action_animation" value="Animasyon"/>
+ <scroll_list.rows name="action_sound" value="Ses"/>
+ <scroll_list.rows name="action_chat" value="Sohbet"/>
+ <scroll_list.rows name="action_wait" value="Bekle"/>
+ </scroll_list>
+ <button label="Ekle &gt;&gt;" name="add_btn"/>
+ <text name="steps_label">
+ Adımlar:
+ </text>
+ <button label="Yukarı" name="up_btn"/>
+ <button label="Aşağı" name="down_btn"/>
+ <button label="Kaldır" name="delete_btn"/>
+ <text name="options_text">
+ (seçenekler)
+ </text>
+ <radio_group name="animation_trigger_type">
+ <radio_item label="BaÅŸla" name="start"/>
+ <radio_item label="Durdur" name="stop"/>
+ </radio_group>
+ <check_box label="tüm animasyonlar bitinceye kadar" name="wait_anim_check"/>
+ <check_box label="saniye olarak zaman:" name="wait_time_check"/>
+ <text name="help_label">
+ Bekleme adımları eklemediğiniz sürece tüm adımlar aynı anda gerçekleşir.
+ </text>
+ <check_box label="Etkin" name="active_check" tool_tip="Etkin mimikleri tetiklemek için tetikleme fazları için sohbet gerçekleştirebilir veya kısayol tuşlarına basabilirsiniz. Bir anahtar bağlama ihtilafı olduğunda mimikler genellikle inaktif hale geçer."/>
+ <button label="Önizleme" name="preview_btn"/>
+ <button label="Kaydet" name="save_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_preview_notecard.xml b/indra/newview/skins/default/xui/tr/floater_preview_notecard.xml
new file mode 100644
index 0000000000..23391249d1
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_preview_notecard.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="preview notecard" title="NOT KARTI:">
+ <floater.string name="no_object">
+ Bu not kartını içeren nesne bulunamadı.
+ </floater.string>
+ <floater.string name="not_allowed">
+ Bu not kartını görüntüleme izniniz yok.
+ </floater.string>
+ <floater.string name="Title">
+ Not Kartı: [NAME]
+ </floater.string>
+ <text name="desc txt">
+ Açıklama:
+ </text>
+ <text_editor name="Notecard Editor">
+ Yükleniyor...
+ </text_editor>
+ <button label="Kaydet" label_selected="Kaydet" name="Save"/>
+ <button label="Sil" label_selected="Sil" name="Delete"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_preview_sound.xml b/indra/newview/skins/default/xui/tr/floater_preview_sound.xml
new file mode 100644
index 0000000000..50874f024a
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_preview_sound.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="preview_sound">
+ <floater.string name="Title">
+ Ses: [NAME]
+ </floater.string>
+ <text name="desc txt">
+ Açıklama:
+ </text>
+ <button label="SL Dünyasında Oynat" label_selected="SL Dünyasında Oynat" name="Sound play btn" tool_tip="Bu ses başkaların işitebileceği bir şekilde çalınsın"/>
+ <button label="Yerel Olarak Oynat" label_selected="Yerel Olarak Oynat" name="Sound audition btn" tool_tip="Bu ses sadece sizin işitebileceğiniz bir şekilde çalınsın"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_preview_texture.xml b/indra/newview/skins/default/xui/tr/floater_preview_texture.xml
new file mode 100644
index 0000000000..79e184130a
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_preview_texture.xml
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="preview_texture">
+ <floater.string name="Title">
+ Doku: [NAME]
+ </floater.string>
+ <floater.string name="Copy">
+ Envantere Kopyala
+ </floater.string>
+ <text name="desc txt">
+ Açıklama:
+ </text>
+ <text name="dimensions">
+ [WIDTH]px x [HEIGHT]px
+ </text>
+ <text name="aspect_ratio">
+ En boy oranını önizle
+ </text>
+ <combo_box name="combo_aspect_ratio" tool_tip="Sabit en boy oranında önizle">
+ <combo_item name="Unconstrained">
+ Kısıtsız
+ </combo_item>
+ <combo_item name="1:1" tool_tip="Grup iÅŸaretleri veya Real World profili">
+ 1:1
+ </combo_item>
+ <combo_item name="4:3" tool_tip="[SECOND_LIFE] profili">
+ 4:3
+ </combo_item>
+ <combo_item name="10:7" tool_tip="İlanlar ve arama listeleri, yer imleri">
+ 10:7
+ </combo_item>
+ <combo_item name="3:2" tool_tip="Arazi hakkında">
+ 3:2
+ </combo_item>
+ <combo_item name="16:10">
+ 16:10
+ </combo_item>
+ <combo_item name="16:9" tool_tip="Profil seçmeleri">
+ 16:9
+ </combo_item>
+ <combo_item name="2:1">
+ 2:1
+ </combo_item>
+ </combo_box>
+ <button label="Tamam" name="Keep"/>
+ <button label="At" name="Discard"/>
+ <button label="Farklı Kaydet" name="save_tex_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_price_for_listing.xml b/indra/newview/skins/default/xui/tr/floater_price_for_listing.xml
new file mode 100644
index 0000000000..5cdd25b64c
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_price_for_listing.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="price_for_listing" title="SERİ İLAN YAYINLA">
+ <text name="explanation_text">
+ İlanınız yayınlandığı günden itibaren bir hafta boyunca yayında kalacaktır.
+
+İlanınızın seri ilanlar listesindeki yeri, ne kadar ödeme yapmayı seçtiğinize bağlıdır.
+
+En çok ücret ödenen ilanlar listenin tepesinde yer alır ve aramalarda daha yukarı sırada görünür.
+ </text>
+ <text name="price_text">
+ İlan Ücreti:
+ </text>
+ <text name="price_symbol">
+ L$
+ </text>
+ <button label="Tamam" name="set_price_btn"/>
+ <button label="İptal" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_publish_classified.xml b/indra/newview/skins/default/xui/tr/floater_publish_classified.xml
new file mode 100644
index 0000000000..572892667b
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_publish_classified.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="publish_classified" title="İlan Yayınlama">
+ <text name="explanation_text">
+ Seri ilanınız yayına verildiği günden itibaren bir hafta boyunca yayında kalacaktır.
+
+Unutmayın, İlan ücretleri iade edilmez.
+ </text>
+ <spinner label="Fiyat: L$" name="price_for_listing" tool_tip="İlan ücreti." value="50"/>
+ <button label="Yayınla" name="publish_btn"/>
+ <button label="İptal" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_region_debug_console.xml b/indra/newview/skins/default/xui/tr/floater_region_debug_console.xml
new file mode 100644
index 0000000000..e2a5e8e86a
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_region_debug_console.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="region_debug_console" title="Bölge Hata Ayıklama"/>
diff --git a/indra/newview/skins/default/xui/tr/floater_region_info.xml b/indra/newview/skins/default/xui/tr/floater_region_info.xml
new file mode 100644
index 0000000000..2b2e00161b
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_region_info.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="regioninfo" title="BÖLGE/GAYRİMENKUL"/>
diff --git a/indra/newview/skins/default/xui/tr/floater_report_abuse.xml b/indra/newview/skins/default/xui/tr/floater_report_abuse.xml
new file mode 100644
index 0000000000..c5765883c4
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_report_abuse.xml
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_report_abuse" title="KÖTÜYE KULLANIM BİLDİR">
+ <floater.string name="Screenshot">
+ Anlık görüntü
+ </floater.string>
+ <check_box label="Bu anlık görüntüyü kullan" name="screen_check"/>
+ <text name="reporter_title">
+ Rapor eden:
+ </text>
+ <text name="sim_title">
+ Bölge:
+ </text>
+ <text name="sim_field">
+ Bölge Adı
+ </text>
+ <text name="pos_title">
+ Konum:
+ </text>
+ <text name="pos_field">
+ {128.1, 128.1, 15.4}
+ </text>
+ <text name="select_object_label">
+ Düğmeye, sonra da kötüye kullanılan nesneye tıklayın:
+ </text>
+ <button name="pick_btn" tool_tip="Nesne Seçici - bu raporun konusu olan nesneyi tespit edin"/>
+ <text name="object_name_label">
+ Nesne:
+ </text>
+ <text name="owner_name_label">
+ Sahip:
+ </text>
+ <combo_box name="category_combo" tool_tip="Kategori -- bu raporu en iyi tanımlayan kategoriyi seçin">
+ <combo_box.item label="Kategori seç" name="Select_category"/>
+ <combo_box.item label="Yaş &gt; Yaşı oyna" name="Age__Age_play"/>
+ <combo_box.item label="Yaş &gt; 18 Yaş Altı Second Life&apos;ında Yetişkin Sakin" name="Age__Adult_resident_on_Teen_Second_Life"/>
+ <combo_box.item label="Yaş &gt; 18 Yaş Altı Second Life&apos;ı dışında Reşit Olmayan Sakin" name="Age__Underage_resident_outside_of_Teen_Second_Life"/>
+ <combo_box.item label="Saldırı &gt; Çarpışma koruma alanı / güvensiz alan" name="Assault__Combat_sandbox___unsafe_area"/>
+ <combo_box.item label="Saldırı &gt; Güvenli alan" name="Assault__Safe_area"/>
+ <combo_box.item label="Saldırı &gt; Silah test güvenli alanı" name="Assault__Weapons_testing_sandbox"/>
+ <combo_box.item label="Ticaret &gt; Ürün veya hizmet verilemedi" name="Commerce__Failure_to_deliver_product_or_service"/>
+ <combo_box.item label="İfşa &gt; Gerçek dünya bilgileri" name="Disclosure__Real_world_information"/>
+ <combo_box.item label="İfşa &gt; Sohbet uzaktan izleniyor" name="Disclosure__Remotely_monitoring chat"/>
+ <combo_box.item label="İfşa &gt; Second Life bilgileri/sohbet/Aİ&apos;ler" name="Disclosure__Second_Life_information_chat_IMs"/>
+ <combo_box.item label="Huzuru bozuyor &gt; bölge kaynaklarının haksız kullanımı" name="Disturbing_the_peace__Unfair_use_of_region_resources"/>
+ <combo_box.item label="Huzuru bozuyor &gt; aşırı komut dosyalı nesne" name="Disturbing_the_peace__Excessive_scripted_objects"/>
+ <combo_box.item label="Huzuru bozuyor &gt; Nesne dağıtma" name="Disturbing_the_peace__Object_littering"/>
+ <combo_box.item label="Huzuru bozuyor &gt; Tekrarlanan spam" name="Disturbing_the_peace__Repetitive_spam"/>
+ <combo_box.item label="Huzuru bozuyor &gt; İstenmeyen reklam spamı" name="Disturbing_the_peace__Unwanted_advert_spam"/>
+ <combo_box.item label="Dolandırıcılık &gt; L$" name="Fraud__L$"/>
+ <combo_box.item label="Dolandırıcılık &gt; Arazi" name="Fraud__Land"/>
+ <combo_box.item label="Dolandırıcılık &gt; Piramid planı veya zincirleme mektup" name="Fraud__Pyramid_scheme_or_chain_letter"/>
+ <combo_box.item label="Dolandırıcılık &gt; US$" name="Fraud__US$"/>
+ <combo_box.item label="Taciz &gt; reklam çiftlikleri / görsel spam" name="Harassment__Advert_farms___visual_spam"/>
+ <combo_box.item label="Taciz &gt; Kişi ya da grupları aşağılama" name="Harassment__Defaming_individuals_or_groups"/>
+ <combo_box.item label="Taciz &gt; Tehditkâr hareket" name="Harassment__Impeding_movement"/>
+ <combo_box.item label="Taciz &gt; Cinsel taciz" name="Harassment__Sexual_harassment"/>
+ <combo_box.item label="Taciz &gt; Başkalarını Hizmet Koşullarını ihlal etmeye kışkırtma/teşvik" name="Harassment__Solicting_inciting_others_to_violate_ToS"/>
+ <combo_box.item label="Taciz &gt; Sözlü istismar" name="Harassment__Verbal_abuse"/>
+ <combo_box.item label="Uygunsuzluk &gt; Genel anlamda rahatsız edici içerik veya davranış" name="Indecency__Broadly_offensive_content_or_conduct"/>
+ <combo_box.item label="Uygunsuzluk &gt; Uygunsuz avatar adı" name="Indecency__Inappropriate_avatar_name"/>
+ <combo_box.item label="Uygunsuzluk &gt; PG bölgesinde rahatsız edici içerik veya davranış" name="Indecency__Mature_content_in_PG_region"/>
+ <combo_box.item label="Uygunsuzluk &gt; Orta bölgede rahatsız edici içerik veya davranış" name="Indecency__Inappropriate_content_in_Mature_region"/>
+ <combo_box.item label="Fikri mülkiyet ihlali &gt; İçerik Silme" name="Intellectual_property_infringement_Content_Removal"/>
+ <combo_box.item label="Fikri mülkiyet ihlali &gt; CopyBot veya İzinlerin Kötüye Kullanılması" name="Intellectual_property_infringement_CopyBot_or_Permissions_Exploit"/>
+ <combo_box.item label="Tahammülsüzlük" name="Intolerance"/>
+ <combo_box.item label="Arazi &gt; Koruma alanı kaynaklarının istismarı" name="Land__Abuse_of_sandbox_resources"/>
+ <combo_box.item label="Arazi &gt; Tecavvüz &gt; Nesneler/dokular" name="Land__Encroachment__Objects_textures"/>
+ <combo_box.item label="Arazi &gt; Tecavvüz &gt; Parçacıklar" name="Land__Encroachment__Particles"/>
+ <combo_box.item label="Arazi &gt; Tecavvüz &gt; Ağaçlar/bitkiler" name="Land__Encroachment__Trees_plants"/>
+ <combo_box.item label="Bahis oynatma/kumar" name="Wagering_gambling"/>
+ <combo_box.item label="DiÄŸer" name="Other"/>
+ </combo_box>
+ <text name="abuser_name_title">
+ Kötüye kullananın adı:
+ </text>
+ <button label="Seç" name="select_abuser" tool_tip="Kötüye kullananın adını bir listeden seçin"/>
+ <text name="abuser_name_title2">
+ Kötüye Kullanma Konumu
+ </text>
+ <text name="sum_title">
+ Özet:
+ </text>
+ <text name="dscr_title">
+ Ayrıntl:
+ </text>
+ <text name="bug_aviso">
+ Mümkün olduğunca spesifik olun
+ </text>
+ <text name="incomplete_title">
+ * Eksik raporlar incelenmeyecektir
+ </text>
+ <button label="Kötüye Kullanımı Bildir" label_selected="Kötüye Kullanımı Bildir" name="send_btn"/>
+ <button label="İptal" label_selected="İptal" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_script_debug.xml b/indra/newview/skins/default/xui/tr/floater_script_debug.xml
new file mode 100644
index 0000000000..baf0aabd85
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_script_debug.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<multi_floater name="script debug floater" title="Komut Dosyası Uyarı/Hata"/>
diff --git a/indra/newview/skins/default/xui/tr/floater_script_debug_panel.xml b/indra/newview/skins/default/xui/tr/floater_script_debug_panel.xml
new file mode 100644
index 0000000000..e70a30fa24
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_script_debug_panel.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="script" short_title="[ALL SCRIPTS]" title="[ALL SCRIPTS]"/>
diff --git a/indra/newview/skins/default/xui/tr/floater_script_limits.xml b/indra/newview/skins/default/xui/tr/floater_script_limits.xml
new file mode 100644
index 0000000000..875599bde3
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_script_limits.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="scriptlimits" title="KOMUT DOSYASI BİLGİSİ"/>
diff --git a/indra/newview/skins/default/xui/tr/floater_script_preview.xml b/indra/newview/skins/default/xui/tr/floater_script_preview.xml
new file mode 100644
index 0000000000..e193f7c1af
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_script_preview.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="preview lsl text" title="KOMUT DOSYASI: DÖNDÜRME KOMUT DOSYASI">
+ <floater.string name="Title">
+ KOMUT DOSYASI: [NAME]
+ </floater.string>
+ <text name="desc txt">
+ Açıklama:
+ </text>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_script_queue.xml b/indra/newview/skins/default/xui/tr/floater_script_queue.xml
new file mode 100644
index 0000000000..c1d98b717a
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_script_queue.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="queue" title="İLERLEMEYİ SIFIRLA">
+ <floater.string name="Starting">
+ [COUNT] öğe için [START] başlatılıyor.
+ </floater.string>
+ <floater.string name="Done">
+ Tamamlandı.
+ </floater.string>
+ <floater.string name="Resetting">
+ Sıfırlanıyor
+ </floater.string>
+ <floater.string name="Running">
+ Çalışıyor
+ </floater.string>
+ <floater.string name="NotRunning">
+ Çalışmıyor
+ </floater.string>
+ <button label="Kapat" label_selected="Kapat" name="close"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_script_search.xml b/indra/newview/skins/default/xui/tr/floater_script_search.xml
new file mode 100644
index 0000000000..54b1d20c8c
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_script_search.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="script search" title="KOMUT DOSYASI ARA">
+ <check_box label="Büyük Küçük Harfe Duyarsız" name="case_text"/>
+ <button label="Ara" label_selected="Ara" name="search_btn"/>
+ <button label="DeÄŸiÅŸtir" label_selected="DeÄŸiÅŸtir" name="replace_btn"/>
+ <button label="Tümünü Değiştir" label_selected="Tümünü Değiştir" name="replace_all_btn"/>
+ <text name="txt">
+ Ara
+ </text>
+ <text name="txt2">
+ DeÄŸiÅŸtir
+ </text>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_search.xml b/indra/newview/skins/default/xui/tr/floater_search.xml
new file mode 100644
index 0000000000..08c1e5162c
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_search.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_search" title="">
+ <floater.string name="loading_text">
+ Yükleniyor...
+ </floater.string>
+ <floater.string name="done_text">
+ Tamamlandı
+ </floater.string>
+ <layout_stack name="stack1">
+ <layout_panel name="browser_layout">
+ <text name="refresh_search">
+ Mevcut Yönetici seviyesini dikkate alarak aramayı yenile
+ </text>
+ </layout_panel>
+ </layout_stack>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_select_key.xml b/indra/newview/skins/default/xui/tr/floater_select_key.xml
new file mode 100644
index 0000000000..b828672ec2
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_select_key.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="modal container">
+ <text name="Save item as:">
+ Konuş düğmesi tetikleyicinizi ayarlamak için bir düğmeye basın.
+ </text>
+ <button label="İptal" label_selected="İptal" name="Cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_sell_land.xml b/indra/newview/skins/default/xui/tr/floater_sell_land.xml
new file mode 100644
index 0000000000..9bea1e120e
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_sell_land.xml
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="sell land" title="ARAZİ SAT">
+ <scroll_container name="profile_scroll">
+ <panel name="scroll_content_panel">
+ <text name="info_parcel_label">
+ Parsel:
+ </text>
+ <text name="info_parcel">
+ PARSEL ADI
+ </text>
+ <text name="info_size_label">
+ Büyüklük:
+ </text>
+ <text name="info_size">
+ [AREA] m²
+ </text>
+ <text name="info_action">
+ Bu parseli satmak için:
+ </text>
+ <text name="price_label">
+ 1. Fiyat belirle:
+ </text>
+ <text name="price_text">
+ Uygun bir fiyat seçin.
+ </text>
+ <text name="price_ld">
+ L$
+ </text>
+ <line_editor name="price">
+ 0
+ </line_editor>
+ <text name="price_per_m">
+ (L$[PER_METER] / m²)
+ </text>
+ <text name="sell_to_label">
+ 2. Araziyi şuna satın:
+ </text>
+ <text name="sell_to_text">
+ Herkese mi, yoksa belirli bir alıcıya mı satacağınızı seçin.
+ </text>
+ <combo_box name="sell_to">
+ <combo_box.item label="- Birini seç -" name="--selectone--"/>
+ <combo_box.item label="Herkes" name="Anyone"/>
+ <combo_box.item label="Belirli kiÅŸi:" name="Specificuser:"/>
+ </combo_box>
+ <button label="Seç" name="sell_to_select_agent"/>
+ <text name="sell_objects_label">
+ 3. Nesneler araziyle birlikte mi satılacak?
+ </text>
+ <text name="sell_objects_text">
+ Arazi sahibinin parsel üzerindeki devredilebilir nesnelerinin mülkiyeti değişecektir.
+ </text>
+ <radio_group name="sell_objects">
+ <radio_item label="Hayır, nesnelerin mülkiyetini koru" name="no"/>
+ <radio_item label="Evet, nesneleri araziyle birlikte sat" name="yes"/>
+ </radio_group>
+ <button label="Nesneleri Göster" name="show_objects"/>
+ <text name="nag_message_label">
+ UNUTMAYIN: Tüm satışlar kesindir.
+ </text>
+ <button label="Araziyi Satışa Çıkar" name="sell_btn"/>
+ <button label="İptal" name="cancel_btn"/>
+ </panel>
+ </scroll_container>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_settings_debug.xml b/indra/newview/skins/default/xui/tr/floater_settings_debug.xml
new file mode 100644
index 0000000000..65264c57d7
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_settings_debug.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="settings_debug" title="HATA AYIKLAMA AYARLARI">
+ <radio_group name="boolean_combo">
+ <radio_item label="TRUE" name="TRUE" value="true"/>
+ <radio_item label="FALSE" name="FALSE" value=""/>
+ </radio_group>
+ <color_swatch label="Renk" name="val_color_swatch"/>
+ <spinner label="x" name="val_spinner_1"/>
+ <spinner label="x" name="val_spinner_2"/>
+ <spinner label="x" name="val_spinner_3"/>
+ <spinner label="x" name="val_spinner_4"/>
+ <button label="Varsayılana sıfırla" name="default_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_snapshot.xml b/indra/newview/skins/default/xui/tr/floater_snapshot.xml
new file mode 100644
index 0000000000..fa51f15d16
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_snapshot.xml
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Snapshot" title="ANLIK GÖRÜNTÜ ÖNİZLEME">
+ <floater.string name="unknown">
+ bilinmiyor
+ </floater.string>
+ <string name="postcard_progress_str">
+ E-posta Gönderiliyor
+ </string>
+ <string name="profile_progress_str">
+ Yayınlanıyor
+ </string>
+ <string name="inventory_progress_str">
+ Envantere Kaydediliyor
+ </string>
+ <string name="local_progress_str">
+ Bilgisayara Kaydediliyor
+ </string>
+ <string name="profile_succeeded_str">
+ Görüntü yüklendi
+ </string>
+ <string name="postcard_succeeded_str">
+ E-posta Gönderildi!
+ </string>
+ <string name="inventory_succeeded_str">
+ Envantere Kaydedildi!
+ </string>
+ <string name="local_succeeded_str">
+ Bilgisayara Kaydedildi!
+ </string>
+ <string name="profile_failed_str">
+ Görüntü Profil Akışınıza yüklenemedi.
+ </string>
+ <string name="postcard_failed_str">
+ E-posta gönderilemedi.
+ </string>
+ <string name="inventory_failed_str">
+ Envantere kaydedilemedi.
+ </string>
+ <string name="local_failed_str">
+ Bilgisayara kaydedilemedi.
+ </string>
+ <button name="advanced_options_btn" tool_tip="Gelişmiş seçenekler"/>
+ <text name="image_res_text">
+ [WIDTH] x [HEIGHT] px
+ </text>
+ <text name="file_size_label">
+ [SIZE] KB
+ </text>
+ <panel name="advanced_options_panel">
+ <text name="advanced_options_label">
+ GELİŞMİŞ SEÇENEKLER
+ </text>
+ <text name="layer_type_label">
+ Yakala:
+ </text>
+ <combo_box label="Görüntü Katmanları" name="layer_types">
+ <combo_box.item label="Renkler" name="Colors"/>
+ <combo_box.item label="Derinlik" name="Depth"/>
+ </combo_box>
+ <check_box label="Arayüz" name="ui_check"/>
+ <check_box label="BÜG&apos;ler" name="hud_check"/>
+ <check_box label="Kare dondur (tam ekran)" name="freeze_frame_check"/>
+ <check_box label="Otomatik yenile" name="auto_snapshot_check"/>
+ </panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_sound_devices.xml b/indra/newview/skins/default/xui/tr/floater_sound_devices.xml
new file mode 100644
index 0000000000..470a222d7e
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_sound_devices.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_sound_devices" title="SES CİHAZLARI">
+ <text name="voice_label">
+ Sesli Sohbet
+ </text>
+ <check_box label="Etkin" name="enable_voice"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_sound_preview.xml b/indra/newview/skins/default/xui/tr/floater_sound_preview.xml
new file mode 100644
index 0000000000..1938f184b3
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_sound_preview.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Sound Preview" title="SOUND.WAV">
+ <text name="name_label">
+ Ad:
+ </text>
+ <text name="description_label">
+ Açıklama:
+ </text>
+ <button label="Karşıya Yükle (L$[AMOUNT])" name="ok_btn"/>
+ <button label="İptal" label_selected="İptal" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_stats.xml b/indra/newview/skins/default/xui/tr/floater_stats.xml
new file mode 100644
index 0000000000..17f1166c46
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_stats.xml
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Statistics" title="İSTATİSTİKLER">
+ <scroll_container name="statistics_scroll">
+ <container_view name="statistics_view">
+ <stat_view label="Temel" name="basic">
+ <stat_bar label="FPS" name="fps"/>
+ <stat_bar label="Bant geniÅŸliÄŸi" name="bandwidth"/>
+ <stat_bar label="Paket Kaybı" name="packet_loss"/>
+ <stat_bar label="Sim Pingi" name="ping"/>
+ </stat_view>
+ <stat_view label="GeliÅŸmiÅŸ" name="advanced">
+ <stat_view label="İşle" name="render">
+ <stat_bar label="Çerçeve Başına Çizilen Üçgenler" name="ktrisframe"/>
+ <stat_bar label="Saniyede Bir Çizilen Üçgenler" name="ktrissec"/>
+ <stat_bar label="Toplam Nesne" name="objs"/>
+ <stat_bar label="Yeni Nesne" name="newobjs"/>
+ </stat_view>
+ <stat_view label="Doku" name="texture">
+ <stat_bar label="Sayım" name="numimagesstat"/>
+ <stat_bar label="Ham Sayım" name="numrawimagesstat"/>
+ <stat_bar label="GL BelleÄŸi" name="gltexmemstat"/>
+ <stat_bar label="Formatlanmış Bellek" name="formattedmemstat"/>
+ <stat_bar label="Ham Bellek" name="rawmemstat"/>
+ <stat_bar label="Bağlı Doku Belleği" name="glboundmemstat"/>
+ </stat_view>
+ <stat_view label="AÄŸ" name="network">
+ <stat_bar label="Gelen Paketler" name="packetsinstat"/>
+ <stat_bar label="Giden Paketler" name="packetsoutstat"/>
+ <stat_bar label="Nesneler" name="objectkbitstat"/>
+ <stat_bar label="Doku" name="texturekbitstat"/>
+ <stat_bar label="Varlık" name="assetkbitstat"/>
+ <stat_bar label="Katmanlar" name="layerskbitstat"/>
+ <stat_bar label="Gerçekte Gelen" name="actualinkbitstat"/>
+ <stat_bar label="Gerçekte Giden" name="actualoutkbitstat"/>
+ <stat_bar label="VFS Bekleyen İşlemler" name="vfspendingoperations"/>
+ </stat_view>
+ </stat_view>
+ <stat_view label="Simülatör" name="sim">
+ <stat_bar label="Zaman GenleÅŸmesi" name="simtimedilation"/>
+ <stat_bar label="Sim FPS" name="simfps"/>
+ <stat_bar label="Fizik FPS" name="simphysicsfps"/>
+ <stat_view label="Fizik Ayrıntıları" name="physicsdetail">
+ <stat_bar label="SabitlenmiÅŸ Nesneler" name="physicspinnedtasks"/>
+ <stat_bar label="Düşük Ayrıntı Seviyesindeki Nesneler" name="physicslodtasks"/>
+ <stat_bar label="Ayrılan Bellek" name="physicsmemoryallocated"/>
+ </stat_view>
+ <stat_bar label="Aracı Güncelleştirmeleri/sn" name="simagentups"/>
+ <stat_bar label="Ana Aracılar" name="simmainagents"/>
+ <stat_bar label="Alt Aracılar" name="simchildagents"/>
+ <stat_bar label="Nesneler" name="simobjects"/>
+ <stat_bar label="Etkin Nesneler" name="simactiveobjects"/>
+ <stat_bar label="Etkin Komut Dosyaları" name="simactivescripts"/>
+ <stat_bar label="Komut Dosyası Etkinlikleri" name="simscripteps"/>
+ <stat_bar label="Gelen Paketler" name="siminpps"/>
+ <stat_bar label="Giden Paketler" name="simoutpps"/>
+ <stat_bar label="Bekleyen Karşıdan Yüklemeler" name="simpendingdownloads"/>
+ <stat_bar label="Bekleyen Karşıya Yüklemeler" name="simpendinguploads"/>
+ <stat_bar label="Toplam BildirilmiÅŸ Bayt" name="simtotalunackedbytes"/>
+ <stat_view label="Zaman (ms)" name="simperf">
+ <stat_bar label="Toplam Çerçeve Süresi" name="simframemsec"/>
+ <stat_bar label="Net Süre" name="simnetmsec"/>
+ <stat_bar label="Fizik Süresi" name="simsimphysicsmsec"/>
+ <stat_bar label="Simülasyon Süresi" name="simsimothermsec"/>
+ <stat_bar label="Aracı Süresi" name="simagentmsec"/>
+ <stat_bar label="Görüntü Süresi" name="simimagesmsec"/>
+ <stat_bar label="Komut Dosyası Süresi" name="simscriptmsec"/>
+ <stat_bar label="Yedek Zaman" name="simsparemsec"/>
+ <stat_view label="Zaman Ayrıntıları (ms)" name="timedetails">
+ <stat_bar label="Fizik Adımı" name="simsimphysicsstepmsec"/>
+ <stat_bar label="Fizik Şekillerini Güncelle" name="simsimphysicsshapeupdatemsec"/>
+ <stat_bar label="Fizik DiÄŸer" name="simsimphysicsothermsec"/>
+ <stat_bar label="Uyku Zamanı" name="simsleepmsec"/>
+ <stat_bar label="Pompa Giriş Çıkış" name="simpumpiomsec"/>
+ </stat_view>
+ </stat_view>
+ </stat_view>
+ </container_view>
+ </scroll_container>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_sys_well.xml b/indra/newview/skins/default/xui/tr/floater_sys_well.xml
new file mode 100644
index 0000000000..301d9af063
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_sys_well.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="sys_well_window" title="BİLDİRİMLER">
+ <string name="title_im_well_window">
+ SOHBETLER
+ </string>
+ <string name="title_notification_well_window">
+ BİLDİRİMLER
+ </string>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_telehub.xml b/indra/newview/skins/default/xui/tr/floater_telehub.xml
new file mode 100644
index 0000000000..2cdb464ed0
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_telehub.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- Explicit left edge to avoid overlapping build tools -->
+<floater name="telehub" title="IŞINLAMA İSTASYONU">
+ <text name="status_text_connected">
+ Işınlama istasyonu nesneye [OBJECT] bağlandı
+ </text>
+ <text name="status_text_not_connected">
+ Hiçbir ışınlama istasyonu bağlı değil
+ </text>
+ <text name="help_text_connected">
+ Çıkarmak için, Bağlantıyı Kes&apos;e tıkla.
+ </text>
+ <text name="help_text_not_connected">
+ Nesneyi seç ve Işınlama İstasyonuna Bağlan&apos;a tıkla
+ </text>
+ <button label="Işınlanma İstasyonuna Bağlan" name="connect_btn"/>
+ <button label="Bağlantıyı Kes" name="disconnect_btn"/>
+ <text name="spawn_points_text">
+ Üreme Noktaları (konumlar, nesneler değil):
+ </text>
+ <button label="Üreme Ekle" name="add_spawn_point_btn"/>
+ <button label="Üreme Çıkar" name="remove_spawn_point_btn"/>
+ <text name="spawn_point_help">
+ Konum belirtmek için nesneyi seç ve &quot;Üreme Ekle&quot;ye tıkla
+Daha sonra nesneyi taşıyabilir veya silebilirsiniz.
+Konumlar ışınlanma istasyonu merkezine görelidir.
+SL dünyasında vurgulamak için listedeki bir ögeyi seçin.
+ </text>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_texture_ctrl.xml b/indra/newview/skins/default/xui/tr/floater_texture_ctrl.xml
new file mode 100644
index 0000000000..4ef789f585
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_texture_ctrl.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="texture picker" title="SEÇME: DOKU">
+ <floater.string name="choose_picture">
+ Bir resim seçmek için tıklayın
+ </floater.string>
+ <floater.string name="pick title">
+ Seçme:
+ </floater.string>
+ <text name="Multiple">
+ Birden çok doku
+ </text>
+ <text name="unknown">
+ Büyüklük: [DIMENSIONS]
+ </text>
+ <button label="Varsayılan" label_selected="Varsayılan" name="Default"/>
+ <button label="Hiçbiri" label_selected="Hiçbiri" name="None"/>
+ <button label="BoÅŸ" label_selected="BoÅŸ" name="Blank"/>
+ <check_box initial_value="true" label="Åžimdi uygula" name="apply_immediate_check"/>
+ <filter_editor label="Dokuları Filtrele" name="inventory search editor"/>
+ <check_box initial_value="false" label="Klasörleri göster" name="show_folders_check"/>
+ <button label="Tamam" label_selected="Tamam" name="Select"/>
+ <button label="İptal" label_selected="İptal" name="Cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_tools.xml b/indra/newview/skins/default/xui/tr/floater_tools.xml
new file mode 100644
index 0000000000..d4ee9995dd
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_tools.xml
@@ -0,0 +1,491 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="toolbox floater" short_title="İNŞA ET ARAÇLARI">
+ <floater.string name="status_rotate">
+ Nesneyi döndürmek için renkli bantları sürükleyin
+ </floater.string>
+ <floater.string name="status_scale">
+ Seçilen tarafı uzatmak için tıklayın ve sürükleyin
+ </floater.string>
+ <floater.string name="status_move">
+ Hareket ettirmek için sürükleyin, kopyalamak için Shift ile sürükleyin
+ </floater.string>
+ <floater.string name="status_modifyland">
+ Araziyi değiştirmek için tıklayın ve tutun
+ </floater.string>
+ <floater.string name="status_camera">
+ Kamerayı hareket ettirmek için tıklayın ve sürükleyin
+ </floater.string>
+ <floater.string name="status_grab">
+ Hareket ettirmek için sürükleyin, kaldırmak için Ctrl, döndürmek için Ctrl+Shift kullanın
+ </floater.string>
+ <floater.string name="status_place">
+ İnşa etmek için SL dünyası içine tıklayın
+ </floater.string>
+ <floater.string name="status_selectland">
+ Araziyi seçmek için tıklayın ve sürükleyin
+ </floater.string>
+ <floater.string name="status_selectcount">
+ [OBJ_COUNT] nesne seçili, [LAND_IMPACT] arazi etkisi
+ </floater.string>
+ <floater.string name="status_remaining_capacity">
+ Kalan kapasite [LAND_CAPACITY].
+ </floater.string>
+ <button name="button focus" tool_tip="Odak"/>
+ <button name="button move" tool_tip="Hareket Et"/>
+ <button name="button edit" tool_tip="Düzenle"/>
+ <button name="button create" tool_tip="OluÅŸtur"/>
+ <button name="button land" tool_tip="Arazi"/>
+ <text name="text status">
+ Hareket ettirmek için sürükleyin, kopyalamak için Shift ile sürükleyin
+ </text>
+ <radio_group name="focus_radio_group">
+ <radio_item label="Yakınlaştır" name="radio zoom"/>
+ <radio_item label="Yörünge Değişimi (Ctrl)" name="radio orbit"/>
+ <radio_item label="Kamerayı Çevir (Ctrl+Shift)" name="radio pan"/>
+ </radio_group>
+ <slider_bar initial_value="0.125" name="slider zoom"/>
+ <radio_group name="move_radio_group">
+ <radio_item label="Hareket Et" name="radio move"/>
+ <radio_item label="Kaldır (Ctrl)" name="radio lift"/>
+ <radio_item label="Çevir (Ctrl+Shift)" name="radio spin"/>
+ </radio_group>
+ <radio_group name="edit_radio_group">
+ <radio_item label="Hareket Et" name="radio position"/>
+ <radio_item label="Döndür (Ctrl)" name="radio rotate"/>
+ <radio_item label="Uzat (Ctrl+Shift)" name="radio stretch"/>
+ <radio_item label="Yüzü Seç" name="radio select face"/>
+ </radio_group>
+ <check_box label="Bağlantılıları düzenle" name="checkbox edit linked parts"/>
+ <button label="BaÄŸla" name="link_btn"/>
+ <button label="Bağlantıyı Kopar" name="unlink_btn"/>
+ <text label="Her İki Tarafı Uzat" name="checkbox uniform label">
+ Her İki Tarafı Uzat
+ </text>
+ <check_box initial_value="true" label="Dokuları Uzat" name="checkbox stretch textures"/>
+ <check_box initial_value="true" label="Yasla" name="checkbox snap to grid"/>
+ <button label="Seçenekler..." name="Options..." tool_tip="İlave ağ seçeneklerine bak"/>
+ <button name="ToolCube" tool_tip="Küp"/>
+ <button name="ToolPrism" tool_tip="Prizma"/>
+ <button name="ToolPyramid" tool_tip="Piramit"/>
+ <button name="ToolTetrahedron" tool_tip="Üçgen Piramit"/>
+ <button name="ToolCylinder" tool_tip="Silindir"/>
+ <button name="ToolHemiCylinder" tool_tip="Yarı Silindir"/>
+ <button name="ToolCone" tool_tip="Koni"/>
+ <button name="ToolHemiCone" tool_tip="Yarı Koni"/>
+ <button name="ToolSphere" tool_tip="Küre"/>
+ <button name="ToolHemiSphere" tool_tip="Yarı Küre"/>
+ <button name="ToolTorus" tool_tip="Torus"/>
+ <button name="ToolTube" tool_tip="Tüp"/>
+ <button name="ToolRing" tool_tip="Halka"/>
+ <button name="ToolTree" tool_tip="Ağaç"/>
+ <button name="ToolGrass" tool_tip="Çimen"/>
+ <check_box label="Seçili Aracı tut" name="checkbox sticky"/>
+ <check_box label="Seçimi kopyala" name="checkbox copy selection"/>
+ <check_box initial_value="true" label="Kopyayı Merkezle" name="checkbox copy centers"/>
+ <check_box label="Kopyayı Döndür" name="checkbox copy rotates"/>
+ <radio_group name="land_radio_group">
+ <radio_item label="Araziyi Seç" name="radio select land"/>
+ <radio_item label="Düzleştir" name="radio flatten"/>
+ <radio_item label="Yükselt" name="radio raise"/>
+ <radio_item label="Alçalt" name="radio lower"/>
+ <radio_item label="Düzgünleştir" name="radio smooth"/>
+ <radio_item label="Pürüzlendir" name="radio noise"/>
+ <radio_item label="Geri Çevir" name="radio revert"/>
+ </radio_group>
+ <text name="Bulldozer:">
+ Buldozer:
+ </text>
+ <text name="Dozer Size:">
+ Büyüklük
+ </text>
+ <slider_bar initial_value="2.0" name="slider brush size"/>
+ <text name="Strength:">
+ Kuvvet
+ </text>
+ <slider_bar initial_value="0.00" name="slider force"/>
+ <button label="Uygula" label_selected="Uygula" name="button apply to selection" tool_tip="Seçilen araziyi değiştirin"/>
+ <text name="selection_empty">
+ Seçilen bir şey yok.
+ </text>
+ <text name="remaining_capacity">
+ [CAPACITY_STRING] [secondlife:///app/openfloater/object_weights Ek bilgi]
+ </text>
+ <tab_container name="Object Info Tabs">
+ <panel label="Genel" name="General">
+ <panel.string name="text deed continued">
+ Devret
+ </panel.string>
+ <panel.string name="text deed">
+ Devret
+ </panel.string>
+ <panel.string name="text modify info 1">
+ Bu nesneyi deÄŸiÅŸtirebilirsiniz
+ </panel.string>
+ <panel.string name="text modify info 2">
+ Bu nesneleri deÄŸiÅŸtirebilirsiniz
+ </panel.string>
+ <panel.string name="text modify info 3">
+ Bu nesneyi deÄŸiÅŸtiremezsiniz
+ </panel.string>
+ <panel.string name="text modify info 4">
+ Bu nesneleri deÄŸiÅŸtiremezsiniz
+ </panel.string>
+ <panel.string name="text modify warning">
+ İzinleri ayarlamak için tüm nesneyi seçmelisiniz
+ </panel.string>
+ <panel.string name="Cost Default">
+ Fiyat: L$
+ </panel.string>
+ <panel.string name="Cost Total">
+ Toplam Fiyat: L$
+ </panel.string>
+ <panel.string name="Cost Per Unit">
+ Birim Fiyatı: L$
+ </panel.string>
+ <panel.string name="Cost Mixed">
+ Karma Fiyat
+ </panel.string>
+ <panel.string name="Sale Mixed">
+ Karma Satış
+ </panel.string>
+ <text name="Name:">
+ Ad:
+ </text>
+ <text name="Description:">
+ Açıklama:
+ </text>
+ <text name="Creator:">
+ OluÅŸturan:
+ </text>
+ <text name="Owner:">
+ Sahip:
+ </text>
+ <text name="Group:">
+ Grup:
+ </text>
+ <name_box initial_value="Yükleniyor..." name="Group Name Proxy"/>
+ <button name="button set group" tool_tip="Bu nesnenin izinlerini paylaşmak için bir grup seçin"/>
+ <check_box label="Paylaş" name="checkbox share with group" tool_tip="Ayarlanan grubun tüm üyelerinin, bu nesne için değiştirme izinlerinizi paylaşmasına izin verir. Rol kısıtlamalarını etkinleştirmek için Devretme yapmalısınız."/>
+ <button label="Devret" label_selected="Devret" name="button deed" tool_tip="Bu nesne devredilerek verildiğinde, nesnenin sonraki sahibi için izinler geçerli olur. Grup içerisinde paylaşılan nesneler bir grup yetkilisi tarafından devredilebilir."/>
+ <text name="label click action">
+ Şu eylem için tıklayın:
+ </text>
+ <combo_box name="clickaction">
+ <combo_box.item label="Dokun (varsayılan)" name="Touch/grab(default)"/>
+ <combo_box.item label="Nesnenin üzerine otur" name="Sitonobject"/>
+ <combo_box.item label="Nesneyi satın al" name="Buyobject"/>
+ <combo_box.item label="Nesneye ödeme yap" name="Payobject"/>
+ <combo_box.item label="Aç" name="Open"/>
+ <combo_box.item label="Yakınlaştır" name="Zoom"/>
+ </combo_box>
+ <check_box label="Satılık:" name="checkbox for sale"/>
+ <combo_box name="sale type">
+ <combo_box.item label="Kopyala" name="Copy"/>
+ <combo_box.item label="İçerik" name="Contents"/>
+ <combo_box.item label="Orijinal" name="Original"/>
+ </combo_box>
+ <spinner label="Fiyat: L$" name="Edit Cost"/>
+ <check_box label="Aramada göster" name="search_check" tool_tip="Kişiler arama sonuçlarında bu nesneyi görebilsin"/>
+ <panel name="perms_build">
+ <text name="perm_modify">
+ Bu nesneyi deÄŸiÅŸtirebilirsiniz
+ </text>
+ <text name="Anyone can:">
+ Herkes:
+ </text>
+ <check_box label="Hareket Et" name="checkbox allow everyone move"/>
+ <check_box label="Kopyala" name="checkbox allow everyone copy"/>
+ <text name="Next owner can:">
+ Sonraki sahip:
+ </text>
+ <check_box label="DeÄŸiÅŸtir" name="checkbox next owner can modify"/>
+ <check_box label="Kopyala" name="checkbox next owner can copy"/>
+ <check_box label="Aktar" name="checkbox next owner can transfer" tool_tip="Sonraki sahibi bu nesneyi verebilir veya tekrar satabilir"/>
+ <text name="B:">
+ B:
+ </text>
+ <text name="O:">
+ O:
+ </text>
+ <text name="G:">
+ G:
+ </text>
+ <text name="E:">
+ E:
+ </text>
+ <text name="N:">
+ N:
+ </text>
+ <text name="F:">
+ F:
+ </text>
+ </panel>
+ </panel>
+ <panel label="Nesne" name="Object">
+ <check_box label="Kilitli" name="checkbox locked" tool_tip="Nesnenin hareket ettirilmesini veya silinmesini engeller. Arzulanmayan düzenlemelerden kaçınmak için inşa işlemleri sırasında oldukça faydalıdır."/>
+ <check_box label="Fiziksel" name="Physical Checkbox Ctrl" tool_tip="Nesnelerin itilmesine ve yerçekiminden etkilenmesine izin verir."/>
+ <check_box label="Geçici" name="Temporary Checkbox Ctrl" tool_tip="Nesnenin oluşturulduktan 1 dakika sonra silinmesine neden olur"/>
+ <check_box label="Fantom" name="Phantom Checkbox Ctrl" tool_tip="Nesnenin diğer nesneler veya avatarlarla çarpışmamasına neden olur"/>
+ <text name="label position">
+ Konum (metre)
+ </text>
+ <spinner label="X" name="Pos X"/>
+ <spinner label="Y" name="Pos Y"/>
+ <spinner label="Z" name="Pos Z"/>
+ <text name="label size">
+ Büyüklük (metre)
+ </text>
+ <spinner label="X" name="Scale X"/>
+ <spinner label="Y" name="Scale Y"/>
+ <spinner label="Z" name="Scale Z"/>
+ <text name="label rotation">
+ Dönüş (derece)
+ </text>
+ <spinner label="X" name="Rot X"/>
+ <spinner label="Y" name="Rot Y"/>
+ <spinner label="Z" name="Rot Z"/>
+ <combo_box name="comboBaseType">
+ <combo_box.item label="Kutu" name="Box"/>
+ <combo_box.item label="Silindir" name="Cylinder"/>
+ <combo_box.item label="Prizma" name="Prism"/>
+ <combo_box.item label="Küre" name="Sphere"/>
+ <combo_box.item label="Torus" name="Torus"/>
+ <combo_box.item label="Tüp" name="Tube"/>
+ <combo_box.item label="Halka" name="Ring"/>
+ <combo_box.item label="ÅžekillendirilmiÅŸ" name="Sculpted"/>
+ </combo_box>
+ <text name="text cut">
+ Yolu Kes (başlangıç/son)
+ </text>
+ <spinner label="B DİKKAT" name="cut begin"/>
+ <spinner label="D - DİKKAT" name="cut end"/>
+ <text name="text hollow">
+ Oyuk
+ </text>
+ <text name="text skew">
+ Çarpıt
+ </text>
+ <text name="Hollow Shape">
+ Oyuk Åžekil
+ </text>
+ <combo_box name="hole">
+ <combo_box.item label="Varsayılan" name="Default"/>
+ <combo_box.item label="Daire" name="Circle"/>
+ <combo_box.item label="Kare" name="Square"/>
+ <combo_box.item label="Üçgen" name="Triangle"/>
+ </combo_box>
+ <text name="text twist">
+ Bük (başlangıç/son)
+ </text>
+ <spinner label="B DİKKAT" name="Twist Begin"/>
+ <spinner label="D - DİKKAT" name="Twist End"/>
+ <text name="scale_taper">
+ Kısalt
+ </text>
+ <text name="scale_hole">
+ Delik Büyüklüğü
+ </text>
+ <spinner label="X" name="Taper Scale X"/>
+ <spinner label="Y" name="Taper Scale Y"/>
+ <text name="text topshear">
+ Üstü Kaydır
+ </text>
+ <spinner label="X" name="Shear X"/>
+ <spinner label="Y" name="Shear Y"/>
+ <text name="advanced_cut">
+ Profili Kes (başlangıç/son)
+ </text>
+ <text name="advanced_dimple">
+ Çukurlaştır (başlangıç/son)
+ </text>
+ <text name="advanced_slice">
+ Dilimle (başlangıç/son)
+ </text>
+ <spinner label="B" name="Path Limit Begin"/>
+ <spinner label="D" name="Path Limit End"/>
+ <text name="text taper2">
+ Kısalt
+ </text>
+ <spinner label="X" name="Taper X"/>
+ <spinner label="Y" name="Taper Y"/>
+ <text name="text radius delta">
+ Yarıçap
+ </text>
+ <text name="text revolutions">
+ Dönüş
+ </text>
+ <texture_picker label="Dokuyu Şekillendir" name="sculpt texture control" tool_tip="Bir resim seçmek için tıklayın"/>
+ <check_box label="Ayna" name="sculpt mirror control" tool_tip="Şekillendirilmiş primi X ekseni etrafında döndürür"/>
+ <check_box label="İçini Dışına Çıkar" name="sculpt invert control" tool_tip="Şekillendirilmiş prim normallerini tersine çevirir, iç kısmı dışarıda gösterir"/>
+ <text name="label sculpt type">
+ Dikiş türü
+ </text>
+ <combo_box name="sculpt type control">
+ <combo_box.item label="Küre" name="Sphere"/>
+ <combo_box.item label="Torus" name="Torus"/>
+ <combo_box.item label="Düzlem" name="Plane"/>
+ <combo_box.item label="Silindir" name="Cylinder"/>
+ </combo_box>
+ </panel>
+ <panel label="Özellikler" name="Features">
+ <panel.string name="None">
+ Hiçbiri
+ </panel.string>
+ <panel.string name="Prim">
+ Prim
+ </panel.string>
+ <panel.string name="Convex Hull">
+ Dışbükey Gövde
+ </panel.string>
+ <text name="select_single">
+ Özelliklerini düzenlemek için sadece bir tane ilkel öğeyi seçin.
+ </text>
+ <text name="edit_object">
+ Nesne özelliklerini düzenleyin:
+ </text>
+ <check_box label="Esnek Yol" name="Flexible1D Checkbox Ctrl" tool_tip="Nesnelerin Z ekseni etrafında esnemesine imkan tanır (sadece istemci tarafında)"/>
+ <spinner label="Yumuşaklık" name="FlexNumSections"/>
+ <spinner label="Yerçekimi" name="FlexGravity"/>
+ <spinner label="Sürükle" name="FlexFriction"/>
+ <spinner label="Rüzgar" name="FlexWind"/>
+ <spinner label="Gerilim" name="FlexTension"/>
+ <spinner label="X Kuvveti" name="FlexForceX"/>
+ <spinner label="Y Kuvveti" name="FlexForceY"/>
+ <spinner label="Z Kuvveti" name="FlexForceZ"/>
+ <check_box label="Işık" name="Light Checkbox Ctrl" tool_tip="Nesnelerin ışık yaymasına neden olur"/>
+ <color_swatch name="colorswatch" tool_tip="Renk seçiciyi açmak için tıklayın"/>
+ <texture_picker label="" name="light texture control" tool_tip="Bir projeksiyon görüntüsü seçmek için tıklayın (sadece ertelenmiş işleme etkinken geçerlidir)"/>
+ <spinner label="YoÄŸunluk" name="Light Intensity"/>
+ <spinner label="Görünüm Alanı" name="Light FOV"/>
+ <spinner label="Yarıçap" name="Light Radius"/>
+ <spinner label="Odak" name="Light Focus"/>
+ <spinner label="Işık Azalması" name="Light Falloff"/>
+ <spinner label="Ambiyans" name="Light Ambiance"/>
+ <text name="label physicsshapetype">
+ Fizik Şekil Türü:
+ </text>
+ <combo_box name="Physics Shape Type Combo Ctrl" tool_tip="Fizik şekil türünü seçin"/>
+ <combo_box name="material">
+ <combo_box.item label="TaÅŸ" name="Stone"/>
+ <combo_box.item label="Metal" name="Metal"/>
+ <combo_box.item label="Cam" name="Glass"/>
+ <combo_box.item label="AhÅŸap" name="Wood"/>
+ <combo_box.item label="Et" name="Flesh"/>
+ <combo_box.item label="Plastik" name="Plastic"/>
+ <combo_box.item label="Lastik" name="Rubber"/>
+ </combo_box>
+ <spinner label="Yerçekimi" name="Physics Gravity"/>
+ <spinner label="Sürtünme" name="Physics Friction"/>
+ <spinner label="100 kg/m3 cinsinden yoÄŸunluk" name="Physics Density"/>
+ <spinner label="Restitüsyon" name="Physics Restitution"/>
+ </panel>
+ <panel label="Doku" name="Texture">
+ <panel.string name="string repeats per meter">
+ Metrede Kaç Kez Tekrarlandığı
+ </panel.string>
+ <panel.string name="string repeats per face">
+ Bir Yüzde Kaç Kez Tekrarlandığı
+ </panel.string>
+ <texture_picker label="Doku" name="texture control" tool_tip="Bir resim seçmek için tıklayın"/>
+ <color_swatch label="Renk" name="colorswatch" tool_tip="Renk seçiciyi açmak için tıklayın"/>
+ <text name="color trans">
+ Saydamlık %
+ </text>
+ <text name="glow label">
+ Parıltı
+ </text>
+ <check_box label="Tam Parlak" name="checkbox fullbright"/>
+ <text name="tex gen">
+ EÅŸleÅŸtirme
+ </text>
+ <combo_box name="combobox texgen">
+ <combo_box.item label="Varsayılan" name="Default"/>
+ <combo_box.item label="Planar" name="Planar"/>
+ </combo_box>
+ <text name="label shininess">
+ Parıldama
+ </text>
+ <combo_box name="combobox shininess">
+ <combo_box.item label="Hiçbiri" name="None"/>
+ <combo_box.item label="Düşük" name="Low"/>
+ <combo_box.item label="Orta" name="Medium"/>
+ <combo_box.item label="Yüksek" name="High"/>
+ </combo_box>
+ <text name="label bumpiness">
+ Yumruluk
+ </text>
+ <combo_box name="combobox bumpiness">
+ <combo_box.item label="Hiçbiri" name="None"/>
+ <combo_box.item label="Parlaklık" name="Brightness"/>
+ <combo_box.item label="Koyuluk" name="Darkness"/>
+ <combo_box.item label="damarlı ahşap" name="woodgrain"/>
+ <combo_box.item label="ağaç kabuğu" name="bark"/>
+ <combo_box.item label="tuÄŸlalar" name="bricks"/>
+ <combo_box.item label="dama tahtası" name="checker"/>
+ <combo_box.item label="beton" name="concrete"/>
+ <combo_box.item label="sert çini" name="crustytile"/>
+ <combo_box.item label="kesilmiÅŸ taÅŸ" name="cutstone"/>
+ <combo_box.item label="diskler" name="discs"/>
+ <combo_box.item label="çakıl" name="gravel"/>
+ <combo_box.item label="petri kabı" name="petridish"/>
+ <combo_box.item label="dış kaplama" name="siding"/>
+ <combo_box.item label="taş çini" name="stonetile"/>
+ <combo_box.item label="stükko" name="stucco"/>
+ <combo_box.item label="vakum" name="suction"/>
+ <combo_box.item label="örgü" name="weave"/>
+ </combo_box>
+ <check_box initial_value="false" label="Planar yüzleri hizala" name="checkbox planar align" tool_tip="Tüm seçili yüzeylerdeki dokuları son seçili yüzdekiyle hizalar. Planar doku eşleştirmesi gerektirir."/>
+ <text name="rpt">
+ Tekrarlar / Yüz
+ </text>
+ <spinner label="Yatay (U)" name="TexScaleU"/>
+ <check_box label="Çevir" name="checkbox flip s"/>
+ <spinner label="Dikey (V)" name="TexScaleV"/>
+ <check_box label="Çevir" name="checkbox flip t"/>
+ <spinner label="Döndürme*" name="TexRot"/>
+ <spinner label="Tekrarlar / Metre" name="rptctrl"/>
+ <button label="Uygula" label_selected="Uygula" name="button apply"/>
+ <text name="tex offset">
+ Doku Dengeleyicisi
+ </text>
+ <spinner label="Yatay (U)" name="TexOffsetU"/>
+ <spinner label="Dikey (V)" name="TexOffsetV"/>
+ <panel name="Add_Media">
+ <text name="media_tex">
+ Ortam
+ </text>
+ <button name="add_media" tool_tip="Ortam Ekle"/>
+ <button name="delete_media" tool_tip="Bu ortam dokusunu sil"/>
+ <button name="edit_media" tool_tip="Bu Ortamı Düzenle"/>
+ <button label="Hizala" label_selected="Ortamı Hizala" name="button align" tool_tip="Ortam dokusunu hizala (önce yüklenmelidir)"/>
+ </panel>
+ </panel>
+ <panel label="İçerik" name="Contents">
+ <button label="Yeni Komut Dosyası" label_selected="Yeni Komut Dosyası" name="button new script"/>
+ <button label="İzinler" name="button permissions"/>
+ </panel>
+ </tab_container>
+ <panel name="land info panel">
+ <text name="label_parcel_info">
+ Parsel Bilgisi
+ </text>
+ <text name="label_area_price">
+ Fiyat: [AREA] m² için L$[PRICE]
+ </text>
+ <text name="label_area">
+ Alan: [AREA] m²
+ </text>
+ <button label="Arazi Hakkında" label_selected="Arazi Hakkında" name="button about land"/>
+ <check_box label="Sahipleri göster" name="checkbox show owners" tool_tip="Sahip türüne göre parselleri renklendir: Yeşil = Sizin araziniz Deniz Mavisi = Grubunuzun arazisi Kırmızı = Başkalarının mülkiyetinde Sarı = Satılık Mor = Açık artırmada Gri = Kamuya açık"/>
+ <text name="label_parcel_modify">
+ Parseli DeÄŸiÅŸtir
+ </text>
+ <button label="Böl" label_selected="Böl" name="button subdivide land"/>
+ <button label="BirleÅŸtir" label_selected="BirleÅŸtir" name="button join land"/>
+ <text name="label_parcel_trans">
+ Arazi Alışverişleri
+ </text>
+ <button label="Arazi Satın Al" label_selected="Arazi Satın Al" name="button buy land"/>
+ <button label="Araziyi Terket" label_selected="Araziyi Terket" name="button abandon land"/>
+ </panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_top_objects.xml b/indra/newview/skins/default/xui/tr/floater_top_objects.xml
new file mode 100644
index 0000000000..e726f583cc
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_top_objects.xml
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="top_objects" title="Top Nesneler">
+ <floater.string name="top_scripts_title">
+ Top Komut Dosyaları
+ </floater.string>
+ <floater.string name="top_scripts_text">
+ [COUNT] komut tosyası toplam [TIME] ms sürüyor
+ </floater.string>
+ <floater.string name="scripts_score_label">
+ Süre
+ </floater.string>
+ <floater.string name="scripts_mono_time_label">
+ Mono Süre
+ </floater.string>
+ <floater.string name="top_colliders_title">
+ En Çok Çarpışanlar
+ </floater.string>
+ <floater.string name="top_colliders_text">
+ En çok potansiyel çarpışma yaşayan [COUNT] nesne
+ </floater.string>
+ <floater.string name="colliders_score_label">
+ Skor
+ </floater.string>
+ <floater.string name="none_descriptor">
+ Hiçbiri bulunamadı.
+ </floater.string>
+ <text name="title_text">
+ Yükleniyor...
+ </text>
+ <scroll_list name="objects_list">
+ <scroll_list.columns label="Skor" name="score"/>
+ <scroll_list.columns label="Ad" name="name"/>
+ <scroll_list.columns label="Sahip" name="owner"/>
+ <scroll_list.columns label="Konum" name="location"/>
+ <scroll_list.columns label="Süre" name="time"/>
+ <scroll_list.columns label="Mono Süre" name="mono_time"/>
+ <scroll_list.columns label="URL&apos;ler" name="URLs"/>
+ </scroll_list>
+ <text name="id_text">
+ Nesne KimliÄŸi:
+ </text>
+ <button label="İşareti Göster" name="show_beacon_btn"/>
+ <text name="obj_name_text">
+ Nesne adı:
+ </text>
+ <button label="Filtrele" name="filter_object_btn"/>
+ <text name="owner_name_text">
+ Sahip:
+ </text>
+ <button label="Filtrele" name="filter_owner_btn"/>
+ <button label="Seçileni İade Et" name="return_selected_btn"/>
+ <button label="Tümünü İade Et" name="return_all_btn"/>
+ <button label="Seçileni Devre Dışı Bırak" name="disable_selected_btn"/>
+ <button label="Tümüni Devre Dışı Bırak" name="disable_all_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_tos.xml b/indra/newview/skins/default/xui/tr/floater_tos.xml
new file mode 100644
index 0000000000..7ff0001ddd
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_tos.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="modal container">
+ <floater.string name="real_url">
+ http://secondlife.com/app/tos/
+ </floater.string>
+ <floater.string name="loading_url">
+ data:text/html,%3Chtml%3E%3Chead%3E%3C/head%3E%3Cbody text=%22000000%22%3E%3Ch2%3E Loading %3Ca%20target%3D%22_external%22%20href%3D%22http%3A//secondlife.com/app/tos/%22%3ETerms%20of%20Service%3C/a%3E...%3C/h2%3E %3C/body%3E %3C/html%3E
+ </floater.string>
+ <button label="Devam Et" label_selected="Devam Et" name="Continue"/>
+ <button label="İptal" label_selected="İptal" name="Cancel"/>
+ <check_box label="Hizmet Koşullarını ve Gizlilik Politikasını Kabul Ediyorum" name="agree_chk"/>
+ <text name="tos_heading">
+ Aşağıdaki Hizmet Koşullarını ve Gizlilik Politikasını dikkatle okuyun. [SECOND_LIFE]&apos;ta oturum açmaya devam etmek için anlaşmayı kabul etmelisiniz.
+ </text>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_toybox.xml b/indra/newview/skins/default/xui/tr/floater_toybox.xml
new file mode 100644
index 0000000000..e60e176643
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_toybox.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Toybox" title="ARAÇ ÇUBUĞU DÜĞMELERİ">
+ <text name="toybox label 1">
+ Düğmeleri araç çubuklarına veya araç çubuklarından sürükleyerek ekleyin ya da kaldırın.
+ </text>
+ <text name="toybox label 2">
+ Her bir araç çubuğunun ayarına göre düğmeler gösterilir veya sadece simgeleri yer alır.
+ </text>
+ <button label="Tüm araç çubuklarını temizle" label_selected="Tüm araç çubuklarını temizle" name="btn_clear_all"/>
+ <button label="Varsayılanları geri yükle" label_selected="Varsayılanları geri yükle" name="btn_restore_defaults"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_translation_settings.xml b/indra/newview/skins/default/xui/tr/floater_translation_settings.xml
new file mode 100644
index 0000000000..33ce76bd9a
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_translation_settings.xml
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_translation_settings" title="SOHBET ÇEVİRİSİ AYARLARI">
+ <string name="bing_api_key_not_verified">
+ Bing uygulama kimliği doğrulanmadı. Lütfen tekrar deneyin.
+ </string>
+ <string name="google_api_key_not_verified">
+ Google API anahtarı doğrulanmadı. Lütfen tekrar deneyin.
+ </string>
+ <string name="bing_api_key_verified">
+ Bing uygulama kimliği doğrulandı.
+ </string>
+ <string name="google_api_key_verified">
+ Google API anahtarı doğrulandı.
+ </string>
+ <check_box label="Sohbet ederken makine çevirisini etkinleştirin" name="translate_chat_checkbox"/>
+ <text name="translate_language_label">
+ Sohbeti şu dile çevir:
+ </text>
+ <combo_box name="translate_language_combo">
+ <combo_box.item label="Sistem Varsayılanı" name="System Default Language"/>
+ <combo_box.item label="İngilizce" name="English"/>
+ <combo_box.item label="Dansk (Danca)" name="Danish"/>
+ <combo_box.item label="Deutsch (Almanca)" name="German"/>
+ <combo_box.item label="Español (İspanyolca)" name="Spanish"/>
+ <combo_box.item label="Français (Fransızca)" name="French"/>
+ <combo_box.item label="Italiano (İtalyanca)" name="Italian"/>
+ <combo_box.item label="Magyar (Macarca)" name="Hungarian"/>
+ <combo_box.item label="Nederlands (Flemenkçe)" name="Dutch"/>
+ <combo_box.item label="Polski (Lehçe)" name="Polish"/>
+ <combo_box.item label="Português (Portekizce)" name="Portugese"/>
+ <combo_box.item label="РуÑÑкий (Rusça)" name="Russian"/>
+ <combo_box.item label="Türkçe (Türkçe)" name="Turkish"/>
+ <combo_box.item label="УкраїнÑька (Ukraynaca)" name="Ukrainian"/>
+ <combo_box.item label="中文 (正體) (Çince)" name="Chinese"/>
+ <combo_box.item label="日本語 (Japonca)" name="Japanese"/>
+ <combo_box.item label="한국어 (Korece)" name="Korean"/>
+ </combo_box>
+ <text name="tip">
+ Çeviri hizmetini seçin:
+ </text>
+ <radio_group name="translation_service_rg">
+ <radio_item initial_value="bing" label="Bing Çevirmeni" name="bing"/>
+ <radio_item initial_value="google" label="Google Translate" name="google"/>
+ </radio_group>
+ <text name="bing_api_key_label">
+ Bing [http://www.bing.com/developers/createapp.aspx Uygulama KimliÄŸi]:
+ </text>
+ <button label="DoÄŸrula" name="verify_bing_api_key_btn"/>
+ <text name="google_api_key_label">
+ Google [http://code.google.com/apis/language/translate/v2/getting_started.html#auth API anahtarı]:
+ </text>
+ <button label="DoÄŸrula" name="verify_google_api_key_btn"/>
+ <text name="google_links_text">
+ [http://code.google.com/apis/language/translate/v2/pricing.html Fiyatlandırma] | [https://code.google.com/apis/console İstatistikler]
+ </text>
+ <button label="Tamam" name="ok_btn"/>
+ <button label="İptal" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_url_entry.xml b/indra/newview/skins/default/xui/tr/floater_url_entry.xml
new file mode 100644
index 0000000000..54c5b047a8
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_url_entry.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="url_entry">
+ <text name="media_label">
+ Ortam URL&apos;si:
+ </text>
+ <button label="Tamam" name="ok_btn"/>
+ <button label="İptal" name="cancel_btn"/>
+ <button label="Temizle" name="clear_btn"/>
+ <text name="loading_label">
+ Yükleniyor...
+ </text>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_voice_controls.xml b/indra/newview/skins/default/xui/tr/floater_voice_controls.xml
new file mode 100644
index 0000000000..5ff0804f17
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_voice_controls.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_voice_controls" title="SES DENETİMLERİ">
+ <string name="title_nearby">
+ SES AYARLARI
+ </string>
+ <string name="title_group">
+ [GROUP] İLE GRUP ARAMASI
+ </string>
+ <string name="title_adhoc">
+ KONFERANS ARAMASI
+ </string>
+ <string name="title_peer_2_peer">
+ [NAME] İLE ARAMA
+ </string>
+ <string name="no_one_near">
+ Yakındaki kimsede ses etkin değil
+ </string>
+ <layout_stack name="my_call_stack">
+ <layout_panel name="my_panel">
+ <text name="user_text" value="Avatarım:"/>
+ </layout_panel>
+ <layout_panel name="leave_call_panel">
+ <layout_stack name="voice_effect_and_leave_call_stack">
+ <layout_panel name="leave_call_btn_panel">
+ <button label="Aramadan Ayrıl" name="leave_call_btn"/>
+ </layout_panel>
+ </layout_stack>
+ </layout_panel>
+ </layout_stack>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_voice_effect.xml b/indra/newview/skins/default/xui/tr/floater_voice_effect.xml
new file mode 100644
index 0000000000..a10da39a69
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_voice_effect.xml
@@ -0,0 +1,138 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater label="Yerler" name="voice_effects" title="SES ŞEKİLLENDİRME">
+ <string name="no_voice_effect">
+ (Ses Åžekillendirme Yok)
+ </string>
+ <string name="active_voice_effect">
+ (Etkin)
+ </string>
+ <string name="unsubscribed_voice_effect">
+ (Abonelik İptal)
+ </string>
+ <string name="new_voice_effect">
+ (Yeni!)
+ </string>
+ <string name="effect_Arena">
+ Arena
+ </string>
+ <string name="effect_Beast">
+ Yaratık
+ </string>
+ <string name="effect_Buff">
+ Yapılı
+ </string>
+ <string name="effect_Buzz">
+ Vızıltı
+ </string>
+ <string name="effect_Camille">
+ Camille
+ </string>
+ <string name="effect_Creepy">
+ Korkutucu
+ </string>
+ <string name="effect_CreepyBot">
+ KorkutucuBot
+ </string>
+ <string name="effect_Cyber">
+ Siber
+ </string>
+ <string name="effect_DeepBot">
+ DerinBot
+ </string>
+ <string name="effect_Demon">
+ İblis
+ </string>
+ <string name="effect_Flirty">
+ Cilveli
+ </string>
+ <string name="effect_Foxy">
+ Alımlı
+ </string>
+ <string name="effect_Halloween_2010_Bonus">
+ Halloween_2010_Bonus
+ </string>
+ <string name="effect_Helium">
+ Helyum
+ </string>
+ <string name="effect_Husky">
+ Güçlü
+ </string>
+ <string name="effect_Intercom">
+ İnterkom
+ </string>
+ <string name="effect_Macho">
+ Maço
+ </string>
+ <string name="effect_Micro">
+ Mikro
+ </string>
+ <string name="effect_Mini">
+ Mini
+ </string>
+ <string name="effect_Nano">
+ Nano
+ </string>
+ <string name="effect_Nightmare">
+ Kabus
+ </string>
+ <string name="effect_PopBot">
+ PopBot
+ </string>
+ <string name="effect_Rachel">
+ Rachel
+ </string>
+ <string name="effect_Radio">
+ Radyo
+ </string>
+ <string name="effect_Robot">
+ Robot
+ </string>
+ <string name="effect_Roxanne">
+ Roxanne
+ </string>
+ <string name="effect_Sabrina">
+ Sabrina
+ </string>
+ <string name="effect_Samantha">
+ Samantha
+ </string>
+ <string name="effect_Sexy">
+ Seksi
+ </string>
+ <string name="effect_Shorty">
+ Bücür
+ </string>
+ <string name="effect_Sneaky">
+ Sinsi
+ </string>
+ <string name="effect_Stallion">
+ Maskülen
+ </string>
+ <string name="effect_Sultry">
+ İhtiraslı
+ </string>
+ <string name="effect_Thunder">
+ Gök gürültüsü
+ </string>
+ <string name="effect_Vixen">
+ Çekici
+ </string>
+ <string name="effect_WhinyBot">
+ AÄŸlakBot
+ </string>
+ <text name="preview_text">
+ Önizleme için
+ </text>
+ <text name="status_text">
+ Bir örnek kaydettikten sonra sese tıklayarak nasıl olduğunu duyun.
+ </text>
+ <button label="Kaydet" name="record_btn" tool_tip="Sesinizin örneğini kaydedin."/>
+ <button label="Durdur" name="record_stop_btn"/>
+ <text name="voice_morphing_link">
+ [[URL] Hemen Abone Ol]
+ </text>
+ <scroll_list name="voice_effect_list" tool_tip="Sesinizin örneğini kaydettikten sonra önizleme için bir efekte tıklayın.">
+ <scroll_list.columns label="Ses Adı" name="name"/>
+ <scroll_list.columns label="BitiÅŸ Tarihi" name="expires"/>
+ </scroll_list>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_water.xml b/indra/newview/skins/default/xui/tr/floater_water.xml
new file mode 100644
index 0000000000..66d6c1e30d
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_water.xml
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Water Floater" title="GELİŞMİŞ SU DÜZENLEYİCİ">
+ <floater.string name="WLDefaultWaterNames">
+ Varsayılan:Camsı:Havuz:çamurlu:İkinci Veba:YILAN!!!:Valdez
+ </floater.string>
+ <text name="KeyFramePresetsText">
+ Su Ön Ayarları:
+ </text>
+ <button label="Yeni" label_selected="Yeni" name="WaterNewPreset"/>
+ <button label="Kaydet" label_selected="Kaydet" name="WaterSavePreset"/>
+ <button label="Sil" label_selected="Sil" name="WaterDeletePreset"/>
+ <tab_container name="Water Tabs">
+ <panel label="AYARLAR" name="Settings">
+ <text name="BHText">
+ Su Sisi Rengi
+ </text>
+ <color_swatch name="WaterFogColor" tool_tip="Renk seçiciyi açmak için tıklayın"/>
+ <text name="WaterFogDensText">
+ Su Yoğunluk Üssü
+ </text>
+ <text name="WaterUnderWaterFogModText">
+ Sualtı Sis Değiştiricisi
+ </text>
+ <text name="BDensText">
+ Yansıma Dalgacığı Ölçeği
+ </text>
+ <slider label="1" name="WaterNormalScaleX"/>
+ <slider label="2" name="WaterNormalScaleY"/>
+ <slider label="3" name="WaterNormalScaleZ"/>
+ <text name="HDText">
+ Fresnel Ölçeği
+ </text>
+ <text name="FresnelOffsetText">
+ Fresnel Dengeleyicisi
+ </text>
+ <text name="DensMultText">
+ Yukarıdan Kırılma Ölçeği
+ </text>
+ <text name="WaterScaleBelowText">
+ Aşağıdan Kırılma Ölçeği
+ </text>
+ <text name="MaxAltText">
+ Bulanıklaştırma Çarpanı
+ </text>
+ </panel>
+ <panel label="GÖRÜNTÜ" name="Waves">
+ <text name="BHText">
+ Büyük Dalga Yönü
+ </text>
+ <text name="WaterWave1DirXText">
+ X
+ </text>
+ <text name="WaterWave1DirYText">
+ Y
+ </text>
+ <text name="BHText2">
+ Küçük Dalga Yönü
+ </text>
+ <text name="WaterWave2DirXText">
+ X
+ </text>
+ <text name="WaterWave2DirYText">
+ Y
+ </text>
+ <text name="BHText3">
+ Normal Harita
+ </text>
+ </panel>
+ </tab_container>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_web_content.xml b/indra/newview/skins/default/xui/tr/floater_web_content.xml
new file mode 100644
index 0000000000..93491b80fb
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_web_content.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_web_content" title="">
+ <layout_stack name="stack1">
+ <layout_panel name="nav_controls">
+ <button name="back" tool_tip="Geri Git"/>
+ <button name="forward" tool_tip="İleri Git"/>
+ <button name="stop" tool_tip="Navigasyonu durdur"/>
+ <button name="reload" tool_tip="Sayfayı tekrar yükle"/>
+ <combo_box name="address" tool_tip="URL&apos;yi buraya gir"/>
+ <icon name="media_secure_lock_flag" tool_tip="Güvenli Tarama"/>
+ <button name="popexternal" tool_tip="Mevcut URL&apos;yi masaüstü tarayıcıda aç"/>
+ </layout_panel>
+ </layout_stack>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_whitelist_entry.xml b/indra/newview/skins/default/xui/tr/floater_whitelist_entry.xml
new file mode 100644
index 0000000000..1a9f731af0
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_whitelist_entry.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="whitelist_entry" title="GÜVENİLENLER LİSTESİ GİRİŞİ">
+ <text name="media_label">
+ İzin verilen alan adlarının listesine eklemek için bir URL ya da URL örneği girin
+ </text>
+ <line_editor name="whitelist_entry" tool_tip="Güvenilenler Listesine eklemek için bir URL ya da URL örneği girin"/>
+ <button label="Tamam" name="ok_btn"/>
+ <button label="İptal" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_windlight_options.xml b/indra/newview/skins/default/xui/tr/floater_windlight_options.xml
new file mode 100644
index 0000000000..6c5fba374c
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_windlight_options.xml
@@ -0,0 +1,167 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="WindLight floater" title="GELİŞMİŞ GÖKYÜZÜ DÜZENLEYİCİ">
+ <floater.string name="WLDefaultSkyNames">
+ A-12:A-24:A-3:A-15:A-16.30:A-6:A-18:A-9:A-21:Barselona:Tipi:Mavi Gün Ortası:Sahilde Öğleden Sonra:Sahilde Gün Batımı:Varsayılan:Çölde Gün Batımı:Güzel Bir Gün:Kabarık Büyük Bulutlar:Sisli:Şık Şık:Şık Şık Şık:Dondurma:Hayalet:Uygunsuz Gerçekler:Gün Ortası1:Gün Ortası 2:Gün Ortası 3:Gün Ortası 4:Gece:Korsan:Mor:Denizcinin Keyfi:Saf Tensel
+ </floater.string>
+ <text name="KeyFramePresetsText">
+ Gökyüzü Ön Ayarları:
+ </text>
+ <button label="Yeni" label_selected="Yeni" name="WLNewPreset"/>
+ <button label="Kaydet" label_selected="Kaydet" name="WLSavePreset"/>
+ <button label="Sil" label_selected="Sil" name="WLDeletePreset"/>
+ <button label="Gün Döngüsü Düzenleyici" label_selected="Gün Döngüsü Düzenleyici" name="WLDayCycleMenuButton"/>
+ <tab_container name="WindLight Tabs">
+ <panel label="ATMOSFER" name="Atmosphere">
+ <text name="BHText">
+ Mavi Ufuk
+ </text>
+ <text name="BHText2">
+ R
+ </text>
+ <text name="BHText3">
+ G
+ </text>
+ <text name="BHText4">
+ B
+ </text>
+ <text name="BHText5">
+ I
+ </text>
+ <text name="BDensText">
+ Puslu Ufuk
+ </text>
+ <text name="BDensText2">
+ Mavi YoÄŸunluÄŸu
+ </text>
+ <text name="BHText6">
+ R
+ </text>
+ <text name="BHText7">
+ G
+ </text>
+ <text name="BHText8">
+ B
+ </text>
+ <text name="BHText9">
+ I
+ </text>
+ <text name="HDText">
+ Pus YoÄŸunluÄŸu
+ </text>
+ <text name="DensMultText">
+ Yoğunluk Çarpanı
+ </text>
+ <text name="WLDistanceMultText">
+ Mesafe Çarpanı
+ </text>
+ <text name="MaxAltText">
+ Maks İrtifa
+ </text>
+ </panel>
+ <panel label="AYDINLATMA" name="Lighting">
+ <text name="SLCText">
+ Güneş/Ay Rengi
+ </text>
+ <text name="BHText">
+ R
+ </text>
+ <text name="BHText2">
+ G
+ </text>
+ <text name="BHText3">
+ B
+ </text>
+ <text name="BHText4">
+ I
+ </text>
+ <text name="TODText">
+ Güneş/Ay Konumu
+ </text>
+ <text name="WLAmbientText">
+ Ortam
+ </text>
+ <text name="BHText5">
+ R
+ </text>
+ <text name="BHText6">
+ G
+ </text>
+ <text name="BHText7">
+ B
+ </text>
+ <text name="BHText8">
+ I
+ </text>
+ <text name="WLEastAngleText">
+ Doğu Açısı
+ </text>
+ <text name="SunGlowText">
+ Güneş Parıltısı
+ </text>
+ <slider label="Odak" name="WLGlowB"/>
+ <slider label="Büyüklük" name="WLGlowR"/>
+ <text name="SceneGammaText">
+ Sahne Gaması
+ </text>
+ <text name="WLStarText">
+ Yıldız Parlaklığı
+ </text>
+ </panel>
+ <panel label="BULUTLAR" name="Clouds">
+ <text name="WLCloudColorText">
+ Bulut Rengi
+ </text>
+ <text name="BHText">
+ R
+ </text>
+ <text name="BHText2">
+ G
+ </text>
+ <text name="BHText3">
+ B
+ </text>
+ <text name="BHText4">
+ I
+ </text>
+ <text name="WLCloudColorText2">
+ Bulut XY/YoÄŸunluÄŸu
+ </text>
+ <text name="BHText5">
+ X
+ </text>
+ <text name="BHText6">
+ Y
+ </text>
+ <text name="BHText7">
+ D
+ </text>
+ <text name="WLCloudCoverageText">
+ Bulut Örtüsü
+ </text>
+ <text name="WLCloudScaleText">
+ Bulut Yüksekliği
+ </text>
+ <text name="WLCloudDetailText">
+ Bulut Ayrıntısı (XY/Yoğunluğu)
+ </text>
+ <text name="BHText8">
+ X
+ </text>
+ <text name="BHText9">
+ Y
+ </text>
+ <text name="BHText10">
+ D
+ </text>
+ <text name="WLCloudScrollXText">
+ Bulut Kaydırma X
+ </text>
+ <check_box label="Kilitle" name="WLCloudLockX"/>
+ <text name="WLCloudScrollYText">
+ Bulut Kaydırma Y
+ </text>
+ <check_box label="Kilitle" name="WLCloudLockY"/>
+ <check_box label="Klasik Bulutlar Çiz" name="DrawClassicClouds"/>
+ </panel>
+ </tab_container>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_window_size.xml b/indra/newview/skins/default/xui/tr/floater_window_size.xml
new file mode 100644
index 0000000000..acc2cc3376
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_window_size.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="window_size" title="PENCERE BÜYÜKLÜĞÜ">
+ <string name="resolution_format">
+ [RES_X] x [RES_Y]
+ </string>
+ <text name="windowsize_text">
+ Pencere büyüklüğünü ayarla:
+ </text>
+ <combo_box name="window_size_combo" tool_tip="genişlik x yükseklik">
+ <combo_box.item label="1000 x 700 (varsayılan)" name="item0"/>
+ <combo_box.item label="1024 x 768" name="item1"/>
+ <combo_box.item label="1280 x 720 (720p)" name="item2"/>
+ <combo_box.item label="1920 x 1080 (1080p)" name="item3"/>
+ </combo_box>
+ <button label="Ayarla" name="set_btn"/>
+ <button label="İptal" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_world_map.xml b/indra/newview/skins/default/xui/tr/floater_world_map.xml
new file mode 100644
index 0000000000..e4729c2aed
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_world_map.xml
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="worldmap" title="DÜNYA HARİTASI">
+ <panel name="layout_panel_1">
+ <text name="events_label">
+ Lejand
+ </text>
+ </panel>
+ <panel name="layout_panel_2">
+ <button name="Show My Location" tool_tip="Haritanın merkezi avatarımın konumu olsun"/>
+ <text name="me_label">
+ Ben
+ </text>
+ <text name="person_label">
+ KiÅŸi
+ </text>
+ <text name="infohub_label">
+ Bilgi İstasyonu
+ </text>
+ <text name="land_sale_label">
+ Arazi Satışı
+ </text>
+ <text name="auction_label">
+ arazi açık artırması
+ </text>
+ <text name="by_owner_label">
+ sahibi tarafından
+ </text>
+ <button name="Go Home" tool_tip="Ana konumuma ışınla"/>
+ <text name="Home_label">
+ Ana konum
+ </text>
+ <text name="events_label">
+ Etkinlikler:
+ </text>
+ <text name="pg_label">
+ Genel
+ </text>
+ <check_box initial_value="true" name="events_mature_chk"/>
+ <text name="events_mature_label">
+ Orta
+ </text>
+ <text name="events_adult_label">
+ YetiÅŸkin
+ </text>
+ </panel>
+ <panel name="layout_panel_3">
+ <text name="find_on_map_label">
+ Haritada Bul
+ </text>
+ </panel>
+ <panel name="layout_panel_4">
+ <combo_box label="Çevrimiçi Arkadaşlar" name="friend combo" tool_tip="Haritada arkadaşlar gösterilsin">
+ <combo_box.item label="Çevrimiçi Arkadaşlarım" name="item1"/>
+ </combo_box>
+ <combo_box label="Yer İmlerim" name="landmark combo" tool_tip="Haritada gösterilecek yer imi">
+ <combo_box.item label="Yer İmlerim" name="item1"/>
+ </combo_box>
+ <search_editor label="Adlarına Göre Bölgeler" name="location" tool_tip="Bir bölgenin adını yazın"/>
+ <button label="Bul" name="DoSearch" tool_tip="Bölge ara"/>
+ <button name="Clear" tool_tip="Takip çizgilerini temizle ve haritayı sıfırla"/>
+ <text name="events_label">
+ Konum:
+ </text>
+ <button label="Işınla" name="Teleport" tool_tip="Seçilen konuma ışınla"/>
+ <button label="SLurl&apos;i Kopyala" name="copy_slurl" tool_tip="Mevcut konumu, web üzerinde kullanılması için SLurl olarak kopyalar."/>
+ <button label="Seçimi Göster" name="Show Destination" tool_tip="Haritanın merkezi seçilen konum olsun"/>
+ </panel>
+ <panel name="layout_panel_5">
+ <text name="zoom_label">
+ Yakınlaştır
+ </text>
+ </panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/inspect_avatar.xml b/indra/newview/skins/default/xui/tr/inspect_avatar.xml
new file mode 100644
index 0000000000..cb3c7e9282
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/inspect_avatar.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!--
+ Not can_close / no title to avoid window chrome
+ Single instance - only have one at a time, recycle it each spawn
+-->
+<floater name="inspect_avatar">
+ <string name="Subtitle">
+ [AGE]
+ </string>
+ <string name="Details">
+ [SL_PROFILE]
+ </string>
+ <text name="user_subtitle" value="11 ay, 3 günlük"/>
+ <text name="user_details">
+ Second Life içerisindeki tanımım bu, harika olduğunu düşünüyorum. Ama nedense tanımım gerçekten çok uzun çünkü çok konuşmayı seviyorum.
+ </text>
+ <slider name="volume_slider" tool_tip="Ses düzeyi" value="0.5"/>
+ <button label="ArkadaÅŸ Ekle" name="add_friend_btn"/>
+ <button label="Aİ" name="im_btn"/>
+ <button label="Profil" name="view_profile_btn"/>
+ <panel name="moderator_panel">
+ <button label="Sesi Devre Dışı Bırak" name="disable_voice"/>
+ <button label="Sesi EtkinleÅŸtir" name="enable_voice"/>
+ </panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/inspect_group.xml b/indra/newview/skins/default/xui/tr/inspect_group.xml
new file mode 100644
index 0000000000..9b130c9ef6
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/inspect_group.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!--
+ Not can_close / no title to avoid window chrome
+ Single instance - only have one at a time, recycle it each spawn
+-->
+<floater name="inspect_group">
+ <string name="PrivateGroup">
+ Özel grup
+ </string>
+ <string name="FreeToJoin">
+ Katılım ücretsiz
+ </string>
+ <string name="CostToJoin">
+ Katılmak için L$[AMOUNT] gerekiyor
+ </string>
+ <string name="YouAreMember">
+ Siz üyesiniz
+ </string>
+ <text name="group_subtitle">
+ 123 üye
+ </text>
+ <text name="group_details">
+ İçinde geyik olan bir oda oluşturmakla sorumlu bir grup insan.
+Geyikten korkun! Korkun! Firavun faresinden de!
+ </text>
+ <text name="group_cost">
+ Katılmak için L$123 gerekiyor
+ </text>
+ <button label="Katıl" name="join_btn"/>
+ <button label="Ayrıl" name="leave_btn"/>
+ <button label="Profili Göster" name="view_profile_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/inspect_object.xml b/indra/newview/skins/default/xui/tr/inspect_object.xml
new file mode 100644
index 0000000000..bd09267319
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/inspect_object.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!--
+ Not can_close / no title to avoid window chrome
+ Single instance - only have one at a time, recycle it each spawn
+-->
+<floater name="inspect_object">
+ <string name="Creator">
+ [CREATOR] tarafından
+ </string>
+ <string name="CreatorAndOwner">
+ [CREATOR] tarafından
+Sahip [OWNER]
+ </string>
+ <string name="Price">
+ L$[AMOUNT]
+ </string>
+ <string name="PriceFree">
+ Ücretsiz!
+ </string>
+ <string name="Touch">
+ Dokun
+ </string>
+ <string name="Sit">
+ Otur
+ </string>
+ <text name="object_creator">
+ şunun tarafından: secondlife:///app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/about
+sahip: secondlife:///app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/about
+ </text>
+ <text name="price_text">
+ L$30,000
+ </text>
+ <icon name="secure_browsing" tool_tip="Güvenli Tarama"/>
+ <text name="object_media_url">
+ http://www.superdupertest.com
+ </text>
+ <button label="Satın Al" name="buy_btn"/>
+ <button label="Öde" name="pay_btn"/>
+ <button label="Kopya Al" name="take_free_copy_btn"/>
+ <button label="Dokun" name="touch_btn"/>
+ <button label="Otur" name="sit_btn"/>
+ <button label="Aç" name="open_btn"/>
+ <button label="Daha Fazla" name="more_info_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/inspect_remote_object.xml b/indra/newview/skins/default/xui/tr/inspect_remote_object.xml
new file mode 100644
index 0000000000..4b696b2ae5
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/inspect_remote_object.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!--
+ Not can_close / no title to avoid window chrome
+ Single instance - only have one at a time, recycle it each spawn
+-->
+<floater name="inspect_remote_object">
+ <text name="object_name">
+ Çok Uzun Test Nesne Adı Aman Tanrım bu gerçekten o kadar uzun bir nesne adı ki bu kadar uzun olduğuna inanmıyorum.
+ </text>
+ <text name="object_owner_label">
+ Sahip:
+ </text>
+ <text name="object_owner">
+ Uzunavataradı Farukkalaycigillerdendegil
+ </text>
+ <text name="object_slurl">
+ http://slurl.com/Ahern/50/50/50
+ </text>
+ <button label="Harita" name="map_btn"/>
+ <button label="Engelle" name="block_btn"/>
+ <button label="Kapat" name="close_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/menu_add_wearable_gear.xml b/indra/newview/skins/default/xui/tr/menu_add_wearable_gear.xml
new file mode 100644
index 0000000000..dcb4629259
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_add_wearable_gear.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="Add Wearable Gear Menu">
+ <menu_item_check label="En Sonunculara Göre Sırala" name="sort_by_most_recent"/>
+ <menu_item_check label="Ada Göre Sırala" name="sort_by_name"/>
+ <menu_item_check label="Türe Göre Sırala" name="sort_by_type"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_attachment_other.xml b/indra/newview/skins/default/xui/tr/menu_attachment_other.xml
new file mode 100644
index 0000000000..9ba214ff31
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_attachment_other.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- *NOTE: See also menu_avatar_other.xml -->
+<context_menu name="Avatar Pie">
+ <menu_item_call label="Profili Göster" name="Profile..."/>
+ <menu_item_call label="ArkadaÅŸ Ekle" name="Add Friend"/>
+ <menu_item_call label="Aİ" name="Send IM..."/>
+ <menu_item_call label="Ara" name="Call"/>
+ <menu_item_call label="Gruba Davet Et" name="Invite..."/>
+ <menu_item_call label="Engelle" name="Avatar Mute"/>
+ <menu_item_call label="Raporla" name="abuse"/>
+ <menu_item_call label="Dondur" name="Freeze..."/>
+ <menu_item_call label="Çıkar" name="Eject..."/>
+ <menu_item_call label="Dokularda Hata Ayıkla" name="Debug..."/>
+ <menu_item_call label="Yakınlaştır" name="Zoom In"/>
+ <menu_item_call label="Öde" name="Pay..."/>
+ <menu_item_call label="Nesne Profili" name="Object Inspect"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_attachment_self.xml b/indra/newview/skins/default/xui/tr/menu_attachment_self.xml
new file mode 100644
index 0000000000..16d1e3f356
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_attachment_self.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Attachment Pie">
+ <menu_item_call label="Dokun" name="Attachment Object Touch"/>
+ <menu_item_call label="Düzenle" name="Edit..."/>
+ <menu_item_call label="Ayır" name="Detach"/>
+ <menu_item_call label="Otur" name="Sit Down Here"/>
+ <menu_item_call label="Kalk" name="Stand Up"/>
+ <menu_item_call label="Görünümüm" name="Change Outfit"/>
+ <menu_item_call label="Dış Görünümümü Düzenle" name="Edit Outfit"/>
+ <menu_item_call label="Şeklimi Düzenle" name="Edit My Shape"/>
+ <menu_item_call label="Arkadaşlarım" name="Friends..."/>
+ <menu_item_call label="Gruplarım" name="Groups..."/>
+ <menu_item_call label="Profilim" name="Profile..."/>
+ <menu_item_call label="Dokularda Hata Ayıkla" name="Debug..."/>
+ <menu_item_call label="Bırak" name="Drop"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_avatar_icon.xml b/indra/newview/skins/default/xui/tr/menu_avatar_icon.xml
new file mode 100644
index 0000000000..d3ef490735
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_avatar_icon.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Avatar Icon Menu">
+ <menu_item_call label="Profili Göster" name="Show Profile"/>
+ <menu_item_call label="Aİ Gönder..." name="Send IM"/>
+ <menu_item_call label="ArkadaÅŸ Ekle..." name="Add Friend"/>
+ <menu_item_call label="Arkadaşı Çıkar..." name="Remove Friend"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_avatar_other.xml b/indra/newview/skins/default/xui/tr/menu_avatar_other.xml
new file mode 100644
index 0000000000..7d691d2ac5
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_avatar_other.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- *NOTE: See also menu_attachment_other.xml -->
+<context_menu name="Avatar Pie">
+ <menu_item_call label="Profili Göster" name="Profile..."/>
+ <menu_item_call label="ArkadaÅŸ Ekle" name="Add Friend"/>
+ <menu_item_call label="Aİ" name="Send IM..."/>
+ <menu_item_call label="Ara" name="Call"/>
+ <menu_item_call label="Gruba Davet Et" name="Invite..."/>
+ <menu_item_call label="Engelle" name="Avatar Mute"/>
+ <menu_item_call label="Raporla" name="abuse"/>
+ <menu_item_call label="Dondur" name="Freeze..."/>
+ <menu_item_call label="Çıkar" name="Eject..."/>
+ <menu_item_call label="Dokularda Hata Ayıkla" name="Debug..."/>
+ <menu_item_call label="Yakınlaştır" name="Zoom In"/>
+ <menu_item_call label="Öde" name="Pay..."/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_avatar_self.xml b/indra/newview/skins/default/xui/tr/menu_avatar_self.xml
new file mode 100644
index 0000000000..c520aff521
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_avatar_self.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Self Pie">
+ <menu_item_call label="Otur" name="Sit Down Here"/>
+ <menu_item_call label="Kalk" name="Stand Up"/>
+ <context_menu label="Çıkar" name="Take Off &gt;">
+ <context_menu label="Giysiler" name="Clothes &gt;">
+ <menu_item_call label="Gömlek" name="Shirt"/>
+ <menu_item_call label="Pantolon" name="Pants"/>
+ <menu_item_call label="Etek" name="Skirt"/>
+ <menu_item_call label="Ayakkabılar" name="Shoes"/>
+ <menu_item_call label="Çoraplar" name="Socks"/>
+ <menu_item_call label="Ceket" name="Jacket"/>
+ <menu_item_call label="Eldivenler" name="Gloves"/>
+ <menu_item_call label="Fanila" name="Self Undershirt"/>
+ <menu_item_call label="Külot" name="Self Underpants"/>
+ <menu_item_call label="Dövme" name="Self Tattoo"/>
+ <menu_item_call label="Fizik" name="Self Physics"/>
+ <menu_item_call label="Alfa" name="Self Alpha"/>
+ <menu_item_call label="Tüm Giysiler" name="All Clothes"/>
+ </context_menu>
+ <context_menu label="BÜG" name="Object Detach HUD"/>
+ <context_menu label="Ayır" name="Object Detach"/>
+ <menu_item_call label="Tümünü Ayır" name="Detach All"/>
+ </context_menu>
+ <menu_item_call label="Görünümüm" name="Chenge Outfit"/>
+ <menu_item_call label="Dış Görünümümü Düzenle" name="Edit Outfit"/>
+ <menu_item_call label="Şeklimi Düzenle" name="Edit My Shape"/>
+ <menu_item_call label="Arkadaşlarım" name="Friends..."/>
+ <menu_item_call label="Gruplarım" name="Groups..."/>
+ <menu_item_call label="Profilim" name="Profile..."/>
+ <menu_item_call label="Dokularda Hata Ayıkla" name="Debug..."/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_bottomtray.xml b/indra/newview/skins/default/xui/tr/menu_bottomtray.xml
new file mode 100644
index 0000000000..f17c0f9971
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_bottomtray.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="hide_camera_move_controls_menu">
+ <menu_item_check label="Konuşma Düğmesi" name="EnableVoiceChat"/>
+ <menu_item_check label="Mimik düğmesi" name="ShowGestureButton"/>
+ <menu_item_check label="Taşıma düğmesi" name="ShowMoveButton"/>
+ <menu_item_check label="Görüntüleme düğmesi" name="ShowCameraButton"/>
+ <menu_item_check label="Anlık görüntü düğmesi" name="ShowSnapshotButton"/>
+ <menu_item_check label="İnşa Et düğmesi" name="ShowBuildButton"/>
+ <menu_item_check label="Arama düğmesi" name="ShowSearchButton"/>
+ <menu_item_check label="Harita düğmesi" name="ShowWorldMapButton"/>
+ <menu_item_check label="Mini-harita düğmesi" name="ShowMiniMapButton"/>
+ <menu_item_call label="Kes" name="NearbyChatBar_Cut"/>
+ <menu_item_call label="Kopyala" name="NearbyChatBar_Copy"/>
+ <menu_item_call label="Yapıştır" name="NearbyChatBar_Paste"/>
+ <menu_item_call label="Sil" name="NearbyChatBar_Delete"/>
+ <menu_item_call label="Tümünü Seç" name="NearbyChatBar_Select_All"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_cof_attachment.xml b/indra/newview/skins/default/xui/tr/menu_cof_attachment.xml
new file mode 100644
index 0000000000..d57c43f6c1
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_cof_attachment.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="COF Attachment">
+ <menu_item_call label="Ayır" name="detach"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_cof_body_part.xml b/indra/newview/skins/default/xui/tr/menu_cof_body_part.xml
new file mode 100644
index 0000000000..31f77d834a
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_cof_body_part.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="COF Body">
+ <menu_item_call label="DeÄŸiÅŸtir" name="replace"/>
+ <menu_item_call label="Düzenle" name="edit"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_cof_clothing.xml b/indra/newview/skins/default/xui/tr/menu_cof_clothing.xml
new file mode 100644
index 0000000000..784d809d70
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_cof_clothing.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="COF Clothing">
+ <menu_item_call label="Çıkar" name="take_off"/>
+ <menu_item_call label="Düzenle" name="edit"/>
+ <menu_item_call label="DeÄŸiÅŸtir" name="replace"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_cof_gear.xml b/indra/newview/skins/default/xui/tr/menu_cof_gear.xml
new file mode 100644
index 0000000000..f910e1fe91
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_cof_gear.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="Gear COF">
+ <menu label="Yeni Giysiler" name="COF.Gear.New_Clothes"/>
+ <menu label="Yeni Vücut Bölümleri" name="COF.Geear.New_Body_Parts"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_edit.xml b/indra/newview/skins/default/xui/tr/menu_edit.xml
new file mode 100644
index 0000000000..81cd270af0
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_edit.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu label="Düzenle" name="Edit">
+ <menu_item_call label="Geri Al" name="Undo"/>
+ <menu_item_call label="Yinele" name="Redo"/>
+ <menu_item_call label="Kes" name="Cut"/>
+ <menu_item_call label="Kopyala" name="Copy"/>
+ <menu_item_call label="Yapıştır" name="Paste"/>
+ <menu_item_call label="Sil" name="Delete"/>
+ <menu_item_call label="Çoğalt" name="Duplicate"/>
+ <menu_item_call label="Tümünü Seç" name="Select All"/>
+ <menu_item_call label="Seçimi Kaldır" name="Deselect"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_favorites.xml b/indra/newview/skins/default/xui/tr/menu_favorites.xml
new file mode 100644
index 0000000000..7bb2ed1ddc
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_favorites.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Popup">
+ <menu_item_call label="Işınla" name="Teleport To Landmark"/>
+ <menu_item_call label="Yer İmini Görüntüle/Düzenle" name="Landmark Open"/>
+ <menu_item_call label="SLurl&apos;i Kopyala" name="Copy slurl"/>
+ <menu_item_call label="Haritada Göster" name="Show On Map"/>
+ <menu_item_call label="Kopyala" name="Landmark Copy"/>
+ <menu_item_call label="Yapıştır" name="Landmark Paste"/>
+ <menu_item_call label="Sil" name="Delete"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_gesture_gear.xml b/indra/newview/skins/default/xui/tr/menu_gesture_gear.xml
new file mode 100644
index 0000000000..cb9b678fdd
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_gesture_gear.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="menu_gesture_gear">
+ <menu_item_call label="Favorilere Ekle/Çıkar" name="activate"/>
+ <menu_item_call label="Kopyala" name="copy_gesture"/>
+ <menu_item_call label="Yapıştır" name="paste"/>
+ <menu_item_call label="UUID&apos;yi Kopyala" name="copy_uuid"/>
+ <menu_item_call label="Mevcut dış görünüme kaydet" name="save_to_outfit"/>
+ <menu_item_call label="Düzenle" name="edit_gesture"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_group_plus.xml b/indra/newview/skins/default/xui/tr/menu_group_plus.xml
new file mode 100644
index 0000000000..82cf7dcf74
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_group_plus.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_group_plus">
+ <menu_item_call label="Gruba Katıl..." name="item_join"/>
+ <menu_item_call label="Yeni Grup..." name="item_new"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_hide_navbar.xml b/indra/newview/skins/default/xui/tr/menu_hide_navbar.xml
new file mode 100644
index 0000000000..d1f213516b
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_hide_navbar.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="hide_navbar_menu">
+ <menu_item_check label="Gezinme ve Favoriler Çubuğunu Göster" name="ShowNavbarNavigationPanel"/>
+ <menu_item_check label="Favoriler Çubuğunu Göster" name="ShowNavbarFavoritesPanel"/>
+ <menu_item_check label="Mini Konum Çubuğunu Göster" name="ShowMiniLocationPanel"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_im_well_button.xml b/indra/newview/skins/default/xui/tr/menu_im_well_button.xml
new file mode 100644
index 0000000000..c3e559a723
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_im_well_button.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="IM Well Button Context Menu">
+ <menu_item_call label="Tümünü Kapat" name="Close All"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_imchiclet_adhoc.xml b/indra/newview/skins/default/xui/tr/menu_imchiclet_adhoc.xml
new file mode 100644
index 0000000000..0396ad8fb5
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_imchiclet_adhoc.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="IMChiclet AdHoc Menu">
+ <menu_item_call label="Oturumu Bitir" name="End Session"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_imchiclet_group.xml b/indra/newview/skins/default/xui/tr/menu_imchiclet_group.xml
new file mode 100644
index 0000000000..60a50b114e
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_imchiclet_group.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="IMChiclet Group Menu">
+ <menu_item_call label="Grup Bilgisi" name="Show Profile"/>
+ <menu_item_call label="Oturumu Göster" name="Chat"/>
+ <menu_item_call label="Oturumu Bitir" name="End Session"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_imchiclet_p2p.xml b/indra/newview/skins/default/xui/tr/menu_imchiclet_p2p.xml
new file mode 100644
index 0000000000..0ef4471088
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_imchiclet_p2p.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="IMChiclet P2P Menu">
+ <menu_item_call label="Profili Göster" name="Show Profile"/>
+ <menu_item_call label="ArkadaÅŸ Ekle" name="Add Friend"/>
+ <menu_item_call label="Oturumu Göster" name="Send IM"/>
+ <menu_item_call label="Oturumu Bitir" name="End Session"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_inspect_avatar_gear.xml b/indra/newview/skins/default/xui/tr/menu_inspect_avatar_gear.xml
new file mode 100644
index 0000000000..69432e967b
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_inspect_avatar_gear.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<toggleable_menu name="Gear Menu">
+ <menu_item_call label="Profili Göster" name="view_profile"/>
+ <menu_item_call label="ArkadaÅŸ Ekle" name="add_friend"/>
+ <menu_item_call label="Aİ" name="im"/>
+ <menu_item_call label="Ara" name="call"/>
+ <menu_item_call label="Işınla" name="teleport"/>
+ <menu_item_call label="Gruba Davet Et" name="invite_to_group"/>
+ <menu_item_call label="Engelle" name="block"/>
+ <menu_item_call label="Engellemeyi Kaldır" name="unblock"/>
+ <menu_item_call label="Raporla" name="report"/>
+ <menu_item_call label="Dondur" name="freeze"/>
+ <menu_item_call label="Çıkar" name="eject"/>
+ <menu_item_call label="Çıkar" name="kick"/>
+ <menu_item_call label="CSR" name="csr"/>
+ <menu_item_call label="Dokularda Hata Ayıkla" name="debug"/>
+ <menu_item_call label="Haritada Bul" name="find_on_map"/>
+ <menu_item_call label="Yakınlaştır" name="zoom_in"/>
+ <menu_item_call label="Öde" name="pay"/>
+ <menu_item_call label="PaylaÅŸ" name="share"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_inspect_object_gear.xml b/indra/newview/skins/default/xui/tr/menu_inspect_object_gear.xml
new file mode 100644
index 0000000000..02e5415598
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_inspect_object_gear.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<toggleable_menu name="Gear Menu">
+ <menu_item_call label="Dokun" name="touch"/>
+ <menu_item_call label="Otur" name="sit"/>
+ <menu_item_call label="Öde" name="pay"/>
+ <menu_item_call label="Satın Al" name="buy"/>
+ <menu_item_call label="Al" name="take"/>
+ <menu_item_call label="Kopya Al" name="take_copy"/>
+ <menu_item_call label="Aç" name="open"/>
+ <menu_item_call label="Düzenle" name="edit"/>
+ <menu_item_call label="Giy" name="wear"/>
+ <menu_item_call label="Ekle" name="add"/>
+ <menu_item_call label="Raporla" name="report"/>
+ <menu_item_call label="Engelle" name="block"/>
+ <menu_item_call label="Yakınlaştır" name="zoom_in"/>
+ <menu_item_call label="Kaldır" name="remove"/>
+ <menu_item_call label="Ek Bilgi" name="more_info"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_inspect_self_gear.xml b/indra/newview/skins/default/xui/tr/menu_inspect_self_gear.xml
new file mode 100644
index 0000000000..0655db8196
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_inspect_self_gear.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="Self Pie">
+ <menu_item_call label="Otur" name="Sit Down Here"/>
+ <menu_item_call label="Kalk" name="Stand Up"/>
+ <context_menu label="Çıkar" name="Take Off &gt;">
+ <context_menu label="Giysiler" name="Clothes &gt;">
+ <menu_item_call label="Gömlek" name="Shirt"/>
+ <menu_item_call label="Pantolon" name="Pants"/>
+ <menu_item_call label="Etek" name="Skirt"/>
+ <menu_item_call label="Ayakkabılar" name="Shoes"/>
+ <menu_item_call label="Çoraplar" name="Socks"/>
+ <menu_item_call label="Ceket" name="Jacket"/>
+ <menu_item_call label="Eldivenler" name="Gloves"/>
+ <menu_item_call label="Fanila" name="Self Undershirt"/>
+ <menu_item_call label="Külot" name="Self Underpants"/>
+ <menu_item_call label="Dövme" name="Self Tattoo"/>
+ <menu_item_call label="Alfa" name="Self Alpha"/>
+ <menu_item_call label="Tüm Giysiler" name="All Clothes"/>
+ </context_menu>
+ <context_menu label="BÜG" name="Object Detach HUD"/>
+ <context_menu label="Ayır" name="Object Detach"/>
+ <menu_item_call label="Tümünü Ayır" name="Detach All"/>
+ </context_menu>
+ <menu_item_call label="Dış Görünümü Değiştir" name="Chenge Outfit"/>
+ <menu_item_call label="Dış Görünümümü Düzenle" name="Edit Outfit"/>
+ <menu_item_call label="Şeklimi Düzenle" name="Edit My Shape"/>
+ <menu_item_call label="Arkadaşlarım" name="Friends..."/>
+ <menu_item_call label="Gruplarım" name="Groups..."/>
+ <menu_item_call label="Profilim" name="Profile..."/>
+ <menu_item_call label="Dokularda Hata Ayıkla" name="Debug..."/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_inv_offer_chiclet.xml b/indra/newview/skins/default/xui/tr/menu_inv_offer_chiclet.xml
new file mode 100644
index 0000000000..2e2b17491a
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_inv_offer_chiclet.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="InvOfferChiclet Menu">
+ <menu_item_call label="Kapat" name="Close"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_inventory.xml b/indra/newview/skins/default/xui/tr/menu_inventory.xml
new file mode 100644
index 0000000000..f14066fd7b
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_inventory.xml
@@ -0,0 +1,89 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Popup">
+ <menu_item_call label="PaylaÅŸ" name="Share"/>
+ <menu_item_call label="Satın Al" name="Task Buy"/>
+ <menu_item_call label="Aç" name="Task Open"/>
+ <menu_item_call label="Oyna" name="Task Play"/>
+ <menu_item_call label="Özellikler" name="Task Properties"/>
+ <menu_item_call label="Yeniden Adlandır" name="Task Rename"/>
+ <menu_item_call label="Sil" name="Task Remove"/>
+ <menu_item_call label="Çöpü Boşalt" name="Empty Trash"/>
+ <menu_item_call label="Kaybedip Bulduklarımı Boşalt" name="Empty Lost And Found"/>
+ <menu_item_call label="Yeni Klasör" name="New Folder"/>
+ <menu_item_call label="Yeni Komut Dosyası" name="New Script"/>
+ <menu_item_call label="Yeni Not Kartı" name="New Note"/>
+ <menu_item_call label="Yeni Mimik" name="New Gesture"/>
+ <menu label="Yeni Giysiler" name="New Clothes">
+ <menu_item_call label="Yeni Gömlek" name="New Shirt"/>
+ <menu_item_call label="Yeni Pantolon" name="New Pants"/>
+ <menu_item_call label="Yeni Ayakkabılar" name="New Shoes"/>
+ <menu_item_call label="Yeni Çoraplar" name="New Socks"/>
+ <menu_item_call label="Yeni Ceket" name="New Jacket"/>
+ <menu_item_call label="Yeni Etek" name="New Skirt"/>
+ <menu_item_call label="Yeni Eldivenler" name="New Gloves"/>
+ <menu_item_call label="Yeni Fanila" name="New Undershirt"/>
+ <menu_item_call label="Yeni Külot" name="New Underpants"/>
+ <menu_item_call label="Yeni Alfa Maskesi" name="New Alpha Mask"/>
+ <menu_item_call label="Yeni Dövme" name="New Tattoo"/>
+ <menu_item_call label="Yeni Fizik" name="New Physics"/>
+ </menu>
+ <menu label="Yeni Vücut Bölümleri" name="New Body Parts">
+ <menu_item_call label="Yeni Åžekil" name="New Shape"/>
+ <menu_item_call label="Yeni Dış Katman" name="New Skin"/>
+ <menu_item_call label="Yeni Saç" name="New Hair"/>
+ <menu_item_call label="Yeni Gözler" name="New Eyes"/>
+ </menu>
+ <menu label="Türü Değiştir" name="Change Type">
+ <menu_item_call label="Varsayılan" name="Default"/>
+ <menu_item_call label="Eldivenler" name="Gloves"/>
+ <menu_item_call label="Ceket" name="Jacket"/>
+ <menu_item_call label="Pantolon" name="Pants"/>
+ <menu_item_call label="Åžekil" name="Shape"/>
+ <menu_item_call label="Ayakkabılar" name="Shoes"/>
+ <menu_item_call label="Gömlek" name="Shirt"/>
+ <menu_item_call label="Etek" name="Skirt"/>
+ <menu_item_call label="Külot" name="Underpants"/>
+ <menu_item_call label="Fanila" name="Undershirt"/>
+ </menu>
+ <menu_item_call label="Işınla" name="Landmark Open"/>
+ <menu_item_call label="Aç" name="Animation Open"/>
+ <menu_item_call label="Aç" name="Sound Open"/>
+ <menu_item_call label="Mevcut Dış Görünümü Değiştir" name="Replace Outfit"/>
+ <menu_item_call label="Mevcut Dış Görünüme Ekle" name="Add To Outfit"/>
+ <menu_item_call label="Mevcut Dış Görünümden Kaldır" name="Remove From Outfit"/>
+ <menu_item_call label="Orijinali Bul" name="Find Original"/>
+ <menu_item_call label="Öğeyi Temizle" name="Purge Item"/>
+ <menu_item_call label="Öğeyi Geri Yükle" name="Restore Item"/>
+ <menu_item_call label="Aç" name="Open"/>
+ <menu_item_call label="Orijinali Aç" name="Open Original"/>
+ <menu_item_call label="Özellikler" name="Properties"/>
+ <menu_item_call label="Yeniden Adlandır" name="Rename"/>
+ <menu_item_call label="Varlık UUID&apos;sini Kopyala" name="Copy Asset UUID"/>
+ <menu_item_call label="Kopyala" name="Copy"/>
+ <menu_item_call label="Yapıştır" name="Paste"/>
+ <menu_item_call label="Bağlantı Olarak Yapıştır" name="Paste As Link"/>
+ <menu_item_call label="Sil" name="Remove Link"/>
+ <menu_item_call label="Sil" name="Delete"/>
+ <menu_item_call label="Sistem Klasörünü Sil" name="Delete System Folder"/>
+ <menu_item_call label="Konferans Sohbeti BaÅŸlat" name="Conference Chat Folder"/>
+ <menu_item_call label="Oyna" name="Sound Play"/>
+ <menu_item_call label="Yer İmi Hakkında" name="About Landmark"/>
+ <menu_item_call label="SL Dünyasında Oynat" name="Animation Play"/>
+ <menu_item_call label="Yerel Olarak Oynat" name="Animation Audition"/>
+ <menu_item_call label="Anlık İleti Gönder" name="Send Instant Message"/>
+ <menu_item_call label="Işınlama Teklif Et..." name="Offer Teleport..."/>
+ <menu_item_call label="Konferans Sohbeti BaÅŸlat" name="Conference Chat"/>
+ <menu_item_call label="EtkinleÅŸtir" name="Activate"/>
+ <menu_item_call label="Devre Dışı Bırak" name="Deactivate"/>
+ <menu_item_call label="Farklı Kaydet" name="Save As"/>
+ <menu_item_call label="Kendinizden Ayırın" name="Detach From Yourself"/>
+ <menu_item_call label="Giy" name="Wearable And Object Wear"/>
+ <menu label="Åžuna Ekle:" name="Attach To"/>
+ <menu label="BÜG&apos;e Ekle" name="Attach To HUD"/>
+ <menu_item_call label="Düzenle" name="Wearable Edit"/>
+ <menu_item_call label="Ekle" name="Wearable Add"/>
+ <menu_item_call label="Çıkar" name="Take Off"/>
+ <menu_item_call label="Satıcı Giden Kutusuna Kopyala" name="Merchant Copy"/>
+ <menu_item_call label="Satıcı Giden Kutusuna Taşı" name="Merchant Move"/>
+ <menu_item_call label="--seçenek yok--" name="--no options--"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_inventory_add.xml b/indra/newview/skins/default/xui/tr/menu_inventory_add.xml
new file mode 100644
index 0000000000..db2a9a2c8c
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_inventory_add.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_inventory_add">
+ <menu label="Karşıya Yükle" name="upload">
+ <menu_item_call label="Görüntü (L$[COST])..." name="Upload Image"/>
+ <menu_item_call label="Ses (L$[COST])..." name="Upload Sound"/>
+ <menu_item_call label="Animasyon (L$[COST])..." name="Upload Animation"/>
+ <menu_item_call label="Model..." name="Upload Model"/>
+ <menu_item_call label="Model Sihirbazı..." name="Upload Model Wizard"/>
+ <menu_item_call label="Toplu (dosya başına L$[COST])..." name="Bulk Upload"/>
+ <menu_item_call label="Varsayılan Karşıya Yükleme İzinlerini Ayarla" name="perm prefs"/>
+ </menu>
+ <menu_item_call label="Yeni Klasör" name="New Folder"/>
+ <menu_item_call label="Yeni Komut Dosyası" name="New Script"/>
+ <menu_item_call label="Yeni Not Kartı" name="New Note"/>
+ <menu_item_call label="Yeni Mimik" name="New Gesture"/>
+ <menu label="Yeni Giysiler" name="New Clothes">
+ <menu_item_call label="Yeni Gömlek" name="New Shirt"/>
+ <menu_item_call label="Yeni Pantolon" name="New Pants"/>
+ <menu_item_call label="Yeni Ayakkabılar" name="New Shoes"/>
+ <menu_item_call label="Yeni Çoraplar" name="New Socks"/>
+ <menu_item_call label="Yeni Ceket" name="New Jacket"/>
+ <menu_item_call label="Yeni Etek" name="New Skirt"/>
+ <menu_item_call label="Yeni Eldivenler" name="New Gloves"/>
+ <menu_item_call label="Yeni Fanila" name="New Undershirt"/>
+ <menu_item_call label="Yeni Külot" name="New Underpants"/>
+ <menu_item_call label="Yeni Alfa" name="New Alpha"/>
+ <menu_item_call label="Yeni Dövme" name="New Tattoo"/>
+ <menu_item_call label="Yeni Fizik" name="New Physics"/>
+ </menu>
+ <menu label="Yeni Vücut Bölümleri" name="New Body Parts">
+ <menu_item_call label="Yeni Åžekil" name="New Shape"/>
+ <menu_item_call label="Yeni Dış Katman" name="New Skin"/>
+ <menu_item_call label="Yeni Saç" name="New Hair"/>
+ <menu_item_call label="Yeni Gözler" name="New Eyes"/>
+ </menu>
+</menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_inventory_gear_default.xml b/indra/newview/skins/default/xui/tr/menu_inventory_gear_default.xml
new file mode 100644
index 0000000000..5f3e4e8789
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_inventory_gear_default.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="menu_gear_default">
+ <menu_item_call label="Yeni Envanter Penceresi" name="new_window"/>
+ <menu_item_check label="Ada Göre Sırala" name="sort_by_name"/>
+ <menu_item_check label="En Sonunculara Göre Sırala" name="sort_by_recent"/>
+ <menu_item_check label="Klasörleri Her Zaman Ada Göre Sırala" name="sort_folders_by_name"/>
+ <menu_item_check label="Sistem Klasörlerini Üste Sırala" name="sort_system_folders_to_top"/>
+ <menu_item_call label="Filtreleri Göster" name="show_filters"/>
+ <menu_item_call label="Filtreleri Sıfırla" name="reset_filters"/>
+ <menu_item_call label="Tüm Klasörleri Kapat" name="close_folders"/>
+ <menu_item_call label="Kaybedip Bulduklarımı Boşalt" name="empty_lostnfound"/>
+ <menu_item_call label="Dokuyu Farklı Kaydet" name="Save Texture As"/>
+ <menu_item_call label="PaylaÅŸ" name="Share"/>
+ <menu_item_call label="Orijinali Bul" name="Find Original"/>
+ <menu_item_call label="Tüm Bağlantıları Bul" name="Find All Links"/>
+ <menu_item_call label="Çöpü Boşalt" name="empty_trash"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_land.xml b/indra/newview/skins/default/xui/tr/menu_land.xml
new file mode 100644
index 0000000000..db65f1af1e
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_land.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Land Pie">
+ <menu_item_call label="Arazi Hakkında" name="Place Information..."/>
+ <menu_item_call label="Buraya Otur" name="Sit Here"/>
+ <menu_item_call label="Bu Araziyi Satın Al" name="Land Buy"/>
+ <menu_item_call label="Geçiş Hakkı Satın Al" name="Land Buy Pass"/>
+ <menu_item_call label="İnşa Et" name="Create"/>
+ <menu_item_call label="Yüzeyi Düzenle" name="Edit Terrain"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_landmark.xml b/indra/newview/skins/default/xui/tr/menu_landmark.xml
new file mode 100644
index 0000000000..c68a2f6a90
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_landmark.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="landmark_overflow_menu">
+ <menu_item_call label="SLurl&apos;i Kopyala" name="copy"/>
+ <menu_item_call label="Sil" name="delete"/>
+ <menu_item_call label="Seçme Oluştur" name="pick"/>
+ <menu_item_call label="Favoriler Çubuğuna Ekle" name="add_to_favbar"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_login.xml b/indra/newview/skins/default/xui/tr/menu_login.xml
new file mode 100644
index 0000000000..4c3539b38b
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_login.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu_bar name="Login Menu">
+ <menu label="Ben" name="File">
+ <menu_item_call label="Tercihler..." name="Preferences..."/>
+ <menu_item_call label="[APP_NAME]&apos;den Çık" name="Quit"/>
+ </menu>
+ <menu label="Yardım" name="Help">
+ <menu_item_call label="[SECOND_LIFE] Yardımı" name="Second Life Help"/>
+ <menu_item_call label="[APP_NAME] Hakkında" name="About Second Life"/>
+ </menu>
+ <menu_item_check label="Hata Ayıklama Menüsünü Göster" name="Show Debug Menu"/>
+ <menu label="Hata ayıkla" name="Debug">
+ <menu_item_call label="Hata Ayıklama Ayarlarını Göster" name="Debug Settings"/>
+ <menu_item_call label="KA/Renk Ayarları" name="UI/Color Settings"/>
+ <menu_item_call label="XKA Önizleme Aracı" name="UI Preview Tool"/>
+ <menu label="KA Testleri" name="UI Tests"/>
+ <menu_item_call label="Pencere Büyüklüğünü Ayarla..." name="Set Window Size..."/>
+ <menu_item_call label="Hizmet Şartlarını Göster" name="TOS"/>
+ <menu_item_call label="Kritik İletiyi Göster" name="Critical"/>
+ <menu_item_call label="Ortam Tarayıcı Testi" name="Web Browser Test"/>
+ <menu_item_call label="Web İçeriği Gezdiricisi Hata Ayıklama Testi" name="Web Content Floater Debug Test"/>
+ <menu_item_check label="Izgara Seçiciyi Göster" name="Show Grid Picker"/>
+ <menu_item_call label="Bildirimler Konsolunu Göster" name="Show Notifications Console"/>
+ </menu>
+</menu_bar>
diff --git a/indra/newview/skins/default/xui/tr/menu_media_ctrl.xml b/indra/newview/skins/default/xui/tr/menu_media_ctrl.xml
new file mode 100644
index 0000000000..8d04e645fd
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_media_ctrl.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="media ctrl context menu">
+ <menu_item_call label="Kes" name="Cut"/>
+ <menu_item_call label="Kopyala" name="Copy"/>
+ <menu_item_call label="Yapıştır" name="Paste"/>
+ <menu_item_call label="Web Inspector&apos;ı Açın" name="open_webinspector"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_mini_map.xml b/indra/newview/skins/default/xui/tr/menu_mini_map.xml
new file mode 100644
index 0000000000..9abe78931e
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_mini_map.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Popup">
+ <menu_item_call label="Yakına Zumla" name="Zoom Close"/>
+ <menu_item_call label="Orta Zumla" name="Zoom Medium"/>
+ <menu_item_call label="UzaÄŸa Zumla" name="Zoom Far"/>
+ <menu_item_call label="Varsayılan Yakınlaştırma" name="Zoom Default"/>
+ <menu_item_check label="Haritayı Dönder" name="Rotate Map"/>
+ <menu_item_check label="Otomatik Ortala" name="Auto Center"/>
+ <menu_item_call label="İzlemeyi Durdur" name="Stop Tracking"/>
+ <menu_item_call label="Dünya Haritası" name="World Map"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_mode_change.xml b/indra/newview/skins/default/xui/tr/menu_mode_change.xml
new file mode 100644
index 0000000000..678950b633
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_mode_change.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="Mode Change">
+ <menu_item_check label="Temel" name="BasicMode"/>
+ <menu_item_check label="GeliÅŸmiÅŸ" name="AdvancedMode"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_model_import_gear_default.xml b/indra/newview/skins/default/xui/tr/menu_model_import_gear_default.xml
new file mode 100644
index 0000000000..51cf29a4de
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_model_import_gear_default.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="model_menu_gear_default">
+ <menu_item_check label="Kenarları göster" name="show_edges"/>
+ <menu_item_check label="Fiziki temsili göster" name="show_physics"/>
+ <menu_item_check label="Dokuları göster" name="show_textures"/>
+ <menu_item_check label="Dış katman ağırlığını göster" name="show_skin_weight"/>
+ <menu_item_check label="Eklem konumlarını göster" name="show_joint_positions"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_navbar.xml b/indra/newview/skins/default/xui/tr/menu_navbar.xml
new file mode 100644
index 0000000000..b05b816e64
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_navbar.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Navbar Menu">
+ <menu_item_check label="Koordinatları Göster" name="Show Coordinates"/>
+ <menu_item_check label="Parsel Özelliklerini Göster" name="Show Parcel Properties"/>
+ <menu_item_call label="Yer İmi" name="Landmark"/>
+ <menu_item_call label="Kes" name="Cut"/>
+ <menu_item_call label="Kopyala" name="Copy"/>
+ <menu_item_call label="Yapıştır" name="Paste"/>
+ <menu_item_call label="Sil" name="Delete"/>
+ <menu_item_call label="Tümünü Seç" name="Select All"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_nearby_chat.xml b/indra/newview/skins/default/xui/tr/menu_nearby_chat.xml
new file mode 100644
index 0000000000..b76a736979
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_nearby_chat.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="NearBy Chat Menu">
+ <menu_item_call label="Yakındaki Kişileri Göster..." name="nearby_people"/>
+ <menu_item_check label="Engellenmiş Metni Göster" name="muted_text"/>
+ <menu_item_check label="Arkadaş Simgelerini Göster" name="show_buddy_icons"/>
+ <menu_item_check label="Adları Göster" name="show_names"/>
+ <menu_item_check label="Simgeleri ve Adları Göster" name="show_icons_and_names"/>
+ <menu_item_call label="Font Büyüklüğü" name="font_size"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_notification_well_button.xml b/indra/newview/skins/default/xui/tr/menu_notification_well_button.xml
new file mode 100644
index 0000000000..39c66268f5
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_notification_well_button.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Notification Well Button Context Menu">
+ <menu_item_call label="Tümünü Kapat" name="Close All"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_object.xml b/indra/newview/skins/default/xui/tr/menu_object.xml
new file mode 100644
index 0000000000..d60c68e5e9
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_object.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Object Pie">
+ <menu_item_call label="Dokun" name="Object Touch"/>
+ <menu_item_call label="Düzenle" name="Edit..."/>
+ <menu_item_call label="İnşa Et" name="Build"/>
+ <menu_item_call label="Aç" name="Open"/>
+ <menu_item_call label="Buraya Otur" name="Object Sit"/>
+ <menu_item_call label="Kalk" name="Object Stand Up"/>
+ <menu_item_call label="Nesne Profili" name="Object Inspect"/>
+ <menu_item_call label="Yakınlaştır" name="Zoom In"/>
+ <context_menu label="Üzerine Koy" name="Put On">
+ <menu_item_call label="Giy" name="Wear"/>
+ <menu_item_call label="Ekle" name="Add"/>
+ <context_menu label="Ekle" name="Object Attach"/>
+ <context_menu label="BÜG Ekle" name="Object Attach HUD"/>
+ </context_menu>
+ <context_menu label="Yönet" name="Remove">
+ <menu_item_call label="Kötüye Kullanımı Bildir" name="Report Abuse..."/>
+ <menu_item_call label="Engelle" name="Object Mute"/>
+ <menu_item_call label="İade Et" name="Return..."/>
+ </context_menu>
+ <menu_item_call label="Al" name="Pie Object Take"/>
+ <menu_item_call label="Kopya Al" name="Take Copy"/>
+ <menu_item_call label="Öde" name="Pay..."/>
+ <menu_item_call label="Satın Al" name="Buy..."/>
+ <menu_item_call label="Sil" name="Delete"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_object_icon.xml b/indra/newview/skins/default/xui/tr/menu_object_icon.xml
new file mode 100644
index 0000000000..34a2661d8a
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_object_icon.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Object Icon Menu">
+ <menu_item_call label="Nesne Profili..." name="Object Profile"/>
+ <menu_item_call label="Engelle..." name="Block"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_outfit_gear.xml b/indra/newview/skins/default/xui/tr/menu_outfit_gear.xml
new file mode 100644
index 0000000000..d2e7e7107a
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_outfit_gear.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="Gear Outfit">
+ <menu_item_call label="Giysi - Mevcut Dış Görünümü Değiştir" name="wear"/>
+ <menu_item_call label="Giysi - Mevcut Dış Görünüme Ekle" name="wear_add"/>
+ <menu_item_call label="Çıkar - Mevcut Dış Görünümden Kaldır" name="take_off"/>
+ <menu label="Yeni Giysiler" name="New Clothes">
+ <menu_item_call label="Yeni Gömlek" name="New Shirt"/>
+ <menu_item_call label="Yeni Pantolon" name="New Pants"/>
+ <menu_item_call label="Yeni Ayakkabılar" name="New Shoes"/>
+ <menu_item_call label="Yeni Çoraplar" name="New Socks"/>
+ <menu_item_call label="Yeni Ceket" name="New Jacket"/>
+ <menu_item_call label="Yeni Etek" name="New Skirt"/>
+ <menu_item_call label="Yeni Eldivenler" name="New Gloves"/>
+ <menu_item_call label="Yeni Fanila" name="New Undershirt"/>
+ <menu_item_call label="Yeni Külot" name="New Underpants"/>
+ <menu_item_call label="Yeni Alfa" name="New Alpha"/>
+ <menu_item_call label="Yeni Fizik" name="New Physics"/>
+ <menu_item_call label="Yeni Dövme" name="New Tattoo"/>
+ </menu>
+ <menu label="Yeni Vücut Bölümleri" name="New Body Parts">
+ <menu_item_call label="Yeni Åžekil" name="New Shape"/>
+ <menu_item_call label="Yeni Dış Katman" name="New Skin"/>
+ <menu_item_call label="Yeni Saç" name="New Hair"/>
+ <menu_item_call label="Yeni Gözler" name="New Eyes"/>
+ </menu>
+ <menu_item_call label="Dış Görünümü Yeniden Adlandır" name="rename"/>
+ <menu_item_call label="Dış Görünümü Sil" name="delete_outfit"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_outfit_tab.xml b/indra/newview/skins/default/xui/tr/menu_outfit_tab.xml
new file mode 100644
index 0000000000..a48529e462
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_outfit_tab.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Outfit">
+ <menu_item_call label="Giysi - Mevcut Dış Görünümü Değiştir" name="wear_replace"/>
+ <menu_item_call label="Giysi - Mevcut Dış Görünüme Ekle" name="wear_add"/>
+ <menu_item_call label="Çıkar - Mevcut Dış Görünümden Kaldır" name="take_off"/>
+ <menu_item_call label="Dış Görünümü Düzenle" name="edit"/>
+ <menu_item_call label="Dış Görünümü Yeniden Adlandır" name="rename"/>
+ <menu_item_call label="Dış Görünümü Sil" name="delete"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_participant_list.xml b/indra/newview/skins/default/xui/tr/menu_participant_list.xml
new file mode 100644
index 0000000000..1d56105e1e
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_participant_list.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Participant List Context Menu">
+ <menu_item_check label="Ada Göre Sırala" name="SortByName"/>
+ <menu_item_check label="Son Konuşanlara Göre Sırala" name="SortByRecentSpeakers"/>
+ <menu_item_call label="Profili Göster" name="View Profile"/>
+ <menu_item_call label="ArkadaÅŸ Ekle" name="Add Friend"/>
+ <menu_item_call label="Aİ" name="IM"/>
+ <menu_item_call label="Ara" name="Call"/>
+ <menu_item_call label="PaylaÅŸ" name="Share"/>
+ <menu_item_call label="Öde" name="Pay"/>
+ <menu_item_check label="Kişi Simgelerini Göster" name="View Icons"/>
+ <menu_item_check label="Sesi Engelle" name="Block/Unblock"/>
+ <menu_item_check label="Metni Engelle" name="MuteText"/>
+ <context_menu label="Moderatör Seçenekleri" name="Moderator Options">
+ <menu_item_check label="Metin sohbetine izin ver" name="AllowTextChat"/>
+ <menu_item_call label="Bu katılımcıyı engelle" name="ModerateVoiceMuteSelected"/>
+ <menu_item_call label="Bu katılımcının engellemesini kaldır" name="ModerateVoiceUnMuteSelected"/>
+ <menu_item_call label="Herkesi engelle" name="ModerateVoiceMute"/>
+ <menu_item_call label="Herkesin engellemesini kaldır" name="ModerateVoiceUnmute"/>
+ </context_menu>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_people_friends_view_sort.xml b/indra/newview/skins/default/xui/tr/menu_people_friends_view_sort.xml
new file mode 100644
index 0000000000..404fab17e6
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_people_friends_view_sort.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="menu_group_plus">
+ <menu_item_check label="Ada Göre Sırala" name="sort_name"/>
+ <menu_item_check label="Duruma Göre Sırala" name="sort_status"/>
+ <menu_item_check label="Kişi Simgelerini Göster" name="view_icons"/>
+ <menu_item_check label="Verilen İzinleri Göster" name="view_permissions"/>
+ <menu_item_call label="Engellenmiş Sakinleri ve Nesneleri Göster" name="show_blocked_list"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_people_groups.xml b/indra/newview/skins/default/xui/tr/menu_people_groups.xml
new file mode 100644
index 0000000000..9f2946e310
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_people_groups.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_group_plus">
+ <menu_item_call label="Bilgileri Görüntüle" name="View Info"/>
+ <menu_item_call label="Sohbet" name="Chat"/>
+ <menu_item_call label="Ara" name="Call"/>
+ <menu_item_call label="EtkinleÅŸtir" name="Activate"/>
+ <menu_item_call label="Ayrıl" name="Leave"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_people_groups_view_sort.xml b/indra/newview/skins/default/xui/tr/menu_people_groups_view_sort.xml
new file mode 100644
index 0000000000..a1e5ad9a50
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_people_groups_view_sort.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="menu_group_plus">
+ <menu_item_check label="Grup Simgelerini Göster" name="Display Group Icons"/>
+ <menu_item_call label="Seçilen Gruptan Ayrıl" name="Leave Selected Group"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_people_nearby.xml b/indra/newview/skins/default/xui/tr/menu_people_nearby.xml
new file mode 100644
index 0000000000..ee859a9450
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_people_nearby.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Avatar Context Menu">
+ <menu_item_call label="Profili Göster" name="View Profile"/>
+ <menu_item_call label="ArkadaÅŸ Ekle" name="Add Friend"/>
+ <menu_item_call label="Arkadaşı Çıkar" name="Remove Friend"/>
+ <menu_item_call label="Aİ" name="IM"/>
+ <menu_item_call label="Ara" name="Call"/>
+ <menu_item_call label="Harita" name="Map"/>
+ <menu_item_call label="PaylaÅŸ" name="Share"/>
+ <menu_item_call label="Öde" name="Pay"/>
+ <menu_item_check label="Engelle/Engeli Kaldır" name="Block/Unblock"/>
+ <menu_item_call label="Işınlama Teklif Et" name="teleport"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_people_nearby_multiselect.xml b/indra/newview/skins/default/xui/tr/menu_people_nearby_multiselect.xml
new file mode 100644
index 0000000000..5c89f87906
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_people_nearby_multiselect.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Multi-Selected People Context Menu">
+ <menu_item_call label="ArkadaÅŸ Ekle" name="Add Friends"/>
+ <menu_item_call label="Arkadaşı Çıkar" name="Remove Friend"/>
+ <menu_item_call label="Aİ" name="IM"/>
+ <menu_item_call label="Ara" name="Call"/>
+ <menu_item_call label="PaylaÅŸ" name="Share"/>
+ <menu_item_call label="Öde" name="Pay"/>
+ <menu_item_call label="Işınlama Teklif Et" name="teleport"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_people_nearby_view_sort.xml b/indra/newview/skins/default/xui/tr/menu_people_nearby_view_sort.xml
new file mode 100644
index 0000000000..0ff2111e9e
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_people_nearby_view_sort.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="menu_group_plus">
+ <menu_item_check label="Son Konuşanlara Göre Sırala" name="sort_by_recent_speakers"/>
+ <menu_item_check label="Ada Göre Sırala" name="sort_name"/>
+ <menu_item_check label="Mesafeye Göre Sırala" name="sort_distance"/>
+ <menu_item_check label="Kişi Simgelerini Göster" name="view_icons"/>
+ <menu_item_check label="Haritayı Göster" name="view_map"/>
+ <menu_item_call label="Engellenmiş Sakinleri ve Nesneleri Göster" name="show_blocked_list"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_people_recent_view_sort.xml b/indra/newview/skins/default/xui/tr/menu_people_recent_view_sort.xml
new file mode 100644
index 0000000000..adfba50138
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_people_recent_view_sort.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="menu_group_plus">
+ <menu_item_check label="En Sonunculara Göre Sırala" name="sort_most"/>
+ <menu_item_check label="Ada Göre Sırala" name="sort_name"/>
+ <menu_item_check label="Kişi Simgelerini Göster" name="view_icons"/>
+ <menu_item_call label="Engellenmiş Sakinleri ve Nesneleri Göster" name="show_blocked_list"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_picks.xml b/indra/newview/skins/default/xui/tr/menu_picks.xml
new file mode 100644
index 0000000000..3e5375ecc0
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_picks.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Picks">
+ <menu_item_call label="Bilgi" name="pick_info"/>
+ <menu_item_call label="Düzenle" name="pick_edit"/>
+ <menu_item_call label="Işınla" name="pick_teleport"/>
+ <menu_item_call label="Harita" name="pick_map"/>
+ <menu_item_call label="Sil" name="pick_delete"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_picks_plus.xml b/indra/newview/skins/default/xui/tr/menu_picks_plus.xml
new file mode 100644
index 0000000000..d9c4fefc97
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_picks_plus.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="picks_plus_menu">
+ <menu_item_call label="Yeni Seçme" name="create_pick"/>
+ <menu_item_call label="Yeni İlan" name="create_classified"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_place.xml b/indra/newview/skins/default/xui/tr/menu_place.xml
new file mode 100644
index 0000000000..ad167a328a
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_place.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="place_overflow_menu">
+ <menu_item_call label="Yer İmi Yap" name="landmark"/>
+ <menu_item_call label="Seçme Oluştur" name="pick"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_place_add_button.xml b/indra/newview/skins/default/xui/tr/menu_place_add_button.xml
new file mode 100644
index 0000000000..8e52b3f7f2
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_place_add_button.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_folder_gear">
+ <menu_item_call label="Klasör Ekle" name="add_folder"/>
+ <menu_item_call label="Yer İmi Ekle" name="add_landmark"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_places_gear_folder.xml b/indra/newview/skins/default/xui/tr/menu_places_gear_folder.xml
new file mode 100644
index 0000000000..b3a2986160
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_places_gear_folder.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="menu_folder_gear">
+ <menu_item_call label="Yer İmi Ekle" name="add_landmark"/>
+ <menu_item_call label="Klasör Ekle" name="add_folder"/>
+ <menu_item_call label="Öğeyi Geri Yükle" name="restore_item"/>
+ <menu_item_call label="Kes" name="cut"/>
+ <menu_item_call label="Kopyala" name="copy_folder"/>
+ <menu_item_call label="Yapıştır" name="paste"/>
+ <menu_item_call label="Yeniden Adlandır" name="rename"/>
+ <menu_item_call label="Sil" name="delete"/>
+ <menu_item_call label="GeniÅŸlet" name="expand"/>
+ <menu_item_call label="Daralt" name="collapse"/>
+ <menu_item_call label="Tüm klasörleri genişlet" name="expand_all"/>
+ <menu_item_call label="Tüm klasörleri daralt" name="collapse_all"/>
+ <menu_item_check label="Tarihe Göre Sırala" name="sort_by_date"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_places_gear_landmark.xml b/indra/newview/skins/default/xui/tr/menu_places_gear_landmark.xml
new file mode 100644
index 0000000000..939ee2c7cb
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_places_gear_landmark.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="menu_ladmark_gear">
+ <menu_item_call label="Işınla" name="teleport"/>
+ <menu_item_call label="Ek Bilgi" name="more_info"/>
+ <menu_item_call label="Haritada Göster" name="show_on_map"/>
+ <menu_item_call label="Yer İmi Ekle" name="add_landmark"/>
+ <menu_item_call label="Klasör Ekle" name="add_folder"/>
+ <menu_item_call label="Öğeyi Geri Yükle" name="restore_item"/>
+ <menu_item_call label="Kes" name="cut"/>
+ <menu_item_call label="Yer İmini Kopyala" name="copy_landmark"/>
+ <menu_item_call label="SLurl&apos;i Kopyala" name="copy_slurl"/>
+ <menu_item_call label="Yapıştır" name="paste"/>
+ <menu_item_call label="Yeniden Adlandır" name="rename"/>
+ <menu_item_call label="Sil" name="delete"/>
+ <menu_item_call label="Tüm klasörleri genişlet" name="expand_all"/>
+ <menu_item_call label="Tüm klasörleri daralt" name="collapse_all"/>
+ <menu_item_check label="Tarihe Göre Sırala" name="sort_by_date"/>
+ <menu_item_call label="Seçme Oluştur" name="create_pick"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_profile_overflow.xml b/indra/newview/skins/default/xui/tr/menu_profile_overflow.xml
new file mode 100644
index 0000000000..ed60dec63a
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_profile_overflow.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="profile_overflow_menu">
+ <menu_item_call label="Harita" name="show_on_map"/>
+ <menu_item_call label="Öde" name="pay"/>
+ <menu_item_call label="PaylaÅŸ" name="share"/>
+ <menu_item_call label="Engelle" name="block"/>
+ <menu_item_call label="Engellemeyi Kaldır" name="unblock"/>
+ <menu_item_call label="Çıkar" name="kick"/>
+ <menu_item_call label="Dondur" name="freeze"/>
+ <menu_item_call label="Çöz" name="unfreeze"/>
+ <menu_item_call label="CSR" name="csr"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_save_outfit.xml b/indra/newview/skins/default/xui/tr/menu_save_outfit.xml
new file mode 100644
index 0000000000..b28488fe30
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_save_outfit.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="save_outfit_menu">
+ <menu_item_call label="Kaydet" name="save_outfit"/>
+ <menu_item_call label="Farklı Kaydet" name="save_as_new_outfit"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_script_chiclet.xml b/indra/newview/skins/default/xui/tr/menu_script_chiclet.xml
new file mode 100644
index 0000000000..7c1cefc2d1
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_script_chiclet.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="ScriptChiclet Menu">
+ <menu_item_call label="Kapat" name="Close"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_slurl.xml b/indra/newview/skins/default/xui/tr/menu_slurl.xml
new file mode 100644
index 0000000000..73ac068b26
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_slurl.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Popup">
+ <menu_item_call label="URL Hakkında" name="about_url"/>
+ <menu_item_call label="URL&apos;ye Işınla" name="teleport_to_url"/>
+ <menu_item_call label="Harita" name="show_on_map"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_teleport_history_gear.xml b/indra/newview/skins/default/xui/tr/menu_teleport_history_gear.xml
new file mode 100644
index 0000000000..b08423be18
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_teleport_history_gear.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="Teleport History Gear Context Menu">
+ <menu_item_call label="Tüm klasörleri genişlet" name="Expand all folders"/>
+ <menu_item_call label="Tüm klasörleri daralt" name="Collapse all folders"/>
+ <menu_item_call label="Işınlama Geçmişini Temizle" name="Clear Teleport History"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_teleport_history_item.xml b/indra/newview/skins/default/xui/tr/menu_teleport_history_item.xml
new file mode 100644
index 0000000000..93984162e7
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_teleport_history_item.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Teleport History Item Context Menu">
+ <menu_item_call label="Işınla" name="Teleport"/>
+ <menu_item_call label="Ek Bilgi" name="More Information"/>
+ <menu_item_call label="Panoya Kopyala" name="CopyToClipboard"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_teleport_history_tab.xml b/indra/newview/skins/default/xui/tr/menu_teleport_history_tab.xml
new file mode 100644
index 0000000000..b1e801c123
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_teleport_history_tab.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Teleport History Item Context Menu">
+ <menu_item_call label="Aç" name="TabOpen"/>
+ <menu_item_call label="Kapat" name="TabClose"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_text_editor.xml b/indra/newview/skins/default/xui/tr/menu_text_editor.xml
new file mode 100644
index 0000000000..ffbf309e84
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_text_editor.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Text editor context menu">
+ <menu_item_call label="Kes" name="Cut"/>
+ <menu_item_call label="Kopyala" name="Copy"/>
+ <menu_item_call label="Yapıştır" name="Paste"/>
+ <menu_item_call label="Sil" name="Delete"/>
+ <menu_item_call label="Tümünü Seç" name="Select All"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_toolbars.xml b/indra/newview/skins/default/xui/tr/menu_toolbars.xml
new file mode 100644
index 0000000000..c8523a6ec9
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_toolbars.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Toolbars Popup">
+ <menu_item_call label="Bu düğmeyi kaldır" name="Remove button"/>
+ <menu_item_call label="Araç çubuğu düğmeleri..." name="Choose Buttons"/>
+ <menu_item_check label="Simgeler ve etiketler" name="icons_with_text"/>
+ <menu_item_check label="Sadece simgeler" name="icons_only"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_topinfobar.xml b/indra/newview/skins/default/xui/tr/menu_topinfobar.xml
new file mode 100644
index 0000000000..d9b8d50f18
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_topinfobar.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_topinfobar">
+ <menu_item_check label="Koordinatları Göster" name="Show Coordinates"/>
+ <menu_item_check label="Parsel Özelliklerini Göster" name="Show Parcel Properties"/>
+ <menu_item_call label="Yer İmi" name="Landmark"/>
+ <menu_item_call label="Kopyala" name="Copy"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_url_agent.xml b/indra/newview/skins/default/xui/tr/menu_url_agent.xml
new file mode 100644
index 0000000000..d82b52aea8
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_url_agent.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Sakin Profilini Göster" name="show_agent"/>
+ <menu_item_call label="Adı panoya kopyala" name="url_copy_label"/>
+ <menu_item_call label="SLurl&apos;yi Panoya Kopyala" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_url_group.xml b/indra/newview/skins/default/xui/tr/menu_url_group.xml
new file mode 100644
index 0000000000..40fa13b4cf
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_url_group.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Grup Bilgilerini Göster" name="show_group"/>
+ <menu_item_call label="Grubu panoya kopyala" name="url_copy_label"/>
+ <menu_item_call label="SLurl&apos;yi Panoya Kopyala" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_url_http.xml b/indra/newview/skins/default/xui/tr/menu_url_http.xml
new file mode 100644
index 0000000000..fee8eba150
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_url_http.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Web Sayfasını Aç" name="url_open"/>
+ <menu_item_call label="İnternet Tarayıcıda Aç" name="url_open_internal"/>
+ <menu_item_call label="Harici Tarayıcıda Aç" name="url_open_external"/>
+ <menu_item_call label="URL&apos;yi panoya kopyala" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_url_inventory.xml b/indra/newview/skins/default/xui/tr/menu_url_inventory.xml
new file mode 100644
index 0000000000..3b22c5afec
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_url_inventory.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Envanter Öğesini Göster" name="show_item"/>
+ <menu_item_call label="Adı panoya kopyala" name="url_copy_label"/>
+ <menu_item_call label="SLurl&apos;yi Panoya Kopyala" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_url_map.xml b/indra/newview/skins/default/xui/tr/menu_url_map.xml
new file mode 100644
index 0000000000..770e330516
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_url_map.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Haritada Göster" name="show_on_map"/>
+ <menu_item_call label="Konuma Işınla" name="teleport_to_location"/>
+ <menu_item_call label="SLurl&apos;yi Panoya Kopyala" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_url_objectim.xml b/indra/newview/skins/default/xui/tr/menu_url_objectim.xml
new file mode 100644
index 0000000000..d55e34c11c
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_url_objectim.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Nesne Bilgilerini Göster" name="show_object"/>
+ <menu_item_call label="Haritada Göster" name="show_on_map"/>
+ <menu_item_call label="Nesne Konumuna Işınla" name="teleport_to_object"/>
+ <menu_item_call label="Nesne Adını panoya kopyala" name="url_copy_label"/>
+ <menu_item_call label="SLurl&apos;yi Panoya Kopyala" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_url_parcel.xml b/indra/newview/skins/default/xui/tr/menu_url_parcel.xml
new file mode 100644
index 0000000000..eac1d743c3
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_url_parcel.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Parsel Bilgilerini Göster" name="show_parcel"/>
+ <menu_item_call label="Haritada Göster" name="show_on_map"/>
+ <menu_item_call label="SLurl&apos;yi Panoya Kopyala" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_url_slapp.xml b/indra/newview/skins/default/xui/tr/menu_url_slapp.xml
new file mode 100644
index 0000000000..a2ecfc6a48
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_url_slapp.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Bu Komutu Çalıştır" name="run_slapp"/>
+ <menu_item_call label="SLurl&apos;yi Panoya Kopyala" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_url_slurl.xml b/indra/newview/skins/default/xui/tr/menu_url_slurl.xml
new file mode 100644
index 0000000000..3f4e51b36c
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_url_slurl.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Yer Bilgilerini Göster" name="show_place"/>
+ <menu_item_call label="Haritada Göster" name="show_on_map"/>
+ <menu_item_call label="Konuma Işınla" name="teleport_to_location"/>
+ <menu_item_call label="SLurl&apos;yi Panoya Kopyala" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_url_teleport.xml b/indra/newview/skins/default/xui/tr/menu_url_teleport.xml
new file mode 100644
index 0000000000..b7035a4d8f
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_url_teleport.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Bu Konuma Işınla" name="teleport"/>
+ <menu_item_call label="Haritada Göster" name="show_on_map"/>
+ <menu_item_call label="SLurl&apos;yi Panoya Kopyala" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_viewer.xml b/indra/newview/skins/default/xui/tr/menu_viewer.xml
new file mode 100644
index 0000000000..ef10d639d7
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_viewer.xml
@@ -0,0 +1,460 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu_bar name="Main Menu">
+ <menu label="Ben" name="Me">
+ <menu_item_call label="Profil..." name="Profile"/>
+ <menu_item_call label="Görünüm..." name="ChangeOutfit"/>
+ <menu_item_call label="Bir avatar seçin..." name="Avatar Picker"/>
+ <menu_item_check label="Envanter..." name="Inventory"/>
+ <menu_item_call label="Yeni Envanter Penceresi" name="NewInventoryWindow"/>
+ <menu_item_call label="Yerler..." name="Places"/>
+ <menu_item_call label="Favoriler..." name="Picks"/>
+ <menu_item_call label="Kamera Denetimleri..." name="Camera Controls"/>
+ <menu label="Hareket" name="Movement">
+ <menu_item_call label="Otur" name="Sit Down Here"/>
+ <menu_item_check label="Uç" name="Fly"/>
+ <menu_item_check label="Daima KoÅŸ" name="Always Run"/>
+ <menu_item_call label="Beni Anime Etmeyi Durdur" name="Stop Animating My Avatar"/>
+ </menu>
+ <menu label="Durum" name="Status">
+ <menu_item_call label="Uzakta" name="Set Away"/>
+ <menu_item_call label="MeÅŸgul" name="Set Busy"/>
+ </menu>
+ <menu_item_call label="Yönetici Durumu Talep Et" name="Request Admin Options"/>
+ <menu_item_call label="Yönetici Durumundan Ayrıl" name="Leave Admin Options"/>
+ <menu_item_call label="L$ Satın Al" name="Buy and Sell L$"/>
+ <menu_item_call label="Hesap kontrol paneli..." name="Manage My Account"/>
+ <menu_item_call label="Tercihler..." name="Preferences"/>
+ <menu_item_call label="Araç çubuğu düğmeleri..." name="Toolbars"/>
+ <menu_item_call label="Tüm denetimleri sakla" name="Hide UI"/>
+ <menu_item_call label="[APP_NAME]&apos;den Çık" name="Quit"/>
+ </menu>
+ <menu label="İletişim Kur" name="Communicate">
+ <menu_item_check label="Sohbet..." name="Nearby Chat"/>
+ <menu_item_check label="KonuÅŸ" name="Speak"/>
+ <menu_item_check label="Ses ayarları..." name="Nearby Voice"/>
+ <menu_item_check label="Ses ÅŸekillendirme..." name="ShowVoice"/>
+ <menu_item_check label="Mimikler..." name="Gestures"/>
+ <menu_item_call label="ArkadaÅŸlar" name="My Friends"/>
+ <menu_item_call label="Gruplar" name="My Groups"/>
+ <menu_item_call label="Yakındaki kişiler" name="Active Speakers"/>
+ </menu>
+ <menu label="Dünya" name="World">
+ <menu_item_call label="Bu Yeri Yer İmlerine Ekle" name="Create Landmark Here"/>
+ <menu_item_call label="Hedef Konumlar..." name="Destinations"/>
+ <menu_item_check label="Dünya haritası" name="World Map"/>
+ <menu_item_check label="Mini-harita" name="Mini-Map"/>
+ <menu_item_check label="Ara" name="Search"/>
+ <menu_item_call label="Ana konuma ışınlan" name="Teleport Home"/>
+ <menu_item_call label="Ana konumu burası olarak seç" name="Set Home to Here"/>
+ <menu_item_call label="Anlık Görüntü" name="Take Snapshot"/>
+ <menu_item_call label="Profili yerleÅŸtir" name="Place Profile"/>
+ <menu_item_call label="Arazi hakkında" name="About Land"/>
+ <menu_item_call label="Bölge / Gayrimenkul" name="Region/Estate"/>
+ <menu_item_call label="Sahip olduğum arazi parçaları..." name="My Land"/>
+ <menu_item_call label="Bu araziyi satın al" name="Buy Land"/>
+ <menu label="Göster" name="LandShow">
+ <menu_item_check label="Yasaklama Çizgileri" name="Ban Lines"/>
+ <menu_item_check label="İşaretler" name="beacons"/>
+ <menu_item_check label="Mülkiyet Çizgileri" name="Property Lines"/>
+ <menu_item_check label="Arazi Sahipleri" name="Land Owners"/>
+ <menu_item_check label="Koordinatlar" name="Coordinates"/>
+ <menu_item_check label="Parsel Özellikleri" name="Parcel Properties"/>
+ <menu_item_check label="Gelişmiş Menü" name="Show Advanced Menu"/>
+ </menu>
+ <menu label="Güneş" name="Environment Settings">
+ <menu_item_call label="Gün Doğumu" name="Sunrise"/>
+ <menu_item_call label="Gün Ortası" name="Noon"/>
+ <menu_item_call label="Gün Batımı" name="Sunset"/>
+ <menu_item_call label="Gece Yarısı" name="Midnight"/>
+ <menu_item_call label="Bölge Ayarlarını Kullanın" name="Use Region Settings"/>
+ </menu>
+ <menu label="Ortam Düzenleyici" name="Environment Editor">
+ <menu_item_call label="Ortam Ayarları..." name="Environment Settings"/>
+ <menu label="Su Ön Ayarları" name="Water Presets">
+ <menu_item_call label="Yeni ön ayar..." name="new_water_preset"/>
+ <menu_item_call label="Ön ayarı düzenle..." name="edit_water_preset"/>
+ <menu_item_call label="Ön ayarı sil..." name="delete_water_preset"/>
+ </menu>
+ <menu label="Gökyüzü Ön Ayarları" name="Sky Presets">
+ <menu_item_call label="Yeni ön ayar..." name="new_sky_preset"/>
+ <menu_item_call label="Ön ayarı düzenle..." name="edit_sky_preset"/>
+ <menu_item_call label="Ön ayarı sil..." name="delete_sky_preset"/>
+ </menu>
+ <menu label="Gün Ön Ayarları" name="Day Presets">
+ <menu_item_call label="Yeni ön ayar..." name="new_day_preset"/>
+ <menu_item_call label="Ön ayarı düzenle..." name="edit_day_preset"/>
+ <menu_item_call label="Ön ayarı sil..." name="delete_day_preset"/>
+ </menu>
+ </menu>
+ </menu>
+ <menu label="İnşa Et" name="BuildTools">
+ <menu_item_check label="İnşa Et" name="Show Build Tools"/>
+ <menu label="İnşa Et Aracını Seç" name="Select Tool">
+ <menu_item_call label="Odaklanma Aracı" name="Focus"/>
+ <menu_item_call label="Hareket Ettirme Aracı" name="Move"/>
+ <menu_item_call label="Düzenleme Aracı" name="Edit"/>
+ <menu_item_call label="Oluşturma Aracı" name="Create"/>
+ <menu_item_call label="Arazi Aracı" name="Land"/>
+ </menu>
+ <menu_item_call label="BaÄŸla" name="Link"/>
+ <menu_item_call label="BaÄŸlnty. Kopar" name="Unlink"/>
+ <menu_item_check label="Bağlantılı Parçaları Düzenle" name="Edit Linked Parts"/>
+ <menu label="Bağlantılı Parçaları Seç" name="Select Linked Parts">
+ <menu_item_call label="Sonraki Parçayı Seç" name="Select Next Part"/>
+ <menu_item_call label="Önceki Parçayı Seç" name="Select Previous Part"/>
+ <menu_item_call label="Sonraki Parçayı Dahil Et" name="Include Next Part"/>
+ <menu_item_call label="Önceki Parçayı Dahil Et" name="Include Previous Part"/>
+ </menu>
+ <menu_item_call label="Seçime Odaklan" name="Focus on Selection"/>
+ <menu_item_call label="Seçimi Yakınlaştır" name="Zoom to Selection"/>
+ <menu label="Nesne" name="Object">
+ <menu_item_call label="Satın Al" name="Menu Object Buy"/>
+ <menu_item_call label="Al" name="Menu Object Take"/>
+ <menu_item_call label="Kopya Al" name="Take Copy"/>
+ <menu_item_call label="Envanterime Geri Kaydet" name="Save Object Back to My Inventory"/>
+ <menu_item_call label="Nesne İçeriklerine Geri Kaydet" name="Save Object Back to Object Contents"/>
+ <menu_item_call label="Nesneyi İade Et" name="Return Object back to Owner"/>
+ </menu>
+ <menu label="Komut Dosyaları" name="Scripts">
+ <menu_item_call label="Komut Dosyalarını Tekrar Derle (Mono)" name="Mono"/>
+ <menu_item_call label="Komut Dosyalarını Tekrar Derle (LSL)" name="LSL"/>
+ <menu_item_call label="Komut Dosyalarını Sıfırla" name="Reset Scripts"/>
+ <menu_item_call label="Komut Dosyalarını Çalışıyor Olarak Ayarla" name="Set Scripts to Running"/>
+ <menu_item_call label="Komut Dosyalarını Çalışmıyor Olarak Ayarla" name="Set Scripts to Not Running"/>
+ </menu>
+ <menu label="Seçenklr." name="Options">
+ <menu_item_check label="Gelişmiş İzinleri Göster" name="DebugPermissions"/>
+ <menu_item_check label="Sadece Nesnelerimi Seç" name="Select Only My Objects"/>
+ <menu_item_check label="Sadece Hareket Ettirilebilir Nesneleri Seç" name="Select Only Movable Objects"/>
+ <menu_item_check label="Çevreleyerek Seç" name="Select By Surrounding"/>
+ <menu_item_check label="Seçim Ana Hatlarını Göster" name="Show Selection Outlines"/>
+ <menu_item_check label="Gizli Seçimi Göster" name="Show Hidden Selection"/>
+ <menu_item_check label="Seçim İçin Işık Yarı Çapını Göster" name="Show Light Radius for Selection"/>
+ <menu_item_check label="Seçim Işınını Göster" name="Show Selection Beam"/>
+ <menu_item_check label="AÄŸa Uydur" name="Snap to Grid"/>
+ <menu_item_call label="XY Nesnesini AÄŸa Uydur" name="Snap Object XY to Grid"/>
+ <menu_item_call label="Ağ İçin Seçimi Kullan" name="Use Selection for Grid"/>
+ <menu_item_call label="Ağ Seçenekleri" name="Grid Options"/>
+ </menu>
+ <menu label="Karşıya Yükle" name="Upload">
+ <menu_item_call label="Görüntü (L$[COST])..." name="Upload Image"/>
+ <menu_item_call label="Ses (L$[COST])..." name="Upload Sound"/>
+ <menu_item_call label="Animasyon (L$[COST])..." name="Upload Animation"/>
+ <menu_item_call label="Model..." name="Upload Model"/>
+ <menu_item_call label="Toplu (dosya başına L$[COST])..." name="Bulk Upload"/>
+ <menu_item_call label="Varsayılan Karşıya Yükleme İzinlerini Ayarla" name="perm prefs"/>
+ </menu>
+ <menu_item_call label="Geri Al" name="Undo"/>
+ <menu_item_call label="Yinele" name="Redo"/>
+ </menu>
+ <menu label="Yardım" name="Help">
+ <menu_item_call label="Nasıl yapılır..." name="How To"/>
+ <menu_item_call label="[SECOND_LIFE] Yardımı" name="Second Life Help"/>
+ <menu_item_call label="Kötüye Kullanımı Bildir" name="Report Abuse"/>
+ <menu_item_call label="Hata Bildir" name="Report Bug"/>
+ <menu_item_call label="[APP_NAME] Hakkında" name="About Second Life"/>
+ </menu>
+ <menu label="GeliÅŸmiÅŸ" name="Advanced">
+ <menu_item_call label="Dokuları Tekrar Kaydet" name="Rebake Texture"/>
+ <menu_item_call label="KA Büyüklüğünü Varsayılana Ayarla" name="Set UI Size to Default"/>
+ <menu_item_call label="Pencere Büyüklüğünü Ayarla..." name="Set Window Size..."/>
+ <menu_item_check label="Seçim Mesafesini Sınırla" name="Limit Select Distance"/>
+ <menu_item_check label="Kamera Kısıtlarını Devredışı Bırak" name="Disable Camera Distance"/>
+ <menu_item_check label="Yüksek Çöz. Anlık Görüntü" name="HighResSnapshot"/>
+ <menu_item_check label="Sessiz ve Animasyonsuz Anlık Görüntüleri Diske Kaydet" name="QuietSnapshotsToDisk"/>
+ <menu label="Performans Araçları" name="Performance Tools">
+ <menu_item_call label="Gecikme Ölçer" name="Lag Meter"/>
+ <menu_item_check label="İstatistik Çubuğu" name="Statistics Bar"/>
+ <menu_item_check label="Avatarlar İçin Çizim Ağırlığını Göster" name="Avatar Rendering Cost"/>
+ </menu>
+ <menu label="Vurgulama ve Görünürlük" name="Highlighting and Visibility">
+ <menu_item_check label="Yanıp Sönen İşaret" name="Cheesy Beacon"/>
+ <menu_item_check label="Parçacıkları Gizle" name="Hide Particles"/>
+ <menu_item_check label="Seçilenleri Gizle" name="Hide Selected"/>
+ <menu_item_check label="Saydamı Vurgula" name="Highlight Transparent"/>
+ <menu_item_check label="BÜG Aksesuarlarını Göster" name="Show HUD Attachments"/>
+ <menu_item_check label="Fare Üzerinden Görünüm Artı İşaretini Göster" name="ShowCrosshairs"/>
+ </menu>
+ <menu label="İşleme Türleri" name="Rendering Types">
+ <menu_item_check label="Basit" name="Simple"/>
+ <menu_item_check label="Alfa" name="Alpha"/>
+ <menu_item_check label="Ağaç" name="Tree"/>
+ <menu_item_check label="Avatarlar" name="Character"/>
+ <menu_item_check label="Yüzey Yaması" name="Surface Patch"/>
+ <menu_item_check label="Gökyüzü" name="Sky"/>
+ <menu_item_check label="Su" name="Water"/>
+ <menu_item_check label="Toprak" name="Ground"/>
+ <menu_item_check label="Hacim" name="Volume"/>
+ <menu_item_check label="Çimen" name="Grass"/>
+ <menu_item_check label="Bulutlar" name="Clouds"/>
+ <menu_item_check label="Parçacıklar" name="Particles"/>
+ <menu_item_check label="Tümsek" name="Bump"/>
+ </menu>
+ <menu label="İşleme Özellikleri" name="Rendering Features">
+ <menu_item_check label="KA" name="UI"/>
+ <menu_item_check label="Seçili" name="Selected"/>
+ <menu_item_check label="Vurgulanmış" name="Highlighted"/>
+ <menu_item_check label="Dinamik Dokular" name="Dynamic Textures"/>
+ <menu_item_check label="Ayak Hizası Gölgeleri" name="Foot Shadows"/>
+ <menu_item_check label="Pus" name="Fog"/>
+ <menu_item_check label="FRInfo Testi" name="Test FRInfo"/>
+ <menu_item_check label="Esnek Nesneler" name="Flexible Objects"/>
+ </menu>
+ <menu_item_check label="İş Parçacığı Okuma Eklentisini Kullan" name="Use Plugin Read Thread"/>
+ <menu_item_call label="Grup Ön Belleğini Temizle" name="ClearGroupCache"/>
+ <menu_item_check label="Fare Düzleştirme" name="Mouse Smoothing"/>
+ <menu_item_call label="Bırakma Anahtarları" name="Release Keys"/>
+ <menu label="Kısa Yollar" name="Shortcuts">
+ <menu_item_call label="Görüntü (L$[COST])..." name="Upload Image"/>
+ <menu_item_check label="Ara" name="Search"/>
+ <menu_item_check label="Gelişmiş Menüyü Göster - eski kısayol" name="Show Advanced Menu - legacy shortcut"/>
+ <menu_item_call label="Pencereyi Kapat" name="Close Window"/>
+ <menu_item_call label="Tüm Pencereleri Kapat" name="Close All Windows"/>
+ <menu_item_call label="Diske Anlık Görüntü" name="Snapshot to Disk"/>
+ <menu_item_call label="Fare Üzerinden Görünüm" name="Mouselook"/>
+ <menu_item_check label="Oyun Çubuğu Flycam" name="Joystick Flycam"/>
+ <menu_item_call label="Görünümü Sıfırla" name="Reset View"/>
+ <menu_item_call label="Son Sohbet Edene Bak" name="Look at Last Chatter"/>
+ <menu label="İnşa Et Aracını Seç" name="Select Tool">
+ <menu_item_call label="Odaklanma Aracı" name="Focus"/>
+ <menu_item_call label="Hareket Ettirme Aracı" name="Move"/>
+ <menu_item_call label="Düzenleme Aracı" name="Edit"/>
+ <menu_item_call label="Oluşturma Aracı" name="Create"/>
+ <menu_item_call label="Arazi Aracı" name="Land"/>
+ </menu>
+ <menu_item_call label="Yakınlaştır" name="Zoom In"/>
+ <menu_item_call label="Varsayılan Yakınlaştırma" name="Zoom Default"/>
+ <menu_item_call label="Uzaklaştırma" name="Zoom Out"/>
+ </menu>
+ <menu_item_call label="Hata Ayıklama Ayarlarını Göster" name="Debug Settings"/>
+ <menu_item_check label="Geliştirme Menüsünü Göster" name="Debug Mode"/>
+ </menu>
+ <menu label="GeliÅŸtir" name="Develop">
+ <menu label="Konsollar" name="Consoles">
+ <menu_item_check label="Doku Konsolu" name="Texture Console"/>
+ <menu_item_check label="Hata Ayıklama Konsolu" name="Debug Console"/>
+ <menu_item_call label="Bildirimler Konsolu" name="Notifications"/>
+ <menu_item_check label="Doku Büyüklüğü Konsolu" name="Texture Size"/>
+ <menu_item_check label="Doku Kategorisi Konsolu" name="Texture Category"/>
+ <menu_item_check label="Hızlı Zamanlayıcılar" name="Fast Timers"/>
+ <menu_item_check label="Bellek" name="Memory"/>
+ <menu_item_check label="Sahne İstatistikleri" name="Scene Statistics"/>
+ <menu_item_call label="Hata Ayıklama Konsoluna giden Bölge Bilgisi" name="Region Info to Debug Console"/>
+ <menu_item_call label="Hata Ayıklama Konsoluna giden Grup Bilgisi" name="Group Info to Debug Console"/>
+ <menu_item_call label="Hata Ayıklama Konsoluna giden Özellikler Bilgisi" name="Capabilities Info to Debug Console"/>
+ <menu_item_check label="Kamera" name="Camera"/>
+ <menu_item_check label="Rüzgar" name="Wind"/>
+ <menu_item_check label="Görünüm Alanı" name="FOV"/>
+ <menu_item_check label="Rozet" name="Badge"/>
+ </menu>
+ <menu label="Bilgiyi Göster" name="Display Info">
+ <menu_item_check label="Zamanı Göster" name="Show Time"/>
+ <menu_item_check label="Karşıya Yükleme Maliyetini Göster" name="Show Upload Cost"/>
+ <menu_item_check label="İşleme Bilgisini Göster" name="Show Render Info"/>
+ <menu_item_check label="Doku Bilgisini Göster" name="Show Texture Info"/>
+ <menu_item_check label="Matrisleri Göster" name="Show Matrices"/>
+ <menu_item_check label="İmlecin Altındaki Rengi Göster" name="Show Color Under Cursor"/>
+ <menu_item_check label="Belleği Göster" name="Show Memory"/>
+ <menu_item_check label="Özel Bellek Bilgisini Göster" name="Show Private Mem Info"/>
+ <menu_item_check label="Nesneler İçin Güncelleştirmeleri Göster" name="Show Updates"/>
+ </menu>
+ <menu label="Bir Hatayı Zorla" name="Force Errors">
+ <menu_item_call label="Kesme Noktasını Zorla" name="Force Breakpoint"/>
+ <menu_item_call label="LLError ve Çökme Zorla" name="Force LLError And Crash"/>
+ <menu_item_call label="Hatalı Bellek Erişimini Zorla" name="Force Bad Memory Access"/>
+ <menu_item_call label="Sonsuz Döngüyü Zorla" name="Force Infinite Loop"/>
+ <menu_item_call label="Sürücü Çökmesini Zorla" name="Force Driver Carsh"/>
+ <menu_item_call label="Yazılım Özel Durumunu Zorla" name="Force Software Exception"/>
+ <menu_item_call label="Görüntüleyici Bağlantısının Kesilmesini Zorla" name="Force Disconnect Viewer"/>
+ <menu_item_call label="Bir Bellek Sızıntısı Benzetimini Gerçekleştir" name="Memory Leaking Simulation"/>
+ </menu>
+ <menu label="İşleme Testleri" name="Render Tests">
+ <menu_item_check label="Kamera Kayması" name="Camera Offset"/>
+ <menu_item_check label="Çerçeve Hızını Rastgele Seç" name="Randomize Framerate"/>
+ <menu_item_check label="Düzenli Yavaş Çerçeve" name="Periodic Slow Frame"/>
+ <menu_item_check label="Çerçeve Testi" name="Frame Test"/>
+ </menu>
+ <menu label="Meta Verileri İşle" name="Render Metadata">
+ <menu_item_check label="Sınırlama Kutuları" name="Bounding Boxes"/>
+ <menu_item_check label="Normaller" name="Normals"/>
+ <menu_item_check label="Gölgeleme Ağacı" name="Octree"/>
+ <menu_item_check label="Gölge Kesik Koni" name="Shadow Frusta"/>
+ <menu_item_check label="Fizik Åžekilleri" name="Physics Shapes"/>
+ <menu_item_check label="Gölgeleme" name="Occlusion"/>
+ <menu_item_check label="Toplu İşleri İşle" name="Render Batches"/>
+ <menu_item_check label="Güncelleştirme Türü" name="Update Type"/>
+ <menu_item_check label="Doku Animasyonu" name="Texture Anim"/>
+ <menu_item_check label="Doku Önceliği" name="Texture Priority"/>
+ <menu_item_check label="Doku Alanı" name="Texture Area"/>
+ <menu_item_check label="Yüz Alanı" name="Face Area"/>
+ <menu_item_check label="Ayrıntı Seviyesi Bilgisi" name="LOD Info"/>
+ <menu_item_check label="İnşa Kuyruğu" name="Build Queue"/>
+ <menu_item_check label="Işıklar" name="Lights"/>
+ <menu_item_check label="Çarpışma İskeleti" name="Collision Skeleton"/>
+ <menu_item_check label="Işın Yayını" name="Raycast"/>
+ <menu_item_check label="Rüzgar Vektörleri" name="Wind Vectors"/>
+ <menu_item_check label="İşleme Karmaşıklığı" name="rendercomplexity"/>
+ <menu_item_check label="Åžekillendir" name="Sculpt"/>
+ </menu>
+ <menu label="İşleme" name="Rendering">
+ <menu_item_check label="Eksenler" name="Axes"/>
+ <menu_item_check label="Tanjant Temeli" name="Tangent Basis"/>
+ <menu_item_call label="Seçilen Doku Bilgi Temeli" name="Selected Texture Info Basis"/>
+ <menu_item_check label="Telkafes" name="Wireframe"/>
+ <menu_item_check label="Görünen Nesneler İçin Gölgeleme" name="Object-Object Occlusion"/>
+ <menu_item_check label="Işıklandırma ve Gölgeler" name="Lighting and Shadows"/>
+ <menu_item_check label="Güneş/Ay/Projektörlerden Gelen Gölgeler" name="Shadows from Sun/Moon/Projectors"/>
+ <menu_item_check label="SSAO ve Gölge Yumuşatma" name="SSAO and Shadow Smoothing"/>
+ <menu_item_check label="GL Hata Ayıklama" name="Debug GL"/>
+ <menu_item_check label="Ardışık Hata Ayıklama" name="Debug Pipeline"/>
+ <menu_item_check label="Otomatik Alfa Maskeleri (ertelenmiÅŸ)" name="Automatic Alpha Masks (deferred)"/>
+ <menu_item_check label="Otomatik Alfa Maskeleri (ertelenmemiÅŸ)" name="Automatic Alpha Masks (non-deferred)"/>
+ <menu_item_check label="Animasyon Dokuları" name="Animation Textures"/>
+ <menu_item_check label="Dokuları Devre Dışı Bırak" name="Disable Textures"/>
+ <menu_item_check label="Tam Çöz. Dokular" name="Rull Res Textures"/>
+ <menu_item_check label="Dokuları Denetle" name="Audit Textures"/>
+ <menu_item_check label="Doku Atlas (deneysel)" name="Texture Atlas"/>
+ <menu_item_check label="Eklenmiş Işıkları İşle" name="Render Attached Lights"/>
+ <menu_item_check label="Eklenmiş Parçacıkları İşle" name="Render Attached Particles"/>
+ <menu_item_check label="Parıldayan Nesneler Üzerine Gel" name="Hover Glow Objects"/>
+ </menu>
+ <menu label="AÄŸ" name="Network">
+ <menu_item_check label="Aracıyı Durdur" name="AgentPause"/>
+ <menu_item_call label="İleti Günlüğünü Etkinleştir" name="Enable Message Log"/>
+ <menu_item_call label="İleti Günlüğünü Devre Dışı Bırak" name="Disable Message Log"/>
+ <menu_item_check label="Nesnelerin Hızını İnterpole Edin" name="Velocity Interpolate Objects"/>
+ <menu_item_check label="Nesne Konumlarını Ping İle İnterpole Edin" name="Ping Interpolate Object Positions"/>
+ <menu_item_call label="Paket Bırakın" name="Drop a Packet"/>
+ </menu>
+ <menu_item_call label="Komut Dosyalı Kameranın Dökümünü Al" name="Dump Scripted Camera"/>
+ <menu_item_call label="Toslamalar, İtmeler ve Vurmalar" name="Bumps, Pushes &amp;amp; Hits"/>
+ <menu label="Kaydedici" name="Recorder">
+ <menu_item_call label="Oynatmayı Başlat" name="Start Playback"/>
+ <menu_item_call label="Oynatmayı Durdur" name="Stop Playback"/>
+ <menu_item_check label="Döngü Oynatma" name="Loop Playback"/>
+ <menu_item_call label="Kaydı Başlat" name="Start Record"/>
+ <menu_item_call label="Kaydı Durdur" name="Stop Record"/>
+ </menu>
+ <menu label="Dünya" name="World">
+ <menu_item_check label="Sim Güneşi Geçersiz Kıl" name="Sim Sun Override"/>
+ <menu_item_check label="Yanıp Sönen İşaret" name="Cheesy Beacon"/>
+ <menu_item_check label="Sabit Hava Durumu" name="Fixed Weather"/>
+ <menu_item_call label="Bölge Nesne Önbelleğinin Dökümünü Al" name="Dump Region Object Cache"/>
+ </menu>
+ <menu label="KA" name="UI">
+ <menu_item_call label="Ortam Tarayıcı Testi" name="Web Browser Test"/>
+ <menu_item_call label="Web İçerik Tarayıcısı" name="Web Content Browser"/>
+ <menu_item_call label="SelectMgr&apos;i Dökümünü Al" name="Dump SelectMgr"/>
+ <menu_item_call label="Envanterin Dökümünü Al" name="Dump Inventory"/>
+ <menu_item_call label="Zamanlayıcıların Dökümünü Al" name="Dump Timers"/>
+ <menu_item_call label="Odaklayıcı Tutucunun Dökümünü Al" name="Dump Focus Holder"/>
+ <menu_item_call label="Seçilen Nesne Bilgisini Yazdır" name="Print Selected Object Info"/>
+ <menu_item_call label="Aracı Bilgisini Yazdır" name="Print Agent Info"/>
+ <menu_item_call label="Bellek İstatistikleri" name="Memory Stats"/>
+ <menu_item_check label="Bölge Hata Ayıklama Konsolu" name="Region Debug Console"/>
+ <menu_item_check label="SelectMgr İçin Hata Ayıklama" name="Debug SelectMgr"/>
+ <menu_item_check label="Tıklamalar İçin Hata Ayıklama" name="Debug Clicks"/>
+ <menu_item_check label="Görünümler için Hata Ayıklama" name="Debug Views"/>
+ <menu_item_check label="Ad Araç İpuçları İçin Hata Ayıklama" name="Debug Name Tooltips"/>
+ <menu_item_check label="Fare Etkinlikleri İçin Hata Ayıklama" name="Debug Mouse Events"/>
+ <menu_item_check label="Anahtarlar İçin Hata Ayıklama" name="Debug Keys"/>
+ <menu_item_check label="WindowProc İçin Hata Ayıklama" name="Debug WindowProc"/>
+ </menu>
+ <menu label="XUI" name="XUI">
+ <menu_item_call label="Renk Ayarlarını Tekrar Yükle" name="Reload Color Settings"/>
+ <menu_item_call label="Fon Testini Göster" name="Show Font Test"/>
+ <menu_item_check label="XUI Adlarını Göster" name="Show XUI Names"/>
+ <menu_item_call label="Test Amaçlı Aİ&apos;ler Gönder" name="Send Test IMs"/>
+ <menu_item_call label="Ad Önbelleklerini Temizle" name="Flush Names Caches"/>
+ </menu>
+ <menu label="Avatar" name="Character">
+ <menu label="KaydedilmiÅŸ Dokuyu Al" name="Grab Baked Texture">
+ <menu_item_call label="İris" name="Iris"/>
+ <menu_item_call label="BaÅŸ" name="Head"/>
+ <menu_item_call label="Üst Gövde" name="Upper Body"/>
+ <menu_item_call label="Alt Gövde" name="Lower Body"/>
+ <menu_item_call label="Etek" name="Skirt"/>
+ </menu>
+ <menu label="Karakter Testleri" name="Character Tests">
+ <menu_item_call label="XML&apos;de Görünüm" name="Appearance To XML"/>
+ <menu_item_call label="Karakter Geometrisini Aç/Kapa" name="Toggle Character Geometry"/>
+ <menu_item_call label="Test ErkeÄŸi" name="Test Male"/>
+ <menu_item_call label="Test DiÅŸisi" name="Test Female"/>
+ <menu_item_call label="PG&apos;yi Aç/Kapa" name="Toggle PG"/>
+ <menu_item_check label="Avatar Seçimine İzin Ver" name="Allow Select Avatar"/>
+ </menu>
+ <menu_item_call label="Parametreleri Varsayılana Zorla" name="Force Params to Default"/>
+ <menu_item_check label="Animasyon Bilgisi" name="Animation Info"/>
+ <menu_item_check label="Yavaş Hareket Animasyonları" name="Slow Motion Animations"/>
+ <menu_item_check label="Şuraya Bak&apos;ı Göster" name="Show Look At"/>
+ <menu_item_check label="Şuraya İşaret Et&apos;i Göster" name="Show Point At"/>
+ <menu_item_check label="Eklem Güncelleştirmeleri İçin Hata Ayıklama" name="Debug Joint Updates"/>
+ <menu_item_check label="Ayrıntı Seviyesi Bilgisini Devre Dışı Bırak" name="Disable LOD"/>
+ <menu_item_check label="Debug Character Vis" name="Debug Character Vis"/>
+ <menu_item_check label="Çarpışma İskeletini Göster" name="Show Collision Skeleton"/>
+ <menu_item_check label="Aracı Hedefini Göster" name="Display Agent Target"/>
+ --&gt;
+ <menu_item_call label="Aksesuarların Dökümünü Al" name="Dump Attachments"/>
+ <menu_item_call label="Avatar Dokuları İçin Hata Ayıklama" name="Debug Avatar Textures"/>
+ <menu_item_call label="Yerel Dokuların Dökümünü Al" name="Dump Local Textures"/>
+ </menu>
+ <menu_item_check label="HTTP Dokuları" name="HTTP Textures"/>
+ <menu_item_check label="HTTP Envanteri" name="HTTP Inventory"/>
+ <menu_item_call label="Görüntüleri Sıkıştır" name="Compress Images"/>
+ <menu_item_check label="Mini Döküm Dosyası Hata Ayıklama Çıktısı" name="Output Debug Minidump"/>
+ <menu_item_check label="Sonraki Çalışmada Konsol Penceresi" name="Console Window"/>
+ <menu_item_call label="Yönetici Durumu Talep Et" name="Request Admin Options"/>
+ <menu_item_call label="Yönetici Durumundan Ayrıl" name="Leave Admin Options"/>
+ <menu_item_check label="Yönetici Menüsünü Göster" name="View Admin Options"/>
+ </menu>
+ <menu label="Yönetici" name="Admin">
+ <menu label="Object">
+ <menu_item_call label="Kopya Al" name="Take Copy"/>
+ <menu_item_call label="Mülkiyetime Geçir" name="Force Owner To Me"/>
+ <menu_item_call label="İzinlerle Birlikte Mülkiyetime Geçir" name="Force Owner Permissive"/>
+ <menu_item_call label="Sil" name="Delete"/>
+ <menu_item_call label="Kilitle" name="Lock"/>
+ <menu_item_call label="Varlık Kimliklerini Al" name="Get Assets IDs"/>
+ </menu>
+ <menu label="Parsel" name="Parcel">
+ <menu_item_call label="Mülkiyetime Geçir" name="Owner To Me"/>
+ <menu_item_call label="Linden İçeriğine Ayarla" name="Set to Linden Content"/>
+ <menu_item_call label="Kamu Arazisi Üzerinde Hak Talep Et" name="Claim Public Land"/>
+ </menu>
+ <menu label="Bölge" name="Region">
+ <menu_item_call label="Geçici Varlık Verilerinin Dökümünü Al" name="Dump Temp Asset Data"/>
+ <menu_item_call label="Bölge Durumunu Kaydet" name="Save Region State"/>
+ </menu>
+ <menu_item_call label="Yönetici Araçları" name="God Tools"/>
+ </menu>
+ <menu label="Yönetici" name="Deprecated">
+ <menu label="Nesneyi Ekle" name="Attach Object"/>
+ <menu label="Nesneyi Ayır" name="Detach Object"/>
+ <menu label="Giysiyi Çıkar" name="Take Off Clothing">
+ <menu_item_call label="Gömlek" name="Shirt"/>
+ <menu_item_call label="Pantolon" name="Pants"/>
+ <menu_item_call label="Ayakkabılar" name="Shoes"/>
+ <menu_item_call label="Çoraplar" name="Socks"/>
+ <menu_item_call label="Ceket" name="Jacket"/>
+ <menu_item_call label="Eldivenler" name="Gloves"/>
+ <menu_item_call label="Fanila" name="Menu Undershirt"/>
+ <menu_item_call label="Külot" name="Menu Underpants"/>
+ <menu_item_call label="Etek" name="Skirt"/>
+ <menu_item_call label="Alfa" name="Alpha"/>
+ <menu_item_call label="Dövme" name="Tattoo"/>
+ <menu_item_call label="Fizik" name="Physics"/>
+ <menu_item_call label="Tüm Giysiler" name="All Clothes"/>
+ </menu>
+ <menu label="Yardım" name="Help">
+ <menu_item_call label="Resmi Linden Blog&apos;u" name="Official Linden Blog"/>
+ <menu_item_call label="Komut Dosyası Portalı" name="Scripting Portal"/>
+ <menu label="Hata Raporlama" name="Bug Reporting">
+ <menu_item_call label="Kamuya Açık Sorun İzleyicisi" name="Public Issue Tracker"/>
+ <menu_item_call label="Kamuya Açık Sorun İzleyicisi Yardımı" name="Publc Issue Tracker Help"/>
+ <menu_item_call label="Hata Raporlama 101" name="Bug Reporing 101"/>
+ <menu_item_call label="Güvenlik Sorunları" name="Security Issues"/>
+ <menu_item_call label="Soru ve Yanıt Wiki Sayfası" name="QA Wiki"/>
+ </menu>
+ </menu>
+ </menu>
+</menu_bar>
diff --git a/indra/newview/skins/default/xui/tr/menu_wearable_list_item.xml b/indra/newview/skins/default/xui/tr/menu_wearable_list_item.xml
new file mode 100644
index 0000000000..448202df87
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_wearable_list_item.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Outfit Wearable Context Menu">
+ <menu_item_call label="DeÄŸiÅŸtir" name="wear_replace"/>
+ <menu_item_call label="Giy" name="wear_wear"/>
+ <menu_item_call label="Ekle" name="wear_add"/>
+ <menu_item_call label="Çıkar / Ayır" name="take_off_or_detach"/>
+ <menu_item_call label="Ayır" name="detach"/>
+ <context_menu label="Åžuna ekle" name="wearable_attach_to"/>
+ <context_menu label="BÜG&apos;e Ekle" name="wearable_attach_to_hud"/>
+ <menu_item_call label="Çıkar" name="take_off"/>
+ <menu_item_call label="Düzenle" name="edit"/>
+ <menu_item_call label="Öğe Profili" name="object_profile"/>
+ <menu_item_call label="Orijinali Göster" name="show_original"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_wearing_gear.xml b/indra/newview/skins/default/xui/tr/menu_wearing_gear.xml
new file mode 100644
index 0000000000..438e580cd3
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_wearing_gear.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="Gear Wearing">
+ <menu_item_call label="Dış Görünümü Düzenle" name="edit"/>
+ <menu_item_call label="Çıkar" name="takeoff"/>
+ <menu_item_call label="Dış görünüm listesini panoya kopyala" name="copy"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_wearing_tab.xml b/indra/newview/skins/default/xui/tr/menu_wearing_tab.xml
new file mode 100644
index 0000000000..9796546559
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_wearing_tab.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Wearing">
+ <menu_item_call label="Çıkar" name="take_off"/>
+ <menu_item_call label="Ayır" name="detach"/>
+ <menu_item_call label="Dış Görünümü Düzenle" name="edit"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/tr/mime_types.xml b/indra/newview/skins/default/xui/tr/mime_types.xml
new file mode 100644
index 0000000000..c37f872a65
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/mime_types.xml
@@ -0,0 +1,217 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<mimetypes name="default">
+ <widgetset name="web">
+ <label name="web_label">
+ Web İçeriği
+ </label>
+ <tooltip name="web_tooltip">
+ Bu konumda Web içeriği var
+ </tooltip>
+ <playtip name="web_playtip">
+ Web içeriğini göster
+ </playtip>
+ </widgetset>
+ <widgetset name="movie">
+ <label name="movie_label">
+ Film
+ </label>
+ <tooltip name="movie_tooltip">
+ Burada oynatılacak bir film var
+ </tooltip>
+ <playtip name="movie_playtip">
+ Filmi oynat
+ </playtip>
+ </widgetset>
+ <widgetset name="image">
+ <label name="image_label">
+ Görüntü
+ </label>
+ <tooltip name="image_tooltip">
+ Bu konumda bir görüntü var
+ </tooltip>
+ <playtip name="image_playtip">
+ Bu konumdaki görüntüyü göster
+ </playtip>
+ </widgetset>
+ <widgetset name="audio">
+ <label name="audio_label">
+ Ses
+ </label>
+ <tooltip name="audio_tooltip">
+ Bu konumda ses var
+ </tooltip>
+ <playtip name="audio_playtip">
+ Bu konumdaki sesi çal
+ </playtip>
+ </widgetset>
+ <scheme name="rtsp">
+ <label name="rtsp_label">
+ Gerçek Zamanlı Akış
+ </label>
+ </scheme>
+ <mimetype name="blank">
+ <label name="blank_label">
+ - Hiçbiri -
+ </label>
+ </mimetype>
+ <mimetype name="none/none">
+ <label name="none/none_label">
+ - Hiçbiri -
+ </label>
+ </mimetype>
+ <mimetype name="audio/*">
+ <label name="audio2_label">
+ Ses
+ </label>
+ </mimetype>
+ <mimetype name="video/*">
+ <label name="video2_label">
+ Video
+ </label>
+ </mimetype>
+ <mimetype name="image/*">
+ <label name="image2_label">
+ Görüntü
+ </label>
+ </mimetype>
+ <mimetype name="video/vnd.secondlife.qt.legacy">
+ <label name="vnd.secondlife.qt.legacy_label">
+ Film (QuickTime)
+ </label>
+ </mimetype>
+ <mimetype name="application/javascript">
+ <label name="application/javascript_label">
+ Javascript
+ </label>
+ </mimetype>
+ <mimetype name="application/ogg">
+ <label name="application/ogg_label">
+ Ogg Ses/Video
+ </label>
+ </mimetype>
+ <mimetype name="application/pdf">
+ <label name="application/pdf_label">
+ PDF Belgesi
+ </label>
+ </mimetype>
+ <mimetype name="application/postscript">
+ <label name="application/postscript_label">
+ Postscript Belgesi
+ </label>
+ </mimetype>
+ <mimetype name="application/rtf">
+ <label name="application/rtf_label">
+ Zengin Metin (RTF)
+ </label>
+ </mimetype>
+ <mimetype name="application/smil">
+ <label name="application/smil_label">
+ Eşzamanlı Multimedya Tümleştirme Dili (SMIL)
+ </label>
+ </mimetype>
+ <mimetype name="application/xhtml+xml">
+ <label name="application/xhtml+xml_label">
+ Web Sayfası (XHTML)
+ </label>
+ </mimetype>
+ <mimetype name="application/x-director">
+ <label name="application/x-director_label">
+ Macromedia Director
+ </label>
+ </mimetype>
+ <mimetype name="audio/mid">
+ <label name="audio/mid_label">
+ Ses (MIDI)
+ </label>
+ </mimetype>
+ <mimetype name="audio/mpeg">
+ <label name="audio/mpeg_label">
+ Ses (MP3)
+ </label>
+ </mimetype>
+ <mimetype name="audio/x-aiff">
+ <label name="audio/x-aiff_label">
+ Ses (AIFF)
+ </label>
+ </mimetype>
+ <mimetype name="audio/x-wav">
+ <label name="audio/x-wav_label">
+ Ses (WAV)
+ </label>
+ </mimetype>
+ <mimetype name="image/bmp">
+ <label name="image/bmp_label">
+ Görüntü (BMP)
+ </label>
+ </mimetype>
+ <mimetype name="image/gif">
+ <label name="image/gif_label">
+ Görüntü (GIF)
+ </label>
+ </mimetype>
+ <mimetype name="image/jpeg">
+ <label name="image/jpeg_label">
+ Görüntü (JPEG)
+ </label>
+ </mimetype>
+ <mimetype name="image/png">
+ <label name="image/png_label">
+ Görüntü (PNG)
+ </label>
+ </mimetype>
+ <mimetype name="image/svg+xml">
+ <label name="image/svg+xml_label">
+ Görüntü (SVG)
+ </label>
+ </mimetype>
+ <mimetype name="image/tiff">
+ <label name="image/tiff_label">
+ Görüntü (TIFF)
+ </label>
+ </mimetype>
+ <mimetype name="text/html">
+ <label name="text/html_label">
+ Web Sayfası
+ </label>
+ </mimetype>
+ <mimetype name="text/plain">
+ <label name="text/plain_label">
+ Metin
+ </label>
+ </mimetype>
+ <mimetype name="text/xml">
+ <label name="text/xml_label">
+ XML
+ </label>
+ </mimetype>
+ <mimetype name="video/mpeg">
+ <label name="video/mpeg_label">
+ Film (MPEG)
+ </label>
+ </mimetype>
+ <mimetype name="video/mp4">
+ <label name="video/mp4_label">
+ Film (MP4)
+ </label>
+ </mimetype>
+ <mimetype name="video/quicktime">
+ <label name="video/quicktime_label">
+ Film (QuickTime)
+ </label>
+ </mimetype>
+ <mimetype name="video/x-ms-asf">
+ <label name="video/x-ms-asf_label">
+ Film (Windows Media ASF)
+ </label>
+ </mimetype>
+ <mimetype name="video/x-ms-wmv">
+ <label name="video/x-ms-wmv_label">
+ Film (Windows Media WMV)
+ </label>
+ </mimetype>
+ <mimetype name="video/x-msvideo">
+ <label name="video/x-msvideo_label">
+ Film (AVI)
+ </label>
+ </mimetype>
+</mimetypes>
diff --git a/indra/newview/skins/default/xui/tr/mime_types_linux.xml b/indra/newview/skins/default/xui/tr/mime_types_linux.xml
new file mode 100644
index 0000000000..c37f872a65
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/mime_types_linux.xml
@@ -0,0 +1,217 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<mimetypes name="default">
+ <widgetset name="web">
+ <label name="web_label">
+ Web İçeriği
+ </label>
+ <tooltip name="web_tooltip">
+ Bu konumda Web içeriği var
+ </tooltip>
+ <playtip name="web_playtip">
+ Web içeriğini göster
+ </playtip>
+ </widgetset>
+ <widgetset name="movie">
+ <label name="movie_label">
+ Film
+ </label>
+ <tooltip name="movie_tooltip">
+ Burada oynatılacak bir film var
+ </tooltip>
+ <playtip name="movie_playtip">
+ Filmi oynat
+ </playtip>
+ </widgetset>
+ <widgetset name="image">
+ <label name="image_label">
+ Görüntü
+ </label>
+ <tooltip name="image_tooltip">
+ Bu konumda bir görüntü var
+ </tooltip>
+ <playtip name="image_playtip">
+ Bu konumdaki görüntüyü göster
+ </playtip>
+ </widgetset>
+ <widgetset name="audio">
+ <label name="audio_label">
+ Ses
+ </label>
+ <tooltip name="audio_tooltip">
+ Bu konumda ses var
+ </tooltip>
+ <playtip name="audio_playtip">
+ Bu konumdaki sesi çal
+ </playtip>
+ </widgetset>
+ <scheme name="rtsp">
+ <label name="rtsp_label">
+ Gerçek Zamanlı Akış
+ </label>
+ </scheme>
+ <mimetype name="blank">
+ <label name="blank_label">
+ - Hiçbiri -
+ </label>
+ </mimetype>
+ <mimetype name="none/none">
+ <label name="none/none_label">
+ - Hiçbiri -
+ </label>
+ </mimetype>
+ <mimetype name="audio/*">
+ <label name="audio2_label">
+ Ses
+ </label>
+ </mimetype>
+ <mimetype name="video/*">
+ <label name="video2_label">
+ Video
+ </label>
+ </mimetype>
+ <mimetype name="image/*">
+ <label name="image2_label">
+ Görüntü
+ </label>
+ </mimetype>
+ <mimetype name="video/vnd.secondlife.qt.legacy">
+ <label name="vnd.secondlife.qt.legacy_label">
+ Film (QuickTime)
+ </label>
+ </mimetype>
+ <mimetype name="application/javascript">
+ <label name="application/javascript_label">
+ Javascript
+ </label>
+ </mimetype>
+ <mimetype name="application/ogg">
+ <label name="application/ogg_label">
+ Ogg Ses/Video
+ </label>
+ </mimetype>
+ <mimetype name="application/pdf">
+ <label name="application/pdf_label">
+ PDF Belgesi
+ </label>
+ </mimetype>
+ <mimetype name="application/postscript">
+ <label name="application/postscript_label">
+ Postscript Belgesi
+ </label>
+ </mimetype>
+ <mimetype name="application/rtf">
+ <label name="application/rtf_label">
+ Zengin Metin (RTF)
+ </label>
+ </mimetype>
+ <mimetype name="application/smil">
+ <label name="application/smil_label">
+ Eşzamanlı Multimedya Tümleştirme Dili (SMIL)
+ </label>
+ </mimetype>
+ <mimetype name="application/xhtml+xml">
+ <label name="application/xhtml+xml_label">
+ Web Sayfası (XHTML)
+ </label>
+ </mimetype>
+ <mimetype name="application/x-director">
+ <label name="application/x-director_label">
+ Macromedia Director
+ </label>
+ </mimetype>
+ <mimetype name="audio/mid">
+ <label name="audio/mid_label">
+ Ses (MIDI)
+ </label>
+ </mimetype>
+ <mimetype name="audio/mpeg">
+ <label name="audio/mpeg_label">
+ Ses (MP3)
+ </label>
+ </mimetype>
+ <mimetype name="audio/x-aiff">
+ <label name="audio/x-aiff_label">
+ Ses (AIFF)
+ </label>
+ </mimetype>
+ <mimetype name="audio/x-wav">
+ <label name="audio/x-wav_label">
+ Ses (WAV)
+ </label>
+ </mimetype>
+ <mimetype name="image/bmp">
+ <label name="image/bmp_label">
+ Görüntü (BMP)
+ </label>
+ </mimetype>
+ <mimetype name="image/gif">
+ <label name="image/gif_label">
+ Görüntü (GIF)
+ </label>
+ </mimetype>
+ <mimetype name="image/jpeg">
+ <label name="image/jpeg_label">
+ Görüntü (JPEG)
+ </label>
+ </mimetype>
+ <mimetype name="image/png">
+ <label name="image/png_label">
+ Görüntü (PNG)
+ </label>
+ </mimetype>
+ <mimetype name="image/svg+xml">
+ <label name="image/svg+xml_label">
+ Görüntü (SVG)
+ </label>
+ </mimetype>
+ <mimetype name="image/tiff">
+ <label name="image/tiff_label">
+ Görüntü (TIFF)
+ </label>
+ </mimetype>
+ <mimetype name="text/html">
+ <label name="text/html_label">
+ Web Sayfası
+ </label>
+ </mimetype>
+ <mimetype name="text/plain">
+ <label name="text/plain_label">
+ Metin
+ </label>
+ </mimetype>
+ <mimetype name="text/xml">
+ <label name="text/xml_label">
+ XML
+ </label>
+ </mimetype>
+ <mimetype name="video/mpeg">
+ <label name="video/mpeg_label">
+ Film (MPEG)
+ </label>
+ </mimetype>
+ <mimetype name="video/mp4">
+ <label name="video/mp4_label">
+ Film (MP4)
+ </label>
+ </mimetype>
+ <mimetype name="video/quicktime">
+ <label name="video/quicktime_label">
+ Film (QuickTime)
+ </label>
+ </mimetype>
+ <mimetype name="video/x-ms-asf">
+ <label name="video/x-ms-asf_label">
+ Film (Windows Media ASF)
+ </label>
+ </mimetype>
+ <mimetype name="video/x-ms-wmv">
+ <label name="video/x-ms-wmv_label">
+ Film (Windows Media WMV)
+ </label>
+ </mimetype>
+ <mimetype name="video/x-msvideo">
+ <label name="video/x-msvideo_label">
+ Film (AVI)
+ </label>
+ </mimetype>
+</mimetypes>
diff --git a/indra/newview/skins/default/xui/tr/mime_types_mac.xml b/indra/newview/skins/default/xui/tr/mime_types_mac.xml
new file mode 100644
index 0000000000..c37f872a65
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/mime_types_mac.xml
@@ -0,0 +1,217 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<mimetypes name="default">
+ <widgetset name="web">
+ <label name="web_label">
+ Web İçeriği
+ </label>
+ <tooltip name="web_tooltip">
+ Bu konumda Web içeriği var
+ </tooltip>
+ <playtip name="web_playtip">
+ Web içeriğini göster
+ </playtip>
+ </widgetset>
+ <widgetset name="movie">
+ <label name="movie_label">
+ Film
+ </label>
+ <tooltip name="movie_tooltip">
+ Burada oynatılacak bir film var
+ </tooltip>
+ <playtip name="movie_playtip">
+ Filmi oynat
+ </playtip>
+ </widgetset>
+ <widgetset name="image">
+ <label name="image_label">
+ Görüntü
+ </label>
+ <tooltip name="image_tooltip">
+ Bu konumda bir görüntü var
+ </tooltip>
+ <playtip name="image_playtip">
+ Bu konumdaki görüntüyü göster
+ </playtip>
+ </widgetset>
+ <widgetset name="audio">
+ <label name="audio_label">
+ Ses
+ </label>
+ <tooltip name="audio_tooltip">
+ Bu konumda ses var
+ </tooltip>
+ <playtip name="audio_playtip">
+ Bu konumdaki sesi çal
+ </playtip>
+ </widgetset>
+ <scheme name="rtsp">
+ <label name="rtsp_label">
+ Gerçek Zamanlı Akış
+ </label>
+ </scheme>
+ <mimetype name="blank">
+ <label name="blank_label">
+ - Hiçbiri -
+ </label>
+ </mimetype>
+ <mimetype name="none/none">
+ <label name="none/none_label">
+ - Hiçbiri -
+ </label>
+ </mimetype>
+ <mimetype name="audio/*">
+ <label name="audio2_label">
+ Ses
+ </label>
+ </mimetype>
+ <mimetype name="video/*">
+ <label name="video2_label">
+ Video
+ </label>
+ </mimetype>
+ <mimetype name="image/*">
+ <label name="image2_label">
+ Görüntü
+ </label>
+ </mimetype>
+ <mimetype name="video/vnd.secondlife.qt.legacy">
+ <label name="vnd.secondlife.qt.legacy_label">
+ Film (QuickTime)
+ </label>
+ </mimetype>
+ <mimetype name="application/javascript">
+ <label name="application/javascript_label">
+ Javascript
+ </label>
+ </mimetype>
+ <mimetype name="application/ogg">
+ <label name="application/ogg_label">
+ Ogg Ses/Video
+ </label>
+ </mimetype>
+ <mimetype name="application/pdf">
+ <label name="application/pdf_label">
+ PDF Belgesi
+ </label>
+ </mimetype>
+ <mimetype name="application/postscript">
+ <label name="application/postscript_label">
+ Postscript Belgesi
+ </label>
+ </mimetype>
+ <mimetype name="application/rtf">
+ <label name="application/rtf_label">
+ Zengin Metin (RTF)
+ </label>
+ </mimetype>
+ <mimetype name="application/smil">
+ <label name="application/smil_label">
+ Eşzamanlı Multimedya Tümleştirme Dili (SMIL)
+ </label>
+ </mimetype>
+ <mimetype name="application/xhtml+xml">
+ <label name="application/xhtml+xml_label">
+ Web Sayfası (XHTML)
+ </label>
+ </mimetype>
+ <mimetype name="application/x-director">
+ <label name="application/x-director_label">
+ Macromedia Director
+ </label>
+ </mimetype>
+ <mimetype name="audio/mid">
+ <label name="audio/mid_label">
+ Ses (MIDI)
+ </label>
+ </mimetype>
+ <mimetype name="audio/mpeg">
+ <label name="audio/mpeg_label">
+ Ses (MP3)
+ </label>
+ </mimetype>
+ <mimetype name="audio/x-aiff">
+ <label name="audio/x-aiff_label">
+ Ses (AIFF)
+ </label>
+ </mimetype>
+ <mimetype name="audio/x-wav">
+ <label name="audio/x-wav_label">
+ Ses (WAV)
+ </label>
+ </mimetype>
+ <mimetype name="image/bmp">
+ <label name="image/bmp_label">
+ Görüntü (BMP)
+ </label>
+ </mimetype>
+ <mimetype name="image/gif">
+ <label name="image/gif_label">
+ Görüntü (GIF)
+ </label>
+ </mimetype>
+ <mimetype name="image/jpeg">
+ <label name="image/jpeg_label">
+ Görüntü (JPEG)
+ </label>
+ </mimetype>
+ <mimetype name="image/png">
+ <label name="image/png_label">
+ Görüntü (PNG)
+ </label>
+ </mimetype>
+ <mimetype name="image/svg+xml">
+ <label name="image/svg+xml_label">
+ Görüntü (SVG)
+ </label>
+ </mimetype>
+ <mimetype name="image/tiff">
+ <label name="image/tiff_label">
+ Görüntü (TIFF)
+ </label>
+ </mimetype>
+ <mimetype name="text/html">
+ <label name="text/html_label">
+ Web Sayfası
+ </label>
+ </mimetype>
+ <mimetype name="text/plain">
+ <label name="text/plain_label">
+ Metin
+ </label>
+ </mimetype>
+ <mimetype name="text/xml">
+ <label name="text/xml_label">
+ XML
+ </label>
+ </mimetype>
+ <mimetype name="video/mpeg">
+ <label name="video/mpeg_label">
+ Film (MPEG)
+ </label>
+ </mimetype>
+ <mimetype name="video/mp4">
+ <label name="video/mp4_label">
+ Film (MP4)
+ </label>
+ </mimetype>
+ <mimetype name="video/quicktime">
+ <label name="video/quicktime_label">
+ Film (QuickTime)
+ </label>
+ </mimetype>
+ <mimetype name="video/x-ms-asf">
+ <label name="video/x-ms-asf_label">
+ Film (Windows Media ASF)
+ </label>
+ </mimetype>
+ <mimetype name="video/x-ms-wmv">
+ <label name="video/x-ms-wmv_label">
+ Film (Windows Media WMV)
+ </label>
+ </mimetype>
+ <mimetype name="video/x-msvideo">
+ <label name="video/x-msvideo_label">
+ Film (AVI)
+ </label>
+ </mimetype>
+</mimetypes>
diff --git a/indra/newview/skins/default/xui/tr/notifications.xml b/indra/newview/skins/default/xui/tr/notifications.xml
new file mode 100644
index 0000000000..631634aa7d
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/notifications.xml
@@ -0,0 +1,3092 @@
+<?xml version="1.0" encoding="utf-8"?>
+<notifications>
+ <global name="skipnexttime">
+ Bunu bir daha gösterme
+ </global>
+ <global name="alwayschoose">
+ Her zaman bu seçeneği seç
+ </global>
+ <global name="implicitclosebutton">
+ Kapat
+ </global>
+ <template name="okbutton">
+ <form>
+ <button name="OK_okbutton" text="$yestext"/>
+ </form>
+ </template>
+ <template name="okignore">
+ <form>
+ <button name="OK_okignore" text="$yestext"/>
+ </form>
+ </template>
+ <template name="okcancelbuttons">
+ <form>
+ <button name="OK_okcancelbuttons" text="$yestext"/>
+ <button name="Cancel_okcancelbuttons" text="$notext"/>
+ </form>
+ </template>
+ <template name="okcancelignore">
+ <form>
+ <button name="OK_okcancelignore" text="$yestext"/>
+ <button name="Cancel_okcancelignore" text="$notext"/>
+ </form>
+ </template>
+ <template name="okhelpbuttons">
+ <form>
+ <button name="OK_okhelpbuttons" text="$yestext"/>
+ <button name="Help" text="$helptext"/>
+ </form>
+ </template>
+ <template name="yesnocancelbuttons">
+ <form>
+ <button name="Yes" text="$yestext"/>
+ <button name="No" text="$notext"/>
+ <button name="Cancel_yesnocancelbuttons" text="$canceltext"/>
+ </form>
+ </template>
+ <notification label="Bilinmeyen Bildirim İletisi" name="MissingAlert">
+ [APP_NAME] sürümünüz alınan bildirimi nasıl görüntüleyeceğini bilmiyor. Lütfen Görüntüleyicinin en son sürümünü yüklemiş olduğunuzdan emin olun.
+
+Hata ayrıntıları: &apos;[_NAME]&apos; adlı bildirim notifications.xml içinde bulunamadı.
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
+ <notification name="FloaterNotFound">
+ Gezdirici hatası: Aşağıdaki denetimler bulunamadı:
+
+[CONTROLS]
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
+ <notification name="TutorialNotFound">
+ Şu an için kullanılabilir bir öğretici mevcut değil.
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
+ <notification name="GenericAlert">
+ [MESSAGE]
+ </notification>
+ <notification name="GenericAlertYesCancel">
+ [MESSAGE]
+ <usetemplate name="okcancelbuttons" notext="İptal" yestext="Evet"/>
+ </notification>
+ <notification name="BadInstallation">
+ [APP_NAME] güncellenirken bir hata oluştu. Lütfen Görüntüleyici&apos;nin [http://get.secondlife.com son sürümünü karşıdan yükleyin].
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
+ <notification name="LoginFailedNoNetwork">
+ [SECOND_LIFE_GRID] ile bağlantı kurulamadı.
+ &apos;[DIAGNOSTIC]&apos;
+İnternet bağlantınızın düzgün çalıştığından emin olun.
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
+ <notification name="MessageTemplateNotFound">
+ İleti şablonu [PATH] bulunamadı.
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
+ <notification name="WearableSave">
+ Geçerli giysi/vücut bölümünde yapılan değişiklikler kaydedilsin mi?
+ <usetemplate canceltext="İptal" name="yesnocancelbuttons" notext="Kaydetme" yestext="Kaydet"/>
+ </notification>
+ <notification name="ConfirmNoCopyToOutbox">
+ Bu öğeyi Pazaryeri Giden Kutunuza kopyalama izniniz yok. Aşağıdaki öğeyi taşımak istediğinize emin misiniz?
+ [ITEM_NAME]
+ <usetemplate name="okcancelbuttons" notext="Hayır" yestext="Evet"/>
+ </notification>
+ <notification name="OutboxUploadComplete">
+ Pazaryerinin karşıya yüklenmesi tamamlandı.
+ <usetemplate name="okbutton" yestext="Yaşasın!"/>
+ </notification>
+ <notification name="OutboxUploadHadErrors">
+ Pazaryerinin karşıya yüklenmesi hatalarla tamamlandı! Lütfen giden kutunuzdaki sorunları düzeltin ve tekrar deneyin. Teşekkürler.
+ <usetemplate name="okbutton" yestext="Yuh!"/>
+ </notification>
+ <notification name="CompileQueueSaveText">
+ Aşağıdaki nedenden dolayı, bir komut dosyası için metin karşıya yüklenirken bir sorun oluştu: [REASON]. Lütfen daha sonra tekrar deneyin.
+ </notification>
+ <notification name="CompileQueueSaveBytecode">
+ Aşağıdaki nedenden dolayı, derlenen komut dosyası karşıya yüklenirken bir sorun oluştu: [REASON]. Lütfen daha sonra tekrar deneyin.
+ </notification>
+ <notification name="WriteAnimationFail">
+ Animasyon verileri yazılırken bir sorun oluştu. Lütfen daha sonra tekrar deneyin.
+ </notification>
+ <notification name="UploadAuctionSnapshotFail">
+ Aşağıdaki nedenden dolayı, açık arttırma anlık görüntüsü karşıya yüklenirken bir sorun oluştu: [REASON]
+ </notification>
+ <notification name="UnableToViewContentsMoreThanOne">
+ Aynı anda birden fazla öğenin içeriği görüntülenemiyor.
+Lütfen sadece bir nesne seçin ve tekrar deneyin.
+ </notification>
+ <notification name="SaveClothingBodyChanges">
+ Giysi/vücut bölümlerinde yapılan tüm değişiklikler kaydedilsin mi?
+ <usetemplate canceltext="İptal" name="yesnocancelbuttons" notext="Kaydetme" yestext="Tümünü Kaydet"/>
+ </notification>
+ <notification name="FriendsAndGroupsOnly">
+ Arkadaşınız olmayan kişiler onların çağrılarını ve anlık iletilerini yok saydığınızı bilmeyecek.
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
+ <notification name="FavoritesOnLogin">
+ Not: Bu seçeneği etkinleştirdiğinizde, bu bilgisayarı kullanan herkes en sevdiğiniz konumlar listenizi görebilecek.
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
+ <notification name="GrantModifyRights">
+ Başka bir Sakine değişiklik yapma hakkı verdiğinizde, SL dünyasında sahip olduğunuz HERHANGİ BİR nesneyi değiştirebilme, silebilme veya alabilmelerine izin vermiş olursunuz. Bu izni verirken ÇOK dikkatli olun.
+[NAME] adlı kişiye değişiklik yapma hakkı vermek istiyor musunuz?
+ <usetemplate name="okcancelbuttons" notext="Hayır" yestext="Evet"/>
+ </notification>
+ <notification name="GrantModifyRightsMultiple">
+ Başka bir Sakine değişiklik yapma hakkı verdiğinizde, SL dünyasında sahip olduğunuz HERHANGİ BİR nesneyi değiştirebilmelerine izin vermiş olursunuz. Bu izni verirken ÇOK dikkatli olun.
+Seçili Sakinlere değişiklik yapma hakkı vermek istiyor musunuz?
+ <usetemplate name="okcancelbuttons" notext="Hayır" yestext="Evet"/>
+ </notification>
+ <notification name="RevokeModifyRights">
+ [NAME] adlı kişinin değişiklik yapma hakkını iptal etmek istiyor musunuz?
+ <usetemplate name="okcancelbuttons" notext="Hayır" yestext="Evet"/>
+ </notification>
+ <notification name="RevokeModifyRightsMultiple">
+ Seçili Sakinlerin değişiklik yapma hakkını iptal etmek istiyor musunuz?
+ <usetemplate name="okcancelbuttons" notext="Hayır" yestext="Evet"/>
+ </notification>
+ <notification name="UnableToCreateGroup">
+ Grup oluşturulamıyor.
+[MESSAGE]
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
+ <notification name="PanelGroupApply">
+ [NEEDS_APPLY_MESSAGE]
+[WANT_APPLY_MESSAGE]
+ <usetemplate canceltext="İptal" name="yesnocancelbuttons" notext="Değişiklikleri Yok Say" yestext="Değişiklikleri Uygula"/>
+ </notification>
+ <notification name="MustSpecifyGroupNoticeSubject">
+ Grup notu göndermek için bir konu belirtmelisiniz.
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
+ <notification name="AddGroupOwnerWarning">
+ Grup üyelerini [ROLE_NAME] rolüne eklemek üzeresiniz.
+Üyeler bu rolden çıkarılamaz.
+Üyeler rolden kendi istekleriyle ayrılabilir.
+Devam etmek istediÄŸinize emin misiniz?
+ <usetemplate ignoretext="Yeni bir grup Sahibi eklemeden önce doğrulama iste" name="okcancelignore" notext="Hayır" yestext="Evet"/>
+ </notification>
+ <notification name="AssignDangerousActionWarning">
+ [ROLE_NAME] rolüne &apos;[ACTION_NAME]&apos; Yeteneğini eklemek üzeresiniz.
+
+ *UYARI*
+ Bu Yeteneğe sahip olan bir Roldeki herhangi bir Üye kendisini -- ve istediği diğer üyeleri -- şu anda sahip olduklarından daha fazla güce sahip olan Rollere atayabilir, kendi güçlerini Grup Sahibininkine yakın bir güce yükseltebilir. Bu Yeteneği atamadan önce ne yaptığınızı bildiğinizden emin olun.
+
+Bu Yetenek &apos;[ROLE_NAME]&apos; rolüne eklensin mi?
+ <usetemplate name="okcancelbuttons" notext="Hayır" yestext="Evet"/>
+ </notification>
+ <notification name="AssignDangerousAbilityWarning">
+ [ROLE_NAME] rolüne &apos;[ACTION_NAME]&apos; Yeteneğini eklemek üzeresiniz.
+
+ *UYARI*
+ Bu Yeteneğe sahip olan bir Roldeki herhangi bir Üye kendisine -- ve istediği diğer üyelere -- tüm Yetenekleri atayabilir, kendi güçlerini Grup Sahibininkine yakın bir güce yükseltebilir.
+
+Bu Yetenek &apos;[ROLE_NAME]&apos; rolüne eklensin mi?
+ <usetemplate name="okcancelbuttons" notext="Hayır" yestext="Evet"/>
+ </notification>
+ <notification name="AttachmentDrop">
+ Aksesuarınızı çıkarmak üzeresiniz.
+ Devam etmek istediÄŸinize emin misiniz?
+ <usetemplate ignoretext="Aksesuarları çıkarmadan önce doğrulama iste" name="okcancelignore" notext="Hayır" yestext="Evet"/>
+ </notification>
+ <notification name="JoinGroupCanAfford">
+ Bu gruba katılmanın maliyeti: L$ [COST].
+Devam etmek istiyor musunuz?
+ <usetemplate name="okcancelbuttons" notext="İptal Et" yestext="Katıl"/>
+ </notification>
+ <notification name="JoinGroupNoCost">
+ [NAME] grubuna katılıyorsunuz.
+Devam etmek istiyor musunuz?
+ <usetemplate name="okcancelbuttons" notext="İptal Et" yestext="Katıl"/>
+ </notification>
+ <notification name="JoinGroupCannotAfford">
+ Bu gruba katılmanın maliyeti: L$ [COST].
+Bu gruba katılmak için yeterli L$&apos;na sahip değilsiniz.
+ </notification>
+ <notification name="CreateGroupCost">
+ Bu grubu oluşturmanın maliyeti: L$ 100.
+Grupların birden fazla üyeye sahip olması gereklidir, aksi takdirde grup kalıcı olarak silinir.
+Lütfen 48 saat içinde diğer üyeleri davet edin.
+ <usetemplate canceltext="İptal" name="okcancelbuttons" notext="İptal" yestext="L$ 100 ödeyerek grubu oluştur"/>
+ </notification>
+ <notification name="LandBuyPass">
+ L$ [COST] ödeyerek (&apos;[PARCEL_NAME]&apos;) arazisine [TIME] saat süreyle girebilirsiniz. Giriş hakkı satın almak istiyor musunuz?
+ <usetemplate name="okcancelbuttons" notext="İptal" yestext="Tamam"/>
+ </notification>
+ <notification name="SalePriceRestriction">
+ Herhangi birine satış yaparken satış fiyatı L$ 0&apos;dan daha yüksek bir değere ayarlanmalıdır.
+L$ 0 fiyatla satış yapıyorsanız lütfen satışın yapılacağı kişiyi seçin.
+ </notification>
+ <notification name="ConfirmLandSaleChange">
+ Seçili [LAND_SIZE] m² arazi satışa çıkarılmak üzere ayarlanıyor.
+Satış fiyatınız L$ [SALE_PRICE] olacak ve [NAME] için satışa açık olacaktır.
+ <usetemplate name="okcancelbuttons" notext="İptal" yestext="Tamam"/>
+ </notification>
+ <notification name="ConfirmLandSaleToAnyoneChange">
+ DİKKAT: &apos;Herkes için satışa açık&apos; seçeneğinin tıklanması, arazinizi tüm [SECOND_LIFE] topluluğuna açık hale getirir, bu bölgede bulunmayanlar da buna dahildir.
+
+Seçili [LAND_SIZE] m² arazi satışa çıkarılmak üzere ayarlanıyor.
+Satış fiyatınız L$ [SALE_PRICE] olacak ve [NAME] için satışa açık olacaktır.
+ <usetemplate name="okcancelbuttons" notext="İptal" yestext="Tamam"/>
+ </notification>
+ <notification name="ReturnObjectsDeededToGroup">
+ &apos;[NAME]&apos; grubuyla bu arazi parseli üzerinde paylaşılan tüm nesneleri önceki sahiplerinin envanterine iade etmek istediğinize emin misiniz?
+
+*UYARI* Bu eylem, gruba devredilen nesnelerden aktarılması mümkün olmayanları silecektir!
+
+Nesneler: [N]
+ <usetemplate name="okcancelbuttons" notext="İptal" yestext="Tamam"/>
+ </notification>
+ <notification name="ReturnObjectsOwnedByUser">
+ &apos;[NAME]&apos; adlı Sakinin bu arazi parseli üzerinde sahip olduğu tüm nesneleri envanterlerine iade etmek istediğinize emin misiniz?
+
+Nesneler: [N]
+ <usetemplate name="okcancelbuttons" notext="İptal" yestext="Tamam"/>
+ </notification>
+ <notification name="ReturnObjectsOwnedBySelf">
+ Bu arazi parseli üzerinde sahip olduğunuz tüm nesneleri envanterinize iade etmek istediğinize emin misiniz?
+
+Nesneler: [N]
+ <usetemplate name="okcancelbuttons" notext="İptal" yestext="Tamam"/>
+ </notification>
+ <notification name="ReturnObjectsNotOwnedBySelf">
+ Bu arazi parseli üzerinde sizin sahip OLMADIĞINIZ tüm nesneleri kendi sahiplerinin envanterlerine iade etmek istediğinize emin misiniz?
+Bir gruba devredilen nesnelerden aktarılması mümkün olanlar önceki sahiplerine iade edilecektir.
+
+*UYARI* Bu eylem, gruba devredilen nesnelerden aktarılması mümkün olmayanları silecektir!
+
+Nesneler: [N]
+ <usetemplate name="okcancelbuttons" notext="İptal" yestext="Tamam"/>
+ </notification>
+ <notification name="ReturnObjectsNotOwnedByUser">
+ Bu arazi parseli üzerinde [NAME] adlı kişinin sahip OLMADIĞI tüm nesneleri kendi sahiplerinin envanterlerine iade etmek istediğinize emin misiniz?
+Bir gruba devredilen nesnelerden aktarılması mümkün olanlar önceki sahiplerine iade edilecektir.
+
+*UYARI* Bu eylem, gruba devredilen nesnelerden aktarılması mümkün olmayanları silecektir!
+
+Nesneler: [N]
+ <usetemplate name="okcancelbuttons" notext="İptal" yestext="Tamam"/>
+ </notification>
+ <notification name="ReturnAllTopObjects">
+ Listelenen tüm nesneleri kendi sahiplerinin envanterlerine iade etmek istediğinize emin misiniz?
+ <usetemplate name="okcancelbuttons" notext="İptal" yestext="Tamam"/>
+ </notification>
+ <notification name="DisableAllTopObjects">
+ Bu bölgedeki tüm nesneleri devre dışı bırakmak istediğinize emin misiniz?
+ <usetemplate name="okcancelbuttons" notext="İptal" yestext="Tamam"/>
+ </notification>
+ <notification name="ReturnObjectsNotOwnedByGroup">
+ Bu arazi parseli üzerinde [NAME] grubuyla PAYLAŞILMAYAN nesneler sahiplerinin envanterine iade edilsin mi?
+
+Nesneler: [N]
+ <usetemplate name="okcancelbuttons" notext="İptal" yestext="Tamam"/>
+ </notification>
+ <notification name="UnableToDisableOutsideScripts">
+ Komut dosyaları devre dışı bırakılamıyor.
+Bu bölgenin tamamında hasar özelliği etkin.
+Silahların işlemesi için komut dosyalarının çalışmasına izin verilmelidir.
+ </notification>
+ <notification name="MultipleFacesSelected">
+ Şu anda birden fazla yüz seçili.
+Bu eyleme devam ederseniz, nesnenin birden fazla yüzünde ayrı ortam örnekleri ayarlanacak.
+Ortamı sadece bir yüze yerleştirmek için, Yüz Seç&apos;i seçin ve ardından nesnenin istenen yüzünü tıklayıp Ekle&apos;yi tıklatın.
+ <usetemplate ignoretext="Ortam, seçilen birden fazla yüz üzerinde ayarlanacak" name="okcancelignore" notext="İptal" yestext="Tamam"/>
+ </notification>
+ <notification name="MustBeInParcel">
+ İniş Noktasını ayarlamak için arazi parselinin içinde duruyor olmalısınız.
+ </notification>
+ <notification name="PromptRecipientEmail">
+ Lütfen alıcı(lar) için geçerli bir e-posta adresi girin.
+ </notification>
+ <notification name="PromptSelfEmail">
+ Lütfen e-posta adresinizi girin.
+ </notification>
+ <notification name="PromptMissingSubjMsg">
+ Anlık görüntü varsayılan konu ya da iletiyle gönderilsin mi?
+ <usetemplate name="okcancelbuttons" notext="İptal" yestext="Tamam"/>
+ </notification>
+ <notification name="ErrorProcessingSnapshot">
+ Anlık görüntü verileri işlenirken hata oluştu
+ </notification>
+ <notification name="ErrorEncodingSnapshot">
+ Anlık görüntü kodlanırken hata oluştu.
+ </notification>
+ <notification name="ErrorUploadingPostcard">
+ Aşağıdaki nedenden dolayı, anlık görüntü gönderilirken bir sorun oluştu: [REASON]
+ </notification>
+ <notification name="ErrorUploadingReportScreenshot">
+ Aşağıdaki nedenden dolayı, bir raporun ekran görüntüsü karşıya yüklenirken bir sorun oluştu: [REASON]
+ </notification>
+ <notification name="MustAgreeToLogIn">
+ [SECOND_LIFE]&apos;ta oturum açmaya devam etmek için Hizmet Sözleşmesi&apos;ni kabul etmelisiniz.
+ </notification>
+ <notification name="CouldNotPutOnOutfit">
+ Dış görünüm eklenemedi.
+Dış görünüm klasöründe hiç giysi, vücut bölümü ya da aksesuar yok.
+ </notification>
+ <notification name="CannotWearTrash">
+ Çöp kutusundaki giysileri veya vücut bölümlerini kullanamazsınız.
+ </notification>
+ <notification name="MaxAttachmentsOnOutfit">
+ Nesne eklenemedi.
+[MAX_ATTACHMENTS] nesnelik aksesuar sınırı aşıldı. Lütfen önce başka bir nesneyi çıkarın.
+ </notification>
+ <notification name="CannotWearInfoNotComplete">
+ Bu öğe henüz yüklenmediği için kullanamazsınız. Lütfen bir dakika sonra tekrar deneyin.
+ </notification>
+ <notification name="MustHaveAccountToLogIn">
+ Hata! Boş bırakılan alan(lar) var.
+Avatarınızın Kullanıcı adını girmeniz gerekmektedir.
+
+[SECOND_LIFE]&apos;a giriş yapmak için bir hesabınız olması gerekir. Şimdi bir hesap oluşturmak ister misiniz?
+ <url name="url">
+ http://join.secondlife.com/
+ </url>
+ <usetemplate name="okcancelbuttons" notext="Tekrar dene" yestext="Yeni bir hesap oluÅŸtur"/>
+ </notification>
+ <notification name="InvalidCredentialFormat">
+ Kullanıcı adı alanına Avatarınızın Kullanıcı adını ya da Ad ve Soyadını girmeniz ve yeniden oturum açmanız gerekmektedir.
+ </notification>
+ <notification name="DeleteClassified">
+ &apos;[NAME]&apos; ilanı silinsin mi?
+Ödenen ücretler iade edilmeyecektir.
+ <usetemplate name="okcancelbuttons" notext="İptal" yestext="Tamam"/>
+ </notification>
+ <notification name="DeleteMedia">
+ Bu yüzle ilişkili ortamı silmeyi seçtiniz.
+Devam etmek istediÄŸinize emin misiniz?
+ <usetemplate ignoretext="Bir nesneden ortam silmeden önce doğrulama iste" name="okcancelignore" notext="Hayır" yestext="Evet"/>
+ </notification>
+ <notification name="ClassifiedSave">
+ [NAME] ilanına yapılan değişiklikler kaydedilsin mi?
+ <usetemplate canceltext="İptal" name="yesnocancelbuttons" notext="Kaydetme" yestext="Kaydet"/>
+ </notification>
+ <notification name="ClassifiedInsufficientFunds">
+ İlan oluşturmak için yeterli fon yok.
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
+ <notification name="DeleteAvatarPick">
+ Seçme &lt;nolink&gt;[PICK]&lt;/nolink&gt; silinsin mi?
+ <usetemplate name="okcancelbuttons" notext="İptal" yestext="Tamam"/>
+ </notification>
+ <notification name="DeleteOutfits">
+ Seçili dış görünüm silinsin mi?
+ <usetemplate name="okcancelbuttons" notext="İptal" yestext="Tamam"/>
+ </notification>
+ <notification name="PromptGoToEventsPage">
+ [SECOND_LIFE] etkinlikleri web sayfasına gidilsin mi?
+ <url name="url">
+ http://secondlife.com/events/
+ </url>
+ <usetemplate name="okcancelbuttons" notext="İptal" yestext="Tamam"/>
+ </notification>
+ <notification name="SelectProposalToView">
+ Lütfen görüntülemek için bir teklif seçin.
+ </notification>
+ <notification name="SelectHistoryItemToView">
+ Lütfen görüntülemek için bir geçmiş öğesi seçin.
+ </notification>
+ <notification name="CacheWillClear">
+ Önbellek, [APP_NAME] uygulamasını yeniden başlattıktan sonra temizlenecek.
+ </notification>
+ <notification name="CacheWillBeMoved">
+ Önbellek, [APP_NAME] uygulamasını yeniden başlattıktan sonra taşınacak.
+Not: Bu işlem önbelleği temizleyecek.
+ </notification>
+ <notification name="ChangeConnectionPort">
+ Port ayarları, [APP_NAME] uygulamasını yeniden başlattıktan sonra geçerli olur.
+ </notification>
+ <notification name="ChangeSkin">
+ Yeni dış katman [APP_NAME] uygulamasını yeniden başlattıktan sonra görüntülenecek.
+ </notification>
+ <notification name="ChangeLanguage">
+ Dil değişikliği, [APP_NAME] uygulamasını yeniden başlattıktan sonra geçerli olacak.
+ </notification>
+ <notification name="GoToAuctionPage">
+ Açık arttırma detaylarını görmek veya teklif vermek için [SECOND_LIFE] web sayfasına gidilsin mi?
+ <url name="url">
+ http://secondlife.com/auctions/auction-detail.php?id=[AUCTION_ID]
+ </url>
+ <usetemplate name="okcancelbuttons" notext="İptal" yestext="Tamam"/>
+ </notification>
+ <notification name="SaveChanges">
+ DeÄŸiÅŸiklikler Kaydedilsin mi?
+ <usetemplate canceltext="İptal" name="yesnocancelbuttons" notext="Kaydetme" yestext="Kaydet"/>
+ </notification>
+ <notification name="GestureSaveFailedTooManySteps">
+ Mimik kaydedilemedi.
+Bu mimikte çok fazla adım var.
+Bazı adımları çıkarıp yeniden kaydetmeyi deneyin.
+ </notification>
+ <notification name="GestureSaveFailedTryAgain">
+ Mimik kaydedilemedi. Lütfen bir dakika sonra tekrar deneyin.
+ </notification>
+ <notification name="GestureSaveFailedObjectNotFound">
+ Nesne veya ilişkili nesne envanteri bulunamadığı için mimik kaydedilemedi.
+Nesne aralık dışında ya da silinmiş olabilir.
+ </notification>
+ <notification name="GestureSaveFailedReason">
+ Aşağıdaki nedenden dolayı, mimik kaydedilirken bir sorun oluştu: [REASON]. Lütfen mimiği kaydetmeyi daha sonra tekrar deneyin.
+ </notification>
+ <notification name="SaveNotecardFailObjectNotFound">
+ Nesne veya ilişkili nesne envanteri bulunamadığı için not kartı kaydedilemedi.
+Nesne aralık dışında ya da silinmiş olabilir.
+ </notification>
+ <notification name="SaveNotecardFailReason">
+ Aşağıdaki nedenden dolayı, not kartı kaydedilirken bir sorun oluştu: [REASON]. Lütfen not kartını kaydetmeyi daha sonra tekrar deneyin.
+ </notification>
+ <notification name="ScriptCannotUndo">
+ Komut dosyası sürümünüzdeki tüm değişiklikler geri alınamadı.
+Sunucunun son kaydedilmiş sürümünü yüklemek ister misiniz?
+(**Uyarı** Bu işlem geri alınamaz.)
+ <usetemplate name="okcancelbuttons" notext="İptal" yestext="Tamam"/>
+ </notification>
+ <notification name="SaveScriptFailReason">
+ Aşağıdaki nedenden dolayı, komut dosyası kaydedilirken bir sorun oluştu: [REASON]. Lütfen komut dosyasını kaydetmeyi daha sonra tekrar deneyin.
+ </notification>
+ <notification name="SaveScriptFailObjectNotFound">
+ İçinde olduğu nesne bulunamadığından komut dosyası kaydedilemiyor.
+Nesne aralık dışında ya da silinmiş olabilir.
+ </notification>
+ <notification name="SaveBytecodeFailReason">
+ Aşağıdaki nedenden dolayı, derlenen komut dosyası kaydedilirken bir sorun oluştu: [REASON]. Lütfen komut dosyasını kaydetmeyi daha sonra tekrar deneyin.
+ </notification>
+ <notification name="StartRegionEmpty">
+ Hata. Başlangıç Bölgeniz tanımlanmamış.
+Lütfen Başlangıç Konumu kutusuna Bölge adını yazın ya da Son Konumum veya Ana Konumumu Başlangıç Konumu olarak seçin.
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
+ <notification name="CouldNotStartStopScript">
+ Üzerinde bulunduğu nesne bulunamadığından komut dosyası başlatılamadı veya durdurulamadı.
+Nesne aralık dışında ya da silinmiş olabilir.
+ </notification>
+ <notification name="CannotDownloadFile">
+ Dosya karşıdan yüklenemiyor.
+ </notification>
+ <notification name="CannotWriteFile">
+ [[FILE]] dosyası yazılamıyor.
+ </notification>
+ <notification name="UnsupportedHardware">
+ Bilgisayarınızın [APP_NAME] uygulamasının minimum sistem gereksinimlerini karşılamadığını bildirmek durumundayız. Performans düşüklüğü yaşayabilirsiniz. Ne yazık ki, [SUPPORT_SITE] desteklenmeyen sistem yapılandırmaları için teknik destek verememektedir.
+
+Daha fazla bilgi için [_URL] adresini ziyaret etmek ister misiniz?
+ <url name="url">
+ http://www.secondlife.com/corporate/sysreqs.php
+ </url>
+ <usetemplate ignoretext="Bilgisayar donanımım desteklenmiyor" name="okcancelignore" notext="Hayır" yestext="Evet"/>
+ </notification>
+ <notification name="UnknownGPU">
+ Sisteminiz [APP_NAME] uygulamasının tanımadığı bir grafik kartı içeriyor.
+Bu durum genellikle [APP_NAME] uygulaması ile henüz denenmemiş yeni donanımlar kullanıldığında ortaya çıkar. Büyük olasılıkla bir sorun çıkmayacaktır, fakat grafik ayarlarınızı değiştirmeniz gerekebilir.
+(Ben &gt; Tercihler &gt; Grafikler).
+ <form name="form">
+ <ignore name="ignore" text="Grafik kartım tanımlanamadı."/>
+ </form>
+ </notification>
+ <notification name="DisplaySettingsNoShaders">
+ Grafik sürücüleri başlatılırken [APP_NAME] uygulaması kilitlendi.
+Sık görülen bazı sürücü hatalarından kaçınmak için Grafik Kalitesi Düşük olarak ayarlanacak. Bu işlem bazı grafik özelliklerini devre dışı bırakacak.
+Grafik kartı sürücülerinizi güncellemenizi öneririz.
+Grafik Kalitesi, Tercihler &gt; Grafikler sekmesinden yükseltilebilir.
+ </notification>
+ <notification name="RegionNoTerraforming">
+ [REGION] bölgesi yer şekillendirmeye izin vermiyor.
+ </notification>
+ <notification name="CannotCopyWarning">
+ Aşağıdaki öğeleri kopyalamak için gerekli izne sahip değilsiniz:
+[ITEMS]
+Bu öğeleri verdiğiniz takdirde envanterinizden çıkacaklar. Bu öğeleri teklif etmeyi gerçekten istiyor musunuz?
+ <usetemplate name="okcancelbuttons" notext="Hayır" yestext="Evet"/>
+ </notification>
+ <notification name="CannotGiveItem">
+ Envanter öğesi verilemiyor.
+ </notification>
+ <notification name="TransactionCancelled">
+ İşlem iptal edildi.
+ </notification>
+ <notification name="TooManyItems">
+ Tek bir envanter aktarımında 42 öğeden fazlası verilemez.
+ </notification>
+ <notification name="NoItems">
+ Seçili öğeleri aktarmak için gerekli izne sahip değilsiniz.
+ </notification>
+ <notification name="CannotCopyCountItems">
+ Seçili öğelerin [COUNT] tanesini kopyalamak için gerekli izne sahip değilsiniz. Bu öğeler envanterinizden çıkacak.
+Bu öğeleri vermeyi gerçekten istiyor musunuz?
+ <usetemplate name="okcancelbuttons" notext="Hayır" yestext="Evet"/>
+ </notification>
+ <notification name="CannotGiveCategory">
+ Seçili klasörü aktarmak için gerekli izne sahip değilsiniz.
+ </notification>
+ <notification name="FreezeAvatar">
+ Bu avatar dondurulsun mu?
+Avatar geçici bir süre için hareket etme, sohbet etme veya dünya ile etkileşim kurma yeteneğini kullanamayacak.
+ <usetemplate canceltext="İptal" name="yesnocancelbuttons" notext="Çöz" yestext="Dondur"/>
+ </notification>
+ <notification name="FreezeAvatarFullname">
+ [AVATAR_NAME] dondurulsun mu?
+Avatar geçici bir süre için hareket etme, sohbet etme veya dünya ile etkileşim kurma yeteneğini kullanamayacak.
+ <usetemplate canceltext="İptal" name="yesnocancelbuttons" notext="Çöz" yestext="Dondur"/>
+ </notification>
+ <notification name="EjectAvatarFullname">
+ [AVATAR_NAME] arazinizden çıkarılsın mı?
+ <usetemplate canceltext="İptal" name="yesnocancelbuttons" notext="Çıkar ve Yasakla" yestext="Çıkar"/>
+ </notification>
+ <notification name="EjectAvatarNoBan">
+ Bu avatar arazinizden çıkarılsın mı?
+ <usetemplate name="okcancelbuttons" notext="İptal" yestext="Çıkar"/>
+ </notification>
+ <notification name="EjectAvatarFullnameNoBan">
+ [AVATAR_NAME] arazinizden çıkarılsın mı?
+ <usetemplate name="okcancelbuttons" notext="İptal" yestext="Çıkar"/>
+ </notification>
+ <notification name="EjectAvatarFromGroup">
+ [AVATAR_NAME] adlı kişiyi [GROUP_NAME] grubundan çıkardınız
+ </notification>
+ <notification name="AcquireErrorTooManyObjects">
+ ALMA HATASI: Çok fazla nesne seçilmiş.
+ </notification>
+ <notification name="AcquireErrorObjectSpan">
+ ALMA HATASI: Nesneler bir bölgenin kapsamı dışına yayılıyor.
+Lütfen alınacak tüm nesneleri aynı bölgeye taşıyın.
+ </notification>
+ <notification name="PromptGoToCurrencyPage">
+ [EXTRA]
+
+L$ satın alma ile ilgili bilgi edinmek için [_URL] adresine gidilsin mi?
+ <url name="url">
+ http://secondlife.com/app/currency/
+ </url>
+ <usetemplate name="okcancelbuttons" notext="İptal" yestext="Tamam"/>
+ </notification>
+ <notification name="UnableToLinkObjects">
+ Bu [COUNT] nesne birbirine bağlanamıyor.
+En fazla [MAX] nesneyi birbirine baÄŸlayabilirsiniz.
+ </notification>
+ <notification name="CannotLinkIncompleteSet">
+ Sadece tamamlanmış nesne kümelerini birbirine bağlayabilirsiniz ve birden fazla nesne seçmelisiniz.
+ </notification>
+ <notification name="CannotLinkModify">
+ Tüm nesneler üzerinde değişiklik yapma izniniz olmadığı için nesneler birbirine bağlanamıyor.
+
+Lütfen hiçbirinin kilitli olmadığından ve hepsine sahip olduğunuzdan emin olun.
+ </notification>
+ <notification name="CannotLinkDifferentOwners">
+ Nesnelerin hepsinin sahibi aynı olmadığı için nesneler birbirine bağlanamıyor.
+
+Lütfen seçili nesnelerin hepsine sahip olduğunuzdan emin olun.
+ </notification>
+ <notification name="NoFileExtension">
+ Aşağıdaki dosyanın dosya uzantısı yok: &apos;[FILE]&apos;
+
+Lütfen dosyanın doğru bir dosya uzantısına sahip olduğundan emin olun..
+ </notification>
+ <notification name="InvalidFileExtension">
+ Geçersiz dosya uzantısı [EXTENSION]
+Beklenen [VALIDS]
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
+ <notification name="CannotUploadSoundFile">
+ Karşıya yüklenen ses dosyası okuma için açılamadı:
+[FILE]
+ </notification>
+ <notification name="SoundFileNotRIFF">
+ Dosya bir RIFF WAVE dosyası gibi görünmüyor:
+[FILE]
+ </notification>
+ <notification name="SoundFileNotPCM">
+ Dosya bir PCM WAVE ses dosyası gibi görünmüyor:
+[FILE]
+ </notification>
+ <notification name="SoundFileInvalidChannelCount">
+ Dosyada geçersiz sayıda kanal mevcut (mono ya da stereo olmalı):
+[FILE]
+ </notification>
+ <notification name="SoundFileInvalidSampleRate">
+ Dosya desteklenen bir örnek hızına sahip görünmüyor (44.1k olmalı):
+[FILE]
+ </notification>
+ <notification name="SoundFileInvalidWordSize">
+ Dosya desteklenen bir sözcük boyutuna sahip görünmüyor (8 veya 16 bit olmalı):
+[FILE]
+ </notification>
+ <notification name="SoundFileInvalidHeader">
+ WAV başlığında &apos;veri&apos; öbeği bulunamadı:
+[FILE]
+ </notification>
+ <notification name="SoundFileInvalidChunkSize">
+ WAV dosyasında yanlış öbek boyutu:
+[FILE]
+ </notification>
+ <notification name="SoundFileInvalidTooLong">
+ Ses dosyası çok uzun (En fazla 10 saniye olmalı):
+[FILE]
+ </notification>
+ <notification name="ProblemWithFile">
+ [FILE] dosyasında sorun oluştu:
+
+[ERROR]
+ </notification>
+ <notification name="CannotOpenTemporarySoundFile">
+ Geçici sıkıştırılmış ses dosyası yazma için açılamadı: [FILE]
+ </notification>
+ <notification name="UnknownVorbisEncodeFailure">
+ Şu dosyada bilinmeyen Vorbis kodlama arızası: [FILE]
+ </notification>
+ <notification name="CannotEncodeFile">
+ Şu dosya kodlanamıyor: [FILE]
+ </notification>
+ <notification name="CorruptedProtectedDataStore">
+ Kullanıcı adı ve şifre alanlarınızı dolduramıyoruz. Bu durum ağ ayarlarınızı değiştirdiğinizde ortaya çıkabilir.
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
+ <notification name="CorruptResourceFile">
+ Bozuk kaynak dosyası: [FILE]
+ </notification>
+ <notification name="UnknownResourceFileVersion">
+ Şu dosyada bilinmeyen Linden kaynak dosyası sürümü mevcut: [FILE]
+ </notification>
+ <notification name="UnableToCreateOutputFile">
+ Çıkış dosyası oluşturulamıyor: [FILE]
+ </notification>
+ <notification name="DoNotSupportBulkAnimationUpload">
+ [APP_NAME] şu an için animasyon dosyalarının toplu olarak karşıya yüklenmesini desteklemiyor.
+ </notification>
+ <notification name="CannotUploadReason">
+ Aşağıdaki nedenden dolayı [FILE] dosyası karşıya yüklenemedi: [REASON]
+Lütfen daha sonra tekrar deneyin.
+ </notification>
+ <notification name="LandmarkCreated">
+ &quot;[LANDMARK_NAME]&quot; yer imini [FOLDER_NAME] klasörünüze eklediniz.
+ </notification>
+ <notification name="LandmarkAlreadyExists">
+ Bu konum için zaten bir yer iminiz var.
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
+ <notification name="CannotCreateLandmarkNotOwner">
+ Burada bir yer imi oluşturmazsınız, çünkü arazinin sahibi buna izin vermiyor.
+ </notification>
+ <notification name="CannotRecompileSelectObjectsNoScripts">
+ &apos;Yeniden derleme&apos; gerçekleştirilemiyor.
+Komut dosyası içeren bir nesne seçin.
+ </notification>
+ <notification name="CannotRecompileSelectObjectsNoPermission">
+ &apos;Yeniden derleme&apos; gerçekleştirilemiyor.
+
+Değişiklik yapma izniniz olan komut dosyaları içeren nesneler seçin.
+ </notification>
+ <notification name="CannotResetSelectObjectsNoScripts">
+ &apos;Sıfırlama&apos; gerçekleştirilemiyor.
+
+Komut dosyası içeren nesneler seçin.
+ </notification>
+ <notification name="CannotResetSelectObjectsNoPermission">
+ &apos;Sıfırlama&apos; gerçekleştirilemiyor.
+
+Değişiklik yapma izniniz olan komut dosyaları içeren nesneler seçin.
+ </notification>
+ <notification name="CannotOpenScriptObjectNoMod">
+ Değişiklik yapma izniniz olmadığından nesne içindeki komut dosyası açılamıyor.
+ </notification>
+ <notification name="CannotSetRunningSelectObjectsNoScripts">
+ Hiçbir komut dosyası &apos;çalışır&apos; durumuna ayarlanamıyor.
+
+Komut dosyası içeren nesneler seçin.
+ </notification>
+ <notification name="CannotSetRunningNotSelectObjectsNoScripts">
+ Hiçbir komut dosyası &apos;çalışmaz&apos; durumuna ayarlanamıyor.
+
+Komut dosyası içeren nesneler seçin.
+ </notification>
+ <notification name="NoFrontmostFloater">
+ Kaydedilecek en öndeki gezdirici yok.
+ </notification>
+ <notification name="SeachFilteredOnShortWords">
+ Arama sorgunuz değiştirildi ve çok kısa olan sözcükler kaldırıldı.
+
+Arama yapılan sorgu: [FINALQUERY]
+ </notification>
+ <notification name="SeachFilteredOnShortWordsEmpty">
+ Arama terimleriniz çok kısa olduğu için arama yapılmadı.
+ </notification>
+ <notification name="CouldNotTeleportReason">
+ Işınlama başarısız.
+[REASON]
+ </notification>
+ <notification name="invalid_tport">
+ Işınlama talebiniz işlenirken bir sorunla karşılaşıldı. Işınlanabilmek için yeniden oturum açmanız gerekebilir.
+Bu iletiyi almaya devam ederseniz, lütfen [SUPPORT_SITE] bölümüne başvurun.
+ </notification>
+ <notification name="invalid_region_handoff">
+ Bölge değiştirme talebiniz işlenirken sorunla karşılaşıldı. Bölge değiştirmek için yeniden oturum açmanız gerekebilir.
+Bu iletiyi almaya devam ederseniz, lütfen [SUPPORT_SITE] bölümüne başvurun.
+ </notification>
+ <notification name="blocked_tport">
+ Üzgünüz, ışınlama şu anda engellenmiş durumda. Bir dakika sonra tekrar deneyin. Hala ışınlanamıyorsanız, sorunu çözmek için lütfen çıkış yapıp oturumu tekrar açın.
+ </notification>
+ <notification name="nolandmark_tport">
+ Üzgünüz fakat sistem yer imi hedef konumunu bulamadı.
+ </notification>
+ <notification name="timeout_tport">
+ Üzgünüz fakat sistem ışınlama bağlantısını tamamlayamadı. Bir dakika sonra tekrar deneyin.
+ </notification>
+ <notification name="noaccess_tport">
+ Üzgünüz, bu ışınlanma hedef konumuna erişim hakkına sahip değilsiniz.
+ </notification>
+ <notification name="missing_attach_tport">
+ Aksesuarlarınız henüz ulaşmadı. Işınlanmayı tekrar denemeden önce bir kaç saniye bekleyin veya çıkış yapıp oturumu tekrar açın.
+ </notification>
+ <notification name="too_many_uploads_tport">
+ Bu bölgedeki varlık sırası şu anda yoğunluktan dolayı tıkalı olduğu için ışınlanma talebiniz zamanında gerçekleştirilemeyecek. Lütfen bir kaç dakika sonra tekrar deneyin veya yoğunluğu daha az olan bir bölge seçin.
+ </notification>
+ <notification name="expired_tport">
+ Üzgünüz fakat sistem ışınlanma talebinizi zamanında tamamlayamadı. Lütfen bir kaç dakika sonra tekrar deneyin.
+ </notification>
+ <notification name="expired_region_handoff">
+ Üzgünüz fakat sistem bölge değiştirme talebinizi zamanında tamamlayamadı. Lütfen bir kaç dakika sonra tekrar deneyin.
+ </notification>
+ <notification name="no_host">
+ Işınlanma hedef konumu bulunamıyor. Hedef konumu geçici bir süre için kullanılamıyor ya da artık mevcut değil. Lütfen bir kaç dakika sonra tekrar deneyin.
+ </notification>
+ <notification name="no_inventory_host">
+ Envanter sistemi şu anda kullanılamıyor.
+ </notification>
+ <notification name="CannotSetLandOwnerNothingSelected">
+ Arazi sahibi ayarlanamıyor:
+Seçili parsel yok.
+ </notification>
+ <notification name="CannotSetLandOwnerMultipleRegions">
+ Seçim aralığı birden fazla bölgeyi kapsadığından arazi mülkiyeti alınmaya zorlanamıyor. Lütfen daha küçük bir alan seçin ve tekrar deneyin.
+ </notification>
+ <notification name="ForceOwnerAuctionWarning">
+ Bu parsel açık arttırmada. Mülkiyeti almaya zorlama açık arttırmayı iptal edecek ve açık arttırma için teklif verme başlamışsa büyük olasılıkla bazı Sakinleri mutsuz edecek.
+Mülkiyeti almaya zorlanılsın mı?
+ <usetemplate name="okcancelbuttons" notext="İptal" yestext="Tamam"/>
+ </notification>
+ <notification name="CannotContentifyNothingSelected">
+ İçerik eklenemedi:
+Seçili parsel yok.
+ </notification>
+ <notification name="CannotContentifyNoRegion">
+ İçerik eklenemedi:
+Seçili bölge yok.
+ </notification>
+ <notification name="CannotReleaseLandNothingSelected">
+ Arazi mülkiyeti bırakılamıyor:
+Seçili parsel yok.
+ </notification>
+ <notification name="CannotReleaseLandNoRegion">
+ Arazi mülkiyeti bırakılamıyor:
+Bölge bulunamıyor.
+ </notification>
+ <notification name="CannotBuyLandNothingSelected">
+ Arazi satın alınamıyor:
+Seçili parsel yok.
+ </notification>
+ <notification name="CannotBuyLandNoRegion">
+ Arazi satın alınamıyor:
+Arazinin içinde olduğu bölge bulunamıyor.
+ </notification>
+ <notification name="CannotCloseFloaterBuyLand">
+ [APP_NAME] bu işlemin tutarını hesaplamayı bitirmeden Arazi Satın Al penceresini kapatamazsınız.
+ </notification>
+ <notification name="CannotDeedLandNothingSelected">
+ Arazi devredilemiyor:
+Seçili parsel yok.
+ </notification>
+ <notification name="CannotDeedLandNoGroup">
+ Arazi devredilemiyor:
+Seçili Grup yok.
+ </notification>
+ <notification name="CannotDeedLandNoRegion">
+ Arazi devredilemiyor:
+Arazinin içinde olduğu bölge bulunamıyor.
+ </notification>
+ <notification name="CannotDeedLandMultipleSelected">
+ Arazi devredilemiyor:
+Birden fazla parsel seçili.
+
+Tek bir parsel seçmeyi deneyin.
+ </notification>
+ <notification name="CannotDeedLandWaitingForServer">
+ Arazi devredilemiyor:
+Sunucunun mülkiyet bilgisini bildirmesi bekleniyor.
+
+Lütfen tekrar deneyin.
+ </notification>
+ <notification name="CannotDeedLandNoTransfer">
+ Arazi devredilemiyor:
+[REGION] bölgesi arazi aktarımına izin vermiyor.
+ </notification>
+ <notification name="CannotReleaseLandWatingForServer">
+ Arazi mülkiyeti bırakılamıyor:
+Sunucunun parsel bilgilerini güncellemesi bekleniyor.
+
+Bir kaç saniye sonra tekrar deneyin.
+ </notification>
+ <notification name="CannotReleaseLandSelected">
+ Arazi mülkiyeti bırakılamıyor:
+Seçilen tüm parsellere sahip değilsiniz.
+
+Lütfen tek bir parsel seçin.
+ </notification>
+ <notification name="CannotReleaseLandDontOwn">
+ Arazi mülkiyeti bırakılamıyor:
+Bu parseli bırakma izniniz yok.
+Sahip olduğunuz parseller yeşille gösterilmiştir.
+ </notification>
+ <notification name="CannotReleaseLandRegionNotFound">
+ Arazi mülkiyeti bırakılamıyor:
+Arazinin içinde olduğu bölge bulunamıyor.
+ </notification>
+ <notification name="CannotReleaseLandNoTransfer">
+ Arazi mülkiyeti bırakılamıyor:
+[REGION] bölgesi arazi aktarımına izin vermiyor.
+ </notification>
+ <notification name="CannotReleaseLandPartialSelection">
+ Arazi mülkiyeti bırakılamıyor:
+Bırakmak için bir parselin tamamını seçmelisiniz.
+
+Parselin tamamını seçin veya önce parselinizi bölün.
+ </notification>
+ <notification name="ReleaseLandWarning">
+ [AREA] m² araziyi bırakmak üzeresiniz.
+Bu parseli bırakmak onu sahip olduğunuz arazi parçalarından çıkaracak fakat L$ kazandırmayacak.
+
+Arazi bırakılsın mı?
+ <usetemplate name="okcancelbuttons" notext="İptal" yestext="Tamam"/>
+ </notification>
+ <notification name="CannotDivideLandNothingSelected">
+ Arazi bölünemiyor:
+
+Seçili parsel yok.
+ </notification>
+ <notification name="CannotDivideLandPartialSelection">
+ Arazi bölünemiyor:
+
+Parselin tamamını seçtiniz.
+Parselin bir bölümünü seçmeyi deneyin.
+ </notification>
+ <notification name="LandDivideWarning">
+ Bu parseli bölmek parseli iki parçaya ayıracak ve her bir parselin kendi ayarları olacak. İşlemden sonra bazı ayarlar varsayılan durumlarına sıfırlanacak.
+
+Arazi bölünsün mü?
+ <usetemplate name="okcancelbuttons" notext="İptal" yestext="Tamam"/>
+ </notification>
+ <notification name="CannotDivideLandNoRegion">
+ Arazi bölünemiyor:
+Arazinin içinde olduğu bölge bulunamıyor.
+ </notification>
+ <notification name="CannotJoinLandNoRegion">
+ Arazi birleÅŸtirilemiyor:
+Arazinin içinde olduğu bölge bulunamıyor.
+ </notification>
+ <notification name="CannotJoinLandNothingSelected">
+ Arazi birleÅŸtirilemiyor:
+Seçili parsel yok.
+ </notification>
+ <notification name="CannotJoinLandEntireParcelSelected">
+ Arazi birleÅŸtirilemiyor:
+Sadece bir parsel seçtiniz.
+
+Lütfen iki parseldeki araziyi de seçin.
+ </notification>
+ <notification name="CannotJoinLandSelection">
+ Arazi birleÅŸtirilemiyor:
+Birden fazla parseli seçmelisiniz.
+
+Lütfen iki parseldeki araziyi de seçin.
+ </notification>
+ <notification name="JoinLandWarning">
+ Bu araziyi birleştirmek, seçili dikdörtgenle kesişen tüm parsellerden bir büyük parsel oluşturacak.
+Yeni parselin adını ve seçeneklerini yeniden ayarlamanız gerekecektir.
+
+Arazi birleÅŸtirilsin mi?
+ <usetemplate name="okcancelbuttons" notext="İptal" yestext="Tamam"/>
+ </notification>
+ <notification name="ConfirmNotecardSave">
+ Öğe kopyalanmadan veya görüntülenmeden önce bu not kartının kaydedilmesi gerekiyor. Not kartı kaydedilsin mi?
+ <usetemplate name="okcancelbuttons" notext="İptal" yestext="Tamam"/>
+ </notification>
+ <notification name="ConfirmItemCopy">
+ Bu öğe envanterinize kopyalansın mı?
+ <usetemplate name="okcancelbuttons" notext="İptal Et" yestext="Kopyala"/>
+ </notification>
+ <notification name="ResolutionSwitchFail">
+ Çözünürlük [RESX] x [RESY] değerine değiştirilemedi.
+ </notification>
+ <notification name="ErrorUndefinedGrasses">
+ Hata: Tanımlanmamış çimler: [SPECIES]
+ </notification>
+ <notification name="ErrorUndefinedTrees">
+ Hata: Tanımlanmamış ağaçlar: [SPECIES]
+ </notification>
+ <notification name="CannotSaveWearableOutOfSpace">
+ &apos;[NAME]&apos;, giyilebilir öğe dosyasına kaydedilemiyor. Bilgisayarınızda yer açmalı ve giyilebilir öğeyi yeniden kaydetmelisiniz.
+ </notification>
+ <notification name="CannotSaveToAssetStore">
+ [NAME] ana varlık mağazasına kaydedilemedi.
+Bu genellikle geçici bir arızadır. Lütfen giyilebilir öğeyi birkaç dakika sonra yeniden özelleştirip kaydedin.
+ </notification>
+ <notification name="YouHaveBeenLoggedOut">
+ Üzgünüz. [SECOND_LIFE] oturumunuz kapandı.
+ [MESSAGE]
+ <usetemplate name="okcancelbuttons" notext="Çık" yestext="Anlık İleti ve Sohbeti Görüntüle"/>
+ </notification>
+ <notification name="OnlyOfficerCanBuyLand">
+ Grup adına arazi satın alınamıyor:
+Etkin grubunuz adına arazi satın almak için gerekli izne sahip değilsiniz.
+ </notification>
+ <notification label="ArkadaÅŸ Ekle" name="AddFriendWithMessage">
+ Arkadaşlar birbirini harita üzerinde izleme ve çevrimiçi durumları hakkında güncellemeler almak için birbirine izin verebilir.
+
+[NAME] adlı kişiye arkadaşlık teklif edilsin mi?
+ <form name="form">
+ <input name="message">
+ Arkadaşım olur musun?
+ </input>
+ <button name="Offer" text="Tamam"/>
+ <button name="Cancel" text="İptal"/>
+ </form>
+ </notification>
+ <notification label="Dış Görünümü Kaydet" name="SaveOutfitAs">
+ Üzerimdekileri yeni bir Dış Görünüm olarak kaydet:
+ <form name="form">
+ <input name="message">
+ [DESC] (yeni)
+ </input>
+ <button name="OK" text="Tamam"/>
+ <button name="Cancel" text="İptal"/>
+ </form>
+ </notification>
+ <notification label="Giyilebilir Öğeyi Kaydet" name="SaveWearableAs">
+ Öğeyi envanterime farklı kaydet:
+ <form name="form">
+ <input name="message">
+ [DESC] (yeni)
+ </input>
+ <button name="OK" text="Tamam"/>
+ <button name="Cancel" text="İptal"/>
+ </form>
+ </notification>
+ <notification label="Dış Görünümü Yeniden Adlandır" name="RenameOutfit">
+ Yeni dış görünüm adı:
+ <form name="form">
+ <input name="new_name">
+ [NAME]
+ </input>
+ <button name="OK" text="Tamam"/>
+ <button name="Cancel" text="İptal"/>
+ </form>
+ </notification>
+ <notification name="RemoveFromFriends">
+ &lt;nolink&gt;[NAME]&lt;/nolink&gt; adlı kişiyi Arkadaş Listenizden çıkarmak istiyor musunuz?
+ <usetemplate name="okcancelbuttons" notext="İptal" yestext="Tamam"/>
+ </notification>
+ <notification name="RemoveMultipleFromFriends">
+ Birden çok arkadaşınızı Arkadaş Listenizden çıkarmak istiyor musunuz?
+ <usetemplate name="okcancelbuttons" notext="İptal" yestext="Tamam"/>
+ </notification>
+ <notification name="GodDeleteAllScriptedPublicObjectsByUser">
+ Komut dosyası içeren,
+** [AVATAR_NAME] ** adlı kişiye ait tüm nesneleri
+bu simdeki diğer tüm kişilerin arazisinden silmek istediğinize emin misiniz?
+ <usetemplate name="okcancelbuttons" notext="İptal" yestext="Tamam"/>
+ </notification>
+ <notification name="GodDeleteAllScriptedObjectsByUser">
+ Komut dosyası içeren,
+** [AVATAR_NAME] ** adlı kişiye ait TÜM nesneleri
+bu simdeki TÜM ARAZİLERDEN SİLMEK istediğinize emin misiniz?
+ <usetemplate name="okcancelbuttons" notext="İptal" yestext="Tamam"/>
+ </notification>
+ <notification name="GodDeleteAllObjectsByUser">
+ Komut dosyası içeren veya içermeyen,
+** [AVATAR_NAME] ** adlı kişiye ait TÜM nesneleri
+bu simdeki TÜM ARAZİLERDEN SİLMEK istediğinize emin misiniz?
+ <usetemplate name="okcancelbuttons" notext="İptal" yestext="Tamam"/>
+ </notification>
+ <notification name="BlankClassifiedName">
+ İlanınız için bir ad belirtmelisiniz.
+ </notification>
+ <notification name="MinClassifiedPrice">
+ Listeleme için ödenmesi gereken tutar en az L$ [MIN_PRICE] olmalıdır.
+
+Lütfen daha yüksek bir tutar girin.
+ </notification>
+ <notification name="ConfirmItemDeleteHasLinks">
+ Seçtiğiniz öğelerden en az birinin kendisine işaret eden bağlantılı öğeler var. Bu öğeyi silerseniz, bağlantıları kalıcı olarak çalışmaz hale gelecek. Önce bağlantıları silmeniz önemle tavsiye edilir.
+
+Bu öğeleri silmek istediğinize emin misiniz?
+ <usetemplate name="okcancelbuttons" notext="İptal" yestext="Tamam"/>
+ </notification>
+ <notification name="ConfirmObjectDeleteLock">
+ Seçtiğiniz öğelerin en az birisi kilitli.
+
+Bu öğeleri silmek istediğinize emin misiniz?
+ <usetemplate name="okcancelbuttons" notext="İptal" yestext="Tamam"/>
+ </notification>
+ <notification name="ConfirmObjectDeleteNoCopy">
+ Seçtiğiniz öğelerin en az birisi kopyalanamıyor.
+
+Bu öğeleri silmek istediğinize emin misiniz?
+ <usetemplate name="okcancelbuttons" notext="İptal" yestext="Tamam"/>
+ </notification>
+ <notification name="ConfirmObjectDeleteNoOwn">
+ Seçtiğiniz öğelerin en az birisine sahip değilsiniz.
+
+Bu öğeleri silmek istediğinize emin misiniz?
+ <usetemplate name="okcancelbuttons" notext="İptal" yestext="Tamam"/>
+ </notification>
+ <notification name="ConfirmObjectDeleteLockNoCopy">
+ Nesnelerden en az biri kilitli.
+Nesnelerden en az biri kopyalanamıyor.
+
+Bu öğeleri silmek istediğinize emin misiniz?
+ <usetemplate name="okcancelbuttons" notext="İptal" yestext="Tamam"/>
+ </notification>
+ <notification name="ConfirmObjectDeleteLockNoOwn">
+ Nesnelerden en az biri kilitli.
+Nesnelerden en az birine sahip deÄŸilsiniz.
+
+Bu öğeleri silmek istediğinize emin misiniz?
+ <usetemplate name="okcancelbuttons" notext="İptal" yestext="Tamam"/>
+ </notification>
+ <notification name="ConfirmObjectDeleteNoCopyNoOwn">
+ Nesnelerden en az biri kopyalanamıyor.
+Nesnelerden en az birine sahip deÄŸilsiniz.
+
+Bu öğeleri silmek istediğinize emin misiniz?
+ <usetemplate name="okcancelbuttons" notext="İptal" yestext="Tamam"/>
+ </notification>
+ <notification name="ConfirmObjectDeleteLockNoCopyNoOwn">
+ Nesnelerden en az biri kilitli.
+Nesnelerden en az biri kopyalanamıyor.
+Nesnelerden en az birine sahip deÄŸilsiniz.
+
+Bu öğeleri silmek istediğinize emin misiniz?
+ <usetemplate name="okcancelbuttons" notext="İptal" yestext="Tamam"/>
+ </notification>
+ <notification name="ConfirmObjectTakeLock">
+ Nesnelerden en az biri kilitli.
+
+Bu öğeleri almak istediğinize emin misiniz?
+ <usetemplate name="okcancelbuttons" notext="İptal" yestext="Tamam"/>
+ </notification>
+ <notification name="ConfirmObjectTakeNoOwn">
+ Aldığınız nesnelerin hepsine sahip değilsiniz.
+Devam ederseniz, nesnelerin sonraki sahibi için geçerli olan izinler uygulanacak ve büyük olasılıkla bu nesneler üzerinde değişiklik yapma ve onları kopyalama yeteneğiniz kısıtlanacak.
+
+Bu öğeleri almak istediğinize emin misiniz?
+ <usetemplate name="okcancelbuttons" notext="İptal" yestext="Tamam"/>
+ </notification>
+ <notification name="ConfirmObjectTakeLockNoOwn">
+ Nesnelerden en az biri kilitli.
+Aldığınız nesnelerin hepsine sahip değilsiniz.
+Devam ederseniz, nesnelerin sonraki sahibi için geçerli olan izinler uygulanacak ve büyük olasılıkla bu nesneler üzerinde değişiklik yapma ve onları kopyalama yeteneğiniz kısıtlanacak.
+Ancak, mevcut seçimi yine de alabilirsiniz.
+
+Bu öğeleri almak istediğinize emin misiniz?
+ <usetemplate name="okcancelbuttons" notext="İptal" yestext="Tamam"/>
+ </notification>
+ <notification name="CantBuyLandAcrossMultipleRegions">
+ Seçim aralığı birden fazla bölgeyi kapsadığından arazi satın alınamıyor.
+
+Lütfen daha küçük bir alan seçin ve tekrar deneyin.
+ </notification>
+ <notification name="DeedLandToGroup">
+ Bu parseli devrettiğinizde grubun yeterli arazi kulanım kredisine sahip olması ve elinde tutması gerekmektedir.
+Arazinin satış bedeli sahibine geri ödenmez. Devredilen bir parsel satılırsa, satış bedeli grup üyeleri arasında eşit olarak bölünür.
+
+[AREA] m²&apos;lik bu arazi &apos;[GROUP_NAME]&apos; grubuna devredilsin mi?
+ <usetemplate name="okcancelbuttons" notext="İptal" yestext="Tamam"/>
+ </notification>
+ <notification name="DeedLandToGroupWithContribution">
+ Bu parseli devrettiğinizde grubun yeterli arazi kulanım kredisine sahip olması ve elinde tutması gerekmektedir.
+Bu devir eş zamanlı olarak &apos;[NAME]&apos; adlı kişiden gruba arazi katkısı sağlayacaktır.
+Arazinin satış bedeli sahibine geri ödenmez. Devredilen bir parsel satılırsa, satış bedeli grup üyeleri arasında eşit olarak bölünür.
+
+[AREA] m²&apos;lik bu arazi &apos;[GROUP_NAME]&apos; grubuna devredilsin mi?
+ <usetemplate name="okcancelbuttons" notext="İptal" yestext="Tamam"/>
+ </notification>
+ <notification name="DisplaySetToSafe">
+ Güvenli seçeneği seçtiğiniz için görüntüleme ayarları güvenli düzeye ayarlandı.
+ </notification>
+ <notification name="DisplaySetToRecommendedGPUChange">
+ Grafik kartınız değiştiği için görüntü ayarları tavsiye edilen seviyelere ayarlandı
+önceki: &apos;[LAST_GPU]&apos;
+sonraki: &apos;[THIS_GPU]&apos;
+ </notification>
+ <notification name="DisplaySetToRecommendedFeatureChange">
+ İşleme alt sistemindeki bir değişiklik nedeniyle görüntü ayarları tavsiye edilen seviyelere ayarlandı.
+ </notification>
+ <notification name="ErrorMessage">
+ [ERROR_MESSAGE]
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
+ <notification name="AvatarMovedDesired">
+ İstediğiniz konum şu anda kullanılamıyor.
+Yakınındaki başka bir bölgeye taşındınız.
+ </notification>
+ <notification name="AvatarMovedLast">
+ Son konumunuz şu anda kullanılamıyor.
+Yakınındaki başka bir bölgeye taşındınız.
+ </notification>
+ <notification name="AvatarMovedHome">
+ Ana konumunuz şu anda kullanılamıyor.
+Yakınındaki başka bir bölgeye taşındınız.
+Yeni bir ana konum ayarlamak isteyebilirsiniz.
+ </notification>
+ <notification name="ClothingLoading">
+ Giysileriniz hala karşıdan yükleniyor.
+[SECOND_LIFE]&apos;ı normal şekilde kullanmaya devam edebilirsiniz, diğer insanlar sizi düzgün bir şekilde görecektir.
+ <form name="form">
+ <ignore name="ignore" text="Giysilerin karşıdan yüklenmesi uzun zaman alıyor"/>
+ </form>
+ </notification>
+ <notification name="FirstRun">
+ [APP_NAME] kurulumu tamamlandı.
+
+[SECOND_LIFE]&apos;ı ilk kez kullanıyorsanız, oturum açmadan önce bir hesap oluşturmalısınız.
+Yeni bir hesap oluşturmak için [http://join.secondlife.com secondlife.com] adresine dönülsün mü?
+ <usetemplate name="okcancelbuttons" notext="Devam" yestext="Yeni Hesap..."/>
+ </notification>
+ <notification name="LoginPacketNeverReceived">
+ Bağlantıda sorun yaşıyoruz. İnternet bağlantınızda ya da [SECOND_LIFE_GRID] uygulamasında bir problem olabilir.
+
+İnternet bağlantınızı kontrol edip bir kaç dakika sonra yeniden bağlanmayı deneyebilir, [SUPPORT_SITE] sayfasına gitmek için Yardım&apos;ı tıklatabilir ya da ana konumunuza ışınlanmak için Işınla&apos;yı tıklatabilirsiniz.
+ <url name="url">
+ http://secondlife.com/support/
+ </url>
+ <form name="form">
+ <button name="OK" text="Tamam"/>
+ <button name="Help" text="Yardım"/>
+ <button name="Teleport" text="Işınla"/>
+ </form>
+ </notification>
+ <notification name="WelcomeChooseSex">
+ Karakteriniz birazdan görünecek.
+
+Yürümek için ok tuşlarını kullanın.
+Yardım almak ya da [SECOND_LIFE] hakkında daha fazla bilgi edinmek için istediğiniz zaman F1 tuşuna basın.
+Lütfen bir erkek ya da kadın avatar seçin. Fikrinizi daha sonra değiştirebilirsiniz.
+ <usetemplate name="okcancelbuttons" notext="Kadın" yestext="Erkek"/>
+ </notification>
+ <notification name="CantTeleportToGrid">
+ Geçerli ağdan ([CURRENT_GRID]) farklı bir ağ ([GRID]) üzerinde bulunduğundan [SLURL] adresine ışınlanma gerçekleştirilemedi. Lütfen görüntüleyicinizi kapatın ve tekrar deneyin.
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
+ <notification name="GeneralCertificateError">
+ Sunucu ile bağlantı kurulamadı.
+[REASON]
+
+Konu Adı: [SUBJECT_NAME_STRING]
+Verenin Adı: [ISSUER_NAME_STRING]
+Geçerlilik Başlangıcı: [VALID_FROM]
+Geçerlilik Bitişi: [VALID_TO]
+MD5 Parmak izi: [SHA1_DIGEST]
+SHA1 Parmak izi: [MD5_DIGEST]
+Anahtar Kullanımı: [KEYUSAGE]
+Uzatılmış Anahtar Kullanımı: [EXTENDEDKEYUSAGE]
+Konu Anahtarı Tanımlayıcısı: [SUBJECTKEYIDENTIFIER]
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
+ <notification name="TrustCertificateError">
+ Bu sunucunun sertifika yetkilisi bilinmiyor.
+
+Sertifika Bilgileri:
+Konu Adı: [SUBJECT_NAME_STRING]
+Verenin Adı: [ISSUER_NAME_STRING]
+Geçerlilik Başlangıcı: [VALID_FROM]
+Geçerlilik Bitişi: [VALID_TO]
+MD5 Parmak izi: [SHA1_DIGEST]
+SHA1 Parmak izi: [MD5_DIGEST]
+Anahtar Kullanımı: [KEYUSAGE]
+Uzatılmış Anahtar Kullanımı: [EXTENDEDKEYUSAGE]
+Konu Anahtarı Tanımlayıcısı: [SUBJECTKEYIDENTIFIER]
+
+Bu yetkiliye güvenilsin mi?
+ <usetemplate name="okcancelbuttons" notext="İptal Et" yestext="Güven"/>
+ </notification>
+ <notification name="NotEnoughCurrency">
+ [NAME] [PRICE] L$ Bunu yapmaya yetecek L$&apos;nız yok.
+ </notification>
+ <notification name="GrantedModifyRights">
+ [NAME] size kendi nesnelerini düzenleme izni verdi.
+ </notification>
+ <notification name="RevokedModifyRights">
+ [NAME] adlı kişinin nesneleri üzerinde değişiklik yapma ayrıcalığınız iptal edildi.
+ </notification>
+ <notification name="FlushMapVisibilityCaches">
+ Bu işlem bu bölgedeki harita önbelleklerini temizleyecek.
+Gerçekte bu sadece hata ayıklama için işe yarar.
+(İşlem sırasında 5 dakika bekleyin, herkes yeniden oturum açtıktan sonra haritaları güncellenecektir.)
+ <usetemplate name="okcancelbuttons" notext="İptal" yestext="Tamam"/>
+ </notification>
+ <notification name="BuyOneObjectOnly">
+ Bir seferde birden fazla nesne satın alınamıyor. Lütfen sadece bir nesne seçin ve tekrar deneyin.
+ </notification>
+ <notification name="OnlyCopyContentsOfSingleItem">
+ Aynı anda birden fazla öğenin içeriği kopyalanamıyor.
+Lütfen sadece bir nesne seçin ve tekrar deneyin.
+ <usetemplate name="okcancelbuttons" notext="İptal" yestext="Tamam"/>
+ </notification>
+ <notification name="KickUsersFromRegion">
+ Bu bölgedeki tüm Sakinler ana konumlarına ışınlansın mı?
+ <usetemplate name="okcancelbuttons" notext="İptal" yestext="Tamam"/>
+ </notification>
+ <notification name="EstateObjectReturn">
+ [USER_NAME] kullanıcısının sahip olduğu tüm nesneleri iade etmek istediğinize emin misiniz?
+ <usetemplate name="okcancelbuttons" notext="İptal" yestext="Tamam"/>
+ </notification>
+ <notification name="InvalidTerrainBitDepth">
+ Bölge dokuları ayarlanamadı:
+[TEXTURE_NUM] numaralı yüzey dokusu geçersiz bir bit derinliğine ([TEXTURE_BIT_DEPTH]) sahip.
+
+[TEXTURE_NUM] numaralı dokuyu 24 bit 512x512 veya daha küçük bir resimle değiştirin ve &quot;Uygula&quot; seçeneğini yeniden tıklatın.
+ </notification>
+ <notification name="InvalidTerrainSize">
+ Bölge dokuları ayarlanamadı:
+[TEXTURE_NUM] numaralı yüzey dokusu çok büyük ([TEXTURE_SIZE_X]x[TEXTURE_SIZE_Y]).
+
+[TEXTURE_NUM] numaralı dokuyu 24 bit 512x512 veya daha küçük bir resimle değiştirin ve &quot;Uygula&quot; seçeneğini yeniden tıklatın.
+ </notification>
+ <notification name="RawUploadStarted">
+ Karşıya yükleme başlatıldı. Bağlantı hızına bağlı olarak iki dakika kadar sürebilir.
+ </notification>
+ <notification name="ConfirmBakeTerrain">
+ Geçerli yüzeyi bu şekilde kaydetmeyi, yüzey yükseltme/alçaltma sınırları için merkez olarak kullanmayı ve &apos;Geri Çevir&apos; aracı için varsayılan olarak ayarlamayı gerçekten istiyor musunuz?
+ <usetemplate name="okcancelbuttons" notext="İptal" yestext="Tamam"/>
+ </notification>
+ <notification name="MaxAllowedAgentOnRegion">
+ Sadece [MAX_AGENTS] tane İzin Verilen Sakin belirleyebilirsiniz.
+ </notification>
+ <notification name="MaxBannedAgentsOnRegion">
+ Sadece [MAX_BANNED] tane Yasaklı Sakin belirleyebilirsiniz.
+ </notification>
+ <notification name="MaxAgentOnRegionBatch">
+ [NUM_ADDED] aracı ekleme girişimi başarısız oldu:
+[MAX_AGENTS] [LIST_TYPE] sınırı [NUM_EXCESS] birim aşıldı.
+ </notification>
+ <notification name="MaxAllowedGroupsOnRegion">
+ Sadece [MAX_GROUPS] tane İzin Verilen Grup belirleyebilirsiniz.
+ <usetemplate name="okcancelbuttons" notext="İptal Et" yestext="Kaydet"/>
+ </notification>
+ <notification name="MaxManagersOnRegion">
+ Sadece [MAX_MANAGER] tane Gayrimenkul Yöneticisi belirleyebilirsiniz.
+ </notification>
+ <notification name="OwnerCanNotBeDenied">
+ Gayrimenkul sahibi, gayrimenkulün &apos;Yasaklı Sakin&apos; listesine eklenemez.
+ </notification>
+ <notification name="CanNotChangeAppearanceUntilLoaded">
+ Giysi ve şekil yüklenene kadar görünüm değiştirilemez.
+ </notification>
+ <notification name="ClassifiedMustBeAlphanumeric">
+ İlanınızın adı A ile Z arasında bir harfle ya da bir sayıyla başlamalıdır. Noktalama işaretleri kullanılamaz.
+ </notification>
+ <notification name="CantSetBuyObject">
+ Nesne Satın Al komutu ayarlanamadı, çünkü nesne satılık değil.
+Nesneyi satılık olarak ayarlayıp tekrar deneyin.
+ </notification>
+ <notification name="FinishedRawDownload">
+ İşlenmemiş yüzey dosyasının şu konuma karşıdan yüklenmesi tamamlandı:
+[DOWNLOAD_PATH].
+ </notification>
+ <notification name="DownloadWindowsMandatory">
+ [APP_NAME] uygulamasının yeni bir sürümü mevcut.
+[MESSAGE]
+[APP_NAME] uygulamasını kullanabilmek için bu güncellemeyi karşıdan yüklemelisiniz.
+ <usetemplate name="okcancelbuttons" notext="Çık" yestext="Karşıdan Yükle"/>
+ </notification>
+ <notification name="DownloadWindows">
+ [APP_NAME] uygulamasının güncellenmiş bir sürümü mevcut.
+[MESSAGE]
+Bu güncelleme zorunlu değil, fakat performans ve kararlılığı iyileştirmek için güncellemeyi yüklemenizi öneririz.
+ <usetemplate name="okcancelbuttons" notext="Devam" yestext="Karşıdan Yükle"/>
+ </notification>
+ <notification name="DownloadWindowsReleaseForDownload">
+ [APP_NAME] uygulamasının güncellenmiş bir sürümü mevcut.
+[MESSAGE]
+Bu güncelleme zorunlu değil, fakat performans ve kararlılığı iyileştirmek için güncellemeyi yüklemenizi öneririz.
+ <usetemplate name="okcancelbuttons" notext="Devam" yestext="Karşıdan Yükle"/>
+ </notification>
+ <notification name="DownloadLinuxMandatory">
+ [APP_NAME] uygulamasının yeni bir sürümü mevcut.
+[MESSAGE]
+[APP_NAME] uygulamasını kullanabilmek için bu güncellemeyi karşıdan yüklemelisiniz.
+ <usetemplate name="okcancelbuttons" notext="Çık" yestext="Karşıdan Yükle"/>
+ </notification>
+ <notification name="DownloadLinux">
+ [APP_NAME] uygulamasının güncellenmiş bir sürümü mevcut.
+[MESSAGE]
+Bu güncelleme zorunlu değil, fakat performans ve kararlılığı iyileştirmek için güncellemeyi yüklemenizi öneririz.
+ <usetemplate name="okcancelbuttons" notext="Devam" yestext="Karşıdan Yükle"/>
+ </notification>
+ <notification name="DownloadLinuxReleaseForDownload">
+ [APP_NAME] uygulamasının güncellenmiş bir sürümü mevcut.
+[MESSAGE]
+Bu güncelleme zorunlu değil, fakat performans ve kararlılığı iyileştirmek için güncellemeyi yüklemenizi öneririz.
+ <usetemplate name="okcancelbuttons" notext="Devam" yestext="Karşıdan Yükle"/>
+ </notification>
+ <notification name="DownloadMacMandatory">
+ [APP_NAME] uygulamasının yeni bir sürümü mevcut.
+[MESSAGE]
+[APP_NAME] uygulamasını kullanabilmek için bu güncellemeyi karşıdan yüklemelisiniz.
+
+Uygulamalar klasörünüze karşıdan yüklensin mi?
+ <usetemplate name="okcancelbuttons" notext="Çık" yestext="Karşıdan Yükle"/>
+ </notification>
+ <notification name="DownloadMac">
+ [APP_NAME] uygulamasının güncellenmiş bir sürümü mevcut.
+[MESSAGE]
+Bu güncelleme zorunlu değil, fakat performans ve kararlılığı iyileştirmek için güncellemeyi yüklemenizi öneririz.
+
+Uygulamalar klasörünüze karşıdan yüklensin mi?
+ <usetemplate name="okcancelbuttons" notext="Devam" yestext="Karşıdan Yükle"/>
+ </notification>
+ <notification name="DownloadMacReleaseForDownload">
+ [APP_NAME] uygulamasının güncellenmiş bir sürümü mevcut.
+[MESSAGE]
+Bu güncelleme zorunlu değil, fakat performans ve kararlılığı iyileştirmek için güncellemeyi yüklemenizi öneririz.
+
+Uygulamalar klasörünüze karşıdan yüklensin mi?
+ <usetemplate name="okcancelbuttons" notext="Devam" yestext="Karşıdan Yükle"/>
+ </notification>
+ <notification name="FailedUpdateInstall">
+ Görüntüleyici güncellemesi yüklenirken bir hata oluştu.
+Lütfen en son görüntüleyiciyi şu adresten karşıdan yükleyin ve kurun:
+http://secondlife.com/download.
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
+ <notification name="FailedRequiredUpdateInstall">
+ Gerekli bir güncellemeyi yükleyemedik.
+[APP_NAME] güncellenene kadar oturum açamayacaksınız.
+
+Lütfen en son görüntüleyiciyi şu adresten karşıdan yükleyin ve kurun:
+http://secondlife.com/download.
+ <usetemplate name="okbutton" yestext="Çık"/>
+ </notification>
+ <notification name="UpdaterServiceNotRunning">
+ Second Life kurulumunuz için gerekli bir güncelleme var.
+
+Bu güncellemeyi http://www.secondlife.com/downloads adresinden karşıdan yükleyebilir
+veya ÅŸimdi kurabilirsiniz.
+ <usetemplate name="okcancelbuttons" notext="Second Life&apos;tan çık" yestext="Karşıdan yükle ve şimdi kur"/>
+ </notification>
+ <notification name="DownloadBackgroundTip">
+ [APP_NAME] kurulumunuz için bir güncellemeyi karşıdan yükledik.
+Sürüm [VERSION] [[RELEASE_NOTES_FULL_URL] Bu güncelleme hakkında ayrıntılı bilgi]
+ <usetemplate name="okcancelbuttons" notext="Sonra..." yestext="Şimdi kur ve [APP_NAME] uygulamasını yeniden başlat"/>
+ </notification>
+ <notification name="DownloadBackgroundDialog">
+ [APP_NAME] kurulumunuz için bir güncellemeyi karşıdan yükledik.
+Sürüm [VERSION] [[RELEASE_NOTES_FULL_URL] Bu güncelleme hakkında ayrıntılı bilgi]
+ <usetemplate name="okcancelbuttons" notext="Sonra..." yestext="Şimdi kur ve [APP_NAME] uygulamasını yeniden başlat"/>
+ </notification>
+ <notification name="RequiredUpdateDownloadedVerboseDialog">
+ Gerekli bir yazılım güncellemesini karşıdan yükledik.
+Sürüm [VERSION]
+
+Güncellemeyi kurmak için [APP_NAME] uygulamasını yeniden başlatmalısınız.
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
+ <notification name="RequiredUpdateDownloadedDialog">
+ Güncellemeyi kurmak için [APP_NAME] uygulamasını yeniden başlatmalısınız.
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
+ <notification name="DeedObjectToGroup">
+ Bu nesnenin devredilmesi grubun şunu yapmasına sebep olacak:
+* Nesneye ödenen L$&apos;nı almasına
+ <usetemplate ignoretext="Bir nesneyi bir gruba devretmeden önce doğrulama iste" name="okcancelignore" notext="İptal Et" yestext="Devret"/>
+ </notification>
+ <notification name="WebLaunchExternalTarget">
+ Bu içeriği görüntülemek için Web tarayıcınızı açmak istiyor musunuz?
+ <usetemplate ignoretext="Bir web sayfasını görüntülemek için tarayıcımı başlat" name="okcancelignore" notext="İptal" yestext="Tamam"/>
+ </notification>
+ <notification name="WebLaunchJoinNow">
+ Hesabınızı yönetmek için [http://secondlife.com/account/ Kontrol Paneli] adresine gidilsin mi?
+ <usetemplate ignoretext="Hesabımı yönetmek için tarayıcımı başlat" name="okcancelignore" notext="İptal" yestext="Tamam"/>
+ </notification>
+ <notification name="WebLaunchSecurityIssues">
+ Bir güvenlik sorununun nasıl bildireceği ile ilgili ayrıntıları öğrenmek için [SECOND_LIFE] Wiki&apos;yi aç.
+ <usetemplate ignoretext="Bir Güvenlik Sorununu bildirme şeklini öğrenmek için tarayıcımı başlat" name="okcancelignore" notext="İptal" yestext="Tamam"/>
+ </notification>
+ <notification name="WebLaunchQAWiki">
+ [SECOND_LIFE] Wiki&apos;nin Kalite Güvencesi sayfasını ziyaret edin.
+ <usetemplate ignoretext="Wiki Kalite Güvencesi sayfasını görüntülemek için tarayıcımı başlat" name="okcancelignore" notext="İptal" yestext="Tamam"/>
+ </notification>
+ <notification name="WebLaunchPublicIssue">
+ Hataları ve diğer sorunları bildirebileceğiniz [SECOND_LIFE] Kamuya Açık Sorun Takip sayfasını ziyaret edin.
+ <usetemplate ignoretext="Kamuya Açık Sorun Takip hizmetini kullanmak için tarayıcımı başlat" name="okcancelignore" notext="İptal Et" yestext="Sayfaya git"/>
+ </notification>
+ <notification name="WebLaunchSupportWiki">
+ En son haberler ve bilgiler için Resmi Linden Blog&apos;una git.
+ <usetemplate ignoretext="Blog sayfasını görüntülemek için tarayıcımı başlat" name="okcancelignore" notext="İptal" yestext="Tamam"/>
+ </notification>
+ <notification name="WebLaunchLSLGuide">
+ Komut dosyası yazma ile ilgili yardım almak için Komut Dosyası Yazma Kılavuzu&apos;nu açmak istiyor musunuz?
+ <usetemplate ignoretext="Komut Dosyası Yazma Kılavuzunu görüntülemek için tarayıcımı başlat" name="okcancelignore" notext="İptal" yestext="Tamam"/>
+ </notification>
+ <notification name="WebLaunchLSLWiki">
+ Komut dosyası yazma ile ilgili yardım almak için LSL Portal&apos;ını açmak istiyor musunuz?
+ <usetemplate ignoretext="LSL Portal&apos;ını görüntülemek için tarayıcımı başlat" name="okcancelignore" notext="İptal Et" yestext="Sayfaya git"/>
+ </notification>
+ <notification name="ReturnToOwner">
+ Seçili nesneleri kendi sahiplerine iade etmek istediğinize emin misiniz? Devredilmiş nesnelerin aktarılabilenleri önceki sahiplerine iade edilecektir.
+
+*UYARI* Bu eylem, devredilmiş nesnelerin aktarılamayanlarını silecektir!
+ <usetemplate ignoretext="Nesneleri sahiplerine iade etmeden önce doğrulama iste" name="okcancelignore" notext="İptal" yestext="Tamam"/>
+ </notification>
+ <notification name="GroupLeaveConfirmMember">
+ Şu anda &lt;nolink&gt;[GROUP]&lt;/nolink&gt; grubunun bir üyesisiniz.
+Gruptan ayrılmak istiyor musunuz?
+ <usetemplate name="okcancelbuttons" notext="İptal" yestext="Tamam"/>
+ </notification>
+ <notification name="ConfirmKick">
+ Tüm Sakinleri GERÇEKTEN ağ dışına çıkarmak istiyor musunuz?
+ <usetemplate name="okcancelbuttons" notext="İptal Et" yestext="Tüm Sakinleri Çıkar"/>
+ </notification>
+ <notification name="MuteLinden">
+ Üzgünüz, bir Linden çalışanını engelleyemezsiniz.
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
+ <notification name="CannotStartAuctionAlreadyForSale">
+ Satılığa çıkarılmış bir parsel için açık arttırma başlatamazsınız. Açık arttırma başlatmak istediğinize eminseniz arazi satışını devre dışı bırakın.
+ </notification>
+ <notification label="Nesneyi ada göre engelleme başarısız" name="MuteByNameFailed">
+ Bu adı zaten engellediniz.
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
+ <notification name="RemoveItemWarn">
+ İzin veriliyor olsa da, içerikleri silmek nesneye zarar verebilir. Bu öğeyi silmek istiyor musunuz?
+ <usetemplate name="okcancelbuttons" notext="İptal" yestext="Tamam"/>
+ </notification>
+ <notification name="CantOfferCallingCard">
+ Şu anda arama kartı verilemiyor. Lütfen biraz sonra tekrar deneyin.
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
+ <notification name="CantOfferFriendship">
+ Şu anda arkadaşlık teklif edilemiyor. Lütfen biraz sonra tekrar deneyin.
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
+ <notification name="BusyModeSet">
+ Durumunuz Meşgul olarak ayarlandı.
+Sohbet ve anlık iletiler gizlenecek. Anlık iletilere Meşgul durumu için belirlediğiniz yanıt gönderilecek. Tüm ışınlanma teklifleri reddedilecek. Tüm envanter teklifleri Çöp Kutunuza gidecek.
+ <usetemplate ignoretext="Durumumu MeÅŸgul olarak deÄŸiÅŸtiriyorum" name="okignore" yestext="Tamam"/>
+ </notification>
+ <notification name="JoinedTooManyGroupsMember">
+ Maksimum grup sayısına eriştiniz. Lütfen bu gruba katılmadan önce başka bir gruptan ayrılın ya da bu teklifi reddedin.
+[NAME] sizi bir gruba üye olarak katılmaya davet etti.
+ <usetemplate name="okcancelbuttons" notext="Reddet" yestext="Katıl"/>
+ </notification>
+ <notification name="JoinedTooManyGroups">
+ Maksimum grup sayısına eriştiniz. Lütfen yeni bir gruba katılmadan ya da yeni bir grup oluşturmadan önce grupların bazılarından ayrılın.
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
+ <notification name="KickUser">
+ Bu Sakin hangi iletiyle çıkarılsın?
+ <form name="form">
+ <input name="message">
+ Bir yönetici oturumunuzu sonlandırdı.
+ </input>
+ <button name="OK" text="Tamam"/>
+ <button name="Cancel" text="İptal"/>
+ </form>
+ </notification>
+ <notification name="KickAllUsers">
+ Şu anda ağ üzerinde yer alan herkes hangi iletiyle çıkarılsın?
+ <form name="form">
+ <input name="message">
+ Bir yönetici oturumunuzu sonlandırdı.
+ </input>
+ <button name="OK" text="Tamam"/>
+ <button name="Cancel" text="İptal"/>
+ </form>
+ </notification>
+ <notification name="FreezeUser">
+ Bu Sakin hangi iletiyle dondurulsun?
+ <form name="form">
+ <input name="message">
+ Donduruldunuz. Hareket ya da sohbet edemezsiniz. Bir yönetici sizinle anlık ileti (Aİ) yoluyla iletişim kuracak.
+ </input>
+ <button name="OK" text="Tamam"/>
+ <button name="Cancel" text="İptal"/>
+ </form>
+ </notification>
+ <notification name="UnFreezeUser">
+ Bu Sakin hangi iletiyle çözülsün?
+ <form name="form">
+ <input name="message">
+ Artık dondurulmuş durumda değilsiniz.
+ </input>
+ <button name="OK" text="Tamam"/>
+ <button name="Cancel" text="İptal"/>
+ </form>
+ </notification>
+ <notification name="SetDisplayNameSuccess">
+ Merhaba [DISPLAY_NAME]!
+
+Aynı gerçek hayatta olduğu gibi, burada da herkesin yeni bir adı öğrenmesi biraz zaman alacaktır. Lütfen nesnelerde, komut dosyalarında, arama vb. hizmetlerde [http://wiki.secondlife.com/wiki/Setting_your_display_name adınızın güncellenmesi için] birkaç gün süre tanıyın.
+ </notification>
+ <notification name="SetDisplayNameBlocked">
+ Üzgünüz, ekran adınızı değiştiremezsiniz. Bunun bir hata olduğunu düşünüyorsanız, lütfen destek ekibine başvurun.
+ </notification>
+ <notification name="SetDisplayNameFailedLength">
+ Üzgünüz, bu ad çok uzun. Ekran adları maksimum [LENGTH] karakter olabilir.
+
+Lütfen daha kısa bir ad deneyin.
+ </notification>
+ <notification name="SetDisplayNameFailedGeneric">
+ Üzgünüz, ekran adınızı ayarlayamadık. Lütfen daha sonra tekrar deneyin.
+ </notification>
+ <notification name="SetDisplayNameMismatch">
+ Girdiğiniz ekran adları birbiriyle eşleşmiyor. Lütfen yeniden girin.
+ </notification>
+ <notification name="AgentDisplayNameUpdateThresholdExceeded">
+ Üzgünüz, ekran adınızı değiştirebilmeniz için biraz daha beklemeniz gerekiyor.
+
+Bkz. http://wiki.secondlife.com/wiki/Setting_your_display_name
+
+Lütfen daha sonra tekrar deneyin.
+ </notification>
+ <notification name="AgentDisplayNameSetBlocked">
+ Üzgünüz, ekran adınızı ayarlayamadık çünkü kullanılması yasak olan bir kelime içeriyor.
+
+ Lütfen başka bir ad deneyin.
+ </notification>
+ <notification name="AgentDisplayNameSetInvalidUnicode">
+ Ayarlamak istediğiniz ekran adı geçersiz karakterler içeriyor.
+ </notification>
+ <notification name="AgentDisplayNameSetOnlyPunctuation">
+ Ekran adınız noktalama işaretlerinin dışında harfler de içermelidir.
+ </notification>
+ <notification name="DisplayNameUpdate">
+ [OLD_NAME] ([SLID]) artık [NEW_NAME] olarak ayarlandı.
+ </notification>
+ <notification name="OfferTeleport">
+ Aşağıdaki iletiyle konumunuza ışınlanma teklif edilsin mi?
+ <form name="form">
+ <input name="message">
+ [REGION] bölgesinde bana katılır mısın?
+ </input>
+ <button name="OK" text="Tamam"/>
+ <button name="Cancel" text="İptal"/>
+ </form>
+ </notification>
+ <notification name="TooManyTeleportOffers">
+ [OFFERS] ışınlama teklif etmeye kalkıştınız, bu [LIMIT] sınırını aşıyor.
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
+ <notification name="OfferTeleportFromGod">
+ Sakin sizin konumunuza Yönetici Ayrıcalığı kullanılarak getirilsin mi?
+ <form name="form">
+ <input name="message">
+ [REGION] bölgesinde bana katıl
+ </input>
+ <button name="OK" text="Tamam"/>
+ <button name="Cancel" text="İptal"/>
+ </form>
+ </notification>
+ <notification name="TeleportFromLandmark">
+ &lt;nolink&gt;[LOCATION]&lt;/nolink&gt; konumuna ışınlanmak istediğinize emin misiniz?
+ <usetemplate ignoretext="Bir yer imine ışınlanma istediğimde doğrulama iste" name="okcancelignore" notext="İptal Et" yestext="Işınla"/>
+ </notification>
+ <notification name="TeleportToPick">
+ [PICK] konumuna ışınlanılsın mı?
+ <usetemplate ignoretext="Seçme sekmesindeki bir konuma ışınlanma istediğimde doğrulama iste" name="okcancelignore" notext="İptal Et" yestext="Işınla"/>
+ </notification>
+ <notification name="TeleportToClassified">
+ [CLASSIFIED] konumuna ışınlanılsın mı?
+ <usetemplate ignoretext="İlanlardaki bir konuma ışınlanma istediğimde doğrulama iste" name="okcancelignore" notext="İptal Et" yestext="Işınla"/>
+ </notification>
+ <notification name="TeleportToHistoryEntry">
+ [HISTORY_ENTRY] konumuna ışınlanılsın mı?
+ <usetemplate ignoretext="Geçmiş içinde yer alan bir konuma ışınlanma istediğimde doğrulama iste" name="okcancelignore" notext="İptal Et" yestext="Işınla"/>
+ </notification>
+ <notification label="Gayrimenkulünüzdeki herkese ileti gönderme" name="MessageEstate">
+ Şu anda gayrimenkulünüzde bulunan herkese gönderilecek kısa bir duyuru yazın.
+ <form name="form">
+ <button name="OK" text="Tamam"/>
+ <button name="Cancel" text="İptal"/>
+ </form>
+ </notification>
+ <notification label="Bir Linden Gayrimenkulünü değiştirme" name="ChangeLindenEstate">
+ Linden çalışanlarına ait bir gayrimenkulü (anakara, oryantasyon vb.) değiştirmek üzeresiniz.
+
+Bu, Sakinlerin deneyimlerini temelden etkileyebileceği için SON DERECE TEHLİKELİDİR. Anakara üzerinde, binlerce bölgeyi değiştirecek ve alan sunucusunu kesintiye uğratacaktır.
+
+Devam edilsin mi?
+ <usetemplate name="okcancelbuttons" notext="İptal" yestext="Tamam"/>
+ </notification>
+ <notification label="Linden Gayrimenkulüne Erişimi değiştirme" name="ChangeLindenAccess">
+ Linden çalışanlarına ait bir gayrimenkul (anakara, oryantasyon vb.) için erişim listesini değiştirmek üzeresiniz.
+
+Bu işlem TEHLİKELİDİR ve sadece saldırıya açık nesnelerin/L$&apos;nın ağ içine/dışına aktarılmasını sağlamak için gerçekleştirilmelidir.
+Binlerce bölgeyi değiştirecek ve alan sunucusunu kesintiye uğratacaktır.
+ <usetemplate name="okcancelbuttons" notext="İptal" yestext="Tamam"/>
+ </notification>
+ <notification label="Gayrimenkul seç" name="EstateAllowedAgentAdd">
+ Sadece bu gayrimenkul için mi izin verilenler listesine eklensin, yoksa [ALL_ESTATES] için mi?
+ <usetemplate canceltext="İptal" name="yesnocancelbuttons" notext="Tüm Gayrimenkuller" yestext="Bu Gayrimenkul"/>
+ </notification>
+ <notification label="Gayrimenkul seç" name="EstateAllowedAgentRemove">
+ Sadece bu gayrimenkul için mi izin verilenler listesinden çıkarılsın, yoksa [ALL_ESTATES] için mi?
+ <usetemplate canceltext="İptal" name="yesnocancelbuttons" notext="Tüm Gayrimenkuller" yestext="Bu Gayrimenkul"/>
+ </notification>
+ <notification label="Gayrimenkul seç" name="EstateAllowedGroupAdd">
+ Sadece bu gayrimenkul için mi izin verilen grup listesine eklensin, yoksa [ALL_ESTATES] için mi?
+ <usetemplate canceltext="İptal" name="yesnocancelbuttons" notext="Tüm Gayrimenkuller" yestext="Bu Gayrimenkul"/>
+ </notification>
+ <notification label="Gayrimenkul seç" name="EstateAllowedGroupRemove">
+ Sadece bu gayrimenkul için mi izin verilen grup listesinden çıkarılsın, yoksa [ALL_ESTATES] için mi?
+ <usetemplate canceltext="İptal" name="yesnocancelbuttons" notext="Tüm Gayrimenkuller" yestext="Bu Gayrimenkul"/>
+ </notification>
+ <notification label="Gayrimenkul seç" name="EstateBannedAgentAdd">
+ Sadece bu gayrimenkul için mi erişim engellensin, yoksa [ALL_ESTATES] için mi?
+ <usetemplate canceltext="İptal" name="yesnocancelbuttons" notext="Tüm Gayrimenkuller" yestext="Bu Gayrimenkul"/>
+ </notification>
+ <notification label="Gayrimenkul seç" name="EstateBannedAgentRemove">
+ Bu Sakin sadece bu gayrimenkul için mi yasaklı listesinden çıkarılsın, yoksa [ALL_ESTATES] için mi?
+ <usetemplate canceltext="İptal" name="yesnocancelbuttons" notext="Tüm Gayrimenkuller" yestext="Bu Gayrimenkul"/>
+ </notification>
+ <notification label="Gayrimenkul seç" name="EstateManagerAdd">
+ Sadece bu gayrimenkul için mi gayrimenkul yöneticisi olarak eklensin, yoksa [ALL_ESTATES] için mi?
+ <usetemplate canceltext="İptal" name="yesnocancelbuttons" notext="Tüm Gayrimenkuller" yestext="Bu Gayrimenkul"/>
+ </notification>
+ <notification label="Gayrimenkul seç" name="EstateManagerRemove">
+ Sadece bu gayrimenkul için mi gayrimenkul yöneticiliğinden çıkarılsın, yoksa [ALL_ESTATES] için mi?
+ <usetemplate canceltext="İptal" name="yesnocancelbuttons" notext="Tüm Gayrimenkuller" yestext="Bu Gayrimenkul"/>
+ </notification>
+ <notification label="Çıkarmayı Onayla" name="EstateKickUser">
+ [EVIL_USER] bu gayrimenkulden çıkarılsın mı?
+ <usetemplate name="okcancelbuttons" notext="İptal" yestext="Tamam"/>
+ </notification>
+ <notification name="EstateChangeCovenant">
+ Gayrimenkul Sözleşmesini değiştirmek istediğinize emin misiniz?
+ <usetemplate name="okcancelbuttons" notext="İptal" yestext="Tamam"/>
+ </notification>
+ <notification name="RegionEntryAccessBlocked">
+ Erişkinlik Seviyesi ayarlarınızdan dolayı bu Bölgeye giremezsiniz. Bu sorun yaşınızı doğrulamak için gerekli bilgilerin eksik olmasından kaynaklanabilir.
+
+Lütfen en son Görüntüleyicinin yüklü olduğunu doğrulayın ve bu erişkinlik seviyesi ile erişilecek alanlar hakkında ayrıntılı bilgi edinmek için Bilgi Bankası&apos;nı ziyaret edin.
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
+ <notification name="RegionEntryAccessBlocked_KB">
+ Erişkinlik Seviyesi ayarlarınızdan dolayı bu bölgeye giremezsiniz.
+
+Erişkinlik Seviyeleri hakkında daha fazla bilgi edinmek için Bilgi Bankası&apos;nı ziyaret etmek ister misiniz?
+ <url name="url">
+ http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview
+ </url>
+ <usetemplate ignoretext="Erişkinlik Seviyesi ile ilgili kısıtlamalardan dolayı bu Bölgeye giremiyorum" name="okcancelignore" notext="Kapat" yestext="Bilgi Bankası&apos;na Git"/>
+ </notification>
+ <notification name="RegionEntryAccessBlocked_Notify">
+ Erişkinlik Seviyesi ayarlarınızdan dolayı bu bölgeye giremezsiniz.
+ </notification>
+ <notification name="RegionEntryAccessBlocked_Change">
+ Erişkinlik Seviyesi tercihlerinizden dolayı bu Bölgeye giremezsiniz.
+
+İstenilen bölgeye girmek için, lütfen erişkinlik Seviyesi tercihinizi değiştirin. Bu tercih [REGIONMATURITY] içerikli alanlar içinde arama yapabilmenizi ve bu alanlara erişebilmenizi sağlayacak. Değişiklikleri geri almak için, Ben &gt; Tercihler &gt; Genel sekmesine gidin.
+ <form name="form">
+ <button name="OK" text="Tercihi DeÄŸiÅŸtir"/>
+ <button name="Cancel" text="Kapat"/>
+ <ignore name="ignore" text="Seçtiğim Seviye tercihleri bir bölgeye girmemi engelliyor"/>
+ </form>
+ </notification>
+ <notification name="PreferredMaturityChanged">
+ Erişkinlik Seviyesi tercihiniz artık [RATING].
+ </notification>
+ <notification name="LandClaimAccessBlocked">
+ Erişkinlik Seviyesi ayarlarınızdan dolayı bu arazi üzerinde hak talebinde bulunamazsınız. Bu sorun yaşınızı doğrulamak için gerekli bilgilerin eksik olmasından kaynaklanabilir.
+
+Lütfen en son Görüntüleyicinin yüklü olduğunu doğrulayın ve bu erişkinlik seviyesi ile erişilecek alanlar hakkında ayrıntılı bilgi edinmek için Bilgi Bankası&apos;nı ziyaret edin.
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
+ <notification name="LandClaimAccessBlocked_KB">
+ Erişkinlik Seviyesi ayarlarınızdan dolayı bu arazi üzerinde hak talebinde bulunamazsınız.
+
+Erişkinlik Seviyeleri hakkında daha fazla bilgi edinmek için Bilgi Bankası&apos;nı ziyaret etmek ister misiniz?
+ <url name="url">
+ http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview
+ </url>
+ <usetemplate ignoretext="Erişkinlik Seviyesi ile ilgili kısıtlandırmalardan dolayı bu Arazi üzerinde hak talebinde bulunamıyorum." name="okcancelignore" notext="Kapat" yestext="Bilgi Bankası&apos;na Git"/>
+ </notification>
+ <notification name="LandClaimAccessBlocked_Notify">
+ Erişkinlik Seviyesi ayarlarınızdan dolayı bu arazi üzerinde hak talebinde bulunamazsınız.
+ </notification>
+ <notification name="LandClaimAccessBlocked_Change">
+ Erişkinlik Seviyesi tercihinizden dolayı bu arazi üzerinde hak talebinde bulunamazsınız.
+
+Erişkinlik Seviyesi tercihinizi şimdi yükseltmek ve araziye girebilmek için &apos;Tercihi Değiştir&apos; seçeneğini tıklatabilirsiniz. Böylece [REGIONMATURITY] içerikli alanlar içinde arama yapabilecek ve bu alanlara erişebileceksiniz. İleride bu ayarı eski haline döndürmek isterseniz, Ben &gt; Tercihler &gt; Genel sekmesine gidin.
+ <usetemplate ignoretext="Seçtiğim Seviye tercihi Arazi üzerinde hak talebinde bulunmamı engelliyor" name="okcancelignore" notext="Kapat" yestext="Tercihi Değiştir"/>
+ </notification>
+ <notification name="LandBuyAccessBlocked">
+ Erişkinlik Seviyesi ayarlarınızdan dolayı bu araziyi satın alamazsınız. Bu sorun yaşınızı doğrulamak için gerekli bilgilerin eksik olmasından kaynaklanabilir.
+
+Lütfen en son Görüntüleyicinin yüklü olduğunu doğrulayın ve bu erişkinlik seviyesi ile erişilecek alanlar hakkında ayrıntılı bilgi edinmek için Bilgi Bankası&apos;nı ziyaret edin.
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
+ <notification name="LandBuyAccessBlocked_KB">
+ Erişkinlik Seviyesi ayarlarınızdan dolayı bu araziyi satın alamazsınız.
+
+Erişkinlik Seviyeleri hakkında daha fazla bilgi edinmek için Bilgi Bankası&apos;nı ziyaret etmek ister misiniz?
+ <url name="url">
+ http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview
+ </url>
+ <usetemplate ignoretext="Erişkinlik Seviyesi ile ilgili kısıtlandırmalardan dolayı bu Araziyi satın alamıyorum" name="okcancelignore" notext="Kapat" yestext="Bilgi Bankası&apos;na Git"/>
+ </notification>
+ <notification name="LandBuyAccessBlocked_Notify">
+ Erişkinlik Seviyesi ayarlarınızdan dolayı bu araziyi satın alamazsınız.
+ </notification>
+ <notification name="LandBuyAccessBlocked_Change">
+ Erişkinlik Seviyesi tercihinizden dolayı bu araziyi satın alamazsınız.
+
+Erişkinlik Seviyesi tercihinizi şimdi yükseltmek ve araziye girebilmek için &apos;Tercihi Değiştir&apos; seçeneğini tıklatabilirsiniz. Böylece [REGIONMATURITY] içerikli alanlar içinde arama yapabilecek ve bu alanlara erişebileceksiniz. İleride bu ayarı eski haline döndürmek isterseniz, Ben &gt; Tercihler &gt; Genel sekmesine gidin.
+ <usetemplate ignoretext="Seçtiğim Seviye tercihi Araziyi satın almamı engelliyor" name="okcancelignore" notext="Kapat" yestext="Tercihi Değiştir"/>
+ </notification>
+ <notification name="TooManyPrimsSelected">
+ Çok fazla prim seçilmiş. Lütfen [MAX_PRIM_COUNT] ya da daha az prim seçin ve tekrar deneyin
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
+ <notification name="ProblemImportingEstateCovenant">
+ Gayrimenkul sözleşmesi içeriye aktarılırken problem oluştu.
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
+ <notification name="ProblemAddingEstateManager">
+ Yeni bir gayrimenkul yöneticisi eklenirken problem oluştu. Bir veya birden fazla gayrimenkulün yönetici listesi dolu olabilir.
+ </notification>
+ <notification name="ProblemAddingEstateGeneric">
+ Bu gayrimenkul listesine eklenirken problem oluştu. Bir veya birden fazla gayrimenkulün listesi dolu olabilir.
+ </notification>
+ <notification name="UnableToLoadNotecardAsset">
+ Not kartı varlığı şu anda yüklenemedi.
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
+ <notification name="NotAllowedToViewNotecard">
+ İstenen varlık kimliği ile ilişkili not karını görüntülemek için yeterli izniniz yok.
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
+ <notification name="MissingNotecardAssetID">
+ Not kartının varlık kimliği veri tabanında yer almıyor.
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
+ <notification name="PublishClassified">
+ Hatırla: İlan ücretleri iade edilmez.
+
+Şimdi L$ [AMOUNT] ödeyerek bu ilanı yayınlamak istiyor musunuz?
+ <usetemplate name="okcancelbuttons" notext="İptal" yestext="Tamam"/>
+ </notification>
+ <notification name="SetClassifiedMature">
+ Bu ilan Orta Seviyede içerik barındırıyor mu?
+ <usetemplate canceltext="İptal" name="yesnocancelbuttons" notext="Hayır" yestext="Evet"/>
+ </notification>
+ <notification name="SetGroupMature">
+ Bu grup Orta Seviyede içerik barındırıyor mu?
+ <usetemplate canceltext="İptal" name="yesnocancelbuttons" notext="Hayır" yestext="Evet"/>
+ </notification>
+ <notification label="Yeniden başlatmayı onayla" name="ConfirmRestart">
+ Bu bölgeyi gerçekten 2 dakika sonra yeniden başlatmak istiyor musunuz?
+ <usetemplate name="okcancelbuttons" notext="İptal" yestext="Tamam"/>
+ </notification>
+ <notification label="Bu bölgedeki herkese ileti gönderme" name="MessageRegion">
+ Bu bölgede bulunan herkese gönderilecek kısa bir duyuru yazın.
+ <form name="form">
+ <button name="OK" text="Tamam"/>
+ <button name="Cancel" text="İptal"/>
+ </form>
+ </notification>
+ <notification label="Bölgenin Erişkinlik Seviyesi Değişti" name="RegionMaturityChange">
+ Bu bölgenin erişkinlik seviyesi güncellendi.
+Değişikliğin harita üzerine yansıtılması biraz zaman alabilir.
+
+Yetişkin bölgelerine girebilmek için, Sakinlerin yaş doğrulama ya da ödeme doğrulama yoluyla Doğrulanmış bir Hesaba sahip olmaları gerekmektedir.
+ </notification>
+ <notification label="Sesli Sohbet Sürüm Uyumsuzluğu" name="VoiceVersionMismatch">
+ [APP_NAME] uygulamasının bu sürümü bu bölgedeki Sesli Sohbet özelliği ile uyumlu değil. Sesli Sohbet özelliğinin düzgün bir şekilde çalışabilmesi için [APP_NAME] uygulamasını güncellemeniz gerekiyor.
+ </notification>
+ <notification label="Nesneler Satın Alınamıyor" name="BuyObjectOneOwner">
+ Farklı sahipleri olan nesneler aynı anda satın alınamaz.
+Lütfen sadece bir nesne seçin ve tekrar deneyin.
+ </notification>
+ <notification label="İçerikler Satın Alınamıyor" name="BuyContentsOneOnly">
+ Aynı anda birden fazla nesnenin içeriği satın alınamaz.
+Lütfen sadece bir nesne seçin ve tekrar deneyin.
+ </notification>
+ <notification label="İçerikler Satın Alınamıyor" name="BuyContentsOneOwner">
+ Farklı sahipleri olan nesneler aynı anda satın alınamaz.
+Lütfen sadece bir nesne seçin ve tekrar deneyin.
+ </notification>
+ <notification name="BuyOriginal">
+ Özgün nesne [OWNER] kullanıcısından L$ [PRICE] karşılığında satın alınsın mı?
+Nesnenin sahibi siz olacaksınız.
+Åžu iÅŸlemleri yapabileceksiniz:
+ DeÄŸiÅŸtirme: [MODIFYPERM]
+ Kopyalama: [COPYPERM]
+ Tekrar satma veya Verme: [RESELLPERM]
+ <usetemplate name="okcancelbuttons" notext="İptal" yestext="Tamam"/>
+ </notification>
+ <notification name="BuyOriginalNoOwner">
+ Özgün nesne L$ [PRICE] karşılığında satın alınsın mı?
+Nesnenin sahibi siz olacaksınız.
+Åžu iÅŸlemleri yapabileceksiniz:
+ DeÄŸiÅŸtirme: [MODIFYPERM]
+ Kopyalama: [COPYPERM]
+ Tekrar satma veya Verme: [RESELLPERM]
+ <usetemplate name="okcancelbuttons" notext="İptal" yestext="Tamam"/>
+ </notification>
+ <notification name="BuyCopy">
+ Bir kopyası [OWNER] kullanıcısından L$ [PRICE] karşılığında satın alınsın mı?
+Nesne envanterinize kopyalanacak.
+Åžu iÅŸlemleri yapabileceksiniz:
+ DeÄŸiÅŸtirme: [MODIFYPERM]
+ Kopyalama: [COPYPERM]
+ Tekrar satma veya Verme: [RESELLPERM]
+ <usetemplate name="okcancelbuttons" notext="İptal" yestext="Tamam"/>
+ </notification>
+ <notification name="BuyCopyNoOwner">
+ Bir kopyası L$ [PRICE] karşılığında satın alınsın mı?
+Nesne envanterinize kopyalanacak.
+Åžu iÅŸlemleri yapabileceksiniz:
+ DeÄŸiÅŸtirme: [MODIFYPERM]
+ Kopyalama: [COPYPERM]
+ Tekrar satma veya Verme: [RESELLPERM]
+ <usetemplate name="okcancelbuttons" notext="İptal" yestext="Tamam"/>
+ </notification>
+ <notification name="BuyContents">
+ İçerik [OWNER] kullanıcısından L$ [PRICE] karşılığında satın alınsın mı?
+İçerik envanterinize kopyalanacak.
+ <usetemplate name="okcancelbuttons" notext="İptal" yestext="Tamam"/>
+ </notification>
+ <notification name="BuyContentsNoOwner">
+ İçerik L$ [PRICE] karşılığında satın alınsın mı?
+İçerik envanterinize kopyalanacak.
+ <usetemplate name="okcancelbuttons" notext="İptal" yestext="Tamam"/>
+ </notification>
+ <notification name="ConfirmPurchase">
+ Bu işlem şununla sonuçlanacak:
+[ACTION]
+
+Bu satın alma işlemine devam etmek istediğinize emin misiniz?
+ <usetemplate name="okcancelbuttons" notext="İptal" yestext="Tamam"/>
+ </notification>
+ <notification name="ConfirmPurchasePassword">
+ Bu işlem şununla sonuçlanacak:
+[ACTION]
+
+Bu satın alma işlemine devam etmek istediğinize emin misiniz?
+Lütfen parolanızı yeniden girin ve Tamam&apos;ı tıklatın.
+ <form name="form">
+ <button name="ConfirmPurchase" text="Tamam"/>
+ <button name="Cancel" text="İptal"/>
+ </form>
+ </notification>
+ <notification name="SetPickLocation">
+ Not:
+Bu seçmenin konumunu güncellediniz fakat diğer detaylar özgün değerlerini koruyacak.
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
+ <notification name="MoveInventoryFromObject">
+ &apos;Kopyalanamayan&apos; envanter öğeleri seçtiniz.
+Bu öğeler envanterinize taşınacak, kopyalanmayacak.
+
+Envanter öğesi/öğeleri taşınsın mı?
+ <usetemplate ignoretext="Bir nesneden &apos;kopyalanamayan&apos; öğeleri taşımadan önce beni uyar" name="okcancelignore" notext="İptal" yestext="Tamam"/>
+ </notification>
+ <notification name="MoveInventoryFromScriptedObject">
+ &apos;Kopyalanamayan&apos; envanter öğeleri seçtiniz. Bu öğeler envanterinize taşınacak, kopyalanmayacak.
+Bu nesnenin içinde komut dosyası bulunduğundan, bu öğelerin envanterinize taşınması komut dosyasının hatalı çalışmasına neden olabilir.
+
+Envanter öğesi/öğeleri taşınsın mı?
+ <usetemplate ignoretext="İçinde komut dosyası bulunan bir nesneyi parçalayabilecek &apos;kopyalanamayan&apos; öğeleri taşımadan önce beni uyar" name="okcancelignore" notext="İptal" yestext="Tamam"/>
+ </notification>
+ <notification name="ClickActionNotPayable">
+ Uyarı: &apos;Nesne için ödeme yap&apos; tıklama eylemi ayarlanmış fakat sadece bir komut dosyası bir para() olayı ile eklenirse çalışacak.
+ <form name="form">
+ <ignore name="ignore" text="Para() komut dosyası içermeyen bir nesne oluştururken &apos;Nesne için ödeme yap&apos; eylemi ayarladım"/>
+ </form>
+ </notification>
+ <notification name="OpenObjectCannotCopy">
+ Bu nesne içinde kopyalama izniniz olan bir öğe yok.
+ </notification>
+ <notification name="WebLaunchAccountHistory">
+ Hesap geçmişinizi görüntülemek için [http://secondlife.com/account/ Kontrol Paneli] adresine gitmek istiyor musunuz?
+ <usetemplate ignoretext="Hesap geçmişimi görüntülemek için tarayıcımı başlat" name="okcancelignore" notext="İptal" yestext="Sayfaya git"/>
+ </notification>
+ <notification name="ConfirmQuit">
+ Çıkmak istediğinize emin misiniz?
+ <usetemplate ignoretext="Çıkmadan önce doğrulama iste" name="okcancelignore" notext="Çıkma" yestext="Çık"/>
+ </notification>
+ <notification name="ConfirmRestoreToybox">
+ Bu eylem, varsayılan düğmelerinizi ve araç çubuklarınızı geri yükleyecek.
+
+Bu eylemi geri alamazsınız.
+ <usetemplate name="okcancelbuttons" notext="İptal" yestext="Tamam"/>
+ </notification>
+ <notification name="ConfirmClearAllToybox">
+ Bu eylem ile tüm düğmeler araç kutusuna döner ve araç çubuklarınız boş olur.
+
+Bu eylemi geri alamazsınız.
+ <usetemplate name="okcancelbuttons" notext="İptal" yestext="Tamam"/>
+ </notification>
+ <notification name="DeleteItems">
+ [QUESTION]
+ <usetemplate ignoretext="Öğeleri silmeden önce doğrulama iste" name="okcancelignore" notext="İptal" yestext="Tamam"/>
+ </notification>
+ <notification name="HelpReportAbuseEmailLL">
+ [http://secondlife.com/corporate/tos.php Hizmet Sözleşmesi] ve [http://secondlife.com/corporate/cs.php Topluluk Standartları] ihlallerini bildirmek için bu aracı kullanın.
+
+Bildirilen tüm kötüye kullanımlar incelenir ve çözüme ulaştırılır.
+ </notification>
+ <notification name="HelpReportAbuseSelectCategory">
+ Lütfen bu kötüye kullanım bildirimi için bir kategori seçin.
+Kategori seçimi, kötüye kullanım bildirimlerini dosyalamamıza ve işleme almamıza yardımcı olmaktadır.
+ </notification>
+ <notification name="HelpReportAbuseAbuserNameEmpty">
+ Lütfen kötüye kullanan kişinin adını yazın.
+Doğru değerlerin girilmesi, kötüye kullanım bildirimlerini dosyalamamıza ve işleme almamıza yardımcı olmaktadır.
+ </notification>
+ <notification name="HelpReportAbuseAbuserLocationEmpty">
+ Lütfen kötüye kullanımın gerçekleştiği konumu yazın.
+Doğru değerlerin girilmesi, kötüye kullanım bildirimlerini dosyalamamıza ve işleme almamıza yardımcı olmaktadır.
+ </notification>
+ <notification name="HelpReportAbuseSummaryEmpty">
+ Lütfen kötüye kullanımın nasıl gerçekleştiğini özetleyin.
+Doğru bir özetin girilmesi, kötüye kullanım bildirimlerini dosyalamamıza ve işleme almamıza yardımcı olmaktadır.
+ </notification>
+ <notification name="HelpReportAbuseDetailsEmpty">
+ Lütfen gerçekleşen kötüye kullanımı ayrıntılı bir şekilde anlatın.
+Bildirdiğiniz olayın ayrıntıları ve adlar dahil olmak üzere olabildiğince detaylı bilgi verin.
+Doğru bir anlatım yapılması, kötüye kullanım bildirimlerini dosyalamamıza ve işleme almamıza yardımcı olmaktadır.
+ </notification>
+ <notification name="HelpReportAbuseContainsCopyright">
+ DeÄŸerli Second Life Sakinimiz,
+
+Fikri mülkiyet ihlali konusunda bir bildirim yapıyorsunuz. Konuyu doğru bir şekilde bildirdiğinizden emin olun:
+
+(1) Kötüye Kullanımı Bildirme Süreci. Bir Second Life Sakininin, CopyBot ya da benzeri bir kopyalama aracı kullanma vb. yollarla, fikri mülkiyet haklarını ihlal edecek şekilde [SECOND_LIFE]&apos;ın verdiği izinleri kötüye kullandığını düşünüyorsanız bir kötüye kullanım bildirimi sunabilirsiniz. Kötüye Kullanımla Mücadele Ekibi [SECOND_LIFE] [http://secondlife.com/corporate/tos.php Hizmet Sözleşmesi] veya [http://secondlife.com/corporate/cs.php Topluluk Standartları] kurallarını ihlal eden davranışları inceleyecek ve uygun disiplin cezalarını verecektir. Ancak, Kötüye Kullanımla Mücadele Ekibi, içeriğin [SECOND_LIFE] ortamından kaldırılma taleplerine yanıt vermeyecektir.
+
+(2) DMCA veya İçerik Kaldırma Süreci. İçeriğin [SECOND_LIFE] ortamından kaldırılmasını talep etmek için, [http://secondlife.com/corporate/dmca.php DMCA İlkeleri]&apos;nde belirtildiği şekilde geçerli bir ihlal bildirimi sunmuş olmanız GEREKLİDİR.
+
+Kötüye kullanım bildirme sürecine devam etmek için, lütfen bu pencereyi kapatın ve bildiriminizi gönderme işlemini tamamlayın. &apos;CopyBot veya İzin İhlali&apos; kategorisini seçmeniz gerekebilir.
+
+Teşekkürler
+
+Linden Lab
+ </notification>
+ <notification name="FailedRequirementsCheck">
+ Aşağıda belirtilen gerekli bileşenler [FLOATER] içinde yok:
+[COMPONENTS]
+ </notification>
+ <notification label="Mevcut Aksesuarı Değiştir" name="ReplaceAttachment">
+ Vücudunuzdaki bu noktaya takılı bir nesne zaten mevcut.
+Bu nesneyi seçilen nesne ile değiştirmek istiyor musunuz?
+ <form name="form">
+ <ignore name="ignore" text="Mevcut aksesuarı seçilen öğe ile değiştir"/>
+ <button ignore="Otomatik Olarak DeÄŸiÅŸtir" name="Yes" text="Tamam"/>
+ <button ignore="Hiçbir Zaman Değiştirme" name="No" text="İptal"/>
+ </form>
+ </notification>
+ <notification label="Meşgul Durumu Uyarısı" name="BusyModePay">
+ Durumunuz Meşgul olarak ayarlanmış; bu da, bu ödemenin karşılığında teklif edilen hiçbir öğeyi almayacağınız anlamına gelir.
+
+Bu işlemi tamamlamadan önce Meşgul durumundan çıkmak ister misiniz?
+ <form name="form">
+ <ignore name="ignore" text="Meşgul durumundayken bir kişiye veya bir nesneye ödeme yapmak üzereyim."/>
+ <button ignore="Her zaman Meşgul durumundan çık" name="Yes" text="Tamam"/>
+ <button ignore="Hiçbir zaman Meşgul durumundan çıkma" name="No" text="İptal"/>
+ </form>
+ </notification>
+ <notification name="ConfirmDeleteProtectedCategory">
+ &apos;[FOLDERNAME]&apos; klasörü bir sistem klasörüdür. Sistem klasörlerini silmek kararsızlığa neden olabilir. Silmek istediğinize emin misiniz?
+ <usetemplate ignoretext="Bir sistem klasörünü silmeden önce doğrulama iste" name="okcancelignore" notext="İptal" yestext="Tamam"/>
+ </notification>
+ <notification name="ConfirmEmptyTrash">
+ Çöp kutunuzun içeriğini kalıcı olarak silmek istediğinize emin misiniz?
+ <usetemplate ignoretext="Envanter Çöp Kutusu klasörünü boşaltmadan önce doğrulama iste" name="okcancelignore" notext="İptal" yestext="Tamam"/>
+ </notification>
+ <notification name="ConfirmClearBrowserCache">
+ Seyahat, web ve arama geçmişinizi silmek istediğinize emin misiniz?
+ <usetemplate name="okcancelbuttons" notext="İptal" yestext="Tamam"/>
+ </notification>
+ <notification name="ConfirmClearCache">
+ Görüntüleyici önbelleğinizi temizlemek istediğinize emin misiniz?
+ <usetemplate name="okcancelbuttons" notext="İptal" yestext="Tamam"/>
+ </notification>
+ <notification name="ConfirmClearCookies">
+ Çerezlerinizi silmek istediğinize emin misiniz?
+ <usetemplate name="okcancelbuttons" notext="İptal" yestext="Evet"/>
+ </notification>
+ <notification name="ConfirmClearMediaUrlList">
+ Kayıtlı URL adreslerinizi silmek istediğinize emin misiniz?
+ <usetemplate name="okcancelbuttons" notext="İptal" yestext="Evet"/>
+ </notification>
+ <notification name="ConfirmEmptyLostAndFound">
+ Kaybedip Bulduklarım klasörünüzün içeriğini kalıcı olarak silmek istediğinize emin misiniz?
+ <usetemplate ignoretext="Kaybedip Bulduğum envanterler klasörünü boşaltmadan önce doğrulama iste" name="okcancelignore" notext="Hayır" yestext="Evet"/>
+ </notification>
+ <notification name="CopySLURL">
+ Aşağıdaki SLurl adresi panonuza kopyalandı:
+ [SLURL]
+
+Diğer kişilerin bu konuma kolayca erişmesini sağlamak için bu adrese bir web sayfası üzerinden bağlantı verin veya herhangi bir web tarayıcısının adres çubuğuna yapıştırarak önce siz deneyin.
+ <form name="form">
+ <ignore name="ignore" text="SLurl adresi panoma kopyalandı"/>
+ </form>
+ </notification>
+ <notification name="WLSavePresetAlert">
+ Kayıtlı ön ayarın üzerine yazmak istiyor musunuz?
+ <usetemplate name="okcancelbuttons" notext="Hayır" yestext="Evet"/>
+ </notification>
+ <notification name="WLNoEditDefault">
+ Varsayılan olarak ayarlanmış bir ön ayarı değiştiremez ve silemezsiniz.
+ </notification>
+ <notification name="WLMissingSky">
+ Bu gün döngüsü dosyası kayıp bir gökyüzü dosyasına başvuruda bulunuyor: [SKY].
+ </notification>
+ <notification name="WLRegionApplyFail">
+ Üzgünüz, bu ayarlar bölgeye uygulanamadı. Bölgeden ayrılmak ve sonra geri dönmek sorunu çözebilir. Gösterilen neden şuydu: [FAIL_REASON]
+ </notification>
+ <notification name="EnvCannotDeleteLastDayCycleKey">
+ Bu gün döngüsündeki son anahtar silinemedi çünkü boş bir gün döngünüz olamaz. Son kalan anahtarı silmek ve yenisini oluşturmaya kalkışmak yerine bunu değiştirmelisiniz.
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
+ <notification name="DayCycleTooManyKeyframes">
+ Bu gün döngüsüne daha fazla anahtar kare ekleyemezsiniz. [SCOPE] kapsamı gün döngüleri için maksimum anahtar kare sayısı [MAX] değerini aşamaz.
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
+ <notification name="EnvUpdateRate">
+ Ortam ayarlarınızı ancak her [WAIT] saniyede bir güncelleştirebilirsiniz. En azından bu kadar bekleyin ve tekrar deneyin.
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
+ <notification name="PPSaveEffectAlert">
+ İşlem Sonrası Efekti mevcut. Hala üzerine yazmak istiyor musunuz?
+ <usetemplate name="okcancelbuttons" notext="Hayır" yestext="Evet"/>
+ </notification>
+ <notification name="ChatterBoxSessionStartError">
+ [RECIPIENT] ile yeni bir sohbet oturumu başlatılamıyor.
+[REASON]
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
+ <notification name="ChatterBoxSessionEventError">
+ [EVENT]
+[REASON]
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
+ <notification name="ForceCloseChatterBoxSession">
+ [NAME] ile sürdürdüğünüz sohbet oturumunun kapatılması gerekiyor.
+[REASON]
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
+ <notification name="Cannot_Purchase_an_Attachment">
+ Bir nesne bir avatarın üzerinde takılı iken onu satın alamazsınız.
+ </notification>
+ <notification label="Borç Alma İzni Talep Etme Hakkında" name="DebitPermissionDetails">
+ Bu talebi kabul etmek, bir komut dosyasına, hesabınızdan Linden doları (L$) alma konusunda sürekli bir izin verir. Bu izni iptal etmek için, nesne sahibi nesneyi silmeli ya da nesne içindeki komut dosyalarını yeniden ayarlamalıdır.
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
+ <notification name="AutoWearNewClothing">
+ Oluşturmak üzere olduğunuz giysiyi otomatik olarak giymek ister misiniz?
+ <usetemplate ignoretext="Görünümümü düzenlerken oluşturduğum giysiyi giy" name="okcancelignore" notext="Hayır" yestext="Evet"/>
+ </notification>
+ <notification name="NotAgeVerified">
+ Second Life içinde yetişkinlere yönelik içeriğe ve bölgelere erişmek için en az 18 yaşında olmalısınız. 18 yaşından büyük olduğunuzu onaylamak için lütfen yaş doğrulama sayfamızı ziyaret edin.
+Bu adımda web tarayıcınızın başlatılacağına dikkat edin.
+
+[_URL]
+ <url name="url">
+ https://secondlife.com/my/account/verification.php
+ </url>
+ <usetemplate ignoretext="Yaşımı doğrulatmadım" name="okcancelignore" notext="İptal" yestext="Yaş Doğrulamasına Git"/>
+ </notification>
+ <notification name="Cannot enter parcel: no payment info on file">
+ Bu alanı ziyaret edebilmek için ödeme bilgilerinizin kayıtlı olması gerekir. [SECOND_LIFE] web sitesine gitmek ve bunu ayarlamak istiyor musunuz?
+
+[_URL]
+ <url name="url">
+ https://secondlife.com/account/
+ </url>
+ <usetemplate ignoretext="Ödeme bilgilerim kayıtlı değil" name="okcancelignore" notext="Hayır" yestext="Evet"/>
+ </notification>
+ <notification name="MissingString">
+ [STRING_NAME] dizesi strings.xml dosyasında yer almıyor.
+ </notification>
+ <notification name="SystemMessageTip">
+ [MESSAGE]
+ </notification>
+ <notification name="IMSystemMessageTip">
+ [MESSAGE]
+ </notification>
+ <notification name="Cancelled">
+ İptal Edildi
+ </notification>
+ <notification name="CancelledSit">
+ Oturma İptal Edildi
+ </notification>
+ <notification name="CancelledAttach">
+ Takma İptal Edildi
+ </notification>
+ <notification name="ReplacedMissingWearable">
+ Eksik giysi/vücut bölümü varsayılan ile değiştirildi.
+ </notification>
+ <notification name="GroupNotice">
+ Konu: [SUBJECT], İleti: [MESSAGE]
+ </notification>
+ <notification name="FriendOnline">
+ &lt;nolink&gt;[NAME]&lt;/nolink&gt; çevrimiçi
+ </notification>
+ <notification name="FriendOffline">
+ &lt;nolink&gt;[NAME]&lt;/nolink&gt; çevrimdışı
+ </notification>
+ <notification name="AddSelfFriend">
+ Çok iyi biri olduğunuza eminiz fakat kendinizi arkadaş olarak ekleyemezsiniz.
+ </notification>
+ <notification name="UploadingAuctionSnapshot">
+ SL dünyası içinde ve web sitesinde yer alan anlık görüntüler karşıya yükleniyor...
+(Yaklaşık 5 dakika sürecektir.)
+ </notification>
+ <notification name="UploadPayment">
+ Karşıya yüklemek için L$ [AMOUNT] ödediniz.
+ </notification>
+ <notification name="UploadWebSnapshotDone">
+ Web sitesinde yer alan anlık görüntülerin karşıya yüklenmesi tamamlandı.
+ </notification>
+ <notification name="UploadSnapshotDone">
+ SL dünyası içinde yer alan anlık görüntülerin karşıya yüklenmesi tamamlandı.
+ </notification>
+ <notification name="TerrainDownloaded">
+ Terrain.raw karşıdan yüklendi
+ </notification>
+ <notification name="GestureMissing">
+ Hmm. [NAME] mimiği veri tabanında yok.
+ </notification>
+ <notification name="UnableToLoadGesture">
+ [NAME] mimiği karşıya yüklenemiyor.
+ </notification>
+ <notification name="LandmarkMissing">
+ Yer imi veri tabanında yok.
+ </notification>
+ <notification name="UnableToLoadLandmark">
+ Yer imi karşıya yüklenemiyor. Lütfen tekrar deneyin.
+ </notification>
+ <notification name="CapsKeyOn">
+ Caps Lock tuşunuz açık.
+Parolanızı yanlış yazmanıza sebep olabilir.
+ </notification>
+ <notification name="NotecardMissing">
+ Not kartı veri tabanında yok.
+ </notification>
+ <notification name="NotecardNoPermissions">
+ Bu not kartını görüntüleme izniniz yok.
+ </notification>
+ <notification name="RezItemNoPermissions">
+ Nesneyi oluşturmak için yetersiz izin.
+ </notification>
+ <notification name="IMAcrossParentEstates">
+ Ana gayrimenkuller arasında Aİ gönderilemiyor.
+ </notification>
+ <notification name="TransferInventoryAcrossParentEstates">
+ Ana gayrimenkuller arasında envanter aktarımı yapılamıyor.
+ </notification>
+ <notification name="UnableToLoadNotecard">
+ Not kartı karşıya yüklenemiyor.
+Lütfen tekrar deneyin.
+ </notification>
+ <notification name="ScriptMissing">
+ Komut dosyası veri tabanında yok.
+ </notification>
+ <notification name="ScriptNoPermissions">
+ Komut dosyasını görüntülemek için yetersiz izin.
+ </notification>
+ <notification name="UnableToLoadScript">
+ Komut dosyası karşıya yüklenemiyor. Lütfen tekrar deneyin.
+ </notification>
+ <notification name="IncompleteInventory">
+ Teklif etmek istediğiniz içeriğin tamamı henüz yerel olarak kullanılabilir değil. Lütfen bu öğeleri bir dakika içerisinde tekrar teklif etmeyi deneyin.
+ </notification>
+ <notification name="CannotModifyProtectedCategories">
+ KorunmuÅŸ kategorileri deÄŸiÅŸtiremezsiniz.
+ </notification>
+ <notification name="CannotRemoveProtectedCategories">
+ Korunmuş kategorileri kaldıramazsınız.
+ </notification>
+ <notification name="UnableToBuyWhileDownloading">
+ Nesne verileri karşıdan yüklenirken satın alınamıyor.
+Lütfen tekrar deneyin.
+ </notification>
+ <notification name="UnableToLinkWhileDownloading">
+ Nesne verileri karşıdan yüklenirken bağlanılamıyor.
+Lütfen tekrar deneyin.
+ </notification>
+ <notification name="CannotBuyObjectsFromDifferentOwners">
+ Aynı anda sadece bir kullanıcının sahip olduğu nesneleri satın alabilirsiniz.
+Lütfen tek bir nesne seçin.
+ </notification>
+ <notification name="ObjectNotForSale">
+ Bu nesne satılık değil.
+ </notification>
+ <notification name="EnteringGodMode">
+ Yönetici ayrıcalıklarına sahip moda giriliyor, seviye [LEVEL]
+ </notification>
+ <notification name="LeavingGodMode">
+ Yönetici ayrıcalıklarına sahip moddan çıkılıyor, seviye [LEVEL]
+ </notification>
+ <notification name="CopyFailed">
+ Bunu kopyalama izniniz yok.
+ </notification>
+ <notification name="InventoryAccepted">
+ [NAME] envanter teklifinizi aldı.
+ </notification>
+ <notification name="InventoryDeclined">
+ [NAME] envanter teklifinizi reddetti.
+ </notification>
+ <notification name="ObjectMessage">
+ [NAME]: [MESSAGE]
+ </notification>
+ <notification name="CallingCardAccepted">
+ Arama kartınız kabul edildi.
+ </notification>
+ <notification name="CallingCardDeclined">
+ Arama kartınız reddedildi.
+ </notification>
+ <notification name="TeleportToLandmark">
+ &apos;[NAME]&apos; gibi konumlara ışınlanmak için &quot;Yerler&quot; düğmesine tıklayın,
+ sonra açılan pencerede Yer İmleri sekmesini seçin. Herhangi bir
+ yer iminin üzerine tıklayarak bunu seçin ve ardından pencerenin en altındaki &apos;Işınla&apos; düğmesine tıklayın.
+ (Ayrıca yer imine çift tıklayabilir veya sağ tıklayarak
+ &apos;Işınla&apos; seçimini yapabilirsiniz.)
+ </notification>
+ <notification name="TeleportToPerson">
+ &apos;[NAME]&apos; gibi sakinlerle bağlantıya geçmek için &quot;Kişiler&quot; düğmesine tıklayın, açılan pencereden bir Sakin seçin ve sonra
+ pencerenin altında &apos;Anlık İleti&quot; üzerine tıklayın.
+ (Listede adlarına çift tıklayarak veya sağ tıklayıp &quot;Anlık İleti&quot;yi seçerek de bunu yapabilirsiniz.)
+ </notification>
+ <notification name="CantSelectLandFromMultipleRegions">
+ Sunucunun sınırları dışındaki arazi seçilemez.
+Daha küçük bir arazi parçası seçmeyi deneyin.
+ </notification>
+ <notification name="SearchWordBanned">
+ Arama sorgunuzdaki bazı kelimeler Topluluk Standartları&apos;nda belirtilen içerik kısıtlamaları nedeniyle aramaya dahil edilmedi.
+ </notification>
+ <notification name="NoContentToSearch">
+ Lütfen arama yapmak için en az bir içerik türü seçin (Genel, Orta Seviye veya Yetişkin)
+ </notification>
+ <notification name="SystemMessage">
+ [MESSAGE]
+ </notification>
+ <notification name="PaymentReceived">
+ [MESSAGE]
+ </notification>
+ <notification name="PaymentSent">
+ [MESSAGE]
+ </notification>
+ <notification name="PaymentFailure">
+ [MESSAGE]
+ </notification>
+ <notification name="EventNotification">
+ Etkinlik Bildirimi
+
+[NAME]
+[DATE]
+ <form name="form">
+ <button name="Details" text="Ayrıntl"/>
+ <button name="Cancel" text="İptal"/>
+ </form>
+ </notification>
+ <notification name="TransferObjectsHighlighted">
+ Bu parsel üzerinde bulunan ve parseli satın alan kişiye aktarılacak olan tüm nesneler vurgulanmıştır.
+
+* Aktarılacak ağaç ve çimler vurgulanmamıştır.
+ <form name="form">
+ <button name="Done" text="Tamamlandı"/>
+ </form>
+ </notification>
+ <notification name="DeactivatedGesturesTrigger">
+ Aynı tetikleyiciye sahip mimikler devre dışı bırakıldı:
+[NAMES]
+ </notification>
+ <notification name="NoQuickTime">
+ Apple Quick Time yazılımı sisteminizde yüklü görünmüyor.
+Destekleyen parsellerde akış ortamını görüntülemek istiyorsanız [http://www.apple.com/quicktime QuickTime sitesine] gitmeli ve QuickTime Player&apos;ı yüklemelisiniz.
+ </notification>
+ <notification name="NoPlugin">
+ &quot;[MIME_TYPE]&quot; mime türüne uygun bir Ortam Eklentisi bulunamadı. Bu türdeki ortam dosyaları kullanılamayacak.
+ </notification>
+ <notification name="MediaPluginFailed">
+ Aşağıdaki Ortam Eklentisi arızalandı:
+ [PLUGIN]
+
+Sorun yaşamaya devam ederseniz lütfen eklentiyi yeniden yükleyin veya satıcı ile iletişim kurun.
+ <form name="form">
+ <ignore name="ignore" text="Bir Ortam Eklentisi çalıştırılamadı"/>
+ </form>
+ </notification>
+ <notification name="OwnedObjectsReturned">
+ Seçili arazi parseli üzerinde sahip olduğunuz nesneler envanterinize iade edildi.
+ </notification>
+ <notification name="OtherObjectsReturned">
+ [NAME] adlı kullanıcının sahip olduğu seçili arazi parseli üzerinde bulunan nesneler kullanıcının envanterine iade edildi.
+ </notification>
+ <notification name="OtherObjectsReturned2">
+ &apos;[NAME]&apos; adlı Sakinin sahip olduğu seçili arazi parseli üzerinde bulunan nesneler kendi sahiplerine iade edildi.
+ </notification>
+ <notification name="GroupObjectsReturned">
+ [GROUPNAME] ile paylaşılan seçili arazi parseli üzerinde bulunan nesneler kendi sahiplerinin envanterlerine iade edildi.
+Devredilmiş nesnelerin aktarılabilenleri önceki sahiplerine iade edildi.
+Gruba devredilen nesnelerden aktarılamayanlar silindi.
+ </notification>
+ <notification name="UnOwnedObjectsReturned">
+ Seçili parsel üzerinde size ait OLMAYAN nesneler kendi sahiplerine iade edildi.
+ </notification>
+ <notification name="ServerObjectMessage">
+ [NAME] adlı kişiden gelen ileti:
+&lt;nolink&gt;[MSG]&lt;/nolink&gt;
+ </notification>
+ <notification name="NotSafe">
+ Bu arazide hasar özelliği etkin.
+Burada zarar görebilirsiniz. Hayatınızı kaybederseniz ana konumunuza ışınlanacaksınız.
+ </notification>
+ <notification name="NoFly">
+ Bu alanda uçma özelliği devre dışı.
+Burada uçamazsınız.
+ </notification>
+ <notification name="PushRestricted">
+ Bu alan başkalarını dışarı itmeye izin vermiyor. Bu arazinin sahibi değilseniz başkalarını dışarı itemezsiniz.
+ </notification>
+ <notification name="NoVoice">
+ Bu alanda sesli sohbet özelliği devre dışı. Kimsenin konuşmasını duyamayacaksınız.
+ </notification>
+ <notification name="NoBuild">
+ Bu alanda inşa etme özelliği devre dışı. Burada nesne inşa edemez ve oluşturamazsınız.
+ </notification>
+ <notification name="SeeAvatars">
+ Bu parsel, avatarları ve metin sohbetini başka bir parselden saklar. Parselin dışındaki diğer sakinleri göremezsiniz, dışardakiler de sizi göremez. 0. kanaldaki normal metin sohbeti de engellenmiştir.
+ </notification>
+ <notification name="ScriptsStopped">
+ Bir yönetici bu bölgedeki komut dosyalarını geçici olarak durdurdu.
+ </notification>
+ <notification name="ScriptsNotRunning">
+ Bu bölgede hiçbir komut dosyası çalışmıyor.
+ </notification>
+ <notification name="NoOutsideScripts">
+ Bu arazide dış komut dosyaları devre dışı.
+
+Arazi sahibine ait olanlar dışında hiçbir komut dosyası çalışmayacak.
+ </notification>
+ <notification name="ClaimPublicLand">
+ İçinde bulunduğunuz Bölgede sadece kamuya ait araziler üzerinde hak talebinde bulunabilirsiniz.
+ </notification>
+ <notification name="RegionTPAccessBlocked">
+ Erişkinlik Seviyesi ayarlarınızdan dolayı bu Bölgeye giremezsiniz. Yaşınızı doğrulatmanız ve/veya en son Görüntüleyici&apos;yi yüklemeniz gerekebilir.
+
+Lütfen bu erişkinlik Seviyesi ile erişilecek alanlar hakkında ayrıntılı bilgi edinmek için Bilgi Bankası&apos;na gidin.
+ </notification>
+ <notification name="URBannedFromRegion">
+ Bu bölgeye erişiminiz yasaklandı.
+ </notification>
+ <notification name="NoTeenGridAccess">
+ Hesabınız 18 yaş altı kullanıcılar için hazırlanmış olan ağa bağlanamıyor.
+ </notification>
+ <notification name="ImproperPaymentStatus">
+ Bu bölgeye girmek için gerekli ödeme durumuna sahip değilsiniz.
+ </notification>
+ <notification name="MustGetAgeRgion">
+ Bu bölgeye girebilmek için yaş doğrulamanızın yapılmış olması gerekir.
+ </notification>
+ <notification name="MustGetAgeParcel">
+ Bu parsele girebilmek için yaş doğrulamanızın yapılmış olması gerekir.
+ </notification>
+ <notification name="NoDestRegion">
+ Seçili hedef bölge yok.
+ </notification>
+ <notification name="NotAllowedInDest">
+ Hedef konuma girme izniniz yok.
+ </notification>
+ <notification name="RegionParcelBan">
+ Bölge değiştirerek yasaklı bir parsele giriş yapamazsınız. Başka bir yol deneyin.
+ </notification>
+ <notification name="TelehubRedirect">
+ Bir ışınlanma istasyonuna yeniden yönlendirildiniz.
+ </notification>
+ <notification name="CouldntTPCloser">
+ Hedef konuma daha yakın bir bölgeye ışınlanılamadı.
+ </notification>
+ <notification name="TPCancelled">
+ Işınlanma iptal edildi.
+ </notification>
+ <notification name="FullRegionTryAgain">
+ Girmeye çalıştığınız bölge şu anda dolu.
+Lütfen biraz sonra tekrar deneyin.
+ </notification>
+ <notification name="GeneralFailure">
+ Genel arıza.
+ </notification>
+ <notification name="RoutedWrongRegion">
+ Yanlış bölgeye yönlendirildi. Lütfen tekrar deneyin.
+ </notification>
+ <notification name="NoValidAgentID">
+ Geçerli bir aracı kimliği yok.
+ </notification>
+ <notification name="NoValidSession">
+ Geçerli bir oturum kimliği yok.
+ </notification>
+ <notification name="NoValidCircuit">
+ Geçerli bir devre kodu yok.
+ </notification>
+ <notification name="NoValidTimestamp">
+ Geçerli bir zaman damgası yok.
+ </notification>
+ <notification name="NoPendingConnection">
+ Beklemedeki bağlantı oluşturulamıyor.
+ </notification>
+ <notification name="InternalUsherError">
+ Aracı öncüsüne bağlanılmaya çalışılırken dahili bir hata oluştu.
+ </notification>
+ <notification name="NoGoodTPDestination">
+ Bu bölgede iyi bir ışınlanma hedef konumu bulunamıyor.
+ </notification>
+ <notification name="InternalErrorRegionResolver">
+ Bölge çözümleyicisi etkinleştirilmeye çalışılırken dahili bir hata oluştu.
+ </notification>
+ <notification name="NoValidLanding">
+ Geçerli bir iniş noktası bulunamadı.
+ </notification>
+ <notification name="NoValidParcel">
+ Geçerli bir parsel bulunamadı.
+ </notification>
+ <notification name="ObjectGiveItem">
+ Sahibinin [NAME_SLURL] olduğu, &lt;nolink&gt;[OBJECTFROMNAME]&lt;/nolink&gt; adındaki bir nesne size [OBJECTTYPE] türündeki bu nesneyi verdi:
+&lt;nolink&gt;[ITEM_SLURL]&lt;/nolink&gt;
+ <form name="form">
+ <button name="Keep" text="Sakla"/>
+ <button name="Discard" text="At"/>
+ <button name="Mute" text="Sahibi Engelle"/>
+ </form>
+ </notification>
+ <notification name="OwnObjectGiveItem">
+ &lt;nolink&gt;[OBJECTFROMNAME]&lt;/nolink&gt; adındaki nesneniz size [OBJECTTYPE] türündeki bu nesneyi verdi:
+&lt;nolink&gt;[ITEM_SLURL]&lt;/nolink&gt;
+ <form name="form">
+ <button name="Keep" text="Sakla"/>
+ <button name="Discard" text="At"/>
+ </form>
+ </notification>
+ <notification name="UserGiveItem">
+ [NAME_SLURL] size [OBJECTTYPE] türündeki nesneyi verdi:
+[ITEM_SLURL]
+ <form name="form">
+ <button name="Show" text="Göster"/>
+ <button name="Discard" text="At"/>
+ <button name="Mute" text="Engelle"/>
+ </form>
+ </notification>
+ <notification name="GodMessage">
+ [NAME]
+
+[MESSAGE]
+ </notification>
+ <notification name="JoinGroup">
+ [MESSAGE]
+ <form name="form">
+ <button name="Join" text="Katıl"/>
+ <button name="Decline" text="Reddet"/>
+ <button name="Info" text="Bilgi"/>
+ </form>
+ </notification>
+ <notification name="TeleportOffered">
+ [NAME_SLURL] size kendi konumuna ışınlanmayı teklif etti:
+
+[MESSAGE] - [MATURITY_STR] &lt;icon&gt;[MATURITY_ICON]&lt;/icon&gt;
+ <form name="form">
+ <button name="Teleport" text="Işınla"/>
+ <button name="Cancel" text="İptal"/>
+ </form>
+ </notification>
+ <notification name="TeleportOfferSent">
+ Işınlanma teklifi [TO_NAME] adlı kişiye gönderildi
+ </notification>
+ <notification name="GotoURL">
+ [MESSAGE]
+[URL]
+ <form name="form">
+ <button name="Later" text="Sonra"/>
+ <button name="GoNow..." text="Åžimdi Git..."/>
+ </form>
+ </notification>
+ <notification name="OfferFriendship">
+ [NAME_SLURL] arkadaşlık teklif ediyor.
+
+[MESSAGE]
+
+(Varsayılan olarak, birbirinizin çevrimiçi olduğunu görebileceksiniz.)
+ <form name="form">
+ <button name="Accept" text="Kabul Et"/>
+ <button name="Decline" text="Reddet"/>
+ </form>
+ </notification>
+ <notification name="FriendshipOffered">
+ [TO_NAME] adlı kişiye arkadaşlık teklif ettiniz
+ </notification>
+ <notification name="OfferFriendshipNoMessage">
+ [NAME_SLURL] arkadaşlık teklif ediyor.
+
+(Varsayılan olarak, birbirinizin çevrimiçi olduğunu görebileceksiniz.)
+ <form name="form">
+ <button name="Accept" text="Kabul Et"/>
+ <button name="Decline" text="Reddet"/>
+ </form>
+ </notification>
+ <notification name="FriendshipAccepted">
+ &lt;nolink&gt;[NAME]&lt;/nolink&gt; arkadaşlık teklifinizi kabul etti.
+ </notification>
+ <notification name="FriendshipDeclined">
+ &lt;nolink&gt;[NAME]&lt;/nolink&gt; arkadaşlık teklifinizi reddetti.
+ </notification>
+ <notification name="FriendshipAcceptedByMe">
+ Arkadaşlık teklifi kabul edildi.
+ </notification>
+ <notification name="FriendshipDeclinedByMe">
+ Arkadaşlık teklifi reddedildi.
+ </notification>
+ <notification name="OfferCallingCard">
+ [NAME] size arama kartı teklif ediyor.
+Kabul ettiğiniz takdirde, bu Sakine hızlı bir şekilde Aİ gönderebilmeniz için envanterinize bir yer imi eklenecek.
+ <form name="form">
+ <button name="Accept" text="Kabul Et"/>
+ <button name="Decline" text="Reddet"/>
+ </form>
+ </notification>
+ <notification name="RegionRestartMinutes">
+ Bu bölge [MINUTES] dakika içinde yeniden başlatılacak.
+Bu bölgede kalmaya devam ederseniz oturumunuz sonlandırılacak.
+ </notification>
+ <notification name="RegionRestartSeconds">
+ Bu bölge [SECONDS] saniye içinde yeniden başlatılacak.
+Bu bölgede kalmaya devam ederseniz oturumunuz sonlandırılacak.
+ </notification>
+ <notification name="LoadWebPage">
+ [URL] web sayfası yüklensin mi?
+
+[MESSAGE]
+
+Åžu nesneden: &lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;, sahibi: [NAME]?
+ <form name="form">
+ <button name="Gotopage" text="Sayfaya git"/>
+ <button name="Cancel" text="İptal"/>
+ </form>
+ </notification>
+ <notification name="FailedToFindWearableUnnamed">
+ [TYPE] veri tabanında bulunamadı.
+ </notification>
+ <notification name="FailedToFindWearable">
+ [DESC] adlı [TYPE] veri tabanında bulunamadı.
+ </notification>
+ <notification name="InvalidWearable">
+ Giymeye çalıştığınız öğe Görüntüleyicinizin okuyamadığı bir özellik kullanıyor. Bu öğeyi giymek için lütfen [APP_NAME] sürümünüzü yükseltin.
+ </notification>
+ <notification name="ScriptQuestion">
+ &apos;&lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;&apos;, &apos;[NAME]&apos; adlı kişiye ait bir nesne, şunu yapmak istiyor:
+
+[QUESTIONS]
+Kabul ediyor musunuz?
+ <form name="form">
+ <button name="Yes" text="Evet"/>
+ <button name="No" text="Hayır"/>
+ <button name="Mute" text="Engelle"/>
+ </form>
+ </notification>
+ <notification name="ScriptQuestionCaution">
+ &apos;[NAME]&apos; adlı kişiye ait &apos;&lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;&apos; adındaki bir nesne şunu yapmak istiyor:
+
+[QUESTIONS]
+Bu nesneye ya da onu oluşturan kişiye güvenmiyorsanız, bu talebi reddetmelisiniz.
+
+Talep kabul edilsin mi?
+ <form name="form">
+ <button name="Grant" text="Kabul Et"/>
+ <button name="Deny" text="Reddet"/>
+ <button name="Details" text="Ayrıntılar..."/>
+ </form>
+ </notification>
+ <notification name="ScriptDialog">
+ [NAME] adlı kişiye ait &apos;&lt;nolink&gt;[TITLE]&lt;/nolink&gt;&apos;
+[MESSAGE]
+ <form name="form">
+ <button name="Mute" text="Engelle"/>
+ <button name="Ignore" text="Yok say"/>
+ </form>
+ </notification>
+ <notification name="ScriptDialogGroup">
+ [GROUPNAME] grubuna ait &apos;&lt;nolink&gt;[TITLE]&lt;/nolink&gt;&apos;
+[MESSAGE]
+ <form name="form">
+ <button name="Mute" text="Engelle"/>
+ <button name="Ignore" text="Yok say"/>
+ </form>
+ </notification>
+ <notification name="BuyLindenDollarSuccess">
+ Ödeme yaptığınız için teşekkürler!
+
+İşlem tamamlandığında L$ bakiyeniz güncellenecektir. İşlem 20 dakikadan daha uzun sürerse, işlem iptal edilebilir. Bu durumda ödenen miktar US$ bakiyenize iade edilecektir.
+
+Ödemenin durumunu [http://secondlife.com/account/ Kontrol Paneli] üzerinde İşlem Geçmişi sayfanızdan kontrol edebilirsiniz.
+ </notification>
+ <notification name="FirstOverrideKeys">
+ Hareket tuşlarınız şu anda bir nesnenin kontrolünde.
+Ok tuşlarını ya da AWSD tuşlarını deneyin.
+Bazı nesneleri (örneğin silahları) kullanmak için fare üzerinden görünüme geçmeniz gerekir.
+Bunu yapmak için &apos;M&apos; tuşuna basın.
+ </notification>
+ <notification name="FirstSandbox">
+ Burası korumalı bir alandır ve Sakinlerin inşa etmeyi öğrenmelerine yardımcı olmayı amaçlamaktadır.
+
+Burada inşa ettiğiniz şeyler burayı terk ettiğinizde silinir, bu sebeple sağ tıklatıp &apos;Al&apos; seçeneğini seçerek oluşturduğunuz şeyi envanterinize taşımayı unutmayın.
+ </notification>
+ <notification name="MaxListSelectMessage">
+ Bu listeden en fazla [MAX_SELECT] öğe seçebilirsiniz.
+ </notification>
+ <notification name="VoiceInviteP2P">
+ [NAME] sizi bir Sesli Sohbete davet ediyor.
+Katılmak için Kabul Et&apos;i, daveti geri çevirmek için ise Reddet&apos;i tıklatın. Arayan kişiyi engellemek için Engelle&apos;yi tıklatın.
+ <form name="form">
+ <button name="Accept" text="Kabul Et"/>
+ <button name="Decline" text="Reddet"/>
+ <button name="Mute" text="Engelle"/>
+ </form>
+ </notification>
+ <notification name="AutoUnmuteByIM">
+ [NAME] adlı kişiye bir anlık ileti gönderildi ve otomatik olarak engeli kaldırıldı.
+ </notification>
+ <notification name="AutoUnmuteByMoney">
+ [NAME] adlı kişiye para verildi ve otomatik olarak engeli kaldırıldı.
+ </notification>
+ <notification name="AutoUnmuteByInventory">
+ [NAME] adlı kişiye envanter teklif edildi ve otomatik olarak engeli kaldırıldı.
+ </notification>
+ <notification name="VoiceInviteGroup">
+ [NAME], [GROUP] grubu ile bir Sesli Sohbet&apos;e katıldı.
+Katılmak için Kabul Et&apos;i, daveti geri çevirmek için ise Reddet&apos;i tıklatın. Arayan kişiyi engellemek için Engelle&apos;yi tıklatın.
+ <form name="form">
+ <button name="Accept" text="Kabul Et"/>
+ <button name="Decline" text="Reddet"/>
+ <button name="Mute" text="Engelle"/>
+ </form>
+ </notification>
+ <notification name="VoiceInviteAdHoc">
+ [NAME] konferans yoluyla bir sesli sohbete katıldı.
+Katılmak için Kabul Et&apos;i, daveti geri çevirmek için ise Reddet&apos;i tıklatın. Arayan kişiyi engellemek için Engelle&apos;yi tıklatın.
+ <form name="form">
+ <button name="Accept" text="Kabul Et"/>
+ <button name="Decline" text="Reddet"/>
+ <button name="Mute" text="Engelle"/>
+ </form>
+ </notification>
+ <notification name="InviteAdHoc">
+ [NAME] sizi bir konferans görüşmesine davet ediyor.
+Sohbete katılmak için Kabul Et&apos;i, daveti geri çevirmek için ise Reddet&apos;i tıklatın. Arayan kişiyi engellemek için Engelle&apos;yi tıklatın.
+ <form name="form">
+ <button name="Accept" text="Kabul Et"/>
+ <button name="Decline" text="Reddet"/>
+ <button name="Mute" text="Engelle"/>
+ </form>
+ </notification>
+ <notification name="VoiceChannelFull">
+ Katılmaya çalıştığınız sesli arama [VOICE_CHANNEL_NAME] maksimum kapasitesine ulaştı. Lütfen daha sonra tekrar deneyin.
+ </notification>
+ <notification name="ProximalVoiceChannelFull">
+ Üzgünüz. Bu alan sesli sohbet için maksimum kapasitesini aştı. Lütfen başka bir alanda sesli sohbet yapmayı deneyin.
+ </notification>
+ <notification name="VoiceChannelDisconnected">
+ [VOICE_CHANNEL_NAME] ile bağlantınız kesildi. Şimdi Yakındaki bir Sesli Sohbete yeniden bağlanılacaksınız.
+ </notification>
+ <notification name="VoiceChannelDisconnectedP2P">
+ [VOICE_CHANNEL_NAME] aramayı sonlandırdı. Şimdi Yakındaki bir Sesli Sohbete yeniden bağlanılacaksınız.
+ </notification>
+ <notification name="P2PCallDeclined">
+ [VOICE_CHANNEL_NAME] aramanızı reddetti. Şimdi Yakındaki bir Sesli Sohbete yeniden bağlanılacaksınız.
+ </notification>
+ <notification name="P2PCallNoAnswer">
+ [VOICE_CHANNEL_NAME] aramanızı kabul etmek için müsait değil. Şimdi Yakındaki bir Sesli Sohbete yeniden bağlanılacaksınız.
+ </notification>
+ <notification name="VoiceChannelJoinFailed">
+ [VOICE_CHANNEL_NAME] ile bağlantı kurulamadı, lütfen daha sonra tekrar deneyin. Şimdi Yakındaki bir Sesli Sohbete yeniden bağlanılacaksınız.
+ </notification>
+ <notification name="VoiceLoginRetry">
+ Sizin için bir ses kanalı oluşturuyoruz. Bu işlem bir dakika kadar sürebilir.
+ </notification>
+ <notification name="VoiceEffectsExpired">
+ Abone olduğunuz Ses Şekillerinden birinin ya da daha fazlasının süresi dolmuş.
+Aboneliğinizi yenilemek için [[URL] burayı tıklatın].
+ </notification>
+ <notification name="VoiceEffectsExpiredInUse">
+ Etkin Ses Şeklinin süresi dolmuş, normal ses ayarlarınız uygulandı.
+Aboneliğinizi yenilemek için [[URL] burayı tıklatın].
+ </notification>
+ <notification name="VoiceEffectsWillExpire">
+ Abone olduğunuz Ses Şekillerinden birinin ya da daha fazlasının süresi [INTERVAL] gün içinde dolacak.
+Aboneliğinizi yenilemek için [[URL] burayı tıklatın].
+ </notification>
+ <notification name="VoiceEffectsNew">
+ Yeni Ses Şekilleri kullanılabilir!
+ </notification>
+ <notification name="Cannot enter parcel: not a group member">
+ Sadece belli bir grubun üyeleri bu alanı ziyaret edebilir.
+ </notification>
+ <notification name="Cannot enter parcel: banned">
+ Parsele giriş yapamazsınız, erişiminiz yasaklandı.
+ </notification>
+ <notification name="Cannot enter parcel: not on access list">
+ Parsele giriş yapamazsınız, erişim listesinde yer almıyorsunuz.
+ </notification>
+ <notification name="VoiceNotAllowed">
+ [VOICE_CHANNEL_NAME] kanalındaki sesli sohbete bağlanmak için gerekli izne sahip değilsiniz.
+ </notification>
+ <notification name="VoiceCallGenericError">
+ [VOICE_CHANNEL_NAME] kanalındaki sesli sohbete bağlanmaya çalışılırken bir hata oluştu. Lütfen daha sonra tekrar deneyin.
+ </notification>
+ <notification name="UnsupportedCommandSLURL">
+ Tıklattığınız SLurl desteklenmiyor.
+ </notification>
+ <notification name="BlockedSLURL">
+ Güvenilmeyen bir tarayıcıdan bir SLurl alındı ve güvenliğiniz için engellendi.
+ </notification>
+ <notification name="ThrottledSLURL">
+ Güvenilmeyen bir tarayıcıdan kısa bir süre içinde birden fazla SLurl alındı.
+Güvenliğiniz için birkaç saniye engellenecek.
+ </notification>
+ <notification name="IMToast">
+ [MESSAGE]
+ <form name="form">
+ <button name="respondbutton" text="Yanıtla"/>
+ </form>
+ </notification>
+ <notification name="ConfirmCloseAll">
+ Tüm Anlık İletileri kapatmak istediğinize emin misiniz?
+ <usetemplate ignoretext="Tüm Anlık İletileri kapatmadan önce doğrulama iste." name="okcancelignore" notext="İptal" yestext="Tamam"/>
+ </notification>
+ <notification name="AttachmentSaved">
+ Aksesuar kaydedildi.
+ </notification>
+ <notification name="UnableToFindHelpTopic">
+ Bu öğe için yardım başlığı bulunamıyor.
+ </notification>
+ <notification name="ObjectMediaFailure">
+ Sunucu Hatası: Ortam güncelleme ya da alma başarısız oldu.
+&apos;[ERROR]&apos;
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
+ <notification name="TextChatIsMutedByModerator">
+ Yazılı sohbetiniz moderatör tarafından engellendi.
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
+ <notification name="VoiceIsMutedByModerator">
+ Sesli sohbetiniz moderatör tarafından engellendi.
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
+ <notification name="UploadCostConfirmation">
+ Bu karşıya yükleme işleminin maliyeti L$[PRICE] olacak, karşıya yüklemeye devam etmek istiyor musunuz?
+ <usetemplate name="okcancelbuttons" notext="İptal" yestext="Karşıya Yükle"/>
+ </notification>
+ <notification name="ConfirmClearTeleportHistory">
+ Işınlanma geçmişinizi silmek istediğinize emin misiniz?
+ <usetemplate name="okcancelbuttons" notext="İptal" yestext="Tamam"/>
+ </notification>
+ <notification name="BottomTrayButtonCanNotBeShown">
+ Seçilen düğme şu anda gösterilemiyor.
+Yeterli yer olduğunda düğme gösterilecek.
+ </notification>
+ <notification name="ShareNotification">
+ Paylaşılacak sakinleri seç.
+ </notification>
+ <notification name="MeshUploadError">
+ [LABEL] karşıya yüklenemedi: [MESSAGE] [IDENTIFIER]
+
+Ayrıntılar için günlük dosyasına bakın.
+ </notification>
+ <notification name="MeshUploadPermError">
+ Karşıya örgü yükleme izinleri talep edilirken hata oluştu.
+ </notification>
+ <notification name="RegionCapabilityRequestError">
+ Bölge özelliği &apos;[CAPABILITY]&apos; alınamadı.
+ </notification>
+ <notification name="ShareItemsConfirmation">
+ Aşağıdaki öğeleri paylaşmak istediğinize emin misiniz?
+
+&lt;nolink&gt;[ITEMS]&lt;/nolink&gt;
+
+Paylaşmanın yapılacağı Sakinler:
+
+[RESIDENTS]
+ <usetemplate name="okcancelbuttons" notext="İptal" yestext="Tamam"/>
+ </notification>
+ <notification name="ItemsShared">
+ Öğeler başarılı bir şekilde paylaşıldı.
+ </notification>
+ <notification name="DeedToGroupFail">
+ Gruba devretme başarısız oldu.
+ </notification>
+ <notification name="ReleaseLandThrottled">
+ [PARCEL_NAME] parseli ÅŸu anda terkedilemez.
+ </notification>
+ <notification name="ReleasedLandWithReclaim">
+ [AREA] m² alana sahip &apos;[PARCEL_NAME]&apos; parseli serbest bırakıldı.
+
+Başkalarına satışa çıkarılmadan önce L$0 karşılığında geri almak için [RECLAIM_PERIOD] saat süreniz olacak.
+ </notification>
+ <notification name="ReleasedLandNoReclaim">
+ [AREA] m² alana sahip &apos;[PARCEL_NAME]&apos; parseli serbest bırakıldı.
+
+Artık herkes tarafından satın alınabilir.
+ </notification>
+ <notification name="AvatarRezNotification">
+ ( [EXISTENCE] saniyedir hayatta )
+&apos;[NAME]&apos; adlı avatar [TIME] saniye sonra bulut şeklinden kurtuldu.
+ </notification>
+ <notification name="AvatarRezSelfBakedDoneNotification">
+ ( [EXISTENCE] saniyedir hayatta )
+Dış görünümünüzün kaydedilmesi [TIME] saniye sonra tamamlandı.
+ </notification>
+ <notification name="AvatarRezSelfBakedUpdateNotification">
+ ( [EXISTENCE] saniyedir hayatta )
+[TIME] saniye sonra görünümünüzün bir güncellemesini gönderdiniz.
+[STATUS]
+ </notification>
+ <notification name="AvatarRezCloudNotification">
+ ( [EXISTENCE] saniyedir hayatta )
+&apos;[NAME]&apos; adlı avatar bulut şekline döndü.
+ </notification>
+ <notification name="AvatarRezArrivedNotification">
+ ( [EXISTENCE] saniyedir hayatta )
+&apos;[NAME]&apos; adlı avatar göründü.
+ </notification>
+ <notification name="AvatarRezLeftCloudNotification">
+ ( [EXISTENCE] saniyedir hayatta )
+&apos;[NAME]&apos; adlı avatar bulut şeklinde [TIME] saniye göründükten sonra ayrıldı.
+ </notification>
+ <notification name="AvatarRezEnteredAppearanceNotification">
+ ( [EXISTENCE] saniyedir hayatta )
+&apos;[NAME]&apos; adlı avatar görünüm moduna girdi.
+ </notification>
+ <notification name="AvatarRezLeftAppearanceNotification">
+ ( [EXISTENCE] saniyedir hayatta )
+&apos;[NAME]&apos; adlı avatar görünüm modundan çıktı.
+ </notification>
+ <notification name="NoConnect">
+ [PROTOCOL] [HOSTID] kullanarak bağlantı kurma konusunda sorun yaşıyoruz.
+Lütfen ağ ve güvenlik duvarı ayarlarınızı kontrol edin.
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
+ <notification name="NoVoiceConnect">
+ Ses sunucunuz ile bağlantı kurma konusunda sorun yaşıyoruz.
+
+[HOSTID]
+
+Ses bağlantıları kullanılamayacak.
+Lütfen ağ ve güvenlik duvarı ayarlarınızı kontrol edin.
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
+ <notification name="AvatarRezLeftNotification">
+ ( [EXISTENCE] saniyedir hayatta )
+&apos;[NAME]&apos; adlı avatar tam olarak yüklenmiş bir şekilde ayrıldı.
+ </notification>
+ <notification name="AvatarRezSelfBakedTextureUploadNotification">
+ ( [EXISTENCE] saniyedir hayatta )
+ &apos;[BODYREGION]&apos; için [RESOLUTION] çözünürlükte kaydedilmiş bir dokuyu [TIME] saniye sonra karşıya yüklediniz.
+ </notification>
+ <notification name="AvatarRezSelfBakedTextureUpdateNotification">
+ ( [EXISTENCE] saniyedir hayatta )
+ &apos;[BODYREGION]&apos; için [RESOLUTION] çözünürlükte kaydedilmiş bir dokuyu [TIME] saniye sonra yerel olarak güncellediniz.
+ </notification>
+ <notification name="ConfirmLeaveCall">
+ Bu aramadan çıkmak istediğinize emin misiniz?
+ <usetemplate ignoretext="Aramadan çıkmadan önce doğrulama iste" name="okcancelignore" notext="Hayır" yestext="Evet"/>
+ </notification>
+ <notification name="ConfirmMuteAll">
+ Bir grup aramasındaki tüm katılımcıları engellemeyi seçtiniz.
+Bu, siz aramadan çıktıktan sonra bile, aramaya daha sonra katılacak tüm sakinlerin
+engellenmesine yol açacak.
+
+Herkes engellensin mi?
+ <usetemplate ignoretext="Bir grup aramasındaki tüm katılımcıları engellemeden önce doğrulama iste" name="okcancelignore" notext="İptal" yestext="Tamam"/>
+ </notification>
+ <notification label="Sohbet" name="HintChat">
+ Sohbete katılmak için aşağıdaki sohbet alanına yazın.
+ </notification>
+ <notification label="AyaÄŸa Kalk" name="HintSit">
+ Ayağa kalkmak ve oturur konumdan çıkmak için Ayağa Kalk düğmesini tıklatın.
+ </notification>
+ <notification label="KonuÅŸ" name="HintSpeak">
+ Mikrofonunuzu açıp kapatmak için Konuş düğmesini tıklatın.
+
+Ses kontrol panelini görmek için yukarı ok tuşunu tıklatın.
+
+Konuş düğmesinin gizlenmesi ses özelliğini devre dışı bırakır.
+ </notification>
+ <notification label="Dünyayı Keşfet" name="HintDestinationGuide">
+ Hedef Kılavuzu, keşfedecek binlerce yeni yer barındırır. Bir konum seçin ve keşfetmeye başlamak için Işınla&apos;yı tıklatın.
+ </notification>
+ <notification label="Yan Panel" name="HintSidePanel">
+ Envanterinize, dış görünümünüze, profillerinize ve daha fazlasına hızlı erişim için yan paneli kullanın.
+ </notification>
+ <notification label="Hareket Et" name="HintMove">
+ Yürümek ya da koşmak için Hareket Panelini açın ve gezmek için yön oklarını tıklatın. Klavyenizdeki ok tuşlarını da kullanabilirsiniz.
+ </notification>
+ <notification label="" name="HintMoveClick">
+ 1. Yürümek için tıklayın
+Zemindeki herhangi bir noktaya gitmek için orayı tıklatın.
+
+2. Görünümü Döndürmek için Tıklatın ve Sürükleyin
+Görünümünüzü döndürmek için dünya üzerindeki herhangi bir yeri tıklatın ve sürükleyin.
+ </notification>
+ <notification label="Ekran Adı" name="HintDisplayName">
+ Özelleştirebileceğiniz ekran adını burada ayarlayın. Ekran Adı, benzersiz ve değiştirilemeyen kullanıcı adınıza ek olarak kullanılır. Diğer insanların adlarını nasıl gördüğünüzü tercihlerinizden değiştirebilirsiniz.
+ </notification>
+ <notification label="Görünüm" name="HintView">
+ Kamera görünümünüzü değiştirmek için Yörünge Değişimi ve Kamerayı Çevirme denetimlerini kullanın. Escape tuşuna basarak ya da yürüyerek görünümü sıfırlayın.
+ </notification>
+ <notification label="Envanter" name="HintInventory">
+ Öğeleri bulmak için envanterinize bakın. Yeni eklenen öğeler Son Eklenenler sekmesinden kolayca bulunabilir.
+ </notification>
+ <notification label="Linden Dolarınız var!" name="HintLindenDollar">
+ L$ hesabınızın mevcut bakiyesini buradan görebilirsiniz. Daha fazla Linden Doları satın almak için L$ Satın Al&apos;ı tıklatın.
+ </notification>
+ <notification name="LowMemory">
+ Bellek havuzunuz yetersiz. Çökmeyi önlemek için SL&apos;nin bazı işlevleri devre dışı bırakıldı. Lütfen diğer uygulamaları kapatın. Bu durum devam ederse SL&apos;yi yeniden başlatın.
+ </notification>
+ <notification name="ForceQuitDueToLowMemory">
+ Yetersiz bellek nedeniyle SL 30 saniye içerisinde kapanacak.
+ </notification>
+ <notification name="PopupAttempt">
+ Açılır bir pencerenin açılması engellendi.
+ <form name="form">
+ <ignore name="ignore" text="Tüm açılır pencerelere izin ver"/>
+ <button name="open" text="Açılır pencereyi aç"/>
+ </form>
+ </notification>
+ <notification name="SOCKS_NOT_PERMITTED">
+ SOCKS 5 proxy&apos;si &quot;[HOST]:[PORT]&quot; bağlantıyı reddetti; kural kümesi izin vermiyor.
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
+ <notification name="SOCKS_CONNECT_ERROR">
+ SOCKS 5 proxy&apos;si &quot;[HOST]:[PORT]&quot; bağlantıyı reddetti, TCP kanalını açamadı.
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
+ <notification name="SOCKS_NOT_ACCEPTABLE">
+ SOCKS 5 proxy&apos;si &quot;[HOST]:[PORT]&quot; seçilen kimlik doğrulama sistemini reddetti.
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
+ <notification name="SOCKS_AUTH_FAIL">
+ SOCKS 5 proxy&apos;si &quot;[HOST]:[PORT]&quot; kimlik bilgilerinizin geçersiz olduğunu bildirdi.
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
+ <notification name="SOCKS_UDP_FWD_NOT_GRANTED">
+ SOCKS 5 proxy&apos;si &quot;[HOST]:[PORT]&quot; UDP iliÅŸkilendirme talebini reddetti.
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
+ <notification name="SOCKS_HOST_CONNECT_FAILED">
+ SOCKS 5 proxy sunucusu &quot;[HOST]:[PORT]&quot; ile bağlantı kurulamadı.
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
+ <notification name="SOCKS_UNKNOWN_STATUS">
+ &quot;[HOST]:[PORT]&quot; sunucusu ile bilinmeyen proxy hatası.
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
+ <notification name="SOCKS_INVALID_HOST">
+ Geçersiz SOCKS proxy adresi veya &quot;[HOST]:[PORT]&quot; portu.
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
+ <notification name="SOCKS_BAD_CREDS">
+ Geçersiz SOCKS 5 kullanıcı adı veya parolası.
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
+ <notification name="PROXY_INVALID_HTTP_HOST">
+ Geçersiz HTTP proxy adresi veya &quot;[HOST]:[PORT]&quot; portu.
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
+ <notification name="PROXY_INVALID_SOCKS_HOST">
+ Geçersiz SOCKS proxy adresi veya &quot;[HOST]:[PORT]&quot; portu.
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
+ <notification name="ChangeProxySettings">
+ Proxy ayarları [APP_NAME] uygulamasını yeniden başlattıktan sonra geçerli olur.
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
+ <notification name="AuthRequest">
+ &apos;[REALM]&apos; erişim alanında &apos;&lt;nolink&gt;[HOST_NAME]&lt;/nolink&gt;&apos; üzerinde bulunan site bir kullanıcı adı ve parola gerektiriyor.
+ <form name="form">
+ <input name="username" text="Kullanıcı Adı"/>
+ <input name="password" text="Parola"/>
+ <button name="ok" text="Gönder"/>
+ <button name="cancel" text="İptal Et"/>
+ </form>
+ </notification>
+ <notification label="" name="NoClassifieds">
+ İlan oluşturma ve düzenleme sadece Gelişmiş modda kullanılabilir. Uygulamadan çıkıp, mod değiştirmek ister misiniz? Mod seçici oturum açma ekranında bulunabilir.
+ <usetemplate name="okcancelbuttons" notext="Çıkma" yestext="Çık"/>
+ </notification>
+ <notification label="" name="NoGroupInfo">
+ Grup oluşturma ve düzenleme sadece Gelişmiş modda kullanılabilir. Uygulamadan çıkıp, mod değiştirmek ister misiniz? Mod seçici oturum açma ekranında bulunabilir.
+ <usetemplate name="okcancelbuttons" notext="Çıkma" yestext="Çık"/>
+ </notification>
+ <notification label="" name="NoPlaceInfo">
+ Yer profili görüntülemesi sadece Gelişmiş modda kullanılabilir. Uygulamadan çıkıp, mod değiştirmek ister misiniz? Mod seçici oturum açma ekranında bulunabilir.
+ <usetemplate name="okcancelbuttons" notext="Çıkma" yestext="Çık"/>
+ </notification>
+ <notification label="" name="NoPicks">
+ Seçmeleri oluşturma ve düzenleme sadece Gelişmiş modda kullanılabilir. Uygulamadan çıkıp, mod değiştirmek ister misiniz? Mod seçici oturum açma ekranında bulunabilir.
+ <usetemplate name="okcancelbuttons" notext="Çıkma" yestext="Çık"/>
+ </notification>
+ <notification label="" name="NoWorldMap">
+ Dünya haritasının görüntülenmesi sadece Gelişmiş modda kullanılabilir. Uygulamadan çıkıp, mod değiştirmek ister misiniz? Mod seçici oturum açma ekranında bulunabilir.
+ <usetemplate name="okcancelbuttons" notext="Çıkma" yestext="Çık"/>
+ </notification>
+ <notification label="" name="NoVoiceCall">
+ Sesli aramalar sadece Gelişmiş modda kullanılabilir. Oturumunuzu kapatıp, mod değiştirmek ister misiniz?
+ <usetemplate name="okcancelbuttons" notext="Çıkma" yestext="Çık"/>
+ </notification>
+ <notification label="" name="NoAvatarShare">
+ Paylaşma sadece Gelişmiş modda kullanılabilir. Oturumunuzu kapatıp, mod değiştirmek ister misiniz?
+ <usetemplate name="okcancelbuttons" notext="Çıkma" yestext="Çık"/>
+ </notification>
+ <notification label="" name="NoAvatarPay">
+ Diğer sakinlere ödeme yapma sadece Gelişmiş modda kullanılabilir. Oturumunuzu kapatıp, mod değiştirmek ister misiniz?
+ <usetemplate name="okcancelbuttons" notext="Çıkma" yestext="Çık"/>
+ </notification>
+ <notification label="" name="NoInventory">
+ Envanter görüntülemesi sadece Gelişmiş modda kullanılabilir. Oturumunuzu kapatıp, mod değiştirmek ister misiniz?
+ <usetemplate name="okcancelbuttons" notext="Çıkma" yestext="Çık"/>
+ </notification>
+ <notification label="" name="NoAppearance">
+ Görünüm düzenleyici sadece Gelişmiş modda kullanılabilir. Oturumunuzu kapatıp, mod değiştirmek ister misiniz?
+ <usetemplate name="okcancelbuttons" notext="Çıkma" yestext="Çık"/>
+ </notification>
+ <notification label="" name="NoSearch">
+ Arama sadece Gelişmiş modda kullanılabilir. Oturumunuzu kapatıp, mod değiştirmek ister misiniz?
+ <usetemplate name="okcancelbuttons" notext="Çıkma" yestext="Çık"/>
+ </notification>
+ <notification label="" name="ConfirmHideUI">
+ Bu eylem tüm menü öğelerini ve düğmelerini gizler. Bunları geri almak için [SHORTCUT] üzerine tekrar tıklayın.
+ <usetemplate ignoretext="KA&apos;ni gizlemeden önce onayla" name="okcancelignore" notext="İptal" yestext="Tamam"/>
+ </notification>
+ <global name="UnsupportedGLRequirements">
+ [APP_NAME] uygulaması için gerekli donanım gereksinimlerine sahip olmadığınız görünüyor. [APP_NAME] çoklu doku desteği sunan bir OpenGL grafik kartı gerektiriyor. Eğer grafik kartınız bu özellikteyse, grafik kartınızın en son sürücülerine ve işletim sisteminiz için gerekli Service Pack ve yamalara sahip olup olmadığınızı kontrol etmeyi deneyebilirsiniz.
+
+Sorun yaşamaya devam ederseniz, lütfen [SUPPORT_SITE] bölümünü ziyaret edin.
+ </global>
+ <global name="UnsupportedCPUAmount">
+ 796
+ </global>
+ <global name="UnsupportedRAMAmount">
+ 510
+ </global>
+ <global name="UnsupportedGPU">
+ - Grafik kartınız minimum gereksinimleri karşılamıyor.
+ </global>
+ <global name="UnsupportedRAM">
+ - Sistem belleğiniz minimum gereksinimleri karşılamıyor.
+ </global>
+ <global name="You can only set your &apos;Home Location&apos; on your land or at a mainland Infohub.">
+ Bir arazi parçasına sahipseniz burayı ana konumunuz olarak ayarlayabilirsiniz.
+Bir araziye sahip değilseniz, Harita&apos;ya bakıp &quot;Bilgi İstasyonu&quot; olarak işaretlenen yerleri bulabilirsiniz.
+ </global>
+ <global name="You died and have been teleported to your home location">
+ Hayatınızı kaybettiniz ve ana konumunuza ışınlandınız.
+ </global>
+</notifications>
diff --git a/indra/newview/skins/default/xui/tr/panel_active_object_row.xml b/indra/newview/skins/default/xui/tr/panel_active_object_row.xml
new file mode 100644
index 0000000000..b03ce3ebe5
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_active_object_row.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_activeim_row">
+ <text name="object_name">
+ İsimsiz Nesne
+ </text>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_adhoc_control_panel.xml b/indra/newview/skins/default/xui/tr/panel_adhoc_control_panel.xml
new file mode 100644
index 0000000000..602818de94
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_adhoc_control_panel.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_im_control_panel">
+ <layout_stack name="vertical_stack">
+ <layout_panel name="call_btn_panel">
+ <button label="Ara" name="call_btn"/>
+ </layout_panel>
+ <layout_panel name="end_call_btn_panel">
+ <button label="Aramadan Ayrıl" name="end_call_btn"/>
+ </layout_panel>
+ <layout_panel name="voice_ctrls_btn_panel">
+ <button label="Ses Denetimleri" name="voice_ctrls_btn"/>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_avatar_list_item.xml b/indra/newview/skins/default/xui/tr/panel_avatar_list_item.xml
new file mode 100644
index 0000000000..7542778aca
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_avatar_list_item.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="avatar_list_item">
+ <string name="FormatSeconds">
+ [COUNT]sn
+ </string>
+ <string name="FormatMinutes">
+ [COUNT]dk
+ </string>
+ <string name="FormatHours">
+ [COUNT]sa
+ </string>
+ <string name="FormatDays">
+ [COUNT]gn
+ </string>
+ <string name="FormatWeeks">
+ [COUNT]hf
+ </string>
+ <string name="FormatMonths">
+ [COUNT]ay
+ </string>
+ <string name="FormatYears">
+ [COUNT]yl
+ </string>
+ <text name="avatar_name" value="(yükleniyor)"/>
+ <text name="last_interaction" value="0sn"/>
+ <icon name="permission_edit_theirs_icon" tool_tip="Bu arkadaşınızın nesnelerini düzenleyebilirsiniz"/>
+ <icon name="permission_edit_mine_icon" tool_tip="Bu arkadaşınız nesnelerinizi düzenleyebilir, silebilir veya alabilir"/>
+ <icon name="permission_map_icon" tool_tip="Bu arkadaşınız haritada sizi bulabilir"/>
+ <icon name="permission_online_icon" tool_tip="Bu arkadaşınız çevrimiçi olduğunuzda sizi görebilir"/>
+ <button name="profile_btn" tool_tip="Profili göster"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_avatar_tag.xml b/indra/newview/skins/default/xui/tr/panel_avatar_tag.xml
new file mode 100644
index 0000000000..81e04379a1
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_avatar_tag.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="avatar_tag_notification">
+ <panel name="msg_caption">
+ <text name="sender_tag_name">
+ Angela Tester
+ </text>
+ <text name="tag_time" value="23:30"/>
+ </panel>
+ <text_editor name="msg_text">
+ Hızlı kahverengi tilki tembel köpeğin üzerinden atlıyor.
+ </text_editor>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_block_list_sidetray.xml b/indra/newview/skins/default/xui/tr/panel_block_list_sidetray.xml
new file mode 100644
index 0000000000..0464b7ec07
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_block_list_sidetray.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="block_list_panel">
+ <text name="title_text">
+ Listeyi Engelle
+ </text>
+ <scroll_list name="blocked" tool_tip="Åžu anda engellenmiÅŸ olan Sakinler listesi"/>
+ <button label="Kişiyi engelle" name="Block resident..." tool_tip="Engellenecek bir Sakin seç"/>
+ <button label="Nesneyi ada göre engelle" name="Block object by name..." tool_tip="Ada göre engellenecek bir nesne seç"/>
+ <button label="Engellemeyi Kaldır" name="Unblock" tool_tip="Engelleme listesinden Sakini veya nesneyi kaldır"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_body_parts_list_item.xml b/indra/newview/skins/default/xui/tr/panel_body_parts_list_item.xml
new file mode 100644
index 0000000000..f991c3b688
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_body_parts_list_item.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="wearable_item">
+ <text name="item_name" value="..."/>
+ <panel name="btn_lock" tool_tip="Düzenleme izniniz yok"/>
+ <panel name="btn_edit_panel">
+ <button name="btn_edit" tool_tip="Bu şekli düzenle"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_bodyparts_list_button_bar.xml b/indra/newview/skins/default/xui/tr/panel_bodyparts_list_button_bar.xml
new file mode 100644
index 0000000000..6c2478cdb7
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_bodyparts_list_button_bar.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="clothing_list_button_bar_panel">
+ <button label="DeÄŸiÅŸtir" name="switch_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_bottomtray.xml b/indra/newview/skins/default/xui/tr/panel_bottomtray.xml
new file mode 100644
index 0000000000..26118d8b39
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_bottomtray.xml
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="bottom_tray">
+ <string name="DragIndicationImageName" value="Accordion_ArrowOpened_Off"/>
+ <string name="SpeakBtnToolTip" value="Mikrofonu açar/kapatır"/>
+ <string name="VoiceControlBtnToolTip" value="Ses kontrol panelini gösterir/gizler"/>
+ <layout_stack name="toolbar_stack">
+ <layout_panel name="speak_panel">
+ <talk_button name="talk">
+ <speak_button label="KonuÅŸ" label_selected="KonuÅŸ" name="speak_btn"/>
+ </talk_button>
+ </layout_panel>
+ <layout_panel name="gesture_panel">
+ <gesture_combo_list label="Mimik" name="Gesture" tool_tip="Mimikleri gösterir/gizler"/>
+ </layout_panel>
+ <layout_panel name="movement_panel">
+ <bottomtray_button label="Hareket Et" name="movement_btn" tool_tip="Hareket kontrollerini gösterir/gizler"/>
+ </layout_panel>
+ <layout_panel name="cam_panel">
+ <bottomtray_button label="Görünüm" name="camera_btn" tool_tip="Kamera kontrollerini gösterir/gizler"/>
+ </layout_panel>
+ <layout_panel name="snapshot_panel">
+ <bottomtray_button name="snapshots" tool_tip="Anlık görüntü al"/>
+ </layout_panel>
+ <layout_panel name="build_btn_panel">
+ <bottomtray_button label="İnşa Et" name="build_btn" tool_tip="İnşa Et Aracını gösterir/gizler"/>
+ </layout_panel>
+ <layout_panel name="search_btn_panel">
+ <bottomtray_button label="Ara" name="search_btn" tool_tip="Aramayı gösterir/gizler"/>
+ </layout_panel>
+ <layout_panel name="world_map_btn_panel">
+ <bottomtray_button label="Harita" name="world_map_btn" tool_tip="Dünya Haritasını gösterir/gizler"/>
+ </layout_panel>
+ <layout_panel name="mini_map_btn_panel">
+ <bottomtray_button label="Mini-Harita" name="mini_map_btn" tool_tip="Mini Haritayı gösterir/gizler"/>
+ </layout_panel>
+ <layout_panel name="im_well_panel">
+ <chiclet_im_well name="im_well">
+ <button name="Unread IM messages" tool_tip="Sohbetler"/>
+ </chiclet_im_well>
+ </layout_panel>
+ <layout_panel name="notification_well_panel">
+ <chiclet_notification name="notification_well">
+ <button name="Unread" tool_tip="Bildirimler"/>
+ </chiclet_notification>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_bottomtray_lite.xml b/indra/newview/skins/default/xui/tr/panel_bottomtray_lite.xml
new file mode 100644
index 0000000000..5d7006af2f
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_bottomtray_lite.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="bottom_tray_lite">
+ <layout_stack name="toolbar_stack_lite">
+ <layout_panel name="gesture_panel">
+ <gesture_combo_list label="Mimik" name="Gesture" tool_tip="Mimikleri gösterir/gizler"/>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_chat_header.xml b/indra/newview/skins/default/xui/tr/panel_chat_header.xml
new file mode 100644
index 0000000000..7916bf5155
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_chat_header.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="im_header" name="im_header">
+ <text name="time_box" value="23:30"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_chiclet_bar.xml b/indra/newview/skins/default/xui/tr/panel_chiclet_bar.xml
new file mode 100644
index 0000000000..a1e8190bbc
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_chiclet_bar.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="chiclet_bar">
+ <layout_stack name="toolbar_stack">
+ <layout_panel name="im_well_panel">
+ <chiclet_im_well name="im_well">
+ <button name="Unread IM messages" tool_tip="Sohbetler"/>
+ </chiclet_im_well>
+ </layout_panel>
+ <layout_panel name="notification_well_panel">
+ <chiclet_notification name="notification_well">
+ <button name="Unread" tool_tip="Bildirimler"/>
+ </chiclet_notification>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_classified_info.xml b/indra/newview/skins/default/xui/tr/panel_classified_info.xml
new file mode 100644
index 0000000000..d412a03e32
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_classified_info.xml
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_classified_info">
+ <panel.string name="type_mature">
+ Orta
+ </panel.string>
+ <panel.string name="type_pg">
+ Genel İçerik
+ </panel.string>
+ <panel.string name="l$_price">
+ L$[PRICE]
+ </panel.string>
+ <panel.string name="click_through_text_fmt">
+ [TELEPORT] ışınlama, [MAP] harita, [PROFILE] profil
+ </panel.string>
+ <panel.string name="date_fmt">
+ [mthnum,datetime,slt]/[day,datetime,slt]/[year,datetime,slt]
+ </panel.string>
+ <panel.string name="auto_renew_on">
+ Etkin
+ </panel.string>
+ <panel.string name="auto_renew_off">
+ Devre dışı
+ </panel.string>
+ <text name="title" value="İlan Bilgisi"/>
+ <scroll_container name="profile_scroll">
+ <panel name="scroll_content_panel">
+ <text_editor name="classified_name" value="[ad]"/>
+ <text name="classified_location_label" value="Konum:"/>
+ <text_editor name="classified_location" value="[yükleniyor...]"/>
+ <text name="content_type_label" value="İçerik Türü:"/>
+ <text_editor name="content_type" value="[içerik türü]"/>
+ <text name="category_label" value="Kategori:"/>
+ <text_editor name="category" value="[kategori]"/>
+ <text name="creation_date_label" value="OluÅŸturma tarihi:"/>
+ <text_editor name="creation_date" tool_tip="OluÅŸturma tarihi" value="[tarih]"/>
+ <text name="price_for_listing_label" value="İlan ücreti:"/>
+ <text_editor name="price_for_listing" tool_tip="İlan ücreti." value="[ücret]"/>
+ <layout_stack name="descr_stack">
+ <layout_panel name="clickthrough_layout_panel">
+ <text name="click_through_label" value="Tıklamalar:"/>
+ <text_editor name="click_through_text" tool_tip="Tıklama verileri" value="[tıklamalar]"/>
+ </layout_panel>
+ <layout_panel name="price_layout_panel">
+ <text name="auto_renew_label" value="Otomatik yenileme:"/>
+ <text name="auto_renew" value="Etkin"/>
+ </layout_panel>
+ <layout_panel name="descr_layout_panel">
+ <text name="classified_desc_label" value="Açıklama:"/>
+ <text_editor name="classified_desc" value="[açıklama]"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+ </scroll_container>
+ <panel name="buttons">
+ <layout_stack name="layout_stack1">
+ <layout_panel name="layout_panel1">
+ <button label="Işınla" name="teleport_btn"/>
+ </layout_panel>
+ <layout_panel name="show_on_map_btn_lp">
+ <button label="Harita" name="show_on_map_btn"/>
+ </layout_panel>
+ <layout_panel name="edit_btn_lp">
+ <button label="Düzenle" name="edit_btn"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_clothing_list_button_bar.xml b/indra/newview/skins/default/xui/tr/panel_clothing_list_button_bar.xml
new file mode 100644
index 0000000000..bb5930ee79
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_clothing_list_button_bar.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="clothing_list_button_bar_panel">
+ <button label="Ekle +" name="add_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_clothing_list_item.xml b/indra/newview/skins/default/xui/tr/panel_clothing_list_item.xml
new file mode 100644
index 0000000000..e60e291ee8
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_clothing_list_item.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="wearable_item">
+ <button name="btn_delete" tool_tip="Dış görünümden çıkar"/>
+ <text name="item_name" value="..."/>
+ <panel name="btn_lock" tool_tip="Düzenleme izniniz yok"/>
+ <panel name="btn_edit_panel">
+ <button name="btn_edit" tool_tip="Bu giyilebilir ögeyi düzenle"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_cof_wearables.xml b/indra/newview/skins/default/xui/tr/panel_cof_wearables.xml
new file mode 100644
index 0000000000..7d70177553
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_cof_wearables.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="cof_wearables">
+ <accordion name="cof_wearables_accordion">
+ <accordion_tab name="tab_clothing" title="Giysiler"/>
+ <accordion_tab name="tab_attachments" title="Aksesuarlar"/>
+ <accordion_tab name="tab_body_parts" title="Vücut Bölümleri"/>
+ </accordion>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_deletable_wearable_list_item.xml b/indra/newview/skins/default/xui/tr/panel_deletable_wearable_list_item.xml
new file mode 100644
index 0000000000..47703136b0
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_deletable_wearable_list_item.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="deletable_wearable_item">
+ <button name="btn_delete" tool_tip="Dış görünümden çıkar"/>
+ <text name="item_name" value="..."/>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_dummy_clothing_list_item.xml b/indra/newview/skins/default/xui/tr/panel_dummy_clothing_list_item.xml
new file mode 100644
index 0000000000..28e034a357
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_dummy_clothing_list_item.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="dummy_clothing_item">
+ <text name="item_name" value="..."/>
+ <panel name="btn_add_panel">
+ <button name="btn_add" tool_tip="Bu türden ilave öğeler ekle"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_edit_alpha.xml b/indra/newview/skins/default/xui/tr/panel_edit_alpha.xml
new file mode 100644
index 0000000000..e3ba806b0d
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_edit_alpha.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_alpha_panel">
+ <scroll_container name="avatar_alpha_color_panel_scroll">
+ <panel name="avatar_alpha_color_panel">
+ <texture_picker label="Düşük Alfa" name="Lower Alpha" tool_tip="Bir resim seçmek için tıklayın"/>
+ <texture_picker label="Yüksek Alfa" name="Upper Alpha" tool_tip="Bir resim seçmek için tıklayın"/>
+ <texture_picker label="Baş Alfası" name="Head Alpha" tool_tip="Bir resim seçmek için tıklayın"/>
+ <texture_picker label="Göz Alfası" name="Eye Alpha" tool_tip="Bir resim seçmek için tıklayın"/>
+ <texture_picker label="Saç Alfası" name="Hair Alpha" tool_tip="Bir resim seçmek için tıklayın"/>
+ </panel>
+ </scroll_container>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_edit_classified.xml b/indra/newview/skins/default/xui/tr/panel_edit_classified.xml
new file mode 100644
index 0000000000..7584b754f1
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_edit_classified.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="İlanı Düzenle" name="panel_edit_classified">
+ <panel.string name="location_notice">
+ (kaydedildikten sonra güncelleştirilir)
+ </panel.string>
+ <string name="publish_label">
+ Yayınla
+ </string>
+ <string name="save_label">
+ Kaydet
+ </string>
+ <text name="title">
+ İlanı Düzenle
+ </text>
+ <scroll_container name="profile_scroll">
+ <panel name="scroll_content_panel">
+ <panel name="snapshot_panel">
+ <icon label="" name="edit_icon" tool_tip="Bir görüntü seçmek için tıklayın"/>
+ </panel>
+ <text name="Name:">
+ Başlık:
+ </text>
+ <text name="description_label">
+ Açıklama:
+ </text>
+ <text name="location_label">
+ Konum:
+ </text>
+ <text name="classified_location">
+ yükleniyor...
+ </text>
+ <button label="Geçerli Konuma Ayarla" name="set_to_curr_location_btn"/>
+ <text name="category_label" value="Kategori:"/>
+ <text name="content_type_label" value="İçerik türü:"/>
+ <icons_combo_box label="Genel İçerik" name="content_type">
+ <icons_combo_box.item label="Orta Seviyede İçerik" name="mature_ci" value="Orta Seviyede"/>
+ <icons_combo_box.item label="Genel İçerik" name="pg_ci" value="PG"/>
+ </icons_combo_box>
+ <check_box label="Her hafta otomatik yenile" name="auto_renew"/>
+ <text name="price_for_listing_label" value="İlan ücreti:"/>
+ <spinner label="L$" name="price_for_listing" tool_tip="İlan ücreti." value="50"/>
+ </panel>
+ </scroll_container>
+ <panel label="bottom_panel" name="bottom_panel">
+ <layout_stack name="bottom_panel_ls">
+ <layout_panel name="save_changes_btn_lp">
+ <button label="[LABEL]" name="save_changes_btn"/>
+ </layout_panel>
+ <layout_panel name="show_on_map_btn_lp">
+ <button label="İptal" name="cancel_btn"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_edit_eyes.xml b/indra/newview/skins/default/xui/tr/panel_edit_eyes.xml
new file mode 100644
index 0000000000..42f62b6bbe
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_edit_eyes.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_eyes_panel">
+ <panel name="avatar_eye_color_panel">
+ <texture_picker label="İris" name="Iris" tool_tip="Bir resim seçmek için tıklayın"/>
+ </panel>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="eyes_main_tab" title="Gözler"/>
+ </accordion>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_edit_gloves.xml b/indra/newview/skins/default/xui/tr/panel_edit_gloves.xml
new file mode 100644
index 0000000000..be89e94bbf
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_edit_gloves.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_gloves_panel">
+ <panel name="avatar_gloves_color_panel">
+ <texture_picker label="Doku" name="Fabric" tool_tip="Bir resim seçmek için tıklayın"/>
+ <color_swatch label="Renk/Ton" name="Color/Tint" tool_tip="Renk seçiciyi açmak için tıklayın"/>
+ </panel>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="gloves_main_tab" title="Eldivenler"/>
+ </accordion>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_edit_hair.xml b/indra/newview/skins/default/xui/tr/panel_edit_hair.xml
new file mode 100644
index 0000000000..f33a6d6402
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_edit_hair.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_hair_panel">
+ <panel name="avatar_hair_color_panel">
+ <texture_picker label="Doku" name="Texture" tool_tip="Bir resim seçmek için tıklayın"/>
+ </panel>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="hair_color_tab" title="Renk"/>
+ <accordion_tab name="hair_style_tab" title="Stil"/>
+ <accordion_tab name="hair_eyebrows_tab" title="KaÅŸlar"/>
+ <accordion_tab name="hair_facial_tab" title="Yüz"/>
+ </accordion>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_edit_jacket.xml b/indra/newview/skins/default/xui/tr/panel_edit_jacket.xml
new file mode 100644
index 0000000000..10bc4278db
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_edit_jacket.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_jacket_panel">
+ <panel name="avatar_jacket_color_panel">
+ <texture_picker label="Üst Doku" name="Upper Fabric" tool_tip="Bir resim seçmek için tıklayın"/>
+ <texture_picker label="Alt Doku" name="Lower Fabric" tool_tip="Bir resim seçmek için tıklayın"/>
+ <color_swatch label="Renk/Ton" name="Color/Tint" tool_tip="Renk seçiciyi açmak için tıklayın"/>
+ </panel>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="jacket_main_tab" title="Ceket"/>
+ </accordion>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_edit_pants.xml b/indra/newview/skins/default/xui/tr/panel_edit_pants.xml
new file mode 100644
index 0000000000..06e1b7b4ab
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_edit_pants.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_pants_panel">
+ <panel name="avatar_pants_color_panel">
+ <texture_picker label="Doku" name="Fabric" tool_tip="Bir resim seçmek için tıklayın"/>
+ <color_swatch label="Renk/Ton" name="Color/Tint" tool_tip="Renk seçiciyi açmak için tıklayın"/>
+ </panel>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="pants_main_tab" title="Pantolon"/>
+ </accordion>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_edit_physics.xml b/indra/newview/skins/default/xui/tr/panel_edit_physics.xml
new file mode 100644
index 0000000000..98dbfd8e42
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_edit_physics.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_physics_panel">
+ <panel label="" name="accordion_panel">
+ <accordion name="physics_accordion">
+ <accordion_tab name="physics_breasts_updown_tab" title="Göğüs Hoplaması"/>
+ <accordion_tab name="physics_breasts_inout_tab" title="Göğüs Çatalı"/>
+ <accordion_tab name="physics_breasts_leftright_tab" title="Göğüs Sallanması"/>
+ <accordion_tab name="physics_belly_tab" title="Göbek Hoplaması"/>
+ <accordion_tab name="physics_butt_tab" title="Popo Hoplaması"/>
+ <accordion_tab name="physics_butt_leftright_tab" title="Popo Sallanması"/>
+ <accordion_tab name="physics_advanced_tab" title="GeliÅŸmiÅŸ Parametreler"/>
+ </accordion>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_edit_pick.xml b/indra/newview/skins/default/xui/tr/panel_edit_pick.xml
new file mode 100644
index 0000000000..98b02d27df
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_edit_pick.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Favori Düzenle" name="panel_edit_pick">
+ <panel.string name="location_notice">
+ (kaydedildikten sonra güncelleştirilir)
+ </panel.string>
+ <text name="title">
+ Seçme Düzenle
+ </text>
+ <scroll_container name="profile_scroll">
+ <panel name="scroll_content_panel">
+ <icon label="" name="edit_icon" tool_tip="Bir görüntü seçmek için tıklayın"/>
+ <text name="Name:">
+ Başlık:
+ </text>
+ <text name="description_label">
+ Açıklama:
+ </text>
+ <text name="location_label">
+ Konum:
+ </text>
+ <text name="pick_location">
+ yükleniyor...
+ </text>
+ <button label="Geçerli Konuma Ayarla" name="set_to_curr_location_btn"/>
+ </panel>
+ </scroll_container>
+ <panel label="bottom_panel" name="bottom_panel">
+ <layout_stack name="layout_stack1">
+ <layout_panel name="layout_panel1">
+ <button label="Seçme Kaydet" name="save_changes_btn"/>
+ </layout_panel>
+ <layout_panel name="layout_panel2">
+ <button label="İptal" name="cancel_btn"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_edit_profile.xml b/indra/newview/skins/default/xui/tr/panel_edit_profile.xml
new file mode 100644
index 0000000000..21f4e419bc
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_edit_profile.xml
@@ -0,0 +1,68 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Profil Düzenlemesi" name="edit_profile_panel">
+ <string name="CaptionTextAcctInfo">
+ [ACCTTYPE]
+[PAYMENTINFO] [AGEVERIFICATION]
+ </string>
+ <string name="RegisterDateFormat">
+ [REG_DATE] ([AGE])
+ </string>
+ <string name="AcctTypeResident" value="Sakin"/>
+ <string name="AcctTypeTrial" value="Deneme"/>
+ <string name="AcctTypeCharterMember" value="Ayrıcalıklı Üye"/>
+ <string name="AcctTypeEmployee" value="Linden Lab Çalışanı"/>
+ <string name="PaymentInfoUsed" value="Kullanılan Ödeme Bilgisi"/>
+ <string name="PaymentInfoOnFile" value="Dosyadaki Ödeme Bilgisi"/>
+ <string name="NoPaymentInfoOnFile" value="Dosyada Ödeme Bilgisi Yok"/>
+ <string name="AgeVerified" value="Yaşı Doğrulanmış"/>
+ <string name="NotAgeVerified" value="Yaşı Doğrulanmamış"/>
+ <string name="partner_edit_link_url">
+ http://www.secondlife.com/account/partners.php?lang=en
+ </string>
+ <string name="my_account_link_url">
+ http://secondlife.com/my
+ </string>
+ <string name="no_partner_text" value="Hiçbiri"/>
+ <scroll_container name="profile_scroll">
+ <panel name="scroll_content_panel">
+ <panel name="data_panel">
+ <text name="display_name_label" value="Ekran Adı:"/>
+ <text name="solo_username_label" value="Kullanıcı Adı:"/>
+ <button name="set_name" tool_tip="Ekran Adını Ayarla"/>
+ <text name="user_label" value="Kullanıcı Adı:"/>
+ <panel name="lifes_images_panel">
+ <panel name="second_life_image_panel">
+ <text name="second_life_photo_title_text" value="[SECOND_LIFE]:"/>
+ </panel>
+ <icon label="" name="2nd_life_edit_icon" tool_tip="Bir görüntü seçmek için tıklayın"/>
+ </panel>
+ <panel name="first_life_image_panel">
+ <text name="real_world_photo_title_text" value="Gerçek Dünya:"/>
+ </panel>
+ <icon label="" name="real_world_edit_icon" tool_tip="Bir görüntü seçmek için tıklayın"/>
+ <text name="title_homepage_text">
+ Ana sayfa:
+ </text>
+ <line_editor name="homepage_edit" value="http://"/>
+ <text name="title_acc_status_text" value="Hesabım:"/>
+ <text_editor name="acc_status_text" value="Sakin. Dosyada ödeme bilgisi yok."/>
+ <text name="my_account_link" value="[[URL] Kontrol Panelime Git]"/>
+ <text name="title_partner_text" value="Partnerim:"/>
+ <panel name="partner_data_panel">
+ <text initial_value="(alınıyor)" name="partner_text"/>
+ </panel>
+ <text name="partner_edit_link" value="[[URL] Düzenle]"/>
+ </panel>
+ </panel>
+ </scroll_container>
+ <panel name="profile_me_buttons_panel">
+ <layout_stack name="bottom_panel_ls">
+ <layout_panel name="save_changes_btn_lp">
+ <button label="DeÄŸiÅŸiklikleri Kaydet" name="save_btn"/>
+ </layout_panel>
+ <layout_panel name="show_on_map_btn_lp">
+ <button label="İptal" name="cancel_btn"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_edit_shape.xml b/indra/newview/skins/default/xui/tr/panel_edit_shape.xml
new file mode 100644
index 0000000000..57cd9aca75
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_edit_shape.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_shape_panel">
+ <string name="meters">
+ Metre
+ </string>
+ <string name="feet">
+ Ayak
+ </string>
+ <string name="height">
+ Boy:
+ </string>
+ <panel label="Gömlek" name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="shape_body_tab" title="Beden"/>
+ <accordion_tab name="shape_head_tab" title="BaÅŸ"/>
+ <accordion_tab name="shape_eyes_tab" title="Gözler"/>
+ <accordion_tab name="shape_ears_tab" title="Kulaklar"/>
+ <accordion_tab name="shape_nose_tab" title="Burun"/>
+ <accordion_tab name="shape_mouth_tab" title="Ağız"/>
+ <accordion_tab name="shape_chin_tab" title="Çene"/>
+ <accordion_tab name="shape_torso_tab" title="Gövde"/>
+ <accordion_tab name="shape_legs_tab" title="Bacaklar"/>
+ </accordion>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_edit_shirt.xml b/indra/newview/skins/default/xui/tr/panel_edit_shirt.xml
new file mode 100644
index 0000000000..2dd417afc6
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_edit_shirt.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_shirt_panel">
+ <panel name="avatar_shirt_color_panel">
+ <texture_picker label="Doku" name="Fabric" tool_tip="Bir resim seçmek için tıklayın"/>
+ <color_swatch label="Renk/Ton" name="Color/Tint" tool_tip="Renk seçiciyi açmak için tıklayın"/>
+ </panel>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="shirt_main_tab" title="Gömlek"/>
+ </accordion>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_edit_shoes.xml b/indra/newview/skins/default/xui/tr/panel_edit_shoes.xml
new file mode 100644
index 0000000000..34acb414b0
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_edit_shoes.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_shoes_panel">
+ <panel name="avatar_shoes_color_panel">
+ <texture_picker label="Doku" name="Fabric" tool_tip="Bir resim seçmek için tıklayın"/>
+ <color_swatch label="Renk/Ton" name="Color/Tint" tool_tip="Renk seçiciyi açmak için tıklayın"/>
+ </panel>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="shoes_main_tab" title="Ayakkabılar"/>
+ </accordion>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_edit_skin.xml b/indra/newview/skins/default/xui/tr/panel_edit_skin.xml
new file mode 100644
index 0000000000..fdf75100ed
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_edit_skin.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_skin_panel">
+ <panel name="avatar_skin_color_panel">
+ <texture_picker label="Baş" name="Head" tool_tip="Bir resim seçmek için tıklayın"/>
+ <texture_picker label="Üst gövde" name="Upper Body" tool_tip="Bir resim seçmek için tıklayın"/>
+ <texture_picker label="Alt gövde" name="Lower Body" tool_tip="Bir resim seçmek için tıklayın"/>
+ </panel>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="skin_color_tab" title="Dış Katman Rengi"/>
+ <accordion_tab name="skin_face_tab" title="Yüz Ayrıntısı"/>
+ <accordion_tab name="skin_makeup_tab" title="Makyaj"/>
+ <accordion_tab name="skin_body_tab" title="Vücut Ayrıntısı"/>
+ </accordion>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_edit_skirt.xml b/indra/newview/skins/default/xui/tr/panel_edit_skirt.xml
new file mode 100644
index 0000000000..2099013fe1
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_edit_skirt.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_skirt_panel">
+ <panel name="avatar_skirt_color_panel">
+ <texture_picker label="Doku" name="Fabric" tool_tip="Bir resim seçmek için tıklayın"/>
+ <color_swatch label="Renk/Ton" name="Color/Tint" tool_tip="Renk seçiciyi açmak için tıklayın"/>
+ </panel>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="skirt_main_tab" title="Etek"/>
+ </accordion>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_edit_socks.xml b/indra/newview/skins/default/xui/tr/panel_edit_socks.xml
new file mode 100644
index 0000000000..d386814d31
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_edit_socks.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_socks_panel">
+ <panel name="avatar_socks_color_panel">
+ <texture_picker label="Doku" name="Fabric" tool_tip="Bir resim seçmek için tıklayın"/>
+ <color_swatch label="Renk/Ton" name="Color/Tint" tool_tip="Renk seçiciyi açmak için tıklayın"/>
+ </panel>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="socks_main_tab" title="Çoraplar"/>
+ </accordion>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_edit_tattoo.xml b/indra/newview/skins/default/xui/tr/panel_edit_tattoo.xml
new file mode 100644
index 0000000000..7f5590a485
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_edit_tattoo.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_tattoo_panel">
+ <panel name="avatar_tattoo_color_panel">
+ <texture_picker label="Baş Dövmesi" name="Head Tattoo" tool_tip="Bir resim seçmek için tıklayın"/>
+ <texture_picker label="Üst Gövde Dövmesi" name="Upper Tattoo" tool_tip="Bir resim seçmek için tıklayın"/>
+ <texture_picker label="Alt Gövde Dövmesi" name="Lower Tattoo" tool_tip="Bir resim seçmek için tıklayın"/>
+ <color_swatch label="Renk/Ton" name="Color/Tint" tool_tip="Renk seçiciyi açmak için tıklayın"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_edit_underpants.xml b/indra/newview/skins/default/xui/tr/panel_edit_underpants.xml
new file mode 100644
index 0000000000..ed003e1adf
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_edit_underpants.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_underpants_panel">
+ <panel name="avatar_underpants_color_panel">
+ <texture_picker label="Doku" name="Fabric" tool_tip="Bir resim seçmek için tıklayın"/>
+ <color_swatch label="Renk/Ton" name="Color/Tint" tool_tip="Renk seçiciyi açmak için tıklayın"/>
+ </panel>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="underpants_main_tab" title="Külot"/>
+ </accordion>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_edit_undershirt.xml b/indra/newview/skins/default/xui/tr/panel_edit_undershirt.xml
new file mode 100644
index 0000000000..e0a0be8abb
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_edit_undershirt.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_undershirt_panel">
+ <panel name="avatar_undershirt_color_panel">
+ <texture_picker label="Doku" name="Fabric" tool_tip="Bir resim seçmek için tıklayın"/>
+ <color_swatch label="Renk/Ton" name="Color/Tint" tool_tip="Renk Seçiciyi açmak için tıklayın"/>
+ </panel>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="undershirt_main_tab" title="Fanila"/>
+ </accordion>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_edit_wearable.xml b/indra/newview/skins/default/xui/tr/panel_edit_wearable.xml
new file mode 100644
index 0000000000..7a4a09aaed
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_edit_wearable.xml
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Giyilebilir" name="panel_edit_wearable">
+ <string name="edit_shape_title">
+ Şekil Düzenleniyor
+ </string>
+ <string name="edit_skin_title">
+ Dış Katman Düzenleniyor
+ </string>
+ <string name="edit_hair_title">
+ Saç Düzenleniyor
+ </string>
+ <string name="edit_eyes_title">
+ Gözler Düzenleniyor
+ </string>
+ <string name="edit_shirt_title">
+ Gömlek Düzenleniyor
+ </string>
+ <string name="edit_pants_title">
+ Pantolon Düzenleniyor
+ </string>
+ <string name="edit_shoes_title">
+ Ayakkabılar Düzenleniyor
+ </string>
+ <string name="edit_socks_title">
+ Çoraplar Düzenleniyor
+ </string>
+ <string name="edit_jacket_title">
+ Ceket Düzenleniyor
+ </string>
+ <string name="edit_skirt_title">
+ Etek Düzenleniyor
+ </string>
+ <string name="edit_gloves_title">
+ Eldivenler Düzenleniyor
+ </string>
+ <string name="edit_undershirt_title">
+ Fanila Düzenleniyor
+ </string>
+ <string name="edit_underpants_title">
+ Külot Düzenleniyor
+ </string>
+ <string name="edit_alpha_title">
+ Alfa Maskesi Düzenleniyor
+ </string>
+ <string name="edit_tattoo_title">
+ Dövme Düzenleniyor
+ </string>
+ <string name="edit_physics_title">
+ Fizik Düzenleniyor
+ </string>
+ <string name="shape_desc_text">
+ Åžekil:
+ </string>
+ <string name="skin_desc_text">
+ Dış Katman:
+ </string>
+ <string name="hair_desc_text">
+ Saç:
+ </string>
+ <string name="eyes_desc_text">
+ Gözler:
+ </string>
+ <string name="shirt_desc_text">
+ Gömlek:
+ </string>
+ <string name="pants_desc_text">
+ Pantolon:
+ </string>
+ <string name="shoes_desc_text">
+ Ayakkabılar:
+ </string>
+ <string name="socks_desc_text">
+ Çoraplar:
+ </string>
+ <string name="jacket_desc_text">
+ Ceket:
+ </string>
+ <string name="skirt_desc_text">
+ Etek:
+ </string>
+ <string name="gloves_desc_text">
+ Eldivenler:
+ </string>
+ <string name="undershirt_desc_text">
+ Fanila:
+ </string>
+ <string name="underpants_desc_text">
+ Külot:
+ </string>
+ <string name="alpha_desc_text">
+ Alfa Maskesi:
+ </string>
+ <string name="tattoo_desc_text">
+ Dövme:
+ </string>
+ <string name="physics_desc_text">
+ Fizik:
+ </string>
+ <labeled_back_button label="Kaydet" name="back_btn" tool_tip="Dış Görünümü Düzenlemeye Dön"/>
+ <text name="edit_wearable_title" value="Şekil Düzenleniyor"/>
+ <panel label="Gömlek" name="wearable_type_panel">
+ <text name="description_text" value="Åžekil:"/>
+ <radio_group name="sex_radio">
+ <radio_item label="" name="sex_male" tool_tip="Erkek" value="1"/>
+ <radio_item label="" name="sex_female" tool_tip="Kadın" value="0"/>
+ </radio_group>
+ <icon name="male_icon" tool_tip="Erkek"/>
+ <icon name="female_icon" tool_tip="Kadın"/>
+ </panel>
+ <panel name="button_panel">
+ <layout_stack name="button_panel_ls">
+ <layout_panel name="save_as_btn_lp">
+ <button label="Farklı Kaydet" name="save_as_button"/>
+ </layout_panel>
+ <layout_panel name="revert_btn_lp">
+ <button label="DeÄŸiÅŸiklikleri Geri Al" name="revert_button"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_group_control_panel.xml b/indra/newview/skins/default/xui/tr/panel_group_control_panel.xml
new file mode 100644
index 0000000000..58bb68a5c3
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_group_control_panel.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_im_control_panel">
+ <layout_stack name="vertical_stack">
+ <layout_panel name="group_info_btn_panel">
+ <button label="Grup Profili" name="group_info_btn"/>
+ </layout_panel>
+ <layout_panel name="call_btn_panel">
+ <button label="Grubu Ara" name="call_btn"/>
+ </layout_panel>
+ <layout_panel name="end_call_btn_panel">
+ <button label="Aramadan Ayrıl" name="end_call_btn"/>
+ </layout_panel>
+ <layout_panel name="voice_ctrls_btn_panel">
+ <button label="Ses Denetimlerini Aç" name="voice_ctrls_btn"/>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_group_general.xml b/indra/newview/skins/default/xui/tr/panel_group_general.xml
new file mode 100644
index 0000000000..0462026249
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_group_general.xml
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Genel" name="general_tab">
+ <panel.string name="help_text">
+ Genel sekmesinde bu grup hakkında genel bilgiler, üyelerin listesi, genel Grup Tercihleri ve üye seçenekleri yer alır.
+
+Daha fazla yardım edinmek için farenizi seçeneklerin üzerine getirin.
+ </panel.string>
+ <panel.string name="group_info_unchanged">
+ Genel grup bilgileri deÄŸiÅŸti
+ </panel.string>
+ <panel.string name="incomplete_member_data_str">
+ Üye verileri alınıyor
+ </panel.string>
+ <panel name="group_info_top">
+ <texture_picker label="" name="insignia" tool_tip="Bir resim seçmek için tıklayın"/>
+ <text name="prepend_founded_by">
+ Kurucu:
+ </text>
+ <text name="join_cost_text">
+ Ücretsiz
+ </text>
+ <button label="ŞİMDİ KATIL!" name="btn_join"/>
+ </panel>
+ <text_editor name="charter">
+ Grup Bildirgesi
+ </text_editor>
+ <name_list name="visible_members">
+ <name_list.columns label="Üye" name="name"/>
+ <name_list.columns label="Başlık" name="title"/>
+ <name_list.columns label="Durum" name="status"/>
+ </name_list>
+ <text name="my_group_settngs_label">
+ Ben
+ </text>
+ <text name="active_title_label">
+ Başlığım:
+ </text>
+ <combo_box name="active_title" tool_tip="Bu grup etkin olduğunda avatarınızın ad etiketinde görünecek başlığı belirler."/>
+ <check_box label="Grup bildirimleri al" name="receive_notices" tool_tip="Bu gruptan Bildirim almak isteyip istemediğinizi belirler. Bu grup size istemediğiniz bildirimler yolluyorsa bu kutudaki işareti kaldırın."/>
+ <check_box label="Profilimde göster" name="list_groups_in_profile" tool_tip="Bu grubu profilinizde göstermeyi isteyip istemediğinizi belirler"/>
+ <panel name="preferences_container">
+ <text name="group_settngs_label">
+ Grup
+ </text>
+ <check_box label="Herkes katılabilir" name="open_enrollement" tool_tip="Bu grubun davet edilmeden yeni üyelerin katılmasına imkan tanıyıp tanımayacağını belirler."/>
+ <check_box label="Katılma ücreti" name="check_enrollment_fee" tool_tip="Bu gruba katılmak için bir kayıt ücretinin gerekip gerekmeyeceğini belirler"/>
+ <spinner label="L$" name="spin_enrollment_fee" tool_tip="Kayıt Ücreti işaretlendiğinde yeni üyeler gruba katılmak için bu ücreti ödemelidir."/>
+ <combo_box name="group_mature_check" tool_tip="Grubunuzun Orta seviyede içeriğe sahip olup olmadığını belirler">
+ <combo_item name="select_mature">
+ - Erişkinlik seviyesini seçin -
+ </combo_item>
+ <combo_box.item label="Orta Seviyede İçerik" name="mature"/>
+ <combo_box.item label="Genel İçerik" name="pg"/>
+ </combo_box>
+ <check_box initial_value="true" label="Aramada göster" name="show_in_group_list" tool_tip="Kişiler arama sonuçlarında bu grubu görebilsin"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_group_info_sidetray.xml b/indra/newview/skins/default/xui/tr/panel_group_info_sidetray.xml
new file mode 100644
index 0000000000..32f39da490
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_group_info_sidetray.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Grup Profili" name="GroupInfo">
+ <panel.string name="default_needs_apply_text">
+ KaydedilmemiÅŸ deÄŸiÅŸiklikler var
+ </panel.string>
+ <panel.string name="want_apply_text">
+ Bu deÄŸiÅŸiklikleri kaydetmek istiyor musunuz?
+ </panel.string>
+ <panel.string name="group_join_btn">
+ Katıl (L$[AMOUNT])
+ </panel.string>
+ <panel.string name="group_join_free">
+ Ücretsiz
+ </panel.string>
+ <panel name="group_info_top">
+ <text_editor name="group_name" value="(yükleniyor...)"/>
+ <line_editor label="Grup adınızı buraya girin" name="group_name_editor"/>
+ </panel>
+ <layout_stack name="layout">
+ <layout_panel name="group_accordions">
+ <accordion name="groups_accordion">
+ <accordion_tab name="group_general_tab" title="Genel"/>
+ <accordion_tab name="group_roles_tab" title="Roller"/>
+ <accordion_tab name="group_notices_tab" title="Bildirimler"/>
+ <accordion_tab name="group_land_tab" title="Arazi/Varlıklar"/>
+ </accordion>
+ </layout_panel>
+ </layout_stack>
+ <layout_stack name="button_row_ls">
+ <layout_panel name="btn_chat_lp">
+ <button label="Sohbet" name="btn_chat"/>
+ </layout_panel>
+ <layout_panel name="call_btn_lp">
+ <button label="Grup Araması" name="btn_call" tool_tip="Bu grubu ara"/>
+ </layout_panel>
+ <layout_panel name="btn_apply_lp">
+ <button label="Kaydet" label_selected="Kaydet" name="btn_apply"/>
+ <button label="Grup OluÅŸtur" name="btn_create" tool_tip="Yeni bir Grup oluÅŸtur"/>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_group_invite.xml b/indra/newview/skins/default/xui/tr/panel_group_invite.xml
new file mode 100644
index 0000000000..9b0c7f799a
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_group_invite.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Bir Üyeyi Davet Et" name="invite_panel">
+ <panel.string name="confirm_invite_owner_str">
+ Yeni sahipler davet etmek istediğinize emin misiniz? Bu eylem geri döndürülemez!
+ </panel.string>
+ <panel.string name="loading">
+ (yükleniyor...)
+ </panel.string>
+ <panel.string name="already_in_group">
+ Seçtiğiniz bazı Sakinler zaten grupta yer alıyor, bu yüzden bunlara davetiye gönderilmedi.
+ </panel.string>
+ <text name="help_text">
+ Grubunuza davet etmek için birden fazla Sakin seçebilirsiniz. Başlamak için &quot;Sakin Seçiciyi Aç&quot; üzerine tıklayın.
+ </text>
+ <button label="Sakin Seçiciyi Aç" name="add_button"/>
+ <name_list name="invitee_list" tool_tip="Ctrl tuşunu basılı tutun ve seçmek istediğiniz Sakinlerin adlarına tıklayın"/>
+ <button label="Seçilenleri Listeden Çıkar" name="remove_button" tool_tip="Yukarıda seçilen Sakinleri davet listesinden çıkarır"/>
+ <text name="role_text">
+ Onları hala Role atayacağınızı seçin:
+ </text>
+ <combo_box name="role_name" tool_tip="Üyeleri atamanıza izin verilen Roller listesinden seçin"/>
+ <button label="Davetiye Gönder" name="ok_button"/>
+ <button label="İptal" name="cancel_button"/>
+ <string name="GroupInvitation">
+ Grup Davetiyesi
+ </string>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_group_land_money.xml b/indra/newview/skins/default/xui/tr/panel_group_land_money.xml
new file mode 100644
index 0000000000..e9112a862b
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_group_land_money.xml
@@ -0,0 +1,85 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Arazi ve L$" name="land_money_tab">
+ <panel.string name="help_text">
+ Kullanılan Toplam Arazi, Toplam Katkı&apos;dan daha az veya buna eşit oluncaya kadar bir uyarı görünür.
+ </panel.string>
+ <panel.string name="cant_view_group_land_text">
+ Grupların sahip olduğu araziyi görme izniniz yok
+ </panel.string>
+ <panel.string name="epmty_view_group_land_text">
+ GiriÅŸ yok
+ </panel.string>
+ <panel.string name="cant_view_group_accounting_text">
+ Grubun muhasebe bilgilerini görme izniniz yok.
+ </panel.string>
+ <panel.string name="loading_txt">
+ Yükleniyor...
+ </panel.string>
+ <panel.string name="land_contrib_error">
+ Arazi katkınız ayarlanamıyor
+ </panel.string>
+ <panel name="layout_panel_landmoney">
+ <scroll_list name="group_parcel_list">
+ <scroll_list.columns label="Parsel" name="name"/>
+ <scroll_list.columns label="Bölge" name="location"/>
+ <scroll_list.columns label="Tür" name="type"/>
+ <scroll_list.columns label="Alan" name="area"/>
+ <scroll_list.columns label="Saklı" name="hidden"/>
+ </scroll_list>
+ <text name="total_contributed_land_label">
+ Toplam katkı:
+ </text>
+ <text name="total_contributed_land_value">
+ [AREA] m²
+ </text>
+ <button label="Harita" label_selected="Harita" name="map_button"/>
+ <text name="total_land_in_use_label">
+ Kullanılan toplam arazi:
+ </text>
+ <text name="total_land_in_use_value">
+ [AREA] m²
+ </text>
+ <text name="land_available_label">
+ Kullanılabilir arazi:
+ </text>
+ <text name="land_available_value">
+ [AREA] m²
+ </text>
+ <text name="your_contribution_label">
+ Katkınız:
+ </text>
+ <text name="your_contribution_units">
+ m²
+ </text>
+ <text name="your_contribution_max_value">
+ ([AMOUNT] maks)
+ </text>
+ <text name="group_over_limit_text">
+ Kullanılan alanı desteklemek için daha fazla arazi kredisi lazım
+ </text>
+ <text name="group_money_heading">
+ Grup L$
+ </text>
+ </panel>
+ <tab_container name="group_money_tab_container">
+ <panel label="PLANLAMA" name="group_money_planning_tab">
+ <text_editor name="group_money_planning_text">
+ Yükleniyor...
+ </text_editor>
+ </panel>
+ <panel label="AYRINTILAR" name="group_money_details_tab">
+ <text_editor name="group_money_details_text">
+ Yükleniyor...
+ </text_editor>
+ <button name="earlier_details_button" tool_tip="Geri"/>
+ <button name="later_details_button" tool_tip="Sonraki"/>
+ </panel>
+ <panel label="SATIÅžLAR" name="group_money_sales_tab">
+ <text_editor name="group_money_sales_text">
+ Yükleniyor...
+ </text_editor>
+ <button name="earlier_sales_button" tool_tip="Geri"/>
+ <button name="later_sales_button" tool_tip="Sonraki"/>
+ </panel>
+ </tab_container>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_group_list_item.xml b/indra/newview/skins/default/xui/tr/panel_group_list_item.xml
new file mode 100644
index 0000000000..2bc597f2fa
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_group_list_item.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="group_list_item">
+ <text name="group_name" value="Bilinmiyor"/>
+ <button name="profile_btn" tool_tip="Profili göster"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_group_notices.xml b/indra/newview/skins/default/xui/tr/panel_group_notices.xml
new file mode 100644
index 0000000000..179b5fff69
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_group_notices.xml
@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Bildirimler" name="notices_tab">
+ <panel.string name="help_text">
+ Bildirimler ile bir ileti ve opsiyonel olarak eklenmiş bir öğe gönderebilirsiniz.
+Bildirimler sadece Bildirim alma imkanına sahip olan Rollerdeki grup üyelerine gider.
+Genel sekmesinde Bildirimleri kapatabilirsiniz.
+ </panel.string>
+ <panel.string name="no_notices_text">
+ Eski bildirimler mevcut deÄŸil
+ </panel.string>
+ <text name="lbl2">
+ Bildirimler 14 gün boyunca saklanır.
+Günde grup başına maksimum sınır 200&apos;dür
+ </text>
+ <scroll_list name="notice_list">
+ <scroll_list.columns label="Konu" name="subject"/>
+ <scroll_list.columns label="Kimden" name="from"/>
+ <scroll_list.columns label="Tarih" name="date"/>
+ </scroll_list>
+ <text name="notice_list_none_found">
+ Bildirim yok
+ </text>
+ <button label="Yeni Bildirim" name="create_new_notice" tool_tip="Yeni bir bildirim oluÅŸtur"/>
+ <button name="refresh_notices" tool_tip="Bildirimler listesini yenile"/>
+ <panel label="Yeni Bildirim OluÅŸtur" name="panel_create_new_notice">
+ <text name="lbl">
+ Bildirim OluÅŸtur
+ </text>
+ <text name="lbl3">
+ Konu:
+ </text>
+ <text name="lbl4">
+ İleti:
+ </text>
+ <text name="lbl5">
+ Ekle:
+ </text>
+ <text name="string">
+ Bir öğeyi eklemek için buraya sürükleyin ve bırakın:
+ </text>
+ <button label="Envanter" name="open_inventory" tool_tip="Envanteri Aç"/>
+ <button name="remove_attachment" tool_tip="Bildiriminizden aksesuarı kaldır"/>
+ <button label="Gönder" label_selected="Gönder" name="send_notice"/>
+ <group_drop_target name="drop_target" tool_tip="Bu bildirimle bir envanter öğesini göndermek için öğeyi bu hedef kutuya sürükleyin. Öğeyi eklemek için kopyalama ve aktarma iznine sahip olmalısınız."/>
+ </panel>
+ <panel label="Eski Bildirimi Göster" name="panel_view_past_notice">
+ <text name="lbl">
+ ArÅŸivlenmiÅŸ Bildirim
+ </text>
+ <text name="lbl2">
+ Yeni bir bildirim göndermek için + düğmesine tıklayın
+ </text>
+ <text name="lbl3">
+ Konu:
+ </text>
+ <text name="lbl4">
+ İleti:
+ </text>
+ <button label="Aksesuarı Aç" name="open_attachment"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_group_notify.xml b/indra/newview/skins/default/xui/tr/panel_group_notify.xml
new file mode 100644
index 0000000000..bcc5482daa
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_group_notify.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="instant_message" name="panel_group_notify">
+ <string name="message_max_lines_count" value="7"/>
+ <string name="subject_font" value="SANSSERIF_BIG"/>
+ <string name="date_font" value="SANSSERIF"/>
+ <panel label="başlık" name="header">
+ <text name="title" value="Gönderici Adı / Grup Adı"/>
+ </panel>
+ <text_editor name="message" value="ileti"/>
+ <text name="attachment" value="Aksesuar"/>
+ <button label="Tamam" name="btn_ok"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_group_roles.xml b/indra/newview/skins/default/xui/tr/panel_group_roles.xml
new file mode 100644
index 0000000000..fb03107da8
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_group_roles.xml
@@ -0,0 +1,93 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Üyeler ve Roller" name="roles_tab">
+ <panel.string name="default_needs_apply_text">
+ KaydedilmemiÅŸ deÄŸiÅŸiklikler var
+ </panel.string>
+ <panel.string name="want_apply_text">
+ DeÄŸiÅŸikliklerinizi kaydetmek istiyor musunuz?
+ </panel.string>
+ <tab_container name="roles_tab_container">
+ <panel label="ÜYELER" name="members_sub_tab" tool_tip="Üyeler">
+ <panel.string name="help_text">
+ Üyelere atanmış Rolleri ekleyebilir veya kaldırabilirsiniz.
+Ctrl tuşuna basıp adlarına tıklayarak birden fazla Üye seçebilirsiniz.
+ </panel.string>
+ <panel.string name="donation_area">
+ [AREA] m²
+ </panel.string>
+ <filter_editor label="Üyeleri Filtrele" name="filter_input"/>
+ <name_list name="member_list">
+ <name_list.columns label="Üye" name="name"/>
+ <name_list.columns label="Bağış" name="donated"/>
+ <name_list.columns label="Durum" name="online"/>
+ </name_list>
+ <button label="Davet Et" name="member_invite"/>
+ <button label="Çıkar" name="member_eject"/>
+ </panel>
+ <panel label="ROLLER" name="roles_sub_tab">
+ <panel.string name="help_text">
+ Roller, birer başlığa ve Üyelerin gerçekleştirmesine izin verilen Yetenekler listesine sahiptir.
+ Bir Üye bir veya daha fazla sayıda Role ait olabilir.
+ Bir grupta 10&apos;a kadar Rol olabilir, buna Herkes ve Sahip Rolü de dahildir.
+ </panel.string>
+ <panel.string name="cant_delete_role">
+ &apos;Herkes&apos; ve &apos;Sahipler&apos; Rolleri özeldir, silinemez.
+ </panel.string>
+ <filter_editor label="Rolleri Filtrele" name="filter_input"/>
+ <scroll_list name="role_list">
+ <scroll_list.columns label="Rol" name="name"/>
+ <scroll_list.columns label="Başlık" name="title"/>
+ <scroll_list.columns label="#" name="members"/>
+ </scroll_list>
+ <button label="Yeni Rol" name="role_create"/>
+ <button label="Rolü Sil" name="role_delete"/>
+ </panel>
+ <panel label="YETENEKLER" name="actions_sub_tab" tool_tip="Bir Yeteneğin Açıklamasını ve bu Yeteneğe hangi Rollerin ve Üyelerin sahip olabileceğini görebilirsiniz.">
+ <panel.string name="help_text">
+ Yetenekler sayesinde Rollerle ilişkili Üyeler bu grup içerisinde belirli şeyler yapabilir.
+ Yeteneklerin kapsamı oldukça geniştir.
+ </panel.string>
+ <filter_editor label="Yetenekleri Filtrele" name="filter_input"/>
+ <scroll_list name="action_list" tool_tip="Bir Yeteneği seçerek daha çok ayrıntı görebilirsiniz"/>
+ </panel>
+ </tab_container>
+ <panel name="members_footer">
+ <text name="static">
+ Atanmış Roller
+ </text>
+ <text name="static2">
+ İzin Verilen Yetenekler
+ </text>
+ <scroll_list name="member_allowed_actions" tool_tip="İzin verilen her bir yeteneğin ayrıntıları için yetenekler sekmesine bakın"/>
+ </panel>
+ <panel name="roles_footer">
+ <text name="static">
+ Rol Adı
+ </text>
+ <text name="static3">
+ Rol Başlığı
+ </text>
+ <text name="static2">
+ Açıklama
+ </text>
+ <text name="static4">
+ Atanmış Üyeler
+ </text>
+ <check_box label="Üyeleri göster" name="role_visible_in_list" tool_tip="Bu rolün üyelerinin, Genel sekmesinde grup dışındaki kişilere görünüp görünmeyeceğini ayarlar."/>
+ <text name="static5">
+ İzin Verilen Yetenekler
+ </text>
+ <scroll_list name="role_allowed_actions" tool_tip="İzin verilen her bir yeteneğin ayrıntıları için yetenekler sekmesine bakın"/>
+ </panel>
+ <panel name="actions_footer">
+ <text_editor name="action_description">
+ Bu Yetenek &apos;Bu Gruptan Üye Çıkarma&apos;dır. Bir Sahibi sadece başka bir Sahip çıkartabilir.
+ </text_editor>
+ <text name="static2">
+ Bu yeteneÄŸe sahip Roller
+ </text>
+ <text name="static3">
+ Bu yeteneğe sahip Üyeler
+ </text>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_im_control_panel.xml b/indra/newview/skins/default/xui/tr/panel_im_control_panel.xml
new file mode 100644
index 0000000000..aebdc6b48d
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_im_control_panel.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_im_control_panel">
+ <layout_stack name="button_stack">
+ <layout_panel name="view_profile_btn_panel">
+ <button label="Profil" name="view_profile_btn"/>
+ </layout_panel>
+ <layout_panel name="add_friend_btn_panel">
+ <button label="ArkadaÅŸ Ekle" name="add_friend_btn"/>
+ </layout_panel>
+ <layout_panel name="teleport_btn_panel">
+ <button label="Işınla" name="teleport_btn" tool_tip="Bu kişiyi ışınlamayı teklif et"/>
+ </layout_panel>
+ <layout_panel name="share_btn_panel">
+ <button label="PaylaÅŸ" name="share_btn"/>
+ </layout_panel>
+ <layout_panel name="pay_btn_panel">
+ <button label="Öde" name="pay_btn"/>
+ </layout_panel>
+ <layout_panel name="call_btn_panel">
+ <button label="Ara" name="call_btn"/>
+ </layout_panel>
+ <layout_panel name="end_call_btn_panel">
+ <button label="Aramayı Bitir" name="end_call_btn"/>
+ </layout_panel>
+ <layout_panel name="voice_ctrls_btn_panel">
+ <button label="Ses Denetimleri" name="voice_ctrls_btn"/>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_instant_message.xml b/indra/newview/skins/default/xui/tr/panel_instant_message.xml
new file mode 100644
index 0000000000..cf9bc7fccb
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_instant_message.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="im_panel" name="im_panel">
+ <string name="message_max_lines_count">
+ 6
+ </string>
+ <panel label="im_header" name="im_header">
+ <text name="time_box" value="23:30"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_inventory_item.xml b/indra/newview/skins/default/xui/tr/panel_inventory_item.xml
new file mode 100644
index 0000000000..d18047fbcf
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_inventory_item.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="inventory_item">
+ <text name="item_name" value="..."/>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_landmark_info.xml b/indra/newview/skins/default/xui/tr/panel_landmark_info.xml
new file mode 100644
index 0000000000..2cad753f25
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_landmark_info.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="landmark_info">
+ <string name="title_create_landmark" value="Yer İmi Oluştur"/>
+ <string name="title_edit_landmark" value="Yer İmini Düzenle"/>
+ <string name="title_landmark" value="Yer İmi"/>
+ <string name="not_available" value="(G/D)"/>
+ <string name="unknown" value="(bilinmiyor)"/>
+ <string name="public" value="(kamuya açık)"/>
+ <string name="server_update_text">
+ Sunucu güncelleştirmesi olmadan yer bilgisi mevcut olmaz.
+ </string>
+ <string name="server_error_text">
+ Bu konum hakkında şu anda bilgi mevcut değil, lütfen daha sonra tekrar deneyin.
+ </string>
+ <string name="server_forbidden_text">
+ Erişim kısıtlamaları nedeniyle bu konum hakkında bilgiye erişilemiyor. Lütfen parsel sahibi nezdinde izinlerinizi kontrol edin.
+ </string>
+ <string name="acquired_date">
+ [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]
+ </string>
+ <button name="back_btn" tool_tip="Geri"/>
+ <text name="title" value="Profili YerleÅŸtir"/>
+ <scroll_container name="place_scroll">
+ <panel name="scrolling_panel">
+ <text name="region_title" value="Örnek Bölge"/>
+ <text name="parcel_title" value="Örnek Parsel, Uzun Ad (145, 228, 26)"/>
+ <expandable_text name="description" value="Du waltz die spritz"/>
+ <text name="maturity_value" value="bilinmiyor"/>
+ <panel name="landmark_info_panel">
+ <text name="owner_label" value="Sahip:"/>
+ <text name="creator_label" value="OluÅŸturan:"/>
+ <text name="created_label" value="OluÅŸturuldu:"/>
+ </panel>
+ <panel name="landmark_edit_panel">
+ <text name="title_label" value="Başlık:"/>
+ <text name="notes_label" value="Notlarım:"/>
+ <text name="folder_label" value="Yer imi konumu:"/>
+ </panel>
+ </panel>
+ </scroll_container>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_landmarks.xml b/indra/newview/skins/default/xui/tr/panel_landmarks.xml
new file mode 100644
index 0000000000..d40d0c1543
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_landmarks.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="Landmarks">
+ <accordion name="landmarks_accordion">
+ <accordion_tab name="tab_favorites" title="Favoriler çubuğu"/>
+ <accordion_tab name="tab_landmarks" title="Yer İmlerim"/>
+ <accordion_tab name="tab_inventory" title="Envanterim"/>
+ <accordion_tab name="tab_library" title="Kütüphane"/>
+ </accordion>
+ <panel name="bottom_panel">
+ <layout_stack name="bottom_panel">
+ <layout_panel name="options_gear_btn_panel">
+ <menu_button name="options_gear_btn" tool_tip="İlave seçenekleri göster"/>
+ </layout_panel>
+ <layout_panel name="add_btn_panel">
+ <button name="add_btn" tool_tip="Yeni yer imi ekle"/>
+ </layout_panel>
+ <layout_panel name="trash_btn_panel">
+ <dnd_button name="trash_btn" tool_tip="Seçilen yer imini sil"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_login.xml b/indra/newview/skins/default/xui/tr/panel_login.xml
new file mode 100644
index 0000000000..acd6aa1921
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_login.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_login">
+ <panel.string name="create_account_url">
+ http://join.secondlife.com/
+ </panel.string>
+ <panel.string name="forgot_password_url">
+ http://secondlife.com/account/request.php
+ </panel.string>
+ <layout_stack name="login_widgets">
+ <layout_panel name="login">
+ <text name="username_text">
+ Kullanıcı Adı:
+ </text>
+ <combo_box name="username_combo" tool_tip="Kaydolduğunuzda seçtiğiniz kullanıcı adı, örn. mustafayalcin12 veya Faruk Gungoren"/>
+ <text name="password_text">
+ Parola:
+ </text>
+ <check_box label="Parolayı hatırla" name="remember_check"/>
+ <button label="Oturum Aç" name="connect_btn"/>
+ <text name="mode_selection_text">
+ Mod:
+ </text>
+ <combo_box name="mode_combo" tool_tip="Modunuzu seçin. Hızlı, kolay keşif yapmak ve sohbet için Temel seçimini yapın. Daha fazla özelliğe erişmek için Gelişmiş seçimini yapın.">
+ <combo_box.item label="Temel" name="Basic"/>
+ <combo_box.item label="GeliÅŸmiÅŸ" name="Advanced"/>
+ </combo_box>
+ <text name="start_location_text">
+ Buradan baÅŸla:
+ </text>
+ <combo_box name="start_location_combo">
+ <combo_box.item label="Son konumum" name="MyLastLocation"/>
+ <combo_box.item label="Ana Konumum" name="MyHome"/>
+ <combo_box.item label="&lt;Bölge adını girin&gt;" name="Typeregionname"/>
+ </combo_box>
+ </layout_panel>
+ <layout_panel name="links">
+ <text name="create_new_account_text">
+ Kaydolun
+ </text>
+ <text name="forgot_password_text">
+ Kullanıcı adınızı veya parolanızı mı unuttunuz?
+ </text>
+ <text name="login_help">
+ Oturum açarken yardım mı gerekiyor?
+ </text>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_main_inventory.xml b/indra/newview/skins/default/xui/tr/panel_main_inventory.xml
new file mode 100644
index 0000000000..c69fb39130
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_main_inventory.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="EÅŸyalar" name="main inventory panel">
+ <panel.string name="ItemcountFetching">
+ [ITEM_COUNT] Öge Alınıyor... [FILTER]
+ </panel.string>
+ <panel.string name="ItemcountCompleted">
+ [ITEM_COUNT] Öge [FILTER]
+ </panel.string>
+ <text name="ItemcountText">
+ Ögeler:
+ </text>
+ <filter_editor label="Envanteri Filtrele" name="inventory search editor"/>
+ <tab_container name="inventory filter tabs">
+ <inventory_panel label="ENVANTERİM" name="All Items"/>
+ <recent_inventory_panel label="SON" name="Recent Items"/>
+ </tab_container>
+ <layout_stack name="bottom_panel">
+ <layout_panel name="options_gear_btn_panel">
+ <menu_button name="options_gear_btn" tool_tip="İlave seçenekleri göster"/>
+ </layout_panel>
+ <layout_panel name="add_btn_panel">
+ <button name="add_btn" tool_tip="Yeni öge ekle"/>
+ </layout_panel>
+ <layout_panel name="trash_btn_panel">
+ <dnd_button name="trash_btn" tool_tip="Seçilen öğeyi sil"/>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_me.xml b/indra/newview/skins/default/xui/tr/panel_me.xml
new file mode 100644
index 0000000000..4b911c9ce6
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_me.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Profilim" name="panel_me">
+ <panel label="SEÇMELERİM" name="panel_picks"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_media_settings_general.xml b/indra/newview/skins/default/xui/tr/panel_media_settings_general.xml
new file mode 100644
index 0000000000..89e78b75de
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_media_settings_general.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Genel" name="Media Settings General">
+ <text name="home_label">
+ Ana Sayfa:
+ </text>
+ <text name="home_fails_whitelist_label">
+ (Bu sayfa belirtilen izin verilenler listesinden geçmez)
+ </text>
+ <line_editor name="home_url" tool_tip="Bu ortam kaynağının ana sayfası"/>
+ <text name="preview_label">
+ Önizleme
+ </text>
+ <text name="current_url_label">
+ Mevcut Sayfa:
+ </text>
+ <text name="current_url" tool_tip="Bu ortam kaynağının şu anki sayfası" value=""/>
+ <button label="Sıfırla" name="current_url_reset_btn"/>
+ <check_box initial_value="false" label="Otomatik Tekrarla" name="auto_loop"/>
+ <check_box initial_value="false" label="İlk Tıklama Etkileşimleri" name="first_click_interact"/>
+ <check_box initial_value="false" label="Otomatik Zumla" name="auto_zoom"/>
+ <check_box initial_value="false" label="Ortamı Otomatik Oynat" name="auto_play"/>
+ <text name="media_setting_note">
+ Not: Sakinler bu ayarı geçersiz kılabilir
+ </text>
+ <check_box initial_value="false" label="Nesne Yüzünde Ortamı Otomatik Ölçekle" name="auto_scale"/>
+ <text name="size_label">
+ Büyüklük:
+ </text>
+ <text name="X_label">
+ X
+ </text>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_media_settings_permissions.xml b/indra/newview/skins/default/xui/tr/panel_media_settings_permissions.xml
new file mode 100644
index 0000000000..6c0b14a889
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_media_settings_permissions.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Özelleştir" name="Media settings for controls">
+ <text name="controls_label">
+ Denetimler:
+ </text>
+ <combo_box name="controls">
+ <combo_item name="Standard">
+ Standart
+ </combo_item>
+ <combo_item name="Mini">
+ Mini
+ </combo_item>
+ </combo_box>
+ <text name="owner_label">
+ Sahip
+ </text>
+ <check_box initial_value="false" label="Gezinme ve Etkileşime İzin Ver" name="perms_owner_interact"/>
+ <check_box initial_value="false" label="Denetim Çubuğunu Göster" name="perms_owner_control"/>
+ <text name="group_label">
+ Grup:
+ </text>
+ <check_box initial_value="false" label="Gezinme ve Etkileşime İzin Ver" name="perms_group_interact"/>
+ <check_box initial_value="false" label="Denetim Çubuğunu Göster" name="perms_group_control"/>
+ <text name="anyone_label">
+ Herkes
+ </text>
+ <check_box initial_value="false" label="Gezinme ve Etkileşime İzin Ver" name="perms_anyone_interact"/>
+ <check_box initial_value="false" label="Denetim Çubuğunu Göster" name="perms_anyone_control"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_media_settings_security.xml b/indra/newview/skins/default/xui/tr/panel_media_settings_security.xml
new file mode 100644
index 0000000000..da3ca1bd29
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_media_settings_security.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Güvenlik" name="Media Settings Security">
+ <check_box initial_value="false" label="Sadece Belirlenen URL Desenlerine Erişime İzin Ver" name="whitelist_enable"/>
+ <text name="home_url_fails_some_items_in_whitelist">
+ Ana sayfanın başarısız olduğu girişler işaretli:
+ </text>
+ <button label="Ekle" name="whitelist_add"/>
+ <button label="Sil" name="whitelist_del"/>
+ <text name="home_url_fails_whitelist">
+ Uyarı: Genel sekmesinde belirtilen ana sayfa bu beyaz listede yer almıyor. Geçerli bir giriş ekleninceye kadar devre dışı bırakıldı.
+ </text>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_navigation_bar.xml b/indra/newview/skins/default/xui/tr/panel_navigation_bar.xml
new file mode 100644
index 0000000000..8d43e3fb5a
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_navigation_bar.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="navigation_bar">
+ <layout_stack name="nvp_stack">
+ <layout_panel name="navigation_layout_panel">
+ <panel name="navigation_panel">
+ <pull_button name="back_btn" tool_tip="Önceki konuma geri git"/>
+ <pull_button name="forward_btn" tool_tip="Bir konum ileri git"/>
+ <button name="home_btn" tool_tip="Ana konumuma ışınla"/>
+ <location_input label="Konum" name="location_combo"/>
+ </panel>
+ </layout_panel>
+ <layout_panel name="favorites_layout_panel">
+ <favorites_bar name="favorite" tool_tip="Second Life içerisinde sık kullandığınız yerlere hızla erişmek için Yer İmlerini buraya sürükleyin!">
+ <label name="favorites_bar_label" tool_tip="Second Life içerisinde sık kullandığınız yerlere hızla erişmek için Yer İmlerini buraya sürükleyin!">
+ Favoriler Çubuğu
+ </label>
+ <more_button name="&gt;&gt;" tool_tip="Favorilerimden daha çok göster">
+ Daha Fazla â–¼
+ </more_button>
+ </favorites_bar>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_nearby_chat.xml b/indra/newview/skins/default/xui/tr/panel_nearby_chat.xml
new file mode 100644
index 0000000000..c405105e00
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_nearby_chat.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="nearby_chat">
+ <check_box label="Sohbeti çevir" name="translate_chat_checkbox"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_nearby_chat_bar.xml b/indra/newview/skins/default/xui/tr/panel_nearby_chat_bar.xml
new file mode 100644
index 0000000000..fd954475ac
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_nearby_chat_bar.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="chat_bar">
+ <line_editor label="Sohbet etmek için buraya tıklayın." name="chat_box" tool_tip="Söylemek için Enter, bağırmak için Ctrl+Enter yapın"/>
+ <button name="show_nearby_chat" tool_tip="yakın sohbet günlüğünü gösterir/gizler"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_nearby_media.xml b/indra/newview/skins/default/xui/tr/panel_nearby_media.xml
new file mode 100644
index 0000000000..a654b2ac14
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_nearby_media.xml
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="nearby_media">
+ <string name="media_item_count_format">
+ (%d ortamı ögesi)
+ </string>
+ <string name="empty_item_text">
+ &lt;boÅŸ&gt;
+ </string>
+ <string name="parcel_media_name">
+ Parsel Akış Ortamı
+ </string>
+ <string name="parcel_audio_name">
+ Parsel Akış Sesi
+ </string>
+ <string name="playing_suffix">
+ (oynatılıyor)
+ </string>
+ <panel name="minimized_controls">
+ <button label="Tümünü Durdur" name="all_nearby_media_disable_btn" tool_tip="Tüm yakın ortamları kapat"/>
+ <button label="Tümünü Başlat" name="all_nearby_media_enable_btn" tool_tip="Tüm yakın ortamları aç"/>
+ <button name="open_prefs_btn" tool_tip="Ortam tercihlerini getirir"/>
+ <button label="Daha Fazla &gt;&gt;" label_selected="&lt;&lt; Daha Az" name="more_btn" tool_tip="GeliÅŸmiÅŸ Kontroller"/>
+ </panel>
+ <panel name="nearby_media_panel">
+ <text name="nearby_media_title">
+ Yakındaki Ortamlar
+ </text>
+ <text name="show_text">
+ Göster :
+ </text>
+ <combo_box name="show_combo">
+ <combo_box.item label="Tümü" name="All"/>
+ <combo_box.item label="Bu Parseldeki" name="WithinParcel"/>
+ <combo_box.item label="Bu Parselin Dışında" name="OutsideParcel"/>
+ <combo_box.item label="DiÄŸer Avatarlarda" name="OnOthers"/>
+ </combo_box>
+ <scroll_list name="media_list">
+ <scroll_list.columns label="Yakınlık" name="media_proximity"/>
+ <scroll_list.columns label="Görünür" name="media_visibility"/>
+ <scroll_list.columns label="Sınıf" name="media_class"/>
+ <scroll_list.columns label="Ad" name="media_name"/>
+ <scroll_list.columns label="Hata ayıkla" name="media_debug"/>
+ </scroll_list>
+ <panel name="media_controls_panel">
+ <layout_stack name="media_controls">
+ <layout_panel name="stop">
+ <button name="stop_btn" tool_tip="Seçilen ortamı durdur"/>
+ </layout_panel>
+ <layout_panel name="play">
+ <button name="play_btn" tool_tip="Seçilen ortamı oynat"/>
+ </layout_panel>
+ <layout_panel name="pause">
+ <button name="pause_btn" tool_tip="Seçilen ortamı duraklat"/>
+ </layout_panel>
+ <layout_panel name="volume_slider_ctrl">
+ <slider_bar initial_value="0.5" name="volume_slider" tool_tip="Seçilen ortamı için ses düzeyi"/>
+ </layout_panel>
+ <layout_panel name="mute">
+ <button name="mute_btn" tool_tip="Seçilen ortamda ses sustur"/>
+ </layout_panel>
+ <layout_panel name="zoom">
+ <button name="zoom_btn" tool_tip="Seçilen ortama yakınlaştır"/>
+ </layout_panel>
+ <layout_panel name="unzoom">
+ <button name="unzoom_btn" tool_tip="Seçilen ortamdan uzaklaştır"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_notify_textbox.xml b/indra/newview/skins/default/xui/tr/panel_notify_textbox.xml
new file mode 100644
index 0000000000..b893da2a71
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_notify_textbox.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="instant_message" name="panel_notify_textbox">
+ <string name="message_max_lines_count" value="7"/>
+ <panel label="info_panel" name="info_panel">
+ <text_editor name="message" value="ileti"/>
+ </panel>
+ <panel label="control_panel" name="control_panel">
+ <button label="Gönder" name="btn_submit"/>
+ <button label="Yok say" name="ignore_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_online_status_toast.xml b/indra/newview/skins/default/xui/tr/panel_online_status_toast.xml
new file mode 100644
index 0000000000..fdc489f375
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_online_status_toast.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="friend_online_status" name="friend_online_status"/>
diff --git a/indra/newview/skins/default/xui/tr/panel_outbox_inventory.xml b/indra/newview/skins/default/xui/tr/panel_outbox_inventory.xml
new file mode 100644
index 0000000000..a947eee150
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_outbox_inventory.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<outbox_inventory_panel name="inventory_outbox" tool_tip="Öğeleri vitrininizde satışa hazırlamak için sürükleyip buraya bırakın"/>
diff --git a/indra/newview/skins/default/xui/tr/panel_outfit_edit.xml b/indra/newview/skins/default/xui/tr/panel_outfit_edit.xml
new file mode 100644
index 0000000000..00cd49abcd
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_outfit_edit.xml
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- Side tray Outfit Edit panel -->
+<panel name="outfit_edit">
+ <string name="No Outfit" value="Dış Görünüm Yok"/>
+ <string name="unsaved_changes" value="KaydedilmemiÅŸ DeÄŸiÅŸiklikler"/>
+ <string name="now_editing" value="Şimdi Düzenleniyor"/>
+ <panel.string name="not_available">
+ (G/D)
+ </panel.string>
+ <panel.string name="unknown">
+ (bilinmiyor)
+ </panel.string>
+ <string name="Filter.All" value="Tümü"/>
+ <string name="Filter.Clothes/Body" value="Giysiler/Gövde"/>
+ <string name="Filter.Objects" value="Nesneler"/>
+ <string name="Filter.Clothing" value="Giysiler"/>
+ <string name="Filter.Bodyparts" value="Vücut bölümleri"/>
+ <string name="replace_body_part" value="Mevcut şeklinizi değiştirmek için tıklayın"/>
+ <text name="title" value="Dış Görünümü Düzenle"/>
+ <panel name="header_panel">
+ <panel name="outfit_name_and_status">
+ <text name="status" value="Şimdi düzenleniyor..."/>
+ <text name="curr_outfit_name" value="[Mevcut Dış Görünüm]"/>
+ </panel>
+ </panel>
+ <layout_stack name="im_panels">
+ <layout_panel name="outfit_wearables_panel">
+ <layout_stack name="filter_panels">
+ <layout_panel name="add_button_and_combobox">
+ <button label="Daha Fazla Ekle..." name="show_add_wearables_btn" tool_tip="Aç/Kapa"/>
+ </layout_panel>
+ <layout_panel name="filter_panel">
+ <filter_editor label="Giyilebilirler Envanterini Filtrele" name="look_item_filter"/>
+ </layout_panel>
+ </layout_stack>
+ </layout_panel>
+ <layout_panel name="add_wearables_panel">
+ <button label="Ögeyi Giy" name="plus_btn"/>
+ </layout_panel>
+ </layout_stack>
+ <panel name="no_add_wearables_button_bar">
+ <button name="shop_btn_1" tool_tip="SL Pazarını Ziyaret Et. Ayrıca giymekte olduğunuz bir şeyi de seçebilir ve buraya tıklayarak benzer şeylere bakabilirsiniz"/>
+ </panel>
+ <panel name="add_wearables_button_bar">
+ <button name="shop_btn_2" tool_tip="SL Pazarını Ziyaret Et. Ayrıca giymekte olduğunuz bir şeyi de seçebilir ve buraya tıklayarak benzer şeylere bakabilirsiniz"/>
+ </panel>
+ <panel name="save_revert_button_bar">
+ <layout_stack name="button_bar_ls">
+ <layout_panel name="save_btn_lp">
+ <button label="Kaydet" name="save_btn"/>
+ </layout_panel>
+ <layout_panel name="revert_btn_lp">
+ <button label="Değişiklikleri Geri Al" name="revert_btn" tool_tip="Son kaydedilen versiyona dön"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_outfits_inventory.xml b/indra/newview/skins/default/xui/tr/panel_outfits_inventory.xml
new file mode 100644
index 0000000000..550f7ebf10
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_outfits_inventory.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="EÅŸyalar" name="Outfits">
+ <panel.string name="wear_outfit_tooltip">
+ Seçilen dış görünümü giy
+ </panel.string>
+ <panel.string name="wear_items_tooltip">
+ Seçilen öğeleri giy
+ </panel.string>
+ <tab_container name="appearance_tabs">
+ <panel label="DIŞ GÖRÜNÜMLERİM" name="outfitslist_tab"/>
+ <panel label="GİYİLEN" name="cof_tab"/>
+ </tab_container>
+ <panel name="bottom_panel">
+ <layout_stack name="bottom_panel_ls">
+ <layout_panel name="save_btn_lp">
+ <button label="Farklı Kaydet" name="save_btn"/>
+ </layout_panel>
+ <layout_panel name="wear_btn_lp">
+ <button label="Giy" name="wear_btn"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_outfits_inventory_gear_default.xml b/indra/newview/skins/default/xui/tr/panel_outfits_inventory_gear_default.xml
new file mode 100644
index 0000000000..d222f1a6e3
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_outfits_inventory_gear_default.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_gear_default">
+ <menu_item_call label="Mevcut Dış Görünümü Değiştir" name="wear"/>
+ <menu_item_call label="Mevcut Dış Görünümden Kaldır" name="remove"/>
+ <menu_item_call label="Yeniden Adlandır" name="rename"/>
+ <menu_item_call label="Bağlantıyı Kaldır" name="remove_link"/>
+ <menu_item_call label="Dış Görünümü Sil" name="delete"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/tr/panel_outfits_list.xml b/indra/newview/skins/default/xui/tr/panel_outfits_list.xml
new file mode 100644
index 0000000000..60a3576d84
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_outfits_list.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="Outfits">
+ <accordion name="outfits_accordion">
+ <no_matched_tabs_text name="no_matched_outfits_msg" value="Aradığınızı bulamadınız mı? [secondlife:///app/search/all/[SEARCH_TERM] Arama] yapmayı deneyin."/>
+ <no_visible_tabs_text name="no_outfits_msg" value="Henüz herhangi bir dış görünümünüz yok. Try [secondlife:///app/search/all/ Arama] yapmayı deneyin"/>
+ </accordion>
+ <panel name="bottom_panel">
+ <menu_button name="options_gear_btn" tool_tip="İlave seçenekleri göster"/>
+ <button name="trash_btn" tool_tip="Seçili dış görünümü sil"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_outfits_wearing.xml b/indra/newview/skins/default/xui/tr/panel_outfits_wearing.xml
new file mode 100644
index 0000000000..462926738f
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_outfits_wearing.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="Wearing">
+ <panel name="bottom_panel">
+ <menu_button name="options_gear_btn" tool_tip="İlave seçenekleri göster"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_people.xml b/indra/newview/skins/default/xui/tr/panel_people.xml
new file mode 100644
index 0000000000..1a1e53bac2
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_people.xml
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- Side tray panel -->
+<panel label="KiÅŸiler" name="people_panel">
+ <string name="no_recent_people" value="Yakın zamanlı kişi yok. Birlikte takılacak kişiler mi arıyorsunuz? [secondlife:///app/search/people Arayı] veya [secondlife:///app/worldmap Dünya Haritasını] deneyin."/>
+ <string name="no_filtered_recent_people" value="Aradığınızı bulamadınız mı? [secondlife:///app/search/people/[SEARCH_TERM] Ara] deneyin."/>
+ <string name="no_one_near" value="Yakında kimse yok. Birlikte takılacak kişiler mi arıyorsunuz? [secondlife:///app/search/people Arayın] veya [secondlife:///app/worldmap Dünya Haritasını] deneyin."/>
+ <string name="no_one_filtered_near" value="Aradığınızı bulamadınız mı? [secondlife:///app/search/people/[SEARCH_TERM] Ara] deneyin."/>
+ <string name="no_friends_online" value="Çevrimiçi arkadaş yok"/>
+ <string name="no_friends" value="ArkadaÅŸ yok"/>
+ <string name="no_friends_msg">
+ [secondlife:///app/search/people Ara] kullanarak arkadaş bulun veya arkadaş olarak eklemek için bir Sakin üzerine sağ tıklayın.
+Birlikte takılacak kişiler mi arıyorsunuz? [secondlife:///app/worldmap Dünya Haritasını] deneyin.
+ </string>
+ <string name="no_filtered_friends_msg">
+ Aradığınızı bulamadınız mı? [secondlife:///app/search/people/[SEARCH_TERM] Ara] deneyin.
+ </string>
+ <string name="people_filter_label" value="KiÅŸileri Filtrele"/>
+ <string name="groups_filter_label" value="Grupları Filtrele"/>
+ <string name="no_filtered_groups_msg" value="Aradığınızı bulamadınız mı? [secondlife:///app/search/groups/[SEARCH_TERM] Ara] deneyin."/>
+ <string name="no_groups_msg" value="Katılacak Gruplar mı arıyorsunuz? [secondlife:///app/search/groups Ara] deneyin."/>
+ <string name="MiniMapToolTipMsg" value="[REGION](Haritayı açmak için çift tıkla, yatay hareket için shift çek)"/>
+ <string name="AltMiniMapToolTipMsg" value="[REGION](Işınlamak için çift tıkla, yatay hareket için shift çek)"/>
+ <filter_editor label="Filtrele" name="filter_input"/>
+ <tab_container name="tabs">
+ <panel label="YAKIN" name="nearby_panel">
+ <panel label="bottom_panel" name="bottom_panel">
+ <menu_button name="nearby_view_sort_btn" tool_tip="Seçenklr."/>
+ <button name="add_friend_btn" tool_tip="Seçilen Sakini arkadaş listene ekle"/>
+ </panel>
+ </panel>
+ <panel label="ARKADAÅžLARIM" name="friends_panel">
+ <accordion name="friends_accordion">
+ <accordion_tab name="tab_online" title="Çevrimiçi"/>
+ <accordion_tab name="tab_all" title="Tümü"/>
+ </accordion>
+ <panel label="bottom_panel" name="bottom_panel">
+ <layout_stack name="bottom_panel">
+ <layout_panel name="options_gear_btn_panel">
+ <menu_button name="friends_viewsort_btn" tool_tip="İlave seçenekleri göster"/>
+ </layout_panel>
+ <layout_panel name="add_btn_panel">
+ <button name="add_btn" tool_tip="Bir Sakine arkadaşlık öner"/>
+ </layout_panel>
+ <layout_panel name="trash_btn_panel">
+ <dnd_button name="del_btn" tool_tip="Seçilen kişiyi arkadaş Listenden çıkar"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+ </panel>
+ <panel label="GRUPLARIM" name="groups_panel">
+ <panel label="bottom_panel" name="bottom_panel">
+ <menu_button name="groups_viewsort_btn" tool_tip="Seçenklr."/>
+ <button name="plus_btn" tool_tip="Gruba katıl/yeni grup oluştur"/>
+ <button name="activate_btn" tool_tip="Seçilen grubu etkinleştir"/>
+ </panel>
+ </panel>
+ <panel label="SON" name="recent_panel">
+ <panel label="bottom_panel" name="bottom_panel">
+ <menu_button name="recent_viewsort_btn" tool_tip="Seçenklr."/>
+ <button name="add_friend_btn" tool_tip="Seçilen Sakini arkadaş listene ekle"/>
+ </panel>
+ </panel>
+ </tab_container>
+ <panel name="button_bar">
+ <layout_stack name="bottom_bar_ls">
+ <layout_panel name="view_profile_btn_lp">
+ <button label="Profil" name="view_profile_btn" tool_tip="Resim, grup ve diğer Sakin bilgilerini göster"/>
+ </layout_panel>
+ <layout_panel name="im_btn_lp">
+ <button label="Aİ" name="im_btn" tool_tip="Anlık ileti oturumu aç"/>
+ </layout_panel>
+ <layout_panel name="call_btn_lp">
+ <button label="Ara" name="call_btn" tool_tip="Bu Sakini ara"/>
+ </layout_panel>
+ <layout_panel name="share_btn_lp">
+ <button label="Paylaş" name="share_btn" tool_tip="Bir envanter öğesini paylaş"/>
+ </layout_panel>
+ <layout_panel name="teleport_btn_lp">
+ <button label="Işınla" name="teleport_btn" tool_tip="Işınlama teklif et"/>
+ </layout_panel>
+ </layout_stack>
+ <layout_stack name="bottom_bar_ls1">
+ <layout_panel name="group_info_btn_lp">
+ <button label="Grup Profili" name="group_info_btn" tool_tip="Grup bilgilerini göster"/>
+ </layout_panel>
+ <layout_panel name="chat_btn_lp">
+ <button label="Grup Sohbeti" name="chat_btn" tool_tip="Sohbet oturumu aç"/>
+ </layout_panel>
+ <layout_panel name="group_call_btn_lp">
+ <button label="Grup Araması" name="group_call_btn" tool_tip="Bu grubu ara"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_pick_info.xml b/indra/newview/skins/default/xui/tr/panel_pick_info.xml
new file mode 100644
index 0000000000..f2bbfac232
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_pick_info.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_pick_info">
+ <text name="title" value="Seçme Bilgileri"/>
+ <scroll_container name="profile_scroll">
+ <panel name="scroll_content_panel">
+ <text_editor name="pick_name" value="[ad]"/>
+ <text_editor name="pick_location" value="[yükleniyor...]"/>
+ <text_editor name="pick_desc" value="[açıklama]"/>
+ </panel>
+ </scroll_container>
+ <panel name="buttons">
+ <layout_stack name="layout_stack1">
+ <layout_panel name="layout_panel1">
+ <button label="Işınla" name="teleport_btn"/>
+ </layout_panel>
+ <layout_panel name="show_on_map_btn_lp">
+ <button label="Harita" name="show_on_map_btn"/>
+ </layout_panel>
+ <layout_panel name="edit_btn_lp">
+ <button label="Düzenle" name="edit_btn"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_picks.xml b/indra/newview/skins/default/xui/tr/panel_picks.xml
new file mode 100644
index 0000000000..26beac7854
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_picks.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Favorilerim" name="panel_picks">
+ <string name="no_picks" value="Seçme Yok"/>
+ <string name="no_classifieds" value="İlan Yok"/>
+ <accordion name="accordion">
+ <accordion_tab name="tab_picks" title="Seçmelerim"/>
+ <accordion_tab name="tab_classifieds" title="İlanlar"/>
+ </accordion>
+ <panel label="bottom_panel" name="edit_panel">
+ <layout_stack name="edit_panel_ls">
+ <layout_panel name="gear_menu_btn">
+ <button name="new_btn" tool_tip="Mevcut konumda yeni bir seçme veya ilan oluşturun"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+ <panel name="buttons_cucks">
+ <layout_stack name="buttons_cucks_ls">
+ <layout_panel name="info_btn_lp">
+ <button label="Bilgi" name="info_btn" tool_tip="Seçme bilgilerini göster"/>
+ </layout_panel>
+ <layout_panel name="teleport_btn_lp">
+ <button label="Işınla" name="teleport_btn" tool_tip="İlişkili alana ışınlanın"/>
+ </layout_panel>
+ <layout_panel name="show_on_map_btn_lp">
+ <button label="Harita" name="show_on_map_btn" tool_tip="İlişkili alanı Dünya Haritasında göster"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_place_profile.xml b/indra/newview/skins/default/xui/tr/panel_place_profile.xml
new file mode 100644
index 0000000000..f42cde0ace
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_place_profile.xml
@@ -0,0 +1,118 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="place_profile">
+ <string name="on" value="Açık"/>
+ <string name="off" value="Kapalı"/>
+ <string name="anyone" value="Herkes"/>
+ <string name="available" value="kullanılabilir"/>
+ <string name="allocated" value="tahsis edilen"/>
+ <string name="title_place" value="Profili YerleÅŸtir"/>
+ <string name="title_teleport_history" value="Işınlanma Geçmişi"/>
+ <string name="not_available" value="(G/D)"/>
+ <string name="unknown" value="(bilinmiyor)"/>
+ <string name="public" value="(kamuya açık)"/>
+ <string name="none_text" value="(hiçbiri)"/>
+ <string name="sale_pending_text" value="(Satış Bekliyor)"/>
+ <string name="group_owned_text" value="(Sahibi Olunan Grup)"/>
+ <string name="price_text" value="L$"/>
+ <string name="area_text" value="m²"/>
+ <string name="all_residents_text" value="Tüm Second Life Sakinleri"/>
+ <string name="group_text" value="Grup"/>
+ <string name="can_resell">
+ Bu bölgede satın alınan arazi tekrar satılabilir.
+ </string>
+ <string name="can_not_resell">
+ Bu bölgede satın alınan arazi tekrar satılamayabilir.
+ </string>
+ <string name="can_change">
+ Bu bölgede satın alınan arazi birleştirilebilir veya bölünebilir.
+ </string>
+ <string name="can_not_change">
+ Bu bölgede satın alınan arazi birleştirilemeyebilir veya bölünemeyebilir.
+ </string>
+ <string name="server_update_text">
+ Sunucu güncelleştirmesi olmadan yer bilgisi mevcut olmaz.
+ </string>
+ <string name="server_error_text">
+ Bu konum hakkında şu anda bilgi mevcut değil, lütfen daha sonra tekrar deneyin.
+ </string>
+ <string name="server_forbidden_text">
+ Erişim kısıtlamaları nedeniyle bu konum hakkında bilgiye erişilemiyor. Lütfen parsel sahibi nezdinde izinlerinizi kontrol edin.
+ </string>
+ <string name="acquired_date">
+ [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]
+ </string>
+ <button name="back_btn" tool_tip="Geri"/>
+ <text name="title" value="Profili YerleÅŸtir"/>
+ <scroll_container name="place_scroll">
+ <panel name="scrolling_panel">
+ <text name="region_title" value="Örnek Bölge"/>
+ <text name="parcel_title" value="Örnek Parsel, Uzun Ad (145, 228, 26)"/>
+ <expandable_text name="description" value="Du waltz die spritz"/>
+ <text name="owner_label" value="Sahip:"/>
+ <text name="owner_value" value="Alex Superduperlongenamenton"/>
+ <text name="maturity_value" value="bilinmiyor"/>
+ <accordion name="advanced_info_accordion">
+ <accordion_tab name="parcel_characteristics_tab" title="Parsel">
+ <panel name="parcel_characteristics_panel">
+ <text name="rating_label" value="Seviye:"/>
+ <text name="rating_value" value="bilinmiyor"/>
+ <text name="voice_label" value="Sesli:"/>
+ <text name="voice_value" value="Açık"/>
+ <text name="fly_label" value="Uçma:"/>
+ <text name="fly_value" value="Açık"/>
+ <text name="push_label" value="İtme:"/>
+ <text name="push_value" value="Kapalı"/>
+ <text name="build_label" value="İnşa Et:"/>
+ <text name="build_value" value="Açık"/>
+ <text name="scripts_label" value="Komut Dosyaları:"/>
+ <text name="scripts_value" value="Açık"/>
+ <text name="damage_label" value="Hasar:"/>
+ <text name="damage_value" value="Kapalı"/>
+ <text name="see_avatars_label" value="Avatarları Gör:"/>
+ <text name="see_avatars_value" value="Kapalı"/>
+ <button label="Arazi Hakkında" name="about_land_btn"/>
+ </panel>
+ </accordion_tab>
+ <accordion_tab name="region_information_tab" title="Bölge">
+ <panel name="region_information_panel">
+ <text name="region_name_label" value="Bölge:"/>
+ <text name="region_name" value="Geyik arazisi"/>
+ <text name="region_type_label" value="Tür:"/>
+ <text name="region_type" value="Geyik"/>
+ <text name="region_rating_label" value="Seviye:"/>
+ <text name="region_rating" value="YetiÅŸkin"/>
+ <text name="region_owner_label" value="Sahip:"/>
+ <text name="region_owner" value="geyik Can Geyik ekstra uzun ad geyik"/>
+ <text name="region_group_label" value="Grup:"/>
+ <text name="region_group">
+ Geyik Şehrinin Güçlü Geyiği soundvillemoose
+ </text>
+ <button label="Bölge/Gayrimenkul" name="region_info_btn"/>
+ </panel>
+ </accordion_tab>
+ <accordion_tab name="estate_information_tab" title="Gayrimenkul">
+ <panel name="estate_information_panel">
+ <text name="estate_name_label" value="Gayrimenkul:"/>
+ <text name="estate_rating_label" value="Seviye:"/>
+ <text name="estate_owner_label" value="Sahip:"/>
+ <text name="estate_owner" value="Sahip adının uzunluğu uzun adla deneniyor"/>
+ <text name="covenant_label" value="Sözleşme:"/>
+ </panel>
+ </accordion_tab>
+ <accordion_tab name="sales_tab" title="Satılık">
+ <panel name="sales_panel">
+ <text name="sales_price_label" value="Fiyat:"/>
+ <text name="area_label" value="Alan:"/>
+ <text name="traffic_label" value="Trafik:"/>
+ <text name="primitives_label" value="Temel öğeler:"/>
+ <text name="parcel_scripts_label" value="Komut Dosyaları:"/>
+ <text name="terraform_limits_label" value="Yer ÅŸekillendirme limitleri:"/>
+ <text name="subdivide_label" value="Bölme/Katma yeteneği:"/>
+ <text name="resale_label" value="Tekrar Satış yeteneği:"/>
+ <text name="sale_to_label" value="Şu Alıcıya Satılık:"/>
+ </panel>
+ </accordion_tab>
+ </accordion>
+ </panel>
+ </scroll_container>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_places.xml b/indra/newview/skins/default/xui/tr/panel_places.xml
new file mode 100644
index 0000000000..c2a3acf9c5
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_places.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Yerler" name="places panel">
+ <string name="landmarks_tab_title" value="YER İMLERİM"/>
+ <string name="teleport_history_tab_title" value="IŞINLAMA GEÇMİŞİ"/>
+ <filter_editor label="Yerlerimi Filtrele" name="Filter"/>
+ <panel name="button_panel">
+ <layout_stack name="bottom_bar_ls0">
+ <layout_panel name="lp1">
+ <layout_stack name="bottom_bar_ls1">
+ <layout_panel name="teleport_btn_lp">
+ <button label="Işınla" name="teleport_btn" tool_tip="Seçilen alana ışınla"/>
+ </layout_panel>
+ <layout_panel name="chat_btn_lp">
+ <button label="Harita" name="map_btn" tool_tip="İlişkili alanı Dünya Haritasında göster"/>
+ </layout_panel>
+ </layout_stack>
+ </layout_panel>
+ <layout_panel name="lp2">
+ <layout_stack name="bottom_bar_ls3">
+ <layout_panel name="edit_btn_lp">
+ <button label="Düzenle" name="edit_btn" tool_tip="Yer imi bilgisini düzenle"/>
+ </layout_panel>
+ <layout_panel name="overflow_btn_lp">
+ <menu_button name="overflow_btn" tool_tip="İlave seçenekleri göster"/>
+ </layout_panel>
+ </layout_stack>
+ <layout_stack name="bottom_bar_profile_ls">
+ <layout_panel name="profile_btn_lp">
+ <button label="Profil" name="profile_btn" tool_tip="Yer profilini göster"/>
+ </layout_panel>
+ </layout_stack>
+ <layout_stack name="bottom_bar_close_ls3">
+ <layout_panel name="close_btn_lp">
+ <button label="Kapat" name="close_btn"/>
+ </layout_panel>
+ </layout_stack>
+ </layout_panel>
+ </layout_stack>
+ <layout_stack name="bottom_bar_ls2">
+ <layout_panel name="save_btn_lp">
+ <button label="Kaydet" name="save_btn"/>
+ </layout_panel>
+ <layout_panel name="cancel_btn_lp">
+ <button label="İptal" name="cancel_btn"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_postcard_message.xml b/indra/newview/skins/default/xui/tr/panel_postcard_message.xml
new file mode 100644
index 0000000000..2361f4c1c3
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_postcard_message.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_postcard_message">
+ <text name="to_label">
+ Kime:
+ </text>
+ <text name="name_label">
+ Kimden:
+ </text>
+ <text name="subject_label">
+ Konu:
+ </text>
+ <line_editor label="Konunuzu buraya yazın." name="subject_form"/>
+ <text name="msg_label">
+ İleti:
+ </text>
+ <text_editor name="msg_form">
+ İletinizi buraya yazın.
+ </text_editor>
+ <button label="İptal" name="cancel_btn"/>
+ <button label="Gönder" name="send_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_postcard_settings.xml b/indra/newview/skins/default/xui/tr/panel_postcard_settings.xml
new file mode 100644
index 0000000000..bce0b21b9a
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_postcard_settings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_postcard_settings">
+ <combo_box label="Çözünürlük" name="postcard_size_combo">
+ <combo_box.item label="Mevcut Pencere" 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="Özel" name="Custom"/>
+ </combo_box>
+ <layout_stack name="postcard_image_params_ls">
+ <layout_panel name="postcard_image_size_lp">
+ <spinner label="GeniÅŸlik" name="postcard_snapshot_width"/>
+ <spinner label="Yükseklik" name="postcard_snapshot_height"/>
+ <check_box label="Oranları koru" name="postcard_keep_aspect_check"/>
+ </layout_panel>
+ <layout_panel name="postcard_image_format_quality_lp">
+ <slider label="Görüntü kalitesi" name="image_quality_slider"/>
+ <text name="image_quality_level">
+ ([QLVL])
+ </text>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/tr/panel_preferences_advanced.xml
new file mode 100644
index 0000000000..770cdc6efd
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_preferences_advanced.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<panel label="GeliÅŸmiÅŸ" name="advanced">
+ <panel.string name="aspect_ratio_text">
+ [NUM]:[DEN]
+ </panel.string>
+ <text name="Cache:">
+ Önbellek:
+ </text>
+ <spinner label="Önbellek boyutu (64-9984 MB)" name="cachesizespinner"/>
+ <text name="text_box5">
+ MB
+ </text>
+ <button label="Önbelleği Sil" label_selected="Önbelleği Sil" name="clear_cache"/>
+ <text name="Cache location">
+ Önbellek konumu:
+ </text>
+ <button label="Gözat" label_selected="Gözat" name="set_cache"/>
+ <button label="Varsayılan Konum" label_selected="Varsayılan Konum" name="default_cache_location"/>
+ <text name="UI Size:">
+ KA büyüklüğü:
+ </text>
+ <check_box label="Şuradaki komut dosyası hatalarını göster:" name="show_script_errors"/>
+ <radio_group name="show_location">
+ <radio_item label="Yakındaki sohbet" name="0"/>
+ <radio_item label="Ayrı pencere" name="1"/>
+ </radio_group>
+ <check_box label="Birden Çok Görüntüleyiciye İzin Ver" name="allow_multiple_viewer_check"/>
+ <check_box label="Oturum açarken Ağ Seçimini göster" name="show_grid_selection_check"/>
+ <check_box label="Gelişmiş Menüyü Göster" name="show_advanced_menu_check"/>
+ <check_box label="Geliştirici Menüsünü Göster" name="show_develop_menu_check"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_preferences_alerts.xml b/indra/newview/skins/default/xui/tr/panel_preferences_alerts.xml
new file mode 100644
index 0000000000..46a4793c53
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_preferences_alerts.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Açılır Uyarılar" name="popups">
+ <text name="tell_me_label">
+ Bana söyle:
+ </text>
+ <check_box label="L$ harcadığımda veya aldığımda" name="notify_money_change_checkbox"/>
+ <check_box label="Arkadaşlarım oturum açtığında veya kapattığında" name="friends_online_notify_checkbox"/>
+ <text name="show_label">
+ Daima göster:
+ </text>
+ <text name="dont_show_label">
+ Asla gösterme:
+ </text>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_preferences_chat.xml b/indra/newview/skins/default/xui/tr/panel_preferences_chat.xml
new file mode 100644
index 0000000000..9caf95a122
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_preferences_chat.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Metin Sohbeti" name="chat">
+ <text name="font_size">
+ Font büyüklüğü:
+ </text>
+ <radio_group name="chat_font_size">
+ <radio_item label="Küçük" name="radio" value="0"/>
+ <radio_item label="Orta" name="radio2" value="1"/>
+ <radio_item label="Büyük" name="radio3" value="2"/>
+ </radio_group>
+ <check_box initial_value="true" label="Sohbet sırasında yazma animasyonunu oynat" name="play_typing_animation"/>
+ <check_box label="Çevrimdışı olduğunda Aİ&apos;ler e-posta ile bana gönderilsin" name="send_im_to_email"/>
+ <check_box label="Düz metin Aİ&apos;ler ve sohbet geçmişini etkinleştir" name="plain_text_chat_history"/>
+ <check_box label="Balon Sohbeti" name="bubble_text_chat"/>
+ <text name="show_ims_in_label">
+ Aİ&apos;leri şurada göster:
+ </text>
+ <text name="requires_restart_label">
+ (tekrar baÅŸlatma gerekir)
+ </text>
+ <radio_group name="chat_window" tool_tip="Anlık İletileri ayrı gezdiricilerde veya çoklu sekmelere sahip tek bir gezdiricide gösterin (tekrar başlatma gerekir)">
+ <radio_item label="Ayrı Pencereler" name="radio" value="0"/>
+ <radio_item label="Sekmeler" name="radio2" value="1"/>
+ </radio_group>
+ <text name="disable_toast_label">
+ Gelen sohbet için açılır pencereleri etkinleştir:
+ </text>
+ <check_box label="Grup Sohbetleri" name="EnableGroupChatPopups" tool_tip="Bir Grup Sohbet iletisi gönderildiğinde açılır pencereleri görmek için işaretle"/>
+ <check_box label="Aİ Sohbetleri" name="EnableIMChatPopups" tool_tip="Bir anlık ileti geldiğinde açılır pencereleri görmek için işaretle"/>
+ <spinner label="Yakındaki sohbet iletilerinin vurgulanma süresi:" name="nearby_toasts_lifetime"/>
+ <spinner label="Yakındaki sohbet iletilerinin sönme süresi:" name="nearby_toasts_fadingtime"/>
+ <button label="Sohbet Çevirisi Ayarları" name="ok_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_preferences_colors.xml b/indra/newview/skins/default/xui/tr/panel_preferences_colors.xml
new file mode 100644
index 0000000000..f6e9d0948c
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_preferences_colors.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Renkler" name="colors_panel">
+ <text name="effects_color_textbox">
+ Efektlerim (seçim ışını):
+ </text>
+ <color_swatch name="effect_color_swatch" tool_tip="Renk Seçiciyi açmak için tıklayın"/>
+ <text name="font_colors">
+ Sohbet font renkleri:
+ </text>
+ <text name="text_box1">
+ Ben
+ </text>
+ <text name="text_box2">
+ DiÄŸerleri
+ </text>
+ <text name="text_box3">
+ Nesneler
+ </text>
+ <text name="text_box4">
+ Sistem
+ </text>
+ <text name="text_box5">
+ Hatalar
+ </text>
+ <text name="text_box10">
+ DoÄŸrudan
+ </text>
+ <text name="text_box7">
+ Sahip
+ </text>
+ <text name="text_box9">
+ URL&apos;ler
+ </text>
+ <text name="bubble_chat">
+ Ad etiketinin arka plan rengi (ayrıca Balon Sohbeti de etkiler):
+ </text>
+ <color_swatch name="background" tool_tip="Ad etiketi rengini seç"/>
+ <slider label="Geçirgenlik:" name="bubble_chat_opacity" tool_tip="Ad etiketi geçirgenliğini seç"/>
+ <text name="floater_opacity">
+ Gezdirici Geçirgenliği:
+ </text>
+ <slider label="Etkin:" name="active"/>
+ <slider label="Etkin deÄŸil:" name="inactive"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_preferences_general.xml b/indra/newview/skins/default/xui/tr/panel_preferences_general.xml
new file mode 100644
index 0000000000..4a48b1588c
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_preferences_general.xml
@@ -0,0 +1,76 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Genel" name="general_panel">
+ <text name="language_textbox">
+ Dil:
+ </text>
+ <combo_box name="language_combobox">
+ <combo_box.item label="Sistem varsayılanı" name="System Default Language"/>
+ <combo_box.item label="English (İngilizce)" name="English"/>
+ <combo_box.item label="Dansk (Danca) - Beta" name="Danish"/>
+ <combo_box.item label="Deutsch (Almanca) - Beta" name="Deutsch(German)"/>
+ <combo_box.item label="Español (İspanyolca) - Beta" name="Spanish"/>
+ <combo_box.item label="Français (Fransızca) - Beta" name="French"/>
+ <combo_box.item label="Italiano (İtalyanca) - Beta" name="Italian"/>
+ <combo_box.item label="Polski (Lehçe) - Beta" name="Polish"/>
+ <combo_box.item label="Português (Portekizce) - Beta" name="Portugese"/>
+ <combo_box.item label="РуÑÑкий (Rusça) - Beta" name="Russian"/>
+ <combo_box.item label="Türkçe - Beta" name="Turkish"/>
+ <combo_box.item label="日本語 (Japonca) - Beta" name="(Japanese)"/>
+ <combo_box.item label="正體中文 (Geleneksel Çince) - Beta" name="Traditional Chinese"/>
+ </combo_box>
+ <text name="language_textbox2">
+ (Yeniden baÅŸlatma gerekir)
+ </text>
+ <text name="maturity_desired_prompt">
+ Seviyelndrl. içeriğe erişim istiyorum::
+ </text>
+ <combo_box name="maturity_desired_combobox">
+ <combo_box.item label="Genel, Orta, YetiÅŸkin" name="Desired_Adult"/>
+ <combo_box.item label="Genel ve Orta" name="Desired_Mature"/>
+ <combo_box.item label="Genel" name="Desired_PG"/>
+ </combo_box>
+ <text name="start_location_textbox">
+ Standart konum:
+ </text>
+ <combo_box name="start_location_combo">
+ <combo_box.item label="Son konumum" name="MyLastLocation"/>
+ <combo_box.item label="Ana Konumum" name="MyHome"/>
+ </combo_box>
+ <check_box initial_value="true" label="Oturumu açarken göster" name="show_location_checkbox"/>
+ <text name="name_tags_textbox">
+ Ad etiketleri:
+ </text>
+ <radio_group name="Name_Tag_Preference">
+ <radio_item label="Kapalı" name="radio" value="0"/>
+ <radio_item label="Açık" name="radio2" value="1"/>
+ <radio_item label="Kısaca göster" name="radio3" value="2"/>
+ </radio_group>
+ <check_box label="Adım" name="show_my_name_checkbox1"/>
+ <check_box label="Kullanıcı adları" name="show_slids" tool_tip="Kullanıcı adını göster, bobsmith123 gibi"/>
+ <check_box label="Grup unvanları" name="show_all_title_checkbox1" tool_tip="Grup unvanlarını göster, Görevli veya Üye gibi"/>
+ <check_box label="Arkadaşları vurgula" name="show_friends" tool_tip="Arkadaşlarının ad etiketlerini vurgula"/>
+ <check_box label="Ekran Adlarını Görüntüle" name="display_names_check" tool_tip="Sohbet, Aİ, ad etiketleri, vb.de ekran adlarını kullanmak için işaretle"/>
+ <text name="inworld_typing_rg_label">
+ Basılacak harf tuşları:
+ </text>
+ <radio_group name="inworld_typing_preference">
+ <radio_item label="Yerel sohbet baÅŸlat" name="radio_start_chat" value="1"/>
+ <radio_item label="Hareketi etkiler (yani WASD)" name="radio_move" value="0"/>
+ </radio_group>
+ <text name="title_afk_text">
+ Uzakta süre sonu:
+ </text>
+ <combo_box label="Uzakta süre sonu:" name="afk">
+ <combo_box.item label="2 dakika" name="item0"/>
+ <combo_box.item label="5 dakika" name="item1"/>
+ <combo_box.item label="10 dakika" name="item2"/>
+ <combo_box.item label="30 dakika" name="item3"/>
+ <combo_box.item label="asla" name="item4"/>
+ </combo_box>
+ <text name="text_box3">
+ Meşgul durumu cevabı:
+ </text>
+ <text_editor name="busy_response">
+ log_in_to_change
+ </text_editor>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/tr/panel_preferences_graphics1.xml
new file mode 100644
index 0000000000..ddb83ffc69
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_preferences_graphics1.xml
@@ -0,0 +1,114 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Grafikler" name="Display panel">
+ <text name="QualitySpeed">
+ Kalite ve hız:
+ </text>
+ <text name="FasterText">
+ Daha hızlı
+ </text>
+ <text name="BetterText">
+ Daha iyi
+ </text>
+ <text name="ShadersPrefText">
+ Düşük
+ </text>
+ <text name="ShadersPrefText2">
+ Orta
+ </text>
+ <text name="ShadersPrefText3">
+ Yüksek
+ </text>
+ <text name="ShadersPrefText4">
+ Ultra
+ </text>
+ <panel label="ÖzelGrafikler" name="CustomGraphics Panel">
+ <text name="ShadersText">
+ Gölgelendiriciler:
+ </text>
+ <check_box initial_value="true" label="Saydam Su" name="TransparentWater"/>
+ <check_box initial_value="true" label="Tümsek eşleme ve parlaklık" name="BumpShiny"/>
+ <check_box initial_value="true" label="Yerel Işıklar" name="LocalLights"/>
+ <check_box initial_value="true" label="Temel gölgeleyiciler" name="BasicShaders" tool_tip="Bu seçeneğin devre dışı bırakılması bazı grafik kartlarının sürücülerinin kilitlenmesini önleyebilir"/>
+ <check_box initial_value="true" label="Atmosferik gölgeleyiciler" name="WindLightUseAtmosShaders"/>
+ <check_box initial_value="true" label="Işıklandırma ve Gölgeler" name="UseLightShaders"/>
+ <check_box initial_value="true" label="Ortam Gölgeleme" name="UseSSAO"/>
+ <check_box initial_value="true" label="Alan DerinliÄŸi" name="UseDoF"/>
+ <text name="shadows_label">
+ Gölgeler:
+ </text>
+ <combo_box name="ShadowDetail">
+ <combo_box.item label="Hiçbiri" name="0"/>
+ <combo_box.item label="Güneş/Ay" name="1"/>
+ <combo_box.item label="Güneş/Ay + Projektörler" name="2"/>
+ </combo_box>
+ <text name="reflection_label">
+ Su Yansımaları:
+ </text>
+ <combo_box name="Reflections">
+ <combo_box.item label="Minimal" name="0"/>
+ <combo_box.item label="Yüzey ve ağaçlar" name="1"/>
+ <combo_box.item label="Tüm statik nesneler" name="2"/>
+ <combo_box.item label="Tüm avatarlar ve nesneler" name="3"/>
+ <combo_box.item label="Her ÅŸey" name="4"/>
+ </combo_box>
+ <slider label="Avatar Fzk. Özlk.:" name="AvatarPhysicsDetail"/>
+ <text name="AvatarPhysicsDetailText">
+ Düşük
+ </text>
+ <slider label="Mesafeyi çiz:" name="DrawDistance"/>
+ <text name="DrawDistanceMeterText2">
+ m
+ </text>
+ <slider label="Maks. parçacık sayısı:" name="MaxParticleCount"/>
+ <slider label="Düşük gr. özl. olmayan mks. avatar:" name="MaxNumberAvatarDrawn"/>
+ <slider label="Son iÅŸleme kalitesi:" name="RenderPostProcess"/>
+ <text name="MeshDetailText">
+ Örgü detayı:
+ </text>
+ <slider label="Nesneler:" name="ObjectMeshDetail"/>
+ <slider label="Esnek primler:" name="FlexibleMeshDetail"/>
+ <slider label="Ağaçlar:" name="TreeMeshDetail"/>
+ <slider label="Avatarlar:" name="AvatarMeshDetail"/>
+ <slider label="Yüzey:" name="TerrainMeshDetail"/>
+ <slider label="Gökyüzü:" name="SkyMeshDetail"/>
+ <text name="PostProcessText">
+ Düşük
+ </text>
+ <text name="ObjectMeshDetailText">
+ Düşük
+ </text>
+ <text name="FlexibleMeshDetailText">
+ Düşük
+ </text>
+ <text name="TreeMeshDetailText">
+ Düşük
+ </text>
+ <text name="AvatarMeshDetailText">
+ Düşük
+ </text>
+ <text name="TerrainMeshDetailText">
+ Düşük
+ </text>
+ <text name="SkyMeshDetailText">
+ Düşük
+ </text>
+ <text name="AvatarRenderingText">
+ Avatar İşleme:
+ </text>
+ <check_box initial_value="true" label="Düşük grafik özellikli avatarlar" name="AvatarImpostors"/>
+ <check_box initial_value="true" label="Donanım ile kaplama" name="AvatarVertexProgram"/>
+ <check_box initial_value="true" label="Avatar giysisi" name="AvatarCloth"/>
+ <text name="TerrainDetailText">
+ Yüzey detayı:
+ </text>
+ <radio_group name="TerrainDetailRadio">
+ <radio_item label="Düşük" name="0"/>
+ <radio_item label="Yüksek" name="2"/>
+ </radio_group>
+ --&gt;
+ </panel>
+ <button label="Uygula" label_selected="Uygula" name="Apply"/>
+ <button label="Sıfırla" name="Defaults"/>
+ <button label="GeliÅŸmiÅŸ" name="Advanced"/>
+ <button label="Donanım" label_selected="Donanım" name="GraphicsHardwareButton"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_preferences_move.xml b/indra/newview/skins/default/xui/tr/panel_preferences_move.xml
new file mode 100644
index 0000000000..c35eaec9c3
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_preferences_move.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Hareket Et" name="move_panel">
+ <slider label="Gröünüm açısı" name="camera_fov"/>
+ <slider label="Mesafe" name="camera_offset_scale"/>
+ <text name="heading2">
+ Şunun için otomatik konum:
+ </text>
+ <check_box label="İnşa Et/Düzenle" name="edit_camera_movement" tool_tip="Düzenleme moduna girerken ve düzenleme modundan çıkarken otomatik kamera konumunu kullanın"/>
+ <check_box label="Görünüm" name="appearance_camera_movement" tool_tip="Düzenleme modundayken otomatik kamera konumunu kullan"/>
+ <text name="keyboard_lbl">
+ Klavye:
+ </text>
+ <check_box label="Ok tuşları beni her zaman hareket ettirir" name="arrow_keys_move_avatar_check"/>
+ <check_box label="Koşmak için iki kez dokun ve tut" name="tap_tap_hold_to_run"/>
+ <text name="mouse_lbl">
+ Fare:
+ </text>
+ <check_box label="Fare üzerinden görünümde beni göster" name="first_person_avatar_visible"/>
+ <text name=" Mouse Sensitivity">
+ Fare üzerinden görünümde fare hassasiyeti
+ </text>
+ <check_box label="Tersine çevir" name="invert_mouse"/>
+ <text name="single_click_action_lbl">
+ Arazi üzerine tek tıklama:
+ </text>
+ <combo_box name="single_click_action_combo">
+ <combo_box.item label="Eylem yok" name="0"/>
+ <combo_box.item label="Tıklanan noktaya hareket et" name="1"/>
+ </combo_box>
+ <text name="double_click_action_lbl">
+ Arazi üzerine çift tıklama:
+ </text>
+ <combo_box name="double_click_action_combo">
+ <combo_box.item label="Eylem yok" name="0"/>
+ <combo_box.item label="Tıklanan noktaya hareket et" name="1"/>
+ <combo_box.item label="Tıklanan noktaya ışınla" name="2"/>
+ </combo_box>
+ <button label="Diğer Aygıtlar" name="joystick_setup_button"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/tr/panel_preferences_privacy.xml
new file mode 100644
index 0000000000..9111594979
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_preferences_privacy.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="İletişim" name="im">
+ <panel.string name="log_in_to_change">
+ değiştirmek için oturum açın
+ </panel.string>
+ <button label="Geçmişi Temizle" name="clear_cache" tool_tip="Oturum açma görüntüsünü, son konumu, ışınlama geçmişini, web ve dokulama önbelleğini temizleyin."/>
+ <text name="cache_size_label_l">
+ (Konumlar, görüntüler, web, arama geçmişi)
+ </text>
+ <check_box label="Arama sonuçlarında beni göster" name="online_searchresults"/>
+ <check_box label="Çevrimiçi olduğumu sadece arkadaşlar ve gruplar bilsin" name="online_visibility"/>
+ <check_box label="Sadece arkadaşlar ve gruplar beni arasın veya Aİ göndersin" name="voice_call_friends_only_check"/>
+ <check_box label="Aramaları sonlandırırken mikrofonu kapat" name="auto_disengage_mic_check"/>
+ <check_box label="Oturum Açarken Favori Yer İmlerimi Göster (&apos;Buradan başla&apos; menüsünden)" name="favorites_on_login_check"/>
+ <text name="Logs:">
+ Sohbet Günlükleri:
+ </text>
+ <check_box label="Yakındaki sohbet günlüklerini bilgisayarımda göster" name="log_nearby_chat"/>
+ <check_box label="Aİ günlüklerini bilgisayarıma kaydet" name="log_instant_messages"/>
+ <check_box label="Sohbet günlüğünde her satıra zaman damgası eklensin" name="show_timestamps_check_im"/>
+ <check_box label="Günlük dosyası adına tarih damgası eklensin." name="logfile_name_datestamp"/>
+ <text name="log_path_desc">
+ Günlüklerin konumu:
+ </text>
+ <button label="Gözat" label_selected="Gözat" name="log_path_button"/>
+ <button label="Listeyi engelle" name="block_list"/>
+ <text name="block_list_label">
+ (EngellediÄŸiniz KiÅŸiler ve/veya Nesneler)
+ </text>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_preferences_setup.xml b/indra/newview/skins/default/xui/tr/panel_preferences_setup.xml
new file mode 100644
index 0000000000..9d03d9b01d
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_preferences_setup.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Ayarlar" name="Input panel">
+ <text name="Network:">
+ AÄŸ:
+ </text>
+ <text name="Maximum bandwidth">
+ Maksimum bant geniÅŸliÄŸi
+ </text>
+ <text name="text_box2">
+ kbps
+ </text>
+ <check_box label="Özel port" name="connection_port_enabled"/>
+ <spinner label="Port numarası:" name="connection_port"/>
+ <text name="Web:">
+ Web:
+ </text>
+ <radio_group name="use_external_browser">
+ <radio_item label="Tarayıcımı kullan (IE, Firefox, Safari)" name="external" tool_tip="Yardım, web bağlantıları vs. için sistemin varsayılan web tarayıcısını kullanın. Tam ekran çalıştırılıyorsa tavsiye edilmez." value="true"/>
+ <radio_item label="Yerleşik tarayıcıyı kullan" name="internal" tool_tip="Yardım, web bağlantıları vs. için dahili web tarayıcısını kullanın. Bu tarayıcı [APP_NAME] içerisinde yeni bir pencere olarak açılır." value=""/>
+ </radio_group>
+ <check_box initial_value="true" label="Eklentileri etkinleÅŸtir" name="browser_plugins_enabled"/>
+ <check_box initial_value="true" label="Çerezleri kabul et" name="cookies_enabled"/>
+ <check_box initial_value="true" label="Javascript&apos;i etkinleÅŸtir" name="browser_javascript_enabled"/>
+ <check_box initial_value="false" label="Ortam tarayıcısı açılır pencerelerini etkinleştir" name="media_popup_enabled"/>
+ <text name="Software updates:">
+ Yazılım güncelleştirmeleri:
+ </text>
+ <combo_box name="updater_service_combobox">
+ <combo_box.item label="Otomatik olarak kurulsun" name="Install_automatically"/>
+ <combo_box.item label="Güncelleştirmeler manuel olarak karşıdan yüklensin ve kurulsun" name="Install_manual"/>
+ </combo_box>
+ <text name="Proxy Settings:">
+ Proxy Ayarları:
+ </text>
+ <button label="Proxy ayarlarını yap" label_selected="Gözat" name="set_proxy"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_preferences_sound.xml b/indra/newview/skins/default/xui/tr/panel_preferences_sound.xml
new file mode 100644
index 0000000000..9256f1d324
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_preferences_sound.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Sesler" name="Preference Media panel">
+ <panel.string name="middle_mouse">
+ Orta Fare
+ </panel.string>
+ <slider label="Ana ses düzeyi" name="System Volume"/>
+ <check_box initial_value="true" name="mute_when_minimized"/>
+ <text name="mute_chb_label">
+ Küçültüldüğünde sustur
+ </text>
+ <slider label="Düğmeler" name="UI Volume"/>
+ <slider label="Ortam" name="Wind Volume"/>
+ <slider label="Ses Efektleri" name="SFX Volume"/>
+ <slider label="Müzik akışı" name="Music Volume"/>
+ <check_box label="Etkin" name="enable_music"/>
+ <slider label="Ortam" name="Media Volume"/>
+ <check_box label="Etkin" name="enable_media"/>
+ <slider label="Sesli Sohbet" name="Voice Volume"/>
+ <check_box label="Etkin" name="enable_voice_check"/>
+ <check_box label="Ortamı otomatik oynatmaya izin ver" name="media_auto_play_btn" tool_tip="istiyorsa ortamı otomatik oynatmak için bunu işaretleyin" value="true"/>
+ <check_box label="Diğer avatarlara eklenen ortamı oynat" name="media_show_on_others_btn" tool_tip="Yakınlardaki diğer avatarlara eklenen ortamı gizlemek için bunun işaretini kaldırın" value="true"/>
+ <check_box label="Mimiklere ses eşlik etsin" name="gesture_audio_play_btn" tool_tip="Mimiklerle beraber ses duymak için bunu işaretleyin" value="true"/>
+ <text name="voice_chat_settings">
+ Sesli Sohbet Ayarları
+ </text>
+ <text name="Listen from">
+ Åžuradan dinle:
+ </text>
+ <radio_group name="ear_location">
+ <radio_item label="Kamera konumu" name="0"/>
+ <radio_item label="Avatar konumu" name="1"/>
+ </radio_group>
+ <check_box label="Konuşurken avatar dudaklarını hareket ettir" name="enable_lip_sync"/>
+ <check_box label="Aşağıdaki düğmeye bastığımda konuşmayı aç/kapat:" name="push_to_talk_toggle_check" tool_tip="Toggle (dönüşümlü) modda mikrofonunuzu açıp kapatmak için tetikleyici tuşuna BİR KERE basıp bırakın. Toggle (dönüşümlü) modda değilken mikrofonunuz sadece tetikleyici tuş basılı tutulurken sesinizi yayınlar."/>
+ <line_editor label="Bas-KonuÅŸ tetikleyici" name="modifier_combo"/>
+ <button label="TuÅŸ Ayarla" name="set_voice_hotkey_button"/>
+ <button name="set_voice_middlemouse_button" tool_tip="Orta Fare Düğmesine Sıfırla"/>
+ <button label="Giriş/Çıkış cihazları" name="device_settings_btn"/>
+ <panel label="Cihaz Ayarları" name="device_settings_panel"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_prim_media_controls.xml b/indra/newview/skins/default/xui/tr/panel_prim_media_controls.xml
new file mode 100644
index 0000000000..0433d03450
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_prim_media_controls.xml
@@ -0,0 +1,91 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="MediaControls">
+ <string name="control_background_image_name">
+ Inspector_Background
+ </string>
+ <string name="skip_step">
+ 0.2
+ </string>
+ <string name="min_width">
+ 300
+ </string>
+ <string name="min_height">
+ 75
+ </string>
+ <string name="zoom_near_padding">
+ 1.0
+ </string>
+ <string name="zoom_medium_padding">
+ 1.1
+ </string>
+ <string name="zoom_far_padding">
+ 1.5
+ </string>
+ <string name="top_world_view_avoid_zone">
+ 50
+ </string>
+ <layout_stack name="progress_indicator_area">
+ <layout_panel name="media_progress_indicator">
+ <progress_bar name="media_progress_bar" tool_tip="Ortam Yükleniyor"/>
+ </layout_panel>
+ </layout_stack>
+ <layout_stack name="media_controls">
+ <layout_panel name="back">
+ <button name="back_btn" tool_tip="Geri Git"/>
+ </layout_panel>
+ <layout_panel name="fwd">
+ <button name="fwd_btn" tool_tip="İleri Git"/>
+ </layout_panel>
+ <layout_panel name="home">
+ <button name="home_btn" tool_tip="Ana sayfa"/>
+ </layout_panel>
+ <layout_panel name="media_stop">
+ <button name="media_stop_btn" tool_tip="Ortamı durdur"/>
+ </layout_panel>
+ <layout_panel name="reload">
+ <button name="reload_btn" tool_tip="Yeniden Yükle"/>
+ </layout_panel>
+ <layout_panel name="stop">
+ <button name="stop_btn" tool_tip="Yüklemeyi durdur"/>
+ </layout_panel>
+ <layout_panel name="play">
+ <button name="play_btn" tool_tip="Ortamı oynat"/>
+ </layout_panel>
+ <layout_panel name="pause">
+ <button name="pause_btn" tool_tip="Ortamı duraklat"/>
+ </layout_panel>
+ <layout_panel name="media_address">
+ <line_editor name="media_address_url" tool_tip="Ortam URL&apos;si"/>
+ <layout_stack name="media_address_url_icons">
+ <layout_panel>
+ <icon name="media_whitelist_flag" tool_tip="Beyaz Liste etkin"/>
+ </layout_panel>
+ <layout_panel>
+ <icon name="media_secure_lock_flag" tool_tip="Güvenli Tarama"/>
+ </layout_panel>
+ </layout_stack>
+ </layout_panel>
+ <layout_panel name="media_play_position">
+ <slider_bar initial_value="0.5" name="media_play_slider" tool_tip="Filmi oynatma ilerlemesi"/>
+ </layout_panel>
+ <layout_panel name="skip_back">
+ <button name="skip_back_btn" tool_tip="Geriletme"/>
+ </layout_panel>
+ <layout_panel name="skip_forward">
+ <button name="skip_forward_btn" tool_tip="İlerletme"/>
+ </layout_panel>
+ <layout_panel name="media_volume">
+ <button name="media_mute_button" tool_tip="Bu Ortamı Sustur"/>
+ <slider name="volume_slider" tool_tip="Ortam Volümü"/>
+ </layout_panel>
+ <layout_panel name="zoom_frame">
+ <button name="zoom_frame_btn" tool_tip="Ortama yakınlaştır"/>
+ </layout_panel>
+ <layout_panel name="close">
+ <button name="close_btn" tool_tip="Geri Zumla"/>
+ </layout_panel>
+ <layout_panel name="new_window">
+ <button name="new_window_btn" tool_tip="URL&apos;yi Tarayıcıda Aç"/>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_region_covenant.xml b/indra/newview/skins/default/xui/tr/panel_region_covenant.xml
new file mode 100644
index 0000000000..5c46365aea
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_region_covenant.xml
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Sözleşme" name="Covenant">
+ <panel.string name="can_resell">
+ Bu bölgede satın alınan arazi tekrar satılabilir.
+ </panel.string>
+ <panel.string name="can_not_resell">
+ Bu bölgede satın alınan arazi tekrar satılamayabilir.
+ </panel.string>
+ <panel.string name="can_change">
+ Bu bölgede satın alınan arazi birleştirilebilir veya bölünebilir.
+ </panel.string>
+ <panel.string name="can_not_change">
+ Bu bölgede satın alınan arazi birleştirilemeyebilir veya bölünemeyebilir.
+ </panel.string>
+ <text name="estate_section_lbl">
+ Gayrimenkul
+ </text>
+ <text name="estate_name_lbl">
+ Ad:
+ </text>
+ <text name="estate_name_text">
+ anakara
+ </text>
+ <text name="estate_owner_lbl">
+ Sahip:
+ </text>
+ <text name="estate_owner_text">
+ (hiçbiri)
+ </text>
+ <text name="estate_cov_lbl">
+ Sözleşme:
+ </text>
+ <text name="covenant_timestamp_text">
+ Son Değiştirme: 31 Ara, Çar 16:00:00 1969
+ </text>
+ <text_editor name="covenant_editor">
+ Bu Gayrimenkul için Sözleşmesi yok.
+ </text_editor>
+ <button label="Sıfırla" name="reset_covenant"/>
+ <text name="covenant_help_text">
+ Sözleşmede yapılan değişiklikler gayrimenkul içerisindeki tüm parsellerde gösterilir.
+ </text>
+ <text name="covenant_instructions">
+ Bu gayrimenkul için Sözleşmeyi değiştirmek amacıyla bir not kartını sürükleyin ve bırakın.
+ </text>
+ <text name="region_section_lbl">
+ Bölge
+ </text>
+ <text name="region_name_lbl">
+ Ad:
+ </text>
+ <text name="region_name_text">
+ Erica
+ </text>
+ <text name="region_landtype_lbl">
+ Tür:
+ </text>
+ <text name="region_landtype_text">
+ Anakara / Banliyö
+ </text>
+ <text name="region_maturity_lbl">
+ Seviye:
+ </text>
+ <text name="region_maturity_text">
+ YetiÅŸkin
+ </text>
+ <text name="resellable_lbl">
+ Tekrar Satış:
+ </text>
+ <text name="resellable_clause">
+ Bu bölgedeki arazi tekrar satılamayabilir.
+ </text>
+ <text name="changeable_lbl">
+ Böl:
+ </text>
+ <text name="changeable_clause">
+ Bu bölgedeki arazi birleştirilemeyebilir/bölünemeyebilir.
+ </text>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_region_debug.xml b/indra/newview/skins/default/xui/tr/panel_region_debug.xml
new file mode 100644
index 0000000000..6e15e0f6f6
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_region_debug.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Hata ayıkla" name="Debug">
+ <text name="region_text_lbl">
+ Bölge:
+ </text>
+ <text name="region_text">
+ bilinmiyor
+ </text>
+ <check_box label="Komut Dosyalarını Devre Dışı Bırak" name="disable_scripts_check" tool_tip="Bu bölgedeki tüm komut dosyalarını devre dışı bırak"/>
+ <check_box label="Çarpışmaları Devre Dışı Bırak" name="disable_collisions_check" tool_tip="Bu bölgedeki avatar dışı çarpışmaları devre dışı bırak"/>
+ <check_box label="Fiziği Devre Dışı Bırak" name="disable_physics_check" tool_tip="Bu bölgedeki tüm fiziği devre dışı bırak"/>
+ <button label="Uygula" name="apply_btn"/>
+ <text name="objret_text_lbl">
+ Nesne İadesi
+ </text>
+ <text name="resident_text_lbl">
+ Sakin:
+ </text>
+ <line_editor name="target_avatar_name">
+ (hiçbiri)
+ </line_editor>
+ <button label="Seç" name="choose_avatar_btn"/>
+ <text name="options_text_lbl">
+ Seçenklr.:
+ </text>
+ <check_box label="Komut dosyaları ile" name="return_scripts" tool_tip="Sadece komut dosyaları olan nesneler iade edilsin"/>
+ <check_box label="Başkasına ait arazi üzerinde" name="return_other_land" tool_tip="Sadece başkasına ait arazi üzerinde olan nesneler iade edilsin"/>
+ <check_box label="Bu gayrimenkulu oluşturan bölgelerin tümünde" name="return_estate_wide" tool_tip="Bu gayrimenkulu oluşturan bölgelerin tümündeki nesneler iade edilsin"/>
+ <button label="İade Et" name="return_btn"/>
+ <button label="En Çok Çarpışanlar..." name="top_colliders_btn" tool_tip="En çok potansiyel çarpışma yaşayan nesnelerin listesi"/>
+ <button label="En Çok Komut Dsy. Çalştr...." name="top_scripts_btn" tool_tip="Komut dosyalarını çalıştırırken en çok zaman harcayan nesnelerin listesi"/>
+ <button label="Bölgeyi Yeniden Başlat" name="restart_btn" tool_tip="2 dakikalık bir geri sayımdan sonra bölgeyi yeniden başlat"/>
+ <button label="Yeniden Başlatmayı Ertele" name="cancel_restart_btn" tool_tip="Bölgenin yeniden başlatılmasını 1 saat ertele"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_region_environment.xml b/indra/newview/skins/default/xui/tr/panel_region_environment.xml
new file mode 100644
index 0000000000..058ea91b70
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_region_environment.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Ortam" name="panel_env_info">
+ <text name="water_settings_title">
+ Bölgenize gelen tüm ziyaretçilerin görmesini istediğiniz Su ve Gökyüzü/Gündüz Döngüsü Ayarlarını seçin. Ek bilgi
+ </text>
+ <radio_group name="region_settings_radio_group">
+ <radio_item label="Second Life varsayılanını kullan" name="use_sl_default_settings"/>
+ <radio_item label="Aşağıdaki ayarları kullan" name="use_my_settings"/>
+ </radio_group>
+ <panel name="user_environment_settings">
+ <text name="water_settings_title">
+ Su Ayarı
+ </text>
+ <combo_box name="water_settings_preset_combo">
+ <combo_box.item label="-Bir ön ayar seçin-" name="item0"/>
+ </combo_box>
+ <text name="sky_dayc_settings_title">
+ Gökyüzü/Gün Dön.
+ </text>
+ <radio_group name="sky_dayc_settings_radio_group">
+ <radio_item label="Sabit gökyüzü" name="my_sky_settings"/>
+ <radio_item label="Gün döngüsü" name="my_dayc_settings"/>
+ </radio_group>
+ <combo_box name="sky_settings_preset_combo">
+ <combo_box.item label="-Bir ön ayar seçin-" name="item0"/>
+ </combo_box>
+ <combo_box name="dayc_settings_preset_combo">
+ <combo_box.item label="-Bir ön ayar seçin-" name="item0"/>
+ </combo_box>
+ </panel>
+ <button label="Uygula" name="apply_btn"/>
+ <button label="İptal" name="cancel_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_region_estate.xml b/indra/newview/skins/default/xui/tr/panel_region_estate.xml
new file mode 100644
index 0000000000..4ba55cafb6
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_region_estate.xml
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Gayrimenkul" name="Estate">
+ <text name="estate_help_text">
+ Bu sekmedeki ayarlarda yapılan değişiklikler gayrimenkul içerisindeki tüm bölgeleri etkiler.
+ </text>
+ <text name="estate_text">
+ Gayrimenkul:
+ </text>
+ <text name="estate_name">
+ (bilinmiyor)
+ </text>
+ <text name="owner_text">
+ Gayrimenkul sahibi:
+ </text>
+ <text name="estate_owner">
+ (bilinmiyor)
+ </text>
+ <check_box label="Küresel Saati Kullan" name="use_global_time_check"/>
+ <check_box label="Sabit Güneş" name="fixed_sun_check"/>
+ <slider label="Faz" name="sun_hour_slider"/>
+ <check_box label="Kamusal Erişime İzin Ver" name="externally_visible_check"/>
+ <text name="Only Allow">
+ Erişimi şununla doğrulanan hesaplarla sınırla:
+ </text>
+ <check_box label="Dosyadaki Ödeme Bilgileri" name="limit_payment" tool_tip="Tanınmayan Sakinleri Yasakla"/>
+ <check_box label="Yaş Doğrulama" name="limit_age_verified" tool_tip="Yaşını doğrulamayan Sakinleri yasakla Daha fazla bilgi için [SUPPORT_SITE] adresini ziyaret edin."/>
+ <check_box label="Sesli Sohbete İzin Ver" name="voice_chat_check"/>
+ <check_box label="Doğrudan Işınlamaya İzin Ver" name="allow_direct_teleport"/>
+ <button label="Uygula" name="apply_btn"/>
+ <button label="Gayrimenkule İleti Gönder..." name="message_estate_btn"/>
+ <button label="Sakinlerini Gayrimenkulden Çıkar..." name="kick_user_from_estate_btn"/>
+ <text name="estate_manager_label">
+ Gayrimenkul Yöneticileri:
+ </text>
+ <button label="Kaldır..." name="remove_estate_manager_btn"/>
+ <button label="Ekle..." name="add_estate_manager_btn"/>
+ <text name="allow_resident_label">
+ İzin verilen Sakinler:
+ </text>
+ <button label="Kaldır..." name="remove_allowed_avatar_btn"/>
+ <button label="Ekle..." name="add_allowed_avatar_btn"/>
+ <text name="allow_group_label">
+ İzin verilen Gruplar:
+ </text>
+ <button label="Kaldır..." name="remove_allowed_group_btn"/>
+ <button label="Ekle..." name="add_allowed_group_btn"/>
+ <text name="ban_resident_label">
+ Yasaklı Sakinler:
+ </text>
+ <button label="Kaldır..." name="remove_banned_avatar_btn"/>
+ <button label="Ekle..." name="add_banned_avatar_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_region_general.xml b/indra/newview/skins/default/xui/tr/panel_region_general.xml
new file mode 100644
index 0000000000..37da0f2cca
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_region_general.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Bölge" name="General">
+ <text name="region_text_lbl">
+ Bölge:
+ </text>
+ <text name="region_text">
+ bilinmiyor
+ </text>
+ <text name="version_channel_text_lbl">
+ Sürüm:
+ </text>
+ <text name="version_channel_text">
+ bilinmiyor
+ </text>
+ <text name="region_type_lbl">
+ Tür:
+ </text>
+ <text name="region_type">
+ bilinmiyor
+ </text>
+ <check_box label="Yer Åžekillendirmeyi Engelle" name="block_terraform_check"/>
+ <check_box label="Uçmayı Engelle" name="block_fly_check"/>
+ <check_box label="Hasara İzin Ver" name="allow_damage_check"/>
+ <check_box label="İtmeyi Kısıtla" name="restrict_pushobject"/>
+ <check_box label="Arazinin Tekrar Satışına İzin Ver" name="allow_land_resell_check"/>
+ <check_box label="Arazinin Birleşmesine/Bölünmesine İzin Ver" name="allow_parcel_changes_check"/>
+ <check_box label="Aramada Arazinin Gösterilmesini Engelle" name="block_parcel_search_check" tool_tip="Arama sonuçlarında bu bölge ve parselleri görünsün"/>
+ <check_box label="Örgü Nesnelere İzin Ver" name="mesh_rez_enabled_check" tool_tip="Bu bölgede insanların örgü nesneleri oluşturmasına izin verilsin"/>
+ <spinner label="Aracı Limiti" name="agent_limit_spin"/>
+ <spinner label="Nesne Bonusu" name="object_bonus_spin"/>
+ <text label="EriÅŸkinlik" name="access_text">
+ Seviye:
+ </text>
+ <icons_combo_box label="Orta" name="access_combo">
+ <icons_combo_box.item label="YetiÅŸkin" name="Adult" value="42"/>
+ <icons_combo_box.item label="Orta" name="Mature" value="21"/>
+ <icons_combo_box.item label="Genel" name="PG" value="13"/>
+ </icons_combo_box>
+ <button label="Uygula" name="apply_btn"/>
+ <button label="Bir Sakini Ana Konuma Işınla..." name="kick_btn"/>
+ <button label="Tüm Sakinleri Ana Konuma Işınla..." name="kick_all_btn"/>
+ <button label="Bölgeye İleti Gönder..." name="im_btn"/>
+ <button label="Işınlanma İstasyonu Yönet..." name="manage_telehub_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_region_terrain.xml b/indra/newview/skins/default/xui/tr/panel_region_terrain.xml
new file mode 100644
index 0000000000..3226ee008e
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_region_terrain.xml
@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Yüzey" name="Terrain">
+ <text name="region_text_lbl">
+ Bölge:
+ </text>
+ <text name="region_text">
+ bilinmiyor
+ </text>
+ <spinner label="Su Yüksekliği" name="water_height_spin"/>
+ <spinner label="Yüzey Yükslt. Limiti" name="terrain_raise_spin"/>
+ <spinner label="Yüzey Alçatma Limiti" name="terrain_lower_spin"/>
+ <text name="detail_texture_text">
+ Yüzey Dokuları (512x512, 24 bit .tga dosyalar gerektirir)
+ </text>
+ <text name="height_text_lbl">
+ 1 (Düşük)
+ </text>
+ <text name="height_text_lbl2">
+ 2
+ </text>
+ <text name="height_text_lbl3">
+ 3
+ </text>
+ <text name="height_text_lbl4">
+ 4 (Yüksek)
+ </text>
+ <text name="height_text_lbl5">
+ Doku Yükselti Aralıkları
+ </text>
+ <text name="height_text_lbl10">
+ Bu değerler yukarıdaki dokular için karışım aralığını temsil eder.
+ </text>
+ <text name="height_text_lbl11">
+ Metre cinsinden olan bu değerler için, DÜŞÜK değer 1. Dokunun MAKSİMUM yüksekliği, YÜKSEK değer ise 4. Dokunun MİNİMUM yüksekliğidir.
+ </text>
+ <text name="height_text_lbl6">
+ Kuzeybatı
+ </text>
+ <text name="height_text_lbl7">
+ KuzeydoÄŸu
+ </text>
+ <spinner label="Düşük" name="height_start_spin_1"/>
+ <spinner label="Düşük" name="height_start_spin_3"/>
+ <spinner label="Yüksek" name="height_range_spin_1"/>
+ <spinner label="Yüksek" name="height_range_spin_3"/>
+ <text name="height_text_lbl8">
+ Güneybatı
+ </text>
+ <text name="height_text_lbl9">
+ Güneydoğu
+ </text>
+ <spinner label="Düşük" name="height_start_spin_0"/>
+ <spinner label="Düşük" name="height_start_spin_2"/>
+ <spinner label="Yüksek" name="height_range_spin_0"/>
+ <spinner label="Yüksek" name="height_range_spin_2"/>
+ <button label="Ham yüzeyi indir..." name="download_raw_btn" tool_tip="Sadece gayrimenkul sahipleri kullanabilir, yöneticiler kullanamaz"/>
+ <button label="Ham yüzeyi karşıya yükle..." name="upload_raw_btn" tool_tip="Sadece gayrimenkul sahipleri kullanabilir, yöneticiler kullanamaz"/>
+ <button label="Yüzeyi Kaydet" name="bake_terrain_btn" tool_tip="Yükseltme/alçaltma limitleri için mevcut yüzeyi orta nokta olarak ayarla"/>
+ <button label="Uygula" name="apply_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_region_texture.xml b/indra/newview/skins/default/xui/tr/panel_region_texture.xml
new file mode 100644
index 0000000000..fd7ca2a893
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_region_texture.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Zemin Dokuları" name="Textures">
+ <text name="region_text_lbl">
+ Bölge:
+ </text>
+ <text name="region_text">
+ bilinmiyor
+ </text>
+ <text name="detail_texture_text">
+ Yüzey Dokuları (512x512, 24 bit .tga dosyalar gerektirir)
+ </text>
+ <text name="height_text_lbl">
+ 1 (Düşük)
+ </text>
+ <text name="height_text_lbl2">
+ 2
+ </text>
+ <text name="height_text_lbl3">
+ 3
+ </text>
+ <text name="height_text_lbl4">
+ 4 (Yüksek)
+ </text>
+ <text name="height_text_lbl5">
+ Doku Yükselti Aralıkları
+ </text>
+ <text name="height_text_lbl6">
+ Kuzeybatı
+ </text>
+ <text name="height_text_lbl7">
+ KuzeydoÄŸu
+ </text>
+ <spinner label="Düşük" name="height_start_spin_1"/>
+ <spinner label="Düşük" name="height_start_spin_3"/>
+ <spinner label="Yüksek" name="height_range_spin_1"/>
+ <spinner label="Yüksek" name="height_range_spin_3"/>
+ <text name="height_text_lbl8">
+ Güneybatı
+ </text>
+ <text name="height_text_lbl9">
+ Güneydoğu
+ </text>
+ <spinner label="Düşük" name="height_start_spin_0"/>
+ <spinner label="Düşük" name="height_start_spin_2"/>
+ <spinner label="Yüksek" name="height_range_spin_0"/>
+ <spinner label="Yüksek" name="height_range_spin_2"/>
+ <text name="height_text_lbl10">
+ Bu değerler yukarıdaki dokular için karışım aralığını temsil eder.
+ </text>
+ <text name="height_text_lbl11">
+ Metre cinsinden olan bu değerler için, DÜŞÜK değer 1. Dokunun MAKSİMUM yüksekliği, YÜKSEK değer ise 4. Dokunun MİNİMUM yüksekliğidir.
+ </text>
+ <button label="Uygula" name="apply_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_script_ed.xml b/indra/newview/skins/default/xui/tr/panel_script_ed.xml
new file mode 100644
index 0000000000..bc30320fa5
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_script_ed.xml
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="script panel">
+ <panel.string name="loading">
+ Yükleniyor...
+ </panel.string>
+ <panel.string name="can_not_view">
+ Bu komut dosyasını görüntüleyemez veya düzenleyemezsiniz, çünkü &quot;kopyalanamaz&quot; olarak ayarlanmıştır. Bir nesnenin içerisindeki bir komut dosyasını görüntülemek veya düzenlemek için tam izinlere ihtiyacınız var.
+ </panel.string>
+ <panel.string name="public_objects_can_not_run">
+ Kamuya Açık Nesneler komut dosyalarını çalıştıramaz
+ </panel.string>
+ <panel.string name="script_running">
+ Çalışıyor
+ </panel.string>
+ <panel.string name="Title">
+ Komut Dosyası: [NAME]
+ </panel.string>
+ <panel.string name="external_editor_not_set">
+ Ortam değişkeni LL_SCRIPT_EDITOR&apos;ü ayarlayarak veya ExternalEditor ayarını yaparak bir düzenleyici seçin.
+ </panel.string>
+ <menu_bar name="script_menu">
+ <menu label="Dosya" name="File">
+ <menu_item_call label="Kaydet" name="Save"/>
+ <menu_item_call label="Tüm Değişiklikleri Geri Çevir" name="Revert All Changes"/>
+ </menu>
+ <menu label="Düzenle" name="Edit">
+ <menu_item_call label="Geri Al" name="Undo"/>
+ <menu_item_call label="Yinele" name="Redo"/>
+ <menu_item_call label="Kes" name="Cut"/>
+ <menu_item_call label="Kopyala" name="Copy"/>
+ <menu_item_call label="Yapıştır" name="Paste"/>
+ <menu_item_call label="Tümünü Seç" name="Select All"/>
+ <menu_item_call label="Seçimi Kaldır" name="Deselect"/>
+ <menu_item_call label="Ara / DeÄŸiÅŸtir..." name="Search / Replace..."/>
+ </menu>
+ <menu label="Yardım" name="Help">
+ <menu_item_call label="Yardım..." name="Help..."/>
+ <menu_item_call label="Anahtar Sözcük Yardımı..." name="Keyword Help..."/>
+ </menu>
+ </menu_bar>
+ <text_editor name="Script Editor">
+ Yükleniyor...
+ </text_editor>
+ <combo_box label="Ekle..." name="Insert..."/>
+ <button label="Kaydet" label_selected="Kaydet" name="Save_btn"/>
+ <button label="Düzenle..." name="Edit_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_script_limits_my_avatar.xml b/indra/newview/skins/default/xui/tr/panel_script_limits_my_avatar.xml
new file mode 100644
index 0000000000..c821dc45c1
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_script_limits_my_avatar.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="AVATARIM" name="script_limits_my_avatar_panel">
+ <text name="script_memory">
+ Avatar Komut Dosyası Kullanımı
+ </text>
+ <text name="loading_text">
+ Yükleniyor...
+ </text>
+ <scroll_list name="scripts_list">
+ <scroll_list.columns label="Büyüklük (kb)" name="size"/>
+ <scroll_list.columns label="URL&apos;ler" name="urls"/>
+ <scroll_list.columns label="Nesne Adı" name="name"/>
+ <scroll_list.columns label="Konum" name="location"/>
+ </scroll_list>
+ <button label="Listeyi Yenile" name="refresh_list_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_script_limits_region_memory.xml b/indra/newview/skins/default/xui/tr/panel_script_limits_region_memory.xml
new file mode 100644
index 0000000000..2994aba39b
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_script_limits_region_memory.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="BÖLGE BELLEĞİ" name="script_limits_region_memory_panel">
+ <text name="script_memory">
+ Parsel Komut Dosyası Belleği
+ </text>
+ <text name="loading_text">
+ Yükleniyor...
+ </text>
+ <scroll_list name="scripts_list">
+ <scroll_list.columns label="Büyüklük (kb)" name="size"/>
+ <scroll_list.columns label="URL&apos;ler" name="urls"/>
+ <scroll_list.columns label="Nesne Adı" name="name"/>
+ <scroll_list.columns label="Nesne Sahibi" name="owner"/>
+ <scroll_list.columns label="Parsel" name="parcel"/>
+ <scroll_list.columns label="Konum" name="location"/>
+ </scroll_list>
+ <button label="Listeyi Yenile" name="refresh_list_btn"/>
+ <button label="Vurgula" name="highlight_btn"/>
+ <button label="İade Et" name="return_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_scrolling_param.xml b/indra/newview/skins/default/xui/tr/panel_scrolling_param.xml
new file mode 100644
index 0000000000..aabdc7358b
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_scrolling_param.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="LLScrollingPanelParam">
+ <text name="Loading...">
+ Yükleniyor...
+ </text>
+ <text name="Loading...2">
+ Yükleniyor...
+ </text>
+ <slider label="[DESC]" name="param slider"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_scrolling_param_base.xml b/indra/newview/skins/default/xui/tr/panel_scrolling_param_base.xml
new file mode 100644
index 0000000000..fa659040ea
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_scrolling_param_base.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="LLScrollingPanelParamBase">
+ <slider label="[DESC]" name="param slider"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_side_tray.xml b/indra/newview/skins/default/xui/tr/panel_side_tray.xml
new file mode 100644
index 0000000000..97bca38a50
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_side_tray.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- Side tray cannot show background because it is always
+ partially on screen to hold tab buttons. -->
+<side_tray name="sidebar">
+ <sidetray_tab description="Yan Çubuğu Aç/Kapa." name="sidebar_openclose" tab_title="Yan Çubuğu Aç/Kapa"/>
+ <sidetray_tab description="Ana konum." name="sidebar_home" tab_title="Ana konum">
+ <panel label="ana konum" name="panel_home"/>
+ </sidetray_tab>
+ <sidetray_tab description="Kamuya açık profilinizi ve Favorilerinizi düzenleyin." name="sidebar_me" tab_title="Profilim">
+ <panel_container name="panel_container">
+ <panel label="Ben" name="panel_me"/>
+ </panel_container>
+ </sidetray_tab>
+ <sidetray_tab description="Yakındaki arkadaşlarınızı, irtibatları ve kişileri bulun." name="sidebar_people" tab_title="Kişiler">
+ <panel_container name="panel_container">
+ <panel label="Grup Profili" name="panel_group_info_sidetray"/>
+ <panel label="EngellenmiÅŸ Sakinler ve Nesneler" name="panel_block_list_sidetray"/>
+ </panel_container>
+ </sidetray_tab>
+ <sidetray_tab description="Gitmek istediğiniz yerleri ve daha önce uğradığınız yerleri bulun." label="Yerler" name="sidebar_places" tab_title="Yerler">
+ <panel label="Yerler" name="panel_places"/>
+ </sidetray_tab>
+ <sidetray_tab description="Envanterinize göz atın." name="sidebar_inventory" tab_title="Envanterim">
+ <panel label="Envanteri Düzenle" name="sidepanel_inventory"/>
+ </sidetray_tab>
+ <sidetray_tab description="Görünümünüzü değiştirin." name="sidebar_appearance" tab_title="Görünümüm">
+ <panel label="Görünümü Düzenle" name="sidepanel_appearance"/>
+ </sidetray_tab>
+</side_tray>
diff --git a/indra/newview/skins/default/xui/tr/panel_side_tray_tab_caption.xml b/indra/newview/skins/default/xui/tr/panel_side_tray_tab_caption.xml
new file mode 100644
index 0000000000..b9c39ef8cb
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_side_tray_tab_caption.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="sidetray_tab_panel">
+ <text name="sidetray_tab_title" value="Yan Panel"/>
+ <button name="undock" tool_tip="Ayır"/>
+ <button name="dock" tool_tip="YerleÅŸtir"/>
+ <button name="show_help" tool_tip="Yardımı Göster"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_snapshot_inventory.xml b/indra/newview/skins/default/xui/tr/panel_snapshot_inventory.xml
new file mode 100644
index 0000000000..e3b22c639a
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_snapshot_inventory.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_snapshot_inventory">
+ <text name="title">
+ Envanterime Kaydet
+ </text>
+ <text name="hint_lbl">
+ Bir görüntüyü envanterinize kaydetmenin maliyeti L$[UPLOAD_COST] olur. Görüntünüzü bir doku olarak kaydetmek için kare formatlardan birini seçin.
+ </text>
+ <combo_box label="Çözünürlük" name="texture_size_combo">
+ <combo_box.item label="Mevcut Pencere" name="CurrentWindow"/>
+ <combo_box.item label="Küçük (128x128)" name="Small(128x128)"/>
+ <combo_box.item label="Orta (256x256)" name="Medium(256x256)"/>
+ <combo_box.item label="Büyük (512x512)" name="Large(512x512)"/>
+ <combo_box.item label="Özel" name="Custom"/>
+ </combo_box>
+ <spinner label="GeniÅŸlik" name="inventory_snapshot_width"/>
+ <spinner label="Yükseklik" name="inventory_snapshot_height"/>
+ <check_box label="Oranları koru" name="inventory_keep_aspect_check"/>
+ <button label="İptal" name="cancel_btn"/>
+ <button label="Kaydet" name="save_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_snapshot_local.xml b/indra/newview/skins/default/xui/tr/panel_snapshot_local.xml
new file mode 100644
index 0000000000..87d7677d73
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_snapshot_local.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_snapshot_local">
+ <text name="title">
+ Bilgisayarıma Kaydet
+ </text>
+ <combo_box label="Çözünürlük" name="local_size_combo">
+ <combo_box.item label="Mevcut Pencere" name="CurrentWindow"/>
+ <combo_box.item label="320x240" name="320x240"/>
+ <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="1280x1024" name="1280x1024"/>
+ <combo_box.item label="1600x1200" name="1600x1200"/>
+ <combo_box.item label="Özel" name="Custom"/>
+ </combo_box>
+ <layout_stack name="local_image_params_ls">
+ <layout_panel name="local_image_size_lp">
+ <spinner label="GeniÅŸlik" name="local_snapshot_width"/>
+ <spinner label="Yükseklik" name="local_snapshot_height"/>
+ <check_box label="Oranları koru" name="local_keep_aspect_check"/>
+ </layout_panel>
+ <layout_panel name="local_image_format_quality_lp">
+ <combo_box label="Format" name="local_format_combo">
+ <combo_box.item label="PNG (Kayıpsız)" name="PNG"/>
+ <combo_box.item label="JPEG" name="JPEG"/>
+ <combo_box.item label="BMP (Kayıpsız)" name="BMP"/>
+ </combo_box>
+ <slider label="Görüntü kalitesi" name="image_quality_slider"/>
+ <text name="image_quality_level">
+ ([QLVL])
+ </text>
+ </layout_panel>
+ </layout_stack>
+ <button label="İptal" name="cancel_btn"/>
+ <flyout_button label="Kaydet" name="save_btn" tool_tip="Görüntüyü bir dosyaya kaydet">
+ <flyout_button.item label="Kaydet" name="save_item"/>
+ <flyout_button.item label="Farklı Kaydet..." name="saveas_item"/>
+ </flyout_button>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_snapshot_options.xml b/indra/newview/skins/default/xui/tr/panel_snapshot_options.xml
new file mode 100644
index 0000000000..fd2e85fce5
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_snapshot_options.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_snapshot_options">
+ <button label="Profil Akışımda Yayınla" name="save_to_profile_btn"/>
+ <button label="E-posta" name="save_to_email_btn"/>
+ <button label="Envanterime Kaydet (L$[AMOUNT])" name="save_to_inventory_btn"/>
+ <button label="Bilgisayarıma Kaydet" name="save_to_computer_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_snapshot_postcard.xml b/indra/newview/skins/default/xui/tr/panel_snapshot_postcard.xml
new file mode 100644
index 0000000000..e999678a0d
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_snapshot_postcard.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_snapshot_postcard">
+ <string name="default_subject">
+ SECOND_LIFE]&apos;dan posta kartı.
+ </string>
+ <string name="default_message">
+ Buna bakın!
+ </string>
+ <string name="upload_message">
+ Gönderiyor...
+ </string>
+ <text name="title">
+ E-posta
+ </text>
+ <button label="İleti" name="message_btn"/>
+ <button label="Ayarlar" name="settings_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_snapshot_profile.xml b/indra/newview/skins/default/xui/tr/panel_snapshot_profile.xml
new file mode 100644
index 0000000000..334fd52a48
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_snapshot_profile.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_snapshot_profile">
+ <text name="title">
+ Profil Akışımda Yayınla
+ </text>
+ <combo_box label="Çözünürlük" name="profile_size_combo">
+ <combo_box.item label="Mevcut Pencere" 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="Özel" name="Custom"/>
+ </combo_box>
+ <layout_stack name="profile_image_params_ls">
+ <layout_panel name="profile_image_size_lp">
+ <spinner label="GeniÅŸlik" name="profile_snapshot_width"/>
+ <spinner label="Yükseklik" name="profile_snapshot_height"/>
+ <check_box label="Oranları koru" name="profile_keep_aspect_check"/>
+ </layout_panel>
+ <layout_panel name="profile_image_metadata_lp">
+ <text name="caption_label">
+ Resim yazısı:
+ </text>
+ <check_box initial_value="true" label="Konumu dahil et" name="add_location_cb"/>
+ </layout_panel>
+ </layout_stack>
+ <button label="İptal" name="cancel_btn"/>
+ <button label="Yayınla" name="post_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_sound_devices.xml b/indra/newview/skins/default/xui/tr/panel_sound_devices.xml
new file mode 100644
index 0000000000..982ef2ea3b
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_sound_devices.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<panel label="Cihaz Ayarları" name="device_settings_panel">
+ <panel.string name="default_text">
+ Varsayılan
+ </panel.string>
+ <string name="name_no_device">
+ Cihaz Yok
+ </string>
+ <string name="name_default_system_device">
+ Varsayılan Sistem Cihazı
+ </string>
+ <text name="Input">
+ Girdi
+ </text>
+ <text name="Output">
+ Çıktı
+ </text>
+ <text name="My volume label">
+ Ses düzeyim:
+ </text>
+ <slider_bar initial_value="1.0" name="mic_volume_slider" tool_tip="Bu kaydırıcıyı kullanarak ses düzeyini değiştirin"/>
+ <text name="wait_text">
+ Lütfen bekleyin
+ </text>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_stand_stop_flying.xml b/indra/newview/skins/default/xui/tr/panel_stand_stop_flying.xml
new file mode 100644
index 0000000000..91d07a3b0c
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_stand_stop_flying.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- Width and height of this panel should be synchronized with "panel_modes" in the floater_moveview.xml-->
+<panel name="panel_stand_stop_flying">
+ <button label="Ayağa Kalk" name="stand_btn" tool_tip="Kalkmak için buraya tıklayın."/>
+ <button label="Uçmayı Durdur" name="stop_fly_btn" tool_tip="Uçmayı durdur"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_status_bar.xml b/indra/newview/skins/default/xui/tr/panel_status_bar.xml
new file mode 100644
index 0000000000..81c304a5d8
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_status_bar.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="status">
+ <panel.string name="packet_loss_tooltip">
+ Paket Kaybı
+ </panel.string>
+ <panel.string name="bandwidth_tooltip">
+ Bant geniÅŸliÄŸi
+ </panel.string>
+ <panel.string name="time">
+ [hour12, datetime, slt]:[min, datetime, slt] [ampm, datetime, slt] [timezone,datetime, slt]
+ </panel.string>
+ <panel.string name="timeTooltip">
+ [weekday, datetime, slt], [day, datetime, slt] [month, datetime, slt] [year, datetime, slt]
+ </panel.string>
+ <panel.string name="buycurrencylabel">
+ L$ [AMT]
+ </panel.string>
+ <panel name="balance_bg">
+ <text name="balance" tool_tip="L$ bakiyenizi yenilemek için buraya tıklayın" value="L$20"/>
+ <button label="L$ Satın Al" name="buyL" tool_tip="Daha fazla L$ satın almak için tıklayın"/>
+ <button label="Alışveriş yap" name="goShop" tool_tip="Second Life Pazaryeri Aç" width="95"/>
+ </panel>
+ <text name="TimeText" tool_tip="Geçerli zaman (Pasifik)">
+ 24:00 AM PST
+ </text>
+ <button name="media_toggle_btn" tool_tip="Tüm Ortam Öğelerini Başlat/Durdur (Müzik, Video, Web sayfaları)"/>
+ <button name="volume_btn" tool_tip="Küresel Ses Kontrolü"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_teleport_history.xml b/indra/newview/skins/default/xui/tr/panel_teleport_history.xml
new file mode 100644
index 0000000000..f5b1175029
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_teleport_history.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="Teleport History">
+ <accordion name="history_accordion">
+ <no_matched_tabs_text name="no_matched_teleports_msg" value="Aradığınızı bulamadınız mı? [secondlife:///app/search/places/[SEARCH_TERM] Arama] ile bulmayı deneyin."/>
+ <no_visible_tabs_text name="no_teleports_msg" value="Işınlanma geçmişi boş. [secondlife:///app/search/places/ Arama] yapmayı deneyin."/>
+ <accordion_tab name="today" title="Bugün"/>
+ <accordion_tab name="yesterday" title="Dün"/>
+ <accordion_tab name="2_days_ago" title="2 gün önce"/>
+ <accordion_tab name="3_days_ago" title="3 gün önce"/>
+ <accordion_tab name="4_days_ago" title="4 gün önce"/>
+ <accordion_tab name="5_days_ago" title="5 gün önce"/>
+ <accordion_tab name="6_days_and_older" title="6 gün önce ve daha eski"/>
+ <accordion_tab name="1_month_and_older" title="1 ay önce ve daha eski"/>
+ <accordion_tab name="6_months_and_older" title="6 ay önce ve daha eski"/>
+ </accordion>
+ <panel name="bottom_panel">
+ <menu_button name="gear_btn" tool_tip="İlave seçenekleri göster"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_teleport_history_item.xml b/indra/newview/skins/default/xui/tr/panel_teleport_history_item.xml
new file mode 100644
index 0000000000..a3a5c70c7e
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_teleport_history_item.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="teleport_history_item">
+ <text name="region" value="..."/>
+ <button name="profile_btn" tool_tip="Envanter bilgilerini göster"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_voice_effect.xml b/indra/newview/skins/default/xui/tr/panel_voice_effect.xml
new file mode 100644
index 0000000000..b46833d7e6
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_voice_effect.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_voice_effect">
+ <string name="no_voice_effect">
+ Ses Şekillendirme Kapalı
+ </string>
+ <string name="preview_voice_effects">
+ Ses Şekillendirme Önizleme ▶
+ </string>
+ <string name="get_voice_effects">
+ Ses Åžekillendirmeyi EtkinleÅŸtir â–¶
+ </string>
+ <combo_box name="voice_effect" tool_tip="Sesinizi değiştirmek için bir Ses Şekli seçin">
+ <combo_box.item label="Ses Şekillendirme Kapalı" name="no_voice_effect"/>
+ </combo_box>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_world_map.xml b/indra/newview/skins/default/xui/tr/panel_world_map.xml
new file mode 100644
index 0000000000..5595c13a7c
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_world_map.xml
@@ -0,0 +1,63 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="world_map">
+ <panel.string name="Loading">
+ Yükleniyor...
+ </panel.string>
+ <panel.string name="InvalidLocation">
+ Geçersiz Konum
+ </panel.string>
+ <panel.string name="world_map_north">
+ K
+ </panel.string>
+ <panel.string name="world_map_east">
+ D
+ </panel.string>
+ <panel.string name="world_map_west">
+ B
+ </panel.string>
+ <panel.string name="world_map_south">
+ G
+ </panel.string>
+ <panel.string name="world_map_southeast">
+ GD
+ </panel.string>
+ <panel.string name="world_map_northeast">
+ KD
+ </panel.string>
+ <panel.string name="world_map_southwest">
+ GB
+ </panel.string>
+ <panel.string name="world_map_northwest">
+ KB
+ </panel.string>
+ <panel.string name="world_map_person">
+ 1 kiÅŸi
+ </panel.string>
+ <panel.string name="world_map_people">
+ [NUMBER] kiÅŸi
+ </panel.string>
+ <text label="K" name="floater_map_north">
+ K
+ </text>
+ <text label="D" name="floater_map_east">
+ D
+ </text>
+ <text label="B" name="floater_map_west">
+ B
+ </text>
+ <text label="G" name="floater_map_south">
+ G
+ </text>
+ <text label="GD" name="floater_map_southeast">
+ GD
+ </text>
+ <text label="KD" name="floater_map_northeast">
+ KD
+ </text>
+ <text label="GB" name="floater_map_southwest">
+ GB
+ </text>
+ <text label="KB" name="floater_map_northwest">
+ KB
+ </text>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/role_actions.xml b/indra/newview/skins/default/xui/tr/role_actions.xml
new file mode 100644
index 0000000000..655ac64172
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/role_actions.xml
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<role_actions>
+ <action_set description="Bu Yetenekler arasında gruba Üye ekleme ve çıkarma ile davetiye olmadan yeni Üyelerin katılmasına imkan tanıma yer alır." name="Membership">
+ <action description="Kişileri Bu Gruba Davet Et" longdescription="Roller bölümü &gt; Üyeler sekmesindeki &quot;Davet Et&quot; düğmesini kullanarak Kişileri Bu Gruba davet et" name="member invite" value="1"/>
+ <action description="Üyeleri Bu Gruptan Çıkar" longdescription="Roller bölümü &gt; Üyeler sekmesindeki &quot;Çıkar&quot; düğmesini kullanarak Üyeleri Bu Gruptan çıkar. Bir Sahip, başka bir Sahip dışında herkesi çıkartabilir. Eğer bir Sahip değilseniz, bir Üyenin bir gruptan çıkarılmasının tek yolu, Herkes Rolünde olmaları ve başka hiçbir Rolde OLMAMALARIDIR. Üyeleri Rollerden çıkarmak için, &quot;Üyeleri Rollerden Çıkar&quot; Yeteneğine sahip olmalısınız." name="member eject" value="2"/>
+ <action description="&quot;Katılıma Açık&quot; için Aç/Kapa yapın ve &quot;Kayıt Ücretini&quot; değiştirin" longdescription="Yeni üyelerin davetiye olmadan katılmasına imkan tanımak amacıyla &quot;Katılıma Açık&quot; için Aç/Kapa yapın ve Genel bölümünde &quot;Kayıt Ücretini&quot; değiştirin" name="member options" value="3"/>
+ </action_set>
+ <action_set description="Bu Yetenekler arasında grup Rolleri ekleme, kaldırma ve değiştirme; Rollere Üye ekleme ve kaldırma ile Rollere Yetenek atama imkanları yer alır." name="Roles">
+ <action description="Yeni Roller Oluştur" longdescription="Roller bölümü &gt; Roller sekmesinde yeni Roller oluşturun." name="role create" value="4"/>
+ <action description="Rolleri Silin" longdescription="Roller bölümü &gt; Roller sekmesinde Rolleri silin." name="role delete" value="5"/>
+ <action description="Rol adlarını, başlıklarını, açıklamalarını ve Rol üyelerinin kamuyla paylaşılıp paylaşılmadığını değiştirin" longdescription="Rol adlarını, başlıklarını, açıklamalarını ve Rol üyelerinin kamuyla paylaşılıp paylaşılmadığını değiştirin. Bu işlem, bir Rol seçtikten sonra Roller bölümü &gt; Roller sekmesinin altında yapılır." name="role properties" value="6"/>
+ <action description="Üyeleri Atayan Rollerine Atama" longdescription="Üyeleri Atanmış Roller listesindeki Rollere atayın (Roller bölümü &gt; Üyeler sekmesi). Bu Yeteneğe sahip bir Üye, sadece atayanın zaten olduğu bir Role Üye ekleyebilir." name="role assign member limited" value="7"/>
+ <action description="Üyelere Herhangi bir Role Atama" longdescription="Üyeleri Atanmış Roller listesindeki Herhangi Bir Role atayın (Roller bölümü &gt; Üyeler sekmesi). *UYARI* Bu Yeteneğe sahip olan bir Roldeki herhangi bir Üye kendisini -- ve başka herhangi bir Sahip olmayan Üyeyi -- şu anda sahip olduklarından daha fazla güce sahip olan Rollere atayabilir, kendi güçlerini Grup Sahibininkine yakın bir güce yükseltebilir. Bu Yeteneği atamadan önce ne yaptığınızı bildiğinizden emin olun." name="role assign member" value="8"/>
+ <action description="Üyeleri Rollerden Çıkarma" longdescription="Üyeleri Atanmış Roller listesindeki Rollerden çıkartın (Roller bölümü &gt; Üyeler sekmesi). Sahipler çıkartılamaz." name="role remove member" value="9"/>
+ <action description="Rollere Yetenek Atama ve Kaldırma" longdescription="İzin Verilen Yetenekler listesindeki her bir Rol için Rollere Yetenek Atayın ve Kaldırın ((Roller bölümü &gt; Üyeler sekmesi). *UYARI* Bu Yeteneğe sahip olan bir Roldeki herhangi bir Üye kendisine -- ve diğer tüm Sahip olmayan Üyelere -- tüm Yetenekleri atayabilir, kendi güçlerini Grup Sahibininkine yakın bir güce yükseltebilir. Bu Yeteneği atamadan önce ne yaptığınızı bildiğinizden emin olun." name="role change actions" value="10"/>
+ </action_set>
+ <action_set description="Bu Yetenekler arasında grubun kimliğini değiştirme imkanları bulunmaktadır: Örneğin bilgilerin kamuya açıklığı, grup bildirgesi ve işaretleri." name="Group Identity">
+ <action description="Grup Bildirgesini, İşaretlerini ve &quot;Aramada gösterilsin&quot; ayarını değiştirme" longdescription="Grup Bildirgesini, İşaretlerini ve &quot;Aramada gösterilsin&quot; ayarını değiştirin. Bu işlem Genel bölümde yapılır." name="group change identity" value="11"/>
+ </action_set>
+ <action_set description="Bu Yetenekler arasında grubun sahip olduğu arazileri devretme, değiştirme ve satma imkanları vardır. Arazi Hakkında penceresine gitmek için, zemine sağ tıklayın ve &quot;Arazi Hakkında&quot; seçimini yapın ya da Gezinme Çubuğunda &quot;i&quot; simgesine tıklayın." name="Parcel Management">
+ <action description="Arazi devretme ve grup için arazi satın alma" longdescription="Arazi devredin ve grup için arazi satın alın. Bu işlem Arazi Hakkında &gt; Genel sekmesinde yapılır." name="land deed" value="12"/>
+ <action description="Vali Linden&apos;e arazi terketme" longdescription="Vali Linden&apos;e arazi terkedin. *UYARI* Bu Yeteneğe sahip bir Roldeki herhangi bir Üye, Arazi Hakkında &gt; Genel sekmesinde grubun sahip olduğu araziyi terkedebilir ve bir satış olmaksızın bunu Linden mülkiyetine geçirebilir. Bu Yeteneği atamadan önce ne yaptığınızı bildiğinizden emin olun." name="land release" value="13"/>
+ <action description="Araziyi satışa çıkarma" longdescription="Araziyi satışa çıkarın. *UYARI* Bu Yeteneğe sahip bir Roldeki herhangi bir Üye, Arazi Hakkında &gt; Genel sekmesinde grubun sahip olduğu arazileri istedikleri gibi satabilir! Bu Yeteneği atamadan önce ne yaptığınızı bildiğinizden emin olun." name="land set sale info" value="14"/>
+ <action description="Parselleri bölme ve birleştirme" longdescription="Parselleri bölün ve birleştirin. Bunu yapmak için zemine sağ tıklayın, &quot;Yüzeyi Düzenle&quot; seçimini yapın ve farenizi arazi üzerinde sürükleyerek bir seçim yapın. Araziyi bölmek için, bölmek istediğiniz araziyi seçin ve &quot;Böl&quot; üzerine tıklayın. Birleştirmek için, birbirine komşu iki veya daha fazla sayıda parsel seçin ve &quot;Birleştir&quot; üzerine tıklayın." name="land divide join" value="15"/>
+ </action_set>
+ <action_set description="Bu yetenekler arasında parsel adını ve yayınlama ayarlarını, Bul dizinindeki görünürlük ile iniş noktası ve TP yönlendirme seçeneklerini değiştirme imkanları yer alır." name="Parcel Identity">
+ <action description="&apos;Konumu Arama Sonuçlarında Göster&apos; seçeneğini Aç/Kapa ve kategoriyi ayarla" longdescription="Arazi Hakkında &gt; Seçenekler sekmesinden &apos;Konumu Arama Sonuçlarında Göster&apos; seçeneğini Açın/Kapayın ve parsel kategorisini ayarlayın." name="land find places" value="17"/>
+ <action description="Parsel adını, açıklamasını ve &quot;Konumu Arama Sonuçlarında Göster&quot; ayarlarını değiştir" longdescription="Parsel adını, açıklamasını ve &quot;Konumu Arama Sonuçlarında Göster&quot; ayarlarını değiştirin. Bu işlem Arazi Hakkında &gt; Seçenekler sekmesinde yapılır." name="land change identity" value="18"/>
+ <action description="İniş noktasını ve ışınlama yönlendirmesini ayarlayın" longdescription="Bir grubun sahip olduğu parsel üzerinde, bu Yeteneğe sahip olan bir Roldeki Üyeler gelen ışınlanmaların varacağı iniş noktasını ve daha fazla kontrol için ışınlama yönlendirmesini ayarlayabilirler. Bu işlem Arazi Hakkında &gt; Seçenekler sekmesinde yapılır." name="land set landing point" value="19"/>
+ </action_set>
+ <action_set description="Bu Yeteneklere &apos;Nesneleri Oluştur&apos;, &apos;Yüzeyi Düzenle&apos;, müzik ve ortam ayarları gibi parsel seçeneklerini etkileyen güçler de dahildir." name="Parcel Settings">
+ <action description="Müziği &amp; ortam ayarlarını değiştir" longdescription="Akış müziğini ve film ayarlarını Arazi Hakkında &gt; Ortam sekmesinden değiştirin." name="land change media" value="20"/>
+ <action description="&apos;Yüzeyi Düzenle&apos; seçeneğini Aç/Kapa" longdescription="&apos;Yüzeyi Düzenle&apos; seçeneğini açın/kapatın. *UYARI* Arazi Hakkında &gt; Seçenekler sekmesi &gt; Yüzeyi Düzenle seçeneği, herhangi bir kişinin arazinizin şeklini değiştirmesine, Linden bitkileri yerleştirmesine ve bu bitkilerin yerlerini değiştirmesine izin verir. Bu Yeteneği atamadan önce ne yaptığınızı bildiğinizden emin olun. Yüzey düzenleme seçeneği Arazi Hakkında &gt; Seçenekler sekmesinden açılıp kapanır." name="land edit" value="21"/>
+ <action description="Arazi Hakkında &gt; Seçenekler sekmesindeki çeşitli ayarları Aç/Kapa" longdescription="&apos;Güvenli (hasar yok)&apos;, &apos;Uç&apos; ve diğer Second Life Sakinlerinin &apos;Yüzeyi Düzenle&apos;, &apos;İnşa Et&apos;, &apos;Yer İmleri Oluştur&apos; ve &apos;Komut Dosyalarını Çalıştır&apos; yeteneklerini grubun sahip olduğu arazi üzerinde kullanmalarına izin verme tercihini Arazi Hakkında &gt; Seçenekler sekmesinden açın/kapayın." name="land options" value="22"/>
+ </action_set>
+ <action_set description="Bu Yeteneklere Üyelerin grubun sahip olduğu parseller üzerindeki kısıtlamaları geçmesine izin veren güçler de dahildir." name="Parcel Powers">
+ <action description="&apos;Yüzeyi Düzenle&apos; yeteneğine her zaman izin ver" longdescription="Bu Yeteneğe sahip olan bir Roldeki Üyeler, Arazi Hakkında &gt; Seçenekler sekmesinde kapalı olsa da grubun sahip olduğu parsel üzerinde yüzey düzenleme yapabilir." name="land allow edit land" value="23"/>
+ <action description="&apos;Uç&apos; yeteneğine her zaman izin ver" longdescription="Bu Yeteneğe sahip olan bir Roldeki Üyeler, Arazi Hakkında &gt; Seçenekler sekmesinde kapalı olsa da grubun sahip olduğu parsel üzerinde uçabilir." name="land allow fly" value="24"/>
+ <action description="&apos;Nesneleri Oluştur&apos; yeteneğine her zaman izin ver" longdescription="Bu Yeteneğe sahip olan bir Roldeki Üyeler, Arazi Hakkında &gt; Seçenekler sekmesinde kapalı olsa da grubun sahip olduğu parsel üzerinde nesne oluşturabilirler." name="land allow create" value="25"/>
+ <action description="&apos;Yer İmi Oluştur&apos; yeteneğine her zaman izin ver" longdescription="Bu Yeteneğe sahip olan bir Roldeki Üyeler, Arazi Hakkında &gt; Seçenekler sekmesinde kapalı olsa da grubun sahip olduğu parsel üzerinde yer imi oluşturabilirler." name="land allow landmark" value="26"/>
+ <action description="Grup arazisi üzerinde &apos;Ana Konumu Burası Olarak Seç&apos; yeteneğine izin ver" longdescription="Bu Yeteneğe sahip olan bir Roldeki Üyeler, bu gruba devrediilmiş bir parsel üzerinde Dünya menüsü &gt; Yer imleri &gt; Ana Konumu Burası Olarak Seç seçeneğini kullanabilirler." name="land allow set home" value="28"/>
+ <action description="Grup arazisi üzerinde &apos;Etkinliğe Ev Sahipliği Yap&apos; yeteneğine izin ver" longdescription="Bu Yeteneğe sahip bir Roldeki Üyeler bir etkinliğe ev sahipliği yapmak için grubun sahip olduğu parselleri mekan olarak seçebilirler." name="land allow host event" value="41"/>
+ </action_set>
+ <action_set description="Bu Yeteneklere, grubun sahip olduğu parsellere erişime izin verme veya buralara erişimi yasaklama ve Second Life Sakinlerini dondurma veya parselden dışarı çıkarma da dahildir." name="Parcel Access">
+ <action description="Parselin Erişim listelerini yönet" longdescription="Parselin Erişim listelerini Arazi Hakkında &gt; Erişim sekmesinden yönetin." name="land manage allowed" value="29"/>
+ <action description="Parselin Yasaklama listelerini yönet" longdescription="Parselin Yasaklama listelerini Arazi Hakkında &gt; Erişim sekmesinden yönetin." name="land manage banned" value="30"/>
+ <action description="Parselin &apos;Geçiş haklr. şuna sat&apos; ayarlarını değiştir" longdescription="Parselin &apos;Geçiş haklr. şuna sat&apos; ayarlarını Arazi Hakkında &gt; Erişim sekmesinden değiştirin." name="land manage passes" value="31"/>
+ <action description="Parsel üzerindeki Second Life Sakinlerini dışarı çıkar veya dondur" longdescription="Bu Yeteneğe sahip olan bir Roldeki Üyeler, grubun sahip olduğu bir parsel üzerinde olmasını istemedikleri bir Second Life sakininin üzerini sağ tıklatıp &apos;Dışarı Çıkar&apos; veya &apos;Dondur&apos;u seçebilirler." name="land admin" value="32"/>
+ </action_set>
+ <action_set description="Bu Yeteneklere üyelerin nesneleri iade etmelerine, Linden bitkilerini yerleştirmelerine ve bu bitkilerin yerlerini değiştirmelerine izin veren güçler de dahildir. Bu özellik, Üyelerin çöpleri temizlemeleri ve bahçe düzenlemesi yapmaları için kullanışlıdır; fakat dikkatle kullanılmalıdır, çünkü nesneleri iade etmenin geri alınma imkanı yoktur." name="Parcel Content">
+ <action description="Grubun sahip olduğu nesneleri iade et" longdescription="Grubun sahip olduğu parseller üzerinde grubun sahip olduğu nesneleri Arazi Hakkında &gt; Nesneler sekmesinden iade edin." name="land return group owned" value="48"/>
+ <action description="Gruba ayrılan nesneleri iade et" longdescription="Grubun sahip olduğu parseller üzerinde gruba ayrılan nesneleri Arazi Hakkında &gt; Nesneler sekmesinden iade edin." name="land return group set" value="33"/>
+ <action description="Gruba ait olmayan nesneleri iade et" longdescription="Grubun sahip olduğu parseller üzerinde gruba ait olmayan nesneleri Arazi Hakkında &gt; Nesneler sekmesinden iade edin." name="land return non group" value="34"/>
+ <action description="Linden bitkilerini kullanarak bahçe düzenleme" longdescription="Linden ağaçlarını, bitkilerini ve çimleri yerleştirerek veya yerlerini değiştirerek bahçe düzenleme yeteneği. Bu öğeler envanterinizin Kütüphane &gt; Nesneler klasörü içinde bulunabilir veya İnşa Et menüsünden oluşturulabilir." name="land gardening" value="35"/>
+ </action_set>
+ <action_set description="Bu Yeteneklere grubun sahip olduğu nesneleri devretme, değiştirme ve satma güçleri de dahildir. Bu değişiklikler İnşa Et Araçları &gt; Genel sekmesinden yapılabilir. Bir nesneyi sağ tıklatıp Düzenle&apos;yi seçerek ayarlarını görebilirsiniz." name="Object Management">
+ <action description="Nesneleri gruba devret" longdescription="Nesneleri İnşa Et Araçları &gt; Genel sekmesinden gruba devredin." name="object deed" value="36"/>
+ <action description="Grubun sahip olduğu nesneleri kullan (taşı, kopyala, değiştir)" longdescription="Grubun sahip olduğu nesneleri, İnşa Et Araçları &gt; Genel sekmesi üzerinden kullanın (taşıyın, kopyalayın, değiştirin)." name="object manipulate" value="38"/>
+ <action description="Grubun sahip olduğu nesneleri satışa çıkar" longdescription="Grubun sahip olduğu nesneleri İnşa Et Araçları &gt; Genel sekmesinden satışa çıkarın." name="object set sale" value="39"/>
+ </action_set>
+ <action_set description="Bu Yeteneklere Üyelerin grup borçlarını ödemesini ve grup kâr paylarını almasını sağlayan ve grup hesabının geçmiş bilgilerine erişimi sınırlandıran güçler de dahildir." name="Accounting">
+ <action description="Grup borçlarını öde ve grup kâr paylarını al" longdescription="Bu Yeteneğe sahip bir Roldeki Üyeler otomatik olarak grup borçlarını ödeyecek ve grup kâr paylarını alacaktır. Bu da grubun sahip olduğu arazi satışlarından kendilerine düşen ve günlük olarak dağıtılan ksımı alacakları gibi parsel için ilan verme ücreti gibi masraflara da katkıda bulunacakları anlamına gelir." name="accounting accountable" value="40"/>
+ </action_set>
+ <action_set description="Bu Yeteneklere Üyelerin grup Bildirimlerini gönderme, alma ve görüntüleme imkanı tanıyan güçler de dahildir." name="Notices">
+ <action description="Bildirimleri Gönder" longdescription="Bu Yeteneğe sahip bir Roldeki Üyeler Grup &gt; Bildirimler bölümünden Bildirimleri gönderebilir." name="notices send" value="42"/>
+ <action description="Bildirimleri Al ve eski Bildirimleri görüntüle" longdescription="Bu Yeteneğe sahip bir Roldeki Üyeler Bildirim alabilir ve Grup &gt; Bildirimler bölümündeki eski Bildirimleri görüntüleyebilir." name="notices receive" value="43"/>
+ </action_set>
+ <action_set description="Bu Yetenekler arasında grup sohbet oturumlarına ve grup sesli sohbetlerine izin verme veya bunları kısıtlama yetkileri de dahildir." name="Chat">
+ <action description="Grup Sohbetine Katıl" longdescription="Bu Yeteneğe sahip bir Roldeki Üyeler yazılı ve sesli grup sohbet oturumlarına katılabilir." name="join group chat" value="16"/>
+ <action description="Grup Sesli Sohbetine Katıl" longdescription="Bu Yeteneğe sahip bir Roldeki Üyeler grup sesli sohbet oturumlarına katılabilir. NOT: Sesli sohbet oturumuna erişim için Grup Sohbetine Katıl yeteneği gereklidir." name="join voice chat" value="27"/>
+ <action description="Grup Sohbetini Yönet" longdescription="Bu Yeteneğe sahip bir Roldeki Üyeler grup sesli ve yazılı sohbet oturumlarına errişimi ve katılımı kontrol edebilir." name="moderate group chat" value="37"/>
+ </action_set>
+</role_actions>
diff --git a/indra/newview/skins/default/xui/tr/sidepanel_appearance.xml b/indra/newview/skins/default/xui/tr/sidepanel_appearance.xml
new file mode 100644
index 0000000000..b632f21cf5
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/sidepanel_appearance.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Dış Görünümler" name="appearance panel">
+ <string name="No Outfit" value="Dış Görünüm Yok"/>
+ <string name="Unsaved Changes" value="KaydedilmemiÅŸ deÄŸiÅŸiklikler"/>
+ <string name="Now Wearing" value="Åžimdi giyiyor..."/>
+ <string name="Changing outfits" value="Dış görünümler değiştiriliyor"/>
+ <panel name="panel_currentlook">
+ <button label="E" name="editappearance_btn"/>
+ <button label="O" name="openoutfit_btn"/>
+ <text name="currentlook_status">
+ (Durum)
+ </text>
+ <text name="currentlook_name">
+ MOOSE gibi gerçekten Uzun bir Adla Dış Görünümüm
+ </text>
+ <button label="" name="edit_outfit_btn" tool_tip="Bu dış görünümü düzenle"/>
+ </panel>
+ <filter_editor label="Dış Görünümleri Filtrele" name="Filter"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/sidepanel_inventory.xml b/indra/newview/skins/default/xui/tr/sidepanel_inventory.xml
new file mode 100644
index 0000000000..70c449b402
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/sidepanel_inventory.xml
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="EÅŸyalar" name="objects panel">
+ <panel label="" name="sidepanel__inventory_panel">
+ <layout_stack name="inventory_layout_stack">
+ <layout_panel name="inbox_outbox_layout_panel">
+ <layout_stack name="inbox_outbox_layout_stack">
+ <layout_panel name="inbox_layout_panel">
+ <panel label="" name="marketplace_inbox">
+ <string name="InboxLabelWithArg">
+ Alınan öğeler ([NUM])
+ </string>
+ <string name="InboxLabelNoArg">
+ Alınan öğeler
+ </string>
+ <button label="Alınan öğeler" name="inbox_btn"/>
+ <text name="inbox_fresh_new_count">
+ [NUM] yeni
+ </text>
+ <panel tool_tip="Drag and drop items to your inventory to manage and use them">
+ <text name="inbox_inventory_placeholder">
+ Pazaryerinden satın alınan öğeler buraya teslim edilir.
+ </text>
+ </panel>
+ </panel>
+ </layout_panel>
+ <layout_panel name="outbox_layout_panel">
+ <panel label="" name="marketplace_outbox">
+ <string name="OutboxLabelWithArg">
+ Satıcı giden kutusu ([NUM])
+ </string>
+ <string name="OutboxLabelNoArg">
+ Satıcı giden kutusu
+ </string>
+ <button label="Satıcı giden kutusu" name="outbox_btn"/>
+ <button label="" name="outbox_sync_btn" tool_tip="Pazaryeri Vitrinime Gönder"/>
+ <panel>
+ <panel name="outbox_inventory_placeholder_panel">
+ <text name="outbox_inventory_placeholder_title">
+ Yükleniyor...
+ </text>
+ </panel>
+ </panel>
+ </panel>
+ </layout_panel>
+ </layout_stack>
+ </layout_panel>
+ </layout_stack>
+ <panel name="button_panel">
+ <layout_stack name="button_panel_ls">
+ <layout_panel name="info_btn_lp">
+ <button label="Profil" name="info_btn" tool_tip="Nesne profilini göster"/>
+ </layout_panel>
+ <layout_panel name="share_btn_lp">
+ <button label="Paylaş" name="share_btn" tool_tip="Bir envanter öğesini paylaş"/>
+ </layout_panel>
+ <layout_panel name="shop_btn_lp">
+ <button label="Alışveriş yap" name="shop_btn" tool_tip="Pazaryeri web sayfasını aç"/>
+ <button label="Giy" name="wear_btn" tool_tip="Seçilen dış görünümü giy"/>
+ <button label="Oyna" name="play_btn"/>
+ <button label="Işınla" name="teleport_btn" tool_tip="Seçilen alana ışınla"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/sidepanel_item_info.xml b/indra/newview/skins/default/xui/tr/sidepanel_item_info.xml
new file mode 100644
index 0000000000..81291a431c
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/sidepanel_item_info.xml
@@ -0,0 +1,76 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="item properties" title="Öğe Profili">
+ <panel.string name="unknown">
+ (bilinmiyor)
+ </panel.string>
+ <panel.string name="public">
+ (kamuya açık)
+ </panel.string>
+ <panel.string name="you_can">
+ Åžunu yapabilirsiniz:
+ </panel.string>
+ <panel.string name="owner_can">
+ Sahip ÅŸunu yapabilir:
+ </panel.string>
+ <panel.string name="acquiredDate">
+ [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]
+ </panel.string>
+ <panel.string name="origin_inventory">
+ (Envanter)
+ </panel.string>
+ <panel.string name="origin_inworld">
+ (SL Dünyası)
+ </panel.string>
+ <text name="title" value="Öğe Profili"/>
+ <text name="origin" value="(Envanter)"/>
+ <scroll_container name="item_profile_scroll">
+ <panel label="" name="item_profile">
+ <text name="LabelItemNameTitle">
+ Ad:
+ </text>
+ <text name="LabelItemDescTitle">
+ Açıklama:
+ </text>
+ <text name="LabelCreatorTitle">
+ OluÅŸturan:
+ </text>
+ <text name="LabelOwnerTitle">
+ Sahip:
+ </text>
+ <text name="LabelAcquiredTitle">
+ Alınan:
+ </text>
+ <panel name="perms_inv">
+ <text name="perm_modify">
+ Åžunu yapabilirsiniz:
+ </text>
+ <check_box label="DeÄŸiÅŸtir" name="CheckOwnerModify"/>
+ <check_box label="Kopyala" name="CheckOwnerCopy"/>
+ <check_box label="Aktar" name="CheckOwnerTransfer"/>
+ <text name="AnyoneLabel">
+ Herkes:
+ </text>
+ <check_box label="Kopyala" name="CheckEveryoneCopy"/>
+ <text name="GroupLabel">
+ Grup:
+ </text>
+ <check_box label="Paylaş" name="CheckShareWithGroup" tool_tip="Ayarlanan grubun tüm üyelerinin, bu nesne için değiştirme izinlerinizi paylaşmasına izin verir. Rol kısıtlamalarını etkinleştirmek için Devretme yapmalısınız."/>
+ <text name="NextOwnerLabel">
+ Sonraki sahip:
+ </text>
+ <check_box label="DeÄŸiÅŸtir" name="CheckNextOwnerModify"/>
+ <check_box label="Kopyala" name="CheckNextOwnerCopy"/>
+ <check_box label="Aktar" name="CheckNextOwnerTransfer" tool_tip="Sonraki sahibi bu nesneyi verebilir veya tekrar satabilir"/>
+ </panel>
+ <check_box label="Satılık" name="CheckPurchase"/>
+ <combo_box name="combobox sale copy">
+ <combo_box.item label="Kopyala" name="Copy"/>
+ <combo_box.item label="Orijinal" name="Original"/>
+ </combo_box>
+ <spinner label="Fiyat: L$" name="Edit Cost"/>
+ </panel>
+ </scroll_container>
+ <panel name="button_panel">
+ <button label="İptal" name="cancel_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/sidepanel_task_info.xml b/indra/newview/skins/default/xui/tr/sidepanel_task_info.xml
new file mode 100644
index 0000000000..2fa6281f05
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/sidepanel_task_info.xml
@@ -0,0 +1,123 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="object properties" title="Nesne Profili">
+ <panel.string name="text deed continued">
+ Devret
+ </panel.string>
+ <panel.string name="text deed">
+ Devret
+ </panel.string>
+ <panel.string name="text modify info 1">
+ Bu nesneyi deÄŸiÅŸtirebilirsiniz
+ </panel.string>
+ <panel.string name="text modify info 2">
+ Bu nesneleri deÄŸiÅŸtirebilirsiniz
+ </panel.string>
+ <panel.string name="text modify info 3">
+ Bu nesneyi deÄŸiÅŸtiremezsiniz
+ </panel.string>
+ <panel.string name="text modify info 4">
+ Bu nesneleri deÄŸiÅŸtiremezsiniz
+ </panel.string>
+ <panel.string name="text modify warning">
+ Bu nesne bağlantılı parçalara sahip
+ </panel.string>
+ <panel.string name="Cost Default">
+ Fiyat: L$
+ </panel.string>
+ <panel.string name="Cost Total">
+ Toplam Fiyat: L$
+ </panel.string>
+ <panel.string name="Cost Per Unit">
+ Birim Fiyatı: L$
+ </panel.string>
+ <panel.string name="Cost Mixed">
+ Karma Fiyat
+ </panel.string>
+ <panel.string name="Sale Mixed">
+ Karma Satış
+ </panel.string>
+ <text name="title" value="Nesne Profili"/>
+ <text name="where" value="(SL Dünyası)"/>
+ <panel label="" name="properties_panel">
+ <text name="Name:">
+ Ad:
+ </text>
+ <text name="Description:">
+ Açıklama:
+ </text>
+ <text name="CreatorNameLabel">
+ OluÅŸturan:
+ </text>
+ <text name="Owner:">
+ Sahip:
+ </text>
+ <text name="Group_label">
+ Grup:
+ </text>
+ <button name="button set group" tool_tip="Bu nesnenin izinlerini paylaşmak için bir grup seçin"/>
+ <name_box initial_value="Yükleniyor..." name="Group Name Proxy"/>
+ <button label="Devret" label_selected="Devret" name="button deed" tool_tip="Bu nesne devredilerek verildiğinde, nesnenin sonraki sahibi için izinler geçerli olur. Grup içerisinde paylaşılan nesneler bir grup yetkilisi tarafından devredilebilir."/>
+ <text name="label click action">
+ Şu eylem için tıklayın:
+ </text>
+ <combo_box name="clickaction">
+ <combo_box.item label="Dokun (varsayılan)" name="Touch/grab(default)"/>
+ <combo_box.item label="Nesnenin üzerine otur" name="Sitonobject"/>
+ <combo_box.item label="Nesneyi satın al" name="Buyobject"/>
+ <combo_box.item label="Nesneye ödeme yap" name="Payobject"/>
+ <combo_box.item label="Aç" name="Open"/>
+ </combo_box>
+ <panel name="perms_inv">
+ <text name="perm_modify">
+ Bu nesneyi deÄŸiÅŸtirebilirsiniz
+ </text>
+ <text name="Anyone can:">
+ Herkes:
+ </text>
+ <check_box label="Kopyala" name="checkbox allow everyone copy"/>
+ <check_box label="Hareket Et" name="checkbox allow everyone move"/>
+ <text name="GroupLabel">
+ Grup:
+ </text>
+ <check_box label="Paylaş" name="checkbox share with group" tool_tip="Ayarlanan grubun tüm üyelerinin, bu nesne için değiştirme izinlerinizi paylaşmasına izin verir. Rol kısıtlamalarını etkinleştirmek için Devretme yapmalısınız."/>
+ <text name="NextOwnerLabel">
+ Sonraki sahip:
+ </text>
+ <check_box label="DeÄŸiÅŸtir" name="checkbox next owner can modify"/>
+ <check_box label="Kopyala" name="checkbox next owner can copy"/>
+ <check_box label="Aktar" name="checkbox next owner can transfer" tool_tip="Sonraki sahibi bu nesneyi verebilir veya tekrar satabilir"/>
+ </panel>
+ <check_box label="Satılık" name="checkbox for sale"/>
+ <combo_box name="sale type">
+ <combo_box.item label="Kopyala" name="Copy"/>
+ <combo_box.item label="İçerik" name="Contents"/>
+ <combo_box.item label="Orijinal" name="Original"/>
+ </combo_box>
+ <spinner label="Fiyat: L$" name="Edit Cost"/>
+ <check_box label="Aramada göster" name="search_check" tool_tip="Kişiler arama sonuçlarında bu nesneyi görebilsin"/>
+ <text name="B:">
+ B:
+ </text>
+ <text name="O:">
+ O:
+ </text>
+ <text name="G:">
+ G:
+ </text>
+ <text name="E:">
+ E:
+ </text>
+ <text name="N:">
+ N:
+ </text>
+ <text name="F:">
+ F:
+ </text>
+ </panel>
+ <panel name="button_panel">
+ <button label="Aç" name="open_btn"/>
+ <button label="Öde" name="pay_btn"/>
+ <button label="Satın Al" name="buy_btn"/>
+ <button label="Ayrıntl" name="details_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/strings.xml b/indra/newview/skins/default/xui/tr/strings.xml
new file mode 100644
index 0000000000..0dbc9b0a0e
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/strings.xml
@@ -0,0 +1,5001 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- This file contains strings that used to be hardcoded in the source.
+ It is only for those strings which do not belong in a floater.
+ For example, the strings used in avatar chat bubbles, and strings
+ that are returned from one component and may appear in many places-->
+<strings>
+ <string name="SECOND_LIFE">
+ Second Life
+ </string>
+ <string name="APP_NAME">
+ Second Life
+ </string>
+ <string name="CAPITALIZED_APP_NAME">
+ SECOND LIFE
+ </string>
+ <string name="SECOND_LIFE_GRID">
+ Second Life Ağı
+ </string>
+ <string name="SUPPORT_SITE">
+ Second Life Destek Portalı
+ </string>
+ <string name="StartupDetectingHardware">
+ Donanım saptanıyor...
+ </string>
+ <string name="StartupLoading">
+ [APP_NAME] yükleniyor...
+ </string>
+ <string name="StartupClearingCache">
+ Önbellek temizleniyor...
+ </string>
+ <string name="StartupInitializingTextureCache">
+ Doku önbelleği başlatılıyor...
+ </string>
+ <string name="StartupInitializingVFS">
+ VFS Başlatılıyor...
+ </string>
+ <string name="StartupRequireDriverUpdate">
+ Grafik başlatma başarılamadı. Lütfen grafik sürücünüzü güncelleştirin!
+ </string>
+ <string name="ProgressRestoring">
+ Geri yükleniyor...
+ </string>
+ <string name="ProgressChangingResolution">
+ Çözünürlük değiştiriliyor...
+ </string>
+ <string name="Fullbright">
+ Tam parlak (eski)
+ </string>
+ <string name="LoginInProgress">
+ Oturum açılıyor. [APP_NAME] kilitlenmiş görünebilir. Lütfen bekleyin.
+ </string>
+ <string name="LoginInProgressNoFrozen">
+ Oturum açılıyor...
+ </string>
+ <string name="LoginAuthenticating">
+ Kimlik doğrulaması yapılıyor
+ </string>
+ <string name="LoginMaintenance">
+ Hesap bakımı yapılıyor...
+ </string>
+ <string name="LoginAttempt">
+ Önceki oturum açma girişimi başarılamadı. Oturum açılıyor, [NUMBER]. girişim.
+ </string>
+ <string name="LoginPrecaching">
+ Dünya yükleniyor...
+ </string>
+ <string name="LoginInitializingBrowser">
+ Katıştırılmış web tarayıcısı başlatılıyor...
+ </string>
+ <string name="LoginInitializingMultimedia">
+ Multimedya başlatılıyor...
+ </string>
+ <string name="LoginInitializingFonts">
+ Fontlar yükleniyor...
+ </string>
+ <string name="LoginVerifyingCache">
+ Önbellek dosyaları doğrulanıyor (60-90 saniye zaman alabilir)...
+ </string>
+ <string name="LoginProcessingResponse">
+ Yanıt işleniyor...
+ </string>
+ <string name="LoginInitializingWorld">
+ Dünya başlatılıyor...
+ </string>
+ <string name="LoginDecodingImages">
+ Görüntülerin kodu çözülüyor...
+ </string>
+ <string name="LoginInitializingQuicktime">
+ QuickTime Başlatılıyor...
+ </string>
+ <string name="LoginQuicktimeNotFound">
+ QuickTime bulunamadı - başlatılamadı.
+ </string>
+ <string name="LoginQuicktimeOK">
+ QuickTime başarıyla başlatıldı.
+ </string>
+ <string name="LoginRequestSeedCapGrant">
+ Bölge özellikleri talep ediliyor...
+ </string>
+ <string name="LoginRetrySeedCapGrant">
+ Bölge özellikleri talep ediliyor: [NUMBER]. girişim...
+ </string>
+ <string name="LoginWaitingForRegionHandshake">
+ Bölge el sıkışması bekleniyor...
+ </string>
+ <string name="LoginConnectingToRegion">
+ Bölgeye bağlanılıyor...
+ </string>
+ <string name="LoginDownloadingClothing">
+ Giysiler karşıdan yükleniyor...
+ </string>
+ <string name="InvalidCertificate">
+ Sunucu geçersiz veya bozuk bir sertifika döndürdü. Lütfen Ağ yöneticisine başvurun.
+ </string>
+ <string name="CertInvalidHostname">
+ Sunucuya erişmek için geçersiz bir ana bilgisayar adı kullanıldı, lütfen SLURL veya Ağ ana bilgisayar adınızı kontrol edin.
+ </string>
+ <string name="CertExpired">
+ Ağ tarafından döndürülen sertifikanın süresi sona ermiş görünüyor. Lütfen sistem saatinizi kontrol edin veya Ağ yöneticinize başvurun.
+ </string>
+ <string name="CertKeyUsage">
+ Sunucu tarafından döndürülen sertifika SSL için kullanılamadı. Lütfen Ağ yöneticinize başvurun.
+ </string>
+ <string name="CertBasicConstraints">
+ Sunucunun Sertifika zincirinde çok fazla sertifika vardı. Lütfen Ağ yöneticinize başvurun.
+ </string>
+ <string name="CertInvalidSignature">
+ Ağ sunucusu tarafından döndürülen sertifika imzası doğrulanamadı. Lütfen Ağ yöneticinize başvurun.
+ </string>
+ <string name="LoginFailedNoNetwork">
+ Ağ hatası: Bağlantı kurulamadı, lütfen ağ bağlantınızı kontrol edin.
+ </string>
+ <string name="LoginFailed">
+ Oturum açılamadı.
+ </string>
+ <string name="Quit">
+ Çık
+ </string>
+ <string name="create_account_url">
+ http://join.secondlife.com/
+ </string>
+ <string name="LoginFailedViewerNotPermitted">
+ Kullandığınız görüntüleyici ile artık Second Life&apos;a erişemezsiniz. Yeni bir görüntüleyiciyi karşıdan yüklemek için lütfen şu sayfayı ziyaret edin:
+http://secondlife.com/download
+
+Daha fazla bilgi edinmek için asağıdaki SSS sayfamızı ziyaret edin:
+http://secondlife.com/viewer-access-faq
+ </string>
+ <string name="LoginIntermediateOptionalUpdateAvailable">
+ Opsiyonel görüntüleyici güncelleştirmesi mevcut: [VERSION]
+ </string>
+ <string name="LoginFailedRequiredUpdate">
+ Gerekli görüntüleyici güncelleştirmesi: [VERSION]
+ </string>
+ <string name="LoginFailedAlreadyLoggedIn">
+ Bu aracı zaten oturum açmış durumda.
+ </string>
+ <string name="LoginFailedAuthenticationFailed">
+ Üzgünüz! Oturumunuzu açamadık.
+Lütfen şunları doğru girdiğinizi kontrol edin:
+ * Kullanıcı adı (mustafayalcin12 veya faruk.gungoren gibi)
+ * Parola:
+Ayrıca lütfen Caps Lock tuşuna basmadığınıza emin olun.
+ </string>
+ <string name="LoginFailedPasswordChanged">
+ Güvenlik önlemi olarak parolanız değiştirildi.
+Lütfen hesap sayfanıza gidin: http://secondlife.com/password
+ve parolanızı sıfırlamak için güvenlik sorusunu yanıtlayın.
+Bu sorun için özür dileriz.
+ </string>
+ <string name="LoginFailedPasswordReset">
+ Sistemimizde bazı değişiklikler yaptık, parolanızı sıfırlamanız gerekecek.
+Lütfen hesap sayfanıza gidin: http://secondlife.com/password
+ve parolanızı sıfırlamak için güvenlik sorusunu yanıtlayın.
+Bu sorun için özür dileriz.
+ </string>
+ <string name="LoginFailedEmployeesOnly">
+ Second Life bakım amacıyla geçici olarak kapatıldı.
+Şu anda sadece çalışanlar oturum açabilir.
+Güncelleştirmeler için www.secondlife.com/status adresini kontrol edin.
+ </string>
+ <string name="LoginFailedPremiumOnly">
+ Second Life üzerindeki aktif kullanıcıların olası en iyi deneyimi yaşamasını sağlamak için, oturum açılması geçici olarak kısıtlanmıştır.
+
+Second Life için ödeme yapmış olan kişilere öncelik tanımak amacıyla, ücretsiz hesaplara sahip kişiler bu süre içerisinde Second Life&apos;a erişemeyecekler.
+ </string>
+ <string name="LoginFailedComputerProhibited">
+ Second Life&apos;a bu bilgisayardan eriÅŸemezsiniz.
+Bunun bir hata olduğunu düşünüyorsanız, lütfen şu adrese başvurun:
+support@secondlife.com.
+ </string>
+ <string name="LoginFailedAcountSuspended">
+ Hesabınıza şu zamana kadar erişemeyeceksiniz:
+Pasifik Saati ile [TIME].
+ </string>
+ <string name="LoginFailedAccountDisabled">
+ Talebinizi şu anda tamamlayamıyoruz.
+Lütfen yardım almak için Second Life destek bölümüne başvurun: http://secondlife.com/support
+Eğer parolanızı değiştiremiyorsanız, lütfen şu numarayı arayın: (866) 476-9763.
+ </string>
+ <string name="LoginFailedTransformError">
+ Oturum açılması sırasında veri tutarsızlığı saptandı.
+Lütfen şu adrese başvurun: support@secondlife.com
+ </string>
+ <string name="LoginFailedAccountMaintenance">
+ Hesabınızda küçük çaplı bir bakım işlemi sürüyor.
+Hesabınıza şu zamana kadar erişemeyeceksiniz:
+Pasifik Saati ile [TIME].
+Bunun bir hata olduğunu düşünüyorsanız, lütfen şu adrese başvurun: support@secondlife.com
+ </string>
+ <string name="LoginFailedPendingLogoutFault">
+ Oturum kapatma talebi simülatörden bir hata yanıtı gelmesine neden oldu.
+ </string>
+ <string name="LoginFailedPendingLogout">
+ Sistem şu anda oturumunuzu sonlandırıyor.
+Hesabınıza şu zamana kadar erişemeyeceksiniz:
+Pasifik Saati ile [TIME].
+ </string>
+ <string name="LoginFailedUnableToCreateSession">
+ Geçerli bir oturum oluşturulamadı.
+ </string>
+ <string name="LoginFailedUnableToConnectToSimulator">
+ Bir simülatöre bağlanılamadı.
+ </string>
+ <string name="LoginFailedRestrictedHours">
+ Hesabınız Second Life&apos;a sadece
+Pasifik Saati ile [START] ve [END] arasında erişebilir.
+Lütfen bu saatler arasında tekrar uğrayın.
+Bunun bir hata olduğunu düşünüyorsanız, lütfen şu adrese başvurun: support@secondlife.com
+ </string>
+ <string name="LoginFailedIncorrectParameters">
+ Yanlış parametreler.
+Bunun bir hata olduğunu düşünüyorsanız, lütfen şu adrese başvurun: support@secondlife.com
+ </string>
+ <string name="LoginFailedFirstNameNotAlphanumeric">
+ Ad parametresi alfasayısal olmalıdır.
+Bunun bir hata olduğunu düşünüyorsanız, lütfen şu adrese başvurun: support@secondlife.com
+ </string>
+ <string name="LoginFailedLastNameNotAlphanumeric">
+ Soyadı parametresi alfasayısal olmalıdır.
+Bunun bir hata olduğunu düşünüyorsanız, lütfen şu adrese başvurun: support@secondlife.com
+ </string>
+ <string name="LogoutFailedRegionGoingOffline">
+ Bölge şu anda çevrimdışı oluyor.
+Lütfen bir dakika içerisinde tekrar oturum açmayı deneyin.
+ </string>
+ <string name="LogoutFailedAgentNotInRegion">
+ Aracı bölgede değil.
+Lütfen bir dakika içerisinde tekrar oturum açmayı deneyin.
+ </string>
+ <string name="LogoutFailedPendingLogin">
+ Bu bölge başka bir oturum açmaktaydı.
+Lütfen bir dakika içerisinde tekrar oturum açmayı deneyin.
+ </string>
+ <string name="LogoutFailedLoggingOut">
+ Bu bölge önceki oturumu sonlandırmaktaydı.
+Lütfen bir dakika içerisinde tekrar oturum açmayı deneyin.
+ </string>
+ <string name="LogoutFailedStillLoggingOut">
+ Bu bölge hala bir önceki oturumu sonlandırma işlemini sürdürüyor.
+Lütfen bir dakika içerisinde tekrar oturum açmayı deneyin.
+ </string>
+ <string name="LogoutSucceeded">
+ Bu bölge son oturumu sonlandırdı.
+Lütfen bir dakika içerisinde tekrar oturum açmayı deneyin.
+ </string>
+ <string name="LogoutFailedLogoutBegun">
+ Bölge oturumu sonlandırma işlemini başlattı.
+Lütfen bir dakika içerisinde tekrar oturum açmayı deneyin.
+ </string>
+ <string name="LoginFailedLoggingOutSession">
+ Sistem son oturumunuzu sonlandırma işlemini başlattı.
+Lütfen bir dakika içerisinde tekrar oturum açmayı deneyin.
+ </string>
+ <string name="AgentLostConnection">
+ Bu bölgede sorun yaşanıyor olabilir. Lütfen İnternet bağlantınızı kontrol edin.
+ </string>
+ <string name="SavingSettings">
+ Ayarlarınız kaydediliyor...
+ </string>
+ <string name="LoggingOut">
+ Oturum kapatılıyor...
+ </string>
+ <string name="ShuttingDown">
+ Kapatılıyor...
+ </string>
+ <string name="YouHaveBeenDisconnected">
+ Bulunduğunuz bölgeyle bağlantınız kesildi.
+ </string>
+ <string name="SentToInvalidRegion">
+ Geçersiz bir bölgeye gönderildiniz.
+ </string>
+ <string name="TestingDisconnect">
+ Görüntüleyici bağlantısının kesilmesi test ediliyor
+ </string>
+ <string name="TooltipPerson">
+ KiÅŸi
+ </string>
+ <string name="TooltipNoName">
+ (adsız)
+ </string>
+ <string name="TooltipOwner">
+ Sahip:
+ </string>
+ <string name="TooltipPublic">
+ Kamuya Açık
+ </string>
+ <string name="TooltipIsGroup">
+ (Grup)
+ </string>
+ <string name="TooltipForSaleL$">
+ Satılık: L$[AMOUNT]
+ </string>
+ <string name="TooltipFlagGroupBuild">
+ Grup İnşası
+ </string>
+ <string name="TooltipFlagNoBuild">
+ İnşa Edilemez
+ </string>
+ <string name="TooltipFlagNoEdit">
+ Grup İnşası
+ </string>
+ <string name="TooltipFlagNotSafe">
+ Güvenli Değil
+ </string>
+ <string name="TooltipFlagNoFly">
+ Uçamaz
+ </string>
+ <string name="TooltipFlagGroupScripts">
+ Grup Komut Dosyaları
+ </string>
+ <string name="TooltipFlagNoScripts">
+ Komut Dosyası Yok
+ </string>
+ <string name="TooltipLand">
+ Arazi:
+ </string>
+ <string name="TooltipMustSingleDrop">
+ Buraya sadece bir öğe sürüklenebilir.
+ </string>
+ <string name="TooltipPrice" value="L$[AMOUNT]:"/>
+ <string name="TooltipOutboxNoTransfer">
+ Bu nesnelerden bir veya daha fazlası başka bir kullanıcıya satılamaz veya aktarılamaz.
+ </string>
+ <string name="TooltipOutboxWorn">
+ Bu nesnelerden bir veya daha fazlasını giyiyorsunuz. Bunları avatarınızdan kaldırın ve tekrar taşımayı deneyin.
+ </string>
+ <string name="TooltipOutboxFolderLevels">
+ Bu klasörde çok fazla alt klasör seviyesi var. Dahili klasörleri tekrar düzenleyerek maksimum 4 seviye derinliğe azaltın (Kök Klasör içinde A içinde B içinde C şeklinde).
+ </string>
+ <string name="TooltipOutboxTooManyObjects">
+ Bu klasörde 200&apos;den fazla nesne var. Nesne sayısını azaltmak için öğelerden bazılarını kutuya koyun.
+ </string>
+ <string name="TooltipHttpUrl">
+ Bu web sayfasını görmek için tıklayın
+ </string>
+ <string name="TooltipSLURL">
+ Bu konumun bilgisini görmek için tıklayın
+ </string>
+ <string name="TooltipAgentUrl">
+ Bu Sakinin profilini görmek için tıklayın
+ </string>
+ <string name="TooltipAgentInspect">
+ Bu Sakin hakkında daha fazla bilgi öğrenin
+ </string>
+ <string name="TooltipAgentMute">
+ Bu Sakini engellemek için tıklayın
+ </string>
+ <string name="TooltipAgentUnmute">
+ Bu Sakinin engellemesini kaldırmak için tıklayın
+ </string>
+ <string name="TooltipAgentIM">
+ Bu Sakine Aİ göndermek için tıklayın
+ </string>
+ <string name="TooltipAgentPay">
+ Bu Sakine ödeme yapmak için tıklayın
+ </string>
+ <string name="TooltipAgentOfferTeleport">
+ Bu Sakine bir ışınlama talebi teklif etmek için tıklayın
+ </string>
+ <string name="TooltipAgentRequestFriend">
+ Bu Sakine bir arkadaşlık talebi teklif etmek için tıklayın
+ </string>
+ <string name="TooltipGroupUrl">
+ Bu grubun açıklamasını görmek için tıklayın
+ </string>
+ <string name="TooltipEventUrl">
+ Bu etkinliğin açıklamasını görmek için tıklayın
+ </string>
+ <string name="TooltipClassifiedUrl">
+ Bu ilanı görmek için tıklayın
+ </string>
+ <string name="TooltipParcelUrl">
+ Bu parselin açıklamasını görmek için tıklayın
+ </string>
+ <string name="TooltipTeleportUrl">
+ Bu konuma ışınlama yapmak için tıklayın
+ </string>
+ <string name="TooltipObjectIMUrl">
+ Bu nesnenin açıklamasını görmek için tıklayın
+ </string>
+ <string name="TooltipMapUrl">
+ Bu konumu bir haritada görmek için tıklayın
+ </string>
+ <string name="TooltipSLAPP">
+ secondlife:// komutunu çalıştırmak için tıklayın
+ </string>
+ <string name="CurrentURL" value="Geçerli URL: [CurrentURL]"/>
+ <string name="SLurlLabelTeleport">
+ Şuraya ışınla:
+ </string>
+ <string name="SLurlLabelShowOnMap">
+ Şunun için Harita göster:
+ </string>
+ <string name="SLappAgentMute">
+ Engelle
+ </string>
+ <string name="SLappAgentUnmute">
+ Engellemeyi kaldır
+ </string>
+ <string name="SLappAgentIM">
+ Aİ
+ </string>
+ <string name="SLappAgentPay">
+ Öde
+ </string>
+ <string name="SLappAgentOfferTeleport">
+ Şuraya Işınlama Teklif Et:
+ </string>
+ <string name="SLappAgentRequestFriend">
+ Arkadaşlık Talebi
+ </string>
+ <string name="BUTTON_CLOSE_DARWIN">
+ Kapat (⌘W)
+ </string>
+ <string name="BUTTON_CLOSE_WIN">
+ Kapat (Ctrl+W)
+ </string>
+ <string name="BUTTON_CLOSE_CHROME">
+ Kapat
+ </string>
+ <string name="BUTTON_RESTORE">
+ Geri Yükle
+ </string>
+ <string name="BUTTON_MINIMIZE">
+ Simge Durumuna Küçült
+ </string>
+ <string name="BUTTON_TEAR_OFF">
+ Böl
+ </string>
+ <string name="BUTTON_DOCK">
+ YerleÅŸtir
+ </string>
+ <string name="BUTTON_HELP">
+ Yardımı Göster
+ </string>
+ <string name="Searching">
+ Arıyor...
+ </string>
+ <string name="NoneFound">
+ Hiçbiri bulunamadı.
+ </string>
+ <string name="RetrievingData">
+ Alınıyor...
+ </string>
+ <string name="ReleaseNotes">
+ Sürüm Notları
+ </string>
+ <string name="LoadingData">
+ Yükleniyor...
+ </string>
+ <string name="AvatarNameNobody">
+ (hiçbiri)
+ </string>
+ <string name="AvatarNameWaiting">
+ (bekliyor)
+ </string>
+ <string name="AvatarNameMultiple">
+ (birden çok)
+ </string>
+ <string name="GroupNameNone">
+ (hiçbiri)
+ </string>
+ <string name="AvalineCaller">
+ Avaline Arayanı [ORDER]
+ </string>
+ <string name="AssetErrorNone">
+ Hata yok
+ </string>
+ <string name="AssetErrorRequestFailed">
+ Varlık talebi: başarısız oldu
+ </string>
+ <string name="AssetErrorNonexistentFile">
+ Varlık talebi: var olmayan dosya
+ </string>
+ <string name="AssetErrorNotInDatabase">
+ Varlık talebi: veri tabanında varlık bulunamadı
+ </string>
+ <string name="AssetErrorEOF">
+ Dosya sonu
+ </string>
+ <string name="AssetErrorCannotOpenFile">
+ Dosya açılamadı
+ </string>
+ <string name="AssetErrorFileNotFound">
+ Dosya bulunamadı
+ </string>
+ <string name="AssetErrorTCPTimeout">
+ Dosya aktarımı zaman aşımı
+ </string>
+ <string name="AssetErrorCircuitGone">
+ Devre yok
+ </string>
+ <string name="AssetErrorPriceMismatch">
+ Görüntüleyici ile sunucu fiyatta anlaşmadı
+ </string>
+ <string name="AssetErrorUnknownStatus">
+ Bilinmeyen durum
+ </string>
+ <string name="texture">
+ doku
+ </string>
+ <string name="sound">
+ ses
+ </string>
+ <string name="calling card">
+ arama kartı
+ </string>
+ <string name="landmark">
+ yer imi
+ </string>
+ <string name="legacy script">
+ eski komut dosyası
+ </string>
+ <string name="clothing">
+ giysi
+ </string>
+ <string name="object">
+ nesne
+ </string>
+ <string name="note card">
+ not kartı
+ </string>
+ <string name="folder">
+ klasör
+ </string>
+ <string name="root">
+ kök
+ </string>
+ <string name="lsl2 script">
+ LSL2 komut dosyası
+ </string>
+ <string name="lsl bytecode">
+ LSL bayt kodu
+ </string>
+ <string name="tga texture">
+ tga dokusu
+ </string>
+ <string name="body part">
+ vücut bölümü
+ </string>
+ <string name="snapshot">
+ anlık görüntü
+ </string>
+ <string name="lost and found">
+ Kaybedip Bulduklarım
+ </string>
+ <string name="targa image">
+ targa görüntüsü
+ </string>
+ <string name="trash">
+ Çöp
+ </string>
+ <string name="jpeg image">
+ jpeg görüntüsü
+ </string>
+ <string name="animation">
+ animasyon
+ </string>
+ <string name="gesture">
+ mimik
+ </string>
+ <string name="simstate">
+ sim durumu
+ </string>
+ <string name="favorite">
+ favori
+ </string>
+ <string name="symbolic link">
+ bağlantı
+ </string>
+ <string name="symbolic folder link">
+ klasör bağlantısı
+ </string>
+ <string name="mesh">
+ örgü
+ </string>
+ <string name="AvatarEditingAppearance">
+ (Görünümü Düzenliyor)
+ </string>
+ <string name="AvatarAway">
+ Uzakta
+ </string>
+ <string name="AvatarBusy">
+ MeÅŸgul
+ </string>
+ <string name="AvatarMuted">
+ EngellenmiÅŸ
+ </string>
+ <string name="anim_express_afraid">
+ KorkmuÅŸ
+ </string>
+ <string name="anim_express_anger">
+ Kızgın
+ </string>
+ <string name="anim_away">
+ Uzakta
+ </string>
+ <string name="anim_backflip">
+ Geriye salto
+ </string>
+ <string name="anim_express_laugh">
+ İçten Kahkaha
+ </string>
+ <string name="anim_express_toothsmile">
+ Büyük Gülümseme
+ </string>
+ <string name="anim_blowkiss">
+ Öpücük Atma
+ </string>
+ <string name="anim_express_bored">
+ Canı Sıkılmış
+ </string>
+ <string name="anim_bow">
+ Selamlama
+ </string>
+ <string name="anim_clap">
+ Alkış
+ </string>
+ <string name="anim_courtbow">
+ Reverans
+ </string>
+ <string name="anim_express_cry">
+ AÄŸlama
+ </string>
+ <string name="anim_dance1">
+ Dans 1
+ </string>
+ <string name="anim_dance2">
+ Dans 2
+ </string>
+ <string name="anim_dance3">
+ Dans 3
+ </string>
+ <string name="anim_dance4">
+ Dans 4
+ </string>
+ <string name="anim_dance5">
+ Dans 5
+ </string>
+ <string name="anim_dance6">
+ Dans 6
+ </string>
+ <string name="anim_dance7">
+ Dans 7
+ </string>
+ <string name="anim_dance8">
+ Dans 8
+ </string>
+ <string name="anim_express_disdain">
+ Dudak Bükme
+ </string>
+ <string name="anim_drink">
+ İçme
+ </string>
+ <string name="anim_express_embarrased">
+ Utanmış
+ </string>
+ <string name="anim_angry_fingerwag">
+ İşaret Etme
+ </string>
+ <string name="anim_fist_pump">
+ Yumruk Sallama
+ </string>
+ <string name="anim_yoga_float">
+ Uçan Yoga
+ </string>
+ <string name="anim_express_frown">
+ Kaş Çatma
+ </string>
+ <string name="anim_impatient">
+ Sabırsız
+ </string>
+ <string name="anim_jumpforjoy">
+ Sevinçten Zıplama
+ </string>
+ <string name="anim_kissmybutt">
+ Kıçımı Öp
+ </string>
+ <string name="anim_express_kiss">
+ Öpücük
+ </string>
+ <string name="anim_laugh_short">
+ Gülme
+ </string>
+ <string name="anim_musclebeach">
+ Muscle Beach
+ </string>
+ <string name="anim_no_unhappy">
+ Hayır (Mutsuz)
+ </string>
+ <string name="anim_no_head">
+ Hayır
+ </string>
+ <string name="anim_nyanya">
+ Ha-ha-ha
+ </string>
+ <string name="anim_punch_onetwo">
+ Peşpeşe İki Yumruk
+ </string>
+ <string name="anim_express_open_mouth">
+ Ağız Açık
+ </string>
+ <string name="anim_peace">
+ Barış
+ </string>
+ <string name="anim_point_you">
+ Diğerini Göster
+ </string>
+ <string name="anim_point_me">
+ Kendini Göster
+ </string>
+ <string name="anim_punch_l">
+ Sola Yumruk At
+ </string>
+ <string name="anim_punch_r">
+ SaÄŸa Yumruk At
+ </string>
+ <string name="anim_rps_countdown">
+ RPS sayımı
+ </string>
+ <string name="anim_rps_paper">
+ RPS kağıdı
+ </string>
+ <string name="anim_rps_rock">
+ RPS kayası
+ </string>
+ <string name="anim_rps_scissors">
+ RPS makası
+ </string>
+ <string name="anim_express_repulsed">
+ TiksinmiÅŸ
+ </string>
+ <string name="anim_kick_roundhouse_r">
+ Döner Tekme
+ </string>
+ <string name="anim_express_sad">
+ Üzgün
+ </string>
+ <string name="anim_salute">
+ Selam
+ </string>
+ <string name="anim_shout">
+ Bağırma
+ </string>
+ <string name="anim_express_shrug">
+ Omuz Silkme
+ </string>
+ <string name="anim_express_smile">
+ Gülümseme
+ </string>
+ <string name="anim_smoke_idle">
+ Duman Tüttürme
+ </string>
+ <string name="anim_smoke_inhale">
+ Duman Çekme
+ </string>
+ <string name="anim_smoke_throw_down">
+ Yere İzmarit Atma
+ </string>
+ <string name="anim_express_surprise">
+ Sürpriz
+ </string>
+ <string name="anim_sword_strike_r">
+ Kılıç Darbesi
+ </string>
+ <string name="anim_angry_tantrum">
+ Öfke Nöbeti
+ </string>
+ <string name="anim_express_tongue_out">
+ Dil Çıkarma
+ </string>
+ <string name="anim_hello">
+ El Sallama
+ </string>
+ <string name="anim_whisper">
+ Fısıldama
+ </string>
+ <string name="anim_whistle">
+ Islık Çalma
+ </string>
+ <string name="anim_express_wink">
+ Göz Kırpma
+ </string>
+ <string name="anim_wink_hollywood">
+ Göz Kırpma (Hollywood)
+ </string>
+ <string name="anim_express_worry">
+ EndiÅŸelenme
+ </string>
+ <string name="anim_yes_happy">
+ Evet (Mutlu)
+ </string>
+ <string name="anim_yes_head">
+ Evet
+ </string>
+ <string name="texture_loading">
+ Yükleniyor...
+ </string>
+ <string name="worldmap_offline">
+ Çevrimdışı
+ </string>
+ <string name="worldmap_item_tooltip_format">
+ [AREA] m² L$[PRICE]
+ </string>
+ <string name="worldmap_results_none_found">
+ Hiçbiri bulunamadı.
+ </string>
+ <string name="Ok">
+ Tamam
+ </string>
+ <string name="Premature end of file">
+ Dosyanın zamanından önce sonu
+ </string>
+ <string name="ST_NO_JOINT">
+ KÖK veya EKLEM bulunamıyor.
+ </string>
+ <string name="whisper">
+ fısıldar:
+ </string>
+ <string name="shout">
+ bağırır:
+ </string>
+ <string name="ringing">
+ SL dünyası içindeki Sesli Sohbete bağlanılıyor...
+ </string>
+ <string name="connected">
+ Bağlı
+ </string>
+ <string name="unavailable">
+ Geçerli konumunuzda ses mevcut değil
+ </string>
+ <string name="hang_up">
+ SL dünyası içindeki Sesli Sohbet ile bağlantı kesildi
+ </string>
+ <string name="reconnect_nearby">
+ Şimdi Yakındaki bir Sesli Sohbete yeniden bağlanılacaksınız.
+ </string>
+ <string name="ScriptQuestionCautionChatGranted">
+ &apos;[OWNERNAME]&apos; adlı kişiye ait, [REGIONPOS] üzerinde [REGIONNAME] içerisinde bulunan &apos;[OBJECTNAME]&apos; nesnesine şunu yapma izni verildi: [PERMISSIONS].
+ </string>
+ <string name="ScriptQuestionCautionChatDenied">
+ &apos;[OWNERNAME]&apos; adlı kişiye ait, [REGIONPOS] üzerinde [REGIONNAME] içerisinde bulunan &apos;[OBJECTNAME]&apos; nesnesine şunu yapma izni verilmedi: [PERMISSIONS].
+ </string>
+ <string name="ScriptTakeMoney">
+ Sizden Linden dolar (L$) almak
+ </string>
+ <string name="ActOnControlInputs">
+ Denetim girişlerinizle ilgili eylem gerçekleştirmek
+ </string>
+ <string name="RemapControlInputs">
+ Denetim girişleriniz için yeniden eşleme yapmak
+ </string>
+ <string name="AnimateYourAvatar">
+ Avatarınızı canlandırmak
+ </string>
+ <string name="AttachToYourAvatar">
+ Avatarınıza eklemek
+ </string>
+ <string name="ReleaseOwnership">
+ Mülkiyeti bırakmak ve kamuya açık hale gelmek
+ </string>
+ <string name="LinkAndDelink">
+ Başka nesnelerle bağlantı kurmak veya koparmak
+ </string>
+ <string name="AddAndRemoveJoints">
+ Başka nesnelerle eklem eklemek ve kaldırmak
+ </string>
+ <string name="ChangePermissions">
+ İzinlerini değiştirmek
+ </string>
+ <string name="TrackYourCamera">
+ Kameranızı takip etmek
+ </string>
+ <string name="ControlYourCamera">
+ Kameranızı kontrol etmek
+ </string>
+ <string name="NotConnected">
+ Bağlı Değil
+ </string>
+ <string name="SIM_ACCESS_PG">
+ Genel
+ </string>
+ <string name="SIM_ACCESS_MATURE">
+ Orta
+ </string>
+ <string name="SIM_ACCESS_ADULT">
+ YetiÅŸkin
+ </string>
+ <string name="SIM_ACCESS_DOWN">
+ Çevrimdışı
+ </string>
+ <string name="SIM_ACCESS_MIN">
+ Bilinmiyor
+ </string>
+ <string name="land_type_unknown">
+ (bilinmiyor)
+ </string>
+ <string name="Estate / Full Region">
+ Gayrimenkul / Tam Bölge
+ </string>
+ <string name="Estate / Homestead">
+ Gayrimenkul / Banliyö
+ </string>
+ <string name="Mainland / Homestead">
+ Anakara / Banliyö
+ </string>
+ <string name="Mainland / Full Region">
+ Anakara / Tam Bölge
+ </string>
+ <string name="all_files">
+ Tüm Dosyalar
+ </string>
+ <string name="sound_files">
+ Sesler
+ </string>
+ <string name="animation_files">
+ Animasyonlar
+ </string>
+ <string name="image_files">
+ Görüntüler
+ </string>
+ <string name="save_file_verb">
+ Kaydet
+ </string>
+ <string name="load_file_verb">
+ Yükle
+ </string>
+ <string name="targa_image_files">
+ Targa Görüntüleri
+ </string>
+ <string name="bitmap_image_files">
+ Bitmap Görüntüler
+ </string>
+ <string name="avi_movie_file">
+ AVI Film Dosyası
+ </string>
+ <string name="xaf_animation_file">
+ XAF Animasyon Dosyası
+ </string>
+ <string name="xml_file">
+ XML Dosyası
+ </string>
+ <string name="raw_file">
+ Ham Dosya
+ </string>
+ <string name="compressed_image_files">
+ Sıkıştırılmış Görüntüler
+ </string>
+ <string name="load_files">
+ Dosyalar Yükle
+ </string>
+ <string name="choose_the_directory">
+ Dizin Seç
+ </string>
+ <string name="AvatarSetNotAway">
+ Uzakta DeÄŸil
+ </string>
+ <string name="AvatarSetAway">
+ Uzakta
+ </string>
+ <string name="AvatarSetNotBusy">
+ MeÅŸgul DeÄŸil
+ </string>
+ <string name="AvatarSetBusy">
+ MeÅŸgul
+ </string>
+ <string name="shape">
+ Åžekil
+ </string>
+ <string name="skin">
+ Dış Katman
+ </string>
+ <string name="hair">
+ Saç
+ </string>
+ <string name="eyes">
+ Gözler
+ </string>
+ <string name="shirt">
+ Gömlek
+ </string>
+ <string name="pants">
+ Pantolon
+ </string>
+ <string name="shoes">
+ Ayakkabılar
+ </string>
+ <string name="socks">
+ Çoraplar
+ </string>
+ <string name="jacket">
+ Ceket
+ </string>
+ <string name="gloves">
+ Eldivenler
+ </string>
+ <string name="undershirt">
+ Fanila
+ </string>
+ <string name="underpants">
+ Külot
+ </string>
+ <string name="skirt">
+ Etek
+ </string>
+ <string name="alpha">
+ Alfa
+ </string>
+ <string name="tattoo">
+ Dövme
+ </string>
+ <string name="physics">
+ Fizik
+ </string>
+ <string name="invalid">
+ geçersiz
+ </string>
+ <string name="none">
+ hiçbiri
+ </string>
+ <string name="shirt_not_worn">
+ Giyilmemiş gömlek
+ </string>
+ <string name="pants_not_worn">
+ GiyilmemiÅŸ pantolon
+ </string>
+ <string name="shoes_not_worn">
+ Giyilmemiş ayakkabılar
+ </string>
+ <string name="socks_not_worn">
+ Giyilmemiş çoraplar
+ </string>
+ <string name="jacket_not_worn">
+ GiyilmemiÅŸ ceket
+ </string>
+ <string name="gloves_not_worn">
+ GiyilmemiÅŸ eldivenler
+ </string>
+ <string name="undershirt_not_worn">
+ GiyilmemiÅŸ fanila
+ </string>
+ <string name="underpants_not_worn">
+ Giyilmemiş külot
+ </string>
+ <string name="skirt_not_worn">
+ GiyilmemiÅŸ etek
+ </string>
+ <string name="alpha_not_worn">
+ GiyilmemiÅŸ alfa
+ </string>
+ <string name="tattoo_not_worn">
+ Giyilmemiş dövme
+ </string>
+ <string name="physics_not_worn">
+ GiyilmemiÅŸ fizik
+ </string>
+ <string name="invalid_not_worn">
+ geçersiz
+ </string>
+ <string name="create_new_shape">
+ Yeni ÅŸekil oluÅŸtur
+ </string>
+ <string name="create_new_skin">
+ Yeni dış katman oluştur
+ </string>
+ <string name="create_new_hair">
+ Yeni saç oluştur
+ </string>
+ <string name="create_new_eyes">
+ Yeni gözler oluştur
+ </string>
+ <string name="create_new_shirt">
+ Yeni gömlek oluştur
+ </string>
+ <string name="create_new_pants">
+ Yeni pantolon oluÅŸtur
+ </string>
+ <string name="create_new_shoes">
+ Yeni ayakkabılar oluştur
+ </string>
+ <string name="create_new_socks">
+ Yeni çoraplar oluştur
+ </string>
+ <string name="create_new_jacket">
+ Yeni ceket oluÅŸtur
+ </string>
+ <string name="create_new_gloves">
+ Yeni eldivenler oluÅŸtur
+ </string>
+ <string name="create_new_undershirt">
+ Yeni fanila oluÅŸtur
+ </string>
+ <string name="create_new_underpants">
+ Yeni külot oluştur
+ </string>
+ <string name="create_new_skirt">
+ Yeni etek oluÅŸtur
+ </string>
+ <string name="create_new_alpha">
+ Yeni alfa oluÅŸtur
+ </string>
+ <string name="create_new_tattoo">
+ Yeni dövme oluştur
+ </string>
+ <string name="create_new_physics">
+ Yeni fizik oluÅŸtur
+ </string>
+ <string name="create_new_invalid">
+ geçersiz
+ </string>
+ <string name="NewWearable">
+ Yeni [WEARABLE_ITEM]
+ </string>
+ <string name="next">
+ Sonraki
+ </string>
+ <string name="ok">
+ Tamam
+ </string>
+ <string name="GroupNotifyGroupNotice">
+ Grup Bildirimi
+ </string>
+ <string name="GroupNotifyGroupNotices">
+ Grup Bildirimleri
+ </string>
+ <string name="GroupNotifySentBy">
+ Gönderen:
+ </string>
+ <string name="GroupNotifyAttached">
+ EklenmiÅŸ:
+ </string>
+ <string name="GroupNotifyViewPastNotices">
+ Burada eski bildirimleri görüntüleyin veya bu iletilerin alınmasını iptal edin.
+ </string>
+ <string name="GroupNotifyOpenAttachment">
+ Aksesuarı Aç
+ </string>
+ <string name="GroupNotifySaveAttachment">
+ Aksesuarı Kaydet
+ </string>
+ <string name="TeleportOffer">
+ Işınlama teklifi
+ </string>
+ <string name="StartUpNotifications">
+ Siz yokken yeni bildirimler geldi.
+ </string>
+ <string name="OverflowInfoChannelString">
+ %d ilave bildiriminiz var
+ </string>
+ <string name="BodyPartsRightArm">
+ SaÄŸ Kol
+ </string>
+ <string name="BodyPartsHead">
+ BaÅŸ
+ </string>
+ <string name="BodyPartsLeftArm">
+ Sol Kol
+ </string>
+ <string name="BodyPartsLeftLeg">
+ Sol Bacak
+ </string>
+ <string name="BodyPartsTorso">
+ Gövde
+ </string>
+ <string name="BodyPartsRightLeg">
+ SaÄŸ Bacak
+ </string>
+ <string name="GraphicsQualityLow">
+ Düşük
+ </string>
+ <string name="GraphicsQualityMid">
+ Orta
+ </string>
+ <string name="GraphicsQualityHigh">
+ Yüksek
+ </string>
+ <string name="LeaveMouselook">
+ Dünya Görünümüne dönmek için ESC&apos;e basın
+ </string>
+ <string name="InventoryNoMatchingItems">
+ Aradığınızı bulamadınız mı? [secondlife:///app/search/all/[SEARCH_TERM] Arama] ile bulmayı deneyin.
+ </string>
+ <string name="PlacesNoMatchingItems">
+ Aradığınızı bulamadınız mı? [secondlife:///app/search/places/[SEARCH_TERM] Arama] ile bulmayı deneyin.
+ </string>
+ <string name="FavoritesNoMatchingItems">
+ Bir yer imini favorilerinize eklemek için buraya sürükleyin.
+ </string>
+ <string name="InventoryNoTexture">
+ Envanterinizde bu dokunun kopyası yok
+ </string>
+ <string name="InventoryInboxNoItems">
+ Bir öğeyi satın aldığınızda veya başka bir şekilde edindiğinizde burada görünür; bunu envanterinizdeki bir klasöre sürükleyebilir veya tutmak istemiyorsanız silebilirsiniz.
+ </string>
+ <string name="MarketplaceURL">
+ http://marketplace.[DOMAIN_NAME]
+ </string>
+ <string name="MarketplaceURL_CreateStore">
+ http://marketplace.[DOMAIN_NAME]/create_store
+ </string>
+ <string name="MarketplaceURL_LearnMore">
+ http://marketplace.[DOMAIN_NAME]/learn_more
+ </string>
+ <string name="InventoryOutboxCreationErrorTitle">
+ Satıcı Giden Kutunuz düzgün yapılandırılmamıştır
+ </string>
+ <string name="InventoryOutboxCreationErrorTooltip">
+ Satıcı Giden Kutusu yapılandırma hatası
+ </string>
+ <string name="InventoryOutboxCreationError">
+ Sorunu düzeltmek için lütfen Müşteri Hizmetlerine başvurun.
+ </string>
+ <string name="InventoryOutboxNotMerchantTitle">
+ Pazaryerinde herkes öğe satabilir
+ </string>
+ <string name="InventoryOutboxNotMerchantTooltip">
+ Bir satıcı olun!
+ </string>
+ <string name="InventoryOutboxNotMerchant">
+ [[MARKETPLACE_URL] Second Life Pazaryeri] içerisinde bir milyondan fazla sanal ürün satışa sunulmuştur, bunların tümü Sakinler tarafından oluşturulmuştur. Siz de oluşturduğunuz öğeleri ve satın aldığınız öğelerin bazılarını satabilirsiniz. Bunu yapmak kolaydır, kurulum da ücretsizdir. [[LEARN_MORE_URL] Daha fazla bilgi edinin] veya başlamak için Pazaryerinde [[CREATE_STORE_URL] bir mağaza açın].
+ </string>
+ <string name="InventoryOutboxNoItemsTitle">
+ Pazaryerine öğe göndermek için yeni bir yol
+ </string>
+ <string name="InventoryOutboxNoItemsTooltip">
+ Öğeleri Pazaryerinde satışa hazırlamak için sürükleyip buraya bırakın
+ </string>
+ <string name="InventoryOutboxNoItems">
+ Satmak istediğiniz öğeleri veya klasörleri bu alana sürükleyin. Öğenin bir kopyası burada görünür ve kopyalanamaz bir öğeyi sürüklemediyseniz, envanteriniz aynı kalır. Öğeleri Pazaryerine göndermeye hazır olduğunuzda Karşıya Yükle düğmesine tıklayın. Öğeleriniz Pazaryeri Envanterinize taşındığında bu klasörden kaybolurlar.
+ </string>
+ <string name="Marketplace Error None">
+ Hata yok
+ </string>
+ <string name="Marketplace Error Not Merchant">
+ Hata: Öğeleri Pazaryerine göndermeden önce kendinizi bir satıcı olarak belirlemelisiniz (ücretsizdir).
+ </string>
+ <string name="Marketplace Error Empty Folder">
+ Hata: Bu klasörün içeriği boş.
+ </string>
+ <string name="Marketplace Error Unassociated Products">
+ Hata: Bu öğe karşıya yüklenemedi çünkü satıcı hesabınızda ürünlerle ilişkisiz çok fazla öğe mevcut. Bu hatayı düzeltmek için Pazaryeri web sitesine oturum açın ve ilişkisiz öğe sayınızı azaltın.
+ </string>
+ <string name="Marketplace Error Object Limit">
+ Hata: Bu öğe çok fazla nesne içeriyor. Bu hatayı düzeltmek için nesneleri birlikte kutulara yerleştirerek, toplam nesne sayısını 200&apos;ün altına düşürün.
+ </string>
+ <string name="Marketplace Error Folder Depth">
+ Hata: Bu öğede çok fazla iç içe geçmiş klasör seviyesi var. Bunu tekrar düzenleyerek maksimum 3 iç içe geçmiş klasör seviyesine indirin.
+ </string>
+ <string name="Marketplace Error Unsellable Item">
+ Hata: Bu öğe Pazaryerinde satılamaz.
+ </string>
+ <string name="Marketplace Error Internal Import">
+ Hata: Bu öğede bir sorun var. Daha sonra tekrar deneyin.
+ </string>
+ <string name="Open landmarks">
+ Açık yer imleri
+ </string>
+ <string name="no_transfer" value="(aktarım yok)"/>
+ <string name="no_modify" value="(deÄŸiÅŸtirme yok)"/>
+ <string name="no_copy" value="(kopya yok)"/>
+ <string name="worn" value="(giyilmiÅŸ)"/>
+ <string name="link" value="(bağlantı)"/>
+ <string name="broken_link" value="(broken_link)"/>
+ <string name="LoadingContents">
+ İçerik yükleniyor...
+ </string>
+ <string name="NoContents">
+ İçerik yok
+ </string>
+ <string name="WornOnAttachmentPoint" value="([ATTACHMENT_POINT] üzerinde giyilmiş)"/>
+ <string name="ActiveGesture" value="[GESLABEL] (etkin)"/>
+ <string name="PermYes">
+ Evet
+ </string>
+ <string name="PermNo">
+ Hayır
+ </string>
+ <string name="Chat Message" value="Sohbet:"/>
+ <string name="Sound" value="Ses:"/>
+ <string name="Wait" value="--- Bekleyin:"/>
+ <string name="AnimFlagStop" value="Animasyonu Durdur:"/>
+ <string name="AnimFlagStart" value="Animasyonu BaÅŸlat:"/>
+ <string name="Wave" value="El Sallama"/>
+ <string name="GestureActionNone" value="Hiçbiri"/>
+ <string name="HelloAvatar" value="Merhaba avatar!"/>
+ <string name="ViewAllGestures" value="Tümünü Göster &gt;&gt;"/>
+ <string name="GetMoreGestures" value="İlave Al &gt;&gt;"/>
+ <string name="Animations" value="Animasyonlar,"/>
+ <string name="Calling Cards" value="Arama Kartları,"/>
+ <string name="Clothing" value="Giysiler,"/>
+ <string name="Gestures" value="Mimikler,"/>
+ <string name="Landmarks" value="Yer İmleri,"/>
+ <string name="Notecards" value="Not Kartları,"/>
+ <string name="Objects" value="Nesneler,"/>
+ <string name="Scripts" value="Komut Dosyaları,"/>
+ <string name="Sounds" value="Sesler,"/>
+ <string name="Textures" value="Dokular,"/>
+ <string name="Snapshots" value="Anlık Görüntüler,"/>
+ <string name="No Filters" value="Hayır"/>
+ <string name="Since Logoff" value="- Oturum Kapandıktan Beri"/>
+ <string name="InvFolder My Inventory">
+ Envanterim
+ </string>
+ <string name="InvFolder Library">
+ Kütüphane
+ </string>
+ <string name="InvFolder Textures">
+ Dokular
+ </string>
+ <string name="InvFolder Sounds">
+ Sesler
+ </string>
+ <string name="InvFolder Calling Cards">
+ Arama Kartları
+ </string>
+ <string name="InvFolder Landmarks">
+ Yer İmleri
+ </string>
+ <string name="InvFolder Scripts">
+ Komut Dosyaları
+ </string>
+ <string name="InvFolder Clothing">
+ Giysiler
+ </string>
+ <string name="InvFolder Objects">
+ Nesneler
+ </string>
+ <string name="InvFolder Notecards">
+ Not Kartları
+ </string>
+ <string name="InvFolder New Folder">
+ Yeni Klasör
+ </string>
+ <string name="InvFolder Inventory">
+ Envanter
+ </string>
+ <string name="InvFolder Uncompressed Images">
+ Sıkıştırılmamış Görüntüler
+ </string>
+ <string name="InvFolder Body Parts">
+ Vücut Bölümleri
+ </string>
+ <string name="InvFolder Trash">
+ Çöp
+ </string>
+ <string name="InvFolder Photo Album">
+ Fotoğraf Albümü
+ </string>
+ <string name="InvFolder Lost And Found">
+ Kaybedip Bulduklarım
+ </string>
+ <string name="InvFolder Uncompressed Sounds">
+ Sıkıştırılmamış Sesler
+ </string>
+ <string name="InvFolder Animations">
+ Animasyonlar
+ </string>
+ <string name="InvFolder Gestures">
+ Mimikler
+ </string>
+ <string name="InvFolder Favorite">
+ Favorilerim
+ </string>
+ <string name="InvFolder favorite">
+ Favorilerim
+ </string>
+ <string name="InvFolder Current Outfit">
+ Mevcut Dış Görünüm
+ </string>
+ <string name="InvFolder Initial Outfits">
+ Başlangıçtakı Dış Görünümler
+ </string>
+ <string name="InvFolder My Outfits">
+ Benim Dış Görünümlerim
+ </string>
+ <string name="InvFolder Accessories">
+ Aksesuarlar
+ </string>
+ <string name="InvFolder Meshes">
+ Örgüler
+ </string>
+ <string name="InvFolder Friends">
+ ArkadaÅŸlar
+ </string>
+ <string name="InvFolder All">
+ Tümü
+ </string>
+ <string name="no_attachments">
+ Giyilen aksesuar yok
+ </string>
+ <string name="Attachments remain">
+ Aksesuarlar ([COUNT] yuva mevcut)
+ </string>
+ <string name="Buy">
+ Satın Al
+ </string>
+ <string name="BuyforL$">
+ L$&apos;a Satın Al
+ </string>
+ <string name="Stone">
+ TaÅŸ
+ </string>
+ <string name="Metal">
+ Metal
+ </string>
+ <string name="Glass">
+ Cam
+ </string>
+ <string name="Wood">
+ AhÅŸap
+ </string>
+ <string name="Flesh">
+ Et
+ </string>
+ <string name="Plastic">
+ Plastik
+ </string>
+ <string name="Rubber">
+ Lastik
+ </string>
+ <string name="Light">
+ Işık
+ </string>
+ <string name="KBShift">
+ Shift
+ </string>
+ <string name="KBCtrl">
+ Ctrl
+ </string>
+ <string name="Chest">
+ Göğüs
+ </string>
+ <string name="Skull">
+ Kafatası
+ </string>
+ <string name="Left Shoulder">
+ Sol Omuz
+ </string>
+ <string name="Right Shoulder">
+ SaÄŸ Omuz
+ </string>
+ <string name="Left Hand">
+ Sol El
+ </string>
+ <string name="Right Hand">
+ SaÄŸ El
+ </string>
+ <string name="Left Foot">
+ Sol Ayak
+ </string>
+ <string name="Right Foot">
+ SaÄŸ Ayak
+ </string>
+ <string name="Spine">
+ Omurga
+ </string>
+ <string name="Pelvis">
+ LeÄŸen KemiÄŸi
+ </string>
+ <string name="Mouth">
+ Ağız
+ </string>
+ <string name="Chin">
+ Çene
+ </string>
+ <string name="Left Ear">
+ Sol Kulak
+ </string>
+ <string name="Right Ear">
+ SaÄŸ Kulak
+ </string>
+ <string name="Left Eyeball">
+ Sol Göz Küresi
+ </string>
+ <string name="Right Eyeball">
+ Sağ Göz Küresi
+ </string>
+ <string name="Nose">
+ Burun
+ </string>
+ <string name="R Upper Arm">
+ Sağ Üst Kol
+ </string>
+ <string name="R Forearm">
+ Sağ Ön Kol
+ </string>
+ <string name="L Upper Arm">
+ Sol Üst Kol
+ </string>
+ <string name="L Forearm">
+ Sol Ön Kol
+ </string>
+ <string name="Right Hip">
+ Sağ Kalça
+ </string>
+ <string name="R Upper Leg">
+ Sağ Üst Bacak
+ </string>
+ <string name="R Lower Leg">
+ SaÄŸ Alt Bacak
+ </string>
+ <string name="Left Hip">
+ Sol Kalça
+ </string>
+ <string name="L Upper Leg">
+ Sol Üst Bacak
+ </string>
+ <string name="L Lower Leg">
+ Sol Alt Bacak
+ </string>
+ <string name="Stomach">
+ Karın
+ </string>
+ <string name="Left Pec">
+ Sol Göğüs
+ </string>
+ <string name="Right Pec">
+ Sağ Göğüs
+ </string>
+ <string name="Neck">
+ Boyun
+ </string>
+ <string name="Avatar Center">
+ Avatar Merkezi
+ </string>
+ <string name="Invalid Attachment">
+ Geçersiz Aksesuar Noktası
+ </string>
+ <string name="YearsMonthsOld">
+ [AGEYEARS] [AGEMONTHS]&apos;lık
+ </string>
+ <string name="YearsOld">
+ [AGEYEARS] yaşında
+ </string>
+ <string name="MonthsOld">
+ [AGEMONTHS]&apos;lık
+ </string>
+ <string name="WeeksOld">
+ [AGEWEEKS]&apos;lık
+ </string>
+ <string name="DaysOld">
+ [AGEDAYS]&apos;lük
+ </string>
+ <string name="TodayOld">
+ Bugün katıldı
+ </string>
+ <string name="AgeYearsA">
+ [COUNT] yıl
+ </string>
+ <string name="AgeYearsB">
+ [COUNT] yıl
+ </string>
+ <string name="AgeYearsC">
+ [COUNT] yıl
+ </string>
+ <string name="AgeMonthsA">
+ [COUNT] ay
+ </string>
+ <string name="AgeMonthsB">
+ [COUNT] ay
+ </string>
+ <string name="AgeMonthsC">
+ [COUNT] ay
+ </string>
+ <string name="AgeWeeksA">
+ [COUNT] hafta
+ </string>
+ <string name="AgeWeeksB">
+ [COUNT] hafta
+ </string>
+ <string name="AgeWeeksC">
+ [COUNT] hafta
+ </string>
+ <string name="AgeDaysA">
+ [COUNT] gün
+ </string>
+ <string name="AgeDaysB">
+ [COUNT] gün
+ </string>
+ <string name="AgeDaysC">
+ [COUNT] gün
+ </string>
+ <string name="GroupMembersA">
+ [COUNT] üye
+ </string>
+ <string name="GroupMembersB">
+ [COUNT] üye
+ </string>
+ <string name="GroupMembersC">
+ [COUNT] üye
+ </string>
+ <string name="AcctTypeResident">
+ Sakin
+ </string>
+ <string name="AcctTypeTrial">
+ Deneme
+ </string>
+ <string name="AcctTypeCharterMember">
+ Ayrıcalıklı Üye
+ </string>
+ <string name="AcctTypeEmployee">
+ Linden Lab Çalışanı
+ </string>
+ <string name="PaymentInfoUsed">
+ Kullanılan Ödeme Bilgisi
+ </string>
+ <string name="PaymentInfoOnFile">
+ Dosyadaki Ödeme Bilgisi
+ </string>
+ <string name="NoPaymentInfoOnFile">
+ Dosyada Ödeme Bilgisi Yok
+ </string>
+ <string name="AgeVerified">
+ Yaşı Doğrulanmış
+ </string>
+ <string name="NotAgeVerified">
+ Yaşı Doğrulanmamış
+ </string>
+ <string name="Center 2">
+ 2. Merkez
+ </string>
+ <string name="Top Right">
+ Sağ Üst
+ </string>
+ <string name="Top">
+ Üst
+ </string>
+ <string name="Top Left">
+ Sol Üst
+ </string>
+ <string name="Center">
+ Merkez
+ </string>
+ <string name="Bottom Left">
+ Sol Alt
+ </string>
+ <string name="Bottom">
+ Alt
+ </string>
+ <string name="Bottom Right">
+ SaÄŸ Alt
+ </string>
+ <string name="CompileQueueDownloadedCompiling">
+ Karşıdan yüklendi, şimdi derleniyor
+ </string>
+ <string name="CompileQueueScriptNotFound">
+ Komut dosyası sunucuda bulunamadı.
+ </string>
+ <string name="CompileQueueProblemDownloading">
+ Karşıdan yüklenirken sorun oluştu
+ </string>
+ <string name="CompileQueueInsufficientPermDownload">
+ Komut dosyasını karşıdan yüklemek için yeterli izin yok.
+ </string>
+ <string name="CompileQueueInsufficientPermFor">
+ Şunun için yeterli izin yok:
+ </string>
+ <string name="CompileQueueUnknownFailure">
+ Karşıdan yüklerken bilinmeyen hata
+ </string>
+ <string name="CompileQueueTitle">
+ Tekrar Derleme İlerlemesi
+ </string>
+ <string name="CompileQueueStart">
+ tekrar derle
+ </string>
+ <string name="ResetQueueTitle">
+ Sıfırlama İlerlemesi
+ </string>
+ <string name="ResetQueueStart">
+ sıfırla
+ </string>
+ <string name="RunQueueTitle">
+ Çalışan Süreçlerin İlerlemesini Ayarla
+ </string>
+ <string name="RunQueueStart">
+ çalıştırmayı ayarla
+ </string>
+ <string name="NotRunQueueTitle">
+ Çalışmayan Süreçlerin İlerlemesini Ayarla
+ </string>
+ <string name="NotRunQueueStart">
+ çalıştırmamayı ayarla
+ </string>
+ <string name="CompileSuccessful">
+ Derleme başarılı oldu!
+ </string>
+ <string name="CompileSuccessfulSaving">
+ Derleme başarılı, kaydediliyor...
+ </string>
+ <string name="SaveComplete">
+ Kaydetme tamamlandı.
+ </string>
+ <string name="ObjectOutOfRange">
+ Komut dosyası (nesne kapsam dışı)
+ </string>
+ <string name="GodToolsObjectOwnedBy">
+ [OWNER] mülkiyetindeki [OBJECT] nesnesi
+ </string>
+ <string name="GroupsNone">
+ hiçbiri
+ </string>
+ <string name="Group" value="(grup)"/>
+ <string name="Unknown">
+ (Bilinmiyor)
+ </string>
+ <string name="SummaryForTheWeek" value="Bu haftanın özeti, şu tarihten itibaren:"/>
+ <string name="NextStipendDay" value="Sonraki ödeme günü şudur:"/>
+ <string name="GroupPlanningDate">
+ [mthnum,datetime,utc]/[day,datetime,utc]/[year,datetime,utc]
+ </string>
+ <string name="GroupIndividualShare" value="Grup Bireysel Pay"/>
+ <string name="GroupColumn" value="Grup"/>
+ <string name="Balance">
+ Bakiye
+ </string>
+ <string name="Credits">
+ Katkıda Bulunanlar
+ </string>
+ <string name="Debits">
+ Borçlar
+ </string>
+ <string name="Total">
+ Toplam
+ </string>
+ <string name="NoGroupDataFound">
+ Bu grup için grup verisi bulunamadı
+ </string>
+ <string name="IMParentEstate">
+ ana gayrimenkul
+ </string>
+ <string name="IMMainland">
+ anakara
+ </string>
+ <string name="IMTeen">
+ on sekiz yaş altı
+ </string>
+ <string name="Anyone">
+ herkes
+ </string>
+ <string name="RegionInfoError">
+ hata
+ </string>
+ <string name="RegionInfoAllEstatesOwnedBy">
+ [OWNER] mülkiyetindeki tüm gayrimenkuller
+ </string>
+ <string name="RegionInfoAllEstatesYouOwn">
+ sahip olduğunuz tüm gayrimenkuller
+ </string>
+ <string name="RegionInfoAllEstatesYouManage">
+ [OWNER] adına yönettiğiniz tüm gayrimenkuller
+ </string>
+ <string name="RegionInfoAllowedResidents">
+ İzin verilen Sakinler: ([ALLOWEDAGENTS], maks [MAXACCESS])
+ </string>
+ <string name="RegionInfoAllowedGroups">
+ İzin verilen gruplar: ([ALLOWEDGROUPS], maks [MAXACCESS])
+ </string>
+ <string name="ScriptLimitsParcelScriptMemory">
+ Parsel Komut Dosyası Belleği
+ </string>
+ <string name="ScriptLimitsParcelsOwned">
+ Listelenen Parseller: [PARCELS]
+ </string>
+ <string name="ScriptLimitsMemoryUsed">
+ Kullanılan bellek: [COUNT] kb / [MAX] kb içerisinden; [AVAILABLE] kb serbest
+ </string>
+ <string name="ScriptLimitsMemoryUsedSimple">
+ Kullanılan bellek: [COUNT] kb
+ </string>
+ <string name="ScriptLimitsParcelScriptURLs">
+ Parsel Komut Dosyası URL&apos;leri
+ </string>
+ <string name="ScriptLimitsURLsUsed">
+ Kullanılan URL&apos;ler: [COUNT] / [MAX] içerisinden; [AVAILABLE] serbest
+ </string>
+ <string name="ScriptLimitsURLsUsedSimple">
+ Kullanılan URL&apos;ler: [COUNT]
+ </string>
+ <string name="ScriptLimitsRequestError">
+ Bilgi talep edilirken hata oluÅŸtu
+ </string>
+ <string name="ScriptLimitsRequestNoParcelSelected">
+ Seçili Parsel Yok
+ </string>
+ <string name="ScriptLimitsRequestWrongRegion">
+ Hata: Komut dosyası bilgisi sadece mevcut bölgenizde geçerli
+ </string>
+ <string name="ScriptLimitsRequestWaiting">
+ Bilgiler alınıyor...
+ </string>
+ <string name="ScriptLimitsRequestDontOwnParcel">
+ Bu parseli inceleme izniniz yok
+ </string>
+ <string name="SITTING_ON">
+ Üzerinde Oturuyor
+ </string>
+ <string name="ATTACH_CHEST">
+ Göğüs
+ </string>
+ <string name="ATTACH_HEAD">
+ BaÅŸ
+ </string>
+ <string name="ATTACH_LSHOULDER">
+ Sol Omuz
+ </string>
+ <string name="ATTACH_RSHOULDER">
+ SaÄŸ Omuz
+ </string>
+ <string name="ATTACH_LHAND">
+ Sol El
+ </string>
+ <string name="ATTACH_RHAND">
+ SaÄŸ El
+ </string>
+ <string name="ATTACH_LFOOT">
+ Sol Ayak
+ </string>
+ <string name="ATTACH_RFOOT">
+ SaÄŸ Ayak
+ </string>
+ <string name="ATTACH_BACK">
+ Geri
+ </string>
+ <string name="ATTACH_PELVIS">
+ LeÄŸen KemiÄŸi
+ </string>
+ <string name="ATTACH_MOUTH">
+ Ağız
+ </string>
+ <string name="ATTACH_CHIN">
+ Çene
+ </string>
+ <string name="ATTACH_LEAR">
+ Sol Kulak
+ </string>
+ <string name="ATTACH_REAR">
+ SaÄŸ Kulak
+ </string>
+ <string name="ATTACH_LEYE">
+ Sol Göz
+ </string>
+ <string name="ATTACH_REYE">
+ Sağ Göz
+ </string>
+ <string name="ATTACH_NOSE">
+ Burun
+ </string>
+ <string name="ATTACH_RUARM">
+ Sol Üst Kol
+ </string>
+ <string name="ATTACH_RLARM">
+ SaÄŸ Alt Kol
+ </string>
+ <string name="ATTACH_LUARM">
+ Sol Üst Kol
+ </string>
+ <string name="ATTACH_LLARM">
+ Sol Alt Kol
+ </string>
+ <string name="ATTACH_RHIP">
+ Sağ Kalça
+ </string>
+ <string name="ATTACH_RULEG">
+ Sağ Üst Bacak
+ </string>
+ <string name="ATTACH_RLLEG">
+ SaÄŸ Alt Bacak
+ </string>
+ <string name="ATTACH_LHIP">
+ Sol Kalça
+ </string>
+ <string name="ATTACH_LULEG">
+ Sol Üst Bacak
+ </string>
+ <string name="ATTACH_LLLEG">
+ Sol Alt Bacak
+ </string>
+ <string name="ATTACH_BELLY">
+ Göbek
+ </string>
+ <string name="ATTACH_RPEC">
+ Sağ Göğüs
+ </string>
+ <string name="ATTACH_LPEC">
+ Sol Göğüs
+ </string>
+ <string name="ATTACH_HUD_CENTER_2">
+ BÜG 2. Merkez
+ </string>
+ <string name="ATTACH_HUD_TOP_RIGHT">
+ BÜG Sağ Üst
+ </string>
+ <string name="ATTACH_HUD_TOP_CENTER">
+ BÜG Merkez Üst
+ </string>
+ <string name="ATTACH_HUD_TOP_LEFT">
+ BÜG Sol Üst
+ </string>
+ <string name="ATTACH_HUD_CENTER_1">
+ BÜG 1. Merkez
+ </string>
+ <string name="ATTACH_HUD_BOTTOM_LEFT">
+ BÜG Sol Alt
+ </string>
+ <string name="ATTACH_HUD_BOTTOM">
+ BÜG Alt
+ </string>
+ <string name="ATTACH_HUD_BOTTOM_RIGHT">
+ BÜG Sağ Alt
+ </string>
+ <string name="CursorPos">
+ Satır [LINE], Sütun [COLUMN]
+ </string>
+ <string name="PanelDirCountFound">
+ [COUNT] bulundu
+ </string>
+ <string name="PanelDirTimeStr">
+ [hour,datetime,slt]:[min,datetime,slt]
+ </string>
+ <string name="PanelDirEventsDateText">
+ [mthnum,datetime,slt]/[day,datetime,slt]
+ </string>
+ <string name="PanelContentsTooltip">
+ Nesnenin içeriği
+ </string>
+ <string name="PanelContentsNewScript">
+ Yeni Komut Dosyası
+ </string>
+ <string name="BusyModeResponseDefault">
+ İleti gönderdiğiniz Sakin &apos;meşgul modu&apos;nda, bu da rahatsız edilmek istemediği anlamına geliyor. İletiniz daha sonra incelenmesi için kendisine ait Aİ panelinde gösterilecektir.
+ </string>
+ <string name="MuteByName">
+ (Adına göre)
+ </string>
+ <string name="MuteAgent">
+ (Sakin)
+ </string>
+ <string name="MuteObject">
+ (Nesne)
+ </string>
+ <string name="MuteGroup">
+ (Grup)
+ </string>
+ <string name="MuteExternal">
+ (Harici)
+ </string>
+ <string name="RegionNoCovenant">
+ Bu Gayrimenkul için Sözleşmesi yok.
+ </string>
+ <string name="RegionNoCovenantOtherOwner">
+ Bu Gayrimenkul için Sözleşmesi yok. Bu gayrimenkul üzerindeki arazi Linden Lab. değil, Gayrimenkul sahibi tarafından satılmaktadır. Satış ayrıntılarını öğrenmek için lütfen Gayrimenkul Sahibiyle bağlantıya geçin.
+ </string>
+ <string name="covenant_last_modified" value="Son DeÄŸiÅŸtirildiÄŸi Tarih:"/>
+ <string name="none_text" value="(hiçbiri)"/>
+ <string name="never_text" value="(asla)"/>
+ <string name="GroupOwned">
+ Sahibi Olunan Grup
+ </string>
+ <string name="Public">
+ Kamuya Açık
+ </string>
+ <string name="LocalSettings">
+ Yerel Ayarlar
+ </string>
+ <string name="RegionSettings">
+ Bölge Ayarları
+ </string>
+ <string name="ClassifiedClicksTxt">
+ Tıklamalar: [TELEPORT] ışınlama, [MAP] harita, [PROFILE] profil
+ </string>
+ <string name="ClassifiedUpdateAfterPublish">
+ (yayınlandıktan sonra güncelleştirilir)
+ </string>
+ <string name="NoPicksClassifiedsText">
+ Herhangi bir Seçme veya İlan oluşturmadınız. Bir Seçme veya İlan oluşturmak için aşağıdaki Artı düğmesine tıklayın.
+ </string>
+ <string name="NoAvatarPicksClassifiedsText">
+ Kullanıcının herhangi bir seçmesi veya ilanı yok
+ </string>
+ <string name="PicksClassifiedsLoadingText">
+ Yükleniyor...
+ </string>
+ <string name="MultiPreviewTitle">
+ Önizleme
+ </string>
+ <string name="MultiPropertiesTitle">
+ Özellikler
+ </string>
+ <string name="InvOfferAnObjectNamed">
+ Åžu ada sahip bir nesne:
+ </string>
+ <string name="InvOfferOwnedByGroup">
+ grubun sahip olduÄŸu:
+ </string>
+ <string name="InvOfferOwnedByUnknownGroup">
+ bilinmeyen grubun sahip olduÄŸu:
+ </string>
+ <string name="InvOfferOwnedBy">
+ sahibi:
+ </string>
+ <string name="InvOfferOwnedByUnknownUser">
+ bilinmeyen bir kullanıcının sahip olduğu:
+ </string>
+ <string name="InvOfferGaveYou">
+ size verdi:
+ </string>
+ <string name="InvOfferDecline">
+ &lt;nolink&gt;[NAME]&lt;/nolink&gt; tarafından gönderilen [DESC]&apos;i reddettiniz.
+ </string>
+ <string name="GroupMoneyTotal">
+ Toplam
+ </string>
+ <string name="GroupMoneyBought">
+ alınan:
+ </string>
+ <string name="GroupMoneyPaidYou">
+ size ödenen:
+ </string>
+ <string name="GroupMoneyPaidInto">
+ şuraya ödenen:
+ </string>
+ <string name="GroupMoneyBoughtPassTo">
+ şuraya geçiş hakkı alınan:
+ </string>
+ <string name="GroupMoneyPaidFeeForEvent">
+ etkinlik için ödenen ücret:
+ </string>
+ <string name="GroupMoneyPaidPrizeForEvent">
+ etkinlik için verilen ödül:
+ </string>
+ <string name="GroupMoneyBalance">
+ Bakiye
+ </string>
+ <string name="GroupMoneyCredits">
+ Katkıda Bulunanlar
+ </string>
+ <string name="GroupMoneyDebits">
+ Borçlar
+ </string>
+ <string name="GroupMoneyDate">
+ [weekday,datetime,utc] [mth,datetime,utc] [day,datetime,utc], [year,datetime,utc]
+ </string>
+ <string name="ViewerObjectContents">
+ İçerik
+ </string>
+ <string name="AcquiredItems">
+ Alınan Öğeler
+ </string>
+ <string name="Cancel">
+ İptal
+ </string>
+ <string name="UploadingCosts">
+ [NAME] için karşıya yükleme maliyeti: L$ [AMOUNT]
+ </string>
+ <string name="BuyingCosts">
+ Bunu satın almanın maliyeti: L$ [AMOUNT]
+ </string>
+ <string name="UnknownFileExtension">
+ Bilinmeyen dosya uzantısı .%s
+.wav, .tga, .bmp, .jpg, .jpeg veya .bvh bekleniyordu
+ </string>
+ <string name="MuteObject2">
+ Engelle
+ </string>
+ <string name="MuteAvatar">
+ Engelle
+ </string>
+ <string name="UnmuteObject">
+ Engellemeyi Kaldır
+ </string>
+ <string name="UnmuteAvatar">
+ Engellemeyi Kaldır
+ </string>
+ <string name="AddLandmarkNavBarMenu">
+ Yer İmlerime Ekle...
+ </string>
+ <string name="EditLandmarkNavBarMenu">
+ Yer İmimi Düzenle...
+ </string>
+ <string name="accel-mac-control">
+ ⌃
+ </string>
+ <string name="accel-mac-command">
+ ⌘
+ </string>
+ <string name="accel-mac-option">
+ ⌥
+ </string>
+ <string name="accel-mac-shift">
+ ⇧
+ </string>
+ <string name="accel-win-control">
+ Ctrl+
+ </string>
+ <string name="accel-win-alt">
+ Alt+
+ </string>
+ <string name="accel-win-shift">
+ Shift+
+ </string>
+ <string name="FileSaved">
+ Dosya Kaydedildi
+ </string>
+ <string name="Receiving">
+ Alınıyor
+ </string>
+ <string name="AM">
+ ÖÖ
+ </string>
+ <string name="PM">
+ ÖS
+ </string>
+ <string name="PST">
+ PST
+ </string>
+ <string name="PDT">
+ PDT
+ </string>
+ <string name="Direction_Forward">
+ İleri
+ </string>
+ <string name="Direction_Left">
+ Sol
+ </string>
+ <string name="Direction_Right">
+ SaÄŸ
+ </string>
+ <string name="Direction_Back">
+ Geri
+ </string>
+ <string name="Direction_North">
+ Kuzey
+ </string>
+ <string name="Direction_South">
+ Güney
+ </string>
+ <string name="Direction_West">
+ Batı
+ </string>
+ <string name="Direction_East">
+ DoÄŸu
+ </string>
+ <string name="Direction_Up">
+ Yukarı
+ </string>
+ <string name="Direction_Down">
+ Aşağı
+ </string>
+ <string name="Any Category">
+ Herh. Bir Kategori
+ </string>
+ <string name="Shopping">
+ Alışveriş
+ </string>
+ <string name="Land Rental">
+ Arazi Kiralama
+ </string>
+ <string name="Property Rental">
+ Mülk Kiralama
+ </string>
+ <string name="Special Attraction">
+ Özel Atraksiyon
+ </string>
+ <string name="New Products">
+ Yeni Ürünler
+ </string>
+ <string name="Employment">
+ İstihdam
+ </string>
+ <string name="Wanted">
+ Arananlar
+ </string>
+ <string name="Service">
+ Hizmet
+ </string>
+ <string name="Personal">
+ KiÅŸisel
+ </string>
+ <string name="None">
+ Renksiz
+ </string>
+ <string name="Linden Location">
+ Linden Konumu
+ </string>
+ <string name="Adult">
+ YetiÅŸkin
+ </string>
+ <string name="Arts&amp;Culture">
+ Sanat ve Kültür
+ </string>
+ <string name="Business">
+ İş
+ </string>
+ <string name="Educational">
+ EÄŸitim
+ </string>
+ <string name="Gaming">
+ Oyun
+ </string>
+ <string name="Hangout">
+ UÄŸrak Mekan
+ </string>
+ <string name="Newcomer Friendly">
+ Yeni Gelenlere Yardım Sunan
+ </string>
+ <string name="Parks&amp;Nature">
+ Park ve DoÄŸa
+ </string>
+ <string name="Residential">
+ YerleÅŸim
+ </string>
+ <string name="Stage">
+ Sahne
+ </string>
+ <string name="Other">
+ DiÄŸer
+ </string>
+ <string name="Rental">
+ Kiralık
+ </string>
+ <string name="Any">
+ Herhangi
+ </string>
+ <string name="You">
+ Siz
+ </string>
+ <string name=":">
+ :
+ </string>
+ <string name=",">
+ ,
+ </string>
+ <string name="...">
+ ...
+ </string>
+ <string name="***">
+ ***
+ </string>
+ <string name="(">
+ (
+ </string>
+ <string name=")">
+ )
+ </string>
+ <string name=".">
+ .
+ </string>
+ <string name="&apos;">
+ &apos;
+ </string>
+ <string name="---">
+ ---
+ </string>
+ <string name="Multiple Media">
+ Birden Çok Ortam
+ </string>
+ <string name="Play Media">
+ Ortamı Oynat/Durdur
+ </string>
+ <string name="MBCmdLineError">
+ Komut satırı ayrıştırılırken bir hata oluştu.
+Lütfen bakınız: http://wiki.secondlife.com/wiki/Client_parameters
+Hata:
+ </string>
+ <string name="MBCmdLineUsg">
+ [APP_NAME] Komut satırı kullanımı:
+ </string>
+ <string name="MBUnableToAccessFile">
+ [APP_NAME] ihtiyaç duyduğu bir dosyaya erişemiyor.
+
+Bunun nedeni bir şekilde birden fazla kopyanın çalışıyor olması veya sisteminizin, bir dosyanın açık olduğunu sanması olabilir.
+Bu iletiyi görmeye devam ederseniz, bilgisayarınızı yeniden başlatın ve tekrar deneyin.
+Sorun devam ederse [APP_NAME] uygulamasını tümüyle kaldırmanız ve tekrar yüklemeniz gerekebilir.
+ </string>
+ <string name="MBFatalError">
+ Önemli Hata
+ </string>
+ <string name="MBRequiresAltiVec">
+ [APP_NAME], AltiVec (G4 veya üzeri) bir işlemciye ihtiyaç duyuyor.
+ </string>
+ <string name="MBAlreadyRunning">
+ [APP_NAME] zaten çalışıyor.
+Programın simge durumuna küçültülmüş bir kopyası için görev çubuğunuza bakın.
+Bu iletiyi görmeye devam ederseniz, bilgisayarınızı tekrar başlatın.
+ </string>
+ <string name="MBFrozenCrashed">
+ [APP_NAME] uygulaması bir önceki çalıştırmada kilitlenmiş görünüyor.
+Bir kilitlenme raporu göndermek ister misiniz?
+ </string>
+ <string name="MBAlert">
+ Bildirim
+ </string>
+ <string name="MBNoDirectX">
+ [APP_NAME], DirectX 9.0b veya üzerini saptayamıyor.
+[APP_NAME], kararlılık problemleri, kötü performans ve çökmelere neden olabilecek donanım ve/veya süresi geçmiş sürücüleri saptamak için DirectX kullanır. [APP_NAME] uygulamasını bu olmadan da çalıştırmanız mümkündür, ancak DirectX 9.0b ile çalıştırmanızı kuvvetle tavsiye ederiz.
+
+Devam etmek istiyor musunuz?
+ </string>
+ <string name="MBWarning">
+ Uyarı
+ </string>
+ <string name="MBNoAutoUpdate">
+ Linux için henüz otomatik güncelleştirme uygulanmamıştır.
+Lütfen www.secondlife.com adresinden son sürümü karşıdan yükleyin.
+ </string>
+ <string name="MBRegClassFailed">
+ RegisterClass başarısız oldu
+ </string>
+ <string name="MBError">
+ Hata
+ </string>
+ <string name="MBFullScreenErr">
+ [WIDTH] x [HEIGHT] çözünürlüğünde tam ekran çalıştırma yapılamıyor.
+Pencerede çalışıyor.
+ </string>
+ <string name="MBDestroyWinFailed">
+ Pencere yok edilirken Kapatma Hatası oluştu (DestroyWindow() başarısız oldu)
+ </string>
+ <string name="MBShutdownErr">
+ Kapatma Hatası
+ </string>
+ <string name="MBDevContextErr">
+ GL cihazı içeriği oluşturulamıyor
+ </string>
+ <string name="MBPixelFmtErr">
+ Uygun piksel formatı bulunamadı
+ </string>
+ <string name="MBPixelFmtDescErr">
+ Piksel formatı açıklaması alınamıyor
+ </string>
+ <string name="MBTrueColorWindow">
+ [APP_NAME] uygulamasının çalışması için Gerçek Renk (32 bit) gerekiyor.
+Lütfen bilgisayarınızın ekran ayarlarına gidin ve renk modunu 32 bit olarak ayarlayın.
+ </string>
+ <string name="MBAlpha">
+ [APP_NAME] çalışamıyor çünkü 8 bit bir alfa kanalı alamıyor. Bunun nedeni genellikle video kartı sürücü sorunlarıdır.
+Lütfen en yeni video sürücülerinin yüklü olduğuna emin olun.
+Ayrıca Denetim Masaları &gt; Ekran &gt; Ayarlar içerisinde ekranınız için Gerçek Renk (32 bit) ayarı yapıldığına emin olun.
+Bu iletiyi almaya devam ederseniz, lütfen [SUPPORT_SITE] bölümüne başvurun.
+ </string>
+ <string name="MBPixelFmtSetErr">
+ Piksel formatı ayarlanamıyor
+ </string>
+ <string name="MBGLContextErr">
+ GL işlemi bağlamı oluşturulamıyor
+ </string>
+ <string name="MBGLContextActErr">
+ GL işlemi bağlamı etkinleştirilemiyor
+ </string>
+ <string name="MBVideoDrvErr">
+ [APP_NAME] çalışamıyor çünkü video kartı sürücüleriniz düzgün yüklenemedi, süresi geçmiş durumda veya desteklenmeyen donanımlar için geliştirilmiş. Lütfen en yeni video kartı sürücülerine sahip olduğunuza emin olun; en yeni sürücüler mevcutsa da bunları tekrar yüklemeyi deneyin.
+
+Bu iletiyi almaya devam ederseniz, lütfen [SUPPORT_SITE] bölümüne başvurun.
+ </string>
+ <string name="5 O&apos;Clock Shadow">
+ Bir Günlük Sakal
+ </string>
+ <string name="All White">
+ Tümü Beyaz
+ </string>
+ <string name="Anime Eyes">
+ Anime Gözler
+ </string>
+ <string name="Arced">
+ Yay Åžeklinde
+ </string>
+ <string name="Arm Length">
+ Kol UzunluÄŸu
+ </string>
+ <string name="Attached">
+ BitiÅŸik
+ </string>
+ <string name="Attached Earlobes">
+ Kafaya BitiÅŸik Kulak Memeleri
+ </string>
+ <string name="Back Fringe">
+ Arka Perçem
+ </string>
+ <string name="Baggy">
+ Torbalı
+ </string>
+ <string name="Bangs">
+ Kahküller
+ </string>
+ <string name="Beady Eyes">
+ Boncuk Gözler
+ </string>
+ <string name="Belly Size">
+ Göbek Büyüklüğü
+ </string>
+ <string name="Big">
+ Büyük
+ </string>
+ <string name="Big Butt">
+ Büyük Kıç
+ </string>
+ <string name="Big Hair Back">
+ Kabarık Saç: Arkada
+ </string>
+ <string name="Big Hair Front">
+ Kabarık Saç: Önde
+ </string>
+ <string name="Big Hair Top">
+ Kabarık Saç: Tepede
+ </string>
+ <string name="Big Head">
+ Büyük Kafa
+ </string>
+ <string name="Big Pectorals">
+ Büyük Göğüs Kasları
+ </string>
+ <string name="Big Spikes">
+ Büyük Dik Kısımlar
+ </string>
+ <string name="Black">
+ Siyah
+ </string>
+ <string name="Blonde">
+ Sarışın
+ </string>
+ <string name="Blonde Hair">
+ Sarı Saç
+ </string>
+ <string name="Blush">
+ Allık
+ </string>
+ <string name="Blush Color">
+ Allık Rengi
+ </string>
+ <string name="Blush Opacity">
+ Allık Geçirgenliği
+ </string>
+ <string name="Body Definition">
+ Vücut Tanımı
+ </string>
+ <string name="Body Fat">
+ Vücut Yağı
+ </string>
+ <string name="Body Freckles">
+ Vücut Çilleri
+ </string>
+ <string name="Body Thick">
+ Kalın Vücut
+ </string>
+ <string name="Body Thickness">
+ Vücut Kalınlığı
+ </string>
+ <string name="Body Thin">
+ İnce Vücut
+ </string>
+ <string name="Bow Legged">
+ Çarpık Bacaklı
+ </string>
+ <string name="Breast Buoyancy">
+ Göğüs Kalkıklığı
+ </string>
+ <string name="Breast Cleavage">
+ Göğüs Çatalı
+ </string>
+ <string name="Breast Size">
+ Göğüs Büyüklüğü
+ </string>
+ <string name="Bridge Width">
+ Burun KemiÄŸi GeniÅŸliÄŸi
+ </string>
+ <string name="Broad">
+ GeniÅŸ
+ </string>
+ <string name="Brow Size">
+ Alın Genişliği
+ </string>
+ <string name="Bug Eyes">
+ Patlak Gözlü
+ </string>
+ <string name="Bugged Eyes">
+ Patlak Gözlü
+ </string>
+ <string name="Bulbous">
+ Patates Burunlu
+ </string>
+ <string name="Bulbous Nose">
+ Patates Burunlu
+ </string>
+ <string name="Breast Physics Mass">
+ Göğüs Kütlesi
+ </string>
+ <string name="Breast Physics Smoothing">
+ Göğüs Düzleştirme
+ </string>
+ <string name="Breast Physics Gravity">
+ Göğüs Yerçekimi
+ </string>
+ <string name="Breast Physics Drag">
+ Göğüs Direnci
+ </string>
+ <string name="Breast Physics InOut Max Effect">
+ Maks Etki
+ </string>
+ <string name="Breast Physics InOut Spring">
+ Yaylanma
+ </string>
+ <string name="Breast Physics InOut Gain">
+ Kazanç
+ </string>
+ <string name="Breast Physics InOut Damping">
+ Sönüm
+ </string>
+ <string name="Breast Physics UpDown Max Effect">
+ Maks Etki
+ </string>
+ <string name="Breast Physics UpDown Spring">
+ Yaylanma
+ </string>
+ <string name="Breast Physics UpDown Gain">
+ Kazanç
+ </string>
+ <string name="Breast Physics UpDown Damping">
+ Sönüm
+ </string>
+ <string name="Breast Physics LeftRight Max Effect">
+ Maks Etki
+ </string>
+ <string name="Breast Physics LeftRight Spring">
+ Yaylanma
+ </string>
+ <string name="Breast Physics LeftRight Gain">
+ Kazanç
+ </string>
+ <string name="Breast Physics LeftRight Damping">
+ Sönüm
+ </string>
+ <string name="Belly Physics Mass">
+ Göbek Kütlesi
+ </string>
+ <string name="Belly Physics Smoothing">
+ Göbek Düzleştirme
+ </string>
+ <string name="Belly Physics Gravity">
+ Göbek Yerçekimi
+ </string>
+ <string name="Belly Physics Drag">
+ Göbek Direnci
+ </string>
+ <string name="Belly Physics UpDown Max Effect">
+ Maks Etki
+ </string>
+ <string name="Belly Physics UpDown Spring">
+ Yaylanma
+ </string>
+ <string name="Belly Physics UpDown Gain">
+ Kazanç
+ </string>
+ <string name="Belly Physics UpDown Damping">
+ Sönüm
+ </string>
+ <string name="Butt Physics Mass">
+ Kıç Kütlesi
+ </string>
+ <string name="Butt Physics Smoothing">
+ Kıç Düzleştirme
+ </string>
+ <string name="Butt Physics Gravity">
+ Kıç Yerçekimi
+ </string>
+ <string name="Butt Physics Drag">
+ Kıç Direnci
+ </string>
+ <string name="Butt Physics UpDown Max Effect">
+ Maks Etki
+ </string>
+ <string name="Butt Physics UpDown Spring">
+ Yaylanma
+ </string>
+ <string name="Butt Physics UpDown Gain">
+ Kazanç
+ </string>
+ <string name="Butt Physics UpDown Damping">
+ Sönüm
+ </string>
+ <string name="Butt Physics LeftRight Max Effect">
+ Maks Etki
+ </string>
+ <string name="Butt Physics LeftRight Spring">
+ Yaylanma
+ </string>
+ <string name="Butt Physics LeftRight Gain">
+ Kazanç
+ </string>
+ <string name="Butt Physics LeftRight Damping">
+ Sönüm
+ </string>
+ <string name="Bushy Eyebrows">
+ Gür Kaşlar
+ </string>
+ <string name="Bushy Hair">
+ Gür Saç
+ </string>
+ <string name="Butt Size">
+ Kıç Büyüklüğü
+ </string>
+ <string name="Butt Gravity">
+ Kıç Yerçekimi
+ </string>
+ <string name="bustle skirt">
+ Tarlatanlı Etek
+ </string>
+ <string name="no bustle">
+ Tarlatansız
+ </string>
+ <string name="more bustle">
+ Çok Tarlatanlı
+ </string>
+ <string name="Chaplin">
+ Chaplin pantalon
+ </string>
+ <string name="Cheek Bones">
+ Elmacık Kemikleri
+ </string>
+ <string name="Chest Size">
+ Göğüs Büyüklüğü
+ </string>
+ <string name="Chin Angle">
+ Çene Açısı
+ </string>
+ <string name="Chin Cleft">
+ Çene Çukuru
+ </string>
+ <string name="Chin Curtains">
+ Lincoln Sakal
+ </string>
+ <string name="Chin Depth">
+ Çene Derinliği
+ </string>
+ <string name="Chin Heavy">
+ Geniş Çene
+ </string>
+ <string name="Chin In">
+ Çene İçeri
+ </string>
+ <string name="Chin Out">
+ Çene Dışarı
+ </string>
+ <string name="Chin-Neck">
+ Çene-Boyun
+ </string>
+ <string name="Clear">
+ Temizle
+ </string>
+ <string name="Cleft">
+ Çukur
+ </string>
+ <string name="Close Set Eyes">
+ Yakın Gözler
+ </string>
+ <string name="Closed">
+ Kapalı
+ </string>
+ <string name="Closed Back">
+ Arkası Kapalı
+ </string>
+ <string name="Closed Front">
+ Önü Kapalı
+ </string>
+ <string name="Closed Left">
+ Solu Kapalı
+ </string>
+ <string name="Closed Right">
+ Sağı Kapalı
+ </string>
+ <string name="Coin Purse">
+ Para Cüzdanı
+ </string>
+ <string name="Collar Back">
+ Yaka Arkası
+ </string>
+ <string name="Collar Front">
+ Yaka Önü
+ </string>
+ <string name="Corner Down">
+ Köşesi Aşağıda
+ </string>
+ <string name="Corner Up">
+ Köşesi Yukarıda
+ </string>
+ <string name="Creased">
+ Kırışık
+ </string>
+ <string name="Crooked Nose">
+ Yamuk Burun
+ </string>
+ <string name="Cuff Flare">
+ Geniş Paça
+ </string>
+ <string name="Dark">
+ Karanlık
+ </string>
+ <string name="Dark Green">
+ Koyu YeÅŸil
+ </string>
+ <string name="Darker">
+ Daha Koyu
+ </string>
+ <string name="Deep">
+ Derin
+ </string>
+ <string name="Default Heels">
+ Varsayılan Topuklar
+ </string>
+ <string name="Dense">
+ YoÄŸun
+ </string>
+ <string name="Double Chin">
+ Çift Çene
+ </string>
+ <string name="Downturned">
+ Aşağı Dönük
+ </string>
+ <string name="Duffle Bag">
+ Spor Çanta
+ </string>
+ <string name="Ear Angle">
+ Kulak Açısı
+ </string>
+ <string name="Ear Size">
+ Kulak Büyüklüğü
+ </string>
+ <string name="Ear Tips">
+ Kulak Uçları
+ </string>
+ <string name="Egg Head">
+ Yumurta Kafa
+ </string>
+ <string name="Eye Bags">
+ Göz Altı Torbaları
+ </string>
+ <string name="Eye Color">
+ Göz Rengi
+ </string>
+ <string name="Eye Depth">
+ Gözün İçeri Çöküklüğü
+ </string>
+ <string name="Eye Lightness">
+ Göz Parlaklığı
+ </string>
+ <string name="Eye Opening">
+ Göz Açıklığı
+ </string>
+ <string name="Eye Pop">
+ Gözlerin Dışarı Çıkıklığı
+ </string>
+ <string name="Eye Size">
+ Göz Büyüklüğü
+ </string>
+ <string name="Eye Spacing">
+ Gözlerin Aralığı
+ </string>
+ <string name="Eyebrow Arc">
+ KaÅŸ Kavisi
+ </string>
+ <string name="Eyebrow Density">
+ Kaş Kalınlığı
+ </string>
+ <string name="Eyebrow Height">
+ Kaş Yüksekliği
+ </string>
+ <string name="Eyebrow Points">
+ Kaş Yapısı
+ </string>
+ <string name="Eyebrow Size">
+ Kaş Büyüklüğü
+ </string>
+ <string name="Eyelash Length">
+ Kirpik UzunluÄŸu
+ </string>
+ <string name="Eyeliner">
+ Göz Kalemi
+ </string>
+ <string name="Eyeliner Color">
+ Göz Kalemi Rengi
+ </string>
+ <string name="Eyes Bugged">
+ Patlak Gözler
+ </string>
+ <string name="Face Shear">
+ Dikey Yüz Kaydırma
+ </string>
+ <string name="Facial Definition">
+ Yüz İfadesi
+ </string>
+ <string name="Far Set Eyes">
+ Ayrık Gözler
+ </string>
+ <string name="Fat Lips">
+ Kalın Dudaklar
+ </string>
+ <string name="Female">
+ Kadın
+ </string>
+ <string name="Fingerless">
+ Parmaksız
+ </string>
+ <string name="Fingers">
+ Parmaklar
+ </string>
+ <string name="Flared Cuffs">
+ Geniş Paçalar
+ </string>
+ <string name="Flat">
+ Düz
+ </string>
+ <string name="Flat Butt">
+ Düz Kıç
+ </string>
+ <string name="Flat Head">
+ Düz Kafa
+ </string>
+ <string name="Flat Toe">
+ Düz Ayak Ucu
+ </string>
+ <string name="Foot Size">
+ Ayak Büyüklüğü
+ </string>
+ <string name="Forehead Angle">
+ Alın Açısı
+ </string>
+ <string name="Forehead Heavy">
+ Belirgin Alın
+ </string>
+ <string name="Freckles">
+ Çiller
+ </string>
+ <string name="Front Fringe">
+ Ön Perçem
+ </string>
+ <string name="Full Back">
+ Arkası Düz
+ </string>
+ <string name="Full Eyeliner">
+ Çift Taraflı Göz Kalemi
+ </string>
+ <string name="Full Front">
+ Önü Düz
+ </string>
+ <string name="Full Hair Sides">
+ Saçlar Yanda
+ </string>
+ <string name="Full Sides">
+ Saçlar Yanda
+ </string>
+ <string name="Glossy">
+ Parlak
+ </string>
+ <string name="Glove Fingers">
+ Eldiven Parmakları
+ </string>
+ <string name="Glove Length">
+ Eldiven UzunluÄŸu
+ </string>
+ <string name="Hair">
+ Saç
+ </string>
+ <string name="Hair Back">
+ Saç: Arka
+ </string>
+ <string name="Hair Front">
+ Saç: Ön
+ </string>
+ <string name="Hair Sides">
+ Saç: Yanlar
+ </string>
+ <string name="Hair Sweep">
+ Saçı Yana Tarama
+ </string>
+ <string name="Hair Thickess">
+ Saç Kalınlığı
+ </string>
+ <string name="Hair Thickness">
+ Saç Kalınlığı
+ </string>
+ <string name="Hair Tilt">
+ Saç Eğimi
+ </string>
+ <string name="Hair Tilted Left">
+ Sola Eğimli Saç
+ </string>
+ <string name="Hair Tilted Right">
+ Sağa Eğimli Saç
+ </string>
+ <string name="Hair Volume">
+ Saç: Hacim
+ </string>
+ <string name="Hand Size">
+ El Büyüklüğü
+ </string>
+ <string name="Handlebars">
+ Gidon tipi
+ </string>
+ <string name="Head Length">
+ Kafa UzunluÄŸu
+ </string>
+ <string name="Head Shape">
+ Kafa Åžekli
+ </string>
+ <string name="Head Size">
+ Kafa Büyüklüğü
+ </string>
+ <string name="Head Stretch">
+ Kafayı Uzatma
+ </string>
+ <string name="Heel Height">
+ Topuk Yüksekliği
+ </string>
+ <string name="Heel Shape">
+ Topuk Åžekli
+ </string>
+ <string name="Height">
+ Yükseklik
+ </string>
+ <string name="High">
+ Yüksek
+ </string>
+ <string name="High Heels">
+ Yüksek Topuklar
+ </string>
+ <string name="High Jaw">
+ Ayrık
+ </string>
+ <string name="High Platforms">
+ Yüksek Topuklu
+ </string>
+ <string name="High and Tight">
+ Düşük
+ </string>
+ <string name="Higher">
+ Daha Yüksek
+ </string>
+ <string name="Hip Length">
+ Kalça Uzunluğu
+ </string>
+ <string name="Hip Width">
+ Kalça Genişliği
+ </string>
+ <string name="In">
+ İçeri
+ </string>
+ <string name="In Shdw Color">
+ İç Gölge Rengi
+ </string>
+ <string name="In Shdw Opacity">
+ İç Gölge Opaklığı
+ </string>
+ <string name="Inner Eye Corner">
+ Gözün İç Köşesi
+ </string>
+ <string name="Inner Eye Shadow">
+ İç Göz Gölgesi
+ </string>
+ <string name="Inner Shadow">
+ İç Gölge
+ </string>
+ <string name="Jacket Length">
+ Ceket UzunluÄŸu
+ </string>
+ <string name="Jacket Wrinkles">
+ Ceket Kırışıklıkları
+ </string>
+ <string name="Jaw Angle">
+ Çenenin Boyuna Uzaklığı
+ </string>
+ <string name="Jaw Jut">
+ Alt Çene Uzunluğu
+ </string>
+ <string name="Jaw Shape">
+ Çene Kemiği Genişliği
+ </string>
+ <string name="Join">
+ BirleÅŸik
+ </string>
+ <string name="Jowls">
+ Avurtlar
+ </string>
+ <string name="Knee Angle">
+ Diz Açısı
+ </string>
+ <string name="Knock Kneed">
+ Çarpık Bacaklı
+ </string>
+ <string name="Large">
+ Büyük
+ </string>
+ <string name="Large Hands">
+ Büyük Eller
+ </string>
+ <string name="Left Part">
+ Sola Ayırma
+ </string>
+ <string name="Leg Length">
+ Bacak UzunluÄŸu
+ </string>
+ <string name="Leg Muscles">
+ Bacak Kasları
+ </string>
+ <string name="Less">
+ Daha Az
+ </string>
+ <string name="Less Body Fat">
+ Daha Az Vücut Yağı
+ </string>
+ <string name="Less Curtains">
+ Daha Az Lincoln Sakal
+ </string>
+ <string name="Less Freckles">
+ Daha Az Çil
+ </string>
+ <string name="Less Full">
+ Daha Az Dolgun
+ </string>
+ <string name="Less Gravity">
+ Dik Göğüs
+ </string>
+ <string name="Less Love">
+ Daha İnce Bel
+ </string>
+ <string name="Less Muscles">
+ Daha Az Kas
+ </string>
+ <string name="Less Muscular">
+ Daha Az Kaslı
+ </string>
+ <string name="Less Rosy">
+ Daha Az Pembe
+ </string>
+ <string name="Less Round">
+ Daha Az Yuvarlak
+ </string>
+ <string name="Less Saddle">
+ Basensiz
+ </string>
+ <string name="Less Square">
+ Daha Az Küt
+ </string>
+ <string name="Less Volume">
+ Daha Az Hacim
+ </string>
+ <string name="Less soul">
+ Daha az ruh
+ </string>
+ <string name="Lighter">
+ Daha Hafif
+ </string>
+ <string name="Lip Cleft">
+ Dudak Çukuru
+ </string>
+ <string name="Lip Cleft Depth">
+ Dudak Çukuru Derinliği
+ </string>
+ <string name="Lip Fullness">
+ Dudak DolgunluÄŸu
+ </string>
+ <string name="Lip Pinkness">
+ Dudak PembeliÄŸi
+ </string>
+ <string name="Lip Ratio">
+ Dudak Oranı
+ </string>
+ <string name="Lip Thickness">
+ Dudak Kalınlığı
+ </string>
+ <string name="Lip Width">
+ Dudak GeniÅŸliÄŸi
+ </string>
+ <string name="Lipgloss">
+ Dudak Parlatıcısı
+ </string>
+ <string name="Lipstick">
+ Ruj
+ </string>
+ <string name="Lipstick Color">
+ Ruj Rengi
+ </string>
+ <string name="Long">
+ Uzun
+ </string>
+ <string name="Long Head">
+ Uzun Kafa
+ </string>
+ <string name="Long Hips">
+ Yüksek kalça
+ </string>
+ <string name="Long Legs">
+ Uzun Bacaklar
+ </string>
+ <string name="Long Neck">
+ Uzun Boyun
+ </string>
+ <string name="Long Pigtails">
+ Yandan Uzun Kuyruk
+ </string>
+ <string name="Long Ponytail">
+ Uzun AtkuyruÄŸu
+ </string>
+ <string name="Long Torso">
+ Uzun Gövde
+ </string>
+ <string name="Long arms">
+ Uzun kollar
+ </string>
+ <string name="Loose Pants">
+ Bol Pantolon
+ </string>
+ <string name="Loose Shirt">
+ Bol Gömlek
+ </string>
+ <string name="Loose Sleeves">
+ Bol Kollu
+ </string>
+ <string name="Love Handles">
+ Bel Kalınlığı
+ </string>
+ <string name="Low">
+ Düşük
+ </string>
+ <string name="Low Heels">
+ Alçak Topuklar
+ </string>
+ <string name="Low Jaw">
+ BitiÅŸik
+ </string>
+ <string name="Low Platforms">
+ Alçak Topuklu
+ </string>
+ <string name="Low and Loose">
+ Yüksek
+ </string>
+ <string name="Lower">
+ Daha Alçak
+ </string>
+ <string name="Lower Bridge">
+ Alt Burun KemiÄŸi
+ </string>
+ <string name="Lower Cheeks">
+ Daha Alçak Yanaklar
+ </string>
+ <string name="Male">
+ Erkek
+ </string>
+ <string name="Middle Part">
+ Ortadan Ayırma
+ </string>
+ <string name="More">
+ Daha Fazla
+ </string>
+ <string name="More Blush">
+ Daha Fazla Allık
+ </string>
+ <string name="More Body Fat">
+ Daha Fazla Vücut Yağı
+ </string>
+ <string name="More Curtains">
+ Daha Çok Lincoln Sakal
+ </string>
+ <string name="More Eyeshadow">
+ Daha Fazla Göz Farı
+ </string>
+ <string name="More Freckles">
+ Daha Çok Çil
+ </string>
+ <string name="More Full">
+ Daha Dolgun
+ </string>
+ <string name="More Gravity">
+ Sarkık Göğüs
+ </string>
+ <string name="More Lipstick">
+ Daha Çok Ruj
+ </string>
+ <string name="More Love">
+ Daha Kalın Bel
+ </string>
+ <string name="More Lower Lip">
+ Daha Dolgun Alt Dudak
+ </string>
+ <string name="More Muscles">
+ Daha Çok Kas
+ </string>
+ <string name="More Muscular">
+ Daha Kaslı
+ </string>
+ <string name="More Rosy">
+ Daha Pembe
+ </string>
+ <string name="More Round">
+ Daha Yuvarlak
+ </string>
+ <string name="More Saddle">
+ Basenli
+ </string>
+ <string name="More Sloped">
+ Daha EÄŸimli
+ </string>
+ <string name="More Square">
+ Daha Küt
+ </string>
+ <string name="More Upper Lip">
+ Daha Dolgun Üst Dudak
+ </string>
+ <string name="More Vertical">
+ Daha Dikey
+ </string>
+ <string name="More Volume">
+ Daha Hacimli
+ </string>
+ <string name="More soul">
+ Daha çok ruh
+ </string>
+ <string name="Moustache">
+ Bıyık
+ </string>
+ <string name="Mouth Corner">
+ Ağız Köşesi
+ </string>
+ <string name="Mouth Position">
+ Ağzın Konumu
+ </string>
+ <string name="Mowhawk">
+ Mowhawk Saçı
+ </string>
+ <string name="Muscular">
+ Kaslı
+ </string>
+ <string name="Mutton Chops">
+ GeniÅŸ Favori
+ </string>
+ <string name="Nail Polish">
+ Tırnak Cilası
+ </string>
+ <string name="Nail Polish Color">
+ Tırnak Cilası Rengi
+ </string>
+ <string name="Narrow">
+ Dar
+ </string>
+ <string name="Narrow Back">
+ Arkası Dar
+ </string>
+ <string name="Narrow Front">
+ Önü Dar
+ </string>
+ <string name="Narrow Lips">
+ Küçük Dudaklar
+ </string>
+ <string name="Natural">
+ DoÄŸal
+ </string>
+ <string name="Neck Length">
+ Boyun UzunluÄŸu
+ </string>
+ <string name="Neck Thickness">
+ Boyun Kalınlığı
+ </string>
+ <string name="No Blush">
+ Allık Yok
+ </string>
+ <string name="No Eyeliner">
+ Göz Kalemi Yok
+ </string>
+ <string name="No Eyeshadow">
+ Göz Farı Yok
+ </string>
+ <string name="No Lipgloss">
+ Dudak Parlatıcısı Yok
+ </string>
+ <string name="No Lipstick">
+ Ruj Yok
+ </string>
+ <string name="No Part">
+ Ayırma Yok
+ </string>
+ <string name="No Polish">
+ Cila Yok
+ </string>
+ <string name="No Red">
+ Kırmızı Yok
+ </string>
+ <string name="No Spikes">
+ DikleÅŸtirme Yok
+ </string>
+ <string name="No White">
+ Beyaz Yok
+ </string>
+ <string name="No Wrinkles">
+ Kırışıklık Yok
+ </string>
+ <string name="Normal Lower">
+ Normal Alt
+ </string>
+ <string name="Normal Upper">
+ Normal Üst
+ </string>
+ <string name="Nose Left">
+ Sola EÄŸimli Burun
+ </string>
+ <string name="Nose Right">
+ SaÄŸa EÄŸimli Burun
+ </string>
+ <string name="Nose Size">
+ Burun Büyüklüğü
+ </string>
+ <string name="Nose Thickness">
+ Burun Kalınlığı
+ </string>
+ <string name="Nose Tip Angle">
+ Burun Ucu Açısı
+ </string>
+ <string name="Nose Tip Shape">
+ Burun Ucu Åžekli
+ </string>
+ <string name="Nose Width">
+ Burun GeniÅŸliÄŸi
+ </string>
+ <string name="Nostril Division">
+ Burun Deliği Ayrımı
+ </string>
+ <string name="Nostril Width">
+ Burun DeliÄŸi GeniÅŸliÄŸi
+ </string>
+ <string name="Opaque">
+ Opak
+ </string>
+ <string name="Open">
+ Aç
+ </string>
+ <string name="Open Back">
+ Arkayı Aç
+ </string>
+ <string name="Open Front">
+ Önü Aç
+ </string>
+ <string name="Open Left">
+ Solu Aç
+ </string>
+ <string name="Open Right">
+ Sağı Aç
+ </string>
+ <string name="Orange">
+ Turuncu
+ </string>
+ <string name="Out">
+ Dışarı
+ </string>
+ <string name="Out Shdw Color">
+ Dış Gölge Rengi
+ </string>
+ <string name="Out Shdw Opacity">
+ Dış Gölge Opaklığı
+ </string>
+ <string name="Outer Eye Corner">
+ Gözün Dış Köşesi
+ </string>
+ <string name="Outer Eye Shadow">
+ Dış Göz Gölgesi
+ </string>
+ <string name="Outer Shadow">
+ Dış Gölge
+ </string>
+ <string name="Overbite">
+ Öne Doğru
+ </string>
+ <string name="Package">
+ Apış Arası Şişkinliği
+ </string>
+ <string name="Painted Nails">
+ Ojeli Tırnaklar
+ </string>
+ <string name="Pale">
+ Soluk
+ </string>
+ <string name="Pants Crotch">
+ Pantolon Ağı
+ </string>
+ <string name="Pants Fit">
+ Pantolon Oturması
+ </string>
+ <string name="Pants Length">
+ Pantolon UzunluÄŸu
+ </string>
+ <string name="Pants Waist">
+ Pantolon Bel Ölçüsü
+ </string>
+ <string name="Pants Wrinkles">
+ Pantolon Kırışıklıkları
+ </string>
+ <string name="Part">
+ Ayırma
+ </string>
+ <string name="Part Bangs">
+ Ayrılmış Kahküller
+ </string>
+ <string name="Pectorals">
+ Göğüs Kasları
+ </string>
+ <string name="Pigment">
+ Pigment
+ </string>
+ <string name="Pigtails">
+ Yan Kuyruklar
+ </string>
+ <string name="Pink">
+ Pembe
+ </string>
+ <string name="Pinker">
+ Daha Pembe
+ </string>
+ <string name="Platform Height">
+ Topuk Yüksekliği
+ </string>
+ <string name="Platform Width">
+ Topuk GeniÅŸliÄŸi
+ </string>
+ <string name="Pointy">
+ Dar
+ </string>
+ <string name="Pointy Heels">
+ Sivri Topuklar
+ </string>
+ <string name="Ponytail">
+ AtkuyruÄŸu
+ </string>
+ <string name="Poofy Skirt">
+ Kabarık Etek
+ </string>
+ <string name="Pop Left Eye">
+ Sol Gözü Dışarı Çıkar
+ </string>
+ <string name="Pop Right Eye">
+ Sağ Gözü Dışarı Çıkar
+ </string>
+ <string name="Puffy">
+ ÅžiÅŸkin
+ </string>
+ <string name="Puffy Eyelids">
+ Şişkin Göz Kapakları
+ </string>
+ <string name="Rainbow Color">
+ Gökkuşağı Rengi
+ </string>
+ <string name="Red Hair">
+ Kırmızı Saç
+ </string>
+ <string name="Regular">
+ Normal
+ </string>
+ <string name="Right Part">
+ Sağa Ayırma
+ </string>
+ <string name="Rosy Complexion">
+ Kırmızı Yanaklı
+ </string>
+ <string name="Round">
+ Yuvarlak
+ </string>
+ <string name="Ruddiness">
+ Kırmızılık
+ </string>
+ <string name="Ruddy">
+ Kırmızı
+ </string>
+ <string name="Rumpled Hair">
+ Dağınık Saç
+ </string>
+ <string name="Saddle Bags">
+ Basen GeniÅŸliÄŸi
+ </string>
+ <string name="Scrawny Leg">
+ Sıska Bacak
+ </string>
+ <string name="Separate">
+ Ayrık
+ </string>
+ <string name="Shallow">
+ Sığ
+ </string>
+ <string name="Shear Back">
+ Arka DolgunluÄŸu
+ </string>
+ <string name="Shear Face">
+ Yüzü Dikey Kaydır
+ </string>
+ <string name="Shear Front">
+ Ön Dolgunluğu
+ </string>
+ <string name="Shear Left Up">
+ Solu Yukarı Kaydır
+ </string>
+ <string name="Shear Right Up">
+ Sağı Yukarı Kaydır
+ </string>
+ <string name="Sheared Back">
+ Arkası Dolgun
+ </string>
+ <string name="Sheared Front">
+ Önü Dolgun
+ </string>
+ <string name="Shift Left">
+ Sola Kaydır
+ </string>
+ <string name="Shift Mouth">
+ Ağzı Kaydırma
+ </string>
+ <string name="Shift Right">
+ Sağa Kaydır
+ </string>
+ <string name="Shirt Bottom">
+ Gömlek Eteği
+ </string>
+ <string name="Shirt Fit">
+ Gömlek Boyu
+ </string>
+ <string name="Shirt Wrinkles">
+ Gömlek Kırışıklıkları
+ </string>
+ <string name="Shoe Height">
+ Ayakkabı Yüksekliği
+ </string>
+ <string name="Short">
+ Kısa
+ </string>
+ <string name="Short Arms">
+ Kısa Kollar
+ </string>
+ <string name="Short Legs">
+ Kısa Bacaklar
+ </string>
+ <string name="Short Neck">
+ Kısa Boyun
+ </string>
+ <string name="Short Pigtails">
+ Yandan Kısa Kuyruk
+ </string>
+ <string name="Short Ponytail">
+ Kısa Atkuyruğu
+ </string>
+ <string name="Short Sideburns">
+ Kısa Favoriler
+ </string>
+ <string name="Short Torso">
+ Kısa Gövde
+ </string>
+ <string name="Short hips">
+ Düşük kalça
+ </string>
+ <string name="Shoulders">
+ Omuzlar
+ </string>
+ <string name="Side Fringe">
+ Yan Perçem
+ </string>
+ <string name="Sideburns">
+ Favoriler
+ </string>
+ <string name="Sides Hair">
+ Yan Saçlar
+ </string>
+ <string name="Sides Hair Down">
+ Aşağı Doğru Yan Saç
+ </string>
+ <string name="Sides Hair Up">
+ Yukarı Doğru Yan Saç
+ </string>
+ <string name="Skinny Neck">
+ İnce Boyun
+ </string>
+ <string name="Skirt Fit">
+ Etek Boyu
+ </string>
+ <string name="Skirt Length">
+ Etek UzunluÄŸu
+ </string>
+ <string name="Slanted Forehead">
+ Eğimli Alın
+ </string>
+ <string name="Sleeve Length">
+ Kol UzunluÄŸu
+ </string>
+ <string name="Sleeve Looseness">
+ Kol BolluÄŸu
+ </string>
+ <string name="Slit Back">
+ Yırtmaç: Geri
+ </string>
+ <string name="Slit Front">
+ Yırtmaç: Ön
+ </string>
+ <string name="Slit Left">
+ Yırtmaç: Sol
+ </string>
+ <string name="Slit Right">
+ Yırtmaç: Sağ
+ </string>
+ <string name="Small">
+ Küçük
+ </string>
+ <string name="Small Hands">
+ Küçük Eller
+ </string>
+ <string name="Small Head">
+ Küçük Kafa
+ </string>
+ <string name="Smooth">
+ Düz
+ </string>
+ <string name="Smooth Hair">
+ Düz Saç
+ </string>
+ <string name="Socks Length">
+ Çorap Uzunluğu
+ </string>
+ <string name="Soulpatch">
+ Dudak Altı Sakal
+ </string>
+ <string name="Sparse">
+ Seyrek
+ </string>
+ <string name="Spiked Hair">
+ Dikleştirilmiş Saç
+ </string>
+ <string name="Square">
+ GeniÅŸ
+ </string>
+ <string name="Square Toe">
+ Küt Burunlu
+ </string>
+ <string name="Squash Head">
+ Kafayı Bastır
+ </string>
+ <string name="Stretch Head">
+ Kafayı Uzat
+ </string>
+ <string name="Sunken">
+ Çökük
+ </string>
+ <string name="Sunken Chest">
+ Çökük Göğüs
+ </string>
+ <string name="Sunken Eyes">
+ Çökük Gözler
+ </string>
+ <string name="Sweep Back">
+ Arkaya Tarama
+ </string>
+ <string name="Sweep Forward">
+ Öne Tarama
+ </string>
+ <string name="Tall">
+ Uzun
+ </string>
+ <string name="Taper Back">
+ Arkası Kısa
+ </string>
+ <string name="Taper Front">
+ Önü Kısa
+ </string>
+ <string name="Thick Heels">
+ Kalın Topuklar
+ </string>
+ <string name="Thick Neck">
+ Kalın Boyun
+ </string>
+ <string name="Thick Toe">
+ Kalın Ayak Ucu
+ </string>
+ <string name="Thin">
+ İnce
+ </string>
+ <string name="Thin Eyebrows">
+ İnce Kaşlar
+ </string>
+ <string name="Thin Lips">
+ İnce Dudaklar
+ </string>
+ <string name="Thin Nose">
+ İnce Burun
+ </string>
+ <string name="Tight Chin">
+ Çift Çene
+ </string>
+ <string name="Tight Cuffs">
+ Dar Paçalar
+ </string>
+ <string name="Tight Pants">
+ Dar Pantolon
+ </string>
+ <string name="Tight Shirt">
+ Dar Gömlek
+ </string>
+ <string name="Tight Skirt">
+ Dar Etek
+ </string>
+ <string name="Tight Sleeves">
+ Dar Kollu
+ </string>
+ <string name="Toe Shape">
+ Ayakkabu Burnu Åžekli
+ </string>
+ <string name="Toe Thickness">
+ Ayakkabu Burnu Kalınlığı
+ </string>
+ <string name="Torso Length">
+ Gövde Uzunluğu
+ </string>
+ <string name="Torso Muscles">
+ Gövde Kasları
+ </string>
+ <string name="Torso Scrawny">
+ Sıska Gövde
+ </string>
+ <string name="Unattached">
+ Ayrık
+ </string>
+ <string name="Uncreased">
+ BuruÅŸuk olmayan
+ </string>
+ <string name="Underbite">
+ Geriye DoÄŸru
+ </string>
+ <string name="Unnatural">
+ DoÄŸal Olmayan
+ </string>
+ <string name="Upper Bridge">
+ Üst Burun Kemiği
+ </string>
+ <string name="Upper Cheeks">
+ Üst Yanaklar
+ </string>
+ <string name="Upper Chin Cleft">
+ Üst Çene Çukuru
+ </string>
+ <string name="Upper Eyelid Fold">
+ Üst Göz Kapağı Kıvrımı
+ </string>
+ <string name="Upturned">
+ Yukarı dönük
+ </string>
+ <string name="Very Red">
+ Çok Kırmızı
+ </string>
+ <string name="Waist Height">
+ Bel Yüksekliği
+ </string>
+ <string name="Well-Fed">
+ Dolgun
+ </string>
+ <string name="White Hair">
+ Beyaz Saç
+ </string>
+ <string name="Wide">
+ GeniÅŸ
+ </string>
+ <string name="Wide Back">
+ GeniÅŸ Arka
+ </string>
+ <string name="Wide Front">
+ Geniş Ön
+ </string>
+ <string name="Wide Lips">
+ GeniÅŸ Dudaklar
+ </string>
+ <string name="Wild">
+ Çılgın
+ </string>
+ <string name="Wrinkles">
+ Kırışıklıklar
+ </string>
+ <string name="LocationCtrlAddLandmarkTooltip">
+ Yer İmlerime Ekle
+ </string>
+ <string name="LocationCtrlEditLandmarkTooltip">
+ Yer İmimi Düzenle
+ </string>
+ <string name="LocationCtrlInfoBtnTooltip">
+ Geçerli konum hakkında daha fazla bilgi gör
+ </string>
+ <string name="LocationCtrlComboBtnTooltip">
+ Konum geçmişim
+ </string>
+ <string name="LocationCtrlForSaleTooltip">
+ Bu araziyi satın al
+ </string>
+ <string name="LocationCtrlVoiceTooltip">
+ Ses burada kullanılamaz
+ </string>
+ <string name="LocationCtrlFlyTooltip">
+ Uçmaya izin verilmiyor
+ </string>
+ <string name="LocationCtrlPushTooltip">
+ İtme yok
+ </string>
+ <string name="LocationCtrlBuildTooltip">
+ Nesne inşa etmeye/düşürmeye izin verilmiyor
+ </string>
+ <string name="LocationCtrlScriptsTooltip">
+ Komut dosyalarına izin verilmiyor
+ </string>
+ <string name="LocationCtrlDamageTooltip">
+ Sağlık
+ </string>
+ <string name="LocationCtrlAdultIconTooltip">
+ Yetişkin Bölgesi
+ </string>
+ <string name="LocationCtrlModerateIconTooltip">
+ Orta Bölge
+ </string>
+ <string name="LocationCtrlGeneralIconTooltip">
+ Genel Bölge
+ </string>
+ <string name="LocationCtrlSeeAVsTooltip">
+ Bu parselin dışında avatarlar görünür durumda ve sohbete izin veriliyor
+ </string>
+ <string name="UpdaterWindowTitle">
+ [APP_NAME] Güncelleştirme
+ </string>
+ <string name="UpdaterNowUpdating">
+ [APP_NAME] güncelleştiriliyor...
+ </string>
+ <string name="UpdaterNowInstalling">
+ [APP_NAME] yükleniyor...
+ </string>
+ <string name="UpdaterUpdatingDescriptive">
+ [APP_NAME] Görüntüleyiciniz en son sürüme güncelleştiriliyor. Bu biraz zaman alabilir, bu nedenle sabırlı olun.
+ </string>
+ <string name="UpdaterProgressBarTextWithEllipses">
+ Güncelleştirme karşıdan yükleniyor...
+ </string>
+ <string name="UpdaterProgressBarText">
+ Güncelleştirme karşıdan yükleniyor
+ </string>
+ <string name="UpdaterFailDownloadTitle">
+ Güncelleştirmenin karşıdan yüklenmesi başarılamadı
+ </string>
+ <string name="UpdaterFailUpdateDescriptive">
+ [APP_NAME] güncellenirken bir hata oluştu. Lütfen www.secondlife.com adresinden son sürümü karşıdan yükleyin.
+ </string>
+ <string name="UpdaterFailInstallTitle">
+ Güncelleştirmenin yüklenmesi başarılamadı
+ </string>
+ <string name="UpdaterFailStartTitle">
+ Görüntüleyici başlatılamadı
+ </string>
+ <string name="ItemsComingInTooFastFrom">
+ [APP_NAME]: [FROM_NAME]&apos;den öğeler çok hızlı geliyor, [TIME] saniye boyunca otomatik ön izleme devre dışı bırakıldı
+ </string>
+ <string name="ItemsComingInTooFast">
+ [APP_NAME]: Öğeler çok hızlı geliyor, [TIME] saniye boyunca otomatik ön izleme devre dışı bırakıldı
+ </string>
+ <string name="IM_logging_string">
+ -- Anlık ileti günlük tutulması etkin --
+ </string>
+ <string name="IM_typing_start_string">
+ [NAME] yazıyor...
+ </string>
+ <string name="Unnamed">
+ (İsimsiz)
+ </string>
+ <string name="IM_moderated_chat_label">
+ (Yönetilen: Varsayılan durumda sesler kapalı)
+ </string>
+ <string name="IM_unavailable_text_label">
+ Bu aramada metin sohbeti kullanılamaz.
+ </string>
+ <string name="IM_muted_text_label">
+ Bir Grup Moderatörü tarafından metin sohbetiniz devre dışı bırakıldı.
+ </string>
+ <string name="IM_default_text_label">
+ Anlık ileti göndermek için buraya tıklayın.
+ </string>
+ <string name="IM_to_label">
+ Kime
+ </string>
+ <string name="IM_moderator_label">
+ (Moderatör)
+ </string>
+ <string name="Saved_message">
+ (Kaydedildi [LONG_TIMESTAMP])
+ </string>
+ <string name="answered_call">
+ Aramanız yanıtlandı
+ </string>
+ <string name="you_started_call">
+ Bir sesli arama başlattınız
+ </string>
+ <string name="you_joined_call">
+ Sesli aramaya katıldınız
+ </string>
+ <string name="name_started_call">
+ [NAME] bir sesli arama başlattı
+ </string>
+ <string name="ringing-im">
+ Sesli aramaya katılınılıyor...
+ </string>
+ <string name="connected-im">
+ Bağlandı, kapatmak için Aramadan Çık üzerine tıklayın
+ </string>
+ <string name="hang_up-im">
+ Sesli aramadan çıkıldı
+ </string>
+ <string name="answering-im">
+ Bağlanıyor...
+ </string>
+ <string name="conference-title">
+ Özel Konferans
+ </string>
+ <string name="conference-title-incoming">
+ [AGENT_NAME] ile konferans
+ </string>
+ <string name="inventory_item_offered-im">
+ Teklif edilen envanter öğesi:
+ </string>
+ <string name="share_alert">
+ Envanterinizden buraya öğeler sürükleyin
+ </string>
+ <string name="no_session_message">
+ (Aİ Oturumu Mevcut Değil)
+ </string>
+ <string name="only_user_message">
+ Bu oturumdaki tek kullanıcısınız.
+ </string>
+ <string name="offline_message">
+ [NAME] çevrim dışı.
+ </string>
+ <string name="invite_message">
+ Bu sesli sohbeti kabul etmek/bağlanmak için [BUTTON NAME] düğmesine tıklayın.
+ </string>
+ <string name="muted_message">
+ Bu Sakini engellediniz. Bir ileti gönderdiğinizde engelleme otomatik olarak kaldırılır.
+ </string>
+ <string name="generic">
+ Talep gönderilirken hata oluştu, lütfen daha sonra tekrar deneyin.
+ </string>
+ <string name="generic_request_error">
+ Talep gönderilirken hata oluştu, lütfen daha sonra tekrar deneyin.
+ </string>
+ <string name="insufficient_perms_error">
+ Yeterli izne sahip deÄŸilsiniz.
+ </string>
+ <string name="session_does_not_exist_error">
+ Bu oturum artık mevcut değil.
+ </string>
+ <string name="no_ability_error">
+ Bu yeteneÄŸe sahip deÄŸilsiniz.
+ </string>
+ <string name="no_ability">
+ Bu yeteneÄŸe sahip deÄŸilsiniz.
+ </string>
+ <string name="not_a_mod_error">
+ Bir oturum moderatörü değilsiniz.
+ </string>
+ <string name="muted">
+ Bir grup moderatörü metin sohbetinizi devre dışı bıraktı.
+ </string>
+ <string name="muted_error">
+ Bir grup moderatörü metin sohbetinizi devre dışı bıraktı.
+ </string>
+ <string name="add_session_event">
+ [RECIPIENT] ile sohbet oturumuna kullanıcı eklenemiyor.
+ </string>
+ <string name="message">
+ İletiniz [RECIPIENT] ile sohbet oturumuna gönderilemedi.
+ </string>
+ <string name="message_session_event">
+ İletiniz [RECIPIENT] ile sohbet oturumuna gönderilemedi.
+ </string>
+ <string name="mute">
+ Yönetme sırasında hata oluştu.
+ </string>
+ <string name="removed">
+ Gruptan çıkarıldınız.
+ </string>
+ <string name="removed_from_group">
+ Gruptan çıkarıldınız.
+ </string>
+ <string name="close_on_no_ability">
+ Sohbet oturumunda bulunma yeteneğine artık sahip değilsiniz.
+ </string>
+ <string name="unread_chat_single">
+ [SOURCES] yeni bir şey söyledi
+ </string>
+ <string name="unread_chat_multiple">
+ [SOURCES] yeni bir şey söyledi
+ </string>
+ <string name="session_initialization_timed_out_error">
+ Oturum başlatılması zaman aşımına uğradı.
+ </string>
+ <string name="Home position set.">
+ Ana konum ayarlandı.
+ </string>
+ <string name="voice_morphing_url">
+ http://secondlife.com/landing/voicemorphing
+ </string>
+ <string name="paid_you_ldollars">
+ [NAME] size [REASON] L$[AMOUNT] ödedi.
+ </string>
+ <string name="paid_you_ldollars_no_reason">
+ [NAME] size L$[AMOUNT] ödedi.
+ </string>
+ <string name="you_paid_ldollars">
+ [NAME]&apos;e [REASON] L$[AMOUNT] ödediniz.
+ </string>
+ <string name="you_paid_ldollars_no_info">
+ L$[AMOUNT] ödediniz.
+ </string>
+ <string name="you_paid_ldollars_no_reason">
+ [NAME]&apos;e L$[AMOUNT] ödediniz.
+ </string>
+ <string name="you_paid_ldollars_no_name">
+ [REASON] L$[AMOUNT] ödediniz.
+ </string>
+ <string name="you_paid_failure_ldollars">
+ [REASON] [NAME]&apos;e L$[AMOUNT] ödeyemediniz.
+ </string>
+ <string name="you_paid_failure_ldollars_no_info">
+ L$[AMOUNT] ödeyemediniz.
+ </string>
+ <string name="you_paid_failure_ldollars_no_reason">
+ [NAME]&apos;e L$[AMOUNT] ödeyemediniz.
+ </string>
+ <string name="you_paid_failure_ldollars_no_name">
+ [REASON] L$[AMOUNT] ödeyemediniz.
+ </string>
+ <string name="for item">
+ [ITEM] için.
+ </string>
+ <string name="for a parcel of land">
+ bir arazi parseli için.
+ </string>
+ <string name="for a land access pass">
+ bir arazi erişim hakkı için
+ </string>
+ <string name="for deeding land">
+ arazi devretmek için
+ </string>
+ <string name="to create a group">
+ bir grup oluşturmak için
+ </string>
+ <string name="to join a group">
+ bir grupa katılmak için
+ </string>
+ <string name="to upload">
+ karşıya yüklemek için
+ </string>
+ <string name="to publish a classified ad">
+ bir ilan yayınlamak için
+ </string>
+ <string name="giving">
+ L$ [AMOUNT] veriliyor
+ </string>
+ <string name="uploading_costs">
+ Karşıya yüklemenin maliyeti: L$ [AMOUNT]
+ </string>
+ <string name="this_costs">
+ Bunun maliyeti: L$ [AMOUNT]
+ </string>
+ <string name="buying_selected_land">
+ L$ [AMOUNT] karşılığında seçilen arazi satın alınıyor
+ </string>
+ <string name="this_object_costs">
+ Bu nesnenin maliyeti: L$ [AMOUNT]
+ </string>
+ <string name="group_role_everyone">
+ Herkes
+ </string>
+ <string name="group_role_officers">
+ Yetkililer
+ </string>
+ <string name="group_role_owners">
+ Sahipler
+ </string>
+ <string name="group_member_status_online">
+ Çevrimiçi
+ </string>
+ <string name="uploading_abuse_report">
+ Karşıya Yükleniyor...
+
+Kötüye Kullanımı Bildirme
+ </string>
+ <string name="New Shape">
+ Yeni Åžekil
+ </string>
+ <string name="New Skin">
+ Yeni Dış Katman
+ </string>
+ <string name="New Hair">
+ Yeni Saç
+ </string>
+ <string name="New Eyes">
+ Yeni Gözler
+ </string>
+ <string name="New Shirt">
+ Yeni Gömlek
+ </string>
+ <string name="New Pants">
+ Yeni Pantolon
+ </string>
+ <string name="New Shoes">
+ Yeni Ayakkabılar
+ </string>
+ <string name="New Socks">
+ Yeni Çoraplar
+ </string>
+ <string name="New Jacket">
+ Yeni Ceket
+ </string>
+ <string name="New Gloves">
+ Yeni Eldivenler
+ </string>
+ <string name="New Undershirt">
+ Yeni Fanila
+ </string>
+ <string name="New Underpants">
+ Yeni Külot
+ </string>
+ <string name="New Skirt">
+ Yeni Etek
+ </string>
+ <string name="New Alpha">
+ Yeni Alfa
+ </string>
+ <string name="New Tattoo">
+ Yeni Dövme
+ </string>
+ <string name="New Physics">
+ Yeni Fizik
+ </string>
+ <string name="Invalid Wearable">
+ Geçersiz Giyilebilir
+ </string>
+ <string name="New Gesture">
+ Yeni Mimik
+ </string>
+ <string name="New Script">
+ Yeni Komut Dosyası
+ </string>
+ <string name="New Note">
+ Yeni Not
+ </string>
+ <string name="New Folder">
+ Yeni Klasör
+ </string>
+ <string name="Contents">
+ İçerik
+ </string>
+ <string name="Gesture">
+ Mimik
+ </string>
+ <string name="Male Gestures">
+ Erkek Mimikleri
+ </string>
+ <string name="Female Gestures">
+ Kadın Mimikleri
+ </string>
+ <string name="Other Gestures">
+ DiÄŸer Mimikler
+ </string>
+ <string name="Speech Gestures">
+ KonuÅŸma Mimikleri
+ </string>
+ <string name="Common Gestures">
+ Favori Mimikler
+ </string>
+ <string name="Male - Excuse me">
+ Erkek - Afedersiniz
+ </string>
+ <string name="Male - Get lost">
+ Erkek - İşine bak
+ </string>
+ <string name="Male - Blow kiss">
+ Erkek - Öpücük gönderme
+ </string>
+ <string name="Male - Boo">
+ Erkek - Yuh çekme
+ </string>
+ <string name="Male - Bored">
+ Erkek - Canı sıkılmış
+ </string>
+ <string name="Male - Hey">
+ Erkek - Hey
+ </string>
+ <string name="Male - Laugh">
+ Erkek - Gülme
+ </string>
+ <string name="Male - Repulsed">
+ Erkek - TiksinmiÅŸ
+ </string>
+ <string name="Male - Shrug">
+ Erkek - Omuz Silkme
+ </string>
+ <string name="Male - Stick tougue out">
+ Erkek - Dil çıkarma
+ </string>
+ <string name="Male - Wow">
+ Erkek - Vay be
+ </string>
+ <string name="Female - Chuckle">
+ Kadın - Kıkırdama
+ </string>
+ <string name="Female - Cry">
+ Kadın - Ağlama
+ </string>
+ <string name="Female - Embarrassed">
+ Kadın - Utanmış
+ </string>
+ <string name="Female - Excuse me">
+ Kadın - Afedersiniz
+ </string>
+ <string name="Female - Get lost">
+ Kadın - İşine bak
+ </string>
+ <string name="Female - Blow kiss">
+ Kadın - Öpücük gönderme
+ </string>
+ <string name="Female - Boo">
+ Kadın - Yuh çekme
+ </string>
+ <string name="Female - Bored">
+ Kadın - Canı sıkılmış
+ </string>
+ <string name="Female - Hey">
+ Kadın - Hey
+ </string>
+ <string name="Female - Hey baby">
+ Kadın - Hey bebek
+ </string>
+ <string name="Female - Laugh">
+ Kadın - Gülme
+ </string>
+ <string name="Female - Looking good">
+ Kadın - Yakışıklı
+ </string>
+ <string name="Female - Over here">
+ Kadın - Buraya baksana
+ </string>
+ <string name="Female - Please">
+ Kadın - Lütfen
+ </string>
+ <string name="Female - Repulsed">
+ Kadın - Tiksinmiş
+ </string>
+ <string name="Female - Shrug">
+ Kadın - Omuz Silkme
+ </string>
+ <string name="Female - Stick tougue out">
+ Kadın - Dil çıkarma
+ </string>
+ <string name="Female - Wow">
+ Kadın - Vay be
+ </string>
+ <string name="/bow">
+ /selamlama
+ </string>
+ <string name="/clap">
+ /alkış
+ </string>
+ <string name="/count">
+ /sayım
+ </string>
+ <string name="/extinguish">
+ /söndürme
+ </string>
+ <string name="/kmb">
+ /hib
+ </string>
+ <string name="/muscle">
+ /kas
+ </string>
+ <string name="/no">
+ /hayır
+ </string>
+ <string name="/no!">
+ /hayır!
+ </string>
+ <string name="/paper">
+ /kağıt
+ </string>
+ <string name="/pointme">
+ /beni göster
+ </string>
+ <string name="/pointyou">
+ /seni göster
+ </string>
+ <string name="/rock">
+ /kaya
+ </string>
+ <string name="/scissor">
+ /makas
+ </string>
+ <string name="/smoke">
+ /duman
+ </string>
+ <string name="/stretch">
+ /uzatma
+ </string>
+ <string name="/whistle">
+ /ıslık
+ </string>
+ <string name="/yes">
+ /evet
+ </string>
+ <string name="/yes!">
+ /evet!
+ </string>
+ <string name="afk">
+ kbd
+ </string>
+ <string name="dance1">
+ dans1
+ </string>
+ <string name="dance2">
+ dans2
+ </string>
+ <string name="dance3">
+ dans3
+ </string>
+ <string name="dance4">
+ dans4
+ </string>
+ <string name="dance5">
+ dans5
+ </string>
+ <string name="dance6">
+ dans6
+ </string>
+ <string name="dance7">
+ dans7
+ </string>
+ <string name="dance8">
+ dans8
+ </string>
+ <string name="AvatarBirthDateFormat">
+ [mthnum,datetime,slt]/[day,datetime,slt]/[year,datetime,slt]
+ </string>
+ <string name="DefaultMimeType">
+ hiçbiri/hiçbiri
+ </string>
+ <string name="texture_load_dimensions_error">
+ [WIDTH]*[HEIGHT] çözünürlüğünden büyük görüntüler yüklenemez
+ </string>
+ <string name="words_separator" value=","/>
+ <string name="server_is_down">
+ Tüm çabalarımıza rağmen beklenmeyen bir hata meydana geldi.
+
+ Hizmetle ilişkili bilinen bir sorun olup olmadığını görmek için lütfen status.secondlifegrid.net adresine bakın.
+ Sorun yaşamaya devam ederseniz lütfen ağınızın ve güvenlik duvarınızın ayarlarına bakın.
+ </string>
+ <string name="dateTimeWeekdaysNames">
+ Pazar:Pazartesi:Salı:Çarşamba:Perşembe:Cuma:Cumartesi
+ </string>
+ <string name="dateTimeWeekdaysShortNames">
+ Paz:Pzt:Sal:Çar:Per:Cum:Cmt
+ </string>
+ <string name="dateTimeMonthNames">
+ Ocak:Şubat:Mart:Nisan:Mayıs:Haziran:Temmuz:Ağustos:Eylül:Ekim:Kasım:Aralık
+ </string>
+ <string name="dateTimeMonthShortNames">
+ Oca:Åžub:Mar:Nis:May:Haz:Tem:AÄŸu:Eyl:Eki:Kas:Ara
+ </string>
+ <string name="dateTimeDayFormat">
+ [MDAY]
+ </string>
+ <string name="dateTimeAM">
+ ÖÖ
+ </string>
+ <string name="dateTimePM">
+ ÖS
+ </string>
+ <string name="LocalEstimateUSD">
+ US$ [AMOUNT]
+ </string>
+ <string name="Membership">
+ Üyelik
+ </string>
+ <string name="Roles">
+ Roller
+ </string>
+ <string name="Group Identity">
+ Grup KimliÄŸi
+ </string>
+ <string name="Parcel Management">
+ Parsel Yönetimi
+ </string>
+ <string name="Parcel Identity">
+ Parsel KimliÄŸi
+ </string>
+ <string name="Parcel Settings">
+ Parsel Ayarları
+ </string>
+ <string name="Parcel Powers">
+ Parsel Güçleri
+ </string>
+ <string name="Parcel Access">
+ Parsel EriÅŸimi
+ </string>
+ <string name="Parcel Content">
+ Parsel İçeriği
+ </string>
+ <string name="Object Management">
+ Nesne Yönetimi
+ </string>
+ <string name="Accounting">
+ Muhasebe
+ </string>
+ <string name="Notices">
+ Bildirimler
+ </string>
+ <string name="Chat">
+ Sohbet
+ </string>
+ <string name="DeleteItems">
+ Seçili öğeler silinsin mi?
+ </string>
+ <string name="DeleteItem">
+ Seçili öğe silinsin mi?
+ </string>
+ <string name="EmptyOutfitText">
+ Bu dış görünümde herhangi bir öğe yok
+ </string>
+ <string name="ExternalEditorNotSet">
+ ExternalEditor ayarını kullanarak bir düzenleyici seçin.
+ </string>
+ <string name="ExternalEditorNotFound">
+ Belirttiğiniz harici düzenleyici bulunamadı.
+Düzenleyici yolunu çift tırnakla çevrelemeyi deneyin.
+(örn. &quot;/yolum/duzenleyici&quot; &quot;%s&quot;)
+ </string>
+ <string name="ExternalEditorCommandParseError">
+ Harici düzenleyici komutu ayrıştırılırken hata oluştu.
+ </string>
+ <string name="ExternalEditorFailedToRun">
+ Harici düzenleyici çalışmadı.
+ </string>
+ <string name="TranslationFailed">
+ Çeviri başarılamadı: [REASON]
+ </string>
+ <string name="TranslationResponseParseError">
+ Çeviri yanıtı ayrıştırılırken hata meydana geldi.
+ </string>
+ <string name="Esc">
+ Esc
+ </string>
+ <string name="Space">
+ BoÅŸluk
+ </string>
+ <string name="Enter">
+ Enter
+ </string>
+ <string name="Tab">
+ Sekme
+ </string>
+ <string name="Ins">
+ Ins
+ </string>
+ <string name="Del">
+ Del
+ </string>
+ <string name="Backsp">
+ Geri tuÅŸu
+ </string>
+ <string name="Shift">
+ Shift
+ </string>
+ <string name="Ctrl">
+ Ctrl
+ </string>
+ <string name="Alt">
+ Alt
+ </string>
+ <string name="CapsLock">
+ CapsLock
+ </string>
+ <string name="Left">
+ Sol
+ </string>
+ <string name="Right">
+ SaÄŸ
+ </string>
+ <string name="Up">
+ Yukarı
+ </string>
+ <string name="Down">
+ Aşağı
+ </string>
+ <string name="Home">
+ Home
+ </string>
+ <string name="End">
+ End
+ </string>
+ <string name="PgUp">
+ PgUp
+ </string>
+ <string name="PgDn">
+ PgDn
+ </string>
+ <string name="F1">
+ F1
+ </string>
+ <string name="F2">
+ F2
+ </string>
+ <string name="F3">
+ F3
+ </string>
+ <string name="F4">
+ F4
+ </string>
+ <string name="F5">
+ F5
+ </string>
+ <string name="F6">
+ F6
+ </string>
+ <string name="F7">
+ F7
+ </string>
+ <string name="F8">
+ F8
+ </string>
+ <string name="F9">
+ F9
+ </string>
+ <string name="F10">
+ F10
+ </string>
+ <string name="F11">
+ F11
+ </string>
+ <string name="F12">
+ F12
+ </string>
+ <string name="Add">
+ Ekle
+ </string>
+ <string name="Subtract">
+ Çıkar
+ </string>
+ <string name="Multiply">
+ Çarp
+ </string>
+ <string name="Divide">
+ Böl
+ </string>
+ <string name="PAD_DIVIDE">
+ PAD_DIVIDE
+ </string>
+ <string name="PAD_LEFT">
+ PAD_LEFT
+ </string>
+ <string name="PAD_RIGHT">
+ PAD_RIGHT
+ </string>
+ <string name="PAD_DOWN">
+ PAD_DOWN
+ </string>
+ <string name="PAD_UP">
+ PAD_UP
+ </string>
+ <string name="PAD_HOME">
+ PAD_HOME
+ </string>
+ <string name="PAD_END">
+ PAD_END
+ </string>
+ <string name="PAD_PGUP">
+ PAD_PGUP
+ </string>
+ <string name="PAD_PGDN">
+ PAD_PGDN
+ </string>
+ <string name="PAD_CENTER">
+ PAD_CENTER
+ </string>
+ <string name="PAD_INS">
+ PAD_INS
+ </string>
+ <string name="PAD_DEL">
+ PAD_DEL
+ </string>
+ <string name="PAD_Enter">
+ PAD_Enter
+ </string>
+ <string name="PAD_BUTTON0">
+ PAD_BUTTON0
+ </string>
+ <string name="PAD_BUTTON1">
+ PAD_BUTTON1
+ </string>
+ <string name="PAD_BUTTON2">
+ PAD_BUTTON2
+ </string>
+ <string name="PAD_BUTTON3">
+ PAD_BUTTON3
+ </string>
+ <string name="PAD_BUTTON4">
+ PAD_BUTTON4
+ </string>
+ <string name="PAD_BUTTON5">
+ PAD_BUTTON5
+ </string>
+ <string name="PAD_BUTTON6">
+ PAD_BUTTON6
+ </string>
+ <string name="PAD_BUTTON7">
+ PAD_BUTTON7
+ </string>
+ <string name="PAD_BUTTON8">
+ PAD_BUTTON8
+ </string>
+ <string name="PAD_BUTTON9">
+ PAD_BUTTON9
+ </string>
+ <string name="PAD_BUTTON10">
+ PAD_BUTTON10
+ </string>
+ <string name="PAD_BUTTON11">
+ PAD_BUTTON11
+ </string>
+ <string name="PAD_BUTTON12">
+ PAD_BUTTON12
+ </string>
+ <string name="PAD_BUTTON13">
+ PAD_BUTTON13
+ </string>
+ <string name="PAD_BUTTON14">
+ PAD_BUTTON14
+ </string>
+ <string name="PAD_BUTTON15">
+ PAD_BUTTON15
+ </string>
+ <string name="-">
+ -
+ </string>
+ <string name="=">
+ =
+ </string>
+ <string name="`">
+ `
+ </string>
+ <string name=";">
+ ;
+ </string>
+ <string name="[">
+ [
+ </string>
+ <string name="]">
+ ]
+ </string>
+ <string name="\">
+ \
+ </string>
+ <string name="0">
+ 0
+ </string>
+ <string name="1">
+ 1
+ </string>
+ <string name="2">
+ 2
+ </string>
+ <string name="3">
+ 3
+ </string>
+ <string name="4">
+ 4
+ </string>
+ <string name="5">
+ 5
+ </string>
+ <string name="6">
+ 6
+ </string>
+ <string name="7">
+ 7
+ </string>
+ <string name="8">
+ 8
+ </string>
+ <string name="9">
+ 9
+ </string>
+ <string name="A">
+ A
+ </string>
+ <string name="B">
+ B
+ </string>
+ <string name="C">
+ C
+ </string>
+ <string name="D">
+ D
+ </string>
+ <string name="E">
+ E
+ </string>
+ <string name="F">
+ F
+ </string>
+ <string name="G">
+ G
+ </string>
+ <string name="H">
+ H
+ </string>
+ <string name="I">
+ I
+ </string>
+ <string name="J">
+ J
+ </string>
+ <string name="K">
+ K
+ </string>
+ <string name="L">
+ L
+ </string>
+ <string name="M">
+ M
+ </string>
+ <string name="N">
+ N
+ </string>
+ <string name="O">
+ O
+ </string>
+ <string name="P">
+ P
+ </string>
+ <string name="Q">
+ Q
+ </string>
+ <string name="R">
+ R
+ </string>
+ <string name="S">
+ S
+ </string>
+ <string name="T">
+ T
+ </string>
+ <string name="U">
+ U
+ </string>
+ <string name="V">
+ V
+ </string>
+ <string name="W">
+ W
+ </string>
+ <string name="X">
+ X
+ </string>
+ <string name="Y">
+ Y
+ </string>
+ <string name="Z">
+ Z
+ </string>
+ <string name="BeaconParticle">
+ Parçacık işaretleri gösteriliyor (mavi)
+ </string>
+ <string name="BeaconPhysical">
+ Fiziksel nesne işaretleri gösteriliyor (yeşil)
+ </string>
+ <string name="BeaconScripted">
+ Komut dosyalı nesne işaretleri gösteriliyor (kırmızı)
+ </string>
+ <string name="BeaconScriptedTouch">
+ Dokunma işlevli komut dosyalı nesne işaretleri gösteriliyor (kırmızı)
+ </string>
+ <string name="BeaconSound">
+ Ses işaretleri gösteriliyor (sarı)
+ </string>
+ <string name="BeaconMedia">
+ Ortam işaretleri gösteriliyor (beyaz)
+ </string>
+ <string name="ParticleHiding">
+ Parçacıklar Gizleniyor
+ </string>
+ <string name="Command_AboutLand_Label">
+ Arazi hakkında
+ </string>
+ <string name="Command_Appearance_Label">
+ Görünüm
+ </string>
+ <string name="Command_Avatar_Label">
+ Avatar
+ </string>
+ <string name="Command_Build_Label">
+ İnşa Et
+ </string>
+ <string name="Command_Chat_Label">
+ Sohbet
+ </string>
+ <string name="Command_Compass_Label">
+ Pusula
+ </string>
+ <string name="Command_Destinations_Label">
+ Hedef Konum
+ </string>
+ <string name="Command_Gestures_Label">
+ Mimikler
+ </string>
+ <string name="Command_HowTo_Label">
+ Nasıl yapılır
+ </string>
+ <string name="Command_Inventory_Label">
+ Envanter
+ </string>
+ <string name="Command_Map_Label">
+ Harita
+ </string>
+ <string name="Command_Marketplace_Label">
+ Pazaryeri
+ </string>
+ <string name="Command_MiniMap_Label">
+ Mini-harita
+ </string>
+ <string name="Command_Move_Label">
+ Yürü / koş / uç
+ </string>
+ <string name="Command_People_Label">
+ KiÅŸiler
+ </string>
+ <string name="Command_Picks_Label">
+ Seçmeler
+ </string>
+ <string name="Command_Places_Label">
+ Yerler
+ </string>
+ <string name="Command_Preferences_Label">
+ Tercihler
+ </string>
+ <string name="Command_Profile_Label">
+ Profil
+ </string>
+ <string name="Command_Search_Label">
+ Ara
+ </string>
+ <string name="Command_Snapshot_Label">
+ Anlık görüntü
+ </string>
+ <string name="Command_Speak_Label">
+ KonuÅŸ
+ </string>
+ <string name="Command_View_Label">
+ Kamera denetimleri
+ </string>
+ <string name="Command_Voice_Label">
+ Ses ayarları
+ </string>
+ <string name="Command_AboutLand_Tooltip">
+ Ziyaret ettiÄŸiniz araziyle ilgili bilgi
+ </string>
+ <string name="Command_Appearance_Tooltip">
+ Avatarınızı değiştirin
+ </string>
+ <string name="Command_Avatar_Tooltip">
+ Eksiksiz bir avatar seçin
+ </string>
+ <string name="Command_Build_Tooltip">
+ Nesneler oluşturma ve yüzeyi şekillendirme
+ </string>
+ <string name="Command_Chat_Tooltip">
+ Metin kullanarak yakındaki kişilerle sohbet etmek
+ </string>
+ <string name="Command_Compass_Tooltip">
+ Pusula
+ </string>
+ <string name="Command_Destinations_Tooltip">
+ İlgilendiğiniz hedef konumlar
+ </string>
+ <string name="Command_Gestures_Tooltip">
+ Avatarınız için mimikler
+ </string>
+ <string name="Command_HowTo_Tooltip">
+ Genel görevleri nasıl yapacağınız
+ </string>
+ <string name="Command_Inventory_Tooltip">
+ Eşyalarınızı görüntüleyin ve kullanın
+ </string>
+ <string name="Command_Map_Tooltip">
+ Dünya haritası
+ </string>
+ <string name="Command_Marketplace_Tooltip">
+ Alışveriş yap
+ </string>
+ <string name="Command_MiniMap_Tooltip">
+ Yakındaki kişileri göster
+ </string>
+ <string name="Command_Move_Tooltip">
+ Avatarınızı hareket ettirmek
+ </string>
+ <string name="Command_People_Tooltip">
+ Arkadaşlar, gruplar ve yakındaki kişiler
+ </string>
+ <string name="Command_Picks_Tooltip">
+ Profilinizde favori olarak gösterilecek yerler
+ </string>
+ <string name="Command_Places_Tooltip">
+ KaydettiÄŸiniz yerler
+ </string>
+ <string name="Command_Preferences_Tooltip">
+ Tercihler
+ </string>
+ <string name="Command_Profile_Tooltip">
+ Profilinizi düzenleyin veya görüntüleyin
+ </string>
+ <string name="Command_Search_Tooltip">
+ Yerler, etkinlikler ve kiÅŸiler bulmak
+ </string>
+ <string name="Command_Snapshot_Tooltip">
+ Resim çekin
+ </string>
+ <string name="Command_Speak_Tooltip">
+ Mikrofonunuzu kullanarak yakındaki kişilerle konuşun
+ </string>
+ <string name="Command_View_Tooltip">
+ Kamera açısını değiştirmek
+ </string>
+ <string name="Command_Voice_Tooltip">
+ Aramalar ve SL dünyası içinde size yakın kişiler için ses denetimleri
+ </string>
+ <string name="Toolbar_Bottom_Tooltip">
+ şu anda alt araç çubuğunuzda
+ </string>
+ <string name="Toolbar_Left_Tooltip">
+ şu anda sol araç çubuğunuzda
+ </string>
+ <string name="Toolbar_Right_Tooltip">
+ şu anda sağ araç çubuğunuzda
+ </string>
+ <string name="Retain%">
+ Koru %
+ </string>
+ <string name="Detail">
+ Ayrıntı
+ </string>
+ <string name="Better Detail">
+ Daha İyi Ayrıntı
+ </string>
+ <string name="Surface">
+ Yüzey
+ </string>
+ <string name="Solid">
+ Katı
+ </string>
+ <string name="Wrap">
+ Sar
+ </string>
+ <string name="Preview">
+ Önizleme
+ </string>
+ <string name="Normal">
+ Normal
+ </string>
+ <string name="snapshot_quality_very_low">
+ Çok Düşük
+ </string>
+ <string name="snapshot_quality_low">
+ Düşük
+ </string>
+ <string name="snapshot_quality_medium">
+ Orta
+ </string>
+ <string name="snapshot_quality_high">
+ Yüksek
+ </string>
+ <string name="snapshot_quality_very_high">
+ Çok Yüksek
+ </string>
+</strings>
diff --git a/indra/newview/skins/default/xui/tr/teleport_strings.xml b/indra/newview/skins/default/xui/tr/teleport_strings.xml
new file mode 100644
index 0000000000..62aaaf671f
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/teleport_strings.xml
@@ -0,0 +1,84 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<teleport_messages>
+ <message_set name="errors">
+ <message name="invalid_tport">
+ Işınlama talebiniz işlenirken bir sorunla karşılaşıldı. Işınlanabilmek için yeniden oturum açmanız gerekebilir.
+Bu mesajı almaya devam ederseniz, lütfen [SUPPORT_SITE] bölümüne başvurun.
+ </message>
+ <message name="invalid_region_handoff">
+ Bölge değiştirme talebiniz işlenirken sorunla karşılaşıldı. Bölge geçebilmek için yeniden oturum açmanız gerekebilir.
+Bu mesajı almaya devam ederseniz, lütfen [SUPPORT_SITE] bölümüne başvurun.
+ </message>
+ <message name="blocked_tport">
+ Üzgünüz, ışınlama şu anda engellenmiş durumda. Bir dakika sonra tekrar deneyin.
+Hala ışınlanamıyorsanız, sorunu çözmek için lütfen çıkış yapıp oturumu tekrar açın.
+ </message>
+ <message name="nolandmark_tport">
+ Üzgünüz fakat sistem yer imi hedef konumunu bulamadı.
+ </message>
+ <message name="timeout_tport">
+ Üzgünüz fakat sistem ışınlama bağlantısını tamamlayamadı.
+Bir dakika sonra tekrar deneyin.
+ </message>
+ <message name="NoHelpIslandTP">
+ Karşılama Ada&apos;sına geri ışınlanamazsınız.
+Öğreticiyi tekrarlamak için &apos;Karşılama Ada&apos;sı Kamusal Alanı&apos;na gidin.
+ </message>
+ <message name="noaccess_tport">
+ Üzgünüz, bu ışınlanma hedef konumuna erişim hakkına sahip değilsiniz.
+ </message>
+ <message name="missing_attach_tport">
+ Aksesuarlarınız henüz ulaşmadı. Işınlanmayı tekrar denemeden önce bir kaç saniye bekleyin veya çıkış yapıp oturumu tekrar açın.
+ </message>
+ <message name="too_many_uploads_tport">
+ Bu bölgedeki varlık sırası şu anda yoğunluktan dolayı tıkalı olduğu için ışınlanma talebiniz zamanında gerçekleştirilemeyecek. Lütfen bir kaç dakika sonra tekrar deneyin veya yoğunluğu daha az olan bir bölge seçin.
+ </message>
+ <message name="expired_tport">
+ Üzgünüz fakat sistem ışınlanma talebinizi zamanında tamamlayamadı. Lütfen bir kaç dakika sonra tekrar deneyin.
+ </message>
+ <message name="expired_region_handoff">
+ Üzgünüz fakat sistem bölge değiştirme talebinizi zamanında tamamlayamadı. Lütfen bir kaç dakika sonra tekrar deneyin.
+ </message>
+ <message name="no_host">
+ Işınlanma hedef konumu bulunamıyor. Hedef konumu geçici bir süre için kullanılamıyor ya da artık mevcut değil. Lütfen bir kaç dakika sonra tekrar deneyin.
+ </message>
+ <message name="no_inventory_host">
+ Envanter sistemi şu anda kullanılamıyor.
+ </message>
+ </message_set>
+ <message_set name="progress">
+ <message name="sending_dest">
+ Hedef konuma gönderiliyor.
+ </message>
+ <message name="redirecting">
+ Farklı konuma tekrar yönlendiriliyor.
+ </message>
+ <message name="relaying">
+ Hedefe aktarılıyor.
+ </message>
+ <message name="sending_home">
+ Ana konum talebi gönderiliyor.
+ </message>
+ <message name="sending_landmark">
+ Yer imi konumu talebi gönderiliyor.
+ </message>
+ <message name="completing">
+ Işınlanma tamamlanıyor.
+ </message>
+ <message name="completed_from">
+ [T_SLURL] konumundan ışınlanma tamamlandı.
+ </message>
+ <message name="resolving">
+ Hedef konum çözümleniyor.
+ </message>
+ <message name="contacting">
+ Yeni bölgeye bağlanılıyor.
+ </message>
+ <message name="arriving">
+ Konuma varılıyor...
+ </message>
+ <message name="requesting">
+ Işınlanma talep ediliyor...
+ </message>
+ </message_set>
+</teleport_messages>
diff --git a/indra/newview/skins/default/xui/zh/floater_about.xml b/indra/newview/skins/default/xui/zh/floater_about.xml
index 0ac85d399e..7e19c124a1 100644
--- a/indra/newview/skins/default/xui/zh/floater_about.xml
+++ b/indra/newview/skins/default/xui/zh/floater_about.xml
@@ -10,7 +10,7 @@
<floater.string name="AboutPosition">
You are at [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1] in [REGION] located at &lt;nolink&gt;[HOSTNAME]&lt;/nolink&gt; ([HOSTIP])
[SERVER_VERSION]
-[[SERVER_RELEASE_NOTES_URL] [ReleaseNotes]]
+[SERVER_RELEASE_NOTES_URL]
</floater.string>
<floater.string name="AboutSystem">
CPU:[CPU]
diff --git a/indra/newview/skins/default/xui/zh/floater_about_land.xml b/indra/newview/skins/default/xui/zh/floater_about_land.xml
index e59a23fda0..2568d492f0 100644
--- a/indra/newview/skins/default/xui/zh/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/zh/floater_about_land.xml
@@ -90,19 +90,19 @@
群組:
</text>
<button label="設定" name="Set..."/>
- <check_box label="Allow Deed to Group" name="check deed" tool_tip="A group officer can deed this land to the group, so it will be supported by the group&apos;s land allocation."/>
- <button label="Deed" name="Deed..." tool_tip="You may only deed land if you are an officer in the selected group."/>
+ <check_box label="å…許讓渡給群組" name="check deed" tool_tip="A group officer can deed this land to the group, so it will be supported by the group&apos;s land allocation."/>
+ <button label="讓渡" name="Deed..." tool_tip="You may only deed land if you are an officer in the selected group."/>
<check_box label="Owner Makes Contribution With Deed" name="check contrib" tool_tip="When the land is deeded to the group, the former owner contributes enough land allocation to support it."/>
<text name="For Sale:">
出售:
</text>
<text name="Not for sale.">
- Not for sale
+ ä¸å‡ºå”®
</text>
<text name="For Sale: Price L$[PRICE].">
Price: L$[PRICE] (L$[PRICE_PER_SQM]/m²)
</text>
- <button label="Sell Land" name="Sell Land..."/>
+ <button label="出售土地" name="Sell Land..."/>
<text name="For sale to">
出售給:[BUYER]
</text>
@@ -134,7 +134,7 @@
<button label="購買土地" name="Buy Land..."/>
<button label="腳本資訊" name="Scripts..."/>
<button label="為群組購買" name="Buy For Group..."/>
- <button label="購買通行權" name="Buy Pass..." tool_tip="A pass gives you temporary access to this land."/>
+ <button label="購買通行權" name="Buy Pass..." tool_tip="通行權å…許你暫時å¯å‡ºå…¥é€™å¡ŠåœŸåœ°ã€‚"/>
<button label="放棄土地" name="Abandon Land..."/>
<button label="Reclaim Land" name="Reclaim Land..."/>
<button label="Linden Sale" name="Linden Sale..." tool_tip="Land must be owned, set content, and not already for auction."/>
@@ -212,31 +212,31 @@
Region Object Bonus Factor: [BONUS]
</text>
<text name="Simulator primitive usage:">
- Primitive usage:
+ 幾何元件使用:
</text>
<text name="objects_available">
- [COUNT] out of [MAX] ([AVAILABLE] available)
+ 使用 [MAX] 中的 [COUNT] (剩餘 [AVAILABLE] å¯ç”¨ï¼‰
</text>
<text name="Primitives parcel supports:">
- Prims parcel supports:
+ 地段所æä¾›çš„幾何元件數:
</text>
<text name="object_contrib_text">
[COUNT]
</text>
<text name="Primitives on parcel:">
- Prims on parcel:
+ 地段上的幾何元件數:
</text>
<text name="total_objects_text">
[COUNT]
</text>
<text name="Owned by parcel owner:">
- Owned by parcel owner:
+ åœ°æ®µæ“æœ‰è€…æ‰€æ“æœ‰ï¼š
</text>
<text name="owner_objects_text">
[COUNT]
</text>
<button label="顯示" label_selected="顯示" name="ShowOwner"/>
- <button label="退回" name="ReturnOwner..." tool_tip="Return objects to their owners."/>
+ <button label="退回" name="ReturnOwner..." tool_tip="é€€å›žç‰©ä»¶çµ¦å®ƒå€‘çš„æ“æœ‰è€…。"/>
<text name="Set to group:">
設定群組:
</text>
@@ -244,15 +244,15 @@
[COUNT]
</text>
<button label="顯示" label_selected="顯示" name="ShowGroup"/>
- <button label="退回" name="ReturnGroup..." tool_tip="Return objects to their owners."/>
+ <button label="退回" name="ReturnGroup..." tool_tip="é€€å›žç‰©ä»¶çµ¦å®ƒå€‘çš„æ“æœ‰è€…。"/>
<text name="Owned by others:">
- Owned by others:
+ å…¶ä»–äººæ‰€æ“æœ‰ï¼š
</text>
<text name="other_objects_text">
[COUNT]
</text>
<button label="顯示" label_selected="顯示" name="ShowOther"/>
- <button label="退回" name="ReturnOther..." tool_tip="Return objects to their owners."/>
+ <button label="退回" name="ReturnOther..." tool_tip="é€€å›žç‰©ä»¶çµ¦å®ƒå€‘çš„æ“æœ‰è€…。"/>
<text name="Selected / sat upon:">
Selected / sat upon:
</text>
@@ -263,9 +263,9 @@
Auto return other Residents&apos; objects (minutes, 0 for off):
</text>
<text name="Object Owners:">
- Object Owners:
+ ç‰©ä»¶æ“æœ‰è€…:
</text>
- <button name="Refresh List" tool_tip="Refresh Object List"/>
+ <button name="Refresh List" tool_tip="刷新物件清單"/>
<button label="退回物件" name="Return objects..."/>
<name_list name="owner list">
<name_list.columns label="Type" name="type"/>
@@ -276,14 +276,14 @@
</panel>
<panel label="é¸é …" name="land_options_panel">
<panel.string name="search_enabled_tooltip">
- Let people see this parcel in search results
+ 讓其他人å¯ä»¥åœ¨æœå°‹çµæžœä¸­çœ‹åˆ°é€™å¡Šåœ°æ®µ
</panel.string>
<panel.string name="search_disabled_small_tooltip">
This option is disabled because this parcel&apos;s area is 128 m² or smaller.
Only large parcels can be listed in search.
</panel.string>
<panel.string name="search_disabled_permissions_tooltip">
- This option is disabled because you cannot modify this parcel&apos;s options.
+ 這個é¸é …已關閉因為你ä¸èƒ½ä¿®æ”¹é€™å€‹åœ°æ®µçš„é¸é …。
</panel.string>
<panel.string name="mature_check_mature">
é©åº¦æˆäººå…§å®¹
@@ -331,35 +331,35 @@ Only large parcels can be listed in search.
</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="Let people see this parcel in search results"/>
+ <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 Location" name="item1"/>
<combo_box.item label="完全æˆäºº" name="item2"/>
- <combo_box.item label="Arts &amp; Culture" name="item3"/>
- <combo_box.item label="Business" name="item4"/>
- <combo_box.item label="Educational" name="item5"/>
- <combo_box.item label="Gaming" name="item6"/>
+ <combo_box.item label="è—術與文化" name="item3"/>
+ <combo_box.item label="商業" name="item4"/>
+ <combo_box.item label="教育" name="item5"/>
+ <combo_box.item label="éŠæˆ²" name="item6"/>
<combo_box.item label="èšæœƒæ‰€" name="item7"/>
- <combo_box.item label="Newcomer Friendly" name="item8"/>
- <combo_box.item label="Parks &amp; Nature" name="item9"/>
- <combo_box.item label="Residential" name="item10"/>
- <combo_box.item label="Shopping" name="item11"/>
+ <combo_box.item label="新手å‹å–„" name="item8"/>
+ <combo_box.item label="公園與自然" name="item9"/>
+ <combo_box.item label="ä½å®…" name="item10"/>
+ <combo_box.item label="採購" name="item11"/>
<combo_box.item label="Rental" name="item13"/>
<combo_box.item label="Other" name="item12"/>
</combo_box>
<combo_box name="land category">
<combo_box.item label="任何類別" name="item0"/>
<combo_box.item label="Linden Location" name="item1"/>
- <combo_box.item label="Arts &amp; Culture" name="item3"/>
- <combo_box.item label="Business" name="item4"/>
- <combo_box.item label="Educational" name="item5"/>
- <combo_box.item label="Gaming" name="item6"/>
+ <combo_box.item label="è—術與文化" name="item3"/>
+ <combo_box.item label="商業" name="item4"/>
+ <combo_box.item label="教育" name="item5"/>
+ <combo_box.item label="éŠæˆ²" name="item6"/>
<combo_box.item label="èšæœƒæ‰€" name="item7"/>
- <combo_box.item label="Newcomer Friendly" name="item8"/>
- <combo_box.item label="Parks &amp; Nature" name="item9"/>
- <combo_box.item label="Residential" name="item10"/>
- <combo_box.item label="Shopping" name="item11"/>
+ <combo_box.item label="新手å‹å–„" name="item8"/>
+ <combo_box.item label="公園與自然" name="item9"/>
+ <combo_box.item label="ä½å®…" name="item10"/>
+ <combo_box.item label="採購" name="item11"/>
<combo_box.item label="Rental" name="item13"/>
<combo_box.item label="Other" name="item12"/>
</combo_box>
@@ -367,7 +367,7 @@ Only large parcels can be listed in search.
<text name="Snapshot:">
快照:
</text>
- <texture_picker name="snapshot_ctrl" tool_tip="點擊以挑é¸åœ–片"/>
+ <texture_picker name="snapshot_ctrl" tool_tip="點擊以挑é¸åœ–åƒ"/>
<text name="landing_point">
登陸點:[LANDING]
</text>
@@ -398,7 +398,7 @@ Only large parcels can be listed in search.
<text name="Media texture:">
å–代æè³ªï¼š
</text>
- <texture_picker name="media texture" tool_tip="點擊以挑é¸åœ–片"/>
+ <texture_picker name="media texture" tool_tip="點擊以挑é¸åœ–åƒ"/>
<text name="replace_texture_help">
Objects using this texture will show the movie or web page after you click the play arrow. Select the thumbnail to choose a different texture.
</text>
@@ -412,7 +412,7 @@ Only large parcels can be listed in search.
åƒç´ 
</text>
<text name="Options:">
- Options:
+ é¸é …:
</text>
<check_box label="Loop" name="media_loop" tool_tip="Play media in a loop. When the media has finished playing, it will restart from the beginning."/>
</panel>
@@ -442,14 +442,14 @@ Only large parcels can be listed in search.
One or more of these options is set at the estate level
</panel.string>
<text name="Limit access to this parcel to:">
- Access To This Parcel
+ 出入此地段
</text>
<text name="Only Allow">
Restrict Access to Residents verified by:
</text>
<check_box label="Payment Information on File [ESTATE_PAYMENT_LIMIT]" name="limit_payment" tool_tip="Ban unidentified Residents."/>
<check_box label="年齡驗證 [ESTATE_AGE_LIMIT]" name="limit_age_verified" tool_tip="Ban Residents who have not verified their age. See the [SUPPORT_SITE] for more information."/>
- <check_box label="å…許出入的群組:[GROUP]" name="GroupCheck" tool_tip="Set group in the General tab."/>
+ <check_box label="å…許出入的群組:[GROUP]" name="GroupCheck" tool_tip="設定群組於一般é ç±¤ã€‚"/>
<check_box label="出售通行權給:" name="PassCheck" tool_tip="å…許暫時出入這個地段"/>
<combo_box name="pass_combo">
<combo_box.item label="Anyone" name="Anyone"/>
diff --git a/indra/newview/skins/default/xui/zh/floater_animation_preview.xml b/indra/newview/skins/default/xui/zh/floater_animation_preview.xml
index baf68ffce6..c5e2eac446 100644
--- a/indra/newview/skins/default/xui/zh/floater_animation_preview.xml
+++ b/indra/newview/skins/default/xui/zh/floater_animation_preview.xml
@@ -173,8 +173,8 @@ Maximum animation length is [MAX_LENGTH] seconds.
</combo_box>
<spinner label="淡入(秒)" name="ease_in_time" tool_tip="Amount of time (in seconds) over which animations blends in"/>
<spinner label="淡出(秒)" name="ease_out_time" tool_tip="Amount of time (in seconds) over which animations blends out"/>
- <button name="play_btn" tool_tip="Play your animation"/>
- <button name="pause_btn" tool_tip="Pause your animation"/>
+ <button name="play_btn" tool_tip="播放你的動作"/>
+ <button name="pause_btn" tool_tip="æš«åœä½ çš„å‹•åš"/>
<button name="stop_btn" tool_tip="Stop animation playback"/>
<text name="bad_animation_text">
Unable to read animation file.
diff --git a/indra/newview/skins/default/xui/zh/floater_build_options.xml b/indra/newview/skins/default/xui/zh/floater_build_options.xml
index 95211b746c..b9d3b6b849 100644
--- a/indra/newview/skins/default/xui/zh/floater_build_options.xml
+++ b/indra/newview/skins/default/xui/zh/floater_build_options.xml
@@ -4,7 +4,7 @@
<spinner label="Grid Extents (meters)" name="GridDrawSize"/>
<check_box label="貼齊至å­å–®ä½" name="GridSubUnit"/>
<check_box label="View cross-sections" name="GridCrossSection"/>
- <text name="grid_opacity_label" tool_tip="Grid opacity">
- Opacity:
+ <text name="grid_opacity_label" tool_tip="格線ä¸é€æ˜Žåº¦">
+ ä¸é€æ˜Žåº¦ï¼š
</text>
</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_bumps.xml b/indra/newview/skins/default/xui/zh/floater_bumps.xml
index 64c11af953..2d76a9f831 100644
--- a/indra/newview/skins/default/xui/zh/floater_bumps.xml
+++ b/indra/newview/skins/default/xui/zh/floater_bumps.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_bumps" title="BUMPS, PUSHES &amp; HITS">
+<floater name="floater_bumps" title="ç¢°æ’žã€æŽ¨æ“ èˆ‡æ‰“æ“Š">
<floater.string name="none_detected">
æœªåµæ¸¬åˆ°
</floater.string>
diff --git a/indra/newview/skins/default/xui/zh/floater_buy_currency.xml b/indra/newview/skins/default/xui/zh/floater_buy_currency.xml
index f187a1ab40..9f6591faf9 100644
--- a/indra/newview/skins/default/xui/zh/floater_buy_currency.xml
+++ b/indra/newview/skins/default/xui/zh/floater_buy_currency.xml
@@ -46,7 +46,7 @@
L$ [AMT]
</text>
<text name="currency_links">
- [http://www.secondlife.com/my/account/payment_method_management.php payment method] | [http://www.secondlife.com/my/account/currency.php currency] | [http://www.secondlife.com/my/account/exchange_rates.php exchange rate]
+ [http://www.secondlife.com/my/account/payment_method_management.php payment method] | [http://www.secondlife.com/my/account/currency.php currency]
</text>
<text name="exchange_rate_note">
Re-enter amount to see the latest exchange rate.
@@ -55,7 +55,7 @@
Confirming this purchase only buys L$, not the object.
</text>
<text name="purchase_warning_notenough">
- You aren&apos;t buying enough L$. Please increase the amount.
+ 你並未購買足夠的林登幣,請先添加一些數é‡ã€‚
</text>
<button label="ç«‹å³è³¼è²·" name="buy_btn"/>
<button label="å–æ¶ˆ" name="cancel_btn"/>
diff --git a/indra/newview/skins/default/xui/zh/floater_buy_land.xml b/indra/newview/skins/default/xui/zh/floater_buy_land.xml
index c4a5d174ef..336d14747d 100644
--- a/indra/newview/skins/default/xui/zh/floater_buy_land.xml
+++ b/indra/newview/skins/default/xui/zh/floater_buy_land.xml
@@ -26,10 +26,10 @@ Try selecting a smaller area.
You do not have permission to buy land for your active group.
</floater.string>
<floater.string name="parcel_not_for_sale">
- The selected parcel is not for sale.
+ æ‰€é¸æ“‡çš„地段ä¸å‡ºå”®ã€‚.
</floater.string>
<floater.string name="group_already_owns">
- The group already owns the parcel.
+ é€™å€‹ç¾¤çµ„å·²æ“æœ‰é€™å€‹åœ°æ®µã€‚
</floater.string>
<floater.string name="you_already_own">
ä½ å·²ç¶“æ“æœ‰é€™å€‹åœ°æ®µã€‚
@@ -62,7 +62,7 @@ Try selecting a smaller area.
Cannot buy now:
</floater.string>
<floater.string name="not_for_sale">
- Not for sale:
+ ä¸å‡ºå”®ï¼š
</floater.string>
<floater.string name="none_needed">
none needed
diff --git a/indra/newview/skins/default/xui/zh/floater_camera.xml b/indra/newview/skins/default/xui/zh/floater_camera.xml
index f4db20684c..b75474340c 100644
--- a/indra/newview/skins/default/xui/zh/floater_camera.xml
+++ b/indra/newview/skins/default/xui/zh/floater_camera.xml
@@ -9,15 +9,6 @@
<floater.string name="move_tooltip">
Move Camera Up and Down, Left and Right
</floater.string>
- <floater.string name="camera_modes_title">
- æ”影機模å¼
- </floater.string>
- <floater.string name="pan_mode_title">
- 環繞縮放平移
- </floater.string>
- <floater.string name="presets_mode_title">
- é è¨­è¦–è§’
- </floater.string>
<floater.string name="free_mode_title">
視角物件
</floater.string>
diff --git a/indra/newview/skins/default/xui/zh/floater_critical.xml b/indra/newview/skins/default/xui/zh/floater_critical.xml
index da357bde56..7d08fe8af2 100644
--- a/indra/newview/skins/default/xui/zh/floater_critical.xml
+++ b/indra/newview/skins/default/xui/zh/floater_critical.xml
@@ -2,7 +2,7 @@
<floater name="modal container">
<button label="繼續" label_selected="繼續" name="Continue"/>
<text name="tos_heading">
- Please read the following message carefully.
+ 請仔細閱讀下列的訊æ¯ã€‚
</text>
<text_editor name="tos_text">
TOS_TEXT
diff --git a/indra/newview/skins/default/xui/zh/floater_day_cycle_options.xml b/indra/newview/skins/default/xui/zh/floater_day_cycle_options.xml
deleted file mode 100644
index 28d2ba6ed4..0000000000
--- a/indra/newview/skins/default/xui/zh/floater_day_cycle_options.xml
+++ /dev/null
@@ -1,95 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Day Cycle Floater" title="日循環編輯器">
- <tab_container name="Day Cycle Tabs">
- <panel label="日循環" name="Day Cycle">
- <multi_slider initial_value="0" name="WLTimeSlider"/>
- <multi_slider initial_value="0" name="WLDayCycleKeys"/>
- <text name="WL12am">
- 12am
- </text>
- <text name="WL3am">
- 3am
- </text>
- <text name="WL6am">
- 6am
- </text>
- <text name="WL9amHash">
- 9am
- </text>
- <text name="WL12pmHash">
- 12pm
- </text>
- <text name="WL3pm">
- 3pm
- </text>
- <text name="WL6pm">
- 6pm
- </text>
- <text name="WL9pm">
- 9pm
- </text>
- <text name="WL12am2">
- 12am
- </text>
- <text name="WL12amHash">
- |
- </text>
- <text name="WL3amHash">
- I
- </text>
- <text name="WL6amHash">
- |
- </text>
- <text name="WL9amHash2">
- I
- </text>
- <text name="WL12pmHash2">
- |
- </text>
- <text name="WL3pmHash">
- I
- </text>
- <text name="WL6pmHash">
- |
- </text>
- <text name="WL9pmHash">
- I
- </text>
- <text name="WL12amHash2">
- |
- </text>
- <button label="Add Key" label_selected="Add Key" name="WLAddKey"/>
- <button label="Delete Key" label_selected="Delete Key" name="WLDeleteKey"/>
- <text name="WLCurKeyFrameText">
- Key Frame Settings:
- </text>
- <text name="WLCurKeyTimeText">
- Key Time:
- </text>
- <spinner label="Hour" name="WLCurKeyHour"/>
- <spinner label="Min" name="WLCurKeyMin"/>
- <text name="WLCurKeyTimeText2">
- Key Preset:
- </text>
- <combo_box label="Preset" name="WLKeyPresets"/>
- <text name="DayCycleText">
- Snap:
- </text>
- <combo_box label="五分é˜" name="WLSnapOptions"/>
- <text name="DayCycleText2">
- Length of Cycle:
- </text>
- <spinner label="å°æ™‚" name="WLLengthOfDayHour"/>
- <spinner label="分" name="WLLengthOfDayMin"/>
- <spinner label="ç§’" name="WLLengthOfDaySec"/>
- <text name="DayCycleText3">
- é è¦½ï¼š
- </text>
- <button label="Play" label_selected="Play" name="WLAnimSky"/>
- <button label="åœæ­¢!" label_selected="åœæ­¢" name="WLStopAnimSky"/>
- <button label="Use Estate Time" label_selected="Go to Estate Time" name="WLUseLindenTime"/>
- <button label="Save Test Day" label_selected="Save Test Day" name="WLSaveDayCycle"/>
- <button label="Load Test Day" label_selected="Load Test Day" name="WLLoadDayCycle"/>
- </panel>
- </tab_container>
-</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_display_name.xml b/indra/newview/skins/default/xui/zh/floater_display_name.xml
index 39abfe0b8b..01b5088794 100644
--- a/indra/newview/skins/default/xui/zh/floater_display_name.xml
+++ b/indra/newview/skins/default/xui/zh/floater_display_name.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Display Name" title="CHANGE DISPLAY NAME">
+<floater name="Display Name" title="變更顯示å稱">
<text name="info_text">
The name you give your avatar is called your Display Name. You can change it once a week.
</text>
@@ -7,12 +7,12 @@
You cannot change your Display Name until: [TIME].
</text>
<text name="set_name_label">
- New Display Name:
+ 新顯示å稱:
</text>
<text name="name_confirm_label">
Type your new name again to confirm:
</text>
- <button label="儲存" name="save_btn" tool_tip="Save your new Display Name"/>
+ <button label="儲存" name="save_btn" tool_tip="儲存你的新顯示å稱"/>
<button label="é‡è¨­" name="reset_btn" tool_tip="Make Display Name the same as Username"/>
<button label="å–æ¶ˆ" name="cancel_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_image_preview.xml b/indra/newview/skins/default/xui/zh/floater_image_preview.xml
index d7e9a7704c..1260601f90 100644
--- a/indra/newview/skins/default/xui/zh/floater_image_preview.xml
+++ b/indra/newview/skins/default/xui/zh/floater_image_preview.xml
@@ -12,14 +12,14 @@
<combo_box label="æœè£é¡žåž‹" name="clothing_type_combo">
<item label="圖åƒ" name="Image" value="圖åƒ"/>
<item label="é ­é«®" name="Hair" value="é ­é«®"/>
- <item label="Female Head" name="FemaleHead" value="Female Head"/>
- <item label="Female Upper Body" name="FemaleUpperBody" value="Female Upper Body"/>
- <item label="Female Lower Body" name="FemaleLowerBody" value="Female Lower Body"/>
- <item label="Male Head" name="MaleHead" value="Male Head"/>
- <item label="Male Upper Body" name="MaleUpperBody" value="Male Upper Body"/>
- <item label="Male Lower Body" name="MaleLowerBody" value="Male Lower Body"/>
+ <item label="女性頭部" name="FemaleHead" value="女性頭部"/>
+ <item label="女性上åŠèº«" name="FemaleUpperBody" value="女性上åŠèº«"/>
+ <item label="女性下åŠèº«" name="FemaleLowerBody" value="女性下åŠèº«"/>
+ <item label="男性頭部" name="MaleHead" value="男性頭部"/>
+ <item label="男性上åŠèº«" name="MaleUpperBody" value="男性上åŠèº«"/>
+ <item label="男性下åŠèº«" name="MaleLowerBody" value="男性下åŠèº«"/>
<item label="裙å­" name="Skirt" value="裙å­"/>
- <item label="Sculpted Prim" name="SculptedPrim" value="Sculpted Prim"/>
+ <item label="雕刻的幾何元件" name="SculptedPrim" value="雕刻的幾何元件"/>
</combo_box>
<text name="bad_image_text">
無法讀å–圖åƒã€‚
diff --git a/indra/newview/skins/default/xui/zh/floater_incoming_call.xml b/indra/newview/skins/default/xui/zh/floater_incoming_call.xml
index 123cdd9f2c..a0f31fa11f 100644
--- a/indra/newview/skins/default/xui/zh/floater_incoming_call.xml
+++ b/indra/newview/skins/default/xui/zh/floater_incoming_call.xml
@@ -13,10 +13,10 @@
通話中。
</floater.string>
<floater.string name="VoiceInviteAdHoc">
- has joined a Voice Chat call with a conference chat.
+ 已加訴入會議交談中的語音èŠå¤©ã€‚
</floater.string>
<floater.string name="VoiceInviteGroup">
- just joined &apos;[GROUP]&apos; voice channel.
+ 剛加入 &apos;[GROUP]&apos; 語音頻é“。
</floater.string>
<floater.string name="VoiceInviteQuestionGroup">
Would you like to leave [CURRENT_CHAT] and join the call with &apos;[GROUP]&apos;?
diff --git a/indra/newview/skins/default/xui/zh/floater_inspect.xml b/indra/newview/skins/default/xui/zh/floater_inspect.xml
index 295538f797..ea3d9d0c3e 100644
--- a/indra/newview/skins/default/xui/zh/floater_inspect.xml
+++ b/indra/newview/skins/default/xui/zh/floater_inspect.xml
@@ -5,9 +5,9 @@
</floater.string>
<scroll_list name="object_list" tool_tip="Select an object from this list to highlight it in-world">
<scroll_list.columns label="物件å稱" name="object_name"/>
- <scroll_list.columns label="Owner Name" name="owner_name"/>
- <scroll_list.columns label="Creator Name" name="creator_name"/>
- <scroll_list.columns label="Creation Date" name="creation_date"/>
+ <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="See profile of the highlighted object&apos;s owner"/>
<button label="察看創造者檔案..." name="button creator" tool_tip="See profile of the highlighted object&apos;s original creator"/>
diff --git a/indra/newview/skins/default/xui/zh/floater_inventory_view_finder.xml b/indra/newview/skins/default/xui/zh/floater_inventory_view_finder.xml
index 370ab32b9f..d698edf5e5 100644
--- a/indra/newview/skins/default/xui/zh/floater_inventory_view_finder.xml
+++ b/indra/newview/skins/default/xui/zh/floater_inventory_view_finder.xml
@@ -5,7 +5,7 @@
<check_box label="æœè£" name="check_clothing"/>
<check_box label="å§¿å‹¢" name="check_gesture"/>
<check_box label="地標" name="check_landmark"/>
- <check_box label="Notecards" name="check_notecard"/>
+ <check_box label="記事å¡" name="check_notecard"/>
<check_box label="Objects" name="check_object"/>
<check_box label="腳本" name="check_script"/>
<check_box label="Sounds" name="check_sound"/>
diff --git a/indra/newview/skins/default/xui/zh/floater_nearby_chat.xml b/indra/newview/skins/default/xui/zh/floater_nearby_chat.xml
index f0c34acb06..38a5dab523 100644
--- a/indra/newview/skins/default/xui/zh/floater_nearby_chat.xml
+++ b/indra/newview/skins/default/xui/zh/floater_nearby_chat.xml
@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="nearby_chat" title="附近的èŠå¤©">
- <check_box label="Translate chat (powered by Google)" name="translate_chat_checkbox"/>
+ <check_box label="Translate chat" name="translate_chat_checkbox"/>
</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_outgoing_call.xml b/indra/newview/skins/default/xui/zh/floater_outgoing_call.xml
index 8b15668e3b..63da47f4de 100644
--- a/indra/newview/skins/default/xui/zh/floater_outgoing_call.xml
+++ b/indra/newview/skins/default/xui/zh/floater_outgoing_call.xml
@@ -4,10 +4,10 @@
5
</floater.string>
<floater.string name="localchat">
- Nearby Voice Chat
+ 附近的語音èŠå¤©
</floater.string>
<floater.string name="anonymous">
- anonymous
+ 匿å
</floater.string>
<floater.string name="VoiceInviteP2P">
通話中。
@@ -22,7 +22,7 @@
Calling [CALLEE_NAME]
</text>
<text name="noanswer">
- No Answer. Please try again later.
+ 無應答,請ç¨å€™å†è©¦ã€‚
</text>
<text name="nearby">
You have been disconnected from [VOICE_CHANNEL_NAME]. [RECONNECT_NEARBY]
diff --git a/indra/newview/skins/default/xui/zh/floater_preview_animation.xml b/indra/newview/skins/default/xui/zh/floater_preview_animation.xml
index ead8dc49a6..c435ddc0bd 100644
--- a/indra/newview/skins/default/xui/zh/floater_preview_animation.xml
+++ b/indra/newview/skins/default/xui/zh/floater_preview_animation.xml
@@ -6,6 +6,6 @@
<text name="desc txt">
æè¿°ï¼š
</text>
- <button label="Play Inworld" label_selected="åœæ­¢" name="Anim play btn" tool_tip="Play this animation so that others can see it"/>
- <button label="Play Locally" label_selected="åœæ­¢" name="Anim audition btn" tool_tip="Play this animation so that only you can see it"/>
+ <button label="播放於虛擬世界" label_selected="åœæ­¢" name="Anim play btn" tool_tip="Play this animation so that others can see it"/>
+ <button label="播放於本地" label_selected="åœæ­¢" name="Anim audition btn" tool_tip="Play this animation so that only you can see it"/>
</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_preview_sound.xml b/indra/newview/skins/default/xui/zh/floater_preview_sound.xml
index d99d13669f..46844349de 100644
--- a/indra/newview/skins/default/xui/zh/floater_preview_sound.xml
+++ b/indra/newview/skins/default/xui/zh/floater_preview_sound.xml
@@ -6,6 +6,6 @@
<text name="desc txt">
æè¿°ï¼š
</text>
- <button label="Play Inworld" label_selected="Play Inworld" name="Sound play btn" tool_tip="Play this sound so that others can hear it"/>
- <button label="Play Locally" label_selected="Play Locally" name="Sound audition btn" tool_tip="Play this sound so that only you can hear it"/>
+ <button label="播放於虛擬世界" label_selected="播放於虛擬世界" name="Sound play btn" tool_tip="Play this sound so that others can hear it"/>
+ <button label="播放於本地" label_selected="播放於本地" name="Sound audition btn" tool_tip="Play this sound so that only you can hear it"/>
</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_texture_ctrl.xml b/indra/newview/skins/default/xui/zh/floater_texture_ctrl.xml
index fc00b0b4a2..01586ac153 100644
--- a/indra/newview/skins/default/xui/zh/floater_texture_ctrl.xml
+++ b/indra/newview/skins/default/xui/zh/floater_texture_ctrl.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="texture picker" title="PICK: TEXTURE">
<floater.string name="choose_picture">
- 點擊以挑é¸åœ–片
+ 點擊以挑é¸åœ–åƒ
</floater.string>
<floater.string name="pick title">
Pick:
diff --git a/indra/newview/skins/default/xui/zh/floater_tools.xml b/indra/newview/skins/default/xui/zh/floater_tools.xml
index c70e70451e..2db98eb3d7 100644
--- a/indra/newview/skins/default/xui/zh/floater_tools.xml
+++ b/indra/newview/skins/default/xui/zh/floater_tools.xml
@@ -48,7 +48,7 @@
Drag to move, shift-drag to copy
</text>
<radio_group name="focus_radio_group">
- <radio_item label="Zoom" name="radio zoom"/>
+ <radio_item label="縮放" name="radio zoom"/>
<radio_item label="環繞(Ctrl)" name="radio orbit"/>
<radio_item label="平移(Ctrl+Shift)" name="radio pan"/>
</radio_group>
@@ -75,10 +75,10 @@
</text>
<check_box initial_value="true" label="伸展æè³ª" name="checkbox stretch textures"/>
<check_box initial_value="true" label="貼齊格線" name="checkbox snap to grid"/>
- <combo_box name="combobox grid mode" tool_tip="Choose the type of grid ruler for positioning the object">
- <combo_box.item label="World grid" name="World"/>
- <combo_box.item label="Local grid" name="Local"/>
- <combo_box.item label="Reference grid" name="Reference"/>
+ <combo_box name="combobox grid mode" tool_tip="鏿“‡ç‰©ä»¶å®šä½åƒè€ƒçš„æ ¼ç·šå°ºåº¦é¡žåž‹">
+ <combo_box.item label="世界格線" name="World"/>
+ <combo_box.item label="地方格線" name="Local"/>
+ <combo_box.item label="åƒè€ƒæ ¼ç·š" name="Reference"/>
</combo_box>
<button name="Options..." tool_tip="察看更多格線é¸é …"/>
<button name="ToolCube" tool_tip="Cube"/>
@@ -125,15 +125,15 @@
物件: [COUNT]
</text>
<text name="prim_count">
- Prims: [COUNT]
+ 幾何元件: [COUNT]
</text>
<tab_container name="Object Info Tabs">
<panel label="一般" name="General">
<panel.string name="text deed continued">
- Deed
+ 讓渡
</panel.string>
<panel.string name="text deed">
- Deed
+ 讓渡
</panel.string>
<panel.string name="text modify info 1">
你能修改這個物件
@@ -183,7 +183,7 @@
<name_box initial_value="載入中..." name="Group Name Proxy"/>
<button name="button set group" tool_tip="鏿“‡ä¸€å€‹ç¾¤çµ„以分享這物件權é™"/>
<check_box label="分享" name="checkbox share with group" tool_tip="Allow all members of the set group to share your modify permissions for this object. You must Deed to enable role restrictions."/>
- <button label="Deed" label_selected="Deed" name="button deed" tool_tip="Deeding gives this item away with next owner permissions. Group shared objects can be deeded by a group officer."/>
+ <button label="讓渡" label_selected="讓渡" name="button deed" tool_tip="Deeding gives this item away with next owner permissions. Group shared objects can be deeded by a group officer."/>
<text name="label click action">
點擊以:
</text>
@@ -272,7 +272,7 @@
<combo_box.item label="Sculpted" name="Sculpted"/>
</combo_box>
<combo_box name="material">
- <combo_box.item label="Stone" name="Stone"/>
+ <combo_box.item label="石頭" name="Stone"/>
<combo_box.item label="金屬" name="Metal"/>
<combo_box.item label="玻璃" name="Glass"/>
<combo_box.item label="木頭" name="Wood"/>
@@ -340,7 +340,7 @@
<text name="text revolutions">
Revolutions
</text>
- <texture_picker label="Sculpt Texture" name="sculpt texture control" tool_tip="點擊以挑é¸åœ–片"/>
+ <texture_picker label="Sculpt Texture" name="sculpt texture control" tool_tip="點擊以挑é¸åœ–åƒ"/>
<check_box label="Mirror" name="sculpt mirror control" tool_tip="Flips sculpted prim along the X axis"/>
<check_box label="Inside-out" name="sculpt invert control" tool_tip="Inverts the sculpted prims normals, making it appear inside-out"/>
<text name="label sculpt type">
@@ -356,28 +356,28 @@
</panel>
<panel label="特性" name="Features">
<text name="select_single">
- Select only one primitive to edit features.
+ åªèƒ½é¸æ“‡ä¸€å€‹å¹¾ä½•元件去編輯細節。
</text>
<text name="edit_object">
編輯物件特性:
</text>
- <check_box label="Flexible Path" name="Flexible1D Checkbox Ctrl" tool_tip="Allows object to flex about the Z axis (Client-side only)"/>
- <spinner label="Softness" name="FlexNumSections"/>
- <spinner label="Gravity" name="FlexGravity"/>
- <spinner label="Drag" name="FlexFriction"/>
- <spinner label="Wind" name="FlexWind"/>
- <spinner label="Tension" name="FlexTension"/>
- <spinner label="Force X" name="FlexForceX"/>
- <spinner label="Force Y" name="FlexForceY"/>
- <spinner label="Force Z" name="FlexForceZ"/>
- <check_box label="Light" name="Light Checkbox Ctrl" tool_tip="Causes object to emit light"/>
+ <check_box label="彈性路徑" name="Flexible1D Checkbox Ctrl" tool_tip="Allows object to flex about the Z axis (Client-side only)"/>
+ <spinner label="柔軟" name="FlexNumSections"/>
+ <spinner label="é‡åŠ›" name="FlexGravity"/>
+ <spinner label="拖曳" name="FlexFriction"/>
+ <spinner label="風力" name="FlexWind"/>
+ <spinner label="張力" name="FlexTension"/>
+ <spinner label="強制 X 軸" name="FlexForceX"/>
+ <spinner label="強制 Y 軸" name="FlexForceY"/>
+ <spinner label="強制 Z 軸" name="FlexForceZ"/>
+ <check_box label="å…‰æº" name="Light Checkbox Ctrl" tool_tip="導致物件發光"/>
<color_swatch name="colorswatch" tool_tip="點擊以開啟é¡è‰²æŒ‘é¸å™¨"/>
<texture_picker label="" name="light texture control" tool_tip="Click to choose a projection image (only has effect with deferred rendering enabled)"/>
- <spinner label="Intensity" name="Light Intensity"/>
+ <spinner label="強度" name="Light Intensity"/>
<spinner label="FOV" name="Light FOV"/>
- <spinner label="Radius" name="Light Radius"/>
+ <spinner label="åŠå¾‘" name="Light Radius"/>
<spinner label="Focus" name="Light Focus"/>
- <spinner label="Falloff" name="Light Falloff"/>
+ <spinner label="衰減" name="Light Falloff"/>
<spinner label="Ambiance" name="Light Ambiance"/>
</panel>
<panel label="æè³ª" name="Texture">
@@ -387,7 +387,7 @@
<panel.string name="string repeats per face">
æ¯ä¸€é¢é‡è¦†æ¬¡æ•¸
</panel.string>
- <texture_picker label="æè³ª" name="texture control" tool_tip="點擊以挑é¸åœ–片"/>
+ <texture_picker label="æè³ª" name="texture control" tool_tip="點擊以挑é¸åœ–åƒ"/>
<color_swatch label="é¡è‰²" name="colorswatch" tool_tip="點擊以開啟é¡è‰²æŒ‘é¸å™¨"/>
<text name="color trans">
逿˜Žåº¦ %
diff --git a/indra/newview/skins/default/xui/zh/floater_url_entry.xml b/indra/newview/skins/default/xui/zh/floater_url_entry.xml
index 65f6a9cb95..9e3f3cd47d 100644
--- a/indra/newview/skins/default/xui/zh/floater_url_entry.xml
+++ b/indra/newview/skins/default/xui/zh/floater_url_entry.xml
@@ -3,7 +3,7 @@
<text name="media_label">
媒體 URL:
</text>
- <button label="" name="ok_btn"/>
+ <button label="確定" name="ok_btn"/>
<button label="å–æ¶ˆ" name="cancel_btn"/>
<button label="清除" name="clear_btn"/>
<text name="loading_label">
diff --git a/indra/newview/skins/default/xui/zh/floater_voice_controls.xml b/indra/newview/skins/default/xui/zh/floater_voice_controls.xml
index c27b80e9c5..24b7efea4f 100644
--- a/indra/newview/skins/default/xui/zh/floater_voice_controls.xml
+++ b/indra/newview/skins/default/xui/zh/floater_voice_controls.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_voice_controls" title="Voice Controls">
+<floater name="floater_voice_controls" title="語音控制">
<string name="title_nearby">
- NEARBY VOICE
+ 附近的語音
</string>
<string name="title_group">
與 [GROUP] 進行群組通話
@@ -13,7 +13,7 @@
與 [NAME] 進行通話
</string>
<string name="no_one_near">
- No one near has voice enabled
+ 附近沒有一人開啟語音
</string>
<layout_stack name="my_call_stack">
<layout_panel name="my_panel">
diff --git a/indra/newview/skins/default/xui/zh/menu_inventory.xml b/indra/newview/skins/default/xui/zh/menu_inventory.xml
index 49a50c97c6..87d769af0d 100644
--- a/indra/newview/skins/default/xui/zh/menu_inventory.xml
+++ b/indra/newview/skins/default/xui/zh/menu_inventory.xml
@@ -2,17 +2,17 @@
<menu name="Popup">
<menu_item_call label="分享" name="Share"/>
<menu_item_call label="購買" name="Task Buy"/>
- <menu_item_call label="Open" name="Task Open"/>
- <menu_item_call label="Play" name="Task Play"/>
- <menu_item_call label="Properties" name="Task Properties"/>
+ <menu_item_call label="開啟" name="Task Open"/>
+ <menu_item_call label="播放" name="Task Play"/>
+ <menu_item_call label="屬性" name="Task Properties"/>
<menu_item_call label="æ›´å" name="Task Rename"/>
<menu_item_call label="刪除" name="Task Remove"/>
<menu_item_call label="清空垃圾筒" name="Empty Trash"/>
- <menu_item_call label="Empty Lost And Found" name="Empty Lost And Found"/>
+ <menu_item_call label="清空 Lost And Found" name="Empty Lost And Found"/>
<menu_item_call label="新資料夾" name="New Folder"/>
- <menu_item_call label="New Script" name="New Script"/>
- <menu_item_call label="New Notecard" name="New Note"/>
- <menu_item_call label="New Gesture" name="New Gesture"/>
+ <menu_item_call label="新腳本" name="New Script"/>
+ <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"/>
<menu_item_call label="新褲å­" name="New Pants"/>
@@ -52,11 +52,11 @@
<menu_item_call label="添加到目å‰è£æ‰®" name="Add To Outfit"/>
<menu_item_call label="由目å‰çš„è£æ‰®ç§»é™¤" name="Remove From Outfit"/>
<menu_item_call label="尋找原件" name="Find Original"/>
- <menu_item_call label="Purge Item" name="Purge Item"/>
- <menu_item_call label="Restore Item" name="Restore Item"/>
+ <menu_item_call label="清空物å“" name="Purge Item"/>
+ <menu_item_call label="æ¢å¾©ç‰©å“" name="Restore Item"/>
<menu_item_call label="開啟" name="Open"/>
- <menu_item_call label="Open Original" name="Open Original"/>
- <menu_item_call label="Properties" name="Properties"/>
+ <menu_item_call label="開啟原件" name="Open Original"/>
+ <menu_item_call label="屬性" name="Properties"/>
<menu_item_call label="æ›´å" name="Rename"/>
<menu_item_call label="覆製資產 UUID" name="Copy Asset UUID"/>
<menu_item_call label="覆製" name="Copy"/>
@@ -68,11 +68,11 @@
<menu_item_call label="Start Conference Chat" name="Conference Chat Folder"/>
<menu_item_call label="播放" name="Sound Play"/>
<menu_item_call label="添加地標" name="About Landmark"/>
- <menu_item_call label="Play Inworld" name="Animation Play"/>
- <menu_item_call label="Play Locally" name="Animation Audition"/>
+ <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="Start Conference Chat" name="Conference Chat"/>
+ <menu_item_call label="開始會議交談" name="Conference Chat"/>
<menu_item_call label="Activate" name="Activate"/>
<menu_item_call label="Deactivate" name="Deactivate"/>
<menu_item_call label="å¦å­˜" name="Save As"/>
diff --git a/indra/newview/skins/default/xui/zh/menu_inventory_gear_default.xml b/indra/newview/skins/default/xui/zh/menu_inventory_gear_default.xml
index 74b90ada5e..8ad0e7324f 100644
--- a/indra/newview/skins/default/xui/zh/menu_inventory_gear_default.xml
+++ b/indra/newview/skins/default/xui/zh/menu_inventory_gear_default.xml
@@ -6,7 +6,7 @@
<menu_item_check label="總是由å稱排åºè³‡æ–™å¤¾" name="sort_folders_by_name"/>
<menu_item_check label="系統資料夾排åºåˆ°æœ€ä¸Šæ–¹" name="sort_system_folders_to_top"/>
<menu_item_call label="é¡¯ç¤ºéŽæ¿¾å™¨" name="show_filters"/>
- <menu_item_call label="Reset Filters" name="reset_filters"/>
+ <menu_item_call label="é‡è¨­éŽæ¿¾å™¨" name="reset_filters"/>
<menu_item_call label="關閉全部資料夾" name="close_folders"/>
<menu_item_call label="清空 Lost and Found" name="empty_lostnfound"/>
<menu_item_call label="儲存æè³ªç‚º" name="Save Texture As"/>
diff --git a/indra/newview/skins/default/xui/zh/menu_viewer.xml b/indra/newview/skins/default/xui/zh/menu_viewer.xml
index a51e26c3f4..b6bb79bcbc 100644
--- a/indra/newview/skins/default/xui/zh/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/zh/menu_viewer.xml
@@ -20,8 +20,6 @@
<menu_item_call label="離開" name="Set Away"/>
<menu_item_call label="忙碌" name="Set Busy"/>
</menu>
- <menu_item_call label="è¦æ±‚ Admin 狀態" name="Request Admin Options"/>
- <menu_item_call label="離開 Admin 狀態" name="Leave Admin Options"/>
<menu_item_call label="çµæŸé€€å‡º [APP_NAME]" name="Quit"/>
</menu>
<menu label="æºé€š" name="Communicate">
@@ -36,11 +34,10 @@
<menu_item_check label="æœå°‹" name="Search"/>
<menu_item_call label="æ‹æ”å¿«ç…§" name="Take Snapshot"/>
<menu_item_call label="將此處記下地標" name="Create Landmark Here"/>
- <menu label="地點檔案" name="Land">
- <menu_item_call label="地點檔案" name="Place Profile"/>
- <menu_item_call label="關於土地" name="About Land"/>
- <menu_item_call label="åœ°å€ / 領地" name="Region/Estate"/>
- </menu>
+ <menu_item_separator/>
+ <menu_item_call label="地點檔案" name="Place Profile"/>
+ <menu_item_call label="關於土地" name="About Land"/>
+ <menu_item_call label="åœ°å€ / 領地" name="Region/Estate"/>
<menu_item_call label="購買這塊土地" name="Buy Land"/>
<menu_item_call label="我的土地" name="My Land"/>
<menu label="顯示" name="LandShow">
@@ -56,7 +53,7 @@
</menu>
<menu_item_call label="瞬間瞬間傳é€å›žå®¶" name="Teleport Home"/>
<menu_item_call label="設定家在此處" name="Set Home to Here"/>
- <menu label="太陽" name="Environment Settings">
+ <menu label="太陽" name="Sun">
<menu_item_call label="日出" name="Sunrise"/>
<menu_item_call label="中åˆ" name="Noon"/>
<menu_item_call label="æ—¥è½" name="Sunset"/>
@@ -139,52 +136,50 @@
<menu_item_check label="Disable Camera Constraints" name="Disable Camera Distance"/>
<menu_item_check label="高解æžåº¦å¿«ç…§" name="HighResSnapshot"/>
<menu_item_check label="éœéŸ³æ‹æ”快照到硬碟" name="QuietSnapshotsToDisk"/>
+ <menu_item_check label="壓縮快照存到硬碟" name="CompressSnapshotsToDisk"/>
<menu label="效能工具" name="Performance Tools">
<menu_item_call label="Lag Meter" name="Lag Meter"/>
<menu_item_check label="統計列" name="Statistics Bar"/>
<menu_item_check label="Show Avatar Rendering Cost" name="Avatar Rendering Cost"/>
</menu>
- <menu label="Highlighting and Visibility" name="Highlighting and Visibility">
+ <menu label="高亮顯示與å¯è¦‹åº¦" name="Highlighting and Visibility">
<menu_item_check label="Cheesy Beacon" name="Cheesy Beacon"/>
- <menu_item_check label="Hide Particles" name="Hide Particles"/>
- <menu_item_check label="Hide Selected" name="Hide Selected"/>
+ <menu_item_check label="éš±è—ç²’å­æ•ˆæžœ" name="Hide Particles"/>
+ <menu_item_check label="éš±è—æ‰€é¸æ“‡çš„" name="Hide Selected"/>
<menu_item_check label="é«˜äº®é¡¯ç¤ºé€æ˜Žç‰©ä»¶" name="Highlight Transparent"/>
<menu_item_check label="顯示 HUD 附件" name="Show HUD Attachments"/>
- <menu_item_check label="Show Mouselook Crosshairs" name="ShowCrosshairs"/>
+ <menu_item_check label="顯示第一人稱視角準星" name="ShowCrosshairs"/>
</menu>
<menu label="Rendering Types" name="Rendering Types">
- <menu_item_check label="Simple" name="Simple"/>
- <menu_item_check label="åŠé€æ˜Ž" name="Alpha"/>
- <menu_item_check label="Tree" name="Tree"/>
- <menu_item_check label="Avatars" name="Character"/>
- <menu_item_check label="SurfacePath" name="SurfacePath"/>
- <menu_item_check label="Sky" name="Sky"/>
- <menu_item_check label="Water" name="Water"/>
- <menu_item_check label="Ground" name="Ground"/>
- <menu_item_check label="Volume" name="Volume"/>
- <menu_item_check label="Grass" name="Grass"/>
- <menu_item_check label="Clouds" name="Clouds"/>
- <menu_item_check label="Particles" name="Particles"/>
- <menu_item_check label="Bump" name="Bump"/>
+ <menu_item_check label="ç°¡å–®" name="Rendering Type Simple"/>
+ <menu_item_check label="åŠé€æ˜Ž" name="Rendering Type Alpha"/>
+ <menu_item_check label="樹木" name="Rendering Type Tree"/>
+ <menu_item_check label="化身" name="Rendering Type Character"/>
+ <menu_item_check label="地表" name="Rendering Type Surface Patch"/>
+ <menu_item_check label="天空" name="Rendering Type Sky"/>
+ <menu_item_check label="æ°´æ–‡" name="Rendering Type Water"/>
+ <menu_item_check label="地é¢" name="Rendering Type Ground"/>
+ <menu_item_check label="é«”ç©" name="Rendering Type Volume"/>
+ <menu_item_check label="è‰åœ°" name="Rendering Type Grass"/>
+ <menu_item_check label="雲彩" name="Rendering Type Clouds"/>
+ <menu_item_check label="ç²’å­æ•ˆæžœ" name="Rendering Type Particles"/>
+ <menu_item_check label="碰撞" name="Rendering Type Bump"/>
</menu>
<menu label="Rendering Features" name="Rendering Features">
- <menu_item_check label="UI" name="UI"/>
+ <menu_item_check label="UI" name="ToggleUI"/>
<menu_item_check label="Selected" name="Selected"/>
<menu_item_check label="Highlighted" name="Highlighted"/>
<menu_item_check label="Dynamic Textures" name="Dynamic Textures"/>
- <menu_item_check label="Foot Shadows" name="Foot Shadows"/>
- <menu_item_check label="Fog" name="Fog"/>
+ <menu_item_check label="腳步陰影" name="Foot Shadows"/>
+ <menu_item_check label="霧氣" name="Fog"/>
<menu_item_check label="Test FRInfo" name="Test FRInfo"/>
- <menu_item_check label="Flexible Objects" name="Flexible Objects"/>
+ <menu_item_check label="彈性物件" name="Flexible Objects"/>
</menu>
- <menu_item_check label="Use Plugin Read Thread" name="Use Plugin Read Thread"/>
+ <menu_item_check label="使用外å¦è®€å–ç·’" name="Use Plugin Read Thread"/>
<menu_item_call label="清除群組快å–資料" name="ClearGroupCache"/>
<menu_item_check label="滑鼠平滑移動" name="Mouse Smoothing"/>
<menu label="快速éµ" name="Shortcuts">
- <menu_item_call label="圖åƒï¼ˆL$[COST])..." name="Upload Image"/>
- <menu_item_check label="æœå°‹" name="Search"/>
<menu_item_call label="釋出按éµ" name="Release Keys"/>
- <menu_item_call label="設定使用者界é¢å¤§å°è‡³é è¨­å€¼" name="Set UI Size to Default"/>
<menu_item_check label="顯示進階é¸å–® ï¼ èˆŠç‰ˆæ·å¾‘" name="Show Advanced Menu - legacy shortcut"/>
<menu_item_call label="關閉視窗" name="Close Window"/>
<menu_item_call label="關閉全部視窗" name="Close All Windows"/>
@@ -193,13 +188,6 @@
<menu_item_check label="Joystick Flycam" name="Joystick Flycam"/>
<menu_item_call label="é‡è¨­è¦–è§’" name="Reset View"/>
<menu_item_call label="注視上一ä½èŠå¤©è€…" name="Look at Last Chatter"/>
- <menu label="鏿“‡å»ºé€ å·¥å…·" name="Select Tool">
- <menu_item_call label="èšç„¦å·¥å…·" name="Focus"/>
- <menu_item_call label="移動工具" name="Move"/>
- <menu_item_call label="編輯工具" name="Edit"/>
- <menu_item_call label="創造工具" name="Create"/>
- <menu_item_call label="土地工具" name="Land"/>
- </menu>
<menu_item_call label="Zoom In" name="Zoom In"/>
<menu_item_call label="Zoom Default" name="Zoom Default"/>
<menu_item_call label="Zoom Out" name="Zoom Out"/>
@@ -213,13 +201,13 @@
<menu_item_check label="除錯控制å°" name="Debug Console"/>
<menu_item_call label="通知控制å°" name="Notifications"/>
<menu_item_check label="æè³ªå°ºå¯¸æŽ§åˆ¶å°" name="Texture Size"/>
- <menu_item_check label="Texture Category Console" name="Texture Category"/>
- <menu_item_check label="Fast Timers" name="Fast Timers"/>
+ <menu_item_check label="æè³ªåˆ†é¡žæŽ§åˆ¶å°" name="Texture Category"/>
+ <menu_item_check label="快速碼錶" name="Fast Timers"/>
<menu_item_check label="記憶體" name="Memory"/>
- <menu_item_call label="Region Info to Debug Console" name="Region Info to Debug Console"/>
+ <menu_item_call label="地å€è³‡è¨Šå‚³è‡³é™¤éŒ¯æŽ§åˆ¶å°" name="Region Info to Debug Console"/>
<menu_item_call label="群組資訊至除錯控制å°" name="Group Info to Debug Console"/>
<menu_item_call label="Capabilities Info to Debug Console" name="Capabilities Info to Debug Console"/>
- <menu_item_check label="Camera" name="Camera"/>
+ <menu_item_check label="æ”影機" name="Camera"/>
<menu_item_check label="風力" name="Wind"/>
<menu_item_check label="FOV" name="FOV"/>
<menu_item_check label="Badge" name="Badge"/>
@@ -244,7 +232,7 @@
<menu_item_call label="模擬記憶體ä¸è¶³" name="Memory Leaking Simulation"/>
</menu>
<menu label="Render Tests" name="Render Tests">
- <menu_item_check label="Camera Offset" name="Camera Offset"/>
+ <menu_item_check label="æ”影機ä½ç§»" name="Camera Offset"/>
<menu_item_check label="Randomize Framerate" name="Randomize Framerate"/>
<menu_item_check label="Periodic Slow Frame" name="Periodic Slow Frame"/>
<menu_item_check label="Frame Test" name="Frame Test"/>
@@ -275,12 +263,12 @@
<menu_item_check label="Shadows from Sun/Moon/Projectors" name="Shadows from Sun/Moon/Projectors"/>
<menu_item_check label="SSAO and Shadow Smoothing" name="SSAO and Shadow Smoothing"/>
<menu_item_check label="Global Illumination (experimental)" name="Global Illumination"/>
- <menu_item_check label="Debug GL" name="Debug GL"/>
- <menu_item_check label="Debug Pipeline" name="Debug Pipeline"/>
+ <menu_item_check label="GL 除錯" name="Debug GL"/>
+ <menu_item_check label="管線除錯" name="Debug Pipeline"/>
<menu_item_check label="自動åŠé€æ˜Žé®ç½©ï¼ˆéžå»¶ï¼‰" name="Automatic Alpha Masks (deferred)"/>
<menu_item_check label="自動åŠé€æ˜Žé®ç½©ï¼ˆéžéžå»¶ï¼‰" name="Automatic Alpha Masks (non-deferred)"/>
<menu_item_check label="Animation Textures" name="Animation Textures"/>
- <menu_item_check label="Disable Textures" name="Disable Textures"/>
+ <menu_item_check label="關閉æè³ª" name="Disable Textures"/>
<menu_item_check label="Full Res Textures" name="Rull Res Textures"/>
<menu_item_check label="Audit Textures" name="Audit Textures"/>
<menu_item_check label="Texture Atlas (experimental)" name="Texture Atlas"/>
@@ -297,30 +285,29 @@
<menu_item_call label="Drop a Packet" name="Drop a Packet"/>
</menu>
<menu_item_call label="Dump Scripted Camera" name="Dump Scripted Camera"/>
- <menu_item_call label="Bumps, Pushes &amp; Hits" name="Bumps, Pushes &amp;amp; Hits"/>
- <menu label="Recorder" name="Recorder">
- <menu_item_call label="Start Playback" name="Start Playback"/>
- <menu_item_call label="Stop Playback" name="Stop Playback"/>
- <menu_item_check label="Loop Playback" name="Loop Playback"/>
- <menu_item_call label="Start Record" name="Start Record"/>
- <menu_item_call label="Stop Record" name="Stop Record"/>
- </menu>
- <menu label="World" name="World">
- <menu_item_check label="Sim Sun Override" name="Sim Sun Override"/>
- <menu_item_check label="Cheesy Beacon" name="Cheesy Beacon"/>
- <menu_item_check label="Fixed Weather" name="Fixed Weather"/>
+ <menu_item_call label="ç¢°æ’žã€æŽ¨æ“ èˆ‡æ‰“æ“Š" name="Bumps, Pushes &amp;amp; Hits"/>
+ <menu label="錄製器" name="Recorder">
+ <menu_item_call label="開始播放" name="Start Playback"/>
+ <menu_item_call label="åœæ­¢æ’­æ”¾" name="Stop Playback"/>
+ <menu_item_check label="循環播放" name="Loop Playback"/>
+ <menu_item_call label="開始錄製" name="Start Record"/>
+ <menu_item_call label="åœæ­¢éŒ„製" name="Stop Record"/>
+ </menu>
+ <menu label="世界" name="DevelopWorld">
+ <menu_item_check label="模擬器太陽設定覆蓋" name="Sim Sun Override"/>
+ <menu_item_check label="固定天氣" name="Fixed Weather"/>
<menu_item_call label="傾å°åœ°å€ç‰©ä»¶å¿«å–" name="Dump Region Object Cache"/>
</menu>
<menu label="UI" name="UI">
- <menu_item_call label="Media Browser Test" name="Web Browser Test"/>
- <menu_item_call label="Web Content Browser" name="Web Content Browser"/>
+ <menu_item_call label="測試媒體ç€è¦½å™¨" name="Web Browser Test"/>
+ <menu_item_call label="ç¶²é å…§å®¹ç€è¦½å™¨" name="Web Content Browser"/>
<menu_item_call label="Dump SelectMgr" name="Dump SelectMgr"/>
<menu_item_call label="傾尿”¶ç´å€" name="Dump Inventory"/>
- <menu_item_call label="Dump Timers" name="Dump Timers"/>
+ <menu_item_call label="傾å°ç¢¼éŒ¶" name="Dump Timers"/>
<menu_item_call label="Dump Focus Holder" name="Dump Focus Holder"/>
<menu_item_call label="Print Selected Object Info" name="Print Selected Object Info"/>
<menu_item_call label="Print Agent Info" name="Print Agent Info"/>
- <menu_item_call label="Memory Stats" name="Memory Stats"/>
+ <menu_item_call label="計憶體狀態" name="Memory Stats"/>
<menu_item_check label="Region Debug Console" name="Region Debug Console"/>
<menu_item_check label="Debug SelectMgr" name="Debug SelectMgr"/>
<menu_item_check label="Debug Clicks" name="Debug Clicks"/>
@@ -331,29 +318,29 @@
<menu_item_check label="Debug WindowProc" name="Debug WindowProc"/>
</menu>
<menu label="XUI" name="XUI">
- <menu_item_call label="Reload Color Settings" name="Reload Color Settings"/>
- <menu_item_call label="Show Font Test" name="Show Font Test"/>
- <menu_item_check label="Show XUI Names" name="Show XUI Names"/>
+ <menu_item_call label="釿–°è¼‰å…¥é¡è‰²è¨­å®š" name="Reload Color Settings"/>
+ <menu_item_call label="顯示字型測試" name="Show Font Test"/>
+ <menu_item_check label="顯示 XUI å稱" name="Show XUI Names"/>
<menu_item_call label="é€å‡ºæ¸¬è©¦ IMs" name="Send Test IMs"/>
<menu_item_call label="æ²–æ´—å稱快å–資料" name="Flush Names Caches"/>
</menu>
<menu label="化身" name="Character">
<menu label="Grab Baked Texture" name="Grab Baked Texture">
- <menu_item_call label="Iris" name="Iris"/>
- <menu_item_call label="頭部" name="Head"/>
- <menu_item_call label="Upper Body" name="Upper Body"/>
- <menu_item_call label="Lower Body" name="Lower Body"/>
- <menu_item_call label="裙å­" name="Skirt"/>
+ <menu_item_call label="Iris" name="Grab Iris"/>
+ <menu_item_call label="頭部" name="Grab Head"/>
+ <menu_item_call label="Upper Body" name="Grab Upper Body"/>
+ <menu_item_call label="Lower Body" name="Grab Lower Body"/>
+ <menu_item_call label="裙å­" name="Grab Skirt"/>
</menu>
<menu label="Character Tests" name="Character Tests">
<menu_item_call label="Appearance To XML" name="Appearance To XML"/>
<menu_item_call label="Toggle Character Geometry" name="Toggle Character Geometry"/>
- <menu_item_call label="Test Male" name="Test Male"/>
- <menu_item_call label="Test Female" name="Test Female"/>
- <menu_item_call label="Toggle PG" name="Toggle PG"/>
- <menu_item_check label="Allow Select Avatar" name="Allow Select Avatar"/>
+ <menu_item_call label="男性測試" name="Test Male"/>
+ <menu_item_call label="女性測試" name="Test Female"/>
+ <menu_item_call label="PG 切æ›" name="Toggle PG"/>
+ <menu_item_check label="å…è¨±é¸æ“‡åŒ–身" name="Allow Select Avatar"/>
</menu>
- <menu_item_call label="Force Params to Default" name="Force Params to Default"/>
+ <menu_item_call label="å¼·åˆ¶åƒæ•¸ç‚ºé è¨­å€¼" name="Force Params to Default"/>
<menu_item_check label="動作資訊" name="Animation Info"/>
<menu_item_check label="慢動作" name="Slow Motion Animations"/>
<menu_item_check label="顯示注視在" name="Show Look At"/>
@@ -377,8 +364,8 @@
<menu_item_check label="Show Admin Menu" name="View Admin Options"/>
</menu>
<menu label="Admin" name="Admin">
- <menu label="Object">
- <menu_item_call label="å–得副本" name="Take Copy"/>
+ <menu label="Object" name="AdminObject">
+ <menu_item_call label="å–得副本" name="Admin Take Copy"/>
<menu_item_call label="å¼·åˆ¶æ“æœ‰è€…為我" name="Force Owner To Me"/>
<menu_item_call label="Force Owner Permissive" name="Force Owner Permissive"/>
<menu_item_call label="刪除" name="Delete"/>
@@ -414,7 +401,7 @@
<menu_item_call label="身體物ç†" name="Physics"/>
<menu_item_call label="全部衣æœ" name="All Clothes"/>
</menu>
- <menu label="幫助" name="Help">
+ <menu label="幫助" name="DeprecatedHelp">
<menu_item_call label="æž—ç™»å®˜æ–¹éƒ¨è½æ ¼" name="Official Linden Blog"/>
<menu_item_call label="Scripting Portal" name="Scripting Portal"/>
<menu label="臭蟲回報" name="Bug Reporting">
diff --git a/indra/newview/skins/default/xui/zh/mime_types.xml b/indra/newview/skins/default/xui/zh/mime_types.xml
index 89fe92fabc..8ac1bf6920 100644
--- a/indra/newview/skins/default/xui/zh/mime_types.xml
+++ b/indra/newview/skins/default/xui/zh/mime_types.xml
@@ -27,10 +27,10 @@
圖åƒ
</label>
<tooltip name="image_tooltip">
- There is an image at this location
+ 有一個圖åƒåœ¨æ­¤ä½ç½®
</tooltip>
<playtip name="image_playtip">
- View this location&apos;s image
+ 察看這個ä½ç½®çš„圖åƒ
</playtip>
</widgetset>
<widgetset name="audio">
@@ -38,10 +38,10 @@
音頻
</label>
<tooltip name="audio_tooltip">
- There is audio at this location
+ 有一個音頻在此ä½ç½®
</tooltip>
<playtip name="audio_playtip">
- Play this location&apos;s audio
+ 播放這個硾的音頻
</playtip>
</widgetset>
<scheme name="rtsp">
diff --git a/indra/newview/skins/default/xui/zh/mime_types_linux.xml b/indra/newview/skins/default/xui/zh/mime_types_linux.xml
index 08839abe6a..90f17b841c 100644
--- a/indra/newview/skins/default/xui/zh/mime_types_linux.xml
+++ b/indra/newview/skins/default/xui/zh/mime_types_linux.xml
@@ -30,7 +30,7 @@
There is an image at this location
</tooltip>
<playtip name="image_playtip">
- View this location&apos;s image
+ 察看這個ä½ç½®çš„圖åƒ
</playtip>
</widgetset>
<widgetset name="audio">
@@ -38,10 +38,10 @@
音頻
</label>
<tooltip name="audio_tooltip">
- There is audio at this location
+ 有一個音頻在此ä½ç½®
</tooltip>
<playtip name="audio_playtip">
- Play this location&apos;s audio
+ 播放這個ä½ç½®çš„音頻
</playtip>
</widgetset>
<scheme name="rtsp">
@@ -66,7 +66,7 @@
</mimetype>
<mimetype name="video/*">
<label name="video2_label">
- Video
+ 影片
</label>
</mimetype>
<mimetype name="image/*">
diff --git a/indra/newview/skins/default/xui/zh/mime_types_mac.xml b/indra/newview/skins/default/xui/zh/mime_types_mac.xml
index 7958f64219..b8105c145c 100644
--- a/indra/newview/skins/default/xui/zh/mime_types_mac.xml
+++ b/indra/newview/skins/default/xui/zh/mime_types_mac.xml
@@ -27,10 +27,10 @@
圖åƒ
</label>
<tooltip name="image_tooltip">
- 有一個影åƒåœ¨æ­¤ä½ç½®
+ 有一個圖åƒåœ¨æ­¤ä½ç½®
</tooltip>
<playtip name="image_playtip">
- 察看在此ä½ç½®çš„å½±åƒ
+ 察看在此ä½ç½®çš„圖åƒ
</playtip>
</widgetset>
<widgetset name="audio">
diff --git a/indra/newview/skins/default/xui/zh/notifications.xml b/indra/newview/skins/default/xui/zh/notifications.xml
index 1c89e9b522..3fa8ff3f78 100644
--- a/indra/newview/skins/default/xui/zh/notifications.xml
+++ b/indra/newview/skins/default/xui/zh/notifications.xml
@@ -758,16 +758,16 @@ No parcel selected.
No region selected.
</notification>
<notification name="CannotReleaseLandNothingSelected">
- Unable to abandon land:
-No parcel selected.
+ 無法放棄土地:
+ç„¡åœ°æ®µè¢«é¸æ“‡ã€‚
</notification>
<notification name="CannotReleaseLandNoRegion">
無法放棄土地:
無法尋找地å€ã€‚
</notification>
<notification name="CannotBuyLandNothingSelected">
- Unable to buy land:
-No parcel selected.
+ 無法購買土地:
+ç„¡åœ°æ®µè¢«é¸æ“‡ã€‚
</notification>
<notification name="CannotBuyLandNoRegion">
Unable to buy land:
@@ -777,121 +777,121 @@ Cannot find the region this land is in.
You cannot close the Buy Land window until [APP_NAME] estimates the price of this transaction.
</notification>
<notification name="CannotDeedLandNothingSelected">
- Unable to deed land:
+ 無法讓渡土地:
無地段被é¸å–。
</notification>
<notification name="CannotDeedLandNoGroup">
- Unable to deed land:
+ 無法讓渡土地:
無群組被é¸å–。
</notification>
<notification name="CannotDeedLandNoRegion">
- Unable to deed land:
-Cannot find the region this land is in.
+ 無法讓渡土地:
+無法發ç¾é€™å¡ŠåœŸåœ°æ‰€åœ¨çš„地å€ã€‚
</notification>
<notification name="CannotDeedLandMultipleSelected">
- Unable to deed land:
-Multiple parcels selected.
+ 無法讓渡土地:
+複數地段被é¸å–。
-Try selecting a single parcel.
+請試著é¸å–單一地段。
</notification>
<notification name="CannotDeedLandWaitingForServer">
- Unable to deed land:
-Waiting for server to report ownership.
+ 無法讓渡土地:
+等候伺æœå™¨å ±å‘Šæ“有權。
-Please try again.
+è«‹å†è©¦ä¸€æ¬¡ã€‚
</notification>
<notification name="CannotDeedLandNoTransfer">
- Unable to deed land:
-The region [REGION] does not allow transfer of land.
+ 無法讓渡土地:
+æ­¤ [REGION] 地å€ä¸¦ä¸å…許土地轉移。
</notification>
<notification name="CannotReleaseLandWatingForServer">
- Unable to abandon land:
-Waiting for server to update parcel information.
+ 無法放棄土地:
+等候伺æœå™¨æ›´æ–°åœ°æ®µè³‡è¨Šã€‚
-Try again in a few seconds.
+è«‹ç¨å¾Œå¹¾ç§’å†è©¦ä¸€æ¬¡ã€‚
</notification>
<notification name="CannotReleaseLandSelected">
- Unable to abandon land:
-You do not own all the parcels selected.
+ 無法放棄土地:
+你䏦使“æœ‰æ‰€é¸æ“‡çš„全部土地。
-Please select a single parcel.
+è«‹é¸æ“‡ä¸€å€‹å–®ä¸€åœ°æ®µã€‚
</notification>
<notification name="CannotReleaseLandDontOwn">
- Unable to abandon land:
-You don&apos;t have permission to release this parcel.
-Parcels you own appear in green.
+ 無法放棄土地:
+你並沒有權é™åŽ»é‡‹å‡ºé€™å€‹åœ°æ®µã€‚
+ä½ æ‰€æ“æœ‰çš„地段將呈ç¾ç¶ è‰²ã€‚
</notification>
<notification name="CannotReleaseLandRegionNotFound">
- Unable to abandon land:
-Cannot find the region this land is in.
+ 無法放棄土地:
+無法發ç¾é€™å¿«åœŸåœ°æ‰€åœ¨çš„地å€ã€‚
</notification>
<notification name="CannotReleaseLandNoTransfer">
- Unable to abandon land:
-The region [REGION] does not allow transfer of land.
+ 無法放棄土地:
+æ­¤ [REGION] 地å€ä¸¦ä¸è¨±åœŸåœ°è½‰ç§»ã€‚
</notification>
<notification name="CannotReleaseLandPartialSelection">
- Unable to abandon land:
-You must select an entire parcel to release it.
+ 無法放棄土地:
+ä½ å¿…é ˆé¸å–一整個地段以釋出它。
-Select an entire parcel, or divide your parcel first.
+é¸å–一整個地段,或先進行分割。
</notification>
<notification name="ReleaseLandWarning">
- You are about to release [AREA] m² of land.
-Releasing this parcel will remove it from your land holdings, but will not grant any L$.
+ 你釋出約 [AREA] m² é¢ç©åœŸåœ°ã€‚
+é‡‹å‡ºå€‹åœ°æ®µå°‡æœƒç”±ä½ æ‰€æŒæœ‰çš„åœŸåœ°ä¸­ç§»é™¤ï¼Œä½†ä¸æœƒçµ¦äºˆä»»ä½• L$。
-Release this land?
+你確定è¦é‡‹å‡ºé€™å¡ŠåœŸåœ°ï¼Ÿ
<usetemplate name="okcancelbuttons" notext="å–æ¶ˆ" yestext="確定"/>
</notification>
<notification name="CannotDivideLandNothingSelected">
- Unable to divide land:
+ 無法分割土地:
-No parcels selected.
+無地段被é¸å–。
</notification>
<notification name="CannotDivideLandPartialSelection">
- Unable to divide land:
+ 無法分割土地:
-You have an entire parcel selected.
-Try selecting a part of the parcel.
+ä½ ç¾åœ¨é¸å–整個地段。
+請試著é¸å–其中部分地段。
</notification>
<notification name="LandDivideWarning">
- Dividing this land will split this parcel into two and each parcel can have its own settings. Some settings will be reset to defaults after the operation.
+ 分割土地會將佌地段一分為二,æ¯ä¸€å€‹åœ°æ®µå°‡éƒ½å„自有其設定。 在這個æ“作之後,一些設定值將會回復到é è¨­å€¼ã€‚
-Divide land?
+進行分割土地?
<usetemplate name="okcancelbuttons" notext="å–æ¶ˆ" yestext="確定"/>
</notification>
<notification name="CannotDivideLandNoRegion">
- Unable to divide land:
-Cannot find the region this land is in.
+ 無法分割土地:
+無法發ç¾é€™å¡ŠåœŸåœ°æ‰€åœ¨çš„地å€ã€‚
</notification>
<notification name="CannotJoinLandNoRegion">
- Unable to join land:
-Cannot find the region this land is in.
+ 無法åˆä½µåœŸåœ°ï¼š
+無法發ç¾é€™å¡ŠåœŸåœ°æ‰€åœ¨çš„地å€ã€‚
</notification>
<notification name="CannotJoinLandNothingSelected">
- Unable to join land:
-No parcels selected.
+ 無法åˆä½µåœŸåœ°ï¼š
+無地段被é¸å–。
</notification>
<notification name="CannotJoinLandEntireParcelSelected">
- Unable to join land:
-You only have one parcel selected.
+ 無法åˆä½µåœŸåœ°ï¼š
+ä½ åªæœ‰é¸å–一個地段。
-Select land across both parcels.
+請跨越兩個地段é¸å–土地。
</notification>
<notification name="CannotJoinLandSelection">
- Unable to join land:
-You must select more than one parcel.
+ 無法åˆä½µåœŸåœ°ï¼š
+ä½ å¿…é ˆé¸å–è¶…éŽä¸€å€‹åœ°æ®µã€‚
-Select land across both parcels.
+請跨越兩個地段é¸å–土地。
</notification>
<notification name="JoinLandWarning">
- Joining this land will create one large parcel out of all parcels intersecting the selected rectangle.
-You will need to reset the name and options of the new parcel.
+ åˆä½µåœŸåœ°å°‡æœƒåœ¨é¸å–的全部地段範åœè£¡ç”¢ç”Ÿä¸€å€‹å·¨å¤§çš„地段。
+你將會需è¦é‡è¨­é€™å€‹æ–°åœ°æ®µçš„å稱與設定é¸é …。
-Join land?
+進行土地åˆä½µï¼Ÿ
<usetemplate name="okcancelbuttons" notext="å–æ¶ˆ" yestext="確定"/>
</notification>
<notification name="ConfirmNotecardSave">
- This notecard needs to be saved before the item can be copied or viewed. Save notecard?
+ 在物å“能被覆製或察看å‰ï¼Œé€™è¨˜äº‹å¡å¿…須先進行儲存。儲存記事å¡ï¼Ÿ
<usetemplate name="okcancelbuttons" notext="å–æ¶ˆ" yestext="確定"/>
</notification>
<notification name="ConfirmItemCopy">
@@ -966,7 +966,7 @@ Offer friendship to [NAME]?
</form>
</notification>
<notification name="RemoveFromFriends">
- Do you want to remove [NAME] from your Friends List?
+ Do you want to remove &lt;nolink&gt;[NAME]&lt;/nolink&gt; from your Friends List?
<usetemplate name="okcancelbuttons" notext="å–æ¶ˆ" yestext="確定"/>
</notification>
<notification name="RemoveMultipleFromFriends">
@@ -1377,7 +1377,7 @@ We must restart [APP_NAME] to install the update.
<notification name="DeedObjectToGroup">
Deeding this object will cause the group to:
* Receive L$ paid into the object
- <usetemplate ignoretext="在我讓渡一個物件給群組å‰ç¢ºèª" name="okcancelignore" notext="å–æ¶ˆ" yestext="Deed"/>
+ <usetemplate ignoretext="在我讓渡一個物件給群組å‰ç¢ºèª" name="okcancelignore" notext="å–æ¶ˆ" yestext="讓渡"/>
</notification>
<notification name="WebLaunchExternalTarget">
你確定è¦é–‹å•Ÿç¶²é ç€è¦½å™¨åŽ»å¯Ÿçœ‹é€™å€‹å…§å®¹ï¼Ÿ
@@ -1418,7 +1418,7 @@ We must restart [APP_NAME] to install the update.
<usetemplate ignoretext="åœ¨æˆ‘é€€å›žç‰©ä»¶çµ¦å®ƒå€‘çš„æ“æœ‰è€…å‰ç¢ºèª" name="okcancelignore" notext="å–æ¶ˆ" yestext="確定"/>
</notification>
<notification name="GroupLeaveConfirmMember">
- ä½ ç›®å‰æ˜¯ [GROUP] 群組的æˆå“¡ã€‚
+ ä½ ç›®å‰æ˜¯ &lt;nolink&gt;[GROUP]&lt;/nolink&gt; 群組的æˆå“¡ã€‚
是å¦è¦é›¢é–‹ç¾¤çµ„?
<usetemplate name="okcancelbuttons" notext="å–æ¶ˆ" yestext="確定"/>
</notification>
@@ -1457,7 +1457,7 @@ Chat and instant messages will be hidden. Instant messages will get your Busy mo
<notification name="JoinedTooManyGroupsMember">
You have reached your maximum number of groups. Please leave another group before joining this one, or decline the offer.
[NAME] has invited you to join a group as a member.
- <usetemplate name="okcancelbuttons" notext="Decline" yestext="加入"/>
+ <usetemplate name="okcancelbuttons" notext="è¬çµ•" yestext="加入"/>
</notification>
<notification name="JoinedTooManyGroups">
You have reached your maximum number of groups. Please leave some group before joining or creating a new one.
@@ -1509,12 +1509,12 @@ Chat and instant messages will be hidden. Instant messages will get your Busy mo
Just like in real life, it takes a while for everyone to learn about a new name. Please allow several days for [http://wiki.secondlife.com/wiki/Setting_your_display_name your name to update] in objects, scripts, search, etc.
</notification>
<notification name="SetDisplayNameBlocked">
- Sorry, you cannot change your display name. If you feel this is in error, please contact support.
+ 抱歉,你ä¸å¯ä»¥è®Šæ›´ä½ çš„顯示å稱。如果你覺得這是錯誤,請連繫支æ´å» å•†ã€‚
</notification>
<notification name="SetDisplayNameFailedLength">
- Sorry, that name is too long. Display names can have a maximum of [LENGTH] characters.
+ 抱歉,這å稱太長。顯示å稱最大長度為 [LENGTH] 字元。
-Please try a shorter name.
+請嘗試短一些的å稱。
</notification>
<notification name="SetDisplayNameFailedGeneric">
Sorry, we could not set your display name. Please try again later.
@@ -1890,7 +1890,7 @@ Move the inventory item(s)?
</notification>
<notification name="ConfirmQuit">
你確定你è¦çµæŸé€€å‡ºï¼Ÿ
- <usetemplate ignoretext="ç•¶æˆ‘çµæŸé€€å‡ºæ™‚進行確èª" name="okcancelignore" notext="ä¸çµæŸé€€å‡º" yestext="çµæŸé€€å‡º"/>
+ <usetemplate ignoretext="ç•¶æˆ‘çµæŸé€€å‡ºæ™‚進行確èª" name="okcancelignore" notext="ä¸è¦çµæŸé€€å‡º" yestext="çµæŸé€€å‡º"/>
</notification>
<notification name="DeleteItems">
[QUESTION]
@@ -1941,11 +1941,11 @@ Linden Lab
The following required components are missing from [FLOATER]:
[COMPONENTS]
</notification>
- <notification label="Replace Existing Attachment" name="ReplaceAttachment">
+ <notification label="å–ä»£ç¾æœ‰çš„附件" name="ReplaceAttachment">
There is already an object attached to this point on your body.
Do you want to replace it with the selected object?
<form name="form">
- <ignore name="ignore" text="Replace an existing attachment with the selected item"/>
+ <ignore name="ignore" text="ä»¥æ‰€é¸æ“‡çš„物å“å–ä»£ç¾æœ‰çš„附加物"/>
<button ignore="自動å–代" name="Yes" text="確定"/>
<button ignore="絕ä¸å–代" name="No" text="å–æ¶ˆ"/>
</form>
@@ -2109,10 +2109,10 @@ Link to this from a web page to give others easy access to this location, or try
Topic: [SUBJECT], Message: [MESSAGE]
</notification>
<notification name="FriendOnline">
- [NAME] is Online
+ &lt;nolink&gt;[NAME]&lt;/nolink&gt; 上線
</notification>
<notification name="FriendOffline">
- [NAME] is Offline
+ &lt;nolink&gt;[NAME]&lt;/nolink&gt; 離線
</notification>
<notification name="AddSelfFriend">
Although you&apos;re very nice, you can&apos;t add yourself as a friend.
@@ -2208,7 +2208,7 @@ Please select a single object.
[NAME] 接收到你æä¾›çš„æ”¶ç´å€ç‰©å“。
</notification>
<notification name="InventoryDeclined">
- [NAME] 拒絕你æä¾›çš„æ”¶ç´å€ç‰©å“。
+ [NAME] è¬çµ•ä½ æä¾›çš„æ”¶ç´å€ç‰©å“。
</notification>
<notification name="ObjectMessage">
[NAME]: [MESSAGE]
@@ -2418,7 +2418,7 @@ Please try again in a few moments.
</notification>
<notification name="ObjectGiveItem">
An object named &lt;nolink&gt;[OBJECTFROMNAME]&lt;/nolink&gt; owned by [NAME_SLURL] has given you this [OBJECTTYPE]:
-&lt;nolink&gt;[ITEM_SLURL]&lt;/nolink&gt;
+[ITEM_SLURL]
<form name="form">
<button name="Keep" text="Keep"/>
<button name="Discard" text="Discard"/>
@@ -2443,7 +2443,7 @@ Please try again in a few moments.
[MESSAGE]
<form name="form">
<button name="Join" text="加入"/>
- <button name="Decline" text="Decline"/>
+ <button name="Decline" text="è¬çµ•"/>
<button name="Info" text="資訊"/>
</form>
</notification>
@@ -2475,7 +2475,7 @@ Please try again in a few moments.
(By default, you will be able to see each other&apos;s online status.)
<form name="form">
<button name="Accept" text="接å—"/>
- <button name="Decline" text="Decline"/>
+ <button name="Decline" text="è¬çµ•"/>
</form>
</notification>
<notification name="FriendshipOffered">
@@ -2487,27 +2487,27 @@ Please try again in a few moments.
(By default, you will be able to see each other&apos;s online status.)
<form name="form">
<button name="Accept" text="接å—"/>
- <button name="Decline" text="Decline"/>
+ <button name="Decline" text="è¬çµ•"/>
</form>
</notification>
<notification name="FriendshipAccepted">
- [NAME] accepted your friendship offer.
+ &lt;nolink&gt;[NAME]&lt;/nolink&gt; accepted your friendship offer.
</notification>
<notification name="FriendshipDeclined">
- [NAME] declined your friendship offer.
+ &lt;nolink&gt;[NAME]&lt;/nolink&gt; è¬çµ•你的交å‹é‚€è«‹ã€‚
</notification>
<notification name="FriendshipAcceptedByMe">
- Friendship offer accepted.
+ 交å‹é‚€è«‹è¢«æŽ¥å—。
</notification>
<notification name="FriendshipDeclinedByMe">
- Friendship offer declined.
+ 交å‹é‚€è«‹è¢«è¬çµ•。
</notification>
<notification name="OfferCallingCard">
[NAME] is offering their calling card.
This will add a bookmark in your inventory so you can quickly IM this Resident.
<form name="form">
<button name="Accept" text="接å—"/>
- <button name="Decline" text="Decline"/>
+ <button name="Decline" text="è¬çµ•"/>
</form>
</notification>
<notification name="RegionRestartMinutes">
@@ -2559,7 +2559,7 @@ Grant this request?
<form name="form">
<button name="Grant" text="Grant"/>
<button name="Deny" text="Deny"/>
- <button name="Details" text="Details..."/>
+ <button name="Details" text="細節..."/>
</form>
</notification>
<notification name="ScriptDialog">
@@ -2602,7 +2602,7 @@ Things you build here will be deleted after you leave, so don&apos;t forget to r
Click Accept to join the call or Decline to decline the invitation. Click Block to block this caller.
<form name="form">
<button name="Accept" text="接å—"/>
- <button name="Decline" text="Decline"/>
+ <button name="Decline" text="è¬çµ•"/>
<button name="Mute" text="Block"/>
</form>
</notification>
@@ -2620,7 +2620,7 @@ Click Accept to join the call or Decline to decline the invitation. Click Block
Click Accept to join the call or Decline to decline the invitation. Click Block to block this caller.
<form name="form">
<button name="Accept" text="接å—"/>
- <button name="Decline" text="Decline"/>
+ <button name="Decline" text="è¬çµ•"/>
<button name="Mute" text="Block"/>
</form>
</notification>
@@ -2629,7 +2629,7 @@ Click Accept to join the call or Decline to decline the invitation. Click Block
Click Accept to join the call or Decline to decline the invitation. Click Block to block this caller.
<form name="form">
<button name="Accept" text="接å—"/>
- <button name="Decline" text="Decline"/>
+ <button name="Decline" text="è¬çµ•"/>
<button name="Mute" text="Block"/>
</form>
</notification>
@@ -2638,7 +2638,7 @@ Click Accept to join the call or Decline to decline the invitation. Click Block
Click Accept to join the chat or Decline to decline the invitation. Click Block to block this caller.
<form name="form">
<button name="Accept" text="接å—"/>
- <button name="Decline" text="Decline"/>
+ <button name="Decline" text="è¬çµ•"/>
<button name="Mute" text="Block"/>
</form>
</notification>
@@ -2757,10 +2757,10 @@ With the following Residents:
<usetemplate name="okcancelbuttons" notext="å–æ¶ˆ" yestext="確定"/>
</notification>
<notification name="ItemsShared">
- Items successfully shared.
+ 物å“å·²æˆåŠŸåˆ†äº«ã€‚
</notification>
<notification name="DeedToGroupFail">
- Deed to group failed.
+ 讓渡給群組失敗。
</notification>
<notification name="AvatarRezNotification">
( [EXISTENCE] seconds alive )
@@ -2822,7 +2822,7 @@ You uploaded a [RESOLUTION] baked texture for &apos;[BODYREGION]&apos; after [TI
You locally updated a [RESOLUTION] baked texture for &apos;[BODYREGION]&apos; after [TIME] seconds.
</notification>
<notification name="ConfirmLeaveCall">
- Are you sure you want to leave this call?
+ 你確定è¦é›¢é–‹é€™æ®µé€šè©±ï¼Ÿ
<usetemplate ignoretext="æˆ‘çµæŸé€šè©±å‰é€²è¡Œç¢ºèª" name="okcancelignore" notext="å¦" yestext="是"/>
</notification>
<notification name="ConfirmMuteAll">
@@ -2846,7 +2846,7 @@ Click on the up arrow to see the voice control panel.
Hiding the Speak button will disable the voice feature.
</notification>
- <notification label="Explore the World" name="HintDestinationGuide">
+ <notification label="探索世界" name="HintDestinationGuide">
The Destination Guide contains thousands of new places to discover. Select a location and choose Teleport to start exploring.
</notification>
<notification label="å´é‚Šæ¬„" name="HintSidePanel">
@@ -2862,7 +2862,7 @@ Click anywhere on the ground to walk to that spot.
2. Click and Drag to Rotate View
Click and drag anywhere on the world to rotate your view
</notification>
- <notification label="Display Name" name="HintDisplayName">
+ <notification label="顯示å稱" name="HintDisplayName">
Set your customizable display name here. This is in addition to your unique username, which can&apos;t be changed. You can change how you see other people&apos;s names in your preferences.
</notification>
<notification label="View" name="HintView">
@@ -2871,7 +2871,7 @@ Click and drag anywhere on the world to rotate your view
<notification label="æ”¶ç´å€" name="HintInventory">
Check your inventory to find items. Newest items can be easily found in the Recent tab.
</notification>
- <notification label="You&apos;ve got Linden Dollars!" name="HintLindenDollar">
+ <notification label="你得到林登幣!" name="HintLindenDollar">
Here&apos;s your current balance of L$. Click Buy L$ to purchase more Linden Dollars.
</notification>
<notification name="PopupAttempt">
@@ -2892,38 +2892,38 @@ Click and drag anywhere on the world to rotate your view
</notification>
<notification label="" name="ModeChange">
改變劉覽器模å¼è¦æ±‚ä½ å¿…é ˆçµæŸé€€å‡ºä¸¦é‡æ–°å•Ÿå‹•。
- <usetemplate name="okcancelbuttons" notext="ä¸çµæŸé€€å‡º" yestext="çµæŸé€€å‡º"/>
+ <usetemplate name="okcancelbuttons" notext="ä¸è¦çµæŸé€€å‡º" yestext="çµæŸé€€å‡º"/>
</notification>
<notification label="" name="NoClassifieds">
Creation and editing of Classifieds is only available in Advanced mode. Would you like to quit and change modes? The mode selector can be found on the login screen.
- <usetemplate name="okcancelbuttons" notext="ä¸çµæŸé€€å‡º" yestext="çµæŸé€€å‡º"/>
+ <usetemplate name="okcancelbuttons" notext="ä¸è¦çµæŸé€€å‡º" yestext="çµæŸé€€å‡º"/>
</notification>
<notification label="" name="NoGroupInfo">
Creation and editing of Groups is only available in Advanced mode. Would you like to quit and change modes? The mode selector can be found on the login screen.
- <usetemplate name="okcancelbuttons" notext="ä¸çµæŸé€€å‡º" yestext="çµæŸé€€å‡º"/>
+ <usetemplate name="okcancelbuttons" notext="ä¸è¦çµæŸé€€å‡º" yestext="çµæŸé€€å‡º"/>
</notification>
<notification label="" name="NoPicks">
Creation and editing of Picks is only available in Advanced mode. Would you like to quit and change modes? The mode selector can be found on the login screen.
- <usetemplate name="okcancelbuttons" notext="ä¸çµæŸé€€å‡º" yestext="çµæŸé€€å‡º"/>
+ <usetemplate name="okcancelbuttons" notext="ä¸è¦çµæŸé€€å‡º" yestext="çµæŸé€€å‡º"/>
</notification>
<notification label="" name="NoWorldMap">
Viewing of the world map is only available in Advanced mode. Would you like to quit and change modes? The mode selector can be found on the login screen.
- <usetemplate name="okcancelbuttons" notext="ä¸çµæŸé€€å‡º" yestext="çµæŸé€€å‡º"/>
+ <usetemplate name="okcancelbuttons" notext="ä¸è¦çµæŸé€€å‡º" yestext="çµæŸé€€å‡º"/>
</notification>
<notification label="" name="NoVoiceCall">
Voice calls are only available in Advanced mode. Would you like to logout and change modes?
- <usetemplate name="okcancelbuttons" notext="ä¸çµæŸé€€å‡º" yestext="çµæŸé€€å‡º"/>
+ <usetemplate name="okcancelbuttons" notext="ä¸è¦çµæŸé€€å‡º" yestext="çµæŸé€€å‡º"/>
</notification>
<notification label="" name="NoAvatarShare">
Sharing is only available in Advanced mode. Would you like to logout and change modes?
- <usetemplate name="okcancelbuttons" notext="ä¸çµæŸé€€å‡º" yestext="çµæŸé€€å‡º"/>
+ <usetemplate name="okcancelbuttons" notext="ä¸è¦çµæŸé€€å‡º" yestext="çµæŸé€€å‡º"/>
</notification>
<notification label="" name="NoAvatarPay">
Paying other residents is only available in Advanced mode. Would you like to logout and change modes?
- <usetemplate name="okcancelbuttons" notext="ä¸çµæŸé€€å‡º" yestext="çµæŸé€€å‡º"/>
+ <usetemplate name="okcancelbuttons" notext="ä¸è¦çµæŸé€€å‡º" yestext="çµæŸé€€å‡º"/>
</notification>
<global name="UnsupportedCPU">
- - Your CPU speed does not meet the minimum requirements.
+ - ä½ çš„ CPU é‹ç®—速度未é”到系統最低é…å‚™è¦æ±‚。
</global>
<global name="UnsupportedGLRequirements">
You do not appear to have the proper hardware requirements for [APP_NAME]. [APP_NAME] requires an OpenGL graphics card that has multitexture support. If this is the case, you may want to make sure that you have the latest drivers for your graphics card, and service packs and patches for your operating system.
@@ -2940,7 +2940,7 @@ If you continue to have problems, please visit the [SUPPORT_SITE].
- ä½ çš„é¡¯ç¤ºå¡æœªé”系統最低é…å‚™è¦æ±‚。
</global>
<global name="UnsupportedRAM">
- - Your system memory does not meet the minimum requirements.
+ - ä½ çš„ç³»çµ±è¨˜æ†¶é«”å¡æœªé”系統最低é…å‚™è¦æ±‚。
</global>
<global name="You can only set your &apos;Home Location&apos; on your land or at a mainland Infohub.">
è‹¥ä½ æ“æœ‰ä¸€å¡ŠåœŸåœ°ï¼Œä½ å¯ä»¥æ¨™è¨˜å®ƒæˆç‚ºä½ çš„å®¶çš„ä½ç½®ã€‚
diff --git a/indra/newview/skins/default/xui/zh/panel_bottomtray.xml b/indra/newview/skins/default/xui/zh/panel_bottomtray.xml
index 2b0cd7c0a6..734b83e6cc 100644
--- a/indra/newview/skins/default/xui/zh/panel_bottomtray.xml
+++ b/indra/newview/skins/default/xui/zh/panel_bottomtray.xml
@@ -16,7 +16,7 @@
<bottomtray_button label="移動" name="movement_btn" tool_tip="顯示 / éš±è— ç§»å‹•æŽ§åˆ¶"/>
</layout_panel>
<layout_panel name="cam_panel">
- <bottomtray_button label="View" name="camera_btn" tool_tip="顯示 / éš±è— æ”影機控制"/>
+ <bottomtray_button label="視角" name="camera_btn" tool_tip="顯示 / éš±è— æ”影機控制"/>
</layout_panel>
<layout_panel name="snapshot_panel">
<bottomtray_button name="snapshots" tool_tip="æ‹æ”å¿«ç…§"/>
diff --git a/indra/newview/skins/default/xui/zh/panel_edit_alpha.xml b/indra/newview/skins/default/xui/zh/panel_edit_alpha.xml
index 6b17302bf1..eda4e99a13 100644
--- a/indra/newview/skins/default/xui/zh/panel_edit_alpha.xml
+++ b/indra/newview/skins/default/xui/zh/panel_edit_alpha.xml
@@ -2,11 +2,11 @@
<panel name="edit_alpha_panel">
<scroll_container name="avatar_alpha_color_panel_scroll">
<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="眼ç›åŠé€æ˜Ž" name="Eye Alpha" tool_tip="點擊以挑é¸åœ–片"/>
- <texture_picker label="é ­é«®åŠé€æ˜Ž" name="Hair Alpha" tool_tip="點擊以挑é¸åœ–片"/>
+ <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="眼ç›åŠé€æ˜Ž" name="Eye Alpha" tool_tip="點擊以挑é¸åœ–åƒ"/>
+ <texture_picker label="é ­é«®åŠé€æ˜Ž" name="Hair Alpha" tool_tip="點擊以挑é¸åœ–åƒ"/>
</panel>
</scroll_container>
</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_edit_eyes.xml b/indra/newview/skins/default/xui/zh/panel_edit_eyes.xml
index 99e2874319..40dd61971a 100644
--- a/indra/newview/skins/default/xui/zh/panel_edit_eyes.xml
+++ b/indra/newview/skins/default/xui/zh/panel_edit_eyes.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_eyes_panel">
<panel name="avatar_eye_color_panel">
- <texture_picker label="Iris" name="Iris" tool_tip="點擊以挑é¸åœ–片"/>
+ <texture_picker label="Iris" name="Iris" tool_tip="點擊以挑é¸åœ–åƒ"/>
</panel>
<panel name="accordion_panel">
<accordion name="wearable_accordion">
diff --git a/indra/newview/skins/default/xui/zh/panel_edit_gloves.xml b/indra/newview/skins/default/xui/zh/panel_edit_gloves.xml
index 9c542366bc..7b39e33a9b 100644
--- a/indra/newview/skins/default/xui/zh/panel_edit_gloves.xml
+++ b/indra/newview/skins/default/xui/zh/panel_edit_gloves.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_gloves_panel">
<panel name="avatar_gloves_color_panel">
- <texture_picker label="æè³ª" name="Fabric" tool_tip="點擊以挑é¸åœ–片"/>
+ <texture_picker label="æè³ª" name="Fabric" tool_tip="點擊以挑é¸åœ–åƒ"/>
<color_swatch label="Color/Tint" name="Color/Tint" tool_tip="Click to open color picker"/>
</panel>
<panel name="accordion_panel">
diff --git a/indra/newview/skins/default/xui/zh/panel_edit_hair.xml b/indra/newview/skins/default/xui/zh/panel_edit_hair.xml
index d9ddafac3b..a7440093bc 100644
--- a/indra/newview/skins/default/xui/zh/panel_edit_hair.xml
+++ b/indra/newview/skins/default/xui/zh/panel_edit_hair.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_hair_panel">
<panel name="avatar_hair_color_panel">
- <texture_picker label="æè³ª" name="Texture" tool_tip="點擊以挑é¸åœ–片"/>
+ <texture_picker label="æè³ª" name="Texture" tool_tip="點擊以挑é¸åœ–åƒ"/>
</panel>
<panel name="accordion_panel">
<accordion name="wearable_accordion">
diff --git a/indra/newview/skins/default/xui/zh/panel_edit_jacket.xml b/indra/newview/skins/default/xui/zh/panel_edit_jacket.xml
index df85f7deb2..dcef070e2e 100644
--- a/indra/newview/skins/default/xui/zh/panel_edit_jacket.xml
+++ b/indra/newview/skins/default/xui/zh/panel_edit_jacket.xml
@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_jacket_panel">
<panel name="avatar_jacket_color_panel">
- <texture_picker label="上åŠèº«æè³ª" name="Upper Fabric" tool_tip="點擊以挑é¸åœ–片"/>
- <texture_picker label="下åŠèº«æè³ª" name="Lower Fabric" tool_tip="點擊以挑é¸åœ–片"/>
+ <texture_picker label="上åŠèº«æè³ª" name="Upper Fabric" tool_tip="點擊以挑é¸åœ–åƒ"/>
+ <texture_picker label="下åŠèº«æè³ª" name="Lower Fabric" tool_tip="點擊以挑é¸åœ–åƒ"/>
<color_swatch label="Color/Tint" name="Color/Tint" tool_tip="Click to open color picker"/>
</panel>
<panel name="accordion_panel">
diff --git a/indra/newview/skins/default/xui/zh/panel_edit_pants.xml b/indra/newview/skins/default/xui/zh/panel_edit_pants.xml
index 76560256f7..01b875f1bd 100644
--- a/indra/newview/skins/default/xui/zh/panel_edit_pants.xml
+++ b/indra/newview/skins/default/xui/zh/panel_edit_pants.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_pants_panel">
<panel name="avatar_pants_color_panel">
- <texture_picker label="æè³ª" name="Fabric" tool_tip="點擊以挑é¸åœ–片"/>
+ <texture_picker label="æè³ª" name="Fabric" tool_tip="點擊以挑é¸åœ–åƒ"/>
<color_swatch label="Color/Tint" name="Color/Tint" tool_tip="點擊以開啟é¡è‰²æŒ‘é¸å™¨"/>
</panel>
<panel name="accordion_panel">
diff --git a/indra/newview/skins/default/xui/zh/panel_edit_profile.xml b/indra/newview/skins/default/xui/zh/panel_edit_profile.xml
index 2258e51b85..7734c3a417 100644
--- a/indra/newview/skins/default/xui/zh/panel_edit_profile.xml
+++ b/indra/newview/skins/default/xui/zh/panel_edit_profile.xml
@@ -26,9 +26,9 @@
<scroll_container name="profile_scroll">
<panel name="scroll_content_panel">
<panel name="data_panel">
- <text name="display_name_label" value="Display Name:"/>
+ <text name="display_name_label" value="顯示å稱:"/>
<text name="solo_username_label" value="使用者å稱:"/>
- <button name="set_name" tool_tip="Set Display Name"/>
+ <button name="set_name" tool_tip="設定顯示å稱"/>
<text name="user_label" value="使用者å稱:"/>
<panel name="lifes_images_panel">
<panel name="second_life_image_panel">
diff --git a/indra/newview/skins/default/xui/zh/panel_edit_shirt.xml b/indra/newview/skins/default/xui/zh/panel_edit_shirt.xml
index ecfc1e2fad..f8ff76aa9b 100644
--- a/indra/newview/skins/default/xui/zh/panel_edit_shirt.xml
+++ b/indra/newview/skins/default/xui/zh/panel_edit_shirt.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_shirt_panel">
<panel name="avatar_shirt_color_panel">
- <texture_picker label="æè³ª" name="Fabric" tool_tip="點擊以挑é¸åœ–片"/>
+ <texture_picker label="æè³ª" name="Fabric" tool_tip="點擊以挑é¸åœ–åƒ"/>
<color_swatch label="Color/Tint" name="Color/Tint" tool_tip="點擊以開啟é¡è‰²æŒ‘é¸å™¨"/>
</panel>
<panel name="accordion_panel">
diff --git a/indra/newview/skins/default/xui/zh/panel_edit_shoes.xml b/indra/newview/skins/default/xui/zh/panel_edit_shoes.xml
index 675caf9e2e..97e43f5753 100644
--- a/indra/newview/skins/default/xui/zh/panel_edit_shoes.xml
+++ b/indra/newview/skins/default/xui/zh/panel_edit_shoes.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_shoes_panel">
<panel name="avatar_shoes_color_panel">
- <texture_picker label="æè³ª" name="Fabric" tool_tip="點擊以挑é¸åœ–片"/>
+ <texture_picker label="æè³ª" name="Fabric" tool_tip="點擊以挑é¸åœ–åƒ"/>
<color_swatch label="é¡è‰²/色調" name="Color/Tint" tool_tip="點擊以開啟é¡è‰²æŒ‘é¸å™¨"/>
</panel>
<panel name="accordion_panel">
diff --git a/indra/newview/skins/default/xui/zh/panel_edit_skin.xml b/indra/newview/skins/default/xui/zh/panel_edit_skin.xml
index 22f0279060..fdd6d05ca5 100644
--- a/indra/newview/skins/default/xui/zh/panel_edit_skin.xml
+++ b/indra/newview/skins/default/xui/zh/panel_edit_skin.xml
@@ -1,9 +1,9 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_skin_panel">
<panel name="avatar_skin_color_panel">
- <texture_picker label="Head Tattoos" name="Head Tattoos" tool_tip="點擊以挑é¸åœ–片"/>
- <texture_picker label="Upper Tattoos" name="Upper Tattoos" tool_tip="點擊以挑é¸åœ–片"/>
- <texture_picker label="Lower Tattoos" name="Lower Tattoos" tool_tip="點擊以挑é¸åœ–片"/>
+ <texture_picker label="Head Tattoos" name="Head Tattoos" tool_tip="點擊以挑é¸åœ–åƒ"/>
+ <texture_picker label="Upper Tattoos" name="Upper Tattoos" tool_tip="點擊以挑é¸åœ–åƒ"/>
+ <texture_picker label="Lower Tattoos" name="Lower Tattoos" tool_tip="點擊以挑é¸åœ–åƒ"/>
</panel>
<panel name="accordion_panel">
<accordion name="wearable_accordion">
diff --git a/indra/newview/skins/default/xui/zh/panel_edit_skirt.xml b/indra/newview/skins/default/xui/zh/panel_edit_skirt.xml
index 5c46f94fe9..10432c16b1 100644
--- a/indra/newview/skins/default/xui/zh/panel_edit_skirt.xml
+++ b/indra/newview/skins/default/xui/zh/panel_edit_skirt.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_skirt_panel">
<panel name="avatar_skirt_color_panel">
- <texture_picker label="æè³ª" name="Fabric" tool_tip="點擊以挑é¸åœ–片"/>
+ <texture_picker label="æè³ª" name="Fabric" tool_tip="點擊以挑é¸åœ–åƒ"/>
<color_swatch label="Color/Tint" name="Color/Tint" tool_tip="點擊以開啟é¡è‰²æŒ‘é¸å™¨"/>
</panel>
<panel name="accordion_panel">
diff --git a/indra/newview/skins/default/xui/zh/panel_edit_socks.xml b/indra/newview/skins/default/xui/zh/panel_edit_socks.xml
index 09c888f226..6727781740 100644
--- a/indra/newview/skins/default/xui/zh/panel_edit_socks.xml
+++ b/indra/newview/skins/default/xui/zh/panel_edit_socks.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_socks_panel">
<panel name="avatar_socks_color_panel">
- <texture_picker label="æè³ª" name="Fabric" tool_tip="點擊以挑é¸åœ–片"/>
+ <texture_picker label="æè³ª" name="Fabric" tool_tip="點擊以挑é¸åœ–åƒ"/>
<color_swatch label="Color/Tint" name="Color/Tint" tool_tip="點擊以開啟é¡è‰²æŒ‘é¸å™¨"/>
</panel>
<panel name="accordion_panel">
diff --git a/indra/newview/skins/default/xui/zh/panel_edit_tattoo.xml b/indra/newview/skins/default/xui/zh/panel_edit_tattoo.xml
index 946f8b22dc..1b34a0e0ee 100644
--- a/indra/newview/skins/default/xui/zh/panel_edit_tattoo.xml
+++ b/indra/newview/skins/default/xui/zh/panel_edit_tattoo.xml
@@ -1,9 +1,9 @@
<?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="Head Tattoo" tool_tip="點擊以挑é¸åœ–åƒ"/>
<texture_picker label="上åŠèº«åˆºé’" name="Upper Tattoo" tool_tip="點擊以挑é¸ç…§ç‰‡"/>
- <texture_picker label="下åŠèº«åˆºé’" name="Lower Tattoo" tool_tip="點擊以挑é¸åœ–片"/>
+ <texture_picker label="下åŠèº«åˆºé’" name="Lower Tattoo" tool_tip="點擊以挑é¸åœ–åƒ"/>
<color_swatch label="Color/Tint" name="Color/Tint" tool_tip="點擊以開啟é¡è‰²æŒ‘é¸å™¨"/>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_edit_underpants.xml b/indra/newview/skins/default/xui/zh/panel_edit_underpants.xml
index 82ab70bafc..15cae8d233 100644
--- a/indra/newview/skins/default/xui/zh/panel_edit_underpants.xml
+++ b/indra/newview/skins/default/xui/zh/panel_edit_underpants.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_underpants_panel">
<panel name="avatar_underpants_color_panel">
- <texture_picker label="æè³ª" name="Fabric" tool_tip="點擊以挑é¸åœ–片"/>
+ <texture_picker label="æè³ª" name="Fabric" tool_tip="點擊以挑é¸åœ–åƒ"/>
<color_swatch label="Color/Tint" name="Color/Tint" tool_tip="Click to open color picker"/>
</panel>
<panel name="accordion_panel">
diff --git a/indra/newview/skins/default/xui/zh/panel_edit_undershirt.xml b/indra/newview/skins/default/xui/zh/panel_edit_undershirt.xml
index b284668777..486175eb64 100644
--- a/indra/newview/skins/default/xui/zh/panel_edit_undershirt.xml
+++ b/indra/newview/skins/default/xui/zh/panel_edit_undershirt.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_undershirt_panel">
<panel name="avatar_undershirt_color_panel">
- <texture_picker label="æè³ª" name="Fabric" tool_tip="點擊以挑é¸åœ–片"/>
+ <texture_picker label="æè³ª" name="Fabric" tool_tip="點擊以挑é¸åœ–åƒ"/>
<color_swatch label="Color/Tint" name="Color/Tint" tool_tip="Click to open Color Picker"/>
</panel>
<panel name="accordion_panel">
diff --git a/indra/newview/skins/default/xui/zh/panel_group_general.xml b/indra/newview/skins/default/xui/zh/panel_group_general.xml
index f70fbf22a8..55cbf5a617 100644
--- a/indra/newview/skins/default/xui/zh/panel_group_general.xml
+++ b/indra/newview/skins/default/xui/zh/panel_group_general.xml
@@ -12,7 +12,7 @@ Hover your mouse over the options for more help.
Retrieving member data
</panel.string>
<panel name="group_info_top">
- <texture_picker label="" name="insignia" tool_tip="點擊以挑é¸åœ–片"/>
+ <texture_picker label="" name="insignia" tool_tip="點擊以挑é¸åœ–åƒ"/>
<text name="prepend_founded_by">
創辦人:
</text>
@@ -52,6 +52,6 @@ Hover your mouse over the options for more help.
<combo_box.item label="é©åº¦æˆäººå…§å®¹" name="mature"/>
<combo_box.item label="一般普級內容" name="pg"/>
</combo_box>
- <check_box initial_value="true" label="顯示在æœå°‹ä¸­" name="show_in_group_list" tool_tip="Let people see this group in search results"/>
+ <check_box initial_value="true" label="顯示在æœå°‹ä¸­" name="show_in_group_list" tool_tip="讓其他人å¯ä»¥åœ¨æœå°‹çµæžœä¸­çœ‹åˆ°é€™å€‹ç¾¤çµ„"/>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_group_land_money.xml b/indra/newview/skins/default/xui/zh/panel_group_land_money.xml
index 1bf3929683..5ac7410c8b 100644
--- a/indra/newview/skins/default/xui/zh/panel_group_land_money.xml
+++ b/indra/newview/skins/default/xui/zh/panel_group_land_money.xml
@@ -52,7 +52,7 @@
m²
</text>
<text name="your_contribution_max_value">
- ([AMOUNT] max)
+ ([AMOUNT] 最大)
</text>
<text name="group_over_limit_text">
More land credits are needed to support land in use
@@ -67,14 +67,14 @@
載入中...
</text_editor>
</panel>
- <panel label="DETAILS" name="group_money_details_tab">
+ <panel label="細節" name="group_money_details_tab">
<text_editor name="group_money_details_text">
載入中...
</text_editor>
<button name="earlier_details_button" tool_tip="Back"/>
<button name="later_details_button" tool_tip="Next"/>
</panel>
- <panel label="SALES" name="group_money_sales_tab">
+ <panel label="銷售" name="group_money_sales_tab">
<text_editor name="group_money_sales_text">
載入中...
</text_editor>
diff --git a/indra/newview/skins/default/xui/zh/panel_main_inventory.xml b/indra/newview/skins/default/xui/zh/panel_main_inventory.xml
index f7dada226f..53ecf3eb19 100644
--- a/indra/newview/skins/default/xui/zh/panel_main_inventory.xml
+++ b/indra/newview/skins/default/xui/zh/panel_main_inventory.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Things" name="main inventory panel">
+<panel label="事物" name="main inventory panel">
<panel.string name="ItemcountFetching">
Fetching [ITEM_COUNT] Items... [FILTER]
</panel.string>
diff --git a/indra/newview/skins/default/xui/zh/panel_media_settings_general.xml b/indra/newview/skins/default/xui/zh/panel_media_settings_general.xml
index 3e44f2a584..321c003acd 100644
--- a/indra/newview/skins/default/xui/zh/panel_media_settings_general.xml
+++ b/indra/newview/skins/default/xui/zh/panel_media_settings_general.xml
@@ -17,8 +17,8 @@
<button label="é‡è¨­" name="current_url_reset_btn"/>
<check_box initial_value="false" label="Auto Loop" name="auto_loop"/>
<check_box initial_value="false" label="First Click Interacts" name="first_click_interact"/>
- <check_box initial_value="false" label="Auto Zoom" name="auto_zoom"/>
- <check_box initial_value="false" label="Auto Play Media" name="auto_play"/>
+ <check_box initial_value="false" label="自動縮放" name="auto_zoom"/>
+ <check_box initial_value="false" label="自動播放媒體" name="auto_play"/>
<text name="media_setting_note">
Note: Residents can override this setting
</text>
diff --git a/indra/newview/skins/default/xui/zh/panel_media_settings_permissions.xml b/indra/newview/skins/default/xui/zh/panel_media_settings_permissions.xml
index ec62b61c54..173edc76f6 100644
--- a/indra/newview/skins/default/xui/zh/panel_media_settings_permissions.xml
+++ b/indra/newview/skins/default/xui/zh/panel_media_settings_permissions.xml
@@ -14,16 +14,16 @@
<text name="owner_label">
æ“æœ‰è€…
</text>
- <check_box initial_value="false" label="Allow Navigation &amp; Interactivity" name="perms_owner_interact"/>
+ <check_box initial_value="false" label="å…許導航與互動" name="perms_owner_interact"/>
<check_box initial_value="false" label="顯示控制列" name="perms_owner_control"/>
<text name="group_label">
群組:
</text>
- <check_box initial_value="false" label="Allow Navigation &amp; Interactivity" name="perms_group_interact"/>
+ <check_box initial_value="false" label="å…許導航與互動" name="perms_group_interact"/>
<check_box initial_value="false" label="顯示控制列" name="perms_group_control"/>
<text name="anyone_label">
任何人
</text>
- <check_box initial_value="false" label="Allow Navigation &amp; Interactivity" name="perms_anyone_interact"/>
+ <check_box initial_value="false" label="å…許導航與互動" name="perms_anyone_interact"/>
<check_box initial_value="false" label="顯示控制列" name="perms_anyone_control"/>
</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_my_profile.xml b/indra/newview/skins/default/xui/zh/panel_my_profile.xml
deleted file mode 100644
index e26ccdef73..0000000000
--- a/indra/newview/skins/default/xui/zh/panel_my_profile.xml
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="檔案" name="panel_profile">
- <string name="CaptionTextAcctInfo">
- [ACCTTYPE]
-[PAYMENTINFO] [AGEVERIFICATION]
- </string>
- <string name="payment_update_link_url">
- http://www.secondlife.com/account/billing.php?lang=en
- </string>
- <string name="partner_edit_link_url">
- http://www.secondlife.com/account/partners.php?lang=en
- </string>
- <string name="my_account_link_url" value="http://secondlife.com/account"/>
- <string name="no_partner_text" value="ç„¡"/>
- <string name="no_group_text" value="ç„¡"/>
- <string name="RegisterDateFormat">
- [REG_DATE] ([AGE])
- </string>
- <string name="name_text_args">
- [NAME]
- </string>
- <string name="display_name_text_args">
- [DISPLAY_NAME]
- </string>
- <layout_stack name="layout">
- <layout_panel name="profile_stack">
- <scroll_container name="profile_scroll">
- <panel name="scroll_content_panel">
- <panel name="second_life_image_panel">
- <text name="display_name_descr_text">
- User name
- </text>
- <text name="name_descr_text">
- Display Name
- </text>
- <button label="檔案" name="see_profile_btn" tool_tip="察看這ä½åŒ–身的檔案"/>
- </panel>
- </panel>
- </scroll_container>
- </layout_panel>
- </layout_stack>
-</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_notes.xml b/indra/newview/skins/default/xui/zh/panel_notes.xml
deleted file mode 100644
index 5d0e6760ff..0000000000
--- a/indra/newview/skins/default/xui/zh/panel_notes.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Notes &amp; Privacy" name="panel_notes">
- <layout_stack name="layout">
- <layout_panel name="notes_stack">
- <scroll_container name="profile_scroll">
- <panel name="profile_scroll_panel">
- <text name="status_message" value="My private notes:"/>
- <text name="status_message2" value="å…許這個人å¯ä»¥ï¼š"/>
- <check_box label="看到我上線狀態" name="status_check"/>
- <check_box label="在地圖上看見我" name="map_check"/>
- <check_box label="邊輯,刪除或å–下我的物件" name="objects_check"/>
- </panel>
- </scroll_container>
- </layout_panel>
- <layout_panel name="notes_buttons_panel">
- <layout_stack name="bottom_bar_ls">
- <layout_panel name="add_friend_btn_lp">
- <button label="加為朋å‹" name="add_friend" tool_tip="Offer friendship to the Resident"/>
- </layout_panel>
- <layout_panel name="im_btn_lp">
- <button label="IM" name="im" tool_tip="é–‹å•Ÿå³æ™‚è¨Šæ¯æœƒè©±"/>
- </layout_panel>
- <layout_panel name="call_btn_lp">
- <button label="通話" name="call" tool_tip="與這ä½å±…民通話"/>
- </layout_panel>
- <layout_panel name="show_on_map_btn_lp">
- <button label="地圖" name="show_on_map_btn" tool_tip="Show the Resident on the map"/>
- </layout_panel>
- <layout_panel name="teleport_btn_lp">
- <button label="瞬間傳é€" name="teleport" tool_tip="發給瞬間傳é€è«‹æ±‚"/>
- </layout_panel>
- </layout_stack>
- </layout_panel>
- </layout_stack>
-</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_outfits_inventory.xml b/indra/newview/skins/default/xui/zh/panel_outfits_inventory.xml
index dfd81a85cc..d9718d8294 100644
--- a/indra/newview/skins/default/xui/zh/panel_outfits_inventory.xml
+++ b/indra/newview/skins/default/xui/zh/panel_outfits_inventory.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Things" name="Outfits">
+<panel label="事物" name="Outfits">
<panel.string name="wear_outfit_tooltip">
ç©¿ä¸Šæ‰€é¸æ“‡çš„è£æ‰®
</panel.string>
diff --git a/indra/newview/skins/default/xui/zh/panel_people.xml b/indra/newview/skins/default/xui/zh/panel_people.xml
index c97ff2ae96..9c265622fa 100644
--- a/indra/newview/skins/default/xui/zh/panel_people.xml
+++ b/indra/newview/skins/default/xui/zh/panel_people.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- Side tray panel -->
-<panel label="People" name="people_panel">
+<panel label="人群" name="people_panel">
<string name="no_recent_people" value="No recent people. Looking for people to hang out with? Try [secondlife:///app/search/people Search] or the [secondlife:///app/worldmap World Map]."/>
<string name="no_filtered_recent_people" value="Didn&apos;t find what you&apos;re looking for? Try [secondlife:///app/search/people/[SEARCH_TERM] Search]."/>
<string name="no_one_near" value="No one nearby. Looking for people to hang out with? Try [secondlife:///app/search/people Search] or the [secondlife:///app/worldmap World Map]."/>
diff --git a/indra/newview/skins/default/xui/zh/panel_place_profile.xml b/indra/newview/skins/default/xui/zh/panel_place_profile.xml
index d7bcb0d027..1772b65434 100644
--- a/indra/newview/skins/default/xui/zh/panel_place_profile.xml
+++ b/indra/newview/skins/default/xui/zh/panel_place_profile.xml
@@ -66,7 +66,7 @@
<text name="build_value" value="On"/>
<text name="scripts_label" value="腳本:"/>
<text name="scripts_value" value="On"/>
- <text name="damage_label" value="商害:"/>
+ <text name="damage_label" value="傷害:"/>
<text name="damage_value" value="Off"/>
<button label="關於土地" name="about_land_btn"/>
</panel>
@@ -102,11 +102,11 @@
<text name="sales_price_label" value="價格:"/>
<text name="area_label" value="é¢ç©ï¼š"/>
<text name="traffic_label" value="æµé‡ï¼š"/>
- <text name="primitives_label" value="Primitives:"/>
+ <text name="primitives_label" value="幾何元件:"/>
<text name="parcel_scripts_label" value="腳本:"/>
<text name="terraform_limits_label" value="土地變形é™åˆ¶ï¼š"/>
<text name="subdivide_label" value="分割土地/åˆä½µåœŸåœ°èƒ½åŠ›ï¼š"/>
- <text name="resale_label" value="ReSale ability:"/>
+ <text name="resale_label" value="轉售能力:"/>
<text name="sale_to_label" value="出售給:"/>
</panel>
</accordion_tab>
diff --git a/indra/newview/skins/default/xui/zh/panel_preferences_chat.xml b/indra/newview/skins/default/xui/zh/panel_preferences_chat.xml
index c083d40a82..738c77fd08 100644
--- a/indra/newview/skins/default/xui/zh/panel_preferences_chat.xml
+++ b/indra/newview/skins/default/xui/zh/panel_preferences_chat.xml
@@ -30,7 +30,7 @@
<spinner label="Nearby chat toasts life time:" name="nearby_toasts_lifetime"/>
<spinner label="Nearby chat toasts fading time:" name="nearby_toasts_fadingtime"/>
<text name="translate_chb_label">
- èŠå¤©æ™‚使用機器自動進行翻譯(由 Google 所æä¾›ï¼‰
+ èŠå¤©æ™‚使用機器自動進行翻譯
</text>
<text name="translate_language_text">
èŠå¤©ç¿»è­¯ç‚ºï¼š
@@ -50,7 +50,7 @@
<combo_box.item label="РуÑÑкий (Russian)" name="Russian"/>
<combo_box.item label="Türkçe (Turkish)" name="Turkish"/>
<combo_box.item label="УкраїнÑька (Ukrainian)" name="Ukrainian"/>
- <combo_box.item label="中文 (简体) (Chinese)" name="Chinese"/>
+ <combo_box.item label="中文 (正體) (Chinese)" name="Chinese"/>
<combo_box.item label="日本語 (Japanese)" name="Japanese"/>
<combo_box.item label="한국어 (Korean)" name="Korean"/>
</combo_box>
diff --git a/indra/newview/skins/default/xui/zh/panel_preferences_general.xml b/indra/newview/skins/default/xui/zh/panel_preferences_general.xml
index cabe13adb8..6827fab6e6 100644
--- a/indra/newview/skins/default/xui/zh/panel_preferences_general.xml
+++ b/indra/newview/skins/default/xui/zh/panel_preferences_general.xml
@@ -5,16 +5,15 @@
</text>
<combo_box name="language_combobox">
<combo_box.item label="系統é è¨­" name="System Default Language"/>
- <combo_box.item label="英語" name="English"/>
- <combo_box.item label="Dansk (Danish) - Beta" name="Danish"/>
- <combo_box.item label="Deutsch (German) - Beta" name="Deutsch(German)"/>
- <combo_box.item label="Español (Spanish) - Beta" name="Spanish"/>
- <combo_box.item label="Français (French) - Beta" name="French"/>
- <combo_box.item label="Italiano (Italian) - Beta" name="Italian"/>
- <combo_box.item label="Nederlands (Dutch) - Beta" name="Dutch"/>
- <combo_box.item label="Polski (Polish) - Beta" name="Polish"/>
- <combo_box.item label="Português (Portuguese) - Beta" name="Portugese"/>
- <combo_box.item label="日本語 (Japanese) - Beta" name="(Japanese)"/>
+ <combo_box.item label="English (英語)" name="English"/>
+ <combo_box.item label="Dansk (丹麥語) - Beta" name="Danish"/>
+ <combo_box.item label="Deutsch (德語) - Beta" name="Deutsch(German)"/>
+ <combo_box.item label="Español (西ç­ç‰™èªžï¼‰ - Beta" name="Spanish"/>
+ <combo_box.item label="Français (法語) - Beta" name="French"/>
+ <combo_box.item label="Italiano (義大利語) - Beta" name="Italian"/>
+ <combo_box.item label="Polski (波蘭語) - Beta" name="Polish"/>
+ <combo_box.item label="Português (葡è„牙語) - Beta" name="Portugese"/>
+ <combo_box.item label="日本語 (日語) - Beta" name="(Japanese)"/>
</combo_box>
<text name="language_textbox2">
ï¼ˆé ˆé‡æ–°å•Ÿå‹•)
diff --git a/indra/newview/skins/default/xui/zh/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/zh/panel_preferences_graphics1.xml
index ee8cd9794a..874fb6b218 100644
--- a/indra/newview/skins/default/xui/zh/panel_preferences_graphics1.xml
+++ b/indra/newview/skins/default/xui/zh/panel_preferences_graphics1.xml
@@ -47,14 +47,14 @@
<text name="DrawDistanceMeterText2">
m
</text>
- <slider label="Max. particle count:" name="MaxParticleCount"/>
+ <slider label="æœ€å¤§ç²’å­æ•ˆæžœæ•¸é‡ï¼š" name="MaxParticleCount"/>
<slider label="Max. # of non-impostor avatars:" name="MaxNumberAvatarDrawn"/>
<slider label="後製å“質:" name="RenderPostProcess"/>
<text name="MeshDetailText">
ç¶²é¢ç´°ç¯€ï¼š
</text>
<slider label="物件:" name="ObjectMeshDetail"/>
- <slider label="Flexiprims:" name="FlexibleMeshDetail"/>
+ <slider label="彈性幾何元件:" name="FlexibleMeshDetail"/>
<slider label="樹木:" name="TreeMeshDetail"/>
<slider label="化身:" name="AvatarMeshDetail"/>
<slider label="地形:" name="TerrainMeshDetail"/>
diff --git a/indra/newview/skins/default/xui/zh/panel_preferences_move.xml b/indra/newview/skins/default/xui/zh/panel_preferences_move.xml
index 57e3540b3d..ce176b1e3c 100644
--- a/indra/newview/skins/default/xui/zh/panel_preferences_move.xml
+++ b/indra/newview/skins/default/xui/zh/panel_preferences_move.xml
@@ -15,7 +15,7 @@
<check_box label="å轉" name="invert_mouse"/>
<check_box label="總是使用方å‘éµç§»å‹•" name="arrow_keys_move_avatar_check"/>
<check_box label="連點按ä½å¾Œè·‘æ­¥" name="tap_tap_hold_to_run"/>
- <check_box label="雙擊以D:" name="double_click_chkbox"/>
+ <check_box label="雙擊以:" name="double_click_chkbox"/>
<radio_group name="double_click_action">
<radio_item label="瞬間傳é€" name="radio_teleport"/>
<radio_item label="自動導航駕駛" name="radio_autopilot"/>
diff --git a/indra/newview/skins/default/xui/zh/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/zh/panel_preferences_privacy.xml
index bd6d465572..07fdfd87e3 100644
--- a/indra/newview/skins/default/xui/zh/panel_preferences_privacy.xml
+++ b/indra/newview/skins/default/xui/zh/panel_preferences_privacy.xml
@@ -8,7 +8,7 @@
(ä½ç½®ã€åœ–åƒã€ç¶²é ã€æœå°‹çš„æ­·å²ç´€éŒ„)
</text>
<check_box label="將我顯示在æœå°‹çš„çµæžœä¸­" name="online_searchresults"/>
- <check_box label="åªæœ‰æˆ‘的朋å‹å’Œç¾¤çµ„çŸ¥é“æˆ‘在線上" name="online_visibility"/>
+ <check_box label="åªæœ‰æˆ‘的朋å‹å’Œç¾¤çµ„çŸ¥é“æˆ‘上線" name="online_visibility"/>
<check_box label="åªæœ‰æˆ‘的朋å‹å’Œç¾¤çµ„å¯ä»¥ IM 或與我通話。" name="voice_call_friends_only_check"/>
<check_box label="ç•¶é€šè©±çµæŸæ™‚關閉麥克風" name="auto_disengage_mic_check"/>
<check_box label="登入時顯示我最愛的地標ä½ç½®ï¼ˆç¶“ç”± &apos;é–‹å§‹æ–¼&apos; 的下拉å¼é¸å–®ï¼‰" name="favorites_on_login_check"/>
diff --git a/indra/newview/skins/default/xui/zh/panel_prim_media_controls.xml b/indra/newview/skins/default/xui/zh/panel_prim_media_controls.xml
index 8d0e2a6355..df1a1b73a1 100644
--- a/indra/newview/skins/default/xui/zh/panel_prim_media_controls.xml
+++ b/indra/newview/skins/default/xui/zh/panel_prim_media_controls.xml
@@ -37,28 +37,28 @@
<button name="fwd_btn" tool_tip="Navigate forward"/>
</layout_panel>
<layout_panel name="home">
- <button name="home_btn" tool_tip="Home page"/>
+ <button name="home_btn" tool_tip="首é "/>
</layout_panel>
<layout_panel name="media_stop">
<button name="media_stop_btn" tool_tip="åœæ­¢åª’é«”"/>
</layout_panel>
<layout_panel name="reload">
- <button name="reload_btn" tool_tip="Reload"/>
+ <button name="reload_btn" tool_tip="釿–°è¼‰å…¥"/>
</layout_panel>
<layout_panel name="stop">
- <button name="stop_btn" tool_tip="Stop loading"/>
+ <button name="stop_btn" tool_tip="åœæ­¢è¼‰å…¥"/>
</layout_panel>
<layout_panel name="play">
- <button name="play_btn" tool_tip="Play media"/>
+ <button name="play_btn" tool_tip="播放媒體"/>
</layout_panel>
<layout_panel name="pause">
- <button name="pause_btn" tool_tip="Pause media"/>
+ <button name="pause_btn" tool_tip="æš«åœåª’é«”"/>
</layout_panel>
<layout_panel name="media_address">
- <line_editor name="media_address_url" tool_tip="Media URL"/>
+ <line_editor name="media_address_url" tool_tip="媒體網å€"/>
<layout_stack name="media_address_url_icons">
<layout_panel>
- <icon name="media_whitelist_flag" tool_tip="White List enabled"/>
+ <icon name="media_whitelist_flag" tool_tip="白å單已啟用"/>
</layout_panel>
<layout_panel>
<icon name="media_secure_lock_flag" tool_tip="Secured Browsing"/>
diff --git a/indra/newview/skins/default/xui/zh/panel_profile.xml b/indra/newview/skins/default/xui/zh/panel_profile.xml
deleted file mode 100644
index 502449ac3a..0000000000
--- a/indra/newview/skins/default/xui/zh/panel_profile.xml
+++ /dev/null
@@ -1,67 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="檔案" name="panel_profile">
- <string name="CaptionTextAcctInfo">
- [ACCTTYPE]
-[PAYMENTINFO] [AGEVERIFICATION]
- </string>
- <string name="payment_update_link_url">
- http://www.secondlife.com/account/billing.php?lang=en
- </string>
- <string name="partner_edit_link_url">
- http://www.secondlife.com/account/partners.php?lang=en
- </string>
- <string name="my_account_link_url" value="http://secondlife.com/account"/>
- <string name="no_partner_text" value="ç„¡"/>
- <string name="no_group_text" value="ç„¡"/>
- <string name="RegisterDateFormat">
- [REG_DATE] ([AGE])
- </string>
- <string name="name_text_args">
- [NAME]
- </string>
- <string name="display_name_text_args">
- [DISPLAY_NAME]
- </string>
- <layout_stack name="layout">
- <layout_panel name="profile_stack">
- <scroll_container name="profile_scroll">
- <panel name="profile_scroll_panel">
- <panel name="second_life_image_panel">
- <text name="title_sl_descr_text" value="[SECOND_LIFE]:"/>
- </panel>
- <panel name="first_life_image_panel">
- <text name="title_rw_descr_text" value="真實世界:"/>
- </panel>
- <text name="title_member_text" value="æˆç‚ºå±…民自:"/>
- <text name="title_acc_status_text" value="帳戶狀態:"/>
- <text name="title_partner_text" value="é…å¶ï¼š"/>
- <panel name="partner_data_panel">
- <text initial_value="(檢索中)" name="partner_text"/>
- </panel>
- <text name="title_groups_text" value="群組:"/>
- </panel>
- </scroll_container>
- </layout_panel>
- </layout_stack>
- <layout_stack name="layout_verb_buttons">
- <layout_panel name="profile_buttons_panel">
- <layout_stack name="bottom_bar_ls">
- <layout_panel name="add_friend_btn_lp">
- <button label="加為朋å‹" name="add_friend" tool_tip="發出交å‹é‚€è«‹çµ¦é€™å±…æ°‘"/>
- </layout_panel>
- <layout_panel name="im_btn_lp">
- <button label="IM" name="im" tool_tip="é–‹å•Ÿå³æ™‚è¨Šæ¯æœƒè©±"/>
- </layout_panel>
- <layout_panel name="call_btn_lp">
- <button label="通話" name="call" tool_tip="與這ä½å±…民通話"/>
- </layout_panel>
- <layout_panel name="chat_btn_lp">
- <button label="瞬間傳é€" name="teleport" tool_tip="發給瞬間傳é€è«‹æ±‚"/>
- </layout_panel>
- <layout_panel name="overflow_btn_lp">
- <menu_button label="â–¼" name="overflow_btn" tool_tip="支付金錢,或分享收ç´å€çµ¦å±…æ°‘"/>
- </layout_panel>
- </layout_stack>
- </layout_panel>
- </layout_stack>
-</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_profile_view.xml b/indra/newview/skins/default/xui/zh/panel_profile_view.xml
deleted file mode 100644
index 12fe776e45..0000000000
--- a/indra/newview/skins/default/xui/zh/panel_profile_view.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="panel_target_profile">
- <string name="status_online">
- Online
- </string>
- <string name="status_offline">
- Offline
- </string>
- <text name="display_name_label" value="Display Name:"/>
- <text name="solo_username_label" value="使用者å稱:"/>
- <text name="status" value="Online"/>
- <text name="user_name_small" value="Jack oh look at me this is a super duper long name"/>
- <button name="copy_to_clipboard" tool_tip="覆製到剪貼簿"/>
- <text name="user_label" value="使用者å稱:"/>
- <tab_container name="tabs">
- <panel label="檔案" name="panel_profile"/>
- <panel label="ç²¾é¸åœ°é»ž" name="panel_picks"/>
- <panel label="NOTES &amp; PRIVACY" name="panel_notes"/>
- </tab_container>
-</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_region_general.xml b/indra/newview/skins/default/xui/zh/panel_region_general.xml
index 38fde494aa..a441b8898d 100644
--- a/indra/newview/skins/default/xui/zh/panel_region_general.xml
+++ b/indra/newview/skins/default/xui/zh/panel_region_general.xml
@@ -24,7 +24,7 @@
<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="Let people see this region and its parcels in search results"/>
+ <check_box label="阻擋土地顯示於æœå°‹ä¸­" name="block_parcel_search_check" tool_tip="讓其他人å¯ä»¥åœ¨æœå°‹çµæžœä¸­çœ‹åˆ°é€™å€‹åœ°å€èˆ‡å…¶ä¸­çš„地段"/>
<spinner label="人數上é™" name="agent_limit_spin"/>
<spinner label="Object Bonus" name="object_bonus_spin"/>
<text label="Maturity" name="access_text">
diff --git a/indra/newview/skins/default/xui/zh/panel_region_terrain.xml b/indra/newview/skins/default/xui/zh/panel_region_terrain.xml
index 0622cb4e73..7cae8fe8cf 100644
--- a/indra/newview/skins/default/xui/zh/panel_region_terrain.xml
+++ b/indra/newview/skins/default/xui/zh/panel_region_terrain.xml
@@ -6,14 +6,14 @@
<text name="region_text">
未知
</text>
- <spinner label="Water Height" name="water_height_spin"/>
- <spinner label="Terrain Raise Limit" name="terrain_raise_spin"/>
- <spinner label="Terrain Lower Limit" name="terrain_lower_spin"/>
- <check_box label="Use Estate Sun" name="use_estate_sun_check"/>
- <check_box label="Fixed Sun" name="fixed_sun_check"/>
+ <spinner label="水文高度" name="water_height_spin"/>
+ <spinner label="地形æå‡é™åˆ¶" name="terrain_raise_spin"/>
+ <spinner label="地形é™ä½Žé™åˆ¶" name="terrain_lower_spin"/>
+ <check_box label="使用領地的太陽設定" name="use_estate_sun_check"/>
+ <check_box label="固定太陽" name="fixed_sun_check"/>
<slider label="Phase" name="sun_hour_slider"/>
<button label="套用" name="apply_btn"/>
- <button label="Download RAW terrain..." name="download_raw_btn" tool_tip="Available only to estate owners, not managers"/>
- <button label="上傳 RAW 地形檔..." name="upload_raw_btn" tool_tip="Available only to estate owners, not managers"/>
+ <button label="下載 RAW 地形..." name="download_raw_btn" tool_tip="åªå…è¨±é ˜åœ°æ“æœ‰è€…而éžç®¡ç†è€…進行æ“作"/>
+ <button label="上傳 RAW 地形檔..." name="upload_raw_btn" tool_tip="åªå…è¨±é ˜åœ°æ“æœ‰è€…而éžç®¡ç†è€…進行æ“作"/>
<button label="Bake Terrain" name="bake_terrain_btn" tool_tip="Set current terrain as mid-point for raise/lower limits"/>
</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_script_ed.xml b/indra/newview/skins/default/xui/zh/panel_script_ed.xml
index 1dc7c1e089..cc2b0fc673 100644
--- a/indra/newview/skins/default/xui/zh/panel_script_ed.xml
+++ b/indra/newview/skins/default/xui/zh/panel_script_ed.xml
@@ -4,7 +4,7 @@
載入中...
</panel.string>
<panel.string name="can_not_view">
- ä½ ä¸å¯Ÿçœ‹æˆ–編輯此腳本,自從它被設定為 &quot;no copy&quot; 後。你需è¦å®Œæ•´æ¬Šé™åŽ»å¯Ÿçœ‹æˆ–ç·¨è¼¯æœ‰åŒ…å«è…³æœ¬åœ¨å…§çš„物件。
+ ä½ ä¸èƒ½å¯Ÿçœ‹æˆ–編輯此腳本,自從它被設定為 &quot;no copy&quot; 後。你需è¦å®Œæ•´æ¬Šé™åŽ»å¯Ÿçœ‹æˆ–ç·¨è¼¯æœ‰åŒ…å«è…³æœ¬åœ¨å…§çš„物件。
</panel.string>
<panel.string name="public_objects_can_not_run">
公開物件ä¸èƒ½åŸ·è¡Œè…³æœ¬
diff --git a/indra/newview/skins/default/xui/zh/panel_side_tray.xml b/indra/newview/skins/default/xui/zh/panel_side_tray.xml
index b706f1839a..e5c7deb7d6 100644
--- a/indra/newview/skins/default/xui/zh/panel_side_tray.xml
+++ b/indra/newview/skins/default/xui/zh/panel_side_tray.xml
@@ -11,7 +11,7 @@
<panel label="自己" name="panel_me"/>
</panel_container>
</sidetray_tab>
- <sidetray_tab description="Find your friends, contacts and people nearby." name="sidebar_people" tab_title="People">
+ <sidetray_tab description="Find your friends, contacts and people nearby." name="sidebar_people" tab_title="人群">
<panel_container name="panel_container">
<panel label="群組檔案" name="panel_group_info_sidetray"/>
<panel label="Blocked Residents &amp; Objects" name="panel_block_list_sidetray"/>
diff --git a/indra/newview/skins/default/xui/zh/role_actions.xml b/indra/newview/skins/default/xui/zh/role_actions.xml
index d5c3096b22..32bf0d22d8 100644
--- a/indra/newview/skins/default/xui/zh/role_actions.xml
+++ b/indra/newview/skins/default/xui/zh/role_actions.xml
@@ -18,7 +18,7 @@
<action description="Change Charter, Insignia, and &apos;Show in search&apos;" longdescription="Change Charter, Insignia, and &apos;Show in search&apos;. This is done in the General section." name="group change identity" value="11"/>
</action_set>
<action_set description="These Abilities include powers to deed, modify, and sell land in this group&apos;s land holdings. To get to the About Land window, right-click the ground and select &apos;About Land&apos;, or click the &apos;i&apos; icon in the Navigation Bar." name="Parcel Management">
- <action description="Deed land and buy land for group" longdescription="Deed land and buy land for group. This is done in About Land &gt; General tab." name="land deed" value="12"/>
+ <action description="讓渡土地或購買土地給群組" longdescription="Deed land and buy land for group. This is done in About Land &gt; General tab." name="land deed" value="12"/>
<action description="Abandon land to Governor Linden" longdescription="Abandon land to Governor Linden. *WARNING* Any Member in a Role with this Ability can abandon group-owned land in About Land &gt; General tab, reverting it to Linden ownership without a sale! Be sure you know what you&apos;re doing before assigning this Ability." name="land release" value="13"/>
<action description="Set land for sale info" longdescription="Set land for sale info. *WARNING* Any Member in a Role with this Ability can sell group-owned land in About Land &gt; General tab as they wish! Be sure you know what you&apos;re doing before assigning this Ability." name="land set sale info" value="14"/>
<action description="Subdivide and join parcels" longdescription="Subdivide and join parcels. This is done by right-clicking the ground, &apos;Edit Terrain&apos;, and dragging your mouse on the land to make a selection. To subdivide, select what you want to split and click &apos;Subdivide&apos;. To join, select two or more contiguous parcels and click &apos;Join&apos;." name="land divide join" value="15"/>
@@ -54,7 +54,7 @@
<action description="Landscaping using Linden plants" longdescription="Landscaping ability to place and move Linden trees, plants, and grasses. These items can be found in your inventory&apos;s Library &gt; Objects folder, or they can be created via the Build menu." name="land gardening" value="35"/>
</action_set>
<action_set description="These Abilities include powers to deed, modify, and sell group-owned objects. These changes are done in the Build Tools &gt; General tab. Right-click an object and Edit to see its settings." name="Object Management">
- <action description="Deed objects to group" longdescription="Deed objects to group in the Build Tools &gt; General tab." name="object deed" value="36"/>
+ <action description="讓渡物件給群組" longdescription="Deed objects to group in the Build Tools &gt; General tab." name="object deed" value="36"/>
<action description="Manipulate (move, copy, modify) group-owned objects" longdescription="Manipulate (move, copy, modify) group-owned objects in the Build Tools &gt; General tab." name="object manipulate" value="38"/>
<action description="Set group-owned objects for sale" longdescription="Set group-owned objects for sale in the Build Tools &gt; General tab." name="object set sale" value="39"/>
</action_set>
diff --git a/indra/newview/skins/default/xui/zh/sidepanel_inventory.xml b/indra/newview/skins/default/xui/zh/sidepanel_inventory.xml
index 4cc16ed250..7abe95a402 100644
--- a/indra/newview/skins/default/xui/zh/sidepanel_inventory.xml
+++ b/indra/newview/skins/default/xui/zh/sidepanel_inventory.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Things" name="objects panel">
+<panel label="事物" name="objects panel">
<panel label="" name="sidepanel__inventory_panel">
<panel name="button_panel">
<layout_stack name="button_panel_ls">
@@ -11,8 +11,8 @@
</layout_panel>
<layout_panel name="shop_btn_lp">
<button label="Shop" name="shop_btn" tool_tip="Open Marketplace webpage"/>
- <button label="Wear" name="wear_btn" tool_tip="ç©¿ä¸Šæ‰€é¸æ“‡çš„è£æ‰®"/>
- <button label="Play" name="play_btn"/>
+ <button label="穿上" name="wear_btn" tool_tip="ç©¿ä¸Šæ‰€é¸æ“‡çš„è£æ‰®"/>
+ <button label="播放" name="play_btn"/>
<button label="瞬間傳é€" name="teleport_btn" tool_tip="瞬間傳é€åˆ°æ‰€é¸çš„å€åŸŸ"/>
</layout_panel>
</layout_stack>
diff --git a/indra/newview/skins/default/xui/zh/sidepanel_task_info.xml b/indra/newview/skins/default/xui/zh/sidepanel_task_info.xml
index 5aad4568bd..3d46e52726 100644
--- a/indra/newview/skins/default/xui/zh/sidepanel_task_info.xml
+++ b/indra/newview/skins/default/xui/zh/sidepanel_task_info.xml
@@ -1,10 +1,10 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="object properties" title="物件檔案">
<panel.string name="text deed continued">
- Deed
+ 讓渡
</panel.string>
<panel.string name="text deed">
- Deed
+ 讓渡
</panel.string>
<panel.string name="text modify info 1">
ä½ å¯ä»¥ä¿®æ”¹é€™å€‹ç‰©ä»¶
@@ -56,7 +56,7 @@
</text>
<button name="button set group" tool_tip="鏿“‡ä¸€å€‹ç¾¤çµ„以分享這個物件的權é™"/>
<name_box initial_value="載入中..." name="Group Name Proxy"/>
- <button label="Deed" label_selected="Deed" name="button deed" tool_tip="Deeding gives this item away with next owner permissions. Group shared objects can be deeded by a group officer."/>
+ <button label="讓渡" label_selected="讓渡" name="button deed" tool_tip="Deeding gives this item away with next owner permissions. Group shared objects can be deeded by a group officer."/>
<text name="label click action">
點擊以:
</text>
@@ -85,16 +85,16 @@
</text>
<check_box label="修改" name="checkbox next owner can modify"/>
<check_box label="覆製" name="checkbox next owner can copy"/>
- <check_box label="轉移" name="checkbox next owner can transfer" tool_tip="Next owner can give away or resell this object"/>
+ <check_box label="轉移" name="checkbox next owner can transfer" tool_tip="ä¸‹ä¸€å€‹æ“æœ‰è€…å¯ä»¥é€å‡ºæˆ–轉售這個物件"/>
</panel>
<check_box label="出售" name="checkbox for sale"/>
<combo_box name="sale type">
- <combo_box.item label="Copy" name="Copy"/>
- <combo_box.item label="Contents" name="Contents"/>
- <combo_box.item label="Original" name="Original"/>
+ <combo_box.item label="副本" name="Copy"/>
+ <combo_box.item label="內容" name="Contents"/>
+ <combo_box.item label="原件" name="Original"/>
</combo_box>
<spinner label="價格: L$" name="Edit Cost"/>
- <check_box label="顯示在æœå°‹ä¸­" name="search_check" tool_tip="Let people see this object in search results"/>
+ <check_box label="顯示在æœå°‹ä¸­" name="search_check" tool_tip="讓其他人å¯ä»¥åœ¨æœå°‹çµæžœä¸­å¯Ÿçœ‹åˆ°æ­¤ç‰©ä»¶"/>
<text name="B:">
B:
</text>
diff --git a/indra/newview/skins/default/xui/zh/strings.xml b/indra/newview/skins/default/xui/zh/strings.xml
index 0949e61fa1..6dbe44d32e 100644
--- a/indra/newview/skins/default/xui/zh/strings.xml
+++ b/indra/newview/skins/default/xui/zh/strings.xml
@@ -1042,10 +1042,10 @@
按下 ESC éµå›žå¾©åˆ°ä¸–界的視角
</string>
<string name="InventoryNoMatchingItems">
- Didn&apos;t find what you&apos;re looking for? Try [secondlife:///app/search/all/[SEARCH_TERM] Search].
+ 沒有發ç¾ä½ æƒ³è¦æ‰¾çš„嗎?試試 [secondlife:///app/search/all/[SEARCH_TERM] æœå°‹]。
</string>
<string name="PlacesNoMatchingItems">
- Didn&apos;t find what you&apos;re looking for? Try [secondlife:///app/search/places/[SEARCH_TERM] Search].
+ 沒有發ç¾ä½ æƒ³è¦æ‰¾çš„嗎?試試 [secondlife:///app/search/places/[SEARCH_TERM] æœå°‹]。
</string>
<string name="FavoritesNoMatchingItems">
Drag a landmark here to add it to your favorites.
@@ -1190,25 +1190,25 @@
Buy for L$
</string>
<string name="Stone">
- Stone
+ 石頭
</string>
<string name="Metal">
- Metal
+ 金屬
</string>
<string name="Glass">
- Glass
+ 玻璃
</string>
<string name="Wood">
- Wood
+ 木頭
</string>
<string name="Flesh">
- Flesh
+ 肌肉
</string>
<string name="Plastic">
- Plastic
+ 塑膠
</string>
<string name="Rubber">
- Rubber
+ 橡膠
</string>
<string name="Light">
Light
@@ -1385,7 +1385,7 @@
Charter Member
</string>
<string name="AcctTypeEmployee">
- Linden Lab Employee
+ 林登實驗室員工
</string>
<string name="PaymentInfoUsed">
Payment Info Used
@@ -1433,7 +1433,7 @@
伺æœå™¨ä¸Šæœªç™¼ç¾è…³æœ¬ã€‚
</string>
<string name="CompileQueueProblemDownloading">
- Problem downloading
+ å•題下載中
</string>
<string name="CompileQueueInsufficientPermDownload">
Insufficient permissions to download a script.
@@ -1491,7 +1491,7 @@
(未知)
</string>
<string name="SummaryForTheWeek" value="Summary for this week, beginning on"/>
- <string name="NextStipendDay" value="The next stipend day is"/>
+ <string name="NextStipendDay" value="下一個發薪日為"/>
<string name="GroupIndividualShare" value="Group Individual Share"/>
<string name="GroupColumn" value="群組"/>
<string name="Balance">
@@ -1507,7 +1507,7 @@
Total
</string>
<string name="NoGroupDataFound">
- No group data found for group
+ 無群組資料發ç¾
</string>
<string name="IMParentEstate">
parent estate
@@ -1540,13 +1540,13 @@
地段腳本記憶體
</string>
<string name="ScriptLimitsParcelsOwned">
- Parcels Listed: [PARCELS]
+ 地段清單:[PARCELS]
</string>
<string name="ScriptLimitsMemoryUsed">
- Memory used: [COUNT] kb out of [MAX] kb; [AVAILABLE] kb available
+ 計憶體用é‡ï¼šä½¿ç”¨ [MAX] kb 中的 [COUNT] kb ;剩餘 [AVAILABLE] kb å¯ç”¨
</string>
<string name="ScriptLimitsMemoryUsedSimple">
- Memory used: [COUNT] kb
+ 記憶體用é‡ï¼š[COUNT] kb
</string>
<string name="ScriptLimitsParcelScriptURLs">
地段腳本 URLs
@@ -1573,7 +1573,7 @@
You do not have permission to examine this parcel
</string>
<string name="SITTING_ON">
- Sitting On
+ å在
</string>
<string name="ATTACH_CHEST">
胸部
@@ -1759,7 +1759,7 @@
é è¦½
</string>
<string name="MultiPropertiesTitle">
- Properties
+ 屬性
</string>
<string name="InvOfferAnObjectNamed">
An object named
@@ -1889,40 +1889,40 @@
PDT
</string>
<string name="Direction_Forward">
- Forward
+ å‘å‰
</string>
<string name="Direction_Left">
- Left
+ å‘å·¦
</string>
<string name="Direction_Right">
- Right
+ å‘å³
</string>
<string name="Direction_Back">
- Back
+ å‘後
</string>
<string name="Direction_North">
- North
+ 北
</string>
<string name="Direction_South">
- South
+ å—
</string>
<string name="Direction_West">
- West
+ 西
</string>
<string name="Direction_East">
- East
+ æ±
</string>
<string name="Direction_Up">
- Up
+ å‘上
</string>
<string name="Direction_Down">
- Down
+ å‘下
</string>
<string name="Any Category">
任何類別
</string>
<string name="Shopping">
- Shopping
+ 採購
</string>
<string name="Land Rental">
Land Rental
@@ -1958,28 +1958,28 @@
完全æˆäºº
</string>
<string name="Arts&amp;Culture">
- Arts &amp; Culture
+ è—術與文化
</string>
<string name="Business">
- Business
+ 商業
</string>
<string name="Educational">
- Educational
+ 教育
</string>
<string name="Gaming">
- Gaming
+ éŠæˆ²
</string>
<string name="Hangout">
èšæœƒæ‰€
</string>
<string name="Newcomer Friendly">
- Newcomer Friendly
+ 新手å‹å–„
</string>
<string name="Parks&amp;Nature">
- Parks &amp; Nature
+ 公園與自然
</string>
<string name="Residential">
- Residential
+ ä½å®…
</string>
<string name="Stage">
Stage
@@ -2024,36 +2024,36 @@
---
</string>
<string name="Multiple Media">
- Multiple Media
+ 多媒體
</string>
<string name="Play Media">
- Play/Pause Media
+ æ’­æ”¾ï¼æš«åœ 媒體
</string>
<string name="MBCmdLineError">
- An error was found parsing the command line.
-Please see: http://wiki.secondlife.com/wiki/Client_parameters
-Error:
+ è§£æžå‘½ä»¤åˆ—時發ç¾éŒ¯èª¤ã€‚
+è«‹åƒé–±ï¼š http://wiki.secondlife.com/wiki/Client_parameters
+錯誤:
</string>
<string name="MBCmdLineUsg">
- [APP_NAME] Command line usage:
+ [APP_NAME] 命令列用法:
</string>
<string name="MBUnableToAccessFile">
- [APP_NAME] is unable to access a file that it needs.
+ [APP_NAME] 無法存å–它所需è¦çš„æª”案。
This can be because you somehow have multiple copies running, or your system incorrectly thinks a file is open.
If this message persists, restart your computer and try again.
If it continues to persist, you may need to completely uninstall [APP_NAME] and reinstall it.
</string>
<string name="MBFatalError">
- Fatal Error
+ 致命錯誤
</string>
<string name="MBRequiresAltiVec">
[APP_NAME] requires a processor with AltiVec (G4 or later).
</string>
<string name="MBAlreadyRunning">
- [APP_NAME] is already running.
-Check your task bar for a minimized copy of the program.
-If this message persists, restart your computer.
+ [APP_NAME] 已經在執行中。
+è«‹æª¢æŸ¥ä½ çš„å·¥ä½œåˆ—è£¡æ˜¯å¦æœ‰å…¶ä»–最å°åŒ–的相åŒç¨‹å¼ã€‚
+å¦‚æžœé€™å€‹è¨Šæ¯æŒçºŒå‡ºç¾ï¼Œè«‹é‡æ–°å•Ÿå‹•你的電腦。
</string>
<string name="MBFrozenCrashed">
[APP_NAME] appears to have frozen or crashed on the previous run.
@@ -2082,8 +2082,8 @@ Please download the latest version from www.secondlife.com.
錯誤
</string>
<string name="MBFullScreenErr">
- Unable to run fullscreen at [WIDTH] x [HEIGHT].
-Running in window.
+ 無法執行全螢幕於 [WIDTH] x [HEIGHT].
+執行於視窗中。
</string>
<string name="MBDestroyWinFailed">
Shutdown Error while destroying window (DestroyWindow() failed)
@@ -2111,7 +2111,7 @@ Also be sure your monitor is set to True Color (32-bit) in Control Panels &gt; D
If you continue to receive this message, contact the [SUPPORT_SITE].
</string>
<string name="MBPixelFmtSetErr">
- Can&apos;t set pixel format
+ 無法設定åƒç´ æ ¼å¼
</string>
<string name="MBGLContextErr">
Can&apos;t create GL rendering context
@@ -2920,7 +2920,7 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
Middle Part
</string>
<string name="More">
- More
+ 更多
</string>
<string name="More Blush">
More Blush
@@ -3559,7 +3559,7 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
購買這塊土地
</string>
<string name="LocationCtrlVoiceTooltip">
- Voice not available here
+ 此地並ä¸å…許語音
</string>
<string name="LocationCtrlFlyTooltip">
ä¸å…許飛行
@@ -3568,13 +3568,13 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
ç¦æ­¢æŽ¨æ’ž
</string>
<string name="LocationCtrlBuildTooltip">
- Building/dropping objects not allowed
+ 建造ï¼ä¸Ÿæ£„ 物件ä¸è¢«å…許
</string>
<string name="LocationCtrlScriptsTooltip">
- Scripts not allowed
+ 腳本ä¸è¢«å…許
</string>
<string name="LocationCtrlDamageTooltip">
- Health
+ å¥åº·
</string>
<string name="LocationCtrlAdultIconTooltip">
完全æˆäººåœ°å€
@@ -3628,7 +3628,7 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
[NAME] 正在輸入...
</string>
<string name="Unnamed">
- (Unnamed)
+ (未命å)
</string>
<string name="IM_moderated_chat_label">
(Moderated: Voices off by default)
@@ -3670,10 +3670,10 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
Connected, click Leave Call to hang up
</string>
<string name="hang_up-im">
- Left voice call
+ 離開語音通話
</string>
<string name="answering-im">
- Connecting...
+ è¯æŽ¥ä¸­...
</string>
<string name="conference-title">
Ad-hoc Conference
@@ -3715,10 +3715,10 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
此會話ä¸å†å­˜åœ¨
</string>
<string name="no_ability_error">
- You do not have that ability.
+ 你並ä¸å…·æœ‰é€™å€‹èƒ½åŠ›ã€‚
</string>
<string name="no_ability">
- You do not have that ability.
+ 你並ä¸å…·æœ‰é€™å€‹èƒ½åŠ›ã€‚
</string>
<string name="not_a_mod_error">
You are not a session moderator.
@@ -3903,7 +3903,7 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
內容
</string>
<string name="Gesture">
- Gesture
+ å§¿å‹¢
</string>
<string name="Male Gestures">
男性姿勢
@@ -4048,7 +4048,7 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
US$ [AMOUNT]
</string>
<string name="Membership">
- Membership
+ æˆå“¡è³‡æ ¼
</string>
<string name="Roles">
角色
@@ -4057,13 +4057,13 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
Group Identity
</string>
<string name="Parcel Management">
- Parcel Management
+ 地段管ç†
</string>
<string name="Parcel Identity">
Parcel Identity
</string>
<string name="Parcel Settings">
- Parcel Settings
+ 地段設定
</string>
<string name="Parcel Powers">
Parcel Powers
@@ -4075,10 +4075,10 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
Parcel Content
</string>
<string name="Object Management">
- Object Management
+ 物件管ç†
</string>
<string name="Accounting">
- Accounting
+ 會計
</string>
<string name="Notices">
通知
@@ -4087,16 +4087,16 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
èŠå¤©
</string>
<string name="DeleteItems">
- Delete selected items?
+ 刪除所é¸å–的物å“?
</string>
<string name="DeleteItem">
- Delete selected item?
+ 刪除所é¸å–的物å“?
</string>
<string name="EmptyOutfitText">
沒有任何物å“åœ¨é€™å€‹è£æ‰®å…§
</string>
<string name="ExternalEditorNotSet">
- Select an editor using the ExternalEditor setting.
+ 鏿“‡ä¸€å€‹ç·¨è¼¯å™¨ä½¿ç”¨ ExternalEditor 設定。
</string>
<string name="ExternalEditorNotFound">
Cannot find the external editor you specified.
@@ -4107,7 +4107,7 @@ Try enclosing path to the editor with double quotes.
Error parsing the external editor command.
</string>
<string name="ExternalEditorFailedToRun">
- External editor failed to run.
+ 執行外部編輯器失敗。
</string>
<string name="Esc">
Esc
diff --git a/indra/newview/skins/default/xui/zh/teleport_strings.xml b/indra/newview/skins/default/xui/zh/teleport_strings.xml
index ffb4c903bb..bfdb107810 100644
--- a/indra/newview/skins/default/xui/zh/teleport_strings.xml
+++ b/indra/newview/skins/default/xui/zh/teleport_strings.xml
@@ -20,6 +20,10 @@
抱歉,ä¸éŽç³»çµ±ç„¡æ³•完æˆçž¬é–“傳é€çš„è¯æŽ¥ã€‚
è«‹ç¨å¾Œå†è©¦ã€‚
</message>
+ <message name="NoHelpIslandTP">
+ 您ä¸èƒ½çž¬é—´è½¬ç§»å›žâ€œæ´åЩ岛â€ã€‚
+去“公共æ´åЩ岛â€é‡å¤æ‚¨çš„æ•™ç¨‹ã€‚
+ </message>
<message name="noaccess_tport">
抱歉,你並沒有權é™é€²å…¥è¦çž¬é–“傳é€çš„目的地。
</message>
diff --git a/indra/newview/skins/minimal/colors.xml b/indra/newview/skins/minimal/colors.xml
deleted file mode 100644
index 097a298ce5..0000000000
--- a/indra/newview/skins/minimal/colors.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<colors>
- <color
- name="MenuBarBgColor"
- value="0 0 0 0" />
-</colors>
diff --git a/indra/newview/skins/minimal/textures/arrow_keys.png b/indra/newview/skins/minimal/textures/arrow_keys.png
deleted file mode 100644
index f19af59251..0000000000
--- a/indra/newview/skins/minimal/textures/arrow_keys.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/minimal/textures/bottomtray/Speak_Btn_Off.png b/indra/newview/skins/minimal/textures/bottomtray/Speak_Btn_Off.png
deleted file mode 100644
index b6e9eef891..0000000000
--- a/indra/newview/skins/minimal/textures/bottomtray/Speak_Btn_Off.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/minimal/textures/bottomtray/Speak_Btn_Selected_Press.png b/indra/newview/skins/minimal/textures/bottomtray/Speak_Btn_Selected_Press.png
deleted file mode 100644
index 687cb7fb53..0000000000
--- a/indra/newview/skins/minimal/textures/bottomtray/Speak_Btn_Selected_Press.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/minimal/textures/bottomtray/button_separator.png b/indra/newview/skins/minimal/textures/bottomtray/button_separator.png
deleted file mode 100644
index 71ed25f931..0000000000
--- a/indra/newview/skins/minimal/textures/bottomtray/button_separator.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/minimal/textures/bottomtray/close_off.png b/indra/newview/skins/minimal/textures/bottomtray/close_off.png
deleted file mode 100644
index 241a24bde9..0000000000
--- a/indra/newview/skins/minimal/textures/bottomtray/close_off.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/minimal/textures/bottomtray/close_over.png b/indra/newview/skins/minimal/textures/bottomtray/close_over.png
deleted file mode 100644
index 4630cb6dd6..0000000000
--- a/indra/newview/skins/minimal/textures/bottomtray/close_over.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/minimal/textures/bottomtray/close_press.png b/indra/newview/skins/minimal/textures/bottomtray/close_press.png
deleted file mode 100644
index 3ed9c99a26..0000000000
--- a/indra/newview/skins/minimal/textures/bottomtray/close_press.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/minimal/textures/click_to_move.png b/indra/newview/skins/minimal/textures/click_to_move.png
deleted file mode 100644
index 74e3faa8ff..0000000000
--- a/indra/newview/skins/minimal/textures/click_to_move.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/minimal/textures/textures.xml b/indra/newview/skins/minimal/textures/textures.xml
deleted file mode 100644
index e3ed01721a..0000000000
--- a/indra/newview/skins/minimal/textures/textures.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-
-<textures version="101">
- <texture name="Button_Separator" file_name="bottomtray/button_separator.png" preload="true" />
- <texture name="arrow_keys.png"/>
- <texture name="click_to_move" file_name="click_to_move.png"/>
- <texture name="bottomtray_close_off" file_name="bottomtray/close_off.png" preload="true" />
- <texture name="bottomtray_close_over" file_name="bottomtray/close_over.png" preload="true" />
- <texture name="bottomtray_close_press" file_name="bottomtray/close_press.png" preload="true" />
- <texture name="Speak_Btn_Off" file_name="bottomtray/Speak_Btn_Off.png" preload="true" scale.left="4" scale.top="16" scale.right="8" scale.bottom="4" />
- <texture name="Speak_Btn_Selected_Press" file_name="bottomtray/Speak_Btn_Selected_Press.png" preload="true" scale.left="4" scale.top="16" scale.right="8" scale.bottom="4" />
- </textures>
diff --git a/indra/newview/skins/minimal/xui/da/floater_camera.xml b/indra/newview/skins/minimal/xui/da/floater_camera.xml
deleted file mode 100644
index 5b7ef6db54..0000000000
--- a/indra/newview/skins/minimal/xui/da/floater_camera.xml
+++ /dev/null
@@ -1,65 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="camera_floater" title="">
- <floater.string name="rotate_tooltip">
- Roter kamera omkring fokus
- </floater.string>
- <floater.string name="zoom_tooltip">
- Zoom kamera mod fokus
- </floater.string>
- <floater.string name="move_tooltip">
- Flyt kamera op og ned, til venstre og højre
- </floater.string>
- <floater.string name="camera_modes_title">
- Kamera valg
- </floater.string>
- <floater.string name="pan_mode_title">
- Kredsløb zoom panorering
- </floater.string>
- <floater.string name="presets_mode_title">
- Forvalg
- </floater.string>
- <floater.string name="free_mode_title">
- Se objekt
- </floater.string>
- <panel name="controls">
- <panel name="preset_views_list">
- <panel_camera_item name="front_view">
- <panel_camera_item.text name="front_view_text">
- Se forfra
- </panel_camera_item.text>
- </panel_camera_item>
- <panel_camera_item name="group_view">
- <panel_camera_item.text name="side_view_text">
- Se fra siden
- </panel_camera_item.text>
- </panel_camera_item>
- <panel_camera_item name="rear_view">
- <panel_camera_item.text name="rear_view_text">
- Se bagfra
- </panel_camera_item.text>
- </panel_camera_item>
- </panel>
- <panel name="camera_modes_list">
- <panel_camera_item name="object_view">
- <panel_camera_item.text name="object_view_text">
- Se fra objekt
- </panel_camera_item.text>
- </panel_camera_item>
- <panel_camera_item name="mouselook_view">
- <panel_camera_item.text name="mouselook_view_text">
- Førsteperson
- </panel_camera_item.text>
- </panel_camera_item>
- </panel>
- <panel name="zoom" tool_tip="Zoom kamera mod fokus">
- <joystick_rotate name="cam_rotate_stick" tool_tip="Kamera kredser rundt om fokus"/>
- <slider_bar name="zoom_slider" tool_tip="Zoom kamera mod fokus"/>
- <joystick_track name="cam_track_stick" tool_tip="Flyt kamera op og ned, venstre og højre"/>
- </panel>
- </panel>
- <panel name="buttons">
- <button label="" name="presets_btn" tool_tip="Forvalg"/>
- <button label="" name="pan_btn" tool_tip="Kredsløb zoom panorering"/>
- <button label="" name="avatarview_btn" tool_tip="Kamera valg"/>
- </panel>
-</floater>
diff --git a/indra/newview/skins/minimal/xui/da/floater_help_browser.xml b/indra/newview/skins/minimal/xui/da/floater_help_browser.xml
deleted file mode 100644
index 0e2918e4e2..0000000000
--- a/indra/newview/skins/minimal/xui/da/floater_help_browser.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_help_browser" title="HVORDAN">
- <floater.string name="loading_text">
- Henter...
- </floater.string>
- <layout_stack name="stack1">
- <layout_panel name="external_controls"/>
- </layout_stack>
-</floater>
diff --git a/indra/newview/skins/minimal/xui/da/floater_media_browser.xml b/indra/newview/skins/minimal/xui/da/floater_media_browser.xml
deleted file mode 100644
index 42fbdeaa9e..0000000000
--- a/indra/newview/skins/minimal/xui/da/floater_media_browser.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_about" title="MEDIA BROWSER">
- <floater.string name="home_page_url">
- http://www.secondlife.com
- </floater.string>
- <floater.string name="support_page_url">
- http://support.secondlife.com
- </floater.string>
- <layout_stack name="stack1">
- <layout_panel name="nav_controls">
- <button label="Tilbage" name="back"/>
- <button label="Frem" name="forward"/>
- <button label="Genlæs" name="reload"/>
- <button label="Go" name="go"/>
- </layout_panel>
- <layout_panel name="time_controls">
- <button label="tilbage" name="rewind"/>
- <button label="stop" name="stop"/>
- <button label="fremad" name="seek"/>
- </layout_panel>
- <layout_panel name="parcel_owner_controls">
- <button label="Send denne side til parcel" name="assign"/>
- </layout_panel>
- <layout_panel name="external_controls">
- <button label="Ã…ben i min internetbrowser" name="open_browser"/>
- <check_box label="Ã…ben altid i min internetbrowser" name="open_always"/>
- <button label="Luk" name="close"/>
- </layout_panel>
- </layout_stack>
-</floater>
diff --git a/indra/newview/skins/minimal/xui/da/floater_nearby_chat.xml b/indra/newview/skins/minimal/xui/da/floater_nearby_chat.xml
deleted file mode 100644
index bd17224259..0000000000
--- a/indra/newview/skins/minimal/xui/da/floater_nearby_chat.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="nearby_chat" title="CHAT NÆRVED">
- <check_box label="Oversæt chat (håndteret af Google)" name="translate_chat_checkbox"/>
-</floater>
diff --git a/indra/newview/skins/minimal/xui/da/floater_web_content.xml b/indra/newview/skins/minimal/xui/da/floater_web_content.xml
deleted file mode 100644
index 0410f74324..0000000000
--- a/indra/newview/skins/minimal/xui/da/floater_web_content.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_web_content" title="">
- <layout_stack name="stack1">
- <layout_panel name="nav_controls">
- <button name="back" tool_tip="GÃ¥ bagud"/>
- <button name="forward" tool_tip="GÃ¥ frem"/>
- <button name="stop" tool_tip="Stop"/>
- <button name="reload" tool_tip="Genindlæs side"/>
- <combo_box name="address" tool_tip="Indtast URL her"/>
- <icon name="media_secure_lock_flag" tool_tip="Sikker browsing"/>
- <button name="popexternal" tool_tip="Ã…ben denne URL i din normale internet browser"/>
- </layout_panel>
- </layout_stack>
-</floater>
diff --git a/indra/newview/skins/minimal/xui/da/inspect_avatar.xml b/indra/newview/skins/minimal/xui/da/inspect_avatar.xml
deleted file mode 100644
index dc1ed562eb..0000000000
--- a/indra/newview/skins/minimal/xui/da/inspect_avatar.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<!--
- Not can_close / no title to avoid window chrome
- Single instance - only have one at a time, recycle it each spawn
--->
-<floater name="inspect_avatar">
- <string name="Subtitle">
- [AGE]
- </string>
- <string name="Details">
- [SL_PROFILE]
- </string>
- <text name="user_details">
- Dette er min second life beskrivelse og jeg synes den er rigtig god. Men af en eller ande grund er min beskrivelse meget lang fordi jeg taler en hel masse
- </text>
- <slider name="volume_slider" tool_tip="Stemme lydstyrke" value="0.5"/>
- <button label="Tilføj ven" name="add_friend_btn"/>
- <button label="IM" name="im_btn"/>
- <button label="Profil" name="view_profile_btn"/>
- <panel name="moderator_panel">
- <button label="Slå stemme-chat fra" name="disable_voice"/>
- <button label="Slå stemme-chat til" name="enable_voice"/>
- </panel>
-</floater>
diff --git a/indra/newview/skins/minimal/xui/da/inspect_object.xml b/indra/newview/skins/minimal/xui/da/inspect_object.xml
deleted file mode 100644
index 78ccc5b869..0000000000
--- a/indra/newview/skins/minimal/xui/da/inspect_object.xml
+++ /dev/null
@@ -1,41 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<!--
- Not can_close / no title to avoid window chrome
- Single instance - only have one at a time, recycle it each spawn
--->
-<floater name="inspect_object">
- <string name="Creator">
- Af [CREATOR]
- </string>
- <string name="CreatorAndOwner">
- Af [CREATOR]
-Owner [OWNER]
- </string>
- <string name="Price">
- L$[AMOUNT]
- </string>
- <string name="PriceFree">
- Gratis!
- </string>
- <string name="Touch">
- Berør
- </string>
- <string name="Sit">
- Sid
- </string>
- <text name="object_name" value="Test objekt navn der reelt er to linier og meget lang"/>
- <text name="price_text">
- L$30,000
- </text>
- <text name="object_description">
- Dette er en meget lang beskrivelse af et objekt udformet så den fylder mindst 80 karakterer i længden eller endda nærmere 120 på dette sted. Man kan aldrig vide....
- </text>
- <button label="Køb" name="buy_btn"/>
- <button label="Betal" name="pay_btn"/>
- <button label="Tag kopi" name="take_free_copy_btn"/>
- <button label="Berør" name="touch_btn"/>
- <button label="Sid" name="sit_btn"/>
- <button label="Ã…ben" name="open_btn"/>
- <icon name="secure_browsing" tool_tip="Sikker Browsing"/>
- <button label="Mere" name="more_info_btn"/>
-</floater>
diff --git a/indra/newview/skins/minimal/xui/da/menu_add_wearable_gear.xml b/indra/newview/skins/minimal/xui/da/menu_add_wearable_gear.xml
deleted file mode 100644
index 1e8301dc4c..0000000000
--- a/indra/newview/skins/minimal/xui/da/menu_add_wearable_gear.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Add Wearable Gear Menu">
- <menu_item_check label="Sortér efter nyeste" name="sort_by_most_recent"/>
- <menu_item_check label="Sortér efter navn" name="sort_by_name"/>
- <menu_item_check label="Sortér efter type" name="sort_by_type"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/da/menu_attachment_other.xml b/indra/newview/skins/minimal/xui/da/menu_attachment_other.xml
deleted file mode 100644
index ca7b184942..0000000000
--- a/indra/newview/skins/minimal/xui/da/menu_attachment_other.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<!-- *NOTE: See also menu_avatar_other.xml -->
-<context_menu name="Avatar Pie">
- <menu_item_call label="Profil" name="Profile..."/>
- <menu_item_call label="Tilføj ven" name="Add Friend"/>
- <menu_item_call label="Send besked" name="Send IM..."/>
- <menu_item_call label="Opkald" name="Call"/>
- <menu_item_call label="Invitér til gruppe" name="Invite..."/>
- <menu_item_call label="Blokér" name="Avatar Mute"/>
- <menu_item_call label="Rapportér" name="abuse"/>
- <menu_item_call label="Frys" name="Freeze..."/>
- <menu_item_call label="Smid ud" name="Eject..."/>
- <menu_item_call label="Debug teksturer" name="Debug..."/>
- <menu_item_call label="Zoom ind" name="Zoom In"/>
- <menu_item_call label="Betal" name="Pay..."/>
- <menu_item_call label="Objekt profil" name="Object Inspect"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/da/menu_attachment_self.xml b/indra/newview/skins/minimal/xui/da/menu_attachment_self.xml
deleted file mode 100644
index 35ba27f9e2..0000000000
--- a/indra/newview/skins/minimal/xui/da/menu_attachment_self.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Attachment Pie">
- <menu_item_call label="Berør" name="Attachment Object Touch"/>
- <menu_item_call label="Redigér" name="Edit..."/>
- <menu_item_call label="Tag af" name="Detach"/>
- <menu_item_call label="Sid ned" name="Sit Down Here"/>
- <menu_item_call label="Stå op" name="Stand Up"/>
- <menu_item_call label="Udseende" name="Change Outfit"/>
- <menu_item_call label="Redigér mit sæt" name="Edit Outfit"/>
- <menu_item_call label="Redigér min figur" name="Edit My Shape"/>
- <menu_item_call label="Venner" name="Friends..."/>
- <menu_item_call label="Grupper" name="Groups..."/>
- <menu_item_call label="Profil" name="Profile..."/>
- <menu_item_call label="Debug teksturer" name="Debug..."/>
- <menu_item_call label="Smid" name="Drop"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/da/menu_avatar_icon.xml b/indra/newview/skins/minimal/xui/da/menu_avatar_icon.xml
deleted file mode 100644
index 26b58ce1ab..0000000000
--- a/indra/newview/skins/minimal/xui/da/menu_avatar_icon.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Avatar Icon Menu">
- <menu_item_call label="Profil" name="Show Profile"/>
- <menu_item_call label="Send besked..." name="Send IM"/>
- <menu_item_call label="Tilføj ven..." name="Add Friend"/>
- <menu_item_call label="Fjern ven..." name="Remove Friend"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/da/menu_avatar_other.xml b/indra/newview/skins/minimal/xui/da/menu_avatar_other.xml
deleted file mode 100644
index a778dedf0b..0000000000
--- a/indra/newview/skins/minimal/xui/da/menu_avatar_other.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<!-- *NOTE: See also menu_attachment_other.xml -->
-<context_menu name="Avatar Pie">
- <menu_item_call label="Profil" name="Profile..."/>
- <menu_item_call label="Tilføj ven" name="Add Friend"/>
- <menu_item_call label="Besked" name="Send IM..."/>
- <menu_item_call label="Opkald" name="Call"/>
- <menu_item_call label="Invitér til gruppe" name="Invite..."/>
- <menu_item_call label="Blokér" name="Avatar Mute"/>
- <menu_item_call label="Rapportér" name="abuse"/>
- <menu_item_call label="Frys" name="Freeze..."/>
- <menu_item_call label="Smid ud" name="Eject..."/>
- <menu_item_call label="Debug Teksturer" name="Debug..."/>
- <menu_item_call label="Zoom ind" name="Zoom In"/>
- <menu_item_call label="Betal" name="Pay..."/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/da/menu_avatar_self.xml b/indra/newview/skins/minimal/xui/da/menu_avatar_self.xml
deleted file mode 100644
index 0080f7a59e..0000000000
--- a/indra/newview/skins/minimal/xui/da/menu_avatar_self.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Self Pie">
- <menu_item_call label="Sid ned" name="Sit Down Here"/>
- <menu_item_call label="Stå op" name="Stand Up"/>
- <context_menu label="Tag af" name="Take Off &gt;">
- <context_menu label="Tøj" name="Clothes &gt;">
- <menu_item_call label="Trøje" name="Shirt"/>
- <menu_item_call label="Bukser" name="Pants"/>
- <menu_item_call label="Nederdel" name="Skirt"/>
- <menu_item_call label="Sko" name="Shoes"/>
- <menu_item_call label="Strømper" name="Socks"/>
- <menu_item_call label="Jakke" name="Jacket"/>
- <menu_item_call label="Handsker" name="Gloves"/>
- <menu_item_call label="Undertrøje" name="Self Undershirt"/>
- <menu_item_call label="Underbukser" name="Self Underpants"/>
- <menu_item_call label="Tatovering" name="Self Tattoo"/>
- <menu_item_call label="Alpha" name="Self Alpha"/>
- <menu_item_call label="Alt tøj" name="All Clothes"/>
- </context_menu>
- <context_menu label="HUD" name="Object Detach HUD"/>
- <context_menu label="Tag af" name="Object Detach"/>
- <menu_item_call label="Tag alt af" name="Detach All"/>
- </context_menu>
- <menu_item_call label="Mit udseende" name="Chenge Outfit"/>
- <menu_item_call label="Redigér mit sæt" name="Edit Outfit"/>
- <menu_item_call label="Redigér min form" name="Edit My Shape"/>
- <menu_item_call label="Venner" name="Friends..."/>
- <menu_item_call label="Grupper" name="Groups..."/>
- <menu_item_call label="Profil" name="Profile..."/>
- <menu_item_call label="Debug teksturer" name="Debug..."/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/da/menu_bottomtray.xml b/indra/newview/skins/minimal/xui/da/menu_bottomtray.xml
deleted file mode 100644
index 9ac296904a..0000000000
--- a/indra/newview/skins/minimal/xui/da/menu_bottomtray.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="hide_camera_move_controls_menu">
- <menu_item_check label="Stemme aktiveret" name="EnableVoiceChat"/>
- <menu_item_check label="Faste bevægelser" name="ShowGestureButton"/>
- <menu_item_check label="Bevægelse knap" name="ShowMoveButton"/>
- <menu_item_check label="Vis knap" name="ShowCameraButton"/>
- <menu_item_check label="Foto knap" name="ShowSnapshotButton"/>
- <menu_item_check label="Bygge knap" name="ShowBuildButton"/>
- <menu_item_check label="Søge knap" name="ShowSearchButton"/>
- <menu_item_check label="Kort knap" name="ShowWorldMapButton"/>
- <menu_item_check label="Mini-Map button" name="ShowMiniMapButton"/>
- <menu_item_call label="Klip" name="NearbyChatBar_Cut"/>
- <menu_item_call label="Kopiér" name="NearbyChatBar_Copy"/>
- <menu_item_call label="Sæt ind" name="NearbyChatBar_Paste"/>
- <menu_item_call label="Slet" name="NearbyChatBar_Delete"/>
- <menu_item_call label="Vælg alt" name="NearbyChatBar_Select_All"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/da/menu_cof_attachment.xml b/indra/newview/skins/minimal/xui/da/menu_cof_attachment.xml
deleted file mode 100644
index 9d7fc0f223..0000000000
--- a/indra/newview/skins/minimal/xui/da/menu_cof_attachment.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="COF Attachment">
- <menu_item_call label="Tag af" name="detach"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/da/menu_cof_body_part.xml b/indra/newview/skins/minimal/xui/da/menu_cof_body_part.xml
deleted file mode 100644
index 0e90d5a3ae..0000000000
--- a/indra/newview/skins/minimal/xui/da/menu_cof_body_part.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="COF Body">
- <menu_item_call label="Erstat" name="replace"/>
- <menu_item_call label="Redigér" name="edit"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/da/menu_cof_clothing.xml b/indra/newview/skins/minimal/xui/da/menu_cof_clothing.xml
deleted file mode 100644
index 16c225b7d9..0000000000
--- a/indra/newview/skins/minimal/xui/da/menu_cof_clothing.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="COF Clothing">
- <menu_item_call label="Tag af" name="take_off"/>
- <menu_item_call label="Redigér" name="edit"/>
- <menu_item_call label="Erstat" name="replace"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/da/menu_cof_gear.xml b/indra/newview/skins/minimal/xui/da/menu_cof_gear.xml
deleted file mode 100644
index f44369fd84..0000000000
--- a/indra/newview/skins/minimal/xui/da/menu_cof_gear.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Gear COF">
- <menu label="Nyt tøj" name="COF.Gear.New_Clothes"/>
- <menu label="Nye kropsdele" name="COF.Geear.New_Body_Parts"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/da/menu_edit.xml b/indra/newview/skins/minimal/xui/da/menu_edit.xml
deleted file mode 100644
index 3752f42b1c..0000000000
--- a/indra/newview/skins/minimal/xui/da/menu_edit.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu label="Redigér" name="Edit">
- <menu_item_call label="Fortryd" name="Undo"/>
- <menu_item_call label="Gendan" name="Redo"/>
- <menu_item_call label="Klip" name="Cut"/>
- <menu_item_call label="Kopiér" name="Copy"/>
- <menu_item_call label="Sæt ind" name="Paste"/>
- <menu_item_call label="Slet" name="Delete"/>
- <menu_item_call label="Duplikér" name="Duplicate"/>
- <menu_item_call label="Marker alt" name="Select All"/>
- <menu_item_call label="Fjern markering" name="Deselect"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/da/menu_favorites.xml b/indra/newview/skins/minimal/xui/da/menu_favorites.xml
deleted file mode 100644
index a4793e294c..0000000000
--- a/indra/newview/skins/minimal/xui/da/menu_favorites.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Popup">
- <menu_item_call label="Teleportér" name="Teleport To Landmark"/>
- <menu_item_call label="Vis/ret landemærke" name="Landmark Open"/>
- <menu_item_call label="Kopiér SLurl" name="Copy slurl"/>
- <menu_item_call label="Vis på kort" name="Show On Map"/>
- <menu_item_call label="Kopiér" name="Landmark Copy"/>
- <menu_item_call label="Sæt ind" name="Landmark Paste"/>
- <menu_item_call label="Slet" name="Delete"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/da/menu_gesture_gear.xml b/indra/newview/skins/minimal/xui/da/menu_gesture_gear.xml
deleted file mode 100644
index a9010e99b6..0000000000
--- a/indra/newview/skins/minimal/xui/da/menu_gesture_gear.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_gesture_gear">
- <menu_item_call label="Tilføj/fjern fra favoritter" name="activate"/>
- <menu_item_call label="Kopiér" name="copy_gesture"/>
- <menu_item_call label="Sæt ind" name="paste"/>
- <menu_item_call label="Kopiér UUID" name="copy_uuid"/>
- <menu_item_call label="Gem til nuværende sæt" name="save_to_outfit"/>
- <menu_item_call label="Editér" name="edit_gesture"/>
- <menu_item_call label="Undersøg" name="inspect"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/da/menu_group_plus.xml b/indra/newview/skins/minimal/xui/da/menu_group_plus.xml
deleted file mode 100644
index 97fbec1ed1..0000000000
--- a/indra/newview/skins/minimal/xui/da/menu_group_plus.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_group_plus">
- <menu_item_call label="Meld ind i gruppe..." name="item_join"/>
- <menu_item_call label="Ny gruppe..." name="item_new"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/da/menu_hide_navbar.xml b/indra/newview/skins/minimal/xui/da/menu_hide_navbar.xml
deleted file mode 100644
index d96a8a8a17..0000000000
--- a/indra/newview/skins/minimal/xui/da/menu_hide_navbar.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="hide_navbar_menu">
- <menu_item_check label="Vis navigationsbjælke" name="ShowNavbarNavigationPanel"/>
- <menu_item_check label="Vis favoritbjælke" name="ShowNavbarFavoritesPanel"/>
- <menu_item_check label="Vis min lokation bjælke" name="ShowMiniLocationPanel"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/da/menu_im_well_button.xml b/indra/newview/skins/minimal/xui/da/menu_im_well_button.xml
deleted file mode 100644
index 4889230919..0000000000
--- a/indra/newview/skins/minimal/xui/da/menu_im_well_button.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="IM Well Button Context Menu">
- <menu_item_call label="Luk alle" name="Close All"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/da/menu_imchiclet_adhoc.xml b/indra/newview/skins/minimal/xui/da/menu_imchiclet_adhoc.xml
deleted file mode 100644
index f64a6ad455..0000000000
--- a/indra/newview/skins/minimal/xui/da/menu_imchiclet_adhoc.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="IMChiclet AdHoc Menu">
- <menu_item_call label="Afslut" name="End Session"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/da/menu_imchiclet_group.xml b/indra/newview/skins/minimal/xui/da/menu_imchiclet_group.xml
deleted file mode 100644
index b89d9a5789..0000000000
--- a/indra/newview/skins/minimal/xui/da/menu_imchiclet_group.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="IMChiclet Group Menu">
- <menu_item_call label="Gruppe info" name="Show Profile"/>
- <menu_item_call label="Vis session" name="Chat"/>
- <menu_item_call label="Afslut session" name="End Session"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/da/menu_imchiclet_p2p.xml b/indra/newview/skins/minimal/xui/da/menu_imchiclet_p2p.xml
deleted file mode 100644
index 6ebc40a8dd..0000000000
--- a/indra/newview/skins/minimal/xui/da/menu_imchiclet_p2p.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="IMChiclet P2P Menu">
- <menu_item_call label="Profil" name="Show Profile"/>
- <menu_item_call label="Tilføj ven" name="Add Friend"/>
- <menu_item_call label="Vis session" name="Send IM"/>
- <menu_item_call label="Afslut session" name="End Session"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/da/menu_inspect_avatar_gear.xml b/indra/newview/skins/minimal/xui/da/menu_inspect_avatar_gear.xml
deleted file mode 100644
index 8da35adb1b..0000000000
--- a/indra/newview/skins/minimal/xui/da/menu_inspect_avatar_gear.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<toggleable_menu name="Gear Menu">
- <menu_item_call label="Profil" name="view_profile"/>
- <menu_item_call label="Tilføj ven" name="add_friend"/>
- <menu_item_call label="Besked" name="im"/>
- <menu_item_call label="Opkald" name="call"/>
- <menu_item_call label="Teleportér" name="teleport"/>
- <menu_item_call label="Invitér til gruppe" name="invite_to_group"/>
- <menu_item_call label="Blokér" name="block"/>
- <menu_item_call label="Fjern blokering" name="unblock"/>
- <menu_item_call label="Rapportér" name="report"/>
- <menu_item_call label="Frys" name="freeze"/>
- <menu_item_call label="Smid ud" name="eject"/>
- <menu_item_call label="Spark" name="kick"/>
- <menu_item_call label="CSR" name="csr"/>
- <menu_item_call label="Debug teksturer" name="debug"/>
- <menu_item_call label="Find på kort" name="find_on_map"/>
- <menu_item_call label="Zoom ind" name="zoom_in"/>
- <menu_item_call label="Betal" name="pay"/>
- <menu_item_call label="Del" name="share"/>
-</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/da/menu_inspect_object_gear.xml b/indra/newview/skins/minimal/xui/da/menu_inspect_object_gear.xml
deleted file mode 100644
index e28842836d..0000000000
--- a/indra/newview/skins/minimal/xui/da/menu_inspect_object_gear.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<menu name="Gear Menu">
- <menu_item_call label="Berør" name="touch"/>
- <menu_item_call label="Sid her" name="sit"/>
- <menu_item_call label="betal" name="pay"/>
- <menu_item_call label="Køb" name="buy"/>
- <menu_item_call label="Tag" name="take"/>
- <menu_item_call label="tag kopi" name="take_copy"/>
- <menu_item_call label="Ã…ben" name="open"/>
- <menu_item_call label="Redigér" name="edit"/>
- <menu_item_call label="Tag på" name="wear"/>
- <menu_item_call label="Tilføj" name="add"/>
- <menu_item_call label="Rapportér" name="report"/>
- <menu_item_call label="Blokér" name="block"/>
- <menu_item_call label="Zoom ind" name="zoom_in"/>
- <menu_item_call label="Fjern" name="remove"/>
- <menu_item_call label="Mere info" name="more_info"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/da/menu_inspect_self_gear.xml b/indra/newview/skins/minimal/xui/da/menu_inspect_self_gear.xml
deleted file mode 100644
index 887c6484bc..0000000000
--- a/indra/newview/skins/minimal/xui/da/menu_inspect_self_gear.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<toggleable_menu name="Gear Menu">
- <menu_item_call label="Sid ned" name="Sit Down Here"/>
- <menu_item_call label="Stå op" name="Stand Up"/>
- <context_menu label="Tag af" name="Take Off &gt;">
- <context_menu label="Tøj" name="Clothes &gt;">
- <menu_item_call label="Trøje" name="Shirt"/>
- <menu_item_call label="Bukser" name="Pants"/>
- <menu_item_call label="Nederdel" name="Skirt"/>
- <menu_item_call label="Sko" name="Shoes"/>
- <menu_item_call label="Strømper" name="Socks"/>
- <menu_item_call label="Jakke" name="Jacket"/>
- <menu_item_call label="Handsker" name="Gloves"/>
- <menu_item_call label="Undertrøje" name="Self Undershirt"/>
- <menu_item_call label="Underbukser" name="Self Underpants"/>
- <menu_item_call label="Tatovering" name="Self Tattoo"/>
- <menu_item_call label="Alpha" name="Self Alpha"/>
- <menu_item_call label="Alt tøj" name="All Clothes"/>
- </context_menu>
- <context_menu label="HUD" name="Object Detach HUD"/>
- <context_menu label="Tag af" name="Object Detach"/>
- <menu_item_call label="Tag alt af" name="Detach All"/>
- </context_menu>
- <menu_item_call label="Skift sæt" name="Chenge Outfit"/>
- <menu_item_call label="Redigér sæt" name="Edit Outfit"/>
- <menu_item_call label="Redigér min figur" name="Edit My Shape"/>
- <menu_item_call label="Mine venner" name="Friends..."/>
- <menu_item_call label="Mine grupper" name="Groups..."/>
- <menu_item_call label="Min profil" name="Profile..."/>
- <menu_item_call label="Debug teksturer" name="Debug..."/>
-</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/da/menu_inv_offer_chiclet.xml b/indra/newview/skins/minimal/xui/da/menu_inv_offer_chiclet.xml
deleted file mode 100644
index c3b03232bf..0000000000
--- a/indra/newview/skins/minimal/xui/da/menu_inv_offer_chiclet.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="InvOfferChiclet Menu">
- <menu_item_call label="Luk" name="Close"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/da/menu_inventory.xml b/indra/newview/skins/minimal/xui/da/menu_inventory.xml
deleted file mode 100644
index 35551318d1..0000000000
--- a/indra/newview/skins/minimal/xui/da/menu_inventory.xml
+++ /dev/null
@@ -1,84 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Popup">
- <menu_item_call label="Del" name="Share"/>
- <menu_item_call label="Køb" name="Task Buy"/>
- <menu_item_call label="Ã¥ben" name="Task Open"/>
- <menu_item_call label="Afspil" name="Task Play"/>
- <menu_item_call label="Egenskaber" name="Task Properties"/>
- <menu_item_call label="Omdøb" name="Task Rename"/>
- <menu_item_call label="Slet" name="Task Remove"/>
- <menu_item_call label="Tøm papirkurv" name="Empty Trash"/>
- <menu_item_call label="Tøm &apos;Lost and found&apos;" name="Empty Lost And Found"/>
- <menu_item_call label="Ny mappe" name="New Folder"/>
- <menu_item_call label="Nyt script" name="New Script"/>
- <menu_item_call label="Ny note" name="New Note"/>
- <menu_item_call label="Ny bevægelse" name="New Gesture"/>
- <menu label="Nyt tøj" name="New Clothes">
- <menu_item_call label="Ny trøje" name="New Shirt"/>
- <menu_item_call label="Nye bukser" name="New Pants"/>
- <menu_item_call label="Nye sko" name="New Shoes"/>
- <menu_item_call label="Nye strømper" name="New Socks"/>
- <menu_item_call label="Ny jakke" name="New Jacket"/>
- <menu_item_call label="Ny nederdel" name="New Skirt"/>
- <menu_item_call label="Nye handsker" name="New Gloves"/>
- <menu_item_call label="Ny undertrøje" name="New Undershirt"/>
- <menu_item_call label="Nye underbukser" name="New Underpants"/>
- <menu_item_call label="Nyt alpha lag" name="New Alpha Mask"/>
- <menu_item_call label="Ny tatovering" name="New Tattoo"/>
- </menu>
- <menu label="Nye kropsdele" name="New Body Parts">
- <menu_item_call label="Ny figur" name="New Shape"/>
- <menu_item_call label="Nyt hud" name="New Skin"/>
- <menu_item_call label="Nyt hår" name="New Hair"/>
- <menu_item_call label="Nye øjne" name="New Eyes"/>
- </menu>
- <menu label="Ændre type" name="Change Type">
- <menu_item_call label="Standard" name="Default"/>
- <menu_item_call label="Handsker" name="Gloves"/>
- <menu_item_call label="Jakke" name="Jacket"/>
- <menu_item_call label="Bukser" name="Pants"/>
- <menu_item_call label="Kropsbygning" name="Shape"/>
- <menu_item_call label="Sko" name="Shoes"/>
- <menu_item_call label="Trøje" name="Shirt"/>
- <menu_item_call label="Nederdel" name="Skirt"/>
- <menu_item_call label="Underbukser" name="Underpants"/>
- <menu_item_call label="Undertrøje" name="Undershirt"/>
- </menu>
- <menu_item_call label="Teleport" name="Landmark Open"/>
- <menu_item_call label="Ã¥ben" name="Animation Open"/>
- <menu_item_call label="Ã¥ben" name="Sound Open"/>
- <menu_item_call label="Erstat påklædning" name="Replace Outfit"/>
- <menu_item_call label="Tilføj til påklædning" name="Add To Outfit"/>
- <menu_item_call label="Slet ting" name="Purge Item"/>
- <menu_item_call label="Genskab ting" name="Restore Item"/>
- <menu_item_call label="Ã¥ben" name="Open"/>
- <menu_item_call label="Ã…ben original" name="Open Original"/>
- <menu_item_call label="Egenskaber" name="Properties"/>
- <menu_item_call label="Omdøb" name="Rename"/>
- <menu_item_call label="Kopiér asset UUID" name="Copy Asset UUID"/>
- <menu_item_call label="Kopiér" name="Copy"/>
- <menu_item_call label="Indsæt" name="Paste"/>
- <menu_item_call label="Sæt ind som link" name="Paste As Link"/>
- <menu_item_call label="Slet" name="Remove Link"/>
- <menu_item_call label="Slet" name="Delete"/>
- <menu_item_call label="Slet systemfolder" name="Delete System Folder"/>
- <menu_item_call label="start konference chat" name="Conference Chat Folder"/>
- <menu_item_call label="Afspil" name="Sound Play"/>
- <menu_item_call label="Om landemærke" name="About Landmark"/>
- <menu_item_call label="Afspil i verden" name="Animation Play"/>
- <menu_item_call label="Afspil lokalt" name="Animation Audition"/>
- <menu_item_call label="Send privat besked (IM)" name="Send Instant Message"/>
- <menu_item_call label="Tilbyd teleport..." name="Offer Teleport..."/>
- <menu_item_call label="start konference Chat" name="Conference Chat"/>
- <menu_item_call label="Aktivér" name="Activate"/>
- <menu_item_call label="Deaktivér" name="Deactivate"/>
- <menu_item_call label="Gem som" name="Save As"/>
- <menu_item_call label="Tag af dig selv" name="Detach From Yourself"/>
- <menu_item_call label="Tag på" name="Wearable And Object Wear"/>
- <menu label="Vedhæft" name="Attach To"/>
- <menu label="Vedhæft til HUD" name="Attach To HUD"/>
- <menu_item_call label="Redigér" name="Wearable Edit"/>
- <menu_item_call label="Tilføj" name="Wearable Add"/>
- <menu_item_call label="Tag af" name="Take Off"/>
- <menu_item_call label="--ingen valg--" name="--no options--"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/da/menu_inventory_add.xml b/indra/newview/skins/minimal/xui/da/menu_inventory_add.xml
deleted file mode 100644
index 07f70d7190..0000000000
--- a/indra/newview/skins/minimal/xui/da/menu_inventory_add.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_inventory_add">
- <menu label="Hent" name="upload">
- <menu_item_call label="Billede (L$[COST])..." name="Upload Image"/>
- <menu_item_call label="Lyd (L$[COST])..." name="Upload Sound"/>
- <menu_item_call label="Animation (L$[COST])..." name="Upload Animation"/>
- <menu_item_call label="Hent mange (L$[COST] pr. fil)..." name="Bulk Upload"/>
- <menu_item_call label="Sæt standardværdier for upload rettigheder" name="perm prefs"/>
- </menu>
- <menu_item_call label="Ny mappe" name="New Folder"/>
- <menu_item_call label="Nyt script" name="New Script"/>
- <menu_item_call label="Ny note" name="New Note"/>
- <menu_item_call label="Ny bevægelse" name="New Gesture"/>
- <menu label="Nyt tøj" name="New Clothes">
- <menu_item_call label="Ny trøje" name="New Shirt"/>
- <menu_item_call label="Nye bukser" name="New Pants"/>
- <menu_item_call label="Nye sko" name="New Shoes"/>
- <menu_item_call label="Nye strømper" name="New Socks"/>
- <menu_item_call label="Ny jakke" name="New Jacket"/>
- <menu_item_call label="Ny nederdel" name="New Skirt"/>
- <menu_item_call label="Nye handsker" name="New Gloves"/>
- <menu_item_call label="Ny undertrøje" name="New Undershirt"/>
- <menu_item_call label="Nye underbukser" name="New Underpants"/>
- <menu_item_call label="Nyt alpha lag" name="New Alpha"/>
- <menu_item_call label="Ny tatovering" name="New Tattoo"/>
- </menu>
- <menu label="Nye kropsdele" name="New Body Parts">
- <menu_item_call label="Ny kropsbygning" name="New Shape"/>
- <menu_item_call label="Ny hud" name="New Skin"/>
- <menu_item_call label="Nyt hår" name="New Hair"/>
- <menu_item_call label="Nye øjne" name="New Eyes"/>
- </menu>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/da/menu_inventory_gear_default.xml b/indra/newview/skins/minimal/xui/da/menu_inventory_gear_default.xml
deleted file mode 100644
index 4809b24463..0000000000
--- a/indra/newview/skins/minimal/xui/da/menu_inventory_gear_default.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<toggleable_menu name="menu_gear_default">
- <menu_item_call label="Nyt vindue" name="new_window"/>
- <menu_item_check label="Sortér efter navn" name="sort_by_name"/>
- <menu_item_check label="Sortér efter nyeste" name="sort_by_recent"/>
- <menu_item_check label="Sortér altid mapper efter navn" name="sort_folders_by_name"/>
- <menu_item_check label="Vis System mapper øverst" name="sort_system_folders_to_top"/>
- <menu_item_call label="Vis filtre" name="show_filters"/>
- <menu_item_call label="Nulstil filtre" name="reset_filters"/>
- <menu_item_call label="Luk alle mapper" name="close_folders"/>
- <menu_item_call label="Tøm &quot;fundne genstande&quot;" name="empty_lostnfound"/>
- <menu_item_call label="Gem tekstur som" name="Save Texture As"/>
- <menu_item_call label="Del" name="Share"/>
- <menu_item_call label="Find original" name="Find Original"/>
- <menu_item_call label="Find alle links" name="Find All Links"/>
- <menu_item_call label="Tøm papirkurv" name="empty_trash"/>
-</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/da/menu_land.xml b/indra/newview/skins/minimal/xui/da/menu_land.xml
deleted file mode 100644
index 1548f18f89..0000000000
--- a/indra/newview/skins/minimal/xui/da/menu_land.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Land Pie">
- <menu_item_call label="Om land" name="Place Information..."/>
- <menu_item_call label="Sid her" name="Sit Here"/>
- <menu_item_call label="Køb" name="Land Buy"/>
- <menu_item_call label="Køb adgang" name="Land Buy Pass"/>
- <menu_item_call label="Byg" name="Create"/>
- <menu_item_call label="Tilpas terræn" name="Edit Terrain"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/da/menu_landmark.xml b/indra/newview/skins/minimal/xui/da/menu_landmark.xml
deleted file mode 100644
index 3cf2ffe375..0000000000
--- a/indra/newview/skins/minimal/xui/da/menu_landmark.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<toggleable_menu name="landmark_overflow_menu">
- <menu_item_call label="Kopiér SLurl" name="copy"/>
- <menu_item_call label="Slet" name="delete"/>
- <menu_item_call label="Opret favorit" name="pick"/>
- <menu_item_call label="Tilføj til favorit bjælke" name="add_to_favbar"/>
-</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/da/menu_login.xml b/indra/newview/skins/minimal/xui/da/menu_login.xml
deleted file mode 100644
index 0b7a5040ae..0000000000
--- a/indra/newview/skins/minimal/xui/da/menu_login.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu_bar name="Login Menu">
- <menu label="Mig" name="File">
- <menu_item_call label="Indstillinger" name="Preferences..."/>
- <menu_item_call label="Afslut [APP_NAME]" name="Quit"/>
- </menu>
- <menu label="Hjælp" name="Help">
- <menu_item_call label="[SECOND_LIFE] hjælp" name="Second Life Help"/>
- <menu_item_call label="Om [APP_NAME]" name="About Second Life"/>
- </menu>
- <menu_item_check label="Vis debug menu" name="Show Debug Menu"/>
- <menu label="Debug" name="Debug">
- <menu_item_call label="Vis debug opsætning" name="Debug Settings"/>
- <menu_item_call label="UI/farve opsætning" name="UI/Color Settings"/>
- <menu label="UI tests" name="UI Tests"/>
- <menu_item_call label="Sæt vinduesstørrelse" name="Set Window Size..."/>
- <menu_item_call label="Vis betingelser" name="TOS"/>
- <menu_item_call label="Vis vigtig besked" name="Critical"/>
- <menu_item_call label="Media Browser Test" name="Web Browser Test"/>
- <menu_item_call label="Web Content Floater Test" name="Web Content Floater Test"/>
- <menu_item_check label="Vis gitter vælger" name="Show Grid Picker"/>
- <menu_item_call label="Vis notifikationskonsol" name="Show Notifications Console"/>
- </menu>
-</menu_bar>
diff --git a/indra/newview/skins/minimal/xui/da/menu_mini_map.xml b/indra/newview/skins/minimal/xui/da/menu_mini_map.xml
deleted file mode 100644
index 186dbd476a..0000000000
--- a/indra/newview/skins/minimal/xui/da/menu_mini_map.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Popup">
- <menu_item_call label="Zoom tæt" name="Zoom Close"/>
- <menu_item_call label="Zoom mellem" name="Zoom Medium"/>
- <menu_item_call label="Zoom langt" name="Zoom Far"/>
- <menu_item_call label="Zoom standard" name="Zoom Default"/>
- <menu_item_check label="Rotér kort" name="Rotate Map"/>
- <menu_item_check label="Auto centrér" name="Auto Center"/>
- <menu_item_call label="Fjern ref." name="Stop Tracking"/>
- <menu_item_call label="Verdenskort" name="World Map"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/da/menu_navbar.xml b/indra/newview/skins/minimal/xui/da/menu_navbar.xml
deleted file mode 100644
index c04206824a..0000000000
--- a/indra/newview/skins/minimal/xui/da/menu_navbar.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Navbar Menu">
- <menu_item_check label="Vis koordinater" name="Show Coordinates"/>
- <menu_item_check label="Vis oplysninger om parcel" name="Show Parcel Properties"/>
- <menu_item_call label="Landemærke" name="Landmark"/>
- <menu_item_call label="Klip" name="Cut"/>
- <menu_item_call label="Kopiér" name="Copy"/>
- <menu_item_call label="Sæt ind" name="Paste"/>
- <menu_item_call label="Slet" name="Delete"/>
- <menu_item_call label="Vælg alt" name="Select All"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/da/menu_nearby_chat.xml b/indra/newview/skins/minimal/xui/da/menu_nearby_chat.xml
deleted file mode 100644
index be532ad406..0000000000
--- a/indra/newview/skins/minimal/xui/da/menu_nearby_chat.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="NearBy Chat Menu">
- <menu_item_call label="Vis personer tæt på..." name="nearby_people"/>
- <menu_item_check label="Vis blokeret tekst" name="muted_text"/>
- <menu_item_check label="Vis venne-ikoner" name="show_buddy_icons"/>
- <menu_item_check label="Vis navne" name="show_names"/>
- <menu_item_check label="Vis ikoner og navne" name="show_icons_and_names"/>
- <menu_item_call label="Font størrelse" name="font_size"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/da/menu_notification_well_button.xml b/indra/newview/skins/minimal/xui/da/menu_notification_well_button.xml
deleted file mode 100644
index 40b35b5fdd..0000000000
--- a/indra/newview/skins/minimal/xui/da/menu_notification_well_button.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Notification Well Button Context Menu">
- <menu_item_call label="Luk alle" name="Close All"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/da/menu_object.xml b/indra/newview/skins/minimal/xui/da/menu_object.xml
deleted file mode 100644
index ba62ccf90c..0000000000
--- a/indra/newview/skins/minimal/xui/da/menu_object.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Object Pie">
- <menu_item_call label="Berør" name="Object Touch">
- <menu_item_call.on_enable name="EnableTouch" parameter="Berør"/>
- </menu_item_call>
- <menu_item_call label="Redigér" name="Edit..."/>
- <menu_item_call label="Byg" name="Build"/>
- <menu_item_call label="Ã…ben" name="Open"/>
- <menu_item_call label="Sid her" name="Object Sit"/>
- <menu_item_call label="Stå op" name="Object Stand Up"/>
- <menu_item_call label="Objekt profil" name="Object Inspect"/>
- <menu_item_call label="Zoom In" name="Zoom In"/>
- <context_menu label="Tag på" name="Put On">
- <menu_item_call label="Tag på" name="Wear"/>
- <menu_item_call label="Tilføj" name="Add"/>
- <context_menu label="Vedhæft" name="Object Attach"/>
- <context_menu label="Vedhæft HUD" name="Object Attach HUD"/>
- </context_menu>
- <context_menu label="Administrér" name="Remove">
- <menu_item_call label="Rapportér misbrug" name="Report Abuse..."/>
- <menu_item_call label="Blokér" name="Object Mute"/>
- <menu_item_call label="Returnér" name="Return..."/>
- </context_menu>
- <menu_item_call label="Tag" name="Pie Object Take"/>
- <menu_item_call label="Tag kopi" name="Take Copy"/>
- <menu_item_call label="Betal" name="Pay..."/>
- <menu_item_call label="Køb" name="Buy..."/>
- <menu_item_call label="Slet" name="Delete"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/da/menu_object_icon.xml b/indra/newview/skins/minimal/xui/da/menu_object_icon.xml
deleted file mode 100644
index 08aeb633b6..0000000000
--- a/indra/newview/skins/minimal/xui/da/menu_object_icon.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Object Icon Menu">
- <menu_item_call label="Objekt Profil..." name="Object Profile"/>
- <menu_item_call label="Blokér..." name="Block"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/da/menu_outfit_gear.xml b/indra/newview/skins/minimal/xui/da/menu_outfit_gear.xml
deleted file mode 100644
index 8b4c776496..0000000000
--- a/indra/newview/skins/minimal/xui/da/menu_outfit_gear.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Gear Outfit">
- <menu_item_call label="Tag på - Erstat nuværende sæt" name="wear"/>
- <menu_item_call label="Tag på - Tilføj til nuværende sæt" name="wear_add"/>
- <menu_item_call label="Tag af - Fjern fra nuværende sæt" name="take_off"/>
- <menu label="Nyt tøj" name="New Clothes">
- <menu_item_call label="Ny trøje" name="New Shirt"/>
- <menu_item_call label="Nye bukser" name="New Pants"/>
- <menu_item_call label="Nye sko" name="New Shoes"/>
- <menu_item_call label="Nye strømper" name="New Socks"/>
- <menu_item_call label="Ny jakke" name="New Jacket"/>
- <menu_item_call label="Ny nederdel" name="New Skirt"/>
- <menu_item_call label="Nye handsker" name="New Gloves"/>
- <menu_item_call label="Ny undertrøje" name="New Undershirt"/>
- <menu_item_call label="Nye underbukser" name="New Underpants"/>
- <menu_item_call label="Ny alpha" name="New Alpha"/>
- <menu_item_call label="Ny tatovering" name="New Tattoo"/>
- </menu>
- <menu label="Nye kropsdele" name="New Body Parts">
- <menu_item_call label="Ny figur" name="New Shape"/>
- <menu_item_call label="Nyt hud" name="New Skin"/>
- <menu_item_call label="Nyt hår" name="New Hair"/>
- <menu_item_call label="Nye øjne" name="New Eyes"/>
- </menu>
- <menu_item_call label="Omdøb sæt" name="rename"/>
- <menu_item_call label="Slet sæt" name="delete_outfit"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/da/menu_outfit_tab.xml b/indra/newview/skins/minimal/xui/da/menu_outfit_tab.xml
deleted file mode 100644
index d6a6f2724f..0000000000
--- a/indra/newview/skins/minimal/xui/da/menu_outfit_tab.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Outfit">
- <menu_item_call label="Tag på - Erstat nuværende sæt" name="wear_replace"/>
- <menu_item_call label="Tag på - Tilføj til nuværende sæt" name="wear_add"/>
- <menu_item_call label="Tag af - Fjern fra nuværende sæt" name="take_off"/>
- <menu_item_call label="Redigér sæt" name="edit"/>
- <menu_item_call label="Omdøb sæt" name="rename"/>
- <menu_item_call label="Slet sæt" name="delete"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/da/menu_participant_list.xml b/indra/newview/skins/minimal/xui/da/menu_participant_list.xml
deleted file mode 100644
index 5951d3ffb9..0000000000
--- a/indra/newview/skins/minimal/xui/da/menu_participant_list.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Participant List Context Menu">
- <menu_item_check label="Sortér efter navn" name="SortByName"/>
- <menu_item_check label="Sortér efter nylige talere" name="SortByRecentSpeakers"/>
- <menu_item_call label="Profil" name="View Profile"/>
- <menu_item_call label="Tilføj ven" name="Add Friend"/>
- <menu_item_call label="Send besked" name="IM"/>
- <menu_item_call label="Opkald" name="Call"/>
- <menu_item_call label="Del" name="Share"/>
- <menu_item_call label="Betal" name="Pay"/>
- <menu_item_check label="Se person ikoner" name="View Icons"/>
- <menu_item_check label="Blokér stemme" name="Block/Unblock"/>
- <menu_item_check label="Blokér tekst" name="MuteText"/>
- <context_menu label="Moderator valg" name="Moderator Options">
- <menu_item_check label="Tillad tekst chat" name="AllowTextChat"/>
- <menu_item_call label="Sluk for denne deltager" name="ModerateVoiceMuteSelected"/>
- <menu_item_call label="Fjern slukning for denne deltager" name="ModerateVoiceUnMuteSelected"/>
- <menu_item_call label="Sluk lyd for alle" name="ModerateVoiceMute"/>
- <menu_item_call label="Tænd lyd for alle" name="ModerateVoiceUnmute"/>
- </context_menu>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/da/menu_people_friends_view_sort.xml b/indra/newview/skins/minimal/xui/da/menu_people_friends_view_sort.xml
deleted file mode 100644
index 32c5e6a6c7..0000000000
--- a/indra/newview/skins/minimal/xui/da/menu_people_friends_view_sort.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_group_plus">
- <menu_item_check label="Sortér efter navn" name="sort_name"/>
- <menu_item_check label="Sortér efter status" name="sort_status"/>
- <menu_item_check label="Vis person ikoner" name="view_icons"/>
- <menu_item_check label="Vis tildelte rettigheder" name="view_permissions"/>
- <menu_item_call label="Vis blokerede beboere og objekter" name="show_blocked_list"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/da/menu_people_groups.xml b/indra/newview/skins/minimal/xui/da/menu_people_groups.xml
deleted file mode 100644
index 841f58b619..0000000000
--- a/indra/newview/skins/minimal/xui/da/menu_people_groups.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_group_plus">
- <menu_item_call label="Se info" name="View Info"/>
- <menu_item_call label="Chat" name="Chat"/>
- <menu_item_call label="Opkald" name="Call"/>
- <menu_item_call label="Aktivér" name="Activate"/>
- <menu_item_call label="Forlad" name="Leave"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/da/menu_people_groups_view_sort.xml b/indra/newview/skins/minimal/xui/da/menu_people_groups_view_sort.xml
deleted file mode 100644
index 0b9a791530..0000000000
--- a/indra/newview/skins/minimal/xui/da/menu_people_groups_view_sort.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_group_plus">
- <menu_item_check label="Vis gruppe ikoner" name="Display Group Icons"/>
- <menu_item_call label="Forlad valgte gruppe" name="Leave Selected Group"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/da/menu_people_nearby.xml b/indra/newview/skins/minimal/xui/da/menu_people_nearby.xml
deleted file mode 100644
index 220ab8724f..0000000000
--- a/indra/newview/skins/minimal/xui/da/menu_people_nearby.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Avatar Context Menu">
- <menu_item_call label="Vis profil" name="View Profile"/>
- <menu_item_call label="Tilføj som ven" name="Add Friend"/>
- <menu_item_call label="Fjern venskab" name="Remove Friend"/>
- <menu_item_call label="IM" name="IM"/>
- <menu_item_call label="Opkald" name="Call"/>
- <menu_item_call label="Kort" name="Map"/>
- <menu_item_call label="Del" name="Share"/>
- <menu_item_call label="Betal" name="Pay"/>
- <menu_item_check label="Blokér/Fjern blokering" name="Block/Unblock"/>
- <menu_item_call label="Tilbyd teleport" name="teleport"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/da/menu_people_nearby_multiselect.xml b/indra/newview/skins/minimal/xui/da/menu_people_nearby_multiselect.xml
deleted file mode 100644
index 9318a0e340..0000000000
--- a/indra/newview/skins/minimal/xui/da/menu_people_nearby_multiselect.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Multi-Selected People Context Menu">
- <menu_item_call label="Tilføj venner" name="Add Friends"/>
- <menu_item_call label="Fjern venner" name="Remove Friend"/>
- <menu_item_call label="Besked" name="IM"/>
- <menu_item_call label="Opkald" name="Call"/>
- <menu_item_call label="Del" name="Share"/>
- <menu_item_call label="Betal" name="Pay"/>
- <menu_item_call label="tilbyd teleport" name="teleport"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/da/menu_people_nearby_view_sort.xml b/indra/newview/skins/minimal/xui/da/menu_people_nearby_view_sort.xml
deleted file mode 100644
index 2f35ff3c92..0000000000
--- a/indra/newview/skins/minimal/xui/da/menu_people_nearby_view_sort.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_group_plus">
- <menu_item_check label="Sortér efter tidligere talere" name="sort_by_recent_speakers"/>
- <menu_item_check label="Sortér efter navn" name="sort_name"/>
- <menu_item_check label="Sortér efter afstand" name="sort_distance"/>
- <menu_item_check label="Se ikoner for personer" name="view_icons"/>
- <menu_item_call label="Vis blokerede beboere og objekter" name="show_blocked_list"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/da/menu_people_recent_view_sort.xml b/indra/newview/skins/minimal/xui/da/menu_people_recent_view_sort.xml
deleted file mode 100644
index d081f637f2..0000000000
--- a/indra/newview/skins/minimal/xui/da/menu_people_recent_view_sort.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_group_plus">
- <menu_item_check label="Sortér efter nyeste" name="sort_most"/>
- <menu_item_check label="Sortér efter navn" name="sort_name"/>
- <menu_item_check label="Vis person ikoner" name="view_icons"/>
- <menu_item_call label="Vis blokerede beboere og objekter" name="show_blocked_list"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/da/menu_picks.xml b/indra/newview/skins/minimal/xui/da/menu_picks.xml
deleted file mode 100644
index 81ee900773..0000000000
--- a/indra/newview/skins/minimal/xui/da/menu_picks.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Picks">
- <menu_item_call label="Info" name="pick_info"/>
- <menu_item_call label="Redigér" name="pick_edit"/>
- <menu_item_call label="Teleportér" name="pick_teleport"/>
- <menu_item_call label="Vis på kort" name="pick_map"/>
- <menu_item_call label="Slet" name="pick_delete"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/da/menu_picks_plus.xml b/indra/newview/skins/minimal/xui/da/menu_picks_plus.xml
deleted file mode 100644
index d95071fbbb..0000000000
--- a/indra/newview/skins/minimal/xui/da/menu_picks_plus.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<toggleable_menu name="picks_plus_menu">
- <menu_item_call label="Ny favorit" name="create_pick"/>
- <menu_item_call label="Ny annonce" name="create_classified"/>
-</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/da/menu_place.xml b/indra/newview/skins/minimal/xui/da/menu_place.xml
deleted file mode 100644
index b87964ac14..0000000000
--- a/indra/newview/skins/minimal/xui/da/menu_place.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<toggleable_menu name="place_overflow_menu">
- <menu_item_call label="Opret et landemærke" name="landmark"/>
- <menu_item_call label="Opret favorit" name="pick"/>
- <menu_item_call label="Køb adgang" name="pass"/>
- <menu_item_call label="Redigér" name="edit"/>
-</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/da/menu_place_add_button.xml b/indra/newview/skins/minimal/xui/da/menu_place_add_button.xml
deleted file mode 100644
index 7ad2253550..0000000000
--- a/indra/newview/skins/minimal/xui/da/menu_place_add_button.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_folder_gear">
- <menu_item_call label="Opret mappe" name="add_folder"/>
- <menu_item_call label="Tilføj landemærke" name="add_landmark"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/da/menu_places_gear_folder.xml b/indra/newview/skins/minimal/xui/da/menu_places_gear_folder.xml
deleted file mode 100644
index 5f573c2363..0000000000
--- a/indra/newview/skins/minimal/xui/da/menu_places_gear_folder.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<toggleable_menu name="menu_folder_gear">
- <menu_item_call label="Tilføj landemærke" name="add_landmark"/>
- <menu_item_call label="Tilføj mappe" name="add_folder"/>
- <menu_item_call label="Gendan genstand" name="restore_item"/>
- <menu_item_call label="Klip" name="cut"/>
- <menu_item_call label="Kopiér" name="copy_folder"/>
- <menu_item_call label="Sæt ind" name="paste"/>
- <menu_item_call label="Omdøb" name="rename"/>
- <menu_item_call label="Slet" name="delete"/>
- <menu_item_call label="Udvid" name="expand"/>
- <menu_item_call label="Luk" name="collapse"/>
- <menu_item_call label="Udvid alle mapper" name="expand_all"/>
- <menu_item_call label="Luk alle mapper" name="collapse_all"/>
- <menu_item_check label="Sortér efter dato" name="sort_by_date"/>
-</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/da/menu_places_gear_landmark.xml b/indra/newview/skins/minimal/xui/da/menu_places_gear_landmark.xml
deleted file mode 100644
index 13dbcdd42e..0000000000
--- a/indra/newview/skins/minimal/xui/da/menu_places_gear_landmark.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<toggleable_menu name="menu_ladmark_gear">
- <menu_item_call label="Teleportér" name="teleport"/>
- <menu_item_call label="Mere information" name="more_info"/>
- <menu_item_call label="Vis på kort" name="show_on_map"/>
- <menu_item_call label="Tilføj landemærke" name="add_landmark"/>
- <menu_item_call label="Tilføj mappe" name="add_folder"/>
- <menu_item_call label="Gendan genstand" name="restore_item"/>
- <menu_item_call label="Klip" name="cut"/>
- <menu_item_call label="Kopiér landemærke" name="copy_landmark"/>
- <menu_item_call label="Kopiér SLurl" name="copy_slurl"/>
- <menu_item_call label="Sæt ind" name="paste"/>
- <menu_item_call label="Omdøb" name="rename"/>
- <menu_item_call label="Slet" name="delete"/>
- <menu_item_call label="Ã…ben alle mapper" name="expand_all"/>
- <menu_item_call label="Luk alle mapper" name="collapse_all"/>
- <menu_item_check label="Sortér efter dato" name="sort_by_date"/>
- <menu_item_call label="Opret favorit" name="create_pick"/>
-</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/da/menu_profile_overflow.xml b/indra/newview/skins/minimal/xui/da/menu_profile_overflow.xml
deleted file mode 100644
index 6745007c99..0000000000
--- a/indra/newview/skins/minimal/xui/da/menu_profile_overflow.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<toggleable_menu name="profile_overflow_menu">
- <menu_item_call label="Kort" name="show_on_map"/>
- <menu_item_call label="Betal" name="pay"/>
- <menu_item_call label="Del" name="share"/>
- <menu_item_call label="Blokér" name="block"/>
- <menu_item_call label="Fjern blokering" name="unblock"/>
- <menu_item_call label="Spark" name="kick"/>
- <menu_item_call label="Frys" name="freeze"/>
- <menu_item_call label="Fjern frys" name="unfreeze"/>
- <menu_item_call label="Kundeservicemedarbejder (CSR)" name="csr"/>
-</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/da/menu_save_outfit.xml b/indra/newview/skins/minimal/xui/da/menu_save_outfit.xml
deleted file mode 100644
index 188229b586..0000000000
--- a/indra/newview/skins/minimal/xui/da/menu_save_outfit.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<toggleable_menu name="save_outfit_menu">
- <menu_item_call label="Gem" name="save_outfit"/>
- <menu_item_call label="Gem som" name="save_as_new_outfit"/>
-</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/da/menu_script_chiclet.xml b/indra/newview/skins/minimal/xui/da/menu_script_chiclet.xml
deleted file mode 100644
index cdd3212373..0000000000
--- a/indra/newview/skins/minimal/xui/da/menu_script_chiclet.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="ScriptChiclet Menu">
- <menu_item_call label="Luk" name="Close"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/da/menu_slurl.xml b/indra/newview/skins/minimal/xui/da/menu_slurl.xml
deleted file mode 100644
index a9302e111e..0000000000
--- a/indra/newview/skins/minimal/xui/da/menu_slurl.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Popup">
- <menu_item_call label="Om URL" name="about_url"/>
- <menu_item_call label="Teleportér til URL" name="teleport_to_url"/>
- <menu_item_call label="Kort" name="show_on_map"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/da/menu_teleport_history_gear.xml b/indra/newview/skins/minimal/xui/da/menu_teleport_history_gear.xml
deleted file mode 100644
index a1c25fea69..0000000000
--- a/indra/newview/skins/minimal/xui/da/menu_teleport_history_gear.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Teleport History Gear Context Menu">
- <menu_item_call label="Udvid alle mapper" name="Expand all folders"/>
- <menu_item_call label="Luk alle mapper" name="Collapse all folders"/>
- <menu_item_call label="Nulstil teleport historik" name="Clear Teleport History"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/da/menu_teleport_history_item.xml b/indra/newview/skins/minimal/xui/da/menu_teleport_history_item.xml
deleted file mode 100644
index dbaec62087..0000000000
--- a/indra/newview/skins/minimal/xui/da/menu_teleport_history_item.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Teleport History Item Context Menu">
- <menu_item_call label="Teleportér" name="Teleport"/>
- <menu_item_call label="Mere information" name="More Information"/>
- <menu_item_call label="Kopiér til udklipsholder" name="CopyToClipboard"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/da/menu_teleport_history_tab.xml b/indra/newview/skins/minimal/xui/da/menu_teleport_history_tab.xml
deleted file mode 100644
index c4d4bb4b5b..0000000000
--- a/indra/newview/skins/minimal/xui/da/menu_teleport_history_tab.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Teleport History Item Context Menu">
- <menu_item_call label="Ã…ben" name="TabOpen"/>
- <menu_item_call label="Luk" name="TabClose"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/da/menu_text_editor.xml b/indra/newview/skins/minimal/xui/da/menu_text_editor.xml
deleted file mode 100644
index 3ff31ea232..0000000000
--- a/indra/newview/skins/minimal/xui/da/menu_text_editor.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Text editor context menu">
- <menu_item_call label="Klip" name="Cut"/>
- <menu_item_call label="Kopiér" name="Copy"/>
- <menu_item_call label="Sæt ind" name="Paste"/>
- <menu_item_call label="Slet" name="Delete"/>
- <menu_item_call label="Vælg alt" name="Select All"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/da/menu_topinfobar.xml b/indra/newview/skins/minimal/xui/da/menu_topinfobar.xml
deleted file mode 100644
index 08d1c25d6f..0000000000
--- a/indra/newview/skins/minimal/xui/da/menu_topinfobar.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_topinfobar">
- <menu_item_check label="Vis koordinater" name="Show Coordinates"/>
- <menu_item_check label="Vis egenskaber for parcel" name="Show Parcel Properties"/>
- <menu_item_call label="Landemærke" name="Landmark"/>
- <menu_item_call label="Kopi" name="Copy"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/da/menu_url_agent.xml b/indra/newview/skins/minimal/xui/da/menu_url_agent.xml
deleted file mode 100644
index 491586f3b4..0000000000
--- a/indra/newview/skins/minimal/xui/da/menu_url_agent.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Url Popup">
- <menu_item_call label="Vis beboer profil" name="show_agent"/>
- <menu_item_call label="Kopiér navn til udklipsholder" name="url_copy_label"/>
- <menu_item_call label="Kopiér SLurl til udklipsholder" name="url_copy"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/da/menu_url_group.xml b/indra/newview/skins/minimal/xui/da/menu_url_group.xml
deleted file mode 100644
index c776159b0a..0000000000
--- a/indra/newview/skins/minimal/xui/da/menu_url_group.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Url Popup">
- <menu_item_call label="Vis gruppeinformation" name="show_group"/>
- <menu_item_call label="Kopiér gruppe til udklipsholder" name="url_copy_label"/>
- <menu_item_call label="Kopiér SLurl til udklipsholder" name="url_copy"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/da/menu_url_http.xml b/indra/newview/skins/minimal/xui/da/menu_url_http.xml
deleted file mode 100644
index 4398777a39..0000000000
--- a/indra/newview/skins/minimal/xui/da/menu_url_http.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Url Popup">
- <menu_item_call label="Indlæs" name="url_open"/>
- <menu_item_call label="Ã…ben i intern browser" name="url_open_internal"/>
- <menu_item_call label="Ã…ben i ekstern browser" name="url_open_external"/>
- <menu_item_call label="Kopiér URL til udklipsholder" name="url_copy"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/da/menu_url_inventory.xml b/indra/newview/skins/minimal/xui/da/menu_url_inventory.xml
deleted file mode 100644
index 9a7de23e06..0000000000
--- a/indra/newview/skins/minimal/xui/da/menu_url_inventory.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Url Popup">
- <menu_item_call label="Vis beholdningsgenstand" name="show_item"/>
- <menu_item_call label="Kopiér navn til udklipsholder" name="url_copy_label"/>
- <menu_item_call label="Kopiér SLurl til udklipsholder" name="url_copy"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/da/menu_url_map.xml b/indra/newview/skins/minimal/xui/da/menu_url_map.xml
deleted file mode 100644
index ff4a4d5174..0000000000
--- a/indra/newview/skins/minimal/xui/da/menu_url_map.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Url Popup">
- <menu_item_call label="Vis på kort" name="show_on_map"/>
- <menu_item_call label="Teleport til lokation" name="teleport_to_location"/>
- <menu_item_call label="Kopiér SLurl til udklipsholder" name="url_copy"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/da/menu_url_objectim.xml b/indra/newview/skins/minimal/xui/da/menu_url_objectim.xml
deleted file mode 100644
index e27cf84959..0000000000
--- a/indra/newview/skins/minimal/xui/da/menu_url_objectim.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Url Popup">
- <menu_item_call label="Vis objekt information" name="show_object"/>
- <menu_item_call label="Vis på kort" name="show_on_map"/>
- <menu_item_call label="Teleportér til objekt lokation" name="teleport_to_object"/>
- <menu_item_call label="Kopiér objekt navn til udklipsholder" name="url_copy_label"/>
- <menu_item_call label="Kopiér SLurl til udklipsholder" name="url_copy"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/da/menu_url_parcel.xml b/indra/newview/skins/minimal/xui/da/menu_url_parcel.xml
deleted file mode 100644
index 0f21e14f66..0000000000
--- a/indra/newview/skins/minimal/xui/da/menu_url_parcel.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Url Popup">
- <menu_item_call label="Vis information om parcel" name="show_parcel"/>
- <menu_item_call label="Vis på kort" name="show_on_map"/>
- <menu_item_call label="Kopiér SLurl til udklipsholder" name="url_copy"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/da/menu_url_slapp.xml b/indra/newview/skins/minimal/xui/da/menu_url_slapp.xml
deleted file mode 100644
index dd25db2aa7..0000000000
--- a/indra/newview/skins/minimal/xui/da/menu_url_slapp.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Url Popup">
- <menu_item_call label="Kør denne kommando" name="run_slapp"/>
- <menu_item_call label="Kopiér SLurl til udklipsholder" name="url_copy"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/da/menu_url_slurl.xml b/indra/newview/skins/minimal/xui/da/menu_url_slurl.xml
deleted file mode 100644
index 8d84a138bb..0000000000
--- a/indra/newview/skins/minimal/xui/da/menu_url_slurl.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Url Popup">
- <menu_item_call label="Vis information" name="show_place"/>
- <menu_item_call label="Vis på kort" name="show_on_map"/>
- <menu_item_call label="Teleportér til lokation" name="teleport_to_location"/>
- <menu_item_call label="Kopiér SLurl til udklipsholder" name="url_copy"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/da/menu_url_teleport.xml b/indra/newview/skins/minimal/xui/da/menu_url_teleport.xml
deleted file mode 100644
index e0ca7b920d..0000000000
--- a/indra/newview/skins/minimal/xui/da/menu_url_teleport.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Url Popup">
- <menu_item_call label="Teleport" name="teleport"/>
- <menu_item_call label="Vis på kort" name="show_on_map"/>
- <menu_item_call label="Kopiér SLurl til udklipsholder" name="url_copy"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/da/menu_viewer.xml b/indra/newview/skins/minimal/xui/da/menu_viewer.xml
deleted file mode 100644
index 93b247f841..0000000000
--- a/indra/newview/skins/minimal/xui/da/menu_viewer.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu_bar name="Main Menu">
- <menu label="Hjælp" name="Help">
- <menu_item_call label="[SECOND_LIFE] Help" name="Second Life Help"/>
- </menu>
- <menu label="Avanceret" name="Advanced">
- <menu label="Shortcuts" name="Shortcuts">
- <menu_item_check label="Flyv" name="Fly"/>
- <menu_item_call label="Luk vindue" name="Close Window"/>
- <menu_item_call label="Luk alle vinduer" name="Close All Windows"/>
- <menu_item_call label="Nulstil udsyn" name="Reset View"/>
- </menu>
- </menu>
-</menu_bar>
diff --git a/indra/newview/skins/minimal/xui/da/menu_wearable_list_item.xml b/indra/newview/skins/minimal/xui/da/menu_wearable_list_item.xml
deleted file mode 100644
index 63f4b0b388..0000000000
--- a/indra/newview/skins/minimal/xui/da/menu_wearable_list_item.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Outfit Wearable Context Menu">
- <menu_item_call label="Erstat" name="wear_replace"/>
- <menu_item_call label="Tag på" name="wear_wear"/>
- <menu_item_call label="Tilføj" name="wear_add"/>
- <menu_item_call label="Tag af" name="take_off_or_detach"/>
- <menu_item_call label="Tag af" name="detach"/>
- <context_menu label="Vedhæft til" name="wearable_attach_to"/>
- <context_menu label="Vedhæft til HUD" name="wearable_attach_to_hud"/>
- <menu_item_call label="Tag af" name="take_off"/>
- <menu_item_call label="Redigér" name="edit"/>
- <menu_item_call label="Genstandsprofil" name="object_profile"/>
- <menu_item_call label="Vis original" name="show_original"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/da/menu_wearing_gear.xml b/indra/newview/skins/minimal/xui/da/menu_wearing_gear.xml
deleted file mode 100644
index 515a15b287..0000000000
--- a/indra/newview/skins/minimal/xui/da/menu_wearing_gear.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Gear Wearing">
- <menu_item_call label="Redigér sæt" name="edit"/>
- <menu_item_call label="Tag af" name="takeoff"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/da/menu_wearing_tab.xml b/indra/newview/skins/minimal/xui/da/menu_wearing_tab.xml
deleted file mode 100644
index c0db7b6842..0000000000
--- a/indra/newview/skins/minimal/xui/da/menu_wearing_tab.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Wearing">
- <menu_item_call label="Tag af" name="take_off"/>
- <menu_item_call label="Tag af" name="detach"/>
- <menu_item_call label="Redigér sæt" name="edit"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/da/notifications.xml b/indra/newview/skins/minimal/xui/da/notifications.xml
deleted file mode 100644
index 3d003ea3b3..0000000000
--- a/indra/newview/skins/minimal/xui/da/notifications.xml
+++ /dev/null
@@ -1,1831 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<notifications>
- <global name="skipnexttime">
- Vis ikke dette igen
- </global>
- <global name="alwayschoose">
- Vælg altid dette
- </global>
- <global name="implicitclosebutton">
- Luk
- </global>
- <template name="okbutton">
- <form>
- <button name="OK_okbutton" text="$yestext"/>
- </form>
- </template>
- <template name="okignore">
- <form>
- <button name="OK_okignore" text="$yestext"/>
- </form>
- </template>
- <template name="okcancelbuttons">
- <form>
- <button name="OK_okcancelbuttons" text="$yestext"/>
- <button name="Cancel_okcancelbuttons" text="$notext"/>
- </form>
- </template>
- <template name="okcancelignore">
- <form>
- <button name="OK_okcancelignore" text="$yestext"/>
- <button name="Cancel_okcancelignore" text="$notext"/>
- </form>
- </template>
- <template name="okhelpbuttons">
- <form>
- <button name="OK_okhelpbuttons" text="$yestext"/>
- <button name="Help" text="$helptext"/>
- </form>
- </template>
- <template name="yesnocancelbuttons">
- <form>
- <button name="Yes" text="$yestext"/>
- <button name="No" text="$notext"/>
- <button name="Cancel_yesnocancelbuttons" text="$canceltext"/>
- </form>
- </template>
- <notification functor="GenericAcknowledge" label="Ukendt notificeringsbesked" name="MissingAlert">
- Din version af [APP_NAME] kan ikke vise den besked den lige modtog. Undersøg venligst at du har den nyester version af klienten installeret.
-
-Fejl detaljer: Beskeden kaldet &apos;[_NAME]&apos; blev ikke fundet i notifications.xml.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="FloaterNotFound">
- Floater error: Kunne ikke finde følgende kontrol:
-
-[CONTROLS]
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="TutorialNotFound">
- Der er i øjeblikket ingen tilgængelig guide.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="GenericAlert">
- [MESSAGE]
- </notification>
- <notification name="GenericAlertYesCancel">
- [MESSAGE]
- <usetemplate name="okcancelbuttons" notext="Annullér" yestext="Ja"/>
- </notification>
- <notification name="BadInstallation">
- Der opstod en fejl ved opdatering af [APP_NAME]. Please [http://get.secondlife.com download the latest version] of the Viewer.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="LoginFailedNoNetwork">
- Kunne ikke tilslutte til [SECOND_LIFE_GRID].
- &apos;[DIAGNOSTIC]&apos;
-Check at Internet forbindelsen fungerer korrekt.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="MessageTemplateNotFound">
- Besked template [PATH] kunne ikke findes.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="WearableSave">
- Gem ændringer til nuværende tøj/krops del?
- <usetemplate canceltext="Annullér" name="yesnocancelbuttons" notext="Gem ikke" yestext="Gem"/>
- </notification>
- <notification name="CompileQueueSaveText">
- Der var problemer med upload af teksten til et script af følgende årsager: [REASON]. Prøv igen senere.
- </notification>
- <notification name="CompileQueueSaveBytecode">
- Der var problemer med at uploade den kompileret script af følgende årsager: [REASON]. Prøv igen senere.
- </notification>
- <notification name="WriteAnimationFail">
- Der var et problem med skrivning af animations data. Prøv igen senere.
- </notification>
- <notification name="UploadAuctionSnapshotFail">
- Der var problemer med at uploade billedet til auktionen af følgende årsager: [REASON]
- </notification>
- <notification name="UnableToViewContentsMoreThanOne">
- Ude af stand til at se indholdet af mere end ét element ad gangen.
-Vælg kun en genstand, og prøv igen.
- </notification>
- <notification name="SaveClothingBodyChanges">
- Gem alle ændringer til tøj/krops dele?
- <usetemplate canceltext="Annullér" name="yesnocancelbuttons" notext="Gem Ikke" yestext="Gem Alt"/>
- </notification>
- <notification name="FriendsAndGroupsOnly">
- &apos;Ikke-venner&apos; vil ikke vide, at du har valgt at ignorere deres opkald og personlige beskeder (IM)
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="FavoritesOnLogin">
- Bemærk: Når du aktiverer dette valg, kan enhver der bruger denne computer se dine favorit lokationer.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="GrantModifyRights">
- Tildeling af ændre-rettigheder til andre beboere, tillader dem at ændre, slette eller tage ETHVERT objekt du måtte have. Vær MEGET forsigtig ved tildeling af denne rettighed.
-Ønsker du at give ændre-rettgheder til [NAME]?
- <usetemplate name="okcancelbuttons" notext="Nej" yestext="Ja"/>
- </notification>
- <notification name="GrantModifyRightsMultiple">
- At give redigerings rettigheder til en anden beboer, giver dem mulighed for at ændre, slette eller tage ALLE genstande, du måtte have i verden. Vær MEGET forsigtig når uddeler denne tilladelse.
-Ønsker du at ændre rettigheder for de valgte beboere?
- <usetemplate name="okcancelbuttons" notext="Nej" yestext="Ja"/>
- </notification>
- <notification name="RevokeModifyRights">
- Ønsker du at tilbagekalder ændre-rettigheder for [NAME]?
- <usetemplate name="okcancelbuttons" notext="Nej" yestext="Ja"/>
- </notification>
- <notification name="RevokeModifyRightsMultiple">
- Vil du tilbagekalde rettighederne for de valgte beboere?
- <usetemplate name="okcancelbuttons" notext="Nej" yestext="Ja"/>
- </notification>
- <notification name="UnableToCreateGroup">
- Kunne ikke oprette gruppe.
-[MESSAGE]
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="PanelGroupApply">
- [NEEDS_APPLY_MESSAGE]
-[WANT_APPLY_MESSAGE]
- <usetemplate canceltext="Annullér" name="yesnocancelbuttons" notext="Ignorer Ændringer" yestext="Godkend Ændringer"/>
- </notification>
- <notification name="MustSpecifyGroupNoticeSubject">
- Du skal angive et emne for at sende en gruppe besked.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="AddGroupOwnerWarning">
- Du er ved at tilføje medlemmer til rollen som [ROLE_NAME].
-Medlemmer ikke kan fjernes fra denne rolle.
-Medlemmerne skal fratræde sin rolle selv.
-Er du sikker på du vil fortsætte?
- <usetemplate ignoretext="Bekræft, før jeg tilføjer en ny gruppe ejer" name="okcancelignore" notext="Nej" yestext="Ja"/>
- </notification>
- <notification name="AssignDangerousActionWarning">
- Du er ved at tilføje muligheden for &apos;[ACTION_NAME]&apos; til
-rollen &apos;[ROLE_NAME]&apos;.
-
-*ADVARSEL*
-Ethvert medlem i en rolle med denne evne kan tildele sig selv -- og et andet medlem - roller med flere beføjelser, end de har i øjeblikket, potentielt kan de ophøje sig selv til nær-Ejer magt. Være sikker på, at du ved, hvad du laver, før tildeling af denne evne.
-
-Add this Ability to &apos;[ROLE_NAME]&apos;?
- <usetemplate name="okcancelbuttons" notext="Nej" yestext="Ja"/>
- </notification>
- <notification name="AttachmentDrop">
- Du er ved at smide et vedhæng.
- Er du sikker på at du vil fortsætte?
- <usetemplate ignoretext="Bekræft før vedhæng smides" name="okcancelignore" notext="Nej" yestext="Ja"/>
- </notification>
- <notification name="JoinGroupNoCost">
- Du melder dig ind i gruppen [NAME].
-Ønsker du at fortsætte?
- <usetemplate name="okcancelbuttons" notext="Annullér" yestext="Bliv medlem"/>
- </notification>
- <notification name="JoinGroupCannotAfford">
- Tilmelding til denne gruppe koster L$[COST].
-Du har ikke nok L$ til denne tilmelding.
- </notification>
- <notification name="CreateGroupCost">
- Oprettelse af denne gruppe vil koste L$100.
-Grupper skal have mindst 2 medlemmer, ellers slettes de for altid.
-Invitér venligst medlemmer indenfor 48 timer.
- <usetemplate canceltext="Annullér" name="okcancelbuttons" notext="Annullér" yestext="Oprete en gruppe for L$100"/>
- </notification>
- <notification name="ConfirmLandSaleToAnyoneChange">
- ADVARSEL: Ved at vælge &apos;sælg til enhver&apos; bliver til land tilgængeligt for alle i hele [SECOND_LIFE], også de som ikke er i denne region.
-
-Det valgte antal [LAND_SIZE] m² land bliver sat til salg.
-Salgprisen vil være [SALE_PRICE]L$ og vil være til salg til [NAME].
- </notification>
- <notification name="MultipleFacesSelected">
- Flere overflader er valgt for øjeblikket.
-Hvis du fortsætter med denne aktion, vil flere instanser af media blive vist på overfladerne på objektet.
-Hvis media kun skal vises på en overflade, vælg &apos;Vælg overflade&apos; og klik på den relevante overflade og klik på tilføj.
- <usetemplate ignoretext="Media vil blive sat på flere valgte overflader" name="okcancelignore" notext="Annullér" yestext="OK"/>
- </notification>
- <notification name="PromptMissingSubjMsg">
- E-mail dette billede med standard emne eller besked?
- <usetemplate name="okcancelbuttons" notext="Annullér" yestext="OK"/>
- </notification>
- <notification name="ErrorUploadingPostcard">
- Der var et problem med at sende billedet på grund af følgende: [REASON]
- </notification>
- <notification name="MaxAttachmentsOnOutfit">
- Kunne ikke vedhæfte objekt.
-Overskrider vedhæftnings begrænsning på [MAX_ATTACHMENTS] objekter. Tag venligst en anden vedhæftning af først.
- </notification>
- <notification name="MustHaveAccountToLogIn">
- Ups. Noget mangler at blive udfyldt.
-Du skal indtaste brugernavnet for din avatar.
-
-Du skal bruge en konto for at benytte [SECOND_LIFE]. Ønsker du at oprette en konto nu?
- <usetemplate name="okcancelbuttons" notext="Prøv igen" yestext="Lav ny konto"/>
- </notification>
- <notification name="InvalidCredentialFormat">
- Du skal indtaste enten dit brugernavn eller både dit fornavn og efternavn for din avatar i brugernavn feltet, derefter log på igen.
- </notification>
- <notification name="DeleteMedia">
- Du har valgt at slette media tilknyttet denne overflade.
-Er du sikker på at du vil fortsætte?
- <usetemplate ignoretext="Bekræft før jeg slette media i et objekt" name="okcancelignore" notext="Nej" yestext="Ja"/>
- </notification>
- <notification name="ClassifiedInsufficientFunds">
- Ikke nok penge til at oprette annonce.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="DeleteAvatarPick">
- Slet favorit &lt;nolink&gt;[PICK]&lt;/nolink&gt;?
- </notification>
- <notification name="DeleteOutfits">
- Slet valgte sæt?
- <usetemplate name="okcancelbuttons" notext="Annullér" yestext="OK"/>
- </notification>
- <notification name="CacheWillClear">
- Cache vil blive tømt ved næste genstart af [APP_NAME].
- </notification>
- <notification name="CacheWillBeMoved">
- Cache vil blive fjernet ved næste genstart af [APP_NAME].
-Note: This will clear the cache.
- </notification>
- <notification name="ChangeConnectionPort">
- Port ændringer vil blive effektueret ved næste genstart af [APP_NAME].
- </notification>
- <notification name="ChangeSkin">
- Den nye hud vil blive vist ved næste genstart af [APP_NAME].
- </notification>
- <notification name="ChangeLanguage">
- Ændring af sprog vil først have effekt efter genstart af [APP_NAME].
- </notification>
- <notification name="StartRegionEmpty">
- Ups, din start region er ikke angivet.
-Indtast venligst navn på region i Start lokation feltet eller vælg &quot;Min sidste lokation&quot; eller &quot;Hjem&quot;.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="UnsupportedHardware">
- Din computer opfylder ikke minimumskravene til [APP_NAME]. Du kan risikere nedsat hastighed. Desværre kan [SUPPORT_SITE] ikke tilbyde teknisk support til konfigurationer der ikke er understøttet.
-
-Besøg [_URL] for yderligere information?
- <usetemplate ignoretext="Din computer hardware understøttes ikke" name="okcancelignore" notext="No" yestext="Yes"/>
- </notification>
- <notification name="UnknownGPU">
- Dit system indeholder et grafikkort som [APP_NAME] ikke kan genkende.
-Dette skyldes ofte nyt hardware som endnu ikke er blevet testet med [APP_NAME]. Kortet vil sandsynligvis virke fint, med det kan være nødvendigt at justere grafik opsætningen.
-(Mig &gt; Indstillinger &gt; Grafik).
- <form name="form">
- <ignore name="ignore" text="Dit grafikkort kunne ikke identificeres"/>
- </form>
- </notification>
- <notification name="DisplaySettingsNoShaders">
- [APP_NAME] gik ned ved inititalisering af grafik drivere.
-Grafik kvaliteten sættes til &apos;lav&apos; for at undgå typiske problemer med drivere. Dette vil slå visse grafik funktioner fra.
-Vi anbefaler at opdatere driverne til dit grafikkort.
-Grafik kvaliteten kan forbedres i indstillinger &gt; Grafik.
- </notification>
- <notification name="CannotCopyWarning">
- Du har ikke rettigheder til at kopiere følgende genstande:
-[ITEMS]
-og du vil miste dem fra din beholdning hvis du forærer dem væk. Er du sikker på at du vil tilbyde disse genstande?
- </notification>
- <notification name="CannotGiveCategory">
- Du har ikke tilladelse til at videreføre den valgte mappe.
- </notification>
- <notification name="EjectAvatarFromGroup">
- Du har smidt [AVATAR_NAME] ud af gruppen [GROUP_NAME]
- </notification>
- <notification name="PromptGoToCurrencyPage">
- [EXTRA]
-
-Gå til [_URL] for information om køb af L$?
- </notification>
- <notification name="SoundFileInvalidChunkSize">
- Fejl i WAV fil (chunk size):
-[FILE]
- </notification>
- <notification name="CannotEncodeFile">
- Kunne ikke &apos;forstå&apos; filen: [FILE]
- </notification>
- <notification name="CorruptedProtectedDataStore">
- Vi kan ikke udfylde dit brugernavn og password. Dette kan ske hvis du ændrer netværksopsætning
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="DoNotSupportBulkAnimationUpload">
- [APP_NAME] understøtter p.t. ikke at send flere animationsfiler ad gangen.
- </notification>
- <notification name="LandmarkCreated">
- Du har tilføjet &quot;[LANDMARK_NAME]&quot; til din [FOLDER_NAME] mappe.
- </notification>
- <notification name="LandmarkAlreadyExists">
- Du har allerede et landemærke for denne lokation.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="CannotOpenScriptObjectNoMod">
- Ikke muligt at åbne script i objekt uden &apos;Redigére&apos; rettigheder.
- </notification>
- <notification name="CouldNotTeleportReason">
- Teleport fejlede.
-[REASON]
- </notification>
- <notification name="invalid_tport">
- Der opstod et problem ved din teleport. Det kan være nødvendigt at logge ind igen, før du kan teleporte.
-Hvis du bliver ved med at få denne fejl, check venligst [SUPPORT_SITE].
- </notification>
- <notification name="invalid_region_handoff">
- Der opstod et problem ved skift til ny region. Det kan være nødvendigt at logge ind igen, før du kan skifte til andre regioner.
-Hvis du bliver ved med at få denne fejl, check venligst [SUPPORT_SITE].
- </notification>
- <notification name="blocked_tport">
- Beklager, teleport er blokeret lige nu. Prøv igen senere.
-Hvis du stadig ikke kan teleporte, prøv venligst at logge ud og ligge ind for at løse dette problem.
- </notification>
- <notification name="nolandmark_tport">
- Beklager, systemet kunne ikke finde landmærke destinationen.
- </notification>
- <notification name="timeout_tport">
- Beklager, systemet kunne ikke fuldføre teleport forbindelse.
-Prøv igen om lidt.
- </notification>
- <notification name="noaccess_tport">
- Beklager, du har ikke adgang til denne teleport destination.
- </notification>
- <notification name="missing_attach_tport">
- Dine vedhæng er ikke ankommet endnu. Prøv at vente lidt endnu eller log ud og ind igen før du prøver at teleporte igen.
- </notification>
- <notification name="too_many_uploads_tport">
- Tekniske problemer hindrer at din teleport kan gennemføres.
-Prøv venligst igen om lidt eller vælg et mindre travlt område.
- </notification>
- <notification name="expired_tport">
- Beklager, men systemet kunne ikke fuldføre din teleport i rimelig tid. Prøv venligst igen om lidt.
- </notification>
- <notification name="expired_region_handoff">
- Beklager, men systemet kunne ikke fuldføre skift til anden region i rimelig tid. Prøv venligst igen om lidt.
- </notification>
- <notification name="no_host">
- Ikke muligt at fine teleport destination. Destinationen kan være midlertidig utilgængelig eller findes ikke mere.
-Prøv evt. igen om lidt.
- </notification>
- <notification name="no_inventory_host">
- Beholdningssystemet er ikke tilgængelig lige nu.
- </notification>
- <notification name="ForceOwnerAuctionWarning">
- Denne parcel er sat på auktion. Gennemtving ejerskab vil annullere denne auktion og måske irritere nogen beboere hvis bud allerede er afgivet.
-Gennemtving ejerskab?
- </notification>
- <notification name="CannotBuyLandNoRegion">
- Ikke i stand til at købe land:
-Kan ikke finde region som dette land er i.
- </notification>
- <notification name="CannotCloseFloaterBuyLand">
- Du kan ikke lukke &apos;Køb land&apos; vinduet før [APP_NAME] har vurderet en pris på denne transaktion.
- </notification>
- <notification name="CannotDeedLandNoRegion">
- Land kunne ikke dedikeres:
-Kunne ikke finde den region land ligger i.
- </notification>
- <notification name="CannotReleaseLandRegionNotFound">
- Kunne ikke efterlade land:
-Kan ikke finde den region landet ligger i.
- </notification>
- <notification name="CannotDivideLandNoRegion">
- Kunne ikke opdele land:
-Kan ikke finde den region landet ligger i.
- </notification>
- <notification name="CannotJoinLandNoRegion">
- Kunne ikke opdele land:
-Kan ikke finde den region landet ligger i.
- </notification>
- <notification name="CannotSaveToAssetStore">
- Kunne ikke gemme [NAME] i den centrale database.
-Dette er typisk en midlertidig fejl. Venligst rediger og gem igen om et par minutter.
- </notification>
- <notification name="YouHaveBeenLoggedOut">
- Du er blevet logget af [SECOND_LIFE]
- [MESSAGE]
- <usetemplate name="okcancelbuttons" notext="Afslut" yestext="Se PB &amp; Chat"/>
- </notification>
- <notification label="Tilføj ven" name="AddFriendWithMessage">
- Venner kan give tilladelse til at følge hinanden
-på Verdenskortet eller modtage status opdateringer.
-
-Tilbyd venskab til [NAME]?
- <form name="form">
- <input name="message">
- Vil du være min ven?
- </input>
- <button name="Offer" text="OK"/>
- <button name="Cancel" text="Annullér"/>
- </form>
- </notification>
- <notification label="Gem sæt" name="SaveOutfitAs">
- Gem det som jeg har på som nyt sæt:
- <form name="form">
- <input name="message">
- [DESC] (ny)
- </input>
- <button name="OK" text="OK"/>
- <button name="Cancel" text="Annullér"/>
- </form>
- </notification>
- <notification label="Gem" name="SaveWearableAs">
- Gem genstand til beholdning som:
- <form name="form">
- <input name="message">
- [DESC] (ny)
- </input>
- <button name="OK" text="OK"/>
- <button name="Cancel" text="Annullér"/>
- </form>
- </notification>
- <notification label="Omdøb sæt" name="RenameOutfit">
- Nyt navn til sæt:
- <form name="form">
- <input name="new_name">
- [NAME]
- </input>
- <button name="OK" text="OK"/>
- <button name="Cancel" text="Annullér"/>
- </form>
- </notification>
- <notification name="RemoveFromFriends">
- Ønsker du at fjerne [NAME] fra din venneliste?
- </notification>
- <notification name="ConfirmItemDeleteHasLinks">
- Mindst en af genstandene har lænkede genstande der peger på den. Hvis du sletter denne genstand, vil lænkninger ikke virke mere. Det anbefales kraftigt at fjerne lænkninger først.
-
-Er du sikker på at du vil slette disse genstande?
- <usetemplate name="okcancelbuttons" notext="Annullér" yestext="OK"/>
- </notification>
- <notification name="DeedLandToGroupWithContribution">
- Ved at dedikere denne parcel, vil gruppen skulle have og vedblive med at have nok kreditter til brug af land.
-Dedikeringen vil inkludere samtidige bidrag til gruppen fra &apos;[NAME]&apos;.
-Købsprisen for dette land er ikke refunderet til ejeren. Hvis en dedikeret parvel sælges, vil salgsprisen blive delt ligeligt mellem gruppe medlemmerne.
-
-Dediker disse [AREA] m² land til gruppen &apos;[GROUP_NAME]&apos;?
- </notification>
- <notification name="ErrorMessage">
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="AvatarMovedDesired">
- Den ønskede lokation er ikke tilgængelig lige nu.
-Du er blevet flyttet til en region in nærheden.
- </notification>
- <notification name="AvatarMovedLast">
- Din sidste lokation er ikke tilgængelig for øjeblikket.
-Du er blevet flyttet til en region in nærheden.
- </notification>
- <notification name="AvatarMovedHome">
- Din hjemme lokation er ikke tilgængelig for øjeblikket.
-Du er blevet flyttet til en region in nærheden.
-Du kan måske ønske at sætte en ny hjemme lokation.
- </notification>
- <notification name="ClothingLoading">
- Dit tøj hentes stadig ned.
-Du kan bruge [SECOND_LIFE] normalt og andre personer vil se dig korrekt.
- <form name="form">
- <ignore name="ignore" text="Det tager lang tid at hente tøj"/>
- </form>
- </notification>
- <notification name="FirstRun">
- [APP_NAME] installationen er færdig.
-
-Hvis det er første gang du bruger [SECOND_LIFE], skal du først oprette en konto for at logge på.
-Vend tilbage til [http://join.secondlife.com secondlife.com] for at oprette en ny konto?
- </notification>
- <notification name="LoginPacketNeverReceived">
- Der er problemer med at koble på. Der kan være et problem med din Internet forbindelse eller [SECOND_LIFE_GRID].
-
-Du kan enten checke din Internet forbindelse og prøve igen om lidt, klikke på Hjælp for at se [SUPPORT_SITE] siden, eller klikke på Teleport for at forsøge at teleportere hjem.
- </notification>
- <notification name="CantTeleportToGrid">
- Kunne ikke teleportere til [SLURL] da den er på et andet net ([GRID]) end det nuværende net ([CURRENT_GRID]). Luk venligst din klient og prøv igen.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="GeneralCertificateError">
- Kunne ikke opnå forbindelse til server.
-[REASON]
-
-Vedrørende: [SUBJECT_NAME_STRING]
-Fra: [ISSUER_NAME_STRING]
-Valid fra: [VALID_FROM]
-Valid til: [VALID_TO]
-MD5 Fingerprint: [SHA1_DIGEST]
-SHA1 Fingerprint: [MD5_DIGEST]
-Key Usage: [KEYUSAGE]
-Extended Key Usage: [EXTENDEDKEYUSAGE]
-Subject Key Identifier: [SUBJECTKEYIDENTIFIER]
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="TrustCertificateError">
- Certifikationsmyndighed for denne server er ikke kendt.
-
-Certifikat information:
-Vedrørende: [SUBJECT_NAME_STRING]
-Fra: [ISSUER_NAME_STRING]
-Valid fra: [VALID_FROM]
-Valid til: [VALID_TO]
-MD5 Fingerprint: [SHA1_DIGEST]
-SHA1 Fingerprint: [MD5_DIGEST]
-Key Usage: [KEYUSAGE]
-Extended Key Usage: [EXTENDEDKEYUSAGE]
-Subject Key Identifier: [SUBJECTKEYIDENTIFIER]
-
-Ønsker du at stole på denne myndighed?
- <usetemplate name="okcancelbuttons" notext="Annullér" yestext="Stol på"/>
- </notification>
- <notification name="NotEnoughCurrency">
- [NAME] L$ [PRICE] Du har ikke nok L$ til dette.
- </notification>
- <notification name="GrantedModifyRights">
- [NAME] har givet dig rettighed til at redigere sine objekter.
- </notification>
- <notification name="RevokedModifyRights">
- Dinne rettigheder til at redigere objekter ejet af [NAME] er fjernet
- </notification>
- <notification name="BuyOneObjectOnly">
- Ikke muligt at købe mere end et objekt ad gangen. Vælg kun ét objekt og prøv igen.
- </notification>
- <notification name="DownloadWindowsMandatory">
- En ny version af [APP_NAME] er tilgængelig.
-[MESSAGE]
-Du skal hente denne version for at bruge [APP_NAME].
- </notification>
- <notification name="DownloadWindows">
- En opdateret version af [APP_NAME] er tilgængelig.
-[MESSAGE]
-Denne opdatering er ikke påkrævet, men det anbefales at installere den for at opnå øget hastighed og forbedret stabilitet.
- </notification>
- <notification name="DownloadWindowsReleaseForDownload">
- En opdateret version af [APP_NAME] er tilgængelig.
-[MESSAGE]
-Denne opdatering er ikke påkrævet, men det anbefales at installere den for at opnå øget hastighed og forbedret stabilitet.
- </notification>
- <notification name="DownloadLinuxMandatory">
- En ny version af [APP_NAME] er tilgængelig.
-[MESSAGE]
-Du skal hente denne version for at kunne benytte [APP_NAME].
- <usetemplate name="okcancelbuttons" notext="Afslut" yestext="Hent"/>
- </notification>
- <notification name="DownloadLinux">
- En opdateret version af [APP_NAME] er tilgængelig.
-[MESSAGE]
-Denne opdatering er ikke påkrævet, men det anbefales at installere den for at opnå øget hastighed og forbedret stabilitet.
- <usetemplate name="okcancelbuttons" notext="Fortsæt" yestext="Hent"/>
- </notification>
- <notification name="DownloadLinuxReleaseForDownload">
- En opdateret version af [APP_NAME] er tilgængelig.
-[MESSAGE]
-Denne opdatering er ikke påkrævet, men det anbefales at installere den for at opnå øget hastighed og forbedret stabilitet.
- <usetemplate name="okcancelbuttons" notext="Fortsæt" yestext="Hent"/>
- </notification>
- <notification name="DownloadMacMandatory">
- En ny version af [APP_NAME] er tilgængelig.
-[MESSAGE]
-Du skal hente denne opdatering for at bruge [APP_NAME].
-
-Download til dit Program bibliotek?
- </notification>
- <notification name="DownloadMac">
- En opdateret version af [APP_NAME] er tilgængelig.
-[MESSAGE]
-Denne opdatering er ikke påkrævet, men det anbefales at installere den for at opnå øget hastighed og forbedret stabilitet.
-
-Download til dit Program bibliotek?
- </notification>
- <notification name="DownloadMacReleaseForDownload">
- En opdateret version af [APP_NAME] er tilgængelig.
-[MESSAGE]
-Denne opdatering er ikke påkrævet, men det anbefales at installere den for at opnå øget hastighed og forbedret stabilitet.
-
-Download til dit Program bibliotek?
- </notification>
- <notification name="FailedUpdateInstall">
- Der opstod en fejl ved installation af opdatering.
-Hent og installér venligst den nyeste version fra
-http://secondlife.com/download.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="FailedRequiredUpdateInstall">
- Vi kunne ikke installere en påkrævet opdatering.
-Du kan ikke logge på før [APP_NAME] er blevet opdateret.
-
-Hent og installer venligst den nyeste klien fra
-http://secondlife.com/download.
- <usetemplate name="okbutton" yestext="Afslut"/>
- </notification>
- <notification name="UpdaterServiceNotRunning">
- Dette er en påkrævet opdatering af din Second Life installation.
-
-Du kan downloade opdateringen fra http://www.secondlife.com/downloads
-eller du kan installere den nu.
- <usetemplate name="okcancelbuttons" notext="Afslut Second Life" yestext="Hent og installér nu"/>
- </notification>
- <notification name="DownloadBackgroundTip">
- Vi har hentet en opdatering til din [APP_NAME] installation.
-Version [VERSION] [[RELEASE_NOTES_FULL_URL] Information about this update]
- <usetemplate name="okcancelbuttons" notext="Senere..." yestext="Installér nu og genstart [APP_NAME]"/>
- </notification>
- <notification name="DownloadBackgroundDialog">
- Vi har hentet en opdatering til din [APP_NAME] installation.
-Version [VERSION] [[RELEASE_NOTES_FULL_URL] Information about this update]
- <usetemplate name="okcancelbuttons" notext="Senere..." yestext="Installér nu og genstart [APP_NAME]"/>
- </notification>
- <notification name="RequiredUpdateDownloadedVerboseDialog">
- Vi har hentet en påkrævet opdatering.
-Version [VERSION]
-
-Du skal genstarte [APP_NAME] for at installere denne opdatering.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="RequiredUpdateDownloadedDialog">
- Du skal genstarte [APP_NAME] for at installere opdateringen.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="DeedObjectToGroup">
- <usetemplate ignoretext="Bekræft før jeg dedikerer et objekt til en gruppe" name="okcancelignore" notext="Cancel" yestext="Deed"/>
- </notification>
- <notification name="WebLaunchExternalTarget">
- Ønsker du at åbne din web browser for at se dette indhold?
- <usetemplate ignoretext="Start min browser for at se hjemmesider" name="okcancelignore" notext="Cancel" yestext="OK"/>
- </notification>
- <notification name="WebLaunchJoinNow">
- GÃ¥ til [http://secondlife.com/account/ Dashboard] for at administrere din konto?
- <usetemplate ignoretext="Start min browser for at administrere min konto" name="okcancelignore" notext="Cancel" yestext="OK"/>
- </notification>
- <notification name="WebLaunchSecurityIssues">
- <usetemplate ignoretext="Start min browser for at lære hvordan man rapporterer sikkerhedsproblemer" name="okcancelignore" notext="Cancel" yestext="OK"/>
- </notification>
- <notification name="WebLaunchQAWiki">
- <usetemplate ignoretext="Start min browser for at se QA Wiki" name="okcancelignore" notext="Cancel" yestext="OK"/>
- </notification>
- <notification name="WebLaunchPublicIssue">
- <usetemplate ignoretext="Start min browser for at bruge det Linden Labs sagsstyring" name="okcancelignore" notext="Cancel" yestext="Go to page"/>
- </notification>
- <notification name="WebLaunchSupportWiki">
- <usetemplate ignoretext="Start min browser for at se bloggen" name="okcancelignore" notext="Cancel" yestext="OK"/>
- </notification>
- <notification name="WebLaunchLSLGuide">
- Ønsker du at åbne &apos;Scripting Guide&apos; for hjælp til scripting?
- <usetemplate ignoretext="Start min browser for at se Scripting Guide" name="okcancelignore" notext="Cancel" yestext="OK"/>
- </notification>
- <notification name="WebLaunchLSLWiki">
- Ønsker du at besøge LSL portalen for hjælp til scripting?
- <usetemplate ignoretext="Start min browser for at besøge LSL Portalen" name="okcancelignore" notext="Cancel" yestext="Go to page"/>
- </notification>
- <notification name="ReturnToOwner">
- <usetemplate ignoretext="Bekræft før objekter returneres til deres ejere" name="okcancelignore" notext="Cancel" yestext="OK"/>
- </notification>
- <notification name="ConfirmKick">
- Er du SIKKER på at du vil sparke alle beboere ud?
- <usetemplate name="okcancelbuttons" notext="Cancel" yestext="Spark alle beboere ud"/>
- </notification>
- <notification name="MuteLinden">
- Beklager, men du kan ikke blokere en Linden.
- </notification>
- <notification name="CannotStartAuctionAlreadyForSale">
- Du kan ikke starte en auktion på en parcel som allerede er sat til salg. Fjern &apos;til salg&apos; muligheden hvis du ønsker at starte en auktion.
- </notification>
- <notification label="Blokering af objekt via navn mislykkedes" name="MuteByNameFailed">
- Du har allerede blokeret dette navn.
- </notification>
- <notification name="BusyModeSet">
- Sat til &apos;optaget&apos;.
-Chat og personlige beskeder vil blive skjult. Personlige beskeder vil få din &apos;optaget&apos; besked. Alle teleport invitationer vil blive afvist. Alle objekter sendt til dig vil ende i papirkurven.
- <usetemplate ignoretext="Jeg skrifter min status til &apos;optaget" name="okignore" yestext="OK"/>
- </notification>
- <notification name="JoinedTooManyGroupsMember">
- Du er oppe på det maksimale antal grupper. Forlad venligst en anden gruppe inden du melder dig ind i denne, eller afvis tilbuddet.
-[NAME] har inviteret dig til en gruppe.
- </notification>
- <notification name="JoinedTooManyGroups">
- Du er oppe på det maksimale antal grupper. Forlad venligst en gruppe inden du melder dig ind i enndnu en gruppe eller opretter en ny.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="KickUser">
- Spark beboere ud med hvilken besked?
- </notification>
- <notification name="FreezeUser">
- Frys beboeren med hvilken besked?
- </notification>
- <notification name="UnFreezeUser">
- Fjern frysning af beboeren med hvilken besked?
- </notification>
- <notification name="SetDisplayNameSuccess">
- Hej [DISPLAY_NAME]!
-
-Præcist som i virkeligheden tager det et stykke tid at vænne sig til et nyt navn. Det kan tage flere dage for [http://wiki.secondlife.com/wiki/Setting_your_display_name your name to update] i objekter, scripts, søgninger m.v.
- </notification>
- <notification name="SetDisplayNameBlocked">
- Beklager, du kan ikke ændre dit visningsnavn. Hvis du mener dette skyldes en fejl, kontakt venligst support.
- </notification>
- <notification name="SetDisplayNameFailedLength">
- Beklager, mavnet er for langt. Visningsnavne kan ikke indholde mere end [LENGTH] karakterer.
-
-Prøv venligst med et kortere navn.
- </notification>
- <notification name="SetDisplayNameFailedGeneric">
- Beklager, vi kunne ikke sætte dit visningsnavn. Prøv venligst igen senere.
- </notification>
- <notification name="SetDisplayNameMismatch">
- Visningsnavnene du angav matcher ikke. Prøv at taste ind igen.
- </notification>
- <notification name="AgentDisplayNameUpdateThresholdExceeded">
- Beklager, du er nødt til at vente længere, inden du kan ændre visningsnavn.
-
-Se mere under http://wiki.secondlife.com/wiki/Setting_your_display_name
-
-Prøv venligst igen senere.
- </notification>
- <notification name="AgentDisplayNameSetBlocked">
- Beklager, vi kunne ikke sætte dit valgte navn da det indholder et ikke tilladt ord.
-
- Prøv med et andet navn.
- </notification>
- <notification name="AgentDisplayNameSetInvalidUnicode">
- Visningsnavnet du prøver at angive indeholder ugyldige karakterer.
- </notification>
- <notification name="AgentDisplayNameSetOnlyPunctuation">
- Dit vinsningsnavn skal indeholde andre bogstaver end tegnsætningstegn.
- </notification>
- <notification name="DisplayNameUpdate">
- [OLD_NAME] ([SLID]) er nu kendt som [NEW_NAME].
- </notification>
- <notification name="OfferTeleport">
- Tilbyd en teleport til din position med følgende besked?
- <form name="form">
- <input name="message">
- Mød mig i [REGION]
- </input>
- <button name="OK" text="OK"/>
- <button name="Cancel" text="Annullér"/>
- </form>
- </notification>
- <notification name="OfferTeleportFromGod">
- Tilkald beboer til din lokation?
- </notification>
- <notification name="TeleportFromLandmark">
- Er du sikker på at du vil teleportere til &lt;nolink&gt;[LOCATION]&lt;/nolink&gt;?
- <usetemplate ignoretext="Bekræft at jeg vil teleportere til et landemærke" name="okcancelignore" notext="Cancel" yestext="Teleport"/>
- </notification>
- <notification name="TeleportToPick">
- Teleport til [PICK]?
- <usetemplate ignoretext="Bekræft at jeg ønsker at teleportere til et sted i favoritter" name="okcancelignore" notext="Annullér" yestext="Teleport"/>
- </notification>
- <notification name="TeleportToClassified">
- Teleport til [CLASSIFIED]?
- <usetemplate ignoretext="Bekræft at du ønsker at teleportere til lokation in annoncer" name="okcancelignore" notext="Annullér" yestext="Teleport"/>
- </notification>
- <notification name="TeleportToHistoryEntry">
- Teleport til [HISTORY_ENTRY]?
- <usetemplate ignoretext="Bekræft at du ønsker at teleportere til en lokation i din historik" name="okcancelignore" notext="Annullér" yestext="Teleport"/>
- </notification>
- <notification label="Change Linden Estate" name="ChangeLindenEstate">
- Du er i færd med at ændre et Linden ejet estate (mainland, teeen grid, orientation etc.).
-
-Dette er EKSTREMT FARLIGT da det kan ændre beboernes oplevelse fundamentalt. På mainland vil dette betyde ændring af tusinder af regioner og få spaceserveren til at kløjs i det.
-
-Fortsæt?
- </notification>
- <notification name="RegionEntryAccessBlocked">
- Du har ikke adgang til denne region på grund af din valgte indholdsrating. Dette kan skyldes manglende validering af din alder.
-
-Undersøg venligst om du har installeret den nyeste [APP_NAME] klient, og gå til &apos;Knowledge Base&apos; for yderligere detaljer om adgang til områder med denne indholdsrating.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="RegionEntryAccessBlocked_KB">
- Du har ikke adgang til denne region på grund af din valgte indholdsrating.
-
-GÃ¥ til &apos;Knowledge Base&apos; for mere information om indholdsratings.
- <url name="url">
- https://support.secondlife.com/ics/support/default.asp?deptID=4417&amp;task=knowledge&amp;questionID=6010
- </url>
- <usetemplate ignoretext="Ikke adgang til denne region på grund af begrænsninger i min indholdsrating" name="okcancelignore" notext="Luk" yestext="Gå til &apos;Knowledge Base&apos;"/>
- </notification>
- <notification name="RegionEntryAccessBlocked_Notify">
- Du har ikke adgang til denne region på grund af din valgte indholdsrating.
- </notification>
- <notification name="RegionEntryAccessBlocked_Change">
- Du har ikke adgang til denne region på grund af din opsætning af indholdsrating.
-
-For at få adgang til den ønskede region skal du ændre din indholdsrating. Dette vil give dig ret til at søge og får tilgang til indhold af typen [REGIONMATURITY]. For at omgøre ændringer gå til Mig &gt; Indstillinger &gt; Generelt.
- <form name="form">
- <button name="OK" text="Ændre indstillinger"/>
- <button name="Cancel" text="Luk"/>
- <ignore name="ignore" text="Din valgte indholdsrating forhindrer dig i at kommer til en region"/>
- </form>
- </notification>
- <notification name="PreferredMaturityChanged">
- Din indholdsrating er nu [RATING].
- </notification>
- <notification name="LandClaimAccessBlocked">
- Du kan ikke kræve dette land på grund af din nuværende indholdsrating indstillinge . Dette kan skyldes manglende validering af din alder.
-
-Undersøg om du har den nyeste [APP_NAME] klient og gå venligst til &apos;Knowledge Base&apos; for yderligere detaljer om adgang til områder med denne indholdsrating.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="LandClaimAccessBlocked_KB">
- Du kan ikke kræve dette land på grund af din nuværende indholdsrating indstilling..
-
-GÃ¥ venligst til &apos;Knowledge Base&apos; for yderligere information om indholdsrating.
- <url name="url">
- https://support.secondlife.com/ics/support/default.asp?deptID=4417&amp;task=knowledge&amp;questionID=6010
- </url>
- <usetemplate ignoretext="Du kan ikke kræve dette land, på grund af begrænsninger i indholdsrating" name="okcancelignore" notext="Luk" yestext="Gå til &apos;Knowledge Base&apos;"/>
- </notification>
- <notification name="LandClaimAccessBlocked_Notify">
- Du kan ikke kræve dette land på grund af din indholdsrating.
- </notification>
- <notification name="LandClaimAccessBlocked_Change">
- Du kan ikke kræve dette land, på grund af begrænsninger i din opsætning af indholdsrating.
-
-Du kan klikke på &apos;Ændre præference&apos; for at ændre din indholdsrating nu og dermed opnå adgang. Du vil så få mulighed for at søge og tilgå [REGIONMATURITY] fra da af. Hvis du senere ønsker at ændre denne opsætning tilbage, gå til Mig &gt; Indstillinger &gt; Generelt.
- <usetemplate ignoretext="Din valgte indholdsrating forhindrer dig i at kræve land" name="okcancelignore" notext="Luk" yestext="Ændre præferencer"/>
- </notification>
- <notification name="LandBuyAccessBlocked">
- Du kan ikke købe dette land på grund af din nuværende indholdsrating indstillinge . Dette kan skyldes manglende validering af din alder.
-
-Undersøg om du har den nyeste [APP_NAME] klient og gå venligst til &apos;Knowledge Base&apos; for yderligere detaljer om adgang til områder med denne indholdsrating.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="LandBuyAccessBlocked_KB">
- Du kan ikke købe dette land på grund af din nuværende indholdsrating.
-
-GÃ¥ til &apos;Knowledge Base&apos; for yderligere detaljer om indholdsrating.
- <url name="url">
- https://support.secondlife.com/ics/support/default.asp?deptID=4417&amp;task=knowledge&amp;questionID=6010
- </url>
- <usetemplate ignoretext="Du kan ikke købe dette land, på grund af begrænsninger i indholdsrating" name="okcancelignore" notext="Luk" yestext="Gå til &apos;Knowledge Base&apos;"/>
- </notification>
- <notification name="LandBuyAccessBlocked_Notify">
- Du kan ikke købe dette land på grund af din nuværende indholdsrating indstilling.
- </notification>
- <notification name="LandBuyAccessBlocked_Change">
- Du kan ikke købe dette land, på grund af begrænsninger i din opsætning af indholdsrating.
-
-Du kan klikke på &apos;Ændre præference&apos; for at ændre din indholdsrating nu og dermed opnå adgang. Du vil så få mulighed for at søge og tilgå [REGIONMATURITY] fra da af. Hvis du senere ønsker at ændre denne opsætning tilbage, gå til Mig &gt; Indstillinger &gt; Generelt.
- <usetemplate ignoretext="Din valgte rating forhindrer dig i at købe land" name="okcancelignore" notext="Luk" yestext="Ændre præferencer"/>
- </notification>
- <notification name="TooManyPrimsSelected">
- Der er valgt for mange prims. Vælg venligst [MAX_PRIM_COUNT] eller færre og prøv igen
- </notification>
- <notification name="UnableToLoadNotecardAsset">
- Kunne ikke hente notecard indhold.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="SetClassifiedMature">
- Indeholder denne annonce &apos;Mature&apos; indhold?
- <usetemplate canceltext="Annullér" name="yesnocancelbuttons" notext="Nej" yestext="Ja"/>
- </notification>
- <notification name="SetGroupMature">
- Indeholder denne gruppe &apos;Mature&apos; indhold?
- <usetemplate canceltext="Annullér" name="yesnocancelbuttons" notext="Nej" yestext="Ja"/>
- </notification>
- <notification label="Changed Region Maturity" name="RegionMaturityChange">
- Ratingen for denne region er ændret.
-Det kan tage noget tid inden ændringen slår igennem på kortet.
-
-For at få adgang til voksen regioner, skal beboere være alders-checket, enten via aldersverifikation eller betalingsverifikation.
- </notification>
- <notification label="Voice Version Mismatch" name="VoiceVersionMismatch">
- Denne version af [APP_NAME] er ikke kompatibel med stemme chat funktionen i denne region. For at kunne få stemme chat til at fungere skal du opdatere [APP_NAME].
- </notification>
- <notification name="MoveInventoryFromObject">
- <usetemplate ignoretext="Advar mig før jeg flytter &apos;ikke-kopiérbare&apos; genstande fra et objekt" name="okcancelignore" notext="Cancel" yestext="OK"/>
- </notification>
- <notification name="MoveInventoryFromScriptedObject">
- <usetemplate ignoretext="Advar mig før jeg flytter &apos;ikke-kopiérbare&apos; genstande, hvor det kan medføre at ødelægge et scriptet objekt" name="okcancelignore" notext="Cancel" yestext="OK"/>
- </notification>
- <notification name="ClickActionNotPayable">
- Advarsel: &apos;Betal objekt&apos; klik-aktionen er blevet aktiveret, men det vil kun virke, hvis et script med et &apos;money()&apos; event er tilføjet.
- <form name="form">
- <ignore name="ignore" text="I set the action &apos;Pay object&apos; when building an object without a money() script"/>
- </form>
- </notification>
- <notification name="WebLaunchAccountHistory">
- GÃ¥ til [http://secondlife.com/account/ Dashboard] for at se konto-historik?
- <usetemplate ignoretext="Start min browser for at se min konto historik" name="okcancelignore" notext="Cancel" yestext="Go to page"/>
- </notification>
- <notification name="ConfirmQuit">
- Er du sikker på at du vil afslutte?
- <usetemplate ignoretext="Bekræft før jeg afslutter" name="okcancelignore" notext="Afslut ikke" yestext="Quit"/>
- </notification>
- <notification name="DeleteItems">
- [QUESTION]
- <usetemplate ignoretext="Bekræft før sletning af genstande" name="okcancelignore" notext="Annullér" yestext="OK"/>
- </notification>
- <notification name="HelpReportAbuseEmailLL">
- Benyt dette værktøj til at rapportere krænkninger af [http://secondlife.com/corporate/tos.php Terms of Service] og [http://secondlife.com/corporate/cs.php Community Standards].
-
-Alle rapporter om krænkninger vil blive undersøgt og behandlet.
- </notification>
- <notification name="HelpReportAbuseContainsCopyright">
- Kære beboer,
-
-Det ser ud til at du indrapporterer krænkelse af ophavsret. Check venligst at du rapporterer korrekt:
-
-(1) Krænkelsesproces. Du må sende en rapport, hvis du mener at en beboer udnytter [SECOND_LIFE] rettighedssystemet, for eksempel via CopyBot eller lignende værktøjer, til at overtræde ophavsretten til objekter.
-
-(2) DCMA (â€Digital Millennium Copyright Actâ€) eller fjernelsesproces. For at kræve at indhold fjernes fra [SECOND_LIFE], SKAL du sende en gyldig besked om overtrædelse som beskrevet i [http://secondlife.com/corporate/dmca.php DMCA Policy].
-
-Hvis du stadig ønsker at fortsætte med rapportering om overtrædelse, luk venligst dette vindue og afslut afsendelse af rapporten. Du skal muligvis vælge en specifik kategori &apos;CopyBot or Permissions Exploit&apos;.
-
-Mange tak
-
-Linden Lab
- </notification>
- <notification label="Replace Existing Attachment" name="ReplaceAttachment">
- <form name="form">
- <ignore name="ignore" text="Erstat et eksisterende vedhæng med den valgte genstand"/>
- </form>
- </notification>
- <notification label="Busy Mode Warning" name="BusyModePay">
- <form name="form">
- <ignore name="ignore" text="Jeg er ved at betale en person eller et objekt mens jeg er &apos;optaget&apos;"/>
- </form>
- </notification>
- <notification name="ConfirmDeleteProtectedCategory">
- Mappen &apos;[FOLDERNAME]&apos; er en system mappe. At slette denne mappe kan medføre ustabilitet. Er du sikker på at du vil slette den?
- <usetemplate ignoretext="Bekræft, inden en system mappe slettes" name="okcancelignore" notext="Annullér" yestext="OK"/>
- </notification>
- <notification name="ConfirmEmptyTrash">
- Er du sikker på at du ønsker at tømme papirkurven?
- <usetemplate ignoretext="Bekræft før papirkurv i beholdning tømmes" name="okcancelignore" notext="Cancel" yestext="OK"/>
- </notification>
- <notification name="ConfirmClearBrowserCache">
- Er du sikker på at du ønsker at slette din historik om besøg, web og søgninger?
- <usetemplate name="okcancelbuttons" notext="Cancel" yestext="OK"/>
- </notification>
- <notification name="ConfirmClearCookies">
- Er du sikker på du vil slette alle cookies?
- </notification>
- <notification name="ConfirmEmptyLostAndFound">
- Er du sikker på at du vil slette indholdet i din &apos;Fundne genstande&apos;?
- <usetemplate ignoretext="Bekræft før sletning af &apos;Fundne genstande&apos; mappe i beholdning" name="okcancelignore" notext="No" yestext="Yes"/>
- </notification>
- <notification name="CopySLURL">
- Følgende SLurl er blevet kopieret til din udklipsholder:
- [SLURL]
-
-Henvis til dette fra en hjemmeside for at give andre nem adgang til denne lokation, eller prøv det selv ved at indsætte det i adresselinien i en web-browser.
- <form name="form">
- <ignore name="ignore" text="SLurl er kopieret til min udklipsholder"/>
- </form>
- </notification>
- <notification name="NewSkyPreset">
- <form name="form">
- <input name="message">
- Ny forudindstilling
- </input>
- <button name="OK" text="OK"/>
- <button name="Cancel" text="Annullér"/>
- </form>
- </notification>
- <notification name="NewWaterPreset">
- <form name="form">
- <input name="message">
- Ny forudindstilling
- </input>
- <button name="OK" text="OK"/>
- <button name="Cancel" text="Annullér"/>
- </form>
- </notification>
- <notification name="ChatterBoxSessionStartError">
- Ikke i stand til at start chat med [RECIPIENT].
-[REASON]
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="Cannot_Purchase_an_Attachment">
- Du kan ikke købe en genstand mens den er vedhæftet.
- </notification>
- <notification name="AutoWearNewClothing">
- Vil du automatisk tage det tøj på du er ved at lave?
- <usetemplate ignoretext="Tag det tøj på jeg laver, mens jeg ændrer udseende" name="okcancelignore" notext="No" yestext="Yes"/>
- </notification>
- <notification name="NotAgeVerified">
- Du skal være alders-checket for at besøge dette område. Ønsker du at gå til [SECOND_LIFE] hjemmesiden og bekræfte din alder?
-
-[_URL]
- <usetemplate ignoretext="Jeg har ikke bekræftet min alder" name="okcancelignore" notext="No" yestext="Yes"/>
- </notification>
- <notification name="Cannot enter parcel: no payment info on file">
- Du skal være betalende medlem for at besøge dette område. Ønsker du at gå til [SECOND_LIFE] hjemmesiden for at blive dette?
-
-[_URL]
- <usetemplate ignoretext="Du mangler at være betalende medlem" name="okcancelignore" notext="No" yestext="Yes"/>
- </notification>
- <notification name="SystemMessageTip">
- [MESSAGE]
- </notification>
- <notification name="IMSystemMessageTip">
- [MESSAGE]
- </notification>
- <notification name="Cancelled">
- Annulléret
- </notification>
- <notification name="CancelledSit">
- Annulléret sid
- </notification>
- <notification name="CancelledAttach">
- Annulléreret vedhæft
- </notification>
- <notification name="ReplacedMissingWearable">
- Erstattet manglende tøj/kropsdele med standard.
- </notification>
- <notification name="FriendOnline">
- [NAME] er logget på
- </notification>
- <notification name="FriendOffline">
- [NAME] er logget af
- </notification>
- <notification name="AddSelfFriend">
- Selvom du nok er meget sød, kan du ikke tilføje dig selv som ven.
- </notification>
- <notification name="UploadingAuctionSnapshot">
- Uploader billeder fra verdenen og www...
-(Tager omkring 5 minutter.)
- </notification>
- <notification name="UploadPayment">
- Du betalte L$[AMOUNT] for at uploade.
- </notification>
- <notification name="UploadWebSnapshotDone">
- Billeder fra www er uploadet.
- </notification>
- <notification name="UploadSnapshotDone">
- Billeder fra verdenen er uploadet
- </notification>
- <notification name="TerrainDownloaded">
- Terrain.raw downloadet
- </notification>
- <notification name="GestureMissing">
- Bevægelsen [NAME] mangler i databasen.
- </notification>
- <notification name="UnableToLoadGesture">
- Kunne ikke indlæse læse bevægelse [NAME].
- </notification>
- <notification name="LandmarkMissing">
- Landmærke mangler i databasen.
- </notification>
- <notification name="UnableToLoadLandmark">
- Ikke muligt at indlæse landmærke. Prøv venligst igen.
- </notification>
- <notification name="CapsKeyOn">
- Din Caps Lock er aktiveret.
-Det kan påvirke din indtastning af password.
- </notification>
- <notification name="NotecardMissing">
- Note mangler i databasen.
- </notification>
- <notification name="NotecardNoPermissions">
- Du har ikke rettigheder til at se denne note.
- </notification>
- <notification name="RezItemNoPermissions">
- Utilstrækkelige tilladelser til at danne genstanden.
- </notification>
- <notification name="UnableToLoadNotecard">
- Ikke muligt at indlæse note.
-Prøv venligst igen.
- </notification>
- <notification name="ScriptMissing">
- Script mangler i databasen.
- </notification>
- <notification name="ScriptNoPermissions">
- Utilstrækkelige tilladelser til at se script.
- </notification>
- <notification name="UnableToLoadScript">
- Ikke muligt at indlæse script. Prøv venligst igen.
- </notification>
- <notification name="IncompleteInventory">
- Det komplette indhold, du tilbyder, er ikke endnu tilgængelig lokalt. Prøv venligst at tilbyde tingene igen om lidt.
- </notification>
- <notification name="CannotModifyProtectedCategories">
- Du kan ikke ændre beskyttede kategorier.
- </notification>
- <notification name="CannotRemoveProtectedCategories">
- Du kan ikke fjerne beskyttede kategorier.
- </notification>
- <notification name="UnableToBuyWhileDownloading">
- Ikke muligt at købe, imens genstandens data hentes.
-Prøv venligst igen.
- </notification>
- <notification name="UnableToLinkWhileDownloading">
- Ikke muligt at lænke imens genstandens data hentes.
-Prøv venligst igen.
- </notification>
- <notification name="CannotBuyObjectsFromDifferentOwners">
- Du kan kun købe objekter fra én ejer ad gangen.
-Vælg venligst et enkelt objekt.
- </notification>
- <notification name="ObjectNotForSale">
- Dette objekt er ikke til salg.
- </notification>
- <notification name="EnteringGodMode">
- Starter gud-tilstand, niveau [LEVEL]
- </notification>
- <notification name="LeavingGodMode">
- Stopper gud-tilstand, niveau [LEVEL]
- </notification>
- <notification name="CopyFailed">
- Du har ikke rettigheder til at kopiere dette.
- </notification>
- <notification name="InventoryAccepted">
- [NAME] modtog dit tilbud til hans/hendes beholdning.
- </notification>
- <notification name="InventoryDeclined">
- [NAME] afviste det du tilbød fra din beholdning.
- </notification>
- <notification name="ObjectMessage">
- [NAME]: [MESSAGE]
- </notification>
- <notification name="CallingCardAccepted">
- Dit visitkort blev accepteret.
- </notification>
- <notification name="CallingCardDeclined">
- Dit visitkort blev afvist.
- </notification>
- <notification name="TeleportToLandmark">
- Du kan teleportere til lokationer som &apos;[NAME]&apos; ved at åbne Steder panelet til højre på skærmen, og her vælge landemærker fanen.
-Klik på et landemærke og vælg den, derefter
-Click on any landmark to select it, then click &apos;Teleport&apos; at the bottom of the panel.
-(You can also double-click on the landmark, or right-click it and choose &apos;Teleport&apos;.)
- </notification>
- <notification name="TeleportToPerson">
- Du kan kontakte beboere som &apos;[NAME]&apos; ved at åbne Personer panelet til højre på skærmen.
-Vælg beboeren fra listen og klik så &apos;IM&apos; i bundet af panelet.
-(Du kan også dobbelt-klikke på navnet i listen, eller højre-klikke og vælge &apos;IM&apos;).
- </notification>
- <notification name="CantSelectLandFromMultipleRegions">
- Kan ikke vælge land på tværs af grænser.
-Prøv at vælge mindre stykker land.
- </notification>
- <notification name="SearchWordBanned">
- Visse ord er fjernet fra din søge-sætning på grund af at disse strider mod de generelle &apos;Community Standards&apos;.
- </notification>
- <notification name="NoContentToSearch">
- Vælg venligst mindst en indholdstype for at søge (PG, Mature, or Adult).
- </notification>
- <notification name="SystemMessage">
- [MESSAGE]
- </notification>
- <notification name="PaymentReceived">
- [MESSAGE]
- </notification>
- <notification name="PaymentSent">
- [MESSAGE]
- </notification>
- <notification name="EventNotification">
- Besked om begivenhed:
-
-[NAME]
-[DATE]
- <form name="form">
- <button name="Details" text="Detaljer"/>
- <button name="Cancel" text="Annullér"/>
- </form>
- </notification>
- <notification name="TransferObjectsHighlighted">
- Alle genstande på denne grund, som vil blive overført til køberen af denne grund, er nu oplyst.
-
-* Træer og græs, der vil blive overført, er ikke fremhævet.
- <form name="form">
- <button name="Done" text="Færdig"/>
- </form>
- </notification>
- <notification name="DeactivatedGesturesTrigger">
- Deaktiverede bevægelser med samme udløser: [NAMES]
- </notification>
- <notification name="NoQuickTime">
- Det ser ikke ud til at Apples QuickTime software er installeret på dit system.
-Hvis du ønsker at se streaming media på parceller der understøtter dette skal du besøge siden [http://www.apple.com/quicktime QuickTime site] og installere QuickTime Player.
- </notification>
- <notification name="NoPlugin">
- Ingen Media Plugin blev fundet til at håndtere mime af typen &quot;[MIME_TYPE]&quot;. Media af denne type vil ikke være tilgængelig.
- </notification>
- <notification name="MediaPluginFailed">
- Følgende Media Plugin has fejlede:
- [PLUGIN]
-
-Prøv venligst at geninstallere plugin eller kontakt leverandøren hvis problemerne bliver ved.
- <form name="form">
- <ignore name="ignore" text="En Media Plugin kunne ikke afvikles"/>
- </form>
- </notification>
- <notification name="OwnedObjectsReturned">
- De genstande du ejer på det valgte stykke land er blevet returneret til din beholdning.
- </notification>
- <notification name="OtherObjectsReturned">
- Objekterne på den valgte parcel, ejet af [NAME], er blevet returneret til vedkommendes beholdning.
- </notification>
- <notification name="OtherObjectsReturned2">
- Objekterne i den valgte parcel, ejet af beboeren &apos;[NAME]&apos;, er blevet returneret til deres ejer.
- </notification>
- <notification name="GroupObjectsReturned">
- Genstandene på det valgte stykke land, delt med gruppen [GROUPNAME], er blevet returneret til deres ejeres beholdninger.
-Genstande, som er dedikerede og som kan overføres, er blevet returneret til deres forrige ejere.
-Genstande, der ikke kan overføres og som er dedikeret til gruppen, er blevet slettet.
- </notification>
- <notification name="UnOwnedObjectsReturned">
- Genstandene på det valgte stykke land, der IKKE er ejet af dig, er blevet returneret til deres ejere.
- </notification>
- <notification name="ServerObjectMessage">
- Besked fra [NAME]:
-&lt;nolink&gt;[MSG]&lt;/nolink&gt;
- </notification>
- <notification name="NotSafe">
- Dette land er åbnet for &apos;skade&apos;.
-Du kan blive skadet her. Hvis du dør, vil du blive teleporteret til din hjemme lokation.
- </notification>
- <notification name="NoFly">
- Dette sted har ikke aktiveret ret til flyvning.
-Du kan ikke flyve her.
- </notification>
- <notification name="PushRestricted">
- Dette sted tillader ikke skubning. Du kan ikke skubbe andre, med mindre du ejer dette land.
- </notification>
- <notification name="NoVoice">
- Dette sted har ikke aktiveret stemme-chat. Du vil ikke kunne høre nogen tale.
- </notification>
- <notification name="NoBuild">
- Dette sted har ikke aktiveret bygge-ret. Du kan ikke bygge eller &apos;rezze&apos; objekter her.
- </notification>
- <notification name="ScriptsStopped">
- En administrator har midlertidig stoppet scripts i denne region.
- </notification>
- <notification name="ScriptsNotRunning">
- Denne region kører ikke nogen scripts.
- </notification>
- <notification name="NoOutsideScripts">
- Dette sted tillader ikke udefra kommende scripts.
-
-Ingen scripts vil virke her, udover de som tilhører ejeren af landet.
- </notification>
- <notification name="ClaimPublicLand">
- Du kan kun kræve land i den region du befinder dig i.
- </notification>
- <notification name="RegionTPAccessBlocked">
- Du har ikke adgang til denne region på grund af din valgte indholdsrating. Dette kan skyldes manglende validering af din alder eller at du ikke benytter den nyeste [APP_NAME] klient.
-
-Gå venligst til &apos;Knowledge Base&apos; for yderligere detaljer om adgang til områder med denne indholdsrating.
- </notification>
- <notification name="URBannedFromRegion">
- Du er blokeret i denne region.
- </notification>
- <notification name="NoTeenGridAccess">
- Du kan ikke tilslutte dig denne &apos;Teen&apos; region.
- </notification>
- <notification name="ImproperPaymentStatus">
- Du har ikke de rette betalingsoplysninger til at komme ind i denne region.
- </notification>
- <notification name="MustGetAgeParcel">
- Du skal være aldersgodkendt for at komme ind på denne parcel.
- </notification>
- <notification name="NoDestRegion">
- Destinations region ikke fundet.
- </notification>
- <notification name="NotAllowedInDest">
- Du har ikke adgang til denne destination.
- </notification>
- <notification name="RegionParcelBan">
- Kan ikke skifte til ny region via en blokeret parcel. Prøv en anden vej ind.
- </notification>
- <notification name="TelehubRedirect">
- Du er blevet omdirigeret til en telehub.
- </notification>
- <notification name="CouldntTPCloser">
- Kunne ikke teleportere nærmere til destination.
- </notification>
- <notification name="TPCancelled">
- Teleport afbrudt.
- </notification>
- <notification name="FullRegionTryAgain">
- Den region du prøver at komme ind i er fuld for øjeblikket.
-Prøv igen om lidt.
- </notification>
- <notification name="GeneralFailure">
- Generel fejl.
- </notification>
- <notification name="RoutedWrongRegion">
- Du blev sendt til en forkert region. Prøv igen.
- </notification>
- <notification name="NoValidAgentID">
- Ikke en gyldig agent ID.
- </notification>
- <notification name="NoValidSession">
- Ikke noget gyldig sessions-ID
- </notification>
- <notification name="NoValidCircuit">
- Ingen gyldig kode for kredsløb.
- </notification>
- <notification name="NoValidTimestamp">
- Ikke et gyldigt klokkeslæt.
- </notification>
- <notification name="NoPendingConnection">
- Kunne ikke skabe fast forbindelse.
- </notification>
- <notification name="InternalUsherError">
- Der opstod en intern fejl ved teleportering til din teleport destination.. Der kan være generelle problemer med [SECOND_LIFE] lige nu.
- </notification>
- <notification name="NoGoodTPDestination">
- Kunne ikke finde et egnet teleport sted i denne region.
- </notification>
- <notification name="InternalErrorRegionResolver">
- Der opstod en intern fejl ved beregning af globale koordinater for din teleport forespørgsel. Der kan være generelle problemer med [SECOND_LIFE] lige nu.
- </notification>
- <notification name="NoValidLanding">
- Kunne ikke finde et gyldigt landingspunkt.
- </notification>
- <notification name="NoValidParcel">
- No valid parcel could be found.
- </notification>
- <notification name="ObjectGiveItem">
- Et objekt ved navn &lt;nolink&gt;[OBJECTFROMNAME]&lt;/nolink&gt; ejet af [NAME_SLURL] tilbyder dig &lt;nolink&gt;[ITEM_SLURL]&lt;/nolink&gt;. For at bruge denne genstand skal du skifte til avanceret tilstand, hvor du kan finde genstanden i din beholdning. Ønsker du at logge ud for at skifte tilstand? Valg af tilstand findes på login skærmbilledet.
- <form name="form">
- <button name="Keep" text="Behold genstand"/>
- <button name="Discard" text="Afvis genstand"/>
- <button name="Mute" text="Blokér objekt"/>
- </form>
- </notification>
- <notification name="UserGiveItem">
- [NAME_SLURL] tilbyder dig [ITEM_SLURL]. For at bruge denne genstand skal du skifte til avanceret tilstand, hvor du kan finde genstanden i din beholdning. Ønsker du at logge ud for at skifte tilstand? Valg af tilstand findes på login skærmbilledet.
- <form name="form">
- <button name="Show" text="Behold genstand"/>
- <button name="Discard" text="Afvis genstand"/>
- <button name="Mute" text="Blokér bruger"/>
- </form>
- </notification>
- <notification name="GodMessage">
- [NAME]
-
-[MESSAGE]
- </notification>
- <notification name="JoinGroup">
- [MESSAGE]
- <form name="form">
- <button name="Join" text="Indmeld"/>
- <button name="Decline" text="Afvis"/>
- <button name="Info" text="Information"/>
- </form>
- </notification>
- <notification name="TeleportOffered">
- [NAME_SLURL] har tilbudt en teleport til deres lokation:
-
-[MESSAGE] - [MATURITY_STR] &lt;icon&gt;[MATURITY_ICON]&lt;/icon&gt;
- <form name="form">
- <button name="Teleport" text="Teleportér"/>
- <button name="Cancel" text="Annullér"/>
- </form>
- </notification>
- <notification name="TeleportOfferSent">
- Tilbud om teleport sendt til [TO_NAME]
- </notification>
- <notification name="GotoURL">
- [MESSAGE]
-[URL]
- <form name="form">
- <button name="Later" text="Senere"/>
- <button name="GoNow..." text="GÃ¥ nu..."/>
- </form>
- </notification>
- <notification name="OfferFriendship">
- [NAME_SLURL] tilbyder venskab.
-
-[MESSAGE]
-
-(Som udgangspunkt vil I være i stand til at se hinandens online status.)
- <form name="form">
- <button name="Accept" text="Acceptér"/>
- <button name="Decline" text="Afvis"/>
- </form>
- </notification>
- <notification name="FriendshipOffered">
- Du har tilbudt venskab til [TO_NAME]
- </notification>
- <notification name="OfferFriendshipNoMessage">
- [NAME_SLURL] tilbyder venskab.
-
-(Som udgangspunkt, vil du være i stand til at se den andens online status)
- </notification>
- <notification name="FriendshipAccepted">
- [NAME] accepterede dit tilbud om venskab.
- </notification>
- <notification name="FriendshipDeclined">
- [NAME] afviste dit tilbud om venskab.
- </notification>
- <notification name="FriendshipAcceptedByMe">
- Tilbud om venskab accepteret.
- </notification>
- <notification name="FriendshipDeclinedByMe">
- Tilbud om venskab afvist.
- </notification>
- <notification name="OfferCallingCard">
- [NAME] tilbyder sit visitkort.
-Dette vil tilføje et bogmærke i din beholdning, så du hurtigt kan sende en personlig besked til denne beboer.
- <form name="form">
- <button name="Accept" text="Acceptér"/>
- <button name="Decline" text="Afvis"/>
- </form>
- </notification>
- <notification name="RegionRestartMinutes">
- Denne region vil genstarte om [MINUTES] minutter.
-Hvis du ikke forlader regionen, vil du blive logget af.
- </notification>
- <notification name="RegionRestartSeconds">
- Denne region genstartes om [SECONDS] sekunder.
-Hvis du ikke forlader regionen, vil du blive logget af.
- </notification>
- <notification name="LoadWebPage">
- Indlæas websiden [URL]?
-
-[MESSAGE]
-
-Fra objekt: &lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;, ejer: [NAME]?
- <form name="form">
- <button name="Gotopage" text="GÃ¥ til side"/>
- <button name="Cancel" text="Afbryd"/>
- </form>
- </notification>
- <notification name="FailedToFindWearableUnnamed">
- Det lykkedes ikke at finde [TYPE] i databasen.
- </notification>
- <notification name="FailedToFindWearable">
- Det lykkedes ikke at finde [TYPE] med navnet [DESC] i databasen.
- </notification>
- <notification name="InvalidWearable">
- Den genstand du prøver at tage på benytter en funktion din klient ikke kan forstå. Upgradér venligst din version af [APP_NAME] for at kunne tage denne genstand på.
- </notification>
- <notification name="ScriptQuestion">
- &apos;&lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;&apos;, et objekt ved ejet af &apos;[NAME]&apos;, ønsker at:
-
-[QUESTIONS]
-Er dette OK?
- <form name="form">
- <button name="Yes" text="Ja"/>
- <button name="No" text="Nej"/>
- <button name="Mute" text="Blokér"/>
- </form>
- </notification>
- <notification name="ScriptQuestionCaution">
- Et objeckt med navn &apos;&lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;&apos;, ejet af &apos;[NAME]&apos; ønsker at:
-
-[QUESTIONS]
-Hvis du ikke stoler på dette objekt og dets skaber, bør du afvise dette ønske.
-
-Opfyld dette ønske?
- <form name="form">
- <button name="Grant" text="Imødekom"/>
- <button name="Deny" text="Afvis"/>
- <button name="Details" text="Detaljer..."/>
- </form>
- </notification>
- <notification name="ScriptDialog">
- [NAME]&apos;s &apos;&lt;nolink&gt;[TITLE]&lt;/nolink&gt;&apos;
-[MESSAGE]
- <form name="form">
- <button name="Ignore" text="Ignorér"/>
- </form>
- </notification>
- <notification name="ScriptDialogGroup">
- [GROUPNAME]&apos;s &apos;&lt;nolink&gt;[TITLE]&lt;/nolink&gt;&apos;
-[MESSAGE]
- <form name="form">
- <button name="Ignore" text="Ignorér"/>
- </form>
- </notification>
- <notification name="BuyLindenDollarSuccess">
- Tak for din betaling!
-
-Din L$ balance vil blive opdateret når transaktionen er gennemført. Ved transaktionen tager mere end 20 min., vil den blive annulleret. I så fald vil beløbet blive krediteret din US$ balance.
-
-Status for din betaling kan ses i din &apos;Transaction History&apos; side på din [http://secondlife.com/account/ Dashboard]
- </notification>
- <notification name="FirstOverrideKeys">
- Dine bevælgelsestaster bliver nu håndteret af et objekt.
-Brug piletasterne eller AWSD for at se, hvad de gør.
-Nogle genstande (som skydevåben) kræver at du går ind i musevisning for at bruge dem.
-Tryk på &apos;M&apos; for at gåre det.
- </notification>
- <notification name="FirstSandbox">
- Dette er et sandkasse område. Her kan beboere lære ast bygge.
-
-De ting du bygger vil blive slettet senere, så glem ikke at højre-klikke og vælge &quot;Tag&quot; for at tage en kopi af din kreation til din beholdning.
- </notification>
- <notification name="MaxListSelectMessage">
- Du må kun vælge op til [MAX_SELECT] genstande på denne liste.
- </notification>
- <notification name="VoiceInviteP2P">
- [NAME] inviterer dig til en stemme-chat samtale.
-Klik på Acceptér for at deltage eller Afvis for at afvise invitationen. Klik på Blokér for at blokere personen.
- <form name="form">
- <button name="Accept" text="Acceptér"/>
- <button name="Decline" text="Afvis"/>
- <button name="Mute" text="Blokér"/>
- </form>
- </notification>
- <notification name="AutoUnmuteByIM">
- [NAME] har fået sendt en besked og blokering er derfor automatisk blevet fjernet.
- </notification>
- <notification name="AutoUnmuteByMoney">
- [NAME] har fået givet penge og blokering er derfor automatisk blevet fjernet.
- </notification>
- <notification name="AutoUnmuteByInventory">
- [NAME] er blevet tilbud noget fra beholdning og blokering er derfor automatisk blevet fjernet.
- </notification>
- <notification name="VoiceInviteGroup">
- [NAME] har has sluttet sig til stemme-chaten i gruppen [GROUP].
-Klik på Acceptér for at deltage eller Afvis for at afvise invitationen. Klik på Blokér for at blokere personen.
- <form name="form">
- <button name="Accept" text="Acceptér"/>
- <button name="Decline" text="Afvis"/>
- <button name="Mute" text="Blokér"/>
- </form>
- </notification>
- <notification name="VoiceInviteAdHoc">
- [NAME] har sluttet sig til en stemme-chat med en konference chat.
-Klik på Acceptér for at deltage eller Afvis for at afvise invitationen. Klik på Blokér for at blokere personen.
- <form name="form">
- <button name="Accept" text="Acceptér"/>
- <button name="Decline" text="Afvis"/>
- <button name="Mute" text="Blokér"/>
- </form>
- </notification>
- <notification name="InviteAdHoc">
- [NAME] inviterer dig til en konference chat.
-Klik på Acceptér for at deltage eller Afvis for at afvise invitationen. Klik på Blokér for at blokere personen.
- <form name="form">
- <button name="Accept" text="Acceptér"/>
- <button name="Decline" text="Afvis"/>
- <button name="Mute" text="Blokér"/>
- </form>
- </notification>
- <notification name="VoiceChannelFull">
- Den stemme-chat, du prøver at tilslutte dig, [VOICE_CHANNEL_NAME], har nået maksiumum kapacitet. Prøv venligst igen senere.
- </notification>
- <notification name="ProximalVoiceChannelFull">
- Vi beklager. Dette område har nået sin maksimale kapacitet for stemme-chat. Prøv venligst at benytte stemme i et andet område.
- </notification>
- <notification name="VoiceChannelDisconnected">
- Du er blevet koblet fra [VOICE_CHANNEL_NAME]. Du vil nu blive koblet til almindelig voice-chat.
- </notification>
- <notification name="VoiceChannelDisconnectedP2P">
- [VOICE_CHANNEL_NAME] har afsluttet samtalen. Du vil nu blive koblet til almindelig voice-chat.
- </notification>
- <notification name="P2PCallDeclined">
- [VOICE_CHANNEL_NAME] har avist dit opkald. Du vil nu blive koblet til almindelig voice-chat.
- </notification>
- <notification name="P2PCallNoAnswer">
- [VOICE_CHANNEL_NAME] er ikke tilgængelig til at modtage dit opkald. Du vil nu blive koblet til almindelig voice-chat.
- </notification>
- <notification name="VoiceChannelJoinFailed">
- Det lykkedes ikke at forbinde til [VOICE_CHANNEL_NAME], prøv venligst igen senere. Du vil nu blive koblet til almindelig voice-chat.
- </notification>
- <notification name="VoiceLoginRetry">
- Vi laver en stemmekanal til dig. Det kan tage op til et minut.
- </notification>
- <notification name="VoiceEffectsExpired">
- En eller flere af dine stemme &quot;morphs&quot; er udløbet.
-[[URL] Click here] for at forny dit abbonnement.
- </notification>
- <notification name="VoiceEffectsExpiredInUse">
- Den aktive stemme &quot;morph&quot; er udløbet og din normale stemme opsætning er genaktiveret.
-[[URL] Click here] for at forny dit abbonnement.
- </notification>
- <notification name="VoiceEffectsWillExpire">
- En eller flere af dine stemme &quot;morphs&quot; vil udløbe om mindre end [INTERVAL] dage.
-[[URL] Click here] for at forny dit abbonnement.
- </notification>
- <notification name="VoiceEffectsNew">
- Nye stemme &quot;morphs&quot; er tilgængelige!
- </notification>
- <notification name="Cannot enter parcel: not a group member">
- Kun medlemmer af en bestemt gruppe kan besøge dette område.
- </notification>
- <notification name="Cannot enter parcel: banned">
- Du kan ikke komme ind på området. Du er blevet udelukket.
- </notification>
- <notification name="Cannot enter parcel: not on access list">
- Du kan ikke komme ind på området. Du er ikke på adgangslisten.
- </notification>
- <notification name="VoiceNotAllowed">
- Du har ikke tilladelse til at tilslutte dig stemme-chat på [VOICE_CHANNEL_NAME].
- </notification>
- <notification name="VoiceCallGenericError">
- En fejl er opstået under forsøget på at koble sig på stemme chatten [VOICE_CHANNEL_NAME]. Pråv venligst senere.
- </notification>
- <notification name="UnsupportedCommandSLURL">
- Den SLurl du klikkede på understøttes ikke.
- </notification>
- <notification name="BlockedSLURL">
- En SLurl blev modtaget en ikke sikret browser og den er blevet blokeret af sikkerhedsmæssige årsager.
- </notification>
- <notification name="ThrottledSLURL">
- Flere SLurls blev modtaget fra en browser i et kort tidsrum.
-De vil blive blokeret nogle få sekunder af sikkerhedsmæssige årsager.
- </notification>
- <notification name="IMToast">
- [MESSAGE]
- <form name="form">
- <button name="respondbutton" text="Svar"/>
- </form>
- </notification>
- <notification name="ConfirmCloseAll">
- Er du sikker på at du vil lukke alle personlige samtaler (IM)?
- <usetemplate ignoretext="Bekræft før du lukker alle IMer" name="okcancelignore" notext="Annullér" yestext="OK"/>
- </notification>
- <notification name="AttachmentSaved">
- Vedhæng er blevet gemt.
- </notification>
- <notification name="UnableToFindHelpTopic">
- Ikke muligt at finde hjælp om dette element.
- </notification>
- <notification name="ObjectMediaFailure">
- Server fejl: Media opdatering eller &quot;get&quot; fejlede.
-&apos;[ERROR]&apos;
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="TextChatIsMutedByModerator">
- Din tekst chat er blevet slukket af moderator.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="VoiceIsMutedByModerator">
- Din stemme er blevet slukket af moderatoren.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="ConfirmClearTeleportHistory">
- Er du sikker på at du vil slette teleport historikken?
- <usetemplate name="okcancelbuttons" notext="Annullér" yestext="OK"/>
- </notification>
- <notification name="BottomTrayButtonCanNotBeShown">
- Den valgte knap kan ikke vises lige nu.
-Knappen vil blive vist når der er nok plads til den.
- </notification>
- <notification name="ShareNotification">
- Vælg beboere at dele med.
- </notification>
- <notification name="ShareItemsConfirmation">
- Er du sikker på at du vil dele følgende genstande:
-
-&lt;nolink&gt;[ITEMS]&lt;/nolink&gt;
-
-Me følgende beboere:
-
-[RESIDENTS]
- <usetemplate name="okcancelbuttons" notext="Annullér" yestext="Ok"/>
- </notification>
- <notification name="ItemsShared">
- Genstande er nu delt.
- </notification>
- <notification name="DeedToGroupFail">
- Dedikering til gruppe fejlede.
- </notification>
- <notification name="AvatarRezNotification">
- ( [EXISTENCE] sekunder i live )
-Avatar &apos;[NAME]&apos; var ikke sky mere, efter [TIME] sekunder.
- </notification>
- <notification name="AvatarRezSelfBakedDoneNotification">
- ( [EXISTENCE] seconds alive )
-Du blev færdig med at fremvise dit sæt efter [TIME] sekunder.
- </notification>
- <notification name="AvatarRezSelfBakedUpdateNotification">
- ( [EXISTENCE] seconds alive )
-Du sendte en opdatering af dit udseende efter [TIME] sekunder.
-[STATUS]
- </notification>
- <notification name="AvatarRezCloudNotification">
- ( [EXISTENCE] sekunder i live )
-Avatar &apos;[NAME]&apos; blev til &quot;sky&quot;.
- </notification>
- <notification name="AvatarRezArrivedNotification">
- ( [EXISTENCE] sekunder i live )
-Avatar &apos;[NAME]&apos; appeared.
- </notification>
- <notification name="AvatarRezLeftCloudNotification">
- ( [EXISTENCE] sekunder i live )
-Avatar &apos;[NAME]&apos; forsvandt efter [TIME] sekunder som &quot;sky&quot;.
- </notification>
- <notification name="AvatarRezEnteredAppearanceNotification">
- ( [EXISTENCE] sekunder i live )
-Avatar &apos;[NAME]&apos; skiftede til udseende modus.
- </notification>
- <notification name="AvatarRezLeftAppearanceNotification">
- ( [EXISTENCE] sekunder i live )
-Avatar &apos;[NAME]&apos; har forladt udseende modus.
- </notification>
- <notification name="NoConnect">
- Vi har problemer med at oprette forbindelse via [PROTOCOL] [HOSTID].
-Check venligst din netværks- og firewallsetup.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="NoVoiceConnect">
- Vi har problemer med at oprette forbindelse til din stemme server:
-
-[HOSTID]
-
-Stemme kommunikation vil ikke være tilgængelig.
-Check venligst din netværks- og firewall setup.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="AvatarRezLeftNotification">
- ( [EXISTENCE] sekunder i live )
-Avatar &apos;[NAME]&apos; forsvandt helt &quot;uploaded&quot;.
- </notification>
- <notification name="AvatarRezSelfBakedTextureUploadNotification">
- ( [EXISTENCE] sekunder i live )
-Du uploadede en [RESOLUTION] &quot;bagt&quot; tekstur til &apos;[BODYREGION]&apos; efter [TIME] sekunder.
- </notification>
- <notification name="AvatarRezSelfBakedTextureUpdateNotification">
- ( [EXISTENCE] sekunder i live )
-Du opdaterede en [RESOLUTION] &quot;bagt&quot; tekstur for &apos;[BODYREGION]&apos; efter [TIME] sekunder.
- </notification>
- <notification name="ConfirmLeaveCall">
- Er du sikker på at du vil forlade dette opkald?
- <usetemplate ignoretext="Bekræft før jeg forlader opkald" name="okcancelignore" notext="Nej" yestext="Ja"/>
- </notification>
- <notification name="ConfirmMuteAll">
- Du har valgt at slukke for lyden for alle deltagere i gruppeopkaldet.
-Dette vil også betyde, at alle beboere der slutter sig til opkaldet
-vil have lyden slukket - selv efter de har forladt kaldet.
-
-
-Sluk for alles lyd?
- <usetemplate ignoretext="Bekræft før jeg slukker for alle deltageres lyd i gruppe-kald" name="okcancelignore" notext="Annullér" yestext="Ok"/>
- </notification>
- <notification label="Chat" name="HintChat">
- For at deltage i samtalen tast tekst ind i chat feltet nedenfor.
- </notification>
- <notification label="Stå op" name="HintSit">
- For at rejse dig op og forlad siddeposition, tryk på &quot;Stå op&quot; knappen.
- </notification>
- <notification label="Undersøg verden" name="HintDestinationGuide">
- Destinationsguiden indeholder tusinder af nye steder der kan opleves. Vælg venligst et sted og vælg Teleport for at komme derhen.
- </notification>
- <notification label="Side panel" name="HintSidePanel">
- Få hurtig tilgang til din beholdning, sæt, profiler og andet i dette side panel.
- </notification>
- <notification label="Flyt" name="HintMove">
- For at gå eller løbe, åben Flyt panelet for neden og brug pilene til at navigere. Du kan også bruge pile-tasterne på dit tastatur.
- </notification>
- <notification label="Visningsnavn" name="HintDisplayName">
- Angiv dit konfigurérbare visningsnavn her. Dette er i tillæg til dit unikke brugernavn, som ikke kan ændres. Du kan ændre hvordan du ser andre beboeres navne i dine indstillinger.
- </notification>
- <notification label="Flyt" name="HintMoveArrows">
- For at gå, brug piletasterne på tastaturet. Du kan løbe ved at trykke to gange på Pil-Op
- </notification>
- <notification label="Se" name="HintView">
- For at ændre dit kamera-view, benyt kredsløbs og panoreringskontrollerne. Nulstil view ved at trykke Esc eller ved at gå.
- </notification>
- <notification label="Beholdning" name="HintInventory">
- Undersøg din beholdning for at finde ting. Nyeste genstand findes lettes under fanen &quot;Nye ting&quot;
- </notification>
- <notification label="Der er kommet Linden Dollars" name="HintLindenDollar">
- Her er din nuværende balance af L$. Klik på Køb L$ for at købe flere Linden dollars.
- </notification>
- <notification name="PopupAttempt">
- En pop-up blev hindret i at blive vist.
- <form name="form">
- <ignore name="ignore" text="Tillad alle pop-ups"/>
- <button name="open" text="Ã…ben pop-up vindue"/>
- </form>
- </notification>
- <notification name="AuthRequest">
- Hjemmesiden på &apos;&lt;nolink&gt;[HOST_NAME]&lt;/nolink&gt;&apos; in realm &apos;[REALM]&apos; kræver et brugernavn og password.
- <form name="form">
- <input name="username" text="Brugernavn"/>
- <input name="password" text="Password"/>
- <button name="ok" text="Send"/>
- <button name="cancel" text="Annullér"/>
- </form>
- </notification>
- <notification label="" name="ModeChange">
- For at skifte tilstand skal du genstarte programmet.
- <usetemplate name="okcancelbuttons" notext="Afslut ikke" yestext="Afslut"/>
- </notification>
- <notification label="" name="NoClassifieds">
- Oprettelse og redigering af annoncer er kun muligt i avanceret tilstand. Ønsker du at logge ud for at skifte tilstand? Valg af tilstand findes på login skærmbilledet.
- <usetemplate name="okcancelbuttons" notext="Afslut ikke" yestext="Afslut"/>
- </notification>
- <notification label="" name="NoGroupInfo">
- Oprettelse og redigering af grupper er kun muligt i avanceret tilstand. Ønsker du at logge ud for at skifte tilstand? Valg af tilstand findes på login skærmbilledet.
- <usetemplate name="okcancelbuttons" notext="Afslut ikke" yestext="Afslut"/>
- </notification>
- <notification label="" name="NoPicks">
- Oprettelse og redigering af favoritter er kun mulig i avanceret tilstand. Ønsker du at logge ud for at skifte tilstand? Valg af tilstand findes på login skærmbilledet.
- <usetemplate name="okcancelbuttons" notext="Afslut ikke" yestext="Afslut"/>
- </notification>
- <notification label="" name="NoWorldMap">
- Det er kun muligt at se verdenskortet i avanceret tilstand.Ønsker du at logge ud for at skifte tilstand? Valg af tilstand findes på login skærmbilledet.
- <usetemplate name="okcancelbuttons" notext="Afslut ikke" yestext="Afslut"/>
- </notification>
- <notification label="" name="NoVoiceCall">
- Stemme kald kan kun benttes i avanceret tilstand. Ønsker du at logge ud for at skifte tilstand?
- <usetemplate name="okcancelbuttons" notext="Afslut ikke" yestext="Afslut"/>
- </notification>
- <notification label="" name="NoAvatarShare">
- Det er kun mulig at dele i avanceret tilstand. Ønsker du at logge ud for at skifte tilstand?
- <usetemplate name="okcancelbuttons" notext="Afslut ikke" yestext="Afslut"/>
- </notification>
- <notification label="" name="NoAvatarPay">
- Det er kun muligt at betale andre beboere i avanceret tilstand. Ønsker du at logge ud for at skifte tilstand?
- <usetemplate name="okcancelbuttons" notext="Afslut ikke" yestext="Afslut"/>
- </notification>
- <global name="UnsupportedGLRequirements">
- Det ser ikke ud til at din hardware opfylder minimumskravene til [APP_NAME]. [APP_NAME] kræver et OpenGL grafikkort som understøter &apos;multitexture&apos;. Check eventuelt om du har de nyeste drivere for grafikkortet, og de nyeste service-packs og patches til dit operativsystem.
-
-Hvis du bliver ved med at have problemer, besøg venligst [SUPPORT_SITE].
- </global>
- <global name="You can only set your &apos;Home Location&apos; on your land or at a mainland Infohub.">
- Hvis du selv ejer land, kan du benytte det til hjemme lokation.
-Ellers kan du se på verdenskortet og finde steder markeret med &quot;Infohub&quot;.
- </global>
- <global name="You died and have been teleported to your home location">
- Du døde og er blevet teleporteret til din hjemmelokation.
- </global>
-</notifications>
diff --git a/indra/newview/skins/minimal/xui/da/panel_adhoc_control_panel.xml b/indra/newview/skins/minimal/xui/da/panel_adhoc_control_panel.xml
deleted file mode 100644
index 14250453eb..0000000000
--- a/indra/newview/skins/minimal/xui/da/panel_adhoc_control_panel.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="panel_im_control_panel">
- <layout_stack name="vertical_stack">
- <layout_panel name="call_btn_panel">
- <button label="Opkald" name="call_btn"/>
- </layout_panel>
- <layout_panel name="end_call_btn_panel">
- <button label="Forlad samtale" name="end_call_btn"/>
- </layout_panel>
- <layout_panel name="voice_ctrls_btn_panel">
- <button label="Stemmekontroller" name="voice_ctrls_btn"/>
- </layout_panel>
- </layout_stack>
-</panel>
diff --git a/indra/newview/skins/minimal/xui/da/panel_bottomtray.xml b/indra/newview/skins/minimal/xui/da/panel_bottomtray.xml
deleted file mode 100644
index bd20ece764..0000000000
--- a/indra/newview/skins/minimal/xui/da/panel_bottomtray.xml
+++ /dev/null
@@ -1,45 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="bottom_tray">
- <string name="DragIndicationImageName" value="Accordion_ArrowOpened_Off"/>
- <string name="SpeakBtnToolTip" value="Slå mikrofon til/fra"/>
- <string name="VoiceControlBtnToolTip" value="Vis/skjul stemme kontrolpanel"/>
- <layout_stack name="toolbar_stack">
- <layout_panel name="speak_panel">
- <button label="Tal" name="speak_btn" tool_tip="Tænd og sluk for mikrofon"/>
- </layout_panel>
- <layout_panel name="speak_flyout_panel">
- <button label="" name="flyout_btn" tool_tip="Ændring af opsætning for lyd"/>
- </layout_panel>
- <layout_panel name="gesture_panel">
- <gesture_combo_list label="Bevægelse" name="Gesture" tool_tip="Lad din avatar gøre ting"/>
- </layout_panel>
- <layout_panel name="cam_panel">
- <bottomtray_button label="Vis" name="camera_btn" tool_tip="Kontrollér kameravinkel"/>
- </layout_panel>
- <layout_panel name="destinations_panel">
- <bottomtray_button label="Destinationer" name="destination_btn" tool_tip="Rejs i Second Life"/>
- </layout_panel>
- <layout_panel name="avatar_panel">
- <bottomtray_button label="Min avatar" name="avatar_btn" tool_tip="Ændre dit udseende"/>
- </layout_panel>
- <layout_panel name="people_panel">
- <bottomtray_button label="Personer" name="show_people_button" tool_tip="Find personer i Second Life"/>
- </layout_panel>
- <layout_panel name="profile_panel">
- <bottomtray_button label="Profil" name="show_profile_btn" tool_tip="Se og rediger din profil"/>
- </layout_panel>
- <layout_panel name="howto_panel">
- <bottomtray_button label="Hvordan" name="show_help_btn" tool_tip="Vis hjælpeinformation for Second Life"/>
- </layout_panel>
- <layout_panel name="im_well_panel">
- <chiclet_im_well name="im_well">
- <button name="Unread IM messages" tool_tip="Konversationer"/>
- </chiclet_im_well>
- </layout_panel>
- <layout_panel name="notification_well_panel">
- <chiclet_notification name="notification_well">
- <button name="Unread" tool_tip="Notifikationer"/>
- </chiclet_notification>
- </layout_panel>
- </layout_stack>
-</panel>
diff --git a/indra/newview/skins/minimal/xui/da/panel_group_control_panel.xml b/indra/newview/skins/minimal/xui/da/panel_group_control_panel.xml
deleted file mode 100644
index 23a5e79e22..0000000000
--- a/indra/newview/skins/minimal/xui/da/panel_group_control_panel.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="panel_im_control_panel">
- <layout_stack name="vertical_stack">
- <layout_panel name="group_info_btn_panel">
- <button label="Gruppe profil" name="group_info_btn"/>
- </layout_panel>
- <layout_panel name="call_btn_panel">
- <button label="Opkald gruppe" name="call_btn"/>
- </layout_panel>
- <layout_panel name="end_call_btn_panel">
- <button label="Forlad samtale" name="end_call_btn"/>
- </layout_panel>
- <layout_panel name="voice_ctrls_btn_panel">
- <button label="Ã…ben stemme indstillinger" name="voice_ctrls_btn"/>
- </layout_panel>
- </layout_stack>
-</panel>
diff --git a/indra/newview/skins/minimal/xui/da/panel_im_control_panel.xml b/indra/newview/skins/minimal/xui/da/panel_im_control_panel.xml
deleted file mode 100644
index b8a7ec0b34..0000000000
--- a/indra/newview/skins/minimal/xui/da/panel_im_control_panel.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="panel_im_control_panel">
- <layout_stack name="button_stack">
- <layout_panel name="view_profile_btn_panel">
- <button label="Profil" name="view_profile_btn"/>
- </layout_panel>
- <layout_panel name="add_friend_btn_panel">
- <button label="Tilføj ven" name="add_friend_btn"/>
- </layout_panel>
- <layout_panel name="teleport_btn_panel">
- <button label="Teleport" name="teleport_btn" tool_tip="Tilbyd teleport til denne person"/>
- </layout_panel>
- <layout_panel name="share_btn_panel">
- <button label="Del" name="share_btn"/>
- </layout_panel>
- <layout_panel name="pay_btn_panel">
- <button label="Betal" name="pay_btn"/>
- </layout_panel>
- <layout_panel name="call_btn_panel">
- <button label="Opkald" name="call_btn"/>
- </layout_panel>
- <layout_panel name="end_call_btn_panel">
- <button label="Afslut samtale" name="end_call_btn"/>
- </layout_panel>
- <layout_panel name="voice_ctrls_btn_panel">
- <button label="Stemme kontroller" name="voice_ctrls_btn"/>
- </layout_panel>
- </layout_stack>
-</panel>
diff --git a/indra/newview/skins/minimal/xui/da/panel_login.xml b/indra/newview/skins/minimal/xui/da/panel_login.xml
deleted file mode 100644
index 2e0f726e1a..0000000000
--- a/indra/newview/skins/minimal/xui/da/panel_login.xml
+++ /dev/null
@@ -1,48 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="panel_login">
- <panel.string name="create_account_url">
- http://join.secondlife.com/
- </panel.string>
- <panel.string name="forgot_password_url">
- http://secondlife.com/account/request.php
- </panel.string>
- <layout_stack name="login_widgets">
- <layout_panel name="login">
- <text name="username_text">
- Brugernavn:
- </text>
- <combo_box name="username_combo" tool_tip="Brugernavnet du valgte da du registrerde dig, som f.eks. bobsmith12 or Steller Sunshine"/>
- <text name="password_text">
- Password:
- </text>
- <check_box label="Husk password" name="remember_check"/>
- <button label="Log på" name="connect_btn"/>
- <text name="mode_selection_text">
- Tilstand:
- </text>
- <combo_box name="mode_combo" tool_tip="Vælg ønsket tilstand. Vælg basis for hurtig og nem udforskning og chat. Vælg avanceret for at få adgang til flere muligheder.">
- <combo_box.item label="Basis" name="Basic"/>
- <combo_box.item label="Avanceret" name="Advanced"/>
- </combo_box>
- <text name="start_location_text">
- Start ved:
- </text>
- <combo_box name="start_location_combo">
- <combo_box.item label="Min sidste lokation" name="MyLastLocation"/>
- <combo_box.item label="Hjem" name="MyHome"/>
- <combo_box.item label="&lt;Indtast regionnavn&gt;" name="Typeregionname"/>
- </combo_box>
- </layout_panel>
- <layout_panel name="links">
- <text name="create_new_account_text">
- Opret bruger
- </text>
- <text name="forgot_password_text">
- Har du glemt brugernavn eller password?
- </text>
- <text name="login_help">
- Hjælp til login
- </text>
- </layout_panel>
- </layout_stack>
-</panel>
diff --git a/indra/newview/skins/minimal/xui/da/panel_navigation_bar.xml b/indra/newview/skins/minimal/xui/da/panel_navigation_bar.xml
deleted file mode 100644
index 2ee87433a4..0000000000
--- a/indra/newview/skins/minimal/xui/da/panel_navigation_bar.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="navigation_bar">
- <panel name="navigation_panel">
- <pull_button name="back_btn" tool_tip="GÃ¥ tilbage til min forrige lokation"/>
- <pull_button name="forward_btn" tool_tip="GÃ¥ en lokation fremad"/>
- <button name="home_btn" tool_tip="Teleport til min hjemme lokation"/>
- <location_input label="Lokation" name="location_combo"/>
- <search_combo_box label="Søg" name="search_combo_box" tool_tip="Søg">
- <combo_editor label="Søg [SECOND_LIFE]" name="search_combo_editor"/>
- </search_combo_box>
- </panel>
- <favorites_bar name="favorite" tool_tip="Træk landemærker hertil for at få hurtig adgang til dine favoritsteder i Second Life!">
- <label name="favorites_bar_label" tool_tip="Træk landemærker hertil for at få hurtig adgang til dine favoritsteder i Second Life!">
- Favoritter
- </label>
- <chevron_button name="&gt;&gt;" tool_tip="Søg mere af mine favoritter"/>
- </favorites_bar>
-</panel>
diff --git a/indra/newview/skins/minimal/xui/da/panel_people.xml b/indra/newview/skins/minimal/xui/da/panel_people.xml
deleted file mode 100644
index 8be4d695bd..0000000000
--- a/indra/newview/skins/minimal/xui/da/panel_people.xml
+++ /dev/null
@@ -1,94 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<!-- Side tray panel -->
-<panel label="Personer" name="people_panel">
- <string name="no_recent_people" value="Ingen nylige personer. Leder du efter personer at være sammen med? Prøv destinationsknappen nedenfor."/>
- <string name="no_filtered_recent_people" value="Ingen nylige personer med det navn."/>
- <string name="no_one_near" value="Ingen i nærheden. Leder du efter personer at være sammen med? Prøv destinationsknappen nedenfor."/>
- <string name="no_one_filtered_near" value="Ingen i nærheden med det navn."/>
- <string name="no_friends_online" value="Ingen venner online"/>
- <string name="no_friends" value="Ingen venner"/>
- <string name="no_friends_msg">
- Højre-klik på en person for at tilføje som ven.
-Leder du efter personer at være sammen med? Prøv destinationsknappen nedenfor.
- </string>
- <string name="no_filtered_friends_msg">
- Fandt du ikke hvad du søgte? Prøv destinationsknappen nedenfor.
- </string>
- <string name="people_filter_label" value="Filtrér personer"/>
- <string name="groups_filter_label" value="Filtrér grupper"/>
- <string name="no_filtered_groups_msg" value="Fandt du ikke det du søgte? Prøv [secondlife:///app/search/groups/[SEARCH_TERM] Søg]."/>
- <string name="no_groups_msg" value="Leder du efter grupper at være med i? Prøv [secondlife:///app/search/groups Søg]."/>
- <string name="MiniMapToolTipMsg" value="[REGION](Dobbelt-klik for at åbne kort, træk for at panorere)"/>
- <string name="AltMiniMapToolTipMsg" value="[REGION](Dobbelt-klik for at teleportere, træk for at panorere)"/>
- <filter_editor label="Filtrér" name="filter_input"/>
- <tab_container name="tabs">
- <panel label="TÆT PÅ" name="nearby_panel">
- <panel label="bottom_panel" name="bottom_panel">
- <menu_button name="nearby_view_sort_btn" tool_tip="Valg"/>
- <button name="add_friend_btn" tool_tip="Tilføj valgte beboer til din venneliste"/>
- </panel>
- </panel>
- <panel label="MINE VENNER" name="friends_panel">
- <accordion name="friends_accordion">
- <accordion_tab name="tab_online" title="Online"/>
- <accordion_tab name="tab_all" title="Alle"/>
- </accordion>
- <panel label="bottom_panel" name="bottom_panel">
- <layout_stack name="bottom_panel">
- <layout_panel name="options_gear_btn_panel">
- <menu_button name="friends_viewsort_btn" tool_tip="Vis flere valg"/>
- </layout_panel>
- <layout_panel name="add_btn_panel">
- <button name="add_btn" tool_tip="Tilbyd venskab til en beboer"/>
- </layout_panel>
- <layout_panel name="trash_btn_panel">
- <dnd_button name="del_btn" tool_tip="Fjern valgte person fra din venneliste"/>
- </layout_panel>
- </layout_stack>
- </panel>
- </panel>
- <panel label="MINE GRUPPER" name="groups_panel">
- <panel label="bottom_panel" name="bottom_panel">
- <menu_button name="groups_viewsort_btn" tool_tip="Valg"/>
- <button name="plus_btn" tool_tip="Bliv medlem af gruppe/Opret ny gruppe"/>
- <button name="activate_btn" tool_tip="Activér valgte gruppe"/>
- </panel>
- </panel>
- <panel label="NYLIGE" name="recent_panel">
- <panel label="bottom_panel" name="bottom_panel">
- <menu_button name="recent_viewsort_btn" tool_tip="Valg"/>
- <button name="add_friend_btn" tool_tip="Tilføj valgte beboer til din venneliste"/>
- </panel>
- </panel>
- </tab_container>
- <panel name="button_bar">
- <layout_stack name="bottom_bar_ls">
- <layout_panel name="view_profile_btn_lp">
- <button label="Profil" name="view_profile_btn" tool_tip="Vis billeder, grupper og anden beboer information"/>
- </layout_panel>
- <layout_panel name="im_btn_lp">
- <button label="IM" name="im_btn" tool_tip="Ã…ben session med privat besked (IM)"/>
- </layout_panel>
- <layout_panel name="call_btn_lp">
- <button label="Opkald" name="call_btn" tool_tip="Kald til denne beboer"/>
- </layout_panel>
- <layout_panel name="share_btn_lp">
- <button label="Del" name="share_btn" tool_tip="Del en genstand fra beholdning"/>
- </layout_panel>
- <layout_panel name="teleport_btn_lp">
- <button label="Teleportér" name="teleport_btn" tool_tip="Tilbyd teleport"/>
- </layout_panel>
- </layout_stack>
- <layout_stack name="bottom_bar_ls1">
- <layout_panel name="group_info_btn_lp">
- <button label="Gruppe profil" name="group_info_btn" tool_tip="Vis gruppe information"/>
- </layout_panel>
- <layout_panel name="chat_btn_lp">
- <button label="Gruppe chat" name="chat_btn" tool_tip="Ã…ben chat session"/>
- </layout_panel>
- <layout_panel name="group_call_btn_lp">
- <button label="Gruppe kald" name="group_call_btn" tool_tip="Opkald til denne gruppe"/>
- </layout_panel>
- </layout_stack>
- </panel>
-</panel>
diff --git a/indra/newview/skins/minimal/xui/da/panel_side_tray_tab_caption.xml b/indra/newview/skins/minimal/xui/da/panel_side_tray_tab_caption.xml
deleted file mode 100644
index ce3a1d8b4e..0000000000
--- a/indra/newview/skins/minimal/xui/da/panel_side_tray_tab_caption.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="sidetray_tab_panel">
- <text name="sidetray_tab_title" value="Side bjælke"/>
- <button name="undock" tool_tip="Løsriv"/>
- <button name="dock" tool_tip="Fastgør"/>
- <button name="show_help" tool_tip="Vis hjælp"/>
-</panel>
diff --git a/indra/newview/skins/minimal/xui/da/panel_status_bar.xml b/indra/newview/skins/minimal/xui/da/panel_status_bar.xml
deleted file mode 100644
index 6e7bdfc188..0000000000
--- a/indra/newview/skins/minimal/xui/da/panel_status_bar.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="status">
- <panel.string name="StatBarDaysOfWeek">
- Søndag:Mandag:Tirsdag:Onsdag:Torsdag:Fredag:Lørdag
- </panel.string>
- <panel.string name="StatBarMonthsOfYear">
- Januar:Februar:Marts:April:Maj:Juni:Juli:August:September:Oktober:November:December
- </panel.string>
- <panel.string name="packet_loss_tooltip">
- Packet Loss
- </panel.string>
- <panel.string name="bandwidth_tooltip">
- BÃ¥ndbredde
- </panel.string>
- <panel.string name="time">
- [hour12, datetime, slt]:[min, datetime, slt] [ampm, datetime, slt] [timezone,datetime, slt]
- </panel.string>
- <panel.string name="timeTooltip">
- [weekday, datetime, slt], [day, datetime, slt] [month, datetime, slt] [year, datetime, slt]
- </panel.string>
- <panel.string name="buycurrencylabel">
- L$ [AMT]
- </panel.string>
- <panel name="balance_bg">
- <text name="balance" tool_tip="Klik for at opdaterer din L$ balance" value="L$20"/>
- <button label="KØB L$" name="buyL" tool_tip="Klik for at købe flere L$"/>
- </panel>
- <text name="TimeText" tool_tip="Nuværende tid (Pacific)">
- 24:00 PST
- </text>
- <button name="media_toggle_btn" tool_tip="Start/Stop Alle medier (musik, video, hjemmesider)"/>
- <button name="volume_btn" tool_tip="Kontrol for generel lydstyrke"/>
-</panel>
diff --git a/indra/newview/skins/minimal/xui/de/floater_camera.xml b/indra/newview/skins/minimal/xui/de/floater_camera.xml
deleted file mode 100644
index d49c207f98..0000000000
--- a/indra/newview/skins/minimal/xui/de/floater_camera.xml
+++ /dev/null
@@ -1,65 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="camera_floater">
- <floater.string name="rotate_tooltip">
- Kamera um Fokus drehen
- </floater.string>
- <floater.string name="zoom_tooltip">
- Kamera auf Fokus zoomen
- </floater.string>
- <floater.string name="move_tooltip">
- Kamera nach oben, unten, links und rechts bewegen
- </floater.string>
- <floater.string name="camera_modes_title">
- Kameramodi
- </floater.string>
- <floater.string name="pan_mode_title">
- Kreisen - Zoomen - Schwenken
- </floater.string>
- <floater.string name="presets_mode_title">
- Ansichten
- </floater.string>
- <floater.string name="free_mode_title">
- Objekt ansehen
- </floater.string>
- <panel name="controls">
- <panel name="preset_views_list">
- <panel_camera_item name="front_view">
- <panel_camera_item.text name="front_view_text">
- Vorderansicht
- </panel_camera_item.text>
- </panel_camera_item>
- <panel_camera_item name="group_view">
- <panel_camera_item.text name="side_view_text">
- Seitenansicht
- </panel_camera_item.text>
- </panel_camera_item>
- <panel_camera_item name="rear_view">
- <panel_camera_item.text name="rear_view_text">
- Hinteransicht
- </panel_camera_item.text>
- </panel_camera_item>
- </panel>
- <panel name="camera_modes_list">
- <panel_camera_item name="object_view">
- <panel_camera_item.text name="object_view_text">
- Objektansicht
- </panel_camera_item.text>
- </panel_camera_item>
- <panel_camera_item name="mouselook_view">
- <panel_camera_item.text name="mouselook_view_text">
- Mouselook
- </panel_camera_item.text>
- </panel_camera_item>
- </panel>
- <panel name="zoom" tool_tip="Kamera auf Fokus zoomen">
- <joystick_rotate name="cam_rotate_stick" tool_tip="Kamera um Fokus kreisen"/>
- <slider_bar name="zoom_slider" tool_tip="Kamera auf Fokus zoomen"/>
- <joystick_track name="cam_track_stick" tool_tip="Kamera nach oben, unten, links und rechts bewegen"/>
- </panel>
- </panel>
- <panel name="buttons">
- <button label="" name="presets_btn" tool_tip="Ansichten"/>
- <button label="" name="pan_btn" tool_tip="Kreisen - Zoomen - Schwenken"/>
- <button label="" name="avatarview_btn" tool_tip="Kameramodi"/>
- </panel>
-</floater>
diff --git a/indra/newview/skins/minimal/xui/de/floater_help_browser.xml b/indra/newview/skins/minimal/xui/de/floater_help_browser.xml
deleted file mode 100644
index 459dfb66c0..0000000000
--- a/indra/newview/skins/minimal/xui/de/floater_help_browser.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_help_browser" title="ANWEISUNGEN">
- <floater.string name="loading_text">
- Wird geladen...
- </floater.string>
- <layout_stack name="stack1">
- <layout_panel name="external_controls"/>
- </layout_stack>
-</floater>
diff --git a/indra/newview/skins/minimal/xui/de/floater_media_browser.xml b/indra/newview/skins/minimal/xui/de/floater_media_browser.xml
deleted file mode 100644
index 63cf4a6cba..0000000000
--- a/indra/newview/skins/minimal/xui/de/floater_media_browser.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_about" title="MEDIEN-BROWSER">
- <floater.string name="home_page_url">
- http://www.secondlife.com
- </floater.string>
- <floater.string name="support_page_url">
- http://support.secondlife.com
- </floater.string>
- <layout_stack name="stack1">
- <layout_panel name="nav_controls">
- <button label="Zurück" name="back"/>
- <button label="Vorwärts" name="forward"/>
- <button label="Neu laden" name="reload"/>
- <button label="Los" name="go"/>
- </layout_panel>
- <layout_panel name="time_controls">
- <button label="zurück" name="rewind"/>
- <button label="anhalten" name="stop"/>
- <button label="vorwärts" name="seek"/>
- </layout_panel>
- <layout_panel name="parcel_owner_controls">
- <button label="Aktuelle Seite an Parzelle senden" name="assign"/>
- </layout_panel>
- <layout_panel name="external_controls">
- <button label="In meinem Browser öffnen" name="open_browser"/>
- <check_box label="Immer in meinem Browser öffnen" name="open_always"/>
- <button label="Schließen" name="close"/>
- </layout_panel>
- </layout_stack>
-</floater>
diff --git a/indra/newview/skins/minimal/xui/de/floater_nearby_chat.xml b/indra/newview/skins/minimal/xui/de/floater_nearby_chat.xml
deleted file mode 100644
index bbb4114200..0000000000
--- a/indra/newview/skins/minimal/xui/de/floater_nearby_chat.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="nearby_chat" title="CHAT IN DER NÄHE">
- <check_box label="Chat übersetzen (Service von Google)" name="translate_chat_checkbox"/>
-</floater>
diff --git a/indra/newview/skins/minimal/xui/de/floater_web_content.xml b/indra/newview/skins/minimal/xui/de/floater_web_content.xml
deleted file mode 100644
index 6ab119eeab..0000000000
--- a/indra/newview/skins/minimal/xui/de/floater_web_content.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_web_content" title="">
- <layout_stack name="stack1">
- <layout_panel name="nav_controls">
- <button name="back" tool_tip="Rückwärts"/>
- <button name="forward" tool_tip="Vorwärts"/>
- <button name="stop" tool_tip="Navigation stoppen"/>
- <button name="reload" tool_tip="Seite neu laden"/>
- <combo_box name="address" tool_tip="URL hier eingeben"/>
- <icon name="media_secure_lock_flag" tool_tip="Sicheres Browsen"/>
- <button name="popexternal" tool_tip="Aktuelle URL im Desktop-Browser öffnen"/>
- </layout_panel>
- </layout_stack>
-</floater>
diff --git a/indra/newview/skins/minimal/xui/de/inspect_avatar.xml b/indra/newview/skins/minimal/xui/de/inspect_avatar.xml
deleted file mode 100644
index 4b8fd8a0ad..0000000000
--- a/indra/newview/skins/minimal/xui/de/inspect_avatar.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<!--
- Not can_close / no title to avoid window chrome
- Single instance - only have one at a time, recycle it each spawn
--->
-<floater name="inspect_avatar">
- <string name="Subtitle">
- [AGE]
- </string>
- <string name="Details">
- [SL_PROFILE]
- </string>
- <text name="user_subtitle" value="11 Monate und 3 Tage alt"/>
- <text name="user_details">
- Dies ist meine Second Life-Beschreibung und ich finde sie wirklich gut! Meine Beschreibung ist deshalb so lang, weil ich gerne rede.
- </text>
- <slider name="volume_slider" tool_tip="Lautstärke" value="0.5"/>
- <button label="Freund hinzufügen" name="add_friend_btn" width="110"/>
- <button label="IM" name="im_btn"/>
- <button label="Profil" left_delta="120" name="view_profile_btn" width="44"/>
- <panel name="moderator_panel">
- <button label="Voice deaktivieren" name="disable_voice"/>
- <button label="Voice aktivieren" name="enable_voice"/>
- </panel>
-</floater>
diff --git a/indra/newview/skins/minimal/xui/de/inspect_object.xml b/indra/newview/skins/minimal/xui/de/inspect_object.xml
deleted file mode 100644
index 72b8235828..0000000000
--- a/indra/newview/skins/minimal/xui/de/inspect_object.xml
+++ /dev/null
@@ -1,48 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<!--
- Not can_close / no title to avoid window chrome
- Single instance - only have one at a time, recycle it each spawn
--->
-<floater name="inspect_object">
- <string name="Creator">
- Von [CREATOR]
- </string>
- <string name="CreatorAndOwner">
- Von [CREATOR]
-Besitzer [OWNER]
- </string>
- <string name="Price">
- [AMOUNT] L$
- </string>
- <string name="PriceFree">
- Kostenlos!
- </string>
- <string name="Touch">
- Berühren
- </string>
- <string name="Sit">
- Sitzen
- </string>
- <text name="object_name" value="Test für ein Objektname der sehr lange ist und über zwei Zeilen geht."/>
- <text name="object_creator">
- von secondlife:///app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/about
-Besitzer secondlife:///app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/about
- </text>
- <text name="price_text">
- 30.000 L$
- </text>
- <text name="object_description">
- Dies ist eine wirklich lange Beschreibung für ein Objekt, mindestens 80 Zeichen lang oder jetzt schon mindestens 120 Zeichen lang und länger als der englische Originaltext. Niemand weiß es genau.
- </text>
- <text name="object_media_url">
- http://www.superdupertest.com
- </text>
- <button label="Kaufen" name="buy_btn"/>
- <button label="Bezahlen" name="pay_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"/>
- <icon name="secure_browsing" tool_tip="Sicheres Browsen"/>
- <button label="Mehr" name="more_info_btn"/>
-</floater>
diff --git a/indra/newview/skins/minimal/xui/de/menu_add_wearable_gear.xml b/indra/newview/skins/minimal/xui/de/menu_add_wearable_gear.xml
deleted file mode 100644
index f3775a05ec..0000000000
--- a/indra/newview/skins/minimal/xui/de/menu_add_wearable_gear.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Add Wearable Gear Menu">
- <menu_item_check label="Nach aktuellesten Objekten sortieren" name="sort_by_most_recent"/>
- <menu_item_check label="Nach Name sortieren" name="sort_by_name"/>
- <menu_item_check label="Nach Typ sortieren" name="sort_by_type"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_attachment_other.xml b/indra/newview/skins/minimal/xui/de/menu_attachment_other.xml
deleted file mode 100644
index 237c92f7d2..0000000000
--- a/indra/newview/skins/minimal/xui/de/menu_attachment_other.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<!-- *NOTE: See also menu_avatar_other.xml -->
-<context_menu name="Avatar Pie">
- <menu_item_call label="Profil anzeigen" name="Profile..."/>
- <menu_item_call label="Freund hinzufügen" name="Add Friend"/>
- <menu_item_call label="IM" name="Send IM..."/>
- <menu_item_call label="Anrufen" name="Call"/>
- <menu_item_call label="In Gruppe einladen" name="Invite..."/>
- <menu_item_call label="Ignorieren" name="Avatar Mute"/>
- <menu_item_call label="Melden" name="abuse"/>
- <menu_item_call label="Einfrieren" name="Freeze..."/>
- <menu_item_call label="Hinauswerfen" name="Eject..."/>
- <menu_item_call label="Fehler in Texturen beseitigen" name="Debug..."/>
- <menu_item_call label="Hineinzoomen" name="Zoom In"/>
- <menu_item_call label="Bezahlen" name="Pay..."/>
- <menu_item_call label="Objektprofil" name="Object Inspect"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_attachment_self.xml b/indra/newview/skins/minimal/xui/de/menu_attachment_self.xml
deleted file mode 100644
index 644fc68ba4..0000000000
--- a/indra/newview/skins/minimal/xui/de/menu_attachment_self.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Attachment Pie">
- <menu_item_call label="Berühren" name="Attachment Object Touch"/>
- <menu_item_call label="Bearbeiten" name="Edit..."/>
- <menu_item_call label="Abnehmen" name="Detach"/>
- <menu_item_call label="Hinsetzen" name="Sit Down Here"/>
- <menu_item_call label="Aufstehen" name="Stand Up"/>
- <menu_item_call label="Outfit ändern" name="Change Outfit"/>
- <menu_item_call label="Mein Outfit bearbeiten" name="Edit Outfit"/>
- <menu_item_call label="Meine Form bearbeiten" name="Edit My Shape"/>
- <menu_item_call label="Meine Freunde" name="Friends..."/>
- <menu_item_call label="Meine Gruppen" name="Groups..."/>
- <menu_item_call label="Mein Profil" name="Profile..."/>
- <menu_item_call label="Fehler in Texturen beseitigen" name="Debug..."/>
- <menu_item_call label="Fallen lassen" name="Drop"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_avatar_icon.xml b/indra/newview/skins/minimal/xui/de/menu_avatar_icon.xml
deleted file mode 100644
index c036cf5515..0000000000
--- a/indra/newview/skins/minimal/xui/de/menu_avatar_icon.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Avatar Icon Menu">
- <menu_item_call label="Profil anzeigen" name="Show Profile"/>
- <menu_item_call label="IM senden..." name="Send IM"/>
- <menu_item_call label="Freund hinzufügen..." name="Add Friend"/>
- <menu_item_call label="Freund entfernen..." name="Remove Friend"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_avatar_other.xml b/indra/newview/skins/minimal/xui/de/menu_avatar_other.xml
deleted file mode 100644
index 8aee0be3d2..0000000000
--- a/indra/newview/skins/minimal/xui/de/menu_avatar_other.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<!-- *NOTE: See also menu_attachment_other.xml -->
-<context_menu name="Avatar Pie">
- <menu_item_call label="Profil anzeigen" name="Profile..."/>
- <menu_item_call label="Freund hinzufügen" name="Add Friend"/>
- <menu_item_call label="IM" name="Send IM..."/>
- <menu_item_call label="Anrufen" name="Call"/>
- <menu_item_call label="In Gruppe einladen" name="Invite..."/>
- <menu_item_call label="Ignorieren" name="Avatar Mute"/>
- <menu_item_call label="Melden" name="abuse"/>
- <menu_item_call label="Einfrieren" name="Freeze..."/>
- <menu_item_call label="Hinauswerfen" name="Eject..."/>
- <menu_item_call label="Fehler in Texturen beseitigen" name="Debug..."/>
- <menu_item_call label="Hineinzoomen" name="Zoom In"/>
- <menu_item_call label="Bezahlen" name="Pay..."/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_avatar_self.xml b/indra/newview/skins/minimal/xui/de/menu_avatar_self.xml
deleted file mode 100644
index 582c76ac94..0000000000
--- a/indra/newview/skins/minimal/xui/de/menu_avatar_self.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Self Pie">
- <menu_item_call label="Hinsetzen" name="Sit Down Here"/>
- <menu_item_call label="Aufstehen" name="Stand Up"/>
- <context_menu label="Ausziehen" name="Take Off &gt;">
- <context_menu label="Kleidung" name="Clothes &gt;">
- <menu_item_call label="Hemd" name="Shirt"/>
- <menu_item_call label="Hose" name="Pants"/>
- <menu_item_call label="Rock" name="Skirt"/>
- <menu_item_call label="Schuhe" name="Shoes"/>
- <menu_item_call label="Strümpfe" name="Socks"/>
- <menu_item_call label="Jacke" name="Jacket"/>
- <menu_item_call label="Handschuhe" name="Gloves"/>
- <menu_item_call label="Unterhemd" name="Self Undershirt"/>
- <menu_item_call label="Unterhose" name="Self Underpants"/>
- <menu_item_call label="Tätowierung" name="Self Tattoo"/>
- <menu_item_call label="Alpha" name="Self Alpha"/>
- <menu_item_call label="Alle Kleider" name="All Clothes"/>
- </context_menu>
- <context_menu label="HUD" name="Object Detach HUD"/>
- <context_menu label="Abnehmen" name="Object Detach"/>
- <menu_item_call label="Alles abnehmen" name="Detach All"/>
- </context_menu>
- <menu_item_call label="Outfit ändern" name="Chenge Outfit"/>
- <menu_item_call label="Mein Outfit bearbeiten" name="Edit Outfit"/>
- <menu_item_call label="Meine Form bearbeiten" name="Edit My Shape"/>
- <menu_item_call label="Meine Freunde" name="Friends..."/>
- <menu_item_call label="Meine Gruppen" name="Groups..."/>
- <menu_item_call label="Mein Profil" name="Profile..."/>
- <menu_item_call label="Fehler in Texturen beseitigen" name="Debug..."/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_bottomtray.xml b/indra/newview/skins/minimal/xui/de/menu_bottomtray.xml
deleted file mode 100644
index 6c4308286a..0000000000
--- a/indra/newview/skins/minimal/xui/de/menu_bottomtray.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="hide_camera_move_controls_menu">
- <menu_item_check label="Schaltfläche Gesten" name="ShowGestureButton"/>
- <menu_item_check label="Schaltfläche Bewegungssteuerung" name="ShowMoveButton"/>
- <menu_item_check label="Schaltfläche Ansicht" name="ShowCameraButton"/>
- <menu_item_check label="Schaltfläche Foto" name="ShowSnapshotButton"/>
- <menu_item_check label="Schaltfläche „Seitenleiste“" name="ShowSidebarButton"/>
- <menu_item_check label="Schaltfläche „Bauen“" name="ShowBuildButton"/>
- <menu_item_check label="Schaltfläche „Suchen“" name="ShowSearchButton"/>
- <menu_item_check label="Schaltfläche „Karte“" name="ShowWorldMapButton"/>
- <menu_item_check label="Schaltfläche „Minikarte“" name="ShowMiniMapButton"/>
- <menu_item_call label="Ausschneiden" name="NearbyChatBar_Cut"/>
- <menu_item_call label="Kopieren" name="NearbyChatBar_Copy"/>
- <menu_item_call label="Einfügen" name="NearbyChatBar_Paste"/>
- <menu_item_call label="Löschen" name="NearbyChatBar_Delete"/>
- <menu_item_call label="Alle auswählen" name="NearbyChatBar_Select_All"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_cof_attachment.xml b/indra/newview/skins/minimal/xui/de/menu_cof_attachment.xml
deleted file mode 100644
index 05d3dfca9d..0000000000
--- a/indra/newview/skins/minimal/xui/de/menu_cof_attachment.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="COF Attachment">
- <menu_item_call label="Abnehmen" name="detach"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_cof_body_part.xml b/indra/newview/skins/minimal/xui/de/menu_cof_body_part.xml
deleted file mode 100644
index 07960a525c..0000000000
--- a/indra/newview/skins/minimal/xui/de/menu_cof_body_part.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="COF Body">
- <menu_item_call label="Ersetzen" name="replace"/>
- <menu_item_call label="Bearbeiten" name="edit"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_cof_clothing.xml b/indra/newview/skins/minimal/xui/de/menu_cof_clothing.xml
deleted file mode 100644
index 7fced273a7..0000000000
--- a/indra/newview/skins/minimal/xui/de/menu_cof_clothing.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="COF Clothing">
- <menu_item_call label="Ausziehen" name="take_off"/>
- <menu_item_call label="Ersetzen" name="replace"/>
- <menu_item_call label="Eine Kategorie nach oben" name="move_up"/>
- <menu_item_call label="Eine Kategorie nach unten" name="move_down"/>
- <menu_item_call label="Bearbeiten" name="edit"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_cof_gear.xml b/indra/newview/skins/minimal/xui/de/menu_cof_gear.xml
deleted file mode 100644
index 54b218d22f..0000000000
--- a/indra/newview/skins/minimal/xui/de/menu_cof_gear.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Gear COF">
- <menu label="Neue Kleider" name="COF.Gear.New_Clothes"/>
- <menu label="Neue Körperteile" name="COF.Geear.New_Body_Parts"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_edit.xml b/indra/newview/skins/minimal/xui/de/menu_edit.xml
deleted file mode 100644
index 37f68d68d5..0000000000
--- a/indra/newview/skins/minimal/xui/de/menu_edit.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu label="Bearbeiten" name="Edit">
- <menu_item_call label="Rückgängig" name="Undo"/>
- <menu_item_call label="Wiederherstellen" name="Redo"/>
- <menu_item_call label="Ausschneiden" name="Cut"/>
- <menu_item_call label="Kopieren" name="Copy"/>
- <menu_item_call label="Einfügen" name="Paste"/>
- <menu_item_call label="Löschen" name="Delete"/>
- <menu_item_call label="Duplizieren" name="Duplicate"/>
- <menu_item_call label="Alle auswählen" name="Select All"/>
- <menu_item_call label="Auswahl aufheben" name="Deselect"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_favorites.xml b/indra/newview/skins/minimal/xui/de/menu_favorites.xml
deleted file mode 100644
index 0d0491d2eb..0000000000
--- a/indra/newview/skins/minimal/xui/de/menu_favorites.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Popup">
- <menu_item_call label="Teleportieren" name="Teleport To Landmark"/>
- <menu_item_call label="Landmarken anzeigen/bearbeiten" name="Landmark Open"/>
- <menu_item_call label="SLurl kopieren" name="Copy slurl"/>
- <menu_item_call label="Auf Karte zeigen" name="Show On Map"/>
- <menu_item_call label="Kopieren" name="Landmark Copy"/>
- <menu_item_call label="Einfügen" name="Landmark Paste"/>
- <menu_item_call label="Löschen" name="Delete"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_gesture_gear.xml b/indra/newview/skins/minimal/xui/de/menu_gesture_gear.xml
deleted file mode 100644
index 953c0eeed5..0000000000
--- a/indra/newview/skins/minimal/xui/de/menu_gesture_gear.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_gesture_gear">
- <menu_item_call label="Zu Favoriten hinzufügen/daraus entfernen" name="activate"/>
- <menu_item_call label="Kopieren" name="copy_gesture"/>
- <menu_item_call label="Einfügen" name="paste"/>
- <menu_item_call label="UUID kopieren" name="copy_uuid"/>
- <menu_item_call label="Aktuelles Outfit speichern" name="save_to_outfit"/>
- <menu_item_call label="Bearbeiten" name="edit_gesture"/>
- <menu_item_call label="Untersuchen" name="inspect"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_group_plus.xml b/indra/newview/skins/minimal/xui/de/menu_group_plus.xml
deleted file mode 100644
index 583ee793be..0000000000
--- a/indra/newview/skins/minimal/xui/de/menu_group_plus.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_group_plus">
- <menu_item_call label="Werden Sie Mitglied..." name="item_join"/>
- <menu_item_call label="Neue Gruppe..." name="item_new"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_hide_navbar.xml b/indra/newview/skins/minimal/xui/de/menu_hide_navbar.xml
deleted file mode 100644
index 9acf96dc6d..0000000000
--- a/indra/newview/skins/minimal/xui/de/menu_hide_navbar.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="hide_navbar_menu">
- <menu_item_check label="Navigationsleiste anzeigen" name="ShowNavbarNavigationPanel"/>
- <menu_item_check label="Favoritenleiste anzeigen" name="ShowNavbarFavoritesPanel"/>
- <menu_item_check label="Mini-Standortleiste anzeigen" name="ShowMiniLocationPanel"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_im_well_button.xml b/indra/newview/skins/minimal/xui/de/menu_im_well_button.xml
deleted file mode 100644
index f464b71f4a..0000000000
--- a/indra/newview/skins/minimal/xui/de/menu_im_well_button.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="IM Well Button Context Menu">
- <menu_item_call label="Alle schließen" name="Close All"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_imchiclet_adhoc.xml b/indra/newview/skins/minimal/xui/de/menu_imchiclet_adhoc.xml
deleted file mode 100644
index 11f93f47b4..0000000000
--- a/indra/newview/skins/minimal/xui/de/menu_imchiclet_adhoc.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="IMChiclet AdHoc Menu">
- <menu_item_call label="Sitzung beenden" name="End Session"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_imchiclet_group.xml b/indra/newview/skins/minimal/xui/de/menu_imchiclet_group.xml
deleted file mode 100644
index 81ef3b6569..0000000000
--- a/indra/newview/skins/minimal/xui/de/menu_imchiclet_group.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="IMChiclet Group Menu">
- <menu_item_call label="Gruppeninfo" name="Show Profile"/>
- <menu_item_call label="Sitzung anzeigen" name="Chat"/>
- <menu_item_call label="Sitzung beenden" name="End Session"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_imchiclet_p2p.xml b/indra/newview/skins/minimal/xui/de/menu_imchiclet_p2p.xml
deleted file mode 100644
index d123238246..0000000000
--- a/indra/newview/skins/minimal/xui/de/menu_imchiclet_p2p.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="IMChiclet P2P Menu">
- <menu_item_call label="Profil anzeigen" name="Show Profile"/>
- <menu_item_call label="Freund hinzufügen" name="Add Friend"/>
- <menu_item_call label="Sitzung anzeigen" name="Send IM"/>
- <menu_item_call label="Sitzung beenden" name="End Session"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_inspect_avatar_gear.xml b/indra/newview/skins/minimal/xui/de/menu_inspect_avatar_gear.xml
deleted file mode 100644
index 72ba7fe41d..0000000000
--- a/indra/newview/skins/minimal/xui/de/menu_inspect_avatar_gear.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<toggleable_menu name="Gear Menu">
- <menu_item_call label="Profil anzeigen" name="view_profile"/>
- <menu_item_call label="Freund hinzufügen" name="add_friend"/>
- <menu_item_call label="IM" name="im"/>
- <menu_item_call label="Anrufen" name="call"/>
- <menu_item_call label="Teleportieren" name="teleport"/>
- <menu_item_call label="Ignorieren" name="block"/>
- <menu_item_call label="Freischalten" name="unblock"/>
- <menu_item_call label="Melden" name="report"/>
- <menu_item_call label="Einfrieren" name="freeze"/>
- <menu_item_call label="Hinauswerfen" name="eject"/>
- <menu_item_call label="Hinauswerfen" name="kick"/>
- <menu_item_call label="CSR" name="csr"/>
- <menu_item_call label="Fehler in Texturen beseitigen" name="debug"/>
- <menu_item_call label="Auf Karte anzeigen" name="find_on_map"/>
- <menu_item_call label="Hineinzoomen" name="zoom_in"/>
-</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_inspect_object_gear.xml b/indra/newview/skins/minimal/xui/de/menu_inspect_object_gear.xml
deleted file mode 100644
index 7c47913e30..0000000000
--- a/indra/newview/skins/minimal/xui/de/menu_inspect_object_gear.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<menu name="Gear Menu">
- <menu_item_call label="Berühren" name="touch"/>
- <menu_item_call label="Sitzen" name="sit"/>
- <menu_item_call label="Bezahlen" name="pay"/>
- <menu_item_call label="Kaufen" name="buy"/>
- <menu_item_call label="Nehmen" name="take"/>
- <menu_item_call label="Kopie nehmen" name="take_copy"/>
- <menu_item_call label="Öffnen" name="open"/>
- <menu_item_call label="Bearbeiten" name="edit"/>
- <menu_item_call label="Anziehen" name="wear"/>
- <menu_item_call label="Hinzufügen" name="add"/>
- <menu_item_call label="Melden" name="report"/>
- <menu_item_call label="Ignorieren" name="block"/>
- <menu_item_call label="Hineinzoomen" name="zoom_in"/>
- <menu_item_call label="Entfernen" name="remove"/>
- <menu_item_call label="Weitere Infos" name="more_info"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_inspect_self_gear.xml b/indra/newview/skins/minimal/xui/de/menu_inspect_self_gear.xml
deleted file mode 100644
index 443092319b..0000000000
--- a/indra/newview/skins/minimal/xui/de/menu_inspect_self_gear.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<toggleable_menu name="Self Pie">
- <menu_item_call label="Hinsetzen" name="Sit Down Here"/>
- <menu_item_call label="Aufstehen" name="Stand Up"/>
- <menu_item_call label="Meine Freunde" name="Friends..."/>
- <menu_item_call label="Mein Profil" name="Profile..."/>
- <menu_item_call label="Fehler in Texturen beseitigen" name="Debug..."/>
-</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_inv_offer_chiclet.xml b/indra/newview/skins/minimal/xui/de/menu_inv_offer_chiclet.xml
deleted file mode 100644
index 71cff7136b..0000000000
--- a/indra/newview/skins/minimal/xui/de/menu_inv_offer_chiclet.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="InvOfferChiclet Menu">
- <menu_item_call label="Schließen" name="Close"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_inventory.xml b/indra/newview/skins/minimal/xui/de/menu_inventory.xml
deleted file mode 100644
index 43722e0dcf..0000000000
--- a/indra/newview/skins/minimal/xui/de/menu_inventory.xml
+++ /dev/null
@@ -1,86 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Popup">
- <menu_item_call label="Teilen" name="Share"/>
- <menu_item_call label="Kaufen" name="Task Buy"/>
- <menu_item_call label="Öffnen" name="Task Open"/>
- <menu_item_call label="Abspielen" name="Task Play"/>
- <menu_item_call label="Eigenschaften" name="Task Properties"/>
- <menu_item_call label="Umbenennen" name="Task Rename"/>
- <menu_item_call label="Löschen" name="Task Remove"/>
- <menu_item_call label="Papierkorb ausleeren" name="Empty Trash"/>
- <menu_item_call label="Fundstücke ausleeren" name="Empty Lost And Found"/>
- <menu_item_call label="Neuer Ordner" name="New Folder"/>
- <menu_item_call label="Neues Skript" name="New Script"/>
- <menu_item_call label="Neue Notizkarte" name="New Note"/>
- <menu_item_call label="Neue Geste" name="New Gesture"/>
- <menu label="Neue Kleider" name="New Clothes">
- <menu_item_call label="Neues Hemd" name="New Shirt"/>
- <menu_item_call label="Neue Hose" name="New Pants"/>
- <menu_item_call label="Neue Schuhe" name="New Shoes"/>
- <menu_item_call label="Neue Socken" name="New Socks"/>
- <menu_item_call label="Neue Jacke" name="New Jacket"/>
- <menu_item_call label="Neuer Rock" name="New Skirt"/>
- <menu_item_call label="Neue Handschuhe" name="New Gloves"/>
- <menu_item_call label="Neues Unterhemd" name="New Undershirt"/>
- <menu_item_call label="Neue Unterhose" name="New Underpants"/>
- <menu_item_call label="Neue Alpha-Maske" name="New Alpha Mask"/>
- <menu_item_call label="Neue Tätowierung" name="New Tattoo"/>
- </menu>
- <menu label="Neue Körperteile" name="New Body Parts">
- <menu_item_call label="Neue Form/Gestalt" name="New Shape"/>
- <menu_item_call label="Neue Haut" name="New Skin"/>
- <menu_item_call label="Neues Haar" name="New Hair"/>
- <menu_item_call label="Neue Augen" name="New Eyes"/>
- </menu>
- <menu label="Typ ändern" name="Change Type">
- <menu_item_call label="Standard" name="Default"/>
- <menu_item_call label="Handschuhe" name="Gloves"/>
- <menu_item_call label="Jacke" name="Jacket"/>
- <menu_item_call label="Hose" name="Pants"/>
- <menu_item_call label="Form" name="Shape"/>
- <menu_item_call label="Schuhe" name="Shoes"/>
- <menu_item_call label="Hemd" name="Shirt"/>
- <menu_item_call label="Rock" name="Skirt"/>
- <menu_item_call label="Unterhose" name="Underpants"/>
- <menu_item_call label="Unterhemd" name="Undershirt"/>
- </menu>
- <menu_item_call label="Teleportieren" name="Landmark Open"/>
- <menu_item_call label="Öffnen" name="Animation Open"/>
- <menu_item_call label="Öffnen" name="Sound Open"/>
- <menu_item_call label="Aktuelles Outfit ersetzen" name="Replace Outfit"/>
- <menu_item_call label="Zum aktuellen Outfit hinzufügen" name="Add To Outfit"/>
- <menu_item_call label="Vom aktuellen Outfit entfernen" name="Remove From Outfit"/>
- <menu_item_call label="Original suchen" name="Find Original"/>
- <menu_item_call label="Objekt löschen" name="Purge Item"/>
- <menu_item_call label="Objekt wiederherstellen" name="Restore Item"/>
- <menu_item_call label="Öffnen" name="Open"/>
- <menu_item_call label="Original öffnen" name="Open Original"/>
- <menu_item_call label="Eigenschaften" name="Properties"/>
- <menu_item_call label="Umbenennen" name="Rename"/>
- <menu_item_call label="Asset-UUID kopieren" name="Copy Asset UUID"/>
- <menu_item_call label="Kopieren" name="Copy"/>
- <menu_item_call label="Einfügen" name="Paste"/>
- <menu_item_call label="Als Link einfügen" name="Paste As Link"/>
- <menu_item_call label="Löschen" name="Remove Link"/>
- <menu_item_call label="Löschen" name="Delete"/>
- <menu_item_call label="Systemordner löschen" name="Delete System Folder"/>
- <menu_item_call label="Konferenz-Chat starten" name="Conference Chat Folder"/>
- <menu_item_call label="Wiedergeben/Abspielen" name="Sound Play"/>
- <menu_item_call label="Landmarken-Info" name="About Landmark"/>
- <menu_item_call label="Inworld abspielen" name="Animation Play"/>
- <menu_item_call label="Lokal abspielen" name="Animation Audition"/>
- <menu_item_call label="Instant Message senden" name="Send Instant Message"/>
- <menu_item_call label="Teleport anbieten..." name="Offer Teleport..."/>
- <menu_item_call label="Konferenz-Chat starten" name="Conference Chat"/>
- <menu_item_call label="Aktivieren" name="Activate"/>
- <menu_item_call label="Deaktivieren" name="Deactivate"/>
- <menu_item_call label="Speichern unter" name="Save As"/>
- <menu_item_call label="Von Körper abnehmen" name="Detach From Yourself"/>
- <menu_item_call label="Anziehen" name="Wearable And Object Wear"/>
- <menu label="Anhängen an" name="Attach To"/>
- <menu label="An HUD hängen" name="Attach To HUD"/>
- <menu_item_call label="Bearbeiten" name="Wearable Edit"/>
- <menu_item_call label="Hinzufügen" name="Wearable Add"/>
- <menu_item_call label="Ausziehen" name="Take Off"/>
- <menu_item_call label="--keine Optionen--" name="--no options--"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_inventory_add.xml b/indra/newview/skins/minimal/xui/de/menu_inventory_add.xml
deleted file mode 100644
index dccee6712d..0000000000
--- a/indra/newview/skins/minimal/xui/de/menu_inventory_add.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_inventory_add">
- <menu label="Hochladen" name="upload">
- <menu_item_call label="Bild ([COST] L$)..." name="Upload Image"/>
- <menu_item_call label="Sound ([COST] L$)..." name="Upload Sound"/>
- <menu_item_call label="Animation ([COST] L$)..." name="Upload Animation"/>
- <menu_item_call label="Mehrfach-Upload ([COST] L$ pro Datei)..." name="Bulk Upload"/>
- <menu_item_call label="Hochlade-Berechtigungen (Standard) festlegen" name="perm prefs"/>
- </menu>
- <menu_item_call label="Neuer Ordner" name="New Folder"/>
- <menu_item_call label="Neues Skript" name="New Script"/>
- <menu_item_call label="Neue Notizkarte" name="New Note"/>
- <menu_item_call label="Neue Geste" name="New Gesture"/>
- <menu label="Neue Kleider" name="New Clothes">
- <menu_item_call label="Neues Hemd" name="New Shirt"/>
- <menu_item_call label="Neue Hose" name="New Pants"/>
- <menu_item_call label="Neue Schuhe" name="New Shoes"/>
- <menu_item_call label="Neue Socken" name="New Socks"/>
- <menu_item_call label="Neue Jacke" name="New Jacket"/>
- <menu_item_call label="Neuer Rock" name="New Skirt"/>
- <menu_item_call label="Neue Handschuhe" name="New Gloves"/>
- <menu_item_call label="Neues Unterhemd" name="New Undershirt"/>
- <menu_item_call label="Neue Unterhose" name="New Underpants"/>
- <menu_item_call label="Neues Alpha" name="New Alpha"/>
- <menu_item_call label="Neue Tätowierung" name="New Tattoo"/>
- </menu>
- <menu label="Neue Körperteile" name="New Body Parts">
- <menu_item_call label="Neue Form/Gestalt" name="New Shape"/>
- <menu_item_call label="Neue Haut" name="New Skin"/>
- <menu_item_call label="Neues Haar" name="New Hair"/>
- <menu_item_call label="Neue Augen" name="New Eyes"/>
- </menu>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_inventory_gear_default.xml b/indra/newview/skins/minimal/xui/de/menu_inventory_gear_default.xml
deleted file mode 100644
index df86a5cf71..0000000000
--- a/indra/newview/skins/minimal/xui/de/menu_inventory_gear_default.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<toggleable_menu name="menu_gear_default">
- <menu_item_call label="Neues Inventar-Fenster" name="new_window"/>
- <menu_item_check label="Nach Name sortieren" name="sort_by_name"/>
- <menu_item_check label="Nach aktuellesten Objekten sortieren" name="sort_by_recent"/>
- <menu_item_check label="Systemordner nach oben" name="sort_system_folders_to_top"/>
- <menu_item_call label="Filter anzeigen" name="show_filters"/>
- <menu_item_call label="Filter zurücksetzen" name="reset_filters"/>
- <menu_item_call label="Alle Ordner schließen" name="close_folders"/>
- <menu_item_call label="Fundbüro ausleeren" name="empty_lostnfound"/>
- <menu_item_call label="Textur speichern als" name="Save Texture As"/>
- <menu_item_call label="Teilen" name="Share"/>
- <menu_item_call label="Original suchen" name="Find Original"/>
- <menu_item_call label="Alle Links suchen" name="Find All Links"/>
- <menu_item_call label="Papierkorb ausleeren" name="empty_trash"/>
-</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_land.xml b/indra/newview/skins/minimal/xui/de/menu_land.xml
deleted file mode 100644
index de679da3d8..0000000000
--- a/indra/newview/skins/minimal/xui/de/menu_land.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Land Pie">
- <menu_item_call label="Land-Info" name="Place Information..."/>
- <menu_item_call label="Hier sitzen" name="Sit Here"/>
- <menu_item_call label="Dieses Land kaufen" name="Land Buy"/>
- <menu_item_call label="Pass kaufen" name="Land Buy Pass"/>
- <menu_item_call label="Bauen" name="Create"/>
- <menu_item_call label="Land bearbeiten" name="Edit Terrain"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_landmark.xml b/indra/newview/skins/minimal/xui/de/menu_landmark.xml
deleted file mode 100644
index 2aff0eec95..0000000000
--- a/indra/newview/skins/minimal/xui/de/menu_landmark.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<toggleable_menu name="landmark_overflow_menu">
- <menu_item_call label="SLurl kopieren" name="copy"/>
- <menu_item_call label="Löschen" name="delete"/>
- <menu_item_call label="Auswahl erstellen" name="pick"/>
- <menu_item_call label="Zu Favoritenleiste hinzufügen" name="add_to_favbar"/>
-</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_login.xml b/indra/newview/skins/minimal/xui/de/menu_login.xml
deleted file mode 100644
index a373e15338..0000000000
--- a/indra/newview/skins/minimal/xui/de/menu_login.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu_bar name="Login Menu">
- <menu label="Ich" name="File">
- <menu_item_call label="Einstellungen" name="Preferences..."/>
- <menu_item_call label="[APP_NAME] schließen" name="Quit"/>
- </menu>
- <menu label="Hilfe" name="Help">
- <menu_item_call label="[SECOND_LIFE]-Hilfe" name="Second Life Help"/>
- <menu_item_call label="INFO ÜBER [APP_NAME]" name="About Second Life"/>
- </menu>
- <menu_item_check label="Debug-Menü anzeigen" name="Show Debug Menu"/>
- <menu label="Debug" name="Debug">
- <menu_item_call label="Debug-Einstellungen anzeigen" name="Debug Settings"/>
- <menu_item_call label="UI/Farb-Einstellungen" name="UI/Color Settings"/>
- <menu_item_call label="XUI-Editor" name="UI Preview Tool"/>
- <menu label="UI-Tests" name="UI Tests"/>
- <menu_item_call label="Fenstergröße einstellen..." name="Set Window Size..."/>
- <menu_item_call label="Servicebedingungen anzeigen" name="TOS"/>
- <menu_item_call label="Wichtige Meldung anzeigen" name="Critical"/>
- <menu_item_call label="Test Medienbrowser" name="Web Browser Test"/>
- <menu_item_call label="Test Webinhalt-Floater" name="Web Content Floater Test"/>
- <menu_item_check label="Grid-Auswahl anzeigen" name="Show Grid Picker"/>
- <menu_item_call label="Benachrichtigungs-Konsole anzeigen" name="Show Notifications Console"/>
- </menu>
-</menu_bar>
diff --git a/indra/newview/skins/minimal/xui/de/menu_mini_map.xml b/indra/newview/skins/minimal/xui/de/menu_mini_map.xml
deleted file mode 100644
index 2e0d72c40c..0000000000
--- a/indra/newview/skins/minimal/xui/de/menu_mini_map.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Popup">
- <menu_item_call label="Zoom Nah" name="Zoom Close"/>
- <menu_item_call label="Zoom Mittel" name="Zoom Medium"/>
- <menu_item_call label="Zoom Weit" name="Zoom Far"/>
- <menu_item_call label="Zoom-Standard" name="Zoom Default"/>
- <menu_item_check label="Karte drehen" name="Rotate Map"/>
- <menu_item_check label="Automatisch zentrieren" name="Auto Center"/>
- <menu_item_call label="Verfolgung abschalten" name="Stop Tracking"/>
- <menu_item_call label="Weltkarte" name="World Map"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_navbar.xml b/indra/newview/skins/minimal/xui/de/menu_navbar.xml
deleted file mode 100644
index 5175f34b41..0000000000
--- a/indra/newview/skins/minimal/xui/de/menu_navbar.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Navbar Menu">
- <menu_item_check label="Koordinaten anzeigen" name="Show Coordinates"/>
- <menu_item_check label="Parzelleneigenschaften anzeigen" name="Show Parcel Properties"/>
- <menu_item_call label="Landmarke" name="Landmark"/>
- <menu_item_call label="Ausschneiden" name="Cut"/>
- <menu_item_call label="Kopieren" name="Copy"/>
- <menu_item_call label="Einfügen" name="Paste"/>
- <menu_item_call label="Löschen" name="Delete"/>
- <menu_item_call label="Alle auswählen" name="Select All"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_nearby_chat.xml b/indra/newview/skins/minimal/xui/de/menu_nearby_chat.xml
deleted file mode 100644
index 99d6428c3f..0000000000
--- a/indra/newview/skins/minimal/xui/de/menu_nearby_chat.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="NearBy Chat Menu">
- <menu_item_call label="Leute in der Nähe anzeigen..." name="nearby_people"/>
- <menu_item_check label="Ignorierten Text anzeigen" name="muted_text"/>
- <menu_item_check label="Bilder von Freunden anzeigen" name="show_buddy_icons"/>
- <menu_item_check label="Namen anzeigen" name="show_names"/>
- <menu_item_check label="Namen und Symbole anzeigen" name="show_icons_and_names"/>
- <menu_item_call label="Schriftgröße" name="font_size"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_notification_well_button.xml b/indra/newview/skins/minimal/xui/de/menu_notification_well_button.xml
deleted file mode 100644
index 0f2784f160..0000000000
--- a/indra/newview/skins/minimal/xui/de/menu_notification_well_button.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Notification Well Button Context Menu">
- <menu_item_call label="Alle schließen" name="Close All"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_object.xml b/indra/newview/skins/minimal/xui/de/menu_object.xml
deleted file mode 100644
index 19057d4228..0000000000
--- a/indra/newview/skins/minimal/xui/de/menu_object.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Object Pie">
- <menu_item_call label="Berühren" name="Object Touch">
- <menu_item_call.on_enable name="EnableTouch" parameter="Berühren"/>
- </menu_item_call>
- <menu_item_call label="Bearbeiten" name="Edit..."/>
- <menu_item_call label="Bauen" name="Build"/>
- <menu_item_call label="Öffnen" name="Open"/>
- <menu_item_call label="Hier sitzen" name="Object Sit"/>
- <menu_item_call label="Aufstehen" name="Object Stand Up"/>
- <menu_item_call label="Objektprofil" name="Object Inspect"/>
- <menu_item_call label="Hineinzoomen" name="Zoom In"/>
- <context_menu label="Anziehen" name="Put On">
- <menu_item_call label="Anziehen" name="Wear"/>
- <menu_item_call label="Hinzufügen" name="Add"/>
- <context_menu label="Anhängen" name="Object Attach"/>
- <context_menu label="HUD anhängen" name="Object Attach HUD"/>
- </context_menu>
- <context_menu label="Entfernen" name="Remove">
- <menu_item_call label="Missbrauch melden" name="Report Abuse..."/>
- <menu_item_call label="Ignorieren" name="Object Mute"/>
- <menu_item_call label="Zurückgeben" name="Return..."/>
- <menu_item_call label="Löschen" name="Delete"/>
- </context_menu>
- <menu_item_call label="Nehmen" name="Pie Object Take"/>
- <menu_item_call label="Kopie nehmen" name="Take Copy"/>
- <menu_item_call label="Bezahlen" name="Pay..."/>
- <menu_item_call label="Kaufen" name="Buy..."/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_object_icon.xml b/indra/newview/skins/minimal/xui/de/menu_object_icon.xml
deleted file mode 100644
index 8b6c558416..0000000000
--- a/indra/newview/skins/minimal/xui/de/menu_object_icon.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Object Icon Menu">
- <menu_item_call label="Objektprofil..." name="Object Profile"/>
- <menu_item_call label="Ignorieren..." name="Block"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_outfit_gear.xml b/indra/newview/skins/minimal/xui/de/menu_outfit_gear.xml
deleted file mode 100644
index 897154ec56..0000000000
--- a/indra/newview/skins/minimal/xui/de/menu_outfit_gear.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Gear Outfit">
- <menu_item_call label="Anziehen - Aktuelles Outfit ersetzen" name="wear"/>
- <menu_item_call label="Anziehen - Aktuelles Outfit hinzufügen" name="wear_add"/>
- <menu_item_call label="Ausziehen - Aus aktuellem Outfit entfernen" name="take_off"/>
- <menu label="Neue Kleider" name="New Clothes">
- <menu_item_call label="Neues Hemd" name="New Shirt"/>
- <menu_item_call label="Neue Hose" name="New Pants"/>
- <menu_item_call label="Neue Schuhe" name="New Shoes"/>
- <menu_item_call label="Neue Socken" name="New Socks"/>
- <menu_item_call label="Neue Jacke" name="New Jacket"/>
- <menu_item_call label="Neuer Rock" name="New Skirt"/>
- <menu_item_call label="Neue Handschuhe" name="New Gloves"/>
- <menu_item_call label="Neues Unterhemd" name="New Undershirt"/>
- <menu_item_call label="Neue Unterhose" name="New Underpants"/>
- <menu_item_call label="Neues Alpha" name="New Alpha"/>
- <menu_item_call label="Neue Tätowierung" name="New Tattoo"/>
- </menu>
- <menu label="Neue Körperteile" name="New Body Parts">
- <menu_item_call label="Neue Form" name="New Shape"/>
- <menu_item_call label="Neue Haut" name="New Skin"/>
- <menu_item_call label="Neues Haar" name="New Hair"/>
- <menu_item_call label="Neue Augen" name="New Eyes"/>
- </menu>
- <menu_item_call label="Outfit neu benennen" name="rename"/>
- <menu_item_call label="Outfit löschen" name="delete_outfit"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_outfit_tab.xml b/indra/newview/skins/minimal/xui/de/menu_outfit_tab.xml
deleted file mode 100644
index 32a65c96fc..0000000000
--- a/indra/newview/skins/minimal/xui/de/menu_outfit_tab.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Outfit">
- <menu_item_call label="Anziehen - Aktuelles Outfit ersetzen" name="wear_replace"/>
- <menu_item_call label="Anziehen - Aktuelles Outfit hinzufügen" name="wear_add"/>
- <menu_item_call label="Ausziehen - Aus aktuellem Outfit entfernen" name="take_off"/>
- <menu_item_call label="Outfit bearbeiten" name="edit"/>
- <menu_item_call label="Outfit neu benennen" name="rename"/>
- <menu_item_call label="Outfit löschen" name="delete"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_participant_list.xml b/indra/newview/skins/minimal/xui/de/menu_participant_list.xml
deleted file mode 100644
index 160f2f97be..0000000000
--- a/indra/newview/skins/minimal/xui/de/menu_participant_list.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Participant List Context Menu">
- <menu_item_check label="Nach Name sortieren" name="SortByName"/>
- <menu_item_check label="Nach letzten Sprechern sortieren" name="SortByRecentSpeakers"/>
- <menu_item_call label="Profil anzeigen" name="View Profile"/>
- <menu_item_call label="Freund hinzufügen" name="Add Friend"/>
- <menu_item_call label="IM" name="IM"/>
- <menu_item_call label="Anrufen" name="Call"/>
- <menu_item_call label="Teilen" name="Share"/>
- <menu_item_call label="Bezahlen" name="Pay"/>
- <menu_item_check label="Symbole für Personen anzeigen" name="View Icons"/>
- <menu_item_check label="Voice ignorieren" name="Block/Unblock"/>
- <menu_item_check label="Text ignorieren" name="MuteText"/>
- <context_menu label="Moderator-Optionen" name="Moderator Options">
- <menu_item_check label="Text-Chat zulassen" name="AllowTextChat"/>
- <menu_item_call label="Diesen Teilnehmer stummschalten" name="ModerateVoiceMuteSelected"/>
- <menu_item_call label="Stummschaltung für diesen Teilnehmer aufheben" name="ModerateVoiceUnMuteSelected"/>
- <menu_item_call label="Alle stummschalten" name="ModerateVoiceMute"/>
- <menu_item_call label="Alle freischalten" name="ModerateVoiceUnmute"/>
- </context_menu>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_people_friends_view_sort.xml b/indra/newview/skins/minimal/xui/de/menu_people_friends_view_sort.xml
deleted file mode 100644
index 84d9d8938c..0000000000
--- a/indra/newview/skins/minimal/xui/de/menu_people_friends_view_sort.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_group_plus">
- <menu_item_check label="Nach Name sortieren" name="sort_name"/>
- <menu_item_check label="Nach Status sortieren" name="sort_status"/>
- <menu_item_check label="Symbole für Personen anzeigen" name="view_icons"/>
- <menu_item_check label="Erteilte Genehmigungen anzeigen" name="view_permissions"/>
- <menu_item_call label="Ignorierte Einwohner &amp; Objekte anzeigen" name="show_blocked_list"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_people_groups.xml b/indra/newview/skins/minimal/xui/de/menu_people_groups.xml
deleted file mode 100644
index 76225ba241..0000000000
--- a/indra/newview/skins/minimal/xui/de/menu_people_groups.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_group_plus">
- <menu_item_call label="Info anzeigen" name="View Info"/>
- <menu_item_call label="Chat" name="Chat"/>
- <menu_item_call label="Anrufen" name="Call"/>
- <menu_item_call label="Aktivieren" name="Activate"/>
- <menu_item_call label="Verlassen" name="Leave"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_people_groups_view_sort.xml b/indra/newview/skins/minimal/xui/de/menu_people_groups_view_sort.xml
deleted file mode 100644
index b68597d8aa..0000000000
--- a/indra/newview/skins/minimal/xui/de/menu_people_groups_view_sort.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_group_plus">
- <menu_item_check label="Gruppensymbole anzeigen" name="Display Group Icons"/>
- <menu_item_call label="Ausgewählte Gruppe verlassen" name="Leave Selected Group"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_people_nearby.xml b/indra/newview/skins/minimal/xui/de/menu_people_nearby.xml
deleted file mode 100644
index 1db964357f..0000000000
--- a/indra/newview/skins/minimal/xui/de/menu_people_nearby.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Avatar Context Menu">
- <menu_item_call label="Profil anzeigen" name="View Profile"/>
- <menu_item_call label="Freund hinzufügen" name="Add Friend"/>
- <menu_item_call label="Freund entfernen" name="Remove Friend"/>
- <menu_item_call label="IM" name="IM"/>
- <menu_item_call label="Anrufen" name="Call"/>
- <menu_item_call label="Karte" name="Map"/>
- <menu_item_call label="Teilen" name="Share"/>
- <menu_item_call label="Bezahlen" name="Pay"/>
- <menu_item_check label="Ignorieren/Freischalten" name="Block/Unblock"/>
- <menu_item_call label="Teleport anbieten" name="teleport"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_people_nearby_multiselect.xml b/indra/newview/skins/minimal/xui/de/menu_people_nearby_multiselect.xml
deleted file mode 100644
index b6e99edfe1..0000000000
--- a/indra/newview/skins/minimal/xui/de/menu_people_nearby_multiselect.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Multi-Selected People Context Menu">
- <menu_item_call label="Freunde hinzufügen" name="Add Friends"/>
- <menu_item_call label="Freunde entfernen" name="Remove Friend"/>
- <menu_item_call label="IM" name="IM"/>
- <menu_item_call label="Anrufen" name="Call"/>
- <menu_item_call label="Teilen" name="Share"/>
- <menu_item_call label="Bezahlen" name="Pay"/>
- <menu_item_call label="Teleport anbieten" name="teleport"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_people_nearby_view_sort.xml b/indra/newview/skins/minimal/xui/de/menu_people_nearby_view_sort.xml
deleted file mode 100644
index 0f252ab46d..0000000000
--- a/indra/newview/skins/minimal/xui/de/menu_people_nearby_view_sort.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_group_plus">
- <menu_item_check label="Nach letzten Sprechern sortieren" name="sort_by_recent_speakers"/>
- <menu_item_check label="Nach Name sortieren" name="sort_name"/>
- <menu_item_check label="Nach Entfernung sortieren" name="sort_distance"/>
- <menu_item_check label="Symbole für Personen anzeigen" name="view_icons"/>
- <menu_item_call label="Ignorierte Einwohner &amp; Objekte anzeigen" name="show_blocked_list"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_people_recent_view_sort.xml b/indra/newview/skins/minimal/xui/de/menu_people_recent_view_sort.xml
deleted file mode 100644
index 1ef020f5e1..0000000000
--- a/indra/newview/skins/minimal/xui/de/menu_people_recent_view_sort.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_group_plus">
- <menu_item_check label="Nach aktuellesten Sprechern sortieren" name="sort_most"/>
- <menu_item_check label="Nach Name sortieren" name="sort_name"/>
- <menu_item_check label="Symbole für Personen anzeigen" name="view_icons"/>
- <menu_item_call label="Ignorierte Einwohner &amp; Objekte anzeigen" name="show_blocked_list"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_picks.xml b/indra/newview/skins/minimal/xui/de/menu_picks.xml
deleted file mode 100644
index 9aec4c83b0..0000000000
--- a/indra/newview/skins/minimal/xui/de/menu_picks.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Picks">
- <menu_item_call label="Info" name="pick_info"/>
- <menu_item_call label="Bearbeiten" name="pick_edit"/>
- <menu_item_call label="Teleportieren" name="pick_teleport"/>
- <menu_item_call label="Karte" name="pick_map"/>
- <menu_item_call label="Löschen" name="pick_delete"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_picks_plus.xml b/indra/newview/skins/minimal/xui/de/menu_picks_plus.xml
deleted file mode 100644
index 385ff25b95..0000000000
--- a/indra/newview/skins/minimal/xui/de/menu_picks_plus.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<toggleable_menu name="picks_plus_menu">
- <menu_item_call label="Neue Auswahl" name="create_pick"/>
- <menu_item_call label="Neue Anzeige" name="create_classified"/>
-</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_place.xml b/indra/newview/skins/minimal/xui/de/menu_place.xml
deleted file mode 100644
index d9c85f5b92..0000000000
--- a/indra/newview/skins/minimal/xui/de/menu_place.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<toggleable_menu name="place_overflow_menu">
- <menu_item_call label="Eine Landmarke setzen" name="landmark"/>
- <menu_item_call label="Auswahl erstellen" name="pick"/>
- <menu_item_call label="Pass kaufen" name="pass"/>
- <menu_item_call label="Bearbeiten" name="edit"/>
-</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_place_add_button.xml b/indra/newview/skins/minimal/xui/de/menu_place_add_button.xml
deleted file mode 100644
index 7c0ff4a46a..0000000000
--- a/indra/newview/skins/minimal/xui/de/menu_place_add_button.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_folder_gear">
- <menu_item_call label="Ordner hinzufügen" name="add_folder"/>
- <menu_item_call label="Landmarke hinzufügen" name="add_landmark"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_places_gear_folder.xml b/indra/newview/skins/minimal/xui/de/menu_places_gear_folder.xml
deleted file mode 100644
index 132d3f6466..0000000000
--- a/indra/newview/skins/minimal/xui/de/menu_places_gear_folder.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_folder_gear">
- <menu_item_call label="Landmarke hinzufügen" name="add_landmark"/>
- <menu_item_call label="Ordner hinzufügen" name="add_folder"/>
- <menu_item_call label="Ausschneiden" name="cut"/>
- <menu_item_call label="Kopieren" name="copy_folder"/>
- <menu_item_call label="Einfügen" name="paste"/>
- <menu_item_call label="Umbenennen" name="rename"/>
- <menu_item_call label="Löschen" name="delete"/>
- <menu_item_call label="Erweitern Sie sich" name="expand"/>
- <menu_item_call label="Zuklappen" name="collapse"/>
- <menu_item_call label="Alle Ordner aufklappen" name="expand_all"/>
- <menu_item_call label="Alle Ordner schließen" name="collapse_all"/>
- <menu_item_check label="Nach Datum sortieren" name="sort_by_date"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_places_gear_landmark.xml b/indra/newview/skins/minimal/xui/de/menu_places_gear_landmark.xml
deleted file mode 100644
index 6af4d644af..0000000000
--- a/indra/newview/skins/minimal/xui/de/menu_places_gear_landmark.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_ladmark_gear">
- <menu_item_call label="Teleportieren" name="teleport"/>
- <menu_item_call label="Weitere Informationen" name="more_info"/>
- <menu_item_call label="Auf Karte zeigen" name="show_on_map"/>
- <menu_item_call label="Landmarke hinzufügen" name="add_landmark"/>
- <menu_item_call label="Ordner hinzufügen" name="add_folder"/>
- <menu_item_call label="Ausschneiden" name="cut"/>
- <menu_item_call label="Landmarke kopieren" name="copy_landmark"/>
- <menu_item_call label="SLurl kopieren" name="copy_slurl"/>
- <menu_item_call label="Einfügen" name="paste"/>
- <menu_item_call label="Umbenennen" name="rename"/>
- <menu_item_call label="Löschen" name="delete"/>
- <menu_item_call label="Alle Ordner aufklappen" name="expand_all"/>
- <menu_item_call label="Alle Ordner schließen" name="collapse_all"/>
- <menu_item_check label="Nach Datum sortieren" name="sort_by_date"/>
- <menu_item_call label="Auswahl erstellen" name="create_pick"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_profile_overflow.xml b/indra/newview/skins/minimal/xui/de/menu_profile_overflow.xml
deleted file mode 100644
index 9f3fcbca1d..0000000000
--- a/indra/newview/skins/minimal/xui/de/menu_profile_overflow.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<toggleable_menu name="profile_overflow_menu">
- <menu_item_call label="Karte" name="show_on_map"/>
- <menu_item_call label="Bezahlen" name="pay"/>
- <menu_item_call label="Teilen" name="share"/>
- <menu_item_call label="Ignorieren" name="block"/>
- <menu_item_call label="Freischalten" name="unblock"/>
- <menu_item_call label="Hinauswerfen" name="kick"/>
- <menu_item_call label="Einfrieren" name="freeze"/>
- <menu_item_call label="Auftauen" name="unfreeze"/>
- <menu_item_call label="CSR" name="csr"/>
-</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_save_outfit.xml b/indra/newview/skins/minimal/xui/de/menu_save_outfit.xml
deleted file mode 100644
index 986c78b318..0000000000
--- a/indra/newview/skins/minimal/xui/de/menu_save_outfit.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<toggleable_menu name="save_outfit_menu">
- <menu_item_call label="Speichern" name="save_outfit"/>
- <menu_item_call label="Speichern unter" name="save_as_new_outfit"/>
-</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_script_chiclet.xml b/indra/newview/skins/minimal/xui/de/menu_script_chiclet.xml
deleted file mode 100644
index 3256aa1a87..0000000000
--- a/indra/newview/skins/minimal/xui/de/menu_script_chiclet.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="ScriptChiclet Menu">
- <menu_item_call label="Schließen" name="Close"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_slurl.xml b/indra/newview/skins/minimal/xui/de/menu_slurl.xml
deleted file mode 100644
index b2ec017f9f..0000000000
--- a/indra/newview/skins/minimal/xui/de/menu_slurl.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Popup">
- <menu_item_call label="URL-Info" name="about_url"/>
- <menu_item_call label="Zu URL teleportieren" name="teleport_to_url"/>
- <menu_item_call label="Karte" name="show_on_map"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_teleport_history_gear.xml b/indra/newview/skins/minimal/xui/de/menu_teleport_history_gear.xml
deleted file mode 100644
index 68b8e21802..0000000000
--- a/indra/newview/skins/minimal/xui/de/menu_teleport_history_gear.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Teleport History Gear Context Menu">
- <menu_item_call label="Alle Ordner aufklappen" name="Expand all folders"/>
- <menu_item_call label="Alle Ordner schließen" name="Collapse all folders"/>
- <menu_item_call label="Teleport-Liste löschen" name="Clear Teleport History"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_teleport_history_item.xml b/indra/newview/skins/minimal/xui/de/menu_teleport_history_item.xml
deleted file mode 100644
index ff8fb0b181..0000000000
--- a/indra/newview/skins/minimal/xui/de/menu_teleport_history_item.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Teleport History Item Context Menu">
- <menu_item_call label="Teleportieren" name="Teleport"/>
- <menu_item_call label="Weitere Informationen" name="More Information"/>
- <menu_item_call label="In Zwischenablage kopieren" name="CopyToClipboard"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_teleport_history_tab.xml b/indra/newview/skins/minimal/xui/de/menu_teleport_history_tab.xml
deleted file mode 100644
index 194dd16fd1..0000000000
--- a/indra/newview/skins/minimal/xui/de/menu_teleport_history_tab.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Teleport History Item Context Menu">
- <menu_item_call label="Öffnen" name="TabOpen"/>
- <menu_item_call label="Schließen" name="TabClose"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_text_editor.xml b/indra/newview/skins/minimal/xui/de/menu_text_editor.xml
deleted file mode 100644
index c00186c13e..0000000000
--- a/indra/newview/skins/minimal/xui/de/menu_text_editor.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Text editor context menu">
- <menu_item_call label="Ausschneiden" name="Cut"/>
- <menu_item_call label="Kopieren" name="Copy"/>
- <menu_item_call label="Einfügen" name="Paste"/>
- <menu_item_call label="Löschen" name="Delete"/>
- <menu_item_call label="Alle auswählen" name="Select All"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_topinfobar.xml b/indra/newview/skins/minimal/xui/de/menu_topinfobar.xml
deleted file mode 100644
index 5b0a724244..0000000000
--- a/indra/newview/skins/minimal/xui/de/menu_topinfobar.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_topinfobar">
- <menu_item_check label="Koordinaten anzeigen" name="Show Coordinates"/>
- <menu_item_check label="Parzellen-Eigenschaften anzeigen" name="Show Parcel Properties"/>
- <menu_item_call label="Landmarke" name="Landmark"/>
- <menu_item_call label="Kopieren" name="Copy"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_url_agent.xml b/indra/newview/skins/minimal/xui/de/menu_url_agent.xml
deleted file mode 100644
index 9a808088fb..0000000000
--- a/indra/newview/skins/minimal/xui/de/menu_url_agent.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Url Popup">
- <menu_item_call label="Einwohnerprofil anzeigen" name="show_agent"/>
- <menu_item_call label="Name in Zwischenablage kopieren" name="url_copy_label"/>
- <menu_item_call label="SLurl in die Zwischenablage kopieren" name="url_copy"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_url_group.xml b/indra/newview/skins/minimal/xui/de/menu_url_group.xml
deleted file mode 100644
index 6bd86414bc..0000000000
--- a/indra/newview/skins/minimal/xui/de/menu_url_group.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Url Popup">
- <menu_item_call label="Gruppeninformation anzeigen" name="show_group"/>
- <menu_item_call label="Gruppe in Zwischenablage kopieren" name="url_copy_label"/>
- <menu_item_call label="SLurl in die Zwischenablage kopieren" name="url_copy"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_url_http.xml b/indra/newview/skins/minimal/xui/de/menu_url_http.xml
deleted file mode 100644
index 30eb1668a5..0000000000
--- a/indra/newview/skins/minimal/xui/de/menu_url_http.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Url Popup">
- <menu_item_call label="Webseite öffnen" name="url_open"/>
- <menu_item_call label="Im internen Browser öffnen" name="url_open_internal"/>
- <menu_item_call label="Im externen Browser öffnen" name="url_open_external"/>
- <menu_item_call label="URL in Zwischenablage kopieren" name="url_copy"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_url_inventory.xml b/indra/newview/skins/minimal/xui/de/menu_url_inventory.xml
deleted file mode 100644
index dc069df02b..0000000000
--- a/indra/newview/skins/minimal/xui/de/menu_url_inventory.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Url Popup">
- <menu_item_call label="Inventarobjekte anzeigen" name="show_item"/>
- <menu_item_call label="Name in Zwischenablage kopieren" name="url_copy_label"/>
- <menu_item_call label="SLurl in die Zwischenablage kopieren" name="url_copy"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_url_map.xml b/indra/newview/skins/minimal/xui/de/menu_url_map.xml
deleted file mode 100644
index 2f6ffcd450..0000000000
--- a/indra/newview/skins/minimal/xui/de/menu_url_map.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Url Popup">
- <menu_item_call label="Auf Karte zeigen" name="show_on_map"/>
- <menu_item_call label="Zu Position teleportieren" name="teleport_to_location"/>
- <menu_item_call label="SLurl in die Zwischenablage kopieren" name="url_copy"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_url_objectim.xml b/indra/newview/skins/minimal/xui/de/menu_url_objectim.xml
deleted file mode 100644
index 90d3763d9c..0000000000
--- a/indra/newview/skins/minimal/xui/de/menu_url_objectim.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Url Popup">
- <menu_item_call label="Objektinformationen anzeigen" name="show_object"/>
- <menu_item_call label="Auf Karte zeigen" name="show_on_map"/>
- <menu_item_call label="Zu Objekt-Position teleportieren" name="teleport_to_object"/>
- <menu_item_call label="Objektname in Zwischenablage kopieren" name="url_copy_label"/>
- <menu_item_call label="SLurl in die Zwischenablage kopieren" name="url_copy"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_url_parcel.xml b/indra/newview/skins/minimal/xui/de/menu_url_parcel.xml
deleted file mode 100644
index 9169bca24f..0000000000
--- a/indra/newview/skins/minimal/xui/de/menu_url_parcel.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Url Popup">
- <menu_item_call label="Parzelleninformationen anzeigen" name="show_parcel"/>
- <menu_item_call label="Auf Karte zeigen" name="show_on_map"/>
- <menu_item_call label="SLurl in die Zwischenablage kopieren" name="url_copy"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_url_slapp.xml b/indra/newview/skins/minimal/xui/de/menu_url_slapp.xml
deleted file mode 100644
index 72e916b902..0000000000
--- a/indra/newview/skins/minimal/xui/de/menu_url_slapp.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Url Popup">
- <menu_item_call label="Diesen Befehl ausführen" name="run_slapp"/>
- <menu_item_call label="SLurl in die Zwischenablage kopieren" name="url_copy"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_url_slurl.xml b/indra/newview/skins/minimal/xui/de/menu_url_slurl.xml
deleted file mode 100644
index 5d48230ebf..0000000000
--- a/indra/newview/skins/minimal/xui/de/menu_url_slurl.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Url Popup">
- <menu_item_call label="Ortsinformationen anzeigen" name="show_place"/>
- <menu_item_call label="Auf Karte zeigen" name="show_on_map"/>
- <menu_item_call label="Zu Position teleportieren" name="teleport_to_location"/>
- <menu_item_call label="SLurl in die Zwischenablage kopieren" name="url_copy"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_url_teleport.xml b/indra/newview/skins/minimal/xui/de/menu_url_teleport.xml
deleted file mode 100644
index 4cc1ecc70e..0000000000
--- a/indra/newview/skins/minimal/xui/de/menu_url_teleport.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Url Popup">
- <menu_item_call label="An diesen Standort teleportieren" name="teleport"/>
- <menu_item_call label="Auf Karte zeigen" name="show_on_map"/>
- <menu_item_call label="SLurl in die Zwischenablage kopieren" name="url_copy"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_viewer.xml b/indra/newview/skins/minimal/xui/de/menu_viewer.xml
deleted file mode 100644
index 67dc618eb0..0000000000
--- a/indra/newview/skins/minimal/xui/de/menu_viewer.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu_bar name="Main Menu">
- <menu label="Hilfe" name="Help">
- <menu_item_call label="[SECOND_LIFE]-Hilfe" name="Second Life Help"/>
- </menu>
- <menu label="Erweitert" name="Advanced">
- <menu label="Tastaturkürzel" name="Shortcuts">
- <menu_item_check label="Fliegen" name="Fly"/>
- <menu_item_call label="Fenster schließen" name="Close Window"/>
- <menu_item_call label="Alle Fenster schließen" name="Close All Windows"/>
- <menu_item_call label="Ansicht zurücksetzen" name="Reset View"/>
- </menu>
- </menu>
-</menu_bar>
diff --git a/indra/newview/skins/minimal/xui/de/menu_wearable_list_item.xml b/indra/newview/skins/minimal/xui/de/menu_wearable_list_item.xml
deleted file mode 100644
index 283e454a06..0000000000
--- a/indra/newview/skins/minimal/xui/de/menu_wearable_list_item.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Outfit Wearable Context Menu">
- <menu_item_call label="Ersetzen" name="wear_replace"/>
- <menu_item_call label="Anziehen" name="wear_wear"/>
- <menu_item_call label="Hinzufügen" name="wear_add"/>
- <menu_item_call label="Ausziehen / Abnehmen" name="take_off_or_detach"/>
- <menu_item_call label="Abnehmen" name="detach"/>
- <context_menu label="Anhängen an" name="wearable_attach_to"/>
- <context_menu label="An HUD hängen" name="wearable_attach_to_hud"/>
- <menu_item_call label="Ausziehen" name="take_off"/>
- <menu_item_call label="Bearbeiten" name="edit"/>
- <menu_item_call label="Objektprofil" name="object_profile"/>
- <menu_item_call label="Original anzeigen" name="show_original"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_wearing_gear.xml b/indra/newview/skins/minimal/xui/de/menu_wearing_gear.xml
deleted file mode 100644
index 80d4ff4d9f..0000000000
--- a/indra/newview/skins/minimal/xui/de/menu_wearing_gear.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Gear Wearing">
- <menu_item_call label="Outfit bearbeiten" name="edit"/>
- <menu_item_call label="Ausziehen" name="takeoff"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_wearing_tab.xml b/indra/newview/skins/minimal/xui/de/menu_wearing_tab.xml
deleted file mode 100644
index 695451a105..0000000000
--- a/indra/newview/skins/minimal/xui/de/menu_wearing_tab.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Wearing">
- <menu_item_call label="Ausziehen" name="take_off"/>
- <menu_item_call label="Abnehmen" name="detach"/>
- <menu_item_call label="Outfit bearbeiten" name="edit"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/de/notifications.xml b/indra/newview/skins/minimal/xui/de/notifications.xml
deleted file mode 100644
index 195d5105c5..0000000000
--- a/indra/newview/skins/minimal/xui/de/notifications.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<notifications>
- <notification name="UserGiveItem">
- [NAME_SLURL] bietet Ihnen [ITEM_SLURL] an. Zur Verwendung dieses Artikels müssen Sie in den erweiterten Modus umschalten, wo Sie den Artikel in Ihrem Inventar finden werden. Um in den erweiterten Modus umzuschalten, beenden Sie die Anwendung, starten Sie sie neu und ändern Sie die Moduseinstellung auf dem Anmeldebildschirm.
- <form name="form">
- <button name="Show" text="Artikel behalten"/>
- <button name="Discard" text="Artikel ablehnen"/>
- <button name="Mute" text="Benutzer blockieren"/>
- </form>
- </notification>
- <notification name="ObjectGiveItem">
- Ein Objekt namens &lt;nolink&gt;[OBJECTFROMNAME]&lt;/nolink&gt;, das [NAME_SLURL] gehört, bietet Ihnen &lt;nolink&gt;[ITEM_SLURL]&lt;/nolink&gt; an. Zur Verwendung dieses Artikels müssen Sie in den erweiterten Modus umschalten, wo Sie den Artikel in Ihrem Inventar finden werden. Um in den erweiterten Modus zu wechseln, beenden Sie die Anwendung, starten Sie sie neu und ändern Sie die Moduseinstellung auf dem Anmeldebildschirm.
- <form name="form">
- <button name="Keep" text="Artikel behalten"/>
- <button name="Discard" text="Artikel ablehnen"/>
- <button name="Mute" text="Objekt blockieren"/>
- </form>
- </notification>
-</notifications>
diff --git a/indra/newview/skins/minimal/xui/de/panel_adhoc_control_panel.xml b/indra/newview/skins/minimal/xui/de/panel_adhoc_control_panel.xml
deleted file mode 100644
index cc45f42169..0000000000
--- a/indra/newview/skins/minimal/xui/de/panel_adhoc_control_panel.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="panel_im_control_panel">
- <layout_stack name="vertical_stack">
- <layout_panel name="call_btn_panel">
- <button label="Anrufen" name="call_btn"/>
- </layout_panel>
- <layout_panel name="end_call_btn_panel">
- <button label="Anruf beenden" name="end_call_btn"/>
- </layout_panel>
- </layout_stack>
-</panel>
diff --git a/indra/newview/skins/minimal/xui/de/panel_bottomtray.xml b/indra/newview/skins/minimal/xui/de/panel_bottomtray.xml
deleted file mode 100644
index 2278bfb699..0000000000
--- a/indra/newview/skins/minimal/xui/de/panel_bottomtray.xml
+++ /dev/null
@@ -1,45 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="bottom_tray">
- <string name="DragIndicationImageName" value="Accordion_ArrowOpened_Off"/>
- <string name="SpeakBtnToolTip" value="Schaltet Mikrofon ein/aus"/>
- <string name="VoiceControlBtnToolTip" value="Voice-Chat-Steuerung anzeigen/ausblenden"/>
- <layout_stack name="toolbar_stack">
- <layout_panel name="speak_panel">
- <button label="Sprechen" name="speak_btn" tool_tip="Mikrofon ein- und ausschalten"/>
- </layout_panel>
- <layout_panel name="speak_flyout_panel">
- <button label="" name="flyout_btn" tool_tip="Soundeinstellungen ändern"/>
- </layout_panel>
- <layout_panel name="gesture_panel">
- <gesture_combo_list label="Gesten" name="Gesture" tool_tip="Ihren Avatar bestimmte Aktionen durchführen lassen"/>
- </layout_panel>
- <layout_panel name="cam_panel">
- <bottomtray_button label="Ansicht" name="camera_btn" tool_tip="Kamerawinkel steuern"/>
- </layout_panel>
- <layout_panel name="destinations_panel">
- <bottomtray_button label="Ziele" name="destination_btn" tool_tip="Durch Second Life reisen"/>
- </layout_panel>
- <layout_panel name="avatar_panel">
- <bottomtray_button label="Mein Avatar" name="avatar_btn" tool_tip="Eigenes Aussehen verändern"/>
- </layout_panel>
- <layout_panel name="people_panel">
- <bottomtray_button label="Leute" name="show_people_button" tool_tip="Personen in Second Life suchen"/>
- </layout_panel>
- <layout_panel name="profile_panel">
- <bottomtray_button label="Profil" name="show_profile_btn" tool_tip="Eigenes Profil anzeigen und bearbeiten"/>
- </layout_panel>
- <layout_panel name="howto_panel">
- <bottomtray_button label="Anweisungen" name="show_help_btn" tool_tip="Hilfeinfos zu Second Life anzeigen"/>
- </layout_panel>
- <layout_panel name="im_well_panel">
- <chiclet_im_well name="im_well">
- <button name="Unread IM messages" tool_tip="IMs"/>
- </chiclet_im_well>
- </layout_panel>
- <layout_panel name="notification_well_panel">
- <chiclet_notification name="notification_well">
- <button name="Unread" tool_tip="Benachrichtigungen"/>
- </chiclet_notification>
- </layout_panel>
- </layout_stack>
-</panel>
diff --git a/indra/newview/skins/minimal/xui/de/panel_group_control_panel.xml b/indra/newview/skins/minimal/xui/de/panel_group_control_panel.xml
deleted file mode 100644
index 81e6040f84..0000000000
--- a/indra/newview/skins/minimal/xui/de/panel_group_control_panel.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="panel_im_control_panel">
- <layout_stack name="vertical_stack">
- <layout_panel name="end_call_btn_panel">
- <button label="Anruf beenden" name="end_call_btn"/>
- </layout_panel>
- <layout_panel name="voice_ctrls_btn_panel">
- <button label="Voice-Steuerung öffnen" name="voice_ctrls_btn"/>
- </layout_panel>
- </layout_stack>
-</panel>
diff --git a/indra/newview/skins/minimal/xui/de/panel_im_control_panel.xml b/indra/newview/skins/minimal/xui/de/panel_im_control_panel.xml
deleted file mode 100644
index 56c2310f2f..0000000000
--- a/indra/newview/skins/minimal/xui/de/panel_im_control_panel.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="panel_im_control_panel">
- <layout_stack name="button_stack">
- <layout_panel name="view_profile_btn_panel">
- <button label="Profil" name="view_profile_btn"/>
- </layout_panel>
- <layout_panel name="add_friend_btn_panel">
- <button label="Freund hinzufügen" name="add_friend_btn"/>
- </layout_panel>
- <layout_panel name="teleport_btn_panel">
- <button label="Teleportieren" name="teleport_btn" tool_tip="Dieser Person einen Teleport anbieten"/>
- </layout_panel>
- <layout_panel name="call_btn_panel">
- <button label="Anrufen" name="call_btn"/>
- </layout_panel>
- <layout_panel name="end_call_btn_panel">
- <button label="Anruf beenden" name="end_call_btn"/>
- </layout_panel>
- <layout_panel name="block_btn_panel">
- <button label="Ignorieren" name="block_btn"/>
- </layout_panel>
- <layout_panel name="unblock_btn_panel">
- <button label="Freischalten" name="unblock_btn"/>
- </layout_panel>
- <layout_panel name="volume_ctrl_panel">
- <slider name="volume_slider" tool_tip="Anrufvolumen" value="0,5"/>
- </layout_panel>
- </layout_stack>
-</panel>
diff --git a/indra/newview/skins/minimal/xui/de/panel_login.xml b/indra/newview/skins/minimal/xui/de/panel_login.xml
deleted file mode 100644
index 2e82453aab..0000000000
--- a/indra/newview/skins/minimal/xui/de/panel_login.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="panel_login">
- <panel.string name="create_account_url">
- http://de.secondlife.com/registration/
- </panel.string>
- <panel.string name="forgot_password_url">
- http://secondlife.com/account/request.php?lang=de
- </panel.string>
- <layout_stack name="login_widgets">
- <layout_panel name="login">
- <text name="username_text">
- Benutzername:
- </text>
- <combo_box name="username_combo" tool_tip="Bei der Registrierung gewählter Benutzername wie „berndschmidt12“ oder „Liebe Sonne“"/>
- <text name="password_text">
- Kennwort:
- </text>
- <check_box label="Kennwort merken" name="remember_check"/>
- <button label="Anmelden" name="connect_btn"/>
- <text name="mode_selection_text">
- Modus:
- </text>
- <combo_box name="mode_combo" tool_tip="Wählen Sie den gewünschten Modus aus. Basis: schnelles, einfaches Erkunden und Chatten. Erweitert: Zugriff auf zusätzliche Funktionen.">
- <combo_box.item label="Basis" name="Basic"/>
- <combo_box.item label="Erweitert" name="Advanced"/>
- </combo_box>
- </layout_panel>
- <layout_panel name="links">
- <text name="create_new_account_text">
- Registrieren
- </text>
- <text name="forgot_password_text">
- Benutzernamen oder Kennwort vergessen?
- </text>
- <text name="login_help">
- Sie brauchen Hilfe?
- </text>
- </layout_panel>
- </layout_stack>
-</panel>
diff --git a/indra/newview/skins/minimal/xui/de/panel_navigation_bar.xml b/indra/newview/skins/minimal/xui/de/panel_navigation_bar.xml
deleted file mode 100644
index ee1a543aac..0000000000
--- a/indra/newview/skins/minimal/xui/de/panel_navigation_bar.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="navigation_bar">
- <panel name="navigation_panel">
- <pull_button name="back_btn" tool_tip="Zurück zum vorherigen Standort teleportieren"/>
- <pull_button name="forward_btn" tool_tip="Um einen Standort weiter teleportieren"/>
- <button name="home_btn" tool_tip="Zu meinem Zuhause teleportieren"/>
- <location_input label="Standort" name="location_combo"/>
- <search_combo_box label="Suche" name="search_combo_box" tool_tip="Suche">
- <combo_editor label="[SECOND_LIFE] durchsuchen" name="search_combo_editor"/>
- </search_combo_box>
- </panel>
- <favorites_bar name="favorite" tool_tip="Ziehen Sie Landmarken hier hin, damit Sie schnell zu Ihren Lieblingsplätzen in Second Life gelangen können!">
- <label name="favorites_bar_label" tool_tip="Ziehen Sie Landmarken hier hin, damit Sie schnell zu Ihren Lieblingsplätzen in Second Life gelangen können!">
- Favoritenleiste
- </label>
- <chevron_button name="&gt;&gt;" tool_tip="Mehr meiner Favoriten anzeigen"/>
- </favorites_bar>
-</panel>
diff --git a/indra/newview/skins/minimal/xui/de/panel_people.xml b/indra/newview/skins/minimal/xui/de/panel_people.xml
deleted file mode 100644
index 1b6565eb73..0000000000
--- a/indra/newview/skins/minimal/xui/de/panel_people.xml
+++ /dev/null
@@ -1,73 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<!-- Side tray panel -->
-<panel label="Leute" name="people_panel">
- <string name="no_recent_people" value="Sie haben in letzter Zeit mit niemandem interagiert. Suchen Sie nach Leuten, mit denen Sie sich unterhalten können? Klicken Sie unten auf die Schaltfläche „Ziele“."/>
- <string name="no_filtered_recent_people" value="Es gibt keine Leute mit diesem Namen, mit denen Sie in letzter Zeit interagiert haben."/>
- <string name="no_one_near" value="Es ist niemand in der Nähe. Suchen Sie nach Leuten, mit denen Sie sich unterhalten können? Klicken Sie unten auf die Schaltfläche „Ziele“."/>
- <string name="no_one_filtered_near" value="Es ist niemand mit diesem Namen in der Nähe."/>
- <string name="no_friends_online" value="Keine Freunde online"/>
- <string name="no_friends" value="Keine Freunde"/>
- <string name="no_friends_msg">
- Klicken Sie mit der rechten Maustaste auf einen Einwohner, um ihn als Freund hinzuzufügen. Suchen Sie nach Leuten, mit denen Sie sich unterhalten können? Klicken Sie unten auf die Schaltfläche „Ziele“.
- </string>
- <string name="no_filtered_friends_msg">
- Sie haben nicht das Richtige gefunden? Klicken Sie unten auf die Schaltfläche „Ziele“.
- </string>
- <string name="people_filter_label" value="Nach Leuten filtern"/>
- <string name="groups_filter_label" value="Nach Gruppen filtern"/>
- <string name="no_filtered_groups_msg" value="Sie haben nicht das Richtige gefunden? Versuchen Sie es mit der [secondlife:///app/search/groups/[SEARCH_TERM] Suche]."/>
- <string name="no_groups_msg" value="Suchen Sie nach Gruppen? Versuchen Sie es mit der [secondlife:///app/search/groups Suche]."/>
- <string name="MiniMapToolTipMsg" value="[REGION](Doppelklicken, um Karte zu öffnen; Umschalttaste gedrückt halten und ziehen, um zu schwenken)"/>
- <string name="AltMiniMapToolTipMsg" value="[REGION](Doppelklicken, um zu teleportieren; Umschalttaste gedrückt halten und ziehen, um zu schwenken)"/>
- <filter_editor label="Filter" name="filter_input"/>
- <tab_container name="tabs">
- <panel label="IN DER NÄHE" name="nearby_panel">
- <panel label="bottom_panel" name="bottom_panel"/>
- </panel>
- <panel label="MEINE FREUNDE" name="friends_panel">
- <accordion name="friends_accordion">
- <accordion_tab name="tab_online" title="Online"/>
- <accordion_tab name="tab_all" title="Alle"/>
- </accordion>
- <panel label="bottom_panel" name="bottom_panel">
- <layout_stack name="bottom_panel">
- <layout_panel name="trash_btn_panel">
- <dnd_button name="del_btn" tool_tip="Ausgewählte Person aus Ihrer Freundesliste entfernen"/>
- </layout_panel>
- </layout_stack>
- </panel>
- </panel>
- <panel label="AKTUELL" name="recent_panel">
- <panel label="bottom_panel" name="bottom_panel">
- <button name="add_friend_btn" tool_tip="Ausgewählten Einwohner zur Freundeliste hinzufügen"/>
- </panel>
- </panel>
- </tab_container>
- <panel name="button_bar">
- <layout_stack name="bottom_bar_ls">
- <layout_panel name="view_profile_btn_lp">
- <button label="Profil" name="view_profile_btn" tool_tip="Bilder, Gruppen und andere Einwohner-Informationen anzeigen"/>
- </layout_panel>
- <layout_panel name="im_btn_lp">
- <button label="IM" name="im_btn" tool_tip="IM-Sitzung öffnen"/>
- </layout_panel>
- <layout_panel name="call_btn_lp">
- <button label="Anrufen" name="call_btn" tool_tip="Diesen Einwohner anrufen"/>
- </layout_panel>
- <layout_panel name="teleport_btn_lp">
- <button label="Teleportieren" name="teleport_btn" tool_tip="Teleport anbieten"/>
- </layout_panel>
- </layout_stack>
- <layout_stack name="bottom_bar_ls1">
- <layout_panel name="group_info_btn_lp">
- <button label="Gruppenprofil" name="group_info_btn" tool_tip="Gruppeninformationen anzeigen"/>
- </layout_panel>
- <layout_panel name="chat_btn_lp">
- <button label="Gruppen-Chat" name="chat_btn" tool_tip="Chat öffnen"/>
- </layout_panel>
- <layout_panel name="group_call_btn_lp">
- <button label="Gruppe anrufen" name="group_call_btn" tool_tip="Diese Gruppe anrufen"/>
- </layout_panel>
- </layout_stack>
- </panel>
-</panel>
diff --git a/indra/newview/skins/minimal/xui/de/panel_side_tray_tab_caption.xml b/indra/newview/skins/minimal/xui/de/panel_side_tray_tab_caption.xml
deleted file mode 100644
index 652fb7c836..0000000000
--- a/indra/newview/skins/minimal/xui/de/panel_side_tray_tab_caption.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="sidetray_tab_panel">
- <text name="sidetray_tab_title" value="Klappmenü??"/>
- <button name="undock" tool_tip="Abkoppeln"/>
- <button name="dock" tool_tip="Andocken"/>
- <button name="show_help" tool_tip="Hilfe anzeigen"/>
-</panel>
diff --git a/indra/newview/skins/minimal/xui/de/panel_status_bar.xml b/indra/newview/skins/minimal/xui/de/panel_status_bar.xml
deleted file mode 100644
index 2f8dc938c5..0000000000
--- a/indra/newview/skins/minimal/xui/de/panel_status_bar.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="status">
- <panel.string name="packet_loss_tooltip">
- Paketverlust
- </panel.string>
- <panel.string name="bandwidth_tooltip">
- Bandbreite
- </panel.string>
- <panel.string name="time">
- [hour12, datetime, slt]:[min, datetime, slt] [ampm, datetime, slt] [timezone,datetime, slt]
- </panel.string>
- <panel.string name="timeTooltip">
- [weekday, datetime, slt], [day, datetime, slt] [month, datetime, slt] [year, datetime, slt]
- </panel.string>
- <panel.string name="buycurrencylabel">
- [AMT] L$
- </panel.string>
- <combo_box name="mode_combo" tool_tip="Wählen Sie den gewünschten Modus aus. Basismodus: Second Life schnell und einfach erkunden und chatten. Erweiterter Modus: Zugriff auf zusätzliche Funktionen.">
- <combo_box.item label="Basismodus" name="Basic"/>
- <combo_box.item label="Erweiterter Modus" name="Advanced"/>
- </combo_box>
- <button name="media_toggle_btn" tool_tip="Alle Medien starten/stoppen (Musik, Video, Webseiten)"/>
- <button name="volume_btn" tool_tip="Steuerung der Gesamtlautstärke"/>
-</panel>
diff --git a/indra/newview/skins/minimal/xui/en/floater_camera.xml b/indra/newview/skins/minimal/xui/en/floater_camera.xml
deleted file mode 100644
index 4cf792444f..0000000000
--- a/indra/newview/skins/minimal/xui/en/floater_camera.xml
+++ /dev/null
@@ -1,284 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater
- legacy_header_height="18"
- can_dock="true"
- can_minimize="true"
- can_close="false"
- follows="bottom"
- height="164"
- layout="topleft"
- name="camera_floater"
- save_rect="true"
- save_visibility="true"
- save_dock_state="true"
- single_instance="true"
- width="228">
- <floater.string
- name="rotate_tooltip">
- Rotate Camera Around Focus
- </floater.string>
- <floater.string
- name="zoom_tooltip">
- Zoom Camera Towards Focus
- </floater.string>
- <floater.string
- name="move_tooltip">
- Move Camera Up and Down, Left and Right
- </floater.string>
- <floater.string
- name="camera_modes_title">
- Camera modes
- </floater.string>
- <floater.string
- name="pan_mode_title">
- Orbit Zoom Pan
- </floater.string>
- <floater.string
- name="presets_mode_title">
- Preset Views
- </floater.string>
- <floater.string
- name="free_mode_title">
- View Object
- </floater.string>
- <panel
- border="false"
- height="123"
- layout="topleft"
- left="2"
- top="0"
- mouse_opaque="false"
- name="controls"
- width="226">
- <panel
- color="Transparent"
- follows="all"
- height="102"
- layout="topleft"
- left="8"
- name="preset_views_list"
- opaque="true"
- top="24"
- width="212"
- visible="false">
- <panel_camera_item
- name="front_view">
- <panel_camera_item.mousedown_callback
- function="CameraPresets.ChangeView"
- parameter="front_view" />
- <panel_camera_item.picture
- image_name="Cam_Preset_Front_Off" />
- <panel_camera_item.selected_picture
- image_name="Cam_Preset_Front_On" />
- <panel_camera_item.text
- name="front_view_text">
- Front View
- </panel_camera_item.text>
- </panel_camera_item>
- <panel_camera_item
- name="group_view"
- top_pad="4">
- <panel_camera_item.mousedown_callback
- function="CameraPresets.ChangeView"
- parameter="group_view" />
- <panel_camera_item.picture
- image_name="Cam_Preset_Side_Off" />
- <panel_camera_item.selected_picture
- image_name="Cam_Preset_Side_On" />
- <panel_camera_item.text
- name="side_view_text">
- Side View
- </panel_camera_item.text>
- </panel_camera_item>
- <panel_camera_item
- name="rear_view"
- layout="topleft"
- top_pad="4">
- <panel_camera_item.mousedown_callback
- function="CameraPresets.ChangeView"
- parameter="rear_view" />
- <panel_camera_item.picture
- image_name="Cam_Preset_Back_Off" />
- <panel_camera_item.selected_picture
- image_name="Cam_Preset_Back_On" />
- <panel_camera_item.text
- name="rear_view_text">
- Rear View
- </panel_camera_item.text>
- </panel_camera_item>
- </panel>
- <panel
- color="Transparent"
- follows="all"
- height="68"
- item_pad="4"
- layout="topleft"
- left="8"
- name="camera_modes_list"
- opaque="true"
- top="24"
- width="212"
- visible="false">
- <panel_camera_item
- name="object_view">
- <panel_camera_item.mousedown_callback
- function="CameraPresets.ChangeView"
- parameter="object_view" />
- <panel_camera_item.text
- name="object_view_text">
- Object View
- </panel_camera_item.text>
- <panel_camera_item.picture
- image_name="Object_View_Off" />
- <panel_camera_item.selected_picture
- image_name="Object_View_On" />
- </panel_camera_item>
- <panel_camera_item
- name="mouselook_view"
- layout="topleft">
- <panel_camera_item.mousedown_callback
- function="CameraPresets.ChangeView"
- parameter="mouselook_view" />
- <panel_camera_item.text
- name="mouselook_view_text">
- Mouselook View
- </panel_camera_item.text>
- <panel_camera_item.picture
- image_name="MouseLook_View_Off" />
- <panel_camera_item.selected_picture
- image_name="MouseLook_View_On" />
- </panel_camera_item>
- </panel>
- <!--TODO: replace + - images -->
- <panel
- border="false"
- class="camera_zoom_panel"
- height="114"
- layout="topleft"
- left="0"
- mouse_opaque="false"
- name="zoom"
- top="20"
- width="226">
- <joystick_rotate
- follows="top|left"
- height="78"
- image_selected="Cam_Rotate_In"
- image_unselected="Cam_Rotate_Out"
- layout="topleft"
- left="7"
- mouse_opaque="false"
- name="cam_rotate_stick"
- quadrant="left"
- scale_image="false"
- sound_flags="3"
- visible="true"
- tool_tip="Orbit camera around focus"
- top="20"
- width="78">
- <commit_callback
- function="Camera.rotate" />
- <mouse_held_callback
- function="Camera.rotate" />
- </joystick_rotate>
- <button
- follows="top|left"
- height="18"
- image_disabled="AddItem_Disabled"
- image_selected="AddItem_Press"
- image_unselected="AddItem_Off"
- layout="topleft"
- left_pad="14"
- name="zoom_plus_btn"
- width="18"
- top="18">
- <commit_callback
- function="Zoom.plus" />
- <mouse_held_callback
- function="Zoom.plus" />
- </button>
- <slider_bar
- height="50"
- layout="topleft"
- name="zoom_slider"
- 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>
- <button
- follows="top|left"
- height="18"
- image_disabled="MinusItem_Disabled"
- image_selected="MinusItem_Press"
- image_unselected="MinusItem_Off"
- layout="topleft"
- name="zoom_minus_btn"
- top_pad="0"
- width="18">
- <commit_callback
- function="Zoom.minus" />
- <mouse_held_callback
- function="Zoom.minus" />
- </button>
- <joystick_track
- follows="top|left"
- height="78"
- image_selected="Cam_Tracking_In"
- image_unselected="Cam_Tracking_Out"
- layout="topleft"
- left="133"
- name="cam_track_stick"
- quadrant="left"
- scale_image="false"
- sound_flags="3"
- tool_tip="Move camera up and down, left and right"
- top="20"
- width="78">
- <commit_callback
- function="Camera.track" />
- <mouse_held_callback
- function="Camera.track" />
- </joystick_track>
- </panel>
- </panel>
- <panel
- border="false"
- height="42"
- layout="topleft"
- left="2"
- top_pad="0"
- name="buttons"
- width="226">
- <button
- height="23"
- label=""
- layout="topleft"
- left="83"
- is_toggle="true"
- image_overlay="Cam_Avatar_Off"
- image_selected="PushButton_Selected_Press"
- name="presets_btn"
- tab_stop="false"
- tool_tip="Preset Views"
- top="13"
- width="25">
- </button>
- <button
- height="23"
- label=""
- layout="topleft"
- left_pad="1"
- is_toggle="true"
- image_overlay="PanOrbit_Off"
- image_selected="PushButton_Selected_Press"
- name="pan_btn"
- tab_stop="false"
- tool_tip="Orbit Zoom Pan"
- width="25">
- </button>
- </panel>
-</floater>
diff --git a/indra/newview/skins/minimal/xui/en/floater_help_browser.xml b/indra/newview/skins/minimal/xui/en/floater_help_browser.xml
deleted file mode 100644
index 477f210352..0000000000
--- a/indra/newview/skins/minimal/xui/en/floater_help_browser.xml
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater
- legacy_header_height="18"
- can_resize="true"
- can_minimize="false"
- height="460"
- layout="topleft"
- min_height="360"
- left="10000"
- top="10"
- min_width="335"
- name="floater_help_browser"
- single_instance="true"
- title="HOW TO"
- width="335">
- <floater.string
- name="loading_text">
- Loading...
- </floater.string>
- <floater.string
- name="done_text">
- </floater.string>
- <layout_stack
- bottom="460"
- follows="left|right|top|bottom"
- layout="topleft"
- left="5"
- orientation="vertical"
- name="stack1"
- top="20"
- width="325">
- <layout_panel
- layout="topleft"
- left_delta="0"
- top_delta="0"
- name="external_controls"
- user_resize="false"
- width="325">
- <web_browser
- trusted_content="true"
- bottom="-5"
- follows="left|right|top|bottom"
- layout="topleft"
- left="0"
- name="browser"
- top="0"
- height="300"
- width="325" />
- </layout_panel>
- </layout_stack>
-</floater>
diff --git a/indra/newview/skins/minimal/xui/en/floater_media_browser.xml b/indra/newview/skins/minimal/xui/en/floater_media_browser.xml
deleted file mode 100644
index 4862146c94..0000000000
--- a/indra/newview/skins/minimal/xui/en/floater_media_browser.xml
+++ /dev/null
@@ -1,242 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater
- legacy_header_height="18"
- can_resize="true"
- height="440"
- layout="topleft"
- min_height="140"
- min_width="467"
- name="floater_about"
- save_rect="true"
- auto_tile="true"
- title="MEDIA BROWSER"
- width="820">
- <floater.string
- name="home_page_url">
- http://www.secondlife.com
- </floater.string>
- <floater.string
- name="support_page_url">
- http://support.secondlife.com
- </floater.string>
- <layout_stack
- bottom="440"
- follows="left|right|top|bottom"
- layout="topleft"
- left="10"
- name="stack1"
- orientation="vertical"
- top="20"
- width="800">
- <layout_panel
- auto_resize="false"
- default_tab_group="1"
- height="20"
- layout="topleft"
- left="0"
- min_height="20"
- name="nav_controls"
- top="400"
- user_resize="false"
- width="800">
- <button
- follows="left|top"
- height="20"
- label="Back"
- layout="topleft"
- left="0"
- name="back"
- top="0"
- width="55">
- <button.commit_callback
- function="MediaBrowser.Back" />
- </button>
- <button
- follows="left|top"
- height="20"
- label="Forward"
- layout="topleft"
- left_pad="3"
- name="forward"
- top_delta="0"
- width="68">
- <button.commit_callback
- function="MediaBrowser.Forward" />
- </button>
- <button
- enabled="false"
- follows="left|top"
- height="20"
- label="Reload"
- layout="topleft"
- left_pad="2"
- name="reload"
- top_delta="0"
- width="70">
- <button.commit_callback
- function="MediaBrowser.Refresh" />
- </button>
- <combo_box
- allow_text_entry="true"
- follows="left|top|right"
- tab_group="1"
- height="20"
- layout="topleft"
- left_pad="5"
- max_chars="1024"
- name="address"
- combo_editor.select_on_focus="true"
- top_delta="0"
- width="540">
- <combo_box.commit_callback
- function="MediaBrowser.EnterAddress" />
- </combo_box>
- <button
- enabled="false"
- follows="right|top"
- height="20"
- label="Go"
- layout="topleft"
- left_pad="5"
- name="go"
- top_delta="0"
- width="50">
- <button.commit_callback
- function="MediaBrowser.Go" />
- </button>
- </layout_panel>
- <layout_panel
- auto_resize="false"
- height="20"
- layout="topleft"
- left_delta="0"
- min_height="20"
- name="time_controls"
- top_delta="0"
- user_resize="false"
- width="800">
- <button
- follows="left|top"
- height="20"
- label="rewind"
- layout="topleft"
- left="0"
- name="rewind"
- top="0"
- width="55" />
- <button
- follows="left|top"
- height="20"
- image_selected="button_anim_play_selected.tga"
- image_unselected="button_anim_play.tga"
- layout="topleft"
- left_delta="55"
- name="play"
- top_delta="0"
- width="55" />
- <button
- follows="left|top"
- height="20"
- image_selected="button_anim_pause_selected.tga"
- image_unselected="button_anim_pause.tga"
- layout="topleft"
- left_delta="0"
- name="pause"
- top_delta="0"
- width="55" />
- <button
- follows="left|top"
- height="20"
- label="stop"
- layout="topleft"
- left_pad="10"
- name="stop"
- top_delta="0"
- width="55" />
- <button
- follows="left|top"
- height="20"
- label="forward"
- layout="topleft"
- left_pad="20"
- name="seek"
- top_delta="0"
- width="55" />
- </layout_panel>
- <layout_panel
- auto_resize="false"
- height="20"
- layout="topleft"
- left_delta="0"
- min_height="20"
- name="parcel_owner_controls"
- top_delta="0"
- user_resize="false"
- width="540">
- <button
- enabled="false"
- follows="left|top"
- height="20"
- label="Send Current Page to Parcel"
- layout="topleft"
- left="0"
- name="assign"
- top="0"
- width="200">
- <button.commit_callback
- function="MediaBrowser.Assign" />
- </button>
- </layout_panel>
- <layout_panel
- height="40"
- layout="topleft"
- left_delta="0"
- name="external_controls"
- top_delta="0"
- user_resize="false"
- width="540">
- <web_browser
- bottom="-30"
- follows="all"
- layout="topleft"
- left="0"
- name="browser"
- top="0"
- width="540" />
- <button
- follows="bottom|left"
- height="20"
- label="Open in My Web Browser"
- layout="topleft"
- left_delta="0"
- name="open_browser"
- top_pad="5"
- width="185">
- <button.commit_callback
- function="MediaBrowser.OpenWebBrowser" />
- </button>
- <check_box
- control_name="UseExternalBrowser"
- follows="bottom|left"
- height="20"
- label="Always open in my web browser"
- layout="topleft"
- left_pad="5"
- name="open_always"
- top_delta="0"
- width="200" />
- <button
- follows="bottom|right"
- height="20"
- label="Close"
- layout="topleft"
- left_pad="80"
- name="close"
- top_delta="0"
- width="70">
- <button.commit_callback
- function="MediaBrowser.Close" />
- </button>
- </layout_panel>
- </layout_stack>
-</floater>
diff --git a/indra/newview/skins/minimal/xui/en/floater_nearby_chat.xml b/indra/newview/skins/minimal/xui/en/floater_nearby_chat.xml
deleted file mode 100644
index 74ac885202..0000000000
--- a/indra/newview/skins/minimal/xui/en/floater_nearby_chat.xml
+++ /dev/null
@@ -1,52 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater
- border_visible="false"
- border="false"
- bg_opaque_image="Window_Foreground"
- bg_alpha_image="Window_Background"
- bg_alpha_image_overlay="DkGray_66"
- legacy_header_height="18"
- can_minimize="true"
- can_tear_off="false"
- can_resize="true"
- can_drag_on_left="false"
- can_close="false"
- can_dock="true"
- bevel_style="in"
- height="300"
- min_width="235"
- layout="topleft"
- name="nearby_chat"
- save_rect="true"
- title="NEARBY CHAT"
- save_dock_state="true"
- save_visibility="true"
- single_instance="true"
- width="320">
- <check_box
- bottom_delta="36"
- control_name="TranslateChat"
- enabled="true"
- height="16"
- label="Translate chat (powered by Google)"
- layout="topleft"
- left="5"
- name="translate_chat_checkbox"
- width="230" />
- <chat_history
- parse_urls="true"
- bg_readonly_color="ChatHistoryBgColor"
- bg_writeable_color="ChatHistoryBgColor"
- follows="all"
- left="5"
- top_delta="17"
- layout="topleft"
- height="260"
- name="chat_history"
- parse_highlights="true"
- text_color="ChatHistoryTextColor"
- text_readonly_color="ChatHistoryTextColor"
- right_widget_pad="5"
- left_widget_pad="0"
- width="315" />
-</floater>
diff --git a/indra/newview/skins/minimal/xui/en/floater_side_bar_tab.xml b/indra/newview/skins/minimal/xui/en/floater_side_bar_tab.xml
deleted file mode 100644
index 83b1260620..0000000000
--- a/indra/newview/skins/minimal/xui/en/floater_side_bar_tab.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<floater
- can_close="true"
- can_resize="true"
- min_width="333"
- min_height="440"
- save_rect="true"
- save_visibility="true"
- >
-</floater>
diff --git a/indra/newview/skins/minimal/xui/en/floater_web_content.xml b/indra/newview/skins/minimal/xui/en/floater_web_content.xml
deleted file mode 100644
index 1d9a967d5a..0000000000
--- a/indra/newview/skins/minimal/xui/en/floater_web_content.xml
+++ /dev/null
@@ -1,196 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater
- legacy_header_height="18"
- can_resize="true"
- height="775"
- layout="topleft"
- min_height="400"
- min_width="500"
- name="floater_web_content"
- save_rect="true"
- auto_tile="true"
- title=""
- initial_mime_type="text/html"
- width="780">
- <layout_stack
- bottom="775"
- follows="left|right|top|bottom"
- layout="topleft"
- left="5"
- animate="false"
- name="stack1"
- orientation="vertical"
- top="20"
- width="770">
- <layout_panel
- auto_resize="false"
- default_tab_group="1"
- height="22"
- layout="topleft"
- left="0"
- min_height="20"
- name="nav_controls"
- top="400"
- user_resize="false"
- width="770">
- <button
- image_overlay="Arrow_Left_Off"
- image_disabled="PushButton_Disabled"
- image_disabled_selected="PushButton_Disabled"
- image_selected="PushButton_Selected"
- image_unselected="PushButton_Off"
- hover_glow_amount="0.15"
- tool_tip="Navigate back"
- follows="left|top"
- height="22"
- layout="topleft"
- left="1"
- name="back"
- top="0"
- width="22">
- <button.commit_callback
- function="WebContent.Back" />
- </button>
- <button
- image_overlay="Arrow_Right_Off"
- image_disabled="PushButton_Disabled"
- image_disabled_selected="PushButton_Disabled"
- image_selected="PushButton_Selected"
- image_unselected="PushButton_Off"
- tool_tip="Navigate forward"
- follows="left|top"
- height="22"
- layout="topleft"
- left="27"
- name="forward"
- top_delta="0"
- width="22">
- <button.commit_callback
- function="WebContent.Forward" />
- </button>
- <button
- image_overlay="Stop_Off"
- image_disabled="PushButton_Disabled"
- image_disabled_selected="PushButton_Disabled"
- image_selected="PushButton_Selected"
- image_unselected="PushButton_Off"
- tool_tip="Stop navigation"
- enabled="true"
- follows="left|top"
- height="22"
- layout="topleft"
- left="51"
- name="stop"
- top_delta="0"
- width="22">
- <button.commit_callback
- function="WebContent.Stop" />
- </button>
- <button
- image_overlay="Refresh_Off"
- image_disabled="PushButton_Disabled"
- image_disabled_selected="PushButton_Disabled"
- image_selected="PushButton_Selected"
- image_unselected="PushButton_Off"
- tool_tip="Reload page"
- follows="left|top"
- height="22"
- layout="topleft"
- left="51"
- name="reload"
- top_delta="0"
- width="22">
- <button.commit_callback
- function="WebContent.Reload" />
- </button>
- <combo_box
- allow_text_entry="true"
- follows="left|top|right"
- tab_group="1"
- height="22"
- layout="topleft"
- left_pad="4"
- max_chars="1024"
- name="address"
- combo_editor.select_on_focus="true"
- tool_tip="Enter URL here"
- top_delta="0"
- width="672">
- <combo_box.commit_callback
- function="WebContent.EnterAddress" />
- </combo_box>
- <icon
- name="media_secure_lock_flag"
- height="16"
- follows="top|right"
- image_name="Lock2"
- layout="topleft"
- left_delta="620"
- top_delta="2"
- visible="false"
- tool_tip="Secured Browsing"
- width="16" />
- <button
- image_overlay="ExternalBrowser_Off"
- image_disabled="PushButton_Disabled"
- image_disabled_selected="PushButton_Disabled"
- image_selected="PushButton_Selected"
- image_unselected="PushButton_Off"
- tool_tip="Open current URL in your desktop browser"
- follows="right|top"
- enabled="true"
- height="22"
- layout="topleft"
- name="popexternal"
- right="770"
- top_delta="-2"
- width="22">
- <button.commit_callback
- function="WebContent.PopExternal" />
- </button>
- </layout_panel>
- <layout_panel
- height="40"
- layout="topleft"
- left_delta="0"
- name="external_controls"
- top_delta="0"
- user_resize="false"
- auto_resize="true"
- width="585">
- <web_browser
- bottom="-2"
- follows="all"
- layout="topleft"
- left="0"
- name="webbrowser"
- top="0"/>
- </layout_panel>
- <layout_panel name="status_bar"
- height="23"
- auto_resize="false"
- user_resize="false">
- <text
- type="string"
- length="200"
- follows="bottom|left"
- height="20"
- layout="topleft"
- left_delta="0"
- name="statusbartext"
- parse_urls="false"
- text_color="0.4 0.4 0.4 1"
- top_pad="3"
- width="495"/>
- <progress_bar
- color_bar="0.3 1.0 0.3 1"
- follows="bottom|right"
- height="16"
- top_delta="-1"
- left_pad="24"
- layout="topleft"
- name="statusbarprogress"
- width="64"/>
- </layout_panel>
- </layout_stack>
-</floater>
diff --git a/indra/newview/skins/minimal/xui/en/inspect_avatar.xml b/indra/newview/skins/minimal/xui/en/inspect_avatar.xml
deleted file mode 100644
index 853d5f8735..0000000000
--- a/indra/newview/skins/minimal/xui/en/inspect_avatar.xml
+++ /dev/null
@@ -1,206 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<!--
- Not can_close / no title to avoid window chrome
- Single instance - only have one at a time, recycle it each spawn
--->
-<floater
- legacy_header_height="25"
- bevel_style="in"
- bg_opaque_image="Inspector_Background"
- can_close="false"
- can_minimize="false"
- height="164"
- layout="topleft"
- name="inspect_avatar"
- single_instance="true"
- sound_flags="0"
- visible="true"
- width="245">
- <!-- Allowed fields include:
- [BORN_ON] ("12/3/2008")
- [SL_PROFILE] (Second Life profile),
- [RW_PROFILE] (real world profile),
- [ACCTTYPE] ("Resident"),
- [PAYMENTINFO] ("Payment Info on File"),
- [AGE] ("1 year 2 months")
- -->
- <string
- name="Subtitle">
-[AGE]
- </string>
- <string
- name="Details">
-[SL_PROFILE]
- </string>
- <text
- follows="top|left"
- font="SansSerif"
- height="20"
- left="8"
- name="user_name_small"
- top="7"
- text_color="White"
- use_ellipses="true"
- word_wrap="true"
- visible="false"
- value="Grumpity ProductEngine with a long name"
- width="185" />
- <text
- follows="top|left"
- font="SansSerifBigLarge"
- height="21"
- left="8"
- name="user_name"
- top="10"
- text_color="White"
- use_ellipses="true"
- value="Grumpity ProductEngine"
- width="190" />
- <text
- follows="top|left"
- height="16"
- left="8"
- name="user_slid"
- font="SansSerifSmallBold"
- text_color="EmphasisColor"
- value="james.linden"
- width="185"
- use_ellipses="true" />
- <text
- follows="top|left"
- height="16"
- left="8"
- name="user_subtitle"
- font="SansSerifSmall"
- text_color="White"
- top_pad="0"
- value="11 Months, 3 days old"
- width="175"
- use_ellipses="true" />
- <text
- follows="left|top|right"
- height="35"
- left="8"
- name="user_details"
- right="-10"
- word_wrap="true"
- top_pad="4"
- use_ellipses="true"
- width="220">This is my second life description and I really think it is great. But for some reason my description is super extra long because I like to talk a whole lot
- </text>
- <slider
- follows="top|left"
- height="23"
- increment="0.01"
- left="1"
- max_val="0.95"
- min_val="0.05"
- name="volume_slider"
- show_text="false"
- tool_tip="Voice volume"
- top_pad="0"
- value="0.5"
- width="200" />
- <button
- follows="top|left"
- height="16"
- image_disabled="Audio_Off"
- image_disabled_selected="AudioMute_Off"
- image_hover_selected="AudioMute_Over"
- image_selected="AudioMute_Off"
- image_unselected="Audio_Off"
- is_toggle="true"
- left_pad="0"
- top_delta="4"
- name="mute_btn"
- width="16" />
- <avatar_icon
- follows="top|left"
- height="38"
- right="-10"
- bevel_style="in"
- border_style="line"
- mouse_opaque="true"
- name="avatar_icon"
- top="10"
- width="38" />
-<!-- Overlapping buttons for default actions
- llinspectavatar.cpp makes visible the most likely default action
--->
- <button
- follows="top|left"
- height="20"
- label="Add Friend"
- left="8"
- top="135"
- name="add_friend_btn"
- width="90" />
- <button
- follows="top|left"
- height="20"
- label="IM"
- left_delta="0"
- top_delta="0"
- name="im_btn"
- width="80"
- commit_callback.function="InspectAvatar.IM"/>
- <button
- follows="top|left"
- height="20"
- label="Profile"
- layout="topleft"
- name="view_profile_btn"
- left_delta="96"
- top_delta="0"
- tab_stop="false"
- width="80" />
- <!-- gear buttons here -->
- <menu_button
- follows="top|left"
- height="20"
- layout="topleft"
- image_overlay="OptionsMenu_Off"
- menu_filename="menu_inspect_avatar_gear.xml"
- name="gear_btn"
- right="-5"
- top_delta="0"
- width="35" />
- <menu_button
- follows="top|left"
- height="20"
- image_overlay="OptionsMenu_Off"
- menu_filename="menu_inspect_self_gear.xml"
- name="gear_self_btn"
- right="-5"
- top_delta="0"
- width="35" />
- <panel
- follows="top|left"
- top="164"
- left="0"
- height="60"
- width="228"
- visible="false"
- background_visible="true"
- name="moderator_panel"
- background_opaque="true"
- bg_opaque_color="MouseGray">
- <button
- name="disable_voice"
- label="Disable Voice"
- top="20"
- width="95"
- height="20"
- left="10"
- commit_callback.function="InspectAvatar.DisableVoice"/>
- <button
- name="enable_voice"
- label="Enable Voice"
- top="20"
- width="95"
- height="20"
- left="10"
- visible="false"
- commit_callback.function="InspectAvatar.EnableVoice"/>
- </panel>
-</floater>
diff --git a/indra/newview/skins/minimal/xui/en/inspect_object.xml b/indra/newview/skins/minimal/xui/en/inspect_object.xml
deleted file mode 100644
index f424069ec6..0000000000
--- a/indra/newview/skins/minimal/xui/en/inspect_object.xml
+++ /dev/null
@@ -1,144 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<!--
- Not can_close / no title to avoid window chrome
- Single instance - only have one at a time, recycle it each spawn
--->
-<floater
- legacy_header_height="25"
- bevel_style="in"
- bg_opaque_image="Inspector_Background"
- can_close="false"
- can_minimize="false"
- height="150"
- layout="topleft"
- name="inspect_object"
- single_instance="true"
- sound_flags="0"
- visible="true"
- width="228">
- <string name="Creator">By [CREATOR]</string>
- <string name="CreatorAndOwner">
-By [CREATOR]
-Owner [OWNER]
- </string>
- <string name="Price">L$[AMOUNT]</string>
- <string name="PriceFree">Free!</string>
- <string name="Touch">Touch</string>
- <string name="Sit">Sit</string>
- <text
- parse_urls="false"
- follows="all"
- font="SansSerifLarge"
- height="30"
- left="8"
- name="object_name"
- text_color="White"
- top="6"
- use_ellipses="true"
- word_wrap="true"
- width="220" />
- <text
- follows="all"
- height="50"
- left="8"
- name="object_creator"
- top_pad="6"
- use_ellipses="true"
- width="220">
- by secondlife:///app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/about
-owner secondlife:///app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/about
- </text>
- <text
- follows="all"
- font="SansSerifSmall"
- font.style="BOLD"
- height="14"
- halign="right"
- right="-5"
- name="price_text"
- text_color="white"
- top="60"
- font_shadow="none"
- width="60">
-L$30,000
- </text>
- <text
- clip_partial="true"
- follows="all"
- font="SansSerifSmall"
- height="25"
- left="8"
- name="object_description"
- top="76"
- use_ellipses="true"
- width="220"
- word_wrap="true">
- </text>
- <!-- Overlapping buttons for all default actions. Show "Buy" if
- for sale, "Sit" if can sit, etc. -->
- <icon
- name="secure_browsing"
- image_name="Lock"
- left="0"
- visible="false"
- width="18"
- height="18"
- top="103"
- tool_tip="Secure Browsing"
- follows="left|top" />
- <text
- follows="all"
- font="SansSerifSmall"
- height="13"
- name="object_media_url"
- width="207"
- left_pad="2"
- top_delta="0"
- max_length = "50"
- use_ellipses="true">
- http://www.superdupertest.com
-</text>
- <button
- follows="top|left"
- height="20"
- label="Take Copy"
- left_delta="0"
- name="take_free_copy_btn"
- top_delta="0"
- width="80" />
- <button
- follows="top|left"
- height="20"
- label="Touch"
- left_delta="0"
- name="touch_btn"
- top_delta="0"
- width="80" />
- <button
- follows="top|left"
- height="20"
- label="Sit"
- left_delta="0"
- name="sit_btn"
- top_delta="0"
- width="80" />
- <button
- follows="top|left"
- height="20"
- label="Open"
- left_delta="0"
- name="open_btn"
- top_delta="0"
- width="80" />
-
- <!-- non-overlapping buttons here -->
- <menu_button
- follows="top|left"
- height="20"
- image_overlay="OptionsMenu_Off"
- menu_filename="menu_inspect_object_gear.xml"
- name="gear_btn"
- right="-5"
- top_delta="0"
- width="35" />
-</floater>
diff --git a/indra/newview/skins/minimal/xui/en/main_view.xml b/indra/newview/skins/minimal/xui/en/main_view.xml
deleted file mode 100644
index 0ce6cbc984..0000000000
--- a/indra/newview/skins/minimal/xui/en/main_view.xml
+++ /dev/null
@@ -1,269 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<panel
- follows="left|right|top|bottom"
- height="768"
- layout="topleft"
- left="0"
- mouse_opaque="false"
- tab_stop="false"
- name="main_view"
- width="1024">
- <panel top="0"
- follows="all"
- height="768"
- mouse_opaque="false"
- name="login_panel_holder"
- width="1024"/>
-
- <layout_stack border_size="0"
- follows="all"
- mouse_opaque="false"
- height="768"
- name="menu_stack"
- orientation="vertical"
- top="0">
- <layout_panel auto_resize="false"
- height="30"
- mouse_opaque="false"
- name="nav_bar_container"
- tab_stop="false"
- min_height="0"
- width="1024"
- user_resize="false"
- visible="true">
- </layout_panel>
- <layout_panel auto_resize="true"
- follows="all"
- height="500"
- layout="topleft"
- mouse_opaque="false"
- tab_stop="false"
- name="hud"
- width="1024">
- <panel auto_resize="false"
- follows="all"
- height="500"
- top="0"
- layout="topleft"
- mouse_opaque="false"
- tab_stop="false"
- name="non_side_tray_view"
- user_resize="false"
- width="1024">
-
- <layout_stack border_size="0"
- bottom="500"
- follows="all"
- height="500"
- left="0"
- top="0"
- mouse_opaque="false"
- name="world_stack"
- open_time_constant="0.03"
- close_time_constant="0.03"
- orientation="vertical">
- <layout_panel auto_resize="true"
- follows="all"
- height="500"
- layout="topleft"
- tab_stop="false"
- mouse_opaque="false"
- user_resize="false"
- name="hud container"
- width="500">
- <view top="0"
- follows="all"
- height="500"
- left="0"
- mouse_opaque="false"
- name="floater_snap_region"
- width="500"/>
- <panel follows="left|top"
- height="0"
- left="0"
- mouse_opaque="false"
- name="topinfo_bar_container"
- tab_stop="false"
- top="0"
- visible="false"
- width="1024"/>
- <panel bottom="500"
- follows="left|right|bottom"
- height="25"
- left="0"
- mouse_opaque="false"
- tab_stop="false"
- name="stand_stop_flying_container"
- visible="false"
- width="500"/>
-
- <panel follows="all"
- height="500"
- left="0"
- mouse_opaque="false"
- name="floater_view_holder"
- tab_group="-1"
- tab_stop="false"
- top="0"
- width="500">
- <floater_view follows="all"
- height="500"
- left="0"
- mouse_opaque="false"
- name="Floater View"
- tab_group="-1"
- tab_stop="false"
- top="0"
- width="500"/>
- </panel>
- <panel bottom="500"
- follows="all"
- height="500"
- left="0"
- mouse_opaque="false"
- name="world_view_rect"
- top="0"
- width="500"/>
- </layout_panel>
- <layout_panel auto_resize="false"
- min_height="33"
- height="33"
- mouse_opaque="false"
- name="bottom_tray_container"
- visible="false"/>
- <layout_panel auto_resize="false"
- height="215"
- mouse_opaque="false"
- user_resize="false"
- name="avatar_picker_and_destination_guide_container"
- visible="false">
- <panel top="0"
- height="215"
- left="0"
- background_visible="true"
- width="500"
- follows="all">
- <web_browser
- top="0"
- height="200"
- follows="all"
- name="destination_guide_contents"
- trusted_content="true"
- visible="false"/>
- <web_browser
- top="0"
- height="200"
- follows="all"
- name="avatar_picker_contents"
- visible="false"
- trusted_content="true"/>
- <button
- name="close"
- width="22"
- height="23"
- right="-10"
- top="2"
- follows="top|right"
- chrome="true"
- tab_stop="false"
- image_unselected="bottomtray_close_off"
- image_selected="bottomtray_close_press"
- />
- </panel>
- </layout_panel>
- </layout_stack>
- </panel>
- <debug_view follows="all"
- left="0"
- top="0"
- mouse_opaque="false"
- height="500"
- name="DebugView"
- width="1024"/>
- </layout_panel>
- </layout_stack>
- <panel mouse_opaque="false"
- follows="right|top"
- name="status_bar_container"
- tab_stop="false"
- height="30"
- left="-160"
- top="0"
- width="160"
- visible="false"/>
- <panel follows="top|bottom"
- height="500"
- mouse_opaque="false"
- tab_stop="false"
- name="hidden_side_tray"
- visible="false"
- width="333">
- <panel
- name="side_tray_container"
- width="333"
- height="500"/>
- </panel>
-
- <panel top="0"
- follows="all"
- mouse_opaque="false"
- left="0"
- name="snapshot_floater_view_holder"
- width="1024"
- height="798">
- <snapshot_floater_view enabled="false"
- follows="all"
- height="768"
- left="0"
- mouse_opaque="false"
- name="Snapshot Floater View"
- tab_stop="false"
- top="0"
- visible="false"
- width="1024"/>
- </panel>
- <panel top="0"
- follows="all"
- height="768"
- mouse_opaque="false"
- name="popup_holder"
- class="popup_holder"
- width="1024">
- <icon follows="right|bottom"
- image_name="Resize_Corner"
- right="-1"
- name="resize_corner"
- width="11"
- bottom="-1"
- height="11" />
- </panel>
- <view top="0"
- left="0"
- width="1024"
- height="768"
- name="hint_holder"
- mouse_opaque="false"
- follows="all"/>
- <panel top="0"
- follows="all"
- height="768"
- mouse_opaque="true"
- name="progress_view"
- filename="panel_progress.xml"
- class="progress_view"
- width="1024"
- visible="false"/>
- <menu_holder top="0"
- follows="all"
- height="768"
- mouse_opaque="false"
- name="Menu Holder"
- width="1024"/>
- <tooltip_view top="0"
- follows="all"
- height="768"
- mouse_opaque="false"
- name="tooltip view"
- tab_group="-2"
- width="1024"/>
-</panel>
diff --git a/indra/newview/skins/minimal/xui/en/menu_add_wearable_gear.xml b/indra/newview/skins/minimal/xui/en/menu_add_wearable_gear.xml
deleted file mode 100644
index 28c4762eaa..0000000000
--- a/indra/newview/skins/minimal/xui/en/menu_add_wearable_gear.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<toggleable_menu/>
diff --git a/indra/newview/skins/minimal/xui/en/menu_attachment_other.xml b/indra/newview/skins/minimal/xui/en/menu_attachment_other.xml
deleted file mode 100644
index 80cf365c46..0000000000
--- a/indra/newview/skins/minimal/xui/en/menu_attachment_other.xml
+++ /dev/null
@@ -1,84 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<!-- *NOTE: See also menu_avatar_other.xml -->
-<context_menu
- layout="topleft"
- name="Avatar Pie">
- <menu_item_call
- label="View Profile"
- name="Profile...">
- <menu_item_call.on_click
- function="ShowAgentProfile"
- parameter="hit object" />
- </menu_item_call>
- <menu_item_call
- enabled="false"
- label="Add Friend"
- name="Add Friend">
- <menu_item_call.on_click
- function="Avatar.AddFriend" />
- <menu_item_call.on_enable
- function="Avatar.EnableAddFriend" />
- </menu_item_call>
- <menu_item_call
- label="IM"
- name="Send IM...">
- <menu_item_call.on_click
- function="Avatar.SendIM" />
- </menu_item_call>
- <menu_item_call
- label="Call"
- name="Call">
- <menu_item_call.on_click
- function="Avatar.Call" />
- <menu_item_call.on_enable
- function="Avatar.EnableCall" />
- </menu_item_call>
- <menu_item_separator />
- <menu_item_call
- enabled="false"
- label="Block"
- name="Avatar Mute">
- <menu_item_call.on_click
- function="Avatar.Mute" />
- <menu_item_call.on_enable
- function="Avatar.EnableMute" />
- </menu_item_call>
- <menu_item_call
- label="Report"
- name="abuse">
- <menu_item_call.on_click
- function="Avatar.ReportAbuse" />
- </menu_item_call>
- <menu_item_call
- label="Freeze"
- name="Freeze...">
- <menu_item_call.on_click
- function="Avatar.Freeze" />
- <menu_item_call.on_visible
- function="Avatar.EnableFreezeEject"/>
- </menu_item_call>
- <menu_item_call
- label="Eject"
- name="Eject...">
- <menu_item_call.on_click
- function="Avatar.Eject" />
- <menu_item_call.on_visible
- function="Avatar.EnableFreezeEject"/>
- </menu_item_call>
- <menu_item_call
- label="Debug Textures"
- name="Debug...">
- <menu_item_call.on_click
- function="Avatar.Debug" />
- <menu_item_call.on_visible
- function="IsGodCustomerService"/>
- </menu_item_call>
- <menu_item_call
- label="Zoom In"
- name="Zoom In">
- <menu_item_call.on_click
- function="Tools.LookAtSelection"
- parameter="zoom" />
- </menu_item_call>
- <menu_item_separator />
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/en/menu_attachment_self.xml b/indra/newview/skins/minimal/xui/en/menu_attachment_self.xml
deleted file mode 100644
index 542a7dc7dc..0000000000
--- a/indra/newview/skins/minimal/xui/en/menu_attachment_self.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<context_menu
- layout="topleft"
- name="Attachment Pie">
- <menu_item_call
- enabled="false"
- label="Touch"
- layout="topleft"
- name="Attachment Object Touch">
- <menu_item_call.on_click
- function="Object.Touch" />
- <menu_item_call.on_enable
- function="Object.EnableTouch"
- name="EnableTouch"/>
- </menu_item_call>
- <menu_item_call
- enabled="false"
- label="Detach"
- layout="topleft"
- name="Detach">
- <menu_item_call.on_click
- function="Attachment.Detach" />
- <menu_item_call.on_enable
- function="Attachment.EnableDetach" />
- </menu_item_call>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/en/menu_avatar_icon.xml b/indra/newview/skins/minimal/xui/en/menu_avatar_icon.xml
deleted file mode 100644
index d3d9e2ef8a..0000000000
--- a/indra/newview/skins/minimal/xui/en/menu_avatar_icon.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<menu visible="false"/>
diff --git a/indra/newview/skins/minimal/xui/en/menu_avatar_other.xml b/indra/newview/skins/minimal/xui/en/menu_avatar_other.xml
deleted file mode 100644
index 2c81b5a778..0000000000
--- a/indra/newview/skins/minimal/xui/en/menu_avatar_other.xml
+++ /dev/null
@@ -1,83 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<!-- *NOTE: See also menu_attachment_other.xml -->
-<context_menu
- layout="topleft"
- name="Avatar Pie">
- <menu_item_call
- label="View Profile"
- name="Profile...">
- <menu_item_call.on_click
- function="ShowAgentProfile"
- parameter="hit object" />
- </menu_item_call>
- <menu_item_call
- enabled="false"
- label="Add Friend"
- name="Add Friend">
- <menu_item_call.on_click
- function="Avatar.AddFriend" />
- <menu_item_call.on_enable
- function="Avatar.EnableAddFriend" />
- </menu_item_call>
- <menu_item_call
- label="IM"
- name="Send IM...">
- <menu_item_call.on_click
- function="Avatar.SendIM" />
- </menu_item_call>
- <menu_item_call
- label="Call"
- name="Call">
- <menu_item_call.on_click
- function="Avatar.Call" />
- <menu_item_call.on_enable
- function="Avatar.EnableCall" />
- </menu_item_call>
- <menu_item_separator />
- <menu_item_call
- enabled="false"
- label="Block"
- name="Avatar Mute">
- <menu_item_call.on_click
- function="Avatar.Mute" />
- <menu_item_call.on_enable
- function="Avatar.EnableMute" />
- </menu_item_call>
- <menu_item_call
- label="Report"
- name="abuse">
- <menu_item_call.on_click
- function="Avatar.ReportAbuse" />
- </menu_item_call>
- <menu_item_call
- label="Freeze"
- name="Freeze...">
- <menu_item_call.on_click
- function="Avatar.Freeze" />
- <menu_item_call.on_visible
- function="Avatar.EnableFreezeEject"/>
- </menu_item_call>
- <menu_item_call
- label="Eject"
- name="Eject...">
- <menu_item_call.on_click
- function="Avatar.Eject" />
- <menu_item_call.on_visible
- function="Avatar.EnableFreezeEject"/>
- </menu_item_call>
- <menu_item_call
- label="Debug Textures"
- name="Debug...">
- <menu_item_call.on_click
- function="Avatar.Debug" />
- <menu_item_call.on_visible
- function="IsGodCustomerService"/>
- </menu_item_call>
- <menu_item_call
- label="Zoom In"
- name="Zoom In">
- <menu_item_call.on_click
- function="Tools.LookAtSelection"
- parameter="zoom" />
- </menu_item_call>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/en/menu_avatar_self.xml b/indra/newview/skins/minimal/xui/en/menu_avatar_self.xml
deleted file mode 100644
index fb19c5eb2c..0000000000
--- a/indra/newview/skins/minimal/xui/en/menu_avatar_self.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<context_menu/>
diff --git a/indra/newview/skins/minimal/xui/en/menu_bottomtray.xml b/indra/newview/skins/minimal/xui/en/menu_bottomtray.xml
deleted file mode 100644
index d3d9e2ef8a..0000000000
--- a/indra/newview/skins/minimal/xui/en/menu_bottomtray.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<menu visible="false"/>
diff --git a/indra/newview/skins/minimal/xui/en/menu_cof_attachment.xml b/indra/newview/skins/minimal/xui/en/menu_cof_attachment.xml
deleted file mode 100644
index fb19c5eb2c..0000000000
--- a/indra/newview/skins/minimal/xui/en/menu_cof_attachment.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<context_menu/>
diff --git a/indra/newview/skins/minimal/xui/en/menu_cof_body_part.xml b/indra/newview/skins/minimal/xui/en/menu_cof_body_part.xml
deleted file mode 100644
index fb19c5eb2c..0000000000
--- a/indra/newview/skins/minimal/xui/en/menu_cof_body_part.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<context_menu/>
diff --git a/indra/newview/skins/minimal/xui/en/menu_cof_clothing.xml b/indra/newview/skins/minimal/xui/en/menu_cof_clothing.xml
deleted file mode 100644
index fb19c5eb2c..0000000000
--- a/indra/newview/skins/minimal/xui/en/menu_cof_clothing.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<context_menu/>
diff --git a/indra/newview/skins/minimal/xui/en/menu_cof_gear.xml b/indra/newview/skins/minimal/xui/en/menu_cof_gear.xml
deleted file mode 100644
index 28c4762eaa..0000000000
--- a/indra/newview/skins/minimal/xui/en/menu_cof_gear.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<toggleable_menu/>
diff --git a/indra/newview/skins/minimal/xui/en/menu_edit.xml b/indra/newview/skins/minimal/xui/en/menu_edit.xml
deleted file mode 100644
index 747eb3fc6a..0000000000
--- a/indra/newview/skins/minimal/xui/en/menu_edit.xml
+++ /dev/null
@@ -1,90 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<menu create_jump_keys="true"
- label="Edit"
- name="Edit"
- visible="false">
- <menu_item_call
- label="Undo"
- name="Undo"
- shortcut="control|Z">
- <menu_item_call.on_click
- function="Edit.Undo" />
- <menu_item_call.on_enable
- function="Edit.EnableUndo" />
- </menu_item_call>
- <menu_item_call
- label="Redo"
- name="Redo"
- shortcut="control|Y">
- <menu_item_call.on_click
- function="Edit.Redo" />
- <menu_item_call.on_enable
- function="Edit.EnableRedo" />
- </menu_item_call>
- <menu_item_separator/>
- <menu_item_call
- label="Cut"
- name="Cut"
- shortcut="control|X">
- <menu_item_call.on_click
- function="Edit.Cut" />
- <menu_item_call.on_enable
- function="Edit.EnableCut" />
- </menu_item_call>
- <menu_item_call
- label="Copy"
- name="Copy"
- shortcut="control|C">
- <menu_item_call.on_click
- function="Edit.Copy" />
- <menu_item_call.on_enable
- function="Edit.EnableCopy" />
- </menu_item_call>
- <menu_item_call
- label="Paste"
- name="Paste"
- shortcut="control|V">
- <menu_item_call.on_click
- function="Edit.Paste" />
- <menu_item_call.on_enable
- function="Edit.EnablePaste" />
- </menu_item_call>
- <menu_item_call
- label="Delete"
- name="Delete"
- allow_key_repeat="true"
- shortcut="Del">
- <menu_item_call.on_click
- function="Edit.Delete" />
- <menu_item_call.on_enable
- function="Edit.EnableDelete" />
- </menu_item_call>
- <menu_item_call
- label="Duplicate"
- name="Duplicate"
- shortcut="control|D">
- <menu_item_call.on_click
- function="Edit.Duplicate" />
- <menu_item_call.on_enable
- function="Edit.EnableDuplicate" />
- </menu_item_call>
- <menu_item_separator/>
- <menu_item_call
- label="Select All"
- name="Select All"
- shortcut="control|A">
- <menu_item_call.on_click
- function="Edit.SelectAll" />
- <menu_item_call.on_enable
- function="Edit.EnableSelectAll" />
- </menu_item_call>
- <menu_item_call
- label="Deselect"
- name="Deselect"
- shortcut="control|E">
- <menu_item_call.on_click
- function="Edit.Deselect" />
- <menu_item_call.on_enable
- function="Edit.EnableDeselect" />
- </menu_item_call>
-</menu> \ No newline at end of file
diff --git a/indra/newview/skins/minimal/xui/en/menu_favorites.xml b/indra/newview/skins/minimal/xui/en/menu_favorites.xml
deleted file mode 100644
index d3d9e2ef8a..0000000000
--- a/indra/newview/skins/minimal/xui/en/menu_favorites.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<menu visible="false"/>
diff --git a/indra/newview/skins/minimal/xui/en/menu_gesture_gear.xml b/indra/newview/skins/minimal/xui/en/menu_gesture_gear.xml
deleted file mode 100644
index 28c4762eaa..0000000000
--- a/indra/newview/skins/minimal/xui/en/menu_gesture_gear.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<toggleable_menu/>
diff --git a/indra/newview/skins/minimal/xui/en/menu_group_plus.xml b/indra/newview/skins/minimal/xui/en/menu_group_plus.xml
deleted file mode 100644
index d3d9e2ef8a..0000000000
--- a/indra/newview/skins/minimal/xui/en/menu_group_plus.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<menu visible="false"/>
diff --git a/indra/newview/skins/minimal/xui/en/menu_hide_navbar.xml b/indra/newview/skins/minimal/xui/en/menu_hide_navbar.xml
deleted file mode 100644
index d3d9e2ef8a..0000000000
--- a/indra/newview/skins/minimal/xui/en/menu_hide_navbar.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<menu visible="false"/>
diff --git a/indra/newview/skins/minimal/xui/en/menu_im_well_button.xml b/indra/newview/skins/minimal/xui/en/menu_im_well_button.xml
deleted file mode 100644
index fb19c5eb2c..0000000000
--- a/indra/newview/skins/minimal/xui/en/menu_im_well_button.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<context_menu/>
diff --git a/indra/newview/skins/minimal/xui/en/menu_imchiclet_adhoc.xml b/indra/newview/skins/minimal/xui/en/menu_imchiclet_adhoc.xml
deleted file mode 100644
index d3d9e2ef8a..0000000000
--- a/indra/newview/skins/minimal/xui/en/menu_imchiclet_adhoc.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<menu visible="false"/>
diff --git a/indra/newview/skins/minimal/xui/en/menu_imchiclet_group.xml b/indra/newview/skins/minimal/xui/en/menu_imchiclet_group.xml
deleted file mode 100644
index d3d9e2ef8a..0000000000
--- a/indra/newview/skins/minimal/xui/en/menu_imchiclet_group.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<menu visible="false"/>
diff --git a/indra/newview/skins/minimal/xui/en/menu_imchiclet_p2p.xml b/indra/newview/skins/minimal/xui/en/menu_imchiclet_p2p.xml
deleted file mode 100644
index d3d9e2ef8a..0000000000
--- a/indra/newview/skins/minimal/xui/en/menu_imchiclet_p2p.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<menu visible="false"/>
diff --git a/indra/newview/skins/minimal/xui/en/menu_inspect_avatar_gear.xml b/indra/newview/skins/minimal/xui/en/menu_inspect_avatar_gear.xml
deleted file mode 100644
index a11e367d66..0000000000
--- a/indra/newview/skins/minimal/xui/en/menu_inspect_avatar_gear.xml
+++ /dev/null
@@ -1,125 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<toggleable_menu
- create_jump_keys="true"
- layout="topleft"
- mouse_opaque="false"
- visible="false"
- name="Gear Menu">
- <menu_item_call
- label="View Profile"
- enabled="true"
- name="view_profile">
- <menu_item_call.on_click
- function="InspectAvatar.ViewProfile"/>
- </menu_item_call>
- <menu_item_call
- label="Add Friend"
- name="add_friend">
- <menu_item_call.on_click
- function="InspectAvatar.AddFriend"/>
- <menu_item_call.on_enable
- function="InspectAvatar.Gear.Enable"/>
- </menu_item_call>
- <menu_item_call
- label="IM"
- name="im">
- <menu_item_call.on_click
- function="InspectAvatar.IM"/>
- </menu_item_call>
- <menu_item_call
- label="Call"
- enabled="true"
- name="call">
- <menu_item_call.on_click
- function="InspectAvatar.Call"/>
- <menu_item_call.on_enable
- function="InspectAvatar.Gear.EnableCall"/>
- </menu_item_call>
- <menu_item_call
- label="Teleport"
- name="teleport">
- <menu_item_call.on_click
- function="InspectAvatar.Teleport"/>
- <menu_item_call.on_enable
- function="InspectAvatar.Gear.EnableTeleportOffer"/>
- </menu_item_call>
- <menu_item_separator />
- <menu_item_call
- label="Block"
- name="block">
- <menu_item_call.on_click
- function="InspectAvatar.ToggleMute"/>
- <menu_item_call.on_visible
- function="InspectAvatar.EnableMute" />
- </menu_item_call>
- <menu_item_call
- label="Unblock"
- name="unblock">
- <menu_item_call.on_click
- function="InspectAvatar.ToggleMute"/>
- <menu_item_call.on_visible
- function="InspectAvatar.EnableUnmute" />
- </menu_item_call>
- <menu_item_call
- label="Report"
- name="report">
- <menu_item_call.on_click
- function="InspectAvatar.Report"/>
- </menu_item_call>
- <menu_item_call
- label="Freeze"
- name="freeze">
- <menu_item_call.on_click
- function="InspectAvatar.Freeze"/>
- <menu_item_call.on_visible
- function="InspectAvatar.VisibleFreeze"/>
- </menu_item_call>
- <menu_item_call
- label="Eject"
- name="eject">
- <menu_item_call.on_click
- function="InspectAvatar.Eject"/>
- <menu_item_call.on_visible
- function="InspectAvatar.VisibleEject"/>
- </menu_item_call>
- <menu_item_call
- label="Kick"
- name="kick">
- <menu_item_call.on_click
- function="InspectAvatar.Kick"/>
- <menu_item_call.on_visible
- function="InspectAvatar.EnableGod"/>
- </menu_item_call>
- <menu_item_call
- label="CSR"
- name="csr">
- <menu_item_call.on_click
- function="InspectAvatar.CSR" />
- <menu_item_call.on_visible
- function="InspectAvatar.EnableGod" />
- </menu_item_call>
- <menu_item_call
- label="Debug Textures"
- name="debug">
- <menu_item_call.on_click
- function="Avatar.Debug"/>
- <menu_item_call.on_visible
- function="IsGodCustomerService"/>
- </menu_item_call>
- <menu_item_call
- label="Find On Map"
- name="find_on_map">
- <menu_item_call.on_click
- function="InspectAvatar.FindOnMap"/>
- <menu_item_call.on_visible
- function="InspectAvatar.VisibleFindOnMap"/>
- </menu_item_call>
- <menu_item_call
- label="Zoom In"
- name="zoom_in">
- <menu_item_call.on_click
- function="InspectAvatar.ZoomIn"/>
- <menu_item_call.on_visible
- function="InspectAvatar.VisibleZoomIn"/>
- </menu_item_call>
-</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/en/menu_inspect_object_gear.xml b/indra/newview/skins/minimal/xui/en/menu_inspect_object_gear.xml
deleted file mode 100644
index 8ec360a604..0000000000
--- a/indra/newview/skins/minimal/xui/en/menu_inspect_object_gear.xml
+++ /dev/null
@@ -1,50 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<toggleable_menu
- create_jump_keys="true"
- layout="topleft"
- mouse_opaque="false"
- visible="false"
- name="Gear Menu">
- <menu_item_call
- label="Touch"
- layout="topleft"
- enabled="true"
- name="touch">
- <menu_item_call.on_click
- function="InspectObject.Touch"/>
- <menu_item_call.on_visible
- function="Object.EnableTouch" />
- </menu_item_call>
- <menu_item_call
- label="Sit"
- layout="topleft"
- name="sit">
- <menu_item_call.on_click
- function="InspectObject.Sit"/>
- <menu_item_call.on_visible
- function="Object.EnableSit"/>
- </menu_item_call>
- <menu_item_call
- label="Report"
- layout="topleft"
- name="report">
- <menu_item_call.on_click
- function="Object.ReportAbuse" />
- </menu_item_call>
- <menu_item_call
- label="Block"
- layout="topleft"
- name="block">
- <menu_item_call.on_click
- function="Object.Mute" />
- <menu_item_call.on_visible
- function="Object.EnableMute" />
- </menu_item_call>
- <menu_item_call
- label="Zoom In"
- layout="topleft"
- name="zoom_in">
- <menu_item_call.on_click
- function="InspectObject.ZoomIn" />
- </menu_item_call>
-</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/en/menu_inspect_self_gear.xml b/indra/newview/skins/minimal/xui/en/menu_inspect_self_gear.xml
deleted file mode 100644
index ae8b640d26..0000000000
--- a/indra/newview/skins/minimal/xui/en/menu_inspect_self_gear.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<toggleable_menu
- layout="topleft"
- name="Self Pie">
- <menu_item_call
- label="Sit Down"
- layout="topleft"
- name="Sit Down Here">
- <menu_item_call.on_click
- function="Self.SitDown"
- parameter="" />
- <menu_item_call.on_enable
- function="Self.EnableSitDown" />
- </menu_item_call>
- <menu_item_call
- label="Stand Up"
- layout="topleft"
- name="Stand Up">
- <menu_item_call.on_click
- function="Self.StandUp"
- parameter="" />
- <menu_item_call.on_enable
- function="Self.EnableStandUp" />
- </menu_item_call>
- <menu_item_call
- label="My Friends"
- layout="topleft"
- name="Friends...">
- <menu_item_call.on_click
- function="SideTray.PanelPeopleTab"
- parameter="friends_panel" />
- </menu_item_call>
- <menu_item_call
- label="My Profile"
- layout="topleft"
- name="Profile...">
- <menu_item_call.on_click
- function="ShowAgentProfile"
- parameter="agent" />
- </menu_item_call>
- <menu_item_call
- label="Debug Textures"
- name="Debug...">
- <menu_item_call.on_click
- function="Avatar.Debug" />
- <menu_item_call.on_visible
- function="IsGodCustomerService"/>
- </menu_item_call>
-</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/en/menu_inv_offer_chiclet.xml b/indra/newview/skins/minimal/xui/en/menu_inv_offer_chiclet.xml
deleted file mode 100644
index d3d9e2ef8a..0000000000
--- a/indra/newview/skins/minimal/xui/en/menu_inv_offer_chiclet.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<menu visible="false"/>
diff --git a/indra/newview/skins/minimal/xui/en/menu_inventory.xml b/indra/newview/skins/minimal/xui/en/menu_inventory.xml
deleted file mode 100644
index d3d9e2ef8a..0000000000
--- a/indra/newview/skins/minimal/xui/en/menu_inventory.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<menu visible="false"/>
diff --git a/indra/newview/skins/minimal/xui/en/menu_inventory_add.xml b/indra/newview/skins/minimal/xui/en/menu_inventory_add.xml
deleted file mode 100644
index d3d9e2ef8a..0000000000
--- a/indra/newview/skins/minimal/xui/en/menu_inventory_add.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<menu visible="false"/>
diff --git a/indra/newview/skins/minimal/xui/en/menu_inventory_gear_default.xml b/indra/newview/skins/minimal/xui/en/menu_inventory_gear_default.xml
deleted file mode 100644
index 28c4762eaa..0000000000
--- a/indra/newview/skins/minimal/xui/en/menu_inventory_gear_default.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<toggleable_menu/>
diff --git a/indra/newview/skins/minimal/xui/en/menu_land.xml b/indra/newview/skins/minimal/xui/en/menu_land.xml
deleted file mode 100644
index fb19c5eb2c..0000000000
--- a/indra/newview/skins/minimal/xui/en/menu_land.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<context_menu/>
diff --git a/indra/newview/skins/minimal/xui/en/menu_landmark.xml b/indra/newview/skins/minimal/xui/en/menu_landmark.xml
deleted file mode 100644
index 28c4762eaa..0000000000
--- a/indra/newview/skins/minimal/xui/en/menu_landmark.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<toggleable_menu/>
diff --git a/indra/newview/skins/minimal/xui/en/menu_login.xml b/indra/newview/skins/minimal/xui/en/menu_login.xml
deleted file mode 100644
index 62dbce3f56..0000000000
--- a/indra/newview/skins/minimal/xui/en/menu_login.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<menu_bar/>
diff --git a/indra/newview/skins/minimal/xui/en/menu_mini_map.xml b/indra/newview/skins/minimal/xui/en/menu_mini_map.xml
deleted file mode 100644
index d3d9e2ef8a..0000000000
--- a/indra/newview/skins/minimal/xui/en/menu_mini_map.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<menu visible="false"/>
diff --git a/indra/newview/skins/minimal/xui/en/menu_navbar.xml b/indra/newview/skins/minimal/xui/en/menu_navbar.xml
deleted file mode 100644
index d3d9e2ef8a..0000000000
--- a/indra/newview/skins/minimal/xui/en/menu_navbar.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<menu visible="false"/>
diff --git a/indra/newview/skins/minimal/xui/en/menu_nearby_chat.xml b/indra/newview/skins/minimal/xui/en/menu_nearby_chat.xml
deleted file mode 100644
index d3d9e2ef8a..0000000000
--- a/indra/newview/skins/minimal/xui/en/menu_nearby_chat.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<menu visible="false"/>
diff --git a/indra/newview/skins/minimal/xui/en/menu_notification_well_button.xml b/indra/newview/skins/minimal/xui/en/menu_notification_well_button.xml
deleted file mode 100644
index fb19c5eb2c..0000000000
--- a/indra/newview/skins/minimal/xui/en/menu_notification_well_button.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<context_menu/>
diff --git a/indra/newview/skins/minimal/xui/en/menu_object.xml b/indra/newview/skins/minimal/xui/en/menu_object.xml
deleted file mode 100644
index 888ce42cf1..0000000000
--- a/indra/newview/skins/minimal/xui/en/menu_object.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<context_menu
- layout="topleft"
- name="Object Pie">
- <menu_item_call
- enabled="false"
- label="Sit Here"
- name="Object Sit">
- <menu_item_call.on_click
- function="Object.SitOrStand" />
- <menu_item_call.on_enable
- function="Object.EnableSit" />
- </menu_item_call>
- <menu_item_call
- enabled="false"
- label="Stand Up"
- name="Object Stand Up">
- <menu_item_call.on_click
- function="Object.SitOrStand" />
- <menu_item_call.on_enable
- function="Object.EnableStandUp" />
- </menu_item_call>
- <menu_item_call
- label="Zoom In"
- name="Zoom In">
- <menu_item_call.on_click
- function="Object.ZoomIn" />
- </menu_item_call>
- <menu_item_call
- enabled="false"
- label="Touch"
- name="Object Touch">
- <menu_item_call.on_click
- function="Object.Touch" />
- <menu_item_call.on_enable
- function="Object.EnableTouch"
- name="EnableTouch"
- parameter="Touch" />
- </menu_item_call>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/en/menu_object_icon.xml b/indra/newview/skins/minimal/xui/en/menu_object_icon.xml
deleted file mode 100644
index d3d9e2ef8a..0000000000
--- a/indra/newview/skins/minimal/xui/en/menu_object_icon.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<menu visible="false"/>
diff --git a/indra/newview/skins/minimal/xui/en/menu_outfit_gear.xml b/indra/newview/skins/minimal/xui/en/menu_outfit_gear.xml
deleted file mode 100644
index 28c4762eaa..0000000000
--- a/indra/newview/skins/minimal/xui/en/menu_outfit_gear.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<toggleable_menu/>
diff --git a/indra/newview/skins/minimal/xui/en/menu_outfit_tab.xml b/indra/newview/skins/minimal/xui/en/menu_outfit_tab.xml
deleted file mode 100644
index fb19c5eb2c..0000000000
--- a/indra/newview/skins/minimal/xui/en/menu_outfit_tab.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<context_menu/>
diff --git a/indra/newview/skins/minimal/xui/en/menu_participant_list.xml b/indra/newview/skins/minimal/xui/en/menu_participant_list.xml
deleted file mode 100644
index fb19c5eb2c..0000000000
--- a/indra/newview/skins/minimal/xui/en/menu_participant_list.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<context_menu/>
diff --git a/indra/newview/skins/minimal/xui/en/menu_people_friends_view_sort.xml b/indra/newview/skins/minimal/xui/en/menu_people_friends_view_sort.xml
deleted file mode 100644
index 28c4762eaa..0000000000
--- a/indra/newview/skins/minimal/xui/en/menu_people_friends_view_sort.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<toggleable_menu/>
diff --git a/indra/newview/skins/minimal/xui/en/menu_people_groups.xml b/indra/newview/skins/minimal/xui/en/menu_people_groups.xml
deleted file mode 100644
index d3d9e2ef8a..0000000000
--- a/indra/newview/skins/minimal/xui/en/menu_people_groups.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<menu visible="false"/>
diff --git a/indra/newview/skins/minimal/xui/en/menu_people_groups_view_sort.xml b/indra/newview/skins/minimal/xui/en/menu_people_groups_view_sort.xml
deleted file mode 100644
index 28c4762eaa..0000000000
--- a/indra/newview/skins/minimal/xui/en/menu_people_groups_view_sort.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<toggleable_menu/>
diff --git a/indra/newview/skins/minimal/xui/en/menu_people_nearby.xml b/indra/newview/skins/minimal/xui/en/menu_people_nearby.xml
deleted file mode 100644
index 1840ebd491..0000000000
--- a/indra/newview/skins/minimal/xui/en/menu_people_nearby.xml
+++ /dev/null
@@ -1,71 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<context_menu
- layout="topleft"
- name="Avatar Context Menu">
- <menu_item_call
- label="View Profile"
- layout="topleft"
- name="View Profile">
- <menu_item_call.on_click
- function="Avatar.Profile" />
- </menu_item_call>
- <menu_item_call
- label="Add Friend"
- layout="topleft"
- name="Add Friend">
- <menu_item_call.on_click
- function="Avatar.AddFriend" />
- <menu_item_call.on_enable
- function="Avatar.EnableItem"
- parameter="can_add" />
- </menu_item_call>
- <menu_item_call
- label="Remove Friend"
- layout="topleft"
- name="Remove Friend">
- <menu_item_call.on_click
- function="Avatar.RemoveFriend" />
- <menu_item_call.on_enable
- function="Avatar.EnableItem"
- parameter="can_delete" />
- </menu_item_call>
- <menu_item_call
- label="IM"
- layout="topleft"
- name="IM">
- <menu_item_call.on_click
- function="Avatar.IM" />
- </menu_item_call>
- <menu_item_call
- label="Call"
- layout="topleft"
- name="Call">
- <menu_item_call.on_click
- function="Avatar.Call" />
- <menu_item_call.on_enable
- function="Avatar.EnableItem"
- parameter="can_call" />
- </menu_item_call>
- <menu_item_check
- label="Block/Unblock"
- layout="topleft"
- name="Block/Unblock">
- <menu_item_check.on_click
- function="Avatar.BlockUnblock" />
- <menu_item_check.on_check
- function="Avatar.CheckItem"
- parameter="is_blocked" />
- <menu_item_check.on_enable
- function="Avatar.EnableItem"
- parameter="can_block" />
- </menu_item_check>
- <menu_item_call
- label="Offer Teleport"
- name="teleport">
- <menu_item_call.on_click
- function="Avatar.OfferTeleport"/>
- <menu_item_call.on_enable
- function="Avatar.EnableItem"
- parameter="can_offer_teleport"/>
- </menu_item_call>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/en/menu_people_nearby_multiselect.xml b/indra/newview/skins/minimal/xui/en/menu_people_nearby_multiselect.xml
deleted file mode 100644
index fb19c5eb2c..0000000000
--- a/indra/newview/skins/minimal/xui/en/menu_people_nearby_multiselect.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<context_menu/>
diff --git a/indra/newview/skins/minimal/xui/en/menu_people_nearby_view_sort.xml b/indra/newview/skins/minimal/xui/en/menu_people_nearby_view_sort.xml
deleted file mode 100644
index 28c4762eaa..0000000000
--- a/indra/newview/skins/minimal/xui/en/menu_people_nearby_view_sort.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<toggleable_menu/>
diff --git a/indra/newview/skins/minimal/xui/en/menu_people_recent_view_sort.xml b/indra/newview/skins/minimal/xui/en/menu_people_recent_view_sort.xml
deleted file mode 100644
index 28c4762eaa..0000000000
--- a/indra/newview/skins/minimal/xui/en/menu_people_recent_view_sort.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<toggleable_menu/>
diff --git a/indra/newview/skins/minimal/xui/en/menu_picks.xml b/indra/newview/skins/minimal/xui/en/menu_picks.xml
deleted file mode 100644
index fb19c5eb2c..0000000000
--- a/indra/newview/skins/minimal/xui/en/menu_picks.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<context_menu/>
diff --git a/indra/newview/skins/minimal/xui/en/menu_picks_plus.xml b/indra/newview/skins/minimal/xui/en/menu_picks_plus.xml
deleted file mode 100644
index 28c4762eaa..0000000000
--- a/indra/newview/skins/minimal/xui/en/menu_picks_plus.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<toggleable_menu/>
diff --git a/indra/newview/skins/minimal/xui/en/menu_place.xml b/indra/newview/skins/minimal/xui/en/menu_place.xml
deleted file mode 100644
index 28c4762eaa..0000000000
--- a/indra/newview/skins/minimal/xui/en/menu_place.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<toggleable_menu/>
diff --git a/indra/newview/skins/minimal/xui/en/menu_place_add_button.xml b/indra/newview/skins/minimal/xui/en/menu_place_add_button.xml
deleted file mode 100644
index d3d9e2ef8a..0000000000
--- a/indra/newview/skins/minimal/xui/en/menu_place_add_button.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<menu visible="false"/>
diff --git a/indra/newview/skins/minimal/xui/en/menu_places_gear_folder.xml b/indra/newview/skins/minimal/xui/en/menu_places_gear_folder.xml
deleted file mode 100644
index 28c4762eaa..0000000000
--- a/indra/newview/skins/minimal/xui/en/menu_places_gear_folder.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<toggleable_menu/>
diff --git a/indra/newview/skins/minimal/xui/en/menu_places_gear_landmark.xml b/indra/newview/skins/minimal/xui/en/menu_places_gear_landmark.xml
deleted file mode 100644
index 28c4762eaa..0000000000
--- a/indra/newview/skins/minimal/xui/en/menu_places_gear_landmark.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<toggleable_menu/>
diff --git a/indra/newview/skins/minimal/xui/en/menu_profile_overflow.xml b/indra/newview/skins/minimal/xui/en/menu_profile_overflow.xml
deleted file mode 100644
index 28c4762eaa..0000000000
--- a/indra/newview/skins/minimal/xui/en/menu_profile_overflow.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<toggleable_menu/>
diff --git a/indra/newview/skins/minimal/xui/en/menu_save_outfit.xml b/indra/newview/skins/minimal/xui/en/menu_save_outfit.xml
deleted file mode 100644
index 28c4762eaa..0000000000
--- a/indra/newview/skins/minimal/xui/en/menu_save_outfit.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<toggleable_menu/>
diff --git a/indra/newview/skins/minimal/xui/en/menu_script_chiclet.xml b/indra/newview/skins/minimal/xui/en/menu_script_chiclet.xml
deleted file mode 100644
index d3d9e2ef8a..0000000000
--- a/indra/newview/skins/minimal/xui/en/menu_script_chiclet.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<menu visible="false"/>
diff --git a/indra/newview/skins/minimal/xui/en/menu_slurl.xml b/indra/newview/skins/minimal/xui/en/menu_slurl.xml
deleted file mode 100644
index d3d9e2ef8a..0000000000
--- a/indra/newview/skins/minimal/xui/en/menu_slurl.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<menu visible="false"/>
diff --git a/indra/newview/skins/minimal/xui/en/menu_teleport_history_gear.xml b/indra/newview/skins/minimal/xui/en/menu_teleport_history_gear.xml
deleted file mode 100644
index 28c4762eaa..0000000000
--- a/indra/newview/skins/minimal/xui/en/menu_teleport_history_gear.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<toggleable_menu/>
diff --git a/indra/newview/skins/minimal/xui/en/menu_teleport_history_item.xml b/indra/newview/skins/minimal/xui/en/menu_teleport_history_item.xml
deleted file mode 100644
index fb19c5eb2c..0000000000
--- a/indra/newview/skins/minimal/xui/en/menu_teleport_history_item.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<context_menu/>
diff --git a/indra/newview/skins/minimal/xui/en/menu_teleport_history_tab.xml b/indra/newview/skins/minimal/xui/en/menu_teleport_history_tab.xml
deleted file mode 100644
index fb19c5eb2c..0000000000
--- a/indra/newview/skins/minimal/xui/en/menu_teleport_history_tab.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<context_menu/>
diff --git a/indra/newview/skins/minimal/xui/en/menu_text_editor.xml b/indra/newview/skins/minimal/xui/en/menu_text_editor.xml
deleted file mode 100644
index fb19c5eb2c..0000000000
--- a/indra/newview/skins/minimal/xui/en/menu_text_editor.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<context_menu/>
diff --git a/indra/newview/skins/minimal/xui/en/menu_topinfobar.xml b/indra/newview/skins/minimal/xui/en/menu_topinfobar.xml
deleted file mode 100644
index d3d9e2ef8a..0000000000
--- a/indra/newview/skins/minimal/xui/en/menu_topinfobar.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<menu visible="false"/>
diff --git a/indra/newview/skins/minimal/xui/en/menu_url_agent.xml b/indra/newview/skins/minimal/xui/en/menu_url_agent.xml
deleted file mode 100644
index fb19c5eb2c..0000000000
--- a/indra/newview/skins/minimal/xui/en/menu_url_agent.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<context_menu/>
diff --git a/indra/newview/skins/minimal/xui/en/menu_url_group.xml b/indra/newview/skins/minimal/xui/en/menu_url_group.xml
deleted file mode 100644
index fb19c5eb2c..0000000000
--- a/indra/newview/skins/minimal/xui/en/menu_url_group.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<context_menu/>
diff --git a/indra/newview/skins/minimal/xui/en/menu_url_http.xml b/indra/newview/skins/minimal/xui/en/menu_url_http.xml
deleted file mode 100644
index fb19c5eb2c..0000000000
--- a/indra/newview/skins/minimal/xui/en/menu_url_http.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<context_menu/>
diff --git a/indra/newview/skins/minimal/xui/en/menu_url_inventory.xml b/indra/newview/skins/minimal/xui/en/menu_url_inventory.xml
deleted file mode 100644
index fb19c5eb2c..0000000000
--- a/indra/newview/skins/minimal/xui/en/menu_url_inventory.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<context_menu/>
diff --git a/indra/newview/skins/minimal/xui/en/menu_url_map.xml b/indra/newview/skins/minimal/xui/en/menu_url_map.xml
deleted file mode 100644
index fb19c5eb2c..0000000000
--- a/indra/newview/skins/minimal/xui/en/menu_url_map.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<context_menu/>
diff --git a/indra/newview/skins/minimal/xui/en/menu_url_objectim.xml b/indra/newview/skins/minimal/xui/en/menu_url_objectim.xml
deleted file mode 100644
index fb19c5eb2c..0000000000
--- a/indra/newview/skins/minimal/xui/en/menu_url_objectim.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<context_menu/>
diff --git a/indra/newview/skins/minimal/xui/en/menu_url_parcel.xml b/indra/newview/skins/minimal/xui/en/menu_url_parcel.xml
deleted file mode 100644
index fb19c5eb2c..0000000000
--- a/indra/newview/skins/minimal/xui/en/menu_url_parcel.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<context_menu/>
diff --git a/indra/newview/skins/minimal/xui/en/menu_url_slapp.xml b/indra/newview/skins/minimal/xui/en/menu_url_slapp.xml
deleted file mode 100644
index fb19c5eb2c..0000000000
--- a/indra/newview/skins/minimal/xui/en/menu_url_slapp.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<context_menu/>
diff --git a/indra/newview/skins/minimal/xui/en/menu_url_slurl.xml b/indra/newview/skins/minimal/xui/en/menu_url_slurl.xml
deleted file mode 100644
index fb19c5eb2c..0000000000
--- a/indra/newview/skins/minimal/xui/en/menu_url_slurl.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<context_menu/>
diff --git a/indra/newview/skins/minimal/xui/en/menu_url_teleport.xml b/indra/newview/skins/minimal/xui/en/menu_url_teleport.xml
deleted file mode 100644
index fb19c5eb2c..0000000000
--- a/indra/newview/skins/minimal/xui/en/menu_url_teleport.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<context_menu/>
diff --git a/indra/newview/skins/minimal/xui/en/menu_viewer.xml b/indra/newview/skins/minimal/xui/en/menu_viewer.xml
deleted file mode 100644
index cd83ea4e99..0000000000
--- a/indra/newview/skins/minimal/xui/en/menu_viewer.xml
+++ /dev/null
@@ -1,71 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<menu_bar
- bg_visible="false"
- follows="left|top|right"
- name="Main Menu">
- <menu
- create_jump_keys="true"
- label="Help"
- name="Help"
- tear_off="true">
- <menu_item_call
- label="[SECOND_LIFE] Help"
- name="Second Life Help"
- shortcut="F1">
- <menu_item_call.on_click
- function="ShowHelp"
- parameter="f1_help" />
- </menu_item_call>
- </menu>
- <menu
- create_jump_keys="true"
- label="Advanced"
- name="Advanced"
- tear_off="true"
- visible="false">
- <menu
- create_jump_keys="true"
- label="Shortcuts"
- name="Shortcuts"
- tear_off="true"
- visible="false">
- <menu_item_check
- label="Fly"
- name="Fly"
- shortcut="Home">
- <menu_item_check.on_check
- function="Agent.getFlying" />
- <menu_item_check.on_click
- function="Agent.toggleFlying" />
- <menu_item_check.on_enable
- function="Agent.enableFlying" />
- </menu_item_check>
- <menu_item_call
- label="Close Window"
- name="Close Window"
- shortcut="control|W">
- <menu_item_call.on_click
- function="File.CloseWindow" />
- <menu_item_call.on_enable
- function="File.EnableCloseWindow" />
- </menu_item_call>
- <menu_item_call
- label="Close All Windows"
- name="Close All Windows"
- shortcut="control|shift|W">
- <menu_item_call.on_click
- function="File.CloseAllWindows" />
- <menu_item_call.on_enable
- function="File.EnableCloseAllWindows" />
- </menu_item_call>
-
- <menu_item_call
- label="Reset View"
- name="Reset View"
- shortcut="Esc">
- <menu_item_call.on_click
- function="View.ResetView" />
- </menu_item_call>
- </menu> <!--Shortcuts-->
- </menu>
-</menu_bar>
diff --git a/indra/newview/skins/minimal/xui/en/menu_wearable_list_item.xml b/indra/newview/skins/minimal/xui/en/menu_wearable_list_item.xml
deleted file mode 100644
index fb19c5eb2c..0000000000
--- a/indra/newview/skins/minimal/xui/en/menu_wearable_list_item.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<context_menu/>
diff --git a/indra/newview/skins/minimal/xui/en/menu_wearing_gear.xml b/indra/newview/skins/minimal/xui/en/menu_wearing_gear.xml
deleted file mode 100644
index 28c4762eaa..0000000000
--- a/indra/newview/skins/minimal/xui/en/menu_wearing_gear.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<toggleable_menu/>
diff --git a/indra/newview/skins/minimal/xui/en/menu_wearing_tab.xml b/indra/newview/skins/minimal/xui/en/menu_wearing_tab.xml
deleted file mode 100644
index fb19c5eb2c..0000000000
--- a/indra/newview/skins/minimal/xui/en/menu_wearing_tab.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<context_menu/>
diff --git a/indra/newview/skins/minimal/xui/en/notification_visibility.xml b/indra/newview/skins/minimal/xui/en/notification_visibility.xml
deleted file mode 100644
index bdd3c3d4a4..0000000000
--- a/indra/newview/skins/minimal/xui/en/notification_visibility.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" ?>
-<notification_visibility>
- <respond name="VoiceInviteGroup" response="Decline"/>
-
- <!-- group and voice are disabled features -->
- <hide tag="group"/>
-
- <!-- no spammy scripts -->
- <!-- <hide name="ScriptDialog"/> -->
-
- <!-- hints pertaining to UI we don't show -->
- <hide name="FirstBalanceIncrease"/>
- <hide name="FirstInventory"/>
- <hide name="HintSidePanel"/>
- <hide name="HintMove"/>
- <hide name="HintSpeak"/>
- <hide name="HintDisplayName"/>
- <hide name="HintInventory"/>
- <hide name="HintLindenDollar"/>
-
- <!-- spam from servers, such as "Autopilot cancelled" -->
- <hide name="SystemMessageTip"/>
-
- <!-- show everything else -->
- <show/>
-</notification_visibility>
-
diff --git a/indra/newview/skins/minimal/xui/en/notifications.xml b/indra/newview/skins/minimal/xui/en/notifications.xml
deleted file mode 100644
index 7b7cdb5fc6..0000000000
--- a/indra/newview/skins/minimal/xui/en/notifications.xml
+++ /dev/null
@@ -1,44 +0,0 @@
-<?xml version="1.0" ?>
-<notifications>
- <notification
- icon="notify.tga"
- name="UserGiveItem"
- type="offer">
- [NAME_SLURL] is offering you [ITEM_SLURL]. Using this item requires you to switch to Advanced mode where you will find the item in your Inventory. To switch to Advanced mode, quit and restart this application and change the mode setting on the login screen.
- <form name="form">
- <button
- index="4"
- name="Show"
- text="Keep Item"/>
- <button
- index="1"
- name="Discard"
- text="Reject Item"/>
- <button
- index="2"
- name="Mute"
- text="Block User"/>
- </form>
- </notification>
- <notification
- icon="notify.tga"
- name="ObjectGiveItem"
- type="offer">
- An object named &lt;nolink&gt;[OBJECTFROMNAME]&lt;/nolink&gt; owned by [NAME_SLURL] is offering you &lt;nolink&gt;[ITEM_SLURL]&lt;/nolink&gt;. Using this item requires you to switch to Advanced mode where you will find the item in your Inventory. To switch to Advanced mode, quit and restart this application and change the mode setting on the login screen.
- <form name="form">
- <button
- index="0"
- name="Keep"
- text="Keep Item"/>
- <button
- index="1"
- name="Discard"
- text="Reject Item"/>
- <button
- index="2"
- name="Mute"
- text="Block Object"/>
- </form>
- </notification>
-
-</notifications>
diff --git a/indra/newview/skins/minimal/xui/en/panel_adhoc_control_panel.xml b/indra/newview/skins/minimal/xui/en/panel_adhoc_control_panel.xml
deleted file mode 100644
index 39d1a90850..0000000000
--- a/indra/newview/skins/minimal/xui/en/panel_adhoc_control_panel.xml
+++ /dev/null
@@ -1,81 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<panel
- border="false"
- follows="all"
- height="215"
- name="panel_im_control_panel"
- width="150">
- <layout_stack
- mouse_opaque="false"
- border_size="0"
- clip="false"
- follows="all"
- height="215"
- layout="topleft"
- left="3"
- name="vertical_stack"
- orientation="vertical"
- top="0"
- width="147">
- <layout_panel
- auto_resize="true"
- follows="top|left"
- height="130"
- layout="topleft"
- left="0"
- min_height="0"
- mouse_opaque="false"
- width="147"
- top="0"
- name="speakers_list_panel"
- user_resize="false">
- <avatar_list
- color="DkGray2"
- follows="all"
- height="130"
- ignore_online_status="true"
- layout="topleft"
- name="speakers_list"
- opaque="false"
- show_info_btn="true"
- show_profile_btn="false"
- show_speaking_indicator="false"
- width="147" />
- </layout_panel>
- <layout_panel
- auto_resize="false"
- follows="top|left|right"
- height="25"
- layout="topleft"
- min_height="25"
- width="130"
- name="call_btn_panel"
- user_resize="false"
- visible="false">
- <button
- follows="all"
- height="20"
- label="Call"
- name="call_btn"
- width="130"
- top="5" />
- </layout_panel>
- <layout_panel
- auto_resize="false"
- follows="top|left|right"
- height="25"
- layout="topleft"
- min_height="25"
- width="130"
- name="end_call_btn_panel"
- user_resize="false"
- visible="false">
- <button
- follows="all"
- height="20"
- label="Leave Call"
- name="end_call_btn"
- top="5"/>
- </layout_panel>
- </layout_stack>
-</panel>
diff --git a/indra/newview/skins/minimal/xui/en/panel_bottomtray.xml b/indra/newview/skins/minimal/xui/en/panel_bottomtray.xml
deleted file mode 100644
index d722c54081..0000000000
--- a/indra/newview/skins/minimal/xui/en/panel_bottomtray.xml
+++ /dev/null
@@ -1,557 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<panel
- background_visible="true"
- bg_alpha_color="DkGray"
- bg_opaque_color="DkGray"
- chrome="true"
- follows="left|bottom|right"
- height="33"
- layout="topleft"
- left="0"
- name="bottom_tray"
- focus_root="true"
- top="28"
- width="1310">
- <string
- name="DragIndicationImageName"
- value="Accordion_ArrowOpened_Off" />
- <string
- name="SpeakBtnToolTip"
- value="Turns microphone on/off" />
- <string
- name="VoiceControlBtnToolTip"
- value="Shows/hides voice control panel" />
- <layout_stack
- border_size="0"
- clip="false"
- follows="all"
- height="28"
- layout="topleft"
- left="0"
- mouse_opaque="false"
- name="toolbar_stack"
- orientation="horizontal"
- top="0"
- width="1310">
- <layout_panel
- auto_resize="false"
- user_resize="false"
- min_width="2"
- width="2" />
- <layout_panel
- auto_resize="false"
- layout="topleft"
- max_width="320"
- min_width="214"
- height="28"
- mouse_opaque="false"
- name="chat_bar_layout_panel"
- user_resize="true"
- width="312" >
- <panel
- name="chat_bar"
- filename="panel_nearby_chat_bar.xml"
- left="0"
- height="28"
- width="306"
- top="0"
- mouse_opaque="false"
- follows="left|right"
- />
- </layout_panel>
- <layout_panel
- auto_resize="false"
- follows="left|right"
- height="28"
- layout="topleft"
- min_height="28"
- min_width="35"
- mouse_opaque="false"
- name="speak_panel"
- top_delta="0"
- user_resize="false"
- width="85">
- <button
- follows="left|right"
- height="23"
- layout="topleft"
- label="Speak"
- left="0"
- name="speak_btn"
- tool_tip="Turn your microphone on and off"
- pad_right="30"
- halign="center"
- use_ellipses="true"
- tab_stop="true"
- is_toggle="true"
- image_selected="Speak_Btn_Selected_Press"
- image_unselected="Speak_Btn_Off"
- image_pressed="Speak_Btn_Selected_Press"
- image_pressed_selected="Speak_Btn_Selected_Press"
- top="5"
- width="85">
-
- <commit_callback
- function="ToggleSpeak"
- parameter="f1_help" />
- </button>
- </layout_panel>
-
- <layout_panel
- auto_resize="false"
- follows="left|right"
- height="28"
- layout="topleft"
- min_height="28"
- min_width="20"
- mouse_opaque="false"
- name="speak_flyout_panel"
- top_delta="0"
- user_resize="false"
- width="26">
- <button
- follows="left|right"
- width="20"
- top="5"
- left="0"
- height="23"
- name="flyout_btn"
- label=""
- tab_stop="false"
- tool_tip="Change your sound preferences"
- is_toggle="true"
- image_disabled="ComboButton_UpOff"
- image_unselected="ComboButton_UpOff"
- image_selected="ComboButton_On"
- image_pressed="ComboButton_UpSelected"
- image_pressed_selected="ComboButton_Selected">
- <init_callback
- function="Button.SetDockableFloaterToggle"
- parameter="sound_devices" />
- </button>
-
- </layout_panel>
-
- <layout_panel
- auto_resize="false"
- follows="right"
- height="28"
- layout="topleft"
- min_height="28"
- min_width="65"
- mouse_opaque="false"
- name="gesture_panel"
- top_delta="0"
- user_resize="false"
- width="88">
- <gesture_combo_list
- follows="left|right"
- height="23"
- label="Gesture"
- layout="topleft"
- get_more="false"
- view_all="false"
- left="0"
- name="Gesture"
- tool_tip="Make your avatar do things"
- top="5"
- width="82">
- <combo_button
- pad_right="10"
- can_drag="false"
- use_ellipses="true" />
- <combo_list
- page_lines="17" />
- </gesture_combo_list>
- </layout_panel>
- <layout_panel
- auto_resize="false"
- follows="left|right"
- height="28"
- layout="topleft"
- min_height="28"
- min_width="52"
- mouse_opaque="false"
- name="cam_panel"
- user_resize="false"
- width="86">
- <bottomtray_button
- can_drag="false"
- follows="left|right"
- height="23"
- image_pressed="PushButton_Press"
- image_pressed_selected="PushButton_Selected_Press"
- image_selected="PushButton_Selected_Press"
- is_toggle="true"
- label="View"
- layout="topleft"
- left="0"
- name="camera_btn"
- tool_tip="Control your camera angle"
- top="5"
- use_ellipses="true"
- width="80">
- <init_callback
- function="Button.SetDockableFloaterToggle"
- parameter="camera" />
- </bottomtray_button>
- </layout_panel>
- <layout_panel
- auto_resize="false"
- follows="left|right"
- height="28"
- layout="topleft"
- min_width="8"
- name="splitter_panel_1"
- user_resize="false"
- width="8">
- <icon
- follows="left|bottom"
- height="18"
- width="2"
- left="0"
- image_name="Button_Separator"
- name="separator"
- top="7"/>
- </layout_panel>
- <layout_panel
- auto_resize="false"
- follows="left|right"
- height="28"
- layout="topleft"
- min_height="28"
- min_width="83"
- mouse_opaque="false"
- name="destinations_panel"
- user_resize="false"
- width="106">
- <bottomtray_button
- can_drag="false"
- follows="left|right"
- height="23"
- image_pressed="PushButton_Press"
- image_pressed_selected="PushButton_Selected_Press"
- image_selected="PushButton_Selected_Press"
- label="Destinations"
- layout="topleft"
- left="0"
- name="destination_btn"
- tool_tip="Travel through Second Life"
- top="5"
- is_toggle="true"
- use_ellipses="true"
- width="100">
- <bottomtray_button.commit_callback
- function="Destination.show" />
- </bottomtray_button>
- </layout_panel>
- <layout_panel
- auto_resize="false"
- follows="left|right"
- height="28"
- layout="topleft"
- min_height="28"
- min_width="73"
- mouse_opaque="false"
- name="avatar_panel"
- user_resize="false"
- width="106">
- <bottomtray_button
- can_drag="false"
- follows="left|right"
- height="23"
- image_pressed="PushButton_Press"
- image_pressed_selected="PushButton_Selected_Press"
- image_selected="PushButton_Selected_Press"
- label="My Avatar"
- layout="topleft"
- left="0"
- name="avatar_btn"
- top="5"
- is_toggle="true"
- tool_tip="Change your appearance"
- use_ellipses="true"
- width="100">
- <bottomtray_button.commit_callback
- function="Avatar.show" />
- </bottomtray_button>
- </layout_panel>
- <layout_panel
- auto_resize="false"
- follows="left|right"
- height="28"
- layout="topleft"
- min_width="8"
- name="splitter_panel_2"
- user_resize="false"
- width="8">
- <icon
- follows="left|bottom"
- height="18"
- width="2"
- left="0"
- image_name="Button_Separator"
- name="separator"
- top="7"/>
- </layout_panel>
- <layout_panel
- auto_resize="false"
- follows="right"
- height="28"
- layout="topleft"
- min_height="28"
- min_width="65"
- mouse_opaque="false"
- name="people_panel"
- top_delta="0"
- user_resize="false"
- width="106">
- <bottomtray_button
- can_drag="false"
- follows="left|right"
- height="23"
- image_pressed="PushButton_Press"
- image_pressed_selected="PushButton_Selected_Press"
- image_selected="PushButton_Selected_Press"
- label="People"
- layout="topleft"
- left="0"
- name="show_people_button"
- tool_tip="Find people in Second Life"
- top="5"
- is_toggle="true"
- use_ellipses="true"
- width="100">
- <bottomtray_button.commit_callback
- function="ShowSidetrayPanel"
- parameter="panel_people" />
- </bottomtray_button>
- </layout_panel>
- <layout_panel
- auto_resize="false"
- follows="right"
- height="28"
- layout="topleft"
- min_height="28"
- min_width="65"
- mouse_opaque="false"
- name="profile_panel"
- top_delta="0"
- user_resize="false"
- width="106">
- <bottomtray_button
- can_drag="false"
- follows="left|right"
- height="23"
- image_pressed="PushButton_Press"
- image_pressed_selected="PushButton_Selected_Press"
- image_selected="PushButton_Selected_Press"
- label="Profile"
- layout="topleft"
- left="0"
- name="show_profile_btn"
- tool_tip="View and edit your Profile"
- is_toggle="true"
- top="5"
- use_ellipses="true"
- width="100">
- <bottomtray_button.commit_callback
- function="ToggleAgentProfile"
- parameter="agent"/>
- </bottomtray_button>
- </layout_panel>
- <layout_panel
- auto_resize="false"
- follows="right"
- height="28"
- layout="topleft"
- min_height="28"
- min_width="65"
- mouse_opaque="false"
- name="howto_panel"
- top_delta="0"
- user_resize="false"
- width="106">
- <bottomtray_button
- can_drag="false"
- follows="left|right"
- height="23"
- image_pressed="PushButton_Press"
- image_pressed_selected="PushButton_Selected_Press"
- image_selected="PushButton_Selected_Press"
- label="How To"
- layout="topleft"
- left="0"
- name="show_help_btn"
- tool_tip="View Second Life help info"
- is_toggle="true"
- top="5"
- use_ellipses="true"
- width="100">
- <bottomtray_button.commit_callback
- function="ToggleHelp"
- parameter="f1_help" />
- </bottomtray_button>
- </layout_panel>
- <layout_panel
- follows="left|right"
- height="30"
- layout="topleft"
- min_width="95"
- mouse_opaque="false"
- name="chiclet_list_panel"
- top="0"
- user_resize="false"
- width="189">
- <!--*NOTE: min_width of the chiclet_panel (chiclet_list) must be the same
-as for parent layout_panel (chiclet_list_panel) to resize bottom tray properly. EXT-991-->
- <chiclet_panel
- chiclet_padding="4"
- follows="left|right"
- height="24"
- layout="topleft"
- left="1"
- min_width="95"
- mouse_opaque="false"
- name="chiclet_list"
- top="7"
- width="189">
- <button
- auto_resize="true"
- follows="right"
- height="29"
- image_hover_selected="SegmentedBtn_Left_Over"
- image_hover_unselected="SegmentedBtn_Left_Over"
- image_overlay="Arrow_Small_Left"
- image_pressed="SegmentedBtn_Left_Press"
- image_pressed_selected="SegmentedBtn_Left_Press"
- image_selected="SegmentedBtn_Left_Off"
- image_unselected="SegmentedBtn_Left_Off"
- layout="topleft"
- name="chicklet_left_scroll_button"
- tab_stop="false"
- top="-28"
- visible="false"
- width="7" />
- <button
- auto_resize="true"
- follows="right"
- height="29"
- image_hover_selected="SegmentedBtn_Right_Over"
- image_hover_unselected="SegmentedBtn_Right_Over"
- image_overlay="Arrow_Small_Right"
- image_pressed="SegmentedBtn_Right_Press"
- image_pressed_selected="SegmentedBtn_Right_Press"
- image_selected="SegmentedBtn_Right_Off"
- image_unselected="SegmentedBtn_Right_Off"
- layout="topleft"
- name="chicklet_right_scroll_button"
- tab_stop="false"
- top="-28"
- visible="false"
- width="7" />
- </chiclet_panel>
- </layout_panel>
- <layout_panel auto_resize="false"
- user_resize="false"
- width="4"
- min_width="4"/>
- <layout_panel
- auto_resize="false"
- follows="right"
- height="28"
- layout="topleft"
- min_height="28"
- min_width="37"
- name="im_well_panel"
- top="0"
- user_resize="false"
- width="37">
- <chiclet_im_well
- follows="right"
- height="28"
- layout="topleft"
- left="0"
- max_displayed_count="99"
- name="im_well"
- top="0"
- width="35">
- <!--
-Emulate 4 states of button by background images, see details in EXT-3147. The same should be for notification_well button
-xml attribute Description
-image_unselected "Unlit" - there are no new messages
-image_selected "Unlit" + "Selected" - there are no new messages and the Well is open
-image_pressed "Lit" - there are new messages
-image_pressed_selected "Lit" + "Selected" - there are new messages and the Well is open
- -->
- <button
- auto_resize="true"
- follows="right"
- halign="center"
- height="23"
- image_overlay="Unread_IM"
- image_overlay_alignment="center"
- image_pressed="WellButton_Lit"
- image_pressed_selected="WellButton_Lit_Selected"
- image_selected="PushButton_Press"
- label_color="Black"
- left="0"
- name="Unread IM messages"
- tool_tip="Conversations"
- width="34">
- <init_callback
- function="Button.SetDockableFloaterToggle"
- parameter="im_well_window" />
- </button>
- </chiclet_im_well>
- </layout_panel>
- <layout_panel
- auto_resize="false"
- follows="right"
- height="28"
- layout="topleft"
- min_height="28"
- min_width="37"
- name="notification_well_panel"
- top="0"
- user_resize="false"
- width="37">
- <chiclet_notification
- follows="right"
- height="23"
- layout="topleft"
- left="0"
- max_displayed_count="99"
- name="notification_well"
- top="5"
- width="35">
- <button
- auto_resize="true"
- bottom_pad="3"
- follows="right"
- halign="center"
- height="23"
- image_overlay="Notices_Unread"
- image_overlay_alignment="center"
- image_pressed="WellButton_Lit"
- image_pressed_selected="WellButton_Lit_Selected"
- image_selected="PushButton_Press"
- label_color="Black"
- left="0"
- name="Unread"
- tool_tip="Notifications"
- width="34">
- <init_callback
- function="Button.SetDockableFloaterToggle"
- parameter="notification_well_window" />
- </button>
- </chiclet_notification>
- </layout_panel>
- <layout_panel
- auto_resize="false"
- user_resize="false"
- min_width="4"
- name="DUMMY2"
- width="8" />
- </layout_stack>
-</panel>
diff --git a/indra/newview/skins/minimal/xui/en/panel_group_control_panel.xml b/indra/newview/skins/minimal/xui/en/panel_group_control_panel.xml
deleted file mode 100644
index abddc59296..0000000000
--- a/indra/newview/skins/minimal/xui/en/panel_group_control_panel.xml
+++ /dev/null
@@ -1,79 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<panel
- border="false"
- follows="all"
- height="238"
- name="panel_im_control_panel"
- width="150">
- <layout_stack
- mouse_opaque="false"
- border_size="0"
- clip="false"
- follows="all"
- height="238"
- layout="topleft"
- left="5"
- name="vertical_stack"
- orientation="vertical"
- top="0"
- width="145">
- <layout_panel
- auto_resize="true"
- follows="top|left"
- height="100"
- layout="topleft"
- min_height="0"
- mouse_opaque="false"
- width="145"
- top="0"
- name="speakers_list_panel"
- user_resize="false">
- <avatar_list
- color="DkGray2"
- follows="all"
- height="100"
- ignore_online_status="true"
- layout="topleft"
- name="speakers_list"
- opaque="false"
- show_info_btn="true"
- show_profile_btn="false"
- show_speaking_indicator="false"
- width="145" />
- </layout_panel>
- <layout_panel
- auto_resize="false"
- follows="top|left|right"
- height="28"
- layout="topleft"
- min_height="28"
- width="130"
- name="end_call_btn_panel"
- user_resize="false"
- visible="false">
- <button
- follows="all"
- height="23"
- label="Leave Call"
- name="end_call_btn"
- use_ellipses="true" />
- </layout_panel>
- <layout_panel
- auto_resize="false"
- follows="top|left|right"
- height="28"
- layout="topleft"
- min_height="28"
- width="130"
- name="voice_ctrls_btn_panel"
- user_resize="false"
- visible="false">
- <button
- follows="all"
- height="23"
- label="Open Voice Controls"
- name="voice_ctrls_btn"
- use_ellipses="true" />
- </layout_panel>
- </layout_stack>
-</panel>
diff --git a/indra/newview/skins/minimal/xui/en/panel_im_control_panel.xml b/indra/newview/skins/minimal/xui/en/panel_im_control_panel.xml
deleted file mode 100644
index 2cb77bcdf3..0000000000
--- a/indra/newview/skins/minimal/xui/en/panel_im_control_panel.xml
+++ /dev/null
@@ -1,194 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<panel
- border="false"
- height="300"
- name="panel_im_control_panel"
- width="150">
- <avatar_icon
- follows="left|top"
- height="105"
- left_delta="20"
- name="avatar_icon"
- top="-5"
- width="114"/>
- <layout_stack
- mouse_opaque="false"
- border_size="0"
- clip="false"
- follows="all"
- height="183"
- layout="topleft"
- left="5"
- name="button_stack"
- orientation="vertical"
- top_pad="5"
- width="145">
- <layout_panel
- auto_resize="false"
- follows="top|left|right"
- height="20"
- layout="topleft"
- left="2"
- min_height="20"
- width="140"
- name="view_profile_btn_panel"
- top="0"
- user_resize="false">
- <button
- follows="left|top|right"
- height="23"
- label="Profile"
- name="view_profile_btn"
- top="0"
- width="140" />
- </layout_panel>
- <layout_panel
- auto_resize="false"
- follows="top|left|right"
- height="25"
- layout="topleft"
- min_height="25"
- width="140"
- name="add_friend_btn_panel"
- user_resize="false">
- <button
- follows="left|top|right"
- height="23"
- label="Add Friend"
- name="add_friend_btn"
- top="5"
- width="140" />
- </layout_panel>
- <layout_panel
- auto_resize="false"
- follows="top|left|right"
- height="25"
- layout="topleft"
- min_height="25"
- width="140"
- name="teleport_btn_panel"
- user_resize="false">
- <button
- auto_resize="false"
- follows="left|top|right"
- height="23"
- label="Teleport"
- name="teleport_btn"
- tool_tip = "Offer to teleport this person"
- width="140" />
- </layout_panel>
- <layout_panel
- auto_resize="false"
- follows="top|left|right"
- height="25"
- layout="topleft"
- min_height="25"
- width="140"
- name="call_btn_panel"
- user_resize="false">
- <button
- follows="left|top|right"
- height="23"
- label="Call"
- name="call_btn"
- width="140" />
- </layout_panel>
- <layout_panel
- auto_resize="false"
- follows="top|left|right"
- height="25"
- layout="topleft"
- min_height="25"
- width="140"
- name="end_call_btn_panel"
- user_resize="false"
- visible="false">
- <button
- follows="left|top|right"
- height="23"
- label="End Call"
- name="end_call_btn"
- width="140" />
- </layout_panel>
- <layout_panel
- auto_resize="false"
- follows="top|left|right"
- height="25"
- layout="topleft"
- min_height="25"
- width="140"
- name="block_btn_panel"
- user_resize="false">
- <button
- follows="left|top|right"
- height="23"
- label="Block"
- name="block_btn"
- width="140" />
- </layout_panel>
- <layout_panel
- auto_resize="false"
- follows="top|left|right"
- height="25"
- layout="topleft"
- min_height="25"
- width="140"
- name="unblock_btn_panel"
- user_resize="false"
- visible="false">
- <button
- follows="left|top|right"
- height="23"
- label="Unblock"
- name="unblock_btn"
- width="140" />
- </layout_panel>
- <layout_panel
- auto_resize="false"
- follows="top|left|right"
- height="25"
- layout="topleft"
- min_height="54"
- width="140"
- name="volume_ctrl_panel"
- visible="false"
- user_resize="false">
- <slider
- follows="top|left"
- height="23"
- increment="0.01"
- left="0"
- max_val="0.95"
- min_val="0.05"
- name="volume_slider"
- show_text="false"
- tool_tip="Call Volume"
- top_pad="32"
- value="0.5"
- width="125" />
- <button
- follows="top|left"
- height="16"
- image_disabled="Audio_Off"
- image_disabled_selected="AudioMute_Off"
- image_hover_selected="AudioMute_Over"
- image_selected="AudioMute_Off"
- image_unselected="Audio_Off"
- is_toggle="true"
- left_pad="0"
- top_delta="4"
- name="mute_btn"
- width="16" />
- </layout_panel>
- <layout_panel
- mouse_opaque="false"
- auto_resize="true"
- follows="top|left"
- height="0"
- layout="topleft"
- min_height="0"
- width="140"
- name="spacer"
- user_resize="false" />
- </layout_stack>
-</panel>
diff --git a/indra/newview/skins/minimal/xui/en/panel_login.xml b/indra/newview/skins/minimal/xui/en/panel_login.xml
deleted file mode 100644
index 40d2df78e1..0000000000
--- a/indra/newview/skins/minimal/xui/en/panel_login.xml
+++ /dev/null
@@ -1,205 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<panel
-follows="all"
-height="600"
-layout="topleft"
-left="0"
-name="panel_login"
-focus_root="true"
-top="600"
- width="996">
-<panel.string
- name="create_account_url">
- http://join.secondlife.com/
-</panel.string>
-<string name="reg_in_client_url" translate="false">
- http://secondlife.eniac15.lindenlab.com/reg-in-client/
-</string>
-<panel.string
- name="forgot_password_url">
- http://secondlife.com/account/request.php
-</panel.string>
-<!-- *NOTE: Custom resize logic for login_html in llpanellogin.cpp -->
-<web_browser
- tab_stop="false"
-trusted_content="true"
-bg_opaque_color="Black"
-border_visible="false"
-bottom="600"
-follows="all"
-hide_loading="true"
-left="0"
-name="login_html"
-start_url=""
-top="0"
-height="600"
- width="980" />
-<layout_stack
-follows="left|bottom|right"
-name="login_widgets"
-layout="topleft"
-orientation="horizontal"
-top="519"
-width="996"
-height="80">
-<layout_panel
-auto_resize="false"
-follows="left|bottom"
-name="login"
-layout="topleft"
-width="570"
-min_width="570"
-user_resize="false"
-height="80">
-<text
-follows="left|bottom"
-font="SansSerifSmall"
-height="16"
-name="username_text"
-top="20"
-left="20"
-width="150">
-Username:
-</text>
- <combo_box
- allow_text_entry="true"
- follows="left|bottom"
- height="22"
- left_delta="0"
- max_chars="128"
- combo_editor.prevalidate_callback="ascii"
- tool_tip="The username you chose when you registered, like bobsmith12 or Steller Sunshine"
- top_pad="0"
- name="username_combo"
- width="178">
- <combo_box.combo_button
- visible ="false"/>
- <combo_box.drop_down_button
- visible ="false"/>
- </combo_box>
-<text
-follows="left|bottom"
-font="SansSerifSmall"
-height="15"
-left_pad="-19"
-name="password_text"
-top="20"
- width="150">
- Password:
-</text>
-<line_editor
-follows="left|bottom"
- height="22"
-left_delta="0"
- max_length_bytes="16"
-name="password_edit"
-is_password="true"
-select_on_focus="true"
- top_pad="0"
- width="135" />
- <check_box
-control_name="RememberPassword"
-follows="left|bottom"
-font="SansSerifSmall"
-height="16"
-label="Remember password"
- top_pad="3"
- name="remember_check"
- width="135" />
-<button
- follows="left|bottom"
- height="23"
- image_unselected="PushButton_On"
- image_selected="PushButton_On_Selected"
- label="Log In"
- label_color="White"
- layout="topleft"
- left_pad="10"
- name="connect_btn"
- top="35"
- width="90" />
- <text
- follows="left|bottom"
- font="SansSerifSmall"
- height="15"
- left_pad="10"
- name="mode_selection_text"
- top="20"
- width="130">
- Mode:
- </text>
- <combo_box
- follows="left|bottom"
- height="23"
- max_chars="128"
- tool_tip="Select your mode. Choose Basic for fast, easy exploration and chat. Choose Advanced to access more features."
- top_pad="0"
- name="mode_combo"
- width="110">
- <combo_box.item
- label="Basic"
- name="Basic"
- value="settings_minimal.xml" />
- <combo_box.item
- label="Advanced"
- name="Advanced"
- value="" />
- </combo_box>
-</layout_panel>
-<layout_panel
-tab_stop="false"
-follows="right|bottom"
-name="links"
-width="205"
-min_width="205"
-user_resize="false"
-height="80">
- <text
-follows="right|bottom"
-font="SansSerifSmall"
-text_color="EmphasisColor"
-halign="right"
-height="16"
-top="12"
-right="-10"
-name="create_new_account_text"
- width="200">
- Sign up
- </text>
-<text
-follows="right|bottom"
-font="SansSerifSmall"
-text_color="EmphasisColor"
-halign="right"
-height="16"
-name="forgot_password_text"
-top_pad="12"
-right="-10"
- width="200">
- Forgot your username or password?
-</text>
-<text
-follows="right|bottom"
-font="SansSerifSmall"
-text_color="EmphasisColor"
-halign="right"
-height="16"
-name="login_help"
-top_pad="2"
-right="-10"
- width="200">
- Need help logging in? </text>
-<!-- <text
- follows="right|bottom"
- font="SansSerifSmall"
- halign="right"
- height="28"
- top_pad="2"
- name="channel_text"
- width="180"
- word_wrap="true">
- [VERSION]
- </text>-->
- </layout_panel>
-</layout_stack>
-</panel>
diff --git a/indra/newview/skins/minimal/xui/en/panel_navigation_bar.xml b/indra/newview/skins/minimal/xui/en/panel_navigation_bar.xml
deleted file mode 100644
index 73a8564274..0000000000
--- a/indra/newview/skins/minimal/xui/en/panel_navigation_bar.xml
+++ /dev/null
@@ -1,76 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<panel
- background_opaque="true"
- background_visible="true"
- bg_opaque_color="MouseGray"
- follows="left|top|right"
- height="26"
- layout="topleft"
- name="navigation_bar"
- chrome="true"
- width="600">
- <icon
- follows="all"
- image_name="NavBar_BG_NoFav_Bevel"
- mouse_opaque="false"
- name="bg_icon_no_fav_bevel"
- scale_image="true"
- visible="true"
- left="0"
- top="0"
- height="26"
- width="600"/>
- <panel
- background_visible="false"
- follows="left|top|right"
- top="3"
- height="26"
- layout="topleft"
- name="navigation_panel"
- width="600">
- <pull_button
-follows="left|top"
-direction="down"
-height="23"
-image_overlay="Arrow_Left_Off"
-image_bottom_pad="1"
-layout="topleft"
-left="10"
-name="back_btn"
-tool_tip="Go back to previous location"
-top="2"
-width="31" />
- <pull_button
- follows="left|top"
- direction="down"
- height="23"
- image_overlay="Arrow_Right_Off"
- image_bottom_pad="1"
- layout="topleft"
- left_pad="0"
- name="forward_btn"
- tool_tip="Go forward one location"
- top_delta="0"
- width="31" />
- <location_input
- follows="left|right|top"
- halign="right"
- height="23"
- label="Location"
- layout="topleft"
- left_pad="7"
- max_chars="254"
- mouse_opaque="false"
- name="location_combo"
- top_delta="0"
- width="325">
- </location_input>
- <icon follows="right"
- height="20"
- width="2"
- left_pad="2"
- image_name="Button_Separator"
- name="separator"
- top="2"/>
- </panel>
-</panel>
diff --git a/indra/newview/skins/minimal/xui/en/panel_people.xml b/indra/newview/skins/minimal/xui/en/panel_people.xml
deleted file mode 100644
index 4739f86e95..0000000000
--- a/indra/newview/skins/minimal/xui/en/panel_people.xml
+++ /dev/null
@@ -1,571 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<!-- Side tray panel -->
-<panel
- default_tab_group="1"
- follows="all"
- height="449"
- label="People"
- layout="topleft"
- left="0"
- min_height="350"
- name="people_panel"
- top="0"
- width="333">
- <string
- name="no_recent_people"
- value="No recent people. Looking for people to hang out with? Try the Destinations button below." />
- <string
- name="no_filtered_recent_people"
- value="No recent people with that name." />
- <string
- name="no_one_near"
- value="No one nearby. Looking for people to hang out with? Try the Destinations button below." />
- <string
- name="no_one_filtered_near"
- value="No one nearby with that name." />
- <string
- name="no_friends_online"
- value="No friends online" />
- <string
- name="no_friends"
- value="No friends" />
- <string
- name="no_friends_msg">
- Right-click on a Resident to add them as a friend.
-Looking for people to hang out with? Try the Destinations button below.
- </string>
- <string
- name="no_filtered_friends_msg">
- Didn't find what you're looking for? Try the Destinations button below..
- </string>
- <string
- name="people_filter_label"
- value="Filter People" />
- <string
- name="groups_filter_label"
- value="Filter Groups" />
- <!--
- *WORKAROUND: for group_list.no_items_msg & group_list.no_filtered_items_msg attributes.
- They are not defined as translatable in VLT. See EXT-5931
- -->
- <string
- name="no_filtered_groups_msg"
- value="Didn't find what you're looking for? Try [secondlife:///app/search/groups/[SEARCH_TERM] Search]." />
- <string
- name="no_groups_msg"
- value="Looking for Groups to join? Try [secondlife:///app/search/groups Search]." />
- <string
- name="MiniMapToolTipMsg"
- value="[REGION](Double-click to open Map, shift-drag to pan)"/>
- <string
- name="AltMiniMapToolTipMsg"
- value="[REGION](Double-click to teleport, shift-drag to pan)"/>
- <filter_editor
- follows="left|top|right"
- height="23"
- layout="topleft"
- left="10"
- label="Filter"
- max_length="300"
- name="filter_input"
- text_color="Black"
- text_pad_left="10"
- top="3"
- width="303" />
- <tab_container
- follows="all"
- height="383"
- layout="topleft"
- left="5"
- name="tabs"
- tab_group="1"
- tab_min_width="70"
- tab_height="30"
- tab_position="top"
- top_pad="10"
- halign="center"
- width="317">
- <panel
- background_opaque="true"
- background_visible="true"
- bg_alpha_color="DkGray"
- bg_opaque_color="DkGray"
- follows="all"
- height="383"
- label="NEARBY"
- layout="topleft"
- left="0"
- help_topic="people_nearby_tab"
- name="nearby_panel"
- top="0"
- width="313">
- <net_map
- bg_color="NetMapBackgroundColor"
- follows="top|left|right"
- layout="topleft"
- left="3"
- mouse_opaque="false"
- name="Net Map"
- width="307"
- height="140"
- top="0"/>
- <avatar_list
- allow_select="true"
- follows="top|left|bottom|right"
- height="216"
- ignore_online_status="true"
- layout="topleft"
- left="3"
- multi_select="true"
- name="avatar_list"
- top="145"
- width="307" />
- <panel
- background_visible="true"
- follows="left|right|bottom"
- height="27"
- label="bottom_panel"
- layout="topleft"
- left="3"
- name="bottom_panel"
- top_pad="0"
- width="313">
- <icon
- follows="bottom|left|right"
- height="25"
- image_name="Toolbar_Right_Off"
- layout="topleft"
- left_pad="1"
- name="dummy_icon"
- width="241"
- />
- </panel>
- </panel>
- <panel
- background_opaque="true"
- background_visible="true"
- bg_alpha_color="DkGray"
- bg_opaque_color="DkGray"
- follows="all"
- height="383"
- label="MY FRIENDS"
- layout="topleft"
- left="0"
- help_topic="people_friends_tab"
- name="friends_panel"
- top="0"
- width="313">
- <accordion
- background_visible="true"
- bg_alpha_color="DkGray2"
- bg_opaque_color="DkGray2"
- follows="all"
- height="356"
- layout="topleft"
- left="3"
- name="friends_accordion"
- top="0"
- width="307">
- <accordion_tab
- layout="topleft"
- height="172"
- min_height="150"
- name="tab_online"
- title="Online">
- <avatar_list
- allow_select="true"
- follows="all"
- height="172"
- layout="topleft"
- left="0"
- multi_select="true"
- name="avatars_online"
- show_permissions_granted="true"
- top="0"
- width="307" />
- </accordion_tab>
- <accordion_tab
- layout="topleft"
- height="173"
- name="tab_all"
- title="All">
- <avatar_list
- allow_select="true"
- follows="all"
- height="173"
- layout="topleft"
- left="0"
- multi_select="true"
- name="avatars_all"
- show_permissions_granted="true"
- top="0"
- width="307" />
- </accordion_tab>
- </accordion>
- <panel
- background_visible="true"
- follows="left|right|bottom"
- height="27"
- label="bottom_panel"
- layout="topleft"
- left="3"
- name="bottom_panel"
- top_pad="0"
- width="313">
-
- <layout_stack
- animate="false"
- border_size="0"
- follows="left|right|bottom"
- height="25"
- layout="topleft"
- orientation="horizontal"
- top_pad="1"
- left="0"
- name="bottom_panel"
- width="305">
- <layout_panel
- auto_resize="true"
- height="25"
- layout="topleft"
- name="dummy_panel"
- user_resize="false"
- width="212">
- <icon
- follows="bottom|left|right"
- height="25"
- image_name="Toolbar_Middle_Off"
- layout="topleft"
- left="0"
- top="0"
- name="dummy_icon"
- width="211" />
- </layout_panel>
- <layout_panel
- auto_resize="false"
- height="25"
- layout="topleft"
- name="trash_btn_panel"
- user_resize="false"
- width="31">
- <dnd_button
- follows="bottom|left"
- height="25"
- image_hover_unselected="Toolbar_Right_Over"
- image_overlay="TrashItem_Off"
- image_selected="Toolbar_Right_Selected"
- image_unselected="Toolbar_Right_Off"
- left="0"
- layout="topleft"
- name="del_btn"
- tool_tip="Remove selected person from your Friends list"
- top="0"
- width="31"/>
- </layout_panel>
- </layout_stack><!--
-
- <button
- follows="bottom|left"
- tool_tip="Options"
- height="25"
- image_hover_unselected="Toolbar_Left_Over"
- image_overlay="OptionsMenu_Off"
- image_selected="Toolbar_Left_Selected"
- image_unselected="Toolbar_Left_Off"
- layout="topleft"
- left="0"
- name="friends_viewsort_btn"
- top="1"
- width="31" />
- <button
- follows="bottom|left"
- height="25"
- image_hover_unselected="Toolbar_Middle_Over"
- image_overlay="AddItem_Off"
- image_selected="Toolbar_Middle_Selected"
- image_unselected="Toolbar_Middle_Off"
- layout="topleft"
- left_pad="1"
- name="add_btn"
- tool_tip="Offer friendship to a Resident"
- width="31" />
- <icon
- follows="bottom|left|right"
- height="25"
- image_name="Toolbar_Middle_Off"
- layout="topleft"
- left_pad="1"
- name="dummy_icon"
- width="209"
- />
- <button
- follows="bottom|left"
- height="25"
- image_hover_unselected="Toolbar_Right_Over"
- image_overlay="TrashItem_Off"
- image_selected="Toolbar_Right_Selected"
- image_unselected="Toolbar_Right_Off"
- layout="topleft"
- left_pad="1"
- name="del_btn"
- tool_tip="Remove selected person from your Friends list"
- width="31" />
- --></panel>
- <text
- follows="all"
- height="450"
- left="13"
- name="no_friends_help_text"
- top="10"
- width="293"
- wrap="true" />
- </panel>
- <panel
- background_opaque="true"
- background_visible="true"
- bg_alpha_color="DkGray"
- bg_opaque_color="DkGray"
- follows="all"
- height="383"
- label="RECENT"
- layout="topleft"
- left="0"
- help_topic="people_recent_tab"
- name="recent_panel"
- top="0"
- width="313">
- <avatar_list
- allow_select="true"
- follows="all"
- height="356"
- layout="topleft"
- left="3"
- multi_select="true"
- name="avatar_list"
- show_last_interaction_time="true"
- top="0"
- width="307" />
- <panel
- background_visible="true"
- follows="left|right|bottom"
- height="27"
- label="bottom_panel"
- layout="topleft"
- left="0"
- name="bottom_panel"
- top_pad="0"
- width="313">
- <button
- follows="bottom|left"
- height="25"
- image_hover_unselected="Toolbar_Middle_Over"
- image_overlay="AddItem_Off"
- image_selected="Toolbar_Middle_Selected"
- image_unselected="Toolbar_Middle_Off"
- layout="topleft"
- left_pad="1"
- name="add_friend_btn"
- tool_tip="Add selected Resident to your friends List"
- width="31">
- <commit_callback
- function="People.addFriend" />
- </button>
- <icon
- follows="bottom|left|right"
- height="25"
- image_name="Toolbar_Right_Off"
- layout="topleft"
- left_pad="1"
- name="dummy_icon"
- width="241"
- />
- </panel>
- </panel>
- </tab_container>
- <panel
- follows="bottom|left|right"
- height="23"
- layout="topleft"
- left="8"
- top_pad="4"
- name="button_bar"
- width="313">
-
-<!--********************************Profile; IM; Call, Share, Teleport********************************-->
- <layout_stack
- follows="bottom|left|right"
- height="23"
- layout="topleft"
- name="bottom_bar_ls"
- left="0"
- orientation="horizontal"
- top_pad="0"
- width="313">
-
- <layout_panel
- follows="bottom|left|right"
- height="23"
- layout="bottomleft"
- left="0"
- name="view_profile_btn_lp"
- user_resize="false"
- auto_resize="true"
- width="68">
- <button
- follows="bottom|left|right"
- height="23"
- label="Profile"
- layout="topleft"
- left="1"
- name="view_profile_btn"
- tool_tip="Show picture, groups, and other Residents information"
- top="0"
- width="67" />
- </layout_panel>
-
- <layout_panel
- follows="bottom|left|right"
- height="23"
- layout="bottomleft"
- left_pad="3"
- name="im_btn_lp"
- user_resize="false"
- auto_resize="true"
- width="41">
- <button
- follows="bottom|left|right"
- left="1"
- height="23"
- label="IM"
- layout="topleft"
- name="im_btn"
- tool_tip="Open instant message session"
- top="0"
- width="40" />
- </layout_panel>
-
- <layout_panel
- follows="bottom|left|right"
- height="23"
- layout="bottomleft"
- left_pad="3"
- name="call_btn_lp"
- user_resize="false"
- auto_resize="true"
- width="52">
- <button
- follows="bottom|left|right"
- left="1"
- height="23"
- label="Call"
- layout="topleft"
- name="call_btn"
- tool_tip="Call this Resident"
- top="0"
- width="51" />
- </layout_panel>
-
- <layout_panel
- follows="bottom|left|right"
- height="23"
- layout="bottomleft"
- left_pad="3"
- name="teleport_btn_lp"
- user_resize="false"
- auto_resize="true"
- width="77">
- <button
- follows="bottom|left|right"
- left="1"
- height="23"
- label="Teleport"
- layout="topleft"
- name="teleport_btn"
- tool_tip="Offer teleport"
- top="0"
- width="76" />
- </layout_panel>
- </layout_stack>
-
-<!--********************************Group Profile; Group Chat; Group Call buttons************************-->
- <layout_stack
- follows="bottom|left|right"
- height="23"
- layout="topleft"
- mouse_opaque="false"
- name="bottom_bar_ls1"
- left="0"
- orientation="horizontal"
- top="0"
- width="313">
- <layout_panel
- follows="bottom|left|right"
- height="23"
- layout="bottomleft"
- left="0"
- mouse_opaque="false"
- name="group_info_btn_lp"
- user_resize="false"
- auto_resize="true"
- width="108">
- <button
- follows="bottom|left|right"
- left="1"
- height="23"
- label="Group Profile"
- layout="topleft"
- mouse_opaque="false"
- name="group_info_btn"
- tool_tip="Show group information"
- top="0"
- width="107" />
- </layout_panel>
-
- <layout_panel
- follows="bottom|left|right"
- height="23"
- layout="bottomleft"
- left_pad="3"
- mouse_opaque="false"
- name="chat_btn_lp"
- user_resize="false"
- auto_resize="true"
- width="101">
- <button
- follows="bottom|left|right"
- left="1"
- height="23"
- label="Group Chat"
- layout="topleft"
- mouse_opaque="false"
- name="chat_btn"
- tool_tip="Open chat session"
- top="0"
- width="100" />
- </layout_panel>
-
- <layout_panel
- follows="bottom|left|right"
- height="23"
- layout="bottomleft"
- left_pad="3"
- mouse_opaque="false"
- name="group_call_btn_lp"
- user_resize="false"
- auto_resize="true"
- width="96">
- <button
- follows="bottom|left|right"
- left="1"
- height="23"
- label="Group Call"
- layout="topleft"
- mouse_opaque="false"
- name="group_call_btn"
- tool_tip="Call this group"
- top="0"
- width="95" />
- </layout_panel>
- </layout_stack>
- </panel>
-</panel>
diff --git a/indra/newview/skins/minimal/xui/en/panel_side_tray_tab_caption.xml b/indra/newview/skins/minimal/xui/en/panel_side_tray_tab_caption.xml
deleted file mode 100644
index 9f2f41ba31..0000000000
--- a/indra/newview/skins/minimal/xui/en/panel_side_tray_tab_caption.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<panel
- background_visible="true"
- bottom="0"
- follows="left|top|right"
- height="5"
- width="333"
- layout="topleft"
- left="0"
- name="sidetray_tab_panel">
-</panel>
diff --git a/indra/newview/skins/minimal/xui/en/panel_status_bar.xml b/indra/newview/skins/minimal/xui/en/panel_status_bar.xml
deleted file mode 100644
index fdd6b5d6ec..0000000000
--- a/indra/newview/skins/minimal/xui/en/panel_status_bar.xml
+++ /dev/null
@@ -1,83 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<panel
- background_opaque="true"
- background_visible="true"
- bg_opaque_color="MouseGray"
- chrome="true"
- follows="top|right"
- height="30"
- layout="topleft"
- left="0"
- mouse_opaque="false"
- name="status"
- top="19"
- tab_stop="false"
- width="185">
- <panel.string
- name="packet_loss_tooltip">
- Packet Loss
- </panel.string>
- <panel.string
- name="bandwidth_tooltip">
- Bandwidth
- </panel.string>
- <panel.string
- name="time">
- [hour12, datetime, slt]:[min, datetime, slt] [ampm, datetime, slt] [timezone,datetime, slt]
- </panel.string>
- <panel.string
- name="timeTooltip">
- [weekday, datetime, slt], [day, datetime, slt] [month, datetime, slt] [year, datetime, slt]
- </panel.string>
- <panel.string
- name="buycurrencylabel">
- L$ [AMT]
- </panel.string>
- <combo_box
- follows="right|top"
- left_pad="5"
- drop_down_button.pad_left="10"
- left="0"
- top="5"
- pad_left="5"
- width="120"
- height="23"
- name="mode_combo"
- tool_tip="Select your mode. Choose Basic for fast, easy exploration and chat. Choose Advanced to access more features."
- >
- <combo_box.item
- label="Basic Mode"
- name="Basic"
- value="settings_minimal.xml" />
- <combo_box.item
- label="Advanced Mode"
- name="Advanced"
- value="" />
- </combo_box>
- <button
- follows="right|top"
- height="16"
- image_selected="Play_Off"
- image_unselected="Pause_Off"
- image_pressed="Pause_Press"
- image_pressed_selected="Play_Press"
- is_toggle="true"
- left_pad="5"
- top="7"
- name="media_toggle_btn"
- tool_tip="Start/Stop All Media (Music, Video, Web pages)"
- width="16" >
- </button>
- <button
- follows="right|top"
- height="16"
- image_selected="AudioMute_Off"
- image_pressed="Audio_Press"
- image_unselected="Audio_Off"
- is_toggle="true"
- left_pad="5"
- top="8"
- name="volume_btn"
- tool_tip="Global Volume Control"
- width="16" />
-</panel>
diff --git a/indra/newview/skins/minimal/xui/en/panel_volume_pulldown.xml b/indra/newview/skins/minimal/xui/en/panel_volume_pulldown.xml
deleted file mode 100644
index 36ad39abe8..0000000000
--- a/indra/newview/skins/minimal/xui/en/panel_volume_pulldown.xml
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<panel
- background_opaque="true"
- background_visible="true"
- bg_opaque_image="Volume_Background"
- bg_alpha_image="Volume_Background"
- border_visible="false"
- border="false"
- chrome="true"
- follows="bottom"
- height="150"
- layout="topleft"
- name="volumepulldown_floater"
- width="32">
- <slider
- control_name="AudioLevelMaster"
- follows="left|top"
- left="0"
- top="1"
- orientation="vertical"
- height="140"
- increment="0.05"
- initial_value="0.5"
- layout="topleft"
- name="mastervolume"
- show_text="false"
- slider_label.halign="right"
- top_pad="2"
- volume="true">
- <slider.commit_callback
- function="Vol.setControlFalse"
- parameter="MuteAudio" />
- </slider>
-</panel>
diff --git a/indra/newview/skins/minimal/xui/en/widgets/location_input.xml b/indra/newview/skins/minimal/xui/en/widgets/location_input.xml
deleted file mode 100644
index ba148cf421..0000000000
--- a/indra/newview/skins/minimal/xui/en/widgets/location_input.xml
+++ /dev/null
@@ -1,139 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<!--
-*TODO: Replace hardcoded buttons width/height with getting this info from the button images.
- Currently that doesn't work because LLUIImage::getWidth/getHeight() return 1 for the images.
--->
-<location_input font="SansSerifSmall"
- maturity_help_topic="maturity_rating"
- add_landmark_hpad="0"
- icon_hpad="2"
- allow_text_entry="true"
- list_position="below"
- show_text_as_tentative="false"
- max_chars="20"
- follows="left|top"
- allow_new_values="true"
- >
- <!-- *NOTE: Tooltips are in strings.xml so they can be localized.
- See LocationCtrlAddLandmarkTooltip etc. -->
- <info_button
- name="Place Information"
- width="0"
- height="0"
- visible="false"
- left="6"
- top="20"
- follows="left|top"
- hover_glow_amount="0.15" />
- <add_landmark_button name="Add Landmark"
- hover_glow_amount="0.15"
- width="0"
- height="0"
- visible="false"
- follows="right|top"
- scale_image="false"
- top="19"
- left="-3" />
- <maturity_button
- name="maturity_icon"
- width="0"
- height="0"
- visible="false"
- top="20"
- follows="left|top"
- />
- <for_sale_button
- name="for_sale_btn"
- width="0"
- height="0"
- visible="false"
- follows="right|top"
- scale_image="false"
- top="21"
- />
- <voice_icon
- enabled="true"
- name="voice_icon"
- width="0"
- height="0"
- visible="false"
- top="21"
- follows="right|top"
- />
- <fly_icon
- name="fly_icon"
- width="0"
- height="0"
- visible="false"
- top="21"
- follows="right|top"
- />
- <push_icon
- name="push_icon"
- width="0"
- height="0"
- visible="false"
- top="21"
- follows="right|top"
- />
- <build_icon
- name="build_icon"
- width="0"
- height="0"
- visible="false"
- top="21"
- follows="right|top"
- />
- <scripts_icon
- name="scripts_icon"
- width="0"
- height="0"
- visible="false"
- top="21"
- follows="right|top"
- />
- <damage_icon
- name="damage_icon"
- width="0"
- height="0"
- visible="false"
- top="19"
- left="2"
- follows="right|top"
- />
- <!-- Default text color is invisible on top of nav bar background -->
- <damage_text
- name="damage_text"
- width="0"
- height="0"
- max_length="0"
- top="17"
- follows="right|top"
- halign="right"
- font="SansSerifSmall"
- text_color="TextFgColor"
- />
- <see_avatars_icon
- name="see_avatars_icon"
- width="0"
- height="0"
- visible="false"
- top="21"
- follows="right|top"
- />
- <combo_button
- name="Location History"
- label=""
- pad_right="0"/>
- <combo_list
- bg_writeable_color="MenuDefaultBgColor"
- page_lines="10"
- scroll_bar_bg_visible="true" />
- <combo_editor name="Combo Text Entry"
- text_pad_left="4"
- select_on_focus="false"
- font="SansSerifSmall"
- bevel_style="none"
- border_style="line"
- border.border_thickness="0" />
-</location_input>
diff --git a/indra/newview/skins/minimal/xui/es/floater_camera.xml b/indra/newview/skins/minimal/xui/es/floater_camera.xml
deleted file mode 100644
index 87177e285c..0000000000
--- a/indra/newview/skins/minimal/xui/es/floater_camera.xml
+++ /dev/null
@@ -1,65 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="camera_floater" title="">
- <floater.string name="rotate_tooltip">
- Girar la cámara alrededor de lo enfocado
- </floater.string>
- <floater.string name="zoom_tooltip">
- Hacer zoom con la cámara en lo enfocado
- </floater.string>
- <floater.string name="move_tooltip">
- Mover la cámara arriba y abajo, izquierda y derecha
- </floater.string>
- <floater.string name="camera_modes_title">
- Modos de cámara
- </floater.string>
- <floater.string name="pan_mode_title">
- Orbital - Zoom - Panorámica
- </floater.string>
- <floater.string name="presets_mode_title">
- Vistas predefinidas
- </floater.string>
- <floater.string name="free_mode_title">
- Centrar el objeto
- </floater.string>
- <panel name="controls">
- <panel name="preset_views_list">
- <panel_camera_item name="front_view">
- <panel_camera_item.text name="front_view_text">
- De frente
- </panel_camera_item.text>
- </panel_camera_item>
- <panel_camera_item name="group_view">
- <panel_camera_item.text name="side_view_text">
- Vista lateral
- </panel_camera_item.text>
- </panel_camera_item>
- <panel_camera_item name="rear_view">
- <panel_camera_item.text name="rear_view_text">
- Desde detrás
- </panel_camera_item.text>
- </panel_camera_item>
- </panel>
- <panel name="camera_modes_list">
- <panel_camera_item name="object_view">
- <panel_camera_item.text name="object_view_text">
- Vista de objeto
- </panel_camera_item.text>
- </panel_camera_item>
- <panel_camera_item name="mouselook_view">
- <panel_camera_item.text name="mouselook_view_text">
- Vista subjetiva
- </panel_camera_item.text>
- </panel_camera_item>
- </panel>
- <panel name="zoom" tool_tip="Hacer zoom con la cámara en lo enfocado">
- <joystick_rotate name="cam_rotate_stick" tool_tip="La cámara gira alrededor del punto de vista"/>
- <slider_bar name="zoom_slider" tool_tip="Hacer zoom en lo enfocado"/>
- <joystick_track name="cam_track_stick" tool_tip="Mueve la cámara arriba y abajo, a izquierda y derecha"/>
- </panel>
- </panel>
- <panel name="buttons">
- <button label="" name="presets_btn" tool_tip="Vistas predefinidas"/>
- <button label="" name="pan_btn" tool_tip="Orbital - Zoom - Panorámica"/>
- <button label="" name="avatarview_btn" tool_tip="Modos de cámara"/>
- </panel>
-</floater>
diff --git a/indra/newview/skins/minimal/xui/es/floater_help_browser.xml b/indra/newview/skins/minimal/xui/es/floater_help_browser.xml
deleted file mode 100644
index 67590ebfbb..0000000000
--- a/indra/newview/skins/minimal/xui/es/floater_help_browser.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_help_browser" title="INDICACIONES">
- <floater.string name="loading_text">
- Cargando...
- </floater.string>
- <layout_stack name="stack1">
- <layout_panel name="external_controls"/>
- </layout_stack>
-</floater>
diff --git a/indra/newview/skins/minimal/xui/es/floater_media_browser.xml b/indra/newview/skins/minimal/xui/es/floater_media_browser.xml
deleted file mode 100644
index a7086c2d6d..0000000000
--- a/indra/newview/skins/minimal/xui/es/floater_media_browser.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_about" title="EXPLORADOR DE MEDIA">
- <floater.string name="home_page_url">
- http://www.secondlife.com
- </floater.string>
- <floater.string name="support_page_url">
- http://support.secondlife.com
- </floater.string>
- <layout_stack name="stack1">
- <layout_panel name="nav_controls">
- <button label="Atrás" name="back"/>
- <button label="Adelante" name="forward"/>
- <button label="Recargar" name="reload"/>
- <button label="Ir" name="go"/>
- </layout_panel>
- <layout_panel name="time_controls">
- <button label="rebobinar" name="rewind"/>
- <button label="parar" name="stop"/>
- <button label="avanzar" name="seek"/>
- </layout_panel>
- <layout_panel name="parcel_owner_controls">
- <button label="Enviar a la parcela la página actual" name="assign"/>
- </layout_panel>
- <layout_panel name="external_controls">
- <button label="Abrir en mi propio navegador" name="open_browser"/>
- <check_box label="Abrir siempre en mi propio navegador" name="open_always"/>
- <button label="Cerrar" name="close"/>
- </layout_panel>
- </layout_stack>
-</floater>
diff --git a/indra/newview/skins/minimal/xui/es/floater_nearby_chat.xml b/indra/newview/skins/minimal/xui/es/floater_nearby_chat.xml
deleted file mode 100644
index 1fee9ab056..0000000000
--- a/indra/newview/skins/minimal/xui/es/floater_nearby_chat.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="nearby_chat" title="CHAT">
- <check_box label="Traducir chat (mediante Google)" name="translate_chat_checkbox"/>
-</floater>
diff --git a/indra/newview/skins/minimal/xui/es/floater_web_content.xml b/indra/newview/skins/minimal/xui/es/floater_web_content.xml
deleted file mode 100644
index b012809679..0000000000
--- a/indra/newview/skins/minimal/xui/es/floater_web_content.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_web_content" title="">
- <layout_stack name="stack1">
- <layout_panel name="nav_controls">
- <button name="back" tool_tip="Navegar hacia atrás"/>
- <button name="forward" tool_tip="Navegar hacia adelante"/>
- <button name="stop" tool_tip="Parar navegación"/>
- <button name="reload" tool_tip="Recargar página"/>
- <combo_box name="address" tool_tip="Escribe la URL aquí"/>
- <icon name="media_secure_lock_flag" tool_tip="Navegación segura"/>
- <button name="popexternal" tool_tip="Abrir la URL actual en tu explorador de escritorio"/>
- </layout_panel>
- </layout_stack>
-</floater>
diff --git a/indra/newview/skins/minimal/xui/es/inspect_avatar.xml b/indra/newview/skins/minimal/xui/es/inspect_avatar.xml
deleted file mode 100644
index 1d70fa6a90..0000000000
--- a/indra/newview/skins/minimal/xui/es/inspect_avatar.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<!--
- Not can_close / no title to avoid window chrome
- Single instance - only have one at a time, recycle it each spawn
--->
-<floater name="inspect_avatar">
- <string name="Subtitle">
- [AGE]
- </string>
- <string name="Details">
- [SL_PROFILE]
- </string>
- <text name="user_details">
- Ésta es mi descripción de Second Life que, por cierto, me encanta. Pero, por lo que sea, me he enrollado más de la cuenta y la descripción es larguísima.
- </text>
- <slider name="volume_slider" tool_tip="Volumen de la voz" value="0.5"/>
- <button label="Añadir como amigo" name="add_friend_btn"/>
- <button label="MI" name="im_btn"/>
- <button label="Perfil" name="view_profile_btn"/>
- <panel name="moderator_panel">
- <button label="Desactivar la voz" name="disable_voice"/>
- <button label="Activar la voz" name="enable_voice"/>
- </panel>
-</floater>
diff --git a/indra/newview/skins/minimal/xui/es/inspect_object.xml b/indra/newview/skins/minimal/xui/es/inspect_object.xml
deleted file mode 100644
index d608b4a0f7..0000000000
--- a/indra/newview/skins/minimal/xui/es/inspect_object.xml
+++ /dev/null
@@ -1,41 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<!--
- Not can_close / no title to avoid window chrome
- Single instance - only have one at a time, recycle it each spawn
--->
-<floater name="inspect_object">
- <string name="Creator">
- Por [CREATOR]
- </string>
- <string name="CreatorAndOwner">
- Por [CREATOR]
-Propietario [OWNER]
- </string>
- <string name="Price">
- [AMOUNT] L$
- </string>
- <string name="PriceFree">
- ¡Gratis!
- </string>
- <string name="Touch">
- Tocar
- </string>
- <string name="Sit">
- Sentarme
- </string>
- <text name="object_name" value="Test Object Name That Is actually two lines and Really Long"/>
- <text name="price_text">
- 30.000 L$
- </text>
- <text name="object_description">
- This is a really long description for an object being as how it is at least 80 characters in length and so but maybe more like 120 at this point. Who knows, really?
- </text>
- <button label="Comprar" name="buy_btn"/>
- <button label="Pagar" name="pay_btn"/>
- <button label="Coger una copia" name="take_free_copy_btn"/>
- <button label="Tocar" name="touch_btn"/>
- <button label="Sentarme" name="sit_btn"/>
- <button label="Abrir" name="open_btn"/>
- <icon name="secure_browsing" tool_tip="Navegación segura"/>
- <button label="Más" name="more_info_btn"/>
-</floater>
diff --git a/indra/newview/skins/minimal/xui/es/menu_add_wearable_gear.xml b/indra/newview/skins/minimal/xui/es/menu_add_wearable_gear.xml
deleted file mode 100644
index f2367c72a3..0000000000
--- a/indra/newview/skins/minimal/xui/es/menu_add_wearable_gear.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Add Wearable Gear Menu">
- <menu_item_check label="Ordenar por los más recientes" name="sort_by_most_recent"/>
- <menu_item_check label="Ordenar alfabéticamente" name="sort_by_name"/>
- <menu_item_check label="Ordenar por tipo" name="sort_by_type"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_attachment_other.xml b/indra/newview/skins/minimal/xui/es/menu_attachment_other.xml
deleted file mode 100644
index b8ae93afd2..0000000000
--- a/indra/newview/skins/minimal/xui/es/menu_attachment_other.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<!-- *NOTE: See also menu_avatar_other.xml -->
-<context_menu name="Avatar Pie">
- <menu_item_call label="Ver el perfil" name="Profile..."/>
- <menu_item_call label="Añadir como amigo" name="Add Friend"/>
- <menu_item_call label="MI" name="Send IM..."/>
- <menu_item_call label="Llamar" name="Call"/>
- <menu_item_call label="Invitar al grupo" name="Invite..."/>
- <menu_item_call label="Ignorar" name="Avatar Mute"/>
- <menu_item_call label="Denunciar" name="abuse"/>
- <menu_item_call label="Congelar" name="Freeze..."/>
- <menu_item_call label="Expulsar" name="Eject..."/>
- <menu_item_call label="Depurar las texturas" name="Debug..."/>
- <menu_item_call label="Acercar el zoom" name="Zoom In"/>
- <menu_item_call label="Pagar" name="Pay..."/>
- <menu_item_call label="Perfil del objeto" name="Object Inspect"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_attachment_self.xml b/indra/newview/skins/minimal/xui/es/menu_attachment_self.xml
deleted file mode 100644
index ab76c92d65..0000000000
--- a/indra/newview/skins/minimal/xui/es/menu_attachment_self.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Attachment Pie">
- <menu_item_call label="Tocar" name="Attachment Object Touch"/>
- <menu_item_call label="Editar" name="Edit..."/>
- <menu_item_call label="Quitar" name="Detach"/>
- <menu_item_call label="Sentarte" name="Sit Down Here"/>
- <menu_item_call label="Levantarme" name="Stand Up"/>
- <menu_item_call label="Cambiar vestuario" name="Change Outfit"/>
- <menu_item_call label="Editar mi vestuario" name="Edit Outfit"/>
- <menu_item_call label="Editar mi anatomía" name="Edit My Shape"/>
- <menu_item_call label="Mis amigos" name="Friends..."/>
- <menu_item_call label="Mis grupos" name="Groups..."/>
- <menu_item_call label="Mi perfil" name="Profile..."/>
- <menu_item_call label="Depurar las texturas" name="Debug..."/>
- <menu_item_call label="Soltar" name="Drop"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_avatar_icon.xml b/indra/newview/skins/minimal/xui/es/menu_avatar_icon.xml
deleted file mode 100644
index fe7331a108..0000000000
--- a/indra/newview/skins/minimal/xui/es/menu_avatar_icon.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Avatar Icon Menu">
- <menu_item_call label="Ver el perfil" name="Show Profile"/>
- <menu_item_call label="Enviar un MI..." name="Send IM"/>
- <menu_item_call label="Añadir como amigo..." name="Add Friend"/>
- <menu_item_call label="Quitar de los amigos..." name="Remove Friend"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_avatar_other.xml b/indra/newview/skins/minimal/xui/es/menu_avatar_other.xml
deleted file mode 100644
index 5fb3e51575..0000000000
--- a/indra/newview/skins/minimal/xui/es/menu_avatar_other.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<!-- *NOTE: See also menu_attachment_other.xml -->
-<context_menu name="Avatar Pie">
- <menu_item_call label="Ver el perfil" name="Profile..."/>
- <menu_item_call label="Añadir como amigo" name="Add Friend"/>
- <menu_item_call label="MI" name="Send IM..."/>
- <menu_item_call label="Llamar" name="Call"/>
- <menu_item_call label="Invitar al grupo" name="Invite..."/>
- <menu_item_call label="Ignorar" name="Avatar Mute"/>
- <menu_item_call label="Denunciar" name="abuse"/>
- <menu_item_call label="Congelar" name="Freeze..."/>
- <menu_item_call label="Expulsar" name="Eject..."/>
- <menu_item_call label="Depurar las texturas" name="Debug..."/>
- <menu_item_call label="Acercar el zoom" name="Zoom In"/>
- <menu_item_call label="Pagar" name="Pay..."/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_avatar_self.xml b/indra/newview/skins/minimal/xui/es/menu_avatar_self.xml
deleted file mode 100644
index 50f8384b0f..0000000000
--- a/indra/newview/skins/minimal/xui/es/menu_avatar_self.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Self Pie">
- <menu_item_call label="Sentarte" name="Sit Down Here"/>
- <menu_item_call label="Levantarme" name="Stand Up"/>
- <context_menu label="Quitarme" name="Take Off &gt;">
- <context_menu label="Ropas" name="Clothes &gt;">
- <menu_item_call label="Camisa" name="Shirt"/>
- <menu_item_call label="Pantalón" name="Pants"/>
- <menu_item_call label="Falda" name="Skirt"/>
- <menu_item_call label="Zapatos" name="Shoes"/>
- <menu_item_call label="Calcetines" name="Socks"/>
- <menu_item_call label="Chaqueta" name="Jacket"/>
- <menu_item_call label="Guantes" name="Gloves"/>
- <menu_item_call label="Camiseta" name="Self Undershirt"/>
- <menu_item_call label="Ropa interior" name="Self Underpants"/>
- <menu_item_call label="Tatuaje" name="Self Tattoo"/>
- <menu_item_call label="Alfa" name="Self Alpha"/>
- <menu_item_call label="Toda la ropa" name="All Clothes"/>
- </context_menu>
- <context_menu label="HUD" name="Object Detach HUD"/>
- <context_menu label="Quitar" name="Object Detach"/>
- <menu_item_call label="Quitarse todo" name="Detach All"/>
- </context_menu>
- <menu_item_call label="Cambiar vestuario" name="Chenge Outfit"/>
- <menu_item_call label="Editar mi vestuario" name="Edit Outfit"/>
- <menu_item_call label="Editar mi anatomía" name="Edit My Shape"/>
- <menu_item_call label="Mis amigos" name="Friends..."/>
- <menu_item_call label="Mis grupos" name="Groups..."/>
- <menu_item_call label="Mi perfil" name="Profile..."/>
- <menu_item_call label="Depurar las texturas" name="Debug..."/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_bottomtray.xml b/indra/newview/skins/minimal/xui/es/menu_bottomtray.xml
deleted file mode 100644
index 62683f3076..0000000000
--- a/indra/newview/skins/minimal/xui/es/menu_bottomtray.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="hide_camera_move_controls_menu">
- <menu_item_check label="Botón Gestos" name="ShowGestureButton"/>
- <menu_item_check label="Botón Moverse" name="ShowMoveButton"/>
- <menu_item_check label="Botón Vista" name="ShowCameraButton"/>
- <menu_item_check label="Botón Foto" name="ShowSnapshotButton"/>
- <menu_item_check label="Botón Barra lateral" name="ShowSidebarButton"/>
- <menu_item_check label="Botón Construir" name="ShowBuildButton"/>
- <menu_item_check label="Botón Buscar" name="ShowSearchButton"/>
- <menu_item_check label="Botón Mapa" name="ShowWorldMapButton"/>
- <menu_item_check label="Botón Minimapa" name="ShowMiniMapButton"/>
- <menu_item_call label="Cortar" name="NearbyChatBar_Cut"/>
- <menu_item_call label="Copiar" name="NearbyChatBar_Copy"/>
- <menu_item_call label="Pegar" name="NearbyChatBar_Paste"/>
- <menu_item_call label="Borrar" name="NearbyChatBar_Delete"/>
- <menu_item_call label="Seleccionar todo" name="NearbyChatBar_Select_All"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_cof_attachment.xml b/indra/newview/skins/minimal/xui/es/menu_cof_attachment.xml
deleted file mode 100644
index 7541530601..0000000000
--- a/indra/newview/skins/minimal/xui/es/menu_cof_attachment.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="COF Attachment">
- <menu_item_call label="Quitar" name="detach"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_cof_body_part.xml b/indra/newview/skins/minimal/xui/es/menu_cof_body_part.xml
deleted file mode 100644
index 56b95bdc3b..0000000000
--- a/indra/newview/skins/minimal/xui/es/menu_cof_body_part.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="COF Body">
- <menu_item_call label="Reemplazar" name="replace"/>
- <menu_item_call label="Editar" name="edit"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_cof_clothing.xml b/indra/newview/skins/minimal/xui/es/menu_cof_clothing.xml
deleted file mode 100644
index 3c0c588284..0000000000
--- a/indra/newview/skins/minimal/xui/es/menu_cof_clothing.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="COF Clothing">
- <menu_item_call label="Quitarme" name="take_off"/>
- <menu_item_call label="Editar" name="edit"/>
- <menu_item_call label="Reemplazar" name="replace"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_cof_gear.xml b/indra/newview/skins/minimal/xui/es/menu_cof_gear.xml
deleted file mode 100644
index ff8ad0977a..0000000000
--- a/indra/newview/skins/minimal/xui/es/menu_cof_gear.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Gear COF">
- <menu label="Ropas nuevas" name="COF.Gear.New_Clothes"/>
- <menu label="Nuevas partes del cuerpo" name="COF.Geear.New_Body_Parts"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_edit.xml b/indra/newview/skins/minimal/xui/es/menu_edit.xml
deleted file mode 100644
index 96fc9d8881..0000000000
--- a/indra/newview/skins/minimal/xui/es/menu_edit.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu label="Editar" name="Edit">
- <menu_item_call label="Deshacer" name="Undo"/>
- <menu_item_call label="Rehacer" name="Redo"/>
- <menu_item_call label="Cortar" name="Cut"/>
- <menu_item_call label="Copiar" name="Copy"/>
- <menu_item_call label="Pegar" name="Paste"/>
- <menu_item_call label="Borrar" name="Delete"/>
- <menu_item_call label="Duplicar" name="Duplicate"/>
- <menu_item_call label="Seleccionar todo" name="Select All"/>
- <menu_item_call label="Deseleccionar" name="Deselect"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_favorites.xml b/indra/newview/skins/minimal/xui/es/menu_favorites.xml
deleted file mode 100644
index 85210d5c49..0000000000
--- a/indra/newview/skins/minimal/xui/es/menu_favorites.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Popup">
- <menu_item_call label="Teleportar" name="Teleport To Landmark"/>
- <menu_item_call label="Ver/Editar el hito" name="Landmark Open"/>
- <menu_item_call label="Copiar la SLurl" name="Copy slurl"/>
- <menu_item_call label="Mostrar en el mapa" name="Show On Map"/>
- <menu_item_call label="Copiar" name="Landmark Copy"/>
- <menu_item_call label="Pegar" name="Landmark Paste"/>
- <menu_item_call label="Borrar" name="Delete"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_gesture_gear.xml b/indra/newview/skins/minimal/xui/es/menu_gesture_gear.xml
deleted file mode 100644
index 24706eb2c8..0000000000
--- a/indra/newview/skins/minimal/xui/es/menu_gesture_gear.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_gesture_gear">
- <menu_item_call label="Añadir a / Quitar de los favoritos" name="activate"/>
- <menu_item_call label="Copiar" name="copy_gesture"/>
- <menu_item_call label="Pegar" name="paste"/>
- <menu_item_call label="Copiar la UUID" name="copy_uuid"/>
- <menu_item_call label="Añadir al vestuario actual" name="save_to_outfit"/>
- <menu_item_call label="Editar" name="edit_gesture"/>
- <menu_item_call label="Inspeccionar" name="inspect"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_group_plus.xml b/indra/newview/skins/minimal/xui/es/menu_group_plus.xml
deleted file mode 100644
index 6b26ba42c4..0000000000
--- a/indra/newview/skins/minimal/xui/es/menu_group_plus.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_group_plus">
- <menu_item_call label="Entrar al grupo..." name="item_join"/>
- <menu_item_call label="Grupo nuevo..." name="item_new"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_hide_navbar.xml b/indra/newview/skins/minimal/xui/es/menu_hide_navbar.xml
deleted file mode 100644
index 22a1873234..0000000000
--- a/indra/newview/skins/minimal/xui/es/menu_hide_navbar.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="hide_navbar_menu">
- <menu_item_check label="Mostrar la barra de navegación" name="ShowNavbarNavigationPanel"/>
- <menu_item_check label="Mostrar la barra de favoritos" name="ShowNavbarFavoritesPanel"/>
- <menu_item_check label="Mostrar mini-barra de ubicación" name="ShowMiniLocationPanel"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_im_well_button.xml b/indra/newview/skins/minimal/xui/es/menu_im_well_button.xml
deleted file mode 100644
index c8f6c217cc..0000000000
--- a/indra/newview/skins/minimal/xui/es/menu_im_well_button.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="IM Well Button Context Menu">
- <menu_item_call label="Cerrar todo" name="Close All"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_imchiclet_adhoc.xml b/indra/newview/skins/minimal/xui/es/menu_imchiclet_adhoc.xml
deleted file mode 100644
index e11e9bdc58..0000000000
--- a/indra/newview/skins/minimal/xui/es/menu_imchiclet_adhoc.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="IMChiclet AdHoc Menu">
- <menu_item_call label="Acabar la sesión" name="End Session"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_imchiclet_group.xml b/indra/newview/skins/minimal/xui/es/menu_imchiclet_group.xml
deleted file mode 100644
index a5e60ea40b..0000000000
--- a/indra/newview/skins/minimal/xui/es/menu_imchiclet_group.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="IMChiclet Group Menu">
- <menu_item_call label="Información del grupo" name="Show Profile"/>
- <menu_item_call label="Mostrar la sesión" name="Chat"/>
- <menu_item_call label="Acabar la sesión" name="End Session"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_imchiclet_p2p.xml b/indra/newview/skins/minimal/xui/es/menu_imchiclet_p2p.xml
deleted file mode 100644
index 492801026c..0000000000
--- a/indra/newview/skins/minimal/xui/es/menu_imchiclet_p2p.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="IMChiclet P2P Menu">
- <menu_item_call label="Ver el perfil" name="Show Profile"/>
- <menu_item_call label="Añadir como amigo" name="Add Friend"/>
- <menu_item_call label="Mostrar la sesión" name="Send IM"/>
- <menu_item_call label="Acabar la sesión" name="End Session"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_inspect_avatar_gear.xml b/indra/newview/skins/minimal/xui/es/menu_inspect_avatar_gear.xml
deleted file mode 100644
index 728637de78..0000000000
--- a/indra/newview/skins/minimal/xui/es/menu_inspect_avatar_gear.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<toggleable_menu name="Gear Menu">
- <menu_item_call label="Ver el perfil" name="view_profile"/>
- <menu_item_call label="Añadir como amigo" name="add_friend"/>
- <menu_item_call label="MI" name="im"/>
- <menu_item_call label="Llamar" name="call"/>
- <menu_item_call label="Teleportar" name="teleport"/>
- <menu_item_call label="Ignorar" name="block"/>
- <menu_item_call label="Designorar" name="unblock"/>
- <menu_item_call label="Denunciar" name="report"/>
- <menu_item_call label="Congelar" name="freeze"/>
- <menu_item_call label="Expulsar" name="eject"/>
- <menu_item_call label="Expulsar" name="kick"/>
- <menu_item_call label="CSR" name="csr"/>
- <menu_item_call label="Depurar las texturas" name="debug"/>
- <menu_item_call label="Encontrar en el mapa" name="find_on_map"/>
- <menu_item_call label="Acercar el zoom" name="zoom_in"/>
-</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_inspect_object_gear.xml b/indra/newview/skins/minimal/xui/es/menu_inspect_object_gear.xml
deleted file mode 100644
index bcdc25894f..0000000000
--- a/indra/newview/skins/minimal/xui/es/menu_inspect_object_gear.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<menu name="Gear Menu">
- <menu_item_call label="Tocar" name="touch"/>
- <menu_item_call label="Sentarse" name="sit"/>
- <menu_item_call label="Pagar" name="pay"/>
- <menu_item_call label="Comprar" name="buy"/>
- <menu_item_call label="Tomar" name="take"/>
- <menu_item_call label="Coger una copia" name="take_copy"/>
- <menu_item_call label="Abrir" name="open"/>
- <menu_item_call label="Editar" name="edit"/>
- <menu_item_call label="Ponerse" name="wear"/>
- <menu_item_call label="Añadir" name="add"/>
- <menu_item_call label="Denunciar" name="report"/>
- <menu_item_call label="Ignorar" name="block"/>
- <menu_item_call label="Acercar el zoom" name="zoom_in"/>
- <menu_item_call label="Quitar" name="remove"/>
- <menu_item_call label="Más información" name="more_info"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_inspect_self_gear.xml b/indra/newview/skins/minimal/xui/es/menu_inspect_self_gear.xml
deleted file mode 100644
index 1a49efb9d0..0000000000
--- a/indra/newview/skins/minimal/xui/es/menu_inspect_self_gear.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<toggleable_menu name="Self Pie">
- <menu_item_call label="Sentarme" name="Sit Down Here"/>
- <menu_item_call label="Levantarme" name="Stand Up"/>
- <menu_item_call label="Mis amigos" name="Friends..."/>
- <menu_item_call label="Mi perfil" name="Profile..."/>
- <menu_item_call label="Depurar texturas" name="Debug..."/>
-</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_inv_offer_chiclet.xml b/indra/newview/skins/minimal/xui/es/menu_inv_offer_chiclet.xml
deleted file mode 100644
index 20d99afde1..0000000000
--- a/indra/newview/skins/minimal/xui/es/menu_inv_offer_chiclet.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="InvOfferChiclet Menu">
- <menu_item_call label="Cerrar" name="Close"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_inventory.xml b/indra/newview/skins/minimal/xui/es/menu_inventory.xml
deleted file mode 100644
index 94ee162bbc..0000000000
--- a/indra/newview/skins/minimal/xui/es/menu_inventory.xml
+++ /dev/null
@@ -1,86 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Popup">
- <menu_item_call label="Compartir" name="Share"/>
- <menu_item_call label="Comprar" name="Task Buy"/>
- <menu_item_call label="Abrir" name="Task Open"/>
- <menu_item_call label="Ejecutar" name="Task Play"/>
- <menu_item_call label="Propiedades" name="Task Properties"/>
- <menu_item_call label="Renombrar" name="Task Rename"/>
- <menu_item_call label="Borrar" name="Task Remove"/>
- <menu_item_call label="Vaciar la papelera" name="Empty Trash"/>
- <menu_item_call label="Vaciar Objetos Perdidos" name="Empty Lost And Found"/>
- <menu_item_call label="Carpeta nueva" name="New Folder"/>
- <menu_item_call label="Script nuevo" name="New Script"/>
- <menu_item_call label="Nota nueva" name="New Note"/>
- <menu_item_call label="Gesto nuevo" name="New Gesture"/>
- <menu label="Ropas nuevas" name="New Clothes">
- <menu_item_call label="Camisa nueva" name="New Shirt"/>
- <menu_item_call label="Pantalones nuevos" name="New Pants"/>
- <menu_item_call label="Zapatos nuevos" name="New Shoes"/>
- <menu_item_call label="Calcetines nuevos" name="New Socks"/>
- <menu_item_call label="Chaqueta nueva" name="New Jacket"/>
- <menu_item_call label="Falda nueva" name="New Skirt"/>
- <menu_item_call label="Guantes nuevos" name="New Gloves"/>
- <menu_item_call label="Camiseta nueva" name="New Undershirt"/>
- <menu_item_call label="Ropa interior nueva" name="New Underpants"/>
- <menu_item_call label="Nueva capa Alpha" name="New Alpha Mask"/>
- <menu_item_call label="Tatuaje nuevo" name="New Tattoo"/>
- </menu>
- <menu label="Nuevas partes del cuerpo" name="New Body Parts">
- <menu_item_call label="Forma nueva" name="New Shape"/>
- <menu_item_call label="Piel nueva" name="New Skin"/>
- <menu_item_call label="Pelo nuevo" name="New Hair"/>
- <menu_item_call label="Ojos nuevos" name="New Eyes"/>
- </menu>
- <menu label="Change Type" name="Change Type">
- <menu_item_call label="Por defecto" name="Default"/>
- <menu_item_call label="Guantes" name="Gloves"/>
- <menu_item_call label="Chaqueta" name="Jacket"/>
- <menu_item_call label="Pantalón" name="Pants"/>
- <menu_item_call label="Forma" name="Shape"/>
- <menu_item_call label="Zapatos" name="Shoes"/>
- <menu_item_call label="Camisa" name="Shirt"/>
- <menu_item_call label="Falda" name="Skirt"/>
- <menu_item_call label="Ropa interior" name="Underpants"/>
- <menu_item_call label="Camiseta" name="Undershirt"/>
- </menu>
- <menu_item_call label="Teleportar" name="Landmark Open"/>
- <menu_item_call label="Abrir" name="Animation Open"/>
- <menu_item_call label="Abrir" name="Sound Open"/>
- <menu_item_call label="Reemplazar el vestuario" name="Replace Outfit"/>
- <menu_item_call label="Añadir al vestuario" name="Add To Outfit"/>
- <menu_item_call label="Quitar del vestuario actual" name="Remove From Outfit"/>
- <menu_item_call label="Encontrar el original" name="Find Original"/>
- <menu_item_call label="Eliminar el ítem" name="Purge Item"/>
- <menu_item_call label="Restaurar el ítem" name="Restore Item"/>
- <menu_item_call label="Abrir" name="Open"/>
- <menu_item_call label="Abrir original" name="Open Original"/>
- <menu_item_call label="Propiedades" name="Properties"/>
- <menu_item_call label="Renombrar" name="Rename"/>
- <menu_item_call label="Copiar la UUID" name="Copy Asset UUID"/>
- <menu_item_call label="Copiar" name="Copy"/>
- <menu_item_call label="Pegar" name="Paste"/>
- <menu_item_call label="Pegar como enlace" name="Paste As Link"/>
- <menu_item_call label="Borrar" name="Remove Link"/>
- <menu_item_call label="Borrar" name="Delete"/>
- <menu_item_call label="Borrar carpeta del sistema" name="Delete System Folder"/>
- <menu_item_call label="Empezar multiconferencia" name="Conference Chat Folder"/>
- <menu_item_call label="Escuchar" name="Sound Play"/>
- <menu_item_call label="Acerca del hito" name="About Landmark"/>
- <menu_item_call label="Escuchar en el mundo" name="Animation Play"/>
- <menu_item_call label="Ejecutarla para usted" name="Animation Audition"/>
- <menu_item_call label="Enviar un mensaje instantáneo" name="Send Instant Message"/>
- <menu_item_call label="Ofrecer teleporte..." name="Offer Teleport..."/>
- <menu_item_call label="Empezar multiconferencia" name="Conference Chat"/>
- <menu_item_call label="Activar" name="Activate"/>
- <menu_item_call label="Desactivar" name="Deactivate"/>
- <menu_item_call label="Guardar como" name="Save As"/>
- <menu_item_call label="Quitarse" name="Detach From Yourself"/>
- <menu_item_call label="Ponerme" name="Wearable And Object Wear"/>
- <menu label="Anexar a" name="Attach To"/>
- <menu label="Anexar como HUD" name="Attach To HUD"/>
- <menu_item_call label="Editar" name="Wearable Edit"/>
- <menu_item_call label="Añadir" name="Wearable Add"/>
- <menu_item_call label="Quitarse" name="Take Off"/>
- <menu_item_call label="--sin opciones--" name="--no options--"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_inventory_add.xml b/indra/newview/skins/minimal/xui/es/menu_inventory_add.xml
deleted file mode 100644
index ba106e8335..0000000000
--- a/indra/newview/skins/minimal/xui/es/menu_inventory_add.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_inventory_add">
- <menu label="Subir" name="upload">
- <menu_item_call label="Imagen ([COST] L$)..." name="Upload Image"/>
- <menu_item_call label="Sonido ([COST] L$)..." name="Upload Sound"/>
- <menu_item_call label="Animación ([COST] L$)..." name="Upload Animation"/>
- <menu_item_call label="Masivo ([COST] L$ por archivo)..." name="Bulk Upload"/>
- <menu_item_call label="Configurar los permisos por defecto de subida" name="perm prefs"/>
- </menu>
- <menu_item_call label="Carpeta nueva" name="New Folder"/>
- <menu_item_call label="Script nuevo" name="New Script"/>
- <menu_item_call label="Nota nueva" name="New Note"/>
- <menu_item_call label="Gesto nuevo" name="New Gesture"/>
- <menu label="Ropas nuevas" name="New Clothes">
- <menu_item_call label="Camisa nueva" name="New Shirt"/>
- <menu_item_call label="Pantalón nuevo" name="New Pants"/>
- <menu_item_call label="Zapatos nuevos" name="New Shoes"/>
- <menu_item_call label="Calcetines nuevos" name="New Socks"/>
- <menu_item_call label="Chaqueta nueva" name="New Jacket"/>
- <menu_item_call label="Falda nueva" name="New Skirt"/>
- <menu_item_call label="Guantes nuevos" name="New Gloves"/>
- <menu_item_call label="Camiseta nueva" name="New Undershirt"/>
- <menu_item_call label="Ropa interior nueva" name="New Underpants"/>
- <menu_item_call label="Nueva Alfa" name="New Alpha"/>
- <menu_item_call label="Tatuaje nuevo" name="New Tattoo"/>
- </menu>
- <menu label="Nuevas partes del cuerpo" name="New Body Parts">
- <menu_item_call label="Forma nueva" name="New Shape"/>
- <menu_item_call label="Piel nueva" name="New Skin"/>
- <menu_item_call label="Pelo nuevo" name="New Hair"/>
- <menu_item_call label="Ojos nuevos" name="New Eyes"/>
- </menu>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_inventory_gear_default.xml b/indra/newview/skins/minimal/xui/es/menu_inventory_gear_default.xml
deleted file mode 100644
index 8e498fefba..0000000000
--- a/indra/newview/skins/minimal/xui/es/menu_inventory_gear_default.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<toggleable_menu name="menu_gear_default">
- <menu_item_call label="Nueva ventana del inventario" name="new_window"/>
- <menu_item_check label="Ordenar alfabéticamente" name="sort_by_name"/>
- <menu_item_check label="Ordenar por los más recientes" name="sort_by_recent"/>
- <menu_item_check label="Las carpetas del sistema, arriba" name="sort_system_folders_to_top"/>
- <menu_item_call label="Ver los filtros" name="show_filters"/>
- <menu_item_call label="Restablecer los filtros" name="reset_filters"/>
- <menu_item_call label="Cerrar todas las carpetas" name="close_folders"/>
- <menu_item_call label="Vaciar Objetos Perdidos" name="empty_lostnfound"/>
- <menu_item_call label="Guardar la textura como" name="Save Texture As"/>
- <menu_item_call label="Compartir" name="Share"/>
- <menu_item_call label="Encontrar el original" name="Find Original"/>
- <menu_item_call label="Encontrar todos los enlazados" name="Find All Links"/>
- <menu_item_call label="Vaciar la Papelera" name="empty_trash"/>
-</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_land.xml b/indra/newview/skins/minimal/xui/es/menu_land.xml
deleted file mode 100644
index b0f15be1b6..0000000000
--- a/indra/newview/skins/minimal/xui/es/menu_land.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Land Pie">
- <menu_item_call label="Acerca del terreno" name="Place Information..."/>
- <menu_item_call label="Sentarme aquí" name="Sit Here"/>
- <menu_item_call label="Comprar este terreno" name="Land Buy"/>
- <menu_item_call label="Comprar un pase" name="Land Buy Pass"/>
- <menu_item_call label="Construir" name="Create"/>
- <menu_item_call label="Modificar el terreno" name="Edit Terrain"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_landmark.xml b/indra/newview/skins/minimal/xui/es/menu_landmark.xml
deleted file mode 100644
index f69b1539b8..0000000000
--- a/indra/newview/skins/minimal/xui/es/menu_landmark.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<toggleable_menu name="landmark_overflow_menu">
- <menu_item_call label="Copiar la SLurl" name="copy"/>
- <menu_item_call label="Borrar" name="delete"/>
- <menu_item_call label="Crear un Destacado" name="pick"/>
- <menu_item_call label="Añadir a la barra de favoritos" name="add_to_favbar"/>
-</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_login.xml b/indra/newview/skins/minimal/xui/es/menu_login.xml
deleted file mode 100644
index c27d624732..0000000000
--- a/indra/newview/skins/minimal/xui/es/menu_login.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu_bar name="Login Menu">
- <menu label="Yo" name="File">
- <menu_item_call label="Preferencias" name="Preferences..."/>
- <menu_item_call label="Salir de [APP_NAME]" name="Quit"/>
- </menu>
- <menu label="Ayuda" name="Help">
- <menu_item_call label="Ayuda de [SECOND_LIFE]" name="Second Life Help"/>
- <menu_item_call label="Acerca de [APP_NAME]" name="About Second Life"/>
- </menu>
- <menu_item_check label="Mostrar el menú &apos;Debug&apos;" name="Show Debug Menu"/>
- <menu label="Depurar" name="Debug">
- <menu_item_call label="Mostrar las configuraciones del depurador" name="Debug Settings"/>
- <menu_item_call label="Configuraciones del Visor/Color" name="UI/Color Settings"/>
- <menu label="Pruebas de la interfaz" name="UI Tests"/>
- <menu_item_call label="Definir el tamaño de la ventana..." name="Set Window Size..."/>
- <menu_item_call label="Mostrar los &apos;TOS&apos;" name="TOS"/>
- <menu_item_call label="Mostrar mensaje crítico" name="Critical"/>
- <menu_item_call label="Prueba de navegadores de medios" name="Web Browser Test"/>
- <menu_item_call label="Prueba de ventanas de contenidos web" name="Web Content Floater Test"/>
- <menu_item_check label="Mostrar el selector de Grid" name="Show Grid Picker"/>
- <menu_item_call label="Mostrar la consola de notificaciones" name="Show Notifications Console"/>
- </menu>
-</menu_bar>
diff --git a/indra/newview/skins/minimal/xui/es/menu_mini_map.xml b/indra/newview/skins/minimal/xui/es/menu_mini_map.xml
deleted file mode 100644
index 07d1b08572..0000000000
--- a/indra/newview/skins/minimal/xui/es/menu_mini_map.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Popup">
- <menu_item_call label="Zoom cerca" name="Zoom Close"/>
- <menu_item_call label="Zoom medio" name="Zoom Medium"/>
- <menu_item_call label="Zoom lejos" name="Zoom Far"/>
- <menu_item_call label="Zoom por defecto" name="Zoom Default"/>
- <menu_item_check label="Girar el mapa" name="Rotate Map"/>
- <menu_item_check label="Centrar automáticamente" name="Auto Center"/>
- <menu_item_call label="Parar la búsqueda" name="Stop Tracking"/>
- <menu_item_call label="Mapa del mundo" name="World Map"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_navbar.xml b/indra/newview/skins/minimal/xui/es/menu_navbar.xml
deleted file mode 100644
index 63e5468020..0000000000
--- a/indra/newview/skins/minimal/xui/es/menu_navbar.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Navbar Menu">
- <menu_item_check label="Mostrar las coordenadas" name="Show Coordinates"/>
- <menu_item_check label="Mostrar las propiedades de la parcela" name="Show Parcel Properties"/>
- <menu_item_call label="Hito" name="Landmark"/>
- <menu_item_call label="Cortar" name="Cut"/>
- <menu_item_call label="Copiar" name="Copy"/>
- <menu_item_call label="Pegar" name="Paste"/>
- <menu_item_call label="Borrar" name="Delete"/>
- <menu_item_call label="Seleccionar todo" name="Select All"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_nearby_chat.xml b/indra/newview/skins/minimal/xui/es/menu_nearby_chat.xml
deleted file mode 100644
index 94b281b6c7..0000000000
--- a/indra/newview/skins/minimal/xui/es/menu_nearby_chat.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="NearBy Chat Menu">
- <menu_item_call label="Mostrar la gente que está cerca..." name="nearby_people"/>
- <menu_item_check label="Ver el texto ignorado" name="muted_text"/>
- <menu_item_check label="Mostrar los iconos del amigo" name="show_buddy_icons"/>
- <menu_item_check label="Mostrar los nombres" name="show_names"/>
- <menu_item_check label="Mostrar los iconos y los nombres" name="show_icons_and_names"/>
- <menu_item_call label="Tamaño de la fuente" name="font_size"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_notification_well_button.xml b/indra/newview/skins/minimal/xui/es/menu_notification_well_button.xml
deleted file mode 100644
index 0562d35be7..0000000000
--- a/indra/newview/skins/minimal/xui/es/menu_notification_well_button.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Notification Well Button Context Menu">
- <menu_item_call label="Cerrar todo" name="Close All"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_object.xml b/indra/newview/skins/minimal/xui/es/menu_object.xml
deleted file mode 100644
index 06121e0c09..0000000000
--- a/indra/newview/skins/minimal/xui/es/menu_object.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Object Pie">
- <menu_item_call label="Tocar" name="Object Touch">
- <menu_item_call.on_enable name="EnableTouch" parameter="Tocar"/>
- </menu_item_call>
- <menu_item_call label="Editar" name="Edit..."/>
- <menu_item_call label="Construir" name="Build"/>
- <menu_item_call label="Abrir" name="Open"/>
- <menu_item_call label="Sentarme aquí" name="Object Sit"/>
- <menu_item_call label="Levantarme" name="Object Stand Up"/>
- <menu_item_call label="Perfil del objeto" name="Object Inspect"/>
- <menu_item_call label="Acercar el zoom" name="Zoom In"/>
- <context_menu label="Ponerme" name="Put On">
- <menu_item_call label="Ponerme" name="Wear"/>
- <menu_item_call label="Añadir" name="Add"/>
- <context_menu label="Anexar" name="Object Attach"/>
- <context_menu label="Anexar el HUD" name="Object Attach HUD"/>
- </context_menu>
- <context_menu label="Quitar" name="Remove">
- <menu_item_call label="Denunciar una infracción" name="Report Abuse..."/>
- <menu_item_call label="Ignorar" name="Object Mute"/>
- <menu_item_call label="Devolver" name="Return..."/>
- <menu_item_call label="Eliminar" name="Delete"/>
- </context_menu>
- <menu_item_call label="Tomar" name="Pie Object Take"/>
- <menu_item_call label="Coger una copia" name="Take Copy"/>
- <menu_item_call label="Pagar" name="Pay..."/>
- <menu_item_call label="Comprar" name="Buy..."/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_object_icon.xml b/indra/newview/skins/minimal/xui/es/menu_object_icon.xml
deleted file mode 100644
index 7e4578b950..0000000000
--- a/indra/newview/skins/minimal/xui/es/menu_object_icon.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Object Icon Menu">
- <menu_item_call label="Perfil del objeto..." name="Object Profile"/>
- <menu_item_call label="Ignorar..." name="Block"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_outfit_gear.xml b/indra/newview/skins/minimal/xui/es/menu_outfit_gear.xml
deleted file mode 100644
index 3b11bceecf..0000000000
--- a/indra/newview/skins/minimal/xui/es/menu_outfit_gear.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Gear Outfit">
- <menu_item_call label="Ponerme - Reemplazar el vestuario actual" name="wear"/>
- <menu_item_call label="Ponerme - Añadir al vestuario actual" name="wear_add"/>
- <menu_item_call label="Quitarme - Quitar del vestuario actual" name="take_off"/>
- <menu label="Ropas nuevas" name="New Clothes">
- <menu_item_call label="Camisa nueva" name="New Shirt"/>
- <menu_item_call label="Pantalón nuevo" name="New Pants"/>
- <menu_item_call label="Zapatos nuevos" name="New Shoes"/>
- <menu_item_call label="Calcetines nuevos" name="New Socks"/>
- <menu_item_call label="Chaqueta nueva" name="New Jacket"/>
- <menu_item_call label="Falda nueva" name="New Skirt"/>
- <menu_item_call label="Guantes nuevos" name="New Gloves"/>
- <menu_item_call label="Camiseta nueva" name="New Undershirt"/>
- <menu_item_call label="Ropa interior nueva" name="New Underpants"/>
- <menu_item_call label="Nueva Alfa" name="New Alpha"/>
- <menu_item_call label="Tatuaje nuevo" name="New Tattoo"/>
- </menu>
- <menu label="Nuevas partes del cuerpo" name="New Body Parts">
- <menu_item_call label="Anatomía nueva" name="New Shape"/>
- <menu_item_call label="Piel nueva" name="New Skin"/>
- <menu_item_call label="Pelo nuevo" name="New Hair"/>
- <menu_item_call label="Ojos nuevos" name="New Eyes"/>
- </menu>
- <menu_item_call label="Renombrar el vestuario" name="rename"/>
- <menu_item_call label="Borrar el vestuario" name="delete_outfit"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_outfit_tab.xml b/indra/newview/skins/minimal/xui/es/menu_outfit_tab.xml
deleted file mode 100644
index 4136082a62..0000000000
--- a/indra/newview/skins/minimal/xui/es/menu_outfit_tab.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Outfit">
- <menu_item_call label="Ponerme - Reemplazar el vestuario actual" name="wear_replace"/>
- <menu_item_call label="Ponerme - Añadir al vestuario actual" name="wear_add"/>
- <menu_item_call label="Quitarme - Quitar del vestuario actual" name="take_off"/>
- <menu_item_call label="Editar el vestuario" name="edit"/>
- <menu_item_call label="Renombrar el vestuario" name="rename"/>
- <menu_item_call label="Borrar el vestuario" name="delete"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_participant_list.xml b/indra/newview/skins/minimal/xui/es/menu_participant_list.xml
deleted file mode 100644
index f6eedd1170..0000000000
--- a/indra/newview/skins/minimal/xui/es/menu_participant_list.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Participant List Context Menu">
- <menu_item_check label="Ordenar alfabéticamente" name="SortByName"/>
- <menu_item_check label="Ordenar según las intervenciones recientes" name="SortByRecentSpeakers"/>
- <menu_item_call label="Ver el perfil" name="View Profile"/>
- <menu_item_call label="Añadir como amigo" name="Add Friend"/>
- <menu_item_call label="MI" name="IM"/>
- <menu_item_call label="Llamar" name="Call"/>
- <menu_item_call label="Compartir" name="Share"/>
- <menu_item_call label="Pagar" name="Pay"/>
- <menu_item_check label="Ver los iconos de la gente" name="View Icons"/>
- <menu_item_check label="Ignorar la voz" name="Block/Unblock"/>
- <menu_item_check label="Ignorar el texto" name="MuteText"/>
- <context_menu label="Opciones del moderador" name="Moderator Options">
- <menu_item_check label="Permitir el chat de texto" name="AllowTextChat"/>
- <menu_item_call label="Ignorar a este participante" name="ModerateVoiceMuteSelected"/>
- <menu_item_call label="Quitar el silencio a este participante" name="ModerateVoiceUnMuteSelected"/>
- <menu_item_call label="Silenciar a todos" name="ModerateVoiceMute"/>
- <menu_item_call label="Quitar el silencio a todos" name="ModerateVoiceUnmute"/>
- </context_menu>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_people_friends_view_sort.xml b/indra/newview/skins/minimal/xui/es/menu_people_friends_view_sort.xml
deleted file mode 100644
index 3899ad9e96..0000000000
--- a/indra/newview/skins/minimal/xui/es/menu_people_friends_view_sort.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_group_plus">
- <menu_item_check label="Ordenar alfabéticamente" name="sort_name"/>
- <menu_item_check label="Ordenar por estatus" name="sort_status"/>
- <menu_item_check label="Ver los iconos de la gente" name="view_icons"/>
- <menu_item_check label="Ver permisos concedidos" name="view_permissions"/>
- <menu_item_call label="Ver la lista de Residentes y Objetos ignorados" name="show_blocked_list"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_people_groups.xml b/indra/newview/skins/minimal/xui/es/menu_people_groups.xml
deleted file mode 100644
index 51bd2c7208..0000000000
--- a/indra/newview/skins/minimal/xui/es/menu_people_groups.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_group_plus">
- <menu_item_call label="Ver la información" name="View Info"/>
- <menu_item_call label="Chat" name="Chat"/>
- <menu_item_call label="Llamar" name="Call"/>
- <menu_item_call label="Activar" name="Activate"/>
- <menu_item_call label="Dejar" name="Leave"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_people_groups_view_sort.xml b/indra/newview/skins/minimal/xui/es/menu_people_groups_view_sort.xml
deleted file mode 100644
index 1bd3efb611..0000000000
--- a/indra/newview/skins/minimal/xui/es/menu_people_groups_view_sort.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_group_plus">
- <menu_item_check label="Mostrar los iconos de grupo" name="Display Group Icons"/>
- <menu_item_call label="Dejar el grupo seleccionado" name="Leave Selected Group"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_people_nearby.xml b/indra/newview/skins/minimal/xui/es/menu_people_nearby.xml
deleted file mode 100644
index dc1486d879..0000000000
--- a/indra/newview/skins/minimal/xui/es/menu_people_nearby.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Avatar Context Menu">
- <menu_item_call label="Ver el perfil" name="View Profile"/>
- <menu_item_call label="Añadir como amigo" name="Add Friend"/>
- <menu_item_call label="Quitarle como amigo" name="Remove Friend"/>
- <menu_item_call label="MI" name="IM"/>
- <menu_item_call label="Llamar" name="Call"/>
- <menu_item_call label="Mapa" name="Map"/>
- <menu_item_call label="Compartir" name="Share"/>
- <menu_item_call label="Pagar" name="Pay"/>
- <menu_item_check label="Ignorar / No ignorar" name="Block/Unblock"/>
- <menu_item_call label="Ofrecer teleporte" name="teleport"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_people_nearby_multiselect.xml b/indra/newview/skins/minimal/xui/es/menu_people_nearby_multiselect.xml
deleted file mode 100644
index 227c5ebe58..0000000000
--- a/indra/newview/skins/minimal/xui/es/menu_people_nearby_multiselect.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Multi-Selected People Context Menu">
- <menu_item_call label="Añadir como amigos" name="Add Friends"/>
- <menu_item_call label="Quitar amigos" name="Remove Friend"/>
- <menu_item_call label="MI" name="IM"/>
- <menu_item_call label="Llamar" name="Call"/>
- <menu_item_call label="Compartir" name="Share"/>
- <menu_item_call label="Pagar" name="Pay"/>
- <menu_item_call label="Ofrecer teleporte" name="teleport"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_people_nearby_view_sort.xml b/indra/newview/skins/minimal/xui/es/menu_people_nearby_view_sort.xml
deleted file mode 100644
index f0fe383c0c..0000000000
--- a/indra/newview/skins/minimal/xui/es/menu_people_nearby_view_sort.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_group_plus">
- <menu_item_check label="Ordenar según las intervenciones recientes" name="sort_by_recent_speakers"/>
- <menu_item_check label="Ordenar alfabéticamente" name="sort_name"/>
- <menu_item_check label="Ordenar según distancia" name="sort_distance"/>
- <menu_item_check label="Ver los iconos de la gente" name="view_icons"/>
- <menu_item_call label="Ver la lista de Residentes y Objetos ignorados" name="show_blocked_list"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_people_recent_view_sort.xml b/indra/newview/skins/minimal/xui/es/menu_people_recent_view_sort.xml
deleted file mode 100644
index e4aaa89110..0000000000
--- a/indra/newview/skins/minimal/xui/es/menu_people_recent_view_sort.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_group_plus">
- <menu_item_check label="Ordenar por los más recientes" name="sort_most"/>
- <menu_item_check label="Ordenar alfabéticamente" name="sort_name"/>
- <menu_item_check label="Ver los iconos de la gente" name="view_icons"/>
- <menu_item_call label="Ver la lista de Residentes y Objetos ignorados" name="show_blocked_list"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_picks.xml b/indra/newview/skins/minimal/xui/es/menu_picks.xml
deleted file mode 100644
index 9da68d7c9b..0000000000
--- a/indra/newview/skins/minimal/xui/es/menu_picks.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Picks">
- <menu_item_call label="Información" name="pick_info"/>
- <menu_item_call label="Editar" name="pick_edit"/>
- <menu_item_call label="Teleportar" name="pick_teleport"/>
- <menu_item_call label="Mapa" name="pick_map"/>
- <menu_item_call label="Eliminar" name="pick_delete"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_picks_plus.xml b/indra/newview/skins/minimal/xui/es/menu_picks_plus.xml
deleted file mode 100644
index cc59bf1d29..0000000000
--- a/indra/newview/skins/minimal/xui/es/menu_picks_plus.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<toggleable_menu name="picks_plus_menu">
- <menu_item_call label="Destacado nuevo" name="create_pick"/>
- <menu_item_call label="Clasificado nuevo" name="create_classified"/>
-</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_place.xml b/indra/newview/skins/minimal/xui/es/menu_place.xml
deleted file mode 100644
index 675f0699e9..0000000000
--- a/indra/newview/skins/minimal/xui/es/menu_place.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<toggleable_menu name="place_overflow_menu">
- <menu_item_call label="Crear un hito" name="landmark"/>
- <menu_item_call label="Crear un destacado" name="pick"/>
- <menu_item_call label="Comprar un pase" name="pass"/>
- <menu_item_call label="Editar" name="edit"/>
-</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_place_add_button.xml b/indra/newview/skins/minimal/xui/es/menu_place_add_button.xml
deleted file mode 100644
index 4b2f908a06..0000000000
--- a/indra/newview/skins/minimal/xui/es/menu_place_add_button.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_folder_gear">
- <menu_item_call label="Añadir una carpeta" name="add_folder"/>
- <menu_item_call label="Añadir este hito" name="add_landmark"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_places_gear_folder.xml b/indra/newview/skins/minimal/xui/es/menu_places_gear_folder.xml
deleted file mode 100644
index bf46eb58e3..0000000000
--- a/indra/newview/skins/minimal/xui/es/menu_places_gear_folder.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_folder_gear">
- <menu_item_call label="Añadir este hito" name="add_landmark"/>
- <menu_item_call label="Añadir una carpeta" name="add_folder"/>
- <menu_item_call label="Cortar" name="cut"/>
- <menu_item_call label="Copiar" name="copy_folder"/>
- <menu_item_call label="Pegar" name="paste"/>
- <menu_item_call label="Renombrar" name="rename"/>
- <menu_item_call label="Borrar" name="delete"/>
- <menu_item_call label="Abrir" name="expand"/>
- <menu_item_call label="Cerrar" name="collapse"/>
- <menu_item_call label="Abrir todas las carpetas" name="expand_all"/>
- <menu_item_call label="Cerrar todas las carpetas" name="collapse_all"/>
- <menu_item_check label="Ordenar por fecha" name="sort_by_date"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_places_gear_landmark.xml b/indra/newview/skins/minimal/xui/es/menu_places_gear_landmark.xml
deleted file mode 100644
index eac85de846..0000000000
--- a/indra/newview/skins/minimal/xui/es/menu_places_gear_landmark.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_ladmark_gear">
- <menu_item_call label="Teleportar" name="teleport"/>
- <menu_item_call label="Más información" name="more_info"/>
- <menu_item_call label="Mostrar en el mapa" name="show_on_map"/>
- <menu_item_call label="Añadir un hito" name="add_landmark"/>
- <menu_item_call label="Añadir una carpeta" name="add_folder"/>
- <menu_item_call label="Cortar" name="cut"/>
- <menu_item_call label="Copiar el hito" name="copy_landmark"/>
- <menu_item_call label="Copiar la SLurl" name="copy_slurl"/>
- <menu_item_call label="Pegar" name="paste"/>
- <menu_item_call label="Renombrar" name="rename"/>
- <menu_item_call label="Eliminar" name="delete"/>
- <menu_item_call label="Abrir todas las carpetas" name="expand_all"/>
- <menu_item_call label="Cerrar todas las carpetas" name="collapse_all"/>
- <menu_item_check label="Ordenar por fecha" name="sort_by_date"/>
- <menu_item_call label="Crear un Destacado" name="create_pick"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_profile_overflow.xml b/indra/newview/skins/minimal/xui/es/menu_profile_overflow.xml
deleted file mode 100644
index 5ee8c50949..0000000000
--- a/indra/newview/skins/minimal/xui/es/menu_profile_overflow.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<toggleable_menu name="profile_overflow_menu">
- <menu_item_call label="Mapa" name="show_on_map"/>
- <menu_item_call label="Pagar" name="pay"/>
- <menu_item_call label="Compartir" name="share"/>
- <menu_item_call label="Ignorar" name="block"/>
- <menu_item_call label="Designorar" name="unblock"/>
- <menu_item_call label="Expulsar" name="kick"/>
- <menu_item_call label="Congelar" name="freeze"/>
- <menu_item_call label="Descongelar" name="unfreeze"/>
- <menu_item_call label="CSR" name="csr"/>
-</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_save_outfit.xml b/indra/newview/skins/minimal/xui/es/menu_save_outfit.xml
deleted file mode 100644
index a04ec75b60..0000000000
--- a/indra/newview/skins/minimal/xui/es/menu_save_outfit.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<toggleable_menu name="save_outfit_menu">
- <menu_item_call label="Guardar" name="save_outfit"/>
- <menu_item_call label="Guardar como" name="save_as_new_outfit"/>
-</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_script_chiclet.xml b/indra/newview/skins/minimal/xui/es/menu_script_chiclet.xml
deleted file mode 100644
index f517baf566..0000000000
--- a/indra/newview/skins/minimal/xui/es/menu_script_chiclet.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="ScriptChiclet Menu">
- <menu_item_call label="Cerrar" name="Close"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_slurl.xml b/indra/newview/skins/minimal/xui/es/menu_slurl.xml
deleted file mode 100644
index ca19acec6e..0000000000
--- a/indra/newview/skins/minimal/xui/es/menu_slurl.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Popup">
- <menu_item_call label="Acerca de la URL" name="about_url"/>
- <menu_item_call label="Teleportar a la URL" name="teleport_to_url"/>
- <menu_item_call label="Mapa" name="show_on_map"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_teleport_history_gear.xml b/indra/newview/skins/minimal/xui/es/menu_teleport_history_gear.xml
deleted file mode 100644
index b708f3bc20..0000000000
--- a/indra/newview/skins/minimal/xui/es/menu_teleport_history_gear.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Teleport History Gear Context Menu">
- <menu_item_call label="Abrir todas las carpetas" name="Expand all folders"/>
- <menu_item_call label="Cerrar todas las carpetas" name="Collapse all folders"/>
- <menu_item_call label="Limpiar el historial de teleportes" name="Clear Teleport History"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_teleport_history_item.xml b/indra/newview/skins/minimal/xui/es/menu_teleport_history_item.xml
deleted file mode 100644
index c482907812..0000000000
--- a/indra/newview/skins/minimal/xui/es/menu_teleport_history_item.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Teleport History Item Context Menu">
- <menu_item_call label="Teleportar" name="Teleport"/>
- <menu_item_call label="Más información" name="More Information"/>
- <menu_item_call label="Copiar al portapapeles" name="CopyToClipboard"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_teleport_history_tab.xml b/indra/newview/skins/minimal/xui/es/menu_teleport_history_tab.xml
deleted file mode 100644
index 17e90422a5..0000000000
--- a/indra/newview/skins/minimal/xui/es/menu_teleport_history_tab.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Teleport History Item Context Menu">
- <menu_item_call label="Abrir" name="TabOpen"/>
- <menu_item_call label="Cerrar" name="TabClose"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_text_editor.xml b/indra/newview/skins/minimal/xui/es/menu_text_editor.xml
deleted file mode 100644
index 095e461734..0000000000
--- a/indra/newview/skins/minimal/xui/es/menu_text_editor.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Text editor context menu">
- <menu_item_call label="Cortar" name="Cut"/>
- <menu_item_call label="Copiar" name="Copy"/>
- <menu_item_call label="Pegar" name="Paste"/>
- <menu_item_call label="Borrar" name="Delete"/>
- <menu_item_call label="Seleccionar todo" name="Select All"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_topinfobar.xml b/indra/newview/skins/minimal/xui/es/menu_topinfobar.xml
deleted file mode 100644
index 2125fd51b2..0000000000
--- a/indra/newview/skins/minimal/xui/es/menu_topinfobar.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_topinfobar">
- <menu_item_check label="Mostrar las coordenadas" name="Show Coordinates"/>
- <menu_item_check label="Mostrar las propiedades de la parcela" name="Show Parcel Properties"/>
- <menu_item_call label="Hito" name="Landmark"/>
- <menu_item_call label="Copiar" name="Copy"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_url_agent.xml b/indra/newview/skins/minimal/xui/es/menu_url_agent.xml
deleted file mode 100644
index a089c8f68e..0000000000
--- a/indra/newview/skins/minimal/xui/es/menu_url_agent.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Url Popup">
- <menu_item_call label="Mostrar el perfil del Residente" name="show_agent"/>
- <menu_item_call label="Copiar el nombre al portapapeles" name="url_copy_label"/>
- <menu_item_call label="Copiar la SLurl al portapapeles" name="url_copy"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_url_group.xml b/indra/newview/skins/minimal/xui/es/menu_url_group.xml
deleted file mode 100644
index 79374b9739..0000000000
--- a/indra/newview/skins/minimal/xui/es/menu_url_group.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Url Popup">
- <menu_item_call label="Mostrar la información del grupo" name="show_group"/>
- <menu_item_call label="Copiar el grupo al portapapeles" name="url_copy_label"/>
- <menu_item_call label="Copiar la SLurl al portapapeles" name="url_copy"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_url_http.xml b/indra/newview/skins/minimal/xui/es/menu_url_http.xml
deleted file mode 100644
index 585c059ff3..0000000000
--- a/indra/newview/skins/minimal/xui/es/menu_url_http.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Url Popup">
- <menu_item_call label="Abrir la página web" name="url_open"/>
- <menu_item_call label="Abrir en el navegador incorporado" name="url_open_internal"/>
- <menu_item_call label="Abrir en mi navegador" name="url_open_external"/>
- <menu_item_call label="Copiar la URL al portapapeles" name="url_copy"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_url_inventory.xml b/indra/newview/skins/minimal/xui/es/menu_url_inventory.xml
deleted file mode 100644
index 13a8711c76..0000000000
--- a/indra/newview/skins/minimal/xui/es/menu_url_inventory.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Url Popup">
- <menu_item_call label="Mostrar ítem del inventario" name="show_item"/>
- <menu_item_call label="Copiar el nombre al portapapeles" name="url_copy_label"/>
- <menu_item_call label="Copiar la SLurl al portapapeles" name="url_copy"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_url_map.xml b/indra/newview/skins/minimal/xui/es/menu_url_map.xml
deleted file mode 100644
index f96a0c7170..0000000000
--- a/indra/newview/skins/minimal/xui/es/menu_url_map.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Url Popup">
- <menu_item_call label="Mostrar en el mapa" name="show_on_map"/>
- <menu_item_call label="Teleportarse a la localización" name="teleport_to_location"/>
- <menu_item_call label="Copiar la SLurl al portapapeles" name="url_copy"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_url_objectim.xml b/indra/newview/skins/minimal/xui/es/menu_url_objectim.xml
deleted file mode 100644
index 8791a290af..0000000000
--- a/indra/newview/skins/minimal/xui/es/menu_url_objectim.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Url Popup">
- <menu_item_call label="Mostrar la información del objeto" name="show_object"/>
- <menu_item_call label="Mostrar en el mapa" name="show_on_map"/>
- <menu_item_call label="Teleportarse a la posición del objeto" name="teleport_to_object"/>
- <menu_item_call label="Copiar el nombre del objeto al portapapeles" name="url_copy_label"/>
- <menu_item_call label="Copiar la SLurl al portapapeles" name="url_copy"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_url_parcel.xml b/indra/newview/skins/minimal/xui/es/menu_url_parcel.xml
deleted file mode 100644
index 9e789ef8ee..0000000000
--- a/indra/newview/skins/minimal/xui/es/menu_url_parcel.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Url Popup">
- <menu_item_call label="Mostrar la información de la parcela" name="show_parcel"/>
- <menu_item_call label="Mostrar en el mapa" name="show_on_map"/>
- <menu_item_call label="Copiar la SLurl al portapapeles" name="url_copy"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_url_slapp.xml b/indra/newview/skins/minimal/xui/es/menu_url_slapp.xml
deleted file mode 100644
index 7147dcd3cf..0000000000
--- a/indra/newview/skins/minimal/xui/es/menu_url_slapp.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Url Popup">
- <menu_item_call label="Ejecutar este comando" name="run_slapp"/>
- <menu_item_call label="Copiar la SLurl al portapapeles" name="url_copy"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_url_slurl.xml b/indra/newview/skins/minimal/xui/es/menu_url_slurl.xml
deleted file mode 100644
index 4ab47c2f61..0000000000
--- a/indra/newview/skins/minimal/xui/es/menu_url_slurl.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Url Popup">
- <menu_item_call label="Mostrar la información del lugar" name="show_place"/>
- <menu_item_call label="Mostrar en el mapa" name="show_on_map"/>
- <menu_item_call label="Teleportarse a este lugar" name="teleport_to_location"/>
- <menu_item_call label="Copiar la SLurl al portapapeles" name="url_copy"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_url_teleport.xml b/indra/newview/skins/minimal/xui/es/menu_url_teleport.xml
deleted file mode 100644
index 8f86a91be3..0000000000
--- a/indra/newview/skins/minimal/xui/es/menu_url_teleport.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Url Popup">
- <menu_item_call label="Teleportarse a este lugar" name="teleport"/>
- <menu_item_call label="Mostrar en el mapa" name="show_on_map"/>
- <menu_item_call label="Copiar la SLurl al portapapeles" name="url_copy"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_viewer.xml b/indra/newview/skins/minimal/xui/es/menu_viewer.xml
deleted file mode 100644
index 776ccfe21b..0000000000
--- a/indra/newview/skins/minimal/xui/es/menu_viewer.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu_bar name="Main Menu">
- <menu label="Ayuda" name="Help">
- <menu_item_call label="Ayuda de [SECOND_LIFE]" name="Second Life Help"/>
- </menu>
- <menu label="Avanzado" name="Advanced">
- <menu label="Atajos de teclado" name="Shortcuts">
- <menu_item_check label="Volar" name="Fly"/>
- <menu_item_call label="Cerrar la ventana" name="Close Window"/>
- <menu_item_call label="Cerrar todas las ventanas" name="Close All Windows"/>
- <menu_item_call label="Volver a la vista por defecto" name="Reset View"/>
- </menu>
- </menu>
-</menu_bar>
diff --git a/indra/newview/skins/minimal/xui/es/menu_wearable_list_item.xml b/indra/newview/skins/minimal/xui/es/menu_wearable_list_item.xml
deleted file mode 100644
index 4bffa689e7..0000000000
--- a/indra/newview/skins/minimal/xui/es/menu_wearable_list_item.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Outfit Wearable Context Menu">
- <menu_item_call label="Reemplazar" name="wear_replace"/>
- <menu_item_call label="Ponerme" name="wear_wear"/>
- <menu_item_call label="Añadir" name="wear_add"/>
- <menu_item_call label="Quitarme / Quitar" name="take_off_or_detach"/>
- <menu_item_call label="Quitar" name="detach"/>
- <context_menu label="Anexar a" name="wearable_attach_to"/>
- <context_menu label="Anexar al HUD" name="wearable_attach_to_hud"/>
- <menu_item_call label="Quitarme" name="take_off"/>
- <menu_item_call label="Editar" name="edit"/>
- <menu_item_call label="Perfil del elemento" name="object_profile"/>
- <menu_item_call label="Mostrar original" name="show_original"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_wearing_gear.xml b/indra/newview/skins/minimal/xui/es/menu_wearing_gear.xml
deleted file mode 100644
index 9d9ce75e53..0000000000
--- a/indra/newview/skins/minimal/xui/es/menu_wearing_gear.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Gear Wearing">
- <menu_item_call label="Editar el vestuario" name="edit"/>
- <menu_item_call label="Quitarme" name="takeoff"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_wearing_tab.xml b/indra/newview/skins/minimal/xui/es/menu_wearing_tab.xml
deleted file mode 100644
index 64fd7ce4cf..0000000000
--- a/indra/newview/skins/minimal/xui/es/menu_wearing_tab.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Wearing">
- <menu_item_call label="Quitarme" name="take_off"/>
- <menu_item_call label="Quitar" name="detach"/>
- <menu_item_call label="Editar el vestuario" name="edit"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/es/notifications.xml b/indra/newview/skins/minimal/xui/es/notifications.xml
deleted file mode 100644
index 78b617c429..0000000000
--- a/indra/newview/skins/minimal/xui/es/notifications.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<notifications>
- <notification name="UserGiveItem">
- [NAME_SLURL] te ofrece un/a [ITEM_SLURL]. Para utilizar este ítem, cambia al modo Avanzado y búscalo en el inventario. Para cambiar al modo Avanzado, sal de la aplicación, reiníciala y cambia el ajuste de modo en la pantalla de inicio de sesión.
- <form name="form">
- <button name="Show" text="Conservar ítem"/>
- <button name="Discard" text="Rechazar ítem"/>
- <button name="Mute" text="Bloquear usuario"/>
- </form>
- </notification>
- <notification name="ObjectGiveItem">
- Un objeto de nombre &lt;nolink&gt;[OBJECTFROMNAME]&lt;/nolink&gt;, propiedad de [NAME_SLURL], te ofrece un/a &lt;nolink&gt;[ITEM_SLURL]&lt;/nolink&gt;. Para utilizar este ítem, cambia al modo Avanzado y búscalo en el inventario. Para cambiar al modo Avanzado, sal de la aplicación, reiníciala y cambia el ajuste de modo en la pantalla de inicio de sesión.
- <form name="form">
- <button name="Keep" text="Conservar ítem"/>
- <button name="Discard" text="Rechazar ítem"/>
- <button name="Mute" text="Bloquear objeto"/>
- </form>
- </notification>
-</notifications>
diff --git a/indra/newview/skins/minimal/xui/es/panel_adhoc_control_panel.xml b/indra/newview/skins/minimal/xui/es/panel_adhoc_control_panel.xml
deleted file mode 100644
index 254cf58437..0000000000
--- a/indra/newview/skins/minimal/xui/es/panel_adhoc_control_panel.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="panel_im_control_panel">
- <layout_stack name="vertical_stack">
- <layout_panel name="call_btn_panel">
- <button label="Llamar" name="call_btn"/>
- </layout_panel>
- <layout_panel name="end_call_btn_panel">
- <button label="Colgar" name="end_call_btn"/>
- </layout_panel>
- </layout_stack>
-</panel>
diff --git a/indra/newview/skins/minimal/xui/es/panel_bottomtray.xml b/indra/newview/skins/minimal/xui/es/panel_bottomtray.xml
deleted file mode 100644
index 0989a3d0a1..0000000000
--- a/indra/newview/skins/minimal/xui/es/panel_bottomtray.xml
+++ /dev/null
@@ -1,45 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="bottom_tray">
- <string name="DragIndicationImageName" value="Accordion_ArrowOpened_Off"/>
- <string name="SpeakBtnToolTip" value="Activa/Desactiva el micrófono"/>
- <string name="VoiceControlBtnToolTip" value="Muestra/Oculta el panel del control de voz"/>
- <layout_stack name="toolbar_stack">
- <layout_panel name="speak_panel">
- <button label="Hablar" name="speak_btn" tool_tip="Activar y desactivar tu micrófono"/>
- </layout_panel>
- <layout_panel name="speak_flyout_panel">
- <button label="" name="flyout_btn" tool_tip="Cambiar tus preferencias de sonido"/>
- </layout_panel>
- <layout_panel name="gesture_panel">
- <gesture_combo_list label="Gestos" name="Gesture" tool_tip="Hacer que tu avatar realice distintas acciones"/>
- </layout_panel>
- <layout_panel name="cam_panel">
- <bottomtray_button label="Visión" name="camera_btn" tool_tip="Controlar el ángulo de tu cámara"/>
- </layout_panel>
- <layout_panel name="destinations_panel">
- <bottomtray_button label="Destinos" name="destination_btn" tool_tip="Viajar por Second Life"/>
- </layout_panel>
- <layout_panel name="avatar_panel">
- <bottomtray_button label="Mi avatar" name="avatar_btn" tool_tip="Cambiar tu aspecto"/>
- </layout_panel>
- <layout_panel name="people_panel">
- <bottomtray_button label="Gente" name="show_people_button" tool_tip="Encontrar a gente en Second Life"/>
- </layout_panel>
- <layout_panel name="profile_panel">
- <bottomtray_button label="Perfil" name="show_profile_btn" tool_tip="Consultar y editar tu perfil"/>
- </layout_panel>
- <layout_panel name="howto_panel">
- <bottomtray_button label="Indicaciones" name="show_help_btn" tool_tip="Ver la información de ayuda de Second Life"/>
- </layout_panel>
- <layout_panel name="im_well_panel">
- <chiclet_im_well name="im_well">
- <button name="Unread IM messages" tool_tip="Conversaciones"/>
- </chiclet_im_well>
- </layout_panel>
- <layout_panel name="notification_well_panel">
- <chiclet_notification name="notification_well">
- <button name="Unread" tool_tip="Notificaciones"/>
- </chiclet_notification>
- </layout_panel>
- </layout_stack>
-</panel>
diff --git a/indra/newview/skins/minimal/xui/es/panel_group_control_panel.xml b/indra/newview/skins/minimal/xui/es/panel_group_control_panel.xml
deleted file mode 100644
index e77156b0d4..0000000000
--- a/indra/newview/skins/minimal/xui/es/panel_group_control_panel.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="panel_im_control_panel">
- <layout_stack name="vertical_stack">
- <layout_panel name="end_call_btn_panel">
- <button label="Colgar" name="end_call_btn"/>
- </layout_panel>
- <layout_panel name="voice_ctrls_btn_panel">
- <button label="Abrir los controles de la voz" name="voice_ctrls_btn"/>
- </layout_panel>
- </layout_stack>
-</panel>
diff --git a/indra/newview/skins/minimal/xui/es/panel_im_control_panel.xml b/indra/newview/skins/minimal/xui/es/panel_im_control_panel.xml
deleted file mode 100644
index 93b6526f77..0000000000
--- a/indra/newview/skins/minimal/xui/es/panel_im_control_panel.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="panel_im_control_panel">
- <layout_stack name="button_stack">
- <layout_panel name="view_profile_btn_panel">
- <button label="Perfil" name="view_profile_btn"/>
- </layout_panel>
- <layout_panel name="add_friend_btn_panel">
- <button label="Añadir como amigo" name="add_friend_btn"/>
- </layout_panel>
- <layout_panel name="teleport_btn_panel">
- <button label="Teleportarte" name="teleport_btn" tool_tip="Ofrecer teleporte a esta persona"/>
- </layout_panel>
- <layout_panel name="call_btn_panel">
- <button label="Llamar" name="call_btn"/>
- </layout_panel>
- <layout_panel name="end_call_btn_panel">
- <button label="Colgar" name="end_call_btn"/>
- </layout_panel>
- <layout_panel name="block_btn_panel">
- <button label="Ignorar" name="block_btn"/>
- </layout_panel>
- <layout_panel name="unblock_btn_panel">
- <button label="No ignorar" name="unblock_btn"/>
- </layout_panel>
- <layout_panel name="volume_ctrl_panel">
- <slider name="volume_slider" tool_tip="Volumen de la llamada" value="0.5"/>
- </layout_panel>
- </layout_stack>
-</panel>
diff --git a/indra/newview/skins/minimal/xui/es/panel_login.xml b/indra/newview/skins/minimal/xui/es/panel_login.xml
deleted file mode 100644
index 689a71e277..0000000000
--- a/indra/newview/skins/minimal/xui/es/panel_login.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="panel_login">
- <panel.string name="create_account_url">
- http://join.secondlife.com/index.php?lang=es-ES
- </panel.string>
- <panel.string name="forgot_password_url">
- http://secondlife.com/account/request.php?lang=es
- </panel.string>
- <layout_stack name="login_widgets">
- <layout_panel name="login">
- <text name="username_text">
- Nombre de usuario:
- </text>
- <combo_box name="username_combo" tool_tip="El nombre de usuario que elegiste al registrarte, como bobsmith12 o Steller Sunshine"/>
- <text name="password_text">
- Contraseña:
- </text>
- <check_box label="Recordar la contraseña" name="remember_check"/>
- <button label="Iniciar sesión" name="connect_btn"/>
- <text name="mode_selection_text">
- Modo:
- </text>
- <combo_box name="mode_combo" tool_tip="Selecciona el modo. Elige Básico para una exploración rápida y fácil y para chatear. Elige Avanzado para tener acceso a más funciones.">
- <combo_box.item label="Básico" name="Basic"/>
- <combo_box.item label="Avanzado" name="Advanced"/>
- </combo_box>
- </layout_panel>
- <layout_panel name="links">
- <text name="create_new_account_text">
- Registrarme
- </text>
- <text name="forgot_password_text">
- ¿Olvidaste el nombre de usuario o la contraseña?
- </text>
- <text name="login_help">
- ¿Necesitas ayuda para conectarte?
- </text>
- </layout_panel>
- </layout_stack>
-</panel>
diff --git a/indra/newview/skins/minimal/xui/es/panel_navigation_bar.xml b/indra/newview/skins/minimal/xui/es/panel_navigation_bar.xml
deleted file mode 100644
index e8e95c3bac..0000000000
--- a/indra/newview/skins/minimal/xui/es/panel_navigation_bar.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="navigation_bar">
- <panel name="navigation_panel">
- <pull_button name="back_btn" tool_tip="Volver a lo localización anterior"/>
- <pull_button name="forward_btn" tool_tip="Ir una localización adelante"/>
- <button name="home_btn" tool_tip="Teleportar a mi Base"/>
- <location_input label="Localización" name="location_combo"/>
- <search_combo_box label="Buscar" name="search_combo_box" tool_tip="Buscar">
- <combo_editor label="Buscar en [SECOND_LIFE]" name="search_combo_editor"/>
- </search_combo_box>
- </panel>
- <favorites_bar name="favorite" tool_tip="¡Accede rápidamente a tus lugares favoritos de Second Life arrastrando hitos hasta aquí!">
- <label name="favorites_bar_label" tool_tip="¡Accede rápidamente a tus lugares favoritos de Second Life arrastrando hitos hasta aquí!">
- Barra de Favoritos
- </label>
- <chevron_button name="&gt;&gt;" tool_tip="Ver más de Mis favoritos"/>
- </favorites_bar>
-</panel>
diff --git a/indra/newview/skins/minimal/xui/es/panel_people.xml b/indra/newview/skins/minimal/xui/es/panel_people.xml
deleted file mode 100644
index a06f3010d7..0000000000
--- a/indra/newview/skins/minimal/xui/es/panel_people.xml
+++ /dev/null
@@ -1,74 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<!-- Side tray panel -->
-<panel label="Gente" name="people_panel">
- <string name="no_recent_people" value="No hay gente reciente. ¿Estás buscando gente con la que juntarte? Prueba con el botón Destinos que aparece a continuación."/>
- <string name="no_filtered_recent_people" value="No hay gente reciente con ese nombre."/>
- <string name="no_one_near" value="No hay nadie cerca. ¿Estás buscando gente con la que juntarte? Prueba con el botón Destinos que aparece a continuación."/>
- <string name="no_one_filtered_near" value="No hay nadie cerca con ese nombre."/>
- <string name="no_friends_online" value="No hay amigos conectados"/>
- <string name="no_friends" value="No hay amigos"/>
- <string name="no_friends_msg">
- Haz clic con el botón derecho del ratón en un residente para agregarlo como amigo.
-¿Estás buscando gente con la que juntarte? Prueba con el botón Destinos que aparece a continuación.
- </string>
- <string name="no_filtered_friends_msg">
- ¿No encuentras lo que buscas? Prueba con el botón Destinos que aparece a continuación.
- </string>
- <string name="people_filter_label" value="Filtrar a la gente"/>
- <string name="groups_filter_label" value="Filtrar a los grupos"/>
- <string name="no_filtered_groups_msg" value="¿No encuentras lo que buscas? Prueba con [secondlife:///app/search/groups/[SEARCH_TERM] Buscar]."/>
- <string name="no_groups_msg" value="¿Buscas grupos en que participar? Prueba la [secondlife:///app/search/groups Búsqueda]."/>
- <string name="MiniMapToolTipMsg" value="[REGIÓN](Haz doble clic para abrir el mapa y pulsa la tecla Mayús y arrastra para obtener una vista panorámica)"/>
- <string name="AltMiniMapToolTipMsg" value="[REGIÓN](Haz doble clic para teleportarte y pulsa la tecla Mayús y arrastra para obtener una vista panorámica)"/>
- <filter_editor label="Filtrar" name="filter_input"/>
- <tab_container name="tabs">
- <panel label="CERCANA" name="nearby_panel">
- <panel label="bottom_panel" name="bottom_panel"/>
- </panel>
- <panel label="MIS AMIGOS" name="friends_panel">
- <accordion name="friends_accordion">
- <accordion_tab name="tab_online" title="Conectado"/>
- <accordion_tab name="tab_all" title="Todos"/>
- </accordion>
- <panel label="bottom_panel" name="bottom_panel">
- <layout_stack name="bottom_panel">
- <layout_panel name="trash_btn_panel">
- <dnd_button name="del_btn" tool_tip="Quitar a la persona seleccionada de tu lista de amigos"/>
- </layout_panel>
- </layout_stack>
- </panel>
- </panel>
- <panel label="RECIENTE" name="recent_panel">
- <panel label="bottom_panel" name="bottom_panel">
- <button name="add_friend_btn" tool_tip="Añadir al Residente seleccionado a la lista de tus amigos"/>
- </panel>
- </panel>
- </tab_container>
- <panel name="button_bar">
- <layout_stack name="bottom_bar_ls">
- <layout_panel name="view_profile_btn_lp">
- <button label="Perfil" name="view_profile_btn" tool_tip="Mostrar imágenes, grupos y otra información del Residente"/>
- </layout_panel>
- <layout_panel name="im_btn_lp">
- <button label="MI" name="im_btn" tool_tip="Abrir una sesión de mensajes instantáneos"/>
- </layout_panel>
- <layout_panel name="call_btn_lp">
- <button label="Llamar" name="call_btn" tool_tip="Llamar a este Residente"/>
- </layout_panel>
- <layout_panel name="teleport_btn_lp">
- <button label="Teleportarte" name="teleport_btn" tool_tip="Ofrecer teleporte"/>
- </layout_panel>
- </layout_stack>
- <layout_stack name="bottom_bar_ls1">
- <layout_panel name="group_info_btn_lp">
- <button label="Perfil del grupo" name="group_info_btn" tool_tip="Ver la información del grupo"/>
- </layout_panel>
- <layout_panel name="chat_btn_lp">
- <button label="Chat de grupo" name="chat_btn" tool_tip="Abrir el chat"/>
- </layout_panel>
- <layout_panel name="group_call_btn_lp">
- <button label="Llamar al grupo" name="group_call_btn" tool_tip="Llama a este grupo"/>
- </layout_panel>
- </layout_stack>
- </panel>
-</panel>
diff --git a/indra/newview/skins/minimal/xui/es/panel_side_tray_tab_caption.xml b/indra/newview/skins/minimal/xui/es/panel_side_tray_tab_caption.xml
deleted file mode 100644
index 775e343dc9..0000000000
--- a/indra/newview/skins/minimal/xui/es/panel_side_tray_tab_caption.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="sidetray_tab_panel">
- <text name="sidetray_tab_title" value="Panel lateral"/>
- <button name="undock" tool_tip="Soltar"/>
- <button name="dock" tool_tip="Fijar"/>
- <button name="show_help" tool_tip="Ver ayuda"/>
-</panel>
diff --git a/indra/newview/skins/minimal/xui/es/panel_status_bar.xml b/indra/newview/skins/minimal/xui/es/panel_status_bar.xml
deleted file mode 100644
index f3db35e8ec..0000000000
--- a/indra/newview/skins/minimal/xui/es/panel_status_bar.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="status">
- <panel.string name="packet_loss_tooltip">
- Pérdida de paquetes
- </panel.string>
- <panel.string name="bandwidth_tooltip">
- Ancho de banda
- </panel.string>
- <panel.string name="time">
- [hour12, datetime, slt]:[min, datetime, slt] [ampm, datetime, slt] [timezone,datetime, slt]
- </panel.string>
- <panel.string name="timeTooltip">
- [weekday, datetime, slt], [day, datetime, slt] [month, datetime, slt] [year, datetime, slt]
- </panel.string>
- <panel.string name="buycurrencylabel">
- [AMT] L$
- </panel.string>
- <combo_box name="mode_combo" tool_tip="Selecciona el modo. Elige Básico para una exploración rápida y fácil y para chatear. Elige Avanzado para tener acceso a más funciones.">
- <combo_box.item label="Modo Básico" name="Basic"/>
- <combo_box.item label="Modo Avanzado" name="Advanced"/>
- </combo_box>
- <button name="media_toggle_btn" tool_tip="Iniciar/Parar todos los media (música, vídeo, páginas web)"/>
- <button name="volume_btn" tool_tip="Control general del volumen"/>
-</panel>
diff --git a/indra/newview/skins/minimal/xui/fr/floater_camera.xml b/indra/newview/skins/minimal/xui/fr/floater_camera.xml
deleted file mode 100644
index 1d62a89ff2..0000000000
--- a/indra/newview/skins/minimal/xui/fr/floater_camera.xml
+++ /dev/null
@@ -1,65 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="camera_floater">
- <floater.string name="rotate_tooltip">
- Faire tourner la caméra autour du point central
- </floater.string>
- <floater.string name="zoom_tooltip">
- Zoomer en direction du point central
- </floater.string>
- <floater.string name="move_tooltip">
- Déplacer la caméra vers le haut et le bas, la gauche et la droite
- </floater.string>
- <floater.string name="camera_modes_title">
- Modes
- </floater.string>
- <floater.string name="pan_mode_title">
- Rotation - Zoom - Panoramique
- </floater.string>
- <floater.string name="presets_mode_title">
- Préréglages
- </floater.string>
- <floater.string name="free_mode_title">
- Voir l&apos;objet
- </floater.string>
- <panel name="controls">
- <panel name="preset_views_list">
- <panel_camera_item name="front_view">
- <panel_camera_item.text name="front_view_text">
- Vue frontale
- </panel_camera_item.text>
- </panel_camera_item>
- <panel_camera_item name="group_view">
- <panel_camera_item.text name="side_view_text">
- Vue latérale
- </panel_camera_item.text>
- </panel_camera_item>
- <panel_camera_item name="rear_view">
- <panel_camera_item.text name="rear_view_text">
- Vue arrière
- </panel_camera_item.text>
- </panel_camera_item>
- </panel>
- <panel name="camera_modes_list">
- <panel_camera_item name="object_view">
- <panel_camera_item.text name="object_view_text">
- Vue de l&apos;objet
- </panel_camera_item.text>
- </panel_camera_item>
- <panel_camera_item name="mouselook_view">
- <panel_camera_item.text name="mouselook_view_text">
- Vue subjective
- </panel_camera_item.text>
- </panel_camera_item>
- </panel>
- <panel name="zoom" tool_tip="Zoomer en direction du point central">
- <joystick_rotate name="cam_rotate_stick" tool_tip="Faire tourner la caméra autour du point central"/>
- <slider_bar name="zoom_slider" tool_tip="Zoomer en direction du point central"/>
- <joystick_track name="cam_track_stick" tool_tip="Déplacer la caméra vers le haut et le bas, la gauche et la droite"/>
- </panel>
- </panel>
- <panel name="buttons">
- <button label="" name="presets_btn" tool_tip="Préréglages"/>
- <button label="" name="pan_btn" tool_tip="Rotation - Zoom - Panoramique"/>
- <button label="" name="avatarview_btn" tool_tip="Modes"/>
- </panel>
-</floater>
diff --git a/indra/newview/skins/minimal/xui/fr/floater_help_browser.xml b/indra/newview/skins/minimal/xui/fr/floater_help_browser.xml
deleted file mode 100644
index 09d763b809..0000000000
--- a/indra/newview/skins/minimal/xui/fr/floater_help_browser.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_help_browser" title="AIDE RAPIDE">
- <floater.string name="loading_text">
- Chargement…
- </floater.string>
- <layout_stack name="stack1">
- <layout_panel name="external_controls"/>
- </layout_stack>
-</floater>
diff --git a/indra/newview/skins/minimal/xui/fr/floater_media_browser.xml b/indra/newview/skins/minimal/xui/fr/floater_media_browser.xml
deleted file mode 100644
index ba171c6363..0000000000
--- a/indra/newview/skins/minimal/xui/fr/floater_media_browser.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_about" title="NAVIGATEUR DE MÉDIAS">
- <floater.string name="home_page_url">
- http://www.secondlife.com
- </floater.string>
- <floater.string name="support_page_url">
- http://support.secondlife.com
- </floater.string>
- <layout_stack name="stack1">
- <layout_panel name="nav_controls">
- <button label="Préc." name="back"/>
- <button label="Suiv." name="forward"/>
- <button label="Recharger" name="reload"/>
- <button label="OK" name="go"/>
- </layout_panel>
- <layout_panel name="time_controls">
- <button label="retour" name="rewind"/>
- <button label="stop" name="stop"/>
- <button label="avance" name="seek"/>
- </layout_panel>
- <layout_panel name="parcel_owner_controls">
- <button label="Envoyer la page actuelle à la parcelle" name="assign"/>
- </layout_panel>
- <layout_panel name="external_controls">
- <button label="Ouvrir dans mon navigateur Web" name="open_browser"/>
- <check_box label="Toujours ouvrir dans mon navigateur Web" name="open_always"/>
- <button label="Fermer" name="close"/>
- </layout_panel>
- </layout_stack>
-</floater>
diff --git a/indra/newview/skins/minimal/xui/fr/floater_nearby_chat.xml b/indra/newview/skins/minimal/xui/fr/floater_nearby_chat.xml
deleted file mode 100644
index 9b1b21c434..0000000000
--- a/indra/newview/skins/minimal/xui/fr/floater_nearby_chat.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="nearby_chat" title="CHAT PRÈS DE MOI">
- <check_box label="Traduction du chat (fournie par Google)" name="translate_chat_checkbox"/>
-</floater>
diff --git a/indra/newview/skins/minimal/xui/fr/floater_web_content.xml b/indra/newview/skins/minimal/xui/fr/floater_web_content.xml
deleted file mode 100644
index 71f44b6ec3..0000000000
--- a/indra/newview/skins/minimal/xui/fr/floater_web_content.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_web_content" title="">
- <layout_stack name="stack1">
- <layout_panel name="nav_controls">
- <button name="back" tool_tip="Précédente"/>
- <button name="forward" tool_tip="Suivante"/>
- <button name="stop" tool_tip="Arrêter"/>
- <button name="reload" tool_tip="Recharger la page"/>
- <combo_box name="address" tool_tip="Saisir une URL ici"/>
- <icon name="media_secure_lock_flag" tool_tip="Navigation sécurisée"/>
- <button name="popexternal" tool_tip="Ouvrir l&apos;URL actuelle dans votre navigateur de bureau"/>
- </layout_panel>
- </layout_stack>
-</floater>
diff --git a/indra/newview/skins/minimal/xui/fr/inspect_avatar.xml b/indra/newview/skins/minimal/xui/fr/inspect_avatar.xml
deleted file mode 100644
index 553646f8e9..0000000000
--- a/indra/newview/skins/minimal/xui/fr/inspect_avatar.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<!--
- Not can_close / no title to avoid window chrome
- Single instance - only have one at a time, recycle it each spawn
--->
-<floater name="inspect_avatar">
- <string name="Subtitle">
- [AGE]
- </string>
- <string name="Details">
- [SL_PROFILE]
- </string>
- <text name="user_subtitle" value="11 mois, 3 jours"/>
- <text name="user_details">
- This is my second life description and I really think it is great. But for some reason my description is super extra long because I like to talk a whole lot
- </text>
- <slider name="volume_slider" tool_tip="Volume de la voix" value="0.5"/>
- <button label="Devenir amis" name="add_friend_btn"/>
- <button label="IM" name="im_btn"/>
- <button label="Profil" name="view_profile_btn"/>
- <panel name="moderator_panel">
- <button label="Désactiver le chat vocal" name="disable_voice"/>
- <button label="Activer le chat vocal" name="enable_voice"/>
- </panel>
-</floater>
diff --git a/indra/newview/skins/minimal/xui/fr/inspect_object.xml b/indra/newview/skins/minimal/xui/fr/inspect_object.xml
deleted file mode 100644
index b66af7a2bf..0000000000
--- a/indra/newview/skins/minimal/xui/fr/inspect_object.xml
+++ /dev/null
@@ -1,48 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<!--
- Not can_close / no title to avoid window chrome
- Single instance - only have one at a time, recycle it each spawn
--->
-<floater name="inspect_object">
- <string name="Creator">
- Par [CREATOR]
- </string>
- <string name="CreatorAndOwner">
- De [CREATOR]
-Propriétaire [OWNER]
- </string>
- <string name="Price">
- [AMOUNT] L$
- </string>
- <string name="PriceFree">
- Gratuit !
- </string>
- <string name="Touch">
- Toucher
- </string>
- <string name="Sit">
- M&apos;asseoir
- </string>
- <text name="object_name" value="Test Object Name That Is actually two lines and Really Long"/>
- <text name="object_creator">
- par secondlife:///app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/about
-owner secondlife:///app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/about
- </text>
- <text name="price_text">
- 30 000 L$
- </text>
- <text name="object_description">
- This is a really long description for an object being as how it is at least 80 characters in length and so but maybe more like 120 at this point. Who knows, really?
- </text>
- <text name="object_media_url">
- http://www.superdupertest.com
- </text>
- <button label="Acheter" name="buy_btn"/>
- <button label="Payer" name="pay_btn"/>
- <button label="Prendre une copie" name="take_free_copy_btn"/>
- <button label="Toucher" name="touch_btn"/>
- <button label="M&apos;asseoir" name="sit_btn"/>
- <button label="Ouvert" name="open_btn"/>
- <icon name="secure_browsing" tool_tip="Navigation sécurisée"/>
- <button label="Plus" name="more_info_btn"/>
-</floater>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_add_wearable_gear.xml b/indra/newview/skins/minimal/xui/fr/menu_add_wearable_gear.xml
deleted file mode 100644
index 7e7993175e..0000000000
--- a/indra/newview/skins/minimal/xui/fr/menu_add_wearable_gear.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Add Wearable Gear Menu">
- <menu_item_check label="Trier en commençant par le plus récent" name="sort_by_most_recent"/>
- <menu_item_check label="Trier par nom" name="sort_by_name"/>
- <menu_item_check label="Trier par type" name="sort_by_type"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_attachment_other.xml b/indra/newview/skins/minimal/xui/fr/menu_attachment_other.xml
deleted file mode 100644
index f48513eb2b..0000000000
--- a/indra/newview/skins/minimal/xui/fr/menu_attachment_other.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<!-- *NOTE: See also menu_avatar_other.xml -->
-<context_menu name="Avatar Pie">
- <menu_item_call label="Voir le profil" name="Profile..."/>
- <menu_item_call label="Devenir amis" name="Add Friend"/>
- <menu_item_call label="IM" name="Send IM..."/>
- <menu_item_call label="Appeler" name="Call"/>
- <menu_item_call label="Inviter dans le groupe" name="Invite..."/>
- <menu_item_call label="Ignorer" name="Avatar Mute"/>
- <menu_item_call label="Signaler" name="abuse"/>
- <menu_item_call label="Figer" name="Freeze..."/>
- <menu_item_call label="Expulser" name="Eject..."/>
- <menu_item_call label="Déboguer les textures" name="Debug..."/>
- <menu_item_call label="Zoomer en avant" name="Zoom In"/>
- <menu_item_call label="Payer" name="Pay..."/>
- <menu_item_call label="Profil de l&apos;objet" name="Object Inspect"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_attachment_self.xml b/indra/newview/skins/minimal/xui/fr/menu_attachment_self.xml
deleted file mode 100644
index 78198fb5a8..0000000000
--- a/indra/newview/skins/minimal/xui/fr/menu_attachment_self.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Attachment Pie">
- <menu_item_call label="Toucher" name="Attachment Object Touch"/>
- <menu_item_call label="Modifier" name="Edit..."/>
- <menu_item_call label="Détacher" name="Detach"/>
- <menu_item_call label="M&apos;asseoir" name="Sit Down Here"/>
- <menu_item_call label="Me lever" name="Stand Up"/>
- <menu_item_call label="Changer de tenue" name="Change Outfit"/>
- <menu_item_call label="Modifier ma tenue" name="Edit Outfit"/>
- <menu_item_call label="Modifier ma silhouette" name="Edit My Shape"/>
- <menu_item_call label="Mes amis" name="Friends..."/>
- <menu_item_call label="Mes groupes" name="Groups..."/>
- <menu_item_call label="Mon profil" name="Profile..."/>
- <menu_item_call label="Déboguer les textures" name="Debug..."/>
- <menu_item_call label="Lâcher" name="Drop"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_avatar_icon.xml b/indra/newview/skins/minimal/xui/fr/menu_avatar_icon.xml
deleted file mode 100644
index 3bac25c79b..0000000000
--- a/indra/newview/skins/minimal/xui/fr/menu_avatar_icon.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Avatar Icon Menu">
- <menu_item_call label="Voir le profil" name="Show Profile"/>
- <menu_item_call label="Envoyer IM..." name="Send IM"/>
- <menu_item_call label="Devenir amis..." name="Add Friend"/>
- <menu_item_call label="Supprimer cet ami..." name="Remove Friend"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_avatar_other.xml b/indra/newview/skins/minimal/xui/fr/menu_avatar_other.xml
deleted file mode 100644
index 08d1a20361..0000000000
--- a/indra/newview/skins/minimal/xui/fr/menu_avatar_other.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<!-- *NOTE: See also menu_attachment_other.xml -->
-<context_menu name="Avatar Pie">
- <menu_item_call label="Voir le profil" name="Profile..."/>
- <menu_item_call label="Devenir amis" name="Add Friend"/>
- <menu_item_call label="IM" name="Send IM..."/>
- <menu_item_call label="Appeler" name="Call"/>
- <menu_item_call label="Inviter dans le groupe" name="Invite..."/>
- <menu_item_call label="Ignorer" name="Avatar Mute"/>
- <menu_item_call label="Signaler" name="abuse"/>
- <menu_item_call label="Figer" name="Freeze..."/>
- <menu_item_call label="Expulser" name="Eject..."/>
- <menu_item_call label="Déboguer les textures" name="Debug..."/>
- <menu_item_call label="Zoomer en avant" name="Zoom In"/>
- <menu_item_call label="Payer" name="Pay..."/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_avatar_self.xml b/indra/newview/skins/minimal/xui/fr/menu_avatar_self.xml
deleted file mode 100644
index c7ee2e9f88..0000000000
--- a/indra/newview/skins/minimal/xui/fr/menu_avatar_self.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Self Pie">
- <menu_item_call label="M&apos;asseoir" name="Sit Down Here"/>
- <menu_item_call label="Me lever" name="Stand Up"/>
- <context_menu label="Enlever" name="Take Off &gt;">
- <context_menu label="Habits" name="Clothes &gt;">
- <menu_item_call label="Chemise" name="Shirt"/>
- <menu_item_call label="Pantalon" name="Pants"/>
- <menu_item_call label="Jupe" name="Skirt"/>
- <menu_item_call label="Chaussures" name="Shoes"/>
- <menu_item_call label="Chaussettes" name="Socks"/>
- <menu_item_call label="Veste" name="Jacket"/>
- <menu_item_call label="Gants" name="Gloves"/>
- <menu_item_call label="Débardeur" name="Self Undershirt"/>
- <menu_item_call label="Caleçon" name="Self Underpants"/>
- <menu_item_call label="Tatouage" name="Self Tattoo"/>
- <menu_item_call label="Alpha" name="Self Alpha"/>
- <menu_item_call label="Tous les habits" name="All Clothes"/>
- </context_menu>
- <context_menu label="HUD" name="Object Detach HUD"/>
- <context_menu label="Détacher" name="Object Detach"/>
- <menu_item_call label="Tout détacher" name="Detach All"/>
- </context_menu>
- <menu_item_call label="Changer de tenue" name="Chenge Outfit"/>
- <menu_item_call label="Modifier ma tenue" name="Edit Outfit"/>
- <menu_item_call label="Modifier ma silhouette" name="Edit My Shape"/>
- <menu_item_call label="Mes amis" name="Friends..."/>
- <menu_item_call label="Mes groupes" name="Groups..."/>
- <menu_item_call label="Mon profil" name="Profile..."/>
- <menu_item_call label="Déboguer les textures" name="Debug..."/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_bottomtray.xml b/indra/newview/skins/minimal/xui/fr/menu_bottomtray.xml
deleted file mode 100644
index bfdc89c5bb..0000000000
--- a/indra/newview/skins/minimal/xui/fr/menu_bottomtray.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="hide_camera_move_controls_menu">
- <menu_item_check label="Bouton Geste" name="ShowGestureButton"/>
- <menu_item_check label="Bouton Bouger" name="ShowMoveButton"/>
- <menu_item_check label="Bouton Affichage" name="ShowCameraButton"/>
- <menu_item_check label="Bouton Photo" name="ShowSnapshotButton"/>
- <menu_item_check label="Bouton Panneau latéral" name="ShowSidebarButton"/>
- <menu_item_check label="Bouton Construire" name="ShowBuildButton"/>
- <menu_item_check label="Bouton Rechercher" name="ShowSearchButton"/>
- <menu_item_check label="Bouton Carte" name="ShowWorldMapButton"/>
- <menu_item_check label="Bouton Mini-carte" name="ShowMiniMapButton"/>
- <menu_item_call label="Couper" name="NearbyChatBar_Cut"/>
- <menu_item_call label="Copier" name="NearbyChatBar_Copy"/>
- <menu_item_call label="Coller" name="NearbyChatBar_Paste"/>
- <menu_item_call label="Supprimer" name="NearbyChatBar_Delete"/>
- <menu_item_call label="Tout sélectionner" name="NearbyChatBar_Select_All"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_cof_attachment.xml b/indra/newview/skins/minimal/xui/fr/menu_cof_attachment.xml
deleted file mode 100644
index a4ead48b6b..0000000000
--- a/indra/newview/skins/minimal/xui/fr/menu_cof_attachment.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="COF Attachment">
- <menu_item_call label="Détacher" name="detach"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_cof_body_part.xml b/indra/newview/skins/minimal/xui/fr/menu_cof_body_part.xml
deleted file mode 100644
index 4b6907fcc6..0000000000
--- a/indra/newview/skins/minimal/xui/fr/menu_cof_body_part.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="COF Body">
- <menu_item_call label="Remplacer" name="replace"/>
- <menu_item_call label="Modifier" name="edit"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_cof_clothing.xml b/indra/newview/skins/minimal/xui/fr/menu_cof_clothing.xml
deleted file mode 100644
index 03cc569704..0000000000
--- a/indra/newview/skins/minimal/xui/fr/menu_cof_clothing.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="COF Clothing">
- <menu_item_call label="Enlever" name="take_off"/>
- <menu_item_call label="Modifier" name="edit"/>
- <menu_item_call label="Remplacer" name="replace"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_cof_gear.xml b/indra/newview/skins/minimal/xui/fr/menu_cof_gear.xml
deleted file mode 100644
index 8276d57025..0000000000
--- a/indra/newview/skins/minimal/xui/fr/menu_cof_gear.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Gear COF">
- <menu label="Nouveaux habits" name="COF.Gear.New_Clothes"/>
- <menu label="Nouvelles parties du corps" name="COF.Geear.New_Body_Parts"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_edit.xml b/indra/newview/skins/minimal/xui/fr/menu_edit.xml
deleted file mode 100644
index 56669f31e1..0000000000
--- a/indra/newview/skins/minimal/xui/fr/menu_edit.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu label="Modifier" name="Edit">
- <menu_item_call label="Annuler" name="Undo"/>
- <menu_item_call label="Refaire" name="Redo"/>
- <menu_item_call label="Couper" name="Cut"/>
- <menu_item_call label="Copier" name="Copy"/>
- <menu_item_call label="Coller" name="Paste"/>
- <menu_item_call label="Supprimer" name="Delete"/>
- <menu_item_call label="Dupliquer" name="Duplicate"/>
- <menu_item_call label="Tout sélectionner" name="Select All"/>
- <menu_item_call label="Désélectionner" name="Deselect"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_favorites.xml b/indra/newview/skins/minimal/xui/fr/menu_favorites.xml
deleted file mode 100644
index 5f1545fde7..0000000000
--- a/indra/newview/skins/minimal/xui/fr/menu_favorites.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Popup">
- <menu_item_call label="Téléporter" name="Teleport To Landmark"/>
- <menu_item_call label="Voir/Modifier le repère" name="Landmark Open"/>
- <menu_item_call label="Copier la SLurl" name="Copy slurl"/>
- <menu_item_call label="Voir sur la carte" name="Show On Map"/>
- <menu_item_call label="Copier" name="Landmark Copy"/>
- <menu_item_call label="Coller" name="Landmark Paste"/>
- <menu_item_call label="Supprimer" name="Delete"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_gesture_gear.xml b/indra/newview/skins/minimal/xui/fr/menu_gesture_gear.xml
deleted file mode 100644
index 062dd0f005..0000000000
--- a/indra/newview/skins/minimal/xui/fr/menu_gesture_gear.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_gesture_gear">
- <menu_item_call label="Ajouter/Supprimer des favoris" name="activate"/>
- <menu_item_call label="Copier" name="copy_gesture"/>
- <menu_item_call label="Coller" name="paste"/>
- <menu_item_call label="Copier l&apos;UUID" name="copy_uuid"/>
- <menu_item_call label="Enregistrer dans la tenue actuelle" name="save_to_outfit"/>
- <menu_item_call label="Modifier" name="edit_gesture"/>
- <menu_item_call label="Inspecter" name="inspect"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_group_plus.xml b/indra/newview/skins/minimal/xui/fr/menu_group_plus.xml
deleted file mode 100644
index 0db5afedc7..0000000000
--- a/indra/newview/skins/minimal/xui/fr/menu_group_plus.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_group_plus">
- <menu_item_call label="Rejoindre des groupes..." name="item_join"/>
- <menu_item_call label="Nouveau groupe..." name="item_new"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_hide_navbar.xml b/indra/newview/skins/minimal/xui/fr/menu_hide_navbar.xml
deleted file mode 100644
index 20af901ddc..0000000000
--- a/indra/newview/skins/minimal/xui/fr/menu_hide_navbar.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="hide_navbar_menu">
- <menu_item_check label="Afficher la barre de navigation" name="ShowNavbarNavigationPanel"/>
- <menu_item_check label="Afficher la barre des favoris" name="ShowNavbarFavoritesPanel"/>
- <menu_item_check label="Afficher la mini-barre d&apos;emplacement" name="ShowMiniLocationPanel"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_im_well_button.xml b/indra/newview/skins/minimal/xui/fr/menu_im_well_button.xml
deleted file mode 100644
index 8ef1529e6b..0000000000
--- a/indra/newview/skins/minimal/xui/fr/menu_im_well_button.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="IM Well Button Context Menu">
- <menu_item_call label="Tout fermer" name="Close All"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_imchiclet_adhoc.xml b/indra/newview/skins/minimal/xui/fr/menu_imchiclet_adhoc.xml
deleted file mode 100644
index 4d9a103058..0000000000
--- a/indra/newview/skins/minimal/xui/fr/menu_imchiclet_adhoc.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="IMChiclet AdHoc Menu">
- <menu_item_call label="Mettre fin à la session" name="End Session"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_imchiclet_group.xml b/indra/newview/skins/minimal/xui/fr/menu_imchiclet_group.xml
deleted file mode 100644
index 59f97d8b48..0000000000
--- a/indra/newview/skins/minimal/xui/fr/menu_imchiclet_group.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="IMChiclet Group Menu">
- <menu_item_call label="Profil du groupe" name="Show Profile"/>
- <menu_item_call label="Afficher la session" name="Chat"/>
- <menu_item_call label="Mettre fin à la session" name="End Session"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_imchiclet_p2p.xml b/indra/newview/skins/minimal/xui/fr/menu_imchiclet_p2p.xml
deleted file mode 100644
index ecc8cee413..0000000000
--- a/indra/newview/skins/minimal/xui/fr/menu_imchiclet_p2p.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="IMChiclet P2P Menu">
- <menu_item_call label="Voir le profil" name="Show Profile"/>
- <menu_item_call label="Devenir amis" name="Add Friend"/>
- <menu_item_call label="Afficher la session" name="Send IM"/>
- <menu_item_call label="Mettre fin à la session" name="End Session"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_inspect_avatar_gear.xml b/indra/newview/skins/minimal/xui/fr/menu_inspect_avatar_gear.xml
deleted file mode 100644
index c3240fa541..0000000000
--- a/indra/newview/skins/minimal/xui/fr/menu_inspect_avatar_gear.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<toggleable_menu name="Gear Menu">
- <menu_item_call label="Voir le profil" name="view_profile"/>
- <menu_item_call label="Devenir amis" name="add_friend"/>
- <menu_item_call label="IM" name="im"/>
- <menu_item_call label="Appeler" name="call"/>
- <menu_item_call label="Téléporter" name="teleport"/>
- <menu_item_call label="Ignorer" name="block"/>
- <menu_item_call label="Ne plus ignorer" name="unblock"/>
- <menu_item_call label="Signaler" name="report"/>
- <menu_item_call label="Figer" name="freeze"/>
- <menu_item_call label="Expulser" name="eject"/>
- <menu_item_call label="Éjecter" name="kick"/>
- <menu_item_call label="Représentant de l&apos;Assistance client" name="csr"/>
- <menu_item_call label="Déboguer les textures" name="debug"/>
- <menu_item_call label="Situer sur la carte" name="find_on_map"/>
- <menu_item_call label="Zoomer en avant" name="zoom_in"/>
-</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_inspect_object_gear.xml b/indra/newview/skins/minimal/xui/fr/menu_inspect_object_gear.xml
deleted file mode 100644
index 074bb54cdc..0000000000
--- a/indra/newview/skins/minimal/xui/fr/menu_inspect_object_gear.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<menu name="Gear Menu">
- <menu_item_call label="Toucher" name="touch"/>
- <menu_item_call label="M&apos;asseoir" name="sit"/>
- <menu_item_call label="Payer" name="pay"/>
- <menu_item_call label="Acheter" name="buy"/>
- <menu_item_call label="Prendre" name="take"/>
- <menu_item_call label="Prendre une copie" name="take_copy"/>
- <menu_item_call label="Ouvrir" name="open"/>
- <menu_item_call label="Modifier" name="edit"/>
- <menu_item_call label="Porter" name="wear"/>
- <menu_item_call label="Ajouter" name="add"/>
- <menu_item_call label="Signaler" name="report"/>
- <menu_item_call label="Ignorer" name="block"/>
- <menu_item_call label="Zoomer en avant" name="zoom_in"/>
- <menu_item_call label="Supprimer" name="remove"/>
- <menu_item_call label="En savoir plus" name="more_info"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_inspect_self_gear.xml b/indra/newview/skins/minimal/xui/fr/menu_inspect_self_gear.xml
deleted file mode 100644
index fd48aa4f7d..0000000000
--- a/indra/newview/skins/minimal/xui/fr/menu_inspect_self_gear.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<toggleable_menu name="Self Pie">
- <menu_item_call label="M&apos;asseoir" name="Sit Down Here"/>
- <menu_item_call label="Me lever" name="Stand Up"/>
- <menu_item_call label="Mes amis" name="Friends..."/>
- <menu_item_call label="Mon profil" name="Profile..."/>
- <menu_item_call label="Déboguer les textures" name="Debug..."/>
-</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_inv_offer_chiclet.xml b/indra/newview/skins/minimal/xui/fr/menu_inv_offer_chiclet.xml
deleted file mode 100644
index a9b2883cca..0000000000
--- a/indra/newview/skins/minimal/xui/fr/menu_inv_offer_chiclet.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="InvOfferChiclet Menu">
- <menu_item_call label="Fermer" name="Close"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_inventory.xml b/indra/newview/skins/minimal/xui/fr/menu_inventory.xml
deleted file mode 100644
index a2279cf0ac..0000000000
--- a/indra/newview/skins/minimal/xui/fr/menu_inventory.xml
+++ /dev/null
@@ -1,86 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Popup">
- <menu_item_call label="Partager" name="Share"/>
- <menu_item_call label="Acheter" name="Task Buy"/>
- <menu_item_call label="Ouvrir" name="Task Open"/>
- <menu_item_call label="Jouer" name="Task Play"/>
- <menu_item_call label="Propriétés" name="Task Properties"/>
- <menu_item_call label="Renommer" name="Task Rename"/>
- <menu_item_call label="Supprimer" name="Task Remove"/>
- <menu_item_call label="Vider la corbeille" name="Empty Trash"/>
- <menu_item_call label="Vider les objets trouvés" name="Empty Lost And Found"/>
- <menu_item_call label="Nouveau dossier" name="New Folder"/>
- <menu_item_call label="Nouveau script" name="New Script"/>
- <menu_item_call label="Nouvelle note" name="New Note"/>
- <menu_item_call label="Nouveau geste" name="New Gesture"/>
- <menu label="Nouveaux habits" name="New Clothes">
- <menu_item_call label="Nouvelle chemise" name="New Shirt"/>
- <menu_item_call label="Nouveau pantalon" name="New Pants"/>
- <menu_item_call label="Nouvelles chaussures" name="New Shoes"/>
- <menu_item_call label="Nouvelles chaussettes" name="New Socks"/>
- <menu_item_call label="Nouvelle veste" name="New Jacket"/>
- <menu_item_call label="Nouvelle jupe" name="New Skirt"/>
- <menu_item_call label="Nouveaux gants" name="New Gloves"/>
- <menu_item_call label="Nouveau débardeur" name="New Undershirt"/>
- <menu_item_call label="Nouveau caleçon" name="New Underpants"/>
- <menu_item_call label="Nouveau masque alpha" name="New Alpha Mask"/>
- <menu_item_call label="Nouveau tatouage" name="New Tattoo"/>
- </menu>
- <menu label="Nouvelles parties du corps" name="New Body Parts">
- <menu_item_call label="Nouvelle silhouette" name="New Shape"/>
- <menu_item_call label="Nouvelle peau" name="New Skin"/>
- <menu_item_call label="Nouveaux cheveux" name="New Hair"/>
- <menu_item_call label="Nouveaux yeux" name="New Eyes"/>
- </menu>
- <menu label="Changer de type" name="Change Type">
- <menu_item_call label="Défaut" name="Default"/>
- <menu_item_call label="Gants" name="Gloves"/>
- <menu_item_call label="Veste" name="Jacket"/>
- <menu_item_call label="Pantalon" name="Pants"/>
- <menu_item_call label="Silhouette" name="Shape"/>
- <menu_item_call label="Chaussures" name="Shoes"/>
- <menu_item_call label="Chemise" name="Shirt"/>
- <menu_item_call label="Jupe" name="Skirt"/>
- <menu_item_call label="Caleçon" name="Underpants"/>
- <menu_item_call label="Débardeur" name="Undershirt"/>
- </menu>
- <menu_item_call label="Téléporter" name="Landmark Open"/>
- <menu_item_call label="Ouvrir" name="Animation Open"/>
- <menu_item_call label="Ouvrir" name="Sound Open"/>
- <menu_item_call label="Remplacer la tenue actuelle" name="Replace Outfit"/>
- <menu_item_call label="Ajouter à la tenue actuelle" name="Add To Outfit"/>
- <menu_item_call label="Enlever de la tenue actuelle" name="Remove From Outfit"/>
- <menu_item_call label="Trouver l&apos;original" name="Find Original"/>
- <menu_item_call label="Purger l&apos;objet" name="Purge Item"/>
- <menu_item_call label="Restaurer l&apos;objet" name="Restore Item"/>
- <menu_item_call label="Ouvrir" name="Open"/>
- <menu_item_call label="Ouvrir l&apos;original" name="Open Original"/>
- <menu_item_call label="Propriétés" name="Properties"/>
- <menu_item_call label="Renommer" name="Rename"/>
- <menu_item_call label="Copier l&apos;UUID (identifiant universel unique)" name="Copy Asset UUID"/>
- <menu_item_call label="Copier" name="Copy"/>
- <menu_item_call label="Coller" name="Paste"/>
- <menu_item_call label="Coller comme lien" name="Paste As Link"/>
- <menu_item_call label="Supprimer" name="Remove Link"/>
- <menu_item_call label="Supprimer" name="Delete"/>
- <menu_item_call label="Supprimer le dossier système" name="Delete System Folder"/>
- <menu_item_call label="Démarrer le chat conférence" name="Conference Chat Folder"/>
- <menu_item_call label="Jouer" name="Sound Play"/>
- <menu_item_call label="À propos du repère" name="About Landmark"/>
- <menu_item_call label="Jouer dans Second Life" name="Animation Play"/>
- <menu_item_call label="Jouer localement" name="Animation Audition"/>
- <menu_item_call label="Envoyer un message instantané" name="Send Instant Message"/>
- <menu_item_call label="Offrir de téléporter..." name="Offer Teleport..."/>
- <menu_item_call label="Démarrer le chat conférence" name="Conference Chat"/>
- <menu_item_call label="Activer" name="Activate"/>
- <menu_item_call label="Désactiver" name="Deactivate"/>
- <menu_item_call label="Enregistrer sous" name="Save As"/>
- <menu_item_call label="Détacher de vous" name="Detach From Yourself"/>
- <menu_item_call label="Porter" name="Wearable And Object Wear"/>
- <menu label="Attacher à" name="Attach To"/>
- <menu label="Attacher au HUD " name="Attach To HUD"/>
- <menu_item_call label="Modifier" name="Wearable Edit"/>
- <menu_item_call label="Ajouter" name="Wearable Add"/>
- <menu_item_call label="Enlever" name="Take Off"/>
- <menu_item_call label="--aucune option--" name="--no options--"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_inventory_add.xml b/indra/newview/skins/minimal/xui/fr/menu_inventory_add.xml
deleted file mode 100644
index fe096b4a7e..0000000000
--- a/indra/newview/skins/minimal/xui/fr/menu_inventory_add.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_inventory_add">
- <menu label="Importer" name="upload">
- <menu_item_call label="Image ([COST] L$)..." name="Upload Image"/>
- <menu_item_call label="Son ([COST] L$)..." name="Upload Sound"/>
- <menu_item_call label="Animation ([COST] L$)..." name="Upload Animation"/>
- <menu_item_call label="Lot ([COST] L$ par fichier)..." name="Bulk Upload"/>
- <menu_item_call label="Définir les droits de chargement par défaut" name="perm prefs"/>
- </menu>
- <menu_item_call label="Nouveau dossier" name="New Folder"/>
- <menu_item_call label="Nouveau script" name="New Script"/>
- <menu_item_call label="Nouvelle note" name="New Note"/>
- <menu_item_call label="Nouveau geste" name="New Gesture"/>
- <menu label="Nouveaux habits" name="New Clothes">
- <menu_item_call label="Nouvelle chemise" name="New Shirt"/>
- <menu_item_call label="Nouveau pantalon" name="New Pants"/>
- <menu_item_call label="Nouvelles chaussures" name="New Shoes"/>
- <menu_item_call label="Nouvelles chaussettes" name="New Socks"/>
- <menu_item_call label="Nouvelle veste" name="New Jacket"/>
- <menu_item_call label="Nouvelle jupe" name="New Skirt"/>
- <menu_item_call label="Nouveaux gants" name="New Gloves"/>
- <menu_item_call label="Nouveau débardeur" name="New Undershirt"/>
- <menu_item_call label="Nouveau caleçon" name="New Underpants"/>
- <menu_item_call label="Nouvel alpha" name="New Alpha"/>
- <menu_item_call label="Nouveau tatouage" name="New Tattoo"/>
- </menu>
- <menu label="Nouvelles parties du corps" name="New Body Parts">
- <menu_item_call label="Nouvelle silhouette" name="New Shape"/>
- <menu_item_call label="Nouvelle peau" name="New Skin"/>
- <menu_item_call label="Nouveaux cheveux" name="New Hair"/>
- <menu_item_call label="Nouveaux yeux" name="New Eyes"/>
- </menu>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_inventory_gear_default.xml b/indra/newview/skins/minimal/xui/fr/menu_inventory_gear_default.xml
deleted file mode 100644
index f28918ae14..0000000000
--- a/indra/newview/skins/minimal/xui/fr/menu_inventory_gear_default.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<toggleable_menu name="menu_gear_default">
- <menu_item_call label="Nouvelle fenêtre d&apos;inventaire" name="new_window"/>
- <menu_item_check label="Trier par nom" name="sort_by_name"/>
- <menu_item_check label="Trier en commençant par le plus récent" name="sort_by_recent"/>
- <menu_item_check label="Dossiers système en premier" name="sort_system_folders_to_top"/>
- <menu_item_call label="Afficher les filtres" name="show_filters"/>
- <menu_item_call label="Réinitialiser les filtres" name="reset_filters"/>
- <menu_item_call label="Fermer tous les dossiers" name="close_folders"/>
- <menu_item_call label="Vider les objets trouvés" name="empty_lostnfound"/>
- <menu_item_call label="Enregistrer la texture sous" name="Save Texture As"/>
- <menu_item_call label="Partager" name="Share"/>
- <menu_item_call label="Trouver l&apos;original" name="Find Original"/>
- <menu_item_call label="Trouver tous les liens" name="Find All Links"/>
- <menu_item_call label="Vider la corbeille" name="empty_trash"/>
-</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_land.xml b/indra/newview/skins/minimal/xui/fr/menu_land.xml
deleted file mode 100644
index b84daee3ae..0000000000
--- a/indra/newview/skins/minimal/xui/fr/menu_land.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Land Pie">
- <menu_item_call label="À propos du terrain" name="Place Information..."/>
- <menu_item_call label="M&apos;asseoir ici" name="Sit Here"/>
- <menu_item_call label="Acheter ce terrain" name="Land Buy"/>
- <menu_item_call label="Acheter un pass" name="Land Buy Pass"/>
- <menu_item_call label="Construire" name="Create"/>
- <menu_item_call label="Modifier le terrain" name="Edit Terrain"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_landmark.xml b/indra/newview/skins/minimal/xui/fr/menu_landmark.xml
deleted file mode 100644
index 73eaa4af7e..0000000000
--- a/indra/newview/skins/minimal/xui/fr/menu_landmark.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<toggleable_menu name="landmark_overflow_menu">
- <menu_item_call label="Copier la SLurl" name="copy"/>
- <menu_item_call label="Supprimer" name="delete"/>
- <menu_item_call label="Créer un favori" name="pick"/>
- <menu_item_call label="Ajouter à la barre des favoris" name="add_to_favbar"/>
-</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_login.xml b/indra/newview/skins/minimal/xui/fr/menu_login.xml
deleted file mode 100644
index 400c77e51a..0000000000
--- a/indra/newview/skins/minimal/xui/fr/menu_login.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu_bar name="Login Menu">
- <menu label="Moi" name="File">
- <menu_item_call label="Préférences" name="Preferences..."/>
- <menu_item_call label="Quitter [APP_NAME]" name="Quit"/>
- </menu>
- <menu label="Aide" name="Help">
- <menu_item_call label="Aide de [SECOND_LIFE]" name="Second Life Help"/>
- <menu_item_call label="À propos de [APP_NAME]" name="About Second Life"/>
- </menu>
- <menu_item_check label="Afficher le menu de débogage" name="Show Debug Menu"/>
- <menu label="Débogage" name="Debug">
- <menu_item_call label="Afficher les paramètres de débogage" name="Debug Settings"/>
- <menu_item_call label="Paramètres de couleurs/interface" name="UI/Color Settings"/>
- <menu_item_call label="Outil d&apos;aperçu XUI" name="UI Preview Tool"/>
- <menu label="Tests de l&apos;interface" name="UI Tests"/>
- <menu_item_call label="Définir la taille de la fenêtre..." name="Set Window Size..."/>
- <menu_item_call label="Afficher les conditions d&apos;utilisation" name="TOS"/>
- <menu_item_call label="Afficher le message critique" name="Critical"/>
- <menu_item_call label="Test du navigateur de médias" name="Web Browser Test"/>
- <menu_item_call label="Test de la fenêtre flottante du contenu Web" name="Web Content Floater Test"/>
- <menu_item_check label="Afficher le sélecteur de grille" name="Show Grid Picker"/>
- <menu_item_call label="Afficher la console des notifications" name="Show Notifications Console"/>
- </menu>
-</menu_bar>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_mini_map.xml b/indra/newview/skins/minimal/xui/fr/menu_mini_map.xml
deleted file mode 100644
index b9d0a70383..0000000000
--- a/indra/newview/skins/minimal/xui/fr/menu_mini_map.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Popup">
- <menu_item_call label="Zoom rapproché" name="Zoom Close"/>
- <menu_item_call label="Zoom moyen" name="Zoom Medium"/>
- <menu_item_call label="Zoom éloigné" name="Zoom Far"/>
- <menu_item_call label="Zoom par défaut" name="Zoom Default"/>
- <menu_item_check label="Faire pivoter la carte" name="Rotate Map"/>
- <menu_item_check label="Centrage auto" name="Auto Center"/>
- <menu_item_call label="Arrêter de suivre" name="Stop Tracking"/>
- <menu_item_call label="Carte du monde" name="World Map"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_navbar.xml b/indra/newview/skins/minimal/xui/fr/menu_navbar.xml
deleted file mode 100644
index 08d810b653..0000000000
--- a/indra/newview/skins/minimal/xui/fr/menu_navbar.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Navbar Menu">
- <menu_item_check label="Voir les coordonnées" name="Show Coordinates"/>
- <menu_item_check label="Afficher les propriétés de la parcelle" name="Show Parcel Properties"/>
- <menu_item_call label="Repère" name="Landmark"/>
- <menu_item_call label="Couper" name="Cut"/>
- <menu_item_call label="Copier" name="Copy"/>
- <menu_item_call label="Coller" name="Paste"/>
- <menu_item_call label="Supprimer" name="Delete"/>
- <menu_item_call label="Tout sélectionner" name="Select All"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_nearby_chat.xml b/indra/newview/skins/minimal/xui/fr/menu_nearby_chat.xml
deleted file mode 100644
index 99e22aeff7..0000000000
--- a/indra/newview/skins/minimal/xui/fr/menu_nearby_chat.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="NearBy Chat Menu">
- <menu_item_call label="Afficher les personnes près de vous..." name="nearby_people"/>
- <menu_item_check label="Afficher le texte ignoré" name="muted_text"/>
- <menu_item_check label="Afficher les icônes des Buddy" name="show_buddy_icons"/>
- <menu_item_check label="Afficher les noms" name="show_names"/>
- <menu_item_check label="Afficher les icônes et les noms" name="show_icons_and_names"/>
- <menu_item_call label="Taille de la police" name="font_size"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_notification_well_button.xml b/indra/newview/skins/minimal/xui/fr/menu_notification_well_button.xml
deleted file mode 100644
index 323bfdbf16..0000000000
--- a/indra/newview/skins/minimal/xui/fr/menu_notification_well_button.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Notification Well Button Context Menu">
- <menu_item_call label="Tout fermer" name="Close All"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_object.xml b/indra/newview/skins/minimal/xui/fr/menu_object.xml
deleted file mode 100644
index a50a9df4b1..0000000000
--- a/indra/newview/skins/minimal/xui/fr/menu_object.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Object Pie">
- <menu_item_call label="Toucher" name="Object Touch">
- <menu_item_call.on_enable name="EnableTouch" parameter="Toucher"/>
- </menu_item_call>
- <menu_item_call label="Modifier" name="Edit..."/>
- <menu_item_call label="Construire" name="Build"/>
- <menu_item_call label="Ouvrir" name="Open"/>
- <menu_item_call label="M&apos;asseoir ici" name="Object Sit"/>
- <menu_item_call label="Me lever" name="Object Stand Up"/>
- <menu_item_call label="Profil de l&apos;objet" name="Object Inspect"/>
- <menu_item_call label="Zoomer en avant" name="Zoom In"/>
- <context_menu label="Porter" name="Put On">
- <menu_item_call label="Porter" name="Wear"/>
- <menu_item_call label="Ajouter" name="Add"/>
- <context_menu label="Attacher" name="Object Attach"/>
- <context_menu label="Attacher HUD" name="Object Attach HUD"/>
- </context_menu>
- <context_menu label="Supprimer" name="Remove">
- <menu_item_call label="Signaler une infraction" name="Report Abuse..."/>
- <menu_item_call label="Ignorer" name="Object Mute"/>
- <menu_item_call label="Retour" name="Return..."/>
- <menu_item_call label="Supprimer" name="Delete"/>
- </context_menu>
- <menu_item_call label="Prendre" name="Pie Object Take"/>
- <menu_item_call label="Prendre une copie" name="Take Copy"/>
- <menu_item_call label="Payer" name="Pay..."/>
- <menu_item_call label="Acheter" name="Buy..."/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_object_icon.xml b/indra/newview/skins/minimal/xui/fr/menu_object_icon.xml
deleted file mode 100644
index 69f8e88a0d..0000000000
--- a/indra/newview/skins/minimal/xui/fr/menu_object_icon.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Object Icon Menu">
- <menu_item_call label="Profil de l&apos;objet..." name="Object Profile"/>
- <menu_item_call label="Ignorer..." name="Block"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_outfit_gear.xml b/indra/newview/skins/minimal/xui/fr/menu_outfit_gear.xml
deleted file mode 100644
index 5db7f176b5..0000000000
--- a/indra/newview/skins/minimal/xui/fr/menu_outfit_gear.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Gear Outfit">
- <menu_item_call label="Porter - Remplacer la tenue actuelle" name="wear"/>
- <menu_item_call label="Porter - Ajouter à la tenue actuelle" name="wear_add"/>
- <menu_item_call label="Enlever - Supprimer de la tenue actuelle" name="take_off"/>
- <menu label="Nouveaux habits" name="New Clothes">
- <menu_item_call label="Nouvelle chemise" name="New Shirt"/>
- <menu_item_call label="Nouveau pantalon" name="New Pants"/>
- <menu_item_call label="Nouvelles chaussures" name="New Shoes"/>
- <menu_item_call label="Nouvelles chaussettes" name="New Socks"/>
- <menu_item_call label="Nouvelle veste" name="New Jacket"/>
- <menu_item_call label="Nouvelle jupe" name="New Skirt"/>
- <menu_item_call label="Nouveaux gants" name="New Gloves"/>
- <menu_item_call label="Nouveau débardeur" name="New Undershirt"/>
- <menu_item_call label="Nouveau caleçon" name="New Underpants"/>
- <menu_item_call label="Nouvel alpha" name="New Alpha"/>
- <menu_item_call label="Nouveau tatouage" name="New Tattoo"/>
- </menu>
- <menu label="Nouvelles parties du corps" name="New Body Parts">
- <menu_item_call label="Nouvelle silhouette" name="New Shape"/>
- <menu_item_call label="Nouvelle peau" name="New Skin"/>
- <menu_item_call label="Nouveaux cheveux" name="New Hair"/>
- <menu_item_call label="Nouveaux yeux" name="New Eyes"/>
- </menu>
- <menu_item_call label="Renommer la tenue" name="rename"/>
- <menu_item_call label="Supprimer la tenue" name="delete_outfit"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_outfit_tab.xml b/indra/newview/skins/minimal/xui/fr/menu_outfit_tab.xml
deleted file mode 100644
index 2a7f618e07..0000000000
--- a/indra/newview/skins/minimal/xui/fr/menu_outfit_tab.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Outfit">
- <menu_item_call label="Porter - Remplacer la tenue actuelle" name="wear_replace"/>
- <menu_item_call label="Porter - Ajouter à la tenue actuelle" name="wear_add"/>
- <menu_item_call label="Enlever - Supprimer de la tenue actuelle" name="take_off"/>
- <menu_item_call label="Modifier la tenue" name="edit"/>
- <menu_item_call label="Renommer la tenue" name="rename"/>
- <menu_item_call label="Supprimer la tenue" name="delete"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_participant_list.xml b/indra/newview/skins/minimal/xui/fr/menu_participant_list.xml
deleted file mode 100644
index f91a30f6bb..0000000000
--- a/indra/newview/skins/minimal/xui/fr/menu_participant_list.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Participant List Context Menu">
- <menu_item_check label="Trier par nom" name="SortByName"/>
- <menu_item_check label="Trier par intervenants récents" name="SortByRecentSpeakers"/>
- <menu_item_call label="Voir le profil" name="View Profile"/>
- <menu_item_call label="Devenir amis" name="Add Friend"/>
- <menu_item_call label="IM" name="IM"/>
- <menu_item_call label="Appeler" name="Call"/>
- <menu_item_call label="Partager" name="Share"/>
- <menu_item_call label="Payer" name="Pay"/>
- <menu_item_check label="Afficher les icônes des résidents" name="View Icons"/>
- <menu_item_check label="Bloquer le chat vocal" name="Block/Unblock"/>
- <menu_item_check label="Ignorer le texte" name="MuteText"/>
- <context_menu label="Options du modérateur" name="Moderator Options">
- <menu_item_check label="Autoriser les chats écrits" name="AllowTextChat"/>
- <menu_item_call label="Ignorer ce participant" name="ModerateVoiceMuteSelected"/>
- <menu_item_call label="Ne plus ignorer ce participant" name="ModerateVoiceUnMuteSelected"/>
- <menu_item_call label="Ignorer les autres" name="ModerateVoiceMute"/>
- <menu_item_call label="Ne plus ignorer les autres" name="ModerateVoiceUnmute"/>
- </context_menu>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_people_friends_view_sort.xml b/indra/newview/skins/minimal/xui/fr/menu_people_friends_view_sort.xml
deleted file mode 100644
index a6170a6c16..0000000000
--- a/indra/newview/skins/minimal/xui/fr/menu_people_friends_view_sort.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_group_plus">
- <menu_item_check label="Trier par nom" name="sort_name"/>
- <menu_item_check label="Trier par statut" name="sort_status"/>
- <menu_item_check label="Afficher les icônes des résidents" name="view_icons"/>
- <menu_item_check label="Afficher les droits octroyés" name="view_permissions"/>
- <menu_item_call label="Afficher les résidents et les objets ignorés" name="show_blocked_list"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_people_groups.xml b/indra/newview/skins/minimal/xui/fr/menu_people_groups.xml
deleted file mode 100644
index eb51b4cf7e..0000000000
--- a/indra/newview/skins/minimal/xui/fr/menu_people_groups.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_group_plus">
- <menu_item_call label="Afficher les infos" name="View Info"/>
- <menu_item_call label="Chat" name="Chat"/>
- <menu_item_call label="Appeler" name="Call"/>
- <menu_item_call label="Activer" name="Activate"/>
- <menu_item_call label="Quitter" name="Leave"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_people_groups_view_sort.xml b/indra/newview/skins/minimal/xui/fr/menu_people_groups_view_sort.xml
deleted file mode 100644
index 34f949cf2c..0000000000
--- a/indra/newview/skins/minimal/xui/fr/menu_people_groups_view_sort.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_group_plus">
- <menu_item_check label="Afficher les icônes des groupes" name="Display Group Icons"/>
- <menu_item_call label="Quitter le groupe sélectionné" name="Leave Selected Group"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_people_nearby.xml b/indra/newview/skins/minimal/xui/fr/menu_people_nearby.xml
deleted file mode 100644
index f153ed15ae..0000000000
--- a/indra/newview/skins/minimal/xui/fr/menu_people_nearby.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Avatar Context Menu">
- <menu_item_call label="Voir le profil" name="View Profile"/>
- <menu_item_call label="Devenir amis" name="Add Friend"/>
- <menu_item_call label="Supprimer cet ami" name="Remove Friend"/>
- <menu_item_call label="IM" name="IM"/>
- <menu_item_call label="Appeler" name="Call"/>
- <menu_item_call label="Carte" name="Map"/>
- <menu_item_call label="Partager" name="Share"/>
- <menu_item_call label="Payer" name="Pay"/>
- <menu_item_check label="Ignorer/Ne plus ignorer" name="Block/Unblock"/>
- <menu_item_call label="Téléporter" name="teleport"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_people_nearby_multiselect.xml b/indra/newview/skins/minimal/xui/fr/menu_people_nearby_multiselect.xml
deleted file mode 100644
index 8400ec0a14..0000000000
--- a/indra/newview/skins/minimal/xui/fr/menu_people_nearby_multiselect.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Multi-Selected People Context Menu">
- <menu_item_call label="Devenir amis" name="Add Friends"/>
- <menu_item_call label="Supprimer des amis" name="Remove Friend"/>
- <menu_item_call label="IM" name="IM"/>
- <menu_item_call label="Appeler" name="Call"/>
- <menu_item_call label="Partager" name="Share"/>
- <menu_item_call label="Payer" name="Pay"/>
- <menu_item_call label="Proposer une téléportation" name="teleport"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_people_nearby_view_sort.xml b/indra/newview/skins/minimal/xui/fr/menu_people_nearby_view_sort.xml
deleted file mode 100644
index 45f97e062e..0000000000
--- a/indra/newview/skins/minimal/xui/fr/menu_people_nearby_view_sort.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_group_plus">
- <menu_item_check label="Trier par intervenants récents" name="sort_by_recent_speakers"/>
- <menu_item_check label="Trier par nom" name="sort_name"/>
- <menu_item_check label="Trier par distance" name="sort_distance"/>
- <menu_item_check label="Afficher les icônes des résidents" name="view_icons"/>
- <menu_item_call label="Afficher les résidents et les objets interdits" name="show_blocked_list"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_people_recent_view_sort.xml b/indra/newview/skins/minimal/xui/fr/menu_people_recent_view_sort.xml
deleted file mode 100644
index 93b90ae61c..0000000000
--- a/indra/newview/skins/minimal/xui/fr/menu_people_recent_view_sort.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_group_plus">
- <menu_item_check label="Trier en commençant par le plus récent" name="sort_most"/>
- <menu_item_check label="Trier par nom" name="sort_name"/>
- <menu_item_check label="Afficher les icônes des résidents" name="view_icons"/>
- <menu_item_call label="Afficher les résidents et les objets ignorés" name="show_blocked_list"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_picks.xml b/indra/newview/skins/minimal/xui/fr/menu_picks.xml
deleted file mode 100644
index 7d7174d43c..0000000000
--- a/indra/newview/skins/minimal/xui/fr/menu_picks.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Picks">
- <menu_item_call label="Infos" name="pick_info"/>
- <menu_item_call label="Modifier" name="pick_edit"/>
- <menu_item_call label="Téléporter" name="pick_teleport"/>
- <menu_item_call label="Carte" name="pick_map"/>
- <menu_item_call label="Supprimer" name="pick_delete"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_picks_plus.xml b/indra/newview/skins/minimal/xui/fr/menu_picks_plus.xml
deleted file mode 100644
index b6cde6d6e2..0000000000
--- a/indra/newview/skins/minimal/xui/fr/menu_picks_plus.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<toggleable_menu name="picks_plus_menu">
- <menu_item_call label="Nouveau favori" name="create_pick"/>
- <menu_item_call label="Nouvelle petite annonce" name="create_classified"/>
-</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_place.xml b/indra/newview/skins/minimal/xui/fr/menu_place.xml
deleted file mode 100644
index 6b0f4db752..0000000000
--- a/indra/newview/skins/minimal/xui/fr/menu_place.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<toggleable_menu name="place_overflow_menu">
- <menu_item_call label="Enregistrer comme repère" name="landmark"/>
- <menu_item_call label="Créer un favori" name="pick"/>
- <menu_item_call label="Acheter un pass" name="pass"/>
- <menu_item_call label="Modifier" name="edit"/>
-</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_place_add_button.xml b/indra/newview/skins/minimal/xui/fr/menu_place_add_button.xml
deleted file mode 100644
index 92f9e7719d..0000000000
--- a/indra/newview/skins/minimal/xui/fr/menu_place_add_button.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_folder_gear">
- <menu_item_call label="Ajouter un dossier" name="add_folder"/>
- <menu_item_call label="Ajouter un repère" name="add_landmark"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_places_gear_folder.xml b/indra/newview/skins/minimal/xui/fr/menu_places_gear_folder.xml
deleted file mode 100644
index 3570bdec7f..0000000000
--- a/indra/newview/skins/minimal/xui/fr/menu_places_gear_folder.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_folder_gear">
- <menu_item_call label="Ajouter un repère" name="add_landmark"/>
- <menu_item_call label="Ajouter un dossier" name="add_folder"/>
- <menu_item_call label="Couper" name="cut"/>
- <menu_item_call label="Copier" name="copy_folder"/>
- <menu_item_call label="Coller" name="paste"/>
- <menu_item_call label="Renommer" name="rename"/>
- <menu_item_call label="Supprimer" name="delete"/>
- <menu_item_call label="Agrandir" name="expand"/>
- <menu_item_call label="Réduire" name="collapse"/>
- <menu_item_call label="Développer tous les dossiers" name="expand_all"/>
- <menu_item_call label="Réduire tous les dossiers" name="collapse_all"/>
- <menu_item_check label="Trier par date" name="sort_by_date"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_places_gear_landmark.xml b/indra/newview/skins/minimal/xui/fr/menu_places_gear_landmark.xml
deleted file mode 100644
index 5491c1b3fc..0000000000
--- a/indra/newview/skins/minimal/xui/fr/menu_places_gear_landmark.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_ladmark_gear">
- <menu_item_call label="Téléporter" name="teleport"/>
- <menu_item_call label="Plus d&apos;informations" name="more_info"/>
- <menu_item_call label="Voir sur la carte" name="show_on_map"/>
- <menu_item_call label="Ajouter un repère" name="add_landmark"/>
- <menu_item_call label="Ajouter un dossier" name="add_folder"/>
- <menu_item_call label="Couper" name="cut"/>
- <menu_item_call label="Copier le repère" name="copy_landmark"/>
- <menu_item_call label="Copier la SLurl" name="copy_slurl"/>
- <menu_item_call label="Coller" name="paste"/>
- <menu_item_call label="Renommer" name="rename"/>
- <menu_item_call label="Supprimer" name="delete"/>
- <menu_item_call label="Développer tous les dossiers" name="expand_all"/>
- <menu_item_call label="Réduire tous les dossiers" name="collapse_all"/>
- <menu_item_check label="Trier par date" name="sort_by_date"/>
- <menu_item_call label="Créer un favori" name="create_pick"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_profile_overflow.xml b/indra/newview/skins/minimal/xui/fr/menu_profile_overflow.xml
deleted file mode 100644
index ddf898b791..0000000000
--- a/indra/newview/skins/minimal/xui/fr/menu_profile_overflow.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<toggleable_menu name="profile_overflow_menu">
- <menu_item_call label="Carte" name="show_on_map"/>
- <menu_item_call label="Payer" name="pay"/>
- <menu_item_call label="Partager" name="share"/>
- <menu_item_call label="Ignorer" name="block"/>
- <menu_item_call label="Ne plus ignorer" name="unblock"/>
- <menu_item_call label="Éjecter" name="kick"/>
- <menu_item_call label="Figer" name="freeze"/>
- <menu_item_call label="Libérer" name="unfreeze"/>
- <menu_item_call label="Représentant du service consommateur" name="csr"/>
-</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_save_outfit.xml b/indra/newview/skins/minimal/xui/fr/menu_save_outfit.xml
deleted file mode 100644
index f78db411b3..0000000000
--- a/indra/newview/skins/minimal/xui/fr/menu_save_outfit.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<toggleable_menu name="save_outfit_menu">
- <menu_item_call label="Enregistrer" name="save_outfit"/>
- <menu_item_call label="Enregistrer sous" name="save_as_new_outfit"/>
-</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_script_chiclet.xml b/indra/newview/skins/minimal/xui/fr/menu_script_chiclet.xml
deleted file mode 100644
index 46efa30bd6..0000000000
--- a/indra/newview/skins/minimal/xui/fr/menu_script_chiclet.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="ScriptChiclet Menu">
- <menu_item_call label="Fermer" name="Close"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_slurl.xml b/indra/newview/skins/minimal/xui/fr/menu_slurl.xml
deleted file mode 100644
index ddfa5c0849..0000000000
--- a/indra/newview/skins/minimal/xui/fr/menu_slurl.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Popup">
- <menu_item_call label="À propos de l&apos;URL" name="about_url"/>
- <menu_item_call label="Téléporter vers l&apos;URL" name="teleport_to_url"/>
- <menu_item_call label="Carte" name="show_on_map"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_teleport_history_gear.xml b/indra/newview/skins/minimal/xui/fr/menu_teleport_history_gear.xml
deleted file mode 100644
index 3dea662cc2..0000000000
--- a/indra/newview/skins/minimal/xui/fr/menu_teleport_history_gear.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Teleport History Gear Context Menu">
- <menu_item_call label="Développer tous les dossiers" name="Expand all folders"/>
- <menu_item_call label="Réduire tous les dossiers" name="Collapse all folders"/>
- <menu_item_call label="Effacer l&apos;historique des téléportations" name="Clear Teleport History"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_teleport_history_item.xml b/indra/newview/skins/minimal/xui/fr/menu_teleport_history_item.xml
deleted file mode 100644
index fb4582dbce..0000000000
--- a/indra/newview/skins/minimal/xui/fr/menu_teleport_history_item.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Teleport History Item Context Menu">
- <menu_item_call label="Téléporter" name="Teleport"/>
- <menu_item_call label="Plus d&apos;informations" name="More Information"/>
- <menu_item_call label="Copier dans le presse-papiers" name="CopyToClipboard"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_teleport_history_tab.xml b/indra/newview/skins/minimal/xui/fr/menu_teleport_history_tab.xml
deleted file mode 100644
index 369680985d..0000000000
--- a/indra/newview/skins/minimal/xui/fr/menu_teleport_history_tab.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Teleport History Item Context Menu">
- <menu_item_call label="Ouvrir" name="TabOpen"/>
- <menu_item_call label="Fermer" name="TabClose"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_text_editor.xml b/indra/newview/skins/minimal/xui/fr/menu_text_editor.xml
deleted file mode 100644
index b6f429aec9..0000000000
--- a/indra/newview/skins/minimal/xui/fr/menu_text_editor.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Text editor context menu">
- <menu_item_call label="Couper" name="Cut"/>
- <menu_item_call label="Copier" name="Copy"/>
- <menu_item_call label="Coller" name="Paste"/>
- <menu_item_call label="Supprimer" name="Delete"/>
- <menu_item_call label="Tout sélectionner" name="Select All"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_topinfobar.xml b/indra/newview/skins/minimal/xui/fr/menu_topinfobar.xml
deleted file mode 100644
index dc68f40fe7..0000000000
--- a/indra/newview/skins/minimal/xui/fr/menu_topinfobar.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_topinfobar">
- <menu_item_check label="Afficher les coordonnées" name="Show Coordinates"/>
- <menu_item_check label="Afficher les propriétés de la parcelle" name="Show Parcel Properties"/>
- <menu_item_call label="Repère" name="Landmark"/>
- <menu_item_call label="Copier" name="Copy"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_url_agent.xml b/indra/newview/skins/minimal/xui/fr/menu_url_agent.xml
deleted file mode 100644
index 5ed627fbc3..0000000000
--- a/indra/newview/skins/minimal/xui/fr/menu_url_agent.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Url Popup">
- <menu_item_call label="Voir le profil du résident" name="show_agent"/>
- <menu_item_call label="Copier le nom dans le presse-papiers" name="url_copy_label"/>
- <menu_item_call label="Copier la SLurl dans le presse-papiers" name="url_copy"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_url_group.xml b/indra/newview/skins/minimal/xui/fr/menu_url_group.xml
deleted file mode 100644
index de90c3ff7e..0000000000
--- a/indra/newview/skins/minimal/xui/fr/menu_url_group.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Url Popup">
- <menu_item_call label="Voir le profil du groupe" name="show_group"/>
- <menu_item_call label="Copier le groupe dans le presse-papiers" name="url_copy_label"/>
- <menu_item_call label="Copier la SLurl dans le presse-papiers" name="url_copy"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_url_http.xml b/indra/newview/skins/minimal/xui/fr/menu_url_http.xml
deleted file mode 100644
index 5e96352999..0000000000
--- a/indra/newview/skins/minimal/xui/fr/menu_url_http.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Url Popup">
- <menu_item_call label="Ouvrir la page Web" name="url_open"/>
- <menu_item_call label="Ouvrir dans un navigateur interne" name="url_open_internal"/>
- <menu_item_call label="Ouvrir dans un navigateur externe" name="url_open_external"/>
- <menu_item_call label="Copier l&apos;URL dans le presse-papiers" name="url_copy"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_url_inventory.xml b/indra/newview/skins/minimal/xui/fr/menu_url_inventory.xml
deleted file mode 100644
index 8ab88b4be7..0000000000
--- a/indra/newview/skins/minimal/xui/fr/menu_url_inventory.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Url Popup">
- <menu_item_call label="Afficher l&apos;article d&apos;inventaire" name="show_item"/>
- <menu_item_call label="Copier le nom dans le presse-papiers" name="url_copy_label"/>
- <menu_item_call label="Copier la SLurl dans le presse-papiers" name="url_copy"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_url_map.xml b/indra/newview/skins/minimal/xui/fr/menu_url_map.xml
deleted file mode 100644
index 67e6986f5d..0000000000
--- a/indra/newview/skins/minimal/xui/fr/menu_url_map.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Url Popup">
- <menu_item_call label="Voir sur la carte" name="show_on_map"/>
- <menu_item_call label="Me téléporter à cet endroit" name="teleport_to_location"/>
- <menu_item_call label="Copier la SLurl dans le presse-papiers" name="url_copy"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_url_objectim.xml b/indra/newview/skins/minimal/xui/fr/menu_url_objectim.xml
deleted file mode 100644
index f581c3ef9d..0000000000
--- a/indra/newview/skins/minimal/xui/fr/menu_url_objectim.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Url Popup">
- <menu_item_call label="Afficher les informations sur l&apos;objet" name="show_object"/>
- <menu_item_call label="Voir sur la carte" name="show_on_map"/>
- <menu_item_call label="Me téléporter à l&apos;emplacement de l&apos;objet" name="teleport_to_object"/>
- <menu_item_call label="Copier le nom de l&apos;objet dans le presse-papiers" name="url_copy_label"/>
- <menu_item_call label="Copier la SLurl dans le presse-papiers" name="url_copy"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_url_parcel.xml b/indra/newview/skins/minimal/xui/fr/menu_url_parcel.xml
deleted file mode 100644
index 07b0eeca49..0000000000
--- a/indra/newview/skins/minimal/xui/fr/menu_url_parcel.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Url Popup">
- <menu_item_call label="Afficher les informations sur la parcelle" name="show_parcel"/>
- <menu_item_call label="Voir sur la carte" name="show_on_map"/>
- <menu_item_call label="Copier la SLurl dans le presse-papiers" name="url_copy"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_url_slapp.xml b/indra/newview/skins/minimal/xui/fr/menu_url_slapp.xml
deleted file mode 100644
index f4b7e212ca..0000000000
--- a/indra/newview/skins/minimal/xui/fr/menu_url_slapp.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Url Popup">
- <menu_item_call label="Exécuter cette commande" name="run_slapp"/>
- <menu_item_call label="Copier la SLurl dans le presse-papiers" name="url_copy"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_url_slurl.xml b/indra/newview/skins/minimal/xui/fr/menu_url_slurl.xml
deleted file mode 100644
index e44943cf15..0000000000
--- a/indra/newview/skins/minimal/xui/fr/menu_url_slurl.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Url Popup">
- <menu_item_call label="Afficher les informations sur ce lieu" name="show_place"/>
- <menu_item_call label="Voir sur la carte" name="show_on_map"/>
- <menu_item_call label="Me téléporter à cet endroit" name="teleport_to_location"/>
- <menu_item_call label="Copier la SLurl dans le presse-papiers" name="url_copy"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_url_teleport.xml b/indra/newview/skins/minimal/xui/fr/menu_url_teleport.xml
deleted file mode 100644
index a5075a2740..0000000000
--- a/indra/newview/skins/minimal/xui/fr/menu_url_teleport.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Url Popup">
- <menu_item_call label="Me téléporter à cet endroit." name="teleport"/>
- <menu_item_call label="Voir sur la carte" name="show_on_map"/>
- <menu_item_call label="Copier la SLurl dans le presse-papiers" name="url_copy"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_viewer.xml b/indra/newview/skins/minimal/xui/fr/menu_viewer.xml
deleted file mode 100644
index bd1c077f52..0000000000
--- a/indra/newview/skins/minimal/xui/fr/menu_viewer.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu_bar name="Main Menu">
- <menu label="Aide" name="Help">
- <menu_item_call label="Aide de [SECOND_LIFE]" name="Second Life Help"/>
- </menu>
- <menu label="Avancé" name="Advanced">
- <menu label="Raccourcis" name="Shortcuts">
- <menu_item_check label="Voler" name="Fly"/>
- <menu_item_call label="Fermer la fenêtre" name="Close Window"/>
- <menu_item_call label="Fermer toutes les fenêtres" name="Close All Windows"/>
- <menu_item_call label="Réinitialiser la vue" name="Reset View"/>
- </menu>
- </menu>
-</menu_bar>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_wearable_list_item.xml b/indra/newview/skins/minimal/xui/fr/menu_wearable_list_item.xml
deleted file mode 100644
index 187cb4bcd2..0000000000
--- a/indra/newview/skins/minimal/xui/fr/menu_wearable_list_item.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Outfit Wearable Context Menu">
- <menu_item_call label="Remplacer" name="wear_replace"/>
- <menu_item_call label="Porter" name="wear_wear"/>
- <menu_item_call label="Ajouter" name="wear_add"/>
- <menu_item_call label="Enlever / Détacher" name="take_off_or_detach"/>
- <menu_item_call label="Détacher" name="detach"/>
- <context_menu label="Attacher à" name="wearable_attach_to"/>
- <context_menu label="Attacher au HUD" name="wearable_attach_to_hud"/>
- <menu_item_call label="Enlever" name="take_off"/>
- <menu_item_call label="Modifier" name="edit"/>
- <menu_item_call label="Profil de l&apos;article" name="object_profile"/>
- <menu_item_call label="Afficher l&apos;original" name="show_original"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_wearing_gear.xml b/indra/newview/skins/minimal/xui/fr/menu_wearing_gear.xml
deleted file mode 100644
index 0ca9fe1879..0000000000
--- a/indra/newview/skins/minimal/xui/fr/menu_wearing_gear.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Gear Wearing">
- <menu_item_call label="Modifier la tenue" name="edit"/>
- <menu_item_call label="Enlever" name="takeoff"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_wearing_tab.xml b/indra/newview/skins/minimal/xui/fr/menu_wearing_tab.xml
deleted file mode 100644
index 4d88445506..0000000000
--- a/indra/newview/skins/minimal/xui/fr/menu_wearing_tab.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Wearing">
- <menu_item_call label="Enlever" name="take_off"/>
- <menu_item_call label="Détacher" name="detach"/>
- <menu_item_call label="Modifier la tenue" name="edit"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/fr/notifications.xml b/indra/newview/skins/minimal/xui/fr/notifications.xml
deleted file mode 100644
index 05fa03cdc1..0000000000
--- a/indra/newview/skins/minimal/xui/fr/notifications.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<notifications>
- <notification name="UserGiveItem">
- [NAME_SLURL] vous offre [ITEM_SLURL]. Pour utiliser cet article, vous devez passer en mode Avancé. L&apos;article se trouve dans votre inventaire. Pour changer de mode, quittez l&apos;application, redémarrez-la, puis sélectionnez un autre mode sur l&apos;écran de connexion.
- <form name="form">
- <button name="Show" text="Garder l&apos;article"/>
- <button name="Discard" text="Refuser l&apos;article"/>
- <button name="Mute" text="Ignorer l&apos;utilisateur"/>
- </form>
- </notification>
- <notification name="ObjectGiveItem">
- Un objet nommé &lt;nolink&gt;[OBJECTFROMNAME]&lt;/nolink&gt; appartenant à [NAME_SLURL] vous offre &lt;nolink&gt;[ITEM_SLURL]&lt;/nolink&gt;. Pour utiliser cet article, vous devez passer en mode Avancé. L&apos;article se trouve dans votre inventaire. Pour changer de mode, quittez l&apos;application, redémarrez-la, puis sélectionnez un autre mode sur l&apos;écran de connexion.
- <form name="form">
- <button name="Keep" text="Garder l&apos;article"/>
- <button name="Discard" text="Refuser l&apos;article"/>
- <button name="Mute" text="Ignorer l&apos;objet"/>
- </form>
- </notification>
-</notifications>
diff --git a/indra/newview/skins/minimal/xui/fr/panel_adhoc_control_panel.xml b/indra/newview/skins/minimal/xui/fr/panel_adhoc_control_panel.xml
deleted file mode 100644
index 376a7d2b72..0000000000
--- a/indra/newview/skins/minimal/xui/fr/panel_adhoc_control_panel.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="panel_im_control_panel">
- <layout_stack name="vertical_stack">
- <layout_panel name="call_btn_panel">
- <button label="Appeler" name="call_btn"/>
- </layout_panel>
- <layout_panel name="end_call_btn_panel">
- <button label="Quitter l&apos;appel" name="end_call_btn"/>
- </layout_panel>
- </layout_stack>
-</panel>
diff --git a/indra/newview/skins/minimal/xui/fr/panel_bottomtray.xml b/indra/newview/skins/minimal/xui/fr/panel_bottomtray.xml
deleted file mode 100644
index 094d3e66de..0000000000
--- a/indra/newview/skins/minimal/xui/fr/panel_bottomtray.xml
+++ /dev/null
@@ -1,45 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="bottom_tray">
- <string name="DragIndicationImageName" value="Accordion_ArrowOpened_Off"/>
- <string name="SpeakBtnToolTip" value="Active/Désactive le micro"/>
- <string name="VoiceControlBtnToolTip" value="Affiche/Masque le panneau de contrôle de la voix"/>
- <layout_stack name="toolbar_stack">
- <layout_panel name="speak_panel">
- <button label="Parler" name="speak_btn" tool_tip="Activer/désactiver le micro."/>
- </layout_panel>
- <layout_panel name="speak_flyout_panel">
- <button label="" name="flyout_btn" tool_tip="Modifier les préférences audio."/>
- </layout_panel>
- <layout_panel name="gesture_panel">
- <gesture_combo_list label="Geste" name="Gesture" tool_tip="Faire faire des gestes à votre avatar."/>
- </layout_panel>
- <layout_panel name="cam_panel">
- <bottomtray_button label="Affichage" name="camera_btn" tool_tip="Contrôler l&apos;angle de la caméra."/>
- </layout_panel>
- <layout_panel name="destinations_panel">
- <bottomtray_button label="Destinations" name="destination_btn" tool_tip="Voyager à travers Second Life."/>
- </layout_panel>
- <layout_panel name="avatar_panel">
- <bottomtray_button label="Mon avatar" name="avatar_btn" tool_tip="Modifier votre apparence."/>
- </layout_panel>
- <layout_panel name="people_panel">
- <bottomtray_button label="Personnes" name="show_people_button" tool_tip="Trouver des personnes dans Second Life."/>
- </layout_panel>
- <layout_panel name="profile_panel">
- <bottomtray_button label="Profil" name="show_profile_btn" tool_tip="Afficher et modifier votre profil."/>
- </layout_panel>
- <layout_panel name="howto_panel">
- <bottomtray_button label="Aide rapide" name="show_help_btn" tool_tip="Afficher des infos d&apos;aide sur Second Life."/>
- </layout_panel>
- <layout_panel name="im_well_panel">
- <chiclet_im_well name="im_well">
- <button name="Unread IM messages" tool_tip="Conversations"/>
- </chiclet_im_well>
- </layout_panel>
- <layout_panel name="notification_well_panel">
- <chiclet_notification name="notification_well">
- <button name="Unread" tool_tip="Notifications"/>
- </chiclet_notification>
- </layout_panel>
- </layout_stack>
-</panel>
diff --git a/indra/newview/skins/minimal/xui/fr/panel_group_control_panel.xml b/indra/newview/skins/minimal/xui/fr/panel_group_control_panel.xml
deleted file mode 100644
index 676fa1d222..0000000000
--- a/indra/newview/skins/minimal/xui/fr/panel_group_control_panel.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="panel_im_control_panel">
- <layout_stack name="vertical_stack">
- <layout_panel name="end_call_btn_panel">
- <button label="Quitter l&apos;appel" name="end_call_btn"/>
- </layout_panel>
- <layout_panel name="voice_ctrls_btn_panel">
- <button label="Ouvrir contrôles vocaux" name="voice_ctrls_btn"/>
- </layout_panel>
- </layout_stack>
-</panel>
diff --git a/indra/newview/skins/minimal/xui/fr/panel_im_control_panel.xml b/indra/newview/skins/minimal/xui/fr/panel_im_control_panel.xml
deleted file mode 100644
index 1643cf3229..0000000000
--- a/indra/newview/skins/minimal/xui/fr/panel_im_control_panel.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="panel_im_control_panel">
- <layout_stack name="button_stack">
- <layout_panel name="view_profile_btn_panel">
- <button label="Profil" name="view_profile_btn"/>
- </layout_panel>
- <layout_panel name="add_friend_btn_panel">
- <button label="Devenir amis" name="add_friend_btn"/>
- </layout_panel>
- <layout_panel name="teleport_btn_panel">
- <button label="Téléporter" name="teleport_btn" tool_tip="Proposer de téléporter cette personne."/>
- </layout_panel>
- <layout_panel name="call_btn_panel">
- <button label="Appeler" name="call_btn"/>
- </layout_panel>
- <layout_panel name="end_call_btn_panel">
- <button label="Quitter l&apos;appel" name="end_call_btn"/>
- </layout_panel>
- <layout_panel name="block_btn_panel">
- <button label="Ignorer" name="block_btn"/>
- </layout_panel>
- <layout_panel name="unblock_btn_panel">
- <button label="Ne plus ignorer" name="unblock_btn"/>
- </layout_panel>
- <layout_panel name="volume_ctrl_panel">
- <slider name="volume_slider" tool_tip="Volume de l&apos;appel." value="0,5"/>
- </layout_panel>
- </layout_stack>
-</panel>
diff --git a/indra/newview/skins/minimal/xui/fr/panel_login.xml b/indra/newview/skins/minimal/xui/fr/panel_login.xml
deleted file mode 100644
index 0869778a54..0000000000
--- a/indra/newview/skins/minimal/xui/fr/panel_login.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="panel_login">
- <panel.string name="create_account_url">
- http://fr.secondlife.com/registration/
- </panel.string>
- <panel.string name="forgot_password_url">
- http://secondlife.com/account/request.php?lang=fr
- </panel.string>
- <layout_stack name="login_widgets">
- <layout_panel name="login">
- <text name="username_text">
- Nom d&apos;utilisateur :
- </text>
- <combo_box name="username_combo" tool_tip="Nom d&apos;utilisateur que vous avez choisi lors de votre inscription (par exemple, bobsmith12 ou Steller Sunshine)."/>
- <text name="password_text">
- Mot de passe :
- </text>
- <check_box label="Enregistrer" name="remember_check"/>
- <button label="Connexion" name="connect_btn"/>
- <text name="mode_selection_text">
- Mode :
- </text>
- <combo_box name="mode_combo" tool_tip="Sélectionnez un mode. Pour une exploration facile et rapide avec chat, choisissez Basique. Pour accéder à plus de fonctionnalités, choisissez Avancé.">
- <combo_box.item label="Basique" name="Basic"/>
- <combo_box.item label="Avancé" name="Advanced"/>
- </combo_box>
- </layout_panel>
- <layout_panel name="links">
- <text name="create_new_account_text">
- S&apos;inscrire
- </text>
- <text name="forgot_password_text">
- Nom d&apos;utilisateur ou mot de passe oublié ?
- </text>
- <text name="login_help">
- Besoin d&apos;aide ?
- </text>
- </layout_panel>
- </layout_stack>
-</panel>
diff --git a/indra/newview/skins/minimal/xui/fr/panel_navigation_bar.xml b/indra/newview/skins/minimal/xui/fr/panel_navigation_bar.xml
deleted file mode 100644
index 45caf2323d..0000000000
--- a/indra/newview/skins/minimal/xui/fr/panel_navigation_bar.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="navigation_bar">
- <panel name="navigation_panel">
- <pull_button name="back_btn" tool_tip="Revenir à l&apos;emplacement précédent"/>
- <pull_button name="forward_btn" tool_tip="Avancer d&apos;un emplacement"/>
- <button name="home_btn" tool_tip="Me téléporter jusqu&apos;à mon domicile"/>
- <location_input label="Emplacement" name="location_combo"/>
- <search_combo_box label="Rechercher" name="search_combo_box" tool_tip="Rechercher">
- <combo_editor label="Rechercher dans [SECOND_LIFE]" name="search_combo_editor"/>
- </search_combo_box>
- </panel>
- <favorites_bar name="favorite" tool_tip="Faites glisser des repères ici pour un accès rapide à vos lieux favoris dans Second Life.">
- <label name="favorites_bar_label" tool_tip="Faites glisser des repères ici pour un accès rapide à vos lieux favoris dans Second Life.">
- Favoris
- </label>
- <chevron_button name="&gt;&gt;" tool_tip="Afficher d&apos;avantage de Favoris"/>
- </favorites_bar>
-</panel>
diff --git a/indra/newview/skins/minimal/xui/fr/panel_people.xml b/indra/newview/skins/minimal/xui/fr/panel_people.xml
deleted file mode 100644
index 427a420b91..0000000000
--- a/indra/newview/skins/minimal/xui/fr/panel_people.xml
+++ /dev/null
@@ -1,74 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<!-- Side tray panel -->
-<panel label="Résidents" name="people_panel">
- <string name="no_recent_people" value="Personne de récent. Vous recherchez des résidents avec qui passer du temps ? Essayez avec le bouton Destinations ci-dessous."/>
- <string name="no_filtered_recent_people" value="Personne de récent portant ce nom."/>
- <string name="no_one_near" value="Personne près de vous. Vous recherchez des résidents avec qui passer du temps ? Essayez avec le bouton Destinations ci-dessous."/>
- <string name="no_one_filtered_near" value="Personne près de vous portant ce nom."/>
- <string name="no_friends_online" value="Pas d&apos;amis connectés"/>
- <string name="no_friends" value="Pas d&apos;amis"/>
- <string name="no_friends_msg">
- Pour ajouter un résident à votre liste d&apos;amis, cliquez-droit dessus.
-Vous recherchez des résidents avec qui passer du temps ? Essayez avec le bouton Destinations ci-dessous.
- </string>
- <string name="no_filtered_friends_msg">
- Vous n&apos;avez pas trouvé ce que vous cherchiez ? Essayez avec le bouton Destinations ci-dessous.
- </string>
- <string name="people_filter_label" value="Filtrer les personnes"/>
- <string name="groups_filter_label" value="Filtrer les groupes"/>
- <string name="no_filtered_groups_msg" value="Vous n&apos;avez pas trouvé ce que vous cherchiez ? Essayez [secondlife:///app/search/groups/[SEARCH_TERM] Rechercher]."/>
- <string name="no_groups_msg" value="Vous souhaitez trouver des groupes à rejoindre ? Utilisez [secondlife:///app/search/groups Rechercher]."/>
- <string name="MiniMapToolTipMsg" value="[REGION](Carte : double-clic ; Panoramique : Maj + faire glisser)"/>
- <string name="AltMiniMapToolTipMsg" value="[REGION](Téléportation : double-clic ; Panoramique : Maj + faire glisser)"/>
- <filter_editor label="Filtre" name="filter_input"/>
- <tab_container name="tabs">
- <panel label="PRÈS DE VOUS" name="nearby_panel">
- <panel label="bottom_panel" name="bottom_panel"/>
- </panel>
- <panel label="MES AMIS" name="friends_panel">
- <accordion name="friends_accordion">
- <accordion_tab name="tab_online" title="En ligne"/>
- <accordion_tab name="tab_all" title="Tout"/>
- </accordion>
- <panel label="bottom_panel" name="bottom_panel">
- <layout_stack name="bottom_panel">
- <layout_panel name="trash_btn_panel">
- <dnd_button name="del_btn" tool_tip="Supprimer le résident sélectionné de votre liste d&apos;amis."/>
- </layout_panel>
- </layout_stack>
- </panel>
- </panel>
- <panel label="RÉCENT" name="recent_panel">
- <panel label="bottom_panel" name="bottom_panel">
- <button name="add_friend_btn" tool_tip="Ajouter le résident sélectionné à votre liste d&apos;amis"/>
- </panel>
- </panel>
- </tab_container>
- <panel name="button_bar">
- <layout_stack name="bottom_bar_ls">
- <layout_panel name="view_profile_btn_lp">
- <button label="Profil" name="view_profile_btn" tool_tip="Afficher la photo, les groupes et autres infos des résidents"/>
- </layout_panel>
- <layout_panel name="im_btn_lp">
- <button label="IM" name="im_btn" tool_tip="Ouvrir une session IM."/>
- </layout_panel>
- <layout_panel name="call_btn_lp">
- <button label="Appeler" name="call_btn" tool_tip="Appeler ce résident."/>
- </layout_panel>
- <layout_panel name="teleport_btn_lp">
- <button label="Téléporter" name="teleport_btn" tool_tip="Proposer une téléportation."/>
- </layout_panel>
- </layout_stack>
- <layout_stack name="bottom_bar_ls1">
- <layout_panel name="group_info_btn_lp">
- <button label="Profil du groupe" name="group_info_btn" tool_tip="Afficher les informations sur le groupe"/>
- </layout_panel>
- <layout_panel name="chat_btn_lp">
- <button label="Chat de groupe" name="chat_btn" tool_tip="Ouvrir une session de chat"/>
- </layout_panel>
- <layout_panel name="group_call_btn_lp">
- <button label="Appel de groupe" name="group_call_btn" tool_tip="Appeler ce groupe"/>
- </layout_panel>
- </layout_stack>
- </panel>
-</panel>
diff --git a/indra/newview/skins/minimal/xui/fr/panel_side_tray_tab_caption.xml b/indra/newview/skins/minimal/xui/fr/panel_side_tray_tab_caption.xml
deleted file mode 100644
index 45efbdc980..0000000000
--- a/indra/newview/skins/minimal/xui/fr/panel_side_tray_tab_caption.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="sidetray_tab_panel">
- <text name="sidetray_tab_title" value="Panneau latéral"/>
- <button name="undock" tool_tip="Détacher"/>
- <button name="dock" tool_tip="Attacher"/>
- <button name="show_help" tool_tip="Afficher l&apos;aide"/>
-</panel>
diff --git a/indra/newview/skins/minimal/xui/fr/panel_status_bar.xml b/indra/newview/skins/minimal/xui/fr/panel_status_bar.xml
deleted file mode 100644
index 9e814ee7ab..0000000000
--- a/indra/newview/skins/minimal/xui/fr/panel_status_bar.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="status">
- <panel.string name="packet_loss_tooltip">
- Perte de paquets
- </panel.string>
- <panel.string name="bandwidth_tooltip">
- Bande passante
- </panel.string>
- <panel.string name="time">
- [hour12, datetime, slt]:[min, datetime, slt] [ampm, datetime, slt] [timezone,datetime, slt]
- </panel.string>
- <panel.string name="timeTooltip">
- [weekday, datetime, slt] [sday, datetime, slt] [month, datetime, slt] [year, datetime, slt]
- </panel.string>
- <panel.string name="buycurrencylabel">
- [AMT] L$
- </panel.string>
- <combo_box name="mode_combo" tool_tip="Sélectionnez un mode. Pour une exploration facile et rapide avec chat, choisissez Basique. Pour accéder à plus de fonctionnalités, choisissez Avancé.">
- <combo_box.item label="Mode basique" name="Basic"/>
- <combo_box.item label="Mode avancé" name="Advanced"/>
- </combo_box>
- <button name="media_toggle_btn" tool_tip="Arrêter tous les médias (musique, vidéo, pages web)"/>
- <button name="volume_btn" tool_tip="Contrôle du volume global"/>
-</panel>
diff --git a/indra/newview/skins/minimal/xui/it/floater_camera.xml b/indra/newview/skins/minimal/xui/it/floater_camera.xml
deleted file mode 100644
index 3fdf4f48a2..0000000000
--- a/indra/newview/skins/minimal/xui/it/floater_camera.xml
+++ /dev/null
@@ -1,65 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="camera_floater" title="">
- <floater.string name="rotate_tooltip">
- Ruota la telecamera Intorno all&apos;Inquadratura
- </floater.string>
- <floater.string name="zoom_tooltip">
- Avvicina la telecamera nell&apos;inquadratura
- </floater.string>
- <floater.string name="move_tooltip">
- Muovi la telecamera su e giù e a sinistra e destra
- </floater.string>
- <floater.string name="camera_modes_title">
- Modalità della fotocamera
- </floater.string>
- <floater.string name="pan_mode_title">
- Ruota visuale - Ingrandisci - Panoramica
- </floater.string>
- <floater.string name="presets_mode_title">
- Visuali predefinite
- </floater.string>
- <floater.string name="free_mode_title">
- Vedi oggetto
- </floater.string>
- <panel name="controls">
- <panel name="preset_views_list">
- <panel_camera_item name="front_view">
- <panel_camera_item.text name="front_view_text">
- Visuale frontale
- </panel_camera_item.text>
- </panel_camera_item>
- <panel_camera_item name="group_view">
- <panel_camera_item.text name="side_view_text">
- Visuale laterale
- </panel_camera_item.text>
- </panel_camera_item>
- <panel_camera_item name="rear_view">
- <panel_camera_item.text name="rear_view_text">
- Visuale posteriore
- </panel_camera_item.text>
- </panel_camera_item>
- </panel>
- <panel name="camera_modes_list">
- <panel_camera_item name="object_view">
- <panel_camera_item.text name="object_view_text">
- Visuale oggetto
- </panel_camera_item.text>
- </panel_camera_item>
- <panel_camera_item name="mouselook_view">
- <panel_camera_item.text name="mouselook_view_text">
- Visuale soggettiva
- </panel_camera_item.text>
- </panel_camera_item>
- </panel>
- <panel name="zoom" tool_tip="Avvicina la telecamera nell&apos;inquadratura">
- <joystick_rotate name="cam_rotate_stick" tool_tip="Ruota la visuale intorno al punto focale"/>
- <slider_bar name="zoom_slider" tool_tip="Zoom verso il centro focale"/>
- <joystick_track name="cam_track_stick" tool_tip="Sposta la visuale in su e in giù, a sinistra e a destra"/>
- </panel>
- </panel>
- <panel name="buttons">
- <button label="" name="presets_btn" tool_tip="Visuali predefinite"/>
- <button label="" name="pan_btn" tool_tip="Ruota visuale - Ingrandisci - Panoramica"/>
- <button label="" name="avatarview_btn" tool_tip="Modalità della fotocamera"/>
- </panel>
-</floater>
diff --git a/indra/newview/skins/minimal/xui/it/floater_help_browser.xml b/indra/newview/skins/minimal/xui/it/floater_help_browser.xml
deleted file mode 100644
index 18264cdd17..0000000000
--- a/indra/newview/skins/minimal/xui/it/floater_help_browser.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_help_browser" title="ISTRUZIONI">
- <floater.string name="loading_text">
- Caricamento in corso...
- </floater.string>
- <layout_stack name="stack1">
- <layout_panel name="external_controls"/>
- </layout_stack>
-</floater>
diff --git a/indra/newview/skins/minimal/xui/it/floater_media_browser.xml b/indra/newview/skins/minimal/xui/it/floater_media_browser.xml
deleted file mode 100644
index b1e87290d2..0000000000
--- a/indra/newview/skins/minimal/xui/it/floater_media_browser.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_about" title="BROWSER MULTIMEDIA">
- <floater.string name="home_page_url">
- http://www.secondlife.com
- </floater.string>
- <floater.string name="support_page_url">
- http://support.secondlife.com
- </floater.string>
- <layout_stack name="stack1">
- <layout_panel name="nav_controls">
- <button label="Indietro" name="back" width="75"/>
- <button label="Avanti" left_delta="75" name="forward" width="70"/>
- <button label="Ricarica" left_delta="75" name="reload"/>
- <combo_box left_delta="75" name="address" width="510"/>
- <button label="Vai" left_delta="515" name="go"/>
- </layout_panel>
- <layout_panel name="time_controls">
- <button label="indietro rapido" name="rewind"/>
- <button label="stop" name="stop"/>
- <button label="avanti" name="seek"/>
- </layout_panel>
- <layout_panel name="parcel_owner_controls">
- <button label="Invia la pagina attuale al lotto" name="assign"/>
- </layout_panel>
- <layout_panel name="external_controls">
- <button label="Apri nel mio browser Web" name="open_browser"/>
- <check_box label="Apri sempre nel mio browser Web" name="open_always"/>
- <button label="Chiudi" name="close"/>
- </layout_panel>
- </layout_stack>
-</floater>
diff --git a/indra/newview/skins/minimal/xui/it/floater_nearby_chat.xml b/indra/newview/skins/minimal/xui/it/floater_nearby_chat.xml
deleted file mode 100644
index 4c41df8a62..0000000000
--- a/indra/newview/skins/minimal/xui/it/floater_nearby_chat.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="nearby_chat" title="CHAT NEI DINTORNI">
- <check_box label="Traduci chat (tecnologia Google)" name="translate_chat_checkbox"/>
-</floater>
diff --git a/indra/newview/skins/minimal/xui/it/floater_web_content.xml b/indra/newview/skins/minimal/xui/it/floater_web_content.xml
deleted file mode 100644
index 5603e85417..0000000000
--- a/indra/newview/skins/minimal/xui/it/floater_web_content.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_web_content" title="">
- <layout_stack name="stack1">
- <layout_panel name="nav_controls">
- <button name="back" tool_tip="Naviga indietro"/>
- <button name="forward" tool_tip="Naviga avanti"/>
- <button name="stop" tool_tip="Interrompi navigazione"/>
- <button name="reload" tool_tip="Ricarica pagina"/>
- <combo_box name="address" tool_tip="Inserisci URL qui"/>
- <icon name="media_secure_lock_flag" tool_tip="Navigazione sicura"/>
- <button name="popexternal" tool_tip="Apri URL corrente nel browser del computer"/>
- </layout_panel>
- </layout_stack>
-</floater>
diff --git a/indra/newview/skins/minimal/xui/it/inspect_avatar.xml b/indra/newview/skins/minimal/xui/it/inspect_avatar.xml
deleted file mode 100644
index 6f52aaef74..0000000000
--- a/indra/newview/skins/minimal/xui/it/inspect_avatar.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<!--
- Not can_close / no title to avoid window chrome
- Single instance - only have one at a time, recycle it each spawn
--->
-<floater name="inspect_avatar">
- <string name="Subtitle">
- [AGE]
- </string>
- <string name="Details">
- [SL_PROFILE]
- </string>
- <text name="user_name_small" value="Grumpity ProductEngine con un nome lungo"/>
- <text name="user_slid" value="james.linden"/>
- <text name="user_details">
- Questa è la mia descrizione in second life e penso che sia perfetta. Ma per qualche motivo la mia descrizione è davvero molto lunga, perché mi piace parlare a lungo
- </text>
- <slider name="volume_slider" tool_tip="Volume voce" value="0.5"/>
- <button label="Aggiungi amico" name="add_friend_btn"/>
- <button label="IM" name="im_btn"/>
- <button label="Profilo" name="view_profile_btn"/>
- <panel name="moderator_panel">
- <button label="Disattiva voce" name="disable_voice"/>
- <button label="Attiva voce" name="enable_voice"/>
- </panel>
-</floater>
diff --git a/indra/newview/skins/minimal/xui/it/inspect_object.xml b/indra/newview/skins/minimal/xui/it/inspect_object.xml
deleted file mode 100644
index d8ab10cfda..0000000000
--- a/indra/newview/skins/minimal/xui/it/inspect_object.xml
+++ /dev/null
@@ -1,41 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<!--
- Not can_close / no title to avoid window chrome
- Single instance - only have one at a time, recycle it each spawn
--->
-<floater name="inspect_object">
- <string name="Creator">
- Di [CREATOR]
- </string>
- <string name="CreatorAndOwner">
- Di [CREATOR]
-Proprietario [OWNER]
- </string>
- <string name="Price">
- L$ [AMOUNT]
- </string>
- <string name="PriceFree">
- Gratis!
- </string>
- <string name="Touch">
- Tocca
- </string>
- <string name="Sit">
- Siediti
- </string>
- <text name="object_name" value="Nome oggetto di prova che si trova su due righe ed è molto lungo"/>
- <text name="price_text">
- L$ 30.000
- </text>
- <text name="object_description">
- Questa è una descrizione di un oggetto che è molto lunga ed è di almeno 80 caratteri, ma potrebbe essere di 120 caratteri a questo punto. Chi lo sa veramente?
- </text>
- <button label="Acquista" name="buy_btn"/>
- <button label="Paga" name="pay_btn"/>
- <button label="Prendi copia" name="take_free_copy_btn"/>
- <button label="Tocca" name="touch_btn"/>
- <button label="Siediti" name="sit_btn"/>
- <button label="Apri" name="open_btn"/>
- <icon name="secure_browsing" tool_tip="Browsing sicuro"/>
- <button label="Altro" name="more_info_btn"/>
-</floater>
diff --git a/indra/newview/skins/minimal/xui/it/menu_add_wearable_gear.xml b/indra/newview/skins/minimal/xui/it/menu_add_wearable_gear.xml
deleted file mode 100644
index 46abd7deed..0000000000
--- a/indra/newview/skins/minimal/xui/it/menu_add_wearable_gear.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Add Wearable Gear Menu">
- <menu_item_check label="Mostra prima i più recenti" name="sort_by_most_recent"/>
- <menu_item_check label="Ordina in base al nome" name="sort_by_name"/>
- <menu_item_check label="Ordina in base al tipo" name="sort_by_type"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_attachment_other.xml b/indra/newview/skins/minimal/xui/it/menu_attachment_other.xml
deleted file mode 100644
index d4d6fd68d0..0000000000
--- a/indra/newview/skins/minimal/xui/it/menu_attachment_other.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<!-- *NOTE: See also menu_avatar_other.xml -->
-<context_menu name="Avatar Pie">
- <menu_item_call label="Vedi profilo" name="Profile..."/>
- <menu_item_call label="Aggiungi amico" name="Add Friend"/>
- <menu_item_call label="IM" name="Send IM..."/>
- <menu_item_call label="Chiama" name="Call"/>
- <menu_item_call label="Invita al gruppo" name="Invite..."/>
- <menu_item_call label="Blocca" name="Avatar Mute"/>
- <menu_item_call label="Segnala" name="abuse"/>
- <menu_item_call label="Congela" name="Freeze..."/>
- <menu_item_call label="Espelli" name="Eject..."/>
- <menu_item_call label="Debug delle texture" name="Debug..."/>
- <menu_item_call label="Zoom avanti" name="Zoom In"/>
- <menu_item_call label="Paga" name="Pay..."/>
- <menu_item_call label="Profilo dell&apos;oggetto" name="Object Inspect"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_attachment_self.xml b/indra/newview/skins/minimal/xui/it/menu_attachment_self.xml
deleted file mode 100644
index 0b841d591f..0000000000
--- a/indra/newview/skins/minimal/xui/it/menu_attachment_self.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Attachment Pie">
- <menu_item_call label="Tocca" name="Attachment Object Touch"/>
- <menu_item_call label="Modifica" name="Edit..."/>
- <menu_item_call label="Stacca" name="Detach"/>
- <menu_item_call label="Siedi" name="Sit Down Here"/>
- <menu_item_call label="Alzati" name="Stand Up"/>
- <menu_item_call label="Il mio aspetto" name="Change Outfit"/>
- <menu_item_call label="Modifica il mio vestiario" name="Edit Outfit"/>
- <menu_item_call label="Modifica la figura corporea" name="Edit My Shape"/>
- <menu_item_call label="I miei amici..." name="Friends..."/>
- <menu_item_call label="I miei gruppi" name="Groups..."/>
- <menu_item_call label="Il mio profilo" name="Profile..."/>
- <menu_item_call label="Debug delle texture" name="Debug..."/>
- <menu_item_call label="Lascia" name="Drop"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_avatar_icon.xml b/indra/newview/skins/minimal/xui/it/menu_avatar_icon.xml
deleted file mode 100644
index b93b695300..0000000000
--- a/indra/newview/skins/minimal/xui/it/menu_avatar_icon.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Avatar Icon Menu">
- <menu_item_call label="Vedi profilo" name="Show Profile"/>
- <menu_item_call label="Manda IM..." name="Send IM"/>
- <menu_item_call label="Aggiungi come amico..." name="Add Friend"/>
- <menu_item_call label="Togli amicizia..." name="Remove Friend"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_avatar_other.xml b/indra/newview/skins/minimal/xui/it/menu_avatar_other.xml
deleted file mode 100644
index c2edc32a49..0000000000
--- a/indra/newview/skins/minimal/xui/it/menu_avatar_other.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<!-- *NOTE: See also menu_attachment_other.xml -->
-<context_menu name="Avatar Pie">
- <menu_item_call label="Vedi profilo" name="Profile..."/>
- <menu_item_call label="Aggiungi amico" name="Add Friend"/>
- <menu_item_call label="IM" name="Send IM..."/>
- <menu_item_call label="Chiama" name="Call"/>
- <menu_item_call label="Invita al gruppo" name="Invite..."/>
- <menu_item_call label="Blocca" name="Avatar Mute"/>
- <menu_item_call label="Segnala" name="abuse"/>
- <menu_item_call label="Congela" name="Freeze..."/>
- <menu_item_call label="Espelli" name="Eject..."/>
- <menu_item_call label="Debug delle texture" name="Debug..."/>
- <menu_item_call label="Zoom avanti" name="Zoom In"/>
- <menu_item_call label="Paga" name="Pay..."/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_avatar_self.xml b/indra/newview/skins/minimal/xui/it/menu_avatar_self.xml
deleted file mode 100644
index a4dafd7b5f..0000000000
--- a/indra/newview/skins/minimal/xui/it/menu_avatar_self.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Self Pie">
- <menu_item_call label="Siedi" name="Sit Down Here"/>
- <menu_item_call label="Alzati" name="Stand Up"/>
- <context_menu label="Togli" name="Take Off &gt;">
- <context_menu label="Abiti" name="Clothes &gt;">
- <menu_item_call label="Camicia" name="Shirt"/>
- <menu_item_call label="Pantaloni" name="Pants"/>
- <menu_item_call label="Gonna" name="Skirt"/>
- <menu_item_call label="Scarpe" name="Shoes"/>
- <menu_item_call label="Calzini" name="Socks"/>
- <menu_item_call label="Giacca" name="Jacket"/>
- <menu_item_call label="Guanti" name="Gloves"/>
- <menu_item_call label="Maglietta intima" name="Self Undershirt"/>
- <menu_item_call label="Slip" name="Self Underpants"/>
- <menu_item_call label="Tatuaggio" name="Self Tattoo"/>
- <menu_item_call label="Fisica" name="Self Physics"/>
- <menu_item_call label="Alpha (Trasparenza)" name="Self Alpha"/>
- <menu_item_call label="Tutti gli abiti" name="All Clothes"/>
- </context_menu>
- <context_menu label="HUD" name="Object Detach HUD"/>
- <context_menu label="Stacca" name="Object Detach"/>
- <menu_item_call label="Stacca tutto" name="Detach All"/>
- </context_menu>
- <menu_item_call label="Il mio aspetto" name="Chenge Outfit"/>
- <menu_item_call label="Modifica il mio vestiario" name="Edit Outfit"/>
- <menu_item_call label="Modifica la figura corporea" name="Edit My Shape"/>
- <menu_item_call label="I miei amici..." name="Friends..."/>
- <menu_item_call label="I miei gruppi" name="Groups..."/>
- <menu_item_call label="Il mio profilo" name="Profile..."/>
- <menu_item_call label="Debug delle texture" name="Debug..."/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_bottomtray.xml b/indra/newview/skins/minimal/xui/it/menu_bottomtray.xml
deleted file mode 100644
index ddd6909136..0000000000
--- a/indra/newview/skins/minimal/xui/it/menu_bottomtray.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="hide_camera_move_controls_menu">
- <menu_item_check label="Pulsante Parla" name="EnableVoiceChat"/>
- <menu_item_check label="Tasto Gesture" name="ShowGestureButton"/>
- <menu_item_check label="Tasto Movimento" name="ShowMoveButton"/>
- <menu_item_check label="Tasto Visuale" name="ShowCameraButton"/>
- <menu_item_check label="Tasto Foto" name="ShowSnapshotButton"/>
- <menu_item_check label="Pulsante Costruisci" name="ShowBuildButton"/>
- <menu_item_check label="Pulsante Cerca" name="ShowSearchButton"/>
- <menu_item_check label="Pulsante Mappa" name="ShowWorldMapButton"/>
- <menu_item_check label="Pulsante Mini mappa" name="ShowMiniMapButton"/>
- <menu_item_call label="Taglia" name="NearbyChatBar_Cut"/>
- <menu_item_call label="Copia" name="NearbyChatBar_Copy"/>
- <menu_item_call label="Incolla" name="NearbyChatBar_Paste"/>
- <menu_item_call label="Elimina" name="NearbyChatBar_Delete"/>
- <menu_item_call label="Seleziona tutto" name="NearbyChatBar_Select_All"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_cof_attachment.xml b/indra/newview/skins/minimal/xui/it/menu_cof_attachment.xml
deleted file mode 100644
index 699490c8f1..0000000000
--- a/indra/newview/skins/minimal/xui/it/menu_cof_attachment.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="COF Attachment">
- <menu_item_call label="Stacca" name="detach"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_cof_body_part.xml b/indra/newview/skins/minimal/xui/it/menu_cof_body_part.xml
deleted file mode 100644
index 1e3658ef45..0000000000
--- a/indra/newview/skins/minimal/xui/it/menu_cof_body_part.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="COF Body">
- <menu_item_call label="Sostituisci" name="replace"/>
- <menu_item_call label="Modifica" name="edit"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_cof_clothing.xml b/indra/newview/skins/minimal/xui/it/menu_cof_clothing.xml
deleted file mode 100644
index 1e16ce8ed1..0000000000
--- a/indra/newview/skins/minimal/xui/it/menu_cof_clothing.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="COF Clothing">
- <menu_item_call label="Togli" name="take_off"/>
- <menu_item_call label="Modifica" name="edit"/>
- <menu_item_call label="Sostituisci" name="replace"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_cof_gear.xml b/indra/newview/skins/minimal/xui/it/menu_cof_gear.xml
deleted file mode 100644
index 10524ba92d..0000000000
--- a/indra/newview/skins/minimal/xui/it/menu_cof_gear.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Gear COF">
- <menu label="Nuovi abiti" name="COF.Gear.New_Clothes"/>
- <menu label="Nuove parti del corpo" name="COF.Geear.New_Body_Parts"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_edit.xml b/indra/newview/skins/minimal/xui/it/menu_edit.xml
deleted file mode 100644
index ffb20a02e9..0000000000
--- a/indra/newview/skins/minimal/xui/it/menu_edit.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu label="Modifica" name="Edit">
- <menu_item_call label="Annulla" name="Undo"/>
- <menu_item_call label="Ripeti" name="Redo"/>
- <menu_item_call label="Taglia" name="Cut"/>
- <menu_item_call label="Copia" name="Copy"/>
- <menu_item_call label="Incolla" name="Paste"/>
- <menu_item_call label="Elimina" name="Delete"/>
- <menu_item_call label="Duplica" name="Duplicate"/>
- <menu_item_call label="Seleziona tutto" name="Select All"/>
- <menu_item_call label="Deseleziona" name="Deselect"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_favorites.xml b/indra/newview/skins/minimal/xui/it/menu_favorites.xml
deleted file mode 100644
index 7813ef44b5..0000000000
--- a/indra/newview/skins/minimal/xui/it/menu_favorites.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Popup">
- <menu_item_call label="Teleport" name="Teleport To Landmark"/>
- <menu_item_call label="Vedi/Modifica punto di riferimento" name="Landmark Open"/>
- <menu_item_call label="Copia SLurl" name="Copy slurl"/>
- <menu_item_call label="Mostra sulla mappa" name="Show On Map"/>
- <menu_item_call label="Copia" name="Landmark Copy"/>
- <menu_item_call label="Incolla" name="Landmark Paste"/>
- <menu_item_call label="Elimina" name="Delete"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_gesture_gear.xml b/indra/newview/skins/minimal/xui/it/menu_gesture_gear.xml
deleted file mode 100644
index 7cfcc6287e..0000000000
--- a/indra/newview/skins/minimal/xui/it/menu_gesture_gear.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_gesture_gear">
- <menu_item_call label="Aggiungi/Rimuovi dai preferiti" name="activate"/>
- <menu_item_call label="Copia" name="copy_gesture"/>
- <menu_item_call label="Incolla" name="paste"/>
- <menu_item_call label="Copia UUID" name="copy_uuid"/>
- <menu_item_call label="Salva vestiario" name="save_to_outfit"/>
- <menu_item_call label="Modifica" name="edit_gesture"/>
- <menu_item_call label="Ispeziona" name="inspect"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_group_plus.xml b/indra/newview/skins/minimal/xui/it/menu_group_plus.xml
deleted file mode 100644
index 3b76fb94a9..0000000000
--- a/indra/newview/skins/minimal/xui/it/menu_group_plus.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_group_plus">
- <menu_item_call label="Aderisci al gruppo..." name="item_join"/>
- <menu_item_call label="Nuovo gruppo..." name="item_new"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_hide_navbar.xml b/indra/newview/skins/minimal/xui/it/menu_hide_navbar.xml
deleted file mode 100644
index 2c2c6c4bc5..0000000000
--- a/indra/newview/skins/minimal/xui/it/menu_hide_navbar.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="hide_navbar_menu">
- <menu_item_check label="Mostra la barra di navigazione" name="ShowNavbarNavigationPanel"/>
- <menu_item_check label="Mostra la barra dei Preferiti" name="ShowNavbarFavoritesPanel"/>
- <menu_item_check label="Mostra mini barra del luogo" name="ShowMiniLocationPanel"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_im_well_button.xml b/indra/newview/skins/minimal/xui/it/menu_im_well_button.xml
deleted file mode 100644
index 9e471b771c..0000000000
--- a/indra/newview/skins/minimal/xui/it/menu_im_well_button.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="IM Well Button Context Menu">
- <menu_item_call label="Chiudi tutto" name="Close All"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_imchiclet_adhoc.xml b/indra/newview/skins/minimal/xui/it/menu_imchiclet_adhoc.xml
deleted file mode 100644
index f78ed8489f..0000000000
--- a/indra/newview/skins/minimal/xui/it/menu_imchiclet_adhoc.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="IMChiclet AdHoc Menu">
- <menu_item_call label="Fine sessione" name="End Session"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_imchiclet_group.xml b/indra/newview/skins/minimal/xui/it/menu_imchiclet_group.xml
deleted file mode 100644
index baa4e671b0..0000000000
--- a/indra/newview/skins/minimal/xui/it/menu_imchiclet_group.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="IMChiclet Group Menu">
- <menu_item_call label="Informazioni sul gruppo" name="Show Profile"/>
- <menu_item_call label="Mostra sessione" name="Chat"/>
- <menu_item_call label="Fine sessione" name="End Session"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_imchiclet_p2p.xml b/indra/newview/skins/minimal/xui/it/menu_imchiclet_p2p.xml
deleted file mode 100644
index 2eacbb09ad..0000000000
--- a/indra/newview/skins/minimal/xui/it/menu_imchiclet_p2p.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="IMChiclet P2P Menu">
- <menu_item_call label="Vedi profilo" name="Show Profile"/>
- <menu_item_call label="Aggiungi amico" name="Add Friend"/>
- <menu_item_call label="Mostra sessione" name="Send IM"/>
- <menu_item_call label="Fine sessione" name="End Session"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_inspect_avatar_gear.xml b/indra/newview/skins/minimal/xui/it/menu_inspect_avatar_gear.xml
deleted file mode 100644
index 1f10734c4a..0000000000
--- a/indra/newview/skins/minimal/xui/it/menu_inspect_avatar_gear.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<toggleable_menu name="Gear Menu">
- <menu_item_call label="Vedi profilo" name="view_profile"/>
- <menu_item_call label="Aggiungi amico" name="add_friend"/>
- <menu_item_call label="IM" name="im"/>
- <menu_item_call label="Chiama" name="call"/>
- <menu_item_call label="Teleport" name="teleport"/>
- <menu_item_call label="Invita al gruppo" name="invite_to_group"/>
- <menu_item_call label="Blocca" name="block"/>
- <menu_item_call label="Sblocca" name="unblock"/>
- <menu_item_call label="Segnala" name="report"/>
- <menu_item_call label="Congela" name="freeze"/>
- <menu_item_call label="Espelli" name="eject"/>
- <menu_item_call label="Espelli" name="kick"/>
- <menu_item_call label="CSR" name="csr"/>
- <menu_item_call label="Debug delle texture" name="debug"/>
- <menu_item_call label="Trova sulla mappa" name="find_on_map"/>
- <menu_item_call label="Zoom avanti" name="zoom_in"/>
- <menu_item_call label="Paga" name="pay"/>
- <menu_item_call label="Condividi" name="share"/>
-</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_inspect_object_gear.xml b/indra/newview/skins/minimal/xui/it/menu_inspect_object_gear.xml
deleted file mode 100644
index ede4a507c0..0000000000
--- a/indra/newview/skins/minimal/xui/it/menu_inspect_object_gear.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<menu name="Gear Menu">
- <menu_item_call label="Tocca" name="touch"/>
- <menu_item_call label="Siediti" name="sit"/>
- <menu_item_call label="Paga" name="pay"/>
- <menu_item_call label="Acquista" name="buy"/>
- <menu_item_call label="Prendi" name="take"/>
- <menu_item_call label="Prendi copia" name="take_copy"/>
- <menu_item_call label="Apri" name="open"/>
- <menu_item_call label="Modifica" name="edit"/>
- <menu_item_call label="Indossa" name="wear"/>
- <menu_item_call label="Aggiungi" name="add"/>
- <menu_item_call label="Segnala" name="report"/>
- <menu_item_call label="Blocca" name="block"/>
- <menu_item_call label="Zoom avanti" name="zoom_in"/>
- <menu_item_call label="Rimuovi" name="remove"/>
- <menu_item_call label="Maggiori informazioni" name="more_info"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_inspect_self_gear.xml b/indra/newview/skins/minimal/xui/it/menu_inspect_self_gear.xml
deleted file mode 100644
index 4f62ccaa9c..0000000000
--- a/indra/newview/skins/minimal/xui/it/menu_inspect_self_gear.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<toggleable_menu name="Gear Menu">
- <menu_item_call label="Siedi" name="Sit Down Here"/>
- <menu_item_call label="Alzati" name="Stand Up"/>
- <context_menu label="Togli" name="Take Off &gt;">
- <context_menu label="Abiti" name="Clothes &gt;">
- <menu_item_call label="Camicia" name="Shirt"/>
- <menu_item_call label="Pantaloni" name="Pants"/>
- <menu_item_call label="Gonna" name="Skirt"/>
- <menu_item_call label="Scarpe" name="Shoes"/>
- <menu_item_call label="Calzini" name="Socks"/>
- <menu_item_call label="Giacca" name="Jacket"/>
- <menu_item_call label="Guanti" name="Gloves"/>
- <menu_item_call label="Maglietta intima" name="Self Undershirt"/>
- <menu_item_call label="Slip" name="Self Underpants"/>
- <menu_item_call label="Tatuaggio" name="Self Tattoo"/>
- <menu_item_call label="Alpha (Trasparenza)" name="Self Alpha"/>
- <menu_item_call label="Tutti gli abiti" name="All Clothes"/>
- </context_menu>
- <context_menu label="HUD" name="Object Detach HUD"/>
- <context_menu label="Stacca" name="Object Detach"/>
- <menu_item_call label="Stacca tutto" name="Detach All"/>
- </context_menu>
- <menu_item_call label="Cambia vestiario" name="Chenge Outfit"/>
- <menu_item_call label="Modifica il mio vestiario" name="Edit Outfit"/>
- <menu_item_call label="Modifica la figura corporea" name="Edit My Shape"/>
- <menu_item_call label="I miei amici" name="Friends..."/>
- <menu_item_call label="I miei gruppi" name="Groups..."/>
- <menu_item_call label="Il mio profilo" name="Profile..."/>
- <menu_item_call label="Debug delle texture" name="Debug..."/>
-</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_inv_offer_chiclet.xml b/indra/newview/skins/minimal/xui/it/menu_inv_offer_chiclet.xml
deleted file mode 100644
index 471640eff5..0000000000
--- a/indra/newview/skins/minimal/xui/it/menu_inv_offer_chiclet.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="InvOfferChiclet Menu">
- <menu_item_call label="Chiudi" name="Close"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_inventory.xml b/indra/newview/skins/minimal/xui/it/menu_inventory.xml
deleted file mode 100644
index f18ddb595c..0000000000
--- a/indra/newview/skins/minimal/xui/it/menu_inventory.xml
+++ /dev/null
@@ -1,87 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Popup">
- <menu_item_call label="Condividi" name="Share"/>
- <menu_item_call label="Compra" name="Task Buy"/>
- <menu_item_call label="Apri" name="Task Open"/>
- <menu_item_call label="Esegui" name="Task Play"/>
- <menu_item_call label="Proprietà" name="Task Properties"/>
- <menu_item_call label="Rinomina" name="Task Rename"/>
- <menu_item_call label="Elimina" name="Task Remove"/>
- <menu_item_call label="Svuota il Cestino" name="Empty Trash"/>
- <menu_item_call label="Svuota gli oggetti persi e ritrovati" name="Empty Lost And Found"/>
- <menu_item_call label="Nuova cartella" name="New Folder"/>
- <menu_item_call label="Nuovo script" name="New Script"/>
- <menu_item_call label="Nuovo biglietto" name="New Note"/>
- <menu_item_call label="Nuova gesture" name="New Gesture"/>
- <menu label="Maglietta intima" name="New Clothes">
- <menu_item_call label="Nuova maglietta" name="New Shirt"/>
- <menu_item_call label="Nuovi pantaloni" name="New Pants"/>
- <menu_item_call label="Nuove scarpe" name="New Shoes"/>
- <menu_item_call label="Nuove calze" name="New Socks"/>
- <menu_item_call label="Nuova giacca" name="New Jacket"/>
- <menu_item_call label="Nuova gonna" name="New Skirt"/>
- <menu_item_call label="Nuovi guanti" name="New Gloves"/>
- <menu_item_call label="Nuova canottiera" name="New Undershirt"/>
- <menu_item_call label="Nuove mutande" name="New Underpants"/>
- <menu_item_call label="Nuovo Alfa Mask" name="New Alpha Mask"/>
- <menu_item_call label="Nuovo tatuaggio" name="New Tattoo"/>
- <menu_item_call label="Nuova fisica" name="New Physics"/>
- </menu>
- <menu label="Nuove parti del corpo" name="New Body Parts">
- <menu_item_call label="Nuova forma del corpo" name="New Shape"/>
- <menu_item_call label="Nuova pelle" name="New Skin"/>
- <menu_item_call label="Nuovi capelli" name="New Hair"/>
- <menu_item_call label="Nuovi occhi" name="New Eyes"/>
- </menu>
- <menu label="Cambia tipo" name="Change Type">
- <menu_item_call label="Predefinito" name="Default"/>
- <menu_item_call label="Guanti" name="Gloves"/>
- <menu_item_call label="Giacca" name="Jacket"/>
- <menu_item_call label="Pantaloni" name="Pants"/>
- <menu_item_call label="Figura corporea" name="Shape"/>
- <menu_item_call label="Scarpe" name="Shoes"/>
- <menu_item_call label="Camicia" name="Shirt"/>
- <menu_item_call label="Gonna" name="Skirt"/>
- <menu_item_call label="Slip" name="Underpants"/>
- <menu_item_call label="Maglietta intima" name="Undershirt"/>
- </menu>
- <menu_item_call label="Teletrasportati" name="Landmark Open"/>
- <menu_item_call label="Apri" name="Animation Open"/>
- <menu_item_call label="Apri" name="Sound Open"/>
- <menu_item_call label="Sostituisci vestiti" name="Replace Outfit"/>
- <menu_item_call label="Aggiungi al vestiario" name="Add To Outfit"/>
- <menu_item_call label="Rimuovi dal vestiario attuale" name="Remove From Outfit"/>
- <menu_item_call label="Trova originale" name="Find Original"/>
- <menu_item_call label="Elimina oggetto" name="Purge Item"/>
- <menu_item_call label="Ripristina oggetto" name="Restore Item"/>
- <menu_item_call label="Apri" name="Open"/>
- <menu_item_call label="Apri originale" name="Open Original"/>
- <menu_item_call label="Proprietà" name="Properties"/>
- <menu_item_call label="Rinomina" name="Rename"/>
- <menu_item_call label="Copia UUID dell&apos;oggetto" name="Copy Asset UUID"/>
- <menu_item_call label="Copia" name="Copy"/>
- <menu_item_call label="Incolla" name="Paste"/>
- <menu_item_call label="Incolla come link" name="Paste As Link"/>
- <menu_item_call label="Elimina" name="Remove Link"/>
- <menu_item_call label="Cancella" name="Delete"/>
- <menu_item_call label="Elimina la cartella di sistema" name="Delete System Folder"/>
- <menu_item_call label="Inizia la conferenza chat" name="Conference Chat Folder"/>
- <menu_item_call label="Esegui" name="Sound Play"/>
- <menu_item_call label="Informazioni sul punto di riferimento" name="About Landmark"/>
- <menu_item_call label="Riproduci in Second Life" name="Animation Play"/>
- <menu_item_call label="Esegui localmente" name="Animation Audition"/>
- <menu_item_call label="Invia un Instant Message" name="Send Instant Message"/>
- <menu_item_call label="Offri teletrasporto..." name="Offer Teleport..."/>
- <menu_item_call label="Inizia una conferenza chat" name="Conference Chat"/>
- <menu_item_call label="Attiva" name="Activate"/>
- <menu_item_call label="Disattiva" name="Deactivate"/>
- <menu_item_call label="Salva con nome" name="Save As"/>
- <menu_item_call label="Stacca da te" name="Detach From Yourself"/>
- <menu_item_call label="Indossa" name="Wearable And Object Wear"/>
- <menu label="Attacca a" name="Attach To"/>
- <menu label="Attacca all&apos;HUD" name="Attach To HUD"/>
- <menu_item_call label="Modifica" name="Wearable Edit"/>
- <menu_item_call label="Aggiungi" name="Wearable Add"/>
- <menu_item_call label="Togli" name="Take Off"/>
- <menu_item_call label="--nessuna opzione--" name="--no options--"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_inventory_add.xml b/indra/newview/skins/minimal/xui/it/menu_inventory_add.xml
deleted file mode 100644
index a2535ce48d..0000000000
--- a/indra/newview/skins/minimal/xui/it/menu_inventory_add.xml
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_inventory_add">
- <menu label="Carica nel server" name="upload">
- <menu_item_call label="Immagine ([COST]L$)..." name="Upload Image"/>
- <menu_item_call label="Suono ([COST]L$)..." name="Upload Sound"/>
- <menu_item_call label="Animazione ([COST]L$)..." name="Upload Animation"/>
- <menu_item_call label="In blocco ([COST]L$ per file)..." name="Bulk Upload"/>
- <menu_item_call label="Definisci diritti di caricamento predefiniti" name="perm prefs"/>
- </menu>
- <menu_item_call label="Nuova cartella" name="New Folder"/>
- <menu_item_call label="Nuovo script" name="New Script"/>
- <menu_item_call label="Nuovo biglietto" name="New Note"/>
- <menu_item_call label="Nuova gesture" name="New Gesture"/>
- <menu label="Maglietta intima" name="New Clothes">
- <menu_item_call label="Nuova camicia" name="New Shirt"/>
- <menu_item_call label="Nuovi pantaloni" name="New Pants"/>
- <menu_item_call label="Nuove scarpe" name="New Shoes"/>
- <menu_item_call label="Nuove calze" name="New Socks"/>
- <menu_item_call label="Nuova giacca" name="New Jacket"/>
- <menu_item_call label="Nuova gonna" name="New Skirt"/>
- <menu_item_call label="Nuovi guanti" name="New Gloves"/>
- <menu_item_call label="Nuova maglietta intima" name="New Undershirt"/>
- <menu_item_call label="Nuovi slip" name="New Underpants"/>
- <menu_item_call label="Nuovo Alfa (trasparenza)" name="New Alpha"/>
- <menu_item_call label="Nuovo tatuaggio" name="New Tattoo"/>
- <menu_item_call label="Nuova fisica" name="New Physics"/>
- </menu>
- <menu label="Nuove parti del corpo" name="New Body Parts">
- <menu_item_call label="Nuova figura corporea" name="New Shape"/>
- <menu_item_call label="Nuova pelle" name="New Skin"/>
- <menu_item_call label="Nuovi capelli" name="New Hair"/>
- <menu_item_call label="Nuovi occhi" name="New Eyes"/>
- </menu>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_inventory_gear_default.xml b/indra/newview/skins/minimal/xui/it/menu_inventory_gear_default.xml
deleted file mode 100644
index 3d64e4da4e..0000000000
--- a/indra/newview/skins/minimal/xui/it/menu_inventory_gear_default.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<toggleable_menu name="menu_gear_default">
- <menu_item_call label="Nuova finestra inventario" name="new_window"/>
- <menu_item_check label="Ordina in base al nome" name="sort_by_name"/>
- <menu_item_check label="Mostra prima i più recenti" name="sort_by_recent"/>
- <menu_item_check label="Ordina le cartelle sempre in base al nome" name="sort_folders_by_name"/>
- <menu_item_check label="Ordina cartelle di sistema all&apos;inizio" name="sort_system_folders_to_top"/>
- <menu_item_call label="Mostra filtri" name="show_filters"/>
- <menu_item_call label="Ripristina filtri" name="reset_filters"/>
- <menu_item_call label="Chiudi tutte le cartelle" name="close_folders"/>
- <menu_item_call label="Svuota oggetti smarriti" name="empty_lostnfound"/>
- <menu_item_call label="Salva texture come" name="Save Texture As"/>
- <menu_item_call label="Condividi" name="Share"/>
- <menu_item_call label="Trova originale" name="Find Original"/>
- <menu_item_call label="Trova tutti i link" name="Find All Links"/>
- <menu_item_call label="Svuota cestino" name="empty_trash"/>
-</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_land.xml b/indra/newview/skins/minimal/xui/it/menu_land.xml
deleted file mode 100644
index f510078e14..0000000000
--- a/indra/newview/skins/minimal/xui/it/menu_land.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Land Pie">
- <menu_item_call label="Informazioni sui terreni" name="Place Information..."/>
- <menu_item_call label="Siediti qui" name="Sit Here"/>
- <menu_item_call label="Acquista questo terreno" name="Land Buy"/>
- <menu_item_call label="Acquista Permesso" name="Land Buy Pass"/>
- <menu_item_call label="Costruisci" name="Create"/>
- <menu_item_call label="Modifica terreno" name="Edit Terrain"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_landmark.xml b/indra/newview/skins/minimal/xui/it/menu_landmark.xml
deleted file mode 100644
index b3cddab783..0000000000
--- a/indra/newview/skins/minimal/xui/it/menu_landmark.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<toggleable_menu name="landmark_overflow_menu">
- <menu_item_call label="Copia SLurl" name="copy"/>
- <menu_item_call label="Elimina" name="delete"/>
- <menu_item_call label="Crea Luogo consigliato" name="pick"/>
- <menu_item_call label="Aggiungi alla barra dei Preferiti" name="add_to_favbar"/>
-</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_login.xml b/indra/newview/skins/minimal/xui/it/menu_login.xml
deleted file mode 100644
index bdf7d2094f..0000000000
--- a/indra/newview/skins/minimal/xui/it/menu_login.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu_bar name="Login Menu">
- <menu label="Io" name="File">
- <menu_item_call label="Preferenze" name="Preferences..."/>
- <menu_item_call label="Esci da [APP_NAME]" name="Quit"/>
- </menu>
- <menu label="Aiuto" name="Help">
- <menu_item_call label="Aiuto di [SECOND_LIFE]" name="Second Life Help"/>
- <menu_item_call label="Informazioni su [APP_NAME]" name="About Second Life"/>
- </menu>
- <menu_item_check label="Mostra menu Debug" name="Show Debug Menu"/>
- <menu label="Debug" name="Debug">
- <menu_item_call label="Mostra impostazioni di debug" name="Debug Settings"/>
- <menu_item_call label="Impostazioni colori interfaccia" name="UI/Color Settings"/>
- <menu label="Test interfaccia utente" name="UI Tests"/>
- <menu_item_call label="Imposta dimensioni della finestra..." name="Set Window Size..."/>
- <menu_item_call label="Mostra i Termini del servizio (TOS)" name="TOS"/>
- <menu_item_call label="Mostra messaggio critico" name="Critical"/>
- <menu_item_call label="Test browser multimedia" name="Web Browser Test"/>
- <menu_item_call label="Test finestra contenuti Web" name="Web Content Floater Test"/>
- <menu_item_check label="Mostra selettore griglia" name="Show Grid Picker"/>
- <menu_item_call label="Mostra Console notifiche" name="Show Notifications Console"/>
- </menu>
-</menu_bar>
diff --git a/indra/newview/skins/minimal/xui/it/menu_mini_map.xml b/indra/newview/skins/minimal/xui/it/menu_mini_map.xml
deleted file mode 100644
index 561b80e046..0000000000
--- a/indra/newview/skins/minimal/xui/it/menu_mini_map.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Popup">
- <menu_item_call label="Zoom ravvicinato" name="Zoom Close"/>
- <menu_item_call label="Zoom Medio" name="Zoom Medium"/>
- <menu_item_call label="Zoom Distante" name="Zoom Far"/>
- <menu_item_call label="Zoom predefinito" name="Zoom Default"/>
- <menu_item_check label="Ruota la mappa" name="Rotate Map"/>
- <menu_item_check label="Centra automaticamente" name="Auto Center"/>
- <menu_item_call label="Ferma il puntamento" name="Stop Tracking"/>
- <menu_item_call label="Mappa del mondo" name="World Map"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_navbar.xml b/indra/newview/skins/minimal/xui/it/menu_navbar.xml
deleted file mode 100644
index e42d913a6f..0000000000
--- a/indra/newview/skins/minimal/xui/it/menu_navbar.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Navbar Menu">
- <menu_item_check label="Mostra le coordinate" name="Show Coordinates"/>
- <menu_item_check label="Mostra proprietà lotto" name="Show Parcel Properties"/>
- <menu_item_call label="Punto di riferimento" name="Landmark"/>
- <menu_item_call label="Taglia" name="Cut"/>
- <menu_item_call label="Copia" name="Copy"/>
- <menu_item_call label="Incolla" name="Paste"/>
- <menu_item_call label="Elimina" name="Delete"/>
- <menu_item_call label="Seleziona tutto" name="Select All"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_nearby_chat.xml b/indra/newview/skins/minimal/xui/it/menu_nearby_chat.xml
deleted file mode 100644
index 719a6d3261..0000000000
--- a/indra/newview/skins/minimal/xui/it/menu_nearby_chat.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="NearBy Chat Menu">
- <menu_item_call label="Mostra le persone vicine..." name="nearby_people"/>
- <menu_item_check label="Mostra il testo bloccato" name="muted_text"/>
- <menu_item_check label="Mostra icone amici" name="show_buddy_icons"/>
- <menu_item_check label="Mostra nomi" name="show_names"/>
- <menu_item_check label="Mostra icone e nomi" name="show_icons_and_names"/>
- <menu_item_call label="Dimensioni caratteri" name="font_size"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_notification_well_button.xml b/indra/newview/skins/minimal/xui/it/menu_notification_well_button.xml
deleted file mode 100644
index 8c82e30f0e..0000000000
--- a/indra/newview/skins/minimal/xui/it/menu_notification_well_button.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Notification Well Button Context Menu">
- <menu_item_call label="Chiudi tutto" name="Close All"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_object.xml b/indra/newview/skins/minimal/xui/it/menu_object.xml
deleted file mode 100644
index a172cf3b26..0000000000
--- a/indra/newview/skins/minimal/xui/it/menu_object.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Object Pie">
- <menu_item_call label="Tocca" name="Object Touch">
- <menu_item_call.on_enable name="EnableTouch" parameter="Tocca"/>
- </menu_item_call>
- <menu_item_call label="Modifica" name="Edit..."/>
- <menu_item_call label="Costruisci" name="Build"/>
- <menu_item_call label="Apri" name="Open"/>
- <menu_item_call label="Siediti qui" name="Object Sit"/>
- <menu_item_call label="Alzati" name="Object Stand Up"/>
- <menu_item_call label="Profilo dell&apos;oggetto" name="Object Inspect"/>
- <menu_item_call label="Zoom avanti" name="Zoom In"/>
- <context_menu label="Metti" name="Put On">
- <menu_item_call label="Indossa" name="Wear"/>
- <menu_item_call label="Aggiungi" name="Add"/>
- <context_menu label="Attacca" name="Object Attach"/>
- <context_menu label="Attacca HUD" name="Object Attach HUD"/>
- </context_menu>
- <context_menu label="Gestisci" name="Remove">
- <menu_item_call label="Segnala abuso" name="Report Abuse..."/>
- <menu_item_call label="Blocca" name="Object Mute"/>
- <menu_item_call label="Restituisci" name="Return..."/>
- </context_menu>
- <menu_item_call label="Prendi" name="Pie Object Take"/>
- <menu_item_call label="Prendi copia" name="Take Copy"/>
- <menu_item_call label="Paga" name="Pay..."/>
- <menu_item_call label="Acquista" name="Buy..."/>
- <menu_item_call label="Elimina" name="Delete"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_object_icon.xml b/indra/newview/skins/minimal/xui/it/menu_object_icon.xml
deleted file mode 100644
index 0f347b1a90..0000000000
--- a/indra/newview/skins/minimal/xui/it/menu_object_icon.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Object Icon Menu">
- <menu_item_call label="Profilo oggetto..." name="Object Profile"/>
- <menu_item_call label="Blocca..." name="Block"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_outfit_gear.xml b/indra/newview/skins/minimal/xui/it/menu_outfit_gear.xml
deleted file mode 100644
index 09fc867d7c..0000000000
--- a/indra/newview/skins/minimal/xui/it/menu_outfit_gear.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<toggleable_menu name="Gear Outfit">
- <menu_item_call label="Indossa - Sostituisci vestiario attuale" name="wear"/>
- <menu_item_call label="Indossa - Aggiungi al vestiario attuale" name="wear_add"/>
- <menu_item_call label="Togli - Rimuovi dal vestiario attuale" name="take_off"/>
- <menu label="Nuovi abiti" name="New Clothes">
- <menu_item_call label="Nuova camicia" name="New Shirt"/>
- <menu_item_call label="Nuovi pantaloni" name="New Pants"/>
- <menu_item_call label="Nuove scarpe" name="New Shoes"/>
- <menu_item_call label="Nuove calze" name="New Socks"/>
- <menu_item_call label="Nuova giacca" name="New Jacket"/>
- <menu_item_call label="Nuova gonna" name="New Skirt"/>
- <menu_item_call label="Nuovi guanti" name="New Gloves"/>
- <menu_item_call label="Nuova maglietta intima" name="New Undershirt"/>
- <menu_item_call label="Nuovi slip" name="New Underpants"/>
- <menu_item_call label="Nuovo Alpha (trasparenza)" name="New Alpha"/>
- <menu_item_call label="Nuova fisica" name="New Physics"/>
- <menu_item_call label="Nuovo tatuaggio" name="New Tattoo"/>
- </menu>
- <menu label="Nuove parti del corpo" name="New Body Parts">
- <menu_item_call label="Nuova figura corporea" name="New Shape"/>
- <menu_item_call label="Nuova pelle" name="New Skin"/>
- <menu_item_call label="Nuovi capelli" name="New Hair"/>
- <menu_item_call label="Nuovi occhi" name="New Eyes"/>
- </menu>
- <menu_item_call label="Cambia nome del vestiario" name="rename"/>
- <menu_item_call label="Elimina vestito" name="delete_outfit"/>
-</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_outfit_tab.xml b/indra/newview/skins/minimal/xui/it/menu_outfit_tab.xml
deleted file mode 100644
index 8166cf20ed..0000000000
--- a/indra/newview/skins/minimal/xui/it/menu_outfit_tab.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Outfit">
- <menu_item_call label="Indossa - Sostituisci vestiario attuale" name="wear_replace"/>
- <menu_item_call label="Indossa - Aggiungi al vestiario attuale" name="wear_add"/>
- <menu_item_call label="Togli - Rimuovi dal vestiario attuale" name="take_off"/>
- <menu_item_call label="Modifica vestiario" name="edit"/>
- <menu_item_call label="Cambia nome del vestiario" name="rename"/>
- <menu_item_call label="Elimina vestito" name="delete"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_participant_list.xml b/indra/newview/skins/minimal/xui/it/menu_participant_list.xml
deleted file mode 100644
index 1b057c4077..0000000000
--- a/indra/newview/skins/minimal/xui/it/menu_participant_list.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Participant List Context Menu">
- <menu_item_check label="Ordina in base al nome" name="SortByName"/>
- <menu_item_check label="Ordina in base a intervenuti recenti" name="SortByRecentSpeakers"/>
- <menu_item_call label="Vedi profilo" name="View Profile"/>
- <menu_item_call label="Aggiungi amico" name="Add Friend"/>
- <menu_item_call label="IM" name="IM"/>
- <menu_item_call label="Chiama" name="Call"/>
- <menu_item_call label="Condividi" name="Share"/>
- <menu_item_call label="Paga" name="Pay"/>
- <menu_item_check label="Icone persone" name="View Icons"/>
- <menu_item_check label="Blocca voce" name="Block/Unblock"/>
- <menu_item_check label="Blocca testo" name="MuteText"/>
- <context_menu label="Opzioni moderatore" name="Moderator Options">
- <menu_item_check label="Consenti chat di testo" name="AllowTextChat"/>
- <menu_item_call label="Disattiva audio di questo participante" name="ModerateVoiceMuteSelected"/>
- <menu_item_call label="Riattiva audio di questo participante" name="ModerateVoiceUnMuteSelected"/>
- <menu_item_call label="Disattiva audio di tutti" name="ModerateVoiceMute"/>
- <menu_item_call label="Riattiva audio di tutti" name="ModerateVoiceUnmute"/>
- </context_menu>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_people_friends_view_sort.xml b/indra/newview/skins/minimal/xui/it/menu_people_friends_view_sort.xml
deleted file mode 100644
index 3a799f44eb..0000000000
--- a/indra/newview/skins/minimal/xui/it/menu_people_friends_view_sort.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_group_plus">
- <menu_item_check label="Ordina in base al nome" name="sort_name"/>
- <menu_item_check label="Ordina in base allo stato" name="sort_status"/>
- <menu_item_check label="Icone persone" name="view_icons"/>
- <menu_item_check label="Visualizza autorizzazioni concesse" name="view_permissions"/>
- <menu_item_call label="Mostra oggetti e residenti bloccati" name="show_blocked_list"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_people_groups.xml b/indra/newview/skins/minimal/xui/it/menu_people_groups.xml
deleted file mode 100644
index 30a97a1c72..0000000000
--- a/indra/newview/skins/minimal/xui/it/menu_people_groups.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_group_plus">
- <menu_item_call label="Mostra informazioni" name="View Info"/>
- <menu_item_call label="Chat" name="Chat"/>
- <menu_item_call label="Chiama" name="Call"/>
- <menu_item_call label="Attiva" name="Activate"/>
- <menu_item_call label="Chiudi" name="Leave"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_people_groups_view_sort.xml b/indra/newview/skins/minimal/xui/it/menu_people_groups_view_sort.xml
deleted file mode 100644
index d31ddaf1aa..0000000000
--- a/indra/newview/skins/minimal/xui/it/menu_people_groups_view_sort.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_group_plus">
- <menu_item_check label="Visualizza le icone di gruppo" name="Display Group Icons"/>
- <menu_item_call label="Lascia i gruppi selezionati" name="Leave Selected Group"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_people_nearby.xml b/indra/newview/skins/minimal/xui/it/menu_people_nearby.xml
deleted file mode 100644
index ab06d28c36..0000000000
--- a/indra/newview/skins/minimal/xui/it/menu_people_nearby.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Avatar Context Menu">
- <menu_item_call label="Vedi profilo" name="View Profile"/>
- <menu_item_call label="Aggiungi come amico" name="Add Friend"/>
- <menu_item_call label="Rimuovi amico" name="Remove Friend"/>
- <menu_item_call label="IM" name="IM"/>
- <menu_item_call label="Chiama" name="Call"/>
- <menu_item_call label="Mappa" name="Map"/>
- <menu_item_call label="Condividi" name="Share"/>
- <menu_item_call label="Paga" name="Pay"/>
- <menu_item_check label="Blocca/Sblocca" name="Block/Unblock"/>
- <menu_item_call label="Offri Teleport" name="teleport"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_people_nearby_multiselect.xml b/indra/newview/skins/minimal/xui/it/menu_people_nearby_multiselect.xml
deleted file mode 100644
index e0b9ceb63d..0000000000
--- a/indra/newview/skins/minimal/xui/it/menu_people_nearby_multiselect.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Multi-Selected People Context Menu">
- <menu_item_call label="Aggiungi amici" name="Add Friends"/>
- <menu_item_call label="Rimuovi amici" name="Remove Friend"/>
- <menu_item_call label="IM" name="IM"/>
- <menu_item_call label="Chiama" name="Call"/>
- <menu_item_call label="Condividi" name="Share"/>
- <menu_item_call label="Paga" name="Pay"/>
- <menu_item_call label="Offri Teleport" name="teleport"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_people_nearby_view_sort.xml b/indra/newview/skins/minimal/xui/it/menu_people_nearby_view_sort.xml
deleted file mode 100644
index aae2313702..0000000000
--- a/indra/newview/skins/minimal/xui/it/menu_people_nearby_view_sort.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_group_plus">
- <menu_item_check label="Ordina in base a intervenuti recenti" name="sort_by_recent_speakers"/>
- <menu_item_check label="Ordina in base al nome" name="sort_name"/>
- <menu_item_check label="Ordina in base alla distanza" name="sort_distance"/>
- <menu_item_check label="Icone persone" name="view_icons"/>
- <menu_item_call label="Mostra oggetti e residenti bloccati" name="show_blocked_list"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_people_recent_view_sort.xml b/indra/newview/skins/minimal/xui/it/menu_people_recent_view_sort.xml
deleted file mode 100644
index 7fccd1621a..0000000000
--- a/indra/newview/skins/minimal/xui/it/menu_people_recent_view_sort.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_group_plus">
- <menu_item_check label="Mostra prima i più recenti" name="sort_most"/>
- <menu_item_check label="Ordina in base al nome" name="sort_name"/>
- <menu_item_check label="Icone persone" name="view_icons"/>
- <menu_item_call label="Mostra oggetti e residenti bloccati" name="show_blocked_list"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_picks.xml b/indra/newview/skins/minimal/xui/it/menu_picks.xml
deleted file mode 100644
index 000d219ed0..0000000000
--- a/indra/newview/skins/minimal/xui/it/menu_picks.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Picks">
- <menu_item_call label="Informazioni" name="pick_info"/>
- <menu_item_call label="Modifica" name="pick_edit"/>
- <menu_item_call label="Teleport" name="pick_teleport"/>
- <menu_item_call label="Mappa" name="pick_map"/>
- <menu_item_call label="Elimina" name="pick_delete"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_picks_plus.xml b/indra/newview/skins/minimal/xui/it/menu_picks_plus.xml
deleted file mode 100644
index 7fbd5abd57..0000000000
--- a/indra/newview/skins/minimal/xui/it/menu_picks_plus.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<toggleable_menu name="picks_plus_menu">
- <menu_item_call label="Nuovo luogo preferito" name="create_pick"/>
- <menu_item_call label="Nuovo annuncio" name="create_classified"/>
-</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_place.xml b/indra/newview/skins/minimal/xui/it/menu_place.xml
deleted file mode 100644
index 5381a4effa..0000000000
--- a/indra/newview/skins/minimal/xui/it/menu_place.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<toggleable_menu name="place_overflow_menu">
- <menu_item_call label="Salva come punto di riferimento" name="landmark"/>
- <menu_item_call label="Crea Luogo consigliato" name="pick"/>
- <menu_item_call label="Acquista Permesso" name="pass"/>
- <menu_item_call label="Modifica" name="edit"/>
-</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_place_add_button.xml b/indra/newview/skins/minimal/xui/it/menu_place_add_button.xml
deleted file mode 100644
index 0e783c0000..0000000000
--- a/indra/newview/skins/minimal/xui/it/menu_place_add_button.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_folder_gear">
- <menu_item_call label="Aggiungi cartella" name="add_folder"/>
- <menu_item_call label="Aggiungi punto di riferimento" name="add_landmark"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_places_gear_folder.xml b/indra/newview/skins/minimal/xui/it/menu_places_gear_folder.xml
deleted file mode 100644
index 23757d47e0..0000000000
--- a/indra/newview/skins/minimal/xui/it/menu_places_gear_folder.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<toggleable_menu name="menu_folder_gear">
- <menu_item_call label="Aggiungi punto di riferimento" name="add_landmark"/>
- <menu_item_call label="Aggiungi cartella" name="add_folder"/>
- <menu_item_call label="Ripristina oggetto" name="restore_item"/>
- <menu_item_call label="Taglia" name="cut"/>
- <menu_item_call label="Copia" name="copy_folder"/>
- <menu_item_call label="Incolla" name="paste"/>
- <menu_item_call label="Modifica nome" name="rename"/>
- <menu_item_call label="Elimina" name="delete"/>
- <menu_item_call label="Espandi" name="expand"/>
- <menu_item_call label="Comprimi" name="collapse"/>
- <menu_item_call label="Apri tutte le cartelle" name="expand_all"/>
- <menu_item_call label="Chiudi tutte le cartelle" name="collapse_all"/>
- <menu_item_check label="Ordina in base alla data" name="sort_by_date"/>
-</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_places_gear_landmark.xml b/indra/newview/skins/minimal/xui/it/menu_places_gear_landmark.xml
deleted file mode 100644
index a458b1a768..0000000000
--- a/indra/newview/skins/minimal/xui/it/menu_places_gear_landmark.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<toggleable_menu name="menu_ladmark_gear">
- <menu_item_call label="Teleport" name="teleport"/>
- <menu_item_call label="Maggiori informazioni" name="more_info"/>
- <menu_item_call label="Mostra sulla mappa" name="show_on_map"/>
- <menu_item_call label="Aggiungi Punto di riferimento" name="add_landmark"/>
- <menu_item_call label="Aggiungi cartella" name="add_folder"/>
- <menu_item_call label="Ripristina oggetto" name="restore_item"/>
- <menu_item_call label="Taglia" name="cut"/>
- <menu_item_call label="Copia punto di riferimento" name="copy_landmark"/>
- <menu_item_call label="Copia SLurl" name="copy_slurl"/>
- <menu_item_call label="Incolla" name="paste"/>
- <menu_item_call label="Modifica nome" name="rename"/>
- <menu_item_call label="Elimina" name="delete"/>
- <menu_item_call label="Apri tutte le cartelle" name="expand_all"/>
- <menu_item_call label="Chiudi tutte le cartelle" name="collapse_all"/>
- <menu_item_check label="Ordina in base alla data" name="sort_by_date"/>
- <menu_item_call label="Crea Luogo consigliato" name="create_pick"/>
-</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_profile_overflow.xml b/indra/newview/skins/minimal/xui/it/menu_profile_overflow.xml
deleted file mode 100644
index 56b695c597..0000000000
--- a/indra/newview/skins/minimal/xui/it/menu_profile_overflow.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<toggleable_menu name="profile_overflow_menu">
- <menu_item_call label="Mappa" name="show_on_map"/>
- <menu_item_call label="Paga" name="pay"/>
- <menu_item_call label="Condividi" name="share"/>
- <menu_item_call label="Blocca" name="block"/>
- <menu_item_call label="Sblocca" name="unblock"/>
- <menu_item_call label="Espelli" name="kick"/>
- <menu_item_call label="Congela" name="freeze"/>
- <menu_item_call label="Scongela" name="unfreeze"/>
- <menu_item_call label="CSR" name="csr"/>
-</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_save_outfit.xml b/indra/newview/skins/minimal/xui/it/menu_save_outfit.xml
deleted file mode 100644
index 4882a8ac64..0000000000
--- a/indra/newview/skins/minimal/xui/it/menu_save_outfit.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<toggleable_menu name="save_outfit_menu">
- <menu_item_call label="Salva" name="save_outfit"/>
- <menu_item_call label="Salva con nome" name="save_as_new_outfit"/>
-</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_script_chiclet.xml b/indra/newview/skins/minimal/xui/it/menu_script_chiclet.xml
deleted file mode 100644
index 604f754ba8..0000000000
--- a/indra/newview/skins/minimal/xui/it/menu_script_chiclet.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="ScriptChiclet Menu">
- <menu_item_call label="Chiudi" name="Close"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_slurl.xml b/indra/newview/skins/minimal/xui/it/menu_slurl.xml
deleted file mode 100644
index be83133efc..0000000000
--- a/indra/newview/skins/minimal/xui/it/menu_slurl.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Popup">
- <menu_item_call label="Informazioni sull&apos;indirizzo URL" name="about_url"/>
- <menu_item_call label="Teleportati all&apos;indirizzo URL" name="teleport_to_url"/>
- <menu_item_call label="Mappa" name="show_on_map"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_teleport_history_gear.xml b/indra/newview/skins/minimal/xui/it/menu_teleport_history_gear.xml
deleted file mode 100644
index 409a62c31b..0000000000
--- a/indra/newview/skins/minimal/xui/it/menu_teleport_history_gear.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Teleport History Gear Context Menu">
- <menu_item_call label="Apri tutte le cartelle" name="Expand all folders"/>
- <menu_item_call label="Chiudi tutte le cartelle" name="Collapse all folders"/>
- <menu_item_call label="Cancella la cronologia Teleport" name="Clear Teleport History"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_teleport_history_item.xml b/indra/newview/skins/minimal/xui/it/menu_teleport_history_item.xml
deleted file mode 100644
index 81053fbd65..0000000000
--- a/indra/newview/skins/minimal/xui/it/menu_teleport_history_item.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Teleport History Item Context Menu">
- <menu_item_call label="Teleport" name="Teleport"/>
- <menu_item_call label="Maggiori informazioni" name="More Information"/>
- <menu_item_call label="Copia negli appunti" name="CopyToClipboard"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_teleport_history_tab.xml b/indra/newview/skins/minimal/xui/it/menu_teleport_history_tab.xml
deleted file mode 100644
index c221f141a6..0000000000
--- a/indra/newview/skins/minimal/xui/it/menu_teleport_history_tab.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Teleport History Item Context Menu">
- <menu_item_call label="Apri" name="TabOpen"/>
- <menu_item_call label="Chiudi" name="TabClose"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_text_editor.xml b/indra/newview/skins/minimal/xui/it/menu_text_editor.xml
deleted file mode 100644
index 4636ce9929..0000000000
--- a/indra/newview/skins/minimal/xui/it/menu_text_editor.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Text editor context menu">
- <menu_item_call label="Taglia" name="Cut"/>
- <menu_item_call label="Copia" name="Copy"/>
- <menu_item_call label="Incolla" name="Paste"/>
- <menu_item_call label="Elimina" name="Delete"/>
- <menu_item_call label="Seleziona tutto" name="Select All"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_topinfobar.xml b/indra/newview/skins/minimal/xui/it/menu_topinfobar.xml
deleted file mode 100644
index 0beb9314de..0000000000
--- a/indra/newview/skins/minimal/xui/it/menu_topinfobar.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_topinfobar">
- <menu_item_check label="Mostra le coordinate" name="Show Coordinates"/>
- <menu_item_check label="Mostra proprietà del lotto" name="Show Parcel Properties"/>
- <menu_item_call label="Punto di riferimento" name="Landmark"/>
- <menu_item_call label="Copia" name="Copy"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_url_agent.xml b/indra/newview/skins/minimal/xui/it/menu_url_agent.xml
deleted file mode 100644
index 37755d5749..0000000000
--- a/indra/newview/skins/minimal/xui/it/menu_url_agent.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Url Popup">
- <menu_item_call label="Mostra profilo residente" name="show_agent"/>
- <menu_item_call label="Copia nome negli Appunti" name="url_copy_label"/>
- <menu_item_call label="Copia SLurl negli Appunti" name="url_copy"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_url_group.xml b/indra/newview/skins/minimal/xui/it/menu_url_group.xml
deleted file mode 100644
index d9a792ebdf..0000000000
--- a/indra/newview/skins/minimal/xui/it/menu_url_group.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Url Popup">
- <menu_item_call label="Mostra informazioni gruppo" name="show_group"/>
- <menu_item_call label="Copia gruppo negli Appunti" name="url_copy_label"/>
- <menu_item_call label="Copia SLurl negli Appunti" name="url_copy"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_url_http.xml b/indra/newview/skins/minimal/xui/it/menu_url_http.xml
deleted file mode 100644
index e0153d9169..0000000000
--- a/indra/newview/skins/minimal/xui/it/menu_url_http.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Url Popup">
- <menu_item_call label="Apri pagina Web" name="url_open"/>
- <menu_item_call label="Apri nel browser interno" name="url_open_internal"/>
- <menu_item_call label="Apri nel browser esterno" name="url_open_external"/>
- <menu_item_call label="Copia URL negli Appunti" name="url_copy"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_url_inventory.xml b/indra/newview/skins/minimal/xui/it/menu_url_inventory.xml
deleted file mode 100644
index a45a6bbc10..0000000000
--- a/indra/newview/skins/minimal/xui/it/menu_url_inventory.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Url Popup">
- <menu_item_call label="Mostra oggetto dell&apos;inventario" name="show_item"/>
- <menu_item_call label="Copia nome negli Appunti" name="url_copy_label"/>
- <menu_item_call label="Copia SLurl negli Appunti" name="url_copy"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_url_map.xml b/indra/newview/skins/minimal/xui/it/menu_url_map.xml
deleted file mode 100644
index cb7935b3ed..0000000000
--- a/indra/newview/skins/minimal/xui/it/menu_url_map.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Url Popup">
- <menu_item_call label="Mostra sulla mappa" name="show_on_map"/>
- <menu_item_call label="Teleport al luogo" name="teleport_to_location"/>
- <menu_item_call label="Copia SLurl negli Appunti" name="url_copy"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_url_objectim.xml b/indra/newview/skins/minimal/xui/it/menu_url_objectim.xml
deleted file mode 100644
index 763e65f17c..0000000000
--- a/indra/newview/skins/minimal/xui/it/menu_url_objectim.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Url Popup">
- <menu_item_call label="Mostra informazioni oggetto" name="show_object"/>
- <menu_item_call label="Mostra sulla mappa" name="show_on_map"/>
- <menu_item_call label="Teleport sul luogo dell&apos;oggetto" name="teleport_to_object"/>
- <menu_item_call label="Copia nome oggetto negli Appunti" name="url_copy_label"/>
- <menu_item_call label="Copia SLurl negli Appunti" name="url_copy"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_url_parcel.xml b/indra/newview/skins/minimal/xui/it/menu_url_parcel.xml
deleted file mode 100644
index a032c33585..0000000000
--- a/indra/newview/skins/minimal/xui/it/menu_url_parcel.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Url Popup">
- <menu_item_call label="Mostra informazioni lotto" name="show_parcel"/>
- <menu_item_call label="Mostra sulla mappa" name="show_on_map"/>
- <menu_item_call label="Copia SLurl negli Appunti" name="url_copy"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_url_slapp.xml b/indra/newview/skins/minimal/xui/it/menu_url_slapp.xml
deleted file mode 100644
index b368aa9141..0000000000
--- a/indra/newview/skins/minimal/xui/it/menu_url_slapp.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Url Popup">
- <menu_item_call label="Esegui questo comando" name="run_slapp"/>
- <menu_item_call label="Copia SLurl negli Appunti" name="url_copy"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_url_slurl.xml b/indra/newview/skins/minimal/xui/it/menu_url_slurl.xml
deleted file mode 100644
index 355c7dbed9..0000000000
--- a/indra/newview/skins/minimal/xui/it/menu_url_slurl.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Url Popup">
- <menu_item_call label="Mostra informazioni del luogo" name="show_place"/>
- <menu_item_call label="Mostra sulla mappa" name="show_on_map"/>
- <menu_item_call label="Teleport al luogo" name="teleport_to_location"/>
- <menu_item_call label="Copia SLurl negli Appunti" name="url_copy"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_url_teleport.xml b/indra/newview/skins/minimal/xui/it/menu_url_teleport.xml
deleted file mode 100644
index c129e61f25..0000000000
--- a/indra/newview/skins/minimal/xui/it/menu_url_teleport.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Url Popup">
- <menu_item_call label="Teleport a questa destinazione" name="teleport"/>
- <menu_item_call label="Mostra sulla mappa" name="show_on_map"/>
- <menu_item_call label="Copia SLurl negli Appunti" name="url_copy"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_viewer.xml b/indra/newview/skins/minimal/xui/it/menu_viewer.xml
deleted file mode 100644
index 8353044f37..0000000000
--- a/indra/newview/skins/minimal/xui/it/menu_viewer.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu_bar name="Main Menu">
- <menu label="Aiuto" name="Help">
- <menu_item_call label="Aiuto di [SECOND_LIFE]" name="Second Life Help"/>
- </menu>
- <menu label="Avanzate" name="Advanced">
- <menu label="Scorciatoie" name="Shortcuts">
- <menu_item_check label="Vola" name="Fly"/>
- <menu_item_call label="Chiudi finestra" name="Close Window"/>
- <menu_item_call label="Chiudi tutte le finestre" name="Close All Windows"/>
- <menu_item_call label="Reimposta vista" name="Reset View"/>
- </menu>
- </menu>
-</menu_bar>
diff --git a/indra/newview/skins/minimal/xui/it/menu_wearable_list_item.xml b/indra/newview/skins/minimal/xui/it/menu_wearable_list_item.xml
deleted file mode 100644
index c9a02d8a86..0000000000
--- a/indra/newview/skins/minimal/xui/it/menu_wearable_list_item.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Outfit Wearable Context Menu">
- <menu_item_call label="Sostituisci" name="wear_replace"/>
- <menu_item_call label="Indossa" name="wear_wear"/>
- <menu_item_call label="Aggiungi" name="wear_add"/>
- <menu_item_call label="Togli / Stacca" name="take_off_or_detach"/>
- <menu_item_call label="Stacca" name="detach"/>
- <context_menu label="Attacca a" name="wearable_attach_to"/>
- <context_menu label="Attacca a HUD" name="wearable_attach_to_hud"/>
- <menu_item_call label="Togli" name="take_off"/>
- <menu_item_call label="Modifica" name="edit"/>
- <menu_item_call label="Profilo articolo" name="object_profile"/>
- <menu_item_call label="Mostra originale" name="show_original"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_wearing_gear.xml b/indra/newview/skins/minimal/xui/it/menu_wearing_gear.xml
deleted file mode 100644
index 7c8eef64e5..0000000000
--- a/indra/newview/skins/minimal/xui/it/menu_wearing_gear.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Gear Wearing">
- <menu_item_call label="Modifica vestiario" name="edit"/>
- <menu_item_call label="Togli" name="takeoff"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_wearing_tab.xml b/indra/newview/skins/minimal/xui/it/menu_wearing_tab.xml
deleted file mode 100644
index 4a5366091f..0000000000
--- a/indra/newview/skins/minimal/xui/it/menu_wearing_tab.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Wearing">
- <menu_item_call label="Togli" name="take_off"/>
- <menu_item_call label="Stacca" name="detach"/>
- <menu_item_call label="Modifica vestiario" name="edit"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/it/notifications.xml b/indra/newview/skins/minimal/xui/it/notifications.xml
deleted file mode 100644
index cf24d6cbf5..0000000000
--- a/indra/newview/skins/minimal/xui/it/notifications.xml
+++ /dev/null
@@ -1,2951 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<notifications>
- <global name="skipnexttime">
- Non mostrare più la prossima volta
- </global>
- <global name="alwayschoose">
- Scegli sempre questa opzione
- </global>
- <global name="implicitclosebutton">
- Chiudi
- </global>
- <template name="okbutton">
- <form>
- <button name="OK_okbutton" text="$yestext"/>
- </form>
- </template>
- <template name="okignore">
- <form>
- <button name="OK_okignore" text="$yestext"/>
- </form>
- </template>
- <template name="okcancelbuttons">
- <form>
- <button name="OK_okcancelbuttons" text="$yestext"/>
- <button name="Cancel_okcancelbuttons" text="$notext"/>
- </form>
- </template>
- <template name="okcancelignore">
- <form>
- <button name="OK_okcancelignore" text="$yestext"/>
- <button name="Cancel_okcancelignore" text="$notext"/>
- </form>
- </template>
- <template name="okhelpbuttons">
- <form>
- <button name="OK_okhelpbuttons" text="$yestext"/>
- <button name="Help" text="$helptext"/>
- </form>
- </template>
- <template name="yesnocancelbuttons">
- <form>
- <button name="Yes" text="$yestext"/>
- <button name="No" text="$notext"/>
- <button name="Cancel_yesnocancelbuttons" text="$canceltext"/>
- </form>
- </template>
- <notification functor="GenericAcknowledge" label="Messaggio di notifica sconosciuto" name="MissingAlert">
- La versione di [APP_NAME] non riesce a visualizzare la notifica appena ricevuta. Verifica di avere l&apos;ultima versione del Viewer installata.
-
-Dettagli errore: La notifica denominata &apos;[_NAME]&apos; non è stata trovata in notifications.xml.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="FloaterNotFound">
- Errore visualizzazione finestra: Non trovati i seguenti controlli:
-
-[CONTROLS]
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="TutorialNotFound">
- Nessun tutorial disponibile al momento.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="GenericAlert">
- [MESSAGE]
- </notification>
- <notification name="GenericAlertYesCancel">
- [MESSAGE]
- <usetemplate name="okcancelbuttons" notext="Annulla" yestext="Si"/>
- </notification>
- <notification name="BadInstallation">
- Il programma [APP_NAME] ha riscontrato un&apos;errore durante il tentativo di aggiornamento. [http://get.secondlife.com Scarica l&apos;ultima versione] del Viewer.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="LoginFailedNoNetwork">
- Non è possibile collegarsi alla [SECOND_LIFE_GRID].
- &apos;[DIAGNOSTIC]&apos;
-Accertati che la tua connessione Internet stia funzionando correttamente.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="MessageTemplateNotFound">
- Il modello di messaggio [PATH] non è stato trovato.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="WearableSave">
- Salva i cambiamenti all&apos;attuale parte del corpo/abito?
- <usetemplate canceltext="Annulla" name="yesnocancelbuttons" notext="Non salvare" yestext="Salva"/>
- </notification>
- <notification name="CompileQueueSaveText">
- C&apos;è stato un problema importando il testo di uno script per la seguente ragione: [REASON]. Riprova più tardi.
- </notification>
- <notification name="CompileQueueSaveBytecode">
- C&apos;è stato un problema importando lo script compilato per la seguente ragione: [REASON]. Riprova più tardi.
- </notification>
- <notification name="WriteAnimationFail">
- C&apos;è stato un problema di scrittura dati dell&apos;animazione. Riprova più tardi.
- </notification>
- <notification name="UploadAuctionSnapshotFail">
- C&apos;è stato un problema importando la fotografia dell&apos;asta per la seguente ragione: [REASON]
- </notification>
- <notification name="UnableToViewContentsMoreThanOne">
- Non è possibile vedere il contenuto di più di un elemento per volta.
-Scegli solo un oggetto e riprova.
- </notification>
- <notification name="SaveClothingBodyChanges">
- Salva tutte le modifiche alle parti del corpo/abiti?
- <usetemplate canceltext="Annulla" name="yesnocancelbuttons" notext="Non Salvare" yestext="Salva Tutto"/>
- </notification>
- <notification name="FriendsAndGroupsOnly">
- Chi non è tuo amico non saprà che hai scelto di ignorare le loro chiamate e IM.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="FavoritesOnLogin">
- Nota: Se attivi questa opzione, chiunque usa questo computer può vedere l&apos;elenco di luoghi preferiti.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="GrantModifyRights">
- Quando concedi i diritti di modifica ad un altro residente, gli permetti di modificare, eliminare o prendere QUALSIASI oggetto che possiedi in Second Life. Pertanto ti consigliamo di essere ben sicuro quando concedi questo diritto.
-Vuoi concedere i diritti di modifica a [NAME]?
- <usetemplate name="okcancelbuttons" notext="No" yestext="Si"/>
- </notification>
- <notification name="GrantModifyRightsMultiple">
- Quando concedi i diritti di modifica ad un altro residente, gli permetti di modificare QUALSIASI oggetto che possiedi in Second Life. Pertanto ti consigliamo di essere ben sicuro quando concedi questo diritto.
-Vuoi concedere i diritti di modifica ai residenti selezionati?
- <usetemplate name="okcancelbuttons" notext="No" yestext="Si"/>
- </notification>
- <notification name="RevokeModifyRights">
- Vuoi revocare i diritti di modifica di [NAME]?
- <usetemplate name="okcancelbuttons" notext="No" yestext="Si"/>
- </notification>
- <notification name="RevokeModifyRightsMultiple">
- Vuoi revocare i permessi di modifica dati ai residenti selezionati?
- <usetemplate name="okcancelbuttons" notext="No" yestext="Si"/>
- </notification>
- <notification name="UnableToCreateGroup">
- Non è possibile creare il gruppo.
-[MESSAGE]
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="PanelGroupApply">
- [NEEDS_APPLY_MESSAGE]
-[WANT_APPLY_MESSAGE]
- <usetemplate canceltext="Annulla" name="yesnocancelbuttons" notext="Ignora le modifiche" yestext="Applica le modifiche"/>
- </notification>
- <notification name="MustSpecifyGroupNoticeSubject">
- Devi specificare un oggetto per mandare una notice al gruppo.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="AddGroupOwnerWarning">
- Stai per aggiungere dei membri al ruolo [ROLE_NAME].
-Non si possono rimuovere membri da quel ruolo.
-I membri devono dimettersi volontariamente dal ruolo.
-Confermi l&apos;operazione?
- <usetemplate ignoretext="Conferma prima di aggiungere un nuovo proprietario del gruppo" name="okcancelignore" notext="No" yestext="Si"/>
- </notification>
- <notification name="AssignDangerousActionWarning">
- Stai per aggiungere il potere &apos;[ACTION_NAME]&apos; al ruolo &apos;[ROLE_NAME]&apos;.
-
- *ATTENZIONE*
- Ogni membro di un ruolo con questo potere può assegnare a sè stesso -- e a qualunque altro membro -- ruoli che hanno più poteri di quelli che hanno correntemente, potenzialmente consentendogli di avere quasi i poteri del proprietario. Accertati di sapere quello che stai facendo prima di assegnare questo potere.
-
-Aggiungi questo potere a &apos;[ROLE_NAME]&apos;?
- <usetemplate name="okcancelbuttons" notext="No" yestext="Si"/>
- </notification>
- <notification name="AssignDangerousAbilityWarning">
- Stai per aggiungere il potere &apos;[ACTION_NAME]&apos; al ruolo &apos;[ROLE_NAME]&apos;.
-
- *ATTENZIONE*
- Ogni membro di un ruolo con questo potere può assegnare a sè stesso -- e a qualunque altro membro -- tutti i poteri, elevandosi al livello di quasi proprietario.
-
-Aggiungi questo potere a &apos;[ROLE_NAME]&apos;?
- <usetemplate name="okcancelbuttons" notext="No" yestext="Si"/>
- </notification>
- <notification name="AttachmentDrop">
- Stai per abbandonare il tuo accessorio.
- Vuoi continuare?
- <usetemplate ignoretext="Conferma prima di distaccare gli accessori" name="okcancelignore" notext="No" yestext="Sì"/>
- </notification>
- <notification name="JoinGroupCanAfford">
- Iscriversi a questo gruppo costa [COST]L$.
-Vuoi proseguire?
- <usetemplate name="okcancelbuttons" notext="Annulla" yestext="Iscriviti"/>
- </notification>
- <notification name="JoinGroupNoCost">
- Aderisci al gruppo [NAME].
-Continuare?
- <usetemplate name="okcancelbuttons" notext="Annulla" yestext="Iscriviti"/>
- </notification>
- <notification name="JoinGroupCannotAfford">
- Iscriversi a questo gruppo costa [COST]L$.
-Non hai abbastanza L$ per iscriverti a questo gruppo.
- </notification>
- <notification name="CreateGroupCost">
- La creazione di questo gruppo costerà L$ 100.
-I gruppi devono avere più di un partecipante, o saranno eliminati definitivamente.
-Invita altri partecipanti entro le prossime 48 ore.
- <usetemplate canceltext="Annulla" name="okcancelbuttons" notext="Annulla" yestext="Crea un gruppo per L$ 100"/>
- </notification>
- <notification name="LandBuyPass">
- Pagando [COST]L$ puoi entrare in questa terra (&apos;[PARCEL_NAME]&apos;) per [TIME] ore. Compri un pass?
- <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
- </notification>
- <notification name="SalePriceRestriction">
- Il prezzo di vendita deve essere superiore a 0L$ se vendi a tutti.
-Seleziona una vendita individuale per vendere a 0L$.
- </notification>
- <notification name="ConfirmLandSaleChange">
- Il terreno selezionato di [LAND_SIZE] m² sta per essere messo in vendita.
-Il tuo prezzo di vendità è [SALE_PRICE]L$ ed è autorizzato alla vendita a [NAME].
- <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
- </notification>
- <notification name="ConfirmLandSaleToAnyoneChange">
- ATTENZIONE: Quando selezioni &apos;vendi a tutti&apos;, rendi questo terreno disponibile all&apos;intera comunità di [SECOND_LIFE], anche alle persone che non si trovano in questa regione.
-
-Il terrendo selezionato di [LAND_SIZE] m² sta per essere messo in vendita.
-Il prezzo di vendità sarà [SALE_PRICE]L$ e [NAME] viene autorizzato alla vendita.
- <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
- </notification>
- <notification name="ReturnObjectsDeededToGroup">
- Confermi di volere restituire tutti gli oggetti condivisi con il gruppo &apos;[NAME]&apos; di questo terreno agli inventari dei proprietari precedenti?
-
-*ATTENZIONE* Questo cancellerà gli oggetti non trasferibili ceduti al gruppo!
-
-Oggetti: [N]
- <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
- </notification>
- <notification name="ReturnObjectsOwnedByUser">
- Confermi di volere restituire tutti gli oggetti posseduti dal residente &apos;[NAME]&apos; in questo terreno al suo inventario?
-
-Oggetti: [N]
- <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
- </notification>
- <notification name="ReturnObjectsOwnedBySelf">
- Confermi di volere restituire tutti gli oggetti posseduti da te in questo terreno, di nuovo nel tuo inventario?
-
-Oggetti: [N]
- <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
- </notification>
- <notification name="ReturnObjectsNotOwnedBySelf">
- Confermi di volere restituire tutti gli oggetti di cui NON sei proprietario in questo terreno all&apos;inventario dei rispettivi proprietari?
-Gli oggetti trasferibili ceduti al gruppo verranno restituiti ai loro proprietari precedenti.
-
-*ATTENZIONE* Questo cancellerà gli oggetti non trasferibili ceduti al gruppo!
-
-Oggetti: [N]
- <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
- </notification>
- <notification name="ReturnObjectsNotOwnedByUser">
- Confermi di volere restituire tutti gli oggetti NON posseduti da [NAME] in questo terreno nell&apos;inventario dei loro proprietari?
-Gli oggetti trasferibili ceduti al gruppo verranno restituiti ai loro proprietari precedenti.
-
-*ATTENZIONE* Questo cancellerà gli oggetti non trasferibili ceduti al gruppo!
-
-Oggetti: [N]
- <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
- </notification>
- <notification name="ReturnAllTopObjects">
- Confermi di volere restituire tutti gli oggetti elencati nell&apos;inventario dei loro proprietari?
- <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
- </notification>
- <notification name="DisableAllTopObjects">
- Confermi di volere disabilitare tutti gli oggetti in questa regione?
- <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
- </notification>
- <notification name="ReturnObjectsNotOwnedByGroup">
- Restituisci gli oggetti in questo terreno che NON sono condivisi con il gruppo [NAME] ai loro proprietari?
-
-Oggetti: [N]
- <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
- </notification>
- <notification name="UnableToDisableOutsideScripts">
- Non è possibile disabilitare gli script.
-L&apos;intera regione ha l&apos;abilitazione danni.
-Gli script devono essere autorizzati all&apos;esecuzione affinchè le armi funzionino.
- </notification>
- <notification name="MultipleFacesSelected">
- Sono state selezionate più facce.
-Se prosegui con questa azione, sulle diverse facce dell&apos;oggetto verranno definite sessioni multimediali distinte.
-Per collocare il media su una sola faccia, scegli Seleziona faccia, clicca su una faccia e clicca su Aggiungi.
- <usetemplate ignoretext="Il canale multimediale sarà impostato su più facce selezionate" name="okcancelignore" notext="Annulla" yestext="OK"/>
- </notification>
- <notification name="MustBeInParcel">
- Devi essere dentro il terreno per impostare il suo Punto di Atterraggio.
- </notification>
- <notification name="PromptRecipientEmail">
- Introduci un indirizzo email per il destinatario/i.
- </notification>
- <notification name="PromptSelfEmail">
- Introduci il tuo indirizzo email.
- </notification>
- <notification name="PromptMissingSubjMsg">
- Invia la foto via email con soggetto o messaggio predefinito?
- <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
- </notification>
- <notification name="ErrorProcessingSnapshot">
- Errore nell&apos;elaborazione della fotografia.
- </notification>
- <notification name="ErrorEncodingSnapshot">
- Errore nella codifica della fotografia.
- </notification>
- <notification name="ErrorUploadingPostcard">
- C&apos;è stato un problema inviando la fotografia per il seguente motivo: [REASON]
- </notification>
- <notification name="ErrorUploadingReportScreenshot">
- C&apos;è stato un problema importando la foto del rapporto per il seguente motivo: [REASON]
- </notification>
- <notification name="MustAgreeToLogIn">
- Devi accettare i Termini di Servizio prima di proseguire il collegamento con [SECOND_LIFE].
- </notification>
- <notification name="CouldNotPutOnOutfit">
- Non è stato possibile indossare un equipaggiamento.
-La cartella equipaggiamento non contiene abbigliamento, parti del corpo o attachment.
- </notification>
- <notification name="CannotWearTrash">
- Non puoi indossare abiti e parti del corpo che sono nel cestino
- </notification>
- <notification name="MaxAttachmentsOnOutfit">
- L&apos;oggetto non può essere collegato.
-Superato il limite di oggetti collegati [MAX_ATTACHMENTS]. Per favore prima stacca un altro oggetto.
- </notification>
- <notification name="CannotWearInfoNotComplete">
- Non puoi indossare quell&apos;elemento perchè non è ancora stato caricato. Riprova fra un minuto.
- </notification>
- <notification name="MustHaveAccountToLogIn">
- Spiacenti. Un campo è vuoto.
-Inserisci il Nome utente del tuo avatar.
-
-Devi avere un account per entrare in [SECOND_LIFE]. Vuoi crearne uno adesso?
- <url name="url">
- https://join.secondlife.com/index.php?lang=it-IT
- </url>
- <usetemplate name="okcancelbuttons" notext="Riprova" yestext="Crea un nuovo account"/>
- </notification>
- <notification name="InvalidCredentialFormat">
- Immetti il nome utente oppure sia il nome che il cognome del tuo avatar nel campo del nome utente, quindi effettua nuovamente l&apos;accesso.
- </notification>
- <notification name="DeleteClassified">
- Cancella annuncio &apos;[NAME]&apos;?
-Non ci sono rimborsi per la tariffa pagata.
- <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
- </notification>
- <notification name="DeleteMedia">
- Hai selezionato la cancellazione del media associato a questa faccia.
-Vuoi continuare?
- <usetemplate ignoretext="Conferma prima di eliminare elementi multimediali dall&apos;oggetto" name="okcancelignore" notext="No" yestext="Sì"/>
- </notification>
- <notification name="ClassifiedSave">
- Salva le modifiche all&apos;annuncio [NAME]?
- <usetemplate canceltext="Annulla" name="yesnocancelbuttons" notext="Non salvare" yestext="Salva"/>
- </notification>
- <notification name="ClassifiedInsufficientFunds">
- Denaro insufficiente per creare un&apos;inserzione.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="DeleteAvatarPick">
- Elimina preferito &lt;nolink&gt;[PICK]&lt;/nolink&gt;?
- <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
- </notification>
- <notification name="DeleteOutfits">
- Elimina il vestiario selezionato?
- <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
- </notification>
- <notification name="PromptGoToEventsPage">
- Vai alla pagina degli eventi di [SECOND_LIFE]?
- <url name="url">
- http://secondlife.com/events/?lang=it-IT
- </url>
- <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
- </notification>
- <notification name="SelectProposalToView">
- Scegli una proposta da vedere.
- </notification>
- <notification name="SelectHistoryItemToView">
- Scegli un item storico da vedere.
- </notification>
- <notification name="CacheWillClear">
- La cache verrà cancellata dopo il riavvio di [APP_NAME].
- </notification>
- <notification name="CacheWillBeMoved">
- La cache verrà spostata dopo il riavvio di [APP_NAME].
-Nota: questa operazione cancellerà la cache.
- </notification>
- <notification name="ChangeConnectionPort">
- Le impostazioni della porta avranno effetto dopo il riavvio di [APP_NAME].
- </notification>
- <notification name="ChangeSkin">
- La nuova pelle comparirà dopo il riavvio di [APP_NAME].
- </notification>
- <notification name="ChangeLanguage">
- La modifica della lingua avrà effetto dopo il riavvio di [APP_NAME].
- </notification>
- <notification name="GoToAuctionPage">
- Vai alla pagina web [SECOND_LIFE] per vedere i dettagli dell&apos;asta oppure fai un&apos;offerta?
- <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
- </notification>
- <notification name="SaveChanges">
- Salva le modifiche?
- <usetemplate canceltext="Annulla" name="yesnocancelbuttons" notext="Non salvare" yestext="Salva"/>
- </notification>
- <notification name="GestureSaveFailedTooManySteps">
- Il salvataggio della Gesture è fallito.
-La gesture ha troppi passi.
-Prova a togliere qualche passo e quindi risalva.
- </notification>
- <notification name="GestureSaveFailedTryAgain">
- Il salvataggio della gesture è fallito. Riprova fra un minuto.
- </notification>
- <notification name="GestureSaveFailedObjectNotFound">
- Non è possibile salvare la gesture perchè non è stato trovato l&apos;oggetto o l&apos;inventario associato.
-L&apos;oggetto potrebbe essere troppo lontano oppure essere stato cancellato.
- </notification>
- <notification name="GestureSaveFailedReason">
- C&apos;è stato un problema salvando la gesture a causa del seguente motivo: [REASON]. Riprova a salvare la gesture più tardi.
- </notification>
- <notification name="SaveNotecardFailObjectNotFound">
- Non è possibile salvare la notecard perchè non è stato trovato l&apos;oggetto o l&apos;inventario associato.
-L&apos;oggetto potrebbe essere troppo lontano oppure essere stato cancellato.
- </notification>
- <notification name="SaveNotecardFailReason">
- C&apos;è stato un problema salvando la notecard a causa del seguente motivo: [REASON]. Riprova a salvare la notecard più tardi.
- </notification>
- <notification name="ScriptCannotUndo">
- Non è stato possibile annullare tutti i cambiamenti nella tua versione dello script.
-Vuoi ripristinare l&apos;ultima versione salvata sul server?
-(**Attenzione** Questa operazione non è reversibile)
- <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
- </notification>
- <notification name="SaveScriptFailReason">
- C&apos;è stato un problema salvando lo script a causa del seguente motivo : [REASON]. Riprova a salvare lo script più tardi.
- </notification>
- <notification name="SaveScriptFailObjectNotFound">
- Non è stato possibile salvare lo script perchè l&apos;oggetto che lo contiene non è stato trovato.
-L&apos;oggetto potrebbe essere troppo lontano oppure essere stato cancellato.
- </notification>
- <notification name="SaveBytecodeFailReason">
- C&apos;è stato un problema salvando lo script compilato a causa del seguente motivo: [REASON]. Riprova a salvare lo script più tardi.
- </notification>
- <notification name="StartRegionEmpty">
- La tua Regione di inizio non è stata definita.
-Per scegliere il luogo dove vuoi trovarti all&apos;accesso, digita il nome della regione nel campo del luogo di partenza oppure scegli La mia ultima Ubicazione o Casa mia.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="CouldNotStartStopScript">
- Non è stato possibile lanciare o fermare lo script perchè l&apos;oggetto che lo contiene non è stato trovato.
-L&apos;oggetto potrebbe essere troppo lontano oppure essere stato cancellato.
- </notification>
- <notification name="CannotDownloadFile">
- Non è stato possibile scaricare il file
- </notification>
- <notification name="CannotWriteFile">
- Non è stato possibile scrivere il file [[FILE]]
- </notification>
- <notification name="UnsupportedHardware">
- Ti informiamo che il tuo computer non dispone dei requisiti minimi di sistema per [APP_NAME]. Il funzionamento può pertanto risultare ridotto. Purtroppo la pagina [SUPPORT_SITE] non può fornire assistenza tecnica in caso di problemi dovuti a configurazioni di sistema non compatibili.
-
-Visitare [_URL] per ulteriori informazioni?
- <url name="url" option="0">
- http://secondlife.com/support/sysreqs.php?lang=it
- </url>
- <usetemplate ignoretext="L&apos;hardware di questo computer non è compatibile" name="okcancelignore" notext="No" yestext="Si"/>
- </notification>
- <notification name="UnknownGPU">
- Il tuo sistema utilizza una scheda grafica che [APP_NAME] non riconosce.
-Questo succede spesso con un nuovo hardware che non è stato ancora testato con [APP_NAME]. Probabilmente tutto andrà bene, ma devi riconfigurare le tue impostazioni grafiche.
-(Io &gt; Preferenze &gt; Grafica).
- <form name="form">
- <ignore name="ignore" text="La tua scheda grafica non è stata riconosciuta"/>
- </form>
- </notification>
- <notification name="DisplaySettingsNoShaders">
- L&apos;esecuzione di [APP_NAME] si è interrotta durante l&apos;inizializzazione dei driver grafici.
-La qualità grafica verrà impostata a livello basso per evitare alcuni errori comuni di driver. Alcune funzionalità grafiche saranno disattivate.
-Si consiglia di aggiornare i driver della scheda grafica.
-La qualità grafica può essere aumentata in Preferenze &gt; Grafica.
- </notification>
- <notification name="RegionNoTerraforming">
- La regione [REGION] non consente di terraformare.
- </notification>
- <notification name="CannotCopyWarning">
- Non hai l&apos;autorizzazione a copiare i seguenti oggetti:
-[ITEMS]
-e se li dai via, verranno eliminati dal tuo inventario. Sicuro di volere offrire questi oggetti?
- <usetemplate name="okcancelbuttons" notext="No" yestext="Si"/>
- </notification>
- <notification name="CannotGiveItem">
- Impossibile consegnare l&apos;elemento dell&apos;inventario.
- </notification>
- <notification name="TransactionCancelled">
- La transazione è stata annullata.
- </notification>
- <notification name="TooManyItems">
- Non è possibile dare più di 42 elementi in un singolo trasferimento di inventario.
- </notification>
- <notification name="NoItems">
- Non hai i permessi di trasferimento per gli elementi selezionati.
- </notification>
- <notification name="CannotCopyCountItems">
- Non hai i permessi di copia per copiare [COUNT]
-degli elementi selezionati. Perderai questi elementi dal tuo inventario.
-Vuoi veramente perdere questi elementi?
- <usetemplate name="okcancelbuttons" notext="No" yestext="Si"/>
- </notification>
- <notification name="CannotGiveCategory">
- Non hai i permessi per trasferire la cartella selezionata.
- </notification>
- <notification name="FreezeAvatar">
- Immobilizza questo avatar?
-Non potrà temporaneamente muoversi, chiacchierare in chat, o interagire con il mondo.
- <usetemplate canceltext="Annulla" name="yesnocancelbuttons" notext="Smobilizza" yestext="Immobilizza"/>
- </notification>
- <notification name="FreezeAvatarFullname">
- Immobilizza [AVATAR_NAME]?
-Non potrà temporaneamente muoversi, chiacchierare in chat, o interagire con il mondo.
- <usetemplate canceltext="Annulla" name="yesnocancelbuttons" notext="Smobilizza" yestext="Immobilizza"/>
- </notification>
- <notification name="EjectAvatarFullname">
- Espelli [AVATAR_NAME] dal tuo terreno?
- <usetemplate canceltext="Annulla" name="yesnocancelbuttons" notext="Espelli e blocca" yestext="Espelli"/>
- </notification>
- <notification name="EjectAvatarNoBan">
- Espelli questo avatar dal tuo terreno?
- <usetemplate name="okcancelbuttons" notext="Annulla" yestext="Espelli"/>
- </notification>
- <notification name="EjectAvatarFullnameNoBan">
- Espelli [AVATAR_NAME] dal tuo terreno?
- <usetemplate name="okcancelbuttons" notext="Annulla" yestext="Espelli"/>
- </notification>
- <notification name="EjectAvatarFromGroup">
- Hai espulso [AVATAR_NAME] dal gruppo [GROUP_NAME]
- </notification>
- <notification name="AcquireErrorTooManyObjects">
- ERRORE DI ACQUISIZIONE: hai selezionato troppi oggetti.
- </notification>
- <notification name="AcquireErrorObjectSpan">
- ERRORE DI ACQUISIZIONE: Gli oggetti sono a cavallo di più di una regione.
-Sposta tutti gli oggetti che vuoi acquisire su una sola regione.
- </notification>
- <notification name="PromptGoToCurrencyPage">
- [EXTRA]
-
-Vai su [_URL] per informazioni sull&apos;acquisto di L$?
- <url name="url">
- http://secondlife.com/app/currency/?lang=it-IT
- </url>
- <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
- </notification>
- <notification name="UnableToLinkObjects">
- Impossibile unire questi [COUNT] oggetti.
-Puoi unire al massimo [MAX] oggetti.
- </notification>
- <notification name="CannotLinkIncompleteSet">
- Puoi unire soltanto un insieme completo di oggetti, e devi selezionare più di un oggetto.
- </notification>
- <notification name="CannotLinkModify">
- Impossibile unire perchè non hai il diritto di modifica su tutti gli oggetti.
-
-Accertati che nessuno sia bloccato e che li possiedi tutti.
- </notification>
- <notification name="CannotLinkDifferentOwners">
- Impossibile unire perche non tutti gli oggetti hanno lo stesso proprietario.
-
-Accertati di possedere tutti gli oggetti selezionati.
- </notification>
- <notification name="NoFileExtension">
- Manca l&apos;estensione per il file: &apos;[FILE]&apos;
-
-Accertati che il file abbia una estensione corretta.
- </notification>
- <notification name="InvalidFileExtension">
- L&apos;estensione [EXTENSION] del file non è valida
-Attese [VALIDS]
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="CannotUploadSoundFile">
- Impossibile aprire in lettura il file di suono importato:
-[FILE]
- </notification>
- <notification name="SoundFileNotRIFF">
- Il file audio non sembra essere di tipo RIFF WAVE:
-[FILE]
- </notification>
- <notification name="SoundFileNotPCM">
- Il file audio non sembra essere di tipo PCM WAVE:
-[FILE]
- </notification>
- <notification name="SoundFileInvalidChannelCount">
- Il file ha un numero sbagliato di canali (deve essere mono oppure stereo):
-[FILE]
- </notification>
- <notification name="SoundFileInvalidSampleRate">
- Il file non sembra essere della frequenza di campionamento supportata (deve essere 44.1k):
-[FILE]
- </notification>
- <notification name="SoundFileInvalidWordSize">
- Il file non sembra avere una dimensione della parola supportata (deve essere a 8 o a 16 bit):
-[FILE]
- </notification>
- <notification name="SoundFileInvalidHeader">
- Impossibile trovare il frammento &apos;data&apos; nell&apos;intestazione WAV:
-[FILE]
- </notification>
- <notification name="SoundFileInvalidChunkSize">
- Dimensione chunk nel file WAV:
-[FILE]
- </notification>
- <notification name="SoundFileInvalidTooLong">
- Il file audio è troppo lungo (deve essere al massimo 10 secondi):
-[FILE]
- </notification>
- <notification name="ProblemWithFile">
- Problemi con il file [FILE]:
-
-[ERROR]
- </notification>
- <notification name="CannotOpenTemporarySoundFile">
- Impossibile aprire in scrittura il file temporaneamente compresso: [FILE]
- </notification>
- <notification name="UnknownVorbisEncodeFailure">
- Errore di codifica Vorbis sconosciuta per: [FILE]
- </notification>
- <notification name="CannotEncodeFile">
- Impossibile codificare il file: [FILE]
- </notification>
- <notification name="CorruptedProtectedDataStore">
- Impossibile inserire nome utente e password. Ciò può succedere alla modifica delle impostazioni di rete.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="CorruptResourceFile">
- File risorsa corrotto: [FILE]
- </notification>
- <notification name="UnknownResourceFileVersion">
- Versione di risorsa Linden sconosciuta nel file: [FILE]
- </notification>
- <notification name="UnableToCreateOutputFile">
- Impossibile creare il file in uscita: [FILE]
- </notification>
- <notification name="DoNotSupportBulkAnimationUpload">
- [APP_NAME] non supporta ancora il caricamento in blocco di file di animazione.
- </notification>
- <notification name="CannotUploadReason">
- Impossibile importare il file [FILE] a causa del seguente motivo: [REASON]
-Riprova più tardi.
- </notification>
- <notification name="LandmarkCreated">
- Hai aggiunto &quot;[LANDMARK_NAME]&quot; alla tua cartella [FOLDER_NAME].
- </notification>
- <notification name="LandmarkAlreadyExists">
- Hai già il punto di riferimento di questo luogo.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="CannotCreateLandmarkNotOwner">
- Non puoi creare qui un landmark perchè il proprietario di questo terreno non lo consente.
- </notification>
- <notification name="CannotRecompileSelectObjectsNoScripts">
- Impossibile fare la &apos;ricompilazione&apos;.
-Seleziona un oggetto con uno script.
- </notification>
- <notification name="CannotRecompileSelectObjectsNoPermission">
- Impossibile fare la &apos;ricompilazione&apos;.
-
-Seleziona oggetti con script su cui hai i permessi di modifica.
- </notification>
- <notification name="CannotResetSelectObjectsNoScripts">
- Impossibile fare &apos;ripristino&apos;.
-
-Seleziona oggetti con degli script.
- </notification>
- <notification name="CannotResetSelectObjectsNoPermission">
- Impossibile fare &apos;ripristino&apos;.
-
-Seleziona oggetti con script su cui hai i permessi di modifica.
- </notification>
- <notification name="CannotOpenScriptObjectNoMod">
- Impossibile aprire la script dell&apos;oggetto senza i diritti di modifica.
- </notification>
- <notification name="CannotSetRunningSelectObjectsNoScripts">
- Impossibile mettere &apos;in esecuzione&apos; gli script.
-
-Seleziona oggetti con script.
- </notification>
- <notification name="CannotSetRunningNotSelectObjectsNoScripts">
- Impossibile impostare script a &apos;non in esecuzione&apos;.
-
-Seleziona oggetti con script.
- </notification>
- <notification name="NoFrontmostFloater">
- Non c&apos;è nessuna finestra in evidenza (in primo piano) da salvare.
- </notification>
- <notification name="SeachFilteredOnShortWords">
- La tua ricerca è stata modificata.
-Le parole troppo corte sono state rimosse.
-
-Ho cercato: [FINALQUERY]
- </notification>
- <notification name="SeachFilteredOnShortWordsEmpty">
- Le parole che hai usato per la ricerca sono troppo corte e non è stato possibile iniziare la ricerca.
- </notification>
- <notification name="CouldNotTeleportReason">
- Teleport non riuscito.
-[REASON]
- </notification>
- <notification name="invalid_tport">
- C&apos;è stato un problema nell&apos;elaborare la tua richiesta di teleport. Potresti dover effettuare nuovamente l&apos;accesso prima di poter usare il teleport.
-Se si continua a visualizzare questo messaggio, consulta la pagina [SUPPORT_SITE].
- </notification>
- <notification name="invalid_region_handoff">
- Si è verificato un problema nel tentativo di attraversare regioni. È possibile che per potere attraversare le regioni, tu debba effettuare nuovamente l&apos;accesso.
-Se si continua a visualizzare questo messaggio, consulta la pagina [SUPPORT_SITE].
- </notification>
- <notification name="blocked_tport">
- Spiacenti, il teletrasporto è bloccato al momento. Prova di nuovo tra pochi istanti. Se ancora non potrai teletrasportarti, per favore scollegati e ricollegati per risolvere il problema.
- </notification>
- <notification name="nolandmark_tport">
- Spiacenti, ma il sistema non riesce a localizzare la destinazione del landmark
- </notification>
- <notification name="timeout_tport">
- Spiacenti, il sistema non riesce a completare il teletrasporto. Riprova tra un attimo.
- </notification>
- <notification name="noaccess_tport">
- Spiacenti, ma non hai accesso nel luogo di destinazione richiesto.
- </notification>
- <notification name="missing_attach_tport">
- Gli oggetti da te indossati non sono ancoa arrivati. Attendi ancora qualche secondo o scollegati e ricollegati prima di provare a teleportarti.
- </notification>
- <notification name="too_many_uploads_tport">
- Il server della regione è al momento occupato e la tua richiesta di teletrasporto non può essere soddisfatta entro breve tempo. Per favore prova di nuovo tra qualche minuto o spostati in un&apos;area meno affollata.
- </notification>
- <notification name="expired_tport">
- Spiacenti, il sistema non riesce a soddisfare la tua richiesta di teletrasporto entro un tempo ragionevole. Riprova tra qualche minuto.
- </notification>
- <notification name="expired_region_handoff">
- Spiacenti, il sistema non riesce a completare il cambio di regione entro un tempo ragionevole. Riprova tra qualche minuto.
- </notification>
- <notification name="no_host">
- Impossibile trovare la destinazione del teletrasporto; potrebbe essere temporaneamente non accessibile o non esistere più. Riprovaci tra qualche minuto.
- </notification>
- <notification name="no_inventory_host">
- L&apos;inventario è temporaneamente inaccessibile.
- </notification>
- <notification name="CannotSetLandOwnerNothingSelected">
- Impossibile impostare il proprietario del terreno:
-Nessun terreno selezionato.
- </notification>
- <notification name="CannotSetLandOwnerMultipleRegions">
- Impossibile forzare la proprietà del terreno perchè la selezione si estende su diverse regioni. Seleziona una area più piccola e riprova.
- </notification>
- <notification name="ForceOwnerAuctionWarning">
- Questo lotto è all&apos;asta. La designazione di un proprietario determinerà l&apos;annullamento automatico dell&apos;asta e probabilmente può scontentare qualche residente se l&apos;asta è già iniziata.
-Vuoi designare un proprietario?
- <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
- </notification>
- <notification name="CannotContentifyNothingSelected">
- Impossibile fare la contentificazione:
-Nessun terreno selezionato.
- </notification>
- <notification name="CannotContentifyNoRegion">
- Impossibile fare la contentificazione:
-Nessuna regione selezionata.
- </notification>
- <notification name="CannotReleaseLandNothingSelected">
- Impossibile abbandonare il terreno:
-Nessun terreno selezionato.
- </notification>
- <notification name="CannotReleaseLandNoRegion">
- Impossibile abbandonare il terreno:
-Non riesco a trovare la regione.
- </notification>
- <notification name="CannotBuyLandNothingSelected">
- Impossibile comprare il terreno:
-Nessun terreno selezionato.
- </notification>
- <notification name="CannotBuyLandNoRegion">
- Impossibile comprare il terreno:
-Non riesco a trovare la regione dove è situato il terreno.
- </notification>
- <notification name="CannotCloseFloaterBuyLand">
- Non puoi chiudere la finestra Acquista terreno finché [APP_NAME] non finisce di stimare il prezzo di questa transazione.
- </notification>
- <notification name="CannotDeedLandNothingSelected">
- Impossibile cedere il terreno:
-Nessun terreno selezionato.
- </notification>
- <notification name="CannotDeedLandNoGroup">
- Impossibile cedere il terreno:
-Nessun gruppo selezionato.
- </notification>
- <notification name="CannotDeedLandNoRegion">
- Non è possibile effettuare la cessione del terreno:
-Impossibile trovare la regione in cui si trova il terreno.
- </notification>
- <notification name="CannotDeedLandMultipleSelected">
- Impossibile cedere il terreno:
-Hai selezionato più di un terreno.
-
-Prova a selezionare un solo terreno.
- </notification>
- <notification name="CannotDeedLandWaitingForServer">
- Impossibile cedere il terreno:
-Sto aspettando il server per segnalare la proprietà.
-
-Riprova di nuovo.
- </notification>
- <notification name="CannotDeedLandNoTransfer">
- Impossibile cedere il terreno:
-La regione [REGION] non consente il trasferimento di terreni.
- </notification>
- <notification name="CannotReleaseLandWatingForServer">
- Impossibile abbandonare il terreno:
-Sto aspettando il server per aggiornare le informazioni del terreno.
-
-Riprova fra poco.
- </notification>
- <notification name="CannotReleaseLandSelected">
- Impossibile abbandonare il terreno:
-Non possiedi tutti i terreni selezionati.
-
-Seleziona un solo terreno.
- </notification>
- <notification name="CannotReleaseLandDontOwn">
- Impossibile abbandonare il terreno:
-Non hai i permessi per rilasciare questo terreno.
-I terreni di tua proprietà vengono visualizzati in verde.
- </notification>
- <notification name="CannotReleaseLandRegionNotFound">
- Non è possibile abbandonare il terreno:
-Impossibile trovare la regione in cui si trova il terreno.
- </notification>
- <notification name="CannotReleaseLandNoTransfer">
- Impossibile abbandonare il terreno:
-La regione [REGION] non consente il trasferimento di terreni.
- </notification>
- <notification name="CannotReleaseLandPartialSelection">
- Impossibile abbandonare il terreno:
-Devi selezionare un terreno intero per rilasciarla.
-
-Seleziona un terreno intero, oppure dividi prima il tuo terreno.
- </notification>
- <notification name="ReleaseLandWarning">
- Stai per rilasciare [AREA] m² di terreno.
-Rilasciare questo appezzamento di terreno lo toglierà dalle tue proprietà, ma non ti verranno dati L$.
-
-Rilasciare questo terreno?
- <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
- </notification>
- <notification name="CannotDivideLandNothingSelected">
- Impossibile dividere il terreno:
-
-Non sono stati selezionati terreni.
- </notification>
- <notification name="CannotDivideLandPartialSelection">
- Impossibile dividere il terreno:
-
-Hai selezionato unintero terreno.
-Prova a selezionare unappezzamento di terreno.
- </notification>
- <notification name="LandDivideWarning">
- La suddivisione di questo terreno lo dividerà in due parti ed ognuna potrà avere le sue impostazioni. Alcune impostazioni verranno reimpostate ai valori iniziali dopo l&apos;operazione.
-
-Dividi il terreno?
- <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
- </notification>
- <notification name="CannotDivideLandNoRegion">
- Non è possibile suddividere il terreno:
-Impossibile trovare la regione in cui si trova il terreno.
- </notification>
- <notification name="CannotJoinLandNoRegion">
- Non è possibile unire il terreno:
-Impossibile trovare la regione in cui si trova il terreno.
- </notification>
- <notification name="CannotJoinLandNothingSelected">
- Impossibile unire il terreno:
-Non hai selezionato terreno.
- </notification>
- <notification name="CannotJoinLandEntireParcelSelected">
- Impossibile unire il terreno:
-Hai selezionato un solo terreno.
-
-Devi selezionare il terreno comprendendo entrambi gli appezzamenti.
- </notification>
- <notification name="CannotJoinLandSelection">
- Impossibile unire il terreno:
-Devi selezionare più di un terreno.
-
-Devi selezionare il terreno comprendendo entrambi gli appezzamenti.
- </notification>
- <notification name="JoinLandWarning">
- Unire questi appezzamenti creerà un terreno più grande a partire da tutti gli appezzamenti che si intersecano nel rettangolo selezionato.
-Dovrai reimpostare il nome e le opzioni del nuovo terreno.
-
-Unisci il terreno?
- <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
- </notification>
- <notification name="ConfirmNotecardSave">
- Questa notecard deve essere salvata prima che l&apos;elemento possa essere copiato o visualizzato. Salva la notecard?
- <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
- </notification>
- <notification name="ConfirmItemCopy">
- Copia questo elemento nel tuo inventario?
- <usetemplate name="okcancelbuttons" notext="Annulla" yestext="Copia"/>
- </notification>
- <notification name="ResolutionSwitchFail">
- Non sono riuscito a cambiare la risoluzione al valore [RESX] x [RESY]
- </notification>
- <notification name="ErrorUndefinedGrasses">
- Errore: Erba sconosciuta: [SPECIES]
- </notification>
- <notification name="ErrorUndefinedTrees">
- Errore: Alberi sconosciuti: [SPECIES]
- </notification>
- <notification name="CannotSaveWearableOutOfSpace">
- Impossibile salvare &apos;[NAME]&apos; nel file di oggetti indossabili. Dovrai liberare dello spazio sul tuo computer e salvare di nuovo.
- </notification>
- <notification name="CannotSaveToAssetStore">
- Non è possibile salvare [NAME] nel database centrale degli asset.
-In genere si tratta di un problema temporaneo. Attendi alcuni minuti per modificare e salvare nuovamente gli elementi indossabili.
- </notification>
- <notification name="YouHaveBeenLoggedOut">
- Sei stato scollegato da [SECOND_LIFE].
- [MESSAGE]
- <usetemplate name="okcancelbuttons" notext="Esci" yestext="Vedi IM &amp; Chat"/>
- </notification>
- <notification name="OnlyOfficerCanBuyLand">
- Impossibile comprare terreno per il gruppo:
-Non hai i permessi per comprare il terreno per il tuo gruppo attivo.
- </notification>
- <notification label="Aggiungi Amico" name="AddFriendWithMessage">
- Gli amici possono autorizzarsi a vedersi l&apos;un l&apos;altro sulla mappa e sapere quando sono collegati.
-
-Offri l&apos;amicizia a [NAME]?
- <form name="form">
- <input name="message">
- Vorresti essere mio amico?
- </input>
- <button name="Offer" text="OK"/>
- <button name="Cancel" text="Annulla"/>
- </form>
- </notification>
- <notification label="Salva vestiario" name="SaveOutfitAs">
- Salva gli abiti che indosso come nuovo vestiario:
- <form name="form">
- <input name="message">
- [DESC] (nuovo)
- </input>
- <button name="OK" text="OK"/>
- <button name="Cancel" text="Annulla"/>
- </form>
- </notification>
- <notification label="Salva capo da indossare" name="SaveWearableAs">
- Salva oggetto nel mio inventario come:
- <form name="form">
- <input name="message">
- [DESC] (nuovo)
- </input>
- <button name="OK" text="OK"/>
- <button name="Cancel" text="Annulla"/>
- </form>
- </notification>
- <notification label="Cambia nome del vestiario" name="RenameOutfit">
- Nuovo nome per il vestiario:
- <form name="form">
- <input name="new_name">
- [NAME]
- </input>
- <button name="OK" text="OK"/>
- <button name="Cancel" text="Annulla"/>
- </form>
- </notification>
- <notification name="RemoveFromFriends">
- Vuoi rimuovere [NAME] dalla lista dei tuoi amici?
- <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
- </notification>
- <notification name="RemoveMultipleFromFriends">
- Vuoi rimuovere gli amici selezionati dalla lista dei tuoi amici?
- <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
- </notification>
- <notification name="GodDeleteAllScriptedPublicObjectsByUser">
- Confermi di volere cancellare tutti gli oggetti scriptati della proprietà di
-** [AVATAR_NAME] **
-su tutti gli altri terreni di questa sim?
- <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
- </notification>
- <notification name="GodDeleteAllScriptedObjectsByUser">
- Confermi la CANCELLAZIONE di TUTTI gli oggetti scriptati posseduti da
-** [AVATAR_NAME] **
-su TUTTI I TERRENI di questa sim?
- <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
- </notification>
- <notification name="GodDeleteAllObjectsByUser">
- Confermi la CANCELLAZIONE di TUTTI gli oggetti (scriptati o no) posseduti da
-** [AVATAR_NAME] **
-su TUTTI I TERRENI di questa sim?
- <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
- </notification>
- <notification name="BlankClassifiedName">
- Devi specificare un nome per il tuo annuncio.
- </notification>
- <notification name="MinClassifiedPrice">
- Il prezzo da pagare per essere messo in lista deve essere almeno [MIN_PRICE]L$.
-
-Introduci un prezzo più alto.
- </notification>
- <notification name="ConfirmItemDeleteHasLinks">
- Almeno uno degli oggetti selezionati è collegato tramite link ad altri oggetti. Se elimini l&apos;oggetto, i relativi link non funzioneranno più. Pertanto si consiglia vivamente di eliminare prima i link.
-
-Sei sicuro di volere eliminare gli oggetti?
- <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
- </notification>
- <notification name="ConfirmObjectDeleteLock">
- Almeno uno degli elementi selezionati è bloccato.
-
-Confermi di voler cancellare questi elementi?
- <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
- </notification>
- <notification name="ConfirmObjectDeleteNoCopy">
- Almeno uno degli elementi selezionati non è copiabile.
-
-Confermi di voler cancellare questi elementi?
- <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
- </notification>
- <notification name="ConfirmObjectDeleteNoOwn">
- Non possiedi neanche uno degli oggetti selezionati.
-
-Confermi di voler cancellare questi elementi?
- <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
- </notification>
- <notification name="ConfirmObjectDeleteLockNoCopy">
- Almeno un oggetto è bloccato.
-Almeno un oggetto è non copiabile.
-
-Confermi di voler cancellare questi elementi?
- <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
- </notification>
- <notification name="ConfirmObjectDeleteLockNoOwn">
- Almeno un oggetto è bloccato.
-Non possiedi neanche un oggetto.
-
-Confermi di voler cancellare questi elementi?
- <usetemplate name="okcancelbuttons" notext="Cancella" yestext="OK"/>
- </notification>
- <notification name="ConfirmObjectDeleteNoCopyNoOwn">
- Almeno un oggetto non è copiabile.
-Non possiedi neanche un oggetto.
-
-Confermi di voler cancellare questi elementi?
- <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
- </notification>
- <notification name="ConfirmObjectDeleteLockNoCopyNoOwn">
- Almeno un oggetto è bloccato.
-Almeno un oggetto è non copiabile.
-Non possiedi neanche un oggetto.
-
-Confermi di voler cancellare questi elementi?
- <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
- </notification>
- <notification name="ConfirmObjectTakeLock">
- Almeno un oggetto è bloccato.
-
-Confermi di voler prendere questi elementi?
- <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
- </notification>
- <notification name="ConfirmObjectTakeNoOwn">
- Non possiedi tutti gli oggetti che stai prendendo.
-Se continui, verranno applicate i permessi per il prossimo proprietario e di conseguenza potrebbero venire ristrette le tue possibilità di modificarli o di copiarli.
-
-Confermi di voler prendere questi elementi?
- <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
- </notification>
- <notification name="ConfirmObjectTakeLockNoOwn">
- Almeno un oggetto è bloccato.
-Non possiedi tutti gli oggetti che stai prendendo.
-Se continui, verranno applicate i permessi per il prossimo proprietario e di conseguenza potrebbero venire ristrette le tue possibilità di modificarli o di copiarli.
-Puoi comunque prendere gli oggetti selezionati.
-
-Confermi di voler prendere questi elementi?
- <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
- </notification>
- <notification name="CantBuyLandAcrossMultipleRegions">
- Impossibile comprare il terreno perchè la selezione comprende più regioni.
-
-Seleziona un&apos;area più piccola e riprova.
- </notification>
- <notification name="DeedLandToGroup">
- Cedendo questo terreno al gruppo sara richiesto ai componenti di avere e di mantenere il terreno con un credito sufficiente.
-Il prezzo di acquisto del terreno non è rifondibile al proprietario.
-Se una terreno ceduto al gruppo viene venduto, il prezzo di vendita verrà diviso in parti uguali fra i membri del gruppo.
-
-Cedi questo terreno di [AREA] m² al gruppo &apos;[GROUP_NAME]&apos;?
- <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
- </notification>
- <notification name="DeedLandToGroupWithContribution">
- Completando la cessione del lotto, il gruppo dovrà avere e mantenere crediti sufficienti per l&apos;uso del terreno.
-La cessione includerà un contributo contemporaneo di terreno al gruppo da &apos;[NAME]&apos;.
-Il prezzo di acquisto del terreno non viene rimborsato al proprietario. Se un lotto ceduto viene venduto, il prezzo di vendita viene distribuito in maniera paritetica tra i membri del gruppo.
-
-Cedere questi [AREA] m² di terreno al gruppo &apos;[GROUP_NAME]&apos;?
- <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
- </notification>
- <notification name="DisplaySetToSafe">
- Le impostazioni dello schermo sono state impostate a valori di sicurezza perchè hai specificato l&apos;opzione -safe.
- </notification>
- <notification name="DisplaySetToRecommended">
- Le impostazioni dello schermo sono state impostate a valori ottimali basati sulla tua configurazione di sistema.
- </notification>
- <notification name="ErrorMessage">
- [ERROR_MESSAGE]
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="AvatarMovedDesired">
- L&apos;ubicazione prescelta non è attualmente disponibile.
-Sei stato trasferito in una regione vicina.
- </notification>
- <notification name="AvatarMovedLast">
- La tua ultima posizione non è al momento disponibile.
-Sei stato trasferito in una regione vicina.
- </notification>
- <notification name="AvatarMovedHome">
- L&apos;ubicazione di casa tua non è al momento disponibile.
-Sei stato trasferito in una regione vicina.
-Ti consigliamo di impostare una nuova posizione iniziale.
- </notification>
- <notification name="ClothingLoading">
- Gli abiti sono in corso di scaricamento.
-Puoi comunque usare [SECOND_LIFE] normalmente e gli altri residenti ti vedranno correttamente.
- <form name="form">
- <ignore name="ignore" text="Lo scaricamento sta richiedendo parecchio tempo"/>
- </form>
- </notification>
- <notification name="FirstRun">
- L&apos;installazione di [APP_NAME] è terminata.
-
-Se questa è la prima volta che usi [SECOND_LIFE], devi creare un account prima che tu possa effettuare l&apos;accesso.
-Vuoi tornare a [http://join.secondlife.com secondlife.com] per creare un nuovo account?
- <usetemplate name="okcancelbuttons" notext="Continua" yestext="Nuovo Account..."/>
- </notification>
- <notification name="LoginPacketNeverReceived">
- Ci sono problemi di connessione. È possibile che ci siano problemi con la tua connessione Internet oppure sulla [SECOND_LIFE_GRID].
-
-Controlla la tua connessione Internet e riprova fra qualche minuto, oppure clicca su Aiuto per visualizzare la pagina [SUPPORT_SITE], oppure clicca su Teleport per tentare il teleport a casa tua.
- <url name="url">
- http://it.secondlife.com/support/
- </url>
- <form name="form">
- <button name="OK" text="OK"/>
- <button name="Help" text="Aiuto"/>
- <button name="Teleport" text="Teleportati"/>
- </form>
- </notification>
- <notification name="WelcomeChooseSex">
- Il tuo avatar apparirà fra un attimo.
-
-Usa le frecce per muoverti.
-Premi F1 in qualunque momento per la guida o per apprendere altre cose di [SECOND_LIFE].
-Scegli un avatar maschile o femminile. Puoi sempre cambiare idea più tardi.
- <usetemplate name="okcancelbuttons" notext="Femminile" yestext="Maschile"/>
- </notification>
- <notification name="CantTeleportToGrid">
- Impossibile effettuare il teleport su [SLURL], in quanto si trova su una griglia ([GRID]) diversa da quella attuale ([CURRENT_GRID]). Chiudi il viewer e prova nuovamente.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="GeneralCertificateError">
- Impossibile collegarsi al server.
-[REASON]
-
-Nome oggetto: [SUBJECT_NAME_STRING]
-Nome emittente: [ISSUER_NAME_STRING]
-Valido da: [VALID_FROM]
-Valido fino a: [VALID_TO]
-Impronta MD5: [SHA1_DIGEST]
-Impronta SHA1: [MD5_DIGEST]
-Uso chiave: [KEYUSAGE]
-Uso chiave estesa: [EXTENDEDKEYUSAGE]
-Identificatore chiave oggetto: [SUBJECTKEYIDENTIFIER]
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="TrustCertificateError">
- Autorità di certificazione di questo server sconosciuta.
-
-Informazioni sul certificato:
-Nome oggetto: [SUBJECT_NAME_STRING]
-Nome emittente: [ISSUER_NAME_STRING]
-Valido da: [VALID_FROM]
-Valido fino a: [VALID_TO]
-Impronta MD5: [SHA1_DIGEST]
-Impronta SHA1: [MD5_DIGEST]
-Uso chiave: [KEYUSAGE]
-Uso chiave estesa: [EXTENDEDKEYUSAGE]
-Identificatore chiave oggetto: [SUBJECTKEYIDENTIFIER]
-
-Accettare questa autorità?
- <usetemplate name="okcancelbuttons" notext="Annulla" yestext="Accetta"/>
- </notification>
- <notification name="NotEnoughCurrency">
- [NAME] [PRICE]L$ Non hai abbastanza L$ per farlo.
- </notification>
- <notification name="GrantedModifyRights">
- [NAME] ti ha dato il permesso di modificare i suoi oggetti.
- </notification>
- <notification name="RevokedModifyRights">
- Non sei più autorizzato a modificare gli oggetti di [NAME]
- </notification>
- <notification name="FlushMapVisibilityCaches">
- Questo reinizializzerà la cache della mappa di questa regione.
-Funzione usata solo per il debug.
-(Per la produzione, attendere 5 minuti, dopo di che tutte le mappe di ognuno si aggiorneranno dopo la loro riconnessione)
- <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
- </notification>
- <notification name="BuyOneObjectOnly">
- Non è possibile acquistare più di un oggetto alla volta. Riprova selezionando un solo oggetto.
- </notification>
- <notification name="OnlyCopyContentsOfSingleItem">
- Impossibile copiare il contenuto di più di un elemento alla volta.
-Scegli solo un oggetto e riprova.
- <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
- </notification>
- <notification name="KickUsersFromRegion">
- Teleporta a casa tutti i residenti in questa regione?
- <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
- </notification>
- <notification name="EstateObjectReturn">
- Confermi di voler restituire gli oggetti di proprietà di [USER_NAME] ?
- <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
- </notification>
- <notification name="InvalidTerrainBitDepth">
- Impossibile impostare le texture della regione:
-La texture del terreno [TEXTURE_NUM] ha una profondità di bit pari a [TEXTURE_BIT_DEPTH] non corretta.
-
-Sostituisci la texture [TEXTURE_NUM] con una a 24-bit 512x512 o una immagine più piccola e quindi clicca nuovamente su &apos;Applica&apos;.
- </notification>
- <notification name="InvalidTerrainSize">
- Impossibile impostare le texture di regione:
-La texture del terreno [TEXTURE_NUM] è troppo grande se a [TEXTURE_SIZE_X]x[TEXTURE_SIZE_Y].
-
-Sostituisci la texture [TEXTURE_NUM] con una a 24-bit 512x512 oppure con una immagine più piccola e quindi clicca di nuovo &apos;Applica&apos;.
- </notification>
- <notification name="RawUploadStarted">
- Importazione iniziata. Può impiegare fino a due minuti, a seconda della velocità della tua connessione.
- </notification>
- <notification name="ConfirmBakeTerrain">
- Vuoi veramente impostare come base il terreno corrente, impostarlo come riferimento per i limiti dei rialzi/abbassamenti di tutto il territorio ed il suo valore impostato come base per lo strumento &apos;Ripristina&apos;?
- <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
- </notification>
- <notification name="MaxAllowedAgentOnRegion">
- Puoi avere al massimo [MAX_AGENTS] residenti consentiti.
- </notification>
- <notification name="MaxBannedAgentsOnRegion">
- Puoi avere al massimo [MAX_BANNED] residenti bloccati.
- </notification>
- <notification name="MaxAgentOnRegionBatch">
- E&apos; fallito il tentativo di aggiungere [NUM_ADDED] avatar:
-Eccede il [MAX_AGENTS] [LIST_TYPE] limite di [NUM_EXCESS].
- </notification>
- <notification name="MaxAllowedGroupsOnRegion">
- Puoi avere al massimo [MAX_GROUPS] gruppi.
- <usetemplate name="okcancelbuttons" notext="Annulla" yestext="Imposta come predefinito"/>
- </notification>
- <notification name="MaxManagersOnRegion">
- Puoi avere al massimo [MAX_MANAGER] manager della proprietà immobiliare.
- </notification>
- <notification name="OwnerCanNotBeDenied">
- Impossibile aggiungere i proprietari della proprietà immobiliare alla lista dei residenti bloccati.
- </notification>
- <notification name="CanNotChangeAppearanceUntilLoaded">
- Impossibile cambiare l&apos;aspetto fisico finchè gli abiti e i vestiti non sono caricati.
- </notification>
- <notification name="ClassifiedMustBeAlphanumeric">
- Il nome del tuo annuncio deve iniziare con una lettera da A a Z oppure con un numero.
-Non sono consentiti caratteri di punteggiatura.
- </notification>
- <notification name="CantSetBuyObject">
- Impossibile impostare &apos;Compra l&apos;oggetto&apos;, perchè l&apos;oggetto non è in vendita.
-Imposta l&apos;oggetto per la vendita e riprova.
- </notification>
- <notification name="FinishedRawDownload">
- Hai terminato di scaricare il file del terreno nella cartella:
-[DOWNLOAD_PATH].
- </notification>
- <notification name="DownloadWindowsMandatory">
- È disponibile una nuova versione di [APP_NAME].
-[MESSAGE]
-Devi scaricare questo aggiornamento per utilizzare [APP_NAME].
- <usetemplate name="okcancelbuttons" notext="Esci" yestext="Scarica l&apos;aggiornamento"/>
- </notification>
- <notification name="DownloadWindows">
- È disponibile una versione aggiornata di [APP_NAME].
-[MESSAGE]
-Questo aggiornamento non è necessario, ma ti consigliamo di installarlo per migliorare il rendimento e la stabilità.
- <usetemplate name="okcancelbuttons" notext="Continua" yestext="Scarica l&apos;aggiornamento"/>
- </notification>
- <notification name="DownloadWindowsReleaseForDownload">
- È disponibile una versione aggiornata di [APP_NAME].
-[MESSAGE]
-Questo aggiornamento non è necessario, ma ti consigliamo di installarlo per migliorare il rendimento e la stabilità.
- <usetemplate name="okcancelbuttons" notext="Continua" yestext="Scarica l&apos;aggiornamento"/>
- </notification>
- <notification name="DownloadLinuxMandatory">
- È disponibile una nuova versione di [APP_NAME].
-[MESSAGE]
-Devi scaricare questo aggiornamento per utilizzare [APP_NAME].
- <usetemplate name="okcancelbuttons" notext="Esci" yestext="Scarica"/>
- </notification>
- <notification name="DownloadLinux">
- È disponibile una versione aggiornata di [APP_NAME].
-[MESSAGE]
-Questo aggiornamento non è necessario, ma ti consigliamo di installarlo per migliorare il rendimento e la stabilità.
- <usetemplate name="okcancelbuttons" notext="Continua" yestext="Scarica"/>
- </notification>
- <notification name="DownloadLinuxReleaseForDownload">
- È disponibile una versione aggiornata di [APP_NAME].
-[MESSAGE]
-Questo aggiornamento non è necessario, ma ti consigliamo di installarlo per migliorare il rendimento e la stabilità.
- <usetemplate name="okcancelbuttons" notext="Continua" yestext="Scarica"/>
- </notification>
- <notification name="DownloadMacMandatory">
- È disponibile una nuova versione di [APP_NAME].
-[MESSAGE]
-Devi scaricare questo aggiornamento per utilizzare [APP_NAME].
-
-Scaricare nella cartella Applicazioni?
- <usetemplate name="okcancelbuttons" notext="Esci" yestext="Scarica l&apos;aggiornamento"/>
- </notification>
- <notification name="DownloadMac">
- È disponibile una versione aggiornata di [APP_NAME].
-[MESSAGE]
-Questo aggiornamento non è necessario, ma ti consigliamo di installarlo per migliorare il rendimento e la stabilità.
-
-Scaricare nella cartella Applicazioni?
- <usetemplate name="okcancelbuttons" notext="Continua" yestext="Scarica l&apos;aggiornamento"/>
- </notification>
- <notification name="DownloadMacReleaseForDownload">
- È disponibile una versione aggiornata di [APP_NAME].
-[MESSAGE]
-Questo aggiornamento non è necessario, ma ti consigliamo di installarlo per migliorare il rendimento e la stabilità.
-
-Scaricare nella cartella Applicazioni?
- <usetemplate name="okcancelbuttons" notext="Continua" yestext="Scarica l&apos;aggiornamento"/>
- </notification>
- <notification name="FailedUpdateInstall">
- Si è verificato un errore durante l&apos;aggiornamento del viewer.
-Scarica e installa la versione più recente del viewer da
-http://secondlife.com/download.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="FailedRequiredUpdateInstall">
- Non è stato possibile installare un aggiornamento richiesto.
-Non potrai accedere fino a quando non verrà aggiornato [APP_NAME].
-
-Scarica e installa la versione più recente del viewer da
-http://secondlife.com/download.
- <usetemplate name="okbutton" yestext="Esci"/>
- </notification>
- <notification name="UpdaterServiceNotRunning">
- È disponibile un aggiornamento obbligatorio per l&apos;installazione di Second Life.
-
-Puoi scaricare questo aggiornamento da http://www.secondlife.com/downloads
-oppure puoi installarlo adesso.
- <usetemplate name="okcancelbuttons" notext="Esci da Second Life" yestext="Scarica e aggiorna adesso"/>
- </notification>
- <notification name="DownloadBackgroundTip">
- È stato scaricato un aggiornamento dell&apos;installazione di [APP_NAME].
-Versione [VERSION] [[RELEASE_NOTES_FULL_URL] Informazioni su questo aggiornamento]
- <usetemplate name="okcancelbuttons" notext="Più tardi..." yestext="Installa ora e riavvia [APP_NAME]"/>
- </notification>
- <notification name="DownloadBackgroundDialog">
- È stato scaricato un aggiornamento dell&apos;installazione di [APP_NAME].
-Versione [VERSION] [[RELEASE_NOTES_FULL_URL] Informazioni su questo aggiornamento]
- <usetemplate name="okcancelbuttons" notext="Più tardi..." yestext="Installa ora e riavvia [APP_NAME]"/>
- </notification>
- <notification name="RequiredUpdateDownloadedVerboseDialog">
- È stato scaricato un aggiornamento obbligatorio del software.
-Versione [VERSION]
-
-Per installare l&apos;aggiornamento è necessario riavviare [APP_NAME].
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="RequiredUpdateDownloadedDialog">
- Per installare l&apos;aggiornamento è necessario riavviare [APP_NAME].
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="DeedObjectToGroup">
- La cessione di questo oggetto farà in modo che il gruppo:
-* Riceva i L$ pagati all&apos;oggetto
- <usetemplate ignoretext="Conferma la cessione di un oggetto al gruppo" name="okcancelignore" notext="Annulla" yestext="Cedi"/>
- </notification>
- <notification name="WebLaunchExternalTarget">
- Vuoi aprire il browser per vedere questi contenuti?
- <usetemplate ignoretext="Lancia il browser per consultare una pagina web" name="okcancelignore" notext="Annulla" yestext="OK"/>
- </notification>
- <notification name="WebLaunchJoinNow">
- Vuoi andare su [http://secondlife.com/account/ Dashboard] per gestire il tuo account?
- <usetemplate ignoretext="Lancia il browser per gestire il mio account" name="okcancelignore" notext="Annulla" yestext="OK"/>
- </notification>
- <notification name="WebLaunchSecurityIssues">
- Visita la Wiki di [SECOND_LIFE] per i dettagli su come segnalare un problema di sicurezza.
- <usetemplate ignoretext="Lancia il browser per imparare a segnalare un problema di sicurezza" name="okcancelignore" notext="Annulla" yestext="OK"/>
- </notification>
- <notification name="WebLaunchQAWiki">
- Visita il controllo di qualità Wiki [SECOND_LIFE].
- <usetemplate ignoretext="Lancia il browser per vedere la pagina Wiki sul controllo di qualità" name="okcancelignore" notext="Annulla" yestext="OK"/>
- </notification>
- <notification name="WebLaunchPublicIssue">
- Visita il registro pubblico dei problemi di [SECOND_LIFE], dove puoi segnalare bug ed altri problemi.
- <usetemplate ignoretext="Lancia il browser per vedere il registro pubblico di monitoraggio dei problemi" name="okcancelignore" notext="Annulla" yestext="Vai alla pagina"/>
- </notification>
- <notification name="WebLaunchSupportWiki">
- Vai al blog ufficiale Linden, per le ultime notizie ed informazioni.
- <usetemplate ignoretext="Lancia il browser per vedere il blog" name="okcancelignore" notext="Annulla" yestext="OK"/>
- </notification>
- <notification name="WebLaunchLSLGuide">
- Vuoi aprire la Guida per lo scripting per avere aiuto con lo scripting?
- <usetemplate ignoretext="Lancia il browser per vedere la Guida per lo scripting" name="okcancelignore" notext="Annulla" yestext="OK"/>
- </notification>
- <notification name="WebLaunchLSLWiki">
- Vuoi visitare il Portale LSL per avere aiuto con lo scripting?
- <usetemplate ignoretext="Lancia il browser per vedere il Portale LSL" name="okcancelignore" notext="Annulla" yestext="Vai alla pagina"/>
- </notification>
- <notification name="ReturnToOwner">
- Confermi di voler restituire gli oggetti selezionati ai loro proprietari? Gli oggetti trasferibili ceduti al gruppo, verranno restituiti ai proprietari precedenti.
-
-*ATTENZIONE* Gli oggetti ceduti non trasferibili verranno cancellati!
- <usetemplate ignoretext="Conferma prima di restituire gli oggetti ai relativi proprietari" name="okcancelignore" notext="Annulla" yestext="OK"/>
- </notification>
- <notification name="GroupLeaveConfirmMember">
- Sei attualmente un membro del gruppo [GROUP].
-Vuoi lasciare il gruppo?
- <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
- </notification>
- <notification name="ConfirmKick">
- Vuoi veramente espellere tutti i residenti dalla griglia?
- <usetemplate name="okcancelbuttons" notext="Annulla" yestext="Espelli tutti i residenti"/>
- </notification>
- <notification name="MuteLinden">
- Spiacenti, non puoi bloccare un Linden.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="CannotStartAuctionAlreadyForSale">
- Non è possibile mettere in vendita all&apos;asta un terreno che è già impostato per la vendita. Disabilita la vendita del terreno, se sei certo di voler avviare una vendita all&apos;asta.
- </notification>
- <notification label="Il blocco dell&apos;oggetto in base al nome non è riuscito," name="MuteByNameFailed">
- hai già bloccato questo nome.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="RemoveItemWarn">
- Sebbene consentita, la cancellazione di contenuti può danneggiare l&apos;oggetto.
-Vuoi cancellare quell&apos;elemento?
- <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
- </notification>
- <notification name="CantOfferCallingCard">
- Impossibile offrire un biglietto da visita in questo momento. Riprova fra poco.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="CantOfferFriendship">
- Impossibile offrire l&apos;amicizia in questo momento. Riprova fra poco.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="BusyModeSet">
- È stata impostata la modalità Non disponibile.
-La chat e gli IM verranno nascosti. Gli IM riceveranno la tua risposta di Non disponibile. Tutte le offerte di teleport verranno rifiutate. Tutte le offerte di Inventario andranno nel Cestino.
- <usetemplate ignoretext="Cambio il mio stato sulla modalità Non disponibile" name="okignore" yestext="OK"/>
- </notification>
- <notification name="JoinedTooManyGroupsMember">
- Hai raggiunto il numero massimo di gruppi. Per favore abbandona almeno un gruppo prima di aderire a questo, oppure declina l&apos;offerta.
-[NAME] ti invita ad aderire ad un gruppo.
- <usetemplate name="okcancelbuttons" notext="Declino" yestext="Unisciti"/>
- </notification>
- <notification name="JoinedTooManyGroups">
- Hai raggiunto il numero massimo di gruppi. Per favore abbandona almeno un gruppo prima di aderire o crearne uno nuovo.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="KickUser">
- Espelli questo residente con quale messaggio?
- <form name="form">
- <input name="message">
- Un amministratore ti ha disconnesso.
- </input>
- <button name="OK" text="OK"/>
- <button name="Cancel" text="Annulla"/>
- </form>
- </notification>
- <notification name="KickAllUsers">
- Espelli tutti quelli che sono sulla griglia con quale messaggio?
- <form name="form">
- <input name="message">
- Un amministratore ti ha disconnesso.
- </input>
- <button name="OK" text="OK"/>
- <button name="Cancel" text="Annulla"/>
- </form>
- </notification>
- <notification name="FreezeUser">
- Congela questo residente con quale messaggio?
- <form name="form">
- <input name="message">
- Sei stato immobilizzato. Non puoi muoverti o usare la chat. Un amministratore ti contatterà con un messaggio (IM).
- </input>
- <button name="OK" text="OK"/>
- <button name="Cancel" text="Annulla"/>
- </form>
- </notification>
- <notification name="UnFreezeUser">
- Scongela questo residente con quale messaggio?
- <form name="form">
- <input name="message">
- Non sei più immobilizzato.
- </input>
- <button name="OK" text="OK"/>
- <button name="Cancel" text="Annulla"/>
- </form>
- </notification>
- <notification name="SetDisplayNameSuccess">
- Ciao [DISPLAY_NAME]!
-
-Come nel modo reale, prima che tutti conoscano il tuo nuovo nome ci vorrà del tempo. Saranno necessari alcuni giorni per [http://wiki.secondlife.com/wiki/Setting_your_display_name l&apos;aggiornamento del nome] in oggetti, script, ricerca, ecc.
- </notification>
- <notification name="SetDisplayNameBlocked">
- Non puoi cambiare il tuo nome visualizzato. Se ritieni che si tratta di un errore, contatta l&apos;assistenza.
- </notification>
- <notification name="SetDisplayNameFailedLength">
- Il nome è troppo lungo. La lunghezza massima dei nomi visualizzati è di [LENGTH] caratteri.
-
-Riprova con un nome più corto.
- </notification>
- <notification name="SetDisplayNameFailedGeneric">
- Non è possibile impostare il tuo nome visualizzato. Riprova più tardi.
- </notification>
- <notification name="SetDisplayNameMismatch">
- I nomi visualizzati inseriti non corrispondono. Inseriscili nuovamente.
- </notification>
- <notification name="AgentDisplayNameUpdateThresholdExceeded">
- Devi aspettare prima di cambiare il nome visualizzato.
-
-Vedi http://wiki.secondlife.com/wiki/Setting_your_display_name
-
-Riprova più tardi.
- </notification>
- <notification name="AgentDisplayNameSetBlocked">
- Non è possibile impostare il nome richiesto perché contiene una parola vietata.
-
- Riprova con un altro nome.
- </notification>
- <notification name="AgentDisplayNameSetInvalidUnicode">
- Il nome visualizzato scelto contiene caratteri non validi.
- </notification>
- <notification name="AgentDisplayNameSetOnlyPunctuation">
- Il nome visualizzato deve contenere lettere, non solo segni di punteggiatura.
- </notification>
- <notification name="DisplayNameUpdate">
- [OLD_NAME] ([SLID]) ha il nuovo nome [NEW_NAME].
- </notification>
- <notification name="OfferTeleport">
- Offri un teleport nel posto dove sei con il seguente messaggio?
- <form name="form">
- <input name="message">
- Raggiungimi a [REGION]
- </input>
- <button name="OK" text="OK"/>
- <button name="Cancel" text="Annulla"/>
- </form>
- </notification>
- <notification name="OfferTeleportFromGod">
- Chiedere, in qualità di Admin, al residente di raggiungerti?
- <form name="form">
- <input name="message">
- Raggiungimi in [REGION]
- </input>
- <button name="OK" text="OK"/>
- <button name="Cancel" text="Annulla"/>
- </form>
- </notification>
- <notification name="TeleportFromLandmark">
- Sei sicuro di volere il teleport a &lt;nolink&gt;[LOCATION]&lt;/nolink&gt;?
- <usetemplate ignoretext="Conferma il teleport verso un punto di riferimento" name="okcancelignore" notext="Annulla" yestext="Teleportati"/>
- </notification>
- <notification name="TeleportToPick">
- Teleport a [PICK]?
- <usetemplate ignoretext="Conferma che voglio il teleport verso l&apos;ubicazione nei Luoghi preferiti" name="okcancelignore" notext="Annulla" yestext="Teleport"/>
- </notification>
- <notification name="TeleportToClassified">
- Teleport a [CLASSIFIED]?
- <usetemplate ignoretext="Conferma il teleport verso questa posizione negli annunci" name="okcancelignore" notext="Annulla" yestext="Teleport"/>
- </notification>
- <notification name="TeleportToHistoryEntry">
- Teleport a [HISTORY_ENTRY]?
- <usetemplate ignoretext="Conferma il teleport verso un luogo che compare nella cronologia" name="okcancelignore" notext="Annulla" yestext="Teleport"/>
- </notification>
- <notification label="Manda un messaggio a tutti nella tua proprietà" name="MessageEstate">
- Scrivi un annuncio breve che verrà mandato a tutti quelli che sono in questo momento nella tua proprietà.
- <form name="form">
- <input name="message"/>
- <button name="OK" text="OK"/>
- <button name="Cancel" text="Annulla"/>
- </form>
- </notification>
- <notification label="Cambia la tipologia della proprietà Linden" name="ChangeLindenEstate">
- Stai per apportare modifiche ad una proprietà che appartiene a Linden (continente, teen grid, orientamento e così via).
-
-Questa è un&apos;operazione da effettuare con molta cautela, in quanto può incidere profondamente sulla vita dei residenti in Second Life. Sul continente, l&apos;azione modificherà migliaia di regioni e creerà un grosso carico sul server.
-
-Vuoi procedere?
- <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
- </notification>
- <notification label="Cambia la tipologia Linden di accesso alla proprietà" name="ChangeLindenAccess">
- Stai per cambiare la lista di accesso per una proprietà Linden (mainland, griglia minorenni, orientamento, ecc.).
-
-Questo è PERICOLOSO e dovrebbe essere fatto soltanto per poter lanciare il programma che consente agli oggetti/L$ di essere trasferiti fra griglie diverse.
-Cambierà migliaia di regioni e produrrà seri problemi ai vari server.
- <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
- </notification>
- <notification label="Seleziona la proprietà" name="EstateAllowedAgentAdd">
- Aggiungi alla lista di accesso solo per questa proprietà oppure per [ALL_ESTATES]?
- <usetemplate canceltext="Annulla" name="yesnocancelbuttons" notext="Tutte le proprietà" yestext="Questa proprietà"/>
- </notification>
- <notification label="Seleziona la proprietà" name="EstateAllowedAgentRemove">
- Rimuovi dalla lista di accesso solo per questa proprietà oppure per [ALL_ESTATES]?
- <usetemplate canceltext="Annulla" name="yesnocancelbuttons" notext="Tutte le proprietà" yestext="Questa proprietà"/>
- </notification>
- <notification label="Seleziona la proprietà" name="EstateAllowedGroupAdd">
- Aggiungi al gruppo di accesso solo per questa proprietà oppure per [ALL_ESTATES]?
- <usetemplate canceltext="Annulla" name="yesnocancelbuttons" notext="Tutte le proprietà" yestext="Questa proprietà"/>
- </notification>
- <notification label="Seleziona la proprietà" name="EstateAllowedGroupRemove">
- Rimuovi dal gruppo di accesso solo per questa proprietà oppure per [ALL_ESTATES]?
- <usetemplate canceltext="Annulla" name="yesnocancelbuttons" notext="Tutte le proprietà" yestext="Questa proprietà"/>
- </notification>
- <notification label="Seleziona la proprietà" name="EstateBannedAgentAdd">
- Rifiuta l&apos;accesso solo a questa proprietà oppure per [ALL_ESTATES]?
- <usetemplate canceltext="Annulla" name="yesnocancelbuttons" notext="Tutte le proprietà" yestext="Questa proprietà"/>
- </notification>
- <notification label="Seleziona la proprietà" name="EstateBannedAgentRemove">
- Rimuovi questo residente dalla lista dei residenti bloccati nell&apos;accesso solo a questa proprietà oppure per [ALL_ESTATES]?
- <usetemplate canceltext="Annulla" name="yesnocancelbuttons" notext="Tutte le proprietà" yestext="Questa proprietà"/>
- </notification>
- <notification label="Seleziona la proprietà" name="EstateManagerAdd">
- Aggiungi come gestore della proprietà solo a questa proprietà oppure per [ALL_ESTATES]?
- <usetemplate canceltext="Annulla" name="yesnocancelbuttons" notext="Tutte le proprietà" yestext="Questa proprietà"/>
- </notification>
- <notification label="Seleziona la proprietà" name="EstateManagerRemove">
- Rimuovi come gestore della proprietà solo per questa proprietà oppure per [ALL_ESTATES]?
- <usetemplate canceltext="Annulla" name="yesnocancelbuttons" notext="Tutte le proprietà" yestext="Questa proprietà"/>
- </notification>
- <notification label="Conferma espulsione" name="EstateKickUser">
- Espelli [EVIL_USER] da questa proprietà?
- <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
- </notification>
- <notification name="EstateChangeCovenant">
- Confermi di voler cambiare il Regolamento della proprietà?
- <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
- </notification>
- <notification name="RegionEntryAccessBlocked">
- Non sei ammesso in questa regione a causa della tua categoria di accesso. Questo può risultare da una mancanza di informazioni necessarie per convalidare la tua età.
-
-Verifica di avere installato l&apos;ultima versione del programma e vai alla Knowledge Base per ulteriori informazioni su come accedere nelle zone con tale categoria di accesso.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="RegionEntryAccessBlocked_KB">
- Non sei ammesso in questa regione a causa della tua categoria d&apos;accesso.
-
-Vuoi andare alla Knowledge Base per ulteriori informazioni sulle categorie di accesso?
- <url name="url">
- http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/it
- </url>
- <usetemplate ignoretext="Non posso entrare in questa regione a causa delle restrizioni della categoria di accesso" name="okcancelignore" notext="Chiudi" yestext="Vai alla Knowledge Base"/>
- </notification>
- <notification name="RegionEntryAccessBlocked_Notify">
- Non sei ammesso in questa regione a causa della tua categoria d&apos;accesso.
- </notification>
- <notification name="RegionEntryAccessBlocked_Change">
- Non ti è consentito entrare in quella regione a causa della categoria di accesso impostata nelle preferenze.
-
-Per entrare nella regione, dovrai modificare la tua categoria di accesso. Ciò ti consentirà inoltre di effettuare ricerche di contenuti di categoria [REGIONMATURITY]. Per annullare le modifiche in un secondo momento, vai a Io &gt; Preferenze &gt; Generali.
- <form name="form">
- <button name="OK" text="Cambia preferenza"/>
- <button default="true" name="Cancel" text="Chiudi"/>
- <ignore name="ignore" text="La categoria di accesso impostata mi impedisce di entrare in una regione"/>
- </form>
- </notification>
- <notification name="PreferredMaturityChanged">
- La tua categoria di accesso attuale è [RATING].
- </notification>
- <notification name="LandClaimAccessBlocked">
- Non puoi prendere possesso di questo terreno a causa della tua categoria di accesso. Questo può essere dovuto ad una mancanza di informazioni valide che confermino la tua età.
-
-Verifica di avere installato l&apos;ultima versione del programma e vai alla Knowledge Base per informazioni sull&apos;accesso ad aree con queste categorie di accesso.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="LandClaimAccessBlocked_KB">
- Non puoi prendere possesso di questa terra a causa delle preferenze sulle categorie di accesso.
-
-Vuoi andare alla Knowledge Base per maggiori informazioni sulle categorie di accesso?
- <url name="url">
- http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/it
- </url>
- <usetemplate ignoretext="Non posso richiedere questo terreno a causa delle restrizioni della categoria di accesso" name="okcancelignore" notext="Chiudi" yestext="Vai alla Knowledge Base"/>
- </notification>
- <notification name="LandClaimAccessBlocked_Notify">
- Non puoi prendere possesso di questa terra a causa della tua categoria di accesso.
- </notification>
- <notification name="LandClaimAccessBlocked_Change">
- Non puoi richiedere questo terreno a causa della tua categoria di accesso.
-
-Puoi cliccare su Cambia preferenze per modificare la categoria di accesso e quindi riuscire ad entrare. Da adesso potrai accedere ai contenuti [REGIONMATURITY] ed effettuare ricerche in questa categoria. Se in seguito tu volessi cambiare di nuovo le tue impostazioni, apri la finestra di dialogo da Io &gt; Preferenze &gt; Generale.
- <usetemplate ignoretext="Le mie preferenze di categoria di accesso mi impediscono di richiedere terreno" name="okcancelignore" notext="Chiudi" yestext="Cambia le preferenze"/>
- </notification>
- <notification name="LandBuyAccessBlocked">
- Non puoi acquistare questo terreno a causa della tua categoria di accesso. Questo può essere dovuto ad una mancanza di informazioni valide che confermino la tua età.
-
-Verifica di avere installato l&apos;ultima versione del programma e vai alla Knowledge Base per informazioni sull&apos;accesso ad aree con queste categorie di accesso.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="LandBuyAccessBlocked_KB">
- Non puoi acquistare questo terreno a causa della tua categoria di accesso.
-
-Vuoi andare alla Knowledge Base per maggiori informazioni sulle categorie di accesso?
- <url name="url">
- http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/it
- </url>
- <usetemplate ignoretext="Non posso acquistare questo terreno a causa delle restrizioni della categoria di accesso" name="okcancelignore" notext="Chiudi" yestext="Vai alla Knowledge Base"/>
- </notification>
- <notification name="LandBuyAccessBlocked_Notify">
- Non puoi acquistare questa land a causa della tua categoria di accesso.
- </notification>
- <notification name="LandBuyAccessBlocked_Change">
- Non puoi acquistare questo terreno a causa della tua categoria di accesso.
-
-Puoi cliccare su Cambia preferenze per modificare la categoria di accesso e quindi riuscire ad entrare. Da adesso potrai accedere ai contenuti [REGIONMATURITY] ed effettuare ricerche in questa categoria. Se in seguito tu volessi cambiare di nuovo le tue impostazioni, apri la finestra di dialogo da Io &gt; Preferenze &gt; Generale.
- <usetemplate ignoretext="Le mie Preferenze di accesso mi impediscono di acquistare terreno" name="okcancelignore" notext="Chiudi" yestext="Cambia le preferenze"/>
- </notification>
- <notification name="TooManyPrimsSelected">
- Hai selezionato troppi prim. Seleziona non più di [MAX_PRIM_COUNT] prim e riprova
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="ProblemImportingEstateCovenant">
- Problemi nell&apos;importazione del regolamento della proprietà.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="ProblemAddingEstateManager">
- Si sono riscontrati problemi nell&apos;aggiungere un nuovo manager della proprietà. Una o più proprietà potrebbero avere la lista dei manager piena.
- </notification>
- <notification name="ProblemAddingEstateGeneric">
- Si sono riscontrati problemi nell&apos;aggiunta a questo elenco della proprietà. Una o più proprietà potrebbe avere una lista piena.
- </notification>
- <notification name="UnableToLoadNotecardAsset">
- Impossibile caricare la risorsa della notecard in questo momento.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="NotAllowedToViewNotecard">
- Permessi insufficienti per vedere la notecard associata con l&apos;asset ID richiesto.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="MissingNotecardAssetID">
- L&apos;asset ID della notecard è mancante dal database.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="PublishClassified">
- Ricorda: le tariffe per gli annunci non sono rimborsabili.
-
-Pubblica questo annuncio adesso per [AMOUNT]L$?
- <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
- </notification>
- <notification name="SetClassifiedMature">
- Queste inserzioni includono contenuti di tipo Moderato?
- <usetemplate canceltext="Annulla" name="yesnocancelbuttons" notext="No" yestext="Si"/>
- </notification>
- <notification name="SetGroupMature">
- Questo gruppo include contenuti di tipo Moderato?
- <usetemplate canceltext="Annulla" name="yesnocancelbuttons" notext="No" yestext="Si"/>
- </notification>
- <notification label="Conferma il riavvio" name="ConfirmRestart">
- Vuoi veramente far ripartire la regione in 2 minuti?
- <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
- </notification>
- <notification label="Manda un messaggio a tutti in questa regione" name="MessageRegion">
- Scrivi un breve annuncio che verrà mandato a tutti in questa regione.
- <form name="form">
- <input name="message"/>
- <button name="OK" text="OK"/>
- <button name="Cancel" text="Annulla"/>
- </form>
- </notification>
- <notification label="Cambiato il contenuto Moderato" name="RegionMaturityChange">
- La classificazione di questa regione è stata aggiornata.
-Un periodo di tempo è necessario prima che la modifica venga integrata nella mappa.
-
-Per accedere a regioni per adulti, i residenti devono avere un Account verificato, mediante verifica dell&apos;età oppure mediante verifica della modalità di pagamento.
- </notification>
- <notification label="Versione voice non compatibile" name="VoiceVersionMismatch">
- Questa versione di [APP_NAME] non è compatibile con la funzionalità di chat vocale in questa regione. Affinché la chat vocale funzioni correttamente, dovrai aggiornare [APP_NAME].
- </notification>
- <notification label="Impossibile comprare oggetti" name="BuyObjectOneOwner">
- Impossibile comprare oggetti da proprietari diversi nello stesso momento.
-Seleziona solo un oggetto e riprova.
- </notification>
- <notification label="Impossibile comprare il contenuto" name="BuyContentsOneOnly">
- Impossibile comprare il contenuto di più di un oggetto per volta.
-Seleziona solo un oggetto e riprova.
- </notification>
- <notification label="Impossibile comprare il contenuto" name="BuyContentsOneOwner">
- Impossibile comprare oggetti da proprietari differenti nello stesso momento.
-Scegli un solo oggetto e riprova.
- </notification>
- <notification name="BuyOriginal">
- Compra l&apos;oggetto originale da [OWNER] per [PRICE]L$?
-Diventerai proprietario di questo oggetto.
-Sarai in grado di:
- Modificare: [MODIFYPERM]
- Copiare: [COPYPERM]
- Rivendere o regalare: [RESELLPERM]
- <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
- </notification>
- <notification name="BuyOriginalNoOwner">
- Compra l&apos;oggetto originale per [PRICE]L$?
-Diventerai proprietario di questo oggetto.
-Sarai in grado di:
- Modificare: [MODIFYPERM]
- Copiare: [COPYPERM]
- Rivendere o regalare: [RESELLPERM]
- <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
- </notification>
- <notification name="BuyCopy">
- Compra una copia da [OWNER] per [PRICE]L$?
-L&apos;oggetto verrà copiato nel tuo inventario.
-Sarai in grado di:
- Modificare: [MODIFYPERM]
- Copiare: [COPYPERM]
- Rivendere o regalare: [RESELLPERM]
- <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
- </notification>
- <notification name="BuyCopyNoOwner">
- Compra una copia per [PRICE]L$?
-L&apos;oggetto verrà copiato nel tuo inventario.
-Sarai in grado di:
- Modificare: [MODIFYPERM]
- Copiare: [COPYPERM]
- Rivendere o regalare: [RESELLPERM]
- <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
- </notification>
- <notification name="BuyContents">
- Compra il contenuto da [OWNER] per [PRICE]L$?
-Il contenuto verrà copiato nel tuo inventario.
- <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
- </notification>
- <notification name="BuyContentsNoOwner">
- Compra il contenuto per [PRICE]L$?
-Il contenuto verrà copiato nel tuo inventario.
- <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
- </notification>
- <notification name="ConfirmPurchase">
- Questa transazione ti permetterà di:
-[ACTION]
-
-Confermi di voler procedere all&apos;acquisto?
- <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
- </notification>
- <notification name="ConfirmPurchasePassword">
- Questa transazione farà:
-[ACTION]
-
-Confermi di voler procedere all&apos;acquisto?
-Ridigita la tua password e premi OK.
- <form name="form">
- <input name="message"/>
- <button name="ConfirmPurchase" text="OK"/>
- <button name="Cancel" text="Annulla"/>
- </form>
- </notification>
- <notification name="SetPickLocation">
- Nota:
-Hai aggiornato l&apos;ubicazione di questo preferito ma gli altri dettagli conserveranno il loro valore originale.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="MoveInventoryFromObject">
- Hai selezionato elementi dall&apos;inventario &apos;non copiabili&apos;.
-Questi elementi verranno trasferiti nel tuo inventario, ma non copiati.
-
-Trasferisci gli elementi nell&apos;inventario?
- <usetemplate ignoretext="Avvertimi quando tento di rimuovore elementi per i quali non è consentita la copia da un oggetto" name="okcancelignore" notext="Annulla" yestext="OK"/>
- </notification>
- <notification name="MoveInventoryFromScriptedObject">
- Hai selezionato elementi dell&apos;inventario non copiabili. Questi elementi verranno trasferiti nel tuo inventario, non verranno copiati.
-Dato che questo oggetto è scriptato, il trasferimento di questi elementi nel tuo inventario potrebbe causare un malfunzionamento degli script.
-
-Trasferisci gli elementi nell&apos;inventario?
- <usetemplate ignoretext="Avvertimi se tento di rimuovore di elementi per i quali non è consentita la copia e che potrebbero danneggiare un oggetto scriptato" name="okcancelignore" notext="Annulla" yestext="OK"/>
- </notification>
- <notification name="ClickActionNotPayable">
- Attenzione: l&apos;azione Paga oggetto è stata impostata, ma funzionerà soltanto se inserisci uno script con un evento money().
- <form name="form">
- <ignore name="ignore" text="Ho impostato l&apos;azione Paga oggetto costruendo un oggetto senza uno script money()"/>
- </form>
- </notification>
- <notification name="OpenObjectCannotCopy">
- Non ci sono elementi in questo oggetto che tu possa copiare.
- </notification>
- <notification name="WebLaunchAccountHistory">
- Vai al [http://secondlife.com/account/ Dashboard] per vedere la cronologia del tuo account?
- <usetemplate ignoretext="Lancia il browser per vedere la cronologia del mio account" name="okcancelignore" notext="Annulla" yestext="Vai alla pagina"/>
- </notification>
- <notification name="ConfirmQuit">
- Confermi di voler uscire?
- <usetemplate ignoretext="Conferma prima di uscire" name="okcancelignore" notext="Non uscire" yestext="Esci"/>
- </notification>
- <notification name="DeleteItems">
- [QUESTION]
- <usetemplate ignoretext="Conferma prima di cancellare gli elementi" name="okcancelignore" notext="Annulla" yestext="OK"/>
- </notification>
- <notification name="HelpReportAbuseEmailLL">
- Usa questo strumento per segnalare violazioni a [http://secondlife.com/corporate/tos.php Terms of Service] e [http://secondlife.com/corporate/cs.php Community Standards].
-
-Ogni abuso segnalato verrà esaminato e risolto.
- </notification>
- <notification name="HelpReportAbuseSelectCategory">
- Scegli una categoria per questa segnalazione di abuso.
-Scegliere una categoria, ci aiuta a gestire ed elaborare le segnalazioni di abuso.
- </notification>
- <notification name="HelpReportAbuseAbuserNameEmpty">
- Introduci il nome di chi abusa.
-Introducendo un valore accurato, ci aiuti a gestire ed elaborare le segnalazioni di abuso.
- </notification>
- <notification name="HelpReportAbuseAbuserLocationEmpty">
- Inserisci il luogo dove l&apos;abuso è avvenuto.
-Introducendo un valore accurato, ci aiuti a gestire ed elaborare le segnalazioni di abuso.
- </notification>
- <notification name="HelpReportAbuseSummaryEmpty">
- Inserisci un yiyolo descrittivo dell&apos;abuso che è avvenuto.
-Introducendo un titolo descrittivo accurato, ci aiuti a gestire ed elaborare le segnalazioni di abuso.
- </notification>
- <notification name="HelpReportAbuseDetailsEmpty">
- Inserisci una descrizione dettagliata dell&apos;abuso che è avvenuto.
-Devi essere il più specifico possibile, includendo i nomi e i dettagli dell&apos;incidente che stai segnalando.
-Inserendo una descrizione accurata ci aiuti a gestire ed elaborare le segnalazioni di abuso.
- </notification>
- <notification name="HelpReportAbuseContainsCopyright">
- Gentile residente,
-
-Ci risulta che tu stia segnalando una violazione di proprietà intellettuale. Per segnalare correttamente la violazione:
-
-(1) Definizione di abuso. Puoi inviare una segnalazione di abuso se ritieni che un residente stia sfruttando il sistema di permessi di [SECOND_LIFE], per esempio usando CopyBot o simili strumenti di copia, per rubare i diritti di proprietà intellettuale. L&apos;Ufficio abusi investigherà e deciderà adeguate azioni disciplinari per comportamenti che violano i [http://secondlife.com/corporate/tos.php Termini del servizio] di [SECOND_LIFE] oppure gli [http://secondlife.com/corporate/cs.php Standard della comunità]. Tieni comunque presente che l&apos;Ufficio abusi non gestisce e non risponde alle richieste di rimozione di contenuti da [SECOND_LIFE].
-
-(2) DMCA o rimozione di contenuti. Per richiedere la rimozione di contenuti da [SECOND_LIFE], devi compilare una denuncia valida di violazione come definito nelle nostra [http://secondlife.com/corporate/dmca.php Regole DMCA] (leggi sul copyright).
-
-Per continuare con il procedimento di abuso, chiudi questa finestra e completa la compilazione della segnalazione. È possibile che dovrai specificare la categoria CopyBot o Sfruttamento dei diritti.
-
-Grazie,
-
-Linden Lab
- </notification>
- <notification name="FailedRequirementsCheck">
- I seguenti componenti obbligatori sono mancanti da [FLOATER]:
-[COMPONENTS]
- </notification>
- <notification label="Sostituisci gli oggetti indossati" name="ReplaceAttachment">
- C&apos;è già un oggetto indossato in questo punto del corpo.
-Vuoi sostituirlo con l&apos;oggetto selezionato?
- <form name="form">
- <ignore name="ignore" save_option="true" text="Sostituisci un pezzo collegato con l&apos;elemento selezionato"/>
- <button ignore="Replace Automatically" name="Yes" text="OK"/>
- <button ignore="Never Replace" name="No" text="Annulla"/>
- </form>
- </notification>
- <notification label="Avviso di &apos;Occupato&apos;" name="BusyModePay">
- Sei in modalità &apos;Occupato&apos;, ciò significa che non riceverai ciò che attendi per questo pagamento.
-
-Desideri abbandonare la modalità &apos;Occupato&apos; prima di completare questa transazione?
- <form name="form">
- <ignore name="ignore" save_option="true" text="Sto per pagare una persona o un oggetto mentro sono in modalià Non disponibile"/>
- <button ignore="Always leave Busy Mode" name="Yes" text="OK"/>
- <button ignore="Never leave Busy Mode" name="No" text="Abbandona"/>
- </form>
- </notification>
- <notification name="ConfirmDeleteProtectedCategory">
- La cartella &apos;[FOLDERNAME]&apos; è una cartella di sistema. L&apos;eliminazione di cartelle di sistema può creare instabilità. Sei sicuro di volerla eliminare?
- <usetemplate ignoretext="Chiedi conferma prima di eliminare una cartella di sistema" name="okcancelignore" notext="Annulla" yestext="OK"/>
- </notification>
- <notification name="ConfirmEmptyTrash">
- Vuoi veramente eliminare in modo permanente il contenuto del tuo Cestino?
- <usetemplate ignoretext="Conferma prima di svuotare la cartella del Cestino inventario" name="okcancelignore" notext="Annulla" yestext="OK"/>
- </notification>
- <notification name="ConfirmClearBrowserCache">
- Vuoi veramente eliminare la cronologia viaggi, web e ricerche fatte?
- <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
- </notification>
- <notification name="ConfirmClearCookies">
- Confermi di volere cancellare i tuoi cookie?
- <usetemplate name="okcancelbuttons" notext="Annulla" yestext="Si"/>
- </notification>
- <notification name="ConfirmClearMediaUrlList">
- Confermi di voler cancellare la lista degli URL salvati?
- <usetemplate name="okcancelbuttons" notext="Annulla" yestext="Si"/>
- </notification>
- <notification name="ConfirmEmptyLostAndFound">
- Vuoi veramente eliminare in modo definitivo il contenuto dei tuoi Oggetti smarriti?
- <usetemplate ignoretext="Conferma prima di svuotare della cartella Oggetti smarriti" name="okcancelignore" notext="No" yestext="Si"/>
- </notification>
- <notification name="CopySLURL">
- Lo SLurl seguente è stato copiato negli Appunti:
- [SLURL]
-
-Inseriscilo in una pagina web per dare ad altri un accesso facile a questa ubicazione, o provala incollandola nella barra degli indirizzi di un browser web.
- <form name="form">
- <ignore name="ignore" text="Lo SLurl è stato copiato negli Appunti"/>
- </form>
- </notification>
- <notification name="WLSavePresetAlert">
- Vuoi sovrascrivere le preimpostazioni salvate?
- <usetemplate name="okcancelbuttons" notext="No" yestext="Si"/>
- </notification>
- <notification name="WLDeletePresetAlert">
- Vuoi cancellare [SKY]?
- <usetemplate name="okcancelbuttons" notext="No" yestext="Si"/>
- </notification>
- <notification name="WLNoEditDefault">
- Non puoi modificare o cancellare una preimpostazione di fabbrica.
- </notification>
- <notification name="WLMissingSky">
- Questo file di ciclo giornaliero fa riferimento ad un file di cielo mancante: [SKY].
- </notification>
- <notification name="PPSaveEffectAlert">
- Effetto di post elaborazione già presente. Vuoi sovrascrivere?
- <usetemplate name="okcancelbuttons" notext="No" yestext="Si"/>
- </notification>
- <notification name="NewSkyPreset">
- Fornisci il nome per il nuovo cielo.
- <form name="form">
- <input name="message">
- Nuova preimpostazione
- </input>
- <button name="OK" text="OK"/>
- <button name="Cancel" text="Annulla"/>
- </form>
- </notification>
- <notification name="ExistsSkyPresetAlert">
- La preimpostazione esiste già!
- </notification>
- <notification name="NewWaterPreset">
- Fornisci il nome per la nuova preregolazione del livello dell&apos;acqua.
- <form name="form">
- <input name="message">
- Nuova preimpostazione
- </input>
- <button name="OK" text="OK"/>
- <button name="Cancel" text="Annulla"/>
- </form>
- </notification>
- <notification name="ExistsWaterPresetAlert">
- La preimpostazione esiste già!
- </notification>
- <notification name="WaterNoEditDefault">
- Non puoi modificare o cancellare una preimpostazione.
- </notification>
- <notification name="ChatterBoxSessionStartError">
- Impossibile iniziare una nuova sessione di chat con [RECIPIENT].
-[REASON]
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="ChatterBoxSessionEventError">
- [EVENT]
-[REASON]
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="ForceCloseChatterBoxSession">
- La sessione chat con [NAME] deve chiudere.
-[REASON]
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="Cannot_Purchase_an_Attachment">
- Non puoi comprare un oggetto mentre è unito.
- </notification>
- <notification label="Informazioni sulle richieste per il permesso di addebito" name="DebitPermissionDetails">
- Accettare questa richiesta da allo script il permesso continuativo di prendere Linden dollar (L$) dal tuo account. Per revocare questo permesso, il proprietario dell&apos;oggetto deve cancellare l&apos;oggetto oppure reimpostare gli script nell&apos;oggetto.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="AutoWearNewClothing">
- Vuoi indossare automaticamente gli indumenti che stai per creare?
- <usetemplate ignoretext="Indossare gli abiti che creo mentre modifico il mio aspetto" name="okcancelignore" notext="No" yestext="Si"/>
- </notification>
- <notification name="NotAgeVerified">
- Per entrare in questa zona, devi avere eseguito la verifica dell&apos;età. Vuoi andare sul sito di [SECOND_LIFE] per verificare la tua età?
-
-[_URL]
- <url name="url" option="0">
- https://secondlife.com/account/verification.php?lang=it
- </url>
- <usetemplate ignoretext="Non ho verificato la mia età" name="okcancelignore" notext="No" yestext="Si"/>
- </notification>
- <notification name="Cannot enter parcel: no payment info on file">
- Per poter visitare questa zona devi avere devi aver fornito informazioni di pagamento a Linden Lab. Vuoi andare sul sito di [SECOND_LIFE] ed impostarle?
-
-[_URL]
- <url name="url" option="0">
- https://secondlife.com/account/index.php?lang=it
- </url>
- <usetemplate ignoretext="Manca la registrazione delle informazioni di pagamento" name="okcancelignore" notext="No" yestext="Si"/>
- </notification>
- <notification name="MissingString">
- La stringa [STRING_NAME] non è presente in strings.xml
- </notification>
- <notification name="SystemMessageTip">
- [MESSAGE]
- </notification>
- <notification name="IMSystemMessageTip">
- [MESSAGE]
- </notification>
- <notification name="Cancelled">
- Annullato
- </notification>
- <notification name="CancelledSit">
- Seduta annullata
- </notification>
- <notification name="CancelledAttach">
- Attaccamento annullato
- </notification>
- <notification name="ReplacedMissingWearable">
- Gli abiti/parti del corpo mancanti sono stati sostituiti con quelli di default .
- </notification>
- <notification name="GroupNotice">
- Oggetto: [SUBJECT], Messaggio: [MESSAGE]
- </notification>
- <notification name="FriendOnline">
- [NAME] è Online
- </notification>
- <notification name="FriendOffline">
- [NAME] è Offline
- </notification>
- <notification name="AddSelfFriend">
- Anche se sei molto simpatico, non puoi aggiungere te stesso all&apos;elenco degli amici.
- </notification>
- <notification name="UploadingAuctionSnapshot">
- Sto importando le fotografie per l&apos;uso inworld e per il web...
-(Durata circa 5 minuti.)
- </notification>
- <notification name="UploadPayment">
- Hai pagato [AMOUNT]L$ per il caricamento.
- </notification>
- <notification name="UploadWebSnapshotDone">
- Il caricamento della fotografia nel sito web è andato a buon fine.
- </notification>
- <notification name="UploadSnapshotDone">
- Il caricamento della fotografia inworld è andato a buon fine.
- </notification>
- <notification name="TerrainDownloaded">
- Terrain.raw caricato
- </notification>
- <notification name="GestureMissing">
- Manca la gesture [NAME] dal database.
- </notification>
- <notification name="UnableToLoadGesture">
- Impossibile caricare la gesture [NAME].
- </notification>
- <notification name="LandmarkMissing">
- Landmark non trovato nel database.
- </notification>
- <notification name="UnableToLoadLandmark">
- Impossibile caricare il Landmark di riferimento. Riprova.
- </notification>
- <notification name="CapsKeyOn">
- Hai il blocco delle maiuscole attivato.
-Questo potrebbe incidere sulla tua password.
- </notification>
- <notification name="NotecardMissing">
- Notecard non trovata nel database.
- </notification>
- <notification name="NotecardNoPermissions">
- Non hai il permesso di vedere questo biglietto.
- </notification>
- <notification name="RezItemNoPermissions">
- Permessi insufficienti per creare un oggetto.
- </notification>
- <notification name="UnableToLoadNotecard">
- Impossibile caricare la notecard in questo momento.
- </notification>
- <notification name="ScriptMissing">
- Script non trovato nel database.
- </notification>
- <notification name="ScriptNoPermissions">
- Permessi insufficenti per visualizzare lo script.
- </notification>
- <notification name="UnableToLoadScript">
- Impossibile caricare lo script. Riprova.
- </notification>
- <notification name="IncompleteInventory">
- Il contenuto che stai offrendo per il momento non è localmente disponibile. Prova a rioffrire gli oggetti fra un minuto.
- </notification>
- <notification name="CannotModifyProtectedCategories">
- Non è possibile modificare le categorie protette.
- </notification>
- <notification name="CannotRemoveProtectedCategories">
- Non è possibile rimuovere le categorie protette.
- </notification>
- <notification name="UnableToBuyWhileDownloading">
- Impossibile acquistare l&apos;oggetto durante il download dei dati.
-Riprova.
- </notification>
- <notification name="UnableToLinkWhileDownloading">
- Impossibile collegare l&apos;oggetto durante il download dei dati.
-Riprova.
- </notification>
- <notification name="CannotBuyObjectsFromDifferentOwners">
- Puoi acquistare oggetti soltanto da un proprietario per volta.
-Seleziona solo un oggetto.
- </notification>
- <notification name="ObjectNotForSale">
- Questo oggetto non è in vendita.
- </notification>
- <notification name="EnteringGodMode">
- Entra in modalità divina, livello [LEVEL]
- </notification>
- <notification name="LeavingGodMode">
- Esci dalla modalità divina, livello [LEVEL]
- </notification>
- <notification name="CopyFailed">
- Non hai l&apos;autorizzazione a copiare.
- </notification>
- <notification name="InventoryAccepted">
- [NAME] ha ricevuto la tua offerta di inventario.
- </notification>
- <notification name="InventoryDeclined">
- [NAME] non ha accettato la tua offerta dall&apos;inventario.
- </notification>
- <notification name="ObjectMessage">
- [NAME]: [MESSAGE]
- </notification>
- <notification name="CallingCardAccepted">
- Il tuo biglietto da visita è stato accettato.
- </notification>
- <notification name="CallingCardDeclined">
- Il tuo biglietto da visita non è stato accettato.
- </notification>
- <notification name="TeleportToLandmark">
- Puoi teleportarti alle ubicazioni come &apos;[NAME]&apos; aprendo il pannello Luoghi sul lato destro dello schermo, quindi selezionare la scheda Punti di riferimento.
-Clicca su un punto di riferimento per selezionarlo, quindi clicca su Teleport sul lato inferiore del pannello.
-(Puoi anche fare doppio clic sul punto di riferimento oppure cliccare su di esso con il tasto destro del mouse e scegliere Teleport.)
- </notification>
- <notification name="TeleportToPerson">
- Puoi contattare il residente &apos;[NAME]&apos; aprendo il pannello Persone nel lato destro del tuo schermo.
-Seleziona il residente dall&apos;elenco, clicca su &apos;IM&apos; in basso nel pannello.
-(Puoi anche fare doppio clic sul nome nell&apos;elenco oppure fare clic con il pulsante destro del mouse e selezionare &apos;IM&apos;).
- </notification>
- <notification name="CantSelectLandFromMultipleRegions">
- Non è possibile selezionare il terreno attraverso i confini del server.
-Prova a selezionare una parte di terreno più piccola.
- </notification>
- <notification name="SearchWordBanned">
- Alcuni termini della ricerca sono stati esclusi a causa delle restrizioni di contenuto come esposto negli Standard della comunità.
- </notification>
- <notification name="NoContentToSearch">
- Seleziona almeno un tipo di contenuto per la ricerca (Generale, Moderato o Adulti).
- </notification>
- <notification name="SystemMessage">
- [MESSAGE]
- </notification>
- <notification name="PaymentReceived">
- [MESSAGE]
- </notification>
- <notification name="PaymentSent">
- [MESSAGE]
- </notification>
- <notification name="EventNotification">
- Notifica eventi:
-
-[NAME]
-[DATE]
- <form name="form">
- <button name="Details" text="Dettagli"/>
- <button name="Cancel" text="Cancella"/>
- </form>
- </notification>
- <notification name="TransferObjectsHighlighted">
- Tutti gli oggetti presenti sul terreno, che saranno trasferiti al compratore di questa terra, saranno ora evidenziati.
-
-* Gli alberi e l&apos;erba che cederai non saranno evidenziati.
- <form name="form">
- <button name="Done" text="Fatto"/>
- </form>
- </notification>
- <notification name="DeactivatedGesturesTrigger">
- Usa lo stesso tasto per disattivare la gesture:
-[NAMES]
- </notification>
- <notification name="NoQuickTime">
- Il software QuickTime di Apple sembra non essere installato sul tuo computer.
-Se vuoi vedere contenuto multimediale in streaming sui lotti che lo supportano, vai alla pagina [http://www.apple.com/quicktime QuickTime] e installa il Player QuickTime.
- </notification>
- <notification name="NoPlugin">
- Non è stato trovato alcun plugin multimediale per gestire il tipo mime [MIME_TYPE]. Il media di questo tipo non è disponibile.
- </notification>
- <notification name="MediaPluginFailed">
- Questo plugin multimediale non funziona:
- [PLUGIN]
-
-Reinstalla il plugin o contatta il venditore se continui ad avere questi problemi.
- <form name="form">
- <ignore name="ignore" text="Mancato funzionamento del plugin multimediale"/>
- </form>
- </notification>
- <notification name="OwnedObjectsReturned">
- Gli oggetti che possiedi sul terreno selezionato ti sono stati restituiti nell&apos;inventario.
- </notification>
- <notification name="OtherObjectsReturned">
- Sono stati restituiti all&apos;inventario di &apos;[NAME]&apos; gli oggetti sul lotto di terreno selezionato di sua proprietà.
- </notification>
- <notification name="OtherObjectsReturned2">
- Sono stati restituiti al proprietario gli oggetti selezionati sul lotto nella terra di proprietà del residente &apos;[NAME]&apos;.
- </notification>
- <notification name="GroupObjectsReturned">
- Gli oggetti selezionati sul terreno e condivisi con il gruppo [GROUPNAME] sono stati restituiti nell&apos;inventario dei propietari.
-Gli oggetti trasferibili ceduti sono stati restituiti ai proprietari precedenti.
-Gli oggetti non trasferibili che erano stati ceduti al gruppo sono stati cancellati.
- </notification>
- <notification name="UnOwnedObjectsReturned">
- Gli oggetti selezionati sul terreno che non sono di tua proprietà sono stati restituiti ai loro proprietari.
- </notification>
- <notification name="ServerObjectMessage">
- Messaggio da [NAME]:
-&lt;nolink&gt;[MSG]&lt;/nolink&gt;
- </notification>
- <notification name="NotSafe">
- Su questo terreno sono abilitati i danni.
-Qui potresti essere ferito. Se dovessi morire verrai teleportato a casa tua.
- </notification>
- <notification name="NoFly">
- In questa zona è proibito il volo.
-Qui non puoi volare.
- </notification>
- <notification name="PushRestricted">
- Questa zona non consente le spinte. Non puoi spingere gli altri a meno che tu non sia il proprietario del terreno.
- </notification>
- <notification name="NoVoice">
- Questa zona ha la chat vocale disattivata. Non puoi sentire nessuno parlare.
- </notification>
- <notification name="NoBuild">
- In questa zona è proibita la costruzione. Qui non puoi costruire né rezzare oggetti.
- </notification>
- <notification name="ScriptsStopped">
- Un amministratore ha temporaneamente disabilitato gli script in questa regione.
- </notification>
- <notification name="ScriptsNotRunning">
- In questa terra nessuno script è attivo.
- </notification>
- <notification name="NoOutsideScripts">
- Questo terreno non consente script esterni.
-
-Qui funzionano soltanto gli script del proprietario del terreno.
- </notification>
- <notification name="ClaimPublicLand">
- Puoi solo richiedere terreni pubblici nella regione in cui sei posizionato.
- </notification>
- <notification name="RegionTPAccessBlocked">
- Non puoi entrare in quella regione a causa della tua categoria di accesso. Può essere necessario validare l&apos;età e/o installare l&apos;ultima versione del programma.
-
-Visita la Knowledge Base per informazioni sull&apos;accesso alle aree con queste categorie di accesso.
- </notification>
- <notification name="URBannedFromRegion">
- Tu hai l&apos;accesso bloccato a questa regione.
- </notification>
- <notification name="NoTeenGridAccess">
- Il tuo account non può connettersi a questa regione della griglia per Teenager.
- </notification>
- <notification name="ImproperPaymentStatus">
- Non hai una impostazioni di pagamento corrette per entrare in questa regione.
- </notification>
- <notification name="MustGetAgeParcel">
- Devi essere di età verificata per entrare in questa terra.
- </notification>
- <notification name="NoDestRegion">
- Non è stata trovata nessuna regione di destinazione.
- </notification>
- <notification name="NotAllowedInDest">
- Non hai il permesso di accedere alla regione di destinazione.
- </notification>
- <notification name="RegionParcelBan">
- Non puoi attraversare la regione passando su un terreno ad accesso interdetto. Prova in un altro modo.
- </notification>
- <notification name="TelehubRedirect">
- Sei stato rediretto ad un punto di snodo di teletrasporto.
- </notification>
- <notification name="CouldntTPCloser">
- Non è stato possibile teleportarti più vicino al luogo di destinazione.
- </notification>
- <notification name="TPCancelled">
- Teletrasporto annullato.
- </notification>
- <notification name="FullRegionTryAgain">
- La regione in cui stai tentando di accedere è attualmente piena.
-Riprova tra qualche istante.
- </notification>
- <notification name="GeneralFailure">
- Fallimento generale.
- </notification>
- <notification name="RoutedWrongRegion">
- Sei stato instradato verso la regione sbagliata. Riprova.
- </notification>
- <notification name="NoValidAgentID">
- Nessun ID valido.
- </notification>
- <notification name="NoValidSession">
- Nessun ID valido.
- </notification>
- <notification name="NoValidCircuit">
- Nessun codice circuito valido.
- </notification>
- <notification name="NoValidTimestamp">
- Nessuna data/timestamp valido.
- </notification>
- <notification name="NoPendingConnection">
- Impossibile creare la connessione in sospeso.
- </notification>
- <notification name="InternalUsherError">
- Si è verificato un errore interno durante il tentativo di trasportarti alla destinazione. Potrebbero esserci problemi in [SECOND_LIFE] al momento.
- </notification>
- <notification name="NoGoodTPDestination">
- Impossibile trovare una buona destinazione per il teletrasporto in questa regione.
- </notification>
- <notification name="InternalErrorRegionResolver">
- Si è verificato un errore interno durante il tentativo di risolvere le coordinate per la richiesta di teletrasporto. Può darsi che ci siano problemi in [SECOND_LIFE] al momento.
- </notification>
- <notification name="NoValidLanding">
- Non è stato trovato un punto di atterraggio valido.
- </notification>
- <notification name="NoValidParcel">
- Non è stato trovato nessun territorio valido.
- </notification>
- <notification name="ObjectGiveItem">
- Un oggetto denominato &lt;nolink&gt;[OBJECTFROMNAME]&lt;/nolink&gt; di proprietà di [NAME_SLURL] ti ha offerto &lt;nolink&gt;[ITEM_SLURL]&lt;/nolink&gt;. Per usare questo oggetto è necessario passare alla modalità Avanzata e cercarlo nell&apos;Inventario. Per passare alla modalità Avanzata, esci e riavvia l&apos;applicazione e cambia le impostazioni della modalità nella schermata di accesso.
- <form name="form">
- <button name="Keep" text="Mantieni oggetto"/>
- <button name="Discard" text="Rifiuta oggetto"/>
- <button name="Mute" text="Blocca oggetto"/>
- </form>
- </notification>
- <notification name="UserGiveItem">
- [NAME_SLURL] ti ha offerto [ITEM_SLURL]. Per usare questo oggetto è necessario passare alla modalità Avanzata e cercarlo nell&apos;Inventario. Per passare alla modalità Avanzata, esci e riavvia l&apos;applicazione e cambia le impostazioni della modalità nella schermata di accesso.
- <form name="form">
- <button name="Show" text="Mantieni oggetto"/>
- <button name="Discard" text="Rifiuta oggetto"/>
- <button name="Mute" text="Blocca utente"/>
- </form>
- </notification>
- <notification name="GodMessage">
- [NAME]
-
-[MESSAGE]
- </notification>
- <notification name="JoinGroup">
- [MESSAGE]
- <form name="form">
- <button name="Join" text="Iscriviti"/>
- <button name="Decline" text="Rifiuta"/>
- <button name="Info" text="Info"/>
- </form>
- </notification>
- <notification name="TeleportOffered">
- [NAME_SLURL] ti ha offerto il teleport alla sua ubicazione:
-
-[MESSAGE] - [MATURITY_STR] &lt;icon&gt;[MATURITY_ICON]&lt;/icon&gt;
- <form name="form">
- <button name="Teleport" text="Teleport"/>
- <button name="Cancel" text="Cancella"/>
- </form>
- </notification>
- <notification name="TeleportOfferSent">
- Offerta di Teleport inviata a [TO_NAME]
- </notification>
- <notification name="GotoURL">
- [MESSAGE]
-[URL]
- <form name="form">
- <button name="Later" text="Successivo"/>
- <button name="GoNow..." text="Vai ora..."/>
- </form>
- </notification>
- <notification name="OfferFriendship">
- [NAME_SLURL] ti ha offerto di diventare amici.
-
-[MESSAGE]
-
-(L&apos;impostazione predefinita consente a ciascuno di vedere se l&apos;altro è online.)
- <form name="form">
- <button name="Accept" text="Accetta"/>
- <button name="Decline" text="Rifiuta"/>
- </form>
- </notification>
- <notification name="FriendshipOffered">
- Hai offerto l&apos;amicizia a [TO_NAME]
- </notification>
- <notification name="OfferFriendshipNoMessage">
- [NAME_SLURL] ti ha offerto di diventare amici.
-
-(L&apos;impostazione predefinita consente a ciascuno di vedere se l&apos;altro è online.)
- <form name="form">
- <button name="Accept" text="Accetta"/>
- <button name="Decline" text="Rifiuta"/>
- </form>
- </notification>
- <notification name="FriendshipAccepted">
- [NAME] ha accettato la tua offerta di amicizia.
- </notification>
- <notification name="FriendshipDeclined">
- [NAME] ha rifiutato la tua offerta di amicizia.
- </notification>
- <notification name="FriendshipAcceptedByMe">
- Offerta di amicizia accettata.
- </notification>
- <notification name="FriendshipDeclinedByMe">
- Offerta di amicizia rifiutata.
- </notification>
- <notification name="OfferCallingCard">
- [NOME] ti offre il suo biglietto da visita.
-Questo sarà aggiunto nel tuo inventario come segnalibro per consentirti di inviare rapidamente messaggi IM a questo residente.
- <form name="form">
- <button name="Accept" text="Accetta"/>
- <button name="Decline" text="Rifiuta"/>
- </form>
- </notification>
- <notification name="RegionRestartMinutes">
- Questa regione verrà riavviata fra [MINUTES] minuti.
-Se rimani qui verrai scollegato da Second Life.
- </notification>
- <notification name="RegionRestartSeconds">
- Questa regione verrà riavviata fra [SECONDS] secondi.
-Se rimani qui verrai scollegato da Second Life.
- </notification>
- <notification name="LoadWebPage">
- Caricare la pagina Web [URL]?
-
-[MESSAGE]
-
-Dall&apos;oggetto: &lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;, proprietario: [NAME]?
- <form name="form">
- <button name="Gotopage" text="Caricare"/>
- <button name="Cancel" text="Annulla"/>
- </form>
- </notification>
- <notification name="FailedToFindWearableUnnamed">
- Impossibile trovare [TYPE] nel database.
- </notification>
- <notification name="FailedToFindWearable">
- Impossibile trovare [TYPE] chiamato [DESC] nel database.
- </notification>
- <notification name="InvalidWearable">
- L&apos;elemento che stai tentando di indossare usa delle caratteristiche che il tuo viewer non può leggere. Aggiorna la versione di [APP_NAME] per poterlo indossare.
- </notification>
- <notification name="ScriptQuestion">
- &apos;&lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;&apos;, un oggetto posseduto da &apos;[NAME]&apos; vorrebbe:
-
-[QUESTIONS]
-OK?
- <form name="form">
- <button name="Yes" text="Si"/>
- <button name="No" text="No"/>
- <button name="Mute" text="Blocca"/>
- </form>
- </notification>
- <notification name="ScriptQuestionCaution">
- Un oggetto di nome &apos;&lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;&apos;, posseduto da &apos;[NAME]&apos; vorrebbe:
-
-[QUESTIONS]
-Se non ti fidi di questo oggetto e del suo ideatore, dovresti rifiutare la richiesta.
-
-Concedi questa richiesta?
- <form name="form">
- <button name="Grant" text="Accetta"/>
- <button name="Deny" text="Nega"/>
- <button name="Details" text="Dettagli..."/>
- </form>
- </notification>
- <notification name="ScriptDialog">
- &apos;&lt;nolink&gt;[TITLE]&lt;/nolink&gt;&apos; di [NAME]
-[MESSAGE]
- <form name="form">
- <button name="Ignore" text="Ignora"/>
- </form>
- </notification>
- <notification name="ScriptDialogGroup">
- &apos;&lt;nolink&gt;[TITLE]&lt;/nolink&gt;&apos; di [GROUPNAME]
-[MESSAGE]
- <form name="form">
- <button name="Ignore" text="Ignora"/>
- </form>
- </notification>
- <notification name="BuyLindenDollarSuccess">
- Grazie per aver inviato il pagamento.
-
-Il tuo saldo in L$ sarà aggiornato al termine dell&apos;elaborazione. Se l&apos;elaborazione dovesse impiegare più di 20 minuti, la transazione verrà annullata. In quel caso l&apos;ammontare dell&apos;acquisto verrà accreditato sul tuo saldo in US$.
-
-Potrai controllare lo stato del pagamento nella pagina della cronologia delle transazioni nel tuo [http://secondlife.com/account/ Dashboard]
- </notification>
- <notification name="FirstOverrideKeys">
- I tuoi movimenti della tastiera vengono ora gestiti da un oggetto.
-Prova i tasti freccia o AWSD per vedere quello che fanno.
-Alcuni oggetti (come pistole) richiedono di andare in mouselook per il loro utilizzo.
-Premi &apos;M&apos; per farlo.
- </notification>
- <notification name="FirstSandbox">
- Questa è una Sandbox, serve ai residenti per imparare a costruire.
-
-Gli oggetti che costruisci qui verranno eliminati dopo che te ne sei andato, perciò non dimenticare di cliccare sulle tue creazioni col tasto destro del mouse e scegliere Prendi per trasferirle nel tuo Inventario.
- </notification>
- <notification name="MaxListSelectMessage">
- È possibile selezionare solo fino a [MAX_SELECT] oggetti da questa lista.
- </notification>
- <notification name="VoiceInviteP2P">
- [NAME] ti sta invitando ad una chiamata in chat vocale.
-Clicca su Accetta per unirti alla chiamata oppure su Declina to declinare l&apos;invito. Clicca su Blocca per bloccare questo chiamante.
- <form name="form">
- <button name="Accept" text="Accetta"/>
- <button name="Decline" text="Rifiuta"/>
- <button name="Mute" text="Blocca"/>
- </form>
- </notification>
- <notification name="AutoUnmuteByIM">
- [NAME] ha ricevuto un IM ed è stato automaticamente sbloccato.
- </notification>
- <notification name="AutoUnmuteByMoney">
- [NAME] ha ricevuto del denaro ed è stato automaticamente sbloccato.
- </notification>
- <notification name="AutoUnmuteByInventory">
- [NAME] ha ricevuto un&apos;offerta di inventario ed è stato automaticamente sbloccato.
- </notification>
- <notification name="VoiceInviteGroup">
- [NAME] si è aggiunto alla chiamata in chat vocale con il gruppo [GROUP].
-Clicca su Accetta per unirti alla chiamata oppure su Declina to declinare l&apos;invito. Clicca su Blocca per bloccare questo chiamante.
- <form name="form">
- <button name="Accept" text="Accetta"/>
- <button name="Decline" text="Rifiuta"/>
- <button name="Mute" text="Blocca"/>
- </form>
- </notification>
- <notification name="VoiceInviteAdHoc">
- [NAME] si è aggiunto alla chiamata in chat vocale con una conferenza.
-Clicca su Accetta per unirti alla chiamata oppure su Declina to declinare l&apos;invito. Clicca su Blocca per bloccare questo chiamante.
- <form name="form">
- <button name="Accept" text="Accetta"/>
- <button name="Decline" text="Rifiuta"/>
- <button name="Mute" text="Blocca"/>
- </form>
- </notification>
- <notification name="InviteAdHoc">
- [NAME] ti sta invitando ad una conferenza in chat.
-Clicca su Accetta per unirti alla chat oppure su Declina per declinare l&apos;invito. Clicca su Blocca per bloccare questo chiamante.
- <form name="form">
- <button name="Accept" text="Accetta"/>
- <button name="Decline" text="Rifiuta"/>
- <button name="Mute" text="Blocca"/>
- </form>
- </notification>
- <notification name="VoiceChannelFull">
- La chiamata vocale a cui si sta cercando di unirsi, [VOICE_CHANNEL_NAME], ha raggiunto la capacità massima. Si prega di riprovare più tardi.
- </notification>
- <notification name="ProximalVoiceChannelFull">
- Siamo spiacenti. Questa area ha raggiunto la capacità massima per le chiamate voice. Si prega di provare ad usare il voice in un&apos;altra area.
- </notification>
- <notification name="VoiceChannelDisconnected">
- Sei stato scollegato da [VOICE_CHANNEL_NAME]. Verrai ora ricollegato alla chat vocale nei dintorni.
- </notification>
- <notification name="VoiceChannelDisconnectedP2P">
- [VOICE_CHANNEL_NAME] ha chiuso la chiamata. Verrai ora ricollegato alla chat vocale nei dintorni.
- </notification>
- <notification name="P2PCallDeclined">
- [VOICE_CHANNEL_NAME] ha declinato la tua chiamata. Verrai ora ricollegato alla chat vocale nei dintorni.
- </notification>
- <notification name="P2PCallNoAnswer">
- [VOICE_CHANNEL_NAME] non è disponibile per la tua chiamata. Verrai ora ricollegato alla chat vocale nei dintorni.
- </notification>
- <notification name="VoiceChannelJoinFailed">
- Collegamento a [VOICE_CHANNEL_NAME] non riuscito, riprova più tardi. Verrai ora ricollegato alla chat vocale nei dintorni.
- </notification>
- <notification name="VoiceLoginRetry">
- Stiamo creando una canale voice per te. Questo può richiedere fino a un minuto.
- </notification>
- <notification name="VoiceEffectsExpired">
- Almeno una delle manipolazioni vocali alle quali sei iscritto è scaduta.
-[[URL] Fai clic qui] per rinnovare l&apos;abbonamento.
- </notification>
- <notification name="VoiceEffectsExpiredInUse">
- Poiché la manipolazione vocale attiva è scaduta, sono state applicate le tue impostazioni normali.
-[[URL] Fai clic qui] per rinnovare l&apos;abbonamento.
- </notification>
- <notification name="VoiceEffectsWillExpire">
- Almeno una delle tue manipolazioni vocali scadrà tra meno di [INTERVAL] giorni.
-[[URL] Fai clic qui] per rinnovare l&apos;abbonamento.
- </notification>
- <notification name="VoiceEffectsNew">
- Sono disponibili nuove manipolazioni vocali.
- </notification>
- <notification name="Cannot enter parcel: not a group member">
- Soltanto i membri di un determinato gruppo possono visitare questa zona.
- </notification>
- <notification name="Cannot enter parcel: banned">
- Non puoi entrare nel terreno, sei stato bloccato.
- </notification>
- <notification name="Cannot enter parcel: not on access list">
- Non puoi entrare nel terreno, non fai parte della lista di accesso.
- </notification>
- <notification name="VoiceNotAllowed">
- Non hai il permesso di collegarti ad una voice chat con [VOICE_CHANNEL_NAME].
- </notification>
- <notification name="VoiceCallGenericError">
- Si è verificato un errore durante il tentativo di collegarti a una voice chat con [VOICE_CHANNEL_NAME]. Riprova più tardi.
- </notification>
- <notification name="UnsupportedCommandSLURL">
- Lo SLurl su cui hai cliccato non è valido.
- </notification>
- <notification name="BlockedSLURL">
- Uno SLurl è stato ricevuto da un browser sconosciuto o non sicuro e, per sicurezza, è stato bloccato.
- </notification>
- <notification name="ThrottledSLURL">
- Sono stati ricevuti più SLurl da un browser sconosciuto o non sicuro in un breve periodo di tempo.
-Per sicurezza, verranno bloccati per alcuni secondi.
- </notification>
- <notification name="IMToast">
- [MESSAGE]
- <form name="form">
- <button name="respondbutton" text="Rispondi"/>
- </form>
- </notification>
- <notification name="ConfirmCloseAll">
- Sicuro di voler chiudere tutti gli IM?
- <usetemplate ignoretext="Conferma prima della chiusura di tutti gli IM" name="okcancelignore" notext="Annulla" yestext="OK"/>
- </notification>
- <notification name="AttachmentSaved">
- L&apos;elemento da collegare è stato salvato.
- </notification>
- <notification name="UnableToFindHelpTopic">
- Impossibile trovare l&apos;argomento nell&apos;aiuto per questo elemento.
- </notification>
- <notification name="ObjectMediaFailure">
- Errore del server: mancato aggiornamento o ottenimento del media.
-&apos;[ERROR]&apos;
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="TextChatIsMutedByModerator">
- La tua chat di testo è stata interrotta dal moderatore.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="VoiceIsMutedByModerator">
- La tua voce è stata interrotta dal moderatore.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="ConfirmClearTeleportHistory">
- Sei sicuro di volere cancellare la cronologia dei tuoi teleport?
- <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
- </notification>
- <notification name="BottomTrayButtonCanNotBeShown">
- Il pulsante selezionato non può essere visualizzato in questo momento.
-Il pulsante verrà visualizzato quando lo spazio sarà sufficiente.
- </notification>
- <notification name="ShareNotification">
- Scegli i residenti con i quali condividere.
- </notification>
- <notification name="ShareItemsConfirmation">
- Sei sicuro di volere condividere gli oggetti
-
-&lt;nolink&gt;[MSG]&lt;/nolink&gt;
-
-Con i seguenti residenti?
-
-[RESIDENTS]
- <usetemplate name="okcancelbuttons" notext="Annulla" yestext="Ok"/>
- </notification>
- <notification name="ItemsShared">
- Gli oggetti sono stati condivisi.
- </notification>
- <notification name="DeedToGroupFail">
- Cessione al gruppo non riuscita.
- </notification>
- <notification name="AvatarRezNotification">
- ( in esistenza da [EXISTENCE] secondi )
-Nuvola avatar &apos;[NAME]&apos; dileguata dopo [TIME] secondi.
- </notification>
- <notification name="AvatarRezSelfBakedDoneNotification">
- ( in esistenza da [EXISTENCE] secondi )
-Baking dei vestiti terminato dopo [TIME] secondi.
- </notification>
- <notification name="AvatarRezSelfBakedUpdateNotification">
- ( in esistenza da [EXISTENCE] secondi )
-Hai inviato un aggiornamento al tuo aspetto dopo [TIME] secondi.
-[STATUS]
- </notification>
- <notification name="AvatarRezCloudNotification">
- ( presente da [EXISTENCE] secondi )
-Avatar &apos;[NAME]&apos; trasformato in nuvola.
- </notification>
- <notification name="AvatarRezArrivedNotification">
- ( presente da [EXISTENCE] secondi )
-È comparso l&apos;avatar &apos;[NAME]&apos;.
- </notification>
- <notification name="AvatarRezLeftCloudNotification">
- ( presente da [EXISTENCE] secondi )
-Avatar &apos;[NAME]&apos; partito dopo [TIME] secondi sotto forma di nuvola.
- </notification>
- <notification name="AvatarRezEnteredAppearanceNotification">
- ( presente da [EXISTENCE] secondi )
-Avatar &apos;[NAME]&apos; è entrato nella modalità aspetto.
- </notification>
- <notification name="AvatarRezLeftAppearanceNotification">
- ( presente da [EXISTENCE] secondi )
-Avatar &apos;[NAME]&apos; ha lasciato la modalità aspetto.
- </notification>
- <notification name="NoConnect">
- Ci sono problemi di connessione tramite [PROTOCOL] [HOSTID].
-Ti consigliamo di controllare le tue impostazioni di rete e della firewall.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="NoVoiceConnect">
- A causa di problemi di connessione al server vocale
-
-[HOSTID]
-
-le comunicazioni tramite voce non saranno disponibili.
-Ti consigliamo di controllare le tue impostazioni di rete e della firewall.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="AvatarRezLeftNotification">
- ( presente da [EXISTENCE] secondi )
-Avatar &apos;[NAME]&apos; è partito completamente caricato.
- </notification>
- <notification name="AvatarRezSelfBakedTextureUploadNotification">
- ( In esistenza da [EXISTENCE] secondi)
-Hai caricato una texture [RESOLUTION] completata per &apos;[BODYREGION]&apos; dopo [TIME] secondi.
- </notification>
- <notification name="AvatarRezSelfBakedTextureUpdateNotification">
- ( In esistenza da [EXISTENCE] secondi)
-Hai aggiornato localmente una texture [RESOLUTION] completata per &apos;[BODYREGION]&apos; dopo [TIME] secondi.
- </notification>
- <notification name="ConfirmLeaveCall">
- Sei sicuro di volere uscire dalla chiamata?
- <usetemplate ignoretext="Conferma prima di uscire dalla chiamata" name="okcancelignore" notext="No" yestext="Sì"/>
- </notification>
- <notification name="ConfirmMuteAll">
- Hai scelto di disattivare l&apos;audio di tutti i partecipanti alla chiamata di gruppo.
-In questo modo verrà disattivato l&apos;audio anche di tutti i residenti che si
-uniscono alla chiamata in un secondo momento, anche dopo che tu ti fossi scollegato.
-
-Disattiva audio di tutti?
- <usetemplate ignoretext="Conferma prima di disattivare l&apos;audio di tutti i partecipanti alla chiamata di gruppo" name="okcancelignore" notext="Annulla" yestext="Ok"/>
- </notification>
- <notification label="Chat" name="HintChat">
- Per partecipare alla conversazione, digita nel campo chat in basso.
- </notification>
- <notification label="Alzati" name="HintSit">
- Per alzarti ed uscire dalla posizione seduta, clicca sul pulsante Alzati.
- </notification>
- <notification label="Parla" name="HintSpeak">
- Clicca sul pulsante Parla per attivare o disattivare il microfono.
-
-Clicca sul tasto freccia su per visualizzare il pannello di controllo voce.
-
-Se nascondi il tasto Parla viene disattivata la funzione voce.
- </notification>
- <notification label="Esplora il mondo" name="HintDestinationGuide">
- La Guida alle destinazioni contiene migliaia di nuovi luoghi da scoprire. Seleziona una destinazione e scegli Teleport per iniziare a esplorare.
- </notification>
- <notification label="Pannello laterale" name="HintSidePanel">
- Nel pannello laterale puoi acccedere rapidamente all&apos;inventario, ai vestiti, ai profili e ad altro ancora.
- </notification>
- <notification label="Movimento" name="HintMove">
- Per camminare o correre, apri il pannello Sposta e usa le frecce direzionali per spostarti. Puoi anche usare le frecce direzionali sulla tastiera del computer.
- </notification>
- <notification label="" name="HintMoveClick">
- 1. Clicca per camminare
-Clicca dovunque sul terreno per camminare verso quella posizione.
-
-2. Clicca e trascina per ruotare la visuale
-Clicca e trascina dovunque nel mondo per ruotare la visuale
- </notification>
- <notification label="Nome visualizzato" name="HintDisplayName">
- Imposta qui il tuo nome visualizzato personalizzabile. È in aggiunta al tuo nome utente, che non può essere cambiato. Nelle preferenze puoi anche cambiare il modo in cui vedi i nomi degli altri.
- </notification>
- <notification label="Visuale" name="HintView">
- Per cambiare la visuale della fotocamera, usa i controlli Ruota visuale e Panoramica. Ripristina la visuale premendo il tasto Esc o camminando.
- </notification>
- <notification label="Inventario" name="HintInventory">
- Trova oggetti nel tuo inventario. I più recenti si trovano nella scheda Elementi recenti.
- </notification>
- <notification label="Hai dollari Linden!" name="HintLindenDollar">
- Ecco il saldo attuale in L$. Clicca su Acquista L$ per acquistare altri dollari Linden.
- </notification>
- <notification name="PopupAttempt">
- Non è stato possibile aprire una finestra pop-up.
- <form name="form">
- <ignore name="ignore" text="Attiva tutti i pop-up"/>
- <button name="open" text="Apri finestra pop-up"/>
- </form>
- </notification>
- <notification name="AuthRequest">
- Il sito &apos;&lt;nolink&gt;[HOST_NAME]&lt;/nolink&gt;&apos; nel reame &apos;[REALM]&apos; richiede un nome utente e una password.
- <form name="form">
- <input name="username" text="Nome utente"/>
- <input name="password" text="Password"/>
- <button name="ok" text="Invia"/>
- <button name="cancel" text="Annulla"/>
- </form>
- </notification>
- <notification label="" name="ModeChange">
- Per cambiare la modalità è necessario uscire e riavviare.
- <usetemplate name="okcancelbuttons" notext="Non uscire" yestext="Esci"/>
- </notification>
- <notification label="" name="NoClassifieds">
- La creazione e la modifica degli annunci sono disponibili solo in modalità Avanzata. Uscire e cambiare la modalità? Sulla schermata di accesso si può selezionare la modalità.
- <usetemplate name="okcancelbuttons" notext="Non uscire" yestext="Esci"/>
- </notification>
- <notification label="" name="NoGroupInfo">
- La creazione e la modifica dei gruppi sono disponibili solo in modalità Avanzata. Uscire e cambiare la modalità? Sulla schermata di accesso si può selezionare la modalità.
- <usetemplate name="okcancelbuttons" notext="Non uscire" yestext="Esci"/>
- </notification>
- <notification label="" name="NoPicks">
- La creazione e la modifica dei luoghi preferiti sono disponibili solo in modalità Avanzata. Uscire e cambiare la modalità? Sulla schermata di accesso si può selezionare la modalità.
- <usetemplate name="okcancelbuttons" notext="Non uscire" yestext="Esci"/>
- </notification>
- <notification label="" name="NoWorldMap">
- La visualizzazione della mappa del mondo è disponibile solo in modalità Avanzata. Uscire e cambiare la modalità? Sulla schermata di accesso si può selezionare la modalità.
- <usetemplate name="okcancelbuttons" notext="Non uscire" yestext="Esci"/>
- </notification>
- <notification label="" name="NoVoiceCall">
- Le chiamate Voce sono disponibili solo in modalità Avanzata. Eseguire il logout e cambiare la modalità?
- <usetemplate name="okcancelbuttons" notext="Non uscire" yestext="Esci"/>
- </notification>
- <notification label="" name="NoAvatarShare">
- La condivisione è disponibile solo in modalità Avanzata. Eseguire il logout e cambiare la modalità?
- <usetemplate name="okcancelbuttons" notext="Non uscire" yestext="Esci"/>
- </notification>
- <notification label="" name="NoAvatarPay">
- Il pagamento ad altri residenti è disponibile solo in modalità Avanzata. Eseguire il logout e cambiare la modalità?
- <usetemplate name="okcancelbuttons" notext="Non uscire" yestext="Esci"/>
- </notification>
- <global name="UnsupportedCPU">
- - La velocità della tua CPU non soddisfa i requisiti minimi.
- </global>
- <global name="UnsupportedGLRequirements">
- Non sembra che tu abbia i requisiti hardware adeguati per [APP_NAME]. [APP_NAME] richiede una scheda grafica OpenGL con supporto multitexture. Se ne hai una in dotazione, accertati di avere i driver, i service pack e i patch più recenti per la scheda grafica e per il sistema operativo.
-
-Se continui ad avere problemi, visita la pagina [SUPPORT_SITE].
- </global>
- <global name="UnsupportedCPUAmount">
- 796
- </global>
- <global name="UnsupportedRAMAmount">
- 510
- </global>
- <global name="UnsupportedGPU">
- - La tua scheda grafica non soddisfa i requisiti minimi.
- </global>
- <global name="UnsupportedRAM">
- - La memoria del tuo sistema non soddisfa i requisiti minimi.
- </global>
- <global name="You can only set your &apos;Home Location&apos; on your land or at a mainland Infohub.">
- Se sei proprietario di un appezzamento di terreno, puoi definirlo come la tua posizione iniziale.
-In alternativa, puoi guardare sulla mappa e trovare luoghi segnalati come &quot;Infohub&quot;.
- </global>
- <global name="You died and have been teleported to your home location">
- Sei deceduto e sei stato teleportato a casa tua.
- </global>
-</notifications>
diff --git a/indra/newview/skins/minimal/xui/it/panel_adhoc_control_panel.xml b/indra/newview/skins/minimal/xui/it/panel_adhoc_control_panel.xml
deleted file mode 100644
index be001d09f8..0000000000
--- a/indra/newview/skins/minimal/xui/it/panel_adhoc_control_panel.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="panel_im_control_panel">
- <layout_stack name="vertical_stack">
- <layout_panel name="call_btn_panel">
- <button label="Chiama" name="call_btn"/>
- </layout_panel>
- <layout_panel name="end_call_btn_panel">
- <button label="Abbandona chiamata" name="end_call_btn"/>
- </layout_panel>
- <layout_panel name="voice_ctrls_btn_panel">
- <button label="Regolazione voce" name="voice_ctrls_btn"/>
- </layout_panel>
- </layout_stack>
-</panel>
diff --git a/indra/newview/skins/minimal/xui/it/panel_bottomtray.xml b/indra/newview/skins/minimal/xui/it/panel_bottomtray.xml
deleted file mode 100644
index ab9b175f16..0000000000
--- a/indra/newview/skins/minimal/xui/it/panel_bottomtray.xml
+++ /dev/null
@@ -1,45 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="bottom_tray">
- <string name="DragIndicationImageName" value="Accordion_ArrowOpened_Off"/>
- <string name="SpeakBtnToolTip" value="Accende o spegne il microfono"/>
- <string name="VoiceControlBtnToolTip" value="Mostra o nasconde il pannello di regolazione voce"/>
- <layout_stack name="toolbar_stack">
- <layout_panel name="speak_panel">
- <button label="Parla" name="speak_btn" tool_tip="Accendi e spegni il microfono"/>
- </layout_panel>
- <layout_panel name="speak_flyout_panel">
- <button label="" name="flyout_btn" tool_tip="Cambia le preferenze per i suoni"/>
- </layout_panel>
- <layout_panel name="gesture_panel">
- <gesture_combo_list label="Gesture" name="Gesture" tool_tip="Fai fare qualcosa al tuo avatar"/>
- </layout_panel>
- <layout_panel name="cam_panel">
- <bottomtray_button label="Visuale" name="camera_btn" tool_tip="Controlla l&apos;angolo di visualizzazione"/>
- </layout_panel>
- <layout_panel name="destinations_panel">
- <bottomtray_button label="Destinazioni" name="destination_btn" tool_tip="Viaggia in Second Life"/>
- </layout_panel>
- <layout_panel name="avatar_panel">
- <bottomtray_button label="Il mio avatar" name="avatar_btn" tool_tip="Cambia il tuo aspetto"/>
- </layout_panel>
- <layout_panel name="people_panel">
- <bottomtray_button label="Persone" name="show_people_button" tool_tip="Trova persone in Second Life"/>
- </layout_panel>
- <layout_panel name="profile_panel">
- <bottomtray_button label="Profilo" name="show_profile_btn" tool_tip="Visualizza e modifica il tuo profilo"/>
- </layout_panel>
- <layout_panel name="howto_panel">
- <bottomtray_button label="Istruzioni" name="show_help_btn" tool_tip="Visualizza le informazioni della guida di Second Life"/>
- </layout_panel>
- <layout_panel name="im_well_panel">
- <chiclet_im_well name="im_well">
- <button name="Unread IM messages" tool_tip="Conversazioni"/>
- </chiclet_im_well>
- </layout_panel>
- <layout_panel name="notification_well_panel">
- <chiclet_notification name="notification_well">
- <button name="Unread" tool_tip="Notifiche"/>
- </chiclet_notification>
- </layout_panel>
- </layout_stack>
-</panel>
diff --git a/indra/newview/skins/minimal/xui/it/panel_group_control_panel.xml b/indra/newview/skins/minimal/xui/it/panel_group_control_panel.xml
deleted file mode 100644
index 2d17e4a0cd..0000000000
--- a/indra/newview/skins/minimal/xui/it/panel_group_control_panel.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="panel_im_control_panel">
- <layout_stack name="vertical_stack">
- <layout_panel name="group_info_btn_panel">
- <button label="Profilo del gruppo" name="group_info_btn"/>
- </layout_panel>
- <layout_panel name="call_btn_panel">
- <button label="Chiama il gruppo" name="call_btn"/>
- </layout_panel>
- <layout_panel name="end_call_btn_panel">
- <button label="Abbandona chiamata" name="end_call_btn"/>
- </layout_panel>
- <layout_panel name="voice_ctrls_btn_panel">
- <button label="Apri la regolazione voce" name="voice_ctrls_btn"/>
- </layout_panel>
- </layout_stack>
-</panel>
diff --git a/indra/newview/skins/minimal/xui/it/panel_im_control_panel.xml b/indra/newview/skins/minimal/xui/it/panel_im_control_panel.xml
deleted file mode 100644
index 269931a1a4..0000000000
--- a/indra/newview/skins/minimal/xui/it/panel_im_control_panel.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="panel_im_control_panel">
- <layout_stack name="button_stack">
- <layout_panel name="view_profile_btn_panel">
- <button label="Profilo" name="view_profile_btn"/>
- </layout_panel>
- <layout_panel name="add_friend_btn_panel">
- <button label="Aggiungi come amico" name="add_friend_btn"/>
- </layout_panel>
- <layout_panel name="teleport_btn_panel">
- <button label="Teleport" name="teleport_btn" tool_tip="Offri teleport a questa persona"/>
- </layout_panel>
- <layout_panel name="call_btn_panel">
- <button label="Chiama" name="call_btn"/>
- </layout_panel>
- <layout_panel name="end_call_btn_panel">
- <button label="Chiudi chiamata" name="end_call_btn"/>
- </layout_panel>
- <layout_panel name="block_btn_panel">
- <button label="Blocca" name="block_btn"/>
- </layout_panel>
- <layout_panel name="unblock_btn_panel">
- <button label="Sblocca" name="unblock_btn"/>
- </layout_panel>
- <layout_panel name="volume_ctrl_panel">
- <slider name="volume_slider" tool_tip="Volume chiamata" value="0.5"/>
- </layout_panel>
- </layout_stack>
-</panel>
diff --git a/indra/newview/skins/minimal/xui/it/panel_login.xml b/indra/newview/skins/minimal/xui/it/panel_login.xml
deleted file mode 100644
index f88230ed11..0000000000
--- a/indra/newview/skins/minimal/xui/it/panel_login.xml
+++ /dev/null
@@ -1,48 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="panel_login">
- <panel.string name="create_account_url">
- http://join.secondlife.com/
- </panel.string>
- <panel.string name="forgot_password_url">
- http://secondlife.com/account/request.php?lang=it
- </panel.string>
- <layout_stack name="login_widgets">
- <layout_panel name="login">
- <text name="username_text">
- Nome utente:
- </text>
- <combo_box name="username_combo" tool_tip="Il nome utente che hai scelto durante la registrazione, come robby12 o Stella Soleggiato"/>
- <text name="password_text">
- Password:
- </text>
- <check_box label="Ricorda password" name="remember_check"/>
- <button label="Accedi" name="connect_btn"/>
- <text name="mode_selection_text">
- Modalità:
- </text>
- <combo_box name="mode_combo" tool_tip="Seleziona la modalità. Seleziona Di base per esplorare facilmente e rapidamente e per la chat. Seleziona Avanzata per accedere ad altre funzionalità.">
- <combo_box.item label="Di base" name="Basic"/>
- <combo_box.item label="Avanzate" name="Advanced"/>
- </combo_box>
- <text name="start_location_text">
- Inizia da:
- </text>
- <combo_box name="start_location_combo">
- <combo_box.item label="La mia ultima ubicazione" name="MyLastLocation"/>
- <combo_box.item label="Casa mia" name="MyHome"/>
- <combo_box.item label="&lt;Scrivi nome regione&gt;" name="Typeregionname"/>
- </combo_box>
- </layout_panel>
- <layout_panel name="links">
- <text name="create_new_account_text">
- Iscriviti
- </text>
- <text name="forgot_password_text">
- Hai dimenticato il nome utente o la password?
- </text>
- <text name="login_help">
- Ti serve aiuto con la fase di accesso?
- </text>
- </layout_panel>
- </layout_stack>
-</panel>
diff --git a/indra/newview/skins/minimal/xui/it/panel_navigation_bar.xml b/indra/newview/skins/minimal/xui/it/panel_navigation_bar.xml
deleted file mode 100644
index 8e72167759..0000000000
--- a/indra/newview/skins/minimal/xui/it/panel_navigation_bar.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="navigation_bar">
- <panel name="navigation_panel">
- <pull_button name="back_btn" tool_tip="Torna al luogo precedente"/>
- <pull_button name="forward_btn" tool_tip="Procedi un luogo in avanti"/>
- <button name="home_btn" tool_tip="Teleport a casa"/>
- <location_input label="Posizione" name="location_combo"/>
- <search_combo_box label="Cerca" name="search_combo_box" tool_tip="Cerca">
- <combo_editor label="Cerca [SECOND_LIFE]" name="search_combo_editor"/>
- </search_combo_box>
- </panel>
- <favorites_bar name="favorite" tool_tip="Trascina qui i punti di riferimento per un accesso rapido ai tuoi posti preferiti in Second Life.">
- <label name="favorites_bar_label" tool_tip="Trascina qui i punti di riferimento per un accesso rapido ai tuoi posti preferiti in Second Life.">
- Barra dei Preferiti
- </label>
- <chevron_button name="&gt;&gt;" tool_tip="Mostra altri Preferiti"/>
- </favorites_bar>
-</panel>
diff --git a/indra/newview/skins/minimal/xui/it/panel_people.xml b/indra/newview/skins/minimal/xui/it/panel_people.xml
deleted file mode 100644
index 81e886acf0..0000000000
--- a/indra/newview/skins/minimal/xui/it/panel_people.xml
+++ /dev/null
@@ -1,94 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<!-- Side tray panel -->
-<panel label="Persone" name="people_panel">
- <string name="no_recent_people" value="Nessuna persona recente. Stai cercando persone da frequentare? Prova il pulsante Destinazioni in basso."/>
- <string name="no_filtered_recent_people" value="Nessuna persona recente con quel nome."/>
- <string name="no_one_near" value="Nessuno vicino. Stai cercando persone da frequentare? Prova il pulsante Destinazioni in basso."/>
- <string name="no_one_filtered_near" value="Nessuno vicino con quel nome."/>
- <string name="no_friends_online" value="Nessun amico online"/>
- <string name="no_friends" value="Nessun amico"/>
- <string name="no_friends_msg">
- Clicca con il pulsante destro su un Residente per aggiungerlo come amico.
-Stai cercando persone da frequentare? Prova il pulsante Destinazioni in basso.
- </string>
- <string name="no_filtered_friends_msg">
- Non riesci a trovare quello che cerchi? Prova il pulsante Destinazioni in basso.
- </string>
- <string name="people_filter_label" value="Filtro persone"/>
- <string name="groups_filter_label" value="Filtro gruppi"/>
- <string name="no_filtered_groups_msg" value="Non riesci a trovare quello che cerchi? Prova [secondlife:///app/search/groups/[SEARCH_TERM] Cerca]."/>
- <string name="no_groups_msg" value="Stai cercando gruppi di cui far parte? Prova [secondlife:///app/search/groups Cerca]."/>
- <string name="MiniMapToolTipMsg" value="[REGION](Fai doppio clic per aprire la Mappa, premi il tasto Maiusc e trascina per la panoramica)"/>
- <string name="AltMiniMapToolTipMsg" value="[REGION](Fai doppio clic per teleportarti, premi il tasto Maiusc e trascina per la panoramica)"/>
- <filter_editor label="Filtro" name="filter_input"/>
- <tab_container name="tabs">
- <panel label="NELLE VICINANZE" name="nearby_panel">
- <panel label="bottom_panel" name="bottom_panel">
- <menu_button name="nearby_view_sort_btn" tool_tip="Opzioni"/>
- <button name="add_friend_btn" tool_tip="Aggiungi il residente selezionato alla tua lista degli amici"/>
- </panel>
- </panel>
- <panel label="I MIEI AMICI" name="friends_panel">
- <accordion name="friends_accordion">
- <accordion_tab name="tab_online" title="Online"/>
- <accordion_tab name="tab_all" title="Tutto"/>
- </accordion>
- <panel label="bottom_panel" name="bottom_panel">
- <layout_stack name="bottom_panel">
- <layout_panel name="options_gear_btn_panel">
- <menu_button name="friends_viewsort_btn" tool_tip="Mostra ulteriori opzioni"/>
- </layout_panel>
- <layout_panel name="add_btn_panel">
- <button name="add_btn" tool_tip="Offri amicizia a un residente"/>
- </layout_panel>
- <layout_panel name="trash_btn_panel">
- <dnd_button name="del_btn" tool_tip="Rimuovi la persona selezionata dalla lista degli amici"/>
- </layout_panel>
- </layout_stack>
- </panel>
- </panel>
- <panel label="I MIEI GRUPPI" name="groups_panel">
- <panel label="bottom_panel" name="bottom_panel">
- <menu_button name="groups_viewsort_btn" tool_tip="Opzioni"/>
- <button name="plus_btn" tool_tip="Aderisci al gruppo/Crea nuovo gruppo"/>
- <button name="activate_btn" tool_tip="Attiva il gruppo selezionato"/>
- </panel>
- </panel>
- <panel label="RECENTE" name="recent_panel">
- <panel label="bottom_panel" name="bottom_panel">
- <menu_button name="recent_viewsort_btn" tool_tip="Opzioni"/>
- <button name="add_friend_btn" tool_tip="Aggiungi il residente selezionato alla tua lista degli amici"/>
- </panel>
- </panel>
- </tab_container>
- <panel name="button_bar">
- <layout_stack name="bottom_bar_ls">
- <layout_panel name="view_profile_btn_lp">
- <button label="Profilo" name="view_profile_btn" tool_tip="Mostra immagine, gruppi e altre informazioni del residente"/>
- </layout_panel>
- <layout_panel name="im_btn_lp">
- <button label="IM" name="im_btn" tool_tip="Apri una sessione messaggio istantaneo"/>
- </layout_panel>
- <layout_panel name="call_btn_lp">
- <button label="Chiama" name="call_btn" tool_tip="Chiama questo residente"/>
- </layout_panel>
- <layout_panel name="share_btn_lp">
- <button label="Condividi" name="share_btn" tool_tip="Condividi un oggetto dell&apos;inventario"/>
- </layout_panel>
- <layout_panel name="teleport_btn_lp">
- <button label="Teleport" name="teleport_btn" tool_tip="Offri teleport"/>
- </layout_panel>
- </layout_stack>
- <layout_stack name="bottom_bar_ls1">
- <layout_panel name="group_info_btn_lp">
- <button label="Profilo del gruppo" name="group_info_btn" tool_tip="Mostra informazioni gruppo"/>
- </layout_panel>
- <layout_panel name="chat_btn_lp">
- <button label="Chat di gruppo" name="chat_btn" tool_tip="Apri sessione chat"/>
- </layout_panel>
- <layout_panel name="group_call_btn_lp">
- <button label="Chiamata al gruppo" name="group_call_btn" tool_tip="Chiama questo gruppo"/>
- </layout_panel>
- </layout_stack>
- </panel>
-</panel>
diff --git a/indra/newview/skins/minimal/xui/it/panel_side_tray_tab_caption.xml b/indra/newview/skins/minimal/xui/it/panel_side_tray_tab_caption.xml
deleted file mode 100644
index 3c7874e093..0000000000
--- a/indra/newview/skins/minimal/xui/it/panel_side_tray_tab_caption.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="sidetray_tab_panel">
- <text name="sidetray_tab_title" value="Pannello laterale"/>
- <button name="undock" tool_tip="Disàncora"/>
- <button name="dock" tool_tip="Àncora"/>
- <button name="show_help" tool_tip="Mostra Aiuto"/>
-</panel>
diff --git a/indra/newview/skins/minimal/xui/it/panel_status_bar.xml b/indra/newview/skins/minimal/xui/it/panel_status_bar.xml
deleted file mode 100644
index cde495ba97..0000000000
--- a/indra/newview/skins/minimal/xui/it/panel_status_bar.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="status">
- <panel.string name="packet_loss_tooltip">
- Perdita di pacchetti
- </panel.string>
- <panel.string name="bandwidth_tooltip">
- Larghezza di banda
- </panel.string>
- <panel.string name="time">
- [hour12, datetime, slt]:[min, datetime, slt] [ampm, datetime, slt] [timezone,datetime, slt]
- </panel.string>
- <panel.string name="timeTooltip">
- [weekday, datetime, slt], [day, datetime, slt] [month, datetime, slt] [year, datetime, slt]
- </panel.string>
- <panel.string name="buycurrencylabel">
- L$ [AMT]
- </panel.string>
- <combo_box name="mode_combo" tool_tip="Seleziona la modalità. Seleziona Di base per esplorare facilmente e rapidamente e per la chat. Seleziona Avanzata per accedere ad altre funzionalità.">
- <combo_box.item label="Modalità di base" name="Basic"/>
- <combo_box.item label="Modalità Avanzata" name="Advanced"/>
- </combo_box>
- <button name="media_toggle_btn" tool_tip="Attiva/ferma tutti i media (musica, video, pagine Web)"/>
- <button name="volume_btn" tool_tip="Regolazione del volume globale"/>
-</panel>
diff --git a/indra/newview/skins/minimal/xui/ja/floater_camera.xml b/indra/newview/skins/minimal/xui/ja/floater_camera.xml
deleted file mode 100644
index 71a20c8e18..0000000000
--- a/indra/newview/skins/minimal/xui/ja/floater_camera.xml
+++ /dev/null
@@ -1,65 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="camera_floater">
- <floater.string name="rotate_tooltip">
- フォーカスを中心ã«ã‚«ãƒ¡ãƒ©ã‚’回転
- </floater.string>
- <floater.string name="zoom_tooltip">
- フォーカスã«å‘ã‘ã¦ã‚«ãƒ¡ãƒ©ã‚’ズーム
- </floater.string>
- <floater.string name="move_tooltip">
- カメラを上下左å³ã«ç§»å‹•
- </floater.string>
- <floater.string name="camera_modes_title">
- カメラモード
- </floater.string>
- <floater.string name="pan_mode_title">
- 旋回 - ズーム - 水平・垂直移動
- </floater.string>
- <floater.string name="presets_mode_title">
- 事å‰è¨­å®šã®è¦–野
- </floater.string>
- <floater.string name="free_mode_title">
- オブジェクトを見る
- </floater.string>
- <panel name="controls">
- <panel name="preset_views_list">
- <panel_camera_item name="front_view">
- <panel_camera_item.text name="front_view_text">
- 剿–¹è¦–界
- </panel_camera_item.text>
- </panel_camera_item>
- <panel_camera_item name="group_view">
- <panel_camera_item.text name="side_view_text">
- グループ視界
- </panel_camera_item.text>
- </panel_camera_item>
- <panel_camera_item name="rear_view">
- <panel_camera_item.text name="rear_view_text">
- 後方視界
- </panel_camera_item.text>
- </panel_camera_item>
- </panel>
- <panel name="camera_modes_list">
- <panel_camera_item name="object_view">
- <panel_camera_item.text name="object_view_text">
- オブジェクト視点
- </panel_camera_item.text>
- </panel_camera_item>
- <panel_camera_item name="mouselook_view">
- <panel_camera_item.text name="mouselook_view_text">
- 一人称視点
- </panel_camera_item.text>
- </panel_camera_item>
- </panel>
- <panel name="zoom" tool_tip="å‘ã„ã¦ã„る方法ã«ã‚«ãƒ¡ãƒ©ã‚’ズーム">
- <joystick_rotate name="cam_rotate_stick" tool_tip="自分を軸ã«ã‚«ãƒ¡ãƒ©ã‚’回ã™"/>
- <slider_bar name="zoom_slider" tool_tip="å‘ã„ã¦ã„ã‚‹æ–¹å‘ã«ã‚«ãƒ¡ãƒ©ã‚’ズーム"/>
- <joystick_track name="cam_track_stick" tool_tip="カメラを上下左å³ã«å‹•ã‹ã—ã¾ã™"/>
- </panel>
- </panel>
- <panel name="buttons">
- <button label="" name="presets_btn" tool_tip="事å‰è¨­å®šã®è¦–野"/>
- <button label="" name="pan_btn" tool_tip="旋回 - ズーム - 水平・垂直移動"/>
- <button label="" name="avatarview_btn" tool_tip="カメラモード"/>
- </panel>
-</floater>
diff --git a/indra/newview/skins/minimal/xui/ja/floater_help_browser.xml b/indra/newview/skins/minimal/xui/ja/floater_help_browser.xml
deleted file mode 100644
index 1322343903..0000000000
--- a/indra/newview/skins/minimal/xui/ja/floater_help_browser.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_help_browser" title="ãƒã‚¦ãƒ„ー">
- <floater.string name="loading_text">
- ローディング...
- </floater.string>
- <layout_stack name="stack1">
- <layout_panel name="external_controls"/>
- </layout_stack>
-</floater>
diff --git a/indra/newview/skins/minimal/xui/ja/floater_media_browser.xml b/indra/newview/skins/minimal/xui/ja/floater_media_browser.xml
deleted file mode 100644
index 439c36dbe9..0000000000
--- a/indra/newview/skins/minimal/xui/ja/floater_media_browser.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_about" title="メディアブラウザ">
- <floater.string name="home_page_url">
- http://jp.secondlife.com
- </floater.string>
- <floater.string name="support_page_url">
- http://jp.secondlife.com/support
- </floater.string>
- <layout_stack name="stack1">
- <layout_panel name="nav_controls">
- <button label="戻る" name="back"/>
- <button label="å‰" name="forward"/>
- <button label="æ›´æ–°" name="reload"/>
- <button label="検索" name="go"/>
- </layout_panel>
- <layout_panel name="time_controls">
- <button label="å·»ãæˆ»ã—" name="rewind"/>
- <button label="åœæ­¢" name="stop"/>
- <button label="æ—©é€ã‚Š" name="seek"/>
- </layout_panel>
- <layout_panel name="parcel_owner_controls">
- <button label="ç¾åœ¨ã®ãƒšãƒ¼ã‚¸ã‚’区画ã«é€ã‚‹" name="assign"/>
- </layout_panel>
- <layout_panel name="external_controls">
- <button label="Web ブラウザã§é–‹ã" name="open_browser"/>
- <check_box label="常㫠Web ブラウザã§é–‹ã" name="open_always"/>
- <button label="é–‰ã˜ã‚‹" name="close"/>
- </layout_panel>
- </layout_stack>
-</floater>
diff --git a/indra/newview/skins/minimal/xui/ja/floater_nearby_chat.xml b/indra/newview/skins/minimal/xui/ja/floater_nearby_chat.xml
deleted file mode 100644
index a29c6a0630..0000000000
--- a/indra/newview/skins/minimal/xui/ja/floater_nearby_chat.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="nearby_chat" title="è¿‘ãã®ãƒãƒ£ãƒƒãƒˆ">
- <check_box label="ãƒãƒ£ãƒƒãƒˆã‚’翻訳(Google翻訳)" name="translate_chat_checkbox"/>
-</floater>
diff --git a/indra/newview/skins/minimal/xui/ja/floater_web_content.xml b/indra/newview/skins/minimal/xui/ja/floater_web_content.xml
deleted file mode 100644
index 48fe8aee78..0000000000
--- a/indra/newview/skins/minimal/xui/ja/floater_web_content.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_web_content" title="">
- <layout_stack name="stack1">
- <layout_panel name="nav_controls">
- <button name="back" tool_tip="å‰ã¸"/>
- <button name="forward" tool_tip="次ã¸"/>
- <button name="stop" tool_tip="ãƒŠãƒ“ã‚²ãƒ¼ã‚·ãƒ§ãƒ³ã‚’åœæ­¢"/>
- <button name="reload" tool_tip="ページを更新"/>
- <combo_box name="address" tool_tip="ã“ã“ã« URL を入力"/>
- <icon name="media_secure_lock_flag" tool_tip="安全ãªé–²è¦§"/>
- <button name="popexternal" tool_tip="ã“ã® URL をブラウザã§é–‹ã"/>
- </layout_panel>
- </layout_stack>
-</floater>
diff --git a/indra/newview/skins/minimal/xui/ja/inspect_avatar.xml b/indra/newview/skins/minimal/xui/ja/inspect_avatar.xml
deleted file mode 100644
index 42b67cd333..0000000000
--- a/indra/newview/skins/minimal/xui/ja/inspect_avatar.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<!--
- Not can_close / no title to avoid window chrome
- Single instance - only have one at a time, recycle it each spawn
--->
-<floater name="inspect_avatar">
- <string name="Subtitle">
- [AGE]
- </string>
- <string name="Details">
- [SL_PROFILE]
- </string>
- <text name="user_name_small" value="Grumpity ProductEngine with a long name"/>
- <text name="user_slid" value="james.linden"/>
- <text name="user_subtitle" value="11 Months, 3 days old"/>
- <text name="user_details">
- This is my second life description and I really think it is great.But for some reason my description is super extra long because I like to talk a whole lot
- </text>
- <slider name="volume_slider" tool_tip="ボイス音é‡" value="0.5"/>
- <button label="フレンド登録" name="add_friend_btn"/>
- <button label="IM" name="im_btn"/>
- <button label="プロフィール" name="view_profile_btn"/>
- <panel name="moderator_panel">
- <button label="ボイスを無効" name="disable_voice"/>
- <button label="ボイスを有効" name="enable_voice"/>
- </panel>
-</floater>
diff --git a/indra/newview/skins/minimal/xui/ja/inspect_object.xml b/indra/newview/skins/minimal/xui/ja/inspect_object.xml
deleted file mode 100644
index e6999ac9b1..0000000000
--- a/indra/newview/skins/minimal/xui/ja/inspect_object.xml
+++ /dev/null
@@ -1,48 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<!--
- Not can_close / no title to avoid window chrome
- Single instance - only have one at a time, recycle it each spawn
--->
-<floater name="inspect_object">
- <string name="Creator">
- 制作者: [CREATOR]
- </string>
- <string name="CreatorAndOwner">
- [CREATOR]ã«ã‚ˆã‚‹ãƒã‚§ãƒƒã‚¯
-[OWNER]ã«ã‚ˆã‚‹ãƒã‚§ãƒƒã‚¯
- </string>
- <string name="Price">
- L$[AMOUNT]
- </string>
- <string name="PriceFree">
- ç„¡æ–™ã§ã™ï¼
- </string>
- <string name="Touch">
- 触る
- </string>
- <string name="Sit">
- 座る
- </string>
- <text name="object_name" value="二行ã«ã‚ãŸã‚‹é•·ã„オブジェクトåをテスト"/>
- <text name="object_creator">
- by secondlife:///app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/about
-owner secondlife:///app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/about
- </text>
- <text name="price_text">
- L$30,000
- </text>
- <text name="object_description">
- This is a really long description for an object being as how it is at least 80 characters in length and so but maybe more like 120 at this point. Who knows, really?
- </text>
- <text name="object_media_url">
- http://www.superdupertest.com
- </text>
- <button label="è²·ã†" name="buy_btn"/>
- <button label="支払ã†" name="pay_btn"/>
- <button label="コピーをå–ã‚‹" name="take_free_copy_btn"/>
- <button label="触る" name="touch_btn"/>
- <button label="座る" name="sit_btn"/>
- <button label="é–‹ã" name="open_btn"/>
- <icon name="secure_browsing" tool_tip="安全ãªé–²è¦§"/>
- <button label="詳細" name="more_info_btn"/>
-</floater>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_add_wearable_gear.xml b/indra/newview/skins/minimal/xui/ja/menu_add_wearable_gear.xml
deleted file mode 100644
index 982a03c6a8..0000000000
--- a/indra/newview/skins/minimal/xui/ja/menu_add_wearable_gear.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Add Wearable Gear Menu">
- <menu_item_check label="æ–°ã—ã„é †ã«ä¸¦ã¹æ›¿ãˆ" name="sort_by_most_recent"/>
- <menu_item_check label="åå‰ã§ä¸¦ã¹æ›¿ãˆ" name="sort_by_name"/>
- <menu_item_check label="タイプã«ã‚ˆã‚‹ä¸¦ã¹æ›¿ãˆ" name="sort_by_type"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_attachment_other.xml b/indra/newview/skins/minimal/xui/ja/menu_attachment_other.xml
deleted file mode 100644
index 5adf0b3745..0000000000
--- a/indra/newview/skins/minimal/xui/ja/menu_attachment_other.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<!-- *NOTE: See also menu_avatar_other.xml -->
-<context_menu name="Avatar Pie">
- <menu_item_call label="プロフィールã®è¡¨ç¤º" name="Profile..."/>
- <menu_item_call label="フレンド登録" name="Add Friend"/>
- <menu_item_call label="IM" name="Send IM..."/>
- <menu_item_call label="コール" name="Call"/>
- <menu_item_call label="ã‚°ãƒ«ãƒ¼ãƒ—ã«æ‹›å¾…" name="Invite..."/>
- <menu_item_call label="ブロック" name="Avatar Mute"/>
- <menu_item_call label="報告" name="abuse"/>
- <menu_item_call label="フリーズ" name="Freeze..."/>
- <menu_item_call label="追放" name="Eject..."/>
- <menu_item_call label="テクスãƒãƒ£ã®ãƒ‡ãƒãƒƒã‚°" name="Debug..."/>
- <menu_item_call label="ズームイン" name="Zoom In"/>
- <menu_item_call label="支払ã†" name="Pay..."/>
- <menu_item_call label="オブジェクトã®ãƒ—ロフィール" name="Object Inspect"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_attachment_self.xml b/indra/newview/skins/minimal/xui/ja/menu_attachment_self.xml
deleted file mode 100644
index 830ddc9f63..0000000000
--- a/indra/newview/skins/minimal/xui/ja/menu_attachment_self.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Attachment Pie">
- <menu_item_call label="タッãƒ" name="Attachment Object Touch"/>
- <menu_item_call label="編集" name="Edit..."/>
- <menu_item_call label="å–り外ã™" name="Detach"/>
- <menu_item_call label="座る" name="Sit Down Here"/>
- <menu_item_call label="ç«‹ã¡ä¸ŠãŒã‚‹" name="Stand Up"/>
- <menu_item_call label="容姿" name="Change Outfit"/>
- <menu_item_call label="アウトフィットã®ç·¨é›†" name="Edit Outfit"/>
- <menu_item_call label="シェイプã®ç·¨é›†" name="Edit My Shape"/>
- <menu_item_call label="フレンド" name="Friends..."/>
- <menu_item_call label="グループ" name="Groups..."/>
- <menu_item_call label="プロフィール" name="Profile..."/>
- <menu_item_call label="テクスãƒãƒ£ã®ãƒ‡ãƒãƒƒã‚°" name="Debug..."/>
- <menu_item_call label="下ã«è½ã¨ã™" name="Drop"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_avatar_icon.xml b/indra/newview/skins/minimal/xui/ja/menu_avatar_icon.xml
deleted file mode 100644
index b04f602134..0000000000
--- a/indra/newview/skins/minimal/xui/ja/menu_avatar_icon.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Avatar Icon Menu">
- <menu_item_call label="プロフィールã®è¡¨ç¤º" name="Show Profile"/>
- <menu_item_call label="IMã‚’é€ä¿¡..." name="Send IM"/>
- <menu_item_call label="フレンドを追加..." name="Add Friend"/>
- <menu_item_call label="フレンドを削除..." name="Remove Friend"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_avatar_other.xml b/indra/newview/skins/minimal/xui/ja/menu_avatar_other.xml
deleted file mode 100644
index 54dd96f5ef..0000000000
--- a/indra/newview/skins/minimal/xui/ja/menu_avatar_other.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<!-- *NOTE: See also menu_attachment_other.xml -->
-<context_menu name="Avatar Pie">
- <menu_item_call label="プロフィールã®è¡¨ç¤º" name="Profile..."/>
- <menu_item_call label="フレンド登録" name="Add Friend"/>
- <menu_item_call label="IM" name="Send IM..."/>
- <menu_item_call label="コール" name="Call"/>
- <menu_item_call label="ã‚°ãƒ«ãƒ¼ãƒ—ã«æ‹›å¾…" name="Invite..."/>
- <menu_item_call label="ブロック" name="Avatar Mute"/>
- <menu_item_call label="報告" name="abuse"/>
- <menu_item_call label="フリーズ" name="Freeze..."/>
- <menu_item_call label="追放" name="Eject..."/>
- <menu_item_call label="テクスãƒãƒ£ã®ãƒ‡ãƒãƒƒã‚°" name="Debug..."/>
- <menu_item_call label="ズームイン" name="Zoom In"/>
- <menu_item_call label="支払ã†" name="Pay..."/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_avatar_self.xml b/indra/newview/skins/minimal/xui/ja/menu_avatar_self.xml
deleted file mode 100644
index 4709522665..0000000000
--- a/indra/newview/skins/minimal/xui/ja/menu_avatar_self.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Self Pie">
- <menu_item_call label="座る" name="Sit Down Here"/>
- <menu_item_call label="ç«‹ã¡ä¸ŠãŒã‚‹" name="Stand Up"/>
- <context_menu label="å–り外ã™" name="Take Off &gt;">
- <context_menu label="衣類" name="Clothes &gt;">
- <menu_item_call label="シャツ" name="Shirt"/>
- <menu_item_call label="パンツ" name="Pants"/>
- <menu_item_call label="スカート" name="Skirt"/>
- <menu_item_call label="é´" name="Shoes"/>
- <menu_item_call label="é´ä¸‹" name="Socks"/>
- <menu_item_call label="ジャケット" name="Jacket"/>
- <menu_item_call label="手袋" name="Gloves"/>
- <menu_item_call label="下ç€ã‚·ãƒ£ãƒ„" name="Self Undershirt"/>
- <menu_item_call label="下ç€ãƒ‘ンツ" name="Self Underpants"/>
- <menu_item_call label="タトゥ" name="Self Tattoo"/>
- <menu_item_call label="物ç†ä½œç”¨" name="Self Physics"/>
- <menu_item_call label="アルファ" name="Self Alpha"/>
- <menu_item_call label="ã™ã¹ã¦ã®è¡£é¡ž" name="All Clothes"/>
- </context_menu>
- <context_menu label="HUD" name="Object Detach HUD"/>
- <context_menu label="å–り外ã™" name="Object Detach"/>
- <menu_item_call label="ã™ã¹ã¦å–り外ã™" name="Detach All"/>
- </context_menu>
- <menu_item_call label="容姿" name="Chenge Outfit"/>
- <menu_item_call label="アウトフィットを編集" name="Edit Outfit"/>
- <menu_item_call label="シェイプを編集" name="Edit My Shape"/>
- <menu_item_call label="フレンド" name="Friends..."/>
- <menu_item_call label="グループ" name="Groups..."/>
- <menu_item_call label="プロフィール" name="Profile..."/>
- <menu_item_call label="テクスãƒãƒ£ã®ãƒ‡ãƒãƒƒã‚°" name="Debug..."/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_bottomtray.xml b/indra/newview/skins/minimal/xui/ja/menu_bottomtray.xml
deleted file mode 100644
index 7f106c1ab5..0000000000
--- a/indra/newview/skins/minimal/xui/ja/menu_bottomtray.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="hide_camera_move_controls_menu">
- <menu_item_check label="スピーカーボタン" name="EnableVoiceChat"/>
- <menu_item_check label="ジェスãƒãƒ£ãƒ¼ãƒœã‚¿ãƒ³" name="ShowGestureButton"/>
- <menu_item_check label="移動ボタン" name="ShowMoveButton"/>
- <menu_item_check label="視界ボタン" name="ShowCameraButton"/>
- <menu_item_check label="スナップショットボタン" name="ShowSnapshotButton"/>
- <menu_item_check label="制作ボタン" name="ShowBuildButton"/>
- <menu_item_check label="検索ボタン" name="ShowSearchButton"/>
- <menu_item_check label="地図ボタン" name="ShowWorldMapButton"/>
- <menu_item_check label="ミニマップボタン" name="ShowMiniMapButton"/>
- <menu_item_call label="切りå–り" name="NearbyChatBar_Cut"/>
- <menu_item_call label="コピー" name="NearbyChatBar_Copy"/>
- <menu_item_call label="貼り付ã‘" name="NearbyChatBar_Paste"/>
- <menu_item_call label="削除" name="NearbyChatBar_Delete"/>
- <menu_item_call label="ã™ã¹ã¦é¸æŠž" name="NearbyChatBar_Select_All"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_cof_attachment.xml b/indra/newview/skins/minimal/xui/ja/menu_cof_attachment.xml
deleted file mode 100644
index e786d02e40..0000000000
--- a/indra/newview/skins/minimal/xui/ja/menu_cof_attachment.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="COF Attachment">
- <menu_item_call label="å–り外ã™" name="detach"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_cof_body_part.xml b/indra/newview/skins/minimal/xui/ja/menu_cof_body_part.xml
deleted file mode 100644
index eb5faa2545..0000000000
--- a/indra/newview/skins/minimal/xui/ja/menu_cof_body_part.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="COF Body">
- <menu_item_call label="交æ›" name="replace"/>
- <menu_item_call label="編集" name="edit"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_cof_clothing.xml b/indra/newview/skins/minimal/xui/ja/menu_cof_clothing.xml
deleted file mode 100644
index d984342896..0000000000
--- a/indra/newview/skins/minimal/xui/ja/menu_cof_clothing.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="COF Clothing">
- <menu_item_call label="å–り外ã™" name="take_off"/>
- <menu_item_call label="編集" name="edit"/>
- <menu_item_call label="交æ›" name="replace"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_cof_gear.xml b/indra/newview/skins/minimal/xui/ja/menu_cof_gear.xml
deleted file mode 100644
index a071abbd2e..0000000000
--- a/indra/newview/skins/minimal/xui/ja/menu_cof_gear.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Gear COF">
- <menu label="衣類" name="COF.Gear.New_Clothes"/>
- <menu label="æ–°ã—ã„身体部ä½" name="COF.Geear.New_Body_Parts"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_edit.xml b/indra/newview/skins/minimal/xui/ja/menu_edit.xml
deleted file mode 100644
index c2ef0179b2..0000000000
--- a/indra/newview/skins/minimal/xui/ja/menu_edit.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu label="編集" name="Edit">
- <menu_item_call label="å…ƒã«æˆ»ã™" name="Undo"/>
- <menu_item_call label="やり直ã—" name="Redo"/>
- <menu_item_call label="切りå–り" name="Cut"/>
- <menu_item_call label="コピー" name="Copy"/>
- <menu_item_call label="貼り付ã‘" name="Paste"/>
- <menu_item_call label="削除" name="Delete"/>
- <menu_item_call label="複製" name="Duplicate"/>
- <menu_item_call label="ã™ã¹ã¦é¸æŠž" name="Select All"/>
- <menu_item_call label="é¸æŠžè§£é™¤" name="Deselect"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_favorites.xml b/indra/newview/skins/minimal/xui/ja/menu_favorites.xml
deleted file mode 100644
index 4708b1446c..0000000000
--- a/indra/newview/skins/minimal/xui/ja/menu_favorites.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Popup">
- <menu_item_call label="テレãƒãƒ¼ãƒˆ" name="Teleport To Landmark"/>
- <menu_item_call label="ランドマークを表示・編集" name="Landmark Open"/>
- <menu_item_call label="SLurl をコピー" name="Copy slurl"/>
- <menu_item_call label="地図ã«è¡¨ç¤º" name="Show On Map"/>
- <menu_item_call label="コピー" name="Landmark Copy"/>
- <menu_item_call label="貼り付ã‘" name="Landmark Paste"/>
- <menu_item_call label="削除" name="Delete"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_gesture_gear.xml b/indra/newview/skins/minimal/xui/ja/menu_gesture_gear.xml
deleted file mode 100644
index abf490a247..0000000000
--- a/indra/newview/skins/minimal/xui/ja/menu_gesture_gear.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_gesture_gear">
- <menu_item_call label="ãŠæ°—ã«å…¥ã‚Šã‹ã‚‰ã®è¿½åŠ ãƒ»å‰Šé™¤" name="activate"/>
- <menu_item_call label="コピー" name="copy_gesture"/>
- <menu_item_call label="貼り付ã‘" name="paste"/>
- <menu_item_call label="UUID をコピー" name="copy_uuid"/>
- <menu_item_call label="ç¾åœ¨ã®ã‚¢ã‚¦ãƒˆãƒ•ィットã«ä¿å­˜" name="save_to_outfit"/>
- <menu_item_call label="編集" name="edit_gesture"/>
- <menu_item_call label="調ã¹ã‚‹" name="inspect"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_group_plus.xml b/indra/newview/skins/minimal/xui/ja/menu_group_plus.xml
deleted file mode 100644
index 3787f7d645..0000000000
--- a/indra/newview/skins/minimal/xui/ja/menu_group_plus.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_group_plus">
- <menu_item_call label="グループã«å‚加..." name="item_join"/>
- <menu_item_call label="æ–°ã—ã„グループ..." name="item_new"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_hide_navbar.xml b/indra/newview/skins/minimal/xui/ja/menu_hide_navbar.xml
deleted file mode 100644
index 3a1ae49700..0000000000
--- a/indra/newview/skins/minimal/xui/ja/menu_hide_navbar.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="hide_navbar_menu">
- <menu_item_check label="ナビゲーションãƒãƒ¼ã‚’表示" name="ShowNavbarNavigationPanel"/>
- <menu_item_check label="ãŠæ°—ã«å…¥ã‚Šãƒãƒ¼ã‚’表示" name="ShowNavbarFavoritesPanel"/>
- <menu_item_check label="「場所ã€ã®ãƒŸãƒ‹ãƒ•ィールドを表示" name="ShowMiniLocationPanel"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_im_well_button.xml b/indra/newview/skins/minimal/xui/ja/menu_im_well_button.xml
deleted file mode 100644
index 3397004bd7..0000000000
--- a/indra/newview/skins/minimal/xui/ja/menu_im_well_button.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="IM Well Button Context Menu">
- <menu_item_call label="ã™ã¹ã¦é–‰ã˜ã‚‹" name="Close All"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_imchiclet_adhoc.xml b/indra/newview/skins/minimal/xui/ja/menu_imchiclet_adhoc.xml
deleted file mode 100644
index 8cd6fa4a27..0000000000
--- a/indra/newview/skins/minimal/xui/ja/menu_imchiclet_adhoc.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="IMChiclet AdHoc Menu">
- <menu_item_call label="セッション終了" name="End Session"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_imchiclet_group.xml b/indra/newview/skins/minimal/xui/ja/menu_imchiclet_group.xml
deleted file mode 100644
index 5bcb96f083..0000000000
--- a/indra/newview/skins/minimal/xui/ja/menu_imchiclet_group.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="IMChiclet Group Menu">
- <menu_item_call label="グループ情報" name="Show Profile"/>
- <menu_item_call label="セッションを表示" name="Chat"/>
- <menu_item_call label="セッション終了" name="End Session"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_imchiclet_p2p.xml b/indra/newview/skins/minimal/xui/ja/menu_imchiclet_p2p.xml
deleted file mode 100644
index 5453f998fa..0000000000
--- a/indra/newview/skins/minimal/xui/ja/menu_imchiclet_p2p.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="IMChiclet P2P Menu">
- <menu_item_call label="プロフィールã®è¡¨ç¤º" name="Show Profile"/>
- <menu_item_call label="フレンド登録" name="Add Friend"/>
- <menu_item_call label="セッションを表示" name="Send IM"/>
- <menu_item_call label="セッション終了" name="End Session"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_inspect_avatar_gear.xml b/indra/newview/skins/minimal/xui/ja/menu_inspect_avatar_gear.xml
deleted file mode 100644
index 9d0d0f10a6..0000000000
--- a/indra/newview/skins/minimal/xui/ja/menu_inspect_avatar_gear.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<toggleable_menu name="Gear Menu">
- <menu_item_call label="プロフィールã®è¡¨ç¤º" name="view_profile"/>
- <menu_item_call label="フレンド登録" name="add_friend"/>
- <menu_item_call label="IM" name="im"/>
- <menu_item_call label="コール" name="call"/>
- <menu_item_call label="テレãƒãƒ¼ãƒˆ" name="teleport"/>
- <menu_item_call label="ã‚°ãƒ«ãƒ¼ãƒ—ã«æ‹›å¾…" name="invite_to_group"/>
- <menu_item_call label="ブロック" name="block"/>
- <menu_item_call label="ブロック解除" name="unblock"/>
- <menu_item_call label="報告" name="report"/>
- <menu_item_call label="フリーズ" name="freeze"/>
- <menu_item_call label="追放" name="eject"/>
- <menu_item_call label="追放" name="kick"/>
- <menu_item_call label="CSR" name="csr"/>
- <menu_item_call label="テクスãƒãƒ£ã®ãƒ‡ãƒãƒƒã‚°" name="debug"/>
- <menu_item_call label="åœ°å›³ã§æŽ¢ã™" name="find_on_map"/>
- <menu_item_call label="ズームイン" name="zoom_in"/>
- <menu_item_call label="支払ã†" name="pay"/>
- <menu_item_call label="共有" name="share"/>
-</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_inspect_object_gear.xml b/indra/newview/skins/minimal/xui/ja/menu_inspect_object_gear.xml
deleted file mode 100644
index 2edade70bf..0000000000
--- a/indra/newview/skins/minimal/xui/ja/menu_inspect_object_gear.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<menu name="Gear Menu">
- <menu_item_call label="触る" name="touch"/>
- <menu_item_call label="座る" name="sit"/>
- <menu_item_call label="支払ã†" name="pay"/>
- <menu_item_call label="è²·ã†" name="buy"/>
- <menu_item_call label="å–ã‚‹" name="take"/>
- <menu_item_call label="コピーをå–ã‚‹" name="take_copy"/>
- <menu_item_call label="é–‹ã" name="open"/>
- <menu_item_call label="編集" name="edit"/>
- <menu_item_call label="装ç€" name="wear"/>
- <menu_item_call label="追加" name="add"/>
- <menu_item_call label="報告" name="report"/>
- <menu_item_call label="ブロック" name="block"/>
- <menu_item_call label="ズームイン" name="zoom_in"/>
- <menu_item_call label="削除" name="remove"/>
- <menu_item_call label="詳細" name="more_info"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_inspect_self_gear.xml b/indra/newview/skins/minimal/xui/ja/menu_inspect_self_gear.xml
deleted file mode 100644
index e3e206f3aa..0000000000
--- a/indra/newview/skins/minimal/xui/ja/menu_inspect_self_gear.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<toggleable_menu name="Gear Menu">
- <menu_item_call label="座る" name="Sit Down Here"/>
- <menu_item_call label="ç«‹ã¡ä¸ŠãŒã‚‹" name="Stand Up"/>
- <context_menu label="å–り外ã™" name="Take Off &gt;">
- <context_menu label="衣類" name="Clothes &gt;">
- <menu_item_call label="シャツ" name="Shirt"/>
- <menu_item_call label="パンツ" name="Pants"/>
- <menu_item_call label="スカート" name="Skirt"/>
- <menu_item_call label="é´" name="Shoes"/>
- <menu_item_call label="é´ä¸‹" name="Socks"/>
- <menu_item_call label="ジャケット" name="Jacket"/>
- <menu_item_call label="手袋" name="Gloves"/>
- <menu_item_call label="下ç€ã‚·ãƒ£ãƒ„" name="Self Undershirt"/>
- <menu_item_call label="下ç€ãƒ‘ンツ" name="Self Underpants"/>
- <menu_item_call label="タトゥ" name="Self Tattoo"/>
- <menu_item_call label="アルファ" name="Self Alpha"/>
- <menu_item_call label="ã™ã¹ã¦ã®è¡£é¡ž" name="All Clothes"/>
- </context_menu>
- <context_menu label="HUD" name="Object Detach HUD"/>
- <context_menu label="å–り外ã™" name="Object Detach"/>
- <menu_item_call label="ã™ã¹ã¦å–り外ã™" name="Detach All"/>
- </context_menu>
- <menu_item_call label="アウトフィットã®å¤‰æ›´" name="Chenge Outfit"/>
- <menu_item_call label="アウトフィットã®ç·¨é›†" name="Edit Outfit"/>
- <menu_item_call label="シェイプã®ç·¨é›†" name="Edit My Shape"/>
- <menu_item_call label="フレンド" name="Friends..."/>
- <menu_item_call label="グループ" name="Groups..."/>
- <menu_item_call label="プロフィール" name="Profile..."/>
- <menu_item_call label="テクスãƒãƒ£ã®ãƒ‡ãƒãƒƒã‚°" name="Debug..."/>
-</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_inv_offer_chiclet.xml b/indra/newview/skins/minimal/xui/ja/menu_inv_offer_chiclet.xml
deleted file mode 100644
index 9a4a8138f5..0000000000
--- a/indra/newview/skins/minimal/xui/ja/menu_inv_offer_chiclet.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="InvOfferChiclet Menu">
- <menu_item_call label="é–‰ã˜ã‚‹" name="Close"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_inventory.xml b/indra/newview/skins/minimal/xui/ja/menu_inventory.xml
deleted file mode 100644
index f78ec09e5e..0000000000
--- a/indra/newview/skins/minimal/xui/ja/menu_inventory.xml
+++ /dev/null
@@ -1,87 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Popup">
- <menu_item_call label="共有" name="Share"/>
- <menu_item_call label="購入" name="Task Buy"/>
- <menu_item_call label="é–‹ã" name="Task Open"/>
- <menu_item_call label="å†ç”Ÿ" name="Task Play"/>
- <menu_item_call label="プロパティ" name="Task Properties"/>
- <menu_item_call label="åå‰ã®å¤‰æ›´" name="Task Rename"/>
- <menu_item_call label="削除" name="Task Remove"/>
- <menu_item_call label="ã”ã¿ç®±ã‚’空ã«ã™ã‚‹" name="Empty Trash"/>
- <menu_item_call label="紛失物フォルダを空ã«ã™ã‚‹" name="Empty Lost And Found"/>
- <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 Gesture"/>
- <menu label="æ–°ã—ã„衣類" name="New Clothes">
- <menu_item_call label="æ–°ã—ã„シャツ" name="New Shirt"/>
- <menu_item_call label="æ–°ã—ã„ズボン" name="New Pants"/>
- <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 Gloves"/>
- <menu_item_call label="æ–°ã—ã„下ç€" name="New Undershirt"/>
- <menu_item_call label="æ–°ã—ã„パンツ" name="New Underpants"/>
- <menu_item_call label="æ–°ã—ã„アルファマスク" name="New Alpha Mask"/>
- <menu_item_call label="æ–°ã—ã„タトゥ" name="New Tattoo"/>
- <menu_item_call label="æ–°è¦ã®ç‰©ç†ä½œç”¨" name="New Physics"/>
- </menu>
- <menu label="æ–°ã—ã„身体部ä½" name="New Body Parts">
- <menu_item_call label="æ–°ã—ã„シェイプ(体型)" name="New Shape"/>
- <menu_item_call label="æ–°ã—ã„スキン" name="New Skin"/>
- <menu_item_call label="æ–°ã—ã„髪" name="New Hair"/>
- <menu_item_call label="æ–°ã—ã„眼" name="New Eyes"/>
- </menu>
- <menu label="種類を変更" name="Change Type">
- <menu_item_call label="デフォルト" name="Default"/>
- <menu_item_call label="手袋" name="Gloves"/>
- <menu_item_call label="ジャケット" name="Jacket"/>
- <menu_item_call label="パンツ" name="Pants"/>
- <menu_item_call label="シェイプ" name="Shape"/>
- <menu_item_call label="é´" name="Shoes"/>
- <menu_item_call label="シャツ" name="Shirt"/>
- <menu_item_call label="スカート" name="Skirt"/>
- <menu_item_call label="下ç€ãƒ‘ンツ" name="Underpants"/>
- <menu_item_call label="下ç€ã‚·ãƒ£ãƒ„" name="Undershirt"/>
- </menu>
- <menu_item_call label="テレãƒãƒ¼ãƒˆ" name="Landmark Open"/>
- <menu_item_call label="é–‹ã" name="Animation Open"/>
- <menu_item_call label="é–‹ã" name="Sound Open"/>
- <menu_item_call label="ç€ç”¨ä¸­ã®ã‚¢ã‚¦ãƒˆãƒ•ィットを入れ替ãˆã‚‹" name="Replace Outfit"/>
- <menu_item_call label="ç€ç”¨ä¸­ã®ã‚¢ã‚¦ãƒˆãƒ•ィットã«è¿½åŠ ã™ã‚‹" name="Add To Outfit"/>
- <menu_item_call label="ç€ç”¨ä¸­ã®ã‚¢ã‚¦ãƒˆãƒ•ィットã‹ã‚‰å–り除ã" name="Remove From Outfit"/>
- <menu_item_call label="オリジナルを探ã™" name="Find Original"/>
- <menu_item_call label="アイテムを除外ã™ã‚‹" name="Purge Item"/>
- <menu_item_call label="アイテムを復元ã™ã‚‹" name="Restore Item"/>
- <menu_item_call label="é–‹ã" name="Open"/>
- <menu_item_call label="オリジナルを開ãã¾ã™" name="Open Original"/>
- <menu_item_call label="プロパティ" name="Properties"/>
- <menu_item_call label="åå‰ã‚’変更ã™ã‚‹" name="Rename"/>
- <menu_item_call label="UUID をコピーã™ã‚‹" name="Copy Asset UUID"/>
- <menu_item_call label="コピー" name="Copy"/>
- <menu_item_call label="貼り付ã‘" name="Paste"/>
- <menu_item_call label="リンクを貼り付ã‘ã‚‹" name="Paste As Link"/>
- <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="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="Conference Chat"/>
- <menu_item_call label="アクティブ" name="Activate"/>
- <menu_item_call label="éžã‚¢ã‚¯ãƒ†ã‚£ãƒ–" name="Deactivate"/>
- <menu_item_call label="別åã§ä¿å­˜ã™ã‚‹" name="Save As"/>
- <menu_item_call label="自分ã‹ã‚‰å–り外ã™" name="Detach From Yourself"/>
- <menu_item_call label="装ç€" name="Wearable And Object Wear"/>
- <menu label="装ç€å…ˆ" name="Attach To"/>
- <menu label="HUD 装ç€å…ˆ" name="Attach To HUD"/>
- <menu_item_call label="編集" name="Wearable Edit"/>
- <menu_item_call label="追加" name="Wearable Add"/>
- <menu_item_call label="å–り外ã™" name="Take Off"/>
- <menu_item_call label="ï¼ï¼ã‚ªãƒ—ションãªã—ï¼ï¼" name="--no options--"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_inventory_add.xml b/indra/newview/skins/minimal/xui/ja/menu_inventory_add.xml
deleted file mode 100644
index 6c754e5d08..0000000000
--- a/indra/newview/skins/minimal/xui/ja/menu_inventory_add.xml
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_inventory_add">
- <menu label="アップロード" name="upload">
- <menu_item_call label="ç”»åƒ ï¼ˆL$ [COST] )..." name="Upload Image"/>
- <menu_item_call label="サウンド (L$[COST] )..." name="Upload Sound"/>
- <menu_item_call label="アニメーション (L$ [COST] )..." name="Upload Animation"/>
- <menu_item_call label="一括 (ファイルã«ã¤ã L$[COST] )..." name="Bulk Upload"/>
- <menu_item_call label="デフォルトã®ã‚¢ãƒƒãƒ—ロード権é™ã‚’設定" name="perm prefs"/>
- </menu>
- <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 Gesture"/>
- <menu label="æ–°ã—ã„衣類" name="New Clothes">
- <menu_item_call label="æ–°ã—ã„シャツ" name="New Shirt"/>
- <menu_item_call label="æ–°ã—ã„パンツ" name="New Pants"/>
- <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 Gloves"/>
- <menu_item_call label="æ–°ã—ã„下ç€ï¼ˆä¸Šï¼‰" name="New Undershirt"/>
- <menu_item_call label="æ–°ã—ã„下ç€ï¼ˆä¸‹ï¼‰" name="New Underpants"/>
- <menu_item_call label="æ–°ã—ã„アルファ" name="New Alpha"/>
- <menu_item_call label="æ–°ã—ã„タトゥー" name="New Tattoo"/>
- <menu_item_call label="æ–°è¦ã®ç‰©ç†ä½œç”¨" name="New Physics"/>
- </menu>
- <menu label="æ–°ã—ã„身体部ä½" name="New Body Parts">
- <menu_item_call label="æ–°ã—ã„シェイプ(体型)" name="New Shape"/>
- <menu_item_call label="æ–°ã—ã„スキン" name="New Skin"/>
- <menu_item_call label="æ–°ã—ã„髪" name="New Hair"/>
- <menu_item_call label="æ–°ã—ã„ç›®" name="New Eyes"/>
- </menu>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_inventory_gear_default.xml b/indra/newview/skins/minimal/xui/ja/menu_inventory_gear_default.xml
deleted file mode 100644
index 1f425df83c..0000000000
--- a/indra/newview/skins/minimal/xui/ja/menu_inventory_gear_default.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<toggleable_menu name="menu_gear_default">
- <menu_item_call label="æ–°ã—ã„æŒã¡ç‰©ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦" name="new_window"/>
- <menu_item_check label="åå‰ã§ä¸¦ã¹æ›¿ãˆ" name="sort_by_name"/>
- <menu_item_check label="æ–°ã—ã„é †ã«ä¸¦ã¹æ›¿ãˆ" name="sort_by_recent"/>
- <menu_item_check label="フォルダを常ã«åå‰é †ã«ä¸¦ã¹ã‚‹" name="sort_folders_by_name"/>
- <menu_item_check label="システムフォルダを上ã«ã‚½ãƒ¼ãƒˆã™ã‚‹" name="sort_system_folders_to_top"/>
- <menu_item_call label="フィルターを表示" name="show_filters"/>
- <menu_item_call label="フィルターをリセット" name="reset_filters"/>
- <menu_item_call label="ã™ã¹ã¦ã®ãƒ•ォルダを閉ã˜ã‚‹" name="close_folders"/>
- <menu_item_call label="紛失物を空ã«ã™ã‚‹" name="empty_lostnfound"/>
- <menu_item_call label="別åã§ãƒ†ã‚¯ã‚¹ãƒãƒ£ã‚’ä¿å­˜" name="Save Texture As"/>
- <menu_item_call label="共有" name="Share"/>
- <menu_item_call label="オリジナルを表示" name="Find Original"/>
- <menu_item_call label="ã™ã¹ã¦ã®ãƒªãƒ³ã‚¯ã‚’表示" name="Find All Links"/>
- <menu_item_call label="ã”ã¿ç®±ã‚’空ã«ã™ã‚‹" name="empty_trash"/>
-</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_land.xml b/indra/newview/skins/minimal/xui/ja/menu_land.xml
deleted file mode 100644
index 89c122f14f..0000000000
--- a/indra/newview/skins/minimal/xui/ja/menu_land.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Land Pie">
- <menu_item_call label="土地情報" name="Place Information..."/>
- <menu_item_call label="ã“ã“ã«åº§ã‚‹" name="Sit Here"/>
- <menu_item_call label="ã“ã®åœŸåœ°ã‚’購入" name="Land Buy"/>
- <menu_item_call label="入場許å¯ã‚’購入" name="Land Buy Pass"/>
- <menu_item_call label="制作" name="Create"/>
- <menu_item_call label="地形を編集" name="Edit Terrain"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_landmark.xml b/indra/newview/skins/minimal/xui/ja/menu_landmark.xml
deleted file mode 100644
index c134422955..0000000000
--- a/indra/newview/skins/minimal/xui/ja/menu_landmark.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<toggleable_menu name="landmark_overflow_menu">
- <menu_item_call label="SLurl をコピー" name="copy"/>
- <menu_item_call label="削除" name="delete"/>
- <menu_item_call label="ピックを作æˆ" name="pick"/>
- <menu_item_call label="ãŠæ°—ã«å…¥ã‚Šãƒãƒ¼ã«è¿½åŠ " name="add_to_favbar"/>
-</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_login.xml b/indra/newview/skins/minimal/xui/ja/menu_login.xml
deleted file mode 100644
index 265f3ebcd0..0000000000
--- a/indra/newview/skins/minimal/xui/ja/menu_login.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu_bar name="Login Menu">
- <menu label="ミー" name="File">
- <menu_item_call label="環境設定" name="Preferences..."/>
- <menu_item_call label="[APP_NAME] を終了" name="Quit"/>
- </menu>
- <menu label="ヘルプ" name="Help">
- <menu_item_call label="[SECOND_LIFE] ヘルプ" name="Second Life Help"/>
- <menu_item_call label="[APP_NAME] ã«ã¤ã„ã¦" name="About Second Life"/>
- </menu>
- <menu_item_check label="デãƒãƒƒã‚°ãƒ¡ãƒ‹ãƒ¥ãƒ¼ã‚’表示ã™ã‚‹" name="Show Debug Menu"/>
- <menu label="デãƒãƒƒã‚°" name="Debug">
- <menu_item_call label="デãƒãƒƒã‚°è¨­å®šã‚’表示" name="Debug Settings"/>
- <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="TOS"/>
- <menu_item_call label="クリティカルメッセージを表示" name="Critical"/>
- <menu_item_call label="メディアブラウザã®ãƒ†ã‚¹ãƒˆ" name="Web Browser Test"/>
- <menu_item_call label="Web コンテンツフローターã®ãƒ†ã‚¹ãƒˆ" name="Web Content Floater Test"/>
- <menu_item_check label="グリッドピッカーを表示ã™ã‚‹" name="Show Grid Picker"/>
- <menu_item_call label="通知コンソールを表示ã™ã‚‹" name="Show Notifications Console"/>
- </menu>
-</menu_bar>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_mini_map.xml b/indra/newview/skins/minimal/xui/ja/menu_mini_map.xml
deleted file mode 100644
index 2e733ee24b..0000000000
--- a/indra/newview/skins/minimal/xui/ja/menu_mini_map.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Popup">
- <menu_item_call label="ズーム(近)" name="Zoom Close"/>
- <menu_item_call label="ズーム(中)" name="Zoom Medium"/>
- <menu_item_call label="ズーム(é ï¼‰" name="Zoom Far"/>
- <menu_item_call label="ズーム(デフォルト)" name="Zoom Default"/>
- <menu_item_check label="地図を回転" name="Rotate Map"/>
- <menu_item_check label="中央ã¸è‡ªå‹•移動" name="Auto Center"/>
- <menu_item_call label="追跡をやã‚ã‚‹" name="Stop Tracking"/>
- <menu_item_call label="世界地図" name="World Map"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_navbar.xml b/indra/newview/skins/minimal/xui/ja/menu_navbar.xml
deleted file mode 100644
index 9ae2e58198..0000000000
--- a/indra/newview/skins/minimal/xui/ja/menu_navbar.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Navbar Menu">
- <menu_item_check label="座標を表示" name="Show Coordinates"/>
- <menu_item_check label="区画ã®ãƒ—ロパティを表示" name="Show Parcel Properties"/>
- <menu_item_call label="ランドマーク" name="Landmark"/>
- <menu_item_call label="切りå–り" name="Cut"/>
- <menu_item_call label="コピー" name="Copy"/>
- <menu_item_call label="貼り付ã‘" name="Paste"/>
- <menu_item_call label="削除" name="Delete"/>
- <menu_item_call label="ã™ã¹ã¦é¸æŠž" name="Select All"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_nearby_chat.xml b/indra/newview/skins/minimal/xui/ja/menu_nearby_chat.xml
deleted file mode 100644
index c2e4a27686..0000000000
--- a/indra/newview/skins/minimal/xui/ja/menu_nearby_chat.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="NearBy Chat Menu">
- <menu_item_call label="è¿‘ãã®äººã‚’表示ã™ã‚‹..." name="nearby_people"/>
- <menu_item_check label="ブロックã•ã‚ŒãŸæ–‡å­—を表示" name="muted_text"/>
- <menu_item_check label="ãƒãƒ‡ã‚£ã‚¢ã‚¤ã‚³ãƒ³ã‚’表示" name="show_buddy_icons"/>
- <menu_item_check label="åå‰ã‚’表示" name="show_names"/>
- <menu_item_check label="アイコンã¨åå‰ã‚’表示" name="show_icons_and_names"/>
- <menu_item_call label="文字ã®å¤§ãã•" name="font_size"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_notification_well_button.xml b/indra/newview/skins/minimal/xui/ja/menu_notification_well_button.xml
deleted file mode 100644
index 913bae8958..0000000000
--- a/indra/newview/skins/minimal/xui/ja/menu_notification_well_button.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Notification Well Button Context Menu">
- <menu_item_call label="ã™ã¹ã¦é–‰ã˜ã‚‹" name="Close All"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_object.xml b/indra/newview/skins/minimal/xui/ja/menu_object.xml
deleted file mode 100644
index 4cee8089ee..0000000000
--- a/indra/newview/skins/minimal/xui/ja/menu_object.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Object Pie">
- <menu_item_call label="触る" name="Object Touch">
- <menu_item_call.on_enable name="EnableTouch" parameter="触る"/>
- </menu_item_call>
- <menu_item_call label="編集" name="Edit..."/>
- <menu_item_call label="制作" name="Build"/>
- <menu_item_call label="é–‹ã" name="Open"/>
- <menu_item_call label="ã“ã“ã«åº§ã‚‹" name="Object Sit"/>
- <menu_item_call label="ç«‹ã¡ä¸ŠãŒã‚‹" name="Object Stand Up"/>
- <menu_item_call label="オブジェクトã®ãƒ—ロフィール" name="Object Inspect"/>
- <menu_item_call label="ズームイン" name="Zoom In"/>
- <context_menu label="装ç€" name="Put On">
- <menu_item_call label="装ç€" name="Wear"/>
- <menu_item_call label="追加" name="Add"/>
- <context_menu label="å–り付ã‘ã‚‹" name="Object Attach"/>
- <context_menu label="HUD ã‚’å–り付ã‘ã‚‹" name="Object Attach HUD"/>
- </context_menu>
- <context_menu label="管ç†" name="Remove">
- <menu_item_call label="嫌ãŒã‚‰ã›ã®å ±å‘Š" name="Report Abuse..."/>
- <menu_item_call label="ブロック" name="Object Mute"/>
- <menu_item_call label="è¿”å´" name="Return..."/>
- </context_menu>
- <menu_item_call label="å–ã‚‹" name="Pie Object Take"/>
- <menu_item_call label="コピーをå–ã‚‹" name="Take Copy"/>
- <menu_item_call label="支払ã†" name="Pay..."/>
- <menu_item_call label="è²·ã†" name="Buy..."/>
- <menu_item_call label="削除" name="Delete"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_object_icon.xml b/indra/newview/skins/minimal/xui/ja/menu_object_icon.xml
deleted file mode 100644
index 8c4f328661..0000000000
--- a/indra/newview/skins/minimal/xui/ja/menu_object_icon.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Object Icon Menu">
- <menu_item_call label="オブジェクトã®ãƒ—ロフィール..." name="Object Profile"/>
- <menu_item_call label="ブロック..." name="Block"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_outfit_gear.xml b/indra/newview/skins/minimal/xui/ja/menu_outfit_gear.xml
deleted file mode 100644
index 2bcbe1915b..0000000000
--- a/indra/newview/skins/minimal/xui/ja/menu_outfit_gear.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<toggleable_menu name="Gear Outfit">
- <menu_item_call label="ç€ã‚‹ - ç€ç”¨ä¸­ã®ã‚¢ã‚¦ãƒˆãƒ•ィットを入れ替ãˆã‚‹" name="wear"/>
- <menu_item_call label="ç€ã‚‹ - ç€ç”¨ä¸­ã®ã‚¢ã‚¦ãƒˆãƒ•ィットã«è¿½åŠ ã™ã‚‹" name="wear_add"/>
- <menu_item_call label="å–り外㙠- ç€ç”¨ä¸­ã®ã‚¢ã‚¦ãƒˆãƒ•ィットã‹ã‚‰å–り除ã" name="take_off"/>
- <menu label="衣類" name="New Clothes">
- <menu_item_call label="シャツ" name="New Shirt"/>
- <menu_item_call label="パンツ" name="New Pants"/>
- <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 Gloves"/>
- <menu_item_call label="下ç€ï¼ˆä¸Šï¼‰" name="New Undershirt"/>
- <menu_item_call label="下ç€ï¼ˆä¸‹ï¼‰" name="New Underpants"/>
- <menu_item_call label="アルファ" name="New Alpha"/>
- <menu_item_call label="æ–°è¦ã®ç‰©ç†ä½œç”¨" name="New Physics"/>
- <menu_item_call label="æ–°ã—ã„タトゥ" name="New Tattoo"/>
- </menu>
- <menu label="æ–°ã—ã„身体部ä½" name="New Body Parts">
- <menu_item_call label="æ–°ã—ã„シェイプ" name="New Shape"/>
- <menu_item_call label="スキン" name="New Skin"/>
- <menu_item_call label="髪" name="New Hair"/>
- <menu_item_call label="ç›®" name="New Eyes"/>
- </menu>
- <menu_item_call label="アウトフィットã®åå‰ã‚’変更ã™ã‚‹" name="rename"/>
- <menu_item_call label="アウトフィットを削除ã™ã‚‹" name="delete_outfit"/>
-</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_outfit_tab.xml b/indra/newview/skins/minimal/xui/ja/menu_outfit_tab.xml
deleted file mode 100644
index 9491c22f31..0000000000
--- a/indra/newview/skins/minimal/xui/ja/menu_outfit_tab.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Outfit">
- <menu_item_call label="ç€ã‚‹ - ç€ç”¨ä¸­ã®ã‚¢ã‚¦ãƒˆãƒ•ィットを入れ替ãˆã‚‹" name="wear_replace"/>
- <menu_item_call label="ç€ã‚‹ - ç€ç”¨ä¸­ã®ã‚¢ã‚¦ãƒˆãƒ•ィットã«è¿½åŠ ã™ã‚‹" name="wear_add"/>
- <menu_item_call label="å–り外㙠- ç€ç”¨ä¸­ã®ã‚¢ã‚¦ãƒˆãƒ•ィットã‹ã‚‰å–り除ã" name="take_off"/>
- <menu_item_call label="アウトフィットã®ç·¨é›†" name="edit"/>
- <menu_item_call label="アウトフィットã®åå‰ã‚’変更ã™ã‚‹" name="rename"/>
- <menu_item_call label="アウトフィットを削除ã™ã‚‹" name="delete"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_participant_list.xml b/indra/newview/skins/minimal/xui/ja/menu_participant_list.xml
deleted file mode 100644
index 64d8ded722..0000000000
--- a/indra/newview/skins/minimal/xui/ja/menu_participant_list.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Participant List Context Menu">
- <menu_item_check label="åå‰ã§ä¸¦ã¹æ›¿ãˆ" name="SortByName"/>
- <menu_item_check label="最近ã®ç™ºè¨€è€…ã§ä¸¦ã¹æ›¿ãˆ" name="SortByRecentSpeakers"/>
- <menu_item_call label="プロフィールã®è¡¨ç¤º" name="View Profile"/>
- <menu_item_call label="フレンド登録" name="Add Friend"/>
- <menu_item_call label="IM" name="IM"/>
- <menu_item_call label="コール" name="Call"/>
- <menu_item_call label="共有" name="Share"/>
- <menu_item_call label="支払ã†" name="Pay"/>
- <menu_item_check label="人ã®ã‚¢ã‚¤ã‚³ãƒ³è¡¨ç¤º" name="View Icons"/>
- <menu_item_check label="ボイスをブロック" name="Block/Unblock"/>
- <menu_item_check label="文字をブロック" name="MuteText"/>
- <context_menu label="モデレーターã®ã‚ªãƒ—ション" name="Moderator Options">
- <menu_item_check label="文字ãƒãƒ£ãƒƒãƒˆã‚’許å¯" name="AllowTextChat"/>
- <menu_item_call label="ã“ã®å‚加者をミュートã™ã‚‹" name="ModerateVoiceMuteSelected"/>
- <menu_item_call label="ã“ã®å‚加者ã®ãƒŸãƒ¥ãƒ¼ãƒˆã‚’解除ã™ã‚‹" name="ModerateVoiceUnMuteSelected"/>
- <menu_item_call label="全員をミュート" name="ModerateVoiceMute"/>
- <menu_item_call label="全員ã®ãƒŸãƒ¥ãƒ¼ãƒˆè§£é™¤" name="ModerateVoiceUnmute"/>
- </context_menu>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_people_friends_view_sort.xml b/indra/newview/skins/minimal/xui/ja/menu_people_friends_view_sort.xml
deleted file mode 100644
index 76340e4d76..0000000000
--- a/indra/newview/skins/minimal/xui/ja/menu_people_friends_view_sort.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_group_plus">
- <menu_item_check label="åå‰ã§ä¸¦ã¹æ›¿ãˆ" name="sort_name"/>
- <menu_item_check label="オンライン状態ã§ä¸¦ã¹æ›¿ãˆ" name="sort_status"/>
- <menu_item_check label="人ã®ã‚¢ã‚¤ã‚³ãƒ³è¡¨ç¤º" name="view_icons"/>
- <menu_item_check label="与ãˆã‚‰ã‚ŒãŸæ¨©é™ã‚’表示" name="view_permissions"/>
- <menu_item_call label="ブロックã•れãŸä½äººã¨ã‚ªãƒ–ジェクトを表示" name="show_blocked_list"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_people_groups.xml b/indra/newview/skins/minimal/xui/ja/menu_people_groups.xml
deleted file mode 100644
index 842d79dc4b..0000000000
--- a/indra/newview/skins/minimal/xui/ja/menu_people_groups.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_group_plus">
- <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="Leave"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_people_groups_view_sort.xml b/indra/newview/skins/minimal/xui/ja/menu_people_groups_view_sort.xml
deleted file mode 100644
index bfc7d15017..0000000000
--- a/indra/newview/skins/minimal/xui/ja/menu_people_groups_view_sort.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_group_plus">
- <menu_item_check label="グループアイコンを表示" name="Display Group Icons"/>
- <menu_item_call label="é¸æŠžã—ãŸã‚°ãƒ«ãƒ¼ãƒ—ã‹ã‚‰è„±é€€" name="Leave Selected Group"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_people_nearby.xml b/indra/newview/skins/minimal/xui/ja/menu_people_nearby.xml
deleted file mode 100644
index 8d84b0e521..0000000000
--- a/indra/newview/skins/minimal/xui/ja/menu_people_nearby.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Avatar Context Menu">
- <menu_item_call label="プロフィールã®è¡¨ç¤º" name="View Profile"/>
- <menu_item_call label="フレンド登録" name="Add Friend"/>
- <menu_item_call label="フレンドを削除" name="Remove Friend"/>
- <menu_item_call label="IM" name="IM"/>
- <menu_item_call label="コール" name="Call"/>
- <menu_item_call label="地図" name="Map"/>
- <menu_item_call label="共有" name="Share"/>
- <menu_item_call label="支払ã†" name="Pay"/>
- <menu_item_check label="ブロック・ブロック解除" name="Block/Unblock"/>
- <menu_item_call label="テレãƒãƒ¼ãƒˆã‚’é€ã‚‹" name="teleport"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_people_nearby_multiselect.xml b/indra/newview/skins/minimal/xui/ja/menu_people_nearby_multiselect.xml
deleted file mode 100644
index 3f20e5d3ab..0000000000
--- a/indra/newview/skins/minimal/xui/ja/menu_people_nearby_multiselect.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Multi-Selected People Context Menu">
- <menu_item_call label="フレンド登録" name="Add Friends"/>
- <menu_item_call label="フレンドを削除" name="Remove Friend"/>
- <menu_item_call label="IM" name="IM"/>
- <menu_item_call label="コール" name="Call"/>
- <menu_item_call label="共有" name="Share"/>
- <menu_item_call label="支払ã†" name="Pay"/>
- <menu_item_call label="テレãƒãƒ¼ãƒˆã‚’é€ã‚‹" name="teleport"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_people_nearby_view_sort.xml b/indra/newview/skins/minimal/xui/ja/menu_people_nearby_view_sort.xml
deleted file mode 100644
index a31480158a..0000000000
--- a/indra/newview/skins/minimal/xui/ja/menu_people_nearby_view_sort.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_group_plus">
- <menu_item_check label="最近ã®ç™ºè¨€è€…ã§ä¸¦ã¹æ›¿ãˆ" name="sort_by_recent_speakers"/>
- <menu_item_check label="åå‰ã§ä¸¦ã¹æ›¿ãˆ" name="sort_name"/>
- <menu_item_check label="è·é›¢ã§ä¸¦ã¹æ›¿ãˆ" name="sort_distance"/>
- <menu_item_check label="人ã®ã‚¢ã‚¤ã‚³ãƒ³è¡¨ç¤º" name="view_icons"/>
- <menu_item_call label="ブロックã•れãŸä½äººã¨ã‚ªãƒ–ジェクトを表示" name="show_blocked_list"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_people_recent_view_sort.xml b/indra/newview/skins/minimal/xui/ja/menu_people_recent_view_sort.xml
deleted file mode 100644
index b4f177a068..0000000000
--- a/indra/newview/skins/minimal/xui/ja/menu_people_recent_view_sort.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_group_plus">
- <menu_item_check label="æ–°ã—ã„é †ã«ä¸¦ã¹æ›¿ãˆ" name="sort_most"/>
- <menu_item_check label="åå‰ã§ä¸¦ã¹æ›¿ãˆ" name="sort_name"/>
- <menu_item_check label="人ã®ã‚¢ã‚¤ã‚³ãƒ³è¡¨ç¤º" name="view_icons"/>
- <menu_item_call label="ブロックã•れãŸä½äººã¨ã‚ªãƒ–ジェクトを表示" name="show_blocked_list"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_picks.xml b/indra/newview/skins/minimal/xui/ja/menu_picks.xml
deleted file mode 100644
index 011d3d2526..0000000000
--- a/indra/newview/skins/minimal/xui/ja/menu_picks.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Picks">
- <menu_item_call label="情報" name="pick_info"/>
- <menu_item_call label="編集" name="pick_edit"/>
- <menu_item_call label="テレãƒãƒ¼ãƒˆ" name="pick_teleport"/>
- <menu_item_call label="地図" name="pick_map"/>
- <menu_item_call label="削除" name="pick_delete"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_picks_plus.xml b/indra/newview/skins/minimal/xui/ja/menu_picks_plus.xml
deleted file mode 100644
index 84bf90fea0..0000000000
--- a/indra/newview/skins/minimal/xui/ja/menu_picks_plus.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<toggleable_menu name="picks_plus_menu">
- <menu_item_call label="æ–°ã—ã„ピック" name="create_pick"/>
- <menu_item_call label="æ–°ã—ã„クラシファイド広告" name="create_classified"/>
-</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_place.xml b/indra/newview/skins/minimal/xui/ja/menu_place.xml
deleted file mode 100644
index a9f05e126d..0000000000
--- a/indra/newview/skins/minimal/xui/ja/menu_place.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<toggleable_menu name="place_overflow_menu">
- <menu_item_call label="ランドマークを作æˆ" name="landmark"/>
- <menu_item_call label="ピックを作æˆ" name="pick"/>
- <menu_item_call label="入場許å¯ã‚’購入" name="pass"/>
- <menu_item_call label="編集" name="edit"/>
-</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_place_add_button.xml b/indra/newview/skins/minimal/xui/ja/menu_place_add_button.xml
deleted file mode 100644
index d5ce88b055..0000000000
--- a/indra/newview/skins/minimal/xui/ja/menu_place_add_button.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_folder_gear">
- <menu_item_call label="フォルダを追加" name="add_folder"/>
- <menu_item_call label="ランドマークを追加" name="add_landmark"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_places_gear_folder.xml b/indra/newview/skins/minimal/xui/ja/menu_places_gear_folder.xml
deleted file mode 100644
index e64f97fda5..0000000000
--- a/indra/newview/skins/minimal/xui/ja/menu_places_gear_folder.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<toggleable_menu name="menu_folder_gear">
- <menu_item_call label="ランドマークを追加" name="add_landmark"/>
- <menu_item_call label="フォルダを追加" name="add_folder"/>
- <menu_item_call label="商å“を復元" name="restore_item"/>
- <menu_item_call label="切りå–り" name="cut"/>
- <menu_item_call label="コピー" name="copy_folder"/>
- <menu_item_call label="貼り付ã‘" name="paste"/>
- <menu_item_call label="åå‰ã®å¤‰æ›´" name="rename"/>
- <menu_item_call label="削除" name="delete"/>
- <menu_item_call label="拡大" name="expand"/>
- <menu_item_call label="戻ã™" name="collapse"/>
- <menu_item_call label="フォルダをã™ã¹ã¦é–‹ã" name="expand_all"/>
- <menu_item_call label="フォルダをã™ã¹ã¦é–‰ã˜ã‚‹" name="collapse_all"/>
- <menu_item_check label="日付ã§ä¸¦ã¹æ›¿ãˆ" name="sort_by_date"/>
-</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_places_gear_landmark.xml b/indra/newview/skins/minimal/xui/ja/menu_places_gear_landmark.xml
deleted file mode 100644
index f416b5b1f6..0000000000
--- a/indra/newview/skins/minimal/xui/ja/menu_places_gear_landmark.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<toggleable_menu name="menu_ladmark_gear">
- <menu_item_call label="テレãƒãƒ¼ãƒˆ" name="teleport"/>
- <menu_item_call label="ã‚‚ã£ã¨è©³ã—ã" name="more_info"/>
- <menu_item_call label="地図ã«è¡¨ç¤º" name="show_on_map"/>
- <menu_item_call label="ランドマークを追加" name="add_landmark"/>
- <menu_item_call label="フォルダを追加" name="add_folder"/>
- <menu_item_call label="商å“を復元" name="restore_item"/>
- <menu_item_call label="切りå–り" name="cut"/>
- <menu_item_call label="ランドマークをコピー" name="copy_landmark"/>
- <menu_item_call label="SLurl をコピー" name="copy_slurl"/>
- <menu_item_call label="貼り付ã‘" name="paste"/>
- <menu_item_call label="åå‰ã®å¤‰æ›´" name="rename"/>
- <menu_item_call label="削除" name="delete"/>
- <menu_item_call label="フォルダをã™ã¹ã¦é–‹ã" name="expand_all"/>
- <menu_item_call label="フォルダをã™ã¹ã¦é–‰ã˜ã‚‹" name="collapse_all"/>
- <menu_item_check label="日付ã§ä¸¦ã¹æ›¿ãˆ" name="sort_by_date"/>
- <menu_item_call label="ピックを作æˆ" name="create_pick"/>
-</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_profile_overflow.xml b/indra/newview/skins/minimal/xui/ja/menu_profile_overflow.xml
deleted file mode 100644
index 9d3a5dda1c..0000000000
--- a/indra/newview/skins/minimal/xui/ja/menu_profile_overflow.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<toggleable_menu name="profile_overflow_menu">
- <menu_item_call label="地図" name="show_on_map"/>
- <menu_item_call label="支払ã†" name="pay"/>
- <menu_item_call label="共有" name="share"/>
- <menu_item_call label="ブロック" name="block"/>
- <menu_item_call label="ブロック解除" name="unblock"/>
- <menu_item_call label="追放" name="kick"/>
- <menu_item_call label="フリーズ" name="freeze"/>
- <menu_item_call label="フリーズ解除" name="unfreeze"/>
- <menu_item_call label="CSR" name="csr"/>
-</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_save_outfit.xml b/indra/newview/skins/minimal/xui/ja/menu_save_outfit.xml
deleted file mode 100644
index 6513d9264a..0000000000
--- a/indra/newview/skins/minimal/xui/ja/menu_save_outfit.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<toggleable_menu name="save_outfit_menu">
- <menu_item_call label="ä¿å­˜" name="save_outfit"/>
- <menu_item_call label="別åã§ä¿å­˜" name="save_as_new_outfit"/>
-</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_script_chiclet.xml b/indra/newview/skins/minimal/xui/ja/menu_script_chiclet.xml
deleted file mode 100644
index a89dd0bcbe..0000000000
--- a/indra/newview/skins/minimal/xui/ja/menu_script_chiclet.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="ScriptChiclet Menu">
- <menu_item_call label="é–‰ã˜ã‚‹" name="Close"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_slurl.xml b/indra/newview/skins/minimal/xui/ja/menu_slurl.xml
deleted file mode 100644
index 61ba3085d9..0000000000
--- a/indra/newview/skins/minimal/xui/ja/menu_slurl.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?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="地図" name="show_on_map"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_teleport_history_gear.xml b/indra/newview/skins/minimal/xui/ja/menu_teleport_history_gear.xml
deleted file mode 100644
index 901eab9166..0000000000
--- a/indra/newview/skins/minimal/xui/ja/menu_teleport_history_gear.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Teleport History Gear Context Menu">
- <menu_item_call label="フォルダをã™ã¹ã¦é–‹ã" name="Expand all folders"/>
- <menu_item_call label="フォルダをã™ã¹ã¦é–‰ã˜ã‚‹" name="Collapse all folders"/>
- <menu_item_call label="テレãƒãƒ¼ãƒˆã®å±¥æ­´ã‚’クリア" name="Clear Teleport History"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_teleport_history_item.xml b/indra/newview/skins/minimal/xui/ja/menu_teleport_history_item.xml
deleted file mode 100644
index 66bc32214f..0000000000
--- a/indra/newview/skins/minimal/xui/ja/menu_teleport_history_item.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Teleport History Item Context Menu">
- <menu_item_call label="テレãƒãƒ¼ãƒˆ" name="Teleport"/>
- <menu_item_call label="ã‚‚ã£ã¨è©³ã—ã" name="More Information"/>
- <menu_item_call label="クリップボードã«ã‚³ãƒ”ー" name="CopyToClipboard"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_teleport_history_tab.xml b/indra/newview/skins/minimal/xui/ja/menu_teleport_history_tab.xml
deleted file mode 100644
index 4dd44d2ec8..0000000000
--- a/indra/newview/skins/minimal/xui/ja/menu_teleport_history_tab.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Teleport History Item Context Menu">
- <menu_item_call label="é–‹ã" name="TabOpen"/>
- <menu_item_call label="é–‰ã˜ã‚‹" name="TabClose"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_text_editor.xml b/indra/newview/skins/minimal/xui/ja/menu_text_editor.xml
deleted file mode 100644
index fcb1038a6a..0000000000
--- a/indra/newview/skins/minimal/xui/ja/menu_text_editor.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Text editor context menu">
- <menu_item_call label="切りå–り" name="Cut"/>
- <menu_item_call label="コピー" name="Copy"/>
- <menu_item_call label="貼り付ã‘" name="Paste"/>
- <menu_item_call label="削除" name="Delete"/>
- <menu_item_call label="ã™ã¹ã¦é¸æŠž" name="Select All"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_topinfobar.xml b/indra/newview/skins/minimal/xui/ja/menu_topinfobar.xml
deleted file mode 100644
index 1a67a2a8f7..0000000000
--- a/indra/newview/skins/minimal/xui/ja/menu_topinfobar.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_topinfobar">
- <menu_item_check label="座標を表示" name="Show Coordinates"/>
- <menu_item_check label="区画ã®ãƒ—ロパティを表示" name="Show Parcel Properties"/>
- <menu_item_call label="ランドマーク" name="Landmark"/>
- <menu_item_call label="コピー" name="Copy"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_url_agent.xml b/indra/newview/skins/minimal/xui/ja/menu_url_agent.xml
deleted file mode 100644
index 92d118a5ae..0000000000
--- a/indra/newview/skins/minimal/xui/ja/menu_url_agent.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Url Popup">
- <menu_item_call label="ä½äººã®ãƒ—ロフィールを表示" name="show_agent"/>
- <menu_item_call label="åå‰ã‚’クリップボードã«ã‚³ãƒ”ー" name="url_copy_label"/>
- <menu_item_call label="SLurl をクリップボードã«ã‚³ãƒ”ー" name="url_copy"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_url_group.xml b/indra/newview/skins/minimal/xui/ja/menu_url_group.xml
deleted file mode 100644
index 1dd3d79438..0000000000
--- a/indra/newview/skins/minimal/xui/ja/menu_url_group.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Url Popup">
- <menu_item_call label="グループ情報を表示" name="show_group"/>
- <menu_item_call label="グループをクリップボードã«ã‚³ãƒ”ー" name="url_copy_label"/>
- <menu_item_call label="SLurl をクリップボードã«ã‚³ãƒ”ー" name="url_copy"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_url_http.xml b/indra/newview/skins/minimal/xui/ja/menu_url_http.xml
deleted file mode 100644
index c3da8a8686..0000000000
--- a/indra/newview/skins/minimal/xui/ja/menu_url_http.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Url Popup">
- <menu_item_call label="Web ページを開ã" name="url_open"/>
- <menu_item_call label="内蔵ブラウザã§é–‹ã" name="url_open_internal"/>
- <menu_item_call label="外部ブラウザã§é–‹ã" name="url_open_external"/>
- <menu_item_call label="URLをクリップボードã«ã‚³ãƒ”ー" name="url_copy"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_url_inventory.xml b/indra/newview/skins/minimal/xui/ja/menu_url_inventory.xml
deleted file mode 100644
index 7af2f9e2cd..0000000000
--- a/indra/newview/skins/minimal/xui/ja/menu_url_inventory.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Url Popup">
- <menu_item_call label="æŒã¡ç‰©ã‚¢ã‚¤ãƒ†ãƒ ã‚’表示" name="show_item"/>
- <menu_item_call label="åå‰ã‚’クリップボードã«ã‚³ãƒ”ー" name="url_copy_label"/>
- <menu_item_call label="SLurl をクリップボードã«ã‚³ãƒ”ー" name="url_copy"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_url_map.xml b/indra/newview/skins/minimal/xui/ja/menu_url_map.xml
deleted file mode 100644
index 8d41e1a571..0000000000
--- a/indra/newview/skins/minimal/xui/ja/menu_url_map.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Url Popup">
- <menu_item_call label="地図ã«è¡¨ç¤º" name="show_on_map"/>
- <menu_item_call label="ç¾åœ°ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆ" name="teleport_to_location"/>
- <menu_item_call label="SLurl をクリップボードã«ã‚³ãƒ”ー" name="url_copy"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_url_objectim.xml b/indra/newview/skins/minimal/xui/ja/menu_url_objectim.xml
deleted file mode 100644
index d6a048dcfc..0000000000
--- a/indra/newview/skins/minimal/xui/ja/menu_url_objectim.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Url Popup">
- <menu_item_call label="ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã®æƒ…報を表示" name="show_object"/>
- <menu_item_call label="地図ã«è¡¨ç¤º" name="show_on_map"/>
- <menu_item_call label="オブジェクトã®å ´æ‰€ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆ" name="teleport_to_object"/>
- <menu_item_call label="オブジェクトåをクリップボードã«ã‚³ãƒ”ー" name="url_copy_label"/>
- <menu_item_call label="SLurl をクリップボードã«ã‚³ãƒ”ー" name="url_copy"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_url_parcel.xml b/indra/newview/skins/minimal/xui/ja/menu_url_parcel.xml
deleted file mode 100644
index 8d264059d3..0000000000
--- a/indra/newview/skins/minimal/xui/ja/menu_url_parcel.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Url Popup">
- <menu_item_call label="区画情報を表示" name="show_parcel"/>
- <menu_item_call label="地図ã«è¡¨ç¤º" name="show_on_map"/>
- <menu_item_call label="SLurl をクリップボードã«ã‚³ãƒ”ー" name="url_copy"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_url_slapp.xml b/indra/newview/skins/minimal/xui/ja/menu_url_slapp.xml
deleted file mode 100644
index a516c5a075..0000000000
--- a/indra/newview/skins/minimal/xui/ja/menu_url_slapp.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Url Popup">
- <menu_item_call label="ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã‚’実行" name="run_slapp"/>
- <menu_item_call label="SLurl をクリップボードã«ã‚³ãƒ”ー" name="url_copy"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_url_slurl.xml b/indra/newview/skins/minimal/xui/ja/menu_url_slurl.xml
deleted file mode 100644
index 2c857ec915..0000000000
--- a/indra/newview/skins/minimal/xui/ja/menu_url_slurl.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Url Popup">
- <menu_item_call label="å ´æ‰€ã®æƒ…報を表示" name="show_place"/>
- <menu_item_call label="地図ã«è¡¨ç¤º" name="show_on_map"/>
- <menu_item_call label="ç¾åœ°ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆ" name="teleport_to_location"/>
- <menu_item_call label="SLurl をクリップボードã«ã‚³ãƒ”ー" name="url_copy"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_url_teleport.xml b/indra/newview/skins/minimal/xui/ja/menu_url_teleport.xml
deleted file mode 100644
index c3507a9a33..0000000000
--- a/indra/newview/skins/minimal/xui/ja/menu_url_teleport.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Url Popup">
- <menu_item_call label="ã“ã®å ´æ‰€ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆ" name="teleport"/>
- <menu_item_call label="地図ã«è¡¨ç¤º" name="show_on_map"/>
- <menu_item_call label="SLurl をクリップボードã«ã‚³ãƒ”ー" name="url_copy"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_viewer.xml b/indra/newview/skins/minimal/xui/ja/menu_viewer.xml
deleted file mode 100644
index 52dec2b282..0000000000
--- a/indra/newview/skins/minimal/xui/ja/menu_viewer.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu_bar name="Main Menu">
- <menu label="ヘルプ" name="Help">
- <menu_item_call label="[SECOND_LIFE] ヘルプ" name="Second Life Help"/>
- </menu>
- <menu label="アドãƒãƒ³ã‚¹" name="Advanced">
- <menu label="ショートカット" name="Shortcuts">
- <menu_item_check label="飛ã¶" name="Fly"/>
- <menu_item_call label="ウィンドウを閉ã˜ã‚‹" name="Close Window"/>
- <menu_item_call label="å…¨ã¦ã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã‚’é–‰ã˜ã‚‹" name="Close All Windows"/>
- <menu_item_call label="表示をリセットã™ã‚‹" name="Reset View"/>
- </menu>
- </menu>
-</menu_bar>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_wearable_list_item.xml b/indra/newview/skins/minimal/xui/ja/menu_wearable_list_item.xml
deleted file mode 100644
index c402fa0b6d..0000000000
--- a/indra/newview/skins/minimal/xui/ja/menu_wearable_list_item.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Outfit Wearable Context Menu">
- <menu_item_call label="交æ›" name="wear_replace"/>
- <menu_item_call label="装ç€" name="wear_wear"/>
- <menu_item_call label="追加" name="wear_add"/>
- <menu_item_call label="å–り外ã™" name="take_off_or_detach"/>
- <menu_item_call label="å–り外ã™" name="detach"/>
- <context_menu label="装ç€ï¼š" name="wearable_attach_to"/>
- <context_menu label="HUD ã«è£…ç€" name="wearable_attach_to_hud"/>
- <menu_item_call label="å–り外ã™" name="take_off"/>
- <menu_item_call label="編集" name="edit"/>
- <menu_item_call label="アイテムã®ãƒ—ロフィール" name="object_profile"/>
- <menu_item_call label="オリジナルを表示" name="show_original"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_wearing_gear.xml b/indra/newview/skins/minimal/xui/ja/menu_wearing_gear.xml
deleted file mode 100644
index 7a97538117..0000000000
--- a/indra/newview/skins/minimal/xui/ja/menu_wearing_gear.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Gear Wearing">
- <menu_item_call label="アウトフットã®ç·¨é›†" name="edit"/>
- <menu_item_call label="å–り外ã™" name="takeoff"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_wearing_tab.xml b/indra/newview/skins/minimal/xui/ja/menu_wearing_tab.xml
deleted file mode 100644
index 9effed1f42..0000000000
--- a/indra/newview/skins/minimal/xui/ja/menu_wearing_tab.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Wearing">
- <menu_item_call label="å–り外ã™" name="take_off"/>
- <menu_item_call label="å–り外ã™" name="detach"/>
- <menu_item_call label="アウトフットã®ç·¨é›†" name="edit"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/ja/notifications.xml b/indra/newview/skins/minimal/xui/ja/notifications.xml
deleted file mode 100644
index 43934c9317..0000000000
--- a/indra/newview/skins/minimal/xui/ja/notifications.xml
+++ /dev/null
@@ -1,2995 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<notifications>
- <global name="skipnexttime">
- 今後ã¯è¡¨ç¤ºã—ãªã„
- </global>
- <global name="alwayschoose">
- 常ã«ã“ã®ã‚ªãƒ—ã‚·ãƒ§ãƒ³ã‚’é¸æŠž
- </global>
- <global name="implicitclosebutton">
- é–‰ã˜ã‚‹
- </global>
- <template name="okbutton">
- <form>
- <button name="OK_okbutton" text="$yestext"/>
- </form>
- </template>
- <template name="okignore">
- <form>
- <button name="OK_okignore" text="$yestext"/>
- </form>
- </template>
- <template name="okcancelbuttons">
- <form>
- <button name="OK_okcancelbuttons" text="$yestext"/>
- <button name="Cancel_okcancelbuttons" text="$notext"/>
- </form>
- </template>
- <template name="okcancelignore">
- <form>
- <button name="OK_okcancelignore" text="$yestext"/>
- <button name="Cancel_okcancelignore" text="$notext"/>
- </form>
- </template>
- <template name="okhelpbuttons">
- <form>
- <button name="OK_okhelpbuttons" text="$yestext"/>
- <button name="Help" text="$helptext"/>
- </form>
- </template>
- <template name="yesnocancelbuttons">
- <form>
- <button name="Yes" text="$yestext"/>
- <button name="No" text="$notext"/>
- <button name="Cancel_yesnocancelbuttons" text="$canceltext"/>
- </form>
- </template>
- <notification functor="GenericAcknowledge" label="䏿˜Žã®é€šçŸ¥ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸" name="MissingAlert">
- ã‚ãªãŸã® [APP_NAME] ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã§ã¯ä»Šå—ã‘å–ã£ãŸé€šçŸ¥ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’表示ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。 最新ビューワãŒã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•れã¦ã„ã‚‹ã‹ã”確èªãã ã•ã„。
-
-エラー詳細: 「 [_NAME] ã€ã¨ã„ã†é€šçŸ¥ã¯ notifications.xml ã«ã‚りã¾ã›ã‚“ã§ã—ãŸã€‚
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="FloaterNotFound">
- フロータエラー:下記ã®ã‚³ãƒ³ãƒˆãƒ­ãƒ¼ãƒ«ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸï¼š
-[CONTROLS]
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="TutorialNotFound">
- ç¾åœ¨åˆ©ç”¨å¯èƒ½ãªãƒãƒ¥ãƒ¼ãƒˆãƒªã‚¢ãƒ«ã¯ã‚りã¾ã›ã‚“。
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="GenericAlert">
- [MESSAGE]
- </notification>
- <notification name="GenericAlertYesCancel">
- [MESSAGE]
- <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="ã¯ã„"/>
- </notification>
- <notification name="BadInstallation">
- [APP_NAME] をアップデート中ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ ビューワ㮠[http://get.secondlife.com 最新ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンロード] ã—ã¦ãã ã•ã„。
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="LoginFailedNoNetwork">
- [SECOND_LIFE_GRID] ã«æŽ¥ç¶šã§ãã¾ã›ã‚“ã§ã—ãŸã€‚
-「[DIAGNOSTIC]ã€
-インターãƒãƒƒãƒˆæŽ¥ç¶šãŒæ­£å¸¸ã‹ã”確èªãã ã•ã„。
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="MessageTemplateNotFound">
- メッセージテンプレート [PATH] ãŒã‚りã¾ã›ã‚“ã§ã—ãŸã€‚
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="WearableSave">
- ç¾åœ¨ã®è¡£é¡žã€èº«ä½“部ä½ã®å¤‰æ›´ã‚’ä¿å­˜ã—ã¾ã™ã‹ï¼Ÿ
- <usetemplate canceltext="キャンセル" name="yesnocancelbuttons" notext="ä¿å­˜ã—ãªã„" yestext="ä¿å­˜"/>
- </notification>
- <notification name="CompileQueueSaveText">
- 次ã®ç†ç”±ã§ã€ã‚¹ã‚¯ãƒªãƒ—ト用テキストã®ã‚¢ãƒƒãƒ—ロード時ã«å•題ãŒèµ·ã“りã¾ã—ãŸã€‚
-[REASON]
-後ã§ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。
- </notification>
- <notification name="CompileQueueSaveBytecode">
- 次ã®ç†ç”±ã§ã€ã‚³ãƒ³ãƒ‘イルã—ãŸã‚¹ã‚¯ãƒªãƒ—トã®ã‚¢ãƒƒãƒ—ロード時ã«å•題ãŒèµ·ã“りã¾ã—ãŸã€‚
-[REASON]
-後ã§ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。
- </notification>
- <notification name="WriteAnimationFail">
- ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ãƒ‡ãƒ¼ã‚¿ã®æ›¸ãè¾¼ã¿ã«å•題ãŒã‚りã¾ã™ã€‚後ã§ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。
- </notification>
- <notification name="UploadAuctionSnapshotFail">
- 次ã®ç†ç”±ã§ã€ã‚ªãƒ¼ã‚¯ã‚·ãƒ§ãƒ³ã®ã‚¹ãƒŠãƒƒãƒ—ショットã®ã‚¢ãƒƒãƒ—ロード時ã«å•題ãŒèµ·ã“りã¾ã—ãŸã€‚
-[REASON]
- </notification>
- <notification name="UnableToViewContentsMoreThanOne">
- 一度ã«è¤‡æ•°ã®ã‚¢ã‚¤ãƒ†ãƒ ã®ä¸­èº«ã‚’表示ã§ãã¾ã›ã‚“。
-アイテムを 1 ã¤ã ã‘é¸æŠžã—ã¦ã€ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。
- </notification>
- <notification name="SaveClothingBodyChanges">
- è¡£æœã€èº«ä½“部ä½ã«å¯¾ã™ã‚‹å¤‰æ›´ã‚’ã™ã¹ã¦ä¿å­˜ã—ã¾ã™ã‹ï¼Ÿ
- <usetemplate canceltext="å–り消ã—" name="yesnocancelbuttons" notext="ä¿å­˜ã—ãªã„" yestext="ã™ã¹ã¦ä¿å­˜"/>
- </notification>
- <notification name="FriendsAndGroupsOnly">
- フレンド以外ã‹ã‚‰ã®ã‚³ãƒ¼ãƒ«ã‚„インスタントメッセージを無視ã™ã‚‹è¨­å®šã«ã—ãŸã“ã¨ã‚’ã€ç›¸æ‰‹ã«çŸ¥ã‚‰ã‚Œã‚‹ã“ã¨ã¯ã‚りã¾ã›ã‚“。
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="FavoritesOnLogin">
- 注æ„:ã“ã®ã‚ªãƒ—ションを有効ã«ã™ã‚‹ã¨ã€ã“ã®ãƒ‘ソコンを使ã†ãƒ¦ãƒ¼ã‚¶ãƒ¼ã¯èª°ã§ã‚‚ã€ã‚ãªãŸã®ãŠæ°—ã«å…¥ã‚Šã®å ´æ‰€ã‚’見るã“ã¨ãŒã§ãるよã†ã«ãªã‚Šã¾ã™ã€‚
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="GrantModifyRights">
- 他人ã«ä¿®æ­£æ¨©é™ã‚’与ãˆã‚‹ã¨ã€æ¨©é™ã‚’与ãˆã‚‰ã‚ŒãŸäººã¯ã‚ãªãŸãŒæ‰€æœ‰ã™ã‚‹ã‚¤ãƒ³ãƒ¯ãƒ¼ãƒ«ãƒ‰ã®ã‚ªãƒ–ジェクトを変更ã€å‰Šé™¤ã€æŒã¡å¸°ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ã“ã®æ¨©é™ã‚’与ãˆã‚‹éš›ã«ã¯ååˆ†ã«æ³¨æ„ã—ã¦ãã ã•ã„。
-[NAME] ã«ä¿®æ­£æ¨©é™ã‚’与ãˆã¾ã™ã‹ï¼Ÿ
- <usetemplate name="okcancelbuttons" notext="ã„ã„ãˆ" yestext="ã¯ã„"/>
- </notification>
- <notification name="GrantModifyRightsMultiple">
- 他人ã«ä¿®æ­£æ¨©é™ã‚’与ãˆã‚‹ã¨ã€æ¨©é™ã‚’与ãˆã‚‰ã‚ŒãŸäººã¯ã‚ãªãŸãŒæ‰€æœ‰ã™ã‚‹ã‚¤ãƒ³ãƒ¯ãƒ¼ãƒ«ãƒ‰ã®ã‚ªãƒ–ジェクトを変更ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ ã“ã®æ¨©é™ã‚’与ãˆã‚‹éš›ã«ã¯ååˆ†ã«æ³¨æ„ã—ã¦ãã ã•ã„。
-é¸æŠžã—ãŸä½äººã«ä¿®æ­£æ¨©é™ã‚’与ãˆã¾ã™ã‹ï¼Ÿ
- <usetemplate name="okcancelbuttons" notext="ã„ã„ãˆ" yestext="ã¯ã„"/>
- </notification>
- <notification name="RevokeModifyRights">
- [NAME] ã®ä¿®æ­£æ¨©é™ã‚’解約ã—ã¾ã™ã‹ï¼Ÿ
- <usetemplate name="okcancelbuttons" notext="ã„ã„ãˆ" yestext="ã¯ã„"/>
- </notification>
- <notification name="RevokeModifyRightsMultiple">
- é¸æŠžã—ãŸä½äººã‹ã‚‰å¤‰æ›´æ¨©é™ã‚’å–り下ã’ã¾ã™ã‹ï¼Ÿ
- <usetemplate name="okcancelbuttons" notext="ã„ã„ãˆ" yestext="ã¯ã„"/>
- </notification>
- <notification name="UnableToCreateGroup">
- グループを作æˆã§ãã¾ã›ã‚“。
-[MESSAGE]
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="PanelGroupApply">
- [NEEDS_APPLY_MESSAGE]
-[WANT_APPLY_MESSAGE]
- <usetemplate canceltext="å–り消ã—" name="yesnocancelbuttons" notext="変更を無視" yestext="変更をé©ç”¨"/>
- </notification>
- <notification name="MustSpecifyGroupNoticeSubject">
- グループ通知ã®é€ä¿¡ã«ã¯ã€ä»¶åã®è¨˜å…¥ãŒå¿…è¦ã§ã™ã€‚
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="AddGroupOwnerWarning">
- ã‚ãªãŸã¯ [ROLE_NAME] ã®å½¹å‰²ã«ãƒ¡ãƒ³ãƒãƒ¼ã‚’与ãˆã‚ˆã†ã¨ã—ã¦ã„ã¾ã™ã€‚
-任命ã•れãŸãƒ¡ãƒ³ãƒãƒ¼ãŒè‡ªã‚‰é€€ä»»ã—ãªã„é™ã‚Šã€
-役柄ã‹ã‚‰å‰Šé™¤ã§ãã¾ã›ã‚“。
-æ“作を続行ã—ã¾ã™ã‹ï¼Ÿ
- <usetemplate ignoretext="グループオーナーを新ã—ã追加ã™ã‚‹å‰ã®ç¢ºèª" name="okcancelignore" notext="ã„ã„ãˆ" yestext="ã¯ã„"/>
- </notification>
- <notification name="AssignDangerousActionWarning">
- ã‚ãªãŸã¯ [ROLE_NAME] ã« [ACTION_NAME] ã®èƒ½åŠ›ã‚’
-与ãˆã‚ˆã†ã¨ã—ã¦ã„ã¾ã™ã€‚
-
- *警告*
-ã“ã®èƒ½åŠ›ã‚’æŒã¤å½¹å‰²ã®ãƒ¡ãƒ³ãƒãƒ¼ã¯ã€
-自分ã¨ä»–ã®ãƒ¡ãƒ³ãƒãƒ¼ã«ç¾åœ¨ã‚ˆã‚Šå¼·åŠ›ãªæ¨©é™ã‚’割り当ã¦ã€
-自分をオーナーã¨ã»ã¼åŒæ§˜ã®ç«‹å ´ã«ä»»å‘½ã™ã‚‹ã“ã¨ã‚‚ã§ãるよã†ã«ãªã‚Šã¾ã™ã€‚
-ã“ã®è¡Œç‚ºã®æ„味をよãç†è§£ã—ã¦ã‹ã‚‰å®Ÿè¡Œã—ã¦ãã ã•ã„。
-
-ã“ã®èƒ½åŠ›ã‚’ [ROLE_NAME] ã«å‰²ã‚Šå½“ã¦ã¾ã™ã‹ï¼Ÿ
- <usetemplate name="okcancelbuttons" notext="ã„ã„ãˆ" yestext="ã¯ã„"/>
- </notification>
- <notification name="AssignDangerousAbilityWarning">
- ã‚ãªãŸã¯ [ROLE_NAME] ã« [ACTION_NAME] ã®èƒ½åŠ›ã‚’
-与ãˆã‚ˆã†ã¨ã—ã¦ã„ã¾ã™ã€‚
-
- *警告*
-ã“ã®èƒ½åŠ›ã‚’ã‚‚ã¤å½¹å‰²ã®ãƒ¡ãƒ³ãƒãƒ¼ã¯ã€
-自分ã¨ä»–ã®ãƒ¡ãƒ³ãƒãƒ¼ã«ã™ã¹ã¦ã®èƒ½åŠ›ã‚’å‰²ã‚Šå½“ã¦ã€
-自分をオーナーã¨ã»ã¼åŒæ§˜ã®ç«‹å ´ã«ä»»å‘½ã§ãã¾ã™ã€‚
-
-ã“ã®èƒ½åŠ›ã‚’ [ROLE_NAME] ã«å‰²ã‚Šå½“ã¦ã¾ã™ã‹ï¼Ÿ
- <usetemplate name="okcancelbuttons" notext="ã„ã„ãˆ" yestext="ã¯ã„"/>
- </notification>
- <notification name="AttachmentDrop">
- アタッãƒãƒ¡ãƒ³ãƒˆã‚’下ã«ç½®ã“ã†ã¨ã—ã¦ã„ã¾ã™ã€‚
-ç¶šã‘ã¾ã™ã‹ï¼Ÿ
- <usetemplate ignoretext="アタッãƒãƒ¡ãƒ³ãƒˆã‚’下ã«è½ã¨ã™å‰ã®ç¢ºèª" name="okcancelignore" notext="ã„ã„ãˆ" yestext="ã¯ã„"/>
- </notification>
- <notification name="JoinGroupCanAfford">
- ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«å‚加ã™ã‚‹ã«ã¯ã€L$ [COST] ã‹ã‹ã‚Šã¾ã™ã€‚
-続行ã—ã¾ã™ã‹ï¼Ÿ
- <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="å‚加"/>
- </notification>
- <notification name="JoinGroupNoCost">
- [NAME] ã¨ã„ã†ã‚°ãƒ«ãƒ¼ãƒ—ã«å…¥ã‚ã†ã¨ã—ã¦ã„ã¾ã™ã€‚
-ç¶šã‘ã¾ã™ã‹ï¼Ÿ
- <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="å‚加"/>
- </notification>
- <notification name="JoinGroupCannotAfford">
- ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«åŠ å…¥ã™ã‚‹ã«ã¯ã€L$ [COST] å¿…è¦ã§ã™ã€‚
-L$ ãŒä¸è¶³ã—ã¦ã„ã‚‹ã®ã§ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«å‚加ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。
- </notification>
- <notification name="CreateGroupCost">
- ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—を作るã«ã¯ L$ 100 ã‹ã‹ã‚Šã¾ã™ã€‚
-一人ã§ã¯ã‚°ãƒ«ãƒ¼ãƒ—ã«ãªã‚‰ãªã„ã®ã§ã€æ°¸ä¹…ã«å‰Šé™¤ã•れã¦ã—ã¾ã„ã¾ã™ã€‚
-48 時間以内ã«ãƒ¡ãƒ³ãƒãƒ¼ã‚’勧誘ã—ã€å…¥ä¼šã—ã¦ã‚‚らã£ã¦ãã ã•ã„。
- <usetemplate canceltext="キャンセル" name="okcancelbuttons" notext="キャンセル" yestext="L$100 ã§ã‚°ãƒ«ãƒ¼ãƒ—を作æˆ"/>
- </notification>
- <notification name="LandBuyPass">
- L$ [COST] ã§ [TIME] 時間 [PARCEL_NAME] ã«å…¥ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚
-入場許å¯ã‚’購入ã—ã¾ã™ã‹ï¼Ÿ
- <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
- </notification>
- <notification name="SalePriceRestriction">
- ä¸ç‰¹å®šã®äººã«å£²å´ã™ã‚‹å ´åˆã«ã¯ã€
-売å´ä¾¡æ ¼ã¯L$ 0 以上ã«è¨­å®šã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚
-売å´ä¾¡æ ¼ã‚’L$ 0 ã«è¨­å®šã™ã‚‹å ´åˆã¯ã€
-売å´ã™ã‚‹å€‹äººã‚’é¸æŠžã—ã¦ãã ã•ã„。
- </notification>
- <notification name="ConfirmLandSaleChange">
- é¸æŠžã—㟠[LAND_SIZE] 平方メートルã®åœŸåœ°ã¯ã€å£²ã‚Šå‡ºã—中ã«è¨­å®šã•れã¦ã„ã¾ã™ã€‚
-売å´ä¾¡æ ¼ L$ [SALE_PRICE] ã§ã€[NAME] ã«å£²å´ã‚’èªå¯ã—ã¾ã™ã€‚
- <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
- </notification>
- <notification name="ConfirmLandSaleToAnyoneChange">
- 注æ„: 「誰ã«ã§ã‚‚販売ã€ã‚’クリックã™ã‚‹ã“ã¨ã§ã€ã‚ãªãŸã®åœŸåœ°ã¯ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã«ã„る人ã«é™ã‚‰ãš [SECOND_LIFE] コミュニティ全体ã§åˆ©ç”¨å¯èƒ½ã¨ãªã‚Šã¾ã™ã€‚
-
-é¸æŠžã—㟠[LAND_SIZE] 平方メートルã®åœŸåœ°ã¯ã€è²©å£²å¯¾è±¡ã«è¨­å®šã•れã¾ã—ãŸã€‚
-販売価格 L$ [SALE_PRICE] ã§ã€[NAME] ãŒè²©å£²å¯¾è±¡è€…ã¨ãªã‚Šã¾ã™ã€‚
- <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
- </notification>
- <notification name="ReturnObjectsDeededToGroup">
- ã“ã®åŒºç”»ã®ã‚°ãƒ«ãƒ¼ãƒ— [NAME] 共有ã®ã™ã¹ã¦ã®ã‚ªãƒ–ジェクトをã€ä»¥å‰ã®æ‰€æœ‰è€…ã®ã€ŒæŒã¡ç‰©ã€ã«æˆ»ãã†ã¨ã—ã¦ã„ã¾ã™ã€‚
-æ“作を続行ã—ã¾ã™ã‹ï¼Ÿ
-
-*警告* ã“れã«ã‚ˆã‚Šã€
-グループã«è­²æ¸¡ã•れãŸã€Œå†è²©ãƒ»ãƒ—レゼントä¸å¯ã€ã®ã‚ªãƒ–ジェクトã¯å‰Šé™¤ã•れã¾ã™ï¼
-オブジェクト: [N]
- <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
- </notification>
- <notification name="ReturnObjectsOwnedByUser">
- ã“ã®åŒºç”»ã§ã€
-ä½äºº [NAME] ãŒæ‰€æœ‰ã™ã‚‹å…¨ã¦ã®ã‚ªãƒ–ジェクトを
-本人ã®ã€ŒæŒã¡ç‰©ã€ã«æœ¬å½“ã«è¿”å´ã—ã¦ã‚‚よã„ã§ã™ã‹ï¼Ÿ
-
-オブジェクト: [N]
- <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
- </notification>
- <notification name="ReturnObjectsOwnedBySelf">
- ã“ã®åœŸåœ°åŒºç”»å†…ã«ã‚ã‚‹ã€ã‚ãªãŸãŒæ‰€æœ‰ã™ã‚‹ã™ã¹ã¦ã®ã‚ªãƒ–ジェクトをã€
-ã‚ãªãŸã®ã€ŒæŒã¡ç‰©ã€ã«æˆ»ãã†ã¨ã—ã¦ã„ã¾ã™ã€‚ç¶šã‘ã¾ã™ã‹ï¼Ÿ
-
-オブジェクト: [N]
- <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
- </notification>
- <notification name="ReturnObjectsNotOwnedBySelf">
- ã“ã®åœŸåœ°åŒºç”»å†…ã«ã‚ã‚‹ã€ã‚ãªãŸä»¥å¤–ãŒæ‰€æœ‰ã™ã‚‹ã™ã¹ã¦ã®ã‚ªãƒ–ジェクトをã€
-ãれãžã‚Œã®æ‰€æœ‰è€…ã®ã€ŒæŒã¡ç‰©ã€ã«æˆ»ãã†ã¨ã—ã¦ã„ã¾ã™ã€‚
-æ“作を続行ã—ã¾ã™ã‹ï¼Ÿ
-グループã«è­²æ¸¡ã•れãŸã€Œå†è²©ãƒ»ãƒ—レゼントå¯ã€ã®ã‚ªãƒ–ジェクトã¯ã€ä»¥å‰ã®æ‰€æœ‰è€…ã«è¿”å´ã•れã¾ã™ã€‚
-
-*警告* ã“れã«ã‚ˆã‚Šã€
-グループã«è­²æ¸¡ã•れãŸã€Œå†è²©ãƒ»ãƒ—レゼントä¸å¯ã€ã®ã‚ªãƒ–ジェクトã¯å‰Šé™¤ã•れã¾ã™ï¼
-オブジェクト: [N]
- <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
- </notification>
- <notification name="ReturnObjectsNotOwnedByUser">
- ã“ã®åœŸåœ°åŒºç”»å†…ã«ã‚ã‚‹ã€
-[NAME]以外ã«ã‚ˆã‚‹æ‰€æœ‰ã®ã‚ªãƒ–ジェクトをã™ã¹ã¦ãれãžã‚Œã®æ‰€æœ‰è€…ã®ã€ŒæŒã¡ç‰©ã€ã«è¿”å´ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚
-æ“作を続行ã—ã¾ã™ã‹ï¼Ÿã‚°ãƒ«ãƒ¼ãƒ—ã«è­²æ¸¡ã•れãŸã€Œå†è²©ãƒ»ãƒ—レゼントå¯ã€ã®ã‚ªãƒ–ジェクトã¯ã€ä»¥å‰ã®æ‰€æœ‰è€…ã«è¿”å´ã•れã¾ã™ã€‚
-
-*警告* ã“れã«ã‚ˆã‚Šã€
-グループã«è­²æ¸¡ã•れãŸã€Œå†è²©ãƒ»ãƒ—レゼントä¸å¯ã€ã®ã‚ªãƒ–ジェクトã¯å‰Šé™¤ã•れã¾ã™ï¼
-オブジェクト: [N]
- <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
- </notification>
- <notification name="ReturnAllTopObjects">
- å…¨ã¦ã®ãƒªã‚¹ãƒˆã•れãŸã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’æ‰€æœ‰è€…ã«æœ¬å½“ã«è¿”å´ã—ã¾ã™ã‹ï¼Ÿ
- <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
- </notification>
- <notification name="DisableAllTopObjects">
- ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼ˆåœ°åŸŸï¼‰å†…ã®ã™ã¹ã¦ã®ã‚ªãƒ–ジェクトを無効ã«ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚æ“作を続行ã—ã¾ã™ã‹ï¼Ÿ
- <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
- </notification>
- <notification name="ReturnObjectsNotOwnedByGroup">
- ã“ã®åœŸåœ°ã®åŒºç”»ä¸Šã®ã‚ªãƒ–ジェクトã®ã†ã¡ã€ã‚°ãƒ«ãƒ¼ãƒ— [NAME] ã¨ã®é–“ã§å…±æœ‰ã—ã¦ã„ãªã„オブジェクトを所有者ã«è¿”å´ã—ã¾ã™ã‹ï¼Ÿ
-
-オブジェクト: [N]
- <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
- </notification>
- <notification name="UnableToDisableOutsideScripts">
- スクリプトを無効ã«ã§ãã¾ã›ã‚“。
-ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼ˆåœ°åŸŸï¼‰å…¨ä½“ãŒã€Œãƒ€ãƒ¡ãƒ¼ã‚¸æœ‰åйã€ã«è¨­å®šã•れã¦ã„ã¾ã™ã€‚
-武器を使用ã™ã‚‹ã«ã¯ã‚¹ã‚¯ãƒªãƒ—トã®å®Ÿè¡Œã‚’許å¯ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚
- </notification>
- <notification name="MultipleFacesSelected">
- ç¾åœ¨è¤‡æ•°ã®é¢ãŒé¸æŠžã•れã¦ã„ã¾ã™ã€‚
-ã“ã®ã¾ã¾ç¶šã‘ãŸå ´åˆã€ãƒ¡ãƒ‡ã‚£ã‚¢ã®åˆ¥ã€…ã®ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ãŒã‚ªãƒ–ジェクトã®è¤‡æ•°ã®é¢ã«è¨­å®šã•れã¾ã™ã€‚
-メディアを 1 ã¤ã®é¢ã ã‘ã«å–り付ã‘ã‚‹ã«ã¯ã€ã€Œé¢ã‚’é¸æŠžã€ã‚’é¸ã‚“ã§ã‚ªãƒ–ジェクトã®å¸Œæœ›ã™ã‚‹é¢ã‚’クリックã€ãれã‹ã‚‰ã€Œè¿½åŠ ã€ã‚’クリックã—ã¦ãã ã•ã„。
- <usetemplate ignoretext="メディアãŒé¸æŠžã—ãŸè¤‡æ•°ã®é¢ã«ã‚»ãƒƒãƒˆã•れるã¨ã" name="okcancelignore" notext="キャンセル" yestext="OK"/>
- </notification>
- <notification name="MustBeInParcel">
- ç€åœ°ç‚¹ã‚’設定ã™ã‚‹ã«ã¯ã€ã“ã®åŒºç”»ã®å†…å´ã«
-ç«‹ã£ã¦ãã ã•ã„。
- </notification>
- <notification name="PromptRecipientEmail">
- å—ä¿¡è€…ã®æœ‰åйãªãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’入力ã—ã¦ãã ã•ã„。
- </notification>
- <notification name="PromptSelfEmail">
- ã‚ãªãŸã®ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’入力ã—ã¦ãã ã•ã„。
- </notification>
- <notification name="PromptMissingSubjMsg">
- デフォルトã®ä»¶åã¾ãŸã¯ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’付ã‘ã¦ã€ã‚¹ãƒŠãƒƒãƒ—ショットをé€ä¿¡ã—ã¾ã™ã‹ï¼Ÿ
- <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
- </notification>
- <notification name="ErrorProcessingSnapshot">
- スナップショットデータã®å‡¦ç†ã‚¨ãƒ©ãƒ¼
- </notification>
- <notification name="ErrorEncodingSnapshot">
- スナップショットã®ã‚¨ãƒ³ã‚³ãƒ¼ãƒ‰åŒ–ã§ã‚¨ãƒ©ãƒ¼ãŒå‡ºã¾ã—ãŸï¼
- </notification>
- <notification name="ErrorUploadingPostcard">
- 次ã®ç†ç”±ã§ã€ã‚¹ãƒŠãƒƒãƒ—ショットã®é€ä¿¡æ™‚ã«å•題ãŒèµ·ã“りã¾ã—ãŸï¼š [REASON]
- </notification>
- <notification name="ErrorUploadingReportScreenshot">
- 次ã®ç†ç”±ã§ã€ãƒ¬ãƒãƒ¼ãƒˆã®ã‚¹ã‚¯ãƒªãƒ¼ãƒ³ã‚·ãƒ§ãƒƒãƒˆã®ã‚¢ãƒƒãƒ—ロード時ã«å•題ãŒèµ·ã“りã¾ã—ãŸã€‚ [REASON]
- </notification>
- <notification name="MustAgreeToLogIn">
- [SECOND_LIFE] ã¸ã®ãƒ­ã‚°ã‚¤ãƒ³ã‚’ç¶šã‘ã‚‹ã«ã¯ã€åˆ©ç”¨è¦ç´„ã«åŒæ„ã—ã¦ãã ã•ã„。
- </notification>
- <notification name="CouldNotPutOnOutfit">
- アウトフィットを装ç€ã§ãã¾ã›ã‚“。
-アウトフィットフォルダã«è¡£é¡žã€èº«ä½“部ä½ã€ã‚¢ã‚¿ãƒƒãƒãƒ¡ãƒ³ãƒˆãŒã‚りã¾ã›ã‚“。
- </notification>
- <notification name="CannotWearTrash">
- ã”ã¿ç®±ã«ã‚る衣類や身体部ä½ã®ç€ç”¨ã¯ã§ãã¾ã›ã‚“。
- </notification>
- <notification name="MaxAttachmentsOnOutfit">
- オブジェクトを付ã‘られã¾ã›ã‚“ã§ã—ãŸã€‚
-最大数㮠[MAX_ATTACHMENTS] 個を越ãˆã¦ã„ã¾ã™ã€‚ ã©ã‚Œã‹å–り外ã—ã¦ã‹ã‚‰ãŠè©¦ã—ãã ã•ã„。
- </notification>
- <notification name="CannotWearInfoNotComplete">
- ã¾ã èª­ã¿è¾¼ã¾ã‚Œã¦ã„ãªã„ãŸã‚ã€ãã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’装ç€ã§ãã¾ã›ã‚“。後ã§ã‚„り直ã—ã¦ãã ã•ã„。
- </notification>
- <notification name="MustHaveAccountToLogIn">
- 注æ„:記入æ¼ã‚Œã®ç®‡æ‰€ãŒã‚りã¾ã™ã€‚
-ã‚¢ãƒã‚¿ãƒ¼ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼åを入力ã—ã¦ãã ã•ã„。
-
-[SECOND_LIFE] ã«å…¥ã‚‹ã«ã¯ã‚¢ã‚«ã‚¦ãƒ³ãƒˆãŒå¿…è¦ã§ã™ã€‚今ã™ãアカウントを作æˆã—ã¾ã™ã‹ï¼Ÿ
- <url name="url">
- https://join.secondlife.com/index.php?lang=ja-JP
- </url>
- <usetemplate name="okcancelbuttons" notext="ã‚‚ã†ä¸€åº¦è©¦ã™" yestext="æ–°ã—ã„アカウントを作æˆ"/>
- </notification>
- <notification name="InvalidCredentialFormat">
- ユーザーåã®ãƒ•ィールドã«ã‚¢ãƒã‚¿ãƒ¼ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼åã‚‚ã—ãã¯æ°åを入力ã—ã¦ã‹ã‚‰ã€å†åº¦ãƒ­ã‚°ã‚¤ãƒ³ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚
- </notification>
- <notification name="DeleteClassified">
- クラシファイド広告 [NAME] を削除ã—ã¾ã™ã‹ï¼Ÿ
-æ”¯æ‰•ã„æ¸ˆã¿ã®æ–™é‡‘ã¯è¿”金ã•れã¾ã›ã‚“。
- <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
- </notification>
- <notification name="DeleteMedia">
- ã“ã®é¢ã«ã‚るメディアを削除ã™ã‚‹é¸æŠžã‚’ã—ã¾ã—ãŸã€‚
-ç¶šã‘ã¾ã™ã‹ï¼Ÿ
- <usetemplate ignoretext="オブジェクトã‹ã‚‰ãƒ¡ãƒ‡ã‚£ã‚¢ã‚’削除ã™ã‚‹å‰ã®ç¢ºèª" name="okcancelignore" notext="ã„ã„ãˆ" yestext="ã¯ã„"/>
- </notification>
- <notification name="ClassifiedSave">
- クラシファイド広告 [NAME] ã¸ã®å¤‰æ›´ã‚’ä¿å­˜ã—ã¾ã™ã‹ï¼Ÿ
- <usetemplate canceltext="キャンセル" name="yesnocancelbuttons" notext="ä¿å­˜ã—ãªã„" yestext="ä¿å­˜"/>
- </notification>
- <notification name="ClassifiedInsufficientFunds">
- クラシファイド広告を出ã™ã«ã¯ã€è³‡é‡‘ãŒè¶³ã‚Šã¾ã›ã‚“。
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="DeleteAvatarPick">
- &lt;nolink&gt;[PICK]&lt;/nolink&gt; を削除ã—ã¾ã™ã‹ï¼Ÿ
- <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
- </notification>
- <notification name="DeleteOutfits">
- é¸æŠžã—ãŸã‚¢ã‚¦ãƒˆãƒ•ィットを削除ã—ã¾ã™ã‹ï¼Ÿ
- <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
- </notification>
- <notification name="PromptGoToEventsPage">
- [SECOND_LIFE] イベント Web ページã«ç§»å‹•ã—ã¾ã™ã‹ï¼Ÿ
- <url name="url">
- http://secondlife.com/events/?lang=ja-JP
- </url>
- <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
- </notification>
- <notification name="SelectProposalToView">
- 表示ã™ã‚‹ææ¡ˆã‚’é¸æŠžã—ã¦ãã ã•ã„。
- </notification>
- <notification name="SelectHistoryItemToView">
- 表示ã™ã‚‹å±¥æ­´ã‚¢ã‚¤ãƒ†ãƒ ã‚’é¸æŠžã—ã¦ãã ã•ã„。
- </notification>
- <notification name="CacheWillClear">
- [APP_NAME] ã‚’å†èµ·å‹•後ã«ã‚­ãƒ£ãƒƒã‚·ãƒ¥ãŒã‚¯ãƒªã‚¢ã•れã¾ã™ã€‚
- </notification>
- <notification name="CacheWillBeMoved">
- [APP_NAME] ã‚’å†èµ·å‹•後ã«ã‚­ãƒ£ãƒƒã‚·ãƒ¥ãŒç§»å‹•ã•れã¾ã™ã€‚
-ã”æ³¨æ„: キャッシュãŒã‚¯ãƒªã‚¢ã•れã¾ã™ã€‚
- </notification>
- <notification name="ChangeConnectionPort">
- ãƒãƒ¼ãƒˆã®è¨­å®šã¯ [APP_NAME] ã‚’å†èµ·å‹•後ã«å映ã•れã¾ã™ã€‚
- </notification>
- <notification name="ChangeSkin">
- æ–°ã—ã„スキン㯠[APP_NAME] ã‚’å†èµ·å‹•後ã«è¡¨ç¤ºã•れã¾ã™ã€‚
- </notification>
- <notification name="ChangeLanguage">
- 言語ã®å¤‰æ›´ã¯ [APP_NAME] ã‚’å†èµ·å‹•後ã«å映ã•れã¾ã™ã€‚
- </notification>
- <notification name="GoToAuctionPage">
- [SECOND_LIFE]ã® Web ページã«ç§»å‹•ã—ã€å…¥æœ­ã‚ã‚‹ã„ã¯ã‚ªãƒ¼ã‚¯ã‚·ãƒ§ãƒ³ã®è©³ç´°ã‚’確èªã—ã¾ã™ã‹ï¼Ÿ
- <url name="url">
- http://secondlife.com/auctions/auction-detail.php?id=[AUCTION_ID]
- </url>
- <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
- </notification>
- <notification name="SaveChanges">
- 変更をä¿å­˜ã—ã¾ã™ã‹ï¼Ÿ
- <usetemplate canceltext="å–り消ã—" name="yesnocancelbuttons" notext="ä¿å­˜ã—ãªã„" yestext="ä¿å­˜"/>
- </notification>
- <notification name="GestureSaveFailedTooManySteps">
- ジェスãƒãƒ£ãƒ¼ã®ä¿å­˜ã«å¤±æ•—ã—ã¾ã—ãŸã€‚
-ステップãŒå¤šã™ãŽã¾ã™ã€‚
-ステップをã„ãã¤ã‹å‰Šé™¤ã—ã¦ã‹ã‚‰å†ä¿å­˜ã—ã¦ãã ã•ã„
- </notification>
- <notification name="GestureSaveFailedTryAgain">
- ジェスãƒãƒ£ãƒ¼ã®ä¿å­˜ã«å¤±æ•—ã—ã¾ã—ãŸã€‚å°‘ã—å¾…ã£ã¦ã‹ã‚‰ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。
- </notification>
- <notification name="GestureSaveFailedObjectNotFound">
- ジェスãƒãƒ£ãƒ¼ã®ä¿å­˜ã«å¤±æ•—ã—ã¾ã—ãŸã€‚オブジェクトã€ã¾ãŸã¯é–¢é€£ã™ã‚‹ã‚ªãƒ–ジェクトæŒã¡ç‰©ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。
-オブジェクトãŒç¯„囲内ã«å­˜åœ¨ã—ãªã„ã‹ã€ã¾ãŸã¯å‰Šé™¤ã•れãŸå¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚
- </notification>
- <notification name="GestureSaveFailedReason">
- 次ã®ç†ç”±ã§ã€ã‚¸ã‚§ã‚¹ãƒãƒ£ãƒ¼ã®ä¿å­˜æ™‚ã«å•題ãŒèµ·ã“りã¾ã—ãŸã€‚ [REASON]。 後ã§ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。
- </notification>
- <notification name="SaveNotecardFailObjectNotFound">
- ノートカードã®ä¿å­˜ã«å¤±æ•—ã—ã¾ã—ãŸã€‚オブジェクトã€ã¾ãŸã¯é–¢é€£ã™ã‚‹ã‚ªãƒ–ジェクトæŒã¡ç‰©ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。
-オブジェクトãŒç¯„囲内ã«å­˜åœ¨ã—ãªã„ã‹ã€ã¾ãŸã¯å‰Šé™¤ã•れãŸå¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚
- </notification>
- <notification name="SaveNotecardFailReason">
- 次ã®ç†ç”±ã§ã€ãƒŽãƒ¼ãƒˆã‚«ãƒ¼ãƒ‰ã®ä¿å­˜æ™‚ã«å•題ãŒèµ·ã“りã¾ã—ãŸã€‚ [REASON]。 後ã§ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。
- </notification>
- <notification name="ScriptCannotUndo">
- ã‚ãªãŸã®ã‚¹ã‚¯ãƒªãƒ—トã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã§ã¯ã€å¤‰æ›´ã‚’å…ƒã«æˆ»ã™ã“ã¨ã¯ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚
-サーãƒãƒ¼ã®æœ€æ–°ä¿å­˜ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ロードã—ã¾ã™ã‹ï¼Ÿ
-(**警告**:ã“ã®æ“ä½œå¾Œå…ƒã«æˆ»ã™ã“ã¨ã¯ã§ãã¾ã›ã‚“)
- <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
- </notification>
- <notification name="SaveScriptFailReason">
- 次ã®ç†ç”±ã§ã€ã‚¹ã‚¯ãƒªãƒ—トã®ä¿å­˜ã«å•題ãŒèµ·ã“りã¾ã—ãŸã€‚ [REASON]。 後ã§ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。
- </notification>
- <notification name="SaveScriptFailObjectNotFound">
- スクリプトã®ä¿å­˜ã«å¤±æ•—ã—ã¾ã—ãŸã€‚スクリプトãŒå…¥ã£ãŸã‚ªãƒ–ジェクトãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。
-オブジェクトã¯ç¯„囲外ã‹ã€ã¾ãŸã¯å‰Šé™¤ã•れã¦ã„ã‚‹ã‹ã‚‚ã—れã¾ã›ã‚“。
- </notification>
- <notification name="SaveBytecodeFailReason">
- 次ã®ç†ç”±ã§ã€ã‚³ãƒ³ãƒ‘イルã—ãŸã‚¹ã‚¯ãƒªãƒ—トã®ä¿å­˜æ™‚ã«å•題ãŒèµ·ã“りã¾ã—ãŸã€‚ [REASON]。 後ã§ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。
- </notification>
- <notification name="StartRegionEmpty">
- ログインä½ç½®ãŒæŒ‡å®šã•れã¦ã„ã¾ã›ã‚“。
-ログインä½ç½®ã®æ¬„ã«ãƒªãƒ¼ã‚¸ãƒ§ãƒ³åを入力ã™ã‚‹ã‹ã€ã€Œæœ€å¾Œã«ãƒ­ã‚°ã‚¢ã‚¦ãƒˆã—ãŸå ´æ‰€ã€ã‹ã€Œãƒ›ãƒ¼ãƒ ã€ã‚’é¸æŠžã—ã¦ãã ã•ã„。
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="CouldNotStartStopScript">
- スクリプトã®èµ·å‹•ã¾ãŸã¯åœæ­¢ã«å¤±æ•—ã—ã¾ã—ãŸã€‚ã‚¹ã‚¯ãƒªãƒ—ãƒˆãŒæ ¼ç´ã•れã¦ã„るオブジェクトãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。
-オブジェクトãŒç¯„囲内ã«å­˜åœ¨ã—ãªã„ã‹ã€ã¾ãŸã¯å‰Šé™¤ã•れãŸå¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚
- </notification>
- <notification name="CannotDownloadFile">
- ファイルをダウンロードã§ãã¾ã›ã‚“。
- </notification>
- <notification name="CannotWriteFile">
- ファイル [[FILE]] を書ãè¾¼ã‚ã¾ã›ã‚“。
- </notification>
- <notification name="UnsupportedHardware">
- ãŠä½¿ã„ã®ã‚³ãƒ³ãƒ”ューター㯠[APP_NAME] ã®å¿…è¦æœ€ä½Žé™ã®å‹•作環境を満ãŸã—ã¦ã„ã¾ã›ã‚“。 パフォーマンスã®ä½Žä¸‹ã‚’感ã˜ã‚‹ã‹ã‚‚ã—れã¾ã›ã‚“。 æã‚Œå…¥ã‚Šã¾ã™ãŒ [SUPPORT_SITE] ã§ã¯ã‚µãƒãƒ¼ãƒˆå¯¾è±¡å¤–ã®ã‚·ã‚¹ãƒ†ãƒ ã«é–¢ã™ã‚‹æŠ€è¡“的サãƒãƒ¼ãƒˆã¯è¡Œã£ã¦ãŠã‚Šã¾ã›ã‚“。
-
-[_URL] ã«ç§»å‹•ã—ã¦ç¢ºèªã‚’ã—ã¾ã™ã‹ï¼Ÿ
- <url name="url" option="0">
- http://secondlife.com/support/sysreqs.php?lang=ja
- </url>
- <usetemplate ignoretext="使用中ã®ã‚³ãƒ³ãƒ”ューターã®ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ãŒã‚µãƒãƒ¼ãƒˆã•れã¦ã„ãªã„ã¨ã" name="okcancelignore" notext="ã„ã„ãˆ" yestext="ã¯ã„"/>
- </notification>
- <notification name="UnknownGPU">
- ãŠä½¿ã„ã®ã‚·ã‚¹ãƒ†ãƒ ã«ã¯ã€[APP_NAME] ãŒèªè­˜ã§ããªã„ã‚°ãƒ©ãƒ•ã‚£ãƒƒã‚¯ã‚«ãƒ¼ãƒ‰ãŒæ­è¼‰ã•れã¦ã„ã¾ã™ã€‚
-[APP_NAME] ã§ã¾ã ãƒ†ã‚¹ãƒˆã•れã¦ã„ãªã„最新ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ã®ãŸã‚ã ã¨è€ƒãˆã‚‰ã‚Œã¾ã™ã€‚ å•題ãªã„ã¨ã¯æ€ã„ã¾ã™ãŒã€ã‚°ãƒ©ãƒ•ィックã®è¨­å®šã‚’調整ã™ã‚‹å¿…è¦ãŒã‚ã‚‹ã‹ã‚‚ã—れã¾ã›ã‚“。
-(ミー > 環境設定 > グラフィック)
- <form name="form">
- <ignore name="ignore" text="使用中ã®ã‚°ãƒ©ãƒ•ックカードãŒèªè­˜ã•れãªã„ã¨ã"/>
- </form>
- </notification>
- <notification name="DisplaySettingsNoShaders">
- グラフィックドライãƒã‚’åˆæœŸåŒ–中㫠[APP_NAME] ãŒã‚¯ãƒ©ãƒƒã‚·ãƒ¥ã—ã¾ã—ãŸã€‚
-ドライãƒã®ä¸€èˆ¬çš„ãªã‚¨ãƒ©ãƒ¼ã‚’防ããŸã‚ã«ã€ç”»è³ªãŒä½Žã«è¨­å®šã•れã¾ã™ã€‚ ãã®ãŸã‚ã€ä¸€éƒ¨ã®ã‚°ãƒ©ãƒ•ィック特性ã«åˆ¶é™ãŒå‡ºã¾ã™ã€‚
-ãŠä½¿ã„ã®ã‚°ãƒ©ãƒ•ィックカードã®ãƒ‰ãƒ©ã‚¤ãƒã‚’アップデートã™ã‚‹ã‚ˆã†ãŠã™ã™ã‚ã—ã¾ã™ã€‚
-画質ã¯ã€ç’°å¢ƒè¨­å®š > グラフィック ã§è¨­å®šã§ãã¾ã™ã€‚
- </notification>
- <notification name="RegionNoTerraforming">
- [REGION] ã§ã¯ã€åœ°å½¢ã®å¤‰æ›´ãŒã§ãã¾ã›ã‚“。
- </notification>
- <notification name="CannotCopyWarning">
- ã‚ãªãŸã«ã¯[ITEMS]ã¨ã„ã†ã‚¢ã‚¤ãƒ†ãƒ ã‚’コピーã™ã‚‹è¨±å¯ãŒã‚りã¾ã›ã‚“。他ã®ä½äººã«æä¾›ã™ã‚‹ã¨ã€ãã®ã‚¢ã‚¤ãƒ†ãƒ ã¯ã‚ãªãŸã®ã€ŒæŒã¡ç‰©ã€ã‹ã‚‰å‰Šé™¤ã•れã¾ã™ã€‚本当ã«ã“れらã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’譲りã¾ã™ã‹ï¼Ÿ
- <usetemplate name="okcancelbuttons" notext="ã„ã„ãˆ" yestext="ã¯ã„"/>
- </notification>
- <notification name="CannotGiveItem">
- æŒã¡ç‰©ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’渡ã›ã¾ã›ã‚“。
- </notification>
- <notification name="TransactionCancelled">
- å–引ãŒã‚­ãƒ£ãƒ³ã‚»ãƒ«ã•れã¾ã—ãŸã€‚
- </notification>
- <notification name="TooManyItems">
- 一度㫠42 個以上ã®ã‚¢ã‚¤ãƒ†ãƒ ã¯æ¸¡ã›ã¾ã›ã‚“。
- </notification>
- <notification name="NoItems">
- é¸æŠžã—ãŸã‚¢ã‚¤ãƒ†ãƒ ã‚’æ¸¡ã™æ¨©é™ãŒã‚りã¾ã›ã‚“。
- </notification>
- <notification name="CannotCopyCountItems">
- ã‚ãªãŸã¯é¸æŠžã—㟠[COUNT] 個ã®ã‚¢ã‚¤ãƒ†ãƒ ã®ã®ã‚³ãƒ”ーを許ã•れã¦ã„ã¾ã›ã‚“。
-ã“れらã®ã‚¢ã‚¤ãƒ†ãƒ ã¯ã‚ãªãŸã®ã€ŒæŒã¡ç‰©ã€ã‹ã‚‰å¤±ã‚れã¾ã™ã€‚
-本当ã«ã‚¢ã‚¤ãƒ†ãƒ ã‚’渡ã—ãŸã„ã§ã™ã‹ï¼Ÿ
- <usetemplate name="okcancelbuttons" notext="ã„ã„ãˆ" yestext="ã¯ã„"/>
- </notification>
- <notification name="CannotGiveCategory">
- é¸æŠžã—ãŸãƒ•ã‚©ãƒ«ãƒ€ã‚’æ¸¡ã™æ¨©é™ãŒã‚りã¾ã›ã‚“
- </notification>
- <notification name="FreezeAvatar">
- ã“ã®ã‚¢ãƒã‚¿ãƒ¼ã‚’フリーズã—ã¾ã™ã‹ï¼Ÿ
-ã‚¢ãƒã‚¿ãƒ¼ã¯ä¸€æ™‚çš„ã«å‹•ã‘ãªããªã‚Šã€ãƒãƒ£ãƒƒãƒˆã‚’å«ã‚インワールドã§ä½•ã‚‚ã§ããªããªã‚Šã¾ã™ã€‚
- <usetemplate canceltext="å–り消ã—" name="yesnocancelbuttons" notext="解除" yestext="フリーズ"/>
- </notification>
- <notification name="FreezeAvatarFullname">
- [AVATAR_NAME]をフリーズã—ã¾ã™ã‹ï¼Ÿ
-フリーズã•れãŸäººã¯ä¸€æ™‚çš„ã«å‹•ã‘ãªããªã‚Šã€ãƒãƒ£ãƒƒãƒˆãªã©ã€ã“ã®ä¸–界ã«å¯¾ã™ã‚‹é–¢ã‚りをæŒã¤ã“ã¨ãŒã§ããªããªã‚Šã¾ã™ã€‚
- <usetemplate canceltext="キャンセル" name="yesnocancelbuttons" notext="解除" yestext="フリーズ"/>
- </notification>
- <notification name="EjectAvatarFullname">
- ã‚ãªãŸã®åœŸåœ°ã‹ã‚‰ [AVATAR_NAME] を追放ã—ã¾ã™ã‹ï¼Ÿ
- <usetemplate canceltext="キャンセル" name="yesnocancelbuttons" notext="追放ã¨ç¦æ­¢" yestext="追放"/>
- </notification>
- <notification name="EjectAvatarNoBan">
- ã“ã®ã‚¢ãƒã‚¿ãƒ¼ã‚’ã‚ãªãŸã®åœŸåœ°ã‹ã‚‰è¿½æ”¾ã—ã¾ã™ã‹ï¼Ÿ
- <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="追放"/>
- </notification>
- <notification name="EjectAvatarFullnameNoBan">
- [AVATAR_NAME] ã‚’ã‚ãªãŸã®åœŸåœ°ã‹ã‚‰è¿½æ”¾ã—ã¾ã™ã‹ï¼Ÿ
- <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="追放"/>
- </notification>
- <notification name="EjectAvatarFromGroup">
- [GROUP_NAME] ã‹ã‚‰ [AVATAR_NAME] を追放ã—ã¾ã—ãŸ
- </notification>
- <notification name="AcquireErrorTooManyObjects">
- å–å¾—ã‚¨ãƒ©ãƒ¼ï¼šé¸æŠžã—ãŸã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã®æ•°ãŒå¤šã™ãŽã¾ã™ã€‚
- </notification>
- <notification name="AcquireErrorObjectSpan">
- å–得エラー:
-オブジェクトãŒè¤‡æ•°ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼ˆåœ°åŸŸï¼‰ã«ã¾ãŸãŒã£ã¦å­˜åœ¨ã—ã¦ã„ã¾ã™ã€‚
-ã™ã¹ã¦åŒã˜ãƒªãƒ¼ã‚¸ãƒ§ãƒ³å†…ã«ç§»å‹•ã•ã›ã¦ã‹ã‚‰å–å¾—ã—ã¦ãã ã•ã„。
- </notification>
- <notification name="PromptGoToCurrencyPage">
- [EXTRA]
-
-[_URL] ã«ç§»å‹•ã—ã¦ãƒªãƒ³ãƒ‡ãƒ³ãƒ‰ãƒ«è³¼å…¥ã«é–¢ã™ã‚‹æƒ…報を確èªã—ã¾ã™ã‹ï¼Ÿ
- <url name="url">
- http://secondlife.com/app/currency/?lang=ja-JP
- </url>
- <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
- </notification>
- <notification name="UnableToLinkObjects">
- [COUNT] 個ã®ã‚ªãƒ–ジェクトをリンクã§ãã¾ã›ã‚“。
-リンクã§ãã‚‹ã®ã¯æœ€å¤§ [MAX] 個ã§ã™ã€‚
- </notification>
- <notification name="CannotLinkIncompleteSet">
- ã‚»ãƒƒãƒˆã§æƒã£ã¦ã„るオブジェクトã®ã¿ãƒªãƒ³ã‚¯ã§ãã¾ã™ã€‚
-複数ã®ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’é¸æŠžã—ã¦ãã ã•ã„。
- </notification>
- <notification name="CannotLinkModify">
- ã™ã¹ã¦ã®ã‚ªãƒ–ジェクトã®ä¿®æ­£è¨±å¯ãŒãªã„ãŸã‚リンクã§ãã¾ã›ã‚“。
-
-ã©ã®ã‚ªãƒ–ジェクトもロックã•れã¦ãŠã‚‰ãšã€ã‚ãªãŸã®ã‚‚ã®ã§ã‚ã‚‹ã“ã¨ã‚’確èªã—ã¦ãã ã•ã„。
- </notification>
- <notification name="CannotLinkDifferentOwners">
- 所有者ãŒç•°ãªã‚‹ãŸã‚ã€ã‚ªãƒ–ジェクトをリンクã§ãã¾ã›ã‚“。
-
-è‡ªåˆ†ãŒæ‰€æœ‰ã—ã¦ã„るオブジェクトã ã‘ã‚’é¸æŠžã—ã¦ãã ã•ã„。
- </notification>
- <notification name="NoFileExtension">
- 「 [FILE] ã€ã®æ‹¡å¼µå­ãŒç„¡åйã§ã™ã€‚
-
-ã“ã®ãƒ•ã‚¡ã‚¤ãƒ«ã®æ‹¡å¼µå­ãŒæ­£ã—ã„ã‹ã©ã†ã‹ã‚’確èªã—ã¦ãã ã•ã„。
- </notification>
- <notification name="InvalidFileExtension">
- [EXTENSION] ã¯ç„¡åйã§ã™ã€‚
-æ­£ã—ã„æ‹¡å¼µå­ï¼š[VALIDS]
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="CannotUploadSoundFile">
- 読ã¿è¾¼ã¿ã®ãŸã‚ã«ã‚¢ãƒƒãƒ—ロードã•れãŸã‚µã‚¦ãƒ³ãƒ‰ãƒ•ァイルを開ã‘ã¾ã›ã‚“:
-[FILE]
- </notification>
- <notification name="SoundFileNotRIFF">
- RIFF WAVE ファイルã¨ã—ã¦èªè­˜ã•れã¾ã›ã‚“:
-[FILE]
- </notification>
- <notification name="SoundFileNotPCM">
- PCM WAVE オーディオファイルã¨ã—ã¦èªè­˜ã•れã¾ã›ã‚“:
-[FILE]
- </notification>
- <notification name="SoundFileInvalidChannelCount">
- ファイルã®ãƒãƒ£ãƒ³ãƒãƒ«æ•°ãŒç„¡åйã§ã™ï¼ˆãƒ¢ãƒŽãƒ©ãƒ«ã¾ãŸã¯ã‚¹ãƒ†ãƒ¬ã‚ªã‚’使用ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ï¼‰ï¼š
-[FILE]
- </notification>
- <notification name="SoundFileInvalidSampleRate">
- ファイルã®ã‚µãƒ³ãƒ—ルレートãŒã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“(44.1k ã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™ï¼‰ï¼š
-[FILE]
- </notification>
- <notification name="SoundFileInvalidWordSize">
- ファイルã®ãƒ¯ãƒ¼ãƒ‰ã‚µã‚¤ã‚ºãŒã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“(8 ã¾ãŸã¯ 16 ビットã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™ï¼‰ï¼š
-[FILE]
- </notification>
- <notification name="SoundFileInvalidHeader">
- WAV ヘッダーã«ãƒ‡ãƒ¼ã‚¿ãƒãƒ£ãƒ³ã‚¯ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“:
-[FILE]
- </notification>
- <notification name="SoundFileInvalidChunkSize">
- WAV ファイルã®ãƒãƒ£ãƒ³ã‚¯ã‚µã‚¤ã‚ºãŒé–“é•ã£ã¦ã„ã¾ã™ï¼š
-[FILE]
- </notification>
- <notification name="SoundFileInvalidTooLong">
- オーディオファイルãŒé•·ã™ãŽã¾ã™ã€‚(最大 10 秒):
-[FILE]
- </notification>
- <notification name="ProblemWithFile">
- 「 [FILE] ã€ã«å•題ãŒã‚りã¾ã™ã€‚
-
-[ERROR]
- </notification>
- <notification name="CannotOpenTemporarySoundFile">
- 書ãè¾¼ã¿ç”¨ã®ä¸€æ™‚圧縮サウンドファイルを開ãã“ã¨ãŒã§ãã¾ã›ã‚“:[FILE]
- </notification>
- <notification name="UnknownVorbisEncodeFailure">
- 䏿˜Žã® Vorbis ã®ã‚¨ãƒ³ã‚³ãƒ¼ãƒ‰ã«å¤±æ•—: [FILE]
- </notification>
- <notification name="CannotEncodeFile">
- 次ã®ãƒ•ァイルã®ã‚¨ãƒ³ã‚³ãƒ¼ãƒ‰ãŒã§ãã¾ã›ã‚“: [FILE]
- </notification>
- <notification name="CorruptedProtectedDataStore">
- ユーザーåã¨ãƒ‘スワードを自動入力ã§ãã¾ã›ã‚“。ã“れã¯ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯è¨­å®šãŒå¤‰æ›´ã•れãŸå ´åˆã«èµ·ã“りã¾ã™
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="CorruptResourceFile">
- ç ´æã—ãŸãƒªã‚½ãƒ¼ã‚¹ãƒ•ァイル: [FILE]
- </notification>
- <notification name="UnknownResourceFileVersion">
- 䏿˜Žã®ãƒªãƒ³ãƒ‡ãƒ³ãƒªã‚½ãƒ¼ã‚¹ãƒ•ァイルã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ï¼š [FILE]
- </notification>
- <notification name="UnableToCreateOutputFile">
- 出力ファイルを作æˆã§ãã¾ã›ã‚“: [FILE]
- </notification>
- <notification name="DoNotSupportBulkAnimationUpload">
- ç¾åœ¨ [APP_NAME] ã§ã¯ã€ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã®ä¸€æ‹¬ã‚¢ãƒƒãƒ—ロードã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“。
- </notification>
- <notification name="CannotUploadReason">
- 次ã®ç†ç”±ã§ã€ã€Œ [FILE] ã€ã‚’アップロードã§ãã¾ã›ã‚“: [REASON]
-ã‚ã¨ã§ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。
- </notification>
- <notification name="LandmarkCreated">
- 「 [LANDMARK_NAME] ã€ã‚’「 [FOLDER_NAME] ã€ãƒ•ォルダã«è¿½åŠ ã—ã¾ã—ãŸã€‚
- </notification>
- <notification name="LandmarkAlreadyExists">
- ç¾åœ¨åœ°ã®ãƒ©ãƒ³ãƒ‰ãƒžãƒ¼ã‚¯ã‚’æ—¢ã«æŒã£ã¦ã„ã¾ã™ã€‚
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="CannotCreateLandmarkNotOwner">
- åœŸåœ°ã®æ‰€æœ‰è€…ãŒè¨±å¯ã—ã¦ã„ãªã„ãŸã‚ã€ãƒ©ãƒ³ãƒ‰ãƒžãƒ¼ã‚¯ã‚’作æˆã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。
- </notification>
- <notification name="CannotRecompileSelectObjectsNoScripts">
- 「リコンパイルã€ã§ãã¾ã›ã‚“。
-スクリプトã®ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’é¸æŠžã—ã¦ãã ã•ã„。
- </notification>
- <notification name="CannotRecompileSelectObjectsNoPermission">
- 「リコンパイルã€ã§ãã¾ã›ã‚“。
-
-修正修正権é™ã®ã‚るスクリプトã®ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’é¸æŠžã—ã¦ãã ã•ã„。
- </notification>
- <notification name="CannotResetSelectObjectsNoScripts">
- 「å†è¨­å®šã€ãŒã§ãã¾ã›ã‚“。
-
-スクリプトã®ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’é¸æŠžã—ã¦ãã ã•ã„。
- </notification>
- <notification name="CannotResetSelectObjectsNoPermission">
- 「å†è¨­å®šã€ãŒã§ãã¾ã›ã‚“。
-
-修正権é™ã®ã‚るスクリプトã®ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’é¸æŠžã—ã¦ãã ã•ã„。
- </notification>
- <notification name="CannotOpenScriptObjectNoMod">
- 修正権é™ã®ãªã„オブジェクトã®ã‚¹ã‚¯ãƒªãƒ—トã¯é–‹ãã“ã¨ã¯ã§ãã¾ã›ã‚“。
- </notification>
- <notification name="CannotSetRunningSelectObjectsNoScripts">
- スクリプトã®ã€Œå®Ÿè¡Œã€ãŒã§ãã¾ã›ã‚“。
-
-スクリプトã®ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’é¸æŠžã—ã¦ãã ã•ã„。
- </notification>
- <notification name="CannotSetRunningNotSelectObjectsNoScripts">
- スクリプトを「実行ã—ãªã„ã€è¨­å®šã«ã§ãã¾ã›ã‚“。
-
-スクリプトã®ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’é¸æŠžã—ã¦ãã ã•ã„。
- </notification>
- <notification name="NoFrontmostFloater">
- ä¿å­˜ã™ã‚‹ frontmost フロータãŒã‚りã¾ã›ã‚“。
- </notification>
- <notification name="SeachFilteredOnShortWords">
- 指定ã—ãŸæ¤œç´¢ã‚¯ã‚¨ãƒªã¯å¤‰æ›´ã•れã€çŸ­ã™ãŽã‚‹èªžå¥ã¯å–り除ã‹ã‚Œã¦ã„ã¾ã™ã€‚
-
-検索語å¥ï¼š [FINALQUERY]
- </notification>
- <notification name="SeachFilteredOnShortWordsEmpty">
- 指定ã—ãŸæ¤œç´¢èªžå¥ãŒçŸ­ã™ãŽãŸãŸã‚ã€æ¤œç´¢ã¯è¡Œã‚れã¾ã›ã‚“ã§ã—ãŸã€‚
- </notification>
- <notification name="CouldNotTeleportReason">
- テレãƒãƒ¼ãƒˆã«å¤±æ•—ã—ã¾ã—ãŸã€‚
-[REASON]
- </notification>
- <notification name="invalid_tport">
- テレãƒãƒ¼ãƒˆå‡¦ç†ä¸­ã«å•題ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ ログインã—ç›´ã™å¿…è¦ãŒã‚ã‚‹ã‹ã‚‚ã—れã¾ã›ã‚“。
-ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒä½•度も出る場åˆã¯ã€[SUPPORT_SITE] ã‚’ã”確èªãã ã•ã„。
- </notification>
- <notification name="invalid_region_handoff">
- リージョン間ã®ç§»å‹•中ã«å•題ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ ログインã—ç›´ã™å¿…è¦ãŒã‚ã‚‹ã‹ã‚‚ã—れã¾ã›ã‚“。
-ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒä½•度も出る場åˆã¯ã€[SUPPORT_SITE] ã‚’ã”確èªãã ã•ã„。
- </notification>
- <notification name="blocked_tport">
- 申ã—訳ã”ã–ã„ã¾ã›ã‚“。テレãƒãƒ¼ãƒˆã¯ç¾åœ¨ã€ãƒ–ロックã•れã¦ã„ã¾ã™ã€‚ã—ã°ã‚‰ãã—ã¦ã‹ã‚‰å†åº¦ãŠè©¦ã—ãã ã•ã„。
-ãれã§ã‚‚テレãƒãƒ¼ãƒˆã§ããªã„å ´åˆã¯ã€ãƒ­ã‚°ã‚¢ã‚¦ãƒˆã—ã€ãƒ­ã‚°ã‚¤ãƒ³ã—ç›´ã—ã¦å•題を解決ã—ã¦ãã ã•ã„。
- </notification>
- <notification name="nolandmark_tport">
- 申ã—訳ã”ã–ã„ã¾ã›ã‚“。ランドマークã®ç›®çš„地ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚
- </notification>
- <notification name="timeout_tport">
- 申ã—訳ã”ã–ã„ã¾ã›ã‚“。システムã«ã‚ˆã‚‹ãƒ†ãƒ¬ãƒãƒ¼ãƒˆæŽ¥ç¶šãŒå®Œäº†ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚
-ã—ã°ã‚‰ãã—ã¦ã‹ã‚‰å†åº¦ãŠè©¦ã—ãã ã•ã„。
- </notification>
- <notification name="noaccess_tport">
- 残念ãªãŒã‚‰ã€ç›®çš„地ã¸ã‚¢ã‚¯ã‚»ã‚¹ãŒè¨±å¯ã•れã¦ã„ãªã„ãŸã‚ã€ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã§ãã¾ã›ã‚“。
- </notification>
- <notification name="missing_attach_tport">
- 添付物ãŒã¾ã å±Šã„ã¦ã„ã¾ã›ã‚“。テレãƒãƒ¼ãƒˆã‚’ã™ã‚‹å‰ã«ã‚ã¨æ•°ç§’é–“ãŠå¾…ã¡ã„ãŸã ãã‹ã€ã„ã£ãŸã‚“ログアウトã—ã€å†åº¦ãƒ­ã‚°ã‚¤ãƒ³ã—ã¦ãã ã•ã„。
- </notification>
- <notification name="too_many_uploads_tport">
- ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã®ã‚¢ã‚»ãƒƒãƒˆã‚­ãƒ¥ãƒ¼ãŒç¾åœ¨æ··ã¿åˆã£ã¦ã„ã‚‹ãŸã‚ã€ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã®ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’ã™ãã«å‡¦ç†ã™ã‚‹ã“ã¨ãŒé›£ã—ã„状æ³ã§ã™ã€‚
-数分後ã«ã‚„り直ã™ã‹ã€æ··é›‘ã—ã¦ã„ãªã„ä»–ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã§ãŠè©¦ã—ãã ã•ã„。
- </notification>
- <notification name="expired_tport">
- 申ã—訳ã”ã–ã„ã¾ã›ã‚“。システムã¯ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã®ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’時間ã©ãŠã‚Šã«å®Œäº†ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚数分後ã«ã‚„り直ã—ã¦ãã ã•ã„。
- </notification>
- <notification name="expired_region_handoff">
- 申ã—訳ã”ã–ã„ã¾ã›ã‚“。システムã¯ãƒªãƒ¼ã‚¸ãƒ§ãƒ³é–“ã®ç§»å‹•を時間ã©ãŠã‚Šã«å®Œäº†ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚
-数分後ã«ã‚„り直ã—ã¦ãã ã•ã„。
- </notification>
- <notification name="no_host">
- テレãƒãƒ¼ãƒˆç›®çš„地を見ã¤ã‘られã¾ã›ã‚“。目的地ãŒä¸€æ™‚çš„ã«åˆ©ç”¨ã§ããªã„状態ã‹ã€ã™ã§ã«æ¶ˆæ»…ã—ã¦ã„ã‚‹å¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚数分後ã«ã‚„り直ã—ã¦ãã ã•ã„。
- </notification>
- <notification name="no_inventory_host">
- æŒã¡ç‰©ã‚·ã‚¹ãƒ†ãƒ ã¯ç¾åœ¨åˆ©ç”¨ã§ãã¾ã›ã‚“。
- </notification>
- <notification name="CannotSetLandOwnerNothingSelected">
- 土地所有者設定ãŒã§ãã¾ã›ã‚“:
-区画ãŒé¸å®šã•れã¦ã„ã¾ã›ã‚“。
- </notification>
- <notification name="CannotSetLandOwnerMultipleRegions">
- 複数ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ãŒé¸æŠžã•れãŸãŸã‚ã€åœŸåœ°ã®æ‰€æœ‰æ¨©ã‚’å–å¾—ã§ãã¾ã›ã‚“。
-é¸æŠžã™ã‚‹é¢ç©ã‚’å°ã•ãã—ã¦ã€ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。
- </notification>
- <notification name="ForceOwnerAuctionWarning">
- ã“ã®åŒºç”»ã¯ã‚ªãƒ¼ã‚¯ã‚·ãƒ§ãƒ³ã«å‡ºã•れã¦ã„ã¾ã™ã€‚ 所有権を変更ã™ã‚‹ã¨ã‚ªãƒ¼ã‚¯ã‚·ãƒ§ãƒ³ã¯ã‚­ãƒ£ãƒ³ã‚»ãƒ«ã¨ãªã‚Šã€æ—¢ã«ã‚ªãƒ¼ã‚¯ã‚·ãƒ§ãƒ³ã«å‚加ã—ã¦ã„ã‚‹ä½äººãŒã„れã°ãã®äººã«è¿·æƒ‘ã‚’ã‹ã‘ã¦ã—ã¾ã„ã¾ã™ã€‚
-所有権を変更ã—ã¾ã™ã‹ï¼Ÿ
- <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
- </notification>
- <notification name="CannotContentifyNothingSelected">
- コンテンツ化ã¯ä¸å¯èƒ½ã§ã™ï¼š
-区画ãŒé¸å®šã•れã¦ã„ã¾ã›ã‚“。
- </notification>
- <notification name="CannotContentifyNoRegion">
- コンテンツ化ã¯ä¸å¯èƒ½ã§ã™ï¼š
-土地ãŒé¸æŠžã•れã¦ã„ã¾ã›ã‚“。
- </notification>
- <notification name="CannotReleaseLandNothingSelected">
- 土地を破棄ã§ãã¾ã›ã‚“:
-区画ãŒé¸å®šã•れã¦ã„ã¾ã›ã‚“。
- </notification>
- <notification name="CannotReleaseLandNoRegion">
- 土地を破棄ã§ãã¾ã›ã‚“:
-リージョンãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。
- </notification>
- <notification name="CannotBuyLandNothingSelected">
- 土地を購入ã§ãã¾ã›ã‚“:
-区画ãŒé¸å®šã•れã¦ã„ã¾ã›ã‚“。
- </notification>
- <notification name="CannotBuyLandNoRegion">
- 土地を購入ã§ãã¾ã›ã‚“:
-ã“ã®åœŸåœ°ãŒã‚るリージョンを見ã¤ã‘ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“
- </notification>
- <notification name="CannotCloseFloaterBuyLand">
- [APP_NAME] ãŒã“ã®å–引価格を見ç©ã‚‚ã‚‹ã¾ã§ã¯ã€åœŸåœ°ã®è³¼å…¥ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã‚’é–‰ã˜ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。
- </notification>
- <notification name="CannotDeedLandNothingSelected">
- 土地を譲渡ã§ãã¾ã›ã‚“:
-区画ãŒé¸å®šã•れã¦ã„ã¾ã›ã‚“。
- </notification>
- <notification name="CannotDeedLandNoGroup">
- 土地を譲渡ã§ãã¾ã›ã‚“:
-グループãŒé¸æŠžã•れã¦ã„ã¾ã›ã‚“。
- </notification>
- <notification name="CannotDeedLandNoRegion">
- 土地を譲渡ã§ãã¾ã›ã‚“:
-ã“ã®åœŸåœ°ãŒã‚るリージョンãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。
- </notification>
- <notification name="CannotDeedLandMultipleSelected">
- 土地を譲渡ã§ãã¾ã›ã‚“:
-複数ã®åŒºç”»ãŒé¸æŠžã•れã¦ã„ã¾ã™ã€‚
-
-区画を 1 ã¤é¸æŠžã—ã¦ãã ã•ã„。
- </notification>
- <notification name="CannotDeedLandWaitingForServer">
- 土地を譲渡ã§ãã¾ã›ã‚“:
-サーãƒãƒ¼ã‹ã‚‰ã®æ‰€æœ‰æ¨©æƒ…報を待ã£ã¦ã„ã¾ã™ã€‚
-
-å†åº¦ã€è©¦ã¿ã¦ãã ã•ã„。
- </notification>
- <notification name="CannotDeedLandNoTransfer">
- 土地を譲渡ã§ãã¾ã›ã‚“:
-[REGION] ã§ã¯åœŸåœ°ã®è­²æ¸¡ãŒè¨±ã•れã¦ã„ã¾ã›ã‚“。
- </notification>
- <notification name="CannotReleaseLandWatingForServer">
- 土地を破棄ã§ãã¾ã›ã‚“:
-サーãƒãƒ¼ãŒåŒºç”»æƒ…報を更新ã™ã‚‹ã®ã‚’å¾…ã£ã¦ã„ã¾ã™ã€‚
-
-ã‚‚ã†å°‘ã—後ã§ã‚„り直ã—ã¦ãã ã•ã„。
- </notification>
- <notification name="CannotReleaseLandSelected">
- 土地を破棄ã§ãã¾ã›ã‚“:
-ã‚ãªãŸã¯ã€é¸æŠžã—ãŸåŒºç”»ã®ã™ã¹ã¦ã‚’所有ã—ã¦ã„ã¾ã›ã‚“。
-
-区画を 1 ã¤é¸æŠžã—ã¦ãã ã•ã„。
- </notification>
- <notification name="CannotReleaseLandDontOwn">
- 土地を破棄ã§ãã¾ã›ã‚“:
-ã‚ãªãŸã¯ã“ã®åœŸåœ°ã‚’手放ã™ã“ã¨ã‚’許å¯ã•れã¦ã„ã¾ã›ã‚“。
-ã‚ãªãŸã®åŒºç”»ã¯ç·‘色ã§è¡¨ç¤ºã•れã¦ã„ã¾ã™ã€‚
- </notification>
- <notification name="CannotReleaseLandRegionNotFound">
- 土地を放棄ã§ãã¾ã›ã‚“:
-ã“ã®åœŸåœ°ãŒã‚るリージョンãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。
- </notification>
- <notification name="CannotReleaseLandNoTransfer">
- 土地を破棄ã§ãã¾ã›ã‚“:
-[REGION] ã§ã¯åœŸåœ°ã®è­²æ¸¡ãŒè¨±ã•れã¦ã„ã¾ã›ã‚“。
- </notification>
- <notification name="CannotReleaseLandPartialSelection">
- 土地を破棄ã§ãã¾ã›ã‚“:
-åŒºç”»å…¨ä½“ã‚’é¸æŠžã—ã¦ç ´æ£„ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚
-
-åŒºç”»å…¨ä½“ã‚’é¸æŠžã™ã‚‹ã‹ã€ã¾ãŸã¯ã€ã¾ãšæœ€åˆã«åŒºç”»ã‚’分割ã—ã¦ãã ã•ã„。
- </notification>
- <notification name="ReleaseLandWarning">
- ã‚ãªãŸã¯ã€[AREA] 平方メートルã®åœŸåœ°ã‚’破棄ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚
-ã“ã®åŒºç”»ã‚’破棄ã™ã‚‹ã¨ã‚ãªãŸã®åœŸåœ°ã§ã¯ãªããªã‚Šã¾ã™ãŒã€
-L$ ã¯è¿”金ã•れã¾ã›ã‚“。
-
-土地を破棄ã—ã¾ã™ã‹ï¼Ÿ
- <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
- </notification>
- <notification name="CannotDivideLandNothingSelected">
- 土地を分割ã§ãã¾ã›ã‚“:
-
-区画ãŒé¸å®šã•れã¦ã„ã¾ã›ã‚“。
- </notification>
- <notification name="CannotDivideLandPartialSelection">
- 土地を分割ã§ãã¾ã›ã‚“:
-
-区画全体ãŒé¸æŠžã•れã¦ã„ã¾ã™ã€‚
-区画ã®ä¸€éƒ¨ã‚’é¸æŠžã—ã¦ãã ã•ã„。
- </notification>
- <notification name="LandDivideWarning">
- ã“ã®åœŸåœ°ã‚’分割ã™ã‚‹ã¨ã€2 ã¤ã®åŒºç”»ã«åˆ¥ã‚Œã¾ã™ã€‚
-区画ã”ã¨ã®è¨­å®šãŒå¯èƒ½ã«ãªã‚Šã¾ã™ã€‚ ã“ã®æ“作を行ã†ã¨ã€ä¸€éƒ¨ã®è¨­å®šãŒãƒ‡ãƒ•ォルトã«ãƒªã‚»ãƒƒãƒˆã•れã¾ã™ã€‚
-
-土地ã®åˆ†å‰²æ“作を続行ã—ã¾ã™ã‹ï¼Ÿ
- <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
- </notification>
- <notification name="CannotDivideLandNoRegion">
- 土地を分割ã§ãã¾ã›ã‚“:
-ã“ã®åœŸåœ°ãŒã‚るリージョンãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。
- </notification>
- <notification name="CannotJoinLandNoRegion">
- 土地を統åˆã§ãã¾ã›ã‚“:
-ã“ã®åœŸåœ°ãŒã‚るリージョンãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。
- </notification>
- <notification name="CannotJoinLandNothingSelected">
- 土地を統åˆã§ãã¾ã›ã‚“ã§ã—ãŸï¼š
-区画ãŒé¸å®šã•れã¦ã„ã¾ã›ã‚“。
- </notification>
- <notification name="CannotJoinLandEntireParcelSelected">
- 土地を統åˆã§ãã¾ã›ã‚“:
-区画㌠1 ã¤ã—ã‹é¸æŠžã•れã¦ã„ã¾ã›ã‚“。
-
-両方ã®åŒºç”»ã‚’ã¾ãŸã„ã§åœŸåœ°ã‚’é¸æŠžã—ã¦ãã ã•ã„。
- </notification>
- <notification name="CannotJoinLandSelection">
- 土地を統åˆã§ãã¾ã›ã‚“:
-区画を 1 ã¤ä»¥ä¸Šé¸æŠžã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚
-
-両方ã®åŒºç”»ã‚’ã¾ãŸã„ã§åœŸåœ°ã‚’é¸æŠžã—ã¦ãã ã•ã„。
- </notification>
- <notification name="JoinLandWarning">
- ã“ã®åœŸåœ°ã‚’çµ±åˆã™ã‚‹ã¨ã€é¸æŠžã•れãŸé•·æ–¹å½¢ã«äº¤å·®ã™ã‚‹å…¨ã¦ã®åŒºç”»ã‚’基ã«ã—ã¦ã€å¤§ããªåŒºç”»ãŒ 1 ã¤ä½œæˆã•れã¾ã™ã€‚
-æ–°ã—ã„区画ã®åå‰ã¨ã‚ªãƒ—ションをå†è¨­å®šã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚
-
-土地を統åˆã—ã¾ã™ã‹ï¼Ÿ
- <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
- </notification>
- <notification name="ConfirmNotecardSave">
- ã“ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’コピーã€è¡¨ç¤ºã™ã‚‹å‰ã«ã€ãƒŽãƒ¼ãƒˆã‚«ãƒ¼ãƒ‰ã®ä¿å­˜ãŒå¿…è¦ã§ã™ã€‚ ä¿å­˜ã—ã¾ã™ã‹ï¼Ÿ
- <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
- </notification>
- <notification name="ConfirmItemCopy">
- ã“ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’ã‚ãªãŸã®æŒã¡ç‰©ã«ã‚³ãƒ”ーã—ã¾ã™ã‹ï¼Ÿ
- <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="コピー"/>
- </notification>
- <notification name="ResolutionSwitchFail">
- è§£åƒåº¦ã‚’ [RESX]x[RESY] ã«åˆ‡ã‚Šæ›¿ãˆã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ã§ã—ãŸã€‚
- </notification>
- <notification name="ErrorUndefinedGrasses">
- ã‚¨ãƒ©ãƒ¼ï¼šæœªå®šç¾©ã®æ¤ç‰©ï¼š[SPECIES]
- </notification>
- <notification name="ErrorUndefinedTrees">
- ã‚¨ãƒ©ãƒ¼ï¼šæœªå®šç¾©ã®æ¨¹æœ¨ï¼š[SPECIES]
- </notification>
- <notification name="CannotSaveWearableOutOfSpace">
- 「 [NAME] ã€ã‚’衣類ã®ãƒ•ァイルã«ä¿å­˜ã§ãã¾ã›ã‚“。
-コンピューターã®ãƒ‡ã‚£ã‚¹ã‚¯ã‚¹ãƒšãƒ¼ã‚¹ã‚’å°‘ã—増やã—ã¦ã‹ã‚‰ã€ã‚‚ã†ä¸€åº¦ä¿å­˜ã—ã¦ã¿ã¦ãã ã•ã„。
- </notification>
- <notification name="CannotSaveToAssetStore">
- 「 [NAME] ã€ã‚’ä¿å­˜ã§ãã¾ã›ã‚“。
-通常ã“れã¯ä¸€æ™‚çš„ãªã‚¨ãƒ©ãƒ¼ã§ã™ã€‚ 数分後ã«ã‚‚ã†ä¸€åº¦ç€ç”¨ç‰©ã‚’カスタマイズ・ä¿å­˜ã—ã¦ãã ã•ã„。
- </notification>
- <notification name="YouHaveBeenLoggedOut">
- ã—ã¾ã£ãŸã€ [SECOND_LIFE] ã‹ã‚‰ãƒ­ã‚°ã‚¢ã‚¦ãƒˆã•れã¦ã—ã¾ã„ã¾ã—ãŸã€‚
- [MESSAGE]
- <usetemplate name="okcancelbuttons" notext="終了" yestext="IMã¨ãƒãƒ£ãƒƒãƒˆã‚’表示"/>
- </notification>
- <notification name="OnlyOfficerCanBuyLand">
- グループ用ã®åœŸåœ°ã®è³¼å…¥ãŒã§ãã¾ã›ã‚“:
-ã‚ãªãŸã«ã¯ã‚¢ã‚¯ãƒ†ã‚£ãƒ–ãªã‚°ãƒ«ãƒ¼ãƒ—ã®ãŸã‚ã«åœŸåœ°ã‚’購入ã™ã‚‹æ¨©é™ãŒã‚りã¾ã›ã‚“。
- </notification>
- <notification label="フレンド登録" name="AddFriendWithMessage">
- フレンド登録ã™ã‚‹ã¨ã€ãŠäº’ã„ã®ç¾åœ¨åœ°ã®åœ°å›³ã¸ã®è¡¨ç¤ºè¨±å¯ã€ã‚ªãƒ³ãƒ©ã‚¤ãƒ³çŠ¶æ…‹ã®è¡¨ç¤ºè¨­å®šãŒã§ãã¾ã™ã€‚
-
-[NAME] ã«ãƒ•レンドシップを申ã—出ã¾ã™ã‹ï¼Ÿ
- <form name="form">
- <input name="message">
- フレンド登録ã—ã¦ãれã¾ã™ã‹ï¼Ÿ
- </input>
- <button name="Offer" text="OK"/>
- <button name="Cancel" text="キャンセル"/>
- </form>
- </notification>
- <notification label="アウトフィットをä¿å­˜ã™ã‚‹" name="SaveOutfitAs">
- ç€ç”¨ä¸­ã®ã‚¢ã‚¦ãƒˆãƒ•ィットを新ã—ã„アウトフットã¨ã—ã¦ä¿å­˜ï¼š
- <form name="form">
- <input name="message">
- [DESC] (新)
- </input>
- <button name="OK" text="OK"/>
- <button name="Cancel" text="キャンセル"/>
- </form>
- </notification>
- <notification label="ç€ç”¨ç‰©ã‚’ä¿å­˜" name="SaveWearableAs">
- アイテムを別åã§æŒã¡ç‰©ã«ä¿å­˜ï¼š
- <form name="form">
- <input name="message">
- [DESC](新è¦ï¼‰
- </input>
- <button name="OK" text="OK"/>
- <button name="Cancel" text="å–り消ã—"/>
- </form>
- </notification>
- <notification label="アウトフィットã®åå‰ã‚’変更ã™ã‚‹" name="RenameOutfit">
- æ–°ã—ã„アウトフィットã®åå‰ï¼š
- <form name="form">
- <input name="new_name">
- [NAME]
- </input>
- <button name="OK" text="OK"/>
- <button name="Cancel" text="å–り消ã—"/>
- </form>
- </notification>
- <notification name="RemoveFromFriends">
- フレンドリストã‹ã‚‰ [NAME] を削除ã—ã¾ã™ã‹ï¼Ÿ
- <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
- </notification>
- <notification name="RemoveMultipleFromFriends">
- フレンドリストã‹ã‚‰è¤‡æ•°ã®ãƒ•レンドを削除ã—ã¾ã™ã‹ï¼Ÿ
- <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
- </notification>
- <notification name="GodDeleteAllScriptedPublicObjectsByUser">
- **[AVATAR_NAME]**
-所有ã®ã™ã¹ã¦ã®ã‚¹ã‚¯ãƒªãƒ—トオブジェクトをã“ã®ã‚·ãƒ å†…ã®ä»–ã®ã™ã¹ã¦ã®åœŸåœ°ã‹ã‚‰å‰Šé™¤ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚æ“作を続行ã—ã¾ã™ã‹ï¼Ÿ
- <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
- </notification>
- <notification name="GodDeleteAllScriptedObjectsByUser">
- **[AVATAR_NAME]**
-所有ã®ã™ã¹ã¦ã®ã‚¹ã‚¯ãƒªãƒ—トオブジェクトをã“ã®ã‚·ãƒ å†…ã®ã™ã¹ã¦ã®åœŸåœ°ã‹ã‚‰å‰Šé™¤ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚æ“作を続行ã—ã¾ã™ã‹ï¼Ÿ
- <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
- </notification>
- <notification name="GodDeleteAllObjectsByUser">
- **[AVATAR_NAME]**
-所有ã®ã™ã¹ã¦ã®ã‚ªãƒ–ジェクト(スクリプトオブジェクトã¨éžã‚¹ã‚¯ãƒªãƒ—トオブジェクト)を
-ã“ã®ã‚·ãƒ å†…ã®ã™ã¹ã¦ã®åœŸåœ°ã‹ã‚‰å‰Šé™¤ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚æ“作を続行ã—ã¾ã™ã‹ï¼Ÿ
- <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
- </notification>
- <notification name="BlankClassifiedName">
- クラシファイドã®åå‰ã‚’指定ã—ã¦ãã ã•ã„。
- </notification>
- <notification name="MinClassifiedPrice">
- åºƒå‘Šæ–™ã¯æœ€ä½Ž L$ [MIN_PRICE] å¿…è¦ã§ã™ã€‚
-
-金é¡ã‚’増やã—ã¦ãã ã•ã„。
- </notification>
- <notification name="ConfirmItemDeleteHasLinks">
- ã“ã“ã«ãƒªãƒ³ã‚¯ã•れãŸã‚¢ã‚¤ãƒ†ãƒ ãŒå°‘ãªãã¨ã‚‚1ã¤ã‚りã¾ã™ã€‚ ã“ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’削除ã™ã‚‹ã¨ã“ã“ã«ãƒªãƒ³ã‚¯ã•れãŸã‚‚ã®ãŒæ©Ÿèƒ½ã—ãªããªã‚Šã¾ã™ã€‚ リンクを先ã«å‰Šé™¤ã™ã‚‹ã“ã¨ã‚’å¼·ããŠå‹§ã‚ã—ã¾ã™ã€‚
-
-ã“れらã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’削除ã—ã¾ã™ã‹ï¼Ÿ
- <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
- </notification>
- <notification name="ConfirmObjectDeleteLock">
- é¸æŠžã—ãŸã‚¢ã‚¤ãƒ†ãƒ ã®ã†ã¡ã€å°‘ãªãã¨ã‚‚ 1 ã¤ãŒãƒ­ãƒƒã‚¯ã•れã¦ã„ã¾ã™ã€‚
-
-本当ã«å‰Šé™¤ã—ã¾ã™ã‹ï¼Ÿ
- <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
- </notification>
- <notification name="ConfirmObjectDeleteNoCopy">
- é¸æŠžã—ãŸã‚¢ã‚¤ãƒ†ãƒ ã®ã†ã¡ã€å°‘ãªãã¨ã‚‚ 1 ã¤ãŒã‚³ãƒ”ーã§ãã¾ã›ã‚“。
-
-本当ã«å‰Šé™¤ã—ã¾ã™ã‹ï¼Ÿ
- <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
- </notification>
- <notification name="ConfirmObjectDeleteNoOwn">
- é¸æŠžã—ãŸã‚¢ã‚¤ãƒ†ãƒ ã®ã†ã¡ã€å°‘ãªãã¨ã‚‚ 1 ã¤ãŒã‚ãªãŸã®æ‰€æœ‰ç‰©ã§ã¯ã‚りã¾ã›ã‚“。
-
-本当ã«å‰Šé™¤ã—ã¾ã™ã‹ï¼Ÿ
- <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
- </notification>
- <notification name="ConfirmObjectDeleteLockNoCopy">
- å°‘ãªãã¨ã‚‚ 1 ã¤ã®ã‚ªãƒ–ジェクトãŒãƒ­ãƒƒã‚¯ã•れã¦ã„ã¾ã™ã€‚
-å°‘ãªãã¨ã‚‚ 1 ã¤ã®ã‚ªãƒ–ジェクトãŒã‚³ãƒ”ーã§ãã¾ã›ã‚“。
-
-本当ã«å‰Šé™¤ã—ã¾ã™ã‹ï¼Ÿ
- <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
- </notification>
- <notification name="ConfirmObjectDeleteLockNoOwn">
- å°‘ãªãã¨ã‚‚ 1 ã¤ã®ã‚ªãƒ–ジェクトãŒãƒ­ãƒƒã‚¯ã•れã¦ã„ã¾ã™ã€‚
-å°‘ãªãã¨ã‚‚ 1 ã¤ã®ã‚ªãƒ–ジェクトãŒã€ã‚ãªãŸã®æ‰€æœ‰ç‰©ã§ã¯ã‚りã¾ã›ã‚“。
-
-本当ã«å‰Šé™¤ã—ã¾ã™ã‹ï¼Ÿ
- <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
- </notification>
- <notification name="ConfirmObjectDeleteNoCopyNoOwn">
- å°‘ãªãã¨ã‚‚ 1 ã¤ã®ã‚ªãƒ–ジェクトãŒã‚³ãƒ”ーã§ãã¾ã›ã‚“。
-å°‘ãªãã¨ã‚‚ 1 ã¤ã®ã‚ªãƒ–ジェクトãŒã€ã‚ãªãŸã®æ‰€æœ‰ç‰©ã§ã¯ã‚りã¾ã›ã‚“。
-
-本当ã«å‰Šé™¤ã—ã¾ã™ã‹ï¼Ÿ
- <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
- </notification>
- <notification name="ConfirmObjectDeleteLockNoCopyNoOwn">
- å°‘ãªãã¨ã‚‚ 1 ã¤ã®ã‚ªãƒ–ジェクトãŒãƒ­ãƒƒã‚¯ã•れã¦ã„ã¾ã™ã€‚
-å°‘ãªãã¨ã‚‚ 1 ã¤ã®ã‚ªãƒ–ジェクトãŒã‚³ãƒ”ーã§ãã¾ã›ã‚“。
-å°‘ãªãã¨ã‚‚ 1 ã¤ã®ã‚ªãƒ–ジェクトãŒã€ã‚ãªãŸã®æ‰€æœ‰ç‰©ã§ã¯ã‚りã¾ã›ã‚“。
-
-本当ã«å‰Šé™¤ã—ã¾ã™ã‹ï¼Ÿ
- <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
- </notification>
- <notification name="ConfirmObjectTakeLock">
- å°‘ãªãã¨ã‚‚ 1 ã¤ã®ã‚ªãƒ–ジェクトãŒãƒ­ãƒƒã‚¯ã•れã¦ã„ã¾ã™ã€‚
-
-本当ã«ã“ã®ã¾ã¾å–å¾—ã‚’ç¶šã‘ã¾ã™ã‹ï¼Ÿ
- <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
- </notification>
- <notification name="ConfirmObjectTakeNoOwn">
- å–å¾—ã—よã†ã¨ã—ã¦ã„るオブジェクトã«ã¯ã€ã‚ãªãŸã®æ‰€æœ‰ç‰©ã§ã¯ãªã„オブジェクトãŒå«ã¾ã‚Œã¦ã„ã¾ã™ã€‚
-ã‚ãªãŸã®æ‰€æœ‰ç‰©ã§ã¯ãªã„オブジェクトをå–å¾—ã™ã‚‹ã¨ã€æ¬¡ã®æ‰€æœ‰è€…ã®æ¨©é™ãŒãã®ã‚ªãƒ–ジェクトã«é©ç”¨ã•れã¾ã™ã€‚
-ãã®ãŸã‚ã€å°†æ¥ã€ä¿®æ­£ã‚„コピーã®èƒ½åŠ›ãŒåˆ¶é™ã•れるå¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚
-
-本当ã«ã“ã®ã¾ã¾å–å¾—ã‚’ç¶šã‘ã¾ã™ã‹ï¼Ÿ
- <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
- </notification>
- <notification name="ConfirmObjectTakeLockNoOwn">
- å°‘ãªãã¨ã‚‚ 1 ã¤ã®ã‚ªãƒ–ジェクトãŒãƒ­ãƒƒã‚¯ã•れã¦ã„ã¾ã™ã€‚
-å–å¾—ã—よã†ã¨ã—ã¦ã„るオブジェクトã«ã¯ã€ã‚ãªãŸã®æ‰€æœ‰ç‰©ã§ã¯ãªã„オブジェクトãŒå«ã¾ã‚Œã¦ã„ã¾ã™ã€‚
-ã‚ãªãŸã®æ‰€æœ‰ç‰©ã§ã¯ãªã„オブジェクトをå–å¾—ã™ã‚‹ã¨ã€æ¬¡ã®æ‰€æœ‰è€…ã®æ¨©é™ãŒãã®ã‚ªãƒ–ジェクトã«é©ç”¨ã•れã¾ã™ã€‚
-ãã®ãŸã‚ã€å°†æ¥ã€ç·¨é›†ã‚„コピーã®èƒ½åŠ›ãŒåˆ¶é™ã•れるå¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚
-ã“ã®é¸æŠžå†…容ã®ã¾ã¾ã§ç¶šè¡Œã™ã‚‹ã“ã¨ã¯å¯èƒ½ã§ã™ãŒã€
-
-本当ã«ã“ã®ã¾ã¾å–å¾—ã‚’ç¶šã‘ã¾ã™ã‹ï¼Ÿ
- <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
- </notification>
- <notification name="CantBuyLandAcrossMultipleRegions">
- 複数ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ãŒé¸æŠžã•れãŸãŸã‚ã€åœŸåœ°ã‚’購入ã§ãã¾ã›ã‚“。
-
-é¸æŠžã™ã‚‹é¢ç©ã‚’å°ã•ãã—ã¦ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。
- </notification>
- <notification name="DeedLandToGroup">
- ã“ã®åŒºç”»ã®è­²æ¸¡ã«éš›ã—ã¦ã¯ã€
-ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ãŒå分ãªåœŸåœ°ã‚¯ãƒ¬ã‚¸ãƒƒãƒˆã‚’ä¿æœ‰ãŠã‚ˆã³ç¶­æŒã—ã¦ã„ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚
-土地ã®è³¼å…¥ä¾¡æ ¼ã¯ã€æ‰€æœ‰è€…ã«è¿”金ã•れã¾ã›ã‚“。譲渡ã•れãŸåŒºç”»ãŒå£²ã‚Œã‚‹ã¨ã€å£²ä¸Šé‡‘é¡ã¯ã‚°ãƒ«ãƒ¼ãƒ—メンãƒãƒ¼ã«å‡ç­‰ã«åˆ†é…ã•れã¾ã™ã€‚
-
-ã“ã® [AREA] 平方メートルã®åœŸåœ°ã‚’ã€ã‚°ãƒ«ãƒ¼ãƒ—
-「 [GROUP_NAME] ã€ã«è­²æ¸¡ã—ã¾ã™ã‹ï¼Ÿ
- <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
- </notification>
- <notification name="DeedLandToGroupWithContribution">
- ã“ã®åŒºç”»ãŒè­²æ¸¡ã•れるã¨ã€ã‚°ãƒ«ãƒ¼ãƒ—ã¯ãã®åœŸåœ°åˆ©ç”¨æ–™ã¨ã—ã¦ååˆ†ãªæ®‹é«˜ã‚’ç¶­æŒã—ã¦ã„ãå¿…è¦ãŒã‚りã¾ã™ã€‚
-譲渡ã«ã¯åŒæ™‚ã« [NAME] ã‹ã‚‰ã‚°ãƒ«ãƒ¼ãƒ—ã¸ã®åœŸåœ°ã®è²¢çŒ®ãŒå«ã¾ã‚Œã¾ã™ã€‚
-土地ã®è³¼å…¥ä¾¡æ ¼ã¯æ‰€æœ‰è€…ã«è¿”金ã•れã¾ã›ã‚“。譲渡ã•れãŸåŒºç”»ãŒå£²å´ã•れるã¨ã€è²©å£²ä¾¡æ ¼ã¯ã‚°ãƒ«ãƒ¼ãƒ—メンãƒãƒ¼ã®é–“ã§å‡ç­‰ã«åˆ†é…ã•れã¾ã™ã€‚
-
-ã“ã® [AREA] m² ã®åœŸåœ°ã‚’ [GROUP_NAME] ã¨ã„ã†ã‚°ãƒ«ãƒ¼ãƒ—ã«è­²æ¸¡ã—ã¾ã™ã‹ï¼Ÿ
- <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
- </notification>
- <notification name="DisplaySetToSafe">
- -safe オプションを指定ã—ãŸã®ã§ã€
-表示設定ã¯ã‚»ãƒ¼ãƒ•レベルã«è¨­å®šã•れã¦ã„ã¾ã™ã€‚
- </notification>
- <notification name="DisplaySetToRecommended">
- 表示設定ã¯ã€ã‚ãªãŸã®ã‚·ã‚¹ãƒ†ãƒ æ§‹æˆã«åŸºã¥ã„ã¦æŽ¨å¥¨ã•れãŸãƒ¬ãƒ™ãƒ«ã«è¨­å®šã•れã¦ã„ã¾ã™ã€‚
- </notification>
- <notification name="ErrorMessage">
- [ERROR_MESSAGE]
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="AvatarMovedDesired">
- 目的地ã¯ç¾åœ¨ã”利用ã„ãŸã ã‘ã¾ã›ã‚“。
-è¿‘ãã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã«ç§»å‹•ã—ã¾ã—ãŸã€‚
- </notification>
- <notification name="AvatarMovedLast">
- å‰å›žã„ãŸå ´æ‰€ã¯ç¾åœ¨ã”利用ã„ãŸã ã‘ã¾ã›ã‚“。
-è¿‘ãã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã«ç§»å‹•ã—ã¾ã—ãŸã€‚
- </notification>
- <notification name="AvatarMovedHome">
- ホームロケーションã¯ç¾åœ¨ã”利用ã„ãŸã ã‘ã¾ã›ã‚“。
-è¿‘ãã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã«ç§»å‹•ã—ã¾ã—ãŸã€‚
-æ–°ãŸã«ãƒ›ãƒ¼ãƒ ã‚’設定ã—ç›´ã™å¿…è¦ãŒã‚ã‚‹ã‹ã‚‚ã—れã¾ã›ã‚“。
- </notification>
- <notification name="ClothingLoading">
- ç¾åœ¨è¡£é¡žã‚’ダウンロード中ã§ã™ã€‚
-ã“ã®ã¾ã¾ [SECOND_LIFE] を通常通りã”使用ã„ãŸã ã‘ã¾ã™ã€‚他人ã‹ã‚‰ã¯ã‚ãªãŸã¯æ­£ã—ã表示ã•れã¾ã™ã€‚
- <form name="form">
- <ignore name="ignore" text="衣類ãŒãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ã•れるã¾ã§æ™‚é–“ãŒã‹ã‹ã£ã¦ã„ã‚‹ã¨ã"/>
- </form>
- </notification>
- <notification name="FirstRun">
- [APP_NAME] ã®ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ãŒå®Œäº†ã—ã¾ã—ãŸã€‚
-
-[SECOND_LIFE] を使ã£ãŸã“ã¨ãŒãªã„å ´åˆã¯ã€ãƒ­ã‚°ã‚¤ãƒ³ã™ã‚‹å‰ã«ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã®ä½œæˆã‚’行ã£ã¦ãã ã•ã„。
-[http://join.secondlife.com/?lang=ja-JP] ã§æ–°ã—ã„アカウントを作æˆã—ã¾ã™ã‹ï¼Ÿ
- <usetemplate name="okcancelbuttons" notext="続行" yestext="æ–°è¦ã‚¢ã‚«ã‚¦ãƒ³ãƒˆ..."/>
- </notification>
- <notification name="LoginPacketNeverReceived">
- 接続ãŒãªã‹ãªã‹ã§ãã¾ã›ã‚“。 ãŠä½¿ã„ã®ã‚¤ãƒ³ã‚¿ãƒ¼ãƒãƒƒãƒˆæŽ¥ç¶šã‹ã€[SECOND_LIFE_GRID] ã®å•題ã¨è€ƒãˆã‚‰ã‚Œã¾ã™ã€‚
-
-インターãƒãƒƒãƒˆæŽ¥ç¶šã‚’確èªã—ã¦ã‹ã‚‰æ•°åˆ†å¾Œã«å†æŽ¥ç¶šã™ã‚‹ã‹ã€ãƒ˜ãƒ«ãƒ—をクリックã—㦠[SUPPORT_SITE] ã‚’ã”覧ã«ãªã‚‹ã‹ã€ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã‚’クリックã—ã¦ãƒ›ãƒ¼ãƒ ã«ç§»å‹•ã—ã¦ã¿ã¦ãã ã•ã„。
- <url name="url">
- http://jp.secondlife.com/support/
- </url>
- <form name="form">
- <button name="OK" text="OK"/>
- <button name="Help" text="ヘルプ"/>
- <button name="Teleport" text="テレãƒãƒ¼ãƒˆ"/>
- </form>
- </notification>
- <notification name="WelcomeChooseSex">
- ã¾ã‚‚ãªãã‚ãªãŸã®ã‚¢ãƒã‚¿ãƒ¼ãŒè¡¨ç¤ºã•れã¾ã™ã€‚
-
-矢å°ã‚­ãƒ¼ã‚’使用ã—ã¦æ­©ãã¾ã™ã€‚
-ヘルプãŒå¿…è¦ãªã¨ãã‚„ [SECOND_LIFE] ã«ã¤ã„ã¦çŸ¥ã‚ŠãŸã„ã¨ãã¯ã€
-F1 キーを押ã—ã¦ãã ã•ã„。
-男性ã‚ã‚‹ã„ã¯å¥³æ€§ã®ã‚¢ãƒã‚¿ãƒ¼ã‚’é¸æŠžã—ã¦ãã ã•ã„。
-ã‚ãªãŸã®æ±ºå®šã¯å¾Œã§å¤‰æ›´ã§ãã¾ã™ã€‚
- <usetemplate name="okcancelbuttons" notext="女性" yestext="男性"/>
- </notification>
- <notification name="CantTeleportToGrid">
- ç¾åœ¨ã®ã‚°ãƒªãƒƒãƒ‰ï¼ˆ[CURRENT_GRID])ã¨ã¯ã‚°ãƒªãƒƒãƒ‰ï¼ˆ[GRID])ãŒç•°ãªã‚‹ãŸã‚ã€[SLURL] ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ ビューワを閉ã˜ã¦ã‹ã‚‰ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="GeneralCertificateError">
- サーãƒãƒ¼ã«æŽ¥ç¶šã§ãã¾ã›ã‚“ã§ã—ãŸã€‚
-[REASON]
-
-サブジェクトå: [SUBJECT_NAME_STRING]
-発行元: [ISSUER_NAME_STRING]
-有効日: [VALID_FROM]
-æ¬¡ã®æ›´æ–°æ—¥ï¼š [VALID_TO]
-MD5 フィンガープリント: [SHA1_DIGEST]
-SHA1 フィンガープリント: [MD5_DIGEST]
-キー使用法: [KEYUSAGE]
-拡張キー使用法: [EXTENDEDKEYUSAGE]
-サブジェクトキーèªè­˜åˆ¥å­ï¼š [SUBJECTKEYIDENTIFIER]
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="TrustCertificateError">
- ã“ã®ã‚µãƒ¼ãƒãƒ¼ã®èªè¨¼æ©Ÿé–¢ã¯ä¸æ˜Žã§ã™ã€‚
-
-èªè¨¼æƒ…報:
-サブジェクトå: [SUBJECT_NAME_STRING]
-発行元: [ISSUER_NAME_STRING]
-有効日: [VALID_FROM]
-æ¬¡ã®æ›´æ–°æ—¥ï¼š [VALID_TO]
-MD5 フィンガープリント: [SHA1_DIGEST]
-SHA1 フィンガープリント: [MD5_DIGEST]
-キー使用法: [KEYUSAGE]
-拡張キー使用法: [EXTENDEDKEYUSAGE]
-サブジェクトキーèªè­˜åˆ¥å­ï¼š [SUBJECTKEYIDENTIFIER]
-
-ã“ã®èªè¨¼å±€ã‚’ä¿¡é ¼ã—ã¾ã™ã‹ï¼Ÿ
- <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="信用ã™ã‚‹"/>
- </notification>
- <notification name="NotEnoughCurrency">
- [NAME] L$[PRICE] 残高ä¸è¶³ã®ãŸã‚実行ä¸å¯ã§ã™ã€‚
- </notification>
- <notification name="GrantedModifyRights">
- [NAME] ã¯ã€ã‚ãªãŸã«ã‚ªãƒ–ジェクトã®ç·¨é›†æ¨©é™ã‚’与ãˆã¾ã—ãŸã€‚
- </notification>
- <notification name="RevokedModifyRights">
- [NAME] ã®ã‚ªãƒ–ジェクトを編集ã™ã‚‹æ¨©é™ã¯å–り消ã•れã¾ã—ãŸã€‚
- </notification>
- <notification name="FlushMapVisibilityCaches">
- ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã®åœ°å›³ã®ã‚­ãƒ£ãƒƒã‚·ãƒ¥ã‚’消去ã—ã¾ã™ã€‚
-デãƒãƒƒã‚°ç›®çš„ã®ã¿ã«ä¾¿åˆ©ãªæ“作ã§ã™ã€‚
-(作æˆä¸­ã¯ 5 分間経ã¤ã¨ã€å…¨å“¡ã®åœ°å›³ãŒå†åº¦ãƒ­ã‚°ã‚¤ãƒ³å¾Œã«æ›´æ–°ã•れã¾ã™ï¼‰
- <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
- </notification>
- <notification name="BuyOneObjectOnly">
- 一度㫠1 ã¤ä»¥ä¸Šã®ã‚ªãƒ–ジェクトを買ã†ã“ã¨ã¯ã§ãã¾ã›ã‚“。 オブジェクトを 1 ã¤ã ã‘é¸ã‚“ã§ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。
- </notification>
- <notification name="OnlyCopyContentsOfSingleItem">
- 一度ã«è¤‡æ•°ã®ã‚¢ã‚¤ãƒ†ãƒ ã®ä¸­èº«ã‚’コピーã§ãã¾ã›ã‚“。
-オブジェクトを 1 ã¤ã ã‘é¸æŠžã—ã¦ã€ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。
- <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
- </notification>
- <notification name="KickUsersFromRegion">
- ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã«ã„ã‚‹å…¨ã¦ã®ä½äººã‚’ホームã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã—ã¾ã™ã‹ï¼Ÿ
- <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
- </notification>
- <notification name="EstateObjectReturn">
- [USER_NAME] ãŒæ‰€æœ‰ã—ã¦ã„るオブジェクトを返å´ã—ã¾ã™ã‹ï¼Ÿ
- <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
- </notification>
- <notification name="InvalidTerrainBitDepth">
- 地域テクスãƒãƒ£ã‚’設定ã§ãã¾ã›ã‚“ã§ã—ãŸï¼š
-地形テクスãƒãƒ£[TEXTURE_NUM]ã¯ã€ç„¡åйã®ãƒ“ット深度[TEXTURE_BIT_DEPTH]ã§ã™ã€‚
-
-テクスãƒãƒ£[TEXTURE_NUM]ã‚’24ビット512x512ã‹ãれ以下ã®ã‚¤ãƒ¡ãƒ¼ã‚¸ã¨äº¤æ›ã—ã€ã€Œé©ç”¨ã€ã‚’å†åº¦ã‚¯ãƒªãƒƒã‚¯ã—ã¦ãã ã•ã„。
- </notification>
- <notification name="InvalidTerrainSize">
- 地域テクスãƒãƒ£ã‚’設定ã§ãã¾ã›ã‚“ã§ã—ãŸï¼š
-地形テクスãƒãƒ£ã€Œ [TEXTURE_NUM] ã€ã¯ã€[TEXTURE_SIZE_X]x[TEXTURE_SIZE_Y] ã§ã¯å¤§ãã™ãŽã¾ã™ã€‚
-
-「 [TEXTURE_NUM] ã€ã‚’ 24 ビット 512x512 ã‹ãれ以下ã®ã‚¤ãƒ¡ãƒ¼ã‚¸ã¨äº¤æ›ã—ã€ã€Œé©ç”¨ã€ã‚’å†åº¦ã‚¯ãƒªãƒƒã‚¯ã—ã¦ãã ã•ã„。
- </notification>
- <notification name="RawUploadStarted">
- アップロードを開始ã—ã¾ã—ãŸã€‚ 接続速度ã«ã‚ˆã£ã¦ã¯ã€æœ€å¤§ 2 分間ã‹ã‹ã‚Šã¾ã™ã€‚
- </notification>
- <notification name="ConfirmBakeTerrain">
- ç¾åœ¨ã®åœ°å½¢ã‚’構築ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚
-ã“ã®æ“作を行ã†ã¨ã€ç¾åœ¨ã®åœ°å½¢ãŒä¸Šæ˜‡ãƒ»ä¸‹é™ã®åˆ¶é™ç¯„囲ã®ä¸­å¿ƒã¨ãªã‚Šã€ã€Œå¾©å…ƒã€ãƒ„ールã®ãƒ‡ãƒ•ォルトã«ãªã‚Šã¾ã™ã€‚
-æ“作を続行ã—ã¾ã™ã‹ï¼Ÿ
- <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
- </notification>
- <notification name="MaxAllowedAgentOnRegion">
- 許å¯ä½äººã¯ [MAX_AGENTS] 人ã¾ã§ã§ã™ã€‚
- </notification>
- <notification name="MaxBannedAgentsOnRegion">
- ç¦æ­¢ä½äººã¯ [MAX_BANNED] 人ã¾ã§ã§ã™ã€‚
- </notification>
- <notification name="MaxAgentOnRegionBatch">
- [NUM_ADDED] 個ã®ã‚¨ãƒ¼ã‚¸ã‚§ãƒ³ãƒˆã‚’追加ã—よã†ã¨ã—ã¦å¤±æ•—ã—ã¾ã—ãŸï¼š [MAX_AGENTS] [LIST_TYPE] 制é™ã‚’ [NUM_EXCESS] 個超éŽã—ã¦ã„ã¾ã™ã€‚
- </notification>
- <notification name="MaxAllowedGroupsOnRegion">
- 許å¯ã‚°ãƒ«ãƒ¼ãƒ—㯠[MAX_GROUPS] グループã¾ã§ã§ã™ã€‚
- <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="構築ã™ã‚‹"/>
- </notification>
- <notification name="MaxManagersOnRegion">
- ä¸å‹•産マãƒãƒ¼ã‚¸ãƒ£ãƒ¼ã¯ [MAX_MANAGER] 人ã¾ã§ã§ã™ã€‚
- </notification>
- <notification name="OwnerCanNotBeDenied">
- ä¸å‹•産オーナーをä¸å‹•産ã®ã€Œç¦æ­¢ä½äººã€ãƒªã‚¹ãƒˆã«è¿½åŠ ã§ãã¾ã›ã‚“。
- </notification>
- <notification name="CanNotChangeAppearanceUntilLoaded">
- 衣類ãŠã‚ˆã³ã‚·ã‚§ã‚¤ãƒ—ãŒèª­ã¿è¾¼ã¾ã‚Œã‚‹ã¾ã§ã¯ã€å®¹å§¿ã®å¤‰æ›´ã¯ã§ãã¾ã›ã‚“。
- </notification>
- <notification name="ClassifiedMustBeAlphanumeric">
- クラシファイド広告ã®åå‰ã¯ã€ã‚¢ãƒ«ãƒ•ã‚¡ãƒ™ãƒƒãƒˆã‹æ•°å­—ã§å§‹ã‚ã¾ã™ã€‚å¥èª­ç‚¹ã§ã¯å§‹ã‚られã¾ã›ã‚“。
- </notification>
- <notification name="CantSetBuyObject">
- オブジェクトãŒè²©å£²å¯¾è±¡ã§ã¯ãªã„ãŸã‚ã€ã‚ªãƒ–ジェクトã®è³¼å…¥ãŒã§ãã¾ã›ã‚“。
-販売対象ã®ã‚ªãƒ–ジェクトを指定ã—ã¦ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。
- </notification>
- <notification name="FinishedRawDownload">
- 未加工ã®åœ°å½¢ãƒ•ァイルをダウンロードã—ã¾ã—ãŸï¼š
-[DOWNLOAD_PATH]
- </notification>
- <notification name="DownloadWindowsMandatory">
- [APP_NAME] ã®æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒã”利用å¯èƒ½ã§ã™ã€‚
-[MESSAGE]
-[APP_NAME] ã‚’ã”利用ã«ãªã‚‹ã«ã¯ã“ã®ã‚¢ãƒƒãƒ—デートã¯å¿…é ˆã§ã™ã€‚
- <usetemplate name="okcancelbuttons" notext="終了" yestext="ダウンロード"/>
- </notification>
- <notification name="DownloadWindows">
- [APP_NAME] ã®ã‚¢ãƒƒãƒ—デートãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒã”利用å¯èƒ½ã§ã™ã€‚
-[MESSAGE]
-ã“ã®ã‚¢ãƒƒãƒ—デートã¯å¿…é ˆã§ã¯ã‚りã¾ã›ã‚“ãŒã€ãƒ‘フォーマンスå‘上ã®ãŸã‚ã«ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã‚’ãŠã™ã™ã‚ã—ã¾ã™ã€‚
- <usetemplate name="okcancelbuttons" notext="続行" yestext="ダウンロード"/>
- </notification>
- <notification name="DownloadWindowsReleaseForDownload">
- [APP_NAME] ã®ã‚¢ãƒƒãƒ—デートãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒã”利用å¯èƒ½ã§ã™ã€‚
-[MESSAGE]
-ã“ã®ã‚¢ãƒƒãƒ—デートã¯å¿…é ˆã§ã¯ã‚りã¾ã›ã‚“ãŒã€ãƒ‘フォーマンスå‘上ã®ãŸã‚ã«ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã‚’ãŠã™ã™ã‚ã—ã¾ã™ã€‚
- <usetemplate name="okcancelbuttons" notext="続行" yestext="ダウンロード"/>
- </notification>
- <notification name="DownloadLinuxMandatory">
- [APP_NAME] ã®æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒã”利用å¯èƒ½ã§ã™ã€‚
-[MESSAGE]
-[APP_NAME] ã‚’ã”利用ã«ãªã‚‹ã«ã¯ã“ã®ã‚¢ãƒƒãƒ—デートã¯å¿…é ˆã§ã™ã€‚
- <usetemplate name="okcancelbuttons" notext="終了" yestext="ダウンロード"/>
- </notification>
- <notification name="DownloadLinux">
- [APP_NAME] ã®ã‚¢ãƒƒãƒ—デートãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒã”利用å¯èƒ½ã§ã™ã€‚
-[MESSAGE]
-ã“ã®ã‚¢ãƒƒãƒ—デートã¯å¿…é ˆã§ã¯ã‚りã¾ã›ã‚“ãŒã€ãƒ‘フォーマンスå‘上ã®ãŸã‚ã«ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã‚’ãŠã™ã™ã‚ã—ã¾ã™ã€‚
- <usetemplate name="okcancelbuttons" notext="ç¶šã‘ã‚‹" yestext="ダウンロード"/>
- </notification>
- <notification name="DownloadLinuxReleaseForDownload">
- [APP_NAME] ã®ã‚¢ãƒƒãƒ—デートãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒã”利用å¯èƒ½ã§ã™ã€‚
-[MESSAGE]
-ã“ã®ã‚¢ãƒƒãƒ—デートã¯å¿…é ˆã§ã¯ã‚りã¾ã›ã‚“ãŒã€ãƒ‘フォーマンスå‘上ã®ãŸã‚ã«ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã‚’ãŠã™ã™ã‚ã—ã¾ã™ã€‚
- <usetemplate name="okcancelbuttons" notext="ç¶šã‘ã‚‹" yestext="ダウンロード"/>
- </notification>
- <notification name="DownloadMacMandatory">
- [APP_NAME] ã®æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒã”利用å¯èƒ½ã§ã™ã€‚
-[MESSAGE]
-[APP_NAME] ã‚’ã”利用ã«ãªã‚‹ã«ã¯ã“ã®ã‚¢ãƒƒãƒ—デートã¯å¿…é ˆã§ã™ã€‚
-
-ã‚ãªãŸã®ã‚¢ãƒ—リケーションフォルダã«ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ã—ã¾ã™ã‹ï¼Ÿ
- <usetemplate name="okcancelbuttons" notext="終了" yestext="ダウンロード"/>
- </notification>
- <notification name="DownloadMac">
- [APP_NAME] ã®ã‚¢ãƒƒãƒ—デートãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒã”利用å¯èƒ½ã§ã™ã€‚
-[MESSAGE]
-ã“ã®ã‚¢ãƒƒãƒ—デートã¯å¿…é ˆã§ã¯ã‚りã¾ã›ã‚“ãŒã€ãƒ‘フォーマンスå‘上ã®ãŸã‚ã«ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã‚’ãŠã™ã™ã‚ã—ã¾ã™ã€‚
-
-ã‚ãªãŸã®ã‚¢ãƒ—リケーションフォルダã«ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ã—ã¾ã™ã‹ï¼Ÿ
- <usetemplate name="okcancelbuttons" notext="続行" yestext="ダウンロード"/>
- </notification>
- <notification name="DownloadMacReleaseForDownload">
- [APP_NAME] ã®ã‚¢ãƒƒãƒ—デートãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒã”利用å¯èƒ½ã§ã™ã€‚
-[MESSAGE]
-ã“ã®ã‚¢ãƒƒãƒ—デートã¯å¿…é ˆã§ã¯ã‚りã¾ã›ã‚“ãŒã€ãƒ‘フォーマンスå‘上ã®ãŸã‚ã«ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã‚’ãŠã™ã™ã‚ã—ã¾ã™ã€‚
-
-ã‚ãªãŸã®ã‚¢ãƒ—リケーションフォルダã«ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ã—ã¾ã™ã‹ï¼Ÿ
- <usetemplate name="okcancelbuttons" notext="続行" yestext="ダウンロード"/>
- </notification>
- <notification name="FailedUpdateInstall">
- ビューワã®ã‚¢ãƒƒãƒ—デートをインストール中ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚
-http://secondlife.com/download ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンロードã—ã¦ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã—ã¦ãã ã•ã„。
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="FailedRequiredUpdateInstall">
- å¿…è¦ãªã‚¢ãƒƒãƒ—デートをインストールã§ãã¾ã›ã‚“ã§ã—ãŸã€‚
-[APP_NAME] ãŒã‚¢ãƒƒãƒ—デートã•れるã¾ã§ãƒ­ã‚°ã‚¤ãƒ³ã§ãã¾ã›ã‚“。
-
-http://secondlife.com/download ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンロードã—ã¦ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã—ã¦ãã ã•ã„。
- <usetemplate name="okbutton" yestext="終了"/>
- </notification>
- <notification name="UpdaterServiceNotRunning">
- ãŠä½¿ã„ã® Second Life ã«å¿…è¦ãªã‚¢ãƒƒãƒ—デートãŒã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•れã¦ã„ã¾ã›ã‚“。
-
-ã“ã®ã‚¢ãƒƒãƒ—デートã¯ã€http://www.secondlife.com/downloads ã‹ã‚‰ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ã—ã¦ã€ä»Šã™ãインストールã§ãã¾ã™ã€‚
- <usetemplate name="okcancelbuttons" notext="終了" yestext="今ã™ãダウンロードã—ã¦ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«"/>
- </notification>
- <notification name="DownloadBackgroundTip">
- ãŠä½¿ã„ã® [APP_NAME] ã«å¿…è¦ãªã‚¢ãƒƒãƒ—デートをダウンロードã—ã¾ã—ãŸã€‚
-ãƒãƒ¼ã‚¸ãƒ§ãƒ³ [VERSION] [[RELEASE_NOTES_FULL_URL] ã“ã®ã‚¢ãƒƒãƒ—デートã«é–¢ã™ã‚‹æƒ…å ±]
- <usetemplate name="okcancelbuttons" notext="後ã§å®Ÿè¡Œ" yestext="今ã™ãインストールã—㦠[APP_NAME] ã‚’å†èµ·å‹•"/>
- </notification>
- <notification name="DownloadBackgroundDialog">
- ãŠä½¿ã„ã® [APP_NAME] ã«å¿…è¦ãªã‚¢ãƒƒãƒ—デートをダウンロードã—ã¾ã—ãŸã€‚
-ãƒãƒ¼ã‚¸ãƒ§ãƒ³ [VERSION] [[RELEASE_NOTES_FULL_URL] ã“ã®ã‚¢ãƒƒãƒ—デートã«é–¢ã™ã‚‹æƒ…å ±]
- <usetemplate name="okcancelbuttons" notext="後ã§å®Ÿè¡Œ" yestext="今ã™ãインストールã—㦠[APP_NAME] ã‚’å†èµ·å‹•"/>
- </notification>
- <notification name="RequiredUpdateDownloadedVerboseDialog">
- å¿…è¦ãªã‚½ãƒ•トウェアã®ã‚¢ãƒƒãƒ—デートをダウンロードã—ã¾ã—ãŸã€‚
-ãƒãƒ¼ã‚¸ãƒ§ãƒ³ [VERSION]
-
-アップデートをインストールã™ã‚‹ã«ã¯ [APP_NAME] ã‚’å†èµ·å‹•ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="RequiredUpdateDownloadedDialog">
- アップデートをインストールã™ã‚‹ã«ã¯ [APP_NAME] ã‚’å†èµ·å‹•ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="DeedObjectToGroup">
- ã“ã®ã‚ªãƒ–ジェクトを譲渡ã™ã‚‹ã¨ã‚°ãƒ«ãƒ¼ãƒ—ã¯ä»¥ä¸‹ã®ã“ã¨ãŒå¯èƒ½ã§ã™ï¼š
-* ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã«æ”¯æ‰•ã‚れ㟠L$ ã‚’å—é ˜ã—ã¾ã™ã€‚
- <usetemplate ignoretext="オブジェクトをグループã«è­²æ¸¡ã™ã‚‹å‰ã®ç¢ºèª" name="okcancelignore" notext="å–り消ã—" yestext="譲渡"/>
- </notification>
- <notification name="WebLaunchExternalTarget">
- Web ブラウザを開ã„ã¦ã“ã®ã‚³ãƒ³ãƒ†ãƒ³ãƒ„を表示ã—ã¾ã™ã‹ï¼Ÿ
- <usetemplate ignoretext="ブラウザを起動ã—㦠Web ページを見るã¨ã" name="okcancelignore" notext="キャンセル" yestext="OK"/>
- </notification>
- <notification name="WebLaunchJoinNow">
- [http://jp.secondlife.com/account/ マイアカウント] ページã«ç§»å‹•ã—ã¦ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã‚’管ç†ã—ã¾ã™ã‹ï¼Ÿ
- <usetemplate ignoretext="ブラウザを起動ã—ã¦ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã‚’管ç†ã™ã‚‹ã¨ã" name="okcancelignore" notext="å–り消ã—" yestext="OK"/>
- </notification>
- <notification name="WebLaunchSecurityIssues">
- [SECOND_LIFE] Wiki ã§ã€ã‚»ã‚­ãƒ¥ãƒªãƒ†ã‚£å•題を報告ã™ã‚‹æ–¹æ³•ã‚’ã”覧ãã ã•ã„。
- <usetemplate ignoretext="ブラウザを起動ã—ã¦ã‚»ã‚­ãƒ¥ãƒªãƒ†ã‚£å•題ã®å ±å‘Šã®ä»•方を確èªã™ã‚‹ã¨ã" name="okcancelignore" notext="キャンセル" yestext="OK"/>
- </notification>
- <notification name="WebLaunchQAWiki">
- [SECOND_LIFE] å“質ä¿è¨¼é–¢é€£ Wiki ã‚’ã”覧ãã ã•ã„。
- <usetemplate ignoretext="ブラウザを起動ã—㦠QA Wiki を見るã¨ã" name="okcancelignore" notext="キャンセル" yestext="OK"/>
- </notification>
- <notification name="WebLaunchPublicIssue">
- [SECOND_LIFE] ã®ãƒ‘ブリックå•題トラッカーã§ã€
-ãƒã‚°ã‚„ãã®ä»–ã®å•題を報告ã§ãã¾ã™ã€‚
- <usetemplate ignoretext="ブラウザを起動ã—ã¦ãƒ‘ブリックå•題トラッカーを使用ã™ã‚‹ã¨ã" name="okcancelignore" notext="キャンセル" yestext="ページã¸è¡Œã"/>
- </notification>
- <notification name="WebLaunchSupportWiki">
- Linden å…¬å¼ãƒ–ログã§ã€æœ€æ–°ã®ãƒ‹ãƒ¥ãƒ¼ã‚¹ã‚„情報を入手ã—ã¦ãã ã•ã„。
- <usetemplate ignoretext="ブラウザを起動ã—ã¦å…¬å¼ãƒ–ログを見るã¨ã" name="okcancelignore" notext="å–り消ã—" yestext="OK"/>
- </notification>
- <notification name="WebLaunchLSLGuide">
- スクリプトガイドを開ãã¾ã™ã‹ï¼Ÿ
- <usetemplate ignoretext="ブラウザを起動ã—ã¦ã‚¹ã‚¯ãƒªãƒ—トガイドを見るã¨ã" name="okcancelignore" notext="å–り消ã—" yestext="OK"/>
- </notification>
- <notification name="WebLaunchLSLWiki">
- LSL ãƒãƒ¼ã‚¿ãƒ«ã§ã‚¹ã‚¯ãƒªãƒ—トã«é–¢ã™ã‚‹æƒ…報を確èªã—ã¾ã™ã‹ï¼Ÿ
- <usetemplate ignoretext="ブラウザを起動ã—㦠LSL ãƒãƒ¼ã‚¿ãƒ«ã‚’見るã¨ã" name="okcancelignore" notext="å–り消ã—" yestext="ページã«ç§»å‹•"/>
- </notification>
- <notification name="ReturnToOwner">
- é¸æŠžã—ãŸã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’ã€æ‰€æœ‰è€…ã«è¿”å´ã—ã¾ã™ã‹ï¼Ÿ
-「å†è²©ãƒ»ãƒ—レゼントå¯ã€ã®è­²æ¸¡ã•れãŸã‚ªãƒ–ジェクトã¯ã€ä»¥å‰ã®æ‰€æœ‰è€…ã«è¿”å´ã•れã¾ã™ã€‚
-
-*警告* 「å†è²©ãƒ»ãƒ—レゼントä¸å¯ã€ã®è­²æ¸¡ã•れãŸã‚ªãƒ–ジェクトã¯ã€å‰Šé™¤ã•れã¾ã™ï¼
- <usetemplate ignoretext="オブジェクトを所有者ã«è¿”å´ã™ã‚‹å‰ã®ç¢ºèª" name="okcancelignore" notext="å–り消ã—" yestext="OK"/>
- </notification>
- <notification name="GroupLeaveConfirmMember">
- ç¾åœ¨ã‚ãªãŸã¯ [GROUP] ã®ãƒ¡ãƒ³ãƒãƒ¼ã§ã™ã€‚
-ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—を抜ã‘ã¾ã™ã‹ï¼Ÿ
- <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
- </notification>
- <notification name="ConfirmKick">
- 本当ã«ä½äººå…¨å“¡ã‚’グリッドã‹ã‚‰è¿½ã„出ã—ã¾ã™ã‹ï¼Ÿ
- <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="ä½äººå…¨å“¡ã‚’追ã„出ã™"/>
- </notification>
- <notification name="MuteLinden">
- リンデンをブロックã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="CannotStartAuctionAlreadyForSale">
- æ—¢ã«å£²ã‚Šå‡ºã—中ã®åŒºç”»ãªã®ã§ã‚ªãƒ¼ã‚¯ã‚·ãƒ§ãƒ³ã«ã‹ã‘ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 オークションã«ã‹ã‘ãŸã„å ´åˆã¯å£²ã‚Šå‡ºã—設定を解除ã—ã¦ã‹ã‚‰è¡Œã£ã¦ãã ã•ã„。
- </notification>
- <notification label="åå‰ã§ã®ã‚ªãƒ–ジェクトã®ãƒ–ロックã«å¤±æ•—ã—ã¾ã—ãŸ" name="MuteByNameFailed">
- ã“ã®åå‰ã¯æ—¢ã«ãƒ–ロック済ã¿ã§ã™ã€‚
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="RemoveItemWarn">
- コンテンツを削除ã™ã‚‹ã¨ã€è¨±å¯ãŒã‚ã£ã¦ã‚‚ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã«æå‚·ã‚’ä¸Žãˆã‚‹ã“ã¨ãŒã‚りã¾ã™ã€‚
-削除を続ã‘ã¾ã™ã‹ï¼Ÿ
- <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
- </notification>
- <notification name="CantOfferCallingCard">
- ç¾åœ¨ã‚³ãƒ¼ãƒªãƒ³ã‚°ã‚«ãƒ¼ãƒ‰ã‚’é€ã‚Œã¾ã›ã‚“。数分後ã«ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="CantOfferFriendship">
- ç¾åœ¨ãƒ•レンドシップをé€ã‚Œã¾ã›ã‚“。数分後ã«ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="BusyModeSet">
- å–り込ã¿ä¸­ãƒ¢ãƒ¼ãƒ‰ã«ãªã‚Šã¾ã—ãŸã€‚
-ãƒãƒ£ãƒƒãƒˆã¨ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ãƒˆãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¯è¡¨ç¤ºã•れã¾ã›ã‚“。 å—ä¿¡ã™ã‚‹ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ãƒˆãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«ã¯å–り込ã¿ä¸­è¿”答メッセージãŒè¡¨ç¤ºã•れã¾ã™ã€‚ テレãƒãƒ¼ãƒˆã®ã‚ªãƒ•ァーã¯å—ã‘å–り拒å¦ã¨ãªã‚Šã¾ã™ã€‚ アイテムã®ã‚ªãƒ•ァーã¯ã™ã¹ã¦ã”ã¿ç®±ã«å…¥ã‚Šã¾ã™ã€‚
- <usetemplate ignoretext="ログイン状態をå–り込ã¿ä¸­ãƒ¢ãƒ¼ãƒ‰ã«å¤‰æ›´ã™ã‚‹ã¨ã" name="okignore" yestext="OK"/>
- </notification>
- <notification name="JoinedTooManyGroupsMember">
- 加入ã§ãã‚‹ã‚°ãƒ«ãƒ¼ãƒ—ã®æœ€å¤§é™ã«é”ã—ã¾ã—ãŸã€‚ ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«åŠ å…¥ã™ã‚‹ãŸã‚ã«ä»–ã®ã‚°ãƒ«ãƒ¼ãƒ—を脱退ã™ã‚‹ã‹ã€ã“ã®ç”³ã—入れを断ã£ã¦ãã ã•ã„。
-[NAME] ãŒã‚ãªãŸã‚’グループã®ãƒ¡ãƒ³ãƒãƒ¼ã¨ã—ã¦å‹§èª˜ã—ã¦ã„ã¾ã™ã€‚
- <usetemplate name="okcancelbuttons" notext="辞退" yestext="å‚加"/>
- </notification>
- <notification name="JoinedTooManyGroups">
- 加入ã§ãã‚‹ã‚°ãƒ«ãƒ¼ãƒ—ã®æœ€å¤§é™ã«é”ã—ã¾ã—ãŸã€‚ æ–°ã—ãグループã«å‚加ã€ã¾ãŸã¯ä½œæˆã™ã‚‹å‰ã«ã€ã©ã‚Œã‹ã‚°ãƒ«ãƒ¼ãƒ—ã‹ã‚‰æŠœã‘ã¦ãã ã•ã„。
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="KickUser">
- ã©ã®ã‚ˆã†ãªãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’æ·»ãˆã¦ã“ã®ä½äººã‚’追ã„出ã—ã¾ã™ã‹ï¼Ÿ
- <form name="form">
- <input name="message">
- ã‚ãªãŸã¯ç®¡ç†è€…ã«ã‚ˆã‚Šãƒ­ã‚°ã‚ªãƒ•ã•れã¾ã—ãŸã€‚
- </input>
- <button name="OK" text="OK"/>
- <button name="Cancel" text="å–り消ã—"/>
- </form>
- </notification>
- <notification name="KickAllUsers">
- ã©ã®ã‚ˆã†ãªãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’ã¤ã‘ã¦ã‚°ãƒªãƒƒãƒ‰ã«ã„る全員を追ã„出ã—ã¾ã™ã‹ï¼Ÿ
- <form name="form">
- <input name="message">
- ã‚ãªãŸã¯ç®¡ç†è€…ã«ã‚ˆã‚Šãƒ­ã‚°ã‚ªãƒ•ã•れã¾ã—ãŸã€‚
- </input>
- <button name="OK" text="OK"/>
- <button name="Cancel" text="å–り消ã—"/>
- </form>
- </notification>
- <notification name="FreezeUser">
- ã©ã®ã‚ˆã†ãªãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’æ·»ãˆã¦ã“ã®ä½äººã‚’フリーズã—ã¾ã™ã‹ï¼Ÿ
- <form name="form">
- <input name="message">
- ã‚ãªãŸã¯ãƒ•リーズã•れã¦ã„ã¾ã™ã€‚ å‹•ãã“ã¨ã‚‚ãƒãƒ£ãƒƒãƒˆã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã›ã‚“。 管ç†è€…㌠IM ã§ã‚ãªãŸã«é€£çµ¡ã—ã¾ã™ã€‚
- </input>
- <button name="OK" text="OK"/>
- <button name="Cancel" text="å–り消ã—"/>
- </form>
- </notification>
- <notification name="UnFreezeUser">
- ã©ã®ã‚ˆã†ãªãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’æ·»ãˆã¦ã“ã®ä½äººã®ãƒ•リーズを解除ã—ã¾ã™ã‹ï¼Ÿ
- <form name="form">
- <input name="message">
- ã‚‚ã†ãƒ•リーズã•れã¦ã„ã¾ã›ã‚“。
- </input>
- <button name="OK" text="OK"/>
- <button name="Cancel" text="å–り消ã—"/>
- </form>
- </notification>
- <notification name="SetDisplayNameSuccess">
- [DISPLAY_NAME] ã•ã‚“ã€
-
-ç¾å®Ÿã®ä¸–界ã¨åŒã˜ãã€Second Life ã§ã‚‚æ–°ã—ã„åå‰ãŒæµ¸é€ã™ã‚‹ã«ã¯æ™‚é–“ãŒã‹ã‹ã‚Šã¾ã™ã€‚オブジェクトã€ã‚¹ã‚¯ãƒªãƒ—ãƒˆã€æ¤œç´¢ãªã©ã§åå‰ãŒæ›´æ–°ã•れるã¾ã§ã«ï¼ˆ[http://wiki.secondlife.com/wiki/Setting_your_display_name your name to update])数日ã‹ã‹ã‚Šã¾ã™ã®ã§ã”了承ãã ã•ã„。
- </notification>
- <notification name="SetDisplayNameBlocked">
- 申ã—訳ã‚りã¾ã›ã‚“ãŒã€ç¾åœ¨è¡¨ç¤ºåã¯å¤‰æ›´ã§ãã¾ã›ã‚“。システムã®ã‚¨ãƒ©ãƒ¼ã ã¨æ€ã‚れる場åˆã¯ã€ã‚µãƒãƒ¼ãƒˆã«ãŠå•ã„åˆã‚ã›ãã ã•ã„。
- </notification>
- <notification name="SetDisplayNameFailedLength">
- 申ã—訳ã‚りã¾ã›ã‚“ãŒã€ãã®åå‰ã¯é•·ã™ãŽã¾ã™ã€‚表示åã¯æœ€é•· [LENGTH] 文字ã¾ã§ã§ã™ã€‚
-
-ã‚‚ã†å°‘ã—短ã„åå‰ã‚’ãŠè©¦ã—ãã ã•ã„。
- </notification>
- <notification name="SetDisplayNameFailedGeneric">
- 申ã—訳ã‚りã¾ã›ã‚“ãŒã€è¡¨ç¤ºåを設定ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ã‚ã¨ã§ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。
- </notification>
- <notification name="SetDisplayNameMismatch">
- 入力ã—ãŸè¡¨ç¤ºåãŒä¸€è‡´ã—ã¾ã›ã‚“。もã†ä¸€åº¦å…¥åŠ›ã—ã¦ãã ã•ã„。
- </notification>
- <notification name="AgentDisplayNameUpdateThresholdExceeded">
- ã—ã°ã‚‰ãã¯è¡¨ç¤ºåを変更ã§ãã¾ã›ã‚“。
-
-http://wiki.secondlife.com/wiki/Setting_your_display_name ã‚’å‚ç…§ã—ã¦ãã ã•ã„。
-
-ã‚ã¨ã§ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。
- </notification>
- <notification name="AgentDisplayNameSetBlocked">
- 申ã—訳ã‚りã¾ã›ã‚“ãŒã€ãƒªã‚¯ã‚¨ã‚¹ãƒˆã•れãŸåå‰ã¯ç¦å¥ã‚’å«ã‚€ãŸã‚ã«è¨­å®šã§ãã¾ã›ã‚“ã§ã—ãŸã€‚
-
-別ã®åå‰ã‚’ãŠè©¦ã—ãã ã•ã„。
- </notification>
- <notification name="AgentDisplayNameSetInvalidUnicode">
- 設定ã—よã†ã¨ã™ã‚‹è¡¨ç¤ºåã«ã¯ä½¿ãˆãªã„文字ãŒå«ã¾ã‚Œã¾ã™ã€‚
- </notification>
- <notification name="AgentDisplayNameSetOnlyPunctuation">
- 表示åã«ã¯å¥èª­ç‚¹ä»¥å¤–ã®æ–‡å­—ã‚’å«ã‚€å¿…è¦ãŒã‚りã¾ã™ã€‚
- </notification>
- <notification name="DisplayNameUpdate">
- [OLD_NAME] ([SLID]) 㯠[NEW_NAME] ã«å¤‰æ›´ã•れã¾ã—ãŸã€‚
- </notification>
- <notification name="OfferTeleport">
- 次ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’æ·»ãˆã¦ç¾åœ¨åœ°ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã‚’é€ã‚Šã¾ã™ã‹ï¼Ÿ
- <form name="form">
- <input name="message">
- [REGION] ã«æ¥ã¾ã›ã‚“ã‹ï¼Ÿ
- </input>
- <button name="OK" text="OK"/>
- <button name="Cancel" text="å–り消ã—"/>
- </form>
- </notification>
- <notification name="OfferTeleportFromGod">
- ç¾åœ¨åœ°ã«ä½äººã‚’ゴッドサモンã—ã¾ã™ã‹ï¼Ÿ
- <form name="form">
- <input name="message">
- [REGION] ã«æ¥ã¾ã›ã‚“ã‹ï¼Ÿ
- </input>
- <button name="OK" text="OK"/>
- <button name="Cancel" text="å–り消ã—"/>
- </form>
- </notification>
- <notification name="TeleportFromLandmark">
- ã“ã®ã¾ã¾ &lt;nolink&gt;[LOCATION]&lt;/nolink&gt; ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã—ã¾ã™ã‹ï¼Ÿ
- <usetemplate ignoretext="ランドマークã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã—ãŸã„ã‹ã©ã†ã‹ã®ç¢ºèª" name="okcancelignore" notext="キャンセル" yestext="テレãƒãƒ¼ãƒˆ"/>
- </notification>
- <notification name="TeleportToPick">
- [PICK] ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã—ã¾ã™ã‹ï¼Ÿ
- <usetemplate ignoretext="ピックã®å ´æ‰€ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã—ãŸã„ã‹ã©ã†ã‹ã®ç¢ºèª" name="okcancelignore" notext="キャンセル" yestext="テレãƒãƒ¼ãƒˆ"/>
- </notification>
- <notification name="TeleportToClassified">
- [CLASSIFIED] ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã—ã¾ã™ã‹ï¼Ÿ
- <usetemplate ignoretext="クラシファイド広告ã®å ´æ‰€ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã—ãŸã„ã‹ã©ã†ã‹ã®ç¢ºèª" name="okcancelignore" notext="キャンセル" yestext="テレãƒãƒ¼ãƒˆ"/>
- </notification>
- <notification name="TeleportToHistoryEntry">
- [HISTORY_ENTRY] ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã—ã¾ã™ã‹ï¼Ÿ
- <usetemplate ignoretext="履歴ã®å ´æ‰€ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã—ãŸã„ã‹ã©ã†ã‹ã®ç¢ºèª" name="okcancelignore" notext="キャンセル" yestext="テレãƒãƒ¼ãƒˆ"/>
- </notification>
- <notification label="ã‚ãªãŸã®ä¸å‹•産内ã®å…¨å“¡ã«ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’é€ä¿¡" name="MessageEstate">
- 今ã‚ãªãŸã®ä¸å‹•産ã«ã„る人全員ã«é€ã‚‹ã€çŸ­ã„メッセージを入力ã—ã¦ãã ã•ã„。
- <form name="form">
- <input name="message"/>
- <button name="OK" text="OK"/>
- <button name="Cancel" text="å–り消ã—"/>
- </form>
- </notification>
- <notification label="Lindenã®ä¸å‹•産を変更" name="ChangeLindenEstate">
- ãƒªãƒ³ãƒ‡ãƒ³ãŒæ‰€æœ‰ã™ã‚‹ã‚¨ã‚¹ãƒ†ãƒ¼ãƒˆï¼ˆãƒ¡ã‚¤ãƒ³ãƒ©ãƒ³ãƒ‰ã€ãƒ†ã‚£ãƒ¼ãƒ³ã‚°ãƒªãƒƒãƒ‰ã€ã‚ªãƒªã‚¨ãƒ³ãƒ†ãƒ¼ã‚·ãƒ§ãƒ³ãªã©ï¼‰ã‚’変更ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚
-
-ä½äººã®ä½“é¨“ã«æ ¹æœ¬çš„ã«å½±éŸ¿ã‚’与ãˆã‚‹ãŸã‚ã€éžå¸¸ã«å±é™ºãªè¡Œç‚ºã§ã™ã€‚ メインランドã§ã¯ã€ä½•åƒã¨ã„ã†ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ãŒå¤‰æ›´ã«ã‚ˆã‚‹å½±éŸ¿ã‚’å—ã‘ã€ãã®ãŸã‚スペースサーãƒãƒ¼ã«è² æ‹…ã‚’ã‹ã‘ã‚‹ã“ã¨ã«ãªã‚Šã¾ã™ã€‚
-
-ãれã§ã‚‚ç¶šã‘ã¾ã™ã‹ï¼Ÿ
- <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
- </notification>
- <notification label="Lindenã®ä¸å‹•産ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã‚’変更" name="ChangeLindenAccess">
- ã‚ãªãŸã¯ãƒªãƒ³ãƒ‡ãƒ³æ‰€æœ‰ã®ä¸å‹•産(メインランドã€ãƒ†ã‚£ãƒ¼ãƒ³ã‚°ãƒªãƒƒãƒ‰ã€ã‚ªãƒªã‚¨ãƒ³ãƒ†ãƒ¼ã‚·ãƒ§ãƒ³ãªã©ï¼‰ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ãƒªã‚¹ãƒˆã‚’変更ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚
-
-ã“ã®è¡Œç‚ºã¯ã€Œå±é™ºã€ã§ã‚りã€ã‚°ãƒªãƒƒãƒ‰ã‹ã‚‰ã‚ªãƒ–ジェクトやãŠé‡‘ã®è»¢é€ã‚’ã‚‚ãŸã‚‰ã™ãƒãƒƒã‚­ãƒ³ã‚°ã‚’引ãèµ·ã“ã™å¯èƒ½æ€§ãŒã‚ã‚‹ãŸã‚ã€å®Œå…¨ã«ãれをæ„図ã—ãŸå ´åˆã®ã¿è¡Œã†ã¹ãã‚‚ã®ã§ã™ã€‚
-ã“れã«ã‚ˆã‚Šå¤šæ•°ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼ˆåœ°åŸŸï¼‰ãŒå¤‰æ›´ã•れã€ã‚¹ãƒšãƒ¼ã‚¹ã‚µãƒ¼ãƒãƒ¼ã«æ‚ªå½±éŸ¿ãŒç”Ÿã˜ã¾ã™ã€‚
- <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
- </notification>
- <notification label="ä¸å‹•ç”£ã‚’é¸æŠž" name="EstateAllowedAgentAdd">
- ã“ã®ä¸å‹•産é™å®šã®è¨±å¯ãƒªã‚¹ãƒˆã«è¿½åŠ ã—ã¾ã™ã‹ï¼Ÿ ãれã¨ã‚‚ [ALL_ESTATES] ã®è¨±å¯ãƒªã‚¹ãƒˆã«è¿½åŠ ã—ã¾ã™ã‹ï¼Ÿ
- <usetemplate canceltext="å–り消ã—" name="yesnocancelbuttons" notext="ã™ã¹ã¦ã®ä¸å‹•産" yestext="ã“ã®ä¸å‹•産"/>
- </notification>
- <notification label="ä¸å‹•ç”£ã‚’é¸æŠž" name="EstateAllowedAgentRemove">
- ã“ã®ä¸å‹•産é™å®šã®è¨±å¯ãƒªã‚¹ãƒˆã‹ã‚‰å‰Šé™¤ã—ã¾ã™ã‹ï¼Ÿ ãれã¨ã‚‚ã€[ALL_ESTATES] ã‹ã‚‰å‰Šé™¤ã—ã¾ã™ã‹ï¼Ÿ
- <usetemplate canceltext="å–り消ã—" name="yesnocancelbuttons" notext="ã™ã¹ã¦ã®ä¸å‹•産" yestext="ã“ã®ä¸å‹•産"/>
- </notification>
- <notification label="ä¸å‹•ç”£ã‚’é¸æŠž" name="EstateAllowedGroupAdd">
- ã“ã®ä¸å‹•産é™å®šã®ã‚°ãƒ«ãƒ¼ãƒ—許å¯ãƒªã‚¹ãƒˆã«è¿½åŠ ã—ã¾ã™ã‹ï¼Ÿ ãれã¨ã‚‚ [ALL_ESTATES] ã®ã‚°ãƒ«ãƒ¼ãƒ—許å¯ãƒªã‚¹ãƒˆã«è¿½åŠ ã—ã¾ã™ã‹ï¼Ÿ
- <usetemplate canceltext="å–り消ã—" name="yesnocancelbuttons" notext="ã™ã¹ã¦ã®ä¸å‹•産" yestext="ã“ã®ä¸å‹•産"/>
- </notification>
- <notification label="ä¸å‹•ç”£ã‚’é¸æŠž" name="EstateAllowedGroupRemove">
- ã“ã®ä¸å‹•産é™å®šã®è¨±å¯ãƒªã‚¹ãƒˆã‹ã‚‰å‰Šé™¤ã—ã¾ã™ã‹ï¼Ÿ ãれã¨ã‚‚ã€[ALL_ESTATES] ã‹ã‚‰å‰Šé™¤ã—ã¾ã™ã‹ï¼Ÿ
- <usetemplate canceltext="å–り消ã—" name="yesnocancelbuttons" notext="ã™ã¹ã¦ã®ä¸å‹•産" yestext="ã“ã®ä¸å‹•産"/>
- </notification>
- <notification label="ä¸å‹•ç”£ã‚’é¸æŠž" name="EstateBannedAgentAdd">
- ã“ã®ä¸å‹•産é™å®šã§ã‚¢ã‚¯ã‚»ã‚¹ã‚’æ‹’å¦ã—ã¾ã™ã‹ï¼Ÿ ãれã¨ã‚‚ [ALL_ESTATE] ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã‚’æ‹’å¦ã—ã¾ã™ã‹ï¼Ÿ
- <usetemplate canceltext="å–り消ã—" name="yesnocancelbuttons" notext="ã™ã¹ã¦ã®ä¸å‹•産" yestext="ã“ã®ä¸å‹•産"/>
- </notification>
- <notification label="ä¸å‹•ç”£ã‚’é¸æŠž" name="EstateBannedAgentRemove">
- ã“ã®ä½äººãŒã€ã“ã®ä¸å‹•産é™å®šã€ã¾ãŸã¯ [ALL_ESTATES] ã«ã‚¢ã‚¯ã‚»ã‚¹ã§ãるよã†ã«ã€ç¦æ­¢ãƒªã‚¹ãƒˆã‹ã‚‰å‰Šé™¤ã—ã¾ã™ã‹ï¼Ÿ
- <usetemplate canceltext="å–り消ã—" name="yesnocancelbuttons" notext="ã™ã¹ã¦ã®ä¸å‹•産" yestext="ã“ã®ä¸å‹•産"/>
- </notification>
- <notification label="ä¸å‹•ç”£ã‚’é¸æŠž" name="EstateManagerAdd">
- ã“ã®ä¸å‹•産é™å®šã€ã¾ãŸã¯ [ALL_ESTATES] ã®ä¸å‹•産マãƒãƒ¼ã‚¸ãƒ£ãƒ¼ã‚’追加ã—ã¾ã™ã‹ï¼Ÿ
- <usetemplate canceltext="å–り消ã—" name="yesnocancelbuttons" notext="ã™ã¹ã¦ã®ä¸å‹•産" yestext="ã“ã®ä¸å‹•産"/>
- </notification>
- <notification label="ä¸å‹•ç”£ã‚’é¸æŠž" name="EstateManagerRemove">
- ä¸å‹•産マãƒãƒ¼ã‚¸ãƒ£ãƒ¼ã‚’ã€ã“ã®ä¸å‹•産é™å®šã€ã¾ãŸã¯ [ALL_ESTATES] ã‹ã‚‰ã€å‰Šé™¤ã—ã¾ã™ã‹ï¼Ÿ
- <usetemplate canceltext="å–り消ã—" name="yesnocancelbuttons" notext="ã™ã¹ã¦ã®ä¸å‹•産" yestext="ã“ã®ä¸å‹•産"/>
- </notification>
- <notification label="キックを確èª" name="EstateKickUser">
- ã“ã®ä¸å‹•産ã‹ã‚‰ [EVIL_USER] を追ã„出ã—ã¾ã™ã‹ï¼Ÿ
- <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
- </notification>
- <notification name="EstateChangeCovenant">
- ä¸å‹•産約款を変更ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚ç¶šã‘ã¾ã™ã‹ï¼Ÿ
- <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
- </notification>
- <notification name="RegionEntryAccessBlocked">
- ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ã«ã‚ˆã‚Šã€ãã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼ˆåœ°åŸŸï¼‰ã¸ã¯å…¥ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。 年齢を確èªã™ã‚‹éš›ã®æƒ…å ±ã«ä¸è¶³ãŒã‚ã£ãŸãŸã‚ã¨è€ƒãˆã‚‰ã‚Œã¾ã™ã€‚
-
-最新ビューワãŒã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•れã¦ã„ã‚‹ã‹ã‚’ã”確èªãã ã•ã„。ã“ã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ã§ã®ã‚¢ã‚¯ã‚»ã‚¹ã«é–¢ã™ã‚‹è©³ç´°ã¯ãƒŠãƒ¬ãƒƒã‚¸ãƒ™ãƒ¼ã‚¹ã‚’ã”覧ãã ã•ã„。
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="RegionEntryAccessBlocked_KB">
- ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ã«ã‚ˆã‚Šã€ãã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼ˆåœ°åŸŸï¼‰ã¸ã¯å…¥ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。
-
-ナレッジベースを開ãレーティング区分ã«ã¤ã„ã¦å­¦ã³ã¾ã™ã‹ï¼Ÿ
- <url name="url">
- http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/ja
- </url>
- <usetemplate ignoretext="レーティング区分ã®åˆ¶é™ã®ãŸã‚ã€ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã«å…¥ã‚‹ã“ã¨ãŒã§ããªã„ã¨ã" name="okcancelignore" notext="é–‰ã˜ã‚‹" yestext="ナレッジベースを開ã"/>
- </notification>
- <notification name="RegionEntryAccessBlocked_Notify">
- ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ã«ã‚ˆã‚Šã€ãã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼ˆåœ°åŸŸï¼‰ã¸ã¯å…¥ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。
- </notification>
- <notification name="RegionEntryAccessBlocked_Change">
- レーティング区分ã«é–¢ã™ã‚‹è¨­å®šã«ã‚ˆã‚Šã€ãã®åœ°åŸŸï¼ˆãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼‰ã«ã¯ç«‹ã¡å…¥ã‚Œã¾ã›ã‚“。
-
-ãã®åœ°åŸŸã«å…¥ã‚‹ã«ã¯ã€ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ã®è¨­å®šã‚’変更ã—ã¦ãã ã•ã„。変更ã™ã‚‹ã¨ã€[REGIONMATURITY]ã®ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã®æ¤œç´¢ã‚„アクセスãŒå¯èƒ½ã«ãªã‚Šã¾ã™ã€‚å¤‰æ›´å†…å®¹ã‚’å…ƒã«æˆ»ã™ã«ã¯ã€ãƒŸãƒ¼ &gt; 環境設定 &gt; ä¸€èˆ¬ã‚’é¸æŠžã—ã¦ãã ã•ã„。
- <form name="form">
- <button name="OK" text="環境設定ã®å¤‰æ›´"/>
- <button default="true" name="Cancel" text="é–‰ã˜ã‚‹"/>
- <ignore name="ignore" text="é¸æŠžã—ãŸãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ãŒåŽŸå› ã§ã€ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã«å…¥ã‚Œãªã„ã¨ã"/>
- </form>
- </notification>
- <notification name="PreferredMaturityChanged">
- ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†è¨­å®šã¯ç¾åœ¨ [RATING] ã§ã™ã€‚
- </notification>
- <notification name="LandClaimAccessBlocked">
- ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ã«ã‚ˆã‚Šã€ã“ã®åœŸåœ°ã‚’å–å¾—ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 年齢を確èªã™ã‚‹éš›ã®æƒ…å ±ã«ä¸è¶³ãŒã‚ã£ãŸãŸã‚ã¨è€ƒãˆã‚‰ã‚Œã¾ã™ã€‚
-
-最新ビューワãŒã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•れã¦ã„ã‚‹ã‹ã‚’ã”確èªãã ã•ã„。ã“ã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ã§ã®ã‚¢ã‚¯ã‚»ã‚¹ã«é–¢ã™ã‚‹è©³ç´°ã¯ãƒŠãƒ¬ãƒƒã‚¸ãƒ™ãƒ¼ã‚¹ã‚’ã”覧ãã ã•ã„。
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="LandClaimAccessBlocked_KB">
- ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ã«ã‚ˆã‚Šã€ã“ã®åœŸåœ°ã‚’å–å¾—ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。
-
-ナレッジベースを開ãレーティング区分ã«ã¤ã„ã¦å­¦ã³ã¾ã™ã‹ï¼Ÿ
- <url name="url">
- http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/ja
- </url>
- <usetemplate ignoretext="レーティング区分ã®åˆ¶é™ã®ãŸã‚ã€ã“ã®åœŸåœ°ã‚’å–å¾—ã§ãã¾ã›ã‚“" name="okcancelignore" notext="é–‰ã˜ã‚‹" yestext="ナレッジベースを開ã"/>
- </notification>
- <notification name="LandClaimAccessBlocked_Notify">
- ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ã«ã‚ˆã‚Šã€ã“ã®åœŸåœ°ã‚’å–å¾—ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。
- </notification>
- <notification name="LandClaimAccessBlocked_Change">
- ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†è¨­å®šã«ã‚ˆã‚Šã€ã“ã®åœŸåœ°ã‚’å–å¾—ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。
-
-「設定を変更ã€ã‚’クリックã—ã¦ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ã‚’上ã’ã‚‹ã¨ã€å…¥ã‚Œã‚‹ã‚ˆã†ã«ãªã‚Šã¾ã™ã€‚ ã‚ãªãŸã¯ä»Šå¾Œ [REGIONMATURITY] ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã®æ¤œç´¢åŠã³ã‚¢ã‚¯ã‚»ã‚¹ãŒå¯èƒ½ã¨ãªã‚Šã¾ã™ã€‚ ã‚ã¨ã§è¨­å®šã‚’å…ƒã«æˆ»ã—ãŸã„å ´åˆã¯ã€ã€Œç·¨é›†ã€ï¼žã€Œç’°å¢ƒè¨­å®šã€ã‚’ã”覧ãã ã•ã„。
- <usetemplate ignoretext="é¸æŠžã—ãŸãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ãŒåŽŸå› ã§ã€åœŸåœ°ã‚’å–å¾—ã§ããªã„ã¨ã" name="okcancelignore" notext="é–‰ã˜ã‚‹" yestext="設定ã®å¤‰æ›´"/>
- </notification>
- <notification name="LandBuyAccessBlocked">
- ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ã«ã‚ˆã‚Šã€ã“ã®åœŸåœ°ã‚’購入ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 年齢を確èªã™ã‚‹éš›ã®æƒ…å ±ã«ä¸è¶³ãŒã‚ã£ãŸãŸã‚ã¨è€ƒãˆã‚‰ã‚Œã¾ã™ã€‚
-
-最新ビューワãŒã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•れã¦ã„ã‚‹ã‹ã‚’ã”確èªãã ã•ã„。ã“ã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ã§ã®ã‚¢ã‚¯ã‚»ã‚¹ã«é–¢ã™ã‚‹è©³ç´°ã¯ãƒŠãƒ¬ãƒƒã‚¸ãƒ™ãƒ¼ã‚¹ã‚’ã”覧ãã ã•ã„。
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="LandBuyAccessBlocked_KB">
- ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ã«ã‚ˆã‚Šã€ã“ã®åœŸåœ°ã‚’購入ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。
-
-ナレッジベースを開ãレーティング区分ã«ã¤ã„ã¦å­¦ã³ã¾ã™ã‹ï¼Ÿ
- <url name="url">
- http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/ja
- </url>
- <usetemplate ignoretext="レーティング区分ã®åˆ¶é™ã®ãŸã‚ã€ã“ã®åœŸåœ°ã‚’購入ã§ãã¾ã›ã‚“" name="okcancelignore" notext="é–‰ã˜ã‚‹" yestext="ナレッジベースを開ã"/>
- </notification>
- <notification name="LandBuyAccessBlocked_Notify">
- ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ã«ã‚ˆã‚Šã€ã“ã®åœŸåœ°ã‚’購入ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。
- </notification>
- <notification name="LandBuyAccessBlocked_Change">
- ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†è¨­å®šã«ã‚ˆã‚Šã€ã“ã®åœŸåœ°ã‚’購入ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。
-
-「設定を変更ã€ã‚’クリックã—ã¦ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ã‚’上ã’ã‚‹ã¨ã€å…¥ã‚Œã‚‹ã‚ˆã†ã«ãªã‚Šã¾ã™ã€‚ ã‚ãªãŸã¯ä»Šå¾Œ [REGIONMATURITY] ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã®æ¤œç´¢åŠã³ã‚¢ã‚¯ã‚»ã‚¹ãŒå¯èƒ½ã¨ãªã‚Šã¾ã™ã€‚ ã‚ã¨ã§è¨­å®šã‚’å…ƒã«æˆ»ã—ãŸã„å ´åˆã¯ã€ã€Œç·¨é›†ã€ï¼žã€Œç’°å¢ƒè¨­å®šã€ã‚’ã”覧ãã ã•ã„。
- <usetemplate ignoretext="é¸æŠžã—ãŸãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ãŒåŽŸå› ã§ã€åœŸåœ°ã‚’購入ã§ããªã„ã¨ã" name="okcancelignore" notext="é–‰ã˜ã‚‹" yestext="設定ã®å¤‰æ›´"/>
- </notification>
- <notification name="TooManyPrimsSelected">
- é¸æŠžã—ãŸãƒ—リムãŒå¤šã™ãŽã¾ã™ã€‚ [MAX_PRIM_COUNT] å€‹é¸æŠžã™ã‚‹ã‹ã€ãƒ—リム数を減らã—ã¦ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="ProblemImportingEstateCovenant">
- ä¸å‹•産約款ã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆæ™‚ã«å•題ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="ProblemAddingEstateManager">
- æ–°ã—ã„ä¸å‹•産マãƒãƒ¼ã‚¸ãƒ£ãƒ¼ã®è¿½åŠ ã«é–¢ã™ã‚‹å•題:
-ã„ãšã‚Œã‹ã®ä¸å‹•産ã®ãƒžãƒãƒ¼ã‚¸ãƒ£ãƒ¼ãƒªã‚¹ãƒˆãŒæº€æ¯ã«ãªã£ã¦ã„ã¾ã™ã€‚
- </notification>
- <notification name="ProblemAddingEstateGeneric">
- ä¸å‹•産リストã®è¿½åŠ ã«é–¢ã™ã‚‹å•題:
-ã„ãšã‚Œã‹ã®ä¸å‹•産ã®ãƒªã‚¹ãƒˆãŒæº€æ¯ã«ãªã£ã¦ã„ã¾ã™ã€‚
- </notification>
- <notification name="UnableToLoadNotecardAsset">
- ç¾åœ¨ãƒŽãƒ¼ãƒˆã‚«ãƒ¼ãƒ‰ã®ã‚¢ã‚»ãƒƒãƒˆ ID を読ã¿è¾¼ã‚€ã“ã¨ãŒã§ãã¾ã›ã‚“。
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="NotAllowedToViewNotecard">
- è¦æ±‚ã—ãŸã‚¢ã‚»ãƒƒãƒˆ ID ã«é–¢ã™ã‚‹ãƒŽãƒ¼ãƒˆã‚«ãƒ¼ãƒ‰ã‚’閲覧ã™ã‚‹ã«ã¯ã€æ¨©é™ãŒä¸å分ã§ã™ã€‚
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="MissingNotecardAssetID">
- ノートカード用ã®ã‚¢ã‚»ãƒƒãƒˆ ID ãŒãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã«ç™»éŒ²ã•れã¦ã„ã¾ã›ã‚“。
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="PublishClassified">
- 注æ„ï¼šã‚¯ãƒ©ã‚·ãƒ•ã‚¡ã‚¤ãƒ‰åºƒå‘Šã®æ–™é‡‘ã¯æ‰•ã„æˆ»ã—ã•れã¾ã›ã‚“。
-
-L$ [AMOUNT] ã§ã€ã“ã®ã‚¯ãƒ©ã‚·ãƒ•ァイド広告を今ã™ã公開ã—ã¾ã™ã‹ï¼Ÿ
- <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
- </notification>
- <notification name="SetClassifiedMature">
- ã“ã®åºƒå‘Šã«ã€ŒModerateã€ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã¯å«ã¾ã‚Œã¦ã„ã¾ã™ã‹ï¼Ÿ
- <usetemplate canceltext="キャンセル" name="yesnocancelbuttons" notext="ã„ã„ãˆ" yestext="ã¯ã„"/>
- </notification>
- <notification name="SetGroupMature">
- ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«ã€ŒModerateã€ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ãŒå«ã¾ã‚Œã¦ã„ã¾ã™ã‹ï¼Ÿ
- <usetemplate canceltext="キャンセル" name="yesnocancelbuttons" notext="ã„ã„ãˆ" yestext="ã¯ã„"/>
- </notification>
- <notification label="å†èµ·å‹•を確èª" name="ConfirmRestart">
- ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ 2 分後ã«å†èµ·å‹•ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚
-ç¶šã‘ã¾ã™ã‹ï¼Ÿ
- <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
- </notification>
- <notification label="ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã«ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’é€ä¿¡" name="MessageRegion">
- ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã«ã„る人全員ã«é€ã‚‹çŸ­ã„メッセージを入力ã—ã¦ãã ã•ã„。
- <form name="form">
- <input name="message"/>
- <button name="OK" text="OK"/>
- <button name="Cancel" text="å–り消ã—"/>
- </form>
- </notification>
- <notification label="地域ã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†æŒ‡å®šå¤‰æ›´æ¸ˆã¿" name="RegionMaturityChange">
- ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼ˆåœ°åŸŸï¼‰ã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ãŒã‚¢ãƒƒãƒ—デートã•れã¾ã—ãŸã€‚
-地図ã«å¤‰æ›´ãŒå映ã•れるã¾ã§æ•°åˆ†ã‹ã‹ã‚‹ã“ã¨ãŒã‚りã¾ã™ã€‚
-
-Adult 専用リージョンã«å…¥ã‚‹ã«ã¯ã€ä½äººã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆãŒå¹´é½¢ç¢ºèªã‹æ”¯æ‰•方法ã®ã„ãšã‚Œã‹ã§ã€Œç¢ºèªæ¸ˆã¿ã€ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“。
- </notification>
- <notification label="ボイスãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®ä¸ä¸€è‡´" name="VoiceVersionMismatch">
- [APP_NAME] ã®ã“ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã¯ã€ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã«ãŠã‘るボイスãƒãƒ£ãƒƒãƒˆã®äº’æ›æ€§ãŒã‚りã¾ã›ã‚“。 ボイスãƒãƒ£ãƒƒãƒˆã‚’正常ã«è¡Œã†ãŸã‚ã«ã¯ã€[APP_NAME] ã®ã‚¢ãƒƒãƒ—デートãŒå¿…è¦ã§ã™ã€‚
- </notification>
- <notification label="オブジェクトを購入ã§ãã¾ã›ã‚“" name="BuyObjectOneOwner">
- è¤‡æ•°ã®æ‰€æœ‰è€…ã‹ã‚‰åŒæ™‚ã«ã‚ªãƒ–ジェクトを購入ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。
-å˜ä¸€ã®ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’é¸æŠžã—ã€ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。
- </notification>
- <notification label="コンテンツを購入ã§ãã¾ã›ã‚“" name="BuyContentsOneOnly">
- 一度ã«è¤‡æ•°ã®ã‚ªãƒ–ジェクトã®ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã¯è³¼å…¥ã§ãã¾ã›ã‚“。
-é¸æŠžã™ã‚‹ã‚ªãƒ–ジェクトを1ã¤ã ã‘ã«ã—ã¦ã€ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。
- </notification>
- <notification label="コンテンツを購入ã§ãã¾ã›ã‚“" name="BuyContentsOneOwner">
- è¤‡æ•°ã®æ‰€æœ‰è€…ã‹ã‚‰åŒæ™‚ã«ã‚ªãƒ–ジェクトを購入ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。
-å˜ä¸€ã®ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’é¸æŠžã—ã€ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。
- </notification>
- <notification name="BuyOriginal">
- オリジナルã®ã‚ªãƒ–ジェクトを [OWNER] ã‹ã‚‰ L$ [PRICE] ã§è³¼å…¥ã—ã¾ã™ã‹ï¼Ÿ
-購入ã™ã‚‹ã¨ã€ã‚ãªãŸãŒã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã®æ‰€æœ‰è€…ã¨ãªã‚Šã¾ã™ã€‚
-å¯èƒ½ãªæ“作ã¯ã€
-修正:[MODIFYPERM]ã€ã‚³ãƒ”ー:[COPYPERM]ã€
-å†è²©ãƒ»ãƒ—レゼント:[RESELLPERM] ã§ã™ã€‚
- <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
- </notification>
- <notification name="BuyOriginalNoOwner">
- L$ [PRICE] ã§ã‚ªãƒªã‚¸ãƒŠãƒ«ã®ã‚ªãƒ–ジェクトを購入ã—ã¾ã™ã‹ï¼Ÿ
-購入ã™ã‚‹ã¨ã€ã‚ãªãŸãŒã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã®æ‰€æœ‰è€…ã¨ãªã‚Šã¾ã™ã€‚
-å¯èƒ½ãªæ“作ã¯ã€
-修正:[MODIFYPERM]ã€ã‚³ãƒ”ー:[COPYPERM]ã€
-å†è²©ãƒ»ãƒ—レゼント:[RESELLPERM] ã§ã™ã€‚
- <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
- </notification>
- <notification name="BuyCopy">
- コピーを [OWNER] ã‹ã‚‰ L$ [PRICE] ã§è³¼å…¥ã—ã¾ã™ã‹ï¼Ÿ
-購入ã—ãŸã‚ªãƒ–ジェクトã¯ã€ã‚ãªãŸã®ã€ŒæŒã¡ç‰©ã€ã«ã‚³ãƒ”ーã•れã¾ã™ã€‚
-å¯èƒ½ãªæ“作ã¯ã€
-修正:[MODIFYPERM]ã€ã‚³ãƒ”ー:[COPYPERM]ã€
-å†è²©ãƒ»ãƒ—レゼント:[RESELLPERM] ã§ã™ã€‚
- <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
- </notification>
- <notification name="BuyCopyNoOwner">
- L$ [PRICE] ã§ã‚³ãƒ”ーを購入ã—ã¾ã™ã‹ï¼Ÿ
-購入ã—ãŸã‚ªãƒ–ジェクトã¯ã€ã‚ãªãŸã®ã€ŒæŒã¡ç‰©ã€ã«ã‚³ãƒ”ーã•れã¾ã™ã€‚
-å¯èƒ½ãªæ“作ã¯ã€
-修正:[MODIFYPERM]ã€ã‚³ãƒ”ー:[COPYPERM]ã€
-å†è²©ãƒ»ãƒ—レゼント:[RESELLPERM] ã§ã™ã€‚
- <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
- </notification>
- <notification name="BuyContents">
- 中身を [OWNER] ã‹ã‚‰ L$ [PRICE] ã§è³¼å…¥ã—ã¾ã™ã‹ï¼Ÿ
-購入ã—ãŸä¸­èº«ã¯ã€ã‚ãªãŸã®ã€ŒæŒã¡ç‰©ã€ã«ã‚³ãƒ”ーã•れã¾ã™ã€‚
- <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
- </notification>
- <notification name="BuyContentsNoOwner">
- L$ [PRICE] ã§ä¸­èº«ã‚’購入ã—ã¾ã™ã‹ï¼Ÿ
-購入ã—ãŸä¸­èº«ã¯ã€ã‚ãªãŸã®ã€ŒæŒã¡ç‰©ã€ã«ã‚³ãƒ”ーã•れã¾ã™ã€‚
- <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
- </notification>
- <notification name="ConfirmPurchase">
- ã“ã®å–引ã¯ä»¥ä¸‹ã®ã¨ãŠã‚Šè¡Œã‚れã¾ã™ï¼š
-[ACTION]
-
-購入を続ã‘ã¾ã™ã‹ï¼Ÿ
- <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
- </notification>
- <notification name="ConfirmPurchasePassword">
- ã“ã®å–引ã¯ä»¥ä¸‹ã®ã¨ãŠã‚Šè¡Œã‚れã¾ã™ï¼š
-[ACTION]
-
-購入を続ã‘ã¾ã™ã‹ï¼Ÿ
-パスワードをå†å…¥åŠ›ã—ã€ã€Œ OK ã€ã‚’クリックã—ã¦ãã ã•ã„。
- <form name="form">
- <input name="message"/>
- <button name="ConfirmPurchase" text="OK"/>
- <button name="Cancel" text="å–り消ã—"/>
- </form>
- </notification>
- <notification name="SetPickLocation">
- メモ:
-本ピックã®ä½ç½®ã‚’æ›´æ–°ã—ã¾ã—ãŸãŒã€
-ä»–ã®è©³ç´°ã¯å…ƒã®å€¤ã®ã¾ã¾ã«ãªã‚Šã¾ã™ã€‚
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="MoveInventoryFromObject">
- 「コピーä¸å¯ã€ã®æŒã¡ç‰©ã‚¢ã‚¤ãƒ†ãƒ ã‚’é¸æŠžã—ã¾ã—ãŸã€‚
-ã“れらã®ã‚¢ã‚¤ãƒ†ãƒ ã¯ã‚³ãƒ”ーã•れãªã„ã¾ã¾ã€ã‚ãªãŸã®ã€ŒæŒã¡ç‰©ã€ã«ç§»å‹•ã•れã¾ã™ã€‚
-
-
-アイテムを動ã‹ã—ã¾ã™ã‹ï¼Ÿ
- <usetemplate ignoretext="「コピーä¸å¯ã€ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’オブジェクトã‹ã‚‰å‹•ã‹ã™å‰ã®è­¦å‘Š" name="okcancelignore" notext="キャンセル" yestext="OK"/>
- </notification>
- <notification name="MoveInventoryFromScriptedObject">
- 「コピーä¸å¯ã€ã®æŒã¡ç‰©ã‚¢ã‚¤ãƒ†ãƒ ã‚’é¸æŠžã—ã¾ã—ãŸã€‚
-ã“れらã®ã‚¢ã‚¤ãƒ†ãƒ ã¯ã‚³ãƒ”ーã•れãšã«ã€ã‚ãªãŸã®ã€ŒæŒã¡ç‰©ã€ã«ç§»å‹•ã•れã¾ã™ã€‚
-ã“ã®ã‚ªãƒ–ジェクトã¯ã‚¹ã‚¯ãƒªãƒ—ト付ããªã®ã§ã€ã€ŒæŒã¡ç‰©ã€ã«ç§»å‹•ã•ã›ã‚‹ã¨
-スクリプトã«èª¤å‹•作ãŒèµ·ãã‚‹å¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚
-
-æŒã¡ç‰©ã‚¢ã‚¤ãƒ†ãƒ ã‚’移動ã—ã¾ã™ã‹ï¼Ÿ
- <usetemplate ignoretext="スクリプト入りã®ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’å£Šã™æã‚Œã®ã‚る「コピーä¸å¯ã€ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’å‹•ã‹ã™å‰ã®è­¦å‘Š" name="okcancelignore" notext="キャンセル" yestext="OK"/>
- </notification>
- <notification name="ClickActionNotPayable">
- 警告: クリックã§ã€Œã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã«æ”¯æ‰•ã†ã€è¨­å®šã‚’ã—ã¾ã—ãŸã€‚スクリプト㫠money()イベントãŒè¿½åŠ ã•れるã¨å‹•作ã—ã¾ã™ã€‚
- <form name="form">
- <ignore name="ignore" text="オブジェクトを作æˆä¸­ã«ã€money() スクリプトを入れãšã«ã€Œã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã«æ”¯æ‰•ã†ã€ã‚¢ã‚¯ã‚·ãƒ§ãƒ³ã‚’設定ã—ãŸã¨ã"/>
- </form>
- </notification>
- <notification name="OpenObjectCannotCopy">
- ã“ã®ã‚ªãƒ–ジェクトã«ã¯ã€ã‚ãªãŸãŒã‚³ãƒ”ーã§ãるアイテムã¯ã‚りã¾ã›ã‚“。
- </notification>
- <notification name="WebLaunchAccountHistory">
- [http://jp.secondlife.com/account/ マイアカウント] ページã«ç§»å‹•ã—ã¦ã‚¢ã‚«ã‚¦ãƒ³ãƒˆå±¥æ­´ã‚’確èªã—ã¾ã™ã‹ï¼Ÿ
- <usetemplate ignoretext="ブラウザを起動ã—ã¦ã‚¢ã‚«ã‚¦ãƒ³ãƒˆå±¥æ­´ã‚’見るã¨ã" name="okcancelignore" notext="å–り消ã—" yestext="ページã«ç§»å‹•"/>
- </notification>
- <notification name="ConfirmQuit">
- 終了ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚ç¶šã‘ã¾ã™ã‹ï¼Ÿ
- <usetemplate ignoretext="終了時ã®ç¢ºèª" name="okcancelignore" notext="終了ã—ãªã„" yestext="終了"/>
- </notification>
- <notification name="DeleteItems">
- [QUESTION]
- <usetemplate ignoretext="アイテムを削除ã™ã‚‹å‰ã®ç¢ºèª" name="okcancelignore" notext="å–り消ã—" yestext="OK"/>
- </notification>
- <notification name="HelpReportAbuseEmailLL">
- ã“ã®ãƒ„ールを利用ã—㦠[http://secondlife.com/corporate/tos.php 利用è¦ç´„] ã‚„ [http://jp.secondlife.com/corporate/cs.php コミュニティスタンダード] ã®é•åを報告ã—ã¦ãã ã•ã„。
-
-報告ã•れãŸå«ŒãŒã‚‰ã›ã¯ã™ã¹ã¦èª¿æŸ»ãƒ»è§£æ±ºã•れã¾ã™ã€‚
- </notification>
- <notification name="HelpReportAbuseSelectCategory">
- 嫌ãŒã‚‰ã›å ±å‘Šã®ã‚«ãƒ†ã‚´ãƒªã‚’é¸æŠžã—ã¦ãã ã•ã„。
-ã‚«ãƒ†ã‚´ãƒªã‚’é¸æŠžã™ã‚‹ã“ã¨ã«ã‚ˆã‚Šã€å«ŒãŒã‚‰ã›å ±å‘Šã®å‡¦ç†ã‚„ä¿ç®¡ã«å¤§å¤‰å½¹ç«‹ã¡ã¾ã™ã€‚
- </notification>
- <notification name="HelpReportAbuseAbuserNameEmpty">
- 嫌ãŒã‚‰ã›è¡Œç‚ºã‚’ã—ãŸäººã®åå‰ã‚’入力ã—ã¦ãã ã•ã„。
-æ­£ç¢ºãªæƒ…å ±ã®å…¥åŠ›ã«ã‚ˆã‚Šã€å«ŒãŒã‚‰ã›å ±å‘Šã®å‡¦ç†ã‚„ä¿ç®¡ã«å¤§å¤‰å½¹ç«‹ã¡ã¾ã™ã€‚
- </notification>
- <notification name="HelpReportAbuseAbuserLocationEmpty">
- 嫌ãŒã‚‰ã›ãŒã‚ã£ãŸå ´æ‰€ã‚’入力ã—ã¦ãã ã•ã„。
-æ­£ç¢ºãªæƒ…å ±ã®å…¥åŠ›ã«ã‚ˆã‚Šã€å«ŒãŒã‚‰ã›å ±å‘Šã®å‡¦ç†ã‚„ä¿ç®¡ã«å¤§å¤‰å½¹ç«‹ã¡ã¾ã™ã€‚
- </notification>
- <notification name="HelpReportAbuseSummaryEmpty">
- 嫌ãŒã‚‰ã›ã®æ¦‚è¦ã‚’入力ã—ã¦ãã ã•ã„。
-æ­£ç¢ºãªæ¦‚è¦ã®å…¥åŠ›ã«ã‚ˆã‚Šã€
-嫌ãŒã‚‰ã›å ±å‘Šã®å‡¦ç†ã‚„ä¿ç®¡ã«å¤§å¤‰å½¹ç«‹ã¡ã¾ã™ã€‚
- </notification>
- <notification name="HelpReportAbuseDetailsEmpty">
- 嫌ãŒã‚‰ã›ã®è©³ç´°ãªèª¬æ˜Žã‚’入力ã—ã¦ãã ã•ã„。
-åå‰ã‚„嫌ãŒã‚‰ã›ã®è©³ç´°ã‚’ã€ã§ãã‚‹ã ã‘具体的ã«å…¥åŠ›ã—ã¦ãã ã•ã„。
-
-正確ãªèª¬æ˜Žã®å…¥åŠ›ã«ã‚ˆã‚Šã€
-嫌ãŒã‚‰ã›å ±å‘Šã®å‡¦ç†ã‚„ä¿ç®¡ã«å¤§å¤‰å½¹ç«‹ã¡ã¾ã™ã€‚
- </notification>
- <notification name="HelpReportAbuseContainsCopyright">
- ã“ã‚“ã«ã¡ã¯ã€
-
-知的財産権ã®ä¾µå®³ã‚’報告ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚ 正確ã«å ±å‘Šã™ã‚‹ãŸã‚ã«ã€ä»¥ä¸‹ã‚’ã”確èªãã ã•ã„:
-
-(1) 嫌ãŒã‚‰ã›ã®å ±å‘Šã®æ‰‹é † ä½äººãŒ [SECOND_LIFE] ã®æ¨©é™ã‚·ã‚¹ãƒ†ãƒ ã‚’悪用ã—ã¦ã„ã‚‹ã®ã‚’見ã¤ã‘ãŸã‚‰ã€å«ŒãŒã‚‰ã›ã®å ±å‘Šã‚’ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚例ãˆã°ã€CopyBot ã‚„ä¼¼ãŸã‚ˆã†ãªã‚³ãƒ”ーツールを使用ã—ã¦çŸ¥çš„財産権を侵害ã—ã¦ã„ã‚‹å ´åˆã§ã™ã€‚ 担当ãƒãƒ¼ãƒ ã¯èª¿æŸ»ã‚’行ã„ã€[SECOND_LIFE] [http://secondlife.com/corporate/tos.php 利用è¦ç´„] ã‚„ [http://jp.secondlife.com/corporate/cs.php コミュニティスタンダード] ã«é•åã™ã‚‹è¡Œç‚ºã«å¯¾ã™ã‚‹é©åˆ‡ãªå‡¦ç½°ã‚’下ã—ã¾ã™ã€‚ ãŸã ã—ã€æ‹…当ãƒãƒ¼ãƒ ã¯ [SECOND_LIFE] ã®ä¸–界ã‹ã‚‰ã‚³ãƒ³ãƒ†ãƒ³ãƒ„を削除ã—ã¦æ¬²ã—ã„ã¨ã„ã†ãƒªã‚¯ã‚¨ã‚¹ãƒˆã«ã¯å¿œã˜ã¾ã›ã‚“。
-
-(2) DMCA ã¾ãŸã¯ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã®æ’¤åŽ»ã®æ‰‹é † コンテンツを [SECOND_LIFE] ã‹ã‚‰å‰Šé™¤ã—ã¦æ¬²ã—ã„ã¨ã„ã†ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’ã™ã‚‹ã«ã¯ã€å¼Šç¤¾ [http://secondlife.com/corporate/dmca.php DMCA ãƒãƒªã‚·ãƒ¼] ã§æç¤ºã•れã¦ã„ã‚‹ã¨ãŠã‚Šã€æœ‰åйãªä¾µå®³ã®é€šçŸ¥ã‚’æå‡ºã—ãªã‘れã°ãªã‚Šã¾ã›ã‚“。.
-
-ã“ã®ã¾ã¾å«ŒãŒã‚‰ã›ã®å ±å‘Šã‚’ç¶šã‘ãŸã„å ´åˆã¯ã€ã“ã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã‚’é–‰ã˜ã¦å ±å‘Šã‚’é€ã£ã¦ãã ã•ã„。 「コピー Bot åŠã³æ¨©é™ã®æ‚ªç”¨ã€ã®ã‚«ãƒ†ã‚´ãƒªã‚’é¸ã‚“ã æ–¹ãŒé©åˆ‡ã®å ´åˆãŒã‚りã¾ã™ã€‚
-
-ã”å”力ã‚りãŒã¨ã†ã”ã–ã„ã¾ã™ã€‚
-
-Linden Lab
- </notification>
- <notification name="FailedRequirementsCheck">
- 以下ã®å¿…è¦ãªã‚³ãƒ³ãƒãƒ¼ãƒãƒ³ãƒˆãŒã€[FLOATER] ã‹ã‚‰æŠœã‘è½ã¡ã¦ã„ã¾ã™
-[COMPONENTS]
- </notification>
- <notification label="既存ã®ä»˜å±žå“ã‚’ç½®æ›" name="ReplaceAttachment">
- 体ã®ã“ã®éƒ¨ä½ã«ã¯æ—¢ã«ã‚ªãƒ–ジェクトãŒè£…ç€ã•れã¦ã„ã¾ã™ã€‚
-é¸æŠžã•れãŸã‚ªãƒ–ジェクトã¨ç½®ãæ›ãˆã¾ã™ã‹ï¼Ÿ
- <form name="form">
- <ignore name="ignore" save_option="true" text="装ç€ã—ã¦ã„るアイテムã¨é¸æŠžã—ãŸã‚¢ã‚¤ãƒ†ãƒ ã‚’入れ替ãˆã‚‹ã¨ã"/>
- <button ignore="自動的ã«äº¤æ›" name="Yes" text="OK"/>
- <button ignore="交æ›ã—ãªã„" name="No" text="キャンセル"/>
- </form>
- </notification>
- <notification label="å–り込ã¿ä¸­ã®è­¦å‘Š" name="BusyModePay">
- ç¾åœ¨ã€ã€Œå–り込ã¿ä¸­ã€ãƒ¢ãƒ¼ãƒ‰ã®ãŸã‚ã€æ”¯æ‰•ã„ã¨å¼•ãæ›ãˆã«ã‚¢ã‚¤ãƒ†ãƒ ã‚’å—ã‘å–ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。
-
-ã“ã®å–引を行ã†ãŸã‚ã«ã€Œå–り込ã¿ä¸­ã€ã®è¨­å®šã‚’解除ã—ã¾ã™ã‹ï¼Ÿ
- <form name="form">
- <ignore name="ignore" save_option="true" text="å–り込ã¿ä¸­ãƒ¢ãƒ¼ãƒ‰æ™‚ã«æ”¯æ‰•ã‚’ã™ã‚‹ã¨ã"/>
- <button ignore="常ã«ã€Œå–り込ã¿ä¸­ã€ã®è¨­å®šã‚’解除" name="Yes" text="OK"/>
- <button ignore="常ã«ã€Œå–り込ã¿ä¸­ã€ã®è¨­å®šã‚’継続" name="No" text="キャンセル"/>
- </form>
- </notification>
- <notification name="ConfirmDeleteProtectedCategory">
- 「 [FOLDERNAME] 〠ã¯ã€ã‚·ã‚¹ãƒ†ãƒ ãƒ•ォルダã§ã™ã€‚ システムフォルダを削除ã™ã‚‹ã¨ä¸å®‰å®šã«ãªã‚‹ã“ã¨ãŒã‚りã¾ã™ã€‚ ç¶šã‘ã¾ã™ã‹ï¼Ÿ
- <usetemplate ignoretext="システムフォルダを削除ã™ã‚‹å‰ã®ç¢ºèª" name="okcancelignore" notext="キャンセル" yestext="OK"/>
- </notification>
- <notification name="ConfirmEmptyTrash">
- ã”ã¿ç®±ã®ä¸­èº«ã‚’ã™ã¹ã¦å‰Šé™¤ã—ã¾ã™ã‹ï¼Ÿ
- <usetemplate ignoretext="æŒã¡ç‰©ã®ã”ã¿ç®±ãƒ•ォルダを空ã«ã™ã‚‹å‰ã®ç¢ºèª" name="okcancelignore" notext="キャンセル" yestext="OK"/>
- </notification>
- <notification name="ConfirmClearBrowserCache">
- トラベルã€Webã€æ¤œç´¢ã®å±¥æ­´ã‚’ã™ã¹ã¦å‰Šé™¤ã—ã¾ã™ã‹ï¼Ÿ
- <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
- </notification>
- <notification name="ConfirmClearCookies">
- 本当ã«ã‚¯ãƒƒã‚­ãƒ¼ã‚’クリアã—ã¾ã™ã‹ï¼Ÿ
- <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="ã¯ã„"/>
- </notification>
- <notification name="ConfirmClearMediaUrlList">
- ä¿å­˜ã•れ㟠URL ã®ãƒªã‚¹ãƒˆã‚’消去ã—ã¾ã™ã€‚よã‚ã—ã„ã§ã™ã‹ï¼Ÿ
- <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="ã¯ã„"/>
- </notification>
- <notification name="ConfirmEmptyLostAndFound">
- 紛失物ã®ä¸­èº«ã‚’ã™ã¹ã¦å‰Šé™¤ã—ã¾ã™ã‹ï¼Ÿ
- <usetemplate ignoretext="紛失物フォルダを空ã«ã™ã‚‹å‰ã®ç¢ºèª" name="okcancelignore" notext="ã„ã„ãˆ" yestext="ã¯ã„"/>
- </notification>
- <notification name="CopySLURL">
- 次㮠SLurl ãŒã‚¯ãƒªãƒƒãƒ—ボードã«ã‚³ãƒ”ーã•れã¾ã—ãŸï¼š
- [SLURL]
-
-Web ページã«ãƒªãƒ³ã‚¯ã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚¢ã‚¯ã‚»ã‚¹ã§ãã¾ã™ã€‚Web ブラウザã®ã‚¢ãƒ‰ãƒ¬ã‚¹ãƒãƒ¼ã«è²¼ã‚Šä»˜ã‘ã¦è©¦ã—ã¦ã¿ã¦ãã ã•ã„。
- <form name="form">
- <ignore name="ignore" text="クリップボード㫠SLurl をコピーã™ã‚‹ã¨ã"/>
- </form>
- </notification>
- <notification name="WLSavePresetAlert">
- ä¿å­˜ã•れãŸäº‹å‰è¨­å®šã‚’上書ãã—ã¾ã™ã‹ï¼Ÿ
- <usetemplate name="okcancelbuttons" notext="ã„ã„ãˆ" yestext="ã¯ã„"/>
- </notification>
- <notification name="WLDeletePresetAlert">
- 「 [SKY] ã€ã‚’削除ã—ã¾ã™ã‹ï¼Ÿ
- <usetemplate name="okcancelbuttons" notext="ã„ã„ãˆ" yestext="ã¯ã„"/>
- </notification>
- <notification name="WLNoEditDefault">
- デフォルトã®è¨­å®šã‚’編集ã—ãŸã‚Šå‰Šé™¤ã—ãŸã‚Šã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。
- </notification>
- <notification name="WLMissingSky">
- ã“ã®ãƒ‡ã‚¤ã‚µã‚¤ã‚¯ãƒ«ã®ãƒ•ã‚¡ã‚¤ãƒ«ã¯æ¬¡ã®å­˜åœ¨ã—ãªã„「空ã€ãƒ•ァイルをå‚ç…§ã—ã¦ã„ã¾ã™ï¼š [SKY]。
- </notification>
- <notification name="PPSaveEffectAlert">
- ãƒã‚¹ãƒˆãƒ—ロセス効果ãŒå­˜åœ¨ã—ã¾ã™ã€‚ 上書ãã—ã¾ã™ã‹ï¼Ÿ
- <usetemplate name="okcancelbuttons" notext="ã„ã„ãˆ" yestext="ã¯ã„"/>
- </notification>
- <notification name="NewSkyPreset">
- æ–°ã—ã„空ã®åå‰ã‚’指定ã—ã¦ãã ã•ã„。
- <form name="form">
- <input name="message">
- æ–°ã—ã„事å‰è¨­å®š
- </input>
- <button name="OK" text="OK"/>
- <button name="Cancel" text="キャンセル"/>
- </form>
- </notification>
- <notification name="ExistsSkyPresetAlert">
- 事å‰è¨­å®šãŒã™ã§ã«å­˜åœ¨ã—ã¾ã™ï¼
- </notification>
- <notification name="NewWaterPreset">
- æ–°ã—ã„æ°´ã®äº‹å‰è¨­å®šã®åå‰ã‚’指定ã—ã¦ãã ã•ã„。
- <form name="form">
- <input name="message">
- æ–°ã—ã„事å‰è¨­å®š
- </input>
- <button name="OK" text="OK"/>
- <button name="Cancel" text="キャンセル"/>
- </form>
- </notification>
- <notification name="ExistsWaterPresetAlert">
- 事å‰è¨­å®šãŒã™ã§ã«å­˜åœ¨ã—ã¾ã™ï¼
- </notification>
- <notification name="WaterNoEditDefault">
- デフォルトã®è¨­å®šã‚’編集ã—ãŸã‚Šå‰Šé™¤ã—ãŸã‚Šã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。
- </notification>
- <notification name="ChatterBoxSessionStartError">
- [RECIPIENT] ã¨æ–°ã—ã„ãƒãƒ£ãƒƒãƒˆã‚’é–‹å§‹ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。
-[REASON]
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="ChatterBoxSessionEventError">
- [EVENT]
-[REASON]
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="ForceCloseChatterBoxSession">
- [NAME] ã¨ã®ãƒãƒ£ãƒƒãƒˆã‚»ãƒƒã‚·ãƒ§ãƒ³ã‚’é–‰ã˜ã¾ã™ã€‚
-[REASON]
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="Cannot_Purchase_an_Attachment">
- オブジェクトãŒå–り付ã‘られã¦ã„ã‚‹ã¾ã¾ã§ã¯è³¼å…¥ã§ãã¾ã›ã‚“。
- </notification>
- <notification label="引ã出ã—許å¯ã®ãƒªã‚¯ã‚¨ã‚¹ãƒˆã«ã¤ã„ã¦" name="DebitPermissionDetails">
- ã“ã®ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’許å¯ã™ã‚‹ã¨ã€ã‚¹ã‚¯ãƒªãƒ—トã§ã‚ãªãŸã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã‹ã‚‰ãƒªãƒ³ãƒ‡ãƒ³ãƒ‰ãƒ«ã‚’引ã出ã›ã‚‹ã‚ˆã†ã«ãªã‚Šã¾ã™ã€‚
-ã“ã®è¨±å¯ã‚’å–り消ã™ã«ã¯ã€ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã®æ‰€æœ‰è€…ãŒã‚ªãƒ–ジェクトを削除ã™ã‚‹ã‹ã€ã‚ªãƒ–ジェクトã®ã‚¹ã‚¯ãƒªãƒ—トをリセットã—ãªã‘れã°ãªã‚Šã¾ã›ã‚“。
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="AutoWearNewClothing">
- 作æˆã™ã‚‹è¡£é¡žã‚’自動的ã«è£…ç€ã—ã¾ã™ã‹ï¼Ÿ
- <usetemplate ignoretext="「容姿ã€ã‚’編集中ã«ã€ä½œæˆã™ã‚‹è¡£é¡žã‚’装ç€ã™ã‚‹ã¨ã" name="okcancelignore" notext="ã„ã„ãˆ" yestext="ã¯ã„"/>
- </notification>
- <notification name="NotAgeVerified">
- 年齢確èªã‚’済ã¾ã›ã¦ã„ãªã„ã¨ã“ã®åŒºç”»ã‚’訪れるã“ã¨ãŒã§ãã¾ã›ã‚“。 [SECOND_LIFE] サイトã§å¹´é½¢ã®ç¢ºèªã‚’行ã„ã¾ã™ã‹ï¼Ÿ
-
-[_URL]
- <url name="url" option="0">
- https://secondlife.com/account/verification.php?lang=ja
- </url>
- <usetemplate ignoretext="å¹´é½¢ã®ç¢ºèªã‚’済ã¾ã›ã¦ã„ãªã„ã¨ã" name="okcancelignore" notext="ã„ã„ãˆ" yestext="ã¯ã„"/>
- </notification>
- <notification name="Cannot enter parcel: no payment info on file">
- 支払情報ãŒç™»éŒ²ã•れã¦ã„ãªã„ã¨ã“ã®ã‚¨ãƒªã‚¢ã‚’訪れるã“ã¨ãŒã§ãã¾ã›ã‚“。 [SECOND_LIFE] サイトã§ç™»éŒ²ã‚’行ã„ã¾ã™ã‹ï¼Ÿ
-
-[_URL]
- <url name="url" option="0">
- https://secondlife.com/account/index.php?lang=ja
- </url>
- <usetemplate ignoretext="支払情報ãŒç™»éŒ²ã•れã¦ã„ãªã„ã¨ã" name="okcancelignore" notext="ã„ã„ãˆ" yestext="ã¯ã„"/>
- </notification>
- <notification name="MissingString">
- 文字列 [STRING_NAME] ㌠strings.xml ã«å«ã¾ã‚Œã¦ã„ã¾ã›ã‚“。
- </notification>
- <notification name="SystemMessageTip">
- [MESSAGE]
- </notification>
- <notification name="IMSystemMessageTip">
- [MESSAGE]
- </notification>
- <notification name="Cancelled">
- å–り消ã•れã¾ã—ãŸã€‚
- </notification>
- <notification name="CancelledSit">
- 座るã®ã‚’ã‚„ã‚ã¾ã—ãŸã€‚
- </notification>
- <notification name="CancelledAttach">
- 添付ãŒå–り消ã•れã¾ã—ãŸã€‚
- </notification>
- <notification name="ReplacedMissingWearable">
- 欠è½ã—ã¦ã„る衣類や身体部ä½ã‚’デフォルトã«ç½®ãæ›ãˆã¾ã™ã€‚
- </notification>
- <notification name="GroupNotice">
- ä»¶å: [SUBJECT]ã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ï¼š [MESSAGE]
- </notification>
- <notification name="FriendOnline">
- [NAME] ã¯ã‚ªãƒ³ãƒ©ã‚¤ãƒ³ä¸­ã§ã™
- </notification>
- <notification name="FriendOffline">
- [NAME] ã¯ã‚ªãƒ•ライン中ã§ã™
- </notification>
- <notification name="AddSelfFriend">
- 残念ãªãŒã‚‰è‡ªåˆ†è‡ªèº«ã‚’フレンド登録ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。
- </notification>
- <notification name="UploadingAuctionSnapshot">
- インワールド㨠Web サイトã®ã‚¹ãƒŠãƒƒãƒ—ショットをアップロード中ã§ã™...
-ï¼ˆæ‰€è¦æ™‚間:約 5 分)
- </notification>
- <notification name="UploadPayment">
- アップロード㫠L$ [AMOUNT] 支払ã„ã¾ã—ãŸã€‚
- </notification>
- <notification name="UploadWebSnapshotDone">
- Web サイトã®ã‚¹ãƒŠãƒƒãƒ—ショットãŒã‚¢ãƒƒãƒ—ロードã•れã¾ã—ãŸã€‚
- </notification>
- <notification name="UploadSnapshotDone">
- インワールドã§ã®ã‚¹ãƒŠãƒƒãƒ—ショットã®ã‚¢ãƒƒãƒ—ロードãŒå®Œäº†ã—ã¾ã—ãŸã€‚
- </notification>
- <notification name="TerrainDownloaded">
- raw 地形ãŒãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ã•れã¾ã—ãŸ
- </notification>
- <notification name="GestureMissing">
- ジェスãƒãƒ£ãƒ¼ã® [NAME] ãŒãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã«è¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。
- </notification>
- <notification name="UnableToLoadGesture">
- [NAME] ã¨ã„ã†ã‚¸ã‚§ã‚¹ãƒãƒ£ãƒ¼ã‚’読ã¿è¾¼ã‚€ã“ã¨ãŒã§ãã¾ã›ã‚“ã§ã—ãŸã€‚
- </notification>
- <notification name="LandmarkMissing">
- データベースã«ãƒ©ãƒ³ãƒ‰ãƒžãƒ¼ã‚¯ãŒã‚りã¾ã›ã‚“。
- </notification>
- <notification name="UnableToLoadLandmark">
- ランドマークを読ã¿è¾¼ã‚ã¾ã›ã‚“。 ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。
- </notification>
- <notification name="CapsKeyOn">
- CapsLock ã‚­ãƒ¼ãŒæœ‰åйã«ãªã£ã¦ã„ã¾ã™ã€‚
-パスワードã«å½±éŸ¿ã™ã‚‹ã‹ã‚‚ã—れã¾ã›ã‚“。
- </notification>
- <notification name="NotecardMissing">
- ノートカードãŒãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã«ã‚りã¾ã›ã‚“。
- </notification>
- <notification name="NotecardNoPermissions">
- ã“ã®ãƒŽãƒ¼ãƒˆã‚«ãƒ¼ãƒ‰ã‚’見る権é™ãŒã‚りã¾ã›ã‚“。
- </notification>
- <notification name="RezItemNoPermissions">
- オブジェクトを Rez ã™ã‚‹ã«ã¯æ¨©é™ãŒä¸è¶³ã—ã¦ã„ã¾ã™ã€‚
- </notification>
- <notification name="UnableToLoadNotecard">
- ノートカードを読ã¿è¾¼ã‚ã¾ã›ã‚“。ã‚ã¨ã§å†åº¦ãŠè©¦ã—ãã ã•ã„。
- </notification>
- <notification name="ScriptMissing">
- データベースã«ã‚¹ã‚¯ãƒªãƒ—トãŒã‚りã¾ã›ã‚“。
- </notification>
- <notification name="ScriptNoPermissions">
- スクリプトを閲覧ã™ã‚‹ã«ã¯æ¨©é™ãŒä¸å分ã§ã™ã€‚
- </notification>
- <notification name="UnableToLoadScript">
- スクリプトをロードã§ãã¾ã›ã‚“。 ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。
- </notification>
- <notification name="IncompleteInventory">
- ã‚ãªãŸã®æä¾›ã™ã‚‹ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã¯ã€ãƒ­ãƒ¼ã‚«ãƒ«ã§ã¯ã¾ã å…¨éƒ¨æƒã£ã¦ã„ã¾ã›ã‚“。
-ã—ã°ã‚‰ãã—ã¦ã‹ã‚‰ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。
- </notification>
- <notification name="CannotModifyProtectedCategories">
- ä¿è­·ã•れãŸã‚«ãƒ†ã‚´ãƒªã¯ä¿®æ­£ã§ãã¾ã›ã‚“。
- </notification>
- <notification name="CannotRemoveProtectedCategories">
- ä¿è­·ã•れãŸã‚«ãƒ†ã‚´ãƒªã¯å‰Šé™¤ã§ãã¾ã›ã‚“。
- </notification>
- <notification name="UnableToBuyWhileDownloading">
- オブジェクトデータã®ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ä¸­ã¯è³¼å…¥ã§ãã¾ã›ã‚“。
-ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。
- </notification>
- <notification name="UnableToLinkWhileDownloading">
- オブジェクトデータã®ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ä¸­ã¯ãƒªãƒ³ã‚¯ã§ãã¾ã›ã‚“。
-ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。
- </notification>
- <notification name="CannotBuyObjectsFromDifferentOwners">
- オブジェクトã¯ä¸€åº¦ã«ä¸€äººã®æ‰€æœ‰è€…ã‹ã‚‰è³¼å…¥ã§ãã¾ã™ã€‚
-オブジェクトを 1 ã¤ã ã‘é¸ã‚“ã§ãã ã•ã„。
- </notification>
- <notification name="ObjectNotForSale">
- ã“ã®ã‚ªãƒ–ジェクトã¯è²©å£²å¯¾è±¡ã§ã¯ã‚りã¾ã›ã‚“。
- </notification>
- <notification name="EnteringGodMode">
- レベル [LEVEL] ã®ã‚´ãƒƒãƒ‰ãƒ¢ãƒ¼ãƒ‰ã«å…¥ã‚Šã¾ã™
- </notification>
- <notification name="LeavingGodMode">
- レベル [LEVEL] ã®ã‚´ãƒƒãƒ‰ãƒ¢ãƒ¼ãƒ‰ã‚’解除ã—ã¾ã™
- </notification>
- <notification name="CopyFailed">
- ã“れをコピーã™ã‚‹æ¨©é™ãŒã‚りã¾ã›ã‚“。
- </notification>
- <notification name="InventoryAccepted">
- [NAME] ã¯ã€ã‚ãªãŸãŒæ¸¡ã—ãŸã‚¢ã‚¤ãƒ†ãƒ ã‚’å—ã‘å–りã¾ã—ãŸã€‚
- </notification>
- <notification name="InventoryDeclined">
- [NAME] ã¯ã€æŒã¡ç‰©ã®æä¾›ã‚’断りã¾ã—ãŸã€‚
- </notification>
- <notification name="ObjectMessage">
- [NAME]: [MESSAGE]
- </notification>
- <notification name="CallingCardAccepted">
- コーリングカードãŒå—ç†ã•れã¾ã—ãŸã€‚
- </notification>
- <notification name="CallingCardDeclined">
- ã‚³ãƒ¼ãƒªãƒ³ã‚°ã‚«ãƒ¼ãƒ‰ãŒæ‹’å¦ã•れã¾ã—ãŸã€‚
- </notification>
- <notification name="TeleportToLandmark">
- ç”»é¢å³ã®ã€Œå ´æ‰€ã€ãƒ‘ãƒãƒ«ã‚’é–‹ã„ã¦ã€ã€Œãƒ©ãƒ³ãƒ‰ãƒžãƒ¼ã‚¯ã€ã‚¿ãƒ–ã‚’é¸ã¶ã¨ã€[NAME] ã¨ã„ã£ãŸå ´æ‰€ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã§ãã¾ã™ã€‚
-好ããªãƒ©ãƒ³ãƒ‰ãƒžãƒ¼ã‚¯ã‚’クリックã—ã¦é¸ã³ã€æ¬¡ã«ãƒ‘ãƒãƒ«ä¸‹ã®ã€Œãƒ†ãƒ¬ãƒãƒ¼ãƒˆã€ã‚’クリックã—ã¾ã™ã€‚
-(ランドマークをダブルクリックã€ã¾ãŸã¯å³ã‚¯ãƒªãƒƒã‚¯ã—ã¦ã€Œãƒ†ãƒ¬ãƒãƒ¼ãƒˆã€ã‚’é¸ã‚“ã§ã‚‚åŒã˜ã§ã™ã€‚)
- </notification>
- <notification name="TeleportToPerson">
- ç”»é¢å³ã®ã€Œäººã€ãƒ‘ãƒãƒ«ã‚’é–‹ã„ã¦ã€[NAME] ã¨ã„ã£ãŸä½äººã«é€£çµ¡ã‚’å–ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚
-リストã‹ã‚‰ä½äººã‚’é¸æŠžã—ã¦ã€ãƒ‘ãƒãƒ«ä¸‹ã®ã€ŒIMã€ã‚’クリックã—ã¾ã™ã€‚
-(リストã®åå‰ã‚’ダブルクリックã€ã¾ãŸã¯å³ã‚¯ãƒªãƒƒã‚¯ã—ã¦ã€ŒIMã€ã‚’é¸ã‚“ã§ã‚‚åŒã˜ã§ã™ã€‚)
- </notification>
- <notification name="CantSelectLandFromMultipleRegions">
- サーãƒãƒ¼ã®å¢ƒç•Œã‚’è¶Šãˆã¦åœŸåœ°ã‚’é¸æŠžã™ã‚‹ã“ã¨ã§ãã¾ã›ã‚“。
-ã‚‚ã£ã¨å°ã•ãªåœŸåœ°ã‚’é¸æŠžã—ã¦ãã ã•ã„。
- </notification>
- <notification name="SearchWordBanned">
- ã‚³ãƒŸãƒ¥ãƒ‹ãƒ†ã‚£ã‚¹ã‚¿ãƒ³ãƒ€ãƒ¼ãƒ‰ã«æ˜Žè¨˜ã•れã¦ã„るコンテンツ制é™ã«ã‚ˆã‚Šã€ã‚ãªãŸã®æ¤œç´¢èªžã®ä¸€éƒ¨ãŒé™¤å¤–ã•れã¾ã—ãŸã€‚
- </notification>
- <notification name="NoContentToSearch">
- å°‘ãªãã¨ã‚‚ã©ã‚Œã‹ä¸€ã¤ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã®ç¨®é¡žã‚’é¸æŠžã—ã¦æ¤œç´¢ã‚’行ã£ã¦ãã ã•ã„。(Generalã€Moderateã€Adult)
- </notification>
- <notification name="SystemMessage">
- [MESSAGE]
- </notification>
- <notification name="PaymentReceived">
- [MESSAGE]
- </notification>
- <notification name="PaymentSent">
- [MESSAGE]
- </notification>
- <notification name="EventNotification">
- イベント通知:
-
-[NAME]
-[DATE]
- <form name="form">
- <button name="Details" text="詳細"/>
- <button name="Cancel" text="å–り消ã—"/>
- </form>
- </notification>
- <notification name="TransferObjectsHighlighted">
- ã“ã®åŒºç”»ã®è³¼å…¥è€…ã«å—ã‘æ¸¡ã•れるオブジェクトã¯ã€ã™ã¹ã¦åŒºç”»ä¸Šã§å¼·èª¿è¡¨ç¤ºã•れã¦ã„ã¾ã™ã€‚
-
-
-*å—ã‘æ¸¡ã•れる樹木やæ¤ç‰©ã¯ã€å¼·èª¿è¡¨ç¤ºã•れã¦ã„ã¾ã›ã‚“。
- <form name="form">
- <button name="Done" text="完了"/>
- </form>
- </notification>
- <notification name="DeactivatedGesturesTrigger">
- åŒã˜ãƒˆãƒªã‚¬ãƒ¼ã§ã‚¢ã‚¯ãƒ†ã‚£ãƒ–ã«ã—ãªã„ジェスãƒãƒ£ãƒ¼ï¼š
-[NAMES]
- </notification>
- <notification name="NoQuickTime">
- Apple ã® QuickTime ソフトウェアãŒãŠä½¿ã„ã®ã‚·ã‚¹ãƒ†ãƒ ã«ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•れã¦ã„ãªã„よã†ã§ã™ã€‚
-ストリーミングメディアをサãƒãƒ¼ãƒˆã™ã‚‹åŒºç”»ã§è¦‹ãŸã„å ´åˆã¯ã€[http://www.apple.com/jp/quicktime QuickTime サイト] ã‹ã‚‰ QuickTime プレイヤーをインストールã—ã¦ãã ã•ã„。
- </notification>
- <notification name="NoPlugin">
- 「 [MIME_TYPE] ã€ã® MIME タイプを扱ã†ãƒ¡ãƒ‡ã‚£ã‚¢ãƒ—ラグインãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚ ã“ã®ã‚¿ã‚¤ãƒ—ã®ãƒ¡ãƒ‡ã‚£ã‚¢ã¯ã”利用ã„ãŸã ã‘ã¾ã›ã‚“。
- </notification>
- <notification name="MediaPluginFailed">
- 次ã®ãƒ¡ãƒ‡ã‚£ã‚¢ãƒ—ラグインãŒå®Ÿè¡Œã§ãã¾ã›ã‚“ã§ã—ãŸï¼š
- [PLUGIN]
-
-プラグインをインストールã—ãªãŠã™ã‹ã€å•題ãŒè§£æ±ºã—ãªã„å ´åˆã¯ãƒ¡ãƒ¼ã‚«ãƒ¼ã«ãŠå•ã„åˆã‚ã›ãã ã•ã„。
- <form name="form">
- <ignore name="ignore" text="メディアプラグインã®å®Ÿè¡Œã«å¤±æ•—ã—ãŸã¨ã"/>
- </form>
- </notification>
- <notification name="OwnedObjectsReturned">
- é¸æŠžã—ãŸåœŸåœ°ã®åŒºç”»ä¸Šã«ã‚ã£ãŸã‚ãªãŸã®ã‚ªãƒ–ジェクトã¯ã€ã™ã¹ã¦ã‚ãªãŸã®ã€ŒæŒã¡ç‰©ã€ã«è¿”å´ã•れã¾ã—ãŸã€‚
- </notification>
- <notification name="OtherObjectsReturned">
- [NAME] ãŒæ‰€æœ‰ã™ã‚‹ã€é¸æŠžã—ãŸåŒºç”»ã«ã‚るオブジェクトã¯ã€æ‰€æœ‰è€…ã®æŒã¡ç‰©ã«è¿”å´ã•れã¾ã—ãŸã€‚
- </notification>
- <notification name="OtherObjectsReturned2">
- 「 [NAME] ã€ã¨ã„ã†åå‰ã®ä½äººãŒæ‰€æœ‰ã™ã‚‹ã€é¸æŠžã—ãŸåŒºç”»ä¸Šã®ã‚ªãƒ–ジェクトã¯ã€æœ¬äººã«è¿”å´ã•れã¾ã—ãŸã€‚
- </notification>
- <notification name="GroupObjectsReturned">
- é¸æŠžã—ãŸåŒºç”»ä¸Šã®ã€[GROUPNAME] ã¨ã„ã†ã‚°ãƒ«ãƒ¼ãƒ—ã¨å…±æœ‰ã—ã¦ã„ãŸã‚ªãƒ–ジェクトã¯ã€ãれãžã‚Œã®æ‰€æœ‰è€…ã®ã€ŒæŒã¡ç‰©ã€ã«è¿”å´ã•れã¾ã—ãŸã€‚
-譲渡ã•れã¦ã„ãŸã€Œå†è²©ãƒ»ãƒ—レゼントå¯ã€ã®ã‚ªãƒ–ジェクトã¯ã€ä»¥å‰ã®æ‰€æœ‰è€…ã«è¿”å´ã•れã¾ã—ãŸã€‚
-グループã«è­²æ¸¡ã•れã¦ã„ãŸã€Œå†è²©ãƒ»ãƒ—レゼントä¸å¯ã€ã®ã‚ªãƒ–ジェクトã¯ã€å‰Šé™¤ã•れã¾ã—ãŸã€‚
- </notification>
- <notification name="UnOwnedObjectsReturned">
- é¸æŠžã—ãŸåœŸåœ°ã®åŒºç”»ä¸Šã®ã€ã‚ãªãŸã®æ‰€æœ‰ç‰©ã§ã¯ã€Œãªã‹ã£ãŸã€ã‚ªãƒ–ジェクトã¯ã€æœ¬æ¥ã®æ‰€æœ‰è€…ã«è¿”å´ã•れã¾ã—ãŸã€‚
- </notification>
- <notification name="ServerObjectMessage">
- [NAME] ã‹ã‚‰ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ï¼š
-&lt;nolink&gt;[MSG]&lt;/nolink&gt;
- </notification>
- <notification name="NotSafe">
- ã“ã®åœŸåœ°ã§ã¯ãƒ€ãƒ¡ãƒ¼ã‚¸ãŒæœ‰åйã§ã™ã€‚
-ケガをã™ã‚‹ã‹ã‚‚ã—れã¾ã›ã‚“。 死んã§ã—ã¾ã£ãŸå ´åˆã¯ã€Œãƒ›ãƒ¼ãƒ ã€ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã•れã¾ã™ã€‚
- </notification>
- <notification name="NoFly">
- ã“ã®ã‚¨ãƒªã‚¢ã§ã¯é£›è¡ŒãŒç¦æ­¢ã•れã¦ã„ã¾ã™ã€‚
-ã“ã“ã§ã¯é£›ã¹ã¾ã›ã‚“。
- </notification>
- <notification name="PushRestricted">
- ã“ã®ã‚¨ãƒªã‚¢ã§ã¯ãƒ—ッシュãŒç¦æ­¢ã•れã¦ã„ã¾ã™ã€‚ 土地所有者以外ã¯ä»–人をプッシュã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。
- </notification>
- <notification name="NoVoice">
- ã“ã®ã‚¨ãƒªã‚¢ã§ã¯ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆãŒç„¡åйã§ã™ã€‚ 誰ã‹ãŒè©±ã—ã¦ã„ã‚‹ã®ã‚’èžãã“ã¨ã¯ã§ãã¾ã›ã‚“。
- </notification>
- <notification name="NoBuild">
- ã“ã®ã‚¨ãƒªã‚¢ã§ã¯åˆ¶ä½œãŒç¦æ­¢ã•れã¦ã„ã¾ã™ã€‚ オブジェクトを制作ã—ãŸã‚Š Rez ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。
- </notification>
- <notification name="ScriptsStopped">
- 管ç†è€…ãŒã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã®ã‚¹ã‚¯ãƒªãƒ—ãƒˆã‚’ä¸€æ™‚åœæ­¢ã—ã¾ã—ãŸã€‚
- </notification>
- <notification name="ScriptsNotRunning">
- ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã§ã¯ã‚¹ã‚¯ãƒªãƒ—トã®ä½¿ç”¨ãŒç¦æ­¢ã•れã¦ã„ã¾ã™ã€‚
- </notification>
- <notification name="NoOutsideScripts">
- ã“ã®åœŸåœ°ã§ã¯ã€å¤–部ã®ã‚¹ã‚¯ãƒªãƒ—トãŒç¦æ­¢ã•れã¦ã„ã¾ã™ã€‚
-
-土地所有者ã®ã‚‚ã®ä»¥å¤–ã¯ã‚¹ã‚¯ãƒªãƒ—トãŒå®Ÿè¡Œã•れã¾ã›ã‚“。
- </notification>
- <notification name="ClaimPublicLand">
- ãã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã«ã„ãªã„ã¨å…¬å…±ã®åœŸåœ°ã‚’å–å¾—ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。
- </notification>
- <notification name="RegionTPAccessBlocked">
- ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ã«ã‚ˆã‚Šãã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã¸ã¯å…¥ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。 年齢確èªã‚’行ã†ã‹ã€æœ€æ–°ãƒ“ューワをインストールã—ã¦ãã ã•ã„。
-
-ç¾åœ¨ã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ã§ã‚¢ã‚¯ã‚»ã‚¹å¯èƒ½ãªã‚¨ãƒªã‚¢ã«é–¢ã™ã‚‹è©³ç´°ã¯ãƒŠãƒ¬ãƒƒã‚¸ãƒ™ãƒ¼ã‚¹ã‚’å‚ç…§ã—ã¦ãã ã•ã„。
- </notification>
- <notification name="URBannedFromRegion">
- ã‚ãªãŸã¯ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã¸ã®ç«‹å…¥ãŒç¦æ­¢ã•れã¦ã„ã¾ã™ã€‚
- </notification>
- <notification name="NoTeenGridAccess">
- ã‚ãªãŸã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã§ã¯ãƒ†ã‚£ãƒ¼ãƒ³ã‚°ãƒªãƒƒãƒ‰ã«æŽ¥ç¶šã§ãã¾ã›ã‚“。
- </notification>
- <notification name="ImproperPaymentStatus">
- ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã«å…¥ã‚‹ãŸã‚ã«é©ã—ãŸæ”¯æ‰•ã„ステータスãŒã‚りã¾ã›ã‚“。
- </notification>
- <notification name="MustGetAgeRgion">
- ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã«å…¥ã‚‹ãŸã‚ã«ã¯ã€å¹´é½¢ç¢ºèªã‚’済ã¾ã›ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚
- </notification>
- <notification name="MustGetAgeParcel">
- ã“ã®åŒºç”»ã«å…¥ã‚‹ãŸã‚ã«ã¯ã€å¹´é½¢ç¢ºèªã‚’済ã¾ã›ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚
- </notification>
- <notification name="NoDestRegion">
- 目的地ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚
- </notification>
- <notification name="NotAllowedInDest">
- 目的地ã«å…¥ã‚‹è¨±å¯ãŒã‚りã¾ã›ã‚“。
- </notification>
- <notification name="RegionParcelBan">
- ç«‹å…¥ç¦æ­¢ã•れãŸåŒºç”»ã‚’横断ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 åˆ¥ã®æ–¹æ³•ã‚’ãŠè©¦ã—ãã ã•ã„。
- </notification>
- <notification name="TelehubRedirect">
- テレãƒãƒ–ã«è»¢é€ã•れã¾ã—ãŸã€‚
- </notification>
- <notification name="CouldntTPCloser">
- ã“れ以上目的地ã«è¿‘ã„場所ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆãŒã§ãã¾ã›ã‚“ã§ã—ãŸã€‚
- </notification>
- <notification name="TPCancelled">
- テレãƒãƒ¼ãƒˆãŒã‚­ãƒ£ãƒ³ã‚»ãƒ«ã•れã¾ã—ãŸã€‚
- </notification>
- <notification name="FullRegionTryAgain">
- å…¥ã‚ã†ã¨ã—ã¦ã„るリージョンã¯ç¾åœ¨æº€å“¡ã§ã™ã€‚
-ã—ã°ã‚‰ãã—ã¦ã‹ã‚‰å†åº¦ãŠè©¦ã—ãã ã•ã„。
- </notification>
- <notification name="GeneralFailure">
- よãã‚る失敗
- </notification>
- <notification name="RoutedWrongRegion">
- ç•°ãªã‚‹ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã«è¿‚回ã•れã¾ã—ãŸã€‚ ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。
- </notification>
- <notification name="NoValidAgentID">
- エージェント ID ãŒç„¡åйã§ã™ã€‚
- </notification>
- <notification name="NoValidSession">
- セッション ID ãŒç„¡åйã§ã™ã€‚
- </notification>
- <notification name="NoValidCircuit">
- 回路コードãŒç„¡åйã§ã™ã€‚
- </notification>
- <notification name="NoValidTimestamp">
- タイムスタンプãŒç„¡åйã§ã™ã€‚
- </notification>
- <notification name="NoPendingConnection">
- 接続を生æˆã§ãã¾ã›ã‚“。
- </notification>
- <notification name="InternalUsherError">
- 内部エラーãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚
- </notification>
- <notification name="NoGoodTPDestination">
- ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã§ã¯ã€é©åˆ‡ãªãƒ†ãƒ¬ãƒãƒ¼ãƒˆç›®çš„地ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚
- </notification>
- <notification name="InternalErrorRegionResolver">
- 内部エラーãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚
- </notification>
- <notification name="NoValidLanding">
- 有効ãªç€åœ°ç‚¹ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚
- </notification>
- <notification name="NoValidParcel">
- 有効ãªåŒºç”»ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚
- </notification>
- <notification name="ObjectGiveItem">
- [NAME_SLURL] ãŒæ‰€æœ‰ã™ã‚‹ &lt;nolink&gt;[OBJECTFROMNAME]&lt;/nolink&gt; ã¨ã„ã†åå‰ã®ã‚ªãƒ–ジェクトãŒã€ã‚ãªãŸã« &lt;nolink&gt;[ITEM_SLURL]&lt;/nolink&gt; を渡ãã†ã¨ã—ã¦ã„ã¾ã™ã€‚ã“ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’使ã†ã«ã¯ã‚¢ãƒ‰ãƒãƒ³ã‚¹ãƒ¢ãƒ¼ãƒ‰ã¸ã®åˆ‡ã‚Šæ›¿ãˆãŒå¿…è¦ã§ã™ã€‚アドãƒãƒ³ã‚¹ãƒ¢ãƒ¼ãƒ‰ã§ãƒ­ã‚°ã‚¤ãƒ³ã—ãªãŠã™ã¨ã€ã‚ãªãŸã®æŒã¡ç‰©ã«ã“ã®ã‚¢ã‚¤ãƒ†ãƒ ãŒè¦‹ã¤ã‹ã‚Šã¾ã™ã€‚アドãƒãƒ³ã‚¹ãƒ¢ãƒ¼ãƒ‰ã«åˆ‡ã‚Šæ›¿ãˆã‚‹ã«ã¯ã€ã“ã®ã‚¢ãƒ—リケーションを終了ã—ã¦å†èµ·å‹•ã—ã€ãƒ­ã‚°ã‚¤ãƒ³ç”»é¢ã§ãƒ¢ãƒ¼ãƒ‰è¨­å®šã‚’変更ã—ã¦ãã ã•ã„。
- <form name="form">
- <button name="Keep" text="アイテムをå—ã‘å–ã‚‹"/>
- <button name="Discard" text="アイテムを拒å¦ã™ã‚‹"/>
- <button name="Mute" text="オブジェクトをブロックã™ã‚‹"/>
- </form>
- </notification>
- <notification name="UserGiveItem">
- [NAME_SLURL] 㯠[ITEM_SLURL] を渡ãã†ã¨ã—ã¦ã„ã¾ã™ã€‚ã“ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’使ã†ã«ã¯ã‚¢ãƒ‰ãƒãƒ³ã‚¹ãƒ¢ãƒ¼ãƒ‰ã¸ã®åˆ‡ã‚Šæ›¿ãˆãŒå¿…è¦ã§ã™ã€‚アドãƒãƒ³ã‚¹ãƒ¢ãƒ¼ãƒ‰ã§ãƒ­ã‚°ã‚¤ãƒ³ã—ãªãŠã™ã¨ã€ã‚ãªãŸã®æŒã¡ç‰©ã«ã“ã®ã‚¢ã‚¤ãƒ†ãƒ ãŒè¦‹ã¤ã‹ã‚Šã¾ã™ã€‚アドãƒãƒ³ã‚¹ãƒ¢ãƒ¼ãƒ‰ã«åˆ‡ã‚Šæ›¿ãˆã‚‹ã«ã¯ã€ã“ã®ã‚¢ãƒ—リケーションを終了ã—ã¦å†èµ·å‹•ã—ã€ãƒ­ã‚°ã‚¤ãƒ³ç”»é¢ã§ãƒ¢ãƒ¼ãƒ‰è¨­å®šã‚’変更ã—ã¦ãã ã•ã„。
- <form name="form">
- <button name="Show" text="アイテムをå—ã‘å–ã‚‹"/>
- <button name="Discard" text="アイテムを拒å¦ã™ã‚‹"/>
- <button name="Mute" text="ユーザーをブロックã™ã‚‹"/>
- </form>
- </notification>
- <notification name="GodMessage">
- [NAME]
-
-[MESSAGE]
- </notification>
- <notification name="JoinGroup">
- [MESSAGE]
- <form name="form">
- <button name="Join" text="å‚加"/>
- <button name="Decline" text="辞退"/>
- <button name="Info" text="情報"/>
- </form>
- </notification>
- <notification name="TeleportOffered">
- [NAME_SLURL] ã¯ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã§ã‚ãªãŸã‚’呼んã§ã„ã¾ã™ã€‚
-
-[MESSAGE] - [MATURITY_STR] &lt;icon&gt;[MATURITY_ICON]&lt;/icon&gt;
- <form name="form">
- <button name="Teleport" text="テレãƒãƒ¼ãƒˆ"/>
- <button name="Cancel" text="å–り消ã—"/>
- </form>
- </notification>
- <notification name="TeleportOfferSent">
- [TO_NAME] ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã‚’é€ã‚Šã¾ã—ãŸã€‚
- </notification>
- <notification name="GotoURL">
- [MESSAGE]
-[URL]
- <form name="form">
- <button name="Later" text="ã‚ã¨ã§"/>
- <button name="GoNow..." text="今ã™ã行ã"/>
- </form>
- </notification>
- <notification name="OfferFriendship">
- [NAME_SLURL] ã¯ãƒ•レンド登録を申ã—込んã§ã„ã¾ã™ã€‚
-
-[MESSAGE]
-
-(デフォルト設定ã ã¨ãŠäº’ã„ã®ã‚ªãƒ³ãƒ©ã‚¤ãƒ³çŠ¶æ…‹ã‚’è¦‹ã‚‹ã“ã¨ãŒã§ãã¾ã™ï¼‰
- <form name="form">
- <button name="Accept" text="å—ã‘入れる"/>
- <button name="Decline" text="辞退"/>
- </form>
- </notification>
- <notification name="FriendshipOffered">
- [TO_NAME] ã«ãƒ•レンド登録を申ã—出ã¾ã—ãŸã€‚
- </notification>
- <notification name="OfferFriendshipNoMessage">
- [NAME_SLURL] ã¯ãƒ•レンド登録を申ã—込んã§ã„ã¾ã™ã€‚
-
-(デフォルト設定ã ã¨ãŠäº’ã„ã®ã‚ªãƒ³ãƒ©ã‚¤ãƒ³çŠ¶æ…‹ã‚’è¦‹ã‚‹ã“ã¨ãŒã§ãã¾ã™ï¼‰
- <form name="form">
- <button name="Accept" text="å—ã‘入れる"/>
- <button name="Decline" text="æ‹’å¦"/>
- </form>
- </notification>
- <notification name="FriendshipAccepted">
- [NAME]ã¯ã€ãƒ•レンド登録をå—ã‘入れã¾ã—ãŸã€‚
- </notification>
- <notification name="FriendshipDeclined">
- [NAME]ã¯ã€ãƒ•レンド登録を断りã¾ã—ãŸã€‚
- </notification>
- <notification name="FriendshipAcceptedByMe">
- フレンドã®ç™»éŒ²ä¾é ¼ãŒæ‰¿èªã•れã¾ã—ãŸã€‚
- </notification>
- <notification name="FriendshipDeclinedByMe">
- フレンドã®ç™»éŒ²ä¾é ¼ãŒæ‹’å¦ã•れã¾ã—ãŸã€‚
- </notification>
- <notification name="OfferCallingCard">
- [NAME] ãŒã‚³ãƒ¼ãƒªãƒ³ã‚°ã‚«ãƒ¼ãƒ‰ã‚’渡ãã†ã¨ã—ã¦ã„ã¾ã™ã€‚
-ã‚ãªãŸã®æŒã¡ç‰©ã«ãƒ–ックマークãŒè¿½åŠ ã•れã€ã“ã®ä½äººã«ç´ æ—©ã IM ã‚’é€ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚
- <form name="form">
- <button name="Accept" text="å—ã‘入れる"/>
- <button name="Decline" text="辞退"/>
- </form>
- </notification>
- <notification name="RegionRestartMinutes">
- ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã¯ [SECONDS] 分後ã«å†èµ·å‹•ã•れã¾ã™ã€‚
-ã“ã®ã¾ã¾ã“ã“ã«ã„ã‚‹ã¨ãƒ­ã‚°ã‚¢ã‚¦ãƒˆã•れã¾ã™ã€‚
- </notification>
- <notification name="RegionRestartSeconds">
- ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã¯ [SECONDS] 秒後ã«å†èµ·å‹•ã•れã¾ã™ã€‚.
-ã“ã®ã¾ã¾ã“ã“ã«ã„ã‚‹ã¨ãƒ­ã‚°ã‚¢ã‚¦ãƒˆã•れã¾ã™ã€‚
- </notification>
- <notification name="LoadWebPage">
- Web ページ [URL] をロードã—ã¾ã™ã‹ï¼Ÿ
-
-[MESSAGE]
-
-é€ä¿¡å…ƒã®ã‚ªãƒ–ジェクト:&lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;ã€æ‰€æœ‰è€…:[NAME]?
- <form name="form">
- <button name="Gotopage" text="ページã«ç§»å‹•"/>
- <button name="Cancel" text="å–り消ã—"/>
- </form>
- </notification>
- <notification name="FailedToFindWearableUnnamed">
- データベース㫠[TYPE] ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸ
- </notification>
- <notification name="FailedToFindWearable">
- データベース㫠[DESC] ã¨ã„ã†åå‰ã® [TYPE] ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚
- </notification>
- <notification name="InvalidWearable">
- ç€ç”¨ã—よã†ã¨ã—ã¦ã„るアイテムã¯ã‚ãªãŸã®ãƒ“ューワã§ã¯èª­ã¿è¾¼ã‚€ã“ã¨ãŒã§ãã¾ã›ã‚“。 [APP_NAME] ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’アップグレードã—ã¦ã‹ã‚‰ã“ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’ç€ç”¨ã—ã¦ãã ã•ã„。
- </notification>
- <notification name="ScriptQuestion">
- [NAME] ãŒæ‰€æœ‰ã™ã‚‹ã€Œ&lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;〠ã¨ã„ã†ã‚ªãƒ–ジェクトãŒã€æ¬¡ã®ã“ã¨ã‚’ã—よã†ã¨ã—ã¦ã„ã¾ã™ï¼š
-
-[QUESTIONS]
-よã‚ã—ã„ã§ã™ã‹ï¼Ÿ
- <form name="form">
- <button name="Yes" text="ã¯ã„"/>
- <button name="No" text="ã„ã„ãˆ"/>
- <button name="Mute" text="ブロック"/>
- </form>
- </notification>
- <notification name="ScriptQuestionCaution">
- [NAME] ãŒæ‰€æœ‰ã™ã‚‹ã€Œ&lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;〠ã¨ã„ã†ã‚ªãƒ–ジェクトãŒã€æ¬¡ã®ã“ã¨ã‚’ã—よã†ã¨ã—ã¦ã„ã¾ã™ï¼š
-
-[QUESTIONS]
-ã“ã®ã‚ªãƒ–ジェクトや制作者を信用ã§ããªã„å ´åˆã¯ã€ã“ã®ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’æ‹’å¦ã—ã¦ãã ã•ã„。
-
-リクエストをå—ã‘ã¾ã™ã‹ï¼Ÿ
- <form name="form">
- <button name="Grant" text="許å¯"/>
- <button name="Deny" text="æ‹’å¦"/>
- <button name="Details" text="詳細..."/>
- </form>
- </notification>
- <notification name="ScriptDialog">
- [NAME] ã®ã€Œ&lt;nolink&gt;[TITLE]&lt;/nolink&gt;ã€
-[MESSAGE]
- <form name="form">
- <button name="Ignore" text="無視ã™ã‚‹"/>
- </form>
- </notification>
- <notification name="ScriptDialogGroup">
- [GROUPNAME] ã®ã€Œ&lt;nolink&gt;[TITLE]&lt;/nolink&gt;ã€
-[MESSAGE]
- <form name="form">
- <button name="Ignore" text="無視ã™ã‚‹"/>
- </form>
- </notification>
- <notification name="BuyLindenDollarSuccess">
- ãŠæ”¯æ‰•ã‚りãŒã¨ã†ã”ã–ã„ã¾ã™ã€‚
-
-ã‚ãªãŸã® L$ 残高ã¯ã€å‡¦ç†ãŒå®Œäº†ã™ã‚‹ã¨ã‚¢ãƒƒãƒ—デートã•れã¾ã™ã€‚ 処ç†ã« 20 分以上ã‹ã‹ã£ãŸå ´åˆã€ãŠå–り引ããŒã‚­ãƒ£ãƒ³ã‚»ãƒ«ã•れるã“ã¨ãŒã‚りã¾ã™ã€‚ ãã®å ´åˆã¯ã€è³¼å…¥é‡‘é¡ã¯ã‚ãªãŸã® US$ 残高ã«è¿½åŠ ã•れã¾ã™ã€‚
-
-[http://secondlife.com/account/ マイアカウント] ã®å–引履歴ページã§ã€æ”¯æ‰•状æ³ã‚’確èªã§ãã¾ã™ã€‚
- </notification>
- <notification name="FirstOverrideKeys">
- ã‚ãªãŸã®ç§»å‹•ã‚­ãƒ¼ã‚’ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆãŒæ“作ã—ã¦ã„ã¾ã™ã€‚
-矢å°ã‹ AWSD ã®ã‚­ãƒ¼ã§å‹•作を確èªã—ã¦ãã ã•ã„。
-銃ãªã©ã®ã‚ªãƒ–ジェクトã ã¨ã€ä¸€äººç§°è¦–点ã«å¤‰æ›´ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚
-M キーを押ã—ã¦å¤‰æ›´ã—ã¾ã™ã€‚
- </notification>
- <notification name="FirstSandbox">
- ã“ã“ã¯ã‚µãƒ³ãƒ‰ãƒœãƒƒã‚¯ã‚¹ã‚¨ãƒªã‚¢ã§ã™ã€‚ä½äººãŒåˆ¶ä½œã‚’å­¦ã¶ã“ã¨ãŒã§ãã¾ã™ã€‚
-
-ã“ã“ã§åˆ¶ä½œã•れãŸã‚‚ã®ã¯æ™‚é–“ãŒçµŒã¤ã¨å‰Šé™¤ã•れã¾ã™ã€‚制作ã—ãŸã‚¢ã‚¤ãƒ†ãƒ ã‚’å³ã‚¯ãƒªãƒƒã‚¯ã—ã¦ã€Œå–ã‚‹ã€ã‚’é¸ã³ã€æŒã¡ç‰©ã«å…¥ã‚Œã¦ãŠæŒã¡å¸°ã‚Šã™ã‚‹ã®ã‚’ãŠå¿˜ã‚Œãªã。
- </notification>
- <notification name="MaxListSelectMessage">
- ã“ã®ãƒªã‚¹ãƒˆã‹ã‚‰ [MAX_SELECT] 個ã¾ã§ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’é¸æŠžã§ãã¾ã™ã€‚
- </notification>
- <notification name="VoiceInviteP2P">
- [NAME] ãŒã‚ãªãŸã‚’ボイスãƒãƒ£ãƒƒãƒˆã‚³ãƒ¼ãƒ«ã«æ‹›å¾…ã—ã¦ã„ã¾ã™ã€‚
-å—ã‘入れるをクリックã™ã‚‹ã‹ã€æ–­ã‚‹å ´åˆã¯æ‹’å¦ã‚’クリックã—ã¦ãã ã•ã„。 ブロックをクリックã™ã‚‹ã¨ã€ã“ã®ç™ºä¿¡è€…をブロックã—ã¾ã™ã€‚
- <form name="form">
- <button name="Accept" text="å—ã‘入れる"/>
- <button name="Decline" text="æ‹’å¦"/>
- <button name="Mute" text="ブロック"/>
- </form>
- </notification>
- <notification name="AutoUnmuteByIM">
- [NAME] ã¯ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ãƒˆãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’å—ã‘å–りã€è‡ªå‹•çš„ã«ãƒ–ロックãŒè§£é™¤ã•れã¾ã—ãŸã€‚
- </notification>
- <notification name="AutoUnmuteByMoney">
- [NAME] ã¯ãŠé‡‘ã‚’å—ã‘å–りã€è‡ªå‹•çš„ã«ãƒ–ロックãŒè§£é™¤ã•れã¾ã—ãŸã€‚
- </notification>
- <notification name="AutoUnmuteByInventory">
- [NAME] ã¯æŒã¡ç‰©ã‚’å—ã‘å–りã€è‡ªå‹•çš„ã«ãƒ–ロックãŒè§£é™¤ã•れã¾ã—ãŸã€‚
- </notification>
- <notification name="VoiceInviteGroup">
- [NAME] 㯠[GROUP] ã®ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆã‚³ãƒ¼ãƒ«ã«å‚加ã—ã¾ã—ãŸã€‚
-å—ã‘入れるをクリックã™ã‚‹ã‹ã€æ–­ã‚‹å ´åˆã¯æ‹’å¦ã‚’クリックã—ã¦ãã ã•ã„。 ブロックをクリックã™ã‚‹ã¨ã€ã“ã®ç™ºä¿¡è€…をブロックã—ã¾ã™ã€‚
- <form name="form">
- <button name="Accept" text="å—ã‘入れる"/>
- <button name="Decline" text="æ‹’å¦"/>
- <button name="Mute" text="ブロック"/>
- </form>
- </notification>
- <notification name="VoiceInviteAdHoc">
- [NAME] 㯠コンファレンスãƒãƒ£ãƒƒãƒˆã®ã®ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆã‚³ãƒ¼ãƒ«ã«å‚加ã—ã¾ã—ãŸã€‚
-å—ã‘入れるをクリックã™ã‚‹ã‹ã€æ–­ã‚‹å ´åˆã¯æ‹’å¦ã‚’クリックã—ã¦ãã ã•ã„。 ブロックをクリックã™ã‚‹ã¨ã€ã“ã®ç™ºä¿¡è€…をブロックã—ã¾ã™ã€‚
- <form name="form">
- <button name="Accept" text="å—ã‘入れる"/>
- <button name="Decline" text="æ‹’å¦"/>
- <button name="Mute" text="ブロック"/>
- </form>
- </notification>
- <notification name="InviteAdHoc">
- [NAME] ãŒã‚ãªãŸã‚’コンファレンスãƒãƒ£ãƒƒãƒˆã«æ‹›å¾…ã—ã¦ã„ã¾ã™ã€‚
-å—ã‘入れるをクリックã™ã‚‹ã‹ã€æ–­ã‚‹å ´åˆã¯æ‹’å¦ã‚’クリックã—ã¦ãã ã•ã„。 ブロックをクリックã™ã‚‹ã¨ã€ã“ã®ç™ºä¿¡è€…をブロックã—ã¾ã™ã€‚
- <form name="form">
- <button name="Accept" text="å—ã‘入れる"/>
- <button name="Decline" text="æ‹’å¦"/>
- <button name="Mute" text="ブロック"/>
- </form>
- </notification>
- <notification name="VoiceChannelFull">
- ã‚ãªãŸãŒå‚加ã—よã†ã¨ã—ã¦ã„るボイスコール [VOICE_CHANNEL_NAME] ã¯ã€å‚åŠ è€…ãŒæœ€å¤§é™ã«é”ã—ã¾ã—ãŸã€‚後ã§ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。
- </notification>
- <notification name="ProximalVoiceChannelFull">
- ã“ã®ã‚¨ãƒªã‚¢ã®ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆã¯ã€æ··é›‘ã®ãŸã‚容é‡ã‚’è¶…ãˆã¦ã—ã¾ã£ã¦ã„ã¾ã™ã€‚申ã—訳ã‚りã¾ã›ã‚“ãŒã€ä»–ã®ã‚¨ãƒªã‚¢ã§ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆã‚’ãŠè©¦ã—ãã ã•ã„。
- </notification>
- <notification name="VoiceChannelDisconnected">
- [VOICE_CHANNEL_NAME] ã¸ã®æŽ¥ç¶šãŒåˆ‡ã‚Œã¾ã—ãŸã€‚ 「近ãã®ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆã€ã«å†æŽ¥ç¶šã•れã¾ã™ã€‚
- </notification>
- <notification name="VoiceChannelDisconnectedP2P">
- [VOICE_CHANNEL_NAME] ãŒã‚³ãƒ¼ãƒ«ã‚’終了ã—ã¾ã—ãŸã€‚ 「近ãã®ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆã€ã«å†æŽ¥ç¶šã•れã¾ã™ã€‚
- </notification>
- <notification name="P2PCallDeclined">
- [VOICE_CHANNEL_NAME] ãŒã‚ãªãŸã®ã‚³ãƒ¼ãƒ«ã‚’æ‹’å¦ã—ã¾ã—ãŸã€‚ 「近ãã®ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆã€ã«å†æŽ¥ç¶šã•れã¾ã™ã€‚
- </notification>
- <notification name="P2PCallNoAnswer">
- [VOICE_CHANNEL_NAME] ã¯ã‚ãªãŸã®ã‚³ãƒ¼ãƒ«ã‚’å—ã‘ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。 「近ãã®ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆã€ã«å†æŽ¥ç¶šã•れã¾ã™ã€‚
- </notification>
- <notification name="VoiceChannelJoinFailed">
- [VOICE_CHANNEL_NAME] ã¸ã®æŽ¥ç¶šã«å¤±æ•—ã—ã¾ã—ãŸã€‚ã‚ã¨ã§å†åº¦ãŠè©¦ã—ãã ã•ã„。 「近ãã®ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆã€ã«å†æŽ¥ç¶šã•れã¾ã™ã€‚
- </notification>
- <notification name="VoiceLoginRetry">
- ボイスãƒãƒ£ãƒ³ãƒãƒ«ã‚’作æˆã—ã¦ã„ã¾ã™ã€‚1 分ã»ã©ã‹ã‹ã‚Šã¾ã™ã€‚
- </notification>
- <notification name="VoiceEffectsExpired">
- ボイスモーフィング効果ã®1ã¤ã¾ãŸã¯è¤‡æ•°ã®æœ‰åŠ¹æœŸé™ãŒçµ‚了ã—ã¾ã—ãŸã€‚期é™ã‚’延長・更新ã™ã‚‹ã«ã¯[[URL]ã“ã¡ã‚‰ã‚’クリック]ã—ã¦ãã ã•ã„。
- </notification>
- <notification name="VoiceEffectsExpiredInUse">
- ãƒœã‚¤ã‚¹ãƒ¢ãƒ¼ãƒ•ã‚£ãƒ³ã‚°åŠ¹æžœã®æœ‰åŠ¹æœŸé™ãŒçµ‚了ã—ãŸãŸã‚ã€ã‚ãªãŸã®é€šå¸¸ã®ãƒœã‚¤ã‚¹è¨­å®šãŒé©ç”¨ã•れã¾ã—ãŸã€‚期é™ã‚’延長・更新ã™ã‚‹ã«ã¯[[URL]ã“ã¡ã‚‰ã‚’クリック]ã—ã¦ãã ã•ã„。
- </notification>
- <notification name="VoiceEffectsWillExpire">
- ボイスモーフィング効果ã®1ã¤ã¾ãŸã¯è¤‡æ•°ã®æœ‰åŠ¹æœŸé™ãŒ[INTERVAL]日以内ã«çµ‚了ã—ã¾ã™ã€‚期é™ã‚’延長・更新ã™ã‚‹ã«ã¯[[URL]ã“ã¡ã‚‰ã‚’クリック]ã—ã¦ãã ã•ã„。
- </notification>
- <notification name="VoiceEffectsNew">
- æ–°ã—ã„ボイスモーフィング効果ãŒç™»å ´ï¼
- </notification>
- <notification name="Cannot enter parcel: not a group member">
- 特定ã®ã‚°ãƒ«ãƒ¼ãƒ—メンãƒãƒ¼ã®ã¿ã“ã®ã‚¨ãƒªã‚¢ã‚’訪å•ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚
- </notification>
- <notification name="Cannot enter parcel: banned">
- ç«‹å…¥ç¦æ­¢ã•れã¦ã„ã‚‹ãŸã‚ã€åŒºç”»ã«å…¥ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。
- </notification>
- <notification name="Cannot enter parcel: not on access list">
- アクセスリストã«å«ã¾ã‚Œã¦ã„ãªã„ãŸã‚ã€åŒºç”»ã«å…¥ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。
- </notification>
- <notification name="VoiceNotAllowed">
- ã‚ãªãŸã«ã¯ [VOICE_CHANNEL_NAME] ã®ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆã«æŽ¥ç¶šã™ã‚‹æ¨©é™ãŒã‚りã¾ã›ã‚“。
- </notification>
- <notification name="VoiceCallGenericError">
- [VOICE_CHANNEL_NAME] ã®ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆã«æŽ¥ç¶šä¸­ã«ã€ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚後ã§ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。
- </notification>
- <notification name="UnsupportedCommandSLURL">
- クリックã—㟠SLurl ã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“。
- </notification>
- <notification name="BlockedSLURL">
- 信用ã§ããªã„ブラウザã‹ã‚‰ SLurl ãŒé€ã‚‰ã‚Œã¦ããŸã®ã§ã€ã‚»ã‚­ãƒ¥ãƒªãƒ†ã‚£ã®ãŸã‚ブロックã•れã¾ã—ãŸã€‚
- </notification>
- <notification name="ThrottledSLURL">
- 短期間ã®ã‚ã„ã ã«ã€ä¿¡ç”¨ã§ããªã„ブラウザã‹ã‚‰è¤‡æ•°ã® SLurls ãŒé€ã‚‰ã‚Œã¦ãã¾ã—ãŸã€‚
-安全ã®ãŸã‚ã«æ•°ç§’間ブロックã•れã¾ã™ã€‚
- </notification>
- <notification name="IMToast">
- [MESSAGE]
- <form name="form">
- <button name="respondbutton" text="返答"/>
- </form>
- </notification>
- <notification name="ConfirmCloseAll">
- ã™ã¹ã¦ã® IM ã‚’é–‰ã˜ã¾ã™ã‹ï¼Ÿ
- <usetemplate ignoretext="ã™ã¹ã¦ã® IM ã‚’é–‰ã˜ã‚‹å‰ã®ç¢ºèª" name="okcancelignore" notext="キャンセル" yestext="OK"/>
- </notification>
- <notification name="AttachmentSaved">
- アタッãƒãƒ¡ãƒ³ãƒˆãŒä¿å­˜ã•れã¾ã—ãŸã€‚
- </notification>
- <notification name="UnableToFindHelpTopic">
- ヘルプトピックãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚
- </notification>
- <notification name="ObjectMediaFailure">
- サーãƒãƒ¼ã‚¨ãƒ©ãƒ¼ï¼š メディアã®ã‚¢ãƒƒãƒ—デートã¾ãŸã¯å¤±æ•—。
-「[ERROR]ã€
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="TextChatIsMutedByModerator">
- モデレーターãŒã‚ãªãŸã®æ–‡å­—ãƒãƒ£ãƒƒãƒˆã‚’ミュートã—ã¾ã—ãŸã€‚
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="VoiceIsMutedByModerator">
- モデレーターãŒã‚ãªãŸã®ãƒœã‚¤ã‚¹ã‚’ミュートã—ã¾ã—ãŸã€‚
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="ConfirmClearTeleportHistory">
- テレãƒãƒ¼ãƒˆå±¥æ­´ã‚’削除ã—ã¾ã™ã‹ï¼Ÿ
- <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
- </notification>
- <notification name="BottomTrayButtonCanNotBeShown">
- é¸æŠžã—ãŸãƒœã‚¿ãƒ³ã‚’ç¾åœ¨è¡¨ç¤ºã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。
-ã˜ã‚…ã†ã¶ã‚“ãªã‚¹ãƒšãƒ¼ã‚¹ãŒã§ãれã°ãƒœã‚¿ãƒ³ã¯è¡¨ç¤ºã•れã¾ã™ã€‚
- </notification>
- <notification name="ShareNotification">
- 共有ã™ã‚‹ä½äººã‚’é¸æŠžã—ã¾ã™ã€‚
- </notification>
- <notification name="ShareItemsConfirmation">
- 次ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’共有ã—ã¾ã™ã‹ï¼Ÿ
-
-&lt;nolink&gt;[ITEMS]&lt;/nolink&gt;
-
-次ã®ä½äººã¨å…±æœ‰ã—ã¾ã™ã‹ï¼Ÿ
-
-[RESIDENTS]
- <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
- </notification>
- <notification name="ItemsShared">
- アイテムãŒå…±æœ‰ã•れã¾ã—ãŸã€‚
- </notification>
- <notification name="DeedToGroupFail">
- グループã¸ã®è­²æ¸¡ã«å¤±æ•—ã—ã¾ã—ãŸã€‚
- </notification>
- <notification name="AvatarRezNotification">
- (作æˆå¾Œ[EXISTENCE]秒経éŽï¼‰
-&apos;[NAME]&apos;ã¨ã„ã†ã‚¢ãƒã‚¿ãƒ¼ã¯[TIME]秒後ã«å§¿ã‚’ç¾ã‚ã—ã¾ã—ãŸã€‚
- </notification>
- <notification name="AvatarRezSelfBakedDoneNotification">
- (作æˆå¾Œ[EXISTENCE]秒経éŽï¼‰
-アウトフィットã®ãƒ™ãƒ¼ã‚¯ã¯[TIME]秒後ã«å®Œäº†ã—ã¾ã—ãŸã€‚
- </notification>
- <notification name="AvatarRezSelfBakedUpdateNotification">
- (作æˆå¾Œ[EXISTENCE]秒経éŽï¼‰
-å®¹å§¿ã®æ›´æ–°ã¯[TIME]秒後ã«é€ä¿¡ã•れã¾ã—ãŸã€‚
-[STATUS]
- </notification>
- <notification name="AvatarRezCloudNotification">
- ( [EXISTENCE] 秒)
-ã‚¢ãƒã‚¿ãƒ¼ã€Œ NAME ã€ãŒã‚¯ãƒ©ã‚¦ãƒ‰ã«ãªã‚Šã¾ã—ãŸã€‚
- </notification>
- <notification name="AvatarRezArrivedNotification">
- ( [EXISTENCE] 秒)
-ã‚¢ãƒã‚¿ãƒ¼ã€Œ NAME ã€ãŒç¾ã‚Œã¾ã—ãŸã€‚
- </notification>
- <notification name="AvatarRezLeftCloudNotification">
- ( [EXISTENCE] 秒)
-ã‚¢ãƒã‚¿ãƒ¼ã€Œ [NAME] ã€ãŒ [TIME] ç§’ã§ã‚¯ãƒ©ã‚¦ãƒ‰çŠ¶æ…‹ã‹ã‚‰å‡ºç¾ã—ã¾ã™ã€‚
- </notification>
- <notification name="AvatarRezEnteredAppearanceNotification">
- ( [EXISTENCE] 秒)
-ã‚¢ãƒã‚¿ãƒ¼ã€Œ NAME ã€ãŒå®¹å§¿ç·¨é›†ãƒ¢ãƒ¼ãƒ‰ã«å…¥ã‚Šã¾ã—ãŸã€‚
- </notification>
- <notification name="AvatarRezLeftAppearanceNotification">
- ( [EXISTENCE] 秒)
-ã‚¢ãƒã‚¿ãƒ¼ã€Œ NAME ã€ãŒå®¹å§¿ç·¨é›†ãƒ¢ãƒ¼ãƒ‰ã‚’解除ã—ã¾ã—ãŸã€‚
- </notification>
- <notification name="NoConnect">
- [PROTOCOL] [HOSTID]を使ã£ã¦æŽ¥ç¶šã§ãã¾ã›ã‚“。
-ãŠä½¿ã„ã®ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚„ファイアウォールã®è¨­å®šã‚’確èªã—ã¦ãã ã•ã„。
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="NoVoiceConnect">
- ボイスサーãƒãƒ¼ã«æŽ¥ç¶šã§ãã¾ã›ã‚“:
-
-[HOSTID]
-
-ボイスãƒãƒ£ãƒƒãƒˆã«ã‚ˆã‚‹ã‚³ãƒŸãƒ¥ãƒ‹ã‚±ãƒ¼ã‚·ãƒ§ãƒ³ãŒåˆ©ç”¨ã§ãã¾ã›ã‚“。
-ãŠä½¿ã„ã®ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚„ファイアウォールã®è¨­å®šã‚’確èªã—ã¦ãã ã•ã„。
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="AvatarRezLeftNotification">
- ( [EXISTENCE] 秒)
-ã‚¢ãƒã‚¿ãƒ¼ã€Œ NAME ã€ãŒå®Œå…¨ã«èª­ã¿è¾¼ã¾ã‚Œã¾ã—ãŸã€‚
- </notification>
- <notification name="AvatarRezSelfBakedTextureUploadNotification">
- ( 作æˆå¾Œ[EXISTENCE]秒経éŽï¼‰
-&apos;[BODYREGION]&apos;ã®[RESOLUTION]ã®ãƒ™ãƒ¼ã‚¯ãƒ‰ãƒ†ã‚¯ã‚¹ãƒãƒ£ã¯[TIME]秒後ã«ã‚¢ãƒƒãƒ—ロードã•れã¾ã—ãŸã€‚
- </notification>
- <notification name="AvatarRezSelfBakedTextureUpdateNotification">
- ( 作æˆå¾Œ[EXISTENCE]秒経éŽï¼‰
-&apos;[BODYREGION]&apos;ã®[RESOLUTION]ã®ãƒ™ãƒ¼ã‚¯ãƒ‰ãƒ†ã‚¯ã‚¹ãƒãƒ£ã¯[TIME]秒後ã«ãƒ­ãƒ¼ã‚«ãƒ«ã«æ›´æ–°ã•れã¾ã—ãŸã€‚
- </notification>
- <notification name="ConfirmLeaveCall">
- ã“ã®ã‚³ãƒ¼ãƒ«ã‹ã‚‰æŠœã‘ã¾ã™ã‹ï¼Ÿ
- <usetemplate ignoretext="コールã‹ã‚‰æŠœã‘ã‚‹å‰ã®ç¢ºèª" name="okcancelignore" notext="ã„ã„ãˆ" yestext="ã¯ã„"/>
- </notification>
- <notification name="ConfirmMuteAll">
- グループコールã®å‚加者全員をミュートã—ã¾ã—ãŸã€‚
-ã‚ã¨ã‹ã‚‰ã“ã®ã‚³ãƒ¼ãƒ«ã«å‚加ã™ã‚‹ä½äººã‚‚
-ミュートã•れã¾ã™ã€‚ã‚ãªãŸãŒã‚³ãƒ¼ãƒ«ã‚’終了ã—ã¦ã‚‚ä»–ã®å‚加者ã®ãƒŸãƒ¥ãƒ¼ãƒˆçŠ¶æ…‹ãŒç¶šãã¾ã™ã€‚
-
-全員をミュートã—ã¾ã™ã‹ï¼Ÿ
- <usetemplate ignoretext="グループコールã®å‚加者全員をミュートã™ã‚‹å‰ã®ç¢ºèª" name="okcancelignore" notext="å–り消ã—" yestext="OK"/>
- </notification>
- <notification label="ãƒãƒ£ãƒƒãƒˆ" name="HintChat">
- ãƒãƒ£ãƒƒãƒˆã«å‚加ã™ã‚‹ã«ã¯ã€ç”»é¢ä¸‹ã®ãƒãƒ£ãƒƒãƒˆãƒ•ィールドã«ãƒ†ã‚­ã‚¹ãƒˆã‚’入力ã—ã¾ã™ã€‚
- </notification>
- <notification label="ç«‹ã¡ä¸ŠãŒã‚‹" name="HintSit">
- 座る姿勢ã‹ã‚‰ç«‹ã¡ä¸ŠãŒã‚‹ã«ã¯ã€ã€Œç«‹ã¡ä¸ŠãŒã‚‹ã€ãƒœã‚¿ãƒ³ã‚’クリックã—ã¾ã™ã€‚
- </notification>
- <notification label="話ã™" name="HintSpeak">
- 「スピーカーã€ãƒœã‚¿ãƒ³ã‚’クリックã™ã‚‹ã¨ã€ãƒžã‚¤ã‚¯ã®ã‚ªãƒ³ãƒ»ã‚ªãƒ•ãŒåˆ‡ã‚Šæ›¿ã‚りã¾ã™ã€‚
-
-上矢å°ã‚’クリックã™ã‚‹ã¨ã€ãƒœã‚¤ã‚¹ã‚³ãƒ³ãƒˆãƒ­ãƒ¼ãƒ«ãƒ‘ãƒãƒ«ãŒè¡¨ç¤ºã•れã¾ã™ã€‚
-
-「スピーカーã€ãƒœã‚¿ãƒ³ã‚’éžè¡¨ç¤ºã«ã™ã‚‹ã¨ã€ãƒœã‚¤ã‚¹æ©Ÿèƒ½ã‚‚無効ã«ãªã‚Šã¾ã™ã€‚
- </notification>
- <notification label="世界を探検" name="HintDestinationGuide">
- 行ã先ガイドã«ã¯æ•°å¤šãã®æŽ¢ç´¢å ´æ‰€ãŒå«ã¾ã‚Œã¾ã™ã€‚ã©ã“ã‹è¡Œã先を決ã‚ãŸã‚‰ã€ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã—ã¦æŽ¢ç´¢ã«å‡ºã‹ã‘ã¾ã—ょã†ã€‚
- </notification>
- <notification label="サイドパãƒãƒ«" name="HintSidePanel">
- サイドパãƒãƒ«ã§ã‚¤ãƒ³ãƒ™ãƒ³ãƒˆãƒªã€æœã€ãƒ—ロフィールãªã©ã«ã™ã°ã‚„ãアクセスã§ãã¾ã™ã€‚
- </notification>
- <notification label="移動" name="HintMove">
- 歩行や走行ã¯ã€ã€Œç§»å‹•ã€ãƒ‘ãƒãƒ«ã‚’é–‹ãã€çŸ¢å°ã‚³ãƒ³ãƒˆãƒ­ãƒ¼ãƒ«ã«ã‚ˆã£ã¦æ“作ã—ã¾ã™ã€‚ã“ã®æ“作ã¯ã‚­ãƒ¼ãƒœãƒ¼ãƒ‰ã®çŸ¢å°ã‚­ãƒ¼ã§å®Ÿè¡Œã™ã‚‹ã“ã¨ã‚‚å¯èƒ½ã§ã™ã€‚
- </notification>
- <notification label="" name="HintMoveClick">
- 1. クリックã—ã¦æ­©è¡Œ
-地é¢ã®ä¸€ç®‡æ‰€ã‚’クリックã™ã‚‹ã¨ã€ãã®å ´æ‰€ã¾ã§æ­©ãã¾ã™ã€‚
-
-2. クリック・ドラッグã§è¦–界を回転
-世界ã®ä¸€ç®‡æ‰€ã‚’クリックã—ã¦ãƒ‰ãƒ©ãƒƒã‚°ã™ã‚‹ã¨ã€è¦–界ã®å‘ããŒå¤‰ã‚りã¾ã™ã€‚
- </notification>
- <notification label="表示å" name="HintDisplayName">
- 表示å(カスタマイズå¯èƒ½ï¼‰ã‚’設定ã—ã¾ã™ã€‚ユーザーåã¯å›ºæœ‰ã§å¤‰æ›´ã§ãã¾ã›ã‚“ãŒã€ã“ã“ã§è¿½åŠ ã™ã‚‹è¡¨ç¤ºåã¯å¤‰æ›´å¯èƒ½ã§ã™ã€‚ä»–ã®ä½äººã®åå‰ã®è¡¨ç¤ºæ–¹æ³•ã¯ç’°å¢ƒè¨­å®šã§å¤‰æ›´ã—ã¦ãã ã•ã„。
- </notification>
- <notification label="表示" name="HintView">
- カメラã®è¦–点を変更ã™ã‚‹ã«ã¯ã€æ°´å¹³ãƒ»åž‚直コントロールを使ã„ã¾ã™ã€‚Escape を押ã™ã‹ã€ã¾ãŸã¯æ­©è¡Œã™ã‚‹ã¨ã€è¦–点ãŒãƒªã‚»ãƒƒãƒˆã•れã¾ã™ã€‚
- </notification>
- <notification label="インベントリ" name="HintInventory">
- æŒã¡ç‰©ã«ã¯ã‚ãªãŸã®ã‚¢ã‚¤ãƒ†ãƒ ãŒã™ã¹ã¦å«ã¾ã‚Œã¾ã™ã€‚æ–°ã—ã追加ã•れãŸã‚¢ã‚¤ãƒ†ãƒ ã¯ã€Œæœ€æ–°ã€ã‚¿ãƒ–ã«ä¸€è¦§è¡¨ç¤ºã•れã¦ã„ã¾ã™ã€‚
- </notification>
- <notification label="ã‚ãªãŸã®ãƒªãƒ³ãƒ‡ãƒ³ãƒ‰ãƒ«" name="HintLindenDollar">
- ã“れãŒã‚ãªãŸã® L$ 残高ã§ã™ã€‚リンデンドルを購入ã™ã‚‹ã«ã¯ã€ŒL$ ã®è³¼å…¥ã€ã‚’クリックã—ã¾ã™ã€‚
- </notification>
- <notification name="PopupAttempt">
- ãƒãƒƒãƒ—アップãŒãƒ–ロックã•れã¾ã—ãŸã€‚
- <form name="form">
- <ignore name="ignore" text="å…¨ã¦ã®ãƒãƒƒãƒ—アップを有効ã«ã™ã‚‹"/>
- <button name="open" text="ãƒãƒƒãƒ—アップウィンドウを開ã"/>
- </form>
- </notification>
- <notification name="AuthRequest">
- 「[REALM]ã€ã«ã‚る「&lt;nolink&gt;[HOST_NAME]&lt;/nolink&gt;ã€ã®ã‚µã‚¤ãƒˆã«ã¯ãƒ¦ãƒ¼ã‚¶ãƒ¼åã¨ãƒ‘スワードãŒå¿…è¦ã§ã™ã€‚
- <form name="form">
- <input name="username" text="ユーザーå"/>
- <input name="password" text="パスワード"/>
- <button name="ok" text="é€ä¿¡"/>
- <button name="cancel" text="å–り消ã—"/>
- </form>
- </notification>
- <notification label="" name="ModeChange">
- モードを変更ã™ã‚‹ã«ã¯çµ‚了ã—ã¦å†èµ·å‹•ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚
- <usetemplate name="okcancelbuttons" notext="終了ã—ãªã„" yestext="終了"/>
- </notification>
- <notification label="" name="NoClassifieds">
- クラシファイド広告ã®ä½œæˆã¨ç·¨é›†ã¯ã‚¢ãƒ‰ãƒãƒ³ã‚¹ãƒ¢ãƒ¼ãƒ‰ã§ã®ã¿åˆ©ç”¨ã§ãã¾ã™ã€‚終了ã—ã¦ãƒ¢ãƒ¼ãƒ‰ã‚’変更ã—ã¾ã™ã‹ï¼Ÿãƒ¢ãƒ¼ãƒ‰ã¯ãƒ­ã‚°ã‚¤ãƒ³ç”»é¢ã§é¸æŠžã§ãã¾ã™ã€‚
- <usetemplate name="okcancelbuttons" notext="終了ã—ãªã„" yestext="終了"/>
- </notification>
- <notification label="" name="NoGroupInfo">
- グループã®ä½œæˆã¨ç·¨é›†ã¯ã‚¢ãƒ‰ãƒãƒ³ã‚¹ãƒ¢ãƒ¼ãƒ‰ã§ã®ã¿åˆ©ç”¨ã§ãã¾ã™ã€‚終了ã—ã¦ãƒ¢ãƒ¼ãƒ‰ã‚’変更ã—ã¾ã™ã‹ï¼Ÿãƒ¢ãƒ¼ãƒ‰ã¯ãƒ­ã‚°ã‚¤ãƒ³ç”»é¢ã§é¸æŠžã§ãã¾ã™ã€‚
- <usetemplate name="okcancelbuttons" notext="終了ã—ãªã„" yestext="終了"/>
- </notification>
- <notification label="" name="NoPicks">
- ピックã®ä½œæˆã¨ç·¨é›†ã¯ã‚¢ãƒ‰ãƒãƒ³ã‚¹ãƒ¢ãƒ¼ãƒ‰ã§ã®ã¿åˆ©ç”¨ã§ãã¾ã™ã€‚終了ã—ã¦ãƒ¢ãƒ¼ãƒ‰ã‚’変更ã—ã¾ã™ã‹ï¼Ÿãƒ¢ãƒ¼ãƒ‰ã¯ãƒ­ã‚°ã‚¤ãƒ³ç”»é¢ã§é¸æŠžã§ãã¾ã™ã€‚
- <usetemplate name="okcancelbuttons" notext="終了ã—ãªã„" yestext="終了"/>
- </notification>
- <notification label="" name="NoWorldMap">
- 世界地図ã®è¡¨ç¤ºã¯ã‚¢ãƒ‰ãƒãƒ³ã‚¹ãƒ¢ãƒ¼ãƒ‰ã§ã®ã¿åˆ©ç”¨ã§ãã¾ã™ã€‚終了ã—ã¦ãƒ¢ãƒ¼ãƒ‰ã‚’変更ã—ã¾ã™ã‹ï¼Ÿãƒ¢ãƒ¼ãƒ‰ã¯ãƒ­ã‚°ã‚¤ãƒ³ç”»é¢ã§é¸æŠžã§ãã¾ã™ã€‚
- <usetemplate name="okcancelbuttons" notext="終了ã—ãªã„" yestext="終了"/>
- </notification>
- <notification label="" name="NoVoiceCall">
- ボイスコールã¯ã‚¢ãƒ‰ãƒãƒ³ã‚¹ãƒ¢ãƒ¼ãƒ‰ã§ã®ã¿åˆ©ç”¨ã§ãã¾ã™ã€‚ログアウトã—ã¦ãƒ¢ãƒ¼ãƒ‰ã‚’変更ã—ã¾ã™ã‹ï¼Ÿ
- <usetemplate name="okcancelbuttons" notext="終了ã—ãªã„" yestext="終了"/>
- </notification>
- <notification label="" name="NoAvatarShare">
- 共有ã¯ã‚¢ãƒ‰ãƒãƒ³ã‚¹ãƒ¢ãƒ¼ãƒ‰ã§ã®ã¿åˆ©ç”¨ã§ãã¾ã™ã€‚ログアウトã—ã¦ãƒ¢ãƒ¼ãƒ‰ã‚’変更ã—ã¾ã™ã‹ï¼Ÿ
- <usetemplate name="okcancelbuttons" notext="終了ã—ãªã„" yestext="終了"/>
- </notification>
- <notification label="" name="NoAvatarPay">
- ä»–ã®ä½äººã¸ã®æ”¯æ‰•ã„ã¯ã‚¢ãƒ‰ãƒãƒ³ã‚¹ãƒ¢ãƒ¼ãƒ‰ã§ã®ã¿åˆ©ç”¨ã§ãã¾ã™ã€‚ログアウトã—ã¦ãƒ¢ãƒ¼ãƒ‰ã‚’変更ã—ã¾ã™ã‹ï¼Ÿ
- <usetemplate name="okcancelbuttons" notext="終了ã—ãªã„" yestext="終了"/>
- </notification>
- <global name="UnsupportedCPU">
- - ã‚ãªãŸã® CPU ã®é€Ÿåº¦ã¯å¿…é ˆå‹•ä½œç’°å¢ƒã®æ¡ä»¶ã‚’満ãŸã—ã¦ã„ã¾ã›ã‚“。
- </global>
- <global name="UnsupportedGLRequirements">
- [APP_NAME] ã«å¿…è¦ãªãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ãŒãªã„よã†ã§ã™ã€‚ [APP_NAME] ã«ã¯ãƒžãƒ«ãƒãƒ†ã‚¯ã‚¹ãƒãƒ£ã‚’サãƒãƒ¼ãƒˆã™ã‚‹ OpenGL グラフィックカードãŒå¿…è¦ã§ã™ã€‚ ãŠä½¿ã„ã®ã‚°ãƒ©ãƒ•ã‚£ãƒƒã‚¯ã‚«ãƒ¼ãƒ‰ã®æœ€æ–°ãƒ‰ãƒ©ã‚¤ãƒãŒã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•れã¦ã„ã‚‹ã‹ã©ã†ã‹ã€ã‚ªãƒšãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°ã‚·ã‚¹ãƒ†ãƒ ã®ã‚µãƒ¼ãƒ“スパックã¨ãƒ‘ッãƒãŒå…¥ã£ã¦ã„ã‚‹ã‹ã‚’ã”確èªãã ã•ã„。
-
-ã“ã®å•題ãŒä½•度も起ãã‚‹å ´åˆã¯ã€[SUPPORT_SITE] ã‚’ã”確èªãã ã•ã„。
- </global>
- <global name="UnsupportedCPUAmount">
- 796
- </global>
- <global name="UnsupportedRAMAmount">
- 510
- </global>
- <global name="UnsupportedGPU">
- - ã‚ãªãŸã®ã‚°ãƒ©ãƒ•ィックカードã¯å¿…é ˆå‹•ä½œç’°å¢ƒã®æ¡ä»¶ã‚’満ãŸã—ã¦ã„ã¾ã›ã‚“。
- </global>
- <global name="UnsupportedRAM">
- - ã‚ãªãŸã®ã‚·ã‚¹ãƒ†ãƒ ãƒ¡ãƒ¢ãƒªã¯å¿…é ˆå‹•ä½œç’°å¢ƒã®æ¡ä»¶ã‚’満ãŸã—ã¦ã„ã¾ã›ã‚“。
- </global>
- <global name="You can only set your &apos;Home Location&apos; on your land or at a mainland Infohub.">
- 自分ã®åœŸåœ°ã‚’ãŠæŒã¡ã®å ´åˆã€ã€Œãƒ›ãƒ¼ãƒ ã€ã«è¨­å®šã§ãã¾ã™ã€‚
-ãŠæŒã¡ã§ãªã„å ´åˆã¯ã€åœ°å›³ã§ã€Œã‚¤ãƒ³ãƒ•ã‚©ãƒãƒ–ã€ã‚’ãŠæŽ¢ã—ãã ã•ã„。
- </global>
- <global name="You died and have been teleported to your home location">
- 死んã§ã—ã¾ã£ãŸã®ã§ã€ãƒ›ãƒ¼ãƒ ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã•れã¾ã—ãŸã€‚
- </global>
-</notifications>
diff --git a/indra/newview/skins/minimal/xui/ja/panel_adhoc_control_panel.xml b/indra/newview/skins/minimal/xui/ja/panel_adhoc_control_panel.xml
deleted file mode 100644
index 17e1283d24..0000000000
--- a/indra/newview/skins/minimal/xui/ja/panel_adhoc_control_panel.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="panel_im_control_panel">
- <layout_stack name="vertical_stack">
- <layout_panel name="call_btn_panel">
- <button label="コール" name="call_btn"/>
- </layout_panel>
- <layout_panel name="end_call_btn_panel">
- <button label="コール終了" name="end_call_btn"/>
- </layout_panel>
- <layout_panel name="voice_ctrls_btn_panel">
- <button label="ボイスコントロール" name="voice_ctrls_btn"/>
- </layout_panel>
- </layout_stack>
-</panel>
diff --git a/indra/newview/skins/minimal/xui/ja/panel_bottomtray.xml b/indra/newview/skins/minimal/xui/ja/panel_bottomtray.xml
deleted file mode 100644
index 13be2cea0a..0000000000
--- a/indra/newview/skins/minimal/xui/ja/panel_bottomtray.xml
+++ /dev/null
@@ -1,45 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="bottom_tray">
- <string name="DragIndicationImageName" value="Accordion_ArrowOpened_Off"/>
- <string name="SpeakBtnToolTip" value="マイクã®ã‚ªãƒ³ãƒ»ã‚ªãƒ•"/>
- <string name="VoiceControlBtnToolTip" value="ボイスコントロールパãƒãƒ«ã®è¡¨ç¤ºãƒ»éžè¡¨ç¤º"/>
- <layout_stack name="toolbar_stack">
- <layout_panel name="speak_panel">
- <button label="話ã™" name="speak_btn" tool_tip="マイクã®ã‚ªãƒ³ãƒ»ã‚ªãƒ•を切り替ãˆã‚‹"/>
- </layout_panel>
- <layout_panel name="speak_flyout_panel">
- <button label="" name="flyout_btn" tool_tip="サウンド環境設定を変更ã™ã‚‹"/>
- </layout_panel>
- <layout_panel name="gesture_panel">
- <gesture_combo_list label="ジェスãƒãƒ£ãƒ¼" name="Gesture" tool_tip="ã‚¢ãƒã‚¿ãƒ¼ã®å‹•作を起ã“ã™"/>
- </layout_panel>
- <layout_panel name="cam_panel">
- <bottomtray_button label="視界" name="camera_btn" tool_tip="カメラã®è§’度をコントロール"/>
- </layout_panel>
- <layout_panel name="destinations_panel">
- <bottomtray_button label="行ãå…ˆ" name="destination_btn" tool_tip="Second Life 内を旅行ã™ã‚‹"/>
- </layout_panel>
- <layout_panel name="avatar_panel">
- <bottomtray_button label="マイ ã‚¢ãƒã‚¿ãƒ¼" name="avatar_btn" tool_tip="容姿を変更ã™ã‚‹"/>
- </layout_panel>
- <layout_panel name="people_panel">
- <bottomtray_button label="人" name="show_people_button" tool_tip="Second Life ã§äººã‚’探ã™"/>
- </layout_panel>
- <layout_panel name="profile_panel">
- <bottomtray_button label="プロフィール" name="show_profile_btn" tool_tip="プロフィールを表示・編集"/>
- </layout_panel>
- <layout_panel name="howto_panel">
- <bottomtray_button label="ãƒã‚¦ãƒ„ー" name="show_help_btn" tool_tip="Second Life ã®ãƒ˜ãƒ«ãƒ—情報を見る"/>
- </layout_panel>
- <layout_panel name="im_well_panel">
- <chiclet_im_well name="im_well">
- <button name="Unread IM messages" tool_tip="会話"/>
- </chiclet_im_well>
- </layout_panel>
- <layout_panel name="notification_well_panel">
- <chiclet_notification name="notification_well">
- <button name="Unread" tool_tip="通知"/>
- </chiclet_notification>
- </layout_panel>
- </layout_stack>
-</panel>
diff --git a/indra/newview/skins/minimal/xui/ja/panel_group_control_panel.xml b/indra/newview/skins/minimal/xui/ja/panel_group_control_panel.xml
deleted file mode 100644
index f7f575206a..0000000000
--- a/indra/newview/skins/minimal/xui/ja/panel_group_control_panel.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="panel_im_control_panel">
- <layout_stack name="vertical_stack">
- <layout_panel name="group_info_btn_panel">
- <button label="グループ情報" name="group_info_btn"/>
- </layout_panel>
- <layout_panel name="call_btn_panel">
- <button label="グループコール" name="call_btn"/>
- </layout_panel>
- <layout_panel name="end_call_btn_panel">
- <button label="コール終了" name="end_call_btn"/>
- </layout_panel>
- <layout_panel name="voice_ctrls_btn_panel">
- <button label="ボイスコントロールを開ã" name="voice_ctrls_btn"/>
- </layout_panel>
- </layout_stack>
-</panel>
diff --git a/indra/newview/skins/minimal/xui/ja/panel_im_control_panel.xml b/indra/newview/skins/minimal/xui/ja/panel_im_control_panel.xml
deleted file mode 100644
index 14c38c796f..0000000000
--- a/indra/newview/skins/minimal/xui/ja/panel_im_control_panel.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="panel_im_control_panel">
- <layout_stack name="button_stack">
- <layout_panel name="view_profile_btn_panel">
- <button label="プロフィール" name="view_profile_btn"/>
- </layout_panel>
- <layout_panel name="add_friend_btn_panel">
- <button label="フレンド登録" name="add_friend_btn"/>
- </layout_panel>
- <layout_panel name="teleport_btn_panel">
- <button label="テレãƒãƒ¼ãƒˆ" name="teleport_btn" tool_tip="ã“ã®äººã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã‚’é€ã‚Šã¾ã™"/>
- </layout_panel>
- <layout_panel name="call_btn_panel">
- <button label="コール" name="call_btn"/>
- </layout_panel>
- <layout_panel name="end_call_btn_panel">
- <button label="コール終了" name="end_call_btn"/>
- </layout_panel>
- <layout_panel name="block_btn_panel">
- <button label="ブロック" name="block_btn"/>
- </layout_panel>
- <layout_panel name="unblock_btn_panel">
- <button label="ブロック解除" name="unblock_btn"/>
- </layout_panel>
- <layout_panel name="volume_ctrl_panel">
- <slider name="volume_slider" tool_tip="コールã®éŸ³é‡" value="0.5"/>
- </layout_panel>
- </layout_stack>
-</panel>
diff --git a/indra/newview/skins/minimal/xui/ja/panel_login.xml b/indra/newview/skins/minimal/xui/ja/panel_login.xml
deleted file mode 100644
index ac1fe455c7..0000000000
--- a/indra/newview/skins/minimal/xui/ja/panel_login.xml
+++ /dev/null
@@ -1,48 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="panel_login">
- <panel.string name="create_account_url">
- http://jp.secondlife.com/registration/
- </panel.string>
- <panel.string name="forgot_password_url">
- http://secondlife.com/account/request.php?lang=ja
- </panel.string>
- <layout_stack name="login_widgets">
- <layout_panel name="login">
- <text name="username_text">
- ユーザーãƒãƒ¼ãƒ ï¼š
- </text>
- <combo_box name="username_combo" tool_tip="登録時ã«è‡ªåˆ†ã§é¸ã‚“ã ãƒ¦ãƒ¼ã‚¶ãƒ¼å(例:bobsmith12ã€Steller Sunshineãªã©ï¼‰"/>
- <text name="password_text">
- パスワード:
- </text>
- <check_box label="パスワードを記憶" name="remember_check"/>
- <button label="ログイン" left_pad="30" name="connect_btn" width="60"/>
- <text name="mode_selection_text">
- モード:
- </text>
- <combo_box name="mode_combo" tool_tip="ãƒ¢ãƒ¼ãƒ‰ã‚’é¸æŠžã—ã¾ã™ã€‚ベーシックモードã§ã¯æŽ¢ç´¢ã‚„ãƒãƒ£ãƒƒãƒˆã‚’ã™ã°ã‚„ãç°¡å˜ã«å®Ÿè¡Œã§ãã€ã‚¢ãƒ‰ãƒãƒ³ã‚¹ãƒ¢ãƒ¼ãƒ‰ã§ã¯ã€ã‚ˆã‚Šå¤šãã®æ©Ÿèƒ½ãŒåˆ©ç”¨ã§ãã¾ã™ã€‚">
- <combo_box.item label="ベーシック" name="Basic"/>
- <combo_box.item label="アドãƒãƒ³ã‚¹" name="Advanced"/>
- </combo_box>
- <text name="start_location_text">
- 開始地点:
- </text>
- <combo_box name="start_location_combo">
- <combo_box.item label="最後ã«ãƒ­ã‚°ã‚¢ã‚¦ãƒˆã—ãŸå ´æ‰€" name="MyLastLocation"/>
- <combo_box.item label="ホーム" name="MyHome"/>
- <combo_box.item label="<地域åを入力>" name="Typeregionname"/>
- </combo_box>
- </layout_panel>
- <layout_panel name="links">
- <text name="create_new_account_text">
- ãŠç”³ã—è¾¼ã¿
- </text>
- <text name="forgot_password_text">
- ユーザーåã¾ãŸã¯ãƒ‘スワードをãŠå¿˜ã‚Œã§ã™ã‹ï¼Ÿ
- </text>
- <text name="login_help">
- ãƒ­ã‚°ã‚¤ãƒ³ã®æ–¹æ³•
- </text>
- </layout_panel>
- </layout_stack>
-</panel>
diff --git a/indra/newview/skins/minimal/xui/ja/panel_navigation_bar.xml b/indra/newview/skins/minimal/xui/ja/panel_navigation_bar.xml
deleted file mode 100644
index 0426c4fe9a..0000000000
--- a/indra/newview/skins/minimal/xui/ja/panel_navigation_bar.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="navigation_bar">
- <panel name="navigation_panel">
- <pull_button name="back_btn" tool_tip="å‰ã®å ´æ‰€ã¸æˆ»ã‚Šã¾ã™"/>
- <pull_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="検索">
- <combo_editor label="[SECOND_LIFE] を検索:" name="search_combo_editor"/>
- </search_combo_box>
- </panel>
- <favorites_bar name="favorite" tool_tip="ランドマークをã“ã“ã«ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦ã€Second Lifeã®ãŠæ°—ã«å…¥ã‚Šã®å ´æ‰€ã«ç´ æ—©ãアクセスï¼">
- <label name="favorites_bar_label" tool_tip="ランドマークをã“ã“ã«ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦ã€Second Lifeã®ãŠæ°—ã«å…¥ã‚Šã®å ´æ‰€ã«ç´ æ—©ãアクセスï¼">
- ãŠæ°—ã«å…¥ã‚Šãƒãƒ¼
- </label>
- <chevron_button name="&gt;&gt;" tool_tip="ãŠæ°—ã«å…¥ã‚Šã‚’ã‚‚ã£ã¨è¡¨ç¤º"/>
- </favorites_bar>
-</panel>
diff --git a/indra/newview/skins/minimal/xui/ja/panel_people.xml b/indra/newview/skins/minimal/xui/ja/panel_people.xml
deleted file mode 100644
index 5caeebc151..0000000000
--- a/indra/newview/skins/minimal/xui/ja/panel_people.xml
+++ /dev/null
@@ -1,94 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<!-- Side tray panel -->
-<panel label="人" name="people_panel">
- <string name="no_recent_people" value="最近交æµã—ãŸäººã¯ã„ã¾ã›ã‚“。一緒ã«ä½•ã‹ã™ã‚‹ä»²é–“ã‚’ãŠæŽ¢ã—ã§ã™ã‹ï¼Ÿä¸‹ã®ã€Œè¡Œã先ガイドã€ãƒœã‚¿ãƒ³ã‚’クリックã—ã¦ãã ã•ã„。"/>
- <string name="no_filtered_recent_people" value="ãã®åå‰ã§æœ€è¿‘交æµã—ãŸäººã¯ã„ã¾ã›ã‚“。"/>
- <string name="no_one_near" value="è¿‘ãã«èª°ã‚‚ã„ã¾ã›ã‚“。一緒ã«ä½•ã‹ã™ã‚‹ä»²é–“ã‚’ãŠæŽ¢ã—ã§ã™ã‹ï¼Ÿä¸‹ã®ã€Œè¡Œã先ガイドã€ãƒœã‚¿ãƒ³ã‚’クリックã—ã¦ãã ã•ã„。"/>
- <string name="no_one_filtered_near" value="ãã®åå‰ã®äººã¯è¿‘ãã«ã„ã¾ã›ã‚“。"/>
- <string name="no_friends_online" value="オンラインã®ãƒ•レンドã¯ã„ã¾ã›ã‚“"/>
- <string name="no_friends" value="フレンドã¯ã„ã¾ã›ã‚“"/>
- <string name="no_friends_msg">
- ä½äººã‚’å³ã‚¯ãƒªãƒƒã‚¯ã™ã‚‹ã¨ã€ãƒ•レンド登録ã§ãã¾ã™ã€‚
-一緒ã«ä½•ã‹ã™ã‚‹ä»²é–“ã‚’ãŠæŽ¢ã—ã§ã™ã‹ï¼Ÿä¸‹ã®ã€Œè¡Œã先ガイドã€ãƒœã‚¿ãƒ³ã‚’クリックã—ã¦ãã ã•ã„。
- </string>
- <string name="no_filtered_friends_msg">
- ãŠæŽ¢ã—ã®ã‚‚ã®ã¯è¦‹ã¤ã‹ã‚Šã¾ã—ãŸã‹ï¼Ÿä¸‹ã®ã€Œè¡Œã先ガイドã€ãƒœã‚¿ãƒ³ã‚’クリックã—ã¦ãã ã•ã„。
- </string>
- <string name="people_filter_label" value="人をフィルター"/>
- <string name="groups_filter_label" value="グループをフィルター"/>
- <string name="no_filtered_groups_msg" value="ãŠæŽ¢ã—ã®ã‚‚ã®ã¯è¦‹ã¤ã‹ã‚Šã¾ã—ãŸã‹ï¼Ÿ [secondlife:///app/search/groups/[SEARCH_TERM] 検索] ã‚’ãŠè©¦ã—ãã ã•ã„。"/>
- <string name="no_groups_msg" value="ã‚°ãƒ«ãƒ¼ãƒ—ã‚’ãŠæŽ¢ã—ã§ã™ã‹ï¼Ÿ [secondlife:///app/search/groups 検索] ã‚’ãŠè©¦ã—ãã ã•ã„。"/>
- <string name="MiniMapToolTipMsg" value="[地域](ダブルクリックã§åœ°å›³ã‚’é–‹ã。Shiftâ€ãƒ‰ãƒ©ãƒƒã‚°ã§æ°´å¹³ãƒ»åž‚直移動)"/>
- <string name="AltMiniMapToolTipMsg" value="[地域](ダブルクリックã§ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã€‚Shiftâ€ãƒ‰ãƒ©ãƒƒã‚°ã§æ°´å¹³ãƒ»åž‚直移動)"/>
- <filter_editor label="フィルター" name="filter_input"/>
- <tab_container name="tabs">
- <panel label="è¿‘ã" name="nearby_panel">
- <panel label="bottom_panel" name="bottom_panel">
- <menu_button name="nearby_view_sort_btn" tool_tip="オプション"/>
- <button name="add_friend_btn" tool_tip="é¸æŠžã—ãŸä½äººã‚’フレンドリストã«ç™»éŒ²"/>
- </panel>
- </panel>
- <panel label="マイ フレンド" name="friends_panel">
- <accordion name="friends_accordion">
- <accordion_tab name="tab_online" title="オンライン"/>
- <accordion_tab name="tab_all" title="全員"/>
- </accordion>
- <panel label="bottom_panel" name="bottom_panel">
- <layout_stack name="bottom_panel">
- <layout_panel name="options_gear_btn_panel">
- <menu_button name="friends_viewsort_btn" tool_tip="オプションを表示ã—ã¾ã™"/>
- </layout_panel>
- <layout_panel name="add_btn_panel">
- <button name="add_btn" tool_tip="フレンド登録を申ã—出る"/>
- </layout_panel>
- <layout_panel name="trash_btn_panel">
- <dnd_button name="del_btn" tool_tip="é¸æŠžã—ãŸäººã‚’フレンドリストã‹ã‚‰å‰Šé™¤"/>
- </layout_panel>
- </layout_stack>
- </panel>
- </panel>
- <panel label="マイ グループ" name="groups_panel">
- <panel label="bottom_panel" name="bottom_panel">
- <menu_button name="groups_viewsort_btn" tool_tip="オプション"/>
- <button name="plus_btn" tool_tip="グループã«å‚加 / æ–°è¦ã‚°ãƒ«ãƒ¼ãƒ—を作æˆã—ã¾ã™"/>
- <button name="activate_btn" tool_tip="é¸æŠžã—ãŸã‚°ãƒ«ãƒ¼ãƒ—をアクティブã«ã—ã¾ã™"/>
- </panel>
- </panel>
- <panel label="最新" name="recent_panel">
- <panel label="bottom_panel" name="bottom_panel">
- <menu_button name="recent_viewsort_btn" tool_tip="オプション"/>
- <button name="add_friend_btn" tool_tip="é¸æŠžã—ãŸä½äººã‚’フレンドリストã«ç™»éŒ²"/>
- </panel>
- </panel>
- </tab_container>
- <panel name="button_bar">
- <layout_stack name="bottom_bar_ls">
- <layout_panel name="view_profile_btn_lp">
- <button label="プロフィール" name="view_profile_btn" tool_tip="写真ã€ã‚°ãƒ«ãƒ¼ãƒ—ã€ãã®ä»–ä½äººæƒ…報を表示"/>
- </layout_panel>
- <layout_panel name="im_btn_lp">
- <button label="IM" name="im_btn" tool_tip="インスタントメッセージを開ãã¾ã™"/>
- </layout_panel>
- <layout_panel name="call_btn_lp">
- <button label="コール" name="call_btn" tool_tip="ã“ã®ä½äººã«ã‚³ãƒ¼ãƒ«ã™ã‚‹"/>
- </layout_panel>
- <layout_panel name="share_btn_lp">
- <button label="共有" name="share_btn" tool_tip="「æŒã¡ç‰©ã€ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’共有ã™ã‚‹"/>
- </layout_panel>
- <layout_panel name="teleport_btn_lp">
- <button label="テレãƒãƒ¼ãƒˆ" name="teleport_btn" tool_tip="テレãƒãƒ¼ãƒˆã‚’é€ã‚Šã¾ã™"/>
- </layout_panel>
- </layout_stack>
- <layout_stack name="bottom_bar_ls1">
- <layout_panel name="group_info_btn_lp">
- <button label="グループ情報" name="group_info_btn" tool_tip="グループ情報を表示ã—ã¾ã™"/>
- </layout_panel>
- <layout_panel name="chat_btn_lp">
- <button label="グループãƒãƒ£ãƒƒãƒˆ" name="chat_btn" tool_tip="ãƒãƒ£ãƒƒãƒˆã‚’é–‹å§‹ã—ã¾ã™"/>
- </layout_panel>
- <layout_panel name="group_call_btn_lp">
- <button label="グループコール" name="group_call_btn" tool_tip="ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«ã‚³ãƒ¼ãƒ«ã™ã‚‹"/>
- </layout_panel>
- </layout_stack>
- </panel>
-</panel>
diff --git a/indra/newview/skins/minimal/xui/ja/panel_side_tray_tab_caption.xml b/indra/newview/skins/minimal/xui/ja/panel_side_tray_tab_caption.xml
deleted file mode 100644
index d06db8ccb1..0000000000
--- a/indra/newview/skins/minimal/xui/ja/panel_side_tray_tab_caption.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="sidetray_tab_panel">
- <text name="sidetray_tab_title" value="サイドパãƒãƒ«"/>
- <button name="undock" tool_tip="切り離ã™"/>
- <button name="dock" tool_tip="ドッキング"/>
- <button name="show_help" tool_tip="ヘルプを表示"/>
-</panel>
diff --git a/indra/newview/skins/minimal/xui/ja/panel_status_bar.xml b/indra/newview/skins/minimal/xui/ja/panel_status_bar.xml
deleted file mode 100644
index 7d1298c6c0..0000000000
--- a/indra/newview/skins/minimal/xui/ja/panel_status_bar.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="status">
- <panel.string name="packet_loss_tooltip">
- パケットæå¤±
- </panel.string>
- <panel.string name="bandwidth_tooltip">
- 帯域幅
- </panel.string>
- <panel.string name="time">
- [hour12, datetime, slt]:[min, datetime, slt] [ampm, datetime, slt] [timezone,datetime, slt]
- </panel.string>
- <panel.string name="timeTooltip">
- [year, datetime, slt] [month, datetime, slt] [day, datetime, slt] ([weekday, datetime, slt])
- </panel.string>
- <panel.string name="buycurrencylabel">
- L$ [AMT]
- </panel.string>
- <combo_box name="mode_combo" tool_tip="ãƒ¢ãƒ¼ãƒ‰ã‚’é¸æŠžã—ã¾ã™ã€‚ベーシックモードã§ã¯æŽ¢ç´¢ã‚„ãƒãƒ£ãƒƒãƒˆã‚’ã™ã°ã‚„ãç°¡å˜ã«å®Ÿè¡Œã§ãã€ã‚¢ãƒ‰ãƒãƒ³ã‚¹ãƒ¢ãƒ¼ãƒ‰ã§ã¯ã€ã‚ˆã‚Šå¤šãã®æ©Ÿèƒ½ãŒåˆ©ç”¨ã§ãã¾ã™ã€‚">
- <combo_box.item label="ベーシックモード" name="Basic"/>
- <combo_box.item label="アドãƒãƒ³ã‚¹ãƒ¢ãƒ¼ãƒ‰" name="Advanced"/>
- </combo_box>
- <button name="media_toggle_btn" tool_tip="ã™ã¹ã¦ã®ãƒ¡ãƒ‡ã‚£ã‚¢ã‚’é–‹å§‹ãƒ»åœæ­¢ï¼ˆéŸ³æ¥½ã€ãƒ“デオã€Web ページ)"/>
- <button name="volume_btn" tool_tip="グローãƒãƒ«éŸ³é‡è¨­å®š"/>
-</panel>
diff --git a/indra/newview/skins/minimal/xui/pl/floater_camera.xml b/indra/newview/skins/minimal/xui/pl/floater_camera.xml
deleted file mode 100644
index 5b9dd47616..0000000000
--- a/indra/newview/skins/minimal/xui/pl/floater_camera.xml
+++ /dev/null
@@ -1,65 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="camera_floater" title="">
- <floater.string name="rotate_tooltip">
- Obracaj kamerę wokół obiektu
- </floater.string>
- <floater.string name="zoom_tooltip">
- Najedź kamerą w kierunku obiektu
- </floater.string>
- <floater.string name="move_tooltip">
- Poruszaj kamerą w dół/górę oraz w prawo/lewo
- </floater.string>
- <floater.string name="camera_modes_title">
- Ustawienia
- </floater.string>
- <floater.string name="pan_mode_title">
- W prawo lub w lewo
- </floater.string>
- <floater.string name="presets_mode_title">
- Ustaw widok
- </floater.string>
- <floater.string name="free_mode_title">
- Zobacz obiekt
- </floater.string>
- <panel name="controls">
- <panel name="preset_views_list">
- <panel_camera_item name="front_view">
- <panel_camera_item.text name="front_view_text">
- Widok z przodu
- </panel_camera_item.text>
- </panel_camera_item>
- <panel_camera_item name="group_view">
- <panel_camera_item.text name="side_view_text">
- PodglÄ…d grupy
- </panel_camera_item.text>
- </panel_camera_item>
- <panel_camera_item name="rear_view">
- <panel_camera_item.text name="rear_view_text">
- Widok z tyłu
- </panel_camera_item.text>
- </panel_camera_item>
- </panel>
- <panel name="camera_modes_list">
- <panel_camera_item name="object_view">
- <panel_camera_item.text name="object_view_text">
- Widok obiektu
- </panel_camera_item.text>
- </panel_camera_item>
- <panel_camera_item name="mouselook_view">
- <panel_camera_item.text name="mouselook_view_text">
- Widok panoramiczny
- </panel_camera_item.text>
- </panel_camera_item>
- </panel>
- <panel name="zoom" tool_tip="Najedź kamerą w kierunku obiektu">
- <joystick_rotate name="cam_rotate_stick" tool_tip="Obracaj kamerę wokoł osi"/>
- <slider_bar name="zoom_slider" tool_tip="Przybliż kamerę do ogniskowej"/>
- <joystick_track name="cam_track_stick" tool_tip="Poruszaj kamerą w górę, w dół, w lewo i w prawo"/>
- </panel>
- </panel>
- <panel name="buttons">
- <button label="" name="presets_btn" tool_tip="Ustaw widok"/>
- <button label="" name="pan_btn" tool_tip="Kamera horyzontalna"/>
- <button label="" name="avatarview_btn" tool_tip="Ustawienia"/>
- </panel>
-</floater>
diff --git a/indra/newview/skins/minimal/xui/pl/floater_help_browser.xml b/indra/newview/skins/minimal/xui/pl/floater_help_browser.xml
deleted file mode 100644
index 66fde04f88..0000000000
--- a/indra/newview/skins/minimal/xui/pl/floater_help_browser.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_help_browser" title="POMOC">
- <floater.string name="loading_text">
- Åadowanie...
- </floater.string>
- <layout_stack name="stack1">
- <layout_panel name="external_controls"/>
- </layout_stack>
-</floater>
diff --git a/indra/newview/skins/minimal/xui/pl/floater_media_browser.xml b/indra/newview/skins/minimal/xui/pl/floater_media_browser.xml
deleted file mode 100644
index 02b7c6bc2b..0000000000
--- a/indra/newview/skins/minimal/xui/pl/floater_media_browser.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_about" title="PRZEGLĄDARKA MEDIÓW">
- <floater.string name="home_page_url">
- http://www.secondlife.com
- </floater.string>
- <floater.string name="support_page_url">
- http://support.secondlife.com
- </floater.string>
- <layout_stack name="stack1">
- <layout_panel name="nav_controls">
- <button label="Wstecz" name="back"/>
- <button label="Dalej" name="forward"/>
- <button label="Odśwież" name="reload"/>
- <button label="Idź" name="go"/>
- </layout_panel>
- <layout_panel name="time_controls">
- <button label="przewiń" name="rewind"/>
- <button label="zatrzymaj" name="stop"/>
- <button label="dalej" name="seek"/>
- </layout_panel>
- <layout_panel name="parcel_owner_controls">
- <button label="Wyślij bieżącą stronę do parceli" name="assign"/>
- </layout_panel>
- <layout_panel name="external_controls">
- <button label="Otwórz w przeglądarce zewnętrznej" name="open_browser"/>
- <check_box label="Zawsze otwieraj w przeglądarce zewnętrznej" name="open_always"/>
- <button label="Zamknij" name="close"/>
- </layout_panel>
- </layout_stack>
-</floater>
diff --git a/indra/newview/skins/minimal/xui/pl/floater_nearby_chat.xml b/indra/newview/skins/minimal/xui/pl/floater_nearby_chat.xml
deleted file mode 100644
index 7dc3e1f22e..0000000000
--- a/indra/newview/skins/minimal/xui/pl/floater_nearby_chat.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="nearby_chat" title="CZAT LOKALNY">
- <check_box label="Tłumaczenie czatu (wspierane przez Google)" name="translate_chat_checkbox"/>
-</floater>
diff --git a/indra/newview/skins/minimal/xui/pl/floater_web_content.xml b/indra/newview/skins/minimal/xui/pl/floater_web_content.xml
deleted file mode 100644
index e3096f1e54..0000000000
--- a/indra/newview/skins/minimal/xui/pl/floater_web_content.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_web_content" title="">
- <layout_stack name="stack1">
- <layout_panel name="nav_controls">
- <button name="back" tool_tip="Wstecz"/>
- <button name="forward" tool_tip="Dalej"/>
- <button name="stop" tool_tip="Zatrzymaj"/>
- <button name="reload" tool_tip="Odśwież stronę"/>
- <combo_box name="address" tool_tip="Wpisz URL tutaj"/>
- <icon name="media_secure_lock_flag" tool_tip="Zabezpieczona przeglÄ…darka"/>
- <button name="popexternal" tool_tip="Otwórz bieżący URL w zewnętrznej przeglądarce"/>
- </layout_panel>
- </layout_stack>
-</floater>
diff --git a/indra/newview/skins/minimal/xui/pl/inspect_avatar.xml b/indra/newview/skins/minimal/xui/pl/inspect_avatar.xml
deleted file mode 100644
index 5e982c0185..0000000000
--- a/indra/newview/skins/minimal/xui/pl/inspect_avatar.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<!--
- Not can_close / no title to avoid window chrome
- Single instance - only have one at a time, recycle it each spawn
--->
-<floater name="inspect_avatar">
- <string name="Subtitle">
- [AGE]
- </string>
- <string name="Details">
- [SL_PROFILE]
- </string>
- <text name="user_details">
- To jest mój opis w Second Life.
- </text>
- <slider name="volume_slider" tool_tip="Poziom głośności" value="0.5"/>
- <button label="Dodaj znajomość" name="add_friend_btn"/>
- <button label="IM" name="im_btn"/>
- <button label="Profil" name="view_profile_btn"/>
- <panel name="moderator_panel">
- <button label="Wyłącz komunikację głosową" name="disable_voice"/>
- <button label="Włącz komunikację głosową" name="enable_voice"/>
- </panel>
-</floater>
diff --git a/indra/newview/skins/minimal/xui/pl/inspect_object.xml b/indra/newview/skins/minimal/xui/pl/inspect_object.xml
deleted file mode 100644
index 23d8ce7700..0000000000
--- a/indra/newview/skins/minimal/xui/pl/inspect_object.xml
+++ /dev/null
@@ -1,41 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<!--
- Not can_close / no title to avoid window chrome
- Single instance - only have one at a time, recycle it each spawn
--->
-<floater name="inspect_object">
- <string name="Creator">
- Przez [CREATOR]
- </string>
- <string name="CreatorAndOwner">
- Twórca [CREATOR]
-Właściciel [OWNER]
- </string>
- <string name="Price">
- L$[AMOUNT]
- </string>
- <string name="PriceFree">
- Darmowe!
- </string>
- <string name="Touch">
- Dotknij
- </string>
- <string name="Sit">
- Usiądź tutaj
- </string>
- <text name="object_name" value="Test Object Name That Is actually two lines and Really Long"/>
- <text name="price_text">
- L$30,000
- </text>
- <text name="object_description">
- This is a really long description for an object being as how it is at least 80 characters in length and so but maybe more like 120 at this point. Who knows, really?
- </text>
- <button label="Kup" name="buy_btn"/>
- <button label="Zapłać" name="pay_btn"/>
- <button label="Weź kopię" name="take_free_copy_btn"/>
- <button label="Dotknij" name="touch_btn"/>
- <button label="Usiądź tutaj" name="sit_btn"/>
- <button label="Otwórz" name="open_btn"/>
- <icon name="secure_browsing" tool_tip="Zabezpiecz przeglÄ…danie"/>
- <button label="Więcej" name="more_info_btn"/>
-</floater>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_add_wearable_gear.xml b/indra/newview/skins/minimal/xui/pl/menu_add_wearable_gear.xml
deleted file mode 100644
index 7c572b4fc9..0000000000
--- a/indra/newview/skins/minimal/xui/pl/menu_add_wearable_gear.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Add Wearable Gear Menu">
- <menu_item_check label="Porządkuj według daty" name="sort_by_most_recent"/>
- <menu_item_check label="Porządkuj według nazwy" name="sort_by_name"/>
- <menu_item_check label="Porządkuj według typu" name="sort_by_type"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_attachment_other.xml b/indra/newview/skins/minimal/xui/pl/menu_attachment_other.xml
deleted file mode 100644
index aacdad97e3..0000000000
--- a/indra/newview/skins/minimal/xui/pl/menu_attachment_other.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<!-- *NOTE: See also menu_avatar_other.xml -->
-<context_menu name="Avatar Pie">
- <menu_item_call label="Zobacz profil" name="Profile..."/>
- <menu_item_call label="Dodaj znajomość" name="Add Friend"/>
- <menu_item_call label="IM" name="Send IM..."/>
- <menu_item_call label="Zadzwoń" name="Call"/>
- <menu_item_call label="ZaproÅ› do grupy" name="Invite..."/>
- <menu_item_call label="Zablokuj" name="Avatar Mute"/>
- <menu_item_call label="Raport" name="abuse"/>
- <menu_item_call label="Unieruchom" name="Freeze..."/>
- <menu_item_call label="Wyrzuć" name="Eject..."/>
- <menu_item_call label="Debugowanie tekstur" name="Debug..."/>
- <menu_item_call label="Przybliż" name="Zoom In"/>
- <menu_item_call label="Zapłać" name="Pay..."/>
- <menu_item_call label="Sprawdź" name="Object Inspect"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_attachment_self.xml b/indra/newview/skins/minimal/xui/pl/menu_attachment_self.xml
deleted file mode 100644
index 163b3a231e..0000000000
--- a/indra/newview/skins/minimal/xui/pl/menu_attachment_self.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Attachment Pie">
- <menu_item_call label="Dotknij" name="Attachment Object Touch"/>
- <menu_item_call label="Edytuj" name="Edit..."/>
- <menu_item_call label="Odłącz" name="Detach"/>
- <menu_item_call label="Usiądź tutaj" name="Sit Down Here"/>
- <menu_item_call label="Wstań" name="Stand Up"/>
- <menu_item_call label="Mój wygląd" name="Change Outfit"/>
- <menu_item_call label="Edytuj mój strój" name="Edit Outfit"/>
- <menu_item_call label="Edytuj mój kształt" name="Edit My Shape"/>
- <menu_item_call label="Moi znajomi" name="Friends..."/>
- <menu_item_call label="Moje grupy" name="Groups..."/>
- <menu_item_call label="Mój profil" name="Profile..."/>
- <menu_item_call label="Debugowanie tekstur" name="Debug..."/>
- <menu_item_call label="Opuść" name="Drop"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_avatar_icon.xml b/indra/newview/skins/minimal/xui/pl/menu_avatar_icon.xml
deleted file mode 100644
index e8d2b14231..0000000000
--- a/indra/newview/skins/minimal/xui/pl/menu_avatar_icon.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Avatar Icon Menu">
- <menu_item_call label="Profil" name="Show Profile"/>
- <menu_item_call label="Czat/IM..." name="Send IM"/>
- <menu_item_call label="Dodaj znajomość..." name="Add Friend"/>
- <menu_item_call label="Usuń..." name="Remove Friend"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_avatar_other.xml b/indra/newview/skins/minimal/xui/pl/menu_avatar_other.xml
deleted file mode 100644
index dcf7921bad..0000000000
--- a/indra/newview/skins/minimal/xui/pl/menu_avatar_other.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<!-- *NOTE: See also menu_attachment_other.xml -->
-<context_menu name="Avatar Pie">
- <menu_item_call label="Zobacz profil" name="Profile..."/>
- <menu_item_call label="Dodaj znajomość" name="Add Friend"/>
- <menu_item_call label="IM" name="Send IM..."/>
- <menu_item_call label="Zadzwoń" name="Call"/>
- <menu_item_call label="ZaproÅ› do grupy" name="Invite..."/>
- <menu_item_call label="Zablokuj" name="Avatar Mute"/>
- <menu_item_call label="Raport" name="abuse"/>
- <menu_item_call label="Unieruchom" name="Freeze..."/>
- <menu_item_call label="Wyrzuć" name="Eject..."/>
- <menu_item_call label="Debugowanie tekstur" name="Debug..."/>
- <menu_item_call label="Przybliż" name="Zoom In"/>
- <menu_item_call label="Zapłać" name="Pay..."/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_avatar_self.xml b/indra/newview/skins/minimal/xui/pl/menu_avatar_self.xml
deleted file mode 100644
index d481475803..0000000000
--- a/indra/newview/skins/minimal/xui/pl/menu_avatar_self.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Self Pie">
- <menu_item_call label="Usiądź tu" name="Sit Down Here"/>
- <menu_item_call label="Wstań" name="Stand Up"/>
- <context_menu label="Zdejmij" name="Take Off &gt;">
- <context_menu label="Ubrania" name="Clothes &gt;">
- <menu_item_call label="KoszulÄ™" name="Shirt"/>
- <menu_item_call label="Spodnie" name="Pants"/>
- <menu_item_call label="Spódnicę" name="Skirt"/>
- <menu_item_call label="Buty" name="Shoes"/>
- <menu_item_call label="Skarpetki" name="Socks"/>
- <menu_item_call label="KurtkÄ™" name="Jacket"/>
- <menu_item_call label="Rękawiczki" name="Gloves"/>
- <menu_item_call label="Podkoszulek" name="Self Undershirt"/>
- <menu_item_call label="BieliznÄ™" name="Self Underpants"/>
- <menu_item_call label="Tatuaż" name="Self Tattoo"/>
- <menu_item_call label="Ubranie alpha" name="Self Alpha"/>
- <menu_item_call label="Wszystko" name="All Clothes"/>
- </context_menu>
- <context_menu label="HUD" name="Object Detach HUD"/>
- <context_menu label="Odłącz" name="Object Detach"/>
- <menu_item_call label="Odłącz wszystko" name="Detach All"/>
- </context_menu>
- <menu_item_call label="Mój wygląd" name="Chenge Outfit"/>
- <menu_item_call label="Edytuj mój strój" name="Edit Outfit"/>
- <menu_item_call label="Edytuj mój kształt" name="Edit My Shape"/>
- <menu_item_call label="Moi znajomi" name="Friends..."/>
- <menu_item_call label="Moje grupy" name="Groups..."/>
- <menu_item_call label="Mój profil" name="Profile..."/>
- <menu_item_call label="Debugowanie tekstur" name="Debug..."/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_bottomtray.xml b/indra/newview/skins/minimal/xui/pl/menu_bottomtray.xml
deleted file mode 100644
index 8da40dcedf..0000000000
--- a/indra/newview/skins/minimal/xui/pl/menu_bottomtray.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="hide_camera_move_controls_menu">
- <menu_item_check label="Rozmowy głosowe aktywne" name="EnableVoiceChat"/>
- <menu_item_check label="Przycisk gesturki" name="ShowGestureButton"/>
- <menu_item_check label="Przycisk ruchu" name="ShowMoveButton"/>
- <menu_item_check label="Przycisk widoku" name="ShowCameraButton"/>
- <menu_item_check label="Przycisk zdjęć" name="ShowSnapshotButton"/>
- <menu_item_check label="Buduj" name="ShowBuildButton"/>
- <menu_item_check label="Szukaj" name="ShowSearchButton"/>
- <menu_item_check label="Mapa" name="ShowWorldMapButton"/>
- <menu_item_check label="Mini-Mapa" name="ShowMiniMapButton"/>
- <menu_item_call label="Wytnij" name="NearbyChatBar_Cut"/>
- <menu_item_call label="Kopiuj" name="NearbyChatBar_Copy"/>
- <menu_item_call label="Wklej" name="NearbyChatBar_Paste"/>
- <menu_item_call label="Usuń" name="NearbyChatBar_Delete"/>
- <menu_item_call label="Zaznacz wszystko" name="NearbyChatBar_Select_All"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_cof_attachment.xml b/indra/newview/skins/minimal/xui/pl/menu_cof_attachment.xml
deleted file mode 100644
index 4e5407601b..0000000000
--- a/indra/newview/skins/minimal/xui/pl/menu_cof_attachment.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="COF Attachment">
- <menu_item_call label="Odłącz" name="detach"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_cof_body_part.xml b/indra/newview/skins/minimal/xui/pl/menu_cof_body_part.xml
deleted file mode 100644
index ee60d3feb6..0000000000
--- a/indra/newview/skins/minimal/xui/pl/menu_cof_body_part.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="COF Body">
- <menu_item_call label="ZastÄ…p" name="replace"/>
- <menu_item_call label="Edytuj" name="edit"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_cof_clothing.xml b/indra/newview/skins/minimal/xui/pl/menu_cof_clothing.xml
deleted file mode 100644
index ad43900137..0000000000
--- a/indra/newview/skins/minimal/xui/pl/menu_cof_clothing.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="COF Clothing">
- <menu_item_call label="Zdejmij" name="take_off"/>
- <menu_item_call label="Edytuj" name="edit"/>
- <menu_item_call label="ZastÄ…p" name="replace"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_cof_gear.xml b/indra/newview/skins/minimal/xui/pl/menu_cof_gear.xml
deleted file mode 100644
index 9fba39be1a..0000000000
--- a/indra/newview/skins/minimal/xui/pl/menu_cof_gear.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Gear COF">
- <menu label="Nowe ubranie" name="COF.Gear.New_Clothes"/>
- <menu label="Nowe części ciała" name="COF.Geear.New_Body_Parts"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_edit.xml b/indra/newview/skins/minimal/xui/pl/menu_edit.xml
deleted file mode 100644
index 578e270fed..0000000000
--- a/indra/newview/skins/minimal/xui/pl/menu_edit.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu label="Edycja" name="Edit">
- <menu_item_call label="Cofnij" name="Undo"/>
- <menu_item_call label="Powtórz" name="Redo"/>
- <menu_item_call label="Wytnij" name="Cut"/>
- <menu_item_call label="Kopiuj" name="Copy"/>
- <menu_item_call label="Wklej" name="Paste"/>
- <menu_item_call label="Usuń" name="Delete"/>
- <menu_item_call label="Powiel" name="Duplicate"/>
- <menu_item_call label="Zaznacz wszystko" name="Select All"/>
- <menu_item_call label="Odznacz" name="Deselect"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_favorites.xml b/indra/newview/skins/minimal/xui/pl/menu_favorites.xml
deleted file mode 100644
index 7310ff5c27..0000000000
--- a/indra/newview/skins/minimal/xui/pl/menu_favorites.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Popup">
- <menu_item_call label="Teleportuj" name="Teleport To Landmark"/>
- <menu_item_call label="Zobacz/Edytuj Ulubione miejsce" name="Landmark Open"/>
- <menu_item_call label="Kopiuj SLurl" name="Copy slurl"/>
- <menu_item_call label="Pokaż na mapie" name="Show On Map"/>
- <menu_item_call label="Kopiuj" name="Landmark Copy"/>
- <menu_item_call label="Wklej" name="Landmark Paste"/>
- <menu_item_call label="Usuń" name="Delete"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_gesture_gear.xml b/indra/newview/skins/minimal/xui/pl/menu_gesture_gear.xml
deleted file mode 100644
index a72dec22fc..0000000000
--- a/indra/newview/skins/minimal/xui/pl/menu_gesture_gear.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_gesture_gear">
- <menu_item_call label="Dodaj/Usuń z Ulubionych" name="activate"/>
- <menu_item_call label="Kopiuj" name="copy_gesture"/>
- <menu_item_call label="Wklej" name="paste"/>
- <menu_item_call label="Kopiuj UUID" name="copy_uuid"/>
- <menu_item_call label="Zapisz do obecnego zestawu ubrania" name="save_to_outfit"/>
- <menu_item_call label="Edytuj" name="edit_gesture"/>
- <menu_item_call label="Sprawdź" name="inspect"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_group_plus.xml b/indra/newview/skins/minimal/xui/pl/menu_group_plus.xml
deleted file mode 100644
index 83be4d38c5..0000000000
--- a/indra/newview/skins/minimal/xui/pl/menu_group_plus.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_group_plus">
- <menu_item_call label="Dołącz do grupy..." name="item_join"/>
- <menu_item_call label="Nowa grupa..." name="item_new"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_hide_navbar.xml b/indra/newview/skins/minimal/xui/pl/menu_hide_navbar.xml
deleted file mode 100644
index 19d9510cd3..0000000000
--- a/indra/newview/skins/minimal/xui/pl/menu_hide_navbar.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="hide_navbar_menu">
- <menu_item_check label="Pokaż pasek Nawigacji" name="ShowNavbarNavigationPanel"/>
- <menu_item_check label="Pokaż pasek Ulubionych" name="ShowNavbarFavoritesPanel"/>
- <menu_item_check label="Pokaż pasek mini-lokalizacji" name="ShowMiniLocationPanel"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_im_well_button.xml b/indra/newview/skins/minimal/xui/pl/menu_im_well_button.xml
deleted file mode 100644
index 207bc2211b..0000000000
--- a/indra/newview/skins/minimal/xui/pl/menu_im_well_button.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="IM Well Button Context Menu">
- <menu_item_call label="Zamknij wszystkie" name="Close All"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_imchiclet_adhoc.xml b/indra/newview/skins/minimal/xui/pl/menu_imchiclet_adhoc.xml
deleted file mode 100644
index 4ead44878a..0000000000
--- a/indra/newview/skins/minimal/xui/pl/menu_imchiclet_adhoc.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="IMChiclet AdHoc Menu">
- <menu_item_call label="Zakończ rozmowę" name="End Session"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_imchiclet_group.xml b/indra/newview/skins/minimal/xui/pl/menu_imchiclet_group.xml
deleted file mode 100644
index 2b9a362123..0000000000
--- a/indra/newview/skins/minimal/xui/pl/menu_imchiclet_group.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="IMChiclet Group Menu">
- <menu_item_call label="O grupie" name="Show Profile"/>
- <menu_item_call label="Pokaż sesję" name="Chat"/>
- <menu_item_call label="Zakończ rozmowę" name="End Session"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_imchiclet_p2p.xml b/indra/newview/skins/minimal/xui/pl/menu_imchiclet_p2p.xml
deleted file mode 100644
index 8924d6db3e..0000000000
--- a/indra/newview/skins/minimal/xui/pl/menu_imchiclet_p2p.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="IMChiclet P2P Menu">
- <menu_item_call label="Zobacz profil" name="Show Profile"/>
- <menu_item_call label="Dodaj znajomość" name="Add Friend"/>
- <menu_item_call label="Pokaż sesję" name="Send IM"/>
- <menu_item_call label="Zakończ rozmowę" name="End Session"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_inspect_avatar_gear.xml b/indra/newview/skins/minimal/xui/pl/menu_inspect_avatar_gear.xml
deleted file mode 100644
index 59560f236c..0000000000
--- a/indra/newview/skins/minimal/xui/pl/menu_inspect_avatar_gear.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<toggleable_menu name="Gear Menu">
- <menu_item_call label="Zobacz profil" name="view_profile"/>
- <menu_item_call label="Dodaj znajomość" name="add_friend"/>
- <menu_item_call label="IM" name="im"/>
- <menu_item_call label="Zadzwoń" name="call"/>
- <menu_item_call label="Teleportuj" name="teleport"/>
- <menu_item_call label="ZaproÅ› do grupy" name="invite_to_group"/>
- <menu_item_call label="Zablokuj" name="block"/>
- <menu_item_call label="Odblokuj" name="unblock"/>
- <menu_item_call label="Raport" name="report"/>
- <menu_item_call label="Unieruchom" name="freeze"/>
- <menu_item_call label="Wyrzuć" name="eject"/>
- <menu_item_call label="Kopnij" name="kick"/>
- <menu_item_call label="CSR" name="csr"/>
- <menu_item_call label="Debugowanie tekstur" name="debug"/>
- <menu_item_call label="Znajdź na mapie" name="find_on_map"/>
- <menu_item_call label="Przybliż" name="zoom_in"/>
- <menu_item_call label="Zapłać" name="pay"/>
- <menu_item_call label="Udostępnij" name="share"/>
-</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_inspect_object_gear.xml b/indra/newview/skins/minimal/xui/pl/menu_inspect_object_gear.xml
deleted file mode 100644
index c12bd490ff..0000000000
--- a/indra/newview/skins/minimal/xui/pl/menu_inspect_object_gear.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<menu name="Gear Menu">
- <menu_item_call label="Dotknij" name="touch"/>
- <menu_item_call label="Usiądź" name="sit"/>
- <menu_item_call label="Zapłać" name="pay"/>
- <menu_item_call label="Kup" name="buy"/>
- <menu_item_call label="Weź" name="take"/>
- <menu_item_call label="Weź kopię" name="take_copy"/>
- <menu_item_call label="Otwórz" name="open"/>
- <menu_item_call label="Edytuj" name="edit"/>
- <menu_item_call label="Ubierz" name="wear"/>
- <menu_item_call label="Dodaj" name="add"/>
- <menu_item_call label="Raport" name="report"/>
- <menu_item_call label="Zablokuj" name="block"/>
- <menu_item_call label="Przybliż" name="zoom_in"/>
- <menu_item_call label="Usuń" name="remove"/>
- <menu_item_call label="Więcej informacji" name="more_info"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_inspect_self_gear.xml b/indra/newview/skins/minimal/xui/pl/menu_inspect_self_gear.xml
deleted file mode 100644
index c4ef9761d9..0000000000
--- a/indra/newview/skins/minimal/xui/pl/menu_inspect_self_gear.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<toggleable_menu name="Gear Menu">
- <menu_item_call label="Usiądź tutaj" name="Sit Down Here"/>
- <menu_item_call label="Wstań" name="Stand Up"/>
- <context_menu label="Zdejmij" name="Take Off &gt;">
- <context_menu label="Ubranie" name="Clothes &gt;">
- <menu_item_call label="Bluzka" name="Shirt"/>
- <menu_item_call label="Spodnie" name="Pants"/>
- <menu_item_call label="Spódnica" name="Skirt"/>
- <menu_item_call label="Buty" name="Shoes"/>
- <menu_item_call label="Skarpetki" name="Socks"/>
- <menu_item_call label="Kurtka" name="Jacket"/>
- <menu_item_call label="Rękawiczki" name="Gloves"/>
- <menu_item_call label="Podkoszulek" name="Self Undershirt"/>
- <menu_item_call label="Bielizna" name="Self Underpants"/>
- <menu_item_call label="Tatuaż" name="Self Tattoo"/>
- <menu_item_call label="Alpha" name="Self Alpha"/>
- <menu_item_call label="Ubranie" name="All Clothes"/>
- </context_menu>
- <context_menu label="HUD" name="Object Detach HUD"/>
- <context_menu label="Odłącz" name="Object Detach"/>
- <menu_item_call label="Odłącz wszystko" name="Detach All"/>
- </context_menu>
- <menu_item_call label="Zmień strój" name="Chenge Outfit"/>
- <menu_item_call label="Edytuj mój strój" name="Edit Outfit"/>
- <menu_item_call label="Edytuj mój kształt" name="Edit My Shape"/>
- <menu_item_call label="Znajomi" name="Friends..."/>
- <menu_item_call label="Moje grupy" name="Groups..."/>
- <menu_item_call label="Mój profil" name="Profile..."/>
- <menu_item_call label="Debugowanie tekstur" name="Debug..."/>
-</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_inv_offer_chiclet.xml b/indra/newview/skins/minimal/xui/pl/menu_inv_offer_chiclet.xml
deleted file mode 100644
index 5ef0f2f7a4..0000000000
--- a/indra/newview/skins/minimal/xui/pl/menu_inv_offer_chiclet.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="InvOfferChiclet Menu">
- <menu_item_call label="Zamknij" name="Close"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_inventory.xml b/indra/newview/skins/minimal/xui/pl/menu_inventory.xml
deleted file mode 100644
index e47ffa0e18..0000000000
--- a/indra/newview/skins/minimal/xui/pl/menu_inventory.xml
+++ /dev/null
@@ -1,84 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Popup">
- <menu_item_call label="Udostępnij" name="Share"/>
- <menu_item_call label="Kupuj" name="Task Buy"/>
- <menu_item_call label="Otwórz" name="Task Open"/>
- <menu_item_call label="Odtwarzaj" name="Task Play"/>
- <menu_item_call label="Właściwości" name="Task Properties"/>
- <menu_item_call label="Zmień nazwę" name="Task Rename"/>
- <menu_item_call label="Usuń" name="Task Remove"/>
- <menu_item_call label="Opróżnij Kosz" name="Empty Trash"/>
- <menu_item_call label="Opróżnij Folder Zgubione i odnalezione" name="Empty Lost And Found"/>
- <menu_item_call label="Nowy folder" name="New Folder"/>
- <menu_item_call label="Nowy skrypt" name="New Script"/>
- <menu_item_call label="Nowa nota" name="New Note"/>
- <menu_item_call label="Nowa gesturka" name="New Gesture"/>
- <menu label="Nowe Ubranie" name="New Clothes">
- <menu_item_call label="Nowa koszula" name="New Shirt"/>
- <menu_item_call label="Nowe spodnie" name="New Pants"/>
- <menu_item_call label="Nowe buty" name="New Shoes"/>
- <menu_item_call label="Nowe skarpety" name="New Socks"/>
- <menu_item_call label="Nowa kurtka" name="New Jacket"/>
- <menu_item_call label="Nowa spódnica" name="New Skirt"/>
- <menu_item_call label="Nowe rękawiczki" name="New Gloves"/>
- <menu_item_call label="Nowy podkoszulek" name="New Undershirt"/>
- <menu_item_call label="Nowa bielizna" name="New Underpants"/>
- <menu_item_call label="Nowa maska alpha" name="New Alpha Mask"/>
- <menu_item_call label="Nowy tatuaż" name="New Tattoo"/>
- </menu>
- <menu label="Nowa Część Ciała" name="New Body Parts">
- <menu_item_call label="Nowy kształt" name="New Shape"/>
- <menu_item_call label="Nowa skórka" name="New Skin"/>
- <menu_item_call label="Nowe włosy" name="New Hair"/>
- <menu_item_call label="Nowe oczy" name="New Eyes"/>
- </menu>
- <menu label="Zmień Czcionkę" name="Change Type">
- <menu_item_call label="Domyślna" name="Default"/>
- <menu_item_call label="Rękawiczki" name="Gloves"/>
- <menu_item_call label="Kurtka" name="Jacket"/>
- <menu_item_call label="Spodnie" name="Pants"/>
- <menu_item_call label="Kształt" name="Shape"/>
- <menu_item_call label="Buty" name="Shoes"/>
- <menu_item_call label="Koszula" name="Shirt"/>
- <menu_item_call label="Spódnica" name="Skirt"/>
- <menu_item_call label="Bielizna" name="Underpants"/>
- <menu_item_call label="Podkoszulek" name="Undershirt"/>
- </menu>
- <menu_item_call label="Teleportuj" name="Landmark Open"/>
- <menu_item_call label="Otwórz" name="Animation Open"/>
- <menu_item_call label="Otwórz" name="Sound Open"/>
- <menu_item_call label="Zmień strój" name="Replace Outfit"/>
- <menu_item_call label="Dodaj do stroju" name="Add To Outfit"/>
- <menu_item_call label="Usuń obiekt" name="Purge Item"/>
- <menu_item_call label="Przywróć obiekt" name="Restore Item"/>
- <menu_item_call label="Otwórz" name="Open"/>
- <menu_item_call label="Otwórz oryginalne" name="Open Original"/>
- <menu_item_call label="Właściwości" name="Properties"/>
- <menu_item_call label="Zmień nazwę" name="Rename"/>
- <menu_item_call label="Kopiuj dane UUID" name="Copy Asset UUID"/>
- <menu_item_call label="Kopiuj" name="Copy"/>
- <menu_item_call label="Wklej" name="Paste"/>
- <menu_item_call label="Wklej jako link" name="Paste As Link"/>
- <menu_item_call label="Usuń" name="Remove Link"/>
- <menu_item_call label="Usuń" name="Delete"/>
- <menu_item_call label="Skasuj folder systemu" name="Delete System Folder"/>
- <menu_item_call label="Rozpocznij konferencjÄ™ czatowÄ…" name="Conference Chat Folder"/>
- <menu_item_call label="Odtwarzaj" name="Sound Play"/>
- <menu_item_call label="O Miejscu" name="About Landmark"/>
- <menu_item_call label="Używaj in-world" name="Animation Play"/>
- <menu_item_call label="Odtwarzaj lokalnie" name="Animation Audition"/>
- <menu_item_call label="Wyślij IM" name="Send Instant Message"/>
- <menu_item_call label="Teleportuj..." name="Offer Teleport..."/>
- <menu_item_call label="Rozpocznij konferencjÄ™ czatowÄ…" name="Conference Chat"/>
- <menu_item_call label="Aktywuj" name="Activate"/>
- <menu_item_call label="Deaktywuj" name="Deactivate"/>
- <menu_item_call label="Zapisz jako" name="Save As"/>
- <menu_item_call label="Odłącz od siebie" name="Detach From Yourself"/>
- <menu_item_call label="Załóż" name="Wearable And Object Wear"/>
- <menu label="Dołącz do" name="Attach To"/>
- <menu label="Dołącz do załączników HUD" name="Attach To HUD"/>
- <menu_item_call label="Edytuj" name="Wearable Edit"/>
- <menu_item_call label="Dodaj" name="Wearable Add"/>
- <menu_item_call label="Zdejmij" name="Take Off"/>
- <menu_item_call label="--brak opcji--" name="--no options--"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_inventory_add.xml b/indra/newview/skins/minimal/xui/pl/menu_inventory_add.xml
deleted file mode 100644
index 4a56586aaf..0000000000
--- a/indra/newview/skins/minimal/xui/pl/menu_inventory_add.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_inventory_add">
- <menu label="Załaduj" name="upload">
- <menu_item_call label="obraz (L$[COST])..." name="Upload Image"/>
- <menu_item_call label="dźwięk (L$[COST])..." name="Upload Sound"/>
- <menu_item_call label="animacjÄ™ (L$[COST])..." name="Upload Animation"/>
- <menu_item_call label="zbiór plików (L$[COST] za jeden plik)..." name="Bulk Upload"/>
- <menu_item_call label="Ustaw domyślne pozwolenia ładowania" name="perm prefs"/>
- </menu>
- <menu_item_call label="Nowy folder" name="New Folder"/>
- <menu_item_call label="Nowy skrypt" name="New Script"/>
- <menu_item_call label="Nowa nota" name="New Note"/>
- <menu_item_call label="Nowa gesturka" name="New Gesture"/>
- <menu label="Nowe Ubranie" name="New Clothes">
- <menu_item_call label="Nowa koszula" name="New Shirt"/>
- <menu_item_call label="Nowe spodnie" name="New Pants"/>
- <menu_item_call label="Nowe buty" name="New Shoes"/>
- <menu_item_call label="Nowe skarpetki" name="New Socks"/>
- <menu_item_call label="Nowa kurtka" name="New Jacket"/>
- <menu_item_call label="Nowa spódnica" name="New Skirt"/>
- <menu_item_call label="Nowe rękawiczki" name="New Gloves"/>
- <menu_item_call label="Nowy podkoszulek" name="New Undershirt"/>
- <menu_item_call label="Nowa bielizna" name="New Underpants"/>
- <menu_item_call label="Nowa maska alpha" name="New Alpha"/>
- <menu_item_call label="Nowy tatuaż" name="New Tattoo"/>
- </menu>
- <menu label="Nowa Część Ciała" name="New Body Parts">
- <menu_item_call label="Nowy kształt" name="New Shape"/>
- <menu_item_call label="Nowa skórka" name="New Skin"/>
- <menu_item_call label="Nowe włosy" name="New Hair"/>
- <menu_item_call label="Nowe oczy" name="New Eyes"/>
- </menu>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_inventory_gear_default.xml b/indra/newview/skins/minimal/xui/pl/menu_inventory_gear_default.xml
deleted file mode 100644
index 591c3a81d5..0000000000
--- a/indra/newview/skins/minimal/xui/pl/menu_inventory_gear_default.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<toggleable_menu name="menu_gear_default">
- <menu_item_call label="Nowe okno Szafy" name="new_window"/>
- <menu_item_check label="Porządkuj według nazwy" name="sort_by_name"/>
- <menu_item_check label="Porządkuj według daty" name="sort_by_recent"/>
- <menu_item_check label="Sortuj foldery zawsze według nazwy" name="sort_folders_by_name"/>
- <menu_item_check label="Posortuj foldery systemowe od góry" name="sort_system_folders_to_top"/>
- <menu_item_call label="Pokaż filtry" name="show_filters"/>
- <menu_item_call label="Zresetuj filtry" name="reset_filters"/>
- <menu_item_call label="Zamknij wszystkie foldery" name="close_folders"/>
- <menu_item_call label="Opróżnij Zagubione i odnalezione" name="empty_lostnfound"/>
- <menu_item_call label="Zapisz teksturÄ™ jako" name="Save Texture As"/>
- <menu_item_call label="Udostępnij" name="Share"/>
- <menu_item_call label="Znajdź oryginał" name="Find Original"/>
- <menu_item_call label="Znajdź wszystkie linki" name="Find All Links"/>
- <menu_item_call label="Opróżnij Kosz" name="empty_trash"/>
-</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_land.xml b/indra/newview/skins/minimal/xui/pl/menu_land.xml
deleted file mode 100644
index cbfecaee56..0000000000
--- a/indra/newview/skins/minimal/xui/pl/menu_land.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Land Pie">
- <menu_item_call label="O Posiadłości" name="Place Information..."/>
- <menu_item_call label="Usiądź tutaj" name="Sit Here"/>
- <menu_item_call label="Kup posiadłość" name="Land Buy"/>
- <menu_item_call label="Kup przepustkÄ™" name="Land Buy Pass"/>
- <menu_item_call label="Buduj" name="Create"/>
- <menu_item_call label="Edytuj teren" name="Edit Terrain"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_landmark.xml b/indra/newview/skins/minimal/xui/pl/menu_landmark.xml
deleted file mode 100644
index aa5808390c..0000000000
--- a/indra/newview/skins/minimal/xui/pl/menu_landmark.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<toggleable_menu name="landmark_overflow_menu">
- <menu_item_call label="Kopiuj SLurl" name="copy"/>
- <menu_item_call label="Usuń" name="delete"/>
- <menu_item_call label="Utwórz" name="pick"/>
- <menu_item_call label="Dodaj do paska Ulubionych" name="add_to_favbar"/>
-</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_login.xml b/indra/newview/skins/minimal/xui/pl/menu_login.xml
deleted file mode 100644
index e50b694641..0000000000
--- a/indra/newview/skins/minimal/xui/pl/menu_login.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu_bar name="Login Menu">
- <menu label="Ja" name="File">
- <menu_item_call label="Ustawienia" name="Preferences..."/>
- <menu_item_call label="Wyłącz [APP_NAME]" name="Quit"/>
- </menu>
- <menu label="Pomoc" name="Help">
- <menu_item_call label="[SECOND_LIFE]: Pomoc" name="Second Life Help"/>
- <menu_item_call label="O [APP_NAME]" name="About Second Life"/>
- </menu>
- <menu_item_check label="Pokaż ustawienia debugowania" name="Show Debug Menu"/>
- <menu label="Debug" name="Debug">
- <menu_item_call label="Ustawienia debugowania" name="Debug Settings"/>
- <menu_item_call label="Ustawienia UI/kolor" name="UI/Color Settings"/>
- <menu label="UI Testy" name="UI Tests"/>
- <menu_item_call label="Ustaw rozmiar interfejsu..." name="Set Window Size..."/>
- <menu_item_call label="Wyświetl TOS" name="TOS"/>
- <menu_item_call label="Wyświetl wiadomość krytyczną" name="Critical"/>
- <menu_item_call label="Test przeglądarki mediów" name="Web Browser Test"/>
- <menu_item_call label="Test zawartości strony" name="Web Content Floater Test"/>
- <menu_item_check label="Pokaż siatkę" name="Show Grid Picker"/>
- <menu_item_call label="Pokaż konsolę Zawiadomień" name="Show Notifications Console"/>
- </menu>
-</menu_bar>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_mini_map.xml b/indra/newview/skins/minimal/xui/pl/menu_mini_map.xml
deleted file mode 100644
index 8f86965416..0000000000
--- a/indra/newview/skins/minimal/xui/pl/menu_mini_map.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Popup">
- <menu_item_call label="Zoom blisko" name="Zoom Close"/>
- <menu_item_call label="Zoom średnio" name="Zoom Medium"/>
- <menu_item_call label="Zoom daleko" name="Zoom Far"/>
- <menu_item_call label="Zoom domyślny" name="Zoom Default"/>
- <menu_item_check label="Obróć mapę" name="Rotate Map"/>
- <menu_item_check label="Autocentrowanie" name="Auto Center"/>
- <menu_item_call label="Zatrzymaj" name="Stop Tracking"/>
- <menu_item_call label="Mapa Åšwiata" name="World Map"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_navbar.xml b/indra/newview/skins/minimal/xui/pl/menu_navbar.xml
deleted file mode 100644
index 1d434670ee..0000000000
--- a/indra/newview/skins/minimal/xui/pl/menu_navbar.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Navbar Menu">
- <menu_item_check label="Pokaż współrzędne" name="Show Coordinates"/>
- <menu_item_check label="Pokaż właściwości posiadłości" name="Show Parcel Properties"/>
- <menu_item_call label="Landmark" name="Landmark"/>
- <menu_item_call label="Wytnij" name="Cut"/>
- <menu_item_call label="Kopiuj" name="Copy"/>
- <menu_item_call label="Wklej" name="Paste"/>
- <menu_item_call label="Usuń" name="Delete"/>
- <menu_item_call label="Zaznacz wszystko" name="Select All"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_nearby_chat.xml b/indra/newview/skins/minimal/xui/pl/menu_nearby_chat.xml
deleted file mode 100644
index fe5bc6ba6f..0000000000
--- a/indra/newview/skins/minimal/xui/pl/menu_nearby_chat.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="NearBy Chat Menu">
- <menu_item_call label="Pokaż osoby w pobliżu..." name="nearby_people"/>
- <menu_item_check label="Pokaż zablokowany tekst" name="muted_text"/>
- <menu_item_check label="Wyświetlaj ikonki znajomych" name="show_buddy_icons"/>
- <menu_item_check label="Wyświetlaj imiona" name="show_names"/>
- <menu_item_check label="Wyświetlaj ikonki i imiona" name="show_icons_and_names"/>
- <menu_item_call label="Rozmiar czcionki" name="font_size"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_notification_well_button.xml b/indra/newview/skins/minimal/xui/pl/menu_notification_well_button.xml
deleted file mode 100644
index bd3d42f9b1..0000000000
--- a/indra/newview/skins/minimal/xui/pl/menu_notification_well_button.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Notification Well Button Context Menu">
- <menu_item_call label="Zamknij" name="Close All"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_object.xml b/indra/newview/skins/minimal/xui/pl/menu_object.xml
deleted file mode 100644
index 3da6c5c890..0000000000
--- a/indra/newview/skins/minimal/xui/pl/menu_object.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Object Pie">
- <menu_item_call label="Dotknij" name="Object Touch">
- <menu_item_call.on_enable name="EnableTouch" parameter="Dotknij"/>
- </menu_item_call>
- <menu_item_call label="Edytuj" name="Edit..."/>
- <menu_item_call label="Buduj" name="Build"/>
- <menu_item_call label="Otwórz" name="Open"/>
- <menu_item_call label="Usiądź tutaj" name="Object Sit"/>
- <menu_item_call label="Wstań" name="Object Stand Up"/>
- <menu_item_call label="Sprawdź" name="Object Inspect"/>
- <menu_item_call label="Przybliż" name="Zoom In"/>
- <context_menu label="Załóż na" name="Put On">
- <menu_item_call label="Załóż" name="Wear"/>
- <menu_item_call label="Dodaj" name="Add"/>
- <context_menu label="Dołącz" name="Object Attach"/>
- <context_menu label="Dołącz HUD" name="Object Attach HUD"/>
- </context_menu>
- <context_menu label="ZarzÄ…dzaj" name="Remove">
- <menu_item_call label="Raport" name="Report Abuse..."/>
- <menu_item_call label="Zablokuj" name="Object Mute"/>
- <menu_item_call label="Zwróć" name="Return..."/>
- </context_menu>
- <menu_item_call label="Weź" name="Pie Object Take"/>
- <menu_item_call label="Weź kopię" name="Take Copy"/>
- <menu_item_call label="Zapłać" name="Pay..."/>
- <menu_item_call label="Kup" name="Buy..."/>
- <menu_item_call label="Skasuj" name="Delete"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_object_icon.xml b/indra/newview/skins/minimal/xui/pl/menu_object_icon.xml
deleted file mode 100644
index b499bca2db..0000000000
--- a/indra/newview/skins/minimal/xui/pl/menu_object_icon.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Object Icon Menu">
- <menu_item_call label="Sprawdź..." name="Object Profile"/>
- <menu_item_call label="Zablokuj..." name="Block"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_outfit_gear.xml b/indra/newview/skins/minimal/xui/pl/menu_outfit_gear.xml
deleted file mode 100644
index 1a70e76ec7..0000000000
--- a/indra/newview/skins/minimal/xui/pl/menu_outfit_gear.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Gear Outfit">
- <menu_item_call label="Załóż - Zastąp obecny strój" name="wear"/>
- <menu_item_call label="Załóż - Dodaj do bieżącego stroju" name="wear_add"/>
- <menu_item_call label="Zdejmij - Usuń z obecnego stroju" name="take_off"/>
- <menu label="Nowe ubranie" name="New Clothes">
- <menu_item_call label="Nowa koszula" name="New Shirt"/>
- <menu_item_call label="Nowe spodnie" name="New Pants"/>
- <menu_item_call label="Nowe buty" name="New Shoes"/>
- <menu_item_call label="Nowe skarpetki" name="New Socks"/>
- <menu_item_call label="Nowa kurtka" name="New Jacket"/>
- <menu_item_call label="Nowa spódnica" name="New Skirt"/>
- <menu_item_call label="Nowe rękawiczki" name="New Gloves"/>
- <menu_item_call label="Nowa podkoszulka" name="New Undershirt"/>
- <menu_item_call label="Nowa bielizna" name="New Underpants"/>
- <menu_item_call label="Nowa maska alpha" name="New Alpha"/>
- <menu_item_call label="Nowy tatuaż" name="New Tattoo"/>
- </menu>
- <menu label="Nowe części ciała" name="New Body Parts">
- <menu_item_call label="Nowy kształt" name="New Shape"/>
- <menu_item_call label="Nowa skórka" name="New Skin"/>
- <menu_item_call label="Nowe włosy" name="New Hair"/>
- <menu_item_call label="Nowe oczy" name="New Eyes"/>
- </menu>
- <menu_item_call label="Zmień nazwę stroju" name="rename"/>
- <menu_item_call label="Usuń strój" name="delete_outfit"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_outfit_tab.xml b/indra/newview/skins/minimal/xui/pl/menu_outfit_tab.xml
deleted file mode 100644
index 998e25f38e..0000000000
--- a/indra/newview/skins/minimal/xui/pl/menu_outfit_tab.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Outfit">
- <menu_item_call label="Załóż - Zastąp obecny strój" name="wear_replace"/>
- <menu_item_call label="Załóż - Dodaj do obecnego stroju" name="wear_add"/>
- <menu_item_call label="Zdejmij - Usuń z obecnego stroju" name="take_off"/>
- <menu_item_call label="Edytuj strój" name="edit"/>
- <menu_item_call label="Zmień nazwę stroju" name="rename"/>
- <menu_item_call label="Usuń strój" name="delete"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_participant_list.xml b/indra/newview/skins/minimal/xui/pl/menu_participant_list.xml
deleted file mode 100644
index 9e59102788..0000000000
--- a/indra/newview/skins/minimal/xui/pl/menu_participant_list.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Participant List Context Menu">
- <menu_item_check label="Sortuj według imienia" name="SortByName"/>
- <menu_item_check label="Sortuj według ostatniego mówcy" name="SortByRecentSpeakers"/>
- <menu_item_call label="Zobacz profil" name="View Profile"/>
- <menu_item_call label="Dodaj znajomość" name="Add Friend"/>
- <menu_item_call label="IM" name="IM"/>
- <menu_item_call label="Zadzwoń" name="Call"/>
- <menu_item_call label="Udostępnij" name="Share"/>
- <menu_item_call label="Zapłać" name="Pay"/>
- <menu_item_check label="PrzeglÄ…daj ikonki" name="View Icons"/>
- <menu_item_check label="Zablokuj głos" name="Block/Unblock"/>
- <menu_item_check label="Zablokuj tekst" name="MuteText"/>
- <context_menu label="Opcje Moderatora" name="Moderator Options">
- <menu_item_check label="Czat/IM dozwolony" name="AllowTextChat"/>
- <menu_item_call label="Wycisz tego uczestnika" name="ModerateVoiceMuteSelected"/>
- <menu_item_call label="Odblokuj wyciszenie tego uczestnika" name="ModerateVoiceUnMuteSelected"/>
- <menu_item_call label="Wycisz wszystkich" name="ModerateVoiceMute"/>
- <menu_item_call label="Cofnij wyciszenie wszystkim" name="ModerateVoiceUnmute"/>
- </context_menu>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_people_friends_view_sort.xml b/indra/newview/skins/minimal/xui/pl/menu_people_friends_view_sort.xml
deleted file mode 100644
index b62b85d30a..0000000000
--- a/indra/newview/skins/minimal/xui/pl/menu_people_friends_view_sort.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_group_plus">
- <menu_item_check label="Porządkuj według nazwy" name="sort_name"/>
- <menu_item_check label="Porządkuj według statusu" name="sort_status"/>
- <menu_item_check label="Wyświetlaj ikonki" name="view_icons"/>
- <menu_item_check label="Zobacz udzielone prawa" name="view_permissions"/>
- <menu_item_call label="Pokaż zablokowanych Rezydentów &amp; obiekty" name="show_blocked_list"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_people_groups.xml b/indra/newview/skins/minimal/xui/pl/menu_people_groups.xml
deleted file mode 100644
index ace5ebf888..0000000000
--- a/indra/newview/skins/minimal/xui/pl/menu_people_groups.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_group_plus">
- <menu_item_call label="Zobacz info" name="View Info"/>
- <menu_item_call label="Czat" name="Chat"/>
- <menu_item_call label="Rozmowa" name="Call"/>
- <menu_item_call label="Aktywuj" name="Activate"/>
- <menu_item_call label="Opuść" name="Leave"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_people_groups_view_sort.xml b/indra/newview/skins/minimal/xui/pl/menu_people_groups_view_sort.xml
deleted file mode 100644
index c70ea2315f..0000000000
--- a/indra/newview/skins/minimal/xui/pl/menu_people_groups_view_sort.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_group_plus">
- <menu_item_check label="Wyświetlaj ikonki grupy" name="Display Group Icons"/>
- <menu_item_call label="Opuść zaznaczone grupy" name="Leave Selected Group"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_people_nearby.xml b/indra/newview/skins/minimal/xui/pl/menu_people_nearby.xml
deleted file mode 100644
index 0111e0fd51..0000000000
--- a/indra/newview/skins/minimal/xui/pl/menu_people_nearby.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Avatar Context Menu">
- <menu_item_call label="Zobacz profil" name="View Profile"/>
- <menu_item_call label="Dodaj do znajomych" name="Add Friend"/>
- <menu_item_call label="Usuń z listy znajomych" name="Remove Friend"/>
- <menu_item_call label="IM" name="IM"/>
- <menu_item_call label="Zadzwoń" name="Call"/>
- <menu_item_call label="Mapa" name="Map"/>
- <menu_item_call label="Udostępnij" name="Share"/>
- <menu_item_call label="Zapłać" name="Pay"/>
- <menu_item_check label="Zablokuj/Odblokuj" name="Block/Unblock"/>
- <menu_item_call label="Teleportuj" name="teleport"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_people_nearby_multiselect.xml b/indra/newview/skins/minimal/xui/pl/menu_people_nearby_multiselect.xml
deleted file mode 100644
index dcfc48fb60..0000000000
--- a/indra/newview/skins/minimal/xui/pl/menu_people_nearby_multiselect.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Multi-Selected People Context Menu">
- <menu_item_call label="Dodaj znajomych" name="Add Friends"/>
- <menu_item_call label="Usuń znajomych" name="Remove Friend"/>
- <menu_item_call label="IM" name="IM"/>
- <menu_item_call label="Zadzwoń" name="Call"/>
- <menu_item_call label="Udostępnij" name="Share"/>
- <menu_item_call label="Zapłać" name="Pay"/>
- <menu_item_call label="Teleportuj" name="teleport"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_people_nearby_view_sort.xml b/indra/newview/skins/minimal/xui/pl/menu_people_nearby_view_sort.xml
deleted file mode 100644
index 8ec3820f84..0000000000
--- a/indra/newview/skins/minimal/xui/pl/menu_people_nearby_view_sort.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_group_plus">
- <menu_item_check label="Porządkuj według ostatnich rozmówców" name="sort_by_recent_speakers"/>
- <menu_item_check label="Porządkuj według nazwy" name="sort_name"/>
- <menu_item_check label="Porządkuj według odległości" name="sort_distance"/>
- <menu_item_check label="Wyświetlaj ikonki" name="view_icons"/>
- <menu_item_call label="Pokaż zablokowanych Rezydentów &amp; obiekty" name="show_blocked_list"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_people_recent_view_sort.xml b/indra/newview/skins/minimal/xui/pl/menu_people_recent_view_sort.xml
deleted file mode 100644
index b474a556bd..0000000000
--- a/indra/newview/skins/minimal/xui/pl/menu_people_recent_view_sort.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_group_plus">
- <menu_item_check label="Porządkuj według daty" name="sort_most"/>
- <menu_item_check label="Porządkuj według nazwy" name="sort_name"/>
- <menu_item_check label="Wyświetlaj ikonki" name="view_icons"/>
- <menu_item_call label="Pokaż zablokowanych Rezydentów &amp; obiekty" name="show_blocked_list"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_picks.xml b/indra/newview/skins/minimal/xui/pl/menu_picks.xml
deleted file mode 100644
index 6f6e4b7fa8..0000000000
--- a/indra/newview/skins/minimal/xui/pl/menu_picks.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Picks">
- <menu_item_call label="Info" name="pick_info"/>
- <menu_item_call label="Edytuj" name="pick_edit"/>
- <menu_item_call label="Teleportuj" name="pick_teleport"/>
- <menu_item_call label="Mapa" name="pick_map"/>
- <menu_item_call label="Usuń" name="pick_delete"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_picks_plus.xml b/indra/newview/skins/minimal/xui/pl/menu_picks_plus.xml
deleted file mode 100644
index e9c00f51a9..0000000000
--- a/indra/newview/skins/minimal/xui/pl/menu_picks_plus.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<toggleable_menu name="picks_plus_menu">
- <menu_item_call label="Stwórz" name="create_pick"/>
- <menu_item_call label="Nowa reklama" name="create_classified"/>
-</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_place.xml b/indra/newview/skins/minimal/xui/pl/menu_place.xml
deleted file mode 100644
index c3b72d6abb..0000000000
--- a/indra/newview/skins/minimal/xui/pl/menu_place.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<toggleable_menu name="place_overflow_menu">
- <menu_item_call label="Zapisz landmark" name="landmark"/>
- <menu_item_call label="Utwórz" name="pick"/>
- <menu_item_call label="Kup przepustkÄ™" name="pass"/>
- <menu_item_call label="Edytuj" name="edit"/>
-</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_place_add_button.xml b/indra/newview/skins/minimal/xui/pl/menu_place_add_button.xml
deleted file mode 100644
index 3d0c1c87fb..0000000000
--- a/indra/newview/skins/minimal/xui/pl/menu_place_add_button.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_folder_gear">
- <menu_item_call label="Dodaj folder" name="add_folder"/>
- <menu_item_call label="Dodaj do landmarków" name="add_landmark"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_places_gear_folder.xml b/indra/newview/skins/minimal/xui/pl/menu_places_gear_folder.xml
deleted file mode 100644
index d1f283b7aa..0000000000
--- a/indra/newview/skins/minimal/xui/pl/menu_places_gear_folder.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<toggleable_menu name="menu_folder_gear">
- <menu_item_call label="Dodaj do landmarków" name="add_landmark"/>
- <menu_item_call label="Dodaj folder" name="add_folder"/>
- <menu_item_call label="Przywróć obiekt" name="restore_item"/>
- <menu_item_call label="Wytnij" name="cut"/>
- <menu_item_call label="Kopiuj" name="copy_folder"/>
- <menu_item_call label="Wklej" name="paste"/>
- <menu_item_call label="Zmień nazwę" name="rename"/>
- <menu_item_call label="Usuń" name="delete"/>
- <menu_item_call label="Rozwiń" name="expand"/>
- <menu_item_call label="Schowaj" name="collapse"/>
- <menu_item_call label="Rozwiń wszystkie foldery" name="expand_all"/>
- <menu_item_call label="Schowaj wszystkie foldery" name="collapse_all"/>
- <menu_item_check label="Sortuj według daty" name="sort_by_date"/>
-</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_places_gear_landmark.xml b/indra/newview/skins/minimal/xui/pl/menu_places_gear_landmark.xml
deleted file mode 100644
index 0139d3a987..0000000000
--- a/indra/newview/skins/minimal/xui/pl/menu_places_gear_landmark.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<toggleable_menu name="menu_ladmark_gear">
- <menu_item_call label="Teleportuj" name="teleport"/>
- <menu_item_call label="Więcej informacji" name="more_info"/>
- <menu_item_call label="Pokaż na mapie" name="show_on_map"/>
- <menu_item_call label="Dodaj do landmarków" name="add_landmark"/>
- <menu_item_call label="Dodaj folder" name="add_folder"/>
- <menu_item_call label="Przywróć obiekt" name="restore_item"/>
- <menu_item_call label="Wytnij" name="cut"/>
- <menu_item_call label="Kopiuj landmark" name="copy_landmark"/>
- <menu_item_call label="Kopiuj SLurl" name="copy_slurl"/>
- <menu_item_call label="Wklej" name="paste"/>
- <menu_item_call label="Zmień nazwę" name="rename"/>
- <menu_item_call label="Usuń" name="delete"/>
- <menu_item_call label="Rozwiń wszystkie foldery" name="expand_all"/>
- <menu_item_call label="Schowaj wszystkie foldery" name="collapse_all"/>
- <menu_item_check label="Sortuj według daty" name="sort_by_date"/>
- <menu_item_call label="Stwórz Ulubione" name="create_pick"/>
-</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_profile_overflow.xml b/indra/newview/skins/minimal/xui/pl/menu_profile_overflow.xml
deleted file mode 100644
index ef836c8ecf..0000000000
--- a/indra/newview/skins/minimal/xui/pl/menu_profile_overflow.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<toggleable_menu name="profile_overflow_menu">
- <menu_item_call label="Mapa" name="show_on_map"/>
- <menu_item_call label="Zapłać" name="pay"/>
- <menu_item_call label="Udostępnij" name="share"/>
- <menu_item_call label="Zablokuj" name="block"/>
- <menu_item_call label="Odblokuj" name="unblock"/>
- <menu_item_call label="Wyrzuć" name="kick"/>
- <menu_item_call label="Unieruchom" name="freeze"/>
- <menu_item_call label="Uruchom" name="unfreeze"/>
- <menu_item_call label="CSR" name="csr"/>
-</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_save_outfit.xml b/indra/newview/skins/minimal/xui/pl/menu_save_outfit.xml
deleted file mode 100644
index 4bc65eca38..0000000000
--- a/indra/newview/skins/minimal/xui/pl/menu_save_outfit.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<toggleable_menu name="save_outfit_menu">
- <menu_item_call label="Zapisz" name="save_outfit"/>
- <menu_item_call label="Zapisz jako" name="save_as_new_outfit"/>
-</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_script_chiclet.xml b/indra/newview/skins/minimal/xui/pl/menu_script_chiclet.xml
deleted file mode 100644
index 256500a402..0000000000
--- a/indra/newview/skins/minimal/xui/pl/menu_script_chiclet.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="ScriptChiclet Menu">
- <menu_item_call label="Zamknij" name="Close"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_slurl.xml b/indra/newview/skins/minimal/xui/pl/menu_slurl.xml
deleted file mode 100644
index 862f538aa7..0000000000
--- a/indra/newview/skins/minimal/xui/pl/menu_slurl.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Popup">
- <menu_item_call label="O miejscu" name="about_url"/>
- <menu_item_call label="Teleportuj do miejsca" name="teleport_to_url"/>
- <menu_item_call label="Mapa" name="show_on_map"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_teleport_history_gear.xml b/indra/newview/skins/minimal/xui/pl/menu_teleport_history_gear.xml
deleted file mode 100644
index 0e58592d46..0000000000
--- a/indra/newview/skins/minimal/xui/pl/menu_teleport_history_gear.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Teleport History Gear Context Menu">
- <menu_item_call label="Rozwiń wszystkie foldery" name="Expand all folders"/>
- <menu_item_call label="Schowaj wszystkie foldery" name="Collapse all folders"/>
- <menu_item_call label="Wyczyść historię teleportacji" name="Clear Teleport History"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_teleport_history_item.xml b/indra/newview/skins/minimal/xui/pl/menu_teleport_history_item.xml
deleted file mode 100644
index cd36c116b0..0000000000
--- a/indra/newview/skins/minimal/xui/pl/menu_teleport_history_item.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Teleport History Item Context Menu">
- <menu_item_call label="Teleportuj" name="Teleport"/>
- <menu_item_call label="Więcej szczegółów" name="More Information"/>
- <menu_item_call label="Kopiuj do schowka" name="CopyToClipboard"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_teleport_history_tab.xml b/indra/newview/skins/minimal/xui/pl/menu_teleport_history_tab.xml
deleted file mode 100644
index b12df08d6a..0000000000
--- a/indra/newview/skins/minimal/xui/pl/menu_teleport_history_tab.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Teleport History Item Context Menu">
- <menu_item_call label="Otwórz" name="TabOpen"/>
- <menu_item_call label="Zamknij" name="TabClose"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_text_editor.xml b/indra/newview/skins/minimal/xui/pl/menu_text_editor.xml
deleted file mode 100644
index 812f87bc1a..0000000000
--- a/indra/newview/skins/minimal/xui/pl/menu_text_editor.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Text editor context menu">
- <menu_item_call label="Wytnij" name="Cut"/>
- <menu_item_call label="Kopiuj" name="Copy"/>
- <menu_item_call label="Wklej" name="Paste"/>
- <menu_item_call label="Usuń" name="Delete"/>
- <menu_item_call label="Zaznacz wszystko" name="Select All"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_topinfobar.xml b/indra/newview/skins/minimal/xui/pl/menu_topinfobar.xml
deleted file mode 100644
index 53536c8f1c..0000000000
--- a/indra/newview/skins/minimal/xui/pl/menu_topinfobar.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_topinfobar">
- <menu_item_check label="Pokaż współprzędne" name="Show Coordinates"/>
- <menu_item_check label="Pokaż O Posiadłości" name="Show Parcel Properties"/>
- <menu_item_call label="Landmark" name="Landmark"/>
- <menu_item_call label="Kopiuj" name="Copy"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_url_agent.xml b/indra/newview/skins/minimal/xui/pl/menu_url_agent.xml
deleted file mode 100644
index db729be725..0000000000
--- a/indra/newview/skins/minimal/xui/pl/menu_url_agent.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Url Popup">
- <menu_item_call label="Pokaż profil Rezydenta" name="show_agent"/>
- <menu_item_call label="Kopiuj nazwÄ™ do schowka" name="url_copy_label"/>
- <menu_item_call label="Kopiuj SLurl do schowka" name="url_copy"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_url_group.xml b/indra/newview/skins/minimal/xui/pl/menu_url_group.xml
deleted file mode 100644
index f340b3296a..0000000000
--- a/indra/newview/skins/minimal/xui/pl/menu_url_group.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Url Popup">
- <menu_item_call label="Pokaż szczegóły o grupie" name="show_group"/>
- <menu_item_call label="Kopiuj grupÄ™ do schowka" name="url_copy_label"/>
- <menu_item_call label="Kopiuj SLurl do schowka" name="url_copy"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_url_http.xml b/indra/newview/skins/minimal/xui/pl/menu_url_http.xml
deleted file mode 100644
index e73f7b6745..0000000000
--- a/indra/newview/skins/minimal/xui/pl/menu_url_http.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Url Popup">
- <menu_item_call label="Otwórz przeglądarkę internetową" name="url_open"/>
- <menu_item_call label="Otwórz w wewnętrzenej przeglądarce" name="url_open_internal"/>
- <menu_item_call label="Otwórz w zewnętrznej przeglądarce" name="url_open_external"/>
- <menu_item_call label="Kopiuj URL do schowka" name="url_copy"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_url_inventory.xml b/indra/newview/skins/minimal/xui/pl/menu_url_inventory.xml
deleted file mode 100644
index e36fa0dd2b..0000000000
--- a/indra/newview/skins/minimal/xui/pl/menu_url_inventory.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Url Popup">
- <menu_item_call label="Pokaż obiekt w szafie" name="show_item"/>
- <menu_item_call label="Kopiuj nazwÄ™ do schowka" name="url_copy_label"/>
- <menu_item_call label="Kopiuj SLurl do schowka" name="url_copy"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_url_map.xml b/indra/newview/skins/minimal/xui/pl/menu_url_map.xml
deleted file mode 100644
index 179ab1f676..0000000000
--- a/indra/newview/skins/minimal/xui/pl/menu_url_map.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Url Popup">
- <menu_item_call label="Pokaż na mapie" name="show_on_map"/>
- <menu_item_call label="Teleportuj do miejsca" name="teleport_to_location"/>
- <menu_item_call label="Kopiuj SLurl do schowka" name="url_copy"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_url_objectim.xml b/indra/newview/skins/minimal/xui/pl/menu_url_objectim.xml
deleted file mode 100644
index 7576208a9e..0000000000
--- a/indra/newview/skins/minimal/xui/pl/menu_url_objectim.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Url Popup">
- <menu_item_call label="Pokaż szczegóły o obiekcie" name="show_object"/>
- <menu_item_call label="Pokaż na mapie" name="show_on_map"/>
- <menu_item_call label="Teleportuj to miejsca obiektu" name="teleport_to_object"/>
- <menu_item_call label="Kopiuj nazwÄ™ obiektu do schowka" name="url_copy_label"/>
- <menu_item_call label="Kopiuj SLurl do schowka" name="url_copy"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_url_parcel.xml b/indra/newview/skins/minimal/xui/pl/menu_url_parcel.xml
deleted file mode 100644
index 1b8dd62137..0000000000
--- a/indra/newview/skins/minimal/xui/pl/menu_url_parcel.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Url Popup">
- <menu_item_call label="Pokaż szczegóły o miejscu" name="show_parcel"/>
- <menu_item_call label="Pokaż na mapie" name="show_on_map"/>
- <menu_item_call label="Kopiuj SLurl do schowka" name="url_copy"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_url_slapp.xml b/indra/newview/skins/minimal/xui/pl/menu_url_slapp.xml
deleted file mode 100644
index eb83245c48..0000000000
--- a/indra/newview/skins/minimal/xui/pl/menu_url_slapp.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Url Popup">
- <menu_item_call label="Uruchom tÄ™ komendÄ™" name="run_slapp"/>
- <menu_item_call label="Kopiuj SLurl do schowka" name="url_copy"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_url_slurl.xml b/indra/newview/skins/minimal/xui/pl/menu_url_slurl.xml
deleted file mode 100644
index 4d4a5b4c4d..0000000000
--- a/indra/newview/skins/minimal/xui/pl/menu_url_slurl.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Url Popup">
- <menu_item_call label="Pokaż szczegóły o miejscu" name="show_place"/>
- <menu_item_call label="Pokaż na mapie" name="show_on_map"/>
- <menu_item_call label="Teleportuj do miejsca" name="teleport_to_location"/>
- <menu_item_call label="Kopiuj SLurl do schowka" name="url_copy"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_url_teleport.xml b/indra/newview/skins/minimal/xui/pl/menu_url_teleport.xml
deleted file mode 100644
index e225546930..0000000000
--- a/indra/newview/skins/minimal/xui/pl/menu_url_teleport.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Url Popup">
- <menu_item_call label="Teleportuj do tego miejsca" name="teleport"/>
- <menu_item_call label="Pokaż na mapie" name="show_on_map"/>
- <menu_item_call label="Kopiuj SLurl do schowka" name="url_copy"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_viewer.xml b/indra/newview/skins/minimal/xui/pl/menu_viewer.xml
deleted file mode 100644
index 0196dc8613..0000000000
--- a/indra/newview/skins/minimal/xui/pl/menu_viewer.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu_bar name="Main Menu">
- <menu label="Pomoc" name="Help">
- <menu_item_call label="[SECOND_LIFE] Portal Pomocy" name="Second Life Help"/>
- </menu>
- <menu label="Zaawansowane" name="Advanced">
- <menu label="Skróty" name="Shortcuts">
- <menu_item_check label="Zacznij latać" name="Fly"/>
- <menu_item_call label="Zamknij okno" name="Close Window"/>
- <menu_item_call label="Zamknij wszystkie okna" name="Close All Windows"/>
- <menu_item_call label="Reset widoku" name="Reset View"/>
- </menu>
- </menu>
-</menu_bar>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_wearable_list_item.xml b/indra/newview/skins/minimal/xui/pl/menu_wearable_list_item.xml
deleted file mode 100644
index bf85246be8..0000000000
--- a/indra/newview/skins/minimal/xui/pl/menu_wearable_list_item.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Outfit Wearable Context Menu">
- <menu_item_call label="ZastÄ…p" name="wear_replace"/>
- <menu_item_call label="Załóż" name="wear_wear"/>
- <menu_item_call label="Dodaj" name="wear_add"/>
- <menu_item_call label="Zdejmij/Odłącz" name="take_off_or_detach"/>
- <menu_item_call label="Odłącz" name="detach"/>
- <context_menu label="Dołącz do" name="wearable_attach_to"/>
- <context_menu label="Dołącz do załączników HUD" name="wearable_attach_to_hud"/>
- <menu_item_call label="Zdejmij" name="take_off"/>
- <menu_item_call label="Edytuj" name="edit"/>
- <menu_item_call label="Profil obiektu" name="object_profile"/>
- <menu_item_call label="Pokaż oryginalny" name="show_original"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_wearing_gear.xml b/indra/newview/skins/minimal/xui/pl/menu_wearing_gear.xml
deleted file mode 100644
index 47cafdbd99..0000000000
--- a/indra/newview/skins/minimal/xui/pl/menu_wearing_gear.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Gear Wearing">
- <menu_item_call label="Edytuj strój" name="edit"/>
- <menu_item_call label="Zdejmij" name="takeoff"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/pl/menu_wearing_tab.xml b/indra/newview/skins/minimal/xui/pl/menu_wearing_tab.xml
deleted file mode 100644
index 7531437043..0000000000
--- a/indra/newview/skins/minimal/xui/pl/menu_wearing_tab.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Wearing">
- <menu_item_call label="Zdejmij" name="take_off"/>
- <menu_item_call label="Odłącz" name="detach"/>
- <menu_item_call label="Edytuj strój" name="edit"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/pl/notifications.xml b/indra/newview/skins/minimal/xui/pl/notifications.xml
deleted file mode 100644
index 6475a37465..0000000000
--- a/indra/newview/skins/minimal/xui/pl/notifications.xml
+++ /dev/null
@@ -1,2907 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<notifications>
- <global name="skipnexttime">
- Nie pokazuj tej opcji następnym razem
- </global>
- <global name="alwayschoose">
- Pozwalaj na wybór tej opcji
- </global>
- <global name="implicitclosebutton">
- Zamknij
- </global>
- <template name="okbutton">
- <form>
- <button name="OK_okbutton" text="$yestext"/>
- </form>
- </template>
- <template name="okignore">
- <form>
- <button name="OK_okignore" text="$yestext"/>
- </form>
- </template>
- <template name="okcancelbuttons">
- <form>
- <button name="OK_okcancelbuttons" text="$yestext"/>
- <button name="Cancel_okcancelbuttons" text="$notext"/>
- </form>
- </template>
- <template name="okcancelignore">
- <form>
- <button name="OK_okcancelignore" text="$yestext"/>
- <button name="Cancel_okcancelignore" text="$canceltext"/>
- </form>
- </template>
- <template name="okhelpbuttons">
- <form>
- <button name="OK_okhelpbuttons" text="$yestext"/>
- <button name="Help" text="$helptext"/>
- </form>
- </template>
- <template name="yesnocancelbuttons">
- <form>
- <button name="Yes" text="$yestext"/>
- <button name="No" text="$notext"/>
- <button name="Cancel_yesnocancelbuttons" text="$canceltext"/>
- </form>
- </template>
- <notification functor="GenericAcknowledge" label="Nieznany rodzaj komunikatu" name="MissingAlert">
- Twoja wersja klienta [APP_NAME] nie może wyświetlić odebranej wiadomości. Upewnij się, że posiadasz najnowszą wersję klienta.
-
-Szczegóły błędu: Błąd o nazwie &apos;[_NAME]&apos; nie został odnaleziony w pliku notifications.xml.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="FloaterNotFound">
- Błąd: nie można znaleźć następujących elementów:
-
-[CONTROLS]
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="TutorialNotFound">
- Brak samouczka na ten temat
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="GenericAlert">
- [MESSAGE]
- </notification>
- <notification name="GenericAlertYesCancel">
- [MESSAGE]
- <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="Tak"/>
- </notification>
- <notification name="BadInstallation">
- Podczas aktualizacji [APP_NAME] wystąpił błąd. Proszę odwiedzić stronę [http://get.secondlife.com pobierz najnowsza wersję] aby ściągnąć ostatnią wersję klienta.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="LoginFailedNoNetwork">
- Nie można połączyć z [SECOND_LIFE_GRID].
- &apos;[DIAGNOSTIC]&apos;
-Upewnij się, że Twoje połączenie z internetem działa.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="MessageTemplateNotFound">
- Wzór komunikatu dla [PATH] nie został odnaleziony.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="WearableSave">
- Zapisać zmiany dotyczące ubrania/części ciała?
- <usetemplate canceltext="Anuluj" name="yesnocancelbuttons" notext="Nie Zapisuj" yestext="Zapisz"/>
- </notification>
- <notification name="CompileQueueSaveText">
- W trakcie ładwania tekstu dla skryptu pojawił się problem z następującego powodu: [REASON]. Spróbuj ponownie za kilka minut.
- </notification>
- <notification name="CompileQueueSaveBytecode">
- W trakcie ładowania skompilowanego skryptu pojawił się problem z następującego powodu: [REASON]. Spróbuj ponownie za kilka minut.
- </notification>
- <notification name="WriteAnimationFail">
- Problem w zapisywaniu danych animacji. Spróbuj ponownie za kilka minut.
- </notification>
- <notification name="UploadAuctionSnapshotFail">
- W trakcie ładwania obrazu aukcji pojawił się problem z następującego powodu: [REASON].
- </notification>
- <notification name="UnableToViewContentsMoreThanOne">
- Nie można przeglądać zawartości więcej niż jednego obiektu naraz.
-Wybierz pojedynczy obiekt i spróbuj jeszcze raz.
- </notification>
- <notification name="SaveClothingBodyChanges">
- Zapisać wszystkie zmiany dotyczące ubrania/cześci ciała?
- <usetemplate canceltext="Anuluj" name="yesnocancelbuttons" notext="Nie zapisuj" yestext="Zapisz"/>
- </notification>
- <notification name="FriendsAndGroupsOnly">
- Osoby spoza listy znajomych, których rozmowy głosowe i IM są ignorowane, nie wiedzą o tym.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="FavoritesOnLogin">
- Pamiętaj: kiedy wyłączysz tą opcję, każdy kto używa tego komputera, może zobaczyć Twoją listę ulubionych miejsc.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="GrantModifyRights">
- Udzielenie praw modyfikacji innemu Rezydentowi umożliwia modyfikację, usuwanie lub wzięcie JAKIEGOKOLWIEK z Twoich obiektów. Używaj tej opcji z rozwagą!
-Czy chcesz udzielić prawa do modyfikacji [NAME]?
- <usetemplate name="okcancelbuttons" notext="Nie" yestext="Tak"/>
- </notification>
- <notification name="GrantModifyRightsMultiple">
- Udzielenie praw modyfikacji innym Rezydentom umożliwia im modyfikację, usuwanie lub wzięcie JAKIEGOKOLWIEK z Twoich obiektów. Używaj tej opcji z rozwagą!
-Czy chcesz dać prawa modyfikacji wybranym osobom?
- <usetemplate name="okcancelbuttons" notext="Nie" yestext="Tak"/>
- </notification>
- <notification name="RevokeModifyRights">
- Czy chcesz odebrać prawa do modyfikacji [NAME]?
- <usetemplate name="okcancelbuttons" notext="Nie" yestext="Tak"/>
- </notification>
- <notification name="RevokeModifyRightsMultiple">
- Czy chcesz odebrać prawa modyfikacji wybranym Rezydentom?
- <usetemplate name="okcancelbuttons" notext="Nie" yestext="Tak"/>
- </notification>
- <notification name="UnableToCreateGroup">
- Założenie grupy nie jest możliwe.
-[MESSAGE]
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="PanelGroupApply">
- [NEEDS_APPLY_MESSAGE]
-[WANT_APPLY_MESSAGE]
- <usetemplate canceltext="Anuluj" name="yesnocancelbuttons" notext="Ignoruj zmiany" yestext="Zastosuj zmiany"/>
- </notification>
- <notification name="MustSpecifyGroupNoticeSubject">
- Aby wysłać ogłoszenie do grupy musisz nadać mu tytuł.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="AddGroupOwnerWarning">
- Dodajesz członków do funkcji [ROLE_NAME].
-Ta funkcja nie może być odebrana.
-Członkowie muszą sami zrezygnować z pełnienia tej funkcji.
-Chcesz kontynuować?
- <usetemplate ignoretext="Przed dodaniem nowego właściciela do grupy, proszę potwierdzić swoją decyzję." name="okcancelignore" notext="Nie" yestext="Tak"/>
- </notification>
- <notification name="AssignDangerousActionWarning">
- Dodajesz przywilej [ACTION_NAME] do fukcji [ROLE_NAME].
-
-*UWAGA*
-Członek w funkcji z tym przywilejem może przypisać siebie i innych członków nie będących właścicielami do funkcji dających więcej przywilejów niż posiadane obecnie potencjalnie dające możliwości zbliżone do możliwości właściciela.
-Udzielaj tego przywileju z rozwagÄ….&quot;
-
-Dodać ten przywilej do funkcji [ROLE_NAME]?
- <usetemplate name="okcancelbuttons" notext="Nie" yestext="Tak"/>
- </notification>
- <notification name="AssignDangerousAbilityWarning">
- Dodajesz przywilej [ACTION_NAME] do fukcji [ROLE_NAME]
-
-*UWAGA*
-Członek w funkcji z tym przywilejem może przypisać sobie i innychm członkom nie będącym właścicielami wszystkie przywileje potencjalnie dające możliwości zbliżone do możliwości właściciela.
-Udzielaj tego przywileju z rozwagÄ….
-
-Dodać ten przywilej do funkcji [ROLE_NAME]?
- <usetemplate name="okcancelbuttons" notext="Nie" yestext="Tak"/>
- </notification>
- <notification name="AttachmentDrop">
- Wybrałeś opcję opuszczenia swojego załącznika.
- Czy chcesz kontynuować?
- <usetemplate ignoretext="Potwierdź przed zdjęciem załącznika." name="okcancelignore" notext="Nie" yestext="Tak"/>
- </notification>
- <notification name="JoinGroupCanAfford">
- Dołączenie do tej grupy kosztuje [COST]L$.
-Chcesz kontynuować?
- <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="Dołącz"/>
- </notification>
- <notification name="JoinGroupNoCost">
- Dołączasz do grupy [NAME].
-Czy chcesz kontynuować?
- <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="Akceptuj"/>
- </notification>
- <notification name="JoinGroupCannotAfford">
- Członkostwo w tej grupie kosztuje [COST]L$
-Masz za mało L$ żeby zostać członkiem.
- </notification>
- <notification name="CreateGroupCost">
- Stworzenie tej grupy kosztuje 100L$.
-W grupie powinien być więcej niż jeden członek, albo zostanie na zawsze skasowana.
-Zaproś proszę członków w ciągu 48 godzin.
- <usetemplate canceltext="Anuluj" name="okcancelbuttons" notext="Anuluj" yestext="Stwórz grupę za 100L$"/>
- </notification>
- <notification name="LandBuyPass">
- Za [COST]L$ możesz odwiedzić tą posiadłość (&apos;[PARCEL_NAME]&apos;) na [TIME] godzin. Chcesz kupić przepustkę?
- <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
- </notification>
- <notification name="SalePriceRestriction">
- Cena sprzedaży musi być wyższa niż 0L$ jeżeli sprzedajesz komukolwiek.
-Musisz wybrać kupca jeżeli chcesz sprzedać za 0L$.
- </notification>
- <notification name="ConfirmLandSaleChange">
- Posiadłość o powierzchni [LAND_SIZE] m zostaje wystawiona na sprzedaż.
-Cena wynosi [SALE_PRICE]L$ i sprzedaż będzie autoryzowana dla [NAME].
- <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
- </notification>
- <notification name="ConfirmLandSaleToAnyoneChange">
- UWAGA: Wybierając opcję &quot;Sprzedaj Każdemu&quot; udostępniasz swoją posiadłość do sprzedaży dla jakiegokolwiek Rezydenta [SECOND_LIFE] , nawet osób nieobecnych w tym regionie.
-
-Posiadłość o powierzchni [LAND_SIZE] m² zostaje wystawiona na sprzedaż.
-Cena wynosi [SALE_PRICE]L$ i sprzedaż będzie autoryzowana dla [NAME].
- <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
- </notification>
- <notification name="ReturnObjectsDeededToGroup">
- Czy na pewno chcesz zwrócić wszystkie obiekty udostępnione grupie [NAME] na tej posiadłości do szafy ich poprzednich właścicieli?
-
-*UWAGA* Wybrana opcja spowoduje usunięcie wszystkich obiektów
-udostępnionych grupie, które nie mają praw transferu!
-
-Obiekty: [N]
- <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
- </notification>
- <notification name="ReturnObjectsOwnedByUser">
- Czy na pewno chcesz zwrócić wszystkie obiekty należące do Rezydenta [NAME] znajdujące się na tej posiadłości do szafy właściciela?
-
-Obiekty: [N]
- <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
- </notification>
- <notification name="ReturnObjectsOwnedBySelf">
- Czy na pewno chcesz zwrócić wszystkie Twoje obiekty znajdujące się na tej posiadłości do swojej szafy?
-
-Obiekty: [N]
- <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
- </notification>
- <notification name="ReturnObjectsNotOwnedBySelf">
- Czy na pewno chcesz zwrócić wszystkie obiekty, których nie jesteś właścicielem znajdujące się na tej posiadłości do szaf właścicieli? Wszystkie obiekty udostępnione grupie z prawem transferu, zostaną zwrócone poprzednim właścicielom.
-
-*UWAGA* Wybrana opcja spowoduje usunięcie wszystkich obiektów udostępnionych grupie, które nie mają praw transferu!
-
-Obiekty: [N]
- <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
- </notification>
- <notification name="ReturnObjectsNotOwnedByUser">
- Czy na pewno chcesz zwrócić wszystkie obiekty, które nie należą do [NAME] znajdujące się na tej posiadłości do szaf właścicieli? Wszystkie obiekty udostępnione grupie z prawem transferu, zostaną zwrócone poprzednim właścicielom.
-
-*UWAGA* Wybrana opcja spowoduje usunięcie wszystkich obiektów udostępnionych grupie, które nie mają praw transferu!
-
-Obiekty: [N]
- <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
- </notification>
- <notification name="ReturnAllTopObjects">
- Czy na pewno chcesz zwrócić wszystkie wymienione obiekty znajdujące się na tej posiadłości do szaf ich właścicieli?
- <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
- </notification>
- <notification name="DisableAllTopObjects">
- Czy na pewno chcesz deaktywować wszystkie obiekty w tym Regionie?
- <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
- </notification>
- <notification name="ReturnObjectsNotOwnedByGroup">
- Zwrócić obiekty z tej posiadłości, które nie są udosępnione grupie [NAME] do ich właścicieli?
-
-Obiekty: [N]
- <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
- </notification>
- <notification name="UnableToDisableOutsideScripts">
- Nie można deaktywować skryptów.
-Ten region pozwala na uszkodzenia.
-Skrypty muszą pozostać aktywne dla prawidłowego działania broni.
- </notification>
- <notification name="MultipleFacesSelected">
- Obecnie zaznaczono wiele powierzchni.
-Jeśli działanie będzie kontynuowane, oddzielne media będą ustawione na wielu powierzchniach obiektu.
-W celu umieszczenia mediów tylko na jednej powierzchni skorzystaj z Wybierz powierzchnię i kliknij na wybranej powierzchni obiektu oraz kliknij Dodaj.
- <usetemplate ignoretext="Media zostanÄ… ustawione na wielu zaznaczonych powierzchniach" name="okcancelignore" notext="Anuluj" yestext="OK"/>
- </notification>
- <notification name="MustBeInParcel">
- Musisz znajdować się wewnątrz posiadłości żeby wybrać punkt lądowania.
- </notification>
- <notification name="PromptRecipientEmail">
- Proszę wpisać adres emailowy odbiorcy.
- </notification>
- <notification name="PromptSelfEmail">
- Proszę wpisać swój adres emailowy.
- </notification>
- <notification name="PromptMissingSubjMsg">
- Wysłać widokówkę z domyślnym tematem i wiadomością?
- <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
- </notification>
- <notification name="ErrorProcessingSnapshot">
- Błąd w trakcie przetwarzania danych zdjęcia.
- </notification>
- <notification name="ErrorEncodingSnapshot">
- Błąd w kodowaniu zdjęcia.
- </notification>
- <notification name="ErrorUploadingPostcard">
- W trakcie ładowania zdjęcia pojawił się problem z następującego powodu: [REASON]
- </notification>
- <notification name="ErrorUploadingReportScreenshot">
- W trakcie ładowania zdjęcia ekranu do raportu pojawił się problem z następującego powodu: [REASON]
- </notification>
- <notification name="MustAgreeToLogIn">
- Musisz zaakceptować Warunki Umowy (Terms of Service) by kontynuować logowanie się do [SECOND_LIFE].
- </notification>
- <notification name="CouldNotPutOnOutfit">
- Założenie stroju nie powiodło się.
-Folder stroju nie zawiera żadnego ubrania, części ciała ani załączników.
- </notification>
- <notification name="CannotWearTrash">
- Nie możesz założyć ubrania, które znajduje się w koszu.
- </notification>
- <notification name="MaxAttachmentsOnOutfit">
- Nie można dołączyć obiektu.
-Limit [MAX_ATTACHMENTS] załączników został przekroczony. Proszę najpierw odłączyć inny obiekt.
- </notification>
- <notification name="CannotWearInfoNotComplete">
- Nie możesz założyć tego artkułu ponieważ nie załadował się poprawnie. Spróbuj ponownie za kilka minut.
- </notification>
- <notification name="MustHaveAccountToLogIn">
- Oops! Brakuje czegoÅ›.
-Należy wprowadzić nazwę użytkownika.
-
-Potrzebujesz konta aby się zalogować do [SECOND_LIFE]. Czy chcesz utworzyć je teraz?
- <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
- </notification>
- <notification name="InvalidCredentialFormat">
- Należy wprowadzić nazwę użytkownika lub imię oraz nazwisko Twojego awatara w pole nazwy użytkownika a następnie ponownie się zalogować.
- </notification>
- <notification name="DeleteClassified">
- Usunąć reklamę &apos;[NAME]&apos;?
-Pamiętaj! Nie ma rekompensaty za poniesione koszta.
- <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
- </notification>
- <notification name="DeleteMedia">
- Wybrano usunięcie mediów związanych z tą powierzchnią.
-Czy na pewno chcesz kontynuować?
- <usetemplate ignoretext="Potwierdź przed usunięciem mediów z obiektu" name="okcancelignore" notext="Nie" yestext="Tak"/>
- </notification>
- <notification name="ClassifiedSave">
- Zapisać zmiany w reklamie [NAME]?
- <usetemplate canceltext="Anuluj" name="yesnocancelbuttons" notext="Nie Zapisuj" yestext="Zapisz"/>
- </notification>
- <notification name="ClassifiedInsufficientFunds">
- Nie posiadasz wystarczających środków aby dodać reklamę.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="DeleteAvatarPick">
- Usuń zdjęcie &lt;nolink&gt;[PICK]&lt;/nolink&gt;?
- <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
- </notification>
- <notification name="DeleteOutfits">
- Skasować wybrane stroje?
- <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
- </notification>
- <notification name="PromptGoToEventsPage">
- Odwiedzić internetową stronę Imprez [SECOND_LIFE]?
- <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
- </notification>
- <notification name="SelectProposalToView">
- Wybierz propozycję, którą chcesz zobaczyć.
- </notification>
- <notification name="SelectHistoryItemToView">
- Wybierz obiekt z historii, który chcesz zobaczyć.
- </notification>
- <notification name="CacheWillClear">
- Bufor danych zostanie wyczyszczony po restarcie aplikacji [APP_NAME].
- </notification>
- <notification name="CacheWillBeMoved">
- Bufor danych zostanie przeniesiony po restarcie aplikacji [APP_NAME].
-Pamiętaj: Opcja ta wyczyszcza bufor danych.
- </notification>
- <notification name="ChangeConnectionPort">
- Ustawienia portu zostajÄ… zaktualizowane po restarcie aplikacji [APP_NAME].
- </notification>
- <notification name="ChangeSkin">
- Nowa skórka zostanie wczytana po restarcie aplikacji [APP_NAME].
- </notification>
- <notification name="ChangeLanguage">
- Zmiana języka zadziała po restarcie [APP_NAME].
- </notification>
- <notification name="GoToAuctionPage">
- Odwiedzić stronę internetową [SECOND_LIFE] żeby zobaczyć szczgóły aukcji lub zrobić ofertę?
- <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
- </notification>
- <notification name="SaveChanges">
- Zapisać zmiany?
- <usetemplate canceltext="Anuluj" name="yesnocancelbuttons" notext="Nie zapisuj" yestext="Zapisz"/>
- </notification>
- <notification name="GestureSaveFailedTooManySteps">
- Nie można zapisać gesturki.
-Ta gesturka ma zbyt wiele etapów.
-Usuń kilka etapów i zapisz jeszcze raz.
- </notification>
- <notification name="GestureSaveFailedTryAgain">
- Zapis gesturki nie powiódł się. Spróbuj jeszcze raz za kilka minut.
- </notification>
- <notification name="GestureSaveFailedObjectNotFound">
- Nie można zapisać gesturki ponieważ obiekt lub szafa powiązanego obiektu nie został znaleziony.
-Obiekt może znajdować się zbyt daleko albo został usunięty.
- </notification>
- <notification name="GestureSaveFailedReason">
- Nie można zapisać gesturki z następującego powodu: [REASON]. Spróbuj zapisać jeszcze raz później.
- </notification>
- <notification name="SaveNotecardFailObjectNotFound">
- Nie można zapisać notki ponieważ obiekt lub szafa powiązanego obiektu nie został znaleziony.
-Obiekt może znajdować się zbyt daleko albo został usunięty.
- </notification>
- <notification name="SaveNotecardFailReason">
- Nie można zapisać notki z następującego powodu: [REASON]. Spróbuj zapisać jeszcze raz później.
- </notification>
- <notification name="ScriptCannotUndo">
- Nie można cofnąć wszystkich zmian w Twojej wersji skryptu.
-Czy chcesz załadować ostatnią wersję zapisaną na serwerze?
-(*UWAGA* Ta operacja jest nieodwracalna.)
- <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
- </notification>
- <notification name="SaveScriptFailReason">
- Nie można zapisać skryptu z następującego powodu: [REASON]. Spróbuj zapisać jeszcze raz później.
- </notification>
- <notification name="SaveScriptFailObjectNotFound">
- Nie można zapisać skryptu ponieważ obiekt w którym się zawiera nie został znaleziony.
-Obiekt może znajdować się zbyt daleko albo został usunięty.
- </notification>
- <notification name="SaveBytecodeFailReason">
- Nie można zapisać skompilowanego skryptu z następującego powodu: [REASON]. Spróbuj zapisać jeszcze raz póżniej.
- </notification>
- <notification name="StartRegionEmpty">
- Oops, Twoje miejsce startu nie zostało określone.
-Wpisz proszÄ™ nazwÄ™ regionu w lokalizacjÄ™ startu w polu Lokalizacja Startu lub wybierz Moja ostatnia lokalizacja albo Miejsce Startu.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="CouldNotStartStopScript">
- Nie można uruchomić lub zatrzymać skryptu ponieważ obiekt w którym się zawiera nie został znaleziony.
-Obiekt może znajdować się zbyt daleko albo został usunięty.
- </notification>
- <notification name="CannotDownloadFile">
- Nie można załadować pliku
- </notification>
- <notification name="CannotWriteFile">
- Nie można zapisać pliku [[FILE]]
- </notification>
- <notification name="UnsupportedHardware">
- Niestety Twój komputer nie spełnia minimalnych wymogów sprzętowych dla poprawnego działania [APP_NAME]. Możesz odczuwać bardzo niską wydajność operacyjną. Niestety portal pomocy, [SUPPORT_SITE] nie posiada informacji na temat poprawnej konfiguracji technicznej Twojego systemu.
-
-Po więcej info, odwiedź stronę [_URL] .
- <url name="url" option="0">
- http://www.secondlife.com/corporate/sysreqs.php
- </url>
- <usetemplate ignoretext="Dysk twardy mojego komputera nie jest wspomagany" name="okcancelignore" notext="Nie" yestext="Tak"/>
- </notification>
- <notification name="UnknownGPU">
- Twój system jest wyposażony w kartę graficzną, która nie jest rozpoznana przez [APP_NAME].
-Zdarza się to często w przypadku nowego sprzętu, który nie był testowany z [APP_NAME]. Prawdopodobnie wystarczy dostosowanie ustawień grafiki aby działanie było poprawne.
-(Ja &gt; Właściwości &gt; Grafika).
- <form name="form">
- <ignore name="ignore" text="Karta graficzna nie została zidentyfikowana."/>
- </form>
- </notification>
- <notification name="DisplaySettingsNoShaders">
- [APP_NAME] zawiesił się podczas inicjalizacji sterowników graficznych.
-Jakość grafiki została zmniejszona - może to pomóc.
-Pewne funkcje graficzne zostały wyłączone. Zalecamy aktualizcje sterowników graficznych.
-Możesz podnieść jakość grafiki pod Ustawienia &gt; Grafika.
- </notification>
- <notification name="RegionNoTerraforming">
- Region [REGION] nie pozwala na formowanie powierzchni ziemi.
- </notification>
- <notification name="CannotCopyWarning">
- Nie masz pozwolenia na kopiowanie następujących obiektów:
-[ITEMS]
-i stracisz je w momencie przekazania. Czy na pewno chcesz oddać te obiekty?
- <usetemplate name="okcancelbuttons" notext="Nie" yestext="Tak"/>
- </notification>
- <notification name="CannotGiveItem">
- Podarowanie obiektu nie powiodło się.
- </notification>
- <notification name="TransactionCancelled">
- Transakcja anulowana
- </notification>
- <notification name="TooManyItems">
- Jednorazowo możesz podarować maksymalnie 42 obiekty z szafy.
- </notification>
- <notification name="NoItems">
- Nie masz praw do transferu wybranych obiektów.
- </notification>
- <notification name="CannotCopyCountItems">
- Nie masz praw do skopiowania [COUNT] wybranych obiektów. Obiekty znikną z Twojej szafy.
-Na pewno chcesz oddać te obiekty?
- <usetemplate name="okcancelbuttons" notext="Nie" yestext="Tak"/>
- </notification>
- <notification name="CannotGiveCategory">
- Nie masz praw do transferu wybranego foldera.
- </notification>
- <notification name="FreezeAvatar">
- Unieruchomić tego awatara?
-Awatar tymczasowo nie będzie mógł się poruszać, nie będzie mógł używać czatu (IM) i nie będzie w stanie odziaływać na świat.
- <usetemplate canceltext="Anuluj" name="yesnocancelbuttons" notext="Odblokuj" yestext="Unieruchom"/>
- </notification>
- <notification name="FreezeAvatarFullname">
- Unieruchowmić [AVATAR_NAME]?
-Ta osoba tymczasowo nie będzie mógła się poruszać, nie będzie mógł używać czatu (IM) i nie będzie w stanie odziaływać na świat.
- <usetemplate canceltext="Anuluj" name="yesnocancelbuttons" notext="Odblokuj" yestext="Unieruchom"/>
- </notification>
- <notification name="EjectAvatarFullname">
- Wyrzucić [AVATAR_NAME] z Twojej posiadłości?
- <usetemplate canceltext="Anuluj" name="yesnocancelbuttons" notext="Wyrzuć i zabroń wstępu (ban)" yestext="Wyrzuć"/>
- </notification>
- <notification name="EjectAvatarFromGroup">
- Wyrzuć [AVATAR_NAME] z grupy [GROUP_NAME]
- </notification>
- <notification name="AcquireErrorTooManyObjects">
- BÅÄ„D OTRZYMYWANIA: Zbyt wiele wybranych obiektów.
- </notification>
- <notification name="AcquireErrorObjectSpan">
- BÅÄ„D OTRZYMYWANIA: Obiekty przekraczajÄ… granicÄ™ regionów. Przemieść wszystkie otrzymywane obiekty do jednego regionu.
- </notification>
- <notification name="PromptGoToCurrencyPage">
- [EXTRA]
-
-Odwiedź stronę [_URL] po więcej informacji na temat zakupu L$?
- <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
- </notification>
- <notification name="UnableToLinkObjects">
- Nie można połączyć [COUNT] obiektów.
-Maksymalnie można połączyć [MAX] obiektów.
- </notification>
- <notification name="CannotLinkIncompleteSet">
- Możesz łączyć tylko kompletne zbiory obiektów i musisz wybrać więcej niż jeden obiekt.
- </notification>
- <notification name="CannotLinkModify">
- Nie możesz połączyć obiektów ponieważ nie masz praw modyfikacji dla wszystkich obiektów.
-
-Upewnij się, że żaden z obiktów nie jest zablokowany i że wszystkie obiekty należą do Ciebie.
- </notification>
- <notification name="CannotLinkDifferentOwners">
- Nie możesz połączyć obiektów ponieważ należą one do różnych osób.
-
-Upewnij sie, że wszystkie wybrane obiekty należą do Ciebie.
- </notification>
- <notification name="NoFileExtension">
- Niepoprawna końcówka nazwy pliku: &apos;[FILE]&apos;
-
-Upewnij się, że nazwa pliku ma poprawaną końcówkę.
- </notification>
- <notification name="InvalidFileExtension">
- Niepoprawna końcówka nazwy pliku - [EXTENSION]
-Oczekiwana - [VALIDS]
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="CannotUploadSoundFile">
- Nie można otworzyć załadowanego pliku dźwiękowego:
-[FILE]
- </notification>
- <notification name="SoundFileNotRIFF">
- Plik nie jest w formacie RIFF WAVE:
-[FILE]
- </notification>
- <notification name="SoundFileNotPCM">
- Plik nie jest w formacie PCM WAVE:
-[FILE]
- </notification>
- <notification name="SoundFileInvalidChannelCount">
- Plik zawiera niewłaściwą liczbę kanałów (musi być mono albo stereo):
-[FILE]
- </notification>
- <notification name="SoundFileInvalidSampleRate">
- Plik zawiera niewłaścią częstotliwość (musi być 44.1k):
-[FILE]
- </notification>
- <notification name="SoundFileInvalidWordSize">
- Plik zawiera niewłaściwą szerokość danych (musi być 8 albo 16 bitów):
-[FILE]
- </notification>
- <notification name="SoundFileInvalidHeader">
- Brak bloku &apos;data&apos; w nagłówku pliku WAV:
-[FILE]
- </notification>
- <notification name="SoundFileInvalidChunkSize">
- Niewłaściwy rozmiar &quot;chunk&quot; w pliku WAV:
-[FILE]
- </notification>
- <notification name="SoundFileInvalidTooLong">
- Plik audio jest zbyt długi (10 sekund maksimum):
-[FILE]
- </notification>
- <notification name="CannotOpenTemporarySoundFile">
- Nie można otworzyć tymczasowego skompresowango pliku dźwiękowego w celu zapisu: [FILE]
- </notification>
- <notification name="UnknownVorbisEncodeFailure">
- Nieznany błąd kodowania Vorbis w: [FILE]
- </notification>
- <notification name="CannotEncodeFile">
- Kodowanie pliku: [FILE] nie powidło się.
- </notification>
- <notification name="CorruptedProtectedDataStore">
- Nie można wpisać Twojego imienia użytkownika ani hasła. To może się zdarzyć kiedy zmieniasz ustawienia sieci.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="CorruptResourceFile">
- Skorumpowany plik zasobów: [FILE]
- </notification>
- <notification name="UnknownResourceFileVersion">
- Nieznana wersja pliku zasobów Linden w pliku: [FILE]
- </notification>
- <notification name="UnableToCreateOutputFile">
- Nie można utworzyć pliku wyjściowego: [FILE]
- </notification>
- <notification name="DoNotSupportBulkAnimationUpload">
- [APP_NAME] obecnie nie wspomaga ładowania grupowego plików animacji.
- </notification>
- <notification name="CannotUploadReason">
- Åadowanie pliku [FILE] nie powiodÅ‚o siÄ™ z powodu: [REASON]
-Spróbuj jeszcze raz póżniej.
- </notification>
- <notification name="LandmarkCreated">
- Dodano &quot;[LANDMARK_NAME]&quot; do folderu [FOLDER_NAME].
- </notification>
- <notification name="LandmarkAlreadyExists">
- Posiadasz już landmark dla tej lokalizacji.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="CannotCreateLandmarkNotOwner">
- Nie możesz zapamiętać tego miejsca (LM) ponieważ właściciel posiadłości nie pozwala na to.
- </notification>
- <notification name="CannotRecompileSelectObjectsNoScripts">
- &apos;Rekompilacja&apos; nie powiodła się.
-
-Wybierz obiekty zawierajÄ…ce skrypty.
- </notification>
- <notification name="CannotRecompileSelectObjectsNoPermission">
- &apos;Rekompilacja&apos; nie powiodła się.
-
-Wybierz skryptowane obiekty do których masz prawa modyfikacji.
- </notification>
- <notification name="CannotResetSelectObjectsNoScripts">
- &apos;Resetowanie&apos; nie powiodło się.
-
-Wybierz obiekty zawierajÄ…ce skrypty.
- </notification>
- <notification name="CannotResetSelectObjectsNoPermission">
- &apos;Resetowanie&apos; nie powiodło się.
-
-Wybierz skryptowane obiekty do których masz prawa modyfikacji.
- </notification>
- <notification name="CannotOpenScriptObjectNoMod">
- Nie można otworzyć skryptu bez prawa do modyfikacji obiektu.
- </notification>
- <notification name="CannotSetRunningSelectObjectsNoScripts">
- &apos;Uruchomienie&apos; skryptów nie powiodło się.
-
-Wybierz obiekty zawierajÄ…ce skrypty.
- </notification>
- <notification name="CannotSetRunningNotSelectObjectsNoScripts">
- &apos;Zatrzymanie&apos; skryptów nie powiodło się.
-
-Wybierz obiekty zawierajÄ…ce skrypty.
- </notification>
- <notification name="NoFrontmostFloater">
- Brak górnego okna do zapisu.
- </notification>
- <notification name="SeachFilteredOnShortWords">
- Twoje zapytanie wyszukiwania zostło zmienione - zbyt krótkie słowa zostały usunięte.
-
-Nowe zapytanie: [FINALQUERY]
- </notification>
- <notification name="SeachFilteredOnShortWordsEmpty">
- Użyte terminy wyszukiwania były zbyt krótkie - wyszukiwanie zostało anulowane.
- </notification>
- <notification name="CouldNotTeleportReason">
- Teleportacja nie powiodła się.
-[REASON]
- </notification>
- <notification name="invalid_tport">
- Niestety, pojawił się błąd podczas próby teleportacji. Proponujemy wylogowanie się i spróbowanie teleportacji ponownie.
-Jeżeli nadal otrzymujesz tę wiadomość proponujemy odwiedzić stronę [SUPPORT_SITE].
- </notification>
- <notification name="invalid_region_handoff">
- Niestety, pojawił się błąd podczas próby przedostania się na drugi region. Proponujemy wylogowanie się i spróbowanie przedostania się na drugi region ponownie.
-Jeżeli nadal otrzymujesz tę wiadomość proponujemy odwiedzić stronę [SUPPORT_SITE].
- </notification>
- <notification name="blocked_tport">
- Przepraszamy, teleportacja jest chwilowo niedostępna. Spróbuj jeszcze raz.
-Jeśli nadal nie możesz się teleportować wyloguj się i ponownie zaloguj.
- </notification>
- <notification name="nolandmark_tport">
- Przepraszamy, ale nie możemy znaleźć miejsca docelowego.
- </notification>
- <notification name="timeout_tport">
- Przepraszamy, ale nie udało się przeprowadzić teleportacji. Spróbuj jeszcze raz.
- </notification>
- <notification name="noaccess_tport">
- Przepraszamy, ale nie masz dostępu do miejsca docelowego.
- </notification>
- <notification name="missing_attach_tport">
- Czekamy na Twoje akcesoria. Możesz poczekać kilka minut lub zrobić relog przed następną próbą teleportacji.
- </notification>
- <notification name="too_many_uploads_tport">
- Obecnie ten region ma problemy z ładowaniem obiektów w związku z czym teleportacja bardzo sie opóźnia.
-Spróbuj jeszcze raz za kilka minut albo teleportuj się do mniej zatłoczonego miejsca.
- </notification>
- <notification name="expired_tport">
- Przepraszamy, ale nie udało się przeprowadzić teleportacji wystarczająco szybko. Spróbuj jeszcze raz za kilka minut.
- </notification>
- <notification name="expired_region_handoff">
- Przepraszamy, ale nie udało się przeprowadzić zmiany regionu wystarczająco szybko. Spróbuj jeszcze raz za kilka minut.
- </notification>
- <notification name="no_host">
- Nie możemy znaleść miejsca docelowego. To miejsce może być chwilowo nieosiągalne albo przestało istnieć.
-Spróbuj jeszcze raz za kilka minut.
- </notification>
- <notification name="no_inventory_host">
- Szafa chwilowo nie działa.
- </notification>
- <notification name="CannotSetLandOwnerNothingSelected">
- Nie można wybrać właściciela posiadłości.
-Posiadłość nie została wybrana.
- </notification>
- <notification name="CannotSetLandOwnerMultipleRegions">
- Nie można wybrać właściciela posiadłości ponieważ wybrany obszar przekracza granicę regionów. Wybierz mniejszy obszar i spróbuj jeszcze raz.
- </notification>
- <notification name="ForceOwnerAuctionWarning">
- Ta posiadłość jest wystawiona na aukcję. Wymuszenie własności anuluje aukcję i potencjalnie może zdenerwować zainteresowanych Rezydentów, jeżeli licytacja już się rozpoczęła.
-Wymusić własność?
- <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
- </notification>
- <notification name="CannotContentifyNothingSelected">
- Nie można sfinalizować:
-Posiadłość nie została wybrana.
- </notification>
- <notification name="CannotContentifyNoRegion">
- Nie można sfinalizować:
-Region nie znaleziony.
- </notification>
- <notification name="CannotReleaseLandNothingSelected">
- Nie można porzucić posiadłości:
-Posiadłość nie została wybrana.
- </notification>
- <notification name="CannotReleaseLandNoRegion">
- Nie można porzucić posiadłości:
-Region nie znaleziony.
- </notification>
- <notification name="CannotBuyLandNothingSelected">
- Nie można kupić posiadłości:
-Posiadłość nie została wybrana.
- </notification>
- <notification name="CannotBuyLandNoRegion">
- Nie można kupić posiadłości:
-Region nie znaleziony.
- </notification>
- <notification name="CannotCloseFloaterBuyLand">
- Okno zakupu landu nie może zostać zamknięte dopóki aplikacja [APP_NAME] nie określi ceny dla tej transkacji.
- </notification>
- <notification name="CannotDeedLandNothingSelected">
- Nie można przekazać posiadłości:
-Posiadłość nie została wybrana.
- </notification>
- <notification name="CannotDeedLandNoGroup">
- Nie można przekazać posiadłości:
-Grupa nie została wybrana.
- </notification>
- <notification name="CannotDeedLandNoRegion">
- Brak możliwości przepisania posiadłości grupie:
-Region, gdzie posiadłość się znajduje nie został odnaleziony.
- </notification>
- <notification name="CannotDeedLandMultipleSelected">
- Nie można przekazać posiadłości:
-Wiele posiadłości jest wybranych.
-
-Spróbuj wybrać pojedynczą posiadłość.
- </notification>
- <notification name="CannotDeedLandWaitingForServer">
- Nie można przekazać posiadłości:
-Serwer aktualizuje dane własności.
-
-Spróbuj jeszcze raz póżniej.
- </notification>
- <notification name="CannotDeedLandNoTransfer">
- Nie możesz przekazać posiadłości:
-Region [REGION] nie pozwala na transfer posiadłości.
- </notification>
- <notification name="CannotReleaseLandWatingForServer">
- Nie można porzucić posiadłości:
-Serwer aktualizuje dane posiadłości.
-
-Spróbuj jeszcze raz póżniej.
- </notification>
- <notification name="CannotReleaseLandSelected">
- Nie możesz porzucić posiadłości:
-Nie jesteś właścicielem wszystkich wybranych posiadłości.
-
-Wybierz pojedynczą posiadłość.
- </notification>
- <notification name="CannotReleaseLandDontOwn">
- Nie możesz porzucić posiadłości:
-Nie masz praw do porzucenia tej posiadłości.
-
-Twoje posiadłości są podkreślone na zielono.
- </notification>
- <notification name="CannotReleaseLandRegionNotFound">
- Brak możliwości porzucenia posiadłości:
-Region, gdzie posiadłość się znajduje nie został odnaleziony.
- </notification>
- <notification name="CannotReleaseLandNoTransfer">
- Nie możesz porzucić posiadłości:
-Region [REGION] nie pozwala na transfer posiadłości.
- </notification>
- <notification name="CannotReleaseLandPartialSelection">
- Nie można porzucić posiadłości:
-Musisz wybrać całą posiadłość by ją porzucić.
-Wybierz całą posiadłość albo najpierw ją podziel.
- </notification>
- <notification name="ReleaseLandWarning">
- Porzucasz posiadłość o powierzchni [AREA] m².
-Porzucenie tej posiadłości usunie ją z Twoich własności.
-Nie otrzymasz za to żadnej opłaty.
-
-Porzucić posiadłość?
- <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
- </notification>
- <notification name="CannotDivideLandNothingSelected">
- Nie można podzielić posiadłości:
-
-Posiadłość nie została wybrana.
- </notification>
- <notification name="CannotDivideLandPartialSelection">
- Nie można podzielić posiadłości:
-
-Posiadłość została wybrana w całości.
-Spróbuj wybrać część posiadłości.
- </notification>
- <notification name="LandDivideWarning">
- Podział tej posiadłości stworzy dwie posiadłości z których każda będzie mogła mieć indywidualne ustawienia.
-Niektóre ustawienia zostaną zmienione na domyślne po tej operacji.
-
-Podzielić posiadłość?
- <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
- </notification>
- <notification name="CannotDivideLandNoRegion">
- Brak możliwości podziału posiadłości:
-Region, gdzie posiadłość się znajduje nie został odnaleziony.
- </notification>
- <notification name="CannotJoinLandNoRegion">
- Brak możliwości złączenia posiadłości:
-Region, gdzie posiadłość się znajduje nie został odnaleziony.
- </notification>
- <notification name="CannotJoinLandNothingSelected">
- Nie można połączyć posiadłości:
-Posiadłości nie zostały wybrane.
- </notification>
- <notification name="CannotJoinLandEntireParcelSelected">
- Nie można połączyć posiadłości:
-Tylko jedna posiadłość została wybrana.
-
-Wybierz obaszar usytuowany na obu posiadłościach.
- </notification>
- <notification name="CannotJoinLandSelection">
- Nie można połączyć posiadłości:
-Musisz wybrać więcej niż jedną posiadłość.
-
-Wybierz obaszar usytuowany na obu posiadłościach.
- </notification>
- <notification name="JoinLandWarning">
- Połączenie tego obszaru utworzy jedną większą posiadłość ze wszystkich posiadłości przecinających wybrany prostokąt. Nazwa i opcje posiadłości bedą musiały zostać skonfigurowane.
-
-Połączyć posiadłości?
- <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
- </notification>
- <notification name="ConfirmNotecardSave">
- Ta notka musi być zapisana żeby mogła być skopiowana lub zobaczona. Zapisać notkę?
- <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
- </notification>
- <notification name="ConfirmItemCopy">
- Skopiować ten obiekt do Twojej szafy?
- <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="Skopiuj"/>
- </notification>
- <notification name="ResolutionSwitchFail">
- Zmiana rozdzielczości do [RESX] x [RESY] nie powidła się
- </notification>
- <notification name="ErrorUndefinedGrasses">
- Błąd: niezdefiniowane trawy: [SPECIES]
- </notification>
- <notification name="ErrorUndefinedTrees">
- Bład: niezdefiniowane drzewa: [SPECIES]
- </notification>
- <notification name="CannotSaveWearableOutOfSpace">
- Nie można zapisać &apos;[NAME]&apos; do pliku stroju. Musisz zwolnić trochę miejsca na Twoim komputerze i zapisać strój jeszcze raz.
- </notification>
- <notification name="CannotSaveToAssetStore">
- Nie można zapisać [NAME] w centralnym zbiorze danych.
-Zazwyczaj jest to tymczasowy problem. Możesz kontynuować modyfikacje i zapisać strój ponownie za kilka minut.
- </notification>
- <notification name="YouHaveBeenLoggedOut">
- Nastąpiło wylogowanie z [SECOND_LIFE]
- [MESSAGE]
- <usetemplate name="okcancelbuttons" notext="Wyłącz" yestext="Kontynuuj"/>
- </notification>
- <notification name="OnlyOfficerCanBuyLand">
- Nie możesz kupić posiadłości dla grupy.
-Nie masz praw kupowania posiadłości dla Twojej aktywnej grupy.
- </notification>
- <notification label="Add Friend" name="AddFriendWithMessage">
- Znajomi mogą pozwalać na odnajdywanie się wzajemnie na mapie i na otrzymywanie notyfikacji o logowaniu do [SECOND_LIFE].
-
-Zaproponować znajomość [NAME]?
- <form name="form">
- <input name="message">
- Chcesz zawrzeć znajomość?
- </input>
- <button name="Offer" text="OK"/>
- <button name="Cancel" text="Anuluj"/>
- </form>
- </notification>
- <notification label="Zapisz strój" name="SaveOutfitAs">
- Zapisz to co noszę jako nowy strój:
- <form name="form">
- <input name="message">
- [DESC] (nowe)
- </input>
- <button name="OK" text="OK"/>
- <button name="Cancel" text="Anuluj"/>
- </form>
- </notification>
- <notification label="Zapisz część stroju" name="SaveWearableAs">
- Zapisz obiekt w mojej Szafie jako:
- <form name="form">
- <input name="message">
- [DESC] (nowy)
- </input>
- <button name="OK" text="OK"/>
- <button name="Cancel" text="Anuluj"/>
- </form>
- </notification>
- <notification label="Zmień nazwę stroju" name="RenameOutfit">
- Nowa nazwa stroju:
- <form name="form">
- <input name="new_name">
- [NAME]
- </input>
- <button name="OK" text="OK"/>
- <button name="Cancel" text="Anuluj"/>
- </form>
- </notification>
- <notification name="RemoveFromFriends">
- Czy chcesz usunąć [NAME] z listy znajomych?
- <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
- </notification>
- <notification name="RemoveMultipleFromFriends">
- Chcesz usunąć grupę osób z listy Twoich znajomych?
- <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
- </notification>
- <notification name="GodDeleteAllScriptedPublicObjectsByUser">
- Na pewno chcesz usunąć wszystkie skryptowane obiekty należące do
-** [AVATAR_NAME] **
-z posiadłości innych w tym symulatorze?
- <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
- </notification>
- <notification name="GodDeleteAllScriptedObjectsByUser">
- Na pewno chcesz usunąć wszystkie skryptowane obiekty należące do
-** [AVATAR_NAME] **
-ze wszystkich posiadłości w tym symulatorze?
- <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
- </notification>
- <notification name="GodDeleteAllObjectsByUser">
- Na pewno chcesz usunąć wszystkie obiekty (skryptowane i nie) należące do
-** [AVATAR_NAME] **
-ze wszystkich posiadłości w tym symulatorze?
- <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
- </notification>
- <notification name="BlankClassifiedName">
- Musisz nadać tytuł Twojej reklamie.
- </notification>
- <notification name="MinClassifiedPrice">
- Minimalna cena za publikacjÄ™ wynosi [MIN_PRICE]L$.
-
-Wybierz wyższą cenę.
- </notification>
- <notification name="ConfirmItemDeleteHasLinks">
- Co najmiej jeden z elementów, które masz posiada połączone z nim obiekty. Jeśli go usuniesz połączenia zostaną usunięte na stałe. Zaleca się usunięcie połączeń w pierwszej kolejności.
-
-Jesteś pewnien/pewna, że chcesz usunąć te elementy?
- <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
- </notification>
- <notification name="ConfirmObjectDeleteLock">
- Przynajmnie jeden z wybranych obiektów jest zablokowany.
-
-Na pewno chcesz usunąć te obiekty?
- <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
- </notification>
- <notification name="ConfirmObjectDeleteNoCopy">
- Przynajmniej jeden z wybranych obiektów jest niekopiowalny.
-
-Na pewno chcesz usunąć te obiekty?
- <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
- </notification>
- <notification name="ConfirmObjectDeleteNoOwn">
- Przynajmniej jeden z wybranych obiektów nie należy do Ciebie.
-
-Na pewno chcesz usunąć te obiekty?
- <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
- </notification>
- <notification name="ConfirmObjectDeleteLockNoCopy">
- Przynajmnie jeden z wybranych obiektów jest zablokowany.
-Przynajmniej jeden z wybranych obiektów jest niekopiwalny.
-
-Na pewno chcesz usunąć te obiekty?
- <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
- </notification>
- <notification name="ConfirmObjectDeleteLockNoOwn">
- Przynajmnie jeden z wybranych obiektów jest zablokowany.
-Przynajmniej jeden z wybranych obiektów nie należy do Ciebie.
-
-Na pewno chcesz usunąć te obiekty?
- <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
- </notification>
- <notification name="ConfirmObjectDeleteNoCopyNoOwn">
- Przynajmniej jeden z wybranych obiektów jest niekopiowalny.
-Przynajmniej jeden z wybranych obiektów nie należy do Ciebie.
-
-Na pewno chcesz usunąć te obiekty?
- <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
- </notification>
- <notification name="ConfirmObjectDeleteLockNoCopyNoOwn">
- Przynajmnie jeden z wybranych obiektów jest zablokowany.
-Przynajmniej jeden z wybranych obiektów jest niekopiwalny.
-Przynajmniej jeden z wybranych obiektów nie należy do Ciebie.
-
-Na pewno chcesz usunąć te obiekty?
- <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
- </notification>
- <notification name="ConfirmObjectTakeLock">
- Przynajmnie jeden obiekt jest zablokowany.
-
-Na pewno chcesz usunąć te obiekty?
- <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
- </notification>
- <notification name="ConfirmObjectTakeNoOwn">
- Przynajmniej jeden obiekt nie należy do Ciebie.
-Jeżeli będziesz kontynuować prawa następnego właściciela zostaną przypisane co, potencjalnie, może ograniczyć Twoje prawa do modyfikacji lub kopiowania obiektów.
-
-Na pewno chcesz wziąść te obiekty?
- <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
- </notification>
- <notification name="ConfirmObjectTakeLockNoOwn">
- Przynajmnie jeden obiekt jest zablokowany.
-Przynajmniej jeden obiekt nie należy do Ciebie.
-Jeżeli będziesz kontynuować prawa następnego właściciela zostaną przypisane co, potencjalnie, może ograniczyć Twoje prawa do modyfikacji lub kopiowania obiektów.
-
-Na pewno chcesz wziąść te obiekty?
- <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
- </notification>
- <notification name="CantBuyLandAcrossMultipleRegions">
- Nie możesz kupić posiadłości ponieważ wybrany obszar przekracza granicę regionów.
-
-Wybierz mniejszy obszar i spróbuj jeszcze raz.
- </notification>
- <notification name="DeedLandToGroup">
- Po przekazaniu tej posiadłości grupa będzia musiała mieć i utrzymywać wystarczający kredyt na używanie posiadłości. Cena zakupu posiadłości nie jest zwracana właścicielowi. Jeżeli przekazana posiadłość zostanie sprzedana, cana sprzedaży zostanie podzielona pomiędzy członków grupy.
-
-Przekazać tą posiadłość o powierzchni [AREA] m² grupie &apos;[GROUP_NAME]&apos;?
- <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
- </notification>
- <notification name="DeedLandToGroupWithContribution">
- Po przekazaniu tej posiadłości grupa będzia musiała mieć i utrzymywać wystarczający kredyt na używanie posiadłości.
-Przekazanie będzie zawierać równoczesne przypisanie posiadłości do grupy od &apos;[NAME]&apos;.
-Cena zakupu posiadłości nie jest zwracana właścicielowi. Jeżeli przekazana posiadłość zostanie sprzedana, cana sprzedaży zostanie podzielona pomiędzy członków grupy.
-
-Przekazać tą posiadłość o powierzchni [AREA] m² grupie &apos;[GROUP_NAME]&apos;?
- <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
- </notification>
- <notification name="DisplaySetToSafe">
- Ustawienia grafiki zostały zmienione do bezpiecznego poziomu ponieważ opcja -safe została wybrana.
- </notification>
- <notification name="DisplaySetToRecommended">
- Ustawienia grafiki zostały zmienione do zalecanego poziomu na podstawie konfiguracji Twojego systemu.
- </notification>
- <notification name="ErrorMessage">
- [ERROR_MESSAGE]
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="AvatarMovedDesired">
- Miejsce, do którego chcesz się teleportować jest chwilowo nieobecne.
-Zostałeś przeniesiony do regionu sąsiedniego.
- </notification>
- <notification name="AvatarMovedLast">
- Twoje miejsce startu jest obecnie niedostępne.
-Zostałeś przeniesiony do sąsiedniego regionu.
- </notification>
- <notification name="AvatarMovedHome">
- Twoje miejsce startu jest obecnie niedostępne.
-Zostałeś przeniesiony do pobliskiego regionu.
-Możesz ustawić nowe miejsce startu.
- </notification>
- <notification name="ClothingLoading">
- Twoje ubranie wciąż się ładuje.
-Możesz normalnie używać [SECOND_LIFE], inni użytkownicy będą Cię widzieli poprawnie.
- <form name="form">
- <ignore name="ignore" text="Åadowanie ubraÅ„ nadal trwa"/>
- </form>
- </notification>
- <notification name="FirstRun">
- Instalacja [APP_NAME] zakończona.
-
-Jeżeli używasz [SECOND_LIFE] po raz pierwszy to musisz stworzyć konto żeby móc się zalogować.
-Czy chcesz przejść na stronę [http://join.secondlife.com secondlife.com] żeby stworzyć nowe konto?
- <usetemplate name="okcancelbuttons" notext="Kontynuuj" yestext="Nowe konto..."/>
- </notification>
- <notification name="LoginPacketNeverReceived">
- Problemy z połączeniem. Problem może być spowodowany Twoim połączeniem z Internetem albo może istnieć po stronie [SECOND_LIFE_GRID].
-
-Możesz sprawdzić swoje połączenie z Internetem i spróbować ponownie za kilka minut lub połączyć się ze stroną pomocy technicznej tutaj [SUPPORT_SITE] lub wybrać Teleportuj by teleportować się do swojego miejsca startu.
- <form name="form">
- <button name="OK" text="OK"/>
- <button name="Help" text="Pomoc"/>
- <button name="Teleport" text="Teleportuj"/>
- </form>
- </notification>
- <notification name="WelcomeChooseSex">
- Twoja postać pojawi się za moment.
-
-Używaj strzałek żeby sie poruszać.
-Naciśnij F1 w dowolnej chwili po pomoc albo żeby dowiedzieć się więcej o [SECOND_LIFE].
-Wybierz awatara właściwej płci.
-Ten wybór będzie można później zmienić.
- <usetemplate name="okcancelbuttons" notext="Kobieta" yestext="Mężczyzna"/>
- </notification>
- <notification name="CantTeleportToGrid">
- Nie można teleportować do [SLURL], ponieważ jest na innym gridzie ([GRID]) niż obecny grid ([CURRENT_GRID]). Proszę zamknąć przeglądarkę i spróbować ponownie.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="GeneralCertificateError">
- Połączenie z serwerem nie mogło zostać nawiązane.
-[REASON]
-
-SubjectName: [SUBJECT_NAME_STRING]
-IssuerName: [ISSUER_NAME_STRING]
-Valid From: [VALID_FROM]
-Valid To: [VALID_TO]
-MD5 Fingerprint: [SHA1_DIGEST]
-SHA1 Fingerprint: [MD5_DIGEST]
-Key Usage: [KEYUSAGE]
-Extended Key Usage: [EXTENDEDKEYUSAGE]
-Subject Key Identifier: [SUBJECTKEYIDENTIFIER]
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="TrustCertificateError">
- Wydawca certyfikatu dla tego serwera nie jest znany.
-
-Informacje o certyfikacie:
-SubjectName: [SUBJECT_NAME_STRING]
-IssuerName: [ISSUER_NAME_STRING]
-Valid From: [VALID_FROM]
-Valid To: [VALID_TO]
-MD5 Fingerprint: [SHA1_DIGEST]
-SHA1 Fingerprint: [MD5_DIGEST]
-Key Usage: [KEYUSAGE]
-Extended Key Usage: [EXTENDEDKEYUSAGE]
-Subject Key Identifier: [SUBJECTKEYIDENTIFIER]
-
-Czy chcesz zaufać temu wydawcy?
- <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="Zaufaj"/>
- </notification>
- <notification name="NotEnoughCurrency">
- [NAME] [PRICE]L$ Masz za mało L$.
- </notification>
- <notification name="GrantedModifyRights">
- Masz teraz prawa modyfikacji obiektów należących do [NAME].
- </notification>
- <notification name="RevokedModifyRights">
- Prawa modyfikacji obiektów należących do [NAME] zostały Ci odebrane.
- </notification>
- <notification name="FlushMapVisibilityCaches">
- To spowoduje wyczyszczenie buforów map regionu.
-Jest to użyteczne wyłącznie podczas szukania błędów.
-(Podczas produkcji poczekaj 5 minut i mapy wszystkich zostanÄ… uaktualnione po relogu.)
- <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
- </notification>
- <notification name="BuyOneObjectOnly">
- Nie możesz zakupić więcej niż jednego obiektu w tym samym czasie. Proszę wybrać tylko jeden obiekt i spróbować ponowanie.
- </notification>
- <notification name="OnlyCopyContentsOfSingleItem">
- Nie można kopiować zawartości więcej niż jednego obiektu naraz.
-Wybierz pojedynczy obiekt i spróbuj jeszcze raz.
- <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
- </notification>
- <notification name="KickUsersFromRegion">
- Teleportować wszystkich Rezydentów z tego regionu to ich miejsca startu?
- <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
- </notification>
- <notification name="EstateObjectReturn">
- Na pewno chcesz odesłać wszystkie obiekty należące do
-[USER_NAME] ?
- <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
- </notification>
- <notification name="InvalidTerrainBitDepth">
- Nie można ustawić tekstur regionu:
-Tekstura terenu [TEXTURE_NUM] ma niewłaściwą głębię koloru - [TEXTURE_BIT_DEPTH].
-Zamień teksturę [TEXTURE_NUM] na 24-o bitową teksturę o wymiarze 512x512 lub mniejszą i ponownie kliknij Zastosuj.
- </notification>
- <notification name="InvalidTerrainSize">
- Nie można ustawić tekstur regionu:
-Tekstura terenu [TEXTURE_NUM] jest za duża - [TEXTURE_SIZE_X]x[TEXTURE_SIZE_Y].
-Zamień teksturę [TEXTURE_NUM] na 24-o bitową teksturę o wymiarze 512x512 lub mniejszą i ponownie kliknij Zastosuj.
- </notification>
- <notification name="RawUploadStarted">
- Åadowanie rozpoczÄ™te. Może potrwać do dwóch minut zależnie od prÄ™dkoÅ›ci Twojego połączenia.
- </notification>
- <notification name="ConfirmBakeTerrain">
- Na pewno chcesz zapisać obecne ukształtowanie terenu jako punkt odniesienia dla górnego i dolnego limitu terenu i jako domyślą wartość dla opcji Odtwórz?
- <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
- </notification>
- <notification name="MaxAllowedAgentOnRegion">
- Maksymalna liczba gości wynosi [MAX_AGENTS].
- </notification>
- <notification name="MaxBannedAgentsOnRegion">
- Maksymalna liczba niepożądanych Rezydentów (banów) wynosi [MAX_BANNED].
- </notification>
- <notification name="MaxAgentOnRegionBatch">
- Próba dodania [NUM_ADDED] osób nie powiodła się:
-[MAX_AGENTS] [LIST_TYPE] limit przekroczony o [NUM_EXCESS].
- </notification>
- <notification name="MaxAllowedGroupsOnRegion">
- Możesz mieć maksymalnie [MAX_GROUPS] dozwolonych grup.
- <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="Ustal"/>
- </notification>
- <notification name="MaxManagersOnRegion">
- Możesz mieć maksymalnie [MAX_MANAGER] zarządców Majątku.
- </notification>
- <notification name="OwnerCanNotBeDenied">
- Nie możesz dodać właściciela majątku do listy &apos;Niepożądanych Rezydentów (banów)&apos; majątku.
- </notification>
- <notification name="CanNotChangeAppearanceUntilLoaded">
- Nie możesz zmienić wyglądu podczas ładowania ubrań i kształtów.
- </notification>
- <notification name="ClassifiedMustBeAlphanumeric">
- Tytuł Twojej reklamy musi zaczynać się od litery (A-Z) albo cyfry. Znaki przestankowe są niedozwolone.
- </notification>
- <notification name="CantSetBuyObject">
- Nie możesz wybrać Kup obiekt ponieważ obiekt nie jest na sprzedaż.
-Wybierz obiekt na sprzedaż i spróbuj jeszcze raz.
- </notification>
- <notification name="FinishedRawDownload">
- Plik surowego terenu załadowany pod:
-[DOWNLOAD_PATH].
- </notification>
- <notification name="DownloadWindowsMandatory">
- Nowa wersja [APP_NAME] została opublikowana.
-[MESSAGE]
-Musisz zainstalować nową wersję żeby używać [APP_NAME].
- <usetemplate name="okcancelbuttons" notext="Wyłącz program" yestext="Załaduj"/>
- </notification>
- <notification name="DownloadWindows">
- Uaktualniona wersja [APP_NAME] została opublikowana.
-[MESSAGE]
-Aktualizacja nie jest wymagana ale jest zalecana w celu poprawy prędkości i stabilności.
- <usetemplate name="okcancelbuttons" notext="Kontynuuj" yestext="Załaduj"/>
- </notification>
- <notification name="DownloadWindowsReleaseForDownload">
- Uaktualniona wersja [APP_NAME] została opublikowana.
-[MESSAGE]
-Aktualizacja nie jest wymagana ale jest zalecana w celu poprawy prędkości i stabilności.
- <usetemplate name="okcancelbuttons" notext="Kontynuuj" yestext="Załaduj"/>
- </notification>
- <notification name="DownloadLinuxMandatory">
- Nowa wersja [APP_NAME] jest dostępna.
-[MESSAGE]
-Musisz pobrać aktualizację aby korzystać z [APP_NAME].
- <usetemplate name="okcancelbuttons" notext="Wyjdź" yestext="Pobieranie"/>
- </notification>
- <notification name="DownloadLinux">
- Aktualizacja [APP_NAME] jest dostępna.
-[MESSAGE]
-Ta aktualizacja nie jest wymagana ale zaleca się jej instalację w celu poprawienia szybkości i stabilności.
- <usetemplate name="okcancelbuttons" notext="Kontynuuj" yestext="Pobieranie"/>
- </notification>
- <notification name="DownloadLinuxReleaseForDownload">
- Uaktualniona wersja [APP_NAME]została opublikowana.
-[MESSAGE]
-Aktualizacja nie jest wymagana ale jest zalecana w celu poprawy prędkości i stabilności.
- <usetemplate name="okcancelbuttons" notext="Kontynuuj" yestext="Pobieranie"/>
- </notification>
- <notification name="DownloadMacMandatory">
- Nowa wersja [APP_NAME] została opublikowana.
-[MESSAGE]
-Musisz zainstalować nową wersję żeby używać [APP_NAME].
-
-Pobrać i zapisać w folderze Aplikacji?
- <usetemplate name="okcancelbuttons" notext="Wyłącz program" yestext="Załaduj"/>
- </notification>
- <notification name="DownloadMac">
- Uaktualniona wersja [APP_NAME] została opublikowana.
-[MESSAGE]
-Aktualizacja nie jest wymagana ale jest zalecana w celu poprawy prędkości i stabilności.
-
-Pobrać i zapisać w folderze Aplikacji?
- <usetemplate name="okcancelbuttons" notext="Kontynuuj" yestext="Załaduj"/>
- </notification>
- <notification name="DownloadMacReleaseForDownload">
- Uaktualniona wersja [APP_NAME] została opublikowana.
-[MESSAGE]
-Aktualizacja nie jest wymagana ale jest zalecana w celu poprawy prędkości i stabilności.
-
-Pobrać i zapisać w folderze Aplikacji?
- <usetemplate name="okcancelbuttons" notext="Kontynuuj" yestext="Załaduj"/>
- </notification>
- <notification name="FailedUpdateInstall">
- Podczas aktualizacji pojawił się błąd. Proszę pobrać i zainstalować najnowszego klienta z http://secondlife.com/download.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="FailedRequiredUpdateInstall">
- Nie można zainstalować wymaganej aktualizacji. Nie będzie można zalogować się dopóki [APP_NAME] nie zostanie zaktualizowana.
- Proszę pobrać i zainstalować najnowszą wersję z http://secondlife.com/download.
- <usetemplate name="okbutton" yestext="Rezygnuj"/>
- </notification>
- <notification name="UpdaterServiceNotRunning">
- Istnieje obowiązkowa aktualizacja dla Second Life. Możesz ją pobrać z http://www.secondlife.com/downloads lub zainstalować teraz.
- <usetemplate name="okcancelbuttons" notext="Opuść Second Life" yestext="Pobierz i zainstaluj teraz"/>
- </notification>
- <notification name="DownloadBackgroundTip">
- Aktualizacja dla [APP_NAME] została pobrana.
-Wersja [VERSION] [[RELEASE_NOTES_FULL_URL] Informacja o tej aktualizacji]
- <usetemplate name="okcancelbuttons" notext="Później..." yestext="Zainstaluj teraz i restartuj [APP_NAME]"/>
- </notification>
- <notification name="DownloadBackgroundDialog">
- Aktualizacja [APP_NAME] została pobrana.
-Wersja [VERSION] [[RELEASE_NOTES_FULL_URL] Informacja o aktualizacji]
- <usetemplate name="okcancelbuttons" notext="Później..." yestext="Zainstaluj teraz i restartuj [APP_NAME]"/>
- </notification>
- <notification name="RequiredUpdateDownloadedVerboseDialog">
- Pobrano wymaganÄ… aktualizacjÄ™.
-Wersja [VERSION]
-
-W celu instalacji aktualizacji musi zostać wykonany restart [APP_NAME].
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="RequiredUpdateDownloadedDialog">
- W celu instalacji aktualizacji musi zostać wykonany restart [APP_NAME].
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="DeedObjectToGroup">
- Przekazanie tego obiektu spowoduje, że grupa:
-* Otrzyma L$ zapłacone temu obiektowi
- <usetemplate ignoretext="Proszę potwierdzić decyzję przed przepisaniem obiektu do grupy" name="okcancelignore" notext="Anuluj" yestext="Przekaż"/>
- </notification>
- <notification name="WebLaunchExternalTarget">
- Czy chcesz otworzyć swoją przeglądarkę internetową by zobaczyć zawartość?
- <usetemplate ignoretext="Uruchom przeglądarkę internetową by zobaczyć stronę internetową" name="okcancelignore" notext="Anuluj" yestext="OK"/>
- </notification>
- <notification name="WebLaunchJoinNow">
- By dokonać zmian i aktualizacji swojego konta, odwiedź [http://secondlife.com/account/ Dashboard].
- <usetemplate ignoretext="Uruchom przeglądarkę internetową by dokonać zmian w konfiguracji mojego konta" name="okcancelignore" notext="Anuluj" yestext="OK"/>
- </notification>
- <notification name="WebLaunchSecurityIssues">
- Odwiedź [SECOND_LIFE] Wiki i zobacz jak zgłaszać problemy z bezpieczeństwem danych.
- <usetemplate ignoretext="Uruchom przeglądarkę internetową by dowiedzieć się więcej na temat zgłaszania problemów bezpieczeństwa" name="okcancelignore" notext="Anuluj" yestext="OK"/>
- </notification>
- <notification name="WebLaunchQAWiki">
- Odwiedź [SECOND_LIFE] Wiki pytań i odpowiedzi.
- <usetemplate ignoretext="Uruchom przeglądarkę internetową by zobaczyć QA Wiki" name="okcancelignore" notext="Anuluj" yestext="OK"/>
- </notification>
- <notification name="WebLaunchPublicIssue">
- Odwiedź [SECOND_LIFE] katalog publicznych problemów, gdzie możesz zgłaszać błędy i inne problemy.
- <usetemplate ignoretext="Uruchom przeglądarkę internetową by wysłać Błędy klienta" name="okcancelignore" notext="Anuluj" yestext="OK"/>
- </notification>
- <notification name="WebLaunchSupportWiki">
- Otwórz oficjalny blog Lindenów żeby zobaczyć nowe wiadomości i informacje.
- <usetemplate ignoretext="Uruchom przeglądarkę internetową by zobaczyć blog" name="okcancelignore" notext="Anuluj" yestext="OK"/>
- </notification>
- <notification name="WebLaunchLSLGuide">
- Czy chcesz otworzyć samouczek Języka skryptowania?
- <usetemplate ignoretext="Uruchom przeglądarkę internetową by samouczek Języka skryptowania" name="okcancelignore" notext="Anuluj" yestext="OK"/>
- </notification>
- <notification name="WebLaunchLSLWiki">
- Czy napewno chcesz odwiedzić portal LSL Portal?
- <usetemplate ignoretext="Uruchom przeglÄ…darkÄ™ internetowÄ… by LSL Portal" name="okcancelignore" notext="Anuluj" yestext="OK"/>
- </notification>
- <notification name="ReturnToOwner">
- Czy na pewno chcesz zwrócić wybrane obiekty do ich właścicieli? Wszystkie udostępnione obiekty z prawem transferu zostaną zwrócone poprzednim właścicielom.
-
-*UWAGA* Wszystkie udostępnione obiekty bez prawa transferu zostaną usunięte!
- <usetemplate ignoretext="Potwierdź zanim zwrócisz obiekty do ich właścicieli" name="okcancelignore" notext="Anuluj" yestext="OK"/>
- </notification>
- <notification name="GroupLeaveConfirmMember">
- Jesteś członkiem grupy [GROUP].
-Chcesz opuścić grupę?
- <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
- </notification>
- <notification name="ConfirmKick">
- Napewno chcesz wyrzucić wszystkich Rezydentów z gridu?
- <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="Wyrzuć wszystkich Rezydentów"/>
- </notification>
- <notification name="MuteLinden">
- Przepraszamy, ale nie możesz zablokować Lindena.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="CannotStartAuctionAlreadyForSale">
- Aukcja nie może zostać rozpoczęta w posiadłości, która została już wcześniej wystawiona na aukcję. Deaktywuj opcję sprzedaży posiadłości jeżeli chcesz rozpocząć aukcję.
- </notification>
- <notification label="Zablokuj obiekty według wpisanej nazwy" name="MuteByNameFailed">
- Rezydent/obiekt jest już zablokowany.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="RemoveItemWarn">
- Pomimo, że jest to dozwolone, usunięcie zawartości może zniszczyć obiekt. Chcesz usunąć?
- <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
- </notification>
- <notification name="CantOfferCallingCard">
- Nie możesz dać wizytówki w tym momencie. Spróbuj jeszcze raz za chwilę.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="CantOfferFriendship">
- Nie możesz zaoferować znajomości w tym momencie. Spróbuj jeszcze raz za chwilę.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="BusyModeSet">
- Tryb Pracy jest włączony.
-Czat i IM będą ukryte. Wysłane IM będą otrzymywały Twoją odpowiedź Trybu Pracy. Propozycje teleportacji będą odrzucone.
-Dodatkowo, wszystkie podarowane dla Ciebie obiekty będą automatycznie zapisywane w folderze &quot;Kosz&quot; w Twojej szafie.
- <usetemplate ignoretext="Status zmieniony na Tryb pracy" name="okignore" yestext="OK"/>
- </notification>
- <notification name="JoinedTooManyGroupsMember">
- Należysz już do maksymalnej ilości grup. Opuść proszę przynajmniej jedną grupę żeby przyjąć członkostwo w tej grupie, albo odmów.
-[NAME] oferuje Ci członkostwo w grupie.
- <usetemplate name="okcancelbuttons" notext="Odmów" yestext="Przyjmij"/>
- </notification>
- <notification name="JoinedTooManyGroups">
- Należysz już do maksymalnej ilości grup. Opuść proszę przynajmiej jedną grupę żeby przyjąć członkostwo w tej grupie, albo odmów.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="KickUser">
- Wyrzuć tego Rezydenta, wysyłając następujący komunikat.
- <form name="form">
- <input name="message">
- Administrator wylogował Cię.
- </input>
- <button name="OK" text="OK"/>
- <button name="Cancel" text="Anuluj"/>
- </form>
- </notification>
- <notification name="KickAllUsers">
- Z jakim komunikatem wyrzucić wszystkich użytkowników z regionu?
- <form name="form">
- <input name="message">
- Administrator wylogował Cię.
- </input>
- <button name="OK" text="OK"/>
- <button name="Cancel" text="Anuluj"/>
- </form>
- </notification>
- <notification name="FreezeUser">
- Unieruchom tego Rezydenta, wysyłając następujący komunikat.
- <form name="form">
- <input name="message">
- Unieruchomiono Cię. Nie możesz się ruszać ani rozmawiać. Administrator skontaktuje się z Tobą poprzez IM.
- </input>
- <button name="OK" text="OK"/>
- <button name="Cancel" text="Anuluj"/>
- </form>
- </notification>
- <notification name="UnFreezeUser">
- Cofnij unieruchomienie tego Rezydenta, wysyłając następujący komunikat.
- <form name="form">
- <input name="message">
- Odblokowano CiÄ™.
- </input>
- <button name="OK" text="OK"/>
- <button name="Cancel" text="Anuluj"/>
- </form>
- </notification>
- <notification name="SetDisplayNameSuccess">
- Witaj [DISPLAY_NAME]!
-
-Podobnie jak w realnym życiu potrzeba trochę czasu zanim wszyscy dowiedzą się o nowej nazwie. Kolejne kilka dni zajmie [http://wiki.secondlife.com/wiki/Setting_your_display_name aktualizacja nazwy] w obiektach, skryptach, wyszukiwarce, etc.
- </notification>
- <notification name="SetDisplayNameBlocked">
- Przepraszamy, nie można zmienić Twojej wyświetlanej nazwy. Jeśli uważasz ze jest to spowodowane błędem skontaktuj się z obsługą klienta.
- </notification>
- <notification name="SetDisplayNameFailedLength">
- Przepraszamy, ta nazwa jest zbyt długa. Wyświetlana nazwa może mieć maksymalnie [LENGTH] znaków.
-
-Proszę wprowadzić krótszą nazwę.
- </notification>
- <notification name="SetDisplayNameFailedGeneric">
- Przepraszamy, nie można ustawić Twojej wyświetlanej nazwy. Spróbuj ponownie później.
- </notification>
- <notification name="SetDisplayNameMismatch">
- Podana wyświetlana nazwa nie pasuje. Proszę wprowadzić ją ponownie.
- </notification>
- <notification name="AgentDisplayNameUpdateThresholdExceeded">
- Przepraszamy, musisz jeszcze poczekać zanim będzie można zmienić Twoją wyświetlaną nazwę.
-
-Zobacz http://wiki.secondlife.com/wiki/Setting_your_display_name
-
-Proszę spróbować ponownie później.
- </notification>
- <notification name="AgentDisplayNameSetBlocked">
- Przepraszamy, nie można ustawić wskazanej nazwy, ponieważ zawiera zabronione słowa.
-
- Proszę spróbować wprowadzić inną nazwę.
- </notification>
- <notification name="AgentDisplayNameSetInvalidUnicode">
- Wyświetlana nazwa, którą chcesz ustawić zawiera niepoprawne znaki.
- </notification>
- <notification name="AgentDisplayNameSetOnlyPunctuation">
- Twoje wyświetlane imię musi zawierać litery inne niż znaki interpunkcyjne.
- </notification>
- <notification name="DisplayNameUpdate">
- [OLD_NAME] ([SLID]) jest od tej pory znana/znany jako [NEW_NAME].
- </notification>
- <notification name="OfferTeleport">
- Zaproponować teleportację do miejsca Twojego pobytu z tą wiadomością?
- <form name="form">
- <input name="message">
- Zapraszam do siebie. Region: [REGION]
- </input>
- <button name="OK" text="OK"/>
- <button name="Cancel" text="Anuluj"/>
- </form>
- </notification>
- <notification name="OfferTeleportFromGod">
- Wysłać propozycję teleportacji do Twojego miejsca?
- <form name="form">
- <input name="message">
- Zapraszam do siebie. Region: [REGION]
- </input>
- <button name="OK" text="OK"/>
- <button name="Cancel" text="Anuluj"/>
- </form>
- </notification>
- <notification name="TeleportFromLandmark">
- Na pewno chcesz się teleportować do &lt;nolink&gt;[LOCATION]&lt;/nolink&gt;?
- <usetemplate ignoretext="Potwierdź próbę teleportacji do zapisanego miejsca" name="okcancelignore" notext="Anuluj" yestext="Teleportuj"/>
- </notification>
- <notification name="TeleportToPick">
- Teleportuj do [PICK]?
- <usetemplate ignoretext="Potwierdź, że chcesz teleportować się do miejsca w Ulubionych" name="okcancelignore" notext="Anuluj" yestext="Teleportuj"/>
- </notification>
- <notification name="TeleportToClassified">
- Teleportuj do [CLASSIFIED]?
- <usetemplate ignoretext="Potwierdź, że chcesz teleportować się do lokalizacji z reklamy" name="okcancelignore" notext="Anuluj" yestext="Teleportuj"/>
- </notification>
- <notification name="TeleportToHistoryEntry">
- Teleportuj do [HISTORY_ENTRY]?
- <usetemplate ignoretext="Potwierdź teleportację do lokalizacji z historii" name="okcancelignore" notext="Anuluj" yestext="Teleportuj"/>
- </notification>
- <notification label="Wiadomość do Wszystkich w Twoim Majątku" name="MessageEstate">
- Wpisz krótką wiadomość która zostanie wysłana do wszystkich osób w Twoim majątku.
- <form name="form">
- <input name="message"/>
- <button name="OK" text="OK"/>
- <button name="Cancel" text="Anuluj"/>
- </form>
- </notification>
- <notification label="Zmiana Majątku Lindenów" name="ChangeLindenEstate">
- Czy napewno chcesz zmienić ustawienia majątku Linden (mainland, teen grid, orientacja, itp).
-
-Jest to wyjątkowo niebezpieczna decyzja, odczuwalna przez wszystkich Rezydentów. Dla mainland, spowoduje to zmianę tysięcy regionów oraz ich przestrzeń serwerową.
-
-Kontynuować?
- <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
- </notification>
- <notification label="Zmiana Dostępu do Majątku Lindenów" name="ChangeLindenAccess">
- Dokonujesz zmiany w liście dostępu Regionu głównego należącego do Lindenów (Regiony Główne, Teen Grid, Orientacja).
-
-Żądana operacja jest wyjątkowo niebezpieczna dla wszystkich Rezydentów przebywających w regionie i powinna być używana wyłącznie w celu zablokowania opcji pozwalającej na przeniesienie obiektów/L$ do/z sieci.
-Dodatkowo, zmiany dokonane w Regionie Głównym mogą spowodować problemy przestrzeni serwerowej innych regionów.
-
-Kontynuować?
- <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
- </notification>
- <notification label="Wybierz MajÄ…tek" name="EstateAllowedAgentAdd">
- Dodać do listy dostępu do tego majątku czy do [ALL_ESTATES]?
- <usetemplate canceltext="Anuluj" name="yesnocancelbuttons" notext="Wszystkie majÄ…tki" yestext="Ten majÄ…tek"/>
- </notification>
- <notification label="Wybierz MajÄ…tek" name="EstateAllowedAgentRemove">
- Usunąć z listy dostępu do tego majątku czy do [ALL_ESTATES]?
- <usetemplate canceltext="Anuluj" name="yesnocancelbuttons" notext="Wszystkie majÄ…tki" yestext="Ten majÄ…tek"/>
- </notification>
- <notification label="Wybierz MajÄ…tek" name="EstateAllowedGroupAdd">
- Dodać do listy dostępu grup do tego majątku czy do [ALL_ESTATES]?
- <usetemplate canceltext="Anuluj" name="yesnocancelbuttons" notext="Wszystkie majÄ…tki" yestext="Ten majÄ…tek"/>
- </notification>
- <notification label="Wybierz MajÄ…tek" name="EstateAllowedGroupRemove">
- Usunąć z listy dostępu grup do tego majątku czy do [ALL_ESTATES]?
- <usetemplate canceltext="Anuluj" name="yesnocancelbuttons" notext="Wszystkie majÄ…tki" yestext="Ten majÄ…tek"/>
- </notification>
- <notification label="Wybierz MajÄ…tek" name="EstateBannedAgentAdd">
- Zablokować dostęp do tego majątku czy do [ALL_ESTATES]?
- <usetemplate canceltext="Anuluj" name="yesnocancelbuttons" notext="Wszystkie majÄ…tki" yestext="Ten majÄ…tek"/>
- </notification>
- <notification label="Wybierz MajÄ…tek" name="EstateBannedAgentRemove">
- Zdjąć tego Rezydenta z listy niepożądanych (bany) dla tego majątku czy dla [ALL_ESTATES]?
- <usetemplate canceltext="Anuluj" name="yesnocancelbuttons" notext="Wszystkie majÄ…tki" yestext="Ten majÄ…tek"/>
- </notification>
- <notification label="Wybierz MajÄ…tek" name="EstateManagerAdd">
- Dodać zarządce majątku do tego majątku czy do [ALL_ESTATES]?
- <usetemplate canceltext="Anuluj" name="yesnocancelbuttons" notext="Wszystkie majÄ…tki" yestext="Ten majÄ…tek"/>
- </notification>
- <notification label="Wybierz MajÄ…tek" name="EstateManagerRemove">
- Usunąć zarządce majątku z tego majątku czy z [ALL_ESTATES]?
- <usetemplate canceltext="Anuluj" name="yesnocancelbuttons" notext="Wszystkie majÄ…tki" yestext="Ten majÄ…tek"/>
- </notification>
- <notification label="Potwierdź Wyrzucenie" name="EstateKickUser">
- Wyrzucić [EVIL_USER] z tego majątku?
- <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
- </notification>
- <notification name="EstateChangeCovenant">
- Na pewno chcesz zminić treść umowy dla tego majątku?
- <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
- </notification>
- <notification name="RegionEntryAccessBlocked">
- Ze względu na Twój wiek, nie jesteś uprawniony do przebywania w tym regionie. Może być to wynikiem braku informacji na temat weryfikacji Twojego wieku.
-
-Upewnij się, że masz zainstalowaną najnowszą wersję klienta i skorzystaj z [SECOND_LIFE]:Pomoc by uzyskać więcej informacji na temat dostępu do regionów z podanym rodzajem treści jaką zawiera.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="RegionEntryAccessBlocked_KB">
- Ze względu na Twój wiek, nie jesteś uprawniony do przebywania w tym regionie.
-
-Skorzystaj z [SECOND_LIFE]:Pomoc by uzyskać więcej informacji na temat dostępu do regionów z podanym rodzajem treści jaką zawiera.
- <url name="url">
- https://support.secondlife.com/ics/support/default.asp?deptID=4417&amp;task=knowledge&amp;questionID=6010
- </url>
- <usetemplate ignoretext="Ze względu na Twój wiek, nie jesteś uprawniony do przebywania w tym regionie. Może być to wynikiem braku informacji na temat weryfikacji Twojego wieku." name="okcancelignore" notext="Zamknij" yestext="[SECOND_LIFE]:Pomoc"/>
- </notification>
- <notification name="RegionEntryAccessBlocked_Notify">
- Ze względu na Twój wiek, nie jesteś uprawniony do przebywania w tym regionie.
- </notification>
- <notification name="RegionEntryAccessBlocked_Change">
- Nie masz zezwolenia na przebywanie w tym Regionie z powodu Twojego statusu ustawień wieku.
-
-W celu uzyskania dostępu do tego regiony zmień proszę swój status ustawień wieku. Będziesz mógł/mogła szukać i mieć dostęp do treści [REGIONMATURITY]. W celu cofnięcia zmian wybierz z menu Ja &gt; Ustawienia &gt; Ogólne.
- <form name="form">
- <button name="OK" text="Zmień ustawienia"/>
- <button default="true" name="Cancel" text="Zamknij"/>
- <ignore name="ignore" text="Moje ustawienia wieku nie dopuszczajÄ… do regionu"/>
- </form>
- </notification>
- <notification name="PreferredMaturityChanged">
- Twoja obecna klasyfikacja wieku to [RATING].
- </notification>
- <notification name="LandClaimAccessBlocked">
- W związku ze statusem ustawień Twojego wieku, nie możesz odzyskać tej posiadłości. Możesz potrzebować weryfikacji wieku bądź instalacji najnowszej wersji klienta.
-
-Upewnij się, że masz zainstalowaną najnowszą wersję klienta i skorzystaj z [SECOND_LIFE]:Pomoc by uzyskać więcej informacji na temat dostępu do regionów z podanym rodzajem treści jaką zawiera.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="LandClaimAccessBlocked_KB">
- Ze względu na Twój wiek, nie możesz odzyskać tej posiadłości.
-
-Skorzystaj z [SECOND_LIFE]:Pomoc by uzyskać więcej informacji na temat dostępu do regionów z podanym rodzajem treści jaką zawiera.
- <url name="url">
- https://support.secondlife.com/ics/support/default.asp?deptID=4417&amp;task=knowledge&amp;questionID=6010
- </url>
- <usetemplate ignoretext="W związku ze statusem ustawień Twojego wieku, nie możesz odzyskać tej posiadłości." name="okcancelignore" notext="Zamknij" yestext="[SECOND_LIFE]:Pomoc"/>
- </notification>
- <notification name="LandClaimAccessBlocked_Notify">
- Ze względu na Twój wiek, nie możesz odzyskać tej posiadłości.
- </notification>
- <notification name="LandClaimAccessBlocked_Change">
- W związku ze statusem ustawień Twojego wieku, nie możesz odzyskać tej posiadłości.
-
-Możesz wybrać &apos;Zmień Ustawienia&apos; by dokonać zmian w ustawieniach Twojego wieku by uzyskać dostęp do regionu. Wówczas będziesz w stanie znaleźć oraz mieć dostęp do [REGIONMATURITY] treści. Jeżeli zdecydujesz się na powrót do poprzednich ustawień, wybierz Ja &gt; Ustawienia &gt; Główne.
- <usetemplate ignoretext="Ze względu na Twój wiek, nie możesz odzyskać tej posiadłości." name="okcancelignore" notext="Zamknij" yestext="Zmień Ustawienia"/>
- </notification>
- <notification name="LandBuyAccessBlocked">
- Ze względu na Twój wiek, nie możesz kupić tej posiadłości. Może być to wynikiem braku informacji na temat weryfikacji Twojego wieku.
-
-Upewnij się, że masz zainstalowaną najnowszą wersję klienta i skorzystaj z [SECOND_LIFE]:Pomoc by uzyskać więcej informacji na temat dostępu do regionów z podanym rodzajem treści jaką zawiera.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="LandBuyAccessBlocked_KB">
- Ze względu na Twój wiek, nie możesz kupić tej posiadłości.
-
-Skorzystaj z [SECOND_LIFE]:Pomoc by uzyskać więcej informacji na temat dostępu do regionów z podanym rodzajem treści jaką zawiera.
- <url name="url">
- https://support.secondlife.com/ics/support/default.asp?deptID=4417&amp;task=knowledge&amp;questionID=6010
- </url>
- <usetemplate ignoretext="Ze względu na Twój wiek, nie możesz kupić tej posiadłości." name="okcancelignore" notext="Zamknij" yestext="[SECOND_LIFE]:Pomoc"/>
- </notification>
- <notification name="LandBuyAccessBlocked_Notify">
- Ze względu na Twój wiek, nie możesz kupić tej posiadłości.
- </notification>
- <notification name="LandBuyAccessBlocked_Change">
- W związku ze statusem ustawień Twojego wieku, nie możesz kupić tej posiadłości.
-
-Możesz wybrać &apos;Zmień Ustawienia&apos; by dokonać zmian w ustawieniach Twojego wieku by uzyskać dostęp do regionu. Wówczas będziesz w stanie znaleźć oraz mieć dostęp do [REGIONMATURITY] treści. Jeżeli zdecydujesz się na powrót do poprzednich ustawień, wybierz Ja &gt; Ustawienia &gt; Główne.
- <usetemplate ignoretext="W związku ze statusem ustawień Twojego wieku, nie możesz kupić tej posiadłości." name="okcancelignore" notext="Zamknij" yestext="Zmień Ustawienia"/>
- </notification>
- <notification name="TooManyPrimsSelected">
- Zbyt wiele wybranych obiektów. Wybierz [MAX_PRIM_COUNT] lub mniej i spróbuj ponownie
- </notification>
- <notification name="ProblemImportingEstateCovenant">
- Problem z importem umowy majÄ…tku.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="ProblemAddingEstateManager">
- Problemy z dodawaniem nowego zarządcy majątku. Jeden lub więcaj majątk może mieć wypełnioną listę zarządców.
- </notification>
- <notification name="ProblemAddingEstateGeneric">
- Problemy z dodawaniem do listy majątku. Jeden lub więcaj majątk może mieć wypełnioną listę.
- </notification>
- <notification name="UnableToLoadNotecardAsset">
- Brak możliwości załadowania noty w tej chwili.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="NotAllowedToViewNotecard">
- NiewystarczajÄ…ce prawa do zobaczenia notki przypisanej do wybranego ID.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="MissingNotecardAssetID">
- ID notki nie znalezione w bazie danych.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="PublishClassified">
- Pamiętaj: Opłaty za reklamę są bezzwrotne.
-
-Zamieścić tą reklamę za [AMOUNT]L$?
- <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
- </notification>
- <notification name="SetClassifiedMature">
- Czy ta reklama zawiera treść &apos;Mature&apos;?
- <usetemplate canceltext="Anuluj" name="yesnocancelbuttons" notext="Nie" yestext="Tak"/>
- </notification>
- <notification name="SetGroupMature">
- Czy ta grupa zawiera treść &apos;Mature&apos;?
- <usetemplate canceltext="Anuluj" name="yesnocancelbuttons" notext="Nie" yestext="Tak"/>
- </notification>
- <notification label="Potwierdź Restart" name="ConfirmRestart">
- Na pewno chcesz zrobić restart tego regionu za 2 minuty?
- <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
- </notification>
- <notification label="Wiadomość do Wszystkich w tym Regionie" name="MessageRegion">
- Wpisz krótką wiadomość która zostanie wysłana do wszystkich osób w tym regionie.
- <form name="form">
- <input name="message"/>
- <button name="OK" text="OK"/>
- <button name="Cancel" text="Anuluj"/>
- </form>
- </notification>
- <notification label="Zmienione Restrykcje Wieku dla Regionu" name="RegionMaturityChange">
- Ustawienie restrykcji wieku dla regionu zostało zmienione.
-Zazwyczaj musi upłynąć nieco czasu zanim ta zmiana zostanie odzwierciedlona na mapie.
-
-Aby wejść do regionu Adult, Rezydenci muszą posiadać zweryfikowane konto, albo w wyniku weryfikacji wieku albo płatości.
- </notification>
- <notification label="Wersja Niezgodna z Systemem Rozmów" name="VoiceVersionMismatch">
- Ta wersja [APP_NAME] nie jest kompatybilna z systemem rozmów w tym Regionie. Musisz zainstalować aktualną wersję [APP_NAME] aby komunikacja głosowa działała poprawnie.
- </notification>
- <notification label="Nie Można Kupić Obiektów" name="BuyObjectOneOwner">
- Jednorazowo możesz kupować tylko od jednego właściciela.
-Wybierz pojedynczy obiekt i spróbuj jeszcze raz.
- </notification>
- <notification label="Nie Można Kupić Zawartości" name="BuyContentsOneOnly">
- Jednorazowo możesz kupić zawartość tylko jednego obiektu.
-Wybierz pojedynczy obiekt i spróbuj jeszcze raz.
- </notification>
- <notification label="Nie Można Kupić Zawartości" name="BuyContentsOneOwner">
- Jednorazowo możesz kupować tylko od jednego właściciela.
-Wybierz pojedynczy obiekt i spróbuj jeszcze raz.
- </notification>
- <notification name="BuyOriginal">
- Kupić oryginalny obiekt od [OWNER] za [PRICE]L$?
-Zostaniesz właścicielem tego obiektu z następującymi prawami:
- Modyfikacje: [MODIFYPERM]
- Kopiowanie: [COPYPERM]
- Odsprzedawanie i oddawanie: [RESELLPERM]
- <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
- </notification>
- <notification name="BuyOriginalNoOwner">
- Kupić oryginalny obiekt za [PRICE]L$?
-Zostaniesz właścicielem tego obiektu z następującymi prawami:
- Modyfikacje: [MODIFYPERM]
- Kopiowanie: [COPYPERM]
- Odsprzedawanie i oddawanie: [RESELLPERM]
- <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
- </notification>
- <notification name="BuyCopy">
- Kupić kopię obiektu od [OWNER] za [PRICE]L$?
-Obiekt zostanie skopiowany do Twojej szafy z następującymi prawami:
- Modyfikacje: [MODIFYPERM]
- Kopiowanie: [COPYPERM]
- Odsprzedawanie i oddawanie: [RESELLPERM]
- <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
- </notification>
- <notification name="BuyCopyNoOwner">
- Kupić kopię obiektu za [PRICE]L$?
-Obiekt zostanie skopiowany do Twojej szafy z następującymi prawami:
- Modyfikacje: [MODIFYPERM]
- Kopiowanie: [COPYPERM]
- Odsprzedawanie i oddawanie: [RESELLPERM]
- <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
- </notification>
- <notification name="BuyContents">
- Kupić zawartość od [OWNER] za [PRICE]L$?
-Zawartość zostanie skopiowana do Twojej szafy.
- <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
- </notification>
- <notification name="BuyContentsNoOwner">
- Kupić zawartość za [PRICE]L$?
-Zawartość zostanie skopiowana do Twojej szafy.
- <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
- </notification>
- <notification name="ConfirmPurchase">
- Ta transakcja spowoduje:
-[ACTION]
-
-Na pewno chcesz dokonać tego zakupu?
- <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
- </notification>
- <notification name="ConfirmPurchasePassword">
- Ta transakcja spowoduje:
-[ACTION]
-
-Na pewno chcesz dokonać tego zakupu?
-Wpisz hasło ponownie i kliknij OK.
- <form name="form">
- <input name="message"/>
- <button name="ConfirmPurchase" text="OK"/>
- <button name="Cancel" text="Anuluj"/>
- </form>
- </notification>
- <notification name="SetPickLocation">
- Uwaga:
-Lokalizacja tego wyboru została zaktualizowana ale pozostałe szczegóły zachowają oryginalne wartości.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="MoveInventoryFromObject">
- Wybrane obiekty Szafy nie majÄ… praw kopiowania.
-Obiekty zostanÄ… przeniesione do Twojej Szafy, nie zostanÄ… skopiowane.
-
-Przenieść obiekty Szafy?
- <usetemplate ignoretext="Uprzedź przed przeniesieniem zawartości niekopiowalnej z obiektu" name="okcancelignore" notext="Anuluj" yestext="OK"/>
- </notification>
- <notification name="MoveInventoryFromScriptedObject">
- Wybrane obiekty Szafy nie majÄ… praw kopiowania.
-Obiekty zostanÄ… przeniesione do Twojej Szafy, nie zostanÄ… skopiowane.
-Ponieważ obiekty zawierają skrypty, przeniesienie obiektów do Twojej Szafy może spowodować niepoprawne działanie skryptów.
-
-Przenieść obiekty szafy?
- <usetemplate ignoretext="Uprzedź przed przeniesieniem zawartości niekopiowalnej z obiektu, która może uszkodzić skrypty obiektu" name="okcancelignore" notext="Anuluj" yestext="OK"/>
- </notification>
- <notification name="ClickActionNotPayable">
- Uwaga: Opcja Zapłać obiektowi została wybrana, ale żeby ta opcja działała musi być dodany skrypt z funkcją money().
- <form name="form">
- <ignore name="ignore" text="Opcja Zapłać Obiektowi została aktywowana podczas budowania obiektów bez skryptu z funkcją money()."/>
- </form>
- </notification>
- <notification name="OpenObjectCannotCopy">
- W tym obiekcie nie ma elementów które możesz skopiować.
- </notification>
- <notification name="WebLaunchAccountHistory">
- Przejść na stronę [http://secondlife.com/account/ Dashboard] żeby zobaczyć historię konta?
- <usetemplate ignoretext="Uruchom przeglądarkę internetową by zobaczyć historię konta" name="okcancelignore" notext="Anuluj" yestext="Idź na stronę"/>
- </notification>
- <notification name="ConfirmQuit">
- Na pewno chcesz skończyć?
- <usetemplate ignoretext="Na pewno chcesz skończyć?" name="okcancelignore" notext="Nie kończ" yestext="Wyłącz"/>
- </notification>
- <notification name="DeleteItems">
- [QUESTION]
- <usetemplate ignoretext="Potwierdź, że na pewno chcesz skasować obiekty" name="okcancelignore" notext="Cofnij" yestext="OK"/>
- </notification>
- <notification name="HelpReportAbuseEmailLL">
- Używaj tej opcji do zgłaszania nadużyć [http://secondlife.com/corporate/tos.php Warunków Umowy (Terms of Service)] i [http://secondlife.com/corporate/cs.php Standardów Społeczeństwa (Community Standards)].
-
-Wszystkie zgłoszone nadużycia są badane i rozwiązywane.
- </notification>
- <notification name="HelpReportAbuseSelectCategory">
- Wybierz kategorię dla tego raportu o nadużyciu.
-Określenie kategorii pomoże nam w klasyfikacji i prztwarzaniu raportu.
- </notification>
- <notification name="HelpReportAbuseAbuserNameEmpty">
- Wprowadź imię i nazwisko osoby popełniającej nadużycie.
-Dokładne dane pomogą nam w klasyfikacji i prztwarzaniu raportu.
- </notification>
- <notification name="HelpReportAbuseAbuserLocationEmpty">
- Wprowadź nazwę miejsca gdzie popełniono nadużycie.
-Dokładne dane pomogą nam w klasyfikacji i prztwarzaniu raportu.
- </notification>
- <notification name="HelpReportAbuseSummaryEmpty">
- Wprowadź opis popełnionego nadużycia.
-Dokładne dane pomogą nam w klasyfikacji i prztwarzaniu raportu.
- </notification>
- <notification name="HelpReportAbuseDetailsEmpty">
- Wprowadź szczgółowy opis popełnionego nadużycia.
-Podaj maksymalną ilość szczgółów oraz imiona i nazwiska osób związanych z nadużyciem które zgłaszasz.
-Dokładne dane pomogą nam w klasyfikacji i prztwarzaniu raportu.
- </notification>
- <notification name="HelpReportAbuseContainsCopyright">
- Szanowny Rezydencie,
-
-Jeżeli składasz raport dotyczący naruszenia praw autorskich proszę się upewnić, że robisz to poprawnie:
-
-(1) Przypadek Nadużycia. Możesz złożyć raport jeżeli sądzisz, że Rezydent narusza system przywilejów [SECOND_LIFE], na przykład używając CopyBot lub podobnych narzędzi robiących kopie, naruszając prawa autorskie. Komisja Nadużyć bada wykroczenia i stosuje akcje dyscyplinarne za zachowania sprzeczne z zasadami Warunków Umowy [SECOND_LIFE] [http://secondlife.com/corporate/tos.php Terms of Service] i Standardów Społeczeństwa [http://secondlife.com/corporate/cs.php Community Standards]. Komisja Nadużyć nie zajmuje się i nie odpowiada na żądania usunięcia treści ze środowiska [SECOND_LIFE].
-
-(2) Przypadek DMCA lub Usuwanie Treści. Aby wystąpić z żądaniem o usunięcie treści ze środowiska [SECOND_LIFE] MUSISZ przedłożyć ważne zawiadomienie o nadużyciu zgodne z naszą polityką DMCA [http://secondlife.com/corporate/dmca.php DMCA Policy].
-
-Jeżeli chcesz kontynuować dalej zamknij to okno i dokończ wysyłanie raportu. Może być potrzebny wybór kategorii &apos;CopyBot albo Nadużycie Przywilejów&apos;.
-
-Dziękujemy,
-
-Linden Lab
- </notification>
- <notification name="FailedRequirementsCheck">
- Brak następujących wymaganych komponentów w [FLOATER]:
-[COMPONENTS]
- </notification>
- <notification label="Zamień Istniejący Dodatek" name="ReplaceAttachment">
- Obecnie masz już dołączony obiekt do tej części Twojego ciała.
-Chcesz go zamienić na wybrany obiekt?
- <form name="form">
- <ignore name="ignore" save_option="true" text="Obecnie masz już dołączony obiekt do tej części Twojego ciała.Chcesz go zamienić na wybrany obiekt?"/>
- <button ignore="Zamień automatycznie" name="Yes" text="OK"/>
- <button ignore="Nie zamieniaj" name="No" text="Anuluj"/>
- </form>
- </notification>
- <notification label="Ostrzeżenie Trybu Pracy" name="BusyModePay">
- Jesteś w Trybie pracy co oznacza, że nie dostaniesz żadnych obiektów w zamian za tą opłatę.
-
-Chcesz wyłączyć Tryb pracy przed zakończeniem tej tranzakcji?
- <form name="form">
- <ignore name="ignore" save_option="true" text="Jesteś w Trybie Pracy co oznacza, że nie dostaniesz żadnych obiektów w zamian za tą opłatę. Chcesz wyłączyć Tryb Pracy przed zakończeniem tej transakcji?"/>
- <button ignore="Zawsz wyłączaj tryb pracy" name="Yes" text="OK"/>
- <button ignore="Nie wyłączaj trybu pracy" name="No" text="Anuluj"/>
- </form>
- </notification>
- <notification name="ConfirmDeleteProtectedCategory">
- Ten folder &apos;[FOLDERNAME]&apos; to folder systemowy. Usunięcie foldera systemowego spowoduje niestabilność. Czy na pewno chcesz go skasować?
- <usetemplate ignoretext="Potwierdź zanim folder systemu zostanie skasowany" name="okcancelignore" notext="Anuluj" yestext="OK"/>
- </notification>
- <notification name="ConfirmEmptyTrash">
- Na pewno chcesz permanentnie usunąć zawartość Kosza?
- <usetemplate ignoretext="Potwierdź przed usunięciem zawartości Kosza" name="okcancelignore" notext="Anuluj" yestext="OK"/>
- </notification>
- <notification name="ConfirmClearBrowserCache">
- Na pewno chcesz wyczyścić bufor przeglądarki?
- <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
- </notification>
- <notification name="ConfirmClearCookies">
- Na pewno chcesz wyczyścić ciasteczka?
- <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="Tak"/>
- </notification>
- <notification name="ConfirmClearMediaUrlList">
- Na pewno chcesz wyczyścić listę zapisanych linków?
- <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="Tak"/>
- </notification>
- <notification name="ConfirmEmptyLostAndFound">
- Na pewno chcesz permanentnie usunąć zawartość Twojego foldera Zgubione i odnalezione?
- <usetemplate ignoretext="Potwierdź przed usunięciem zawartości foldera Zagubione i odnalezione" name="okcancelignore" notext="Nie" yestext="Tak"/>
- </notification>
- <notification name="CopySLURL">
- Następujący link SLURL został skopiowany do schowka:
- [SLURL]
-
-Zamieść go na stronie internetowej żeby umożliwić innym łatwy dostęp do tego miejsca, albo wklej go do panela adresu Twojej przeglądarki żeby go otworzyć.
- <form name="form">
- <ignore name="ignore" text="SLurl skopiowany do schowka"/>
- </form>
- </notification>
- <notification name="WLSavePresetAlert">
- Chcesz zmienić zapisane ustawienia?
- <usetemplate name="okcancelbuttons" notext="Nie" yestext="Tak"/>
- </notification>
- <notification name="WLDeletePresetAlert">
- Chcesz usunąć [SKY]?
- <usetemplate name="okcancelbuttons" notext="Nie" yestext="Tak"/>
- </notification>
- <notification name="WLNoEditDefault">
- Nie możesz edytować lub usunąć domyślnych ustawień.
- </notification>
- <notification name="WLMissingSky">
- Ten plik cyklu dziennego używa brakującego pliku nieba: [SKY].
- </notification>
- <notification name="PPSaveEffectAlert">
- Efekt post-procesu już istnieje. Chcesz zapisać nowy na jego miejsce?
- <usetemplate name="okcancelbuttons" notext="Nie" yestext="Tak"/>
- </notification>
- <notification name="NewSkyPreset">
- Nazwij nowe niebo.
- <form name="form">
- <input name="message">
- Nowe ustawienie
- </input>
- <button name="OK" text="OK"/>
- <button name="Cancel" text="Anuluj"/>
- </form>
- </notification>
- <notification name="ExistsSkyPresetAlert">
- Ustawienie już istnieje!
- </notification>
- <notification name="NewWaterPreset">
- Nazwij nowe ustawienie wody.
- <form name="form">
- <input name="message">
- Nowe ustawienie
- </input>
- <button name="OK" text="OK"/>
- <button name="Cancel" text="Anuluj"/>
- </form>
- </notification>
- <notification name="ExistsWaterPresetAlert">
- Ustawienie już istnieje!
- </notification>
- <notification name="WaterNoEditDefault">
- Domyślne ustawienie nie może być zmienione ani usunięte.
- </notification>
- <notification name="ChatterBoxSessionStartError">
- Błąd podczas rozpoczynania czatu/IM z [RECIPIENT].
-[REASON]
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="ChatterBoxSessionEventError">
- [EVENT]
-[REASON]
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="ForceCloseChatterBoxSession">
- Twój czat/IM z [NAME] zostanie zamknięty.
-[REASON]
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="Cannot_Purchase_an_Attachment">
- Rzeczy nie mogą być kupione jeżeli są częścią załącznika.
- </notification>
- <notification label="Prośba o Zgodę na Pobieranie L$" name="DebitPermissionDetails">
- Akceptując tą prośbę wyrażasz zgodę na ciągłe pobieranie Lindenów (L$) z Twojego konta. Żeby cofnąć to pozwolenie właściciel obiektu będzie musiał usunąć ten obiekt albo zresetowć skrypty obieku.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="AutoWearNewClothing">
- Czy chcesz automatycznie nosić ubranie które tworzysz?
- <usetemplate ignoretext="Załóż ubranie automatycznie będąc w trybie Edycji Wyglądu" name="okcancelignore" notext="Nie" yestext="Tak"/>
- </notification>
- <notification name="NotAgeVerified">
- Nie masz dostępu do tej posiadłości ze względu na brak weryfikacji Twojego wieku. Czy chcesz odwiedzić stronę [SECOND_LIFE] żeby to zmienić?
-
-[_URL]
- <url name="url" option="0">
- https://secondlife.com/account/verification.php
- </url>
- <usetemplate ignoretext="Brak weryfikacji wieku" name="okcancelignore" notext="Nie" yestext="Tak"/>
- </notification>
- <notification name="Cannot enter parcel: no payment info on file">
- Nie masz dostępu do tej posiadłości ze względu na brak danych o Twoim koncie. Czy chcesz odwiedzić stronę [SECOND_LIFE] żeby to zmienić?
-
-[_URL]
- <url name="url" option="0">
- https://secondlife.com/account/
- </url>
- <usetemplate ignoretext="Brak danych o koncie" name="okcancelignore" notext="Nie" yestext="Tak"/>
- </notification>
- <notification name="MissingString">
- Zdanie [STRING_NAME] nie znalezione w strings.xml
- </notification>
- <notification name="SystemMessageTip">
- [MESSAGE]
- </notification>
- <notification name="IMSystemMessageTip">
- [MESSAGE]
- </notification>
- <notification name="Cancelled">
- Anulowane
- </notification>
- <notification name="CancelledSit">
- Siadanie anulowane
- </notification>
- <notification name="CancelledAttach">
- Dołączenie anulowane
- </notification>
- <notification name="ReplacedMissingWearable">
- Barkujące ubranie/części ciała zastąpiono domyślnymi obiektami.
- </notification>
- <notification name="GroupNotice">
- Temat: [SUBJECT], Treść: [MESSAGE]
- </notification>
- <notification name="FriendOnline">
- [NAME] jest w Second Life
- </notification>
- <notification name="FriendOffline">
- [NAME] opuszcza Second Life
- </notification>
- <notification name="AddSelfFriend">
- Nie możesz dodać siebie do listy znajomych.
- </notification>
- <notification name="UploadingAuctionSnapshot">
- Åadowanie obrazu z Internetu...
-(Zajmuje około 5 minut.)
- </notification>
- <notification name="UploadPayment">
- Åadowanie kosztowaÅ‚o [AMOUNT]L$.
- </notification>
- <notification name="UploadWebSnapshotDone">
- Åadowanie obrazu z Internetu zakoÅ„czne pomyÅ›lnie.
- </notification>
- <notification name="UploadSnapshotDone">
- Åadowanie zdjÄ™cia zakoÅ„czone pomyÅ›lnie.
- </notification>
- <notification name="TerrainDownloaded">
- Plik terrain.raw ściągniety.
- </notification>
- <notification name="GestureMissing">
- Gesturka [NAME] nie znaleziony w bazie danych.
- </notification>
- <notification name="UnableToLoadGesture">
- Åadowanie gesturki [NAME] nie powiodÅ‚o siÄ™.
- </notification>
- <notification name="LandmarkMissing">
- Miejsce (LM) nie znalezione w bazie danych.
- </notification>
- <notification name="UnableToLoadLandmark">
- Åadowanie miejsca (LM) nie powiodÅ‚o siÄ™.
-Spróbuj jeszcze raz.
- </notification>
- <notification name="CapsKeyOn">
- Twój Caps Lock jest włączony.
-Ponieważ to ma wpływ na wpisywane hasło, możesz chcieć go wyłączyć.
- </notification>
- <notification name="NotecardMissing">
- Notka nie została znaleziona w bazie danych.
- </notification>
- <notification name="NotecardNoPermissions">
- Nie masz pozwolenia na zobaczenie notki.
- </notification>
- <notification name="RezItemNoPermissions">
- Nie masz pozwolenia na stworzenie obiektu.
- </notification>
- <notification name="UnableToLoadNotecard">
- Nie można załadować danych notki w tym momencie.
- </notification>
- <notification name="ScriptMissing">
- Skrypt nie znaleziony w bazie danych.
- </notification>
- <notification name="ScriptNoPermissions">
- Nie masz pozwolenia na zobaczenie skryptu.
- </notification>
- <notification name="UnableToLoadScript">
- Åadowanie skryptu nie powiodÅ‚o siÄ™.
-Spróbuj jeszcze raz.
- </notification>
- <notification name="IncompleteInventory">
- Zawartość obiektów którą chcesz podarować nie jest dostępna lokalnie. Spróbuj podarować te obiekty jeszcze raz za jakiś czas.
- </notification>
- <notification name="CannotModifyProtectedCategories">
- Nie możesz zmienić chronionych kategorii.
- </notification>
- <notification name="CannotRemoveProtectedCategories">
- Nie możesz usunąć chronionych kategorii.
- </notification>
- <notification name="UnableToBuyWhileDownloading">
- Nie można kupować w trakcie ładowania danych obiektu.
-Spróbuj jeszcze raz.
- </notification>
- <notification name="UnableToLinkWhileDownloading">
- Nie można łączyć w trakcie ładowania danych obiektu.
-Spróbuj jeszcze raz.
- </notification>
- <notification name="CannotBuyObjectsFromDifferentOwners">
- Nie możesz jednocześnie kupować obiektów od różnych osób.
-Wybierz jeden obiekt.
- </notification>
- <notification name="ObjectNotForSale">
- Obiekt nie jest na sprzedaż.
- </notification>
- <notification name="EnteringGodMode">
- Włącznie trybu boskiego, poziom [LEVEL]
- </notification>
- <notification name="LeavingGodMode">
- Wyłączanie trybu boskiego, poziom [LEVEL]
- </notification>
- <notification name="CopyFailed">
- Nie masz praw do skopiowania wybranych obiektów.
- </notification>
- <notification name="InventoryAccepted">
- Podarunek od Ciebie został przyjęty przez [NAME].
- </notification>
- <notification name="InventoryDeclined">
- Podarunek od Ciebie został odrzucony przez [NAME].
- </notification>
- <notification name="ObjectMessage">
- [NAME]: [MESSAGE]
- </notification>
- <notification name="CallingCardAccepted">
- Twoja wizytówka została przyjęta.
- </notification>
- <notification name="CallingCardDeclined">
- Twoja wizytówka została odrzucona.
- </notification>
- <notification name="TeleportToLandmark">
- Jesteś w Głównym Regionie i możesz się stąd teleportować do innych miejsc jak &apos;[NAME]&apos; wybierając Moja Szafa w prawym dolnym rogu ekranu
-i wybierajÄ…c folder Zapisane Miejsca (LM).
-(Kliknij dwa razy na miejsce (LM) i wybierz &apos;Teleport&apos; żeby tam się przenieść.)
- </notification>
- <notification name="TeleportToPerson">
- Możesz skontaktować się z Rezydentem &apos;[NAME]&apos; poprzez otworzenie panelu Ludzie po prawej stronie ekranu.
-Wybierz Rezydenta z listy, następnie kliknij &apos;IM&apos; na dole panelu.
-(Możesz także kliknąć podwójnie na ich imię na liście, lub prawym przyciskiem i wybrać &apos;IM&apos;).
- </notification>
- <notification name="CantSelectLandFromMultipleRegions">
- Nie możesz przekraczać granic serwera wybierając obszar.
-Spróbuj wybrać mniejszy obszar.
- </notification>
- <notification name="SearchWordBanned">
- Pewne frazy podczas wyszukiwania zostały usunięte w związku z restrykcjami zawartymi w Standardach Społecznościowych (Community Standards).
- </notification>
- <notification name="NoContentToSearch">
- Proszę wybrać przynajmiej jeden z podanych rodzajów treści jaką zawiera region podczas wyszukiwania (&apos;General&apos;, &apos;Moderate&apos;, lub &apos;Adult&apos;).
- </notification>
- <notification name="SystemMessage">
- [MESSAGE]
- </notification>
- <notification name="PaymentReceived">
- [MESSAGE]
- </notification>
- <notification name="PaymentSent">
- [MESSAGE]
- </notification>
- <notification name="EventNotification">
- Zawiadomienie o imprezie:
-
-[NAME]
-[DATE]
- <form name="form">
- <button name="Details" text="Szczegóły"/>
- <button name="Cancel" text="Anuluj"/>
- </form>
- </notification>
- <notification name="TransferObjectsHighlighted">
- Obiekty na tej posiadłości które zostaną przekazane kupcowi tej posiadłości są teraz rozjaśnione.
-
-* Drzewa i trawy które zostaną przekazne nie są rozjaśnione.
- <form name="form">
- <button name="Done" text="Zastosuj"/>
- </form>
- </notification>
- <notification name="DeactivatedGesturesTrigger">
- Zablokowane gesturki z jednakowym aktywowaniem:
-[NAMES]
- </notification>
- <notification name="NoQuickTime">
- Wygląda na to, że QuickTime z Apple nie jest zainstalowany na Twoim komputerze.
-Jeżeli chcesz odtwarzać media na tej posiadłości które używają QuickTime idź do [http://www.apple.com/quicktime strona QuickTime] i zainstaluj odtwarzacz.
- </notification>
- <notification name="NoPlugin">
- Nie znaleziono wtyczki mediów dla &quot;[MIME_TYPE]&quot; typu mime. Media tego typu będą niedostępne.
- </notification>
- <notification name="MediaPluginFailed">
- Następujące wtyczki mediów nie działają:
- [PLUGIN]
-
-Zainstaluj proszę wtyczki ponownie lub skontaktuj się z dostawcą jeśli nadal problem będzie występował.
- <form name="form">
- <ignore name="ignore" text="Wtyczka mediów nie działa"/>
- </form>
- </notification>
- <notification name="OwnedObjectsReturned">
- Twoje obiekty z wybranej posiadłości zostały zwrócone do Twojej Szafy.
- </notification>
- <notification name="OtherObjectsReturned">
- Obiekty należące do [NAME] na wybranej posiadłości zostały zwrócone do Szafy tej osoby.
- </notification>
- <notification name="OtherObjectsReturned2">
- Obiekty z posiadłości należącej do Rezydenta&apos;[NAME]&apos; zostały zwrócone do właściciela.
- </notification>
- <notification name="GroupObjectsReturned">
- Obiekty z wybranej posiadłości przypisane do grupy [GROUPNAME] zostały zwrócone do szafy ich właścicieli.
-Przekazywalne obiekty przekazne grupie zostały zwrócone do ich poprzednich właścicieli.
-Nieprzekazywalne obiekty przekazane grupie zostały usunięte.
- </notification>
- <notification name="UnOwnedObjectsReturned">
- Obiekty z wybranej posiadłości które nie należą do Ciebie zostały zwrócone do ich właścicieli.
- </notification>
- <notification name="ServerObjectMessage">
- Wiadomość od [NAME]:
-&lt;nolink&gt;[MSG]&lt;/nolink&gt;
- </notification>
- <notification name="NotSafe">
- Ta posiadłość pozwala na uszkodzenia.
-Możesz doznać tutaj urazu. Jeżeli zginiesz nastąpi teleportacja do Twojego miejsca startu.
- </notification>
- <notification name="NoFly">
- Ta posiadłość nie pozwala na latanie.
-Nie możesz tutaj latać.
- </notification>
- <notification name="PushRestricted">
- Popychanie niedozwolone. Nie możesz tutaj popychać innych, chyba, że jesteś właścicielem tej posiadłości.
- </notification>
- <notification name="NoVoice">
- Ta posiadłość nie pozwala na rozmowy.
- </notification>
- <notification name="NoBuild">
- Ta posiadłość nie pozwala na budowanie. Nie możesz tworzyć tutaj obiektów.
- </notification>
- <notification name="ScriptsStopped">
- Administrator czasowo zatrzymał skrypty w tym regionie.
- </notification>
- <notification name="ScriptsNotRunning">
- Żadne skrypty nie działają w tym regionie.
- </notification>
- <notification name="NoOutsideScripts">
- Ta posiadłość nie pozwala na zewnętrzne skrypty.
-
-Żadne skrypty nie będą tutaj działać za wyjątkiem skryptów należących do właściciela posiadłości.
- </notification>
- <notification name="ClaimPublicLand">
- Tylko publiczne posiadłości w tym regionie mogą być przejęte.
- </notification>
- <notification name="RegionTPAccessBlocked">
- Ze względu na Twój wiek, nie jesteś uprawniony do przebywania w tym regionie. Możesz potrzebować weryfikacji wieku bądź instalacji najnowszej wersji klienta.
-
-Skorzystaj z [SECOND_LIFE]:Pomoc by uzyskać więcej informacji na temat dostępu do regionów z podanym rodzajem treści jaką zawiera.
- </notification>
- <notification name="URBannedFromRegion">
- Zostałeś zbanowany w regionie.
- </notification>
- <notification name="NoTeenGridAccess">
- Twoje konto nie może zostać połączone z podanym regionem Teen Grid.
- </notification>
- <notification name="ImproperPaymentStatus">
- Nie posiadasz odpowiedniego statusu płatniczego by uzyskać dostęp do regionu.
- </notification>
- <notification name="MustGetAgeParcel">
- By móc przebywać na tej posiadłości wymagana jest weryfikacja Twojego wieku.
- </notification>
- <notification name="NoDestRegion">
- Żądana lokalizacja regionu nie została odnaleziona.
- </notification>
- <notification name="NotAllowedInDest">
- Brak dostępu do podanej lokalizacji.
- </notification>
- <notification name="RegionParcelBan">
- Nie możesz przejść przez zamkniętą posiadłość. Spróbuj skorzystać z innej drogi.
- </notification>
- <notification name="TelehubRedirect">
- Zostałeś przeniesiony do teleportera.
- </notification>
- <notification name="CouldntTPCloser">
- Brak możliwości teleportacji do bliższej lokacji.
- </notification>
- <notification name="TPCancelled">
- Teleportacja anulowana.
- </notification>
- <notification name="FullRegionTryAgain">
- Region, który chcesz odwiedzić jest w tej chwili pełny.
-Spróbuj ponowanie za kilka minut.
- </notification>
- <notification name="GeneralFailure">
- Nieudana próba.
- </notification>
- <notification name="RoutedWrongRegion">
- Wysłano niewłaściwe połączenie do regionu. Proszę spróbować ponownie.
- </notification>
- <notification name="NoValidAgentID">
- Nieważny identyfikator agenta.
- </notification>
- <notification name="NoValidSession">
- Nieważny identyfikator sesji.
- </notification>
- <notification name="NoValidCircuit">
- Nieważny obwód kodowania.
- </notification>
- <notification name="NoValidTimestamp">
- Niewłaściwy czas zapisu.
- </notification>
- <notification name="NoPendingConnection">
- Brak możliwości wykonania połączenia.
- </notification>
- <notification name="InternalUsherError">
- Podczas teleportacji nastąpił błąd wewnętrzny, który może być wynikiem problemów serwera.
- </notification>
- <notification name="NoGoodTPDestination">
- Brak lokalizacji punktu do teleportacji w podanym regionie.
- </notification>
- <notification name="InternalErrorRegionResolver">
- Podczas próby odnalezienia globalnych współrzędych dla żądanej teleportacji pojawił się wewnętrzny błąd. Może być to wynikiem problemów serwera.
- </notification>
- <notification name="NoValidLanding">
- Nieważny punkt lądowania.
- </notification>
- <notification name="NoValidParcel">
- Nieważana posiadłość.
- </notification>
- <notification name="ObjectGiveItem">
- Obiekt o nazwie &lt;nolink&gt;[OBJECTFROMNAME]&lt;/nolink&gt;, którego właścicielem jest [NAME_SLURL] oferuje Tobie &lt;nolink&gt;[ITEM_SLURL]&lt;/nolink&gt;. Korzystanie z tego obieku wymaga przelączenia się na tryb zaawansowany, w którym będzie można odszukać obiekt w Twojej Szafie. W celu przełączenia trybu życia na zaawansowany, zamknij i uruchom ponownie aplikację. Przed ponownym zalogowaniem zmień tryb życia na ekranie logowania.
- <form name="form">
- <button name="Keep" text="Zaakceptuj obiekt"/>
- <button name="Discard" text="Odrzuć obiekt"/>
- <button name="Mute" text="Zablokuj obiekt"/>
- </form>
- </notification>
- <notification name="UserGiveItem">
- [NAME_SLURL] proponuje Tobie [ITEM_SLURL]. Korzystanie z tego obieku wymaga przelączenia się na tryb zaawansowany, w którym będzie można odszukać obiekt w Twojej Szafie. W celu przełączenia trybu życia na zaawansowany, zamknij i uruchom ponownie aplikację. Przed ponownym zalogowaniem zmień tryb życia na ekranie logowania.
- <form name="form">
- <button name="Show" text="Zaakceptuj obiekt"/>
- <button name="Discard" text="Odrzuć obiekt"/>
- <button name="Mute" text="Zablokuj użytkownika"/>
- </form>
- </notification>
- <notification name="GodMessage">
- [NAME]
-
-[MESSAGE]
- </notification>
- <notification name="JoinGroup">
- [MESSAGE]
- <form name="form">
- <button name="Join" text="Zaakceptuj"/>
- <button name="Decline" text="Odmów"/>
- <button name="Info" text="Info"/>
- </form>
- </notification>
- <notification name="TeleportOffered">
- [NAME_SLURL] proponuje Ci teleportacjÄ™ do siebie:
-
-[MESSAGE] - [MATURITY_STR] &lt;icon&gt;[MATURITY_ICON]&lt;/icon&gt;
- <form name="form">
- <button name="Teleport" text="Teleportuj"/>
- <button name="Cancel" text="Anuluj"/>
- </form>
- </notification>
- <notification name="TeleportOfferSent">
- Oferta teleportacji wysłana do [TO_NAME]
- </notification>
- <notification name="GotoURL">
- [MESSAGE]
-[URL]
- <form name="form">
- <button name="Later" text="Póżniej"/>
- <button name="GoNow..." text="Teraz..."/>
- </form>
- </notification>
- <notification name="OfferFriendship">
- [NAME_SLURL] proponuje znajomość.
-
-[MESSAGE]
-
-(Będziecie mogli widzieć swój status online)
- <form name="form">
- <button name="Accept" text="Zaakceptuj"/>
- <button name="Decline" text="Odmów"/>
- </form>
- </notification>
- <notification name="FriendshipOffered">
- Oferta znajomości dla [TO_NAME]
- </notification>
- <notification name="OfferFriendshipNoMessage">
- [NAME_SLURL] proponuje Ci znajomość.
-
-(Z zalożenia będzie widzić swój status online.)
- <form name="form">
- <button name="Accept" text="Zaakceptuj"/>
- <button name="Decline" text="Odmów"/>
- </form>
- </notification>
- <notification name="FriendshipAccepted">
- Twoja propozycja znajomości została przyjęta przez [NAME].
- </notification>
- <notification name="FriendshipDeclined">
- Twoja propozycja znajomości została odrzucona przez [NAME].
- </notification>
- <notification name="FriendshipAcceptedByMe">
- Propozycja znajomości została zaakceptowana.
- </notification>
- <notification name="FriendshipDeclinedByMe">
- Propozycja znajomości została odrzucona.
- </notification>
- <notification name="OfferCallingCard">
- [NAME] oferuje swoją wizytówkę.
-Wizytówka w Twojej Szafie umożliwi szybki kontakt IM z tym Rezydentem.
- <form name="form">
- <button name="Accept" text="Zaakceptuj"/>
- <button name="Decline" text="Odmów"/>
- </form>
- </notification>
- <notification name="RegionRestartMinutes">
- Restart regionu za [MINUTES] min.
-Nastąpi wylogowanie jeżeli zostaniesz w tym regionie.
- </notification>
- <notification name="RegionRestartSeconds">
- Restart regionu za [SECONDS] sec.
-Nastąpi wylogowanie jeżeli zostaniesz w tym regionie.
- </notification>
- <notification name="LoadWebPage">
- Załadować stronę [URL]?
-
-[MESSAGE]
-
-Od obiektu: &lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;, właściciel właściciel: [NAME]?
- <form name="form">
- <button name="Gotopage" text="Załaduj"/>
- <button name="Cancel" text="Anuluj"/>
- </form>
- </notification>
- <notification name="FailedToFindWearableUnnamed">
- [TYPE] - nie znaleziono w bazie danych.
- </notification>
- <notification name="FailedToFindWearable">
- [TYPE] [DESC] - nie znaleziono w bazie danych.
- </notification>
- <notification name="InvalidWearable">
- Obiekt, który chcesz założyć używa narzędzia nieobecnego w wersji klienta, którą używasz. By go założyć ściągnij najnowszą wersję [APP_NAME].
- </notification>
- <notification name="ScriptQuestion">
- Obiekt &apos;&lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;&apos;, którego właścicielem jest &apos;[NAME]&apos;, chciałby:
-
-[QUESTIONS]
-Czy siÄ™ zgadzasz?
- <form name="form">
- <button name="Yes" text="Tak"/>
- <button name="No" text="Nie"/>
- <button name="Mute" text="Zablokuj"/>
- </form>
- </notification>
- <notification name="ScriptQuestionCaution">
- Obiekt &apos;&lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;&apos;, którego właścicielem jest &apos;[NAME]&apos; chciałby:
-
-[QUESTIONS]
-Jeśli nie ufasz temu obiektowi i jego kreatorowi, odmów.
-
-Czy siÄ™ zgadzasz?
- <form name="form">
- <button name="Grant" text="Zaakceptuj"/>
- <button name="Deny" text="Odmów"/>
- <button name="Details" text="Szczegóły..."/>
- </form>
- </notification>
- <notification name="ScriptDialog">
- [NAME]&apos;s &apos;&lt;nolink&gt;[TITLE]&lt;/nolink&gt;&apos;
-[MESSAGE]
- <form name="form">
- <button name="Ignore" text="Zignoruj"/>
- </form>
- </notification>
- <notification name="ScriptDialogGroup">
- [GROUPNAME]&apos;s &apos;&lt;nolink&gt;[TITLE]&lt;/nolink&gt;&apos;
-[MESSAGE]
- <form name="form">
- <button name="Ignore" text="Zignoruj"/>
- </form>
- </notification>
- <notification name="BuyLindenDollarSuccess">
- Dziękujemy za wpłatę!
-
-Twój stan konta L$ zostanie zaktualizowany w momencie zakończenia transakcji. Jeżeli w ciągu 20 minut, Twój balans konta nie ulegnie zmianie, transakcja została anulowana. W tym przypadku, pobrana kwota zostanie zwrócona na stan konta w US$.
-
-Status transkacji możesz sprawdzić odwiedzając Historię Transakcji swojego konta na [http://secondlife.com/account/ Dashboard]
- </notification>
- <notification name="FirstOverrideKeys">
- Twoje sterujące klawisze zostały przejęte przez obiekt.
-Użyj strzałek lub AWSD żeby sprawdzić ich działanie.
-Niektóre obiekty (np broń) wymagają trybu panoramicznego.
-Nacisnij &apos;M&apos; żeby go wybrać.
- </notification>
- <notification name="FirstSandbox">
- Ten region to piaskownica.
-
-Obiekty które tu zbudujesz mogą zostać usunięte jak opuścisz ten obszar - piaskownice są regularnie czyszczone, sprawdź informacje na górze ekranu obok nazwy regionu.
- </notification>
- <notification name="MaxListSelectMessage">
- Maksymalnie możesz wybrać [MAX_SELECT] rzeczy
-z tej listy.
- </notification>
- <notification name="VoiceInviteP2P">
- [NAME] zaprasza Cię do rozmowy głosem.
-Wybierz Zaakceptuj żeby rozmawiać albo Odmów żeby nie przyjąć zaproszenia.
-Wybierz Zablokuj żeby wyciszyć dzwoniącą osób
- <form name="form">
- <button name="Accept" text="Zaakceptuj"/>
- <button name="Decline" text="Odmów"/>
- <button name="Mute" text="Zablokuj"/>
- </form>
- </notification>
- <notification name="AutoUnmuteByIM">
- Wysłano [NAME] prywatną wiadomość i ta osoba została automatycznie odblokowana.
- </notification>
- <notification name="AutoUnmuteByMoney">
- Przekazano [NAME] pieniądze i ta osoba została automatycznie odblokowana.
- </notification>
- <notification name="AutoUnmuteByInventory">
- Zaoferowno [NAME] obiekty i ta osoba została automatycznie odblokowana.
- </notification>
- <notification name="VoiceInviteGroup">
- [NAME] zaczyna rozmowÄ™ z grupÄ… [GROUP].
-Wybierz Zaakceptuj żeby rozmawiać albo Odmów żeby nie przyjąć zaproszenia. Wybierz Zablokuj żeby wyciszyć dzwoniącą osobę.
- <form name="form">
- <button name="Accept" text="Zaakceptuj"/>
- <button name="Decline" text="Odmów"/>
- <button name="Mute" text="Zablokuj"/>
- </form>
- </notification>
- <notification name="VoiceInviteAdHoc">
- [NAME] zaczyna konferencję głosem.
-Wybierz Zaakceptuj żeby rozmawiać albo Odmów żeby nie przyjąć zaproszenia. Wybierz Zablokuj żeby wyciszyć dzwoniącą osobę.
- <form name="form">
- <button name="Accept" text="Zaakceptuj"/>
- <button name="Decline" text="Odmów"/>
- <button name="Mute" text="Zablokuj"/>
- </form>
- </notification>
- <notification name="InviteAdHoc">
- [NAME] zaprasza CiÄ™ do konferencji poprzez Czat/IM.
-Wybierz Zaakceptuj żeby zacząć czat albo Odmów żeby nie przyjąć zaproszenia. Wybierz Zablokuj żeby wyciszyć tą osobę.
- <form name="form">
- <button name="Accept" text="Zaakceptuj"/>
- <button name="Decline" text="Odmów"/>
- <button name="Mute" text="Block"/>
- </form>
- </notification>
- <notification name="VoiceChannelFull">
- Rozmowa w której chcesz uczestniczyć, [VOICE_CHANNEL_NAME], nie akceptuje więcej rozmówców. Spróbuj póżniej.
- </notification>
- <notification name="ProximalVoiceChannelFull">
- Przepraszamy. Limit rozmów został przekroczony w tym obszarze. Spróbuj w innym miejscu.
- </notification>
- <notification name="VoiceChannelDisconnected">
- [VOICE_CHANNEL_NAME] odłączył się. Przełączanie do rozmowy przestrzennej.
- </notification>
- <notification name="VoiceChannelDisconnectedP2P">
- [VOICE_CHANNEL_NAME] skończył rozmowę. Przełączanie do rozmowy przestrzennej.
- </notification>
- <notification name="P2PCallDeclined">
- [VOICE_CHANNEL_NAME] odmówił połączenia. Przełączanie do rozmowy przestrzennej.
- </notification>
- <notification name="P2PCallNoAnswer">
- [VOICE_CHANNEL_NAME] nie odpowiada. Przełączanie do rozmowy przestrzennej.
- </notification>
- <notification name="VoiceChannelJoinFailed">
- Brak połączenia z [VOICE_CHANNEL_NAME], spróbuj póżniej. Przełączanie do rozmowy przestrzennej.
- </notification>
- <notification name="VoiceLoginRetry">
- Tworzymy kanał głosu dla Ciebie. Moze potrwać minutę.
- </notification>
- <notification name="VoiceEffectsExpired">
- Subskrypcja jednego lub więcej z Voice Morph wygasła.
-[[URL] Kliknij tutaj] oby odnowić subskrypcję.
- </notification>
- <notification name="VoiceEffectsExpiredInUse">
- Czas aktywności Voice Morph wygasł, normalne ustawienia Twojego głosu zostały zastosowane.
-[[URL] Kliknij tutaj] aby odnowić subskrypcję.
- </notification>
- <notification name="VoiceEffectsWillExpire">
- Jedno lub więcej z Twoich Voice Morph wygaśnie za mniej niż [INTERVAL] dni.
-[[URL] Klinij tutaj] aby odnowić subskrypcję.
- </notification>
- <notification name="VoiceEffectsNew">
- Nowe Voice Morph są dostępne!
- </notification>
- <notification name="Cannot enter parcel: not a group member">
- Nie masz dostępu do posiadłości, nie należysz do właściwej grupy.
- </notification>
- <notification name="Cannot enter parcel: banned">
- Masz wzbroniony wstęp na tą posiadłości (ban).
- </notification>
- <notification name="Cannot enter parcel: not on access list">
- Nie masz dostępu do posiadłości, nie jesteś na liście dostępu.
- </notification>
- <notification name="VoiceNotAllowed">
- Nie masz pozwolenia na połączenie z rozmową [VOICE_CHANNEL_NAME].
- </notification>
- <notification name="VoiceCallGenericError">
- Błąd podczas łączenia z rozmową [VOICE_CHANNEL_NAME]. Spróbuj póżniej.
- </notification>
- <notification name="UnsupportedCommandSLURL">
- Nie można otworzyć wybranego SLurl.
- </notification>
- <notification name="BlockedSLURL">
- SLurl został otrzymany z niesprawdzonej przeglądarki i został zablokowany dla bezpieczeństwa.
- </notification>
- <notification name="ThrottledSLURL">
- Wiele SLurlów zostało otrzymanych w krótkim czasie od niesprawdzonej przeglądarki.
-Zostaną zablokowane na kilka sekund dla bezpieczeństwa.
- </notification>
- <notification name="IMToast">
- [MESSAGE]
- <form name="form">
- <button name="respondbutton" text="Odpowiedź"/>
- </form>
- </notification>
- <notification name="ConfirmCloseAll">
- Czy chcesz zamknąć wszystkie wiadomości IM?
- <usetemplate ignoretext="Potwierdź, przed zamknięciem wszystkich wiadomości prywatnych (IM)." name="okcancelignore" notext="Anuluj" yestext="OK"/>
- </notification>
- <notification name="AttachmentSaved">
- Załącznik został zapisany.
- </notification>
- <notification name="UnableToFindHelpTopic">
- Nie można znależć tematu pomocy dla tego elementu.
- </notification>
- <notification name="ObjectMediaFailure">
- Błąd serwera: aktualizacja mediów nie powiodła się.
-&apos;[ERROR]&apos;
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="TextChatIsMutedByModerator">
- Twój czat został wyciszony przez moderatora.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="VoiceIsMutedByModerator">
- Twoja rozmowa głosowa została wyciszona przez moderatora.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="ConfirmClearTeleportHistory">
- Czy na pewno chcesz usunąć historię teleportacji?
- <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
- </notification>
- <notification name="BottomTrayButtonCanNotBeShown">
- Wybrany przycisk nie może zostać wyświetlony w tej chwili.
-Przycisk zostanie wyświetlony w przypadku dostatecznej ilości przestrzeni.
- </notification>
- <notification name="ShareNotification">
- Zaznacz Rezydentów, z którymi chcesz się podzielić.
- </notification>
- <notification name="ShareItemsConfirmation">
- Czy na pewno chcesz udostępnić następujące obiekty:
-
-&lt;nolink&gt;[ITEMS]&lt;/nolink&gt;
-
-następującym Rezydentom:
-
-[RESIDENTS]
- <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="Ok"/>
- </notification>
- <notification name="ItemsShared">
- Obiekty zostały udostępnione.
- </notification>
- <notification name="DeedToGroupFail">
- Przekazanie grupie nie powiodło się.
- </notification>
- <notification name="AvatarRezNotification">
- ( [EXISTENCE] sekund w Second Life)
-Awatar &apos;[NAME]&apos; rozchmurzył się po [TIME] sekundach.
- </notification>
- <notification name="AvatarRezSelfBakedDoneNotification">
- ( [EXISTENCE] sekund w Second Life)
-You finished baking your outfit after [TIME] seconds.
- </notification>
- <notification name="AvatarRezSelfBakedUpdateNotification">
- ( [EXISTENCE] sekund w Second Life )
-Wysłano aktualizację wyglądu po [TIME] sekundach.
-[STATUS]
- </notification>
- <notification name="AvatarRezCloudNotification">
- ( [EXISTENCE] sekund w Second Life )
-Awatar &apos;[NAME]&apos; stał się chmurą.
- </notification>
- <notification name="AvatarRezArrivedNotification">
- ( [EXISTENCE] sekund w Second Life)
-Awatar &apos;[NAME]&apos; pojawił się.
- </notification>
- <notification name="AvatarRezLeftCloudNotification">
- ( [EXISTENCE] sekund w Second Life )
-Awatar &apos;[NAME]&apos; pozostał [TIME] sekund chmurą.
- </notification>
- <notification name="AvatarRezEnteredAppearanceNotification">
- ( [EXISTENCE] sekund w Second Life )
-Awatar &apos;[NAME]&apos; rozpoczÄ…Å‚ edycjÄ™ wyglÄ…du.
- </notification>
- <notification name="AvatarRezLeftAppearanceNotification">
- ( [EXISTENCE] sekund w Second Life )
-Awatar &apos;[NAME]&apos; opuścił edycję wyglądu.
- </notification>
- <notification name="NoConnect">
- Występuje problem z połączeniem [PROTOCOL] [HOSTID].
-Proszę sprawdź swoją sieć i ustawienia firewall.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="NoVoiceConnect">
- Występuje problem z Twoim połączniem głosowym:
-
-[HOSTID]
-
-Komunikacja głosowa nie będzie dostępna.
-Proszę sprawdź swoją sieć i ustawienia firewall.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="AvatarRezLeftNotification">
- ( [EXISTENCE] sekund w Second Life)
-Awatar &apos;[NAME]&apos; pozostał w pełni załadowany.
- </notification>
- <notification name="AvatarRezSelfBakedTextureUploadNotification">
- ( [EXISTENCE] sekund w Second Life )
-Zbakowane tekstury [RESOLUTION] dla &apos;[BODYREGION]&apos; zostały załadowane po[TIME] sekundach.
- </notification>
- <notification name="AvatarRezSelfBakedTextureUpdateNotification">
- ( [EXISTENCE] sekund w Second Life )
-Zbakowane tekstury zostały lokalnie zaktualizowane [RESOLUTION] dla &apos;[BODYREGION]&apos; po [TIME] sekundach.
- </notification>
- <notification name="ConfirmLeaveCall">
- Czy jestes pewien/pewna, że chcesz zakończyć rozmowę?
- <usetemplate ignoretext="Potwierdź zanim rozmowa głosowa zostanie zakończona" name="okcancelignore" notext="Nie" yestext="Tak"/>
- </notification>
- <notification name="ConfirmMuteAll">
- Wybrano wyciszenie wszystkich uczestników rozmowy głosowej w grupie.
-To spowoduje również wyciszenie wszystkich Rezydentów, którzy dołączą póżniej do rozmowy, nawet jeśli zakończysz rozmowę.
-
-Wyciszyć wszystkich?
- <usetemplate ignoretext="Potwierdź zanim zostaną wyciszeni wszyscy uczestnicy rozmowy głosowej w grupie" name="okcancelignore" notext="Anuluj" yestext="Ok"/>
- </notification>
- <notification label="Czat" name="HintChat">
- W celu przylączenia się do rozmowy zacznij pisać w poniższym polu czatu.
- </notification>
- <notification label="Wstań" name="HintSit">
- Aby wstać i opuścić pozycję siedzącą, kliknij przycisk Wstań.
- </notification>
- <notification label="Odkrywaj Åšwiat" name="HintDestinationGuide">
- Destination Guide zawiera tysiące nowych miejsc do odkrycia. Wybierz lokalizację i teleportuj się aby rozpocząć zwiedzanie.
- </notification>
- <notification label="Schowek" name="HintSidePanel">
- Schowek umożliwia szybki dostęp do Twojej Szafy, ubrań, profili i innych w panelu bocznym.
- </notification>
- <notification label="Ruch" name="HintMove">
- Aby chodzić lub biegać, otwórz panel ruchu i użyj strzałek do nawigacji. Możesz także używać strzałek z klawiatury.
- </notification>
- <notification label="Wyświetlana nazwa" name="HintDisplayName">
- Ustaw wyświetlaną nazwę, którą możesz zmieniać tutaj. Jest ona dodatkiem do unikatowej nazwy użytkownika, która nie może być zmieniona. Możesz zmienić sposób w jaki widzisz nazwy innych osób w Twoich Ustawieniach.
- </notification>
- <notification label="Ruch" name="HintMoveArrows">
- Użyj przycisków ze strzałkami z klawiatury aby chodzić. Jeśli wciśniesz strzałkę &apos;do góry&apos; podwójnie, zaczniesz biec.
- </notification>
- <notification label="Widok" name="HintView">
- To change your camera view, use the Orbit and Pan controls. Zresetuj widok poprzez wciśnięcie klawisza Esc lub chodzenie.
- </notification>
- <notification label="Szafa" name="HintInventory">
- Sprawdź swoją Szafę aby znaleźć obiekty. Najnowsze obiekty mogą być łatwo odnalezione w zakładce Nowe obiekty.
- </notification>
- <notification label="Otrzymano L$!" name="HintLindenDollar">
- Tutaj znajduje się Twoj bieżący bilans L$. Kliknij Kup aby kupić więcej L$.
- </notification>
- <notification name="PopupAttempt">
- Wyskakujące okienko zostało zablokowane.
- <form name="form">
- <ignore name="ignore" text="Zezwól na wyskakujące okienka"/>
- <button name="open" text="Otwórz wyskakujące okno."/>
- </form>
- </notification>
- <notification name="AuthRequest">
- Strpna &apos;&lt;nolink&gt;[HOST_NAME]&lt;/nolink&gt;&apos; w domenie &apos;[REALM]&apos; wymaga nazwy użytkownika i hasła.
- <form name="form">
- <input name="username" text="Nazwa użytkownika"/>
- <input name="password" text="Hasło"/>
- <button name="ok" text="Wyślij"/>
- <button name="cancel" text="Anuluj"/>
- </form>
- </notification>
- <notification label="" name="ModeChange">
- Zmiana trybu wymaga restartu.
- <usetemplate name="okcancelbuttons" notext="Nie zamykaj" yestext="Zamknij"/>
- </notification>
- <notification label="" name="NoClassifieds">
- Tworzenie i edycja reklam jest możliwa tylko w trybie zaawansowanym. Czy chcesz wylogować się i zmienić tryb? Opcja wyboru trybu życia jest widoczna na ekranie logowania.
- <usetemplate name="okcancelbuttons" notext="Nie zamykaj" yestext="Zamknij"/>
- </notification>
- <notification label="" name="NoGroupInfo">
- Tworzenie i edycja grup jest możliwa tylko w trybie zaawansowanym. Czy chcesz wylogować się i zmienić tryb? Opcja wyboru trybu życia jest widoczna na ekranie logowania.
- <usetemplate name="okcancelbuttons" notext="Nie zamykaj" yestext="Zamknij"/>
- </notification>
- <notification label="" name="NoPicks">
- Tworzenie i edycja Ulubionych jest możliwa jedynie w trybie zaawansowanym. Czy chcesz się wylogować i zmienić tryb? Opcja wyboru trybu życia jest widoczna na ekranie logowania.
- <usetemplate name="okcancelbuttons" notext="Nie zamykaj" yestext="Zamknij"/>
- </notification>
- <notification label="" name="NoWorldMap">
- Oglądanie mapy świata jest możliwe tylko w trybie zaawansowanym. Czy chcesz się wylogować i zmienić tryb? Opcja wyboru trybu życia jest widoczna na ekranie logowania.
- <usetemplate name="okcancelbuttons" notext="Nie zamykaj" yestext="Zamknij"/>
- </notification>
- <notification label="" name="NoVoiceCall">
- Rozmowy głosowe są możliwe tylko w trybie zaawansowanym. Czy chcesz wylogować się i zmienić tryb?
- <usetemplate name="okcancelbuttons" notext="Nie zamykaj" yestext="Zamknij"/>
- </notification>
- <notification label="" name="NoAvatarShare">
- Udostępnienie jest możliwe tylko w trybie zaawansowanym. Czy chcesz wylogować się i zmienić tryb? Opcja wyboru trybu życia jest widoczna na ekranie logowania.
- <usetemplate name="okcancelbuttons" notext="Nie zamykaj" yestext="Zamknij"/>
- </notification>
- <notification label="" name="NoAvatarPay">
- Płacenie innym Rezydentom jest możliwe tylko w trybie zaawansowanym. Czy chcesz się wylogować i zmienić tryb? Opcja wyboru trybu życia jest widoczna na ekranie logowania.
- <usetemplate name="okcancelbuttons" notext="Nie zamykaj" yestext="Zamknij"/>
- </notification>
- <global name="UnsupportedCPU">
- - Prędkość Twojego CPU nie spełnia minimalnych wymagań.
- </global>
- <global name="UnsupportedGLRequirements">
- Wygląda na to, że Twój system nie spełnia wymagań sprzętowych [APP_NAME]. [APP_NAME] wymaga karty graficznej kompatybilnej z OpenGL z multiteksturami. Jeżeli masz taką kartę zainstaluj najnowsze sterowniki do niej i uaktualnienia systemu operacyjnego.
-
-Jeżeli wciąż masz problemy sprawdź: [SUPPORT_SITE].
- </global>
- <global name="UnsupportedCPUAmount">
- 796
- </global>
- <global name="UnsupportedRAMAmount">
- 510
- </global>
- <global name="UnsupportedGPU">
- - Twoja karta graficzna nie spełnia minimalnych wymagań.
- </global>
- <global name="UnsupportedRAM">
- - Pamięć Twojego systemu nie spełnia minimalnych wymagań.
- </global>
- <global name="You can only set your &apos;Home Location&apos; on your land or at a mainland Infohub.">
- Jeśli jesteś właścicielem posiadłości, możesz ustawić na niej miejsce startu.
-W innym przypadku możesz poszukać na mapie miejsca oznaczone jako &quot;Infohub&quot;.
- </global>
- <global name="You died and have been teleported to your home location">
- Nastąpiła śmierć i teleportacja do Miejsca Startu.
- </global>
-</notifications>
diff --git a/indra/newview/skins/minimal/xui/pl/panel_adhoc_control_panel.xml b/indra/newview/skins/minimal/xui/pl/panel_adhoc_control_panel.xml
deleted file mode 100644
index ba0c85e4ef..0000000000
--- a/indra/newview/skins/minimal/xui/pl/panel_adhoc_control_panel.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="panel_im_control_panel">
- <layout_stack name="vertical_stack">
- <layout_panel name="call_btn_panel">
- <button label="Dzwoń" name="call_btn"/>
- </layout_panel>
- <layout_panel name="end_call_btn_panel">
- <button label="Zakończ rozmowę" name="end_call_btn"/>
- </layout_panel>
- <layout_panel name="voice_ctrls_btn_panel">
- <button label="Przełączniki głosu" name="voice_ctrls_btn"/>
- </layout_panel>
- </layout_stack>
-</panel>
diff --git a/indra/newview/skins/minimal/xui/pl/panel_bottomtray.xml b/indra/newview/skins/minimal/xui/pl/panel_bottomtray.xml
deleted file mode 100644
index f49d820938..0000000000
--- a/indra/newview/skins/minimal/xui/pl/panel_bottomtray.xml
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="bottom_tray">
- <string name="DragIndicationImageName" value="Accordion_ArrowOpened_Off"/>
- <string name="SpeakBtnToolTip" value="Włącza/wyłącza mikrofon"/>
- <string name="VoiceControlBtnToolTip" value="Pokazuje/Ukrywa panel kontroli głosu"/>
- <layout_stack name="toolbar_stack">
- <layout_panel name="gesture_panel">
- <gesture_combo_list label="Gesturki" name="Gesture" tool_tip="Pokazuje/Ukrywa gesturki"/>
- </layout_panel>
- <layout_panel name="cam_panel">
- <bottomtray_button label="Widok" name="camera_btn" tool_tip="Pokaż/Ukryj ustawienia kamery"/>
- </layout_panel>
- <layout_panel name="avatar_and_destinations_panel">
- <bottomtray_button label="Atrakcje turystyczne" name="destination_btn" tool_tip="Pokaż okno dotyczące ludzi"/>
- </layout_panel>
- <layout_panel name="avatar_and_destinations_panel">
- <bottomtray_button label="Mój awatar" name="avatar_btn"/>
- </layout_panel>
- <layout_panel name="people_panel">
- <bottomtray_button label="Ludzie" name="show_people_button" tool_tip="Pokazuje okno dotyczÄ…ce ludzi"/>
- </layout_panel>
- <layout_panel name="profile_panel">
- <bottomtray_button label="Profil" name="show_profile_btn" tool_tip="Pokazuje okno profilu."/>
- </layout_panel>
- <layout_panel name="howto_panel">
- <bottomtray_button label="POMOC" name="show_help_btn" tool_tip="Otwiera temat pomocy Second Life"/>
- </layout_panel>
- <layout_panel name="im_well_panel">
- <chiclet_im_well name="im_well">
- <button name="Unread IM messages" tool_tip="Rozmowy"/>
- </chiclet_im_well>
- </layout_panel>
- <layout_panel name="notification_well_panel">
- <chiclet_notification name="notification_well">
- <button name="Unread" tool_tip="Ogłoszenia"/>
- </chiclet_notification>
- </layout_panel>
- </layout_stack>
-</panel>
diff --git a/indra/newview/skins/minimal/xui/pl/panel_group_control_panel.xml b/indra/newview/skins/minimal/xui/pl/panel_group_control_panel.xml
deleted file mode 100644
index 074f572a4c..0000000000
--- a/indra/newview/skins/minimal/xui/pl/panel_group_control_panel.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="panel_im_control_panel">
- <layout_stack name="vertical_stack">
- <layout_panel name="group_info_btn_panel">
- <button label="Grupa" name="group_info_btn"/>
- </layout_panel>
- <layout_panel name="call_btn_panel">
- <button label="Dzwoń" name="call_btn"/>
- </layout_panel>
- <layout_panel name="end_call_btn_panel">
- <button label="Zakończ rozmowę" name="end_call_btn"/>
- </layout_panel>
- <layout_panel name="voice_ctrls_btn_panel">
- <button label="Otwórz kontroler głosu" name="voice_ctrls_btn"/>
- </layout_panel>
- </layout_stack>
-</panel>
diff --git a/indra/newview/skins/minimal/xui/pl/panel_im_control_panel.xml b/indra/newview/skins/minimal/xui/pl/panel_im_control_panel.xml
deleted file mode 100644
index 4aadd3b93b..0000000000
--- a/indra/newview/skins/minimal/xui/pl/panel_im_control_panel.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="panel_im_control_panel">
- <layout_stack name="button_stack">
- <layout_panel name="view_profile_btn_panel">
- <button label="Profil" name="view_profile_btn"/>
- </layout_panel>
- <layout_panel name="add_friend_btn_panel">
- <button label="Poznaj" name="add_friend_btn"/>
- </layout_panel>
- <layout_panel name="teleport_btn_panel">
- <button label="Teleportuj" name="teleport_btn" tool_tip="Teleportuj"/>
- </layout_panel>
- <layout_panel name="share_btn_panel">
- <button label="Udostępnij" name="share_btn"/>
- </layout_panel>
- <layout_panel name="pay_btn_panel">
- <button label="Zapłać" name="pay_btn"/>
- </layout_panel>
- <layout_panel name="call_btn_panel">
- <button label="Dzwoń" name="call_btn"/>
- </layout_panel>
- <layout_panel name="end_call_btn_panel">
- <button label="Zakończ rozmowę" name="end_call_btn"/>
- </layout_panel>
- <layout_panel name="voice_ctrls_btn_panel">
- <button label="Przełączniki głosu" name="voice_ctrls_btn"/>
- </layout_panel>
- </layout_stack>
-</panel>
diff --git a/indra/newview/skins/minimal/xui/pl/panel_login.xml b/indra/newview/skins/minimal/xui/pl/panel_login.xml
deleted file mode 100644
index dc8e7399af..0000000000
--- a/indra/newview/skins/minimal/xui/pl/panel_login.xml
+++ /dev/null
@@ -1,45 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="panel_login">
- <panel.string name="forgot_password_url">
- http://secondlife.com/account/request.php
- </panel.string>
- <layout_stack name="login_widgets">
- <layout_panel name="login">
- <text name="username_text">
- Użytkownik:
- </text>
- <combo_box name="username_combo" tool_tip="Nazwę użytkownika wybierasz przy rejestracji, np. bobsmith12 lub Steller Sunshine"/>
- <text name="password_text">
- Hasło:
- </text>
- <check_box label="Zapamiętaj hasło" name="remember_check"/>
- <button label="Połącz" name="connect_btn"/>
- <text name="mode_selection_text">
- Tryb życia:
- </text>
- <combo_box name="mode_combo" tool_tip="Wybierz tryb życia. Wybierz tryb turystyczny dla łatwego zwiedzania i czatowania. Wybierz tryb zaawansowany aby mieć dostęp do większej ilości opcji.">
- <combo_box.item label="Turystyczny" name="Basic"/>
- <combo_box.item label="Zaawansowany" name="Advanced"/>
- </combo_box>
- <text name="start_location_text">
- Rozpocznij w:
- </text>
- <combo_box name="start_location_combo">
- <combo_box.item label="Ostatnie Miejsce" name="MyLastLocation"/>
- <combo_box.item label="Moje Miejsce Startu" name="MyHome"/>
- <combo_box.item label="&lt;Wpisz Region&gt;" name="Typeregionname"/>
- </combo_box>
- </layout_panel>
- <layout_panel name="links">
- <text name="create_new_account_text">
- Utwórz nowe konto
- </text>
- <text name="forgot_password_text">
- Zapomniałeś swojej nazwy użytkownika lub hasła?
- </text>
- <text name="login_help">
- Potrzebujesz pomocy z logowaniem siÄ™?
- </text>
- </layout_panel>
- </layout_stack>
-</panel>
diff --git a/indra/newview/skins/minimal/xui/pl/panel_navigation_bar.xml b/indra/newview/skins/minimal/xui/pl/panel_navigation_bar.xml
deleted file mode 100644
index b01e686c41..0000000000
--- a/indra/newview/skins/minimal/xui/pl/panel_navigation_bar.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="navigation_bar">
- <panel name="navigation_panel">
- <pull_button name="back_btn" tool_tip="Wróć do poprzedniej lokalizacji"/>
- <pull_button name="forward_btn" tool_tip="Idź do następnej lokalizacji"/>
- <button name="home_btn" tool_tip="Teleportuj do miejsca startu"/>
- <location_input label="Lokalizacja" name="location_combo"/>
- <search_combo_box label="Szukaj" name="search_combo_box" tool_tip="Szukaj">
- <combo_editor label="Szukaj [SECOND_LIFE]" name="search_combo_editor"/>
- </search_combo_box>
- </panel>
- <favorites_bar name="favorite" tool_tip="Przeciągnij swoje landmarki tutaj by szybko dostać się do swoich ulubionych miejsc w Second Life!">
- <label name="favorites_bar_label" tool_tip="Przeciągnij swoje landmarki tutaj by szybko dostać się do swoich ulubionych miejsc w Second Life!">
- Pasek Ulubionych
- </label>
- <chevron_button name="&gt;&gt;" tool_tip="Pokaż więcej Moich Ulubionych"/>
- </favorites_bar>
-</panel>
diff --git a/indra/newview/skins/minimal/xui/pl/panel_people.xml b/indra/newview/skins/minimal/xui/pl/panel_people.xml
deleted file mode 100644
index 3b3aaa0987..0000000000
--- a/indra/newview/skins/minimal/xui/pl/panel_people.xml
+++ /dev/null
@@ -1,94 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<!-- Side tray panel -->
-<panel label="Ludzie" name="people_panel">
- <string name="no_recent_people" value="Brak ostatnich rozmówców. Chcesz spotkać ludzi? Skorzystaj z przycisku &quot;Atrakcje turystyczne&quot; poniżej."/>
- <string name="no_filtered_recent_people" value="Brak ostatnich rozmówców posiadających wskazane imię."/>
- <string name="no_one_near" value="Nie ma nikogo w pobliżu. Chcesz spotkać ludzi? Skorzystaj z przycisku &quot;Atrakcje turystyczne&quot; poniżej."/>
- <string name="no_one_filtered_near" value="Nie ma nikogo o wskazanym imieniu w pobliżu."/>
- <string name="no_friends_online" value="Brak dostępnych znajomych"/>
- <string name="no_friends" value="Brak znajomych"/>
- <string name="no_friends_msg">
- Kliknij prawym przyciskiem na Rezydenta aby dodać go do listy znajomych.
-Chcesz spotkać ludzi? Skorzystaj z przycisku &quot;Atrakcje turystyczne&quot; poniżej.
- </string>
- <string name="no_filtered_friends_msg">
- Nie znaleziono tego czego szukasz? Skorzystaj z przycisku &quot;Atrakcje turystyczne&quot; poniżej.
- </string>
- <string name="people_filter_label" value="Filtruj ludzi"/>
- <string name="groups_filter_label" value="Filtruj grupy"/>
- <string name="no_filtered_groups_msg" value="Nie znaleziono tego czego szukasz? Spróbuj [secondlife:///app/search/groups/[SEARCH_TERM] Szukaj]."/>
- <string name="no_groups_msg" value="Chcesz dołączyć do grup? Spróbuj [secondlife:///app/search/groups Szukaj]."/>
- <string name="MiniMapToolTipMsg" value="[REGION](Podwójne kliknięcie otwiera mapę, wciśnij Shift i przeciągnij myszką aby przesunąć)"/>
- <string name="AltMiniMapToolTipMsg" value="[REGION](Podwójne kliknięcie aktywuje teleportację, wciśnij Shift i przeciągnij myszką aby przesunąć)"/>
- <filter_editor label="Filtr" name="filter_input"/>
- <tab_container name="tabs">
- <panel label="W POBLIŻU" name="nearby_panel">
- <panel label="bottom_panel" name="bottom_panel">
- <menu_button name="nearby_view_sort_btn" tool_tip="Opcje"/>
- <button name="add_friend_btn" tool_tip="Dodaj wybranego Rezydenta do znajomych"/>
- </panel>
- </panel>
- <panel label="ZNAJOMI" name="friends_panel">
- <accordion name="friends_accordion">
- <accordion_tab name="tab_online" title="Dostępni"/>
- <accordion_tab name="tab_all" title="Wszyscy"/>
- </accordion>
- <panel label="bottom_panel" name="bottom_panel">
- <layout_stack name="bottom_panel">
- <layout_panel name="options_gear_btn_panel">
- <menu_button name="friends_viewsort_btn" tool_tip="Pokaż opcje dodatkowe"/>
- </layout_panel>
- <layout_panel name="add_btn_panel">
- <button name="add_btn" tool_tip="Dodaj wybranego Rezydenta do znajomych"/>
- </layout_panel>
- <layout_panel name="trash_btn_panel">
- <dnd_button name="del_btn" tool_tip="Usuń zaznaczoną osobę ze swojej listy znajomych"/>
- </layout_panel>
- </layout_stack>
- </panel>
- </panel>
- <panel label="GRUPY" name="groups_panel">
- <panel label="bottom_panel" name="bottom_panel">
- <menu_button name="groups_viewsort_btn" tool_tip="Opcje"/>
- <button name="plus_btn" tool_tip="Dołącz do grupy/Stwórz nową grupę"/>
- <button name="activate_btn" tool_tip="Aktywuj wybranÄ… grupÄ™"/>
- </panel>
- </panel>
- <panel label="OSTATNIE" name="recent_panel">
- <panel label="bottom_panel" name="bottom_panel">
- <menu_button name="recent_viewsort_btn" tool_tip="Opcje"/>
- <button name="add_friend_btn" tool_tip="Dodaj wybranego Rezydenta do znajomych"/>
- </panel>
- </panel>
- </tab_container>
- <panel name="button_bar">
- <layout_stack name="bottom_bar_ls">
- <layout_panel name="view_profile_btn_lp">
- <button label="Profil" name="view_profile_btn" tool_tip="Pokaż zdjęcie, grupy i inne informacje o Rezydencie"/>
- </layout_panel>
- <layout_panel name="im_btn_lp">
- <button label="IM" name="im_btn" tool_tip="Otwórz wiadomości IM"/>
- </layout_panel>
- <layout_panel name="call_btn_lp">
- <button label="Dzwoń" name="call_btn" tool_tip="Zadzwoń do tego Rezydenta"/>
- </layout_panel>
- <layout_panel name="share_btn_lp">
- <button label="Udostępnij" name="share_btn" tool_tip="Udostępnij obiekt z Szafy"/>
- </layout_panel>
- <layout_panel name="teleport_btn_lp">
- <button label="Teleportuj" name="teleport_btn" tool_tip="Zaproponuj teleport"/>
- </layout_panel>
- </layout_stack>
- <layout_stack name="bottom_bar_ls1">
- <layout_panel name="group_info_btn_lp">
- <button label="Profil grupy" name="group_info_btn" tool_tip="Pokaż informacje o grupie"/>
- </layout_panel>
- <layout_panel name="chat_btn_lp">
- <button label="Czat grupy" name="chat_btn" tool_tip="Otwórz sesję czatu"/>
- </layout_panel>
- <layout_panel name="group_call_btn_lp">
- <button label="Rozmowa głosowa w grupie" name="group_call_btn" tool_tip="Rozmowa głosowa w tej grupie"/>
- </layout_panel>
- </layout_stack>
- </panel>
-</panel>
diff --git a/indra/newview/skins/minimal/xui/pl/panel_side_tray_tab_caption.xml b/indra/newview/skins/minimal/xui/pl/panel_side_tray_tab_caption.xml
deleted file mode 100644
index 95cd7c53dc..0000000000
--- a/indra/newview/skins/minimal/xui/pl/panel_side_tray_tab_caption.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="sidetray_tab_panel">
- <text name="sidetray_tab_title" value="Schowek"/>
- <button name="undock" tool_tip="Odłącz"/>
- <button name="dock" tool_tip="Przyłącz"/>
- <button name="show_help" tool_tip="Pomoc"/>
-</panel>
diff --git a/indra/newview/skins/minimal/xui/pl/panel_status_bar.xml b/indra/newview/skins/minimal/xui/pl/panel_status_bar.xml
deleted file mode 100644
index 6aa0d27bb8..0000000000
--- a/indra/newview/skins/minimal/xui/pl/panel_status_bar.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="status">
- <panel.string name="StatBarDaysOfWeek">
- Niedziela:Poniedziałek:Wtorek:Środa:Czwartek:Piątek:Sobota
- </panel.string>
- <panel.string name="StatBarMonthsOfYear">
- Styczeń:Luty:Marzec:Kwiecień:Maj:Czerwiec:Lipiec:Styczeń:Wrzesień:Październik:Listopad:Grudzień
- </panel.string>
- <panel.string name="packet_loss_tooltip">
- Utracone pakiety
- </panel.string>
- <panel.string name="bandwidth_tooltip">
- Przepustowość
- </panel.string>
- <panel.string name="time">
- [hour12, datetime, slt]:[min, datetime, slt] [ampm, datetime, slt] [timezone,datetime, slt]
- </panel.string>
- <panel.string name="timeTooltip">
- [weekday, datetime, slt], [day, datetime, slt] [month, datetime, slt] [year, datetime, slt]
- </panel.string>
- <panel.string name="buycurrencylabel">
- L$ [AMT]
- </panel.string>
- <panel name="balance_bg">
- <text name="balance" tool_tip="Kliknij aby odświeżyć bilans L$" value="L$20"/>
- <button label="Kup L$" name="buyL" tool_tip="Kliknij aby kupić więcej L$"/>
- </panel>
- <text name="TimeText" tool_tip="Obecny czas (Pacyficzny)">
- 24:00 AM PST
- </text>
- <button name="media_toggle_btn" tool_tip="Start/Stop wszystkie media (Muzyka, Video, WWW)"/>
- <button name="volume_btn" tool_tip="Regulacja głośności"/>
-</panel>
diff --git a/indra/newview/skins/minimal/xui/pt/floater_camera.xml b/indra/newview/skins/minimal/xui/pt/floater_camera.xml
deleted file mode 100644
index 4f3729c623..0000000000
--- a/indra/newview/skins/minimal/xui/pt/floater_camera.xml
+++ /dev/null
@@ -1,65 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="camera_floater" title="">
- <floater.string name="rotate_tooltip">
- Girar a Câmera ao redor do Foco
- </floater.string>
- <floater.string name="zoom_tooltip">
- Aproximar a Câmera in direção ao Foco
- </floater.string>
- <floater.string name="move_tooltip">
- Mover a Câmera para Cima e para Baixo, para a Esquerda e para a Direita
- </floater.string>
- <floater.string name="camera_modes_title">
- Modos de câmera
- </floater.string>
- <floater.string name="pan_mode_title">
- Pan zoom orbital
- </floater.string>
- <floater.string name="presets_mode_title">
- Ângulos predefinidos
- </floater.string>
- <floater.string name="free_mode_title">
- Visualizar objeto
- </floater.string>
- <panel name="controls">
- <panel name="preset_views_list">
- <panel_camera_item name="front_view">
- <panel_camera_item.text name="front_view_text">
- Vista frontal
- </panel_camera_item.text>
- </panel_camera_item>
- <panel_camera_item name="group_view">
- <panel_camera_item.text name="side_view_text">
- Vista lateral
- </panel_camera_item.text>
- </panel_camera_item>
- <panel_camera_item name="rear_view">
- <panel_camera_item.text name="rear_view_text">
- Vista de trás
- </panel_camera_item.text>
- </panel_camera_item>
- </panel>
- <panel name="camera_modes_list">
- <panel_camera_item name="object_view">
- <panel_camera_item.text name="object_view_text">
- Vista de objetos
- </panel_camera_item.text>
- </panel_camera_item>
- <panel_camera_item name="mouselook_view">
- <panel_camera_item.text name="mouselook_view_text">
- Vista do mouse
- </panel_camera_item.text>
- </panel_camera_item>
- </panel>
- <panel name="zoom" tool_tip="Aproximar a Câmera in direção ao Foco">
- <joystick_rotate name="cam_rotate_stick" tool_tip="Girar câmera ao redor do foco"/>
- <slider_bar name="zoom_slider" tool_tip="Zoom de câmera para focalizar"/>
- <joystick_track name="cam_track_stick" tool_tip="Move a câmera para cima e para baixo, direita e esquerda"/>
- </panel>
- </panel>
- <panel name="buttons">
- <button label="" name="presets_btn" tool_tip="Ângulos predefinidos"/>
- <button label="" name="pan_btn" tool_tip="Pan zoom orbital"/>
- <button label="" name="avatarview_btn" tool_tip="Modos de câmera"/>
- </panel>
-</floater>
diff --git a/indra/newview/skins/minimal/xui/pt/floater_help_browser.xml b/indra/newview/skins/minimal/xui/pt/floater_help_browser.xml
deleted file mode 100644
index 11428ff651..0000000000
--- a/indra/newview/skins/minimal/xui/pt/floater_help_browser.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_help_browser" title="COMO">
- <floater.string name="loading_text">
- Carregando...
- </floater.string>
- <layout_stack name="stack1">
- <layout_panel name="external_controls"/>
- </layout_stack>
-</floater>
diff --git a/indra/newview/skins/minimal/xui/pt/floater_media_browser.xml b/indra/newview/skins/minimal/xui/pt/floater_media_browser.xml
deleted file mode 100644
index da7428007e..0000000000
--- a/indra/newview/skins/minimal/xui/pt/floater_media_browser.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_about" title="NAVEGADOR DE MÃDIA">
- <floater.string name="home_page_url">
- http://www.secondlife.com
- </floater.string>
- <floater.string name="support_page_url">
- http://support.secondlife.com
- </floater.string>
- <layout_stack name="stack1">
- <layout_panel name="nav_controls">
- <button label="Atrás" name="back"/>
- <button label="Frente" name="forward"/>
- <button label="Recarregar" name="reload"/>
- <button label="OK" name="go"/>
- </layout_panel>
- <layout_panel name="time_controls">
- <button label="p/ trás" name="rewind"/>
- <button label="parar" name="stop"/>
- <button label="p/ frente" name="seek"/>
- </layout_panel>
- <layout_panel name="parcel_owner_controls">
- <button label="Enviar esta página para lote" name="assign"/>
- </layout_panel>
- <layout_panel name="external_controls">
- <button label="Abrir no meu navegador" name="open_browser"/>
- <check_box label="Abrir sempre no meu navegador" name="open_always"/>
- <button label="Fechar" name="close"/>
- </layout_panel>
- </layout_stack>
-</floater>
diff --git a/indra/newview/skins/minimal/xui/pt/floater_nearby_chat.xml b/indra/newview/skins/minimal/xui/pt/floater_nearby_chat.xml
deleted file mode 100644
index 60edfa505f..0000000000
--- a/indra/newview/skins/minimal/xui/pt/floater_nearby_chat.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="nearby_chat" title="Bate-papo local">
- <check_box label="Traduzir bate-papo (via Google)" name="translate_chat_checkbox"/>
-</floater>
diff --git a/indra/newview/skins/minimal/xui/pt/floater_web_content.xml b/indra/newview/skins/minimal/xui/pt/floater_web_content.xml
deleted file mode 100644
index 5101579c6f..0000000000
--- a/indra/newview/skins/minimal/xui/pt/floater_web_content.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_web_content" title="">
- <layout_stack name="stack1">
- <layout_panel name="nav_controls">
- <button name="back" tool_tip="Navegar para trás"/>
- <button name="forward" tool_tip="Navegar para frente"/>
- <button name="stop" tool_tip="Parar a navegação"/>
- <button name="reload" tool_tip="Recarregar página"/>
- <combo_box name="address" tool_tip="Digite a URL aqui"/>
- <icon name="media_secure_lock_flag" tool_tip="Navegação segura"/>
- <button name="popexternal" tool_tip="Abrir a URL atual no navegador do seu computador"/>
- </layout_panel>
- </layout_stack>
-</floater>
diff --git a/indra/newview/skins/minimal/xui/pt/inspect_avatar.xml b/indra/newview/skins/minimal/xui/pt/inspect_avatar.xml
deleted file mode 100644
index a199c58c15..0000000000
--- a/indra/newview/skins/minimal/xui/pt/inspect_avatar.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<!--
- Not can_close / no title to avoid window chrome
- Single instance - only have one at a time, recycle it each spawn
--->
-<floater name="inspect_avatar">
- <string name="Subtitle">
- [IDADE]
- </string>
- <string name="Details">
- [PERFIL_SL]
- </string>
- <text name="user_details">
- This is my second life description and I really think it is great. But for some reason my description is super extra long because I like to talk a whole lot
- </text>
- <slider name="volume_slider" tool_tip="Volume de Voz" value="0.5"/>
- <button label="Adicionar amigo" name="add_friend_btn"/>
- <button label="MI" name="im_btn"/>
- <button label="Perfil" name="view_profile_btn"/>
- <panel name="moderator_panel">
- <button label="Disabilitar Voz" name="disable_voice"/>
- <button label="Habilitar Voz" name="enable_voice"/>
- </panel>
-</floater>
diff --git a/indra/newview/skins/minimal/xui/pt/inspect_object.xml b/indra/newview/skins/minimal/xui/pt/inspect_object.xml
deleted file mode 100644
index b72de7038d..0000000000
--- a/indra/newview/skins/minimal/xui/pt/inspect_object.xml
+++ /dev/null
@@ -1,41 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<!--
- Not can_close / no title to avoid window chrome
- Single instance - only have one at a time, recycle it each spawn
--->
-<floater name="inspect_object">
- <string name="Creator">
- Autor: [CREATOR]
- </string>
- <string name="CreatorAndOwner">
- Autor [CREATOR]
-Proprietário [OWNER]
- </string>
- <string name="Price">
- L$[AMOUNT]
- </string>
- <string name="PriceFree">
- Grátis!
- </string>
- <string name="Touch">
- Tocar
- </string>
- <string name="Sit">
- Sentar
- </string>
- <text name="object_name" value="Test Object Name That Is actually two lines and Really Long"/>
- <text name="price_text">
- L$30.000
- </text>
- <text name="object_description">
- This is a really long description for an object being as how it is at least 80 characters in length and so but maybe more like 120 at this point. Who knows, really?
- </text>
- <button label="Comprar" name="buy_btn"/>
- <button label="Pagar" name="pay_btn"/>
- <button label="Pegar uma cópia" name="take_free_copy_btn"/>
- <button label="Tocar" name="touch_btn"/>
- <button label="Sentar" name="sit_btn"/>
- <button label="Abrir" name="open_btn"/>
- <icon name="secure_browsing" tool_tip="Navegação segura"/>
- <button label="Mais" name="more_info_btn"/>
-</floater>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_add_wearable_gear.xml b/indra/newview/skins/minimal/xui/pt/menu_add_wearable_gear.xml
deleted file mode 100644
index 4b81276ab3..0000000000
--- a/indra/newview/skins/minimal/xui/pt/menu_add_wearable_gear.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Add Wearable Gear Menu">
- <menu_item_check label="Ordenar por mais recente" name="sort_by_most_recent"/>
- <menu_item_check label="Ordenar por nome" name="sort_by_name"/>
- <menu_item_check label="Ordenar por tipo" name="sort_by_type"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_attachment_other.xml b/indra/newview/skins/minimal/xui/pt/menu_attachment_other.xml
deleted file mode 100644
index cfd69158bc..0000000000
--- a/indra/newview/skins/minimal/xui/pt/menu_attachment_other.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<!-- *NOTE: See also menu_avatar_other.xml -->
-<context_menu name="Avatar Pie">
- <menu_item_call label="Ver perfil" name="Profile..."/>
- <menu_item_call label="Adicionar amigo..." name="Add Friend"/>
- <menu_item_call label="MI" name="Send IM..."/>
- <menu_item_call label="Ligar" name="Call"/>
- <menu_item_call label="Convidar para entrar no grupo" name="Invite..."/>
- <menu_item_call label="Bloquear" name="Avatar Mute"/>
- <menu_item_call label="Denunciar" name="abuse"/>
- <menu_item_call label="Congelar" name="Freeze..."/>
- <menu_item_call label="Ejetar" name="Eject..."/>
- <menu_item_call label="Depurar texturas" name="Debug..."/>
- <menu_item_call label="Mais zoom" name="Zoom In"/>
- <menu_item_call label="Pagar" name="Pay..."/>
- <menu_item_call label="Perfil do objeto" name="Object Inspect"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_attachment_self.xml b/indra/newview/skins/minimal/xui/pt/menu_attachment_self.xml
deleted file mode 100644
index 09060cf3ae..0000000000
--- a/indra/newview/skins/minimal/xui/pt/menu_attachment_self.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Attachment Pie">
- <menu_item_call label="Tocar" name="Attachment Object Touch"/>
- <menu_item_call label="Editar" name="Edit..."/>
- <menu_item_call label="Tirar" name="Detach"/>
- <menu_item_call label="Sentar" name="Sit Down Here"/>
- <menu_item_call label="Ficar de pé" name="Stand Up"/>
- <menu_item_call label="Trocar de look" name="Change Outfit"/>
- <menu_item_call label="Editar meu look" name="Edit Outfit"/>
- <menu_item_call label="Editar meu corpo" name="Edit My Shape"/>
- <menu_item_call label="Meus amigos" name="Friends..."/>
- <menu_item_call label="Meus grupos" name="Groups..."/>
- <menu_item_call label="Meu perfil" name="Profile..."/>
- <menu_item_call label="Depurar texturas" name="Debug..."/>
- <menu_item_call label="Largar" name="Drop"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_avatar_icon.xml b/indra/newview/skins/minimal/xui/pt/menu_avatar_icon.xml
deleted file mode 100644
index beba969b7e..0000000000
--- a/indra/newview/skins/minimal/xui/pt/menu_avatar_icon.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Avatar Icon Menu">
- <menu_item_call label="Ver perfil" name="Show Profile"/>
- <menu_item_call label="Enviar MI..." name="Send IM"/>
- <menu_item_call label="Adicionar amigo..." name="Add Friend"/>
- <menu_item_call label="Remover amigo..." name="Remove Friend"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_avatar_other.xml b/indra/newview/skins/minimal/xui/pt/menu_avatar_other.xml
deleted file mode 100644
index a4a26144c7..0000000000
--- a/indra/newview/skins/minimal/xui/pt/menu_avatar_other.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<!-- *NOTE: See also menu_attachment_other.xml -->
-<context_menu name="Avatar Pie">
- <menu_item_call label="Ver perfil" name="Profile..."/>
- <menu_item_call label="Adicionar amigo..." name="Add Friend"/>
- <menu_item_call label="MI" name="Send IM..."/>
- <menu_item_call label="Ligar" name="Call"/>
- <menu_item_call label="Convidar para entrar no grupo" name="Invite..."/>
- <menu_item_call label="Bloquear" name="Avatar Mute"/>
- <menu_item_call label="Denunciar" name="abuse"/>
- <menu_item_call label="Congelar" name="Freeze..."/>
- <menu_item_call label="Ejetar" name="Eject..."/>
- <menu_item_call label="Depurar texturas" name="Debug..."/>
- <menu_item_call label="Mais zoom" name="Zoom In"/>
- <menu_item_call label="Pagar" name="Pay..."/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_avatar_self.xml b/indra/newview/skins/minimal/xui/pt/menu_avatar_self.xml
deleted file mode 100644
index 6e203d5a25..0000000000
--- a/indra/newview/skins/minimal/xui/pt/menu_avatar_self.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Self Pie">
- <menu_item_call label="Sentar" name="Sit Down Here"/>
- <menu_item_call label="Ficar de pé" name="Stand Up"/>
- <context_menu label="Tirar" name="Take Off &gt;">
- <context_menu label="Roupa" name="Clothes &gt;">
- <menu_item_call label="Camisa" name="Shirt"/>
- <menu_item_call label="Calças" name="Pants"/>
- <menu_item_call label="Saia" name="Skirt"/>
- <menu_item_call label="Sapatos" name="Shoes"/>
- <menu_item_call label="Meias" name="Socks"/>
- <menu_item_call label="Jaqueta" name="Jacket"/>
- <menu_item_call label="Luvas" name="Gloves"/>
- <menu_item_call label="Camiseta" name="Self Undershirt"/>
- <menu_item_call label="Roupa de baixo" name="Self Underpants"/>
- <menu_item_call label="Tatuagem" name="Self Tattoo"/>
- <menu_item_call label="Alpha" name="Self Alpha"/>
- <menu_item_call label="Todas as roupas" name="All Clothes"/>
- </context_menu>
- <context_menu label="HUD" name="Object Detach HUD"/>
- <context_menu label="Tirar" name="Object Detach"/>
- <menu_item_call label="Tirar tudo" name="Detach All"/>
- </context_menu>
- <menu_item_call label="Trocar de look" name="Chenge Outfit"/>
- <menu_item_call label="Editar meu look" name="Edit Outfit"/>
- <menu_item_call label="Editar meu corpo" name="Edit My Shape"/>
- <menu_item_call label="Meus amigos" name="Friends..."/>
- <menu_item_call label="Meus grupos" name="Groups..."/>
- <menu_item_call label="Meu perfil" name="Profile..."/>
- <menu_item_call label="Depurar texturas" name="Debug..."/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_bottomtray.xml b/indra/newview/skins/minimal/xui/pt/menu_bottomtray.xml
deleted file mode 100644
index 479d02512f..0000000000
--- a/indra/newview/skins/minimal/xui/pt/menu_bottomtray.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="hide_camera_move_controls_menu">
- <menu_item_check label="Botão de gestos" name="ShowGestureButton"/>
- <menu_item_check label="Botão de movimento" name="ShowMoveButton"/>
- <menu_item_check label="Botão de ver" name="ShowCameraButton"/>
- <menu_item_check label="Botão de fotos" name="ShowSnapshotButton"/>
- <menu_item_check label="Botão da Barra lateral" name="ShowSidebarButton"/>
- <menu_item_check label="Botão Construir" name="ShowBuildButton"/>
- <menu_item_check label="Botão Buscar" name="ShowSearchButton"/>
- <menu_item_check label="Botão Mapa" name="ShowWorldMapButton"/>
- <menu_item_check label="Botão do Mini Mapa" name="ShowMiniMapButton"/>
- <menu_item_call label="Cortar" name="NearbyChatBar_Cut"/>
- <menu_item_call label="Copiar" name="NearbyChatBar_Copy"/>
- <menu_item_call label="Colar" name="NearbyChatBar_Paste"/>
- <menu_item_call label="Excluir" name="NearbyChatBar_Delete"/>
- <menu_item_call label="Selecionar tudo" name="NearbyChatBar_Select_All"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_cof_attachment.xml b/indra/newview/skins/minimal/xui/pt/menu_cof_attachment.xml
deleted file mode 100644
index 527e3af3c9..0000000000
--- a/indra/newview/skins/minimal/xui/pt/menu_cof_attachment.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="COF Attachment">
- <menu_item_call label="Separar" name="detach"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_cof_body_part.xml b/indra/newview/skins/minimal/xui/pt/menu_cof_body_part.xml
deleted file mode 100644
index 704fd226eb..0000000000
--- a/indra/newview/skins/minimal/xui/pt/menu_cof_body_part.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="COF Body">
- <menu_item_call label="Trocar" name="replace"/>
- <menu_item_call label="Editar" name="edit"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_cof_clothing.xml b/indra/newview/skins/minimal/xui/pt/menu_cof_clothing.xml
deleted file mode 100644
index 051323ae6a..0000000000
--- a/indra/newview/skins/minimal/xui/pt/menu_cof_clothing.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="COF Clothing">
- <menu_item_call label="Tirar" name="take_off"/>
- <menu_item_call label="Editar" name="edit"/>
- <menu_item_call label="Trocar" name="replace"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_cof_gear.xml b/indra/newview/skins/minimal/xui/pt/menu_cof_gear.xml
deleted file mode 100644
index 8716992a5e..0000000000
--- a/indra/newview/skins/minimal/xui/pt/menu_cof_gear.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Gear COF">
- <menu label="Roupas novas" name="COF.Gear.New_Clothes"/>
- <menu label="Nova parte do corpo" name="COF.Geear.New_Body_Parts"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_edit.xml b/indra/newview/skins/minimal/xui/pt/menu_edit.xml
deleted file mode 100644
index ff431c9a21..0000000000
--- a/indra/newview/skins/minimal/xui/pt/menu_edit.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu label="Editar" name="Edit">
- <menu_item_call label="Desfazer" name="Undo"/>
- <menu_item_call label="Repetir" name="Redo"/>
- <menu_item_call label="Cortar" name="Cut"/>
- <menu_item_call label="Copiar" name="Copy"/>
- <menu_item_call label="Colar" name="Paste"/>
- <menu_item_call label="Excluir" name="Delete"/>
- <menu_item_call label="Replicar" name="Duplicate"/>
- <menu_item_call label="Selecionar tudo" name="Select All"/>
- <menu_item_call label="Desfazer seleção" name="Deselect"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_favorites.xml b/indra/newview/skins/minimal/xui/pt/menu_favorites.xml
deleted file mode 100644
index 062820fbca..0000000000
--- a/indra/newview/skins/minimal/xui/pt/menu_favorites.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Popup">
- <menu_item_call label="Teletransportar" name="Teleport To Landmark"/>
- <menu_item_call label="Ver/Editar marco" name="Landmark Open"/>
- <menu_item_call label="Copiar SLurl" name="Copy slurl"/>
- <menu_item_call label="Mostrar no mapa" name="Show On Map"/>
- <menu_item_call label="Copiar" name="Landmark Copy"/>
- <menu_item_call label="Colar" name="Landmark Paste"/>
- <menu_item_call label="Excluir" name="Delete"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_gesture_gear.xml b/indra/newview/skins/minimal/xui/pt/menu_gesture_gear.xml
deleted file mode 100644
index 70d8ae7a8e..0000000000
--- a/indra/newview/skins/minimal/xui/pt/menu_gesture_gear.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_gesture_gear">
- <menu_item_call label="Adicionar/remover de favoritos" name="activate"/>
- <menu_item_call label="Copiar" name="copy_gesture"/>
- <menu_item_call label="Colar" name="paste"/>
- <menu_item_call label="Copiar UUID" name="copy_uuid"/>
- <menu_item_call label="Salvar para look atual" name="save_to_outfit"/>
- <menu_item_call label="Editar" name="edit_gesture"/>
- <menu_item_call label="Verificar" name="inspect"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_group_plus.xml b/indra/newview/skins/minimal/xui/pt/menu_group_plus.xml
deleted file mode 100644
index 1083845d68..0000000000
--- a/indra/newview/skins/minimal/xui/pt/menu_group_plus.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_group_plus">
- <menu_item_call label="Entrar no grupo..." name="item_join"/>
- <menu_item_call label="Novo grupo..." name="item_new"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_hide_navbar.xml b/indra/newview/skins/minimal/xui/pt/menu_hide_navbar.xml
deleted file mode 100644
index c2b063193e..0000000000
--- a/indra/newview/skins/minimal/xui/pt/menu_hide_navbar.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="hide_navbar_menu">
- <menu_item_check label="Mostrar barra de navegação" name="ShowNavbarNavigationPanel"/>
- <menu_item_check label="Mostrar barra de favoritos" name="ShowNavbarFavoritesPanel"/>
- <menu_item_check label="Mostrar minibarra de localização" name="ShowMiniLocationPanel"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_im_well_button.xml b/indra/newview/skins/minimal/xui/pt/menu_im_well_button.xml
deleted file mode 100644
index 2d37cefd6f..0000000000
--- a/indra/newview/skins/minimal/xui/pt/menu_im_well_button.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="IM Well Button Context Menu">
- <menu_item_call label="Fechar tudo" name="Close All"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_imchiclet_adhoc.xml b/indra/newview/skins/minimal/xui/pt/menu_imchiclet_adhoc.xml
deleted file mode 100644
index ead949ba13..0000000000
--- a/indra/newview/skins/minimal/xui/pt/menu_imchiclet_adhoc.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="IMChiclet AdHoc Menu">
- <menu_item_call label="Encerrar esta sessão" name="End Session"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_imchiclet_group.xml b/indra/newview/skins/minimal/xui/pt/menu_imchiclet_group.xml
deleted file mode 100644
index dd177d1b8d..0000000000
--- a/indra/newview/skins/minimal/xui/pt/menu_imchiclet_group.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="IMChiclet Group Menu">
- <menu_item_call label="Sobre o grupo" name="Show Profile"/>
- <menu_item_call label="Mostrar sessão" name="Chat"/>
- <menu_item_call label="Encerrar esta sessão" name="End Session"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_imchiclet_p2p.xml b/indra/newview/skins/minimal/xui/pt/menu_imchiclet_p2p.xml
deleted file mode 100644
index d821b3ded0..0000000000
--- a/indra/newview/skins/minimal/xui/pt/menu_imchiclet_p2p.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="IMChiclet P2P Menu">
- <menu_item_call label="Ver perfil" name="Show Profile"/>
- <menu_item_call label="Adicionar amigo..." name="Add Friend"/>
- <menu_item_call label="Mostrar sessão" name="Send IM"/>
- <menu_item_call label="Encerrar esta sessão" name="End Session"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_inspect_avatar_gear.xml b/indra/newview/skins/minimal/xui/pt/menu_inspect_avatar_gear.xml
deleted file mode 100644
index 90b321e0a2..0000000000
--- a/indra/newview/skins/minimal/xui/pt/menu_inspect_avatar_gear.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<toggleable_menu name="Gear Menu">
- <menu_item_call label="Ver perfil" name="view_profile"/>
- <menu_item_call label="Adicionar amigo..." name="add_friend"/>
- <menu_item_call label="MI" name="im"/>
- <menu_item_call label="Ligar" name="call"/>
- <menu_item_call label="Teletransportar" name="teleport"/>
- <menu_item_call label="Bloquear" name="block"/>
- <menu_item_call label="Desbloquear" name="unblock"/>
- <menu_item_call label="Denunciar" name="report"/>
- <menu_item_call label="Congelar" name="freeze"/>
- <menu_item_call label="Ejetar" name="eject"/>
- <menu_item_call label="Chutar" name="kick"/>
- <menu_item_call label="CSR" name="csr"/>
- <menu_item_call label="Depurar texturas" name="debug"/>
- <menu_item_call label="Localizar no mapa" name="find_on_map"/>
- <menu_item_call label="Mais zoom" name="zoom_in"/>
-</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_inspect_object_gear.xml b/indra/newview/skins/minimal/xui/pt/menu_inspect_object_gear.xml
deleted file mode 100644
index 184db26538..0000000000
--- a/indra/newview/skins/minimal/xui/pt/menu_inspect_object_gear.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<menu name="Gear Menu">
- <menu_item_call label="Tocar" name="touch"/>
- <menu_item_call label="Sentar" name="sit"/>
- <menu_item_call label="Pagar" name="pay"/>
- <menu_item_call label="Comprar" name="buy"/>
- <menu_item_call label="Pegar" name="take"/>
- <menu_item_call label="Pegar uma cópia" name="take_copy"/>
- <menu_item_call label="Abrir" name="open"/>
- <menu_item_call label="Editar" name="edit"/>
- <menu_item_call label="Vestir" name="wear"/>
- <menu_item_call label="Adicionar" name="add"/>
- <menu_item_call label="Denunciar" name="report"/>
- <menu_item_call label="Bloquear" name="block"/>
- <menu_item_call label="Mais zoom" name="zoom_in"/>
- <menu_item_call label="Tirar" name="remove"/>
- <menu_item_call label="Mais informações" name="more_info"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_inspect_self_gear.xml b/indra/newview/skins/minimal/xui/pt/menu_inspect_self_gear.xml
deleted file mode 100644
index c1f27e765d..0000000000
--- a/indra/newview/skins/minimal/xui/pt/menu_inspect_self_gear.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<toggleable_menu name="Self Pie">
- <menu_item_call label="Sentar" name="Sit Down Here"/>
- <menu_item_call label="Ficar de pé" name="Stand Up"/>
- <menu_item_call label="Meus amigos" name="Friends..."/>
- <menu_item_call label="Meu perfil" name="Profile..."/>
- <menu_item_call label="Depurar texturas" name="Debug..."/>
-</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_inv_offer_chiclet.xml b/indra/newview/skins/minimal/xui/pt/menu_inv_offer_chiclet.xml
deleted file mode 100644
index c404719c95..0000000000
--- a/indra/newview/skins/minimal/xui/pt/menu_inv_offer_chiclet.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="InvOfferChiclet Menu">
- <menu_item_call label="Fechar" name="Close"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_inventory.xml b/indra/newview/skins/minimal/xui/pt/menu_inventory.xml
deleted file mode 100644
index 1b1efd3270..0000000000
--- a/indra/newview/skins/minimal/xui/pt/menu_inventory.xml
+++ /dev/null
@@ -1,86 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Popup">
- <menu_item_call label="Compartilhar" name="Share"/>
- <menu_item_call label="Comprar" name="Task Buy"/>
- <menu_item_call label="Abrir" name="Task Open"/>
- <menu_item_call label="Executar" name="Task Play"/>
- <menu_item_call label="Propriedades" name="Task Properties"/>
- <menu_item_call label="Renomear" name="Task Rename"/>
- <menu_item_call label="Apagar" name="Task Remove"/>
- <menu_item_call label="Limpar lixeira" name="Empty Trash"/>
- <menu_item_call label="Limpar Achados &amp; perdidos" name="Empty Lost And Found"/>
- <menu_item_call label="Nova pasta" name="New Folder"/>
- <menu_item_call label="Novo script" name="New Script"/>
- <menu_item_call label="Nova anotação" name="New Note"/>
- <menu_item_call label="Novo gesto" name="New Gesture"/>
- <menu label="Novas roupas" name="New Clothes">
- <menu_item_call label="Nova camisa" name="New Shirt"/>
- <menu_item_call label="Nova calça" name="New Pants"/>
- <menu_item_call label="Novos sapatos" name="New Shoes"/>
- <menu_item_call label="Novas meias" name="New Socks"/>
- <menu_item_call label="Nova jaqueta" name="New Jacket"/>
- <menu_item_call label="Nova saia" name="New Skirt"/>
- <menu_item_call label="Novas luvas" name="New Gloves"/>
- <menu_item_call label="Nova anágua" name="New Undershirt"/>
- <menu_item_call label="Nova roupa de baixo" name="New Underpants"/>
- <menu_item_call label="Nova máscara alfa" name="New Alpha Mask"/>
- <menu_item_call label="Nova tatuagem" name="New Tattoo"/>
- </menu>
- <menu label="Nova parte do corpo" name="New Body Parts">
- <menu_item_call label="Nova forma" name="New Shape"/>
- <menu_item_call label="Nova pele" name="New Skin"/>
- <menu_item_call label="Novo cabelo" name="New Hair"/>
- <menu_item_call label="Novos olhos" name="New Eyes"/>
- </menu>
- <menu label="Alterar fonte" name="Change Type">
- <menu_item_call label="Padrão" name="Default"/>
- <menu_item_call label="Luvas" name="Gloves"/>
- <menu_item_call label="Jaqueta" name="Jacket"/>
- <menu_item_call label="Calças" name="Pants"/>
- <menu_item_call label="Silhueta" name="Shape"/>
- <menu_item_call label="Sapatos" name="Shoes"/>
- <menu_item_call label="Camisa" name="Shirt"/>
- <menu_item_call label="Saia" name="Skirt"/>
- <menu_item_call label="Roupa de baixo" name="Underpants"/>
- <menu_item_call label="Camiseta" name="Undershirt"/>
- </menu>
- <menu_item_call label="Teletransporte" name="Landmark Open"/>
- <menu_item_call label="Abrir" name="Animation Open"/>
- <menu_item_call label="Abrir" name="Sound Open"/>
- <menu_item_call label="Substituir look" name="Replace Outfit"/>
- <menu_item_call label="Adicionar a look" name="Add To Outfit"/>
- <menu_item_call label="Tirar do look atual" name="Remove From Outfit"/>
- <menu_item_call label="Encontrar original" name="Find Original"/>
- <menu_item_call label="Remover item" name="Purge Item"/>
- <menu_item_call label="Restaurar item" name="Restore Item"/>
- <menu_item_call label="Abrir" name="Open"/>
- <menu_item_call label="Abrir original" name="Open Original"/>
- <menu_item_call label="Propriedades" name="Properties"/>
- <menu_item_call label="Renomear" name="Rename"/>
- <menu_item_call label="Copiar item UUID" name="Copy Asset UUID"/>
- <menu_item_call label="Copiar" name="Copy"/>
- <menu_item_call label="Colar" name="Paste"/>
- <menu_item_call label="Colar como link" name="Paste As Link"/>
- <menu_item_call label="Excluir" name="Remove Link"/>
- <menu_item_call label="Apagar" name="Delete"/>
- <menu_item_call label="Excluir pasta do sistema" name="Delete System Folder"/>
- <menu_item_call label="Pasta conversa em conferência" name="Conference Chat Folder"/>
- <menu_item_call label="Executar som" name="Sound Play"/>
- <menu_item_call label="Sobre o marco" name="About Landmark"/>
- <menu_item_call label="Executar animação" name="Animation Play"/>
- <menu_item_call label="Executar áudio" name="Animation Audition"/>
- <menu_item_call label="Mandar MI" name="Send Instant Message"/>
- <menu_item_call label="Oferecer teletransporte..." name="Offer Teleport..."/>
- <menu_item_call label="Bate-papo em conferência" name="Conference Chat"/>
- <menu_item_call label="Ativar" name="Activate"/>
- <menu_item_call label="Desativar" name="Deactivate"/>
- <menu_item_call label="Salvar como" name="Save As"/>
- <menu_item_call label="Tirar de si mesmo" name="Detach From Yourself"/>
- <menu_item_call label="Vestir" name="Wearable And Object Wear"/>
- <menu label="Anexar a" name="Attach To"/>
- <menu label="Anexar ao HUD" name="Attach To HUD"/>
- <menu_item_call label="Editar" name="Wearable Edit"/>
- <menu_item_call label="Adicionar" name="Wearable Add"/>
- <menu_item_call label="Tirar" name="Take Off"/>
- <menu_item_call label="--Sem opções--" name="--no options--"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_inventory_add.xml b/indra/newview/skins/minimal/xui/pt/menu_inventory_add.xml
deleted file mode 100644
index 2723f39287..0000000000
--- a/indra/newview/skins/minimal/xui/pt/menu_inventory_add.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_inventory_add">
- <menu label="Upload" name="upload">
- <menu_item_call label="Imagem (L$[COST])..." name="Upload Image"/>
- <menu_item_call label="Som (L$[COST])..." name="Upload Sound"/>
- <menu_item_call label="Animação (L$[COST])..." name="Upload Animation"/>
- <menu_item_call label="Volume (L$[COST] per file)..." name="Bulk Upload"/>
- <menu_item_call label="Autorizações de upload padrão" name="perm prefs"/>
- </menu>
- <menu_item_call label="Nova pasta" name="New Folder"/>
- <menu_item_call label="Novo script" name="New Script"/>
- <menu_item_call label="Nova anotação" name="New Note"/>
- <menu_item_call label="Novo gesto" name="New Gesture"/>
- <menu label="Novas roupas" name="New Clothes">
- <menu_item_call label="Nova camisa" name="New Shirt"/>
- <menu_item_call label="Novas calças" name="New Pants"/>
- <menu_item_call label="Novos sapatos" name="New Shoes"/>
- <menu_item_call label="Novas meias" name="New Socks"/>
- <menu_item_call label="Nova blusa" name="New Jacket"/>
- <menu_item_call label="Nova saia" name="New Skirt"/>
- <menu_item_call label="Novas luvas" name="New Gloves"/>
- <menu_item_call label="Nova camiseta" name="New Undershirt"/>
- <menu_item_call label="Novas roupa de baixo" name="New Underpants"/>
- <menu_item_call label="Novo alpha" name="New Alpha"/>
- <menu_item_call label="Nova tatuagem" name="New Tattoo"/>
- </menu>
- <menu label="Nova parte do corpo" name="New Body Parts">
- <menu_item_call label="Nova forma" name="New Shape"/>
- <menu_item_call label="Nova pele" name="New Skin"/>
- <menu_item_call label="Novo cabelo" name="New Hair"/>
- <menu_item_call label="Novos olhos" name="New Eyes"/>
- </menu>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_inventory_gear_default.xml b/indra/newview/skins/minimal/xui/pt/menu_inventory_gear_default.xml
deleted file mode 100644
index 3400578d9a..0000000000
--- a/indra/newview/skins/minimal/xui/pt/menu_inventory_gear_default.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<toggleable_menu name="menu_gear_default">
- <menu_item_call label="Nova janela de inventário" name="new_window"/>
- <menu_item_check label="Ordenar por nome" name="sort_by_name"/>
- <menu_item_check label="Ordenar por mais recente" name="sort_by_recent"/>
- <menu_item_check label="Pastas do sistema no topo" name="sort_system_folders_to_top"/>
- <menu_item_call label="Mostrar filtros" name="show_filters"/>
- <menu_item_call label="Restabelecer filtros" name="reset_filters"/>
- <menu_item_call label="Fechar todas as pastas" name="close_folders"/>
- <menu_item_call label="Esvaziar achados e perdidos" name="empty_lostnfound"/>
- <menu_item_call label="Salvar textura como" name="Save Texture As"/>
- <menu_item_call label="Compartilhar" name="Share"/>
- <menu_item_call label="Encontrar original" name="Find Original"/>
- <menu_item_call label="Encontrar todos os links" name="Find All Links"/>
- <menu_item_call label="Esvaziar lixeira" name="empty_trash"/>
-</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_land.xml b/indra/newview/skins/minimal/xui/pt/menu_land.xml
deleted file mode 100644
index 9182ce321a..0000000000
--- a/indra/newview/skins/minimal/xui/pt/menu_land.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Land Pie">
- <menu_item_call label="Sobre terrenos" name="Place Information..."/>
- <menu_item_call label="Sentar aqui" name="Sit Here"/>
- <menu_item_call label="Comprar este terreno" name="Land Buy"/>
- <menu_item_call label="Comprar passe" name="Land Buy Pass"/>
- <menu_item_call label="Construir" name="Create"/>
- <menu_item_call label="Editar a topografia" name="Edit Terrain"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_landmark.xml b/indra/newview/skins/minimal/xui/pt/menu_landmark.xml
deleted file mode 100644
index 6accfebee7..0000000000
--- a/indra/newview/skins/minimal/xui/pt/menu_landmark.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<toggleable_menu name="landmark_overflow_menu">
- <menu_item_call label="Copiar SLurl" name="copy"/>
- <menu_item_call label="Excluir" name="delete"/>
- <menu_item_call label="Criar destaque" name="pick"/>
- <menu_item_call label="Adicionar à barra de favoritos" name="add_to_favbar"/>
-</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_login.xml b/indra/newview/skins/minimal/xui/pt/menu_login.xml
deleted file mode 100644
index 3dff3d7c8a..0000000000
--- a/indra/newview/skins/minimal/xui/pt/menu_login.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu_bar name="Login Menu">
- <menu label="Eu" name="File">
- <menu_item_call label="Preferências" name="Preferences..."/>
- <menu_item_call label="Sair do [APP_NAME]" name="Quit"/>
- </menu>
- <menu label="Ajuda" name="Help">
- <menu_item_call label="Ajuda do [SECOND_LIFE]" name="Second Life Help"/>
- <menu_item_call label="Sobre [APP_NAME]" name="About Second Life"/>
- </menu>
- <menu_item_check label="Exibir menu de depuração" name="Show Debug Menu"/>
- <menu label="Depurar" name="Debug">
- <menu_item_call label="Mostrar configurações" name="Debug Settings"/>
- <menu_item_call label="Configurações da interface e cor" name="UI/Color Settings"/>
- <menu label="Testes de UI" name="UI Tests"/>
- <menu_item_call label="Definir tamanho da janela:" name="Set Window Size..."/>
- <menu_item_call label="Mostrar TOS" name="TOS"/>
- <menu_item_call label="Mostrar mensagem crítica" name="Critical"/>
- <menu_item_call label="Teste de mídia do navegador" name="Web Browser Test"/>
- <menu_item_call label="Teste de conteúdo web" name="Web Content Floater Test"/>
- <menu_item_check label="Exibir seletor da grade" name="Show Grid Picker"/>
- <menu_item_call label="Exibir painel de notificações" name="Show Notifications Console"/>
- </menu>
-</menu_bar>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_mini_map.xml b/indra/newview/skins/minimal/xui/pt/menu_mini_map.xml
deleted file mode 100644
index 6a3fe55de5..0000000000
--- a/indra/newview/skins/minimal/xui/pt/menu_mini_map.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Popup">
- <menu_item_call label="Zoom Perto" name="Zoom Close"/>
- <menu_item_call label="Zoom Médio" name="Zoom Medium"/>
- <menu_item_call label="Zoom Longe" name="Zoom Far"/>
- <menu_item_call label="Zoom padrão" name="Zoom Default"/>
- <menu_item_check label="Girar mapa" name="Rotate Map"/>
- <menu_item_check label="Auto Center" name="Auto Center"/>
- <menu_item_call label="Parar Acompanhamento" name="Stop Tracking"/>
- <menu_item_call label="Mapa-múndi" name="World Map"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_navbar.xml b/indra/newview/skins/minimal/xui/pt/menu_navbar.xml
deleted file mode 100644
index 57c1471de3..0000000000
--- a/indra/newview/skins/minimal/xui/pt/menu_navbar.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Navbar Menu">
- <menu_item_check label="Mostrar coordenadas" name="Show Coordinates"/>
- <menu_item_check label="Mostrar as propriedades do terreno" name="Show Parcel Properties"/>
- <menu_item_call label="Marco" name="Landmark"/>
- <menu_item_call label="Cortar" name="Cut"/>
- <menu_item_call label="Copiar" name="Copy"/>
- <menu_item_call label="Colar" name="Paste"/>
- <menu_item_call label="Excluir" name="Delete"/>
- <menu_item_call label="Selecionar tudo" name="Select All"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_nearby_chat.xml b/indra/newview/skins/minimal/xui/pt/menu_nearby_chat.xml
deleted file mode 100644
index f1ea83c837..0000000000
--- a/indra/newview/skins/minimal/xui/pt/menu_nearby_chat.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="NearBy Chat Menu">
- <menu_item_call label="Mostrar quem está aqui..." name="nearby_people"/>
- <menu_item_check label="Mostrar texto bloqueado" name="muted_text"/>
- <menu_item_check label="Mostrar ícones de amigos" name="show_buddy_icons"/>
- <menu_item_check label="Mostrar nomes" name="show_names"/>
- <menu_item_check label="Mostrar ícones e nomes" name="show_icons_and_names"/>
- <menu_item_call label="Tamanho da fonte" name="font_size"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_notification_well_button.xml b/indra/newview/skins/minimal/xui/pt/menu_notification_well_button.xml
deleted file mode 100644
index 43ad4134ec..0000000000
--- a/indra/newview/skins/minimal/xui/pt/menu_notification_well_button.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Notification Well Button Context Menu">
- <menu_item_call label="Fechar tudo" name="Close All"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_object.xml b/indra/newview/skins/minimal/xui/pt/menu_object.xml
deleted file mode 100644
index bf94859699..0000000000
--- a/indra/newview/skins/minimal/xui/pt/menu_object.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Object Pie">
- <menu_item_call label="Tocar" name="Object Touch">
- <menu_item_call.on_enable name="EnableTouch" parameter="Tocar"/>
- </menu_item_call>
- <menu_item_call label="Editar" name="Edit..."/>
- <menu_item_call label="Construir" name="Build"/>
- <menu_item_call label="Abrir" name="Open"/>
- <menu_item_call label="Sentar aqui" name="Object Sit"/>
- <menu_item_call label="Ficar de pé" name="Object Stand Up"/>
- <menu_item_call label="Perfil do objeto" name="Object Inspect"/>
- <menu_item_call label="Mais zoom" name="Zoom In"/>
- <context_menu label="Colocar no(a)" name="Put On">
- <menu_item_call label="Vestir" name="Wear"/>
- <menu_item_call label="Adicionar" name="Add"/>
- <context_menu label="Anexar" name="Object Attach"/>
- <context_menu label="Anexar o HUD" name="Object Attach HUD"/>
- </context_menu>
- <context_menu label="Tirar" name="Remove">
- <menu_item_call label="Denunciar abuso" name="Report Abuse..."/>
- <menu_item_call label="Bloquear" name="Object Mute"/>
- <menu_item_call label="Devolver" name="Return..."/>
- <menu_item_call label="Excluir" name="Delete"/>
- </context_menu>
- <menu_item_call label="Pegar" name="Pie Object Take"/>
- <menu_item_call label="Pegar uma cópia" name="Take Copy"/>
- <menu_item_call label="Pagar" name="Pay..."/>
- <menu_item_call label="Comprar" name="Buy..."/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_object_icon.xml b/indra/newview/skins/minimal/xui/pt/menu_object_icon.xml
deleted file mode 100644
index 7af760a6ee..0000000000
--- a/indra/newview/skins/minimal/xui/pt/menu_object_icon.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Object Icon Menu">
- <menu_item_call label="Perfil do objeto..." name="Object Profile"/>
- <menu_item_call label="Bloquear..." name="Block"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_outfit_gear.xml b/indra/newview/skins/minimal/xui/pt/menu_outfit_gear.xml
deleted file mode 100644
index 11b3e653c6..0000000000
--- a/indra/newview/skins/minimal/xui/pt/menu_outfit_gear.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Gear Outfit">
- <menu_item_call label="Vestir - Substituir look atual" name="wear"/>
- <menu_item_call label="Vestir - Adicionar ao look atual" name="wear_add"/>
- <menu_item_call label="Tirar - Tirar do look atual" name="take_off"/>
- <menu label="Roupas novas" name="New Clothes">
- <menu_item_call label="Nova camisa" name="New Shirt"/>
- <menu_item_call label="Novas calças" name="New Pants"/>
- <menu_item_call label="Novos sapatos" name="New Shoes"/>
- <menu_item_call label="Novas meias" name="New Socks"/>
- <menu_item_call label="Nova blusa" name="New Jacket"/>
- <menu_item_call label="Nova saia" name="New Skirt"/>
- <menu_item_call label="Novas luvas" name="New Gloves"/>
- <menu_item_call label="Nova camiseta" name="New Undershirt"/>
- <menu_item_call label="Novas roupa de baixo" name="New Underpants"/>
- <menu_item_call label="Novo alpha" name="New Alpha"/>
- <menu_item_call label="Nova tatuagem" name="New Tattoo"/>
- </menu>
- <menu label="Nova parte do corpo" name="New Body Parts">
- <menu_item_call label="Nova silhueta" name="New Shape"/>
- <menu_item_call label="Nova pele" name="New Skin"/>
- <menu_item_call label="Novo cabelo" name="New Hair"/>
- <menu_item_call label="Novos olhos" name="New Eyes"/>
- </menu>
- <menu_item_call label="Renomear look" name="rename"/>
- <menu_item_call label="Excluir visual" name="delete_outfit"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_outfit_tab.xml b/indra/newview/skins/minimal/xui/pt/menu_outfit_tab.xml
deleted file mode 100644
index 8db5e405b3..0000000000
--- a/indra/newview/skins/minimal/xui/pt/menu_outfit_tab.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Outfit">
- <menu_item_call label="Vestir - Substituir look atual" name="wear_replace"/>
- <menu_item_call label="Vestir - Sem tirar look atual" name="wear_add"/>
- <menu_item_call label="Tirar - Tirar do look atual" name="take_off"/>
- <menu_item_call label="Editar look" name="edit"/>
- <menu_item_call label="Renomear look" name="rename"/>
- <menu_item_call label="Excluir visual" name="delete"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_participant_list.xml b/indra/newview/skins/minimal/xui/pt/menu_participant_list.xml
deleted file mode 100644
index 01f1d4ef80..0000000000
--- a/indra/newview/skins/minimal/xui/pt/menu_participant_list.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Participant List Context Menu">
- <menu_item_check label="Ordenar por nome" name="SortByName"/>
- <menu_item_check label="Ordenar por conversas mais recentes" name="SortByRecentSpeakers"/>
- <menu_item_call label="Ver perfil" name="View Profile"/>
- <menu_item_call label="Adicionar amigo..." name="Add Friend"/>
- <menu_item_call label="MI" name="IM"/>
- <menu_item_call label="Ligar" name="Call"/>
- <menu_item_call label="Compartilhar" name="Share"/>
- <menu_item_call label="Pagar" name="Pay"/>
- <menu_item_check label="Ver ícones de pessoas" name="View Icons"/>
- <menu_item_check label="Bloquear voz" name="Block/Unblock"/>
- <menu_item_check label="Bloquear texto" name="MuteText"/>
- <context_menu label="Opções do moderador &gt;" name="Moderator Options">
- <menu_item_check label="Pode bater papo por escrito" name="AllowTextChat"/>
- <menu_item_call label="Silenciar este participante" name="ModerateVoiceMuteSelected"/>
- <menu_item_call label="Desfazer silenciar deste participante" name="ModerateVoiceUnMuteSelected"/>
- <menu_item_call label="Silenciar todos" name="ModerateVoiceMute"/>
- <menu_item_call label="Desfazer silenciar para todos" name="ModerateVoiceUnmute"/>
- </context_menu>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_people_friends_view_sort.xml b/indra/newview/skins/minimal/xui/pt/menu_people_friends_view_sort.xml
deleted file mode 100644
index e7c325010f..0000000000
--- a/indra/newview/skins/minimal/xui/pt/menu_people_friends_view_sort.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_group_plus">
- <menu_item_check label="Ordenar por nome" name="sort_name"/>
- <menu_item_check label="Ordenar por status" name="sort_status"/>
- <menu_item_check label="Ver ícones de pessoas" name="view_icons"/>
- <menu_item_check label="Autorizações de visualização dadas" name="view_permissions"/>
- <menu_item_call label="Ver residentes e objetos bloqueados" name="show_blocked_list"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_people_groups.xml b/indra/newview/skins/minimal/xui/pt/menu_people_groups.xml
deleted file mode 100644
index 9a924ad7b9..0000000000
--- a/indra/newview/skins/minimal/xui/pt/menu_people_groups.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_group_plus">
- <menu_item_call label="Ver dados" name="View Info"/>
- <menu_item_call label="Bate-papo" name="Chat"/>
- <menu_item_call label="Ligar" name="Call"/>
- <menu_item_call label="Ativar" name="Activate"/>
- <menu_item_call label="Sair" name="Leave"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_people_groups_view_sort.xml b/indra/newview/skins/minimal/xui/pt/menu_people_groups_view_sort.xml
deleted file mode 100644
index 86a9d2263f..0000000000
--- a/indra/newview/skins/minimal/xui/pt/menu_people_groups_view_sort.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_group_plus">
- <menu_item_check label="Mostrar ícones de grupos" name="Display Group Icons"/>
- <menu_item_call label="Sair do grupo selecionado" name="Leave Selected Group"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_people_nearby.xml b/indra/newview/skins/minimal/xui/pt/menu_people_nearby.xml
deleted file mode 100644
index b446a2fe81..0000000000
--- a/indra/newview/skins/minimal/xui/pt/menu_people_nearby.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Avatar Context Menu">
- <menu_item_call label="Ver perfil" name="View Profile"/>
- <menu_item_call label="Adicionar amigo" name="Add Friend"/>
- <menu_item_call label="Remover amigo" name="Remove Friend"/>
- <menu_item_call label="IM" name="IM"/>
- <menu_item_call label="Ligar" name="Call"/>
- <menu_item_call label="Mapa" name="Map"/>
- <menu_item_call label="Compartilhar" name="Share"/>
- <menu_item_call label="Pagar" name="Pay"/>
- <menu_item_check label="Bloquear/desbloquear" name="Block/Unblock"/>
- <menu_item_call label="Teletransportar?" name="teleport"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_people_nearby_multiselect.xml b/indra/newview/skins/minimal/xui/pt/menu_people_nearby_multiselect.xml
deleted file mode 100644
index 79edb96b1c..0000000000
--- a/indra/newview/skins/minimal/xui/pt/menu_people_nearby_multiselect.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Multi-Selected People Context Menu">
- <menu_item_call label="Adicionar amigo..." name="Add Friends"/>
- <menu_item_call label="Remover amigo..." name="Remove Friend"/>
- <menu_item_call label="MI" name="IM"/>
- <menu_item_call label="Ligar" name="Call"/>
- <menu_item_call label="Compartilhar" name="Share"/>
- <menu_item_call label="Pagar" name="Pay"/>
- <menu_item_call label="Teletransportar?" name="teleport"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_people_nearby_view_sort.xml b/indra/newview/skins/minimal/xui/pt/menu_people_nearby_view_sort.xml
deleted file mode 100644
index 228ce46a31..0000000000
--- a/indra/newview/skins/minimal/xui/pt/menu_people_nearby_view_sort.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_group_plus">
- <menu_item_check label="Ordenar por conversas mais recentes" name="sort_by_recent_speakers"/>
- <menu_item_check label="Ordenar por nome" name="sort_name"/>
- <menu_item_check label="Ordenar por distância" name="sort_distance"/>
- <menu_item_check label="Ver ícones de pessoas" name="view_icons"/>
- <menu_item_call label="Ver residentes e objetos bloqueados" name="show_blocked_list"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_people_recent_view_sort.xml b/indra/newview/skins/minimal/xui/pt/menu_people_recent_view_sort.xml
deleted file mode 100644
index f3b89e01cd..0000000000
--- a/indra/newview/skins/minimal/xui/pt/menu_people_recent_view_sort.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_group_plus">
- <menu_item_check label="Ordenar por mais recente" name="sort_most"/>
- <menu_item_check label="Ordenar por nome" name="sort_name"/>
- <menu_item_check label="Ver ícones de pessoas" name="view_icons"/>
- <menu_item_call label="Ver residentes e objetos bloqueados" name="show_blocked_list"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_picks.xml b/indra/newview/skins/minimal/xui/pt/menu_picks.xml
deleted file mode 100644
index 8b9e10fc02..0000000000
--- a/indra/newview/skins/minimal/xui/pt/menu_picks.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Picks">
- <menu_item_call label="Info" name="pick_info"/>
- <menu_item_call label="Editar" name="pick_edit"/>
- <menu_item_call label="Teletransportar" name="pick_teleport"/>
- <menu_item_call label="Mapa" name="pick_map"/>
- <menu_item_call label="Excluir" name="pick_delete"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_picks_plus.xml b/indra/newview/skins/minimal/xui/pt/menu_picks_plus.xml
deleted file mode 100644
index 95a7c05262..0000000000
--- a/indra/newview/skins/minimal/xui/pt/menu_picks_plus.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<toggleable_menu name="picks_plus_menu">
- <menu_item_call label="Adicionar" name="create_pick"/>
- <menu_item_call label="Novo anúncio" name="create_classified"/>
-</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_place.xml b/indra/newview/skins/minimal/xui/pt/menu_place.xml
deleted file mode 100644
index 282ea20a7a..0000000000
--- a/indra/newview/skins/minimal/xui/pt/menu_place.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<toggleable_menu name="place_overflow_menu">
- <menu_item_call label="Criar marco" name="landmark"/>
- <menu_item_call label="Criar destaque" name="pick"/>
- <menu_item_call label="Comprar passe" name="pass"/>
- <menu_item_call label="Editar" name="edit"/>
-</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_place_add_button.xml b/indra/newview/skins/minimal/xui/pt/menu_place_add_button.xml
deleted file mode 100644
index d099d04f8d..0000000000
--- a/indra/newview/skins/minimal/xui/pt/menu_place_add_button.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_folder_gear">
- <menu_item_call label="Adicionar pasta" name="add_folder"/>
- <menu_item_call label="Adicionar marco" name="add_landmark"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_places_gear_folder.xml b/indra/newview/skins/minimal/xui/pt/menu_places_gear_folder.xml
deleted file mode 100644
index 2059a9ed2d..0000000000
--- a/indra/newview/skins/minimal/xui/pt/menu_places_gear_folder.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_folder_gear">
- <menu_item_call label="Adicionar marco" name="add_landmark"/>
- <menu_item_call label="Adicionar pasta" name="add_folder"/>
- <menu_item_call label="Cortar" name="cut"/>
- <menu_item_call label="Copiar" name="copy_folder"/>
- <menu_item_call label="Colar" name="paste"/>
- <menu_item_call label="Renomear" name="rename"/>
- <menu_item_call label="Excluir" name="delete"/>
- <menu_item_call label="Expanda" name="expand"/>
- <menu_item_call label="Recolher" name="collapse"/>
- <menu_item_call label="Expandir todas as pastas" name="expand_all"/>
- <menu_item_call label="Recolher todas as pastas" name="collapse_all"/>
- <menu_item_check label="Ordenar por data" name="sort_by_date"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_places_gear_landmark.xml b/indra/newview/skins/minimal/xui/pt/menu_places_gear_landmark.xml
deleted file mode 100644
index 52a9d13735..0000000000
--- a/indra/newview/skins/minimal/xui/pt/menu_places_gear_landmark.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_ladmark_gear">
- <menu_item_call label="Teletransportar" name="teleport"/>
- <menu_item_call label="Mais informações" name="more_info"/>
- <menu_item_call label="Mostrar no mapa" name="show_on_map"/>
- <menu_item_call label="Adicionar marco" name="add_landmark"/>
- <menu_item_call label="Adicionar pasta" name="add_folder"/>
- <menu_item_call label="Cortar" name="cut"/>
- <menu_item_call label="Copiar marco" name="copy_landmark"/>
- <menu_item_call label="Copiar SLurl" name="copy_slurl"/>
- <menu_item_call label="Colar" name="paste"/>
- <menu_item_call label="Renomear" name="rename"/>
- <menu_item_call label="Excluir" name="delete"/>
- <menu_item_call label="Expandir todas as pastas" name="expand_all"/>
- <menu_item_call label="Recolher todas as pastas" name="collapse_all"/>
- <menu_item_check label="Ordenar por data" name="sort_by_date"/>
- <menu_item_call label="Criar destaque" name="create_pick"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_profile_overflow.xml b/indra/newview/skins/minimal/xui/pt/menu_profile_overflow.xml
deleted file mode 100644
index d41ecbd755..0000000000
--- a/indra/newview/skins/minimal/xui/pt/menu_profile_overflow.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<toggleable_menu name="profile_overflow_menu">
- <menu_item_call label="Mapa" name="show_on_map"/>
- <menu_item_call label="Pagar" name="pay"/>
- <menu_item_call label="Compartilhar" name="share"/>
- <menu_item_call label="Bloquear" name="block"/>
- <menu_item_call label="Desbloquear" name="unblock"/>
- <menu_item_call label="Chutar" name="kick"/>
- <menu_item_call label="Congelar" name="freeze"/>
- <menu_item_call label="Descongelar" name="unfreeze"/>
- <menu_item_call label="CSR" name="csr"/>
-</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_save_outfit.xml b/indra/newview/skins/minimal/xui/pt/menu_save_outfit.xml
deleted file mode 100644
index 61c6b9202f..0000000000
--- a/indra/newview/skins/minimal/xui/pt/menu_save_outfit.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<toggleable_menu name="save_outfit_menu">
- <menu_item_call label="Salvar" name="save_outfit"/>
- <menu_item_call label="Salvar como" name="save_as_new_outfit"/>
-</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_script_chiclet.xml b/indra/newview/skins/minimal/xui/pt/menu_script_chiclet.xml
deleted file mode 100644
index ccf3878e14..0000000000
--- a/indra/newview/skins/minimal/xui/pt/menu_script_chiclet.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="ScriptChiclet Menu">
- <menu_item_call label="Fechar" name="Close"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_slurl.xml b/indra/newview/skins/minimal/xui/pt/menu_slurl.xml
deleted file mode 100644
index 6d4c84fc3c..0000000000
--- a/indra/newview/skins/minimal/xui/pt/menu_slurl.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Popup">
- <menu_item_call label="Sobre a URL" name="about_url"/>
- <menu_item_call label="Teletransporte para a URL" name="teleport_to_url"/>
- <menu_item_call label="Mapa" name="show_on_map"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_teleport_history_gear.xml b/indra/newview/skins/minimal/xui/pt/menu_teleport_history_gear.xml
deleted file mode 100644
index f034509be8..0000000000
--- a/indra/newview/skins/minimal/xui/pt/menu_teleport_history_gear.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Teleport History Gear Context Menu">
- <menu_item_call label="Expandir todas as pastas" name="Expand all folders"/>
- <menu_item_call label="Recolher todas as pastas" name="Collapse all folders"/>
- <menu_item_call label="Limpar histórico de teletransporte" name="Clear Teleport History"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_teleport_history_item.xml b/indra/newview/skins/minimal/xui/pt/menu_teleport_history_item.xml
deleted file mode 100644
index ec1e7a0950..0000000000
--- a/indra/newview/skins/minimal/xui/pt/menu_teleport_history_item.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Teleport History Item Context Menu">
- <menu_item_call label="Teletransportar" name="Teleport"/>
- <menu_item_call label="Mais informações" name="More Information"/>
- <menu_item_call label="Copiar" name="CopyToClipboard"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_teleport_history_tab.xml b/indra/newview/skins/minimal/xui/pt/menu_teleport_history_tab.xml
deleted file mode 100644
index 6a633cf74c..0000000000
--- a/indra/newview/skins/minimal/xui/pt/menu_teleport_history_tab.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Teleport History Item Context Menu">
- <menu_item_call label="Abrir" name="TabOpen"/>
- <menu_item_call label="Fechar" name="TabClose"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_text_editor.xml b/indra/newview/skins/minimal/xui/pt/menu_text_editor.xml
deleted file mode 100644
index 31c284c6ed..0000000000
--- a/indra/newview/skins/minimal/xui/pt/menu_text_editor.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Text editor context menu">
- <menu_item_call label="Cortar" name="Cut"/>
- <menu_item_call label="Copiar" name="Copy"/>
- <menu_item_call label="Colar" name="Paste"/>
- <menu_item_call label="Excluir" name="Delete"/>
- <menu_item_call label="Selecionar tudo" name="Select All"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_topinfobar.xml b/indra/newview/skins/minimal/xui/pt/menu_topinfobar.xml
deleted file mode 100644
index d9347950b1..0000000000
--- a/indra/newview/skins/minimal/xui/pt/menu_topinfobar.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_topinfobar">
- <menu_item_check label="Mostrar coordenadas" name="Show Coordinates"/>
- <menu_item_check label="Mostrar as propriedades do terreno" name="Show Parcel Properties"/>
- <menu_item_call label="Marco" name="Landmark"/>
- <menu_item_call label="Copiar" name="Copy"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_url_agent.xml b/indra/newview/skins/minimal/xui/pt/menu_url_agent.xml
deleted file mode 100644
index ba5e055124..0000000000
--- a/indra/newview/skins/minimal/xui/pt/menu_url_agent.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Url Popup">
- <menu_item_call label="Mostrar perfil de residente" name="show_agent"/>
- <menu_item_call label="Copiar nome para área de transferência" name="url_copy_label"/>
- <menu_item_call label="Copiar SLurl para área de transferência" name="url_copy"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_url_group.xml b/indra/newview/skins/minimal/xui/pt/menu_url_group.xml
deleted file mode 100644
index 5b67a69c9a..0000000000
--- a/indra/newview/skins/minimal/xui/pt/menu_url_group.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Url Popup">
- <menu_item_call label="Mostrar informações do grupo" name="show_group"/>
- <menu_item_call label="Copiar SLurl para área de transferência" name="url_copy_label"/>
- <menu_item_call label="Copiar SLurl para área de transferência" name="url_copy"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_url_http.xml b/indra/newview/skins/minimal/xui/pt/menu_url_http.xml
deleted file mode 100644
index e53a2572b8..0000000000
--- a/indra/newview/skins/minimal/xui/pt/menu_url_http.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Url Popup">
- <menu_item_call label="Abrir página da web" name="url_open"/>
- <menu_item_call label="Abrir no navegador do SL" name="url_open_internal"/>
- <menu_item_call label="Abrir no navegador externo" name="url_open_external"/>
- <menu_item_call label="Copiar URL para área de transferência" name="url_copy"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_url_inventory.xml b/indra/newview/skins/minimal/xui/pt/menu_url_inventory.xml
deleted file mode 100644
index 45c14355d0..0000000000
--- a/indra/newview/skins/minimal/xui/pt/menu_url_inventory.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Url Popup">
- <menu_item_call label="Mostrar item de inventário" name="show_item"/>
- <menu_item_call label="Copiar nome para área de transferência" name="url_copy_label"/>
- <menu_item_call label="Copiar SLurl para área de transferência" name="url_copy"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_url_map.xml b/indra/newview/skins/minimal/xui/pt/menu_url_map.xml
deleted file mode 100644
index ba114cccaa..0000000000
--- a/indra/newview/skins/minimal/xui/pt/menu_url_map.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Url Popup">
- <menu_item_call label="Mostrar no mapa" name="show_on_map"/>
- <menu_item_call label="Teletransportar para este lugar" name="teleport_to_location"/>
- <menu_item_call label="Copiar SLurl para área de transferência" name="url_copy"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_url_objectim.xml b/indra/newview/skins/minimal/xui/pt/menu_url_objectim.xml
deleted file mode 100644
index c197444181..0000000000
--- a/indra/newview/skins/minimal/xui/pt/menu_url_objectim.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Url Popup">
- <menu_item_call label="Mostrar informações sobre o objeto" name="show_object"/>
- <menu_item_call label="Mostrar no mapa" name="show_on_map"/>
- <menu_item_call label="Teletransportar para lugar do objeto" name="teleport_to_object"/>
- <menu_item_call label="Copiar nome do objeto para área de transferência" name="url_copy_label"/>
- <menu_item_call label="Copiar SLurl para área de transferência" name="url_copy"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_url_parcel.xml b/indra/newview/skins/minimal/xui/pt/menu_url_parcel.xml
deleted file mode 100644
index 6cc668bfd3..0000000000
--- a/indra/newview/skins/minimal/xui/pt/menu_url_parcel.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Url Popup">
- <menu_item_call label="Mostrar informações sobre este lote" name="show_parcel"/>
- <menu_item_call label="Mostrar no mapa" name="show_on_map"/>
- <menu_item_call label="Copiar SLurl para área de transferência" name="url_copy"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_url_slapp.xml b/indra/newview/skins/minimal/xui/pt/menu_url_slapp.xml
deleted file mode 100644
index d0784149ac..0000000000
--- a/indra/newview/skins/minimal/xui/pt/menu_url_slapp.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Url Popup">
- <menu_item_call label="Executar este comando" name="run_slapp"/>
- <menu_item_call label="Copiar SLurl para área de transferência" name="url_copy"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_url_slurl.xml b/indra/newview/skins/minimal/xui/pt/menu_url_slurl.xml
deleted file mode 100644
index 7216ccf0b3..0000000000
--- a/indra/newview/skins/minimal/xui/pt/menu_url_slurl.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Url Popup">
- <menu_item_call label="Mostrar informações sobre este lugar" name="show_place"/>
- <menu_item_call label="Mostrar no mapa" name="show_on_map"/>
- <menu_item_call label="Teletransportar para este lugar" name="teleport_to_location"/>
- <menu_item_call label="Copiar SLurl para área de transferência" name="url_copy"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_url_teleport.xml b/indra/newview/skins/minimal/xui/pt/menu_url_teleport.xml
deleted file mode 100644
index f007425646..0000000000
--- a/indra/newview/skins/minimal/xui/pt/menu_url_teleport.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Url Popup">
- <menu_item_call label="Teletransportar para este lugar" name="teleport"/>
- <menu_item_call label="Mostrar no mapa" name="show_on_map"/>
- <menu_item_call label="Copiar SLurl para área de transferência" name="url_copy"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_viewer.xml b/indra/newview/skins/minimal/xui/pt/menu_viewer.xml
deleted file mode 100644
index 2bd1e88279..0000000000
--- a/indra/newview/skins/minimal/xui/pt/menu_viewer.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu_bar name="Main Menu">
- <menu label="Ajuda" name="Help">
- <menu_item_call label="[SECOND_LIFE] Ajuda" name="Second Life Help"/>
- </menu>
- <menu label="Avançado" name="Advanced">
- <menu label="Atalhos" name="Shortcuts">
- <menu_item_check label="Voar" name="Fly"/>
- <menu_item_call label="Fechar janela" name="Close Window"/>
- <menu_item_call label="Fechar todas as janelas" name="Close All Windows"/>
- <menu_item_call label="Visão padrão" name="Reset View"/>
- </menu>
- </menu>
-</menu_bar>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_wearable_list_item.xml b/indra/newview/skins/minimal/xui/pt/menu_wearable_list_item.xml
deleted file mode 100644
index 2487f6779f..0000000000
--- a/indra/newview/skins/minimal/xui/pt/menu_wearable_list_item.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Outfit Wearable Context Menu">
- <menu_item_call label="Trocar" name="wear_replace"/>
- <menu_item_call label="Vestir" name="wear_wear"/>
- <menu_item_call label="Adicionar" name="wear_add"/>
- <menu_item_call label="Tirar / Separar" name="take_off_or_detach"/>
- <menu_item_call label="Separar" name="detach"/>
- <context_menu label="Colocar em" name="wearable_attach_to"/>
- <context_menu label="Anexar ao HUD" name="wearable_attach_to_hud"/>
- <menu_item_call label="Tirar" name="take_off"/>
- <menu_item_call label="Editar" name="edit"/>
- <menu_item_call label="Perfil do item" name="object_profile"/>
- <menu_item_call label="Mostrar original" name="show_original"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_wearing_gear.xml b/indra/newview/skins/minimal/xui/pt/menu_wearing_gear.xml
deleted file mode 100644
index 7b6ce4d87e..0000000000
--- a/indra/newview/skins/minimal/xui/pt/menu_wearing_gear.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Gear Wearing">
- <menu_item_call label="Editar look" name="edit"/>
- <menu_item_call label="Tirar" name="takeoff"/>
-</menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_wearing_tab.xml b/indra/newview/skins/minimal/xui/pt/menu_wearing_tab.xml
deleted file mode 100644
index 4e6e52ebc7..0000000000
--- a/indra/newview/skins/minimal/xui/pt/menu_wearing_tab.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Wearing">
- <menu_item_call label="Tirar" name="take_off"/>
- <menu_item_call label="Tirar" name="detach"/>
- <menu_item_call label="Editar look" name="edit"/>
-</context_menu>
diff --git a/indra/newview/skins/minimal/xui/pt/notifications.xml b/indra/newview/skins/minimal/xui/pt/notifications.xml
deleted file mode 100644
index 69c4cb3b3e..0000000000
--- a/indra/newview/skins/minimal/xui/pt/notifications.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<notifications>
- <notification name="UserGiveItem">
- [NAME_SLURL] quer lhe dar [ITEM_SLURL]. Esta ação requer o modo Avançado. Passe para o modo avançado e você verá o item em seu inventário. Para passar para o modo avançado, feche e reinicialize esse aplicativo e mude o modo (indicado na tela de login).
- <form name="form">
- <button name="Show" text="Guardar item"/>
- <button name="Discard" text="Recusar item"/>
- <button name="Mute" text="Bloquear usuário"/>
- </form>
- </notification>
- <notification name="ObjectGiveItem">
- Um objeto chamado &lt;nolink&gt;[OBJECTFROMNAME]&lt;/nolink&gt;, de [NAME_SLURL], está oferecendo &lt;nolink&gt;[ITEM_SLURL]&lt;/nolink&gt; a você. Esta ação requer o modo Avançado. Passe para o modo Avançado e você verá o item em seu Inventário. Para passar para o modo Avançado, feche e reinicialize esse aplicativo e mude o modo (indicado na tela de login).
- <form name="form">
- <button name="Keep" text="Guardar item"/>
- <button name="Discard" text="Recusar item"/>
- <button name="Mute" text="Bloquear objeto"/>
- </form>
- </notification>
-</notifications>
diff --git a/indra/newview/skins/minimal/xui/pt/panel_adhoc_control_panel.xml b/indra/newview/skins/minimal/xui/pt/panel_adhoc_control_panel.xml
deleted file mode 100644
index bd50d4953d..0000000000
--- a/indra/newview/skins/minimal/xui/pt/panel_adhoc_control_panel.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="panel_im_control_panel">
- <layout_stack name="vertical_stack">
- <layout_panel name="call_btn_panel">
- <button label="Ligar" name="call_btn"/>
- </layout_panel>
- <layout_panel name="end_call_btn_panel">
- <button label="Desligar" name="end_call_btn"/>
- </layout_panel>
- <layout_panel name="voice_ctrls_btn_panel">
- <button label="Controles de voz" name="voice_ctrls_btn"/>
- </layout_panel>
- </layout_stack>
-</panel>
diff --git a/indra/newview/skins/minimal/xui/pt/panel_bottomtray.xml b/indra/newview/skins/minimal/xui/pt/panel_bottomtray.xml
deleted file mode 100644
index 9b4eb2c2b8..0000000000
--- a/indra/newview/skins/minimal/xui/pt/panel_bottomtray.xml
+++ /dev/null
@@ -1,45 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="bottom_tray">
- <string name="DragIndicationImageName" value="Accordion_ArrowOpened_Off"/>
- <string name="SpeakBtnToolTip" value="Liga e desliga o microfone"/>
- <string name="VoiceControlBtnToolTip" value="Mostra/oculta os controles de voz"/>
- <layout_stack name="toolbar_stack">
- <layout_panel name="speak_panel">
- <button label="Falar" name="speak_btn" tool_tip="Ligar/desligar seu microfone"/>
- </layout_panel>
- <layout_panel name="speak_flyout_panel">
- <button label="" name="flyout_btn" tool_tip="Mudar as preferências de áudio"/>
- </layout_panel>
- <layout_panel name="gesture_panel">
- <gesture_combo_list label="Gesto" name="Gesture" tool_tip="Fazer seu avatar agir"/>
- </layout_panel>
- <layout_panel name="cam_panel">
- <bottomtray_button label="Exibir" name="camera_btn" tool_tip="Controlar ângulo da câmera"/>
- </layout_panel>
- <layout_panel name="destinations_panel">
- <bottomtray_button label="Destinos" name="destination_btn" tool_tip="Viajar no Second Life"/>
- </layout_panel>
- <layout_panel name="avatar_panel">
- <bottomtray_button label="Meu avatar" name="avatar_btn" tool_tip="Trocar seu visual"/>
- </layout_panel>
- <layout_panel name="people_panel">
- <bottomtray_button label="Pessoas" name="show_people_button" tool_tip="Encontrar pessoas no Second Life"/>
- </layout_panel>
- <layout_panel name="profile_panel">
- <bottomtray_button label="Perfil" name="show_profile_btn" tool_tip="Ver e editar seu perfil"/>
- </layout_panel>
- <layout_panel name="howto_panel">
- <bottomtray_button label="Como..." name="show_help_btn" tool_tip="Opções de ajuda do Second Life"/>
- </layout_panel>
- <layout_panel name="im_well_panel">
- <chiclet_im_well name="im_well">
- <button name="Unread IM messages" tool_tip="Conversas"/>
- </chiclet_im_well>
- </layout_panel>
- <layout_panel name="notification_well_panel">
- <chiclet_notification name="notification_well">
- <button name="Unread" tool_tip="Notificações"/>
- </chiclet_notification>
- </layout_panel>
- </layout_stack>
-</panel>
diff --git a/indra/newview/skins/minimal/xui/pt/panel_group_control_panel.xml b/indra/newview/skins/minimal/xui/pt/panel_group_control_panel.xml
deleted file mode 100644
index 177cee28a6..0000000000
--- a/indra/newview/skins/minimal/xui/pt/panel_group_control_panel.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="panel_im_control_panel">
- <layout_stack name="vertical_stack">
- <layout_panel name="end_call_btn_panel">
- <button label="Desligar" name="end_call_btn"/>
- </layout_panel>
- <layout_panel name="voice_ctrls_btn_panel">
- <button label="Abrir controles de voz" name="voice_ctrls_btn"/>
- </layout_panel>
- </layout_stack>
-</panel>
diff --git a/indra/newview/skins/minimal/xui/pt/panel_im_control_panel.xml b/indra/newview/skins/minimal/xui/pt/panel_im_control_panel.xml
deleted file mode 100644
index 190323c3b0..0000000000
--- a/indra/newview/skins/minimal/xui/pt/panel_im_control_panel.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="panel_im_control_panel">
- <layout_stack name="button_stack">
- <layout_panel name="view_profile_btn_panel">
- <button label="Perfil" name="view_profile_btn"/>
- </layout_panel>
- <layout_panel name="add_friend_btn_panel">
- <button label="Adicionar amigo..." name="add_friend_btn"/>
- </layout_panel>
- <layout_panel name="teleport_btn_panel">
- <button label="Teletransportar" name="teleport_btn" tool_tip="Oferecer teletransporte"/>
- </layout_panel>
- <layout_panel name="call_btn_panel">
- <button label="Ligar" name="call_btn"/>
- </layout_panel>
- <layout_panel name="end_call_btn_panel">
- <button label="Encerrar ligação" name="end_call_btn"/>
- </layout_panel>
- <layout_panel name="block_btn_panel">
- <button label="Bloquear" name="block_btn"/>
- </layout_panel>
- <layout_panel name="unblock_btn_panel">
- <button label="Desbloquear" name="unblock_btn"/>
- </layout_panel>
- <layout_panel name="volume_ctrl_panel">
- <slider name="volume_slider" tool_tip="Volume da ligação" value="0.5"/>
- </layout_panel>
- </layout_stack>
-</panel>
diff --git a/indra/newview/skins/minimal/xui/pt/panel_login.xml b/indra/newview/skins/minimal/xui/pt/panel_login.xml
deleted file mode 100644
index de9717874f..0000000000
--- a/indra/newview/skins/minimal/xui/pt/panel_login.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="panel_login">
- <panel.string name="create_account_url">
- http://join.secondlife.com/
- </panel.string>
- <panel.string name="forgot_password_url">
- http://secondlife.com/account/request.php?lang=pt
- </panel.string>
- <layout_stack name="login_widgets">
- <layout_panel name="login">
- <text name="username_text">
- Nome de usuário:
- </text>
- <combo_box name="username_combo" tool_tip="O nome de usuário que você escolheu ao fazer seu cadastro, como zecazc12 or Magia Solar"/>
- <text name="password_text">
- Senha:
- </text>
- <check_box label="Lembrar senha" name="remember_check"/>
- <button label="conectar" name="connect_btn"/>
- <text name="mode_selection_text">
- Modo:
- </text>
- <combo_box name="mode_combo" tool_tip="Selecione o modo. O modo Básico é mais rápido e ideal para explorar e conversar. Use o modo Avançado para acessar mais recursos.">
- <combo_box.item label="Básico" name="Basic"/>
- <combo_box.item label="Avançado" name="Advanced"/>
- </combo_box>
- </layout_panel>
- <layout_panel name="links">
- <text name="create_new_account_text">
- Cadastre-se
- </text>
- <text name="forgot_password_text">
- Esqueceu seu nome ou senha?
- </text>
- <text name="login_help">
- Precisa de ajuda ao conectar?
- </text>
- </layout_panel>
- </layout_stack>
-</panel>
diff --git a/indra/newview/skins/minimal/xui/pt/panel_navigation_bar.xml b/indra/newview/skins/minimal/xui/pt/panel_navigation_bar.xml
deleted file mode 100644
index 01930bf3b3..0000000000
--- a/indra/newview/skins/minimal/xui/pt/panel_navigation_bar.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="navigation_bar">
- <panel name="navigation_panel">
- <pull_button name="back_btn" tool_tip="Voltar para região anterior"/>
- <pull_button name="forward_btn" tool_tip="Avançar uma região"/>
- <button name="home_btn" tool_tip="Teletransportar para meu início"/>
- <location_input label="Onde" name="location_combo"/>
- <search_combo_box label="Busca" name="search_combo_box" tool_tip="Busca">
- <combo_editor label="Buscar no [SECOND_LIFE]" name="search_combo_editor"/>
- </search_combo_box>
- </panel>
- <favorites_bar name="favorite" tool_tip="Arraste marcos para cá para acessar seus lugares preferidos do Second Life!">
- <label name="favorites_bar_label" tool_tip="Arraste marcos para cá para acessar seus lugares preferidos do Second Life!">
- Barra Destaques
- </label>
- <chevron_button name="&gt;&gt;" tool_tip="Mostrar mais favoritos"/>
- </favorites_bar>
-</panel>
diff --git a/indra/newview/skins/minimal/xui/pt/panel_people.xml b/indra/newview/skins/minimal/xui/pt/panel_people.xml
deleted file mode 100644
index 0e98c586c6..0000000000
--- a/indra/newview/skins/minimal/xui/pt/panel_people.xml
+++ /dev/null
@@ -1,74 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<!-- Side tray panel -->
-<panel label="Pessoas" name="people_panel">
- <string name="no_recent_people" value="Ninguém, recentemente. Em busca de alguém para conversar? Confira o botão Destinos abaixo."/>
- <string name="no_filtered_recent_people" value="Não há ninguém com esse nome ultimamente."/>
- <string name="no_one_near" value="Ninguém por perto Em busca de alguém para conversar? Confira o botão Destinos abaixo."/>
- <string name="no_one_filtered_near" value="Não há ninguém com esse nome por perto."/>
- <string name="no_friends_online" value="Nenhum amigo online"/>
- <string name="no_friends" value="Nenhum amigo"/>
- <string name="no_friends_msg">
- Clique em um residente com o botão direito to mouse para adicioná-lo como amigo.
-Em busca de alguém para conversar? Confira o botão Destinos abaixo.
- </string>
- <string name="no_filtered_friends_msg">
- Não encontrou o que procura? Confira o botão Destinos abaixo.
- </string>
- <string name="people_filter_label" value="Filtro de pessoas"/>
- <string name="groups_filter_label" value="Filtro de grupos"/>
- <string name="no_filtered_groups_msg" value="Não encontrou o que procura? Tente buscar no [secondlife:///app/search/groups/[SEARCH_TERM] Search]."/>
- <string name="no_groups_msg" value="À procura de grupos interessantes? Tente fazer uma [secondlife:///app/search/groups Busca]."/>
- <string name="MiniMapToolTipMsg" value="[REGION](Clique duplo para abrir o Mapa, botão Shift e arrastar para ver mais)"/>
- <string name="AltMiniMapToolTipMsg" value="[REGION](Clique duplo para se teletransportar, botão Shift e arrastar para ver mais)"/>
- <filter_editor label="Filtro" name="filter_input"/>
- <tab_container name="tabs">
- <panel label="PROXIMIDADE" name="nearby_panel">
- <panel label="bottom_panel" name="bottom_panel"/>
- </panel>
- <panel label="MEUS AMIGOS" name="friends_panel">
- <accordion name="friends_accordion">
- <accordion_tab name="tab_online" title="Online"/>
- <accordion_tab name="tab_all" title="Todos"/>
- </accordion>
- <panel label="bottom_panel" name="bottom_panel">
- <layout_stack name="bottom_panel">
- <layout_panel name="trash_btn_panel">
- <dnd_button name="del_btn" tool_tip="Remover a pessoa selecionada da sua lista de amigos"/>
- </layout_panel>
- </layout_stack>
- </panel>
- </panel>
- <panel label="RECENTE" name="recent_panel">
- <panel label="bottom_panel" name="bottom_panel">
- <button name="add_friend_btn" tool_tip="Adicionar o residente selecionado para sua lista de amigos"/>
- </panel>
- </panel>
- </tab_container>
- <panel name="button_bar">
- <layout_stack name="bottom_bar_ls">
- <layout_panel name="view_profile_btn_lp">
- <button label="Perfil" name="view_profile_btn" tool_tip="Exibir fotografia, grupos e outras informações dos residentes"/>
- </layout_panel>
- <layout_panel name="im_btn_lp">
- <button label="MI" name="im_btn" tool_tip="Abrir sessão de mensagem instantânea"/>
- </layout_panel>
- <layout_panel name="call_btn_lp">
- <button label="Ligar" name="call_btn" tool_tip="Ligar para este residente"/>
- </layout_panel>
- <layout_panel name="teleport_btn_lp">
- <button label="Teletransportar" name="teleport_btn" tool_tip="Oferecer teletransporte"/>
- </layout_panel>
- </layout_stack>
- <layout_stack name="bottom_bar_ls1">
- <layout_panel name="group_info_btn_lp">
- <button label="Perfil do grupo" name="group_info_btn" tool_tip="Exibir dados do grupo"/>
- </layout_panel>
- <layout_panel name="chat_btn_lp">
- <button label="Bate-papo de grupo" name="chat_btn" tool_tip="Nova sessão de bate-papo"/>
- </layout_panel>
- <layout_panel name="group_call_btn_lp">
- <button label="Ligar para o grupo" name="group_call_btn" tool_tip="Ligar para este grupo"/>
- </layout_panel>
- </layout_stack>
- </panel>
-</panel>
diff --git a/indra/newview/skins/minimal/xui/pt/panel_side_tray_tab_caption.xml b/indra/newview/skins/minimal/xui/pt/panel_side_tray_tab_caption.xml
deleted file mode 100644
index 09444a5535..0000000000
--- a/indra/newview/skins/minimal/xui/pt/panel_side_tray_tab_caption.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="sidetray_tab_panel">
- <text name="sidetray_tab_title" value="Bandeja lateral"/>
- <button name="undock" tool_tip="Soltar janela"/>
- <button name="dock" tool_tip="Ancorar janela"/>
- <button name="show_help" tool_tip="Mostrar ajuda"/>
-</panel>
diff --git a/indra/newview/skins/minimal/xui/pt/panel_status_bar.xml b/indra/newview/skins/minimal/xui/pt/panel_status_bar.xml
deleted file mode 100644
index db564d2aaa..0000000000
--- a/indra/newview/skins/minimal/xui/pt/panel_status_bar.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="status">
- <panel.string name="packet_loss_tooltip">
- Perda de pacote
- </panel.string>
- <panel.string name="bandwidth_tooltip">
- Banda
- </panel.string>
- <panel.string name="time">
- [hour12, datetime, slt]:[min, datetime, slt] [ampm, datetime, slt] [timezone,datetime, slt]
- </panel.string>
- <panel.string name="timeTooltip">
- [weekday, datetime, slt], [day, datetime, slt] [month, datetime, slt] [year, datetime, slt]
- </panel.string>
- <panel.string name="buycurrencylabel">
- L$ [AMT]
- </panel.string>
- <combo_box name="mode_combo" tool_tip="Selecione o modo. O modo Básico é mais rápido e ideal para explorar e conversar. Use o modo Avançado para acessar mais recursos.">
- <combo_box.item label="Modo básico" name="Basic"/>
- <combo_box.item label="Modo avançado" name="Advanced"/>
- </combo_box>
- <button name="media_toggle_btn" tool_tip="Tocar/Pausar todas mídias (música, vídeo, páginas web)"/>
- <button name="volume_btn" tool_tip="Volume geral"/>
-</panel>
diff --git a/indra/newview/skins/paths.xml b/indra/newview/skins/paths.xml
index e6d68488ea..3c0da041c7 100644
--- a/indra/newview/skins/paths.xml
+++ b/indra/newview/skins/paths.xml
@@ -1,4 +1,4 @@
-<paths>
+<paths>
<directory>
<subdir>xui</subdir>
<subdir>en</subdir>
diff --git a/indra/newview/tests/gpus_results.txt b/indra/newview/tests/gpus_results.txt
index 7e9a064921..68e2e688cb 100644
--- a/indra/newview/tests/gpus_results.txt
+++ b/indra/newview/tests/gpus_results.txt
@@ -1,6 +1,6 @@
GPU String Supported? Class Recognizer
------------------------------------------------------------------------------------------------------ ----------- ----- ------------------------------------
-ATI UNRECOGNIZED
+ATI NO MATCH
ATI 3D-Analyze unsupported 0 ATI 3D-Analyze
ATI ASUS A9xxx supported 1 ATI ASUS A9xxx
ATI ASUS AH24xx supported 1 ATI ASUS AH24xx
@@ -25,8 +25,8 @@ ATI All-in-Wonder X1800
ATI All-in-Wonder X1900 supported 3 ATI All-in-Wonder X1900
ATI All-in-Wonder X600 supported 1 ATI All-in-Wonder X600
ATI All-in-Wonder X800 supported 2 ATI All-in-Wonder X800
-ATI Diamond X1xxx supported 0 ATI Radeon X1xxx
-ATI Display Adapter UNRECOGNIZED
+ATI Diamond X1xxx supported 1 ATI Radeon X1xxx
+ATI Display Adapter supported 0 ATI Display Adapter
ATI FireGL supported 0 ATI FireGL
ATI FireGL 5200 supported 0 ATI FireGL
ATI FireGL 5xxx supported 0 ATI FireGL
@@ -40,7 +40,7 @@ ATI M56
ATI M71 supported 1 ATI M71
ATI M72 supported 1 ATI M72
ATI M76 supported 3 ATI M76
-ATI Mobility Radeon supported 0 ATI Mobility Radeon
+ATI Mobility Radeon supported 0 ATI Radeon
ATI Mobility Radeon 7xxx supported 0 ATI Mobility Radeon 7xxx
ATI Mobility Radeon 9600 supported 0 ATI Mobility Radeon 9600
ATI Mobility Radeon 9700 supported 1 ATI Mobility Radeon 9700
@@ -57,14 +57,14 @@ ATI Mobility Radeon HD 4300
ATI Mobility Radeon HD 4500 supported 3 ATI Mobility Radeon HD 4500
ATI Mobility Radeon HD 4600 supported 3 ATI Mobility Radeon HD 4600
ATI Mobility Radeon HD 4800 supported 3 ATI Mobility Radeon HD 4800
-ATI Mobility Radeon HD 5400 supported 2 ATI Mobility Radeon HD 5400
-ATI Mobility Radeon HD 5600 supported 2 ATI Mobility Radeon HD 5600
-ATI Mobility Radeon X1xxx supported 0 ATI Radeon X1xxx
-ATI Mobility Radeon X2xxx supported 0 ATI Mobility Radeon X2xxx
-ATI Mobility Radeon X3xx supported 1 ATI Mobility Radeon X3xx
-ATI Mobility Radeon X6xx supported 1 ATI Mobility Radeon X6xx
-ATI Mobility Radeon X7xx supported 1 ATI Mobility Radeon X7xx
-ATI Mobility Radeon Xxxx supported 0 ATI Mobility Radeon Xxxx
+ATI Mobility Radeon HD 5400 supported 3 ATI Mobility Radeon HD 5400
+ATI Mobility Radeon HD 5600 supported 3 ATI Mobility Radeon HD 5600
+ATI Mobility Radeon X1xxx supported 1 ATI Radeon X1xxx
+ATI Mobility Radeon X2xxx supported 1 ATI Radeon X2xxx
+ATI Mobility Radeon X3xx supported 0 ATI Radeon X300
+ATI Mobility Radeon X6xx supported 1 ATI Radeon X600
+ATI Mobility Radeon X7xx supported 1 ATI Radeon X700
+ATI Mobility Radeon Xxxx supported 0 ATI Radeon
ATI RV380 supported 0 ATI RV380
ATI RV530 supported 1 ATI RV530
ATI Radeon 2100 supported 0 ATI Radeon 2100
@@ -86,7 +86,7 @@ ATI Radeon HD 2600
ATI Radeon HD 2900 supported 3 ATI Radeon HD 2900
ATI Radeon HD 3000 supported 0 ATI Radeon HD 3000
ATI Radeon HD 3100 supported 1 ATI Radeon HD 3100
-ATI Radeon HD 3200 supported 0 ATI Radeon HD 3200
+ATI Radeon HD 3200 supported 1 ATI Radeon HD 3200
ATI Radeon HD 3300 supported 1 ATI Radeon HD 3300
ATI Radeon HD 3400 supported 1 ATI Radeon HD 3400
ATI Radeon HD 3600 supported 3 ATI Radeon HD 3600
@@ -103,29 +103,29 @@ ATI Radeon HD 5600
ATI Radeon HD 5700 supported 3 ATI Radeon HD 5700
ATI Radeon HD 5800 supported 3 ATI Radeon HD 5800
ATI Radeon HD 5900 supported 3 ATI Radeon HD 5900
-ATI Radeon HD 6200 supported 2 ATI Radeon HD 6200
-ATI Radeon HD 6300 supported 2 ATI Radeon HD 6300
+ATI Radeon HD 6200 supported 3 ATI Radeon HD 6200
+ATI Radeon HD 6300 supported 3 ATI Radeon HD 6300
ATI Radeon HD 6500 supported 3 ATI Radeon HD 6500
ATI Radeon HD 6800 supported 3 ATI Radeon HD 6800
ATI Radeon HD 6900 supported 3 ATI Radeon HD 6900
-ATI Radeon OpenGL supported 0 ATI Radeon
+ATI Radeon OpenGL unsupported 0 ATI Radeon OpenGL
ATI Radeon RV250 supported 0 ATI Radeon RV250
ATI Radeon RV600 supported 1 ATI Radeon RV600
ATI Radeon RX9550 supported 1 ATI Radeon RX9550
ATI Radeon VE unsupported 0 ATI Radeon VE
-ATI Radeon X1000 supported 0 ATI Radeon X1xxx
-ATI Radeon X1200 supported 0 ATI Radeon X1xxx
-ATI Radeon X1300 supported 0 ATI Radeon X1xxx
-ATI Radeon X13xx supported 0 ATI Radeon X1xxx
-ATI Radeon X1400 supported 0 ATI Radeon X1xxx
-ATI Radeon X1500 supported 0 ATI Radeon X1xxx
-ATI Radeon X1600 supported 0 ATI Radeon X1xxx
-ATI Radeon X16xx supported 0 ATI Radeon X1xxx
-ATI Radeon X1700 supported 0 ATI Radeon X1xxx
-ATI Radeon X1800 supported 0 ATI Radeon X1xxx
-ATI Radeon X1900 supported 0 ATI Radeon X1xxx
-ATI Radeon X19xx supported 0 ATI Radeon X1xxx
-ATI Radeon X1xxx supported 0 ATI Radeon X1xxx
+ATI Radeon X1000 supported 1 ATI Radeon X1xxx
+ATI Radeon X1200 supported 1 ATI Radeon X1xxx
+ATI Radeon X1300 supported 1 ATI Radeon X13xx
+ATI Radeon X13xx supported 1 ATI Radeon X13xx
+ATI Radeon X1400 supported 1 ATI Radeon X1xxx
+ATI Radeon X1500 supported 2 ATI Radeon X15xx
+ATI Radeon X1600 supported 2 ATI Radeon X16xx
+ATI Radeon X16xx supported 2 ATI Radeon X16xx
+ATI Radeon X1700 supported 2 ATI Radeon X17xx
+ATI Radeon X1800 supported 3 ATI Radeon X18xx
+ATI Radeon X1900 supported 3 ATI Radeon X19xx
+ATI Radeon X19xx supported 3 ATI Radeon X19xx
+ATI Radeon X1xxx supported 1 ATI Radeon X1xxx
ATI Radeon X300 supported 0 ATI Radeon X300
ATI Radeon X500 supported 0 ATI Radeon X500
ATI Radeon X600 supported 1 ATI Radeon X600
@@ -138,56 +138,74 @@ ATI Technologies Inc.
ATI Technologies Inc. x86 supported 0 ATI Technologies
ATI Technologies Inc. x86/SSE2 supported 0 ATI Technologies
ATI Technologies Inc. (Vista) ATI Mobility Radeon HD 5730 supported 3 ATI Mobility Radeon HD 5700
-ATI Technologies Inc. 256MB ATI Radeon X1300PRO x86/SSE2 supported 0 ATI Radeon X1xxx
+ATI Technologies Inc. 128MB ATI Radeon X1300 x86/SSE2 supported 1 ATI Radeon X13xx
+ATI Technologies Inc. 256MB ATI Radeon X1300PRO x86/SSE2 supported 1 ATI Radeon X13xx
ATI Technologies Inc. AMD 760G supported 1 ATI 760G/Radeon 3000
ATI Technologies Inc. AMD 760G (Microsoft WDDM 1.1) supported 1 ATI 760G/Radeon 3000
ATI Technologies Inc. AMD 780L supported 1 ATI 780L/Radeon 3000
ATI Technologies Inc. AMD FirePro 2270 supported 1 ATI FirePro 2000
-ATI Technologies Inc. AMD M860G with ATI Mobility Radeon 4100 supported 0 ATI Mobility Radeon 4100
+ATI Technologies Inc. AMD M860G with ATI Mobility Radeon 4100 supported 1 ATI Mobility Radeon 4100
ATI Technologies Inc. AMD M880G with ATI Mobility Radeon HD 4200 supported 2 ATI Mobility Radeon HD 4200
ATI Technologies Inc. AMD M880G with ATI Mobility Radeon HD 4250 supported 2 ATI Mobility Radeon HD 4200
+ATI Technologies Inc. AMD RADEON HD 6350 supported 3 ATI Radeon HD 6300
ATI Technologies Inc. AMD RADEON HD 6450 supported 3 ATI Radeon HD 6400
-ATI Technologies Inc. AMD Radeon HD 6200 series Graphics supported 2 ATI Radeon HD 6200
-ATI Technologies Inc. AMD Radeon HD 6250 Graphics supported 2 ATI Radeon HD 6200
-ATI Technologies Inc. AMD Radeon HD 6300 series Graphics supported 2 ATI Radeon HD 6300
-ATI Technologies Inc. AMD Radeon HD 6300M Series supported 2 ATI Radeon HD 6300
-ATI Technologies Inc. AMD Radeon HD 6310 Graphics supported 2 ATI Radeon HD 6300
-ATI Technologies Inc. AMD Radeon HD 6310M supported 2 ATI Radeon HD 6300
-ATI Technologies Inc. AMD Radeon HD 6330M supported 2 ATI Radeon HD 6300
-ATI Technologies Inc. AMD Radeon HD 6350 supported 2 ATI Radeon HD 6300
-ATI Technologies Inc. AMD Radeon HD 6370M supported 2 ATI Radeon HD 6300
-ATI Technologies Inc. AMD Radeon HD 6400M Series supported 3 ATI Radeon HD 6400
+ATI Technologies Inc. AMD RADEON HD 6670 supported 3 ATI Radeon HD 6600
+ATI Technologies Inc. AMD Radeon 6600M and 6700M Series supported 0 ATI Technologies
+ATI Technologies Inc. AMD Radeon HD 6200 series Graphics supported 3 ATI Radeon HD 6200
+ATI Technologies Inc. AMD Radeon HD 6250 Graphics supported 3 ATI Radeon HD 6200
+ATI Technologies Inc. AMD Radeon HD 6290 Graphics supported 3 ATI Radeon HD 6200
+ATI Technologies Inc. AMD Radeon HD 6300 series Graphics supported 3 ATI Radeon HD 6300
+ATI Technologies Inc. AMD Radeon HD 6300M Series supported 3 ATI Radeon HD 6300
+ATI Technologies Inc. AMD Radeon HD 6310 Graphics supported 3 ATI Radeon HD 6300
+ATI Technologies Inc. AMD Radeon HD 6310M supported 3 ATI Radeon HD 6300
+ATI Technologies Inc. AMD Radeon HD 6330M supported 3 ATI Radeon HD 6300
+ATI Technologies Inc. AMD Radeon HD 6350 supported 3 ATI Radeon HD 6300
+ATI Technologies Inc. AMD Radeon HD 6370M supported 3 ATI Radeon HD 6300
+ATI Technologies Inc. AMD Radeon HD 6400M Series supported 3 ATI Radeon HD 64xx
ATI Technologies Inc. AMD Radeon HD 6450 supported 3 ATI Radeon HD 6400
-ATI Technologies Inc. AMD Radeon HD 6470M supported 3 ATI Radeon HD 6400
-ATI Technologies Inc. AMD Radeon HD 6490M supported 3 ATI Radeon HD 6400
-ATI Technologies Inc. AMD Radeon HD 6500M/5600/5700 Series supported 3 ATI Radeon HD 6500
-ATI Technologies Inc. AMD Radeon HD 6530M supported 3 ATI Radeon HD 6500
-ATI Technologies Inc. AMD Radeon HD 6550M supported 3 ATI Radeon HD 6500
+ATI Technologies Inc. AMD Radeon HD 6470M supported 3 ATI Radeon HD 64xx
+ATI Technologies Inc. AMD Radeon HD 6490M supported 3 ATI Radeon HD 64xx
+ATI Technologies Inc. AMD Radeon HD 6500 Series supported 3 ATI Radeon HD 6500
+ATI Technologies Inc. AMD Radeon HD 6500M Series supported 3 ATI Radeon HD 65xx
+ATI Technologies Inc. AMD Radeon HD 6500M/5600/5700 Series supported 3 ATI Radeon HD 65xx
+ATI Technologies Inc. AMD Radeon HD 6530M supported 3 ATI Radeon HD 65xx
+ATI Technologies Inc. AMD Radeon HD 6550M supported 3 ATI Radeon HD 65xx
ATI Technologies Inc. AMD Radeon HD 6570 supported 3 ATI Radeon HD 6500
-ATI Technologies Inc. AMD Radeon HD 6570M supported 3 ATI Radeon HD 6500
-ATI Technologies Inc. AMD Radeon HD 6570M/5700 Series supported 3 ATI Radeon HD 6500
+ATI Technologies Inc. AMD Radeon HD 6570M supported 3 ATI Radeon HD 65xx
+ATI Technologies Inc. AMD Radeon HD 6570M/5700 Series supported 3 ATI Radeon HD 65xx
+ATI Technologies Inc. AMD Radeon HD 6600 Series supported 3 ATI Radeon HD 6600
ATI Technologies Inc. AMD Radeon HD 6600M Series supported 3 ATI Radeon HD 66xx
+ATI Technologies Inc. AMD Radeon HD 6630M supported 3 ATI Radeon HD 66xx
ATI Technologies Inc. AMD Radeon HD 6650M supported 3 ATI Radeon HD 66xx
-ATI Technologies Inc. AMD Radeon HD 6670 supported 3 ATI Radeon HD 66xx
+ATI Technologies Inc. AMD Radeon HD 6670 supported 3 ATI Radeon HD 6600
ATI Technologies Inc. AMD Radeon HD 6700 Series supported 3 ATI Radeon HD 6700
ATI Technologies Inc. AMD Radeon HD 6750 supported 3 ATI Radeon HD 6700
ATI Technologies Inc. AMD Radeon HD 6750M supported 3 ATI Radeon HD 6700
ATI Technologies Inc. AMD Radeon HD 6770 supported 3 ATI Radeon HD 6700
+ATI Technologies Inc. AMD Radeon HD 6770M supported 3 ATI Radeon HD 6700
ATI Technologies Inc. AMD Radeon HD 6800 Series supported 3 ATI Radeon HD 6800
+ATI Technologies Inc. AMD Radeon HD 6800M Series supported 3 ATI Radeon HD 6800
+ATI Technologies Inc. AMD Radeon HD 6850 supported 3 ATI Radeon HD 6800
ATI Technologies Inc. AMD Radeon HD 6850M supported 3 ATI Radeon HD 6800
ATI Technologies Inc. AMD Radeon HD 6870 supported 3 ATI Radeon HD 6800
ATI Technologies Inc. AMD Radeon HD 6870M supported 3 ATI Radeon HD 6800
ATI Technologies Inc. AMD Radeon HD 6900 Series supported 3 ATI Radeon HD 6900
+ATI Technologies Inc. AMD Radeon HD 6900M Series supported 3 ATI Radeon HD 6900
ATI Technologies Inc. AMD Radeon HD 6970M supported 3 ATI Radeon HD 6900
ATI Technologies Inc. AMD Radeon HD 6990 supported 3 ATI Radeon HD 6900
-ATI Technologies Inc. AMD Radeon(TM) HD 6470M supported 0 ATI Technologies
+ATI Technologies Inc. AMD Radeon(TM) HD 6470M supported 3 ATI Radeon HD 64xx
+ATI Technologies Inc. AMD Radeon(TM) HD 6480G supported 3 ATI Radeon HD 64xx
+ATI Technologies Inc. AMD Radeon(TM) HD 6520G supported 3 ATI Radeon HD 65xx
+ATI Technologies Inc. AMD Radeon(TM) HD 6620G supported 3 ATI Radeon HD 66xx
+ATI Technologies Inc. AMD Radeon(TM) HD 6630M supported 3 ATI Radeon HD 66xx
ATI Technologies Inc. ASUS 5870 Eyefinity 6 supported 0 ATI Technologies
+ATI Technologies Inc. ASUS A9550 Series supported 1 ATI ASUS A9xxx
ATI Technologies Inc. ASUS AH2600 Series supported 3 ATI ASUS AH26xx
ATI Technologies Inc. ASUS AH3450 Series supported 1 ATI ASUS AH34xx
ATI Technologies Inc. ASUS AH3650 Series supported 3 ATI ASUS AH36xx
ATI Technologies Inc. ASUS AH4650 Series supported 3 ATI ASUS AH46xx
-ATI Technologies Inc. ASUS ARES supported 0 ATI Technologies
-ATI Technologies Inc. ASUS EAH2900 Series supported 0 ATI Technologies
+ATI Technologies Inc. ASUS ARES supported 3 ATI ASUS ARES
+ATI Technologies Inc. ASUS EAH2900 Series supported 3 ATI ASUS EAH29xx
ATI Technologies Inc. ASUS EAH3450 Series supported 1 ATI ASUS AH34xx
ATI Technologies Inc. ASUS EAH3650 Series supported 3 ATI ASUS AH36xx
ATI Technologies Inc. ASUS EAH4350 series supported 1 ATI ASUS EAH43xx
@@ -208,10 +226,13 @@ ATI Technologies Inc. ASUS EAH5830 Series
ATI Technologies Inc. ASUS EAH5850 Series supported 3 ATI ASUS EAH58xx
ATI Technologies Inc. ASUS EAH5870 Series supported 3 ATI ASUS EAH58xx
ATI Technologies Inc. ASUS EAH5970 Series supported 0 ATI Technologies
-ATI Technologies Inc. ASUS EAH6850 Series supported 0 ATI Technologies
-ATI Technologies Inc. ASUS EAH6870 Series supported 0 ATI Technologies
-ATI Technologies Inc. ASUS EAH6950 Series supported 0 ATI Technologies
-ATI Technologies Inc. ASUS EAH6970 Series supported 0 ATI Technologies
+ATI Technologies Inc. ASUS EAH6450 Series supported 3 ATI ASUS EAH6xxx
+ATI Technologies Inc. ASUS EAH6570 Series supported 3 ATI ASUS EAH6xxx
+ATI Technologies Inc. ASUS EAH6670 Series supported 3 ATI ASUS EAH6xxx
+ATI Technologies Inc. ASUS EAH6850 Series supported 3 ATI ASUS EAH6xxx
+ATI Technologies Inc. ASUS EAH6870 Series supported 3 ATI ASUS EAH6xxx
+ATI Technologies Inc. ASUS EAH6950 Series supported 3 ATI ASUS EAH6xxx
+ATI Technologies Inc. ASUS EAH6970 Series supported 3 ATI ASUS EAH6xxx
ATI Technologies Inc. ASUS EAHG4670 series supported 0 ATI Technologies
ATI Technologies Inc. ASUS Extreme AX600 Series supported 0 ATI Technologies
ATI Technologies Inc. ASUS Extreme AX600XT-TD supported 0 ATI Technologies
@@ -232,19 +253,23 @@ ATI Technologies Inc. ATI FirePro V4800
ATI Technologies Inc. ATI FirePro V4800 (FireGL) supported 0 ATI FireGL
ATI Technologies Inc. ATI FirePro V5800 supported 3 ATI FirePro 5000
ATI Technologies Inc. ATI FirePro V7800 supported 3 ATI FirePro 7000
-ATI Technologies Inc. ATI MOBILITY RADEON 9XXX x86/SSE2 supported 0 ATI Mobility Radeon Xxxx
+ATI Technologies Inc. ATI MOBILITY RADEON 9600/9700 Series supported 1 ATI Mobility Radeon 9700
+ATI Technologies Inc. ATI MOBILITY RADEON 9XXX x86/SSE2 supported 0 ATI Technologies
+ATI Technologies Inc. ATI MOBILITY RADEON HD 2300 supported 1 ATI Mobility Radeon HD 2300
ATI Technologies Inc. ATI MOBILITY RADEON HD 3450 supported 2 ATI Mobility Radeon HD 3400
-ATI Technologies Inc. ATI MOBILITY RADEON X1600 supported 0 ATI Radeon X1xxx
-ATI Technologies Inc. ATI MOBILITY RADEON X2300 supported 0 ATI Mobility Radeon X2xxx
-ATI Technologies Inc. ATI MOBILITY RADEON X2300 HD x86/SSE2 supported 0 ATI Mobility Radeon X2xxx
-ATI Technologies Inc. ATI MOBILITY RADEON X2300 x86/MMX/3DNow!/SSE2 supported 0 ATI Mobility Radeon X2xxx
-ATI Technologies Inc. ATI MOBILITY RADEON X2300 x86/SSE2 supported 0 ATI Mobility Radeon X2xxx
-ATI Technologies Inc. ATI MOBILITY RADEON X300 supported 1 ATI Mobility Radeon X3xx
-ATI Technologies Inc. ATI MOBILITY RADEON X600 supported 1 ATI Mobility Radeon X6xx
-ATI Technologies Inc. ATI MOBILITY RADEON XPRESS 200 supported 0 ATI Mobility Radeon Xxxx
+ATI Technologies Inc. ATI MOBILITY RADEON HD 3650 supported 3 ATI Mobility Radeon HD 3600
+ATI Technologies Inc. ATI MOBILITY RADEON X1600 supported 2 ATI Radeon X16xx
+ATI Technologies Inc. ATI MOBILITY RADEON X2300 supported 1 ATI Radeon X2xxx
+ATI Technologies Inc. ATI MOBILITY RADEON X2300 HD x86/SSE2 supported 1 ATI Radeon X2xxx
+ATI Technologies Inc. ATI MOBILITY RADEON X2300 x86/MMX/3DNow!/SSE2 supported 1 ATI Radeon X2xxx
+ATI Technologies Inc. ATI MOBILITY RADEON X2300 x86/SSE2 supported 1 ATI Radeon X2xxx
+ATI Technologies Inc. ATI MOBILITY RADEON X300 supported 0 ATI Radeon X300
+ATI Technologies Inc. ATI MOBILITY RADEON X600 supported 1 ATI Radeon X600
+ATI Technologies Inc. ATI MOBILITY RADEON X700 supported 1 ATI Radeon X700
+ATI Technologies Inc. ATI MOBILITY RADEON XPRESS 200 supported 0 ATI Radeon Xpress
ATI Technologies Inc. ATI Mobility FireGL V5700 supported 1 ATI FireGL 5xxx
-ATI Technologies Inc. ATI Mobility Radeon 4100 supported 0 ATI Mobility Radeon 4100
-ATI Technologies Inc. ATI Mobility Radeon Graphics supported 0 ATI Mobility Radeon
+ATI Technologies Inc. ATI Mobility Radeon 4100 supported 1 ATI Mobility Radeon 4100
+ATI Technologies Inc. ATI Mobility Radeon Graphics supported 0 ATI Technologies
ATI Technologies Inc. ATI Mobility Radeon HD 2300 supported 1 ATI Mobility Radeon HD 2300
ATI Technologies Inc. ATI Mobility Radeon HD 2400 supported 1 ATI Mobility Radeon HD 2400
ATI Technologies Inc. ATI Mobility Radeon HD 2400 XT supported 1 ATI Mobility Radeon HD 2400
@@ -252,17 +277,20 @@ ATI Technologies Inc. ATI Mobility Radeon HD 2600
ATI Technologies Inc. ATI Mobility Radeon HD 2600 XT supported 3 ATI Mobility Radeon HD 2600
ATI Technologies Inc. ATI Mobility Radeon HD 2700 supported 3 ATI Mobility Radeon HD 2700
ATI Technologies Inc. ATI Mobility Radeon HD 3400 Series supported 2 ATI Mobility Radeon HD 3400
+ATI Technologies Inc. ATI Mobility Radeon HD 3410 supported 2 ATI Mobility Radeon HD 3400
ATI Technologies Inc. ATI Mobility Radeon HD 3430 supported 2 ATI Mobility Radeon HD 3400
ATI Technologies Inc. ATI Mobility Radeon HD 3450 supported 2 ATI Mobility Radeon HD 3400
ATI Technologies Inc. ATI Mobility Radeon HD 3470 supported 2 ATI Mobility Radeon HD 3400
ATI Technologies Inc. ATI Mobility Radeon HD 3470 Hybrid X2 supported 2 ATI Mobility Radeon HD 3400
ATI Technologies Inc. ATI Mobility Radeon HD 3650 supported 3 ATI Mobility Radeon HD 3600
+ATI Technologies Inc. ATI Mobility Radeon HD 3670 supported 3 ATI Mobility Radeon HD 3600
ATI Technologies Inc. ATI Mobility Radeon HD 4200 supported 2 ATI Mobility Radeon HD 4200
ATI Technologies Inc. ATI Mobility Radeon HD 4200 Series supported 2 ATI Mobility Radeon HD 4200
ATI Technologies Inc. ATI Mobility Radeon HD 4225 supported 2 ATI Mobility Radeon HD 4200
ATI Technologies Inc. ATI Mobility Radeon HD 4225 Series supported 2 ATI Mobility Radeon HD 4200
ATI Technologies Inc. ATI Mobility Radeon HD 4250 supported 2 ATI Mobility Radeon HD 4200
ATI Technologies Inc. ATI Mobility Radeon HD 4250 Graphics supported 2 ATI Mobility Radeon HD 4200
+ATI Technologies Inc. ATI Mobility Radeon HD 4250 Series supported 2 ATI Mobility Radeon HD 4200
ATI Technologies Inc. ATI Mobility Radeon HD 4270 supported 2 ATI Mobility Radeon HD 4200
ATI Technologies Inc. ATI Mobility Radeon HD 4300 Series supported 2 ATI Mobility Radeon HD 4300
ATI Technologies Inc. ATI Mobility Radeon HD 4300/4500 Series supported 2 ATI Mobility Radeon HD 4300
@@ -283,53 +311,55 @@ ATI Technologies Inc. ATI Mobility Radeon HD 4670
ATI Technologies Inc. ATI Mobility Radeon HD 4830 Series supported 3 ATI Mobility Radeon HD 4800
ATI Technologies Inc. ATI Mobility Radeon HD 4850 supported 3 ATI Mobility Radeon HD 4800
ATI Technologies Inc. ATI Mobility Radeon HD 4870 supported 3 ATI Mobility Radeon HD 4800
-ATI Technologies Inc. ATI Mobility Radeon HD 5000 supported 0 ATI Mobility Radeon
-ATI Technologies Inc. ATI Mobility Radeon HD 5000 Series supported 0 ATI Mobility Radeon
-ATI Technologies Inc. ATI Mobility Radeon HD 5145 supported 2 ATI Mobility Radeon HD 5100
-ATI Technologies Inc. ATI Mobility Radeon HD 5165 supported 2 ATI Mobility Radeon HD 5100
+ATI Technologies Inc. ATI Mobility Radeon HD 5000 supported 0 ATI Technologies
+ATI Technologies Inc. ATI Mobility Radeon HD 5000 Series supported 0 ATI Technologies
+ATI Technologies Inc. ATI Mobility Radeon HD 5145 supported 3 ATI Mobility Radeon HD 5100
+ATI Technologies Inc. ATI Mobility Radeon HD 5165 supported 3 ATI Mobility Radeon HD 5100
ATI Technologies Inc. ATI Mobility Radeon HD 530v supported 1 ATI Mobility Radeon HD 530v
-ATI Technologies Inc. ATI Mobility Radeon HD 5400 Series supported 2 ATI Mobility Radeon HD 5400
+ATI Technologies Inc. ATI Mobility Radeon HD 5400 Series supported 3 ATI Mobility Radeon HD 5400
ATI Technologies Inc. ATI Mobility Radeon HD 540v supported 2 ATI Mobility Radeon HD 540v
-ATI Technologies Inc. ATI Mobility Radeon HD 5430 supported 2 ATI Mobility Radeon HD 5400
-ATI Technologies Inc. ATI Mobility Radeon HD 5450 supported 2 ATI Mobility Radeon HD 5400
-ATI Technologies Inc. ATI Mobility Radeon HD 5450 Series supported 2 ATI Mobility Radeon HD 5400
+ATI Technologies Inc. ATI Mobility Radeon HD 5430 supported 3 ATI Mobility Radeon HD 5400
+ATI Technologies Inc. ATI Mobility Radeon HD 5450 supported 3 ATI Mobility Radeon HD 5400
+ATI Technologies Inc. ATI Mobility Radeon HD 5450 Series supported 3 ATI Mobility Radeon HD 5400
ATI Technologies Inc. ATI Mobility Radeon HD 545v supported 2 ATI Mobility Radeon HD 545v
-ATI Technologies Inc. ATI Mobility Radeon HD 5470 supported 2 ATI Mobility Radeon HD 5400
+ATI Technologies Inc. ATI Mobility Radeon HD 5470 supported 3 ATI Mobility Radeon HD 5400
ATI Technologies Inc. ATI Mobility Radeon HD 550v supported 2 ATI Mobility Radeon HD 550v
-ATI Technologies Inc. ATI Mobility Radeon HD 5600/5700 Series supported 2 ATI Mobility Radeon HD 5600
+ATI Technologies Inc. ATI Mobility Radeon HD 5600/5700 Series supported 3 ATI Mobility Radeon HD 5600
ATI Technologies Inc. ATI Mobility Radeon HD 560v supported 2 ATI Mobility Radeon HD 560v
-ATI Technologies Inc. ATI Mobility Radeon HD 5650 supported 2 ATI Mobility Radeon HD 5600
+ATI Technologies Inc. ATI Mobility Radeon HD 5650 supported 3 ATI Mobility Radeon HD 5600
ATI Technologies Inc. ATI Mobility Radeon HD 5700 Series supported 3 ATI Mobility Radeon HD 5700
ATI Technologies Inc. ATI Mobility Radeon HD 5730 supported 3 ATI Mobility Radeon HD 5700
-ATI Technologies Inc. ATI Mobility Radeon HD 5800 Series supported 0 ATI Mobility Radeon
-ATI Technologies Inc. ATI Mobility Radeon HD 5850 supported 0 ATI Mobility Radeon
-ATI Technologies Inc. ATI Mobility Radeon HD 5870 supported 0 ATI Mobility Radeon
-ATI Technologies Inc. ATI Mobility Radeon HD 6300 series supported 2 ATI Mobility Radeon HD 6300
-ATI Technologies Inc. ATI Mobility Radeon HD 6370 supported 2 ATI Mobility Radeon HD 6300
+ATI Technologies Inc. ATI Mobility Radeon HD 5800 Series supported 3 ATI Radeon HD 5800
+ATI Technologies Inc. ATI Mobility Radeon HD 5830 Series supported 3 ATI Radeon HD 5800
+ATI Technologies Inc. ATI Mobility Radeon HD 5850 supported 3 ATI Radeon HD 5800
+ATI Technologies Inc. ATI Mobility Radeon HD 5870 supported 3 ATI Radeon HD 5800
+ATI Technologies Inc. ATI Mobility Radeon HD 6300 series supported 3 ATI Mobility Radeon HD 6300
+ATI Technologies Inc. ATI Mobility Radeon HD 6370 supported 3 ATI Mobility Radeon HD 6300
ATI Technologies Inc. ATI Mobility Radeon HD 6470M supported 3 ATI Mobility Radeon HD 6400M
ATI Technologies Inc. ATI Mobility Radeon HD 6550 supported 3 ATI Mobility Radeon HD 6500M
ATI Technologies Inc. ATI Mobility Radeon HD 6570 supported 3 ATI Mobility Radeon HD 6500M
-ATI Technologies Inc. ATI Mobility Radeon X1300 supported 0 ATI Radeon X1xxx
-ATI Technologies Inc. ATI Mobility Radeon X1300 x86/MMX/3DNow!/SSE2 supported 0 ATI Radeon X1xxx
-ATI Technologies Inc. ATI Mobility Radeon X1300 x86/SSE2 supported 0 ATI Radeon X1xxx
-ATI Technologies Inc. ATI Mobility Radeon X1350 supported 0 ATI Radeon X1xxx
-ATI Technologies Inc. ATI Mobility Radeon X1350 x86/SSE2 supported 0 ATI Radeon X1xxx
-ATI Technologies Inc. ATI Mobility Radeon X1400 supported 0 ATI Radeon X1xxx
-ATI Technologies Inc. ATI Mobility Radeon X1400 x86/SSE2 supported 0 ATI Radeon X1xxx
-ATI Technologies Inc. ATI Mobility Radeon X1600 supported 0 ATI Radeon X1xxx
-ATI Technologies Inc. ATI Mobility Radeon X1600 x86/SSE2 supported 0 ATI Radeon X1xxx
-ATI Technologies Inc. ATI Mobility Radeon X1700 x86/SSE2 supported 0 ATI Radeon X1xxx
-ATI Technologies Inc. ATI Mobility Radeon X2300 supported 0 ATI Mobility Radeon X2xxx
-ATI Technologies Inc. ATI Mobility Radeon X2300 (Omega 3.8.442) supported 0 ATI Mobility Radeon X2xxx
-ATI Technologies Inc. ATI Mobility Radeon X2300 x86 supported 0 ATI Mobility Radeon X2xxx
-ATI Technologies Inc. ATI Mobility Radeon X2300 x86/MMX/3DNow!/SSE2 supported 0 ATI Mobility Radeon X2xxx
-ATI Technologies Inc. ATI Mobility Radeon X2300 x86/SSE2 supported 0 ATI Mobility Radeon X2xxx
-ATI Technologies Inc. ATI Mobility Radeon X2500 supported 0 ATI Mobility Radeon X2xxx
-ATI Technologies Inc. ATI Mobility Radeon X2500 x86/SSE2 supported 0 ATI Mobility Radeon X2xxx
+ATI Technologies Inc. ATI Mobility Radeon X1300 supported 1 ATI Radeon X13xx
+ATI Technologies Inc. ATI Mobility Radeon X1300 x86/MMX/3DNow!/SSE2 supported 1 ATI Radeon X13xx
+ATI Technologies Inc. ATI Mobility Radeon X1300 x86/SSE2 supported 1 ATI Radeon X13xx
+ATI Technologies Inc. ATI Mobility Radeon X1350 supported 1 ATI Radeon X13xx
+ATI Technologies Inc. ATI Mobility Radeon X1350 x86/SSE2 supported 1 ATI Radeon X13xx
+ATI Technologies Inc. ATI Mobility Radeon X1400 supported 1 ATI Radeon X1xxx
+ATI Technologies Inc. ATI Mobility Radeon X1400 x86/SSE2 supported 1 ATI Radeon X1xxx
+ATI Technologies Inc. ATI Mobility Radeon X1600 supported 2 ATI Radeon X16xx
+ATI Technologies Inc. ATI Mobility Radeon X1600 x86/SSE2 supported 2 ATI Radeon X16xx
+ATI Technologies Inc. ATI Mobility Radeon X1700 x86/SSE2 supported 2 ATI Radeon X17xx
+ATI Technologies Inc. ATI Mobility Radeon X2300 supported 1 ATI Radeon X2xxx
+ATI Technologies Inc. ATI Mobility Radeon X2300 (Omega 3.8.442) supported 1 ATI Radeon X2xxx
+ATI Technologies Inc. ATI Mobility Radeon X2300 x86 supported 1 ATI Radeon X2xxx
+ATI Technologies Inc. ATI Mobility Radeon X2300 x86/MMX/3DNow!/SSE2 supported 1 ATI Radeon X2xxx
+ATI Technologies Inc. ATI Mobility Radeon X2300 x86/SSE2 supported 1 ATI Radeon X2xxx
+ATI Technologies Inc. ATI Mobility Radeon X2500 supported 1 ATI Radeon X2xxx
+ATI Technologies Inc. ATI Mobility Radeon X2500 x86/SSE2 supported 1 ATI Radeon X2xxx
ATI Technologies Inc. ATI Mobility Radeon. HD 530v supported 1 ATI Mobility Radeon HD 530v
-ATI Technologies Inc. ATI Mobility Radeon. HD 5470 supported 2 ATI Mobility Radeon HD 5400
-ATI Technologies Inc. ATI RADEON HD 3200 T25XX by CAMILO supported 0 ATI Radeon HD 3200
+ATI Technologies Inc. ATI Mobility Radeon. HD 5470 supported 3 ATI Mobility Radeon HD 5400
+ATI Technologies Inc. ATI RADEON HD 3200 T25XX by CAMILO supported 1 ATI Radeon HD 3200
ATI Technologies Inc. ATI RADEON XPRESS 1100 supported 0 ATI Radeon Xpress
+ATI Technologies Inc. ATI RADEON XPRESS 1100 x86/SSE2 supported 0 ATI Radeon Xpress
ATI Technologies Inc. ATI RADEON XPRESS 200 Series supported 0 ATI Radeon Xpress
ATI Technologies Inc. ATI RADEON XPRESS 200 Series x86/SSE2 supported 0 ATI Radeon Xpress
ATI Technologies Inc. ATI RADEON XPRESS 200M SERIES supported 0 ATI Radeon Xpress
@@ -341,14 +371,15 @@ ATI Technologies Inc. ATI Radeon 3000
ATI Technologies Inc. ATI Radeon 3000 Graphics supported 0 ATI Radeon 3000
ATI Technologies Inc. ATI Radeon 3100 Graphics supported 1 ATI Radeon 3100
ATI Technologies Inc. ATI Radeon 5xxx series supported 3 ATI Radeon 5xxx
-ATI Technologies Inc. ATI Radeon 9550 / X1050 Series supported 0 ATI Radeon X1xxx
-ATI Technologies Inc. ATI Radeon 9550 / X1050 Series x86/MMX/3DNow!/SSE supported 0 ATI Radeon X1xxx
-ATI Technologies Inc. ATI Radeon 9550 / X1050 Series x86/SSE2 supported 0 ATI Radeon X1xxx
-ATI Technologies Inc. ATI Radeon 9550 / X1050 Series(Microsoft - WDDM) supported 0 ATI Radeon X1xxx
-ATI Technologies Inc. ATI Radeon 9600 / X1050 Series supported 0 ATI Radeon X1xxx
-ATI Technologies Inc. ATI Radeon 9600/9550/X1050 Series supported 0 ATI Radeon X1xxx
+ATI Technologies Inc. ATI Radeon 9550 / X1050 Series supported 0 ATI Radeon 9500
+ATI Technologies Inc. ATI Radeon 9550 / X1050 Series x86/MMX/3DNow!/SSE supported 0 ATI Radeon 9500
+ATI Technologies Inc. ATI Radeon 9550 / X1050 Series x86/SSE2 supported 0 ATI Radeon 9500
+ATI Technologies Inc. ATI Radeon 9550 / X1050 Series(Microsoft - WDDM) supported 0 ATI Radeon 9500
+ATI Technologies Inc. ATI Radeon 9600 / X1050 Series supported 0 ATI Radeon 9600
+ATI Technologies Inc. ATI Radeon 9600/9550/X1050 Series supported 0 ATI Radeon 9600
ATI Technologies Inc. ATI Radeon BA Prototype OpenGL Engine supported 0 ATI Technologies
ATI Technologies Inc. ATI Radeon BB Prototype OpenGL Engine supported 0 ATI Technologies
+ATI Technologies Inc. ATI Radeon Broadway XT Prototype OpenGL Engine supported 0 ATI Technologies
ATI Technologies Inc. ATI Radeon Cedar PRO Prototype OpenGL Engine supported 2 AMD CEDAR (HD 5450)
ATI Technologies Inc. ATI Radeon Cypress PRO Prototype OpenGL Engine supported 3 AMD CYPRESS (HD 5800)
ATI Technologies Inc. ATI Radeon Graphics Processor supported 0 ATI Technologies
@@ -370,7 +401,7 @@ ATI Technologies Inc. ATI Radeon HD 2600 Series
ATI Technologies Inc. ATI Radeon HD 2600 XT supported 2 ATI Radeon HD 2600
ATI Technologies Inc. ATI Radeon HD 2900 GT supported 3 ATI Radeon HD 2900
ATI Technologies Inc. ATI Radeon HD 2900 XT supported 3 ATI Radeon HD 2900
-ATI Technologies Inc. ATI Radeon HD 3200 Graphics supported 0 ATI Radeon HD 3200
+ATI Technologies Inc. ATI Radeon HD 3200 Graphics supported 1 ATI Radeon HD 3200
ATI Technologies Inc. ATI Radeon HD 3300 Graphics supported 1 ATI Radeon HD 3300
ATI Technologies Inc. ATI Radeon HD 3400 Series supported 1 ATI Radeon HD 3400
ATI Technologies Inc. ATI Radeon HD 3450 supported 1 ATI Radeon HD 3400
@@ -392,6 +423,7 @@ ATI Technologies Inc. ATI Radeon HD 4250
ATI Technologies Inc. ATI Radeon HD 4250 Graphics supported 1 ATI Radeon HD 4200
ATI Technologies Inc. ATI Radeon HD 4270 supported 1 ATI Radeon HD 4200
ATI Technologies Inc. ATI Radeon HD 4290 supported 1 ATI Radeon HD 4200
+ATI Technologies Inc. ATI Radeon HD 4290 (Engineering Sample) supported 1 ATI Radeon HD 4200
ATI Technologies Inc. ATI Radeon HD 4300 Series supported 1 ATI Radeon HD 4300
ATI Technologies Inc. ATI Radeon HD 4300/4500 Series supported 1 ATI Radeon HD 4300
ATI Technologies Inc. ATI Radeon HD 4350 supported 1 ATI Radeon HD 4300
@@ -418,9 +450,11 @@ ATI Technologies Inc. ATI Radeon HD 4870 OpenGL Engine
ATI Technologies Inc. ATI Radeon HD 4870 X2 supported 3 ATI Radeon HD 4800
ATI Technologies Inc. ATI Radeon HD 5400 Series supported 3 ATI Radeon HD 5400
ATI Technologies Inc. ATI Radeon HD 5450 supported 3 ATI Radeon HD 5400
+ATI Technologies Inc. ATI Radeon HD 5470 supported 3 ATI Radeon HD 5400
ATI Technologies Inc. ATI Radeon HD 5500 Series supported 3 ATI Radeon HD 5500
ATI Technologies Inc. ATI Radeon HD 5570 supported 3 ATI Radeon HD 5500
ATI Technologies Inc. ATI Radeon HD 5600 Series supported 3 ATI Radeon HD 5600
+ATI Technologies Inc. ATI Radeon HD 5600/5700 supported 3 ATI Radeon HD 5600
ATI Technologies Inc. ATI Radeon HD 5630 supported 3 ATI Radeon HD 5600
ATI Technologies Inc. ATI Radeon HD 5670 supported 3 ATI Radeon HD 5600
ATI Technologies Inc. ATI Radeon HD 5670 OpenGL Engine supported 3 ATI Radeon HD 5600
@@ -435,13 +469,14 @@ ATI Technologies Inc. ATI Radeon HD 5870
ATI Technologies Inc. ATI Radeon HD 5870 OpenGL Engine supported 3 ATI Radeon HD 5800
ATI Technologies Inc. ATI Radeon HD 5900 Series supported 3 ATI Radeon HD 5900
ATI Technologies Inc. ATI Radeon HD 5970 supported 3 ATI Radeon HD 5900
-ATI Technologies Inc. ATI Radeon HD 6230 supported 2 ATI Radeon HD 6200
-ATI Technologies Inc. ATI Radeon HD 6250 supported 2 ATI Radeon HD 6200
-ATI Technologies Inc. ATI Radeon HD 6350 supported 2 ATI Radeon HD 6300
-ATI Technologies Inc. ATI Radeon HD 6390 supported 2 ATI Radeon HD 6300
+ATI Technologies Inc. ATI Radeon HD 6230 supported 3 ATI Radeon HD 6200
+ATI Technologies Inc. ATI Radeon HD 6250 supported 3 ATI Radeon HD 6200
+ATI Technologies Inc. ATI Radeon HD 6350 supported 3 ATI Radeon HD 6300
+ATI Technologies Inc. ATI Radeon HD 6390 supported 3 ATI Radeon HD 6300
ATI Technologies Inc. ATI Radeon HD 6490M OpenGL Engine supported 3 ATI Radeon HD 6400
ATI Technologies Inc. ATI Radeon HD 6510 supported 3 ATI Radeon HD 6500
ATI Technologies Inc. ATI Radeon HD 6570M supported 3 ATI Radeon HD 6500
+ATI Technologies Inc. ATI Radeon HD 6630M OpenGL Engine supported 3 ATI Radeon HD 6600
ATI Technologies Inc. ATI Radeon HD 6750 supported 3 ATI Radeon HD 6700
ATI Technologies Inc. ATI Radeon HD 6750M OpenGL Engine supported 3 ATI Radeon HD 6700
ATI Technologies Inc. ATI Radeon HD 6770 supported 3 ATI Radeon HD 6700
@@ -459,21 +494,21 @@ ATI Technologies Inc. ATI Radeon RV790 Prototype OpenGL Engine
ATI Technologies Inc. ATI Radeon Redwood PRO Prototype OpenGL Engine supported 3 AMD REDWOOD (HD 5500/5600)
ATI Technologies Inc. ATI Radeon Redwood XT Prototype OpenGL Engine supported 3 AMD REDWOOD (HD 5500/5600)
ATI Technologies Inc. ATI Radeon Whistler PRO/LP Prototype OpenGL Engine supported 0 ATI Technologies
-ATI Technologies Inc. ATI Radeon X1050 supported 0 ATI Radeon X1xxx
-ATI Technologies Inc. ATI Radeon X1050 Series supported 0 ATI Radeon X1xxx
-ATI Technologies Inc. ATI Radeon X1200 supported 0 ATI Radeon X1xxx
-ATI Technologies Inc. ATI Radeon X1200 Series supported 0 ATI Radeon X1xxx
-ATI Technologies Inc. ATI Radeon X1200 Series x86/MMX/3DNow!/SSE2 supported 0 ATI Radeon X1xxx
-ATI Technologies Inc. ATI Radeon X1250 supported 0 ATI Radeon X1xxx
-ATI Technologies Inc. ATI Radeon X1250 x86/MMX/3DNow!/SSE2 supported 0 ATI Radeon X1xxx
-ATI Technologies Inc. ATI Radeon X1270 supported 0 ATI Radeon X1xxx
-ATI Technologies Inc. ATI Radeon X1270 x86/MMX/3DNow!/SSE2 supported 0 ATI Radeon X1xxx
-ATI Technologies Inc. ATI Radeon X1300/X1550 Series supported 0 ATI Radeon X1xxx
-ATI Technologies Inc. ATI Radeon X1550 Series supported 0 ATI Radeon X1xxx
-ATI Technologies Inc. ATI Radeon X1600 OpenGL Engine supported 0 ATI Radeon X1xxx
-ATI Technologies Inc. ATI Radeon X1900 OpenGL Engine supported 0 ATI Radeon X1xxx
-ATI Technologies Inc. ATI Radeon X1950 GT supported 0 ATI Radeon X1xxx
-ATI Technologies Inc. ATI Radeon X300/X550/X1050 Series supported 0 ATI Radeon X1xxx
+ATI Technologies Inc. ATI Radeon X1050 supported 1 ATI Radeon X1xxx
+ATI Technologies Inc. ATI Radeon X1050 Series supported 1 ATI Radeon X1xxx
+ATI Technologies Inc. ATI Radeon X1200 supported 1 ATI Radeon X1xxx
+ATI Technologies Inc. ATI Radeon X1200 Series supported 1 ATI Radeon X1xxx
+ATI Technologies Inc. ATI Radeon X1200 Series x86/MMX/3DNow!/SSE2 supported 1 ATI Radeon X1xxx
+ATI Technologies Inc. ATI Radeon X1250 supported 1 ATI Radeon X1xxx
+ATI Technologies Inc. ATI Radeon X1250 x86/MMX/3DNow!/SSE2 supported 1 ATI Radeon X1xxx
+ATI Technologies Inc. ATI Radeon X1270 supported 1 ATI Radeon X1xxx
+ATI Technologies Inc. ATI Radeon X1270 x86/MMX/3DNow!/SSE2 supported 1 ATI Radeon X1xxx
+ATI Technologies Inc. ATI Radeon X1300/X1550 Series supported 1 ATI Radeon X13xx
+ATI Technologies Inc. ATI Radeon X1550 Series supported 2 ATI Radeon X15xx
+ATI Technologies Inc. ATI Radeon X1600 OpenGL Engine supported 2 ATI Radeon X16xx
+ATI Technologies Inc. ATI Radeon X1900 OpenGL Engine supported 3 ATI Radeon X19xx
+ATI Technologies Inc. ATI Radeon X1950 GT supported 3 ATI Radeon X19xx
+ATI Technologies Inc. ATI Radeon X300/X550/X1050 Series supported 0 ATI Radeon X300
ATI Technologies Inc. ATI Radeon Xpress 1100 supported 0 ATI Radeon Xpress
ATI Technologies Inc. ATI Radeon Xpress 1150 supported 0 ATI Radeon Xpress
ATI Technologies Inc. ATI Radeon Xpress 1150 x86/MMX/3DNow!/SSE2 supported 0 ATI Radeon Xpress
@@ -482,18 +517,21 @@ ATI Technologies Inc. ATI Radeon Xpress 1200 Series
ATI Technologies Inc. ATI Radeon Xpress 1200 Series x86/MMX/3DNow!/SSE2 supported 0 ATI Radeon Xpress
ATI Technologies Inc. ATI Radeon Xpress 1200 x86/MMX/3DNow!/SSE2 supported 0 ATI Radeon Xpress
ATI Technologies Inc. ATI Radeon Xpress 1250 supported 0 ATI Radeon Xpress
+ATI Technologies Inc. ATI Radeon Xpress 1250 x86/MMX/3DNow!/SSE2 supported 0 ATI Radeon Xpress
ATI Technologies Inc. ATI Radeon Xpress 1250 x86/SSE2 supported 0 ATI Radeon Xpress
ATI Technologies Inc. ATI Radeon Xpress Series supported 0 ATI Radeon Xpress
+ATI Technologies Inc. ATI Radeon Xpress Series x86/MMX/3DNow!/SSE2 supported 0 ATI Radeon Xpress
ATI Technologies Inc. ATI Yamaha HD 9000 supported 0 ATI Technologies
ATI Technologies Inc. ATi RS880M supported 1 ATI RS880M
ATI Technologies Inc. Carte graphique VGA standard supported 0 ATI Technologies
-ATI Technologies Inc. Diamond Radeon X1550 Series supported 0 ATI Radeon X1xxx
+ATI Technologies Inc. Diamond Radeon X1550 Series supported 2 ATI Radeon X15xx
ATI Technologies Inc. EG JUNIPER supported 3 AMD JUNIPER (HD 5700)
ATI Technologies Inc. EG PARK supported 3 AMD PARK
ATI Technologies Inc. FireGL V3100 Pentium 4 (SSE2) supported 0 ATI FireGL
ATI Technologies Inc. FireMV 2400 PCI DDR x86 supported 0 ATI FireMV
ATI Technologies Inc. FireMV 2400 PCI DDR x86/SSE2 supported 0 ATI FireMV
-ATI Technologies Inc. GeCube Radeon X1550 supported 0 ATI Radeon X1xxx
+ATI Technologies Inc. GeCube Radeon X1550 supported 2 ATI Radeon X15xx
+ATI Technologies Inc. GeForce 9600 GT x86/SSE2 supported 2 ATI Geforce 9600 GT
ATI Technologies Inc. Geforce 9500 GT supported 2 ATI Geforce 9500 GT
ATI Technologies Inc. Geforce 9500GT supported 2 ATI Geforce 9500 GT
ATI Technologies Inc. Geforce 9800 GT supported 2 ATI Geforce 9800 GT
@@ -502,18 +540,22 @@ ATI Technologies Inc. HIGHTECH EXCALIBUR RADEON 9550SE Series
ATI Technologies Inc. HIGHTECH EXCALIBUR X700 PRO supported 0 ATI Technologies
ATI Technologies Inc. M21 x86/MMX/3DNow!/SSE2 supported 0 ATI Technologies
ATI Technologies Inc. M76M supported 3 ATI M76
-ATI Technologies Inc. MOBILITY RADEON 7500 DDR x86/SSE2 supported 0 ATI Mobility Radeon
-ATI Technologies Inc. MOBILITY RADEON 9000 DDR x86/SSE2 supported 0 ATI Mobility Radeon
-ATI Technologies Inc. MOBILITY RADEON 9000 IGPRADEON 9100 IGP DDR x86/SSE2 supported 0 ATI Mobility Radeon
+ATI Technologies Inc. MOBILITY RADEON 7500 DDR x86/SSE2 supported 0 ATI Mobility Radeon 7xxx
+ATI Technologies Inc. MOBILITY RADEON 9000 DDR x86/SSE2 supported 0 ATI Radeon 9000
+ATI Technologies Inc. MOBILITY RADEON 9000 IGPRADEON 9100 IGP DDR x86/SSE2 supported 0 ATI Radeon 9000
+ATI Technologies Inc. MOBILITY RADEON 9100 IGP DDR x86/SSE2 supported 0 ATI Radeon 9100
ATI Technologies Inc. MOBILITY RADEON 9600 x86/SSE2 supported 0 ATI Mobility Radeon 9600
ATI Technologies Inc. MOBILITY RADEON 9700 x86/SSE2 supported 1 ATI Mobility Radeon 9700
-ATI Technologies Inc. MOBILITY RADEON X300 x86/SSE2 supported 1 ATI Mobility Radeon X3xx
-ATI Technologies Inc. MOBILITY RADEON X600 x86/SSE2 supported 1 ATI Mobility Radeon X6xx
-ATI Technologies Inc. MOBILITY RADEON X700 SE x86 supported 1 ATI Mobility Radeon X7xx
-ATI Technologies Inc. MOBILITY RADEON X700 x86/SSE2 supported 1 ATI Mobility Radeon X7xx
+ATI Technologies Inc. MOBILITY RADEON X300 x86/SSE2 supported 0 ATI Radeon X300
+ATI Technologies Inc. MOBILITY RADEON X600 x86/SSE2 supported 1 ATI Radeon X600
+ATI Technologies Inc. MOBILITY RADEON X700 SE x86 supported 1 ATI Radeon X700
+ATI Technologies Inc. MOBILITY RADEON X700 x86/SSE2 supported 1 ATI Radeon X700
+ATI Technologies Inc. MOBILITY RADEON Xpress 200 Series SW TCL x86/MMX/3DNow!/SSE2 supported 0 ATI Radeon Xpress
ATI Technologies Inc. MSI RX9550SE supported 1 ATI Radeon RX9550
-ATI Technologies Inc. Mobility Radeon X2300 HD supported 0 ATI Mobility Radeon X2xxx
-ATI Technologies Inc. Mobility Radeon X2300 HD x86/SSE2 supported 0 ATI Mobility Radeon X2xxx
+ATI Technologies Inc. MSI Radeon X1550 Series supported 2 ATI Radeon X15xx
+ATI Technologies Inc. Mobility Radeon HD 6000 series supported 0 ATI Technologies
+ATI Technologies Inc. Mobility Radeon X2300 HD supported 1 ATI Radeon X2xxx
+ATI Technologies Inc. Mobility Radeon X2300 HD x86/SSE2 supported 1 ATI Radeon X2xxx
ATI Technologies Inc. RADEON 7000 DDR x86/MMX/3DNow!/SSE supported 0 ATI Radeon 7xxx
ATI Technologies Inc. RADEON 7000 DDR x86/SSE2 supported 0 ATI Radeon 7xxx
ATI Technologies Inc. RADEON 7500 DDR x86/MMX/3DNow!/SSE2 supported 0 ATI Radeon 7xxx
@@ -535,6 +577,7 @@ ATI Technologies Inc. RADEON 9500
ATI Technologies Inc. RADEON 9550 x86/SSE2 supported 0 ATI Radeon 9500
ATI Technologies Inc. RADEON 9600 SERIES supported 0 ATI Radeon 9600
ATI Technologies Inc. RADEON 9600 SERIES x86/MMX/3DNow!/SSE2 supported 0 ATI Radeon 9600
+ATI Technologies Inc. RADEON 9600 SERIES x86/SSE2 supported 0 ATI Radeon 9600
ATI Technologies Inc. RADEON 9600 TX x86/SSE2 supported 0 ATI Radeon 9600
ATI Technologies Inc. RADEON 9600 x86/MMX/3DNow!/SSE2 supported 0 ATI Radeon 9600
ATI Technologies Inc. RADEON 9600 x86/SSE2 supported 0 ATI Radeon 9600
@@ -549,8 +592,10 @@ ATI Technologies Inc. RADEON X550 x86/MMX/3DNow!/SSE2
ATI Technologies Inc. RADEON X550 x86/SSE2 supported 0 ATI Radeon X500
ATI Technologies Inc. RADEON X600 Series supported 1 ATI Radeon X600
ATI Technologies Inc. RADEON X600 x86/SSE2 supported 1 ATI Radeon X600
+ATI Technologies Inc. RADEON X600/X550 Series supported 1 ATI Radeon X600
ATI Technologies Inc. RADEON X700 PRO x86/SSE2 supported 1 ATI Radeon X700
ATI Technologies Inc. RADEON X800 SE x86/MMX/3DNow!/SSE2 supported 2 ATI Radeon X800
+ATI Technologies Inc. RADEON X800 XT supported 2 ATI Radeon X800
ATI Technologies Inc. RADEON X800GT supported 2 ATI Radeon X800
ATI Technologies Inc. RADEON XPRESS 200 Series SW TCL x86/MMX/3DNow!/SSE2 supported 0 ATI Radeon Xpress
ATI Technologies Inc. RADEON XPRESS 200 Series SW TCL x86/SSE2 supported 0 ATI Radeon Xpress
@@ -569,7 +614,10 @@ ATI Technologies Inc. RV410 Pro x86/SSE2
ATI Technologies Inc. RV790 supported 3 AMD RV790 (HD 4800)
ATI Technologies Inc. Radeon (TM) HD 6470M supported 0 ATI Technologies
ATI Technologies Inc. Radeon (TM) HD 6490M supported 0 ATI Technologies
+ATI Technologies Inc. Radeon (TM) HD 6750M supported 0 ATI Technologies
ATI Technologies Inc. Radeon (TM) HD 6770M supported 0 ATI Technologies
+ATI Technologies Inc. Radeon (TM) HD 6850M supported 0 ATI Technologies
+ATI Technologies Inc. Radeon 7000 DDR x86/SSE supported 0 ATI Radeon 7xxx
ATI Technologies Inc. Radeon 7000 DDR x86/SSE2 supported 0 ATI Radeon 7xxx
ATI Technologies Inc. Radeon 7000 SDR x86/SSE2 supported 0 ATI Radeon 7xxx
ATI Technologies Inc. Radeon 7500 DDR x86/SSE2 supported 0 ATI Radeon 7xxx
@@ -577,37 +625,43 @@ ATI Technologies Inc. Radeon 9000 DDR x86/SSE2
ATI Technologies Inc. Radeon DDR x86/MMX/3DNow!/SSE2 supported 0 ATI Radeon DDR
ATI Technologies Inc. Radeon DDR x86/SSE supported 0 ATI Radeon DDR
ATI Technologies Inc. Radeon DDR x86/SSE2 supported 0 ATI Radeon DDR
-ATI Technologies Inc. Radeon HD 6310 supported 2 ATI Radeon HD 6300
+ATI Technologies Inc. Radeon HD 6310 supported 3 ATI Radeon HD 6300
+ATI Technologies Inc. Radeon HD 6470M supported 3 ATI Radeon HD 6400
+ATI Technologies Inc. Radeon HD 6490M supported 3 ATI Radeon HD 6400
ATI Technologies Inc. Radeon HD 6800 Series supported 3 ATI Radeon HD 6800
ATI Technologies Inc. Radeon SDR x86/SSE2 supported 0 ATI Technologies
-ATI Technologies Inc. Radeon X1300 Series supported 0 ATI Radeon X1xxx
-ATI Technologies Inc. Radeon X1300 Series x86/MMX/3DNow!/SSE2 supported 0 ATI Radeon X1xxx
-ATI Technologies Inc. Radeon X1300 Series x86/SSE2 supported 0 ATI Radeon X1xxx
-ATI Technologies Inc. Radeon X1300/X1550 Series supported 0 ATI Radeon X1xxx
-ATI Technologies Inc. Radeon X1300/X1550 Series x86/SSE2 supported 0 ATI Radeon X1xxx
-ATI Technologies Inc. Radeon X1550 64-bit (Microsoft - WDDM) supported 0 ATI Radeon X1xxx
-ATI Technologies Inc. Radeon X1550 Series supported 0 ATI Radeon X1xxx
-ATI Technologies Inc. Radeon X1550 Series x86/SSE2 supported 0 ATI Radeon X1xxx
-ATI Technologies Inc. Radeon X1600 supported 0 ATI Radeon X1xxx
-ATI Technologies Inc. Radeon X1600 Pro / X1300XT x86/MMX/3DNow!/SSE2 supported 0 ATI Radeon X1xxx
-ATI Technologies Inc. Radeon X1600 Series x86/SSE2 supported 0 ATI Radeon X1xxx
-ATI Technologies Inc. Radeon X1600/X1650 Series supported 0 ATI Radeon X1xxx
-ATI Technologies Inc. Radeon X1650 Series supported 0 ATI Radeon X1xxx
-ATI Technologies Inc. Radeon X1650 Series x86/MMX/3DNow!/SSE2 supported 0 ATI Radeon X1xxx
-ATI Technologies Inc. Radeon X1650 Series x86/SSE2 supported 0 ATI Radeon X1xxx
-ATI Technologies Inc. Radeon X1900 Series x86/MMX/3DNow!/SSE2 supported 0 ATI Radeon X1xxx
-ATI Technologies Inc. Radeon X1950 Pro supported 0 ATI Radeon X1xxx
-ATI Technologies Inc. Radeon X1950 Pro x86/MMX/3DNow!/SSE2 supported 0 ATI Radeon X1xxx
-ATI Technologies Inc. Radeon X1950 Series supported 0 ATI Radeon X1xxx
-ATI Technologies Inc. Radeon X1950 Series (Microsoft - WDDM) supported 0 ATI Radeon X1xxx
-ATI Technologies Inc. Radeon X300/X550/X1050 Series supported 0 ATI Radeon X1xxx
+ATI Technologies Inc. Radeon X1300 Series supported 1 ATI Radeon X13xx
+ATI Technologies Inc. Radeon X1300 Series x86/MMX/3DNow!/SSE2 supported 1 ATI Radeon X13xx
+ATI Technologies Inc. Radeon X1300 Series x86/SSE2 supported 1 ATI Radeon X13xx
+ATI Technologies Inc. Radeon X1300/X1550 Series supported 1 ATI Radeon X13xx
+ATI Technologies Inc. Radeon X1300/X1550 Series x86/SSE2 supported 1 ATI Radeon X13xx
+ATI Technologies Inc. Radeon X1550 64-bit (Microsoft - WDDM) supported 2 ATI Radeon X15xx
+ATI Technologies Inc. Radeon X1550 Series supported 2 ATI Radeon X15xx
+ATI Technologies Inc. Radeon X1550 Series x86/SSE2 supported 2 ATI Radeon X15xx
+ATI Technologies Inc. Radeon X1600 supported 2 ATI Radeon X16xx
+ATI Technologies Inc. Radeon X1600 Pro / X1300XT x86/MMX/3DNow!/SSE2 supported 2 ATI Radeon X16xx
+ATI Technologies Inc. Radeon X1600 Series supported 2 ATI Radeon X16xx
+ATI Technologies Inc. Radeon X1600 Series x86/SSE2 supported 2 ATI Radeon X16xx
+ATI Technologies Inc. Radeon X1600/1650 Series supported 2 ATI Radeon X16xx
+ATI Technologies Inc. Radeon X1600/X1650 Series supported 2 ATI Radeon X16xx
+ATI Technologies Inc. Radeon X1650 Series supported 2 ATI Radeon X16xx
+ATI Technologies Inc. Radeon X1650 Series x86/MMX/3DNow!/SSE2 supported 2 ATI Radeon X16xx
+ATI Technologies Inc. Radeon X1650 Series x86/SSE2 supported 2 ATI Radeon X16xx
+ATI Technologies Inc. Radeon X1900 Series x86/MMX/3DNow!/SSE2 supported 3 ATI Radeon X19xx
+ATI Technologies Inc. Radeon X1950 Pro supported 3 ATI Radeon X19xx
+ATI Technologies Inc. Radeon X1950 Pro x86/MMX/3DNow!/SSE2 supported 3 ATI Radeon X19xx
+ATI Technologies Inc. Radeon X1950 Series supported 3 ATI Radeon X19xx
+ATI Technologies Inc. Radeon X1950 Series (Microsoft - WDDM) supported 3 ATI Radeon X19xx
+ATI Technologies Inc. Radeon X300/X550/X1050 Series supported 0 ATI Radeon X300
ATI Technologies Inc. Radeon X550/X700 Series supported 0 ATI Radeon X500
ATI Technologies Inc. Radeon X550XTX x86/MMX/3DNow!/SSE2 supported 0 ATI Radeon X500
ATI Technologies Inc. SAPPHIRE RADEON X300SE supported 0 ATI Radeon X300
ATI Technologies Inc. SAPPHIRE RADEON X300SE x86/MMX/3DNow!/SSE2 supported 0 ATI Radeon X300
ATI Technologies Inc. SAPPHIRE RADEON X300SE x86/SSE2 supported 0 ATI Radeon X300
-ATI Technologies Inc. SAPPHIRE Radeon X1550 Series supported 0 ATI Radeon X1xxx
-ATI Technologies Inc. SAPPHIRE Radeon X1550 Series x86/MMX/3DNow!/SSE2 supported 0 ATI Radeon X1xxx
+ATI Technologies Inc. SAPPHIRE Radeon X1550 Series supported 2 ATI Radeon X15xx
+ATI Technologies Inc. SAPPHIRE Radeon X1550 Series x86/MMX/3DNow!/SSE2 supported 2 ATI Radeon X15xx
+ATI Technologies Inc. SAPPHIRE Radeon X1550 Series x86/SSE2 supported 2 ATI Radeon X15xx
+ATI Technologies Inc. SAPPHIRE Radeon X1550 x86/SSE2 supported 2 ATI Radeon X15xx
ATI Technologies Inc. Sapphire Radeon HD 3730 supported 3 ATI Radeon HD 3700
ATI Technologies Inc. Sapphire Radeon HD 3750 supported 3 ATI Radeon HD 3700
ATI Technologies Inc. Standard VGA Graphics Adapter supported 0 ATI Technologies
@@ -616,7 +670,7 @@ ATI Technologies Inc. Tul, RADEON X600 PRO x86/SSE2
ATI Technologies Inc. Tul, RADEON X700 PRO supported 0 ATI Technologies
ATI Technologies Inc. Tul, RADEON X700 PRO x86/MMX/3DNow!/SSE2 supported 0 ATI Technologies
ATI Technologies Inc. VisionTek Radeon 4350 supported 0 ATI Technologies
-ATI Technologies Inc. VisionTek Radeon X1550 Series supported 0 ATI Radeon X1xxx
+ATI Technologies Inc. VisionTek Radeon X1550 Series supported 2 ATI Radeon X15xx
ATI Technologies Inc. WRESTLER 9802 supported 0 ATI Technologies
ATI Technologies Inc. WRESTLER 9803 supported 0 ATI Technologies
ATI Technologies Inc. XFX Radeon HD 4570 supported 3 ATI Radeon HD 4500
@@ -632,13 +686,14 @@ Advanced Micro Devices, Inc. Mesa DRI R600 (RV620 95C5) 20090101 x86/MMX+/3DNow!
Advanced Micro Devices, Inc. Mesa DRI R600 (RV620 95C5) 20090101 x86/MMX/SSE2 TCL DRI2 supported 1 AMD RV620 (HD 3400)
Advanced Micro Devices, Inc. Mesa DRI R600 (RV635 9596) 20090101 x86/MMX+/3DNow!+/SSE TCL DRI2 supported 3 AMD RV635 (HD 3600)
Advanced Micro Devices, Inc. Mesa DRI R600 (RV670 9505) 20090101 x86/MMX+/3DNow!+/SSE2 TCL DRI2 supported 3 AMD RV670 (HD 3800)
+Advanced Micro Devices, Inc. Mesa DRI R600 (RV670 9505) 20090101 x86/MMX/SSE2 TCL DRI2 supported 3 AMD RV670 (HD 3800)
Advanced Micro Devices, Inc. Mesa DRI R600 (RV710 9552) 20090101 x86/MMX/SSE2 TCL DRI2 supported 1 AMD RV710 (HD 4300)
Advanced Micro Devices, Inc. Mesa DRI R600 (RV730 9490) 20090101 x86/MMX+/3DNow!+/SSE2 TCL DRI2 supported 3 AMD RV730 (HD 4600)
Advanced Micro Devices, Inc. Mesa DRI R600 (RV730 9490) 20090101 x86/MMX/SSE2 TCL DRI2 supported 3 AMD RV730 (HD 4600)
Advanced Micro Devices, Inc. Mesa DRI R600 (RV730 9498) 20090101 TCL DRI2 supported 3 AMD RV730 (HD 4600)
Advanced Micro Devices, Inc. Mesa DRI R600 (RV770 9440) 20090101 x86/MMX+/3DNow!+/SSE2 TCL DRI2 supported 3 AMD RV770 (HD 4800)
Advanced Micro Devices, Inc. Mesa DRI R600 (RV770 9442) 20090101 x86/MMX/SSE2 TCL DRI2 supported 3 AMD RV770 (HD 4800)
-Alex Mohr GL Hijacker! UNRECOGNIZED
+Alex Mohr GL Hijacker! NO MATCH
Apple Software Renderer unsupported 0 Apple Software Renderer
DRI R300 Project Mesa DRI R300 (RS400 5954) 20090101 x86/MMX+/3DNow!+/SSE2 NO-TCL DRI2 supported 1 ATI R300 (9700)
DRI R300 Project Mesa DRI R300 (RS400 5975) 20090101 x86/MMX+/3DNow!+/SSE2 NO-TCL DRI2 supported 1 ATI R300 (9700)
@@ -658,13 +713,15 @@ DRI R300 Project Mesa DRI R300 (RV515 7149) 20090101 x86/MMX/SSE2 TCL DRI2
DRI R300 Project Mesa DRI R300 (RV515 714A) 20090101 x86/MMX/SSE2 TCL supported 1 ATI RV515
DRI R300 Project Mesa DRI R300 (RV515 714A) 20090101 x86/MMX/SSE2 TCL DRI2 supported 1 ATI RV515
DRI R300 Project Mesa DRI R300 (RV530 71C4) 20090101 x86/MMX/SSE2 TCL DRI2 supported 1 ATI RV530
-GPU_CLASS_UNKNOWN UNRECOGNIZED
-Humper Chromium UNRECOGNIZED
-Intel UNRECOGNIZED
+GPU_CLASS_UNKNOWN NO MATCH
+Humper 3D-Analyze v2.3 - http://www.tommti-systems.com supported 0 Humper
+Humper Chromium supported 0 Humper
+Imagination Technologies PowerVR SGX545 NO MATCH
+Intel NO MATCH
Intel HD Graphics Family supported 2 Intel HD Graphics
-Intel 3D-Analyze v2.2 - http://www.tommti-systems.com UNRECOGNIZED
-Intel 3D-Analyze v2.3 - http://www.tommti-systems.com UNRECOGNIZED
-Intel 4 Series Internal Chipset UNRECOGNIZED
+Intel 3D-Analyze v2.2 - http://www.tommti-systems.com NO MATCH
+Intel 3D-Analyze v2.3 - http://www.tommti-systems.com NO MATCH
+Intel 4 Series Internal Chipset NO MATCH
Intel 830M unsupported 0 Intel 830M
Intel 845G unsupported 0 Intel 845G
Intel 855GM unsupported 0 Intel 855GM
@@ -675,13 +732,14 @@ Intel 945G
Intel 945GM supported 0 Intel 945GM
Intel 950 supported 0 Intel 950
Intel 965 supported 0 Intel 965
-Intel B43 Express Chipset UNRECOGNIZED
+Intel B43 Express Chipset NO MATCH
Intel Bear Lake unsupported 0 Intel Bear Lake
Intel Broadwater unsupported 0 Intel Broadwater
Intel Brookdale unsupported 0 Intel Brookdale
Intel Cantiga unsupported 0 Intel Cantiga
+Intel EMGD on PowerVR SGX535 NO MATCH
Intel Eaglelake supported 0 Intel Eaglelake
-Intel Familia Mobile 45 Express Chipset (Microsoft Corporation - WDDM 1.1) UNRECOGNIZED
+Intel Familia Mobile 45 Express Chipset (Microsoft Corporation - WDDM 1.1) NO MATCH
Intel G33 unsupported 0 Intel G33
Intel G41 supported 0 Intel G41
Intel G41 Express Chipset supported 0 Intel G41
@@ -710,12 +768,12 @@ Intel HD Graphics Family BR-1012-00Y8
Intel HD Graphics Family BR-1012-00YF supported 2 Intel HD Graphics
Intel HD Graphics Family BR-1012-00ZD supported 2 Intel HD Graphics
Intel HD Graphics Family BR-1102-00ML supported 2 Intel HD Graphics
-Intel Inc. Intel GMA 900 OpenGL Engine UNRECOGNIZED
+Intel Inc. Intel GMA 900 OpenGL Engine NO MATCH
Intel Inc. Intel GMA 950 OpenGL Engine supported 0 Intel 950
Intel Inc. Intel GMA X3100 OpenGL Engine supported 0 Intel X3100
Intel Inc. Intel HD Graphics 3000 OpenGL Engine supported 2 Intel HD Graphics
Intel Inc. Intel HD Graphics OpenGL Engine supported 2 Intel HD Graphics
-Intel Inc. Intel HD xxxx OpenGL Engine UNRECOGNIZED
+Intel Inc. Intel HD xxxx OpenGL Engine NO MATCH
Intel Intel 845G unsupported 0 Intel 845G
Intel Intel 855GM unsupported 0 Intel 855GM
Intel Intel 865G unsupported 0 Intel 865G
@@ -727,39 +785,42 @@ Intel Intel 965/963 Graphics Media Accelerator
Intel Intel Bear Lake B unsupported 0 Intel Bear Lake
Intel Intel Broadwater G unsupported 0 Intel Broadwater
Intel Intel Brookdale-G unsupported 0 Intel Brookdale
-Intel Intel Calistoga UNRECOGNIZED
+Intel Intel Calistoga NO MATCH
Intel Intel Cantiga unsupported 0 Intel Cantiga
Intel Intel Eaglelake supported 0 Intel Eaglelake
-Intel Intel Grantsdale-G UNRECOGNIZED
+Intel Intel Generic Renderer NO MATCH
+Intel Intel Grantsdale-G NO MATCH
Intel Intel HD Graphics 3000 supported 2 Intel HD Graphics
-Intel Intel Lakeport UNRECOGNIZED
+Intel Intel Lakeport NO MATCH
Intel Intel Montara-GM unsupported 0 Intel Montara
Intel Intel Pineview Platform supported 0 Intel Pineview
Intel Intel Springdale-G unsupported 0 Intel Springdale
-Intel Mobile - famiglia Express Chipset 45 (Microsoft Corporation - WDDM 1.1) UNRECOGNIZED
+Intel Mobile - famiglia Express Chipset 45 (Microsoft Corporation - WDDM 1.1) NO MATCH
Intel Mobile 4 Series supported 0 Intel Mobile 4 Series
Intel Mobile 4 Series Express Chipset Family supported 0 Intel Mobile 4 Series
-Intel Mobile 45 Express Chipset Family (Microsoft Corporation - WDDM 1.1) UNRECOGNIZED
+Intel Mobile 45 Express Chipset Family NO MATCH
+Intel Mobile 45 Express Chipset Family (Microsoft Corporation - WDDM 1.1) NO MATCH
Intel Mobile HD Graphics supported 2 Intel HD Graphics
+Intel Mobile Intel(R) 4 Series Express Chipset Family supported 0 Intel Mobile 4 Series
Intel Mobile SandyBridge HD Graphics supported 2 Intel HD Graphics
Intel Montara unsupported 0 Intel Montara
Intel Pineview supported 0 Intel Pineview
-Intel Q45/Q43 Express Chipset UNRECOGNIZED
-Intel Royal BNA Driver UNRECOGNIZED
+Intel Q45/Q43 Express Chipset NO MATCH
+Intel Royal BNA Driver NO MATCH
Intel SandyBridge HD Graphics supported 2 Intel HD Graphics
Intel SandyBridge HD Graphics BR-1006-00V8 supported 2 Intel HD Graphics
Intel Springdale unsupported 0 Intel Springdale
Intel X3100 supported 0 Intel X3100
-Intergraph wcgdrv 06.05.06.18 UNRECOGNIZED
-Intergraph wcgdrv 06.06.00.35 UNRECOGNIZED
-LegendgrafiX Mobile 945 Express C/TitaniumGL/GAC/D3D ACCELERATION/6x86/1 THREADs | http://Legendgra... UNRECOGNIZED
+Intergraph wcgdrv 06.05.06.18 NO MATCH
+Intergraph wcgdrv 06.06.00.35 NO MATCH
+LegendgrafiX Mobile 945 Express C/TitaniumGL/GAC/D3D ACCELERATION/6x86/1 THREADs | http://Legendgra... NO MATCH
LegendgrafiX NVIDIA GeForce GT 430/TitaniumGL/GAC/D3D ACCELERATION/6x86/1 THREADs | http://Legendgr... supported 3 NVIDIA GT 430M
-Linden Lab Headless UNRECOGNIZED
+Linden Lab Headless NO MATCH
Matrox unsupported 0 Matrox
Mesa unsupported 0 Mesa
Mesa Project Software Rasterizer unsupported 0 Mesa
-NVIDIA /PCI/SSE2 UNRECOGNIZED
-NVIDIA /PCI/SSE2/3DNOW! UNRECOGNIZED
+NVIDIA /PCI/SSE2 NO MATCH
+NVIDIA /PCI/SSE2/3DNOW! NO MATCH
NVIDIA 205 supported 0 NVIDIA G 205M
NVIDIA 210 supported 1 NVIDIA G 210
NVIDIA 310 supported 2 NVIDIA G 310M
@@ -768,21 +829,25 @@ NVIDIA 315
NVIDIA 315M supported 2 NVIDIA G 315
NVIDIA 320M supported 2 NVIDIA G 320M
NVIDIA C51 supported 0 NVIDIA C51
-NVIDIA D10M2-20/PCI/SSE2 UNRECOGNIZED
-NVIDIA D10P1-25/PCI/SSE2 UNRECOGNIZED
-NVIDIA D10P1-30/PCI/SSE2 UNRECOGNIZED
-NVIDIA D10P2-50/PCI/SSE2 UNRECOGNIZED
-NVIDIA D11M2-30/PCI/SSE2 UNRECOGNIZED
-NVIDIA D12-P1-35/PCI/SSE2 UNRECOGNIZED
-NVIDIA D12U-15/PCI/SSE2 UNRECOGNIZED
-NVIDIA D13M1-40/PCI/SSE2 UNRECOGNIZED
-NVIDIA D13P1-40/PCI/SSE2 UNRECOGNIZED
-NVIDIA D13U-10/PCI/SSE2 UNRECOGNIZED
-NVIDIA D13U/PCI/SSE2 UNRECOGNIZED
+NVIDIA Corporation GeForce GT 230/PCI/SSE2 supported 2 NVIDIA GT 230M
+NVIDIA Corporation GeForce GTX 285/PCI/SSE2 supported 3 NVIDIA GTX 285
+NVIDIA D10M2-20/PCI/SSE2 NO MATCH
+NVIDIA D10P1-25/PCI/SSE2 NO MATCH
+NVIDIA D10P1-25/PCI/SSE2/3DNOW! NO MATCH
+NVIDIA D10P1-30/PCI/SSE2 NO MATCH
+NVIDIA D10P2-50/PCI/SSE2 NO MATCH
+NVIDIA D11M2-30/PCI/SSE2 NO MATCH
+NVIDIA D12-P1-35/PCI/SSE2 NO MATCH
+NVIDIA D12U-15/PCI/SSE2 NO MATCH
+NVIDIA D13M1-40/PCI/SSE2 NO MATCH
+NVIDIA D13P1-40/PCI/SSE2 NO MATCH
+NVIDIA D13P1-40/PCI/SSE2/3DNOW! NO MATCH
+NVIDIA D13U-10/PCI/SSE2 NO MATCH
+NVIDIA D13U/PCI/SSE2 NO MATCH
NVIDIA D9M supported 1 NVIDIA D9M
NVIDIA D9M-20/PCI/SSE2 supported 1 NVIDIA D9M
-NVIDIA Entry Graphics/PCI/SSE2 UNRECOGNIZED
-NVIDIA Entry Graphics/PCI/SSE2/3DNOW! UNRECOGNIZED
+NVIDIA Entry Graphics/PCI/SSE2 NO MATCH
+NVIDIA Entry Graphics/PCI/SSE2/3DNOW! NO MATCH
NVIDIA G 102M supported 0 NVIDIA G102M
NVIDIA G 103M supported 0 NVIDIA G103M
NVIDIA G 105M supported 0 NVIDIA G105M
@@ -793,16 +858,17 @@ NVIDIA G103M
NVIDIA G105M supported 0 NVIDIA G105M
NVIDIA G210 supported 1 NVIDIA G 210
NVIDIA G210M supported 1 NVIDIA G 210
-NVIDIA G70/PCI/SSE2 UNRECOGNIZED
+NVIDIA G70/PCI/SSE2 NO MATCH
NVIDIA G72 supported 1 NVIDIA G72
NVIDIA G73 supported 1 NVIDIA G73
NVIDIA G84 supported 2 NVIDIA G84
NVIDIA G86 supported 3 NVIDIA G86
NVIDIA G92 supported 3 NVIDIA G92
-NVIDIA G92-200/PCI/SSE2 supported 3 NVIDIA G92
+NVIDIA G92-200/PCI/SSE2 supported 0 NVIDIA G 200
NVIDIA G94 supported 3 NVIDIA G94
-NVIDIA G96/PCI/SSE2 UNRECOGNIZED
-NVIDIA G98/PCI/SSE2 UNRECOGNIZED
+NVIDIA G96/PCI/SSE2 NO MATCH
+NVIDIA G98/PCI/SSE2 NO MATCH
+NVIDIA G98/PCI/SSE2/3DNOW! NO MATCH
NVIDIA GT 120 supported 2 NVIDIA GT 120M
NVIDIA GT 130 supported 2 NVIDIA GT 130M
NVIDIA GT 130M supported 2 NVIDIA GT 130M
@@ -818,8 +884,8 @@ NVIDIA GT 240
NVIDIA GT 240M supported 2 NVIDIA GT 240M
NVIDIA GT 250M supported 2 NVIDIA GT 250M
NVIDIA GT 260M supported 2 NVIDIA GT 260M
-NVIDIA GT 320 supported 2 NVIDIA GT 320M
-NVIDIA GT 320M supported 2 NVIDIA GT 320M
+NVIDIA GT 320 supported 2 NVIDIA G 320M
+NVIDIA GT 320M supported 2 NVIDIA G 320M
NVIDIA GT 330 supported 3 NVIDIA GT 330M
NVIDIA GT 330M supported 3 NVIDIA GT 330M
NVIDIA GT 340 supported 2 NVIDIA GT 340M
@@ -831,7 +897,7 @@ NVIDIA GT 520
NVIDIA GT 540 supported 3 NVIDIA GT 540M
NVIDIA GT 540M supported 3 NVIDIA GT 540M
NVIDIA GT-120 supported 2 NVIDIA GT 120
-NVIDIA GT200/PCI/SSE2 UNRECOGNIZED
+NVIDIA GT200/PCI/SSE2 supported 0 NVIDIA G 200
NVIDIA GTS 150 supported 2 NVIDIA GT 150M
NVIDIA GTS 240 supported 3 NVIDIA GTS 240
NVIDIA GTS 250 supported 3 NVIDIA GTS 250
@@ -858,7 +924,7 @@ NVIDIA GTX 560 Ti
NVIDIA GTX 570 supported 3 NVIDIA GTX 570
NVIDIA GTX 580 supported 3 NVIDIA GTX 580
NVIDIA GTX 590 supported 3 NVIDIA GTX 590
-NVIDIA GeForce UNRECOGNIZED
+NVIDIA GeForce NO MATCH
NVIDIA GeForce 2 supported 0 NVIDIA GeForce 2
NVIDIA GeForce 205/PCI/SSE2 supported 2 NVIDIA 205
NVIDIA GeForce 210 supported 2 NVIDIA 210
@@ -877,34 +943,35 @@ NVIDIA GeForce 4 Go
NVIDIA GeForce 4 MX supported 0 NVIDIA GeForce 4
NVIDIA GeForce 4 Ti supported 0 NVIDIA GeForce 4
NVIDIA GeForce 405/PCI/SSE2 supported 1 NVIDIA G 405
-NVIDIA GeForce 6100 supported 0 NVIDIA GeForce 6100
-NVIDIA GeForce 6100 nForce 400/PCI/SSE2/3DNOW! supported 0 NVIDIA GeForce 6100
-NVIDIA GeForce 6100 nForce 405/PCI/SSE2 supported 0 NVIDIA GeForce 6100
-NVIDIA GeForce 6100 nForce 405/PCI/SSE2/3DNOW! supported 0 NVIDIA GeForce 6100
-NVIDIA GeForce 6100 nForce 420/PCI/SSE2/3DNOW! supported 0 NVIDIA GeForce 6100
-NVIDIA GeForce 6100 nForce 430/PCI/SSE2/3DNOW! supported 0 NVIDIA GeForce 6100
-NVIDIA GeForce 6100/PCI/SSE2/3DNOW! supported 0 NVIDIA GeForce 6100
+NVIDIA GeForce 410M/PCI/SSE2 supported 1 NVIDIA G 410M
+NVIDIA GeForce 6100 supported 0 NVIDIA G100
+NVIDIA GeForce 6100 nForce 400/PCI/SSE2/3DNOW! supported 0 NVIDIA G100
+NVIDIA GeForce 6100 nForce 405/PCI/SSE2 supported 0 NVIDIA G100
+NVIDIA GeForce 6100 nForce 405/PCI/SSE2/3DNOW! supported 0 NVIDIA G100
+NVIDIA GeForce 6100 nForce 420/PCI/SSE2/3DNOW! supported 0 NVIDIA G100
+NVIDIA GeForce 6100 nForce 430/PCI/SSE2/3DNOW! supported 0 NVIDIA G100
+NVIDIA GeForce 6100/PCI/SSE2/3DNOW! supported 0 NVIDIA G100
NVIDIA GeForce 6150 LE/PCI/SSE2/3DNOW! supported 0 NVIDIA GeForce 6100
NVIDIA GeForce 6150/PCI/SSE2 supported 0 NVIDIA GeForce 6100
NVIDIA GeForce 6150/PCI/SSE2/3DNOW! supported 0 NVIDIA GeForce 6100
NVIDIA GeForce 6150SE nForce 430/PCI/SSE2 supported 0 NVIDIA GeForce 6100
NVIDIA GeForce 6150SE nForce 430/PCI/SSE2/3DNOW! supported 0 NVIDIA GeForce 6100
NVIDIA GeForce 6150SE/PCI/SSE2/3DNOW! supported 0 NVIDIA GeForce 6100
-NVIDIA GeForce 6200 supported 0 NVIDIA GeForce 6200
-NVIDIA GeForce 6200 A-LE/AGP/SSE/3DNOW! supported 0 NVIDIA GeForce 6200
-NVIDIA GeForce 6200 A-LE/AGP/SSE2 supported 0 NVIDIA GeForce 6200
-NVIDIA GeForce 6200 A-LE/AGP/SSE2/3DNOW! supported 0 NVIDIA GeForce 6200
-NVIDIA GeForce 6200 LE/PCI/SSE2 supported 0 NVIDIA GeForce 6200
-NVIDIA GeForce 6200 LE/PCI/SSE2/3DNOW! supported 0 NVIDIA GeForce 6200
-NVIDIA GeForce 6200 TurboCache(TM)/PCI/SSE2 supported 0 NVIDIA GeForce 6200
-NVIDIA GeForce 6200 TurboCache(TM)/PCI/SSE2/3DNOW! supported 0 NVIDIA GeForce 6200
-NVIDIA GeForce 6200/AGP/SSE/3DNOW! supported 0 NVIDIA GeForce 6200
-NVIDIA GeForce 6200/AGP/SSE2 supported 0 NVIDIA GeForce 6200
-NVIDIA GeForce 6200/AGP/SSE2/3DNOW! supported 0 NVIDIA GeForce 6200
-NVIDIA GeForce 6200/PCI/SSE/3DNOW! supported 0 NVIDIA GeForce 6200
-NVIDIA GeForce 6200/PCI/SSE2 supported 0 NVIDIA GeForce 6200
-NVIDIA GeForce 6200/PCI/SSE2/3DNOW! supported 0 NVIDIA GeForce 6200
-NVIDIA GeForce 6200SE TurboCache(TM)/PCI/SSE2/3DNOW! supported 0 NVIDIA GeForce 6200
+NVIDIA GeForce 6200 supported 0 NVIDIA G 200
+NVIDIA GeForce 6200 A-LE/AGP/SSE/3DNOW! supported 0 NVIDIA G 200
+NVIDIA GeForce 6200 A-LE/AGP/SSE2 supported 0 NVIDIA G 200
+NVIDIA GeForce 6200 A-LE/AGP/SSE2/3DNOW! supported 0 NVIDIA G 200
+NVIDIA GeForce 6200 LE/PCI/SSE2 supported 0 NVIDIA G 200
+NVIDIA GeForce 6200 LE/PCI/SSE2/3DNOW! supported 0 NVIDIA G 200
+NVIDIA GeForce 6200 TurboCache(TM)/PCI/SSE2 supported 0 NVIDIA G 200
+NVIDIA GeForce 6200 TurboCache(TM)/PCI/SSE2/3DNOW! supported 0 NVIDIA G 200
+NVIDIA GeForce 6200/AGP/SSE/3DNOW! supported 0 NVIDIA G 200
+NVIDIA GeForce 6200/AGP/SSE2 supported 0 NVIDIA G 200
+NVIDIA GeForce 6200/AGP/SSE2/3DNOW! supported 0 NVIDIA G 200
+NVIDIA GeForce 6200/PCI/SSE/3DNOW! supported 0 NVIDIA G 200
+NVIDIA GeForce 6200/PCI/SSE2 supported 0 NVIDIA G 200
+NVIDIA GeForce 6200/PCI/SSE2/3DNOW! supported 0 NVIDIA G 200
+NVIDIA GeForce 6200SE TurboCache(TM)/PCI/SSE2/3DNOW! supported 0 NVIDIA G 200
NVIDIA GeForce 6500 supported 0 NVIDIA GeForce 6500
NVIDIA GeForce 6500/PCI/SSE2 supported 0 NVIDIA GeForce 6500
NVIDIA GeForce 6600 supported 1 NVIDIA GeForce 6600
@@ -921,11 +988,13 @@ NVIDIA GeForce 6600/PCI/SSE2
NVIDIA GeForce 6600/PCI/SSE2/3DNOW! supported 1 NVIDIA GeForce 6600
NVIDIA GeForce 6700 supported 2 NVIDIA GeForce 6700
NVIDIA GeForce 6800 supported 2 NVIDIA GeForce 6800
+NVIDIA GeForce 6800 GS/PCI/SSE2 supported 2 NVIDIA GeForce 6800
NVIDIA GeForce 6800 GS/PCI/SSE2/3DNOW! supported 2 NVIDIA GeForce 6800
NVIDIA GeForce 6800 GT/AGP/SSE2 supported 2 NVIDIA GeForce 6800
NVIDIA GeForce 6800 GT/PCI/SSE2 supported 2 NVIDIA GeForce 6800
NVIDIA GeForce 6800 XT/AGP/SSE2 supported 2 NVIDIA GeForce 6800
NVIDIA GeForce 6800 XT/PCI/SSE2 supported 2 NVIDIA GeForce 6800
+NVIDIA GeForce 6800 XT/PCI/SSE2/3DNOW! supported 2 NVIDIA GeForce 6800
NVIDIA GeForce 6800/PCI/SSE2 supported 2 NVIDIA GeForce 6800
NVIDIA GeForce 6800/PCI/SSE2/3DNOW! supported 2 NVIDIA GeForce 6800
NVIDIA GeForce 7000 supported 0 NVIDIA GeForce 7000
@@ -943,12 +1012,12 @@ NVIDIA GeForce 7050 PV / NVIDIA nForce 630a/PCI/SSE2/3DNOW!
NVIDIA GeForce 7050 PV / nForce 630a/PCI/SSE2 supported 0 NVIDIA GeForce 7000
NVIDIA GeForce 7050 PV / nForce 630a/PCI/SSE2/3DNOW! supported 0 NVIDIA GeForce 7000
NVIDIA GeForce 7050 SE / NVIDIA nForce 630a/PCI/SSE2/3DNOW! supported 0 NVIDIA GeForce 7000
-NVIDIA GeForce 7100 supported 0 NVIDIA GeForce 7100
-NVIDIA GeForce 7100 / NVIDIA nForce 620i/PCI/SSE2 supported 0 NVIDIA GeForce 7100
-NVIDIA GeForce 7100 / NVIDIA nForce 630i/PCI/SSE2 supported 0 NVIDIA GeForce 7100
-NVIDIA GeForce 7100 / nForce 630i/PCI/SSE2 supported 0 NVIDIA GeForce 7100
-NVIDIA GeForce 7100 GS/PCI/SSE2 supported 0 NVIDIA GeForce 7100
-NVIDIA GeForce 7100 GS/PCI/SSE2/3DNOW! supported 0 NVIDIA GeForce 7100
+NVIDIA GeForce 7100 supported 0 NVIDIA G100
+NVIDIA GeForce 7100 / NVIDIA nForce 620i/PCI/SSE2 supported 0 NVIDIA G100
+NVIDIA GeForce 7100 / NVIDIA nForce 630i/PCI/SSE2 supported 0 NVIDIA G100
+NVIDIA GeForce 7100 / nForce 630i/PCI/SSE2 supported 0 NVIDIA G100
+NVIDIA GeForce 7100 GS/PCI/SSE2 supported 0 NVIDIA G100
+NVIDIA GeForce 7100 GS/PCI/SSE2/3DNOW! supported 0 NVIDIA G100
NVIDIA GeForce 7150M / nForce 630M/PCI/SSE2 supported 0 NVIDIA GeForce 7100
NVIDIA GeForce 7150M / nForce 630M/PCI/SSE2/3DNOW! supported 0 NVIDIA GeForce 7100
NVIDIA GeForce 7300 supported 1 NVIDIA GeForce 7300
@@ -960,8 +1029,8 @@ NVIDIA GeForce 7300 GT/PCI/SSE2
NVIDIA GeForce 7300 GT/PCI/SSE2/3DNOW! supported 1 NVIDIA GeForce 7300
NVIDIA GeForce 7300 LE/PCI/SSE2 supported 1 NVIDIA GeForce 7300
NVIDIA GeForce 7300 LE/PCI/SSE2/3DNOW! supported 1 NVIDIA GeForce 7300
-NVIDIA GeForce 7300 SE/7200 GS/PCI/SSE2 supported 1 NVIDIA GeForce 7300
-NVIDIA GeForce 7300 SE/7200 GS/PCI/SSE2/3DNOW! supported 1 NVIDIA GeForce 7300
+NVIDIA GeForce 7300 SE/7200 GS/PCI/SSE2 supported 0 NVIDIA G 200
+NVIDIA GeForce 7300 SE/7200 GS/PCI/SSE2/3DNOW! supported 0 NVIDIA G 200
NVIDIA GeForce 7300 SE/PCI/SSE2 supported 1 NVIDIA GeForce 7300
NVIDIA GeForce 7300 SE/PCI/SSE2/3DNOW! supported 1 NVIDIA GeForce 7300
NVIDIA GeForce 7350 LE/PCI/SSE2 supported 1 NVIDIA GeForce 7300
@@ -982,24 +1051,26 @@ NVIDIA GeForce 7800
NVIDIA GeForce 7800 GS/AGP/SSE2 supported 2 NVIDIA GeForce 7800
NVIDIA GeForce 7800 GS/AGP/SSE2/3DNOW! supported 2 NVIDIA GeForce 7800
NVIDIA GeForce 7800 GT/PCI/SSE2 supported 2 NVIDIA GeForce 7800
+NVIDIA GeForce 7800 GT/PCI/SSE2/3DNOW! supported 2 NVIDIA GeForce 7800
NVIDIA GeForce 7800 GTX/PCI/SSE2 supported 2 NVIDIA GeForce 7800
NVIDIA GeForce 7800 GTX/PCI/SSE2/3DNOW! supported 2 NVIDIA GeForce 7800
NVIDIA GeForce 7900 supported 2 NVIDIA GeForce 7900
NVIDIA GeForce 7900 GS/PCI/SSE2 supported 2 NVIDIA GeForce 7900
NVIDIA GeForce 7900 GS/PCI/SSE2/3DNOW! supported 2 NVIDIA GeForce 7900
NVIDIA GeForce 7900 GT/GTO/PCI/SSE2 supported 2 NVIDIA GeForce 7900
+NVIDIA GeForce 7900 GT/GTO/PCI/SSE2/3DNOW! supported 2 NVIDIA GeForce 7900
NVIDIA GeForce 7900 GT/PCI/SSE2/3DNOW! supported 2 NVIDIA GeForce 7900
NVIDIA GeForce 7900 GTX/PCI/SSE2 supported 2 NVIDIA GeForce 7900
NVIDIA GeForce 7950 GT/PCI/SSE2 supported 2 NVIDIA GeForce 7900
NVIDIA GeForce 7950 GT/PCI/SSE2/3DNOW! supported 2 NVIDIA GeForce 7900
-NVIDIA GeForce 8100 supported 1 NVIDIA GeForce 8100
-NVIDIA GeForce 8100 / nForce 720a/PCI/SSE2/3DNOW! supported 1 NVIDIA GeForce 8100
-NVIDIA GeForce 8200 supported 1 NVIDIA GeForce 8200
-NVIDIA GeForce 8200/PCI/SSE2 supported 1 NVIDIA GeForce 8200
-NVIDIA GeForce 8200/PCI/SSE2/3DNOW! supported 1 NVIDIA GeForce 8200
-NVIDIA GeForce 8200M supported 1 NVIDIA GeForce 8200M
-NVIDIA GeForce 8200M G/PCI/SSE2 supported 1 NVIDIA GeForce 8200M
-NVIDIA GeForce 8200M G/PCI/SSE2/3DNOW! supported 1 NVIDIA GeForce 8200M
+NVIDIA GeForce 8100 supported 0 NVIDIA G100
+NVIDIA GeForce 8100 / nForce 720a/PCI/SSE2/3DNOW! supported 0 NVIDIA G100
+NVIDIA GeForce 8200 supported 0 NVIDIA G 200
+NVIDIA GeForce 8200/PCI/SSE2 supported 0 NVIDIA G 200
+NVIDIA GeForce 8200/PCI/SSE2/3DNOW! supported 0 NVIDIA G 200
+NVIDIA GeForce 8200M supported 0 NVIDIA G 200
+NVIDIA GeForce 8200M G/PCI/SSE2 supported 0 NVIDIA G 200
+NVIDIA GeForce 8200M G/PCI/SSE2/3DNOW! supported 0 NVIDIA G 200
NVIDIA GeForce 8300 supported 1 NVIDIA GeForce 8300
NVIDIA GeForce 8300 GS/PCI/SSE2 supported 1 NVIDIA GeForce 8300
NVIDIA GeForce 8400 supported 1 NVIDIA GeForce 8400
@@ -1045,17 +1116,17 @@ NVIDIA GeForce 8800 GTX/PCI/SSE2
NVIDIA GeForce 8800 Ultra/PCI/SSE2 supported 3 NVIDIA GeForce 8800
NVIDIA GeForce 8800M GTS/PCI/SSE2 supported 3 NVIDIA GeForce 8800M
NVIDIA GeForce 8800M GTX/PCI/SSE2 supported 3 NVIDIA GeForce 8800M
-NVIDIA GeForce 9100 supported 0 NVIDIA GeForce 9100
-NVIDIA GeForce 9100/PCI/SSE2 supported 0 NVIDIA GeForce 9100
-NVIDIA GeForce 9100/PCI/SSE2/3DNOW! supported 0 NVIDIA GeForce 9100
-NVIDIA GeForce 9100M supported 0 NVIDIA GeForce 9100M
-NVIDIA GeForce 9100M G/PCI/SSE2 supported 0 NVIDIA GeForce 9100M
-NVIDIA GeForce 9100M G/PCI/SSE2/3DNOW! supported 0 NVIDIA GeForce 9100M
-NVIDIA GeForce 9200 supported 1 NVIDIA GeForce 9200
-NVIDIA GeForce 9200/PCI/SSE2 supported 1 NVIDIA GeForce 9200
-NVIDIA GeForce 9200/PCI/SSE2/3DNOW! supported 1 NVIDIA GeForce 9200
-NVIDIA GeForce 9200M GE/PCI/SSE2 supported 1 NVIDIA GeForce 9200M
-NVIDIA GeForce 9200M GS/PCI/SSE2 supported 1 NVIDIA GeForce 9200M
+NVIDIA GeForce 9100 supported 0 NVIDIA G100
+NVIDIA GeForce 9100/PCI/SSE2 supported 0 NVIDIA G100
+NVIDIA GeForce 9100/PCI/SSE2/3DNOW! supported 0 NVIDIA G100
+NVIDIA GeForce 9100M supported 0 NVIDIA G100M
+NVIDIA GeForce 9100M G/PCI/SSE2 supported 0 NVIDIA G100M
+NVIDIA GeForce 9100M G/PCI/SSE2/3DNOW! supported 0 NVIDIA G100M
+NVIDIA GeForce 9200 supported 0 NVIDIA G 200
+NVIDIA GeForce 9200/PCI/SSE2 supported 0 NVIDIA G 200
+NVIDIA GeForce 9200/PCI/SSE2/3DNOW! supported 0 NVIDIA G 200
+NVIDIA GeForce 9200M GE/PCI/SSE2 supported 0 NVIDIA G 200
+NVIDIA GeForce 9200M GS/PCI/SSE2 supported 0 NVIDIA G 200
NVIDIA GeForce 9300 supported 1 NVIDIA GeForce 9300
NVIDIA GeForce 9300 / nForce 730i/PCI/SSE2 supported 1 NVIDIA GeForce 9300
NVIDIA GeForce 9300 GE/PCI/SSE2 supported 1 NVIDIA GeForce 9300
@@ -1108,16 +1179,16 @@ NVIDIA GeForce 9800M
NVIDIA GeForce 9800M GS/PCI/SSE2 supported 3 NVIDIA GeForce 9800M
NVIDIA GeForce 9800M GT/PCI/SSE2 supported 3 NVIDIA GeForce 9800M
NVIDIA GeForce 9800M GTS/PCI/SSE2 supported 3 NVIDIA GeForce 9800M
-NVIDIA GeForce FX 5100 supported 0 NVIDIA GeForce FX 5100
-NVIDIA GeForce FX 5100/AGP/SSE/3DNOW! supported 0 NVIDIA GeForce FX 5100
-NVIDIA GeForce FX 5200 supported 0 NVIDIA GeForce FX 5200
-NVIDIA GeForce FX 5200/AGP/SSE supported 0 NVIDIA GeForce FX 5200
-NVIDIA GeForce FX 5200/AGP/SSE/3DNOW! supported 0 NVIDIA GeForce FX 5200
-NVIDIA GeForce FX 5200/AGP/SSE2 supported 0 NVIDIA GeForce FX 5200
-NVIDIA GeForce FX 5200/AGP/SSE2/3DNOW! supported 0 NVIDIA GeForce FX 5200
-NVIDIA GeForce FX 5200/PCI/SSE2 supported 0 NVIDIA GeForce FX 5200
-NVIDIA GeForce FX 5200/PCI/SSE2/3DNOW! supported 0 NVIDIA GeForce FX 5200
-NVIDIA GeForce FX 5200LE/AGP/SSE2 supported 0 NVIDIA GeForce FX 5200
+NVIDIA GeForce FX 5100 supported 0 NVIDIA G100
+NVIDIA GeForce FX 5100/AGP/SSE/3DNOW! supported 0 NVIDIA G100
+NVIDIA GeForce FX 5200 supported 0 NVIDIA G 200
+NVIDIA GeForce FX 5200/AGP/SSE supported 0 NVIDIA G 200
+NVIDIA GeForce FX 5200/AGP/SSE/3DNOW! supported 0 NVIDIA G 200
+NVIDIA GeForce FX 5200/AGP/SSE2 supported 0 NVIDIA G 200
+NVIDIA GeForce FX 5200/AGP/SSE2/3DNOW! supported 0 NVIDIA G 200
+NVIDIA GeForce FX 5200/PCI/SSE2 supported 0 NVIDIA G 200
+NVIDIA GeForce FX 5200/PCI/SSE2/3DNOW! supported 0 NVIDIA G 200
+NVIDIA GeForce FX 5200LE/AGP/SSE2 supported 0 NVIDIA G 200
NVIDIA GeForce FX 5500 supported 0 NVIDIA GeForce FX 5500
NVIDIA GeForce FX 5500/AGP/SSE/3DNOW! supported 0 NVIDIA GeForce FX 5500
NVIDIA GeForce FX 5500/AGP/SSE2 supported 0 NVIDIA GeForce FX 5500
@@ -1136,17 +1207,19 @@ NVIDIA GeForce FX 5800
NVIDIA GeForce FX 5900 supported 1 NVIDIA GeForce FX 5900
NVIDIA GeForce FX 5900/AGP/SSE2 supported 1 NVIDIA GeForce FX 5900
NVIDIA GeForce FX 5900XT/AGP/SSE2 supported 1 NVIDIA GeForce FX 5900
-NVIDIA GeForce FX Go5100 supported 0 NVIDIA GeForce FX Go5100
-NVIDIA GeForce FX Go5100/AGP/SSE2 supported 0 NVIDIA GeForce FX Go5100
-NVIDIA GeForce FX Go5200 supported 0 NVIDIA GeForce FX Go5200
-NVIDIA GeForce FX Go5200/AGP/SSE2 supported 0 NVIDIA GeForce FX Go5200
+NVIDIA GeForce FX Go5100 supported 0 NVIDIA G100
+NVIDIA GeForce FX Go5100/AGP/SSE2 supported 0 NVIDIA G100
+NVIDIA GeForce FX Go5200 supported 0 NVIDIA G 200
+NVIDIA GeForce FX Go5200/AGP/SSE2 supported 0 NVIDIA G 200
NVIDIA GeForce FX Go5300 supported 0 NVIDIA GeForce FX Go5300
NVIDIA GeForce FX Go5600 supported 0 NVIDIA GeForce FX Go5600
NVIDIA GeForce FX Go5600/AGP/SSE2 supported 0 NVIDIA GeForce FX Go5600
NVIDIA GeForce FX Go5650/AGP/SSE2 supported 0 NVIDIA GeForce FX Go5600
NVIDIA GeForce FX Go5700 supported 1 NVIDIA GeForce FX Go5700
+NVIDIA GeForce FX Go5700/AGP/SSE2 supported 1 NVIDIA GeForce FX Go5700
NVIDIA GeForce FX Go5xxx/AGP/SSE2 supported 0 NVIDIA GeForce FX Go5xxx
NVIDIA GeForce G 103M/PCI/SSE2 supported 0 NVIDIA G103M
+NVIDIA GeForce G 103M/PCI/SSE2/3DNOW! supported 0 NVIDIA G103M
NVIDIA GeForce G 105M/PCI/SSE2 supported 0 NVIDIA G105M
NVIDIA GeForce G 110M/PCI/SSE2 supported 0 NVIDIA G 110M
NVIDIA GeForce G100/PCI/SSE2 supported 0 NVIDIA G100
@@ -1161,7 +1234,7 @@ NVIDIA GeForce G210M/PCI/SSE2
NVIDIA GeForce G310M/PCI/SSE2 supported 2 NVIDIA G 310M
NVIDIA GeForce GT 120/PCI/SSE2 supported 2 NVIDIA GT 120M
NVIDIA GeForce GT 120/PCI/SSE2/3DNOW! supported 2 NVIDIA GT 120M
-NVIDIA GeForce GT 120M/PCI/SSE2 supported 2 NVIDIA GT 120M
+NVIDIA GeForce GT 120M/PCI/SSE2 supported 1 NVIDIA G 120M
NVIDIA GeForce GT 130M/PCI/SSE2 supported 2 NVIDIA GT 130M
NVIDIA GeForce GT 140/PCI/SSE2 supported 2 NVIDIA GT 140M
NVIDIA GeForce GT 220/PCI/SSE2 supported 2 NVIDIA GT 220M
@@ -1173,8 +1246,8 @@ NVIDIA GeForce GT 240
NVIDIA GeForce GT 240/PCI/SSE2 supported 2 NVIDIA GT 240M
NVIDIA GeForce GT 240/PCI/SSE2/3DNOW! supported 2 NVIDIA GT 240M
NVIDIA GeForce GT 240M/PCI/SSE2 supported 2 NVIDIA GT 240M
-NVIDIA GeForce GT 320/PCI/SSE2 supported 2 NVIDIA GT 320M
-NVIDIA GeForce GT 320M/PCI/SSE2 supported 2 NVIDIA GT 320M
+NVIDIA GeForce GT 320/PCI/SSE2 supported 2 NVIDIA G 320M
+NVIDIA GeForce GT 320M/PCI/SSE2 supported 2 NVIDIA G 320M
NVIDIA GeForce GT 325M/PCI/SSE2 supported 0 NVIDIA GT 325M
NVIDIA GeForce GT 330/PCI/SSE2 supported 3 NVIDIA GT 330M
NVIDIA GeForce GT 330/PCI/SSE2/3DNOW! supported 3 NVIDIA GT 330M
@@ -1192,9 +1265,14 @@ NVIDIA GeForce GT 435M/PCI/SSE2
NVIDIA GeForce GT 440/PCI/SSE2 supported 3 NVIDIA GT 440M
NVIDIA GeForce GT 440/PCI/SSE2/3DNOW! supported 3 NVIDIA GT 440M
NVIDIA GeForce GT 445M/PCI/SSE2 supported 3 NVIDIA GT 445M
+NVIDIA GeForce GT 520/PCI/SSE2 supported 3 NVIDIA GT 520M
+NVIDIA GeForce GT 520/PCI/SSE2/3DNOW! supported 3 NVIDIA GT 520M
NVIDIA GeForce GT 520M/PCI/SSE2 supported 3 NVIDIA GT 520M
-NVIDIA GeForce GT 525M/PCI/SSE2 supported 3 NVIDIA GT 525M
+NVIDIA GeForce GT 525M/PCI/SSE2 supported 3 NVIDIA GT 520M
+NVIDIA GeForce GT 530/PCI/SSE2 supported 3 NVIDIA GT 530M
+NVIDIA GeForce GT 530/PCI/SSE2/3DNOW! supported 3 NVIDIA GT 530M
NVIDIA GeForce GT 540M/PCI/SSE2 supported 3 NVIDIA GT 540M
+NVIDIA GeForce GT 545/PCI/SSE2 supported 3 NVIDIA GT 540M
NVIDIA GeForce GT 550M/PCI/SSE2 supported 3 NVIDIA GT 550M
NVIDIA GeForce GT 555M/PCI/SSE2 supported 3 NVIDIA GT 555M
NVIDIA GeForce GTS 150/PCI/SSE2 supported 2 NVIDIA GT 150M
@@ -1212,9 +1290,11 @@ NVIDIA GeForce GTX 260/PCI/SSE2
NVIDIA GeForce GTX 260/PCI/SSE2/3DNOW! supported 3 NVIDIA GTX 260
NVIDIA GeForce GTX 260M/PCI/SSE2 supported 3 NVIDIA GTX 260
NVIDIA GeForce GTX 275/PCI/SSE2 supported 3 NVIDIA GTX 275
+NVIDIA GeForce GTX 275/PCI/SSE2/3DNOW! supported 3 NVIDIA GTX 275
NVIDIA GeForce GTX 280 supported 3 NVIDIA GTX 280
NVIDIA GeForce GTX 280/PCI/SSE2 supported 3 NVIDIA GTX 280
NVIDIA GeForce GTX 280M/PCI/SSE2 supported 3 NVIDIA GTX 280
+NVIDIA GeForce GTX 285 supported 3 NVIDIA GTX 285
NVIDIA GeForce GTX 285/PCI/SSE2 supported 3 NVIDIA GTX 285
NVIDIA GeForce GTX 295/PCI/SSE2 supported 3 NVIDIA GTX 295
NVIDIA GeForce GTX 460 SE/PCI/SSE2 supported 3 NVIDIA GTX 460
@@ -1232,6 +1312,8 @@ NVIDIA GeForce GTX 550 Ti/PCI/SSE2/3DNOW!
NVIDIA GeForce GTX 560 Ti/PCI/SSE2 supported 3 NVIDIA GTX 560
NVIDIA GeForce GTX 560 Ti/PCI/SSE2/3DNOW! supported 3 NVIDIA GTX 560
NVIDIA GeForce GTX 560/PCI/SSE2 supported 3 NVIDIA GTX 560
+NVIDIA GeForce GTX 560/PCI/SSE2/3DNOW! supported 3 NVIDIA GTX 560
+NVIDIA GeForce GTX 560M/PCI/SSE2 supported 3 NVIDIA GTX 560
NVIDIA GeForce GTX 570/PCI/SSE2 supported 3 NVIDIA GTX 570
NVIDIA GeForce GTX 570/PCI/SSE2/3DNOW! supported 3 NVIDIA GTX 570
NVIDIA GeForce GTX 580/PCI/SSE2 supported 3 NVIDIA GTX 580
@@ -1239,13 +1321,13 @@ NVIDIA GeForce GTX 580/PCI/SSE2/3DNOW!
NVIDIA GeForce GTX 580M/PCI/SSE2 supported 3 NVIDIA GTX 580M
NVIDIA GeForce GTX 590/PCI/SSE2 supported 3 NVIDIA GTX 590
NVIDIA GeForce Go 6 supported 1 NVIDIA GeForce Go 6
-NVIDIA GeForce Go 6100 supported 0 NVIDIA GeForce Go 6100
-NVIDIA GeForce Go 6100/PCI/SSE2 supported 0 NVIDIA GeForce Go 6100
-NVIDIA GeForce Go 6100/PCI/SSE2/3DNOW! supported 0 NVIDIA GeForce Go 6100
+NVIDIA GeForce Go 6100 supported 0 NVIDIA G100
+NVIDIA GeForce Go 6100/PCI/SSE2 supported 0 NVIDIA G100
+NVIDIA GeForce Go 6100/PCI/SSE2/3DNOW! supported 0 NVIDIA G100
NVIDIA GeForce Go 6150/PCI/SSE2 supported 0 NVIDIA GeForce Go 6100
NVIDIA GeForce Go 6150/PCI/SSE2/3DNOW! supported 0 NVIDIA GeForce Go 6100
-NVIDIA GeForce Go 6200 supported 0 NVIDIA GeForce Go 6200
-NVIDIA GeForce Go 6200/PCI/SSE2 supported 0 NVIDIA GeForce Go 6200
+NVIDIA GeForce Go 6200 supported 0 NVIDIA G 200
+NVIDIA GeForce Go 6200/PCI/SSE2 supported 0 NVIDIA G 200
NVIDIA GeForce Go 6400 supported 1 NVIDIA GeForce Go 6400
NVIDIA GeForce Go 6400/PCI/SSE2 supported 1 NVIDIA GeForce Go 6400
NVIDIA GeForce Go 6600 supported 1 NVIDIA GeForce Go 6600
@@ -1253,9 +1335,9 @@ NVIDIA GeForce Go 6600/PCI/SSE2
NVIDIA GeForce Go 6800 supported 1 NVIDIA GeForce Go 6800
NVIDIA GeForce Go 6800 Ultra/PCI/SSE2 supported 1 NVIDIA GeForce Go 6800
NVIDIA GeForce Go 6800/PCI/SSE2 supported 1 NVIDIA GeForce Go 6800
-NVIDIA GeForce Go 7200 supported 1 NVIDIA GeForce Go 7200
-NVIDIA GeForce Go 7200/PCI/SSE2 supported 1 NVIDIA GeForce Go 7200
-NVIDIA GeForce Go 7200/PCI/SSE2/3DNOW! supported 1 NVIDIA GeForce Go 7200
+NVIDIA GeForce Go 7200 supported 0 NVIDIA G 200
+NVIDIA GeForce Go 7200/PCI/SSE2 supported 0 NVIDIA G 200
+NVIDIA GeForce Go 7200/PCI/SSE2/3DNOW! supported 0 NVIDIA G 200
NVIDIA GeForce Go 7300 supported 1 NVIDIA GeForce Go 7300
NVIDIA GeForce Go 7300/PCI/SSE2 supported 1 NVIDIA GeForce Go 7300
NVIDIA GeForce Go 7300/PCI/SSE2/3DNOW! supported 1 NVIDIA GeForce Go 7300
@@ -1266,6 +1348,7 @@ NVIDIA GeForce Go 7600
NVIDIA GeForce Go 7600/PCI/SSE2 supported 2 NVIDIA GeForce Go 7600
NVIDIA GeForce Go 7600/PCI/SSE2/3DNOW! supported 2 NVIDIA GeForce Go 7600
NVIDIA GeForce Go 7700 supported 2 NVIDIA GeForce Go 7700
+NVIDIA GeForce Go 7700/PCI/SSE2 supported 2 NVIDIA GeForce Go 7700
NVIDIA GeForce Go 7800 supported 2 NVIDIA GeForce Go 7800
NVIDIA GeForce Go 7800 GTX/PCI/SSE2 supported 2 NVIDIA GeForce Go 7800
NVIDIA GeForce Go 7900 supported 2 NVIDIA GeForce Go 7900
@@ -1283,7 +1366,9 @@ NVIDIA GeForce3/AGP/SSE2
NVIDIA GeForce4 420 Go 32M/AGP/SSE2 supported 0 NVIDIA GeForce 4
NVIDIA GeForce4 420 Go 32M/AGP/SSE2/3DNOW! supported 0 NVIDIA GeForce 4
NVIDIA GeForce4 420 Go 32M/PCI/SSE2/3DNOW! supported 0 NVIDIA GeForce 4
+NVIDIA GeForce4 420 Go/AGP/SSE2 supported 0 NVIDIA GeForce 4
NVIDIA GeForce4 440 Go 64M/AGP/SSE2/3DNOW! supported 0 NVIDIA GeForce 4
+NVIDIA GeForce4 440 Go/AGP/SSE2 supported 0 NVIDIA GeForce 4
NVIDIA GeForce4 460 Go/AGP/SSE2 supported 0 NVIDIA GeForce 4
NVIDIA GeForce4 MX 4000/AGP/SSE/3DNOW! supported 0 NVIDIA GeForce 4
NVIDIA GeForce4 MX 4000/AGP/SSE2 supported 0 NVIDIA GeForce 4
@@ -1297,42 +1382,47 @@ NVIDIA GeForce4 MX 440/AGP/SSE2
NVIDIA GeForce4 MX 440/AGP/SSE2/3DNOW! supported 0 NVIDIA GeForce 4
NVIDIA GeForce4 MX 440SE with AGP8X/AGP/SSE2 supported 0 NVIDIA GeForce 4
NVIDIA GeForce4 MX Integrated GPU/AGP/SSE/3DNOW! supported 0 NVIDIA GeForce 4
-NVIDIA GeForce4 Ti 4200 with AGP8X/AGP/SSE supported 0 NVIDIA GeForce 4
-NVIDIA GeForce4 Ti 4200/AGP/SSE/3DNOW! supported 0 NVIDIA GeForce 4
+NVIDIA GeForce4 Ti 4200 with AGP8X/AGP/SSE supported 0 NVIDIA G 200
+NVIDIA GeForce4 Ti 4200/AGP/SSE/3DNOW! supported 0 NVIDIA G 200
NVIDIA GeForce4 Ti 4400/AGP/SSE2 supported 0 NVIDIA GeForce 4
-NVIDIA Generic UNRECOGNIZED
+NVIDIA Generic NO MATCH
NVIDIA ION LE/PCI/SSE2 supported 2 NVIDIA ION
NVIDIA ION/PCI/SSE2 supported 2 NVIDIA ION
NVIDIA ION/PCI/SSE2/3DNOW! supported 2 NVIDIA ION
-NVIDIA MCP61/PCI/SSE2 UNRECOGNIZED
-NVIDIA MCP61/PCI/SSE2/3DNOW! UNRECOGNIZED
-NVIDIA MCP73/PCI/SSE2 UNRECOGNIZED
-NVIDIA MCP79MH/PCI/SSE2 UNRECOGNIZED
-NVIDIA MCP79MX/PCI/SSE2 UNRECOGNIZED
-NVIDIA MCP7A-O/PCI/SSE2 UNRECOGNIZED
-NVIDIA MCP7A-S/PCI/SSE2 UNRECOGNIZED
-NVIDIA MCP89-EPT/PCI/SSE2 UNRECOGNIZED
-NVIDIA N10M-GE1/PCI/SSE2 UNRECOGNIZED
-NVIDIA N10P-GE1/PCI/SSE2 UNRECOGNIZED
-NVIDIA N10P-GV2/PCI/SSE2 UNRECOGNIZED
-NVIDIA N11M-GE1/PCI/SSE2 UNRECOGNIZED
-NVIDIA N11M-GE2/PCI/SSE2 UNRECOGNIZED
-NVIDIA N12E-GS-A1/PCI/SSE2 UNRECOGNIZED
-NVIDIA NB9M-GE/PCI/SSE2 UNRECOGNIZED
-NVIDIA NB9M-GE1/PCI/SSE2 UNRECOGNIZED
-NVIDIA NB9M-GS/PCI/SSE2 UNRECOGNIZED
-NVIDIA NB9M-NS/PCI/SSE2 UNRECOGNIZED
-NVIDIA NB9P-GE1/PCI/SSE2 UNRECOGNIZED
-NVIDIA NB9P-GS/PCI/SSE2 UNRECOGNIZED
-NVIDIA NV17/AGP/3DNOW! UNRECOGNIZED
-NVIDIA NV17/AGP/SSE2 UNRECOGNIZED
+NVIDIA MCP61/PCI/SSE2 supported 1 NVIDIA MCP61
+NVIDIA MCP61/PCI/SSE2/3DNOW! supported 1 NVIDIA MCP61
+NVIDIA MCP73/PCI/SSE2 supported 1 NVIDIA MCP73
+NVIDIA MCP79MH/PCI/SSE2 supported 1 NVIDIA MCP79
+NVIDIA MCP79MX/PCI/SSE2 supported 1 NVIDIA MCP79
+NVIDIA MCP7A-O/PCI/SSE2 supported 1 NVIDIA MCP7A
+NVIDIA MCP7A-S/PCI/SSE2 supported 1 NVIDIA MCP7A
+NVIDIA MCP89-EPT/PCI/SSE2 NO MATCH
+NVIDIA N10M-GE1/PCI/SSE2 supported 1 NVIDIA N10
+NVIDIA N10P-GE1/PCI/SSE2 supported 1 NVIDIA N10
+NVIDIA N10P-GV2/PCI/SSE2 supported 1 NVIDIA N10
+NVIDIA N11M-GE1/PCI/SSE2 NO MATCH
+NVIDIA N11M-GE2/PCI/SSE2 NO MATCH
+NVIDIA N12E-GS-A1/PCI/SSE2 NO MATCH
+NVIDIA N12P-GVR-B-A1/PCI/SSE2 NO MATCH
+NVIDIA N13M-GE1-B-A1/PCI/SSE2 NO MATCH
+NVIDIA N13P-GL-A1/PCI/SSE2 NO MATCH
+NVIDIA NB9M-GE/PCI/SSE2 supported 1 NVIDIA NB9M
+NVIDIA NB9M-GE1/PCI/SSE2 supported 1 NVIDIA NB9M
+NVIDIA NB9M-GS/PCI/SSE2 supported 1 NVIDIA NB9M
+NVIDIA NB9M-NS/PCI/SSE2 supported 1 NVIDIA NB9M
+NVIDIA NB9P-GE1/PCI/SSE2 supported 2 NVIDIA NB9P
+NVIDIA NB9P-GS/PCI/SSE2 supported 2 NVIDIA NB9P
+NVIDIA NV17/AGP/3DNOW! supported 0 NVIDIA NV17
+NVIDIA NV17/AGP/SSE2 supported 0 NVIDIA NV17
NVIDIA NV34 supported 0 NVIDIA NV34
NVIDIA NV35 supported 0 NVIDIA NV35
-NVIDIA NV36/AGP/SSE/3DNOW! UNRECOGNIZED
-NVIDIA NV36/AGP/SSE2 UNRECOGNIZED
-NVIDIA NV41/PCI/SSE2 UNRECOGNIZED
+NVIDIA NV36/AGP/SSE/3DNOW! supported 1 NVIDIA NV36
+NVIDIA NV36/AGP/SSE2 supported 1 NVIDIA NV36
+NVIDIA NV41/PCI/SSE2 supported 1 NVIDIA NV41
NVIDIA NV43 supported 1 NVIDIA NV43
+NVIDIA NV43/PCI/SSE2 supported 1 NVIDIA NV43
NVIDIA NV44 supported 1 NVIDIA NV44
+NVIDIA NV44/AGP/SSE2 supported 1 NVIDIA NV44
NVIDIA NVIDIA GeForce 210 OpenGL Engine supported 2 NVIDIA 210
NVIDIA NVIDIA GeForce 320M OpenGL Engine supported 2 NVIDIA 320M
NVIDIA NVIDIA GeForce 7300 GT OpenGL Engine supported 1 NVIDIA GeForce 7300
@@ -1364,22 +1454,28 @@ NVIDIA NVIDIA GeForce GTX 460M OpenGL Engine
NVIDIA NVIDIA GeForce GTX 465 OpenGL Engine supported 3 NVIDIA GTX 465
NVIDIA NVIDIA GeForce GTX 470 OpenGL Engine supported 3 NVIDIA GTX 470
NVIDIA NVIDIA GeForce GTX 480 OpenGL Engine supported 3 NVIDIA GTX 480
-NVIDIA NVIDIA GeForce Pre-Release ION OpenGL Engine UNRECOGNIZED
+NVIDIA NVIDIA GeForce Pre-Release GF108 ES OpenGL Engine NO MATCH
+NVIDIA NVIDIA GeForce Pre-Release ION OpenGL Engine supported 2 NVIDIA ION
+NVIDIA NVIDIA GeForce Pre-Release MCP7A-J-DC OpenGL Engine supported 1 NVIDIA MCP7A
NVIDIA NVIDIA GeForce4 OpenGL Engine supported 0 NVIDIA GeForce 4
NVIDIA NVIDIA NV34MAP OpenGL Engine supported 0 NVIDIA NV34
NVIDIA NVIDIA Quadro 4000 OpenGL Engine supported 3 NVIDIA Quadro 4000
NVIDIA NVIDIA Quadro FX 4800 OpenGL Engine supported 3 NVIDIA Quadro FX 4800
-NVIDIA NVS 2100M/PCI/SSE2 supported 2 NVIDIA Quadro NVS 2100M
+NVIDIA NVS 2100M/PCI/SSE2 supported 0 NVIDIA G100M
NVIDIA NVS 300/PCI/SSE2 supported 0 NVIDIA Quadro NVS
-NVIDIA NVS 3100M/PCI/SSE2 supported 2 NVIDIA Quadro NVS 3100M
-NVIDIA NVS 4100/PCI/SSE2/3DNOW! supported 0 NVIDIA Quadro NVS
-NVIDIA NVS 4200M/PCI/SSE2 supported 2 NVIDIA Quadro NVS 4200M
-NVIDIA NVS 5100M/PCI/SSE2 supported 2 NVIDIA Quadro NVS 5100M
-NVIDIA PCI UNRECOGNIZED
-NVIDIA Quadro 2000/PCI/SSE2 supported 3 NVIDIA Quadro 2000 M/D
+NVIDIA NVS 3100M/PCI/SSE2 supported 0 NVIDIA G100M
+NVIDIA NVS 4100/PCI/SSE2/3DNOW! supported 0 NVIDIA G100
+NVIDIA NVS 4200M/PCI/SSE2 supported 0 NVIDIA G 200
+NVIDIA NVS 5100M/PCI/SSE2 supported 0 NVIDIA G100M
+NVIDIA PCI NO MATCH
+NVIDIA Quadro 1000M/PCI/SSE2 supported 0 NVIDIA G100
+NVIDIA Quadro 2000/PCI/SSE2 supported 0 NVIDIA G 200
+NVIDIA Quadro 2000M/PCI/SSE2 supported 0 NVIDIA G 200
+NVIDIA Quadro 3000M/PCI/SSE2 supported 3 NVIDIA Quadro 3000M
NVIDIA Quadro 4000 supported 3 NVIDIA Quadro 4000
NVIDIA Quadro 4000 OpenGL Engine supported 3 NVIDIA Quadro 4000
NVIDIA Quadro 4000/PCI/SSE2 supported 3 NVIDIA Quadro 4000
+NVIDIA Quadro 4000M/PCI/SSE2 supported 3 NVIDIA Quadro 4000M
NVIDIA Quadro 5000/PCI/SSE2 supported 3 NVIDIA Quadro 50x0 M
NVIDIA Quadro 5000M/PCI/SSE2 supported 3 NVIDIA Quadro 50x0 M
NVIDIA Quadro 600 supported 2 NVIDIA Quadro 600
@@ -1387,12 +1483,13 @@ NVIDIA Quadro 600/PCI/SSE2
NVIDIA Quadro 600/PCI/SSE2/3DNOW! supported 2 NVIDIA Quadro 600
NVIDIA Quadro 6000 supported 3 NVIDIA Quadro 6000
NVIDIA Quadro 6000/PCI/SSE2 supported 3 NVIDIA Quadro 6000
-NVIDIA Quadro CX/PCI/SSE2 UNRECOGNIZED
+NVIDIA Quadro CX/PCI/SSE2 supported 3 NVIDIA Quadro CX
NVIDIA Quadro DCC supported 0 NVIDIA Quadro DCC
NVIDIA Quadro FX supported 1 NVIDIA Quadro FX
-NVIDIA Quadro FX 1100/AGP/SSE2 supported 1 NVIDIA Quadro FX
+NVIDIA Quadro FX 1100/AGP/SSE2 supported 0 NVIDIA G100
NVIDIA Quadro FX 1400/PCI/SSE2 supported 2 NVIDIA Quadro 400
NVIDIA Quadro FX 1500 supported 1 NVIDIA Quadro FX
+NVIDIA Quadro FX 1500/PCI/SSE2 supported 1 NVIDIA Quadro FX
NVIDIA Quadro FX 1500M/PCI/SSE2 supported 1 NVIDIA Quadro FX 1500M
NVIDIA Quadro FX 1600M/PCI/SSE2 supported 2 NVIDIA Quadro 600
NVIDIA Quadro FX 1700 supported 1 NVIDIA Quadro FX
@@ -1420,7 +1517,9 @@ NVIDIA Quadro FX 4500
NVIDIA Quadro FX 4600 supported 2 NVIDIA Quadro 600
NVIDIA Quadro FX 4800 supported 3 NVIDIA Quadro FX 4800
NVIDIA Quadro FX 4800/PCI/SSE2 supported 3 NVIDIA Quadro FX 4800
+NVIDIA Quadro FX 540/PCI/SSE2/3DNOW! supported 1 NVIDIA Quadro FX
NVIDIA Quadro FX 560 supported 1 NVIDIA Quadro FX
+NVIDIA Quadro FX 560/PCI/SSE2 supported 1 NVIDIA Quadro FX
NVIDIA Quadro FX 5600 supported 2 NVIDIA Quadro 600
NVIDIA Quadro FX 570 supported 1 NVIDIA Quadro FX
NVIDIA Quadro FX 570/PCI/SSE2 supported 1 NVIDIA Quadro FX
@@ -1431,57 +1530,73 @@ NVIDIA Quadro FX 880M
NVIDIA Quadro FX 880M/PCI/SSE2 supported 3 NVIDIA Quadro FX 880M
NVIDIA Quadro FX Go700/AGP/SSE2 supported 1 NVIDIA Quadro FX
NVIDIA Quadro NVS supported 0 NVIDIA Quadro NVS
-NVIDIA Quadro NVS 110M/PCI/SSE2 supported 0 NVIDIA Quadro NVS 1xxM
+NVIDIA Quadro NVS 110M/PCI/SSE2 supported 0 NVIDIA G 110M
NVIDIA Quadro NVS 130M/PCI/SSE2 supported 0 NVIDIA Quadro NVS 1xxM
NVIDIA Quadro NVS 135M/PCI/SSE2 supported 0 NVIDIA Quadro NVS 1xxM
NVIDIA Quadro NVS 140M/PCI/SSE2 supported 0 NVIDIA Quadro NVS 1xxM
NVIDIA Quadro NVS 150M/PCI/SSE2 supported 0 NVIDIA Quadro NVS 1xxM
NVIDIA Quadro NVS 160M/PCI/SSE2 supported 0 NVIDIA Quadro NVS 1xxM
-NVIDIA Quadro NVS 210S/PCI/SSE2/3DNOW! supported 0 NVIDIA Quadro NVS
+NVIDIA Quadro NVS 210S/PCI/SSE2/3DNOW! supported 1 NVIDIA G 210
NVIDIA Quadro NVS 285/PCI/SSE2 supported 0 NVIDIA Quadro NVS
NVIDIA Quadro NVS 290/PCI/SSE2 supported 0 NVIDIA Quadro NVS
NVIDIA Quadro NVS 295/PCI/SSE2 supported 0 NVIDIA Quadro NVS
-NVIDIA Quadro NVS 320M/PCI/SSE2 supported 2 NVIDIA Quadro NVS 320M
+NVIDIA Quadro NVS 320M/PCI/SSE2 supported 2 NVIDIA G 320M
NVIDIA Quadro NVS 55/280 PCI/PCI/SSE2 supported 0 NVIDIA Quadro NVS
NVIDIA Quadro NVS/PCI/SSE2 supported 0 NVIDIA Quadro NVS
-NVIDIA Quadro PCI-E Series/PCI/SSE2/3DNOW! UNRECOGNIZED
-NVIDIA Quadro VX 200/PCI/SSE2 UNRECOGNIZED
-NVIDIA Quadro/AGP/SSE2 UNRECOGNIZED
+NVIDIA Quadro PCI-E Series/PCI/SSE2/3DNOW! NO MATCH
+NVIDIA Quadro VX 200/PCI/SSE2 supported 0 NVIDIA G 200
+NVIDIA Quadro/AGP/SSE2 NO MATCH
NVIDIA Quadro2 supported 0 NVIDIA Quadro2
NVIDIA Quadro4 supported 0 NVIDIA Quadro4
+NVIDIA Quadro4 750 XGL/AGP/SSE2 supported 0 NVIDIA Quadro4
NVIDIA RIVA TNT unsupported 0 NVIDIA RIVA TNT
NVIDIA RIVA TNT2/AGP/SSE2 unsupported 0 NVIDIA RIVA TNT
NVIDIA RIVA TNT2/PCI/3DNOW! unsupported 0 NVIDIA RIVA TNT
+NVIDIA Tesla C2050/PCI/SSE2 supported 0 NVIDIA G 205M
NVIDIA nForce unsupported 0 NVIDIA nForce
-NVIDIA unknown board/AGP/SSE2 UNRECOGNIZED
-NVIDIA unknown board/PCI/SSE2 UNRECOGNIZED
-NVIDIA unknown board/PCI/SSE2/3DNOW! UNRECOGNIZED
+NVIDIA nForce 730a/PCI/SSE2 unsupported 0 NVIDIA nForce
+NVIDIA nForce 730a/PCI/SSE2/3DNOW! unsupported 0 NVIDIA nForce
+NVIDIA nForce 750a SLI/PCI/SSE2 unsupported 0 NVIDIA nForce
+NVIDIA nForce 750a SLI/PCI/SSE2/3DNOW! unsupported 0 NVIDIA nForce
+NVIDIA nForce 760i SLI/PCI/SSE2 unsupported 0 NVIDIA nForce
+NVIDIA nForce 780a SLI/PCI/SSE2/3DNOW! unsupported 0 NVIDIA nForce
+NVIDIA nForce 980a/780a SLI/PCI/SSE2 unsupported 0 NVIDIA nForce
+NVIDIA nForce 980a/780a SLI/PCI/SSE2/3DNOW! unsupported 0 NVIDIA nForce
+NVIDIA unknown board/AGP/SSE2 unsupported 0 NVIDIA Generic
+NVIDIA unknown board/PCI/SSE2 unsupported 0 NVIDIA Generic
+NVIDIA unknown board/PCI/SSE2/3DNOW! unsupported 0 NVIDIA Generic
Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 5670 OpenGL Engine supported 3 ATI Radeon HD 5600
Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 5750 OpenGL Engine supported 3 ATI Radeon HD 5700
Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 5770 OpenGL Engine supported 3 ATI Radeon HD 5700
Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 6490M OpenGL Engine supported 3 ATI Radeon HD 6400
Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 6750M OpenGL Engine supported 3 ATI Radeon HD 6700
-Parallels and Intel Inc. 3D-Analyze v2.3 - http://www.tommti-systems.com UNRECOGNIZED
+Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 6770M OpenGL Engine supported 3 ATI Radeon HD 6700
+Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 6970M OpenGL Engine supported 3 ATI Radeon HD 6900
+Parallels and Intel Inc. 3D-Analyze v2.3 - http://www.tommti-systems.com NO MATCH
Parallels and Intel Inc. Parallels using Intel HD Graphics 3000 OpenGL Engine supported 2 Intel HD Graphics
Parallels and NVIDIA Parallels using NVIDIA GeForce 320M OpenGL Engine supported 2 NVIDIA 320M
Parallels and NVIDIA Parallels using NVIDIA GeForce 9400 OpenGL Engine supported 1 NVIDIA GeForce 9400
Parallels and NVIDIA Parallels using NVIDIA GeForce GT 120 OpenGL Engine supported 2 NVIDIA GT 120M
Parallels and NVIDIA Parallels using NVIDIA GeForce GT 330M OpenGL Engine supported 3 NVIDIA GT 330M
Radeon RV350 on Gallium supported 0 ATI RV350 (9600)
-S3 UNRECOGNIZED
+S3 NO MATCH
+S3 Fire GL2 NO MATCH
S3 Graphics VIA/S3G UniChrome IGP/MMX/K3D unsupported 0 S3
+S3 Graphics VIA/S3G UniChrome IGP/MMX/SSE unsupported 0 S3
S3 Graphics VIA/S3G UniChrome Pro IGP/MMX/SSE unsupported 0 S3
S3 Graphics, Incorporated ProSavage/Twister unsupported 0 S3
S3 Graphics, Incorporated S3 Graphics Chrome9 HC unsupported 0 S3
S3 Graphics, Incorporated S3 Graphics DeltaChrome unsupported 0 S3
S3 Graphics, Incorporated VIA Chrome9 HC IGP unsupported 0 S3
SiS unsupported 0 SiS
+SiS 650/M650 VGA unsupported 0 SiS
SiS 661 VGA unsupported 0 SiS
SiS 662 VGA unsupported 0 SiS
SiS 741 VGA unsupported 0 SiS
SiS 760 VGA unsupported 0 SiS
SiS 761GX VGA unsupported 0 SiS
SiS Mirage Graphics3 unsupported 0 SiS
+SiS Xabre VGA unsupported 0 SiS
Trident unsupported 0 Trident
Tungsten Graphics unsupported 0 Tungsten Graphics
Tungsten Graphics, Inc Mesa DRI 865G GEM 20091221 2009Q4 x86/MMX/SSE2 unsupported 0 Mesa
@@ -1520,22 +1635,27 @@ Tungsten Graphics, Inc Mesa DRI IGD GEM 20100330 DEVELOPMENT x86/MMX/SSE2
Tungsten Graphics, Inc Mesa DRI IGDNG_D GEM 20091221 2009Q4 x86/MMX/SSE2 unsupported 0 Mesa
Tungsten Graphics, Inc Mesa DRI Ironlake Desktop GEM 20100330 DEVELOPMENT x86/MMX/SSE2 unsupported 0 Mesa
Tungsten Graphics, Inc Mesa DRI Ironlake Mobile GEM 20100330 DEVELOPMENT x86/MMX/SSE2 unsupported 0 Mesa
+Tungsten Graphics, Inc Mesa DRI Mobile Intelå¨ GM45 Express Chipset unsupported 0 Mesa
Tungsten Graphics, Inc Mesa DRI Mobile Intelå¨ GM45 Express Chipset 20080716 x86/MMX/SSE2 unsupported 0 Mesa
Tungsten Graphics, Inc Mesa DRI Mobile Intelå¨ GM45 Express Chipset GEM 20090712 2009Q2 RC3 x86/MMX... unsupported 0 Mesa
Tungsten Graphics, Inc Mesa DRI Mobile Intelå¨ GM45 Express Chipset GEM 20091221 2009Q4 x86/MMX/SSE2 unsupported 0 Mesa
Tungsten Graphics, Inc Mesa DRI Mobile Intelå¨ GM45 Express Chipset GEM 20100328 2010Q1 unsupported 0 Mesa
Tungsten Graphics, Inc Mesa DRI Mobile Intelå¨ GM45 Express Chipset GEM 20100330 DEVELOPMENT unsupported 0 Mesa
Tungsten Graphics, Inc Mesa DRI Mobile Intelå¨ GM45 Express Chipset GEM 20100330 DEVELOPMENT x86/MM... unsupported 0 Mesa
+Tungsten Graphics, Inc. Mesa DRI R200 (RV250 4C66) 20090101 x86/MMX/SSE2 TCL DRI2 unsupported 0 Mesa
Tungsten Graphics, Inc. Mesa DRI R200 (RV280 5964) 20090101 x86/MMX+/3DNow!+/SSE2 TCL DRI2 unsupported 0 Mesa
VIA unsupported 0 VIA
-VMware, Inc. Gallium 0.3 on SVGA3D; build: RELEASE; UNRECOGNIZED
-VMware, Inc. Gallium 0.4 on i915 (chipset: 945GM) UNRECOGNIZED
-VMware, Inc. Gallium 0.4 on llvmpipe UNRECOGNIZED
-VMware, Inc. Gallium 0.4 on softpipe UNRECOGNIZED
+VMware, Inc. Gallium 0.3 on SVGA3D; build: RELEASE; NO MATCH
+VMware, Inc. Gallium 0.4 on SVGA3D; build: DEBUG; mutex: MSVC Intrinsics NO MATCH
+VMware, Inc. Gallium 0.4 on SVGA3D; build: RELEASE; NO MATCH
+VMware, Inc. Gallium 0.4 on i915 (chipset: 945GM) NO MATCH
+VMware, Inc. Gallium 0.4 on llvmpipe NO MATCH
+VMware, Inc. Gallium 0.4 on softpipe NO MATCH
X.Org Gallium 0.4 on AMD BARTS supported 3 AMD BARTS (HD 6800)
X.Org Gallium 0.4 on AMD CEDAR supported 2 AMD CEDAR (HD 5450)
X.Org Gallium 0.4 on AMD HEMLOCK supported 3 AMD HEMLOCK (HD 5970)
X.Org Gallium 0.4 on AMD JUNIPER supported 3 AMD JUNIPER (HD 5700)
+X.Org Gallium 0.4 on AMD PALM NO MATCH
X.Org Gallium 0.4 on AMD REDWOOD supported 3 AMD REDWOOD (HD 5500/5600)
X.Org Gallium 0.4 on AMD RS780 supported 0 AMD RS780 (HD 3200)
X.Org Gallium 0.4 on AMD RS880 supported 1 AMD RS880 (HD 4200)
@@ -1548,16 +1668,21 @@ X.Org Gallium 0.4 on AMD RV730
X.Org Gallium 0.4 on AMD RV740 supported 3 AMD RV740 (HD 4700)
X.Org Gallium 0.4 on AMD RV770 supported 3 AMD RV770 (HD 4800)
X.Org R300 Project Gallium 0.4 on ATI R300 supported 1 ATI R300 (9700)
+X.Org R300 Project Gallium 0.4 on ATI R350 supported 1 ATI R350 (9800)
+X.Org R300 Project Gallium 0.4 on ATI R420 supported 1 ATI R300 (9700)
X.Org R300 Project Gallium 0.4 on ATI R580 supported 3 ATI R580 (X1900)
X.Org R300 Project Gallium 0.4 on ATI RC410 unsupported 0 ATI RC410 (Xpress 200)
+X.Org R300 Project Gallium 0.4 on ATI RS480 unsupported 0 ATI RS48x (Xpress 200x)
X.Org R300 Project Gallium 0.4 on ATI RS482 unsupported 0 ATI RS48x (Xpress 200x)
X.Org R300 Project Gallium 0.4 on ATI RS600 unsupported 0 ATI RS600 (Xpress 3200)
X.Org R300 Project Gallium 0.4 on ATI RS690 supported 1 ATI R300 (9700)
+X.Org R300 Project Gallium 0.4 on ATI RS740 supported 1 ATI R300 (9700)
X.Org R300 Project Gallium 0.4 on ATI RV350 supported 0 ATI RV350 (9600)
X.Org R300 Project Gallium 0.4 on ATI RV370 supported 0 ATI RV370 (X300)
X.Org R300 Project Gallium 0.4 on ATI RV410 supported 1 ATI RV410 (X700)
X.Org R300 Project Gallium 0.4 on ATI RV515 supported 1 ATI RV515
X.Org R300 Project Gallium 0.4 on ATI RV530 supported 1 ATI RV530
+X.Org R300 Project Gallium 0.4 on ATI RV560 supported 1 ATI R300 (9700)
X.Org R300 Project Gallium 0.4 on ATI RV570 supported 3 ATI RV570 (X1900 GT/PRO)
X.Org R300 Project Gallium 0.4 on R420 supported 1 ATI R300 (9700)
X.Org R300 Project Gallium 0.4 on R580 supported 3 ATI R580 (X1900)
@@ -1573,23 +1698,29 @@ X.Org R300 Project Gallium 0.4 on RV410
X.Org R300 Project Gallium 0.4 on RV515 supported 1 ATI RV515
X.Org R300 Project Gallium 0.4 on RV530 supported 1 ATI RV530
XGI unsupported 0 XGI
-nouveau Gallium 0.4 on NV34 UNRECOGNIZED
-nouveau Gallium 0.4 on NV36 UNRECOGNIZED
-nouveau Gallium 0.4 on NV46 UNRECOGNIZED
-nouveau Gallium 0.4 on NV49 UNRECOGNIZED
-nouveau Gallium 0.4 on NV4A UNRECOGNIZED
-nouveau Gallium 0.4 on NV4B UNRECOGNIZED
-nouveau Gallium 0.4 on NV4E UNRECOGNIZED
-nouveau Gallium 0.4 on NV50 UNRECOGNIZED
-nouveau Gallium 0.4 on NV84 UNRECOGNIZED
-nouveau Gallium 0.4 on NV86 UNRECOGNIZED
-nouveau Gallium 0.4 on NV92 UNRECOGNIZED
-nouveau Gallium 0.4 on NV94 UNRECOGNIZED
-nouveau Gallium 0.4 on NV96 UNRECOGNIZED
-nouveau Gallium 0.4 on NV98 UNRECOGNIZED
-nouveau Gallium 0.4 on NVA0 UNRECOGNIZED
-nouveau Gallium 0.4 on NVA3 UNRECOGNIZED
-nouveau Gallium 0.4 on NVA5 UNRECOGNIZED
-nouveau Gallium 0.4 on NVA8 UNRECOGNIZED
-nouveau Gallium 0.4 on NVAA UNRECOGNIZED
-nouveau Gallium 0.4 on NVAC UNRECOGNIZED
+nouveau Gallium 0.4 on NV31 NO MATCH
+nouveau Gallium 0.4 on NV34 NO MATCH
+nouveau Gallium 0.4 on NV36 NO MATCH
+nouveau Gallium 0.4 on NV43 NO MATCH
+nouveau Gallium 0.4 on NV44 NO MATCH
+nouveau Gallium 0.4 on NV46 NO MATCH
+nouveau Gallium 0.4 on NV49 NO MATCH
+nouveau Gallium 0.4 on NV4A NO MATCH
+nouveau Gallium 0.4 on NV4B NO MATCH
+nouveau Gallium 0.4 on NV4C NO MATCH
+nouveau Gallium 0.4 on NV4E NO MATCH
+nouveau Gallium 0.4 on NV50 NO MATCH
+nouveau Gallium 0.4 on NV63 NO MATCH
+nouveau Gallium 0.4 on NV67 NO MATCH
+nouveau Gallium 0.4 on NV84 NO MATCH
+nouveau Gallium 0.4 on NV86 NO MATCH
+nouveau Gallium 0.4 on NV92 NO MATCH
+nouveau Gallium 0.4 on NV94 NO MATCH
+nouveau Gallium 0.4 on NV96 NO MATCH
+nouveau Gallium 0.4 on NV98 NO MATCH
+nouveau Gallium 0.4 on NVA0 NO MATCH
+nouveau Gallium 0.4 on NVA3 NO MATCH
+nouveau Gallium 0.4 on NVA5 NO MATCH
+nouveau Gallium 0.4 on NVA8 NO MATCH
+nouveau Gallium 0.4 on NVAA NO MATCH
+nouveau Gallium 0.4 on NVAC NO MATCH
diff --git a/indra/newview/tests/gpus_seen.txt b/indra/newview/tests/gpus_seen.txt
index c807f22b58..570f92a9b0 100644
--- a/indra/newview/tests/gpus_seen.txt
+++ b/indra/newview/tests/gpus_seen.txt
@@ -135,94 +135,183 @@ ATI Rage 128
ATI Technologies Inc.
ATI Technologies Inc. x86
ATI Technologies Inc. x86/SSE2
+ATI Technologies Inc. x86/SSE2
ATI Technologies Inc. (Vista) ATI Mobility Radeon HD 5730
+ATI Technologies Inc. 128MB ATI Radeon X1300 x86/SSE2
ATI Technologies Inc. 256MB ATI Radeon X1300PRO x86/SSE2
ATI Technologies Inc. AMD 760G
+ATI Technologies Inc. AMD 760G
ATI Technologies Inc. AMD 760G (Microsoft WDDM 1.1)
ATI Technologies Inc. AMD 780L
ATI Technologies Inc. AMD FirePro 2270
ATI Technologies Inc. AMD M860G with ATI Mobility Radeon 4100
+ATI Technologies Inc. AMD M860G with ATI Mobility Radeon 4100
ATI Technologies Inc. AMD M880G with ATI Mobility Radeon HD 4200
+ATI Technologies Inc. AMD M880G with ATI Mobility Radeon HD 4200
+ATI Technologies Inc. AMD M880G with ATI Mobility Radeon HD 4250
ATI Technologies Inc. AMD M880G with ATI Mobility Radeon HD 4250
+ATI Technologies Inc. AMD RADEON HD 6350
+ATI Technologies Inc. AMD RADEON HD 6450
ATI Technologies Inc. AMD RADEON HD 6450
+ATI Technologies Inc. AMD RADEON HD 6670
+ATI Technologies Inc. AMD Radeon 6600M and 6700M Series
ATI Technologies Inc. AMD Radeon HD 6200 series Graphics
+ATI Technologies Inc. AMD Radeon HD 6200 series Graphics
+ATI Technologies Inc. AMD Radeon HD 6250 Graphics
ATI Technologies Inc. AMD Radeon HD 6250 Graphics
+ATI Technologies Inc. AMD Radeon HD 6290 Graphics
+ATI Technologies Inc. AMD Radeon HD 6300 series Graphics
ATI Technologies Inc. AMD Radeon HD 6300 series Graphics
ATI Technologies Inc. AMD Radeon HD 6300M Series
+ATI Technologies Inc. AMD Radeon HD 6300M Series
+ATI Technologies Inc. AMD Radeon HD 6310 Graphics
ATI Technologies Inc. AMD Radeon HD 6310 Graphics
ATI Technologies Inc. AMD Radeon HD 6310M
+ATI Technologies Inc. AMD Radeon HD 6310M
+ATI Technologies Inc. AMD Radeon HD 6330M
ATI Technologies Inc. AMD Radeon HD 6330M
ATI Technologies Inc. AMD Radeon HD 6350
ATI Technologies Inc. AMD Radeon HD 6370M
+ATI Technologies Inc. AMD Radeon HD 6370M
ATI Technologies Inc. AMD Radeon HD 6400M Series
+ATI Technologies Inc. AMD Radeon HD 6400M Series
+ATI Technologies Inc. AMD Radeon HD 6450
ATI Technologies Inc. AMD Radeon HD 6450
ATI Technologies Inc. AMD Radeon HD 6470M
+ATI Technologies Inc. AMD Radeon HD 6470M
ATI Technologies Inc. AMD Radeon HD 6490M
+ATI Technologies Inc. AMD Radeon HD 6490M
+ATI Technologies Inc. AMD Radeon HD 6500 Series
+ATI Technologies Inc. AMD Radeon HD 6500M Series
+ATI Technologies Inc. AMD Radeon HD 6500M/5600/5700 Series
ATI Technologies Inc. AMD Radeon HD 6500M/5600/5700 Series
ATI Technologies Inc. AMD Radeon HD 6530M
+ATI Technologies Inc. AMD Radeon HD 6530M
ATI Technologies Inc. AMD Radeon HD 6550M
+ATI Technologies Inc. AMD Radeon HD 6550M
+ATI Technologies Inc. AMD Radeon HD 6570
ATI Technologies Inc. AMD Radeon HD 6570
ATI Technologies Inc. AMD Radeon HD 6570M
+ATI Technologies Inc. AMD Radeon HD 6570M
+ATI Technologies Inc. AMD Radeon HD 6570M/5700 Series
ATI Technologies Inc. AMD Radeon HD 6570M/5700 Series
+ATI Technologies Inc. AMD Radeon HD 6600 Series
ATI Technologies Inc. AMD Radeon HD 6600M Series
+ATI Technologies Inc. AMD Radeon HD 6630M
+ATI Technologies Inc. AMD Radeon HD 6650M
ATI Technologies Inc. AMD Radeon HD 6650M
ATI Technologies Inc. AMD Radeon HD 6670
+ATI Technologies Inc. AMD Radeon HD 6670
+ATI Technologies Inc. AMD Radeon HD 6700 Series
ATI Technologies Inc. AMD Radeon HD 6700 Series
ATI Technologies Inc. AMD Radeon HD 6750
+ATI Technologies Inc. AMD Radeon HD 6750
ATI Technologies Inc. AMD Radeon HD 6750M
+ATI Technologies Inc. AMD Radeon HD 6750M
+ATI Technologies Inc. AMD Radeon HD 6770
ATI Technologies Inc. AMD Radeon HD 6770
+ATI Technologies Inc. AMD Radeon HD 6770M
+ATI Technologies Inc. AMD Radeon HD 6800 Series
ATI Technologies Inc. AMD Radeon HD 6800 Series
+ATI Technologies Inc. AMD Radeon HD 6800M Series
+ATI Technologies Inc. AMD Radeon HD 6850
ATI Technologies Inc. AMD Radeon HD 6850M
+ATI Technologies Inc. AMD Radeon HD 6850M
+ATI Technologies Inc. AMD Radeon HD 6870
ATI Technologies Inc. AMD Radeon HD 6870
ATI Technologies Inc. AMD Radeon HD 6870M
+ATI Technologies Inc. AMD Radeon HD 6870M
+ATI Technologies Inc. AMD Radeon HD 6900 Series
ATI Technologies Inc. AMD Radeon HD 6900 Series
+ATI Technologies Inc. AMD Radeon HD 6900M Series
+ATI Technologies Inc. AMD Radeon HD 6970M
ATI Technologies Inc. AMD Radeon HD 6970M
ATI Technologies Inc. AMD Radeon HD 6990
+ATI Technologies Inc. AMD Radeon HD 6990
+ATI Technologies Inc. AMD Radeon(TM) HD 6470M
+ATI Technologies Inc. AMD Radeon(TM) HD 6470M
ATI Technologies Inc. AMD Radeon(TM) HD 6470M
+ATI Technologies Inc. AMD Radeon(TM) HD 6480G
+ATI Technologies Inc. AMD Radeon(TM) HD 6520G
+ATI Technologies Inc. AMD Radeon(TM) HD 6620G
+ATI Technologies Inc. AMD Radeon(TM) HD 6630M
ATI Technologies Inc. ASUS 5870 Eyefinity 6
+ATI Technologies Inc. ASUS A9550 Series
ATI Technologies Inc. ASUS AH2600 Series
ATI Technologies Inc. ASUS AH3450 Series
ATI Technologies Inc. ASUS AH3650 Series
+ATI Technologies Inc. ASUS AH3650 Series
ATI Technologies Inc. ASUS AH4650 Series
ATI Technologies Inc. ASUS ARES
+ATI Technologies Inc. ASUS ARES
ATI Technologies Inc. ASUS EAH2900 Series
ATI Technologies Inc. ASUS EAH3450 Series
+ATI Technologies Inc. ASUS EAH3450 Series
ATI Technologies Inc. ASUS EAH3650 Series
+ATI Technologies Inc. ASUS EAH3650 Series
+ATI Technologies Inc. ASUS EAH4350 series
ATI Technologies Inc. ASUS EAH4350 series
ATI Technologies Inc. ASUS EAH4550 series
+ATI Technologies Inc. ASUS EAH4550 series
ATI Technologies Inc. ASUS EAH4650 series
ATI Technologies Inc. ASUS EAH4670 series
+ATI Technologies Inc. ASUS EAH4670 series
ATI Technologies Inc. ASUS EAH4750 Series
ATI Technologies Inc. ASUS EAH4770 Series
+ATI Technologies Inc. ASUS EAH4770 Series
+ATI Technologies Inc. ASUS EAH4770 series
ATI Technologies Inc. ASUS EAH4770 series
ATI Technologies Inc. ASUS EAH4850 series
ATI Technologies Inc. ASUS EAH5450 Series
+ATI Technologies Inc. ASUS EAH5450 Series
+ATI Technologies Inc. ASUS EAH5550 Series
ATI Technologies Inc. ASUS EAH5550 Series
ATI Technologies Inc. ASUS EAH5570 series
+ATI Technologies Inc. ASUS EAH5570 series
+ATI Technologies Inc. ASUS EAH5670 Series
ATI Technologies Inc. ASUS EAH5670 Series
ATI Technologies Inc. ASUS EAH5750 Series
+ATI Technologies Inc. ASUS EAH5750 Series
+ATI Technologies Inc. ASUS EAH5770 Series
ATI Technologies Inc. ASUS EAH5770 Series
ATI Technologies Inc. ASUS EAH5830 Series
ATI Technologies Inc. ASUS EAH5850 Series
+ATI Technologies Inc. ASUS EAH5850 Series
ATI Technologies Inc. ASUS EAH5870 Series
+ATI Technologies Inc. ASUS EAH5870 Series
+ATI Technologies Inc. ASUS EAH5970 Series
ATI Technologies Inc. ASUS EAH5970 Series
+ATI Technologies Inc. ASUS EAH6450 Series
+ATI Technologies Inc. ASUS EAH6570 Series
+ATI Technologies Inc. ASUS EAH6670 Series
+ATI Technologies Inc. ASUS EAH6850 Series
ATI Technologies Inc. ASUS EAH6850 Series
ATI Technologies Inc. ASUS EAH6870 Series
+ATI Technologies Inc. ASUS EAH6870 Series
+ATI Technologies Inc. ASUS EAH6950 Series
ATI Technologies Inc. ASUS EAH6950 Series
ATI Technologies Inc. ASUS EAH6970 Series
+ATI Technologies Inc. ASUS EAH6970 Series
ATI Technologies Inc. ASUS EAHG4670 series
ATI Technologies Inc. ASUS Extreme AX600 Series
+ATI Technologies Inc. ASUS Extreme AX600 Series
+ATI Technologies Inc. ASUS Extreme AX600XT-TD
ATI Technologies Inc. ASUS Extreme AX600XT-TD
ATI Technologies Inc. ASUS X1300 Series x86/SSE2
ATI Technologies Inc. ASUS X1550 Series
ATI Technologies Inc. ASUS X1950 Series x86/SSE2
ATI Technologies Inc. ASUS X800 Series
+ATI Technologies Inc. ASUS X800 Series
ATI Technologies Inc. ASUS X850 Series
ATI Technologies Inc. ATI All-in-Wonder HD
ATI Technologies Inc. ATI FirePro 2260
+ATI Technologies Inc. ATI FirePro 2260
ATI Technologies Inc. ATI FirePro 2450
ATI Technologies Inc. ATI FirePro M5800
+ATI Technologies Inc. ATI FirePro M5800
ATI Technologies Inc. ATI FirePro M7740
+ATI Technologies Inc. ATI FirePro M7740
+ATI Technologies Inc. ATI FirePro M7820
ATI Technologies Inc. ATI FirePro M7820
ATI Technologies Inc. ATI FirePro V3700 (FireGL)
ATI Technologies Inc. ATI FirePro V3800
@@ -230,113 +319,202 @@ ATI Technologies Inc. ATI FirePro V4800
ATI Technologies Inc. ATI FirePro V4800 (FireGL)
ATI Technologies Inc. ATI FirePro V5800
ATI Technologies Inc. ATI FirePro V7800
+ATI Technologies Inc. ATI MOBILITY RADEON 9600/9700 Series
+ATI Technologies Inc. ATI MOBILITY RADEON 9XXX x86/SSE2
ATI Technologies Inc. ATI MOBILITY RADEON 9XXX x86/SSE2
+ATI Technologies Inc. ATI MOBILITY RADEON HD 2300
ATI Technologies Inc. ATI MOBILITY RADEON HD 3450
+ATI Technologies Inc. ATI MOBILITY RADEON HD 3650
ATI Technologies Inc. ATI MOBILITY RADEON X1600
+ATI Technologies Inc. ATI MOBILITY RADEON X1600
+ATI Technologies Inc. ATI MOBILITY RADEON X2300
ATI Technologies Inc. ATI MOBILITY RADEON X2300
ATI Technologies Inc. ATI MOBILITY RADEON X2300 HD x86/SSE2
ATI Technologies Inc. ATI MOBILITY RADEON X2300 x86/MMX/3DNow!/SSE2
+ATI Technologies Inc. ATI MOBILITY RADEON X2300 x86/MMX/3DNow!/SSE2
ATI Technologies Inc. ATI MOBILITY RADEON X2300 x86/SSE2
ATI Technologies Inc. ATI MOBILITY RADEON X300
+ATI Technologies Inc. ATI MOBILITY RADEON X300
ATI Technologies Inc. ATI MOBILITY RADEON X600
+ATI Technologies Inc. ATI MOBILITY RADEON X700
+ATI Technologies Inc. ATI MOBILITY RADEON XPRESS 200
ATI Technologies Inc. ATI MOBILITY RADEON XPRESS 200
ATI Technologies Inc. ATI Mobility FireGL V5700
+ATI Technologies Inc. ATI Mobility FireGL V5700
ATI Technologies Inc. ATI Mobility Radeon 4100
+ATI Technologies Inc. ATI Mobility Radeon 4100
+ATI Technologies Inc. ATI Mobility Radeon Graphics
ATI Technologies Inc. ATI Mobility Radeon Graphics
ATI Technologies Inc. ATI Mobility Radeon HD 2300
+ATI Technologies Inc. ATI Mobility Radeon HD 2300
+ATI Technologies Inc. ATI Mobility Radeon HD 2400
ATI Technologies Inc. ATI Mobility Radeon HD 2400
ATI Technologies Inc. ATI Mobility Radeon HD 2400 XT
+ATI Technologies Inc. ATI Mobility Radeon HD 2400 XT
+ATI Technologies Inc. ATI Mobility Radeon HD 2600
ATI Technologies Inc. ATI Mobility Radeon HD 2600
ATI Technologies Inc. ATI Mobility Radeon HD 2600 XT
ATI Technologies Inc. ATI Mobility Radeon HD 2700
+ATI Technologies Inc. ATI Mobility Radeon HD 2700
+ATI Technologies Inc. ATI Mobility Radeon HD 3400 Series
ATI Technologies Inc. ATI Mobility Radeon HD 3400 Series
+ATI Technologies Inc. ATI Mobility Radeon HD 3410
ATI Technologies Inc. ATI Mobility Radeon HD 3430
+ATI Technologies Inc. ATI Mobility Radeon HD 3430
+ATI Technologies Inc. ATI Mobility Radeon HD 3450
ATI Technologies Inc. ATI Mobility Radeon HD 3450
ATI Technologies Inc. ATI Mobility Radeon HD 3470
+ATI Technologies Inc. ATI Mobility Radeon HD 3470
ATI Technologies Inc. ATI Mobility Radeon HD 3470 Hybrid X2
ATI Technologies Inc. ATI Mobility Radeon HD 3650
+ATI Technologies Inc. ATI Mobility Radeon HD 3650
+ATI Technologies Inc. ATI Mobility Radeon HD 3670
+ATI Technologies Inc. ATI Mobility Radeon HD 4200
ATI Technologies Inc. ATI Mobility Radeon HD 4200
ATI Technologies Inc. ATI Mobility Radeon HD 4200 Series
+ATI Technologies Inc. ATI Mobility Radeon HD 4200 Series
ATI Technologies Inc. ATI Mobility Radeon HD 4225
ATI Technologies Inc. ATI Mobility Radeon HD 4225 Series
+ATI Technologies Inc. ATI Mobility Radeon HD 4225 Series
+ATI Technologies Inc. ATI Mobility Radeon HD 4250
ATI Technologies Inc. ATI Mobility Radeon HD 4250
ATI Technologies Inc. ATI Mobility Radeon HD 4250 Graphics
+ATI Technologies Inc. ATI Mobility Radeon HD 4250 Graphics
+ATI Technologies Inc. ATI Mobility Radeon HD 4250 Series
ATI Technologies Inc. ATI Mobility Radeon HD 4270
ATI Technologies Inc. ATI Mobility Radeon HD 4300 Series
+ATI Technologies Inc. ATI Mobility Radeon HD 4300 Series
+ATI Technologies Inc. ATI Mobility Radeon HD 4300/4500 Series
ATI Technologies Inc. ATI Mobility Radeon HD 4300/4500 Series
ATI Technologies Inc. ATI Mobility Radeon HD 4330
+ATI Technologies Inc. ATI Mobility Radeon HD 4330
ATI Technologies Inc. ATI Mobility Radeon HD 4330 Series
ATI Technologies Inc. ATI Mobility Radeon HD 4350
ATI Technologies Inc. ATI Mobility Radeon HD 4350 Series
+ATI Technologies Inc. ATI Mobility Radeon HD 4350 Series
+ATI Technologies Inc. ATI Mobility Radeon HD 4500 Series
ATI Technologies Inc. ATI Mobility Radeon HD 4500 Series
ATI Technologies Inc. ATI Mobility Radeon HD 4500/5100 Series
+ATI Technologies Inc. ATI Mobility Radeon HD 4500/5100 Series
+ATI Technologies Inc. ATI Mobility Radeon HD 4530
ATI Technologies Inc. ATI Mobility Radeon HD 4530
ATI Technologies Inc. ATI Mobility Radeon HD 4530 Series
+ATI Technologies Inc. ATI Mobility Radeon HD 4530 Series
+ATI Technologies Inc. ATI Mobility Radeon HD 4550
ATI Technologies Inc. ATI Mobility Radeon HD 4550
ATI Technologies Inc. ATI Mobility Radeon HD 4570
+ATI Technologies Inc. ATI Mobility Radeon HD 4570
ATI Technologies Inc. ATI Mobility Radeon HD 4600 Series
+ATI Technologies Inc. ATI Mobility Radeon HD 4600 Series
+ATI Technologies Inc. ATI Mobility Radeon HD 4650
ATI Technologies Inc. ATI Mobility Radeon HD 4650
ATI Technologies Inc. ATI Mobility Radeon HD 4650 Series
+ATI Technologies Inc. ATI Mobility Radeon HD 4650 Series
+ATI Technologies Inc. ATI Mobility Radeon HD 4670
ATI Technologies Inc. ATI Mobility Radeon HD 4670
ATI Technologies Inc. ATI Mobility Radeon HD 4830 Series
ATI Technologies Inc. ATI Mobility Radeon HD 4850
ATI Technologies Inc. ATI Mobility Radeon HD 4870
+ATI Technologies Inc. ATI Mobility Radeon HD 4870
+ATI Technologies Inc. ATI Mobility Radeon HD 5000
ATI Technologies Inc. ATI Mobility Radeon HD 5000
ATI Technologies Inc. ATI Mobility Radeon HD 5000 Series
+ATI Technologies Inc. ATI Mobility Radeon HD 5000 Series
+ATI Technologies Inc. ATI Mobility Radeon HD 5145
ATI Technologies Inc. ATI Mobility Radeon HD 5145
ATI Technologies Inc. ATI Mobility Radeon HD 5165
+ATI Technologies Inc. ATI Mobility Radeon HD 5165
+ATI Technologies Inc. ATI Mobility Radeon HD 530v
ATI Technologies Inc. ATI Mobility Radeon HD 530v
ATI Technologies Inc. ATI Mobility Radeon HD 5400 Series
+ATI Technologies Inc. ATI Mobility Radeon HD 5400 Series
ATI Technologies Inc. ATI Mobility Radeon HD 540v
ATI Technologies Inc. ATI Mobility Radeon HD 5430
+ATI Technologies Inc. ATI Mobility Radeon HD 5430
+ATI Technologies Inc. ATI Mobility Radeon HD 5450
ATI Technologies Inc. ATI Mobility Radeon HD 5450
ATI Technologies Inc. ATI Mobility Radeon HD 5450 Series
+ATI Technologies Inc. ATI Mobility Radeon HD 5450 Series
ATI Technologies Inc. ATI Mobility Radeon HD 545v
+ATI Technologies Inc. ATI Mobility Radeon HD 545v
+ATI Technologies Inc. ATI Mobility Radeon HD 5470
ATI Technologies Inc. ATI Mobility Radeon HD 5470
ATI Technologies Inc. ATI Mobility Radeon HD 550v
+ATI Technologies Inc. ATI Mobility Radeon HD 550v
+ATI Technologies Inc. ATI Mobility Radeon HD 5600/5700 Series
ATI Technologies Inc. ATI Mobility Radeon HD 5600/5700 Series
ATI Technologies Inc. ATI Mobility Radeon HD 560v
ATI Technologies Inc. ATI Mobility Radeon HD 5650
+ATI Technologies Inc. ATI Mobility Radeon HD 5650
ATI Technologies Inc. ATI Mobility Radeon HD 5700 Series
+ATI Technologies Inc. ATI Mobility Radeon HD 5700 Series
+ATI Technologies Inc. ATI Mobility Radeon HD 5730
ATI Technologies Inc. ATI Mobility Radeon HD 5730
ATI Technologies Inc. ATI Mobility Radeon HD 5800 Series
+ATI Technologies Inc. ATI Mobility Radeon HD 5800 Series
+ATI Technologies Inc. ATI Mobility Radeon HD 5830 Series
ATI Technologies Inc. ATI Mobility Radeon HD 5850
+ATI Technologies Inc. ATI Mobility Radeon HD 5850
+ATI Technologies Inc. ATI Mobility Radeon HD 5870
ATI Technologies Inc. ATI Mobility Radeon HD 5870
ATI Technologies Inc. ATI Mobility Radeon HD 6300 series
+ATI Technologies Inc. ATI Mobility Radeon HD 6300 series
+ATI Technologies Inc. ATI Mobility Radeon HD 6370
ATI Technologies Inc. ATI Mobility Radeon HD 6370
ATI Technologies Inc. ATI Mobility Radeon HD 6470M
ATI Technologies Inc. ATI Mobility Radeon HD 6550
+ATI Technologies Inc. ATI Mobility Radeon HD 6550
+ATI Technologies Inc. ATI Mobility Radeon HD 6570
ATI Technologies Inc. ATI Mobility Radeon HD 6570
ATI Technologies Inc. ATI Mobility Radeon X1300
+ATI Technologies Inc. ATI Mobility Radeon X1300
ATI Technologies Inc. ATI Mobility Radeon X1300 x86/MMX/3DNow!/SSE2
ATI Technologies Inc. ATI Mobility Radeon X1300 x86/SSE2
+ATI Technologies Inc. ATI Mobility Radeon X1300 x86/SSE2
ATI Technologies Inc. ATI Mobility Radeon X1350
ATI Technologies Inc. ATI Mobility Radeon X1350 x86/SSE2
ATI Technologies Inc. ATI Mobility Radeon X1400
+ATI Technologies Inc. ATI Mobility Radeon X1400
+ATI Technologies Inc. ATI Mobility Radeon X1400 x86/SSE2
ATI Technologies Inc. ATI Mobility Radeon X1400 x86/SSE2
ATI Technologies Inc. ATI Mobility Radeon X1600
+ATI Technologies Inc. ATI Mobility Radeon X1600
+ATI Technologies Inc. ATI Mobility Radeon X1600 x86/SSE2
ATI Technologies Inc. ATI Mobility Radeon X1600 x86/SSE2
ATI Technologies Inc. ATI Mobility Radeon X1700 x86/SSE2
ATI Technologies Inc. ATI Mobility Radeon X2300
+ATI Technologies Inc. ATI Mobility Radeon X2300
ATI Technologies Inc. ATI Mobility Radeon X2300 (Omega 3.8.442)
ATI Technologies Inc. ATI Mobility Radeon X2300 x86
+ATI Technologies Inc. ATI Mobility Radeon X2300 x86
ATI Technologies Inc. ATI Mobility Radeon X2300 x86/MMX/3DNow!/SSE2
+ATI Technologies Inc. ATI Mobility Radeon X2300 x86/MMX/3DNow!/SSE2
+ATI Technologies Inc. ATI Mobility Radeon X2300 x86/SSE2
ATI Technologies Inc. ATI Mobility Radeon X2300 x86/SSE2
ATI Technologies Inc. ATI Mobility Radeon X2500
+ATI Technologies Inc. ATI Mobility Radeon X2500
ATI Technologies Inc. ATI Mobility Radeon X2500 x86/SSE2
ATI Technologies Inc. ATI Mobility Radeon. HD 530v
+ATI Technologies Inc. ATI Mobility Radeon. HD 530v
+ATI Technologies Inc. ATI Mobility Radeon. HD 5470
ATI Technologies Inc. ATI Mobility Radeon. HD 5470
ATI Technologies Inc. ATI RADEON HD 3200 T25XX by CAMILO
ATI Technologies Inc. ATI RADEON XPRESS 1100
+ATI Technologies Inc. ATI RADEON XPRESS 1100 x86/SSE2
+ATI Technologies Inc. ATI RADEON XPRESS 200 Series
ATI Technologies Inc. ATI RADEON XPRESS 200 Series
ATI Technologies Inc. ATI RADEON XPRESS 200 Series x86/SSE2
ATI Technologies Inc. ATI RADEON XPRESS 200M SERIES
ATI Technologies Inc. ATI Radeon
ATI Technologies Inc. ATI Radeon 2100
+ATI Technologies Inc. ATI Radeon 2100
ATI Technologies Inc. ATI Radeon 2100 (Microsoft - WDDM)
ATI Technologies Inc. ATI Radeon 2100 Graphics
ATI Technologies Inc. ATI Radeon 3000
+ATI Technologies Inc. ATI Radeon 3000
ATI Technologies Inc. ATI Radeon 3000 Graphics
+ATI Technologies Inc. ATI Radeon 3000 Graphics
+ATI Technologies Inc. ATI Radeon 3100 Graphics
ATI Technologies Inc. ATI Radeon 3100 Graphics
ATI Technologies Inc. ATI Radeon 5xxx series
ATI Technologies Inc. ATI Radeon 9550 / X1050 Series
@@ -347,143 +525,239 @@ ATI Technologies Inc. ATI Radeon 9600 / X1050 Series
ATI Technologies Inc. ATI Radeon 9600/9550/X1050 Series
ATI Technologies Inc. ATI Radeon BA Prototype OpenGL Engine
ATI Technologies Inc. ATI Radeon BB Prototype OpenGL Engine
+ATI Technologies Inc. ATI Radeon Broadway XT Prototype OpenGL Engine
ATI Technologies Inc. ATI Radeon Cedar PRO Prototype OpenGL Engine
ATI Technologies Inc. ATI Radeon Cypress PRO Prototype OpenGL Engine
ATI Technologies Inc. ATI Radeon Graphics Processor
+ATI Technologies Inc. ATI Radeon Graphics Processor
ATI Technologies Inc. ATI Radeon HD 2200 Graphics
ATI Technologies Inc. ATI Radeon HD 2350
ATI Technologies Inc. ATI Radeon HD 2400
+ATI Technologies Inc. ATI Radeon HD 2400
+ATI Technologies Inc. ATI Radeon HD 2400 OpenGL Engine
ATI Technologies Inc. ATI Radeon HD 2400 OpenGL Engine
ATI Technologies Inc. ATI Radeon HD 2400 PRO
ATI Technologies Inc. ATI Radeon HD 2400 PRO AGP
ATI Technologies Inc. ATI Radeon HD 2400 Pro
+ATI Technologies Inc. ATI Radeon HD 2400 Pro
ATI Technologies Inc. ATI Radeon HD 2400 Series
+ATI Technologies Inc. ATI Radeon HD 2400 Series
+ATI Technologies Inc. ATI Radeon HD 2400 XT
ATI Technologies Inc. ATI Radeon HD 2400 XT
ATI Technologies Inc. ATI Radeon HD 2400 XT OpenGL Engine
+ATI Technologies Inc. ATI Radeon HD 2400 XT OpenGL Engine
ATI Technologies Inc. ATI Radeon HD 2600 OpenGL Engine
ATI Technologies Inc. ATI Radeon HD 2600 PRO
ATI Technologies Inc. ATI Radeon HD 2600 PRO OpenGL Engine
+ATI Technologies Inc. ATI Radeon HD 2600 PRO OpenGL Engine
+ATI Technologies Inc. ATI Radeon HD 2600 Pro
ATI Technologies Inc. ATI Radeon HD 2600 Pro
ATI Technologies Inc. ATI Radeon HD 2600 Series
ATI Technologies Inc. ATI Radeon HD 2600 XT
+ATI Technologies Inc. ATI Radeon HD 2600 XT
ATI Technologies Inc. ATI Radeon HD 2900 GT
ATI Technologies Inc. ATI Radeon HD 2900 XT
ATI Technologies Inc. ATI Radeon HD 3200 Graphics
+ATI Technologies Inc. ATI Radeon HD 3200 Graphics
ATI Technologies Inc. ATI Radeon HD 3300 Graphics
ATI Technologies Inc. ATI Radeon HD 3400 Series
+ATI Technologies Inc. ATI Radeon HD 3400 Series
ATI Technologies Inc. ATI Radeon HD 3450
+ATI Technologies Inc. ATI Radeon HD 3450
+ATI Technologies Inc. ATI Radeon HD 3450 - Dell Optiplex
ATI Technologies Inc. ATI Radeon HD 3450 - Dell Optiplex
ATI Technologies Inc. ATI Radeon HD 3470
ATI Technologies Inc. ATI Radeon HD 3470 - Dell Optiplex
ATI Technologies Inc. ATI Radeon HD 3550
+ATI Technologies Inc. ATI Radeon HD 3550
ATI Technologies Inc. ATI Radeon HD 3600 Series
+ATI Technologies Inc. ATI Radeon HD 3600 Series
+ATI Technologies Inc. ATI Radeon HD 3650
ATI Technologies Inc. ATI Radeon HD 3650
ATI Technologies Inc. ATI Radeon HD 3650 AGP
ATI Technologies Inc. ATI Radeon HD 3730
ATI Technologies Inc. ATI Radeon HD 3800 Series
+ATI Technologies Inc. ATI Radeon HD 3800 Series
+ATI Technologies Inc. ATI Radeon HD 3850
ATI Technologies Inc. ATI Radeon HD 3850
ATI Technologies Inc. ATI Radeon HD 3850 AGP
ATI Technologies Inc. ATI Radeon HD 3870
+ATI Technologies Inc. ATI Radeon HD 3870
ATI Technologies Inc. ATI Radeon HD 3870 X2
ATI Technologies Inc. ATI Radeon HD 4200
+ATI Technologies Inc. ATI Radeon HD 4200
+ATI Technologies Inc. ATI Radeon HD 4250
ATI Technologies Inc. ATI Radeon HD 4250
ATI Technologies Inc. ATI Radeon HD 4250 Graphics
+ATI Technologies Inc. ATI Radeon HD 4250 Graphics
+ATI Technologies Inc. ATI Radeon HD 4270
ATI Technologies Inc. ATI Radeon HD 4270
ATI Technologies Inc. ATI Radeon HD 4290
+ATI Technologies Inc. ATI Radeon HD 4290
+ATI Technologies Inc. ATI Radeon HD 4290 (Engineering Sample)
ATI Technologies Inc. ATI Radeon HD 4300 Series
+ATI Technologies Inc. ATI Radeon HD 4300 Series
+ATI Technologies Inc. ATI Radeon HD 4300/4500 Series
ATI Technologies Inc. ATI Radeon HD 4300/4500 Series
ATI Technologies Inc. ATI Radeon HD 4350
+ATI Technologies Inc. ATI Radeon HD 4350
ATI Technologies Inc. ATI Radeon HD 4350 (Microsoft WDDM 1.1)
ATI Technologies Inc. ATI Radeon HD 4450
+ATI Technologies Inc. ATI Radeon HD 4450
ATI Technologies Inc. ATI Radeon HD 4500 Series
ATI Technologies Inc. ATI Radeon HD 4550
+ATI Technologies Inc. ATI Radeon HD 4550
ATI Technologies Inc. ATI Radeon HD 4600 Series
+ATI Technologies Inc. ATI Radeon HD 4600 Series
+ATI Technologies Inc. ATI Radeon HD 4650
ATI Technologies Inc. ATI Radeon HD 4650
ATI Technologies Inc. ATI Radeon HD 4670
+ATI Technologies Inc. ATI Radeon HD 4670
ATI Technologies Inc. ATI Radeon HD 4670 OpenGL Engine
+ATI Technologies Inc. ATI Radeon HD 4670 OpenGL Engine
+ATI Technologies Inc. ATI Radeon HD 4700 Series
ATI Technologies Inc. ATI Radeon HD 4700 Series
ATI Technologies Inc. ATI Radeon HD 4720
+ATI Technologies Inc. ATI Radeon HD 4720
ATI Technologies Inc. ATI Radeon HD 4730
+ATI Technologies Inc. ATI Radeon HD 4730
+ATI Technologies Inc. ATI Radeon HD 4730 Series
ATI Technologies Inc. ATI Radeon HD 4730 Series
ATI Technologies Inc. ATI Radeon HD 4750
ATI Technologies Inc. ATI Radeon HD 4770
+ATI Technologies Inc. ATI Radeon HD 4770
+ATI Technologies Inc. ATI Radeon HD 4800 Series
ATI Technologies Inc. ATI Radeon HD 4800 Series
ATI Technologies Inc. ATI Radeon HD 4850
+ATI Technologies Inc. ATI Radeon HD 4850
+ATI Technologies Inc. ATI Radeon HD 4850 OpenGL Engine
ATI Technologies Inc. ATI Radeon HD 4850 OpenGL Engine
ATI Technologies Inc. ATI Radeon HD 4850 Series
ATI Technologies Inc. ATI Radeon HD 4870
+ATI Technologies Inc. ATI Radeon HD 4870
ATI Technologies Inc. ATI Radeon HD 4870 OpenGL Engine
ATI Technologies Inc. ATI Radeon HD 4870 X2
+ATI Technologies Inc. ATI Radeon HD 4870 X2
ATI Technologies Inc. ATI Radeon HD 5400 Series
+ATI Technologies Inc. ATI Radeon HD 5400 Series
+ATI Technologies Inc. ATI Radeon HD 5450
ATI Technologies Inc. ATI Radeon HD 5450
+ATI Technologies Inc. ATI Radeon HD 5470
+ATI Technologies Inc. ATI Radeon HD 5500 Series
ATI Technologies Inc. ATI Radeon HD 5500 Series
ATI Technologies Inc. ATI Radeon HD 5570
+ATI Technologies Inc. ATI Radeon HD 5570
+ATI Technologies Inc. ATI Radeon HD 5600 Series
ATI Technologies Inc. ATI Radeon HD 5600 Series
+ATI Technologies Inc. ATI Radeon HD 5600/5700
ATI Technologies Inc. ATI Radeon HD 5630
ATI Technologies Inc. ATI Radeon HD 5670
+ATI Technologies Inc. ATI Radeon HD 5670
+ATI Technologies Inc. ATI Radeon HD 5670 OpenGL Engine
ATI Technologies Inc. ATI Radeon HD 5670 OpenGL Engine
ATI Technologies Inc. ATI Radeon HD 5700 Series
+ATI Technologies Inc. ATI Radeon HD 5700 Series
ATI Technologies Inc. ATI Radeon HD 5750
+ATI Technologies Inc. ATI Radeon HD 5750
+ATI Technologies Inc. ATI Radeon HD 5750 OpenGL Engine
ATI Technologies Inc. ATI Radeon HD 5750 OpenGL Engine
ATI Technologies Inc. ATI Radeon HD 5770
+ATI Technologies Inc. ATI Radeon HD 5770
ATI Technologies Inc. ATI Radeon HD 5770 OpenGL Engine
+ATI Technologies Inc. ATI Radeon HD 5770 OpenGL Engine
+ATI Technologies Inc. ATI Radeon HD 5800 Series
ATI Technologies Inc. ATI Radeon HD 5800 Series
ATI Technologies Inc. ATI Radeon HD 5850
+ATI Technologies Inc. ATI Radeon HD 5850
ATI Technologies Inc. ATI Radeon HD 5870
ATI Technologies Inc. ATI Radeon HD 5870 OpenGL Engine
+ATI Technologies Inc. ATI Radeon HD 5870 OpenGL Engine
+ATI Technologies Inc. ATI Radeon HD 5900 Series
ATI Technologies Inc. ATI Radeon HD 5900 Series
ATI Technologies Inc. ATI Radeon HD 5970
ATI Technologies Inc. ATI Radeon HD 6230
+ATI Technologies Inc. ATI Radeon HD 6230
+ATI Technologies Inc. ATI Radeon HD 6250
ATI Technologies Inc. ATI Radeon HD 6250
ATI Technologies Inc. ATI Radeon HD 6350
ATI Technologies Inc. ATI Radeon HD 6390
ATI Technologies Inc. ATI Radeon HD 6490M OpenGL Engine
+ATI Technologies Inc. ATI Radeon HD 6490M OpenGL Engine
ATI Technologies Inc. ATI Radeon HD 6510
+ATI Technologies Inc. ATI Radeon HD 6510
+ATI Technologies Inc. ATI Radeon HD 6570M
ATI Technologies Inc. ATI Radeon HD 6570M
+ATI Technologies Inc. ATI Radeon HD 6630M OpenGL Engine
ATI Technologies Inc. ATI Radeon HD 6750
ATI Technologies Inc. ATI Radeon HD 6750M OpenGL Engine
+ATI Technologies Inc. ATI Radeon HD 6750M OpenGL Engine
ATI Technologies Inc. ATI Radeon HD 6770
+ATI Technologies Inc. ATI Radeon HD 6770
+ATI Technologies Inc. ATI Radeon HD 6770M OpenGL Engine
ATI Technologies Inc. ATI Radeon HD 6770M OpenGL Engine
ATI Technologies Inc. ATI Radeon HD 6800 Series
ATI Technologies Inc. ATI Radeon HD 6970M OpenGL Engine
+ATI Technologies Inc. ATI Radeon HD 6970M OpenGL Engine
ATI Technologies Inc. ATI Radeon HD3750
ATI Technologies Inc. ATI Radeon HD4300/HD4500 series
+ATI Technologies Inc. ATI Radeon HD4300/HD4500 series
+ATI Technologies Inc. ATI Radeon HD4670
ATI Technologies Inc. ATI Radeon HD4670
ATI Technologies Inc. ATI Radeon Juniper LE Prototype OpenGL Engine
ATI Technologies Inc. ATI Radeon RV710 Prototype OpenGL Engine
ATI Technologies Inc. ATI Radeon RV730 Prototype OpenGL Engine
ATI Technologies Inc. ATI Radeon RV770 Prototype OpenGL Engine
ATI Technologies Inc. ATI Radeon RV790 Prototype OpenGL Engine
+ATI Technologies Inc. ATI Radeon RV790 Prototype OpenGL Engine
ATI Technologies Inc. ATI Radeon Redwood PRO Prototype OpenGL Engine
ATI Technologies Inc. ATI Radeon Redwood XT Prototype OpenGL Engine
ATI Technologies Inc. ATI Radeon Whistler PRO/LP Prototype OpenGL Engine
ATI Technologies Inc. ATI Radeon X1050
ATI Technologies Inc. ATI Radeon X1050 Series
ATI Technologies Inc. ATI Radeon X1200
+ATI Technologies Inc. ATI Radeon X1200
+ATI Technologies Inc. ATI Radeon X1200 Series
ATI Technologies Inc. ATI Radeon X1200 Series
ATI Technologies Inc. ATI Radeon X1200 Series x86/MMX/3DNow!/SSE2
+ATI Technologies Inc. ATI Radeon X1200 Series x86/MMX/3DNow!/SSE2
+ATI Technologies Inc. ATI Radeon X1250
ATI Technologies Inc. ATI Radeon X1250
ATI Technologies Inc. ATI Radeon X1250 x86/MMX/3DNow!/SSE2
ATI Technologies Inc. ATI Radeon X1270
+ATI Technologies Inc. ATI Radeon X1270
+ATI Technologies Inc. ATI Radeon X1270 x86/MMX/3DNow!/SSE2
ATI Technologies Inc. ATI Radeon X1270 x86/MMX/3DNow!/SSE2
ATI Technologies Inc. ATI Radeon X1300/X1550 Series
ATI Technologies Inc. ATI Radeon X1550 Series
+ATI Technologies Inc. ATI Radeon X1550 Series
+ATI Technologies Inc. ATI Radeon X1600 OpenGL Engine
ATI Technologies Inc. ATI Radeon X1600 OpenGL Engine
ATI Technologies Inc. ATI Radeon X1900 OpenGL Engine
+ATI Technologies Inc. ATI Radeon X1900 OpenGL Engine
ATI Technologies Inc. ATI Radeon X1950 GT
ATI Technologies Inc. ATI Radeon X300/X550/X1050 Series
+ATI Technologies Inc. ATI Radeon X300/X550/X1050 Series
ATI Technologies Inc. ATI Radeon Xpress 1100
ATI Technologies Inc. ATI Radeon Xpress 1150
+ATI Technologies Inc. ATI Radeon Xpress 1150
ATI Technologies Inc. ATI Radeon Xpress 1150 x86/MMX/3DNow!/SSE2
ATI Technologies Inc. ATI Radeon Xpress 1200
+ATI Technologies Inc. ATI Radeon Xpress 1200
+ATI Technologies Inc. ATI Radeon Xpress 1200 Series
ATI Technologies Inc. ATI Radeon Xpress 1200 Series
ATI Technologies Inc. ATI Radeon Xpress 1200 Series x86/MMX/3DNow!/SSE2
+ATI Technologies Inc. ATI Radeon Xpress 1200 Series x86/MMX/3DNow!/SSE2
ATI Technologies Inc. ATI Radeon Xpress 1200 x86/MMX/3DNow!/SSE2
ATI Technologies Inc. ATI Radeon Xpress 1250
+ATI Technologies Inc. ATI Radeon Xpress 1250
+ATI Technologies Inc. ATI Radeon Xpress 1250 x86/MMX/3DNow!/SSE2
ATI Technologies Inc. ATI Radeon Xpress 1250 x86/SSE2
ATI Technologies Inc. ATI Radeon Xpress Series
+ATI Technologies Inc. ATI Radeon Xpress Series
+ATI Technologies Inc. ATI Radeon Xpress Series x86/MMX/3DNow!/SSE2
ATI Technologies Inc. ATI Yamaha HD 9000
ATI Technologies Inc. ATi RS880M
+ATI Technologies Inc. ATi RS880M
ATI Technologies Inc. Carte graphique VGA standard
ATI Technologies Inc. Diamond Radeon X1550 Series
ATI Technologies Inc. EG JUNIPER
@@ -491,7 +765,9 @@ ATI Technologies Inc. EG PARK
ATI Technologies Inc. FireGL V3100 Pentium 4 (SSE2)
ATI Technologies Inc. FireMV 2400 PCI DDR x86
ATI Technologies Inc. FireMV 2400 PCI DDR x86/SSE2
+ATI Technologies Inc. FireMV 2400 PCI DDR x86/SSE2
ATI Technologies Inc. GeCube Radeon X1550
+ATI Technologies Inc. GeForce 9600 GT x86/SSE2
ATI Technologies Inc. Geforce 9500 GT
ATI Technologies Inc. Geforce 9500GT
ATI Technologies Inc. Geforce 9800 GT
@@ -501,98 +777,153 @@ ATI Technologies Inc. HIGHTECH EXCALIBUR X700 PRO
ATI Technologies Inc. M21 x86/MMX/3DNow!/SSE2
ATI Technologies Inc. M76M
ATI Technologies Inc. MOBILITY RADEON 7500 DDR x86/SSE2
+ATI Technologies Inc. MOBILITY RADEON 7500 DDR x86/SSE2
+ATI Technologies Inc. MOBILITY RADEON 9000 DDR x86/SSE2
ATI Technologies Inc. MOBILITY RADEON 9000 DDR x86/SSE2
ATI Technologies Inc. MOBILITY RADEON 9000 IGPRADEON 9100 IGP DDR x86/SSE2
+ATI Technologies Inc. MOBILITY RADEON 9100 IGP DDR x86/SSE2
+ATI Technologies Inc. MOBILITY RADEON 9600 x86/SSE2
ATI Technologies Inc. MOBILITY RADEON 9600 x86/SSE2
ATI Technologies Inc. MOBILITY RADEON 9700 x86/SSE2
ATI Technologies Inc. MOBILITY RADEON X300 x86/SSE2
+ATI Technologies Inc. MOBILITY RADEON X300 x86/SSE2
+ATI Technologies Inc. MOBILITY RADEON X600 x86/SSE2
ATI Technologies Inc. MOBILITY RADEON X600 x86/SSE2
ATI Technologies Inc. MOBILITY RADEON X700 SE x86
ATI Technologies Inc. MOBILITY RADEON X700 x86/SSE2
+ATI Technologies Inc. MOBILITY RADEON X700 x86/SSE2
+ATI Technologies Inc. MOBILITY RADEON Xpress 200 Series SW TCL x86/MMX/3DNow!/SSE2
ATI Technologies Inc. MSI RX9550SE
+ATI Technologies Inc. MSI Radeon X1550 Series
+ATI Technologies Inc. Mobility Radeon HD 6000 series
ATI Technologies Inc. Mobility Radeon X2300 HD
+ATI Technologies Inc. Mobility Radeon X2300 HD
+ATI Technologies Inc. Mobility Radeon X2300 HD x86/SSE2
ATI Technologies Inc. Mobility Radeon X2300 HD x86/SSE2
ATI Technologies Inc. RADEON 7000 DDR x86/MMX/3DNow!/SSE
ATI Technologies Inc. RADEON 7000 DDR x86/SSE2
ATI Technologies Inc. RADEON 7500 DDR x86/MMX/3DNow!/SSE2
+ATI Technologies Inc. RADEON 7500 DDR x86/MMX/3DNow!/SSE2
ATI Technologies Inc. RADEON 7500 DDR x86/SSE2
ATI Technologies Inc. RADEON 9100 IGP DDR x86/SSE2
ATI Technologies Inc. RADEON 9200 DDR x86/MMX/3DNow!/SSE
ATI Technologies Inc. RADEON 9200 DDR x86/SSE2
ATI Technologies Inc. RADEON 9200 PRO DDR x86/MMX/3DNow!/SSE
ATI Technologies Inc. RADEON 9200 Series DDR x86/MMX/3DNow!/SSE
+ATI Technologies Inc. RADEON 9200 Series DDR x86/MMX/3DNow!/SSE
+ATI Technologies Inc. RADEON 9200 Series DDR x86/MMX/3DNow!/SSE2
ATI Technologies Inc. RADEON 9200 Series DDR x86/MMX/3DNow!/SSE2
ATI Technologies Inc. RADEON 9200 Series DDR x86/SSE
+ATI Technologies Inc. RADEON 9200 Series DDR x86/SSE
+ATI Technologies Inc. RADEON 9200 Series DDR x86/SSE2
ATI Technologies Inc. RADEON 9200 Series DDR x86/SSE2
ATI Technologies Inc. RADEON 9200SE DDR x86/MMX/3DNow!/SSE2
ATI Technologies Inc. RADEON 9200SE DDR x86/SSE2
ATI Technologies Inc. RADEON 9250/9200 Series DDR x86/MMX/3DNow!/SSE
+ATI Technologies Inc. RADEON 9250/9200 Series DDR x86/MMX/3DNow!/SSE
ATI Technologies Inc. RADEON 9250/9200 Series DDR x86/MMX/3DNow!/SSE2
ATI Technologies Inc. RADEON 9250/9200 Series DDR x86/SSE2
+ATI Technologies Inc. RADEON 9250/9200 Series DDR x86/SSE2
ATI Technologies Inc. RADEON 9500
ATI Technologies Inc. RADEON 9550 x86/SSE2
ATI Technologies Inc. RADEON 9600 SERIES
ATI Technologies Inc. RADEON 9600 SERIES x86/MMX/3DNow!/SSE2
+ATI Technologies Inc. RADEON 9600 SERIES x86/SSE2
+ATI Technologies Inc. RADEON 9600 TX x86/SSE2
ATI Technologies Inc. RADEON 9600 TX x86/SSE2
ATI Technologies Inc. RADEON 9600 x86/MMX/3DNow!/SSE2
ATI Technologies Inc. RADEON 9600 x86/SSE2
+ATI Technologies Inc. RADEON 9600 x86/SSE2
ATI Technologies Inc. RADEON 9700 PRO x86/MMX/3DNow!/SSE
ATI Technologies Inc. RADEON 9800 PRO
ATI Technologies Inc. RADEON 9800 x86/SSE2
ATI Technologies Inc. RADEON IGP 340M DDR x86/SSE2
+ATI Technologies Inc. RADEON IGP 340M DDR x86/SSE2
ATI Technologies Inc. RADEON X300 Series x86/SSE2
ATI Technologies Inc. RADEON X300 x86/SSE2
+ATI Technologies Inc. RADEON X300 x86/SSE2
+ATI Technologies Inc. RADEON X300/X550 Series x86/SSE2
ATI Technologies Inc. RADEON X300/X550 Series x86/SSE2
ATI Technologies Inc. RADEON X550 x86/MMX/3DNow!/SSE2
ATI Technologies Inc. RADEON X550 x86/SSE2
ATI Technologies Inc. RADEON X600 Series
ATI Technologies Inc. RADEON X600 x86/SSE2
+ATI Technologies Inc. RADEON X600 x86/SSE2
+ATI Technologies Inc. RADEON X600/X550 Series
ATI Technologies Inc. RADEON X700 PRO x86/SSE2
ATI Technologies Inc. RADEON X800 SE x86/MMX/3DNow!/SSE2
+ATI Technologies Inc. RADEON X800 XT
ATI Technologies Inc. RADEON X800GT
ATI Technologies Inc. RADEON XPRESS 200 Series SW TCL x86/MMX/3DNow!/SSE2
+ATI Technologies Inc. RADEON XPRESS 200 Series SW TCL x86/MMX/3DNow!/SSE2
+ATI Technologies Inc. RADEON XPRESS 200 Series SW TCL x86/SSE2
ATI Technologies Inc. RADEON XPRESS 200 Series SW TCL x86/SSE2
ATI Technologies Inc. RADEON XPRESS 200 Series x86/SSE2
ATI Technologies Inc. RADEON XPRESS 200M Series SW TCL x86/MMX/3DNow!/SSE2
+ATI Technologies Inc. RADEON XPRESS 200M Series SW TCL x86/MMX/3DNow!/SSE2
ATI Technologies Inc. RADEON XPRESS 200M Series SW TCL x86/SSE2
+ATI Technologies Inc. RADEON XPRESS 200M Series SW TCL x86/SSE2
+ATI Technologies Inc. RADEON XPRESS 200M Series x86/MMX/3DNow!/SSE2
ATI Technologies Inc. RADEON XPRESS 200M Series x86/MMX/3DNow!/SSE2
ATI Technologies Inc. RADEON XPRESS 200M Series x86/SSE2
ATI Technologies Inc. RADEON XPRESS Series x86/MMX/3DNow!/SSE2
+ATI Technologies Inc. RADEON XPRESS Series x86/MMX/3DNow!/SSE2
+ATI Technologies Inc. RADEON XPRESS Series x86/SSE2
ATI Technologies Inc. RADEON XPRESS Series x86/SSE2
ATI Technologies Inc. RS740
ATI Technologies Inc. RS780C
ATI Technologies Inc. RS780M
+ATI Technologies Inc. RS780M
+ATI Technologies Inc. RS880
ATI Technologies Inc. RS880
ATI Technologies Inc. RV410 Pro x86/SSE2
ATI Technologies Inc. RV790
+ATI Technologies Inc. RV790
+ATI Technologies Inc. Radeon (TM) HD 6470M
ATI Technologies Inc. Radeon (TM) HD 6470M
ATI Technologies Inc. Radeon (TM) HD 6490M
+ATI Technologies Inc. Radeon (TM) HD 6490M
+ATI Technologies Inc. Radeon (TM) HD 6750M
ATI Technologies Inc. Radeon (TM) HD 6770M
+ATI Technologies Inc. Radeon (TM) HD 6770M
+ATI Technologies Inc. Radeon (TM) HD 6850M
+ATI Technologies Inc. Radeon 7000 DDR x86/SSE
ATI Technologies Inc. Radeon 7000 DDR x86/SSE2
ATI Technologies Inc. Radeon 7000 SDR x86/SSE2
ATI Technologies Inc. Radeon 7500 DDR x86/SSE2
+ATI Technologies Inc. Radeon 7500 DDR x86/SSE2
ATI Technologies Inc. Radeon 9000 DDR x86/SSE2
ATI Technologies Inc. Radeon DDR x86/MMX/3DNow!/SSE2
ATI Technologies Inc. Radeon DDR x86/SSE
ATI Technologies Inc. Radeon DDR x86/SSE2
ATI Technologies Inc. Radeon HD 6310
+ATI Technologies Inc. Radeon HD 6310
+ATI Technologies Inc. Radeon HD 6470M
+ATI Technologies Inc. Radeon HD 6490M
+ATI Technologies Inc. Radeon HD 6800 Series
ATI Technologies Inc. Radeon HD 6800 Series
ATI Technologies Inc. Radeon SDR x86/SSE2
+ATI Technologies Inc. Radeon SDR x86/SSE2
ATI Technologies Inc. Radeon X1300 Series
ATI Technologies Inc. Radeon X1300 Series x86/MMX/3DNow!/SSE2
ATI Technologies Inc. Radeon X1300 Series x86/SSE2
ATI Technologies Inc. Radeon X1300/X1550 Series
+ATI Technologies Inc. Radeon X1300/X1550 Series
ATI Technologies Inc. Radeon X1300/X1550 Series x86/SSE2
ATI Technologies Inc. Radeon X1550 64-bit (Microsoft - WDDM)
ATI Technologies Inc. Radeon X1550 Series
ATI Technologies Inc. Radeon X1550 Series x86/SSE2
ATI Technologies Inc. Radeon X1600
ATI Technologies Inc. Radeon X1600 Pro / X1300XT x86/MMX/3DNow!/SSE2
+ATI Technologies Inc. Radeon X1600 Series
ATI Technologies Inc. Radeon X1600 Series x86/SSE2
+ATI Technologies Inc. Radeon X1600/1650 Series
ATI Technologies Inc. Radeon X1600/X1650 Series
ATI Technologies Inc. Radeon X1650 Series
+ATI Technologies Inc. Radeon X1650 Series
ATI Technologies Inc. Radeon X1650 Series x86/MMX/3DNow!/SSE2
ATI Technologies Inc. Radeon X1650 Series x86/SSE2
+ATI Technologies Inc. Radeon X1650 Series x86/SSE2
ATI Technologies Inc. Radeon X1900 Series x86/MMX/3DNow!/SSE2
ATI Technologies Inc. Radeon X1950 Pro
ATI Technologies Inc. Radeon X1950 Pro x86/MMX/3DNow!/SSE2
@@ -602,18 +933,24 @@ ATI Technologies Inc. Radeon X300/X550/X1050 Series
ATI Technologies Inc. Radeon X550/X700 Series
ATI Technologies Inc. Radeon X550XTX x86/MMX/3DNow!/SSE2
ATI Technologies Inc. SAPPHIRE RADEON X300SE
+ATI Technologies Inc. SAPPHIRE RADEON X300SE
ATI Technologies Inc. SAPPHIRE RADEON X300SE x86/MMX/3DNow!/SSE2
ATI Technologies Inc. SAPPHIRE RADEON X300SE x86/SSE2
ATI Technologies Inc. SAPPHIRE Radeon X1550 Series
ATI Technologies Inc. SAPPHIRE Radeon X1550 Series x86/MMX/3DNow!/SSE2
+ATI Technologies Inc. SAPPHIRE Radeon X1550 Series x86/SSE2
+ATI Technologies Inc. SAPPHIRE Radeon X1550 x86/SSE2
+ATI Technologies Inc. Sapphire Radeon HD 3730
ATI Technologies Inc. Sapphire Radeon HD 3730
ATI Technologies Inc. Sapphire Radeon HD 3750
ATI Technologies Inc. Standard VGA Graphics Adapter
+ATI Technologies Inc. Standard VGA Graphics Adapter
ATI Technologies Inc. Tul, RADEON X600 PRO
ATI Technologies Inc. Tul, RADEON X600 PRO x86/SSE2
ATI Technologies Inc. Tul, RADEON X700 PRO
ATI Technologies Inc. Tul, RADEON X700 PRO x86/MMX/3DNow!/SSE2
ATI Technologies Inc. VisionTek Radeon 4350
+ATI Technologies Inc. VisionTek Radeon 4350
ATI Technologies Inc. VisionTek Radeon X1550 Series
ATI Technologies Inc. WRESTLER 9802
ATI Technologies Inc. WRESTLER 9803
@@ -630,6 +967,7 @@ Advanced Micro Devices, Inc. Mesa DRI R600 (RV620 95C5) 20090101 x86/MMX+/3DNow!
Advanced Micro Devices, Inc. Mesa DRI R600 (RV620 95C5) 20090101 x86/MMX/SSE2 TCL DRI2
Advanced Micro Devices, Inc. Mesa DRI R600 (RV635 9596) 20090101 x86/MMX+/3DNow!+/SSE TCL DRI2
Advanced Micro Devices, Inc. Mesa DRI R600 (RV670 9505) 20090101 x86/MMX+/3DNow!+/SSE2 TCL DRI2
+Advanced Micro Devices, Inc. Mesa DRI R600 (RV670 9505) 20090101 x86/MMX/SSE2 TCL DRI2
Advanced Micro Devices, Inc. Mesa DRI R600 (RV710 9552) 20090101 x86/MMX/SSE2 TCL DRI2
Advanced Micro Devices, Inc. Mesa DRI R600 (RV730 9490) 20090101 x86/MMX+/3DNow!+/SSE2 TCL DRI2
Advanced Micro Devices, Inc. Mesa DRI R600 (RV730 9490) 20090101 x86/MMX/SSE2 TCL DRI2
@@ -648,6 +986,7 @@ DRI R300 Project Mesa DRI R300 (RV350 4153) 20090101 AGP 8x x86/MMX+/3DNow!+/SSE
DRI R300 Project Mesa DRI R300 (RV380 3150) 20090101 x86/MMX+/3DNow!+/SSE2 TCL DRI2
DRI R300 Project Mesa DRI R300 (RV380 3150) 20090101 x86/MMX/SSE2 TCL DRI2
DRI R300 Project Mesa DRI R300 (RV380 5B60) 20090101 x86/MMX/SSE2 TCL DRI2
+DRI R300 Project Mesa DRI R300 (RV380 5B60) 20090101 x86/MMX/SSE2 TCL DRI2
DRI R300 Project Mesa DRI R300 (RV380 5B62) 20090101 x86/MMX+/3DNow!+/SSE2 TCL DRI2
DRI R300 Project Mesa DRI R300 (RV515 7145) 20090101 x86/MMX/SSE2 TCL DRI2
DRI R300 Project Mesa DRI R300 (RV515 7146) 20090101 x86/MMX+/3DNow!+/SSE2 TCL DRI2
@@ -657,11 +996,17 @@ DRI R300 Project Mesa DRI R300 (RV515 714A) 20090101 x86/MMX/SSE2 TCL
DRI R300 Project Mesa DRI R300 (RV515 714A) 20090101 x86/MMX/SSE2 TCL DRI2
DRI R300 Project Mesa DRI R300 (RV530 71C4) 20090101 x86/MMX/SSE2 TCL DRI2
GPU_CLASS_UNKNOWN
+Humper 3D-Analyze v2.3 - http://www.tommti-systems.com
Humper Chromium
+Humper Chromium
+Imagination Technologies PowerVR SGX545
Intel
Intel HD Graphics Family
+Intel HD Graphics Family
Intel 3D-Analyze v2.2 - http://www.tommti-systems.com
Intel 3D-Analyze v2.3 - http://www.tommti-systems.com
+Intel 3D-Analyze v2.3 - http://www.tommti-systems.com
+Intel 4 Series Internal Chipset
Intel 4 Series Internal Chipset
Intel 830M
Intel 845G
@@ -674,19 +1019,26 @@ Intel 945GM
Intel 950
Intel 965
Intel B43 Express Chipset
+Intel B43 Express Chipset
Intel Bear Lake
Intel Broadwater
Intel Brookdale
Intel Cantiga
+Intel EMGD on PowerVR SGX535
Intel Eaglelake
Intel Familia Mobile 45 Express Chipset (Microsoft Corporation - WDDM 1.1)
+Intel Familia Mobile 45 Express Chipset (Microsoft Corporation - WDDM 1.1)
Intel G33
Intel G41
Intel G41 Express Chipset
+Intel G41 Express Chipset
Intel G45
Intel G45/G43 Express Chipset
+Intel G45/G43 Express Chipset
+Intel Graphics Media Accelerator HD
Intel Graphics Media Accelerator HD
Intel HD Graphics
+Intel HD Graphics
Intel HD Graphics 100
Intel HD Graphics 200
Intel HD Graphics 200 BR-1101-00SH
@@ -695,6 +1047,7 @@ Intel HD Graphics 200 BR-1101-00SK
Intel HD Graphics 200 BR-1101-01M5
Intel HD Graphics 200 BR-1101-01M6
Intel HD Graphics BR-1004-01Y1
+Intel HD Graphics BR-1004-01Y1
Intel HD Graphics BR-1006-0364
Intel HD Graphics BR-1006-0365
Intel HD Graphics BR-1006-0366
@@ -704,45 +1057,73 @@ Intel HD Graphics BR-1101-04SZ
Intel HD Graphics BR-1101-04T0
Intel HD Graphics BR-1101-04T9
Intel HD Graphics Family
+Intel HD Graphics Family
Intel HD Graphics Family BR-1012-00Y8
Intel HD Graphics Family BR-1012-00YF
Intel HD Graphics Family BR-1012-00ZD
Intel HD Graphics Family BR-1102-00ML
Intel Inc. Intel GMA 900 OpenGL Engine
+Intel Inc. Intel GMA 900 OpenGL Engine
+Intel Inc. Intel GMA 950 OpenGL Engine
Intel Inc. Intel GMA 950 OpenGL Engine
Intel Inc. Intel GMA X3100 OpenGL Engine
+Intel Inc. Intel GMA X3100 OpenGL Engine
+Intel Inc. Intel HD Graphics 3000 OpenGL Engine
Intel Inc. Intel HD Graphics 3000 OpenGL Engine
Intel Inc. Intel HD Graphics OpenGL Engine
+Intel Inc. Intel HD Graphics OpenGL Engine
Intel Inc. Intel HD xxxx OpenGL Engine
Intel Intel 845G
+Intel Intel 845G
+Intel Intel 855GM
Intel Intel 855GM
Intel Intel 865G
+Intel Intel 865G
Intel Intel 915G
+Intel Intel 915G
+Intel Intel 915GM
Intel Intel 915GM
Intel Intel 945G
+Intel Intel 945G
+Intel Intel 945GM
Intel Intel 945GM
Intel Intel 965/963 Graphics Media Accelerator
+Intel Intel 965/963 Graphics Media Accelerator
+Intel Intel Bear Lake B
Intel Intel Bear Lake B
Intel Intel Broadwater G
Intel Intel Brookdale-G
+Intel Intel Brookdale-G
Intel Intel Calistoga
Intel Intel Cantiga
+Intel Intel Cantiga
Intel Intel Eaglelake
+Intel Intel Eaglelake
+Intel Intel Generic Renderer
+Intel Intel Grantsdale-G
Intel Intel Grantsdale-G
Intel Intel HD Graphics 3000
Intel Intel Lakeport
Intel Intel Montara-GM
Intel Intel Pineview Platform
+Intel Intel Pineview Platform
Intel Intel Springdale-G
Intel Mobile - famiglia Express Chipset 45 (Microsoft Corporation - WDDM 1.1)
Intel Mobile 4 Series
Intel Mobile 4 Series Express Chipset Family
+Intel Mobile 4 Series Express Chipset Family
+Intel Mobile 45 Express Chipset Family
+Intel Mobile 45 Express Chipset Family (Microsoft Corporation - WDDM 1.1)
Intel Mobile 45 Express Chipset Family (Microsoft Corporation - WDDM 1.1)
Intel Mobile HD Graphics
+Intel Mobile HD Graphics
+Intel Mobile Intel(R) 4 Series Express Chipset Family
Intel Mobile SandyBridge HD Graphics
Intel Montara
Intel Pineview
Intel Q45/Q43 Express Chipset
+Intel Q45/Q43 Express Chipset
+Intel Royal BNA Driver
Intel Royal BNA Driver
Intel SandyBridge HD Graphics
Intel SandyBridge HD Graphics BR-1006-00V8
@@ -750,14 +1131,18 @@ Intel Springdale
Intel X3100
Intergraph wcgdrv 06.05.06.18
Intergraph wcgdrv 06.06.00.35
+Intergraph wcgdrv 06.06.00.35
LegendgrafiX Mobile 945 Express C/TitaniumGL/GAC/D3D ACCELERATION/6x86/1 THREADs | http://LegendgrafiX.tk
LegendgrafiX NVIDIA GeForce GT 430/TitaniumGL/GAC/D3D ACCELERATION/6x86/1 THREADs | http://LegendgrafiX.tk
Linden Lab Headless
Matrox
Mesa
Mesa Project Software Rasterizer
+Mesa Project Software Rasterizer
+NVIDIA /PCI/SSE2
NVIDIA /PCI/SSE2
NVIDIA /PCI/SSE2/3DNOW!
+NVIDIA /PCI/SSE2/3DNOW!
NVIDIA 205
NVIDIA 210
NVIDIA 310
@@ -766,8 +1151,13 @@ NVIDIA 315
NVIDIA 315M
NVIDIA 320M
NVIDIA C51
+NVIDIA Corporation GeForce GT 230/PCI/SSE2
+NVIDIA Corporation GeForce GTX 285/PCI/SSE2
+NVIDIA D10M2-20/PCI/SSE2
NVIDIA D10M2-20/PCI/SSE2
NVIDIA D10P1-25/PCI/SSE2
+NVIDIA D10P1-25/PCI/SSE2
+NVIDIA D10P1-25/PCI/SSE2/3DNOW!
NVIDIA D10P1-30/PCI/SSE2
NVIDIA D10P2-50/PCI/SSE2
NVIDIA D11M2-30/PCI/SSE2
@@ -775,11 +1165,16 @@ NVIDIA D12-P1-35/PCI/SSE2
NVIDIA D12U-15/PCI/SSE2
NVIDIA D13M1-40/PCI/SSE2
NVIDIA D13P1-40/PCI/SSE2
+NVIDIA D13P1-40/PCI/SSE2
+NVIDIA D13P1-40/PCI/SSE2/3DNOW!
NVIDIA D13U-10/PCI/SSE2
NVIDIA D13U/PCI/SSE2
+NVIDIA D13U/PCI/SSE2
NVIDIA D9M
NVIDIA D9M-20/PCI/SSE2
NVIDIA Entry Graphics/PCI/SSE2
+NVIDIA Entry Graphics/PCI/SSE2
+NVIDIA Entry Graphics/PCI/SSE2/3DNOW!
NVIDIA Entry Graphics/PCI/SSE2/3DNOW!
NVIDIA G 102M
NVIDIA G 103M
@@ -800,7 +1195,10 @@ NVIDIA G92
NVIDIA G92-200/PCI/SSE2
NVIDIA G94
NVIDIA G96/PCI/SSE2
+NVIDIA G96/PCI/SSE2
NVIDIA G98/PCI/SSE2
+NVIDIA G98/PCI/SSE2
+NVIDIA G98/PCI/SSE2/3DNOW!
NVIDIA GT 120
NVIDIA GT 130
NVIDIA GT 130M
@@ -809,6 +1207,8 @@ NVIDIA GT 150
NVIDIA GT 160M
NVIDIA GT 220
NVIDIA GT 220/PCI/SSE2
+NVIDIA GT 220/PCI/SSE2
+NVIDIA GT 220/PCI/SSE2/3DNOW!
NVIDIA GT 220/PCI/SSE2/3DNOW!
NVIDIA GT 230
NVIDIA GT 230M
@@ -859,58 +1259,89 @@ NVIDIA GTX 590
NVIDIA GeForce
NVIDIA GeForce 2
NVIDIA GeForce 205/PCI/SSE2
+NVIDIA GeForce 205/PCI/SSE2
NVIDIA GeForce 210
NVIDIA GeForce 210/PCI/SSE2
+NVIDIA GeForce 210/PCI/SSE2
+NVIDIA GeForce 210/PCI/SSE2/3DNOW!
NVIDIA GeForce 210/PCI/SSE2/3DNOW!
NVIDIA GeForce 3
NVIDIA GeForce 305M/PCI/SSE2
+NVIDIA GeForce 305M/PCI/SSE2
+NVIDIA GeForce 310/PCI/SSE2
NVIDIA GeForce 310/PCI/SSE2
NVIDIA GeForce 310/PCI/SSE2/3DNOW!
+NVIDIA GeForce 310/PCI/SSE2/3DNOW!
+NVIDIA GeForce 310M/PCI/SSE2
NVIDIA GeForce 310M/PCI/SSE2
NVIDIA GeForce 315/PCI/SSE2
+NVIDIA GeForce 315/PCI/SSE2
NVIDIA GeForce 315/PCI/SSE2/3DNOW!
+NVIDIA GeForce 315/PCI/SSE2/3DNOW!
+NVIDIA GeForce 315M/PCI/SSE2
NVIDIA GeForce 315M/PCI/SSE2
NVIDIA GeForce 320M/PCI/SSE2
NVIDIA GeForce 4 Go
NVIDIA GeForce 4 MX
NVIDIA GeForce 4 Ti
NVIDIA GeForce 405/PCI/SSE2
+NVIDIA GeForce 405/PCI/SSE2
+NVIDIA GeForce 410M/PCI/SSE2
NVIDIA GeForce 6100
NVIDIA GeForce 6100 nForce 400/PCI/SSE2/3DNOW!
+NVIDIA GeForce 6100 nForce 400/PCI/SSE2/3DNOW!
NVIDIA GeForce 6100 nForce 405/PCI/SSE2
NVIDIA GeForce 6100 nForce 405/PCI/SSE2/3DNOW!
+NVIDIA GeForce 6100 nForce 405/PCI/SSE2/3DNOW!
NVIDIA GeForce 6100 nForce 420/PCI/SSE2/3DNOW!
+NVIDIA GeForce 6100 nForce 420/PCI/SSE2/3DNOW!
+NVIDIA GeForce 6100 nForce 430/PCI/SSE2/3DNOW!
NVIDIA GeForce 6100 nForce 430/PCI/SSE2/3DNOW!
NVIDIA GeForce 6100/PCI/SSE2/3DNOW!
+NVIDIA GeForce 6100/PCI/SSE2/3DNOW!
+NVIDIA GeForce 6150 LE/PCI/SSE2/3DNOW!
NVIDIA GeForce 6150 LE/PCI/SSE2/3DNOW!
NVIDIA GeForce 6150/PCI/SSE2
NVIDIA GeForce 6150/PCI/SSE2/3DNOW!
+NVIDIA GeForce 6150/PCI/SSE2/3DNOW!
NVIDIA GeForce 6150SE nForce 430/PCI/SSE2
+NVIDIA GeForce 6150SE nForce 430/PCI/SSE2
+NVIDIA GeForce 6150SE nForce 430/PCI/SSE2/3DNOW!
NVIDIA GeForce 6150SE nForce 430/PCI/SSE2/3DNOW!
NVIDIA GeForce 6150SE/PCI/SSE2/3DNOW!
+NVIDIA GeForce 6150SE/PCI/SSE2/3DNOW!
NVIDIA GeForce 6200
NVIDIA GeForce 6200 A-LE/AGP/SSE/3DNOW!
NVIDIA GeForce 6200 A-LE/AGP/SSE2
NVIDIA GeForce 6200 A-LE/AGP/SSE2/3DNOW!
NVIDIA GeForce 6200 LE/PCI/SSE2
+NVIDIA GeForce 6200 LE/PCI/SSE2
NVIDIA GeForce 6200 LE/PCI/SSE2/3DNOW!
NVIDIA GeForce 6200 TurboCache(TM)/PCI/SSE2
+NVIDIA GeForce 6200 TurboCache(TM)/PCI/SSE2
NVIDIA GeForce 6200 TurboCache(TM)/PCI/SSE2/3DNOW!
NVIDIA GeForce 6200/AGP/SSE/3DNOW!
+NVIDIA GeForce 6200/AGP/SSE/3DNOW!
+NVIDIA GeForce 6200/AGP/SSE2
NVIDIA GeForce 6200/AGP/SSE2
NVIDIA GeForce 6200/AGP/SSE2/3DNOW!
NVIDIA GeForce 6200/PCI/SSE/3DNOW!
NVIDIA GeForce 6200/PCI/SSE2
+NVIDIA GeForce 6200/PCI/SSE2
+NVIDIA GeForce 6200/PCI/SSE2/3DNOW!
NVIDIA GeForce 6200/PCI/SSE2/3DNOW!
NVIDIA GeForce 6200SE TurboCache(TM)/PCI/SSE2/3DNOW!
NVIDIA GeForce 6500
NVIDIA GeForce 6500/PCI/SSE2
+NVIDIA GeForce 6500/PCI/SSE2
NVIDIA GeForce 6600
NVIDIA GeForce 6600 GT/AGP/SSE/3DNOW!
NVIDIA GeForce 6600 GT/AGP/SSE2
+NVIDIA GeForce 6600 GT/AGP/SSE2
NVIDIA GeForce 6600 GT/PCI/SSE/3DNOW!
NVIDIA GeForce 6600 GT/PCI/SSE2
NVIDIA GeForce 6600 GT/PCI/SSE2/3DNOW!
+NVIDIA GeForce 6600 GT/PCI/SSE2/3DNOW!
NVIDIA GeForce 6600 LE/PCI/SSE2
NVIDIA GeForce 6600/AGP/SSE/3DNOW!
NVIDIA GeForce 6600/AGP/SSE2
@@ -919,49 +1350,77 @@ NVIDIA GeForce 6600/PCI/SSE2
NVIDIA GeForce 6600/PCI/SSE2/3DNOW!
NVIDIA GeForce 6700
NVIDIA GeForce 6800
+NVIDIA GeForce 6800 GS/PCI/SSE2
NVIDIA GeForce 6800 GS/PCI/SSE2/3DNOW!
NVIDIA GeForce 6800 GT/AGP/SSE2
NVIDIA GeForce 6800 GT/PCI/SSE2
NVIDIA GeForce 6800 XT/AGP/SSE2
NVIDIA GeForce 6800 XT/PCI/SSE2
+NVIDIA GeForce 6800 XT/PCI/SSE2/3DNOW!
NVIDIA GeForce 6800/PCI/SSE2
NVIDIA GeForce 6800/PCI/SSE2/3DNOW!
NVIDIA GeForce 7000
NVIDIA GeForce 7000M
NVIDIA GeForce 7000M / nForce 610M/PCI/SSE2
NVIDIA GeForce 7000M / nForce 610M/PCI/SSE2/3DNOW!
+NVIDIA GeForce 7000M / nForce 610M/PCI/SSE2/3DNOW!
+NVIDIA GeForce 7025 / NVIDIA nForce 630a/PCI/SSE2/3DNOW!
NVIDIA GeForce 7025 / NVIDIA nForce 630a/PCI/SSE2/3DNOW!
NVIDIA GeForce 7025 / nForce 630a/PCI/SSE2
+NVIDIA GeForce 7025 / nForce 630a/PCI/SSE2
+NVIDIA GeForce 7025 / nForce 630a/PCI/SSE2/3DNOW!
NVIDIA GeForce 7025 / nForce 630a/PCI/SSE2/3DNOW!
NVIDIA GeForce 7050 / NVIDIA nForce 610i/PCI/SSE2
+NVIDIA GeForce 7050 / NVIDIA nForce 610i/PCI/SSE2
NVIDIA GeForce 7050 / NVIDIA nForce 620i/PCI/SSE2
NVIDIA GeForce 7050 / nForce 610i/PCI/SSE2
+NVIDIA GeForce 7050 / nForce 610i/PCI/SSE2
+NVIDIA GeForce 7050 / nForce 620i/PCI/SSE2
NVIDIA GeForce 7050 / nForce 620i/PCI/SSE2
NVIDIA GeForce 7050 PV / NVIDIA nForce 630a/PCI/SSE2/3DNOW!
+NVIDIA GeForce 7050 PV / NVIDIA nForce 630a/PCI/SSE2/3DNOW!
NVIDIA GeForce 7050 PV / nForce 630a/PCI/SSE2
NVIDIA GeForce 7050 PV / nForce 630a/PCI/SSE2/3DNOW!
NVIDIA GeForce 7050 SE / NVIDIA nForce 630a/PCI/SSE2/3DNOW!
NVIDIA GeForce 7100
NVIDIA GeForce 7100 / NVIDIA nForce 620i/PCI/SSE2
+NVIDIA GeForce 7100 / NVIDIA nForce 620i/PCI/SSE2
+NVIDIA GeForce 7100 / NVIDIA nForce 630i/PCI/SSE2
NVIDIA GeForce 7100 / NVIDIA nForce 630i/PCI/SSE2
NVIDIA GeForce 7100 / nForce 630i/PCI/SSE2
+NVIDIA GeForce 7100 / nForce 630i/PCI/SSE2
+NVIDIA GeForce 7100 GS/PCI/SSE2
NVIDIA GeForce 7100 GS/PCI/SSE2
NVIDIA GeForce 7100 GS/PCI/SSE2/3DNOW!
+NVIDIA GeForce 7100 GS/PCI/SSE2/3DNOW!
NVIDIA GeForce 7150M / nForce 630M/PCI/SSE2
+NVIDIA GeForce 7150M / nForce 630M/PCI/SSE2
+NVIDIA GeForce 7150M / nForce 630M/PCI/SSE2/3DNOW!
NVIDIA GeForce 7150M / nForce 630M/PCI/SSE2/3DNOW!
NVIDIA GeForce 7300
NVIDIA GeForce 7300 GS/PCI/SSE2
+NVIDIA GeForce 7300 GS/PCI/SSE2
+NVIDIA GeForce 7300 GS/PCI/SSE2/3DNOW!
NVIDIA GeForce 7300 GS/PCI/SSE2/3DNOW!
NVIDIA GeForce 7300 GT/AGP/SSE2
NVIDIA GeForce 7300 GT/AGP/SSE2/3DNOW!
NVIDIA GeForce 7300 GT/PCI/SSE2
+NVIDIA GeForce 7300 GT/PCI/SSE2
NVIDIA GeForce 7300 GT/PCI/SSE2/3DNOW!
+NVIDIA GeForce 7300 GT/PCI/SSE2/3DNOW!
+NVIDIA GeForce 7300 LE/PCI/SSE2
NVIDIA GeForce 7300 LE/PCI/SSE2
NVIDIA GeForce 7300 LE/PCI/SSE2/3DNOW!
+NVIDIA GeForce 7300 LE/PCI/SSE2/3DNOW!
NVIDIA GeForce 7300 SE/7200 GS/PCI/SSE2
+NVIDIA GeForce 7300 SE/7200 GS/PCI/SSE2
+NVIDIA GeForce 7300 SE/7200 GS/PCI/SSE2/3DNOW!
NVIDIA GeForce 7300 SE/7200 GS/PCI/SSE2/3DNOW!
NVIDIA GeForce 7300 SE/PCI/SSE2
+NVIDIA GeForce 7300 SE/PCI/SSE2
NVIDIA GeForce 7300 SE/PCI/SSE2/3DNOW!
+NVIDIA GeForce 7300 SE/PCI/SSE2/3DNOW!
+NVIDIA GeForce 7350 LE/PCI/SSE2
NVIDIA GeForce 7350 LE/PCI/SSE2
NVIDIA GeForce 7500
NVIDIA GeForce 7500 LE/PCI/SSE2
@@ -970,22 +1429,30 @@ NVIDIA GeForce 7600
NVIDIA GeForce 7600 GS/AGP/SSE2
NVIDIA GeForce 7600 GS/AGP/SSE2/3DNOW!
NVIDIA GeForce 7600 GS/PCI/SSE2
+NVIDIA GeForce 7600 GS/PCI/SSE2
+NVIDIA GeForce 7600 GS/PCI/SSE2/3DNOW!
NVIDIA GeForce 7600 GS/PCI/SSE2/3DNOW!
NVIDIA GeForce 7600 GT/AGP/SSE/3DNOW!
NVIDIA GeForce 7600 GT/AGP/SSE2
NVIDIA GeForce 7600 GT/PCI/SSE2
+NVIDIA GeForce 7600 GT/PCI/SSE2
NVIDIA GeForce 7600 GT/PCI/SSE2/3DNOW!
NVIDIA GeForce 7650 GS/PCI/SSE2
NVIDIA GeForce 7800
NVIDIA GeForce 7800 GS/AGP/SSE2
NVIDIA GeForce 7800 GS/AGP/SSE2/3DNOW!
NVIDIA GeForce 7800 GT/PCI/SSE2
+NVIDIA GeForce 7800 GT/PCI/SSE2/3DNOW!
NVIDIA GeForce 7800 GTX/PCI/SSE2
NVIDIA GeForce 7800 GTX/PCI/SSE2/3DNOW!
+NVIDIA GeForce 7800 GTX/PCI/SSE2/3DNOW!
NVIDIA GeForce 7900
NVIDIA GeForce 7900 GS/PCI/SSE2
+NVIDIA GeForce 7900 GS/PCI/SSE2
NVIDIA GeForce 7900 GS/PCI/SSE2/3DNOW!
NVIDIA GeForce 7900 GT/GTO/PCI/SSE2
+NVIDIA GeForce 7900 GT/GTO/PCI/SSE2/3DNOW!
+NVIDIA GeForce 7900 GT/PCI/SSE2/3DNOW!
NVIDIA GeForce 7900 GT/PCI/SSE2/3DNOW!
NVIDIA GeForce 7900 GTX/PCI/SSE2
NVIDIA GeForce 7950 GT/PCI/SSE2
@@ -994,123 +1461,186 @@ NVIDIA GeForce 8100
NVIDIA GeForce 8100 / nForce 720a/PCI/SSE2/3DNOW!
NVIDIA GeForce 8200
NVIDIA GeForce 8200/PCI/SSE2
+NVIDIA GeForce 8200/PCI/SSE2
+NVIDIA GeForce 8200/PCI/SSE2/3DNOW!
NVIDIA GeForce 8200/PCI/SSE2/3DNOW!
NVIDIA GeForce 8200M
NVIDIA GeForce 8200M G/PCI/SSE2
+NVIDIA GeForce 8200M G/PCI/SSE2
+NVIDIA GeForce 8200M G/PCI/SSE2/3DNOW!
NVIDIA GeForce 8200M G/PCI/SSE2/3DNOW!
NVIDIA GeForce 8300
NVIDIA GeForce 8300 GS/PCI/SSE2
+NVIDIA GeForce 8300 GS/PCI/SSE2
NVIDIA GeForce 8400
NVIDIA GeForce 8400 GS/PCI/SSE/3DNOW!
NVIDIA GeForce 8400 GS/PCI/SSE2
+NVIDIA GeForce 8400 GS/PCI/SSE2
+NVIDIA GeForce 8400 GS/PCI/SSE2/3DNOW!
NVIDIA GeForce 8400 GS/PCI/SSE2/3DNOW!
NVIDIA GeForce 8400/PCI/SSE2/3DNOW!
NVIDIA GeForce 8400GS/PCI/SSE2
+NVIDIA GeForce 8400GS/PCI/SSE2
+NVIDIA GeForce 8400GS/PCI/SSE2/3DNOW!
NVIDIA GeForce 8400GS/PCI/SSE2/3DNOW!
NVIDIA GeForce 8400M
NVIDIA GeForce 8400M G/PCI/SSE2
+NVIDIA GeForce 8400M G/PCI/SSE2
+NVIDIA GeForce 8400M G/PCI/SSE2/3DNOW!
NVIDIA GeForce 8400M G/PCI/SSE2/3DNOW!
NVIDIA GeForce 8400M GS/PCI/SSE2
+NVIDIA GeForce 8400M GS/PCI/SSE2
+NVIDIA GeForce 8400M GS/PCI/SSE2/3DNOW!
NVIDIA GeForce 8400M GS/PCI/SSE2/3DNOW!
NVIDIA GeForce 8400M GT/PCI/SSE2
+NVIDIA GeForce 8400M GT/PCI/SSE2
NVIDIA GeForce 8500
NVIDIA GeForce 8500 GT/PCI/SSE2
+NVIDIA GeForce 8500 GT/PCI/SSE2
+NVIDIA GeForce 8500 GT/PCI/SSE2/3DNOW!
NVIDIA GeForce 8500 GT/PCI/SSE2/3DNOW!
NVIDIA GeForce 8600
NVIDIA GeForce 8600 GS/PCI/SSE2
+NVIDIA GeForce 8600 GS/PCI/SSE2
NVIDIA GeForce 8600 GS/PCI/SSE2/3DNOW!
NVIDIA GeForce 8600 GT/PCI/SSE2
+NVIDIA GeForce 8600 GT/PCI/SSE2
+NVIDIA GeForce 8600 GT/PCI/SSE2/3DNOW!
NVIDIA GeForce 8600 GT/PCI/SSE2/3DNOW!
NVIDIA GeForce 8600 GTS/PCI/SSE2
NVIDIA GeForce 8600 GTS/PCI/SSE2/3DNOW!
NVIDIA GeForce 8600GS/PCI/SSE2
+NVIDIA GeForce 8600GS/PCI/SSE2
NVIDIA GeForce 8600M
NVIDIA GeForce 8600M GS/PCI/SSE2
NVIDIA GeForce 8600M GS/PCI/SSE2/3DNOW!
NVIDIA GeForce 8600M GT/PCI/SSE2
+NVIDIA GeForce 8600M GT/PCI/SSE2
NVIDIA GeForce 8700
NVIDIA GeForce 8700M
NVIDIA GeForce 8700M GT/PCI/SSE2
+NVIDIA GeForce 8700M GT/PCI/SSE2
NVIDIA GeForce 8800
NVIDIA GeForce 8800 GS/PCI/SSE2
NVIDIA GeForce 8800 GT/PCI/SSE2
+NVIDIA GeForce 8800 GT/PCI/SSE2
+NVIDIA GeForce 8800 GT/PCI/SSE2/3DNOW!
NVIDIA GeForce 8800 GT/PCI/SSE2/3DNOW!
NVIDIA GeForce 8800 GTS 512/PCI/SSE2
NVIDIA GeForce 8800 GTS 512/PCI/SSE2/3DNOW!
NVIDIA GeForce 8800 GTS/PCI/SSE2
+NVIDIA GeForce 8800 GTS/PCI/SSE2
NVIDIA GeForce 8800 GTS/PCI/SSE2/3DNOW!
NVIDIA GeForce 8800 GTX/PCI/SSE2
NVIDIA GeForce 8800 Ultra/PCI/SSE2
NVIDIA GeForce 8800M GTS/PCI/SSE2
+NVIDIA GeForce 8800M GTS/PCI/SSE2
+NVIDIA GeForce 8800M GTX/PCI/SSE2
NVIDIA GeForce 8800M GTX/PCI/SSE2
NVIDIA GeForce 9100
NVIDIA GeForce 9100/PCI/SSE2
+NVIDIA GeForce 9100/PCI/SSE2
NVIDIA GeForce 9100/PCI/SSE2/3DNOW!
NVIDIA GeForce 9100M
NVIDIA GeForce 9100M G/PCI/SSE2
+NVIDIA GeForce 9100M G/PCI/SSE2
NVIDIA GeForce 9100M G/PCI/SSE2/3DNOW!
NVIDIA GeForce 9200
NVIDIA GeForce 9200/PCI/SSE2
+NVIDIA GeForce 9200/PCI/SSE2
NVIDIA GeForce 9200/PCI/SSE2/3DNOW!
+NVIDIA GeForce 9200/PCI/SSE2/3DNOW!
+NVIDIA GeForce 9200M GE/PCI/SSE2
NVIDIA GeForce 9200M GE/PCI/SSE2
NVIDIA GeForce 9200M GS/PCI/SSE2
+NVIDIA GeForce 9200M GS/PCI/SSE2
NVIDIA GeForce 9300
NVIDIA GeForce 9300 / nForce 730i/PCI/SSE2
NVIDIA GeForce 9300 GE/PCI/SSE2
+NVIDIA GeForce 9300 GE/PCI/SSE2
+NVIDIA GeForce 9300 GE/PCI/SSE2/3DNOW!
NVIDIA GeForce 9300 GE/PCI/SSE2/3DNOW!
NVIDIA GeForce 9300 GS/PCI/SSE2
+NVIDIA GeForce 9300 GS/PCI/SSE2
+NVIDIA GeForce 9300 GS/PCI/SSE2/3DNOW!
NVIDIA GeForce 9300 GS/PCI/SSE2/3DNOW!
NVIDIA GeForce 9300 SE/PCI/SSE2
NVIDIA GeForce 9300M
NVIDIA GeForce 9300M G/PCI/SSE2
+NVIDIA GeForce 9300M G/PCI/SSE2
NVIDIA GeForce 9300M G/PCI/SSE2/3DNOW!
NVIDIA GeForce 9300M GS/PCI/SSE2
+NVIDIA GeForce 9300M GS/PCI/SSE2
NVIDIA GeForce 9300M GS/PCI/SSE2/3DNOW!
NVIDIA GeForce 9400
NVIDIA GeForce 9400 GT/PCI/SSE2
+NVIDIA GeForce 9400 GT/PCI/SSE2
+NVIDIA GeForce 9400 GT/PCI/SSE2/3DNOW!
NVIDIA GeForce 9400 GT/PCI/SSE2/3DNOW!
NVIDIA GeForce 9400/PCI/SSE2
NVIDIA GeForce 9400M
NVIDIA GeForce 9400M G/PCI/SSE2
+NVIDIA GeForce 9400M G/PCI/SSE2
+NVIDIA GeForce 9400M/PCI/SSE2
NVIDIA GeForce 9400M/PCI/SSE2
NVIDIA GeForce 9500
NVIDIA GeForce 9500 GS/PCI/SSE2
+NVIDIA GeForce 9500 GS/PCI/SSE2
NVIDIA GeForce 9500 GS/PCI/SSE2/3DNOW!
NVIDIA GeForce 9500 GT/PCI/SSE2
+NVIDIA GeForce 9500 GT/PCI/SSE2
+NVIDIA GeForce 9500 GT/PCI/SSE2/3DNOW!
NVIDIA GeForce 9500 GT/PCI/SSE2/3DNOW!
NVIDIA GeForce 9500M
NVIDIA GeForce 9500M GS/PCI/SSE2
+NVIDIA GeForce 9500M GS/PCI/SSE2
NVIDIA GeForce 9600
NVIDIA GeForce 9600 GS/PCI/SSE2
NVIDIA GeForce 9600 GSO 512/PCI/SSE2
NVIDIA GeForce 9600 GSO/PCI/SSE2
NVIDIA GeForce 9600 GSO/PCI/SSE2/3DNOW!
+NVIDIA GeForce 9600 GSO/PCI/SSE2/3DNOW!
+NVIDIA GeForce 9600 GT/PCI/SSE2
NVIDIA GeForce 9600 GT/PCI/SSE2
NVIDIA GeForce 9600 GT/PCI/SSE2/3DNOW!
+NVIDIA GeForce 9600 GT/PCI/SSE2/3DNOW!
NVIDIA GeForce 9600M
NVIDIA GeForce 9600M GS/PCI/SSE2
+NVIDIA GeForce 9600M GS/PCI/SSE2
+NVIDIA GeForce 9600M GT/PCI/SSE2
NVIDIA GeForce 9600M GT/PCI/SSE2
NVIDIA GeForce 9650M GT/PCI/SSE2
+NVIDIA GeForce 9650M GT/PCI/SSE2
NVIDIA GeForce 9700M
NVIDIA GeForce 9700M GT/PCI/SSE2
NVIDIA GeForce 9700M GTS/PCI/SSE2
+NVIDIA GeForce 9700M GTS/PCI/SSE2
NVIDIA GeForce 9800
NVIDIA GeForce 9800 GT/PCI/SSE2
+NVIDIA GeForce 9800 GT/PCI/SSE2
NVIDIA GeForce 9800 GT/PCI/SSE2/3DNOW!
+NVIDIA GeForce 9800 GT/PCI/SSE2/3DNOW!
+NVIDIA GeForce 9800 GTX+/PCI/SSE2
NVIDIA GeForce 9800 GTX+/PCI/SSE2
NVIDIA GeForce 9800 GTX+/PCI/SSE2/3DNOW!
NVIDIA GeForce 9800 GTX/9800 GTX+/PCI/SSE2
+NVIDIA GeForce 9800 GTX/9800 GTX+/PCI/SSE2
NVIDIA GeForce 9800 GTX/PCI/SSE2
NVIDIA GeForce 9800 GX2/PCI/SSE2
NVIDIA GeForce 9800M
NVIDIA GeForce 9800M GS/PCI/SSE2
+NVIDIA GeForce 9800M GS/PCI/SSE2
+NVIDIA GeForce 9800M GT/PCI/SSE2
NVIDIA GeForce 9800M GT/PCI/SSE2
NVIDIA GeForce 9800M GTS/PCI/SSE2
+NVIDIA GeForce 9800M GTS/PCI/SSE2
NVIDIA GeForce FX 5100
NVIDIA GeForce FX 5100/AGP/SSE/3DNOW!
NVIDIA GeForce FX 5200
NVIDIA GeForce FX 5200/AGP/SSE
NVIDIA GeForce FX 5200/AGP/SSE/3DNOW!
+NVIDIA GeForce FX 5200/AGP/SSE/3DNOW!
+NVIDIA GeForce FX 5200/AGP/SSE2
NVIDIA GeForce FX 5200/AGP/SSE2
NVIDIA GeForce FX 5200/AGP/SSE2/3DNOW!
NVIDIA GeForce FX 5200/PCI/SSE2
@@ -1119,11 +1649,16 @@ NVIDIA GeForce FX 5200LE/AGP/SSE2
NVIDIA GeForce FX 5500
NVIDIA GeForce FX 5500/AGP/SSE/3DNOW!
NVIDIA GeForce FX 5500/AGP/SSE2
+NVIDIA GeForce FX 5500/AGP/SSE2
+NVIDIA GeForce FX 5500/AGP/SSE2/3DNOW!
NVIDIA GeForce FX 5500/AGP/SSE2/3DNOW!
NVIDIA GeForce FX 5500/PCI/SSE2
+NVIDIA GeForce FX 5500/PCI/SSE2
+NVIDIA GeForce FX 5500/PCI/SSE2/3DNOW!
NVIDIA GeForce FX 5500/PCI/SSE2/3DNOW!
NVIDIA GeForce FX 5600
NVIDIA GeForce FX 5600/AGP/SSE2
+NVIDIA GeForce FX 5600/AGP/SSE2
NVIDIA GeForce FX 5600/AGP/SSE2/3DNOW!
NVIDIA GeForce FX 5600XT/AGP/SSE2/3DNOW!
NVIDIA GeForce FX 5700
@@ -1138,136 +1673,239 @@ NVIDIA GeForce FX Go5100
NVIDIA GeForce FX Go5100/AGP/SSE2
NVIDIA GeForce FX Go5200
NVIDIA GeForce FX Go5200/AGP/SSE2
+NVIDIA GeForce FX Go5200/AGP/SSE2
NVIDIA GeForce FX Go5300
NVIDIA GeForce FX Go5600
NVIDIA GeForce FX Go5600/AGP/SSE2
+NVIDIA GeForce FX Go5600/AGP/SSE2
NVIDIA GeForce FX Go5650/AGP/SSE2
NVIDIA GeForce FX Go5700
+NVIDIA GeForce FX Go5700/AGP/SSE2
+NVIDIA GeForce FX Go5xxx/AGP/SSE2
NVIDIA GeForce FX Go5xxx/AGP/SSE2
NVIDIA GeForce G 103M/PCI/SSE2
+NVIDIA GeForce G 103M/PCI/SSE2
+NVIDIA GeForce G 103M/PCI/SSE2/3DNOW!
NVIDIA GeForce G 105M/PCI/SSE2
+NVIDIA GeForce G 105M/PCI/SSE2
+NVIDIA GeForce G 110M/PCI/SSE2
NVIDIA GeForce G 110M/PCI/SSE2
NVIDIA GeForce G100/PCI/SSE2
+NVIDIA GeForce G100/PCI/SSE2
+NVIDIA GeForce G100/PCI/SSE2/3DNOW!
NVIDIA GeForce G100/PCI/SSE2/3DNOW!
NVIDIA GeForce G102M/PCI/SSE2
+NVIDIA GeForce G102M/PCI/SSE2
NVIDIA GeForce G105M/PCI/SSE2
+NVIDIA GeForce G105M/PCI/SSE2
+NVIDIA GeForce G200/PCI/SSE2
NVIDIA GeForce G200/PCI/SSE2
NVIDIA GeForce G205M/PCI/SSE2
+NVIDIA GeForce G205M/PCI/SSE2
NVIDIA GeForce G210/PCI/SSE2
+NVIDIA GeForce G210/PCI/SSE2
+NVIDIA GeForce G210/PCI/SSE2/3DNOW!
NVIDIA GeForce G210/PCI/SSE2/3DNOW!
NVIDIA GeForce G210M/PCI/SSE2
+NVIDIA GeForce G210M/PCI/SSE2
NVIDIA GeForce G310M/PCI/SSE2
NVIDIA GeForce GT 120/PCI/SSE2
+NVIDIA GeForce GT 120/PCI/SSE2
NVIDIA GeForce GT 120/PCI/SSE2/3DNOW!
NVIDIA GeForce GT 120M/PCI/SSE2
NVIDIA GeForce GT 130M/PCI/SSE2
+NVIDIA GeForce GT 130M/PCI/SSE2
NVIDIA GeForce GT 140/PCI/SSE2
+NVIDIA GeForce GT 140/PCI/SSE2
+NVIDIA GeForce GT 220/PCI/SSE2
NVIDIA GeForce GT 220/PCI/SSE2
NVIDIA GeForce GT 220/PCI/SSE2/3DNOW!
+NVIDIA GeForce GT 220/PCI/SSE2/3DNOW!
NVIDIA GeForce GT 220M/PCI/SSE2
+NVIDIA GeForce GT 220M/PCI/SSE2
+NVIDIA GeForce GT 230/PCI/SSE2
NVIDIA GeForce GT 230/PCI/SSE2
NVIDIA GeForce GT 230M/PCI/SSE2
+NVIDIA GeForce GT 230M/PCI/SSE2
NVIDIA GeForce GT 240
NVIDIA GeForce GT 240/PCI/SSE2
+NVIDIA GeForce GT 240/PCI/SSE2
+NVIDIA GeForce GT 240/PCI/SSE2/3DNOW!
NVIDIA GeForce GT 240/PCI/SSE2/3DNOW!
NVIDIA GeForce GT 240M/PCI/SSE2
+NVIDIA GeForce GT 240M/PCI/SSE2
NVIDIA GeForce GT 320/PCI/SSE2
NVIDIA GeForce GT 320M/PCI/SSE2
+NVIDIA GeForce GT 320M/PCI/SSE2
NVIDIA GeForce GT 325M/PCI/SSE2
NVIDIA GeForce GT 330/PCI/SSE2
+NVIDIA GeForce GT 330/PCI/SSE2
NVIDIA GeForce GT 330/PCI/SSE2/3DNOW!
NVIDIA GeForce GT 330M/PCI/SSE2
+NVIDIA GeForce GT 330M/PCI/SSE2
+NVIDIA GeForce GT 335M/PCI/SSE2
NVIDIA GeForce GT 335M/PCI/SSE2
NVIDIA GeForce GT 340/PCI/SSE2
+NVIDIA GeForce GT 340/PCI/SSE2
NVIDIA GeForce GT 340/PCI/SSE2/3DNOW!
+NVIDIA GeForce GT 340/PCI/SSE2/3DNOW!
+NVIDIA GeForce GT 415M/PCI/SSE2
NVIDIA GeForce GT 415M/PCI/SSE2
NVIDIA GeForce GT 420/PCI/SSE2
+NVIDIA GeForce GT 420/PCI/SSE2
NVIDIA GeForce GT 420M/PCI/SSE2
+NVIDIA GeForce GT 420M/PCI/SSE2
+NVIDIA GeForce GT 425M/PCI/SSE2
NVIDIA GeForce GT 425M/PCI/SSE2
NVIDIA GeForce GT 430/PCI/SSE2
+NVIDIA GeForce GT 430/PCI/SSE2
NVIDIA GeForce GT 430/PCI/SSE2/3DNOW!
+NVIDIA GeForce GT 430/PCI/SSE2/3DNOW!
+NVIDIA GeForce GT 435M/PCI/SSE2
NVIDIA GeForce GT 435M/PCI/SSE2
NVIDIA GeForce GT 440/PCI/SSE2
+NVIDIA GeForce GT 440/PCI/SSE2
+NVIDIA GeForce GT 440/PCI/SSE2/3DNOW!
NVIDIA GeForce GT 440/PCI/SSE2/3DNOW!
NVIDIA GeForce GT 445M/PCI/SSE2
+NVIDIA GeForce GT 445M/PCI/SSE2
+NVIDIA GeForce GT 520/PCI/SSE2
+NVIDIA GeForce GT 520/PCI/SSE2/3DNOW!
NVIDIA GeForce GT 520M/PCI/SSE2
+NVIDIA GeForce GT 520M/PCI/SSE2
+NVIDIA GeForce GT 525M/PCI/SSE2
NVIDIA GeForce GT 525M/PCI/SSE2
+NVIDIA GeForce GT 530/PCI/SSE2
+NVIDIA GeForce GT 530/PCI/SSE2/3DNOW!
+NVIDIA GeForce GT 540M/PCI/SSE2
NVIDIA GeForce GT 540M/PCI/SSE2
+NVIDIA GeForce GT 545/PCI/SSE2
NVIDIA GeForce GT 550M/PCI/SSE2
+NVIDIA GeForce GT 550M/PCI/SSE2
+NVIDIA GeForce GT 555M/PCI/SSE2
NVIDIA GeForce GT 555M/PCI/SSE2
NVIDIA GeForce GTS 150/PCI/SSE2
+NVIDIA GeForce GTS 150/PCI/SSE2
NVIDIA GeForce GTS 160M/PCI/SSE2
+NVIDIA GeForce GTS 160M/PCI/SSE2
+NVIDIA GeForce GTS 240/PCI/SSE2
NVIDIA GeForce GTS 240/PCI/SSE2
NVIDIA GeForce GTS 250/PCI/SSE2
+NVIDIA GeForce GTS 250/PCI/SSE2
+NVIDIA GeForce GTS 250/PCI/SSE2/3DNOW!
NVIDIA GeForce GTS 250/PCI/SSE2/3DNOW!
NVIDIA GeForce GTS 250M/PCI/SSE2
NVIDIA GeForce GTS 350M/PCI/SSE2
+NVIDIA GeForce GTS 350M/PCI/SSE2
NVIDIA GeForce GTS 360M/PCI/SSE2
+NVIDIA GeForce GTS 360M/PCI/SSE2
+NVIDIA GeForce GTS 450/PCI/SSE2
NVIDIA GeForce GTS 450/PCI/SSE2
NVIDIA GeForce GTS 450/PCI/SSE2/3DNOW!
+NVIDIA GeForce GTS 450/PCI/SSE2/3DNOW!
NVIDIA GeForce GTS 455/PCI/SSE2
NVIDIA GeForce GTX 260/PCI/SSE2
+NVIDIA GeForce GTX 260/PCI/SSE2
+NVIDIA GeForce GTX 260/PCI/SSE2/3DNOW!
NVIDIA GeForce GTX 260/PCI/SSE2/3DNOW!
NVIDIA GeForce GTX 260M/PCI/SSE2
+NVIDIA GeForce GTX 260M/PCI/SSE2
+NVIDIA GeForce GTX 275/PCI/SSE2
NVIDIA GeForce GTX 275/PCI/SSE2
+NVIDIA GeForce GTX 275/PCI/SSE2/3DNOW!
NVIDIA GeForce GTX 280
NVIDIA GeForce GTX 280/PCI/SSE2
NVIDIA GeForce GTX 280M/PCI/SSE2
+NVIDIA GeForce GTX 285
NVIDIA GeForce GTX 285/PCI/SSE2
+NVIDIA GeForce GTX 285/PCI/SSE2
+NVIDIA GeForce GTX 285/PCI/SSE2
+NVIDIA GeForce GTX 295/PCI/SSE2
NVIDIA GeForce GTX 295/PCI/SSE2
NVIDIA GeForce GTX 460 SE/PCI/SSE2
+NVIDIA GeForce GTX 460 SE/PCI/SSE2
+NVIDIA GeForce GTX 460 SE/PCI/SSE2/3DNOW!
NVIDIA GeForce GTX 460 SE/PCI/SSE2/3DNOW!
NVIDIA GeForce GTX 460/PCI/SSE2
+NVIDIA GeForce GTX 460/PCI/SSE2
NVIDIA GeForce GTX 460/PCI/SSE2/3DNOW!
+NVIDIA GeForce GTX 460/PCI/SSE2/3DNOW!
+NVIDIA GeForce GTX 460M/PCI/SSE2
NVIDIA GeForce GTX 460M/PCI/SSE2
NVIDIA GeForce GTX 465/PCI/SSE2
+NVIDIA GeForce GTX 465/PCI/SSE2
NVIDIA GeForce GTX 465/PCI/SSE2/3DNOW!
+NVIDIA GeForce GTX 465/PCI/SSE2/3DNOW!
+NVIDIA GeForce GTX 470/PCI/SSE2
NVIDIA GeForce GTX 470/PCI/SSE2
NVIDIA GeForce GTX 470/PCI/SSE2/3DNOW!
NVIDIA GeForce GTX 480/PCI/SSE2
NVIDIA GeForce GTX 550 Ti/PCI/SSE2
+NVIDIA GeForce GTX 550 Ti/PCI/SSE2
+NVIDIA GeForce GTX 550 Ti/PCI/SSE2/3DNOW!
NVIDIA GeForce GTX 550 Ti/PCI/SSE2/3DNOW!
NVIDIA GeForce GTX 560 Ti/PCI/SSE2
+NVIDIA GeForce GTX 560 Ti/PCI/SSE2
NVIDIA GeForce GTX 560 Ti/PCI/SSE2/3DNOW!
+NVIDIA GeForce GTX 560 Ti/PCI/SSE2/3DNOW!
+NVIDIA GeForce GTX 560/PCI/SSE2
NVIDIA GeForce GTX 560/PCI/SSE2
+NVIDIA GeForce GTX 560/PCI/SSE2/3DNOW!
+NVIDIA GeForce GTX 560M/PCI/SSE2
+NVIDIA GeForce GTX 570/PCI/SSE2
NVIDIA GeForce GTX 570/PCI/SSE2
NVIDIA GeForce GTX 570/PCI/SSE2/3DNOW!
+NVIDIA GeForce GTX 570/PCI/SSE2/3DNOW!
+NVIDIA GeForce GTX 580/PCI/SSE2
NVIDIA GeForce GTX 580/PCI/SSE2
NVIDIA GeForce GTX 580/PCI/SSE2/3DNOW!
+NVIDIA GeForce GTX 580/PCI/SSE2/3DNOW!
NVIDIA GeForce GTX 580M/PCI/SSE2
NVIDIA GeForce GTX 590/PCI/SSE2
+NVIDIA GeForce GTX 590/PCI/SSE2
NVIDIA GeForce Go 6
NVIDIA GeForce Go 6100
NVIDIA GeForce Go 6100/PCI/SSE2
NVIDIA GeForce Go 6100/PCI/SSE2/3DNOW!
+NVIDIA GeForce Go 6100/PCI/SSE2/3DNOW!
NVIDIA GeForce Go 6150/PCI/SSE2
NVIDIA GeForce Go 6150/PCI/SSE2/3DNOW!
+NVIDIA GeForce Go 6150/PCI/SSE2/3DNOW!
NVIDIA GeForce Go 6200
NVIDIA GeForce Go 6200/PCI/SSE2
NVIDIA GeForce Go 6400
NVIDIA GeForce Go 6400/PCI/SSE2
+NVIDIA GeForce Go 6400/PCI/SSE2
NVIDIA GeForce Go 6600
NVIDIA GeForce Go 6600/PCI/SSE2
+NVIDIA GeForce Go 6600/PCI/SSE2
NVIDIA GeForce Go 6800
NVIDIA GeForce Go 6800 Ultra/PCI/SSE2
+NVIDIA GeForce Go 6800 Ultra/PCI/SSE2
NVIDIA GeForce Go 6800/PCI/SSE2
NVIDIA GeForce Go 7200
NVIDIA GeForce Go 7200/PCI/SSE2
NVIDIA GeForce Go 7200/PCI/SSE2/3DNOW!
NVIDIA GeForce Go 7300
NVIDIA GeForce Go 7300/PCI/SSE2
+NVIDIA GeForce Go 7300/PCI/SSE2
NVIDIA GeForce Go 7300/PCI/SSE2/3DNOW!
NVIDIA GeForce Go 7400
NVIDIA GeForce Go 7400/PCI/SSE2
+NVIDIA GeForce Go 7400/PCI/SSE2
NVIDIA GeForce Go 7400/PCI/SSE2/3DNOW!
NVIDIA GeForce Go 7600
NVIDIA GeForce Go 7600/PCI/SSE2
+NVIDIA GeForce Go 7600/PCI/SSE2
+NVIDIA GeForce Go 7600/PCI/SSE2/3DNOW!
NVIDIA GeForce Go 7600/PCI/SSE2/3DNOW!
NVIDIA GeForce Go 7700
+NVIDIA GeForce Go 7700/PCI/SSE2
NVIDIA GeForce Go 7800
NVIDIA GeForce Go 7800 GTX/PCI/SSE2
NVIDIA GeForce Go 7900
NVIDIA GeForce Go 7900 GS/PCI/SSE2
+NVIDIA GeForce Go 7900 GS/PCI/SSE2
NVIDIA GeForce Go 7900 GTX/PCI/SSE2
NVIDIA GeForce Go 7950 GTX/PCI/SSE2
NVIDIA GeForce PCX
@@ -1275,15 +1913,20 @@ NVIDIA GeForce2 GTS/AGP/SSE
NVIDIA GeForce2 MX/AGP/3DNOW!
NVIDIA GeForce2 MX/AGP/SSE/3DNOW!
NVIDIA GeForce2 MX/AGP/SSE2
+NVIDIA GeForce2 MX/AGP/SSE2
NVIDIA GeForce2 MX/PCI/SSE2
NVIDIA GeForce3/AGP/SSE/3DNOW!
NVIDIA GeForce3/AGP/SSE2
NVIDIA GeForce4 420 Go 32M/AGP/SSE2
NVIDIA GeForce4 420 Go 32M/AGP/SSE2/3DNOW!
NVIDIA GeForce4 420 Go 32M/PCI/SSE2/3DNOW!
+NVIDIA GeForce4 420 Go/AGP/SSE2
NVIDIA GeForce4 440 Go 64M/AGP/SSE2/3DNOW!
+NVIDIA GeForce4 440 Go/AGP/SSE2
NVIDIA GeForce4 460 Go/AGP/SSE2
NVIDIA GeForce4 MX 4000/AGP/SSE/3DNOW!
+NVIDIA GeForce4 MX 4000/AGP/SSE/3DNOW!
+NVIDIA GeForce4 MX 4000/AGP/SSE2
NVIDIA GeForce4 MX 4000/AGP/SSE2
NVIDIA GeForce4 MX 4000/PCI/3DNOW!
NVIDIA GeForce4 MX 4000/PCI/SSE/3DNOW!
@@ -1291,97 +1934,161 @@ NVIDIA GeForce4 MX 4000/PCI/SSE2
NVIDIA GeForce4 MX 420/AGP/SSE/3DNOW!
NVIDIA GeForce4 MX 420/AGP/SSE2
NVIDIA GeForce4 MX 440 with AGP8X/AGP/SSE2
+NVIDIA GeForce4 MX 440 with AGP8X/AGP/SSE2
+NVIDIA GeForce4 MX 440/AGP/SSE2
NVIDIA GeForce4 MX 440/AGP/SSE2
NVIDIA GeForce4 MX 440/AGP/SSE2/3DNOW!
NVIDIA GeForce4 MX 440SE with AGP8X/AGP/SSE2
+NVIDIA GeForce4 MX 440SE with AGP8X/AGP/SSE2
+NVIDIA GeForce4 MX Integrated GPU/AGP/SSE/3DNOW!
NVIDIA GeForce4 MX Integrated GPU/AGP/SSE/3DNOW!
NVIDIA GeForce4 Ti 4200 with AGP8X/AGP/SSE
NVIDIA GeForce4 Ti 4200/AGP/SSE/3DNOW!
NVIDIA GeForce4 Ti 4400/AGP/SSE2
NVIDIA Generic
NVIDIA ION LE/PCI/SSE2
+NVIDIA ION LE/PCI/SSE2
NVIDIA ION/PCI/SSE2
+NVIDIA ION/PCI/SSE2
+NVIDIA ION/PCI/SSE2/3DNOW!
NVIDIA ION/PCI/SSE2/3DNOW!
NVIDIA MCP61/PCI/SSE2
+NVIDIA MCP61/PCI/SSE2
NVIDIA MCP61/PCI/SSE2/3DNOW!
+NVIDIA MCP61/PCI/SSE2/3DNOW!
+NVIDIA MCP73/PCI/SSE2
NVIDIA MCP73/PCI/SSE2
NVIDIA MCP79MH/PCI/SSE2
+NVIDIA MCP79MH/PCI/SSE2
+NVIDIA MCP79MX/PCI/SSE2
NVIDIA MCP79MX/PCI/SSE2
NVIDIA MCP7A-O/PCI/SSE2
+NVIDIA MCP7A-O/PCI/SSE2
NVIDIA MCP7A-S/PCI/SSE2
NVIDIA MCP89-EPT/PCI/SSE2
+NVIDIA MCP89-EPT/PCI/SSE2
+NVIDIA N10M-GE1/PCI/SSE2
NVIDIA N10M-GE1/PCI/SSE2
NVIDIA N10P-GE1/PCI/SSE2
+NVIDIA N10P-GE1/PCI/SSE2
NVIDIA N10P-GV2/PCI/SSE2
+NVIDIA N10P-GV2/PCI/SSE2
+NVIDIA N11M-GE1/PCI/SSE2
NVIDIA N11M-GE1/PCI/SSE2
NVIDIA N11M-GE2/PCI/SSE2
+NVIDIA N11M-GE2/PCI/SSE2
NVIDIA N12E-GS-A1/PCI/SSE2
+NVIDIA N12P-GVR-B-A1/PCI/SSE2
+NVIDIA N13M-GE1-B-A1/PCI/SSE2
+NVIDIA N13P-GL-A1/PCI/SSE2
NVIDIA NB9M-GE/PCI/SSE2
+NVIDIA NB9M-GE/PCI/SSE2
+NVIDIA NB9M-GE1/PCI/SSE2
NVIDIA NB9M-GE1/PCI/SSE2
NVIDIA NB9M-GS/PCI/SSE2
+NVIDIA NB9M-GS/PCI/SSE2
+NVIDIA NB9M-NS/PCI/SSE2
NVIDIA NB9M-NS/PCI/SSE2
NVIDIA NB9P-GE1/PCI/SSE2
+NVIDIA NB9P-GE1/PCI/SSE2
NVIDIA NB9P-GS/PCI/SSE2
NVIDIA NV17/AGP/3DNOW!
NVIDIA NV17/AGP/SSE2
+NVIDIA NV17/AGP/SSE2
NVIDIA NV34
NVIDIA NV35
NVIDIA NV36/AGP/SSE/3DNOW!
NVIDIA NV36/AGP/SSE2
NVIDIA NV41/PCI/SSE2
NVIDIA NV43
+NVIDIA NV43/PCI/SSE2
NVIDIA NV44
+NVIDIA NV44/AGP/SSE2
+NVIDIA NVIDIA GeForce 210 OpenGL Engine
NVIDIA NVIDIA GeForce 210 OpenGL Engine
NVIDIA NVIDIA GeForce 320M OpenGL Engine
+NVIDIA NVIDIA GeForce 320M OpenGL Engine
+NVIDIA NVIDIA GeForce 7300 GT OpenGL Engine
NVIDIA NVIDIA GeForce 7300 GT OpenGL Engine
NVIDIA NVIDIA GeForce 7600 GT OpenGL Engine
NVIDIA NVIDIA GeForce 8600M GT OpenGL Engine
+NVIDIA NVIDIA GeForce 8600M GT OpenGL Engine
+NVIDIA NVIDIA GeForce 8800 GS OpenGL Engine
NVIDIA NVIDIA GeForce 8800 GS OpenGL Engine
NVIDIA NVIDIA GeForce 8800 GT OpenGL Engine
+NVIDIA NVIDIA GeForce 8800 GT OpenGL Engine
+NVIDIA NVIDIA GeForce 9400 OpenGL Engine
NVIDIA NVIDIA GeForce 9400 OpenGL Engine
NVIDIA NVIDIA GeForce 9400M OpenGL Engine
+NVIDIA NVIDIA GeForce 9400M OpenGL Engine
NVIDIA NVIDIA GeForce 9500 GT OpenGL Engine
NVIDIA NVIDIA GeForce 9600M GT OpenGL Engine
+NVIDIA NVIDIA GeForce 9600M GT OpenGL Engine
+NVIDIA NVIDIA GeForce GT 120 OpenGL Engine
NVIDIA NVIDIA GeForce GT 120 OpenGL Engine
NVIDIA NVIDIA GeForce GT 130 OpenGL Engine
+NVIDIA NVIDIA GeForce GT 130 OpenGL Engine
NVIDIA NVIDIA GeForce GT 220 OpenGL Engine
NVIDIA NVIDIA GeForce GT 230M OpenGL Engine
NVIDIA NVIDIA GeForce GT 240M OpenGL Engine
NVIDIA NVIDIA GeForce GT 330M OpenGL Engine
+NVIDIA NVIDIA GeForce GT 330M OpenGL Engine
NVIDIA NVIDIA GeForce GT 420M OpenGL Engine
NVIDIA NVIDIA GeForce GT 425M OpenGL Engine
NVIDIA NVIDIA GeForce GT 430 OpenGL Engine
+NVIDIA NVIDIA GeForce GT 430 OpenGL Engine
NVIDIA NVIDIA GeForce GT 440 OpenGL Engine
NVIDIA NVIDIA GeForce GT 540M OpenGL Engine
NVIDIA NVIDIA GeForce GTS 240 OpenGL Engine
NVIDIA NVIDIA GeForce GTS 250 OpenGL Engine
+NVIDIA NVIDIA GeForce GTS 250 OpenGL Engine
+NVIDIA NVIDIA GeForce GTS 450 OpenGL Engine
NVIDIA NVIDIA GeForce GTS 450 OpenGL Engine
NVIDIA NVIDIA GeForce GTX 285 OpenGL Engine
NVIDIA NVIDIA GeForce GTX 460 OpenGL Engine
+NVIDIA NVIDIA GeForce GTX 460 OpenGL Engine
NVIDIA NVIDIA GeForce GTX 460M OpenGL Engine
NVIDIA NVIDIA GeForce GTX 465 OpenGL Engine
NVIDIA NVIDIA GeForce GTX 470 OpenGL Engine
NVIDIA NVIDIA GeForce GTX 480 OpenGL Engine
+NVIDIA NVIDIA GeForce GTX 480 OpenGL Engine
+NVIDIA NVIDIA GeForce Pre-Release GF108 ES OpenGL Engine
+NVIDIA NVIDIA GeForce Pre-Release ION OpenGL Engine
NVIDIA NVIDIA GeForce Pre-Release ION OpenGL Engine
+NVIDIA NVIDIA GeForce Pre-Release MCP7A-J-DC OpenGL Engine
NVIDIA NVIDIA GeForce4 OpenGL Engine
NVIDIA NVIDIA NV34MAP OpenGL Engine
NVIDIA NVIDIA Quadro 4000 OpenGL Engine
+NVIDIA NVIDIA Quadro 4000 OpenGL Engine
NVIDIA NVIDIA Quadro FX 4800 OpenGL Engine
NVIDIA NVS 2100M/PCI/SSE2
+NVIDIA NVS 2100M/PCI/SSE2
+NVIDIA NVS 300/PCI/SSE2
NVIDIA NVS 300/PCI/SSE2
NVIDIA NVS 3100M/PCI/SSE2
+NVIDIA NVS 3100M/PCI/SSE2
NVIDIA NVS 4100/PCI/SSE2/3DNOW!
NVIDIA NVS 4200M/PCI/SSE2
+NVIDIA NVS 4200M/PCI/SSE2
+NVIDIA NVS 5100M/PCI/SSE2
NVIDIA NVS 5100M/PCI/SSE2
NVIDIA PCI
+NVIDIA Quadro 1000M/PCI/SSE2
+NVIDIA Quadro 2000/PCI/SSE2
NVIDIA Quadro 2000/PCI/SSE2
+NVIDIA Quadro 2000M/PCI/SSE2
+NVIDIA Quadro 3000M/PCI/SSE2
NVIDIA Quadro 4000
NVIDIA Quadro 4000 OpenGL Engine
NVIDIA Quadro 4000/PCI/SSE2
+NVIDIA Quadro 4000/PCI/SSE2
+NVIDIA Quadro 4000M/PCI/SSE2
+NVIDIA Quadro 5000/PCI/SSE2
NVIDIA Quadro 5000/PCI/SSE2
NVIDIA Quadro 5000M/PCI/SSE2
NVIDIA Quadro 600
NVIDIA Quadro 600/PCI/SSE2
+NVIDIA Quadro 600/PCI/SSE2
NVIDIA Quadro 600/PCI/SSE2/3DNOW!
NVIDIA Quadro 6000
NVIDIA Quadro 6000/PCI/SSE2
@@ -1390,16 +2097,22 @@ NVIDIA Quadro DCC
NVIDIA Quadro FX
NVIDIA Quadro FX 1100/AGP/SSE2
NVIDIA Quadro FX 1400/PCI/SSE2
+NVIDIA Quadro FX 1400/PCI/SSE2
NVIDIA Quadro FX 1500
+NVIDIA Quadro FX 1500/PCI/SSE2
NVIDIA Quadro FX 1500M/PCI/SSE2
NVIDIA Quadro FX 1600M/PCI/SSE2
+NVIDIA Quadro FX 1600M/PCI/SSE2
NVIDIA Quadro FX 1700
NVIDIA Quadro FX 1700M/PCI/SSE2
NVIDIA Quadro FX 1800
NVIDIA Quadro FX 1800/PCI/SSE2
NVIDIA Quadro FX 1800M/PCI/SSE2
NVIDIA Quadro FX 2500M/PCI/SSE2
+NVIDIA Quadro FX 2500M/PCI/SSE2
NVIDIA Quadro FX 2700M/PCI/SSE2
+NVIDIA Quadro FX 2700M/PCI/SSE2
+NVIDIA Quadro FX 2800M/PCI/SSE2
NVIDIA Quadro FX 2800M/PCI/SSE2
NVIDIA Quadro FX 3400
NVIDIA Quadro FX 3450
@@ -1411,75 +2124,125 @@ NVIDIA Quadro FX 370
NVIDIA Quadro FX 370/PCI/SSE2
NVIDIA Quadro FX 3700
NVIDIA Quadro FX 3700M/PCI/SSE2
+NVIDIA Quadro FX 3700M/PCI/SSE2
NVIDIA Quadro FX 370M/PCI/SSE2
NVIDIA Quadro FX 3800
NVIDIA Quadro FX 3800M/PCI/SSE2
+NVIDIA Quadro FX 3800M/PCI/SSE2
NVIDIA Quadro FX 4500
NVIDIA Quadro FX 4600
NVIDIA Quadro FX 4800
NVIDIA Quadro FX 4800/PCI/SSE2
+NVIDIA Quadro FX 540/PCI/SSE2/3DNOW!
NVIDIA Quadro FX 560
+NVIDIA Quadro FX 560/PCI/SSE2
NVIDIA Quadro FX 5600
NVIDIA Quadro FX 570
NVIDIA Quadro FX 570/PCI/SSE2
NVIDIA Quadro FX 570M/PCI/SSE2
NVIDIA Quadro FX 580/PCI/SSE2
+NVIDIA Quadro FX 580/PCI/SSE2
+NVIDIA Quadro FX 770M/PCI/SSE2
NVIDIA Quadro FX 770M/PCI/SSE2
NVIDIA Quadro FX 880M
NVIDIA Quadro FX 880M/PCI/SSE2
+NVIDIA Quadro FX 880M/PCI/SSE2
NVIDIA Quadro FX Go700/AGP/SSE2
NVIDIA Quadro NVS
NVIDIA Quadro NVS 110M/PCI/SSE2
+NVIDIA Quadro NVS 110M/PCI/SSE2
NVIDIA Quadro NVS 130M/PCI/SSE2
NVIDIA Quadro NVS 135M/PCI/SSE2
+NVIDIA Quadro NVS 135M/PCI/SSE2
+NVIDIA Quadro NVS 140M/PCI/SSE2
NVIDIA Quadro NVS 140M/PCI/SSE2
NVIDIA Quadro NVS 150M/PCI/SSE2
+NVIDIA Quadro NVS 150M/PCI/SSE2
+NVIDIA Quadro NVS 160M/PCI/SSE2
NVIDIA Quadro NVS 160M/PCI/SSE2
NVIDIA Quadro NVS 210S/PCI/SSE2/3DNOW!
NVIDIA Quadro NVS 285/PCI/SSE2
+NVIDIA Quadro NVS 285/PCI/SSE2
+NVIDIA Quadro NVS 290/PCI/SSE2
NVIDIA Quadro NVS 290/PCI/SSE2
NVIDIA Quadro NVS 295/PCI/SSE2
NVIDIA Quadro NVS 320M/PCI/SSE2
+NVIDIA Quadro NVS 320M/PCI/SSE2
NVIDIA Quadro NVS 55/280 PCI/PCI/SSE2
NVIDIA Quadro NVS/PCI/SSE2
NVIDIA Quadro PCI-E Series/PCI/SSE2/3DNOW!
NVIDIA Quadro VX 200/PCI/SSE2
+NVIDIA Quadro VX 200/PCI/SSE2
+NVIDIA Quadro/AGP/SSE2
NVIDIA Quadro/AGP/SSE2
NVIDIA Quadro2
NVIDIA Quadro4
+NVIDIA Quadro4 750 XGL/AGP/SSE2
NVIDIA RIVA TNT
NVIDIA RIVA TNT2/AGP/SSE2
NVIDIA RIVA TNT2/PCI/3DNOW!
+NVIDIA Tesla C2050/PCI/SSE2
NVIDIA nForce
+NVIDIA nForce 730a/PCI/SSE2
+NVIDIA nForce 730a/PCI/SSE2/3DNOW!
+NVIDIA nForce 750a SLI/PCI/SSE2
+NVIDIA nForce 750a SLI/PCI/SSE2/3DNOW!
+NVIDIA nForce 760i SLI/PCI/SSE2
+NVIDIA nForce 780a SLI/PCI/SSE2/3DNOW!
+NVIDIA nForce 980a/780a SLI/PCI/SSE2
+NVIDIA nForce 980a/780a SLI/PCI/SSE2/3DNOW!
NVIDIA unknown board/AGP/SSE2
NVIDIA unknown board/PCI/SSE2
NVIDIA unknown board/PCI/SSE2/3DNOW!
Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 5670 OpenGL Engine
+Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 5670 OpenGL Engine
+Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 5750 OpenGL Engine
Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 5750 OpenGL Engine
Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 5770 OpenGL Engine
+Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 5770 OpenGL Engine
+Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 6490M OpenGL Engine
Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 6490M OpenGL Engine
Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 6750M OpenGL Engine
+Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 6750M OpenGL Engine
+Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 6770M OpenGL Engine
+Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 6970M OpenGL Engine
Parallels and Intel Inc. 3D-Analyze v2.3 - http://www.tommti-systems.com
Parallels and Intel Inc. Parallels using Intel HD Graphics 3000 OpenGL Engine
+Parallels and Intel Inc. Parallels using Intel HD Graphics 3000 OpenGL Engine
+Parallels and NVIDIA Parallels using NVIDIA GeForce 320M OpenGL Engine
Parallels and NVIDIA Parallels using NVIDIA GeForce 320M OpenGL Engine
Parallels and NVIDIA Parallels using NVIDIA GeForce 9400 OpenGL Engine
Parallels and NVIDIA Parallels using NVIDIA GeForce GT 120 OpenGL Engine
+Parallels and NVIDIA Parallels using NVIDIA GeForce GT 120 OpenGL Engine
+Parallels and NVIDIA Parallels using NVIDIA GeForce GT 330M OpenGL Engine
Parallels and NVIDIA Parallels using NVIDIA GeForce GT 330M OpenGL Engine
Radeon RV350 on Gallium
S3
+S3 Fire GL2
S3 Graphics VIA/S3G UniChrome IGP/MMX/K3D
+S3 Graphics VIA/S3G UniChrome IGP/MMX/SSE
+S3 Graphics VIA/S3G UniChrome Pro IGP/MMX/SSE
S3 Graphics VIA/S3G UniChrome Pro IGP/MMX/SSE
S3 Graphics, Incorporated ProSavage/Twister
S3 Graphics, Incorporated S3 Graphics Chrome9 HC
+S3 Graphics, Incorporated S3 Graphics Chrome9 HC
S3 Graphics, Incorporated S3 Graphics DeltaChrome
+S3 Graphics, Incorporated S3 Graphics DeltaChrome
+S3 Graphics, Incorporated VIA Chrome9 HC IGP
S3 Graphics, Incorporated VIA Chrome9 HC IGP
SiS
+SiS 650/M650 VGA
+SiS 661 VGA
SiS 661 VGA
SiS 662 VGA
SiS 741 VGA
SiS 760 VGA
+SiS 760 VGA
+SiS 761GX VGA
SiS 761GX VGA
SiS Mirage Graphics3
+SiS Mirage Graphics3
+SiS Xabre VGA
Trident
Tungsten Graphics
Tungsten Graphics, Inc Mesa DRI 865G GEM 20091221 2009Q4 x86/MMX/SSE2
@@ -1489,6 +2252,7 @@ Tungsten Graphics, Inc Mesa DRI 915G GEM 20100330 DEVELOPMENT x86/MMX/SSE2
Tungsten Graphics, Inc Mesa DRI 915GM GEM 20090712 2009Q2 RC3 x86/MMX/SSE2
Tungsten Graphics, Inc Mesa DRI 915GM GEM 20091221 2009Q4 x86/MMX/SSE2
Tungsten Graphics, Inc Mesa DRI 915GM GEM 20100330 DEVELOPMENT x86/MMX/SSE2
+Tungsten Graphics, Inc Mesa DRI 915GM GEM 20100330 DEVELOPMENT x86/MMX/SSE2
Tungsten Graphics, Inc Mesa DRI 945G
Tungsten Graphics, Inc Mesa DRI 945G GEM 20091221 2009Q4 x86/MMX/SSE2
Tungsten Graphics, Inc Mesa DRI 945G GEM 20100330 DEVELOPMENT
@@ -1497,18 +2261,23 @@ Tungsten Graphics, Inc Mesa DRI 945GM GEM 20090712 2009Q2 RC3 x86/MMX/SSE2
Tungsten Graphics, Inc Mesa DRI 945GM GEM 20091221 2009Q4 x86/MMX/SSE2
Tungsten Graphics, Inc Mesa DRI 945GM GEM 20100328 2010Q1 x86/MMX/SSE2
Tungsten Graphics, Inc Mesa DRI 945GM GEM 20100330 DEVELOPMENT x86/MMX/SSE2
+Tungsten Graphics, Inc Mesa DRI 945GM GEM 20100330 DEVELOPMENT x86/MMX/SSE2
Tungsten Graphics, Inc Mesa DRI 945GME x86/MMX/SSE2
Tungsten Graphics, Inc Mesa DRI 945GME 20061017
Tungsten Graphics, Inc Mesa DRI 945GME GEM 20090712 2009Q2 RC3 x86/MMX/SSE2
Tungsten Graphics, Inc Mesa DRI 945GME GEM 20091221 2009Q4 x86/MMX/SSE2
Tungsten Graphics, Inc Mesa DRI 945GME GEM 20100330 DEVELOPMENT x86/MMX/SSE2
+Tungsten Graphics, Inc Mesa DRI 945GME GEM 20100330 DEVELOPMENT x86/MMX/SSE2
Tungsten Graphics, Inc Mesa DRI 965GM GEM 20090326 2009Q1 RC2 x86/MMX/SSE2
Tungsten Graphics, Inc Mesa DRI 965GM GEM 20090712 2009Q2 RC3 x86/MMX/SSE2
Tungsten Graphics, Inc Mesa DRI 965GM GEM 20091221 2009Q4 x86/MMX/SSE2
+Tungsten Graphics, Inc Mesa DRI 965GM GEM 20091221 2009Q4 x86/MMX/SSE2
+Tungsten Graphics, Inc Mesa DRI 965GM GEM 20100330 DEVELOPMENT x86/MMX/SSE2
Tungsten Graphics, Inc Mesa DRI 965GM GEM 20100330 DEVELOPMENT x86/MMX/SSE2
Tungsten Graphics, Inc Mesa DRI G33 20061017 x86/MMX/SSE2
Tungsten Graphics, Inc Mesa DRI G33 GEM 20090712 2009Q2 RC3 x86/MMX/SSE2
Tungsten Graphics, Inc Mesa DRI G33 GEM 20091221 2009Q4 x86/MMX/SSE2
+Tungsten Graphics, Inc Mesa DRI G33 GEM 20091221 2009Q4 x86/MMX/SSE2
Tungsten Graphics, Inc Mesa DRI G41 GEM 20091221 2009Q4 x86/MMX/SSE2
Tungsten Graphics, Inc Mesa DRI G41 GEM 20100330 DEVELOPMENT x86/MMX/SSE2
Tungsten Graphics, Inc Mesa DRI GMA500 20081116 - 5.0.1.0046 x86/MMX/SSE2
@@ -1518,44 +2287,83 @@ Tungsten Graphics, Inc Mesa DRI IGD GEM 20100330 DEVELOPMENT x86/MMX/SSE2
Tungsten Graphics, Inc Mesa DRI IGDNG_D GEM 20091221 2009Q4 x86/MMX/SSE2
Tungsten Graphics, Inc Mesa DRI Ironlake Desktop GEM 20100330 DEVELOPMENT x86/MMX/SSE2
Tungsten Graphics, Inc Mesa DRI Ironlake Mobile GEM 20100330 DEVELOPMENT x86/MMX/SSE2
+Tungsten Graphics, Inc Mesa DRI Mobile Intelå¨ GM45 Express Chipset
Tungsten Graphics, Inc Mesa DRI Mobile Intelå¨ GM45 Express Chipset 20080716 x86/MMX/SSE2
Tungsten Graphics, Inc Mesa DRI Mobile Intelå¨ GM45 Express Chipset GEM 20090712 2009Q2 RC3 x86/MMX/SSE2
Tungsten Graphics, Inc Mesa DRI Mobile Intelå¨ GM45 Express Chipset GEM 20091221 2009Q4 x86/MMX/SSE2
+Tungsten Graphics, Inc Mesa DRI Mobile Intelå¨ GM45 Express Chipset GEM 20091221 2009Q4 x86/MMX/SSE2
Tungsten Graphics, Inc Mesa DRI Mobile Intelå¨ GM45 Express Chipset GEM 20100328 2010Q1
Tungsten Graphics, Inc Mesa DRI Mobile Intelå¨ GM45 Express Chipset GEM 20100330 DEVELOPMENT
Tungsten Graphics, Inc Mesa DRI Mobile Intelå¨ GM45 Express Chipset GEM 20100330 DEVELOPMENT x86/MMX/SSE2
+Tungsten Graphics, Inc Mesa DRI Mobile Intelå¨ GM45 Express Chipset GEM 20100330 DEVELOPMENT x86/MMX/SSE2
+Tungsten Graphics, Inc. Mesa DRI R200 (RV250 4C66) 20090101 x86/MMX/SSE2 TCL DRI2
Tungsten Graphics, Inc. Mesa DRI R200 (RV280 5964) 20090101 x86/MMX+/3DNow!+/SSE2 TCL DRI2
VIA
VMware, Inc. Gallium 0.3 on SVGA3D; build: RELEASE;
+VMware, Inc. Gallium 0.3 on SVGA3D; build: RELEASE;
+VMware, Inc. Gallium 0.4 on SVGA3D; build: DEBUG; mutex: MSVC Intrinsics
+VMware, Inc. Gallium 0.4 on SVGA3D; build: RELEASE;
+VMware, Inc. Gallium 0.4 on i915 (chipset: 945GM)
VMware, Inc. Gallium 0.4 on i915 (chipset: 945GM)
VMware, Inc. Gallium 0.4 on llvmpipe
+VMware, Inc. Gallium 0.4 on llvmpipe
+VMware, Inc. Gallium 0.4 on softpipe
VMware, Inc. Gallium 0.4 on softpipe
X.Org Gallium 0.4 on AMD BARTS
+X.Org Gallium 0.4 on AMD BARTS
+X.Org Gallium 0.4 on AMD CEDAR
X.Org Gallium 0.4 on AMD CEDAR
X.Org Gallium 0.4 on AMD HEMLOCK
X.Org Gallium 0.4 on AMD JUNIPER
+X.Org Gallium 0.4 on AMD JUNIPER
+X.Org Gallium 0.4 on AMD PALM
+X.Org Gallium 0.4 on AMD REDWOOD
X.Org Gallium 0.4 on AMD REDWOOD
X.Org Gallium 0.4 on AMD RS780
+X.Org Gallium 0.4 on AMD RS780
+X.Org Gallium 0.4 on AMD RS880
X.Org Gallium 0.4 on AMD RS880
X.Org Gallium 0.4 on AMD RV610
+X.Org Gallium 0.4 on AMD RV610
+X.Org Gallium 0.4 on AMD RV620
X.Org Gallium 0.4 on AMD RV620
X.Org Gallium 0.4 on AMD RV630
+X.Org Gallium 0.4 on AMD RV630
X.Org Gallium 0.4 on AMD RV635
+X.Org Gallium 0.4 on AMD RV635
+X.Org Gallium 0.4 on AMD RV710
X.Org Gallium 0.4 on AMD RV710
X.Org Gallium 0.4 on AMD RV730
+X.Org Gallium 0.4 on AMD RV730
+X.Org Gallium 0.4 on AMD RV740
X.Org Gallium 0.4 on AMD RV740
X.Org Gallium 0.4 on AMD RV770
X.Org R300 Project Gallium 0.4 on ATI R300
+X.Org R300 Project Gallium 0.4 on ATI R350
+X.Org R300 Project Gallium 0.4 on ATI R420
+X.Org R300 Project Gallium 0.4 on ATI R580
X.Org R300 Project Gallium 0.4 on ATI R580
X.Org R300 Project Gallium 0.4 on ATI RC410
+X.Org R300 Project Gallium 0.4 on ATI RC410
+X.Org R300 Project Gallium 0.4 on ATI RS480
+X.Org R300 Project Gallium 0.4 on ATI RS482
X.Org R300 Project Gallium 0.4 on ATI RS482
X.Org R300 Project Gallium 0.4 on ATI RS600
X.Org R300 Project Gallium 0.4 on ATI RS690
+X.Org R300 Project Gallium 0.4 on ATI RS690
+X.Org R300 Project Gallium 0.4 on ATI RS740
X.Org R300 Project Gallium 0.4 on ATI RV350
+X.Org R300 Project Gallium 0.4 on ATI RV350
+X.Org R300 Project Gallium 0.4 on ATI RV370
X.Org R300 Project Gallium 0.4 on ATI RV370
X.Org R300 Project Gallium 0.4 on ATI RV410
+X.Org R300 Project Gallium 0.4 on ATI RV410
X.Org R300 Project Gallium 0.4 on ATI RV515
+X.Org R300 Project Gallium 0.4 on ATI RV515
+X.Org R300 Project Gallium 0.4 on ATI RV530
X.Org R300 Project Gallium 0.4 on ATI RV530
+X.Org R300 Project Gallium 0.4 on ATI RV560
+X.Org R300 Project Gallium 0.4 on ATI RV570
X.Org R300 Project Gallium 0.4 on ATI RV570
X.Org R300 Project Gallium 0.4 on R420
X.Org R300 Project Gallium 0.4 on R580
@@ -1571,23 +2379,44 @@ X.Org R300 Project Gallium 0.4 on RV410
X.Org R300 Project Gallium 0.4 on RV515
X.Org R300 Project Gallium 0.4 on RV530
XGI
+nouveau Gallium 0.4 on NV31
+nouveau Gallium 0.4 on NV34
nouveau Gallium 0.4 on NV34
nouveau Gallium 0.4 on NV36
+nouveau Gallium 0.4 on NV43
+nouveau Gallium 0.4 on NV44
+nouveau Gallium 0.4 on NV46
nouveau Gallium 0.4 on NV46
nouveau Gallium 0.4 on NV49
nouveau Gallium 0.4 on NV4A
+nouveau Gallium 0.4 on NV4A
nouveau Gallium 0.4 on NV4B
+nouveau Gallium 0.4 on NV4B
+nouveau Gallium 0.4 on NV4C
nouveau Gallium 0.4 on NV4E
nouveau Gallium 0.4 on NV50
+nouveau Gallium 0.4 on NV63
+nouveau Gallium 0.4 on NV67
+nouveau Gallium 0.4 on NV84
nouveau Gallium 0.4 on NV84
nouveau Gallium 0.4 on NV86
+nouveau Gallium 0.4 on NV86
+nouveau Gallium 0.4 on NV92
nouveau Gallium 0.4 on NV92
nouveau Gallium 0.4 on NV94
+nouveau Gallium 0.4 on NV94
nouveau Gallium 0.4 on NV96
+nouveau Gallium 0.4 on NV96
+nouveau Gallium 0.4 on NV98
nouveau Gallium 0.4 on NV98
nouveau Gallium 0.4 on NVA0
+nouveau Gallium 0.4 on NVA0
nouveau Gallium 0.4 on NVA3
nouveau Gallium 0.4 on NVA5
+nouveau Gallium 0.4 on NVA5
+nouveau Gallium 0.4 on NVA8
nouveau Gallium 0.4 on NVA8
nouveau Gallium 0.4 on NVAA
+nouveau Gallium 0.4 on NVAA
+nouveau Gallium 0.4 on NVAC
nouveau Gallium 0.4 on NVAC
diff --git a/indra/newview/tests/lltranslate_test.cpp b/indra/newview/tests/lltranslate_test.cpp
new file mode 100644
index 0000000000..10e37fae97
--- /dev/null
+++ b/indra/newview/tests/lltranslate_test.cpp
@@ -0,0 +1,345 @@
+/**
+ * @file lltranslate_test.cpp
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "linden_common.h"
+
+#include "../test/lltut.h"
+#include "../lltranslate.h"
+#include "../llversioninfo.h"
+#include "../llviewercontrol.h"
+
+#include "llbufferstream.h"
+#include "lltrans.h"
+#include "llui.h"
+
+static const std::string GOOGLE_VALID_RESPONSE1 =
+"{\
+ \"data\": {\
+ \"translations\": [\
+ {\
+ \"translatedText\": \"привет\",\
+ \"detectedSourceLanguage\": \"es\"\
+ }\
+ ]\
+ }\
+}";
+
+static const std::string GOOGLE_VALID_RESPONSE2 =
+"{\
+ \"data\": {\
+ \"translations\": [\
+ {\
+ \"translatedText\": \"привет\"\
+ }\
+ ]\
+ }\
+}\
+";
+
+static const std::string GOOGLE_VALID_RESPONSE3 =
+"{\
+ \"error\": {\
+ \"errors\": [\
+ {\
+ \"domain\": \"global\",\
+ \"reason\": \"invalid\",\
+ \"message\": \"Invalid Value\"\
+ }\
+ ],\
+ \"code\": 400,\
+ \"message\": \"Invalid Value\"\
+ }\
+}";
+
+static const std::string BING_VALID_RESPONSE1 =
+"<string xmlns=\"http://schemas.microsoft.com/2003/10/Serialization/\">Привет</string>";
+
+static const std::string BING_VALID_RESPONSE2 =
+"<html><body><h1>Argument Exception</h1><p>Method: Translate()</p><p>Parameter: </p>\
+<p>Message: 'from' must be a valid language</p><code></code>\
+<p>message id=3743.V2_Rest.Translate.58E8454F</p></body></html>";
+
+static const std::string BING_VALID_RESPONSE3 =
+"<html><body><h1>Argument Exception</h1><p>Method: Translate()</p>\
+<p>Parameter: appId</p><p>Message: Invalid appId&#xD;\nParameter name: appId</p>\
+<code></code><p>message id=3737.V2_Rest.Translate.56016759</p></body></html>";
+
+namespace tut
+{
+ class translate_test
+ {
+ protected:
+ void test_translation(
+ LLTranslationAPIHandler& handler,
+ int status, const std::string& resp,
+ const std::string& exp_trans, const std::string& exp_lang, const std::string& exp_err)
+ {
+ std::string translation, detected_lang, err_msg;
+ bool rc = handler.parseResponse(status, resp, translation, detected_lang, err_msg);
+ ensure_equals("rc", rc, (status == 200));
+ ensure_equals("err_msg", err_msg, exp_err);
+ ensure_equals("translation", translation, exp_trans);
+ ensure_equals("detected_lang", detected_lang, exp_lang);
+ }
+
+ LLGoogleTranslationHandler mGoogle;
+ LLBingTranslationHandler mBing;
+ };
+
+ typedef test_group<translate_test> translate_test_group_t;
+ typedef translate_test_group_t::object translate_test_object_t;
+ tut::translate_test_group_t tut_translate("LLTranslate");
+
+ template<> template<>
+ void translate_test_object_t::test<1>()
+ {
+ test_translation(mGoogle, 200, GOOGLE_VALID_RESPONSE1, "привет", "es", "");
+ }
+
+ template<> template<>
+ void translate_test_object_t::test<2>()
+ {
+ test_translation(mGoogle, 200, GOOGLE_VALID_RESPONSE2, "привет", "", "");
+ }
+
+ template<> template<>
+ void translate_test_object_t::test<3>()
+ {
+ test_translation(mGoogle, 400, GOOGLE_VALID_RESPONSE3, "", "", "Invalid Value");
+ }
+
+ template<> template<>
+ void translate_test_object_t::test<4>()
+ {
+ test_translation(mGoogle, 400,
+ "",
+ "", "", "* Line 1, Column 1\n Syntax error: value, object or array expected.\n");
+ }
+
+ template<> template<>
+ void translate_test_object_t::test<5>()
+ {
+ test_translation(mGoogle, 400,
+ "[]",
+ "", "", "");
+ }
+
+ template<> template<>
+ void translate_test_object_t::test<6>()
+ {
+ test_translation(mGoogle, 400,
+ "{\"oops\": \"invalid\"}",
+ "", "", "");
+ }
+
+ template<> template<>
+ void translate_test_object_t::test<7>()
+ {
+ test_translation(mGoogle, 400,
+ "{\"data\": {}}",
+ "", "", "");
+ }
+
+ template<> template<>
+ void translate_test_object_t::test<8>()
+ {
+ test_translation(mGoogle, 400,
+ "{\"data\": { \"translations\": [ {} ] }}",
+ "", "", "");
+ }
+
+ template<> template<>
+ void translate_test_object_t::test<9>()
+ {
+ test_translation(mGoogle, 400,
+ "{\"data\": { \"translations\": [ { \"translatedTextZZZ\": \"привет\", \"detectedSourceLanguageZZZ\": \"es\" } ] }}",
+ "", "", "");
+ }
+
+ template<> template<>
+ void translate_test_object_t::test<10>()
+ {
+ test_translation(mBing, 200, BING_VALID_RESPONSE1, "Привет", "", "");
+ }
+
+ template<> template<>
+ void translate_test_object_t::test<11>()
+ {
+ test_translation(mBing, 400, BING_VALID_RESPONSE2, "", "", "'from' must be a valid language");
+ }
+
+ template<> template<>
+ void translate_test_object_t::test<12>()
+ {
+ test_translation(mBing, 400, BING_VALID_RESPONSE3, "", "", "Invalid appId\nParameter name: appId");
+ }
+
+ template<> template<>
+ void translate_test_object_t::test<13>()
+ {
+ test_translation(mBing, 200,
+ "Привет</string>",
+ "Привет", "", "");
+ }
+
+ template<> template<>
+ void translate_test_object_t::test<14>()
+ {
+ test_translation(mBing, 200,
+ "<string xmlns=\"http://schemas.microsoft.com/2003/10/Serialization/\">Привет",
+ "Привет", "", "");
+ }
+
+ template<> template<>
+ void translate_test_object_t::test<15>()
+ {
+ test_translation(mBing, 200,
+ "Привет",
+ "Привет", "", "");
+ }
+
+ template<> template<>
+ void translate_test_object_t::test<16>()
+ {
+ test_translation(mBing, 400,
+ "Message: some error</p>",
+ "", "", "some error");
+ }
+
+ template<> template<>
+ void translate_test_object_t::test<17>()
+ {
+ test_translation(mBing, 400,
+ "Message: some error",
+ "", "", "some error");
+ }
+
+ template<> template<>
+ void translate_test_object_t::test<18>()
+ {
+ test_translation(mBing, 400,
+ "some error</p>",
+ "", "", "some error");
+ }
+
+ template<> template<>
+ void translate_test_object_t::test<19>()
+ {
+ test_translation(mBing, 400,
+ "some error",
+ "", "", "some error");
+ }
+
+ template<> template<>
+ void translate_test_object_t::test<20>()
+ {
+ std::string url;
+ mBing.getTranslateURL(url, "en", "es", "hi");
+ ensure_equals("bing URL", url,
+ "http://api.microsofttranslator.com/v2/Http.svc/Translate?appId=dummy&text=hi&to=es&from=en");
+ }
+
+ template<> template<>
+ void translate_test_object_t::test<21>()
+ {
+ std::string url;
+ mBing.getTranslateURL(url, "", "es", "hi");
+ ensure_equals("bing URL", url,
+ "http://api.microsofttranslator.com/v2/Http.svc/Translate?appId=dummy&text=hi&to=es");
+ }
+
+ template<> template<>
+ void translate_test_object_t::test<22>()
+ {
+ std::string url;
+ mGoogle.getTranslateURL(url, "en", "es", "hi");
+ ensure_equals("google URL", url,
+ "https://www.googleapis.com/language/translate/v2?key=dummy&q=hi&target=es&source=en");
+ }
+
+ template<> template<>
+ void translate_test_object_t::test<23>()
+ {
+ std::string url;
+ mGoogle.getTranslateURL(url, "", "es", "hi");
+ ensure_equals("google URL", url,
+ "https://www.googleapis.com/language/translate/v2?key=dummy&q=hi&target=es");
+ }
+}
+
+//== Misc stubs ===============================================================
+LLControlGroup gSavedSettings("test");
+
+std::string LLUI::getLanguage() { return "en"; }
+std::string LLTrans::getString(const std::string &xml_desc, const LLStringUtil::format_map_t& args) { return "dummy"; }
+
+LLControlGroup::LLControlGroup(const std::string& name) : LLInstanceTracker<LLControlGroup, std::string>(name) {}
+std::string LLControlGroup::getString(const std::string& name) { return "dummy"; }
+LLControlGroup::~LLControlGroup() {}
+
+namespace boost {
+ void intrusive_ptr_add_ref(LLCurl::Responder*) {}
+ void intrusive_ptr_release(LLCurl::Responder*) {}
+}
+
+LLCurl::Responder::Responder() {}
+void LLCurl::Responder::completedHeader(U32, std::string const&, LLSD const&) {}
+void LLCurl::Responder::completedRaw(U32, const std::string&, const LLChannelDescriptors&, const LLIOPipe::buffer_ptr_t& buffer) {}
+void LLCurl::Responder::completed(U32, std::string const&, LLSD const&) {}
+void LLCurl::Responder::error(U32, std::string const&) {}
+void LLCurl::Responder::errorWithContent(U32, std::string const&, LLSD const&) {}
+void LLCurl::Responder::result(LLSD const&) {}
+LLCurl::Responder::~Responder() {}
+
+void LLHTTPClient::get(const std::string&, const LLSD&, ResponderPtr, const LLSD&, const F32) {}
+void LLHTTPClient::get(const std::string&, boost::intrusive_ptr<LLCurl::Responder>, const LLSD&, const F32) {}
+
+LLBufferStream::LLBufferStream(const LLChannelDescriptors& channels, LLBufferArray* buffer)
+: std::iostream(&mStreamBuf), mStreamBuf(channels, buffer) {}
+LLBufferStream::~LLBufferStream() {}
+
+LLBufferStreamBuf::LLBufferStreamBuf(const LLChannelDescriptors&, LLBufferArray*) {}
+#if( LL_WINDOWS || __GNUC__ > 2)
+LLBufferStreamBuf::pos_type LLBufferStreamBuf::seekoff(
+ off_type off,
+ std::ios::seekdir way,
+ std::ios::openmode which)
+#else
+streampos LLBufferStreamBuf::seekoff(
+ streamoff off,
+ std::ios::seekdir way,
+ std::ios::openmode which)
+#endif
+{ return 0; }
+int LLBufferStreamBuf::sync() {return 0;}
+int LLBufferStreamBuf::underflow() {return 0;}
+int LLBufferStreamBuf::overflow(int) {return 0;}
+LLBufferStreamBuf::~LLBufferStreamBuf() {}
+
+S32 LLVersionInfo::getBuild() { return 0; }
+const std::string& LLVersionInfo::getChannel() {static std::string dummy; return dummy;}
+S32 LLVersionInfo::getMajor() { return 0; }
+S32 LLVersionInfo::getMinor() { return 0; }
+S32 LLVersionInfo::getPatch() { return 0; }
diff --git a/indra/newview/tests/llworldmap_test.cpp b/indra/newview/tests/llworldmap_test.cpp
index 102294959a..acc6e814bc 100644
--- a/indra/newview/tests/llworldmap_test.cpp
+++ b/indra/newview/tests/llworldmap_test.cpp
@@ -27,6 +27,7 @@
// Dependencies
#include "linden_common.h"
+#include "llapr.h"
#include "llsingleton.h"
#include "lltrans.h"
#include "lluistring.h"
diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py
index 8da1be2769..8da1be2769 100755..100644
--- a/indra/newview/viewer_manifest.py
+++ b/indra/newview/viewer_manifest.py
diff --git a/indra/test/CMakeLists.txt b/indra/test/CMakeLists.txt
index e9eb3c1884..328ab4ca51 100644
--- a/indra/test/CMakeLists.txt
+++ b/indra/test/CMakeLists.txt
@@ -4,7 +4,6 @@ project (test)
include(00-Common)
include(LLCommon)
-include(LLDatabase)
include(LLInventory)
include(LLMath)
include(LLMessage)
@@ -32,7 +31,7 @@ include_directories(
set(test_SOURCE_FILES
io.cpp
-# llapp_tut.cpp # Temporarily removed until thread issues can be solved
+ llapp_tut.cpp
llblowfish_tut.cpp
llbuffer_tut.cpp
lldoubledispatch_tut.cpp
@@ -53,8 +52,6 @@ set(test_SOURCE_FILES
llservicebuilder_tut.cpp
llstreamtools_tut.cpp
lltemplatemessagebuilder_tut.cpp
- lltimestampcache_tut.cpp
- lltranscode_tut.cpp
lltut.cpp
lluuidhashmap_tut.cpp
message_tut.cpp
@@ -76,12 +73,6 @@ if (NOT WINDOWS)
)
endif (NOT WINDOWS)
-if (NOT DARWIN)
- list(APPEND test_SOURCE_FILES
- lldatabase_tut.cpp
- )
-endif (NOT DARWIN)
-
set_source_files_properties(${test_HEADER_FILES}
PROPERTIES HEADER_FILE_ONLY TRUE)
@@ -100,7 +91,6 @@ target_link_libraries(test
${LLCOMMON_LIBRARIES}
${EXPAT_LIBRARIES}
${GOOGLEMOCK_LIBRARIES}
- ${APRICONV_LIBRARIES}
${PTHREAD_LIBRARY}
${WINDOWS_LIBRARIES}
${BOOST_PROGRAM_OPTIONS_LIBRARY}
@@ -119,38 +109,28 @@ endif (WINDOWS)
get_target_property(TEST_EXE test LOCATION)
-SET_TEST_PATH(LD_LIBRARY_PATH)
-LL_TEST_COMMAND(command "${LD_LIBRARY_PATH}"
- "${TEST_EXE}" "--output=${CMAKE_CURRENT_BINARY_DIR}/cpp_test_results.txt" "--touch=${CMAKE_CURRENT_BINARY_DIR}/cpp_tests_ok.txt")
+SET_TEST_PATH(DYLD_LIBRARY_PATH)
+
+LL_TEST_COMMAND(command
+ "${DYLD_LIBRARY_PATH}"
+ "${TEST_EXE}"
+ "--output=${CMAKE_CURRENT_BINARY_DIR}/cpp_test_results.txt"
+ "--touch=${CMAKE_CURRENT_BINARY_DIR}/cpp_tests_ok.txt")
+
ADD_CUSTOM_COMMAND(
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/cpp_tests_ok.txt
COMMAND ${command}
DEPENDS test
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
COMMENT "C++ unit tests"
- )
+ )
set(test_results ${CMAKE_CURRENT_BINARY_DIR}/cpp_tests_ok.txt)
-if (EXISTS /etc/debian_version_FAIL)
- # The Python tests have all kinds of wacky non-portable assumptions
- # built in.
-
- add_custom_command(
- OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/py_tests_ok.txt
- COMMAND ${PYTHON_EXECUTABLE}
- ARGS
- ${CMAKE_CURRENT_SOURCE_DIR}/test.py
- --mode=static
- --output=${CMAKE_CURRENT_BINARY_DIR}/py_test_results.txt
- --touch=${CMAKE_CURRENT_BINARY_DIR}/py_tests_ok.txt
- --mode=static
- DEPENDS test.py
- WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
- COMMENT "Python unit tests"
- )
-
- list(APPEND test_results ${CMAKE_CURRENT_BINARY_DIR}/py_tests_ok.txt)
-endif (EXISTS /etc/debian_version_FAIL)
-
-add_custom_target(tests_ok ALL DEPENDS ${test_results})
+# This should cause the test executable to be built, but not
+# run if LL_TESTS is disabled. This will hopefully keep the
+# tests up to date with any code changes changes even if
+# developers choose to disable LL_TESTS.
+if (LL_TESTS)
+ add_custom_target(tests_ok ALL DEPENDS ${test_results})
+endif (LL_TESTS)
diff --git a/indra/test/catch_and_store_what_in.h b/indra/test/catch_and_store_what_in.h
new file mode 100644
index 0000000000..59f8cc0085
--- /dev/null
+++ b/indra/test/catch_and_store_what_in.h
@@ -0,0 +1,86 @@
+/**
+ * @file catch_and_store_what_in.h
+ * @author Nat Goodspeed
+ * @date 2012-02-15
+ * @brief CATCH_AND_STORE_WHAT_IN() macro
+ *
+ * $LicenseInfo:firstyear=2012&license=viewerlgpl$
+ * Copyright (c) 2012, Linden Research, Inc.
+ * $/LicenseInfo$
+ */
+
+#if ! defined(LL_CATCH_AND_STORE_WHAT_IN_H)
+#define LL_CATCH_AND_STORE_WHAT_IN_H
+
+/**
+ * Idiom useful for test programs: catch an expected exception, store its
+ * what() string in a specified std::string variable. From there the caller
+ * can do things like:
+ * @code
+ * ensure("expected exception not thrown", ! string.empty());
+ * @endcode
+ * or
+ * @code
+ * ensure_contains("exception doesn't mention blah", string, "blah");
+ * @endcode
+ * etc.
+ *
+ * The trouble is that when linking to a dynamic libllcommon.so on Linux, we
+ * generally fail to catch the specific exception. Oddly, we can catch it as
+ * std::runtime_error and validate its typeid().name(), so we do -- but that's
+ * a lot of boilerplate per test. Encapsulate with this macro. Usage:
+ *
+ * @code
+ * std::string threw;
+ * try
+ * {
+ * some_call_that_should_throw_Foo();
+ * }
+ * CATCH_AND_STORE_WHAT_IN(threw, Foo)
+ * ensure("some_call_that_should_throw_Foo() didn't throw", ! threw.empty());
+ * @endcode
+ */
+#define CATCH_AND_STORE_WHAT_IN(THREW, EXCEPTION) \
+catch (const EXCEPTION& ex) \
+{ \
+ (THREW) = ex.what(); \
+} \
+CATCH_MISSED_LINUX_EXCEPTION(THREW, EXCEPTION)
+
+#ifndef LL_LINUX
+#define CATCH_MISSED_LINUX_EXCEPTION(THREW, EXCEPTION) \
+ /* only needed on Linux */
+#else // LL_LINUX
+
+#define CATCH_MISSED_LINUX_EXCEPTION(THREW, EXCEPTION) \
+catch (const std::runtime_error& ex) \
+{ \
+ /* This clause is needed on Linux, on the viewer side, because */ \
+ /* the exception isn't caught by catch (const EXCEPTION&). */ \
+ /* But if the expected exception was thrown, allow the test to */ \
+ /* succeed anyway. Not sure how else to handle this odd case. */ \
+ if (std::string(typeid(ex).name()) == typeid(EXCEPTION).name()) \
+ { \
+ /* std::cerr << "Caught " << typeid(ex).name() */ \
+ /* << " with Linux workaround" << std::endl; */ \
+ (THREW) = ex.what(); \
+ /*std::cout << ex.what() << std::endl;*/ \
+ } \
+ else \
+ { \
+ /* We don't even recognize this exception. Let it propagate */ \
+ /* out to TUT to fail the test. */ \
+ throw; \
+ } \
+} \
+catch (...) \
+{ \
+ std::cerr << "Failed to catch expected exception " \
+ << #EXCEPTION << "!" << std::endl; \
+ /* This indicates a problem in the test that should be addressed. */ \
+ throw; \
+}
+
+#endif // LL_LINUX
+
+#endif /* ! defined(LL_CATCH_AND_STORE_WHAT_IN_H) */
diff --git a/indra/test/io.cpp b/indra/test/io.cpp
index c06c1b153b..ce747f667d 100644
--- a/indra/test/io.cpp
+++ b/indra/test/io.cpp
@@ -909,7 +909,7 @@ namespace tut
pipe_and_pump_fitness()
{
- LLFrameTimer::updateFrameTime();
+ LLFrameTimer::updateFrameTime();
apr_pool_create(&mPool, NULL);
mPump = new LLPumpIO(mPool);
mSocket = LLSocket::create(
diff --git a/indra/test/llapp_tut.cpp b/indra/test/llapp_tut.cpp
new file mode 100644
index 0000000000..aa5c0672e6
--- /dev/null
+++ b/indra/test/llapp_tut.cpp
@@ -0,0 +1,162 @@
+/**
+ * @file llapp_tut.cpp
+ * @author Phoenix
+ * @date 2006-09-12
+ *
+ * $LicenseInfo:firstyear=2006&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2006-2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include <tut/tut.hpp>
+
+#include "linden_common.h"
+#include "llapp.h"
+#include "lltut.h"
+
+
+namespace tut
+{
+ struct application
+ {
+ class LLTestApp : public LLApp
+ {
+ public:
+ virtual bool init() { return true; }
+ virtual bool cleanup() { return true; }
+ virtual bool mainLoop() { return true; }
+ };
+ LLTestApp* mApp;
+ application()
+ {
+ mApp = new LLTestApp;
+ }
+ ~application()
+ {
+ delete mApp;
+ }
+ };
+
+ typedef test_group<application> application_t;
+ typedef application_t::object application_object_t;
+ tut::application_t tut_application("application");
+
+ template<> template<>
+ void application_object_t::test<1>()
+ {
+ LLSD defaults;
+ defaults["template"] = "../../../scripts/messages/message_template.msg";
+ defaults["configdir"] = ".";
+ defaults["datadir"] = "data";
+ mApp->setOptionData(LLApp::PRIORITY_DEFAULT, defaults);
+
+ LLSD datadir_sd = mApp->getOption("datadir");
+ ensure_equals("data type", datadir_sd.type(), LLSD::TypeString);
+ ensure_equals(
+ "data value", datadir_sd.asString(), std::string("data"));
+ }
+
+ template<> template<>
+ void application_object_t::test<2>()
+ {
+ const int ARGC = 13;
+ const char* ARGV[ARGC] =
+ {
+ "", // argv[0] is usually the application name
+ "-crashcount",
+ "2",
+ "-space",
+ "spaceserver.grid.lindenlab.com",
+ "-db_host",
+ "localhost",
+ "--allowlslhttprequests",
+ "-asset-uri",
+ "http://test.lindenlab.com/assets",
+ "-data",
+ "127.0.0.1",
+ "--smtp"
+ };
+ bool ok = mApp->parseCommandOptions(ARGC, const_cast<char**>(ARGV));
+ ensure("command line parsed", ok);
+ ensure_equals(
+ "crashcount", mApp->getOption("crashcount").asInteger(), 2);
+ ensure_equals(
+ "space",
+ mApp->getOption("space").asString(),
+ std::string("spaceserver.grid.lindenlab.com"));
+ ensure_equals(
+ "db_host",
+ mApp->getOption("db_host").asString(),
+ std::string("localhost"));
+ ensure("allowlshlttprequests", mApp->getOption("smtp"));
+ ensure_equals(
+ "asset-uri",
+ mApp->getOption("asset-uri").asString(),
+ std::string("http://test.lindenlab.com/assets"));
+ ensure_equals(
+ "data",
+ mApp->getOption("data").asString(),
+ std::string("127.0.0.1"));
+ ensure("smtp", mApp->getOption("smtp"));
+ }
+
+ template<> template<>
+ void application_object_t::test<3>()
+ {
+ const int ARGC = 4;
+ const char* ARGV[ARGC] =
+ {
+ "", // argv[0] is usually the application name
+ "crashcount",
+ "2",
+ "--space"
+ };
+ bool ok = mApp->parseCommandOptions(ARGC, const_cast<char**>(ARGV));
+ ensure("command line parse failure", !ok);
+ }
+
+ template<> template<>
+ void application_object_t::test<4>()
+ {
+ const int ARGC = 4;
+ const char* ARGV[ARGC] =
+ {
+ "", // argv[0] is usually the application name
+ "--crashcount",
+ "2",
+ "space"
+ };
+ bool ok = mApp->parseCommandOptions(ARGC, const_cast<char**>(ARGV));
+ ensure("command line parse failure", !ok);
+ }
+
+
+ template<> template<>
+ void application_object_t::test<5>()
+ {
+ LLSD options;
+ options["boolean-test"] = true;
+ mApp->setOptionData(LLApp::PRIORITY_GENERAL_CONFIGURATION, options);
+ ensure("bool set", mApp->getOption("boolean-test").asBoolean());
+ options["boolean-test"] = false;
+ mApp->setOptionData(LLApp::PRIORITY_RUNTIME_OVERRIDE, options);
+ ensure("bool unset", !mApp->getOption("boolean-test").asBoolean());
+ }
+}
diff --git a/indra/test/llevents_tut.cpp b/indra/test/llevents_tut.cpp
index 57e22bbb56..a9114075fc 100644
--- a/indra/test/llevents_tut.cpp
+++ b/indra/test/llevents_tut.cpp
@@ -49,691 +49,677 @@
#include <boost/assign/list_of.hpp>
// other Linden headers
#include "lltut.h"
+#include "catch_and_store_what_in.h"
#include "stringize.h"
#include "tests/listener.h"
using boost::assign::list_of;
template<typename T>
-T make(const T& value) { return value; }
+T make(const T& value)
+{
+ return value;
+}
/*****************************************************************************
-* tut test group
-*****************************************************************************/
+ * tut test group
+ *****************************************************************************/
namespace tut
{
- struct events_data
- {
- events_data():
- pumps(LLEventPumps::instance()),
- listener0("first"),
- listener1("second")
- {}
- LLEventPumps& pumps;
- Listener listener0;
- Listener listener1;
+struct events_data
+{
+ events_data() :
+ pumps(LLEventPumps::instance()),
+ listener0("first"),
+ listener1("second")
+ {
+ }
+ LLEventPumps& pumps;
+ Listener listener0;
+ Listener listener1;
- void check_listener(const std::string& desc, const Listener& listener, LLSD::Integer got)
- {
- ensure_equals(STRINGIZE(listener << ' ' << desc),
- listener.getLastEvent().asInteger(), got);
- }
- };
- typedef test_group<events_data> events_group;
- typedef events_group::object events_object;
- tut::events_group evgr("events");
+ void check_listener(const std::string& desc, const Listener& listener, LLSD::Integer got)
+ {
+ ensure_equals(STRINGIZE(listener << ' ' << desc),
+ listener.getLastEvent().asInteger(), got);
+ }
+};
+typedef test_group<events_data> events_group;
+typedef events_group::object events_object;
+tut::events_group evgr("events");
- template<> template<>
- void events_object::test<1>()
- {
- set_test_name("basic operations");
- // Now there's a static constructor in llevents.cpp that registers on
- // the "mainloop" pump to call LLEventPumps::flush().
- // Actually -- having to modify this to track the statically-
- // constructed pumps in other TUT modules in this giant monolithic test
- // executable isn't such a hot idea.
-// ensure_equals("initial pump", pumps.mPumpMap.size(), 1);
- size_t initial_pumps(pumps.mPumpMap.size());
- LLEventPump& per_frame(pumps.obtain("per-frame"));
- ensure_equals("first explicit pump", pumps.mPumpMap.size(), initial_pumps+1);
- // Verify that per_frame was instantiated as an LLEventStream.
- ensure("LLEventStream leaf class", dynamic_cast<LLEventStream*>(&per_frame));
- ensure("enabled", per_frame.enabled());
- // Trivial test, but posting an event to an EventPump with no
- // listeners should not blow up. The test is relevant because defining
- // a boost::signal with a non-void return signature, using the default
- // combiner, blows up if there are no listeners. This is because the
- // default combiner is defined to return the value returned by the
- // last listener, which is meaningless if there were no listeners.
- per_frame.post(0);
- LLBoundListener connection = listener0.listenTo(per_frame);
- ensure("connected", connection.connected());
- ensure("not blocked", ! connection.blocked());
- per_frame.post(1);
- check_listener("received", listener0, 1);
- { // block the connection
- LLEventPump::Blocker block(connection);
- ensure("blocked", connection.blocked());
- per_frame.post(2);
- check_listener("not updated", listener0, 1);
- } // unblock
- ensure("unblocked", ! connection.blocked());
- per_frame.post(3);
- check_listener("unblocked", listener0, 3);
- LLBoundListener sameConnection = per_frame.getListener(listener0.getName());
- ensure("still connected", sameConnection.connected());
- ensure("still not blocked", ! sameConnection.blocked());
- { // block it again
- LLEventPump::Blocker block(sameConnection);
- ensure("re-blocked", sameConnection.blocked());
- per_frame.post(4);
- check_listener("re-blocked", listener0, 3);
- } // unblock
- bool threw = false;
- try
- {
- // NOTE: boost::bind() saves its arguments by VALUE! If you pass
- // an object instance rather than a pointer, you'll end up binding
- // to an internal copy of that instance! Use boost::ref() to
- // capture a reference instead.
- per_frame.listen(listener0.getName(), // note bug, dup name
- boost::bind(&Listener::call, boost::ref(listener1), _1));
- }
- catch (const LLEventPump::DupListenerName& e)
- {
- threw = true;
- ensure_equals(e.what(),
- std::string("DupListenerName: "
- "Attempt to register duplicate listener name '") +
- listener0.getName() +
- "' on " + typeid(per_frame).name() + " '" + per_frame.getName() + "'");
- }
- ensure("threw DupListenerName", threw);
- // do it right this time
- listener1.listenTo(per_frame);
- per_frame.post(5);
- check_listener("got", listener0, 5);
- check_listener("got", listener1, 5);
- per_frame.enable(false);
- per_frame.post(6);
- check_listener("didn't get", listener0, 5);
- check_listener("didn't get", listener1, 5);
- per_frame.enable();
- per_frame.post(7);
- check_listener("got", listener0, 7);
- check_listener("got", listener1, 7);
- per_frame.stopListening(listener0.getName());
- ensure("disconnected 0", ! connection.connected());
- ensure("disconnected 1", ! sameConnection.connected());
- per_frame.post(8);
- check_listener("disconnected", listener0, 7);
- check_listener("still connected", listener1, 8);
- per_frame.stopListening(listener1.getName());
- per_frame.post(9);
- check_listener("disconnected", listener1, 8);
- }
+template<> template<>
+void events_object::test<1>()
+{
+ set_test_name("basic operations");
+ // Now there's a static constructor in llevents.cpp that registers on
+ // the "mainloop" pump to call LLEventPumps::flush().
+ // Actually -- having to modify this to track the statically-
+ // constructed pumps in other TUT modules in this giant monolithic test
+ // executable isn't such a hot idea.
+ // ensure_equals("initial pump", pumps.mPumpMap.size(), 1);
+ size_t initial_pumps(pumps.mPumpMap.size());
+ LLEventPump& per_frame(pumps.obtain("per-frame"));
+ ensure_equals("first explicit pump", pumps.mPumpMap.size(), initial_pumps + 1);
+ // Verify that per_frame was instantiated as an LLEventStream.
+ ensure("LLEventStream leaf class", dynamic_cast<LLEventStream*> (&per_frame));
+ ensure("enabled", per_frame.enabled());
+ // Trivial test, but posting an event to an EventPump with no
+ // listeners should not blow up. The test is relevant because defining
+ // a boost::signal with a non-void return signature, using the default
+ // combiner, blows up if there are no listeners. This is because the
+ // default combiner is defined to return the value returned by the
+ // last listener, which is meaningless if there were no listeners.
+ per_frame.post(0);
+ LLBoundListener connection = listener0.listenTo(per_frame);
+ ensure("connected", connection.connected());
+ ensure("not blocked", !connection.blocked());
+ per_frame.post(1);
+ check_listener("received", listener0, 1);
+ { // block the connection
+ LLEventPump::Blocker block(connection);
+ ensure("blocked", connection.blocked());
+ per_frame.post(2);
+ check_listener("not updated", listener0, 1);
+ } // unblock
+ ensure("unblocked", !connection.blocked());
+ per_frame.post(3);
+ check_listener("unblocked", listener0, 3);
+ LLBoundListener sameConnection = per_frame.getListener(listener0.getName());
+ ensure("still connected", sameConnection.connected());
+ ensure("still not blocked", !sameConnection.blocked());
+ { // block it again
+ LLEventPump::Blocker block(sameConnection);
+ ensure("re-blocked", sameConnection.blocked());
+ per_frame.post(4);
+ check_listener("re-blocked", listener0, 3);
+ } // unblock
+ std::string threw;
+ try
+ {
+ // NOTE: boost::bind() saves its arguments by VALUE! If you pass
+ // an object instance rather than a pointer, you'll end up binding
+ // to an internal copy of that instance! Use boost::ref() to
+ // capture a reference instead.
+ per_frame.listen(listener0.getName(), // note bug, dup name
+ boost::bind(&Listener::call, boost::ref(listener1), _1));
+ }
+ CATCH_AND_STORE_WHAT_IN(threw, LLEventPump::DupListenerName)
+ ensure_equals(threw,
+ std::string("DupListenerName: "
+ "Attempt to register duplicate listener name '") +
+ listener0.getName() + "' on " + typeid(per_frame).name() +
+ " '" + per_frame.getName() + "'");
+ // do it right this time
+ listener1.listenTo(per_frame);
+ per_frame.post(5);
+ check_listener("got", listener0, 5);
+ check_listener("got", listener1, 5);
+ per_frame.enable(false);
+ per_frame.post(6);
+ check_listener("didn't get", listener0, 5);
+ check_listener("didn't get", listener1, 5);
+ per_frame.enable();
+ per_frame.post(7);
+ check_listener("got", listener0, 7);
+ check_listener("got", listener1, 7);
+ per_frame.stopListening(listener0.getName());
+ ensure("disconnected 0", ! connection.connected());
+ ensure("disconnected 1", ! sameConnection.connected());
+ per_frame.post(8);
+ check_listener("disconnected", listener0, 7);
+ check_listener("still connected", listener1, 8);
+ per_frame.stopListening(listener1.getName());
+ per_frame.post(9);
+ check_listener("disconnected", listener1, 8);
+}
- template<> template<>
- void events_object::test<2>()
- {
- set_test_name("callstop() returning true");
- LLEventPump& per_frame(pumps.obtain("per-frame"));
- listener0.reset(0);
- listener1.reset(0);
- LLBoundListener bound0 = listener0.listenTo(per_frame, &Listener::callstop);
- LLBoundListener bound1 = listener1.listenTo(per_frame, &Listener::call,
- // after listener0
- make<LLEventPump::NameList>(list_of(listener0.getName())));
- ensure("enabled", per_frame.enabled());
- ensure("connected 0", bound0.connected());
- ensure("unblocked 0", ! bound0.blocked());
- ensure("connected 1", bound1.connected());
- ensure("unblocked 1", ! bound1.blocked());
- per_frame.post(1);
- check_listener("got", listener0, 1);
- // Because listener0.callstop() returns true, control never reaches listener1.call().
- check_listener("got", listener1, 0);
- }
+template<> template<>
+void events_object::test<2>()
+{
+ set_test_name("callstop() returning true");
+ LLEventPump& per_frame(pumps.obtain("per-frame"));
+ listener0.reset(0);
+ listener1.reset(0);
+ LLBoundListener bound0 = listener0.listenTo(per_frame, &Listener::callstop);
+ LLBoundListener bound1 = listener1.listenTo(per_frame, &Listener::call,
+ // after listener0
+ make<LLEventPump::NameList>(list_of(listener0.getName())));
+ ensure("enabled", per_frame.enabled());
+ ensure("connected 0", bound0.connected());
+ ensure("unblocked 0", !bound0.blocked());
+ ensure("connected 1", bound1.connected());
+ ensure("unblocked 1", !bound1.blocked());
+ per_frame.post(1);
+ check_listener("got", listener0, 1);
+ // Because listener0.callstop() returns true, control never reaches listener1.call().
+ check_listener("got", listener1, 0);
+}
- bool chainEvents(Listener& someListener, const LLSD& event)
- {
- // Make this call so we can watch for side effects for test purposes.
- someListener.call(event);
- // This function represents a recursive event chain -- or some other
- // scenario in which an event handler raises additional events.
- int value = event.asInteger();
- if (value)
- {
- LLEventPumps::instance().obtain("login").post(value - 1);
- }
- return false;
- }
+bool chainEvents(Listener& someListener, const LLSD& event)
+{
+ // Make this call so we can watch for side effects for test purposes.
+ someListener.call(event);
+ // This function represents a recursive event chain -- or some other
+ // scenario in which an event handler raises additional events.
+ int value = event.asInteger();
+ if (value)
+ {
+ LLEventPumps::instance().obtain("login").post(value - 1);
+ }
+ return false;
+}
- template<> template<>
- void events_object::test<3>()
- {
- set_test_name("LLEventQueue delayed action");
- // This access is NOT legal usage: we can do it only because we're
- // hacking private for test purposes. Normally we'd either compile in
- // a particular name, or (later) edit a config file.
- pumps.mQueueNames.insert("login");
- LLEventPump& login(pumps.obtain("login"));
- // The "mainloop" pump is special: posting on that implicitly calls
- // LLEventPumps::flush(), which in turn should flush our "login"
- // LLEventQueue.
- LLEventPump& mainloop(pumps.obtain("mainloop"));
- ensure("LLEventQueue leaf class", dynamic_cast<LLEventQueue*>(&login));
- listener0.listenTo(login);
- listener0.reset(0);
- login.post(1);
- check_listener("waiting for queued event", listener0, 0);
- mainloop.post(LLSD());
- check_listener("got queued event", listener0, 1);
- login.stopListening(listener0.getName());
- // Verify that when an event handler posts a new event on the same
- // LLEventQueue, it doesn't get processed in the same flush() call --
- // it waits until the next flush() call.
- listener0.reset(17);
- login.listen("chainEvents", boost::bind(chainEvents, boost::ref(listener0), _1));
- login.post(1);
- check_listener("chainEvents(1) not yet called", listener0, 17);
- mainloop.post(LLSD());
- check_listener("chainEvents(1) called", listener0, 1);
- mainloop.post(LLSD());
- check_listener("chainEvents(0) called", listener0, 0);
- mainloop.post(LLSD());
- check_listener("chainEvents(-1) not called", listener0, 0);
- login.stopListening("chainEvents");
- }
+template<> template<>
+void events_object::test<3>()
+{
+ set_test_name("LLEventQueue delayed action");
+ // This access is NOT legal usage: we can do it only because we're
+ // hacking private for test purposes. Normally we'd either compile in
+ // a particular name, or (later) edit a config file.
+ pumps.mQueueNames.insert("login");
+ LLEventPump& login(pumps.obtain("login"));
+ // The "mainloop" pump is special: posting on that implicitly calls
+ // LLEventPumps::flush(), which in turn should flush our "login"
+ // LLEventQueue.
+ LLEventPump& mainloop(pumps.obtain("mainloop"));
+ ensure("LLEventQueue leaf class", dynamic_cast<LLEventQueue*> (&login));
+ listener0.listenTo(login);
+ listener0.reset(0);
+ login.post(1);
+ check_listener("waiting for queued event", listener0, 0);
+ mainloop.post(LLSD());
+ check_listener("got queued event", listener0, 1);
+ login.stopListening(listener0.getName());
+ // Verify that when an event handler posts a new event on the same
+ // LLEventQueue, it doesn't get processed in the same flush() call --
+ // it waits until the next flush() call.
+ listener0.reset(17);
+ login.listen("chainEvents", boost::bind(chainEvents, boost::ref(listener0), _1));
+ login.post(1);
+ check_listener("chainEvents(1) not yet called", listener0, 17);
+ mainloop.post(LLSD());
+ check_listener("chainEvents(1) called", listener0, 1);
+ mainloop.post(LLSD());
+ check_listener("chainEvents(0) called", listener0, 0);
+ mainloop.post(LLSD());
+ check_listener("chainEvents(-1) not called", listener0, 0);
+ login.stopListening("chainEvents");
+}
- template<> template<>
- void events_object::test<4>()
- {
- set_test_name("explicitly-instantiated LLEventStream");
- // Explicitly instantiate an LLEventStream, and verify that it
- // self-registers with LLEventPumps
- size_t registered = pumps.mPumpMap.size();
- size_t owned = pumps.mOurPumps.size();
- LLEventPump* localInstance;
- {
- LLEventStream myEventStream("stream");
- localInstance = &myEventStream;
- LLEventPump& stream(pumps.obtain("stream"));
- ensure("found named LLEventStream instance", &stream == localInstance);
- ensure_equals("registered new instance", pumps.mPumpMap.size(), registered + 1);
- ensure_equals("explicit instance not owned", pumps.mOurPumps.size(), owned);
- } // destroy myEventStream -- should unregister
- ensure_equals("destroyed instance unregistered", pumps.mPumpMap.size(), registered);
- ensure_equals("destroyed instance not owned", pumps.mOurPumps.size(), owned);
- LLEventPump& stream(pumps.obtain("stream"));
- ensure("new LLEventStream instance", &stream != localInstance);
- ensure_equals("obtain()ed instance registered", pumps.mPumpMap.size(), registered + 1);
- ensure_equals("obtain()ed instance owned", pumps.mOurPumps.size(), owned + 1);
- }
+template<> template<>
+void events_object::test<4>()
+{
+ set_test_name("explicitly-instantiated LLEventStream");
+ // Explicitly instantiate an LLEventStream, and verify that it
+ // self-registers with LLEventPumps
+ size_t registered = pumps.mPumpMap.size();
+ size_t owned = pumps.mOurPumps.size();
+ LLEventPump* localInstance;
+ {
+ LLEventStream myEventStream("stream");
+ localInstance = &myEventStream;
+ LLEventPump& stream(pumps.obtain("stream"));
+ ensure("found named LLEventStream instance", &stream == localInstance);
+ ensure_equals("registered new instance", pumps.mPumpMap.size(), registered + 1);
+ ensure_equals("explicit instance not owned", pumps.mOurPumps.size(), owned);
+ } // destroy myEventStream -- should unregister
+ ensure_equals("destroyed instance unregistered", pumps.mPumpMap.size(), registered);
+ ensure_equals("destroyed instance not owned", pumps.mOurPumps.size(), owned);
+ LLEventPump& stream(pumps.obtain("stream"));
+ ensure("new LLEventStream instance", &stream != localInstance);
+ ensure_equals("obtain()ed instance registered", pumps.mPumpMap.size(), registered + 1);
+ ensure_equals("obtain()ed instance owned", pumps.mOurPumps.size(), owned + 1);
+}
- template<> template<>
- void events_object::test<5>()
- {
- set_test_name("stopListening()");
- LLEventPump& login(pumps.obtain("login"));
- listener0.listenTo(login);
- login.stopListening(listener0.getName());
- // should not throw because stopListening() should have removed name
- listener0.listenTo(login, &Listener::callstop);
- LLBoundListener wrong = login.getListener("bogus");
- ensure("bogus connection disconnected", ! wrong.connected());
- ensure("bogus connection blocked", wrong.blocked());
- }
+template<> template<>
+void events_object::test<5>()
+{
+ set_test_name("stopListening()");
+ LLEventPump& login(pumps.obtain("login"));
+ listener0.listenTo(login);
+ login.stopListening(listener0.getName());
+ // should not throw because stopListening() should have removed name
+ listener0.listenTo(login, &Listener::callstop);
+ LLBoundListener wrong = login.getListener("bogus");
+ ensure("bogus connection disconnected", !wrong.connected());
+ ensure("bogus connection blocked", wrong.blocked());
+}
- template<> template<>
- void events_object::test<6>()
- {
- set_test_name("chaining LLEventPump instances");
- LLEventPump& upstream(pumps.obtain("upstream"));
- // One potentially-useful construct is to chain LLEventPumps together.
- // Among other things, this allows you to turn subsets of listeners on
- // and off in groups.
- LLEventPump& filter0(pumps.obtain("filter0"));
- LLEventPump& filter1(pumps.obtain("filter1"));
- upstream.listen(filter0.getName(),
- boost::bind(&LLEventPump::post, boost::ref(filter0), _1));
- upstream.listen(filter1.getName(),
- boost::bind(&LLEventPump::post, boost::ref(filter1), _1));
- listener0.listenTo(filter0);
- listener1.listenTo(filter1);
- listener0.reset(0);
- listener1.reset(0);
- upstream.post(1);
- check_listener("got unfiltered", listener0, 1);
- check_listener("got unfiltered", listener1, 1);
- filter0.enable(false);
- upstream.post(2);
- check_listener("didn't get filtered", listener0, 1);
- check_listener("got filtered", listener1, 2);
- }
+template<> template<>
+void events_object::test<6>()
+{
+ set_test_name("chaining LLEventPump instances");
+ LLEventPump& upstream(pumps.obtain("upstream"));
+ // One potentially-useful construct is to chain LLEventPumps together.
+ // Among other things, this allows you to turn subsets of listeners on
+ // and off in groups.
+ LLEventPump& filter0(pumps.obtain("filter0"));
+ LLEventPump& filter1(pumps.obtain("filter1"));
+ upstream.listen(filter0.getName(), boost::bind(&LLEventPump::post, boost::ref(filter0), _1));
+ upstream.listen(filter1.getName(), boost::bind(&LLEventPump::post, boost::ref(filter1), _1));
+ listener0.listenTo(filter0);
+ listener1.listenTo(filter1);
+ listener0.reset(0);
+ listener1.reset(0);
+ upstream.post(1);
+ check_listener("got unfiltered", listener0, 1);
+ check_listener("got unfiltered", listener1, 1);
+ filter0.enable(false);
+ upstream.post(2);
+ check_listener("didn't get filtered", listener0, 1);
+ check_listener("got filtered", listener1, 2);
+}
- template<> template<>
- void events_object::test<7>()
- {
- set_test_name("listener dependency order");
- typedef LLEventPump::NameList NameList;
- typedef Collect::StringList StringList;
- LLEventPump& button(pumps.obtain("button"));
- Collect collector;
- button.listen("Mary",
- boost::bind(&Collect::add, boost::ref(collector), "Mary", _1),
- // state that "Mary" must come after "checked"
- make<NameList>(list_of("checked")));
- button.listen("checked",
- boost::bind(&Collect::add, boost::ref(collector), "checked", _1),
- // "checked" must come after "spot"
- make<NameList>(list_of("spot")));
- button.listen("spot",
- boost::bind(&Collect::add, boost::ref(collector), "spot", _1));
- button.post(1);
- ensure_equals(collector.result, make<StringList>(list_of("spot")("checked")("Mary")));
- collector.clear();
- button.stopListening("Mary");
- button.listen("Mary",
- boost::bind(&Collect::add, boost::ref(collector), "Mary", _1),
- LLEventPump::empty, // no after dependencies
- // now "Mary" must come before "spot"
- make<NameList>(list_of("spot")));
- button.post(2);
- ensure_equals(collector.result, make<StringList>(list_of("Mary")("spot")("checked")));
- collector.clear();
- button.stopListening("spot");
- std::string threw;
- try
- {
- button.listen("spot",
- boost::bind(&Collect::add, boost::ref(collector), "spot", _1),
- // after "Mary" and "checked" -- whoops!
- make<NameList>(list_of("Mary")("checked")));
- }
- catch (const LLEventPump::Cycle& e)
- {
- threw = e.what();
-// std::cout << "Caught: " << e.what() << '\n';
- }
- // Obviously the specific wording of the exception text can
- // change; go ahead and change the test to match.
- // Establish that it contains:
- // - the name and runtime type of the LLEventPump
- ensure_contains("LLEventPump type", threw, typeid(button).name());
- ensure_contains("LLEventPump name", threw, "'button'");
- // - the name of the new listener that caused the problem
- ensure_contains("new listener name", threw, "'spot'");
- // - a synopsis of the problematic dependencies.
- ensure_contains("cyclic dependencies", threw,
- "\"Mary\" -> before (\"spot\")");
- ensure_contains("cyclic dependencies", threw,
- "after (\"spot\") -> \"checked\"");
- ensure_contains("cyclic dependencies", threw,
- "after (\"Mary\", \"checked\") -> \"spot\"");
- button.listen("yellow",
- boost::bind(&Collect::add, boost::ref(collector), "yellow", _1),
- make<NameList>(list_of("checked")));
- button.listen("shoelaces",
- boost::bind(&Collect::add, boost::ref(collector), "shoelaces", _1),
- make<NameList>(list_of("checked")));
- button.post(3);
- ensure_equals(collector.result, make<StringList>(list_of("Mary")("checked")("yellow")("shoelaces")));
- collector.clear();
- threw.clear();
- try
- {
- button.listen("of",
- boost::bind(&Collect::add, boost::ref(collector), "of", _1),
- make<NameList>(list_of("shoelaces")),
- make<NameList>(list_of("yellow")));
- }
- catch (const LLEventPump::OrderChange& e)
- {
- threw = e.what();
-// std::cout << "Caught: " << e.what() << '\n';
- }
- // Same remarks about the specific wording of the exception. Just
- // ensure that it contains enough information to clarify the
- // problem and what must be done to resolve it.
- ensure_contains("LLEventPump type", threw, typeid(button).name());
- ensure_contains("LLEventPump name", threw, "'button'");
- ensure_contains("new listener name", threw, "'of'");
- ensure_contains("prev listener name", threw, "'yellow'");
- ensure_contains("old order", threw, "was: Mary, checked, yellow, shoelaces");
- ensure_contains("new order", threw, "now: Mary, checked, shoelaces, of, yellow");
- button.post(4);
- ensure_equals(collector.result, make<StringList>(list_of("Mary")("checked")("yellow")("shoelaces")));
- }
+template<> template<>
+void events_object::test<7>()
+{
+ set_test_name("listener dependency order");
+ typedef LLEventPump::NameList NameList;
+ LLEventPump& button(pumps.obtain("button"));
+ Collect collector;
+ button.listen("Mary",
+ boost::bind(&Collect::add, boost::ref(collector), "Mary", _1),
+ // state that "Mary" must come after "checked"
+ make<NameList> (list_of("checked")));
+ button.listen("checked",
+ boost::bind(&Collect::add, boost::ref(collector), "checked", _1),
+ // "checked" must come after "spot"
+ make<NameList> (list_of("spot")));
+ button.listen("spot",
+ boost::bind(&Collect::add, boost::ref(collector), "spot", _1));
+ button.post(1);
+ ensure_equals(collector.result, make<StringVec>(list_of("spot")("checked")("Mary")));
+ collector.clear();
+ button.stopListening("Mary");
+ button.listen("Mary",
+ boost::bind(&Collect::add, boost::ref(collector), "Mary", _1),
+ LLEventPump::empty, // no after dependencies
+ // now "Mary" must come before "spot"
+ make<NameList>(list_of("spot")));
+ button.post(2);
+ ensure_equals(collector.result, make<StringVec>(list_of("Mary")("spot")("checked")));
+ collector.clear();
+ button.stopListening("spot");
+ std::string threw;
+ try
+ {
+ button.listen("spot",
+ boost::bind(&Collect::add, boost::ref(collector), "spot", _1),
+ // after "Mary" and "checked" -- whoops!
+ make<NameList>(list_of("Mary")("checked")));
+ }
+ CATCH_AND_STORE_WHAT_IN(threw, LLEventPump::Cycle)
+ // Obviously the specific wording of the exception text can
+ // change; go ahead and change the test to match.
+ // Establish that it contains:
+ // - the name and runtime type of the LLEventPump
+ ensure_contains("LLEventPump type", threw, typeid(button).name());
+ ensure_contains("LLEventPump name", threw, "'button'");
+ // - the name of the new listener that caused the problem
+ ensure_contains("new listener name", threw, "'spot'");
+ // - a synopsis of the problematic dependencies.
+ ensure_contains("cyclic dependencies", threw,
+ "\"Mary\" -> before (\"spot\")");
+ ensure_contains("cyclic dependencies", threw,
+ "after (\"spot\") -> \"checked\"");
+ ensure_contains("cyclic dependencies", threw,
+ "after (\"Mary\", \"checked\") -> \"spot\"");
+ button.listen("yellow",
+ boost::bind(&Collect::add, boost::ref(collector), "yellow", _1),
+ make<NameList>(list_of("checked")));
+ button.listen("shoelaces",
+ boost::bind(&Collect::add, boost::ref(collector), "shoelaces", _1),
+ make<NameList>(list_of("checked")));
+ button.post(3);
+ ensure_equals(collector.result, make<StringVec>(list_of("Mary")("checked")("yellow")("shoelaces")));
+ collector.clear();
+ threw.clear();
+ try
+ {
+ button.listen("of",
+ boost::bind(&Collect::add, boost::ref(collector), "of", _1),
+ make<NameList>(list_of("shoelaces")),
+ make<NameList>(list_of("yellow")));
+ }
+ CATCH_AND_STORE_WHAT_IN(threw, LLEventPump::OrderChange)
+ // Same remarks about the specific wording of the exception. Just
+ // ensure that it contains enough information to clarify the
+ // problem and what must be done to resolve it.
+ ensure_contains("LLEventPump type", threw, typeid(button).name());
+ ensure_contains("LLEventPump name", threw, "'button'");
+ ensure_contains("new listener name", threw, "'of'");
+ ensure_contains("prev listener name", threw, "'yellow'");
+ // std::cout << "Thrown Exception: " << threw << std::endl;
+ ensure_contains("old order", threw, "was: Mary, checked, yellow, shoelaces");
+ ensure_contains("new order", threw, "now: Mary, checked, shoelaces, of, yellow");
+ button.post(4);
+ ensure_equals(collector.result, make<StringVec>(list_of("Mary")("checked")("yellow")("shoelaces")));
+}
- template<> template<>
- void events_object::test<8>()
- {
- set_test_name("tweaked and untweaked LLEventPump instance names");
- { // nested scope
- // Hand-instantiate an LLEventStream...
- LLEventStream bob("bob");
- bool threw = false;
- try
- {
- // then another with a duplicate name.
- LLEventStream bob2("bob");
- }
- catch (const LLEventPump::DupPumpName& /*e*/)
- {
- threw = true;
-// std::cout << "Caught: " << e.what() << '\n';
- }
- ensure("Caught DupPumpName", threw);
- } // delete first 'bob'
- LLEventStream bob("bob"); // should work, previous one unregistered
- LLEventStream bob1("bob", true); // allowed to tweak name
- ensure_equals("tweaked LLEventStream name", bob1.getName(), "bob1");
- std::vector< boost::shared_ptr<LLEventStream> > streams;
- for (int i = 2; i <= 10; ++i)
- {
- streams.push_back(boost::shared_ptr<LLEventStream>(new LLEventStream("bob", true)));
- }
- ensure_equals("last tweaked LLEventStream name", streams.back()->getName(), "bob10");
- }
+template<> template<>
+void events_object::test<8>()
+{
+ set_test_name("tweaked and untweaked LLEventPump instance names");
+ { // nested scope
+ // Hand-instantiate an LLEventStream...
+ LLEventStream bob("bob");
+ std::string threw;
+ try
+ {
+ // then another with a duplicate name.
+ LLEventStream bob2("bob");
+ }
+ CATCH_AND_STORE_WHAT_IN(threw, LLEventPump::DupPumpName)
+ ensure("Caught DupPumpName", !threw.empty());
+ } // delete first 'bob'
+ LLEventStream bob("bob"); // should work, previous one unregistered
+ LLEventStream bob1("bob", true);// allowed to tweak name
+ ensure_equals("tweaked LLEventStream name", bob1.getName(), "bob1");
+ std::vector<boost::shared_ptr<LLEventStream> > streams;
+ for (int i = 2; i <= 10; ++i)
+ {
+ streams.push_back(boost::shared_ptr<LLEventStream>(new LLEventStream("bob", true)));
+ }
+ ensure_equals("last tweaked LLEventStream name", streams.back()->getName(), "bob10");
+}
- // Define a function that accepts an LLListenerOrPumpName
- void eventSource(const LLListenerOrPumpName& listener)
- {
- // Pretend that some time has elapsed. Call listener immediately.
- listener(17);
- }
+// Define a function that accepts an LLListenerOrPumpName
+void eventSource(const LLListenerOrPumpName& listener)
+{
+ // Pretend that some time has elapsed. Call listener immediately.
+ listener(17);
+}
- template<> template<>
- void events_object::test<9>()
- {
- set_test_name("LLListenerOrPumpName");
- // Passing a boost::bind() expression to LLListenerOrPumpName
- listener0.reset(0);
- eventSource(boost::bind(&Listener::call, boost::ref(listener0), _1));
- check_listener("got by listener", listener0, 17);
- // Passing a string LLEventPump name to LLListenerOrPumpName
- listener0.reset(0);
- LLEventStream random("random");
- listener0.listenTo(random);
- eventSource("random");
- check_listener("got by pump name", listener0, 17);
- bool threw = false;
- try
- {
- LLListenerOrPumpName empty;
- empty(17);
- }
- catch (const LLListenerOrPumpName::Empty&)
- {
- threw = true;
- }
- ensure("threw Empty", threw);
- }
+template<> template<>
+void events_object::test<9>()
+{
+ set_test_name("LLListenerOrPumpName");
+ // Passing a boost::bind() expression to LLListenerOrPumpName
+ listener0.reset(0);
+ eventSource(boost::bind(&Listener::call, boost::ref(listener0), _1));
+ check_listener("got by listener", listener0, 17);
+ // Passing a string LLEventPump name to LLListenerOrPumpName
+ listener0.reset(0);
+ LLEventStream random("random");
+ listener0.listenTo(random);
+ eventSource("random");
+ check_listener("got by pump name", listener0, 17);
+ std::string threw;
+ try
+ {
+ LLListenerOrPumpName empty;
+ empty(17);
+ }
+ CATCH_AND_STORE_WHAT_IN(threw, LLListenerOrPumpName::Empty)
- class TempListener: public Listener
- {
- public:
- TempListener(const std::string& name, bool& liveFlag):
- Listener(name),
- mLiveFlag(liveFlag)
- {
- mLiveFlag = true;
- }
+ ensure("threw Empty", !threw.empty());
+}
- virtual ~TempListener()
- {
- mLiveFlag = false;
- }
+class TempListener: public Listener
+{
+public:
+ TempListener(const std::string& name, bool& liveFlag) :
+ Listener(name), mLiveFlag(liveFlag)
+ {
+ mLiveFlag = true;
+ }
- private:
- bool& mLiveFlag;
- };
+ virtual ~TempListener()
+ {
+ mLiveFlag = false;
+ }
- template<> template<>
- void events_object::test<10>()
- {
- set_test_name("listen(boost::bind(...TempListener...))");
- // listen() can't do anything about a plain TempListener instance:
- // it's not managed with shared_ptr, nor is it an LLEventTrackable subclass
- bool live = false;
- LLEventPump& heaptest(pumps.obtain("heaptest"));
- LLBoundListener connection;
- {
- TempListener tempListener("temp", live);
- ensure("TempListener constructed", live);
- connection = heaptest.listen(tempListener.getName(),
- boost::bind(&Listener::call,
- boost::ref(tempListener),
- _1));
- heaptest.post(1);
- check_listener("received", tempListener, 1);
- } // presumably this will make newListener go away?
- // verify that
- ensure("TempListener destroyed", ! live);
- // This is the case against which we can't defend. Don't even try to
- // post to heaptest -- that would engage Undefined Behavior.
- // Cautiously inspect connection...
- ensure("misleadingly connected", connection.connected());
- // then disconnect by hand.
- heaptest.stopListening("temp");
- }
+private:
+ bool& mLiveFlag;
+};
- template<> template<>
- void events_object::test<11>()
- {
- set_test_name("listen(boost::bind(...weak_ptr...))");
- // listen() detecting weak_ptr<TempListener> in boost::bind() object
- bool live = false;
- LLEventPump& heaptest(pumps.obtain("heaptest"));
- LLBoundListener connection;
- ensure("default state", ! connection.connected());
- {
- boost::shared_ptr<TempListener> newListener(new TempListener("heap", live));
- newListener->reset();
- ensure("TempListener constructed", live);
- connection = heaptest.listen(newListener->getName(),
- boost::bind(&Listener::call, weaken(newListener), _1));
- ensure("new connection", connection.connected());
- heaptest.post(1);
- check_listener("received", *newListener, 1);
- } // presumably this will make newListener go away?
- // verify that
- ensure("TempListener destroyed", ! live);
- ensure("implicit disconnect", ! connection.connected());
- // now just make sure we don't blow up trying to access a freed object!
- heaptest.post(2);
- }
+template<> template<>
+void events_object::test<10>()
+{
+ set_test_name("listen(boost::bind(...TempListener...))");
+ // listen() can't do anything about a plain TempListener instance:
+ // it's not managed with shared_ptr, nor is it an LLEventTrackable subclass
+ bool live = false;
+ LLEventPump& heaptest(pumps.obtain("heaptest"));
+ LLBoundListener connection;
+ {
+ TempListener tempListener("temp", live);
+ ensure("TempListener constructed", live);
+ connection = heaptest.listen(tempListener.getName(),
+ boost::bind(&Listener::call,
+ boost::ref(tempListener),
+ _1));
+ heaptest.post(1);
+ check_listener("received", tempListener, 1);
+ } // presumably this will make newListener go away?
+ // verify that
+ ensure("TempListener destroyed", !live);
+ // This is the case against which we can't defend. Don't even try to
+ // post to heaptest -- that would engage Undefined Behavior.
+ // Cautiously inspect connection...
+ ensure("misleadingly connected", connection.connected());
+ // then disconnect by hand.
+ heaptest.stopListening("temp");
+}
- template<> template<>
- void events_object::test<12>()
- {
- set_test_name("listen(boost::bind(...shared_ptr...))");
-/*==========================================================================*|
- // DISABLED because I've made this case produce a compile error.
- // Following the error leads the disappointed dev to a comment
- // instructing her to use the weaken() function to bind a weak_ptr<T>
- // instead of binding a shared_ptr<T>, and explaining why. I know of
- // no way to use TUT to code a repeatable test in which the expected
- // outcome is a compile error. The interested reader is invited to
- // uncomment this block and build to see for herself.
+template<> template<>
+void events_object::test<11>()
+{
+ set_test_name("listen(boost::bind(...weak_ptr...))");
+ // listen() detecting weak_ptr<TempListener> in boost::bind() object
+ bool live = false;
+ LLEventPump& heaptest(pumps.obtain("heaptest"));
+ LLBoundListener connection;
+ ensure("default state", !connection.connected());
+ {
+ boost::shared_ptr<TempListener> newListener(new TempListener("heap", live));
+ newListener->reset();
+ ensure("TempListener constructed", live);
+ connection = heaptest.listen(newListener->getName(),
+ boost::bind(&Listener::call,
+ weaken(newListener),
+ _1));
+ ensure("new connection", connection.connected());
+ heaptest.post(1);
+ check_listener("received", *newListener, 1);
+ } // presumably this will make newListener go away?
+ // verify that
+ ensure("TempListener destroyed", !live);
+ ensure("implicit disconnect", !connection.connected());
+ // now just make sure we don't blow up trying to access a freed object!
+ heaptest.post(2);
+}
+
+template<> template<>
+void events_object::test<12>()
+{
+ set_test_name("listen(boost::bind(...shared_ptr...))");
+ /*==========================================================================*|
+ // DISABLED because I've made this case produce a compile error.
+ // Following the error leads the disappointed dev to a comment
+ // instructing her to use the weaken() function to bind a weak_ptr<T>
+ // instead of binding a shared_ptr<T>, and explaining why. I know of
+ // no way to use TUT to code a repeatable test in which the expected
+ // outcome is a compile error. The interested reader is invited to
+ // uncomment this block and build to see for herself.
- // listen() detecting shared_ptr<TempListener> in boost::bind() object
- bool live = false;
- LLEventPump& heaptest(pumps.obtain("heaptest"));
- LLBoundListener connection;
- std::string listenerName("heap");
- ensure("default state", ! connection.connected());
- {
- boost::shared_ptr<TempListener> newListener(new TempListener(listenerName, live));
- ensure_equals("use_count", newListener.use_count(), 1);
- newListener->reset();
- ensure("TempListener constructed", live);
- connection = heaptest.listen(newListener->getName(),
- boost::bind(&Listener::call, newListener, _1));
- ensure("new connection", connection.connected());
- ensure_equals("use_count", newListener.use_count(), 2);
- heaptest.post(1);
- check_listener("received", *newListener, 1);
- } // this should make newListener go away...
- // Unfortunately, the fact that we've bound a shared_ptr by value into
- // our LLEventPump means that copy will keep the referenced object alive.
- ensure("TempListener still alive", live);
- ensure("still connected", connection.connected());
- // disconnecting explicitly should delete the TempListener...
- heaptest.stopListening(listenerName);
+ // listen() detecting shared_ptr<TempListener> in boost::bind() object
+ bool live = false;
+ LLEventPump& heaptest(pumps.obtain("heaptest"));
+ LLBoundListener connection;
+ std::string listenerName("heap");
+ ensure("default state", !connection.connected());
+ {
+ boost::shared_ptr<TempListener> newListener(new TempListener(listenerName, live));
+ ensure_equals("use_count", newListener.use_count(), 1);
+ newListener->reset();
+ ensure("TempListener constructed", live);
+ connection = heaptest.listen(newListener->getName(),
+ boost::bind(&Listener::call, newListener, _1));
+ ensure("new connection", connection.connected());
+ ensure_equals("use_count", newListener.use_count(), 2);
+ heaptest.post(1);
+ check_listener("received", *newListener, 1);
+ } // this should make newListener go away...
+ // Unfortunately, the fact that we've bound a shared_ptr by value into
+ // our LLEventPump means that copy will keep the referenced object alive.
+ ensure("TempListener still alive", live);
+ ensure("still connected", connection.connected());
+ // disconnecting explicitly should delete the TempListener...
+ heaptest.stopListening(listenerName);
#if 0 // however, in my experience, it does not. I don't know why not.
- // Ah: on 2009-02-19, Frank Mori Hess, author of the Boost.Signals2
- // library, stated on the boost-users mailing list:
- // http://www.nabble.com/Re%3A--signals2--review--The-review-of-the-signals2-library-(formerly-thread_safe_signals)-begins-today%2C-Nov-1st-p22102367.html
- // "It will get destroyed eventually. The signal cleans up its slot
- // list little by little during connect/invoke. It doesn't immediately
- // remove disconnected slots from the slot list since other threads
- // might be using the same slot list concurrently. It might be
- // possible to make it immediately reset the shared_ptr owning the
- // slot though, leaving an empty shared_ptr in the slot list, since
- // that wouldn't invalidate any iterators."
- ensure("TempListener destroyed", ! live);
- ensure("implicit disconnect", ! connection.connected());
+ // Ah: on 2009-02-19, Frank Mori Hess, author of the Boost.Signals2
+ // library, stated on the boost-users mailing list:
+ // http://www.nabble.com/Re%3A--signals2--review--The-review-of-the-signals2-library-(formerly-thread_safe_signals)-begins-today%2C-Nov-1st-p22102367.html
+ // "It will get destroyed eventually. The signal cleans up its slot
+ // list little by little during connect/invoke. It doesn't immediately
+ // remove disconnected slots from the slot list since other threads
+ // might be using the same slot list concurrently. It might be
+ // possible to make it immediately reset the shared_ptr owning the
+ // slot though, leaving an empty shared_ptr in the slot list, since
+ // that wouldn't invalidate any iterators."
+ ensure("TempListener destroyed", ! live);
+ ensure("implicit disconnect", ! connection.connected());
#endif // 0
- // now just make sure we don't blow up trying to access a freed object!
- heaptest.post(2);
+ // now just make sure we don't blow up trying to access a freed object!
+ heaptest.post(2);
|*==========================================================================*/
- }
+}
- class TempTrackableListener: public TempListener, public LLEventTrackable
- {
- public:
- TempTrackableListener(const std::string& name, bool& liveFlag):
- TempListener(name, liveFlag)
- {}
- };
+class TempTrackableListener: public TempListener, public LLEventTrackable
+{
+public:
+TempTrackableListener(const std::string& name, bool& liveFlag):
+ TempListener(name, liveFlag)
+{}
+};
- template<> template<>
- void events_object::test<13>()
- {
- set_test_name("listen(boost::bind(...TempTrackableListener ref...))");
- bool live = false;
- LLEventPump& heaptest(pumps.obtain("heaptest"));
- LLBoundListener connection;
- {
- TempTrackableListener tempListener("temp", live);
- ensure("TempTrackableListener constructed", live);
- connection = heaptest.listen(tempListener.getName(),
- boost::bind(&TempTrackableListener::call,
- boost::ref(tempListener), _1));
- heaptest.post(1);
- check_listener("received", tempListener, 1);
- } // presumably this will make tempListener go away?
- // verify that
- ensure("TempTrackableListener destroyed", ! live);
- ensure("implicit disconnect", ! connection.connected());
- // now just make sure we don't blow up trying to access a freed object!
- heaptest.post(2);
- }
+template<> template<>
+void events_object::test<13>()
+{
+set_test_name("listen(boost::bind(...TempTrackableListener ref...))");
+bool live = false;
+LLEventPump& heaptest(pumps.obtain("heaptest"));
+LLBoundListener connection;
+{
+ TempTrackableListener tempListener("temp", live);
+ ensure("TempTrackableListener constructed", live);
+ connection = heaptest.listen(tempListener.getName(),
+ boost::bind(&TempTrackableListener::call,
+ boost::ref(tempListener), _1));
+ heaptest.post(1);
+ check_listener("received", tempListener, 1);
+} // presumably this will make tempListener go away?
+// verify that
+ensure("TempTrackableListener destroyed", ! live);
+ensure("implicit disconnect", ! connection.connected());
+// now just make sure we don't blow up trying to access a freed object!
+heaptest.post(2);
+}
- template<> template<>
- void events_object::test<14>()
- {
- set_test_name("listen(boost::bind(...TempTrackableListener pointer...))");
- bool live = false;
- LLEventPump& heaptest(pumps.obtain("heaptest"));
- LLBoundListener connection;
- {
- TempTrackableListener* newListener(new TempTrackableListener("temp", live));
- ensure("TempTrackableListener constructed", live);
- connection = heaptest.listen(newListener->getName(),
- boost::bind(&TempTrackableListener::call,
- newListener, _1));
- heaptest.post(1);
- check_listener("received", *newListener, 1);
- // explicitly destroy newListener
- delete newListener;
- }
- // verify that
- ensure("TempTrackableListener destroyed", ! live);
- ensure("implicit disconnect", ! connection.connected());
- // now just make sure we don't blow up trying to access a freed object!
- heaptest.post(2);
- }
+template<> template<>
+void events_object::test<14>()
+{
+set_test_name("listen(boost::bind(...TempTrackableListener pointer...))");
+bool live = false;
+LLEventPump& heaptest(pumps.obtain("heaptest"));
+LLBoundListener connection;
+{
+ TempTrackableListener* newListener(new TempTrackableListener("temp", live));
+ ensure("TempTrackableListener constructed", live);
+ connection = heaptest.listen(newListener->getName(),
+ boost::bind(&TempTrackableListener::call,
+ newListener, _1));
+ heaptest.post(1);
+ check_listener("received", *newListener, 1);
+ // explicitly destroy newListener
+ delete newListener;
+}
+// verify that
+ensure("TempTrackableListener destroyed", ! live);
+ensure("implicit disconnect", ! connection.connected());
+// now just make sure we don't blow up trying to access a freed object!
+heaptest.post(2);
+}
- template<> template<>
- void events_object::test<15>()
- {
- // This test ensures that using an LLListenerWrapper subclass doesn't
- // block Boost.Signals2 from recognizing a bound LLEventTrackable
- // subclass.
- set_test_name("listen(llwrap<LLLogListener>(boost::bind(...TempTrackableListener ref...)))");
- bool live = false;
- LLEventPump& heaptest(pumps.obtain("heaptest"));
- LLBoundListener connection;
- {
- TempTrackableListener tempListener("temp", live);
- ensure("TempTrackableListener constructed", live);
- connection = heaptest.listen(tempListener.getName(),
- llwrap<LLLogListener>(
- boost::bind(&TempTrackableListener::call,
- boost::ref(tempListener), _1)));
- heaptest.post(1);
- check_listener("received", tempListener, 1);
- } // presumably this will make tempListener go away?
- // verify that
- ensure("TempTrackableListener destroyed", ! live);
- ensure("implicit disconnect", ! connection.connected());
- // now just make sure we don't blow up trying to access a freed object!
- heaptest.post(2);
- }
+template<> template<>
+void events_object::test<15>()
+{
+// This test ensures that using an LLListenerWrapper subclass doesn't
+// block Boost.Signals2 from recognizing a bound LLEventTrackable
+// subclass.
+set_test_name("listen(llwrap<LLLogListener>(boost::bind(...TempTrackableListener ref...)))");
+bool live = false;
+LLEventPump& heaptest(pumps.obtain("heaptest"));
+LLBoundListener connection;
+{
+ TempTrackableListener tempListener("temp", live);
+ ensure("TempTrackableListener constructed", live);
+ connection = heaptest.listen(tempListener.getName(),
+ llwrap<LLLogListener>(
+ boost::bind(&TempTrackableListener::call,
+ boost::ref(tempListener), _1)));
+ heaptest.post(1);
+ check_listener("received", tempListener, 1);
+} // presumably this will make tempListener go away?
+// verify that
+ensure("TempTrackableListener destroyed", ! live);
+ensure("implicit disconnect", ! connection.connected());
+// now just make sure we don't blow up trying to access a freed object!
+heaptest.post(2);
+}
- class TempSharedListener: public TempListener,
- public boost::enable_shared_from_this<TempSharedListener>
- {
- public:
- TempSharedListener(const std::string& name, bool& liveFlag):
- TempListener(name, liveFlag)
- {}
- };
+class TempSharedListener: public TempListener,
+public boost::enable_shared_from_this<TempSharedListener>
+{
+public:
+TempSharedListener(const std::string& name, bool& liveFlag):
+ TempListener(name, liveFlag)
+{}
+};
- template<> template<>
- void events_object::test<16>()
- {
- set_test_name("listen(boost::bind(...TempSharedListener ref...))");
+template<> template<>
+void events_object::test<16>()
+{
+ set_test_name("listen(boost::bind(...TempSharedListener ref...))");
#if 0
- bool live = false;
- LLEventPump& heaptest(pumps.obtain("heaptest"));
- LLBoundListener connection;
- {
- // We MUST have at least one shared_ptr to an
- // enable_shared_from_this subclass object before
- // shared_from_this() can work.
- boost::shared_ptr<TempSharedListener>
- tempListener(new TempSharedListener("temp", live));
- ensure("TempSharedListener constructed", live);
- // However, we're not passing either the shared_ptr or its
- // corresponding weak_ptr -- instead, we're passing a reference to
- // the TempSharedListener.
+bool live = false;
+LLEventPump& heaptest(pumps.obtain("heaptest"));
+LLBoundListener connection;
+{
+ // We MUST have at least one shared_ptr to an
+ // enable_shared_from_this subclass object before
+ // shared_from_this() can work.
+ boost::shared_ptr<TempSharedListener>
+ tempListener(new TempSharedListener("temp", live));
+ ensure("TempSharedListener constructed", live);
+ // However, we're not passing either the shared_ptr or its
+ // corresponding weak_ptr -- instead, we're passing a reference to
+ // the TempSharedListener.
/*==========================================================================*|
- std::cout << "Capturing const ref" << std::endl;
- const boost::enable_shared_from_this<TempSharedListener>& cref(*tempListener);
- std::cout << "Capturing const ptr" << std::endl;
- const boost::enable_shared_from_this<TempSharedListener>* cp(&cref);
- std::cout << "Capturing non-const ptr" << std::endl;
- boost::enable_shared_from_this<TempSharedListener>* p(const_cast<boost::enable_shared_from_this<TempSharedListener>*>(cp));
- std::cout << "Capturing shared_from_this()" << std::endl;
- boost::shared_ptr<TempSharedListener> sp(p->shared_from_this());
- std::cout << "Capturing weak_ptr" << std::endl;
- boost::weak_ptr<TempSharedListener> wp(weaken(sp));
- std::cout << "Binding weak_ptr" << std::endl;
+ std::cout << "Capturing const ref" << std::endl;
+ const boost::enable_shared_from_this<TempSharedListener>& cref(*tempListener);
+ std::cout << "Capturing const ptr" << std::endl;
+ const boost::enable_shared_from_this<TempSharedListener>* cp(&cref);
+ std::cout << "Capturing non-const ptr" << std::endl;
+ boost::enable_shared_from_this<TempSharedListener>* p(const_cast<boost::enable_shared_from_this<TempSharedListener>*>(cp));
+ std::cout << "Capturing shared_from_this()" << std::endl;
+ boost::shared_ptr<TempSharedListener> sp(p->shared_from_this());
+ std::cout << "Capturing weak_ptr" << std::endl;
+ boost::weak_ptr<TempSharedListener> wp(weaken(sp));
+ std::cout << "Binding weak_ptr" << std::endl;
|*==========================================================================*/
- connection = heaptest.listen(tempListener->getName(),
- boost::bind(&TempSharedListener::call, *tempListener, _1));
- heaptest.post(1);
- check_listener("received", *tempListener, 1);
- } // presumably this will make tempListener go away?
- // verify that
- ensure("TempSharedListener destroyed", ! live);
- ensure("implicit disconnect", ! connection.connected());
- // now just make sure we don't blow up trying to access a freed object!
- heaptest.post(2);
+ connection = heaptest.listen(tempListener->getName(),
+ boost::bind(&TempSharedListener::call, *tempListener, _1));
+ heaptest.post(1);
+ check_listener("received", *tempListener, 1);
+} // presumably this will make tempListener go away?
+// verify that
+ensure("TempSharedListener destroyed", ! live);
+ensure("implicit disconnect", ! connection.connected());
+// now just make sure we don't blow up trying to access a freed object!
+heaptest.post(2);
#endif // 0
- }
+}
} // namespace tut
diff --git a/indra/test/llhttpclient_tut.cpp b/indra/test/llhttpclient_tut.cpp
index 03759001ae..4b4046632c 100644
--- a/indra/test/llhttpclient_tut.cpp
+++ b/indra/test/llhttpclient_tut.cpp
@@ -40,6 +40,7 @@
#include "llhttpclient.h"
#include "llformat.h"
#include "llpipeutil.h"
+#include "llproxy.h"
#include "llpumpio.h"
#include "llsdhttpserver.h"
@@ -85,9 +86,10 @@ namespace tut
HTTPClientTestData()
{
apr_pool_create(&mPool, NULL);
+ LLCurl::initClass(false);
mServerPump = new LLPumpIO(mPool);
mClientPump = new LLPumpIO(mPool);
-
+
LLHTTPClient::setPump(*mClientPump);
}
@@ -95,6 +97,7 @@ namespace tut
{
delete mServerPump;
delete mClientPump;
+ LLProxy::cleanupClass();
apr_pool_destroy(mPool);
}
diff --git a/indra/test/llsd_new_tut.cpp b/indra/test/llsd_new_tut.cpp
index dd93b36f04..f928a1bad0 100644
--- a/indra/test/llsd_new_tut.cpp
+++ b/indra/test/llsd_new_tut.cpp
@@ -5,7 +5,7 @@
*
* $LicenseInfo:firstyear=2006&license=viewerlgpl$
* Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
+ * Copyright (C) 2006-2011, Linden Research, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -25,6 +25,7 @@
* $/LicenseInfo$
*/
+#define LLSD_DEBUG_INFO
#include <tut/tut.hpp>
#include "linden_common.h"
#include "lltut.h"
@@ -32,6 +33,19 @@
#include "llsdtraits.h"
#include "llstring.h"
+#if LL_WINDOWS
+#include <float.h>
+namespace
+{
+ int fpclassify(double x)
+ {
+ return _fpclass(x);
+ }
+}
+#else
+using std::fpclassify;
+#endif
+
namespace tut
{
class SDCleanupCheck
@@ -39,11 +53,11 @@ namespace tut
private:
U32 mOutstandingAtStart;
public:
- SDCleanupCheck() : mOutstandingAtStart(LLSD::outstandingCount()) { }
+ SDCleanupCheck() : mOutstandingAtStart(llsd::outstandingCount()) { }
~SDCleanupCheck()
{
ensure_equals("SDCleanupCheck",
- LLSD::outstandingCount(), mOutstandingAtStart);
+ llsd::outstandingCount(), mOutstandingAtStart);
}
};
@@ -57,12 +71,12 @@ namespace tut
SDAllocationCheck(const std::string& message, int expectedAllocations)
: mMessage(message),
mExpectedAllocations(expectedAllocations),
- mAllocationAtStart(LLSD::allocationCount())
+ mAllocationAtStart(llsd::allocationCount())
{ }
~SDAllocationCheck()
{
ensure_equals(mMessage + " SDAllocationCheck",
- LLSD::allocationCount() - mAllocationAtStart,
+ llsd::allocationCount() - mAllocationAtStart,
mExpectedAllocations);
}
};
@@ -218,19 +232,16 @@ namespace tut
}
else
{
-// TODO: Fix on windows....
-#ifndef LL_WINDOWS
-# if !defined(fpclassify) && __GNUC__ >= 3
-# define FPCLASSIFY_NAMESPACE std::
-# else
-# define FPCLASSIFY_NAMESPACE
-# endif
- int left = FPCLASSIFY_NAMESPACE fpclassify(v.asReal());
- int right = FPCLASSIFY_NAMESPACE fpclassify(eReal);
+ int left = fpclassify(v.asReal());
+ int right = fpclassify(eReal);
ensure_equals(s+" to real", left, right);
- ensure_equals(s+" to string", v.asString(), eString);
-#endif
+ // ensure_equals(s+" to string", v.asString(), eString);
+ // I've commented this check out, since there doesn't
+ // seem to be uniform string representation for NaN on
+ // all platforms. For example, on my Ubuntu 8.10 laptop
+ // with libc 2.11.1, sqrt(-1.0) will return '-nan', not
+ // 'nan'.
}
}
@@ -742,6 +753,78 @@ namespace tut
LLSD w = v;
w = "nice day";
}
+
+ {
+ SDAllocationCheck check("shared values test for threaded work", 9);
+
+ //U32 start_llsd_count = llsd::outstandingCount();
+
+ LLSD m = LLSD::emptyMap();
+
+ m["one"] = 1;
+ m["two"] = 2;
+ m["one_copy"] = m["one"]; // 3 (m, "one" and "two")
+
+ m["undef_one"] = LLSD();
+ m["undef_two"] = LLSD();
+ m["undef_one_copy"] = m["undef_one"];
+
+ { // Ensure first_array gets freed to avoid counting it
+ LLSD first_array = LLSD::emptyArray();
+ first_array.append(1.0f);
+ first_array.append(2.0f);
+ first_array.append(3.0f); // 7
+
+ m["array"] = first_array;
+ m["array_clone"] = first_array;
+ m["array_copy"] = m["array"]; // 7
+ }
+
+ m["string_one"] = "string one value";
+ m["string_two"] = "string two value";
+ m["string_one_copy"] = m["string_one"]; // 9
+
+ //U32 llsd_object_count = llsd::outstandingCount();
+ //std::cout << "Using " << (llsd_object_count - start_llsd_count) << " LLSD objects" << std::endl;
+
+ //m.dumpStats();
+ }
+
+ {
+ SDAllocationCheck check("shared values test for threaded work", 9);
+
+ //U32 start_llsd_count = LLSD::outstandingCount();
+
+ LLSD m = LLSD::emptyMap();
+
+ m["one"] = 1;
+ m["two"] = 2;
+ m["one_copy"] = m["one"]; // 3 (m, "one" and "two")
+
+ m["undef_one"] = LLSD();
+ m["undef_two"] = LLSD();
+ m["undef_one_copy"] = m["undef_one"];
+
+ { // Ensure first_array gets freed to avoid counting it
+ LLSD first_array = LLSD::emptyArray();
+ first_array.append(1.0f);
+ first_array.append(2.0f);
+ first_array.append(3.0f); // 7
+
+ m["array"] = first_array;
+ m["array_clone"] = first_array;
+ m["array_copy"] = m["array"]; // 7
+ }
+
+ m["string_one"] = "string one value";
+ m["string_two"] = "string two value";
+ m["string_one_copy"] = m["string_one"]; // 9
+
+ //U32 llsd_object_count = LLSD::outstandingCount();
+ //std::cout << "Using " << (llsd_object_count - start_llsd_count) << " LLSD objects" << std::endl;
+
+ //m.dumpStats();
+ }
}
template<> template<>
@@ -769,4 +852,3 @@ namespace tut
test serializations
*/
}
-
diff --git a/indra/test/llsdmessagebuilder_tut.cpp b/indra/test/llsdmessagebuilder_tut.cpp
index cc6f78decd..be0692557a 100644
--- a/indra/test/llsdmessagebuilder_tut.cpp
+++ b/indra/test/llsdmessagebuilder_tut.cpp
@@ -33,6 +33,7 @@
#include "llsdmessagebuilder.h"
#include "llsdmessagereader.h"
#include "llsdtraits.h"
+#include "llmath.h"
#include "llquaternion.h"
#include "u64.h"
#include "v3dmath.h"
@@ -86,17 +87,17 @@ namespace tut
return createTemplateBlock(_PREHASH_Test0, type, size, block);
}
- static LLMessageBlock* createTemplateBlock(char* name, const EMsgVariableType type = MVT_NULL, const S32 size = 0, EMsgBlockType block = MBT_VARIABLE)
+ static LLMessageBlock* createTemplateBlock(const char* name, const EMsgVariableType type = MVT_NULL, const S32 size = 0, EMsgBlockType block = MBT_VARIABLE)
{
LLMessageBlock* result = new LLMessageBlock(name, block);
if(type != MVT_NULL)
{
- result->addVariable(_PREHASH_Test0, type, size);
+ result->addVariable(const_cast<char*>(_PREHASH_Test0), type, size);
}
return result;
}
- static LLTemplateMessageBuilder* defaultTemplateBuilder(LLMessageTemplate& messageTemplate, char* name = _PREHASH_Test0)
+ static LLTemplateMessageBuilder* defaultTemplateBuilder(LLMessageTemplate& messageTemplate, char* name = const_cast<char*>(_PREHASH_Test0))
{
templateNameMap[_PREHASH_TestMessage] = &messageTemplate;
LLTemplateMessageBuilder* builder = new LLTemplateMessageBuilder(templateNameMap);
diff --git a/indra/test/lltemplatemessagebuilder_tut.cpp b/indra/test/lltemplatemessagebuilder_tut.cpp
index 532f26ee60..6e1c82bb24 100644
--- a/indra/test/lltemplatemessagebuilder_tut.cpp
+++ b/indra/test/lltemplatemessagebuilder_tut.cpp
@@ -29,7 +29,9 @@
#include "linden_common.h"
#include "lltut.h"
+#include "llapr.h"
#include "llmessagetemplate.h"
+#include "llmath.h"
#include "llquaternion.h"
#include "lltemplatemessagebuilder.h"
#include "lltemplatemessagereader.h"
@@ -52,6 +54,7 @@ namespace tut
static bool init = false;
if(! init)
{
+ ll_init_apr();
const F32 circuit_heartbeat_interval=5;
const F32 circuit_timeout=100;
@@ -73,7 +76,7 @@ namespace tut
static LLMessageBlock* defaultBlock(const EMsgVariableType type = MVT_NULL, const S32 size = 0, EMsgBlockType block = MBT_VARIABLE)
{
- return createBlock(_PREHASH_Test0, type, size, block);
+ return createBlock(const_cast<char*>(_PREHASH_Test0), type, size, block);
}
static LLMessageBlock* createBlock(char* name, const EMsgVariableType type = MVT_NULL, const S32 size = 0, EMsgBlockType block = MBT_VARIABLE)
@@ -81,12 +84,12 @@ namespace tut
LLMessageBlock* result = new LLMessageBlock(name, block);
if(type != MVT_NULL)
{
- result->addVariable(_PREHASH_Test0, type, size);
+ result->addVariable(const_cast<char*>(_PREHASH_Test0), type, size);
}
return result;
}
- static LLTemplateMessageBuilder* defaultBuilder(LLMessageTemplate& messageTemplate, char* name = _PREHASH_Test0)
+ static LLTemplateMessageBuilder* defaultBuilder(LLMessageTemplate& messageTemplate, char* name = const_cast<char*>(_PREHASH_Test0))
{
nameMap[_PREHASH_TestMessage] = &messageTemplate;
LLTemplateMessageBuilder* builder = new LLTemplateMessageBuilder(nameMap);
@@ -401,11 +404,11 @@ namespace tut
// build template: Test0 before Test1
LLMessageTemplate messageTemplate = defaultTemplate();
- messageTemplate.addBlock(createBlock(_PREHASH_Test0, MVT_U32, 4, MBT_SINGLE));
- messageTemplate.addBlock(createBlock(_PREHASH_Test1, MVT_U32, 4, MBT_SINGLE));
+ messageTemplate.addBlock(createBlock(const_cast<char*>(_PREHASH_Test0), MVT_U32, 4, MBT_SINGLE));
+ messageTemplate.addBlock(createBlock(const_cast<char*>(_PREHASH_Test1), MVT_U32, 4, MBT_SINGLE));
// build message: 1st declared block var == 0xaaaa, 2nd declared block var == 0xbbbb
- LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate, _PREHASH_Test0);
+ LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate, const_cast<char*>(_PREHASH_Test0));
builder->addU32(_PREHASH_Test0, 0xaaaa);
builder->nextBlock(_PREHASH_Test1);
builder->addU32(_PREHASH_Test0, 0xbbbb);
@@ -414,11 +417,11 @@ namespace tut
// build template: Test1 before Test0
messageTemplate = defaultTemplate();
- messageTemplate.addBlock(createBlock(_PREHASH_Test1, MVT_U32, 4, MBT_SINGLE));
- messageTemplate.addBlock(createBlock(_PREHASH_Test0, MVT_U32, 4, MBT_SINGLE));
+ messageTemplate.addBlock(createBlock(const_cast<char*>(_PREHASH_Test1), MVT_U32, 4, MBT_SINGLE));
+ messageTemplate.addBlock(createBlock(const_cast<char*>(_PREHASH_Test0), MVT_U32, 4, MBT_SINGLE));
// build message: 1st declared block var == 0xaaaa, 2nd declared block var == 0xbbbb
- builder = defaultBuilder(messageTemplate, _PREHASH_Test1);
+ builder = defaultBuilder(messageTemplate, const_cast<char*>(_PREHASH_Test1));
builder->addU32(_PREHASH_Test0, 0xaaaa);
builder->nextBlock(_PREHASH_Test0);
builder->addU32(_PREHASH_Test0, 0xbbbb);
@@ -441,11 +444,11 @@ namespace tut
// build template: Test0 before Test1
LLMessageTemplate messageTemplate = defaultTemplate();
- messageTemplate.addBlock(createBlock(_PREHASH_Test0, MVT_U32, 4, MBT_SINGLE));
- messageTemplate.addBlock(createBlock(_PREHASH_Test1, MVT_U32, 4, MBT_SINGLE));
+ messageTemplate.addBlock(createBlock(const_cast<char*>(_PREHASH_Test0), MVT_U32, 4, MBT_SINGLE));
+ messageTemplate.addBlock(createBlock(const_cast<char*>(_PREHASH_Test1), MVT_U32, 4, MBT_SINGLE));
// build message: 1st declared block var == 0xaaaa, 2nd declared block var == 0xbbbb
- LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate, _PREHASH_Test0);
+ LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate, const_cast<char*>(_PREHASH_Test0));
builder->addU32(_PREHASH_Test0, 0xaaaa);
builder->nextBlock(_PREHASH_Test1);
builder->addU32(_PREHASH_Test0, 0xbbbb);
@@ -453,7 +456,7 @@ namespace tut
delete builder;
// build message: 1st declared block var == 0xaaaa, 2nd declared block var == 0xbbbb
- builder = defaultBuilder(messageTemplate, _PREHASH_Test1);
+ builder = defaultBuilder(messageTemplate, const_cast<char*>(_PREHASH_Test1));
builder->addU32(_PREHASH_Test0, 0xbbbb);
builder->nextBlock(_PREHASH_Test0);
builder->addU32(_PREHASH_Test0, 0xaaaa);
@@ -476,21 +479,21 @@ namespace tut
// Build template: Test0 only
LLMessageTemplate messageTemplate = defaultTemplate();
- messageTemplate.addBlock(createBlock(_PREHASH_Test0, MVT_U32, 4, MBT_SINGLE));
+ messageTemplate.addBlock(createBlock(const_cast<char*>(_PREHASH_Test0), MVT_U32, 4, MBT_SINGLE));
// Build message
- LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate, _PREHASH_Test0);
+ LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate, const_cast<char*>(_PREHASH_Test0));
builder->addU32(_PREHASH_Test0, 0xaaaa);
bufferSize1 = builder->buildMessage(buffer1, MAX_BUFFER_SIZE, 0);
delete builder;
// Build template: Test0 before Test1
messageTemplate = defaultTemplate();
- messageTemplate.addBlock(createBlock(_PREHASH_Test0, MVT_U32, 4, MBT_SINGLE));
- messageTemplate.addBlock(createBlock(_PREHASH_Test1, MVT_U32, 4, MBT_SINGLE));
+ messageTemplate.addBlock(createBlock(const_cast<char*>(_PREHASH_Test0), MVT_U32, 4, MBT_SINGLE));
+ messageTemplate.addBlock(createBlock(const_cast<char*>(_PREHASH_Test1), MVT_U32, 4, MBT_SINGLE));
// Build message
- builder = defaultBuilder(messageTemplate, _PREHASH_Test0);
+ builder = defaultBuilder(messageTemplate, const_cast<char*>(_PREHASH_Test0));
builder->addU32(_PREHASH_Test0, 0xaaaa);
builder->nextBlock(_PREHASH_Test1);
builder->addU32(_PREHASH_Test0, 0xbbbb);
@@ -509,8 +512,8 @@ namespace tut
U32 inTest00 = 0, inTest01 = 1, inTest1 = 2;
U32 outTest00, outTest01, outTest1;
LLMessageTemplate messageTemplate = defaultTemplate();
- messageTemplate.addBlock(createBlock(_PREHASH_Test0, MVT_U32, 4));
- messageTemplate.addBlock(createBlock(_PREHASH_Test1, MVT_U32, 4));
+ messageTemplate.addBlock(createBlock(const_cast<char*>(_PREHASH_Test0), MVT_U32, 4));
+ messageTemplate.addBlock(createBlock(const_cast<char*>(_PREHASH_Test1), MVT_U32, 4));
LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate);
builder->addU32(_PREHASH_Test0, inTest00);
builder->nextBlock(_PREHASH_Test0);
@@ -534,15 +537,15 @@ namespace tut
U32 inTest = 1, outTest;
LLMessageTemplate messageTemplate = defaultTemplate();
messageTemplate.addBlock(
- createBlock(_PREHASH_Test0, MVT_U32, 4, MBT_SINGLE));
- messageTemplate.addBlock(createBlock(_PREHASH_Test1, MVT_U32, 4));
+ createBlock(const_cast<char*>(_PREHASH_Test0), MVT_U32, 4, MBT_SINGLE));
+ messageTemplate.addBlock(createBlock(const_cast<char*>(_PREHASH_Test1), MVT_U32, 4));
LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate);
builder->addU32(_PREHASH_Test0, inTest);
LLTemplateMessageReader* reader = setReader(messageTemplate, builder);
reader->getU32(_PREHASH_Test0, _PREHASH_Test0, outTest);
- S32 blockCount = reader->getNumberOfBlocks(_PREHASH_Test1);
+ S32 blockCount = reader->getNumberOfBlocks(const_cast<char*>(_PREHASH_Test1));
ensure_equals("Ensure block count", blockCount, 0);
ensure_equals("Ensure Test0", inTest, outTest);
delete reader;
@@ -554,7 +557,7 @@ namespace tut
{
// build template
LLMessageTemplate messageTemplate = defaultTemplate();
- messageTemplate.addBlock(createBlock(_PREHASH_Test0, MVT_U32, 4));
+ messageTemplate.addBlock(createBlock(const_cast<char*>(_PREHASH_Test0), MVT_U32, 4));
// build message
LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate);
@@ -879,7 +882,7 @@ namespace tut
delete builder;
// add block to reader template
- messageTemplate.addBlock(createBlock(_PREHASH_Test1, MVT_U32, 4, MBT_SINGLE));
+ messageTemplate.addBlock(createBlock(const_cast<char*>(_PREHASH_Test1), MVT_U32, 4, MBT_SINGLE));
// read message value and default value
numberMap[1] = &messageTemplate;
@@ -912,7 +915,7 @@ namespace tut
delete builder;
// add variable block to reader template
- messageTemplate.addBlock(createBlock(_PREHASH_Test1, MVT_U32, 4));
+ messageTemplate.addBlock(createBlock(const_cast<char*>(_PREHASH_Test1), MVT_U32, 4));
// read message value and check block repeat count
numberMap[1] = &messageTemplate;
@@ -945,7 +948,7 @@ namespace tut
delete builder;
// add variable block to reader template
- messageTemplate.addBlock(createBlock(_PREHASH_Test1, MVT_VARIABLE, 4,
+ messageTemplate.addBlock(createBlock(const_cast<char*>(_PREHASH_Test1), MVT_VARIABLE, 4,
MBT_SINGLE));
// read message value and default string
diff --git a/indra/test/lltut.cpp b/indra/test/lltut.cpp
index da7031b52a..c43a8f0c7d 100644
--- a/indra/test/lltut.cpp
+++ b/indra/test/lltut.cpp
@@ -34,6 +34,7 @@
#include "llformat.h"
#include "llsd.h"
#include "lluri.h"
+#include "stringize.h"
namespace tut
{
@@ -144,6 +145,10 @@ namespace tut
}
return;
}
+ default:
+ // should never get here, but compiler produces warning if we
+ // don't cover this case, and at Linden warnings are fatal.
+ throw failure(STRINGIZE("invalid type field " << actual.type()));
}
}
diff --git a/indra/test/manageapr.h b/indra/test/manageapr.h
new file mode 100644
index 0000000000..2452fb6ae4
--- /dev/null
+++ b/indra/test/manageapr.h
@@ -0,0 +1,46 @@
+/**
+ * @file manageapr.h
+ * @author Nat Goodspeed
+ * @date 2012-01-13
+ * @brief ManageAPR class for simple test programs
+ *
+ * $LicenseInfo:firstyear=2012&license=viewerlgpl$
+ * Copyright (c) 2012, Linden Research, Inc.
+ * $/LicenseInfo$
+ */
+
+#if ! defined(LL_MANAGEAPR_H)
+#define LL_MANAGEAPR_H
+
+#include "llapr.h"
+#include <boost/noncopyable.hpp>
+
+/**
+ * Declare a static instance of this class for dead-simple ll_init_apr() at
+ * program startup, ll_cleanup_apr() at termination. This is recommended for
+ * use only with simple test programs. Once you start introducing static
+ * instances of other classes that depend on APR already being initialized,
+ * the indeterminate static-constructor-order problem rears its ugly head.
+ */
+class ManageAPR: public boost::noncopyable
+{
+public:
+ ManageAPR()
+ {
+ ll_init_apr();
+ }
+
+ ~ManageAPR()
+ {
+ ll_cleanup_apr();
+ }
+
+ static std::string strerror(apr_status_t rv)
+ {
+ char errbuf[256];
+ apr_strerror(rv, errbuf, sizeof(errbuf));
+ return errbuf;
+ }
+};
+
+#endif /* ! defined(LL_MANAGEAPR_H) */
diff --git a/indra/test/message_tut.cpp b/indra/test/message_tut.cpp
index 9a6ccd4d68..d971b33475 100644
--- a/indra/test/message_tut.cpp
+++ b/indra/test/message_tut.cpp
@@ -29,6 +29,7 @@
#include "linden_common.h"
#include "lltut.h"
+#include "llapr.h"
#include "llmessageconfig.h"
#include "llsdserialize.h"
#include "llversionserver.h"
@@ -61,6 +62,7 @@ namespace tut
static bool init = false;
if(!init)
{
+ ll_init_apr();
//init_prehash_data();
init = true;
}
diff --git a/indra/test/namedtempfile.h b/indra/test/namedtempfile.h
new file mode 100644
index 0000000000..6069064627
--- /dev/null
+++ b/indra/test/namedtempfile.h
@@ -0,0 +1,205 @@
+/**
+ * @file namedtempfile.h
+ * @author Nat Goodspeed
+ * @date 2012-01-13
+ * @brief NamedTempFile class for tests that need disk files as fixtures.
+ *
+ * $LicenseInfo:firstyear=2012&license=viewerlgpl$
+ * Copyright (c) 2012, Linden Research, Inc.
+ * $/LicenseInfo$
+ */
+
+#if ! defined(LL_NAMEDTEMPFILE_H)
+#define LL_NAMEDTEMPFILE_H
+
+#include "llerror.h"
+#include "llapr.h"
+#include "apr_file_io.h"
+#include <string>
+#include <boost/function.hpp>
+#include <boost/lambda/lambda.hpp>
+#include <boost/lambda/bind.hpp>
+#include <boost/noncopyable.hpp>
+#include <iostream>
+#include <sstream>
+
+/**
+ * Create a text file with specified content "somewhere in the
+ * filesystem," cleaning up when it goes out of scope.
+ */
+class NamedTempFile: public boost::noncopyable
+{
+ LOG_CLASS(NamedTempFile);
+public:
+ NamedTempFile(const std::string& pfx, const std::string& content, apr_pool_t* pool=gAPRPoolp):
+ mPool(pool)
+ {
+ createFile(pfx, boost::lambda::_1 << content);
+ }
+
+ // Disambiguate when passing string literal
+ NamedTempFile(const std::string& pfx, const char* content, apr_pool_t* pool=gAPRPoolp):
+ mPool(pool)
+ {
+ createFile(pfx, boost::lambda::_1 << content);
+ }
+
+ // Function that accepts an ostream ref and (presumably) writes stuff to
+ // it, e.g.:
+ // (boost::lambda::_1 << "the value is " << 17 << '\n')
+ typedef boost::function<void(std::ostream&)> Streamer;
+
+ NamedTempFile(const std::string& pfx, const Streamer& func, apr_pool_t* pool=gAPRPoolp):
+ mPool(pool)
+ {
+ createFile(pfx, func);
+ }
+
+ virtual ~NamedTempFile()
+ {
+ ll_apr_assert_status(apr_file_remove(mPath.c_str(), mPool));
+ }
+
+ virtual std::string getName() const { return mPath; }
+
+ void peep()
+ {
+ std::cout << "File '" << mPath << "' contains:\n";
+ std::ifstream reader(mPath.c_str());
+ std::string line;
+ while (std::getline(reader, line))
+ std::cout << line << '\n';
+ std::cout << "---\n";
+ }
+
+protected:
+ void createFile(const std::string& pfx, const Streamer& func)
+ {
+ // Create file in a temporary place.
+ const char* tempdir = NULL;
+ ll_apr_assert_status(apr_temp_dir_get(&tempdir, mPool));
+
+ // Construct a temp filename template in that directory.
+ char *tempname = NULL;
+ ll_apr_assert_status(apr_filepath_merge(&tempname,
+ tempdir,
+ (pfx + "XXXXXX").c_str(),
+ 0,
+ mPool));
+
+ // Create a temp file from that template.
+ apr_file_t* fp = NULL;
+ ll_apr_assert_status(apr_file_mktemp(&fp,
+ tempname,
+ APR_CREATE | APR_WRITE | APR_EXCL,
+ mPool));
+ // apr_file_mktemp() alters tempname with the actual name. Not until
+ // now is it valid to capture as our mPath.
+ mPath = tempname;
+
+ // Write desired content.
+ std::ostringstream out;
+ // Stream stuff to it.
+ func(out);
+
+ std::string data(out.str());
+ apr_size_t writelen(data.length());
+ ll_apr_assert_status(apr_file_write(fp, data.c_str(), &writelen));
+ ll_apr_assert_status(apr_file_close(fp));
+ llassert_always(writelen == data.length());
+ }
+
+ std::string mPath;
+ apr_pool_t* mPool;
+};
+
+/**
+ * Create a NamedTempFile with a specified filename extension. This is useful
+ * when, for instance, you must be able to use the file in a Python import
+ * statement.
+ *
+ * A NamedExtTempFile actually has two different names. We retain the original
+ * no-extension name as a placeholder in the temp directory to ensure
+ * uniqueness; to that we link the name plus the desired extension. Naturally,
+ * both must be removed on destruction.
+ */
+class NamedExtTempFile: public NamedTempFile
+{
+ LOG_CLASS(NamedExtTempFile);
+public:
+ NamedExtTempFile(const std::string& ext, const std::string& content, apr_pool_t* pool=gAPRPoolp):
+ NamedTempFile(remove_dot(ext), content, pool),
+ mLink(mPath + ensure_dot(ext))
+ {
+ linkto(mLink);
+ }
+
+ // Disambiguate when passing string literal
+ NamedExtTempFile(const std::string& ext, const char* content, apr_pool_t* pool=gAPRPoolp):
+ NamedTempFile(remove_dot(ext), content, pool),
+ mLink(mPath + ensure_dot(ext))
+ {
+ linkto(mLink);
+ }
+
+ NamedExtTempFile(const std::string& ext, const Streamer& func, apr_pool_t* pool=gAPRPoolp):
+ NamedTempFile(remove_dot(ext), func, pool),
+ mLink(mPath + ensure_dot(ext))
+ {
+ linkto(mLink);
+ }
+
+ virtual ~NamedExtTempFile()
+ {
+ ll_apr_assert_status(apr_file_remove(mLink.c_str(), mPool));
+ }
+
+ // Since the caller has gone to the trouble to create the name with the
+ // extension, that should be the name we return. In this class, mPath is
+ // just a placeholder to ensure that future createFile() calls won't
+ // collide.
+ virtual std::string getName() const { return mLink; }
+
+ static std::string ensure_dot(const std::string& ext)
+ {
+ if (ext.empty())
+ {
+ // What SHOULD we do when the caller makes a point of using
+ // NamedExtTempFile to generate a file with a particular
+ // extension, then passes an empty extension? Use just "."? That
+ // sounds like a Bad Idea, especially on Windows. Treat that as a
+ // coding error.
+ LL_ERRS("NamedExtTempFile") << "passed empty extension" << LL_ENDL;
+ }
+ if (ext[0] == '.')
+ {
+ return ext;
+ }
+ return std::string(".") + ext;
+ }
+
+ static std::string remove_dot(const std::string& ext)
+ {
+ std::string::size_type found = ext.find_first_not_of(".");
+ if (found == std::string::npos)
+ {
+ return ext;
+ }
+ return ext.substr(found);
+ }
+
+private:
+ void linkto(const std::string& path)
+ {
+ // This method assumes that since mPath (without extension) is
+ // guaranteed by apr_file_mktemp() to be unique, then (mPath + any
+ // extension) is also unique. This is likely, though not guaranteed:
+ // files could be created in the same temp directory other than by
+ // this class.
+ ll_apr_assert_status(apr_file_link(mPath.c_str(), path.c_str()));
+ }
+
+ std::string mLink;
+};
+
+#endif /* ! defined(LL_NAMEDTEMPFILE_H) */
diff --git a/indra/test/test.cpp b/indra/test/test.cpp
index 45e8aef99a..128d84e428 100644
--- a/indra/test/test.cpp
+++ b/indra/test/test.cpp
@@ -37,8 +37,10 @@
#include "linden_common.h"
#include "llerrorcontrol.h"
#include "lltut.h"
-#include "llaprpool.h"
+#include "stringize.h"
+#include "namedtempfile.h"
+#include "apr_pools.h"
#include "apr_getopt.h"
// the CTYPE_WORKAROUND is needed for linux dev stations that don't
@@ -53,24 +55,118 @@
#include <gtest/gtest.h>
#endif
+#if LL_MSVC
+#pragma warning (push)
+#pragma warning (disable : 4702) // warning C4702: unreachable code
+#endif
+#include <boost/iostreams/tee.hpp>
+#include <boost/iostreams/stream.hpp>
+#if LL_MSVC
+#pragma warning (pop)
+#endif
+
+#include <boost/shared_ptr.hpp>
+#include <boost/make_shared.hpp>
+#include <boost/foreach.hpp>
+#include <boost/lambda/lambda.hpp>
+
+#include <fstream>
+
+void wouldHaveCrashed(const std::string& message);
+
namespace tut
{
std::string sSourceDir;
-
- test_runner_singleton runner;
+
+ test_runner_singleton runner;
}
+class LLReplayLog
+{
+public:
+ LLReplayLog() {}
+ virtual ~LLReplayLog() {}
+
+ virtual void reset() {}
+ virtual void replay(std::ostream&) {}
+};
+
+class LLReplayLogReal: public LLReplayLog, public LLError::Recorder
+{
+public:
+ LLReplayLogReal(LLError::ELevel level, apr_pool_t* pool):
+ mOldSettings(LLError::saveAndResetSettings()),
+ mTempFile("log", "", pool), // create file
+ mFile(mTempFile.getName().c_str()) // open it
+ {
+ LLError::setFatalFunction(wouldHaveCrashed);
+ LLError::setDefaultLevel(level);
+ LLError::addRecorder(this);
+ }
+
+ virtual ~LLReplayLogReal()
+ {
+ LLError::removeRecorder(this);
+ LLError::restoreSettings(mOldSettings);
+ }
+
+ virtual void recordMessage(LLError::ELevel level, const std::string& message)
+ {
+ mFile << message << std::endl;
+ }
+
+ virtual void reset()
+ {
+ mFile.close();
+ mFile.open(mTempFile.getName().c_str());
+ }
+
+ virtual void replay(std::ostream& out)
+ {
+ mFile.close();
+ std::ifstream inf(mTempFile.getName().c_str());
+ std::string line;
+ while (std::getline(inf, line))
+ {
+ out << line << std::endl;
+ }
+ }
+
+private:
+ LLError::Settings* mOldSettings;
+ NamedTempFile mTempFile;
+ std::ofstream mFile;
+};
+
class LLTestCallback : public tut::callback
{
public:
- LLTestCallback(bool verbose_mode, std::ostream *stream) :
+ LLTestCallback(bool verbose_mode, std::ostream *stream,
+ boost::shared_ptr<LLReplayLog> replayer) :
mVerboseMode(verbose_mode),
mTotalTests(0),
mPassedTests(0),
mFailedTests(0),
mSkippedTests(0),
- mStream(stream)
+ // By default, capture a shared_ptr to std::cout, with a no-op "deleter"
+ // so that destroying the shared_ptr makes no attempt to delete std::cout.
+ mStream(boost::shared_ptr<std::ostream>(&std::cout, boost::lambda::_1)),
+ mReplayer(replayer)
{
+ if (stream)
+ {
+ // We want a boost::iostreams::tee_device that will stream to two
+ // std::ostreams.
+ typedef boost::iostreams::tee_device<std::ostream, std::ostream> TeeDevice;
+ // More than that, though, we want an actual stream using that
+ // device.
+ typedef boost::iostreams::stream<TeeDevice> TeeStream;
+ // Allocate and assign in two separate steps, per Herb Sutter.
+ // (Until we turn on C++11 support, have to wrap *stream with
+ // boost::ref() due to lack of perfect forwarding.)
+ boost::shared_ptr<std::ostream> pstream(new TeeStream(std::cout, boost::ref(*stream)));
+ mStream = pstream;
+ }
}
~LLTestCallback()
@@ -93,8 +189,21 @@ public:
virtual void test_completed(const tut::test_result& tr)
{
++mTotalTests;
+
+ // If this test failed, dump requested log messages BEFORE stating the
+ // test result.
+ if (tr.result != tut::test_result::ok && tr.result != tut::test_result::skip)
+ {
+ mReplayer->replay(*mStream);
+ }
+ // Either way, clear stored messages in preparation for next test.
+ mReplayer->reset();
+
std::ostringstream out;
- out << "[" << tr.group << ", " << tr.test << "] ";
+ out << "[" << tr.group << ", " << tr.test;
+ if (! tr.name.empty())
+ out << ": " << tr.name;
+ out << "] ";
switch(tr.result)
{
case tut::test_result::ok:
@@ -123,56 +232,43 @@ public:
break;
default:
++mFailedTests;
- out << "unknown";
+ out << "unknown (tr.result == " << tr.result << ")";
}
if(mVerboseMode || (tr.result != tut::test_result::ok))
{
+ *mStream << out.str();
if(!tr.message.empty())
{
- out << ": '" << tr.message << "'";
+ *mStream << ": '" << tr.message << "'";
}
- if (mStream)
- {
- *mStream << out.str() << std::endl;
- }
-
- std::cout << out.str() << std::endl;
- }
- }
-
- virtual void run_completed()
- {
- if (mStream)
- {
- run_completed_(*mStream);
+ *mStream << std::endl;
}
- run_completed_(std::cout);
}
virtual int getFailedTests() const { return mFailedTests; }
- virtual void run_completed_(std::ostream &stream)
+ virtual void run_completed()
{
- stream << "\tTotal Tests:\t" << mTotalTests << std::endl;
- stream << "\tPassed Tests:\t" << mPassedTests;
+ *mStream << "\tTotal Tests:\t" << mTotalTests << std::endl;
+ *mStream << "\tPassed Tests:\t" << mPassedTests;
if (mPassedTests == mTotalTests)
{
- stream << "\tYAY!! \\o/";
+ *mStream << "\tYAY!! \\o/";
}
- stream << std::endl;
+ *mStream << std::endl;
if (mSkippedTests > 0)
{
- stream << "\tSkipped known failures:\t" << mSkippedTests
+ *mStream << "\tSkipped known failures:\t" << mSkippedTests
<< std::endl;
}
if(mFailedTests > 0)
{
- stream << "*********************************" << std::endl;
- stream << "Failed Tests:\t" << mFailedTests << std::endl;
- stream << "Please report or fix the problem." << std::endl;
- stream << "*********************************" << std::endl;
+ *mStream << "*********************************" << std::endl;
+ *mStream << "Failed Tests:\t" << mFailedTests << std::endl;
+ *mStream << "Please report or fix the problem." << std::endl;
+ *mStream << "*********************************" << std::endl;
}
}
@@ -182,7 +278,8 @@ protected:
int mPassedTests;
int mFailedTests;
int mSkippedTests;
- std::ostream *mStream;
+ boost::shared_ptr<std::ostream> mStream;
+ boost::shared_ptr<LLReplayLog> mReplayer;
};
// TeamCity specific class which emits service messages
@@ -191,85 +288,113 @@ protected:
class LLTCTestCallback : public LLTestCallback
{
public:
- LLTCTestCallback(bool verbose_mode, std::ostream *stream) :
- LLTestCallback(verbose_mode, stream),
- mTCStream()
+ LLTCTestCallback(bool verbose_mode, std::ostream *stream,
+ boost::shared_ptr<LLReplayLog> replayer) :
+ LLTestCallback(verbose_mode, stream, replayer)
{
}
~LLTCTestCallback()
{
- }
+ }
virtual void group_started(const std::string& name) {
LLTestCallback::group_started(name);
- mTCStream << "\n##teamcity[testSuiteStarted name='" << name << "']" << std::endl;
+ std::cout << "\n##teamcity[testSuiteStarted name='" << escape(name) << "']" << std::endl;
}
virtual void group_completed(const std::string& name) {
LLTestCallback::group_completed(name);
- mTCStream << "##teamcity[testSuiteFinished name='" << name << "']" << std::endl;
+ std::cout << "##teamcity[testSuiteFinished name='" << escape(name) << "']" << std::endl;
}
virtual void test_completed(const tut::test_result& tr)
{
+ std::string testname(STRINGIZE(tr.group << "." << tr.test));
+ if (! tr.name.empty())
+ {
+ testname.append(":");
+ testname.append(tr.name);
+ }
+ testname = escape(testname);
+
+ // Sadly, tut::callback doesn't give us control at test start; have to
+ // backfill start message into TC output.
+ std::cout << "##teamcity[testStarted name='" << testname << "']" << std::endl;
+
+ // now forward call to base class so any output produced there is in
+ // the right TC context
LLTestCallback::test_completed(tr);
switch(tr.result)
{
case tut::test_result::ok:
- mTCStream << "##teamcity[testStarted name='" << tr.group << "." << tr.test << "']" << std::endl;
- mTCStream << "##teamcity[testFinished name='" << tr.group << "." << tr.test << "']" << std::endl;
break;
+
case tut::test_result::fail:
- mTCStream << "##teamcity[testStarted name='" << tr.group << "." << tr.test << "']" << std::endl;
- mTCStream << "##teamcity[testFailed name='" << tr.group << "." << tr.test << "' message='" << tr.message << "']" << std::endl;
- mTCStream << "##teamcity[testFinished name='" << tr.group << "." << tr.test << "']" << std::endl;
- break;
case tut::test_result::ex:
- mTCStream << "##teamcity[testStarted name='" << tr.group << "." << tr.test << "']" << std::endl;
- mTCStream << "##teamcity[testFailed name='" << tr.group << "." << tr.test << "' message='" << tr.message << "']" << std::endl;
- mTCStream << "##teamcity[testFinished name='" << tr.group << "." << tr.test << "']" << std::endl;
- break;
case tut::test_result::warn:
- mTCStream << "##teamcity[testStarted name='" << tr.group << "." << tr.test << "']" << std::endl;
- mTCStream << "##teamcity[testFailed name='" << tr.group << "." << tr.test << "' message='" << tr.message << "']" << std::endl;
- mTCStream << "##teamcity[testFinished name='" << tr.group << "." << tr.test << "']" << std::endl;
- break;
case tut::test_result::term:
- mTCStream << "##teamcity[testStarted name='" << tr.group << "." << tr.test << "']" << std::endl;
- mTCStream << "##teamcity[testFailed name='" << tr.group << "." << tr.test << "' message='" << tr.message << "']" << std::endl;
- mTCStream << "##teamcity[testFinished name='" << tr.group << "." << tr.test << "']" << std::endl;
+ std::cout << "##teamcity[testFailed name='" << testname
+ << "' message='" << escape(tr.message) << "']" << std::endl;
break;
+
case tut::test_result::skip:
- mTCStream << "##teamcity[testStarted name='" << tr.group << "." << tr.test << "']" << std::endl;
- mTCStream << "##teamcity[testIgnored name='" << tr.group << "." << tr.test << "']" << std::endl;
- mTCStream << "##teamcity[testFinished name='" << tr.group << "." << tr.test << "']" << std::endl;
+ std::cout << "##teamcity[testIgnored name='" << testname << "']" << std::endl;
break;
+
default:
break;
}
+ std::cout << "##teamcity[testFinished name='" << testname << "']" << std::endl;
}
- virtual void run_completed()
- {
- LLTestCallback::run_completed();
-
- // dump the TC reporting results to cout
- tc_run_completed_(std::cout);
- }
-
- virtual void tc_run_completed_(std::ostream &stream)
+ static std::string escape(const std::string& str)
{
-
- // dump the TC reporting results to cout
- stream << mTCStream.str() << std::endl;
+ // Per http://confluence.jetbrains.net/display/TCD65/Build+Script+Interaction+with+TeamCity#BuildScriptInteractionwithTeamCity-ServiceMessages
+ std::string result;
+ BOOST_FOREACH(char c, str)
+ {
+ switch (c)
+ {
+ case '\'':
+ result.append("|'");
+ break;
+ case '\n':
+ result.append("|n");
+ break;
+ case '\r':
+ result.append("|r");
+ break;
+/*==========================================================================*|
+ // These are not possible 'char' values from a std::string.
+ case '\u0085': // next line
+ result.append("|x");
+ break;
+ case '\u2028': // line separator
+ result.append("|l");
+ break;
+ case '\u2029': // paragraph separator
+ result.append("|p");
+ break;
+|*==========================================================================*/
+ case '|':
+ result.append("||");
+ break;
+ case '[':
+ result.append("|[");
+ break;
+ case ']':
+ result.append("|]");
+ break;
+ default:
+ result.push_back(c);
+ break;
+ }
+ }
+ return result;
}
-
-protected:
- std::ostringstream mTCStream;
-
};
@@ -306,6 +431,14 @@ void stream_usage(std::ostream& s, const char* app)
++option;
}
+ s << app << " is also sensitive to environment variables:\n"
+ << "LOGTEST=level : for all tests, emit log messages at level 'level'\n"
+ << "LOGFAIL=level : only for failed tests, emit log messages at level 'level'\n"
+ << "where 'level' is one of ALL, DEBUG, INFO, WARN, ERROR, NONE.\n"
+ << "--debug is like LOGTEST=DEBUG, but --debug overrides LOGTEST.\n"
+ << "Setting LOGFAIL overrides both LOGTEST and --debug: the only log\n"
+ << "messages you will see will be for failed tests.\n\n";
+
s << "Examples:" << std::endl;
s << " " << app << " --verbose" << std::endl;
s << "\tRun all the tests and report all results." << std::endl;
@@ -342,19 +475,30 @@ int main(int argc, char **argv)
LLError::initForApplication(".");
LLError::setFatalFunction(wouldHaveCrashed);
LLError::setDefaultLevel(LLError::LEVEL_ERROR);
- //< *TODO: should come from error config file. Note that we
- // have a command line option that sets this to debug.
+ // ^ possibly overridden by --debug, LOGTEST or LOGFAIL
+
+ // LOGTEST overrides default, but can be overridden by --debug or LOGFAIL.
+ const char* LOGTEST = getenv("LOGTEST");
+ if (LOGTEST)
+ {
+ LLError::setDefaultLevel(LLError::decodeLevel(LOGTEST));
+ }
#ifdef CTYPE_WORKAROUND
ctype_workaround();
#endif
- LLAPRPool pool;
- pool.create();
+ apr_initialize();
+ apr_pool_t* pool = NULL;
+ if(APR_SUCCESS != apr_pool_create(&pool, NULL))
+ {
+ std::cerr << "Unable to initialize pool" << std::endl;
+ return 1;
+ }
apr_getopt_t* os = NULL;
- if(APR_SUCCESS != apr_getopt_init(&os, pool(), argc, argv))
+ if(APR_SUCCESS != apr_getopt_init(&os, pool, argc, argv))
{
- std::cerr << "Unable to initialize the arguments for parsing by apr_getopt()." << std::endl;
+ std::cerr << "Unable to pool" << std::endl;
return 1;
}
@@ -413,8 +557,6 @@ int main(int argc, char **argv)
wait_at_exit = true;
break;
case 'd':
- // *TODO: should come from error config file. We set it to
- // ERROR by default, so this allows full debug levels.
LLError::setDefaultLevel(LLError::LEVEL_DEBUG);
break;
case 'x':
@@ -429,14 +571,28 @@ int main(int argc, char **argv)
// run the tests
+ const char* LOGFAIL = getenv("LOGFAIL");
+ boost::shared_ptr<LLReplayLog> replayer;
+ // As described in stream_usage(), LOGFAIL overrides both --debug and
+ // LOGTEST.
+ if (LOGFAIL)
+ {
+ LLError::ELevel level = LLError::decodeLevel(LOGFAIL);
+ replayer.reset(new LLReplayLogReal(level, pool));
+ }
+ else
+ {
+ replayer.reset(new LLReplayLog());
+ }
+
LLTestCallback* mycallback;
if (getenv("TEAMCITY_PROJECT_NAME"))
{
- mycallback = new LLTCTestCallback(verbose_mode, output);
+ mycallback = new LLTCTestCallback(verbose_mode, output, replayer);
}
else
{
- mycallback = new LLTestCallback(verbose_mode, output);
+ mycallback = new LLTestCallback(verbose_mode, output, replayer);
}
tut::runner.get().set_callback(mycallback);
@@ -472,6 +628,8 @@ int main(int argc, char **argv)
s.close();
}
+ apr_terminate();
+
int retval = (success ? 0 : 1);
return retval;
diff --git a/indra/test_apps/llplugintest/llmediaplugintest.cpp b/indra/test_apps/llplugintest/llmediaplugintest.cpp
index d5ee09c5bc..884b00f0cc 100644
--- a/indra/test_apps/llplugintest/llmediaplugintest.cpp
+++ b/indra/test_apps/llplugintest/llmediaplugintest.cpp
@@ -27,6 +27,7 @@
#include "linden_common.h"
#include "indra_constants.h"
+#include "llapr.h"
#include "llerrorcontrol.h"
#include <math.h>
@@ -185,6 +186,9 @@ LLMediaPluginTest::LLMediaPluginTest( int app_window, int window_width, int wind
std::cout << "Unable to read bookmarks from file: " << bookmarks_filename << std::endl;
};
+ // initialize linden lab APR module
+ ll_init_apr();
+
// Set up llerror logging
{
LLError::initForApplication(".");
diff --git a/indra/viewer_components/updater/llupdatedownloader.cpp b/indra/viewer_components/updater/llupdatedownloader.cpp
index e88d1bf811..19ac418e9e 100644
--- a/indra/viewer_components/updater/llupdatedownloader.cpp
+++ b/indra/viewer_components/updater/llupdatedownloader.cpp
@@ -39,7 +39,7 @@
#include "llsdserialize.h"
#include "llthread.h"
#include "llupdaterservice.h"
-
+#include "llcurl.h"
class LLUpdateDownloader::Implementation:
public LLThread
@@ -198,13 +198,19 @@ LLUpdateDownloader::Implementation::Implementation(LLUpdateDownloader::Client &
LLUpdateDownloader::Implementation::~Implementation()
{
- if(isDownloading()) {
+ if(isDownloading())
+ {
cancel();
shutdown();
- } else {
+ }
+ else
+ {
; // No op.
}
- if(mCurl) curl_easy_cleanup(mCurl);
+ if(mCurl)
+ {
+ LLCurl::deleteEasyHandle(mCurl);
+ }
}
@@ -406,9 +412,12 @@ void LLUpdateDownloader::Implementation::run(void)
void LLUpdateDownloader::Implementation::initializeCurlGet(std::string const & url, bool processHeader)
{
- if(mCurl == 0) {
- mCurl = curl_easy_init();
- } else {
+ if(mCurl == 0)
+ {
+ mCurl = LLCurl::newEasyHandle();
+ }
+ else
+ {
curl_easy_reset(mCurl);
}
diff --git a/indra/viewer_components/updater/llupdateinstaller.cpp b/indra/viewer_components/updater/llupdateinstaller.cpp
index 24ba00ad8e..2f87d59373 100644
--- a/indra/viewer_components/updater/llupdateinstaller.cpp
+++ b/indra/viewer_components/updater/llupdateinstaller.cpp
@@ -26,11 +26,10 @@
#include "linden_common.h"
#include <apr_file_io.h>
#include "llapr.h"
-#include "llscopedvolatileaprpool.h"
-#include "llprocesslauncher.h"
+#include "llprocess.h"
#include "llupdateinstaller.h"
#include "lldir.h"
-
+#include "llsd.h"
#if defined(LL_WINDOWS)
#pragma warning(disable: 4702) // disable 'unreachable code' so we can use lexical_cast (really!).
@@ -46,8 +45,7 @@ namespace {
{
std::string scriptFile = gDirUtilp->getBaseFileName(path);
std::string newPath = gDirUtilp->getExpandedFilename(LL_PATH_TEMP, scriptFile);
- LLScopedVolatileAPRPool pool;
- apr_status_t status = apr_file_copy(path.c_str(), newPath.c_str(), APR_FILE_SOURCE_PERMS, pool);
+ apr_status_t status = apr_file_copy(path.c_str(), newPath.c_str(), APR_FILE_SOURCE_PERMS, gAPRPoolp);
if(status != APR_SUCCESS) throw RelocateError();
return newPath;
@@ -80,15 +78,13 @@ int ll_install_update(std::string const & script,
llinfos << "UpdateInstaller: installing " << updatePath << " using " <<
actualScriptPath << LL_ENDL;
- LLProcessLauncher launcher;
- launcher.setExecutable(actualScriptPath);
- launcher.addArgument(updatePath);
- launcher.addArgument(ll_install_failed_marker_path().c_str());
- launcher.addArgument(boost::lexical_cast<std::string>(required));
- int result = launcher.launch();
- launcher.orphan();
-
- return result;
+ LLProcess::Params params;
+ params.executable = actualScriptPath;
+ params.args.add(updatePath);
+ params.args.add(ll_install_failed_marker_path());
+ params.args.add(boost::lexical_cast<std::string>(required));
+ params.autokill = false;
+ return LLProcess::create(params)? 0 : -1;
}
diff --git a/indra/viewer_components/updater/scripts/darwin/update_install b/indra/viewer_components/updater/scripts/darwin/update_install
index e7f36dc5a3..e7f36dc5a3 100755..100644
--- a/indra/viewer_components/updater/scripts/darwin/update_install
+++ b/indra/viewer_components/updater/scripts/darwin/update_install
diff --git a/indra/viewer_components/updater/scripts/linux/update_install b/indra/viewer_components/updater/scripts/linux/update_install
index e0505a9f72..e0505a9f72 100755..100644
--- a/indra/viewer_components/updater/scripts/linux/update_install
+++ b/indra/viewer_components/updater/scripts/linux/update_install
diff --git a/indra/win_crash_logger/StdAfx.h b/indra/win_crash_logger/StdAfx.h
index ce70fe2994..35976658ac 100644
--- a/indra/win_crash_logger/StdAfx.h
+++ b/indra/win_crash_logger/StdAfx.h
@@ -38,7 +38,6 @@
#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
-
// Windows Header Files:
#include <windows.h>
diff --git a/indra/win_crash_logger/llcrashloggerwindows.cpp b/indra/win_crash_logger/llcrashloggerwindows.cpp
index 170babbb98..36d988ead7 100644
--- a/indra/win_crash_logger/llcrashloggerwindows.cpp
+++ b/indra/win_crash_logger/llcrashloggerwindows.cpp
@@ -370,5 +370,6 @@ bool LLCrashLoggerWindows::cleanup()
sleep_and_pump_messages(3);
}
PostQuitMessage(0);
+ commonCleanup();
return true;
}